tweb/public/0.32932e6b1ccf767530d6.chunk.js.map
2022-04-26 00:08:39 +03:00

1 line
111 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

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

{"version":3,"sources":["webpack:///./src/helpers/fastSmoothScroll.ts","webpack:///./src/helpers/dom/isInDOM.ts","webpack:///./src/helpers/number/clamp.ts","webpack:///./src/helpers/animation.ts","webpack:///./src/helpers/dom/findUpAsChild.ts","webpack:///./src/components/horizontalMenu.ts","webpack:///./src/helpers/calcImageInBox.ts","webpack:///./src/components/transition.ts","webpack:///./src/environment/canUseTransferables.ts","webpack:///./src/lib/rlottie/rlottiePlayer.ts","webpack:///./src/helpers/mediaSizes.ts","webpack:///./src/lib/rlottie/rlottie.worker.ts","webpack:///./src/lib/rlottie/queryableWorker.ts","webpack:///./src/lib/rlottie/lottieLoader.ts","webpack:///./src/helpers/array/indexOfAndSplice.ts","webpack:///./src/helpers/array/forEachReverse.ts","webpack:///./src/components/animationIntersector.ts","webpack:///./src/pages/pagesManager.ts","webpack:///./src/pages/page.ts","webpack:///./src/hooks/useHeavyAnimationCheck.ts","webpack:///./src/helpers/dom/whichChild.ts"],"names":["FocusDirection","fastSmoothScroll","options","undefined","margin","maxDistance","axis","settings","animationsEnabled","forceDirection","Static","forceDuration","scrollWithJs","promise","then","element","container","getNormalSize","position","Promise","resolve","rectStartKey","rectEndKey","sizeKey","scrollSizeKey","scrollPositionKey","elementRect","getBoundingClientRect","containerRect","document","body","elementPosition","elementSize","containerSize","rect","scrollPosition","scrollSize","path","fallbackToElementStartWhenCentering","Math","abs","scrollTop","remainingPath","max","min","target","absPath","duration","startAt","Date","now","transition","shortTransition","longTransition","tick","t","currentPath","round","startCallback","distanceToEnd","isInDOM","isConnected","clamp","v","instances","Map","cancelAnimationByKey","key","instance","get","getAnimationInstance","isCancelled","deferred","animateSingle","set","delete","createAnimationInstance","animate","findUpAsChild","el","parent","parentElement","horizontalMenu","tabs","content","onClick","onTransitionEnd","transitionTime","scrollableX","selectTab","dataset","animation","proxy","Proxy","apply","that","args","id","querySelector","children","selectTarget","tabContent","canChange","scrollIntoViewNew","prevId","classList","contains","prev","tagName","toLowerCase","remove","useStripe","indicator","currentIndicator","shiftLeft","offsetLeft","scaleFactor","clientWidth","style","transform","requestAnimationFrame","add","firstElementChild","addEventListener","e","tab","calcImageInBox","imageW","imageH","boxW","boxH","noZoom","boxedImageW","boxedImageH","slideNavigation","prevTabContent","toRight","width","elements","reverse","filter","offsetWidth","slideTabs","TransitionSlider","type","isHeavy","animationFunction","Transition","once","withAnimationListener","onTransitionEndCallbacks","animationDeferred","from","listenerName","onEndEvent","callback","removeEventListener","clear","overrideFrom","HTMLElement","to","timeout","clearTimeout","window","setTimeout","onTransitionEndCallback","toggle","_from","CAN_USE_TRANSFERABLES","navigator","userAgent","match","err","cache","this","name","frames","counter","height","color","toneIndex","Boolean","join","worker","super","reqId","paused","direction","speed","autoplay","loop","group","cachingDelta","i","hasOwnProperty","skipRatio","_loop","_autoplay","initFrame","inverseColor","skipFirstFrameRendering","needUpscale","skipDelta","pixelRatio","devicePixelRatio","mediaSizes","isMobile","noCache","Infinity","canvas","createElement","context","getContext","clamped","Uint8ClampedArray","imageData","ImageData","cacheName","generateName","getCache","getCacheCounter","methodName","sendQuery","data","setMainLoop","clearPendingRAF","rafId","curFrame","minFrame","maxFrame","renderFirstFrame","pause","resetCurrentFrame","requestFrame","stop","play","lottieLoader","onDestroy","releaseCache","cleanup","frame","r","g","b","length","frameNo","applyColor","applyInversing","putImageData","console","error","dispatchEvent","has","frInterval","delta","frThen","renderFrame2","renderFrame","onLap","fps","method","mainLoopForwards","mainLoopBackwards","bind","currentMethod","frameListener","listenerResults","enterFrame","playToFrame","setDirection","setSpeed","bounds","setMinMax","playToFrameOnFrameCallback","renderIfPaused","frameCount","diff","parentNode","appendChild","time","ScreenSize","MediaSize","boxSize","fitted","aspect","makeMediaSize","MediaSizes","screenSizes","mobile","value","medium","large","sizes","handhelds","regular","webpage","album","esgSticker","animatedSticker","staticSticker","emojiSticker","poll","documentName","desktop","handleResize","innerWidth","activeScreen","wasScreen","active","rAF","cancelAnimationFrame","Worker_fn","Worker","onerror","terminate","onmessage","event","queryMethodListener","queryMethodArguments","message","postMessage","queryMethod","transfer","forEach","arg","ArrayBuffer","push","buffer","isWebAssemblySupported","loadPromise","reject","loaded","workersLimit","players","workers","curWorkerNum","log","logger","Error","onPlayerLoaded","rlPlayer","debug","onLoad","warn","onFrame","onPlayerError","animationIntersector","getAnimations","checkAnimation","player","remain","params","loadAnimationFromURL","url","loadLottieWorkers","fetch","res","headers","blob","arrayBuffer","invokeCrypto","arr","blobConstruct","newParams","Object","assign","animationData","loadAnimationWorker","race","middleware","parseInt","initPlayer","addAnimation","idx","loadFromData","indexOfAndSplice","array","item","indexOf","spliced","splice","forEachReverse","visible","Set","byGroups","lockedGroups","onlyOnePlayableGroup","intersectionLockedGroups","videosLocked","observer","IntersectionObserver","entries","entry","find","p","isIntersecting","clearCache","overrideIdleGroups","doc","checkAnimations","override","found","HTMLVideoElement","src","load","unobserve","stickers","observe","blurred","destroy","groups","keys","animations","removeAnimation","idle","isIDLE","refreshGroup","pagesManager","pageId","pagesDiv","getElementById","scrollableDiv","page","onShown","isAuthPage","display","whichChild","pageEl","className","onFirstMount","onMount","installed","setPage","isAnimating","heavyAnimationPromise","promisesInQueue","dispatchHeavyAnimationEvent","promises","finally","perf","performance","_heavyAnimationPromise","isFulfilled","onHeavyAnimationEnd","interruptHeavyAnimation","getHeavyAnimationPromise","handleAnimationStart","handleAnimationEnd","listenerSetter","removeManual","elem","previousElementSibling"],"mappings":"sFAAA,iHAmBA,IAAYA,EA+BG,SAASC,EAAiBC,GAkBvC,QAjBsBC,IAAnBD,EAAQE,SACTF,EAAQE,OAAS,QAGQD,IAAxBD,EAAQG,cACTH,EAAQG,YAxCyB,WA2CfF,IAAjBD,EAAQI,OACTJ,EAAQI,KAAO,KAIb,IAAUC,SAASC,oBACrBN,EAAQO,eAAiBT,EAAeU,QAGvCR,EAAQO,iBAAmBT,EAAeU,OAE3C,OADAR,EAAQS,cAAgB,EACjBC,EAAaV,GAStB,MAAMW,EAAU,cAAiBC,KAAK,IAAMF,EAAaV,IAEzD,MAAwB,MAAjBA,EAAQI,KAAe,YAA4BO,GAAWA,EAGvE,SAASD,EAAaV,GACpB,MAAM,QAACa,EAAO,UAAEC,EAAS,cAAEC,EAAa,KAAEX,EAAI,OAAEF,EAAM,SAAEc,EAAQ,eAAET,EAAc,YAAEJ,EAAW,cAAEM,GAAiBT,EAChH,IAAI,YAAQa,GAEV,OADA,YAAqBC,GACdG,QAAQC,UAGjB,MAAMC,EAAwB,MAATf,EAAe,MAAQ,OACtCgB,EAAsB,MAAThB,EAAe,SAAW,QACvCiB,EAAmB,MAATjB,EAAe,SAAW,QACpCkB,EAAyB,MAATlB,EAAe,eAAiB,cAChDmB,EAA6B,MAATnB,EAAe,YAAc,aAGjDoB,EAAcX,EAAQY,wBACtBC,EAAgBZ,EAAUW,sBAAwBX,EAAUW,wBAA0BE,SAASC,KAAKH,wBAIpGI,EAAkBL,EAAYL,GAAgBO,EAAcP,GAC5DW,EAAcjB,EAAQS,GAEtBS,EAAgBhB,EAAgBA,EAAc,CAACiB,KAAMN,IAAkBA,EAAcL,GAE3F,IAAIY,EAAiBnB,EAAUS,GAC/B,MAAMW,EAAapB,EAAUQ,GAQ7B,IAAIa,EAEJ,OAAOnB,GACL,IAAK,QACHmB,EAAON,EAAkB3B,EACzB,MACF,IAAK,MACHiC,EAAOX,EAAYJ,GAA2DM,EAAcN,GAAclB,EAC1G,MAEF,IAAK,UACL,IAAK,SACH,GAAG4B,EAAcC,EACfI,EAAQN,EAAkBC,EAAc,EAAMC,EAAgB,MACzD,CACL,GAAG/B,EAAQoC,qCAAuCpC,EAAQoC,sCAAwCvB,EAGhG,OAFAb,EAAQa,QAAUb,EAAQoC,oCAC1BpC,EAAQgB,SAAW,QACZN,EAAaV,GAGtBmC,EAAON,EAAkB3B,GAqB/B,GAAGmC,KAAKC,IAAIH,GAAQjC,GAAU,IAAM,EAElC,OADA,YAAqBY,GACdG,QAAQC,UA4BjB,GAzBY,MAATd,QACqBH,IAAnBM,IACE4B,EAAOhC,GACR8B,EAAiBnB,EAAUyB,WAAaJ,EAAOhC,EAC/CgC,EAAOhC,GACCgC,GAAQhC,IAChB8B,EAAiBnB,EAAUyB,WAAaJ,EAAOhC,EAC/CgC,GAAQhC,IAkBXgC,EAAO,EAAG,CACX,MAAMK,GAAiBP,EACvBE,EAAOE,KAAKI,IAAIN,EAAMK,QACjB,GAAGL,EAAO,EAAG,CAClB,MAAMK,EAAgBN,GAAcD,EAAiBF,GACrDI,EAAOE,KAAKK,IAAIP,EAAMK,GAGxB,MAAMG,EAAS7B,EAAUS,GAAqBY,EACxCS,EAAUP,KAAKC,IAAIH,GACnBU,EAAWpC,UAzLK,IA0LDmC,EAxLc,KAwL4B,IAEzDE,EAAUC,KAAKC,MA0CfC,EAAaL,EAnOiB,IAmOyBM,EAAkBC,EACzEC,EAAO,KACX,MAAMC,EAAIR,EAAWR,KAAKK,KAAKK,KAAKC,MAAQF,GAAWD,EAAU,GAAK,EAEhES,EAAcnB,GAAQ,EAAIc,EAAWI,IAG3C,OAFAvC,EAAUS,GAAqBc,KAAKkB,MAAMZ,EAASW,GAE5CD,EAAI,GAGb,IAAIR,IAAaV,EAGf,OAFA,YAAqBrB,GACrBsC,IACOnC,QAAQC,UAqBjB,GAAGlB,EAAQwD,cAAe,CACxB,MAAMC,EAAgBvB,EAAaG,KAAKkB,MAAMZ,EAAS7B,EAAmB,MAATV,EAAe,eAAiB,gBACjGJ,EAAQwD,cAAc,CACpBtB,aACAD,iBACAwB,gBACAtB,OACAU,WACAnB,gBACAF,gBAIJ,OAAO,YAAc4B,EAAMtC,GAG7B,SAASqC,EAAeE,GACtB,OAAO,EAAK,SAAC,EAAIA,EAAM,GAGzB,SAASH,EAAgBG,GACvB,OAAO,EAAK,SAAC,EAAIA,EAAM,MAxRzB,SAAYvD,GACV,eACA,mBACA,uBAHF,CAAYA,MAAc,M,iCCGX,SAAS4D,EAAQ7C,GAC9B,OAAOA,aAAO,EAAPA,EAAS8C,YAvBlB,mC,iCCAe,SAASC,EAAMC,EAAWnB,EAAaD,GACpD,OAAOoB,EAAInB,EAAMA,EAAQmB,EAAIpB,EAAOA,EAAMoB,EAD5C,mC,iCCAA,0HAiBA,MAAMC,EAA0D,IAAIC,IAsB7D,SAASC,EAAqBC,GACnC,MAAMC,EALD,SAA8BD,GACnC,OAAOH,EAAUK,IAAIF,GAIJG,CAAqBH,GACnCC,IACDA,EAASG,aAAc,EACvBH,EAASI,SAASpD,WAIf,SAASqD,EAAcnB,EAAgBa,EAA2BC,GAiBvE,OAhBIA,IACFA,EA9BG,SAAiCD,GACtCD,EAAqBC,GAErB,MAAMC,EAA8B,CAClCG,aAAa,EACbC,SAAU,eAQZ,OALAR,EAAUU,IAAIP,EAAKC,GACnBA,EAASI,SAAS1D,KAAK,KACrBkD,EAAUW,OAAOR,KAGZC,EAiBMQ,CAAwBT,IAGrC,YAAQ,KACHC,EAASG,cAITjB,IACDmB,EAAcnB,EAAMa,EAAKC,GAEzBA,EAASI,SAASpD,aAIfgD,EAASI,SAGX,SAASK,EAAQvB,GACtB,YAAQ,KACHA,KACDuB,EAAQvB,O,iCChEC,SAASwB,EAAcC,EAASC,GAC7C,GAAGD,EAAGE,gBAAkBD,EAAQ,OAAOD,EAEvC,KAAMA,EAAGE,eAEP,IADAF,EAAKA,EAAGE,eACFA,gBAAkBD,EACtB,OAAOD,EAIX,OAAO,KAhBT,mC,iCCAA,wFAcO,SAASG,EACdC,EACAC,EACAC,EACAC,EACAC,EAAiB,IACjBC,GAEA,MAAMC,EAAY,YAAiBL,EAASD,GAAsC,SAA9BC,EAAQM,QAAQC,UAAuB,OAAS,aAAcJ,EAAgBD,GAElI,GAAGH,EAAM,CACP,MAAMS,EAAQ,IAAIC,MAAMJ,EAAW,CACjCK,MAAO,CAACjD,EAAQkD,EAAMC,KACpB,MAAMC,GAAMD,EAAK,GACXnB,OAAsB1E,IAAZ6F,EAAK,IAAmBA,EAAK,GAEvCjB,EAAMI,EAAKe,cAAc,cAAcD,QAAWd,EAAKgB,SAASF,GACtEG,EAAarB,EAAIkB,EAAIpB,MAInBuB,EAAe,CAACvD,EAAqBoD,EAAYpB,GAAU,KAC/D,MAAMwB,EAAajB,EAAQe,SAASF,GAEpC,GAAGZ,EAAS,CACV,MAAMiB,EAAYjB,EAAQY,EAAII,EAAYxB,GAC1C,QAAiB1E,IAAdmG,IAA4BA,EAC7B,OAIDd,GACDA,EAAYe,kBAAkB,CAC5BxF,QAAS8B,EAAOoC,cAAckB,SAASF,GACvC/E,SAAU,SACVT,eAAgBoE,OAAU1E,EAAY,IAAeO,OACrDC,cAAe4E,EACfjF,KAAM,MAIN,IAAUC,SAASC,oBACrBqE,GAAU,GAGZ,MAAM2B,EAASf,EAAUe,SACzB,GAAG3D,EAAO4D,UAAUC,SAAS,WAAaT,IAAOO,EAC/C,OAAO,EAGT,MAAMG,EAAOxB,EAAKe,cAAcU,EAAQC,cAAgB,WAExD,YAAQ,KACNF,GAAQA,EAAKF,UAAUK,OAAO,YAI7BC,IAAyB,IAAZP,GAAiB3B,GAC/B,YAAQ,KACN,MAAMmC,EAAYnE,EAAOqD,cAAc,KACjCe,EAAmBpE,EAAOoC,cAAckB,SAASK,GAAQN,cAAc,KAE7Ee,EAAiBR,UAAUK,OAAO,WAClCE,EAAUP,UAAUK,OAAO,WAG3B,MAAMI,EAAYD,EAAiBhC,cAAcA,cAAckC,WAAaH,EAAU/B,cAAcA,cAAckC,WAC5GC,EAAcH,EAAiBI,YAAcL,EAAUK,YAC7DL,EAAUM,MAAMC,UAAY,eAAeL,sBAA8BE,WAIzEI,sBAAsB,KAEpBR,EAAUP,UAAUgB,IAAI,WACxBT,EAAUM,MAAMC,UAAY,WAMlC,YAAQ,KACN1E,EAAO4D,UAAUgB,IAAI,YAGvBhC,EAAUQ,EAAIpB,IAGVkC,GAAa5B,EAAKsB,UAAUC,SAAS,aAGrCE,EAAUzB,EAAKuC,kBAAkBd,QAuBvC,OAtBAzB,EAAKwC,iBAAiB,SAAS,SAASC,GACtC,IAQI3B,EARApD,EAAS+E,EAAE/E,OAMf,GAJAA,EAAS,YAAcA,EAAQsC,IAI3BtC,EAAQ,OAAO,EAGnB,GAAGA,EAAO6C,QAAQmC,KAEhB,GADA5B,GAAMpD,EAAO6C,QAAQmC,KACV,IAAR5B,EACD,OAAO,OAGTA,EAAK,YAAWpD,GAGlBuD,EAAavD,EAAQoD,MAGhBL,EAGT,OAAOH,I,iCCnIT,8CAce,SAASqC,EAAeC,EAAgBC,EAAgBC,EAAcC,EAAcC,GAAS,GAC1G,GAAGJ,EAASE,GAAQD,EAASE,GAAQC,EACnC,OAAO,YAAcJ,EAAQC,GAG/B,IAAII,EAAcH,EACdI,EAAcH,EAsBlB,OApBIH,EAASC,EAAWC,EAAOC,EAC7BG,EAAeL,EAASC,EAAOF,EAAU,GAEzCK,EAAeL,EAASG,EAAOF,EAAU,EACtCI,EAAcH,IACfI,EAAeA,EAAcJ,EAAOG,EAAe,EACnDA,EAAcH,IASfE,GAAUC,GAAeL,GAAUM,GAAeL,IACnDI,EAAcL,EACdM,EAAcL,GAGT,YAAcI,EAAaC,GA1CpC,KA6CA,EAAeP,eAAiBA,G,iCC7ChC,6EAYA,SAASQ,EAAgBjC,EAAyBkC,EAA6BC,GAC7E,MAAMC,EAAQF,EAAe5G,wBAAwB8G,MAC/CC,EAAW,CAACrC,EAAYkC,GAY9B,OAXGC,GAASE,EAASC,UACrBD,EAAS,GAAGpB,MAAMsB,OAAS,kBAC3BF,EAAS,GAAGpB,MAAMC,UAAY,eAAwB,KAARkB,aAC9CC,EAAS,GAAGpB,MAAMC,UAAY,eAAekB,aAE7CpC,EAAWI,UAAUgB,IAAI,UACpBpB,EAAWwC,YAEhBxC,EAAWiB,MAAMC,UAAY,GAC7BlB,EAAWiB,MAAMsB,OAAS,GAEnB,KACLL,EAAejB,MAAMC,UAAYgB,EAAejB,MAAMsB,OAAS,IAInE,SAASE,EAAUzC,EAAyBkC,EAA6BC,GAWrE,MAAMC,EAAQF,EAAe5G,wBAAwB8G,MAM/CC,EAAW,CAACrC,EAAYkC,GAWhC,OAVKC,GAASE,EAASC,UACrBD,EAAS,GAAGpB,MAAMC,UAAY,gBAAgBkB,aAC9CC,EAAS,GAAGpB,MAAMC,UAAY,eAAekB,aAE7CpC,EAAWI,UAAUgB,IAAI,UACpBpB,EAAWwC,YAEhBxC,EAAWiB,MAAMC,UAAY,GAGxB,KACLgB,EAAejB,MAAMC,UAAY,IAqB9B,MAAMwB,EAAmB,CAC9B3D,EACA4D,EACAzD,EACAD,EACA2D,GAAU,KAEV,IAAIC,EAAwC,KAE5C,OAAOF,GACL,IAAK,OACHE,EAAoBJ,EACpB,MACF,IAAK,aACHI,EAAoBZ,EAQxB,OAFAlD,EAAQM,QAAQC,UAAYqD,EAErBG,EAAW/D,EAAS8D,EAAmB3D,EAAgBD,EAAiB2D,IAK3EE,EAAa,CACjB/D,EACA8D,EACA3D,EACAD,EACA2D,GAAU,EACVG,GAAO,EACPC,GAAwB,KAExB,MAAMC,EAAuD,IAAIrF,IACjE,IAAIsF,EAEAC,EAAoB,KAExB,GAAGH,EAAuB,CACxB,MAAMI,EAAeP,EAAoB,gBAAkB,eAErDQ,EAAc9B,IAGlB,GAFA,YAAYA,GAERA,EAAE/E,OAAuBoC,gBAAkBG,EAC7C,OAKF,MAAMuE,EAAWL,EAAyBjF,IAAIuD,EAAE/E,QAC7C8G,GAAUA,IAEV/B,EAAE/E,SAAW2G,KAIZD,GAAqBN,IAEtBM,IACDA,EAAkBnI,UAClBmI,OAAoBpJ,GAGnBmF,GACDA,EAAgBG,EAAUe,UAG5BpB,EAAQqB,UAAUK,OAAO,YAAa,YAAa,iBAEhDsC,IACDhE,EAAQwE,oBAAoBH,EAAcC,GAC1CF,EAAOD,OAAoBpJ,EAC3BmJ,EAAyBO,YAK7BzE,EAAQuC,iBAAiB8B,EAAcC,GAGzC,SAASjE,EAAUQ,EAA0BpB,GAAU,EAAMiF,GACxDA,IACDN,EAAOM,GAGN7D,aAAc8D,cACf9D,EAAK,YAAWA,IAGlB,MAAMO,EAASf,EAAUe,SACzB,GAAGP,IAAOO,EAAQ,OAAO,EAIzB,MAAMwD,EAAK5E,EAAQe,SAASF,GAM5B,GAJI,IAAU1F,SAASC,oBAAiC,IAAZgG,IAC1C3B,GAAU,IAGRwE,EAAuB,CACzB,MAAMY,EAAU7E,EAAQM,QAAQuE,aACjB9J,IAAZ8J,GACDC,cAAcD,UAGT7E,EAAQM,QAAQuE,QAGzB,IAAIpF,EAAS,CACX,GAAG2E,EAAMA,EAAK/C,UAAUK,OAAO,SAAU,KAAM,aAC1C,GAAGkD,EAAI,CACV,MAAML,EAAWL,EAAyBjF,IAAI2F,GAC3CL,GACDA,IAcJ,OAVGK,IACDA,EAAGvD,UAAUK,OAAO,KAAM,QAC1BkD,EAAGvD,UAAUgB,IAAI,WAGnBrC,EAAQqB,UAAUK,OAAO,YAAa,YAAa,iBAEnD0C,EAAOQ,OAEJ1E,GAAiBA,EAAgBW,IAIlCoD,IACFjE,EAAQM,QAAQuE,QAAU,GAAKE,OAAOC,WAAW,KAC/CJ,EAAGvD,UAAUK,OAAO,MACpB0C,GAAQA,EAAK/C,UAAUK,OAAO,QAC9B1B,EAAQqB,UAAUK,OAAO,YAAa,YAAa,wBAC5C1B,EAAQM,QAAQuE,SACtB1E,IAGFiE,IACDA,EAAK/C,UAAUK,OAAO,MACtB0C,EAAK/C,UAAUgB,IAAI,SAGrBrC,EAAQqB,UAAUgB,IAAI,aACtB,MAAMe,EAAUhC,EAASP,EAGzB,IAAIoE,EAqBJ,GAvBAjF,EAAQqB,UAAU6D,OAAO,aAAc9B,GAGnCwB,IAGCd,EACDmB,EAA0BnB,EAAkBc,EAAIR,EAAMhB,GAEtDwB,EAAGvD,UAAUgB,IAAI,UAGnBuC,EAAGvD,UAAUK,OAAO,QACpBkD,EAAGvD,UAAUgB,IAAI,OAGhBuC,GACDV,EAAyB5E,IAAIsF,EAAI,KAC/BA,EAAGvD,UAAUK,OAAO,MACpBwC,EAAyB3E,OAAOqF,KAIjCR,EAAqB,CACtB,MAAMe,EAAQf,EACRG,EAAW,KACfY,EAAM9D,UAAUK,OAAO,SAAU,QAE9BuD,GACDA,IAGFf,EAAyB3E,OAAO4F,IAGlC,GAAGP,EACDV,EAAyB5E,IAAI6F,EAAOZ,OAC/B,CACL,MAAMM,EAAUE,OAAOC,WAAWT,EAAUpE,GAC5C+D,EAAyB5E,IAAI6F,EAAO,KAClCL,aAAaD,GACbX,EAAyB3E,OAAO4F,KAIjCtB,IACGM,IACFA,EAAoB,eAItB,YAA4BA,EAAoC,EAAjBhE,IAInDiE,EAAOQ,EAMT,OAFAvE,EAAUe,OAAS,IAAMgD,EAAO,YAAWA,IAAS,EAE7C/D,I,8EC3RT,IAAI+E,EACJ,GAAI,IAEF,IAEEA,GADcC,UAAUC,UAAUC,MAAM,mBACT,IAAM,GACrC,MAAMC,GACNJ,GAAwB,OANbA,GAAwB,EAUxB,Q,uUC0Df,MAAMK,EAAQ,IA5Cd,MAGE,cACEC,KAAKD,MAAQ,IAAI5G,IAGZ,SAAS8G,GACd,IAAIF,EAAQC,KAAKD,MAAMxG,IAAI0G,GAQ3B,OAPIF,GACFC,KAAKD,MAAMnG,IAAIqG,EAAMF,EAAQ,CAACG,OAAQ,IAAI/G,IAAOgH,QAAS,MAK1DJ,EAAMI,QACDJ,EAAMG,OAGR,aAAaD,GAClB,MAAMF,EAAQC,KAAKD,MAAMxG,IAAI0G,GAC1BF,MAAYA,EAAMI,SACnBH,KAAKD,MAAMlG,OAAOoG,GAKf,gBAAgBA,GACrB,MAAMF,EAAQC,KAAKD,MAAMxG,IAAI0G,GAC7B,OAAOF,aAAK,EAALA,EAAOI,QAGT,aAAaF,EAActC,EAAeyC,EAAgBC,EAAqBC,GACpF,MAAO,CACLL,EACAtC,EACAyC,EAEAC,EAAQ,UAAY,GACpBC,GAAa,IACbxC,OAAOyC,SAASC,KAAK,OAQZ,MAAM,UAAsB,IA8DzC,aAAY,GAACvG,EAAE,OAAEwG,EAAM,QAAErL,IAKvBsL,OAAM,GA3DD,KAAAC,MAAQ,EAWP,KAAAhD,MAAQ,EACR,KAAAyC,OAAS,EAMV,KAAAQ,QAAS,EAET,KAAAC,UAAY,EACX,KAAAC,MAAQ,EACT,KAAAC,UAAW,EAEX,KAAAC,MAAO,EAEN,KAAAC,MAAQ,GAYR,KAAAC,aAAe,EAuBrBlB,KAAKW,QAAU,EAAqB,MACpCX,KAAK/F,GAAKA,EACV+F,KAAKS,OAASA,EAEd,IAAI,IAAIU,KAAK/L,EACR4K,KAAKoB,eAAeD,KAErBnB,KAAKmB,GAAK/L,EAAQ+L,IAgBtB,IAAIE,EAZJrB,KAAKsB,MAAQtB,KAAKgB,KAClBhB,KAAKuB,UAAYvB,KAAKe,SAGtBf,KAAKwB,UAAYpM,EAAQoM,UACzBxB,KAAKK,MAAQjL,EAAQiL,MACrBL,KAAKyB,aAAerM,EAAQqM,aAC5BzB,KAAKC,KAAO7K,EAAQ6K,KACpBD,KAAK0B,wBAA0BtM,EAAQsM,wBACvC1B,KAAKM,UAAYlL,EAAQkL,eAIAjL,IAAtBD,EAAQiM,UAAyBA,EAAYjM,EAAQiM,WAC/C,KAAc,KAAoB,MAAa,MAAerB,KAAKrC,MAAQ,KAAOqC,KAAKI,OAAS,MAAQhL,EAAQuM,cACvHN,EAAY,IAGdrB,KAAK4B,eAA0BvM,IAAdgM,EAA0B,EAAIA,EAAY,EAAI,EAM/D,MAAMQ,EAAa,OAAA7I,EAAA,GAAMqG,OAAOyC,iBAAkB,EAAG,GAClDD,EAAa,IAEXzM,EAAQuM,aACT3B,KAAKrC,MAAQlG,KAAKkB,MAAMqH,KAAKrC,MAAQkE,GACrC7B,KAAKI,OAAS3I,KAAKkB,MAAMqH,KAAKI,OAASyB,IAC/BA,EAAa,IAClB7B,KAAKrC,MAAQ,KAAOqC,KAAKI,OAAS,IAChC,MAAa2B,EAAA,EAAWC,UAGzBhC,KAAKrC,MAAQlG,KAAKkB,MAAMqH,KAAKrC,MAAQkE,GACrC7B,KAAKI,OAAS3I,KAAKkB,MAAMqH,KAAKI,OAASyB,IAC/BA,EAAa,MACrB7B,KAAKrC,MAAQlG,KAAKkB,MAAMqH,KAAKrC,OAASkE,EAAa,MACnD7B,KAAKI,OAAS3I,KAAKkB,MAAMqH,KAAKI,QAAUyB,EAAa,QAGvD7B,KAAKrC,MAAQlG,KAAKkB,MAAMqH,KAAKrC,MAAQlG,KAAKI,IAAI,IAAKgK,EAAa,MAChE7B,KAAKI,OAAS3I,KAAKkB,MAAMqH,KAAKI,OAAS3I,KAAKI,IAAI,IAAKgK,EAAa,SAQpEzM,EAAQ6M,UAEP,KAAYjC,KAAKrC,MAAQ,KAAOqC,KAAKI,OAAS,IAC/CJ,KAAKkB,aAAe,EACZlB,KAAKrC,MAAQ,KAAOqC,KAAKI,OAAS,IAC1CJ,KAAKkB,aAAegB,IAEpBlC,KAAKkB,aAAe,GAapBlB,KAAKmC,SACPnC,KAAKmC,OAASpL,SAASqL,cAAc,UACrCpC,KAAKmC,OAAOxG,UAAUgB,IAAI,WAC1BqD,KAAKmC,OAAOxE,MAAQqC,KAAKrC,MACzBqC,KAAKmC,OAAO/B,OAASJ,KAAKI,QAG5BJ,KAAKqC,QAAUrC,KAAKmC,OAAOG,WAAW,MAEnC,IACDtC,KAAKuC,QAAU,IAAIC,kBAAkBxC,KAAKrC,MAAQqC,KAAKI,OAAS,IAGlEJ,KAAKyC,UAAY,IAAIC,UAAU1C,KAAKrC,MAAOqC,KAAKI,QAE7CJ,KAAKC,MACND,KAAK2C,UAAY5C,EAAM6C,aAAa5C,KAAKC,KAAMD,KAAKrC,MAAOqC,KAAKI,OAAQJ,KAAKK,MAAOL,KAAKM,WACzFN,KAAKE,OAASH,EAAM8C,SAAS7C,KAAK2C,YAElC3C,KAAKE,OAAS,IAAI/G,IAIf,aACF6G,KAAKkB,eAAiBgB,MAItBlC,KAAK2C,WAAa5C,EAAM+C,gBAAgB9C,KAAK2C,WAAa,GAI7D3C,KAAKE,OAAOnB,SAGP,UAAUgE,KAAuB7H,GAEtC8E,KAAKS,OAAOuC,UAAUD,EAAY/C,KAAKW,SAAUzF,GAG5C,aAAa+H,GAClBjD,KAAKgD,UAAU,eAAgBC,EAAMjD,KAAKrC,MAAOqC,KAAKI,OAAQJ,KAAKM,WAG9D,OACDN,KAAKY,SAQTZ,KAAKY,QAAS,EACdZ,KAAKkD,eAGA,MAAMC,GAAkB,GAC1BnD,KAAKY,SAIRZ,KAAKY,QAAS,EACXuC,GACD/D,aAAaY,KAAKoD,QAKd,oB,MACN,OAAOpD,KAAKqD,SAAyB,QAAd,EAAArD,KAAKwB,iBAAS,QAAwB,IAAnBxB,KAAKa,UAAkBb,KAAKsD,SAAWtD,KAAKuD,SAGjF,KAAKC,GAAmB,GAC7BxD,KAAKyD,QAEL,MAAMJ,EAAWrD,KAAK0D,oBACnBF,GACDxD,KAAK2D,aAAaN,GAKf,UACLrD,KAAK4D,MAAK,GACV5D,KAAK6D,OAGA,SAAS/C,GACXd,KAAKc,QAAUA,IAIlBd,KAAKc,MAAQA,EAETd,KAAKY,QACPZ,KAAKkD,eAIF,aAAarC,GACfb,KAAKa,YAAcA,IAItBb,KAAKa,UAAYA,EAEbb,KAAKY,QACPZ,KAAKkD,eAIF,SAELY,EAAA,EAAaC,UAAU/D,KAAKW,OAC5BX,KAAKyD,QACLzD,KAAKgD,UAAU,WACZhD,KAAK2C,WAAW5C,EAAMiE,aAAahE,KAAK2C,WAC3C3C,KAAKiE,UAIC,WAAWC,GACjB,MAAOC,EAAGC,EAAGC,GAAKrE,KAAKK,MACvB,IAAI,IAAIc,EAAI,EAAGmD,EAASJ,EAAMI,OAAQnD,EAAImD,EAAQnD,GAAK,EACjC,IAAjB+C,EAAM/C,EAAI,KACX+C,EAAM/C,GAAKgD,EACXD,EAAM/C,EAAI,GAAKiD,EACfF,EAAM/C,EAAI,GAAKkD,GAKb,eAAeH,GACrB,MAAOC,EAAGC,EAAGC,GAAKrE,KAAKyB,aACvB,IAAI,IAAIN,EAAI,EAAGmD,EAASJ,EAAMI,OAAQnD,EAAImD,EAAQnD,GAAK,EACjC,IAAjB+C,EAAM/C,EAAI,IACX+C,EAAM/C,GAAKgD,EACXD,EAAM/C,EAAI,GAAKiD,EACfF,EAAM/C,EAAI,GAAKkD,EACfH,EAAM/C,EAAI,GAAK,KAEf+C,EAAM/C,EAAI,GAAK,EAKd,aAAa+C,EAA0BK,GAI5C,IACKvE,KAAKK,OACNL,KAAKwE,WAAWN,GAGflE,KAAKyB,cACNzB,KAAKyE,eAAeP,GAGtBlE,KAAKyC,UAAUQ,KAAKrJ,IAAIsK,GAIxBlE,KAAKqC,QAAQqC,aAAa1E,KAAKyC,UAAW,EAAG,GAE7C,MAAM3C,GAIN,OAHA6E,QAAQC,MAAM,mCAAoC9E,EAAkBE,KAAKrC,MAAOqC,KAAKI,QACrFJ,KAAKe,UAAW,OAChBf,KAAKyD,QAKPzD,KAAK6E,cAAc,aAAcN,GAG5B,YAAYL,EAA0BK,GAe3C,GAbGvE,KAAKkB,eAAiBqD,EAAUvE,KAAKkB,eAAiBqD,KAAavE,KAAKE,OAAO4E,IAAIP,IACpFvE,KAAKE,OAAOtG,IAAI2K,EAAS,IAAI/B,kBAAkB0B,IAY9ClE,KAAK+E,WAAY,CAClB,MAAwBC,EAAZ7M,KAAKC,MAAqB4H,KAAKiF,OAG3C,GAAGD,EAAQ,EAET,OADGhF,KAAKoD,OAAOhE,aAAaY,KAAKoD,OAC1BpD,KAAKoD,MAAQ/D,OAAOC,WAAW,KACpCU,KAAKkF,aAAahB,EAAOK,IACxBvE,KAAK+E,YAAcC,GAASA,EAAQhF,KAAK+E,WAAa/E,KAAK+E,YAKlE/E,KAAKkF,aAAahB,EAAOK,GAGpB,aAAaA,GAClB,MAAML,EAAQlE,KAAKE,OAAO3G,IAAIgL,GAC3BL,EACDlE,KAAKmF,YAAYjB,EAAOK,IAErBvE,KAAKuC,UAAYvC,KAAKuC,QAAQ+B,SAC/BtE,KAAKuC,QAAU,IAAIC,kBAAkBxC,KAAKrC,MAAQqC,KAAKI,OAAS,IAGlEJ,KAAKgD,UAAU,cAAeuB,EAASvE,KAAKuC,UAIxC,QAGN,QAAIvC,KAAKgB,OACPhB,KAAKyD,OAAM,IACJ,GAMH,mBACN,MAAM,UAAC7B,EAAS,SAAE2B,GAAYvD,KACxBkE,EAASlE,KAAKqD,SAAWzB,EAAa2B,EAAWvD,KAAKqD,SAAYrD,KAAKgB,KAAOhB,KAAKsD,SAAWtD,KAAKuD,SAAYvD,KAAKqD,UAAYzB,EAItI,OADA5B,KAAK2D,aAAaO,KACdA,EAAQtC,EAAa2B,IAChBvD,KAAKoF,QAMR,oBACN,MAAM,UAACxD,EAAS,SAAE0B,GAAYtD,KACxBkE,EAASlE,KAAKqD,SAAWzB,EAAa0B,EAAWtD,KAAKqD,SAAYrD,KAAKgB,KAAOhB,KAAKuD,SAAWvD,KAAKsD,SAAYtD,KAAKqD,UAAYzB,EAItI,OADA5B,KAAK2D,aAAaO,KACdA,EAAQtC,EAAa0B,IAChBtD,KAAKoF,QAMT,cAELhG,aAAaY,KAAKoD,OAElBpD,KAAK+E,WAAa,IAAO/E,KAAKqF,IAAMrF,KAAKc,MAAQd,KAAK4B,UACtD5B,KAAKiF,OAAS9M,KAAKC,MAAQ4H,KAAK+E,WAIhC,MAAMO,GAA6B,IAAnBtF,KAAKa,UAAkBb,KAAKuF,iBAAmBvF,KAAKwF,mBAAmBC,KAAKzF,MAQ5F,GAPAA,KAAK0F,cAAgBJ,EAOlBtF,KAAK2F,cAAe,MAEHtQ,IADC2K,KAAK4F,gBAAgBC,YAEtC7F,KAAK2F,cAAc3F,KAAKqD,WASvB,SAASjO,GAKd4K,KAAKyD,QAEL,MAAM,KAAC/E,EAAI,GAAEQ,EAAE,SAAEL,GAAYzJ,EAG7B,OAFA4K,KAAKqD,SAAW3E,EAAO,EAEhBsB,KAAK8F,YAAY,CACtB5B,MAAOhF,EACP2B,UAAW3B,EAAKR,EAAO,GAAK,EAC5BG,aAIG,YAAYzJ,GAMjB4K,KAAKyD,QAEL,MAAM,MAACS,EAAK,MAAEpD,EAAK,SAAEjC,EAAQ,UAAEgC,GAAazL,EAC5C4K,KAAK+F,kBAA2B1Q,IAAdwL,EAA0Bb,KAAKqD,SAAWa,GAAS,EAAI,EAAIrD,QACnExL,IAAVyL,GAAuBd,KAAKgG,SAASlF,GAErC,MAAMmF,EAAS,CAACjG,KAAKqD,SAAUa,IACR,IAApBlE,KAAKa,WAAkBoF,EAAOpI,UAEjCmC,KAAKgB,MAAO,EACZhB,KAAKkG,UAAUD,EAAO,GAAIA,EAAO,IAE9BjG,KAAKmG,4BACNnG,KAAKlB,oBAAoB,aAAckB,KAAKmG,4BAG3CtH,IACDmB,KAAKmG,2BAA8B5B,IAC9BA,IAAYL,IACblE,KAAKlB,oBAAoB,aAAckB,KAAKmG,4BAC5CtH,MAIJmB,KAAKnD,iBAAiB,aAAcmD,KAAKmG,6BAG3CnG,KAAK6D,OAGA,SAASxD,EAAqB+F,GACnCpG,KAAKK,MAAQA,EAEV+F,GAAkBpG,KAAKY,QACxBZ,KAAKkF,aAAalF,KAAKyC,UAAUQ,KAAMjD,KAAKqD,UAIzC,gBAAgBhD,GACrBL,KAAKyB,aAAepB,EAGd,UAAUiD,EAAW,EAAGC,EAAWvD,KAAKqG,WAAa,GAC3DrG,KAAKsD,SAAWA,EAChBtD,KAAKuD,SAAWA,EAGL,OAAO8C,EAAoBhB,G,yCACtCrF,KAAKqG,WAAaA,EAClBrG,KAAKqF,IAAMA,EACXrF,KAAKkG,iBACiB7Q,IAAnB2K,KAAKwB,YACNxB,KAAKwB,UAAY,OAAAxI,EAAA,GAAMgH,KAAKwB,UAAWxB,KAAKsD,SAAUtD,KAAKuD,WAG7D,MAAMF,EAAWrD,KAAK0D,oBAGtB,GAAG1D,KAAKqF,IAAM,IAAyB,IAAnBrF,KAAK4B,UAAiB,CACxC,MAAM0E,EAAO,GAAKjB,EAClBrF,KAAK4B,UAAY5B,KAAK4B,UAAY0E,EAAO,EAG3CtG,KAAK+E,WAAa,IAAO/E,KAAKqF,IAAMrF,KAAKc,MAAQd,KAAK4B,UACtD5B,KAAKiF,OAAS9M,KAAKC,MAAQ4H,KAAK+E,YAyB/B/E,KAAK0B,yBAA2B1B,KAAK2D,aAAaN,GACnDrD,KAAK6E,cAAc,SACnB7E,KAAKnD,iBAAiB,aAAc,KAClCmD,KAAK6E,cAAc,eAEf7E,KAAKmC,OAAOoE,YAAcvG,KAAK/F,IACjC+F,KAAK/F,GAAGuM,YAAYxG,KAAKmC,QAM3BnC,KAAK2F,cAAgB,KACnB,GAAG3F,KAAKY,OACN,OAGF,MAAM6F,EAAOtO,KAAKC,MAQlB4H,KAAKiF,OAASwB,EAAOzG,KAAK+E,WACN/E,KAAK0F,iBACL1F,KAAKgB,OAAQhB,KAAKe,WACpCf,KAAKe,UAAW,IAIpBf,KAAKnD,iBAAiB,aAAcmD,KAAK2F,eAGvB,SAAf3F,KAAKiB,OAAoBjB,KAAKe,UAC/Bf,KAAK6D,QAEN,CAACvF,MAAM,QAtkBG,EAAAqC,MAAQ,G,gCCzFzB,wEA+CY+F,EA/CZ,wBAUO,MAAMC,EACX,YAAmBhJ,EAAQ,EAAUyC,EAASzC,GAA3B,KAAAA,QAAkB,KAAAyC,SAI9B,OAAOwG,EAAoBC,GAChC,OAAO,YAAe7G,KAAKrC,MAAOqC,KAAKI,OAAQwG,EAAQjJ,MAAOiJ,EAAQxG,OAAQyG,GAGzE,aAAaD,GAClB,OAAO5G,KAAK8G,OAAOF,GAAS,GAGvB,cAAcA,GACnB,OAAO5G,KAAK8G,OAAOF,GAAS,IAIzB,SAASG,EAAcpJ,EAAgByC,GAC5C,OAAO,IAAIuG,EAAUhJ,EAAOyC,IAkB9B,SAAYsG,GACV,uBACA,uBACA,qBAHF,CAAYA,MAAU,KAUtB,MAAMM,UAAmB,IA0CvB,cACEtG,QAvCM,KAAAuG,YAAkD,CACxD,CAAC5N,IAAKqN,EAAWQ,OAAQC,MATT,KAUhB,CAAC9N,IAAKqN,EAAWU,OAAQD,MATT,MAUhB,CAAC9N,IAAKqN,EAAWW,MAAOF,MATT,OAYT,KAAAG,MAA0D,CAChEC,UAAW,CACTC,QAAST,EAAc,IAAK,KAC5BU,QAASV,EAAc,IAAK,KAC5BW,MAAOX,EAAc,IAAK,GAC1BY,WAAYZ,EAAc,GAAI,IAC9Ba,gBAAiBb,EAAc,IAAK,KACpCc,cAAed,EAAc,IAAK,KAClCe,aAAcf,EAAc,IAAK,KACjCgB,KAAMhB,EAAc,IAAK,GACzBpO,MAAOoO,EAAc,IAAK,KAC1BiB,aAAcjB,EAAc,IAAK,IAEnCkB,QAAS,CACPT,QAAST,EAAc,IAAK,KAC5BU,QAASV,EAAc,IAAK,KAC5BW,MAAOX,EAAc,IAAK,GAC1BY,WAAYZ,EAAc,GAAI,IAC9Ba,gBAAiBb,EAAc,IAAK,KACpCc,cAAed,EAAc,IAAK,KAClCe,aAAcf,EAAc,IAAK,KACjCgB,KAAMhB,EAAc,IAAK,GACzBpO,MAAOoO,EAAc,IAAK,KAC1BiB,aAAcjB,EAAc,IAAK,KAI9B,KAAA/E,UAAW,EAkBV,KAAAkG,aAAe,KACrB,MAAMC,EAAa9I,OAAO8I,WAG1B,IAAIC,EAAepI,KAAKiH,YAAY,GAAG5N,IACvC,IAAI,IAAI8H,EAAInB,KAAKiH,YAAY3C,OAAS,EAAGnD,GAAK,IAAKA,EACjD,GAAGnB,KAAKiH,YAAY9F,GAAGgG,MAAQgB,EAAY,CACzCC,GAAgBpI,KAAKiH,YAAY9F,EAAI,IAAMnB,KAAKiH,YAAY9F,IAAI9H,IAChE,MAIJ,MAAMgP,EAAYrI,KAAKoI,aACvBpI,KAAKoI,aAAeA,EACpBpI,KAAKgC,SAAWhC,KAAKoI,eAAiB1B,EAAWQ,OACjDlH,KAAKsI,OAAStI,KAAKgC,SAAWhC,KAAKsH,MAAMC,UAAYvH,KAAKsH,MAAMW,QAO7DI,IAAcD,QAGE/S,IAAdgT,GACDrI,KAAK6E,cAAc,eAAgBwD,EAAWD,QAIjC/S,IAAdgT,GACDrI,KAAK6E,cAAc,WAzCrBxF,OAAOxC,iBAAiB,SAAU,KAC7BmD,KAAKuI,KAAKlJ,OAAOmJ,qBAAqBxI,KAAKuI,KAC9CvI,KAAKuI,IAAMlJ,OAAO3C,sBAAsB,KACtCsD,KAAKkI,eACLlI,KAAKuI,IAAM,MAGfvI,KAAKkI,gBA+CT,MAAMnG,EAAa,IAAIiF,EACvB,IAAejF,WAAaA,EACb,O,gCC9JA,SAAS0G,IACtB,OAAO,IAAIC,OAAO,IAA0B,wD,iECQ/B,MAAM,UAAwB,IAO3C,YAAoBjI,GAClBC,QADkB,KAAAD,SAGlBT,KAAKS,OAAOkI,QAAW/D,IACrB,IACE5E,KAAK6E,cAAc,cAAeD,GAClC5E,KAAKiE,UACLjE,KAAK4I,YACL,MAAM9I,MAKVE,KAAKS,OAAOoI,UAAaC,IACvB9I,KAAK6E,cAAciE,EAAM7F,KAAK8F,uBAAwBD,EAAM7F,KAAK+F,uBAI9D,YAAYC,GACjBjJ,KAAKS,OAAOyI,YAAYD,GAGnB,YACLjJ,KAAKS,OAAOmI,YAGP,UAAUO,KAAwBjO,GACvC,GAAG,IACD8E,KAAKS,OAAOyI,YAAY,CACtBC,YAAaA,EACbH,qBAAsB9N,QAEnB,CACL,MAAMkO,EAA8C,GACpDlO,EAAKmO,QAAQC,IACRA,aAAeC,aAChBH,EAASI,KAAKF,GAGG,iBAAV,GAAsBA,EAAIG,kBAAkBF,aACnDH,EAASI,KAAKF,EAAIG,UAKtBzJ,KAAKS,OAAOyI,YAAY,CACtBC,YAAaA,EACbH,qBAAsB9N,GACrBkO,K,kTC6KT,MAAMtF,EAAe,IAvNd,MAAP,cACU,KAAA4F,uBAAiD,oBAAlB,YAC/B,KAAAC,YAA8B3J,KAAK0J,4BAA4CrU,EAAnBgB,QAAQuT,SACpE,KAAAC,QAAS,EAET,KAAAC,aAAe,EACf,KAAAC,QAA4C,GAE5C,KAAAC,QAA6B,GAC7B,KAAAC,aAAe,EAEf,KAAAC,IAAM,OAAAC,EAAA,GAAO,SAAU,IAASC,OAqIhC,KAAAC,eAAiB,CAAC1J,EAAe0F,EAAoBhB,KAC3D,MAAMiF,EAAWtK,KAAK+J,QAAQpJ,GAC1B2J,GAKJtK,KAAKkK,IAAIK,MAAM,kBACfD,EAASE,OAAOnE,EAAYhB,IAL1BrF,KAAKkK,IAAIO,KAAK,sCAAuC9J,EAAO0F,IAWxD,KAAAqE,QAAU,CAAC/J,EAAe4D,EAAiBL,KACjD,MAAMoG,EAAWtK,KAAK+J,QAAQpJ,GAC1B2J,QAKoBjV,IAArBiV,EAAS/H,UACV+H,EAAS/H,QAAU2B,GAGrBoG,EAASnF,YAAYjB,EAAOK,IAR1BvE,KAAKkK,IAAIO,KAAK,+BAAgC9J,EAAO4D,IAWjD,KAAAoG,cAAgB,CAAChK,EAAeiE,KACtC,MAAM0F,EAAWtK,KAAK+J,QAAQpJ,GAC9B,GAAG2J,EAAU,CAEQM,EAAA,EAAqBC,cAAcP,EAASrQ,IACpDoP,QAAQxO,IACjB+P,EAAA,EAAqBE,eAAejQ,GAAW,GAAM,OArKpD,aAAa5E,GAClB,IAAI,MAAMkL,KAAKnB,KAAK+J,QAClB,GAAG/J,KAAK+J,QAAQ5I,GAAGlH,KAAOhE,EACxB,OAAO+J,KAAK+J,QAAQ5I,GAIxB,OAAO,KAGF,QAAQH,GACb,IAAI,MAAMG,KAAKnB,KAAK+J,QAAS,CAC3B,MAAMgB,EAAS/K,KAAK+J,QAAQ5I,GAC5B4J,EAAO/J,KAAOA,EACd+J,EAAOhK,SAAWgK,EAAOxJ,WAItB,oBACL,OAAGvB,KAAK2J,YACC3J,KAAK2J,YAGP3J,KAAK2J,YAAc,IAAItT,QAAQ,CAACC,EAASsT,KAC9C,IAAIoB,EAAShL,KAAK8J,aAClB,IAAI,IAAI3I,EAAI,EAAGA,EAAInB,KAAK8J,eAAgB3I,EAAG,CACzC,MAAMV,EAAST,KAAKgK,QAAQ7I,GAAK,IAAI,EAAgB,IAAI,GAEzDV,EAAO5D,iBAAiB,QAAS,KAC/BmD,KAAKkK,IAAI,WAAa/I,EAAI,UAE1BV,EAAO5D,iBAAiB,QAASmD,KAAK0K,SACtCjK,EAAO5D,iBAAiB,SAAUmD,KAAKqK,gBACvC5J,EAAO5D,iBAAiB,QAASmD,KAAK2K,iBAEpCK,EACEA,IACFhL,KAAKkK,IAAI,iBACT5T,IACA0J,KAAK6J,QAAS,IAEf,CAACvL,MAAM,IAEVmC,EAAO5D,iBAAiB,cAAgB+H,IACtCgF,EAAO,uBAAyBhF,EAAMqE,SACtCjJ,KAAK6J,QAAS,GACb,CAACvL,MAAM,OAKT,qBAAqB2M,EAAwDhL,GAElF,OADCgL,EAA0BhL,KAAOA,EAC3BD,KAAKkL,qBAAqBD,EAAQ,cAAgBhL,EAAO,SAG3D,qBAAqBgL,EAA+CE,GACzE,OAAInL,KAAK0J,wBAIL1J,KAAK6J,QACP7J,KAAKoL,oBAGAC,MAAMF,GACZnV,KAAKsV,GACAA,EAAIC,SAA+C,6BAApCD,EAAIC,QAAQhS,IAAI,gBAG1B+R,EAAIE,OAFJF,EAAIG,cAAczV,KAAKiN,GAAQ,IAAWyI,aAAa,iBAAkBzI,IAAOjN,KAAK2V,GAAO,OAAAC,EAAA,GAAcD,EAAmB,MAQvI3V,KAAKwV,IACJ,MAAMK,EAAYC,OAAOC,OAAOd,EAAQ,CAACe,cAAeR,EAAM7J,aAAa,IAE3E,OADIkK,EAAU5L,OAAM4L,EAAU5L,KAAOkL,GAC9BnL,KAAKiM,oBAAoBJ,MArBzB7L,KAAK2J,YAyBT,kBAAkBoB,GACvB,OAAO1U,QAAQ6V,KAAK,CAMlB,IAAI7V,QAAeC,IACjByU,EAAOlO,iBAAiB,aAAcvG,EAAS,CAACgI,MAAM,MAExD,OAAAmF,EAAA,GAAM,QACLzN,KAAK,IAAM+U,GAGH,oBAAoBE,EAAwBhK,EAAQgK,EAAOhK,OAAS,GAAIkL,G,yCACnF,IAAInM,KAAK0J,uBACP,OAAO1J,KAAK2J,YAQd,GAJI3J,KAAK6J,eACD7J,KAAKoL,qBAGVe,IAAeA,IAChB,MAAM,IAAI/B,MAAM,cAQlB,GALIa,EAAOtN,OAAUsN,EAAO7K,SAC1B6K,EAAOtN,MAAQyO,SAASnB,EAAO/U,UAAUsG,MAAMmB,OAC/CsN,EAAO7K,OAASgM,SAASnB,EAAO/U,UAAUsG,MAAM4D,UAG9C6K,EAAOtN,QAAUsN,EAAO7K,OAC1B,MAAM,IAAIgK,MAAM,wBAGlBa,EAAOhK,MAAQA,EAEf,MAAM8J,EAAS/K,KAAKqM,WAAWpB,EAAO/U,UAAW+U,GAMjD,MAJa,SAAVhK,GACD2J,EAAA,EAAqB0B,aAAavB,EAAQ9J,GAGrC8J,KA0CF,UAAUpK,UACRX,KAAK+J,QAAQpJ,GAGf,iBACLX,KAAKgK,QAAQX,QAAQ,CAAC5I,EAAQ8L,KAC5B9L,EAAOmI,YACP5I,KAAKkK,IAAI,WAAaqC,EAAM,iBAG9BvM,KAAKkK,IAAI,qBACTlK,KAAKgK,QAAQ1F,OAAS,EAGhB,WAAWrK,EAAiB7E,GAClC,MAAMkV,EAAW,IAAI,IAAc,CACjCrQ,KACAwG,OAAQT,KAAKgK,QAAQhK,KAAKiK,gBAC1B7U,YAUF,OAPA4K,KAAK+J,QAAQO,EAAS3J,OAAS2J,EAC5BtK,KAAKiK,cAAgBjK,KAAKgK,QAAQ1F,SACnCtE,KAAKiK,aAAe,GAGtBK,EAASkC,aAAapX,EAAQ4W,eAEvB1B,IAKX,IAAexG,aAAeA,EACf,O,gCC/OA,SAAS2I,EAAoBC,EAAiBC,GAC3D,MAAMJ,EAAMG,EAAME,QAAQD,GACpBE,GAAmB,IAATN,GAAcG,EAAMI,OAAOP,EAAK,GAChD,OAAOM,GAAWA,EAAQ,GAH5B,mC,gCCAe,SAASE,EAAkBL,EAAiB7N,GACzD,IAAI,IAA2BsC,EAAduL,EAAMpI,OAAqB,EAAGnD,GAAK,IAAKA,EACvDtC,EAAS6N,EAAMvL,GAAIA,EAAGuL,GAF1B,mC,gCCAA,2DAwOA,MAAM9B,EAAuB,IApNtB,MAYL,cAVQ,KAAAoC,QAA8B,IAAIC,IAGlC,KAAAC,SAA+C,GAC/C,KAAAC,aAAwC,GACxC,KAAAC,qBAA+B,GAE/B,KAAAC,yBAAoD,GACpD,KAAAC,cAAe,EAGrBtN,KAAKuN,SAAW,IAAIC,qBAAsBC,IAGxC,IAAI,MAAMC,KAASD,EAAS,CAC1B,MAAM1V,EAAS2V,EAAM3V,OAErB,IAAI,MAAMkJ,KAASjB,KAAKkN,SAAU,CAChC,GAAGlN,KAAKqN,yBAAyBpM,GAC/B,SAGF,MAAM8J,EAAS/K,KAAKkN,SAASjM,GAAO0M,KAAKC,GAAKA,EAAE3T,KAAOlC,GACvD,GAAGgT,EAAQ,CACT,GAAG2C,EAAMG,eACP7N,KAAKgN,QAAQrQ,IAAIoO,GACjB/K,KAAK8K,eAAeC,GAAQ,OAMvB,CACL/K,KAAKgN,QAAQnT,OAAOkR,GACpB/K,KAAK8K,eAAeC,GAAQ,GAE5B,MAAMlQ,EAAYkQ,EAAOlQ,UACtBA,aAAqB,KAEtBA,EAAUiT,aAQd,WAMR9N,KAAK+N,mBAAqB,IAAId,IAE9B,IAAUpQ,iBAAiB,aAAc,EAAEmR,UACzB,UAAbA,EAAI9P,OACL8B,KAAKsN,cAAe,EACpBtN,KAAKiO,qBAIT,IAAUpR,iBAAiB,cAAe,KACrCmD,KAAKsN,eACNtN,KAAKsN,cAAe,EACpBtN,KAAKiO,qBAKJ,qBAAqBhN,EAAeiN,GACtCA,EAAUlO,KAAK+N,mBAAmBpR,IAAIsE,GACpCjB,KAAK+N,mBAAmBlU,OAAOoH,GAG/B,cAAchL,GACnB,MAAMkY,EAAyB,GAC/B,IAAI,MAAMlN,KAASjB,KAAKkN,SACtB,IAAI,MAAMnC,KAAU/K,KAAKkN,SAASjM,GAC7B8J,EAAO9Q,KAAOhE,GACfkY,EAAM3E,KAAKuB,GAKjB,OAAOoD,EAGF,gBAAgBpD,GAErB,MAAM,GAAC9Q,EAAE,UAAEY,GAAakQ,EACxBlQ,EAAUmB,SAEPnB,aAAqBuT,kBAAoB,KAC1C9O,WAAW,KACTzE,EAAUwT,IAAM,GAChBxT,EAAUyT,QACT,KAGL,MAAMrN,EAAQjB,KAAKkN,SAASnC,EAAO9J,OAChCA,IACD,YAAiBA,EAAO8J,GACpB9J,EAAMqD,eACDtE,KAAKkN,SAASnC,EAAO9J,QAIhCjB,KAAKuN,SAASgB,UAAUtU,GACxB+F,KAAKgN,QAAQnT,OAAOkR,GAGf,aAAalQ,EAA6CoG,EAAQ,I,MACvE,MAAM8J,EAAS,CACb9Q,GAAIY,aAAqB,IAAgBA,EAAUZ,GAAKY,EACxDA,UAAWA,EACXoG,SAGCpG,aAAqB,MAClB,IAAUpF,SAAS+Y,SAASxN,MAAQnG,EAAUmG,OAChDnG,EAAUmG,KAAO,IAAUvL,SAAS+Y,SAASxN,OAI5B,QAApB,EAAAhB,KAAKkN,SAASjM,UAAM,QAAKjB,KAAKkN,SAASjM,GAAS,IAAKuI,KAAKuB,GAC3D/K,KAAKuN,SAASkB,QAAQ1D,EAAO9Q,IAGxB,gBAAgByU,EAAmBzN,EAAgB0N,GAAU,GAGlE,QAAatZ,IAAV4L,IAAwBjB,KAAKkN,SAASjM,GAEvC,OAGF,MAAM2N,OAAmBvZ,IAAV4L,EAAqC,CAACA,GAAS6K,OAAO+C,KAAK7O,KAAKkN,UAE/E,IAAI,MAAMjM,KAAS2N,EAAQ,CACzB,MAAME,EAAa9O,KAAKkN,SAASjM,GAEjC,YAAe6N,EAAa/D,IAC1B/K,KAAK8K,eAAeC,EAAQ2D,EAASC,MAKpC,eAAe5D,EAAuB2D,GAAU,EAAOC,GAAU,GACtE,MAAM,GAAC1U,EAAE,UAAEY,EAAS,MAAEoG,GAAS8J,EAE3B4D,IAAa,YAAQ1U,KAAQ+F,KAAKmN,aAAalM,GACjDjB,KAAK+O,gBAAgBhE,GAIpB2D,GAAY1O,KAAKoN,sBAAwBpN,KAAKoN,uBAAyBnM,GAAWpG,aAAqBuT,kBAAoBpO,KAAKsN,aAC7HzS,EAAU+F,QAEZ/F,EAAU4I,UAEJ5I,EAAU+F,QAClBZ,KAAKgN,QAAQlI,IAAIiG,IACjBlQ,EAAUkG,WACRf,KAAKoN,sBAAwBpN,KAAKoN,uBAAyBnM,GAC3D,IAAU+N,KAAKC,SAAUjP,KAAK+N,mBAAmBjJ,IAAIiG,EAAO9J,QAG9DpG,EAAUgJ,OAIP,wBAAwB5C,GAC7BjB,KAAKoN,qBAAuBnM,EAGvB,UAAUA,GACfjB,KAAKmN,aAAalM,IAAS,EAGtB,YAAYA,UACVjB,KAAKmN,aAAalM,GACzBjB,KAAKiO,qBAAgB5Y,EAAW4L,GAG3B,aAAaA,GAClB,MAAM6N,EAAa9O,KAAKkN,SAASjM,GAC9B6N,GAAcA,EAAWxK,SAC1BwK,EAAWzF,QAAQxO,IACjBmF,KAAKuN,SAASgB,UAAU1T,EAAUZ,MAGpCoF,OAAO3C,sBAAsB,KAC3BoS,EAAWzF,QAAQxO,IACjBmF,KAAKuN,SAASkB,QAAQ5T,EAAUZ,SAMjC,sBAAsBgH,GAC3BjB,KAAKqN,yBAAyBpM,IAAS,EAGlC,wBAAwBA,UACtBjB,KAAKqN,yBAAyBpM,GACrCjB,KAAKkP,aAAajO,KAKnB,MACD,IAAe2J,qBAAuBA,GAEzB,O,+GC1Kf,MAAMuE,EAAe,IArDrB,MAQE,cAPQ,KAAAC,QAAU,EAQhBpP,KAAKqP,SAAWtY,SAASuY,eAAe,cACxCtP,KAAKuP,cAAgBvP,KAAKqP,SAASjU,cAAc,eACjD4E,KAAKrF,UAAY,OAAAP,EAAA,GAAe,KAAM4F,KAAKuP,cAAcnU,cAAc,mBAAsC,KAAM,K,OACrG,QAAT,EAAA4E,KAAKwP,YAAI,eAAEC,UACZzP,KAAKwP,KAAKC,YAKT,QAAQD,GACb,GAAGA,EAAKE,WAAY,CAClB1P,KAAKqP,SAAS7S,MAAMmT,QAAU,GAE9B,IAAIxU,EAAK,OAAAyU,EAAA,GAAWJ,EAAKK,QACzB,GAAG7P,KAAKoP,SAAWjU,EAAI,OAEvB6E,KAAKrF,UAAUQ,IAEK,IAAjB6E,KAAKoP,QAAiBjU,EAAK,GAC5B2I,EAAA,EAAasH,oBAKfpL,KAAKoP,OAASjU,EAEX6E,KAAKuP,eACN,OAAApa,EAAA,GAAiB,CACfe,UAAW8J,KAAKuP,cAChBtZ,QAAS+J,KAAKuP,cAAc3S,kBAC5BxG,SAAU,eAId4J,KAAKqP,SAAS7S,MAAMmT,QAAU,OAC9BH,EAAKK,OAAOrT,MAAMmT,QAAU,GAE5B3P,KAAKoP,QAAU,EAGjBpP,KAAKwP,KAAOA,IAKhB,IAAeL,aAAeA,EACf,Q,sSC5DA,MAAM,EAInB,YAAYW,EAA0BJ,EAA6BK,EAAgEC,EAA2CP,GAAxI,KAAAC,aAA6B,KAAAK,eAAgE,KAAAC,UAA2C,KAAAP,UAFtK,KAAAQ,WAAY,EAGlBjQ,KAAK6P,OAAS9Y,SAASC,KAAKoE,cAAc,IAAM0U,GAGrC,SAAS5U,G,yCAOpB,GAJG8E,KAAKgQ,SACNhQ,KAAKgQ,WAAW9U,IAGd8E,KAAKiQ,UAAW,CAClB,GAAGjQ,KAAK+P,aACN,IACE,MAAMzE,EAAMtL,KAAK+P,gBAAgB7U,GAC9BoQ,aAAejV,gBACViV,GAER,MAAMxL,GACN6E,QAAQC,MAAM,oBAAqB9E,GAIvCE,KAAKiQ,WAAY,EAGnB,EAAaC,QAAQlQ,Y,gCCtCzB,wIAkBA,IAAImQ,GAAc,EACdC,EAAkD,cAClDC,EAAkB,EAEtBD,EAAsB9Z,UAEtB,MAAM4T,EAAMvF,QAAQuF,IAAIzE,KAAKd,QAAQuF,IAAK,sBAEnC,SAASoG,EAA4Bva,EAAuBoJ,GAC7DgR,IACFC,EAAwB,cACxB,IAAUvL,cAdgB,+BAe1BsL,GAAc,EACd,KAASjG,EAAI,YAGbmG,EACF,KAASnG,EAAI,0BAA2BmG,EAAiBlR,GAEzD,MAAMoR,EAAW,MACHlb,IAAZ8J,EAAwB,YAAMA,QAAW9J,EACzCU,EAAQya,QAAQ,SAChB1S,OAAOyC,SAEHkQ,EAAOC,YAAYtY,MACnBuY,EAAyBP,EAa/B,OAZA/Z,QAAQ6V,KAAKqE,GAAUva,KAAK,KACvBoa,IAA0BO,GAA0BP,EAAsBQ,gBAI3EP,EACF,KAASnG,EAAI,uBAAwBmG,EAAiBK,YAAYtY,MAAQqY,GACvEJ,GAAmB,GACpBQ,OAIGT,EAGT,SAASS,IACJT,EAAsBQ,cAIzBT,GAAc,EACdE,EAAkB,EAClB,IAAUxL,cAlDgB,6BAmD1BuL,EAAsB9Z,UAEtB,KAAS4T,EAAI,QAGR,SAAS4G,IACdD,IAGK,SAASE,IACd,OAAOX,EAGM,aACbY,EACAC,EACAC,GAGKf,GACDa,IAGF,MAAMrU,EAAMuU,EAAiBA,EAAevU,IAAI,KAAa,IAAUE,iBAAiB4I,KAAK,KACvFzJ,EAASkV,EAAiBA,EAAeC,aAAa1L,KAAKyL,EAAgB,KAAa,IAAUpS,oBAAoB2G,KAAK,KAIjI,OAHA9I,EA7E0B,8BA6ECqU,GAC3BrU,EA7EwB,4BA6ECsU,GAElB,KACLjV,EAhFsB,4BAgFMiV,GAC5BjV,EAlFwB,8BAkFMgV,M,gCC3FrB,SAASpB,EAAWwB,GACjC,IAAIA,EAAK7K,WACP,OAAQ,EAGV,IAAIpF,EAAI,EAER,KAA+C,QAAxCiQ,EAAOA,EAAKC,2BAAoClQ,EACvD,OAAOA,EAdT","file":"0.32932e6b1ccf767530d6.chunk.js","sourcesContent":["/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's fastSmoothScroll slightly patched\r\n\r\nimport { dispatchHeavyAnimationEvent } from '../hooks/useHeavyAnimationCheck';\r\nimport { fastRaf, fastRafPromise } from './schedulers';\r\nimport { animateSingle, cancelAnimationByKey } from './animation';\r\nimport rootScope from '../lib/rootScope';\r\nimport isInDOM from './dom/isInDOM';\r\n\r\nconst MIN_JS_DURATION = 250;\r\nconst MAX_JS_DURATION = 600;\r\nconst LONG_TRANSITION_MAX_DISTANCE = 1500;\r\nconst SHORT_TRANSITION_MAX_DISTANCE = 500;\r\n\r\nexport enum FocusDirection {\r\n Up,\r\n Down,\r\n Static,\r\n};\r\n\r\nexport type ScrollGetNormalSizeCallback = (options: {rect: DOMRect}) => number;\r\nexport type ScrollStartCallbackDimensions = {\r\n scrollSize: number,\r\n scrollPosition: number,\r\n distanceToEnd: number,\r\n path: number,\r\n duration: number,\r\n containerRect: DOMRect,\r\n elementRect: DOMRect,\r\n};\r\n\r\nexport type ScrollOptions = {\r\n container: HTMLElement,\r\n element: HTMLElement,\r\n position: ScrollLogicalPosition,\r\n margin?: number,\r\n maxDistance?: number,\r\n forceDirection?: FocusDirection,\r\n forceDuration?: number,\r\n axis?: 'x' | 'y',\r\n getNormalSize?: ScrollGetNormalSizeCallback,\r\n fallbackToElementStartWhenCentering?: HTMLElement,\r\n startCallback?: (dimensions: ScrollStartCallbackDimensions) => void\r\n};\r\n\r\nexport default function fastSmoothScroll(options: ScrollOptions) {\r\n if(options.margin === undefined) {\r\n options.margin = 0;\r\n }\r\n\r\n if(options.maxDistance === undefined) {\r\n options.maxDistance = LONG_TRANSITION_MAX_DISTANCE;\r\n }\r\n\r\n if(options.axis === undefined) {\r\n options.axis = 'y';\r\n }\r\n //return;\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n options.forceDirection = FocusDirection.Static;\r\n }\r\n\r\n if(options.forceDirection === FocusDirection.Static) {\r\n options.forceDuration = 0;\r\n return scrollWithJs(options);\r\n /* return Promise.resolve();\r\n\r\n element.scrollIntoView({ block: position });\r\n\r\n cancelAnimationByKey(container);\r\n return Promise.resolve(); */\r\n }\r\n\r\n const promise = fastRafPromise().then(() => scrollWithJs(options));\r\n\r\n return options.axis === 'y' ? dispatchHeavyAnimationEvent(promise) : promise;\r\n}\r\n\r\nfunction scrollWithJs(options: ScrollOptions): Promise<void> {\r\n const {element, container, getNormalSize, axis, margin, position, forceDirection, maxDistance, forceDuration} = options;\r\n if(!isInDOM(element)) {\r\n cancelAnimationByKey(container);\r\n return Promise.resolve();\r\n }\r\n \r\n const rectStartKey = axis === 'y' ? 'top' : 'left';\r\n const rectEndKey = axis === 'y' ? 'bottom' : 'right';\r\n const sizeKey = axis === 'y' ? 'height' : 'width';\r\n const scrollSizeKey = axis === 'y' ? 'scrollHeight' : 'scrollWidth';\r\n const scrollPositionKey = axis === 'y' ? 'scrollTop' : 'scrollLeft';\r\n\r\n //const { offsetTop: elementTop, offsetHeight: elementHeight } = element;\r\n const elementRect = element.getBoundingClientRect();\r\n const containerRect = container.getBoundingClientRect ? container.getBoundingClientRect() : document.body.getBoundingClientRect();\r\n\r\n //const transformable = container.firstElementChild as HTMLElement;\r\n\r\n const elementPosition = elementRect[rectStartKey] - containerRect[rectStartKey];\r\n const elementSize = element[scrollSizeKey]; // margin is exclusive in DOMRect\r\n\r\n const containerSize = getNormalSize ? getNormalSize({rect: containerRect}) : containerRect[sizeKey];\r\n\r\n let scrollPosition = container[scrollPositionKey];\r\n const scrollSize = container[scrollSizeKey];\r\n /* const elementPosition = element.offsetTop;\r\n const elementSize = element.offsetHeight;\r\n\r\n const scrollPosition = container[scrollPositionKey];\r\n const scrollSize = container[scrollSizeKey];\r\n const containerSize = container.offsetHeight; */\r\n\r\n let path!: number;\r\n\r\n switch(position) {\r\n case 'start':\r\n path = elementPosition - margin;\r\n break;\r\n case 'end':\r\n path = elementRect[rectEndKey] /* + (elementSize - elementRect[sizeKey]) */ - containerRect[rectEndKey] + margin;\r\n break;\r\n // 'nearest' is not supported yet\r\n case 'nearest':\r\n case 'center':\r\n if(elementSize < containerSize) {\r\n path = (elementPosition + elementSize / 2) - (containerSize / 2);\r\n } else {\r\n if(options.fallbackToElementStartWhenCentering && options.fallbackToElementStartWhenCentering !== element) {\r\n options.element = options.fallbackToElementStartWhenCentering;\r\n options.position = 'start';\r\n return scrollWithJs(options);\r\n }\r\n\r\n path = elementPosition - margin;\r\n }\r\n\r\n break;\r\n }\r\n /* switch (position) {\r\n case 'start':\r\n path = (elementPosition - margin) - scrollPosition;\r\n break;\r\n case 'end':\r\n path = (elementPosition + elementSize + margin) - (scrollPosition + containerSize);\r\n break;\r\n // 'nearest' is not supported yet\r\n case 'nearest':\r\n case 'center':\r\n path = elementSize < containerSize\r\n ? (elementPosition + elementSize / 2) - (scrollPosition + containerSize / 2)\r\n : (elementPosition - margin) - scrollPosition;\r\n break;\r\n } */\r\n\r\n if(Math.abs(path - (margin || 0)) < 1) {\r\n cancelAnimationByKey(container);\r\n return Promise.resolve();\r\n }\r\n\r\n if(axis === 'y') {\r\n if(forceDirection === undefined) {\r\n if(path > maxDistance) {\r\n scrollPosition = container.scrollTop += path - maxDistance;\r\n path = maxDistance;\r\n } else if(path < -maxDistance) {\r\n scrollPosition = container.scrollTop += path + maxDistance;\r\n path = -maxDistance;\r\n }\r\n }/* else if(forceDirection === FocusDirection.Up) { // * not tested yet\r\n container.scrollTop = offsetTop + container.scrollTop + maxDistance;\r\n } else if(forceDirection === FocusDirection.Down) { // * not tested yet\r\n container.scrollTop = Math.max(0, offsetTop + container.scrollTop - maxDistance);\r\n } */\r\n }\r\n\r\n // console.log('scrollWithJs: will scroll path:', path, element);\r\n\r\n /* let existsTransform = 0;\r\n const currentTransform = transformable.style.transform;\r\n if(currentTransform) {\r\n existsTransform = parseInt(currentTransform.match(/\\((.+?), (.+?), .+\\)/)[2]);\r\n //path += existsTransform;\r\n } */\r\n\r\n if(path < 0) {\r\n const remainingPath = -scrollPosition;\r\n path = Math.max(path, remainingPath);\r\n } else if(path > 0) {\r\n const remainingPath = scrollSize - (scrollPosition + containerSize);\r\n path = Math.min(path, remainingPath);\r\n }\r\n\r\n const target = container[scrollPositionKey] + path;\r\n const absPath = Math.abs(path);\r\n const duration = forceDuration ?? (\r\n MIN_JS_DURATION + (absPath / LONG_TRANSITION_MAX_DISTANCE) * (MAX_JS_DURATION - MIN_JS_DURATION)\r\n );\r\n const startAt = Date.now();\r\n\r\n /* transformable.classList.add('no-transition');\r\n\r\n const tickTransform = () => {\r\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\r\n const currentPath = path * transition(t);\r\n\r\n transformable.style.transform = `translate3d(0, ${-currentPath}px, 0)`;\r\n container.dataset.translate = '' + -currentPath;\r\n\r\n const willContinue = t < 1;\r\n if(!willContinue) {\r\n fastRaf(() => {\r\n delete container.dataset.transform;\r\n container.dataset.transform = '';\r\n transformable.style.transform = '';\r\n void transformable.offsetLeft; // reflow\r\n transformable.classList.remove('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n container[scrollPositionKey] = Math.round(target);\r\n });\r\n }\r\n\r\n return willContinue;\r\n };\r\n \r\n return animateSingle(tickTransform, container); */\r\n\r\n /* return new Promise((resolve) => {\r\n fastRaf(() => {\r\n transformable.style.transform = '';\r\n transformable.style.transition = '';\r\n\r\n setTimeout(resolve, duration);\r\n });\r\n });\r\n\r\n const transformableHeight = transformable.scrollHeight;\r\n //transformable.style.minHeight = `${transformableHeight}px`;\r\n */\r\n\r\n const transition = absPath < SHORT_TRANSITION_MAX_DISTANCE ? shortTransition : longTransition;\r\n const tick = () => {\r\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\r\n\r\n const currentPath = path * (1 - transition(t));\r\n container[scrollPositionKey] = Math.round(target - currentPath);\r\n \r\n return t < 1;\r\n };\r\n\r\n if(!duration || !path) {\r\n cancelAnimationByKey(container);\r\n tick();\r\n return Promise.resolve();\r\n }\r\n\r\n /* return new Promise((resolve) => {\r\n setTimeout(resolve, duration);\r\n }).then(() => {\r\n transformable.classList.add('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n transformable.style.transform = '';\r\n transformable.style.transition = '';\r\n void transformable.offsetLeft; // reflow\r\n transformable.classList.remove('no-transition');\r\n void transformable.offsetLeft; // reflow\r\n fastRaf(() => {\r\n \r\n container[scrollPositionKey] = Math.round(target);\r\n //transformable.style.minHeight = ``;\r\n });\r\n \r\n }); */\r\n\r\n if(options.startCallback) {\r\n const distanceToEnd = scrollSize - Math.round(target + container[axis === 'y' ? 'offsetHeight' : 'offsetWidth']);\r\n options.startCallback({\r\n scrollSize,\r\n scrollPosition,\r\n distanceToEnd,\r\n path,\r\n duration,\r\n containerRect,\r\n elementRect\r\n });\r\n }\r\n\r\n return animateSingle(tick, container);\r\n}\r\n\r\nfunction longTransition(t: number) {\r\n return 1 - ((1 - t) ** 5);\r\n}\r\n\r\nfunction shortTransition(t: number) {\r\n return 1 - ((1 - t) ** 3.5);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\n/* export function isInDOM(element: Element, parentNode?: HTMLElement): boolean {\r\n if(!element) {\r\n return false;\r\n }\r\n\r\n parentNode = parentNode || document.body;\r\n if(element === parentNode) {\r\n return true;\r\n }\r\n return isInDOM(element.parentNode as HTMLElement, parentNode);\r\n} */\r\nexport default function isInDOM(element: Element): boolean {\r\n return element?.isConnected;\r\n}\r\n","export default function clamp(v: number, min: number, max: number): number {\n return v < min ? min : ((v > max) ? max : v);\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's animation.ts\r\n\r\nimport { fastRaf } from './schedulers';\r\nimport deferredPromise, { CancellablePromise } from './cancellablePromise';\r\n\r\ninterface AnimationInstance {\r\n isCancelled: boolean;\r\n deferred: CancellablePromise<void>\r\n}\r\n\r\ntype AnimationInstanceKey = any;\r\nconst instances: Map<AnimationInstanceKey, AnimationInstance> = new Map();\r\n\r\nexport function createAnimationInstance(key: AnimationInstanceKey) {\r\n cancelAnimationByKey(key);\r\n\r\n const instance: AnimationInstance = {\r\n isCancelled: false, \r\n deferred: deferredPromise<void>()\r\n };\r\n\r\n instances.set(key, instance);\r\n instance.deferred.then(() => {\r\n instances.delete(key);\r\n });\r\n\r\n return instance;\r\n}\r\n\r\nexport function getAnimationInstance(key: AnimationInstanceKey) {\r\n return instances.get(key);\r\n}\r\n\r\nexport function cancelAnimationByKey(key: AnimationInstanceKey) {\r\n const instance = getAnimationInstance(key);\r\n if(instance) {\r\n instance.isCancelled = true;\r\n instance.deferred.resolve();\r\n }\r\n}\r\n\r\nexport function animateSingle(tick: Function, key: AnimationInstanceKey, instance?: AnimationInstance) {\r\n if(!instance) {\r\n instance = createAnimationInstance(key);\r\n }\r\n\r\n fastRaf(() => {\r\n if(instance.isCancelled) {\r\n return;\r\n }\r\n \r\n if(tick()) {\r\n animateSingle(tick, key, instance);\r\n } else {\r\n instance.deferred.resolve();\r\n }\r\n });\r\n\r\n return instance.deferred;\r\n}\r\n\r\nexport function animate(tick: Function) {\r\n fastRaf(() => {\r\n if(tick()) {\r\n animate(tick);\r\n }\r\n });\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function findUpAsChild(el: any, parent: any) {\r\n if(el.parentElement === parent) return el;\r\n \r\n while(el.parentElement) {\r\n el = el.parentElement;\r\n if(el.parentElement === parent) {\r\n return el;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { TransitionSlider } from \"./transition\";\r\nimport { ScrollableX } from \"./scrollable\";\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { fastRaf } from \"../helpers/schedulers\";\r\nimport { FocusDirection } from \"../helpers/fastSmoothScroll\";\r\nimport findUpAsChild from \"../helpers/dom/findUpAsChild\";\r\nimport whichChild from \"../helpers/dom/whichChild\";\r\n\r\nexport function horizontalMenu(\r\n tabs: HTMLElement, \r\n content: HTMLElement, \r\n onClick?: (id: number, tabContent: HTMLDivElement, animate: boolean) => void | boolean, \r\n onTransitionEnd?: () => void, \r\n transitionTime = 250, \r\n scrollableX?: ScrollableX\r\n) {\r\n const selectTab = TransitionSlider(content, tabs || content.dataset.animation === 'tabs' ? 'tabs' : 'navigation', transitionTime, onTransitionEnd);\r\n\r\n if(tabs) {\r\n const proxy = new Proxy(selectTab, {\r\n apply: (target, that, args) => {\r\n const id = +args[0];\r\n const animate = args[1] !== undefined ? args[1] : true;\r\n \r\n const el = (tabs.querySelector(`[data-tab=\"${id}\"]`) || tabs.children[id]) as HTMLElement;\r\n selectTarget(el, id, animate);\r\n }\r\n });\r\n\r\n const selectTarget = (target: HTMLElement, id: number, animate = true) => {\r\n const tabContent = content.children[id] as HTMLDivElement;\r\n\r\n if(onClick) {\r\n const canChange = onClick(id, tabContent, animate);\r\n if(canChange !== undefined && !canChange) {\r\n return;\r\n }\r\n }\r\n\r\n if(scrollableX) {\r\n scrollableX.scrollIntoViewNew({\r\n element: target.parentElement.children[id] as HTMLElement, \r\n position: 'center', \r\n forceDirection: animate ? undefined : FocusDirection.Static, \r\n forceDuration: transitionTime, \r\n axis: 'x'\r\n });\r\n }\r\n\r\n if(!rootScope.settings.animationsEnabled) {\r\n animate = false;\r\n }\r\n\r\n const prevId = selectTab.prevId();\r\n if(target.classList.contains('active') || id === prevId) {\r\n return false;\r\n }\r\n \r\n const prev = tabs.querySelector(tagName.toLowerCase() + '.active') as HTMLElement;\r\n\r\n fastRaf(() => {\r\n prev && prev.classList.remove('active');\r\n });\r\n \r\n // stripe from ZINCHUK\r\n if(useStripe && prevId !== -1 && animate) {\r\n fastRaf(() => {\r\n const indicator = target.querySelector('i')!;\r\n const currentIndicator = target.parentElement.children[prevId].querySelector('i')!;\r\n \r\n currentIndicator.classList.remove('animate');\r\n indicator.classList.remove('animate');\r\n \r\n // We move and resize our indicator so it repeats the position and size of the previous one.\r\n const shiftLeft = currentIndicator.parentElement.parentElement.offsetLeft - indicator.parentElement.parentElement.offsetLeft;\r\n const scaleFactor = currentIndicator.clientWidth / indicator.clientWidth;\r\n indicator.style.transform = `translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`;\r\n \r\n //console.log(`translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`);\r\n \r\n requestAnimationFrame(() => {\r\n // Now we remove the transform to let it animate to its own position and size.\r\n indicator.classList.add('animate');\r\n indicator.style.transform = 'none';\r\n });\r\n });\r\n }\r\n // stripe END\r\n\r\n fastRaf(() => {\r\n target.classList.add('active');\r\n });\r\n \r\n selectTab(id, animate);\r\n };\r\n\r\n const useStripe = !tabs.classList.contains('no-stripe');\r\n\r\n //const tagName = tabs.classList.contains('menu-horizontal-div') ? 'BUTTON' : 'LI';\r\n const tagName = tabs.firstElementChild.tagName;\r\n tabs.addEventListener('click', function(e) {\r\n let target = e.target as HTMLElement;\r\n \r\n target = findUpAsChild(target, tabs);\r\n \r\n //console.log('tabs click:', target);\r\n \r\n if(!target) return false;\r\n\r\n let id: number;\r\n if(target.dataset.tab) {\r\n id = +target.dataset.tab;\r\n if(id === -1) {\r\n return false;\r\n }\r\n } else {\r\n id = whichChild(target);\r\n }\r\n\r\n selectTarget(target, id);\r\n });\r\n\r\n return proxy;\r\n }\r\n \r\n return selectTab;\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n * \r\n * Originally from:\r\n * https://github.com/zhukov/webogram\r\n * Copyright (C) 2014 Igor Zhukov <igor.beatle@gmail.com>\r\n * https://github.com/zhukov/webogram/blob/master/LICENSE\r\n */\r\n\r\nimport { makeMediaSize } from \"./mediaSizes\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\n\r\nexport default function calcImageInBox(imageW: number, imageH: number, boxW: number, boxH: number, noZoom = true) {\r\n if(imageW < boxW && imageH < boxH && noZoom) {\r\n return makeMediaSize(imageW, imageH);\r\n }\r\n\r\n let boxedImageW = boxW;\r\n let boxedImageH = boxH;\r\n\r\n if((imageW / imageH) > (boxW / boxH)) {\r\n boxedImageH = (imageH * boxW / imageW) | 0;\r\n } else {\r\n boxedImageW = (imageW * boxH / imageH) | 0;\r\n if(boxedImageW > boxW) {\r\n boxedImageH = (boxedImageH * boxW / boxedImageW) | 0;\r\n boxedImageW = boxW;\r\n }\r\n }\r\n\r\n // if (Config.Navigator.retina) {\r\n // imageW = Math.floor(imageW / 2)\r\n // imageH = Math.floor(imageH / 2)\r\n // }\r\n\r\n if(noZoom && boxedImageW >= imageW && boxedImageH >= imageH) {\r\n boxedImageW = imageW;\r\n boxedImageH = imageH;\r\n }\r\n\r\n return makeMediaSize(boxedImageW, boxedImageH);\r\n}\r\n\r\nMOUNT_CLASS_TO.calcImageInBox = calcImageInBox;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\nimport deferredPromise, { CancellablePromise } from \"../helpers/cancellablePromise\";\r\nimport { dispatchHeavyAnimationEvent } from \"../hooks/useHeavyAnimationCheck\";\r\nimport whichChild from \"../helpers/dom/whichChild\";\r\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\r\n\r\nfunction slideNavigation(tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) {\r\n const width = prevTabContent.getBoundingClientRect().width;\r\n const elements = [tabContent, prevTabContent];\r\n if(toRight) elements.reverse();\r\n elements[0].style.filter = `brightness(80%)`;\r\n elements[0].style.transform = `translate3d(${-width * .25}px, 0, 0)`;\r\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\r\n \r\n tabContent.classList.add('active');\r\n void tabContent.offsetWidth; // reflow\r\n\r\n tabContent.style.transform = '';\r\n tabContent.style.filter = '';\r\n\r\n return () => {\r\n prevTabContent.style.transform = prevTabContent.style.filter = '';\r\n };\r\n}\r\n\r\nfunction slideTabs(tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) {\r\n // Jolly Cobra's // Workaround for scrollable content flickering during animation.\r\n // const scrollableContainer = findUpClassName(tabContent, 'scrollable-y');\r\n // if(scrollableContainer && scrollableContainer.style.overflowY !== 'hidden') {\r\n // // const scrollBarWidth = scrollableContainer.offsetWidth - scrollableContainer.clientWidth;\r\n // scrollableContainer.style.overflowY = 'hidden';\r\n // // scrollableContainer.style.paddingRight = `${scrollBarWidth}px`;\r\n // // this.container.classList.add('sliding');\r\n // }\r\n\r\n //window.requestAnimationFrame(() => {\r\n const width = prevTabContent.getBoundingClientRect().width;\r\n /* tabContent.style.setProperty('--width', width + 'px');\r\n prevTabContent.style.setProperty('--width', width + 'px');\r\n\r\n tabContent.classList.add('active'); */\r\n //void tabContent.offsetWidth; // reflow\r\n const elements = [tabContent, prevTabContent];\r\n if(toRight) elements.reverse();\r\n elements[0].style.transform = `translate3d(${-width}px, 0, 0)`;\r\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\r\n \r\n tabContent.classList.add('active');\r\n void tabContent.offsetWidth; // reflow\r\n \r\n tabContent.style.transform = '';\r\n //});\r\n \r\n return () => {\r\n prevTabContent.style.transform = '';\r\n\r\n // if(scrollableContainer) {\r\n // // Jolly Cobra's // Workaround for scrollable content flickering during animation.\r\n // if(isSafari) { // ! safari doesn't respect sticky header, so it flicks when overflow is changing\r\n // scrollableContainer.style.display = 'none';\r\n // }\r\n\r\n // scrollableContainer.style.overflowY = '';\r\n\r\n // if(isSafari) {\r\n // void scrollableContainer.offsetLeft; // reflow\r\n // scrollableContainer.style.display = '';\r\n // }\r\n\r\n // // scrollableContainer.style.paddingRight = '0';\r\n // // this.container.classList.remove('sliding');\r\n // }\r\n };\r\n}\r\n\r\nexport const TransitionSlider = (\r\n content: HTMLElement, \r\n type: 'tabs' | 'navigation' | 'zoom-fade' | 'slide-fade' | 'none'/* | 'counter' */, \r\n transitionTime: number, \r\n onTransitionEnd?: (id: number) => void, \r\n isHeavy = true\r\n) => {\r\n let animationFunction: TransitionFunction = null;\r\n\r\n switch(type) {\r\n case 'tabs':\r\n animationFunction = slideTabs;\r\n break;\r\n case 'navigation':\r\n animationFunction = slideNavigation;\r\n break;\r\n /* default:\r\n break; */\r\n }\r\n\r\n content.dataset.animation = type;\r\n \r\n return Transition(content, animationFunction, transitionTime, onTransitionEnd, isHeavy);\r\n};\r\n\r\ntype TransitionFunction = (tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) => void | (() => void);\r\n\r\nconst Transition = (\r\n content: HTMLElement, \r\n animationFunction: TransitionFunction, \r\n transitionTime: number, \r\n onTransitionEnd?: (id: number) => void, \r\n isHeavy = true,\r\n once = false,\r\n withAnimationListener = true\r\n) => {\r\n const onTransitionEndCallbacks: Map<HTMLElement, Function> = new Map();\r\n let animationDeferred: CancellablePromise<void>;\r\n // let animationStarted = 0;\r\n let from: HTMLElement = null;\r\n\r\n if(withAnimationListener) {\r\n const listenerName = animationFunction ? 'transitionend' : 'animationend';\r\n\r\n const onEndEvent = (e: TransitionEvent | AnimationEvent) => {\r\n cancelEvent(e);\r\n \r\n if((e.target as HTMLElement).parentElement !== content) {\r\n return;\r\n }\r\n \r\n //console.log('Transition: transitionend', /* content, */ e, selectTab.prevId, performance.now() - animationStarted);\r\n \r\n const callback = onTransitionEndCallbacks.get(e.target as HTMLElement);\r\n if(callback) callback();\r\n \r\n if(e.target !== from) {\r\n return;\r\n }\r\n \r\n if(!animationDeferred && isHeavy) return;\r\n \r\n if(animationDeferred) {\r\n animationDeferred.resolve();\r\n animationDeferred = undefined;\r\n }\r\n \r\n if(onTransitionEnd) {\r\n onTransitionEnd(selectTab.prevId());\r\n }\r\n \r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n \r\n if(once) {\r\n content.removeEventListener(listenerName, onEndEvent/* , {capture: false} */);\r\n from = animationDeferred = undefined;\r\n onTransitionEndCallbacks.clear();\r\n }\r\n };\r\n \r\n // TODO: check for transition type (transform, etc) using by animationFunction\r\n content.addEventListener(listenerName, onEndEvent/* , {passive: true, capture: false} */);\r\n }\r\n\r\n function selectTab(id: number | HTMLElement, animate = true, overrideFrom?: typeof from) {\r\n if(overrideFrom) {\r\n from = overrideFrom;\r\n }\r\n\r\n if(id instanceof HTMLElement) {\r\n id = whichChild(id);\r\n }\r\n \r\n const prevId = selectTab.prevId();\r\n if(id === prevId) return false;\r\n\r\n //console.log('selectTab id:', id);\r\n\r\n const to = content.children[id] as HTMLElement;\r\n\r\n if(!rootScope.settings.animationsEnabled || prevId === -1) {\r\n animate = false;\r\n }\r\n\r\n if(!withAnimationListener) {\r\n const timeout = content.dataset.timeout;\r\n if(timeout !== undefined) {\r\n clearTimeout(+timeout);\r\n }\r\n\r\n delete content.dataset.timeout;\r\n }\r\n\r\n if(!animate) {\r\n if(from) from.classList.remove('active', 'to', 'from');\r\n else if(to) { // fix instant opening back from closed slider (e.g. instant closening and opening right sidebar)\r\n const callback = onTransitionEndCallbacks.get(to);\r\n if(callback) {\r\n callback();\r\n }\r\n }\r\n\r\n if(to) {\r\n to.classList.remove('to', 'from');\r\n to.classList.add('active');\r\n }\r\n\r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n\r\n from = to;\r\n\r\n if(onTransitionEnd) onTransitionEnd(id);\r\n return;\r\n }\r\n\r\n if(!withAnimationListener) {\r\n content.dataset.timeout = '' + window.setTimeout(() => {\r\n to.classList.remove('to');\r\n from && from.classList.remove('from');\r\n content.classList.remove('animating', 'backwards', 'disable-hover');\r\n delete content.dataset.timeout;\r\n }, transitionTime);\r\n }\r\n\r\n if(from) {\r\n from.classList.remove('to');\r\n from.classList.add('from');\r\n }\r\n\r\n content.classList.add('animating'/* , 'disable-hover' */);\r\n const toRight = prevId < id;\r\n content.classList.toggle('backwards', !toRight);\r\n\r\n let onTransitionEndCallback: ReturnType<TransitionFunction>;\r\n if(!to) {\r\n //prevTabContent.classList.remove('active');\r\n } else {\r\n if(animationFunction) {\r\n onTransitionEndCallback = animationFunction(to, from, toRight);\r\n } else {\r\n to.classList.add('active');\r\n }\r\n\r\n to.classList.remove('from');\r\n to.classList.add('to');\r\n }\r\n \r\n if(to) {\r\n onTransitionEndCallbacks.set(to, () => {\r\n to.classList.remove('to');\r\n onTransitionEndCallbacks.delete(to);\r\n });\r\n }\r\n\r\n if(from/* && false */) {\r\n const _from = from;\r\n const callback = () => {\r\n _from.classList.remove('active', 'from');\r\n\r\n if(onTransitionEndCallback) {\r\n onTransitionEndCallback();\r\n }\r\n\r\n onTransitionEndCallbacks.delete(_from);\r\n };\r\n\r\n if(to) {\r\n onTransitionEndCallbacks.set(_from, callback);\r\n } else {\r\n const timeout = window.setTimeout(callback, transitionTime);\r\n onTransitionEndCallbacks.set(_from, () => {\r\n clearTimeout(timeout);\r\n onTransitionEndCallbacks.delete(_from);\r\n });\r\n }\r\n\r\n if(isHeavy) {\r\n if(!animationDeferred) {\r\n animationDeferred = deferredPromise<void>();\r\n // animationStarted = performance.now();\r\n }\r\n \r\n dispatchHeavyAnimationEvent(animationDeferred, transitionTime * 2);\r\n }\r\n }\r\n \r\n from = to;\r\n }\r\n\r\n //selectTab.prevId = -1;\r\n selectTab.prevId = () => from ? whichChild(from) : -1;\r\n \r\n return selectTab;\r\n};\r\n\r\nexport default Transition;\r\n","import { IS_SAFARI } from \"./userAgent\";\n\n/*\n * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to\n * transfer data between WebWorkers and the main thread.\n * https://github.com/mapbox/mapbox-gl-js/issues/8771\n *\n * This should be removed once the underlying Safari issue is fixed.\n */\n\nlet CAN_USE_TRANSFERABLES: boolean;\nif(!IS_SAFARI) CAN_USE_TRANSFERABLES = true;\nelse {\n try {\n const match = navigator.userAgent.match(/Version\\/(.+?) /);\n CAN_USE_TRANSFERABLES = +match[1] >= 14;\n } catch(err) {\n CAN_USE_TRANSFERABLES = false;\n }\n}\n\nexport default CAN_USE_TRANSFERABLES;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CAN_USE_TRANSFERABLES from \"../../environment/canUseTransferables\";\nimport { IS_ANDROID, IS_APPLE_MOBILE, IS_APPLE, IS_SAFARI } from \"../../environment/userAgent\";\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\nimport mediaSizes from \"../../helpers/mediaSizes\";\nimport clamp from \"../../helpers/number/clamp\";\nimport lottieLoader from \"./lottieLoader\";\nimport QueryableWorker from \"./queryableWorker\";\n\nexport type RLottieOptions = {\n container: HTMLElement, \n canvas?: HTMLCanvasElement, \n autoplay?: boolean, \n animationData: Blob, \n loop?: boolean, \n width?: number,\n height?: number,\n group?: string,\n noCache?: boolean,\n needUpscale?: boolean,\n skipRatio?: number,\n initFrame?: number, // index\n color?: RLottieColor,\n inverseColor?: RLottieColor,\n name?: string,\n skipFirstFrameRendering?: boolean,\n toneIndex?: number\n};\n\ntype RLottieCacheMap = Map<number, Uint8ClampedArray>;\nclass RLottieCache {\n private cache: Map<string, {frames: RLottieCacheMap, counter: number}>;\n \n constructor() {\n this.cache = new Map();\n }\n\n public getCache(name: string) {\n let cache = this.cache.get(name);\n if(!cache) {\n this.cache.set(name, cache = {frames: new Map(), counter: 0});\n } else {\n // console.warn('[RLottieCache] cache will be reused', cache);\n }\n\n ++cache.counter;\n return cache.frames;\n }\n\n public releaseCache(name: string) {\n const cache = this.cache.get(name);\n if(cache && !--cache.counter) {\n this.cache.delete(name);\n // console.warn('[RLottieCache] released cache', cache);\n }\n }\n\n public getCacheCounter(name: string) {\n const cache = this.cache.get(name);\n return cache?.counter;\n }\n\n public generateName(name: string, width: number, height: number, color: RLottieColor, toneIndex: number) {\n return [\n name, \n width, \n height, \n // color ? rgbaToHexa(color) : ''\n color ? 'colored' : '',\n toneIndex || ''\n ].filter(Boolean).join('-');\n }\n}\n\nconst cache = new RLottieCache();\n\nexport type RLottieColor = [number, number, number];\n\nexport default class RLottiePlayer extends EventListenerBase<{\n enterFrame: (frameNo: number) => void,\n ready: () => void,\n firstFrame: () => void,\n cached: () => void\n}> {\n private static reqId = 0;\n\n public reqId = 0;\n public curFrame: number;\n private frameCount: number;\n private fps: number;\n private skipDelta: number;\n private name: string;\n private cacheName: string;\n private toneIndex: number;\n\n private worker: QueryableWorker;\n \n private width = 0;\n private height = 0;\n\n public el: HTMLElement;\n public canvas: HTMLCanvasElement;\n private context: CanvasRenderingContext2D;\n\n public paused = true;\n //public paused = false;\n public direction = 1;\n private speed = 1;\n public autoplay = true;\n public _autoplay: boolean; // ! will be used to store original value for settings.stickers.loop\n public loop = true;\n private _loop: boolean; // ! will be used to store original value for settings.stickers.loop\n private group = '';\n\n private frInterval: number;\n private frThen: number;\n private rafId: number;\n\n //private caching = false;\n //private removed = false;\n\n private frames: RLottieCacheMap;\n private imageData: ImageData;\n public clamped: Uint8ClampedArray;\n private cachingDelta = 0;\n\n private initFrame: number;\n private color: RLottieColor;\n private inverseColor: RLottieColor;\n\n public minFrame: number;\n public maxFrame: number;\n\n //private playedTimes = 0;\n\n private currentMethod: RLottiePlayer['mainLoopForwards'] | RLottiePlayer['mainLoopBackwards'];\n private frameListener: (currentFrame: number) => void;\n private skipFirstFrameRendering: boolean;\n private playToFrameOnFrameCallback: (frameNo: number) => void;\n\n constructor({el, worker, options}: {\n el: HTMLElement,\n worker: QueryableWorker,\n options: RLottieOptions\n }) {\n super(true);\n\n this.reqId = ++RLottiePlayer['reqId'];\n this.el = el;\n this.worker = worker;\n\n for(let i in options) {\n if(this.hasOwnProperty(i)) {\n // @ts-ignore\n this[i] = options[i];\n }\n }\n\n this._loop = this.loop;\n this._autoplay = this.autoplay;\n\n // ! :(\n this.initFrame = options.initFrame;\n this.color = options.color;\n this.inverseColor = options.inverseColor;\n this.name = options.name;\n this.skipFirstFrameRendering = options.skipFirstFrameRendering;\n this.toneIndex = options.toneIndex;\n\n // * Skip ratio (30fps)\n let skipRatio: number;\n if(options.skipRatio !== undefined) skipRatio = options.skipRatio;\n else if((IS_ANDROID || IS_APPLE_MOBILE || (IS_APPLE && !IS_SAFARI)) && this.width < 100 && this.height < 100 && !options.needUpscale) {\n skipRatio = 0.5;\n }\n\n this.skipDelta = skipRatio !== undefined ? 1 / skipRatio | 0 : 1;\n\n //options.needUpscale = true;\n\n // * Pixel ratio\n //const pixelRatio = window.devicePixelRatio;\n const pixelRatio = clamp(window.devicePixelRatio, 1, 2);\n if(pixelRatio > 1) {\n //this.cachingEnabled = true;//this.width < 100 && this.height < 100;\n if(options.needUpscale) {\n this.width = Math.round(this.width * pixelRatio);\n this.height = Math.round(this.height * pixelRatio);\n } else if(pixelRatio > 1) {\n if(this.width > 100 && this.height > 100) {\n if(IS_APPLE || !mediaSizes.isMobile) {\n /* this.width = Math.round(this.width * (pixelRatio - 1));\n this.height = Math.round(this.height * (pixelRatio - 1)); */\n this.width = Math.round(this.width * pixelRatio);\n this.height = Math.round(this.height * pixelRatio);\n } else if(pixelRatio > 2.5) {\n this.width = Math.round(this.width * (pixelRatio - 1.5));\n this.height = Math.round(this.height * (pixelRatio - 1.5));\n }\n } else {\n this.width = Math.round(this.width * Math.max(1.5, pixelRatio - 1.5));\n this.height = Math.round(this.height * Math.max(1.5, pixelRatio - 1.5));\n }\n }\n }\n\n //options.noCache = true;\n \n // * Cache frames params\n if(!options.noCache/* && false */) {\n // проверка на размер уже после скейлинга, сделано для попапа и сайдбара, где стикеры 80х80 и 68х68, туда нужно 75%\n if(IS_APPLE && this.width > 100 && this.height > 100) {\n this.cachingDelta = 2; //2 // 50%\n } else if(this.width < 100 && this.height < 100) {\n this.cachingDelta = Infinity; // 100%\n } else {\n this.cachingDelta = 4; // 75%\n }\n }\n \n // this.cachingDelta = Infinity;\n // if(isApple) {\n // this.cachingDelta = 0; //2 // 50%\n // }\n\n /* this.width *= 0.8;\n this.height *= 0.8; */\n \n //console.log(\"RLottiePlayer width:\", this.width, this.height, options);\n if(!this.canvas) {\n this.canvas = document.createElement('canvas');\n this.canvas.classList.add('rlottie');\n this.canvas.width = this.width;\n this.canvas.height = this.height;\n }\n\n this.context = this.canvas.getContext('2d');\n\n if(CAN_USE_TRANSFERABLES) {\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n }\n\n this.imageData = new ImageData(this.width, this.height);\n\n if(this.name) {\n this.cacheName = cache.generateName(this.name, this.width, this.height, this.color, this.toneIndex);\n this.frames = cache.getCache(this.cacheName);\n } else {\n this.frames = new Map();\n }\n }\n\n public clearCache() {\n if(this.cachingDelta === Infinity) {\n return;\n }\n \n if(this.cacheName && cache.getCacheCounter(this.cacheName) > 1) { // skip clearing because same sticker can be still visible\n return;\n }\n \n this.frames.clear();\n }\n\n public sendQuery(methodName: string, ...args: any[]) {\n //console.trace('RLottie sendQuery:', methodName);\n this.worker.sendQuery(methodName, this.reqId, ...args);\n }\n\n public loadFromData(data: RLottieOptions['animationData']) {\n this.sendQuery('loadFromData', data, this.width, this.height, this.toneIndex/* , this.canvas.transferControlToOffscreen() */);\n }\n\n public play() {\n if(!this.paused) {\n return;\n }\n\n //return;\n\n //console.log('RLOTTIE PLAY' + this.reqId);\n\n this.paused = false;\n this.setMainLoop();\n }\n\n public pause(clearPendingRAF = true) {\n if(this.paused) {\n return;\n }\n\n this.paused = true;\n if(clearPendingRAF) {\n clearTimeout(this.rafId);\n }\n //window.cancelAnimationFrame(this.rafId);\n }\n\n private resetCurrentFrame() {\n return this.curFrame = this.initFrame ?? (this.direction === 1 ? this.minFrame : this.maxFrame);\n }\n\n public stop(renderFirstFrame = true) {\n this.pause();\n\n const curFrame = this.resetCurrentFrame();\n if(renderFirstFrame) {\n this.requestFrame(curFrame);\n //this.sendQuery('renderFrame', this.curFrame);\n }\n }\n\n public restart() {\n this.stop(false);\n this.play();\n }\n\n public setSpeed(speed: number) {\n if(this.speed === speed) {\n return;\n }\n\n this.speed = speed;\n\n if(!this.paused) {\n this.setMainLoop();\n }\n }\n\n public setDirection(direction: number) {\n if(this.direction === direction) {\n return;\n }\n\n this.direction = direction;\n \n if(!this.paused) {\n this.setMainLoop();\n }\n }\n\n public remove() {\n //alert('remove');\n lottieLoader.onDestroy(this.reqId);\n this.pause();\n this.sendQuery('destroy');\n if(this.cacheName) cache.releaseCache(this.cacheName);\n this.cleanup();\n //this.removed = true;\n }\n\n private applyColor(frame: Uint8ClampedArray) {\n const [r, g, b] = this.color;\n for(let i = 0, length = frame.length; i < length; i += 4) {\n if(frame[i + 3] !== 0) {\n frame[i] = r;\n frame[i + 1] = g;\n frame[i + 2] = b;\n }\n }\n }\n\n private applyInversing(frame: Uint8ClampedArray) {\n const [r, g, b] = this.inverseColor;\n for(let i = 0, length = frame.length; i < length; i += 4) {\n if(frame[i + 3] === 0) {\n frame[i] = r;\n frame[i + 1] = g;\n frame[i + 2] = b;\n frame[i + 3] = 255;\n } else {\n frame[i + 3] = 0;\n }\n }\n }\n\n public renderFrame2(frame: Uint8ClampedArray, frameNo: number) {\n /* this.setListenerResult('enterFrame', frameNo);\n return; */\n\n try {\n if(this.color) {\n this.applyColor(frame);\n }\n\n if(this.inverseColor) {\n this.applyInversing(frame);\n }\n\n this.imageData.data.set(frame);\n \n //this.context.putImageData(new ImageData(frame, this.width, this.height), 0, 0);\n //let perf = performance.now();\n this.context.putImageData(this.imageData, 0, 0);\n //console.log('renderFrame2 perf:', performance.now() - perf);\n } catch(err) {\n console.error('RLottiePlayer renderFrame error:', err/* , frame */, this.width, this.height);\n this.autoplay = false;\n this.pause();\n return;\n }\n \n //console.log('set result enterFrame', frameNo);\n this.dispatchEvent('enterFrame', frameNo);\n }\n\n public renderFrame(frame: Uint8ClampedArray, frameNo: number) {\n //console.log('renderFrame', frameNo, this);\n if(this.cachingDelta && (frameNo % this.cachingDelta || !frameNo) && !this.frames.has(frameNo)) {\n this.frames.set(frameNo, new Uint8ClampedArray(frame));//frame;\n }\n\n /* if(!this.listenerResults.hasOwnProperty('cached')) {\n this.setListenerResult('enterFrame', frameNo);\n if(frameNo === (this.frameCount - 1)) {\n this.setListenerResult('cached');\n }\n\n return;\n } */\n\n if(this.frInterval) {\n const now = Date.now(), delta = now - this.frThen;\n //console.log(`renderFrame delta${this.reqId}:`, this, delta, this.frInterval);\n\n if(delta < 0) {\n if(this.rafId) clearTimeout(this.rafId);\n return this.rafId = window.setTimeout(() => {\n this.renderFrame2(frame, frameNo);\n }, this.frInterval > -delta ? -delta % this.frInterval : this.frInterval);\n //await new Promise((resolve) => setTimeout(resolve, -delta % this.frInterval));\n }\n }\n\n this.renderFrame2(frame, frameNo);\n }\n\n public requestFrame(frameNo: number) {\n const frame = this.frames.get(frameNo);\n if(frame) {\n this.renderFrame(frame, frameNo);\n } else {\n if(this.clamped && !this.clamped.length) { // fix detached\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n }\n \n this.sendQuery('renderFrame', frameNo, this.clamped);\n }\n }\n\n private onLap() {\n //this.playedTimes++;\n\n if(!this.loop) {\n this.pause(false);\n return false;\n }\n\n return true;\n }\n\n private mainLoopForwards() {\n const {skipDelta, maxFrame} = this;\n const frame = (this.curFrame + skipDelta) > maxFrame ? this.curFrame = (this.loop ? this.minFrame : this.maxFrame) : this.curFrame += skipDelta;\n // console.log('mainLoopForwards', this.curFrame, skipDelta, frame);\n\n this.requestFrame(frame);\n if((frame + skipDelta) > maxFrame) {\n return this.onLap();\n }\n\n return true;\n }\n \n private mainLoopBackwards() {\n const {skipDelta, minFrame} = this;\n const frame = (this.curFrame - skipDelta) < minFrame ? this.curFrame = (this.loop ? this.maxFrame : this.minFrame) : this.curFrame -= skipDelta;\n // console.log('mainLoopBackwards', this.curFrame, skipDelta, frame);\n\n this.requestFrame(frame);\n if((frame - skipDelta) < minFrame) {\n return this.onLap();\n }\n\n return true;\n }\n\n public setMainLoop() {\n //window.cancelAnimationFrame(this.rafId);\n clearTimeout(this.rafId);\n\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\n this.frThen = Date.now() - this.frInterval;\n\n //console.trace('setMainLoop', this.frInterval, this.direction, this, JSON.stringify(this.listenerResults), this.listenerResults);\n\n const method = (this.direction === 1 ? this.mainLoopForwards : this.mainLoopBackwards).bind(this);\n this.currentMethod = method;\n //this.frameListener && this.removeListener('enterFrame', this.frameListener);\n\n //setTimeout(() => {\n //this.addListener('enterFrame', this.frameListener);\n //}, 0);\n\n if(this.frameListener) {\n const lastResult = this.listenerResults.enterFrame;\n if(lastResult !== undefined) {\n this.frameListener(this.curFrame);\n }\n }\n \n //this.mainLoop(method);\n //this.r(method);\n //method();\n }\n\n public playPart(options: {\n from: number, \n to: number, \n callback?: () => void\n }) {\n this.pause();\n\n const {from, to, callback} = options;\n this.curFrame = from - 1;\n\n return this.playToFrame({\n frame: to,\n direction: to > from ? 1 : -1,\n callback\n });\n }\n\n public playToFrame(options: {\n frame: number, \n speed?: number, \n direction?: number,\n callback?: () => void\n }) {\n this.pause();\n \n const {frame, speed, callback, direction} = options;\n this.setDirection(direction === undefined ? this.curFrame > frame ? -1 : 1 : direction);\n speed !== undefined && this.setSpeed(speed);\n\n const bounds = [this.curFrame, frame];\n if(this.direction === -1) bounds.reverse();\n \n this.loop = false;\n this.setMinMax(bounds[0], bounds[1]);\n\n if(this.playToFrameOnFrameCallback) {\n this.removeEventListener('enterFrame', this.playToFrameOnFrameCallback);\n }\n\n if(callback) {\n this.playToFrameOnFrameCallback = (frameNo: number) => {\n if(frameNo === frame) {\n this.removeEventListener('enterFrame', this.playToFrameOnFrameCallback);\n callback();\n }\n };\n\n this.addEventListener('enterFrame', this.playToFrameOnFrameCallback);\n }\n\n this.play();\n }\n\n public setColor(color: RLottieColor, renderIfPaused: boolean) {\n this.color = color;\n\n if(renderIfPaused && this.paused) {\n this.renderFrame2(this.imageData.data, this.curFrame);\n }\n }\n\n public setInverseColor(color: RLottieColor) {\n this.inverseColor = color;\n }\n\n private setMinMax(minFrame = 0, maxFrame = this.frameCount - 1) {\n this.minFrame = minFrame;\n this.maxFrame = maxFrame;\n }\n\n public async onLoad(frameCount: number, fps: number) {\n this.frameCount = frameCount;\n this.fps = fps;\n this.setMinMax();\n if(this.initFrame !== undefined) {\n this.initFrame = clamp(this.initFrame, this.minFrame, this.maxFrame);\n }\n\n const curFrame = this.resetCurrentFrame();\n\n // * Handle 30fps stickers if 30fps set\n if(this.fps < 60 && this.skipDelta !== 1) {\n const diff = 60 / fps;\n this.skipDelta = this.skipDelta / diff | 0;\n }\n\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\n this.frThen = Date.now() - this.frInterval;\n //this.sendQuery('renderFrame', 0);\n \n // Кешировать сразу не получится, рендер стикера (тайгер) занимает 519мс, \n // если рендерить 75% с получением каждого кадра из воркера, будет 475мс, т.е. при 100% было бы 593мс, потеря на передаче 84мс. \n\n /* console.time('cache' + this.reqId);\n for(let i = 0; i < frameCount; ++i) {\n //if(this.removed) return;\n \n if(i % 4) {\n await new Promise((resolve) => {\n delete this.listenerResults.enterFrame;\n this.addListener('enterFrame', resolve, true);\n this.requestFrame(i);\n }); \n }\n }\n \n console.timeEnd('cache' + this.reqId); */\n //console.log('cached');\n /* this.el.innerHTML = '';\n this.el.append(this.canvas);\n return; */\n\n !this.skipFirstFrameRendering && this.requestFrame(curFrame);\n this.dispatchEvent('ready');\n this.addEventListener('enterFrame', () => {\n this.dispatchEvent('firstFrame');\n\n if(!this.canvas.parentNode && this.el) {\n this.el.appendChild(this.canvas);\n }\n\n //console.log('enterFrame firstFrame');\n \n //let lastTime = this.frThen;\n this.frameListener = () => {\n if(this.paused) {\n return;\n }\n\n const time = Date.now();\n //console.log(`enterFrame handle${this.reqId}`, time, (time - lastTime), this.frInterval);\n /* if(Math.round(time - lastTime + this.frInterval * 0.25) < Math.round(this.frInterval)) {\n return;\n } */\n\n //lastTime = time;\n\n this.frThen = time + this.frInterval;\n const canContinue = this.currentMethod();\n if(!canContinue && !this.loop && this.autoplay) {\n this.autoplay = false;\n }\n };\n\n this.addEventListener('enterFrame', this.frameListener);\n\n // ! fix autoplaying since there will be no animationIntersector for it,\n if(this.group === 'none' && this.autoplay) {\n this.play();\n }\n }, {once: true});\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport calcImageInBox from \"./calcImageInBox\";\r\nimport EventListenerBase from \"./eventListenerBase\";\r\n\r\nexport class MediaSize {\r\n constructor(public width = 0, public height = width) {\r\n\r\n }\r\n\r\n public aspect(boxSize: MediaSize, fitted: boolean) {\r\n return calcImageInBox(this.width, this.height, boxSize.width, boxSize.height, fitted);\r\n }\r\n\r\n public aspectFitted(boxSize: MediaSize) {\r\n return this.aspect(boxSize, true);\r\n }\r\n\r\n public aspectCovered(boxSize: MediaSize) {\r\n return this.aspect(boxSize, false);\r\n }\r\n}\r\n\r\nexport function makeMediaSize(width?: number, height?: number): MediaSize {\r\n return new MediaSize(width, height);\r\n}\r\n\r\ntype MediaTypeSizes = {\r\n regular: MediaSize,\r\n webpage: MediaSize,\r\n album: MediaSize,\r\n esgSticker: MediaSize,\r\n animatedSticker: MediaSize,\r\n staticSticker: MediaSize,\r\n emojiSticker: MediaSize,\r\n poll: MediaSize,\r\n round: MediaSize,\r\n documentName: MediaSize\r\n};\r\n\r\nexport type MediaSizeType = keyof MediaTypeSizes;\r\n\r\nexport enum ScreenSize {\r\n mobile,\r\n medium,\r\n large\r\n}\r\n\r\nconst MOBILE_SIZE = 600;\r\nconst MEDIUM_SIZE = 1275;\r\nconst LARGE_SIZE = 1680;\r\n\r\nclass MediaSizes extends EventListenerBase<{\r\n changeScreen: (from: ScreenSize, to: ScreenSize) => void,\r\n resize: () => void\r\n}> {\r\n private screenSizes: {key: ScreenSize, value: number}[] = [\r\n {key: ScreenSize.mobile, value: MOBILE_SIZE},\r\n {key: ScreenSize.medium, value: MEDIUM_SIZE},\r\n {key: ScreenSize.large, value: LARGE_SIZE}\r\n ];\r\n\r\n private sizes: {[k in 'desktop' | 'handhelds']: MediaTypeSizes} = {\r\n handhelds: {\r\n regular: makeMediaSize(270, 270),\r\n webpage: makeMediaSize(270, 200),\r\n album: makeMediaSize(270, 0),\r\n esgSticker: makeMediaSize(68, 68),\r\n animatedSticker: makeMediaSize(180, 180),\r\n staticSticker: makeMediaSize(180, 180),\r\n emojiSticker: makeMediaSize(112, 112),\r\n poll: makeMediaSize(240, 0),\r\n round: makeMediaSize(200, 200),\r\n documentName: makeMediaSize(200, 0)\r\n },\r\n desktop: {\r\n regular: makeMediaSize(420, 340),\r\n webpage: makeMediaSize(420, 340),\r\n album: makeMediaSize(420, 0),\r\n esgSticker: makeMediaSize(80, 80),\r\n animatedSticker: makeMediaSize(200, 200),\r\n staticSticker: makeMediaSize(200, 200),\r\n emojiSticker: makeMediaSize(112, 112),\r\n poll: makeMediaSize(330, 0),\r\n round: makeMediaSize(280, 280),\r\n documentName: makeMediaSize(240, 0)\r\n }\r\n };\r\n\r\n public isMobile = false;\r\n public active: MediaTypeSizes;\r\n public activeScreen: ScreenSize;\r\n private rAF: number;\r\n\r\n constructor() {\r\n super();\r\n\r\n window.addEventListener('resize', () => {\r\n if(this.rAF) window.cancelAnimationFrame(this.rAF);\r\n this.rAF = window.requestAnimationFrame(() => {\r\n this.handleResize();\r\n this.rAF = 0;\r\n });\r\n });\r\n this.handleResize();\r\n }\r\n\r\n private handleResize = () => {\r\n const innerWidth = window.innerWidth;\r\n //this.isMobile = innerWidth <= 720;\r\n \r\n let activeScreen = this.screenSizes[0].key;\r\n for(let i = this.screenSizes.length - 1; i >= 0; --i) {\r\n if(this.screenSizes[i].value < innerWidth) {\r\n activeScreen = (this.screenSizes[i + 1] || this.screenSizes[i]).key;\r\n break;\r\n }\r\n }\r\n\r\n const wasScreen = this.activeScreen;\r\n this.activeScreen = activeScreen;\r\n this.isMobile = this.activeScreen === ScreenSize.mobile;\r\n this.active = this.isMobile ? this.sizes.handhelds : this.sizes.desktop;\r\n\r\n //console.time('esg');\r\n //const computedStyle = window.getComputedStyle(document.documentElement);\r\n //this.active.esgSticker.width = parseFloat(computedStyle.getPropertyValue('--esg-sticker-size'));\r\n //console.timeEnd('esg');\r\n\r\n if(wasScreen !== activeScreen) {\r\n //console.log('changeScreen', this.activeScreen, activeScreen);\r\n\r\n if(wasScreen !== undefined) {\r\n this.dispatchEvent('changeScreen', wasScreen, activeScreen);\r\n }\r\n }\r\n\r\n if(wasScreen !== undefined) {\r\n this.dispatchEvent('resize');\r\n }\r\n\r\n /* if(this.isMobile) {\r\n for(let i in this.active) {\r\n // @ts-ignore\r\n let size = this.active[i];\r\n size.width = innerWidth \r\n }\r\n } */\r\n };\r\n}\r\n\r\nconst mediaSizes = new MediaSizes();\r\nMOUNT_CLASS_TO.mediaSizes = mediaSizes;\r\nexport default mediaSizes;\r\n","export default function Worker_fn() {\n return new Worker(__webpack_public_path__ + \"rlottie.worker.086dfed03cbca80766c6.bundle.worker.js\");\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport { IS_SAFARI } from \"../../environment/userAgent\";\nimport EventListenerBase from \"../../helpers/eventListenerBase\";\n\nexport default class QueryableWorker extends EventListenerBase<{\n ready: () => void,\n frame: (reqId: number, frameNo: number, frame: Uint8ClampedArray) => void,\n loaded: (reqId: number, frameCount: number, fps: number) => void,\n error: (reqId: number, error: Error) => void,\n workerError: (error: ErrorEvent) => void\n}> {\n constructor(private worker: Worker) {\n super();\n\n this.worker.onerror = (error) => {\n try {\n this.dispatchEvent('workerError', error);\n this.cleanup();\n this.terminate();\n } catch(err) {\n \n }\n };\n\n this.worker.onmessage = (event) => {\n this.dispatchEvent(event.data.queryMethodListener, ...event.data.queryMethodArguments);\n };\n }\n\n public postMessage(message: any) {\n this.worker.postMessage(message);\n }\n\n public terminate() {\n this.worker.terminate();\n }\n\n public sendQuery(queryMethod: string, ...args: any[]) {\n if(IS_SAFARI) {\n this.worker.postMessage({\n queryMethod: queryMethod,\n queryMethodArguments: args\n });\n } else {\n const transfer: (ArrayBuffer | OffscreenCanvas)[] = [];\n args.forEach(arg => {\n if(arg instanceof ArrayBuffer) {\n transfer.push(arg);\n }\n \n if(typeof(arg) === 'object' && 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 Transferable[]);\n }\n }\n}\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport RLottieWorker from 'worker-loader!./rlottie.worker';\r\nimport animationIntersector from \"../../components/animationIntersector\";\r\nimport { MOUNT_CLASS_TO } from '../../config/debug';\r\nimport pause from '../../helpers/schedulers/pause';\r\nimport { logger, LogTypes } from \"../logger\";\r\nimport apiManager from \"../mtproto/mtprotoworker\";\r\nimport RLottiePlayer, { RLottieOptions } from './rlottiePlayer';\r\nimport QueryableWorker from './queryableWorker';\r\nimport blobConstruct from '../../helpers/blob/blobConstruct';\r\n\r\nexport type LottieAssetName = 'EmptyFolder' | 'Folders_1' | 'Folders_2' | \r\n 'TwoFactorSetupMonkeyClose' | 'TwoFactorSetupMonkeyCloseAndPeek' | \r\n 'TwoFactorSetupMonkeyCloseAndPeekToIdle' | 'TwoFactorSetupMonkeyIdle' | \r\n 'TwoFactorSetupMonkeyPeek' | 'TwoFactorSetupMonkeyTracking' | \r\n 'voice_outlined2' | 'voip_filled' | 'voice_mini';\r\n\r\nexport class LottieLoader {\r\n private isWebAssemblySupported = typeof(WebAssembly) !== 'undefined';\r\n private loadPromise: Promise<void> = !this.isWebAssemblySupported ? Promise.reject() : undefined;\r\n private loaded = false;\r\n\r\n private workersLimit = 4;\r\n private players: {[reqId: number]: RLottiePlayer} = {};\r\n\r\n private workers: QueryableWorker[] = [];\r\n private curWorkerNum = 0;\r\n\r\n private log = logger('LOTTIE', LogTypes.Error);\r\n\r\n public getAnimation(element: HTMLElement) {\r\n for(const i in this.players) {\r\n if(this.players[i].el === element) {\r\n return this.players[i];\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n public setLoop(loop: boolean) {\r\n for(const i in this.players) {\r\n const player = this.players[i];\r\n player.loop = loop;\r\n player.autoplay = player._autoplay;\r\n }\r\n }\r\n\r\n public loadLottieWorkers() {\r\n if(this.loadPromise) {\r\n return this.loadPromise;\r\n }\r\n\r\n return this.loadPromise = new Promise((resolve, reject) => {\r\n let remain = this.workersLimit;\r\n for(let i = 0; i < this.workersLimit; ++i) {\r\n const worker = this.workers[i] = new QueryableWorker(new RLottieWorker());\r\n\r\n worker.addEventListener('ready', () => {\r\n this.log('worker #' + i + ' ready');\r\n\r\n worker.addEventListener('frame', this.onFrame);\r\n worker.addEventListener('loaded', this.onPlayerLoaded);\r\n worker.addEventListener('error', this.onPlayerError);\r\n\r\n --remain;\r\n if(!remain) {\r\n this.log('workers ready');\r\n resolve();\r\n this.loaded = true;\r\n }\r\n }, {once: true});\r\n\r\n worker.addEventListener('workerError', (error) => {\r\n reject('rlottie load error: ' + error.message);\r\n this.loaded = false;\r\n }, {once: true});\r\n }\r\n });\r\n }\r\n\r\n public loadAnimationAsAsset(params: Omit<RLottieOptions, 'animationData' | 'name'>, name: LottieAssetName) {\r\n (params as RLottieOptions).name = name;\r\n return this.loadAnimationFromURL(params, 'assets/tgs/' + name + '.json');\r\n }\r\n\r\n public loadAnimationFromURL(params: Omit<RLottieOptions, 'animationData'>, url: string): Promise<RLottiePlayer> {\r\n if(!this.isWebAssemblySupported) {\r\n return this.loadPromise as any;\r\n }\r\n \r\n if(!this.loaded) {\r\n this.loadLottieWorkers();\r\n }\r\n\r\n return fetch(url)\r\n .then(res => {\r\n if(!res.headers || res.headers.get('content-type') === 'application/octet-stream') {\r\n return res.arrayBuffer().then(data => apiManager.invokeCrypto('gzipUncompress', data)).then(arr => blobConstruct(arr as Uint8Array, ''))\r\n } else {\r\n return res.blob();\r\n }\r\n })\r\n /* .then(str => {\r\n return new Promise<string>((resolve) => setTimeout(() => resolve(str), 2e3));\r\n }) */\r\n .then(blob => {\r\n const newParams = Object.assign(params, {animationData: blob, needUpscale: true});\r\n if(!newParams.name) newParams.name = url;\r\n return this.loadAnimationWorker(newParams);\r\n });\r\n }\r\n\r\n public waitForFirstFrame(player: RLottiePlayer) {\r\n return Promise.race([\r\n /* new Promise<void>((resolve) => {\r\n player.addEventListener('firstFrame', () => {\r\n setTimeout(() => resolve(), 1500);\r\n }, true);\r\n }) */\r\n new Promise<void>((resolve) => {\r\n player.addEventListener('firstFrame', resolve, {once: true});\r\n }),\r\n pause(2500)\r\n ]).then(() => player);\r\n }\r\n\r\n public async loadAnimationWorker(params: RLottieOptions, group = params.group || '', middleware?: () => boolean): Promise<RLottiePlayer> {\r\n if(!this.isWebAssemblySupported) {\r\n return this.loadPromise as any;\r\n }\r\n //params.autoplay = true;\r\n\r\n if(!this.loaded) {\r\n await this.loadLottieWorkers();\r\n }\r\n\r\n if(middleware && !middleware()) {\r\n throw new Error('middleware');\r\n }\r\n\r\n if(!params.width || !params.height) {\r\n params.width = parseInt(params.container.style.width);\r\n params.height = parseInt(params.container.style.height);\r\n }\r\n\r\n if(!params.width || !params.height) {\r\n throw new Error('No size for sticker!');\r\n }\r\n\r\n params.group = group;\r\n\r\n const player = this.initPlayer(params.container, params);\r\n\r\n if(group !== 'none') {\r\n animationIntersector.addAnimation(player, group);\r\n }\r\n\r\n return player;\r\n }\r\n\r\n private onPlayerLoaded = (reqId: number, frameCount: number, fps: number) => {\r\n const rlPlayer = this.players[reqId];\r\n if(!rlPlayer) {\r\n this.log.warn('onPlayerLoaded on destroyed player:', reqId, frameCount);\r\n return;\r\n }\r\n\r\n this.log.debug('onPlayerLoaded');\r\n rlPlayer.onLoad(frameCount, fps);\r\n //rlPlayer.addListener('firstFrame', () => {\r\n //animationIntersector.addAnimation(player, group);\r\n //}, true);\r\n };\r\n\r\n private onFrame = (reqId: number, frameNo: number, frame: Uint8ClampedArray) => {\r\n const rlPlayer = this.players[reqId];\r\n if(!rlPlayer) {\r\n this.log.warn('onFrame on destroyed player:', reqId, frameNo);\r\n return;\r\n }\r\n\r\n if(rlPlayer.clamped !== undefined) {\r\n rlPlayer.clamped = frame;\r\n }\r\n \r\n rlPlayer.renderFrame(frame, frameNo);\r\n };\r\n\r\n private onPlayerError = (reqId: number, error: Error) => {\r\n const rlPlayer = this.players[reqId];\r\n if(rlPlayer) {\r\n // ! will need refactoring later, this is not the best way to remove the animation\r\n const animations = animationIntersector.getAnimations(rlPlayer.el);\r\n animations.forEach(animation => {\r\n animationIntersector.checkAnimation(animation, true, true);\r\n });\r\n }\r\n };\r\n\r\n public onDestroy(reqId: number) {\r\n delete this.players[reqId];\r\n }\r\n\r\n public destroyWorkers() {\r\n this.workers.forEach((worker, idx) => {\r\n worker.terminate();\r\n this.log('worker #' + idx + ' terminated');\r\n });\r\n\r\n this.log('workers destroyed');\r\n this.workers.length = 0;\r\n }\r\n\r\n private initPlayer(el: HTMLElement, options: RLottieOptions) {\r\n const rlPlayer = new RLottiePlayer({\r\n el, \r\n worker: this.workers[this.curWorkerNum++],\r\n options\r\n });\r\n\r\n this.players[rlPlayer.reqId] = rlPlayer;\r\n if(this.curWorkerNum >= this.workers.length) {\r\n this.curWorkerNum = 0;\r\n }\r\n\r\n rlPlayer.loadFromData(options.animationData);\r\n\r\n return rlPlayer;\r\n }\r\n}\r\n\r\nconst lottieLoader = new LottieLoader();\r\nMOUNT_CLASS_TO.lottieLoader = lottieLoader;\r\nexport default lottieLoader;\r\n","export default function indexOfAndSplice<T>(array: Array<T>, item: T) {\n const idx = array.indexOf(item);\n const spliced = idx !== -1 && array.splice(idx, 1);\n return spliced && spliced[0];\n}\n","export default function forEachReverse<T>(array: Array<T>, callback: (value: T, index?: number, array?: Array<T>) => void) {\n for(let length = array.length, i = length - 1; i >= 0; --i) {\n callback(array[i], i, array);\n }\n};\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport rootScope from \"../lib/rootScope\";\r\nimport { IS_SAFARI } from \"../environment/userAgent\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport isInDOM from \"../helpers/dom/isInDOM\";\r\nimport RLottiePlayer from \"../lib/rlottie/rlottiePlayer\";\r\nimport indexOfAndSplice from \"../helpers/array/indexOfAndSplice\";\r\nimport forEachReverse from \"../helpers/array/forEachReverse\";\r\n\r\nexport interface AnimationItem {\r\n el: HTMLElement,\r\n group: string,\r\n animation: RLottiePlayer | HTMLVideoElement\r\n};\r\n\r\nexport class AnimationIntersector {\r\n private observer: IntersectionObserver;\r\n private visible: Set<AnimationItem> = new Set();\r\n\r\n private overrideIdleGroups: Set<string>;\r\n private byGroups: {[group: string]: AnimationItem[]} = {};\r\n private lockedGroups: {[group: string]: true} = {};\r\n private onlyOnePlayableGroup: string = '';\r\n \r\n private intersectionLockedGroups: {[group: string]: true} = {};\r\n private videosLocked = false;\r\n\r\n constructor() {\r\n this.observer = new IntersectionObserver((entries) => {\r\n // if(rootScope.idle.isIDLE) return;\r\n\r\n for(const entry of entries) {\r\n const target = entry.target;\r\n\r\n for(const group in this.byGroups) {\r\n if(this.intersectionLockedGroups[group]) {\r\n continue;\r\n }\r\n\r\n const player = this.byGroups[group].find(p => p.el === target);\r\n if(player) {\r\n if(entry.isIntersecting) {\r\n this.visible.add(player);\r\n this.checkAnimation(player, false);\r\n \r\n /* if(animation instanceof HTMLVideoElement && animation.dataset.src) {\r\n animation.src = animation.dataset.src;\r\n animation.load();\r\n } */\r\n } else {\r\n this.visible.delete(player);\r\n this.checkAnimation(player, true);\r\n \r\n const animation = player.animation;\r\n if(animation instanceof RLottiePlayer/* && animation.cachingDelta === 2 */) {\r\n //console.warn('will clear cache', player);\r\n animation.clearCache();\r\n }/* else if(animation instanceof HTMLVideoElement && animation.src) {\r\n animation.dataset.src = animation.src;\r\n animation.src = '';\r\n animation.load();\r\n } */\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n\r\n this.overrideIdleGroups = new Set();\r\n\r\n rootScope.addEventListener('media_play', ({doc}) => {\r\n if(doc.type === 'round') {\r\n this.videosLocked = true;\r\n this.checkAnimations();\r\n }\r\n });\r\n\r\n rootScope.addEventListener('media_pause', () => {\r\n if(this.videosLocked) {\r\n this.videosLocked = false;\r\n this.checkAnimations();\r\n }\r\n });\r\n }\r\n\r\n public setOverrideIdleGroup(group: string, override: boolean) {\r\n if(override) this.overrideIdleGroups.add(group);\r\n else this.overrideIdleGroups.delete(group);\r\n }\r\n\r\n public getAnimations(element: HTMLElement) {\r\n const found: AnimationItem[] = [];\r\n for(const group in this.byGroups) {\r\n for(const player of this.byGroups[group]) {\r\n if(player.el === element) {\r\n found.push(player);\r\n }\r\n }\r\n }\r\n\r\n return found;\r\n }\r\n\r\n public removeAnimation(player: AnimationItem) {\r\n //console.log('destroy animation');\r\n const {el, animation} = player;\r\n animation.remove();\r\n\r\n if(animation instanceof HTMLVideoElement && IS_SAFARI) {\r\n setTimeout(() => { // TODO: очистка по очереди, а не все вместе с этим таймаутом\r\n animation.src = '';\r\n animation.load();\r\n }, 1e3);\r\n }\r\n\r\n const group = this.byGroups[player.group];\r\n if(group) {\r\n indexOfAndSplice(group, player);\r\n if(!group.length) {\r\n delete this.byGroups[player.group];\r\n }\r\n }\r\n \r\n this.observer.unobserve(el);\r\n this.visible.delete(player);\r\n }\r\n\r\n public addAnimation(animation: RLottiePlayer | HTMLVideoElement, group = '') {\r\n const player = {\r\n el: animation instanceof RLottiePlayer ? animation.el : animation, \r\n animation: animation, \r\n group\r\n };\r\n\r\n if(animation instanceof RLottiePlayer) {\r\n if(!rootScope.settings.stickers.loop && animation.loop) {\r\n animation.loop = rootScope.settings.stickers.loop;\r\n }\r\n }\r\n\r\n (this.byGroups[group] ?? (this.byGroups[group] = [])).push(player);\r\n this.observer.observe(player.el);\r\n }\r\n\r\n public checkAnimations(blurred?: boolean, group?: string, destroy = false) {\r\n // if(rootScope.idle.isIDLE) return;\r\n\r\n if(group !== undefined && !this.byGroups[group]) {\r\n //console.warn('no animation group:', group);\r\n return;\r\n }\r\n \r\n const groups = group !== undefined /* && false */ ? [group] : Object.keys(this.byGroups);\r\n\r\n for(const group of groups) {\r\n const animations = this.byGroups[group];\r\n\r\n forEachReverse(animations, (player) => {\r\n this.checkAnimation(player, blurred, destroy);\r\n });\r\n }\r\n }\r\n\r\n public checkAnimation(player: AnimationItem, blurred = false, destroy = false) {\r\n const {el, animation, group} = player;\r\n //return;\r\n if((destroy || (!isInDOM(el) && !this.lockedGroups[group]))/* && false */) {\r\n this.removeAnimation(player);\r\n return;\r\n }\r\n\r\n if(blurred || (this.onlyOnePlayableGroup && this.onlyOnePlayableGroup !== group) || (animation instanceof HTMLVideoElement && this.videosLocked)) {\r\n if(!animation.paused) {\r\n //console.warn('pause animation:', animation);\r\n animation.pause();\r\n }\r\n } else if(animation.paused && \r\n this.visible.has(player) && \r\n animation.autoplay && \r\n (!this.onlyOnePlayableGroup || this.onlyOnePlayableGroup === group) &&\r\n (!rootScope.idle.isIDLE || this.overrideIdleGroups.has(player.group))\r\n ) {\r\n //console.warn('play animation:', animation);\r\n animation.play();\r\n }\r\n }\r\n\r\n public setOnlyOnePlayableGroup(group: string) {\r\n this.onlyOnePlayableGroup = group;\r\n }\r\n\r\n public lockGroup(group: string) {\r\n this.lockedGroups[group] = true;\r\n }\r\n\r\n public unlockGroup(group: string) {\r\n delete this.lockedGroups[group];\r\n this.checkAnimations(undefined, group);\r\n }\r\n\r\n public refreshGroup(group: string) {\r\n const animations = this.byGroups[group];\r\n if(animations && animations.length) {\r\n animations.forEach(animation => {\r\n this.observer.unobserve(animation.el);\r\n });\r\n\r\n window.requestAnimationFrame(() => {\r\n animations.forEach(animation => {\r\n this.observer.observe(animation.el);\r\n });\r\n });\r\n }\r\n }\r\n\r\n public lockIntersectionGroup(group: string) {\r\n this.intersectionLockedGroups[group] = true;\r\n }\r\n\r\n public unlockIntersectionGroup(group: string) {\r\n delete this.intersectionLockedGroups[group];\r\n this.refreshGroup(group);\r\n }\r\n}\r\n\r\nconst animationIntersector = new AnimationIntersector();\r\nif(MOUNT_CLASS_TO) {\r\n MOUNT_CLASS_TO.animationIntersector = animationIntersector;\r\n}\r\nexport default animationIntersector;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport Page from \"./page\";\r\nimport lottieLoader from \"../lib/rlottie/lottieLoader\";\r\nimport { horizontalMenu } from \"../components/horizontalMenu\";\r\nimport { MOUNT_CLASS_TO } from \"../config/debug\";\r\nimport fastSmoothScroll from \"../helpers/fastSmoothScroll\";\r\nimport whichChild from \"../helpers/dom/whichChild\";\r\n\r\nclass PagesManager {\r\n private pageId = -1;\r\n private page: Page;\r\n\r\n private selectTab: ReturnType<typeof horizontalMenu>;\r\n public pagesDiv: HTMLDivElement;\r\n public scrollableDiv: HTMLElement;\r\n\r\n constructor() {\r\n this.pagesDiv = document.getElementById('auth-pages') as HTMLDivElement;\r\n this.scrollableDiv = this.pagesDiv.querySelector('.scrollable') as HTMLElement;\r\n this.selectTab = horizontalMenu(null, this.scrollableDiv.querySelector('.tabs-container') as HTMLDivElement, null, () => {\r\n if(this.page?.onShown) {\r\n this.page.onShown();\r\n }\r\n });\r\n }\r\n\r\n public setPage(page: Page) {\r\n if(page.isAuthPage) {\r\n this.pagesDiv.style.display = '';\r\n\r\n let id = whichChild(page.pageEl);\r\n if(this.pageId === id) return;\r\n\r\n this.selectTab(id);\r\n\r\n if(this.pageId !== -1 && id > 1) {\r\n lottieLoader.loadLottieWorkers();\r\n }\r\n\r\n\r\n\r\n this.pageId = id;\r\n\r\n if(this.scrollableDiv) {\r\n fastSmoothScroll({\r\n container: this.scrollableDiv, \r\n element: this.scrollableDiv.firstElementChild as HTMLElement, \r\n position: 'start'\r\n });\r\n }\r\n } else {\r\n this.pagesDiv.style.display = 'none';\r\n page.pageEl.style.display = '';\r\n\r\n this.pageId = -1;\r\n }\r\n\r\n this.page = page;\r\n }\r\n}\r\n\r\nconst pagesManager = new PagesManager();\r\nMOUNT_CLASS_TO.pagesManager = pagesManager;\r\nexport default pagesManager;\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nimport pagesManager from \"./pagesManager\";\r\n\r\nexport default class Page {\r\n public pageEl: HTMLDivElement;\r\n private installed = false;\r\n\r\n constructor(className: string, public isAuthPage: boolean, private onFirstMount?: (...args: any[]) => Promise<any> | void, private onMount?: (...args: any[]) => void, public onShown?: () => void) {\r\n this.pageEl = document.body.querySelector('.' + className) as HTMLDivElement;\r\n }\r\n\r\n public async mount(...args: any[]) {\r\n //this.pageEl.style.display = '';\r\n\r\n if(this.onMount) {\r\n this.onMount(...args);\r\n }\r\n\r\n if(!this.installed) {\r\n if(this.onFirstMount) {\r\n try {\r\n const res = this.onFirstMount(...args);\r\n if(res instanceof Promise) {\r\n await res;\r\n }\r\n } catch(err) {\r\n console.error('PAGE MOUNT ERROR:', err);\r\n }\r\n }\r\n \r\n this.installed = true;\r\n }\r\n\r\n pagesManager.setPage(this);\r\n }\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\n// * Jolly Cobra's useHeavyAnimationCheck.ts, patched\r\n\r\nimport { AnyToVoidFunction } from '../types';\r\nimport ListenerSetter from '../helpers/listenerSetter';\r\nimport deferredPromise, { CancellablePromise } from '../helpers/cancellablePromise';\r\nimport rootScope from '../lib/rootScope';\r\nimport DEBUG from '../config/debug';\r\nimport pause from '../helpers/schedulers/pause';\r\n\r\nconst ANIMATION_START_EVENT = 'event-heavy-animation-start';\r\nconst ANIMATION_END_EVENT = 'event-heavy-animation-end';\r\n\r\nlet isAnimating = false;\r\nlet heavyAnimationPromise: CancellablePromise<void> = deferredPromise<void>();\r\nlet promisesInQueue = 0;\r\n\r\nheavyAnimationPromise.resolve();\r\n\r\nconst log = console.log.bind(console.log, '[HEAVY-ANIMATION]:');\r\n\r\nexport function dispatchHeavyAnimationEvent(promise: Promise<any>, timeout?: number) {\r\n if(!isAnimating) {\r\n heavyAnimationPromise = deferredPromise<void>();\r\n rootScope.dispatchEvent(ANIMATION_START_EVENT);\r\n isAnimating = true;\r\n DEBUG && log('start');\r\n }\r\n \r\n ++promisesInQueue;\r\n DEBUG && log('attach promise, length:', promisesInQueue, timeout);\r\n\r\n const promises = [\r\n timeout !== undefined ? pause(timeout) : undefined,\r\n promise.finally(() => {})\r\n ].filter(Boolean);\r\n\r\n const perf = performance.now();\r\n const _heavyAnimationPromise = heavyAnimationPromise;\r\n Promise.race(promises).then(() => {\r\n if(heavyAnimationPromise !== _heavyAnimationPromise || heavyAnimationPromise.isFulfilled) { // interrupted\r\n return;\r\n }\r\n\r\n --promisesInQueue;\r\n DEBUG && log('promise end, length:', promisesInQueue, performance.now() - perf);\r\n if(promisesInQueue <= 0) {\r\n onHeavyAnimationEnd();\r\n }\r\n });\r\n\r\n return heavyAnimationPromise;\r\n}\r\n\r\nfunction onHeavyAnimationEnd() {\r\n if(heavyAnimationPromise.isFulfilled) {\r\n return;\r\n }\r\n\r\n isAnimating = false;\r\n promisesInQueue = 0;\r\n rootScope.dispatchEvent(ANIMATION_END_EVENT);\r\n heavyAnimationPromise.resolve();\r\n\r\n DEBUG && log('end');\r\n}\r\n\r\nexport function interruptHeavyAnimation() {\r\n onHeavyAnimationEnd();\r\n}\r\n\r\nexport function getHeavyAnimationPromise() {\r\n return heavyAnimationPromise;\r\n}\r\n\r\nexport default function(\r\n handleAnimationStart: AnyToVoidFunction,\r\n handleAnimationEnd: AnyToVoidFunction,\r\n listenerSetter?: ListenerSetter\r\n) {\r\n //useEffect(() => {\r\n if(isAnimating) {\r\n handleAnimationStart();\r\n }\r\n\r\n const add = listenerSetter ? listenerSetter.add(rootScope) : rootScope.addEventListener.bind(rootScope);\r\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, rootScope) : rootScope.removeEventListener.bind(rootScope);\r\n add(ANIMATION_START_EVENT, handleAnimationStart);\r\n add(ANIMATION_END_EVENT, handleAnimationEnd);\r\n\r\n return () => {\r\n remove(ANIMATION_END_EVENT, handleAnimationEnd);\r\n remove(ANIMATION_START_EVENT, handleAnimationStart);\r\n };\r\n //}, [handleAnimationEnd, handleAnimationStart]);\r\n}\r\n","/*\r\n * https://github.com/morethanwords/tweb\r\n * Copyright (C) 2019-2021 Eduard Kuzmenko\r\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\r\n */\r\n\r\nexport default function whichChild(elem: Node) {\r\n if(!elem.parentNode) {\r\n return -1;\r\n }\r\n \r\n let i = 0;\r\n // @ts-ignore\r\n while((elem = elem.previousElementSibling) !== null) ++i;\r\n return i;\r\n}\r\n"],"sourceRoot":""}