tweb/public/147.40d5eeb3e14bc4686ebc.ch...

1 line
135 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"version":3,"file":"147.40d5eeb3e14bc4686ebc.chunk.js","mappings":"8IAWA,MACMA,EAAgC,IAAIC,IAAI,CAAC,iBAAkB,kBAAmB,aAAc,qBAOnF,MAAMC,EAWnBC,YAAsBC,EAnBD,GAmBC,KAAAA,cAAAA,EAVf,KAAAC,QAAU,EACP,KAAAC,MAAoC,GACpC,KAAAC,UAAsC,IAAIN,IAE1C,KAAAO,YAA6B,KAC7B,KAAAC,cAA4B,KAE5B,KAAAC,KAAM,QAAO,KAAM,YAI3BC,KAAKC,cAAe,QAAS,IAAMD,KAAKE,iBAAiB,GAAG,EAC9D,CAEOC,QACLH,KAAKJ,UAAUO,QAEfH,KAAKL,MAAMS,OAAS,CAKtB,CAEOC,OACFL,KAAKH,cAGRG,KAAKH,YAAc,IAAIS,SAAQ,CAACC,EAASC,KACvCR,KAAKF,cAAgBS,CAAO,IAQhC,CAEOE,SACDT,KAAKF,gBAETE,KAAKF,gBACLE,KAAKF,cAAgBE,KAAKH,YAAc,KAExCG,KAAKC,eACP,CAEgBS,YAAYC,G,qCAC1B,IAAGX,KAAKH,YAAR,CAIAG,KAAKJ,UAAUgB,IAAID,GAMnB,UAIQX,KAAKa,SAASF,E,CACpB,MAAMG,GACFzB,EAAc0B,IAAKD,aAAG,EAAHA,EAAkBE,OACvChB,KAAKD,IAAIkB,MAAM,wBAAyBH,E,CAI5Cd,KAAKJ,UAAUsB,OAAOP,GAMtBX,KAAKC,c,CACP,E,+RAEUY,SAASF,GACjB,OAAOA,EAAKQ,MACd,CAEUC,UACR,OAAOpB,KAAKL,MAAM0B,OACpB,CAEUC,WAAWC,EAA4BC,GAC/CxB,KAAKL,MAAM4B,GAAQC,GACnBxB,KAAKC,cACP,CAEUC,cAAcS,GACtB,MAAIX,KAAKL,MAAMS,QAAUJ,KAAKH,aAAgBG,KAAKP,cAAgB,GAAKO,KAAKJ,UAAU6B,MAAQzB,KAAKP,eAIpG,EAAG,CAOD,GANGkB,GACD,OAAiBX,KAAKL,MAAOgB,GAE7BA,EAAOX,KAAKoB,WAGXT,EAGD,MAFAX,KAAKU,YAAYC,GAKnBA,EAAO,I,OAEDX,KAAKJ,UAAU6B,KAAOzB,KAAKP,eAAiBO,KAAKL,MAAMS,OAEjE,CAEOsB,KAAKF,GACVxB,KAAKsB,WAAW,OAAQE,EAC1B,CAEOG,QAAQH,GACbxB,KAAKsB,WAAW,UAAWE,EAC7B,E,kCClIF,MAEA,EAF2C,CAAC,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,MAAO,EAAK,MAAO,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,KAAM,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,KAAM,EAAK,MAAO,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","sources":["webpack://tweb/./src/components/lazyLoadQueueBase.ts","webpack://tweb/./src/config/latinizeMap.ts","webpack://tweb/./src/helpers/array/filterUnique.ts","webpack://tweb/./src/helpers/array/flatten.ts","webpack://tweb/./src/helpers/array/forEachReverse.ts","webpack://tweb/./src/helpers/array/insertInDescendSortedArray.ts","webpack://tweb/./src/helpers/assumeType.ts","webpack://tweb/./src/helpers/blob/readBlobAs.ts","webpack://tweb/./src/helpers/bytes/bytesCmp.ts","webpack://tweb/./src/helpers/bytes/bytesFromHex.ts","webpack://tweb/./src/helpers/bytes/convertToUint8Array.ts","webpack://tweb/./src/helpers/callbackify.ts","webpack://tweb/./src/helpers/getFileNameForUpload.ts","webpack://tweb/./src/helpers/middleware.ts","webpack://tweb/./src/helpers/object/defineNotNumerableProperties.ts","webpack://tweb/./src/helpers/object/getDeepProperty.ts","webpack://tweb/./src/helpers/object/getObjectKeysAndSort.ts","webpack://tweb/./src/helpers/schedulers/debounce.ts","webpack://tweb/./src/helpers/slicedArray.ts","webpack://tweb/./src/helpers/compareValue.ts","webpack://tweb/./src/helpers/long/compareLong.ts","webpack://tweb/./src/lib/appManagers/utils/attachMenuBots/getAttachMenuBotIcon.ts","webpack://tweb/./src/lib/appManagers/utils/chats/getParticipantPeerId.ts","webpack://tweb/./src/lib/appManagers/utils/chats/hasRights.ts","webpack://tweb/./src/lib/appManagers/utils/dialogs/getDialogIndex.ts","webpack://tweb/./src/lib/appManagers/utils/dialogs/getDialogIndexKey.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentDownloadOptions.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentInputFileLocation.ts","webpack://tweb/./src/lib/appManagers/utils/download/getDownloadFileNameFromOptions.ts","webpack://tweb/./src/lib/appManagers/utils/download/getDownloadMediaDetails.ts","webpack://tweb/./src/lib/appManagers/utils/webDocs/getWebDocumentDownloadOptions.ts","webpack://tweb/./src/lib/appManagers/utils/drafts/draftsAreEqual.ts","webpack://tweb/./src/lib/appManagers/utils/inlineBots/generateQId.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/generateMessageId.ts","webpack://tweb/./src/lib/appManagers/utils/messages/filterMessagesByInputFilter.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getAlbumText.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getMessageThreadId.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerActiveUsernames.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerPhoto.ts","webpack://tweb/./src/lib/appManagers/utils/peers/isPeerRestricted.ts","webpack://tweb/./src/lib/appManagers/utils/photos/getPhotoDownloadOptions.ts","webpack://tweb/./src/lib/appManagers/utils/reactions/reactionsEqual.ts","webpack://tweb/./src/lib/appManagers/utils/stickers/getStickerEffectThumb.ts","webpack://tweb/./src/lib/appManagers/utils/users/canSendToUser.ts","webpack://tweb/./src/lib/appManagers/utils/webDocs/isWebDocument.ts","webpack://tweb/./src/lib/mtproto/connectionStatus.ts","webpack://tweb/./src/lib/richTextProcessor/combineSameEntities.ts","webpack://tweb/./src/lib/richTextProcessor/encodeSpoiler.ts","webpack://tweb/./src/lib/richTextProcessor/spoiler.ts","webpack://tweb/./src/lib/richTextProcessor/findConflictingEntity.ts","webpack://tweb/./src/lib/richTextProcessor/fixEmoji.ts","webpack://tweb/./src/lib/richTextProcessor/matchUrl.ts","webpack://tweb/./src/lib/richTextProcessor/mergeEntities.ts","webpack://tweb/./src/config/tld.ts","webpack://tweb/./src/lib/richTextProcessor/checkBrackets.ts","webpack://tweb/./src/lib/richTextProcessor/getEmojiUnified.ts","webpack://tweb/./src/lib/richTextProcessor/parseEntities.ts","webpack://tweb/./src/lib/richTextProcessor/parseMarkdown.ts","webpack://tweb/./src/lib/richTextProcessor/sortEntities.ts","webpack://tweb/./src/lib/richTextProcessor/wrapPlainText.ts","webpack://tweb/./src/lib/searchIndex.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\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\nimport {Middleware} from '../helpers/middleware';\nimport throttle from '../helpers/schedulers/throttle';\nimport {logger, LogTypes} from '../lib/logger';\n\nconst PARALLEL_LIMIT = 8;\nconst IGNORE_ERRORS: Set<ErrorType> = new Set(['NO_ENTRY_FOUND', 'STORAGE_OFFLINE', 'MIDDLEWARE', 'NO_AUTO_DOWNLOAD']);\n\nexport type LazyLoadElementBase = {\n load: () => Promise<any>,\n middleware?: Middleware\n};\n\nexport default class LazyLoadQueueBase {\n public queueId = 0;\n protected queue: Array<LazyLoadElementBase> = [];\n protected inProcess: Set<LazyLoadElementBase> = new Set();\n\n protected lockPromise: Promise<void> = null;\n protected unlockResolve: () => void = null;\n\n protected log = logger('LL', LogTypes.Error);\n protected processQueue: () => void;\n\n constructor(protected parallelLimit = PARALLEL_LIMIT) {\n this.processQueue = throttle(() => this._processQueue(), 8, false);\n }\n\n public clear() {\n this.inProcess.clear(); // ацтеки забьются, будет плохо\n\n this.queue.length = 0;\n // unreachable code\n /* for(let item of this.inProcess) {\n this.lazyLoadMedia.push(item);\n } */\n }\n\n public lock() {\n if(this.lockPromise) return;\n\n // const perf = performance.now();\n this.lockPromise = new Promise((resolve, reject) => {\n this.unlockResolve = resolve;\n });\n\n /* if(DEBUG) {\n this.lockPromise.then(() => {\n this.log('was locked for:', performance.now() - perf);\n });\n } */\n }\n\n public unlock() {\n if(!this.unlockResolve) return;\n\n this.unlockResolve();\n this.unlockResolve = this.lockPromise = null;\n\n this.processQueue();\n }\n\n protected async processItem(item: LazyLoadElementBase) {\n if(this.lockPromise) {\n return;\n }\n\n this.inProcess.add(item);\n\n /* if(DEBUG) {\n this.log('will load media', this.lockPromise, item);\n } */\n\n try {\n // await new Promise((resolve) => setTimeout(resolve, 2e3));\n // await new Promise((resolve, reject) => window.requestAnimationFrame(() => window.requestAnimationFrame(resolve)));\n // await item.load(item.div);\n await this.loadItem(item);\n } catch(err) {\n if(!IGNORE_ERRORS.has((err as ApiError)?.type)) {\n this.log.error('loadMediaQueue error:', err/* , item */);\n }\n }\n\n this.inProcess.delete(item);\n\n /* if(DEBUG) {\n this.log('loaded media', item);\n } */\n\n this.processQueue();\n }\n\n protected loadItem(item: LazyLoadElementBase) {\n return item.load();\n }\n\n protected getItem() {\n return this.queue.shift();\n }\n\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElementBase) {\n this.queue[method](el);\n this.processQueue();\n }\n\n protected _processQueue(item?: LazyLoadElementBase) {\n if(!this.queue.length || this.lockPromise || (this.parallelLimit > 0 && this.inProcess.size >= this.parallelLimit)) return;\n\n // console.log('_processQueue start');\n // let added = 0;\n do {\n if(item) {\n indexOfAndSplice(this.queue, item);\n } else {\n item = this.getItem();\n }\n\n if(item) {\n this.processItem(item);\n } else {\n break;\n }\n\n item = null;\n // ++added;\n } while(this.inProcess.size < this.parallelLimit && this.queue.length);\n // console.log('_processQueue end, added', added, this.queue.length);\n }\n\n public push(el: LazyLoadElementBase) {\n this.addElement('push', el);\n }\n\n public unshift(el: LazyLoadElementBase) {\n this.addElement('unshift', 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 * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// From https://raw.githubusercontent.com/FGRibreau/latenize/master/latinize_map.js\nconst LatinizeMap: {[k: string]: string} = {'Á': 'A', 'Ă': 'A', 'Ắ': 'A', 'Ặ': 'A', 'Ằ': 'A', 'Ẳ': 'A', 'Ẵ': 'A', 'Ǎ': 'A', 'Â': 'A', 'Ấ': 'A', 'Ậ': 'A', 'Ầ': 'A', 'Ẩ': 'A', 'Ẫ': 'A', 'Ä': 'A', 'Ǟ': 'A', 'Ȧ': 'A', 'Ǡ': 'A', 'Ạ': 'A', 'Ȁ': 'A', 'À': 'A', 'Ả': 'A', 'Ȃ': 'A', 'Ā': 'A', 'Ą': 'A', 'Å': 'A', 'Ǻ': 'A', 'Ḁ': 'A', 'Ⱥ': 'A', 'Ã': 'A', 'Ꜳ': 'AA', 'Æ': 'AE', 'Ǽ': 'AE', 'Ǣ': 'AE', 'Ꜵ': 'AO', 'Ꜷ': 'AU', 'Ꜹ': 'AV', 'Ꜻ': 'AV', 'Ꜽ': 'AY', 'Ḃ': 'B', 'Ḅ': 'B', 'Ɓ': 'B', 'Ḇ': 'B', 'Ƀ': 'B', 'Ƃ': 'B', 'Ć': 'C', 'Č': 'C', 'Ç': 'C', 'Ḉ': 'C', 'Ĉ': 'C', 'Ċ': 'C', 'Ƈ': 'C', 'Ȼ': 'C', 'Ď': 'D', 'Ḑ': 'D', 'Ḓ': 'D', 'Ḋ': 'D', 'Ḍ': 'D', 'Ɗ': 'D', 'Ḏ': 'D', 'Dz': 'D', 'Dž': 'D', 'Đ': 'D', 'Ƌ': 'D', 'DZ': 'DZ', 'DŽ': 'DZ', 'É': 'E', 'Ĕ': 'E', 'Ě': 'E', 'Ȩ': 'E', 'Ḝ': 'E', 'Ê': 'E', 'Ế': 'E', 'Ệ': 'E', 'Ề': 'E', 'Ể': 'E', 'Ễ': 'E', 'Ḙ': 'E', 'Ë': 'E', 'Ė': 'E', 'Ẹ': 'E', 'Ȅ': 'E', 'È': 'E', 'Ẻ': 'E', 'Ȇ': 'E', 'Ē': 'E', 'Ḗ': 'E', 'Ḕ': 'E', 'Ę': 'E', 'Ɇ': 'E', 'Ẽ': 'E', 'Ḛ': 'E', '': 'ET', 'Ḟ': 'F', 'Ƒ': 'F', 'Ǵ': 'G', 'Ğ': 'G', 'Ǧ': 'G', 'Ģ': 'G', 'Ĝ': 'G', 'Ġ': 'G', 'Ɠ': 'G', 'Ḡ': 'G', 'Ǥ': 'G', 'Ḫ': 'H', 'Ȟ': 'H', 'Ḩ': 'H', 'Ĥ': 'H', 'Ⱨ': 'H', 'Ḧ': 'H', 'Ḣ': 'H', 'Ḥ': 'H', 'Ħ': 'H', 'Í': 'I', 'Ĭ': 'I', 'Ǐ': 'I', 'Î': 'I', 'Ï': 'I', 'Ḯ': 'I', 'İ': 'I', 'Ị': 'I', 'Ȉ': 'I', 'Ì': 'I', 'Ỉ': 'I', 'Ȋ': 'I', 'Ī': 'I', 'Į': 'I', 'Ɨ': 'I', 'Ĩ': 'I', 'Ḭ': 'I', 'Ꝺ': 'D', 'Ꝼ': 'F', 'Ᵹ': 'G', 'Ꞃ': 'R', 'Ꞅ': 'S', 'Ꞇ': 'T', 'Ꝭ': 'IS', 'Ĵ': 'J', 'Ɉ': 'J', 'Ḱ': 'K', 'Ǩ': 'K', 'Ķ': 'K', 'Ⱪ': 'K', 'Ꝃ': 'K', 'Ḳ': 'K', 'Ƙ': 'K', 'Ḵ': 'K', 'Ꝁ': 'K', 'Ꝅ': 'K', 'Ĺ': 'L', 'Ƚ': 'L', 'Ľ': 'L', 'Ļ': 'L', 'Ḽ': 'L', 'Ḷ': 'L', 'Ḹ': 'L', 'Ⱡ': 'L', 'Ꝉ': 'L', 'Ḻ': 'L', 'Ŀ': 'L', 'Ɫ': 'L', 'Lj': 'L', 'Ł': 'L', 'LJ': 'LJ', 'Ḿ': 'M', 'Ṁ': 'M', 'Ṃ': 'M', 'Ɱ': 'M', 'Ń': 'N', 'Ň': 'N', 'Ņ': 'N', 'Ṋ': 'N', 'Ṅ': 'N', 'Ṇ': 'N', 'Ǹ': 'N', 'Ɲ': 'N', 'Ṉ': 'N', 'Ƞ': 'N', 'Nj': 'N', 'Ñ': 'N', 'NJ': 'NJ', 'Ó': 'O', 'Ŏ': 'O', 'Ǒ': 'O', 'Ô': 'O', 'Ố': 'O', 'Ộ': 'O', 'Ồ': 'O', 'Ổ': 'O', 'Ỗ': 'O', 'Ö': 'O', 'Ȫ': 'O', 'Ȯ': 'O', 'Ȱ': 'O', 'Ọ': 'O', 'Ő': 'O', 'Ȍ': 'O', 'Ò': 'O', 'Ỏ': 'O', 'Ơ': 'O', 'Ớ': 'O', 'Ợ': 'O', 'Ờ': 'O', 'Ở': 'O', 'Ỡ': 'O', 'Ȏ': 'O', 'Ꝋ': 'O', 'Ꝍ': 'O', 'Ō': 'O', 'Ṓ': 'O', 'Ṑ': 'O', 'Ɵ': 'O', 'Ǫ': 'O', 'Ǭ': 'O', 'Ø': 'O', 'Ǿ': 'O', 'Õ': 'O', 'Ṍ': 'O', 'Ṏ': 'O', 'Ȭ': 'O', 'Ƣ': 'OI', 'Ꝏ': 'OO', 'Ɛ': 'E', 'Ɔ': 'O', 'Ȣ': 'OU', 'Ṕ': 'P', 'Ṗ': 'P', 'Ꝓ': 'P', 'Ƥ': 'P', 'Ꝕ': 'P', 'Ᵽ': 'P', 'Ꝑ': 'P', 'Ꝙ': 'Q', 'Ꝗ': 'Q', 'Ŕ': 'R', 'Ř': 'R', 'Ŗ': 'R', 'Ṙ': 'R', 'Ṛ': 'R', 'Ṝ': 'R', 'Ȑ': 'R', 'Ȓ': 'R', 'Ṟ': 'R', 'Ɍ': 'R', 'Ɽ': 'R', 'Ꜿ': 'C', 'Ǝ': 'E', 'Ś': 'S', 'Ṥ': 'S', 'Š': 'S', 'Ṧ': 'S', 'Ş': 'S', 'Ŝ': 'S', 'Ș': 'S', 'Ṡ': 'S', 'Ṣ': 'S', 'Ṩ': 'S', 'ẞ': 'SS', 'Ť': 'T', 'Ţ': 'T', 'Ṱ': 'T', 'Ț': 'T', 'Ⱦ': 'T', 'Ṫ': 'T', 'Ṭ': 'T', 'Ƭ': 'T', 'Ṯ': 'T', 'Ʈ': 'T', 'Ŧ': 'T', 'Ɐ': 'A', 'Ꞁ': 'L', 'Ɯ': 'M', 'Ʌ': 'V', 'Ꜩ': 'TZ', 'Ú': 'U', 'Ŭ': 'U', 'Ǔ': 'U', 'Û': 'U', 'Ṷ': 'U', 'Ü': 'U', 'Ǘ': 'U', 'Ǚ': 'U', 'Ǜ': 'U', 'Ǖ': 'U', 'Ṳ': 'U', 'Ụ': 'U', 'Ű': 'U', 'Ȕ': 'U', 'Ù': 'U', 'Ủ': 'U', 'Ư': 'U', 'Ứ': 'U', 'Ự': 'U', 'Ừ': 'U', 'Ử': 'U', 'Ữ': 'U', 'Ȗ': 'U', 'Ū': 'U', 'Ṻ': 'U', 'Ų': 'U', 'Ů': 'U', 'Ũ': 'U', 'Ṹ': 'U', 'Ṵ': 'U', 'Ꝟ': 'V', 'Ṿ': 'V', 'Ʋ': 'V', 'Ṽ': 'V', 'Ꝡ': 'VY', 'Ẃ': 'W', 'Ŵ': 'W', 'Ẅ': 'W', 'Ẇ': 'W', 'Ẉ': 'W', 'Ẁ': 'W', 'Ⱳ': 'W', 'Ẍ': 'X', 'Ẋ': 'X', 'Ý': 'Y', 'Ŷ': 'Y', 'Ÿ': 'Y', 'Ẏ': 'Y', 'Ỵ': 'Y', 'Ỳ': 'Y', 'Ƴ': 'Y', 'Ỷ': 'Y', 'Ỿ': 'Y', 'Ȳ': 'Y', 'Ɏ': 'Y', 'Ỹ': 'Y', 'Ź': 'Z', 'Ž': 'Z', 'Ẑ': 'Z', 'Ⱬ': 'Z', 'Ż': 'Z', 'Ẓ': 'Z', 'Ȥ': 'Z', 'Ẕ': 'Z', 'Ƶ': 'Z', 'IJ': 'IJ', 'Œ': 'OE', 'ᴀ': 'A', 'ᴁ': 'AE', 'ʙ': 'B', 'ᴃ': 'B', '': 'C', 'ᴅ': 'D', 'ᴇ': 'E', 'ꜰ': 'F', 'ɢ': 'G', 'ʛ': 'G', 'ʜ': 'H', 'ɪ': 'I', 'ʁ': 'R', 'ᴊ': 'J', 'ᴋ': 'K', 'ʟ': 'L', 'ᴌ': 'L', 'ᴍ': 'M', 'ɴ': 'N', '': 'O', 'ɶ': 'OE', 'ᴐ': 'O', 'ᴕ': 'OU', 'ᴘ': 'P', 'ʀ': 'R', 'ᴎ': 'N', 'ᴙ': 'R', '': 'S', 'ᴛ': 'T', 'ⱻ': 'E', 'ᴚ': 'R', '': 'U', '': 'V', '': 'W', 'ʏ': 'Y', '': 'Z', 'á': 'a', 'ă': 'a', 'ắ': 'a', 'ặ': 'a', 'ằ': 'a', 'ẳ': 'a', 'ẵ': 'a', 'ǎ': 'a', 'â': 'a', 'ấ': 'a', 'ậ': 'a', 'ầ': 'a', 'ẩ': 'a', 'ẫ': 'a', 'ä': 'a', 'ǟ': 'a', 'ȧ': 'a', 'ǡ': 'a', 'ạ': 'a', 'ȁ': 'a', 'à': 'a', 'ả': 'a', 'ȃ': 'a', 'ā': 'a', 'ą': 'a', 'ᶏ': 'a', 'ẚ': 'a', 'å': 'a', 'ǻ': 'a', 'ḁ': 'a', 'ⱥ': 'a', 'ã': 'a', 'ꜳ': 'aa', 'æ': 'ae', 'ǽ': 'ae', 'ǣ': 'ae', 'ꜵ': 'ao', 'ꜷ': 'au', 'ꜹ': 'av', 'ꜻ': 'av', 'ꜽ': 'ay', 'ḃ': 'b', 'ḅ': 'b', 'ɓ': 'b', 'ḇ': 'b', 'ᵬ': 'b', 'ᶀ': 'b', 'ƀ': 'b', 'ƃ': 'b', 'ɵ': 'o', 'ć': 'c', 'č': 'c', 'ç': 'c', 'ḉ': 'c', 'ĉ': 'c', 'ɕ': 'c', 'ċ': 'c', 'ƈ': 'c', 'ȼ': 'c', 'ď': 'd', 'ḑ': 'd', 'ḓ': 'd', 'ȡ': 'd', 'ḋ': 'd', 'ḍ': 'd', 'ɗ': 'd', 'ᶑ': 'd', 'ḏ': 'd', 'ᵭ': 'd', 'ᶁ': 'd', 'đ': 'd', 'ɖ': 'd', 'ƌ': 'd', 'ı': 'i', 'ȷ': 'j', 'ɟ': 'j', 'ʄ': 'j', 'dz': 'dz', 'dž': 'dz', 'é': 'e', 'ĕ': 'e', 'ě': 'e', 'ȩ': 'e', 'ḝ': 'e', 'ê': 'e', 'ế': 'e', 'ệ': 'e', 'ề': 'e', 'ể': 'e', 'ễ': 'e', 'ḙ': 'e', 'ë': 'e', 'ė': 'e', 'ẹ': 'e', 'ȅ': 'e', 'è': 'e', 'ẻ': 'e', 'ȇ': 'e', 'ē': 'e', 'ḗ': 'e', 'ḕ': 'e', 'ⱸ': 'e', 'ę': 'e', 'ᶒ': 'e', 'ɇ': 'e', 'ẽ': 'e', 'ḛ': 'e', 'ꝫ': 'et', 'ḟ': 'f', 'ƒ': 'f', 'ᵮ': 'f', 'ᶂ': 'f', 'ǵ': 'g', 'ğ': 'g', 'ǧ': 'g', 'ģ': 'g', 'ĝ': 'g', 'ġ': 'g', 'ɠ': 'g', 'ḡ': 'g', '': 'g', 'ǥ': 'g', 'ḫ': 'h', 'ȟ': 'h', 'ḩ': 'h', 'ĥ': 'h', 'ⱨ': 'h', 'ḧ': 'h', 'ḣ': 'h', 'ḥ': 'h', 'ɦ': 'h', 'ẖ': 'h', 'ħ': 'h', 'ƕ': 'hv', 'í': 'i', 'ĭ': 'i', 'ǐ': 'i', 'î': 'i', 'ï': 'i', 'ḯ': 'i', 'ị': 'i', 'ȉ': 'i', 'ì': 'i', 'ỉ': 'i', 'ȋ': 'i', 'ī': 'i', 'į': 'i', 'ᶖ': 'i', 'ɨ': 'i', 'ĩ': 'i', 'ḭ': 'i', 'ꝺ': 'd', 'ꝼ': 'f', 'ᵹ': 'g', 'ꞃ': 'r', 'ꞅ': 's', 'ꞇ': 't', 'ꝭ': 'is', 'ǰ': 'j', 'ĵ': 'j', 'ʝ': 'j', 'ɉ': 'j', 'ḱ': 'k', 'ǩ': 'k', 'ķ': 'k', 'ⱪ': 'k', 'ꝃ': 'k', 'ḳ': 'k', 'ƙ': 'k', 'ḵ': 'k', 'ᶄ': 'k', 'ꝁ': 'k', 'ꝅ': 'k', 'ĺ': 'l', 'ƚ': 'l', 'ɬ': 'l', 'ľ': 'l', 'ļ': 'l', 'ḽ': 'l', 'ȴ': 'l', 'ḷ': 'l', 'ḹ': 'l', 'ⱡ': 'l', 'ꝉ': 'l', 'ḻ': 'l', 'ŀ': 'l', 'ɫ': 'l', 'ᶅ': 'l', 'ɭ': 'l', 'ł': 'l', 'lj': 'lj', 'ſ': 's', 'ẜ': 's', 'ẛ': 's', '': 's', 'ḿ': 'm', 'ṁ': 'm', 'ṃ': 'm', 'ɱ': 'm', 'ᵯ': 'm', 'ᶆ': 'm', 'ń': 'n', 'ň': 'n', 'ņ': 'n', 'ṋ': 'n', 'ȵ': 'n', 'ṅ': 'n', 'ṇ': 'n', 'ǹ': 'n', 'ɲ': 'n', 'ṉ': 'n', 'ƞ': 'n', 'ᵰ': 'n', 'ᶇ': 'n', 'ɳ': 'n', 'ñ': 'n', 'nj': 'nj', 'ó': 'o', 'ŏ': 'o', 'ǒ': 'o', 'ô': 'o', 'ố': 'o', 'ộ': 'o', 'ồ': 'o', 'ổ': 'o', 'ỗ': 'o', 'ö': 'o', 'ȫ': 'o', 'ȯ': 'o', 'ȱ': 'o', 'ọ': 'o', 'ő': 'o', 'ȍ': 'o', 'ò': 'o', 'ỏ': 'o', 'ơ': 'o', 'ớ': 'o', 'ợ': 'o', 'ờ': 'o', 'ở': 'o', 'ỡ': 'o', 'ȏ': 'o', 'ꝋ': 'o', 'ꝍ': 'o', 'ⱺ': 'o', 'ō': 'o', 'ṓ': 'o', 'ṑ': 'o', 'ǫ': 'o', 'ǭ': 'o', 'ø': 'o', 'ǿ': 'o', 'õ': 'o', 'ṍ': 'o', 'ṏ': 'o', 'ȭ': 'o', 'ƣ': 'oi', 'ꝏ': 'oo', 'ɛ': 'e', 'ᶓ': 'e', 'ɔ': 'o', 'ᶗ': 'o', 'ȣ': 'ou', 'ṕ': 'p', 'ṗ': 'p', 'ꝓ': 'p', 'ƥ': 'p', 'ᵱ': 'p', 'ᶈ': 'p', 'ꝕ': 'p', 'ᵽ': 'p', 'ꝑ': 'p', 'ꝙ': 'q', 'ʠ': 'q', 'ɋ': 'q', 'ꝗ': 'q', 'ŕ': 'r', 'ř': 'r', 'ŗ': 'r', 'ṙ': 'r', 'ṛ': 'r', 'ṝ': 'r', 'ȑ': 'r', 'ɾ': 'r', 'ᵳ': 'r', 'ȓ': 'r', 'ṟ': 'r', 'ɼ': 'r', 'ᵲ': 'r', 'ᶉ': 'r', 'ɍ': 'r', 'ɽ': 'r', 'ↄ': 'c', 'ꜿ': 'c', 'ɘ': 'e', 'ɿ': 'r', 'ś': 's', 'ṥ': 's', 'š': 's', 'ṧ': 's', 'ş': 's', 'ŝ': 's', 'ș': 's', 'ṡ': 's', 'ṣ': 's', 'ṩ': 's', 'ʂ': 's', 'ᵴ': 's', 'ᶊ': 's', 'ȿ': 's', 'ɡ': 'g', 'ß': 'ss', '': 'o', 'ᴓ': 'o', 'ᴝ': 'u', 'ť': 't', 'ţ': 't', 'ṱ': 't', 'ț': 't', 'ȶ': 't', 'ẗ': 't', 'ⱦ': 't', 'ṫ': 't', 'ṭ': 't', 'ƭ': 't', 'ṯ': 't', 'ᵵ': 't', 'ƫ': 't', 'ʈ': 't', 'ŧ': 't', 'ᵺ': 'th', 'ɐ': 'a', 'ᴂ': 'ae', 'ǝ': 'e', 'ᵷ': 'g', 'ɥ': 'h', 'ʮ': 'h', 'ʯ': 'h', 'ᴉ': 'i', 'ʞ': 'k', 'ꞁ': 'l', 'ɯ': 'm', 'ɰ': 'm', 'ᴔ': 'oe', 'ɹ': 'r', 'ɻ': 'r', 'ɺ': 'r', 'ⱹ': 'r', 'ʇ': 't', 'ʌ': 'v', 'ʍ': 'w', 'ʎ': 'y', 'ꜩ': 'tz', 'ú': 'u', 'ŭ': 'u', 'ǔ': 'u', 'û': 'u', 'ṷ': 'u', 'ü': 'u', 'ǘ': 'u', 'ǚ': 'u', 'ǜ': 'u', 'ǖ': 'u', 'ṳ': 'u', 'ụ': 'u', 'ű': 'u', 'ȕ': 'u', 'ù': 'u', 'ủ': 'u', 'ư': 'u', 'ứ': 'u', 'ự': 'u', 'ừ': 'u', 'ử': 'u', 'ữ': 'u', 'ȗ': 'u', 'ū': 'u', 'ṻ': 'u', 'ų': 'u', 'ᶙ': 'u', 'ů': 'u', 'ũ': 'u', 'ṹ': 'u', 'ṵ': 'u', 'ᵫ': 'ue', '': 'um', 'ⱴ': 'v', 'ꝟ': 'v', 'ṿ': 'v', 'ʋ': 'v', '': 'v', 'ⱱ': 'v', 'ṽ': 'v', 'ꝡ': 'vy', 'ẃ': 'w', 'ŵ': 'w', 'ẅ': 'w', 'ẇ': 'w', 'ẉ': 'w', 'ẁ': 'w', 'ⱳ': 'w', 'ẘ': 'w', 'ẍ': 'x', 'ẋ': 'x', 'ᶍ': 'x', 'ý': 'y', 'ŷ': 'y', 'ÿ': 'y', 'ẏ': 'y', 'ỵ': 'y', 'ỳ': 'y', 'ƴ': 'y', 'ỷ': 'y', 'ỿ': 'y', 'ȳ': 'y', 'ẙ': 'y', 'ɏ': 'y', 'ỹ': 'y', 'ź': 'z', 'ž': 'z', 'ẑ': 'z', 'ʑ': 'z', 'ⱬ': 'z', 'ż': 'z', 'ẓ': 'z', 'ȥ': 'z', 'ẕ': 'z', 'ᵶ': 'z', 'ᶎ': 'z', 'ʐ': 'z', 'ƶ': 'z', 'ɀ': 'z', 'ff': 'ff', 'ffi': 'ffi', 'ffl': 'ffl', 'fi': 'fi', 'fl': 'fl', 'ij': 'ij', 'œ': 'oe', 'st': 'st', 'ₐ': 'a', 'ₑ': 'e', 'ᵢ': 'i', 'ⱼ': 'j', 'ₒ': 'o', 'ᵣ': 'r', 'ᵤ': 'u', 'ᵥ': 'v', 'ₓ': 'x', 'Ё': 'YO', 'Й': 'I', 'Ц': 'TS', 'У': 'U', 'К': 'K', 'Е': 'E', 'Н': 'N', 'Г': 'G', 'Ш': 'SH', 'Щ': 'SCH', 'З': 'Z', 'Х': 'H', 'Ъ': '', 'ё': 'yo', 'й': 'i', 'ц': 'ts', 'у': 'u', 'к': 'k', 'е': 'e', 'н': 'n', 'г': 'g', 'ш': 'sh', 'щ': 'sch', 'з': 'z', 'х': 'h', 'ъ': '', 'Ф': 'F', 'Ы': 'I', 'В': 'V', 'А': 'A', 'П': 'P', 'Р': 'R', 'О': 'O', 'Л': 'L', 'Д': 'D', 'Ж': 'ZH', 'Э': 'E', 'ф': 'f', 'ы': 'i', 'в': 'v', 'а': 'a', 'п': 'p', 'р': 'r', 'о': 'o', 'л': 'l', 'д': 'd', 'ж': 'zh', 'э': 'e', 'Я': 'Ya', 'Ч': 'CH', 'С': 'S', 'М': 'M', 'И': 'I', 'Т': 'T', 'Ь': '', 'Б': 'B', 'Ю': 'YU', 'я': 'ya', 'ч': 'ch', 'с': 's', 'м': 'm', 'и': 'i', 'т': 't', 'ь': '', 'б': 'b', 'ю': 'yu'};\n\nexport default LatinizeMap;\n","export default function filterUnique<T extends Array<any>>(arr: T): T {\n return [...new Set(arr)] as T;\n}\n","export default function flatten<T>(arr: T[][]): T[] {\n return arr.reduce((acc, val) => (acc.push(...val), acc), []);\n}\n","export default function forEachReverse<T>(array: Array<T>, callback: (value: T, index?: number, array?: Array<T>) => void) {\n for(let length = array.length, i = length - 1; i >= 0; --i) {\n callback(array[i], i, array);\n }\n};\n","export default function insertInDescendSortedArray<T extends {[smth in K]?: number}, K extends keyof T>(array: Array<T>, element: T, getProperty: K, pos?: number): number;\nexport default function insertInDescendSortedArray<T>(array: Array<T>, element: T, getProperty: (element: T) => number, pos?: number): number;\nexport default function insertInDescendSortedArray<T extends {[smth in K]?: number}, K extends keyof T>(array: Array<T>, element: T, getProperty: K | ((element: T) => T[K]), pos?: number): number {\n if(typeof(getProperty) !== 'function') {\n const property = getProperty;\n getProperty = (element) => element[property];\n }\n\n const sortProperty: number = getProperty(element);\n\n if(pos === undefined) {\n pos = array.indexOf(element);\n if(pos !== -1) {\n const prev = array[pos - 1];\n const next = array[pos + 1];\n if((!prev || getProperty(prev) >= sortProperty) && (!next || getProperty(next) <= sortProperty)) {\n // console.warn('same pos', pos, sortProperty, prev, next);\n return pos;\n }\n\n array.splice(pos, 1);\n }\n }\n\n const len = array.length;\n if(!len || sortProperty <= getProperty(array[len - 1])) {\n return array.push(element) - 1;\n } else if(sortProperty >= getProperty(array[0])) {\n array.unshift(element);\n return 0;\n } else {\n for(let i = 0; i < len; i++) {\n if(sortProperty > getProperty(array[i])) {\n array.splice(i, 0, element);\n return i;\n }\n }\n }\n\n console.error('wtf', array, element);\n return array.indexOf(element);\n}\n","export default function assumeType<T>(x: unknown): asserts x is T {\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\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<string>;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise<string>;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise<ArrayBuffer>;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise<any> {\n // const perf = performance.now();\n return new Promise<any>((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 bytesCmp(bytes1: number[] | Uint8Array, bytes2: number[] | Uint8Array) {\n const len = bytes1.length;\n if(len !== bytes2.length) {\n return false;\n }\n\n for(let i = 0; i < len; ++i) {\n if(bytes1[i] !== bytes2[i]) {\n return false;\n }\n }\n\n return true;\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","/*\n * 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 callbackify<T extends Awaited<any>, R>(\n smth: T,\n callback: (result: Awaited<T>) => R\n): T extends Promise<any> ? Promise<Awaited<R>> : R {\n if(smth instanceof Promise) {\n // @ts-ignore\n return smth.then(callback);\n } else {\n return callback(smth as any) 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 tabId from '../config/tabId';\n\nlet uploadId = 0;\nexport default function getFileNameForUpload(file: File | Blob) {\n let fileName: string;\n const mimeType = file?.type;\n if(mimeType) { // the same like apiFileName in appMessagesManager for upload!\n const ext = `${tabId}_${uploadId++}.${mimeType.split('/')[1]}`;\n\n if(['image/jpeg', 'image/png', 'image/bmp'].indexOf(mimeType) >= 0) {\n fileName = 'photo' + ext;\n } else if(mimeType.indexOf('audio/') === 0 || ['video/ogg'].indexOf(mimeType) >= 0) {\n fileName = 'audio' + ext;\n } else if(mimeType.indexOf('video/') === 0) {\n fileName = 'video' + ext;\n } else {\n fileName = 'document' + ext;\n }\n } else {\n fileName = `upload-${tabId}_${uploadId++}`;\n }\n\n return fileName;\n}\n","/*\n * 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 './array/indexOfAndSplice';\nimport makeError from './makeError';\n\nexport type Middleware = {\n (): boolean;\n create(): MiddlewareHelper;\n onClean: (callback: VoidFunction) => void;\n onDestroy: (callback: VoidFunction) => void;\n};\n\nconst createDetails = (): {\n cleaned?: boolean,\n inner: MiddlewareHelper[],\n onCleanCallbacks: VoidFunction[]\n} => ({\n cleaned: false,\n inner: [],\n onCleanCallbacks: []\n});\n\nconst MIDDLEWARE_ERROR = makeError('MIDDLEWARE');\n\n// * onClean == cancel promises, etc\n// * onDestroy == destructor\nexport class MiddlewareHelper {\n private details = createDetails();\n private onDestroyCallbacks: VoidFunction[] = [];\n private parent: MiddlewareHelper;\n private destroyed: boolean;\n\n public clean() {\n const details = this.details;\n details.cleaned = true;\n details.inner.splice(0, details.inner.length).forEach((helper) => helper.destroy());\n details.onCleanCallbacks.splice(0, details.onCleanCallbacks.length).forEach((callback) => callback());\n this.details = createDetails();\n }\n\n public destroy() {\n this.destroyed = true;\n this.clean();\n this.onDestroyCallbacks.splice(0, this.onDestroyCallbacks.length).forEach((callback) => callback());\n\n if(this.parent) {\n indexOfAndSplice(this.parent.details.inner, this);\n this.parent = undefined;\n }\n }\n\n public get(additionalCallback?: () => boolean) {\n const details = this.details;\n\n const middleware: Middleware = () => {\n return !details.cleaned && (!additionalCallback || additionalCallback());\n };\n\n middleware.create = () => {\n if(!middleware()) throw MIDDLEWARE_ERROR;\n const helper = getMiddleware();\n helper.parent = this;\n details.inner.push(helper);\n return helper;\n };\n\n middleware.onClean = (callback) => {\n if(!middleware()) return callback();\n details.onCleanCallbacks.push(callback);\n };\n\n middleware.onDestroy = this.onDestroy;\n\n return middleware;\n }\n\n public onDestroy = (callback: VoidFunction) => {\n if(this.destroyed) return callback();\n this.onDestroyCallbacks.push(callback);\n };\n}\n\n// * will change .cleaned and new instance will be created\nexport function getMiddleware() {\n return new MiddlewareHelper();\n}\n","export default function defineNotNumerableProperties<T extends any>(obj: T, names: (keyof T)[]) {\n // const perf = performance.now();\n const props = {writable: true, configurable: true};\n const out: {[name in keyof T]?: typeof props} = {};\n names.forEach((name) => {\n if(!obj.hasOwnProperty(name)) {\n out[name] = props;\n }\n });\n Object.defineProperties(obj, out);\n // console.log('defineNotNumerableProperties time:', performance.now() - perf);\n}\n","export default function getDeepProperty(object: any, key: string) {\n const splitted = key.split('.');\n let o: any = object;\n splitted.forEach((key) => {\n if(!key) {\n return;\n }\n\n // @ts-ignore\n o = o[key];\n });\n\n return o;\n}\n","export default function getObjectKeysAndSort(object: {[key: string]: any} | Map<number, any>, sort: 'asc' | 'desc' = 'asc') {\n if(!object) return [];\n const ids = object instanceof Map ? [...object.keys()] : Object.keys(object).map((i) => +i);\n if(sort === 'asc') return ids.sort((a, b) => a - b);\n else return ids.sort((a, b) => b - a);\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<F extends AnyFunction> = {\n (...args: Parameters<F>): Promise<Awaited<ReturnType<F>>>;\n clearTimeout(): void;\n isDebounced(): boolean;\n};\n\nexport default function debounce<F extends AnyFunction>(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n shouldRunLast = true\n): DebounceReturnType<F> {\n let waitingTimeout: number;\n let waitingPromise: Promise<Awaited<ReturnType<F>>>, resolve: (result: any) => void, reject: () => void;\n let hadNewCall = false;\n\n const invoke = (args: Parameters<F>) => {\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<F>) => {\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 {MOUNT_CLASS_TO} from '../config/debug';\nimport indexOfAndSplice from './array/indexOfAndSplice';\nimport compareValue from './compareValue';\n\n/**\n * Descend sorted storage\n */\n\ntype ItemType = number | string;\n\nexport enum SliceEnd {\n None = 0,\n Top = 1,\n Bottom = 2,\n Both = SliceEnd.Top | SliceEnd.Bottom\n};\n\nexport interface Slice<T extends ItemType> extends Array<T> {\n // slicedArray: SlicedArray;\n end: SliceEnd;\n\n isEnd: (side: SliceEnd) => boolean;\n setEnd: (side: SliceEnd) => void;\n unsetEnd: (side: SliceEnd) => void;\n getEnds: () => {top: boolean, bottom: boolean, both: boolean};\n\n slice: (from?: number, to?: number) => Slice<T>;\n splice: (start: number, deleteCount: number, ...items: ItemType[]) => Slice<T>;\n}\n\nexport interface SliceConstructor<T extends ItemType> {\n // new(...items: T[]): Slice<T>;\n new(length: number): Slice<T>;\n}\n\nexport type SliceSerialized<T extends ItemType> = {\n values: Slice<T>,\n isEnd: {\n top: boolean,\n bottom: boolean,\n both: boolean\n }\n};\n\nexport type SlicedArraySerialized<T extends ItemType> = {\n slices: SliceSerialized<T>[]\n};\n\nexport default class SlicedArray<T extends ItemType> {\n private slices: Slice<T>[]/* = [[7,6,5],[4,3,2],[1,0,-1]] */;\n private sliceConstructor: SliceConstructor<T>;\n\n constructor() {\n // @ts-ignore\n this.sliceConstructor = SlicedArray.getSliceConstructor(this);\n\n const first = this.constructSlice();\n // first.setEnd(SliceEnd.Bottom);\n this.slices = [first];\n }\n\n private static getSliceConstructor(slicedArray: SlicedArray<ItemType>) {\n return class Slice<T> extends Array<ItemType> implements Slice<T> {\n // slicedArray: SlicedArray;\n end: SliceEnd = SliceEnd.None;\n\n /* constructor(...items: ItemType[]) {\n super(...items);\n //this.slicedArray = slicedArray;\n } */\n\n isEnd(side: SliceEnd): boolean {\n if((this.end & side) === side) {\n return true;\n }/* else if(!this.slicedArray) {\n return false;\n } */\n\n let isEnd = false;\n if(side === SliceEnd.Top) {\n const slice = slicedArray.last;\n isEnd = slice.end & side ? this.includes(slice[slice.length - 1])/* || !slice.length */ : false;\n } else if(side === SliceEnd.Bottom) {\n const slice = slicedArray.first;\n isEnd = slice.end & side ? this.includes(slice[0])/* || !slice.length */ : false;\n } else if(side === SliceEnd.Both) {\n return this.isEnd(SliceEnd.Top) && this.isEnd(SliceEnd.Bottom);\n }\n\n if(isEnd) {\n this.setEnd(side);\n }\n\n return isEnd;\n }\n\n getEnds() {\n return {\n top: this.isEnd(SliceEnd.Top),\n bottom: this.isEnd(SliceEnd.Bottom),\n both: this.isEnd(SliceEnd.Both)\n };\n }\n\n setEnd(side: SliceEnd) {\n this.end |= side;\n }\n\n unsetEnd(side: SliceEnd) {\n this.end &= ~side;\n }\n\n splice(start: number, deleteCount: number, ...items: ItemType[]) {\n const ret = super.splice(start, deleteCount, ...items);\n\n if(!this.length) {\n const slices = slicedArray.slices as ItemType[][];\n const idx = slices.indexOf(this);\n if(idx !== -1) {\n if(slices.length === 1) { // left empty slice without ends\n this.unsetEnd(SliceEnd.Both);\n } else { // delete this slice\n slices.splice(idx, 1);\n }\n }\n }\n\n return ret;\n }\n }\n }\n\n public constructSlice(...items: T[]) {\n // const slice = new Slice(this, ...items);\n // can't pass items directly to constructor because first argument is length\n const slice = new this.sliceConstructor(items.length);\n for(let i = 0, length = items.length; i < length; ++i) {\n slice[i] = items[i];\n }\n return slice;\n\n // ! code below will slow execution in 15 times\n /* const self = this;\n const p: Slice = new Proxy(slice, {\n get: function(target, name: any) {\n if(name === 'constructor') {\n const p = new Proxy(Slice, {\n construct: (target, args) => {\n return self.constructSlice(...args);\n }\n });\n\n return p;\n }\n\n return target[name];\n }\n });\n\n return p; */\n\n /*\n var p = slicedArray.constructSlice();\n p.length = 100000;\n p.fill(255);\n\n var a = new Array(100000);\n a.fill(255);\n\n var b = 0;\n var perf = performance.now();\n for(var i = 0; i < p.length; ++i) {\n b += p[i];\n }\n\n console.log('perf 1', performance.now() - perf);\n\n b = 0;\n perf = performance.now();\n for(var i = 0; i < a.length; ++i) {\n b += a[i];\n }\n\n console.log('perf 2', performance.now() - perf);\n */\n }\n\n public insertSlice(slice: T[], flatten = true) {\n if(!slice.length) {\n return;\n }\n\n const first = this.slices[0];\n if(!first.length) {\n first.push(...slice);\n return first;\n }\n\n const lowerBound = slice[slice.length - 1];\n const upperBound = slice[0];\n\n let foundSlice: Slice<T>, lowerIndex = -1, upperIndex = -1, foundSliceIndex = 0;\n for(; foundSliceIndex < this.slices.length; ++foundSliceIndex) {\n foundSlice = this.slices[foundSliceIndex];\n lowerIndex = foundSlice.indexOf(lowerBound);\n upperIndex = foundSlice.indexOf(upperBound);\n\n if(upperIndex !== -1 && -1 !== lowerIndex) {\n break;\n } else if(upperIndex !== -1 || -1 !== lowerIndex) {\n break;\n }\n }\n\n if(upperIndex !== -1 && -1 !== lowerIndex) {\n\n } else if(upperIndex !== -1) { // ([1, 2, 3] | [1, 2, 3, 4, 5]) -> [1, 2, 3, 4, 5]\n const sliced = slice.slice(foundSlice.length - upperIndex);\n foundSlice.push(...sliced);\n } else if(lowerIndex !== -1) { // ([1, 2, 3] | [-1, 0, 1]) -> [-1, 0, 1, 2, 3]\n const sliced = slice.slice(0, slice.length - lowerIndex - 1);\n foundSlice.unshift(...sliced);\n } else {\n let insertIndex = 0;\n for(const length = this.slices.length; insertIndex < length; ++insertIndex) { // * maybe should iterate from the end, could be faster ?\n const s = this.slices[insertIndex];\n if(compareValue(slice[0], s[0]) === 1) {\n break;\n }\n }\n\n this.slices.splice(insertIndex, 0, this.constructSlice(...slice));\n foundSliceIndex = insertIndex;\n }\n\n if(flatten) {\n return this.flatten(foundSliceIndex);\n }\n }\n\n private flatten(foundSliceIndex: number) {\n if(this.slices.length >= 2) {\n for(let i = 0, length = this.slices.length; i < (length - 1); ++i) {\n const prevSlice = this.slices[i];\n const nextSlice = this.slices[i + 1];\n\n const upperIndex = prevSlice.indexOf(nextSlice[0]);\n if(upperIndex !== -1) {\n prevSlice.setEnd(nextSlice.end);\n this.slices.splice(i + 1, 1);\n\n if(i < foundSliceIndex) {\n --foundSliceIndex;\n }\n\n --length; // respect array bounds\n --i; // repeat from the same place\n\n this.insertSlice(nextSlice, false);\n }\n }\n }\n\n return this.slices[foundSliceIndex];\n }\n\n // *\n\n get first() {\n return this.slices[0];\n }\n\n get last() {\n return this.slices[this.slices.length - 1];\n }\n\n get slice() {\n return this.first;\n }\n\n get length() {\n return this.slice.length;\n }\n\n public findSlice(item: T) {\n for(let i = 0, length = this.slices.length; i < length; ++i) {\n const slice = this.slices[i];\n const index = slice.indexOf(item);\n if(index !== -1) {\n return {slice, index};\n }\n }\n\n return undefined;\n }\n\n public findSliceOffset(maxId: T) {\n let slice: Slice<T>;\n for(let i = 0; i < this.slices.length; ++i) {\n let offset = 0;\n slice = this.slices[i];\n if(slice.length < 2) {\n continue;\n }\n\n for(; offset < slice.length; ++offset) {\n if(compareValue(maxId, slice[offset]) >= 0) {\n /* if(!offset) { // because can't find 3 in [[5,4], [2,1]]\n return undefined;\n } */\n\n return {\n slice,\n offset: maxId === slice[offset] ? offset : offset - 1\n };\n }\n }\n }\n\n if(slice && slice.isEnd(SliceEnd.Top)) {\n return {\n slice,\n offset: slice.length\n };\n }\n\n return undefined;\n }\n\n // * https://core.telegram.org/api/offsets\n public sliceMe(offsetId: T, add_offset: number, limit: number) {\n let slice = this.slice;\n let offset = 0;\n let sliceOffset = 0;\n\n if(offsetId) {\n const pos = this.findSliceOffset(offsetId);\n if(!pos) {\n return undefined;\n }\n\n slice = pos.slice;\n offset = sliceOffset = pos.offset;\n\n if(slice.includes(offsetId)) {\n sliceOffset += 1;\n }\n\n /* if(slice.includes(offsetId) && add_offset < 0) {\n add_offset += 1;\n } */\n }\n\n const sliceStart = Math.max(sliceOffset + add_offset, 0);\n const sliceEnd = sliceOffset + add_offset + limit;\n // const fixHalfBackLimit = add_offset && !(limit / add_offset % 2) && (sliceEnd % 2) ? 1 : 0;\n // sliceEnd += fixHalfBackLimit;\n\n const sliced = slice.slice(sliceStart, sliceEnd) as Slice<T>;\n\n const topWasMeantToLoad = add_offset < 0 ? limit + add_offset : limit;\n const bottomWasMeantToLoad = Math.abs(add_offset);\n\n // can use 'slice' here to check because if it's end, then 'sliced' is out of 'slice'\n // useful when there is only 1 message in chat on its reopening\n const topFulfilled = (slice.length - sliceOffset) >= topWasMeantToLoad || (slice.isEnd(SliceEnd.Top) ? (sliced.setEnd(SliceEnd.Top), true) : false);\n const bottomFulfilled = (sliceOffset - bottomWasMeantToLoad) >= 0 || (slice.isEnd(SliceEnd.Bottom) ? (sliced.setEnd(SliceEnd.Bottom), true) : false);\n\n // if(topFulfilled) sliced.isEnd(SliceEnd.Top);\n // if(bottomFulfilled) sliced.isEnd(SliceEnd.Bottom);\n\n return {\n slice: sliced,\n offsetIdOffset: offset,\n fulfilled: SliceEnd.None | (topFulfilled && bottomFulfilled ? SliceEnd.Both : ((topFulfilled ? SliceEnd.Top : SliceEnd.None) | (bottomFulfilled ? SliceEnd.Bottom : SliceEnd.None)))\n };\n }\n\n public unshift(...items: T[]) {\n let slice = this.first;\n if(!slice.length) {\n slice.setEnd(SliceEnd.Bottom);\n } else if(!slice.isEnd(SliceEnd.Bottom)) {\n slice = this.constructSlice();\n slice.setEnd(SliceEnd.Bottom);\n this.slices.unshift(slice);\n }\n\n slice.unshift(...items);\n }\n\n public push(...items: T[]) {\n let slice = this.last;\n if(!slice.length) {\n slice.setEnd(SliceEnd.Top);\n } else if(!slice.isEnd(SliceEnd.Top)) {\n slice = this.constructSlice();\n slice.setEnd(SliceEnd.Top);\n this.slices.push(slice);\n }\n\n slice.push(...items);\n }\n\n public delete(item: T) {\n const found = this.findSlice(item);\n if(found) {\n found.slice.splice(found.index, 1);\n return true;\n }\n\n return false;\n }\n\n public deleteSlice(slice: Slice<T>) {\n indexOfAndSplice(this.slices, slice);\n }\n\n public toJSON() {\n const slices: SlicedArraySerialized<T>['slices'] = this.slices.map((slice) => {\n return {\n values: slice.slice(),\n isEnd: slice.getEnds()\n };\n });\n\n const serialized: SlicedArraySerialized<T> = {\n slices\n };\n\n return JSON.stringify(serialized);\n }\n\n public static fromJSON<T extends ItemType>(json: string) {\n const parsed: SlicedArraySerialized<T> = JSON.parse(json);\n const sliced = new SlicedArray<T>();\n parsed.slices.forEach((slice) => {\n const inserted = sliced.insertSlice(slice.values) || sliced.first;\n if(slice.isEnd.top) inserted.setEnd(SliceEnd.Top);\n if(slice.isEnd.bottom) inserted.setEnd(SliceEnd.Bottom);\n });\n\n return sliced;\n }\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.SlicedArray = SlicedArray);\n","import compareLong from './long/compareLong';\n\nexport default function compareValue(val1: string | number, val2: typeof val1) {\n if((val1 as number).toExponential) {\n const diff = (val1 as number) - (val2 as number);\n return diff < 0 ? -1 : (diff > 0 ? 1 : 0);\n }\n\n return compareLong(val1 as string, val2 as string);\n}\n","/*\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 compareLong(str1: string, str2: string) {\n const str1Length = str1.length;\n if(str1Length !== str2.length) {\n const diff = str1Length - str2.length;\n return diff < 0 ? -1 : (diff > 0 ? 1 : 0);\n }\n\n const maxPartLength = 15;\n for(let i = 0; i < str1Length; i += maxPartLength) {\n const v1 = +str1.slice(i, i + maxPartLength);\n const v2 = +str2.slice(i, i + maxPartLength);\n const diff = v1 - v2;\n if(diff) {\n return diff;\n }\n }\n\n return 0;\n}\n","import {AttachMenuBot} from '../../../../layer';\nimport {ATTACH_MENU_BOT_ICON_NAME} from '../../../mtproto/mtproto_config';\n\nexport default function getAttachMenuBotIcon(attachMenuBot: AttachMenuBot) {\n return attachMenuBot.icons.find((icon) => icon.name === ATTACH_MENU_BOT_ICON_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 {ChannelParticipant, ChatParticipant} from '../../../../layer';\nimport getPeerId from '../peers/getPeerId';\n\nexport default function getParticipantPeerId(participant: ChannelParticipant | ChatParticipant): PeerId {\n const peerId = (participant as ChannelParticipant.channelParticipantBanned).peer ?\n getPeerId((participant as ChannelParticipant.channelParticipantBanned).peer) :\n (participant as ChatParticipant.chatParticipant).user_id.toPeerId();\n return peerId;\n}\n","/*\n * 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, ChatAdminRights, ChatBannedRights} from '../../../../layer';\nimport {ChatRights} from '../../appChatsManager';\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 */\nexport default function hasRights(chat: Exclude<Chat, Chat.chatEmpty>, action: ChatRights, rights?: ChatAdminRights | ChatBannedRights, isThread?: boolean) {\n if(!chat) return false;\n\n if((chat as Chat.chat).pFlags.deactivated && action !== 'view_messages') {\n return false;\n }\n\n const isCheckingRightsForSelf = rights === undefined;\n if((chat as Chat.chat).pFlags.creator && isCheckingRightsForSelf) {\n return true;\n }\n\n if(chat._ === 'chatForbidden' ||\n chat._ === 'channelForbidden' ||\n // (chat as any).pFlags.kicked ||\n (chat.pFlags.left && !(chat as Chat.channel).pFlags.megagroup)) {\n return false;\n }\n\n // const adminRights = chat.admin_rights;\n // const bannedRights = (chat as Chat.channel).banned_rights || chat.default_banned_rights;\n\n if(!rights) {\n rights = chat.admin_rights || (chat as Chat.channel).banned_rights || chat.default_banned_rights;\n\n if(!rights) {\n return false;\n }\n }\n\n let myFlags: Partial<{[flag in keyof ChatBannedRights['pFlags'] | keyof ChatAdminRights['pFlags']]: true}> = {};\n if(rights) {\n myFlags = rights.pFlags as any;\n }\n\n // const adminFlags = adminRights?.pFlags || {};\n // const bannedFlags = bannedRights?.pFlags || {};\n\n const isAdmin = rights._ === 'chatAdminRights';\n\n switch(action) {\n case 'embed_links':\n case 'send_games':\n case 'send_gifs':\n case 'send_inline':\n case 'send_media':\n case 'send_messages':\n case 'send_polls':\n case 'send_stickers':\n case 'send_photos':\n case 'send_videos':\n case 'send_roundvideos':\n case 'send_audios':\n case 'send_voices':\n case 'send_docs':\n case 'send_plain': {\n if(!isThread && chat.pFlags.left) {\n return false;\n }\n\n if(rights._ === 'chatBannedRights' && myFlags[action]) {\n return false;\n }\n\n if(chat._ === 'channel') {\n if(!chat.pFlags.megagroup && !myFlags.post_messages) {\n return false;\n }\n }\n\n break;\n }\n\n // * revoke foreign messages\n case 'delete_messages':\n case 'manage_call': {\n return !!myFlags[action];\n }\n\n case 'pin_messages': {\n return isAdmin ? myFlags[action] || !!myFlags.post_messages : !myFlags[action];\n }\n\n // case 'change_info': {\n // return adminRights || isCheckingRightsForSelf ? adminFlags[action] : !myFlags[action];\n // }\n\n case 'change_info':\n case 'invite_users': {\n return isAdmin ? !!myFlags[action] : !myFlags[action];\n }\n\n // * only creator can do that\n case 'change_type':\n case 'delete_chat': {\n return false;\n }\n\n case 'edit_messages':\n case 'manage_topics': {\n return isAdmin && !!myFlags[action];\n }\n\n case 'ban_users':\n case 'change_permissions': {\n return isAdmin && !!myFlags['ban_users'];\n }\n\n case 'view_participants': {\n return !!(chat._ === 'chat' || !chat.pFlags.broadcast || chat.pFlags.creator || chat.admin_rights);\n }\n }\n\n return true;\n}\n","/*\n * 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, ForumTopic} from '../../../../layer';\nimport type {REAL_FOLDER_ID} from '../../../mtproto/mtproto_config';\nimport getDialogIndexKey from './getDialogIndexKey';\n\nexport default function getDialogIndex(\n dialog: Dialog.dialog | ForumTopic.forumTopic,\n indexKey: ReturnType<typeof getDialogIndexKey> = getDialogIndexKey((dialog as Dialog).folder_id as REAL_FOLDER_ID)\n) {\n return dialog?.[indexKey as 'index_0'];\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {DialogFilter} from '../../../../layer';\n\nexport default function getDialogIndexKey(localId: DialogFilter.dialogFilter['localId'] = 0) {\n return `index_${localId}` as const;\n // return filterId !== undefined && filterId > 1 ? `filter_${filterId}` as const : 'main' as const;\n // const indexStr = filterId > 1 ?\n // `index_${filterId}` as const :\n // 'index' as const;\n\n // return indexStr;\n}\n","/*\n * 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 {Document, PhotoSize, VideoSize} from '../../../../layer';\nimport type {DownloadOptions} from '../../../mtproto/apiFileManager';\nimport getDocumentInputFileLocation from './getDocumentInputFileLocation';\n\nexport default function getDocumentDownloadOptions(\n doc: Document.document,\n thumb?: PhotoSize.photoSize | Extract<VideoSize, VideoSize.videoSize>,\n queueId?: number,\n onlyCache?: boolean\n): DownloadOptions {\n const inputFileLocation = getDocumentInputFileLocation(doc, thumb?.type);\n\n let mimeType: MTMimeType;\n if(thumb?._ === 'photoSize') {\n mimeType = doc.sticker ? 'image/webp' : (doc.mime_type.startsWith('image/') ? doc.mime_type : 'image/jpeg');\n } else {\n mimeType = doc.mime_type || 'application/octet-stream';\n }\n\n return {\n dcId: doc.dc_id,\n location: inputFileLocation,\n size: thumb ? thumb.size : doc.size,\n mimeType,\n fileName: doc.file_name,\n queueId,\n onlyCache\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Document, InputFileLocation} from '../../../../layer';\n\nexport default function getDocumentInputFileLocation(doc: Document.document, thumbSize?: string): InputFileLocation.inputDocumentFileLocation {\n return {\n _: 'inputDocumentFileLocation',\n id: doc.id,\n access_hash: doc.access_hash,\n file_reference: doc.file_reference,\n thumb_size: thumbSize\n };\n}\n","/*\n * 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 {DownloadOptions} from '../../../mtproto/apiFileManager';\n\nexport default function getDownloadFileNameFromOptions(options: DownloadOptions) {\n return getFileNameByLocation(options.location, options);\n}\n","/*\n * 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 getDocumentDownloadOptions from '../docs/getDocumentDownloadOptions';\nimport getPhotoDownloadOptions from '../photos/getPhotoDownloadOptions';\nimport getWebDocumentDownloadOptions from '../webDocs/getWebDocumentDownloadOptions';\nimport isWebDocument from '../webDocs/isWebDocument';\nimport getDownloadFileNameFromOptions from './getDownloadFileNameFromOptions';\n\nexport default function getDownloadMediaDetails(options: DownloadMediaOptions) {\n const {media, thumb, queueId, onlyCache} = options;\n\n let downloadOptions: DownloadOptions;\n if(media._ === 'document') downloadOptions = getDocumentDownloadOptions(media, thumb as any, queueId, onlyCache);\n else if(media._ === 'photo') downloadOptions = getPhotoDownloadOptions(media, thumb as any, queueId, onlyCache);\n else if(isWebDocument(media)) downloadOptions = getWebDocumentDownloadOptions(media);\n\n downloadOptions.downloadId = options.downloadId;\n\n const fileName = getDownloadFileNameFromOptions(downloadOptions);\n return {fileName, downloadOptions};\n}\n","import {WebDocument} from '../../../../layer';\nimport {DownloadOptions} from '../../../mtproto/apiFileManager';\n\nexport default function getWebDocumentDownloadOptions(webDocument: WebDocument): DownloadOptions {\n return {\n dcId: 0,\n location: {\n _: 'inputWebFileLocation',\n access_hash: (webDocument as WebDocument.webDocument).access_hash,\n url: webDocument.url\n },\n size: webDocument.size,\n mimeType: webDocument.mime_type\n };\n}\n","import deepEqual from '../../../../helpers/object/deepEqual';\nimport isObject from '../../../../helpers/object/isObject';\nimport {DraftMessage} from '../../../../layer';\n\nexport default function draftsAreEqual(draft1: DraftMessage, draft2: DraftMessage) {\n if(typeof(draft1) !== typeof(draft2)) {\n return false;\n }\n\n if(!isObject(draft1)) {\n return true;\n }\n\n if(draft1._ !== draft2._) {\n return false;\n }\n\n if(draft1._ === 'draftMessage' && draft2._ === draft1._) {\n if(draft1.reply_to_msg_id !== draft2.reply_to_msg_id) {\n return false;\n }\n\n if(!deepEqual(draft1.entities, draft2.entities)) {\n return false;\n }\n\n if(draft1.message !== draft2.message) {\n return false;\n }\n\n if(draft1.pFlags.no_webpage !== draft2.pFlags.no_webpage) {\n return false;\n }\n }\n\n return true;\n}\n","import {MessagesBotResults} from '../../../../layer';\n\nexport default function generateQId(queryId: MessagesBotResults.messagesBotResults['query_id'], resultId: string) {\n return queryId + '_' + resultId;\n}\n","/*\n * 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 generateMessageId(messageId: number) {\n const q = MESSAGE_ID_OFFSET;\n if(messageId >= q) {\n return messageId;\n }\n\n return q + (messageId * MESSAGE_ID_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 {Message, MessageMedia, MessageEntity, MessageAction} from '../../../../layer';\nimport matchUrl from '../../../richTextProcessor/matchUrl';\nimport type {MyDocument} from '../../appDocsManager';\nimport type {MyInputMessagesFilter, MyMessage} from '../../appMessagesManager';\n\nexport default function filterMessagesByInputFilter(inputFilter: MyInputMessagesFilter, history: Array<Message.message | Message.messageService>, limit: number) {\n if(inputFilter === 'inputMessagesFilterEmpty') {\n return history;\n }\n\n const foundMsgs: MyMessage[] = [];\n if(!history.length) {\n return foundMsgs;\n }\n\n let filtering = true;\n const neededContents: Partial<{\n [messageMediaType in MessageMedia['_']]: boolean\n }> & Partial<{\n avatar: boolean,\n url: boolean\n }> = {},\n neededDocTypes: MyDocument['type'][] = [],\n excludeDocTypes: MyDocument['type'][] = []/* ,\n neededFlags: string[] = [] */;\n\n switch(inputFilter) {\n case 'inputMessagesFilterPhotos':\n neededContents['messageMediaPhoto'] = true;\n break;\n\n case 'inputMessagesFilterPhotoVideo':\n neededContents['messageMediaPhoto'] = true;\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('video');\n break;\n\n case 'inputMessagesFilterVideo':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('video');\n break;\n\n case 'inputMessagesFilterDocument':\n neededContents['messageMediaDocument'] = true;\n // excludeDocTypes.push('video');\n neededDocTypes.push(undefined, 'photo', 'pdf');\n break;\n\n case 'inputMessagesFilterVoice':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('voice');\n break;\n\n case 'inputMessagesFilterRoundVoice':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('round', 'voice');\n break;\n\n case 'inputMessagesFilterRoundVideo':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('round');\n break;\n\n case 'inputMessagesFilterMusic':\n neededContents['messageMediaDocument'] = true;\n neededDocTypes.push('audio');\n break;\n\n case 'inputMessagesFilterUrl':\n neededContents['url'] = true;\n break;\n\n case 'inputMessagesFilterChatPhotos':\n neededContents['avatar'] = true;\n break;\n\n /* case 'inputMessagesFilterPinned':\n neededFlags.push('pinned');\n break; */\n\n /* case 'inputMessagesFilterMyMentions':\n neededContents['mentioned'] = true;\n break; */\n\n default:\n filtering = false;\n break;\n /* return Promise.resolve({\n count: 0,\n next_rate: 0,\n history: [] as number[]\n }); */\n }\n\n if(!filtering) {\n return foundMsgs;\n }\n\n for(let i = 0, length = history.length; i < length; ++i) {\n const message: Message.message | Message.messageService = history[i];\n if(!message) continue;\n\n // || (neededContents['mentioned'] && message.totalEntities.find((e: any) => e._ === 'messageEntityMention'));\n\n let found = false;\n if(message._ === 'message') {\n if(message.media && neededContents[message.media._]/* && !message.fwd_from */) {\n const doc = (message.media as MessageMedia.messageMediaDocument).document as MyDocument;\n if(doc &&\n (\n (neededDocTypes.length && !neededDocTypes.includes(doc.type)) ||\n excludeDocTypes.includes(doc.type)\n )\n ) {\n continue;\n }\n\n found = true;\n } else if(neededContents['url'] && message.message) {\n const goodEntities = ['messageEntityTextUrl', 'messageEntityUrl'];\n if((message.totalEntities as MessageEntity[]).find((e) => goodEntities.includes(e._)) || matchUrl(message.message)) {\n found = true;\n }\n }\n } else if(neededContents['avatar'] &&\n message.action &&\n ([\n 'messageActionChannelEditPhoto' as const,\n 'messageActionChatEditPhoto' as const,\n 'messageActionChannelEditVideo' as const,\n 'messageActionChatEditVideo' as const\n ] as MessageAction['_'][]).includes(message.action._)) {\n found = true;\n }/* else if(neededFlags.find((flag) => message.pFlags[flag])) {\n found = true;\n } */\n\n if(found) {\n foundMsgs.push(message);\n if(foundMsgs.length >= limit) {\n break;\n }\n }\n }\n\n return foundMsgs;\n}\n","import assumeType from '../../../../helpers/assumeType';\nimport {Message} from '../../../../layer';\n\nexport default function getAlbumText(messages: Message.message[]) {\n let foundMessages = 0, message: Message.message;\n for(const m of messages) {\n assumeType<Message.message>(m);\n if(m.message) {\n if(++foundMessages > 1) break;\n message = m;\n }\n }\n\n if(foundMessages > 1) {\n message = undefined;\n }\n\n return message;\n}\n","import {Message} from '../../../../layer';\nimport {GENERAL_TOPIC_ID} from '../../../mtproto/mtproto_config';\n\nexport default function getMessageThreadId(message: Message.message | Message.messageService, isForum?: boolean) {\n let threadId: number;\n const replyTo = message.reply_to;\n if(replyTo && (!isForum || replyTo.pFlags.forum_topic)) {\n threadId = replyTo.reply_to_top_id || replyTo.reply_to_msg_id;\n } else if(isForum) {\n if(message._ === 'messageService' && message.action?._ === 'messageActionTopicCreate') {\n threadId = message.mid;\n } else {\n threadId = GENERAL_TOPIC_ID;\n }\n }\n\n return threadId;\n}\n","import {Chat, User} from '../../../../layer';\n\nexport default function getPeerActiveUsernames(peer: User | Chat) {\n if(!peer) {\n return [];\n }\n\n const usernames = (peer as Chat.channel).usernames;\n if(usernames) {\n return usernames\n .filter((username) => username.pFlags.active)\n // .sort((a, b) => +!!b.pFlags.editable - +!!a.pFlags.editable)\n .map((username) => username.username);\n }\n\n return (peer as Chat.channel).username ? [(peer as Chat.channel).username] : [];\n}\n","import {Chat, ChatPhoto, User, UserProfilePhoto} from '../../../../layer';\nimport isPeerRestricted from './isPeerRestricted';\n\nexport default function getPeerPhoto(peer: User | Chat) {\n if(!peer || isPeerRestricted(peer)) {\n return;\n }\n\n return (peer as User.user | Chat.channel)?.photo as UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto;\n}\n","import {isRestricted} from '../../../../helpers/restrictions';\nimport {Chat, User} from '../../../../layer';\n\nexport default function isPeerRestricted(peer: Chat | User) {\n const restrictionReasons = (peer as Chat.channel)?.restriction_reason;\n return !!(restrictionReasons && (peer as Chat.channel).pFlags.restricted && isRestricted(restrictionReasons));\n}\n","/*\n * 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 {PhotoSize, InputFileLocation} from '../../../../layer';\nimport type {DownloadOptions} from '../../../mtproto/apiFileManager';\nimport type {MyDocument} from '../../appDocsManager';\nimport type {MyPhoto} from '../../appPhotosManager';\n\nexport default function getPhotoDownloadOptions(photo: MyPhoto | MyDocument, photoSize: PhotoSize, queueId?: number, onlyCache?: boolean): DownloadOptions {\n const isDocument = photo._ === 'document';\n\n if(!photoSize || photoSize._ === 'photoSizeEmpty') {\n // console.error('no photoSize by photo:', photo);\n throw new Error('photoSizeEmpty!');\n }\n\n // maybe it's a thumb\n const isPhoto = !!((photoSize._ === 'photoSize' || photoSize._ === 'photoSizeProgressive') && photo.access_hash && photo.file_reference);\n const location: InputFileLocation.inputPhotoFileLocation | InputFileLocation.inputDocumentFileLocation = {\n _: isDocument ? 'inputDocumentFileLocation' : 'inputPhotoFileLocation',\n id: photo.id,\n access_hash: photo.access_hash,\n file_reference: photo.file_reference,\n thumb_size: photoSize.type\n };\n\n return {\n dcId: photo.dc_id,\n location,\n size: isPhoto ? (photoSize as PhotoSize.photoSize).size : undefined,\n mimeType: 'image/jpeg',\n queueId,\n onlyCache\n };\n}\n","import deepEqual from '../../../../helpers/object/deepEqual';\nimport {Reaction} from '../../../../layer';\n\nexport default function reactionsEqual(r1: Reaction, r2: Reaction) {\n return deepEqual(r1, r2);\n}\n","import {MyDocument} from '../../appDocsManager';\nimport {VideoSize} from '../../../../layer';\n\nexport default function getStickerEffectThumb(doc: MyDocument) {\n return doc.video_thumbs?.[0] as Extract<VideoSize, VideoSize.videoSize>;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {User} from '../../../../layer';\nimport {REPLIES_PEER_ID} from '../../../mtproto/mtproto_config';\n\nexport default function canSendToUser(user: User.user) {\n return !!(user && !user.pFlags.deleted && user.id.toPeerId() !== REPLIES_PEER_ID);\n}\n","import {WebDocument} from '../../../../layer';\n\nexport default function isWebDocument(webDocument: any): webDocument is WebDocument {\n return !!(webDocument && (webDocument._ === 'webDocument' || webDocument._ === 'webDocumentNoProxy'));\n}\n","/*\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 ConnectionStatus {\n Connected,\n Connecting,\n Closed,\n TimedOut\n};\n\nexport type ConnectionStatusChange = {\n _: 'networkerStatus',\n status: ConnectionStatus,\n dcId: number,\n name: string,\n isFileNetworker: boolean,\n isFileDownload: boolean,\n isFileUpload: boolean,\n retryAt?: number\n};\n","/*\n * 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';\n\nconst CAN_COMBINE_ENTITIES: Set<MessageEntity['_']> = new Set([\n 'messageEntityBold',\n 'messageEntityItalic',\n 'messageEntityCode',\n 'messageEntityPre',\n 'messageEntityUnderline',\n 'messageEntityStrike',\n 'messageEntityBlockquote',\n 'messageEntitySpoiler'\n]);\nexport default function combineSameEntities(entities: MessageEntity[]) {\n // entities = entities.slice();\n for(let i = 0; i < entities.length; ++i) {\n const entity = entities[i];\n\n let nextEntityIdx = -1;\n do {\n nextEntityIdx = entities.findIndex((e, _i) => {\n return CAN_COMBINE_ENTITIES.has(e._) && _i !== i && e._ === entity._ && (e.offset - entity.length) === entity.offset;\n });\n\n if(nextEntityIdx !== -1) {\n const nextEntity = entities[nextEntityIdx];\n entity.length += nextEntity.length;\n entities.splice(nextEntityIdx, 1);\n }\n } while(nextEntityIdx !== -1);\n }\n // return entities;\n}\n","/*\n * 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 spoiler from './spoiler';\n\nexport default function encodeSpoiler(text: string, entity: MessageEntity.messageEntitySpoiler) {\n const before = text.slice(0, entity.offset);\n const spoilerBefore = text.slice(entity.offset, entity.offset + entity.length);\n const spoilerAfter = spoiler(spoilerBefore)/* '▚'.repeat(entity.length) */;\n const after = text.slice(entity.offset + entity.length);\n text = before + spoilerAfter + after;\n return {text, entityText: spoilerAfter};\n};\n","export default function spoiler(text: string): string {\n const chars = '⠁⠂⠄⠈⠐⠠⡀⢀⠃⠅⠆⠉⠊⠌⠑⠒⠔⠘⠡⠢⠤⠨⠰⡁⡂⡄⡈⡐⡠⢁⢂⢄⢈⢐⢠⣀⠇⠋⠍⠎⠓⠕⠖⠙⠚⠜⠣⠥⠦⠩⠪⠬⠱⠲⠴⠸⡃⡅⡆⡉⡊⡌⡑⡒⡔⡘⡡⡢⡤⡨⡰⢃⢅⢆⢉⢊⢌⢑⢒⢔⢘⢡⢢⢤⢨⢰⣁⣂⣄⣈⣐⣠⠏⠗⠛⠝⠞⠧⠫⠭⠮⠳⠵⠶⠹⠺⠼⡇⡋⡍⡎⡓⡕⡖⡙⡚⡜⡣⡥⡦⡩⡪⡬⡱⡲⡴⡸⢇⢋⢍⢎⢓⢕⢖⢙⢚⢜⢣⢥⢦⢩⢪⢬⢱⢲⢴⢸⣃⣅⣆⣉⣊⣌⣑⣒⣔⣘⣡⣢⣤⣨⣰⠟⠯⠷⠻⠽⠾⡏⡗⡛⡝⡞⡧⡫⡭⡮⡳⡵⡶⡹⡺⡼⢏⢗⢛⢝⢞⢧⢫⢭⢮⢳⢵⢶⢹⢺⢼⣇⣋⣍⣎⣓⣕⣖⣙⣚⣜⣣⣥⣦⣩⣪⣬⣱⣲⣴⣸⠿⡟⡯⡷⡻⡽⡾⢟⢯⢷⢻⢽⢾⣏⣗⣛⣝⣞⣧⣫⣭⣮⣳⣵⣶⣹⣺⣼⡿⢿⣟⣯⣷⣻⣽⣾⣿';\n const charsLength = chars.length;\n\n const out: string[] = [];\n for(let i = 0; i < text.length; ++i) {\n const char = text.charCodeAt(i);\n out.push(chars[char % charsLength]);\n }\n\n return out.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 {PASS_CONFLICTING_ENTITIES, PASS_SINGLE_CONFLICTING_ENTITIES} from '.';\nimport {MessageEntity} from '../../layer';\n\nconst SINGLE_ENTITIES: Set<MessageEntity['_']> = new Set(['messageEntityPre', 'messageEntityCode']);\n\nexport default function findConflictingEntity(currentEntities: MessageEntity[], newEntity: MessageEntity) {\n let singleEnd = -1;\n return currentEntities.find((currentEntity) => {\n if(SINGLE_ENTITIES.has(currentEntity._)) {\n singleEnd = currentEntity.offset + currentEntity.length;\n }\n\n if(newEntity.offset < singleEnd && !PASS_SINGLE_CONFLICTING_ENTITIES.has(newEntity._)) {\n return true;\n }\n\n const isConflictingTypes = newEntity._ === currentEntity._ ||\n (!PASS_CONFLICTING_ENTITIES.has(newEntity._) && !PASS_CONFLICTING_ENTITIES.has(currentEntity._));\n\n if(!isConflictingTypes) {\n return false;\n }\n\n const isConflictingOffset = newEntity.offset >= currentEntity.offset &&\n (newEntity.length + newEntity.offset) <= (currentEntity.length + currentEntity.offset);\n\n return isConflictingOffset;\n });\n}\n","/*\n * 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';\n\nexport default function fixEmoji(text: string, entities?: MessageEntity[]) {\n /* if(!IS_EMOJI_SUPPORTED) {\n return text;\n } */\n // '$`\\ufe0f'\n\n text = text.replace(/[\\u2640\\u2642\\u2764](?!\\ufe0f)/g, (match, offset, string) => {\n if(entities) {\n const length = match.length;\n\n offset += length;\n entities.forEach((entity) => {\n const end = entity.offset + entity.length;\n if(end === offset) { // current entity\n entity.length += length;\n } else if(end > offset) {\n entity.offset += length;\n }\n });\n }\n\n // console.log([match, offset, string]);\n return match + '\\ufe0f';\n });\n\n return text;\n}\n","import {URL_REG_EXP} from '.';\n\nexport default function matchUrl(text: string) {\n return !text ? null : text.match(URL_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 {MessageEntity} from '../../layer';\nimport findConflictingEntity from './findConflictingEntity';\nimport sortEntities from './sortEntities';\n\nexport default function mergeEntities(currentEntities: MessageEntity[], newEntities: MessageEntity[]) {\n const filtered = newEntities.filter((e) => {\n return !findConflictingEntity(currentEntities, e);\n });\n\n currentEntities.push(...filtered);\n sortEntities(currentEntities);\n // currentEntities.sort((a, b) => a.offset - b.offset);\n // currentEntities.sort((a, b) => (a.offset - b.offset) || (a._ === 'messageEntityCaret' && -1));\n\n // * fix splitted emoji. messageEntityTextUrl can split the emoji if starts before its end (e.g. on fe0f)\n // * have to fix even if emoji supported since it's being wrapped in span\n // if(!IS_EMOJI_SUPPORTED) {\n for(let i = 0; i < currentEntities.length; ++i) {\n const entity = currentEntities[i];\n if(entity._ === 'messageEntityEmoji') {\n const nextEntity = currentEntities[i + 1];\n if(nextEntity /* && nextEntity._ !== 'messageEntityCaret' */ && nextEntity.offset < (entity.offset + entity.length)) {\n entity.length = nextEntity.offset - entity.offset;\n }\n }\n }\n // }\n\n return currentEntities;\n}\n","/*\n * 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 <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// From https://github.com/stephenmathieson/node-tlds/blob/master/index.js\nconst TLD = ['abogado', 'ac', 'academy', 'accountants', 'active', 'actor', 'ad', 'adult', 'ae', 'aero', 'af', 'ag', 'agency', 'ai', 'airforce', 'al', 'allfinanz', 'alsace', 'am', 'amsterdam', 'an', 'android', 'ao', 'apartments', 'aq', 'aquarelle', 'ar', 'archi', 'army', 'arpa', 'as', 'asia', 'associates', 'at', 'attorney', 'au', 'auction', 'audio', 'autos', 'aw', 'ax', 'axa', 'az', 'ba', 'band', 'bank', 'bar', 'barclaycard', 'barclays', 'bargains', 'bayern', 'bb', 'bd', 'be', 'beer', 'berlin', 'best', 'bf', 'bg', 'bh', 'bi', 'bid', 'bike', 'bingo', 'bio', 'biz', 'bj', 'black', 'blackfriday', 'bloomberg', 'blue', 'bm', 'bmw', 'bn', 'bnpparibas', 'bo', 'boo', 'boutique', 'br', 'brussels', 'bs', 'bt', 'budapest', 'build', 'builders', 'business', 'buzz', 'bv', 'bw', 'by', 'bz', 'bzh', 'ca', 'cab', 'cal', 'camera', 'camp', 'cancerresearch', 'canon', 'capetown', 'capital', 'caravan', 'cards', 'care', 'career', 'careers', 'cartier', 'casa', 'cash', 'cat', 'catering', 'cc', 'cd', 'center', 'ceo', 'cern', 'cf', 'cg', 'ch', 'channel', 'chat', 'cheap', 'christmas', 'chrome', 'church', 'ci', 'citic', 'city', 'ck', 'cl', 'claims', 'cleaning', 'click', 'clinic', 'clothing', 'club', 'cm', 'cn', 'co', 'coach', 'codes', 'coffee', 'college', 'cologne', 'com', 'community', 'company', 'computer', 'condos', 'construction', 'consulting', 'contractors', 'cooking', 'cool', 'coop', 'country', 'cr', 'credit', 'creditcard', 'cricket', 'crs', 'cruises', 'cu', 'cuisinella', 'cv', 'cw', 'cx', 'cy', 'cymru', 'cz', 'dabur', 'dad', 'dance', 'dating', 'day', 'dclk', 'de', 'deals', 'degree', 'delivery', 'democrat', 'dental', 'dentist', 'desi', 'design', 'dev', 'diamonds', 'diet', 'digital', 'direct', 'directory', 'discount', 'dj', 'dk', 'dm', 'dnp', 'do', 'docs', 'domains', 'doosan', 'durban', 'dvag', 'dz', 'eat', 'ec', 'edu', 'education', 'ee', 'eg', 'email', 'emerck', 'energy', 'engineer', 'engineering', 'enterprises', 'equipment', 'er', 'es', 'esq', 'estate', 'et', 'eu', 'eurovision', 'eus', 'events', 'everbank', 'exchange', 'expert', 'exposed', 'fail', 'farm', 'fashion', 'feedback', 'fi', 'finance', 'financial', 'firmdale', 'fish', 'fishing', 'fit', 'fitness', 'fj', 'fk', 'flights', 'florist', 'flowers', 'flsmidth', 'fly', 'fm', 'fo', 'foo', 'forsale', 'foundation', 'fr', 'frl', 'frogans', 'fund', 'furniture', 'futbol', 'ga', 'gal', 'gallery', 'garden', 'gb', 'gbiz', 'gd', 'ge', 'gent', 'gf', 'gg', 'ggee', 'gh', 'gi', 'gift', 'gifts', 'gives', 'gl', 'glass', 'gle', 'global', 'globo', 'gm', 'gmail', 'gmo', 'gmx', 'gn', 'goog', 'google', 'gop', 'gov', 'gp', 'gq', 'gr', 'graphics', 'gratis', 'green', 'gripe', 'gs', 'gt', 'gu', 'guide', 'guitars', 'guru', 'gw', 'gy', 'hamburg', 'hangout', 'haus', 'healthcare', 'help', 'here', 'hermes', 'hiphop', 'hiv', 'hk', 'hm', 'hn', 'holdings', 'holiday', 'homes', 'horse', 'host', 'hosting', 'house', 'how', 'hr', 'ht', 'hu', 'ibm', 'id', 'ie', 'ifm', 'il', 'im', 'immo', 'immobilien', 'in', 'industries', 'info', 'ing', 'ink', 'institute', 'insure', 'int', 'international', 'investments', 'io', 'iq', 'ir', 'irish', 'is', 'it', 'iwc', 'jcb', 'je', 'jetzt', 'jm', 'jo', 'jobs', 'joburg', 'jp', 'juegos', 'kaufen', 'kddi', 'ke', 'kg', 'kh', 'ki', 'kim', 'kitchen', 'kiwi', 'km', 'kn', 'koeln', 'kp', 'kr', 'krd', 'kred', 'kw', 'ky', 'kyoto', 'kz', 'la', 'lacaixa', 'land', 'lat', 'latrobe', 'lawyer', 'lb', 'lc', 'lds', 'lease', 'legal', 'lgbt', 'li', 'lidl', 'life', 'lighting', 'limited', 'limo', 'link', 'lk', 'loans', 'london', 'lotte', 'lotto', 'lr', 'ls', 'lt', 'ltda', 'lu', 'luxe', 'luxury', 'lv', 'ly', 'ma', 'madrid', 'maison', 'management', 'mango', 'market', 'marketing', 'marriott', 'mc', 'md', 'me', 'media', 'meet', 'melbourne', 'meme', 'memorial', 'menu', 'mg', 'mh', 'miami', 'mil', 'mini', 'mk', 'ml', 'mm', 'mn', 'mo', 'mobi', 'moda', 'moe', 'monash', 'money', 'mormon', 'mortgage', 'moscow', 'motorcycles', 'mov', 'mp', 'mq', 'mr', 'ms', 'mt', 'mu', 'museum', 'mv', 'mw', 'mx', 'my', 'mz', 'na', 'nagoya', 'name', 'navy', 'nc', 'ne', 'net', 'network', 'neustar', 'new', 'nexus', 'nf', 'ng', 'ngo', 'nhk', 'ni', 'nico', 'ninja', 'nl', 'no', 'np', 'nr', 'nra', 'nrw', 'ntt', 'nu', 'nyc', 'nz', 'okinawa', 'om', 'one', 'ong', 'onl', 'ooo', 'org', 'organic', 'osaka', 'otsuka', 'ovh', 'pa', 'paris', 'partners', 'parts', 'party', 'pe', 'pf', 'pg', 'ph', 'pharmacy', 'photo', 'photography', 'photos', 'physio', 'pics', 'pictures', 'pink', 'pizza', 'pk', 'pl', 'place', 'plumbing', 'pm', 'pn', 'pohl', 'poker', 'porn', 'post', 'pr', 'praxi', 'press', 'pro', 'prod', 'productions', 'prof', 'properties', 'property', 'ps', 'pt', 'pub', 'pw', 'py', 'qa', 'qpon', 'quebec', 're', 'realtor', 'recipes', 'red', 'rehab', 'reise', 'reisen', 'reit', 'ren', 'rentals', 'repair', 'report', 'republican', 'rest', 'restaurant', 'reviews', 'rich', 'rio', 'rip', 'ro', 'rocks', 'rodeo', 'rs', 'rsvp', 'ru', 'ruhr', 'rw', 'ryukyu', 'sa', 'saarland', 'sale', 'samsung', 'sarl', 'saxo', 'sb', 'sc', 'sca', 'scb', 'schmidt', 'schule', 'schwarz', 'science', 'scot', 'sd', 'se', 'services', 'sew', 'sexy', 'sg', 'sh', 'shiksha', 'shoes', 'shriram', 'si', 'singles', 'sj', 'sk', 'sky', 'sl', 'sm', 'sn', 'so', 'social', 'software', 'sohu', 'solar', 'solutions', 'soy', 'space', 'spiegel', 'sr', 'st', 'style', 'su', 'supplies', 'supply', 'support', 'surf', 'surgery', 'suzuki', 'sv', 'sx', 'sy', 'sydney', 'systems', 'sz', 'taipei', 'tatar', 'tattoo', 'tax', 'tc', 'td', 'technology', 'tel', 'temasek', 'tennis', 'tf', 'tg', 'th', 'tienda', 'tips', 'tires', 'tirol', 'tj', 'tk', 'tl', 'tm', 'tn', 'to', 'today', 'tokyo', 'tools', 'top', 'toshiba', 'town', 'toys', 'tp', 'tr', 'trade', 'training', 'travel', 'trust', 'tt', 'tui', 'tv', 'tw', 'tz', 'ua', 'ug', 'uk', 'university', 'uno', 'uol', 'us', 'uy', 'uz', 'va', 'vacations', 'vc', 've', 'vegas', 'ventures', 'versicherung', 'vet', 'vg', 'vi', 'viajes', 'video', 'villas', 'vision', 'vlaanderen', 'vn', 'vodka', 'vote', 'voting', 'voto', 'voyage', 'vu', 'wales', 'wang', 'watch', 'webcam', 'website', 'wed', 'wedding', 'wf', 'whoswho', 'wien', 'wiki', 'williamhill', 'wme', 'work', 'works', 'world', 'ws', 'wtc', 'wtf', '佛山', '集团', '在线', '한국', 'ভারত', '八卦', 'موقع', '公益', '公司', '移动', '我爱你', 'москва', 'қаз', 'онлайн', 'сайт', 'срб', '淡马锡', 'орг', '삼성', 'சிங்கப்பூர்', '商标', '商店', '商城', 'дети', 'мкд', '中文网', '中信', '中国', '中國', '谷歌', 'భారత్', 'ලංකා', 'ભારત', 'भारत', '网店', 'संगठन', '网络', 'укр', '香港', '台湾', '台灣', '手机', 'мон', 'الجزائر', 'عمان', 'ایران', 'امارات', 'بازار', 'الاردن', 'بھارت', 'المغرب', 'السعودية', 'مليسيا', 'شبكة', 'გე', '机构', '组织机构', 'ไทย', 'سورية', 'рус', 'рф', 'تونس', 'みんな', 'グーグル', '世界', 'ਭਾਰਤ', '网址', '游戏', 'vermögensberater', 'vermögensberatung', '企业', 'مصر', 'قطر', '广东', 'இலங்கை', 'இந்தியா', '新加坡', 'فلسطين', '政务', 'xxx', 'xyz', 'yachts', 'yandex', 'ye', 'yoga', 'yokohama', 'youtube', 'yt', 'za', 'zip', 'zm', 'zone', 'zuerich', 'zw'];\n\nexport default TLD;\n","/*\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 <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nexport default function checkBrackets(url: string) {\n var urlLength = url.length;\n var urlOpenBrackets = url.split('(').length - 1;\n var urlCloseBrackets = url.split(')').length - 1;\n while(urlCloseBrackets > urlOpenBrackets &&\n url.charAt(urlLength - 1) === ')') {\n url = url.substr(0, urlLength - 1)\n urlCloseBrackets--;\n urlLength--;\n }\n if(urlOpenBrackets > urlCloseBrackets) {\n url = url.replace(/\\)+$/, '');\n }\n return url;\n}\n","import Emoji from '../../config/emoji';\nimport {encodeEmoji} from '../../vendor/emoji';\n\nexport default function getEmojiUnified(emojiCode: string) {\n const unified = encodeEmoji(emojiCode).replace(/-?fe0f/g, '');\n\n /* if(unified === '1f441-200d-1f5e8') {\n //unified = '1f441-fe0f-200d-1f5e8-fe0f';\n unified = '1f441-fe0f-200d-1f5e8';\n } */\n\n if(!Emoji.hasOwnProperty(unified)\n // && !emojiData.hasOwnProperty(unified.replace(/-?fe0f$/, ''))\n ) {\n // console.error('lol', unified);\n return;\n }\n\n return unified;\n}\n","/*\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 <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {EMAIL_REG_EXP, FULL_REG_EXP} from '.';\nimport TLD from '../../config/tld';\nimport {MessageEntity} from '../../layer';\nimport checkBrackets from './checkBrackets';\nimport getEmojiUnified from './getEmojiUnified';\n\nexport default function parseEntities(text: string) {\n let match: RegExpMatchArray;\n let raw = text;\n const entities: MessageEntity[] = [];\n let matchIndex;\n let rawOffset = 0;\n // var start = tsNow()\n FULL_REG_EXP.lastIndex = 0;\n while(match = raw.match(FULL_REG_EXP)) {\n matchIndex = rawOffset + match.index;\n\n // console.log('parseEntities match:', match);\n\n if(match[3]) { // mentions\n entities.push({\n _: 'messageEntityMention',\n offset: matchIndex + match[1].length,\n length: match[2].length + match[3].length\n });\n } else if(match[4]) {\n if(EMAIL_REG_EXP.test(match[4])) { // email\n entities.push({\n _: 'messageEntityEmail',\n offset: matchIndex,\n length: match[4].length\n });\n } else {\n let url: string;\n let protocol = match[5];\n const tld = match[6];\n // let excluded = '';\n if(tld) { // URL\n if(!protocol && (tld.substr(0, 4) === 'xn--' || TLD.indexOf(tld.toLowerCase()) !== -1)) {\n protocol = 'http://';\n }\n\n if(protocol) {\n const balanced = checkBrackets(match[4]);\n if(balanced.length !== match[4].length) {\n // excluded = match[4].substring(balanced.length);\n match[4] = balanced;\n }\n\n url = (match[5] ? '' : protocol) + match[4];\n }\n } else { // IP address\n url = (match[5] ? '' : 'http://') + match[4];\n }\n\n if(url) {\n entities.push({\n _: 'messageEntityUrl',\n offset: matchIndex,\n length: match[4].length\n });\n }\n }\n } else if(match[7]) { // New line\n entities.push({\n _: 'messageEntityLinebreak',\n offset: matchIndex,\n length: 1\n });\n } else if(match[8]) { // Emoji\n const unified = getEmojiUnified(match[8]);\n if(unified) {\n entities.push({\n _: 'messageEntityEmoji',\n offset: matchIndex,\n length: match[8].length,\n unicode: unified\n });\n }\n } else if(match[11]) { // Hashtag\n entities.push({\n _: 'messageEntityHashtag',\n offset: matchIndex + (match[10] ? match[10].length : 0),\n length: match[11].length\n });\n } else if(match[13]) { // Bot command\n entities.push({\n _: 'messageEntityBotCommand',\n offset: matchIndex + (match[11] ? match[11].length : 0) + (match[12] ? match[12].length : 0),\n length: 1 + match[13].length + (match[14] ? 1 + match[14].length : 0),\n unsafe: true\n });\n } else if(match[16]) { // Media timestamp\n const timestamp = match[16];\n const splitted: string[] = timestamp.split(':');\n const splittedLength = splitted.length;\n const hours = splittedLength === 3 ? +splitted[0] : 0;\n const minutes = +splitted[splittedLength === 3 ? 1 : 0];\n const seconds = +splitted[splittedLength - 1];\n entities.push({\n _: 'messageEntityTimestamp',\n offset: matchIndex + (/\\D/.test(match[0][0]) ? 1 : 0),\n length: timestamp.length,\n raw: timestamp,\n time: hours * 3600 + minutes * 60 + seconds\n });\n }\n\n raw = raw.substr(match.index + match[0].length);\n rawOffset += match.index + match[0].length;\n }\n\n // if (entities.length) {\n // console.log('parse entities', text, entities.slice())\n // }\n return entities;\n}\n","/*\n * 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 <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {MARKDOWN_ENTITIES, MARKDOWN_REG_EXP} from '.';\nimport {MessageEntity} from '../../layer';\nimport combineSameEntities from './combineSameEntities';\nimport findConflictingEntity from './findConflictingEntity';\nimport mergeEntities from './mergeEntities';\n\nexport default function parseMarkdown(raw: string, currentEntities: MessageEntity[], noTrim?: boolean): string {\n /* if(!markdownTestRegExp.test(text)) {\n return noTrim ? text : text.trim();\n } */\n\n const entities: MessageEntity[] = [];\n let pushedEntity = false;\n const pushEntity = (entity: MessageEntity) => !findConflictingEntity(currentEntities, entity) ? (entities.push(entity), pushedEntity = true) : pushedEntity = false;\n\n const newTextParts: string[] = [];\n let rawOffset = 0, match;\n while(match = raw.match(MARKDOWN_REG_EXP)) {\n const matchIndex = rawOffset + match.index;\n newTextParts.push(raw.substr(0, match.index));\n const text = (match[3] || match[8] || match[11] || match[13]);\n rawOffset -= text.length;\n // text = text.replace(/^\\s+|\\s+$/g, '');\n rawOffset += text.length;\n\n let entity: MessageEntity;\n pushedEntity = false;\n if(text.match(/^`*$/)) {\n newTextParts.push(match[0]);\n } else if(match[3]) { // pre\n entity = {\n _: 'messageEntityPre',\n language: '',\n offset: matchIndex + match[1].length,\n length: text.length\n };\n\n if(pushEntity(entity)) {\n if(match[5] === '\\n') {\n match[5] = '';\n rawOffset -= 1;\n }\n\n newTextParts.push(match[1] + text + match[5]);\n\n rawOffset -= match[2].length + match[4].length;\n }\n } else if(match[7]) { // code|italic|bold\n const isSOH = match[6] === '\\x01';\n\n entity = {\n _: MARKDOWN_ENTITIES[match[7]] as (MessageEntity.messageEntityBold | MessageEntity.messageEntityCode | MessageEntity.messageEntityItalic | MessageEntity.messageEntitySpoiler)['_'],\n // offset: matchIndex + match[6].length,\n offset: matchIndex + (isSOH ? 0 : match[6].length),\n length: text.length\n };\n\n if(pushEntity(entity)) {\n if(!isSOH) {\n newTextParts.push(match[6] + text + match[9]);\n } else {\n newTextParts.push(text);\n }\n\n rawOffset -= match[7].length * 2 + (isSOH ? 2 : 0);\n }\n } else if(match[11]) { // custom mention\n entity = {\n _: 'messageEntityMentionName',\n user_id: match[10].toUserId(),\n offset: matchIndex,\n length: text.length\n };\n\n if(pushEntity(entity)) {\n newTextParts.push(text);\n\n rawOffset -= match[0].length - text.length;\n }\n } else if(match[12]) { // text url\n entity = {\n _: 'messageEntityTextUrl',\n url: match[14],\n offset: matchIndex,\n length: text.length\n };\n\n if(pushEntity(entity)) {\n newTextParts.push(text);\n\n rawOffset -= match[12].length - text.length;\n }\n }\n\n if(!pushedEntity) {\n newTextParts.push(match[0]);\n }\n\n raw = raw.substr(match.index + match[0].length);\n rawOffset += match.index + match[0].length;\n }\n\n newTextParts.push(raw);\n let newText = newTextParts.join('');\n if(!newText.replace(/\\s+/g, '').length) {\n newText = raw;\n entities.splice(0, entities.length);\n }\n\n // ! idk what it was here for\n // if(!entities.length && !noTrim) {\n // newText = newText.trim();\n // }\n\n mergeEntities(currentEntities, entities);\n combineSameEntities(currentEntities);\n\n let length = newText.length;\n if(!noTrim) {\n // trim left\n newText = newText.replace(/^\\s*/, '');\n\n let diff = length - newText.length;\n if(diff) {\n currentEntities.forEach((entity) => {\n entity.offset = Math.max(0, entity.offset - diff);\n });\n }\n\n // trim right\n newText = newText.replace(/\\s*$/, '');\n diff = length - newText.length;\n length = newText.length;\n if(diff) {\n currentEntities.forEach((entity) => {\n if((entity.offset + entity.length) > length) {\n entity.length = length - entity.offset;\n }\n });\n }\n }\n\n return newText;\n}\n","import {MessageEntity} from '../../layer';\n\nexport default function sortEntities(entities: MessageEntity[]) {\n entities.sort((a, b) => {\n return (a.offset - b.offset) || (b.length - a.length);\n });\n}\n","/*\n * 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 encodeSpoiler from './encodeSpoiler';\n\n/**\n * ! This function is still unsafe to use with .innerHTML\n */\nexport default function wrapPlainText(text: string, entities: MessageEntity[] = []) {\n entities.forEach((entity) => {\n if(entity._ === 'messageEntitySpoiler') {\n text = encodeSpoiler(text, entity).text;\n }\n });\n\n return text;\n // if(entities?.length) {\n // entities = entities.filter((entity) => entity._ === 'messageEntitySpoiler');\n // }\n\n // return wrapRichText(text, {\n // entities,\n // noEncoding: true,\n // noTextFormat: true,\n // noLinebreaks: true,\n // noLinks: true\n // }).textContent;\n}\n","/*\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 <igor.beatle@gmail.com>\n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {processSearchText, ProcessSearchTextOptions} from '../helpers/cleanSearchText';\nimport flatten from '../helpers/array/flatten';\n\nexport default class SearchIndex<SearchWhat> {\n private fullTexts: Map<SearchWhat, string> = new Map();\n\n // minChars can be 0 because it requires at least one word (one symbol) to be found\n constructor(private options?: ProcessSearchTextOptions, private minChars = 0) {\n }\n\n public indexObject(id: SearchWhat, searchText: string) {\n /* if(searchIndex.fullTexts.hasOwnProperty(id)) {\n return false;\n } */\n\n if(this.options && searchText.trim()) {\n searchText = processSearchText(searchText, this.options);\n }\n\n if(!searchText) {\n this.fullTexts.delete(id);\n return false;\n }\n\n this.fullTexts.set(id, searchText);\n\n /* const shortIndexes = searchIndex.shortIndexes;\n searchText.split(' ').forEach((searchWord) => {\n let len = Math.min(searchWord.length, 3),\n wordPart, i;\n for(i = 1; i <= len; i++) {\n wordPart = searchWord.substr(0, i);\n if(shortIndexes[wordPart] === undefined) {\n shortIndexes[wordPart] = [id];\n } else {\n shortIndexes[wordPart].push(id);\n }\n }\n }); */\n }\n\n private _search(query: string) {\n const newFoundObjs: Array<{fullText: string, fullTextLength: number, what: SearchWhat, foundChars: number}> = [];\n const fullTexts = this.fullTexts;\n const queryWords = query.split(' ');\n const queryWordsLength = queryWords.length;\n fullTexts.forEach((fullText, what) => {\n let found = true;\n let foundChars = 0;\n for(let i = 0; i < queryWordsLength; ++i) { // * verify that all words are found\n const word = queryWords[i];\n const idx = fullText.indexOf(word);\n if(idx === -1 || (idx !== 0 && fullText[idx - 1] !== ' '/* && !badCharsRe.test(fullText[idx - 1]) */)) { // * search only from word beginning\n found = false;\n break;\n }\n\n foundChars += word.length;\n }\n\n if(found) {\n foundChars += queryWordsLength - 1;\n const fullTextLength = fullText.length;\n if(this.minChars <= foundChars || fullTextLength <= foundChars) {\n newFoundObjs.push({fullText, fullTextLength, what, foundChars});\n }\n }\n });\n\n return newFoundObjs;\n }\n\n public search(query: string) {\n if(this.options) {\n query = processSearchText(query, this.options);\n }\n\n const queries = query.split('\\x01');\n const newFoundObjs = flatten(queries.map((query) => this._search(query)));\n\n newFoundObjs.sort((a, b) => a.fullTextLength - b.fullTextLength || b.foundChars - a.foundChars);\n\n // newFoundObjs.sort((a, b) => a.fullText.localeCompare(b.fullText));\n const newFoundObjs2: Set<SearchWhat> = new Set(newFoundObjs.map((o) => o.what));\n\n return newFoundObjs2;\n }\n}\n"],"names":["IGNORE_ERRORS","Set","LazyLoadQueueBase","constructor","parallelLimit","queueId","queue","inProcess","lockPromise","unlockResolve","log","this","processQueue","_processQueue","clear","length","lock","Promise","resolve","reject","unlock","processItem","item","add","loadItem","err","has","type","error","delete","load","getItem","shift","addElement","method","el","size","push","unshift","filterUnique","arr","flatten","reduce","acc","val","forEachReverse","array","callback","i","insertInDescendSortedArray","element","getProperty","pos","property","sortProperty","undefined","indexOf","prev","next","splice","len","console","assumeType","x","readBlobAs","blob","reader","FileReader","addEventListener","e","target","result","bytesCmp","bytes1","bytes2","bytesFromHex","hexString","bytes","Uint8Array","Math","ceil","start","parseInt","charAt","substr","convertToUint8Array","TextEncoder","encode","callbackify","smth","then","uploadId","getFileNameForUpload","file","fileName","mimeType","ext","split","MIDDLEWARE_ERROR","MiddlewareHelper","details","cleaned","inner","onCleanCallbacks","onDestroyCallbacks","onDestroy","destroyed","clean","forEach","helper","destroy","parent","get","additionalCallback","middleware","create","getMiddleware","onClean","defineNotNumerableProperties","obj","names","props","writable","configurable","out","name","hasOwnProperty","Object","defineProperties","getDeepProperty","object","key","splitted","o","getObjectKeysAndSort","sort","ids","Map","keys","map","a","b","debounce","fn","ms","shouldRunFirst","shouldRunLast","waitingTimeout","waitingPromise","hadNewCall","invoke","args","_resolve","_reject","apply","clearTimeout","_waitingTimeout","catch","isDebounced","SliceEnd","compareValue","val1","val2","toExponential","diff","str1","str2","str1Length","slice","compareLong","SlicedArray","sliceConstructor","getSliceConstructor","first","constructSlice","slices","static","slicedArray","Array","end","None","isEnd","side","Top","last","includes","Bottom","Both","setEnd","getEnds","top","bottom","both","unsetEnd","deleteCount","items","ret","super","idx","insertSlice","lowerBound","upperBound","foundSlice","lowerIndex","upperIndex","foundSliceIndex","sliced","insertIndex","s","prevSlice","nextSlice","findSlice","index","findSliceOffset","maxId","offset","sliceMe","offsetId","add_offset","limit","sliceOffset","sliceStart","max","sliceEnd","topWasMeantToLoad","bottomWasMeantToLoad","abs","topFulfilled","bottomFulfilled","offsetIdOffset","fulfilled","found","deleteSlice","indexOfAndSplice","toJSON","serialized","values","JSON","stringify","json","parsed","parse","inserted","getAttachMenuBotIcon","attachMenuBot","icons","find","icon","getParticipantPeerId","participant","peer","user_id","toPeerId","hasRights","chat","action","rights","isThread","pFlags","deactivated","isCheckingRightsForSelf","creator","_","left","megagroup","admin_rights","banned_rights","default_banned_rights","myFlags","isAdmin","post_messages","broadcast","getDialogIndex","dialog","indexKey","folder_id","getDialogIndexKey","localId","getDocumentDownloadOptions","doc","thumb","onlyCache","inputFileLocation","sticker","mime_type","startsWith","dcId","dc_id","location","file_name","getDocumentInputFileLocation","thumbSize","id","access_hash","file_reference","thumb_size","getDownloadFileNameFromOptions","options","getDownloadMediaDetails","media","downloadOptions","webDocument","getPhotoDownloadOptions","isWebDocument","url","downloadId","draftsAreEqual","draft1","draft2","reply_to_msg_id","entities","message","no_webpage","generateQId","queryId","resultId","generateMessageId","messageId","q","filterMessagesByInputFilter","inputFilter","history","foundMsgs","filtering","neededContents","neededDocTypes","excludeDocTypes","document","goodEntities","totalEntities","getAlbumText","messages","foundMessages","m","getMessageThreadId","isForum","threadId","replyTo","reply_to","forum_topic","mid","reply_to_top_id","getPeerActiveUsernames","usernames","filter","username","active","getPeerPhoto","photo","isPeerRestricted","restrictionReasons","restriction_reason","restricted","photoSize","isDocument","Error","isPhoto","reactionsEqual","r1","r2","getStickerEffectThumb","video_thumbs","canSendToUser","user","deleted","ConnectionStatus","CAN_COMBINE_ENTITIES","combineSameEntities","entity","nextEntityIdx","findIndex","_i","nextEntity","encodeSpoiler","text","before","spoilerAfter","chars","charsLength","char","charCodeAt","join","spoiler","after","entityText","SINGLE_ENTITIES","findConflictingEntity","currentEntities","newEntity","singleEnd","currentEntity","fixEmoji","replace","match","string","matchUrl","mergeEntities","newEntities","filtered","checkBrackets","urlLength","urlOpenBrackets","urlCloseBrackets","getEmojiUnified","emojiCode","unified","parseEntities","raw","matchIndex","rawOffset","E","protocol","tld","toLowerCase","balanced","unicode","unsafe","timestamp","splittedLength","hours","minutes","seconds","test","time","parseMarkdown","noTrim","pushedEntity","pushEntity","newTextParts","language","isSOH","toUserId","newText","sortEntities","wrapPlainText","SearchIndex","minChars","fullTexts","indexObject","searchText","trim","set","_search","query","newFoundObjs","queryWords","queryWordsLength","fullText","what","foundChars","word","fullTextLength","search","queries"],"sourceRoot":""}