{"version":3,"file":"static/chunks/334-f9ffcac5f51b9540.js","mappings":"oNA6CE,IAAF,4BACA,iBAOE,IAAIA,EAJJC,EAAoBC,SAAQC,IAC1BA,EAAYC,mBAAoB,KAMhCJ,EADEK,MAAMC,QAAQC,GACD,IAAIN,KAAwBM,GAC/C,uBACmBP,EAAAA,EAAAA,IAASO,EAAiBN,IAE1BA,EAGjB,IAAF,EAxCA,SAA0BD,GACxB,IAAF,KAgBE,OAdAA,EAAaE,SAAQM,IACnB,MAAM,KAAVC,GAAA,EAEI,IAAJ,OAIQC,IAAqBA,EAAiBN,mBAAqBI,EAAgBJ,oBAI/EO,EAAmBF,GAAQD,MAGtBI,OAAOC,OAAOF,GAuBvB,IAMA,qCACE,IAAoB,IAAhBG,EAAmB,CACrB,MAAOC,GAAiBC,EAAkBC,OAAOH,EAAY,GAC7DE,EAAkBE,KAAKH,GAGzB,OAAOC,E,WC5DTG,EACAC,IAEwB,IAAlBA,EAAQC,QACd,wDACMC,EAAAA,GAAAA,SAGA,QAANC,KAAAA,iFAIE,IAAF,aACA,eACMC,GACFA,EAAMC,OAAOL,EAAQM,cAGvB,IAAF,WACEC,EAAIC,WAAWC,G,cC7BjB,wE,QAeE,sBAAF,yBAKE,SAAF,eAEE,cAAF,gFAAAC,EAAAA,UAAAA,OAAAA,KAAAA,MAKE,UAAFC,EAAAA,GACI,IAAJ,MACM,IAAN,MACM,GAAIJ,EAAK,CACP,IAAR,sBACQ,GAAIK,EAAM,CACR,IAAV,gBACA,sBACA,E,WAgBA,IAFAC,EAEA,uDAFA,GACAC,EACA,uDADA,GAEE,MAAO,CACLC,UAAW,IAAKF,EAAgBE,WAAa,MAASD,EAAcC,WAAa,IACjFC,SAAU,IAAKH,EAAgBG,UAAY,MAASF,EAAcE,UAAY,IAC9EC,aAAc,IAClB,sBACA,sBACA,GAEIC,oBAAmDC,IAAnCN,EAAgBK,gBAA+BL,EAAgBK,gBAzBnF,eACU,O,cA8BR,GAAIlB,EAAQkB,gBA6Ed,SAAwBE,GACtB,IAEE,MAAJ,2CAEA,UAGE,OAAO,EArFuBC,CAAeD,GAG3C,OAFJ,0DACAlB,EAAAA,GAAAA,KAAAA,6DAAAA,QAAAA,EAAAA,EAAAA,IAAAA,MACW,EAET,GA4BF,SAAyBkB,EAAzB,GACE,IAAKH,IAAiBA,EAAaK,OACjC,OAAO,EAGT,OAuBF,SAAmCF,GACjC,GAAIA,EAAMG,QACR,MAAO,CAACH,EAAMG,SAEhB,GAAIH,EAAMI,UACR,IACE,MAAM,KAAZC,EAAAA,GAAAA,MAAAC,EAAAA,IAAA,8CACM,MAAO,CAAC,GAAd,uCACA,SAEM,OADN,8HACa,GAGX,MAAO,GApCAC,CAA0BP,GAAOQ,MAAKL,GAC/CN,EAAAA,MAAAA,IAAAA,EAAAA,EAAAA,IAAAA,EAAAA,OAlCMY,CAAgBT,EAAOpB,EAAQiB,cAKjC,OAJJ,0DACAf,EAAAA,GAAAA,KAAAA,wEAAAA,QACA4B,EAAAA,EAAAA,IAAAA,MAEW,EAET,GA+BF,SAAsBV,EAAtB,GAEE,IAAKJ,IAAaA,EAASM,OACzB,OAAO,EAET,IAAF,OACE,QAAQS,GAAcf,EAASY,MAAKI,IAAW,QAAkBD,EAAKC,KArClEC,CAAab,EAAOpB,EAAQgB,UAO9B,OANJ,0DACAd,EAAAA,GAAAA,KAAAA,oEAAAA,QACA4B,EAAAA,EAAAA,IACAV,GAFA,mBAGAc,EAAAA,MAEW,EAET,IA+BF,SAAuBd,EAAvB,GAEE,IAAKL,IAAcA,EAAUO,OAC3B,OAAO,EAET,IAAF,OACE,OAAQS,GAAahB,EAAUa,MAAKI,IAAW,QAAkBD,EAAKC,KArCjEG,CAAcf,EAAOpB,EAAQe,WAOhC,OANJ,0DACAb,EAAAA,GAAAA,KAAAA,yEAAAA,QACA4B,EAAAA,EAAAA,IACAV,GAFA,mBAGAc,EAAAA,MAEW,EAET,OAAO,EA5DQE,CAAiBhB,EAAOpB,GAAW,KAAOoB,GAGrD,OAAOA,GAGTiB,EAAaC,GAAKC,KAAKlD,KACvBmD,EAAwBH,IA2H5B,SAASH,EAAmBd,GAC1B,IACE,IAAIqB,EACJ,IAEEA,EAASrB,EAAMI,UAAU/B,OAAO,GAAGiD,WAAWD,OACpD,UAGI,OAAOA,EArBX,2EACE,IAAK,IAAIE,EAAIF,EAAOnB,OAAS,EAAGqB,GAAK,EAAGA,IAAK,CAC3C,IAAJ,OAEI,GAAIC,GAA4B,gBAAnBA,EAAMC,UAAiD,kBAAnBD,EAAMC,SACrD,OAAOD,EAAMC,UAAY,KAI7B,OAAO,KAYWC,CAAiBL,GAAU,KAC/C,SAEI,OADJ,0HACW,MArIX/B,EAAAA,e,cC/CA,IAAIqC,E,oDAOF,sBAAF,2BAKE,SAAF,eAKE,YACE,EAAJA,SAAAA,UAAAA,SAGI,SAAJC,UAAAA,SAAAA,WAAA,IAEM,IAAN,uBAFA,8CAAAC,EAAAA,GAAAA,UAAAA,GAGM,OAAOF,EAAyBG,MAAMC,EAASF,KAGrDG,EAAAA,e,4ECrBE,YAAFC,GAAA,oEACIC,MAAM/B,GAAN,KAAJ,UAEIgB,KAAKlD,gBAAkBkE,UAAUF,YAAYhE,KAI7CG,OAAOgE,eAAejB,gBAAiBgB,WACvChB,KAAKkB,SAAWA,GCZpB,uE,4EAgBE,MAAM,KAARC,EAAAA,KAAAC,EAAAA,KAAAC,EAAAA,KAAAC,EAAAA,UAAAC,EAAAA,SAAAC,EAAAA,UAAAC,GAAA,EACE,MACF,sEACAN,GADA,OACAG,EAAAA,IAAAA,OAAAA,GAAAA,GADA,YACAF,EAAAA,GAAAA,OAAAA,EAAAA,KAAAA,GADA,OACAG,GAqCA,SAASG,EAAkBC,GACzB,MAAO,CACLH,SAAUG,EAAWH,SACrBC,UAAWE,EAAWF,WAAa,GACnCJ,KAAMM,EAAWN,MAAQ,GACzBF,KAAMQ,EAAWR,KACjBG,KAAMK,EAAWL,MAAQ,GACzBF,KAAMO,EAAWP,MAAQ,GACzBG,UAAWI,EAAWJ,W,cAmCxB,IAAF,sB,YArEE,IAAF,YAEE,IAAKK,EACH,MAAM,IAAIC,EAAY,uBAAD,WAGvB,MAAOL,EAAUC,EAAWJ,EAAO,GAAIF,EAAMG,EAAO,GAAIQ,GAAYF,EAAMG,MAAM,GAChF,IAAIX,EAAO,GACPG,EAAYO,EAEhB,IAAF,eAME,GALIE,EAAMjD,OAAS,IACjBqC,EAAOY,EAAMD,MAAM,GAAI,GAAGE,KAAK,KAC/BV,EAAYS,EAAME,OAGhBX,EAAW,CACb,IAAJ,kBACQY,IACFZ,EAAYY,EAAa,IAI7B,OAAOT,EAAkB,CAA3BP,KAAAA,EAAAE,KAAAA,EAAAD,KAAAA,EAAAG,UAAAA,EAAAD,KAAAA,EAAAE,SAAAA,EAAAC,UAAAA,IA8CA,SAEE,OAjCF,SAAqBW,GACnB,GAAF,yDACI,OAGF,MAAM,KAARd,EAAAA,UAAAC,EAAAA,SAAAC,GAAA,EASE,GAPF,4CACqBjF,SAAQ8F,IACzB,IAAKD,EAAIC,GACP,MAAM,IAAIR,EAAY,uBAAD,0BAIpBN,EAAUK,MAAM,SACnB,MAAM,IAAIC,EAAY,yCAAD,WAGvB,IApFF,SAAyBL,GACvB,MAAoB,SAAbA,GAAoC,UAAbA,EAmFzBc,CAAgBd,GACnB,MAAM,IAAIK,EAAY,wCAAD,WAGvB,GAAIP,GAAQiB,MAAMC,SAASlB,EAAM,KAC/B,MAAM,IAAIO,EAAY,oCAAD,WASvBY,CAAYd,GACLA,E,sGCxFP,MAAO,CAACe,EAASC,G,gBASjB,MAAOD,EAASC,GAASC,EACzB,MAAO,CAACF,EAAS,IAAIC,EAAOE,I,WAQ9BD,EACAE,GAEA,KACgBvG,SAAQ,IACpB,IAAJ,YACIuG,EAASC,EAAcC,MAI3B,SAASC,EAAWC,EAApB,GAEE,OADF,oBACcC,OAAOD,G,gBAOnB,MAAOE,EAAYT,GAASC,EAG5B,IAAIS,EAAN,kBAEE,SAASC,EAAOC,GACO,kBAAVF,EACTA,EAAwB,kBAATE,EAAoBF,EAAQE,EAAO,CAACN,EAAWI,EAAOG,GAAcD,GAEnFF,EAAM9F,KAAqB,kBAATgG,EAAoBN,EAAWM,EAAMC,GAAeD,GAI1E,IAAK,IAAP,QACI,MAAOE,EAAaC,GAAWC,EAC/BL,EAAO,KAAXA,OAAAA,KAAAA,UAAAA,GAAAA,OACIA,EAA0B,kBAAZI,GAAwBA,aAAmBE,WAAaF,EAAUG,KAAKC,UAAUJ,IAGjG,MAAwB,kBAAVL,EAAqBA,EAGrC,SAAuBU,GACrB,IAAF,kCAEA,oBACE,IAAIC,EAAS,EACb,IAAK,IAAP,OACIC,EAAOC,IAAIC,EAAQH,GACnBA,GAAUG,EAAOpF,OAGnB,OAAOkF,EAboCG,CAAcf,G,WAoB3DgB,EACAb,GAEE,IAAF,8CAEE,MAAO,EACTc,EAAAA,EAAAA,IAAAA,CACI,KAAJpF,aACI,OAAJH,EAAAA,OACI,SAAJuB,EAAAA,SACI,aAAJiE,EAAAA,YACI,gBAAJC,EAAAA,iBAEAL,GAIA,OACEM,QAAS,UACTC,SAAU,UACVL,WAAY,aACZM,YAAa,cACb9F,MAAO,QACP+F,cAAe,WACfC,YAAa,W,cAOb,OAAOC,EAA+B5F,G,2BC/GtC,IAAF,8BACA,mBAgCE,MAAO,CA/BP,SAAiB6F,GACf,GAAIC,EACF,QAAIC,EAAMC,IAAIH,KAGdE,EAAME,IAAIJ,IACH,GAET,IAAJ,wBAGM,GADN,OACoBA,EACZ,OAAO,EAIX,OADAE,EAAM1H,KAAKwH,IACJ,GAGT,SAAmBA,GACjB,GAAIC,EACFC,EAAMG,OAAOL,QAEb,IAAK,IAAI3E,EAAI,EAAGA,EAAI6E,EAAMlG,OAAQqB,IAChC,GAAI6E,EAAM7E,KAAO2E,EAAK,CACpBE,EAAM3H,OAAO8C,EAAG,GAChB,S,4ICPR,IAEE,OAAOiF,EAAM,GAAInC,EAAOoC,EAAOC,GACnC,SACI,MAAO,CAAXC,MAAAA,yBAAAA,OAAAA,EAAAA,O,WAMAC,GAMA,IAHAH,EAGA,uDAHA,EAEAI,EACA,uDADA,OAEE,IAAF,SAEE,OAAIC,EAASC,GAAcF,EAClBG,EAAgBJ,EAAQH,EAAQ,EAAGI,GAGrCE,EAYT,SAASP,EACTS,EACA3G,GAIA,IAHAmG,EAGA,uDAHA,IACAC,EAEA,uDAFA,IACAQ,EACA,uDADAC,IAEE,MAAOC,EAASC,GAAaH,EAG7B,GAAc,OAAV5G,GAAkB,CAAxB,8DACI,OAAOA,EAGT,IAAF,SAIE,IAAKgH,EAAYC,WAAW,YAC1B,OAAOD,EAQT,GAAI,EAAN,8BACI,OAAOhH,EAIT,GAAc,IAAVmG,EAEF,OAAOa,EAAYE,QAAQ,UAAW,IAIxC,GAAIJ,EAAQ9G,GACV,MAAO,eAIT,IAAF,IACE,GAAImH,GAAqD,oBAA3BA,EAAgBC,OAC5C,IACE,IAAN,aAEM,OAAOlB,EAAM,GAAImB,EAAWlB,EAAQ,EAAGC,EAAeQ,GAC5D,UAQE,IAAF,yBACE,IAAIU,EAAW,EAIf,IAAF,cAEE,IAAK,IAAP,OAEI,GAAKxJ,OAAO+D,UAAU0F,eAAeC,KAAKC,EAAWC,GAArD,CAIA,GAAIJ,GAAYlB,EAAe,CAC7BK,EAAWiB,GAAY,oBACvB,MAIF,IAAJ,OACIjB,EAAWiB,GAAYxB,EAAMwB,EAAUC,EAAYxB,EAAQ,EAAGC,EAAeQ,GAE7EU,GAAY,EAOd,OAHAP,EAAU/G,GAGHyG,EAeT,SAASmB,EACTjB,EAGA3G,GAEE,IACE,MAAY,WAAR2G,GAAoB3G,GAA0B,kBAAVA,GAAsB,EAAlE,QACa,WAGG,kBAAR2G,EACK,kBAMa,qBAAX,EAAAkB,GAA0B7H,IAAU,EAAA6H,EACtC,WAGb,wCAEa,WAGb,4CAEa,cAIL,EAAAC,EAAA,IAAiB9H,GACZ,mBAGY,kBAAVA,GAAsBA,IAAUA,EAClC,aAIK,IAAVA,EACK,cAGY,oBAAVA,EACF,cAAb,wBAGyB,kBAAVA,EACF,IAAb,sBAIyB,kBAAVA,EACF,YAAb,sBAOW,WAAX,sDACA,SACI,MAAO,yBAAX,eAWA,cAEE,OARF,SAAoBA,GAClB,QAAF,mCAOS+H,CAAWrD,KAAKC,UAAU3E,I,8NCnPnC,SAASgI,EAAmB/E,GAC1B,IAAF,0CACA,+BACE,MAAO,GAAT,qFAIA,SAASgF,EAAmBhF,GAC1B,MAAO,GAAT,8CAIA,SAASiF,EAAajF,EAAtB,GACE,OAAO,Q,qWAAU,CAAD,CAGdkF,WAAYlF,EAAIX,UAChB8F,eApBJ,KAqBAC,GAAAA,CAAI,cAAJC,GAAAA,OAAAA,EAAAA,KAAAA,KAAAA,OAAAA,EAAAA,Y,WAUArF,GAIA,IADAsF,EACA,uDADA,GAME,IAAF,iCACA,EACA,wDAEE,OAAOC,GAAkB,GAA3B,gC,qkBH/BA,cACA,cACA,OAEA,WAAA7K,EAAAA,QAAA8K,GAAA,MACA,OAAA9K,KAAAA,EAAA8K,QAAAA,G,YA2CA/I,EACAuD,EACAyF,EACAF,GAEE,IAAF,OACA,kBAEE,MAAF,oBAAAG,GAAA,6BACAC,OAAAA,EAAAC,KAAAA,GAAA,OA7CA,cACA,IAGAnJ,EAAAA,IAAAA,EAAAA,KAAAA,GACAA,EAAAA,IAAAA,KAAAA,EAAAA,IAAAA,MAAAA,EAAAA,KACAA,EAAAA,IAAAA,QAAAA,EAAAA,IAAAA,SAAAA,EAAAA,QACAA,EAAAA,IAAAA,aAAAA,IAAAA,EAAAA,IAAAA,cAAAA,MAAAA,EAAAA,cAAAA,IACE,EAAFA,IAAAA,SAAAA,IAAAA,EAAAA,IAAAA,UAAAA,MAAAA,EAAAA,UAAAA,KAuCAoJ,CAAAA,EAAAA,GAAAA,EAAAA,KAEA,MAkBA,SACApJ,EACA2I,EACAG,EACAvF,GAEE,IAAF,0EAEE,OAAO,OACL,SAAJ8F,EAAAA,SACI,SAAJC,IAAAA,MAAAA,eACAX,GAAAA,CAAI,IAAJY,MACA,IAAI,IAAJhG,EAAAA,KACAvD,gBAAAA,EAAAA,MACAwJ,GAAA,CACAC,OAAAA,EAAAA,EAAAA,IAAAA,EAAAA,GAAAA,MAjCA,UAeA,cATA,wBASS,EAAc,GAPvB,CACA,CACApJ,KAAAA,EACAqJ,aAAAA,CAAAA,CAAAxI,GAAAA,EAAAiI,KAAAA,KAEAnJ,K,ykBI/CA,qE,SA2CE,SAAF,sBAGE,UAAF,iCAGE,UAAF,sBAGE,UAAF,kBAOE,YAAFiC,GAEI,GAFJ0H,GAAAA,UAAAA,OAAAA,KAAAA,MAAAA,GAAAA,UAAAA,QAAAA,KAAAA,MAAAA,GAAAA,UAAAA,QAAAA,KAAAA,MAAAA,GAAAA,UAAAA,QAAAA,KAAAA,MACIxI,KAAKyI,SAAWhL,EACZA,EAAQ2E,IAAK,CACfpC,KAAK0I,KAAO,EAAQjL,EAAQ2E,KAC5B,IAAN,iBACMpC,KAAK2I,WAAalL,EAAQmL,UAAU,OAClCC,mBAAoB7I,KAAK6I,mBAAmBC,KAAK9I,OACzDvC,EAAAA,kBAFA,IAGQ+B,IAAAA,UAGR,qHAOE,iBAAFuJ,EAAAA,EAAAA,GAGI,IAAI,QAAwB9J,GAE1B,aADN,wEAII,IAAI+J,EAAR,cAUI,OARAhJ,KAAKiJ,SACT,6BACAC,MAAArK,GAAAA,KAAAA,cAAAA,EAAAA,EAAAA,KACAqK,MAAAC,IACM,EAANH,MAIWA,EAMT,eACFhK,EACAoK,EAEAC,EACAxL,GAEI,IAAImL,EAAR,cAEI,IAAJ,cACA,qCACA,6BAUI,OARAhJ,KAAKiJ,SACTK,EACAJ,MAAArK,GAAAA,KAAAA,cAAAA,EAAAA,EAAAA,KACAqK,MAAAC,IACM,EAANH,MAIWA,EAMT,aAAFO,EAAAA,EAAAA,GAEI,GAAIF,GAAQA,EAAKG,oBAAqB,QAAwBH,EAAKG,mBAEjE,aADN,wEAII,IAAIR,EAAR,cAQI,OANAhJ,KAAKiJ,SACT,oCACM,EAAND,MAIWA,EAMT,eAAFS,GACSzJ,KAAK0J,aAKuB,kBAApBjF,EAAQkF,SACzB,mIAEM3J,KAAK4J,YAAYnF,IAEjBoF,EAAAA,EAAAA,IAAcpF,EAAS,CAA7BqF,MAAAA,MATA,kHAgBE,SACE,OAAO9J,KAAK0I,KAMd,aACE,OAAO1I,KAAKyI,SAMd,eACE,OAAOzI,KAAK2I,WAMd,MAAFoB,GACI,IAAJ,kBACI,OAAInB,EACK5I,KAAKgK,wBAAwBC,GAASf,MAAKgB,GACzCtB,EAAUmB,MAAME,GAASf,MAAKiB,GAAoBD,GAAkBC,OAGtE,SAAoB,GAO/B,MAAFC,GACI,OAAOpK,KAAK+J,MAAME,GAASf,MAAKC,IAC9BnJ,KAAKqK,aAAaC,SAAU,EACrBnB,KAOX,oBACMnJ,KAAK0J,eAAiB1J,KAAKuK,2BAC7BvK,KAAKwK,c,YV5KT,IAAF,KAYE,OAVAnO,EAAaE,SAAQC,IACnBiO,EAAiBjO,EAAYM,MAAQN,GAEoB,IAArDkO,EAAsBC,QAAQnO,EAAYM,QAC5CN,EAAY4B,UAAU5B,EAAAA,EAAyBA,EAAAA,IAC/CkO,EAAsBnN,KAAKf,EAAYM,OAC7C,iHAIS2N,EUgKkBG,CAAkB5K,KAAKyI,SAASpM,cACrD2D,KAAKuK,0BAA2B,GASpC,mBAAFM,GACI,OAAO7K,KAAKwK,cAAcM,GAM5B,eAAFC,GACI,IACE,OAAO,KAAb,0BACA,SAEM,OADN,4IACa,MAOX,UAAFC,GAAA,gEACI,GAAIhL,KAAK0I,KAAM,CACb,IAAIuC,EAAMC,GAAoBrM,EAAOmB,KAAK0I,KAAM1I,KAAKyI,SAAS0C,UAAWnL,KAAKyI,SAASd,QAEvF,IAAK,IAAX,uBACQsD,EAAMA,EACdA,EACAG,EACA/G,EACA,6EAKMrE,KAAKqL,cAAcJ,IAOvB,YAAFrB,GACI,GAAI5J,KAAK0I,KAAM,CACb,IAAN,E,SJ3QAjE,EACArC,EACAyF,EACAF,GAEE,IAAF,OAUE,OAAO,EATT,KACAQ,SAAAA,IAAAA,MAAAA,eACAX,GAAAA,CAAAY,IAAAA,MACA,IAAAhG,IAAAA,EAAAA,KAMuB,CAFvB,mBAAAlD,KAAAA,YAAA,KAAAA,KAAAA,WAAA,KI8PA,2DACMc,KAAKqL,cAAcJ,IAOvB,mBAAFpC,EAAAA,GACI,GAAI7I,KAAKyI,SAAS6C,kBAAmB,CAOnC,IAAN,8BACA,sGAGMtL,KAAKuL,UAAUzF,GAAO9F,KAAKuL,UAAUzF,GAAO,GAAK,GAKrD,wBAAF0F,EAAAA,GACI,IAAIC,GAAU,EACVC,GAAU,EACd,IAAJ,kCAEI,GAAIC,EAGF,IAAK,IAAX,KAFMD,GAAU,EAEhB,IACQ,IAAR,cACQ,GAAIE,IAAmC,IAAtBA,EAAUC,QAAmB,CAC5CJ,GAAU,EACV,OAQN,IAAJ,mBACA,0BAGM5B,EAAAA,EAAAA,IAAcpF,EAASoF,GAAAA,GAAAA,GAC7B4B,GAAAA,CAAQ,OAARK,YADA,IAEQC,OAAQtH,EAAQsH,QAAUC,OAAON,GAAWD,MAE9CzL,KAAKyJ,eAAehF,IAcxB,wBAAFuF,GACI,OAAO,IAAI,MAAYiC,IACrB,IAAIC,EAAV,EACM,IAEN,oBACmC,GAAvBlM,KAAKmM,gBACPC,cAAcC,GACdJ,GAAQ,KAERC,GAPV,EAQcjC,GAAWiC,GAAUjC,IACvBmC,cAAcC,GACdJ,GAAQ,OAVpB,MAkBE,aACE,OAAqC,IAA9BjM,KAAKqK,aAAaC,cAAmC1L,IAAdoB,KAAK0I,KAiBrD,cAAF4D,EAAAA,EAAAA,GACI,MAAM,eAAVC,EAAAA,EAAAA,oBAAAC,EAAAA,KAAA,kBACI,IAAJ,WACA3N,GADA,IAEMqJ,SAAUrJ,EAAMqJ,UAAYmB,EAAKnB,WAAYA,EAAAA,EAAAA,MAC7CuE,UAAW5N,EAAM4N,YAAaA,EAAAA,EAAAA,QAGhCzM,KAAK0M,oBAAoBC,GACzB3M,KAAK4M,2BAA2BD,GAIhC,IAAIE,EAAahP,EACbwL,EAAKyD,iBACPD,EAAaA,EAAAA,EAAAA,MAAYA,GAAY/O,OAAOuL,EAAKyD,iBAInD,IAAI3D,GAAS,QAAmB,GAIhC,GAAI0D,EAAY,CAEd,IAAN,+CAEUE,EAAYhO,SACdsK,EAAK0D,YAAcA,GAIrB5D,EAAS0D,EAAWG,aAAaL,EAAUtD,GAG7C,OAAOF,EAAOD,MAAK+D,GACa,kBAAnBV,GAA+BA,EAAiB,EAClDvM,KAAKkN,gBAAgBD,EAAKV,EAAgBC,GAE5CS,IAcX,gBAAFC,EAAAA,EAAAA,GACI,IAAKrO,EACH,OAAO,KAGT,IAAJ,oBACAA,GACAA,EAAAA,aAAAA,CACM,YAANsO,EAAAA,YAAAA,KAAAA,GAAAA,GAAAA,GAAAA,GACAC,GACAA,EAAAA,MAAAA,CACQ,KAARC,EAAAA,EAAAA,KAAAA,EAAAA,SAIAxO,EAAAA,MAAAA,CACM,KAANyO,EAAAA,EAAAA,KAAAA,EAAAA,KAEAzO,EAAAA,UAAAA,CACM,SAAN0O,EAAAA,EAAAA,SAAAA,EAAAA,KAEA1O,EAAAA,OAAAA,CACM,MAAN2O,EAAAA,EAAAA,MAAAA,EAAAA,KA+BI,OApBI3O,EAAM0O,UAAY1O,EAAM0O,SAASjF,OAAS1C,EAAW2H,WACvD3H,EAAW2H,SAASjF,MAAQzJ,EAAM0O,SAASjF,MAGvCzJ,EAAM0O,SAASjF,MAAM+E,OACvBzH,EAAW2H,SAASjF,MAAM+E,KAAOzH,EAAU/G,EAAM0O,SAASjF,MAAM+E,KAAM/H,EAAOmI,KAK7E5O,EAAM6O,QACR9H,EAAW8H,MAAQ7O,EAAM6O,MAAMC,KAAIC,IAE7BA,EAAKP,OACPO,EAAKP,KAAOO,EAAUA,EAAKP,KAAM/H,EAAOmI,IAEnCG,MAIJhI,EAST,oBAAF8G,GACI,IAAJ,oBACI,MAAM,YAAVmB,EAAAA,QAAAlE,EAAAA,KAAAmE,EAAAA,eAAAC,EAAAA,KAAA,EAEU,gBAAiBlP,IACrBA,EAAMgP,YAAc,gBAAiBpQ,EAAUoQ,EAAc,mBAGzCjP,IAAlBC,EAAM8K,cAAqC/K,IAAZ+K,IACjC9K,EAAM8K,QAAUA,QAGC/K,IAAfC,EAAMiP,WAA+BlP,IAATkP,IAC9BjP,EAAMiP,KAAOA,GAGXjP,EAAMG,UACRH,EAAMG,SAAUH,EAAAA,EAAAA,IAASA,EAAMG,QAAS+O,IAG1C,IAAJ,yDACQ9O,GAAaA,EAAUE,QACzBF,EAAUE,OAAQF,EAAAA,EAAAA,IAASA,EAAUE,MAAO4O,IAG9C,IAAJ,YACQC,GAAWA,EAAQxO,MACrBwO,EAAQxO,KAAMwO,EAAAA,EAAAA,IAASA,EAAQxO,IAAKuO,IAQxC,2BAAFnB,GACI,IAAJ,kCACQqB,EAAkBlP,OAAS,IAC7BF,EAAMuJ,IAAMvJ,EAAMuJ,KAAO,GACzBvJ,EAAMuJ,IAAI/L,aAAe,IAAKwC,EAAMuJ,IAAI/L,cAAgB,MAAQ4R,IAUpE,cAAFC,GAAA,yGACI,OAAOlO,KAAKmO,cAActP,EAAOwK,EAAMxL,GAAOqL,MAClDkF,GACA,aAEAC,IACM,GAAN,yDAGQ,IAAR,IACA,mBACU1Q,EAAAA,GAAAA,IAAAA,EAAAA,SAEAA,EAAAA,GAAAA,KAAAA,OAqBR,cAAFwQ,EAAAA,EAAAA,GACI,MAAM,WAAVG,EAAAA,WAAAC,GAAA,kBAEI,IAAKvO,KAAK0J,aACR,OAAO,QAAoB,IAAI7H,EAAY,2CAA4C,QAGzF,IAAJ,yBAII,OAAK2M,GAAuC,kBAAfD,GAA2BE,KAAKC,SAAWH,GACtEvO,KAAK6I,mBAAmB,cAAe,UAChC,QACb,iGACA0F,EADA,KAEA,SAKWvO,KAAKsM,cAAczN,EAAOwK,EAAMxL,GAC3CqL,MAAAyD,IACM,GAAN,SAEQ,MADA,KAAR,sDACA,sEAIM,OADN,gCACA,MACA,EA4HA,SAA6BgC,GAC3B,IAAF,+DACE,IAAI,EAAA1H,EAAA,IAAW0H,GACb,OAAOA,EAAGzF,MACdrK,IACM,KAAN,qBACQ,MAAR,SAEM,OAAN,KAEA+P,IACM,MAAN,gDAGA,0BACI,MAAM,IAAI/M,EAAYgN,GAExB,OAAOF,EAzIT,CADA,WAGAzF,MAAA4F,IACM,GAAN,SAEQ,MADA,KAAR,kDACA,kEAGM,IAAN,qBACA,MACQ,KAAR,6BAMM,IAAN,qBACM,GAAN,qCACQ,IAAR,WACQ,EAARA,iBAAAA,GAAAA,GAAAA,GACAC,GADA,IAEU,SACA,QAAVC,IACA,UACA,CACY,SAEA,UAAZvC,EAAAA,UACY,aAAZwC,EAAAA,iBAOM,OADA,KAAN,eACA,KAEA/F,KAAA,MAAAmF,IACM,GAAN,eACQ,MAAR,EASM,MANA,KAAN,oBACQ,KAARhB,CACU,YAAV6B,GAEQ,kBAAR1F,IAEA,2IACA6E,OAQE,SAAFpF,GACIjJ,KAAKmM,gBAAkB,EAClBgD,EAAQjG,MACjB/J,IACM,KAAN,kBACA,KAEAkP,IACM,KAAN,kBACA,KAQE,cAAFhD,GACQrL,KAAK2I,YAAc3I,KAAK0I,KAC1B1I,KAAK2I,WAAWyG,KAAKxM,GAAUsG,KAAK,MAAMmF,KAChD,yGAGA,2FAOE,iBACE,IAAJ,iBAEI,OADArO,KAAKuL,UAAY,GACVtO,OAAOoS,KAAKC,GAAU3B,KAAI7H,IAC/B,MAAOuI,EAAQkB,GAAYzJ,EAAI9D,MAAM,KACrC,MAAO,CACLqM,OAAAA,EACAkB,SAAAA,EACAC,SAAUF,EAASxJ,Q,0lBCjtBzB,IAAF,UAEA,GACI5G,KAAMuQ,GAAMA,EAAG3S,KACfqC,MAAOuQ,GAAeD,IAWxB,OARIvP,EAAOnB,SACTE,EAAUkB,WAAa,CAA3BD,OAAAA,SAGyBtB,IAAnBK,EAAUC,MAA0C,KAApBD,EAAUE,QAC5CF,EAAUE,MAAQ,8BAGbF,E,iBA+CP,MAAO,CACLA,UAAW,CACT/B,OAAQ,CAACyS,GAAmBC,EAAaH,M,YAO/CG,EACAH,GAKE,IAAF,4BAEA,EAcA,SAAoBA,GAClB,GAAIA,EAAI,CACN,GAA8B,kBAAnBA,EAAGI,YACZ,OAAOJ,EAAGI,YAGZ,GAAIC,GAAoBC,KAAKN,EAAGzQ,SAC9B,OAAO,EAIX,OAAO,EAzBT,IAEE,IACE,OAAO4Q,EAAYzP,EAAY6P,GACnC,UAIE,MAAO,GAIT,qCAqBA,SAASN,GAAeD,GACtB,IAAF,eACE,OAAKzQ,EAGDA,EAAQiR,OAA0C,kBAA1BjR,EAAQiR,MAAMjR,QACjCA,EAAQiR,MAAMjR,QAEhBA,EALE,mB,YAqDX4Q,EACA3Q,EACAiR,EACAC,EACAC,GAEE,IAAIvR,EAEJ,IAAI,EAAAoI,EAAA,IAAahI,IAAD,QAGd,OAAOoR,GAAeT,EAD1B,EACkDK,OAUhD,IAAI,EAAAhJ,EAAA,IAAWhI,KAAD,YACZ,IAAJ,IAEI,GAAI,UAAW,EACbJ,EAAQwR,GAAeT,EAAa3Q,OAC1C,CACM,IAAN,kDACA,kDACMJ,EAAQyR,GAAgBV,EAAa5Q,EAASkR,EAAoBC,IAClEI,EAAAA,EAAAA,IAAsB1R,EAAOG,GAM/B,MAJI,SAAUwR,IACZ3R,EAAM4R,KAAO5R,GAAAA,GAAAA,GAAAA,EAAAA,MAAAA,GAAAA,CAAnB,yCAGWA,EAET,OAAI,EAAAoI,EAAA,IAAQhI,GAEHoR,GAAeT,EAAa3Q,IAEjC,EAAAgI,EAAA,IAAchI,KAAc,EAAAgI,EAAA,IAAQhI,IAKtCJ,E,SAjMJ+Q,EACA3Q,EACAiR,EACAE,GAEE,IACF,GADA,UACA,YACA,mCAEA,GACInR,UAAW,CACT/B,OAAQ,CACd,CACQ,MAARgC,EAAAA,EAAAA,IAAAA,GAAAA,EAAAA,YAAAA,KAAAA,EAAAA,qBAAAA,QACQ,MAARC,aAAAA,OACAiR,EAAAA,oBAAAA,YADA,iCAEAM,EAAAA,EAAAA,IAAAA,OAIIlD,MAAO,CACLmD,eAAgBA,EAAgB1R,EAAWsN,KAI/C,GAAI2D,EAAoB,CACtB,IAAJ,UACQhQ,EAAOnB,SAET,EAANF,UAAAA,OAAAA,GAAAA,WAAAA,CAAAqB,OAAAA,IAIE,OAAOrB,EAgKG+R,CAAqBhB,EADjC,EAC+DM,EAAoBE,IAC/ES,EAAAA,EAAAA,IAAsBhS,EAAO,CAC3BiS,WAAW,IAENjS,IAYTA,EAAQyR,GAAgBV,EAAa3Q,EAAvCJ,EAAAA,IACE0R,EAAAA,EAAAA,IAAsB1R,EAAO,GAAR0R,OAAAA,QAAAA,IACrBM,EAAAA,EAAAA,IAAsBhS,EAAO,CAC3BiS,WAAW,IAGNjS,G,YAOT+Q,EACA1M,EACAgN,EACAC,GAEE,IAAF,GACInR,QAASkE,GAGX,GAAIiN,GAAoBD,EAAoB,CAC1C,IAAJ,UACQhQ,EAAOnB,SACTF,EAAMI,UAAY,CAChB/B,OAAQ,CAAC,CAAjBiC,MAAAA,EAAAgB,WAAAA,CAAAD,OAAAA,OAKE,OAAOrB,E,kFCzPP,MAAF,SAAS,EAAT,iC,eCrBE,IAAKW,EACH,MAAO,GAGT,IAAF,0EAEE,IAAKoC,EACH,MAAO,GAIT,IAAF,WACA,WACE,MAAO,CACLT,KAAMS,EAAM,GACZR,KAAMQ,EAAM,GACZJ,SAAUI,EAAM,GAChBmP,SAAUnP,EAAM,GAAKoP,EAAQC,G,umBCG/B,sBAAF,WAKE,SAAF,gBAWE,YAAFnQ,GAAAoQ,GAAAA,UAAAA,OAAAA,KAAAA,MACIlR,KAAKvC,QAAU,IACbG,SAAS,EACTuT,KAAK,EACLC,OAAO,EACPC,SAAS,EACTC,QAAQ,EACRC,KAAK,GACX9T,GAYE,YACMuC,KAAKvC,QAAQG,UACf4T,EAAAA,EAAAA,GAA0B,UAAWC,IAEnCzR,KAAKvC,QAAQ0T,MACfK,EAAAA,EAAAA,GAA0B,MAmBhC,SAAwBL,GACtB,SAAF,KAEI,IAAIO,EACAC,EAA0B,kBAARR,EAAmBA,EAAIS,wBAAqBhT,EAE1C,kBAAb+S,IACTA,EAAW,CAACA,IAId,IACED,EAASG,EAAYhT,MAAM6S,QACjCI,EAAAA,GAAAA,IAAAA,EAAAA,MAAAA,OAAAA,IACAA,EAAAA,GAAAA,IAAAA,EAAAA,MAAAA,GACA,SACMJ,EAAS,YAGW,IAAlBA,EAAO3S,SAIXgT,EAAAA,EAAAA,MAAgBC,cACpB,CACM,SAANzC,MAAAA,OAAAA,EAAAA,MACM,QAANvQ,GAEA,CACM,MAANH,EAAAA,MACM,KAAN/B,EAAAA,KACM,OAANmV,EAAAA,SAKE,OAAOC,EAvD8BC,CAAenS,KAAKvC,QAAQ0T,MAE3DnR,KAAKvC,QAAQ8T,MACfC,EAAAA,EAAAA,GAA0B,MAAOY,IAE/BpS,KAAKvC,QAAQ2T,QACfI,EAAAA,EAAAA,GAA0B,QAASa,IAEjCrS,KAAKvC,QAAQ4T,UACfG,EAAAA,EAAAA,GAA0B,UAAWc,KAqD3C,SAASb,GAAmBI,GAC1B,IAAF,GACItC,SAAU,UACVlC,KAAM,CACJkF,UAAWV,EAAYnR,KACvB/C,OAAQ,WAEVyL,MAAOA,GAAwByI,EAAYzI,OAC3CpK,SAASA,EAAAA,EAAAA,IAAS6S,EAAYnR,KAAM,MAGtC,GAA0B,WAAtBmR,EAAYzI,MAAoB,CAClC,IAA4B,IAAxByI,EAAYnR,KAAK,GAKnB,OAJA8R,EAAWxT,QAAU,qBAA3BwT,QAAAA,EAAAA,EAAAA,IAAAA,EAAAA,KAAAA,MAAAA,GAAAA,MAAAA,kBACMA,EAAWnF,KAAKkF,UAAYV,EAAYnR,KAAKqB,MAAM,IAOvDgQ,EAAAA,EAAAA,MAAgBC,cAAcQ,EAAY,CACxCtP,MAAO2O,EAAYnR,KACnB0I,MAAOyI,EAAYzI,QAQvB,SAASgJ,GAAeP,GACtB,GAAIA,EAAYY,aAAhB,CAEE,GAAIZ,EAAYN,IAAImB,uBAClB,OAGF,MAAM,OAAV3K,EAAAA,IAAAvI,EAAAA,YAAAmT,EAAAA,KAAAC,GAAA,0BAEIb,EAAAA,EAAAA,MAAgBC,cACpB,CACM,SAANzC,MACM,KAANlC,CACQ,SACA,MACA,eAEF,KAANnO,QAEA,CACM,IAANqS,EAAAA,IACM,MAANrO,UAYA,SAASmP,GAAiBR,GAEnBA,EAAYY,eAIbZ,EAAYgB,UAAUrT,IAAIoC,MAAM,eAAkD,SAAjCiQ,EAAYgB,UAAU9K,SAKvE8J,EAAY5B,OACd8B,EAAAA,EAAAA,MAAgBC,cACpB,CACM,SAANzC,QACM,KAANlC,EAAAA,UACM,MAANjE,QACM,KAANlK,QAEA,CACM,KAANmO,EAAAA,MACM,MAANnK,EAAAA,QAII6O,EAAAA,EAAAA,MAAgBC,cACpB,CACM,SAANzC,QACM,KAANlC,GAAAA,GAAAA,GACAwE,EAAAA,WADA,IAEQ,YAARc,EAAAA,SAAAA,SAEM,KAANzT,QAEA,CACM,MAANgE,EAAAA,KACM,SAAN4P,EAAAA,aAUA,SAASR,GAAmBT,GAC1B,IAAF,YACE,IAAIkB,EAAOlB,EAAYkB,KACnBC,EAAKnB,EAAYmB,GACrB,IAAF,sBACE,IAAIC,EAAaC,GAASH,GAC1B,IAAF,QAGOE,EAAW7R,OACd6R,EAAaE,GAKXA,EAAU3R,WAAa4R,EAAS5R,UAAY2R,EAAUhS,OAASiS,EAASjS,OAC1E6R,EAAKI,EAASrC,UAEZoC,EAAU3R,WAAayR,EAAWzR,UAAY2R,EAAUhS,OAAS8R,EAAW9R,OAC9E4R,EAAOE,EAAWlC,WAGpBgB,EAAAA,EAAAA,MAAgBC,cAAc,CAC5BzC,SAAU,aACVlC,KAAM,CACJ0F,KAAAA,EACAC,GAAAA,KA1LN9B,GAAAA,eCpFA,iBACA,IAAImC,G,cA2CF,GAAIA,GACF,OAAOA,GAMT,IAAI,QAAcpB,GAAOb,OACvB,OAAO,GAAX,kBAGE,IAAF,cACE,IAAIkC,EAAYrB,GAAOb,MACvB,GAAF,uCAEI,IACE,IAAN,4BACMmC,EAAQC,QAAS,EACjBC,EAASC,KAAKC,YAAYJ,GAC1B,IAAN,kBACUK,GAAiBA,EAAcxC,QACjCkC,EAAYM,EAAcxC,OAE5BqC,EAASC,KAAKG,YAAYN,GAChC,UACA,0DACA5V,EAAAA,GAAAA,KAAAA,kFAAAA,GAIE,OAAO,GAAT,WC3DA,iB,oBA0CE,YAAFmD,GACIrD,EAAQ0N,UAAY1N,EAAQ0N,WAAa,GACzC1N,EAAQ0N,UAAU/C,IAAM3K,EAAQ0N,UAAU/C,KAAO,CAC/CtL,KAAM,4BACNgX,SAAU,CAChB,CACQ,KAARhX,sBACQ,QAAR8K,IAGMA,QAASA,GAGX7G,MAAMtD,GAEFA,EAAQ6N,mBAAqByI,GAAaN,UAC5CM,GAAaN,SAASO,iBAAiB,oBAAoB,KACX,WAA1CD,GAAaN,SAASQ,iBACxBjU,KAAKkU,oBASb,mBAAFC,EAAAA,GACI,O,SL8DJvE,EACA3Q,EACAoK,EACA8G,GAEE,IACF,SADA,gCACA,GAME,OALAU,EAAAA,EAAAA,IAAsBhS,GACtBA,EAAMuK,MAAQ,QACVC,GAAQA,EAAKnB,WACfrJ,EAAMqJ,SAAWmB,EAAKnB,WAEjB,QAAoBrJ,GK1ElBsV,CAAmBnU,KAAKyI,SAASmH,YAAa3Q,EAAWoK,EAAMrJ,KAAKyI,SAAS0H,kBAMtF,iBACFnR,GAIA,IAHAoK,EAGA,uDAHA,OAEAC,EACA,uCACI,O,SLsEJuG,EACA5Q,GAKA,IAJAoK,EAIA,uDAJA,OAEAC,EAEA,uCADA8G,EACA,uCACE,IAAF,kCACA,cAKE,OAJAtR,EAAMuK,MAAQA,EACVC,GAAQA,EAAKnB,WACfrJ,EAAMqJ,SAAWmB,EAAKnB,WAEjB,QAAoBrJ,GKnFlBuV,CAAiBpU,KAAKyI,SAASmH,YAAa5Q,EAASoK,EAAOC,EAAMrJ,KAAKyI,SAAS0H,kBAMzF,UAAFnF,EAAAA,GAOI,IAAJ,8BAEAqJ,GAII,EAAJA,SACAA,EAAAA,QAAAA,SAEMtC,EAAAA,EAAAA,MAAgBC,cACtB,CACQ,SAARzC,UAAAA,OAAAA,gBAAAA,EAAAA,KAAAA,cAAAA,SACQ,SAARrH,EAAAA,SACQ,MAARkB,EAAAA,MACQ,SAARpK,EAAAA,EAAAA,IAAAA,IAEA,CACQ,UAKJ+B,MAAMiK,UAAUnM,EAAOwK,GAMzB,cAAFiD,EAAAA,EAAAA,GAEI,OADAzN,EAAMyV,SAAWzV,EAAMyV,UAAY,aAC5BvT,MAAMuL,cAAczN,EAAOwK,EAAMxL,GAM1C,iBACE,IAAJ,wBAEI,GAAwB,IAApByR,EAASvQ,OAKb,GAAKiB,KAAK0I,KAAV,EAKJ,0FAEI,ICxJJ6L,EACAnS,EACAqK,EDsJA,6BACA,GCzJA8H,EDyJA,EC9ISC,GAVTpS,EDwJA,oCC9IuB,CAAvBA,IAAAA,GAAA,IAPA,CACA,CAAI,KAAJlD,iBACA,CACI,UAAJuN,IAAAA,EAAAA,EAAAA,MACI,wBDmJA,K,cD/EJ,yEACA,4CAIA,0CACIgI,CAAWjV,EAAKoT,IACpB,WACA,IACIxB,CAAM5R,EAAK,CACToT,KAAAA,EACA7K,OAAQ,OACR2M,YAAa,OACbC,WAAW,IACjBzL,KAAA,MAAA+G,KACA,2ECiEM2E,CAAWpV,EAAKoV,EAAkBhS,IACxC,UACA,8EAZA,mHALA,2FEpJA,WAQA,SAASiS,GAAYvU,EAArBwU,EAAA,KACE,IAAF,GACIxU,SAAAA,EACAyU,SAAUD,EAEVE,QAAQ,GAWV,YARepW,IAAXqW,IACF5U,EAAM4U,OAASA,QAGHrW,IAAVsW,IACF7U,EAAM6U,MAAQA,GAGT7U,EAIT,OACA,sLACA,mCAkCA,GACA,sOACA,mDA+BA,GACA,gH,KA9FA,GA4BA,IACE,IAAF,aAEE,GAAIgD,EAAO,CAGT,GAFJ,+BAEgB,CACV,IAAN,gBAEU8R,IAEF9R,EAAM,GAAK8R,EAAS,GACpB9R,EAAM,GAAK8R,EAAS,GACpB9R,EAAM,GAAK8R,EAAS,IAMxB,MAAOL,EAAMxU,GAAY8U,GAA8B/R,EAAM,IAAMgS,GAAkBhS,EAAM,IAE3F,OAAOwR,GAAYvU,EAAUwU,EAAMzR,EAAM,IAAMA,EAAM,QAAKzE,EAAWyE,EAAM,IAAMA,EAAM,QAAKzE,M,CA/ChG,GA8DA,IACE,IAAF,aAEE,GAAIyE,EAAO,CAET,GADJ,iCACgB,CACV,IAAN,gBAEU8R,IAEF9R,EAAM,GAAKA,EAAM,IAAM,OACvBA,EAAM,GAAK8R,EAAS,GACpB9R,EAAM,GAAK8R,EAAS,GACpB9R,EAAM,GAAK,IAIf,IAAI/C,EAAW+C,EAAM,GACjByR,EAAOzR,EAAM,IAAMgS,GAGvB,OAFCP,EAAMxU,GAAY8U,GAA8BN,EAAMxU,GAEhDuU,GAAYvU,EAAUwU,EAAMzR,EAAM,IAAMA,EAAM,QAAKzE,EAAWyE,EAAM,IAAMA,EAAM,QAAKzE,M,CApFhG,GA+FA,IACE,IAAF,aAEE,OAAOyE,EACTwR,GAAAA,EAAAA,GAAAA,EAAAA,IAAAA,IAAAA,EAAAA,GAAAA,EAAAA,IAAAA,EAAAA,QAAAA,QACAjW,K,mBAgDA,WACE,IAAF,qCACA,yCAEE,OAAO0W,GAAqBC,EAC9B,EACAT,IAAAA,EAAAA,QAAAA,KAAAA,EAAAA,MAAAA,KAAAA,GAAAA,GACAQ,EAAAA,oBAAAA,OAAAA,GAAAA,wBAAAA,OAAAA,IAEA,O,iBCpIE,OAAO,UAAgBvM,iBAAiB9J,EAAW,CAArD6N,eAAAA,I,gBA0HEiF,EAAAA,EAAAA,MAAgByD,UAAU1S,G,ykBClJ5B,IAAI2S,GAAJ,E,cAME,OAAOA,GAAgB,E,cAQvBA,IAAiB,EACjBC,YAAW,KACTD,IAAiB,K,YAcrBE,GAKE,IAJFlY,EAIA,uDAFA,GACAmY,EACA,uCASE,GAAkB,oBAAPD,EACT,OAAOA,EAGT,IAGE,IAAJ,uBACI,GAAIE,EACF,OAAOA,EAIT,IAAI,QAAoBF,GACtB,OAAOA,EAEb,SAII,OAAOA,EAKT,IAAF,aACI,IAAJ,wCAEI,IACMC,GAA4B,oBAAXA,GACnBA,EAAOjV,MAAMX,KAAMuS,WAGrB,IAAN,sBAOM,OAAOoD,EAAGhV,MAAMX,KAAM8V,GAC5B,SAqBM,MApBAC,KAEAP,IAAU,IACR3X,EAAMmY,mBAAkB,IAClBvY,EAAQmO,aACV2E,EAAAA,EAAAA,IAAsB1R,OAAOD,OAAWA,IACxCiS,EAAAA,EAAAA,IAAsBhS,EAAOpB,EAAQmO,YAGvC/M,EAAM2O,MAAQ3O,GAAAA,GAAAA,GACxBA,EAAAA,OADA,IAEY0T,UAAW7R,IAGN7B,KAGTkK,GAAiB0G,MAGbA,IAOV,IACE,IAAK,IAAT,OACUxS,OAAO+D,UAAU0F,eAAeC,KAAKgP,EAAIM,KAC3CC,EAAcD,GAAYN,EAAGM,IAGrC,WAIEE,EAAAA,EAAAA,IAAoBD,EAAeP,IAEnCS,EAAAA,EAAAA,IAAyBT,EAAI,qBAAsBO,GAGnD,IACE,IAAJ,4CACQG,EAAWC,cACbrZ,OAAOsZ,eAAeL,EAAe,OAAQ,CAC3CM,IAAG,IACMb,EAAG7Y,OAIpB,UAGE,OAAOoZ,E,+NCjJT,QACA,cACA,SACA,OACA,mBACA,iBACA,oBACA,kBACA,cACA,aACA,qBACA,cACA,aACA,iBACA,eACA,kBACA,cACA,cACA,eACA,qBACA,SACA,YACA,eACA,gBACA,YACA,kBACA,SACA,iBACA,4BACA,wB,SAmBE,sBAAF,mBAKE,SAAF,gBAQE,YAAFpV,GAAA2V,GAAAA,UAAAA,OAAAA,KAAAA,MACIzW,KAAKyI,S,uWAAW,EACdiO,gBAAgB,EAChBC,aAAa,EACbC,uBAAuB,EACvBC,aAAa,EACbnB,YAAY,GAClBjY,GAQE,YACE,IAAJ,YAEQuC,KAAKyI,SAASiN,aAChBoB,EAAAA,EAAAA,IAAK7E,EAAQ,aAAc8E,IAGzB/W,KAAKyI,SAASoO,cAChBC,EAAAA,EAAAA,IAAK7E,EAAQ,cAAe8E,IAG1B/W,KAAKyI,SAASmO,wBAChBE,EAAAA,EAAAA,IAAK7E,EAAQ,wBAAyB+E,IAGpChX,KAAKyI,SAASiO,gBAAkB,mBAAoBzE,IACtD6E,EAAAA,EAAAA,IAAKJ,eAAe1V,UAAW,OAAQiW,IAGzC,IAAJ,4BACQC,IACR,uBACkB3a,QAAQ4a,KAM1B,SAASJ,GAAkBK,GACzB,OAAF,iEAAA1W,EAAAA,GAAAA,UAAAA,GAEI,IAAJ,OAQI,OAPAA,EAAK,GAAKA,GAAK2W,EAAkB,CAC/BzL,UAAW,CACTyB,KAAM,CAAd0H,UAAAA,EAAAA,EAAAA,IAAAA,IACQlJ,SAAS,EACT3M,KAAM,gBAGHkY,EAASzW,MAAMX,KAAMU,IAMhC,SAASsW,GAASI,GAChB,OAAF,YAEI,OAAJ,cAEAE,GAAAA,EAAAA,CACM,UAAN1L,CACQ,KAARyB,CACU,SAAV0H,wBACU,SAAVwC,EAAAA,EAAAA,IAAAA,IAEQ,SAAR1L,EACQ,KAAR3M,mBAQA,SAAS+X,GAASO,GAChB,OAAF,WAEI,IAAJ,OAEA,yDAEIC,EAAoBlb,SAAQmb,IACtBA,KAAQnG,GAA4B,oBAAdA,EAAImG,KAC5BZ,EAAAA,EAAAA,IAAAA,EAAAA,GAAAA,SAAAA,GAEE,IAAV,GACYlL,UAAW,CACTyB,KAAM,CACJ0H,SAAU2C,EACVH,SAASA,EAAAA,EAAAA,IAAgBH,IAE3BvL,SAAS,EACT3M,KAAM,eAKpB,cAMU,OALIyY,IACFC,EAAYhM,UAAUyB,KAAKkK,SAAUK,EAAAA,EAAAA,IAAgBD,IAIhDL,GAAKF,EAAUQ,SA5BhC,sDAAAlX,EAAAA,GAAAA,UAAAA,GAiCI,OAAO8W,EAAa7W,MAAMX,KAAMU,IAKpC,SAASyW,GAAiBzF,GACxB,IAAF,YAEA,uBAGA,6DAKEoF,EAAAA,EAAAA,IAAKe,EAAO,oBAAoB,SAAUT,GAKxC,OAAO,SAGXU,EACAnC,EACAlY,GAEM,IACgC,oBAAnBkY,EAAGoC,cAMZ,EAAVpC,YAAAA,GAAAA,EAAAA,YAAAA,CAEY/J,UAAW,CACTyB,KAAM,CACJ0H,SAAU,cACVwC,SAASA,EAAAA,EAAAA,IAAgB5B,GACzBjE,OAAAA,GAEF7F,SAAS,EACT3M,KAAM,iBAIpB,UAIM,OAAOkY,EAASzW,MAAMX,KAAM,CAClC8X,EACAR,GAAAA,EAAAA,CAEQ,UAAR1L,CACU,KAAVyB,CACY,SAAZ0H,mBACY,SAAZwC,EAAAA,EAAAA,IAAAA,GACY,UAEF,SAAV1L,EACU,KAAV3M,gBAGAzB,SAKEqZ,EAAAA,EAAAA,IACFe,EACA,uBACA,SACAG,GAGI,OAAJ,SAGAF,EACAnC,EACAlY,GAmBM,IAAN,IACM,IACE,IAAR,0BACA,GACU,EAAVua,KAAAA,KAAAA,EAAAA,EAAAA,GAEA,UAGM,OAAN,wB,+NAzLAvB,GAAAA,e,SC/EE,sBAAF,yBAKE,SAAF,gBASE,UAAF,mBACAwB,QAAAA,GACAC,qBAAAA,IAIE,YAAFpX,GAAAqX,GAAAA,UAAAA,OAAAA,KAAAA,MAAAA,GAAAA,UAAAA,QAAAA,KAAAA,MACInY,KAAKyI,S,uWAAW,EACdwP,SAAS,EACTC,sBAAsB,GAC5Bza,GAME,YACE2a,MAAMC,gBAAkB,GACxB,IAmLsBnZ,EAnL1B,gBAII,IAAJ,YAEM,IAAN,uBACUoZ,GAAe7a,EAAQqI,KA4KP5G,EA3KD4G,GA4KzB,0GA3KQwS,IACAtY,KAAKuY,aAAazS,QAA1B,KAOA,SAAS0S,MACPhH,EAAAA,EAAAA,GACF,SACAnE,IAEI,MAAJ,YACI,IAAJ,qBACM,OAEF,MAAJ,IAAM,EAANoL,IAAM,EAANjZ,KAAM,EAANkZ,OAAM,EAANC,MAAM,GAAN,EACI,KAAJ,mCAAI,CAIA,IAAJ,OACA1I,IAAAA,IAAAA,EAAAA,EAAAA,IAAAA,GAuFA,SAAqCwI,EAArC,OACE,IAAF,EACA,2GAGE,IAAIzZ,GAAU,EAAAiI,EAAA,IAAawR,GAAOA,EAAIzZ,QAAUyZ,EAC5C3b,EAAO,QAEX,IAAF,aACM8b,IACF9b,EAAO8b,EAAO,GACd5Z,EAAU4Z,EAAO,IAcnB,OAAOC,GAXT,CACI5Z,UAAW,CACT/B,OAAQ,CACd,CACQ,KAARgC,EACQ,MAARC,MAM8CK,EAAKkZ,EAAMC,GA/GzDG,CAAAA,EAAAA,EAAAA,EAAAA,GACAD,GACAE,GAAAA,EAAAA,GAAAA,OAAAA,EAAAA,GAAAA,GACAvZ,EACAkZ,EACAC,GAGI,EAAJ9Z,MAAAA,QAEI,GAAJma,EAAAA,EAAAA,EAAAA,eAMA,SAASC,MACPzH,EAAAA,EAAAA,GACF,sBACA5C,IAEI,MAAJ,YACI,IAAJ,qBACM,OAEF,IAAJ,IAGI,IAGJ,aACQ,EAARqB,EAAAA,OAOA,oCACQ,EAARA,EAAAA,OAAAA,QAEA,UAII,GAAJ,kCACM,OAAN,EAGI,IAAJ,cAmBS,CACLhR,UAAW,CACT/B,OAAQ,CACd,CACQ,KAARgC,qBAEQ,MAARC,oDAAAA,OAAAA,OAxBA+Z,QACAH,GAAAA,EAAAA,OAAAA,EAAAA,GAAAA,GAEI,EAAJla,MAAAA,QAEI,GAAJma,EAAAA,EAAAA,EAAAA,2BA4DA,SAASH,GAA8Bha,EAAvC,OAEE,IAAF,8BAEA,wBAEA,gBAEA,gCAEA,wBAEA,iCACA,iCACA,wCAaE,OAVqB,IAAjBsa,EAAMpa,QACRoa,EAAM5b,KAAK,CACT2X,MAAAA,EACA5U,SAAAA,EACAyU,SAAU,IACVC,QAAQ,EACRC,OAAAA,IAIGpW,EAOT,SAASma,GAAuBhb,EAAhC,QACE6S,EAAAA,EAAAA,IAAsBhS,EAAO,CAC3BgN,SAAS,EACT3M,KAAAA,IAEFlB,EAAIuL,aAAa1K,EAAO,CACtB2K,kBAAmByG,IAIvB,SAASmJ,KACP,IAAF,aACA,gBACA,sBACIxJ,YAAa,IAAM,GACnBO,kBAAkB,GAEpB,MAAO,CAACnS,EAAKP,EAAQmS,YAAanS,EAAQ0S,kBA1L5CgI,GAAAA,e,SCrDE,sBAAF,uBAKE,SAAF,gBAeE,cAAF,gEAAAkB,GAAAA,UAAAA,OAAAA,KAAAA,MACIrZ,KAAKsZ,KAAO7b,EAAQqI,KAlCxB,QAmCI9F,KAAKuZ,OAAS9b,EAAQ+b,OAlC1B,EAwCE,YACE,IAAJ,yBACStb,IAGL+B,EAAAA,EAAAA,IAAwB,CAACpB,EAAFoB,KACrB,IAAN,gCACM,OAAO5B,E,SASbob,EACA3T,EACA0T,EACA3a,EACAwK,GAEE,IAAKxK,EAAMI,YAAcJ,EAAMI,UAAU/B,SAAWmM,KAAS,EAAApC,EAAA,IAAaoC,EAAKG,kBAAmB4O,OAChG,OAAOvZ,EAET,IAAF,gCAEE,OADAA,EAAMI,UAAU/B,OAAS,IAAIwc,KAAiB7a,EAAMI,UAAU/B,QACvD2B,EApBW8a,CAASzb,EAAOmM,aAAauF,YAAavR,EAAKib,KAAMjb,EAAKkb,OAAQ1a,EAAOwK,GAAQxK,M,YA2BrG4a,EACAD,EACAvJ,EACAnK,GAEA,IADA8T,EACA,uDADA,GAEE,KAAK,EAAA3S,EAAA,IAAagJ,EAAMnK,GAAMsS,QAAUwB,EAAM7a,OAAS,GAAKya,EAC1D,OAAOI,EAET,IAAF,aACE,OAAOC,GAAeJ,EAAQD,EAAOvJ,EAAMnK,GAAMA,EAAK,CAAC7G,KAAc2a,IAlCvEP,GAAAA,e,sDClDE,sBAAF,iBAKE,SAAF,gBAUE,UAAFjb,EAAAA,GACI,IAAJ,MACM,IAAN,yBACM,GAAIC,EAAM,CAER,IACE,GAmBV,SAA0Byb,EAAD,GACvB,IAAKC,EACH,OAAO,EAGT,GAYF,SAA6BD,EAA7B,GACE,IAAF,YACA,YAGE,IAAKE,IAAmBC,EACtB,OAAO,EAIT,GAAI,IAAN,SACI,OAAO,EAGT,GAAID,IAAmBC,EACrB,OAAO,EAGT,IAAKC,GAAmBJ,EAAcC,GACpC,OAAO,EAGT,IAAKI,GAAkBL,EAAcC,GACnC,OAAO,EAGT,OAAO,EAtCHK,CAAoBN,EAAcC,GACpC,OAAO,EAGT,GAsCF,SAA+BD,EAA/B,GACE,IAAF,QACA,QAEE,IAAKO,IAAsBC,EACzB,OAAO,EAGT,GAAID,EAAkBnb,OAASob,EAAiBpb,MAAQmb,EAAkBlb,QAAUmb,EAAiBnb,MACnG,OAAO,EAGT,IAAK+a,GAAmBJ,EAAcC,GACpC,OAAO,EAGT,IAAKI,GAAkBL,EAAcC,GACnC,OAAO,EAGT,OAAO,EA1DHQ,CAAsBT,EAAcC,GACtC,OAAO,EAGT,OAAO,EAhCK,CAAiBD,EAAczb,EAAKmc,gBAEtC,OADZ,4IACmB,KAEnB,SACU,OAAO,EAAjB,iBAGQ,OAAO,EAAf,iBAEM,OAAOV,GAGTW,EAAe1a,GAAKC,KAAKlD,KACzBmD,EAAwBwa,IA4E5B,SAASN,GAAkBL,EAA3B,GACE,IAAIY,EAAgBC,GAAoBb,GACpCc,EAAiBD,GAAoBZ,GAGzC,IAAKW,IAAkBE,EACrB,OAAO,EAIT,GAAI,IAAN,SACI,OAAO,EAOT,GAJAF,EAAgBA,EAChBE,EAAiBA,EAGbA,EAAe7b,SAAW2b,EAAc3b,OAC1C,OAAO,EAIT,IAAK,IAAIqB,EAAI,EAAGA,EAAIwa,EAAe7b,OAAQqB,IAAK,CAC9C,IAAJ,OACA,OAEI,GACJya,EAAAA,WAAAA,EAAAA,UACAA,EAAAA,SAAAA,EAAAA,QACAA,EAAAA,QAAAA,EAAAA,OACAA,EAAAA,WAAAA,EAAAA,SAEM,OAAO,EAIX,OAAO,EAIT,SAASX,GAAmBJ,EAA5B,GACE,IAAIgB,EAAqBhB,EAAaiB,YAClCC,EAAsBjB,EAAcgB,YAGxC,IAAKD,IAAuBE,EAC1B,OAAO,EAIT,GAAI,IAAN,SACI,OAAO,EAGTF,EAAqBA,EACrBE,EAAsBA,EAGtB,IACE,QAAUF,EAAmB7Y,KAAK,MAAQ+Y,EAAoB/Y,KAAK,KACvE,SACI,OAAO,GAKX,SAASgZ,GAAuBpc,GAC9B,OAAOA,EAAMI,WAAaJ,EAAMI,UAAU/B,QAAU2B,EAAMI,UAAU/B,OAAO,GAI7E,SAASyd,GAAoB9b,GAC3B,IAAF,cAEE,GAAII,EACF,IAEE,OAAOA,EAAU/B,OAAO,GAAGiD,WAAWD,OAC5C,SACM,Q,ykBA1JNgb,GAAAA,eCzCA,iB,sDAOE,sBAAF,sBAKE,SAAF,gBAKE,aACEjb,EAAAA,EAAAA,IAAwB,IACtB,IAAI,UAAgB8K,eAAeoQ,IAAc,CAE/C,IAAK,GAAOC,YAAc,GAAOC,WAAa,GAAO5H,SACnD,OAAO5U,EAIT,IAAR,0DACQ,MAAM,SAAdyc,GAAA,iBACc,UAAdC,GAAA,iBAEQ,IAAR,cACA1c,EAAAA,SAAAA,EAAAA,QAAAA,SACAyc,GAAAA,CAAU,QAAVE,IACAD,GAAAA,CAAU,aAAV,IAEA,eAAA/b,IAAAA,IAAA,IAAAkD,QAAAA,IAEQ,OAAO,gBAAfsL,QAAAA,IAEM,OAAOnP,M,eC3BX,IAAF,KAYE,SAAS4c,EAAOC,GACd,OAAOvX,EAAO7G,OAAO6G,EAAOwG,QAAQ+Q,GAAO,GAAG,GAyEhD,MAAO,CACLC,EAAGxX,EACHgB,IA9DF,SAAayW,GACX,UAxBiBhd,IAAV4a,GAAuBrV,EAAOpF,OAASya,GAyB5C,OAAO,QAAoB,IAAI3X,EAAY,yDAI7C,IAAJ,MAcI,OAb8B,IAA1BsC,EAAOwG,QAAQ+Q,IACjBvX,EAAO5G,KAAKme,GAETA,EACTxS,MAAA,WAIAA,KAAA,UACAuS,EAAAA,GAAAA,KAAAA,MAAAA,WAIWC,GA2CPG,MA/BF,SAAe5R,GACb,OAAO,IAAI,MAAW,QACpB,IAAI6R,EAAU3X,EAAOpF,OAErB,IAAK+c,EACH,OAAO7P,GAAQ,GAIjB,IAAN,mBACYhC,GAAWA,EAAU,GACvBgC,GAAQ,KAElBhC,GAGM9F,EAAO5H,SAAQoH,KACR,QAAoBA,GAAMuF,MAAK,OAC5C,IAEY6S,aAAaC,GACb/P,GAAQ,MAEpBgQ,W,ykBDnDAd,GAAAA,e,uFEhCE,IAAF,4BACE,IAAK5Y,MAAM2Z,GACT,OAAqB,IAAdA,EAGT,IAAF,2BACE,OAAK3Z,MAAM4Z,G,IACFA,EAAaC,E,iBAUtB,OAAOC,EAAO9M,IAAa8M,EAAOC,KAAO,E,yFAOzC,OAAOC,GAAcF,EAAQ9M,GAAY6M,E,YAQ3CC,EAAAA,GAGA,IAFA,WAAAG,EAAAA,QAAA9Z,GAEA,EADA0Z,EACA,uDADAK,KAAAA,MAEE,IAAF,QACAJ,GAKA,+BACA,sBAEE,GAAIK,EAaF,IAAK,IAAT,0BACM,MAAOC,EAAYC,GAAcpD,EAAMxX,MAAM,IAAK,GAClD,IAAN,iBACA,sBACM,GAAK4a,EAGH,IAAK,IAAb,kBACUC,EAAkBtN,GAAY6M,EAAMU,OAHtCD,EAAkBP,IAAMF,EAAMU,OAOtC,EACID,EAAkBP,IAAMF,EAAMW,GAAsBC,EAAkBZ,GAC1E,UACIS,EAAkBP,IAAMF,EAAM,KAGhC,OAAOS,E,YC1DTpf,EACAwf,GAEA,IADA9Y,EACA,uDADA+Y,GAAAA,EAAAA,Y,IAEMC,EAAN,GAEE,IAAF,gBAEE,SAAS/N,EAAKxM,GACZ,IAAJ,KAaI,GAVAwa,EAAoBxa,GAAU,CAACe,EAAMzE,KACnC,IAAN,OACUme,GAAcF,EAAYG,GAC5B7f,EAAQoL,mBAAmB,oBAAqByU,GAEhDC,EAAsBhgB,KAAKoG,MAKM,IAAjC4Z,EAAsBxe,OACxB,OAAO,UAGT,IAAJ,YAIA,MACMqe,EAAoBI,GAAkB,CAACC,EAAGve,KACxCzB,EAAQoL,mBAAmBwF,EAAQ5Q,EAA+ByB,QAoBtE,OAAOiF,EAAOgB,KAhBlB,IACA8X,EAAAA,CAAM,KAANrK,EAAAA,EAAAA,EAAAA,eAAA,MACAE,SAEA,0DACA,iJAGM,EAANqK,GAAAA,EAAAA,MAEAlN,KACA,sGACM,EAANyN,sBAImCxU,MACnCC,GAAAA,IACA8G,IACM,GAAN,eAGQ,OAFR,sHACQ,EAARyN,mBACA,UAEQ,MAAR,KAME,MAAO,CACLtO,KAAAA,EACArF,MAAAA,G,qlBC1FJtM,GAEA,IADAkgB,EACA,uDADAC,KAEE,SAASX,EAAYjP,GACnB,IAAJ,MACM4E,KAAM5E,EAAQ4E,KACd7K,OAAQ,OACR8V,eAAgB,SAChBnb,QAASjF,EAAQiF,QAUjBiS,UAAW3G,EAAQ4E,KAAK7T,QAAU,OACxCtB,EAAAA,cAGI,OAAOkgB,EAAYlgB,EAAQ+B,IAAKse,GAAgB5U,MAAK4J,IAAY,CAC/D0J,WAAY1J,EAAShH,OACrBpJ,QAAS,CACP,uBAAwBoQ,EAASpQ,QAAQ8T,IAAI,wBAC7C,cAAe1D,EAASpQ,QAAQ8T,IAAI,oBAK1C,OAAOuH,GAAgBtgB,EAASwf,G,eCShC,OAAOc,GAAgBtgB,GA9BvB,SAAqBuQ,GACnB,OAAO,IAAI,MAAY,CAAC/B,EAASgQ,KAC/B,IAAN,qBAkBM,IAAK,IAAX,KAhBM1K,EAAI0G,QAAUgE,EAEd1K,EAAIyM,mBAAqB,KAZ/B,IAaYzM,EAAI0M,YACNhS,EAAQ,CACNuQ,WAAYjL,EAAIzF,OAChBpJ,QAAS,CACP,uBAAwB6O,EAAI2M,kBAAkB,wBAC9C,cAAe3M,EAAI2M,kBAAkB,mBAM7C3M,EAAI4M,KAAK,OAAQ1gB,EAAQ+B,KAE/B,UACYvC,OAAO+D,UAAU0F,eAAeC,KAAKlJ,EAAQiF,QAAS0b,IACxD7M,EAAI8M,iBAAiBD,EAAQ3gB,EAAQiF,QAAQ0b,IAIjD7M,EAAInC,KAAKpB,EAAQ4E,Y,ilBCtBvB,MACA,MACA,OACA,OACA,OACA,OACA,OACA,QAmNA,SAAS0L,GAAkBtgB,GACzBA,EAAIugB,aAAa,CAAnBC,gBAAAA,IACExgB,EAAIyL,iBAMN,SAASgV,KAIP,GAAwB,qBAH1B,SACA,SAEE,CAMA,IAAF,aAQOzgB,EAAIyL,iBAQT6U,GAAkBtgB,IAGlBwT,EAAAA,EAAAA,GAA0B,WAAW,IAAvC,SAAAuB,EAAAA,GAAAC,GAAA,OAEmBpU,IAATmU,GAAsBA,IAASC,GACnCsL,IAAkBA,EAAAA,EAAAA,gBA3BxB,0DACA3gB,EAAAA,GAAAA,KAAAA,sF,e9B1PAF,EAAAA,UAAAA,EAAAA,WAAAA,GACAA,EAAAA,UAAAA,IAAAA,EAAAA,UAAAA,KAAAA,CACAX,KAAAA,0BACAgX,SAAAA,CACA,CACAhX,KAAAA,oBACA8K,QAAAA,IAGAA,QAAaA,G,2E8BgFX,QAHoChJ,IAAhCnB,EAAQnB,sBACVmB,EAAQnB,oBAAsBA,SAERsC,IAApBnB,EAAQkM,QAAuB,CACjC,IAAJ,YAEQ+U,EAAOC,gBAAkBD,EAAOC,eAAe5e,KACjDtC,EAAQkM,QAAU+U,EAAOC,eAAe5e,SAGRnB,IAAhCnB,EAAQmhB,sBACVnhB,EAAQmhB,qBAAsB,QAEEhgB,IAA9BnB,EAAQ6N,oBACV7N,EAAQ6N,mBAAoB,GAG9B,IAAF,WACA7N,GADA,IAEImS,aAAaA,EAAAA,EAAAA,IAAkCnS,EAAQmS,aAAeA,IACtEvT,aAAcA,EAAuBoB,GACrCmL,UAAWnL,EAAQmL,aAAcA,EAAAA,EAAAA,MAAkBA,GAAqBA,MAG1EiW,EAAYA,GAAetgB,GAEvBd,EAAQmhB,qBACVH,K9BtGFK,CAAAA,K,oK+BDF,SAASC,IACP,IAAF,aACE,GAAIC,EAAmB,CACrB,IAAJ,oBACA,mIACIA,EAAkBC,UAAUnT,I,6lBCHhC,SAASoT,IACP,IAAF,kBACE,GAAIrhB,EAAO,CACT,IAAJ,cACI,GAAI+P,EACF,MAAO,CACL,eAAgBA,EAAKuR,iBAI3B,MAAO,GAeT,SAASC,EACTza,EACAlH,EACA4hB,GAGE,KAAK,QAAkB5hB,GAErB,OADAkH,EAAY2a,SAAU,EACf3a,EAIT,QAA4B/F,IAAxB+F,EAAY2a,QAOd,OANA3a,EAAY4a,YAAY,CACtBzX,oBAAqB,CACnBC,OAAQ,iBACRC,KAAMgE,OAAOrH,EAAY2a,YAGtB3a,EAKT,IAAI4J,EA4BJ,MA3BqC,oBAA1B9Q,EAAQ+hB,eACjBjR,EAAa9Q,EAAQ+hB,cAAcH,GACnC1a,EAAY4a,YAAY,CACtBzX,oBAAqB,CACnBC,OAAQ,iBAERC,KAAMgE,OAAOuC,YAGrB,qBACIA,EAAa8Q,EAAgBI,cAC7B9a,EAAY4a,YAAY,CACtBzX,oBAAqB,CAA3BC,OAAAA,mBAGIwG,EAAa9Q,EAAQiiB,iBACrB/a,EAAY4a,YAAY,CACtBzX,oBAAqB,CACnBC,OAAQ,cAERC,KAAMgE,OAAOuC,OAiDrB,SAA2BvG,GAEzB,IAAF,sDAQI,OANJ,0DACArK,EAAAA,GAAAA,KAAAA,0GAAAA,OACAkG,KAAAA,UACAmE,GAFA,oBAGAnE,KAAAA,iBAAAA,GAHA,OAKW,EAIT,GAAImE,EAAO,GAAKA,EAAO,EAGrB,OAFJ,0DACArK,EAAAA,GAAAA,KAAAA,oFAAAA,OAAAA,EAAAA,OACW,EAET,OAAO,EA7DFgiB,CAAkBpR,GAOlBA,GAeL5J,EAAY2a,QAAU7Q,KAAKC,SAAW,EAGjC/J,EAAY2a,UAUnB,wIACS3a,KAVT,0DACAhH,EAAAA,GAAAA,IAAAA,oGAAAA,OACAqO,OACAuC,GAFA,MAKW5J,MAxBX,0DACAhH,EAAAA,GAAAA,IAAAA,4CAAAA,OAEA,oCACA,oCACA,+EAGIgH,EAAY2a,SAAU,EACf3a,KAhBX,wIACIA,EAAY2a,SAAU,EACf3a,GA4EX,SAASib,EAETC,EACAC,GAEE,IAAF,mBACA,wBAEE,IAAInb,EAAc,IAAI,IAAYkb,EAAoB7f,MAStD,OARA2E,EAAcya,EAAOza,EAAalH,EAAS,EAA7CkH,CACI8a,cAAeI,EAAmBJ,cAClCI,mBAAAA,GACJC,IAEMnb,EAAY2a,SACd3a,EAAYob,iBAAiBtiB,EAAQuiB,cAAgB,EAAzDrb,aAAAA,UAESA,E,WAOT3G,EACA6hB,EACAI,EACAC,EACAC,EACAL,GAEE,IAAF,gBACA,wBAEE,IAAInb,EAAc,IAAI,KAAgBkb,EAAoB7hB,EAAKiiB,EAAaC,EAAcC,GAS1F,OARAxb,EAAcya,EAAOza,EAAalH,EAAS,EAA7CkH,CACI8a,cAAeI,EAAmBJ,cAClCI,mBAAAA,GACJC,IAEMnb,EAAY2a,SACd3a,EAAYob,iBAAiBtiB,EAAQuiB,cAAgB,EAAzDrb,aAAAA,UAESA,E,yBAOP,IAAF,aACOyb,EAAQC,aAGbD,EAAQC,WAAWC,WAAaF,EAAQC,WAAWC,YAAc,GAC5DF,EAAQC,WAAWC,WAAWC,mBACjCH,EAAQC,WAAWC,WAAWC,iBAAmBX,GAE9CQ,EAAQC,WAAWC,WAAWpB,eACjCkB,EAAQC,WAAWC,WAAWpB,aAAeA,IA4D/CsB,IAGI,WAxDN,WACE,IAAF,aACE,GAAKJ,EAAQC,WAAb,CAIA,IAAF,GACII,QAAO,IAIE,KAHb,uCAG6BC,OAEzBC,SAAQ,IAIC,KAHb,uCAG6BD,OAAM,CAAnCC,UAAAA,IAEIC,MAAK,IAII,KAHb,uCAG6BC,OAEzBC,GAAE,IAIO,KAHb,0CAG6BC,WAI7B,iBACAC,QAAAC,MAAAA,EAAAA,EAAAA,IAAAA,KACAtT,KAAAuT,IACI,IACE,OAAN,OACA,SACM,WAGNF,QAAAG,GAAAA,IAEMC,EAAeriB,OAAS,IAC1BqhB,EAAQC,WAAWhkB,aAAe,IAAK+jB,EAAQC,WAAWhkB,cAAgB,MAAQ+kB,KAYlFC,IDhSF7P,EAAAA,EAAAA,GAA0B,QAASuN,IACnCvN,EAAAA,EAAAA,GAA0B,qBAAsBuN,G,2MEMhD,YACFuC,EACAC,EACAC,EACAC,GAEI1gB,MAAM0gB,GAAN,KAAJ,gBAAI,KAAJ,eAAI,KAAJ,oBAME,IAAFtc,GAGQyI,EAAK8T,SAAW1hB,KAAKwhB,oBAEvB5T,EAAK+T,OAAS,IACZ/T,EAAK6E,aAAuC,kBAAjBA,EAA4BA,GAAe7E,EAAAA,EAAAA,MACtE5N,KAAKuhB,aAAa3T,EAAK8T,cAIC9iB,IAAtBgP,EAAK6E,cACPzS,KAAKshB,cAAc1T,EAAK8T,SAI5B3gB,MAAMoE,IAAIyI,I,oBAaZ,SAAF,mBAME,UAAF,yBAGE,UAAF,kBAEE,UAAF,+BAOE,YACFiS,EACA+B,GAYA,IAPAC,EAOA,uDAPAC,EAIAC,EAGA,uDAHAC,EAEAC,EACA,wDACIlhB,MAAM8e,EAAoB+B,GAA1B,KAAJ,WAAI,KAAJ,eAAI,KAAJ,gBAAI,KAAJ,WAAI,EAAJM,UAAAA,OAAAA,KAAAA,MAAI,EAAJA,UAAAA,QAAAA,KAAAA,MAAI,EAAJA,UAAAA,QAAAA,KAAAA,MAAI,EAAJA,UAAAA,QAAAA,KAAAA,MAEQD,IAEFE,EAAuBP,IAI7B,uIACMA,EAASQ,gBAAevkB,GAASA,EAAMwkB,QAAQriB,SAGjDA,KAAKsiB,oBACL5M,YAAW,KACJ1V,KAAKuiB,YACRviB,KAAKif,UAAU,qBACfjf,KAAK2hB,YAEb,oBAIE,SAAF,wEAII,GAHA3hB,KAAKuiB,WAAY,EACjBviB,KAAKwiB,WAAa,GAEdxiB,KAAKyiB,aAAc,CAIrB,IAAK,IAAX,MAHA,0DACA9kB,EAAAA,GAAAA,IAAAA,sCAAAA,IAAAA,KAAAA,IAAAA,GAAAA,cAAAA,KAAAA,IAEA,6BACQmF,EAAS9C,KAAMyS,GAGjBzS,KAAKyiB,aAAa/U,MAAQ1N,KAAKyiB,aAAa/U,MAAMsT,QAAO,IAEvD,GAAIpT,EAAK8T,SAAW1hB,KAAK0hB,OACvB,OAAO,EAIJ9T,EAAK6E,eACR7E,EAAK6E,aAAeA,EACpB7E,EAAKqR,UAAU,cACzB,0DACAthB,EAAAA,GAAAA,IAAAA,0DAAAA,KAAAA,UAAAA,OAAAA,EAAAA,KAGQ,IAAR,qBAQQ,OAPK+kB,IACb,0DACA/kB,EAAAA,GAAAA,IACA,6EACAkG,KAAAA,UAAAA,OAAAA,EAAAA,IAGe6e,MAGf,8GAEA,0GAQI,OAJI1iB,KAAKiiB,UACPE,EAAuBniB,KAAK4hB,UAGvB7gB,MAAM4gB,OAAOlP,GAUtB,6BAAFkQ,GACI3iB,KAAK4iB,uBAAuBrlB,KAAKuF,GAMnC,iBAAFid,GACI,IAAK/f,KAAKyiB,aAAc,CActBziB,KAAKyiB,aAAe,IAAII,GAb9B,IACY7iB,KAAKuiB,WAGTviB,KAAKshB,cAAcvhB,MAE3B,IACYC,KAAKuiB,WAGTviB,KAAKuhB,aAAaxhB,KAG2DC,KAAK0hB,OAAQD,IAGlG,yFACMzhB,KAAK8iB,iBAEP9iB,KAAKyiB,aAAatd,IAAInF,MAMxB,qBACMA,KAAK+iB,iBACPhH,aAAa/b,KAAK+iB,gBAClB/iB,KAAK+iB,oBAAiBnkB,GAO1B,kBAAF0jB,GACItiB,KAAKgjB,qBACLhjB,KAAK+iB,eAAiBrN,YAAW,KAC1B1V,KAAKuiB,WAAqD,IAAxCtlB,OAAOoS,KAAKrP,KAAKwiB,YAAYzjB,QAClDiB,KAAK2hB,OAAOlP,KAEpB,mBAOE,cAAF6O,GACIthB,KAAKgjB,sBACT,yGACIhjB,KAAKwiB,WAAWd,IAAU,GAC9B,yIAOE,aAAFH,GAQI,GAPIvhB,KAAKwiB,WAAWd,MACxB,8GACA,oBAEA,0IAGgD,IAAxCzkB,OAAOoS,KAAKrP,KAAKwiB,YAAYzjB,OAAc,CAG7C,IAAN,mCACMiB,KAAKsiB,kBAAkB7P,IAQ3B,QAEE,IAAIzS,KAAKuiB,UAAT,CAIA,IAAJ,wCAEQU,IAAoBjjB,KAAKkjB,qBAC3BljB,KAAKmjB,mBAAqB,EAE1BnjB,KAAKmjB,kBAAoB,EAG3BnjB,KAAKkjB,qBAAuBD,EAExBjjB,KAAKmjB,mBAAqB,IAClC,4IACMnjB,KAAKif,UAAU,qBACfjf,KAAK2hB,UAEL3hB,KAAK8iB,kBAOT,kBACF,4IACIpN,YAAW,KACT1V,KAAKojB,U,MAQX,SAASjB,EAAuBnkB,GAC9B,IAAF,eACMH,IACN,oBAEMA,EAAMwkB,aAAQzjB,M,qHC1SpB,6D,uoBCkFAyJ,GAaE,OA0BF,SAA+B5C,GAC7B,GAAmC,IAA/BxI,OAAOoS,KAAK5J,GAAQ1G,OAEtB,OAGF,OAAO9B,OAAOomB,QAAQ5d,GAAQ6d,QAAO,CAACC,EAAe,EAAvD,gBACI,IAAJ,qEACA,qCACI,OAAIC,EAAiBzkB,O,OACzB,0DACApB,EAAAA,GAAAA,KAAAA,mBAAAA,OACA8lB,EADA,sBACAC,EADA,6DAGaH,GAEAC,IAEb,IA5CSG,CAVT,0BACA,QAAI,IAAJ,OAII,OAHJ,IACM,EAANC,GAAAA,OAAAA,GAAAA,OAAAA,IAAAA,GAEA,IAEA,KAYA,SAASC,EAAsBN,GAC7B,OAAOA,EACTvhB,MAAA,KACA2L,KAAAmW,GAAAA,EAAAA,MAAAA,KAAAA,KAAAA,GAAAA,mBAAAA,EAAAA,YACAR,QAAA,QAAI,IAAJ,OAEI,OADA,EAAJM,GAAAA,EACA,IACA,I,4CC5GA,Y,2BCaA9gB,EACAihB,EACAC,KAEE,IAAIC,EACJ,OAAO,IACDF,EAAO5kB,OAAS,IACd+kB,GAAeF,KACjBD,EAAOI,MAAQJ,EAAO5kB,OAAS8kB,GAAa,IAMxCF,EAAOI,YAAuBvlB,IAAdqlB,KAClBA,EAAYF,EAAO5kB,MACnB2D,EAASihB,O,kECbV,MAAT,8E,UCOE,IACE,GAAIK,oBAAoBC,oBAAoBC,SAASplB,GAAO,CAG1D,GAAa,gBAATA,KAA4B,2BAA4Bb,MAC1D,OAGF,IAAN,sDAGM,OADAkmB,EAAGC,QAAQ,CAAjBtlB,KAAAA,EAAAulB,UAAAA,IACaF,GAEb,Y,UCnBE,IAAF,MACuB,aAAf1lB,EAAMK,MAAsC,YAAf,SAAe,2BAC9CwlB,EAAG7lB,GACC8lB,IACFC,oBAAoB,mBAAoBC,GAAoB,GAC5DD,oBAAoB,WAAYC,GAAoB,MAI1D7Q,iBAAiB,mBAAoB6Q,GAAoB,GAGzD7Q,iBAAiB,WAAY6Q,GAAoB,ICfnD,IAAIC,GAAmB,EAEvB,I,OAcMA,EAAkB,IAKpBA,EAlBoB,YAAf,SAAe,+BAKtBC,GAAS,IAAX,cAAAC,GAAA,EACIF,EAAkBE,KACtB,IAcS,CACDF,sBACF,OAAOA,KCZb,KCjCe,SAASG,EAAyBC,EAAQC,GACvD,GAAc,MAAVD,EAAgB,MAAO,GAC3B,IACIpf,EAAK1F,EADLsR,ECHS,SAAuCwT,EAAQC,GAC5D,GAAc,MAAVD,EAAgB,MAAO,GAC3B,IAEIpf,EAAK1F,EAFLsR,EAAS,GACT0T,EAAanoB,OAAOoS,KAAK6V,GAG7B,IAAK9kB,EAAI,EAAGA,EAAIglB,EAAWrmB,OAAQqB,IACjC0F,EAAMsf,EAAWhlB,GACb+kB,EAASxa,QAAQ7E,IAAQ,IAC7B4L,EAAO5L,GAAOof,EAAOpf,IAGvB,OAAO4L,EDTM2T,CAA6BH,EAAQC,GAGlD,GAAIloB,OAAOqoB,sBAAuB,CAChC,IAAIC,EAAmBtoB,OAAOqoB,sBAAsBJ,GAEpD,IAAK9kB,EAAI,EAAGA,EAAImlB,EAAiBxmB,OAAQqB,IACvC0F,EAAMyf,EAAiBnlB,GACnB+kB,EAASxa,QAAQ7E,IAAQ,GACxB7I,OAAO+D,UAAUwkB,qBAAqB7e,KAAKue,EAAQpf,KACxD4L,EAAO5L,GAAOof,EAAOpf,IAIzB,OAAO4L,E,uQETP,MAAwB,kBAAVvS,GAAsBsmB,SAAStmB,G,iDAa7C,OAJIumB,GAAkB/gB,EAAY+gB,eAAiBA,IACjD/gB,EAAY+gB,eAAiBA,GAGxB/gB,EAAYghB,W,qWAAW,EAC5BD,eAAAA,GACJE,ICRA,gBAEA,SAASC,I,4CAIT,IAGIC,EACAC,EAJAC,EAAJ,EAEIC,EAAJ,GA0CA,SAASC,I,SC5BP,IAAF,aACE,IAAIC,EAEAC,EAAe,EACfC,EAAN,GAEE,IAAF,MAGI,GAAIC,IAAUA,EAAMC,eAAgB,CAClC,IAAN,OACA,gBAMAH,GACAC,IAAAA,EAAAA,QACAC,EAAAA,UAAAA,EAAAA,UAAAA,KACAA,EAAAA,UAAAA,EAAAA,UAAAA,KAEQF,GAAgBE,EAAMnnB,MACtBknB,EAAe9oB,KAAK+oB,KAEpBF,EAAeE,EAAMnnB,MACrBknB,EAAiB,CAACC,IAKhBF,EAAerC,EAAO5kB,QACxB4kB,EAAO5kB,MAAQinB,EACfrC,EAAOV,QAAUgD,EACbF,GACFA,OAMV,sBACM5B,IACF4B,EAASA,EAAaK,EAAUzC,EAAQC,GAExCe,GAAS,KACPR,EAAGkC,cAAc9Y,IAAI+Y,GACrBP,GAAO,Q,uKDFb,SAASQ,EAAU3C,G,SJ7CjB,IAAF,MACA,WACE,IAAImC,EAEJ,IAAF,MAGI,IAAJ,cAIQhnB,EAAQynB,EAAkB9B,kBAC5Bf,EAAO5kB,MAAQA,EACf4kB,EAAOV,QAAQ9lB,KAAK+oB,IAGlBH,GACFA,KAIN,kCAEE,GAAI5B,EAAI,CACN4B,EAASA,EAAaK,EAAUzC,EAAQC,GAExC,IAAJ,OACW6C,EAAkB9C,EAAOhkB,MAC5BwkB,EAAGkC,cAAc9Y,IAAI+Y,GACrBnC,EAAGuC,aACHD,EAAkB9C,EAAOhkB,KAAM,EAC/BomB,GAAO,KAOX,CAAC,UAAW,SAAS5pB,SAAQ2C,IAC3B8U,iBAAiB9U,EAAM6nB,EAAe,CAA5CpC,MAAAA,EAAAqC,SAAAA,OAGIjC,EAASgC,GAAe,K,oLIiB5B,SAASE,I,SExEP,IAAF,MACA,WACE,IAAId,EAEJ,IAAF,MAEQA,GAAUG,EAAMY,UAAYN,EAAkB9B,kBAChDf,EAAO5kB,MAAQmnB,EAAMa,gBAAkBb,EAAMY,UAC7CnD,EAAOV,QAAQ9lB,KAAK+oB,GACpBH,GAAO,KAIb,qBACM5B,IACF4B,EAASA,EAAaK,EAAUzC,EAAQC,GACxCe,GAAS,KACPR,EAAGkC,cAAc9Y,IAAI+Y,GACrBnC,EAAGuC,gBACT,K,8pBF0OA,SAA6BniB,EAA7B,K,kOAkCA,gB,04CAkEA,SAAyBA,G,k0CAoCzB,SAAwBA,G,mfA7HxB,SAASyiB,EAAgC,EAAzC,W,kxBG9LEC,YAAY,EACZC,UAAU,EACVC,e,mCAKA,MAAF,WAAAF,EAAAA,SAAAC,EAAAA,eAAAC,EAAAA,2BAAAC,GAAA,OAEAC,GACAhf,GAKE,IAAF,KAEA,MACI,GAAIif,EAAOloB,GACT,OAAOkoB,EAAOloB,GAEhB,IAAJ,IAII,OAHAkoB,EAAOloB,GACXmoB,EAAAA,MAAAA,IAAAA,EAAAA,EAAAA,IAAAA,EAAAA,QACA,wBACWD,EAAOloB,IAKhB,IAAIooB,EAAmBC,EACmB,oBAA/BL,IACTI,EAAmB,GACVC,EAAwBroB,IAAQgoB,EAA2BhoB,IAItE,IAAF,KAEM6nB,IACF7V,EAAAA,EAAAA,GAA0B,SAAS,K,SAgBvCK,EACA+V,EACAla,GAEE,KAAK,YAAyBmE,EAAYgB,YAAa+U,EAAiB/V,EAAYgB,UAAUrT,KAC5F,OAGF,GAAIqS,EAAYY,aAAc,CAC5B,IAAJ,qBACI,IAAKiP,EAAQ,OAgBb,aAdJ,UAEU7P,EAAYiB,SAEd,EAARlF,cAAAA,EAAAA,SAAAA,QAEA,SACQA,EAAKqR,UAAU,kBAEjBrR,EAAK+T,gBAEX,OAME,IAAF,aACE,GAAI3C,EAAmB,CACrB,IAAJ,gBACM3R,KAAMA,EAAAA,EAAAA,GACZwE,EAAAA,WADA,IAEQ3S,KAAM,UAER4oB,YAAa,GAAnBA,OAAAA,EAAAA,UAAAA,OAAAA,KAAAA,OAAAA,EAAAA,UAAAA,KACMC,GAAI,gBAGNlW,EAAYgB,UAAUmV,OAASpa,EAAK8T,OACpChU,EAAME,EAAK8T,QAAU9T,EAErB,IAAJ,YAGIiE,EAAYnR,KAAK,GAAKmR,EAAYnR,KAAK,IAAM,GAE7C,IAAJ,YAGIjD,EAAQiF,QAWZ,SACAsL,EACA3F,EACAuF,EACAnQ,GAQE,IAAF,OACA,oBAEA,EACA,sEAEE,GAAKiF,EAEP,sDAWI,OAVJ,kBAEeY,OAAO,eAAgB2kB,GAE9BC,GAGFC,EAAW7kB,OAAO6kB,EAAqBD,GAGlCC,EACX,qBACI,IAAJ,4BAQI,OANID,GAGFC,EAAW5qB,KAAK,CAAC4qB,EAAqBD,IAGjCC,EAEP,IAAJ,iCACA,KAYI,OAVIzrB,MAAMC,QAAQyrB,GAChBC,EAAkB9qB,QAAQ6qB,GAChC,GACMC,EAAkB9qB,KAAK6qB,GAGrBF,GACFG,EAAkB9qB,KAAK2qB,GAGlB,OACXxlB,GADA,IAEM,eAAgBulB,EAChBK,QAASD,EAAkBtpB,OAAS,EAAIspB,EAAkBpmB,KAAK,UAAOrD,IAxCxE,MAAO,CAAX,iBAAA0pB,QAAAA,GA9BsBC,CACtBva,EACAgR,EAAAA,4BACApR,EACAnQ,GAGIuhB,EAAkBnX,SAASoH,cAAgB,GAzEzCuZ,CAAc3W,EAAa+V,EAAkBla,MAI7C4Z,IACF9V,EAAAA,EAAAA,GAA0B,OAAO,K,SA4IrCK,EACA+V,EACAla,GAEE,KACF,WACAmE,EAAAA,KAAAA,EAAAA,IAAAA,0BACA,0DAEI,OAGF,IAAF,uBAGE,GAAIA,EAAYY,aAAc,CAC5B,IAAJ,+BACI,IAAKiP,EAAQ,OAUb,aARJ,UAEM9T,EAAK6a,cAAclX,EAAIoB,aACvB/E,EAAK+T,gBAEX,OAOE,IAAF,aACE,GAAI3C,EAAmB,CACrB,IAAJ,gBACM3R,KAAMA,EAAAA,EAAAA,GACZkE,EAAAA,MADA,IAEQrS,KAAM,MACN6I,OAAQwJ,EAAIxJ,OACZvI,IAAK+R,EAAI/R,MAEXsoB,YAAa,GAAnBA,OAAAA,EAAAA,OAAAA,KAAAA,OAAAA,EAAAA,KACMC,GAAI,gBAMN,GAHAlW,EAAYN,IAAImX,uBAAyB9a,EAAK8T,OAC9ChU,EAAMmE,EAAYN,IAAImX,wBAA0B9a,EAE5CiE,EAAYN,IAAI8M,iBAClB,IACExM,EAAYN,IAAI8M,iBAAiB,eAAgBzQ,EAAKuR,iBAEtD,IACR,IADA,+BAGY+I,GAIFrW,EAAYN,IAAI8M,iBAAiBxM,EAAqBqW,GAGxDlJ,EAAkBnX,SAASoH,cAAgB,EACnD,YAzMM0Z,CAAY9W,EAAa+V,EAAkBla,MC9IjD,gB,ykBCqGA,M,iGD/FAkb,GAGA,IAFAC,IAEA,yDADAC,IACA,yDACE,IAAK,IAAW,EAAOzN,SAErB,aADJ,6IAIE,IAEI2D,EAFA+J,EAAN,gBAGMF,IACF7J,EAAoB4J,EAAuB,CACzC9rB,KAAMA,EAAOue,SAAS2N,SACtBjB,GAAI,WACJlgB,SAAU,CAAhBqd,OAAAA,UAIM4D,IACFtX,EAAAA,EAAAA,GAA0B,WAAW,IAAzC,OAAAwB,EAAAA,KAAAD,GAAA,OAUmBnU,IAATmU,GAAsBgW,IAA4C,IAA7BA,EAAYpe,QAAQqI,GAC3D+V,OAAcnqB,EAIZmU,IAASC,IACX+V,OAAcnqB,EACVogB,KACZ,qIAEUA,EAAkB2C,UAEpB3C,EAAoB4J,EAAuB,CACzC9rB,KAAMA,EAAOue,SAAS2N,SACtBjB,GAAI,aACJlgB,SAAU,CAApBqd,OAAAA,c,oGCiDA,G,ijBC3FE,IAAI+D,EACA9pB,EAAQ+pB,EAAI,GACZ9oB,EAAI,EACR,KAAOA,EAAI8oB,EAAInqB,QAAQ,CACrB,IAAJ,OACA,SAGI,GAFAqB,GAAK,GAEO,mBAAP2nB,GAAkC,iBAAPA,IAAmC,MAAT5oB,EAExD,OAES,WAAP4oB,GAA0B,mBAAPA,GACrBkB,EAAgB9pB,EAChBA,EAAQwW,EAAGxW,IACjB,iCACMA,EAAQwW,GAAG,WAAjB,sDAAAjV,EAAAA,GAAAA,UAAAA,GAAA,yBACMuoB,OAAgBrqB,GAGpB,OAAOO,E,m7BhBpBH,GAAU,EAAOsU,SACnBxB,EAAOwB,SAASO,iBAAiB,oBAAoB,KACnD,IAAN,aACM,GAAI,EAAOP,SAASD,QAAUwL,EAAmB,CAC/C,IAAR,eAEA,0DACArhB,EAAAA,GAAAA,IAAAA,0BAAAA,OACAwrB,EADA,sDACAnK,EAAAA,KAIaA,EAAkBlT,QACrBkT,EAAkBC,UAAUkK,GAE9BnK,EAAkBoK,OAAO,mBAAoB,mBAC7CpK,EAAkB2C,cAI1B,0DACAhkB,EAAAA,GAAAA,KAAAA,uF,ycFhBE,IAAF,aAEE,IAAK0rB,IAAgBC,EAEnB,OAGF,IAAI7J,EAOJ,MANmB,MAAf6J,EAAQ,GACV7J,GAAgB,EACpB,aACIA,GAAgB,GAGX,CACL8J,QAASD,EAAQ,GACjB7J,cAAAA,EACA+J,aAAcF,EAAQ,I,wBCR1B/F,GAEE,KAAK,EAAAtc,EAAA,IAASsc,KAAmB7mB,MAAMC,QAAQ4mB,GAC7C,OAKF,IAAIkG,EAAN,GAEE,GAAI/sB,MAAMC,QAAQ4mB,GAEhBkG,EAAgBlG,EAAcD,QAAlCmG,CAAAA,EAAAA,KACM,IAAN,OACM,OAAO,EAAb,KACA7F,GACA8F,KAEA,QACA,CAGI,IAAKnG,EACH,OAGFkG,EAAgB5F,EAAsBN,GAIxC,IAAF,+CAKI,OAJIzd,EAAIlE,MAAM+nB,KAEZ/F,EADN,mBAC4BzkB,GAEjBykB,IACX,IAIE,OAAI3mB,OAAOoS,KAAKhH,GAAwBtJ,OAAS,EACxCsJ,OAEP,E,i6BkBhC8B,qBAAvBuhB,oBAAsCA,sBAE/CC,EAAAA,EAAAA,O,8/RCjBFC,GAEE,IAAF,yBACA,uBACE,QAASrsB,IAAY,qBAAsBA,GAAW,kBAAmBA,G,cAKzE,IACF,GADA,eACA,WACE,OAAOI,GAAS,EAAlB,iB,cAQE,OAAOksB,EAAO,M,kDC5Bd,OAAc,MAAPC,EAAcA,EAAMC,I,ivBCF7B,gBAwBA,KACA,KAGA,SAASC,EAAWhrB,GAClB,IAAIirB,EAAajrB,GAMjB,OAFAirB,EAAajrB,IAAQ,EAEbA,GACN,IAAK,WA0DT,WACE,KAAM,YAAa+S,GACjB,OAGFmY,EAAAA,GAAAA,SAAuB,SAAUhhB,GACzBA,KAAS6I,EAAOrU,UAItBkZ,EAAAA,EAAAA,IAAK7E,EAAOrU,QAASwL,GAAO,SAAUihB,GACpC,OAAO,WAAb,sDAAA3pB,EAAAA,GAAAA,UAAAA,GACQ4pB,EAAgB,UAAW,CAAnC5pB,KAAAA,EAAA0I,MAAAA,IAGYihB,GACFA,EAAsB1pB,MAAMsR,EAAOrU,QAAS8C,UAzEhD6pB,GACA,MACF,IAAK,OA+aT,WACE,KAAM,aAActY,GAClB,OAMF,IAAF,qBACA,UACEA,EAAOwB,SAASO,iBAAiB,QAASwW,GAAuB,GACjEvY,EAAOwB,SAASO,iBAAiB,WAAYwW,GAAuB,GAOpE,CAAC,cAAe,QAAQjuB,SAAQ,IAC9B,IAAJ,uBAEA,6DAKIua,EAAAA,EAAAA,IAAKe,EAAO,oBAAoB,SAAU4S,GACxC,OAAO,SAEbvrB,EACAwrB,EACAjtB,GAEQ,GAAa,UAATyB,GAA4B,YAARA,EACtB,IACE,IAAZ,OACA,kFACA,cAAAyrB,SAAAA,GAEY,IAAKC,EAAerT,QAAS,CAC3B,IAAd,OACcqT,EAAerT,QAAUA,EACzBkT,EAAyB9jB,KAAK3G,KAAMd,EAAMqY,EAAS9Z,GAGrDmtB,EAAeD,UAAY,EACvC,UAMQ,OAAOF,EAAyB9jB,KAAK3G,KAAMd,EAAMwrB,EAAUjtB,QAI/DqZ,EAAAA,EAAAA,IACJe,EACA,uBACA,YACM,OAAN,SAEA3Y,EACAwrB,EACAjtB,GAEQ,GAAR,2BACU,IACE,IAAZ,OACA,4CACA,OAEA,IACc,EAAdmtB,UAAAA,EAEA,gBACgB,EAAhB5S,KAAAA,KAAAA,EAAAA,EAAAA,QAAAA,GACgB,EAAhB4S,aAAAA,SACA,MAIA,kCACA,uCAGA,UAMQ,OAAR,2BA1gBMC,GACA,MACF,IAAK,OAgKT,WACE,KAAM,mBAAoB5Y,GACxB,OAGF,IAAF,4BAEE6E,EAAAA,EAAAA,IAAKgU,EAAU,QAAQ,SAAUC,GAC/B,OAAO,WAAX,sDAAArqB,EAAAA,GAAAA,UAAAA,GACM,IAAN,OAEA,OACA,oBACQ,QAARqH,EAAAA,EAAAA,IAAAA,EAAAA,IAAAA,EAAAA,GAAAA,cAAAA,EAAAA,GAEQvI,IAAKkB,EAAK,KAIlB,uDAEQ6Q,EAAImB,wBAAyB,GAG/B,IAAN,aACQ,GAAuB,IAAnBnB,EAAI0M,WAAkB,CACxB,IAGE+M,EAAQrY,YAAcpB,EAAIzF,OACtC,UAIUwe,EAAgB,MAAO,CACrB5pB,KAAAA,EACA+R,aAAcgK,KAAKL,MACnBsJ,eAAgBjJ,KAAKL,MACrB7K,IAAAA,MAgBN,MAXI,uBAAwBA,GAAyC,oBAA3BA,EAAIyM,oBAC5ClH,EAAAA,EAAAA,IAAKvF,EAAK,sBAAsB,SAAU6F,GACxC,OAAO,WACL6T,IADZ,sDAAAC,EAAAA,GAAAA,UAAAA,GAEY,OAAO9T,EAASzW,MAAM4Q,EAAK2Z,OAI/B3Z,EAAIyC,iBAAiB,mBAAoBiX,GAGpCF,EAAapqB,MAAM4Q,EAAK7Q,QAInCoW,EAAAA,EAAAA,IAAKgU,EAAU,QAAQ,SAAUtT,GAC/B,OAAO,WAAX,sDAAA9W,EAAAA,GAAAA,UAAAA,GAWM,OAVIV,KAAKmrB,qBAA8BvsB,IAAZ8B,EAAK,KAC9BV,KAAKmrB,eAAevY,KAAOlS,EAAK,IAGlC4pB,EAAgB,MAAO,CACrB5pB,KAAAA,EACAglB,eAAgBjJ,KAAKL,MACrB7K,IAAKvR,OAGAwX,EAAa7W,MAAMX,KAAMU,OArOhC0qB,GACA,MACF,IAAK,SAyET,WACE,KAAK,UACH,QAGFtU,EAAAA,EAAAA,IAAK7E,EAAQ,SAAS,SAAUoZ,GAC9B,OAAO,WAAX,sDAAA3qB,EAAAA,GAAAA,UAAAA,GACM,IAAN,GACQA,KAAAA,EACAmS,UAAW,CACT9K,OAAQujB,EAAe5qB,GACvBlB,IAAK+rB,EAAY7qB,IAEnBglB,eAAgBjJ,KAAKL,OAOvB,OAJAkO,EAAgB,QAAS,EAA/BA,GACAzY,IAGA,mBAEAiB,IACQ,EAARwX,QAAAA,EAAAA,EAAAA,GACAzY,GADA,IAEU,aAAVY,KAAAA,MACU,cAEV,KAEAxC,IASQ,MARA,EAARqa,QAAAA,EAAAA,EAAAA,GACAzY,GADA,IAEU,aAAVY,KAAAA,MACU,WAKV,SA/GM+Y,GACA,MACF,IAAK,WAwOT,WACE,KAAK,UACH,OAGF,IAAF,eAuBE,SAASC,EAA2BC,GAClC,OAAO,WAAX,sDAAAhrB,EAAAA,GAAAA,UAAAA,GACM,IAAN,yBACM,GAAIlB,EAAK,CAEP,IAAR,IACA,YAEQmsB,EAAW3Y,EACXsX,EAAgB,UAAW,CACzBvX,KAAAA,EACAC,GAAAA,IAGJ,OAAO0Y,EAAwB/qB,MAAMX,KAAMU,IApC/CuR,EAAO2Z,WAAa,WAClB,IAAJ,kBAEA,IAMI,GALAD,EAAW3Y,EACXsX,EAAgB,UAAW,CACzBvX,KAAAA,EACAC,GAAAA,IAEE6Y,EAIF,IAAN,2BAbAnrB,EAaA,yBAbAA,EAaA,gBACQ,OAAOmrB,EAAclrB,MAAMX,KAAMU,GACzC,aAyBEoW,EAAAA,EAAAA,IAAK7E,EAAOZ,QAAS,YAAaoa,IAClC3U,EAAAA,EAAAA,IAAK7E,EAAOZ,QAAS,eAAgBoa,GAtRjCK,GACA,MACF,IAAK,QAygBPC,EAAqB9Z,EAAOgG,QAE5BhG,EAAOgG,QAAU,SAAUQ,EAA7BxG,EAAAA,EAAAA,EAAAA,GASI,OARAqY,EAAgB,QAAS,CACvB3R,OAAAA,EACA1I,MAAAA,EACAyI,KAAAA,EACAD,IAAAA,EACAjZ,IAAAA,MAGEusB,GACR,yBAnhBM,MACF,IAAK,qBA6hBPC,EAAkC/Z,EAAOiG,qBAEzCjG,EAAOiG,qBAAuB,SAAUtJ,GAGtC,OAFA0b,EAAgB,qBAAsB1b,IAElCod,GACR,yBAjiBM,MACF,QAEE,aADN,yG,gBAWEC,EAAS/sB,GAAQ+sB,EAAS/sB,IAAS,GACnC,EAAF+sB,GAAAA,KAAAA,GACE/B,EAAWhrB,GAIb,SAASorB,EAAgBprB,EAAzB,GACE,GAAKA,GAAS+sB,EAAS/sB,GAIvB,IAAK,IAAP,cACI,IACEqY,EAAQlK,GACd,UACA,0DACA1P,EAAAA,GAAAA,MAAAA,0DAAAA,OACAuB,EADA,oBACAgtB,EAAAA,EAAAA,IAAAA,GADA,YAEAtd,IA4FA,SAAS0c,IAAT,gEACE,MAAI,YAAarZ,IAAU,QAAaka,EAAU,GAAIC,UAAYD,EAAU,GAAGpkB,OACtEskB,OAAOF,EAAU,GAAGpkB,QAAQukB,cAEjCH,EAAU,IAAMA,EAAU,GAAGpkB,OACxBskB,OAAOF,EAAU,GAAGpkB,QAAQukB,cAE9B,MAIT,SAASf,IAAT,gEACE,MAA4B,kBAAjBY,EAAU,GACZA,EAAU,GAEf,YAAala,IAAU,QAAaka,EAAU,GAAIC,SAC7CD,EAAU,GAAG3sB,IAEf6sB,OAAOF,EAAU,IAgF1B,IAAIR,EAsDJ,IAAIY,EACAC,EAOJ,SAASC,EAAmCC,EAA5C,GAEE,IAAKA,EACH,OAAO,EAIT,GAAIA,EAASxtB,OAASytB,EAAQztB,KAC5B,OAAO,EAGT,IAGE,GAAIwtB,EAAShb,SAAWib,EAAQjb,OAC9B,OAAO,EAEb,UAQE,OAAO,EAOT,SAASkb,EAAmB/tB,GAE1B,GAAmB,aAAfA,EAAMK,KACR,OAAO,EAGT,IACE,IAAJ,WAEI,IAAKwS,IAAWA,EAAOmb,QACrB,OAAO,EAKT,GAAuB,UAAnBnb,EAAOmb,SAA0C,aAAnBnb,EAAOmb,SAA0Bnb,EAAOob,kBACxE,OAAO,EAEb,UAKE,OAAO,EAUT,SAASC,EAAoBxV,GAA7B,8DACE,OAAO,IAIL,GAAK1Y,GAAS2tB,IAAsB3tB,IAKhC+tB,EAAmB/tB,GAAvB,CAIA,IAAJ,2CAG4BD,IAApB2tB,GAUR,UATMhV,EAAQ,CACN1Y,MAAOA,EACP/B,KAAAA,EACAmV,OAAQ+a,IAEVR,EAAoB3tB,GActBkd,aAAawQ,GACbA,EAAkBta,EAAOyD,YAAW,KAClC6W,OAAkB3tB,IAjHxB,OA+OA,IAAImtB,EAAJ,KAuBA,IAAIC,EAAJ,M,41CC1lBA,I,gGAiFA,oB,iQCzBE,KAAM,UAAW,UACf,OAAO,EAGT,IAIE,OAHA,IAAIiB,QACJ,IAAIb,QAAQ,0BACZ,IAAIc,UACG,EACX,SACI,OAAO,G,cAQT,OAAOpY,GAAQ,mDAAmD/E,KAAK+E,EAAKqY,Y,aAU5E,IAAKC,IACH,OAAO,EAGT,IAAF,YAGE,GAAF,WAEI,OAAO,EAKT,IAAIjkB,GAAS,EACb,IAAF,aACE,GAAF,uCAEI,IACE,IAAN,4BACMoK,EAAQC,QAAS,EACjB6Z,EAAI3Z,KAAKC,YAAYJ,GACjBA,EAAQK,eAAiBL,EAAQK,cAAcxC,QACjD,EAARjI,EAAAA,EAAAA,cAAAA,QAGMkkB,EAAI3Z,KAAKG,YAAYN,GAC3B,UACA,0DACA5V,EAAAA,GAAAA,KAAAA,kFAAAA,GAIE,OAAOwL,E,aAiDP,IAAF,YACA,WAGA,0BACA,iEAGE,OAAQmkB,GAAuBC,I,oBChLjC,MAAM,aAAa,IAAI3e,EAAE,CAAC,IAAIA,IAM9B,IAAI4e,EAAEvwB,OAAOqoB,sBAA0BmI,EAAExwB,OAAO+D,UAAU0F,eAAmBgnB,EAAEzwB,OAAO+D,UAAUwkB,qBAAqB,SAASmI,EAAS/e,GAAG,GAAO,OAAJA,QAAchQ,IAAJgQ,EAAe,MAAM,IAAIgf,UAAU,yDAAyD,OAAO3wB,OAAO2R,GAA0gBA,EAAEif,QAAzgB,WAA2B,IAAI,IAAI5wB,OAAO6wB,OAAQ,OAAO,EAAM,IAAIlf,EAAE,IAAIyd,OAAO,OAAiB,GAAVzd,EAAE,GAAG,KAA2C,MAAnC3R,OAAO8wB,oBAAoBnf,GAAG,GAAU,OAAO,EAAe,IAAT,IAAI4e,EAAE,GAAWC,EAAE,EAAEA,EAAE,GAAGA,IAAKD,EAAE,IAAInB,OAAO2B,aAAaP,IAAIA,EAAE,IAAIC,EAAEzwB,OAAO8wB,oBAAoBP,GAAG7f,KAAK,SAASiB,GAAG,OAAO4e,EAAE5e,MAAM,GAAgB,eAAb8e,EAAEzrB,KAAK,IAAoB,OAAO,EAAM,IAAIgsB,EAAE,GAAmE,MAAhE,uBAAuBjsB,MAAM,IAAIzF,SAAS,SAASqS,GAAGqf,EAAErf,GAAGA,KAAoD,yBAA5C3R,OAAOoS,KAAKpS,OAAO6wB,OAAO,GAAGG,IAAIhsB,KAAK,IAAuD,MAAM2M,GAAG,OAAO,GAAiBsf,GAAkBjxB,OAAO6wB,OAAO,SAASlf,EAAEqf,GAAiC,IAA9B,IAAIE,EAAwBC,EAAlBhuB,EAAEutB,EAAS/e,GAAiByf,EAAE,EAAEA,EAAE9b,UAAUxT,OAAOsvB,IAAI,CAAwB,IAAI,IAAIC,KAA/BH,EAAElxB,OAAOsV,UAAU8b,IAAuBZ,EAAE9mB,KAAKwnB,EAAEG,KAAIluB,EAAEkuB,GAAGH,EAAEG,IAAI,GAAGd,EAAE,CAACY,EAAEZ,EAAEW,GAAG,IAAI,IAAII,EAAE,EAAEA,EAAEH,EAAErvB,OAAOwvB,IAAQb,EAAE/mB,KAAKwnB,EAAEC,EAAEG,MAAKnuB,EAAEguB,EAAEG,IAAIJ,EAAEC,EAAEG,MAAO,OAAOnuB,IAAI,IAAI,CAACwO,EAAE4e,EAAEC,KASviCe,GAA2sB,IAAI,CAAC5f,EAAE4e,EAAEC,KASvtB,IAAIC,EAAED,EAAE,KAAKQ,EAAER,EAAE,KAAKD,EAAEiB,gBAAgB,SAAS7f,GAAG,IAAI4e,EAAE5e,EAAE8f,gBAAgBjB,EAAE7e,EAAE+f,UAAUR,EAAEF,EAAEW,UAAU,WAAW,MAAM,CAACF,gBAAgBlB,EAAEmB,UAAUlB,EAAEtuB,MAAMquB,QAAQ5e,EAAEuf,EAAE,GAAG,IAAI/tB,EAAE+tB,EAAE,GAA4U,OAAzUA,EAAEvf,EAAEzP,MAASyP,EAAE8f,kBAAkBlB,GAAG5e,EAAE+f,YAAYlB,IAAEU,EAAEX,IAAIptB,EAAE,CAACsuB,gBAAgBlB,EAAEmB,UAAUlB,EAAEtuB,MAAMgvB,KAAIF,EAAEY,cAAcV,GAAGF,EAAEa,WAAW,WAAW,SAAS1hB,IAAI,IAAIwB,EAAE,CAAC,IAAIqf,EAAET,IAAIptB,GAAG,SAASwO,GAAG,OAAOA,EAAE8f,kBAAkBlB,GAAG5e,EAAE+f,YAAYlB,GAAG7e,EAAEzP,QAAQ8uB,EAAErf,EAAE8e,EAAE,GAAG9e,EAAE,CAACzP,MAAM8uB,QAAQ,IAAIrf,GAAE,EAAGqf,EAAER,EAAErgB,GAAO,OAAJA,IAAW,WAAWwB,GAAE,EAAGqf,OAAO,CAACT,EAAEC,IAAWU,IAAI,IAAI,CAACvf,EAAE4e,EAAEC,KAA6C7e,EAAEif,QAAQJ,EAAE,MAA6B,IAAI7e,IAAIA,EAAEif,QAAQkB,EAAQ,OAAevB,EAAE,GAAG,SAASwB,EAAoBvB,GAAG,IAAIC,EAAEF,EAAEC,GAAG,QAAO7uB,IAAJ8uB,EAAe,OAAOA,EAAEG,QAAQ,IAAII,EAAET,EAAEC,GAAG,CAACI,QAAQ,IAAQM,GAAE,EAAK,IAAIvf,EAAE6e,GAAGQ,EAAEA,EAAEJ,QAAQmB,GAAqBb,GAAE,EAA5C,QAA6DA,UAASX,EAAEC,GAAG,OAAOQ,EAAEJ,QAAoDmB,EAAoBC,GAAGC,KAAc,IAAIzB,EAAEuB,EAAoB,KAAKG,EAAOtB,QAAQJ,GAxBr+B,I,oBCAA0B,EAAOtB,QAAU,EAAjBsB,M,+CCEIC,EAAkBL,EAAQ,MAE9B,SAASM,EAAQ5pB,EAAQ6pB,GAAkB,IAAIjgB,EAAOpS,OAAOoS,KAAK5J,GAAS,GAAIxI,OAAOqoB,sBAAuB,CAAE,IAAIiK,EAAUtyB,OAAOqoB,sBAAsB7f,GAAS6pB,IAAmBC,EAAUA,EAAQvO,QAAO,SAAUwO,GAAO,OAAOvyB,OAAOwyB,yBAAyBhqB,EAAQ+pB,GAAKE,eAAiBrgB,EAAK9R,KAAKoD,MAAM0O,EAAMkgB,GAAY,OAAOlgB,EAE9U,SAASsgB,EAAcje,GAAU,IAAK,IAAItR,EAAI,EAAGA,EAAImS,UAAUxT,OAAQqB,IAAK,CAAE,IAAI8kB,EAAS,MAAQ3S,UAAUnS,GAAKmS,UAAUnS,GAAK,GAAIA,EAAI,EAAIivB,EAAQpyB,OAAOioB,IAAS,GAAI3oB,SAAQ,SAAUuJ,GAAOspB,EAAgB1d,EAAQ5L,EAAKof,EAAOpf,OAAY7I,OAAO2yB,0BAA4B3yB,OAAO4yB,iBAAiBne,EAAQzU,OAAO2yB,0BAA0B1K,IAAWmK,EAAQpyB,OAAOioB,IAAS3oB,SAAQ,SAAUuJ,GAAO7I,OAAOsZ,eAAe7E,EAAQ5L,EAAK7I,OAAOwyB,yBAAyBvK,EAAQpf,OAAa,OAAO4L,EAKjfmc,EAAAA,QAOA,SAAiBiC,EAAgBryB,GAC/B,IAAIsyB,EAAaC,EAAS,QACtBC,EAAkB,CAEpBC,QAAS,SAAAC,GAKHA,EAHFlgB,MAGEkgB,EAFFC,UAGF,OADID,EADFE,UAcK,OAOPP,aAA0BQ,QAC5BL,EAAgBM,OAAS,kBAAMT,GAEI,oBAAnBA,EAChBG,EAAgBM,OAAST,EACU,WAA1B,EAAOA,KAChBG,EAAkBN,EAAcA,EAAc,GAAIM,GAAkBH,IAKtE,IAAMU,EADNP,EAAkBN,EAAcA,EAAc,GAAIM,GAAkBxyB,GAGpE,GAA+C+yB,EAAgBC,SAC7D,MAAM,IAAIrY,MAAM,uHAGlB,GAAIoY,EAAgBC,SAClB,OAAOV,EAAWS,GAIhBP,EAAgBS,0BAClBT,EAAkBN,EAAcA,EAAc,GAAIM,GAAkBA,EAAgBS,oBAC7DA,kBAIzB,GAAmC,mBAAxBT,EAAgBU,IAAmB,CAC5C,IAAKV,EAAgBU,IAEnB,cADOV,EAAgBU,IAChBC,EAAMb,EAAYE,UAGpBA,EAAgBU,IAGzB,OAAOZ,EAAWE,IAtEPY,EAAuB9B,EAAQ,MAA5C,IAEIiB,EAAYa,EAAuB9B,EAAQ,OAuE/C,SAAS8B,EAAuB9rB,GAC9B,OAAOA,GAAOA,EAAI+rB,WAAa/rB,EAAM,CACnCgsB,QAAShsB,GAMb,SAAS6rB,EAAMI,EAAqBf,GAMhC,cAJKA,EAAgBgB,eAChBhB,EAAgBiB,QAGdF,EAAoBf,K,kCC9F/B,IAEgClrB,EAPhC9H,OAAOsZ,eAAesX,EAAS,aAAc,CAC3C1uB,OAAO,IAET0uB,EAAQsD,qBAAkB,EAU1B,IAAMA,IAN0BpsB,EAFIgqB,EAAQ,OAG5BhqB,EAAI+rB,WAAa/rB,EAAM,CACnCgsB,QAAShsB,IAIiB,QAASqsB,cAAc,MAErDvD,EAAQsD,gBAAkBA,G,ilCCf1B,IAAI/B,EAAkBL,EAAQ,MAE9B,SAASM,EAAQ5pB,EAAQ6pB,GAAkB,IAAIjgB,EAAOpS,OAAOoS,KAAK5J,GAAS,GAAIxI,OAAOqoB,sBAAuB,CAAE,IAAIiK,EAAUtyB,OAAOqoB,sBAAsB7f,GAAS6pB,IAAmBC,EAAUA,EAAQvO,QAAO,SAAUwO,GAAO,OAAOvyB,OAAOwyB,yBAAyBhqB,EAAQ+pB,GAAKE,eAAiBrgB,EAAK9R,KAAKoD,MAAM0O,EAAMkgB,GAAY,OAAOlgB,EAE9U,SAASsgB,EAAcje,GAAU,IAAK,IAAItR,EAAI,EAAGA,EAAImS,UAAUxT,OAAQqB,IAAK,CAAE,IAAI8kB,EAAS,MAAQ3S,UAAUnS,GAAKmS,UAAUnS,GAAK,GAAIA,EAAI,EAAIivB,EAAQpyB,OAAOioB,IAAS,GAAI3oB,SAAQ,SAAUuJ,GAAOspB,EAAgB1d,EAAQ5L,EAAKof,EAAOpf,OAAY7I,OAAO2yB,0BAA4B3yB,OAAO4yB,iBAAiBne,EAAQzU,OAAO2yB,0BAA0B1K,IAAWmK,EAAQpyB,OAAOioB,IAAS3oB,SAAQ,SAAUuJ,GAAO7I,OAAOsZ,eAAe7E,EAAQ5L,EAAK7I,OAAOwyB,yBAAyBvK,EAAQpf,OAAa,OAAO4L,EAEjfzU,OAAOsZ,eAAesX,EAAS,aAAc,CAC3C1uB,OAAO,IAET0uB,EAAAA,aAAkB,EAElB,IAMgC9oB,EAN5BssB,GAM4BtsB,EANIgqB,EAAQ,OAO5BhqB,EAAI+rB,WAAa/rB,EAAM,CACnCgsB,QAAShsB,GANTusB,EAAmBvC,EAAQ,KAE3BwC,EAAmBxC,EAAQ,MAQ/B,IAAMyC,EAAmB,GACnBC,EAAqB,GACvBC,GAAc,EAElB,SAASC,EAAKpB,GACZ,IAAIphB,EAAUohB,IACVqB,EAAQ,CACV1B,SAAS,EACT2B,OAAQ,KACR5hB,MAAO,MAWT,OATA2hB,EAAMziB,QAAUA,EAAQjG,MAAK,SAAA2oB,GAG3B,OAFAD,EAAM1B,SAAU,EAChB0B,EAAMC,OAASA,EACRA,KAHO,OAIP,SAAAC,GAGP,MAFAF,EAAM1B,SAAU,EAChB0B,EAAM3hB,MAAQ6hB,EACRA,KAEDF,E,IA2GHG,EAAAA,WACJ,WAAYC,EAAQC,GAAM,UACxBjyB,KAAKkyB,QAAUF,EACfhyB,KAAKmyB,MAAQF,EACbjyB,KAAKoyB,WAAa,IAAIC,IACtBryB,KAAKsyB,OAAS,KACdtyB,KAAKuyB,SAAW,KAChBvyB,KAAKwyB,Q,iCAGP,WACE,OAAOxyB,KAAKyyB,KAAKtjB,U,mBAGnB,WAAQ,WACNnP,KAAK0yB,iBAEL1yB,KAAKyyB,KAAOzyB,KAAKkyB,QAAQlyB,KAAKmyB,MAAM5B,QACpCvwB,KAAK2yB,OAAS,CACZtC,WAAW,EACXuC,UAAU,GAEZ,IACQC,EAEJ7yB,KAFFyyB,KACOR,EACLjyB,KADFmyB,MAGEU,EAAI3C,UACoB,kBAAf+B,EAAKnV,QACK,IAAfmV,EAAKnV,MACP9c,KAAK2yB,OAAOtC,WAAY,EAExBrwB,KAAKsyB,OAAS5c,YAAW,WACvB,EAAKod,QAAQ,CACXzC,WAAW,MAEZ4B,EAAKnV,QAIgB,kBAAjBmV,EAAKhoB,UACdjK,KAAKuyB,SAAW7c,YAAW,WACzB,EAAKod,QAAQ,CACXF,UAAU,MAEXX,EAAKhoB,WAIZjK,KAAKyyB,KAAKtjB,QAAQjG,MAAK,WACrB,EAAK4pB,QAAQ,IAEb,EAAKJ,oBAHP,OAIS,SAAAK,GACP,EAAKD,QAAQ,IAEb,EAAKJ,oBAGP1yB,KAAK8yB,QAAQ,M,qBAGf,SAAQE,GACNhzB,KAAK2yB,OAAShD,EAAcA,EAAc,GAAI3vB,KAAK2yB,QAAS,GAAI,CAC9D1iB,MAAOjQ,KAAKyyB,KAAKxiB,MACjB4hB,OAAQ7xB,KAAKyyB,KAAKZ,OAClB3B,QAASlwB,KAAKyyB,KAAKvC,SAClB8C,GAEHhzB,KAAKoyB,WAAW71B,SAAQ,SAAAuG,GAAQ,OAAIA,S,4BAGtC,WACEiZ,aAAa/b,KAAKsyB,QAClBvW,aAAa/b,KAAKuyB,Y,6BAGpB,WACE,OAAOvyB,KAAK2yB,S,uBAGd,SAAU7vB,GAAU,WAGlB,OAFA9C,KAAKoyB,WAAWjtB,IAAIrC,GAEb,WACL,EAAKsvB,WAAL,OAAuBtvB,Q,EArFvBivB,GA2FN,SAASkB,EAAShB,GAChB,OAhMF,SAAiCD,EAAQv0B,GACvC,IAAIw0B,EAAOh1B,OAAO6wB,OAAO,CACvByC,OAAQ,KACRL,QAAS,KACTpT,MAAO,IACP7S,QAAS,KACTgnB,QAAS,KACTC,QAAS,KACTT,UAAU,GACThzB,GAECw0B,EAAKxB,WACPwB,EAAKiB,KAAO7B,EAAM,QAAS6B,KAAKjB,EAAK1B,SAGvC,IAAI4C,EAAe,KAEnB,SAASrpB,IACP,IAAKqpB,EAAc,CACjB,IAAMC,EAAM,IAAIrB,EAAqBC,EAAQC,GAC7CkB,EAAe,CACbzE,gBAAiB0E,EAAI1E,gBAAgB5lB,KAAKsqB,GAC1CzE,UAAWyE,EAAIzE,UAAU7lB,KAAKsqB,GAC9BZ,MAAOY,EAAIZ,MAAM1pB,KAAKsqB,GACtBjkB,QAASikB,EAAIjkB,QAAQrG,KAAKsqB,IAI9B,OAAOD,EAAahkB,UAStB,IAAKuiB,IAAiDO,EAAKxB,SAAU,CAEnE,IAAM4C,EAAYpB,EAAKhB,QAAuDgB,EAAKhB,UAAYgB,EAAKf,QAEhGmC,GACF5B,EAAmBl0B,MAAK,SAAA+1B,GAAO,UACND,GADM,IAC7B,2BAAkC,KAAvBE,EAAuB,QAChC,IAA+B,IAA3BD,EAAI3oB,QAAQ4oB,GACd,OAAOzpB,KAHkB,kCAkDnC,IAAM0pB,EAAoBvB,EAAKxB,SAN/B,SAAkBgD,EAAOC,GACvB,OAAOrC,EAAM,QAASsC,cAAc1B,EAAKiB,KAAMvD,EAAcA,EAAc,GAAI8D,GAAQ,GAAI,CACzFC,IAAAA,MApCJ,SAAsBD,EAAOC,GAC3B5pB,IAEA,IAAMlJ,EAAUywB,EAAM,QAASuC,WAAWrC,EAAiBJ,iBAErDS,EAAYN,EAAkB7C,gBAAgB0E,GAYpD,OAVA9B,EAAM,QAASwC,oBAAoBH,GAAK,iBAAO,CAC7ClB,MAAOW,EAAaX,SAClB,IAEA5xB,GAAWlE,MAAMC,QAAQs1B,EAAKf,UAChCe,EAAKf,QAAQ30B,SAAQ,SAAA0kB,GACnBrgB,EAAQqgB,MAILoQ,EAAM,QAASyC,SAAQ,WAC5B,OAAIlC,EAAM1B,SAAW0B,EAAM3hB,MAClBohB,EAAM,QAASsC,cAAc1B,EAAK/B,QAAS,CAChDE,UAAWwB,EAAM1B,QACjBG,UAAWuB,EAAMvB,UACjBuC,SAAUhB,EAAMgB,SAChB3iB,MAAO2hB,EAAM3hB,MACbuiB,MAAOW,EAAaX,QAEbZ,EAAMC,OACRR,EAAM,QAASsC,cAnF9B,SAAiB5uB,GACf,OAAOA,GAAOA,EAAI+rB,WAAa/rB,EAAG,QAAWA,EAkFHkH,CAAQ2lB,EAAMC,QAAS4B,GAEpD,OAER,CAACA,EAAO7B,KAcb,OAHA4B,EAAkBO,QAAU,kBAAO9B,EAAKxB,UAAY3mB,KAEpD0pB,EAAkBQ,YAAc,oBACzB3C,EAAM,QAAS4C,WAAWT,GA+F1BU,CAAwBvC,EAAMM,GAGvC,SAASkC,EAAkBC,EAAcd,GAGvC,IAFA,IAAIe,EAAW,GAERD,EAAar1B,QAAQ,CAC1B,IAAI+K,EAAOsqB,EAAalyB,MACxBmyB,EAAS92B,KAAKuM,EAAKwpB,IAGrB,OAAOhD,QAAQhU,IAAI+X,GAAUnrB,MAAK,WAChC,GAAIkrB,EAAar1B,OACf,OAAOo1B,EAAkBC,EAAcd,MAK7CL,EAASqB,WAAa,WACpB,OAAO,IAAIhE,SAAQ,SAACiE,EAAqBtY,GACvCkY,EAAkB3C,GAAkBtoB,KAAKqrB,EAAqBtY,OAIlEgX,EAASuB,aAAe,WACtB,IAAIlB,EAAM/gB,UAAUxT,OAAS,QAAsBH,IAAjB2T,UAAU,GAAmBA,UAAU,GAAK,GAC9E,OAAO,IAAI+d,SAAQ,SAAAmE,GACjB,IAAM5B,EAAM,WAEV,OADAnB,GAAc,EACP+C,KAITN,EAAkB1C,EAAoB6B,GAAKpqB,KAAK2pB,EAAKA,OAKvDnU,OAAOgW,oBAAsBzB,EAASuB,aAGxC,IAAIG,EAAW1B,EACfpF,EAAAA,QAAkB8G","sources":["webpack://_N_E/../../src/integration.ts","webpack://_N_E/../../src/sdk.ts","webpack://_N_E/../../../src/integrations/inboundfilters.ts","webpack://_N_E/../../../src/integrations/functiontostring.ts","webpack://_N_E/../../src/error.ts","webpack://_N_E/../../src/dsn.ts","webpack://_N_E/../../src/envelope.ts","webpack://_N_E/../../src/memo.ts","webpack://_N_E/../../src/normalize.ts","webpack://_N_E/../../src/api.ts","webpack://_N_E/../../src/baseclient.ts","webpack://_N_E/../../../src/eventbuilder.ts","webpack://_N_E/../../src/severity.ts","webpack://_N_E/../../src/url.ts","webpack://_N_E/../../../../src/integrations/breadcrumbs.ts","webpack://_N_E/../../../../src/transports/utils.ts","webpack://_N_E/../../../src/client.ts","webpack://_N_E/../../src/clientreport.ts","webpack://_N_E/../../../src/stack-parsers.ts","webpack://_N_E/../../src/exports.ts","webpack://_N_E/../../../src/helpers.ts","webpack://_N_E/../../../../src/integrations/trycatch.ts","webpack://_N_E/../../../../src/integrations/globalhandlers.ts","webpack://_N_E/../../../../src/integrations/linkederrors.ts","webpack://_N_E/../../../../src/integrations/dedupe.ts","webpack://_N_E/../../../../src/integrations/httpcontext.ts","webpack://_N_E/../../src/promisebuffer.ts","webpack://_N_E/../../src/ratelimit.ts","webpack://_N_E/../../../src/transports/base.ts","webpack://_N_E/../../../../src/transports/fetch.ts","webpack://_N_E/../../../../src/transports/xhr.ts","webpack://_N_E/../../../src/sdk.ts","webpack://_N_E/../../../src/errors.ts","webpack://_N_E/../../../src/hubextensions.ts","webpack://_N_E/../../../src/idletransaction.ts","webpack://_N_E/../../src/tracing.ts","webpack://_N_E/../../src/baggage.ts","webpack://_N_E/../../../../src/browser/backgroundtab.ts","webpack://_N_E/../../../../../../src/browser/web-vitals/lib/bindReporter.ts","webpack://_N_E/../../../../../../src/browser/web-vitals/lib/generateUniqueID.ts","webpack://_N_E/../../../../../../src/browser/web-vitals/lib/observe.ts","webpack://_N_E/../../../../../../src/browser/web-vitals/lib/onHidden.ts","webpack://_N_E/../../../../../../src/browser/web-vitals/lib/getVisibilityWatcher.ts","webpack://_N_E/../../../../../src/browser/web-vitals/getLCP.ts","webpack://_N_E/../../node_modules/next/dist/compiled/@babel/runtime/helpers/esm/objectWithoutProperties.js","webpack://_N_E/../../node_modules/next/dist/compiled/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","webpack://_N_E/../../../../../src/browser/metrics/utils.ts","webpack://_N_E/../../../../../src/browser/metrics/index.ts","webpack://_N_E/../../../../../src/browser/web-vitals/getCLS.ts","webpack://_N_E/../../../../../src/browser/web-vitals/getFID.ts","webpack://_N_E/../../../../src/browser/request.ts","webpack://_N_E/../../../../src/browser/router.ts","webpack://_N_E/../../../../src/browser/browsertracing.ts","webpack://_N_E/../../../src/buildPolyfills/_optionalChain.ts","webpack://_N_E/../../../src/index.ts","webpack://_N_E/../../../src/utils.ts","webpack://_N_E/../../../src/buildPolyfills/_nullishCoalesce.ts","webpack://_N_E/../../src/instrument.ts","webpack://_N_E/../../src/stacktrace.ts","webpack://_N_E/../../src/supports.ts","webpack://_N_E/../../node_modules/next/dist/compiled/use-subscription/index.js","webpack://_N_E/../../node_modules/next/dynamic.js","webpack://_N_E/../../node_modules/next/dist/shared/lib/dynamic.js","webpack://_N_E/../../node_modules/next/dist/shared/lib/loadable-context.js","webpack://_N_E/../../node_modules/next/dist/shared/lib/loadable.js"],"sourcesContent":["import { addGlobalEventProcessor, getCurrentHub } from '@sentry/hub';\nimport { Integration, Options } from '@sentry/types';\nimport { arrayify, logger } from '@sentry/utils';\n\ndeclare module '@sentry/types' {\n interface Integration {\n isDefaultInstance?: boolean;\n }\n}\n\nexport const installedIntegrations: string[] = [];\n\n/** Map of integrations assigned to a client */\nexport type IntegrationIndex = {\n [key: string]: Integration;\n};\n\n/**\n * Remove duplicates from the given array, preferring the last instance of any duplicate. Not guaranteed to\n * preseve the order of integrations in the array.\n *\n * @private\n */\nfunction filterDuplicates(integrations: Integration[]): Integration[] {\n const integrationsByName: { [key: string]: Integration } = {};\n\n integrations.forEach(currentInstance => {\n const { name } = currentInstance;\n\n const existingInstance = integrationsByName[name];\n\n // We want integrations later in the array to overwrite earlier ones of the same type, except that we never want a\n // default instance to overwrite an existing user instance\n if (existingInstance && !existingInstance.isDefaultInstance && currentInstance.isDefaultInstance) {\n return;\n }\n\n integrationsByName[name] = currentInstance;\n });\n\n return Object.values(integrationsByName);\n}\n\n/** Gets integrations to install */\nexport function getIntegrationsToSetup(options: Options): Integration[] {\n const defaultIntegrations = options.defaultIntegrations || [];\n const userIntegrations = options.integrations;\n\n // We flag default instances, so that later we can tell them apart from any user-created instances of the same class\n defaultIntegrations.forEach(integration => {\n integration.isDefaultInstance = true;\n });\n\n let integrations: Integration[];\n\n if (Array.isArray(userIntegrations)) {\n integrations = [...defaultIntegrations, ...userIntegrations];\n } else if (typeof userIntegrations === 'function') {\n integrations = arrayify(userIntegrations(defaultIntegrations));\n } else {\n integrations = defaultIntegrations;\n }\n\n const finalIntegrations = filterDuplicates(integrations);\n\n // The `Debug` integration prints copies of the `event` and `hint` which will be passed to `beforeSend`. It therefore\n // has to run after all other integrations, so that the changes of all event processors will be reflected in the\n // printed values. For lack of a more elegant way to guarantee that, we therefore locate it and, assuming it exists,\n // pop it out of its current spot and shove it onto the end of the array.\n const debugIndex = finalIntegrations.findIndex(integration => integration.name === 'Debug');\n if (debugIndex !== -1) {\n const [debugInstance] = finalIntegrations.splice(debugIndex, 1);\n finalIntegrations.push(debugInstance);\n }\n\n return finalIntegrations;\n}\n\n/**\n * Given a list of integration instances this installs them all. When `withDefaults` is set to `true` then all default\n * integrations are added unless they were already provided before.\n * @param integrations array of integration instances\n * @param withDefault should enable default integrations\n */\nexport function setupIntegrations(integrations: Integration[]): IntegrationIndex {\n const integrationIndex: IntegrationIndex = {};\n\n integrations.forEach(integration => {\n integrationIndex[integration.name] = integration;\n\n if (installedIntegrations.indexOf(integration.name) === -1) {\n integration.setupOnce(addGlobalEventProcessor, getCurrentHub);\n installedIntegrations.push(integration.name);\n __DEBUG_BUILD__ && logger.log(`Integration installed: ${integration.name}`);\n }\n });\n\n return integrationIndex;\n}\n","import { getCurrentHub } from '@sentry/hub';\nimport { Client, ClientOptions } from '@sentry/types';\nimport { logger } from '@sentry/utils';\n\n/** A class object that can instantiate Client objects. */\nexport type ClientClass = new (options: O) => F;\n\n/**\n * Internal function to create a new SDK client instance. The client is\n * installed and then bound to the current scope.\n *\n * @param clientClass The client class to instantiate.\n * @param options Options to pass to the client.\n */\nexport function initAndBind(\n clientClass: ClientClass,\n options: O,\n): void {\n if (options.debug === true) {\n if (__DEBUG_BUILD__) {\n logger.enable();\n } else {\n // use `console.warn` rather than `logger.warn` since by non-debug bundles have all `logger.x` statements stripped\n // eslint-disable-next-line no-console\n console.warn('[Sentry] Cannot initialize SDK with `debug` option using a non-debug bundle.');\n }\n }\n const hub = getCurrentHub();\n const scope = hub.getScope();\n if (scope) {\n scope.update(options.initialScope);\n }\n\n const client = new clientClass(options);\n hub.bindClient(client);\n}\n","import { Event, EventProcessor, Hub, Integration, StackFrame } from '@sentry/types';\nimport { getEventDescription, isMatchingPattern, logger } from '@sentry/utils';\n\n// \"Script error.\" is hard coded into browsers for errors that it can't read.\n// this is the result of a script being pulled in from an external domain and CORS.\nconst DEFAULT_IGNORE_ERRORS = [/^Script error\\.?$/, /^Javascript error: Script error\\.? on line 0$/];\n\n/** Options for the InboundFilters integration */\nexport interface InboundFiltersOptions {\n allowUrls: Array;\n denyUrls: Array;\n ignoreErrors: Array;\n ignoreInternal: boolean;\n}\n\n/** Inbound filters configurable by the user */\nexport class InboundFilters implements Integration {\n /**\n * @inheritDoc\n */\n public static id: string = 'InboundFilters';\n\n /**\n * @inheritDoc\n */\n public name: string = InboundFilters.id;\n\n public constructor(private readonly _options: Partial = {}) {}\n\n /**\n * @inheritDoc\n */\n public setupOnce(addGlobalEventProcessor: (processor: EventProcessor) => void, getCurrentHub: () => Hub): void {\n const eventProcess: EventProcessor = (event: Event) => {\n const hub = getCurrentHub();\n if (hub) {\n const self = hub.getIntegration(InboundFilters);\n if (self) {\n const client = hub.getClient();\n const clientOptions = client ? client.getOptions() : {};\n const options = _mergeOptions(self._options, clientOptions);\n return _shouldDropEvent(event, options) ? null : event;\n }\n }\n return event;\n };\n\n eventProcess.id = this.name;\n addGlobalEventProcessor(eventProcess);\n }\n}\n\n/** JSDoc */\nexport function _mergeOptions(\n internalOptions: Partial = {},\n clientOptions: Partial = {},\n): Partial {\n return {\n allowUrls: [...(internalOptions.allowUrls || []), ...(clientOptions.allowUrls || [])],\n denyUrls: [...(internalOptions.denyUrls || []), ...(clientOptions.denyUrls || [])],\n ignoreErrors: [\n ...(internalOptions.ignoreErrors || []),\n ...(clientOptions.ignoreErrors || []),\n ...DEFAULT_IGNORE_ERRORS,\n ],\n ignoreInternal: internalOptions.ignoreInternal !== undefined ? internalOptions.ignoreInternal : true,\n };\n}\n\n/** JSDoc */\nexport function _shouldDropEvent(event: Event, options: Partial): boolean {\n if (options.ignoreInternal && _isSentryError(event)) {\n __DEBUG_BUILD__ &&\n logger.warn(`Event dropped due to being internal Sentry Error.\\nEvent: ${getEventDescription(event)}`);\n return true;\n }\n if (_isIgnoredError(event, options.ignoreErrors)) {\n __DEBUG_BUILD__ &&\n logger.warn(\n `Event dropped due to being matched by \\`ignoreErrors\\` option.\\nEvent: ${getEventDescription(event)}`,\n );\n return true;\n }\n if (_isDeniedUrl(event, options.denyUrls)) {\n __DEBUG_BUILD__ &&\n logger.warn(\n `Event dropped due to being matched by \\`denyUrls\\` option.\\nEvent: ${getEventDescription(\n event,\n )}.\\nUrl: ${_getEventFilterUrl(event)}`,\n );\n return true;\n }\n if (!_isAllowedUrl(event, options.allowUrls)) {\n __DEBUG_BUILD__ &&\n logger.warn(\n `Event dropped due to not being matched by \\`allowUrls\\` option.\\nEvent: ${getEventDescription(\n event,\n )}.\\nUrl: ${_getEventFilterUrl(event)}`,\n );\n return true;\n }\n return false;\n}\n\nfunction _isIgnoredError(event: Event, ignoreErrors?: Array): boolean {\n if (!ignoreErrors || !ignoreErrors.length) {\n return false;\n }\n\n return _getPossibleEventMessages(event).some(message =>\n ignoreErrors.some(pattern => isMatchingPattern(message, pattern)),\n );\n}\n\nfunction _isDeniedUrl(event: Event, denyUrls?: Array): boolean {\n // TODO: Use Glob instead?\n if (!denyUrls || !denyUrls.length) {\n return false;\n }\n const url = _getEventFilterUrl(event);\n return !url ? false : denyUrls.some(pattern => isMatchingPattern(url, pattern));\n}\n\nfunction _isAllowedUrl(event: Event, allowUrls?: Array): boolean {\n // TODO: Use Glob instead?\n if (!allowUrls || !allowUrls.length) {\n return true;\n }\n const url = _getEventFilterUrl(event);\n return !url ? true : allowUrls.some(pattern => isMatchingPattern(url, pattern));\n}\n\nfunction _getPossibleEventMessages(event: Event): string[] {\n if (event.message) {\n return [event.message];\n }\n if (event.exception) {\n try {\n const { type = '', value = '' } = (event.exception.values && event.exception.values[0]) || {};\n return [`${value}`, `${type}: ${value}`];\n } catch (oO) {\n __DEBUG_BUILD__ && logger.error(`Cannot extract message for event ${getEventDescription(event)}`);\n return [];\n }\n }\n return [];\n}\n\nfunction _isSentryError(event: Event): boolean {\n try {\n // @ts-ignore can't be a sentry error if undefined\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return event.exception.values[0].type === 'SentryError';\n } catch (e) {\n // ignore\n }\n return false;\n}\n\nfunction _getLastValidUrl(frames: StackFrame[] = []): string | null {\n for (let i = frames.length - 1; i >= 0; i--) {\n const frame = frames[i];\n\n if (frame && frame.filename !== '' && frame.filename !== '[native code]') {\n return frame.filename || null;\n }\n }\n\n return null;\n}\n\nfunction _getEventFilterUrl(event: Event): string | null {\n try {\n let frames;\n try {\n // @ts-ignore we only care about frames if the whole thing here is defined\n frames = event.exception.values[0].stacktrace.frames;\n } catch (e) {\n // ignore\n }\n return frames ? _getLastValidUrl(frames) : null;\n } catch (oO) {\n __DEBUG_BUILD__ && logger.error(`Cannot extract url for event ${getEventDescription(event)}`);\n return null;\n }\n}\n","import { Integration, WrappedFunction } from '@sentry/types';\nimport { getOriginalFunction } from '@sentry/utils';\n\nlet originalFunctionToString: () => void;\n\n/** Patch toString calls to return proper name for wrapped functions */\nexport class FunctionToString implements Integration {\n /**\n * @inheritDoc\n */\n public static id: string = 'FunctionToString';\n\n /**\n * @inheritDoc\n */\n public name: string = FunctionToString.id;\n\n /**\n * @inheritDoc\n */\n public setupOnce(): void {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n originalFunctionToString = Function.prototype.toString;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Function.prototype.toString = function (this: WrappedFunction, ...args: any[]): string {\n const context = getOriginalFunction(this) || this;\n return originalFunctionToString.apply(context, args);\n };\n }\n}\n","import type { ConsoleLevel } from './logger';\n\n/** An error emitted by Sentry SDKs and related utilities. */\nexport class SentryError extends Error {\n /** Display name of this error instance. */\n public name: string;\n\n public logLevel: ConsoleLevel;\n\n public constructor(public message: string, logLevel: ConsoleLevel = 'warn') {\n super(message);\n\n this.name = new.target.prototype.constructor.name;\n // This sets the prototype to be `Error`, not `SentryError`. It's unclear why we do this, but commenting this line\n // out causes various (seemingly totally unrelated) playwright tests consistently time out. FYI, this makes\n // instances of `SentryError` fail `obj instanceof SentryError` checks.\n Object.setPrototypeOf(this, new.target.prototype);\n this.logLevel = logLevel;\n }\n}\n","import { DsnComponents, DsnLike, DsnProtocol } from '@sentry/types';\n\nimport { SentryError } from './error';\n\n/** Regular expression used to parse a Dsn. */\nconst DSN_REGEX = /^(?:(\\w+):)\\/\\/(?:(\\w+)(?::(\\w+))?@)([\\w.-]+)(?::(\\d+))?\\/(.+)/;\n\nfunction isValidProtocol(protocol?: string): protocol is DsnProtocol {\n return protocol === 'http' || protocol === 'https';\n}\n\n/**\n * Renders the string representation of this Dsn.\n *\n * By default, this will render the public representation without the password\n * component. To get the deprecated private representation, set `withPassword`\n * to true.\n *\n * @param withPassword When set to true, the password will be included.\n */\nexport function dsnToString(dsn: DsnComponents, withPassword: boolean = false): string {\n const { host, path, pass, port, projectId, protocol, publicKey } = dsn;\n return (\n `${protocol}://${publicKey}${withPassword && pass ? `:${pass}` : ''}` +\n `@${host}${port ? `:${port}` : ''}/${path ? `${path}/` : path}${projectId}`\n );\n}\n\n/**\n * Parses a Dsn from a given string.\n *\n * @param str A Dsn as string\n * @returns Dsn as DsnComponents\n */\nexport function dsnFromString(str: string): DsnComponents {\n const match = DSN_REGEX.exec(str);\n\n if (!match) {\n throw new SentryError(`Invalid Sentry Dsn: ${str}`);\n }\n\n const [protocol, publicKey, pass = '', host, port = '', lastPath] = match.slice(1);\n let path = '';\n let projectId = lastPath;\n\n const split = projectId.split('/');\n if (split.length > 1) {\n path = split.slice(0, -1).join('/');\n projectId = split.pop() as string;\n }\n\n if (projectId) {\n const projectMatch = projectId.match(/^\\d+/);\n if (projectMatch) {\n projectId = projectMatch[0];\n }\n }\n\n return dsnFromComponents({ host, pass, path, projectId, port, protocol: protocol as DsnProtocol, publicKey });\n}\n\nfunction dsnFromComponents(components: DsnComponents): DsnComponents {\n return {\n protocol: components.protocol,\n publicKey: components.publicKey || '',\n pass: components.pass || '',\n host: components.host,\n port: components.port || '',\n path: components.path || '',\n projectId: components.projectId,\n };\n}\n\nfunction validateDsn(dsn: DsnComponents): boolean | void {\n if (!__DEBUG_BUILD__) {\n return;\n }\n\n const { port, projectId, protocol } = dsn;\n\n const requiredComponents: ReadonlyArray = ['protocol', 'publicKey', 'host', 'projectId'];\n requiredComponents.forEach(component => {\n if (!dsn[component]) {\n throw new SentryError(`Invalid Sentry Dsn: ${component} missing`);\n }\n });\n\n if (!projectId.match(/^\\d+$/)) {\n throw new SentryError(`Invalid Sentry Dsn: Invalid projectId ${projectId}`);\n }\n\n if (!isValidProtocol(protocol)) {\n throw new SentryError(`Invalid Sentry Dsn: Invalid protocol ${protocol}`);\n }\n\n if (port && isNaN(parseInt(port, 10))) {\n throw new SentryError(`Invalid Sentry Dsn: Invalid port ${port}`);\n }\n\n return true;\n}\n\n/** The Sentry Dsn, identifying a Sentry instance and project. */\nexport function makeDsn(from: DsnLike): DsnComponents {\n const components = typeof from === 'string' ? dsnFromString(from) : dsnFromComponents(from);\n validateDsn(components);\n return components;\n}\n","import {\n Attachment,\n AttachmentItem,\n DataCategory,\n Envelope,\n EnvelopeItem,\n EnvelopeItemType,\n TextEncoderInternal,\n} from '@sentry/types';\n\nimport { dropUndefinedKeys } from './object';\n\n/**\n * Creates an envelope.\n * Make sure to always explicitly provide the generic to this function\n * so that the envelope types resolve correctly.\n */\nexport function createEnvelope(headers: E[0], items: E[1] = []): E {\n return [headers, items] as E;\n}\n\n/**\n * Add an item to an envelope.\n * Make sure to always explicitly provide the generic to this function\n * so that the envelope types resolve correctly.\n */\nexport function addItemToEnvelope(envelope: E, newItem: E[1][number]): E {\n const [headers, items] = envelope;\n return [headers, [...items, newItem]] as E;\n}\n\n/**\n * Convenience function to loop through the items and item types of an envelope.\n * (This function was mostly created because working with envelope types is painful at the moment)\n */\nexport function forEachEnvelopeItem(\n envelope: Envelope,\n callback: (envelopeItem: E[1][number], envelopeItemType: E[1][number][0]['type']) => void,\n): void {\n const envelopeItems = envelope[1];\n envelopeItems.forEach((envelopeItem: EnvelopeItem) => {\n const envelopeItemType = envelopeItem[0].type;\n callback(envelopeItem, envelopeItemType);\n });\n}\n\nfunction encodeUTF8(input: string, textEncoder?: TextEncoderInternal): Uint8Array {\n const utf8 = textEncoder || new TextEncoder();\n return utf8.encode(input);\n}\n\n/**\n * Serializes an envelope.\n */\nexport function serializeEnvelope(envelope: Envelope, textEncoder?: TextEncoderInternal): string | Uint8Array {\n const [envHeaders, items] = envelope;\n\n // Initially we construct our envelope as a string and only convert to binary chunks if we encounter binary data\n let parts: string | Uint8Array[] = JSON.stringify(envHeaders);\n\n function append(next: string | Uint8Array): void {\n if (typeof parts === 'string') {\n parts = typeof next === 'string' ? parts + next : [encodeUTF8(parts, textEncoder), next];\n } else {\n parts.push(typeof next === 'string' ? encodeUTF8(next, textEncoder) : next);\n }\n }\n\n for (const item of items) {\n const [itemHeaders, payload] = item as typeof items[number];\n append(`\\n${JSON.stringify(itemHeaders)}\\n`);\n append(typeof payload === 'string' || payload instanceof Uint8Array ? payload : JSON.stringify(payload));\n }\n\n return typeof parts === 'string' ? parts : concatBuffers(parts);\n}\n\nfunction concatBuffers(buffers: Uint8Array[]): Uint8Array {\n const totalLength = buffers.reduce((acc, buf) => acc + buf.length, 0);\n\n const merged = new Uint8Array(totalLength);\n let offset = 0;\n for (const buffer of buffers) {\n merged.set(buffer, offset);\n offset += buffer.length;\n }\n\n return merged;\n}\n\n/**\n * Creates attachment envelope items\n */\nexport function createAttachmentEnvelopeItem(\n attachment: Attachment,\n textEncoder?: TextEncoderInternal,\n): AttachmentItem {\n const buffer = typeof attachment.data === 'string' ? encodeUTF8(attachment.data, textEncoder) : attachment.data;\n\n return [\n dropUndefinedKeys({\n type: 'attachment',\n length: buffer.length,\n filename: attachment.filename,\n content_type: attachment.contentType,\n attachment_type: attachment.attachmentType,\n }),\n buffer,\n ];\n}\n\nconst ITEM_TYPE_TO_DATA_CATEGORY_MAP: Record = {\n session: 'session',\n sessions: 'session',\n attachment: 'attachment',\n transaction: 'transaction',\n event: 'error',\n client_report: 'internal',\n user_report: 'default',\n};\n\n/**\n * Maps the type of an envelope item to a data category.\n */\nexport function envelopeItemTypeToDataCategory(type: EnvelopeItemType): DataCategory {\n return ITEM_TYPE_TO_DATA_CATEGORY_MAP[type];\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport type MemoFunc = [\n // memoize\n (obj: any) => boolean,\n // unmemoize\n (obj: any) => void,\n];\n\n/**\n * Helper to decycle json objects\n */\nexport function memoBuilder(): MemoFunc {\n const hasWeakSet = typeof WeakSet === 'function';\n const inner: any = hasWeakSet ? new WeakSet() : [];\n function memoize(obj: any): boolean {\n if (hasWeakSet) {\n if (inner.has(obj)) {\n return true;\n }\n inner.add(obj);\n return false;\n }\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let i = 0; i < inner.length; i++) {\n const value = inner[i];\n if (value === obj) {\n return true;\n }\n }\n inner.push(obj);\n return false;\n }\n\n function unmemoize(obj: any): void {\n if (hasWeakSet) {\n inner.delete(obj);\n } else {\n for (let i = 0; i < inner.length; i++) {\n if (inner[i] === obj) {\n inner.splice(i, 1);\n break;\n }\n }\n }\n }\n return [memoize, unmemoize];\n}\n","import { Primitive } from '@sentry/types';\n\nimport { isNaN, isSyntheticEvent } from './is';\nimport { memoBuilder, MemoFunc } from './memo';\nimport { convertToPlainObject } from './object';\nimport { getFunctionName } from './stacktrace';\n\ntype Prototype = { constructor: (...args: unknown[]) => unknown };\n// This is a hack to placate TS, relying on the fact that technically, arrays are objects with integer keys. Normally we\n// think of those keys as actual numbers, but `arr['0']` turns out to work just as well as `arr[0]`, and doing it this\n// way lets us use a single type in the places where behave as if we are only dealing with objects, even if some of them\n// might be arrays.\ntype ObjOrArray = { [key: string]: T };\n\n/**\n * Recursively normalizes the given object.\n *\n * - Creates a copy to prevent original input mutation\n * - Skips non-enumerable properties\n * - When stringifying, calls `toJSON` if implemented\n * - Removes circular references\n * - Translates non-serializable values (`undefined`/`NaN`/functions) to serializable format\n * - Translates known global objects/classes to a string representations\n * - Takes care of `Error` object serialization\n * - Optionally limits depth of final output\n * - Optionally limits number of properties/elements included in any single object/array\n *\n * @param input The object to be normalized.\n * @param depth The max depth to which to normalize the object. (Anything deeper stringified whole.)\n * @param maxProperties The max number of elements or properties to be included in any single array or\n * object in the normallized output.\n * @returns A normalized version of the object, or `\"**non-serializable**\"` if any errors are thrown during normalization.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function normalize(input: unknown, depth: number = +Infinity, maxProperties: number = +Infinity): any {\n try {\n // since we're at the outermost level, we don't provide a key\n return visit('', input, depth, maxProperties);\n } catch (err) {\n return { ERROR: `**non-serializable** (${err})` };\n }\n}\n\n/** JSDoc */\nexport function normalizeToSize(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n object: { [key: string]: any },\n // Default Node.js REPL depth\n depth: number = 3,\n // 100kB, as 200kB is max payload size, so half sounds reasonable\n maxSize: number = 100 * 1024,\n): T {\n const normalized = normalize(object, depth);\n\n if (jsonSize(normalized) > maxSize) {\n return normalizeToSize(object, depth - 1, maxSize);\n }\n\n return normalized as T;\n}\n\n/**\n * Visits a node to perform normalization on it\n *\n * @param key The key corresponding to the given node\n * @param value The node to be visited\n * @param depth Optional number indicating the maximum recursion depth\n * @param maxProperties Optional maximum number of properties/elements included in any single object/array\n * @param memo Optional Memo class handling decycling\n */\nfunction visit(\n key: string,\n value: unknown,\n depth: number = +Infinity,\n maxProperties: number = +Infinity,\n memo: MemoFunc = memoBuilder(),\n): Primitive | ObjOrArray {\n const [memoize, unmemoize] = memo;\n\n // Get the simple cases out of the way first\n if (value === null || (['number', 'boolean', 'string'].includes(typeof value) && !isNaN(value))) {\n return value as Primitive;\n }\n\n const stringified = stringifyValue(key, value);\n\n // Anything we could potentially dig into more (objects or arrays) will have come back as `\"[object XXXX]\"`.\n // Everything else will have already been serialized, so if we don't see that pattern, we're done.\n if (!stringified.startsWith('[object ')) {\n return stringified;\n }\n\n // From here on, we can assert that `value` is either an object or an array.\n\n // Do not normalize objects that we know have already been normalized. As a general rule, the\n // \"__sentry_skip_normalization__\" property should only be used sparingly and only should only be set on objects that\n // have already been normalized.\n if ((value as ObjOrArray)['__sentry_skip_normalization__']) {\n return value as ObjOrArray;\n }\n\n // We're also done if we've reached the max depth\n if (depth === 0) {\n // At this point we know `serialized` is a string of the form `\"[object XXXX]\"`. Clean it up so it's just `\"[XXXX]\"`.\n return stringified.replace('object ', '');\n }\n\n // If we've already visited this branch, bail out, as it's circular reference. If not, note that we're seeing it now.\n if (memoize(value)) {\n return '[Circular ~]';\n }\n\n // If the value has a `toJSON` method, we call it to extract more information\n const valueWithToJSON = value as unknown & { toJSON?: () => unknown };\n if (valueWithToJSON && typeof valueWithToJSON.toJSON === 'function') {\n try {\n const jsonValue = valueWithToJSON.toJSON();\n // We need to normalize the return value of `.toJSON()` in case it has circular references\n return visit('', jsonValue, depth - 1, maxProperties, memo);\n } catch (err) {\n // pass (The built-in `toJSON` failed, but we can still try to do it ourselves)\n }\n }\n\n // At this point we know we either have an object or an array, we haven't seen it before, and we're going to recurse\n // because we haven't yet reached the max depth. Create an accumulator to hold the results of visiting each\n // property/entry, and keep track of the number of items we add to it.\n const normalized = (Array.isArray(value) ? [] : {}) as ObjOrArray;\n let numAdded = 0;\n\n // Before we begin, convert`Error` and`Event` instances into plain objects, since some of each of their relevant\n // properties are non-enumerable and otherwise would get missed.\n const visitable = convertToPlainObject(value as ObjOrArray);\n\n for (const visitKey in visitable) {\n // Avoid iterating over fields in the prototype if they've somehow been exposed to enumeration.\n if (!Object.prototype.hasOwnProperty.call(visitable, visitKey)) {\n continue;\n }\n\n if (numAdded >= maxProperties) {\n normalized[visitKey] = '[MaxProperties ~]';\n break;\n }\n\n // Recursively visit all the child nodes\n const visitValue = visitable[visitKey];\n normalized[visitKey] = visit(visitKey, visitValue, depth - 1, maxProperties, memo);\n\n numAdded += 1;\n }\n\n // Once we've visited all the branches, remove the parent from memo storage\n unmemoize(value);\n\n // Return accumulated values\n return normalized;\n}\n\n// TODO remove this in v7 (this means the method will no longer be exported, under any name)\nexport { visit as walk };\n\n/**\n * Stringify the given value. Handles various known special values and types.\n *\n * Not meant to be used on simple primitives which already have a string representation, as it will, for example, turn\n * the number 1231 into \"[Object Number]\", nor on `null`, as it will throw.\n *\n * @param value The value to stringify\n * @returns A stringified representation of the given value\n */\nfunction stringifyValue(\n key: unknown,\n // this type is a tiny bit of a cheat, since this function does handle NaN (which is technically a number), but for\n // our internal use, it'll do\n value: Exclude,\n): string {\n try {\n if (key === 'domain' && value && typeof value === 'object' && (value as { _events: unknown })._events) {\n return '[Domain]';\n }\n\n if (key === 'domainEmitter') {\n return '[DomainEmitter]';\n }\n\n // It's safe to use `global`, `window`, and `document` here in this manner, as we are asserting using `typeof` first\n // which won't throw if they are not present.\n\n if (typeof global !== 'undefined' && value === global) {\n return '[Global]';\n }\n\n // eslint-disable-next-line no-restricted-globals\n if (typeof window !== 'undefined' && value === window) {\n return '[Window]';\n }\n\n // eslint-disable-next-line no-restricted-globals\n if (typeof document !== 'undefined' && value === document) {\n return '[Document]';\n }\n\n // React's SyntheticEvent thingy\n if (isSyntheticEvent(value)) {\n return '[SyntheticEvent]';\n }\n\n if (typeof value === 'number' && value !== value) {\n return '[NaN]';\n }\n\n // this catches `undefined` (but not `null`, which is a primitive and can be serialized on its own)\n if (value === void 0) {\n return '[undefined]';\n }\n\n if (typeof value === 'function') {\n return `[Function: ${getFunctionName(value)}]`;\n }\n\n if (typeof value === 'symbol') {\n return `[${String(value)}]`;\n }\n\n // stringified BigInts are indistinguishable from regular numbers, so we need to label them to avoid confusion\n if (typeof value === 'bigint') {\n return `[BigInt: ${String(value)}]`;\n }\n\n // Now that we've knocked out all the special cases and the primitives, all we have left are objects. Simply casting\n // them to strings means that instances of classes which haven't defined their `toStringTag` will just come out as\n // `\"[object Object]\"`. If we instead look at the constructor's name (which is the same as the name of the class),\n // we can make sure that only plain objects come out that way.\n return `[object ${(Object.getPrototypeOf(value) as Prototype).constructor.name}]`;\n } catch (err) {\n return `**non-serializable** (${err})`;\n }\n}\n\n/** Calculates bytes size of input string */\nfunction utf8Length(value: string): number {\n // eslint-disable-next-line no-bitwise\n return ~-encodeURI(value).split(/%..|./).length;\n}\n\n/** Calculates bytes size of input object */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction jsonSize(value: any): number {\n return utf8Length(JSON.stringify(value));\n}\n","import { ClientOptions, DsnComponents, DsnLike, SdkInfo } from '@sentry/types';\nimport { dsnToString, makeDsn, urlEncode } from '@sentry/utils';\n\nconst SENTRY_API_VERSION = '7';\n\n/** Returns the prefix to construct Sentry ingestion API endpoints. */\nfunction getBaseApiEndpoint(dsn: DsnComponents): string {\n const protocol = dsn.protocol ? `${dsn.protocol}:` : '';\n const port = dsn.port ? `:${dsn.port}` : '';\n return `${protocol}//${dsn.host}${port}${dsn.path ? `/${dsn.path}` : ''}/api/`;\n}\n\n/** Returns the ingest API endpoint for target. */\nfunction _getIngestEndpoint(dsn: DsnComponents): string {\n return `${getBaseApiEndpoint(dsn)}${dsn.projectId}/envelope/`;\n}\n\n/** Returns a URL-encoded string with auth config suitable for a query string. */\nfunction _encodedAuth(dsn: DsnComponents, sdkInfo: SdkInfo | undefined): string {\n return urlEncode({\n // We send only the minimum set of required information. See\n // https://github.com/getsentry/sentry-javascript/issues/2572.\n sentry_key: dsn.publicKey,\n sentry_version: SENTRY_API_VERSION,\n ...(sdkInfo && { sentry_client: `${sdkInfo.name}/${sdkInfo.version}` }),\n });\n}\n\n/**\n * Returns the envelope endpoint URL with auth in the query string.\n *\n * Sending auth as part of the query string and not as custom HTTP headers avoids CORS preflight requests.\n */\nexport function getEnvelopeEndpointWithUrlEncodedAuth(\n dsn: DsnComponents,\n // TODO (v8): Remove `tunnelOrOptions` in favor of `options`, and use the substitute code below\n // options: ClientOptions = {} as ClientOptions,\n tunnelOrOptions: string | ClientOptions = {} as ClientOptions,\n): string {\n // TODO (v8): Use this code instead\n // const { tunnel, _metadata = {} } = options;\n // return tunnel ? tunnel : `${_getIngestEndpoint(dsn)}?${_encodedAuth(dsn, _metadata.sdk)}`;\n\n const tunnel = typeof tunnelOrOptions === 'string' ? tunnelOrOptions : tunnelOrOptions.tunnel;\n const sdkInfo =\n typeof tunnelOrOptions === 'string' || !tunnelOrOptions._metadata ? undefined : tunnelOrOptions._metadata.sdk;\n\n return tunnel ? tunnel : `${_getIngestEndpoint(dsn)}?${_encodedAuth(dsn, sdkInfo)}`;\n}\n\n/** Returns the url to the report dialog endpoint. */\nexport function getReportDialogEndpoint(\n dsnLike: DsnLike,\n dialogOptions: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any;\n user?: { name?: string; email?: string };\n },\n): string {\n const dsn = makeDsn(dsnLike);\n const endpoint = `${getBaseApiEndpoint(dsn)}embed/error-page/`;\n\n let encodedOptions = `dsn=${dsnToString(dsn)}`;\n for (const key in dialogOptions) {\n if (key === 'dsn') {\n continue;\n }\n\n if (key === 'user') {\n const user = dialogOptions.user;\n if (!user) {\n continue;\n }\n if (user.name) {\n encodedOptions += `&name=${encodeURIComponent(user.name)}`;\n }\n if (user.email) {\n encodedOptions += `&email=${encodeURIComponent(user.email)}`;\n }\n } else {\n encodedOptions += `&${encodeURIComponent(key)}=${encodeURIComponent(dialogOptions[key] as string)}`;\n }\n }\n\n return `${endpoint}?${encodedOptions}`;\n}\n","/* eslint-disable max-lines */\nimport { Scope, updateSession } from '@sentry/hub';\nimport {\n Client,\n ClientOptions,\n DataCategory,\n DsnComponents,\n Envelope,\n Event,\n EventDropReason,\n EventHint,\n Integration,\n IntegrationClass,\n Outcome,\n Session,\n SessionAggregates,\n Severity,\n SeverityLevel,\n Transport,\n} from '@sentry/types';\nimport {\n addItemToEnvelope,\n checkOrSetAlreadyCaught,\n createAttachmentEnvelopeItem,\n dateTimestampInSeconds,\n isPlainObject,\n isPrimitive,\n isThenable,\n logger,\n makeDsn,\n normalize,\n rejectedSyncPromise,\n resolvedSyncPromise,\n SentryError,\n SyncPromise,\n truncate,\n uuid4,\n} from '@sentry/utils';\n\nimport { getEnvelopeEndpointWithUrlEncodedAuth } from './api';\nimport { createEventEnvelope, createSessionEnvelope } from './envelope';\nimport { IntegrationIndex, setupIntegrations } from './integration';\n\nconst ALREADY_SEEN_ERROR = \"Not capturing exception because it's already been captured.\";\n\n/**\n * Base implementation for all JavaScript SDK clients.\n *\n * Call the constructor with the corresponding options\n * specific to the client subclass. To access these options later, use\n * {@link Client.getOptions}.\n *\n * If a Dsn is specified in the options, it will be parsed and stored. Use\n * {@link Client.getDsn} to retrieve the Dsn at any moment. In case the Dsn is\n * invalid, the constructor will throw a {@link SentryException}. Note that\n * without a valid Dsn, the SDK will not send any events to Sentry.\n *\n * Before sending an event, it is passed through\n * {@link BaseClient._prepareEvent} to add SDK information and scope data\n * (breadcrumbs and context). To add more custom information, override this\n * method and extend the resulting prepared event.\n *\n * To issue automatically created events (e.g. via instrumentation), use\n * {@link Client.captureEvent}. It will prepare the event and pass it through\n * the callback lifecycle. To issue auto-breadcrumbs, use\n * {@link Client.addBreadcrumb}.\n *\n * @example\n * class NodeClient extends BaseClient {\n * public constructor(options: NodeOptions) {\n * super(options);\n * }\n *\n * // ...\n * }\n */\nexport abstract class BaseClient implements Client {\n /** Options passed to the SDK. */\n protected readonly _options: O;\n\n /** The client Dsn, if specified in options. Without this Dsn, the SDK will be disabled. */\n protected readonly _dsn?: DsnComponents;\n\n protected readonly _transport?: Transport;\n\n /** Array of set up integrations. */\n protected _integrations: IntegrationIndex = {};\n\n /** Indicates whether this client's integrations have been set up. */\n protected _integrationsInitialized: boolean = false;\n\n /** Number of calls being processed */\n protected _numProcessing: number = 0;\n\n /** Holds flushable */\n private _outcomes: { [key: string]: number } = {};\n\n /**\n * Initializes this client instance.\n *\n * @param options Options for the client.\n */\n protected constructor(options: O) {\n this._options = options;\n if (options.dsn) {\n this._dsn = makeDsn(options.dsn);\n const url = getEnvelopeEndpointWithUrlEncodedAuth(this._dsn, options);\n this._transport = options.transport({\n recordDroppedEvent: this.recordDroppedEvent.bind(this),\n ...options.transportOptions,\n url,\n });\n } else {\n __DEBUG_BUILD__ && logger.warn('No DSN provided, client will not do anything.');\n }\n }\n\n /**\n * @inheritDoc\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\n public captureException(exception: any, hint?: EventHint, scope?: Scope): string | undefined {\n // ensure we haven't captured this very object before\n if (checkOrSetAlreadyCaught(exception)) {\n __DEBUG_BUILD__ && logger.log(ALREADY_SEEN_ERROR);\n return;\n }\n\n let eventId: string | undefined = hint && hint.event_id;\n\n this._process(\n this.eventFromException(exception, hint)\n .then(event => this._captureEvent(event, hint, scope))\n .then(result => {\n eventId = result;\n }),\n );\n\n return eventId;\n }\n\n /**\n * @inheritDoc\n */\n public captureMessage(\n message: string,\n // eslint-disable-next-line deprecation/deprecation\n level?: Severity | SeverityLevel,\n hint?: EventHint,\n scope?: Scope,\n ): string | undefined {\n let eventId: string | undefined = hint && hint.event_id;\n\n const promisedEvent = isPrimitive(message)\n ? this.eventFromMessage(String(message), level, hint)\n : this.eventFromException(message, hint);\n\n this._process(\n promisedEvent\n .then(event => this._captureEvent(event, hint, scope))\n .then(result => {\n eventId = result;\n }),\n );\n\n return eventId;\n }\n\n /**\n * @inheritDoc\n */\n public captureEvent(event: Event, hint?: EventHint, scope?: Scope): string | undefined {\n // ensure we haven't captured this very object before\n if (hint && hint.originalException && checkOrSetAlreadyCaught(hint.originalException)) {\n __DEBUG_BUILD__ && logger.log(ALREADY_SEEN_ERROR);\n return;\n }\n\n let eventId: string | undefined = hint && hint.event_id;\n\n this._process(\n this._captureEvent(event, hint, scope).then(result => {\n eventId = result;\n }),\n );\n\n return eventId;\n }\n\n /**\n * @inheritDoc\n */\n public captureSession(session: Session): void {\n if (!this._isEnabled()) {\n __DEBUG_BUILD__ && logger.warn('SDK not enabled, will not capture session.');\n return;\n }\n\n if (!(typeof session.release === 'string')) {\n __DEBUG_BUILD__ && logger.warn('Discarded session because of missing or non-string release');\n } else {\n this.sendSession(session);\n // After sending, we set init false to indicate it's not the first occurrence\n updateSession(session, { init: false });\n }\n }\n\n /**\n * @inheritDoc\n */\n public getDsn(): DsnComponents | undefined {\n return this._dsn;\n }\n\n /**\n * @inheritDoc\n */\n public getOptions(): O {\n return this._options;\n }\n\n /**\n * @inheritDoc\n */\n public getTransport(): Transport | undefined {\n return this._transport;\n }\n\n /**\n * @inheritDoc\n */\n public flush(timeout?: number): PromiseLike {\n const transport = this._transport;\n if (transport) {\n return this._isClientDoneProcessing(timeout).then(clientFinished => {\n return transport.flush(timeout).then(transportFlushed => clientFinished && transportFlushed);\n });\n } else {\n return resolvedSyncPromise(true);\n }\n }\n\n /**\n * @inheritDoc\n */\n public close(timeout?: number): PromiseLike {\n return this.flush(timeout).then(result => {\n this.getOptions().enabled = false;\n return result;\n });\n }\n\n /**\n * Sets up the integrations\n */\n public setupIntegrations(): void {\n if (this._isEnabled() && !this._integrationsInitialized) {\n this._integrations = setupIntegrations(this._options.integrations);\n this._integrationsInitialized = true;\n }\n }\n\n /**\n * Gets an installed integration by its `id`.\n *\n * @returns The installed integration or `undefined` if no integration with that `id` was installed.\n */\n public getIntegrationById(integrationId: string): Integration | undefined {\n return this._integrations[integrationId];\n }\n\n /**\n * @inheritDoc\n */\n public getIntegration(integration: IntegrationClass): T | null {\n try {\n return (this._integrations[integration.id] as T) || null;\n } catch (_oO) {\n __DEBUG_BUILD__ && logger.warn(`Cannot retrieve integration ${integration.id} from the current Client`);\n return null;\n }\n }\n\n /**\n * @inheritDoc\n */\n public sendEvent(event: Event, hint: EventHint = {}): void {\n if (this._dsn) {\n let env = createEventEnvelope(event, this._dsn, this._options._metadata, this._options.tunnel);\n\n for (const attachment of hint.attachments || []) {\n env = addItemToEnvelope(\n env,\n createAttachmentEnvelopeItem(\n attachment,\n this._options.transportOptions && this._options.transportOptions.textEncoder,\n ),\n );\n }\n\n this._sendEnvelope(env);\n }\n }\n\n /**\n * @inheritDoc\n */\n public sendSession(session: Session | SessionAggregates): void {\n if (this._dsn) {\n const env = createSessionEnvelope(session, this._dsn, this._options._metadata, this._options.tunnel);\n this._sendEnvelope(env);\n }\n }\n\n /**\n * @inheritDoc\n */\n public recordDroppedEvent(reason: EventDropReason, category: DataCategory): void {\n if (this._options.sendClientReports) {\n // We want to track each category (error, transaction, session) separately\n // but still keep the distinction between different type of outcomes.\n // We could use nested maps, but it's much easier to read and type this way.\n // A correct type for map-based implementation if we want to go that route\n // would be `Partial>>>`\n // With typescript 4.1 we could even use template literal types\n const key = `${reason}:${category}`;\n __DEBUG_BUILD__ && logger.log(`Adding outcome: \"${key}\"`);\n\n // The following works because undefined + 1 === NaN and NaN is falsy\n this._outcomes[key] = this._outcomes[key] + 1 || 1;\n }\n }\n\n /** Updates existing session based on the provided event */\n protected _updateSessionFromEvent(session: Session, event: Event): void {\n let crashed = false;\n let errored = false;\n const exceptions = event.exception && event.exception.values;\n\n if (exceptions) {\n errored = true;\n\n for (const ex of exceptions) {\n const mechanism = ex.mechanism;\n if (mechanism && mechanism.handled === false) {\n crashed = true;\n break;\n }\n }\n }\n\n // A session is updated and that session update is sent in only one of the two following scenarios:\n // 1. Session with non terminal status and 0 errors + an error occurred -> Will set error count to 1 and send update\n // 2. Session with non terminal status and 1 error + a crash occurred -> Will set status crashed and send update\n const sessionNonTerminal = session.status === 'ok';\n const shouldUpdateAndSend = (sessionNonTerminal && session.errors === 0) || (sessionNonTerminal && crashed);\n\n if (shouldUpdateAndSend) {\n updateSession(session, {\n ...(crashed && { status: 'crashed' }),\n errors: session.errors || Number(errored || crashed),\n });\n this.captureSession(session);\n }\n }\n\n /**\n * Determine if the client is finished processing. Returns a promise because it will wait `timeout` ms before saying\n * \"no\" (resolving to `false`) in order to give the client a chance to potentially finish first.\n *\n * @param timeout The time, in ms, after which to resolve to `false` if the client is still busy. Passing `0` (or not\n * passing anything) will make the promise wait as long as it takes for processing to finish before resolving to\n * `true`.\n * @returns A promise which will resolve to `true` if processing is already done or finishes before the timeout, and\n * `false` otherwise\n */\n protected _isClientDoneProcessing(timeout?: number): PromiseLike {\n return new SyncPromise(resolve => {\n let ticked: number = 0;\n const tick: number = 1;\n\n const interval = setInterval(() => {\n if (this._numProcessing == 0) {\n clearInterval(interval);\n resolve(true);\n } else {\n ticked += tick;\n if (timeout && ticked >= timeout) {\n clearInterval(interval);\n resolve(false);\n }\n }\n }, tick);\n });\n }\n\n /** Determines whether this SDK is enabled and a valid Dsn is present. */\n protected _isEnabled(): boolean {\n return this.getOptions().enabled !== false && this._dsn !== undefined;\n }\n\n /**\n * Adds common information to events.\n *\n * The information includes release and environment from `options`,\n * breadcrumbs and context (extra, tags and user) from the scope.\n *\n * Information that is already present in the event is never overwritten. For\n * nested objects, such as the context, keys are merged.\n *\n * @param event The original event.\n * @param hint May contain additional information about the original exception.\n * @param scope A scope containing event metadata.\n * @returns A new event with more information.\n */\n protected _prepareEvent(event: Event, hint: EventHint, scope?: Scope): PromiseLike {\n const { normalizeDepth = 3, normalizeMaxBreadth = 1_000 } = this.getOptions();\n const prepared: Event = {\n ...event,\n event_id: event.event_id || hint.event_id || uuid4(),\n timestamp: event.timestamp || dateTimestampInSeconds(),\n };\n\n this._applyClientOptions(prepared);\n this._applyIntegrationsMetadata(prepared);\n\n // If we have scope given to us, use it as the base for further modifications.\n // This allows us to prevent unnecessary copying of data if `captureContext` is not provided.\n let finalScope = scope;\n if (hint.captureContext) {\n finalScope = Scope.clone(finalScope).update(hint.captureContext);\n }\n\n // We prepare the result here with a resolved Event.\n let result = resolvedSyncPromise(prepared);\n\n // This should be the last thing called, since we want that\n // {@link Hub.addEventProcessor} gets the finished prepared event.\n if (finalScope) {\n // Collect attachments from the hint and scope\n const attachments = [...(hint.attachments || []), ...finalScope.getAttachments()];\n\n if (attachments.length) {\n hint.attachments = attachments;\n }\n\n // In case we have a hub we reassign it.\n result = finalScope.applyToEvent(prepared, hint);\n }\n\n return result.then(evt => {\n if (typeof normalizeDepth === 'number' && normalizeDepth > 0) {\n return this._normalizeEvent(evt, normalizeDepth, normalizeMaxBreadth);\n }\n return evt;\n });\n }\n\n /**\n * Applies `normalize` function on necessary `Event` attributes to make them safe for serialization.\n * Normalized keys:\n * - `breadcrumbs.data`\n * - `user`\n * - `contexts`\n * - `extra`\n * @param event Event\n * @returns Normalized event\n */\n protected _normalizeEvent(event: Event | null, depth: number, maxBreadth: number): Event | null {\n if (!event) {\n return null;\n }\n\n const normalized: Event = {\n ...event,\n ...(event.breadcrumbs && {\n breadcrumbs: event.breadcrumbs.map(b => ({\n ...b,\n ...(b.data && {\n data: normalize(b.data, depth, maxBreadth),\n }),\n })),\n }),\n ...(event.user && {\n user: normalize(event.user, depth, maxBreadth),\n }),\n ...(event.contexts && {\n contexts: normalize(event.contexts, depth, maxBreadth),\n }),\n ...(event.extra && {\n extra: normalize(event.extra, depth, maxBreadth),\n }),\n };\n\n // event.contexts.trace stores information about a Transaction. Similarly,\n // event.spans[] stores information about child Spans. Given that a\n // Transaction is conceptually a Span, normalization should apply to both\n // Transactions and Spans consistently.\n // For now the decision is to skip normalization of Transactions and Spans,\n // so this block overwrites the normalized event to add back the original\n // Transaction information prior to normalization.\n if (event.contexts && event.contexts.trace && normalized.contexts) {\n normalized.contexts.trace = event.contexts.trace;\n\n // event.contexts.trace.data may contain circular/dangerous data so we need to normalize it\n if (event.contexts.trace.data) {\n normalized.contexts.trace.data = normalize(event.contexts.trace.data, depth, maxBreadth);\n }\n }\n\n // event.spans[].data may contain circular/dangerous data so we need to normalize it\n if (event.spans) {\n normalized.spans = event.spans.map(span => {\n // We cannot use the spread operator here because `toJSON` on `span` is non-enumerable\n if (span.data) {\n span.data = normalize(span.data, depth, maxBreadth);\n }\n return span;\n });\n }\n\n return normalized;\n }\n\n /**\n * Enhances event using the client configuration.\n * It takes care of all \"static\" values like environment, release and `dist`,\n * as well as truncating overly long values.\n * @param event event instance to be enhanced\n */\n protected _applyClientOptions(event: Event): void {\n const options = this.getOptions();\n const { environment, release, dist, maxValueLength = 250 } = options;\n\n if (!('environment' in event)) {\n event.environment = 'environment' in options ? environment : 'production';\n }\n\n if (event.release === undefined && release !== undefined) {\n event.release = release;\n }\n\n if (event.dist === undefined && dist !== undefined) {\n event.dist = dist;\n }\n\n if (event.message) {\n event.message = truncate(event.message, maxValueLength);\n }\n\n const exception = event.exception && event.exception.values && event.exception.values[0];\n if (exception && exception.value) {\n exception.value = truncate(exception.value, maxValueLength);\n }\n\n const request = event.request;\n if (request && request.url) {\n request.url = truncate(request.url, maxValueLength);\n }\n }\n\n /**\n * This function adds all used integrations to the SDK info in the event.\n * @param event The event that will be filled with all integrations.\n */\n protected _applyIntegrationsMetadata(event: Event): void {\n const integrationsArray = Object.keys(this._integrations);\n if (integrationsArray.length > 0) {\n event.sdk = event.sdk || {};\n event.sdk.integrations = [...(event.sdk.integrations || []), ...integrationsArray];\n }\n }\n\n /**\n * Processes the event and logs an error in case of rejection\n * @param event\n * @param hint\n * @param scope\n */\n protected _captureEvent(event: Event, hint: EventHint = {}, scope?: Scope): PromiseLike {\n return this._processEvent(event, hint, scope).then(\n finalEvent => {\n return finalEvent.event_id;\n },\n reason => {\n if (__DEBUG_BUILD__) {\n // If something's gone wrong, log the error as a warning. If it's just us having used a `SentryError` for\n // control flow, log just the message (no stack) as a log-level log.\n const sentryError = reason as SentryError;\n if (sentryError.logLevel === 'log') {\n logger.log(sentryError.message);\n } else {\n logger.warn(sentryError);\n }\n }\n return undefined;\n },\n );\n }\n\n /**\n * Processes an event (either error or message) and sends it to Sentry.\n *\n * This also adds breadcrumbs and context information to the event. However,\n * platform specific meta data (such as the User's IP address) must be added\n * by the SDK implementor.\n *\n *\n * @param event The event to send to Sentry.\n * @param hint May contain additional information about the original exception.\n * @param scope A scope containing event metadata.\n * @returns A SyncPromise that resolves with the event or rejects in case event was/will not be send.\n */\n protected _processEvent(event: Event, hint: EventHint, scope?: Scope): PromiseLike {\n const { beforeSend, sampleRate } = this.getOptions();\n\n if (!this._isEnabled()) {\n return rejectedSyncPromise(new SentryError('SDK not enabled, will not capture event.', 'log'));\n }\n\n const isTransaction = event.type === 'transaction';\n // 1.0 === 100% events are sent\n // 0.0 === 0% events are sent\n // Sampling for transaction happens somewhere else\n if (!isTransaction && typeof sampleRate === 'number' && Math.random() > sampleRate) {\n this.recordDroppedEvent('sample_rate', 'error');\n return rejectedSyncPromise(\n new SentryError(\n `Discarding event because it's not included in the random sample (sampling rate = ${sampleRate})`,\n 'log',\n ),\n );\n }\n\n return this._prepareEvent(event, hint, scope)\n .then(prepared => {\n if (prepared === null) {\n this.recordDroppedEvent('event_processor', event.type || 'error');\n throw new SentryError('An event processor returned null, will not send event.', 'log');\n }\n\n const isInternalException = hint.data && (hint.data as { __sentry__: boolean }).__sentry__ === true;\n if (isInternalException || isTransaction || !beforeSend) {\n return prepared;\n }\n\n const beforeSendResult = beforeSend(prepared, hint);\n return _ensureBeforeSendRv(beforeSendResult);\n })\n .then(processedEvent => {\n if (processedEvent === null) {\n this.recordDroppedEvent('before_send', event.type || 'error');\n throw new SentryError('`beforeSend` returned `null`, will not send event.', 'log');\n }\n\n const session = scope && scope.getSession();\n if (!isTransaction && session) {\n this._updateSessionFromEvent(session, processedEvent);\n }\n\n // None of the Sentry built event processor will update transaction name,\n // so if the transaction name has been changed by an event processor, we know\n // it has to come from custom event processor added by a user\n const transactionInfo = processedEvent.transaction_info;\n if (isTransaction && transactionInfo && processedEvent.transaction !== event.transaction) {\n const source = 'custom';\n processedEvent.transaction_info = {\n ...transactionInfo,\n source,\n changes: [\n ...transactionInfo.changes,\n {\n source,\n // use the same timestamp as the processed event.\n timestamp: processedEvent.timestamp as number,\n propagations: transactionInfo.propagations,\n },\n ],\n };\n }\n\n this.sendEvent(processedEvent, hint);\n return processedEvent;\n })\n .then(null, reason => {\n if (reason instanceof SentryError) {\n throw reason;\n }\n\n this.captureException(reason, {\n data: {\n __sentry__: true,\n },\n originalException: reason as Error,\n });\n throw new SentryError(\n `Event processing pipeline threw an error, original event will not be sent. Details have been sent as a new event.\\nReason: ${reason}`,\n );\n });\n }\n\n /**\n * Occupies the client with processing and event\n */\n protected _process(promise: PromiseLike): void {\n this._numProcessing += 1;\n void promise.then(\n value => {\n this._numProcessing -= 1;\n return value;\n },\n reason => {\n this._numProcessing -= 1;\n return reason;\n },\n );\n }\n\n /**\n * @inheritdoc\n */\n protected _sendEnvelope(envelope: Envelope): void {\n if (this._transport && this._dsn) {\n this._transport.send(envelope).then(null, reason => {\n __DEBUG_BUILD__ && logger.error('Error while sending event:', reason);\n });\n } else {\n __DEBUG_BUILD__ && logger.error('Transport disabled');\n }\n }\n\n /**\n * Clears outcomes on this client and returns them.\n */\n protected _clearOutcomes(): Outcome[] {\n const outcomes = this._outcomes;\n this._outcomes = {};\n return Object.keys(outcomes).map(key => {\n const [reason, category] = key.split(':') as [EventDropReason, DataCategory];\n return {\n reason,\n category,\n quantity: outcomes[key],\n };\n });\n }\n\n /**\n * @inheritDoc\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\n public abstract eventFromException(_exception: any, _hint?: EventHint): PromiseLike;\n\n /**\n * @inheritDoc\n */\n public abstract eventFromMessage(\n _message: string,\n // eslint-disable-next-line deprecation/deprecation\n _level?: Severity | SeverityLevel,\n _hint?: EventHint,\n ): PromiseLike;\n}\n\n/**\n * Verifies that return value of configured `beforeSend` is of expected type.\n */\nfunction _ensureBeforeSendRv(rv: PromiseLike | Event | null): PromiseLike | Event | null {\n const nullErr = '`beforeSend` method has to return `null` or a valid event.';\n if (isThenable(rv)) {\n return rv.then(\n event => {\n if (!(isPlainObject(event) || event === null)) {\n throw new SentryError(nullErr);\n }\n return event;\n },\n e => {\n throw new SentryError(`beforeSend rejected with ${e}`);\n },\n );\n } else if (!(isPlainObject(rv) || rv === null)) {\n throw new SentryError(nullErr);\n }\n return rv;\n}\n","import { getCurrentHub } from '@sentry/core';\nimport { Event, EventHint, Exception, Severity, SeverityLevel, StackFrame, StackParser } from '@sentry/types';\nimport {\n addExceptionMechanism,\n addExceptionTypeValue,\n extractExceptionKeysForMessage,\n isDOMError,\n isDOMException,\n isError,\n isErrorEvent,\n isEvent,\n isPlainObject,\n normalizeToSize,\n resolvedSyncPromise,\n} from '@sentry/utils';\n\n/**\n * This function creates an exception from a JavaScript Error\n */\nexport function exceptionFromError(stackParser: StackParser, ex: Error): Exception {\n // Get the frames first since Opera can lose the stack if we touch anything else first\n const frames = parseStackFrames(stackParser, ex);\n\n const exception: Exception = {\n type: ex && ex.name,\n value: extractMessage(ex),\n };\n\n if (frames.length) {\n exception.stacktrace = { frames };\n }\n\n if (exception.type === undefined && exception.value === '') {\n exception.value = 'Unrecoverable error caught';\n }\n\n return exception;\n}\n\n/**\n * @hidden\n */\nexport function eventFromPlainObject(\n stackParser: StackParser,\n exception: Record,\n syntheticException?: Error,\n isUnhandledRejection?: boolean,\n): Event {\n const hub = getCurrentHub();\n const client = hub.getClient();\n const normalizeDepth = client && client.getOptions().normalizeDepth;\n\n const event: Event = {\n exception: {\n values: [\n {\n type: isEvent(exception) ? exception.constructor.name : isUnhandledRejection ? 'UnhandledRejection' : 'Error',\n value: `Non-Error ${\n isUnhandledRejection ? 'promise rejection' : 'exception'\n } captured with keys: ${extractExceptionKeysForMessage(exception)}`,\n },\n ],\n },\n extra: {\n __serialized__: normalizeToSize(exception, normalizeDepth),\n },\n };\n\n if (syntheticException) {\n const frames = parseStackFrames(stackParser, syntheticException);\n if (frames.length) {\n // event.exception.values[0] has been set above\n (event.exception as { values: Exception[] }).values[0].stacktrace = { frames };\n }\n }\n\n return event;\n}\n\n/**\n * @hidden\n */\nexport function eventFromError(stackParser: StackParser, ex: Error): Event {\n return {\n exception: {\n values: [exceptionFromError(stackParser, ex)],\n },\n };\n}\n\n/** Parses stack frames from an error */\nexport function parseStackFrames(\n stackParser: StackParser,\n ex: Error & { framesToPop?: number; stacktrace?: string },\n): StackFrame[] {\n // Access and store the stacktrace property before doing ANYTHING\n // else to it because Opera is not very good at providing it\n // reliably in other circumstances.\n const stacktrace = ex.stacktrace || ex.stack || '';\n\n const popSize = getPopSize(ex);\n\n try {\n return stackParser(stacktrace, popSize);\n } catch (e) {\n // no-empty\n }\n\n return [];\n}\n\n// Based on our own mapping pattern - https://github.com/getsentry/sentry/blob/9f08305e09866c8bd6d0c24f5b0aabdd7dd6c59c/src/sentry/lang/javascript/errormapping.py#L83-L108\nconst reactMinifiedRegexp = /Minified React error #\\d+;/i;\n\nfunction getPopSize(ex: Error & { framesToPop?: number }): number {\n if (ex) {\n if (typeof ex.framesToPop === 'number') {\n return ex.framesToPop;\n }\n\n if (reactMinifiedRegexp.test(ex.message)) {\n return 1;\n }\n }\n\n return 0;\n}\n\n/**\n * There are cases where stacktrace.message is an Event object\n * https://github.com/getsentry/sentry-javascript/issues/1949\n * In this specific case we try to extract stacktrace.message.error.message\n */\nfunction extractMessage(ex: Error & { message: { error?: Error } }): string {\n const message = ex && ex.message;\n if (!message) {\n return 'No error message';\n }\n if (message.error && typeof message.error.message === 'string') {\n return message.error.message;\n }\n return message;\n}\n\n/**\n * Creates an {@link Event} from all inputs to `captureException` and non-primitive inputs to `captureMessage`.\n * @hidden\n */\nexport function eventFromException(\n stackParser: StackParser,\n exception: unknown,\n hint?: EventHint,\n attachStacktrace?: boolean,\n): PromiseLike {\n const syntheticException = (hint && hint.syntheticException) || undefined;\n const event = eventFromUnknownInput(stackParser, exception, syntheticException, attachStacktrace);\n addExceptionMechanism(event); // defaults to { type: 'generic', handled: true }\n event.level = 'error';\n if (hint && hint.event_id) {\n event.event_id = hint.event_id;\n }\n return resolvedSyncPromise(event);\n}\n\n/**\n * Builds and Event from a Message\n * @hidden\n */\nexport function eventFromMessage(\n stackParser: StackParser,\n message: string,\n // eslint-disable-next-line deprecation/deprecation\n level: Severity | SeverityLevel = 'info',\n hint?: EventHint,\n attachStacktrace?: boolean,\n): PromiseLike {\n const syntheticException = (hint && hint.syntheticException) || undefined;\n const event = eventFromString(stackParser, message, syntheticException, attachStacktrace);\n event.level = level;\n if (hint && hint.event_id) {\n event.event_id = hint.event_id;\n }\n return resolvedSyncPromise(event);\n}\n\n/**\n * @hidden\n */\nexport function eventFromUnknownInput(\n stackParser: StackParser,\n exception: unknown,\n syntheticException?: Error,\n attachStacktrace?: boolean,\n isUnhandledRejection?: boolean,\n): Event {\n let event: Event;\n\n if (isErrorEvent(exception as ErrorEvent) && (exception as ErrorEvent).error) {\n // If it is an ErrorEvent with `error` property, extract it to get actual Error\n const errorEvent = exception as ErrorEvent;\n return eventFromError(stackParser, errorEvent.error as Error);\n }\n\n // If it is a `DOMError` (which is a legacy API, but still supported in some browsers) then we just extract the name\n // and message, as it doesn't provide anything else. According to the spec, all `DOMExceptions` should also be\n // `Error`s, but that's not the case in IE11, so in that case we treat it the same as we do a `DOMError`.\n //\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMError\n // https://developer.mozilla.org/en-US/docs/Web/API/DOMException\n // https://webidl.spec.whatwg.org/#es-DOMException-specialness\n if (isDOMError(exception as DOMError) || isDOMException(exception as DOMException)) {\n const domException = exception as DOMException;\n\n if ('stack' in (exception as Error)) {\n event = eventFromError(stackParser, exception as Error);\n } else {\n const name = domException.name || (isDOMError(domException) ? 'DOMError' : 'DOMException');\n const message = domException.message ? `${name}: ${domException.message}` : name;\n event = eventFromString(stackParser, message, syntheticException, attachStacktrace);\n addExceptionTypeValue(event, message);\n }\n if ('code' in domException) {\n event.tags = { ...event.tags, 'DOMException.code': `${domException.code}` };\n }\n\n return event;\n }\n if (isError(exception)) {\n // we have a real Error object, do nothing\n return eventFromError(stackParser, exception);\n }\n if (isPlainObject(exception) || isEvent(exception)) {\n // If it's a plain object or an instance of `Event` (the built-in JS kind, not this SDK's `Event` type), serialize\n // it manually. This will allow us to group events based on top-level keys which is much better than creating a new\n // group on any key/value change.\n const objectException = exception as Record;\n event = eventFromPlainObject(stackParser, objectException, syntheticException, isUnhandledRejection);\n addExceptionMechanism(event, {\n synthetic: true,\n });\n return event;\n }\n\n // If none of previous checks were valid, then it means that it's not:\n // - an instance of DOMError\n // - an instance of DOMException\n // - an instance of Event\n // - an instance of Error\n // - a valid ErrorEvent (one with an error property)\n // - a plain Object\n //\n // So bail out and capture it as a simple message:\n event = eventFromString(stackParser, exception as string, syntheticException, attachStacktrace);\n addExceptionTypeValue(event, `${exception}`, undefined);\n addExceptionMechanism(event, {\n synthetic: true,\n });\n\n return event;\n}\n\n/**\n * @hidden\n */\nexport function eventFromString(\n stackParser: StackParser,\n input: string,\n syntheticException?: Error,\n attachStacktrace?: boolean,\n): Event {\n const event: Event = {\n message: input,\n };\n\n if (attachStacktrace && syntheticException) {\n const frames = parseStackFrames(stackParser, syntheticException);\n if (frames.length) {\n event.exception = {\n values: [{ value: input, stacktrace: { frames } }],\n };\n }\n }\n\n return event;\n}\n","/* eslint-disable deprecation/deprecation */\nimport { Severity, SeverityLevel } from '@sentry/types';\n\n// Note: Ideally the `SeverityLevel` type would be derived from `validSeverityLevels`, but that would mean either\n//\n// a) moving `validSeverityLevels` to `@sentry/types`,\n// b) moving the`SeverityLevel` type here, or\n// c) importing `validSeverityLevels` from here into `@sentry/types`.\n//\n// Option A would make `@sentry/types` a runtime dependency of `@sentry/utils` (not good), and options B and C would\n// create a circular dependency between `@sentry/types` and `@sentry/utils` (also not good). So a TODO accompanying the\n// type, reminding anyone who changes it to change this list also, will have to do.\n\nexport const validSeverityLevels = ['fatal', 'error', 'warning', 'log', 'info', 'debug'];\n\n/**\n * Converts a string-based level into a member of the deprecated {@link Severity} enum.\n *\n * @deprecated `severityFromString` is deprecated. Please use `severityLevelFromString` instead.\n *\n * @param level String representation of Severity\n * @returns Severity\n */\nexport function severityFromString(level: Severity | SeverityLevel | string): Severity {\n return severityLevelFromString(level) as Severity;\n}\n\n/**\n * Converts a string-based level into a `SeverityLevel`, normalizing it along the way.\n *\n * @param level String representation of desired `SeverityLevel`.\n * @returns The `SeverityLevel` corresponding to the given string, or 'log' if the string isn't a valid level.\n */\nexport function severityLevelFromString(level: SeverityLevel | string): SeverityLevel {\n return (level === 'warn' ? 'warning' : validSeverityLevels.includes(level) ? level : 'log') as SeverityLevel;\n}\n","/**\n * Parses string form of URL into an object\n * // borrowed from https://tools.ietf.org/html/rfc3986#appendix-B\n * // intentionally using regex and not href parsing trick because React Native and other\n * // environments where DOM might not be available\n * @returns parsed URL object\n */\nexport function parseUrl(url: string): {\n host?: string;\n path?: string;\n protocol?: string;\n relative?: string;\n} {\n if (!url) {\n return {};\n }\n\n const match = url.match(/^(([^:/?#]+):)?(\\/\\/([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$/);\n\n if (!match) {\n return {};\n }\n\n // coerce to undefined values to empty string so we don't get 'undefined'\n const query = match[6] || '';\n const fragment = match[8] || '';\n return {\n host: match[4],\n path: match[5],\n protocol: match[2],\n relative: match[5] + query + fragment, // everything minus origin\n };\n}\n\n/**\n * Strip the query string and fragment off of a given URL or path (if present)\n *\n * @param urlPath Full URL or path, including possible query string and/or fragment\n * @returns URL or path without query string or fragment\n */\nexport function stripUrlQueryAndFragment(urlPath: string): string {\n // eslint-disable-next-line no-useless-escape\n return urlPath.split(/[\\?#]/, 1)[0];\n}\n\n/**\n * Returns number of URL segments of a passed string URL.\n */\nexport function getNumberOfUrlSegments(url: string): number {\n // split at '/' or at '\\/' to split regex urls correctly\n return url.split(/\\\\?\\//).filter(s => s.length > 0 && s !== ',').length;\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable max-lines */\nimport { getCurrentHub } from '@sentry/core';\nimport { Integration } from '@sentry/types';\nimport {\n addInstrumentationHandler,\n getGlobalObject,\n htmlTreeAsString,\n parseUrl,\n safeJoin,\n severityLevelFromString,\n} from '@sentry/utils';\n\n/** JSDoc */\ninterface BreadcrumbsOptions {\n console: boolean;\n dom: boolean | { serializeAttribute: string | string[] };\n fetch: boolean;\n history: boolean;\n sentry: boolean;\n xhr: boolean;\n}\n\nexport const BREADCRUMB_INTEGRATION_ID = 'Breadcrumbs';\n\n/**\n * Default Breadcrumbs instrumentations\n * TODO: Deprecated - with v6, this will be renamed to `Instrument`\n */\nexport class Breadcrumbs implements Integration {\n /**\n * @inheritDoc\n */\n public static id: string = BREADCRUMB_INTEGRATION_ID;\n\n /**\n * @inheritDoc\n */\n public name: string = Breadcrumbs.id;\n\n /**\n * Options of the breadcrumbs integration.\n */\n // This field is public, because we use it in the browser client to check if the `sentry` option is enabled.\n public readonly options: Readonly;\n\n /**\n * @inheritDoc\n */\n public constructor(options?: Partial) {\n this.options = {\n console: true,\n dom: true,\n fetch: true,\n history: true,\n sentry: true,\n xhr: true,\n ...options,\n };\n }\n\n /**\n * Instrument browser built-ins w/ breadcrumb capturing\n * - Console API\n * - DOM API (click/typing)\n * - XMLHttpRequest API\n * - Fetch API\n * - History API\n */\n public setupOnce(): void {\n if (this.options.console) {\n addInstrumentationHandler('console', _consoleBreadcrumb);\n }\n if (this.options.dom) {\n addInstrumentationHandler('dom', _domBreadcrumb(this.options.dom));\n }\n if (this.options.xhr) {\n addInstrumentationHandler('xhr', _xhrBreadcrumb);\n }\n if (this.options.fetch) {\n addInstrumentationHandler('fetch', _fetchBreadcrumb);\n }\n if (this.options.history) {\n addInstrumentationHandler('history', _historyBreadcrumb);\n }\n }\n}\n\n/**\n * A HOC that creaes a function that creates breadcrumbs from DOM API calls.\n * This is a HOC so that we get access to dom options in the closure.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _domBreadcrumb(dom: BreadcrumbsOptions['dom']): (handlerData: { [key: string]: any }) => void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function _innerDomBreadcrumb(handlerData: { [key: string]: any }): void {\n let target;\n let keyAttrs = typeof dom === 'object' ? dom.serializeAttribute : undefined;\n\n if (typeof keyAttrs === 'string') {\n keyAttrs = [keyAttrs];\n }\n\n // Accessing event.target can throw (see getsentry/raven-js#838, #768)\n try {\n target = handlerData.event.target\n ? htmlTreeAsString(handlerData.event.target as Node, keyAttrs)\n : htmlTreeAsString(handlerData.event as unknown as Node, keyAttrs);\n } catch (e) {\n target = '';\n }\n\n if (target.length === 0) {\n return;\n }\n\n getCurrentHub().addBreadcrumb(\n {\n category: `ui.${handlerData.name}`,\n message: target,\n },\n {\n event: handlerData.event,\n name: handlerData.name,\n global: handlerData.global,\n },\n );\n }\n\n return _innerDomBreadcrumb;\n}\n\n/**\n * Creates breadcrumbs from console API calls\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _consoleBreadcrumb(handlerData: { [key: string]: any }): void {\n const breadcrumb = {\n category: 'console',\n data: {\n arguments: handlerData.args,\n logger: 'console',\n },\n level: severityLevelFromString(handlerData.level),\n message: safeJoin(handlerData.args, ' '),\n };\n\n if (handlerData.level === 'assert') {\n if (handlerData.args[0] === false) {\n breadcrumb.message = `Assertion failed: ${safeJoin(handlerData.args.slice(1), ' ') || 'console.assert'}`;\n breadcrumb.data.arguments = handlerData.args.slice(1);\n } else {\n // Don't capture a breadcrumb for passed assertions\n return;\n }\n }\n\n getCurrentHub().addBreadcrumb(breadcrumb, {\n input: handlerData.args,\n level: handlerData.level,\n });\n}\n\n/**\n * Creates breadcrumbs from XHR API calls\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _xhrBreadcrumb(handlerData: { [key: string]: any }): void {\n if (handlerData.endTimestamp) {\n // We only capture complete, non-sentry requests\n if (handlerData.xhr.__sentry_own_request__) {\n return;\n }\n\n const { method, url, status_code, body } = handlerData.xhr.__sentry_xhr__ || {};\n\n getCurrentHub().addBreadcrumb(\n {\n category: 'xhr',\n data: {\n method,\n url,\n status_code,\n },\n type: 'http',\n },\n {\n xhr: handlerData.xhr,\n input: body,\n },\n );\n\n return;\n }\n}\n\n/**\n * Creates breadcrumbs from fetch API calls\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _fetchBreadcrumb(handlerData: { [key: string]: any }): void {\n // We only capture complete fetch requests\n if (!handlerData.endTimestamp) {\n return;\n }\n\n if (handlerData.fetchData.url.match(/sentry_key/) && handlerData.fetchData.method === 'POST') {\n // We will not create breadcrumbs for fetch requests that contain `sentry_key` (internal sentry requests)\n return;\n }\n\n if (handlerData.error) {\n getCurrentHub().addBreadcrumb(\n {\n category: 'fetch',\n data: handlerData.fetchData,\n level: 'error',\n type: 'http',\n },\n {\n data: handlerData.error,\n input: handlerData.args,\n },\n );\n } else {\n getCurrentHub().addBreadcrumb(\n {\n category: 'fetch',\n data: {\n ...handlerData.fetchData,\n status_code: handlerData.response.status,\n },\n type: 'http',\n },\n {\n input: handlerData.args,\n response: handlerData.response,\n },\n );\n }\n}\n\n/**\n * Creates breadcrumbs from history API calls\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _historyBreadcrumb(handlerData: { [key: string]: any }): void {\n const global = getGlobalObject();\n let from = handlerData.from;\n let to = handlerData.to;\n const parsedLoc = parseUrl(global.location.href);\n let parsedFrom = parseUrl(from);\n const parsedTo = parseUrl(to);\n\n // Initial pushState doesn't provide `from` information\n if (!parsedFrom.path) {\n parsedFrom = parsedLoc;\n }\n\n // Use only the path component of the URL if the URL matches the current\n // document (almost all the time when using pushState)\n if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host) {\n to = parsedTo.relative;\n }\n if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) {\n from = parsedFrom.relative;\n }\n\n getCurrentHub().addBreadcrumb({\n category: 'navigation',\n data: {\n from,\n to,\n },\n });\n}\n","import { getGlobalObject, isNativeFetch, logger, supportsFetch } from '@sentry/utils';\n\nconst global = getGlobalObject();\nlet cachedFetchImpl: FetchImpl;\n\nexport type FetchImpl = typeof fetch;\n\n/**\n * A special usecase for incorrectly wrapped Fetch APIs in conjunction with ad-blockers.\n * Whenever someone wraps the Fetch API and returns the wrong promise chain,\n * this chain becomes orphaned and there is no possible way to capture it's rejections\n * other than allowing it bubble up to this very handler. eg.\n *\n * const f = window.fetch;\n * window.fetch = function () {\n * const p = f.apply(this, arguments);\n *\n * p.then(function() {\n * console.log('hi.');\n * });\n *\n * return p;\n * }\n *\n * `p.then(function () { ... })` is producing a completely separate promise chain,\n * however, what's returned is `p` - the result of original `fetch` call.\n *\n * This mean, that whenever we use the Fetch API to send our own requests, _and_\n * some ad-blocker blocks it, this orphaned chain will _always_ reject,\n * effectively causing another event to be captured.\n * This makes a whole process become an infinite loop, which we need to somehow\n * deal with, and break it in one way or another.\n *\n * To deal with this issue, we are making sure that we _always_ use the real\n * browser Fetch API, instead of relying on what `window.fetch` exposes.\n * The only downside to this would be missing our own requests as breadcrumbs,\n * but because we are already not doing this, it should be just fine.\n *\n * Possible failed fetch error messages per-browser:\n *\n * Chrome: Failed to fetch\n * Edge: Failed to Fetch\n * Firefox: NetworkError when attempting to fetch resource\n * Safari: resource blocked by content blocker\n */\nexport function getNativeFetchImplementation(): FetchImpl {\n if (cachedFetchImpl) {\n return cachedFetchImpl;\n }\n\n /* eslint-disable @typescript-eslint/unbound-method */\n\n // Fast path to avoid DOM I/O\n if (isNativeFetch(global.fetch)) {\n return (cachedFetchImpl = global.fetch.bind(global));\n }\n\n const document = global.document;\n let fetchImpl = global.fetch;\n // eslint-disable-next-line deprecation/deprecation\n if (document && typeof document.createElement === 'function') {\n try {\n const sandbox = document.createElement('iframe');\n sandbox.hidden = true;\n document.head.appendChild(sandbox);\n const contentWindow = sandbox.contentWindow;\n if (contentWindow && contentWindow.fetch) {\n fetchImpl = contentWindow.fetch;\n }\n document.head.removeChild(sandbox);\n } catch (e) {\n __DEBUG_BUILD__ &&\n logger.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', e);\n }\n }\n\n return (cachedFetchImpl = fetchImpl.bind(global));\n /* eslint-enable @typescript-eslint/unbound-method */\n}\n\n/**\n * Sends sdk client report using sendBeacon or fetch as a fallback if available\n *\n * @param url report endpoint\n * @param body report payload\n */\nexport function sendReport(url: string, body: string | Uint8Array): void {\n const isRealNavigator = Object.prototype.toString.call(global && global.navigator) === '[object Navigator]';\n const hasSendBeacon = isRealNavigator && typeof global.navigator.sendBeacon === 'function';\n\n if (hasSendBeacon) {\n // Prevent illegal invocations - https://xgwang.me/posts/you-may-not-know-beacon/#it-may-throw-error%2C-be-sure-to-catch\n const sendBeacon = global.navigator.sendBeacon.bind(global.navigator);\n sendBeacon(url, body);\n } else if (supportsFetch()) {\n const fetch = getNativeFetchImplementation();\n fetch(url, {\n body,\n method: 'POST',\n credentials: 'omit',\n keepalive: true,\n }).then(null, error => {\n __DEBUG_BUILD__ && logger.error(error);\n });\n }\n}\n","import { BaseClient, getCurrentHub, getEnvelopeEndpointWithUrlEncodedAuth, Scope, SDK_VERSION } from '@sentry/core';\nimport { ClientOptions, Event, EventHint, Options, Severity, SeverityLevel } from '@sentry/types';\nimport {\n createClientReportEnvelope,\n dsnToString,\n getEventDescription,\n getGlobalObject,\n logger,\n serializeEnvelope,\n} from '@sentry/utils';\n\nimport { eventFromException, eventFromMessage } from './eventbuilder';\nimport { Breadcrumbs } from './integrations';\nimport { BREADCRUMB_INTEGRATION_ID } from './integrations/breadcrumbs';\nimport { BrowserTransportOptions } from './transports/types';\nimport { sendReport } from './transports/utils';\n\nconst globalObject = getGlobalObject();\n\nexport interface BaseBrowserOptions {\n /**\n * A pattern for error URLs which should exclusively be sent to Sentry.\n * This is the opposite of {@link Options.denyUrls}.\n * By default, all errors will be sent.\n */\n allowUrls?: Array;\n\n /**\n * A pattern for error URLs which should not be sent to Sentry.\n * To allow certain errors instead, use {@link Options.allowUrls}.\n * By default, all errors will be sent.\n */\n denyUrls?: Array;\n}\n\n/**\n * Configuration options for the Sentry Browser SDK.\n * @see @sentry/types Options for more information.\n */\nexport interface BrowserOptions extends Options, BaseBrowserOptions {}\n\n/**\n * Configuration options for the Sentry Browser SDK Client class\n * @see BrowserClient for more information.\n */\nexport interface BrowserClientOptions extends ClientOptions, BaseBrowserOptions {}\n\n/**\n * The Sentry Browser SDK Client.\n *\n * @see BrowserOptions for documentation on configuration options.\n * @see SentryClient for usage documentation.\n */\nexport class BrowserClient extends BaseClient {\n /**\n * Creates a new Browser SDK instance.\n *\n * @param options Configuration options for this SDK.\n */\n public constructor(options: BrowserClientOptions) {\n options._metadata = options._metadata || {};\n options._metadata.sdk = options._metadata.sdk || {\n name: 'sentry.javascript.browser',\n packages: [\n {\n name: 'npm:@sentry/browser',\n version: SDK_VERSION,\n },\n ],\n version: SDK_VERSION,\n };\n\n super(options);\n\n if (options.sendClientReports && globalObject.document) {\n globalObject.document.addEventListener('visibilitychange', () => {\n if (globalObject.document.visibilityState === 'hidden') {\n this._flushOutcomes();\n }\n });\n }\n }\n\n /**\n * @inheritDoc\n */\n public eventFromException(exception: unknown, hint?: EventHint): PromiseLike {\n return eventFromException(this._options.stackParser, exception, hint, this._options.attachStacktrace);\n }\n\n /**\n * @inheritDoc\n */\n public eventFromMessage(\n message: string,\n // eslint-disable-next-line deprecation/deprecation\n level: Severity | SeverityLevel = 'info',\n hint?: EventHint,\n ): PromiseLike {\n return eventFromMessage(this._options.stackParser, message, level, hint, this._options.attachStacktrace);\n }\n\n /**\n * @inheritDoc\n */\n public sendEvent(event: Event, hint?: EventHint): void {\n // We only want to add the sentry event breadcrumb when the user has the breadcrumb integration installed and\n // activated its `sentry` option.\n // We also do not want to use the `Breadcrumbs` class here directly, because we do not want it to be included in\n // bundles, if it is not used by the SDK.\n // This all sadly is a bit ugly, but we currently don't have a \"pre-send\" hook on the integrations so we do it this\n // way for now.\n const breadcrumbIntegration = this.getIntegrationById(BREADCRUMB_INTEGRATION_ID) as Breadcrumbs | null;\n if (\n breadcrumbIntegration &&\n // We check for definedness of `options`, even though it is not strictly necessary, because that access to\n // `.sentry` below does not throw, in case users provided their own integration with id \"Breadcrumbs\" that does\n // not have an`options` field\n breadcrumbIntegration.options &&\n breadcrumbIntegration.options.sentry\n ) {\n getCurrentHub().addBreadcrumb(\n {\n category: `sentry.${event.type === 'transaction' ? 'transaction' : 'event'}`,\n event_id: event.event_id,\n level: event.level,\n message: getEventDescription(event),\n },\n {\n event,\n },\n );\n }\n\n super.sendEvent(event, hint);\n }\n\n /**\n * @inheritDoc\n */\n protected _prepareEvent(event: Event, hint: EventHint, scope?: Scope): PromiseLike {\n event.platform = event.platform || 'javascript';\n return super._prepareEvent(event, hint, scope);\n }\n\n /**\n * Sends client reports as an envelope.\n */\n private _flushOutcomes(): void {\n const outcomes = this._clearOutcomes();\n\n if (outcomes.length === 0) {\n __DEBUG_BUILD__ && logger.log('No outcomes to send');\n return;\n }\n\n if (!this._dsn) {\n __DEBUG_BUILD__ && logger.log('No dsn provided, will not send outcomes');\n return;\n }\n\n __DEBUG_BUILD__ && logger.log('Sending outcomes:', outcomes);\n\n const url = getEnvelopeEndpointWithUrlEncodedAuth(this._dsn, this._options);\n const envelope = createClientReportEnvelope(outcomes, this._options.tunnel && dsnToString(this._dsn));\n\n try {\n sendReport(url, serializeEnvelope(envelope));\n } catch (e) {\n __DEBUG_BUILD__ && logger.error(e);\n }\n }\n}\n","import { ClientReport, ClientReportEnvelope, ClientReportItem } from '@sentry/types';\n\nimport { createEnvelope } from './envelope';\nimport { dateTimestampInSeconds } from './time';\n\n/**\n * Creates client report envelope\n * @param discarded_events An array of discard events\n * @param dsn A DSN that can be set on the header. Optional.\n */\nexport function createClientReportEnvelope(\n discarded_events: ClientReport['discarded_events'],\n dsn?: string,\n timestamp?: number,\n): ClientReportEnvelope {\n const clientReportItem: ClientReportItem = [\n { type: 'client_report' },\n {\n timestamp: timestamp || dateTimestampInSeconds(),\n discarded_events,\n },\n ];\n return createEnvelope(dsn ? { dsn } : {}, [clientReportItem]);\n}\n","import { StackFrame, StackLineParser, StackLineParserFn } from '@sentry/types';\nimport { createStackParser } from '@sentry/utils';\n\n// global reference to slice\nconst UNKNOWN_FUNCTION = '?';\n\nconst OPERA10_PRIORITY = 10;\nconst OPERA11_PRIORITY = 20;\nconst CHROME_PRIORITY = 30;\nconst WINJS_PRIORITY = 40;\nconst GECKO_PRIORITY = 50;\n\nfunction createFrame(filename: string, func: string, lineno?: number, colno?: number): StackFrame {\n const frame: StackFrame = {\n filename,\n function: func,\n // All browser frames are considered in_app\n in_app: true,\n };\n\n if (lineno !== undefined) {\n frame.lineno = lineno;\n }\n\n if (colno !== undefined) {\n frame.colno = colno;\n }\n\n return frame;\n}\n\n// Chromium based browsers: Chrome, Brave, new Opera, new Edge\nconst chromeRegex =\n /^\\s*at (?:(.*\\).*?|.*?) ?\\((?:address at )?)?((?:file|https?|blob|chrome-extension|address|native|eval|webpack||[-a-z]+:|.*bundle|\\/)?.*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i;\nconst chromeEvalRegex = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/;\n\nconst chrome: StackLineParserFn = line => {\n const parts = chromeRegex.exec(line);\n\n if (parts) {\n const isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line\n\n if (isEval) {\n const subMatch = chromeEvalRegex.exec(parts[2]);\n\n if (subMatch) {\n // throw out eval line/column and use top-most line/column number\n parts[2] = subMatch[1]; // url\n parts[3] = subMatch[2]; // line\n parts[4] = subMatch[3]; // column\n }\n }\n\n // Kamil: One more hack won't hurt us right? Understanding and adding more rules on top of these regexps right now\n // would be way too time consuming. (TODO: Rewrite whole RegExp to be more readable)\n const [func, filename] = extractSafariExtensionDetails(parts[1] || UNKNOWN_FUNCTION, parts[2]);\n\n return createFrame(filename, func, parts[3] ? +parts[3] : undefined, parts[4] ? +parts[4] : undefined);\n }\n\n return;\n};\n\nexport const chromeStackLineParser: StackLineParser = [CHROME_PRIORITY, chrome];\n\n// gecko regex: `(?:bundle|\\d+\\.js)`: `bundle` is for react native, `\\d+\\.js` also but specifically for ram bundles because it\n// generates filenames without a prefix like `file://` the filenames in the stacktrace are just 42.js\n// We need this specific case for now because we want no other regex to match.\nconst geckoREgex =\n /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)?((?:file|https?|blob|chrome|webpack|resource|moz-extension|safari-extension|safari-web-extension|capacitor)?:\\/.*?|\\[native code\\]|[^@]*(?:bundle|\\d+\\.js)|\\/[\\w\\-. /=]+)(?::(\\d+))?(?::(\\d+))?\\s*$/i;\nconst geckoEvalRegex = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\n\nconst gecko: StackLineParserFn = line => {\n const parts = geckoREgex.exec(line);\n\n if (parts) {\n const isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n if (isEval) {\n const subMatch = geckoEvalRegex.exec(parts[3]);\n\n if (subMatch) {\n // throw out eval line/column and use top-most line number\n parts[1] = parts[1] || 'eval';\n parts[3] = subMatch[1];\n parts[4] = subMatch[2];\n parts[5] = ''; // no column when eval\n }\n }\n\n let filename = parts[3];\n let func = parts[1] || UNKNOWN_FUNCTION;\n [func, filename] = extractSafariExtensionDetails(func, filename);\n\n return createFrame(filename, func, parts[4] ? +parts[4] : undefined, parts[5] ? +parts[5] : undefined);\n }\n\n return;\n};\n\nexport const geckoStackLineParser: StackLineParser = [GECKO_PRIORITY, gecko];\n\nconst winjsRegex =\n /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\n\nconst winjs: StackLineParserFn = line => {\n const parts = winjsRegex.exec(line);\n\n return parts\n ? createFrame(parts[2], parts[1] || UNKNOWN_FUNCTION, +parts[3], parts[4] ? +parts[4] : undefined)\n : undefined;\n};\n\nexport const winjsStackLineParser: StackLineParser = [WINJS_PRIORITY, winjs];\n\nconst opera10Regex = / line (\\d+).*script (?:in )?(\\S+)(?:: in function (\\S+))?$/i;\n\nconst opera10: StackLineParserFn = line => {\n const parts = opera10Regex.exec(line);\n return parts ? createFrame(parts[2], parts[3] || UNKNOWN_FUNCTION, +parts[1]) : undefined;\n};\n\nexport const opera10StackLineParser: StackLineParser = [OPERA10_PRIORITY, opera10];\n\nconst opera11Regex =\n / line (\\d+), column (\\d+)\\s*(?:in (?:]+)>|([^)]+))\\(.*\\))? in (.*):\\s*$/i;\n\nconst opera11: StackLineParserFn = line => {\n const parts = opera11Regex.exec(line);\n return parts ? createFrame(parts[5], parts[3] || parts[4] || UNKNOWN_FUNCTION, +parts[1], +parts[2]) : undefined;\n};\n\nexport const opera11StackLineParser: StackLineParser = [OPERA11_PRIORITY, opera11];\n\nexport const defaultStackLineParsers = [chromeStackLineParser, geckoStackLineParser, winjsStackLineParser];\n\nexport const defaultStackParser = createStackParser(...defaultStackLineParsers);\n\n/**\n * Safari web extensions, starting version unknown, can produce \"frames-only\" stacktraces.\n * What it means, is that instead of format like:\n *\n * Error: wat\n * at function@url:row:col\n * at function@url:row:col\n * at function@url:row:col\n *\n * it produces something like:\n *\n * function@url:row:col\n * function@url:row:col\n * function@url:row:col\n *\n * Because of that, it won't be captured by `chrome` RegExp and will fall into `Gecko` branch.\n * This function is extracted so that we can use it in both places without duplicating the logic.\n * Unfortunately \"just\" changing RegExp is too complicated now and making it pass all tests\n * and fix this case seems like an impossible, or at least way too time-consuming task.\n */\nconst extractSafariExtensionDetails = (func: string, filename: string): [string, string] => {\n const isSafariExtension = func.indexOf('safari-extension') !== -1;\n const isSafariWebExtension = func.indexOf('safari-web-extension') !== -1;\n\n return isSafariExtension || isSafariWebExtension\n ? [\n func.indexOf('@') !== -1 ? func.split('@')[0] : UNKNOWN_FUNCTION,\n isSafariExtension ? `safari-extension:${filename}` : `safari-web-extension:${filename}`,\n ]\n : [func, filename];\n};\n","import {\n Breadcrumb,\n CaptureContext,\n CustomSamplingContext,\n Event,\n EventHint,\n Extra,\n Extras,\n Primitive,\n Severity,\n SeverityLevel,\n TransactionContext,\n User,\n} from '@sentry/types';\n\nimport { getCurrentHub, Hub } from './hub';\nimport { Scope } from './scope';\n\n// Note: All functions in this file are typed with a return value of `ReturnType`,\n// where HUB_FUNCTION is some method on the Hub class.\n//\n// This is done to make sure the top level SDK methods stay in sync with the hub methods.\n// Although every method here has an explicit return type, some of them (that map to void returns) do not\n// contain `return` keywords. This is done to save on bundle size, as `return` is not minifiable.\n\n/**\n * Captures an exception event and sends it to Sentry.\n *\n * @param exception An exception-like object.\n * @param captureContext Additional scope data to apply to exception event.\n * @returns The generated eventId.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\nexport function captureException(exception: any, captureContext?: CaptureContext): ReturnType {\n return getCurrentHub().captureException(exception, { captureContext });\n}\n\n/**\n * Captures a message event and sends it to Sentry.\n *\n * @param message The message to send to Sentry.\n * @param Severity Define the level of the message.\n * @returns The generated eventId.\n */\nexport function captureMessage(\n message: string,\n // eslint-disable-next-line deprecation/deprecation\n captureContext?: CaptureContext | Severity | SeverityLevel,\n): ReturnType {\n // This is necessary to provide explicit scopes upgrade, without changing the original\n // arity of the `captureMessage(message, level)` method.\n const level = typeof captureContext === 'string' ? captureContext : undefined;\n const context = typeof captureContext !== 'string' ? { captureContext } : undefined;\n return getCurrentHub().captureMessage(message, level, context);\n}\n\n/**\n * Captures a manually created event and sends it to Sentry.\n *\n * @param event The event to send to Sentry.\n * @returns The generated eventId.\n */\nexport function captureEvent(event: Event, hint?: EventHint): ReturnType {\n return getCurrentHub().captureEvent(event, hint);\n}\n\n/**\n * Callback to set context information onto the scope.\n * @param callback Callback function that receives Scope.\n */\nexport function configureScope(callback: (scope: Scope) => void): ReturnType {\n getCurrentHub().configureScope(callback);\n}\n\n/**\n * Records a new breadcrumb which will be attached to future events.\n *\n * Breadcrumbs will be added to subsequent events to provide more context on\n * user's actions prior to an error or crash.\n *\n * @param breadcrumb The breadcrumb to record.\n */\nexport function addBreadcrumb(breadcrumb: Breadcrumb): ReturnType {\n getCurrentHub().addBreadcrumb(breadcrumb);\n}\n\n/**\n * Sets context data with the given name.\n * @param name of the context\n * @param context Any kind of data. This data will be normalized.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function setContext(name: string, context: { [key: string]: any } | null): ReturnType {\n getCurrentHub().setContext(name, context);\n}\n\n/**\n * Set an object that will be merged sent as extra data with the event.\n * @param extras Extras object to merge into current context.\n */\nexport function setExtras(extras: Extras): ReturnType {\n getCurrentHub().setExtras(extras);\n}\n\n/**\n * Set key:value that will be sent as extra data with the event.\n * @param key String of extra\n * @param extra Any kind of data. This data will be normalized.\n */\nexport function setExtra(key: string, extra: Extra): ReturnType {\n getCurrentHub().setExtra(key, extra);\n}\n\n/**\n * Set an object that will be merged sent as tags data with the event.\n * @param tags Tags context object to merge into current context.\n */\nexport function setTags(tags: { [key: string]: Primitive }): ReturnType {\n getCurrentHub().setTags(tags);\n}\n\n/**\n * Set key:value that will be sent as tags data with the event.\n *\n * Can also be used to unset a tag, by passing `undefined`.\n *\n * @param key String key of tag\n * @param value Value of tag\n */\nexport function setTag(key: string, value: Primitive): ReturnType {\n getCurrentHub().setTag(key, value);\n}\n\n/**\n * Updates user context information for future events.\n *\n * @param user User context object to be set in the current context. Pass `null` to unset the user.\n */\nexport function setUser(user: User | null): ReturnType {\n getCurrentHub().setUser(user);\n}\n\n/**\n * Creates a new scope with and executes the given operation within.\n * The scope is automatically removed once the operation\n * finishes or throws.\n *\n * This is essentially a convenience function for:\n *\n * pushScope();\n * callback();\n * popScope();\n *\n * @param callback that will be enclosed into push/popScope.\n */\nexport function withScope(callback: (scope: Scope) => void): ReturnType {\n getCurrentHub().withScope(callback);\n}\n\n/**\n * Starts a new `Transaction` and returns it. This is the entry point to manual tracing instrumentation.\n *\n * A tree structure can be built by adding child spans to the transaction, and child spans to other spans. To start a\n * new child span within the transaction or any span, call the respective `.startChild()` method.\n *\n * Every child span must be finished before the transaction is finished, otherwise the unfinished spans are discarded.\n *\n * The transaction must be finished with a call to its `.finish()` method, at which point the transaction with all its\n * finished child spans will be sent to Sentry.\n *\n * NOTE: This function should only be used for *manual* instrumentation. Auto-instrumentation should call\n * `startTransaction` directly on the hub.\n *\n * @param context Properties of the new `Transaction`.\n * @param customSamplingContext Information given to the transaction sampling function (along with context-dependent\n * default values). See {@link Options.tracesSampler}.\n *\n * @returns The transaction which was just started\n */\nexport function startTransaction(\n context: TransactionContext,\n customSamplingContext?: CustomSamplingContext,\n): ReturnType {\n return getCurrentHub().startTransaction({ ...context }, customSamplingContext);\n}\n","import { captureException, withScope } from '@sentry/core';\nimport { DsnLike, Event as SentryEvent, Mechanism, Scope, WrappedFunction } from '@sentry/types';\nimport {\n addExceptionMechanism,\n addExceptionTypeValue,\n addNonEnumerableProperty,\n getOriginalFunction,\n markFunctionWrapped,\n} from '@sentry/utils';\n\nlet ignoreOnError: number = 0;\n\n/**\n * @hidden\n */\nexport function shouldIgnoreOnError(): boolean {\n return ignoreOnError > 0;\n}\n\n/**\n * @hidden\n */\nexport function ignoreNextOnError(): void {\n // onerror should trigger before setTimeout\n ignoreOnError += 1;\n setTimeout(() => {\n ignoreOnError -= 1;\n });\n}\n\n/**\n * Instruments the given function and sends an event to Sentry every time the\n * function throws an exception.\n *\n * @param fn A function to wrap. It is generally safe to pass an unbound function, because the returned wrapper always\n * has a correct `this` context.\n * @returns The wrapped function.\n * @hidden\n */\nexport function wrap(\n fn: WrappedFunction,\n options: {\n mechanism?: Mechanism;\n } = {},\n before?: WrappedFunction,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): any {\n // for future readers what this does is wrap a function and then create\n // a bi-directional wrapping between them.\n //\n // example: wrapped = wrap(original);\n // original.__sentry_wrapped__ -> wrapped\n // wrapped.__sentry_original__ -> original\n\n if (typeof fn !== 'function') {\n return fn;\n }\n\n try {\n // if we're dealing with a function that was previously wrapped, return\n // the original wrapper.\n const wrapper = fn.__sentry_wrapped__;\n if (wrapper) {\n return wrapper;\n }\n\n // We don't wanna wrap it twice\n if (getOriginalFunction(fn)) {\n return fn;\n }\n } catch (e) {\n // Just accessing custom props in some Selenium environments\n // can cause a \"Permission denied\" exception (see raven-js#495).\n // Bail on wrapping and return the function as-is (defers to window.onerror).\n return fn;\n }\n\n /* eslint-disable prefer-rest-params */\n // It is important that `sentryWrapped` is not an arrow function to preserve the context of `this`\n const sentryWrapped: WrappedFunction = function (this: unknown): void {\n const args = Array.prototype.slice.call(arguments);\n\n try {\n if (before && typeof before === 'function') {\n before.apply(this, arguments);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n const wrappedArguments = args.map((arg: any) => wrap(arg, options));\n\n // Attempt to invoke user-land function\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n // means the sentry.javascript SDK caught an error invoking your application code. This\n // is expected behavior and NOT indicative of a bug with sentry.javascript.\n return fn.apply(this, wrappedArguments);\n } catch (ex) {\n ignoreNextOnError();\n\n withScope((scope: Scope) => {\n scope.addEventProcessor((event: SentryEvent) => {\n if (options.mechanism) {\n addExceptionTypeValue(event, undefined, undefined);\n addExceptionMechanism(event, options.mechanism);\n }\n\n event.extra = {\n ...event.extra,\n arguments: args,\n };\n\n return event;\n });\n\n captureException(ex);\n });\n\n throw ex;\n }\n };\n /* eslint-enable prefer-rest-params */\n\n // Accessing some objects may throw\n // ref: https://github.com/getsentry/sentry-javascript/issues/1168\n try {\n for (const property in fn) {\n if (Object.prototype.hasOwnProperty.call(fn, property)) {\n sentryWrapped[property] = fn[property];\n }\n }\n } catch (_oO) {} // eslint-disable-line no-empty\n\n // Signal that this function has been wrapped/filled already\n // for both debugging and to prevent it to being wrapped/filled twice\n markFunctionWrapped(sentryWrapped, fn);\n\n addNonEnumerableProperty(fn, '__sentry_wrapped__', sentryWrapped);\n\n // Restore original function name (not all browsers allow that)\n try {\n const descriptor = Object.getOwnPropertyDescriptor(sentryWrapped, 'name') as PropertyDescriptor;\n if (descriptor.configurable) {\n Object.defineProperty(sentryWrapped, 'name', {\n get(): string {\n return fn.name;\n },\n });\n }\n // eslint-disable-next-line no-empty\n } catch (_oO) {}\n\n return sentryWrapped;\n}\n\n/**\n * All properties the report dialog supports\n */\nexport interface ReportDialogOptions {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any;\n eventId?: string;\n dsn?: DsnLike;\n user?: {\n email?: string;\n name?: string;\n };\n lang?: string;\n title?: string;\n subtitle?: string;\n subtitle2?: string;\n labelName?: string;\n labelEmail?: string;\n labelComments?: string;\n labelClose?: string;\n labelSubmit?: string;\n errorGeneric?: string;\n errorFormEntry?: string;\n successMessage?: string;\n /** Callback after reportDialog showed up */\n onLoad?(): void;\n}\n","import { Integration, WrappedFunction } from '@sentry/types';\nimport { fill, getFunctionName, getGlobalObject, getOriginalFunction } from '@sentry/utils';\n\nimport { wrap } from '../helpers';\n\nconst DEFAULT_EVENT_TARGET = [\n 'EventTarget',\n 'Window',\n 'Node',\n 'ApplicationCache',\n 'AudioTrackList',\n 'ChannelMergerNode',\n 'CryptoOperation',\n 'EventSource',\n 'FileReader',\n 'HTMLUnknownElement',\n 'IDBDatabase',\n 'IDBRequest',\n 'IDBTransaction',\n 'KeyOperation',\n 'MediaController',\n 'MessagePort',\n 'ModalWindow',\n 'Notification',\n 'SVGElementInstance',\n 'Screen',\n 'TextTrack',\n 'TextTrackCue',\n 'TextTrackList',\n 'WebSocket',\n 'WebSocketWorker',\n 'Worker',\n 'XMLHttpRequest',\n 'XMLHttpRequestEventTarget',\n 'XMLHttpRequestUpload',\n];\n\ntype XMLHttpRequestProp = 'onload' | 'onerror' | 'onprogress' | 'onreadystatechange';\n\n/** JSDoc */\ninterface TryCatchOptions {\n setTimeout: boolean;\n setInterval: boolean;\n requestAnimationFrame: boolean;\n XMLHttpRequest: boolean;\n eventTarget: boolean | string[];\n}\n\n/** Wrap timer functions and event targets to catch errors and provide better meta data */\nexport class TryCatch implements Integration {\n /**\n * @inheritDoc\n */\n public static id: string = 'TryCatch';\n\n /**\n * @inheritDoc\n */\n public name: string = TryCatch.id;\n\n /** JSDoc */\n private readonly _options: TryCatchOptions;\n\n /**\n * @inheritDoc\n */\n public constructor(options?: Partial) {\n this._options = {\n XMLHttpRequest: true,\n eventTarget: true,\n requestAnimationFrame: true,\n setInterval: true,\n setTimeout: true,\n ...options,\n };\n }\n\n /**\n * Wrap timer functions and event targets to catch errors\n * and provide better metadata.\n */\n public setupOnce(): void {\n const global = getGlobalObject();\n\n if (this._options.setTimeout) {\n fill(global, 'setTimeout', _wrapTimeFunction);\n }\n\n if (this._options.setInterval) {\n fill(global, 'setInterval', _wrapTimeFunction);\n }\n\n if (this._options.requestAnimationFrame) {\n fill(global, 'requestAnimationFrame', _wrapRAF);\n }\n\n if (this._options.XMLHttpRequest && 'XMLHttpRequest' in global) {\n fill(XMLHttpRequest.prototype, 'send', _wrapXHR);\n }\n\n const eventTargetOption = this._options.eventTarget;\n if (eventTargetOption) {\n const eventTarget = Array.isArray(eventTargetOption) ? eventTargetOption : DEFAULT_EVENT_TARGET;\n eventTarget.forEach(_wrapEventTarget);\n }\n }\n}\n\n/** JSDoc */\nfunction _wrapTimeFunction(original: () => void): () => number {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return function (this: any, ...args: any[]): number {\n const originalCallback = args[0];\n args[0] = wrap(originalCallback, {\n mechanism: {\n data: { function: getFunctionName(original) },\n handled: true,\n type: 'instrument',\n },\n });\n return original.apply(this, args);\n };\n}\n\n/** JSDoc */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _wrapRAF(original: any): (callback: () => void) => any {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return function (this: any, callback: () => void): () => void {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return original.apply(this, [\n wrap(callback, {\n mechanism: {\n data: {\n function: 'requestAnimationFrame',\n handler: getFunctionName(original),\n },\n handled: true,\n type: 'instrument',\n },\n }),\n ]);\n };\n}\n\n/** JSDoc */\nfunction _wrapXHR(originalSend: () => void): () => void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return function (this: XMLHttpRequest, ...args: any[]): void {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const xhr = this;\n const xmlHttpRequestProps: XMLHttpRequestProp[] = ['onload', 'onerror', 'onprogress', 'onreadystatechange'];\n\n xmlHttpRequestProps.forEach(prop => {\n if (prop in xhr && typeof xhr[prop] === 'function') {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n fill(xhr, prop, function (original: WrappedFunction): () => any {\n const wrapOptions = {\n mechanism: {\n data: {\n function: prop,\n handler: getFunctionName(original),\n },\n handled: true,\n type: 'instrument',\n },\n };\n\n // If Instrument integration has been called before TryCatch, get the name of original function\n const originalFunction = getOriginalFunction(original);\n if (originalFunction) {\n wrapOptions.mechanism.data.handler = getFunctionName(originalFunction);\n }\n\n // Otherwise wrap directly\n return wrap(original, wrapOptions);\n });\n }\n });\n\n return originalSend.apply(this, args);\n };\n}\n\n/** JSDoc */\nfunction _wrapEventTarget(target: string): void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const global = getGlobalObject() as { [key: string]: any };\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const proto = global[target] && global[target].prototype;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, no-prototype-builtins\n if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {\n return;\n }\n\n fill(proto, 'addEventListener', function (original: () => void): (\n eventName: string,\n fn: EventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ) => void {\n return function (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this: any,\n eventName: string,\n fn: EventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ): (eventName: string, fn: EventListenerObject, capture?: boolean, secure?: boolean) => void {\n try {\n if (typeof fn.handleEvent === 'function') {\n // ESlint disable explanation:\n // First, it is generally safe to call `wrap` with an unbound function. Furthermore, using `.bind()` would\n // introduce a bug here, because bind returns a new function that doesn't have our\n // flags(like __sentry_original__) attached. `wrap` checks for those flags to avoid unnecessary wrapping.\n // Without those flags, every call to addEventListener wraps the function again, causing a memory leak.\n // eslint-disable-next-line @typescript-eslint/unbound-method\n fn.handleEvent = wrap(fn.handleEvent, {\n mechanism: {\n data: {\n function: 'handleEvent',\n handler: getFunctionName(fn),\n target,\n },\n handled: true,\n type: 'instrument',\n },\n });\n }\n } catch (err) {\n // can sometimes get 'Permission denied to access property \"handle Event'\n }\n\n return original.apply(this, [\n eventName,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n wrap(fn as any as WrappedFunction, {\n mechanism: {\n data: {\n function: 'addEventListener',\n handler: getFunctionName(fn),\n target,\n },\n handled: true,\n type: 'instrument',\n },\n }),\n options,\n ]);\n };\n });\n\n fill(\n proto,\n 'removeEventListener',\n function (\n originalRemoveEventListener: () => void,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): (this: any, eventName: string, fn: EventListenerObject, options?: boolean | EventListenerOptions) => () => void {\n return function (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this: any,\n eventName: string,\n fn: EventListenerObject,\n options?: boolean | EventListenerOptions,\n ): () => void {\n /**\n * There are 2 possible scenarios here:\n *\n * 1. Someone passes a callback, which was attached prior to Sentry initialization, or by using unmodified\n * method, eg. `document.addEventListener.call(el, name, handler). In this case, we treat this function\n * as a pass-through, and call original `removeEventListener` with it.\n *\n * 2. Someone passes a callback, which was attached after Sentry was initialized, which means that it was using\n * our wrapped version of `addEventListener`, which internally calls `wrap` helper.\n * This helper \"wraps\" whole callback inside a try/catch statement, and attached appropriate metadata to it,\n * in order for us to make a distinction between wrapped/non-wrapped functions possible.\n * If a function was wrapped, it has additional property of `__sentry_wrapped__`, holding the handler.\n *\n * When someone adds a handler prior to initialization, and then do it again, but after,\n * then we have to detach both of them. Otherwise, if we'd detach only wrapped one, it'd be impossible\n * to get rid of the initial handler and it'd stick there forever.\n */\n const wrappedEventHandler = fn as unknown as WrappedFunction;\n try {\n const originalEventHandler = wrappedEventHandler && wrappedEventHandler.__sentry_wrapped__;\n if (originalEventHandler) {\n originalRemoveEventListener.call(this, eventName, originalEventHandler, options);\n }\n } catch (e) {\n // ignore, accessing __sentry_wrapped__ will throw in some Selenium environments\n }\n return originalRemoveEventListener.call(this, eventName, wrappedEventHandler, options);\n };\n },\n );\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-member-access */\nimport { getCurrentHub } from '@sentry/core';\nimport { Event, EventHint, Hub, Integration, Primitive, StackParser } from '@sentry/types';\nimport {\n addExceptionMechanism,\n addInstrumentationHandler,\n getLocationHref,\n isErrorEvent,\n isPrimitive,\n isString,\n logger,\n} from '@sentry/utils';\n\nimport { BrowserClient } from '../client';\nimport { eventFromUnknownInput } from '../eventbuilder';\nimport { shouldIgnoreOnError } from '../helpers';\n\ntype GlobalHandlersIntegrationsOptionKeys = 'onerror' | 'onunhandledrejection';\n\n/** JSDoc */\ntype GlobalHandlersIntegrations = Record;\n\n/** Global handlers */\nexport class GlobalHandlers implements Integration {\n /**\n * @inheritDoc\n */\n public static id: string = 'GlobalHandlers';\n\n /**\n * @inheritDoc\n */\n public name: string = GlobalHandlers.id;\n\n /** JSDoc */\n private readonly _options: GlobalHandlersIntegrations;\n\n /**\n * Stores references functions to installing handlers. Will set to undefined\n * after they have been run so that they are not used twice.\n */\n private _installFunc: Record void) | undefined> = {\n onerror: _installGlobalOnErrorHandler,\n onunhandledrejection: _installGlobalOnUnhandledRejectionHandler,\n };\n\n /** JSDoc */\n public constructor(options?: GlobalHandlersIntegrations) {\n this._options = {\n onerror: true,\n onunhandledrejection: true,\n ...options,\n };\n }\n /**\n * @inheritDoc\n */\n public setupOnce(): void {\n Error.stackTraceLimit = 50;\n const options = this._options;\n\n // We can disable guard-for-in as we construct the options object above + do checks against\n // `this._installFunc` for the property.\n // eslint-disable-next-line guard-for-in\n for (const key in options) {\n const installFunc = this._installFunc[key as GlobalHandlersIntegrationsOptionKeys];\n if (installFunc && options[key as GlobalHandlersIntegrationsOptionKeys]) {\n globalHandlerLog(key);\n installFunc();\n this._installFunc[key as GlobalHandlersIntegrationsOptionKeys] = undefined;\n }\n }\n }\n}\n\n/** JSDoc */\nfunction _installGlobalOnErrorHandler(): void {\n addInstrumentationHandler(\n 'error',\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (data: { msg: any; url: any; line: any; column: any; error: any }) => {\n const [hub, stackParser, attachStacktrace] = getHubAndOptions();\n if (!hub.getIntegration(GlobalHandlers)) {\n return;\n }\n const { msg, url, line, column, error } = data;\n if (shouldIgnoreOnError() || (error && error.__sentry_own_request__)) {\n return;\n }\n\n const event =\n error === undefined && isString(msg)\n ? _eventFromIncompleteOnError(msg, url, line, column)\n : _enhanceEventWithInitialFrame(\n eventFromUnknownInput(stackParser, error || msg, undefined, attachStacktrace, false),\n url,\n line,\n column,\n );\n\n event.level = 'error';\n\n addMechanismAndCapture(hub, error, event, 'onerror');\n },\n );\n}\n\n/** JSDoc */\nfunction _installGlobalOnUnhandledRejectionHandler(): void {\n addInstrumentationHandler(\n 'unhandledrejection',\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (e: any) => {\n const [hub, stackParser, attachStacktrace] = getHubAndOptions();\n if (!hub.getIntegration(GlobalHandlers)) {\n return;\n }\n let error = e;\n\n // dig the object of the rejection out of known event types\n try {\n // PromiseRejectionEvents store the object of the rejection under 'reason'\n // see https://developer.mozilla.org/en-US/docs/Web/API/PromiseRejectionEvent\n if ('reason' in e) {\n error = e.reason;\n }\n // something, somewhere, (likely a browser extension) effectively casts PromiseRejectionEvents\n // to CustomEvents, moving the `promise` and `reason` attributes of the PRE into\n // the CustomEvent's `detail` attribute, since they're not part of CustomEvent's spec\n // see https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent and\n // https://github.com/getsentry/sentry-javascript/issues/2380\n else if ('detail' in e && 'reason' in e.detail) {\n error = e.detail.reason;\n }\n } catch (_oO) {\n // no-empty\n }\n\n if (shouldIgnoreOnError() || (error && error.__sentry_own_request__)) {\n return true;\n }\n\n const event = isPrimitive(error)\n ? _eventFromRejectionWithPrimitive(error)\n : eventFromUnknownInput(stackParser, error, undefined, attachStacktrace, true);\n\n event.level = 'error';\n\n addMechanismAndCapture(hub, error, event, 'onunhandledrejection');\n return;\n },\n );\n}\n\n/**\n * Create an event from a promise rejection where the `reason` is a primitive.\n *\n * @param reason: The `reason` property of the promise rejection\n * @returns An Event object with an appropriate `exception` value\n */\nfunction _eventFromRejectionWithPrimitive(reason: Primitive): Event {\n return {\n exception: {\n values: [\n {\n type: 'UnhandledRejection',\n // String() is needed because the Primitive type includes symbols (which can't be automatically stringified)\n value: `Non-Error promise rejection captured with value: ${String(reason)}`,\n },\n ],\n },\n };\n}\n\n/**\n * This function creates a stack from an old, error-less onerror handler.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _eventFromIncompleteOnError(msg: any, url: any, line: any, column: any): Event {\n const ERROR_TYPES_RE =\n /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i;\n\n // If 'message' is ErrorEvent, get real message from inside\n let message = isErrorEvent(msg) ? msg.message : msg;\n let name = 'Error';\n\n const groups = message.match(ERROR_TYPES_RE);\n if (groups) {\n name = groups[1];\n message = groups[2];\n }\n\n const event = {\n exception: {\n values: [\n {\n type: name,\n value: message,\n },\n ],\n },\n };\n\n return _enhanceEventWithInitialFrame(event, url, line, column);\n}\n\n/** JSDoc */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _enhanceEventWithInitialFrame(event: Event, url: any, line: any, column: any): Event {\n // event.exception\n const e = (event.exception = event.exception || {});\n // event.exception.values\n const ev = (e.values = e.values || []);\n // event.exception.values[0]\n const ev0 = (ev[0] = ev[0] || {});\n // event.exception.values[0].stacktrace\n const ev0s = (ev0.stacktrace = ev0.stacktrace || {});\n // event.exception.values[0].stacktrace.frames\n const ev0sf = (ev0s.frames = ev0s.frames || []);\n\n const colno = isNaN(parseInt(column, 10)) ? undefined : column;\n const lineno = isNaN(parseInt(line, 10)) ? undefined : line;\n const filename = isString(url) && url.length > 0 ? url : getLocationHref();\n\n // event.exception.values[0].stacktrace.frames\n if (ev0sf.length === 0) {\n ev0sf.push({\n colno,\n filename,\n function: '?',\n in_app: true,\n lineno,\n });\n }\n\n return event;\n}\n\nfunction globalHandlerLog(type: string): void {\n __DEBUG_BUILD__ && logger.log(`Global Handler attached: ${type}`);\n}\n\nfunction addMechanismAndCapture(hub: Hub, error: EventHint['originalException'], event: Event, type: string): void {\n addExceptionMechanism(event, {\n handled: false,\n type,\n });\n hub.captureEvent(event, {\n originalException: error,\n });\n}\n\nfunction getHubAndOptions(): [Hub, StackParser, boolean | undefined] {\n const hub = getCurrentHub();\n const client = hub.getClient();\n const options = (client && client.getOptions()) || {\n stackParser: () => [],\n attachStacktrace: false,\n };\n return [hub, options.stackParser, options.attachStacktrace];\n}\n","import { addGlobalEventProcessor, getCurrentHub } from '@sentry/core';\nimport { Event, EventHint, Exception, ExtendedError, Integration, StackParser } from '@sentry/types';\nimport { isInstanceOf } from '@sentry/utils';\n\nimport { BrowserClient } from '../client';\nimport { exceptionFromError } from '../eventbuilder';\n\nconst DEFAULT_KEY = 'cause';\nconst DEFAULT_LIMIT = 5;\n\ninterface LinkedErrorsOptions {\n key: string;\n limit: number;\n}\n\n/** Adds SDK info to an event. */\nexport class LinkedErrors implements Integration {\n /**\n * @inheritDoc\n */\n public static id: string = 'LinkedErrors';\n\n /**\n * @inheritDoc\n */\n public readonly name: string = LinkedErrors.id;\n\n /**\n * @inheritDoc\n */\n private readonly _key: LinkedErrorsOptions['key'];\n\n /**\n * @inheritDoc\n */\n private readonly _limit: LinkedErrorsOptions['limit'];\n\n /**\n * @inheritDoc\n */\n public constructor(options: Partial = {}) {\n this._key = options.key || DEFAULT_KEY;\n this._limit = options.limit || DEFAULT_LIMIT;\n }\n\n /**\n * @inheritDoc\n */\n public setupOnce(): void {\n const client = getCurrentHub().getClient();\n if (!client) {\n return;\n }\n addGlobalEventProcessor((event: Event, hint?: EventHint) => {\n const self = getCurrentHub().getIntegration(LinkedErrors);\n return self ? _handler(client.getOptions().stackParser, self._key, self._limit, event, hint) : event;\n });\n }\n}\n\n/**\n * @inheritDoc\n */\nexport function _handler(\n parser: StackParser,\n key: string,\n limit: number,\n event: Event,\n hint?: EventHint,\n): Event | null {\n if (!event.exception || !event.exception.values || !hint || !isInstanceOf(hint.originalException, Error)) {\n return event;\n }\n const linkedErrors = _walkErrorTree(parser, limit, hint.originalException as ExtendedError, key);\n event.exception.values = [...linkedErrors, ...event.exception.values];\n return event;\n}\n\n/**\n * JSDOC\n */\nexport function _walkErrorTree(\n parser: StackParser,\n limit: number,\n error: ExtendedError,\n key: string,\n stack: Exception[] = [],\n): Exception[] {\n if (!isInstanceOf(error[key], Error) || stack.length + 1 >= limit) {\n return stack;\n }\n const exception = exceptionFromError(parser, error[key]);\n return _walkErrorTree(parser, limit, error[key], key, [exception, ...stack]);\n}\n","import { Event, EventProcessor, Exception, Hub, Integration, StackFrame } from '@sentry/types';\nimport { logger } from '@sentry/utils';\n\n/** Deduplication filter */\nexport class Dedupe implements Integration {\n /**\n * @inheritDoc\n */\n public static id: string = 'Dedupe';\n\n /**\n * @inheritDoc\n */\n public name: string = Dedupe.id;\n\n /**\n * @inheritDoc\n */\n private _previousEvent?: Event;\n\n /**\n * @inheritDoc\n */\n public setupOnce(addGlobalEventProcessor: (callback: EventProcessor) => void, getCurrentHub: () => Hub): void {\n const eventProcessor: EventProcessor = currentEvent => {\n const self = getCurrentHub().getIntegration(Dedupe);\n if (self) {\n // Juuust in case something goes wrong\n try {\n if (_shouldDropEvent(currentEvent, self._previousEvent)) {\n __DEBUG_BUILD__ && logger.warn('Event dropped due to being a duplicate of previously captured event.');\n return null;\n }\n } catch (_oO) {\n return (self._previousEvent = currentEvent);\n }\n\n return (self._previousEvent = currentEvent);\n }\n return currentEvent;\n };\n\n eventProcessor.id = this.name;\n addGlobalEventProcessor(eventProcessor);\n }\n}\n\n/** JSDoc */\nfunction _shouldDropEvent(currentEvent: Event, previousEvent?: Event): boolean {\n if (!previousEvent) {\n return false;\n }\n\n if (_isSameMessageEvent(currentEvent, previousEvent)) {\n return true;\n }\n\n if (_isSameExceptionEvent(currentEvent, previousEvent)) {\n return true;\n }\n\n return false;\n}\n\n/** JSDoc */\nfunction _isSameMessageEvent(currentEvent: Event, previousEvent: Event): boolean {\n const currentMessage = currentEvent.message;\n const previousMessage = previousEvent.message;\n\n // If neither event has a message property, they were both exceptions, so bail out\n if (!currentMessage && !previousMessage) {\n return false;\n }\n\n // If only one event has a stacktrace, but not the other one, they are not the same\n if ((currentMessage && !previousMessage) || (!currentMessage && previousMessage)) {\n return false;\n }\n\n if (currentMessage !== previousMessage) {\n return false;\n }\n\n if (!_isSameFingerprint(currentEvent, previousEvent)) {\n return false;\n }\n\n if (!_isSameStacktrace(currentEvent, previousEvent)) {\n return false;\n }\n\n return true;\n}\n\n/** JSDoc */\nfunction _isSameExceptionEvent(currentEvent: Event, previousEvent: Event): boolean {\n const previousException = _getExceptionFromEvent(previousEvent);\n const currentException = _getExceptionFromEvent(currentEvent);\n\n if (!previousException || !currentException) {\n return false;\n }\n\n if (previousException.type !== currentException.type || previousException.value !== currentException.value) {\n return false;\n }\n\n if (!_isSameFingerprint(currentEvent, previousEvent)) {\n return false;\n }\n\n if (!_isSameStacktrace(currentEvent, previousEvent)) {\n return false;\n }\n\n return true;\n}\n\n/** JSDoc */\nfunction _isSameStacktrace(currentEvent: Event, previousEvent: Event): boolean {\n let currentFrames = _getFramesFromEvent(currentEvent);\n let previousFrames = _getFramesFromEvent(previousEvent);\n\n // If neither event has a stacktrace, they are assumed to be the same\n if (!currentFrames && !previousFrames) {\n return true;\n }\n\n // If only one event has a stacktrace, but not the other one, they are not the same\n if ((currentFrames && !previousFrames) || (!currentFrames && previousFrames)) {\n return false;\n }\n\n currentFrames = currentFrames as StackFrame[];\n previousFrames = previousFrames as StackFrame[];\n\n // If number of frames differ, they are not the same\n if (previousFrames.length !== currentFrames.length) {\n return false;\n }\n\n // Otherwise, compare the two\n for (let i = 0; i < previousFrames.length; i++) {\n const frameA = previousFrames[i];\n const frameB = currentFrames[i];\n\n if (\n frameA.filename !== frameB.filename ||\n frameA.lineno !== frameB.lineno ||\n frameA.colno !== frameB.colno ||\n frameA.function !== frameB.function\n ) {\n return false;\n }\n }\n\n return true;\n}\n\n/** JSDoc */\nfunction _isSameFingerprint(currentEvent: Event, previousEvent: Event): boolean {\n let currentFingerprint = currentEvent.fingerprint;\n let previousFingerprint = previousEvent.fingerprint;\n\n // If neither event has a fingerprint, they are assumed to be the same\n if (!currentFingerprint && !previousFingerprint) {\n return true;\n }\n\n // If only one event has a fingerprint, but not the other one, they are not the same\n if ((currentFingerprint && !previousFingerprint) || (!currentFingerprint && previousFingerprint)) {\n return false;\n }\n\n currentFingerprint = currentFingerprint as string[];\n previousFingerprint = previousFingerprint as string[];\n\n // Otherwise, compare the two\n try {\n return !!(currentFingerprint.join('') === previousFingerprint.join(''));\n } catch (_oO) {\n return false;\n }\n}\n\n/** JSDoc */\nfunction _getExceptionFromEvent(event: Event): Exception | undefined {\n return event.exception && event.exception.values && event.exception.values[0];\n}\n\n/** JSDoc */\nfunction _getFramesFromEvent(event: Event): StackFrame[] | undefined {\n const exception = event.exception;\n\n if (exception) {\n try {\n // @ts-ignore Object could be undefined\n return exception.values[0].stacktrace.frames;\n } catch (_oO) {\n return undefined;\n }\n }\n return undefined;\n}\n","import { addGlobalEventProcessor, getCurrentHub } from '@sentry/core';\nimport { Event, Integration } from '@sentry/types';\nimport { getGlobalObject } from '@sentry/utils';\n\nconst global = getGlobalObject();\n\n/** HttpContext integration collects information about HTTP request headers */\nexport class HttpContext implements Integration {\n /**\n * @inheritDoc\n */\n public static id: string = 'HttpContext';\n\n /**\n * @inheritDoc\n */\n public name: string = HttpContext.id;\n\n /**\n * @inheritDoc\n */\n public setupOnce(): void {\n addGlobalEventProcessor((event: Event) => {\n if (getCurrentHub().getIntegration(HttpContext)) {\n // if none of the information we want exists, don't bother\n if (!global.navigator && !global.location && !global.document) {\n return event;\n }\n\n // grab as much info as exists and add it to the event\n const url = (event.request && event.request.url) || (global.location && global.location.href);\n const { referrer } = global.document || {};\n const { userAgent } = global.navigator || {};\n\n const headers = {\n ...(event.request && event.request.headers),\n ...(referrer && { Referer: referrer }),\n ...(userAgent && { 'User-Agent': userAgent }),\n };\n const request = { ...(url && { url }), headers };\n\n return { ...event, request };\n }\n return event;\n });\n }\n}\n","import { SentryError } from './error';\nimport { rejectedSyncPromise, resolvedSyncPromise, SyncPromise } from './syncpromise';\n\nexport interface PromiseBuffer {\n // exposes the internal array so tests can assert on the state of it.\n // XXX: this really should not be public api.\n $: Array>;\n add(taskProducer: () => PromiseLike): PromiseLike;\n drain(timeout?: number): PromiseLike;\n}\n\n/**\n * Creates an new PromiseBuffer object with the specified limit\n * @param limit max number of promises that can be stored in the buffer\n */\nexport function makePromiseBuffer(limit?: number): PromiseBuffer {\n const buffer: Array> = [];\n\n function isReady(): boolean {\n return limit === undefined || buffer.length < limit;\n }\n\n /**\n * Remove a promise from the queue.\n *\n * @param task Can be any PromiseLike\n * @returns Removed promise.\n */\n function remove(task: PromiseLike): PromiseLike {\n return buffer.splice(buffer.indexOf(task), 1)[0];\n }\n\n /**\n * Add a promise (representing an in-flight action) to the queue, and set it to remove itself on fulfillment.\n *\n * @param taskProducer A function producing any PromiseLike; In previous versions this used to be `task:\n * PromiseLike`, but under that model, Promises were instantly created on the call-site and their executor\n * functions therefore ran immediately. Thus, even if the buffer was full, the action still happened. By\n * requiring the promise to be wrapped in a function, we can defer promise creation until after the buffer\n * limit check.\n * @returns The original promise.\n */\n function add(taskProducer: () => PromiseLike): PromiseLike {\n if (!isReady()) {\n return rejectedSyncPromise(new SentryError('Not adding Promise because buffer limit was reached.'));\n }\n\n // start the task and add its promise to the queue\n const task = taskProducer();\n if (buffer.indexOf(task) === -1) {\n buffer.push(task);\n }\n void task\n .then(() => remove(task))\n // Use `then(null, rejectionHandler)` rather than `catch(rejectionHandler)` so that we can use `PromiseLike`\n // rather than `Promise`. `PromiseLike` doesn't have a `.catch` method, making its polyfill smaller. (ES5 didn't\n // have promises, so TS has to polyfill when down-compiling.)\n .then(null, () =>\n remove(task).then(null, () => {\n // We have to add another catch here because `remove()` starts a new promise chain.\n }),\n );\n return task;\n }\n\n /**\n * Wait for all promises in the queue to resolve or for timeout to expire, whichever comes first.\n *\n * @param timeout The time, in ms, after which to resolve to `false` if the queue is still non-empty. Passing `0` (or\n * not passing anything) will make the promise wait as long as it takes for the queue to drain before resolving to\n * `true`.\n * @returns A promise which will resolve to `true` if the queue is already empty or drains before the timeout, and\n * `false` otherwise\n */\n function drain(timeout?: number): PromiseLike {\n return new SyncPromise((resolve, reject) => {\n let counter = buffer.length;\n\n if (!counter) {\n return resolve(true);\n }\n\n // wait for `timeout` ms and then resolve to `false` (if not cancelled first)\n const capturedSetTimeout = setTimeout(() => {\n if (timeout && timeout > 0) {\n resolve(false);\n }\n }, timeout);\n\n // if all promises resolve in time, cancel the timer and resolve to `true`\n buffer.forEach(item => {\n void resolvedSyncPromise(item).then(() => {\n // eslint-disable-next-line no-plusplus\n if (!--counter) {\n clearTimeout(capturedSetTimeout);\n resolve(true);\n }\n }, reject);\n });\n });\n }\n\n return {\n $: buffer,\n add,\n drain,\n };\n}\n","import { TransportMakeRequestResponse } from '@sentry/types';\n\n// Intentionally keeping the key broad, as we don't know for sure what rate limit headers get returned from backend\nexport type RateLimits = Record;\n\nexport const DEFAULT_RETRY_AFTER = 60 * 1000; // 60 seconds\n\n/**\n * Extracts Retry-After value from the request header or returns default value\n * @param header string representation of 'Retry-After' header\n * @param now current unix timestamp\n *\n */\nexport function parseRetryAfterHeader(header: string, now: number = Date.now()): number {\n const headerDelay = parseInt(`${header}`, 10);\n if (!isNaN(headerDelay)) {\n return headerDelay * 1000;\n }\n\n const headerDate = Date.parse(`${header}`);\n if (!isNaN(headerDate)) {\n return headerDate - now;\n }\n\n return DEFAULT_RETRY_AFTER;\n}\n\n/**\n * Gets the time that given category is disabled until for rate limiting\n */\nexport function disabledUntil(limits: RateLimits, category: string): number {\n return limits[category] || limits.all || 0;\n}\n\n/**\n * Checks if a category is rate limited\n */\nexport function isRateLimited(limits: RateLimits, category: string, now: number = Date.now()): boolean {\n return disabledUntil(limits, category) > now;\n}\n\n/**\n * Update ratelimits from incoming headers.\n * Returns true if headers contains a non-empty rate limiting header.\n */\nexport function updateRateLimits(\n limits: RateLimits,\n { statusCode, headers }: TransportMakeRequestResponse,\n now: number = Date.now(),\n): RateLimits {\n const updatedRateLimits: RateLimits = {\n ...limits,\n };\n\n // \"The name is case-insensitive.\"\n // https://developer.mozilla.org/en-US/docs/Web/API/Headers/get\n const rateLimitHeader = headers && headers['x-sentry-rate-limits'];\n const retryAfterHeader = headers && headers['retry-after'];\n\n if (rateLimitHeader) {\n /**\n * rate limit headers are of the form\n *
,
,..\n * where each
is of the form\n * : : : \n * where\n * is a delay in seconds\n * is the event type(s) (error, transaction, etc) being rate limited and is of the form\n * ;;...\n * is what's being limited (org, project, or key) - ignored by SDK\n * is an arbitrary string like \"org_quota\" - ignored by SDK\n */\n for (const limit of rateLimitHeader.trim().split(',')) {\n const [retryAfter, categories] = limit.split(':', 2);\n const headerDelay = parseInt(retryAfter, 10);\n const delay = (!isNaN(headerDelay) ? headerDelay : 60) * 1000; // 60sec default\n if (!categories) {\n updatedRateLimits.all = now + delay;\n } else {\n for (const category of categories.split(';')) {\n updatedRateLimits[category] = now + delay;\n }\n }\n }\n } else if (retryAfterHeader) {\n updatedRateLimits.all = now + parseRetryAfterHeader(retryAfterHeader, now);\n } else if (statusCode === 429) {\n updatedRateLimits.all = now + 60 * 1000;\n }\n\n return updatedRateLimits;\n}\n","import {\n Envelope,\n EnvelopeItem,\n EventDropReason,\n InternalBaseTransportOptions,\n Transport,\n TransportRequestExecutor,\n} from '@sentry/types';\nimport {\n createEnvelope,\n envelopeItemTypeToDataCategory,\n forEachEnvelopeItem,\n isRateLimited,\n logger,\n makePromiseBuffer,\n PromiseBuffer,\n RateLimits,\n resolvedSyncPromise,\n SentryError,\n serializeEnvelope,\n updateRateLimits,\n} from '@sentry/utils';\n\nexport const DEFAULT_TRANSPORT_BUFFER_SIZE = 30;\n\n/**\n * Creates an instance of a Sentry `Transport`\n *\n * @param options\n * @param makeRequest\n */\nexport function createTransport(\n options: InternalBaseTransportOptions,\n makeRequest: TransportRequestExecutor,\n buffer: PromiseBuffer = makePromiseBuffer(options.bufferSize || DEFAULT_TRANSPORT_BUFFER_SIZE),\n): Transport {\n let rateLimits: RateLimits = {};\n\n const flush = (timeout?: number): PromiseLike => buffer.drain(timeout);\n\n function send(envelope: Envelope): PromiseLike {\n const filteredEnvelopeItems: EnvelopeItem[] = [];\n\n // Drop rate limited items from envelope\n forEachEnvelopeItem(envelope, (item, type) => {\n const envelopeItemDataCategory = envelopeItemTypeToDataCategory(type);\n if (isRateLimited(rateLimits, envelopeItemDataCategory)) {\n options.recordDroppedEvent('ratelimit_backoff', envelopeItemDataCategory);\n } else {\n filteredEnvelopeItems.push(item);\n }\n });\n\n // Skip sending if envelope is empty after filtering out rate limited events\n if (filteredEnvelopeItems.length === 0) {\n return resolvedSyncPromise();\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const filteredEnvelope: Envelope = createEnvelope(envelope[0], filteredEnvelopeItems as any);\n\n // Creates client report for each item in an envelope\n const recordEnvelopeLoss = (reason: EventDropReason): void => {\n forEachEnvelopeItem(filteredEnvelope, (_, type) => {\n options.recordDroppedEvent(reason, envelopeItemTypeToDataCategory(type));\n });\n };\n\n const requestTask = (): PromiseLike =>\n makeRequest({ body: serializeEnvelope(filteredEnvelope, options.textEncoder) }).then(\n response => {\n // We don't want to throw on NOK responses, but we want to at least log them\n if (response.statusCode !== undefined && (response.statusCode < 200 || response.statusCode >= 300)) {\n __DEBUG_BUILD__ && logger.warn(`Sentry responded with status code ${response.statusCode} to sent event.`);\n }\n\n rateLimits = updateRateLimits(rateLimits, response);\n },\n error => {\n __DEBUG_BUILD__ && logger.error('Failed while sending event:', error);\n recordEnvelopeLoss('network_error');\n },\n );\n\n return buffer.add(requestTask).then(\n result => result,\n error => {\n if (error instanceof SentryError) {\n __DEBUG_BUILD__ && logger.error('Skipped sending event because buffer is full.');\n recordEnvelopeLoss('queue_overflow');\n return resolvedSyncPromise();\n } else {\n throw error;\n }\n },\n );\n }\n\n return {\n send,\n flush,\n };\n}\n","import { createTransport } from '@sentry/core';\nimport { Transport, TransportMakeRequestResponse, TransportRequest } from '@sentry/types';\n\nimport { BrowserTransportOptions } from './types';\nimport { FetchImpl, getNativeFetchImplementation } from './utils';\n\n/**\n * Creates a Transport that uses the Fetch API to send events to Sentry.\n */\nexport function makeFetchTransport(\n options: BrowserTransportOptions,\n nativeFetch: FetchImpl = getNativeFetchImplementation(),\n): Transport {\n function makeRequest(request: TransportRequest): PromiseLike {\n const requestOptions: RequestInit = {\n body: request.body,\n method: 'POST',\n referrerPolicy: 'origin',\n headers: options.headers,\n // Outgoing requests are usually cancelled when navigating to a different page, causing a \"TypeError: Failed to\n // fetch\" error and sending a \"network_error\" client-outcome - in Chrome, the request status shows \"(cancelled)\".\n // The `keepalive` flag keeps outgoing requests alive, even when switching pages. We want this since we're\n // frequently sending events right before the user is switching pages (eg. whenfinishing navigation transactions).\n // Gotchas:\n // - `keepalive` isn't supported by Firefox\n // - As per spec (https://fetch.spec.whatwg.org/#http-network-or-cache-fetch), a request with `keepalive: true`\n // and a content length of > 64 kibibytes returns a network error. We will therefore only activate the flag when\n // we're below that limit.\n keepalive: request.body.length <= 65536,\n ...options.fetchOptions,\n };\n\n return nativeFetch(options.url, requestOptions).then(response => ({\n statusCode: response.status,\n headers: {\n 'x-sentry-rate-limits': response.headers.get('X-Sentry-Rate-Limits'),\n 'retry-after': response.headers.get('Retry-After'),\n },\n }));\n }\n\n return createTransport(options, makeRequest);\n}\n","import { createTransport } from '@sentry/core';\nimport { Transport, TransportMakeRequestResponse, TransportRequest } from '@sentry/types';\nimport { SyncPromise } from '@sentry/utils';\n\nimport { BrowserTransportOptions } from './types';\n\n/**\n * The DONE ready state for XmlHttpRequest\n *\n * Defining it here as a constant b/c XMLHttpRequest.DONE is not always defined\n * (e.g. during testing, it is `undefined`)\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/readyState}\n */\nconst XHR_READYSTATE_DONE = 4;\n\n/**\n * Creates a Transport that uses the XMLHttpRequest API to send events to Sentry.\n */\nexport function makeXHRTransport(options: BrowserTransportOptions): Transport {\n function makeRequest(request: TransportRequest): PromiseLike {\n return new SyncPromise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n\n xhr.onerror = reject;\n\n xhr.onreadystatechange = (): void => {\n if (xhr.readyState === XHR_READYSTATE_DONE) {\n resolve({\n statusCode: xhr.status,\n headers: {\n 'x-sentry-rate-limits': xhr.getResponseHeader('X-Sentry-Rate-Limits'),\n 'retry-after': xhr.getResponseHeader('Retry-After'),\n },\n });\n }\n };\n\n xhr.open('POST', options.url);\n\n for (const header in options.headers) {\n if (Object.prototype.hasOwnProperty.call(options.headers, header)) {\n xhr.setRequestHeader(header, options.headers[header]);\n }\n }\n\n xhr.send(request.body);\n });\n }\n\n return createTransport(options, makeRequest);\n}\n","import {\n getCurrentHub,\n getIntegrationsToSetup,\n getReportDialogEndpoint,\n Hub,\n initAndBind,\n Integrations as CoreIntegrations,\n} from '@sentry/core';\nimport {\n addInstrumentationHandler,\n getGlobalObject,\n logger,\n resolvedSyncPromise,\n stackParserFromStackParserOptions,\n supportsFetch,\n} from '@sentry/utils';\n\nimport { BrowserClient, BrowserClientOptions, BrowserOptions } from './client';\nimport { ReportDialogOptions, wrap as internalWrap } from './helpers';\nimport { Breadcrumbs, Dedupe, GlobalHandlers, HttpContext, LinkedErrors, TryCatch } from './integrations';\nimport { defaultStackParser } from './stack-parsers';\nimport { makeFetchTransport, makeXHRTransport } from './transports';\n\nexport const defaultIntegrations = [\n new CoreIntegrations.InboundFilters(),\n new CoreIntegrations.FunctionToString(),\n new TryCatch(),\n new Breadcrumbs(),\n new GlobalHandlers(),\n new LinkedErrors(),\n new Dedupe(),\n new HttpContext(),\n];\n\n/**\n * The Sentry Browser SDK Client.\n *\n * To use this SDK, call the {@link init} function as early as possible when\n * loading the web page. To set context information or send manual events, use\n * the provided methods.\n *\n * @example\n *\n * ```\n *\n * import { init } from '@sentry/browser';\n *\n * init({\n * dsn: '__DSN__',\n * // ...\n * });\n * ```\n *\n * @example\n * ```\n *\n * import { configureScope } from '@sentry/browser';\n * configureScope((scope: Scope) => {\n * scope.setExtra({ battery: 0.7 });\n * scope.setTag({ user_mode: 'admin' });\n * scope.setUser({ id: '4711' });\n * });\n * ```\n *\n * @example\n * ```\n *\n * import { addBreadcrumb } from '@sentry/browser';\n * addBreadcrumb({\n * message: 'My Breadcrumb',\n * // ...\n * });\n * ```\n *\n * @example\n *\n * ```\n *\n * import * as Sentry from '@sentry/browser';\n * Sentry.captureMessage('Hello, world!');\n * Sentry.captureException(new Error('Good bye'));\n * Sentry.captureEvent({\n * message: 'Manual',\n * stacktrace: [\n * // ...\n * ],\n * });\n * ```\n *\n * @see {@link BrowserOptions} for documentation on configuration options.\n */\nexport function init(options: BrowserOptions = {}): void {\n if (options.defaultIntegrations === undefined) {\n options.defaultIntegrations = defaultIntegrations;\n }\n if (options.release === undefined) {\n const window = getGlobalObject();\n // This supports the variable that sentry-webpack-plugin injects\n if (window.SENTRY_RELEASE && window.SENTRY_RELEASE.id) {\n options.release = window.SENTRY_RELEASE.id;\n }\n }\n if (options.autoSessionTracking === undefined) {\n options.autoSessionTracking = true;\n }\n if (options.sendClientReports === undefined) {\n options.sendClientReports = true;\n }\n\n const clientOptions: BrowserClientOptions = {\n ...options,\n stackParser: stackParserFromStackParserOptions(options.stackParser || defaultStackParser),\n integrations: getIntegrationsToSetup(options),\n transport: options.transport || (supportsFetch() ? makeFetchTransport : makeXHRTransport),\n };\n\n initAndBind(BrowserClient, clientOptions);\n\n if (options.autoSessionTracking) {\n startSessionTracking();\n }\n}\n\n/**\n * Present the user with a report dialog.\n *\n * @param options Everything is optional, we try to fetch all info need from the global scope.\n */\nexport function showReportDialog(options: ReportDialogOptions = {}, hub: Hub = getCurrentHub()): void {\n // doesn't work without a document (React Native)\n const global = getGlobalObject();\n if (!global.document) {\n __DEBUG_BUILD__ && logger.error('Global document not defined in showReportDialog call');\n return;\n }\n\n const { client, scope } = hub.getStackTop();\n const dsn = options.dsn || (client && client.getDsn());\n if (!dsn) {\n __DEBUG_BUILD__ && logger.error('DSN not configured for showReportDialog call');\n return;\n }\n\n if (scope) {\n options.user = {\n ...scope.getUser(),\n ...options.user,\n };\n }\n\n if (!options.eventId) {\n options.eventId = hub.lastEventId();\n }\n\n const script = global.document.createElement('script');\n script.async = true;\n script.src = getReportDialogEndpoint(dsn, options);\n\n if (options.onLoad) {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n script.onload = options.onLoad;\n }\n\n const injectionPoint = global.document.head || global.document.body;\n if (injectionPoint) {\n injectionPoint.appendChild(script);\n } else {\n __DEBUG_BUILD__ && logger.error('Not injecting report dialog. No injection point found in HTML');\n }\n}\n\n/**\n * This is the getter for lastEventId.\n *\n * @returns The last event id of a captured event.\n */\nexport function lastEventId(): string | undefined {\n return getCurrentHub().lastEventId();\n}\n\n/**\n * This function is here to be API compatible with the loader.\n * @hidden\n */\nexport function forceLoad(): void {\n // Noop\n}\n\n/**\n * This function is here to be API compatible with the loader.\n * @hidden\n */\nexport function onLoad(callback: () => void): void {\n callback();\n}\n\n/**\n * Call `flush()` on the current client, if there is one. See {@link Client.flush}.\n *\n * @param timeout Maximum time in ms the client should wait to flush its event queue. Omitting this parameter will cause\n * the client to wait until all events are sent before resolving the promise.\n * @returns A promise which resolves to `true` if the queue successfully drains before the timeout, or `false` if it\n * doesn't (or if there's no client defined).\n */\nexport function flush(timeout?: number): PromiseLike {\n const client = getCurrentHub().getClient();\n if (client) {\n return client.flush(timeout);\n }\n __DEBUG_BUILD__ && logger.warn('Cannot flush events. No client defined.');\n return resolvedSyncPromise(false);\n}\n\n/**\n * Call `close()` on the current client, if there is one. See {@link Client.close}.\n *\n * @param timeout Maximum time in ms the client should wait to flush its event queue before shutting down. Omitting this\n * parameter will cause the client to wait until all events are sent before disabling itself.\n * @returns A promise which resolves to `true` if the queue successfully drains before the timeout, or `false` if it\n * doesn't (or if there's no client defined).\n */\nexport function close(timeout?: number): PromiseLike {\n const client = getCurrentHub().getClient();\n if (client) {\n return client.close(timeout);\n }\n __DEBUG_BUILD__ && logger.warn('Cannot flush events and disable SDK. No client defined.');\n return resolvedSyncPromise(false);\n}\n\n/**\n * Wrap code within a try/catch block so the SDK is able to capture errors.\n *\n * @param fn A function to wrap.\n *\n * @returns The result of wrapped function call.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function wrap(fn: (...args: any) => any): any {\n return internalWrap(fn)();\n}\n\nfunction startSessionOnHub(hub: Hub): void {\n hub.startSession({ ignoreDuration: true });\n hub.captureSession();\n}\n\n/**\n * Enable automatic Session Tracking for the initial page load.\n */\nfunction startSessionTracking(): void {\n const window = getGlobalObject();\n const document = window.document;\n\n if (typeof document === 'undefined') {\n __DEBUG_BUILD__ &&\n logger.warn('Session tracking in non-browser environment with @sentry/browser is not supported.');\n return;\n }\n\n const hub = getCurrentHub();\n\n // The only way for this to be false is for there to be a version mismatch between @sentry/browser (>= 6.0.0) and\n // @sentry/hub (< 5.27.0). In the simple case, there won't ever be such a mismatch, because the two packages are\n // pinned at the same version in package.json, but there are edge cases where it's possible. See\n // https://github.com/getsentry/sentry-javascript/issues/3207 and\n // https://github.com/getsentry/sentry-javascript/issues/3234 and\n // https://github.com/getsentry/sentry-javascript/issues/3278.\n if (!hub.captureSession) {\n return;\n }\n\n // The session duration for browser sessions does not track a meaningful\n // concept that can be used as a metric.\n // Automatically captured sessions are akin to page views, and thus we\n // discard their duration.\n startSessionOnHub(hub);\n\n // We want to create a session for every navigation as well\n addInstrumentationHandler('history', ({ from, to }) => {\n // Don't create an additional session for the initial route or if the location did not change\n if (!(from === undefined || from === to)) {\n startSessionOnHub(getCurrentHub());\n }\n });\n}\n","import { addInstrumentationHandler, logger } from '@sentry/utils';\n\nimport { SpanStatusType } from './span';\nimport { getActiveTransaction } from './utils';\n\n/**\n * Configures global error listeners\n */\nexport function registerErrorInstrumentation(): void {\n addInstrumentationHandler('error', errorCallback);\n addInstrumentationHandler('unhandledrejection', errorCallback);\n}\n\n/**\n * If an error or unhandled promise occurs, we mark the active transaction as failed\n */\nfunction errorCallback(): void {\n const activeTransaction = getActiveTransaction();\n if (activeTransaction) {\n const status: SpanStatusType = 'internal_error';\n __DEBUG_BUILD__ && logger.log(`[Tracing] Transaction: ${status} -> Global error occured`);\n activeTransaction.setStatus(status);\n }\n}\n","import { getMainCarrier, Hub } from '@sentry/hub';\nimport {\n ClientOptions,\n CustomSamplingContext,\n Integration,\n IntegrationClass,\n Options,\n SamplingContext,\n TransactionContext,\n} from '@sentry/types';\nimport { dynamicRequire, isNaN, isNodeEnv, loadModule, logger } from '@sentry/utils';\n\nimport { registerErrorInstrumentation } from './errors';\nimport { IdleTransaction } from './idletransaction';\nimport { Transaction } from './transaction';\nimport { hasTracingEnabled } from './utils';\n\n/** Returns all trace headers that are currently on the top scope. */\nfunction traceHeaders(this: Hub): { [key: string]: string } {\n const scope = this.getScope();\n if (scope) {\n const span = scope.getSpan();\n if (span) {\n return {\n 'sentry-trace': span.toTraceparent(),\n };\n }\n }\n return {};\n}\n\n/**\n * Makes a sampling decision for the given transaction and stores it on the transaction.\n *\n * Called every time a transaction is created. Only transactions which emerge with a `sampled` value of `true` will be\n * sent to Sentry.\n *\n * @param transaction: The transaction needing a sampling decision\n * @param options: The current client's options, so we can access `tracesSampleRate` and/or `tracesSampler`\n * @param samplingContext: Default and user-provided data which may be used to help make the decision\n *\n * @returns The given transaction with its `sampled` value set\n */\nfunction sample(\n transaction: T,\n options: Pick,\n samplingContext: SamplingContext,\n): T {\n // nothing to do if tracing is not enabled\n if (!hasTracingEnabled(options)) {\n transaction.sampled = false;\n return transaction;\n }\n\n // if the user has forced a sampling decision by passing a `sampled` value in their transaction context, go with that\n if (transaction.sampled !== undefined) {\n transaction.setMetadata({\n transactionSampling: {\n method: 'explicitly_set',\n rate: Number(transaction.sampled),\n },\n });\n return transaction;\n }\n\n // we would have bailed already if neither `tracesSampler` nor `tracesSampleRate` were defined, so one of these should\n // work; prefer the hook if so\n let sampleRate;\n if (typeof options.tracesSampler === 'function') {\n sampleRate = options.tracesSampler(samplingContext);\n transaction.setMetadata({\n transactionSampling: {\n method: 'client_sampler',\n // cast to number in case it's a boolean\n rate: Number(sampleRate),\n },\n });\n } else if (samplingContext.parentSampled !== undefined) {\n sampleRate = samplingContext.parentSampled;\n transaction.setMetadata({\n transactionSampling: { method: 'inheritance' },\n });\n } else {\n sampleRate = options.tracesSampleRate;\n transaction.setMetadata({\n transactionSampling: {\n method: 'client_rate',\n // cast to number in case it's a boolean\n rate: Number(sampleRate),\n },\n });\n }\n\n // Since this is coming from the user (or from a function provided by the user), who knows what we might get. (The\n // only valid values are booleans or numbers between 0 and 1.)\n if (!isValidSampleRate(sampleRate)) {\n __DEBUG_BUILD__ && logger.warn('[Tracing] Discarding transaction because of invalid sample rate.');\n transaction.sampled = false;\n return transaction;\n }\n\n // if the function returned 0 (or false), or if `tracesSampleRate` is 0, it's a sign the transaction should be dropped\n if (!sampleRate) {\n __DEBUG_BUILD__ &&\n logger.log(\n `[Tracing] Discarding transaction because ${\n typeof options.tracesSampler === 'function'\n ? 'tracesSampler returned 0 or false'\n : 'a negative sampling decision was inherited or tracesSampleRate is set to 0'\n }`,\n );\n transaction.sampled = false;\n return transaction;\n }\n\n // Now we roll the dice. Math.random is inclusive of 0, but not of 1, so strict < is safe here. In case sampleRate is\n // a boolean, the < comparison will cause it to be automatically cast to 1 if it's true and 0 if it's false.\n transaction.sampled = Math.random() < (sampleRate as number | boolean);\n\n // if we're not going to keep it, we're done\n if (!transaction.sampled) {\n __DEBUG_BUILD__ &&\n logger.log(\n `[Tracing] Discarding transaction because it's not included in the random sample (sampling rate = ${Number(\n sampleRate,\n )})`,\n );\n return transaction;\n }\n\n __DEBUG_BUILD__ && logger.log(`[Tracing] starting ${transaction.op} transaction - ${transaction.name}`);\n return transaction;\n}\n\n/**\n * Checks the given sample rate to make sure it is valid type and value (a boolean, or a number between 0 and 1).\n */\nfunction isValidSampleRate(rate: unknown): boolean {\n // we need to check NaN explicitly because it's of type 'number' and therefore wouldn't get caught by this typecheck\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (isNaN(rate) || !(typeof rate === 'number' || typeof rate === 'boolean')) {\n __DEBUG_BUILD__ &&\n logger.warn(\n `[Tracing] Given sample rate is invalid. Sample rate must be a boolean or a number between 0 and 1. Got ${JSON.stringify(\n rate,\n )} of type ${JSON.stringify(typeof rate)}.`,\n );\n return false;\n }\n\n // in case sampleRate is a boolean, it will get automatically cast to 1 if it's true and 0 if it's false\n if (rate < 0 || rate > 1) {\n __DEBUG_BUILD__ &&\n logger.warn(`[Tracing] Given sample rate is invalid. Sample rate must be between 0 and 1. Got ${rate}.`);\n return false;\n }\n return true;\n}\n\n/**\n * Creates a new transaction and adds a sampling decision if it doesn't yet have one.\n *\n * The Hub.startTransaction method delegates to this method to do its work, passing the Hub instance in as `this`, as if\n * it had been called on the hub directly. Exists as a separate function so that it can be injected into the class as an\n * \"extension method.\"\n *\n * @param this: The Hub starting the transaction\n * @param transactionContext: Data used to configure the transaction\n * @param CustomSamplingContext: Optional data to be provided to the `tracesSampler` function (if any)\n *\n * @returns The new transaction\n *\n * @see {@link Hub.startTransaction}\n */\nfunction _startTransaction(\n this: Hub,\n transactionContext: TransactionContext,\n customSamplingContext?: CustomSamplingContext,\n): Transaction {\n const client = this.getClient();\n const options: Partial = (client && client.getOptions()) || {};\n\n let transaction = new Transaction(transactionContext, this);\n transaction = sample(transaction, options, {\n parentSampled: transactionContext.parentSampled,\n transactionContext,\n ...customSamplingContext,\n });\n if (transaction.sampled) {\n transaction.initSpanRecorder(options._experiments && (options._experiments.maxSpans as number));\n }\n return transaction;\n}\n\n/**\n * Create new idle transaction.\n */\nexport function startIdleTransaction(\n hub: Hub,\n transactionContext: TransactionContext,\n idleTimeout: number,\n finalTimeout: number,\n onScope?: boolean,\n customSamplingContext?: CustomSamplingContext,\n): IdleTransaction {\n const client = hub.getClient();\n const options: Partial = (client && client.getOptions()) || {};\n\n let transaction = new IdleTransaction(transactionContext, hub, idleTimeout, finalTimeout, onScope);\n transaction = sample(transaction, options, {\n parentSampled: transactionContext.parentSampled,\n transactionContext,\n ...customSamplingContext,\n });\n if (transaction.sampled) {\n transaction.initSpanRecorder(options._experiments && (options._experiments.maxSpans as number));\n }\n return transaction;\n}\n\n/**\n * @private\n */\nexport function _addTracingExtensions(): void {\n const carrier = getMainCarrier();\n if (!carrier.__SENTRY__) {\n return;\n }\n carrier.__SENTRY__.extensions = carrier.__SENTRY__.extensions || {};\n if (!carrier.__SENTRY__.extensions.startTransaction) {\n carrier.__SENTRY__.extensions.startTransaction = _startTransaction;\n }\n if (!carrier.__SENTRY__.extensions.traceHeaders) {\n carrier.__SENTRY__.extensions.traceHeaders = traceHeaders;\n }\n}\n\n/**\n * @private\n */\nfunction _autoloadDatabaseIntegrations(): void {\n const carrier = getMainCarrier();\n if (!carrier.__SENTRY__) {\n return;\n }\n\n const packageToIntegrationMapping: Record Integration> = {\n mongodb() {\n const integration = dynamicRequire(module, './integrations/node/mongo') as {\n Mongo: IntegrationClass;\n };\n return new integration.Mongo();\n },\n mongoose() {\n const integration = dynamicRequire(module, './integrations/node/mongo') as {\n Mongo: IntegrationClass;\n };\n return new integration.Mongo({ mongoose: true });\n },\n mysql() {\n const integration = dynamicRequire(module, './integrations/node/mysql') as {\n Mysql: IntegrationClass;\n };\n return new integration.Mysql();\n },\n pg() {\n const integration = dynamicRequire(module, './integrations/node/postgres') as {\n Postgres: IntegrationClass;\n };\n return new integration.Postgres();\n },\n };\n\n const mappedPackages = Object.keys(packageToIntegrationMapping)\n .filter(moduleName => !!loadModule(moduleName))\n .map(pkg => {\n try {\n return packageToIntegrationMapping[pkg]();\n } catch (e) {\n return undefined;\n }\n })\n .filter(p => p) as Integration[];\n\n if (mappedPackages.length > 0) {\n carrier.__SENTRY__.integrations = [...(carrier.__SENTRY__.integrations || []), ...mappedPackages];\n }\n}\n\n/**\n * This patches the global object and injects the Tracing extensions methods\n */\nexport function addExtensionMethods(): void {\n _addTracingExtensions();\n\n // Detect and automatically load specified integrations.\n if (isNodeEnv()) {\n _autoloadDatabaseIntegrations();\n }\n\n // If an error happens globally, we should make sure transaction status is set to error.\n registerErrorInstrumentation();\n}\n","/* eslint-disable max-lines */\nimport { Hub } from '@sentry/hub';\nimport { TransactionContext } from '@sentry/types';\nimport { logger, timestampWithMs } from '@sentry/utils';\n\nimport { Span, SpanRecorder } from './span';\nimport { Transaction } from './transaction';\n\nexport const DEFAULT_IDLE_TIMEOUT = 1000;\nexport const DEFAULT_FINAL_TIMEOUT = 30000;\nexport const HEARTBEAT_INTERVAL = 5000;\n\n/**\n * @inheritDoc\n */\nexport class IdleTransactionSpanRecorder extends SpanRecorder {\n public constructor(\n private readonly _pushActivity: (id: string) => void,\n private readonly _popActivity: (id: string) => void,\n public transactionSpanId: string,\n maxlen?: number,\n ) {\n super(maxlen);\n }\n\n /**\n * @inheritDoc\n */\n public add(span: Span): void {\n // We should make sure we do not push and pop activities for\n // the transaction that this span recorder belongs to.\n if (span.spanId !== this.transactionSpanId) {\n // We patch span.finish() to pop an activity after setting an endTimestamp.\n span.finish = (endTimestamp?: number) => {\n span.endTimestamp = typeof endTimestamp === 'number' ? endTimestamp : timestampWithMs();\n this._popActivity(span.spanId);\n };\n\n // We should only push new activities if the span does not have an end timestamp.\n if (span.endTimestamp === undefined) {\n this._pushActivity(span.spanId);\n }\n }\n\n super.add(span);\n }\n}\n\nexport type BeforeFinishCallback = (transactionSpan: IdleTransaction, endTimestamp: number) => void;\n\n/**\n * An IdleTransaction is a transaction that automatically finishes. It does this by tracking child spans as activities.\n * You can have multiple IdleTransactions active, but if the `onScope` option is specified, the idle transaction will\n * put itself on the scope on creation.\n */\nexport class IdleTransaction extends Transaction {\n // Activities store a list of active spans\n public activities: Record = {};\n\n // Track state of activities in previous heartbeat\n private _prevHeartbeatString: string | undefined;\n\n // Amount of times heartbeat has counted. Will cause transaction to finish after 3 beats.\n private _heartbeatCounter: number = 0;\n\n // We should not use heartbeat if we finished a transaction\n private _finished: boolean = false;\n\n private readonly _beforeFinishCallbacks: BeforeFinishCallback[] = [];\n\n /**\n * Timer that tracks Transaction idleTimeout\n */\n private _idleTimeoutID: ReturnType | undefined;\n\n public constructor(\n transactionContext: TransactionContext,\n private readonly _idleHub: Hub,\n /**\n * The time to wait in ms until the idle transaction will be finished. This timer is started each time\n * there are no active spans on this transaction.\n */\n private readonly _idleTimeout: number = DEFAULT_IDLE_TIMEOUT,\n /**\n * The final value in ms that a transaction cannot exceed\n */\n private readonly _finalTimeout: number = DEFAULT_FINAL_TIMEOUT,\n // Whether or not the transaction should put itself on the scope when it starts and pop itself off when it ends\n private readonly _onScope: boolean = false,\n ) {\n super(transactionContext, _idleHub);\n\n if (_onScope) {\n // There should only be one active transaction on the scope\n clearActiveTransaction(_idleHub);\n\n // We set the transaction here on the scope so error events pick up the trace\n // context and attach it to the error.\n __DEBUG_BUILD__ && logger.log(`Setting idle transaction on scope. Span ID: ${this.spanId}`);\n _idleHub.configureScope(scope => scope.setSpan(this));\n }\n\n this._startIdleTimeout();\n setTimeout(() => {\n if (!this._finished) {\n this.setStatus('deadline_exceeded');\n this.finish();\n }\n }, this._finalTimeout);\n }\n\n /** {@inheritDoc} */\n public finish(endTimestamp: number = timestampWithMs()): string | undefined {\n this._finished = true;\n this.activities = {};\n\n if (this.spanRecorder) {\n __DEBUG_BUILD__ &&\n logger.log('[Tracing] finishing IdleTransaction', new Date(endTimestamp * 1000).toISOString(), this.op);\n\n for (const callback of this._beforeFinishCallbacks) {\n callback(this, endTimestamp);\n }\n\n this.spanRecorder.spans = this.spanRecorder.spans.filter((span: Span) => {\n // If we are dealing with the transaction itself, we just return it\n if (span.spanId === this.spanId) {\n return true;\n }\n\n // We cancel all pending spans with status \"cancelled\" to indicate the idle transaction was finished early\n if (!span.endTimestamp) {\n span.endTimestamp = endTimestamp;\n span.setStatus('cancelled');\n __DEBUG_BUILD__ &&\n logger.log('[Tracing] cancelling span since transaction ended early', JSON.stringify(span, undefined, 2));\n }\n\n const keepSpan = span.startTimestamp < endTimestamp;\n if (!keepSpan) {\n __DEBUG_BUILD__ &&\n logger.log(\n '[Tracing] discarding Span since it happened after Transaction was finished',\n JSON.stringify(span, undefined, 2),\n );\n }\n return keepSpan;\n });\n\n __DEBUG_BUILD__ && logger.log('[Tracing] flushing IdleTransaction');\n } else {\n __DEBUG_BUILD__ && logger.log('[Tracing] No active IdleTransaction');\n }\n\n // if `this._onScope` is `true`, the transaction put itself on the scope when it started\n if (this._onScope) {\n clearActiveTransaction(this._idleHub);\n }\n\n return super.finish(endTimestamp);\n }\n\n /**\n * Register a callback function that gets excecuted before the transaction finishes.\n * Useful for cleanup or if you want to add any additional spans based on current context.\n *\n * This is exposed because users have no other way of running something before an idle transaction\n * finishes.\n */\n public registerBeforeFinishCallback(callback: BeforeFinishCallback): void {\n this._beforeFinishCallbacks.push(callback);\n }\n\n /**\n * @inheritDoc\n */\n public initSpanRecorder(maxlen?: number): void {\n if (!this.spanRecorder) {\n const pushActivity = (id: string): void => {\n if (this._finished) {\n return;\n }\n this._pushActivity(id);\n };\n const popActivity = (id: string): void => {\n if (this._finished) {\n return;\n }\n this._popActivity(id);\n };\n\n this.spanRecorder = new IdleTransactionSpanRecorder(pushActivity, popActivity, this.spanId, maxlen);\n\n // Start heartbeat so that transactions do not run forever.\n __DEBUG_BUILD__ && logger.log('Starting heartbeat');\n this._pingHeartbeat();\n }\n this.spanRecorder.add(this);\n }\n\n /**\n * Cancels the existing idletimeout, if there is one\n */\n private _cancelIdleTimeout(): void {\n if (this._idleTimeoutID) {\n clearTimeout(this._idleTimeoutID);\n this._idleTimeoutID = undefined;\n }\n }\n\n /**\n * Creates an idletimeout\n */\n private _startIdleTimeout(endTimestamp?: Parameters[0]): void {\n this._cancelIdleTimeout();\n this._idleTimeoutID = setTimeout(() => {\n if (!this._finished && Object.keys(this.activities).length === 0) {\n this.finish(endTimestamp);\n }\n }, this._idleTimeout);\n }\n\n /**\n * Start tracking a specific activity.\n * @param spanId The span id that represents the activity\n */\n private _pushActivity(spanId: string): void {\n this._cancelIdleTimeout();\n __DEBUG_BUILD__ && logger.log(`[Tracing] pushActivity: ${spanId}`);\n this.activities[spanId] = true;\n __DEBUG_BUILD__ && logger.log('[Tracing] new activities count', Object.keys(this.activities).length);\n }\n\n /**\n * Remove an activity from usage\n * @param spanId The span id that represents the activity\n */\n private _popActivity(spanId: string): void {\n if (this.activities[spanId]) {\n __DEBUG_BUILD__ && logger.log(`[Tracing] popActivity ${spanId}`);\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete this.activities[spanId];\n __DEBUG_BUILD__ && logger.log('[Tracing] new activities count', Object.keys(this.activities).length);\n }\n\n if (Object.keys(this.activities).length === 0) {\n // We need to add the timeout here to have the real endtimestamp of the transaction\n // Remember timestampWithMs is in seconds, timeout is in ms\n const endTimestamp = timestampWithMs() + this._idleTimeout / 1000;\n this._startIdleTimeout(endTimestamp);\n }\n }\n\n /**\n * Checks when entries of this.activities are not changing for 3 beats.\n * If this occurs we finish the transaction.\n */\n private _beat(): void {\n // We should not be running heartbeat if the idle transaction is finished.\n if (this._finished) {\n return;\n }\n\n const heartbeatString = Object.keys(this.activities).join('');\n\n if (heartbeatString === this._prevHeartbeatString) {\n this._heartbeatCounter += 1;\n } else {\n this._heartbeatCounter = 1;\n }\n\n this._prevHeartbeatString = heartbeatString;\n\n if (this._heartbeatCounter >= 3) {\n __DEBUG_BUILD__ && logger.log('[Tracing] Transaction finished because of no change for 3 heart beats');\n this.setStatus('deadline_exceeded');\n this.finish();\n } else {\n this._pingHeartbeat();\n }\n }\n\n /**\n * Pings the heartbeat\n */\n private _pingHeartbeat(): void {\n __DEBUG_BUILD__ && logger.log(`pinging Heartbeat -> current counter: ${this._heartbeatCounter}`);\n setTimeout(() => {\n this._beat();\n }, HEARTBEAT_INTERVAL);\n }\n}\n\n/**\n * Reset transaction on scope to `undefined`\n */\nfunction clearActiveTransaction(hub: Hub): void {\n const scope = hub.getScope();\n if (scope) {\n const transaction = scope.getTransaction();\n if (transaction) {\n scope.setSpan(undefined);\n }\n }\n}\n","import { TraceparentData } from '@sentry/types';\n\nexport const TRACEPARENT_REGEXP = new RegExp(\n '^[ \\\\t]*' + // whitespace\n '([0-9a-f]{32})?' + // trace_id\n '-?([0-9a-f]{16})?' + // span_id\n '-?([01])?' + // sampled\n '[ \\\\t]*$', // whitespace\n);\n\n/**\n * Extract transaction context data from a `sentry-trace` header.\n *\n * @param traceparent Traceparent string\n *\n * @returns Object containing data from the header, or undefined if traceparent string is malformed\n */\nexport function extractTraceparentData(traceparent: string): TraceparentData | undefined {\n const matches = traceparent.match(TRACEPARENT_REGEXP);\n\n if (!traceparent || !matches) {\n // empty string or no matches is invalid traceparent data\n return undefined;\n }\n\n let parentSampled: boolean | undefined;\n if (matches[3] === '1') {\n parentSampled = true;\n } else if (matches[3] === '0') {\n parentSampled = false;\n }\n\n return {\n traceId: matches[1],\n parentSampled,\n parentSpanId: matches[2],\n };\n}\n","import { DynamicSamplingContext } from '@sentry/types';\n\nimport { isString } from './is';\nimport { logger } from './logger';\n\nexport const BAGGAGE_HEADER_NAME = 'baggage';\n\nexport const SENTRY_BAGGAGE_KEY_PREFIX = 'sentry-';\n\nexport const SENTRY_BAGGAGE_KEY_PREFIX_REGEX = /^sentry-/;\n\n/**\n * Max length of a serialized baggage string\n *\n * https://www.w3.org/TR/baggage/#limits\n */\nexport const MAX_BAGGAGE_STRING_LENGTH = 8192;\n\n/**\n * Takes a baggage header and turns it into Dynamic Sampling Context, by extracting all the \"sentry-\" prefixed values\n * from it.\n *\n * @param baggageHeader A very bread definition of a baggage header as it might appear in various frameworks.\n * @returns The Dynamic Sampling Context that was found on `baggageHeader`, if there was any, `undefined` otherwise.\n */\nexport function baggageHeaderToDynamicSamplingContext(\n // Very liberal definition of what any incoming header might look like\n baggageHeader: string | string[] | number | null | undefined | boolean,\n): Partial | undefined {\n if (!isString(baggageHeader) && !Array.isArray(baggageHeader)) {\n return undefined;\n }\n\n // Intermediary object to store baggage key value pairs of incoming baggage headers on.\n // It is later used to read Sentry-DSC-values from.\n let baggageObject: Readonly> = {};\n\n if (Array.isArray(baggageHeader)) {\n // Combine all baggage headers into one object containing the baggage values so we can later read the Sentry-DSC-values from it\n baggageObject = baggageHeader.reduce>((acc, curr) => {\n const currBaggageObject = baggageHeaderToObject(curr);\n return {\n ...acc,\n ...currBaggageObject,\n };\n }, {});\n } else {\n // Return undefined if baggage header is an empty string (technically an empty baggage header is not spec conform but\n // this is how we choose to handle it)\n if (!baggageHeader) {\n return undefined;\n }\n\n baggageObject = baggageHeaderToObject(baggageHeader);\n }\n\n // Read all \"sentry-\" prefixed values out of the baggage object and put it onto a dynamic sampling context object.\n const dynamicSamplingContext = Object.entries(baggageObject).reduce>((acc, [key, value]) => {\n if (key.match(SENTRY_BAGGAGE_KEY_PREFIX_REGEX)) {\n const nonPrefixedKey = key.slice(SENTRY_BAGGAGE_KEY_PREFIX.length);\n acc[nonPrefixedKey] = value;\n }\n return acc;\n }, {});\n\n // Only return a dynamic sampling context object if there are keys in it.\n // A keyless object means there were no sentry values on the header, which means that there is no DSC.\n if (Object.keys(dynamicSamplingContext).length > 0) {\n return dynamicSamplingContext as Partial;\n } else {\n return undefined;\n }\n}\n\n/**\n * Turns a Dynamic Sampling Object into a baggage header by prefixing all the keys on the object with \"sentry-\".\n *\n * @param dynamicSamplingContext The Dynamic Sampling Context to turn into a header. For convenience and compatibility\n * with the `getDynamicSamplingContext` method on the Transaction class ,this argument can also be `undefined`. If it is\n * `undefined` the function will return `undefined`.\n * @returns a baggage header, created from `dynamicSamplingContext`, or `undefined` either if `dynamicSamplingContext`\n * was `undefined`, or if `dynamicSamplingContext` didn't contain any values.\n */\nexport function dynamicSamplingContextToSentryBaggageHeader(\n // this also takes undefined for convenience and bundle size in other places\n dynamicSamplingContext: Partial,\n): string | undefined {\n // Prefix all DSC keys with \"sentry-\" and put them into a new object\n const sentryPrefixedDSC = Object.entries(dynamicSamplingContext).reduce>(\n (acc, [dscKey, dscValue]) => {\n if (dscValue) {\n acc[`${SENTRY_BAGGAGE_KEY_PREFIX}${dscKey}`] = dscValue;\n }\n return acc;\n },\n {},\n );\n\n return objectToBaggageHeader(sentryPrefixedDSC);\n}\n\n/**\n * Will parse a baggage header, which is a simple key-value map, into a flat object.\n *\n * @param baggageHeader The baggage header to parse.\n * @returns a flat object containing all the key-value pairs from `baggageHeader`.\n */\nfunction baggageHeaderToObject(baggageHeader: string): Record {\n return baggageHeader\n .split(',')\n .map(baggageEntry => baggageEntry.split('=').map(keyOrValue => decodeURIComponent(keyOrValue.trim())))\n .reduce>((acc, [key, value]) => {\n acc[key] = value;\n return acc;\n }, {});\n}\n\n/**\n * Turns a flat object (key-value pairs) into a baggage header, which is also just key-value pairs.\n *\n * @param object The object to turn into a baggage header.\n * @returns a baggage header string, or `undefined` if the object didn't have any values, since an empty baggage header\n * is not spec compliant.\n */\nfunction objectToBaggageHeader(object: Record): string | undefined {\n if (Object.keys(object).length === 0) {\n // An empty baggage header is not spec compliant: We return undefined.\n return undefined;\n }\n\n return Object.entries(object).reduce((baggageHeader, [objectKey, objectValue], currentIndex) => {\n const baggageEntry = `${encodeURIComponent(objectKey)}=${encodeURIComponent(objectValue)}`;\n const newBaggageHeader = currentIndex === 0 ? baggageEntry : `${baggageHeader},${baggageEntry}`;\n if (newBaggageHeader.length > MAX_BAGGAGE_STRING_LENGTH) {\n __DEBUG_BUILD__ &&\n logger.warn(\n `Not adding key: ${objectKey} with val: ${objectValue} to baggage header due to exceeding baggage size limits.`,\n );\n return baggageHeader;\n } else {\n return newBaggageHeader;\n }\n }, '');\n}\n","import { getGlobalObject, logger } from '@sentry/utils';\n\nimport { IdleTransaction } from '../idletransaction';\nimport { SpanStatusType } from '../span';\nimport { getActiveTransaction } from '../utils';\n\nconst global = getGlobalObject();\n\n/**\n * Add a listener that cancels and finishes a transaction when the global\n * document is hidden.\n */\nexport function registerBackgroundTabDetection(): void {\n if (global && global.document) {\n global.document.addEventListener('visibilitychange', () => {\n const activeTransaction = getActiveTransaction() as IdleTransaction;\n if (global.document.hidden && activeTransaction) {\n const statusType: SpanStatusType = 'cancelled';\n\n __DEBUG_BUILD__ &&\n logger.log(\n `[Tracing] Transaction: ${statusType} -> since tab moved to the background, op: ${activeTransaction.op}`,\n );\n // We should not set status if it is already set, this prevent important statuses like\n // error or data loss from being overwritten on transaction.\n if (!activeTransaction.status) {\n activeTransaction.setStatus(statusType);\n }\n activeTransaction.setTag('visibilitychange', 'document.hidden');\n activeTransaction.finish();\n }\n });\n } else {\n __DEBUG_BUILD__ &&\n logger.warn('[Tracing] Could not set up background tab detection due to lack of global document');\n }\n}\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Metric, ReportHandler } from '../types';\n\nexport const bindReporter = (\n callback: ReportHandler,\n metric: Metric,\n reportAllChanges?: boolean,\n): ((forceReport?: boolean) => void) => {\n let prevValue: number;\n return (forceReport?: boolean) => {\n if (metric.value >= 0) {\n if (forceReport || reportAllChanges) {\n metric.delta = metric.value - (prevValue || 0);\n\n // Report the metric if there's a non-zero delta or if no previous\n // value exists (which can happen in the case of the document becoming\n // hidden when the metric value is 0).\n // See: https://github.com/GoogleChrome/web-vitals/issues/14\n if (metric.delta || prevValue === undefined) {\n prevValue = metric.value;\n callback(metric);\n }\n }\n }\n };\n};\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Performantly generate a unique, 30-char string by combining a version\n * number, the current timestamp with a 13-digit number integer.\n * @return {string}\n */\nexport const generateUniqueID = (): string => {\n return `v2-${Date.now()}-${Math.floor(Math.random() * (9e12 - 1)) + 1e12}`;\n};\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport interface PerformanceEntryHandler {\n (entry: PerformanceEntry): void;\n}\n\n/**\n * Takes a performance entry type and a callback function, and creates a\n * `PerformanceObserver` instance that will observe the specified entry type\n * with buffering enabled and call the callback _for each entry_.\n *\n * This function also feature-detects entry support and wraps the logic in a\n * try/catch to avoid errors in unsupporting browsers.\n */\nexport const observe = (type: string, callback: PerformanceEntryHandler): PerformanceObserver | undefined => {\n try {\n if (PerformanceObserver.supportedEntryTypes.includes(type)) {\n // More extensive feature detect needed for Firefox due to:\n // https://github.com/GoogleChrome/web-vitals/issues/142\n if (type === 'first-input' && !('PerformanceEventTiming' in self)) {\n return;\n }\n\n const po: PerformanceObserver = new PerformanceObserver(l => l.getEntries().map(callback));\n\n po.observe({ type, buffered: true });\n return po;\n }\n } catch (e) {\n // Do nothing.\n }\n return;\n};\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getGlobalObject } from '@sentry/utils';\n\nexport interface OnHiddenCallback {\n (event: Event): void;\n}\n\nexport const onHidden = (cb: OnHiddenCallback, once?: boolean): void => {\n const onHiddenOrPageHide = (event: Event): void => {\n if (event.type === 'pagehide' || getGlobalObject().document.visibilityState === 'hidden') {\n cb(event);\n if (once) {\n removeEventListener('visibilitychange', onHiddenOrPageHide, true);\n removeEventListener('pagehide', onHiddenOrPageHide, true);\n }\n }\n };\n addEventListener('visibilitychange', onHiddenOrPageHide, true);\n // Some browsers have buggy implementations of visibilitychange,\n // so we use pagehide in addition, just to be safe.\n addEventListener('pagehide', onHiddenOrPageHide, true);\n};\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getGlobalObject } from '@sentry/utils';\n\nimport { onHidden } from './onHidden';\n\nlet firstHiddenTime = -1;\n\nconst initHiddenTime = (): number => {\n return getGlobalObject().document.visibilityState === 'hidden' ? 0 : Infinity;\n};\n\nconst trackChanges = (): void => {\n // Update the time if/when the document becomes hidden.\n onHidden(({ timeStamp }) => {\n firstHiddenTime = timeStamp;\n }, true);\n};\n\nexport const getVisibilityWatcher = (): {\n readonly firstHiddenTime: number;\n} => {\n if (firstHiddenTime < 0) {\n // If the document is hidden when this code runs, assume it was hidden\n // since navigation start. This isn't a perfect heuristic, but it's the\n // best we can do until an API is available to support querying past\n // visibilityState.\n firstHiddenTime = initHiddenTime();\n trackChanges();\n }\n return {\n get firstHiddenTime() {\n return firstHiddenTime;\n },\n };\n};\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { bindReporter } from './lib/bindReporter';\nimport { getVisibilityWatcher } from './lib/getVisibilityWatcher';\nimport { initMetric } from './lib/initMetric';\nimport { observe, PerformanceEntryHandler } from './lib/observe';\nimport { onHidden } from './lib/onHidden';\nimport { ReportHandler } from './types';\n\n// https://wicg.github.io/largest-contentful-paint/#sec-largest-contentful-paint-interface\nexport interface LargestContentfulPaint extends PerformanceEntry {\n renderTime: DOMHighResTimeStamp;\n loadTime: DOMHighResTimeStamp;\n size: number;\n id: string;\n url: string;\n element?: Element;\n toJSON(): Record;\n}\n\nconst reportedMetricIDs: Record = {};\n\nexport const getLCP = (onReport: ReportHandler, reportAllChanges?: boolean): void => {\n const visibilityWatcher = getVisibilityWatcher();\n const metric = initMetric('LCP');\n let report: ReturnType;\n\n const entryHandler = (entry: PerformanceEntry): void => {\n // The startTime attribute returns the value of the renderTime if it is not 0,\n // and the value of the loadTime otherwise.\n const value = entry.startTime;\n\n // If the page was hidden prior to paint time of the entry,\n // ignore it and mark the metric as final, otherwise add the entry.\n if (value < visibilityWatcher.firstHiddenTime) {\n metric.value = value;\n metric.entries.push(entry);\n }\n\n if (report) {\n report();\n }\n };\n\n const po = observe('largest-contentful-paint', entryHandler);\n\n if (po) {\n report = bindReporter(onReport, metric, reportAllChanges);\n\n const stopListening = (): void => {\n if (!reportedMetricIDs[metric.id]) {\n po.takeRecords().map(entryHandler as PerformanceEntryHandler);\n po.disconnect();\n reportedMetricIDs[metric.id] = true;\n report(true);\n }\n };\n\n // Stop listening after input. Note: while scrolling is an input that\n // stop LCP observation, it's unreliable since it can be programmatically\n // generated. See: https://github.com/GoogleChrome/web-vitals/issues/75\n ['keydown', 'click'].forEach(type => {\n addEventListener(type, stopListening, { once: true, capture: true });\n });\n\n onHidden(stopListening, true);\n }\n};\n","import objectWithoutPropertiesLoose from \"./objectWithoutPropertiesLoose.js\";\nexport default function _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n}","export default function _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}","import { Span, SpanContext } from '@sentry/types';\n\nimport { Transaction } from '../../transaction';\n\n/**\n * Checks if a given value is a valid measurement value.\n */\nexport function isMeasurementValue(value: unknown): value is number {\n return typeof value === 'number' && isFinite(value);\n}\n\n/**\n * Helper function to start child on transactions. This function will make sure that the transaction will\n * use the start timestamp of the created child span if it is earlier than the transactions actual\n * start timestamp.\n */\nexport function _startChild(transaction: Transaction, { startTimestamp, ...ctx }: SpanContext): Span {\n if (startTimestamp && transaction.startTimestamp > startTimestamp) {\n transaction.startTimestamp = startTimestamp;\n }\n\n return transaction.startChild({\n startTimestamp,\n ...ctx,\n });\n}\n","/* eslint-disable max-lines */\nimport { Measurements } from '@sentry/types';\nimport { browserPerformanceTimeOrigin, getGlobalObject, htmlTreeAsString, logger } from '@sentry/utils';\n\nimport { IdleTransaction } from '../../idletransaction';\nimport { Transaction } from '../../transaction';\nimport { getActiveTransaction, msToSec } from '../../utils';\nimport { getCLS, LayoutShift } from '../web-vitals/getCLS';\nimport { getFID } from '../web-vitals/getFID';\nimport { getLCP, LargestContentfulPaint } from '../web-vitals/getLCP';\nimport { getVisibilityWatcher } from '../web-vitals/lib/getVisibilityWatcher';\nimport { observe, PerformanceEntryHandler } from '../web-vitals/lib/observe';\nimport { NavigatorDeviceMemory, NavigatorNetworkInformation } from '../web-vitals/types';\nimport { _startChild, isMeasurementValue } from './utils';\n\nconst global = getGlobalObject();\n\nfunction getBrowserPerformanceAPI(): Performance | undefined {\n return global && global.addEventListener && global.performance;\n}\n\nlet _performanceCursor: number = 0;\n\nlet _measurements: Measurements = {};\nlet _lcpEntry: LargestContentfulPaint | undefined;\nlet _clsEntry: LayoutShift | undefined;\n\n/**\n * Start tracking web vitals\n */\nexport function startTrackingWebVitals(reportAllChanges: boolean = false): void {\n const performance = getBrowserPerformanceAPI();\n if (performance && browserPerformanceTimeOrigin) {\n if (performance.mark) {\n global.performance.mark('sentry-tracing-init');\n }\n _trackCLS();\n _trackLCP(reportAllChanges);\n _trackFID();\n }\n}\n\n/**\n * Start tracking long tasks.\n */\nexport function startTrackingLongTasks(): void {\n const entryHandler: PerformanceEntryHandler = (entry: PerformanceEntry): void => {\n const transaction = getActiveTransaction() as IdleTransaction | undefined;\n if (!transaction) {\n return;\n }\n const startTime = msToSec((browserPerformanceTimeOrigin as number) + entry.startTime);\n const duration = msToSec(entry.duration);\n transaction.startChild({\n description: 'Main UI thread blocked',\n op: 'ui.long-task',\n startTimestamp: startTime,\n endTimestamp: startTime + duration,\n });\n };\n\n observe('longtask', entryHandler);\n}\n\n/** Starts tracking the Cumulative Layout Shift on the current page. */\nfunction _trackCLS(): void {\n // See:\n // https://web.dev/evolving-cls/\n // https://web.dev/cls-web-tooling/\n getCLS(metric => {\n const entry = metric.entries.pop();\n if (!entry) {\n return;\n }\n\n __DEBUG_BUILD__ && logger.log('[Measurements] Adding CLS');\n _measurements['cls'] = { value: metric.value, unit: '' };\n _clsEntry = entry as LayoutShift;\n });\n}\n\n/** Starts tracking the Largest Contentful Paint on the current page. */\nfunction _trackLCP(reportAllChanges: boolean): void {\n getLCP(metric => {\n const entry = metric.entries.pop();\n if (!entry) {\n return;\n }\n\n __DEBUG_BUILD__ && logger.log('[Measurements] Adding LCP');\n _measurements['lcp'] = { value: metric.value, unit: 'millisecond' };\n _lcpEntry = entry as LargestContentfulPaint;\n }, reportAllChanges);\n}\n\n/** Starts tracking the First Input Delay on the current page. */\nfunction _trackFID(): void {\n getFID(metric => {\n const entry = metric.entries.pop();\n if (!entry) {\n return;\n }\n\n const timeOrigin = msToSec(browserPerformanceTimeOrigin as number);\n const startTime = msToSec(entry.startTime);\n __DEBUG_BUILD__ && logger.log('[Measurements] Adding FID');\n _measurements['fid'] = { value: metric.value, unit: 'millisecond' };\n _measurements['mark.fid'] = { value: timeOrigin + startTime, unit: 'second' };\n });\n}\n\n/** Add performance related spans to a transaction */\nexport function addPerformanceEntries(transaction: Transaction): void {\n const performance = getBrowserPerformanceAPI();\n if (!performance || !global.performance.getEntries || !browserPerformanceTimeOrigin) {\n // Gatekeeper if performance API not available\n return;\n }\n\n __DEBUG_BUILD__ && logger.log('[Tracing] Adding & adjusting spans using Performance API');\n const timeOrigin = msToSec(browserPerformanceTimeOrigin);\n\n const performanceEntries = performance.getEntries();\n\n let responseStartTimestamp: number | undefined;\n let requestStartTimestamp: number | undefined;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n performanceEntries.slice(_performanceCursor).forEach((entry: Record) => {\n const startTime = msToSec(entry.startTime);\n const duration = msToSec(entry.duration);\n\n if (transaction.op === 'navigation' && timeOrigin + startTime < transaction.startTimestamp) {\n return;\n }\n\n switch (entry.entryType) {\n case 'navigation': {\n _addNavigationSpans(transaction, entry, timeOrigin);\n responseStartTimestamp = timeOrigin + msToSec(entry.responseStart);\n requestStartTimestamp = timeOrigin + msToSec(entry.requestStart);\n break;\n }\n case 'mark':\n case 'paint':\n case 'measure': {\n _addMeasureSpans(transaction, entry, startTime, duration, timeOrigin);\n\n // capture web vitals\n const firstHidden = getVisibilityWatcher();\n // Only report if the page wasn't hidden prior to the web vital.\n const shouldRecord = entry.startTime < firstHidden.firstHiddenTime;\n\n if (entry.name === 'first-paint' && shouldRecord) {\n __DEBUG_BUILD__ && logger.log('[Measurements] Adding FP');\n _measurements['fp'] = { value: entry.startTime, unit: 'millisecond' };\n }\n if (entry.name === 'first-contentful-paint' && shouldRecord) {\n __DEBUG_BUILD__ && logger.log('[Measurements] Adding FCP');\n _measurements['fcp'] = { value: entry.startTime, unit: 'millisecond' };\n }\n break;\n }\n case 'resource': {\n const resourceName = (entry.name as string).replace(global.location.origin, '');\n _addResourceSpans(transaction, entry, resourceName, startTime, duration, timeOrigin);\n break;\n }\n default:\n // Ignore other entry types.\n }\n });\n\n _performanceCursor = Math.max(performanceEntries.length - 1, 0);\n\n _trackNavigator(transaction);\n\n // Measurements are only available for pageload transactions\n if (transaction.op === 'pageload') {\n // Generate TTFB (Time to First Byte), which measured as the time between the beginning of the transaction and the\n // start of the response in milliseconds\n if (typeof responseStartTimestamp === 'number') {\n __DEBUG_BUILD__ && logger.log('[Measurements] Adding TTFB');\n _measurements['ttfb'] = {\n value: (responseStartTimestamp - transaction.startTimestamp) * 1000,\n unit: 'millisecond',\n };\n\n if (typeof requestStartTimestamp === 'number' && requestStartTimestamp <= responseStartTimestamp) {\n // Capture the time spent making the request and receiving the first byte of the response.\n // This is the time between the start of the request and the start of the response in milliseconds.\n _measurements['ttfb.requestTime'] = {\n value: (responseStartTimestamp - requestStartTimestamp) * 1000,\n unit: 'millisecond',\n };\n }\n }\n\n ['fcp', 'fp', 'lcp'].forEach(name => {\n if (!_measurements[name] || timeOrigin >= transaction.startTimestamp) {\n return;\n }\n // The web vitals, fcp, fp, lcp, and ttfb, all measure relative to timeOrigin.\n // Unfortunately, timeOrigin is not captured within the transaction span data, so these web vitals will need\n // to be adjusted to be relative to transaction.startTimestamp.\n const oldValue = _measurements[name].value;\n const measurementTimestamp = timeOrigin + msToSec(oldValue);\n\n // normalizedValue should be in milliseconds\n const normalizedValue = Math.abs((measurementTimestamp - transaction.startTimestamp) * 1000);\n const delta = normalizedValue - oldValue;\n\n __DEBUG_BUILD__ &&\n logger.log(`[Measurements] Normalized ${name} from ${oldValue} to ${normalizedValue} (${delta})`);\n _measurements[name].value = normalizedValue;\n });\n\n const fidMark = _measurements['mark.fid'];\n if (fidMark && _measurements['fid']) {\n // create span for FID\n _startChild(transaction, {\n description: 'first input delay',\n endTimestamp: fidMark.value + msToSec(_measurements['fid'].value),\n op: 'web.vitals',\n startTimestamp: fidMark.value,\n });\n\n // Delete mark.fid as we don't want it to be part of final payload\n delete _measurements['mark.fid'];\n }\n\n // If FCP is not recorded we should not record the cls value\n // according to the new definition of CLS.\n if (!('fcp' in _measurements)) {\n delete _measurements.cls;\n }\n\n Object.keys(_measurements).forEach(measurementName => {\n transaction.setMeasurement(\n measurementName,\n _measurements[measurementName].value,\n _measurements[measurementName].unit,\n );\n });\n\n _tagMetricInfo(transaction);\n }\n\n _lcpEntry = undefined;\n _clsEntry = undefined;\n _measurements = {};\n}\n\n/** Create measure related spans */\nexport function _addMeasureSpans(\n transaction: Transaction,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n entry: Record,\n startTime: number,\n duration: number,\n timeOrigin: number,\n): number {\n const measureStartTimestamp = timeOrigin + startTime;\n const measureEndTimestamp = measureStartTimestamp + duration;\n\n _startChild(transaction, {\n description: entry.name as string,\n endTimestamp: measureEndTimestamp,\n op: entry.entryType as string,\n startTimestamp: measureStartTimestamp,\n });\n\n return measureStartTimestamp;\n}\n\n/** Instrument navigation entries */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _addNavigationSpans(transaction: Transaction, entry: Record, timeOrigin: number): void {\n ['unloadEvent', 'redirect', 'domContentLoadedEvent', 'loadEvent', 'connect'].forEach(event => {\n _addPerformanceNavigationTiming(transaction, entry, event, timeOrigin);\n });\n _addPerformanceNavigationTiming(transaction, entry, 'secureConnection', timeOrigin, 'TLS/SSL', 'connectEnd');\n _addPerformanceNavigationTiming(transaction, entry, 'fetch', timeOrigin, 'cache', 'domainLookupStart');\n _addPerformanceNavigationTiming(transaction, entry, 'domainLookup', timeOrigin, 'DNS');\n _addRequest(transaction, entry, timeOrigin);\n}\n\n/** Create performance navigation related spans */\nfunction _addPerformanceNavigationTiming(\n transaction: Transaction,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n entry: Record,\n event: string,\n timeOrigin: number,\n description?: string,\n eventEnd?: string,\n): void {\n const end = eventEnd ? (entry[eventEnd] as number | undefined) : (entry[`${event}End`] as number | undefined);\n const start = entry[`${event}Start`] as number | undefined;\n if (!start || !end) {\n return;\n }\n _startChild(transaction, {\n op: 'browser',\n description: description ?? event,\n startTimestamp: timeOrigin + msToSec(start),\n endTimestamp: timeOrigin + msToSec(end),\n });\n}\n\n/** Create request and response related spans */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _addRequest(transaction: Transaction, entry: Record, timeOrigin: number): void {\n _startChild(transaction, {\n op: 'browser',\n description: 'request',\n startTimestamp: timeOrigin + msToSec(entry.requestStart as number),\n endTimestamp: timeOrigin + msToSec(entry.responseEnd as number),\n });\n\n _startChild(transaction, {\n op: 'browser',\n description: 'response',\n startTimestamp: timeOrigin + msToSec(entry.responseStart as number),\n endTimestamp: timeOrigin + msToSec(entry.responseEnd as number),\n });\n}\n\nexport interface ResourceEntry extends Record {\n initiatorType?: string;\n transferSize?: number;\n encodedBodySize?: number;\n decodedBodySize?: number;\n}\n\n/** Create resource-related spans */\nexport function _addResourceSpans(\n transaction: Transaction,\n entry: ResourceEntry,\n resourceName: string,\n startTime: number,\n duration: number,\n timeOrigin: number,\n): void {\n // we already instrument based on fetch and xhr, so we don't need to\n // duplicate spans here.\n if (entry.initiatorType === 'xmlhttprequest' || entry.initiatorType === 'fetch') {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const data: Record = {};\n if ('transferSize' in entry) {\n data['Transfer Size'] = entry.transferSize;\n }\n if ('encodedBodySize' in entry) {\n data['Encoded Body Size'] = entry.encodedBodySize;\n }\n if ('decodedBodySize' in entry) {\n data['Decoded Body Size'] = entry.decodedBodySize;\n }\n\n const startTimestamp = timeOrigin + startTime;\n const endTimestamp = startTimestamp + duration;\n\n _startChild(transaction, {\n description: resourceName,\n endTimestamp,\n op: entry.initiatorType ? `resource.${entry.initiatorType}` : 'resource',\n startTimestamp,\n data,\n });\n}\n\n/**\n * Capture the information of the user agent.\n */\nfunction _trackNavigator(transaction: Transaction): void {\n const navigator = global.navigator as null | (Navigator & NavigatorNetworkInformation & NavigatorDeviceMemory);\n if (!navigator) {\n return;\n }\n\n // track network connectivity\n const connection = navigator.connection;\n if (connection) {\n if (connection.effectiveType) {\n transaction.setTag('effectiveConnectionType', connection.effectiveType);\n }\n\n if (connection.type) {\n transaction.setTag('connectionType', connection.type);\n }\n\n if (isMeasurementValue(connection.rtt)) {\n _measurements['connection.rtt'] = { value: connection.rtt, unit: 'millisecond' };\n }\n\n if (isMeasurementValue(connection.downlink)) {\n _measurements['connection.downlink'] = { value: connection.downlink, unit: '' }; // unit is empty string for now, while relay doesn't support download speed units\n }\n }\n\n if (isMeasurementValue(navigator.deviceMemory)) {\n transaction.setTag('deviceMemory', `${navigator.deviceMemory} GB`);\n }\n\n if (isMeasurementValue(navigator.hardwareConcurrency)) {\n transaction.setTag('hardwareConcurrency', String(navigator.hardwareConcurrency));\n }\n}\n\n/** Add LCP / CLS data to transaction to allow debugging */\nfunction _tagMetricInfo(transaction: Transaction): void {\n if (_lcpEntry) {\n __DEBUG_BUILD__ && logger.log('[Measurements] Adding LCP Data');\n\n // Capture Properties of the LCP element that contributes to the LCP.\n\n if (_lcpEntry.element) {\n transaction.setTag('lcp.element', htmlTreeAsString(_lcpEntry.element));\n }\n\n if (_lcpEntry.id) {\n transaction.setTag('lcp.id', _lcpEntry.id);\n }\n\n if (_lcpEntry.url) {\n // Trim URL to the first 200 characters.\n transaction.setTag('lcp.url', _lcpEntry.url.trim().slice(0, 200));\n }\n\n transaction.setTag('lcp.size', _lcpEntry.size);\n }\n\n // See: https://developer.mozilla.org/en-US/docs/Web/API/LayoutShift\n if (_clsEntry && _clsEntry.sources) {\n __DEBUG_BUILD__ && logger.log('[Measurements] Adding CLS Data');\n _clsEntry.sources.forEach((source, index) =>\n transaction.setTag(`cls.source.${index + 1}`, htmlTreeAsString(source.node)),\n );\n }\n}\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { bindReporter } from './lib/bindReporter';\nimport { initMetric } from './lib/initMetric';\nimport { observe, PerformanceEntryHandler } from './lib/observe';\nimport { onHidden } from './lib/onHidden';\nimport { ReportHandler } from './types';\n\n// https://wicg.github.io/layout-instability/#sec-layout-shift\nexport interface LayoutShift extends PerformanceEntry {\n value: number;\n hadRecentInput: boolean;\n sources: Array;\n toJSON(): Record;\n}\n\nexport interface LayoutShiftAttribution {\n node?: Node;\n previousRect: DOMRectReadOnly;\n currentRect: DOMRectReadOnly;\n}\n\nexport const getCLS = (onReport: ReportHandler, reportAllChanges?: boolean): void => {\n const metric = initMetric('CLS', 0);\n let report: ReturnType;\n\n let sessionValue = 0;\n let sessionEntries: PerformanceEntry[] = [];\n\n const entryHandler = (entry: LayoutShift): void => {\n // Only count layout shifts without recent user input.\n // TODO: Figure out why entry can be undefined\n if (entry && !entry.hadRecentInput) {\n const firstSessionEntry = sessionEntries[0];\n const lastSessionEntry = sessionEntries[sessionEntries.length - 1];\n\n // If the entry occurred less than 1 second after the previous entry and\n // less than 5 seconds after the first entry in the session, include the\n // entry in the current session. Otherwise, start a new session.\n if (\n sessionValue &&\n sessionEntries.length !== 0 &&\n entry.startTime - lastSessionEntry.startTime < 1000 &&\n entry.startTime - firstSessionEntry.startTime < 5000\n ) {\n sessionValue += entry.value;\n sessionEntries.push(entry);\n } else {\n sessionValue = entry.value;\n sessionEntries = [entry];\n }\n\n // If the current session value is larger than the current CLS value,\n // update CLS and the entries contributing to it.\n if (sessionValue > metric.value) {\n metric.value = sessionValue;\n metric.entries = sessionEntries;\n if (report) {\n report();\n }\n }\n }\n };\n\n const po = observe('layout-shift', entryHandler as PerformanceEntryHandler);\n if (po) {\n report = bindReporter(onReport, metric, reportAllChanges);\n\n onHidden(() => {\n po.takeRecords().map(entryHandler as PerformanceEntryHandler);\n report(true);\n });\n }\n};\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { bindReporter } from './lib/bindReporter';\nimport { getVisibilityWatcher } from './lib/getVisibilityWatcher';\nimport { initMetric } from './lib/initMetric';\nimport { observe, PerformanceEntryHandler } from './lib/observe';\nimport { onHidden } from './lib/onHidden';\nimport { PerformanceEventTiming, ReportHandler } from './types';\n\nexport const getFID = (onReport: ReportHandler, reportAllChanges?: boolean): void => {\n const visibilityWatcher = getVisibilityWatcher();\n const metric = initMetric('FID');\n let report: ReturnType;\n\n const entryHandler = (entry: PerformanceEventTiming): void => {\n // Only report if the page wasn't hidden prior to the first input.\n if (report && entry.startTime < visibilityWatcher.firstHiddenTime) {\n metric.value = entry.processingStart - entry.startTime;\n metric.entries.push(entry);\n report(true);\n }\n };\n\n const po = observe('first-input', entryHandler as PerformanceEntryHandler);\n if (po) {\n report = bindReporter(onReport, metric, reportAllChanges);\n onHidden(() => {\n po.takeRecords().map(entryHandler as PerformanceEntryHandler);\n po.disconnect();\n }, true);\n }\n};\n","/* eslint-disable max-lines */\nimport type { DynamicSamplingContext, Span } from '@sentry/types';\nimport {\n addInstrumentationHandler,\n BAGGAGE_HEADER_NAME,\n dynamicSamplingContextToSentryBaggageHeader,\n isInstanceOf,\n isMatchingPattern,\n} from '@sentry/utils';\n\nimport { getActiveTransaction, hasTracingEnabled } from '../utils';\n\nexport const DEFAULT_TRACING_ORIGINS = ['localhost', /^\\//];\n\n/** Options for Request Instrumentation */\nexport interface RequestInstrumentationOptions {\n /**\n * List of strings / regex where the integration should create Spans out of. Additionally this will be used\n * to define which outgoing requests the `sentry-trace` header will be attached to.\n *\n * Default: ['localhost', /^\\//] {@see DEFAULT_TRACING_ORIGINS}\n */\n tracingOrigins: Array;\n\n /**\n * Flag to disable patching all together for fetch requests.\n *\n * Default: true\n */\n traceFetch: boolean;\n\n /**\n * Flag to disable patching all together for xhr requests.\n *\n * Default: true\n */\n traceXHR: boolean;\n\n /**\n * This function will be called before creating a span for a request with the given url.\n * Return false if you don't want a span for the given url.\n *\n * By default it uses the `tracingOrigins` options as a url match.\n */\n shouldCreateSpanForRequest?(url: string): boolean;\n}\n\n/** Data returned from fetch callback */\nexport interface FetchData {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n args: any[]; // the arguments passed to the fetch call itself\n fetchData?: {\n method: string;\n url: string;\n // span_id\n __span?: string;\n };\n\n // TODO Should this be unknown instead? If we vendor types, make it a Response\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n response?: any;\n error?: unknown;\n\n startTimestamp: number;\n endTimestamp?: number;\n}\n\n/** Data returned from XHR request */\nexport interface XHRData {\n xhr?: {\n __sentry_xhr__?: {\n method: string;\n url: string;\n status_code: number;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data: Record;\n };\n __sentry_xhr_span_id__?: string;\n setRequestHeader?: (key: string, val: string) => void;\n getRequestHeader?: (key: string) => string;\n __sentry_own_request__?: boolean;\n };\n startTimestamp: number;\n endTimestamp?: number;\n}\n\ntype PolymorphicRequestHeaders =\n | Record\n | Array<[string, string]>\n // the below is not preicsely the Header type used in Request, but it'll pass duck-typing\n | {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any;\n append: (key: string, value: string) => void;\n get: (key: string) => string;\n };\n\nexport const defaultRequestInstrumentationOptions: RequestInstrumentationOptions = {\n traceFetch: true,\n traceXHR: true,\n tracingOrigins: DEFAULT_TRACING_ORIGINS,\n};\n\n/** Registers span creators for xhr and fetch requests */\nexport function instrumentOutgoingRequests(_options?: Partial): void {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const { traceFetch, traceXHR, tracingOrigins, shouldCreateSpanForRequest } = {\n ...defaultRequestInstrumentationOptions,\n ..._options,\n };\n\n // We should cache url -> decision so that we don't have to compute\n // regexp everytime we create a request.\n const urlMap: Record = {};\n\n const defaultShouldCreateSpan = (url: string): boolean => {\n if (urlMap[url]) {\n return urlMap[url];\n }\n const origins = tracingOrigins;\n urlMap[url] =\n origins.some((origin: string | RegExp) => isMatchingPattern(url, origin)) &&\n !isMatchingPattern(url, 'sentry_key');\n return urlMap[url];\n };\n\n // We want that our users don't have to re-implement shouldCreateSpanForRequest themselves\n // That's why we filter out already unwanted Spans from tracingOrigins\n let shouldCreateSpan = defaultShouldCreateSpan;\n if (typeof shouldCreateSpanForRequest === 'function') {\n shouldCreateSpan = (url: string) => {\n return defaultShouldCreateSpan(url) && shouldCreateSpanForRequest(url);\n };\n }\n\n const spans: Record = {};\n\n if (traceFetch) {\n addInstrumentationHandler('fetch', (handlerData: FetchData) => {\n fetchCallback(handlerData, shouldCreateSpan, spans);\n });\n }\n\n if (traceXHR) {\n addInstrumentationHandler('xhr', (handlerData: XHRData) => {\n xhrCallback(handlerData, shouldCreateSpan, spans);\n });\n }\n}\n\n/**\n * Create and track fetch request spans\n */\nexport function fetchCallback(\n handlerData: FetchData,\n shouldCreateSpan: (url: string) => boolean,\n spans: Record,\n): void {\n if (!hasTracingEnabled() || !(handlerData.fetchData && shouldCreateSpan(handlerData.fetchData.url))) {\n return;\n }\n\n if (handlerData.endTimestamp) {\n const spanId = handlerData.fetchData.__span;\n if (!spanId) return;\n\n const span = spans[spanId];\n if (span) {\n if (handlerData.response) {\n // TODO (kmclb) remove this once types PR goes through\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n span.setHttpStatus(handlerData.response.status);\n } else if (handlerData.error) {\n span.setStatus('internal_error');\n }\n span.finish();\n\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete spans[spanId];\n }\n return;\n }\n\n const activeTransaction = getActiveTransaction();\n if (activeTransaction) {\n const span = activeTransaction.startChild({\n data: {\n ...handlerData.fetchData,\n type: 'fetch',\n },\n description: `${handlerData.fetchData.method} ${handlerData.fetchData.url}`,\n op: 'http.client',\n });\n\n handlerData.fetchData.__span = span.spanId;\n spans[span.spanId] = span;\n\n const request: string | Request = handlerData.args[0];\n\n // In case the user hasn't set the second argument of a fetch call we default it to `{}`.\n handlerData.args[1] = handlerData.args[1] || {};\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const options: { [key: string]: any } = handlerData.args[1];\n\n options.headers = addTracingHeadersToFetchRequest(\n request,\n activeTransaction.getDynamicSamplingContext(),\n span,\n options,\n );\n\n activeTransaction.metadata.propagations += 1;\n }\n}\n\nfunction addTracingHeadersToFetchRequest(\n request: string | Request,\n dynamicSamplingContext: Partial,\n span: Span,\n options: {\n headers?:\n | {\n [key: string]: string[] | string | undefined;\n }\n | Request['headers'];\n },\n): PolymorphicRequestHeaders {\n const sentryBaggageHeader = dynamicSamplingContextToSentryBaggageHeader(dynamicSamplingContext);\n const sentryTraceHeader = span.toTraceparent();\n\n const headers =\n typeof Request !== 'undefined' && isInstanceOf(request, Request) ? (request as Request).headers : options.headers;\n\n if (!headers) {\n return { 'sentry-trace': sentryTraceHeader, baggage: sentryBaggageHeader };\n } else if (typeof Headers !== 'undefined' && isInstanceOf(headers, Headers)) {\n const newHeaders = new Headers(headers as Headers);\n\n newHeaders.append('sentry-trace', sentryTraceHeader);\n\n if (sentryBaggageHeader) {\n // If the same header is appended miultiple times the browser will merge the values into a single request header.\n // Its therefore safe to simply push a \"baggage\" entry, even though there might already be another baggage header.\n newHeaders.append(BAGGAGE_HEADER_NAME, sentryBaggageHeader);\n }\n\n return newHeaders as PolymorphicRequestHeaders;\n } else if (Array.isArray(headers)) {\n const newHeaders = [...headers, ['sentry-trace', sentryTraceHeader]];\n\n if (sentryBaggageHeader) {\n // If there are multiple entries with the same key, the browser will merge the values into a single request header.\n // Its therefore safe to simply push a \"baggage\" entry, even though there might already be another baggage header.\n newHeaders.push([BAGGAGE_HEADER_NAME, sentryBaggageHeader]);\n }\n\n return newHeaders;\n } else {\n const existingBaggageHeader = 'baggage' in headers ? headers.baggage : undefined;\n const newBaggageHeaders: string[] = [];\n\n if (Array.isArray(existingBaggageHeader)) {\n newBaggageHeaders.push(...existingBaggageHeader);\n } else if (existingBaggageHeader) {\n newBaggageHeaders.push(existingBaggageHeader);\n }\n\n if (sentryBaggageHeader) {\n newBaggageHeaders.push(sentryBaggageHeader);\n }\n\n return {\n ...(headers as Exclude),\n 'sentry-trace': sentryTraceHeader,\n baggage: newBaggageHeaders.length > 0 ? newBaggageHeaders.join(',') : undefined,\n };\n }\n}\n\n/**\n * Create and track xhr request spans\n */\nexport function xhrCallback(\n handlerData: XHRData,\n shouldCreateSpan: (url: string) => boolean,\n spans: Record,\n): void {\n if (\n !hasTracingEnabled() ||\n (handlerData.xhr && handlerData.xhr.__sentry_own_request__) ||\n !(handlerData.xhr && handlerData.xhr.__sentry_xhr__ && shouldCreateSpan(handlerData.xhr.__sentry_xhr__.url))\n ) {\n return;\n }\n\n const xhr = handlerData.xhr.__sentry_xhr__;\n\n // check first if the request has finished and is tracked by an existing span which should now end\n if (handlerData.endTimestamp) {\n const spanId = handlerData.xhr.__sentry_xhr_span_id__;\n if (!spanId) return;\n\n const span = spans[spanId];\n if (span) {\n span.setHttpStatus(xhr.status_code);\n span.finish();\n\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete spans[spanId];\n }\n return;\n }\n\n // if not, create a new span to track it\n const activeTransaction = getActiveTransaction();\n if (activeTransaction) {\n const span = activeTransaction.startChild({\n data: {\n ...xhr.data,\n type: 'xhr',\n method: xhr.method,\n url: xhr.url,\n },\n description: `${xhr.method} ${xhr.url}`,\n op: 'http.client',\n });\n\n handlerData.xhr.__sentry_xhr_span_id__ = span.spanId;\n spans[handlerData.xhr.__sentry_xhr_span_id__] = span;\n\n if (handlerData.xhr.setRequestHeader) {\n try {\n handlerData.xhr.setRequestHeader('sentry-trace', span.toTraceparent());\n\n const dynamicSamplingContext = activeTransaction.getDynamicSamplingContext();\n const sentryBaggageHeader = dynamicSamplingContextToSentryBaggageHeader(dynamicSamplingContext);\n\n if (sentryBaggageHeader) {\n // From MDN: \"If this method is called several times with the same header, the values are merged into one single request header.\"\n // We can therefore simply set a baggage header without checking what was there before\n // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/setRequestHeader\n handlerData.xhr.setRequestHeader(BAGGAGE_HEADER_NAME, sentryBaggageHeader);\n }\n\n activeTransaction.metadata.propagations += 1;\n } catch (_) {\n // Error: InvalidStateError: Failed to execute 'setRequestHeader' on 'XMLHttpRequest': The object's state must be OPENED.\n }\n }\n }\n}\n","import { Transaction, TransactionContext } from '@sentry/types';\nimport { addInstrumentationHandler, getGlobalObject, logger } from '@sentry/utils';\n\nconst global = getGlobalObject();\n\n/**\n * Default function implementing pageload and navigation transactions\n */\nexport function instrumentRoutingWithDefaults(\n customStartTransaction: (context: TransactionContext) => T | undefined,\n startTransactionOnPageLoad: boolean = true,\n startTransactionOnLocationChange: boolean = true,\n): void {\n if (!global || !global.location) {\n __DEBUG_BUILD__ && logger.warn('Could not initialize routing instrumentation due to invalid location');\n return;\n }\n\n let startingUrl: string | undefined = global.location.href;\n\n let activeTransaction: T | undefined;\n if (startTransactionOnPageLoad) {\n activeTransaction = customStartTransaction({\n name: global.location.pathname,\n op: 'pageload',\n metadata: { source: 'url' },\n });\n }\n\n if (startTransactionOnLocationChange) {\n addInstrumentationHandler('history', ({ to, from }: { to: string; from?: string }) => {\n /**\n * This early return is there to account for some cases where a navigation transaction starts right after\n * long-running pageload. We make sure that if `from` is undefined and a valid `startingURL` exists, we don't\n * create an uneccessary navigation transaction.\n *\n * This was hard to duplicate, but this behavior stopped as soon as this fix was applied. This issue might also\n * only be caused in certain development environments where the usage of a hot module reloader is causing\n * errors.\n */\n if (from === undefined && startingUrl && startingUrl.indexOf(to) !== -1) {\n startingUrl = undefined;\n return;\n }\n\n if (from !== to) {\n startingUrl = undefined;\n if (activeTransaction) {\n __DEBUG_BUILD__ && logger.log(`[Tracing] Finishing current transaction with op: ${activeTransaction.op}`);\n // If there's an open transaction on the scope, we need to finish it before creating an new one.\n activeTransaction.finish();\n }\n activeTransaction = customStartTransaction({\n name: global.location.pathname,\n op: 'navigation',\n metadata: { source: 'url' },\n });\n }\n });\n }\n}\n","/* eslint-disable max-lines */\nimport { Hub } from '@sentry/hub';\nimport { EventProcessor, Integration, Transaction, TransactionContext } from '@sentry/types';\nimport { baggageHeaderToDynamicSamplingContext, getDomElement, getGlobalObject, logger } from '@sentry/utils';\n\nimport { startIdleTransaction } from '../hubextensions';\nimport { DEFAULT_FINAL_TIMEOUT, DEFAULT_IDLE_TIMEOUT } from '../idletransaction';\nimport { extractTraceparentData } from '../utils';\nimport { registerBackgroundTabDetection } from './backgroundtab';\nimport { addPerformanceEntries, startTrackingLongTasks, startTrackingWebVitals } from './metrics';\nimport {\n defaultRequestInstrumentationOptions,\n instrumentOutgoingRequests,\n RequestInstrumentationOptions,\n} from './request';\nimport { instrumentRoutingWithDefaults } from './router';\n\nexport const BROWSER_TRACING_INTEGRATION_ID = 'BrowserTracing';\n\n/** Options for Browser Tracing integration */\nexport interface BrowserTracingOptions extends RequestInstrumentationOptions {\n /**\n * The time to wait in ms until the transaction will be finished during an idle state. An idle state is defined\n * by a moment where there are no in-progress spans.\n *\n * The transaction will use the end timestamp of the last finished span as the endtime for the transaction.\n * If there are still active spans when this the `idleTimeout` is set, the `idleTimeout` will get reset.\n * Time is in ms.\n *\n * Default: 1000\n */\n idleTimeout: number;\n\n /**\n * The max duration for a transaction. If a transaction duration hits the `finalTimeout` value, it\n * will be finished.\n * Time is in ms.\n *\n * Default: 30000\n */\n finalTimeout: number;\n\n /**\n * Flag to enable/disable creation of `navigation` transaction on history changes.\n *\n * Default: true\n */\n startTransactionOnLocationChange: boolean;\n\n /**\n * Flag to enable/disable creation of `pageload` transaction on first pageload.\n *\n * Default: true\n */\n startTransactionOnPageLoad: boolean;\n\n /**\n * Flag Transactions where tabs moved to background with \"cancelled\". Browser background tab timing is\n * not suited towards doing precise measurements of operations. By default, we recommend that this option\n * be enabled as background transactions can mess up your statistics in nondeterministic ways.\n *\n * Default: true\n */\n markBackgroundTransactions: boolean;\n\n /**\n * _metricOptions allows the user to send options to change how metrics are collected.\n *\n * _metricOptions is currently experimental.\n *\n * Default: undefined\n */\n _metricOptions?: Partial<{ _reportAllChanges: boolean }>;\n\n /**\n * _experiments allows the user to send options to define how this integration works.\n *\n * Default: undefined\n */\n _experiments?: Partial<{ enableLongTask: boolean }>;\n\n /**\n * beforeNavigate is called before a pageload/navigation transaction is created and allows users to modify transaction\n * context data, or drop the transaction entirely (by setting `sampled = false` in the context).\n *\n * Note: For legacy reasons, transactions can also be dropped by returning `undefined`.\n *\n * @param context: The context data which will be passed to `startTransaction` by default\n *\n * @returns A (potentially) modified context object, with `sampled = false` if the transaction should be dropped.\n */\n beforeNavigate?(context: TransactionContext): TransactionContext | undefined;\n\n /**\n * Instrumentation that creates routing change transactions. By default creates\n * pageload and navigation transactions.\n */\n routingInstrumentation(\n customStartTransaction: (context: TransactionContext) => T | undefined,\n startTransactionOnPageLoad?: boolean,\n startTransactionOnLocationChange?: boolean,\n ): void;\n}\n\nconst DEFAULT_BROWSER_TRACING_OPTIONS = {\n idleTimeout: DEFAULT_IDLE_TIMEOUT,\n finalTimeout: DEFAULT_FINAL_TIMEOUT,\n markBackgroundTransactions: true,\n routingInstrumentation: instrumentRoutingWithDefaults,\n startTransactionOnLocationChange: true,\n startTransactionOnPageLoad: true,\n _experiments: { enableLongTask: true },\n ...defaultRequestInstrumentationOptions,\n};\n\n/**\n * The Browser Tracing integration automatically instruments browser pageload/navigation\n * actions as transactions, and captures requests, metrics and errors as spans.\n *\n * The integration can be configured with a variety of options, and can be extended to use\n * any routing library. This integration uses {@see IdleTransaction} to create transactions.\n */\nexport class BrowserTracing implements Integration {\n // This class currently doesn't have a static `id` field like the other integration classes, because it prevented\n // @sentry/tracing from being treeshaken. Tree shakers do not like static fields, because they behave like side effects.\n // TODO: Come up with a better plan, than using static fields on integration classes, and use that plan on all\n // integrations.\n\n /** Browser Tracing integration options */\n public options: BrowserTracingOptions;\n\n /**\n * @inheritDoc\n */\n public name: string = BROWSER_TRACING_INTEGRATION_ID;\n\n private _getCurrentHub?: () => Hub;\n\n private readonly _emitOptionsWarning?: boolean;\n\n public constructor(_options?: Partial) {\n let tracingOrigins = defaultRequestInstrumentationOptions.tracingOrigins;\n // NOTE: Logger doesn't work in constructors, as it's initialized after integrations instances\n if (_options) {\n if (_options.tracingOrigins && Array.isArray(_options.tracingOrigins)) {\n tracingOrigins = _options.tracingOrigins;\n } else {\n __DEBUG_BUILD__ && (this._emitOptionsWarning = true);\n }\n }\n\n this.options = {\n ...DEFAULT_BROWSER_TRACING_OPTIONS,\n ..._options,\n tracingOrigins,\n };\n\n const { _metricOptions } = this.options;\n startTrackingWebVitals(_metricOptions && _metricOptions._reportAllChanges);\n if (this.options._experiments?.enableLongTask) {\n startTrackingLongTasks();\n }\n }\n\n /**\n * @inheritDoc\n */\n public setupOnce(_: (callback: EventProcessor) => void, getCurrentHub: () => Hub): void {\n this._getCurrentHub = getCurrentHub;\n\n if (this._emitOptionsWarning) {\n __DEBUG_BUILD__ &&\n logger.warn(\n '[Tracing] You need to define `tracingOrigins` in the options. Set an array of urls or patterns to trace.',\n );\n __DEBUG_BUILD__ &&\n logger.warn(\n `[Tracing] We added a reasonable default for you: ${defaultRequestInstrumentationOptions.tracingOrigins}`,\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const {\n routingInstrumentation: instrumentRouting,\n startTransactionOnLocationChange,\n startTransactionOnPageLoad,\n markBackgroundTransactions,\n traceFetch,\n traceXHR,\n tracingOrigins,\n shouldCreateSpanForRequest,\n } = this.options;\n\n instrumentRouting(\n (context: TransactionContext) => this._createRouteTransaction(context),\n startTransactionOnPageLoad,\n startTransactionOnLocationChange,\n );\n\n if (markBackgroundTransactions) {\n registerBackgroundTabDetection();\n }\n\n instrumentOutgoingRequests({ traceFetch, traceXHR, tracingOrigins, shouldCreateSpanForRequest });\n }\n\n /** Create routing idle transaction. */\n private _createRouteTransaction(context: TransactionContext): Transaction | undefined {\n if (!this._getCurrentHub) {\n __DEBUG_BUILD__ &&\n logger.warn(`[Tracing] Did not create ${context.op} transaction because _getCurrentHub is invalid.`);\n return undefined;\n }\n\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const { beforeNavigate, idleTimeout, finalTimeout } = this.options;\n\n const isPageloadTransaction = context.op === 'pageload';\n\n const sentryTraceMetaTagValue = isPageloadTransaction ? getMetaContent('sentry-trace') : null;\n const baggageMetaTagValue = isPageloadTransaction ? getMetaContent('baggage') : null;\n\n const traceParentData = sentryTraceMetaTagValue ? extractTraceparentData(sentryTraceMetaTagValue) : undefined;\n const dynamicSamplingContext = baggageMetaTagValue\n ? baggageHeaderToDynamicSamplingContext(baggageMetaTagValue)\n : undefined;\n\n const expandedContext: TransactionContext = {\n ...context,\n ...traceParentData,\n metadata: {\n ...context.metadata,\n dynamicSamplingContext: traceParentData && !dynamicSamplingContext ? {} : dynamicSamplingContext,\n },\n trimEnd: true,\n };\n\n const modifiedContext = typeof beforeNavigate === 'function' ? beforeNavigate(expandedContext) : expandedContext;\n\n // For backwards compatibility reasons, beforeNavigate can return undefined to \"drop\" the transaction (prevent it\n // from being sent to Sentry).\n const finalContext = modifiedContext === undefined ? { ...expandedContext, sampled: false } : modifiedContext;\n\n // If `beforeNavigate` set a custom name, record that fact\n finalContext.metadata =\n finalContext.name !== expandedContext.name\n ? { ...finalContext.metadata, source: 'custom' }\n : finalContext.metadata;\n\n if (finalContext.sampled === false) {\n __DEBUG_BUILD__ &&\n logger.log(`[Tracing] Will not send ${finalContext.op} transaction because of beforeNavigate.`);\n }\n\n __DEBUG_BUILD__ && logger.log(`[Tracing] Starting ${finalContext.op} transaction on scope`);\n\n const hub = this._getCurrentHub();\n const { location } = getGlobalObject() as WindowOrWorkerGlobalScope & { location: Location };\n\n const idleTransaction = startIdleTransaction(\n hub,\n finalContext,\n idleTimeout,\n finalTimeout,\n true,\n { location }, // for use in the tracesSampler\n );\n idleTransaction.registerBeforeFinishCallback(transaction => {\n addPerformanceEntries(transaction);\n transaction.setTag(\n 'sentry_reportAllChanges',\n Boolean(this.options._metricOptions && this.options._metricOptions._reportAllChanges),\n );\n });\n\n return idleTransaction as Transaction;\n }\n}\n\n/** Returns the value of a meta tag */\nexport function getMetaContent(metaName: string): string | null {\n // Can't specify generic to `getDomElement` because tracing can be used\n // in a variety of environments, have to disable `no-unsafe-member-access`\n // as a result.\n const metaTag = getDomElement(`meta[name=${metaName}]`);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return metaTag ? metaTag.getAttribute('content') : null;\n}\n","import { GenericFunction } from './types';\n\n/**\n * Polyfill for the optional chain operator, `?.`, given previous conversion of the expression into an array of values,\n * descriptors, and functions.\n *\n * Adapted from Sucrase (https://github.com/alangpierce/sucrase)\n * See https://github.com/alangpierce/sucrase/blob/265887868966917f3b924ce38dfad01fbab1329f/src/transformers/OptionalChainingNullishTransformer.ts#L15\n *\n * @param ops Array result of expression conversion\n * @returns The value of the expression\n */\nexport function _optionalChain(ops: unknown[]): unknown {\n let lastAccessLHS: unknown = undefined;\n let value = ops[0];\n let i = 1;\n while (i < ops.length) {\n const op = ops[i] as string;\n const fn = ops[i + 1] as (intermediateValue: unknown) => unknown;\n i += 2;\n // by checking for loose equality to `null`, we catch both `null` and `undefined`\n if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) {\n // really we're meaning to return `undefined` as an actual value here, but it saves bytes not to write it\n return;\n }\n if (op === 'access' || op === 'optionalAccess') {\n lastAccessLHS = value;\n value = fn(value);\n } else if (op === 'call' || op === 'optionalCall') {\n value = fn((...args: unknown[]) => (value as GenericFunction).call(lastAccessLHS, ...args));\n lastAccessLHS = undefined;\n }\n }\n return value;\n}\n\n// Sucrase version\n// function _optionalChain(ops) {\n// let lastAccessLHS = undefined;\n// let value = ops[0];\n// let i = 1;\n// while (i < ops.length) {\n// const op = ops[i];\n// const fn = ops[i + 1];\n// i += 2;\n// if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) {\n// return undefined;\n// }\n// if (op === 'access' || op === 'optionalAccess') {\n// lastAccessLHS = value;\n// value = fn(value);\n// } else if (op === 'call' || op === 'optionalCall') {\n// value = fn((...args) => value.call(lastAccessLHS, ...args));\n// lastAccessLHS = undefined;\n// }\n// }\n// return value;\n// }\n","import { addExtensionMethods } from './hubextensions';\nimport * as Integrations from './integrations';\n\nexport type { RequestInstrumentationOptions } from './browser';\nexport type { SpanStatusType } from './span';\n\nexport { Integrations };\n\n// This is already exported as part of `Integrations` above (and for the moment will remain so for\n// backwards compatibility), but that interferes with treeshaking, so we also export it separately\n// here.\n//\n// Previously we expected users to import tracing integrations like\n//\n// import { Integrations } from '@sentry/tracing';\n// const instance = new Integrations.BrowserTracing();\n//\n// This makes the integrations unable to be treeshaken though. To address this, we now have\n// this individual export. We now expect users to consume BrowserTracing like so:\n//\n// import { BrowserTracing } from '@sentry/tracing';\n// const instance = new BrowserTracing();\n//\n// For an example of of the new usage of BrowserTracing, see @sentry/nextjs index.client.ts\nexport { BrowserTracing, BROWSER_TRACING_INTEGRATION_ID } from './browser';\n\nexport { Span, spanStatusfromHttpCode } from './span';\n// eslint-disable-next-line deprecation/deprecation\nexport { SpanStatus } from './spanstatus';\nexport { Transaction } from './transaction';\nexport { instrumentOutgoingRequests, defaultRequestInstrumentationOptions } from './browser';\nexport { IdleTransaction } from './idletransaction';\nexport { startIdleTransaction } from './hubextensions';\n\n// Treeshakable guard to remove all code related to tracing\ndeclare const __SENTRY_TRACING__: boolean;\n\n// Guard for tree\nif (typeof __SENTRY_TRACING__ === 'undefined' || __SENTRY_TRACING__) {\n // We are patching the global object with our hub extension methods\n addExtensionMethods();\n}\n\nexport { addExtensionMethods };\n\nexport {\n extractTraceparentData,\n getActiveTransaction,\n hasTracingEnabled,\n stripUrlQueryAndFragment,\n TRACEPARENT_REGEXP,\n} from './utils';\n","import { getCurrentHub, Hub } from '@sentry/hub';\nimport { Options, Transaction } from '@sentry/types';\n\n/**\n * The `extractTraceparentData` function and `TRACEPARENT_REGEXP` constant used\n * to be declared in this file. It was later moved into `@sentry/utils` as part of a\n * move to remove `@sentry/tracing` dependencies from `@sentry/node` (`extractTraceparentData`\n * is the only tracing function used by `@sentry/node`).\n *\n * These exports are kept here for backwards compatability's sake.\n *\n * TODO(v7): Reorganize these exports\n *\n * See https://github.com/getsentry/sentry-javascript/issues/4642 for more details.\n */\nexport { TRACEPARENT_REGEXP, extractTraceparentData } from '@sentry/utils';\n\n/**\n * Determines if tracing is currently enabled.\n *\n * Tracing is enabled when at least one of `tracesSampleRate` and `tracesSampler` is defined in the SDK config.\n */\nexport function hasTracingEnabled(\n maybeOptions?: Pick | undefined,\n): boolean {\n const client = getCurrentHub().getClient();\n const options = maybeOptions || (client && client.getOptions());\n return !!options && ('tracesSampleRate' in options || 'tracesSampler' in options);\n}\n\n/** Grabs active transaction off scope, if any */\nexport function getActiveTransaction(maybeHub?: Hub): T | undefined {\n const hub = maybeHub || getCurrentHub();\n const scope = hub.getScope();\n return scope && (scope.getTransaction() as T | undefined);\n}\n\n/**\n * Converts from milliseconds to seconds\n * @param time time in ms\n */\nexport function msToSec(time: number): number {\n return time / 1000;\n}\n\n/**\n * Converts from seconds to milliseconds\n * @param time time in seconds\n */\nexport function secToMs(time: number): number {\n return time * 1000;\n}\n\n// so it can be used in manual instrumentation without necessitating a hard dependency on @sentry/utils\nexport { stripUrlQueryAndFragment } from '@sentry/utils';\n","/**\n * Polyfill for the nullish coalescing operator (`??`).\n *\n * Note that the RHS is wrapped in a function so that if it's a computed value, that evaluation won't happen unless the\n * LHS evaluates to a nullish value, to mimic the operator's short-circuiting behavior.\n *\n * Adapted from Sucrase (https://github.com/alangpierce/sucrase)\n *\n * @param lhs The value of the expression to the left of the `??`\n * @param rhsFn A function returning the value of the expression to the right of the `??`\n * @returns The LHS value, unless it's `null` or `undefined`, in which case, the RHS value\n */\nexport function _nullishCoalesce(lhs: unknown, rhsFn: () => unknown): unknown {\n // by checking for loose equality to `null`, we catch both `null` and `undefined`\n return lhs != null ? lhs : rhsFn();\n}\n\n// Sucrase version:\n// function _nullishCoalesce(lhs, rhsFn) {\n// if (lhs != null) {\n// return lhs;\n// } else {\n// return rhsFn();\n// }\n// }\n","/* eslint-disable max-lines */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/ban-types */\nimport { WrappedFunction } from '@sentry/types';\n\nimport { getGlobalObject } from './global';\nimport { isInstanceOf, isString } from './is';\nimport { CONSOLE_LEVELS, logger } from './logger';\nimport { fill } from './object';\nimport { getFunctionName } from './stacktrace';\nimport { supportsHistory, supportsNativeFetch } from './supports';\n\nconst global = getGlobalObject();\n\nexport type InstrumentHandlerType =\n | 'console'\n | 'dom'\n | 'fetch'\n | 'history'\n | 'sentry'\n | 'xhr'\n | 'error'\n | 'unhandledrejection';\nexport type InstrumentHandlerCallback = (data: any) => void;\n\n/**\n * Instrument native APIs to call handlers that can be used to create breadcrumbs, APM spans etc.\n * - Console API\n * - Fetch API\n * - XHR API\n * - History API\n * - DOM API (click/typing)\n * - Error API\n * - UnhandledRejection API\n */\n\nconst handlers: { [key in InstrumentHandlerType]?: InstrumentHandlerCallback[] } = {};\nconst instrumented: { [key in InstrumentHandlerType]?: boolean } = {};\n\n/** Instruments given API */\nfunction instrument(type: InstrumentHandlerType): void {\n if (instrumented[type]) {\n return;\n }\n\n instrumented[type] = true;\n\n switch (type) {\n case 'console':\n instrumentConsole();\n break;\n case 'dom':\n instrumentDOM();\n break;\n case 'xhr':\n instrumentXHR();\n break;\n case 'fetch':\n instrumentFetch();\n break;\n case 'history':\n instrumentHistory();\n break;\n case 'error':\n instrumentError();\n break;\n case 'unhandledrejection':\n instrumentUnhandledRejection();\n break;\n default:\n __DEBUG_BUILD__ && logger.warn('unknown instrumentation type:', type);\n return;\n }\n}\n\n/**\n * Add handler that will be called when given type of instrumentation triggers.\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nexport function addInstrumentationHandler(type: InstrumentHandlerType, callback: InstrumentHandlerCallback): void {\n handlers[type] = handlers[type] || [];\n (handlers[type] as InstrumentHandlerCallback[]).push(callback);\n instrument(type);\n}\n\n/** JSDoc */\nfunction triggerHandlers(type: InstrumentHandlerType, data: any): void {\n if (!type || !handlers[type]) {\n return;\n }\n\n for (const handler of handlers[type] || []) {\n try {\n handler(data);\n } catch (e) {\n __DEBUG_BUILD__ &&\n logger.error(\n `Error while triggering instrumentation handler.\\nType: ${type}\\nName: ${getFunctionName(handler)}\\nError:`,\n e,\n );\n }\n }\n}\n\n/** JSDoc */\nfunction instrumentConsole(): void {\n if (!('console' in global)) {\n return;\n }\n\n CONSOLE_LEVELS.forEach(function (level: string): void {\n if (!(level in global.console)) {\n return;\n }\n\n fill(global.console, level, function (originalConsoleMethod: () => any): Function {\n return function (...args: any[]): void {\n triggerHandlers('console', { args, level });\n\n // this fails for some browsers. :(\n if (originalConsoleMethod) {\n originalConsoleMethod.apply(global.console, args);\n }\n };\n });\n });\n}\n\n/** JSDoc */\nfunction instrumentFetch(): void {\n if (!supportsNativeFetch()) {\n return;\n }\n\n fill(global, 'fetch', function (originalFetch: () => void): () => void {\n return function (...args: any[]): void {\n const handlerData = {\n args,\n fetchData: {\n method: getFetchMethod(args),\n url: getFetchUrl(args),\n },\n startTimestamp: Date.now(),\n };\n\n triggerHandlers('fetch', {\n ...handlerData,\n });\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return originalFetch.apply(global, args).then(\n (response: Response) => {\n triggerHandlers('fetch', {\n ...handlerData,\n endTimestamp: Date.now(),\n response,\n });\n return response;\n },\n (error: Error) => {\n triggerHandlers('fetch', {\n ...handlerData,\n endTimestamp: Date.now(),\n error,\n });\n // NOTE: If you are a Sentry user, and you are seeing this stack frame,\n // it means the sentry.javascript SDK caught an error invoking your application code.\n // This is expected behavior and NOT indicative of a bug with sentry.javascript.\n throw error;\n },\n );\n };\n });\n}\n\ntype XHRSendInput = null | Blob | BufferSource | FormData | URLSearchParams | string;\n\n/** JSDoc */\ninterface SentryWrappedXMLHttpRequest extends XMLHttpRequest {\n [key: string]: any;\n __sentry_xhr__?: {\n method?: string;\n url?: string;\n status_code?: number;\n body?: XHRSendInput;\n };\n}\n\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/** Extract `method` from fetch call arguments */\nfunction getFetchMethod(fetchArgs: any[] = []): string {\n if ('Request' in global && isInstanceOf(fetchArgs[0], Request) && fetchArgs[0].method) {\n return String(fetchArgs[0].method).toUpperCase();\n }\n if (fetchArgs[1] && fetchArgs[1].method) {\n return String(fetchArgs[1].method).toUpperCase();\n }\n return 'GET';\n}\n\n/** Extract `url` from fetch call arguments */\nfunction getFetchUrl(fetchArgs: any[] = []): string {\n if (typeof fetchArgs[0] === 'string') {\n return fetchArgs[0];\n }\n if ('Request' in global && isInstanceOf(fetchArgs[0], Request)) {\n return fetchArgs[0].url;\n }\n return String(fetchArgs[0]);\n}\n/* eslint-enable @typescript-eslint/no-unsafe-member-access */\n\n/** JSDoc */\nfunction instrumentXHR(): void {\n if (!('XMLHttpRequest' in global)) {\n return;\n }\n\n const xhrproto = XMLHttpRequest.prototype;\n\n fill(xhrproto, 'open', function (originalOpen: () => void): () => void {\n return function (this: SentryWrappedXMLHttpRequest, ...args: any[]): void {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const xhr = this;\n const url = args[1];\n const xhrInfo: SentryWrappedXMLHttpRequest['__sentry_xhr__'] = (xhr.__sentry_xhr__ = {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n method: isString(args[0]) ? args[0].toUpperCase() : args[0],\n url: args[1],\n });\n\n // if Sentry key appears in URL, don't capture it as a request\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (isString(url) && xhrInfo.method === 'POST' && url.match(/sentry_key/)) {\n xhr.__sentry_own_request__ = true;\n }\n\n const onreadystatechangeHandler = function (): void {\n if (xhr.readyState === 4) {\n try {\n // touching statusCode in some platforms throws\n // an exception\n xhrInfo.status_code = xhr.status;\n } catch (e) {\n /* do nothing */\n }\n\n triggerHandlers('xhr', {\n args,\n endTimestamp: Date.now(),\n startTimestamp: Date.now(),\n xhr,\n });\n }\n };\n\n if ('onreadystatechange' in xhr && typeof xhr.onreadystatechange === 'function') {\n fill(xhr, 'onreadystatechange', function (original: WrappedFunction): Function {\n return function (...readyStateArgs: any[]): void {\n onreadystatechangeHandler();\n return original.apply(xhr, readyStateArgs);\n };\n });\n } else {\n xhr.addEventListener('readystatechange', onreadystatechangeHandler);\n }\n\n return originalOpen.apply(xhr, args);\n };\n });\n\n fill(xhrproto, 'send', function (originalSend: () => void): () => void {\n return function (this: SentryWrappedXMLHttpRequest, ...args: any[]): void {\n if (this.__sentry_xhr__ && args[0] !== undefined) {\n this.__sentry_xhr__.body = args[0];\n }\n\n triggerHandlers('xhr', {\n args,\n startTimestamp: Date.now(),\n xhr: this,\n });\n\n return originalSend.apply(this, args);\n };\n });\n}\n\nlet lastHref: string;\n\n/** JSDoc */\nfunction instrumentHistory(): void {\n if (!supportsHistory()) {\n return;\n }\n\n const oldOnPopState = global.onpopstate;\n global.onpopstate = function (this: WindowEventHandlers, ...args: any[]): any {\n const to = global.location.href;\n // keep track of the current URL state, as we always receive only the updated state\n const from = lastHref;\n lastHref = to;\n triggerHandlers('history', {\n from,\n to,\n });\n if (oldOnPopState) {\n // Apparently this can throw in Firefox when incorrectly implemented plugin is installed.\n // https://github.com/getsentry/sentry-javascript/issues/3344\n // https://github.com/bugsnag/bugsnag-js/issues/469\n try {\n return oldOnPopState.apply(this, args);\n } catch (_oO) {\n // no-empty\n }\n }\n };\n\n /** @hidden */\n function historyReplacementFunction(originalHistoryFunction: () => void): () => void {\n return function (this: History, ...args: any[]): void {\n const url = args.length > 2 ? args[2] : undefined;\n if (url) {\n // coerce to string (this is what pushState does)\n const from = lastHref;\n const to = String(url);\n // keep track of the current URL state, as we always receive only the updated state\n lastHref = to;\n triggerHandlers('history', {\n from,\n to,\n });\n }\n return originalHistoryFunction.apply(this, args);\n };\n }\n\n fill(global.history, 'pushState', historyReplacementFunction);\n fill(global.history, 'replaceState', historyReplacementFunction);\n}\n\nconst debounceDuration = 1000;\nlet debounceTimerID: number | undefined;\nlet lastCapturedEvent: Event | undefined;\n\n/**\n * Decide whether the current event should finish the debounce of previously captured one.\n * @param previous previously captured event\n * @param current event to be captured\n */\nfunction shouldShortcircuitPreviousDebounce(previous: Event | undefined, current: Event): boolean {\n // If there was no previous event, it should always be swapped for the new one.\n if (!previous) {\n return true;\n }\n\n // If both events have different type, then user definitely performed two separate actions. e.g. click + keypress.\n if (previous.type !== current.type) {\n return true;\n }\n\n try {\n // If both events have the same type, it's still possible that actions were performed on different targets.\n // e.g. 2 clicks on different buttons.\n if (previous.target !== current.target) {\n return true;\n }\n } catch (e) {\n // just accessing `target` property can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/sentry-javascript/issues/838\n }\n\n // If both events have the same type _and_ same `target` (an element which triggered an event, _not necessarily_\n // to which an event listener was attached), we treat them as the same action, as we want to capture\n // only one breadcrumb. e.g. multiple clicks on the same button, or typing inside a user input box.\n return false;\n}\n\n/**\n * Decide whether an event should be captured.\n * @param event event to be captured\n */\nfunction shouldSkipDOMEvent(event: Event): boolean {\n // We are only interested in filtering `keypress` events for now.\n if (event.type !== 'keypress') {\n return false;\n }\n\n try {\n const target = event.target as HTMLElement;\n\n if (!target || !target.tagName) {\n return true;\n }\n\n // Only consider keypress events on actual input elements. This will disregard keypresses targeting body\n // e.g.tabbing through elements, hotkeys, etc.\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) {\n return false;\n }\n } catch (e) {\n // just accessing `target` property can throw an exception in some rare circumstances\n // see: https://github.com/getsentry/sentry-javascript/issues/838\n }\n\n return true;\n}\n\n/**\n * Wraps addEventListener to capture UI breadcrumbs\n * @param handler function that will be triggered\n * @param globalListener indicates whether event was captured by the global event listener\n * @returns wrapped breadcrumb events handler\n * @hidden\n */\nfunction makeDOMEventHandler(handler: Function, globalListener: boolean = false): (event: Event) => void {\n return (event: Event): void => {\n // It's possible this handler might trigger multiple times for the same\n // event (e.g. event propagation through node ancestors).\n // Ignore if we've already captured that event.\n if (!event || lastCapturedEvent === event) {\n return;\n }\n\n // We always want to skip _some_ events.\n if (shouldSkipDOMEvent(event)) {\n return;\n }\n\n const name = event.type === 'keypress' ? 'input' : event.type;\n\n // If there is no debounce timer, it means that we can safely capture the new event and store it for future comparisons.\n if (debounceTimerID === undefined) {\n handler({\n event: event,\n name,\n global: globalListener,\n });\n lastCapturedEvent = event;\n }\n // If there is a debounce awaiting, see if the new event is different enough to treat it as a unique one.\n // If that's the case, emit the previous event and store locally the newly-captured DOM event.\n else if (shouldShortcircuitPreviousDebounce(lastCapturedEvent, event)) {\n handler({\n event: event,\n name,\n global: globalListener,\n });\n lastCapturedEvent = event;\n }\n\n // Start a new debounce timer that will prevent us from capturing multiple events that should be grouped together.\n clearTimeout(debounceTimerID);\n debounceTimerID = global.setTimeout(() => {\n debounceTimerID = undefined;\n }, debounceDuration);\n };\n}\n\ntype AddEventListener = (\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n) => void;\ntype RemoveEventListener = (\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | EventListenerOptions,\n) => void;\n\ntype InstrumentedElement = Element & {\n __sentry_instrumentation_handlers__?: {\n [key in 'click' | 'keypress']?: {\n handler?: Function;\n /** The number of custom listeners attached to this element */\n refCount: number;\n };\n };\n};\n\n/** JSDoc */\nfunction instrumentDOM(): void {\n if (!('document' in global)) {\n return;\n }\n\n // Make it so that any click or keypress that is unhandled / bubbled up all the way to the document triggers our dom\n // handlers. (Normally we have only one, which captures a breadcrumb for each click or keypress.) Do this before\n // we instrument `addEventListener` so that we don't end up attaching this handler twice.\n const triggerDOMHandler = triggerHandlers.bind(null, 'dom');\n const globalDOMEventHandler = makeDOMEventHandler(triggerDOMHandler, true);\n global.document.addEventListener('click', globalDOMEventHandler, false);\n global.document.addEventListener('keypress', globalDOMEventHandler, false);\n\n // After hooking into click and keypress events bubbled up to `document`, we also hook into user-handled\n // clicks & keypresses, by adding an event listener of our own to any element to which they add a listener. That\n // way, whenever one of their handlers is triggered, ours will be, too. (This is needed because their handler\n // could potentially prevent the event from bubbling up to our global listeners. This way, our handler are still\n // guaranteed to fire at least once.)\n ['EventTarget', 'Node'].forEach((target: string) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const proto = (global as any)[target] && (global as any)[target].prototype;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, no-prototype-builtins\n if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {\n return;\n }\n\n fill(proto, 'addEventListener', function (originalAddEventListener: AddEventListener): AddEventListener {\n return function (\n this: Element,\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | AddEventListenerOptions,\n ): AddEventListener {\n if (type === 'click' || type == 'keypress') {\n try {\n const el = this as InstrumentedElement;\n const handlers = (el.__sentry_instrumentation_handlers__ = el.__sentry_instrumentation_handlers__ || {});\n const handlerForType = (handlers[type] = handlers[type] || { refCount: 0 });\n\n if (!handlerForType.handler) {\n const handler = makeDOMEventHandler(triggerDOMHandler);\n handlerForType.handler = handler;\n originalAddEventListener.call(this, type, handler, options);\n }\n\n handlerForType.refCount += 1;\n } catch (e) {\n // Accessing dom properties is always fragile.\n // Also allows us to skip `addEventListenrs` calls with no proper `this` context.\n }\n }\n\n return originalAddEventListener.call(this, type, listener, options);\n };\n });\n\n fill(\n proto,\n 'removeEventListener',\n function (originalRemoveEventListener: RemoveEventListener): RemoveEventListener {\n return function (\n this: Element,\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: boolean | EventListenerOptions,\n ): () => void {\n if (type === 'click' || type == 'keypress') {\n try {\n const el = this as InstrumentedElement;\n const handlers = el.__sentry_instrumentation_handlers__ || {};\n const handlerForType = handlers[type];\n\n if (handlerForType) {\n handlerForType.refCount -= 1;\n // If there are no longer any custom handlers of the current type on this element, we can remove ours, too.\n if (handlerForType.refCount <= 0) {\n originalRemoveEventListener.call(this, type, handlerForType.handler, options);\n handlerForType.handler = undefined;\n delete handlers[type]; // eslint-disable-line @typescript-eslint/no-dynamic-delete\n }\n\n // If there are no longer any custom handlers of any type on this element, cleanup everything.\n if (Object.keys(handlers).length === 0) {\n delete el.__sentry_instrumentation_handlers__;\n }\n }\n } catch (e) {\n // Accessing dom properties is always fragile.\n // Also allows us to skip `addEventListenrs` calls with no proper `this` context.\n }\n }\n\n return originalRemoveEventListener.call(this, type, listener, options);\n };\n },\n );\n });\n}\n\nlet _oldOnErrorHandler: OnErrorEventHandler = null;\n/** JSDoc */\nfunction instrumentError(): void {\n _oldOnErrorHandler = global.onerror;\n\n global.onerror = function (msg: any, url: any, line: any, column: any, error: any): boolean {\n triggerHandlers('error', {\n column,\n error,\n line,\n msg,\n url,\n });\n\n if (_oldOnErrorHandler) {\n // eslint-disable-next-line prefer-rest-params\n return _oldOnErrorHandler.apply(this, arguments);\n }\n\n return false;\n };\n}\n\nlet _oldOnUnhandledRejectionHandler: ((e: any) => void) | null = null;\n/** JSDoc */\nfunction instrumentUnhandledRejection(): void {\n _oldOnUnhandledRejectionHandler = global.onunhandledrejection;\n\n global.onunhandledrejection = function (e: any): boolean {\n triggerHandlers('unhandledrejection', e);\n\n if (_oldOnUnhandledRejectionHandler) {\n // eslint-disable-next-line prefer-rest-params\n return _oldOnUnhandledRejectionHandler.apply(this, arguments);\n }\n\n return true;\n };\n}\n","import { StackFrame, StackLineParser, StackLineParserFn, StackParser } from '@sentry/types';\n\nconst STACKTRACE_LIMIT = 50;\n\n/**\n * Creates a stack parser with the supplied line parsers\n *\n * StackFrames are returned in the correct order for Sentry Exception\n * frames and with Sentry SDK internal frames removed from the top and bottom\n *\n */\nexport function createStackParser(...parsers: StackLineParser[]): StackParser {\n const sortedParsers = parsers.sort((a, b) => a[0] - b[0]).map(p => p[1]);\n\n return (stack: string, skipFirst: number = 0): StackFrame[] => {\n const frames: StackFrame[] = [];\n\n for (const line of stack.split('\\n').slice(skipFirst)) {\n // https://github.com/getsentry/sentry-javascript/issues/5459\n // Remove webpack (error: *) wrappers\n const cleanedLine = line.replace(/\\(error: (.*)\\)/, '$1');\n\n for (const parser of sortedParsers) {\n const frame = parser(cleanedLine);\n\n if (frame) {\n frames.push(frame);\n break;\n }\n }\n }\n\n return stripSentryFramesAndReverse(frames);\n };\n}\n\n/**\n * Gets a stack parser implementation from Options.stackParser\n * @see Options\n *\n * If options contains an array of line parsers, it is converted into a parser\n */\nexport function stackParserFromStackParserOptions(stackParser: StackParser | StackLineParser[]): StackParser {\n if (Array.isArray(stackParser)) {\n return createStackParser(...stackParser);\n }\n return stackParser;\n}\n\n/**\n * @hidden\n */\nexport function stripSentryFramesAndReverse(stack: StackFrame[]): StackFrame[] {\n if (!stack.length) {\n return [];\n }\n\n let localStack = stack;\n\n const firstFrameFunction = localStack[0].function || '';\n const lastFrameFunction = localStack[localStack.length - 1].function || '';\n\n // If stack starts with one of our API calls, remove it (starts, meaning it's the top of the stack - aka last call)\n if (firstFrameFunction.indexOf('captureMessage') !== -1 || firstFrameFunction.indexOf('captureException') !== -1) {\n localStack = localStack.slice(1);\n }\n\n // If stack ends with one of our internal API calls, remove it (ends, meaning it's the bottom of the stack - aka top-most call)\n if (lastFrameFunction.indexOf('sentryWrapped') !== -1) {\n localStack = localStack.slice(0, -1);\n }\n\n // The frame where the crash happened, should be the last entry in the array\n return localStack\n .slice(0, STACKTRACE_LIMIT)\n .map(frame => ({\n ...frame,\n filename: frame.filename || localStack[0].filename,\n function: frame.function || '?',\n }))\n .reverse();\n}\n\nconst defaultFunctionName = '';\n\n/**\n * Safely extract function name from itself\n */\nexport function getFunctionName(fn: unknown): string {\n try {\n if (!fn || typeof fn !== 'function') {\n return defaultFunctionName;\n }\n return fn.name || defaultFunctionName;\n } catch (e) {\n // Just accessing custom props in some Selenium environments\n // can cause a \"Permission denied\" exception (see raven-js#495).\n return defaultFunctionName;\n }\n}\n\ntype GetModuleFn = (filename: string | undefined) => string | undefined;\n\n// eslint-disable-next-line complexity\nfunction node(getModule?: GetModuleFn): StackLineParserFn {\n const FILENAME_MATCH = /^\\s*[-]{4,}$/;\n const FULL_MATCH = /at (?:async )?(?:(.+?)\\s+\\()?(?:(.+):(\\d+):(\\d+)?|([^)]+))\\)?/;\n\n // eslint-disable-next-line complexity\n return (line: string) => {\n if (line.match(FILENAME_MATCH)) {\n return {\n filename: line,\n };\n }\n\n const lineMatch = line.match(FULL_MATCH);\n if (!lineMatch) {\n return undefined;\n }\n\n let object: string | undefined;\n let method: string | undefined;\n let functionName: string | undefined;\n let typeName: string | undefined;\n let methodName: string | undefined;\n\n if (lineMatch[1]) {\n functionName = lineMatch[1];\n\n let methodStart = functionName.lastIndexOf('.');\n if (functionName[methodStart - 1] === '.') {\n // eslint-disable-next-line no-plusplus\n methodStart--;\n }\n\n if (methodStart > 0) {\n object = functionName.substr(0, methodStart);\n method = functionName.substr(methodStart + 1);\n const objectEnd = object.indexOf('.Module');\n if (objectEnd > 0) {\n functionName = functionName.substr(objectEnd + 1);\n object = object.substr(0, objectEnd);\n }\n }\n typeName = undefined;\n }\n\n if (method) {\n typeName = object;\n methodName = method;\n }\n\n if (method === '') {\n methodName = undefined;\n functionName = undefined;\n }\n\n if (functionName === undefined) {\n methodName = methodName || '';\n functionName = typeName ? `${typeName}.${methodName}` : methodName;\n }\n\n const filename = lineMatch[2]?.startsWith('file://') ? lineMatch[2].substr(7) : lineMatch[2];\n const isNative = lineMatch[5] === 'native';\n const isInternal =\n isNative || (filename && !filename.startsWith('/') && !filename.startsWith('.') && filename.indexOf(':\\\\') !== 1);\n\n // in_app is all that's not an internal Node function or a module within node_modules\n // note that isNative appears to return true even for node core libraries\n // see https://github.com/getsentry/raven-node/issues/176\n const in_app = !isInternal && filename !== undefined && !filename.includes('node_modules/');\n\n return {\n filename,\n module: getModule?.(filename),\n function: functionName,\n lineno: parseInt(lineMatch[3], 10) || undefined,\n colno: parseInt(lineMatch[4], 10) || undefined,\n in_app,\n };\n };\n}\n\n/**\n * Node.js stack line parser\n *\n * This is in @sentry/utils so it can be used from the Electron SDK in the browser for when `nodeIntegration == true`.\n * This allows it to be used without referencing or importing any node specific code which causes bundlers to complain\n */\nexport function nodeStackLineParser(getModule?: GetModuleFn): StackLineParser {\n return [90, node(getModule)];\n}\n","import { getGlobalObject } from './global';\nimport { logger } from './logger';\n\n/**\n * Tells whether current environment supports ErrorEvent objects\n * {@link supportsErrorEvent}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsErrorEvent(): boolean {\n try {\n new ErrorEvent('');\n return true;\n } catch (e) {\n return false;\n }\n}\n\n/**\n * Tells whether current environment supports DOMError objects\n * {@link supportsDOMError}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsDOMError(): boolean {\n try {\n // Chrome: VM89:1 Uncaught TypeError: Failed to construct 'DOMError':\n // 1 argument required, but only 0 present.\n // @ts-ignore It really needs 1 argument, not 0.\n new DOMError('');\n return true;\n } catch (e) {\n return false;\n }\n}\n\n/**\n * Tells whether current environment supports DOMException objects\n * {@link supportsDOMException}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsDOMException(): boolean {\n try {\n new DOMException('');\n return true;\n } catch (e) {\n return false;\n }\n}\n\n/**\n * Tells whether current environment supports Fetch API\n * {@link supportsFetch}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsFetch(): boolean {\n if (!('fetch' in getGlobalObject())) {\n return false;\n }\n\n try {\n new Headers();\n new Request('http://www.example.com');\n new Response();\n return true;\n } catch (e) {\n return false;\n }\n}\n/**\n * isNativeFetch checks if the given function is a native implementation of fetch()\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function isNativeFetch(func: Function): boolean {\n return func && /^function fetch\\(\\)\\s+\\{\\s+\\[native code\\]\\s+\\}$/.test(func.toString());\n}\n\n/**\n * Tells whether current environment supports Fetch API natively\n * {@link supportsNativeFetch}.\n *\n * @returns true if `window.fetch` is natively implemented, false otherwise\n */\nexport function supportsNativeFetch(): boolean {\n if (!supportsFetch()) {\n return false;\n }\n\n const global = getGlobalObject();\n\n // Fast path to avoid DOM I/O\n // eslint-disable-next-line @typescript-eslint/unbound-method\n if (isNativeFetch(global.fetch)) {\n return true;\n }\n\n // window.fetch is implemented, but is polyfilled or already wrapped (e.g: by a chrome extension)\n // so create a \"pure\" iframe to see if that has native fetch\n let result = false;\n const doc = global.document;\n // eslint-disable-next-line deprecation/deprecation\n if (doc && typeof (doc.createElement as unknown) === 'function') {\n try {\n const sandbox = doc.createElement('iframe');\n sandbox.hidden = true;\n doc.head.appendChild(sandbox);\n if (sandbox.contentWindow && sandbox.contentWindow.fetch) {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n result = isNativeFetch(sandbox.contentWindow.fetch);\n }\n doc.head.removeChild(sandbox);\n } catch (err) {\n __DEBUG_BUILD__ &&\n logger.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', err);\n }\n }\n\n return result;\n}\n\n/**\n * Tells whether current environment supports ReportingObserver API\n * {@link supportsReportingObserver}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsReportingObserver(): boolean {\n return 'ReportingObserver' in getGlobalObject();\n}\n\n/**\n * Tells whether current environment supports Referrer Policy API\n * {@link supportsReferrerPolicy}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsReferrerPolicy(): boolean {\n // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default'\n // (see https://caniuse.com/#feat=referrer-policy),\n // it doesn't. And it throws an exception instead of ignoring this parameter...\n // REF: https://github.com/getsentry/raven-js/issues/1233\n\n if (!supportsFetch()) {\n return false;\n }\n\n try {\n new Request('_', {\n referrerPolicy: 'origin' as ReferrerPolicy,\n });\n return true;\n } catch (e) {\n return false;\n }\n}\n\n/**\n * Tells whether current environment supports History API\n * {@link supportsHistory}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsHistory(): boolean {\n // NOTE: in Chrome App environment, touching history.pushState, *even inside\n // a try/catch block*, will cause Chrome to output an error to console.error\n // borrowed from: https://github.com/angular/angular.js/pull/13945/files\n const global = getGlobalObject();\n /* eslint-disable @typescript-eslint/no-unsafe-member-access */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const chrome = (global as any).chrome;\n const isChromePackagedApp = chrome && chrome.app && chrome.app.runtime;\n /* eslint-enable @typescript-eslint/no-unsafe-member-access */\n const hasHistoryApi = 'history' in global && !!global.history.pushState && !!global.history.replaceState;\n\n return !isChromePackagedApp && hasHistoryApi;\n}\n","(()=>{\"use strict\";var e={800:e=>{\n/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\nvar r=Object.getOwnPropertySymbols;var t=Object.prototype.hasOwnProperty;var u=Object.prototype.propertyIsEnumerable;function toObject(e){if(e===null||e===undefined){throw new TypeError(\"Object.assign cannot be called with null or undefined\")}return Object(e)}function shouldUseNative(){try{if(!Object.assign){return false}var e=new String(\"abc\");e[5]=\"de\";if(Object.getOwnPropertyNames(e)[0]===\"5\"){return false}var r={};for(var t=0;t<10;t++){r[\"_\"+String.fromCharCode(t)]=t}var u=Object.getOwnPropertyNames(r).map((function(e){return r[e]}));if(u.join(\"\")!==\"0123456789\"){return false}var n={};\"abcdefghijklmnopqrst\".split(\"\").forEach((function(e){n[e]=e}));if(Object.keys(Object.assign({},n)).join(\"\")!==\"abcdefghijklmnopqrst\"){return false}return true}catch(e){return false}}e.exports=shouldUseNative()?Object.assign:function(e,n){var a;var i=toObject(e);var s;for(var c=1;c{\n/** @license React vundefined\n * use-subscription.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nif(process.env.NODE_ENV!==\"production\"){(function(){\"use strict\";var e=t(800);var u=t(522);function useSubscription(r){var t=r.getCurrentValue,n=r.subscribe;var a=u.useState((function(){return{getCurrentValue:t,subscribe:n,value:t()}})),i=a[0],s=a[1];var c=i.value;if(i.getCurrentValue!==t||i.subscribe!==n){c=t();s({getCurrentValue:t,subscribe:n,value:c})}u.useDebugValue(c);u.useEffect((function(){var r=false;var checkForUpdates=function(){if(r){return}var u=t();s((function(r){if(r.getCurrentValue!==t||r.subscribe!==n){return r}if(r.value===u){return r}return e({},r,{value:u})}))};var u=n(checkForUpdates);checkForUpdates();return function(){r=true;u()}}),[t,n]);return c}r.useSubscription=useSubscription})()}},403:(e,r,t)=>{\n/** @license React vundefined\n * use-subscription.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nvar u=t(800),n=t(522);r.useSubscription=function(e){var r=e.getCurrentValue,t=e.subscribe,a=n.useState((function(){return{getCurrentValue:r,subscribe:t,value:r()}}));e=a[0];var i=a[1];a=e.value;if(e.getCurrentValue!==r||e.subscribe!==t)a=r(),i({getCurrentValue:r,subscribe:t,value:a});n.useDebugValue(a);n.useEffect((function(){function b(){if(!e){var n=r();i((function(e){return e.getCurrentValue!==r||e.subscribe!==t||e.value===n?e:u({},e,{value:n})}))}}var e=!1,n=t(b);b();return function(){e=!0;n()}}),[r,t]);return a}},138:(e,r,t)=>{if(process.env.NODE_ENV===\"production\"){e.exports=t(403)}else{e.exports=t(569)}},522:e=>{e.exports=require(\"react\")}};var r={};function __nccwpck_require__(t){var u=r[t];if(u!==undefined){return u.exports}var n=r[t]={exports:{}};var a=true;try{e[t](n,n.exports,__nccwpck_require__);a=false}finally{if(a)delete r[t]}return n.exports}if(typeof __nccwpck_require__!==\"undefined\")__nccwpck_require__.ab=__dirname+\"/\";var t=__nccwpck_require__(138);module.exports=t})();","module.exports = require('./dist/shared/lib/dynamic')\n","\"use strict\";\n\nvar _defineProperty = require(\"/home/vsts/work/r1/a/artifacts/source-code/node_modules/next/dist/compiled/@babel/runtime/helpers/defineProperty\");\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = dynamic;\nexports.noSSR = noSSR;\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _loadable = _interopRequireDefault(require(\"./loadable\"));\n\nfunction dynamic(dynamicOptions, options) {\n let loadableFn = _loadable.default;\n let loadableOptions = {\n // A loading component is not required, so we default it\n loading: _ref => {\n let {\n error,\n isLoading,\n pastDelay\n } = _ref;\n if (!pastDelay) return null;\n\n if (process.env.NODE_ENV === 'development') {\n if (isLoading) {\n return null;\n }\n\n if (error) {\n return /*#__PURE__*/_react.default.createElement(\"p\", null, error.message, /*#__PURE__*/_react.default.createElement(\"br\", null), error.stack);\n }\n }\n\n return null;\n }\n }; // Support for direct import(), eg: dynamic(import('../hello-world'))\n // Note that this is only kept for the edge case where someone is passing in a promise as first argument\n // The react-loadable babel plugin will turn dynamic(import('../hello-world')) into dynamic(() => import('../hello-world'))\n // To make sure we don't execute the import without rendering first\n\n if (dynamicOptions instanceof Promise) {\n loadableOptions.loader = () => dynamicOptions; // Support for having import as a function, eg: dynamic(() => import('../hello-world'))\n\n } else if (typeof dynamicOptions === 'function') {\n loadableOptions.loader = dynamicOptions; // Support for having first argument being options, eg: dynamic({loader: import('../hello-world')})\n } else if (typeof dynamicOptions === 'object') {\n loadableOptions = _objectSpread(_objectSpread({}, loadableOptions), dynamicOptions);\n } // Support for passing options, eg: dynamic(import('../hello-world'), {loading: () =>

Loading something

})\n\n\n loadableOptions = _objectSpread(_objectSpread({}, loadableOptions), options);\n const suspenseOptions = loadableOptions; // Error if Fizz rendering is not enabled and `suspense` option is set to true\n\n if (!process.env.__NEXT_CONCURRENT_FEATURES && suspenseOptions.suspense) {\n throw new Error(\"Invalid suspense option usage in next/dynamic. Read more: https://nextjs.org/docs/messages/invalid-dynamic-suspense\");\n }\n\n if (suspenseOptions.suspense) {\n return loadableFn(suspenseOptions);\n } // coming from build/babel/plugins/react-loadable-plugin.js\n\n\n if (loadableOptions.loadableGenerated) {\n loadableOptions = _objectSpread(_objectSpread({}, loadableOptions), loadableOptions.loadableGenerated);\n delete loadableOptions.loadableGenerated;\n } // support for disabling server side rendering, eg: dynamic(import('../hello-world'), {ssr: false})\n\n\n if (typeof loadableOptions.ssr === 'boolean') {\n if (!loadableOptions.ssr) {\n delete loadableOptions.ssr;\n return noSSR(loadableFn, loadableOptions);\n }\n\n delete loadableOptions.ssr;\n }\n\n return loadableFn(loadableOptions);\n}\n\nfunction _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n default: obj\n };\n}\n\nconst isServerSide = typeof window === 'undefined';\n\nfunction noSSR(LoadableInitializer, loadableOptions) {\n // Removing webpack and modules means react-loadable won't try preloading\n delete loadableOptions.webpack;\n delete loadableOptions.modules; // This check is necessary to prevent react-loadable from initializing on the server\n\n if (!isServerSide) {\n return LoadableInitializer(loadableOptions);\n }\n\n const Loading = loadableOptions.loading; // This will only be rendered on the server side\n\n return () => /*#__PURE__*/_react.default.createElement(Loading, {\n error: null,\n isLoading: true,\n pastDelay: false,\n timedOut: false\n });\n}","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.LoadableContext = void 0;\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nfunction _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n default: obj\n };\n}\n\nconst LoadableContext = _react.default.createContext(null);\n\nexports.LoadableContext = LoadableContext;\n\nif (process.env.NODE_ENV !== 'production') {\n LoadableContext.displayName = 'LoadableContext';\n}","\"use strict\";\n\nvar _defineProperty = require(\"/home/vsts/work/r1/a/artifacts/source-code/node_modules/next/dist/compiled/@babel/runtime/helpers/defineProperty\");\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _useSubscription = require(\"next/dist/compiled/use-subscription\");\n\nvar _loadableContext = require(\"./loadable-context\");\n\nfunction _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n default: obj\n };\n}\n\nconst ALL_INITIALIZERS = [];\nconst READY_INITIALIZERS = [];\nlet initialized = false;\n\nfunction load(loader) {\n let promise = loader();\n let state = {\n loading: true,\n loaded: null,\n error: null\n };\n state.promise = promise.then(loaded => {\n state.loading = false;\n state.loaded = loaded;\n return loaded;\n }).catch(err => {\n state.loading = false;\n state.error = err;\n throw err;\n });\n return state;\n}\n\nfunction resolve(obj) {\n return obj && obj.__esModule ? obj.default : obj;\n}\n\nfunction createLoadableComponent(loadFn, options) {\n let opts = Object.assign({\n loader: null,\n loading: null,\n delay: 200,\n timeout: null,\n webpack: null,\n modules: null,\n suspense: false\n }, options);\n\n if (opts.suspense) {\n opts.lazy = _react.default.lazy(opts.loader);\n }\n\n let subscription = null;\n\n function init() {\n if (!subscription) {\n const sub = new LoadableSubscription(loadFn, opts);\n subscription = {\n getCurrentValue: sub.getCurrentValue.bind(sub),\n subscribe: sub.subscribe.bind(sub),\n retry: sub.retry.bind(sub),\n promise: sub.promise.bind(sub)\n };\n }\n\n return subscription.promise();\n } // Server only\n\n\n if (typeof window === 'undefined' && !opts.suspense) {\n ALL_INITIALIZERS.push(init);\n } // Client only\n\n\n if (!initialized && typeof window !== 'undefined' && !opts.suspense) {\n // require.resolveWeak check is needed for environments that don't have it available like Jest\n const moduleIds = opts.webpack && typeof require.resolveWeak === 'function' ? opts.webpack() : opts.modules;\n\n if (moduleIds) {\n READY_INITIALIZERS.push(ids => {\n for (const moduleId of moduleIds) {\n if (ids.indexOf(moduleId) !== -1) {\n return init();\n }\n }\n });\n }\n }\n\n function LoadableImpl(props, ref) {\n init();\n\n const context = _react.default.useContext(_loadableContext.LoadableContext);\n\n const state = (0, _useSubscription).useSubscription(subscription);\n\n _react.default.useImperativeHandle(ref, () => ({\n retry: subscription.retry\n }), []);\n\n if (context && Array.isArray(opts.modules)) {\n opts.modules.forEach(moduleName => {\n context(moduleName);\n });\n }\n\n return _react.default.useMemo(() => {\n if (state.loading || state.error) {\n return _react.default.createElement(opts.loading, {\n isLoading: state.loading,\n pastDelay: state.pastDelay,\n timedOut: state.timedOut,\n error: state.error,\n retry: subscription.retry\n });\n } else if (state.loaded) {\n return _react.default.createElement(resolve(state.loaded), props);\n } else {\n return null;\n }\n }, [props, state]);\n }\n\n function LazyImpl(props, ref) {\n return _react.default.createElement(opts.lazy, _objectSpread(_objectSpread({}, props), {}, {\n ref\n }));\n }\n\n const LoadableComponent = opts.suspense ? LazyImpl : LoadableImpl;\n\n LoadableComponent.preload = () => !opts.suspense && init();\n\n LoadableComponent.displayName = 'LoadableComponent';\n return _react.default.forwardRef(LoadableComponent);\n}\n\nclass LoadableSubscription {\n constructor(loadFn, opts) {\n this._loadFn = loadFn;\n this._opts = opts;\n this._callbacks = new Set();\n this._delay = null;\n this._timeout = null;\n this.retry();\n }\n\n promise() {\n return this._res.promise;\n }\n\n retry() {\n this._clearTimeouts();\n\n this._res = this._loadFn(this._opts.loader);\n this._state = {\n pastDelay: false,\n timedOut: false\n };\n const {\n _res: res,\n _opts: opts\n } = this;\n\n if (res.loading) {\n if (typeof opts.delay === 'number') {\n if (opts.delay === 0) {\n this._state.pastDelay = true;\n } else {\n this._delay = setTimeout(() => {\n this._update({\n pastDelay: true\n });\n }, opts.delay);\n }\n }\n\n if (typeof opts.timeout === 'number') {\n this._timeout = setTimeout(() => {\n this._update({\n timedOut: true\n });\n }, opts.timeout);\n }\n }\n\n this._res.promise.then(() => {\n this._update({});\n\n this._clearTimeouts();\n }).catch(_err => {\n this._update({});\n\n this._clearTimeouts();\n });\n\n this._update({});\n }\n\n _update(partial) {\n this._state = _objectSpread(_objectSpread({}, this._state), {}, {\n error: this._res.error,\n loaded: this._res.loaded,\n loading: this._res.loading\n }, partial);\n\n this._callbacks.forEach(callback => callback());\n }\n\n _clearTimeouts() {\n clearTimeout(this._delay);\n clearTimeout(this._timeout);\n }\n\n getCurrentValue() {\n return this._state;\n }\n\n subscribe(callback) {\n this._callbacks.add(callback);\n\n return () => {\n this._callbacks.delete(callback);\n };\n }\n\n}\n\nfunction Loadable(opts) {\n return createLoadableComponent(load, opts);\n}\n\nfunction flushInitializers(initializers, ids) {\n let promises = [];\n\n while (initializers.length) {\n let init = initializers.pop();\n promises.push(init(ids));\n }\n\n return Promise.all(promises).then(() => {\n if (initializers.length) {\n return flushInitializers(initializers, ids);\n }\n });\n}\n\nLoadable.preloadAll = () => {\n return new Promise((resolveInitializers, reject) => {\n flushInitializers(ALL_INITIALIZERS).then(resolveInitializers, reject);\n });\n};\n\nLoadable.preloadReady = function () {\n let ids = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n return new Promise(resolvePreload => {\n const res = () => {\n initialized = true;\n return resolvePreload();\n }; // We always will resolve, errors should be handled within loading UIs.\n\n\n flushInitializers(READY_INITIALIZERS, ids).then(res, res);\n });\n};\n\nif (typeof window !== 'undefined') {\n window.__NEXT_PRELOADREADY = Loadable.preloadReady;\n}\n\nvar _default = Loadable;\nexports.default = _default;"],"names":["integrations","defaultIntegrations","forEach","integration","isDefaultInstance","Array","isArray","userIntegrations","currentInstance","name","existingInstance","integrationsByName","Object","values","debugIndex","debugInstance","finalIntegrations","splice","push","clientClass","options","debug","logger","console","scope","update","initialScope","hub","bindClient","client","InboundFilters","setupOnce","self","internalOptions","clientOptions","allowUrls","denyUrls","ignoreErrors","ignoreInternal","undefined","event","_isSentryError","length","message","exception","type","value","_getPossibleEventMessages","some","_isIgnoredError","getEventDescription","url","pattern","_isDeniedUrl","_getEventFilterUrl","_isAllowedUrl","_shouldDropEvent","eventProcess","id","this","addGlobalEventProcessor","frames","stacktrace","i","frame","filename","_getLastValidUrl","originalFunctionToString","Function","args","apply","context","FunctionToString","constructor","super","prototype","setPrototypeOf","logLevel","host","path","pass","port","projectId","protocol","publicKey","dsnFromComponents","components","match","SentryError","lastPath","slice","split","join","pop","projectMatch","dsn","component","isValidProtocol","isNaN","parseInt","validateDsn","headers","items","envelope","newItem","callback","envelopeItem","envelopeItemType","encodeUTF8","input","encode","envHeaders","parts","append","next","textEncoder","itemHeaders","payload","item","Uint8Array","JSON","stringify","buffers","offset","merged","set","buffer","concatBuffers","attachment","dropUndefinedKeys","content_type","attachment_type","session","sessions","transaction","client_report","user_report","ITEM_TYPE_TO_DATA_CATEGORY_MAP","obj","hasWeakSet","inner","has","add","delete","visit","depth","maxProperties","ERROR","object","maxSize","jsonSize","normalized","normalizeToSize","key","memo","memoBuilder","memoize","unmemoize","stringified","startsWith","replace","valueWithToJSON","toJSON","jsonValue","numAdded","hasOwnProperty","call","visitable","visitKey","visitValue","stringifyValue","g","is","utf8Length","getBaseApiEndpoint","_getIngestEndpoint","_encodedAuth","sentry_key","sentry_version","sdkInfo","sentry_client","tunnelOrOptions","tunnel","version","metadata","transactionSampling","method","rate","enhanceEventWithSdkInfo","event_id","sent_at","sdk","dynamicSamplingContext","trace","sample_rates","BaseClient","_options","_dsn","_transport","transport","recordDroppedEvent","bind","captureException","eventId","_process","then","result","level","hint","promisedEvent","captureEvent","originalException","captureSession","_isEnabled","release","sendSession","updateSession","init","flush","_isClientDoneProcessing","timeout","clientFinished","transportFlushed","close","getOptions","enabled","_integrationsInitialized","_integrations","integrationIndex","installedIntegrations","indexOf","setupIntegrations","getIntegrationById","integrationId","getIntegration","sendEvent","env","createEventEnvelope","_metadata","createAttachmentEnvelopeItem","_sendEnvelope","sendClientReports","_outcomes","_updateSessionFromEvent","crashed","errored","exceptions","mechanism","handled","status","errors","Number","resolve","ticked","_numProcessing","clearInterval","interval","_prepareEvent","normalizeDepth","normalizeMaxBreadth","timestamp","_applyClientOptions","prepared","_applyIntegrationsMetadata","finalScope","captureContext","attachments","applyToEvent","evt","_normalizeEvent","breadcrumbs","b","data","user","contexts","extra","maxBreadth","spans","map","span","environment","dist","maxValueLength","request","integrationsArray","_captureEvent","_processEvent","finalEvent","reason","beforeSend","sampleRate","isTransaction","Math","random","rv","e","nullErr","processedEvent","transactionInfo","changes","propagations","__sentry__","promise","send","keys","outcomes","category","quantity","ex","extractMessage","exceptionFromError","stackParser","framesToPop","reactMinifiedRegexp","test","popSize","error","syntheticException","attachStacktrace","isUnhandledRejection","eventFromError","eventFromString","addExceptionTypeValue","domException","tags","extractExceptionKeysForMessage","__serialized__","eventFromPlainObject","addExceptionMechanism","synthetic","relative","query","fragment","Breadcrumbs","dom","fetch","history","sentry","xhr","addInstrumentationHandler","_consoleBreadcrumb","target","keyAttrs","serializeAttribute","handlerData","htmlTreeAsString","getCurrentHub","addBreadcrumb","global","_innerDomBreadcrumb","_domBreadcrumb","_xhrBreadcrumb","_fetchBreadcrumb","_historyBreadcrumb","arguments","breadcrumb","endTimestamp","__sentry_own_request__","status_code","body","fetchData","response","from","to","parsedFrom","parseUrl","parsedLoc","parsedTo","cachedFetchImpl","fetchImpl","sandbox","hidden","document","head","appendChild","contentWindow","removeChild","packages","globalObject","addEventListener","visibilityState","_flushOutcomes","eventFromException","eventFromMessage","breadcrumbIntegration","platform","discarded_events","createEnvelope","sendBeacon","credentials","keepalive","sendReport","createFrame","func","function","in_app","lineno","colno","subMatch","extractSafariExtensionDetails","UNKNOWN_FUNCTION","isSafariExtension","isSafariWebExtension","withScope","ignoreOnError","setTimeout","fn","before","wrapper","wrappedArguments","ignoreNextOnError","addEventProcessor","property","sentryWrapped","markFunctionWrapped","addNonEnumerableProperty","descriptor","configurable","defineProperty","get","TryCatch","XMLHttpRequest","eventTarget","requestAnimationFrame","setInterval","fill","_wrapTimeFunction","_wrapRAF","_wrapXHR","eventTargetOption","_wrapEventTarget","original","originalCallback","wrap","handler","originalSend","xmlHttpRequestProps","prop","originalFunction","wrapOptions","proto","eventName","handleEvent","originalRemoveEventListener","onerror","onunhandledrejection","GlobalHandlers","Error","stackTraceLimit","installFunc","_installFunc","_installGlobalOnErrorHandler","msg","line","column","groups","_enhanceEventWithInitialFrame","_eventFromIncompleteOnError","eventFromUnknownInput","addMechanismAndCapture","_installGlobalOnUnhandledRejectionHandler","_eventFromRejectionWithPrimitive","ev0sf","getHubAndOptions","LinkedErrors","_key","_limit","limit","parser","linkedErrors","_handler","stack","_walkErrorTree","currentEvent","previousEvent","currentMessage","previousMessage","_isSameFingerprint","_isSameStacktrace","_isSameMessageEvent","previousException","currentException","_isSameExceptionEvent","_previousEvent","eventProcessor","currentFrames","_getFramesFromEvent","previousFrames","frameA","currentFingerprint","fingerprint","previousFingerprint","_getExceptionFromEvent","Dedupe","HttpContext","navigator","location","referrer","userAgent","Referer","remove","task","$","taskProducer","drain","counter","clearTimeout","capturedSetTimeout","reject","headerDelay","headerDate","now","limits","all","disabledUntil","statusCode","Date","rateLimitHeader","retryAfter","categories","updatedRateLimits","delay","parseRetryAfterHeader","retryAfterHeader","makeRequest","makePromiseBuffer","rateLimits","forEachEnvelopeItem","isRateLimited","envelopeItemDataCategory","filteredEnvelopeItems","filteredEnvelope","_","recordEnvelopeLoss","nativeFetch","getNativeFetchImplementation","referrerPolicy","requestOptions","createTransport","onreadystatechange","readyState","getResponseHeader","open","header","setRequestHeader","startSessionOnHub","startSession","ignoreDuration","startSessionTracking","window","SENTRY_RELEASE","autoSessionTracking","initAndBind","init$1","errorCallback","activeTransaction","setStatus","traceHeaders","toTraceparent","sample","samplingContext","sampled","setMetadata","tracesSampler","parentSampled","tracesSampleRate","isValidSampleRate","_startTransaction","transactionContext","customSamplingContext","initSpanRecorder","_experiments","idleTimeout","finalTimeout","onScope","carrier","__SENTRY__","extensions","startTransaction","_addTracingExtensions","mongodb","Mongo","mongoose","mysql","Mysql","pg","Postgres","filter","moduleName","pkg","p","mappedPackages","_autoloadDatabaseIntegrations","_pushActivity","_popActivity","transactionSpanId","maxlen","spanId","finish","_idleHub","_idleTimeout","DEFAULT_IDLE_TIMEOUT","_finalTimeout","DEFAULT_FINAL_TIMEOUT","_onScope","IdleTransaction","clearActiveTransaction","configureScope","setSpan","_startIdleTimeout","_finished","activities","spanRecorder","keepSpan","registerBeforeFinishCallback","_beforeFinishCallbacks","IdleTransactionSpanRecorder","_pingHeartbeat","_idleTimeoutID","_cancelIdleTimeout","heartbeatString","_prevHeartbeatString","_heartbeatCounter","_beat","entries","reduce","baggageHeader","newBaggageHeader","objectKey","objectValue","objectToBaggageHeader","acc","baggageHeaderToObject","baggageEntry","metric","reportAllChanges","prevValue","forceReport","delta","PerformanceObserver","supportedEntryTypes","includes","po","observe","buffered","cb","once","removeEventListener","onHiddenOrPageHide","firstHiddenTime","onHidden","timeStamp","_objectWithoutProperties","source","excluded","sourceKeys","objectWithoutPropertiesLoose","getOwnPropertySymbols","sourceSymbolKeys","propertyIsEnumerable","isFinite","startTimestamp","startChild","ctx","getBrowserPerformanceAPI","_lcpEntry","_clsEntry","_performanceCursor","_measurements","_trackCLS","report","sessionValue","sessionEntries","entry","hadRecentInput","onReport","takeRecords","entryHandler","_trackLCP","visibilityWatcher","reportedMetricIDs","disconnect","stopListening","capture","_trackFID","startTime","processingStart","_addPerformanceNavigationTiming","traceFetch","traceXHR","tracingOrigins","shouldCreateSpanForRequest","defaultRequestInstrumentationOptions","urlMap","origins","shouldCreateSpan","defaultShouldCreateSpan","description","op","__span","sentryTraceHeader","sentryBaggageHeader","newHeaders","existingBaggageHeader","newBaggageHeaders","baggage","addTracingHeadersToFetchRequest","fetchCallback","setHttpStatus","__sentry_xhr_span_id__","xhrCallback","customStartTransaction","startTransactionOnPageLoad","startTransactionOnLocationChange","startingUrl","pathname","lastAccessLHS","ops","statusType","setTag","traceparent","matches","traceId","parentSpanId","baggageObject","currBaggageObject","SENTRY_BAGGAGE_KEY_PREFIX_REGEX","__SENTRY_TRACING__","addExtensionMethods","maybeOptions","time","lhs","rhsFn","instrument","instrumented","CONSOLE_LEVELS","originalConsoleMethod","triggerHandlers","instrumentConsole","globalDOMEventHandler","originalAddEventListener","listener","refCount","handlerForType","instrumentDOM","xhrproto","originalOpen","xhrInfo","onreadystatechangeHandler","readyStateArgs","__sentry_xhr__","instrumentXHR","originalFetch","getFetchMethod","getFetchUrl","instrumentFetch","historyReplacementFunction","originalHistoryFunction","lastHref","onpopstate","oldOnPopState","instrumentHistory","_oldOnErrorHandler","_oldOnUnhandledRejectionHandler","handlers","getFunctionName","fetchArgs","Request","String","toUpperCase","debounceTimerID","lastCapturedEvent","shouldShortcircuitPreviousDebounce","previous","current","shouldSkipDOMEvent","tagName","isContentEditable","makeDOMEventHandler","globalListener","Headers","Response","toString","supportsFetch","doc","isChromePackagedApp","hasHistoryApi","r","t","u","toObject","TypeError","exports","assign","getOwnPropertyNames","fromCharCode","n","shouldUseNative","a","s","c","o","f","process","useSubscription","getCurrentValue","subscribe","useState","useDebugValue","useEffect","require","__nccwpck_require__","ab","__dirname","module","_defineProperty","ownKeys","enumerableOnly","symbols","sym","getOwnPropertyDescriptor","enumerable","_objectSpread","getOwnPropertyDescriptors","defineProperties","dynamicOptions","loadableFn","_loadable","loadableOptions","loading","_ref","isLoading","pastDelay","Promise","loader","suspenseOptions","suspense","loadableGenerated","ssr","noSSR","_interopRequireDefault","__esModule","default","LoadableInitializer","webpack","modules","LoadableContext","createContext","_react","_useSubscription","_loadableContext","ALL_INITIALIZERS","READY_INITIALIZERS","initialized","load","state","loaded","err","LoadableSubscription","loadFn","opts","_loadFn","_opts","_callbacks","Set","_delay","_timeout","retry","_res","_clearTimeouts","_state","timedOut","res","_update","_err","partial","Loadable","lazy","subscription","sub","moduleIds","ids","moduleId","LoadableComponent","props","ref","createElement","useContext","useImperativeHandle","useMemo","preload","displayName","forwardRef","createLoadableComponent","flushInitializers","initializers","promises","preloadAll","resolveInitializers","preloadReady","resolvePreload","__NEXT_PRELOADREADY","_default"],"sourceRoot":""}