0a61727f1b
* Check isComposing for send shortcut
1 line
250 KiB
Plaintext
1 line
250 KiB
Plaintext
{"version":3,"sources":["webpack:///./src/components/button.ts","webpack:///./src/lib/appManagers/appStateManager.ts","webpack:///./src/components/misc.ts","webpack:///./src/components/inputField.ts","webpack:///./src/components/ripple.ts","webpack:///./src/lib/lottieLoader.ts","webpack:///./src/helpers/date.ts","webpack:///./src/pages/pagesManager.ts","webpack:///./src/pages/page.ts","webpack:///./src/components/appNavigationController.ts","webpack:///./src/hooks/useHeavyAnimationCheck.ts","webpack:///./src/components/animationIntersector.ts","webpack:///./src/helpers/fastSmoothScroll.ts","webpack:///./src/helpers/random.ts","webpack:///./src/pages/pageIm.ts","webpack:///./src/helpers/number.ts","webpack:///./src/helpers/sequentialDom.ts","webpack:///./src/countries.ts","webpack:///./src/lib/mtproto/serverTimeManager.ts","webpack:///./src/lib/mtproto/passwordManager.ts","webpack:///./src/pages/loginPage.ts","webpack:///./src/components/transition.ts","webpack:///./src/components/passwordInputField.ts","webpack:///./src/lib/filemanager.ts","webpack:///./src/lib/cacheStorage.ts","webpack:///./src/components/horizontalMenu.ts","webpack:///./src/helpers/dom/findUpAsChild.ts","webpack:///./src/components/monkeys/password.ts","webpack:///./src/helpers/animation.ts","webpack:///./src/pages/pagePassword.ts","webpack:///./src/lib/rlottie/rlottie.worker.ts"],"names":["className","options","button","document","createElement","asDiv","icon","noRipple","rippleSquare","classList","add","onlyMobile","disabled","setAttribute","text","append","STATE_VERSION","version","STATE_INIT","allDialogsLoaded","pinnedOrders","contactsList","updates","filters","maxSeenMsgId","stateCreatedTime","Date","now","recentEmoji","topPeers","recentSearch","authState","_","hiddenPinnedMessages","settings","messagesTextSize","sendShortcut","animationsEnabled","autoDownload","contacts","private","groups","channels","autoPlay","gifs","videos","stickers","suggest","loop","themes","name","background","type","blur","slug","highlightningColor","color","theme","notifications","sound","keepSigned","ALL_KEYS","Object","keys","REFRESH_KEYS","AppStateManager","super","log","neededPeers","Map","singlePeerMap","storages","users","storeName","chats","dialogs","storagesResults","this","loadSavedState","loaded","console","time","Promise","resolve","storagesKeys","storagesPromises","map","key","getAll","promises","concat","get","all","then","arr","state","i","length","value","undefined","pushToState","splice","auth","shift","broadcast","id","forEach","s","hasOwnProperty","nightTheme","find","t","missingKey","timeEnd","catch","first","split","direct","set","peerId","limit","has","Set","dispatchEvent","keepPeerSingle","existsPeerId","delete","size","appStateManager","putPreloader","elem","returnDiv","html","div","innerHTML","appendChild","insertAdjacentHTML","lastElementChild","setButtonLoader","remove","removeAttribute","sortedCountries","formatPhoneNumber","str","phoneCode","replace","slice","sort","a","b","country","c","indexOf","pattern","symbol","idx","formatted","onMouseMove","e","rect","openedMenu","getBoundingClientRect","clientX","clientY","diffX","right","left","diffY","bottom","top","closeBtnMenu","onClick","parentElement","menuOverlay","openedMenuOnClose","window","removeEventListener","removeByType","addEventListener","openBtnMenu","menuElement","onClose","pushItem","onPop","canAnimate","insertBefore","once","positionMenu","pageX","pageY","side","scrollWidth","menuWidth","scrollHeight","menuHeight","body","windowWidth","width","windowHeight","height","isMobile","verticalSide","sides","x","intermediateX","y","intermediateY","possibleSides","style","attachContextMenuListener","element","callback","listenerSetter","bind","removeManual","timeout","capture","onCancel","clearTimeout","touches","setTimeout","init","target","hasAttribute","preventDefault","originalEvent","clipboardData","getData","entities","parseEntities","filter","wrapRichText","noLinks","wrappingDraft","execCommand","checkAndSetRTL","input","char","HTMLInputElement","innerText","direction","InputState","container","maxLength","showLengthOn","Math","round","placeholder","plainText","processInput","label","labelText","firstElementChild","observer","MutationObserver","inputFake","onFakeInput","observe","characterData","childList","subtree","animate","wasInputFakeClientHeight","showScrollDebounced","border","setLabel","labelEl","showingLength","wasError","contains","inputLength","diff","isError","toggle","select","textContent","labelOptions","clientHeight","setValueSilently","event","Event","bubbles","cancelable","fireFakeInput","originalValue","silent","wrapDraftText","Error","Valid","setState","rippleClickId","ripple","onEnd","prepend","querySelector","r","handler","drawRipple","startTime","clickId","duration","getComputedStyle","getPropertyValue","elapsedTime","cb","mutate","delay","max","touchStartFired","requestAnimationFrame","clickX","clickY","sqrt","abs","isRippleUnneeded","includes","tagName","touchEnd","cancelBubble","stopPropagation","passive","dataset","convert","min","RLottiePlayer","el","worker","reqId","paused","speed","autoplay","group","frames","cachingDelta","skipRatio","_loop","_autoplay","skipDelta","pixelRatio","devicePixelRatio","needUpscale","noCache","Infinity","canvas","context","getContext","clamped","Uint8ClampedArray","imageData","ImageData","methodName","args","sendQuery","jsonString","setMainLoop","clearPendingRAF","rafId","renderFirstFrame","pause","curFrame","frameCount","requestFrame","stop","play","lottieLoader","onDestroy","frame","frameNo","data","putImageData","err","error","frInterval","delta","frThen","renderFrame2","renderFrame","fps","method","mainLoopForwards","mainLoopBackwards","currentMethod","frameListener","listenerResults","QueryableWorker","defaultListener","onError","onerror","onmessage","queryMethodListener","queryMethodArguments","call","message","postMessage","terminate","queryMethod","transfer","arg","ArrayBuffer","push","buffer","LottieLoader","isWebAssemblySupported","loadPromise","reject","workersLimit","players","workers","curWorkerNum","onPlayerLoaded","rlPlayer","debug","onLoad","warn","onFrame","onPlayerError","getAnimations","animation","checkAnimation","player","remain","object","toneIndex","replacements","COLORREPLACEMENTS","checkSmth","smth","ty","k","foundReplacement","p","applyTo","iterateIt","it","layer","layers","shapes","shape","params","url","loadLottieWorkers","fetch","res","arrayBuffer","gzipUncompress","loadAnimationWorker","assign","animationData","race","newAnimationData","JSON","parse","applyReplacements","stringify","parseInt","initPlayer","addAnimation","loadFromData","months","days","ONE_DAY","getWeekNumber","date","d","UTC","getFullYear","getMonth","getDate","dayNum","getUTCDay","setUTCDate","getUTCDate","yearStart","getUTCFullYear","ceil","getTime","formatDateAccordingToToday","timestamp","timeStr","getHours","getMinutes","getDay","formatDateAccordingToTodayNew","today","hour","minute","year","day","month","weekday","IntlDateElement","getFullDate","joiner","monthAsNumber","noSeconds","getSeconds","leadingZero","noTime","tsNow","seconds","floor","yearPattern","RegExp","monthYearOrDayPattern","yearOrDayAndMonthPattern","shortDate","longDate","numberOfDaysEachMonth","fillTipDates","query","dates","q","trim","toLowerCase","setFullYear","setHours","minDate","maxDate","title","dayOfWeek","setDate","formatWeekLong","getDayOfWeek","distance","setTime","matches","exec","g1","g2","createForDayMonth","createForMonthYear","selectedYear","currentYear","g3","validDateForMonth","formatterYearMax","k1","setMonth","formatterMonthYear","formatterDayMonth","pagesManager","pageId","pagesDiv","getElementById","scrollableDiv","selectTab","horizontalMenu","page","onShown","isAuthPage","display","pageEl","fastSmoothScroll","onFirstMount","onMount","installed","setPage","appNavigationController","navigations","manual","currentHash","location","hash","isPossibleSwipe","onHashChange","replaceState","pushState","item","pop","handleItem","onEscape","back","detach","onTouchEnd","onTouchMove","moved","history","scrollRestoration","good","index","ret","findItemByType","noHistory","origin","pathname","findAndSplice","single","isAnimating","heavyAnimationPromise","promisesInQueue","dispatchHeavyAnimationEvent","promise","finally","Boolean","perf","performance","getHeavyAnimationPromise","handleAnimationStart","handleAnimationEnd","animationIntersector","visible","byGroups","lockedGroups","onlyOnePlayableGroup","intersectionLockedGroups","videosLocked","IntersectionObserver","entries","idle","isIDLE","entry","isIntersecting","clearCache","on","doc","checkAnimations","found","HTMLVideoElement","src","load","unobserve","blurred","destroy","removeAnimation","animations","refreshGroup","FocusDirection","position","margin","maxDistance","forceDirection","forceDuration","axis","Static","scrollWithJs","elementRect","containerRect","offsetTop","scrollTop","Up","Down","rectStartKey","rectEndKey","sizeKey","scrollSizeKey","scrollPositionKey","elementPosition","elementSize","containerSize","scrollPosition","scrollSize","path","remainingPath","startAt","tick","currentPath","transition","nextRandomInt","maxValue","random","randomLong","m","default","requestedServerLanguage","getCacheLangPack","langPack","local","getLangPack","lang_code","numberThousandSplitter","parts","toString","join","formatBytes","bytes","decimals","dm","parseFloat","pow","toFixed","formatNumber","clamp","v","sequentialDom","raf","scheduled","kind","scheduleFlush","do","read","write","Countries","PhoneCodesMain","serverTimeManager","timestampNow","midnightNoOffset","midnightOffseted","midnightOffset","serverTimeOffset","timeParams","to","passwordManager","invokeApi","result","getState","currentHashPromise","newHashPromise","password","new_settings","hint","email","currentPassword","computeSRP","newAlgo","new_algo","salt1","Uint8Array","randomize","newPassword","hashes","new_password_hash","inputCheckPassword","saveApiUser","user","setUserAuth","code","LoginPage","imageDiv","titleLangKey","subtitle","subtitleLangKey","withInputWrapper","inputWrapper","slideNavigation","tabContent","prevTabContent","toRight","elements","reverse","transform","offsetWidth","slideTabs","TransitionSlider","content","transitionTime","onTransitionEnd","isHeavy","animationFunction","Transition","onTransitionEndCallbacks","animationDeferred","animationStarted","from","self","HTMLElement","prevId","_from","children","onTransitionEndCallback","PasswordInputField","passwordVisible","onVisibilityClick","toggleVisible","onVisibilityClickAdditional","autocomplete","stealthy","tabIndex","cloneNode","nextSibling","blobSupported","fileWriter","Blob","fileReader","FileReader","onload","readAsArrayBuffer","mimeType","saveFileCallback","blobParts","part","truncate","finalize","saveToStorage","blob","dbName","useStorage","test","openDatabase","STORAGES","openDbPromise","caches","open","entryName","timeoutOperation","cache","response","put","fileName","save","Response","match","rejected","fakeWriter","getFakeFileWriter","saveFile","enabled","storage","deleteAll","tabs","scrollableX","proxy","Proxy","apply","that","selectTarget","canChange","scrollIntoViewNew","rootScope","prev","useStripe","indicator","currentIndicator","shiftLeft","offsetLeft","scaleFactor","clientWidth","parent","findUpAsChild","tab","PasswordMonkey","passwordInputField","needFrame","loadAnimationFromURL","_animation","currentFrame","setSpeed","setDirection","waitForFirstFrame","instances","cancelAnimationByKey","instance","getAnimationInstance","isCancelled","deferred","animateSingle","createAnimationInstance","passwordInput","btnNext","btnNextI18n","IntlElement","getStateInterval","setInterval","_state","wrapEmojiText","onSubmit","update","preloader","check","clearInterval","mount","monkey","focus","module","exports","Worker"],"mappings":"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","file":"10.bc4f486ad464de65a8da.chunk.js","sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { i18n, LangPackKey } from \"../lib/langPack\";\nimport { ripple } from \"./ripple\";\n\nconst Button = (className: string, options: Partial<{\n noRipple: true, \n onlyMobile: true, \n icon: string, \n rippleSquare: true, \n text: LangPackKey, \n disabled: boolean,\n asDiv: boolean\n}> = {}) => {\n const button: HTMLButtonElement = document.createElement(options.asDiv ? 'div' : 'button') as any;\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\n\n if(!options.noRipple) {\n if(options.rippleSquare) {\n button.classList.add('rp-square');\n }\n\n ripple(button);\n }\n\n if(options.onlyMobile) {\n button.classList.add('only-handhelds');\n }\n\n if(options.disabled) {\n button.setAttribute('disabled', 'true');\n }\n\n if(options.text) {\n button.append(i18n(options.text));\n }\n\n return button;\n};\n\nexport default Button;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type { Dialog } from './appMessagesManager';\nimport type { UserAuth } from '../mtproto/mtproto_config';\nimport type { User } from './appUsersManager';\nimport type { AuthState } from '../../types';\nimport type FiltersStorage from '../storages/filters';\nimport type DialogsStorage from '../storages/dialogs';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport rootScope from '../rootScope';\nimport sessionStorage from '../sessionStorage';\nimport { logger } from '../logger';\nimport { copy, setDeepProperty, validateInitObject } from '../../helpers/object';\nimport App from '../../config/app';\nimport DEBUG, { MOUNT_CLASS_TO } from '../../config/debug';\nimport AppStorage from '../storage';\nimport { Chat } from '../../layer';\n\nconst REFRESH_EVERY = 24 * 60 * 60 * 1000; // 1 day\nconst STATE_VERSION = App.version;\n\nexport type Background = {\n type: 'color' | 'image' | 'default',\n blur: boolean,\n highlightningColor?: string,\n color?: string,\n slug?: string,\n};\n\nexport type Theme = {\n name: 'day' | 'night' | 'system',\n background: Background\n};\n\nexport type State = {\n allDialogsLoaded: DialogsStorage['allDialogsLoaded'],\n pinnedOrders: DialogsStorage['pinnedOrders'],\n contactsList: number[],\n updates: Partial<{\n seq: number,\n pts: number,\n date: number\n }>,\n filters: FiltersStorage['filters'],\n maxSeenMsgId: number,\n stateCreatedTime: number,\n recentEmoji: string[],\n topPeers: number[],\n recentSearch: number[],\n version: typeof STATE_VERSION,\n authState: AuthState,\n hiddenPinnedMessages: {[peerId: string]: number},\n settings: {\n messagesTextSize: number,\n sendShortcut: 'enter' | 'ctrlEnter',\n animationsEnabled: boolean,\n autoDownload: {\n contacts: boolean\n private: boolean\n groups: boolean\n channels: boolean\n },\n autoPlay: {\n gifs: boolean,\n videos: boolean\n },\n stickers: {\n suggest: boolean,\n loop: boolean\n },\n background?: Background, // ! DEPRECATED\n themes: Theme[],\n theme: Theme['name'],\n notifications: {\n sound: boolean\n },\n nightTheme?: boolean, // ! DEPRECATED\n },\n keepSigned: boolean\n};\n\nexport const STATE_INIT: State = {\n allDialogsLoaded: {},\n pinnedOrders: {},\n contactsList: [],\n updates: {},\n filters: {},\n maxSeenMsgId: 0,\n stateCreatedTime: Date.now(),\n recentEmoji: [],\n topPeers: [],\n recentSearch: [],\n version: STATE_VERSION,\n authState: {\n _: 'authStateSignQr'\n },\n hiddenPinnedMessages: {},\n settings: {\n messagesTextSize: 16,\n sendShortcut: 'enter',\n animationsEnabled: true,\n autoDownload: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n autoPlay: {\n gifs: true,\n videos: true\n },\n stickers: {\n suggest: true,\n loop: true\n },\n themes: [{\n name: 'day',\n background: {\n type: 'image',\n blur: false,\n slug: 'ByxGo2lrMFAIAAAAmkJxZabh8eM', // * new blurred camomile,\n highlightningColor: 'hsla(85.5319, 36.9171%, 40.402%, 0.4)'\n }\n }, {\n name: 'night',\n background: {\n type: 'color',\n blur: false,\n color: '#0f0f0f',\n highlightningColor: 'hsla(0, 0%, 3.82353%, 0.4)'\n }\n }],\n theme: 'system',\n notifications: {\n sound: false\n }\n },\n keepSigned: true\n};\n\nconst ALL_KEYS = Object.keys(STATE_INIT) as any as Array<keyof State>;\n\nconst REFRESH_KEYS = ['dialogs', 'allDialogsLoaded', 'messages', 'contactsList', 'stateCreatedTime',\n 'updates', 'maxSeenMsgId', 'filters', 'topPeers', 'pinnedOrders'] as any as Array<keyof State>;\n\nexport class AppStateManager extends EventListenerBase<{\n save: (state: State) => Promise<void>,\n peerNeeded: (peerId: number) => void,\n peerUnneeded: (peerId: number) => void,\n}> {\n public static STATE_INIT = STATE_INIT;\n private loaded: Promise<State>;\n private log = logger('STATE'/* , LogLevels.error */);\n\n private state: State;\n\n private neededPeers: Map<number, Set<string>> = new Map();\n private singlePeerMap: Map<string, number> = new Map();\n\n public storages = {\n users: new AppStorage<Record<number, User>>({\n storeName: 'users'\n }),\n\n chats: new AppStorage<Record<number, Chat>>({\n storeName: 'chats'\n }),\n\n dialogs: new AppStorage<Record<number, Dialog>>({\n storeName: 'dialogs'\n })\n };\n\n public storagesResults: {[key in keyof AppStateManager['storages']]: any[]} = {} as any;\n\n constructor() {\n super();\n this.loadSavedState();\n }\n\n public loadSavedState(): Promise<State> {\n if(this.loaded) return this.loaded;\n console.time('load state');\n this.loaded = new Promise((resolve) => {\n const storagesKeys = Object.keys(this.storages) as Array<keyof AppStateManager['storages']>;\n const storagesPromises = storagesKeys.map(key => this.storages[key].getAll());\n\n const promises = ALL_KEYS\n .concat('user_auth' as any)\n .map(key => sessionStorage.get(key))\n .concat(storagesPromises);\n\n Promise.all(promises).then((arr) => {\n /* const self = this;\n const skipHandleKeys = new Set(['isProxy', 'filters', 'drafts']);\n const getHandler = (path?: string) => {\n return {\n get(target: any, key: any) {\n if(key === 'isProxy') {\n return true;\n }\n\n const prop = target[key];\n\n if(prop !== undefined && !skipHandleKeys.has(key) && !prop.isProxy && typeof(prop) === 'object') {\n target[key] = new Proxy(prop, getHandler(path || key));\n return target[key];\n }\n \n return prop;\n },\n set(target: any, key: any, value: any) {\n console.log('Setting', target, `.${key} to equal`, value, path);\n \n target[key] = value;\n\n // @ts-ignore\n self.pushToState(path || key, path ? self.state[path] : value, false);\n\n return true;\n }\n };\n }; */\n\n let state: State = this.state = {} as any;\n\n // ! then can't store false values\n for(let i = 0, length = ALL_KEYS.length; i < length; ++i) {\n const key = ALL_KEYS[i];\n const value = arr[i];\n if(value !== undefined) {\n // @ts-ignore\n state[key] = value;\n } else {\n this.pushToState(key, copy(STATE_INIT[key]));\n }\n }\n\n arr.splice(0, ALL_KEYS.length);\n\n // * Read auth\n const auth: UserAuth = arr.shift() as any;\n if(auth) {\n // ! Warning ! DON'T delete this\n state.authState = {_: 'authStateSignedIn'};\n rootScope.broadcast('user_auth', typeof(auth) !== 'number' ? (auth as any).id : auth); // * support old version\n }\n\n // * Read storages\n for(let i = 0, length = storagesKeys.length; i < length; ++i) {\n this.storagesResults[storagesKeys[i]] = arr[i];\n }\n\n arr.splice(0, storagesKeys.length);\n\n const time = Date.now();\n if((state.stateCreatedTime + REFRESH_EVERY) < time) {\n if(DEBUG) {\n this.log('will refresh state', state.stateCreatedTime, time);\n }\n \n REFRESH_KEYS.forEach(key => {\n this.pushToState(key, copy(STATE_INIT[key]));\n\n // @ts-ignore\n const s = this.storagesResults[key];\n if(s && s.length) {\n s.length = 0;\n }\n });\n }\n \n //state = this.state = new Proxy(state, getHandler());\n\n // * support old version\n if(!state.settings.hasOwnProperty('theme') && state.settings.hasOwnProperty('nightTheme')) {\n state.settings.theme = state.settings.nightTheme ? 'night' : 'day';\n this.pushToState('settings', state.settings);\n }\n\n // * support old version\n if(!state.settings.hasOwnProperty('themes') && state.settings.background) {\n state.settings.themes = copy(STATE_INIT.settings.themes);\n const theme = state.settings.themes.find(t => t.name === state.settings.theme);\n if(theme) {\n theme.background = state.settings.background;\n this.pushToState('settings', state.settings);\n }\n }\n\n validateInitObject(STATE_INIT, state, (missingKey) => {\n // @ts-ignore\n this.pushToState(missingKey, state[missingKey]);\n });\n\n if(state.version !== STATE_VERSION) {\n this.pushToState('version', STATE_VERSION);\n }\n\n // ! probably there is better place for it\n rootScope.settings = state.settings;\n\n if(DEBUG) {\n this.log('state res', state, copy(state));\n }\n \n //return resolve();\n\n console.timeEnd('load state');\n resolve(state);\n }).catch(resolve);\n });\n\n return this.loaded;\n }\n\n public getState() {\n return this.state === undefined ? this.loadSavedState() : Promise.resolve(this.state);\n }\n\n public setByKey(key: string, value: any) {\n setDeepProperty(this.state, key, value);\n rootScope.broadcast('settings_updated', {key, value});\n\n const first = key.split('.')[0];\n // @ts-ignore\n this.pushToState(first, this.state[first]);\n }\n\n public pushToState<T extends keyof State>(key: T, value: State[T], direct = true) {\n if(direct) {\n this.state[key] = value;\n }\n\n sessionStorage.set({\n [key]: value\n });\n }\n\n public requestPeer(peerId: number, type: string, limit?: number) {\n let set = this.neededPeers.get(peerId);\n if(set && set.has(type)) {\n return;\n }\n\n if(!set) {\n set = new Set();\n this.neededPeers.set(peerId, set);\n }\n\n set.add(type);\n this.dispatchEvent('peerNeeded', peerId);\n\n if(limit !== undefined) {\n this.keepPeerSingle(peerId, type);\n }\n }\n\n public isPeerNeeded(peerId: number) {\n return this.neededPeers.has(peerId);\n }\n\n public keepPeerSingle(peerId: number, type: string) {\n const existsPeerId = this.singlePeerMap.get(type);\n if(existsPeerId && existsPeerId !== peerId) {\n const set = this.neededPeers.get(existsPeerId);\n set.delete(type);\n\n if(!set.size) {\n this.neededPeers.delete(existsPeerId);\n this.dispatchEvent('peerUnneeded', existsPeerId);\n }\n }\n\n this.singlePeerMap.set(type, peerId);\n }\n\n /* public resetState() {\n for(let i in this.state) {\n // @ts-ignore\n this.state[i] = false;\n }\n sessionStorage.set(this.state).then(() => {\n location.reload();\n });\n } */\n}\n\n//console.trace('appStateManager include');\n\nconst appStateManager = new AppStateManager();\nMOUNT_CLASS_TO.appStateManager = appStateManager;\nexport default appStateManager;\n","/*\n * 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 Countries, { Country, PhoneCodesMain } from \"../countries\";\nimport { cancelEvent, CLICK_EVENT_NAME } from \"../helpers/dom\";\nimport ListenerSetter from \"../helpers/listenerSetter\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport { isTouchSupported } from \"../helpers/touchSupport\";\nimport { isApple, isMobileSafari, isSafari } from \"../helpers/userAgent\";\nimport appNavigationController from \"./appNavigationController\";\n\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\n const html = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"preloader-circular\" viewBox=\"25 25 50 50\">\n <circle class=\"preloader-path\" cx=\"50\" cy=\"50\" r=\"20\" fill=\"none\" stroke-miterlimit=\"10\"/>\n </svg>`;\n\n if(returnDiv) {\n const div = document.createElement('div');\n div.classList.add('preloader');\n div.innerHTML = html;\n\n if(elem) {\n elem.appendChild(div);\n }\n\n return div;\n }\n \n elem.insertAdjacentHTML('beforeend', html);\n return elem.lastElementChild as HTMLElement;\n}\n\nMOUNT_CLASS_TO.putPreloader = putPreloader;\n\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\n elem.classList.remove('tgico-' + icon);\n elem.disabled = true;\n putPreloader(elem);\n\n return () => {\n elem.innerHTML = '';\n elem.classList.add('tgico-' + icon);\n elem.removeAttribute('disabled');\n };\n}\n\nlet sortedCountries: Country[];\nexport function formatPhoneNumber(str: string) {\n str = str.replace(/\\D/g, '');\n let phoneCode = str.slice(0, 6);\n \n ////console.log('str', str, phoneCode);\n if(!sortedCountries) {\n sortedCountries = Countries.slice().sort((a, b) => b.phoneCode.length - a.phoneCode.length);\n }\n \n let country = sortedCountries.find((c) => {\n return c.phoneCode.split(' and ').find((c) => phoneCode.indexOf(c.replace(/\\D/g, '')) === 0);\n });\n\n if(!country) return {formatted: str, country};\n\n country = PhoneCodesMain[country.phoneCode] || country;\n \n let pattern = country.pattern || country.phoneCode;\n pattern.split('').forEach((symbol, idx) => {\n if(symbol === ' ' && str[idx] !== ' ' && str.length > idx) {\n str = str.slice(0, idx) + ' ' + str.slice(idx);\n }\n });\n \n /* if(country.pattern) {\n str = str.slice(0, country.pattern.length);\n } */\n \n return {formatted: str, country};\n}\n\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf<HTMLElement>) {\n Array.from(elements).forEach(el => {\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\n if(!match) return;\n to[match[1]] = el as HTMLElement;\n });\n} */\n\nlet onMouseMove = (e: MouseEvent) => {\n let rect = openedMenu.getBoundingClientRect();\n let {clientX, clientY} = e;\n \n let diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\n let diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\n \n if(diffX >= 100 || diffY >= 100) {\n closeBtnMenu();\n //openedMenu.parentElement.click();\n }\n //console.log('mousemove', diffX, diffY);\n};\n\nconst onClick = (e: MouseEvent | TouchEvent) => {\n //cancelEvent(e);\n closeBtnMenu();\n};\n\n// ! no need in this due to the same handler in appNavigationController\n/* const onKeyDown = (e: KeyboardEvent) => {\n if(e.key === 'Escape') {\n closeBtnMenu();\n cancelEvent(e);\n }\n}; */\n\nexport const closeBtnMenu = () => {\n if(openedMenu) {\n openedMenu.classList.remove('active');\n openedMenu.parentElement.classList.remove('menu-open');\n //openedMenu.previousElementSibling.remove(); // remove overlay\n if(menuOverlay) menuOverlay.remove();\n openedMenu = null;\n }\n \n if(openedMenuOnClose) {\n openedMenuOnClose();\n openedMenuOnClose = null;\n }\n\n if(!isTouchSupported) {\n window.removeEventListener('mousemove', onMouseMove);\n //window.removeEventListener('keydown', onKeyDown, {capture: true});\n window.removeEventListener('contextmenu', onClick);\n }\n\n document.removeEventListener(CLICK_EVENT_NAME, onClick);\n\n if(!isMobileSafari) {\n appNavigationController.removeByType('menu');\n }\n};\n\nwindow.addEventListener('resize', () => {\n if(openedMenu) {\n closeBtnMenu();\n }\n \n /* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) {\n const rect = openedMenu.getBoundingClientRect();\n const {innerWidth, innerHeight} = window;\n\n console.log(innerWidth, innerHeight, rect);\n } */\n});\n\nlet openedMenu: HTMLElement = null, openedMenuOnClose: () => void = null, menuOverlay: HTMLElement = null;\nexport function openBtnMenu(menuElement: HTMLElement, onClose?: () => void) {\n closeBtnMenu();\n\n if(!isMobileSafari) {\n appNavigationController.pushItem({\n type: 'menu',\n onPop: (canAnimate) => {\n closeBtnMenu();\n }\n });\n }\n \n openedMenu = menuElement;\n openedMenu.classList.add('active');\n openedMenu.parentElement.classList.add('menu-open');\n\n if(!menuOverlay) {\n menuOverlay = document.createElement('div');\n menuOverlay.classList.add('btn-menu-overlay');\n\n // ! because this event must be canceled, and can't cancel on menu click (below)\n menuOverlay.addEventListener(CLICK_EVENT_NAME, (e) => {\n cancelEvent(e);\n onClick(e);\n });\n }\n\n openedMenu.parentElement.insertBefore(menuOverlay, openedMenu);\n\n //document.body.classList.add('disable-hover');\n \n openedMenuOnClose = onClose;\n\n if(!isTouchSupported) {\n window.addEventListener('mousemove', onMouseMove);\n //window.addEventListener('keydown', onKeyDown, {capture: true});\n window.addEventListener('contextmenu', onClick, {once: true});\n }\n\n /* // ! because this event must be canceled, and can't cancel on menu click (below)\n overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\n cancelEvent(e);\n onClick(e);\n }); */\n \n // ! safari iOS doesn't handle window click event on overlay, idk why\n document.addEventListener(CLICK_EVENT_NAME, onClick);\n}\n\nconst PADDING_TOP = 8;\nconst PADDING_LEFT = 8;\nexport function positionMenu({pageX, pageY}: MouseEvent | Touch, elem: HTMLElement, side?: 'left' | 'right' | 'center') {\n //let {clientX, clientY} = e;\n\n // * side mean the OPEN side\n\n let {scrollWidth: menuWidth, scrollHeight: menuHeight} = elem;\n //let {innerWidth: windowWidth, innerHeight: windowHeight} = window;\n const rect = document.body.getBoundingClientRect();\n const windowWidth = rect.width;\n const windowHeight = rect.height;\n\n side = mediaSizes.isMobile ? 'right' : 'left';\n let verticalSide: 'top' /* | 'bottom' */ | 'center' = 'top';\n\n const getSides = () => {\n return {\n x: {\n left: pageX,\n right: pageX - menuWidth\n },\n intermediateX: side === 'right' ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\n //intermediateX: clientX < windowWidth / 2 ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\n y: {\n top: pageY,\n bottom: pageY - menuHeight\n },\n //intermediateY: verticalSide === 'top' ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\n intermediateY: pageY < windowHeight / 2 ? PADDING_TOP : windowHeight - menuHeight - PADDING_TOP,\n };\n };\n\n const sides = getSides();\n\n const possibleSides = {\n x: {\n left: sides.x.left + menuWidth + PADDING_LEFT <= windowWidth,\n right: sides.x.right >= PADDING_LEFT\n },\n y: {\n top: sides.y.top + menuHeight + PADDING_TOP <= windowHeight,\n bottom: sides.y.bottom - PADDING_TOP >= PADDING_TOP\n }\n };\n\n /* if(side === undefined) {\n if((clientX + menuWidth + PADDING_LEFT) > windowWidth) {\n side = 'right';\n }\n } */\n\n {\n /* const x = sides.x;\n\n const s = Object.keys(x) as (keyof typeof possibleSides.x)[];\n if(side) {\n s.findAndSplice(s => s === side);\n s.unshift(side);\n }\n\n const possibleSide = s.find(s => possibleSides.x[s]); */\n let left: number;\n /* if(possibleSide) {\n left = x[possibleSide];\n side = possibleSide;\n } else {\n left = sides.intermediateX;\n side = undefined;\n } */\n left = possibleSides.x[side] ? sides.x[side] : (side = 'center', sides.intermediateX);\n \n elem.style.left = left + 'px';\n }\n\n /* if((clientY + menuHeight + PADDING_TOP) > windowHeight) {\n elem.style.top = clamp(clientY - menuHeight, PADDING_TOP, windowHeight - menuHeight - PADDING_TOP) + 'px';\n // elem.style.top = (innerHeight - scrollHeight - PADDING_TOP) + 'px';\n verticalSide = 'bottom';\n } else {\n elem.style.top = Math.max(PADDING_TOP, clientY) + 'px';\n verticalSide = 'top';\n } */\n\n {\n let top: number;\n\n top = possibleSides.y[verticalSide] ? sides.y[verticalSide] : (verticalSide = 'center', sides.intermediateY);\n \n elem.style.top = top + 'px';\n }\n \n elem.className = elem.className.replace(/(top|center|bottom)-(left|center|right)/g, '');\n elem.classList.add(\n //(verticalSide === 'center' ? verticalSide : (verticalSide === 'bottom' ? 'top' : 'bottom')) +\n (verticalSide === 'center' ? verticalSide : 'bottom') +\n '-' +\n (side === 'center' ? side : (side === 'left' ? 'right' : 'left')));\n}\n\nexport function attachContextMenuListener(element: HTMLElement, callback: (e: Touch | MouseEvent) => void, listenerSetter?: ListenerSetter) {\n const add = listenerSetter ? listenerSetter.add.bind(listenerSetter, element) : element.addEventListener.bind(element);\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, element) : element.removeEventListener.bind(element);\n\n if(isApple && isTouchSupported) {\n let timeout: number;\n\n const options: any = /* null */{capture: true};\n\n const onCancel = () => {\n clearTimeout(timeout);\n remove('touchmove', onCancel, options);\n remove('touchend', onCancel, options);\n remove('touchcancel', onCancel, options);\n };\n\n add('touchstart', (e: TouchEvent) => {\n if(e.touches.length > 1) {\n onCancel();\n return;\n }\n \n add('touchmove', onCancel, options);\n add('touchend', onCancel, options);\n add('touchcancel', onCancel, options);\n\n timeout = window.setTimeout(() => {\n callback(e.touches[0]);\n onCancel();\n\n if(openedMenu) {\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\n }\n }, .4e3);\n });\n\n /* if(!isSafari) {\n add('contextmenu', (e: any) => {\n cancelEvent(e);\n }, {passive: false, capture: true});\n } */\n } else {\n add('contextmenu', isTouchSupported ? (e: any) => {\n callback(e);\n\n if(openedMenu) {\n element.addEventListener('touchend', cancelEvent, {once: true}); // * fix instant closing\n }\n } : callback);\n }\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { getRichValue, isInputEmpty } from \"../helpers/dom\";\nimport { debounce } from \"../helpers/schedulers\";\nimport { checkRTL } from \"../helpers/string\";\nimport { i18n, LangPackKey, _i18n } from \"../lib/langPack\";\nimport RichTextProcessor from \"../lib/richtextprocessor\";\n\nlet init = () => {\n document.addEventListener('paste', (e) => {\n if(!(e.target as HTMLElement).hasAttribute('contenteditable') && !(e.target as HTMLElement).parentElement.hasAttribute('contenteditable')) {\n return;\n }\n //console.log('document paste');\n\n //console.log('messageInput paste');\n\n e.preventDefault();\n // @ts-ignore\n let text = (e.originalEvent || e).clipboardData.getData('text/plain');\n\n let entities = RichTextProcessor.parseEntities(text);\n //console.log('messageInput paste', text, entities);\n entities = entities.filter(e => e._ === 'messageEntityEmoji' || e._ === 'messageEntityLinebreak');\n //text = RichTextProcessor.wrapEmojiText(text);\n text = RichTextProcessor.wrapRichText(text, {entities, noLinks: true, wrappingDraft: true});\n\n // console.log('messageInput paste after', text);\n\n // @ts-ignore\n //let html = (e.originalEvent || e).clipboardData.getData('text/html');\n\n // @ts-ignore\n //console.log('paste text', text, );\n window.document.execCommand('insertHTML', false, text);\n });\n\n init = null;\n};\n\nconst checkAndSetRTL = (input: HTMLElement) => {\n //const isEmpty = isInputEmpty(input);\n //console.log('input', isEmpty);\n\n //const char = [...getRichValue(input)][0];\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\n let direction = 'ltr';\n if(char && checkRTL(char)) {\n direction = 'rtl';\n }\n\n //console.log('RTL', direction, char);\n\n input.style.direction = direction;\n};\n\nexport enum InputState {\n Neutral = 0,\n Valid = 1,\n Error = 2\n};\n\nexport type InputFieldOptions = {\n placeholder?: LangPackKey, \n label?: LangPackKey, \n labelOptions?: any[],\n labelText?: string,\n name?: string, \n maxLength?: number, \n showLengthOn?: number,\n plainText?: true,\n animate?: true\n};\n\nclass InputField {\n public container: HTMLElement;\n public input: HTMLElement;\n public inputFake: HTMLElement;\n public label: HTMLLabelElement;\n\n public originalValue: string;\n\n //public onLengthChange: (length: number, isOverflow: boolean) => void;\n protected wasInputFakeClientHeight: number;\n protected showScrollDebounced: () => void;\n\n constructor(public options: InputFieldOptions = {}) {\n this.container = document.createElement('div');\n this.container.classList.add('input-field');\n\n if(options.maxLength) {\n options.showLengthOn = Math.round(options.maxLength / 3);\n }\n\n const {placeholder, maxLength, showLengthOn, name, plainText} = options;\n\n let label = options.label || options.labelText;\n\n let input: HTMLElement;\n if(!plainText) {\n if(init) {\n init();\n }\n\n this.container.innerHTML = `\n <div contenteditable=\"true\" class=\"input-field-input\"></div>\n `;\n\n input = this.container.firstElementChild as HTMLElement;\n const observer = new MutationObserver(() => {\n checkAndSetRTL(input);\n\n if(processInput) {\n processInput();\n }\n });\n\n // * because if delete all characters there will br left\n input.addEventListener('input', () => {\n if(isInputEmpty(input)) {\n input.innerHTML = '';\n }\n\n if(this.inputFake) {\n this.inputFake.innerHTML = input.innerHTML;\n this.onFakeInput();\n }\n });\n \n // ! childList for paste first symbol\n observer.observe(input, {characterData: true, childList: true, subtree: true});\n\n if(options.animate) {\n input.classList.add('scrollable', 'scrollable-y');\n this.wasInputFakeClientHeight = 0;\n this.showScrollDebounced = debounce(() => this.input.classList.remove('no-scrollbar'), 150, false, true);\n this.inputFake = document.createElement('div');\n this.inputFake.setAttribute('contenteditable', 'true');\n this.inputFake.className = input.className + ' input-field-input-fake';\n }\n } else {\n this.container.innerHTML = `\n <input type=\"text\" ${name ? `name=\"${name}\"` : ''} autocomplete=\"off\" ${label ? 'required=\"\"' : ''} class=\"input-field-input\">\n `;\n\n input = this.container.firstElementChild as HTMLElement;\n input.addEventListener('input', () => checkAndSetRTL(input));\n }\n\n if(placeholder) {\n _i18n(input, placeholder, undefined, 'placeholder');\n\n if(this.inputFake) {\n _i18n(this.inputFake, placeholder, undefined, 'placeholder');\n }\n }\n\n if(label || placeholder) {\n const border = document.createElement('div');\n border.classList.add('input-field-border');\n this.container.append(border);\n }\n\n if(label) {\n this.label = document.createElement('label');\n this.setLabel();\n this.container.append(this.label);\n }\n\n let processInput: () => void;\n if(maxLength) {\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\n let showingLength = false;\n\n processInput = () => {\n const wasError = input.classList.contains('error');\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValue(input)].length;\n const diff = maxLength - inputLength;\n const isError = diff < 0;\n input.classList.toggle('error', isError);\n\n //this.onLengthChange && this.onLengthChange(inputLength, isError);\n\n if(isError || diff <= showLengthOn) {\n this.setLabel();\n labelEl.append(` (${maxLength - inputLength})`);\n if(!showingLength) showingLength = true;\n } else if((wasError && !isError) || showingLength) {\n this.setLabel();\n showingLength = false;\n }\n };\n\n input.addEventListener('input', processInput);\n }\n\n this.input = input;\n }\n\n public select() {\n if((this.input as HTMLInputElement).value) { // * avoid selecting whole empty field on iOS devices\n (this.input as HTMLInputElement).select(); // * select text\n }\n }\n\n public setLabel() {\n this.label.textContent = '';\n if(this.options.labelText) {\n this.label.innerHTML = this.options.labelText;\n } else {\n this.label.append(i18n(this.options.label, this.options.labelOptions));\n }\n }\n\n public onFakeInput() {\n const {scrollHeight, clientHeight} = this.inputFake;\n if(this.wasInputFakeClientHeight && this.wasInputFakeClientHeight !== clientHeight) {\n this.input.classList.add('no-scrollbar'); // ! в сафари может вообще не появиться скролл после анимации, так как ему нужен полный reflow блока с overflow.\n this.showScrollDebounced();\n }\n\n this.wasInputFakeClientHeight = clientHeight;\n this.input.style.height = scrollHeight ? scrollHeight + 'px' : '';\n }\n\n get value() {\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValue(this.input);\n //return getRichValue(this.input);\n }\n\n set value(value: string) {\n this.setValueSilently(value, false);\n\n const event = new Event('input', {bubbles: true, cancelable: true});\n this.input.dispatchEvent(event);\n }\n\n public setValueSilently(value: string, fireFakeInput = true) {\n if(this.options.plainText) {\n (this.input as HTMLInputElement).value = value;\n } else {\n this.input.innerHTML = value;\n \n if(this.inputFake) {\n this.inputFake.innerHTML = value;\n\n if(fireFakeInput) {\n this.onFakeInput();\n }\n }\n }\n }\n\n public isValid() {\n return !this.input.classList.contains('error') && this.value !== this.originalValue;\n }\n\n public setOriginalValue(value: InputField['originalValue'] = '', silent = false) {\n this.originalValue = value;\n\n if(!this.options.plainText) {\n value = RichTextProcessor.wrapDraftText(value);\n }\n\n if(silent) {\n this.setValueSilently(value, false); \n } else {\n this.value = value;\n }\n }\n\n public setState(state: InputState, label?: LangPackKey) {\n if(label) {\n this.label.textContent = '';\n this.label.append(i18n(label, this.options.labelOptions));\n }\n\n this.input.classList.toggle('error', !!(state & InputState.Error));\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\n }\n\n public setError(label?: LangPackKey) {\n this.setState(InputState.Error, label);\n }\n}\n\nexport default InputField;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findUpClassName from \"../helpers/dom/findUpClassName\";\nimport sequentialDom from \"../helpers/sequentialDom\";\nimport {isTouchSupported} from \"../helpers/touchSupport\";\nimport rootScope from \"../lib/rootScope\";\n\nlet rippleClickId = 0;\nexport function ripple(elem: HTMLElement, callback: (id: number) => Promise<boolean | void> = () => Promise.resolve(), onEnd: (id: number) => void = null, prepend = false) {\n //return;\n if(elem.querySelector('.c-ripple')) return;\n elem.classList.add('rp');\n \n let r = document.createElement('div');\n r.classList.add('c-ripple');\n\n const isSquare = elem.classList.contains('rp-square');\n if(isSquare) {\n r.classList.add('is-square');\n }\n\n elem[prepend ? 'prepend' : 'append'](r);\n\n let handler: () => void;\n //let animationEndPromise: Promise<number>;\n const drawRipple = (clientX: number, clientY: number) => {\n const startTime = Date.now();\n const elem = document.createElement('div');\n\n const clickId = rippleClickId++;\n \n //console.log('ripple drawRipple');\n \n const duration = +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '') * 1000;\n //console.log('ripple duration', duration);\n\n handler = () => {\n //handler = () => animationEndPromise.then((duration) => {\n //console.log('ripple animation was:', duration);\n\n //const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\n //return;\n let elapsedTime = Date.now() - startTime;\n const cb = () => {\n //console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\n sequentialDom.mutate(() => {\n elem.remove();\n });\n \n if(onEnd) onEnd(clickId);\n };\n if(elapsedTime < duration) {\n let delay = Math.max(duration - elapsedTime, duration / 2);\n setTimeout(() => elem.classList.add('hiding'), Math.max(delay - duration / 2, 0));\n\n setTimeout(cb, delay);\n } else {\n elem.classList.add('hiding');\n setTimeout(cb, duration / 2);\n }\n\n if(!isTouchSupported) {\n window.removeEventListener('contextmenu', handler);\n }\n\n handler = null;\n touchStartFired = false;\n };\n //});\n\n callback && callback(clickId);\n\n /* callback().then((bad) => {\n if(bad) {\n span.remove();\n return;\n } */\n \n //console.log('ripple after promise', Date.now() - startTime);\n //console.log('ripple tooSlow:', tooSlow);\n /* if(tooSlow) {\n span.remove();\n return;\n } */\n\n window.requestAnimationFrame(() => {\n const rect = r.getBoundingClientRect();\n elem.classList.add('c-ripple__circle');\n\n const clickX = clientX - rect.left;\n const clickY = clientY - rect.top;\n\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\n const size = radius;\n\n // center of circle\n const x = clickX - size / 2;\n const y = clickY - size / 2;\n\n //console.log('ripple click', offsetFromCenter, size, clickX, clickY);\n\n elem.style.width = elem.style.height = size + 'px';\n elem.style.left = x + 'px';\n elem.style.top = y + 'px';\n\n // нижний код выполняется с задержкой\n /* animationEndPromise = new Promise((resolve) => {\n span.addEventListener('animationend', () => {\n // 713 -> 700\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\n }, {once: true});\n }); */\n \n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\n /* span.style.display = 'none';\n r.append(span);\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\n span.style.display = ''; */\n\n r.append(elem);\n\n //r.classList.add('active');\n //handler();\n });\n //});\n };\n\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) \n || findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\n );\n\n // TODO: rename this variable\n let touchStartFired = false;\n if(isTouchSupported) {\n let touchEnd = () => {\n handler && handler();\n };\n \n elem.addEventListener('touchstart', (e) => {\n if(!rootScope.settings.animationsEnabled) {\n return;\n }\n\n //console.log('ripple touchstart', e);\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\n return;\n }\n \n //console.log('touchstart', e);\n touchStartFired = true;\n \n let {clientX, clientY} = e.touches[0];\n drawRipple(clientX, clientY);\n elem.addEventListener('touchend', touchEnd, {once: true});\n \n window.addEventListener('touchmove', (e) => {\n e.cancelBubble = true;\n e.stopPropagation();\n touchEnd();\n elem.removeEventListener('touchend', touchEnd);\n }, {once: true});\n }, {passive: true});\n } else {\n elem.addEventListener('mousedown', (e) => {\n if(![0, 2].includes(e.button)) { // only left and right buttons\n return;\n }\n\n if(!rootScope.settings.animationsEnabled) {\n return;\n }\n //console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\n\n if(elem.dataset.ripple === '0' || isRippleUnneeded(e)) {\n return;\n } else if(touchStartFired) {\n touchStartFired = false;\n return;\n }\n \n let {clientX, clientY} = e;\n drawRipple(clientX, clientY);\n window.addEventListener('mouseup', handler, {once: true, passive: true});\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\n }, {passive: true});\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport RLottieWorker from 'worker-loader!./rlottie/rlottie.worker';\nimport animationIntersector from \"../components/animationIntersector\";\nimport { MOUNT_CLASS_TO } from '../config/debug';\nimport EventListenerBase from \"../helpers/eventListenerBase\";\nimport mediaSizes from \"../helpers/mediaSizes\";\nimport { clamp } from '../helpers/number';\nimport { pause } from '../helpers/schedulers';\nimport { isAndroid, isApple, isAppleMobile, isSafari } from \"../helpers/userAgent\";\nimport { logger, LogTypes } from \"./logger\";\nimport apiManager from \"./mtproto/mtprotoworker\";\n\nlet convert = (value: number) => {\n\treturn Math.round(Math.min(Math.max(value, 0), 1) * 255);\n};\n\ntype RLottiePlayerListeners = 'enterFrame' | 'ready' | 'firstFrame' | 'cached';\ntype RLottieOptions = {\n container: HTMLElement, \n autoplay?: boolean, \n animationData: string, \n loop?: boolean, \n width?: number,\n height?: number,\n group?: string,\n noCache?: true,\n needUpscale?: true,\n skipRatio?: number\n};\n\nexport class RLottiePlayer extends EventListenerBase<{\n enterFrame: (frameNo: number) => void,\n ready: () => void,\n firstFrame: () => void,\n cached: () => void\n}> {\n public static reqId = 0;\n\n public reqId = 0;\n public curFrame: number;\n public frameCount: number;\n public fps: number;\n public skipDelta: number;\n\n public worker: QueryableWorker;\n \n public width = 0;\n public height = 0;\n\n public el: HTMLElement;\n public canvas: HTMLCanvasElement;\n public context: CanvasRenderingContext2D;\n\n public paused = true;\n //public paused = false;\n public direction = 1;\n public speed = 1;\n public autoplay = true;\n public _autoplay: boolean; // ! will be used to store original value for settings.stickers.loop\n public loop = true;\n public _loop: boolean; // ! will be used to store original value for settings.stickers.loop\n public group = '';\n\n private frInterval: number;\n private frThen: number;\n private rafId: number;\n\n //private caching = false;\n //private removed = false;\n\n private frames: {[frameNo: string]: Uint8ClampedArray} = {};\n public imageData: ImageData;\n public clamped: Uint8ClampedArray;\n public cachingDelta = 0;\n\n //private playedTimes = 0;\n\n private currentMethod: RLottiePlayer['mainLoopForwards'] | RLottiePlayer['mainLoopBackwards'];\n private frameListener: () => void;\n\n constructor({el, worker, options}: {\n el: HTMLElement,\n worker: QueryableWorker,\n options: RLottieOptions\n }) {\n super(true);\n\n this.reqId = ++RLottiePlayer['reqId'];\n this.el = el;\n this.worker = worker;\n\n for(let i in options) {\n if(this.hasOwnProperty(i)) {\n // @ts-ignore\n this[i] = options[i];\n }\n }\n\n this._loop = this.loop;\n this._autoplay = this.autoplay;\n\n // * Skip ratio (30fps)\n let skipRatio: number;\n if(options.skipRatio !== undefined) skipRatio = options.skipRatio;\n else if((isAndroid || isAppleMobile || (isApple && !isSafari)) && this.width < 100 && this.height < 100) {\n skipRatio = 0.5;\n }\n\n this.skipDelta = skipRatio !== undefined ? 1 / skipRatio | 0 : 1;\n\n //options.needUpscale = true;\n\n // * Pixel ratio\n //const pixelRatio = window.devicePixelRatio;\n const pixelRatio = clamp(window.devicePixelRatio, 1, 2);\n if(pixelRatio > 1) {\n //this.cachingEnabled = true;//this.width < 100 && this.height < 100;\n if(options.needUpscale) {\n this.width = Math.round(this.width * pixelRatio);\n this.height = Math.round(this.height * pixelRatio);\n } else if(pixelRatio > 1) {\n if(this.width > 100 && this.height > 100) {\n if(isApple || !mediaSizes.isMobile) {\n /* this.width = Math.round(this.width * (pixelRatio - 1));\n this.height = Math.round(this.height * (pixelRatio - 1)); */\n this.width = Math.round(this.width * pixelRatio);\n this.height = Math.round(this.height * pixelRatio);\n } else if(pixelRatio > 2.5) {\n this.width = Math.round(this.width * (pixelRatio - 1.5));\n this.height = Math.round(this.height * (pixelRatio - 1.5));\n }\n } else {\n this.width = Math.round(this.width * Math.max(1.5, pixelRatio - 1.5));\n this.height = Math.round(this.height * Math.max(1.5, pixelRatio - 1.5));\n }\n }\n }\n\n //options.noCache = true;\n \n // * Cache frames params\n if(!options.noCache/* && false */) {\n // проверка на размер уже после скейлинга, сделано для попапа и сайдбара, где стикеры 80х80 и 68х68, туда нужно 75%\n if(isApple && this.width > 100 && this.height > 100) {\n this.cachingDelta = 2; //2 // 50%\n } else if(this.width < 100 && this.height < 100) {\n this.cachingDelta = Infinity; // 100%\n } else {\n this.cachingDelta = 4; // 75%\n }\n }\n \n // this.cachingDelta = Infinity;\n // if(isApple) {\n // this.cachingDelta = 0; //2 // 50%\n // }\n\n /* this.width *= 0.8;\n this.height *= 0.8; */\n \n //console.log(\"RLottiePlayer width:\", this.width, this.height, options);\n this.canvas = document.createElement('canvas');\n this.canvas.classList.add('rlottie');\n this.canvas.width = this.width;\n this.canvas.height = this.height;\n this.context = this.canvas.getContext('2d');\n\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n this.imageData = new ImageData(this.width, this.height);\n }\n\n public clearCache() {\n this.frames = {};\n }\n\n public sendQuery(methodName: string, ...args: any[]) {\n //console.trace('RLottie sendQuery:', methodName);\n this.worker.sendQuery(methodName, this.reqId, ...args);\n }\n\n public loadFromData(jsonString: string) {\n this.sendQuery('loadFromData', jsonString, this.width, this.height/* , this.canvas.transferControlToOffscreen() */);\n }\n\n public play() {\n if(!this.paused) return;\n\n //return;\n\n //console.log('RLOTTIE PLAY' + this.reqId);\n\n this.paused = false;\n this.setMainLoop();\n }\n\n public pause(clearPendingRAF = true) {\n if(this.paused) return;\n\n this.paused = true;\n if(clearPendingRAF) {\n clearTimeout(this.rafId);\n }\n //window.cancelAnimationFrame(this.rafId);\n }\n\n public stop(renderFirstFrame = true) {\n this.pause();\n\n this.curFrame = this.direction === 1 ? 0 : this.frameCount;\n if(renderFirstFrame) {\n this.requestFrame(this.curFrame);\n //this.sendQuery('renderFrame', this.curFrame);\n }\n }\n\n public restart() {\n this.stop(false);\n this.play();\n }\n\n public setSpeed(speed: number) {\n this.speed = speed;\n\n if(!this.paused) {\n this.setMainLoop();\n }\n }\n\n public setDirection(direction: number) {\n this.direction = direction;\n \n if(!this.paused) {\n this.setMainLoop();\n }\n }\n\n public remove() {\n //alert('remove');\n lottieLoader.onDestroy(this.reqId);\n this.pause();\n this.sendQuery('destroy');\n //this.removed = true;\n }\n\n public renderFrame2(frame: Uint8ClampedArray, frameNo: number) {\n /* this.setListenerResult('enterFrame', frameNo);\n return; */\n\n try {\n this.imageData.data.set(frame);\n \n //this.context.putImageData(new ImageData(frame, this.width, this.height), 0, 0);\n //let perf = performance.now();\n this.context.putImageData(this.imageData, 0, 0);\n //console.log('renderFrame2 perf:', performance.now() - perf);\n } catch(err) {\n console.error('RLottiePlayer renderFrame error:', err/* , frame */, this.width, this.height);\n this.autoplay = false;\n this.pause();\n return;\n }\n \n //console.log('set result enterFrame', frameNo);\n this.dispatchEvent('enterFrame', frameNo);\n }\n\n public renderFrame(frame: Uint8ClampedArray, frameNo: number) {\n //console.log('renderFrame', frameNo, this);\n if(this.cachingDelta && (frameNo % this.cachingDelta || !frameNo) && !this.frames[frameNo]) {\n this.frames[frameNo] = new Uint8ClampedArray(frame);//frame;\n }\n\n /* if(!this.listenerResults.hasOwnProperty('cached')) {\n this.setListenerResult('enterFrame', frameNo);\n if(frameNo === (this.frameCount - 1)) {\n this.setListenerResult('cached');\n }\n\n return;\n } */\n\n if(this.frInterval) {\n const now = Date.now(), delta = now - this.frThen;\n //console.log(`renderFrame delta${this.reqId}:`, this, delta, this.frInterval);\n\n if(delta < 0) {\n if(this.rafId) clearTimeout(this.rafId);\n return this.rafId = window.setTimeout(() => {\n this.renderFrame2(frame, frameNo);\n }, this.frInterval > -delta ? -delta % this.frInterval : this.frInterval);\n //await new Promise((resolve) => setTimeout(resolve, -delta % this.frInterval));\n }\n }\n\n this.renderFrame2(frame, frameNo);\n }\n\n public requestFrame(frameNo: number) {\n if(this.frames[frameNo]) {\n this.renderFrame(this.frames[frameNo], frameNo);\n } else if(isSafari) {\n this.sendQuery('renderFrame', frameNo);\n } else {\n if(!this.clamped.length) { // fix detached\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n }\n \n this.sendQuery('renderFrame', frameNo, this.clamped);\n }\n }\n\n private mainLoopForwards() {\n const frame = (this.curFrame + this.skipDelta) >= this.frameCount ? this.curFrame = 0 : this.curFrame += this.skipDelta;\n //console.log('mainLoopForwards', this.curFrame, this.skipDelta, frame);\n\n this.requestFrame(frame);\n if((frame + this.skipDelta) >= this.frameCount) {\n //this.playedTimes++;\n\n if(!this.loop) {\n this.pause(false);\n return false;\n }\n }\n\n return true;\n }\n \n private mainLoopBackwards() {\n const frame = (this.curFrame - this.skipDelta) < 0 ? this.curFrame = this.frameCount - 1 : this.curFrame -= this.skipDelta;\n //console.log('mainLoopBackwards', this.curFrame, this.skipDelta, frame);\n\n this.requestFrame(frame);\n if((frame - this.skipDelta) < 0) {\n //this.playedTimes++;\n\n if(!this.loop) {\n this.pause(false);\n return false;\n }\n }\n\n return true;\n }\n\n public setMainLoop() {\n //window.cancelAnimationFrame(this.rafId);\n clearTimeout(this.rafId);\n\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\n this.frThen = Date.now() - this.frInterval;\n\n //console.trace('setMainLoop', this.frInterval, this.direction, this, JSON.stringify(this.listenerResults), this.listenerResults);\n\n const method = (this.direction === 1 ? this.mainLoopForwards : this.mainLoopBackwards).bind(this);\n this.currentMethod = method;\n //this.frameListener && this.removeListener('enterFrame', this.frameListener);\n\n //setTimeout(() => {\n //this.addListener('enterFrame', this.frameListener);\n //}, 0);\n\n if(this.frameListener && this.listenerResults.hasOwnProperty('enterFrame')) {\n this.frameListener();\n }\n \n //this.mainLoop(method);\n //this.r(method);\n //method();\n }\n\n public async onLoad(frameCount: number, fps: number) {\n this.curFrame = this.direction === 1 ? 0 : frameCount - 1;\n this.frameCount = frameCount;\n this.fps = fps;\n\n // * Handle 30fps stickers if 30fps set\n if(this.fps < 60 && this.skipDelta !== 1) {\n const diff = 60 / fps;\n this.skipDelta = this.skipDelta / diff | 0;\n }\n\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\n this.frThen = Date.now() - this.frInterval;\n //this.sendQuery('renderFrame', 0);\n \n // Кешировать сразу не получится, рендер стикера (тайгер) занимает 519мс, \n // если рендерить 75% с получением каждого кадра из воркера, будет 475мс, т.е. при 100% было бы 593мс, потеря на передаче 84мс. \n\n /* console.time('cache' + this.reqId);\n for(let i = 0; i < frameCount; ++i) {\n //if(this.removed) return;\n \n if(i % 4) {\n await new Promise((resolve) => {\n delete this.listenerResults.enterFrame;\n this.addListener('enterFrame', resolve, true);\n this.requestFrame(i);\n }); \n }\n }\n \n console.timeEnd('cache' + this.reqId); */\n //console.log('cached');\n /* this.el.innerHTML = '';\n this.el.append(this.canvas);\n return; */\n\n this.requestFrame(0);\n this.dispatchEvent('ready');\n this.addEventListener('enterFrame', () => {\n this.dispatchEvent('firstFrame');\n\n this.el.appendChild(this.canvas);\n\n //console.log('enterFrame firstFrame');\n \n //let lastTime = this.frThen;\n this.frameListener = () => {\n if(this.paused) {\n return;\n }\n\n const time = Date.now();\n //console.log(`enterFrame handle${this.reqId}`, time, (time - lastTime), this.frInterval);\n /* if(Math.round(time - lastTime + this.frInterval * 0.25) < Math.round(this.frInterval)) {\n return;\n } */\n\n //lastTime = time;\n\n this.frThen = time + this.frInterval;\n const canContinue = this.currentMethod();\n if(!canContinue && !this.loop && this.autoplay) {\n this.autoplay = false;\n }\n };\n\n this.addEventListener('enterFrame', this.frameListener);\n }, true);\n }\n}\n\nclass QueryableWorker extends EventListenerBase<any> {\n constructor(private worker: Worker, private defaultListener: (data: any) => void = () => {}, onError?: (error: any) => void) {\n super();\n\n if(onError) {\n this.worker.onerror = onError;\n }\n\n this.worker.onmessage = (event) => {\n //return;\n //console.log('worker onmessage', event.data);\n if(event.data instanceof Object &&\n event.data.hasOwnProperty('queryMethodListener') &&\n event.data.hasOwnProperty('queryMethodArguments')) {\n /* if(event.data.queryMethodListener === 'frame') {\n return;\n } */\n\n this.dispatchEvent(event.data.queryMethodListener, ...event.data.queryMethodArguments);\n } else {\n this.defaultListener.call(this, event.data);\n }\n };\n }\n\n public postMessage(message: any) {\n this.worker.postMessage(message);\n }\n\n public terminate() {\n this.worker.terminate();\n }\n\n public sendQuery(queryMethod: string, ...args: any[]) {\n if(isSafari) {\n this.worker.postMessage({\n 'queryMethod': queryMethod,\n 'queryMethodArguments': args\n });\n } else {\n //const transfer: (ArrayBuffer | OffscreenCanvas)[] = [];\n const transfer: ArrayBuffer[] = [];\n args.forEach(arg => {\n if(arg instanceof ArrayBuffer) {\n transfer.push(arg);\n }\n \n if(arg.buffer && arg.buffer instanceof ArrayBuffer) {\n transfer.push(arg.buffer);\n }\n });\n \n //console.log('transfer', transfer);\n this.worker.postMessage({\n 'queryMethod': queryMethod,\n 'queryMethodArguments': args\n }, transfer as PostMessageOptions);\n }\n }\n}\n\ntype LottieShape = {\n c: {\n k: number[]\n },\n ty: 'st' | 'fl',\n it?: LottieShape[]\n};\nclass LottieLoader {\n public isWebAssemblySupported = typeof(WebAssembly) !== 'undefined';\n public loadPromise: Promise<void> = !this.isWebAssemblySupported ? Promise.reject() : undefined;\n public loaded = false;\n\n // https://github.com/telegramdesktop/tdesktop/blob/97d8ee75d51874fcb74a9bfadc79f835c82be54a/Telegram/SourceFiles/chat_helpers/stickers_emoji_pack.cpp#L46\n private static COLORREPLACEMENTS = [\n [\n [0xf77e41, 0xcb7b55],\n\t\t\t[0xffb139, 0xf6b689],\n\t\t\t[0xffd140, 0xffcda7],\n\t\t\t[0xffdf79, 0xffdfc5],\n ],\n\n [\n [0xf77e41, 0xa45a38],\n\t\t\t[0xffb139, 0xdf986b],\n\t\t\t[0xffd140, 0xedb183],\n\t\t\t[0xffdf79, 0xf4c3a0],\n ],\n\n [\n [0xf77e41, 0x703a17],\n\t\t\t[0xffb139, 0xab673d],\n\t\t\t[0xffd140, 0xc37f4e],\n\t\t\t[0xffdf79, 0xd89667],\n ],\n\n [\n [0xf77e41, 0x4a2409],\n\t\t\t[0xffb139, 0x7d3e0e],\n\t\t\t[0xffd140, 0x965529],\n\t\t\t[0xffdf79, 0xa96337],\n ],\n\n [\n\t\t\t[0xf77e41, 0x200f0a],\n\t\t\t[0xffb139, 0x412924],\n\t\t\t[0xffd140, 0x593d37],\n\t\t\t[0xffdf79, 0x63453f],\n ]\n ];\n\n private workersLimit = 4;\n private players: {[reqId: number]: RLottiePlayer} = {};\n\n private workers: QueryableWorker[] = [];\n private curWorkerNum = 0;\n\n private log = logger('LOTTIE', LogTypes.Error);\n\n public getAnimation(element: HTMLElement) {\n for(const i in this.players) {\n if(this.players[i].el === element) {\n return this.players[i];\n }\n }\n\n return null;\n }\n\n public setLoop(loop: boolean) {\n for(const i in this.players) {\n const player = this.players[i];\n player.loop = loop;\n player.autoplay = player._autoplay;\n }\n }\n\n public loadLottieWorkers() {\n if(this.loadPromise) {\n return this.loadPromise;\n }\n\n return this.loadPromise = new Promise((resolve, reject) => {\n let remain = this.workersLimit;\n for(let i = 0; i < this.workersLimit; ++i) {\n const worker = this.workers[i] = new QueryableWorker(new RLottieWorker());\n\n worker.addEventListener('ready', () => {\n this.log('worker #' + i + ' ready');\n\n worker.addEventListener('frame', this.onFrame);\n worker.addEventListener('loaded', this.onPlayerLoaded);\n worker.addEventListener('error', this.onPlayerError);\n\n --remain;\n if(!remain) {\n this.log('workers ready');\n resolve();\n this.loaded = true;\n }\n });\n }\n });\n }\n\n private applyReplacements(object: {\n layers: Array<{shapes: LottieShape[]}>\n }, toneIndex: number) {\n const replacements = LottieLoader.COLORREPLACEMENTS[Math.max(toneIndex - 1, 0)];\n\n const applyTo = (smth: LottieShape) => {\n const k = smth.c.k;\n const color = convert(k[2]) | (convert(k[1]) << 8) | (convert(k[0]) << 16);\n\n const foundReplacement = replacements.find(p => p[0] === color);\n if(foundReplacement) {\n k[0] = ((foundReplacement[1] >> 16) & 255) / 255;\n k[1] = ((foundReplacement[1] >> 8) & 255) / 255;\n k[2] = (foundReplacement[1] & 255) / 255;\n }\n\n //console.log('foundReplacement!', foundReplacement, color.toString(16), k);\n };\n\n const checkSmth = (smth: LottieShape) => {\n switch(smth.ty) {\n case 'st':\n case 'fl':\n applyTo(smth);\n break;\n }\n\n if(smth.hasOwnProperty('it')) {\n iterateIt(smth.it);\n }\n };\n\n const iterateIt = (it: LottieShape['it']) => {\n for(const smth of it) {\n checkSmth(smth);\n }\n };\n\n try {\n for(const layer of object.layers) {\n if(!layer.shapes) continue;\n \n for(const shape of layer.shapes) {\n if(!shape.it) {\n checkSmth(shape);\n continue;\n }\n\n iterateIt(shape.it);\n }\n }\n } catch(err) {\n this.log.warn('cant apply replacements', err, object, toneIndex);\n }\n }\n\n public loadAnimationFromURL(params: Omit<RLottieOptions, 'animationData'>, url: string): Promise<RLottiePlayer> {\n if(!this.isWebAssemblySupported) {\n return this.loadPromise as any;\n }\n \n if(!this.loaded) {\n this.loadLottieWorkers();\n }\n \n return fetch(url)\n .then(res => res.arrayBuffer())\n .then(data => apiManager.gzipUncompress<string>(data, true))\n /* .then(str => {\n return new Promise<string>((resolve) => setTimeout(() => resolve(str), 2e3));\n }) */\n .then(str => {\n return this.loadAnimationWorker(Object.assign(params, {animationData: str/* JSON.parse(str) */, needUpscale: true}));\n });\n }\n\n public waitForFirstFrame(player: RLottiePlayer): Promise<void> {\n return Promise.race([\n /* new Promise<void>((resolve) => {\n player.addEventListener('firstFrame', () => {\n setTimeout(() => resolve(), 1500);\n }, true);\n }) */\n new Promise<void>((resolve) => {\n player.addEventListener('firstFrame', resolve, true);\n }),\n pause(2500)\n ]);\n }\n\n public async loadAnimationWorker(params: RLottieOptions, group = '', toneIndex = -1): Promise<RLottiePlayer> {\n if(!this.isWebAssemblySupported) {\n return this.loadPromise as any;\n }\n //params.autoplay = true;\n\n if(toneIndex >= 1 && toneIndex <= 5) {\n /* params.animationData = copy(params.animationData);\n this.applyReplacements(params.animationData, toneIndex); */\n\n const newAnimationData = JSON.parse(params.animationData);\n this.applyReplacements(newAnimationData, toneIndex);\n params.animationData = JSON.stringify(newAnimationData);\n }\n\n if(!this.loaded) {\n await this.loadLottieWorkers();\n }\n\n if(!params.width || !params.height) {\n params.width = parseInt(params.container.style.width);\n params.height = parseInt(params.container.style.height);\n }\n\n if(!params.width || !params.height) {\n throw new Error('No size for sticker!');\n }\n\n params.group = group;\n\n const player = this.initPlayer(params.container, params);\n animationIntersector.addAnimation(player, group);\n\n return player;\n }\n\n private onPlayerLoaded = (reqId: number, frameCount: number, fps: number) => {\n const rlPlayer = this.players[reqId];\n if(!rlPlayer) {\n this.log.warn('onPlayerLoaded on destroyed player:', reqId, frameCount);\n return;\n }\n\n this.log.debug('onPlayerLoaded');\n rlPlayer.onLoad(frameCount, fps);\n //rlPlayer.addListener('firstFrame', () => {\n //animationIntersector.addAnimation(player, group);\n //}, true);\n };\n\n private onFrame = (reqId: number, frameNo: number, frame: Uint8ClampedArray) => {\n const rlPlayer = this.players[reqId];\n if(!rlPlayer) {\n this.log.warn('onFrame on destroyed player:', reqId, frameNo);\n return;\n }\n\n rlPlayer.clamped = frame;\n rlPlayer.renderFrame(frame, frameNo);\n };\n\n private onPlayerError = (reqId: number, error: Error) => {\n const rlPlayer = this.players[reqId];\n if(rlPlayer) {\n // ! will need refactoring later, this is not the best way to remove the animation\n const animations = animationIntersector.getAnimations(rlPlayer.el);\n animations.forEach(animation => {\n animationIntersector.checkAnimation(animation, true, true);\n });\n }\n };\n\n public onDestroy(reqId: number) {\n delete this.players[reqId];\n }\n\n public destroyWorkers() {\n this.workers.forEach((worker, idx) => {\n worker.terminate();\n this.log('worker #' + idx + ' terminated');\n });\n\n this.log('workers destroyed');\n this.workers.length = 0;\n }\n\n private initPlayer(el: HTMLElement, options: RLottieOptions) {\n const rlPlayer = new RLottiePlayer({\n el, \n worker: this.workers[this.curWorkerNum++],\n options\n });\n\n this.players[rlPlayer.reqId] = rlPlayer;\n if(this.curWorkerNum >= this.workers.length) {\n this.curWorkerNum = 0;\n }\n\n rlPlayer.loadFromData(options.animationData);\n\n return rlPlayer;\n }\n}\n\nconst lottieLoader = new LottieLoader();\nMOUNT_CLASS_TO.lottieLoader = lottieLoader;\nexport default lottieLoader;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\nimport I18n from \"../lib/langPack\";\n\nexport const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\nexport const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n\nexport const ONE_DAY = 86400;\n\n// https://stackoverflow.com/a/6117889\nexport const getWeekNumber = (date: Date) => {\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\n const dayNum = d.getUTCDay() || 7;\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\n return Math.ceil((((d.getTime() - yearStart.getTime()) / ONE_DAY) + 1) / 7);\n};\n\nexport const formatDateAccordingToToday = (time: Date) => {\n const date = new Date();\n const now = date.getTime() / 1000 | 0;\n const timestamp = time.getTime() / 1000 | 0;\n\n let timeStr: string;\n if((now - timestamp) < ONE_DAY && date.getDate() === time.getDate()) { // if the same day\n timeStr = ('0' + time.getHours()).slice(-2) + ':' + ('0' + time.getMinutes()).slice(-2);\n } else if(date.getFullYear() !== time.getFullYear()) { // different year\n timeStr = time.getDate() + '.' + ('0' + (time.getMonth() + 1)).slice(-2) + '.' + ('' + time.getFullYear()).slice(-2);\n } else if((now - timestamp) < (ONE_DAY * 7) && getWeekNumber(date) === getWeekNumber(time)) { // current week\n timeStr = days[time.getDay()].slice(0, 3);\n } else { // same year\n timeStr = months[time.getMonth()].slice(0, 3) + ' ' + ('0' + time.getDate()).slice(-2);\n }\n\n return timeStr;\n};\n\nexport function formatDateAccordingToTodayNew(time: Date) {\n const today = new Date();\n const now = today.getTime() / 1000 | 0;\n const timestamp = time.getTime() / 1000 | 0;\n\n const options: Intl.DateTimeFormatOptions = {};\n if((now - timestamp) < ONE_DAY && today.getDate() === time.getDate()) { // if the same day\n options.hour = options.minute = '2-digit';\n } else if(today.getFullYear() !== time.getFullYear()) { // different year\n options.year = options.day = 'numeric';\n options.month = '2-digit';\n } else if((now - timestamp) < (ONE_DAY * 7) && getWeekNumber(today) === getWeekNumber(time)) { // current week\n options.weekday = 'short';\n } else { // same year\n options.month = 'short';\n options.day = 'numeric';\n }\n\n return new I18n.IntlDateElement({\n date: time,\n options\n }).element;\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.formatDateAccordingToTodayNew = formatDateAccordingToTodayNew);\n\nexport const getFullDate = (date: Date, options: Partial<{\n noTime: true, \n noSeconds: true,\n monthAsNumber: true,\n leadingZero: true\n}> = {}) => {\n const joiner = options.monthAsNumber ? '.' : ' ';\n const time = ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2) + (options.noSeconds ? '' : ':' + ('0' + date.getSeconds()).slice(-2));\n\n return (options.leadingZero ? ('0' + date.getDate()).slice(-2) : date.getDate()) + \n joiner + (options.monthAsNumber ? ('0' + (date.getMonth() + 1)).slice(-2) : months[date.getMonth()]) + \n joiner + date.getFullYear() + \n (options.noTime ? '' : ', ' + time);\n};\n\nexport function tsNow(seconds?: true) {\n const t = Date.now();\n return seconds ? Math.floor(t / 1000) : t;\n}\n\n// https://github.com/DrKLO/Telegram/blob/d52b2c921abd3c1e8d6368858313ad0cb0468c07/TMessagesProj/src/main/java/org/telegram/ui/Adapters/FiltersView.java\nconst minYear = 2013;\nconst yearPattern = new RegExp(\"20[0-9]{1,2}\");\nconst monthYearOrDayPattern = new RegExp(\"(\\\\w{3,}) ([0-9]{0,4})\", 'i');\nconst yearOrDayAndMonthPattern = new RegExp(\"([0-9]{0,4}) (\\\\w{2,})\", 'i');\nconst shortDate = new RegExp(\"^([0-9]{1,4})(\\\\.| |/|\\\\-)([0-9]{1,4})$\", 'i');\nconst longDate = new RegExp(\"^([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,4})$\", 'i');\nconst numberOfDaysEachMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\nexport type DateData = {\n title: string,\n minDate: number,\n maxDate: number,\n};\nexport function fillTipDates(query: string, dates: DateData[]) {\n const q = query.trim().toLowerCase();\n\n if(q.length < 3) {\n return;\n }\n\n if(\"today\".indexOf(q) === 0) {\n const date = new Date();\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: 'Today',\n minDate,\n maxDate\n });\n return;\n }\n\n if(\"yesterday\".indexOf(q) === 0) {\n const date = new Date();\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime() - 86400000;\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 86400001;\n dates.push({\n title: 'Yesterday',\n minDate,\n maxDate\n });\n return;\n }\n\n const dayOfWeek = getDayOfWeek(q);\n if(dayOfWeek >= 0) {\n const date = new Date();\n const now = date.getTime();\n const currentDay = date.getDay();\n const distance = dayOfWeek - currentDay;\n date.setDate(date.getDate() + distance);\n if(date.getTime() > now) {\n date.setTime(date.getTime() - 604800000);\n }\n const year = date.getFullYear()\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: formatWeekLong(minDate),\n minDate,\n maxDate\n });\n return;\n }\n\n let matches: any[];\n if((matches = shortDate.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[3];\n const k = parseInt(g1);\n const k1 = parseInt(g2);\n if(k > 0 && k <= 31) {\n if(k1 >= minYear && k <= 12) {\n const selectedYear = k1;\n const month = k - 1;\n createForMonthYear(dates, month, selectedYear);\n return;\n } else if (k1 <= 12) {\n const day = k - 1;\n const month = k1 - 1;\n createForDayMonth(dates, day, month);\n }\n } else if (k >= minYear && k1 <= 12) {\n const selectedYear = k;\n const month = k1 - 1;\n createForMonthYear(dates, month, selectedYear);\n }\n\n return;\n }\n\n if((matches = longDate.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[3];\n const g3 = matches[5];\n if(!matches[2] === matches[4]) {\n return;\n }\n\n const day = parseInt(g1);\n const month = parseInt(g2) - 1;\n let year = parseInt(g3);\n if(year >= 10 && year <= 99) {\n year += 2000;\n }\n\n const currentYear = new Date().getFullYear();\n if(validDateForMonth(day - 1, month) && year >= minYear && year <= currentYear) {\n const date = new Date();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n \n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: formatterYearMax(minDate),\n minDate,\n maxDate\n });\n return;\n }\n\n return;\n }\n\n if((matches = yearPattern.exec(q)) !== null) {\n let selectedYear = +q;\n const currentYear = new Date().getFullYear();\n if(selectedYear < minYear) {\n selectedYear = minYear;\n for(let i = currentYear; i >= selectedYear; i--) {\n const date = new Date();\n date.setFullYear(i, 0, 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(i + 1, 0, 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: '' + i,\n minDate,\n maxDate\n });\n }\n } else if(selectedYear <= currentYear) {\n const date = new Date();\n date.setFullYear(selectedYear, 0, 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(selectedYear + 1, 0, 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: '' + selectedYear,\n minDate,\n maxDate\n });\n }\n\n return;\n }\n\n if((matches = monthYearOrDayPattern.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[2];\n const month = getMonth(g1);\n if(month >= 0) {\n const k = +g2;\n if(k > 0 && k <= 31) {\n const day = k - 1;\n createForDayMonth(dates, day, month);\n return;\n } else if(k >= minYear) {\n const selectedYear = k;\n createForMonthYear(dates, month, selectedYear);\n return;\n }\n }\n }\n\n if((matches = yearOrDayAndMonthPattern.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[2];\n const month = getMonth(g2);\n if(month >= 0) {\n const k = +g1;\n if(k > 0 && k <= 31) {\n const day = k - 1;\n createForDayMonth(dates, day, month);\n return;\n } else if (k >= minYear) {\n const selectedYear = k;\n createForMonthYear(dates, month, selectedYear);\n }\n }\n }\n}\n\nfunction createForMonthYear(dates: DateData[], month: number, selectedYear: number) {\n const currentYear = new Date().getFullYear();\n const today = Date.now();\n if(selectedYear >= minYear && selectedYear <= currentYear) {\n const date = new Date();\n date.setFullYear(selectedYear, month, 1);\n date.setHours(0, 0, 0);\n const minDate = date.getTime();\n if(minDate > today) {\n return;\n }\n date.setMonth(date.getMonth() + 1);\n const maxDate = date.getTime() - 1;\n\n dates.push({\n title: formatterMonthYear(minDate),\n minDate,\n maxDate\n });\n }\n}\n\nfunction createForDayMonth(dates: DateData[], day: number, month: number) {\n if(validDateForMonth(day, month)) {\n const currentYear = new Date().getFullYear();\n const today = Date.now();\n \n for(let i = currentYear; i >= minYear; i--) {\n if(month === 1 && day === 28 && !isLeapYear(i)) {\n continue;\n }\n\n const date = new Date();\n date.setFullYear(i, month, day + 1);\n date.setHours(0, 0, 0);\n \n const minDate = date.getTime();\n if(minDate > today) {\n continue;\n }\n\n date.setFullYear(i, month, day + 2);\n date.setHours(0, 0, 0);\n const maxDate = date.getTime() - 1;\n if(i === currentYear) {\n dates.push({\n title: formatterDayMonth(minDate),\n minDate,\n maxDate\n });\n } else {\n dates.push({\n title: formatterYearMax(minDate),\n minDate,\n maxDate\n });\n }\n }\n }\n}\n\nfunction formatterMonthYear(timestamp: number) {\n const date = new Date(timestamp);\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getFullYear();\n}\n\nfunction formatterDayMonth(timestamp: number) {\n const date = new Date(timestamp);\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getDate();\n}\n\nfunction formatterYearMax(timestamp: number) {\n const date = new Date(timestamp);\n return ('0' + date.getDate()).slice(-2) + '.' + ('0' + (date.getMonth() + 1)).slice(-2) + '.' + date.getFullYear();\n}\n\nfunction formatWeekLong(timestamp: number) {\n const date = new Date(timestamp);\n return days[date.getDay()];\n}\n\nfunction validDateForMonth(day: number, month: number) {\n if(month >= 0 && month < 12) {\n if(day >= 0 && day < numberOfDaysEachMonth[month]) {\n return true;\n }\n }\n return false;\n}\n\nfunction isLeapYear(year: number) {\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);\n}\n\nfunction getMonth(q: string) {\n /* String[] months = new String[]{\n LocaleController.getString(\"January\", R.string.January).toLowerCase(),\n LocaleController.getString(\"February\", R.string.February).toLowerCase(),\n LocaleController.getString(\"March\", R.string.March).toLowerCase(),\n LocaleController.getString(\"April\", R.string.April).toLowerCase(),\n LocaleController.getString(\"May\", R.string.May).toLowerCase(),\n LocaleController.getString(\"June\", R.string.June).toLowerCase(),\n LocaleController.getString(\"July\", R.string.July).toLowerCase(),\n LocaleController.getString(\"August\", R.string.August).toLowerCase(),\n LocaleController.getString(\"September\", R.string.September).toLowerCase(),\n LocaleController.getString(\"October\", R.string.October).toLowerCase(),\n LocaleController.getString(\"November\", R.string.November).toLowerCase(),\n LocaleController.getString(\"December\", R.string.December).toLowerCase()\n }; */\n\n /* String[] monthsEng = new String[12];\n Calendar c = Calendar.getInstance();\n for (int i = 1; i <= 12; i++) {\n c.set(0, 0, 0, 0, 0, 0);\n c.set(Calendar.MONTH, i);\n monthsEng[i - 1] = c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH).toLowerCase();\n } */\n\n q = q.toLowerCase();\n for(let i = 0; i < 12; i++) {\n const month = months[i].toLowerCase();\n if(month.indexOf(q) === 0) {\n return i;\n }\n }\n return -1;\n}\n\nfunction getDayOfWeek(q: string) {\n const c = new Date();\n if(q.length <= 3) {\n return -1;\n }\n \n for(let i = 0; i < 7; i++) {\n c.setDate(c.getDate() + 1);\n \n if(formatWeekLong(c.getTime()).toLowerCase().indexOf(q) === 0) {\n return c.getDay();\n }\n }\n return -1;\n}\n\nMOUNT_CLASS_TO.fillTipDates = fillTipDates;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Page from \"./page\";\nimport { whichChild } from \"../helpers/dom\";\nimport lottieLoader from \"../lib/lottieLoader\";\nimport { horizontalMenu } from \"../components/horizontalMenu\";\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\n\nclass PagesManager {\n private pageId = -1;\n private page: Page;\n\n private selectTab: ReturnType<typeof horizontalMenu>;\n public pagesDiv: HTMLDivElement;\n public scrollableDiv: HTMLElement;\n\n constructor() {\n this.pagesDiv = document.getElementById('auth-pages') as HTMLDivElement;\n this.scrollableDiv = this.pagesDiv.querySelector('.scrollable') as HTMLElement;\n this.selectTab = horizontalMenu(null, this.scrollableDiv.querySelector('.tabs-container') as HTMLDivElement, null, () => {\n if(this.page?.onShown) {\n this.page.onShown();\n }\n });\n }\n\n public setPage(page: Page) {\n if(page.isAuthPage) {\n this.pagesDiv.style.display = '';\n\n let id = whichChild(page.pageEl);\n if(this.pageId === id) return;\n\n this.selectTab(id);\n\n if(this.pageId !== -1 && id > 1) {\n lottieLoader.loadLottieWorkers();\n }\n\n\n\n this.pageId = id;\n\n if(this.scrollableDiv) {\n fastSmoothScroll(this.scrollableDiv, this.scrollableDiv.firstElementChild as HTMLElement, 'start');\n }\n } else {\n this.pagesDiv.style.display = 'none';\n page.pageEl.style.display = '';\n\n this.pageId = -1;\n }\n\n this.page = page;\n }\n}\n\nconst pagesManager = new PagesManager();\nMOUNT_CLASS_TO.pagesManager = pagesManager;\nexport default pagesManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport pagesManager from \"./pagesManager\";\n\nexport default class Page {\n public pageEl: HTMLDivElement;\n private installed = false;\n\n constructor(className: string, public isAuthPage: boolean, private onFirstMount?: (...args: any[]) => Promise<any> | void, private onMount?: (...args: any[]) => void, public onShown?: () => void) {\n this.pageEl = document.body.querySelector('.' + className) as HTMLDivElement;\n }\n\n public async mount(...args: any[]) {\n //this.pageEl.style.display = '';\n\n if(this.onMount) {\n this.onMount(...args);\n }\n\n if(!this.installed) {\n if(this.onFirstMount) {\n try {\n const res = this.onFirstMount(...args);\n if(res instanceof Promise) {\n await res;\n }\n } catch(err) {\n console.error('PAGE MOUNT ERROR:', err);\n }\n }\n \n this.installed = true;\n }\n\n pagesManager.setPage(this);\n }\n}\n","/*\n * 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 { isMobileSafari } from \"../helpers/userAgent\";\nimport { blurActiveElement, cancelEvent } from \"../helpers/dom\";\nimport { logger } from \"../lib/logger\";\nimport { doubleRaf } from \"../helpers/schedulers\";\n\nexport type NavigationItem = {\n type: 'left' | 'right' | 'im' | 'chat' | 'popup' | 'media' | 'menu' | 'esg' | 'multiselect' | 'input-helper' | 'markup' | 'global-search',\n onPop: (canAnimate: boolean) => boolean | void,\n onEscape?: () => boolean,\n noHistory?: boolean,\n};\n\nexport class AppNavigationController {\n private navigations: Array<NavigationItem> = [];\n private id = Date.now();\n private manual = false;\n private log = logger('NC');\n private debug = true;\n private currentHash = window.location.hash;\n public onHashChange: () => void;\n\n constructor() {\n let isPossibleSwipe = false;\n window.addEventListener('popstate', (e) => {\n this.debug && this.log('popstate', e, isPossibleSwipe);\n\n if(window.location.hash !== this.currentHash) {\n this.onHashChange && this.onHashChange();\n this.replaceState();\n return;\n }\n this.currentHash = window.location.hash;\n\n const id: number = e.state;\n if(id !== this.id/* && !this.navigations.length */) {\n this.pushState();\n return;\n }\n\n const item = this.navigations.pop();\n if(!item) {\n this.pushState();\n return;\n }\n\n this.manual = !isPossibleSwipe;\n this.handleItem(item);\n //this.pushState(); // * prevent adding forward arrow\n });\n\n window.addEventListener('keydown', (e) => {\n const item = this.navigations[this.navigations.length - 1];\n if(!item) return;\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\n cancelEvent(e);\n this.back();\n }\n }, {capture: true});\n\n if(isMobileSafari) {\n const options = {passive: true};\n window.addEventListener('touchstart', (e) => {\n if(e.touches.length > 1) return;\n this.debug && this.log('touchstart');\n\n const detach = () => {\n window.removeEventListener('touchend', onTouchEnd);\n window.removeEventListener('touchmove', onTouchMove);\n };\n\n let moved = false;\n const onTouchMove = (e: TouchEvent) => {\n this.debug && this.log('touchmove');\n if(e.touches.length > 1) {\n detach();\n return;\n }\n\n moved = true;\n };\n\n const onTouchEnd = (e: TouchEvent) => {\n this.debug && this.log('touchend');\n if(e.touches.length > 1 || !moved) {\n detach();\n return;\n }\n\n isPossibleSwipe = true;\n doubleRaf().then(() => {\n isPossibleSwipe = false;\n });\n\n detach();\n };\n\n window.addEventListener('touchend', onTouchEnd, options);\n window.addEventListener('touchmove', onTouchMove, options);\n }, options);\n }\n\n history.scrollRestoration = 'manual';\n\n this.pushState(); // * push init state\n }\n\n private handleItem(item: NavigationItem) {\n const good = item.onPop(!this.manual ? false : undefined);\n this.debug && this.log('popstate, navigation:', item, this.navigations);\n if(good === false) {\n this.pushItem(item);\n } else {\n blurActiveElement(); // no better place for it\n }\n\n this.manual = false;\n }\n\n public findItemByType(type: NavigationItem['type']) {\n for(let i = this.navigations.length - 1; i >= 0; --i) {\n const item = this.navigations[i];\n if(item.type === type) {\n return {item, index: i};\n }\n }\n }\n\n public back(type?: NavigationItem['type']) {\n if(type) {\n const ret = this.findItemByType(type);\n if(ret) {\n this.manual = true;\n // ! commented because 'popstate' event will be fired with delay\n //if(ret.index !== (this.navigations.length - 1)) {\n this.navigations.splice(ret.index, 1);\n this.handleItem(ret.item);\n return;\n //}\n }\n }\n\n history.back();\n }\n\n public pushItem(item: NavigationItem) {\n this.navigations.push(item);\n this.debug && this.log('pushstate', item, this.navigations);\n\n if(!item.noHistory) {\n this.pushState();\n }\n }\n\n private pushState() {\n this.manual = false;\n history.pushState(this.id, '');\n }\n\n public replaceState() {\n history.replaceState(this.id, '', location.origin + location.pathname);\n }\n\n public removeItem(item: NavigationItem) {\n this.navigations.findAndSplice(i => i === item);\n }\n\n public removeByType(type: NavigationItem['type'], single = false) {\n for(let i = this.navigations.length - 1; i >= 0; --i) {\n const item = this.navigations[i];\n if(item.type === type) {\n this.navigations.splice(i, 1);\n\n if(single) {\n break;\n }\n }\n }\n }\n}\n\nconst appNavigationController = new AppNavigationController();\nMOUNT_CLASS_TO.appNavigationController = appNavigationController;\nexport default appNavigationController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// * Jolly Cobra's useHeavyAnimationCheck.ts, patched\n\n//import { useEffect } from '../lib/teact/teact';\nimport { AnyToVoidFunction } from '../types';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport { CancellablePromise, deferredPromise } from '../helpers/cancellablePromise';\nimport { pause } from '../helpers/schedulers';\nimport rootScope from '../lib/rootScope';\nimport DEBUG from '../config/debug';\n\nconst ANIMATION_START_EVENT = 'event-heavy-animation-start';\nconst ANIMATION_END_EVENT = 'event-heavy-animation-end';\n\nlet isAnimating = false;\nlet heavyAnimationPromise: CancellablePromise<void> = Promise.resolve();\nlet promisesInQueue = 0;\n\nconst log = console.log.bind(console.log, '[HEAVY-ANIMATION]:');\n\nexport const dispatchHeavyAnimationEvent = (promise: Promise<any>, timeout?: number) => {\n if(!isAnimating) {\n heavyAnimationPromise = deferredPromise<void>();\n rootScope.broadcast(ANIMATION_START_EVENT);\n isAnimating = true;\n DEBUG && log('start');\n }\n \n ++promisesInQueue;\n DEBUG && log('attach promise, length:', promisesInQueue, timeout);\n\n const promises = [\n timeout !== undefined ? pause(timeout) : undefined,\n promise.finally(() => {})\n ].filter(Boolean);\n\n const perf = performance.now();\n Promise.race(promises).then(() => {\n --promisesInQueue;\n DEBUG && log('promise end, length:', promisesInQueue, performance.now() - perf);\n if(!promisesInQueue) {\n isAnimating = false;\n promisesInQueue = 0;\n rootScope.broadcast(ANIMATION_END_EVENT);\n heavyAnimationPromise.resolve();\n\n DEBUG && log('end');\n }\n });\n\n return heavyAnimationPromise;\n};\n\nexport const getHeavyAnimationPromise = () => heavyAnimationPromise;\n\nexport default (\n handleAnimationStart: AnyToVoidFunction,\n handleAnimationEnd: AnyToVoidFunction,\n listenerSetter?: ListenerSetter\n) => {\n //useEffect(() => {\n if(isAnimating) {\n handleAnimationStart();\n }\n\n const add = listenerSetter ? listenerSetter.add.bind(listenerSetter, rootScope) : rootScope.addEventListener.bind(rootScope);\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, rootScope) : rootScope.removeEventListener.bind(rootScope);\n add(ANIMATION_START_EVENT, handleAnimationStart);\n add(ANIMATION_END_EVENT, handleAnimationEnd);\n\n return () => {\n remove(ANIMATION_END_EVENT, handleAnimationEnd);\n remove(ANIMATION_START_EVENT, handleAnimationStart);\n };\n //}, [handleAnimationEnd, handleAnimationStart]);\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { isInDOM } from \"../helpers/dom\";\nimport { RLottiePlayer } from \"../lib/lottieLoader\";\nimport rootScope from \"../lib/rootScope\";\nimport { isSafari } from \"../helpers/userAgent\";\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\n\nexport interface AnimationItem {\n el: HTMLElement,\n group: string,\n animation: RLottiePlayer | HTMLVideoElement\n};\n\nexport class AnimationIntersector {\n public observer: IntersectionObserver;\n private visible: Set<AnimationItem> = new Set();\n\n private byGroups: {[group: string]: AnimationItem[]} = {};\n private lockedGroups: {[group: string]: true} = {};\n private onlyOnePlayableGroup: string = '';\n \n private intersectionLockedGroups: {[group: string]: true} = {};\n private videosLocked = false;\n\n constructor() {\n this.observer = new IntersectionObserver((entries) => {\n if(rootScope.idle.isIDLE) return;\n\n for(const entry of entries) {\n const target = entry.target;\n\n for(const group in this.byGroups) {\n if(this.intersectionLockedGroups[group]) {\n continue;\n }\n\n const player = this.byGroups[group].find(p => p.el === target);\n if(player) {\n if(entry.isIntersecting) {\n this.visible.add(player);\n this.checkAnimation(player, false);\n } else {\n this.visible.delete(player);\n this.checkAnimation(player, true);\n\n if(player.animation instanceof RLottiePlayer/* && player.animation.cachingDelta === 2 */) {\n //console.warn('will clear cache', player);\n player.animation.clearCache();\n }\n }\n\n break;\n }\n }\n }\n });\n\n rootScope.on('audio_play', ({doc}) => {\n if(doc.type === 'round') {\n this.videosLocked = true;\n this.checkAnimations();\n }\n });\n\n rootScope.on('audio_pause', () => {\n if(this.videosLocked) {\n this.videosLocked = false;\n this.checkAnimations();\n }\n });\n }\n\n public getAnimations(element: HTMLElement) {\n const found: AnimationItem[] = [];\n for(const group in this.byGroups) {\n for(const player of this.byGroups[group]) {\n if(player.el === element) {\n found.push(player);\n }\n }\n }\n\n return found;\n }\n\n public removeAnimation(player: AnimationItem) {\n //console.log('destroy animation');\n const {el, animation} = player;\n animation.remove();\n\n if(animation instanceof HTMLVideoElement && isSafari) {\n setTimeout(() => { // TODO: очистка по очереди, а не все вместе с этим таймаутом\n animation.src = '';\n animation.load();\n }, 1e3);\n }\n\n for(const group in this.byGroups) {\n this.byGroups[group].findAndSplice(p => p === player);\n }\n \n this.observer.unobserve(el);\n this.visible.delete(player);\n }\n\n public addAnimation(animation: RLottiePlayer | HTMLVideoElement, group = '') {\n const player = {\n el: animation instanceof RLottiePlayer ? animation.el : animation, \n animation: animation, \n group\n };\n\n if(animation instanceof RLottiePlayer) {\n if(!rootScope.settings.stickers.loop && animation.loop) {\n animation.loop = rootScope.settings.stickers.loop;\n }\n }\n\n (this.byGroups[group] ?? (this.byGroups[group] = [])).push(player);\n this.observer.observe(player.el);\n }\n\n public checkAnimations(blurred?: boolean, group?: string, destroy = false) {\n if(rootScope.idle.isIDLE) return;\n \n const groups = group /* && false */ ? [group] : Object.keys(this.byGroups);\n\n if(group && !this.byGroups[group]) {\n //console.warn('no animation group:', group);\n this.byGroups[group] = [];\n return;\n }\n\n for(const group of groups) {\n const animations = this.byGroups[group];\n\n animations.forEach(player => {\n this.checkAnimation(player, blurred, destroy);\n });\n }\n }\n\n public checkAnimation(player: AnimationItem, blurred = false, destroy = false) {\n const {el, animation, group} = player;\n //return;\n if((destroy || (!isInDOM(el) && !this.lockedGroups[group]))/* && false */) {\n this.removeAnimation(player);\n return;\n }\n\n if(blurred || (this.onlyOnePlayableGroup && this.onlyOnePlayableGroup !== group) || (animation instanceof HTMLVideoElement && this.videosLocked)) {\n if(!animation.paused) {\n //console.warn('pause animation:', animation);\n animation.pause();\n }\n } else if(animation.paused && \n this.visible.has(player) && \n animation.autoplay && \n (!this.onlyOnePlayableGroup || this.onlyOnePlayableGroup === group)\n ) {\n //console.warn('play animation:', animation);\n animation.play();\n }\n }\n\n public setOnlyOnePlayableGroup(group: string) {\n this.onlyOnePlayableGroup = group;\n }\n\n public lockGroup(group: string) {\n this.lockedGroups[group] = true;\n }\n\n public unlockGroup(group: string) {\n delete this.lockedGroups[group];\n this.checkAnimations(undefined, group);\n }\n\n public refreshGroup(group: string) {\n const animations = this.byGroups[group];\n if(animations && animations.length) {\n animations.forEach(animation => {\n this.observer.unobserve(animation.el);\n });\n\n window.requestAnimationFrame(() => {\n animations.forEach(animation => {\n this.observer.observe(animation.el);\n });\n });\n }\n }\n\n public lockIntersectionGroup(group: string) {\n this.intersectionLockedGroups[group] = true;\n }\n\n public unlockIntersectionGroup(group: string) {\n delete this.intersectionLockedGroups[group];\n this.refreshGroup(group);\n }\n}\n\nconst animationIntersector = new AnimationIntersector();\nif(MOUNT_CLASS_TO) {\n MOUNT_CLASS_TO.animationIntersector = animationIntersector;\n}\nexport default animationIntersector;","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// * Jolly Cobra's fastSmoothScroll slightly patched\n\nimport { dispatchHeavyAnimationEvent } from '../hooks/useHeavyAnimationCheck';\nimport { fastRaf } from './schedulers';\nimport { animateSingle, cancelAnimationByKey } from './animation';\nimport rootScope from '../lib/rootScope';\nimport { isInDOM } from './dom';\n\nconst MAX_DISTANCE = 1500;\nconst MIN_JS_DURATION = 250;\nconst MAX_JS_DURATION = 600;\n\nexport enum FocusDirection {\n Up,\n Down,\n Static,\n};\n\nexport default function fastSmoothScroll(\n container: HTMLElement,\n element: HTMLElement,\n position: ScrollLogicalPosition,\n margin = 0,\n maxDistance = MAX_DISTANCE,\n forceDirection?: FocusDirection,\n forceDuration?: number,\n axis: 'x' | 'y' = 'y'\n) {\n //return;\n\n if(!rootScope.settings.animationsEnabled) {\n forceDirection = FocusDirection.Static;\n }\n\n if(forceDirection === FocusDirection.Static) {\n forceDuration = 0;\n return scrollWithJs(container, element, position, margin, forceDuration, axis);\n /* return Promise.resolve();\n\n element.scrollIntoView({ block: position });\n\n cancelAnimationByKey(container);\n return Promise.resolve(); */\n }\n\n if(axis === 'y' && element !== container && isInDOM(element) && container.getBoundingClientRect) {\n const elementRect = element.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect();\n \n const offsetTop = elementRect.top - containerRect.top;\n if(forceDirection === undefined) {\n if(offsetTop < -maxDistance) {\n container.scrollTop += (offsetTop + maxDistance);\n } else if(offsetTop > maxDistance) {\n container.scrollTop += (offsetTop - maxDistance);\n }\n } else if(forceDirection === FocusDirection.Up) { // * not tested yet\n container.scrollTop = offsetTop + container.scrollTop + maxDistance;\n } else if(forceDirection === FocusDirection.Down) { // * not tested yet\n container.scrollTop = Math.max(0, offsetTop + container.scrollTop - maxDistance);\n }\n /* const { offsetTop } = element;\n\n if(forceDirection === undefined) {\n const offset = offsetTop - container.scrollTop;\n\n if(offset < -maxDistance) {\n container.scrollTop += (offset + maxDistance);\n } else if(offset > maxDistance) {\n container.scrollTop += (offset - maxDistance);\n }\n } else if(forceDirection === FocusDirection.Up) {\n container.scrollTop = offsetTop + maxDistance;\n } else if(forceDirection === FocusDirection.Down) {\n container.scrollTop = Math.max(0, offsetTop - maxDistance);\n } */\n }\n\n const promise = new Promise((resolve) => {\n fastRaf(() => {\n scrollWithJs(container, element, position, margin, forceDuration, axis)\n .then(resolve);\n });\n });\n\n return axis === 'y' ? dispatchHeavyAnimationEvent(promise) : promise;\n}\n\nfunction scrollWithJs(\n container: HTMLElement, element: HTMLElement, position: ScrollLogicalPosition, margin = 0, forceDuration?: number, axis: 'x' | 'y' = 'y'\n) {\n if(!isInDOM(element)) {\n cancelAnimationByKey(container);\n return Promise.resolve();\n }\n \n const rectStartKey = axis === 'y' ? 'top' : 'left';\n const rectEndKey = axis === 'y' ? 'bottom' : 'right';\n const sizeKey = axis === 'y' ? 'height' : 'width';\n const scrollSizeKey = axis === 'y' ? 'scrollHeight' : 'scrollWidth';\n const scrollPositionKey = axis === 'y' ? 'scrollTop' : 'scrollLeft';\n\n //const { offsetTop: elementTop, offsetHeight: elementHeight } = element;\n const elementRect = element.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect ? container.getBoundingClientRect() : document.body.getBoundingClientRect();\n\n //const transformable = container.firstElementChild as HTMLElement;\n\n const elementPosition = elementRect[rectStartKey] - containerRect[rectStartKey];\n const elementSize = element[scrollSizeKey]; // margin is exclusive in DOMRect\n\n const containerSize = containerRect[sizeKey];\n\n const scrollPosition = container[scrollPositionKey];\n const scrollSize = container[scrollSizeKey];\n /* const elementPosition = element.offsetTop;\n const elementSize = element.offsetHeight;\n\n const scrollPosition = container[scrollPositionKey];\n const scrollSize = container[scrollSizeKey];\n const containerSize = container.offsetHeight; */\n\n let path!: number;\n\n switch(position) {\n case 'start':\n path = elementPosition - margin;\n break;\n case 'end':\n path = elementRect[rectEndKey] + (elementSize - elementRect[sizeKey]) - containerRect[rectEndKey];\n break;\n // 'nearest' is not supported yet\n case 'nearest':\n case 'center':\n path = elementSize < containerSize\n ? (elementPosition + elementSize / 2) - (containerSize / 2)\n : elementPosition - margin;\n break;\n }\n /* switch (position) {\n case 'start':\n path = (elementPosition - margin) - scrollPosition;\n break;\n case 'end':\n path = (elementPosition + elementSize + margin) - (scrollPosition + containerSize);\n break;\n // 'nearest' is not supported yet\n case 'nearest':\n case 'center':\n path = elementSize < containerSize\n ? (elementPosition + elementSize / 2) - (scrollPosition + containerSize / 2)\n : (elementPosition - margin) - scrollPosition;\n break;\n } */\n\n // console.log('scrollWithJs: will scroll path:', path, element);\n\n /* let existsTransform = 0;\n const currentTransform = transformable.style.transform;\n if(currentTransform) {\n existsTransform = parseInt(currentTransform.match(/\\((.+?), (.+?), .+\\)/)[2]);\n //path += existsTransform;\n } */\n\n if(path < 0) {\n const remainingPath = -scrollPosition;\n path = Math.max(path, remainingPath);\n } else if(path > 0) {\n const remainingPath = scrollSize - (scrollPosition + containerSize);\n path = Math.min(path, remainingPath);\n }\n\n const target = container[scrollPositionKey] + path;\n const duration = forceDuration ?? (\n MIN_JS_DURATION + (Math.abs(path) / MAX_DISTANCE) * (MAX_JS_DURATION - MIN_JS_DURATION)\n );\n const startAt = Date.now();\n\n /* transformable.classList.add('no-transition');\n\n const tickTransform = () => {\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\n const currentPath = path * transition(t);\n\n transformable.style.transform = `translate3d(0, ${-currentPath}px, 0)`;\n container.dataset.translate = '' + -currentPath;\n\n const willContinue = t < 1;\n if(!willContinue) {\n fastRaf(() => {\n delete container.dataset.transform;\n container.dataset.transform = '';\n transformable.style.transform = '';\n void transformable.offsetLeft; // reflow\n transformable.classList.remove('no-transition');\n void transformable.offsetLeft; // reflow\n container[scrollPositionKey] = Math.round(target);\n });\n }\n\n return willContinue;\n };\n \n return animateSingle(tickTransform, container); */\n\n /* return new Promise((resolve) => {\n fastRaf(() => {\n transformable.style.transform = '';\n transformable.style.transition = '';\n\n setTimeout(resolve, duration);\n });\n });\n\n const transformableHeight = transformable.scrollHeight;\n //transformable.style.minHeight = `${transformableHeight}px`;\n */\n\n const tick = () => {\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\n\n const currentPath = path * (1 - transition(t));\n container[scrollPositionKey] = Math.round(target - currentPath);\n \n return t < 1;\n };\n\n if(!duration || !path) {\n cancelAnimationByKey(container);\n tick();\n return Promise.resolve();\n }\n\n /* return new Promise((resolve) => {\n setTimeout(resolve, duration);\n }).then(() => {\n transformable.classList.add('no-transition');\n void transformable.offsetLeft; // reflow\n transformable.style.transform = '';\n transformable.style.transition = '';\n void transformable.offsetLeft; // reflow\n transformable.classList.remove('no-transition');\n void transformable.offsetLeft; // reflow\n fastRaf(() => {\n \n container[scrollPositionKey] = Math.round(target);\n //transformable.style.minHeight = ``;\n });\n \n }); */\n\n return animateSingle(tick, container);\n}\n\nfunction transition(t: number) {\n return 1 - ((1 - t) ** 3.5);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport function nextRandomInt(maxValue: number) {\n return Math.floor(Math.random() * maxValue);\n}\n\nexport function randomLong() {\n return '' + nextRandomInt(0xFFFFFFFF) + nextRandomInt(0xFFFFFF);\n //return '' + parseInt(nextRandomInt(0xFFFFFFFF).toString(16) + nextRandomInt(0xFFFFFFFF).toString(16), 16);\n}\n","//import {stackBlurImage} from '../lib/StackBlur';\n//import appStateManager from \"../lib/appManagers/appStateManager\";\n/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { blurActiveElement } from \"../helpers/dom\";\nimport appStateManager from \"../lib/appManagers/appStateManager\";\nimport I18n from \"../lib/langPack\";\nimport Page from \"./page\";\n\nlet onFirstMount = () => {\n //return;\n appStateManager.pushToState('authState', {_: 'authStateSignedIn'});\n // ! TOO SLOW\n /* appStateManager.saveState(); */\n\n import('../lib/rootScope').then(m => {\n m.default.broadcast('im_mount');\n });\n\n if(!I18n.requestedServerLanguage) {\n I18n.getCacheLangPack().then(langPack => {\n if(langPack.local) {\n I18n.getLangPack(langPack.lang_code);\n }\n });\n }\n\n blurActiveElement();\n return new Promise<void>((resolve) => {\n window.requestAnimationFrame(() => {\n const promise = import('../lib/appManagers/appDialogsManager');\n promise.finally(async() => {\n //alert('pageIm!');\n resolve();\n \n //AudioContext && global.navigator && global.navigator.mediaDevices && global.navigator.mediaDevices.getUserMedia && global.WebAssembly;\n \n /* // @ts-ignore\n var AudioContext = globalThis.AudioContext || globalThis.webkitAudioContext;\n alert('AudioContext:' + typeof(AudioContext));\n // @ts-ignore\n alert('global.navigator:' + typeof(navigator));\n alert('navigator.mediaDevices:' + typeof(navigator.mediaDevices));\n alert('navigator.mediaDevices.getUserMedia:' + typeof(navigator.mediaDevices?.getUserMedia));\n alert('global.WebAssembly:' + typeof(WebAssembly)); */\n \n //(Array.from(document.getElementsByClassName('rp')) as HTMLElement[]).forEach(el => ripple(el));\n });\n });\n });\n\n //let promise = /* Promise.resolve() */.then(() => {//import('../lib/services').then(services => {\n /* fetch('assets/img/camomile.jpg')\n .then(res => res.blob())\n .then(blob => {\n let img = new Image();\n let url = URL.createObjectURL(blob);\n img.src = url;\n img.onload = () => {\n let id = 'chat-background-canvas';\n var canvas = document.getElementById(id) as HTMLCanvasElement;\n //URL.revokeObjectURL(url);\n \n let elements = ['.chat-container'].map(selector => {\n return document.querySelector(selector) as HTMLDivElement;\n });\n \n stackBlurImage(img, id, 15, 0);\n \n canvas.toBlob(blob => {\n //let dataUrl = canvas.toDataURL('image/jpeg', 1);\n let dataUrl = URL.createObjectURL(blob);\n \n elements.forEach(el => {\n el.style.backgroundImage = 'url(' + dataUrl + ')';\n });\n }, 'image/jpeg', 1);\n };\n }); */\n //});\n};\n\nconst page = new Page('page-chats', false, onFirstMount);\nexport default page;\n","/*\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 function numberThousandSplitter(x: number, joiner = ' ') {\n const parts = x.toString().split(\".\");\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, joiner);\n return parts.join(\".\");\n}\n\nexport function formatBytes(bytes: number, decimals = 2) {\n if(bytes === 0) return '0 Bytes';\n\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];\n}\n\nexport function formatNumber(bytes: number, decimals = 2) {\n if(bytes === 0) return '0';\n\n const k = 1000;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['', 'K', 'M', 'B', 'T'];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + sizes[i];\n}\n\nexport function clamp(v: number, min: number, max: number): number {\n return v < min ? min : ((v > max) ? max : v);\n}\n\n","import { fastRaf } from \"./schedulers\";\nimport { CancellablePromise, deferredPromise } from \"./cancellablePromise\";\nimport { isInDOM } from \"./dom\";\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\n\nclass SequentialDom {\n private promises: Partial<{\n read: CancellablePromise<void>,\n write: CancellablePromise<void>\n }> = {};\n private raf = fastRaf.bind(null);\n private scheduled = false;\n\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\n let promise = this.promises[kind];\n if(!promise) {\n this.scheduleFlush();\n promise = this.promises[kind] = deferredPromise<void>();\n }\n\n if(callback !== undefined) {\n promise.then(() => callback());\n }\n \n return promise;\n }\n\n public measure(callback?: VoidFunction) {\n return this.do('read', callback);\n }\n\n public mutate(callback?: VoidFunction) {\n return this.do('write', callback);\n }\n\n /**\n * Will fire instantly if element is not connected\n * @param element \n * @param callback \n */\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\n const promise = isInDOM(element) ? this.mutate() : Promise.resolve();\n\n if(callback !== undefined) {\n promise.then(() => callback());\n }\n\n return promise;\n }\n\n private scheduleFlush() {\n if(!this.scheduled) {\n this.scheduled = true;\n\n this.raf(() => {\n this.promises.read && this.promises.read.resolve();\n this.promises.write && this.promises.write.resolve();\n\n this.scheduled = false;\n this.promises = {};\n });\n }\n }\n}\n\nconst sequentialDom = new SequentialDom();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\nexport default sequentialDom;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { MOUNT_CLASS_TO } from \"./config/debug\";\n\nexport type Country = {\n phoneCode: string,\n code: string,\n name: string,\n pattern: string,\n emoji: string\n};\n\nconst Countries: Country[] = [{\"phoneCode\":\"7 840\",\"code\":\"AB\",\"name\":\"Abkhazia\",\"pattern\":\"\",\"emoji\":\"\"},{\"phoneCode\":\"93\",\"code\":\"AF\",\"name\":\"Afghanistan\",\"pattern\":\"93 XXX XXX XXX\",\"emoji\":\"🇦🇫\"},{\"phoneCode\":\"358 18\",\"code\":\"AX\",\"name\":\"Aland Islands\",\"pattern\":\"\",\"emoji\":\"🇦🇽\"},{\"phoneCode\":\"355\",\"code\":\"AL\",\"name\":\"Albania\",\"pattern\":\"355 XX XXX XXXX\",\"emoji\":\"🇦🇱\"},{\"phoneCode\":\"213\",\"code\":\"DZ\",\"name\":\"Algeria\",\"pattern\":\"213 XXX XX XX XX\",\"emoji\":\"🇩🇿\"},{\"phoneCode\":\"1 684\",\"code\":\"AS\",\"name\":\"American Samoa\",\"pattern\":\"1684 XXX XXXX\",\"emoji\":\"🇦🇸\"},{\"phoneCode\":\"376\",\"code\":\"AD\",\"name\":\"Andorra\",\"pattern\":\"376 XX XX XX\",\"emoji\":\"🇦🇩\"},{\"phoneCode\":\"244\",\"code\":\"AO\",\"name\":\"Angola\",\"pattern\":\"244 XXX XXX XXX\",\"emoji\":\"🇦🇴\"},{\"phoneCode\":\"1 264\",\"code\":\"AI\",\"name\":\"Anguilla\",\"pattern\":\"1264 XXX XXXX\",\"emoji\":\"🇦🇮\"},{\"phoneCode\":\"1 268\",\"code\":\"AG\",\"name\":\"Antigua & Barbuda\",\"pattern\":\"1268 XXX XXXX\",\"emoji\":\"🇦🇬\"},{\"phoneCode\":\"54\",\"code\":\"AR\",\"name\":\"Argentina\",\"pattern\":\"\",\"emoji\":\"🇦🇷\"},{\"phoneCode\":\"374\",\"code\":\"AM\",\"name\":\"Armenia\",\"pattern\":\"374 XX XXX XXX\",\"emoji\":\"🇦🇲\"},{\"phoneCode\":\"297\",\"code\":\"AW\",\"name\":\"Aruba\",\"pattern\":\"297 XXX XXXX\",\"emoji\":\"🇦🇼\"},{\"phoneCode\":\"247\",\"code\":\"SH\",\"name\":\"Ascension\",\"pattern\":\"290 XX XXX\",\"emoji\":\"🇸🇭\"},{\"phoneCode\":\"61\",\"code\":\"AU\",\"name\":\"Australia\",\"pattern\":\"61 XXX XXX XXX\",\"emoji\":\"🇦🇺\"},{\"phoneCode\":\"672\",\"code\":\"AU\",\"name\":\"Australian External Territories\",\"pattern\":\"61 XXX XXX XXX\",\"emoji\":\"🇦🇺\"},{\"phoneCode\":\"43\",\"code\":\"AT\",\"name\":\"Austria\",\"pattern\":\"\",\"emoji\":\"🇦🇹\"},{\"phoneCode\":\"994\",\"code\":\"AZ\",\"name\":\"Azerbaijan\",\"pattern\":\"994 XX XXX XX XX\",\"emoji\":\"🇦🇿\"},{\"phoneCode\":\"1 242\",\"code\":\"BS\",\"name\":\"Bahamas\",\"pattern\":\"1242 XXX XXXX\",\"emoji\":\"🇧🇸\"},{\"phoneCode\":\"973\",\"code\":\"BH\",\"name\":\"Bahrain\",\"pattern\":\"973 XXXX XXXX\",\"emoji\":\"🇧🇭\"},{\"phoneCode\":\"880\",\"code\":\"BD\",\"name\":\"Bangladesh\",\"pattern\":\"\",\"emoji\":\"🇧🇩\"},{\"phoneCode\":\"1 246\",\"code\":\"BB\",\"name\":\"Barbados\",\"pattern\":\"1246 XXX XXXX\",\"emoji\":\"🇧🇧\"},{\"phoneCode\":\"1 268\",\"code\":\"AG\",\"name\":\"Barbuda\",\"pattern\":\"1268 XXX XXXX\",\"emoji\":\"🇦🇬\"},{\"phoneCode\":\"375\",\"code\":\"BY\",\"name\":\"Belarus\",\"pattern\":\"375 XX XXX XXXX\",\"emoji\":\"🇧🇾\"},{\"phoneCode\":\"32\",\"code\":\"BE\",\"name\":\"Belgium\",\"pattern\":\"32 XXX XX XX XX\",\"emoji\":\"🇧🇪\"},{\"phoneCode\":\"501\",\"code\":\"BZ\",\"name\":\"Belize\",\"pattern\":\"\",\"emoji\":\"🇧🇿\"},{\"phoneCode\":\"229\",\"code\":\"BJ\",\"name\":\"Benin\",\"pattern\":\"229 XX XXX XXX\",\"emoji\":\"🇧🇯\"},{\"phoneCode\":\"1 441\",\"code\":\"BM\",\"name\":\"Bermuda\",\"pattern\":\"1441 XXX XXXX\",\"emoji\":\"🇧🇲\"},{\"phoneCode\":\"975\",\"code\":\"BT\",\"name\":\"Bhutan\",\"pattern\":\"\",\"emoji\":\"🇧🇹\"},{\"phoneCode\":\"591\",\"code\":\"BO\",\"name\":\"Bolivia\",\"pattern\":\"591 X XXX XXXX\",\"emoji\":\"🇧🇴\"},{\"phoneCode\":\"599 7\",\"code\":\"BQ\",\"name\":\"Caribbean Netherlands\",\"pattern\":\"\",\"emoji\":\"🇧🇶\"},{\"phoneCode\":\"387\",\"code\":\"BA\",\"name\":\"Bosnia & Herzegovina\",\"pattern\":\"\",\"emoji\":\"🇧🇦\"},{\"phoneCode\":\"267\",\"code\":\"BW\",\"name\":\"Botswana\",\"pattern\":\"267 XX XXX XXX\",\"emoji\":\"🇧🇼\"},{\"phoneCode\":\"55\",\"code\":\"BR\",\"name\":\"Brazil\",\"pattern\":\"55 XX XXXXX XXXX\",\"emoji\":\"🇧🇷\"},{\"phoneCode\":\"246\",\"code\":\"IO\",\"name\":\"British Indian Ocean Territory\",\"pattern\":\"246 XXX XXXX\",\"emoji\":\"🇮🇴\"},{\"phoneCode\":\"1 284\",\"code\":\"VG\",\"name\":\"British Virgin Islands\",\"pattern\":\"1284 XXX XXXX\",\"emoji\":\"🇻🇬\"},{\"phoneCode\":\"673\",\"code\":\"BN\",\"name\":\"Brunei\",\"pattern\":\"673 XXX XXXX\",\"emoji\":\"🇧🇳\"},{\"phoneCode\":\"359\",\"code\":\"BG\",\"name\":\"Bulgaria\",\"pattern\":\"\",\"emoji\":\"🇧🇬\"},{\"phoneCode\":\"226\",\"code\":\"BF\",\"name\":\"Burkina Faso\",\"pattern\":\"226 XX XX XX XX\",\"emoji\":\"🇧🇫\"},{\"phoneCode\":\"95\",\"code\":\"MM\",\"name\":\"Myanmar (Burma)\",\"pattern\":\"\",\"emoji\":\"🇲🇲\"},{\"phoneCode\":\"257\",\"code\":\"BI\",\"name\":\"Burundi\",\"pattern\":\"257 XX XX XXXX\",\"emoji\":\"🇧🇮\"},{\"phoneCode\":\"855\",\"code\":\"KH\",\"name\":\"Cambodia\",\"pattern\":\"\",\"emoji\":\"🇰🇭\"},{\"phoneCode\":\"237\",\"code\":\"CM\",\"name\":\"Cameroon\",\"pattern\":\"237 XXXX XXXX\",\"emoji\":\"🇨🇲\"},{\"phoneCode\":\"1\",\"code\":\"CA\",\"name\":\"Canada\",\"pattern\":\"1 XXX XXX XXXX\",\"emoji\":\"🇨🇦\"},{\"phoneCode\":\"238\",\"code\":\"CV\",\"name\":\"Cape Verde\",\"pattern\":\"238 XXX XXXX\",\"emoji\":\"🇨🇻\"},{\"phoneCode\":\"1 345\",\"code\":\"KY\",\"name\":\"Cayman Islands\",\"pattern\":\"1345 XXX XXXX\",\"emoji\":\"🇰🇾\"},{\"phoneCode\":\"236\",\"code\":\"CF\",\"name\":\"Central African Republic\",\"pattern\":\"236 XX XX XX XX\",\"emoji\":\"🇨🇫\"},{\"phoneCode\":\"235\",\"code\":\"TD\",\"name\":\"Chad\",\"pattern\":\"235 XX XX XX XX\",\"emoji\":\"🇹🇩\"},{\"phoneCode\":\"56\",\"code\":\"CL\",\"name\":\"Chile\",\"pattern\":\"56 X XXXX XXXX\",\"emoji\":\"🇨🇱\"},{\"phoneCode\":\"86\",\"code\":\"CN\",\"name\":\"China\",\"pattern\":\"86 XXX XXXX XXXX\",\"emoji\":\"🇨🇳\"},{\"phoneCode\":\"61\",\"code\":\"CX\",\"name\":\"Christmas Island\",\"pattern\":\"\",\"emoji\":\"🇨🇽\"},{\"phoneCode\":\"61\",\"code\":\"CC\",\"name\":\"Cocos (Keeling) Islands\",\"pattern\":\"\",\"emoji\":\"🇨🇨\"},{\"phoneCode\":\"57\",\"code\":\"CO\",\"name\":\"Colombia\",\"pattern\":\"57 XXX XXX XXXX\",\"emoji\":\"🇨🇴\"},{\"phoneCode\":\"269\",\"code\":\"KM\",\"name\":\"Comoros\",\"pattern\":\"269 XXX XXXX\",\"emoji\":\"🇰🇲\"},{\"phoneCode\":\"242\",\"code\":\"CG\",\"name\":\"Congo - Brazzaville\",\"pattern\":\"242 XX XXX XXXX\",\"emoji\":\"🇨🇬\"},{\"phoneCode\":\"243\",\"code\":\"CD\",\"name\":\"Congo - Kinshasa\",\"pattern\":\"243 XX XXX XXXX\",\"emoji\":\"🇨🇩\"},{\"phoneCode\":\"682\",\"code\":\"CK\",\"name\":\"Cook Islands\",\"pattern\":\"\",\"emoji\":\"🇨🇰\"},{\"phoneCode\":\"506\",\"code\":\"CR\",\"name\":\"Costa Rica\",\"pattern\":\"\",\"emoji\":\"🇨🇷\"},{\"phoneCode\":\"225\",\"code\":\"CI\",\"name\":\"Cote d’Ivoire\",\"pattern\":\"225 XX XXX XXX\",\"emoji\":\"🇨🇮\"},{\"phoneCode\":\"385\",\"code\":\"HR\",\"name\":\"Croatia\",\"pattern\":\"\",\"emoji\":\"🇭🇷\"},{\"phoneCode\":\"53\",\"code\":\"CU\",\"name\":\"Cuba\",\"pattern\":\"53 XXXX XXXX\",\"emoji\":\"🇨🇺\"},{\"phoneCode\":\"599 9\",\"code\":\"CW\",\"name\":\"Curacao\",\"pattern\":\"\",\"emoji\":\"🇨🇼\"},{\"phoneCode\":\"357\",\"code\":\"CY\",\"name\":\"Cyprus\",\"pattern\":\"357 XXXX XXXX\",\"emoji\":\"🇨🇾\"},{\"phoneCode\":\"420\",\"code\":\"CZ\",\"name\":\"Czech Republic\",\"pattern\":\"\",\"emoji\":\"🇨🇿\"},{\"phoneCode\":\"45\",\"code\":\"DK\",\"name\":\"Denmark\",\"pattern\":\"45 XXXX XXXX\",\"emoji\":\"🇩🇰\"},{\"phoneCode\":\"246\",\"code\":\"DG\",\"name\":\"Diego Garcia\",\"pattern\":\"\",\"emoji\":\"🇩🇬\"},{\"phoneCode\":\"253\",\"code\":\"DJ\",\"name\":\"Djibouti\",\"pattern\":\"253 XX XX XX XX\",\"emoji\":\"🇩🇯\"},{\"phoneCode\":\"1 767\",\"code\":\"DM\",\"name\":\"Dominica\",\"pattern\":\"1767 XXX XXXX\",\"emoji\":\"🇩🇲\"},{\"phoneCode\":\"1 809 and 1 829\",\"code\":\"DO\",\"name\":\"Dominican Republic\",\"pattern\":\"1 XXX XXX XXXX\",\"emoji\":\"🇩🇴\"},{\"phoneCode\":\"670\",\"code\":\"TL\",\"name\":\"Timor-Leste\",\"pattern\":\"\",\"emoji\":\"🇹🇱\"},{\"phoneCode\":\"593\",\"code\":\"EC\",\"name\":\"Ecuador\",\"pattern\":\"\",\"emoji\":\"🇪🇨\"},{\"phoneCode\":\"20\",\"code\":\"EG\",\"name\":\"Egypt\",\"pattern\":\"20 XX XXX XXXX\",\"emoji\":\"🇪🇬\"},{\"phoneCode\":\"503\",\"code\":\"SV\",\"name\":\"El Salvador\",\"pattern\":\"503 XXXX XXXX\",\"emoji\":\"🇸🇻\"},{\"phoneCode\":\"240\",\"code\":\"GQ\",\"name\":\"Equatorial Guinea\",\"pattern\":\"240 XXX XXX XXX\",\"emoji\":\"🇬🇶\"},{\"phoneCode\":\"291\",\"code\":\"ER\",\"name\":\"Eritrea\",\"pattern\":\"291 X XXX XXX\",\"emoji\":\"🇪🇷\"},{\"phoneCode\":\"372\",\"code\":\"EE\",\"name\":\"Estonia\",\"pattern\":\"\",\"emoji\":\"🇪🇪\"},{\"phoneCode\":\"251\",\"code\":\"ET\",\"name\":\"Ethiopia\",\"pattern\":\"251 XX XXX XXXX\",\"emoji\":\"🇪🇹\"},{\"phoneCode\":\"500\",\"code\":\"FK\",\"name\":\"Falkland Islands\",\"pattern\":\"\",\"emoji\":\"🇫🇰\"},{\"phoneCode\":\"298\",\"code\":\"FO\",\"name\":\"Faroe Islands\",\"pattern\":\"298 XXX XXX\",\"emoji\":\"🇫🇴\"},{\"phoneCode\":\"679\",\"code\":\"FJ\",\"name\":\"Fiji\",\"pattern\":\"\",\"emoji\":\"🇫🇯\"},{\"phoneCode\":\"358\",\"code\":\"FI\",\"name\":\"Finland\",\"pattern\":\"\",\"emoji\":\"🇫🇮\"},{\"phoneCode\":\"33\",\"code\":\"FR\",\"name\":\"France\",\"pattern\":\"33 X XX XX XX XX\",\"emoji\":\"🇫🇷\"},{\"phoneCode\":\"594\",\"code\":\"GF\",\"name\":\"French Guiana\",\"pattern\":\"\",\"emoji\":\"🇬🇫\"},{\"phoneCode\":\"689\",\"code\":\"PF\",\"name\":\"French Polynesia\",\"pattern\":\"\",\"emoji\":\"🇵🇫\"},{\"phoneCode\":\"241\",\"code\":\"GA\",\"name\":\"Gabon\",\"pattern\":\"241 X XX XX XX\",\"emoji\":\"🇬🇦\"},{\"phoneCode\":\"220\",\"code\":\"GM\",\"name\":\"Gambia\",\"pattern\":\"220 XXX XXXX\",\"emoji\":\"🇬🇲\"},{\"phoneCode\":\"995\",\"code\":\"GE\",\"name\":\"Georgia\",\"pattern\":\"\",\"emoji\":\"🇬🇪\"},{\"phoneCode\":\"49\",\"code\":\"DE\",\"name\":\"Germany\",\"pattern\":\"49 XXX XXXXXXXX\",\"emoji\":\"🇩🇪\"},{\"phoneCode\":\"233\",\"code\":\"GH\",\"name\":\"Ghana\",\"pattern\":\"\",\"emoji\":\"🇬🇭\"},{\"phoneCode\":\"350\",\"code\":\"GI\",\"name\":\"Gibraltar\",\"pattern\":\"350 XXXX XXXX\",\"emoji\":\"🇬🇮\"},{\"phoneCode\":\"30\",\"code\":\"GR\",\"name\":\"Greece\",\"pattern\":\"30 XX XXXX XXXX\",\"emoji\":\"🇬🇷\"},{\"phoneCode\":\"299\",\"code\":\"GL\",\"name\":\"Greenland\",\"pattern\":\"299 XXX XXX\",\"emoji\":\"🇬🇱\"},{\"phoneCode\":\"1 473\",\"code\":\"GD\",\"name\":\"Grenada\",\"pattern\":\"1473 XXX XXXX\",\"emoji\":\"🇬🇩\"},{\"phoneCode\":\"590\",\"code\":\"GP\",\"name\":\"Guadeloupe\",\"pattern\":\"\",\"emoji\":\"🇬🇵\"},{\"phoneCode\":\"1 671\",\"code\":\"GU\",\"name\":\"Guam\",\"pattern\":\"1671 XXX XXXX\",\"emoji\":\"🇬🇺\"},{\"phoneCode\":\"502\",\"code\":\"GT\",\"name\":\"Guatemala\",\"pattern\":\"502 X XXX XXXX\",\"emoji\":\"🇬🇹\"},{\"phoneCode\":\"44\",\"code\":\"GG\",\"name\":\"Guernsey\",\"pattern\":\"\",\"emoji\":\"🇬🇬\"},{\"phoneCode\":\"224\",\"code\":\"GN\",\"name\":\"Guinea\",\"pattern\":\"224 XXX XXX XXX\",\"emoji\":\"🇬🇳\"},{\"phoneCode\":\"245\",\"code\":\"GW\",\"name\":\"Guinea-Bissau\",\"pattern\":\"245 XXX XXXX\",\"emoji\":\"🇬🇼\"},{\"phoneCode\":\"592\",\"code\":\"GY\",\"name\":\"Guyana\",\"pattern\":\"\",\"emoji\":\"🇬🇾\"},{\"phoneCode\":\"509\",\"code\":\"HT\",\"name\":\"Haiti\",\"pattern\":\"\",\"emoji\":\"🇭🇹\"},{\"phoneCode\":\"504\",\"code\":\"HN\",\"name\":\"Honduras\",\"pattern\":\"504 XXXX XXXX\",\"emoji\":\"🇭🇳\"},{\"phoneCode\":\"852\",\"code\":\"HK\",\"name\":\"Hong Kong SAR China\",\"pattern\":\"\",\"emoji\":\"🇭🇰\"},{\"phoneCode\":\"36\",\"code\":\"HU\",\"name\":\"Hungary\",\"pattern\":\"36 XX XXX XXXX\",\"emoji\":\"🇭🇺\"},{\"phoneCode\":\"354\",\"code\":\"IS\",\"name\":\"Iceland\",\"pattern\":\"354 XXX XXXX\",\"emoji\":\"🇮🇸\"},{\"phoneCode\":\"91\",\"code\":\"IN\",\"name\":\"India\",\"pattern\":\"91 XXXXX XXXXX\",\"emoji\":\"🇮🇳\"},{\"phoneCode\":\"62\",\"code\":\"ID\",\"name\":\"Indonesia\",\"pattern\":\"\",\"emoji\":\"🇮🇩\"},{\"phoneCode\":\"98\",\"code\":\"IR\",\"name\":\"Iran\",\"pattern\":\"98 XXX XXX XXXX\",\"emoji\":\"🇮🇷\"},{\"phoneCode\":\"964\",\"code\":\"IQ\",\"name\":\"Iraq\",\"pattern\":\"964 XXX XXX XXXX\",\"emoji\":\"🇮🇶\"},{\"phoneCode\":\"353\",\"code\":\"IE\",\"name\":\"Ireland\",\"pattern\":\"353 XX XXX XXXX\",\"emoji\":\"🇮🇪\"},{\"phoneCode\":\"972\",\"code\":\"IL\",\"name\":\"Israel\",\"pattern\":\"972 XX XXX XXXX\",\"emoji\":\"🇮🇱\"},{\"phoneCode\":\"39\",\"code\":\"IT\",\"name\":\"Italy\",\"pattern\":\"39 XXX XXX XXXX\",\"emoji\":\"🇮🇹\"},{\"phoneCode\":\"1 876\",\"code\":\"JM\",\"name\":\"Jamaica\",\"pattern\":\"1876 XXX XXXX\",\"emoji\":\"🇯🇲\"},{\"phoneCode\":\"47 79\",\"code\":\"SJ\",\"name\":\"Svalbard & Jan Mayen\",\"pattern\":\"\",\"emoji\":\"🇸🇯\"},{\"phoneCode\":\"81\",\"code\":\"JP\",\"name\":\"Japan\",\"pattern\":\"81 XX XXXX XXXX\",\"emoji\":\"🇯🇵\"},{\"phoneCode\":\"44\",\"code\":\"JE\",\"name\":\"Jersey\",\"pattern\":\"\",\"emoji\":\"🇯🇪\"},{\"phoneCode\":\"962\",\"code\":\"JO\",\"name\":\"Jordan\",\"pattern\":\"962 X XXXX XXXX\",\"emoji\":\"🇯🇴\"},{\"phoneCode\":\"7 7\",\"code\":\"KZ\",\"name\":\"Kazakhstan\",\"pattern\":\"7 XXX XXX XX XX\",\"emoji\":\"🇰🇿\"},{\"phoneCode\":\"254\",\"code\":\"KE\",\"name\":\"Kenya\",\"pattern\":\"254 XXX XXX XXX\",\"emoji\":\"🇰🇪\"},{\"phoneCode\":\"686\",\"code\":\"KI\",\"name\":\"Kiribati\",\"pattern\":\"\",\"emoji\":\"🇰🇮\"},{\"phoneCode\":\"850\",\"code\":\"KP\",\"name\":\"North Korea\",\"pattern\":\"\",\"emoji\":\"🇰🇵\"},{\"phoneCode\":\"82\",\"code\":\"KR\",\"name\":\"South Korea\",\"pattern\":\"\",\"emoji\":\"🇰🇷\"},{\"phoneCode\":\"965\",\"code\":\"KW\",\"name\":\"Kuwait\",\"pattern\":\"965 XXXX XXXX\",\"emoji\":\"🇰🇼\"},{\"phoneCode\":\"996\",\"code\":\"KG\",\"name\":\"Kyrgyzstan\",\"pattern\":\"\",\"emoji\":\"🇰🇬\"},{\"phoneCode\":\"856\",\"code\":\"LA\",\"name\":\"Laos\",\"pattern\":\"\",\"emoji\":\"🇱🇦\"},{\"phoneCode\":\"371\",\"code\":\"LV\",\"name\":\"Latvia\",\"pattern\":\"371 XXX XXXXX\",\"emoji\":\"🇱🇻\"},{\"phoneCode\":\"961\",\"code\":\"LB\",\"name\":\"Lebanon\",\"pattern\":\"\",\"emoji\":\"🇱🇧\"},{\"phoneCode\":\"266\",\"code\":\"LS\",\"name\":\"Lesotho\",\"pattern\":\"266 XX XXX XXX\",\"emoji\":\"🇱🇸\"},{\"phoneCode\":\"231\",\"code\":\"LR\",\"name\":\"Liberia\",\"pattern\":\"\",\"emoji\":\"🇱🇷\"},{\"phoneCode\":\"218\",\"code\":\"LY\",\"name\":\"Libya\",\"pattern\":\"218 XX XXX XXXX\",\"emoji\":\"🇱🇾\"},{\"phoneCode\":\"423\",\"code\":\"LI\",\"name\":\"Liechtenstein\",\"pattern\":\"\",\"emoji\":\"🇱🇮\"},{\"phoneCode\":\"370\",\"code\":\"LT\",\"name\":\"Lithuania\",\"pattern\":\"370 XXX XXXXX\",\"emoji\":\"🇱🇹\"},{\"phoneCode\":\"352\",\"code\":\"LU\",\"name\":\"Luxembourg\",\"pattern\":\"\",\"emoji\":\"🇱🇺\"},{\"phoneCode\":\"853\",\"code\":\"MO\",\"name\":\"Macau SAR China\",\"pattern\":\"\",\"emoji\":\"🇲🇴\"},{\"phoneCode\":\"389\",\"code\":\"MK\",\"name\":\"Macedonia\",\"pattern\":\"\",\"emoji\":\"🇲🇰\"},{\"phoneCode\":\"261\",\"code\":\"MG\",\"name\":\"Madagascar\",\"pattern\":\"261 XX XX XXX XX\",\"emoji\":\"🇲🇬\"},{\"phoneCode\":\"265\",\"code\":\"MW\",\"name\":\"Malawi\",\"pattern\":\"\",\"emoji\":\"🇲🇼\"},{\"phoneCode\":\"60\",\"code\":\"MY\",\"name\":\"Malaysia\",\"pattern\":\"\",\"emoji\":\"🇲🇾\"},{\"phoneCode\":\"960\",\"code\":\"MV\",\"name\":\"Maldives\",\"pattern\":\"\",\"emoji\":\"🇲🇻\"},{\"phoneCode\":\"223\",\"code\":\"ML\",\"name\":\"Mali\",\"pattern\":\"223 XXXX XXXX\",\"emoji\":\"🇲🇱\"},{\"phoneCode\":\"356\",\"code\":\"MT\",\"name\":\"Malta\",\"pattern\":\"356 XX XX XX XX\",\"emoji\":\"🇲🇹\"},{\"phoneCode\":\"692\",\"code\":\"MH\",\"name\":\"Marshall Islands\",\"pattern\":\"\",\"emoji\":\"🇲🇭\"},{\"phoneCode\":\"596\",\"code\":\"MQ\",\"name\":\"Martinique\",\"pattern\":\"\",\"emoji\":\"🇲🇶\"},{\"phoneCode\":\"222\",\"code\":\"MR\",\"name\":\"Mauritania\",\"pattern\":\"222 XXXX XXXX\",\"emoji\":\"🇲🇷\"},{\"phoneCode\":\"230\",\"code\":\"MU\",\"name\":\"Mauritius\",\"pattern\":\"\",\"emoji\":\"🇲🇺\"},{\"phoneCode\":\"262\",\"code\":\"YT\",\"name\":\"Mayotte\",\"pattern\":\"\",\"emoji\":\"🇾🇹\"},{\"phoneCode\":\"52\",\"code\":\"MX\",\"name\":\"Mexico\",\"pattern\":\"\",\"emoji\":\"🇲🇽\"},{\"phoneCode\":\"691\",\"code\":\"FM\",\"name\":\"Micronesia\",\"pattern\":\"\",\"emoji\":\"🇫🇲\"},{\"phoneCode\":\"373\",\"code\":\"MD\",\"name\":\"Moldova\",\"pattern\":\"373 XX XXX XXX\",\"emoji\":\"🇲🇩\"},{\"phoneCode\":\"377\",\"code\":\"MC\",\"name\":\"Monaco\",\"pattern\":\"377 XXXX XXXX\",\"emoji\":\"🇲🇨\"},{\"phoneCode\":\"976\",\"code\":\"MN\",\"name\":\"Mongolia\",\"pattern\":\"\",\"emoji\":\"🇲🇳\"},{\"phoneCode\":\"382\",\"code\":\"ME\",\"name\":\"Montenegro\",\"pattern\":\"\",\"emoji\":\"🇲🇪\"},{\"phoneCode\":\"1 664\",\"code\":\"MS\",\"name\":\"Montserrat\",\"pattern\":\"1664 XXX XXXX\",\"emoji\":\"🇲🇸\"},{\"phoneCode\":\"212\",\"code\":\"MA\",\"name\":\"Morocco\",\"pattern\":\"212 XX XXX XXXX\",\"emoji\":\"🇲🇦\"},{\"phoneCode\":\"258\",\"code\":\"MZ\",\"name\":\"Mozambique\",\"pattern\":\"258 XX XXX XXXX\",\"emoji\":\"🇲🇿\"},{\"phoneCode\":\"264\",\"code\":\"NA\",\"name\":\"Namibia\",\"pattern\":\"264 XX XXX XXXX\",\"emoji\":\"🇳🇦\"},{\"phoneCode\":\"674\",\"code\":\"NR\",\"name\":\"Nauru\",\"pattern\":\"\",\"emoji\":\"🇳🇷\"},{\"phoneCode\":\"977\",\"code\":\"NP\",\"name\":\"Nepal\",\"pattern\":\"\",\"emoji\":\"🇳🇵\"},{\"phoneCode\":\"31\",\"code\":\"NL\",\"name\":\"Netherlands\",\"pattern\":\"31 X XX XX XX XX\",\"emoji\":\"🇳🇱\"},{\"phoneCode\":\"687\",\"code\":\"NC\",\"name\":\"New Caledonia\",\"pattern\":\"\",\"emoji\":\"🇳🇨\"},{\"phoneCode\":\"64\",\"code\":\"NZ\",\"name\":\"New Zealand\",\"pattern\":\"\",\"emoji\":\"🇳🇿\"},{\"phoneCode\":\"505\",\"code\":\"NI\",\"name\":\"Nicaragua\",\"pattern\":\"505 XXXX XXXX\",\"emoji\":\"🇳🇮\"},{\"phoneCode\":\"227\",\"code\":\"NE\",\"name\":\"Niger\",\"pattern\":\"227 XX XX XX XX\",\"emoji\":\"🇳🇪\"},{\"phoneCode\":\"234\",\"code\":\"NG\",\"name\":\"Nigeria\",\"pattern\":\"\",\"emoji\":\"🇳🇬\"},{\"phoneCode\":\"683\",\"code\":\"NU\",\"name\":\"Niue\",\"pattern\":\"\",\"emoji\":\"🇳🇺\"},{\"phoneCode\":\"672\",\"code\":\"NF\",\"name\":\"Norfolk Island\",\"pattern\":\"\",\"emoji\":\"🇳🇫\"},{\"phoneCode\":\"1 670\",\"code\":\"MP\",\"name\":\"Northern Mariana Islands\",\"pattern\":\"1670 XXX XXXX\",\"emoji\":\"🇲🇵\"},{\"phoneCode\":\"47\",\"code\":\"NO\",\"name\":\"Norway\",\"pattern\":\"47 XXXX XXXX\",\"emoji\":\"🇳🇴\"},{\"phoneCode\":\"968\",\"code\":\"OM\",\"name\":\"Oman\",\"pattern\":\"968 XXXX XXXX\",\"emoji\":\"🇴🇲\"},{\"phoneCode\":\"92\",\"code\":\"PK\",\"name\":\"Pakistan\",\"pattern\":\"92 XXX XXX XXXX\",\"emoji\":\"🇵🇰\"},{\"phoneCode\":\"680\",\"code\":\"PW\",\"name\":\"Palau\",\"pattern\":\"\",\"emoji\":\"🇵🇼\"},{\"phoneCode\":\"970\",\"code\":\"PS\",\"name\":\"Palestinian Territories\",\"pattern\":\"970 XXX XX XXXX\",\"emoji\":\"🇵🇸\"},{\"phoneCode\":\"507\",\"code\":\"PA\",\"name\":\"Panama\",\"pattern\":\"507 XXXX XXXX\",\"emoji\":\"🇵🇦\"},{\"phoneCode\":\"675\",\"code\":\"PG\",\"name\":\"Papua New Guinea\",\"pattern\":\"\",\"emoji\":\"🇵🇬\"},{\"phoneCode\":\"595\",\"code\":\"PY\",\"name\":\"Paraguay\",\"pattern\":\"595 XXX XXX XXX\",\"emoji\":\"🇵🇾\"},{\"phoneCode\":\"51\",\"code\":\"PE\",\"name\":\"Peru\",\"pattern\":\"51 XXX XXX XXX\",\"emoji\":\"🇵🇪\"},{\"phoneCode\":\"63\",\"code\":\"PH\",\"name\":\"Philippines\",\"pattern\":\"63 XXX XXX XXXX\",\"emoji\":\"🇵🇭\"},{\"phoneCode\":\"64\",\"code\":\"PN\",\"name\":\"Pitcairn Islands\",\"pattern\":\"\",\"emoji\":\"🇵🇳\"},{\"phoneCode\":\"48\",\"code\":\"PL\",\"name\":\"Poland\",\"pattern\":\"48 XXX XXX XXX\",\"emoji\":\"🇵🇱\"},{\"phoneCode\":\"351\",\"code\":\"PT\",\"name\":\"Portugal\",\"pattern\":\"351 X XXXX XXXX\",\"emoji\":\"🇵🇹\"},{\"phoneCode\":\"1 787 and 1 939\",\"code\":\"PR\",\"name\":\"Puerto Rico\",\"pattern\":\"1 XXX XXX XXXX\",\"emoji\":\"🇵🇷\"},{\"phoneCode\":\"974\",\"code\":\"QA\",\"name\":\"Qatar\",\"pattern\":\"\",\"emoji\":\"🇶🇦\"},{\"phoneCode\":\"262\",\"code\":\"RE\",\"name\":\"Reunion\",\"pattern\":\"262 XXX XXX XXX\",\"emoji\":\"🇷🇪\"},{\"phoneCode\":\"40\",\"code\":\"RO\",\"name\":\"Romania\",\"pattern\":\"40 XXX XXX XXX\",\"emoji\":\"🇷🇴\"},{\"phoneCode\":\"7\",\"code\":\"RU\",\"name\":\"Russia\",\"pattern\":\"7 XXX XXX XX XX\",\"emoji\":\"🇷🇺\"},{\"phoneCode\":\"250\",\"code\":\"RW\",\"name\":\"Rwanda\",\"pattern\":\"250 XXX XXX XXX\",\"emoji\":\"🇷🇼\"},{\"phoneCode\":\"590\",\"code\":\"BL\",\"name\":\"St. Barthelemy\",\"pattern\":\"\",\"emoji\":\"🇧🇱\"},{\"phoneCode\":\"290\",\"code\":\"SH\",\"name\":\"St. Helena\",\"pattern\":\"290 XX XXX\",\"emoji\":\"🇸🇭\"},{\"phoneCode\":\"1 869\",\"code\":\"KN\",\"name\":\"St. Kitts & Nevis\",\"pattern\":\"1869 XXX XXXX\",\"emoji\":\"🇰🇳\"},{\"phoneCode\":\"1 758\",\"code\":\"LC\",\"name\":\"St. Lucia\",\"pattern\":\"1758 XXX XXXX\",\"emoji\":\"🇱🇨\"},{\"phoneCode\":\"590\",\"code\":\"MF\",\"name\":\"St. Martin (France)\",\"pattern\":\"\",\"emoji\":\"🇲🇫\"},{\"phoneCode\":\"508\",\"code\":\"PM\",\"name\":\"St. Pierre and Miquelon\",\"pattern\":\"\",\"emoji\":\"🇵🇲\"},{\"phoneCode\":\"1 784\",\"code\":\"VC\",\"name\":\"St. Vincent and the Grenadines\",\"pattern\":\"1784 XXX XXXX\",\"emoji\":\"🇻🇨\"},{\"phoneCode\":\"685\",\"code\":\"WS\",\"name\":\"Samoa\",\"pattern\":\"\",\"emoji\":\"🇼🇸\"},{\"phoneCode\":\"378\",\"code\":\"SM\",\"name\":\"San Marino\",\"pattern\":\"378 XXX XXX XXXX\",\"emoji\":\"🇸🇲\"},{\"phoneCode\":\"239\",\"code\":\"ST\",\"name\":\"São Tome & Principe\",\"pattern\":\"239 XX XXXXX\",\"emoji\":\"🇸🇹\"},{\"phoneCode\":\"966\",\"code\":\"SA\",\"name\":\"Saudi Arabia\",\"pattern\":\"\",\"emoji\":\"🇸🇦\"},{\"phoneCode\":\"221\",\"code\":\"SN\",\"name\":\"Senegal\",\"pattern\":\"221 XX XXX XXXX\",\"emoji\":\"🇸🇳\"},{\"phoneCode\":\"381\",\"code\":\"RS\",\"name\":\"Serbia\",\"pattern\":\"381 XX XXX XXXX\",\"emoji\":\"🇷🇸\"},{\"phoneCode\":\"248\",\"code\":\"SC\",\"name\":\"Seychelles\",\"pattern\":\"248 X XX XX XX\",\"emoji\":\"🇸🇨\"},{\"phoneCode\":\"232\",\"code\":\"SL\",\"name\":\"Sierra Leone\",\"pattern\":\"232 XX XXX XXX\",\"emoji\":\"🇸🇱\"},{\"phoneCode\":\"65\",\"code\":\"SG\",\"name\":\"Singapore\",\"pattern\":\"65 XXXX XXXX\",\"emoji\":\"🇸🇬\"},{\"phoneCode\":\"599 3\",\"code\":\"BQ\",\"name\":\"Sint Eustatius\",\"pattern\":\"\",\"emoji\":\"🇧🇶\"},{\"phoneCode\":\"1 721\",\"code\":\"SX\",\"name\":\"Sint Maarten\",\"pattern\":\"1721 XXX XXXX\",\"emoji\":\"🇸🇽\"},{\"phoneCode\":\"421\",\"code\":\"SK\",\"name\":\"Slovakia\",\"pattern\":\"\",\"emoji\":\"🇸🇰\"},{\"phoneCode\":\"386\",\"code\":\"SI\",\"name\":\"Slovenia\",\"pattern\":\"\",\"emoji\":\"🇸🇮\"},{\"phoneCode\":\"677\",\"code\":\"SB\",\"name\":\"Solomon Islands\",\"pattern\":\"\",\"emoji\":\"🇸🇧\"},{\"phoneCode\":\"252\",\"code\":\"SO\",\"name\":\"Somalia\",\"pattern\":\"252 XX XXX XXX\",\"emoji\":\"🇸🇴\"},{\"phoneCode\":\"27\",\"code\":\"ZA\",\"name\":\"South Africa\",\"pattern\":\"27 XX XXX XXXX\",\"emoji\":\"🇿🇦\"},{\"phoneCode\":\"500\",\"code\":\"GS\",\"name\":\"South Georgia & South Sandwich Islands\",\"pattern\":\"\",\"emoji\":\"🇬🇸\"},{\"phoneCode\":\"995 34\",\"code\":\"\",\"name\":\"South Ossetia\",\"pattern\":\"\",\"emoji\":\"\"},{\"phoneCode\":\"211\",\"code\":\"SS\",\"name\":\"South Sudan\",\"pattern\":\"211 XX XXX XXXX\",\"emoji\":\"🇸🇸\"},{\"phoneCode\":\"34\",\"code\":\"ES\",\"name\":\"Spain\",\"pattern\":\"34 XXX XXX XXX\",\"emoji\":\"🇪🇸\"},{\"phoneCode\":\"94\",\"code\":\"LK\",\"name\":\"Sri Lanka\",\"pattern\":\"94 XX XXX XXXX\",\"emoji\":\"🇱🇰\"},{\"phoneCode\":\"249\",\"code\":\"SD\",\"name\":\"Sudan\",\"pattern\":\"249 XX XXX XXXX\",\"emoji\":\"🇸🇩\"},{\"phoneCode\":\"597\",\"code\":\"SR\",\"name\":\"Suriname\",\"pattern\":\"597 XXX XXXX\",\"emoji\":\"🇸🇷\"},{\"phoneCode\":\"47 79\",\"code\":\"SJ\",\"name\":\"Svalbard\",\"pattern\":\"\",\"emoji\":\"🇸🇯\"},{\"phoneCode\":\"268\",\"code\":\"SZ\",\"name\":\"Swaziland\",\"pattern\":\"268 XXXX XXXX\",\"emoji\":\"🇸🇿\"},{\"phoneCode\":\"46\",\"code\":\"SE\",\"name\":\"Sweden\",\"pattern\":\"46 XX XXX XXXX\",\"emoji\":\"🇸🇪\"},{\"phoneCode\":\"41\",\"code\":\"CH\",\"name\":\"Switzerland\",\"pattern\":\"41 XX XXX XXXX\",\"emoji\":\"🇨🇭\"},{\"phoneCode\":\"963\",\"code\":\"SY\",\"name\":\"Syria\",\"pattern\":\"\",\"emoji\":\"🇸🇾\"},{\"phoneCode\":\"886\",\"code\":\"TW\",\"name\":\"Taiwan\",\"pattern\":\"\",\"emoji\":\"🇹🇼\"},{\"phoneCode\":\"992\",\"code\":\"TJ\",\"name\":\"Tajikistan\",\"pattern\":\"\",\"emoji\":\"🇹🇯\"},{\"phoneCode\":\"255\",\"code\":\"TZ\",\"name\":\"Tanzania\",\"pattern\":\"255 XX XXX XXXX\",\"emoji\":\"🇹🇿\"},{\"phoneCode\":\"66\",\"code\":\"TH\",\"name\":\"Thailand\",\"pattern\":\"66 X XXXX XXXX\",\"emoji\":\"🇹🇭\"},{\"phoneCode\":\"228\",\"code\":\"TG\",\"name\":\"Togo\",\"pattern\":\"228 XX XXX XXX\",\"emoji\":\"🇹🇬\"},{\"phoneCode\":\"690\",\"code\":\"TK\",\"name\":\"Tokelau\",\"pattern\":\"\",\"emoji\":\"🇹🇰\"},{\"phoneCode\":\"676\",\"code\":\"TO\",\"name\":\"Tonga\",\"pattern\":\"\",\"emoji\":\"🇹🇴\"},{\"phoneCode\":\"1 868\",\"code\":\"TT\",\"name\":\"Trinidad & Tobago\",\"pattern\":\"1868 XXX XXXX\",\"emoji\":\"🇹🇹\"},{\"phoneCode\":\"216\",\"code\":\"TN\",\"name\":\"Tunisia\",\"pattern\":\"216 XX XXX XXX\",\"emoji\":\"🇹🇳\"},{\"phoneCode\":\"90\",\"code\":\"TR\",\"name\":\"Turkey\",\"pattern\":\"90 XXX XXX XXXX\",\"emoji\":\"🇹🇷\"},{\"phoneCode\":\"993\",\"code\":\"TM\",\"name\":\"Turkmenistan\",\"pattern\":\"993 XX XXXXXX\",\"emoji\":\"🇹🇲\"},{\"phoneCode\":\"1 649\",\"code\":\"TC\",\"name\":\"Turks & Caicos Islands\",\"pattern\":\"1649 XXX XXXX\",\"emoji\":\"🇹🇨\"},{\"phoneCode\":\"688\",\"code\":\"TV\",\"name\":\"Tuvalu\",\"pattern\":\"\",\"emoji\":\"🇹🇻\"},{\"phoneCode\":\"256\",\"code\":\"UG\",\"name\":\"Uganda\",\"pattern\":\"256 XX XXX XXXX\",\"emoji\":\"🇺🇬\"},{\"phoneCode\":\"380\",\"code\":\"UA\",\"name\":\"Ukraine\",\"pattern\":\"380 XX XXX XX XX\",\"emoji\":\"🇺🇦\"},{\"phoneCode\":\"971\",\"code\":\"AE\",\"name\":\"United Arab Emirates\",\"pattern\":\"971 XX XXX XXXX\",\"emoji\":\"🇦🇪\"},{\"phoneCode\":\"44\",\"code\":\"GB\",\"name\":\"United Kingdom\",\"pattern\":\"44 XXXX XXXXXX\",\"emoji\":\"🇬🇧\"},{\"phoneCode\":\"1\",\"code\":\"US\",\"name\":\"United States\",\"pattern\":\"1 XXX XXX XXXX\",\"emoji\":\"🇺🇸\"},{\"phoneCode\":\"598\",\"code\":\"UY\",\"name\":\"Uruguay\",\"pattern\":\"598 XXXX XXXX\",\"emoji\":\"🇺🇾\"},{\"phoneCode\":\"1 340\",\"code\":\"VI\",\"name\":\"U.S. Virgin Islands\",\"pattern\":\"1340 XXX XXXX\",\"emoji\":\"🇻🇮\"},{\"phoneCode\":\"998\",\"code\":\"UZ\",\"name\":\"Uzbekistan\",\"pattern\":\"998 XX XXXXXXX\",\"emoji\":\"🇺🇿\"},{\"phoneCode\":\"678\",\"code\":\"VU\",\"name\":\"Vanuatu\",\"pattern\":\"\",\"emoji\":\"🇻🇺\"},{\"phoneCode\":\"58\",\"code\":\"VE\",\"name\":\"Venezuela\",\"pattern\":\"58 XXX XXX XXXX\",\"emoji\":\"🇻🇪\"},{\"phoneCode\":\"39 06 698\",\"code\":\"VA\",\"name\":\"Vatican City\",\"pattern\":\"\",\"emoji\":\"🇻🇦\"},{\"phoneCode\":\"84\",\"code\":\"VN\",\"name\":\"Vietnam\",\"pattern\":\"\",\"emoji\":\"🇻🇳\"},{\"phoneCode\":\"681\",\"code\":\"WF\",\"name\":\"Wallis & Futuna\",\"pattern\":\"\",\"emoji\":\"🇼🇫\"},{\"phoneCode\":\"967\",\"code\":\"YE\",\"name\":\"Yemen\",\"pattern\":\"967 XXX XXX XXX\",\"emoji\":\"🇾🇪\"},{\"phoneCode\":\"260\",\"code\":\"ZM\",\"name\":\"Zambia\",\"pattern\":\"260 XX XXX XXXX\",\"emoji\":\"🇿🇲\"},{\"phoneCode\":\"255\",\"code\":\"\",\"name\":\"Zanzibar\",\"pattern\":\"\",\"emoji\":\"\"},{\"phoneCode\":\"263\",\"code\":\"ZW\",\"name\":\"Zimbabwe\",\"pattern\":\"263 XX XXX XXXX\",\"emoji\":\"🇿🇼\"}];\nconst PhoneCodesMain: {[phoneCode: string]: Country} = {\n '1': Countries.find(c => c.name === 'United States'),\n '44': Countries.find(c => c.name === 'United Kingdom'),\n '61': Countries.find(c => c.name === 'Australia'),\n '64': Countries.find(c => c.name === 'New Zealand'),\n '246': Countries.find(c => c.name === 'Diego Garcia'),\n '255': Countries.find(c => c.name === 'Tanzania'),\n '262': Countries.find(c => c.name === 'Reunion'),\n '500': Countries.find(c => c.name === 'Falkland Islands'),\n '590': Countries.find(c => c.name === 'Guadeloupe'),\n '672': Countries.find(c => c.name === 'Norfolk Island'),\n '1 268': Countries.find(c => c.name === 'Antigua & Barbuda'),\n};\n\n/* \nconst toInt = (str) => {\n return parseInt(str.replace(/ /g, ''));\n};\nvar arr = window.Countries.sort((a, b) => toInt(a.phoneCode) - toInt(b.phoneCode));\narr.forEach((el, idx) => {\n if(idx === (arr.length - 1)) {\n return;\n }\n\n if(toInt(arr[idx + 1].phoneCode) === toInt(el.phoneCode)) {\n console.log('duplicate', el, arr[idx + 1]);\n }\n});\n*/\n\nMOUNT_CLASS_TO.Countries = Countries;\n\nexport default Countries;\nexport {PhoneCodesMain};","/*\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 { MOUNT_CLASS_TO } from '../../config/debug';\nimport { tsNow } from '../../helpers/date';\nimport sessionStorage from '../sessionStorage';\n\nexport class ServerTimeManager {\n public timestampNow = tsNow(true);\n public midnightNoOffset = this.timestampNow - (this.timestampNow % 86400);\n public midnightOffseted = new Date();\n\n public midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000));\n\n public serverTimeOffset = 0; // in seconds\n public timeParams = {\n midnightOffset: this.midnightOffset,\n serverTimeOffset: this.serverTimeOffset\n };\n\n constructor() {\n this.midnightOffseted.setHours(0, 0, 0, 0);\n\n sessionStorage.get('server_time_offset').then((to) => {\n if(to) {\n this.serverTimeOffset = to;\n this.timeParams.serverTimeOffset = to;\n }\n });\n }\n}\n\nconst serverTimeManager = new ServerTimeManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.serverTimeManager = serverTimeManager);\nexport default serverTimeManager;\n","/*\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 type { AccountPassword, AccountPasswordInputSettings, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo } from '../../layer';\nimport type CryptoWorkerMethods from '../crypto/crypto_methods';\nimport { MOUNT_CLASS_TO } from '../../config/debug';\nimport appUsersManager from '../appManagers/appUsersManager';\nimport apiManager from './mtprotoworker';\n//import { computeCheck } from \"../crypto/srp\";\n\nexport class PasswordManager {\n public getState(): Promise<AccountPassword> {\n return apiManager.invokeApi('account.getPassword').then((result) => {\n return result;\n });\n }\n\n public updateSettings(settings: {\n hint?: string,\n email?: string,\n newPassword?: string,\n currentPassword?: string\n } = {}) {\n //state = Object.assign({}, state);\n //state.new_algo = Object.assign({}, state.new_algo);\n\n return this.getState().then(state => {\n let currentHashPromise: ReturnType<CryptoWorkerMethods['computeSRP']>;\n let newHashPromise: Promise<Uint8Array>;\n const params: AccountUpdatePasswordSettings = {\n password: null,\n new_settings: {\n _: 'account.passwordInputSettings',\n hint: settings.hint,\n email: settings.email\n }\n };\n \n if(settings.currentPassword) {\n currentHashPromise = apiManager.computeSRP(settings.currentPassword, state);\n } else {\n currentHashPromise = Promise.resolve({\n _: 'inputCheckPasswordEmpty'\n });\n }\n \n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\n salt1.randomize();\n salt1.set(newAlgo.salt1, 0);\n newAlgo.salt1 = salt1;\n \n if(settings.newPassword) {\n newHashPromise = apiManager.computeSRP(settings.newPassword, state, true) as any;\n } else {\n newHashPromise = Promise.resolve(new Uint8Array());\n }\n \n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\n params.password = hashes[0];\n params.new_settings.new_algo = newAlgo;\n params.new_settings.new_password_hash = hashes[1];\n \n return apiManager.invokeApi('account.updatePasswordSettings', params);\n });\n });\n }\n\n public check(password: string, state: AccountPassword, options: any = {}) {\n return apiManager.computeSRP(password, state).then((inputCheckPassword) => {\n //console.log('SRP', inputCheckPassword);\n return apiManager.invokeApi('auth.checkPassword', {\n password: inputCheckPassword\n }, options).then(auth => {\n if(auth._ === 'auth.authorization') {\n appUsersManager.saveApiUser(auth.user);\n apiManager.setUserAuth(auth.user.id);\n }\n\n return auth;\n });\n });\n }\n\n public confirmPasswordEmail(code: string) {\n return apiManager.invokeApi('account.confirmPasswordEmail', {code});\n }\n\n public resendPasswordEmail() {\n return apiManager.invokeApi('account.resendPasswordEmail');\n }\n\n public cancelPasswordEmail() {\n return apiManager.invokeApi('account.cancelPasswordEmail');\n }\n\n /* public requestRecovery(options: any = {}) {\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\n }\n\n public recover(code: any, options: any = {}) {\n return apiManager.invokeApi('auth.recoverPassword', {\n code\n }, options);\n } */\n}\n\nconst passwordManager = new PasswordManager();\nMOUNT_CLASS_TO.passwordManager = passwordManager;\nexport default passwordManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { LangPackKey, i18n } from \"../lib/langPack\";\n\nexport default class LoginPage {\n public element: HTMLElement;\n public container: HTMLElement;\n public imageDiv: HTMLElement;\n public inputWrapper: HTMLElement;\n public title: HTMLElement;\n public subtitle: HTMLParagraphElement;\n\n constructor(options: {\n className: string,\n withInputWrapper?: boolean,\n titleLangKey?: LangPackKey,\n subtitleLangKey?: LangPackKey,\n }) {\n this.element = document.body.querySelector('.' + options.className) as HTMLDivElement;\n //this.element = document.createElement('div');\n //this.element.className = 'page-' + options.className;\n\n this.container = document.createElement('div');\n this.container.className = 'container center-align';\n\n this.imageDiv = document.createElement('div');\n this.imageDiv.className = 'auth-image';\n\n this.title = document.createElement('h4');\n if(options.titleLangKey) {\n this.title.append(i18n(options.titleLangKey));\n }\n\n this.subtitle = document.createElement('p');\n this.subtitle.className = 'subtitle';\n if(options.subtitleLangKey) {\n this.subtitle.append(i18n(options.subtitleLangKey));\n }\n \n this.container.append(this.imageDiv, this.title, this.subtitle);\n\n if(options.withInputWrapper) {\n this.inputWrapper = document.createElement('div');\n this.inputWrapper.className = 'input-wrapper';\n this.container.append(this.inputWrapper);\n }\n\n this.element.append(this.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { whichChild } from \"../helpers/dom\";\nimport rootScope from \"../lib/rootScope\";\nimport { CancellablePromise, deferredPromise } from \"../helpers/cancellablePromise\";\nimport { dispatchHeavyAnimationEvent } from \"../hooks/useHeavyAnimationCheck\";\n\nfunction slideNavigation(tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) {\n const width = prevTabContent.getBoundingClientRect().width;\n const elements = [tabContent, prevTabContent];\n if(toRight) elements.reverse();\n elements[0].style.filter = `brightness(80%)`;\n elements[0].style.transform = `translate3d(${-width * .25}px, 0, 0)`;\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\n \n tabContent.classList.add('active');\n void tabContent.offsetWidth; // reflow\n\n tabContent.style.transform = '';\n tabContent.style.filter = '';\n\n return () => {\n prevTabContent.style.transform = prevTabContent.style.filter = '';\n };\n}\n\nfunction slideTabs(tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) {\n //window.requestAnimationFrame(() => {\n const width = prevTabContent.getBoundingClientRect().width;\n /* tabContent.style.setProperty('--width', width + 'px');\n prevTabContent.style.setProperty('--width', width + 'px');\n\n tabContent.classList.add('active'); */\n //void tabContent.offsetWidth; // reflow\n const elements = [tabContent, prevTabContent];\n if(toRight) elements.reverse();\n elements[0].style.transform = `translate3d(${-width}px, 0, 0)`;\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\n \n tabContent.classList.add('active');\n void tabContent.offsetWidth; // reflow\n \n tabContent.style.transform = '';\n //});\n \n return () => {\n prevTabContent.style.transform = '';\n };\n}\n\nexport const TransitionSlider = (content: HTMLElement, type: 'tabs' | 'navigation' | 'zoom-fade' | 'slide-fade' | 'none'/* | 'counter' */, transitionTime: number, onTransitionEnd?: (id: number) => void, isHeavy = true) => {\n let animationFunction: TransitionFunction = null;\n\n switch(type) {\n case 'tabs':\n animationFunction = slideTabs;\n break;\n case 'navigation':\n animationFunction = slideNavigation;\n break;\n /* default:\n break; */\n }\n\n content.dataset.animation = type;\n \n return Transition(content, animationFunction, transitionTime, onTransitionEnd, isHeavy);\n};\n\ntype TransitionFunction = (tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) => void | (() => void);\n\nconst Transition = (content: HTMLElement, animationFunction: TransitionFunction, transitionTime: number, onTransitionEnd?: (id: number) => void, isHeavy = true) => {\n const onTransitionEndCallbacks: Map<HTMLElement, Function> = new Map();\n let animationDeferred: CancellablePromise<void>;\n let animationStarted = 0;\n let from: HTMLElement = null;\n\n // TODO: check for transition type (transform, etc) using by animationFunction\n content.addEventListener(animationFunction ? 'transitionend' : 'animationend', (e) => {\n if((e.target as HTMLElement).parentElement !== content) {\n return;\n }\n \n //console.log('Transition: transitionend', /* content, */ e, selectTab.prevId, performance.now() - animationStarted);\n\n const callback = onTransitionEndCallbacks.get(e.target as HTMLElement);\n if(callback) callback();\n\n if(e.target !== from) {\n return;\n }\n\n if(!animationDeferred && isHeavy) return;\n\n if(animationDeferred) {\n animationDeferred.resolve();\n animationDeferred = undefined;\n }\n\n if(onTransitionEnd) {\n onTransitionEnd(selectTab.prevId());\n }\n\n content.classList.remove('animating', 'backwards', 'disable-hover');\n });\n\n function selectTab(id: number | HTMLElement, animate = true) {\n const self = selectTab;\n\n if(id instanceof HTMLElement) {\n id = whichChild(id);\n }\n \n const prevId = self.prevId();\n if(id === prevId) return false;\n\n //console.log('selectTab id:', id);\n\n const _from = from;\n const to = content.children[id] as HTMLElement;\n\n if(!rootScope.settings.animationsEnabled || prevId === -1) {\n animate = false;\n }\n\n if(!animate) {\n if(_from) _from.classList.remove('active', 'to', 'from'); \n if(to) {\n to.classList.remove('to', 'from');\n to.classList.add('active');\n }\n\n content.classList.remove('animating', 'backwards', 'disable-hover');\n\n from = to;\n\n if(onTransitionEnd) onTransitionEnd(id);\n return;\n }\n\n if(from) {\n from.classList.remove('to');\n from.classList.add('from');\n }\n\n content.classList.add('animating', 'disable-hover');\n const toRight = prevId < id;\n content.classList.toggle('backwards', !toRight);\n\n let onTransitionEndCallback: ReturnType<TransitionFunction>;\n if(!to) {\n //prevTabContent.classList.remove('active');\n } else {\n if(animationFunction) {\n onTransitionEndCallback = animationFunction(to, from, toRight);\n } else {\n to.classList.add('active');\n }\n\n to.classList.remove('from');\n to.classList.add('to');\n }\n \n if(to) {\n onTransitionEndCallbacks.set(to, () => {\n to.classList.remove('to');\n onTransitionEndCallbacks.delete(to);\n });\n }\n\n if(_from/* && false */) {\n const callback = () => {\n _from.classList.remove('active', 'from');\n\n if(onTransitionEndCallback) {\n onTransitionEndCallback();\n }\n\n onTransitionEndCallbacks.delete(_from);\n };\n\n if(to) {\n onTransitionEndCallbacks.set(_from, callback);\n } else {\n const timeout = window.setTimeout(callback, transitionTime);\n onTransitionEndCallbacks.set(_from, () => {\n clearTimeout(timeout);\n });\n }\n\n if(isHeavy) {\n if(!animationDeferred) {\n animationDeferred = deferredPromise<void>();\n animationStarted = performance.now();\n }\n \n dispatchHeavyAnimationEvent(animationDeferred, transitionTime * 2);\n }\n }\n \n from = to;\n }\n\n //selectTab.prevId = -1;\n selectTab.prevId = () => from ? whichChild(from) : -1;\n \n return selectTab;\n};\n\nexport default Transition;","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { cancelEvent } from \"../helpers/dom\";\nimport InputField, { InputFieldOptions } from \"./inputField\";\n\nexport default class PasswordInputField extends InputField {\n public passwordVisible = false;\n public toggleVisible: HTMLElement;\n public onVisibilityClickAdditional: () => void;\n\n constructor(options: InputFieldOptions = {}) {\n super({\n plainText: true,\n ...options\n });\n\n const input = this.input as HTMLInputElement;\n input.type = 'password';\n input.setAttribute('required', '');\n input.autocomplete = 'off';\n /* input.readOnly = true;\n\n input.addEventListener('focus', () => {\n input.removeAttribute('readonly');\n }, {once: true}); */\n\n // * https://stackoverflow.com/a/35949954/6758968\n const stealthy = document.createElement('input');\n stealthy.classList.add('stealthy');\n stealthy.tabIndex = -1;\n stealthy.type = 'password';\n input.parentElement.prepend(stealthy);\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\n\n const toggleVisible = this.toggleVisible = document.createElement('span');\n toggleVisible.classList.add('toggle-visible', 'tgico');\n\n this.container.classList.add('input-field-password');\n this.container.append(toggleVisible);\n\n toggleVisible.addEventListener('click', this.onVisibilityClick);\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\n }\n\n public onVisibilityClick = (e: Event) => {\n cancelEvent(e);\n this.passwordVisible = !this.passwordVisible;\n\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\n };\n}\n","/*\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 { blobConstruct } from \"../helpers/blob\";\n\nexport class FileManager {\n public blobSupported = true;\n \n constructor() {\n try {\n blobConstruct([], '');\n } catch(e) {\n this.blobSupported = false;\n }\n }\n \n public isAvailable() {\n return this.blobSupported;\n }\n \n public write(fileWriter: ReturnType<FileManager['getFakeFileWriter']>, bytes: Uint8Array | Blob | string): Promise<void> {\n if(bytes instanceof Blob) { // is file bytes\n return new Promise((resolve, reject) => {\n let fileReader = new FileReader();\n fileReader.onload = function(event) {\n let arrayBuffer = event.target.result as ArrayBuffer;\n \n let arr = new Uint8Array(arrayBuffer);\n \n fileWriter.write(arr).then(resolve, reject);\n };\n \n fileReader.readAsArrayBuffer(bytes);\n });\n } else {\n return fileWriter.write(bytes);\n }\n }\n\n public getFakeFileWriter(mimeType: string, saveFileCallback?: (blob: Blob) => Promise<Blob>) {\n const blobParts: Array<Uint8Array | string> = [];\n const fakeFileWriter = {\n write: async(part: Uint8Array | string) => {\n if(!this.blobSupported) {\n throw false;\n }\n \n blobParts.push(part);\n },\n truncate: () => {\n blobParts.length = 0;\n },\n finalize: (saveToStorage = true) => {\n const blob = blobConstruct(blobParts, mimeType);\n\n if(saveToStorage && saveFileCallback) {\n saveFileCallback(blob);\n }\n \n return blob;\n }\n };\n \n return fakeFileWriter;\n }\n}\n\nexport default new FileManager();\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from '../config/modes';\nimport { blobConstruct } from '../helpers/blob';\nimport FileManager from './filemanager';\n//import { MOUNT_CLASS_TO } from './mtproto/mtproto_config';\n//import { logger } from './polyfill';\n\nexport default class CacheStorageController {\n private static STORAGES: CacheStorageController[] = [];\n //public dbName = 'cachedFiles';\n private openDbPromise: Promise<Cache>;\n\n private useStorage = true;\n\n //private log: ReturnType<typeof logger> = logger('CS');\n\n constructor(private dbName: string) {\n if(Modes.test) {\n this.dbName += '_test';\n }\n \n this.openDatabase();\n CacheStorageController.STORAGES.push(this);\n }\n\n private openDatabase(): Promise<Cache> {\n if(this.openDbPromise) {\n return this.openDbPromise;\n }\n\n return this.openDbPromise = caches.open(this.dbName);\n }\n\n public delete(entryName: string) {\n return this.timeoutOperation((cache) => {\n return cache.delete('/' + entryName);\n });\n }\n\n public deleteAll() {\n return caches.delete(this.dbName);\n }\n\n public save(entryName: string, response: Response) {\n if(!this.useStorage) return Promise.reject('STORAGE_OFFLINE');\n\n return this.timeoutOperation((cache) => {\n return cache.put('/' + entryName, response);\n });\n }\n\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\n if(!this.useStorage) return Promise.reject('STORAGE_OFFLINE');\n\n //return Promise.resolve(blobConstruct([blob]));\n if(!(blob instanceof Blob)) {\n blob = blobConstruct(blob) as Blob;\n }\n\n return this.save(fileName, new Response(blob)).then(() => {\n return blob as Blob;\n });\n }\n\n /* public getBlobSize(blob: any) {\n return blob.size || blob.byteLength || blob.length;\n } */\n\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise<any> {\n if(!this.useStorage) return Promise.reject('STORAGE_OFFLINE');\n\n /* if(method === 'blob') {\n return Promise.reject();\n } */\n\n // const str = `get fileName: ${fileName}`;\n // console.time(str);\n return this.timeoutOperation(async(cache) => {\n const response = await cache.match('/' + fileName);\n\n if(!response || !cache) {\n //console.warn('getFile:', response, fileName);\n throw 'NO_ENTRY_FOUND';\n }\n \n const promise = response[method]();\n // promise.then(() => {\n // console.timeEnd(str);\n // });\n return promise;\n });\n }\n\n private timeoutOperation<T>(callback: (cache: Cache) => Promise<T>) {\n return new Promise<T>(async(resolve, reject) => {\n let rejected = false;\n const timeout = setTimeout(() => {\n reject();\n //console.warn('CACHESTORAGE TIMEOUT');\n rejected = true;\n }, 15e3);\n\n try {\n const cache = await this.openDatabase();\n if(!cache) {\n throw 'no cache?';\n }\n\n const res = await callback(cache);\n\n if(rejected) return;\n resolve(res);\n } catch(err) {\n reject(err);\n }\n\n clearTimeout(timeout);\n });\n }\n\n public getFileWriter(fileName: string, mimeType: string) {\n const fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\n return this.saveFile(fileName, blob);\n });\n\n return Promise.resolve(fakeWriter);\n }\n\n public static toggleStorage(enabled: boolean) {\n return Promise.all(this.STORAGES.map(storage => {\n storage.useStorage = enabled;\n \n if(!enabled) {\n return storage.deleteAll();\n }\n }));\n }\n}\n\n//const cacheStorage = new CacheStorageController(); \n//MOUNT_CLASS_TO.cacheStorage = cacheStorage;\n//export default cacheStorage;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { whichChild } from \"../helpers/dom\";\nimport { TransitionSlider } from \"./transition\";\nimport { ScrollableX } from \"./scrollable\";\nimport rootScope from \"../lib/rootScope\";\nimport { fastRaf } from \"../helpers/schedulers\";\nimport { FocusDirection } from \"../helpers/fastSmoothScroll\";\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\n\nexport function horizontalMenu(tabs: HTMLElement, content: HTMLElement, onClick?: (id: number, tabContent: HTMLDivElement, animate: boolean) => void | boolean, onTransitionEnd?: () => void, transitionTime = 250, scrollableX?: ScrollableX) {\n const selectTab = TransitionSlider(content, tabs || content.dataset.animation === 'tabs' ? 'tabs' : 'navigation', transitionTime, onTransitionEnd);\n\n if(tabs) {\n const proxy = new Proxy(selectTab, {\n apply: (target, that, args) => {\n const id = +args[0];\n const animate = args[1] !== undefined ? args[1] : true;\n \n const el = (tabs.querySelector(`[data-tab=\"${id}\"]`) || tabs.children[id]) as HTMLElement;\n selectTarget(el, id, animate);\n }\n });\n\n const selectTarget = (target: HTMLElement, id: number, animate = true) => {\n const tabContent = content.children[id] as HTMLDivElement;\n\n if(onClick) {\n const canChange = onClick(id, tabContent, animate);\n if(canChange !== undefined && !canChange) {\n return;\n }\n }\n\n if(scrollableX) {\n scrollableX.scrollIntoViewNew(target.parentElement.children[id] as HTMLElement, 'center', undefined, undefined, animate ? undefined : FocusDirection.Static, transitionTime, 'x');\n }\n\n if(!rootScope.settings.animationsEnabled) {\n animate = false;\n }\n\n const prevId = selectTab.prevId();\n if(target.classList.contains('active') || id === prevId) {\n return false;\n }\n \n const prev = tabs.querySelector(tagName.toLowerCase() + '.active') as HTMLElement;\n\n fastRaf(() => {\n prev && prev.classList.remove('active');\n });\n \n // stripe from ZINCHUK\n if(useStripe && prevId !== -1 && animate) {\n fastRaf(() => {\n const indicator = target.querySelector('i')!;\n const currentIndicator = target.parentElement.children[prevId].querySelector('i')!;\n \n currentIndicator.classList.remove('animate');\n indicator.classList.remove('animate');\n \n // We move and resize our indicator so it repeats the position and size of the previous one.\n const shiftLeft = currentIndicator.parentElement.parentElement.offsetLeft - indicator.parentElement.parentElement.offsetLeft;\n const scaleFactor = currentIndicator.clientWidth / indicator.clientWidth;\n indicator.style.transform = `translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`;\n \n //console.log(`translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`);\n \n requestAnimationFrame(() => {\n // Now we remove the transform to let it animate to its own position and size.\n indicator.classList.add('animate');\n indicator.style.transform = 'none';\n });\n });\n }\n // stripe END\n\n fastRaf(() => {\n target.classList.add('active');\n });\n \n selectTab(id, animate);\n };\n\n const useStripe = !tabs.classList.contains('no-stripe');\n\n //const tagName = tabs.classList.contains('menu-horizontal-div') ? 'BUTTON' : 'LI';\n const tagName = tabs.firstElementChild.tagName;\n tabs.addEventListener('click', function(e) {\n let target = e.target as HTMLElement;\n \n target = findUpAsChild(target, tabs);\n \n //console.log('tabs click:', target);\n \n if(!target) return false;\n\n let id: number;\n if(target.dataset.tab) {\n id = +target.dataset.tab;\n if(id === -1) {\n return false;\n }\n } else {\n id = whichChild(target);\n }\n\n selectTarget(target, id);\n });\n\n return proxy;\n }\n \n return selectTab;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function findUpAsChild(el: any, parent: any) {\n if(el.parentElement === parent) return el;\n \n while(el.parentElement) {\n el = el.parentElement;\n if(el.parentElement === parent) {\n return el;\n }\n }\n\n return null;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport lottieLoader, { RLottiePlayer } from \"../../lib/lottieLoader\";\nimport PasswordInputField from \"../passwordInputField\";\n\nexport default class PasswordMonkey {\n public container: HTMLElement;\n public animation: RLottiePlayer;\n public needFrame = 0;\n protected loadPromise: Promise<void>;\n\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\n this.container = document.createElement('div');\n this.container.classList.add('media-sticker-wrapper');\n }\n\n public load() {\n if(this.loadPromise) return this.loadPromise;\n return this.loadPromise = lottieLoader.loadAnimationFromURL({\n container: this.container,\n loop: false,\n autoplay: false,\n width: this.size,\n height: this.size,\n noCache: true\n //}, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then(_animation => {\n }, 'assets/img/TwoFactorSetupMonkeyPeek.tgs').then(_animation => {\n //return;\n this.animation = _animation;\n this.animation.addEventListener('enterFrame', currentFrame => {\n //console.log('enterFrame', currentFrame, this.needFrame);\n\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\n this.animation.setSpeed(1);\n this.animation.pause();\n } \n });\n\n this.passwordInputField.onVisibilityClickAdditional = () => {\n if(this.passwordInputField.passwordVisible) {\n this.animation.setDirection(1);\n this.animation.curFrame = 0;\n this.needFrame = 16;\n this.animation.play();\n } else {\n this.animation.setDirection(-1);\n this.animation.curFrame = 16;\n this.needFrame = 0;\n this.animation.play();\n }\n };\n\n return lottieLoader.waitForFirstFrame(_animation);\n });\n }\n\n public remove() {\n if(this.animation) {\n this.animation.remove();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// * Jolly Cobra's animation.ts\n\nimport { fastRaf } from './schedulers';\nimport { CancellablePromise, deferredPromise } from './cancellablePromise';\n\ninterface AnimationInstance {\n isCancelled: boolean;\n deferred: CancellablePromise<void>\n}\n\ntype AnimationInstanceKey = any;\nconst instances: Map<AnimationInstanceKey, AnimationInstance> = new Map();\n\nexport function createAnimationInstance(key: AnimationInstanceKey) {\n cancelAnimationByKey(key);\n\n const instance: AnimationInstance = {\n isCancelled: false, \n deferred: deferredPromise<void>()\n };\n\n instances.set(key, instance);\n instance.deferred.then(() => {\n instances.delete(key);\n });\n\n return instance;\n}\n\nexport function getAnimationInstance(key: AnimationInstanceKey) {\n return instances.get(key);\n}\n\nexport function cancelAnimationByKey(key: AnimationInstanceKey) {\n const instance = getAnimationInstance(key);\n if(instance) {\n instance.isCancelled = true;\n instance.deferred.resolve();\n }\n}\n\nexport function animateSingle(tick: Function, key: AnimationInstanceKey, instance?: AnimationInstance) {\n if(!instance) {\n instance = createAnimationInstance(key);\n }\n\n fastRaf(() => {\n if(instance.isCancelled) {\n return;\n }\n \n if(tick()) {\n animateSingle(tick, key, instance);\n } else {\n instance.deferred.resolve();\n }\n });\n\n return instance.deferred;\n}\n\nexport function animate(tick: Function) {\n fastRaf(() => {\n if(tick()) {\n animate(tick);\n }\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { putPreloader } from '../components/misc';\nimport mediaSizes from '../helpers/mediaSizes';\nimport { AccountPassword } from '../layer';\nimport appStateManager from '../lib/appManagers/appStateManager';\nimport passwordManager from '../lib/mtproto/passwordManager';\nimport Page from './page';\nimport pageIm from './pageIm';\nimport Button from '../components/button';\nimport PasswordInputField from '../components/passwordInputField';\nimport PasswordMonkey from '../components/monkeys/password';\nimport RichTextProcessor from '../lib/richtextprocessor';\nimport I18n from '../lib/langPack';\nimport LoginPage from './loginPage';\nimport { attachClickEvent, cancelEvent, htmlToSpan, replaceContent, toggleDisability } from '../helpers/dom';\n\nconst TEST = false;\nlet passwordInput: HTMLInputElement;\n\nlet onFirstMount = (): Promise<any> => {\n const page = new LoginPage({\n className: 'page-password',\n withInputWrapper: true,\n titleLangKey: 'Login.Password.Title',\n subtitleLangKey: 'Login.Password.Subtitle'\n });\n\n const btnNext = Button('btn-primary btn-color-primary');\n const btnNextI18n = new I18n.IntlElement({key: 'Login.Next'});\n\n btnNext.append(btnNextI18n.element);\n\n const passwordInputField = new PasswordInputField({\n label: 'LoginPassword',\n name: 'password'\n });\n\n passwordInput = passwordInputField.input as HTMLInputElement;\n\n page.inputWrapper.append(passwordInputField.container, btnNext);\n\n let getStateInterval: number;\n\n let getState = () => {\n // * just to check session relevance\n if(!getStateInterval) {\n getStateInterval = window.setInterval(getState, 10e3);\n }\n\n return !TEST && passwordManager.getState().then(_state => {\n state = _state;\n\n if(state.hint) {\n replaceContent(passwordInputField.label, htmlToSpan(RichTextProcessor.wrapEmojiText(state.hint)));\n } else {\n passwordInputField.setLabel();\n }\n });\n };\n\n let state: AccountPassword;\n \n const onSubmit = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n if(!passwordInput.value.length) {\n passwordInput.classList.add('error');\n return;\n }\n\n const toggle = toggleDisability([passwordInput, btnNext], true);\n let value = passwordInput.value;\n\n btnNextI18n.update({key: 'PleaseWait'});\n const preloader = putPreloader(btnNext);\n\n passwordManager.check(value, state).then((response) => {\n //console.log('passwordManager response:', response);\n \n switch(response._) {\n case 'auth.authorization':\n clearInterval(getStateInterval);\n pageIm.mount();\n if(monkey) monkey.remove();\n break;\n default:\n btnNext.removeAttribute('disabled');\n btnNextI18n.update({key: response._ as any});\n preloader.remove();\n break;\n }\n }).catch((err: any) => {\n toggle();\n passwordInputField.input.classList.add('error');\n \n switch(err.type) {\n default:\n //btnNext.innerText = err.type;\n btnNextI18n.update({key: 'PASSWORD_HASH_INVALID'});\n passwordInput.select();\n break;\n }\n\n preloader.remove();\n \n getState();\n });\n };\n \n attachClickEvent(btnNext, onSubmit);\n\n passwordInput.addEventListener('keypress', function(this, e) {\n this.classList.remove('error');\n btnNextI18n.update({key: 'Login.Next'});\n\n if(e.key === 'Enter') {\n return onSubmit();\n }\n });\n\n const size = mediaSizes.isMobile ? 100 : 166;\n const monkey = new PasswordMonkey(passwordInputField, size);\n page.imageDiv.append(monkey.container);\n return Promise.all([\n monkey.load(),\n getState()\n ]);\n};\n\nconst page = new Page('page-password', true, onFirstMount, null, () => {\n //if(!isAppleMobile) {\n passwordInput.focus();\n //}\n\n appStateManager.pushToState('authState', {_: 'authStatePassword'});\n});\n\nexport default page;\n","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"61a189906246e6afbe78.worker.js\");\n};"],"sourceRoot":""} |