/usr/share/grafana/public/app/plugins/datasource/graphite/dist
{"version":3,"file":"module.js","mappings":"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AAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAC5G,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAC5G,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAC5G,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAC5G,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAC5G,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAC5G,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAC5G,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAC5G,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAC5G,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAC5G,KAAM,KAAM,KAAM,KAAM,KAAM,IAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAC5G,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAC5G,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAC5G,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAC5G,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAC5G,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAC5G,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAAO,MAAO,MAC9G,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAChH,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAChH,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAChH,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAChH,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAChH,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAChH,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAChH,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAChH,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAChH,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAChH,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAChH,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAChH,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAChH,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAChH,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAChH,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAChH,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAChH,MAAO,MAAO,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAC9G,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OACxG,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OACxG,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OACxG,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OACxG,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,QAG5CC,EAAkC,GAExC,IAAK,IAAIxP,EAAI,EAAGA,EAAI,IAAKA,IACvBwP,EAAqBxP,GACnB,GAAM,IAAMA,GAAK,IACX,KAANA,GACM,MAANA,GACM,MAANA,GACCA,GAAK,IAAMA,GAAK,IACX,KAANA,GACM,KAANA,GACM,KAANA,GACM,KAANA,GACM,KAANA,GACM,KAANA,GACM,KAANA,GACM,KAANA,GACM,KAANA,GACM,KAANA,GACM,KAANA,GACCA,GAAK,IAAMA,GAAK,IAGrB,MAAMyP,EAAsBD,EAErB,MAAME,EAWXC,IAAAA,CAAK3P,GACH,OAAO5J,KAAKwZ,MAAMC,OAAO7P,GAAK,EAChC,CAEA8P,IAAAA,CAAK9P,GACHA,EAAIA,GAAK,EACT5J,KAAK2Z,MAAQ/P,EACb5J,KAAKwZ,MAAQxZ,KAAKwZ,MAAMvN,MAAMrC,EAChC,CAEAgQ,QAAAA,GACE,MAAMlU,EAAO,GACb,IAAI4L,EAAQtR,KAAKa,OACjB,KAAOyQ,GACL5L,EAAKuK,KAAKqB,GACVA,EAAQtR,KAAKa,OAEf,OAAO6E,CACT,CAEA7E,IAAAA,GAIE,GAHAb,KAAKuO,KAAOvO,KAAK2Z,KAGb,KAAKrU,KAAKtF,KAAKuZ,QAAS,CAC1B,KAAO,KAAKjU,KAAKtF,KAAKuZ,SACpBvZ,KAAKuO,MAAQ,EACbvO,KAAK0Z,OAGP,GAAoB,KAAhB1Z,KAAKuZ,OAEP,OAAO,IAEX,CAEA,IAAI9X,EAAQzB,KAAK6Z,oBACjB,OAAIpY,IAIJA,EAAQzB,KAAK8Z,kBAAoB9Z,KAAK+Z,sBAAwB/Z,KAAKga,kBAAoBha,KAAKia,uBAExFxY,GACFzB,KAAK0Z,KAAKjY,EAAMnB,MAAM2B,QACfR,GAIF,KACT,CAEAwY,oBAAAA,GACE,MAAoB,MAAhBja,KAAKuZ,QAAmC,MAAjBvZ,KAAKuZ,KAAK,GAC5B,CACLpE,KAAM,gBACN7U,MAAO,KACP4Z,IAAKla,KAAK2Z,MAIM,MAAhB3Z,KAAKuZ,QAAmC,MAAjBvZ,KAAKuZ,KAAK,GAC5B,CACLpE,KAAM,cACN7U,MAAO,KACP4Z,IAAKla,KAAK2Z,MAIP,IACT,CAQAK,cAAAA,GACE,IAEI7E,EAAMwE,EAFNhN,EAAK,GACL3K,EAAQ,EAWZ,SAASmY,EAAgBjC,GACvB,IAAK,IAAItO,EAAI,EAAGA,EAAIuP,EAAmBlX,QAAU,CAC/C,GAAIiW,EAAOiB,EAAmBvP,KAC5B,OAAO,EAGT,GAAIsO,GAAQiB,EAAmBvP,KAC7B,OAAO,CAEX,CAEA,OAAO,CACT,CAEA,SAASwQ,EAAWC,GAClB,MAAO,gBAAgB/U,KAAK+U,EAC9B,CAEA,MAAMC,GAA4BC,EAAAA,EAAAA,OAAK,WAGrC,GAFAvY,GAAS,EAEgB,MAArBhC,KAAKuZ,KAAKvX,GACZ,OAAO,KAGT,MAAMwY,EAAMxa,KAAKuZ,KAAKvX,EAAQ,GACxByY,EAAMza,KAAKuZ,KAAKvX,EAAQ,GACxB0Y,EAAM1a,KAAKuZ,KAAKvX,EAAQ,GACxB2Y,EAAM3a,KAAKuZ,KAAKvX,EAAQ,GAC9B,IAAIkW,EAEJ,OAAIkC,EAAWI,IAAQJ,EAAWK,IAAQL,EAAWM,IAAQN,EAAWO,IACtEzC,EAAO0C,SAASJ,EAAMC,EAAMC,EAAMC,EAAK,IAEnCR,EAAgBjC,IAClBlW,GAAS,EACF,MAAQwY,EAAMC,EAAMC,EAAMC,GAG5B,MAGF,IACT,GAAG3a,MAEG6a,GAAqBN,EAAAA,EAAAA,OAAK,WAC9B,MAAMO,EAAM9a,KAAKuZ,KAAKvX,GAChBkW,EAAO4C,EAAIC,WAAW,GAE5B,MAAY,MAARD,GACF9Y,GAAS,EACF8Y,GAGI,KAAT5C,EACKoC,IAGLpC,EAAO,IACLkB,EAAqBlB,IACvBlW,GAAS,EACF8Y,GAGF,KAGLX,EAAgBjC,IAClBlW,GAAS,EACF8Y,GAGF,IACT,GAAG9a,MAEGgb,GAAoBT,EAAAA,EAAAA,OAAK,WAC7B,MAAMO,EAAM9a,KAAKuZ,KAAKvX,GAChBkW,EAAO4C,EAAIC,WAAW,GAE5B,OAAa,KAAT7C,EACKoC,IAGLpC,EAAO,IACLmB,EAAoBnB,IACtBlW,GAAS,EACF8Y,GAGF,KAGLX,EAAgBjC,IAClBlW,GAAS,EACF8Y,GAGF,IACT,GAAG9a,MAGH,GADA2Z,EAAOkB,IACM,OAATlB,EACF,OAAO,KAIT,IADAhN,EAAKgN,EAEHA,EAAOqB,IAEM,OAATrB,GAIJhN,GAAMgN,EAGR,OAAQhN,GACN,IAAK,OAIL,IAAK,QACHwI,EAAO,OACP,MAEF,QACEA,EAAO,aAGX,MAAO,CACLA,KAAMA,EACN7U,MAAOqM,EACPuN,IAAKla,KAAK2Z,KAEd,CAWAI,kBAAAA,GACE,IAAI/X,EAAQ,EACR1B,EAAQ,GACZ,MAAM2B,EAASjC,KAAKwZ,MAAMvX,OAC1B,IACIgZ,EADAtB,EAAO3Z,KAAKuZ,KAAKvX,GAGrB,SAASkZ,EAAeb,GACtB,MAAO,UAAU/U,KAAK+U,EACxB,CAEA,SAASc,EAAad,GACpB,MAAO,UAAU/U,KAAK+U,EACxB,CAMA,SAASe,EAAkBC,GACzB,MAAc,MAAPA,GAAqB,MAAPA,GAAqB,OAAPA,GAAgBA,GAAM,KAAOA,GAAM,KAASA,GAAM,KAAOA,GAAM,GACpG,CAUA,GAPa,MAAT1B,IACFrZ,GAASqZ,EACT3X,GAAS,EACT2X,EAAO3Z,KAAKuZ,KAAKvX,IAIN,MAAT2X,IAAiBuB,EAAevB,GAClC,OAAO,KAGT,GAAa,MAATA,EAAc,CAKhB,GAJArZ,GAASN,KAAKuZ,KAAKvX,GACnBA,GAAS,EACT2X,EAAO3Z,KAAKuZ,KAAKvX,GAEH,MAAV1B,EAAe,CAEjB,GAAa,MAATqZ,GAAyB,MAATA,EAAc,CAIhC,IAHA3X,GAAS,EACT1B,GAASqZ,EAEF3X,EAAQC,IACb0X,EAAO3Z,KAAKuZ,KAAKvX,GA/BhB,gBAAgBsD,KAgCDqU,KAGhBrZ,GAASqZ,EACT3X,GAAS,EAGX,OAAI1B,EAAM2B,QAAU,EAEX,CACLkT,KAAM,SACN7U,MAAOA,EACPgb,aAAa,EACbpB,IAAKla,KAAK2Z,MAIV3X,EAAQC,IACV0X,EAAO3Z,KAAKuZ,KAAKvX,GACboZ,EAAkBzB,IACb,KAIJ,CACLxE,KAAM,SACN7U,MAAOA,EACP0P,KAAM,GACNsL,aAAa,EACbpB,IAAKla,KAAK2Z,KAEd,CAGA,GAAIwB,EAAaxB,GAAO,CAKtB,IAJA3X,GAAS,EACT1B,GAASqZ,EACTsB,GAAM,EAECjZ,EAAQC,GAAQ,CASrB,GARA0X,EAAO3Z,KAAKuZ,KAAKvX,GAKbkZ,EAAevB,KACjBsB,GAAM,IAEHE,EAAaxB,GAAO,CAEvB,IAAK3Z,KAAKub,aAAa5B,GACrB,OAAO,KAET,KACF,CACArZ,GAASqZ,EACT3X,GAAS,CACX,CAEA,OAAIA,EAAQC,IACV0X,EAAO3Z,KAAKuZ,KAAKvX,GACboZ,EAAkBzB,IACb,KAIJ,CACLxE,KAAM,SACN7U,MAAOA,EACP0P,KAAM,EACNsL,YAAaL,EAEjB,CAKIC,EAAevB,KACjB3X,GAAS,EACT1B,GAASqZ,EAEb,CAEA,KAAO3X,EAAQC,IACb0X,EAAO3Z,KAAKuZ,KAAKvX,GACZkZ,EAAevB,KAGpBrZ,GAASqZ,EACT3X,GAAS,CAEb,CAIA,GAAa,MAAT2X,EAIF,IAHArZ,GAASqZ,EACT3X,GAAS,EAEFA,EAAQC,IACb0X,EAAO3Z,KAAKuZ,KAAKvX,GACZkZ,EAAevB,KAGpBrZ,GAASqZ,EACT3X,GAAS,EAMb,GAAa,MAAT2X,GAAyB,MAATA,EAAc,CAWhC,GAVArZ,GAASqZ,EACT3X,GAAS,EACT2X,EAAO3Z,KAAKuZ,KAAKvX,GAEJ,MAAT2X,GAAyB,MAATA,IAClBrZ,GAASN,KAAKuZ,KAAKvX,GACnBA,GAAS,GAGX2X,EAAO3Z,KAAKuZ,KAAKvX,IACbkZ,EAAevB,GAajB,OAAO,KATP,IAHArZ,GAASqZ,EACT3X,GAAS,EAEFA,EAAQC,IACb0X,EAAO3Z,KAAKuZ,KAAKvX,GACZkZ,EAAevB,KAGpBrZ,GAASqZ,EACT3X,GAAS,CAKf,CAEA,OAAIA,EAAQC,IACV0X,EAAO3Z,KAAKuZ,KAAKvX,IACZhC,KAAKub,aAAa5B,IACd,KAIJ,CACLxE,KAAM,SACN7U,MAAOA,EACP0P,KAAM,GACNkK,IAAKla,KAAK2Z,KACV2B,aAAcE,UAAUlb,GAE5B,CAEAib,YAAAA,CAAaf,GACX,OAAQA,GACN,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACH,OAAO,EAGX,OAAO,CACT,CAEAV,cAAAA,GACE,MAAMU,EAAMxa,KAAKuZ,OAEjB,OAAIvZ,KAAKub,aAAaf,GACb,CACLrF,KAAMqF,EACNla,MAAOka,EACPN,IAAKla,KAAK2Z,MAIP,IACT,CAaAE,iBAAAA,GACE,MAAM4B,EAAQzb,KAAKuZ,OAGnB,GAAc,MAAVkC,GAA2B,MAAVA,EACnB,OAAO,KAGT,IAAInb,EAAQ,GAIZ,IAFAN,KAAK0Z,OAEE1Z,KAAKuZ,SAAWkC,GAAO,CAC5B,GAAoB,KAAhBzb,KAAKuZ,OAEP,MAAO,CACLpE,KAAM,SACN7U,MAAOA,EACPob,YAAY,EACZD,MAAOA,EACPvB,IAAKla,KAAK2Z,MAId,MACMgC,EAAO,EAGbrb,GAJaN,KAAKuZ,OAKlBvZ,KAAK0Z,KAAKiC,EACZ,CAGA,OADA3b,KAAK0Z,OACE,CACLvE,KAAM,SACN7U,MAAOA,EACPob,YAAY,EACZD,MAAOA,EACPvB,IAAKla,KAAK2Z,KAEd,CA5gBA,WAAA5Z,CAAY6b,GAJZpC,EAAAA,KAAAA,aAAAA,GACAG,EAAAA,KAAAA,YAAAA,GACApL,EAAAA,KAAAA,YAAAA,GAGEvO,KAAKwZ,MAAQoC,EACb5b,KAAK2Z,KAAO,EACZ3Z,KAAKuO,KAAO,CACd,E,wHC9FK,MAAMsN,EAaXC,MAAAA,GACE,OAAO9b,KAAK+b,OACd,CAEAA,KAAAA,GACE,IACE,OAAO/b,KAAKgc,gBAAkBhc,KAAKic,kBACrC,CAAE,MAAOnH,GACP,GCDC,SAA+BA,GACpC,MAAoB,iBAANA,GAAwB,OAANA,GAAc,YAAaA,GAAK,QAASA,CAC3E,CDDUoH,CAAsBpH,GACxB,MAAO,CACLK,KAAM,QACNgH,QAASrH,EAAEqH,QACXjC,IAAKpF,EAAEoF,IAGb,CACA,OAAO,IACT,CAEAkC,iBAAAA,GACE,GAAIpc,KAAKyB,MAAM,aAAc,MAAQzB,KAAKyB,MAAM,KAAM,CACpD,IAAI4a,EAAe,GAEnB,MAAQrc,KAAKyB,MAAM,MAAQzB,KAAKyB,MAAM,MACpC4a,GAAgBrc,KAAKsc,eAAehc,MAetC,OAZKN,KAAKyB,MAAM,MACdzB,KAAKuc,UAAU,wBAGjBF,GAAgBrc,KAAKsc,eAAehc,MAIhCN,KAAKyB,MAAM,gBACb4a,GAAgBrc,KAAKsc,eAAehc,OAG/B,CACL6U,KAAM,UACN7U,MAAO+b,EAEX,CACE,OAAO,IAEX,CAEAG,aAAAA,GACE,MAAMC,EAAQzc,KAAKoc,oBACnB,GAAIK,EACF,OAAOA,EAGT,GAAIzc,KAAKyB,MAAM,eAAiBzB,KAAKyB,MAAM,WAAazB,KAAKyB,MAAM,QAAS,CAE1E,MAAMib,EAAa1c,KAAKsc,eAAehc,MACjCqc,EAAQD,GAAoC,iBAAfA,EAA0BA,EAAWtT,MAAM,KAAO,GASrF,OARqB,IAAjBuT,EAAM1a,SACRjC,KAAK2E,OAAOiY,OAAO5c,KAAKgC,MAAO,EAAG,CAAEmT,KAAM,MAC1CnV,KAAK2E,OAAOiY,OAAO5c,KAAKgC,MAAQ,EAAG,EAAG,CACpCmT,KAAM,SACN7U,MAAOqc,EAAM,MAIV,CACLxH,KAAM,UACN7U,MAAOqc,EAAM,GAEjB,CAEK3c,KAAKyB,MAAM,kBACdzB,KAAKuc,UAAU,8BAGjBvc,KAAKsc,eAEAtc,KAAKyB,MAAM,eACdzB,KAAKuc,UAAU,2CAGjB,MAAMM,EAAO,CACX1H,KAAM,WACN7U,MAAON,KAAKsc,eAAehc,OAQ7B,OALKN,KAAKyB,MAAM,gBACdzB,KAAKuc,UAAU,wBAGjBvc,KAAKsc,eACEO,CACT,CAEAZ,gBAAAA,GACE,KAAKjc,KAAKyB,MAAM,kBAAqBzB,KAAKyB,MAAM,eAAkBzB,KAAKyB,MAAM,WAAczB,KAAKyB,MAAM,MACpG,OAAO,KAGT,MAAMob,EAAgB,CACpB1H,KAAM,SACN2H,SAAU,IAGNA,EAAW9c,KAAKwc,gBAMtB,IAJIK,EAAKC,UAAYA,GACnBD,EAAKC,SAAS7M,KAAK6M,GAGd9c,KAAKyB,MAAM,MAAM,CACtBzB,KAAKsc,eAEL,MAAMS,EAAU/c,KAAKwc,gBAChBO,GACH/c,KAAKuc,UAAU,8BAEbM,EAAKC,UAAYC,GACnBF,EAAKC,SAAS7M,KAAK8M,EAEvB,CAEA,OAAOF,CACT,CAEAb,YAAAA,GACE,IAAKhc,KAAKyB,MAAM,aAAc,KAC5B,OAAO,KAGT,IAAI0P,EAAO,GACX,MAAMG,EAAQtR,KAAKsc,eACQ,iBAAhBhL,EAAMhR,QACf6Q,EAAOG,EAAMhR,OAGf,MAAMuc,EAAgB,CACpB1H,KAAM,WACNhE,KAAMA,GAcR,OAVAnR,KAAKsc,eAELO,EAAKG,OAAShd,KAAKid,qBAEdjd,KAAKyB,MAAM,MACdzB,KAAKuc,UAAU,gCAGjBvc,KAAKsc,eAEEO,CACT,CAEAK,cAAAA,GACE,OAAKld,KAAKyB,MAAM,QAIT,CACL0T,KAAM,OACN7U,MAAqC,SAA9BN,KAAKsc,eAAehc,OALpB,IAOX,CAEA2c,kBAAAA,GACE,GAAIjd,KAAKyB,MAAM,MAAQzB,KAAKyB,MAAM,IAChC,MAAO,GAGT,MAAM0b,EACJnd,KAAKgc,gBACLhc,KAAKod,kBACLpd,KAAKqd,uBACLrd,KAAKkd,kBACLld,KAAKic,oBACLjc,KAAKsd,gBAEP,OAAKtd,KAAKyB,MAAM,MAAQ0b,EACf,CAACA,IAGVnd,KAAKsc,eAEDa,EACK,CAACA,GAAOI,OAAOvd,KAAKid,sBAEtB,GACT,CAEAI,mBAAAA,GACE,IAAKrd,KAAKyB,MAAM,cACd,OAAO,KAGT,MAAMnB,EAAQN,KAAK2E,OAAO3E,KAAKgC,OAAO1B,MACtC,GAAIA,GAA0B,iBAAVA,IAAuBA,EAAMmB,MAAM,WACrD,OAAO,KAKT,MAAO,CACL0T,KAAM,aACN7U,MAJYN,KAAKsc,eAIJhc,MAEjB,CAEA8c,cAAAA,GACE,IAAKpd,KAAKyB,MAAM,UACd,OAAO,KAGT,MAAM6P,EAAQtR,KAAKsc,eACnB,OAAIhL,GAASA,EAAMhR,OAAgC,iBAAhBgR,EAAMhR,MAChC,CACL6U,KAAM,SACN7U,MAAOkd,WAAWlM,EAAMhR,QAGrB,IACT,CAEAgd,aAAAA,GACE,IAAKtd,KAAKyB,MAAM,UACd,OAAO,KAGT,MAAM6P,EAAQtR,KAAKsc,eACnB,GAAIhL,EAAMoK,YAAcpK,EAAM4I,IAAK,CAKjC,KAJmC,CACjCiC,QAAS,4BACTjC,IAAK5I,EAAM4I,IAGf,CAEA,MAAO,CACL/E,KAAM,SACN7U,MAAOgR,EAAMhR,MAEjB,CAEAic,SAAAA,CAAUkB,GACR,MAAMC,EAAe1d,KAAK2E,OAAO3E,KAAKgC,OAMtC,KAJmC,CACjCma,QAASsB,EAAO,mBAFLC,EAAeA,EAAavI,KAAO,iBAG9C+E,IAAKwD,GAAgBA,EAAaxD,IAAMwD,EAAaxD,IAAMla,KAAK2d,MAAMhE,KAG1E,CAGA2C,YAAAA,GAEE,OADAtc,KAAKgC,QACEhC,KAAK2E,OAAO3E,KAAKgC,MAAQ,EAClC,CAEA4b,UAAAA,CAAWzI,EAAcnT,GACvB,MAAMsP,EAAQtR,KAAK2E,OAAO3E,KAAKgC,MAAQA,GACvC,YAAkBzB,IAAX,GAAiC,KAAT4U,GAAiB7D,GAASA,EAAM6D,OAASA,CAC1E,CAEA1T,KAAAA,CAAMoc,EAAgBC,GACpB,OAAO9d,KAAK4d,WAAWC,EAAQ,MAAQC,GAAU9d,KAAK4d,WAAWE,EAAQ,GAC3E,CAnRA,WAAA/d,CAAY6b,GALZA,EAAAA,KAAAA,kBAAAA,GACA+B,EAAAA,KAAAA,aAAAA,GACAhZ,EAAAA,KAAAA,cAAAA,GACA3C,EAAAA,KAAAA,aAAAA,GAGEhC,KAAK4b,WAAaA,EAClB5b,KAAK2d,MAAQ,IAAIrE,EAAMsC,GACvB5b,KAAK2E,OAAS3E,KAAK2d,MAAM/D,WACzB5Z,KAAKgC,MAAQ,CACf,E,wHEea,MAAM+b,EAuBnBC,WAAAA,GAOE,GANAhe,KAAKie,UAAY,GACjBje,KAAK8c,SAAW,GAChB9c,KAAKke,KAAO,GACZle,KAAKme,iBAAkB,EACvBne,KAAKyF,MAAQ,KAETzF,KAAKoe,OAAOC,WACd,OAGF,MACMC,EADS,IAAIzC,EAAO7b,KAAKoe,OAAOA,QACftC,SACvB,GAAgB,OAAZwC,EAAJ,CAKA,GAAqB,UAAjBA,EAAQnJ,KAGV,OAFAnV,KAAKyF,MAAQ6Y,EAAQnC,QAAU,iBAAmBmC,EAAQpE,SAC1Dla,KAAKoe,OAAOC,YAAa,GAI3B,IAEE,GADAre,KAAKue,qBAAqBD,EAAS,MAC/Bte,KAAKoe,OAAOA,OAAQ,CACtB,MAAMI,EAAWxe,KAAKoe,OAAOA,OACvBK,EAAWze,KAAK0e,sBAIhBC,EAAiB9H,GAAsBA,EAAE1N,QAAQ,YAAa,IAC9DyV,EAAeD,EAAcH,GAC7BK,EAAeF,EAAcF,GACnC,GAAIG,GAAgBC,GAAgBD,IAAiBC,EACnD,MAAM,IAAIhP,MACR,iGAAiG2O,2BAAkCC,IAGzI,CACF,CAAE,MAAOK,GACHA,aAAejP,QACjBrK,QAAQC,MAAM,wBAAyBqZ,EAAI3C,SAC3Cnc,KAAKyF,MAAQqZ,EAAI3C,SAEnBnc,KAAKoe,OAAOC,YAAa,CAC3B,CAEAre,KAAK+e,wBAA0B/e,KAAK8c,SAAS7a,OAAS,CAjCtD,MAFEjC,KAAK+e,wBAA0B,CAoCnC,CAEAC,kBAAAA,CAAmBhd,GACjB,MAAMid,EAAMjf,KAAK8c,SAAS7Q,MAAM,EAAGjK,GAEnC,OAAOkd,EAAAA,EAAAA,QACLD,GACA,CAAC3T,EAAQyR,IACAzR,EAASA,EAAS,IAAMyR,EAAQzc,MAAQyc,EAAQzc,OAEzD,GAEJ,CAEAie,oBAAAA,CAAqBD,EAAca,GACjC,GAAgB,OAAZb,EACF,OAAO,KAGT,OAAQA,EAAQnJ,MACd,IAAK,WACH,MAAMiK,EAAYpf,KAAKqf,WAAWC,mBAAmBhB,EAAQnN,KAAM,CACjEoO,mBAAmB,KA+O7B,SAA0CjB,GAExC,GAAIA,EAAQtB,QAAUsB,EAAQtB,OAAO/a,QAAU,EAAG,CAChD,IAAIud,EAAQ,EACZlB,EAAQtB,OAASsB,EAAQtB,OAAO9c,KAAKiN,IAKnC,GAJe,aAAXA,EAAEgI,OACJqK,GAAS,GAGG,IAAVA,GAA0B,aAAXrS,EAAEgI,MAAkC,gBAAXhI,EAAEgE,KAAwB,CAEpE,MAAMsO,EACJtS,EAAE6P,QACF7P,EAAE6P,OAAOkC,QAAO,CAACQ,EAAavS,EAAYwS,EAAaC,IACzC,IAARD,GAAaA,IAAQC,EAAU3d,OAAS,EACnC,GAAGyd,KAAOvS,EAAE7M,UAGd,GAAGof,KAAOvS,EAAE7M,UAClB,IAEL,MAAO,CACL6U,KAAM,SACN7U,MAAO,GAAG6M,EAAEgE,QAAQsO,KAExB,CAEA,OAAOtS,CAAC,GAEZ,CACF,CAzQQ0S,CAAiCvB,GA8QzC,SAAgDA,GAEzB,sBAAjBA,EAAQnN,MAAgCmN,EAAQtB,QAAUsB,EAAQtB,OAAO/a,QAAU,IACrFqc,EAAQtB,OAASsB,EAAQtB,OAAO9c,KAAI,CAACiN,EAAYwS,KAC/C,GAAY,IAARA,GAAwB,aAAXxS,EAAEgI,KAAqB,CAOtC,IAAI2K,EAAiB,GAGrB3S,EAAI,CACFgI,KAAM,SACN7U,MAJM6M,EAAEgE,KAAO,IAAM4O,EAAwB5S,EAAG2S,GAMpD,CAEA,OAAO3S,CAAC,IAKd,CArSQ6S,CAAuC1B,IAEvC2B,EAAAA,EAAAA,MAAK3B,EAAQtB,QAASG,IACpBnd,KAAKue,qBAAqBpB,EAAOiC,EAAU,IAG7CA,EAAUc,aACVlgB,KAAKie,UAAUhO,KAAKmP,GAGO,gBAAvBA,EAAUe,IAAIhP,MAA2BnR,KAAKme,kBAChDne,KAAKme,iBAAkB,EACvBiB,EAAUgB,QAAS,EACnBpgB,KAAKke,KAAOle,KAAKqgB,uBAAuBjB,IAG1C,MACF,IAAK,aACCpf,KAAK8c,SAAS7a,OAAS,GAAKjC,KAAKsgB,2BAA6B,EAChEtgB,KAAKugB,qBAAqBpB,EAAMb,EAAQhe,OAExCN,KAAK8c,SAAS7M,KAAKqO,GAErB,MACF,IAAK,OACL,IAAK,SACL,IAAK,SACHte,KAAKugB,qBAAqBpB,EAAMb,EAAQhe,OACxC,MACF,IAAK,SACCN,KAAK8c,SAAS7a,QAAUjC,KAAKke,KAAKjc,OACpCjC,KAAKugB,qBAAqBpB,GAAMnU,EAAAA,EAAAA,OAAK9K,EAAAA,EAAAA,KAAIoe,EAAQxB,SAAU,SAAU,MAErE9c,KAAK8c,SAAWwB,EAAQxB,SAIhC,CAEA0D,kBAAAA,CAAmBzD,EAA0B/a,GAC3ChC,KAAK8c,SAAS9a,GAAO1B,MAAQyc,EAAQzc,KACvC,CAEAmgB,sBAAAA,GACEzgB,KAAK8c,SAAS7M,KAAK,CAAE3P,MAAO,iBAC9B,CAEAsY,WAAAA,CAAY8H,GACV1gB,KAAKie,UAAUhO,KAAKyQ,EACtB,CAEAH,oBAAAA,CAAqBpB,EAAoB7e,GACvC,GAAI6e,EAAKnC,OAAO/a,QAAUkd,EAAKgB,IAAInD,OAAO/a,UAAW7B,EAAAA,EAAAA,MAAIugB,EAAAA,EAAAA,MAAKxB,EAAKgB,IAAInD,QAAS,YAAY,GAC1F,KAAM,CAAEb,QAAS,oCAAsCgD,EAAKgB,IAAIhP,MAElEgO,EAAKnC,OAAO/M,KAAK3P,EACnB,CAEAuY,cAAAA,CAAesG,GACbnf,KAAKie,WAAY2C,EAAAA,EAAAA,SAAQ5gB,KAAKie,UAAWkB,EAC3C,CAEArG,YAAAA,CAAaqG,EAAoB0B,GAC/B,MAAM7e,EAAQhC,KAAKie,UAAU6C,QAAQ3B,GDtKhB,IAAI4B,EAAYC,EAAmBC,EAA/BF,ECuKf/gB,KAAKie,UDvKsB+C,ECuKXhf,EDvK8Bif,ECuKvBjf,EAAQ6e,EDtK3CE,EAAMnE,OAAOqE,EAAS,EAAGF,EAAMnE,OAAOoE,EAAW,GAAG,GCuKpD,CAEAtC,mBAAAA,GACE,MAKMwC,EAAalhB,KAAKgf,mBAAmBhf,KAAK8c,SAAS7a,QAAQkH,QAAQ,oBAAqB,IAC9F,OAAO+V,EAAAA,EAAAA,QAAOlf,KAAKie,WANE,CAACG,EAAgBe,IAC7BA,EAAKgC,OAAO/C,GAAS9d,GACnBN,KAAKohB,YAAcphB,KAAKohB,YAAYjY,QAAQ7I,EAAON,KAAKqhB,YAAc/gB,KAIrC4gB,EAC9C,CAEAI,iBAAAA,CAAkBC,GACXvhB,KAAKoe,OAAOC,aACfre,KAAKoe,OAAOA,OAASpe,KAAK0e,uBAG5B1e,KAAKwhB,qBAAqBxhB,KAAKoe,OAAQmD,GAGvC,IAAK,MAAMnD,KAAUmD,GAAW,GAC1BnD,EAAOqD,QAAUzhB,KAAKoe,OAAOqD,OAC/BzhB,KAAKwhB,qBAAqBpD,EAAQmD,GAKtCvhB,KAAKie,UAAUzV,SAAS2W,GAAUA,EAAKuC,OAAQ,GACjD,CAEAF,oBAAAA,CAAqBpD,EAAqEmD,GAExF,MAAMI,GAAiBC,EAAAA,EAAAA,OAAML,EAAS,SAEhCM,EAAuB,aAC7B,IAAIC,EAA0B1D,EAAOA,OAiBrC,KAdA6B,EAAAA,EAAAA,MAAK0B,GAAgB,CAACpgB,EAAGoL,KACvB,MAAMoV,EAAQvQ,OAAO,KAAM7E,KAAO,KAClC,IAAIqV,EAAW,GACf/B,EAAAA,EAAAA,MAAK0B,GAAgB,CAACM,EAAIC,KACxB,GAAIA,IAAQvV,EAAI,CACd,MAAMwV,EAAaF,EAAG7D,OAAO3c,MAAMsgB,G,IACvBI,EAAZH,GAA8B,QAAlBG,EAAAA,aAAAA,EAAAA,EAAYlgB,cAAZkgB,IAAAA,EAAAA,EAAsB,CACpC,KAEF5gB,EAAEygB,SAAWA,CAAQ,IAKhBF,EAAwBrgB,MAAMogB,IAAuB,CAC1D,MAAMO,EAAUN,EAAwB3Y,QAAQ0Y,GAAsB,CAACpgB,EAAe4gB,KACpF,MAAM9gB,EAAIogB,EAAeU,GACzB,OAAK9gB,GAKc,IAAfA,EAAEygB,iBACGL,EAAeU,GAExB9gB,EAAEygB,WAEKzgB,EAAE6c,QATA3c,CASM,IAGjB,GAAI2gB,IAAYN,EACd,MAGFA,EAA0BM,CAC5B,QAEOhE,EAAOkE,WACVlE,EAAOA,SAAW0D,IACpB1D,EAAOkE,WAAaR,EAExB,CAEAzB,sBAAAA,CAAuBlB,GACrB,MAAMoD,EAAa,yBACnB,OAAOC,EAAAA,EAAAA,UACLtiB,EAAAA,EAAAA,KAAIif,EAAKnC,QAASG,IAChB,MAAMsF,EAAUF,EAAWxgB,KAAKob,GAChC,GAAIsF,EAAS,CACX,MAAMC,EAAMD,EAAQxW,MAAM,GAC1B,GAAmB,IAAfyW,EAAIzgB,OACN,MAAO,CACL5B,IAAKqiB,EAAI,GACTzb,SAAUyb,EAAI,GACdpiB,MAAOoiB,EAAI,GAGjB,CACA,MAAO,EAAE,IAGf,CAEApC,uBAAAA,GACE,OAAOqC,EAAAA,EAAAA,WAAU3iB,KAAKie,WAAYkB,GAA2B,gBAAlBA,EAAKgB,IAAIhP,MACtD,CAEAyR,kBAAAA,GACE,MAAMC,EAAuB7iB,KAAKsgB,0BAClC,OAAIuC,GAAwB,EACnB7iB,KAAKie,UAAU4E,QAEtB,CAEJ,CAEAC,MAAAA,CAAOJ,GACL,MAAMK,EAAcC,EAAgBN,GACpC1iB,KAAK4iB,qBAAsB5F,OAAO/M,KAAK8S,GACvC/iB,KAAKke,KAAKjO,KAAKyS,EACjB,CAEAO,SAAAA,CAAUjhB,GACRhC,KAAK4iB,qBAAsB5F,OAAOJ,OAAO5a,EAAO,GAChDhC,KAAKke,KAAKtB,OAAO5a,EAAO,EAC1B,CAEAkhB,SAAAA,CAAUR,EAAoES,GAG5E,GAFAnjB,KAAKyF,MAAQ,KAETid,EAAIriB,MAAQL,KAAKojB,eAarBpjB,KAAK4iB,qBAAsB5F,OAAOmG,GAAYH,EAAgBN,GAC9D1iB,KAAKke,KAAKiF,GAAYT,OAZpB,GADA1iB,KAAKijB,UAAUE,GACU,IAArBnjB,KAAKke,KAAKjc,OAAc,CAC1B,MAAMohB,EAAerjB,KAAK4iB,qBACtBS,GACFrjB,KAAK6Y,eAAewK,GAEtBrjB,KAAK+e,wBAA0B,EAC/B/e,KAAKme,iBAAkB,CACzB,CAMJ,CAEAmF,oBAAAA,CAAqBC,GAAe,GAClC,OAAOC,EAAAA,EAAAA,UACLtjB,EAAAA,EAAAA,KAAIF,KAAKke,MAAM,CAACuF,EAASzhB,IAEnBA,IAAUuhB,EACLE,EAAQpjB,IAAMojB,EAAQxc,SAAWwc,EAAQnjB,WAEhD,IAIR,CArTA,WAAAP,CAAYsf,EAAgCjB,EAAagD,EAA2BC,GAZpFhC,EAAAA,KAAAA,kBAAAA,GACAjB,EAAAA,KAAAA,cAAAA,GACAH,EAAAA,KAAAA,YAA4B,IAC5BnB,EAAAA,KAAAA,WAA8B,IAC9BoB,EAAAA,KAAAA,OAAsB,IACtBzY,EAAAA,KAAAA,aAAAA,GACA0Y,EAAAA,KAAAA,mBAAkB,GAClBY,EAAAA,KAAAA,0BAA0B,GAC1BqE,EAAAA,KAAAA,sBAAAA,GACAhC,EAAAA,KAAAA,mBAAAA,GACAC,EAAAA,KAAAA,kBAAAA,GAGErhB,KAAKqf,WAAaA,EAClBrf,KAAKoe,OAASA,EACdpe,KAAKohB,YAAcA,EACnBphB,KAAKqhB,WAAaA,EAClBrhB,KAAKge,cAELhe,KAAKojB,eAAiB,kBACxB,EAgTF,SAASJ,EAAgBN,GACvB,OAAOA,EAAIriB,IAAMqiB,EAAIzb,SAAWyb,EAAIpiB,KACtC,CAqEA,SAASyf,EAAwBlD,EAAeiD,GAE9C,GAAIjD,EAAKG,OAAQ,C,IAGMH,EAAAA,EAFrB2C,EAEA,MAAMkE,EAAkC,QAAnB7G,EAAW,QAAXA,EAAAA,EAAKG,cAALH,IAAAA,OAAAA,EAAAA,EAAa5a,cAAb4a,IAAAA,EAAAA,EAAuB,EAU5C,OARAA,EAAKG,OAAOxU,SAAQ,CAACmb,EAAoBhE,KAErCG,GADEH,EAAM+D,EAAe,EACLE,EAAWD,EAAW7D,GAAkB,IAExC8D,EAAWD,EAAW7D,EAC1C,IAGKA,EAAiB,GAC1B,CACE,OAAQA,GAAkB8D,EAAW/G,EAAMiD,EAE/C,CAEA,SAAS8D,EAAW/G,EAAeiD,GACjC,OAAQjD,EAAK1H,MACX,IAAK,WAEH,OAAO4K,EAAwBlD,EAD/BiD,GAAkBjD,EAAK1L,KAAO,KAEhC,IAAK,SAEH,OADsBnG,EAAAA,EAAAA,OAAK9K,EAAAA,EAAAA,KAAI2c,EAAKC,SAAU,SAAU,KAE1D,QACE,OAAOD,EAAKvc,MAElB,C,4TC5bO,MAAMujB,EAAgD,CAAC,IAAK,KAAM,KAAM,OAMlEC,EAAa,QAMnB,SAAe9F,EAAY+F,G,sBAChCA,EAAMC,WAAWhG,oBACXiG,EAAcF,EACtB,G,GAKO,SAAeE,EAAcF,EAAiCG,GAAoB,G,sBAEvFH,EAAMjH,UAAWqH,EAAAA,EAAAA,OAAMJ,EAAMC,WAAWlH,UAExC,MAAMiC,EAA0BgF,EAAMC,WAAWjF,yBAA2B,QAEtEqF,EAAmBL,EAAOhF,EAAyBmF,EAC3D,G,GAKO,SAASzD,EAAuBsD,GACrCA,EAAMC,WAAWvD,yBACjBsD,EAAMjH,SAAS7M,KAAK,CAAE3P,MAAO,gBAAiB+jB,MAAM,GACtD,CAQO,SAAeD,EACpBL,EACA/C,EACAkD,GAAoB,G,sBAEpB,GAAyC,IAArCH,EAAMC,WAAWlH,SAAS7a,QAAsD,eAAtC8hB,EAAMC,WAAWlH,SAAS,GAAG3H,KACzE,OAGF,GAAkB,IAAd6L,EAEF,YADAP,EAAuBsD,GAIzB,MAAMO,EAAmBtD,EAAY,EAC/BuD,EAAOR,EAAMC,WAAWhF,mBAAmBsF,GACjD,GAAa,KAATC,EAIJ,IACE,MAAMzH,QAAiBiH,EAAM1E,WAAWmF,gBAAgBD,GAChC,IAApBzH,EAAS7a,OACE,KAATsiB,GAAeL,IACjBH,EAAMC,WAAWlH,SAAWiH,EAAMC,WAAWlH,SAASF,OAAO,EAAG0H,GAChEP,EAAMjH,SAAWiH,EAAMjH,SAASF,OAAO,EAAG0H,IACrC9Y,EAAAA,EAAAA,MAAKuY,EAAMjH,SAAU,CAAEuH,MAAM,KAChC5D,EAAuBsD,IAGlBjH,EAAS,GAAG2H,aACjBV,EAAMjH,SAAS7a,SAAW+e,EAC5BP,EAAuBsD,SAEjBK,EAAmBL,EAAOO,GAGtC,CAAE,MAAOxF,GACHA,aAAejP,OACjB6U,GAA+BX,EAAOjF,EAE1C,CACF,G,GAOO,SAAS6F,GAAcZ,GAC5BA,EAAMC,WAAWlH,SAAW,GAC5BiH,EAAMjH,SAAW,EACnB,CA8CO,SAAS8H,GAAoBb,GAClC,GAAIA,EAAMC,WAAWve,MACnB,O,IAGwBse,EAA1B,MACMc,GADsD,QAAlCd,EAAAA,EAAMC,WAAW5F,OAAOkE,kBAAxByB,IAAAA,EAAAA,EAAsCA,EAAMC,WAAW5F,OAAOA,QACvCjV,QAAQ,OAAQ,I,IASvC4a,EAJ1BA,EAAMC,WAAW1C,mBACdyC,EAAMe,SAAW,IAAIvb,QAAQwb,GAAU,WAAYA,GAAiC,iBAAjBA,EAAM3G,WAGhB,QAAlC2F,EAAAA,EAAMC,WAAW5F,OAAOkE,kBAAxByB,IAAAA,EAAAA,EAAsCA,EAAMC,WAAW5F,OAAOA,QACvCjV,QAAQ,OAAQ,MAElC0b,GAA2Bd,EAAMiB,QAC9DjB,EAAMkB,SAEV,CAKO,SAASP,GACdX,EACAte,GASA,OAPKse,EAAMmB,+BACTnB,EAAMmB,8BAA+B,GACrCC,EAAAA,EAAAA,gBAAeC,QAAQ,CACrBjQ,KAAMkQ,EAAAA,UAAUC,WAAWnU,KAC3ByG,QAAS,CAAC,4BAA4BnS,EAAM0W,eAGzC4H,CACT,CAKO,SAASwB,GAA4BxB,EAAiCte,GAQ3E,OAPKse,EAAMyB,6BACTzB,EAAMyB,4BAA6B,GACnCL,EAAAA,EAAAA,gBAAeC,QAAQ,CACrBjQ,KAAMkQ,EAAAA,UAAUC,WAAWnU,KAC3ByG,QAAS,CAAC,yBAAyBnS,EAAM0W,eAGtC4H,CACT,C,4sCCjKA,MAAM0B,GAAU,CAAO3N,EAAgBiM,IAAAA,IAAAA,YAGrC,GAFAA,EAAQ,MAAKA,GAETtL,EAAQN,KAAK1W,MAAMqW,GAAS,CAC9B,MAAM4N,EAAO5N,EAAOF,QACpB8N,EAAKtH,OAAOA,OAASsH,EAAKtH,OAAOA,QAAU,SAErCsH,EAAKrG,WAAWsG,wBAEtB5B,EAAQ,SACHA,EACA2B,GAAAA,CACH1B,WAAY,IAAIjG,EAAc2H,EAAKrG,WAAYqG,EAAKtH,OAAQ2F,EAAM3C,aAClEwE,aAAcF,EAAKrG,WAAWuG,aAC9BZ,QAAQ,EACR5B,eAAgB,mBAChByC,SAAUH,EAAKrG,WAAWwG,SAC1Bf,QAASY,EAAKZ,gBAGVb,EAAcF,GAAO,EAC7B,CAaA,GAZItL,EAAQL,iBAAiB3W,MAAMqW,KACjCiM,EAAMlkB,MAAQiY,EAAOF,SAEnBa,EAAQJ,eAAe5W,MAAMqW,KAC/BiM,EAAMe,QAAUhN,EAAOF,QACvBgN,GAAoBb,IAElBtL,EAAQH,aAAa7W,MAAMqW,KAC7BiM,EAAM3F,OAAOA,OAAStG,EAAOF,QAAQwG,QAAU,SACzCJ,EAAY+F,GAClBa,GAAoBb,IAElBtL,EAAQF,oBAAoB9W,MAAMqW,GAAS,CAC7C,MAAQiF,QAAS+I,EAAiB9jB,MAAO+jB,GAAiBjO,EAAOF,QAEjE,IAAImF,EAoBJ,GAjBEA,EAD6B,iBAApB+I,EACC,CACRxlB,MAAOwlB,EACPrB,YAAY,EACZJ,MAAM,GAGEyB,EAGZ/B,EAAMte,MAAQ,KACdse,EAAMjH,SAASiJ,GAAgBhJ,EAC/BgH,EAAMC,WAAWxD,mBAAmBzD,EAASgJ,GAEzChC,EAAMC,WAAW/F,UAAUhc,OAAS,GAAK8hB,EAAMC,WAAW/F,UAAU,GAAGkC,IAAIkE,OAC7EN,EAAMC,WAAW/F,UAAY,IAGV,QAAjBlB,EAAQ5H,KAAgB,CAC1B,MAAMuN,EAAsB3F,EAAQzc,MDgD3B6I,QAAQ2a,EAAY,IC7C7B,ODwCC,SAAeC,GACpBA,EAAMiB,QAAS,CACjB,CC5CMgB,CAAMjC,SDSL,SAAkCA,EAAiCrB,G,sBACxE,MAAMhC,EAAUqD,EAAM1E,WAAWC,mBAAmB,cAAe,CACjEC,mBAAmB,IAEf0G,EAAW,GAAGvD,KACpBhC,EAAQ1D,OAAS,CAACiJ,GAClBlC,EAAMC,WAAWpL,YAAY8H,GAC7BA,EAAQgB,OAAQ,EAEhBiD,GAAcZ,GACda,GAAoBb,SACd/F,EAAY+F,EACpB,G,GCpBYmC,CAAmBnC,EAAOrB,GACzBqB,CACT,CAGIhH,EAAQ0H,iBACJL,EAAmBL,EAAOgC,EAAe,GDX9C,SAAwBhC,EAAiC/hB,GAC9D+hB,EAAMjH,SAAWiH,EAAMjH,SAASF,OAAO,EAAG5a,GAC1C+hB,EAAMC,WAAWlH,SAAWiH,EAAMC,WAAWlH,SAASF,OAAO,EAAG5a,EAClE,CCWMmkB,CAAepC,EAAOgC,EAAe,GAGvCnB,GAAoBb,EACtB,CACA,GAAItL,EAAQC,WAAWjX,MAAMqW,GAAS,CACpC,MAAM,IAAE4K,EAAK1gB,MAAOmhB,GAAarL,EAAOF,QACxCmM,EAAMC,WAAWd,UAAUR,EAAKS,GAChCyB,GAAoBb,GACiB,IAAjCA,EAAMC,WAAW9F,KAAKjc,eAClBmiB,EAAmBL,EAAO,GAChCA,EAAMiB,QAAS,EAEnB,CACA,GAAIvM,EAAQD,UAAU/W,MAAMqW,GAAS,CACnC,MAEMsO,EAAS,CAAE/lB,IAFDyX,EAAOF,QAAQmF,QACLzc,MACO2G,SAAU,IAAc3G,MAAO,IAChEyjB,EAAMC,WAAWlB,OAAOsD,GACxBxB,GAAoBb,EACtB,CAKA,GAJItL,EAAQE,QAAQlX,MAAMqW,KACxBiM,EAAMiB,QAAS,EACfjB,EAAMkB,WAEJxM,EAAQG,YAAYnX,MAAMqW,GAAS,CACrC,MAAM4I,EAAUqD,EAAM1E,WAAWC,mBAAmBxH,EAAOF,QAAQzG,KAAM,CACvEoO,mBAAmB,IAErBmB,EAAQgB,OAAQ,EAChBqC,EAAMC,WAAWpL,YAAY8H,GDjB1B,SAAqCqD,EAAiC5E,GAC3E,GAAsB,gBAAlBA,EAAKgB,IAAIhP,KAIb,IAAK,IAAIvH,EAAI,EAAGA,EAAIma,EAAMjH,SAAS7a,OAAQ2H,IACzC,GAAIma,EAAMjH,SAASlT,GAAGtJ,MAAMwgB,QAAQ,MAAQ,EAI1C,OAHA3B,EAAKnC,OAAO,GAAKpT,EACjBuV,EAAKuC,OAAQ,OACbkD,GAAoBb,EAI1B,CCKIsC,CAA4BtC,EAAOrD,GAEL,IAA1BqD,EAAMjH,SAAS7a,QAAgB8hB,EAAMjH,SAAS,GAAGuH,MACnDM,GAAcZ,IAGXrD,EAAQ1D,OAAO/a,QAAUye,EAAQgB,OACpCkD,GAAoBb,GAGG,gBAArBrD,EAAQP,IAAIhP,aACR6M,EAAY+F,GAEtB,CAKA,GAJItL,EAAQI,eAAepX,MAAMqW,KAC/BiM,EAAMC,WAAWnL,eAAef,EAAOF,QAAQuH,MAC/CyF,GAAoBb,IAElBtL,EAAQK,aAAarX,MAAMqW,GAAS,CACtC,MAAM,KAAEqH,EAAI,OAAE0B,GAAW/I,EAAOF,QAChCmM,EAAMC,WAAWlL,aAAaqG,EAAM0B,GACpC+D,GAAoBb,EACtB,CACA,GAAItL,EAAQM,oBAAoBtX,MAAMqW,GAAS,CAC7C,MAAM,KAAEqH,EAAI,MAAEnd,EAAK,MAAE1B,GAAUwX,EAAOF,QACtCuH,EAAKmH,YAAYhmB,EAAO0B,GACxB4iB,GAAoBb,EACtB,CAaA,OAZItL,EAAQO,YAAYvX,MAAMqW,KAC5BiM,EAAM3F,OAAOA,OAAStG,EAAOF,QAAQmN,MACrCH,GAAoBb,IAElBtL,EAAQQ,SAASxX,MAAMqW,IACzBiM,EAAMkB,UAEJxM,EAAQS,iBAAiBzX,MAAMqW,KACjCiM,EAAM3F,OAAOC,YAAc0F,EAAM3F,OAAOC,iBAClCL,EAAY+F,IAGb,MAAKA,EACd,GA7IuCA,G,44BCjCvC,MAAMwC,IAAkBC,EAAAA,EAAAA,eAAmC,CAAC,GACtDC,IAAuBD,EAAAA,EAAAA,eAAwC,CAAC,GAEzDE,GAAc,KAClBC,EAAAA,EAAAA,YAAWJ,IASPK,GAA6B,EACxCvH,aACAwH,aACAC,WACA/B,QACAD,UACAjlB,QACAknB,eAEA,MAAOhD,EAAOiD,IAAYC,EAAAA,EAAAA,aACnBC,EAAcC,IAAmBF,EAAAA,EAAAA,WAAkB,GAEpDG,GAAWC,EAAAA,EAAAA,UAAQ,IDuJA,CAACP,IAC1B,IAAI/C,EAAQ,CAAC,EAOb,OALwBjM,GAAAA,IAAAA,YACtBiM,QAAc0B,GAAQ3N,EAAQiM,GAC9B+C,EAAS/C,EACX,GAHwBjM,EAKT,EC9JNwP,EAAavD,IAClBiD,EAASjD,EAAM,KAEhB,IAGGwD,EC5CO,SAAqBxD,GAChC,IAAIvP,GAAM,IAAAgT,UAIV,OAHA,IAAAC,YAAU,WACNjT,EAAIc,QAAUyO,CAClB,IACOvP,EAAIc,OACf,CDsCwBoS,CAAY7nB,GA0ClC,OAzCA4nB,EAAAA,EAAAA,YAAU,KACJE,KAAKC,UAAUL,aAAAA,EAAAA,EAAeve,OAAS2e,KAAKC,UAAU/nB,aAAAA,EAAAA,EAAOmJ,MAC/Doe,EAAS3O,EAAQL,iBAAiBvY,GACpC,GACC,CAACunB,EAAUvnB,EAAO0nB,KAErBE,EAAAA,EAAAA,YACE,KACM1D,GACFqD,EAAS3O,EAAQJ,eAAeyM,GAClC,GAIF,CAAC6C,KAAKC,UAAU9C,MAGlB2C,EAAAA,EAAAA,YACE,K,IACe1D,EAATA,IAAqB,QAAZA,EAAAA,EAAM3F,cAAN2F,IAAAA,OAAAA,EAAAA,EAAc3F,UAAW2G,EAAM3G,QAC1CgJ,EAAS3O,EAAQH,aAAayM,GAChC,GAIF,CAACqC,EAAUrC,KAGb0C,EAAAA,EAAAA,YACE,KACMP,GAAgBnD,IAClBoD,GAAgB,GAChBL,EAAS,SAAK/B,GAAAA,CAAO3G,OAAQ2F,EAAM3F,OAAOA,OAAQkE,WAAYyB,EAAM3F,OAAOkE,cAC3EuE,IACF,GAIF,CAACK,EAAcS,KAAKC,UAAU7C,KAG3BhB,GAoBD,SAAC0C,GAAqBoB,SAAQ,CAACvnB,MAAOyjB,E,UACpC,SAACwC,GAAgBsB,SAAQ,CAACvnB,MAAO8mB,E,SAAWL,OApBhDK,EACE3O,EAAQN,KAAK,CACXiG,OAAQ,MAAK2G,GACb1F,WAAYA,EACZxf,MAAOA,EACPuhB,aAAa0G,EAAAA,EAAAA,kBAGbhD,QAASA,GAAW,GACpBG,QAAS,KAGPkC,GAAgB,EAAK,KAIpB,KAOT,EEzGK,gBAAKY,G,sEAAAA,C,CAAL,C,IAuBA,YAAKC,G,qDAAAA,C,CAAL,C,ICpBA,SAASC,GAA0C1c,GACxD,OAAOA,EAAOrL,KAAKI,IAAW,CAC5BA,QACA4nB,MAAO5nB,KAEX,CAEO,SAAS6nB,GAAyBrL,GACvC,OAAOA,EAAS5c,KAAK6c,IAAa,CAChCmL,MAAOnL,EAAQzc,MACfA,MAAOyc,KAEX,CAqBA,SAASqL,GAAoBC,EAAoBC,EAAqBhoB,G,IAOhE+nB,EAAAA,EANJ,MAAO,CACLlX,KAAMkX,EAASlX,KACf7Q,OAAOA,aAAAA,EAAAA,EAAOyJ,aAAc,GAC5Bwe,WAAYF,EAASE,UAAYD,EACjCE,WAAYH,EAASG,SACrB1oB,QAIE,QAHAuoB,EAAgB,QAAhBA,EAAAA,EAASvoB,eAATuoB,IAAAA,OAAAA,EAAAA,EAAkBnoB,KAAKuoB,IAA6B,CAClDnoB,MAAOmoB,EAAO1e,WACdme,MAAOO,EAAO1e,sBAFhBse,IAAAA,EAAAA,EAGO,GAEb,CA2BO,SAASK,GAA6B3D,GAC3C,MAAqB,iBAAVA,EACF,CACLtD,MAAO,IACPrD,OAAQ2G,EACR4D,UAAWZ,GAAkBa,QAAQ7e,YAGlCgb,CACT,CC1EO,SAAS8D,IAAoB,SAAEhD,IACpC,MAAMuB,EAAWV,MACVpmB,EAAOwoB,IAAY7B,EAAAA,EAAAA,eAA8C1mB,GAClEwoB,GAASC,EAAAA,EAAAA,YAAWC,IAEpBnpB,GAAUunB,EAAAA,EAAAA,UAAQ,IDEnB,SAAkCxB,GACvC,MAAMqD,EAAsD,CAAC,EAe7D,OAbA1gB,EAAAA,EAAAA,SAAQqd,GAAWsD,IACZA,EAAQC,WAGRF,EAAWC,EAAQC,YACtBF,EAAWC,EAAQC,UAAY,CAAElB,MAAOiB,EAAQC,SAAU9oB,MAAO6oB,EAAQC,SAAUtpB,QAAS,KAE9FopB,EAAWC,EAAQC,UAAUtpB,QAAQmQ,KAAK,CACxCiY,MAAOiB,EAAQhY,KACf7Q,MAAO6oB,EAAQhY,OACf,KAGGkY,EAAAA,EAAAA,QAAOH,EAAY,QAC5B,CCnBgCI,CAAyBzD,IAAW,CAACA,IAenE,OAPA4B,EAAAA,EAAAA,YAAU,UACalnB,KAAjBD,aAAAA,EAAAA,EAAOA,SACT8mB,EAAS3O,EAAQG,YAAY,CAAEzH,KAAM7Q,EAAMA,SAC3CwoB,OAASvoB,GACX,GACC,CAACD,EAAO8mB,KAGT,SAACmC,MAAAA,C,UACC,SAACC,EAAAA,QAAOA,CACNC,WACE,SAACC,EAAAA,OAAMA,CAACC,KAAK,OAAOC,QAAQ,YAAYC,WAAWC,EAAAA,EAAAA,IAAGf,EAAOgB,QAASC,aAAW,qBAEnFlqB,QAASA,EACTgnB,SAAUgC,EACVmB,cAAe,OAIvB,CAEA,SAAShB,GAAUiB,GACjB,MAAO,CACLH,QAAQI,EAAAA,EAAAA,KAAI,CACVC,YAAaF,EAAMG,QAAQ,MAGjC,C,0HC5CA,MAAMC,IAAsBC,EAAAA,EAAAA,OAAK,Y,EAAA,YAC/B,MAAO,CACLC,QAAQpV,IACC,SAACmU,MAAAA,C,SAAKnU,EAAMqV,cAGzB,E,wLAAA,IAEMC,GAAsBtV,IAC1B,GAAIA,EAAMqV,YAAa,CACrB,IAAIE,GACF,SAACC,EAAAA,SAAQA,CAACC,UAAU,SAACC,OAAAA,C,SAAK,2B,UACxB,SAACR,GAAAA,CAAoBG,YAAarV,EAAMqV,gBAG5C,OACE,SAACM,EAAAA,QAAOA,CAACC,QAASL,EAASM,UAAW,a,UACpC,SAACC,EAAAA,KAAIA,CAACrB,UAAWzU,EAAMqV,iBAAclqB,EAAY,UAAW4Q,KAAK,qBAGvE,CAEA,OACE,SAAC+Z,EAAAA,KAAIA,CACHrB,UAAU,UACV1Y,KAAK,kBACLga,QAAS,KACP/T,OAAOgU,KACL,sFAAwFhW,EAAMjE,KAC9F,Y,EAOGka,GACXjW,IAIA,MAAM,KAAE+J,EAAI,WAAEmM,EAAU,YAAEC,EAAW,SAAEC,GAAapW,EACpD,OACE,UAACmU,MAAAA,CACCkC,MAAO,CACLC,QAAS,OACTC,MAAO,OACPC,eAAgB,iB,WAGlB,SAACV,EAAAA,KAAIA,CAAC/Z,KAAK,aAAaga,QAAS,IAAMG,EAAWnM,MAClD,SAACuL,GAAAA,CAAmBvZ,KAAMgO,EAAKgB,IAAIhP,KAAMsZ,YAAatL,EAAKgB,IAAIsK,eAC/D,SAACS,EAAAA,KAAIA,CAAC/Z,KAAK,QAAQga,QAAS,IAAMK,EAASrM,MAC3C,SAAC+L,EAAAA,KAAIA,CAAC/Z,KAAK,cAAcga,QAAS,IAAMI,EAAYpM,O,y7BCnD1D,MAAM8J,GAAaiB,IACV,CACLP,MAAMQ,EAAAA,EAAAA,KAAI,CACRC,YAAaF,EAAMG,QAAQ,MAE7BnC,OAAOiC,EAAAA,EAAAA,KAAI,CACT0B,WAAY3B,EAAM4B,WAAWC,iBAC7BC,SAAU9B,EAAM4B,WAAWG,UAAUD,SACrCE,OAAQ,UACRR,QAAS,eACTS,aAAc,WACdC,OAAQ,WAKRC,GAAkB,I,IAAA,WAAEf,EAAU,YAAEC,EAAW,KAAEpM,GAAqC,EAA5B/J,EAAAA,GAAAA,EAAAA,CAAlCkW,aAAYC,cAAapM,SACjD,MAAM4J,GAASC,EAAAA,EAAAA,YAAWC,IAiB1B,OACE,sB,UACG9J,EAAKgB,IAAImM,UACR,SAACvB,EAAAA,QAAOA,CAACC,SAAS,SAACuB,GAAAA,CAAAA,GAAmBtB,UAAU,SAASuB,aAAW,E,UAClE,SAACtB,EAAAA,KAAIA,CAACuB,cAAY,eAAetb,KAAK,uBAAuBzQ,KAAK,KAAKmpB,UAAWd,EAAOY,UAG7F,SAACoB,EAAAA,QAAOA,CAACC,QAtByB,EAAG0B,2BACvC,SAACrB,GAAsBA,G,uUAAAA,CAAAA,CAAAA,EACjBjW,GAAAA,CACJ+J,KAAMA,EACNmM,WAAY,KACVA,EAAWnM,GACXuN,SAAAA,GAAAA,EAEFnB,YAAa,KACXA,EAAYpM,GACZuN,SAAAA,GAAAA,KAY+BzB,UAAU,MAAMuB,aAAW,E,UAC1D,SAAC1B,OAAAA,CAAKjB,UAAWd,EAAOb,M,SAAQ/I,EAAKgB,IAAIhP,W,EAM3Cob,IAAiBI,EAAAA,EAAAA,OAAK,KAExB,UAAC7B,OAAAA,C,UAAK,oEAC8D,KAClE,SAAC8B,EAAAA,SAAQA,CAACC,UAAQ,EAACC,KAAK,2D,SAA2D,kBAEvE,IAAI,sGC7Cf,SAASC,IAAoB,cAAEC,EAAa,SAAElG,EAAQ,iBAAEmG,EAAgB,UAAEC,I,IAG3EF,EAFJ,MAAMjE,GAASC,EAAAA,EAAAA,YAAWC,IAE1B,OAAyB,QAArB+D,EAAAA,EAAcltB,eAAdktB,IAAAA,OAAAA,EAAAA,EAAuB/qB,QAAS,GAEhC,SAACunB,EAAAA,QAAOA,CACN0D,UAAWA,EACX5sB,MAAO0sB,EAAc1sB,MACrB6sB,iBAAkBH,EAAc7b,KAChC0Y,UAAWd,EAAOhM,QAClBjd,QAASktB,EAAcltB,QACvBstB,YAAa,KAAOJ,EAAc7b,KAClC2V,SAAWxmB,IACTwmB,EAASxmB,EAAMA,OAAS,GAAG,EAE7B2sB,iBAAkBA,EAClBhD,cAAe,IACfoD,kBAAkB,EAClBC,iBAAiB,KAKnB,SAACC,EAAAA,aAAYA,CACXL,UAAWA,EACXrD,UAAWd,EAAOvP,MAClBlZ,MAAO0sB,EAAc1sB,OAAS,GAC9B8sB,YAAa,KAAOJ,EAAc7b,KAClCgc,iBAAkBH,EAAc7b,KAChC2V,SAAWxmB,IACTwmB,EAASxmB,EAAMyJ,WAAW,EAE5BkjB,iBAAkBA,EAElBxB,MAAO,CACLW,OAAQ,OACRoB,WAAY,MACZC,UAAW,MACXC,YAAa,MACbC,SAAU,UAKpB,CDMApB,GAAeqB,YAAc,+BCJ7B,MAAM3E,GAAaiB,IAA0B,CAC3CnN,SAASoN,EAAAA,EAAAA,KAAI,CACX0D,OAAQ,EACRC,QAAS,EACT3B,aAAc,WACdC,OAAQ,SAEV5S,OAAO2Q,EAAAA,EAAAA,KAAI,CACT0D,OAAQ,EACRC,QAAS,EACTtU,MAAO,CACL4S,OAAQ,QAEVD,aAAc,WACdC,OAAQ,WC9DL,SAAS2B,IAAuB,KAAE5O,IACvC,MAAMiI,EAAWV,KACXqC,GAASC,EAAAA,EAAAA,YAAWC,KAInB+E,EAAWC,IAAkBhH,EAAAA,EAAAA,WAAS,IACtCiH,EAAUC,IAAiBlH,EAAAA,EAAAA,WAAS,GAE3C,IAAIjK,EL6BC,SAAiCmC,G,IAckBnC,EAZxD,MAAMA,EAA0BmC,EAAKgB,IAAInD,OAAO9c,KAAI,CAACmoB,EAAoBrmB,IACvEomB,GAAoBC,GAAU,EAAOlJ,EAAKnC,OAAOhb,MAInD,KAAOgb,EAAO/a,OAASkd,EAAKnC,OAAO/a,QAAQ,CACzC,MAAMomB,EAAWlJ,EAAKgB,IAAInD,OAAOmC,EAAKgB,IAAInD,OAAO/a,OAAS,GACpD3B,EAAQ6e,EAAKnC,OAAOA,EAAO/a,QACjC+a,EAAO/M,KAAKmY,GAAoBC,GAAU,EAAM/nB,GAClD,CAGA,GAAI0c,EAAO/a,QAAU+a,EAAOA,EAAO/a,OAAS,GAAG3B,QAAkC,QAAzB0c,EAAAA,EAAOA,EAAO/a,OAAS,UAAvB+a,IAAAA,OAAAA,EAAAA,EAA2BwL,UAAU,CAC3F,MAAMH,EAAWlJ,EAAKgB,IAAInD,OAAOmC,EAAKgB,IAAInD,OAAO/a,OAAS,GAC1D+a,EAAO/M,KAAKmY,GAAoBC,GAAU,EAAM,IAClD,CAEA,OAAOrL,CACT,CKjDeoR,CAAwBjP,GAMrC,OALAnC,EAASA,EAAOzT,QAAO,CAAC4D,EAAkBnL,IAEjC,EAASmd,EAAKgB,IAAInD,OAAO/a,SAAWkL,EAAEob,UAAapJ,EAAKuC,OAASvU,EAAE7M,OAAS4tB,GAAYF,KAI/F,SAACzE,MAAAA,CACCM,WAAWC,EAAAA,EAAAA,IAAGf,EAAOsF,UAAW,CAAE,CAACtF,EAAOtjB,OAAQ0Z,EAAKgB,IAAImM,UAC3DgC,OAAQ,IAAML,GAAe,GAC7BM,QAAS,IAAMN,GAAe,GAC9BO,YAAa,IAAMP,GAAe,GAClCQ,WAAY,IAAMR,GAAe,GAEjCxC,MAAO,CAAEW,OAAQ,Q,UAEjB,UAACsC,EAAAA,MAAKA,CAACC,IAAK,EAAGC,WAAY,W,WACzB,SAACvC,GAAcA,CACblN,KAAMA,EACNmM,WAAY,KACVlE,EAAS3O,EAAQK,aAAa,CAAEqG,OAAM0B,QAAS,IAAK,EAEtD0K,YAAa,KACXnE,EAAS3O,EAAQK,aAAa,CAAEqG,OAAM0B,OAAQ,IAAK,EAErD2K,SAAU,KACRpE,EAAS3O,EAAQI,eAAe,CAAEsG,SAAQ,KAG9C,SAAC0P,EAAAA,YAAWA,CAAChF,UAAWd,EAAOb,MAAOyD,MAAO,O,SAAQ,MAGpD3O,EAAO9c,KAAI,CAAC8sB,EAA8BhrB,KAEvC,UAACuT,EAAAA,SAAQA,C,WACP,SAACwX,GAAmBA,CAClBG,UAAqB,IAAVlrB,GAAemd,EAAKuC,MAC/BsL,cAAeA,EACflG,SAAWxmB,KACK,KAAVA,GAAgB0sB,EAAczE,WAChCnB,EAAS3O,EAAQM,oBAAoB,CAAEoG,OAAMnd,QAAO1B,WAEtD6tB,GAAc,GACdF,GAAe,EAAM,EAEvBhB,iBAAkBkB,IAEnBnsB,IAAUgb,EAAO/a,OAAS,EAAI,IAAM,KAbxBD,MAiBnB,SAAC6sB,EAAAA,YAAWA,CAAChF,UAAWd,EAAOb,MAAOyD,MAAO,O,SAAQ,UAM7D,CAEA,MAAM1C,GAAaiB,IAA0B,CAC3CmE,WAAWlE,EAAAA,EAAAA,KAAI,CACb2E,gBAAiB5E,EAAM6E,OAAOC,WAAWC,UACzCC,aAAchF,EAAMiF,MAAMC,OAAO5E,QACjCJ,YAAaF,EAAMG,QAAQ,IAC3ByD,QAAS,KAAK5D,EAAMG,QAAQ,KAC5B+B,OAAQ,GAAGlC,EAAM7Z,GAAGga,QAAQgF,sBAE9B5pB,OAAO0kB,EAAAA,EAAAA,KAAI,CACTmF,OAAQ,aAAapF,EAAM6E,OAAOtpB,MAAM8pB,SAE1CrH,OAAOiC,EAAAA,EAAAA,KAAI,CACT2D,QAAS,EACTD,OAAQ,IAEV9D,QAAQI,EAAAA,EAAAA,KAAI,CACV2D,QAAS5D,EAAMG,QAAQ,QC7FpB,SAASmF,IAAiB,UAAEvR,EAAY,GAAE,SAAE4H,IACjD,OACE,UAAC4J,EAAAA,eAAcA,CAACvH,MAAM,YAAYwH,MAAM,E,UACrCzR,EAAU/d,KAAI,CAACif,EAAoBnd,KAC1Bmd,EAAKiB,SAAU,SAAC2N,GAAsBA,CAAa5O,KAAMA,GAAbnd,MAEtD,SAAC6mB,GAAmBA,CAAChD,SAAUA,MAGrC,CCVO,SAAS8J,IAAmB,SAAEC,IACnC,MAAMxI,EAAWV,KAEX1N,GAAc6W,EAAAA,EAAAA,cACjB9K,IACCqC,EAAS3O,EAAQO,YAAY,CAAE+L,UAAS,GAE1C,CAACqC,IAGGnO,GAAW4W,EAAAA,EAAAA,cAAY,KAC3BzI,EAAS3O,EAAQQ,WAAW,GAC3B,CAACmO,IAEJ,OACE,SAAC0I,EAAAA,WAAUA,CACT/K,MAAO6K,EACP9I,SAAU9N,EACVsV,OAAQrV,EACR4N,WAAY5N,EACZmU,YAAa,gDACb2C,aAAa,YAGnB,C,gUCbA,MAAMC,GAAkB,IAaxB,SAAeC,GACblM,EACA/hB,EACA4O,G,uBAEA,IAAImU,EAAQnU,EAAO3O,OAAS,EAAI,IAAM2O,EAAS,IAAM,IACjD5O,EAAQ,IACV+iB,EAAQhB,EAAMC,WAAWhF,mBAAmBhd,GAAS,IAAM+iB,GAE7D,MAAMjlB,EAAU,CACdD,MAAOkkB,EAAMlkB,MACbqwB,UAAW,oBAGb,IACE,MAAMpT,QAAiBiH,EAAM1E,WAAWmF,gBAAgBO,EAAOjlB,GACzDqwB,GAAiCjwB,EAAAA,EAAAA,KAAI4c,GAAWC,IAC7C,CACLzc,MAAOyc,EAAQU,KACfgH,WAAY1H,EAAQ0H,eAIxB,OAAIziB,EAAQ,GAA4B,IAAvBmuB,EAAYluB,OACpBkuB,GAIK,IAAVnuB,IACFouB,EAAAA,EAAAA,WAAUrM,EAAMe,SAAU1G,IACpBA,EAAOqD,QAAUsC,EAAMC,WAAW5F,OAAOqD,OAI7C0O,EAAYE,QAAQ,CAClBlb,KAAM,aACN7U,MAAO,IAAM8d,EAAOqD,MACpBgD,YAAY,GACZ,KAKN2L,EAAAA,EAAAA,WAAUrM,EAAM3C,YAAYkP,gBAAiBC,IAC3CJ,EAAYE,QAAQ,CAClBlb,KAAM,WACN7U,MAAO,IAAMiwB,EAASpf,KACtBsT,YAAY,GACZ,IAKJ0L,EAAYE,QAAQ,CAAE/vB,MAAO,IAAKmkB,YAAY,IAC9C0L,EAAYvT,OAAOoT,IAEfjM,EAAM6B,cAA0B,IAAV5jB,GAqJ9B,SAA2BmuB,IACzBK,EAAAA,EAAAA,QAAOL,GAAcpa,GAAkB,YAAZA,EAAEzV,OAC/B,CAtJMmwB,CAAkBN,SAqIxB,SACEpM,EACAnT,EACAuf,G,uBAEA,IAAIO,QAAoBC,GAAkB5M,EAAOnT,GAOjD,OALA8f,GAAcxwB,EAAAA,EAAAA,KAAIwwB,GAAc3T,IAC9BA,EAAQzc,MAAQwjB,EAAa/G,EAAQzc,MAC9Byc,KAGFoT,EAAY5S,UAAUmT,EAC/B,G,GAjJmBE,CAAkB7M,EAAOnT,EAAQuf,IAEvCA,EAEX,CAAE,MAAOrR,GACHA,aAAejP,OACjB6U,GAA+BX,EAAOjF,EAE1C,CAEA,MAAO,EACT,G,GAyCO,SAAe+R,GACpB9M,EACA/hB,EACA8uB,G,uBAEA,OAAO7I,SAzBT,SAAuBlE,EAAiC/hB,EAAe8uB,G,uBACrE,IACE,MAAMC,EAAiBhN,EAAMC,WAAWV,qBAAqBthB,GACvDuJ,QAAewY,EAAM1E,WAAW2R,oBAAoBD,EAAgBD,EAAW,CACnFjxB,MAAOkkB,EAAMlkB,MACboxB,MAAOjB,KAGHkB,GAAUhxB,EAAAA,EAAAA,KAAIqL,EAAQ,QAE5B,OADA2lB,EAAQtU,OAAO,EAAG,EAAGmH,EAAMX,gBACpB8N,CACT,CAAE,MAAOpS,GACHA,aAAejP,OACjB0V,GAA4BxB,EAAOjF,EAEvC,CAEA,MAAO,EACT,G,GAOuCqS,CAAQpN,EAAO/hB,EAAO8uB,GAC7D,G,GAMA,SAAeH,GAAkB5M,EAAiC+M,G,uBAChE,IAAIM,EACJ,IACE,MAAML,EAAiBhN,EAAMC,WAAWV,uBAClC/X,QAAewY,EAAM1E,WAAW2R,oBAAoBD,EAAgBD,EAAW,CACnFjxB,MAAOkkB,EAAMlkB,MACboxB,MAAOjB,KAEToB,GAAiBlxB,EAAAA,EAAAA,KAAIqL,GAAS8lB,IACrB,CACL/wB,MAAO+wB,EAAI5T,KACXtI,KAAM,MACNsP,YAAY,KAGlB,CAAE,MAAO3F,GACPsS,EAAiB,GACbtS,aAAejP,OACjB0V,GAA4BxB,EAAOjF,EAEvC,CAEA,OAAOsS,CACT,G,GAiCO,SAAeE,GACpBvN,EACArB,EACA1gB,EACAuvB,G,uBAEA,OAAOtJ,SA3BT,SACElE,EACArB,EACA1gB,EACAuvB,G,uBAEA,MAAMR,EAAiBhN,EAAMC,WAAWV,qBAAqBthB,GACvDwvB,EAAS9O,EAAIriB,IACbkL,QAAewY,EAAM1E,WAAWoS,yBAAyBV,EAAgBS,EAAQD,EAAa,CAClG1xB,MAAOkkB,EAAMlkB,MACboxB,MAAOjB,KAEH0B,GAAYxxB,EAAAA,EAAAA,KAAIqL,EAAQ,QAM9B,OAJA6kB,EAAAA,EAAAA,WAAUrM,EAAM3C,YAAYkP,gBAAiBC,IAC3CmB,EAAUzhB,KAAK,KAAOsgB,EAASpf,KAAO,UAAU,IAG3CugB,CACT,G,GAQuCC,CAAa5N,EAAOrB,EAAK1gB,EAAOuvB,GACvE,G,GChMO,SAASK,IAAc,YAAEC,EAAW,QAAE9U,EAAO,MAAEgH,IACpD,MAAMqD,EAAWV,KACXoL,GAAcjC,EAAAA,EAAAA,cACjBvvB,GD+EE,SACLyjB,EACA/hB,EACA4O,G,uBAEA,OAAOuX,SAA+B8H,GAAelM,EAAO/hB,EAAO4O,GACrE,G,GCpFamhB,CAA0BhO,EAAO8N,EAAavxB,GAAS,KAEhE,CAACyjB,EAAO8N,IAEJG,GAAuB3K,EAAAA,EAAAA,UAAQ,KAAM4K,EAAAA,EAAAA,UAASH,EAAa,IAAK,CAAEI,SAAS,KAAS,CAACJ,IAErFK,GAAmBtC,EAAAA,EAAAA,cACtBuC,IAEChL,EAAS3O,EAAQF,oBAAoB,CAAEwE,QAASqV,EAAgB9xB,MAAQ0B,MAAO6vB,IAAe,GAEhG,CAACzK,EAAUyK,IAKPQ,GAA4BhL,EAAAA,EAAAA,UAAQ,KAAM4K,EAAAA,EAAAA,UAASE,EAAkB,MAAM,CAACA,IAElF,OACE,SAACG,EAAAA,aAAYA,CACXhyB,MAAOyc,EAAQzc,MACf2pB,cAAe,IACfoD,kBAAkB,EAClByE,YAAaE,EACbO,uBAAuB,EACvBzL,SAAUuL,GAGhB,CClDO,SAASG,IAAe,SAAE1V,EAAW,GAAE,MAAEiH,IAC9C,OACE,SAACwF,MAAAA,C,SACEzM,EAAS5c,KAAI,CAAC6c,EAAS/a,KACf,SAAC4vB,GAAaA,CAAC7U,QAASA,EAAS8U,YAAa7vB,EAAmB+hB,MAAOA,GAAd/hB,MAIzE,CCXO,SAASywB,KACd,MAAMrL,EAAWV,KACXyE,GAAU0E,EAAAA,EAAAA,cAAY,KAC1BzI,EAAS3O,EAAQE,UAAU,GAC1B,CAACyO,IACJ,OAAO,SAACsC,EAAAA,OAAMA,CAACC,KAAK,OAAOwB,QAASA,EAAShW,KAAK,SAASyU,QAAQ,YAAYI,aAAW,iBAC5F,C,44BCYO,SAAS0I,IAAU,IAAEhQ,EAAG,SAAES,EAAQ,MAAEY,IACzC,MAAMqD,EAAWV,KACXiM,GAAiB9C,EAAAA,EAAAA,cACpB+C,GACQ/B,GAAmB9M,EAAOZ,EAAUyP,GAAc,KAE3D,CAAC7O,EAAOZ,IAEJ0P,GAA0BxL,EAAAA,EAAAA,UAAQ,KAAM4K,EAAAA,EAAAA,UAASU,EAAgB,IAAK,CAAET,SAAS,KAAS,CAACS,IAE3FG,GAAqBjD,EAAAA,EAAAA,cACxB+C,GACQtB,GAAwBvN,EAAOrB,EAAKS,EAAUyP,GAAc,KAErE,CAAC7O,EAAOZ,EAAUT,IAEdqQ,GAA8B1L,EAAAA,EAAAA,UAClC,KAAM4K,EAAAA,EAAAA,UAASa,EAAoB,IAAK,CAAEZ,SAAS,KACnD,CAACY,IAGH,OACE,sB,WACE,SAACR,EAAAA,aAAYA,CACXrI,cAAe,IACf3pB,MAAOoiB,EAAIriB,IACXyxB,YAAae,EACbN,uBAAuB,EACvBzL,SAAWxmB,IACT8mB,EACE3O,EAAQC,WAAW,CACjBgK,IAAK,SAAKA,GAAAA,CAAKriB,IAAKC,EAAMA,QAC1B0B,MAAOmhB,IACT,EAGJkK,kBAAkB,KAEpB,SAAC7D,EAAAA,QAAOA,CACNS,cAAe,GACf3pB,MAAOoiB,EAAIzb,SACXnH,QJqDCmoB,GAAwBpE,GIpDzBiD,SAAWxmB,IACT8mB,EACE3O,EAAQC,WAAW,CACjBgK,IAAK,SAAKA,GAAAA,CAAKzb,SAAU3G,EAAMA,QAC/B0B,MAAOmhB,IACT,KAIN,SAACmP,EAAAA,aAAYA,CACXrI,cAAe,IACf3pB,MAAOoiB,EAAIpiB,MACXwxB,YAAaiB,EACbR,uBAAuB,EACvBzL,SAAWxmB,IACT8mB,EACE3O,EAAQC,WAAW,CACjBgK,IAAK,SAAKA,GAAAA,CAAKpiB,MAAOA,EAAMA,QAC5B0B,MAAOmhB,IACT,EAGJkK,kBAAkB,MAI1B,CCjEO,SAAS2F,IAAY,KAAE9U,EAAI,MAAE6F,IAClC,MAAMqD,EAAWV,KACXqC,GAASC,EAAAA,EAAAA,YAAWC,IAIpBgK,GAA2BpD,EAAAA,EAAAA,cAC9B+C,GLsJE,SACL7O,EACA+M,G,uBAEA,OAAO3I,SAA+BwI,GAAkB5M,EAAO+M,GACjE,G,GK1JaoC,CAA6BnP,EAAO6O,GAAc,KAE3D,CAAC7O,IAEGoP,GAA6B9L,EAAAA,EAAAA,UACjC,KAAM4K,EAAAA,EAAAA,UAASgB,EAA0B,IAAK,CAAEf,SAAS,KACzD,CAACe,IAGH,OACE,UAAC1J,MAAAA,C,UACErL,EAAKhe,KAAI,CAACwiB,EAAK1gB,KACP,SAAC0wB,GAASA,CAAavP,SAAUnhB,EAAO0gB,IAAKA,EAAKqB,MAAOA,GAAzC/hB,KAExBkc,EAAKjc,SACJ,SAACqwB,EAAAA,aAAYA,CACXrI,cAAe,IACfnD,SAAWxmB,IACT8mB,EAAS3O,EAAQD,UAAU,CAAEuE,QAASzc,EAAMA,QAAU,EAExDwxB,YAAaqB,EACbZ,uBAAuB,EACvB9I,WAAW,SAACC,EAAAA,OAAMA,CAACC,KAAK,OAAOC,QAAQ,YAAYC,UAAWd,EAAOgB,OAAQC,aAAW,kBAG3FjG,EAAMiB,SAAU,SAACyN,GAAUA,CAAAA,KAGlC,CAEA,SAASxJ,GAAUiB,GACjB,MAAO,CACLH,QAAQI,EAAAA,EAAAA,KAAI,CACVC,YAAaF,EAAMG,QAAQ,MAGjC,CC7DO,SAAS+I,IAAc,MAAErP,I,IACPA,EACFA,EADrB,MAAMsP,GAAiC,QAAhBtP,EAAAA,EAAMC,kBAAND,IAAAA,OAAAA,EAAAA,EAAkB5F,kBACvC,SAAC6U,GAAWA,CAAC9U,KAAsB,QAAhB6F,EAAAA,EAAMC,kBAAND,IAAAA,OAAAA,EAAAA,EAAkB7F,KAAM6F,MAAOA,KAElD,SAACyO,GAAcA,CAAC1V,SAAUiH,EAAMjH,SAAUiH,MAAOA,IAGnD,OACE,SAAC0L,EAAAA,eAAcA,CAACvH,MAAM,SAASwH,MAAM,E,SAClC2D,GAGP,CCWA,SAASC,K,IAQAvP,EACCA,EAG+BA,EASxBA,EApBf,MAAMqD,EAAWV,KACX3C,GlBfC4C,EAAAA,EAAAA,YAAWF,IkBgBZsC,GAASC,EAAAA,EAAAA,YAAWC,IAE1B,OACE,UAACM,MAAAA,CAAIM,UAAWd,EAAOsF,U,WACrB,UAAC9E,MAAAA,CAAIM,UAAWd,EAAOwK,a,WACR,QAAZxP,EAAAA,EAAM3F,cAAN2F,IAAAA,OAAAA,EAAAA,EAAc1F,cAAc,SAACsR,GAAkBA,CAACC,SAAU7L,EAAM3F,OAAOA,WAC1D,QAAZ2F,EAAAA,EAAM3F,cAAN2F,IAAAA,OAAAA,EAAAA,EAAc1F,cACd,sB,WACE,SAAC+U,GAAaA,CAACrP,MAAOA,KACtB,SAACyL,GAAgBA,CAACvR,UAA2B,QAAhB8F,EAAAA,EAAMC,kBAAND,IAAAA,OAAAA,EAAAA,EAAkB9F,UAAW4H,SAAU9B,EAAM8B,kBAIhF,SAAC6D,EAAAA,OAAMA,CACLG,UAAWd,EAAOyK,aAClB7J,KAAK,MACLC,QAAQ,YACRI,aAAW,qBACXW,QAAS5G,SAAiB,QAAjBA,EAAAA,EAAOC,kBAAPD,IAAAA,OAAAA,EAAAA,EAAmBte,MAC5B0lB,QAAS,KACP/D,EAAS3O,EAAQS,mBAAmB,MAK9C,CAEA,SAAS+P,GAAUiB,GACjB,MAAO,CACLmE,WAAWlE,EAAAA,EAAAA,KAAI,CACbuB,QAAS,SAEX6H,cAAcpJ,EAAAA,EAAAA,KAAI,CAChBsJ,SAAU,IAEZD,cAAcrJ,EAAAA,EAAAA,KAAI,CAChBuJ,WAAYxJ,EAAMG,QAAQ,MAGhC,C,44BC/DA,MAAMsJ,GAAuC,CAC3C,CAAEzL,MAAO,gBAAiB5nB,MAAOynB,GAAkBa,SACnD,CAAEV,MAAO,cAAe5nB,MAAOynB,GAAkB6L,OACjD,CAAE1L,MAAO,oBAAqB5nB,MAAOynB,GAAkB8L,aCFzD,SAASC,GAAUzC,GACjB,GAAIA,EACF,OAAOzW,SAASyW,EAAK,GAGzB,CAEA,SAAS0C,GAAqB1C,GAC5B,GAAIA,EACF,MAAY,SAARA,GAGQ,UAARA,GAGGzW,SAASyW,EAAK,GAGzB,CAEO,SAAS2C,GAAgBC,GAC9B,IAAK,MAAMpc,KAAQoc,EAAU,CAC3B,MAAMC,EAAerc,EAAK,gBAE1B,GAAIqc,EAAe,EAAG,C,IAGNrc,EAEd,MAAO,CACL4F,KAAM,sCALO0W,GAAsBtc,EAAK,sBACZqc,GAAcE,mBACA,QAA9Bvc,EAAAA,EAAK,iCAALA,IAAAA,EAAAA,EAAkC,IAAI1O,QAAQ,eAAgB,eAI1EkrB,SAAU,OACVC,QAAS,OAEb,CACF,CAEA,OAAO,IACT,CAEO,SAASC,GAA8BN,GAC5C,IAAK,MAAMpc,KAAQoc,EAAU,CAC3B,MAAMO,EAAY3c,EAAK,aAEvB,GAAI2c,EAAY,EAAG,C,IACH3c,EAEd,MAAO,CACL4F,KAAM,iCAAiC+W,gCAHJ,QAAvB3c,EAAAA,EAAK,0BAALA,IAAAA,EAAAA,EAA2B,IAAI1O,QAAQ,eAAgB,eAInEkrB,SAAU,OACVC,QAAS,OAEb,CACF,CAEA,OAAO,IACT,CAEO,SAASH,GAAsBM,GACpC,OAAKA,EAGEA,EAAKrrB,MAAM,KAAKlJ,KAAKma,IAC1B,MAAMqa,EAAOra,EAAIjR,MAAM,KACvB,MAAO,CACLgrB,SAAUM,EAAK,GACfC,UAAWD,EAAK,GAChBE,UAAWF,EAAK,GAChBG,UAAWf,GAAUY,EAAK,IAC1BI,MAAOf,GAAqBW,EAAK,IAClC,IAVM,EAYX,CCrEO,MAAMK,WAAgCC,EAAAA,cAC3CC,UAAAA,CAAWpd,EAA4BxX,GACrC,MAAM0oB,EAASE,KACTiM,EAAUf,GAAsBtc,EAAK,sBACrCsd,EAAenB,GAAgB,CAACnc,IAChCud,EAAgBb,GAA8B,CAAC1c,I,IACnCA,EAAlB,MAAMwd,GAA0C,QAA9Bxd,EAAAA,EAAK,iCAALA,IAAAA,EAAAA,EAAkC,IAAI1O,QAAQ,eAAgB,IAE1EmsB,EAAeJ,EAAQhW,QAC3B,CAACQ,EAAK6V,IAAW7V,GAAO6V,EAAOZ,UAAYa,EAAAA,UAAUC,kBAAkBF,EAAOZ,WAAa,IAC3F,GAGF,OACE,UAACpL,MAAAA,CAAIM,UAAWd,EAAO2M,S,WACrB,UAACnM,MAAAA,CAAIM,UAAWd,EAAO4M,e,UAAgB,WAC5B9d,EAAK,gBACd,UAAC0R,MAAAA,CAAIM,UAAU,c,UAAc,iBAAehS,EAAK2H,aAEnD,UAAC+J,MAAAA,CAAIM,UAAWd,EAAO6M,a,WACrB,UAACrM,MAAAA,CAAIM,UAAWd,EAAO8M,K,WACrB,SAACtM,MAAAA,CAAIM,UAAWd,EAAO+M,Y,SAAa,mBACpC,SAACvM,MAAAA,CAAIM,UAAWd,EAAOgN,gB,SAAiB,4EAIvCZ,IAAgB,SAAChoB,IAAAA,C,SAAGgoB,EAAa1X,QAChC0X,IAAgB,SAAChoB,IAAAA,C,SAAE,gCAErB,SAACoc,MAAAA,C,SACE2L,EAAQh1B,KAAI,CAACq1B,EAAQvzB,KACpB,MACMg0B,GADeT,EAAOZ,UAAYa,EAAAA,UAAUC,kBAAkBF,EAAOZ,WAAa,GAClDW,EAAgB,IAChDW,EAAWj0B,IAAU6V,EAAK,gBAEhC,OACE,UAAC0R,MAAAA,CAA2BM,UAAWd,EAAOwM,O,WAC5C,SAAChM,MAAAA,CAAIM,UAAWd,EAAOmN,e,SAAiBX,EAAOnB,YAC/C,SAAC7K,MAAAA,CACCM,WAAWC,EAAAA,EAAAA,IAAGf,EAAOoN,gBAAiB,CAAE,CAACpN,EAAOqN,uBAAwBH,IACxExK,MAAO,CAAEgI,SAAUuC,MAErB,SAACzM,MAAAA,CAAIkC,MAAO,CAAEgI,SAAU,IAAMuC,G,SAAkBT,EAAOZ,cAN/CY,EAAOZ,UAAS,UAalC,UAACpL,MAAAA,CAAIM,UAAWd,EAAO8M,K,WACrB,SAACtM,MAAAA,CAAIM,UAAWd,EAAO+M,Y,SAAa,2BACpC,SAACvM,MAAAA,CAAIM,UAAWd,EAAOgN,gB,SAAiB,4FAIvCle,EAAK,eAAiB,IAAK,UAAC1K,IAAAA,C,UAAE,iCAA+BkoB,KACrC,IAAxBxd,EAAK,iBAAwB,SAAC1K,IAAAA,C,SAAE,oCAGnC,UAACoc,MAAAA,CAAIM,UAAWd,EAAO8M,K,WACrB,SAACtM,MAAAA,CAAIM,UAAWd,EAAO+M,Y,SAAa,mCACpC,SAACvM,MAAAA,CAAIM,UAAWd,EAAOgN,gB,SAAiB,yIAKvCX,IAAiB,SAACjoB,IAAAA,C,SAAGioB,EAAc3X,QAClC2X,IAAiB,SAACjoB,IAAAA,C,SAAE,qCArDU9M,EA0D1C,CAEA8gB,MAAAA,GACE,MAAM,KAAEkV,GAASr2B,KAAKoV,MAGhBkhB,EAAoD,CAAC,EAE3D,IAAK,MAAMC,KAAUF,EAAM,C,IACkCE,EAAAA,EAA3D,MAAMC,EAAqDD,SAAY,QAAZA,EAAAA,EAAQ1e,YAAR0e,IAAAA,GAAoB,QAApBA,EAAAA,EAAcE,cAAdF,IAAAA,OAAAA,EAAAA,EAAsBC,eACjF,GAAIA,EACF,IAAK,MAAMd,KAAYc,EAAgB,CAErC,MAAMn2B,EAAM,GAAGsnB,KAAKC,UAAU8N,KAE1BY,EAAYj2B,GACdi2B,EAAYj2B,GAAKmf,OAASkW,EAASlW,MAEnC8W,EAAYj2B,GAAOq1B,CAEvB,CAEJ,CAEA,OAAwC,IAApCxhB,OAAOtT,KAAK01B,GAAar0B,QACpB,SAACsnB,MAAAA,C,SAAI,2BAIZ,UAACA,MAAAA,C,WACC,SAACmN,KAAAA,CAAG7M,UAAU,e,SAAe,uBAC5B3V,OAAOtT,KAAK01B,GAAap2B,KAAKG,GAAQL,KAAKi1B,WAAWqB,EAAYj2B,GAAMA,OAG/E,EAGF,MAAM4oB,IAAY0N,EAAAA,EAAAA,gBAAc,KAC9B,MAAM,MAAEzM,GAAU0M,EAAAA,OACZC,EAAc3M,EAAM4M,OAAS5M,EAAM6M,QAAQC,OAAS9M,EAAM6M,QAAQE,OAClEjI,EAAa9E,EAAM4M,OAAS5M,EAAM6M,QAAQG,MAAQhN,EAAM6M,QAAQI,MAChEC,EAAWlN,EAAM4M,OAAS5M,EAAM6M,QAAQM,OAASnN,EAAM6M,QAAQE,OAErE,MAAO,CACLvB,UAAUvL,EAAAA,EAAAA,KAAI,CACZ6E,WAAYA,EACZM,OAAQ,aAAauH,IACrBS,aAAcpN,EAAMG,QAAQkN,KAE9B5B,gBAAgBxL,EAAAA,EAAAA,KAAI,CAClB6E,WAAYoI,EACZtJ,QAAS,GAAG5D,EAAMG,QAAQmN,MAAMtN,EAAMG,QAAQkN,KAC9CvL,SAAU9B,EAAM4B,WAAWprB,KAAK62B,GAChC7L,QAAS,OACTE,eAAgB,kBAElBgK,cAAczL,EAAAA,EAAAA,KAAI,CAChB2D,QAAS5D,EAAMG,QAAQkN,KAEzBzB,aAAa3L,EAAAA,EAAAA,KAAI,CACf6B,SAAU9B,EAAM4B,WAAWprB,KAAK62B,KAElCxB,iBAAiB5L,EAAAA,EAAAA,KAAI,CACnB6B,SAAU9B,EAAM4B,WAAWprB,KAAK+2B,GAChCC,MAAOxN,EAAM6E,OAAO4I,SACpBL,aAAcpN,EAAMG,QAAQoN,KAE9B5B,MAAM1L,EAAAA,EAAAA,KAAI,CACRmN,aAAcpN,EAAMG,QAAQuN,GAE5B,eAAgB,CACdN,aAAc,KAGlB/B,QAAQpL,EAAAA,EAAAA,KAAI,CACVuB,QAAS,OACT4L,aAAcpN,EAAMG,QAAQoN,GAC5BvI,aAAchF,EAAMoF,OAAOF,OAAOqI,KAEpCvB,gBAAgB/L,EAAAA,EAAAA,KAAI,CAClBsJ,SAAU,EACV9H,MAAO,SAETwK,iBAAiBhM,EAAAA,EAAAA,KAAI,CACnB6E,WAAY,yBAAyB9E,EAAM6M,QAAQc,WAAW3N,EAAM6M,QAAQe,UAC5EC,UAAW,SACXL,MAAOxN,EAAM6M,QAAQI,MACrB/M,YAAaF,EAAMG,QAAQkN,GAC3BrI,aAAchF,EAAMoF,OAAOF,OAAOqI,KAEpCrB,uBAAuBjM,EAAAA,EAAAA,KAAI,CACzB6E,WAAY,yBAAyB9E,EAAM6M,QAAQiB,cAAc9N,EAAM6M,QAAQkB,gBAElF,ICpLUC,GAAoB,CAAC,MAAO,MAAO,OAEnCC,IAA2BxX,EAAAA,EAAAA,MAAKuX,ICE9B,SAASE,GAAahjB,GACnC,OACE,UAACijB,EAAAA,MAAKA,CAAChE,SAAS,OAAOiE,MAAM,yCAAyC9M,SAAUpW,EAAMmjB,U,WACpF,SAACprB,IAAAA,C,SAAE,8EACH,SAACA,IAAAA,C,SAAE,8WAMH,SAACA,IAAAA,C,SAAE,gTAKH,UAACA,IAAAA,C,UAAE,6BACwB,SAAC+K,OAAAA,C,SAAK,iCAAmC,QAEpE,UAACsgB,QAAAA,C,WACC,SAACC,QAAAA,C,UACC,UAACC,KAAAA,C,WACC,SAACC,KAAAA,C,SAAG,oBACJ,SAACA,KAAAA,C,SAAG,+BAGR,UAACC,QAAAA,C,WACC,UAACF,KAAAA,C,WACC,SAACG,KAAAA,C,UACC,UAAC3gB,OAAAA,C,UAAK,kBACU,SAAC4gB,IAAAA,C,SAAE,SAAQ,KAAC,SAACA,IAAAA,C,SAAE,QAAO,kBAGxC,SAACD,KAAAA,C,UACC,UAAC3gB,OAAAA,C,UAAK,cACgB,SAAC4gB,IAAAA,C,SAAE,SAAQ,eAAqB,SAACA,IAAAA,C,SAAE,QAAO,cAIpE,UAACJ,KAAAA,C,WACC,SAACG,KAAAA,C,UACC,UAAC3gB,OAAAA,C,UAAK,oBACY,SAAC4gB,IAAAA,C,SAAE,cAAuB,gBAG9C,SAACD,KAAAA,C,UACC,UAAC3gB,OAAAA,C,UAAK,cACgB,SAAC4gB,IAAAA,C,SAAE,cAAa,cAI1C,UAACJ,KAAAA,C,WACC,SAACG,KAAAA,C,UACC,SAAC3gB,OAAAA,C,SAAK,+DAER,SAAC2gB,KAAAA,C,UACC,SAAC3gB,OAAAA,C,SAAK,2CAOpB,CCtDO,MAAM6gB,GAAyB3jB,IACpC,MAAO4jB,EAAUC,IAAehS,EAAAA,EAAAA,UAAS7R,EAAM4jB,UAAY,IAE3D,OACE,UAACzP,MAAAA,C,WACC,SAAC2P,KAAAA,CAAGrP,UAAU,e,SAAe,oBAC3BzU,EAAM+jB,WACN,SAAChsB,IAAAA,C,UACC,SAACuc,EAAAA,OAAMA,CAACgG,KAAK,OAAOvE,QAAS/V,EAAMgkB,c,SAAe,oCAKrDhkB,EAAM+jB,WAAY,SAACf,GAAYA,CAACG,UAAWnjB,EAAMmjB,aAElD,UAACc,EAAAA,IAAGA,CAAC/B,aAAc,E,UAChB0B,EAAS94B,KAAI,CAACo5B,EAAS1vB,KACtB,UAAC2vB,EAAAA,eAAcA,C,WACb,SAACC,EAAAA,YAAWA,CAACtR,MAAO,YAAYte,EAAI,K,UAClC,SAAC6vB,EAAAA,MAAKA,CACJ9N,MAAO,GACP7E,SAAW4S,IACT,IAAIC,EAAcX,EAASzb,SAC3Boc,EAAY/vB,GAAK8vB,EAAYtb,OAAO9d,MACpC24B,EAAYU,EAAY,EAE1BrL,OAAQ,KACNlZ,EAAM0R,SAASkS,EAAS,EAE1B5L,YAAY,iCACZ9sB,MAAOg5B,OAGX,SAAC5P,EAAAA,OAAMA,CACLvU,KAAK,SACL6U,aAAW,gBACXJ,QAAQ,YACRlpB,KAAK,KACLyqB,QAAUne,IACR,IAAI2sB,EAAcX,EAASzb,SAC3Boc,EAAY/c,OAAOhT,EAAG,GACtBqvB,EAAYU,GACZvkB,EAAM0R,SAAS6S,EAAY,E,UAG7B,SAACzO,EAAAA,KAAIA,CAAC/Z,KAAK,kBA5BMvH,MAgCvB,SAAC8f,EAAAA,OAAMA,CACLE,QAAQ,YACRD,KAAK,OACLxU,KAAK,SACLgW,QAAS,KACP8N,EAAY,IAAID,EAAU,IAAI,E,SAEjC,2B,EChEF,SAASY,GAAWnc,GACzB,MAAO,CACLoc,SAAUpc,EAAKrU,MAAM,KAAKlJ,KAAK45B,GACzBA,EAAWlqB,WAAW,MAAQkqB,EAAWC,SAAS,KAC7C,CACLz5B,MAAO,IACP05B,UAAWF,EAAW7tB,MAAM,GAAI,IAG3B,CAAE3L,MAAOw5B,KAIxB,CAKO,SAAS/vB,GAASuvB,GACvB,OAAOA,EAAQO,SACZ35B,KAAK+5B,GACGA,EAAQD,UAAY,IAAIC,EAAQD,aAAe,GAAGC,EAAQ35B,UAElE0K,KAAK,IACV,C,44BCZO,MAAMkvB,GAAyB,uDAEhCC,GAAmBjC,GAAkBh4B,KAAKN,IAAa,CAAEsoB,MAAO,GAAGtoB,MAAaU,MAAOV,MAEvFw6B,GAAgBlmB,OAAOmmB,QAAQrS,IAAc9nB,KAAI,EAAEgoB,EAAO5nB,MAAY,CAC1E4nB,QACA5nB,YASK,MAAMg6B,WAAqBtF,EAAAA,cAQhCuF,iBAAAA,IACEC,EAAAA,EAAAA,sCAAqCx6B,KAAKoV,MAAO,kBAAmBpV,KAAKy6B,uBAC3E,CAEAtZ,MAAAA,G,IA8DmBrhB,EAAAA,EA7DjB,MAAM,QAAEA,EAAO,gBAAE46B,GAAoB16B,KAAKoV,MAEpCulB,EAAiBR,GAAiBS,MAAMC,GAASA,EAAKv6B,QAAUN,KAAKy6B,yBAE3E,OACE,sB,UACsB,WAAnB36B,EAAQg7B,SACP,SAACzC,EAAAA,MAAKA,CAACC,MAAM,qBAAqBjE,SAAS,U,SAAU,kJAKvD,SAAC0G,EAAAA,uBAAsBA,CACrBC,WAAW,wBACXC,iBAAkBn7B,EAClBgnB,SAAU4T,EACVQ,0BAA2BtE,EAAAA,OAAOsE,6BAEpC,UAACC,EAAAA,SAAQA,C,WACP,SAACC,SAAAA,CAAOvR,UAAU,e,SAAe,sBACjC,SAACwR,EAAAA,MAAKA,CACJnT,MAAM,UACNuC,YAAY,kF,UAEZ,SAAC6Q,EAAAA,OAAMA,CACL3uB,GAAG,mBACHqd,aAAW,mBACX1pB,MAAOq6B,EACP76B,QAASq6B,GACTxO,MAAO,GACP7E,UAAUyU,EAAAA,EAAAA,wCAAuCv7B,KAAKoV,MAAO,wBAIjE,SAACimB,EAAAA,MAAKA,CACJnT,MAAM,wBACNuC,YAAY,wQ,UAGZ,SAAC6Q,EAAAA,OAAMA,CACL3uB,GAAG,eACH7M,QAASs6B,GACT95B,MAAO85B,GAAcQ,MAAMzlB,GAASA,EAAK7U,QAAUR,EAAQ07B,SAASC,eACpE9P,MAAO,GACP7E,UAAUyU,EAAAA,EAAAA,wCAAuCv7B,KAAKoV,MAAO,oBAGhEtV,EAAQ07B,SAASC,eAAiBzT,GAAa0T,aAC9C,SAACL,EAAAA,MAAKA,CACJnT,MAAM,mBACNuC,YAAY,qE,UAEZ,SAACkR,EAAAA,OAAMA,CACLhvB,GAAG,mBACHrM,QAASR,EAAQ07B,SAASI,uBAC1B9U,UAAU+U,EAAAA,EAAAA,yCAAwC77B,KAAKoV,MAAO,kCAKtE,SAAC2jB,GAAqBA,CACpBC,WAA+C,QAApCl5B,EAAAA,EAAQ07B,SAASM,2BAAjBh8B,IAAAA,GAA0C,QAA1CA,EAAAA,EAAsCi8B,YAAtCj8B,IAAAA,OAAAA,EAAAA,EAA4Ck5B,WAAY,IAAI94B,IAAI6J,IAC3EovB,SAAUn5B,KAAK+jB,MAAMiY,iBACrBzD,UAAW,KACTv4B,KAAKgnB,SAAS,CAAEgV,kBAAkB,IAClCC,EAAAA,MAAMC,UAAUhC,IAAwB,EAAM,EAEhDd,cAAe,KACbp5B,KAAKgnB,SAAS,CAAEgV,kBAAkB,IAClCC,EAAAA,MAAMC,UAAUhC,IAAwB,EAAK,EAE/CpT,SAAWkS,IACT0B,EAAgB,SACX56B,GAAAA,CACH07B,SAAU,SACL17B,EAAQ07B,UAAQ,CACnBM,oBAAqB,SAChBh8B,EAAQ07B,SAASM,qBAAmB,CACvCC,KAAM,CACJ/C,SAAUA,EAAS94B,IAAI05B,W,MASzC,CAEA,0BAAYa,GACV,OAAOz6B,KAAKoV,MAAMtV,QAAQ07B,SAASW,iBAAmBhE,EACxD,CAxGA,WAAAp4B,CAAYqV,GACVgnB,MAAMhnB,GACNpV,KAAK+jB,MAAQ,CACXiY,iBAAkBC,EAAAA,MAAMI,UAAUnC,IAAwB,GAE9D,E,s8BC9BK,MAAMoC,GAAoBlnB,IAC/B,MAAM,MAAE2P,EAAK,SAAE+B,GAAa1R,E,IACiB2P,EAA7C,MAAO3G,EAAQme,IAAatV,EAAAA,EAAAA,UAA6B,QAAZlC,EAAAA,EAAM3G,cAAN2G,IAAAA,EAAAA,EAAgB,I,IAClBA,EAA3C,MAAO7G,EAAMse,IAAWvV,EAAAA,EAAAA,UAA6B,QAAVlC,EAAAA,EAAM7G,YAAN6G,IAAAA,EAAAA,EAAc,IACnD0X,EAAc,CAA4Dp8B,EAAQgxB,KAEpFvK,EAAS,SACJ/B,GAFK,SAAR1kB,EAEG0kB,CACH,CAAC1kB,GAAMgxB,EACPqL,iBAAiB,EACjB/T,UAAWtoB,GAIR0kB,CACH,CAAC1kB,GAAMgxB,EACPqL,iBAAiB,EACjBre,YAAY,IAEhB,EAOI0K,GAASC,EAAAA,EAAAA,YAAWC,IAE1B,OACE,UAACoQ,EAAAA,IAAGA,CAAC/B,aAAc,E,WACjB,SAACkC,EAAAA,YAAWA,CAACtR,MAAM,iBAAiByU,WAAY,GAAIC,MAAI,E,UACtD,SAACnD,EAAAA,MAAKA,CACJn5B,MAAO8d,EACP0I,SAAWhS,GAAMynB,EAAUznB,EAAE+nB,cAAcv8B,OAAS,IACpDguB,OAAQ,IAAMmO,EAAY,SAAUre,GACpCgP,YAAY,oDAIhB,SAAC0P,KAAAA,CAAGjT,UAAWd,EAAOgU,Q,SAAS,QAE/B,SAACvD,EAAAA,YAAWA,CAACtR,MAAM,uBAAuByU,WAAY,G,UACpD,SAACK,EAAAA,UAASA,CAACrwB,GAAG,aAAagf,MAAO,GAAIzN,KAAMA,EAAM4I,SApBlCmW,IACpBT,EAAQS,GACRR,EAAY,OAAQQ,EAAU,EAkBgD7P,YAAY,2B,EAMxFnE,GAAaiB,IAA0B,CAC3C6S,SAAS5S,EAAAA,EAAAA,KAAI,CACX6B,SAAU9B,EAAM4B,WAAWoR,KAAKlR,SAChCsL,aAAcpN,EAAMG,QAAQ,O,yHC3BhC,MAAMroB,GAAkB,CAAC,EAEzB,SAASm7B,GAAWhU,GAClBA,EAAQnM,OAASmM,EAAQnM,QAAU,GACnCmM,EAAQiU,cAAgBjU,EAAQiU,eAAiB,GAEjDp7B,GAAMmnB,EAAQhY,MAAQgY,EAClBA,EAAQkU,YACVr7B,GAAMmnB,EAAQkU,WAAalU,EAE/B,CAEA,MAAMmU,GAAwB,CAAC,CAAEnsB,KAAM,QAASgE,KAAM,kBAAmBoT,UAAU,EAAMC,UAAU,IA46BnG,SAAS+U,GAAyBvmB,EAA2BmlB,GAC3D,MAAMqB,GAAc15B,EAAAA,GAAAA,QAAOq4B,GAC3B,QAAKqB,KAIGxmB,EAAIpX,UAAW+D,EAAAA,GAAAA,KAAI65B,EAAaxmB,EAAIpX,SAC9C,CAj7BAu9B,GAAW,CACThsB,KAAM,iBACNiY,SAAU,YACVpM,OAAQ,CAAC,CAAE7L,KAAM,UAAWgE,KAAM,QAClCioB,cAAe,CAAC,KAGlBD,GAAW,CACThsB,KAAM,YACNiY,SAAU,YACVpM,OAAQ,CAAC,CAAE7L,KAAM,YAAagE,KAAM,MAAOoT,UAAU,IACrD6U,cAAe,KAGjBD,GAAW,CACThsB,KAAM,sBACNiY,SAAU,cAGZ+T,GAAW,CACThsB,KAAM,6BACNiY,SAAU,YACVpM,OAAQ,CAAC,CAAE7L,KAAM,QAASgE,KAAM,QAChCioB,cAAe,CAAC,KAGlBD,GAAW,CACThsB,KAAM,wBACNiY,SAAU,YACVpM,OAAQ,CAAC,CAAE7L,KAAM,QAASgE,KAAM,QAChCioB,cAAe,CAAC,KAGlBD,GAAW,CACThsB,KAAM,cACNiY,SAAU,YACVpM,OAAQ,CAAC,CAAE7L,KAAM,iBAAkBgE,KAAM,QACzCioB,cAAe,CAAC,MAGlBD,GAAW,CACThsB,KAAM,aACN6L,OAAQsgB,GACRF,cAAe,CAAC,MAChBhU,SAAU,YAGZ+T,GAAW,CACThsB,KAAM,eACN6L,OAAQsgB,GACRF,cAAe,CAAC,IAChBhU,SAAU,YAGZ+T,GAAW,CACThsB,KAAM,eACN6L,OAAQsgB,GACRF,cAAe,CAAC,MAChBhU,SAAU,YAGZ+T,GAAW,CACThsB,KAAM,iBACN6L,OAAQsgB,GACRF,cAAe,CAAC,MAChBhU,SAAU,YAGZ+T,GAAW,CACThsB,KAAM,YACN6L,OAAQsgB,GACRF,cAAe,CAAC,MAChBhU,SAAU,YAGZ+T,GAAW,CACThsB,KAAM,QACN6L,OAAQsgB,GACRF,cAAe,CAAC,KAAM,MACtBhU,SAAU,YAGZ+T,GAAW,CACThsB,KAAM,YACNksB,UAAW,MACXjU,SAAU,UACVpM,OAAQsgB,GACRF,cAAe,CAAC,MAGlBD,GAAW,CACThsB,KAAM,gBACNksB,UAAW,MACXjU,SAAU,UACVpM,OAAQsgB,GACRF,cAAe,CAAC,MAGlBD,GAAW,CACThsB,KAAM,gBACNiY,SAAU,YAGZ+T,GAAW,CACThsB,KAAM,qBACNiY,SAAU,UACVpM,OAAQ,CACN,CAAE7L,KAAM,IAAKgE,KAAM,OACnB,CAAEhE,KAAM,cAAegE,KAAM,UAAWrV,QAAS,CAAC,OAAQ,WAE5Ds9B,cAAe,CAAC,GAAI,WAGtBD,GAAW,CACThsB,KAAM,yBACNiY,SAAU,UACVpM,OAAQ,CAAC,CAAE7L,KAAM,OAAQgE,KAAM,MAAOqT,UAAU,IAChD4U,cAAe,CAAC,KAGlBD,GAAW,CACThsB,KAAM,YACNksB,UAAW,MACXjU,SAAU,YAGZ+T,GAAW,CACThsB,KAAM,YACNksB,UAAW,MACXjU,SAAU,YAGZ+T,GAAW,CACThsB,KAAM,6BACNiY,SAAU,UACVpM,OAAQ,CAAC,CAAE7L,KAAM,OAAQgE,KAAM,MAAOqT,UAAU,IAChD4U,cAAe,CAAC,KAGlBD,GAAW,CACThsB,KAAM,QACNiY,SAAU,QACVpM,OAAQ,CAAC,CAAE7L,KAAM,QAASgE,KAAM,WAChCioB,cAAe,CAAC,WAGlBD,GAAW,CACThsB,KAAM,WACNiY,SAAU,QACVpM,OAAQ,CACN,CAAE7L,KAAM,SAAUgE,KAAM,UACxB,CAAEhE,KAAM,UAAWgE,KAAM,WAE3BioB,cAAe,CAAC,GAAI,SAGtBD,GAAW,CACThsB,KAAM,gBACNiY,SAAU,UACVpM,OAAQ,CACN,CACE7L,KAAM,WACNgE,KAAM,SACNrV,QAAS,CAAC,MAAO,UAAW,MAAO,SAGvCs9B,cAAe,CAAC,SAGlBD,GAAW,CACThsB,KAAM,aACNiY,SAAU,UACVpM,OAAQ,GACRogB,cAAe,KAGjBD,GAAW,CACThsB,KAAM,cACNiY,SAAU,UACVpM,OAAQ,CACN,CACE7L,KAAM,OACNgE,KAAM,MACNrV,QAAS,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,KAE9C,CACEqR,KAAM,WACNgE,KAAM,SACNrV,QAAS,CAAC,MAAO,MAAO,eAG5Bs9B,cAAe,CAAC,EAAG,SAGrBD,GAAW,CACThsB,KAAM,cACNiY,SAAU,QACVpM,OAAQ,CACN,CACE7L,KAAM,OACNgE,KAAM,MACNrV,QAAS,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAC5C0oB,UAAU,IAGd4U,cAAe,CAAC,KAGlBD,GAAW,CACThsB,KAAM,SACNiY,SAAU,UACVpM,OAAQ,CACN,CACE7L,KAAM,QACNgE,KAAM,MACNrV,QAAS,EAAE,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,KAEtE,CACEqR,KAAM,OACNgE,KAAM,MACNrV,QAAS,EAAE,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,MAGxEs9B,cAAe,CAAC,EAAG,KAGrBD,GAAW,CACThsB,KAAM,aACNiY,SAAU,UACVpM,OAAQ,CACN,CACE7L,KAAM,UACNgE,KAAM,UACNrV,QAAS,CAAC,OAAQ,SAClByoB,UAAU,IAGd6U,cAAe,CAAC,WAGlBD,GAAW,CACThsB,KAAM,eACNiY,SAAU,YAGZ+T,GAAW,CACThsB,KAAM,eACNiY,SAAU,YAGZ+T,GAAW,CACThsB,KAAM,cACNiY,SAAU,YAGZ+T,GAAW,CACThsB,KAAM,gBACNiY,SAAU,UAGZ+T,GAAW,CACThsB,KAAM,aACNkT,MAAM,EACN+E,SAAU,UACVpM,OAAQ,CAAC,CAAE7L,KAAM,OAAQgE,KAAM,WAC/BioB,cAAe,CAAC,gBAGlBD,GAAW,CACThsB,KAAM,cACNiY,SAAU,YAGZ+T,GAAW,CACThsB,KAAM,eACNiY,SAAU,UACVpM,OAAQ,CAAC,CAAE7L,KAAM,QAASgE,KAAM,QAChCioB,cAAe,CAAC,MAGlBD,GAAW,CACThsB,KAAM,aACNiY,SAAU,YAGZ+T,GAAW,CACThsB,KAAM,gBACNiY,SAAU,YACVpM,OAAQ,CAAC,CAAE7L,KAAM,IAAKgE,KAAM,QAC5BioB,cAAe,CAAC,OAGlBD,GAAW,CACThsB,KAAM,UACNiY,SAAU,UACVpM,OAAQ,GACRogB,cAAe,KAGjBD,GAAW,CACThsB,KAAM,QACNiY,SAAU,YACVpM,OAAQ,CAAC,CAAE7L,KAAM,SAAUgE,KAAM,QACjCioB,cAAe,CAAC,KAGlBD,GAAW,CACThsB,KAAM,SACNiY,SAAU,YACVpM,OAAQ,CAAC,CAAE7L,KAAM,SAAUgE,KAAM,QACjCioB,cAAe,CAAC,MAGlBD,GAAW,CACThsB,KAAM,gBACNiY,SAAU,YACVpM,OAAQ,CAAC,CAAE7L,KAAM,SAAUgE,KAAM,QACjCioB,cAAe,CAAC,KAGlBD,GAAW,CACThsB,KAAM,WACNiY,SAAU,cAGZ+T,GAAW,CACThsB,KAAM,aACNiY,SAAU,cAGZ+T,GAAW,CACThsB,KAAM,wBACNiY,SAAU,YACVpM,OAAQ,CAAC,CAAE7L,KAAM,iBAAkBgE,KAAM,MAAOoT,UAAU,IAC1D6U,cAAe,CAAC,MAGlBD,GAAW,CACThsB,KAAM,YACNiY,SAAU,YACVpM,OAAQ,CACN,CACE7L,KAAM,SACNgE,KAAM,SACNrV,QAAS,CAAC,KAAM,KAAM,MAAO,KAAM,KAAM,KAAM,MAAO,SAG1Ds9B,cAAe,CAAC,QAGlBD,GAAW,CACThsB,KAAM,YACNiY,SAAU,YACVpM,OAAQ,CACN,CACE7L,KAAM,gBACNgE,KAAM,SACNrV,QAAS,CAAC,KAAM,KAAM,MAAO,KAAM,KAAM,KAAM,MAAO,QAExD,CAAEqR,KAAM,iBAAkBgE,KAAM,OAChC,CAAEhE,KAAM,eAAgBgE,KAAM,QAEhCioB,cAAe,CAAC,KAAM,EAAG,KAG3BD,GAAW,CACThsB,KAAM,YACNiY,SAAU,YACVpM,OAAQ,CACN,CAAE7L,KAAM,WAAYgE,KAAM,UAC1B,CACEhE,KAAM,OACNgE,KAAM,SACNrV,QAAS,CAAC,MAAO,MAAO,MAAO,MAAO,SAExC,CACEqR,KAAM,cACNgE,KAAM,UACNoT,UAAU,EACVzoB,QAAS,CAAC,QAAS,UAGvBs9B,cAAe,CAAC,KAAM,MAAO,WAG/BD,GAAW,CACThsB,KAAM,iBACNiY,SAAU,YACVpM,OAAQ,CACN,CAAE7L,KAAM,WAAYgE,KAAM,UAC1B,CACEhE,KAAM,OACNgE,KAAM,SACNrV,QAAS,CAAC,MAAO,MAAO,MAAO,MAAO,UAG1Cs9B,cAAe,CAAC,KAAM,SAGxBD,GAAW,CACThsB,KAAM,WACNiY,SAAU,cAGZ+T,GAAW,CACThsB,KAAM,WACNiY,SAAU,YACVpM,OAAQ,CAAC,CAAE7L,KAAM,WAAYgE,KAAM,WACnCioB,cAAe,CAAC,SAGlBD,GAAW,CACThsB,KAAM,MACNiY,SAAU,YACVpM,OAAQ,CAAC,CAAE7L,KAAM,OAAQgE,KAAM,QAC/BioB,cAAe,CAAC,QAGlBD,GAAW,CACThsB,KAAM,eACNiY,SAAU,gBACVpM,OAAQ,CAAC,CAAE7L,KAAM,IAAKgE,KAAM,QAC5BioB,cAAe,CAAC,MAGlBD,GAAW,CACThsB,KAAM,eACNiY,SAAU,gBACVpM,OAAQ,CAAC,CAAE7L,KAAM,IAAKgE,KAAM,QAC5BioB,cAAe,CAAC,MAGlBD,GAAW,CACThsB,KAAM,eACNiY,SAAU,gBACVpM,OAAQ,CAAC,CAAE7L,KAAM,IAAKgE,KAAM,QAC5BioB,cAAe,CAAC,MAGlBD,GAAW,CACThsB,KAAM,eACNiY,SAAU,gBACVpM,OAAQ,CAAC,CAAE7L,KAAM,IAAKgE,KAAM,QAC5BioB,cAAe,CAAC,MAGlBD,GAAW,CACThsB,KAAM,eACNiY,SAAU,gBACVpM,OAAQ,CAAC,CAAE7L,KAAM,QAASgE,KAAM,QAChCioB,cAAe,CAAC,KAGlBD,GAAW,CACThsB,KAAM,eACNiY,SAAU,gBACVpM,OAAQ,CAAC,CAAE7L,KAAM,QAASgE,KAAM,QAChCioB,cAAe,CAAC,KAGlBD,GAAW,CACThsB,KAAM,eACNiY,SAAU,gBACVpM,OAAQ,CAAC,CAAE7L,KAAM,QAASgE,KAAM,QAChCioB,cAAe,CAAC,KAGlBD,GAAW,CACThsB,KAAM,eACNiY,SAAU,gBACVpM,OAAQ,CAAC,CAAE7L,KAAM,QAASgE,KAAM,QAChCioB,cAAe,CAAC,KAGlBD,GAAW,CACThsB,KAAM,QACNiY,SAAU,gBACVpM,OAAQ,CAAC,CAAE7L,KAAM,IAAKgE,KAAM,QAC5BioB,cAAe,CAAC,KAGlBD,GAAW,CACThsB,KAAM,cACNiY,SAAU,gBACVpM,OAAQ,CAAC,CAAE7L,KAAM,IAAKgE,KAAM,QAC5BioB,cAAe,CAAC,MAGlBD,GAAW,CACThsB,KAAM,UACNiY,SAAU,gBACVpM,OAAQ,CAAC,CAAE7L,KAAM,UAAWgE,KAAM,WAClCioB,cAAe,CAAC,aAGlBD,GAAW,CACThsB,KAAM,iBACNiY,SAAU,gBACVpM,OAAQ,CAAC,CAAE7L,KAAM,QAASgE,KAAM,QAChCioB,cAAe,CAAC,KAGlBD,GAAW,CACThsB,KAAM,aACNiY,SAAU,gBACVpM,OAAQ,CAAC,CAAE7L,KAAM,QAASgE,KAAM,QAChCioB,cAAe,CAAC,KAGlBD,GAAW,CACThsB,KAAM,gBACNiY,SAAU,gBACVpM,OAAQ,CAAC,CAAE7L,KAAM,QAASgE,KAAM,QAChCioB,cAAe,CAAC,KAGlBD,GAAW,CACThsB,KAAM,gBACNiY,SAAU,YACVpM,OAAQ,CACN,CACE7L,KAAM,aACNgE,KAAM,kBACNrV,QAAS,CAAC,IAAK,IAAK,KAAM,OAAQ,QAAS,QAAS,WAGxDs9B,cAAe,CAAC,MAGlBD,GAAW,CACThsB,KAAM,eACNiY,SAAU,YACVpM,OAAQ,CACN,CACE7L,KAAM,aACNgE,KAAM,kBACNrV,QAAS,CAAC,IAAK,IAAK,KAAM,OAAQ,QAAS,QAAS,WAGxDs9B,cAAe,CAAC,OAGlBD,GAAW,CACThsB,KAAM,QACNiY,SAAU,YACVpM,OAAQ,CACN,CAAE7L,KAAM,IAAKgE,KAAM,OACnB,CAAEhE,KAAM,YAAagE,KAAM,QAE7BioB,cAAe,CAAC,EAAG,MAGrBD,GAAW,CACThsB,KAAM,iBACNiY,SAAU,gBACVpM,OAAQ,CAAC,CAAE7L,KAAM,QAASgE,KAAM,QAChCioB,cAAe,CAAC,KAGlBD,GAAW,CACThsB,KAAM,gBACNiY,SAAU,gBACVpM,OAAQ,CAAC,CAAE7L,KAAM,QAASgE,KAAM,QAChCioB,cAAe,CAAC,KAGlBD,GAAW,CACThsB,KAAM,wBACNiY,SAAU,cACVpM,OAAQ,CAAC,CAAE7L,KAAM,IAAKgE,KAAM,QAC5BioB,cAAe,CAAC,KAGlBD,GAAW,CACThsB,KAAM,mBACNiY,SAAU,cACVpM,OAAQ,CAAC,CAAE7L,KAAM,IAAKgE,KAAM,QAC5BioB,cAAe,CAAC,KAGlBD,GAAW,CACThsB,KAAM,wBACNiY,SAAU,cACVpM,OAAQ,CAAC,CAAE7L,KAAM,IAAKgE,KAAM,QAC5BioB,cAAe,CAAC,KAGlBD,GAAW,CACThsB,KAAM,mBACNiY,SAAU,cACVpM,OAAQ,CAAC,CAAE7L,KAAM,IAAKgE,KAAM,QAC5BioB,cAAe,CAAC,KAGlBD,GAAW,CACThsB,KAAM,iBACNiY,SAAU,gBACVpM,OAAQ,CACN,CAAE7L,KAAM,QAASgE,KAAM,OACvB,CAAEhE,KAAM,SAAUgE,KAAM,UACxB,CAAEhE,KAAM,UAAWgE,KAAM,WAE3BioB,cAAe,CAAC,EAAG,SAAU,aAO/BD,GAAW,CACThsB,KAAM,gBACNiY,SAAU,YACVpM,OAAQ,CACN,CACE7L,KAAM,OACNgE,KAAM,SACNrV,QAAS,CAAC,MAAO,MAAO,MAAO,MAAO,UAG1Cs9B,cAAe,CAAC,OAChBx9B,QAAS,UAGXu9B,GAAW,CACThsB,KAAM,2BACNiY,SAAU,gBACVpM,OAAQ,CAAC,CAAE7L,KAAM,IAAKgE,KAAM,QAC5BioB,cAAe,CAAC,IAChBx9B,QAAS,UAGXu9B,GAAW,CACThsB,KAAM,QACNiY,SAAU,YACVpM,OAAQ,CAAC,CAAE7L,KAAM,QAASgE,KAAM,QAChCioB,cAAe,CAAC,GAChBx9B,QAAS,UAGXu9B,GAAW,CACThsB,KAAM,2BACNiY,SAAU,YACVpM,OAAQ,CACN,CACE7L,KAAM,aACNgE,KAAM,kBACNrV,QAAS,CAAC,IAAK,IAAK,KAAM,OAAQ,QAAS,QAAS,WAGxDs9B,cAAe,CAAC,IAChBx9B,QAAS,UAGXu9B,GAAW,CACThsB,KAAM,iBACNiY,SAAU,UACVpM,OAAQ,CAAC,CAAE7L,KAAM,WAAYgE,KAAM,WACnCioB,cAAe,CAAC,mBAChBx9B,QAAS,UAGXu9B,GAAW,CACThsB,KAAM,OACNiY,SAAU,gBACVpM,OAAQ,CAAC,CAAE7L,KAAM,OAAQgE,KAAM,WAC/BioB,cAAe,CAAC,QAChBx9B,QAAS,UAGXu9B,GAAW,CACThsB,KAAM,eACNiY,SAAU,UACVpM,OAAQ,CACN,CACE7L,KAAM,WACNgE,KAAM,SACNrV,QAAS,CAAC,MAAO,MAAO,cAE1B,CACEqR,KAAM,OACNgE,KAAM,MACNrV,QAAS,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAC5C0oB,UAAU,IAGd4U,cAAe,CAAC,MAAO,GACvBx9B,QAAS,UAGXu9B,GAAW,CACThsB,KAAM,qBACNiY,SAAU,YACVpM,OAAQ,CACN,CACE7L,KAAM,eACNgE,KAAM,SACNrV,QAAS,CAAC,KAAM,KAAM,MAAO,KAAM,KAAM,KAAM,MAAO,SAG1Ds9B,cAAe,CAAC,MAChBx9B,QAAS,UAGXu9B,GAAW,CACThsB,KAAM,cACNiY,SAAU,YACVpM,OAAQ,CAAC,CAAE7L,KAAM,QAASgE,KAAM,MAAOoT,UAAU,IACjD6U,cAAe,GACfx9B,QAAS,UAGXu9B,GAAW,CACThsB,KAAM,SACNiY,SAAU,YACVxpB,QAAS,UAGXu9B,GAAW,CACThsB,KAAM,YACNiY,SAAU,UACVxpB,QAAS,UAGXu9B,GAAW,CACThsB,KAAM,mBACNiY,SAAU,YACVpM,OAAQ,CACN,CACE7L,KAAM,gBACNgE,KAAM,SACNrV,QAAS,CAAC,MAAO,MAAO,OAAQ,MAAO,MAAO,MAAO,OAAQ,QAC7DyoB,UAAU,GAEZ,CACEpX,KAAM,cACNgE,KAAM,SACNrV,QAAS,CAAC,MAAO,MAAO,OAAQ,MAAO,MAAO,MAAO,OAAQ,QAC7DyoB,UAAU,IAGd6U,cAAe,GACfx9B,QAAS,UAGXu9B,GAAW,CACThsB,KAAM,YACNksB,UAAW,MACXrgB,OAAQ,CAAC,CAAE7L,KAAM,OAAQgE,KAAM,QAC/BioB,cAAe,CAAC,GAChBhU,SAAU,UACVxpB,QAAS,UAGXu9B,GAAW,CACThsB,KAAM,YACNiY,SAAU,YACVpM,OAAQ,CACN,CACE7L,KAAM,aACNgE,KAAM,kBACNrV,QAAS,CAAC,IAAK,IAAK,KAAM,OAAQ,QAAS,QAAS,WAGxDs9B,cAAe,CAAC,IAChBx9B,QAAS,UAGXu9B,GAAW,CACThsB,KAAM,YACNiY,SAAU,YACVpM,OAAQ,CACN,CACE7L,KAAM,aACNgE,KAAM,kBACNrV,QAAS,CAAC,IAAK,IAAK,KAAM,OAAQ,QAAS,QAAS,WAGxDs9B,cAAe,CAAC,IAChBx9B,QAAS,UAGXu9B,GAAW,CACThsB,KAAM,YACNiY,SAAU,YACVpM,OAAQ,CACN,CACE7L,KAAM,aACNgE,KAAM,kBACNrV,QAAS,CAAC,IAAK,IAAK,KAAM,OAAQ,QAAS,QAAS,WAGxDs9B,cAAe,CAAC,IAChBx9B,QAAS,UAGXu9B,GAAW,CACThsB,KAAM,8BACNiY,SAAU,UACVpM,OAAQ,CACN,CACE7L,KAAM,WACNgE,KAAM,MACNrV,QAAS,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IAC5C0oB,UAAU,IAGd4U,cAAe,CAAC,GAChBx9B,QAAS,UAGXu9B,GAAW,CACThsB,KAAM,eACNiY,SAAU,YACVxpB,QAAS,UAGXu9B,GAAW,CACThsB,KAAM,MACNiY,SAAU,YACVpM,OAAQ,CAAC,CAAE7L,KAAM,SAAUgE,KAAM,QACjCioB,cAAe,CAAC,IAChBx9B,QAAS,UAGXu9B,GAAW,CACThsB,KAAM,YACNiY,SAAU,YACVpM,OAAQsgB,GACRF,cAAe,CAAC,IAChBx9B,QAAS,UAGXu9B,GAAW,CACThsB,KAAM,eACNksB,UAAW,SACXrgB,OAAQ,CACN,CACE7L,KAAM,WACNgE,KAAM,SACNrV,QAAS,CAAC,YAAa,aAAc,iBAEvC,CACEqR,KAAM,aACNgE,KAAM,MACNrV,QAAS,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,KAEtD,CAAEqR,KAAM,iBAAkBgE,KAAM,SAAUqT,UAAU,IAEtD4U,cAAe,CAAC,YAAa,EAAG,cAChChU,SAAU,UACVxpB,QAAS,UAGXu9B,GAAW,CACThsB,KAAM,0BACNiY,SAAU,gBACVpM,OAAQ,CAAC,CAAE7L,KAAM,IAAKgE,KAAM,QAC5BioB,cAAe,CAAC,IAChBx9B,QAAS,UAGXu9B,GAAW,CACThsB,KAAM,oBACNiY,SAAU,gBACVxpB,QAAS,UAGXu9B,GAAW,CACThsB,KAAM,aACNiY,SAAU,YACVxpB,QAAS,UAGXu9B,GAAW,CACThsB,KAAM,YACNiY,SAAU,YACVpM,OAAQ,CACN,CACE7L,KAAM,eACNgE,KAAM,SACNrV,QAAS,CAAC,MAAO,MAAO,OAAQ,MAAO,MAAO,MAAO,OAAQ,SAE/D,CACEqR,KAAM,aACNgE,KAAM,SACNrV,QAAS,CAAC,MAAO,MAAO,OAAQ,MAAO,MAAO,MAAO,OAAQ,QAC7DyoB,UAAU,IAGd6U,cAAe,CAAC,OAChBx9B,QAAS,UAGXu9B,GAAW,CACThsB,KAAM,kBACNiY,SAAU,UACVpM,OAAQ,CACN,CAAE7L,KAAM,QAASgE,KAAM,kBAAmBoT,UAAU,GACpD,CACEpX,KAAM,OACNgE,KAAM,MACNrV,QAAS,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,MAGhDs9B,cAAe,CAAC,KAAM,GACtBx9B,QAAS,UAGXu9B,GAAW,CACThsB,KAAM,cACNiY,SAAU,UACVpM,OAAQ,CAAC,CAAE7L,KAAM,gBAAiBgE,KAAM,SAAUqT,UAAU,IAC5D5oB,QAAS,UAGXu9B,GAAW,CACThsB,KAAM,cACNiY,SAAU,UACVpM,OAAQ,CACN,CACE7L,KAAM,WACNgE,KAAM,SACNrV,QAAS,CAAC,MAAO,MAAO,cAE1B,CAAEqR,KAAM,MAAOgE,KAAM,SAAUqT,UAAU,IAE3C4U,cAAe,CAAC,MAAO,OACvBx9B,QAAS,UAGXu9B,GAAW,CACThsB,KAAM,cACNiY,SAAU,QACVpM,OAAQ,CAAC,CAAE7L,KAAM,MAAOgE,KAAM,SAAUqT,UAAU,IAClD4U,cAAe,CAAC,OAChBx9B,QAAS,UAYJ,MAAM69B,GA4BXtc,MAAAA,CAAOuc,EAAmBC,GACxB,MAAMtjB,EAAMra,KAAKmgB,IAAIhP,KAAO,IAEtBysB,GAAa19B,EAAAA,EAAAA,KAAIF,KAAKgd,QAAQ,CAAC1c,EAAO0B,KAC1C,IAAI67B,EAEA77B,EAAQhC,KAAKmgB,IAAInD,OAAO/a,OAC1B47B,EAAY79B,KAAKmgB,IAAInD,OAAOhb,GAAOmT,MAC1B/U,EAAAA,EAAAA,MAAIugB,EAAAA,EAAAA,MAAK3gB,KAAKmgB,IAAInD,QAAS,cACpC6gB,GAAYz9B,EAAAA,EAAAA,MAAIugB,EAAAA,EAAAA,MAAK3gB,KAAKmgB,IAAInD,QAAS,SAUzC,IAAI/G,EAAAA,EAAAA,UANsB,CAAC,kBAAmB,UAAW,MAAO,QAAS,OAAQ,mBAMjD4nB,KAAc5nB,EAAAA,EAAAA,UAFjB,CAAC,aAE+CjW,KAAKmgB,IAAIhP,MACpF,OAAO7Q,EAGT,MAAMw9B,GAAoBC,EAAAA,EAAAA,UAASz9B,GAASq9B,EAAiBr9B,GAASA,EAItE,OAAI2V,EAAAA,EAAAA,UAAS,CAAC,kBAAmB,eAAgB4nB,KAAcriB,EAAAA,EAAAA,WAAUsiB,IAChE/zB,EAAAA,EAAAA,UAASzJ,GAGX,IAAMA,EAAQ,GAAG,IAI1B,KAA6C,KAAtCs9B,EAAWA,EAAW37B,OAAS,IACpC27B,EAAWzxB,MAOb,OAJIuxB,GACFE,EAAWvN,QAAQqN,GAGdrjB,EAAMujB,EAAW5yB,KAAK,MAAQ,GACvC,CAEAgzB,0BAAAA,CAA2BC,EAAkBj8B,GAC3C,OAA+B,IAA3Bi8B,EAASnd,QAAQ,UAIjB9gB,KAAKmgB,IAAInD,OAAOhb,EAAQ,KAAMhC,KAAKmgB,IAAInD,OAAOhb,EAAQ,GAAGumB,cAIzDvmB,EAAQ,GAAKhC,KAAKmgB,IAAInD,OAAO/a,SAAU7B,EAAAA,EAAAA,MAAIugB,EAAAA,EAAAA,MAAK3gB,KAAKmgB,IAAInD,QAAS,aAKxE,CAEAsJ,WAAAA,CAAY2X,EAAkBj8B,GAGxBhC,KAAKg+B,2BAA2BC,EAAUj8B,IAC5Cie,EAAAA,EAAAA,MAAKge,EAAS70B,MAAM,MAAM,CAAC80B,EAASve,KAClC3f,KAAKsmB,YAAY4X,EAAQh1B,OAAQlH,EAAQ2d,EAAI,KAKhC,KAAbse,IAAoBj8B,GAAShC,KAAKmgB,IAAInD,OAAO/a,QAAUjC,KAAKmgB,IAAInD,OAAOhb,GAAOumB,UAChFvoB,KAAKgd,OAAOJ,OAAO5a,EAAO,GAE1BhC,KAAKgd,OAAOhb,GAASi8B,EAGvBj+B,KAAKkgB,aACP,CAEAA,UAAAA,GACE,GAA2B,IAAvBlgB,KAAKgd,OAAO/a,OAEd,YADAjC,KAAKyd,KAAOzd,KAAKmgB,IAAIhP,KAAO,MAI9B,IAAIsM,EAAOzd,KAAKmgB,IAAIhP,KAAO,IAC3BsM,GAAQzd,KAAKgd,OAAOhS,KAAK,MACzByS,GAAQ,IACRzd,KAAKyd,KAAOA,CACd,CAtGA,WAAA1d,CAAYopB,EAAkBrpB,GAhB9BqgB,GAAAA,KAAAA,WAAAA,GACAnD,GAAAA,KAAAA,cAAAA,GACAS,GAAAA,KAAAA,OAAO,IAYP2C,GAAAA,KAAAA,cAAAA,GAGEpgB,KAAKmgB,IAAMgJ,EACXnpB,KAAKgd,OAAS,GAEVld,GAAWA,EAAQyf,mBAAqB4J,EAAQiU,gBAClDp9B,KAAKgd,OAASmM,EAAQiU,cAAcnxB,MAAM,IAG5CjM,KAAKkgB,YACP,EA2GF,SAASie,GAAWhtB,EAAcwO,GAChC,OAAMA,GAAO3d,IAAOmP,IAGZwO,GAAO3d,IAAOmP,GAFb,CAAEA,KAAMA,EAAM6L,OAAQ,CAAC,CAAE7L,KAAM,GAAIgE,KAAM,GAAIqT,UAAU,IAAS4U,cAAe,CAAC,IAAK9Q,SAAS,EAGzG,CAoHA,UACEhN,mBArIF,SACE6J,EACArpB,EACA6f,GAKA,OAHIoe,EAAAA,EAAAA,UAAS5U,KACXA,EAAUgV,GAAWhV,EAASxJ,IAEzB,IAAI8d,GAAatU,EAASrpB,EACnC,EA6HEq+B,WAAYA,GACZC,YArHF,SAAqBjC,EAAyBxc,GAC5C,MAAM0e,EAAkB,CAAC,EAUzB,OATA71B,EAAAA,EAAAA,SAAQmX,GAAO3d,IAAQmnB,IACjBoU,GAAyBpU,EAASgT,KACpCkC,EAAMlV,EAAQhY,OAAQ8G,EAAAA,EAAAA,QAAO,CAAC,EAAGkR,EAAS,CACxCnM,QAAQzT,EAAAA,EAAAA,QAAO4f,EAAQnM,QAASG,GACvBogB,GAAyBpgB,EAAOgf,OAG7C,IAEKkC,CACT,EA0GEC,cAvGF,SAAuBC,GACrB,MAAM1Y,EAAqB,CAAC,EA+F5B,OA7FArd,EAAAA,EAAAA,SAAQ+1B,GAAW,CAAC,GAAG,CAACpV,EAASqV,KAE/B,GAAsB,UAAlBrV,EAAQsV,MACV,OAGF,IAAIhU,EAActB,EAAQsB,YACtBA,IAEFA,EAAcA,EACXthB,QAAQ,8BAA+B,UACvCA,QAAQ,iBAAkB,cAC1BA,QAAQ,2BAA4B,oBAGzC,MAAMgW,EAAgB,CACpBhO,KAAMgY,EAAQhY,KACdsZ,cACArB,SAAUD,EAAQsV,MAClBzhB,OAAQ,GACRogB,cAAe,GACf/Y,MAAM,GAIJ,iBAAiB/e,MAAKlF,EAAAA,EAAAA,KAAI+oB,EAAS,iBAAkB,KAGnDA,EAAQnM,OAAO,GAAGwL,SACpBW,EAAQnM,OAAO,GAAG0hB,UAAW,EAG7BvV,EAAQnM,OAAO2hB,QAIjBxf,EAAKkF,MAAO,GAGd7b,EAAAA,EAAAA,SAAQ2gB,EAAQnM,QAAS4hB,IACvB,MAAMzhB,EAAkB,CACtBhM,KAAMytB,EAASztB,KACfgE,KAAM,SACNoT,UAAWqW,EAASF,SACpBlW,WAAYoW,EAASpW,SACrB1oB,aAASS,QAGcA,IAArBq+B,EAASpU,QACPoU,EAASpU,UAAYqU,IACvB1f,EAAKie,cAAcntB,KAAK,OAExBkP,EAAKie,cAAcntB,MAAKlG,EAAAA,EAAAA,UAAS60B,EAASpU,UAEnCoU,EAASE,YAClB3f,EAAKie,cAAcntB,MAAKlG,EAAAA,EAAAA,UAAS60B,EAASE,YAAY,KAEtD3f,EAAKie,cAAcntB,KAAK,IAGJ,YAAlB2uB,EAASzpB,MACXgI,EAAMhI,KAAO,UACbgI,EAAMrd,QAAU,CAAC,OAAQ,UACE,YAAlB8+B,EAASzpB,KAClBgI,EAAMhI,KAAO,MACc,UAAlBypB,EAASzpB,KAClBgI,EAAMhI,KAAO,QACc,SAAlBypB,EAASzpB,MAClBgI,EAAMhI,KAAO,OACbgI,EAAMrd,QAAU,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAAM,KAAM,OACpD,cAAlB8+B,EAASzpB,MAClBgI,EAAMhI,KAAO,cACbgI,EAAMrd,QAAU,CAAC,OAAQ,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAAM,KAAM,OAC5D,kBAAlB8+B,EAASzpB,KAClBgI,EAAMhI,KAAO,kBACc,eAAlBypB,EAASzpB,KAClBgI,EAAMhI,KAAO,kBACc,aAAlBypB,EAASzpB,OAClBgI,EAAMhI,KAAO,mBAGXypB,EAAS9+B,QACXqd,EAAMrd,SAAUI,EAAAA,EAAAA,KAAI0+B,EAAS9+B,QAASiK,EAAAA,UAC7B60B,EAASE,cAClB3hB,EAAMrd,SAAUI,EAAAA,EAAAA,KAAI0+B,EAASE,YAAa/0B,EAAAA,WAG5CoV,EAAKnC,OAAO/M,KAAKkN,EAAM,IAGzB0I,EAAS2Y,GAAYrf,CAAI,IAGpB0G,CACT,GCrsCakZ,GAAqBC,IAQhC,MAAMC,EAAkBD,EAAK5gB,QAAiC,iBAAhB4gB,EAAK5gB,OAAsB4gB,EAAK5gB,OA3BhD,CAAC4gB,GAEJ,iBAAhBA,EAAK5gB,QAAuB4gB,EAAK5gB,OACnC,CACLse,iBAAiB,EACjBte,OAAQ4gB,EAAK5gB,OACbC,YAAY,GAKT,CACLsK,UAAW,OACXzK,MAAO8gB,EAAK9gB,MAAQ,IAAI9U,MAAM,KAC9BszB,iBAAiB,GAaoEwC,CAAwBF,GAI/G,OAFAA,EAAK5gB,OAAS6gB,EAEPD,CAAI,E,4sCCoBb,MAAMG,GAA2B,CAC/B,IAAKC,EAAAA,sBAAsBC,MAC3B,KAAMD,EAAAA,sBAAsBE,SAC5B,KAAMF,EAAAA,sBAAsBG,WAC5B,MAAOH,EAAAA,sBAAsBI,eAcxB,MAAMC,WACHC,EAAAA,sBA4CRC,mBAAAA,GACE,MAAO,CACLC,eAAe,EACfC,cAAc,EACdC,MAAO,CACL,CACEriB,KAAM,OACNsiB,IAAK,qFAIb,CAEAC,2BAAAA,GACE,MAAO,CACLjE,KAAM,CACJ/C,SAAUh5B,KAAKigC,gBAGrB,CAEMC,uBAAAA,CAAwBpb,G,uBAC5B,OAAOA,EAAQ5kB,KAAK6kB,GAAU/kB,KAAKmgC,sBAAsBpb,IAC3D,c,CAEAob,qBAAAA,CAAsBpb,GACpB,MAAMqb,EAAoC,IAAIC,EAC5CrgC,KACA,SACK+kB,GAAAA,CACH3G,OAAQ2G,EAAM3G,QAAU,GACxBC,YAAY,IAEdre,KAAKohB,aAEPgf,EAAcpiB,cAEd,IAAIsiB,EAAiC,GACrC,MAAM1J,EAAS52B,KAAKggC,8BAA8BjE,KAElD,GAAIqE,EAAcjiB,gBAChBiiB,EAAcliB,KAAK1V,SAASka,IAC1B4d,EAAOrwB,KAAK,CACVkB,KAAMuR,EAAIriB,IACV4G,SAAUk4B,GAAyBzc,EAAIzb,UACvC3G,MAAOoiB,EAAIpiB,OACX,QAEC,CACL,MAAMigC,EAAcH,EAActjB,SAAS5c,KAAK6c,GAAYA,EAAQzc,QACpE,IAAI04B,EAAWpC,EAAOoC,SAASzvB,QAAQ+vB,GAAYA,EAAQO,SAAS53B,QAAUs+B,EAAYt+B,SAE1F,IAAK,IAAIq3B,KAAWN,EAAU,CACXM,EAAQO,SAAStc,SAEzB3R,OAAM,CAACquB,EAAoCj4B,KAClD,GAAIi4B,EAAQD,UAAW,CACrB,IAAI15B,EAASigC,EAAYv+B,GAEzB,GAAc,MAAV1B,EACF,OAAO,EAGT,MAAMkgC,GApHU/iB,EAoHqBnd,GAnHtC2V,SAAS,MAAQwH,EAAKxH,SAAS,KAC/B,IAAMwH,EAAKtU,QAAQ,MAAO,MAAMA,QAAQ,MAAO,KAAKA,QAAQ,KAAM,KAAKA,QAAQ,KAAM,KAErFsU,EAsHC,OALA6iB,EAAOrwB,KAAK,CACVkB,KAAM8oB,EAAQD,UACd/yB,SAAUu5B,IAAclgC,EAAQ8+B,EAAAA,sBAAsBG,WAAaH,EAAAA,sBAAsBC,MACzF/+B,MAAOkgC,KAEF,CACT,CA3HV,IAA4B/iB,EA4HlB,OAAO8iB,EAAYv+B,KAAWi4B,EAAQ35B,OAA2B,MAAlB25B,EAAQ35B,KAAa,GAExE,CACF,CAEA,MAAO,CACLmhB,MAAOsD,EAAMtD,MACbgf,cAAeH,EAEnB,CAEAI,WAAAA,CAAY7F,GACV,SAAKA,EAAKzc,SAAWyc,EAAK6B,gBAK5B,CAIAiE,sBAAAA,CAAuBviB,EAAuBiD,G,IAGTjD,EACIA,EAHvC,OAAO,SACFA,GAAAA,CACHA,OAAQpe,KAAKohB,YAAYjY,QAAqB,QAAbiV,EAAAA,EAAOA,cAAPA,IAAAA,EAAAA,EAAiB,GAAIiD,GACtDiB,WAAYtiB,KAAKohB,YAAYjY,QAAyB,QAAjBiV,EAAAA,EAAOkE,kBAAPlE,IAAAA,EAAAA,EAAqB,GAAIiD,IAElE,CAEAuf,aAAAA,CACE9gC,EACA+gC,EACAC,GAGA,MAAMC,EAAe,CACnBxyB,KAAMvO,KAAKghC,cAAclhC,EAAQD,MAAM0O,MAAM,EAAOzO,EAAQmhC,UAC5DC,MAAOlhC,KAAKghC,cAAclhC,EAAQD,MAAMgP,IAAI,EAAM/O,EAAQmhC,UAC1D1f,QAASzhB,EAAQyhB,QACjBvX,OAAQ,OACR61B,aAAc//B,EAAQ+/B,cAAgB7/B,KAAK6/B,aAC3CD,cAAe9/B,EAAQ8/B,eAGnB5iB,EAAShd,KAAKmhC,oBAAoBJ,EAAcF,EAAmB/gC,EAAQuhB,YACjF,GAAsB,IAAlBrE,EAAO/a,OACT,OAAOm/B,EAAAA,GAAAA,IAAG,CAAE/K,KAAM,KAGhBr2B,KAAKqhC,cACPrkB,EAAO/M,KAAK,aAGd,MAAMqxB,EAAiC,CACrCC,OAAQ,OACRxB,IAAK,UACL1J,KAAMrZ,EAAOhS,KAAK,KAClBw2B,QAAS,CACP,eAAgB,sCAUpB,OANAxhC,KAAKyhC,kBAAkBH,EAAaxhC,GAEhCA,EAAQ4hC,UACVJ,EAAYpR,UAAYlwB,KAAKmR,KAAO,YAAcrR,EAAQ4hC,SAGrD1hC,KAAK2hC,kBAAkBL,GAAaM,MACzC1hC,EAAAA,GAAAA,MAAKoL,GAAWtL,KAAK6hC,4BAA4Bv2B,EAAQw1B,KAE7D,CAEAgB,2BAAAA,CACEhiC,EACA+gC,GAEA,MAAMkB,EAA2C,CAAC,EAC5CC,EAAgC,GACtC,IAAI5jB,EAAuB6jB,EAAar4B,EAExC,IAAKA,EAAI,EAAGA,EAAI9J,EAAQyhB,QAAQtf,OAAQ2H,IACtCwU,EAASte,EAAQyhB,QAAQ3X,GACpBwU,EAAOA,SAIPA,EAAOqD,QACVrD,EAAOqD,MAAQzhB,KAAKkiC,kBAAkBt4B,IAGxCm4B,EAAiB3jB,EAAOqD,OAASrD,EAAOA,QAG1C,MAAM+jB,EAAuB,aAE7B,SAASC,EAA0B3gC,EAAe4gB,GAEhD,OAAIjE,EAAOqD,QAAUY,EACZ0f,EAAiB1f,IAAO5gB,EAI1Bo/B,EAAkBxe,GAAIlZ,QAAQg5B,EAAsBC,IAA8B3gC,CAC3F,CAEA,IAAKmI,EAAI,EAAGA,EAAI9J,EAAQyhB,QAAQtf,OAAQ2H,IAAK,CAC3C,MAAMy4B,EAAc,MAAKviC,EAAQyhB,QAAQ3X,IACzCwU,EAASte,EAAQyhB,QAAQ3X,GACpBy4B,EAAYjkB,SAIjB6jB,EAAcjiC,KAAKohB,YAAYjY,QAC7B44B,EAAiB3jB,EAAOqD,OAAOtY,QAAQg5B,EAAsBC,GAC7DtiC,EAAQuhB,YAGVghB,EAAYjkB,OAAS6jB,EACjBjiC,KAAKqhC,eACPgB,EAAYhB,cAAe,GAGxBgB,EAAYC,MACfN,EAAa/xB,KAAKoyB,GAEtB,CAEA,OAAOL,CACT,CAEAjd,KAAAA,CAAMjlB,GACJ,GAAIA,EAAQyhB,QAAQ/V,MAAM4S,GAA0BA,EAAOse,kBAAkB,CAC3E,MAAM6F,EAAgD,GAEtD,IAAK,MAAMnkB,KAAUte,EAAQyhB,QAC3BghB,EAAQtyB,KACN,IAAIuyB,GAAAA,YAAYC,IACdziC,KAAK0iC,iBAAiB5iC,EAAQD,MAAOue,GAClCukB,MAAMC,GAAWH,EAAW5hC,KAAK,CAAEw1B,KAAM,EAACwM,EAAAA,EAAAA,aAAYD,QACtDE,OAAOC,GAAON,EAAWh9B,MAAM,IAAIoK,MAAMkzB,MACzCC,SAAQ,IAAMP,EAAWQ,YAAW,KAK7C,OAAOC,EAAAA,GAAAA,UAASX,EAClB,CAGA,MAAMzB,EAAgD,CAAC,EAEjDD,EAA+C,CAAC,EACtD,IAAK,MAAMziB,KAAUte,EAAQyhB,QAAS,CAEpC,MAAM4hB,EAAiB/kB,EAAOqD,MAAM2hB,WAAW,IAAK,KASpD,GARAtC,EAAmBqC,GAAkB/kB,EAAOqD,MAK5Cof,EAAkBziB,EAAOqD,OAASrD,EAAOA,QAAU,IAG9CwY,EAAAA,OAAOyM,eAAeC,oBAAqB,CAE9C,MAAMC,EAAgB,YAAYnlB,EAAOA,0BAA0B+kB,MACnE/kB,EAAOA,OAASmlB,CAClB,CACF,CAEA,GAAI3M,EAAAA,OAAOyM,eAAeC,oBAAqB,CAC7C,MAAME,EAAkBxjC,KAAK8hC,4BAA4BhiC,EAAS+gC,GAIlE,OAFA/gC,EAAQyhB,QAAUiiB,EAEXpH,MAAMrX,MAAMjlB,EACrB,CAEA,OAAOE,KAAK4gC,cAAc9gC,EAAS+gC,EAAmBC,EACxD,CAEAW,iBAAAA,CAAkBH,EAAgCxhC,G,IAC7B,EAAnB,MAAM2jC,IAAqB,QAAR,EAAAzjC,KAAK+/B,WAAL,eAAUt+B,MAAM,UAC9B6/B,EAAYE,UACfF,EAAYE,QAAU,CAAC,GAErBiC,IACE3jC,EAAQ4jC,eACVpC,EAAYE,QAAQ,kBAAoB1hC,EAAQ4jC,cAE9C5jC,EAAQ4hC,UACVJ,EAAYE,QAAQ,cAAgB1hC,EAAQ4hC,SAE1C5hC,EAAQ6jC,gBACVrC,EAAYE,QAAQ,qBAAuB1hC,EAAQ6jC,eAGzD,CA2EAC,eAAAA,CAAgB/rB,GACd,MAAMgsB,EAA+B,GAErC,IAAK,MAAMxjC,KAAOwX,EAAKgsB,MAAO,CAC5B,IAAIC,EAEAzjC,EAAI05B,SAAS,SACf+J,EAAO,MAGTD,EAAM5zB,KAAK,CAAE2d,YAAavtB,EAAKC,MAAOuX,EAAKgsB,MAAMxjC,GAAMyjC,QACzD,CAEA,OAAOD,CACT,CAEAE,SAAAA,CAAUC,GACR,IAAI9lB,EAAiB,GAQrB,OAPAA,EAAO8lB,EAAU56B,MAAM,KACH,IAAhB8U,EAAKjc,SACPic,EAAO8lB,EAAU56B,MAAM,KACP,KAAZ8U,EAAK,KACPA,EAAO,KAGJA,CACT,CAEA+lB,6BAAAA,CAA8Bnf,EAA0BzD,GACtD,IAAI6iB,EAAkBpf,EAWtB,OAVIA,GAAWA,EAAQ7iB,OAAS,IAC9BiiC,EAAkBpf,EAAQ5kB,KAAK6kB,I,IAIMA,EAEnC,OALsB,SACjBA,GAAAA,CACH1F,WAAYrf,KAAKmkC,SACjB/lB,OAAQpe,KAAKohB,YAAYjY,QAAoB,QAAZ4b,EAAAA,EAAM3G,cAAN2G,IAAAA,EAAAA,EAAgB,GAAI1D,IAEnC,KAGjB6iB,CACT,CAEAxB,gBAAAA,CAAiB7iC,EAAkBue,GACjC,GAAIA,EAAOA,OAAQ,CAEjB,MACMgiB,EAAgB,CACpBvgC,MAAOA,EACP0hB,QAAS,CAAC,CAAEnD,OAHWpe,KAAKohB,YAAYjY,QAAQiV,EAAOA,OAAQ,CAAC,EAAG,QAG7BqD,MAAOrD,EAAOqD,QACpDzX,OAAQ,OACR41B,cAAe,KAGjB,OAAOwE,EAAAA,GAAAA,eACLpkC,KAAK+kB,MAAMqb,GAAewB,MACxB1hC,EAAAA,GAAAA,MAAKoL,IACH,MAAM5F,EAAO,GAEb,IAAK,IAAIkE,EAAI,EAAGA,EAAI0B,EAAO+qB,KAAKp0B,OAAQ2H,IAAK,CAC3C,MAAMwU,EAAS9S,EAAO+qB,KAAKzsB,GAE3B,IAAK,IAAIy6B,EAAI,EAAGA,EAAIjmB,EAAOnc,OAAQoiC,IAAK,CACtC,MAAMC,EAAOlmB,EAAOmmB,OAAO,GAAGh5B,OAAO84B,GACvBjmB,EAAOmmB,OAAO,GAAGh5B,OAAO84B,IAMtC3+B,EAAKuK,KAAK,CACRu0B,WAAYpmB,EACZkmB,OACAhM,MAAOla,EAAOjN,MAElB,CACF,CAEA,OAAOzL,CAAI,KAInB,CAAO,C,IAEiC0Y,EAAtC,MAAMF,EAAOle,KAAKohB,YAAYjY,QAAmB,QAAXiV,EAAAA,EAAOF,YAAPE,IAAAA,OAAAA,EAAAA,EAAapT,KAAK,MACxD,OAAOhL,KAAK4iC,OAAO,CAAE/iC,MAAOA,EAAOqe,KAAMA,IAAQykB,MAAM8B,IACrD,MAAM/+B,EAAO,GACb,KAAKg/B,EAAAA,EAAAA,SAAQD,EAAQpO,MAEnB,OADA7wB,QAAQC,MAAM,8BACP,GAET,IAAK,IAAImE,EAAI,EAAGA,EAAI66B,EAAQpO,KAAKp0B,OAAQ2H,IAAK,CAC5C,MAAMkL,EAAI2vB,EAAQpO,KAAKzsB,GAEvB,IAAIsU,EAAOpJ,EAAEoJ,MACT6f,EAAAA,EAAAA,UAASjpB,EAAEoJ,QACbA,EAAOle,KAAK+jC,UAAUjvB,EAAEoJ,OAG1BxY,EAAKuK,KAAK,CACRu0B,WAAYpmB,EACZkmB,KAAe,IAATxvB,EAAE6vB,KACRrM,MAAOxjB,EAAE8vB,KACT1mB,KAAMA,EACNT,KAAM3I,EAAEuhB,MAEZ,CAEA,OAAO3wB,CAAI,GAEf,CACF,CAEMk9B,MAAAA,CAAO9iC,G,uBAKX,IACE,MAAMoe,EAAOpe,EAAQoe,MAAQ,GACvB3P,EAAOvO,KAAKghC,cAAclhC,EAAQD,MAAMmJ,IAAIuF,MAAM,EAAOzO,EAAQmhC,UACjEC,EAAQlhC,KAAKghC,cAAclhC,EAAQD,MAAMmJ,IAAI6F,IAAI,EAAM/O,EAAQmhC,UACrE,GAAIrK,EAAAA,OAAOyM,eAAeC,oBACxB,aAAatjC,KAAK6kC,aAAyC,SAAU,CACnEt2B,KAAsB,iBAATA,EAAoBA,EAAO,GAAGA,IAC3C2yB,MAAwB,iBAAVA,EAAqBA,EAAQ,GAAGA,IAC9ChjB,SAEG,CACL,MAAM4mB,EAA0B,KAAT5mB,EAAc,GAAK,SAASA,IACnD,OAAOkmB,EAAAA,GAAAA,eACLpkC,KAAK2hC,kBAAoC,CACvCJ,OAAQ,MACRxB,IAAK,yBAAyBxxB,WAAc2yB,IAAQ4D,MAG1D,CACF,CAAE,MAAOhmB,GACP,OAAOimB,QAAQC,OAAOlmB,EACxB,CACF,c,CAEAmmB,sBAAAA,CAAuB7mB,G,IACoBA,EAAzC,OAAOpe,KAAKohB,YAAY8jB,iBAA8B,QAAb9mB,EAAAA,EAAOA,cAAPA,IAAAA,EAAAA,EAAiB,GAC5D,CAEA4iB,aAAAA,CAAcmE,EAAyBC,EAAmBnE,GACxD,MAqBMoE,EArBY,MAChB,IAAItH,EAAAA,EAAAA,UAASoH,GAAO,CAClB,GAAa,QAATA,EACF,MAAO,MACF,GAAIA,EAAKrkB,QAAQ,SAAW,IAA4B,IAAvBqkB,EAAKrkB,QAAQ,KACnD,OAAOqkB,EAAKG,UAAU,GAAGn8B,QAAQ,IAAK,OAAOA,QAAQ,IAAK,OAE5D,MAAMk8B,EAAaE,EAAAA,SAASC,WAAWL,EAAM,CAAEC,UAASnE,aAIxD,OAAKoE,IAAuC,IAAzBA,EAAWI,UAIvBC,KAAOL,EAAWM,UAHhBR,CAIX,CACE,OAAOO,KAAOP,EAAKQ,SACrB,EAGiBC,GAEnB,MAA0B,iBAAfP,EACFA,GAOLD,EACEC,EAAWjlC,IAAI,MACjBilC,EAAWj+B,IAAI,EAAG,MAEC,IAAZg+B,GACLC,EAAWjlC,IAAI,MACjBilC,EAAWQ,SAAS,EAAG,KAIpBR,EAAWS,OACpB,CAEAthB,eAAAA,CAAgBuhB,EAAmCC,GACjD,MAAMlmC,EAAUkmC,GAAmB,CAAC,EAE9BC,EAAcvd,GAA6Bqd,GACjD,GAAIE,EAAYtd,YAAcZ,GAAkB6L,OAASqS,EAAYtd,YAAcZ,GAAkB8L,WACnG,OAAO7zB,KAAKkmC,oBAAoBD,EAAanmC,EAASmmC,EAAYtd,W,IAGxDsd,EAAZ,IAAIlhB,EAA0B,QAAlBkhB,EAAAA,EAAY7nB,cAAZ6nB,IAAAA,EAAAA,EAAsB,GAG9BE,EAAoBnmC,KAAKohB,YAAYjY,QACvC4b,GACAqhB,EAAAA,EAAAA,0BAAyB,CAAErhB,QAAOshB,aAAc,GAAIvmC,QAASkmC,KAI3DM,EAAYH,EAAkB1kC,MAAM,wBACpC8kC,EAAcD,EAAYA,EAAU,GAAGl9B,MAAM,gBAAgBG,QAAQ4D,KAAQA,SAAK5M,EACtF,GAAIgmC,EAEF,OADAzmC,EAAQmxB,MAAQ,IACTjxB,KAAKyxB,yBAAyB8U,EAAYt6B,MAAM,GAAIs6B,EAAY,QAAIhmC,EAAWT,GAMxF,GAFAwmC,EAAYH,EAAkB1kC,MAAM,kBACpC8kC,EAAcD,EAAYA,EAAU,GAAGl9B,MAAM,KAAKG,QAAQ4D,KAAQA,SAAK5M,EACnEgmC,EAEF,OADAzmC,EAAQmxB,MAAQ,IACTjxB,KAAKgxB,oBAAoBuV,OAAahmC,EAAWT,GAI1D,IAQID,EARA2mC,EAAYzhB,EAAMtjB,MAAM,oBAgB5B,OAfAsjB,EAAQyhB,EAAYA,EAAU,GAAKzhB,EAEnCohB,EAAoBnmC,KAAKohB,YAAYjY,QACnC4b,GACAqhB,EAAAA,EAAAA,0BAAyB,CAAErhB,QAAOshB,aAAc,IAAKvmC,QAASkmC,KAI5DlmC,EAAQD,QACVA,EAAQ,CACN0O,KAAMvO,KAAKghC,cAAclhC,EAAQD,MAAM0O,MAAM,EAAOzO,EAAQmhC,UAC5DC,MAAOlhC,KAAKghC,cAAclhC,EAAQD,MAAMgP,IAAI,EAAM/O,EAAQmhC,YAI1DuF,EACKxmC,KAAKymC,oBAAoBN,EAAmBrmC,EAAQowB,UAAWrwB,GAE/DG,KAAK0mC,kBAAkBP,EAAmBrmC,EAAQowB,UAAWrwB,EAExE,CAeA,oBACEomC,EACAnmC,EACA6oB,G,2BAE0B7oB,EAA1B,MAAMowB,EAAqC,QAAjBpwB,EAAAA,EAAQowB,iBAARpwB,IAAAA,EAAAA,EAAqB,IAAIE,KAAK2mC,iB,IAC/B7mC,EAAzB,MAAMD,EAAgC,QAAbC,EAAAA,EAAQD,aAARC,IAAAA,EAAAA,EAAiB,CACxCyO,MAAMq4B,EAAAA,EAAAA,YAAWf,SAAS,EAAG,QAC7Bh3B,IAAI+3B,EAAAA,EAAAA,YACJ59B,IAAK,CACHuF,KAAM,WACNM,GAAI,QAGFg4B,EAA4C,CAChDC,IAAK,2BACL1S,SAAU,KACV2S,WAAY,IACZC,UAAWC,KAAKC,MAChB3lB,QAAS,CAAC,MAAK0kB,IACfhF,SAAU,UACV5f,WAAY,CAAC,EACb6O,YACArwB,SAEIw2B,QAAgC+N,EAAAA,GAAAA,eAAcpkC,KAAK+kB,MAAM8hB,IAE/D,IAAIv7B,EAEJ,GAAIqd,IAAcZ,GAAkB6L,MAAO,CACzC,IAAKyC,EAAKA,MAA6B,IAArBA,EAAKA,KAAKp0B,OAC1B,OAAO8iC,QAAQoC,QAAQ,IAEzB77B,EAAS+qB,EAAKA,KAAK,GAAGkO,OAAO,GAAGh5B,OAC7BhC,QAAQuK,KAAiBA,IACzB5T,KAAKuI,IAAe,CACnBgV,KAAMhV,EAAEsB,WACRzJ,MAAOmI,EACPgc,YAAY,KAElB,MACEnZ,EADSqd,IAAcZ,GAAkB8L,WAChCwC,EAAKA,KAAKn2B,KAAKq2B,IAAY,CAClC9Y,KAAM8Y,EAAOplB,KACb7Q,MAAOi2B,EAAOplB,KACdsT,YAAY,MAGL,GAGX,OAAOsgB,QAAQoC,QAAQ77B,EACzB,c,CAYA,kBACEyZ,EACAmL,EACArwB,G,uBAEA,MAAMmd,EAAsC,CAAC,EAO7C,GALInd,IACFmd,EAAOzO,KAAO1O,EAAM0O,KACpByO,EAAOkkB,MAAQrhC,EAAMqhC,OAGnBtK,EAAAA,OAAOyM,eAAeC,oBACxB,aAAatjC,KAAK6kC,aAAgC,eAAgB,CAChEt2B,KAAMyO,EAAOzO,KAA+B,iBAAhByO,EAAOzO,KAAoByO,EAAOzO,KAAO,GAAGyO,EAAOzO,YAAUhO,EACzF2gC,MAAOlkB,EAAOkkB,MAAiC,iBAAjBlkB,EAAOkkB,MAAqBlkB,EAAOkkB,MAAQ,GAAGlkB,EAAOkkB,aAAW3gC,EAC9FwkB,UAIJ,MAAMuc,EAAiC,CACrCC,OAAQ,OACRxB,IAAK,gBACL/iB,SACAqZ,KAAM,SAAStR,IACfyc,QAAS,CACP,eAAgB,qCAGlBtR,UAAWA,GAGb,OAAOkU,EAAAA,GAAAA,eACLpkC,KAAK2hC,kBAAkBL,GAAaM,MAClC1hC,EAAAA,GAAAA,MAAKukC,IACI2C,EAAAA,EAAAA,KAAK3C,EAAQpO,MAAOgR,IAClB,CACL5pB,KAAM4pB,EAAO5pB,KACbgH,aAAY4iB,EAAO5iB,kBAM/B,c,CAOA,oBACEM,EACAmL,EACArwB,G,uBAEA,MAAMmd,EAAsC,CAAE+H,SAM9C,GALIllB,IACFmd,EAAOzO,KAAO1O,EAAM0O,KACpByO,EAAOkkB,MAAQrhC,EAAMqhC,OAGnBtK,EAAAA,OAAOyM,eAAeC,oBAAqB,CAM7C,aALsBtjC,KAAK6kC,aAAgC,iBAAkB,CAC3Et2B,KAAMyO,EAAOzO,KAA+B,iBAAhByO,EAAOzO,KAAoByO,EAAOzO,KAAO,GAAGyO,EAAOzO,YAAUhO,EACzF2gC,MAAOlkB,EAAOkkB,MAAiC,iBAAjBlkB,EAAOkkB,MAAqBlkB,EAAOkkB,MAAQ,GAAGlkB,EAAOkkB,aAAW3gC,EAC9FwkB,WAEa7kB,KAAKmnC,IAAY,CAC9B5pB,KAAM4pB,EAAO5pB,KACbgH,YAAY,KAEhB,CAEA,MAAM6c,EAAiC,CACrCC,OAAQ,MACRxB,IAAK,kBACL/iB,SACAwkB,QAAS,CACP,eAAgB,qCAGlBtR,aAGF,OAAOkU,EAAAA,GAAAA,eACLpkC,KAAK2hC,kBAAkBL,GAAaM,MAClC1hC,EAAAA,GAAAA,MAAKukC,IACI2C,EAAAA,EAAAA,KAAK3C,EAAQpO,KAAKoO,SAAU4C,IAC1B,CACL5pB,KAAM4pB,EACN5iB,YAAY,SAMxB,c,CAEMuM,mBAAAA,CAAoBuV,EAAuBzV,EAAoBkV,G,uBACnE,MAAMlmC,EAAUkmC,GAAmB,CAAC,EAC9BhpB,EAAsC,CAC1CsqB,MAAMF,EAAAA,EAAAA,KAAKb,GAAc3qB,GAAe5b,KAAKohB,YAAYjY,SAASyS,GAAc,IAAI1S,WActF,GAXI4nB,IACF9T,EAAO8T,UAAYA,GAEjBhxB,EAAQmxB,QACVjU,EAAOiU,MAAQnxB,EAAQmxB,OAErBnxB,EAAQD,QACVmd,EAAOzO,KAAOvO,KAAKghC,cAAclhC,EAAQD,MAAM0O,MAAM,EAAOzO,EAAQmhC,UACpEjkB,EAAOkkB,MAAQlhC,KAAKghC,cAAclhC,EAAQD,MAAMgP,IAAI,EAAM/O,EAAQmhC,WAGhErK,EAAAA,OAAOyM,eAAeC,oBAAqB,CAO7C,aANmBtjC,KAAK6kC,aAAuB,yBAA0B,CACvEt2B,KAA6B,iBAAhByO,EAAOzO,KAAoByO,EAAOzO,KAAO,GAAGyO,EAAOzO,OAChE2yB,MAA+B,iBAAjBlkB,EAAOkkB,MAAqBlkB,EAAOkkB,MAAQ,GAAGlkB,EAAOkkB,QACnEpQ,YACAG,MAAOnxB,EAAQmxB,SAEL/wB,KAAKwiB,IAAS,CACxBjF,KAAMiF,KAEV,CAEA,MAAM4e,EAAiC,CACrCC,OAAQ,MACRxB,IAAK,0BACL/iB,SAEAkT,UAAWpwB,EAAQowB,WAGrB,OAAOkU,EAAAA,GAAAA,eAAcpkC,KAAK2hC,kBAAkBL,GAAaM,KAAK2F,MAChE,c,CAEM9V,wBAAAA,CAAyB8U,EAAuB7jB,EAAa6O,EAAsByU,G,uBACvF,MAAMlmC,EAAUkmC,GAAmB,CAAC,EAC9BhpB,EAAsC,CAC1CsqB,MAAMF,EAAAA,EAAAA,KAAKb,GAAc3qB,GAAe5b,KAAKohB,YAAYjY,SAASyS,GAAc,IAAI1S,UACpFwZ,IAAK1iB,KAAKohB,YAAYjY,SAASuZ,GAAO,IAAIxZ,SAa5C,GAXIqoB,IACFvU,EAAOuU,YAAcA,GAEnBzxB,EAAQmxB,QACVjU,EAAOiU,MAAQnxB,EAAQmxB,OAErBnxB,EAAQD,QACVmd,EAAOzO,KAAOvO,KAAKghC,cAAclhC,EAAQD,MAAM0O,MAAM,EAAOzO,EAAQmhC,UACpEjkB,EAAOkkB,MAAQlhC,KAAKghC,cAAclhC,EAAQD,MAAMgP,IAAI,EAAM/O,EAAQmhC,WAGhErK,EAAAA,OAAOyM,eAAeC,oBAAqB,CAS7C,aARwBtjC,KAAK6kC,aAAuB,2BAA4B,CAC9Et2B,KAA6B,iBAAhByO,EAAOzO,KAAoByO,EAAOzO,KAAO,GAAGyO,EAAOzO,OAChE2yB,MAA+B,iBAAjBlkB,EAAOkkB,MAAqBlkB,EAAOkkB,MAAQ,GAAGlkB,EAAOkkB,QACnEoG,KAAMtqB,EAAOsqB,KACb5kB,IAAK1F,EAAO0F,IACZ6O,cACAN,MAAOnxB,EAAQmxB,SAEA/wB,KAAKwiB,IAAS,CAC7BjF,KAAMiF,KAEV,CAEA,MAAM4e,EAAiC,CACrCC,OAAQ,MACRxB,IAAK,4BACL/iB,SAEAkT,UAAWpwB,EAAQowB,WAGrB,OAAOkU,EAAAA,GAAAA,eAAcpkC,KAAK2hC,kBAAkBL,GAAaM,KAAK2F,MAChE,c,CAEMC,UAAAA,CAAWxB,G,uBACf,MAEM1E,EAAc,CAClBC,OAAQ,MACRxB,IAAK,WACL7P,WALc8V,GAAmB,CAAC,GAKf9V,WAGrB,GAAI0G,EAAAA,OAAOyM,eAAeC,oBAAqB,CAC7C,MAAM1jC,QAAgBI,KAAKynC,YAAoB,WACzCjhC,EAAS,IAAIrF,GAAAA,OAAOvB,GAC1B,OAAOiD,EAAAA,GAAAA,OAAM2D,GAAU5G,EAAU,EACnC,CAEA,OAAOwkC,EAAAA,GAAAA,eACLpkC,KAAK2hC,kBAAkBL,GAAaM,MAClC1hC,EAAAA,GAAAA,MAAKukC,IACH,GAAIA,EAAQpO,KAAM,CAChB,MAAM7vB,EAAS,IAAIrF,GAAAA,OAAOsjC,EAAQpO,MAClC,OAAOxzB,EAAAA,GAAAA,OAAM2D,GAAUi+B,EAAQpO,KAAO,EACxC,CACA,MAAO,EAAE,KAEXqR,EAAAA,GAAAA,aAAW,KACFtG,EAAAA,GAAAA,IAAG,OAIlB,c,CAEA9hB,kBAAAA,CAAmB6J,EAA2BrpB,GAC5C,OAAO6nC,GAAMroB,mBAAmB6J,EAASrpB,EAASE,KAAK6lB,SACzD,CAEAsY,UAAAA,CAAWhtB,GACT,OAAOw2B,GAAMxJ,WAAWhtB,EAAMnR,KAAK6lB,SACrC,CAEAF,qBAAAA,GACE,OAAO3lB,KAAKo+B,aACd,CAEMA,WAAAA,G,uBACJ,GAA6B,OAAzBp+B,KAAK4nC,gBACP,OAAO5nC,KAAK4nC,gBAGd,IAwLJ,SAA+BhoC,GAC7B,MAAM49B,GAAc15B,EAAAA,GAAAA,QAAOlE,GAC3B,IAAK49B,EACH,OAAO,EAET,OAAO75B,EAAAA,GAAAA,KAAI65B,EAAa,QAC1B,CA9LSqK,CAAsB7nC,KAAKm8B,iBAG9B,OAFAn8B,KAAK6lB,SAAW8hB,GAAMvJ,YAAYp+B,KAAKm8B,iBACvCn8B,KAAK4nC,gBAAkB7C,QAAQoC,QAAQnnC,KAAK6lB,UACrC7lB,KAAK4nC,gBAWd,GAAIhR,EAAAA,OAAOyM,eAAeC,oBACxB,IACE,MAAMrlB,QAAkBje,KAAKynC,YAAoB,aAEjD,OADAznC,KAAK6lB,SAAW8hB,GAAMrJ,cAAcrgB,GAC7Bje,KAAK6lB,QACd,CAAE,MAAOpgB,GAGP,OAFAD,QAAQC,MAAM,oCAAqCA,GACnDzF,KAAK6lB,SAAW8hB,GAAMvJ,YAAYp+B,KAAKm8B,iBAChCn8B,KAAK6lB,QACd,CAGF,OAAOue,EAAAA,GAAAA,eACLpkC,KAAK2hC,kBArBa,CAClBJ,OAAQ,MACRxB,IAAK,aAGL+H,aAAc,SAgBsBlG,MAClC1hC,EAAAA,GAAAA,MAAKukC,IAMH,MAAMsD,EAAYpgB,KAAKvmB,MAAMqjC,EAAQpO,KAAKltB,QAAQ,wBAAyB,sBAE3E,OADAnJ,KAAK6lB,SAAW8hB,GAAMrJ,cAAcyJ,GAC7B/nC,KAAK6lB,QAAQ,KAEtB6hB,EAAAA,GAAAA,aAAYjiC,IACVD,QAAQC,MAAM,oCAAqCA,GACnDzF,KAAK6lB,SAAW8hB,GAAMvJ,YAAYp+B,KAAKm8B,kBAChCiF,EAAAA,GAAAA,IAAGphC,KAAK6lB,cAIvB,c,CAEAmiB,cAAAA,GACE,GAAIpR,EAAAA,OAAOyM,eAAeC,oBACxB,OAAOlH,MAAM4L,iBAEf,MAAMjjB,EAAyC,CAC7C+hB,IAAK,WACL1S,SAAU,OACV2S,WAAY,GACZ7W,UAAW,QACX7O,WAAY,CAAC,EACb2lB,UAAW,EACX/F,SAAU,UACVS,QAAS,EACTuG,SAAU,CAAE15B,KAAM,SAAUM,GAAI,OAChChP,MAAO,CACL0O,MAAMq4B,EAAAA,EAAAA,UAAS,UACf/3B,IAAI+3B,EAAAA,EAAAA,UAAS,OACb59B,IAAK,CAAEuF,KAAM,SAAUM,GAAI,QAE7B0S,QAAS,CAAC,CAAEE,MAAO,IAAKrD,OAAQ,sBAChCwhB,cAAe,KAGjB,OAAOwE,EAAAA,GAAAA,eAAcpkC,KAAK+kB,MAAMA,IAAQ4d,MAAK,KAAO,CAAEuF,OAAQ,UAAW/rB,QAAS,4BACpF,CAEAwlB,iBAAAA,CACE7hC,GAeA,OAXIE,KAAKmoC,WAAanoC,KAAKooC,mBACzBtoC,EAAQsoC,iBAAkB,GAExBpoC,KAAKmoC,YACProC,EAAQ0hC,QAAU1hC,EAAQ0hC,SAAW,CAAC,EACtC1hC,EAAQ0hC,QAAQ6G,cAAgBroC,KAAKmoC,WAGvCroC,EAAQigC,IAAM//B,KAAK+/B,IAAMjgC,EAAQigC,IACjCjgC,EAAQw0B,QAAU,CAAEnf,KAAM,aAEnBmzB,EAAAA,EAAAA,iBACJC,MAASzoC,GACT8hC,MACC8F,EAAAA,GAAAA,aAAY5oB,IACH0pB,EAAAA,GAAAA,aAAW,KAChB,MAAMC,ElC5kCX,SAAqBhjC,G,IACWA,EAAAA,EAArC,GAAIA,GAA0B,MAAjBA,EAAMyiC,SAA4B,QAAVziC,EAAAA,EAAM4wB,YAAN5wB,IAAAA,GAAmB,QAAnBA,EAAAA,EAAY0W,eAAZ1W,IAAAA,OAAAA,EAAAA,EAAqBmK,WAAW,UAAU,CAE7E,MAAM84B,GAAa/nB,EAAAA,EAAAA,MACjBlb,EAAM4wB,KAAKla,QACRhT,QAAQ,gBAAiB,IACzBD,OACAE,MAAM,OACRD,QAAQ,cAAe,IAC1B1D,EAAM4wB,KAAKla,QAAU,yEAAyEusB,GAChG,CACA,OAAOjjC,CACT,CkCgkC4BkjC,CAAY7pB,GAC5B,OAAO,IAAIjP,MAAM,GAAG44B,EAAQpS,KAAKla,UAAU,MAIrD,CAGAglB,mBAAAA,CAAoBrhC,EAAc+gC,EAA8Cxf,GAC9E,MAAMunB,EAAkB,CAAC,OAAQ,QAAS,UAAW,SAAU,gBAAiB,gBAC1EC,EAAe,GACnBtnB,EAAkC,CAAC,EACrC,IAAInD,EAAuB6jB,EAAar4B,EACxC,MAAMk/B,EAAyB,aAC/B,IAAIC,GAAa,EAIjB,SAASC,EAAkBvnC,GACzB,OAAOA,EAAM0H,QAAQ,IAAK,OAAOA,QAAQ,IAAK,MAChD,CAEA,IANArJ,EAAgB,OAAI,OAMf8J,EAAI,EAAGA,EAAI9J,EAAQyhB,QAAQtf,OAAQ2H,IACtCwU,EAASte,EAAQyhB,QAAQ3X,GACpBwU,EAAOA,SAIPA,EAAOqD,QACVrD,EAAOqD,MAAQzhB,KAAKkiC,kBAAkBt4B,IAGxCq4B,EAAcjiC,KAAKohB,YAAYjY,QAAQiV,EAAOA,OAAQiD,GACtD4gB,EAAcA,EAAY94B,QAAQ2/B,EAAwBE,GAC1DznB,EAAQnD,EAAOqD,OAASwgB,GAG1B,MAAMlgB,EAAQ,aAEd,SAASqgB,EAA0B3gC,EAAe4gB,GAEhD,OAAIjE,EAAOqD,QAAUY,EACZd,EAAQc,IAAO5gB,EAIjBo/B,EAAkBxe,GAAIlZ,QAAQ4Y,EAAOqgB,IAA8B3gC,CAC5E,CAEA,IAAKmI,EAAI,EAAGA,EAAI9J,EAAQyhB,QAAQtf,OAAQ2H,IACtCwU,EAASte,EAAQyhB,QAAQ3X,GACpBwU,EAAOA,SAIZ6jB,EAAc1gB,EAAQnD,EAAOqD,OAC7BwgB,EAAcjiC,KAAKohB,YAAYjY,QAAQ84B,EAAY94B,QAAQ4Y,EAAOqgB,GAA4B/gB,GAC9FE,EAAQnD,EAAOqD,OAASwgB,EAEnB7jB,EAAOkkB,OACVyG,GAAa,EACbF,EAAa54B,KAAK,UAAYg5B,mBAAmBhH,MAarD,OATAhiB,EAAAA,EAAAA,MAAKngB,GAAS,CAACQ,EAAOD,MACmB,KAAnCygB,EAAAA,EAAAA,SAAQ8nB,EAAiBvoC,IAGzBC,GACFuoC,EAAa54B,KAAK5P,EAAM,IAAM4oC,mBAAmB3oC,GACnD,IAGGyoC,EAIEF,EAHE,EAIX,CAvkCA,WAAA9oC,CACEmpC,EACA,GAA4CphB,EAAAA,EAAAA,mB,IAStBohB,EAAAA,EAPtB9M,MAAM8M,GAAAA,GAAAA,KAAAA,mBAAAA,GAnBRf,GAAAA,KAAAA,iBAAAA,GACApI,GAAAA,KAAAA,WAAAA,GACA5uB,GAAAA,KAAAA,YAAAA,GACAgrB,GAAAA,KAAAA,uBAAAA,GACAvW,GAAAA,KAAAA,oBAAAA,GACAyb,GAAAA,KAAAA,oBAAAA,GACAzF,GAAAA,KAAAA,8BAAAA,GACAiE,GAAAA,KAAAA,oBAAAA,GACAuI,GAAAA,KAAAA,uBAAAA,GACAviB,GAAAA,KAAAA,gBAAAA,GACA+hB,GAAAA,KAAAA,uBAAAA,GACA1F,GAAAA,KAAAA,yBAAAA,GACAyE,GAAAA,KAAAA,sBAAAA,GACA,QAAiB1G,sBAAjB,GA2SA4B,GAAAA,KAAAA,mCAAAA,GAAAA,KAvSmBzgB,YAAAA,EAAAA,KARnByE,SAA4B,UAC5B+hB,gBAA4C,UAE5CjB,eAAiB,SA4SjB9E,4BAA8B,CAACv2B,EAAuB69B,KACpD,MAAM9S,EAAoB,GAC1B,IAAK/qB,IAAWA,EAAO+qB,KACrB,MAAO,CAAEA,QAIX,MAAME,EAMDjrB,EAAO+qB,KAAKE,QAAUjrB,EAAO+qB,KAElC,KAAKqO,EAAAA,EAAAA,SAAQnO,GACX,KAAM,CAAEpa,QAAS,2BAA4Bka,KAAM/qB,GAGrD,IAAK,IAAI1B,EAAI,EAAGA,EAAI2sB,EAAOt0B,OAAQ2H,IAAK,CACtC,MAAMmM,EAAIwgB,EAAO3sB,GAEjB,IAAI6X,EAAQ,GAEZ,MAAM2nB,EAAcrzB,EAAEqI,OAAOhV,MAAM,KAC/BggC,EAAYnnC,OAAS,IAEvBwf,EAAQ2nB,EAAYj9B,OAAS,GAC7B4J,EAAEqI,OAASgrB,EAAYp+B,KAAK,MAG9B+K,EAAEuiB,MAAQviB,EAAEqI,OAEZ,IAAK,IAAIimB,EAAI,EAAGA,EAAItuB,EAAEszB,WAAWpnC,OAAQoiC,IACvCtuB,EAAEszB,WAAWhF,GAAG,IAAM,IAGxB,MAAMiF,GAAQzG,EAAAA,EAAAA,aAAY9sB,GAK1B,GAHAuzB,EAAM7nB,MAAQ0nB,EAAS1nB,GAGnB1L,EAAE8B,KAAM,CAQV,GAPAyxB,EAAMzxB,KAAO,CACX4e,OAAQ,CACN8S,gBAAiBj+B,EAAO+qB,KAAKxe,KAC7B2e,eAAgBzgB,EAAE8B,OAIlB7X,KAAK47B,uBAAwB,CAC/B,MAAMzG,EAAenB,GAAgBje,EAAE8B,MACjCud,EAAgBb,GAA8Bxe,EAAE8B,MAElDsd,EACFmU,EAAMzxB,KAAK2xB,QAAU,CAACrU,GACbC,IACTkU,EAAMzxB,KAAK2xB,QAAU,CAACpU,GAE1B,CAGU,IAANxrB,GAAW0B,EAAO+qB,KAAKxe,KAAKgsB,QAC9ByF,EAAMzxB,KAAKgsB,MAAQ7jC,KAAK4jC,gBAAgBt4B,EAAO+qB,KAAKxe,MAExD,CAEAwe,EAAKpmB,KAAKq5B,EACZ,CAEA,MAAO,CAAEjT,OAAM,EA1Wfr2B,KAAKmoC,UAAYe,EAAiBf,UAClCnoC,KAAK+/B,IAAMmJ,EAAiBnJ,IAC5B//B,KAAKmR,KAAO+3B,EAAiB/3B,KAG7BnR,KAAKm8B,gBAAkB+M,EAAiB1N,SAASW,iBAAmBhE,GACpEn4B,KAAKigC,gBAA8D,QAA7CiJ,EAAAA,EAAiB1N,SAASM,2BAA1BoN,IAAAA,GAAmD,QAAnDA,EAAAA,EAA+CnN,YAA/CmN,IAAAA,OAAAA,EAAAA,EAAqDlQ,WAAY,GACvFh5B,KAAKqhC,aAAe6H,EAAiB1N,SAASC,eAAiBzT,GAAa0T,WAC5E17B,KAAK4lB,aA6jCT,SAAsBhmB,GACpB,MAAM49B,GAAc15B,EAAAA,GAAAA,QAAOlE,GAC3B,IAAK49B,EACH,OAAO,EAET,OAAO75B,EAAAA,GAAAA,KAAI65B,EAAa,QAC1B,CAnkCwB5X,CAAa5lB,KAAKm8B,iBACtCn8B,KAAK6/B,aAAeqJ,EAAiBrJ,aACrC7/B,KAAK47B,uBAAyBsN,EAAiB1N,SAASI,uBACxD57B,KAAKooC,gBAAkBc,EAAiBd,gBACxCpoC,KAAK6lB,SAAW,KAChB7lB,KAAK4nC,gBAAkB,KACvB5nC,KAAKkiC,kBAAoB,6BACzBliC,KAAKypC,YAAc,CACjBC,YAAapN,GACbyC,kBAAiBA,GAErB,EAkkCF,SAASwI,KACP,OAAO3F,EAAAA,GAAAA,OACL1hC,EAAAA,GAAAA,MAAKukC,GACCA,EAAQpO,MACH+Q,EAAAA,EAAAA,KAAK3C,EAAQpO,MAAO/1B,IAClB,CAAEmd,KAAMnd,MAGV,KAIf,CC5rCO,MAAMqpC,GAAS,IAAIC,EAAAA,iBAAiBnK,IACxCoK,gBbGI,UAA6B,WAClCxqB,EAAU,WACVwH,EAAU,SACVC,EAAQ,MACR/B,EAAK,MACLllB,EAAK,QACLilB,IAEA,OACE,SAAC8B,GAA0BA,CACzBvH,WAAYA,EACZwH,WAAYA,EACZC,SAAUA,EACV/B,MAAOA,EACPD,QAASA,EACTjlB,MAAOA,E,UAEP,SAACyzB,GAAAA,CAAAA,IAGP,IatBGwW,gBAAgBxP,IAChByP,wBZQoC30B,IACrC,MAAM,MAAE2P,EAAK,SAAE+B,GAAa1R,GACrB9U,EAAOwoB,IAAY7B,EAAAA,EAAAA,UAASyB,GAA6B3D,I,IASjDzkB,EAPf,OACE,sB,WACE,SAACk5B,EAAAA,YAAWA,CAACtR,MAAM,oBAAoByU,WAAY,G,UACjD,SAACrB,EAAAA,OAAMA,CACLtR,aAAW,oBACXlqB,QAAS6zB,GACThI,MAAO,GACPrrB,MAAsB,QAAfA,EAAAA,EAAMqoB,iBAANroB,IAAAA,EAAAA,EAAmBynB,GAAkBa,QAC5C9B,SAAWsL,I,IAYL9xB,GAXJwoB,EAAS,SACJxoB,GAAAA,CACHqoB,UAAWyJ,EAAgB9xB,SAGzBA,EAAM8d,SACR0I,EACE,SACKxmB,GAAAA,CACHqoB,UAAWyJ,EAAgB9xB,QAEjB,QAAZA,EAAAA,EAAM8d,cAAN9d,IAAAA,EAAAA,EAAgB,GAEpB,OAIN,SAACk5B,EAAAA,YAAWA,CAACtR,MAAM,QAAQyU,WAAY,GAAIC,MAAI,E,UAC7C,SAACnD,EAAAA,MAAKA,CACJzP,aAAW,8BACX1pB,MAAOA,EAAM8d,OACbkQ,OAAQ,K,IAAsBhuB,E,OAAhBwmB,EAASxmB,EAAmB,QAAZA,EAAAA,EAAM8d,cAAN9d,IAAAA,EAAAA,EAAgB,GAAG,EACjDwmB,SAAWhS,IACTgU,EAAS,SACJxoB,GAAAA,CACH8d,OAAQtJ,EAAE+nB,cAAcv8B,Q,YY7CnC0pC,qBAAqBjV,I","sources":["webpack://graphite/../../../../../node_modules/semver/ranges/ltr.js","webpack://graphite/../../../../../node_modules/semver/internal/lrucache.js","webpack://graphite/../../../../../node_modules/semver/ranges/valid.js","webpack://graphite/../../../../../node_modules/semver/ranges/intersects.js","webpack://graphite/../../../../../node_modules/semver/functions/coerce.js","webpack://graphite/../../../../../node_modules/semver/index.js","webpack://graphite/../../../../../node_modules/semver/functions/major.js","webpack://graphite/../../../../../node_modules/semver/internal/debug.js","webpack://graphite/../../../../../node_modules/semver/functions/rsort.js","webpack://graphite/external amd \"rxjs\"","webpack://graphite/external amd \"module\"","webpack://graphite/../../../../../node_modules/semver/functions/eq.js","webpack://graphite/../../../../../node_modules/semver/internal/identifiers.js","webpack://graphite/external amd \"@grafana/ui\"","webpack://graphite/../../../../../node_modules/semver/ranges/subset.js","webpack://graphite/../../../../../node_modules/semver/internal/constants.js","webpack://graphite/../../../../../node_modules/semver/functions/lt.js","webpack://graphite/../../../../../node_modules/semver/ranges/min-satisfying.js","webpack://graphite/external amd \"moment\"","webpack://graphite/../../../../../node_modules/semver/functions/inc.js","webpack://graphite/../../../../../node_modules/semver/classes/range.js","webpack://graphite/external amd \"rxjs/operators\"","webpack://graphite/../../../../../node_modules/semver/functions/satisfies.js","webpack://graphite/external amd \"lodash\"","webpack://graphite/../../../../../node_modules/semver/ranges/to-comparators.js","webpack://graphite/../../../../../node_modules/semver/functions/compare.js","webpack://graphite/../../../../../node_modules/semver/functions/sort.js","webpack://graphite/../../../../../node_modules/semver/functions/gte.js","webpack://graphite/../../../../../node_modules/semver/functions/parse.js","webpack://graphite/../../../../../node_modules/semver/functions/lte.js","webpack://graphite/../../../../../node_modules/semver/classes/semver.js","webpack://graphite/../../../../../node_modules/semver/functions/diff.js","webpack://graphite/../../../../../node_modules/semver/functions/cmp.js","webpack://graphite/../../../../../node_modules/semver/functions/patch.js","webpack://graphite/../../../../../node_modules/semver/functions/compare-loose.js","webpack://graphite/../../../../../node_modules/semver/internal/re.js","webpack://graphite/external amd \"react\"","webpack://graphite/../../../../../node_modules/semver/functions/neq.js","webpack://graphite/external amd \"@emotion/css\"","webpack://graphite/../../../../../node_modules/semver/functions/prerelease.js","webpack://graphite/../../../../../node_modules/semver/ranges/max-satisfying.js","webpack://graphite/../../../../../node_modules/semver/ranges/gtr.js","webpack://graphite/../../../../../node_modules/semver/ranges/min-version.js","webpack://graphite/../../../../../node_modules/semver/functions/compare-build.js","webpack://graphite/../../../../../node_modules/semver/functions/rcompare.js","webpack://graphite/external amd \"redux\"","webpack://graphite/../../../../../node_modules/semver/ranges/outside.js","webpack://graphite/external amd \"@grafana/data\"","webpack://graphite/../../../../../node_modules/react/cjs/react-jsx-runtime.production.min.js","webpack://graphite/../../../../../node_modules/semver/ranges/simplify.js","webpack://graphite/external amd \"@grafana/runtime\"","webpack://graphite/../../../../../node_modules/semver/functions/clean.js","webpack://graphite/../../../../../node_modules/semver/classes/comparator.js","webpack://graphite/../../../../../node_modules/semver/functions/gt.js","webpack://graphite/../../../../../node_modules/semver/functions/minor.js","webpack://graphite/../../../../../node_modules/semver/internal/parse-options.js","webpack://graphite/../../../../../node_modules/react/jsx-runtime.js","webpack://graphite/../../../../../node_modules/semver/functions/valid.js","webpack://graphite/webpack/bootstrap","webpack://graphite/webpack/runtime/compat get default export","webpack://graphite/webpack/runtime/define property getters","webpack://graphite/webpack/runtime/hasOwnProperty shorthand","webpack://graphite/webpack/runtime/make namespace object","webpack://graphite/webpack/runtime/publicPath","webpack://graphite/./node_modules/grafana-public-path.js","webpack://graphite/../../../../../node_modules/@reduxjs/toolkit/dist/redux-toolkit.modern.mjs","webpack://graphite/./state/actions.ts","webpack://graphite/./lexer.ts","webpack://graphite/./parser.ts","webpack://graphite/./utils.ts","webpack://graphite/./graphite_query.ts","webpack://graphite/./state/helpers.ts","webpack://graphite/./state/store.ts","webpack://graphite/./state/context.tsx","webpack://graphite/../../../../../node_modules/react-use/esm/usePrevious.js","webpack://graphite/./types.ts","webpack://graphite/./components/helpers.ts","webpack://graphite/./components/AddGraphiteFunction.tsx","webpack://graphite/./components/FunctionEditorControls.tsx","webpack://graphite/./components/FunctionEditor.tsx","webpack://graphite/./components/FunctionParamEditor.tsx","webpack://graphite/./components/GraphiteFunctionEditor.tsx","webpack://graphite/./components/FunctionsSection.tsx","webpack://graphite/./components/GraphiteTextEditor.tsx","webpack://graphite/./state/providers.ts","webpack://graphite/./components/MetricSegment.tsx","webpack://graphite/./components/MetricsSection.tsx","webpack://graphite/./components/PlayButton.tsx","webpack://graphite/./components/TagEditor.tsx","webpack://graphite/./components/TagsSection.tsx","webpack://graphite/./components/SeriesSection.tsx","webpack://graphite/./components/GraphiteQueryEditor.tsx","webpack://graphite/./components/GraphiteVariableEditor.tsx","webpack://graphite/./meta.ts","webpack://graphite/./components/MetricTankMetaInspector.tsx","webpack://graphite/./versions.ts","webpack://graphite/./configuration/MappingsHelp.tsx","webpack://graphite/./configuration/MappingsConfiguration.tsx","webpack://graphite/./configuration/parseLokiLabelMappings.ts","webpack://graphite/./configuration/ConfigEditor.tsx","webpack://graphite/./components/AnnotationsEditor.tsx","webpack://graphite/./gfunc.ts","webpack://graphite/./migrations.ts","webpack://graphite/./datasource.ts","webpack://graphite/./module.ts"],"sourcesContent":["'use strict'\n\nconst outside = require('./outside')\n// Determine if version is less than all the versions possible in the range\nconst ltr = (version, range, options) => outside(version, range, '<', options)\nmodule.exports = ltr\n","'use strict'\n\nclass LRUCache {\n constructor () {\n this.max = 1000\n this.map = new Map()\n }\n\n get (key) {\n const value = this.map.get(key)\n if (value === undefined) {\n return undefined\n } else {\n // Remove the key from the map and add it to the end\n this.map.delete(key)\n this.map.set(key, value)\n return value\n }\n }\n\n delete (key) {\n return this.map.delete(key)\n }\n\n set (key, value) {\n const deleted = this.delete(key)\n\n if (!deleted && value !== undefined) {\n // If cache is full, delete the least recently used item\n if (this.map.size >= this.max) {\n const firstKey = this.map.keys().next().value\n this.delete(firstKey)\n }\n\n this.map.set(key, value)\n }\n\n return this\n }\n}\n\nmodule.exports = LRUCache\n","'use strict'\n\nconst Range = require('../classes/range')\nconst validRange = (range, options) => {\n try {\n // Return '*' instead of '' so that truthiness works.\n // This will throw if it's invalid anyway\n return new Range(range, options).range || '*'\n } catch (er) {\n return null\n }\n}\nmodule.exports = validRange\n","'use strict'\n\nconst Range = require('../classes/range')\nconst intersects = (r1, r2, options) => {\n r1 = new Range(r1, options)\n r2 = new Range(r2, options)\n return r1.intersects(r2, options)\n}\nmodule.exports = intersects\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst parse = require('./parse')\nconst { safeRe: re, t } = require('../internal/re')\n\nconst coerce = (version, options) => {\n if (version instanceof SemVer) {\n return version\n }\n\n if (typeof version === 'number') {\n version = String(version)\n }\n\n if (typeof version !== 'string') {\n return null\n }\n\n options = options || {}\n\n let match = null\n if (!options.rtl) {\n match = version.match(options.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE])\n } else {\n // Find the right-most coercible string that does not share\n // a terminus with a more left-ward coercible string.\n // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4'\n // With includePrerelease option set, '1.2.3.4-rc' wants to coerce '2.3.4-rc', not '2.3.4'\n //\n // Walk through the string checking with a /g regexp\n // Manually set the index so as to pick up overlapping matches.\n // Stop when we get a match that ends at the string end, since no\n // coercible string can be more right-ward without the same terminus.\n const coerceRtlRegex = options.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL]\n let next\n while ((next = coerceRtlRegex.exec(version)) &&\n (!match || match.index + match[0].length !== version.length)\n ) {\n if (!match ||\n next.index + next[0].length !== match.index + match[0].length) {\n match = next\n }\n coerceRtlRegex.lastIndex = next.index + next[1].length + next[2].length\n }\n // leave it in a clean state\n coerceRtlRegex.lastIndex = -1\n }\n\n if (match === null) {\n return null\n }\n\n const major = match[2]\n const minor = match[3] || '0'\n const patch = match[4] || '0'\n const prerelease = options.includePrerelease && match[5] ? `-${match[5]}` : ''\n const build = options.includePrerelease && match[6] ? `+${match[6]}` : ''\n\n return parse(`${major}.${minor}.${patch}${prerelease}${build}`, options)\n}\nmodule.exports = coerce\n","'use strict'\n\n// just pre-load all the stuff that index.js lazily exports\nconst internalRe = require('./internal/re')\nconst constants = require('./internal/constants')\nconst SemVer = require('./classes/semver')\nconst identifiers = require('./internal/identifiers')\nconst parse = require('./functions/parse')\nconst valid = require('./functions/valid')\nconst clean = require('./functions/clean')\nconst inc = require('./functions/inc')\nconst diff = require('./functions/diff')\nconst major = require('./functions/major')\nconst minor = require('./functions/minor')\nconst patch = require('./functions/patch')\nconst prerelease = require('./functions/prerelease')\nconst compare = require('./functions/compare')\nconst rcompare = require('./functions/rcompare')\nconst compareLoose = require('./functions/compare-loose')\nconst compareBuild = require('./functions/compare-build')\nconst sort = require('./functions/sort')\nconst rsort = require('./functions/rsort')\nconst gt = require('./functions/gt')\nconst lt = require('./functions/lt')\nconst eq = require('./functions/eq')\nconst neq = require('./functions/neq')\nconst gte = require('./functions/gte')\nconst lte = require('./functions/lte')\nconst cmp = require('./functions/cmp')\nconst coerce = require('./functions/coerce')\nconst Comparator = require('./classes/comparator')\nconst Range = require('./classes/range')\nconst satisfies = require('./functions/satisfies')\nconst toComparators = require('./ranges/to-comparators')\nconst maxSatisfying = require('./ranges/max-satisfying')\nconst minSatisfying = require('./ranges/min-satisfying')\nconst minVersion = require('./ranges/min-version')\nconst validRange = require('./ranges/valid')\nconst outside = require('./ranges/outside')\nconst gtr = require('./ranges/gtr')\nconst ltr = require('./ranges/ltr')\nconst intersects = require('./ranges/intersects')\nconst simplifyRange = require('./ranges/simplify')\nconst subset = require('./ranges/subset')\nmodule.exports = {\n parse,\n valid,\n clean,\n inc,\n diff,\n major,\n minor,\n patch,\n prerelease,\n compare,\n rcompare,\n compareLoose,\n compareBuild,\n sort,\n rsort,\n gt,\n lt,\n eq,\n neq,\n gte,\n lte,\n cmp,\n coerce,\n Comparator,\n Range,\n satisfies,\n toComparators,\n maxSatisfying,\n minSatisfying,\n minVersion,\n validRange,\n outside,\n gtr,\n ltr,\n intersects,\n simplifyRange,\n subset,\n SemVer,\n re: internalRe.re,\n src: internalRe.src,\n tokens: internalRe.t,\n SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION,\n RELEASE_TYPES: constants.RELEASE_TYPES,\n compareIdentifiers: identifiers.compareIdentifiers,\n rcompareIdentifiers: identifiers.rcompareIdentifiers,\n}\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst major = (a, loose) => new SemVer(a, loose).major\nmodule.exports = major\n","'use strict'\n\nconst debug = (\n typeof process === 'object' &&\n process.env &&\n process.env.NODE_DEBUG &&\n /\\bsemver\\b/i.test(process.env.NODE_DEBUG)\n) ? (...args) => console.error('SEMVER', ...args)\n : () => {}\n\nmodule.exports = debug\n","'use strict'\n\nconst compareBuild = require('./compare-build')\nconst rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose))\nmodule.exports = rsort\n","module.exports = __WEBPACK_EXTERNAL_MODULE__1269__;","module.exports = __WEBPACK_EXTERNAL_MODULE__1308__;","'use strict'\n\nconst compare = require('./compare')\nconst eq = (a, b, loose) => compare(a, b, loose) === 0\nmodule.exports = eq\n","'use strict'\n\nconst numeric = /^[0-9]+$/\nconst compareIdentifiers = (a, b) => {\n if (typeof a === 'number' && typeof b === 'number') {\n return a === b ? 0 : a < b ? -1 : 1\n }\n\n const anum = numeric.test(a)\n const bnum = numeric.test(b)\n\n if (anum && bnum) {\n a = +a\n b = +b\n }\n\n return a === b ? 0\n : (anum && !bnum) ? -1\n : (bnum && !anum) ? 1\n : a < b ? -1\n : 1\n}\n\nconst rcompareIdentifiers = (a, b) => compareIdentifiers(b, a)\n\nmodule.exports = {\n compareIdentifiers,\n rcompareIdentifiers,\n}\n","module.exports = __WEBPACK_EXTERNAL_MODULE__2007__;","'use strict'\n\nconst Range = require('../classes/range.js')\nconst Comparator = require('../classes/comparator.js')\nconst { ANY } = Comparator\nconst satisfies = require('../functions/satisfies.js')\nconst compare = require('../functions/compare.js')\n\n// Complex range `r1 || r2 || ...` is a subset of `R1 || R2 || ...` iff:\n// - Every simple range `r1, r2, ...` is a null set, OR\n// - Every simple range `r1, r2, ...` which is not a null set is a subset of\n// some `R1, R2, ...`\n//\n// Simple range `c1 c2 ...` is a subset of simple range `C1 C2 ...` iff:\n// - If c is only the ANY comparator\n// - If C is only the ANY comparator, return true\n// - Else if in prerelease mode, return false\n// - else replace c with `[>=0.0.0]`\n// - If C is only the ANY comparator\n// - if in prerelease mode, return true\n// - else replace C with `[>=0.0.0]`\n// - Let EQ be the set of = comparators in c\n// - If EQ is more than one, return true (null set)\n// - Let GT be the highest > or >= comparator in c\n// - Let LT be the lowest < or <= comparator in c\n// - If GT and LT, and GT.semver > LT.semver, return true (null set)\n// - If any C is a = range, and GT or LT are set, return false\n// - If EQ\n// - If GT, and EQ does not satisfy GT, return true (null set)\n// - If LT, and EQ does not satisfy LT, return true (null set)\n// - If EQ satisfies every C, return true\n// - Else return false\n// - If GT\n// - If GT.semver is lower than any > or >= comp in C, return false\n// - If GT is >=, and GT.semver does not satisfy every C, return false\n// - If GT.semver has a prerelease, and not in prerelease mode\n// - If no C has a prerelease and the GT.semver tuple, return false\n// - If LT\n// - If LT.semver is greater than any < or <= comp in C, return false\n// - If LT is <=, and LT.semver does not satisfy every C, return false\n// - If GT.semver has a prerelease, and not in prerelease mode\n// - If no C has a prerelease and the LT.semver tuple, return false\n// - Else return true\n\nconst subset = (sub, dom, options = {}) => {\n if (sub === dom) {\n return true\n }\n\n sub = new Range(sub, options)\n dom = new Range(dom, options)\n let sawNonNull = false\n\n OUTER: for (const simpleSub of sub.set) {\n for (const simpleDom of dom.set) {\n const isSub = simpleSubset(simpleSub, simpleDom, options)\n sawNonNull = sawNonNull || isSub !== null\n if (isSub) {\n continue OUTER\n }\n }\n // the null set is a subset of everything, but null simple ranges in\n // a complex range should be ignored. so if we saw a non-null range,\n // then we know this isn't a subset, but if EVERY simple range was null,\n // then it is a subset.\n if (sawNonNull) {\n return false\n }\n }\n return true\n}\n\nconst minimumVersionWithPreRelease = [new Comparator('>=0.0.0-0')]\nconst minimumVersion = [new Comparator('>=0.0.0')]\n\nconst simpleSubset = (sub, dom, options) => {\n if (sub === dom) {\n return true\n }\n\n if (sub.length === 1 && sub[0].semver === ANY) {\n if (dom.length === 1 && dom[0].semver === ANY) {\n return true\n } else if (options.includePrerelease) {\n sub = minimumVersionWithPreRelease\n } else {\n sub = minimumVersion\n }\n }\n\n if (dom.length === 1 && dom[0].semver === ANY) {\n if (options.includePrerelease) {\n return true\n } else {\n dom = minimumVersion\n }\n }\n\n const eqSet = new Set()\n let gt, lt\n for (const c of sub) {\n if (c.operator === '>' || c.operator === '>=') {\n gt = higherGT(gt, c, options)\n } else if (c.operator === '<' || c.operator === '<=') {\n lt = lowerLT(lt, c, options)\n } else {\n eqSet.add(c.semver)\n }\n }\n\n if (eqSet.size > 1) {\n return null\n }\n\n let gtltComp\n if (gt && lt) {\n gtltComp = compare(gt.semver, lt.semver, options)\n if (gtltComp > 0) {\n return null\n } else if (gtltComp === 0 && (gt.operator !== '>=' || lt.operator !== '<=')) {\n return null\n }\n }\n\n // will iterate one or zero times\n for (const eq of eqSet) {\n if (gt && !satisfies(eq, String(gt), options)) {\n return null\n }\n\n if (lt && !satisfies(eq, String(lt), options)) {\n return null\n }\n\n for (const c of dom) {\n if (!satisfies(eq, String(c), options)) {\n return false\n }\n }\n\n return true\n }\n\n let higher, lower\n let hasDomLT, hasDomGT\n // if the subset has a prerelease, we need a comparator in the superset\n // with the same tuple and a prerelease, or it's not a subset\n let needDomLTPre = lt &&\n !options.includePrerelease &&\n lt.semver.prerelease.length ? lt.semver : false\n let needDomGTPre = gt &&\n !options.includePrerelease &&\n gt.semver.prerelease.length ? gt.semver : false\n // exception: <1.2.3-0 is the same as <1.2.3\n if (needDomLTPre && needDomLTPre.prerelease.length === 1 &&\n lt.operator === '<' && needDomLTPre.prerelease[0] === 0) {\n needDomLTPre = false\n }\n\n for (const c of dom) {\n hasDomGT = hasDomGT || c.operator === '>' || c.operator === '>='\n hasDomLT = hasDomLT || c.operator === '<' || c.operator === '<='\n if (gt) {\n if (needDomGTPre) {\n if (c.semver.prerelease && c.semver.prerelease.length &&\n c.semver.major === needDomGTPre.major &&\n c.semver.minor === needDomGTPre.minor &&\n c.semver.patch === needDomGTPre.patch) {\n needDomGTPre = false\n }\n }\n if (c.operator === '>' || c.operator === '>=') {\n higher = higherGT(gt, c, options)\n if (higher === c && higher !== gt) {\n return false\n }\n } else if (gt.operator === '>=' && !satisfies(gt.semver, String(c), options)) {\n return false\n }\n }\n if (lt) {\n if (needDomLTPre) {\n if (c.semver.prerelease && c.semver.prerelease.length &&\n c.semver.major === needDomLTPre.major &&\n c.semver.minor === needDomLTPre.minor &&\n c.semver.patch === needDomLTPre.patch) {\n needDomLTPre = false\n }\n }\n if (c.operator === '<' || c.operator === '<=') {\n lower = lowerLT(lt, c, options)\n if (lower === c && lower !== lt) {\n return false\n }\n } else if (lt.operator === '<=' && !satisfies(lt.semver, String(c), options)) {\n return false\n }\n }\n if (!c.operator && (lt || gt) && gtltComp !== 0) {\n return false\n }\n }\n\n // if there was a < or >, and nothing in the dom, then must be false\n // UNLESS it was limited by another range in the other direction.\n // Eg, >1.0.0 <1.0.1 is still a subset of <2.0.0\n if (gt && hasDomLT && !lt && gtltComp !== 0) {\n return false\n }\n\n if (lt && hasDomGT && !gt && gtltComp !== 0) {\n return false\n }\n\n // we needed a prerelease range in a specific tuple, but didn't get one\n // then this isn't a subset. eg >=1.2.3-pre is not a subset of >=1.0.0,\n // because it includes prereleases in the 1.2.3 tuple\n if (needDomGTPre || needDomLTPre) {\n return false\n }\n\n return true\n}\n\n// >=1.2.3 is lower than >1.2.3\nconst higherGT = (a, b, options) => {\n if (!a) {\n return b\n }\n const comp = compare(a.semver, b.semver, options)\n return comp > 0 ? a\n : comp < 0 ? b\n : b.operator === '>' && a.operator === '>=' ? b\n : a\n}\n\n// <=1.2.3 is higher than <1.2.3\nconst lowerLT = (a, b, options) => {\n if (!a) {\n return b\n }\n const comp = compare(a.semver, b.semver, options)\n return comp < 0 ? a\n : comp > 0 ? b\n : b.operator === '<' && a.operator === '<=' ? b\n : a\n}\n\nmodule.exports = subset\n","'use strict'\n\n// Note: this is the semver.org version of the spec that it implements\n// Not necessarily the package version of this code.\nconst SEMVER_SPEC_VERSION = '2.0.0'\n\nconst MAX_LENGTH = 256\nconst MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||\n/* istanbul ignore next */ 9007199254740991\n\n// Max safe segment length for coercion.\nconst MAX_SAFE_COMPONENT_LENGTH = 16\n\n// Max safe length for a build identifier. The max length minus 6 characters for\n// the shortest version with a build 0.0.0+BUILD.\nconst MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6\n\nconst RELEASE_TYPES = [\n 'major',\n 'premajor',\n 'minor',\n 'preminor',\n 'patch',\n 'prepatch',\n 'prerelease',\n]\n\nmodule.exports = {\n MAX_LENGTH,\n MAX_SAFE_COMPONENT_LENGTH,\n MAX_SAFE_BUILD_LENGTH,\n MAX_SAFE_INTEGER,\n RELEASE_TYPES,\n SEMVER_SPEC_VERSION,\n FLAG_INCLUDE_PRERELEASE: 0b001,\n FLAG_LOOSE: 0b010,\n}\n","'use strict'\n\nconst compare = require('./compare')\nconst lt = (a, b, loose) => compare(a, b, loose) < 0\nmodule.exports = lt\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\nconst minSatisfying = (versions, range, options) => {\n let min = null\n let minSV = null\n let rangeObj = null\n try {\n rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach((v) => {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!min || minSV.compare(v) === 1) {\n // compare(min, v, true)\n min = v\n minSV = new SemVer(min, options)\n }\n }\n })\n return min\n}\nmodule.exports = minSatisfying\n","module.exports = __WEBPACK_EXTERNAL_MODULE__2468__;","'use strict'\n\nconst SemVer = require('../classes/semver')\n\nconst inc = (version, release, options, identifier, identifierBase) => {\n if (typeof (options) === 'string') {\n identifierBase = identifier\n identifier = options\n options = undefined\n }\n\n try {\n return new SemVer(\n version instanceof SemVer ? version.version : version,\n options\n ).inc(release, identifier, identifierBase).version\n } catch (er) {\n return null\n }\n}\nmodule.exports = inc\n","'use strict'\n\nconst SPACE_CHARACTERS = /\\s+/g\n\n// hoisted class for cyclic dependency\nclass Range {\n constructor (range, options) {\n options = parseOptions(options)\n\n if (range instanceof Range) {\n if (\n range.loose === !!options.loose &&\n range.includePrerelease === !!options.includePrerelease\n ) {\n return range\n } else {\n return new Range(range.raw, options)\n }\n }\n\n if (range instanceof Comparator) {\n // just put it in the set and return\n this.raw = range.value\n this.set = [[range]]\n this.formatted = undefined\n return this\n }\n\n this.options = options\n this.loose = !!options.loose\n this.includePrerelease = !!options.includePrerelease\n\n // First reduce all whitespace as much as possible so we do not have to rely\n // on potentially slow regexes like \\s*. This is then stored and used for\n // future error messages as well.\n this.raw = range.trim().replace(SPACE_CHARACTERS, ' ')\n\n // First, split on ||\n this.set = this.raw\n .split('||')\n // map the range to a 2d array of comparators\n .map(r => this.parseRange(r.trim()))\n // throw out any comparator lists that are empty\n // this generally means that it was not a valid range, which is allowed\n // in loose mode, but will still throw if the WHOLE range is invalid.\n .filter(c => c.length)\n\n if (!this.set.length) {\n throw new TypeError(`Invalid SemVer Range: ${this.raw}`)\n }\n\n // if we have any that are not the null set, throw out null sets.\n if (this.set.length > 1) {\n // keep the first one, in case they're all null sets\n const first = this.set[0]\n this.set = this.set.filter(c => !isNullSet(c[0]))\n if (this.set.length === 0) {\n this.set = [first]\n } else if (this.set.length > 1) {\n // if we have any that are *, then the range is just *\n for (const c of this.set) {\n if (c.length === 1 && isAny(c[0])) {\n this.set = [c]\n break\n }\n }\n }\n }\n\n this.formatted = undefined\n }\n\n get range () {\n if (this.formatted === undefined) {\n this.formatted = ''\n for (let i = 0; i < this.set.length; i++) {\n if (i > 0) {\n this.formatted += '||'\n }\n const comps = this.set[i]\n for (let k = 0; k < comps.length; k++) {\n if (k > 0) {\n this.formatted += ' '\n }\n this.formatted += comps[k].toString().trim()\n }\n }\n }\n return this.formatted\n }\n\n format () {\n return this.range\n }\n\n toString () {\n return this.range\n }\n\n parseRange (range) {\n // memoize range parsing for performance.\n // this is a very hot path, and fully deterministic.\n const memoOpts =\n (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) |\n (this.options.loose && FLAG_LOOSE)\n const memoKey = memoOpts + ':' + range\n const cached = cache.get(memoKey)\n if (cached) {\n return cached\n }\n\n const loose = this.options.loose\n // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`\n const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE]\n range = range.replace(hr, hyphenReplace(this.options.includePrerelease))\n debug('hyphen replace', range)\n\n // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`\n range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace)\n debug('comparator trim', range)\n\n // `~ 1.2.3` => `~1.2.3`\n range = range.replace(re[t.TILDETRIM], tildeTrimReplace)\n debug('tilde trim', range)\n\n // `^ 1.2.3` => `^1.2.3`\n range = range.replace(re[t.CARETTRIM], caretTrimReplace)\n debug('caret trim', range)\n\n // At this point, the range is completely trimmed and\n // ready to be split into comparators.\n\n let rangeList = range\n .split(' ')\n .map(comp => parseComparator(comp, this.options))\n .join(' ')\n .split(/\\s+/)\n // >=0.0.0 is equivalent to *\n .map(comp => replaceGTE0(comp, this.options))\n\n if (loose) {\n // in loose mode, throw out any that are not valid comparators\n rangeList = rangeList.filter(comp => {\n debug('loose invalid filter', comp, this.options)\n return !!comp.match(re[t.COMPARATORLOOSE])\n })\n }\n debug('range list', rangeList)\n\n // if any comparators are the null set, then replace with JUST null set\n // if more than one comparator, remove any * comparators\n // also, don't include the same comparator more than once\n const rangeMap = new Map()\n const comparators = rangeList.map(comp => new Comparator(comp, this.options))\n for (const comp of comparators) {\n if (isNullSet(comp)) {\n return [comp]\n }\n rangeMap.set(comp.value, comp)\n }\n if (rangeMap.size > 1 && rangeMap.has('')) {\n rangeMap.delete('')\n }\n\n const result = [...rangeMap.values()]\n cache.set(memoKey, result)\n return result\n }\n\n intersects (range, options) {\n if (!(range instanceof Range)) {\n throw new TypeError('a Range is required')\n }\n\n return this.set.some((thisComparators) => {\n return (\n isSatisfiable(thisComparators, options) &&\n range.set.some((rangeComparators) => {\n return (\n isSatisfiable(rangeComparators, options) &&\n thisComparators.every((thisComparator) => {\n return rangeComparators.every((rangeComparator) => {\n return thisComparator.intersects(rangeComparator, options)\n })\n })\n )\n })\n )\n })\n }\n\n // if ANY of the sets match ALL of its comparators, then pass\n test (version) {\n if (!version) {\n return false\n }\n\n if (typeof version === 'string') {\n try {\n version = new SemVer(version, this.options)\n } catch (er) {\n return false\n }\n }\n\n for (let i = 0; i < this.set.length; i++) {\n if (testSet(this.set[i], version, this.options)) {\n return true\n }\n }\n return false\n }\n}\n\nmodule.exports = Range\n\nconst LRU = require('../internal/lrucache')\nconst cache = new LRU()\n\nconst parseOptions = require('../internal/parse-options')\nconst Comparator = require('./comparator')\nconst debug = require('../internal/debug')\nconst SemVer = require('./semver')\nconst {\n safeRe: re,\n t,\n comparatorTrimReplace,\n tildeTrimReplace,\n caretTrimReplace,\n} = require('../internal/re')\nconst { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = require('../internal/constants')\n\nconst isNullSet = c => c.value === '<0.0.0-0'\nconst isAny = c => c.value === ''\n\n// take a set of comparators and determine whether there\n// exists a version which can satisfy it\nconst isSatisfiable = (comparators, options) => {\n let result = true\n const remainingComparators = comparators.slice()\n let testComparator = remainingComparators.pop()\n\n while (result && remainingComparators.length) {\n result = remainingComparators.every((otherComparator) => {\n return testComparator.intersects(otherComparator, options)\n })\n\n testComparator = remainingComparators.pop()\n }\n\n return result\n}\n\n// comprised of xranges, tildes, stars, and gtlt's at this point.\n// already replaced the hyphen ranges\n// turn into a set of JUST comparators.\nconst parseComparator = (comp, options) => {\n comp = comp.replace(re[t.BUILD], '')\n debug('comp', comp, options)\n comp = replaceCarets(comp, options)\n debug('caret', comp)\n comp = replaceTildes(comp, options)\n debug('tildes', comp)\n comp = replaceXRanges(comp, options)\n debug('xrange', comp)\n comp = replaceStars(comp, options)\n debug('stars', comp)\n return comp\n}\n\nconst isX = id => !id || id.toLowerCase() === 'x' || id === '*'\n\n// ~, ~> --> * (any, kinda silly)\n// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0\n// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0\n// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0\n// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0\n// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0\n// ~0.0.1 --> >=0.0.1 <0.1.0-0\nconst replaceTildes = (comp, options) => {\n return comp\n .trim()\n .split(/\\s+/)\n .map((c) => replaceTilde(c, options))\n .join(' ')\n}\n\nconst replaceTilde = (comp, options) => {\n const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE]\n return comp.replace(r, (_, M, m, p, pr) => {\n debug('tilde', comp, _, M, m, p, pr)\n let ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = `>=${M}.0.0 <${+M + 1}.0.0-0`\n } else if (isX(p)) {\n // ~1.2 == >=1.2.0 <1.3.0-0\n ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`\n } else if (pr) {\n debug('replaceTilde pr', pr)\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${+m + 1}.0-0`\n } else {\n // ~1.2.3 == >=1.2.3 <1.3.0-0\n ret = `>=${M}.${m}.${p\n } <${M}.${+m + 1}.0-0`\n }\n\n debug('tilde return', ret)\n return ret\n })\n}\n\n// ^ --> * (any, kinda silly)\n// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0\n// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0\n// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0\n// ^1.2.3 --> >=1.2.3 <2.0.0-0\n// ^1.2.0 --> >=1.2.0 <2.0.0-0\n// ^0.0.1 --> >=0.0.1 <0.0.2-0\n// ^0.1.0 --> >=0.1.0 <0.2.0-0\nconst replaceCarets = (comp, options) => {\n return comp\n .trim()\n .split(/\\s+/)\n .map((c) => replaceCaret(c, options))\n .join(' ')\n}\n\nconst replaceCaret = (comp, options) => {\n debug('caret', comp, options)\n const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET]\n const z = options.includePrerelease ? '-0' : ''\n return comp.replace(r, (_, M, m, p, pr) => {\n debug('caret', comp, _, M, m, p, pr)\n let ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`\n } else if (isX(p)) {\n if (M === '0') {\n ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`\n } else {\n ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`\n }\n } else if (pr) {\n debug('replaceCaret pr', pr)\n if (M === '0') {\n if (m === '0') {\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${m}.${+p + 1}-0`\n } else {\n ret = `>=${M}.${m}.${p}-${pr\n } <${M}.${+m + 1}.0-0`\n }\n } else {\n ret = `>=${M}.${m}.${p}-${pr\n } <${+M + 1}.0.0-0`\n }\n } else {\n debug('no pr')\n if (M === '0') {\n if (m === '0') {\n ret = `>=${M}.${m}.${p\n }${z} <${M}.${m}.${+p + 1}-0`\n } else {\n ret = `>=${M}.${m}.${p\n }${z} <${M}.${+m + 1}.0-0`\n }\n } else {\n ret = `>=${M}.${m}.${p\n } <${+M + 1}.0.0-0`\n }\n }\n\n debug('caret return', ret)\n return ret\n })\n}\n\nconst replaceXRanges = (comp, options) => {\n debug('replaceXRanges', comp, options)\n return comp\n .split(/\\s+/)\n .map((c) => replaceXRange(c, options))\n .join(' ')\n}\n\nconst replaceXRange = (comp, options) => {\n comp = comp.trim()\n const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE]\n return comp.replace(r, (ret, gtlt, M, m, p, pr) => {\n debug('xRange', comp, ret, gtlt, M, m, p, pr)\n const xM = isX(M)\n const xm = xM || isX(m)\n const xp = xm || isX(p)\n const anyX = xp\n\n if (gtlt === '=' && anyX) {\n gtlt = ''\n }\n\n // if we're including prereleases in the match, then we need\n // to fix this to -0, the lowest possible prerelease value\n pr = options.includePrerelease ? '-0' : ''\n\n if (xM) {\n if (gtlt === '>' || gtlt === '<') {\n // nothing is allowed\n ret = '<0.0.0-0'\n } else {\n // nothing is forbidden\n ret = '*'\n }\n } else if (gtlt && anyX) {\n // we know patch is an x, because we have any x at all.\n // replace X with 0\n if (xm) {\n m = 0\n }\n p = 0\n\n if (gtlt === '>') {\n // >1 => >=2.0.0\n // >1.2 => >=1.3.0\n gtlt = '>='\n if (xm) {\n M = +M + 1\n m = 0\n p = 0\n } else {\n m = +m + 1\n p = 0\n }\n } else if (gtlt === '<=') {\n // <=0.7.x is actually <0.8.0, since any 0.7.x should\n // pass. Similarly, <=7.x is actually <8.0.0, etc.\n gtlt = '<'\n if (xm) {\n M = +M + 1\n } else {\n m = +m + 1\n }\n }\n\n if (gtlt === '<') {\n pr = '-0'\n }\n\n ret = `${gtlt + M}.${m}.${p}${pr}`\n } else if (xm) {\n ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`\n } else if (xp) {\n ret = `>=${M}.${m}.0${pr\n } <${M}.${+m + 1}.0-0`\n }\n\n debug('xRange return', ret)\n\n return ret\n })\n}\n\n// Because * is AND-ed with everything else in the comparator,\n// and '' means \"any version\", just remove the *s entirely.\nconst replaceStars = (comp, options) => {\n debug('replaceStars', comp, options)\n // Looseness is ignored here. star is always as loose as it gets!\n return comp\n .trim()\n .replace(re[t.STAR], '')\n}\n\nconst replaceGTE0 = (comp, options) => {\n debug('replaceGTE0', comp, options)\n return comp\n .trim()\n .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '')\n}\n\n// This function is passed to string.replace(re[t.HYPHENRANGE])\n// M, m, patch, prerelease, build\n// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5\n// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do\n// 1.2 - 3.4 => >=1.2.0 <3.5.0-0\n// TODO build?\nconst hyphenReplace = incPr => ($0,\n from, fM, fm, fp, fpr, fb,\n to, tM, tm, tp, tpr) => {\n if (isX(fM)) {\n from = ''\n } else if (isX(fm)) {\n from = `>=${fM}.0.0${incPr ? '-0' : ''}`\n } else if (isX(fp)) {\n from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}`\n } else if (fpr) {\n from = `>=${from}`\n } else {\n from = `>=${from}${incPr ? '-0' : ''}`\n }\n\n if (isX(tM)) {\n to = ''\n } else if (isX(tm)) {\n to = `<${+tM + 1}.0.0-0`\n } else if (isX(tp)) {\n to = `<${tM}.${+tm + 1}.0-0`\n } else if (tpr) {\n to = `<=${tM}.${tm}.${tp}-${tpr}`\n } else if (incPr) {\n to = `<${tM}.${tm}.${+tp + 1}-0`\n } else {\n to = `<=${to}`\n }\n\n return `${from} ${to}`.trim()\n}\n\nconst testSet = (set, version, options) => {\n for (let i = 0; i < set.length; i++) {\n if (!set[i].test(version)) {\n return false\n }\n }\n\n if (version.prerelease.length && !options.includePrerelease) {\n // Find the set of versions that are allowed to have prereleases\n // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0\n // That should allow `1.2.3-pr.2` to pass.\n // However, `1.2.4-alpha.notready` should NOT be allowed,\n // even though it's within the range set by the comparators.\n for (let i = 0; i < set.length; i++) {\n debug(set[i].semver)\n if (set[i].semver === Comparator.ANY) {\n continue\n }\n\n if (set[i].semver.prerelease.length > 0) {\n const allowed = set[i].semver\n if (allowed.major === version.major &&\n allowed.minor === version.minor &&\n allowed.patch === version.patch) {\n return true\n }\n }\n }\n\n // Version has a -pre, but it's not one of the ones we like.\n return false\n }\n\n return true\n}\n","module.exports = __WEBPACK_EXTERNAL_MODULE__3059__;","'use strict'\n\nconst Range = require('../classes/range')\nconst satisfies = (version, range, options) => {\n try {\n range = new Range(range, options)\n } catch (er) {\n return false\n }\n return range.test(version)\n}\nmodule.exports = satisfies\n","module.exports = __WEBPACK_EXTERNAL_MODULE__3241__;","'use strict'\n\nconst Range = require('../classes/range')\n\n// Mostly just for testing and legacy API reasons\nconst toComparators = (range, options) =>\n new Range(range, options).set\n .map(comp => comp.map(c => c.value).join(' ').trim().split(' '))\n\nmodule.exports = toComparators\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst compare = (a, b, loose) =>\n new SemVer(a, loose).compare(new SemVer(b, loose))\n\nmodule.exports = compare\n","'use strict'\n\nconst compareBuild = require('./compare-build')\nconst sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose))\nmodule.exports = sort\n","'use strict'\n\nconst compare = require('./compare')\nconst gte = (a, b, loose) => compare(a, b, loose) >= 0\nmodule.exports = gte\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst parse = (version, options, throwErrors = false) => {\n if (version instanceof SemVer) {\n return version\n }\n try {\n return new SemVer(version, options)\n } catch (er) {\n if (!throwErrors) {\n return null\n }\n throw er\n }\n}\n\nmodule.exports = parse\n","'use strict'\n\nconst compare = require('./compare')\nconst lte = (a, b, loose) => compare(a, b, loose) <= 0\nmodule.exports = lte\n","'use strict'\n\nconst debug = require('../internal/debug')\nconst { MAX_LENGTH, MAX_SAFE_INTEGER } = require('../internal/constants')\nconst { safeRe: re, t } = require('../internal/re')\n\nconst parseOptions = require('../internal/parse-options')\nconst { compareIdentifiers } = require('../internal/identifiers')\nclass SemVer {\n constructor (version, options) {\n options = parseOptions(options)\n\n if (version instanceof SemVer) {\n if (version.loose === !!options.loose &&\n version.includePrerelease === !!options.includePrerelease) {\n return version\n } else {\n version = version.version\n }\n } else if (typeof version !== 'string') {\n throw new TypeError(`Invalid version. Must be a string. Got type \"${typeof version}\".`)\n }\n\n if (version.length > MAX_LENGTH) {\n throw new TypeError(\n `version is longer than ${MAX_LENGTH} characters`\n )\n }\n\n debug('SemVer', version, options)\n this.options = options\n this.loose = !!options.loose\n // this isn't actually relevant for versions, but keep it so that we\n // don't run into trouble passing this.options around.\n this.includePrerelease = !!options.includePrerelease\n\n const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL])\n\n if (!m) {\n throw new TypeError(`Invalid Version: ${version}`)\n }\n\n this.raw = version\n\n // these are actually numbers\n this.major = +m[1]\n this.minor = +m[2]\n this.patch = +m[3]\n\n if (this.major > MAX_SAFE_INTEGER || this.major < 0) {\n throw new TypeError('Invalid major version')\n }\n\n if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {\n throw new TypeError('Invalid minor version')\n }\n\n if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {\n throw new TypeError('Invalid patch version')\n }\n\n // numberify any prerelease numeric ids\n if (!m[4]) {\n this.prerelease = []\n } else {\n this.prerelease = m[4].split('.').map((id) => {\n if (/^[0-9]+$/.test(id)) {\n const num = +id\n if (num >= 0 && num < MAX_SAFE_INTEGER) {\n return num\n }\n }\n return id\n })\n }\n\n this.build = m[5] ? m[5].split('.') : []\n this.format()\n }\n\n format () {\n this.version = `${this.major}.${this.minor}.${this.patch}`\n if (this.prerelease.length) {\n this.version += `-${this.prerelease.join('.')}`\n }\n return this.version\n }\n\n toString () {\n return this.version\n }\n\n compare (other) {\n debug('SemVer.compare', this.version, this.options, other)\n if (!(other instanceof SemVer)) {\n if (typeof other === 'string' && other === this.version) {\n return 0\n }\n other = new SemVer(other, this.options)\n }\n\n if (other.version === this.version) {\n return 0\n }\n\n return this.compareMain(other) || this.comparePre(other)\n }\n\n compareMain (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n if (this.major < other.major) {\n return -1\n }\n if (this.major > other.major) {\n return 1\n }\n if (this.minor < other.minor) {\n return -1\n }\n if (this.minor > other.minor) {\n return 1\n }\n if (this.patch < other.patch) {\n return -1\n }\n if (this.patch > other.patch) {\n return 1\n }\n return 0\n }\n\n comparePre (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n // NOT having a prerelease is > having one\n if (this.prerelease.length && !other.prerelease.length) {\n return -1\n } else if (!this.prerelease.length && other.prerelease.length) {\n return 1\n } else if (!this.prerelease.length && !other.prerelease.length) {\n return 0\n }\n\n let i = 0\n do {\n const a = this.prerelease[i]\n const b = other.prerelease[i]\n debug('prerelease compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n compareBuild (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n let i = 0\n do {\n const a = this.build[i]\n const b = other.build[i]\n debug('build compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n // preminor will bump the version up to the next minor release, and immediately\n // down to pre-release. premajor and prepatch work the same way.\n inc (release, identifier, identifierBase) {\n if (release.startsWith('pre')) {\n if (!identifier && identifierBase === false) {\n throw new Error('invalid increment argument: identifier is empty')\n }\n // Avoid an invalid semver results\n if (identifier) {\n const match = `-${identifier}`.match(this.options.loose ? re[t.PRERELEASELOOSE] : re[t.PRERELEASE])\n if (!match || match[1] !== identifier) {\n throw new Error(`invalid identifier: ${identifier}`)\n }\n }\n }\n\n switch (release) {\n case 'premajor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor = 0\n this.major++\n this.inc('pre', identifier, identifierBase)\n break\n case 'preminor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor++\n this.inc('pre', identifier, identifierBase)\n break\n case 'prepatch':\n // If this is already a prerelease, it will bump to the next version\n // drop any prereleases that might already exist, since they are not\n // relevant at this point.\n this.prerelease.length = 0\n this.inc('patch', identifier, identifierBase)\n this.inc('pre', identifier, identifierBase)\n break\n // If the input is a non-prerelease version, this acts the same as\n // prepatch.\n case 'prerelease':\n if (this.prerelease.length === 0) {\n this.inc('patch', identifier, identifierBase)\n }\n this.inc('pre', identifier, identifierBase)\n break\n case 'release':\n if (this.prerelease.length === 0) {\n throw new Error(`version ${this.raw} is not a prerelease`)\n }\n this.prerelease.length = 0\n break\n\n case 'major':\n // If this is a pre-major version, bump up to the same major version.\n // Otherwise increment major.\n // 1.0.0-5 bumps to 1.0.0\n // 1.1.0 bumps to 2.0.0\n if (\n this.minor !== 0 ||\n this.patch !== 0 ||\n this.prerelease.length === 0\n ) {\n this.major++\n }\n this.minor = 0\n this.patch = 0\n this.prerelease = []\n break\n case 'minor':\n // If this is a pre-minor version, bump up to the same minor version.\n // Otherwise increment minor.\n // 1.2.0-5 bumps to 1.2.0\n // 1.2.1 bumps to 1.3.0\n if (this.patch !== 0 || this.prerelease.length === 0) {\n this.minor++\n }\n this.patch = 0\n this.prerelease = []\n break\n case 'patch':\n // If this is not a pre-release version, it will increment the patch.\n // If it is a pre-release it will bump up to the same patch version.\n // 1.2.0-5 patches to 1.2.0\n // 1.2.0 patches to 1.2.1\n if (this.prerelease.length === 0) {\n this.patch++\n }\n this.prerelease = []\n break\n // This probably shouldn't be used publicly.\n // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.\n case 'pre': {\n const base = Number(identifierBase) ? 1 : 0\n\n if (this.prerelease.length === 0) {\n this.prerelease = [base]\n } else {\n let i = this.prerelease.length\n while (--i >= 0) {\n if (typeof this.prerelease[i] === 'number') {\n this.prerelease[i]++\n i = -2\n }\n }\n if (i === -1) {\n // didn't increment anything\n if (identifier === this.prerelease.join('.') && identifierBase === false) {\n throw new Error('invalid increment argument: identifier already exists')\n }\n this.prerelease.push(base)\n }\n }\n if (identifier) {\n // 1.2.0-beta.1 bumps to 1.2.0-beta.2,\n // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0\n let prerelease = [identifier, base]\n if (identifierBase === false) {\n prerelease = [identifier]\n }\n if (compareIdentifiers(this.prerelease[0], identifier) === 0) {\n if (isNaN(this.prerelease[1])) {\n this.prerelease = prerelease\n }\n } else {\n this.prerelease = prerelease\n }\n }\n break\n }\n default:\n throw new Error(`invalid increment argument: ${release}`)\n }\n this.raw = this.format()\n if (this.build.length) {\n this.raw += `+${this.build.join('.')}`\n }\n return this\n }\n}\n\nmodule.exports = SemVer\n","'use strict'\n\nconst parse = require('./parse.js')\n\nconst diff = (version1, version2) => {\n const v1 = parse(version1, null, true)\n const v2 = parse(version2, null, true)\n const comparison = v1.compare(v2)\n\n if (comparison === 0) {\n return null\n }\n\n const v1Higher = comparison > 0\n const highVersion = v1Higher ? v1 : v2\n const lowVersion = v1Higher ? v2 : v1\n const highHasPre = !!highVersion.prerelease.length\n const lowHasPre = !!lowVersion.prerelease.length\n\n if (lowHasPre && !highHasPre) {\n // Going from prerelease -> no prerelease requires some special casing\n\n // If the low version has only a major, then it will always be a major\n // Some examples:\n // 1.0.0-1 -> 1.0.0\n // 1.0.0-1 -> 1.1.1\n // 1.0.0-1 -> 2.0.0\n if (!lowVersion.patch && !lowVersion.minor) {\n return 'major'\n }\n\n // If the main part has no difference\n if (lowVersion.compareMain(highVersion) === 0) {\n if (lowVersion.minor && !lowVersion.patch) {\n return 'minor'\n }\n return 'patch'\n }\n }\n\n // add the `pre` prefix if we are going to a prerelease version\n const prefix = highHasPre ? 'pre' : ''\n\n if (v1.major !== v2.major) {\n return prefix + 'major'\n }\n\n if (v1.minor !== v2.minor) {\n return prefix + 'minor'\n }\n\n if (v1.patch !== v2.patch) {\n return prefix + 'patch'\n }\n\n // high and low are preleases\n return 'prerelease'\n}\n\nmodule.exports = diff\n","'use strict'\n\nconst eq = require('./eq')\nconst neq = require('./neq')\nconst gt = require('./gt')\nconst gte = require('./gte')\nconst lt = require('./lt')\nconst lte = require('./lte')\n\nconst cmp = (a, op, b, loose) => {\n switch (op) {\n case '===':\n if (typeof a === 'object') {\n a = a.version\n }\n if (typeof b === 'object') {\n b = b.version\n }\n return a === b\n\n case '!==':\n if (typeof a === 'object') {\n a = a.version\n }\n if (typeof b === 'object') {\n b = b.version\n }\n return a !== b\n\n case '':\n case '=':\n case '==':\n return eq(a, b, loose)\n\n case '!=':\n return neq(a, b, loose)\n\n case '>':\n return gt(a, b, loose)\n\n case '>=':\n return gte(a, b, loose)\n\n case '<':\n return lt(a, b, loose)\n\n case '<=':\n return lte(a, b, loose)\n\n default:\n throw new TypeError(`Invalid operator: ${op}`)\n }\n}\nmodule.exports = cmp\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst patch = (a, loose) => new SemVer(a, loose).patch\nmodule.exports = patch\n","'use strict'\n\nconst compare = require('./compare')\nconst compareLoose = (a, b) => compare(a, b, true)\nmodule.exports = compareLoose\n","'use strict'\n\nconst {\n MAX_SAFE_COMPONENT_LENGTH,\n MAX_SAFE_BUILD_LENGTH,\n MAX_LENGTH,\n} = require('./constants')\nconst debug = require('./debug')\nexports = module.exports = {}\n\n// The actual regexps go on exports.re\nconst re = exports.re = []\nconst safeRe = exports.safeRe = []\nconst src = exports.src = []\nconst safeSrc = exports.safeSrc = []\nconst t = exports.t = {}\nlet R = 0\n\nconst LETTERDASHNUMBER = '[a-zA-Z0-9-]'\n\n// Replace some greedy regex tokens to prevent regex dos issues. These regex are\n// used internally via the safeRe object since all inputs in this library get\n// normalized first to trim and collapse all extra whitespace. The original\n// regexes are exported for userland consumption and lower level usage. A\n// future breaking change could export the safer regex only with a note that\n// all input should have extra whitespace removed.\nconst safeRegexReplacements = [\n ['\\\\s', 1],\n ['\\\\d', MAX_LENGTH],\n [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH],\n]\n\nconst makeSafeRegex = (value) => {\n for (const [token, max] of safeRegexReplacements) {\n value = value\n .split(`${token}*`).join(`${token}{0,${max}}`)\n .split(`${token}+`).join(`${token}{1,${max}}`)\n }\n return value\n}\n\nconst createToken = (name, value, isGlobal) => {\n const safe = makeSafeRegex(value)\n const index = R++\n debug(name, index, value)\n t[name] = index\n src[index] = value\n safeSrc[index] = safe\n re[index] = new RegExp(value, isGlobal ? 'g' : undefined)\n safeRe[index] = new RegExp(safe, isGlobal ? 'g' : undefined)\n}\n\n// The following Regular Expressions can be used for tokenizing,\n// validating, and parsing SemVer version strings.\n\n// ## Numeric Identifier\n// A single `0`, or a non-zero digit followed by zero or more digits.\n\ncreateToken('NUMERICIDENTIFIER', '0|[1-9]\\\\d*')\ncreateToken('NUMERICIDENTIFIERLOOSE', '\\\\d+')\n\n// ## Non-numeric Identifier\n// Zero or more digits, followed by a letter or hyphen, and then zero or\n// more letters, digits, or hyphens.\n\ncreateToken('NONNUMERICIDENTIFIER', `\\\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`)\n\n// ## Main Version\n// Three dot-separated numeric identifiers.\n\ncreateToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})`)\n\ncreateToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})`)\n\n// ## Pre-release Version Identifier\n// A numeric identifier, or a non-numeric identifier.\n// Non-numberic identifiers include numberic identifiers but can be longer.\n// Therefore non-numberic identifiers must go first.\n\ncreateToken('PRERELEASEIDENTIFIER', `(?:${src[t.NONNUMERICIDENTIFIER]\n}|${src[t.NUMERICIDENTIFIER]})`)\n\ncreateToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NONNUMERICIDENTIFIER]\n}|${src[t.NUMERICIDENTIFIERLOOSE]})`)\n\n// ## Pre-release Version\n// Hyphen, followed by one or more dot-separated pre-release version\n// identifiers.\n\ncreateToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIER]})*))`)\n\ncreateToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`)\n\n// ## Build Metadata Identifier\n// Any combination of digits, letters, or hyphens.\n\ncreateToken('BUILDIDENTIFIER', `${LETTERDASHNUMBER}+`)\n\n// ## Build Metadata\n// Plus sign, followed by one or more period-separated build metadata\n// identifiers.\n\ncreateToken('BUILD', `(?:\\\\+(${src[t.BUILDIDENTIFIER]\n}(?:\\\\.${src[t.BUILDIDENTIFIER]})*))`)\n\n// ## Full Version String\n// A main version, followed optionally by a pre-release version and\n// build metadata.\n\n// Note that the only major, minor, patch, and pre-release sections of\n// the version string are capturing groups. The build metadata is not a\n// capturing group, because it should not ever be used in version\n// comparison.\n\ncreateToken('FULLPLAIN', `v?${src[t.MAINVERSION]\n}${src[t.PRERELEASE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('FULL', `^${src[t.FULLPLAIN]}$`)\n\n// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.\n// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty\n// common in the npm registry.\ncreateToken('LOOSEPLAIN', `[v=\\\\s]*${src[t.MAINVERSIONLOOSE]\n}${src[t.PRERELEASELOOSE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`)\n\ncreateToken('GTLT', '((?:<|>)?=?)')\n\n// Something like \"2.*\" or \"1.2.x\".\n// Note that \"x.x\" is a valid xRange identifer, meaning \"any version\"\n// Only the first item is strictly required.\ncreateToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\\\*`)\ncreateToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\\\*`)\n\ncreateToken('XRANGEPLAIN', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:${src[t.PRERELEASE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGEPLAINLOOSE', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:${src[t.PRERELEASELOOSE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAIN]}$`)\ncreateToken('XRANGELOOSE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Coercion.\n// Extract anything that could conceivably be a part of a valid semver\ncreateToken('COERCEPLAIN', `${'(^|[^\\\\d])' +\n '(\\\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`)\ncreateToken('COERCE', `${src[t.COERCEPLAIN]}(?:$|[^\\\\d])`)\ncreateToken('COERCEFULL', src[t.COERCEPLAIN] +\n `(?:${src[t.PRERELEASE]})?` +\n `(?:${src[t.BUILD]})?` +\n `(?:$|[^\\\\d])`)\ncreateToken('COERCERTL', src[t.COERCE], true)\ncreateToken('COERCERTLFULL', src[t.COERCEFULL], true)\n\n// Tilde ranges.\n// Meaning is \"reasonably at or greater than\"\ncreateToken('LONETILDE', '(?:~>?)')\n\ncreateToken('TILDETRIM', `(\\\\s*)${src[t.LONETILDE]}\\\\s+`, true)\nexports.tildeTrimReplace = '$1~'\n\ncreateToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Caret ranges.\n// Meaning is \"at least and backwards compatible with\"\ncreateToken('LONECARET', '(?:\\\\^)')\n\ncreateToken('CARETTRIM', `(\\\\s*)${src[t.LONECARET]}\\\\s+`, true)\nexports.caretTrimReplace = '$1^'\n\ncreateToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// A simple gt/lt/eq thing, or just \"\" to indicate \"any version\"\ncreateToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\\\s*(${src[t.LOOSEPLAIN]})$|^$`)\ncreateToken('COMPARATOR', `^${src[t.GTLT]}\\\\s*(${src[t.FULLPLAIN]})$|^$`)\n\n// An expression to strip any whitespace between the gtlt and the thing\n// it modifies, so that `> 1.2.3` ==> `>1.2.3`\ncreateToken('COMPARATORTRIM', `(\\\\s*)${src[t.GTLT]\n}\\\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true)\nexports.comparatorTrimReplace = '$1$2$3'\n\n// Something like `1.2.3 - 1.2.4`\n// Note that these all use the loose form, because they'll be\n// checked against either the strict or loose comparator form\n// later.\ncreateToken('HYPHENRANGE', `^\\\\s*(${src[t.XRANGEPLAIN]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAIN]})` +\n `\\\\s*$`)\n\ncreateToken('HYPHENRANGELOOSE', `^\\\\s*(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s*$`)\n\n// Star ranges basically just allow anything at all.\ncreateToken('STAR', '(<|>)?=?\\\\s*\\\\*')\n// >=0.0.0 is like a star\ncreateToken('GTE0', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0\\\\s*$')\ncreateToken('GTE0PRE', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0-0\\\\s*$')\n","module.exports = __WEBPACK_EXTERNAL_MODULE__5959__;","'use strict'\n\nconst compare = require('./compare')\nconst neq = (a, b, loose) => compare(a, b, loose) !== 0\nmodule.exports = neq\n","module.exports = __WEBPACK_EXTERNAL_MODULE__6089__;","'use strict'\n\nconst parse = require('./parse')\nconst prerelease = (version, options) => {\n const parsed = parse(version, options)\n return (parsed && parsed.prerelease.length) ? parsed.prerelease : null\n}\nmodule.exports = prerelease\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\n\nconst maxSatisfying = (versions, range, options) => {\n let max = null\n let maxSV = null\n let rangeObj = null\n try {\n rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach((v) => {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!max || maxSV.compare(v) === -1) {\n // compare(max, v, true)\n max = v\n maxSV = new SemVer(max, options)\n }\n }\n })\n return max\n}\nmodule.exports = maxSatisfying\n","'use strict'\n\n// Determine if version is greater than all the versions possible in the range.\nconst outside = require('./outside')\nconst gtr = (version, range, options) => outside(version, range, '>', options)\nmodule.exports = gtr\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Range = require('../classes/range')\nconst gt = require('../functions/gt')\n\nconst minVersion = (range, loose) => {\n range = new Range(range, loose)\n\n let minver = new SemVer('0.0.0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = new SemVer('0.0.0-0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = null\n for (let i = 0; i < range.set.length; ++i) {\n const comparators = range.set[i]\n\n let setMin = null\n comparators.forEach((comparator) => {\n // Clone to avoid manipulating the comparator's semver object.\n const compver = new SemVer(comparator.semver.version)\n switch (comparator.operator) {\n case '>':\n if (compver.prerelease.length === 0) {\n compver.patch++\n } else {\n compver.prerelease.push(0)\n }\n compver.raw = compver.format()\n /* fallthrough */\n case '':\n case '>=':\n if (!setMin || gt(compver, setMin)) {\n setMin = compver\n }\n break\n case '<':\n case '<=':\n /* Ignore maximum versions */\n break\n /* istanbul ignore next */\n default:\n throw new Error(`Unexpected operation: ${comparator.operator}`)\n }\n })\n if (setMin && (!minver || gt(minver, setMin))) {\n minver = setMin\n }\n }\n\n if (minver && range.test(minver)) {\n return minver\n }\n\n return null\n}\nmodule.exports = minVersion\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst compareBuild = (a, b, loose) => {\n const versionA = new SemVer(a, loose)\n const versionB = new SemVer(b, loose)\n return versionA.compare(versionB) || versionA.compareBuild(versionB)\n}\nmodule.exports = compareBuild\n","'use strict'\n\nconst compare = require('./compare')\nconst rcompare = (a, b, loose) => compare(b, a, loose)\nmodule.exports = rcompare\n","module.exports = __WEBPACK_EXTERNAL_MODULE__7694__;","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst Comparator = require('../classes/comparator')\nconst { ANY } = Comparator\nconst Range = require('../classes/range')\nconst satisfies = require('../functions/satisfies')\nconst gt = require('../functions/gt')\nconst lt = require('../functions/lt')\nconst lte = require('../functions/lte')\nconst gte = require('../functions/gte')\n\nconst outside = (version, range, hilo, options) => {\n version = new SemVer(version, options)\n range = new Range(range, options)\n\n let gtfn, ltefn, ltfn, comp, ecomp\n switch (hilo) {\n case '>':\n gtfn = gt\n ltefn = lte\n ltfn = lt\n comp = '>'\n ecomp = '>='\n break\n case '<':\n gtfn = lt\n ltefn = gte\n ltfn = gt\n comp = '<'\n ecomp = '<='\n break\n default:\n throw new TypeError('Must provide a hilo val of \"<\" or \">\"')\n }\n\n // If it satisfies the range it is not outside\n if (satisfies(version, range, options)) {\n return false\n }\n\n // From now on, variable terms are as if we're in \"gtr\" mode.\n // but note that everything is flipped for the \"ltr\" function.\n\n for (let i = 0; i < range.set.length; ++i) {\n const comparators = range.set[i]\n\n let high = null\n let low = null\n\n comparators.forEach((comparator) => {\n if (comparator.semver === ANY) {\n comparator = new Comparator('>=0.0.0')\n }\n high = high || comparator\n low = low || comparator\n if (gtfn(comparator.semver, high.semver, options)) {\n high = comparator\n } else if (ltfn(comparator.semver, low.semver, options)) {\n low = comparator\n }\n })\n\n // If the edge version comparator has a operator then our version\n // isn't outside it\n if (high.operator === comp || high.operator === ecomp) {\n return false\n }\n\n // If the lowest version comparator has an operator and our version\n // is less than it then it isn't higher than the range\n if ((!low.operator || low.operator === comp) &&\n ltefn(version, low.semver)) {\n return false\n } else if (low.operator === ecomp && ltfn(version, low.semver)) {\n return false\n }\n }\n return true\n}\n\nmodule.exports = outside\n","module.exports = __WEBPACK_EXTERNAL_MODULE__7781__;","/**\n * @license React\n * react-jsx-runtime.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 */\n'use strict';var f=require(\"react\"),k=Symbol.for(\"react.element\"),l=Symbol.for(\"react.fragment\"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};\nfunction q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=\"\"+g);void 0!==a.key&&(e=\"\"+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}exports.Fragment=l;exports.jsx=q;exports.jsxs=q;\n","'use strict'\n\n// given a set of versions and a range, create a \"simplified\" range\n// that includes the same versions that the original range does\n// If the original range is shorter than the simplified one, return that.\nconst satisfies = require('../functions/satisfies.js')\nconst compare = require('../functions/compare.js')\nmodule.exports = (versions, range, options) => {\n const set = []\n let first = null\n let prev = null\n const v = versions.sort((a, b) => compare(a, b, options))\n for (const version of v) {\n const included = satisfies(version, range, options)\n if (included) {\n prev = version\n if (!first) {\n first = version\n }\n } else {\n if (prev) {\n set.push([first, prev])\n }\n prev = null\n first = null\n }\n }\n if (first) {\n set.push([first, null])\n }\n\n const ranges = []\n for (const [min, max] of set) {\n if (min === max) {\n ranges.push(min)\n } else if (!max && min === v[0]) {\n ranges.push('*')\n } else if (!max) {\n ranges.push(`>=${min}`)\n } else if (min === v[0]) {\n ranges.push(`<=${max}`)\n } else {\n ranges.push(`${min} - ${max}`)\n }\n }\n const simplified = ranges.join(' || ')\n const original = typeof range.raw === 'string' ? range.raw : String(range)\n return simplified.length < original.length ? simplified : range\n}\n","module.exports = __WEBPACK_EXTERNAL_MODULE__8531__;","'use strict'\n\nconst parse = require('./parse')\nconst clean = (version, options) => {\n const s = parse(version.trim().replace(/^[=v]+/, ''), options)\n return s ? s.version : null\n}\nmodule.exports = clean\n","'use strict'\n\nconst ANY = Symbol('SemVer ANY')\n// hoisted class for cyclic dependency\nclass Comparator {\n static get ANY () {\n return ANY\n }\n\n constructor (comp, options) {\n options = parseOptions(options)\n\n if (comp instanceof Comparator) {\n if (comp.loose === !!options.loose) {\n return comp\n } else {\n comp = comp.value\n }\n }\n\n comp = comp.trim().split(/\\s+/).join(' ')\n debug('comparator', comp, options)\n this.options = options\n this.loose = !!options.loose\n this.parse(comp)\n\n if (this.semver === ANY) {\n this.value = ''\n } else {\n this.value = this.operator + this.semver.version\n }\n\n debug('comp', this)\n }\n\n parse (comp) {\n const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]\n const m = comp.match(r)\n\n if (!m) {\n throw new TypeError(`Invalid comparator: ${comp}`)\n }\n\n this.operator = m[1] !== undefined ? m[1] : ''\n if (this.operator === '=') {\n this.operator = ''\n }\n\n // if it literally is just '>' or '' then allow anything.\n if (!m[2]) {\n this.semver = ANY\n } else {\n this.semver = new SemVer(m[2], this.options.loose)\n }\n }\n\n toString () {\n return this.value\n }\n\n test (version) {\n debug('Comparator.test', version, this.options.loose)\n\n if (this.semver === ANY || version === ANY) {\n return true\n }\n\n if (typeof version === 'string') {\n try {\n version = new SemVer(version, this.options)\n } catch (er) {\n return false\n }\n }\n\n return cmp(version, this.operator, this.semver, this.options)\n }\n\n intersects (comp, options) {\n if (!(comp instanceof Comparator)) {\n throw new TypeError('a Comparator is required')\n }\n\n if (this.operator === '') {\n if (this.value === '') {\n return true\n }\n return new Range(comp.value, options).test(this.value)\n } else if (comp.operator === '') {\n if (comp.value === '') {\n return true\n }\n return new Range(this.value, options).test(comp.semver)\n }\n\n options = parseOptions(options)\n\n // Special cases where nothing can possibly be lower\n if (options.includePrerelease &&\n (this.value === '<0.0.0-0' || comp.value === '<0.0.0-0')) {\n return false\n }\n if (!options.includePrerelease &&\n (this.value.startsWith('<0.0.0') || comp.value.startsWith('<0.0.0'))) {\n return false\n }\n\n // Same direction increasing (> or >=)\n if (this.operator.startsWith('>') && comp.operator.startsWith('>')) {\n return true\n }\n // Same direction decreasing (< or <=)\n if (this.operator.startsWith('<') && comp.operator.startsWith('<')) {\n return true\n }\n // same SemVer and both sides are inclusive (<= or >=)\n if (\n (this.semver.version === comp.semver.version) &&\n this.operator.includes('=') && comp.operator.includes('=')) {\n return true\n }\n // opposite directions less than\n if (cmp(this.semver, '<', comp.semver, options) &&\n this.operator.startsWith('>') && comp.operator.startsWith('<')) {\n return true\n }\n // opposite directions greater than\n if (cmp(this.semver, '>', comp.semver, options) &&\n this.operator.startsWith('<') && comp.operator.startsWith('>')) {\n return true\n }\n return false\n }\n}\n\nmodule.exports = Comparator\n\nconst parseOptions = require('../internal/parse-options')\nconst { safeRe: re, t } = require('../internal/re')\nconst cmp = require('../functions/cmp')\nconst debug = require('../internal/debug')\nconst SemVer = require('./semver')\nconst Range = require('./range')\n","'use strict'\n\nconst compare = require('./compare')\nconst gt = (a, b, loose) => compare(a, b, loose) > 0\nmodule.exports = gt\n","'use strict'\n\nconst SemVer = require('../classes/semver')\nconst minor = (a, loose) => new SemVer(a, loose).minor\nmodule.exports = minor\n","'use strict'\n\n// parse out just the options we care about\nconst looseOption = Object.freeze({ loose: true })\nconst emptyOpts = Object.freeze({ })\nconst parseOptions = options => {\n if (!options) {\n return emptyOpts\n }\n\n if (typeof options !== 'object') {\n return looseOption\n }\n\n return options\n}\nmodule.exports = parseOptions\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.min.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","'use strict'\n\nconst parse = require('./parse')\nconst valid = (version, options) => {\n const v = parse(version, options)\n return v ? v.version : null\n}\nmodule.exports = valid\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"public/plugins/graphite/\";","\n import amdMetaModule from 'amd-module';\n\n __webpack_public_path__ =\n amdMetaModule && amdMetaModule.uri\n ? amdMetaModule.uri.slice(0, amdMetaModule.uri.lastIndexOf('/') + 1)\n : 'public/plugins/graphite/';\n ","// src/index.ts\nexport * from \"redux\";\nimport { produce, current as current3, freeze, original as original2, isDraft as isDraft5 } from \"immer\";\nimport { createSelector, createSelectorCreator as createSelectorCreator2, lruMemoize, weakMapMemoize as weakMapMemoize2 } from \"reselect\";\n\n// src/createDraftSafeSelector.ts\nimport { current, isDraft } from \"immer\";\nimport { createSelectorCreator, weakMapMemoize } from \"reselect\";\nvar createDraftSafeSelectorCreator = (...args) => {\n const createSelector2 = createSelectorCreator(...args);\n const createDraftSafeSelector2 = Object.assign((...args2) => {\n const selector = createSelector2(...args2);\n const wrappedSelector = (value, ...rest) => selector(isDraft(value) ? current(value) : value, ...rest);\n Object.assign(wrappedSelector, selector);\n return wrappedSelector;\n }, {\n withTypes: () => createDraftSafeSelector2\n });\n return createDraftSafeSelector2;\n};\nvar createDraftSafeSelector = /* @__PURE__ */ createDraftSafeSelectorCreator(weakMapMemoize);\n\n// src/configureStore.ts\nimport { applyMiddleware, createStore, compose as compose2, combineReducers, isPlainObject as isPlainObject2 } from \"redux\";\n\n// src/devtoolsExtension.ts\nimport { compose } from \"redux\";\nvar composeWithDevTools = typeof window !== \"undefined\" && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ : function() {\n if (arguments.length === 0) return void 0;\n if (typeof arguments[0] === \"object\") return compose;\n return compose.apply(null, arguments);\n};\nvar devToolsEnhancer = typeof window !== \"undefined\" && window.__REDUX_DEVTOOLS_EXTENSION__ ? window.__REDUX_DEVTOOLS_EXTENSION__ : function() {\n return function(noop3) {\n return noop3;\n };\n};\n\n// src/getDefaultMiddleware.ts\nimport { thunk as thunkMiddleware, withExtraArgument } from \"redux-thunk\";\n\n// src/createAction.ts\nimport { isAction } from \"redux\";\n\n// src/tsHelpers.ts\nvar hasMatchFunction = (v) => {\n return v && typeof v.match === \"function\";\n};\n\n// src/createAction.ts\nfunction createAction(type, prepareAction) {\n function actionCreator(...args) {\n if (prepareAction) {\n let prepared = prepareAction(...args);\n if (!prepared) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(0) : \"prepareAction did not return an object\");\n }\n return {\n type,\n payload: prepared.payload,\n ...\"meta\" in prepared && {\n meta: prepared.meta\n },\n ...\"error\" in prepared && {\n error: prepared.error\n }\n };\n }\n return {\n type,\n payload: args[0]\n };\n }\n actionCreator.toString = () => `${type}`;\n actionCreator.type = type;\n actionCreator.match = (action) => isAction(action) && action.type === type;\n return actionCreator;\n}\nfunction isActionCreator(action) {\n return typeof action === \"function\" && \"type\" in action && // hasMatchFunction only wants Matchers but I don't see the point in rewriting it\n hasMatchFunction(action);\n}\nfunction isFSA(action) {\n return isAction(action) && Object.keys(action).every(isValidKey);\n}\nfunction isValidKey(key) {\n return [\"type\", \"payload\", \"error\", \"meta\"].indexOf(key) > -1;\n}\n\n// src/actionCreatorInvariantMiddleware.ts\nfunction getMessage(type) {\n const splitType = type ? `${type}`.split(\"/\") : [];\n const actionName = splitType[splitType.length - 1] || \"actionCreator\";\n return `Detected an action creator with type \"${type || \"unknown\"}\" being dispatched. \nMake sure you're calling the action creator before dispatching, i.e. \\`dispatch(${actionName}())\\` instead of \\`dispatch(${actionName})\\`. This is necessary even if the action has no payload.`;\n}\nfunction createActionCreatorInvariantMiddleware(options = {}) {\n if (process.env.NODE_ENV === \"production\") {\n return () => (next) => (action) => next(action);\n }\n const {\n isActionCreator: isActionCreator2 = isActionCreator\n } = options;\n return () => (next) => (action) => {\n if (isActionCreator2(action)) {\n console.warn(getMessage(action.type));\n }\n return next(action);\n };\n}\n\n// src/utils.ts\nimport { produce as createNextState, isDraftable } from \"immer\";\nfunction getTimeMeasureUtils(maxDelay, fnName) {\n let elapsed = 0;\n return {\n measureTime(fn) {\n const started = Date.now();\n try {\n return fn();\n } finally {\n const finished = Date.now();\n elapsed += finished - started;\n }\n },\n warnIfExceeded() {\n if (elapsed > maxDelay) {\n console.warn(`${fnName} took ${elapsed}ms, which is more than the warning threshold of ${maxDelay}ms. \nIf your state or actions are very large, you may want to disable the middleware as it might cause too much of a slowdown in development mode. See https://redux-toolkit.js.org/api/getDefaultMiddleware for instructions.\nIt is disabled in production builds, so you don't need to worry about that.`);\n }\n }\n };\n}\nvar Tuple = class _Tuple extends Array {\n constructor(...items) {\n super(...items);\n Object.setPrototypeOf(this, _Tuple.prototype);\n }\n static get [Symbol.species]() {\n return _Tuple;\n }\n concat(...arr) {\n return super.concat.apply(this, arr);\n }\n prepend(...arr) {\n if (arr.length === 1 && Array.isArray(arr[0])) {\n return new _Tuple(...arr[0].concat(this));\n }\n return new _Tuple(...arr.concat(this));\n }\n};\nfunction freezeDraftable(val) {\n return isDraftable(val) ? createNextState(val, () => {\n }) : val;\n}\nfunction getOrInsertComputed(map, key, compute) {\n if (map.has(key)) return map.get(key);\n return map.set(key, compute(key)).get(key);\n}\n\n// src/immutableStateInvariantMiddleware.ts\nfunction isImmutableDefault(value) {\n return typeof value !== \"object\" || value == null || Object.isFrozen(value);\n}\nfunction trackForMutations(isImmutable, ignorePaths, obj) {\n const trackedProperties = trackProperties(isImmutable, ignorePaths, obj);\n return {\n detectMutations() {\n return detectMutations(isImmutable, ignorePaths, trackedProperties, obj);\n }\n };\n}\nfunction trackProperties(isImmutable, ignorePaths = [], obj, path = \"\", checkedObjects = /* @__PURE__ */ new Set()) {\n const tracked = {\n value: obj\n };\n if (!isImmutable(obj) && !checkedObjects.has(obj)) {\n checkedObjects.add(obj);\n tracked.children = {};\n for (const key in obj) {\n const childPath = path ? path + \".\" + key : key;\n if (ignorePaths.length && ignorePaths.indexOf(childPath) !== -1) {\n continue;\n }\n tracked.children[key] = trackProperties(isImmutable, ignorePaths, obj[key], childPath);\n }\n }\n return tracked;\n}\nfunction detectMutations(isImmutable, ignoredPaths = [], trackedProperty, obj, sameParentRef = false, path = \"\") {\n const prevObj = trackedProperty ? trackedProperty.value : void 0;\n const sameRef = prevObj === obj;\n if (sameParentRef && !sameRef && !Number.isNaN(obj)) {\n return {\n wasMutated: true,\n path\n };\n }\n if (isImmutable(prevObj) || isImmutable(obj)) {\n return {\n wasMutated: false\n };\n }\n const keysToDetect = {};\n for (let key in trackedProperty.children) {\n keysToDetect[key] = true;\n }\n for (let key in obj) {\n keysToDetect[key] = true;\n }\n const hasIgnoredPaths = ignoredPaths.length > 0;\n for (let key in keysToDetect) {\n const nestedPath = path ? path + \".\" + key : key;\n if (hasIgnoredPaths) {\n const hasMatches = ignoredPaths.some((ignored) => {\n if (ignored instanceof RegExp) {\n return ignored.test(nestedPath);\n }\n return nestedPath === ignored;\n });\n if (hasMatches) {\n continue;\n }\n }\n const result = detectMutations(isImmutable, ignoredPaths, trackedProperty.children[key], obj[key], sameRef, nestedPath);\n if (result.wasMutated) {\n return result;\n }\n }\n return {\n wasMutated: false\n };\n}\nfunction createImmutableStateInvariantMiddleware(options = {}) {\n if (process.env.NODE_ENV === \"production\") {\n return () => (next) => (action) => next(action);\n } else {\n let stringify2 = function(obj, serializer, indent, decycler) {\n return JSON.stringify(obj, getSerialize2(serializer, decycler), indent);\n }, getSerialize2 = function(serializer, decycler) {\n let stack = [], keys = [];\n if (!decycler) decycler = function(_, value) {\n if (stack[0] === value) return \"[Circular ~]\";\n return \"[Circular ~.\" + keys.slice(0, stack.indexOf(value)).join(\".\") + \"]\";\n };\n return function(key, value) {\n if (stack.length > 0) {\n var thisPos = stack.indexOf(this);\n ~thisPos ? stack.splice(thisPos + 1) : stack.push(this);\n ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key);\n if (~stack.indexOf(value)) value = decycler.call(this, key, value);\n } else stack.push(value);\n return serializer == null ? value : serializer.call(this, key, value);\n };\n };\n var stringify = stringify2, getSerialize = getSerialize2;\n let {\n isImmutable = isImmutableDefault,\n ignoredPaths,\n warnAfter = 32\n } = options;\n const track = trackForMutations.bind(null, isImmutable, ignoredPaths);\n return ({\n getState\n }) => {\n let state = getState();\n let tracker = track(state);\n let result;\n return (next) => (action) => {\n const measureUtils = getTimeMeasureUtils(warnAfter, \"ImmutableStateInvariantMiddleware\");\n measureUtils.measureTime(() => {\n state = getState();\n result = tracker.detectMutations();\n tracker = track(state);\n if (result.wasMutated) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(19) : `A state mutation was detected between dispatches, in the path '${result.path || \"\"}'. This may cause incorrect behavior. (https://redux.js.org/style-guide/style-guide#do-not-mutate-state)`);\n }\n });\n const dispatchedAction = next(action);\n measureUtils.measureTime(() => {\n state = getState();\n result = tracker.detectMutations();\n tracker = track(state);\n if (result.wasMutated) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(20) : `A state mutation was detected inside a dispatch, in the path: ${result.path || \"\"}. Take a look at the reducer(s) handling the action ${stringify2(action)}. (https://redux.js.org/style-guide/style-guide#do-not-mutate-state)`);\n }\n });\n measureUtils.warnIfExceeded();\n return dispatchedAction;\n };\n };\n }\n}\n\n// src/serializableStateInvariantMiddleware.ts\nimport { isAction as isAction2, isPlainObject } from \"redux\";\nfunction isPlain(val) {\n const type = typeof val;\n return val == null || type === \"string\" || type === \"boolean\" || type === \"number\" || Array.isArray(val) || isPlainObject(val);\n}\nfunction findNonSerializableValue(value, path = \"\", isSerializable = isPlain, getEntries, ignoredPaths = [], cache) {\n let foundNestedSerializable;\n if (!isSerializable(value)) {\n return {\n keyPath: path || \"<root>\",\n value\n };\n }\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n if (cache?.has(value)) return false;\n const entries = getEntries != null ? getEntries(value) : Object.entries(value);\n const hasIgnoredPaths = ignoredPaths.length > 0;\n for (const [key, nestedValue] of entries) {\n const nestedPath = path ? path + \".\" + key : key;\n if (hasIgnoredPaths) {\n const hasMatches = ignoredPaths.some((ignored) => {\n if (ignored instanceof RegExp) {\n return ignored.test(nestedPath);\n }\n return nestedPath === ignored;\n });\n if (hasMatches) {\n continue;\n }\n }\n if (!isSerializable(nestedValue)) {\n return {\n keyPath: nestedPath,\n value: nestedValue\n };\n }\n if (typeof nestedValue === \"object\") {\n foundNestedSerializable = findNonSerializableValue(nestedValue, nestedPath, isSerializable, getEntries, ignoredPaths, cache);\n if (foundNestedSerializable) {\n return foundNestedSerializable;\n }\n }\n }\n if (cache && isNestedFrozen(value)) cache.add(value);\n return false;\n}\nfunction isNestedFrozen(value) {\n if (!Object.isFrozen(value)) return false;\n for (const nestedValue of Object.values(value)) {\n if (typeof nestedValue !== \"object\" || nestedValue === null) continue;\n if (!isNestedFrozen(nestedValue)) return false;\n }\n return true;\n}\nfunction createSerializableStateInvariantMiddleware(options = {}) {\n if (process.env.NODE_ENV === \"production\") {\n return () => (next) => (action) => next(action);\n } else {\n const {\n isSerializable = isPlain,\n getEntries,\n ignoredActions = [],\n ignoredActionPaths = [\"meta.arg\", \"meta.baseQueryMeta\"],\n ignoredPaths = [],\n warnAfter = 32,\n ignoreState = false,\n ignoreActions = false,\n disableCache = false\n } = options;\n const cache = !disableCache && WeakSet ? /* @__PURE__ */ new WeakSet() : void 0;\n return (storeAPI) => (next) => (action) => {\n if (!isAction2(action)) {\n return next(action);\n }\n const result = next(action);\n const measureUtils = getTimeMeasureUtils(warnAfter, \"SerializableStateInvariantMiddleware\");\n if (!ignoreActions && !(ignoredActions.length && ignoredActions.indexOf(action.type) !== -1)) {\n measureUtils.measureTime(() => {\n const foundActionNonSerializableValue = findNonSerializableValue(action, \"\", isSerializable, getEntries, ignoredActionPaths, cache);\n if (foundActionNonSerializableValue) {\n const {\n keyPath,\n value\n } = foundActionNonSerializableValue;\n console.error(`A non-serializable value was detected in an action, in the path: \\`${keyPath}\\`. Value:`, value, \"\\nTake a look at the logic that dispatched this action: \", action, \"\\n(See https://redux.js.org/faq/actions#why-should-type-be-a-string-or-at-least-serializable-why-should-my-action-types-be-constants)\", \"\\n(To allow non-serializable values see: https://redux-toolkit.js.org/usage/usage-guide#working-with-non-serializable-data)\");\n }\n });\n }\n if (!ignoreState) {\n measureUtils.measureTime(() => {\n const state = storeAPI.getState();\n const foundStateNonSerializableValue = findNonSerializableValue(state, \"\", isSerializable, getEntries, ignoredPaths, cache);\n if (foundStateNonSerializableValue) {\n const {\n keyPath,\n value\n } = foundStateNonSerializableValue;\n console.error(`A non-serializable value was detected in the state, in the path: \\`${keyPath}\\`. Value:`, value, `\nTake a look at the reducer(s) handling this action type: ${action.type}.\n(See https://redux.js.org/faq/organizing-state#can-i-put-functions-promises-or-other-non-serializable-items-in-my-store-state)`);\n }\n });\n measureUtils.warnIfExceeded();\n }\n return result;\n };\n }\n}\n\n// src/getDefaultMiddleware.ts\nfunction isBoolean(x) {\n return typeof x === \"boolean\";\n}\nvar buildGetDefaultMiddleware = () => function getDefaultMiddleware(options) {\n const {\n thunk = true,\n immutableCheck = true,\n serializableCheck = true,\n actionCreatorCheck = true\n } = options ?? {};\n let middlewareArray = new Tuple();\n if (thunk) {\n if (isBoolean(thunk)) {\n middlewareArray.push(thunkMiddleware);\n } else {\n middlewareArray.push(withExtraArgument(thunk.extraArgument));\n }\n }\n if (process.env.NODE_ENV !== \"production\") {\n if (immutableCheck) {\n let immutableOptions = {};\n if (!isBoolean(immutableCheck)) {\n immutableOptions = immutableCheck;\n }\n middlewareArray.unshift(createImmutableStateInvariantMiddleware(immutableOptions));\n }\n if (serializableCheck) {\n let serializableOptions = {};\n if (!isBoolean(serializableCheck)) {\n serializableOptions = serializableCheck;\n }\n middlewareArray.push(createSerializableStateInvariantMiddleware(serializableOptions));\n }\n if (actionCreatorCheck) {\n let actionCreatorOptions = {};\n if (!isBoolean(actionCreatorCheck)) {\n actionCreatorOptions = actionCreatorCheck;\n }\n middlewareArray.unshift(createActionCreatorInvariantMiddleware(actionCreatorOptions));\n }\n }\n return middlewareArray;\n};\n\n// src/autoBatchEnhancer.ts\nvar SHOULD_AUTOBATCH = \"RTK_autoBatch\";\nvar prepareAutoBatched = () => (payload) => ({\n payload,\n meta: {\n [SHOULD_AUTOBATCH]: true\n }\n});\nvar createQueueWithTimer = (timeout) => {\n return (notify) => {\n setTimeout(notify, timeout);\n };\n};\nvar autoBatchEnhancer = (options = {\n type: \"raf\"\n}) => (next) => (...args) => {\n const store = next(...args);\n let notifying = true;\n let shouldNotifyAtEndOfTick = false;\n let notificationQueued = false;\n const listeners = /* @__PURE__ */ new Set();\n const queueCallback = options.type === \"tick\" ? queueMicrotask : options.type === \"raf\" ? (\n // requestAnimationFrame won't exist in SSR environments. Fall back to a vague approximation just to keep from erroring.\n typeof window !== \"undefined\" && window.requestAnimationFrame ? window.requestAnimationFrame : createQueueWithTimer(10)\n ) : options.type === \"callback\" ? options.queueNotification : createQueueWithTimer(options.timeout);\n const notifyListeners = () => {\n notificationQueued = false;\n if (shouldNotifyAtEndOfTick) {\n shouldNotifyAtEndOfTick = false;\n listeners.forEach((l) => l());\n }\n };\n return Object.assign({}, store, {\n // Override the base `store.subscribe` method to keep original listeners\n // from running if we're delaying notifications\n subscribe(listener2) {\n const wrappedListener = () => notifying && listener2();\n const unsubscribe = store.subscribe(wrappedListener);\n listeners.add(listener2);\n return () => {\n unsubscribe();\n listeners.delete(listener2);\n };\n },\n // Override the base `store.dispatch` method so that we can check actions\n // for the `shouldAutoBatch` flag and determine if batching is active\n dispatch(action) {\n try {\n notifying = !action?.meta?.[SHOULD_AUTOBATCH];\n shouldNotifyAtEndOfTick = !notifying;\n if (shouldNotifyAtEndOfTick) {\n if (!notificationQueued) {\n notificationQueued = true;\n queueCallback(notifyListeners);\n }\n }\n return store.dispatch(action);\n } finally {\n notifying = true;\n }\n }\n });\n};\n\n// src/getDefaultEnhancers.ts\nvar buildGetDefaultEnhancers = (middlewareEnhancer) => function getDefaultEnhancers(options) {\n const {\n autoBatch = true\n } = options ?? {};\n let enhancerArray = new Tuple(middlewareEnhancer);\n if (autoBatch) {\n enhancerArray.push(autoBatchEnhancer(typeof autoBatch === \"object\" ? autoBatch : void 0));\n }\n return enhancerArray;\n};\n\n// src/configureStore.ts\nfunction configureStore(options) {\n const getDefaultMiddleware = buildGetDefaultMiddleware();\n const {\n reducer = void 0,\n middleware,\n devTools = true,\n duplicateMiddlewareCheck = true,\n preloadedState = void 0,\n enhancers = void 0\n } = options || {};\n let rootReducer;\n if (typeof reducer === \"function\") {\n rootReducer = reducer;\n } else if (isPlainObject2(reducer)) {\n rootReducer = combineReducers(reducer);\n } else {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(1) : \"`reducer` is a required argument, and must be a function or an object of functions that can be passed to combineReducers\");\n }\n if (process.env.NODE_ENV !== \"production\" && middleware && typeof middleware !== \"function\") {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(2) : \"`middleware` field must be a callback\");\n }\n let finalMiddleware;\n if (typeof middleware === \"function\") {\n finalMiddleware = middleware(getDefaultMiddleware);\n if (process.env.NODE_ENV !== \"production\" && !Array.isArray(finalMiddleware)) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(3) : \"when using a middleware builder function, an array of middleware must be returned\");\n }\n } else {\n finalMiddleware = getDefaultMiddleware();\n }\n if (process.env.NODE_ENV !== \"production\" && finalMiddleware.some((item) => typeof item !== \"function\")) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(4) : \"each middleware provided to configureStore must be a function\");\n }\n if (process.env.NODE_ENV !== \"production\" && duplicateMiddlewareCheck) {\n let middlewareReferences = /* @__PURE__ */ new Set();\n finalMiddleware.forEach((middleware2) => {\n if (middlewareReferences.has(middleware2)) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(42) : \"Duplicate middleware references found when creating the store. Ensure that each middleware is only included once.\");\n }\n middlewareReferences.add(middleware2);\n });\n }\n let finalCompose = compose2;\n if (devTools) {\n finalCompose = composeWithDevTools({\n // Enable capture of stack traces for dispatched Redux actions\n trace: process.env.NODE_ENV !== \"production\",\n ...typeof devTools === \"object\" && devTools\n });\n }\n const middlewareEnhancer = applyMiddleware(...finalMiddleware);\n const getDefaultEnhancers = buildGetDefaultEnhancers(middlewareEnhancer);\n if (process.env.NODE_ENV !== \"production\" && enhancers && typeof enhancers !== \"function\") {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(5) : \"`enhancers` field must be a callback\");\n }\n let storeEnhancers = typeof enhancers === \"function\" ? enhancers(getDefaultEnhancers) : getDefaultEnhancers();\n if (process.env.NODE_ENV !== \"production\" && !Array.isArray(storeEnhancers)) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(6) : \"`enhancers` callback must return an array\");\n }\n if (process.env.NODE_ENV !== \"production\" && storeEnhancers.some((item) => typeof item !== \"function\")) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(7) : \"each enhancer provided to configureStore must be a function\");\n }\n if (process.env.NODE_ENV !== \"production\" && finalMiddleware.length && !storeEnhancers.includes(middlewareEnhancer)) {\n console.error(\"middlewares were provided, but middleware enhancer was not included in final enhancers - make sure to call `getDefaultEnhancers`\");\n }\n const composedEnhancer = finalCompose(...storeEnhancers);\n return createStore(rootReducer, preloadedState, composedEnhancer);\n}\n\n// src/createReducer.ts\nimport { produce as createNextState2, isDraft as isDraft2, isDraftable as isDraftable2 } from \"immer\";\n\n// src/mapBuilders.ts\nfunction executeReducerBuilderCallback(builderCallback) {\n const actionsMap = {};\n const actionMatchers = [];\n let defaultCaseReducer;\n const builder = {\n addCase(typeOrActionCreator, reducer) {\n if (process.env.NODE_ENV !== \"production\") {\n if (actionMatchers.length > 0) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(26) : \"`builder.addCase` should only be called before calling `builder.addMatcher`\");\n }\n if (defaultCaseReducer) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(27) : \"`builder.addCase` should only be called before calling `builder.addDefaultCase`\");\n }\n }\n const type = typeof typeOrActionCreator === \"string\" ? typeOrActionCreator : typeOrActionCreator.type;\n if (!type) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(28) : \"`builder.addCase` cannot be called with an empty action type\");\n }\n if (type in actionsMap) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(29) : `\\`builder.addCase\\` cannot be called with two reducers for the same action type '${type}'`);\n }\n actionsMap[type] = reducer;\n return builder;\n },\n addAsyncThunk(asyncThunk, reducers) {\n if (process.env.NODE_ENV !== \"production\") {\n if (defaultCaseReducer) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(43) : \"`builder.addAsyncThunk` should only be called before calling `builder.addDefaultCase`\");\n }\n }\n if (reducers.pending) actionsMap[asyncThunk.pending.type] = reducers.pending;\n if (reducers.rejected) actionsMap[asyncThunk.rejected.type] = reducers.rejected;\n if (reducers.fulfilled) actionsMap[asyncThunk.fulfilled.type] = reducers.fulfilled;\n if (reducers.settled) actionMatchers.push({\n matcher: asyncThunk.settled,\n reducer: reducers.settled\n });\n return builder;\n },\n addMatcher(matcher, reducer) {\n if (process.env.NODE_ENV !== \"production\") {\n if (defaultCaseReducer) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(30) : \"`builder.addMatcher` should only be called before calling `builder.addDefaultCase`\");\n }\n }\n actionMatchers.push({\n matcher,\n reducer\n });\n return builder;\n },\n addDefaultCase(reducer) {\n if (process.env.NODE_ENV !== \"production\") {\n if (defaultCaseReducer) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(31) : \"`builder.addDefaultCase` can only be called once\");\n }\n }\n defaultCaseReducer = reducer;\n return builder;\n }\n };\n builderCallback(builder);\n return [actionsMap, actionMatchers, defaultCaseReducer];\n}\n\n// src/createReducer.ts\nfunction isStateFunction(x) {\n return typeof x === \"function\";\n}\nfunction createReducer(initialState, mapOrBuilderCallback) {\n if (process.env.NODE_ENV !== \"production\") {\n if (typeof mapOrBuilderCallback === \"object\") {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(8) : \"The object notation for `createReducer` has been removed. Please use the 'builder callback' notation instead: https://redux-toolkit.js.org/api/createReducer\");\n }\n }\n let [actionsMap, finalActionMatchers, finalDefaultCaseReducer] = executeReducerBuilderCallback(mapOrBuilderCallback);\n let getInitialState;\n if (isStateFunction(initialState)) {\n getInitialState = () => freezeDraftable(initialState());\n } else {\n const frozenInitialState = freezeDraftable(initialState);\n getInitialState = () => frozenInitialState;\n }\n function reducer(state = getInitialState(), action) {\n let caseReducers = [actionsMap[action.type], ...finalActionMatchers.filter(({\n matcher\n }) => matcher(action)).map(({\n reducer: reducer2\n }) => reducer2)];\n if (caseReducers.filter((cr) => !!cr).length === 0) {\n caseReducers = [finalDefaultCaseReducer];\n }\n return caseReducers.reduce((previousState, caseReducer) => {\n if (caseReducer) {\n if (isDraft2(previousState)) {\n const draft = previousState;\n const result = caseReducer(draft, action);\n if (result === void 0) {\n return previousState;\n }\n return result;\n } else if (!isDraftable2(previousState)) {\n const result = caseReducer(previousState, action);\n if (result === void 0) {\n if (previousState === null) {\n return previousState;\n }\n throw Error(\"A case reducer on a non-draftable value must not return undefined\");\n }\n return result;\n } else {\n return createNextState2(previousState, (draft) => {\n return caseReducer(draft, action);\n });\n }\n }\n return previousState;\n }, state);\n }\n reducer.getInitialState = getInitialState;\n return reducer;\n}\n\n// src/matchers.ts\nvar matches = (matcher, action) => {\n if (hasMatchFunction(matcher)) {\n return matcher.match(action);\n } else {\n return matcher(action);\n }\n};\nfunction isAnyOf(...matchers) {\n return (action) => {\n return matchers.some((matcher) => matches(matcher, action));\n };\n}\nfunction isAllOf(...matchers) {\n return (action) => {\n return matchers.every((matcher) => matches(matcher, action));\n };\n}\nfunction hasExpectedRequestMetadata(action, validStatus) {\n if (!action || !action.meta) return false;\n const hasValidRequestId = typeof action.meta.requestId === \"string\";\n const hasValidRequestStatus = validStatus.indexOf(action.meta.requestStatus) > -1;\n return hasValidRequestId && hasValidRequestStatus;\n}\nfunction isAsyncThunkArray(a) {\n return typeof a[0] === \"function\" && \"pending\" in a[0] && \"fulfilled\" in a[0] && \"rejected\" in a[0];\n}\nfunction isPending(...asyncThunks) {\n if (asyncThunks.length === 0) {\n return (action) => hasExpectedRequestMetadata(action, [\"pending\"]);\n }\n if (!isAsyncThunkArray(asyncThunks)) {\n return isPending()(asyncThunks[0]);\n }\n return isAnyOf(...asyncThunks.map((asyncThunk) => asyncThunk.pending));\n}\nfunction isRejected(...asyncThunks) {\n if (asyncThunks.length === 0) {\n return (action) => hasExpectedRequestMetadata(action, [\"rejected\"]);\n }\n if (!isAsyncThunkArray(asyncThunks)) {\n return isRejected()(asyncThunks[0]);\n }\n return isAnyOf(...asyncThunks.map((asyncThunk) => asyncThunk.rejected));\n}\nfunction isRejectedWithValue(...asyncThunks) {\n const hasFlag = (action) => {\n return action && action.meta && action.meta.rejectedWithValue;\n };\n if (asyncThunks.length === 0) {\n return isAllOf(isRejected(...asyncThunks), hasFlag);\n }\n if (!isAsyncThunkArray(asyncThunks)) {\n return isRejectedWithValue()(asyncThunks[0]);\n }\n return isAllOf(isRejected(...asyncThunks), hasFlag);\n}\nfunction isFulfilled(...asyncThunks) {\n if (asyncThunks.length === 0) {\n return (action) => hasExpectedRequestMetadata(action, [\"fulfilled\"]);\n }\n if (!isAsyncThunkArray(asyncThunks)) {\n return isFulfilled()(asyncThunks[0]);\n }\n return isAnyOf(...asyncThunks.map((asyncThunk) => asyncThunk.fulfilled));\n}\nfunction isAsyncThunkAction(...asyncThunks) {\n if (asyncThunks.length === 0) {\n return (action) => hasExpectedRequestMetadata(action, [\"pending\", \"fulfilled\", \"rejected\"]);\n }\n if (!isAsyncThunkArray(asyncThunks)) {\n return isAsyncThunkAction()(asyncThunks[0]);\n }\n return isAnyOf(...asyncThunks.flatMap((asyncThunk) => [asyncThunk.pending, asyncThunk.rejected, asyncThunk.fulfilled]));\n}\n\n// src/nanoid.ts\nvar urlAlphabet = \"ModuleSymbhasOwnPr-0123456789ABCDEFGHNRVfgctiUvz_KqYTJkLxpZXIjQW\";\nvar nanoid = (size = 21) => {\n let id = \"\";\n let i = size;\n while (i--) {\n id += urlAlphabet[Math.random() * 64 | 0];\n }\n return id;\n};\n\n// src/createAsyncThunk.ts\nvar commonProperties = [\"name\", \"message\", \"stack\", \"code\"];\nvar RejectWithValue = class {\n constructor(payload, meta) {\n this.payload = payload;\n this.meta = meta;\n }\n /*\n type-only property to distinguish between RejectWithValue and FulfillWithMeta\n does not exist at runtime\n */\n _type;\n};\nvar FulfillWithMeta = class {\n constructor(payload, meta) {\n this.payload = payload;\n this.meta = meta;\n }\n /*\n type-only property to distinguish between RejectWithValue and FulfillWithMeta\n does not exist at runtime\n */\n _type;\n};\nvar miniSerializeError = (value) => {\n if (typeof value === \"object\" && value !== null) {\n const simpleError = {};\n for (const property of commonProperties) {\n if (typeof value[property] === \"string\") {\n simpleError[property] = value[property];\n }\n }\n return simpleError;\n }\n return {\n message: String(value)\n };\n};\nvar externalAbortMessage = \"External signal was aborted\";\nvar createAsyncThunk = /* @__PURE__ */ (() => {\n function createAsyncThunk2(typePrefix, payloadCreator, options) {\n const fulfilled = createAction(typePrefix + \"/fulfilled\", (payload, requestId, arg, meta) => ({\n payload,\n meta: {\n ...meta || {},\n arg,\n requestId,\n requestStatus: \"fulfilled\"\n }\n }));\n const pending = createAction(typePrefix + \"/pending\", (requestId, arg, meta) => ({\n payload: void 0,\n meta: {\n ...meta || {},\n arg,\n requestId,\n requestStatus: \"pending\"\n }\n }));\n const rejected = createAction(typePrefix + \"/rejected\", (error, requestId, arg, payload, meta) => ({\n payload,\n error: (options && options.serializeError || miniSerializeError)(error || \"Rejected\"),\n meta: {\n ...meta || {},\n arg,\n requestId,\n rejectedWithValue: !!payload,\n requestStatus: \"rejected\",\n aborted: error?.name === \"AbortError\",\n condition: error?.name === \"ConditionError\"\n }\n }));\n function actionCreator(arg, {\n signal\n } = {}) {\n return (dispatch, getState, extra) => {\n const requestId = options?.idGenerator ? options.idGenerator(arg) : nanoid();\n const abortController = new AbortController();\n let abortHandler;\n let abortReason;\n function abort(reason) {\n abortReason = reason;\n abortController.abort();\n }\n if (signal) {\n if (signal.aborted) {\n abort(externalAbortMessage);\n } else {\n signal.addEventListener(\"abort\", () => abort(externalAbortMessage), {\n once: true\n });\n }\n }\n const promise = async function() {\n let finalAction;\n try {\n let conditionResult = options?.condition?.(arg, {\n getState,\n extra\n });\n if (isThenable(conditionResult)) {\n conditionResult = await conditionResult;\n }\n if (conditionResult === false || abortController.signal.aborted) {\n throw {\n name: \"ConditionError\",\n message: \"Aborted due to condition callback returning false.\"\n };\n }\n const abortedPromise = new Promise((_, reject) => {\n abortHandler = () => {\n reject({\n name: \"AbortError\",\n message: abortReason || \"Aborted\"\n });\n };\n abortController.signal.addEventListener(\"abort\", abortHandler);\n });\n dispatch(pending(requestId, arg, options?.getPendingMeta?.({\n requestId,\n arg\n }, {\n getState,\n extra\n })));\n finalAction = await Promise.race([abortedPromise, Promise.resolve(payloadCreator(arg, {\n dispatch,\n getState,\n extra,\n requestId,\n signal: abortController.signal,\n abort,\n rejectWithValue: (value, meta) => {\n return new RejectWithValue(value, meta);\n },\n fulfillWithValue: (value, meta) => {\n return new FulfillWithMeta(value, meta);\n }\n })).then((result) => {\n if (result instanceof RejectWithValue) {\n throw result;\n }\n if (result instanceof FulfillWithMeta) {\n return fulfilled(result.payload, requestId, arg, result.meta);\n }\n return fulfilled(result, requestId, arg);\n })]);\n } catch (err) {\n finalAction = err instanceof RejectWithValue ? rejected(null, requestId, arg, err.payload, err.meta) : rejected(err, requestId, arg);\n } finally {\n if (abortHandler) {\n abortController.signal.removeEventListener(\"abort\", abortHandler);\n }\n }\n const skipDispatch = options && !options.dispatchConditionRejection && rejected.match(finalAction) && finalAction.meta.condition;\n if (!skipDispatch) {\n dispatch(finalAction);\n }\n return finalAction;\n }();\n return Object.assign(promise, {\n abort,\n requestId,\n arg,\n unwrap() {\n return promise.then(unwrapResult);\n }\n });\n };\n }\n return Object.assign(actionCreator, {\n pending,\n rejected,\n fulfilled,\n settled: isAnyOf(rejected, fulfilled),\n typePrefix\n });\n }\n createAsyncThunk2.withTypes = () => createAsyncThunk2;\n return createAsyncThunk2;\n})();\nfunction unwrapResult(action) {\n if (action.meta && action.meta.rejectedWithValue) {\n throw action.payload;\n }\n if (action.error) {\n throw action.error;\n }\n return action.payload;\n}\nfunction isThenable(value) {\n return value !== null && typeof value === \"object\" && typeof value.then === \"function\";\n}\n\n// src/createSlice.ts\nvar asyncThunkSymbol = /* @__PURE__ */ Symbol.for(\"rtk-slice-createasyncthunk\");\nvar asyncThunkCreator = {\n [asyncThunkSymbol]: createAsyncThunk\n};\nvar ReducerType = /* @__PURE__ */ ((ReducerType2) => {\n ReducerType2[\"reducer\"] = \"reducer\";\n ReducerType2[\"reducerWithPrepare\"] = \"reducerWithPrepare\";\n ReducerType2[\"asyncThunk\"] = \"asyncThunk\";\n return ReducerType2;\n})(ReducerType || {});\nfunction getType(slice, actionKey) {\n return `${slice}/${actionKey}`;\n}\nfunction buildCreateSlice({\n creators\n} = {}) {\n const cAT = creators?.asyncThunk?.[asyncThunkSymbol];\n return function createSlice2(options) {\n const {\n name,\n reducerPath = name\n } = options;\n if (!name) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(11) : \"`name` is a required option for createSlice\");\n }\n if (typeof process !== \"undefined\" && process.env.NODE_ENV === \"development\") {\n if (options.initialState === void 0) {\n console.error(\"You must provide an `initialState` value that is not `undefined`. You may have misspelled `initialState`\");\n }\n }\n const reducers = (typeof options.reducers === \"function\" ? options.reducers(buildReducerCreators()) : options.reducers) || {};\n const reducerNames = Object.keys(reducers);\n const context = {\n sliceCaseReducersByName: {},\n sliceCaseReducersByType: {},\n actionCreators: {},\n sliceMatchers: []\n };\n const contextMethods = {\n addCase(typeOrActionCreator, reducer2) {\n const type = typeof typeOrActionCreator === \"string\" ? typeOrActionCreator : typeOrActionCreator.type;\n if (!type) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(12) : \"`context.addCase` cannot be called with an empty action type\");\n }\n if (type in context.sliceCaseReducersByType) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(13) : \"`context.addCase` cannot be called with two reducers for the same action type: \" + type);\n }\n context.sliceCaseReducersByType[type] = reducer2;\n return contextMethods;\n },\n addMatcher(matcher, reducer2) {\n context.sliceMatchers.push({\n matcher,\n reducer: reducer2\n });\n return contextMethods;\n },\n exposeAction(name2, actionCreator) {\n context.actionCreators[name2] = actionCreator;\n return contextMethods;\n },\n exposeCaseReducer(name2, reducer2) {\n context.sliceCaseReducersByName[name2] = reducer2;\n return contextMethods;\n }\n };\n reducerNames.forEach((reducerName) => {\n const reducerDefinition = reducers[reducerName];\n const reducerDetails = {\n reducerName,\n type: getType(name, reducerName),\n createNotation: typeof options.reducers === \"function\"\n };\n if (isAsyncThunkSliceReducerDefinition(reducerDefinition)) {\n handleThunkCaseReducerDefinition(reducerDetails, reducerDefinition, contextMethods, cAT);\n } else {\n handleNormalReducerDefinition(reducerDetails, reducerDefinition, contextMethods);\n }\n });\n function buildReducer() {\n if (process.env.NODE_ENV !== \"production\") {\n if (typeof options.extraReducers === \"object\") {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(14) : \"The object notation for `createSlice.extraReducers` has been removed. Please use the 'builder callback' notation instead: https://redux-toolkit.js.org/api/createSlice\");\n }\n }\n const [extraReducers = {}, actionMatchers = [], defaultCaseReducer = void 0] = typeof options.extraReducers === \"function\" ? executeReducerBuilderCallback(options.extraReducers) : [options.extraReducers];\n const finalCaseReducers = {\n ...extraReducers,\n ...context.sliceCaseReducersByType\n };\n return createReducer(options.initialState, (builder) => {\n for (let key in finalCaseReducers) {\n builder.addCase(key, finalCaseReducers[key]);\n }\n for (let sM of context.sliceMatchers) {\n builder.addMatcher(sM.matcher, sM.reducer);\n }\n for (let m of actionMatchers) {\n builder.addMatcher(m.matcher, m.reducer);\n }\n if (defaultCaseReducer) {\n builder.addDefaultCase(defaultCaseReducer);\n }\n });\n }\n const selectSelf = (state) => state;\n const injectedSelectorCache = /* @__PURE__ */ new Map();\n const injectedStateCache = /* @__PURE__ */ new WeakMap();\n let _reducer;\n function reducer(state, action) {\n if (!_reducer) _reducer = buildReducer();\n return _reducer(state, action);\n }\n function getInitialState() {\n if (!_reducer) _reducer = buildReducer();\n return _reducer.getInitialState();\n }\n function makeSelectorProps(reducerPath2, injected = false) {\n function selectSlice(state) {\n let sliceState = state[reducerPath2];\n if (typeof sliceState === \"undefined\") {\n if (injected) {\n sliceState = getOrInsertComputed(injectedStateCache, selectSlice, getInitialState);\n } else if (process.env.NODE_ENV !== \"production\") {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(15) : \"selectSlice returned undefined for an uninjected slice reducer\");\n }\n }\n return sliceState;\n }\n function getSelectors(selectState = selectSelf) {\n const selectorCache = getOrInsertComputed(injectedSelectorCache, injected, () => /* @__PURE__ */ new WeakMap());\n return getOrInsertComputed(selectorCache, selectState, () => {\n const map = {};\n for (const [name2, selector] of Object.entries(options.selectors ?? {})) {\n map[name2] = wrapSelector(selector, selectState, () => getOrInsertComputed(injectedStateCache, selectState, getInitialState), injected);\n }\n return map;\n });\n }\n return {\n reducerPath: reducerPath2,\n getSelectors,\n get selectors() {\n return getSelectors(selectSlice);\n },\n selectSlice\n };\n }\n const slice = {\n name,\n reducer,\n actions: context.actionCreators,\n caseReducers: context.sliceCaseReducersByName,\n getInitialState,\n ...makeSelectorProps(reducerPath),\n injectInto(injectable, {\n reducerPath: pathOpt,\n ...config\n } = {}) {\n const newReducerPath = pathOpt ?? reducerPath;\n injectable.inject({\n reducerPath: newReducerPath,\n reducer\n }, config);\n return {\n ...slice,\n ...makeSelectorProps(newReducerPath, true)\n };\n }\n };\n return slice;\n };\n}\nfunction wrapSelector(selector, selectState, getInitialState, injected) {\n function wrapper(rootState, ...args) {\n let sliceState = selectState(rootState);\n if (typeof sliceState === \"undefined\") {\n if (injected) {\n sliceState = getInitialState();\n } else if (process.env.NODE_ENV !== \"production\") {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(16) : \"selectState returned undefined for an uninjected slice reducer\");\n }\n }\n return selector(sliceState, ...args);\n }\n wrapper.unwrapped = selector;\n return wrapper;\n}\nvar createSlice = /* @__PURE__ */ buildCreateSlice();\nfunction buildReducerCreators() {\n function asyncThunk(payloadCreator, config) {\n return {\n _reducerDefinitionType: \"asyncThunk\" /* asyncThunk */,\n payloadCreator,\n ...config\n };\n }\n asyncThunk.withTypes = () => asyncThunk;\n return {\n reducer(caseReducer) {\n return Object.assign({\n // hack so the wrapping function has the same name as the original\n // we need to create a wrapper so the `reducerDefinitionType` is not assigned to the original\n [caseReducer.name](...args) {\n return caseReducer(...args);\n }\n }[caseReducer.name], {\n _reducerDefinitionType: \"reducer\" /* reducer */\n });\n },\n preparedReducer(prepare, reducer) {\n return {\n _reducerDefinitionType: \"reducerWithPrepare\" /* reducerWithPrepare */,\n prepare,\n reducer\n };\n },\n asyncThunk\n };\n}\nfunction handleNormalReducerDefinition({\n type,\n reducerName,\n createNotation\n}, maybeReducerWithPrepare, context) {\n let caseReducer;\n let prepareCallback;\n if (\"reducer\" in maybeReducerWithPrepare) {\n if (createNotation && !isCaseReducerWithPrepareDefinition(maybeReducerWithPrepare)) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(17) : \"Please use the `create.preparedReducer` notation for prepared action creators with the `create` notation.\");\n }\n caseReducer = maybeReducerWithPrepare.reducer;\n prepareCallback = maybeReducerWithPrepare.prepare;\n } else {\n caseReducer = maybeReducerWithPrepare;\n }\n context.addCase(type, caseReducer).exposeCaseReducer(reducerName, caseReducer).exposeAction(reducerName, prepareCallback ? createAction(type, prepareCallback) : createAction(type));\n}\nfunction isAsyncThunkSliceReducerDefinition(reducerDefinition) {\n return reducerDefinition._reducerDefinitionType === \"asyncThunk\" /* asyncThunk */;\n}\nfunction isCaseReducerWithPrepareDefinition(reducerDefinition) {\n return reducerDefinition._reducerDefinitionType === \"reducerWithPrepare\" /* reducerWithPrepare */;\n}\nfunction handleThunkCaseReducerDefinition({\n type,\n reducerName\n}, reducerDefinition, context, cAT) {\n if (!cAT) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(18) : \"Cannot use `create.asyncThunk` in the built-in `createSlice`. Use `buildCreateSlice({ creators: { asyncThunk: asyncThunkCreator } })` to create a customised version of `createSlice`.\");\n }\n const {\n payloadCreator,\n fulfilled,\n pending,\n rejected,\n settled,\n options\n } = reducerDefinition;\n const thunk = cAT(type, payloadCreator, options);\n context.exposeAction(reducerName, thunk);\n if (fulfilled) {\n context.addCase(thunk.fulfilled, fulfilled);\n }\n if (pending) {\n context.addCase(thunk.pending, pending);\n }\n if (rejected) {\n context.addCase(thunk.rejected, rejected);\n }\n if (settled) {\n context.addMatcher(thunk.settled, settled);\n }\n context.exposeCaseReducer(reducerName, {\n fulfilled: fulfilled || noop,\n pending: pending || noop,\n rejected: rejected || noop,\n settled: settled || noop\n });\n}\nfunction noop() {\n}\n\n// src/entities/entity_state.ts\nfunction getInitialEntityState() {\n return {\n ids: [],\n entities: {}\n };\n}\nfunction createInitialStateFactory(stateAdapter) {\n function getInitialState(additionalState = {}, entities) {\n const state = Object.assign(getInitialEntityState(), additionalState);\n return entities ? stateAdapter.setAll(state, entities) : state;\n }\n return {\n getInitialState\n };\n}\n\n// src/entities/state_selectors.ts\nfunction createSelectorsFactory() {\n function getSelectors(selectState, options = {}) {\n const {\n createSelector: createSelector2 = createDraftSafeSelector\n } = options;\n const selectIds = (state) => state.ids;\n const selectEntities = (state) => state.entities;\n const selectAll = createSelector2(selectIds, selectEntities, (ids, entities) => ids.map((id) => entities[id]));\n const selectId = (_, id) => id;\n const selectById = (entities, id) => entities[id];\n const selectTotal = createSelector2(selectIds, (ids) => ids.length);\n if (!selectState) {\n return {\n selectIds,\n selectEntities,\n selectAll,\n selectTotal,\n selectById: createSelector2(selectEntities, selectId, selectById)\n };\n }\n const selectGlobalizedEntities = createSelector2(selectState, selectEntities);\n return {\n selectIds: createSelector2(selectState, selectIds),\n selectEntities: selectGlobalizedEntities,\n selectAll: createSelector2(selectState, selectAll),\n selectTotal: createSelector2(selectState, selectTotal),\n selectById: createSelector2(selectGlobalizedEntities, selectId, selectById)\n };\n }\n return {\n getSelectors\n };\n}\n\n// src/entities/state_adapter.ts\nimport { produce as createNextState3, isDraft as isDraft3 } from \"immer\";\nvar isDraftTyped = isDraft3;\nfunction createSingleArgumentStateOperator(mutator) {\n const operator = createStateOperator((_, state) => mutator(state));\n return function operation(state) {\n return operator(state, void 0);\n };\n}\nfunction createStateOperator(mutator) {\n return function operation(state, arg) {\n function isPayloadActionArgument(arg2) {\n return isFSA(arg2);\n }\n const runMutator = (draft) => {\n if (isPayloadActionArgument(arg)) {\n mutator(arg.payload, draft);\n } else {\n mutator(arg, draft);\n }\n };\n if (isDraftTyped(state)) {\n runMutator(state);\n return state;\n }\n return createNextState3(state, runMutator);\n };\n}\n\n// src/entities/utils.ts\nimport { current as current2, isDraft as isDraft4 } from \"immer\";\nfunction selectIdValue(entity, selectId) {\n const key = selectId(entity);\n if (process.env.NODE_ENV !== \"production\" && key === void 0) {\n console.warn(\"The entity passed to the `selectId` implementation returned undefined.\", \"You should probably provide your own `selectId` implementation.\", \"The entity that was passed:\", entity, \"The `selectId` implementation:\", selectId.toString());\n }\n return key;\n}\nfunction ensureEntitiesArray(entities) {\n if (!Array.isArray(entities)) {\n entities = Object.values(entities);\n }\n return entities;\n}\nfunction getCurrent(value) {\n return isDraft4(value) ? current2(value) : value;\n}\nfunction splitAddedUpdatedEntities(newEntities, selectId, state) {\n newEntities = ensureEntitiesArray(newEntities);\n const existingIdsArray = getCurrent(state.ids);\n const existingIds = new Set(existingIdsArray);\n const added = [];\n const addedIds = /* @__PURE__ */ new Set([]);\n const updated = [];\n for (const entity of newEntities) {\n const id = selectIdValue(entity, selectId);\n if (existingIds.has(id) || addedIds.has(id)) {\n updated.push({\n id,\n changes: entity\n });\n } else {\n addedIds.add(id);\n added.push(entity);\n }\n }\n return [added, updated, existingIdsArray];\n}\n\n// src/entities/unsorted_state_adapter.ts\nfunction createUnsortedStateAdapter(selectId) {\n function addOneMutably(entity, state) {\n const key = selectIdValue(entity, selectId);\n if (key in state.entities) {\n return;\n }\n state.ids.push(key);\n state.entities[key] = entity;\n }\n function addManyMutably(newEntities, state) {\n newEntities = ensureEntitiesArray(newEntities);\n for (const entity of newEntities) {\n addOneMutably(entity, state);\n }\n }\n function setOneMutably(entity, state) {\n const key = selectIdValue(entity, selectId);\n if (!(key in state.entities)) {\n state.ids.push(key);\n }\n ;\n state.entities[key] = entity;\n }\n function setManyMutably(newEntities, state) {\n newEntities = ensureEntitiesArray(newEntities);\n for (const entity of newEntities) {\n setOneMutably(entity, state);\n }\n }\n function setAllMutably(newEntities, state) {\n newEntities = ensureEntitiesArray(newEntities);\n state.ids = [];\n state.entities = {};\n addManyMutably(newEntities, state);\n }\n function removeOneMutably(key, state) {\n return removeManyMutably([key], state);\n }\n function removeManyMutably(keys, state) {\n let didMutate = false;\n keys.forEach((key) => {\n if (key in state.entities) {\n delete state.entities[key];\n didMutate = true;\n }\n });\n if (didMutate) {\n state.ids = state.ids.filter((id) => id in state.entities);\n }\n }\n function removeAllMutably(state) {\n Object.assign(state, {\n ids: [],\n entities: {}\n });\n }\n function takeNewKey(keys, update, state) {\n const original3 = state.entities[update.id];\n if (original3 === void 0) {\n return false;\n }\n const updated = Object.assign({}, original3, update.changes);\n const newKey = selectIdValue(updated, selectId);\n const hasNewKey = newKey !== update.id;\n if (hasNewKey) {\n keys[update.id] = newKey;\n delete state.entities[update.id];\n }\n ;\n state.entities[newKey] = updated;\n return hasNewKey;\n }\n function updateOneMutably(update, state) {\n return updateManyMutably([update], state);\n }\n function updateManyMutably(updates, state) {\n const newKeys = {};\n const updatesPerEntity = {};\n updates.forEach((update) => {\n if (update.id in state.entities) {\n updatesPerEntity[update.id] = {\n id: update.id,\n // Spreads ignore falsy values, so this works even if there isn't\n // an existing update already at this key\n changes: {\n ...updatesPerEntity[update.id]?.changes,\n ...update.changes\n }\n };\n }\n });\n updates = Object.values(updatesPerEntity);\n const didMutateEntities = updates.length > 0;\n if (didMutateEntities) {\n const didMutateIds = updates.filter((update) => takeNewKey(newKeys, update, state)).length > 0;\n if (didMutateIds) {\n state.ids = Object.values(state.entities).map((e) => selectIdValue(e, selectId));\n }\n }\n }\n function upsertOneMutably(entity, state) {\n return upsertManyMutably([entity], state);\n }\n function upsertManyMutably(newEntities, state) {\n const [added, updated] = splitAddedUpdatedEntities(newEntities, selectId, state);\n addManyMutably(added, state);\n updateManyMutably(updated, state);\n }\n return {\n removeAll: createSingleArgumentStateOperator(removeAllMutably),\n addOne: createStateOperator(addOneMutably),\n addMany: createStateOperator(addManyMutably),\n setOne: createStateOperator(setOneMutably),\n setMany: createStateOperator(setManyMutably),\n setAll: createStateOperator(setAllMutably),\n updateOne: createStateOperator(updateOneMutably),\n updateMany: createStateOperator(updateManyMutably),\n upsertOne: createStateOperator(upsertOneMutably),\n upsertMany: createStateOperator(upsertManyMutably),\n removeOne: createStateOperator(removeOneMutably),\n removeMany: createStateOperator(removeManyMutably)\n };\n}\n\n// src/entities/sorted_state_adapter.ts\nfunction findInsertIndex(sortedItems, item, comparisonFunction) {\n let lowIndex = 0;\n let highIndex = sortedItems.length;\n while (lowIndex < highIndex) {\n let middleIndex = lowIndex + highIndex >>> 1;\n const currentItem = sortedItems[middleIndex];\n const res = comparisonFunction(item, currentItem);\n if (res >= 0) {\n lowIndex = middleIndex + 1;\n } else {\n highIndex = middleIndex;\n }\n }\n return lowIndex;\n}\nfunction insert(sortedItems, item, comparisonFunction) {\n const insertAtIndex = findInsertIndex(sortedItems, item, comparisonFunction);\n sortedItems.splice(insertAtIndex, 0, item);\n return sortedItems;\n}\nfunction createSortedStateAdapter(selectId, comparer) {\n const {\n removeOne,\n removeMany,\n removeAll\n } = createUnsortedStateAdapter(selectId);\n function addOneMutably(entity, state) {\n return addManyMutably([entity], state);\n }\n function addManyMutably(newEntities, state, existingIds) {\n newEntities = ensureEntitiesArray(newEntities);\n const existingKeys = new Set(existingIds ?? getCurrent(state.ids));\n const models = newEntities.filter((model) => !existingKeys.has(selectIdValue(model, selectId)));\n if (models.length !== 0) {\n mergeFunction(state, models);\n }\n }\n function setOneMutably(entity, state) {\n return setManyMutably([entity], state);\n }\n function setManyMutably(newEntities, state) {\n newEntities = ensureEntitiesArray(newEntities);\n if (newEntities.length !== 0) {\n for (const item of newEntities) {\n delete state.entities[selectId(item)];\n }\n mergeFunction(state, newEntities);\n }\n }\n function setAllMutably(newEntities, state) {\n newEntities = ensureEntitiesArray(newEntities);\n state.entities = {};\n state.ids = [];\n addManyMutably(newEntities, state, []);\n }\n function updateOneMutably(update, state) {\n return updateManyMutably([update], state);\n }\n function updateManyMutably(updates, state) {\n let appliedUpdates = false;\n let replacedIds = false;\n for (let update of updates) {\n const entity = state.entities[update.id];\n if (!entity) {\n continue;\n }\n appliedUpdates = true;\n Object.assign(entity, update.changes);\n const newId = selectId(entity);\n if (update.id !== newId) {\n replacedIds = true;\n delete state.entities[update.id];\n const oldIndex = state.ids.indexOf(update.id);\n state.ids[oldIndex] = newId;\n state.entities[newId] = entity;\n }\n }\n if (appliedUpdates) {\n mergeFunction(state, [], appliedUpdates, replacedIds);\n }\n }\n function upsertOneMutably(entity, state) {\n return upsertManyMutably([entity], state);\n }\n function upsertManyMutably(newEntities, state) {\n const [added, updated, existingIdsArray] = splitAddedUpdatedEntities(newEntities, selectId, state);\n if (added.length) {\n addManyMutably(added, state, existingIdsArray);\n }\n if (updated.length) {\n updateManyMutably(updated, state);\n }\n }\n function areArraysEqual(a, b) {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (a[i] === b[i]) {\n continue;\n }\n return false;\n }\n return true;\n }\n const mergeFunction = (state, addedItems, appliedUpdates, replacedIds) => {\n const currentEntities = getCurrent(state.entities);\n const currentIds = getCurrent(state.ids);\n const stateEntities = state.entities;\n let ids = currentIds;\n if (replacedIds) {\n ids = new Set(currentIds);\n }\n let sortedEntities = [];\n for (const id of ids) {\n const entity = currentEntities[id];\n if (entity) {\n sortedEntities.push(entity);\n }\n }\n const wasPreviouslyEmpty = sortedEntities.length === 0;\n for (const item of addedItems) {\n stateEntities[selectId(item)] = item;\n if (!wasPreviouslyEmpty) {\n insert(sortedEntities, item, comparer);\n }\n }\n if (wasPreviouslyEmpty) {\n sortedEntities = addedItems.slice().sort(comparer);\n } else if (appliedUpdates) {\n sortedEntities.sort(comparer);\n }\n const newSortedIds = sortedEntities.map(selectId);\n if (!areArraysEqual(currentIds, newSortedIds)) {\n state.ids = newSortedIds;\n }\n };\n return {\n removeOne,\n removeMany,\n removeAll,\n addOne: createStateOperator(addOneMutably),\n updateOne: createStateOperator(updateOneMutably),\n upsertOne: createStateOperator(upsertOneMutably),\n setOne: createStateOperator(setOneMutably),\n setMany: createStateOperator(setManyMutably),\n setAll: createStateOperator(setAllMutably),\n addMany: createStateOperator(addManyMutably),\n updateMany: createStateOperator(updateManyMutably),\n upsertMany: createStateOperator(upsertManyMutably)\n };\n}\n\n// src/entities/create_adapter.ts\nfunction createEntityAdapter(options = {}) {\n const {\n selectId,\n sortComparer\n } = {\n sortComparer: false,\n selectId: (instance) => instance.id,\n ...options\n };\n const stateAdapter = sortComparer ? createSortedStateAdapter(selectId, sortComparer) : createUnsortedStateAdapter(selectId);\n const stateFactory = createInitialStateFactory(stateAdapter);\n const selectorsFactory = createSelectorsFactory();\n return {\n selectId,\n sortComparer,\n ...stateFactory,\n ...selectorsFactory,\n ...stateAdapter\n };\n}\n\n// src/listenerMiddleware/index.ts\nimport { isAction as isAction3 } from \"redux\";\n\n// src/listenerMiddleware/exceptions.ts\nvar task = \"task\";\nvar listener = \"listener\";\nvar completed = \"completed\";\nvar cancelled = \"cancelled\";\nvar taskCancelled = `task-${cancelled}`;\nvar taskCompleted = `task-${completed}`;\nvar listenerCancelled = `${listener}-${cancelled}`;\nvar listenerCompleted = `${listener}-${completed}`;\nvar TaskAbortError = class {\n constructor(code) {\n this.code = code;\n this.message = `${task} ${cancelled} (reason: ${code})`;\n }\n name = \"TaskAbortError\";\n message;\n};\n\n// src/listenerMiddleware/utils.ts\nvar assertFunction = (func, expected) => {\n if (typeof func !== \"function\") {\n throw new TypeError(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(32) : `${expected} is not a function`);\n }\n};\nvar noop2 = () => {\n};\nvar catchRejection = (promise, onError = noop2) => {\n promise.catch(onError);\n return promise;\n};\nvar addAbortSignalListener = (abortSignal, callback) => {\n abortSignal.addEventListener(\"abort\", callback, {\n once: true\n });\n return () => abortSignal.removeEventListener(\"abort\", callback);\n};\nvar abortControllerWithReason = (abortController, reason) => {\n const signal = abortController.signal;\n if (signal.aborted) {\n return;\n }\n if (!(\"reason\" in signal)) {\n Object.defineProperty(signal, \"reason\", {\n enumerable: true,\n value: reason,\n configurable: true,\n writable: true\n });\n }\n ;\n abortController.abort(reason);\n};\n\n// src/listenerMiddleware/task.ts\nvar validateActive = (signal) => {\n if (signal.aborted) {\n const {\n reason\n } = signal;\n throw new TaskAbortError(reason);\n }\n};\nfunction raceWithSignal(signal, promise) {\n let cleanup = noop2;\n return new Promise((resolve, reject) => {\n const notifyRejection = () => reject(new TaskAbortError(signal.reason));\n if (signal.aborted) {\n notifyRejection();\n return;\n }\n cleanup = addAbortSignalListener(signal, notifyRejection);\n promise.finally(() => cleanup()).then(resolve, reject);\n }).finally(() => {\n cleanup = noop2;\n });\n}\nvar runTask = async (task2, cleanUp) => {\n try {\n await Promise.resolve();\n const value = await task2();\n return {\n status: \"ok\",\n value\n };\n } catch (error) {\n return {\n status: error instanceof TaskAbortError ? \"cancelled\" : \"rejected\",\n error\n };\n } finally {\n cleanUp?.();\n }\n};\nvar createPause = (signal) => {\n return (promise) => {\n return catchRejection(raceWithSignal(signal, promise).then((output) => {\n validateActive(signal);\n return output;\n }));\n };\n};\nvar createDelay = (signal) => {\n const pause = createPause(signal);\n return (timeoutMs) => {\n return pause(new Promise((resolve) => setTimeout(resolve, timeoutMs)));\n };\n};\n\n// src/listenerMiddleware/index.ts\nvar {\n assign\n} = Object;\nvar INTERNAL_NIL_TOKEN = {};\nvar alm = \"listenerMiddleware\";\nvar createFork = (parentAbortSignal, parentBlockingPromises) => {\n const linkControllers = (controller) => addAbortSignalListener(parentAbortSignal, () => abortControllerWithReason(controller, parentAbortSignal.reason));\n return (taskExecutor, opts) => {\n assertFunction(taskExecutor, \"taskExecutor\");\n const childAbortController = new AbortController();\n linkControllers(childAbortController);\n const result = runTask(async () => {\n validateActive(parentAbortSignal);\n validateActive(childAbortController.signal);\n const result2 = await taskExecutor({\n pause: createPause(childAbortController.signal),\n delay: createDelay(childAbortController.signal),\n signal: childAbortController.signal\n });\n validateActive(childAbortController.signal);\n return result2;\n }, () => abortControllerWithReason(childAbortController, taskCompleted));\n if (opts?.autoJoin) {\n parentBlockingPromises.push(result.catch(noop2));\n }\n return {\n result: createPause(parentAbortSignal)(result),\n cancel() {\n abortControllerWithReason(childAbortController, taskCancelled);\n }\n };\n };\n};\nvar createTakePattern = (startListening, signal) => {\n const take = async (predicate, timeout) => {\n validateActive(signal);\n let unsubscribe = () => {\n };\n const tuplePromise = new Promise((resolve, reject) => {\n let stopListening = startListening({\n predicate,\n effect: (action, listenerApi) => {\n listenerApi.unsubscribe();\n resolve([action, listenerApi.getState(), listenerApi.getOriginalState()]);\n }\n });\n unsubscribe = () => {\n stopListening();\n reject();\n };\n });\n const promises = [tuplePromise];\n if (timeout != null) {\n promises.push(new Promise((resolve) => setTimeout(resolve, timeout, null)));\n }\n try {\n const output = await raceWithSignal(signal, Promise.race(promises));\n validateActive(signal);\n return output;\n } finally {\n unsubscribe();\n }\n };\n return (predicate, timeout) => catchRejection(take(predicate, timeout));\n};\nvar getListenerEntryPropsFrom = (options) => {\n let {\n type,\n actionCreator,\n matcher,\n predicate,\n effect\n } = options;\n if (type) {\n predicate = createAction(type).match;\n } else if (actionCreator) {\n type = actionCreator.type;\n predicate = actionCreator.match;\n } else if (matcher) {\n predicate = matcher;\n } else if (predicate) {\n } else {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(21) : \"Creating or removing a listener requires one of the known fields for matching an action\");\n }\n assertFunction(effect, \"options.listener\");\n return {\n predicate,\n type,\n effect\n };\n};\nvar createListenerEntry = /* @__PURE__ */ assign((options) => {\n const {\n type,\n predicate,\n effect\n } = getListenerEntryPropsFrom(options);\n const entry = {\n id: nanoid(),\n effect,\n type,\n predicate,\n pending: /* @__PURE__ */ new Set(),\n unsubscribe: () => {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(22) : \"Unsubscribe not initialized\");\n }\n };\n return entry;\n}, {\n withTypes: () => createListenerEntry\n});\nvar findListenerEntry = (listenerMap, options) => {\n const {\n type,\n effect,\n predicate\n } = getListenerEntryPropsFrom(options);\n return Array.from(listenerMap.values()).find((entry) => {\n const matchPredicateOrType = typeof type === \"string\" ? entry.type === type : entry.predicate === predicate;\n return matchPredicateOrType && entry.effect === effect;\n });\n};\nvar cancelActiveListeners = (entry) => {\n entry.pending.forEach((controller) => {\n abortControllerWithReason(controller, listenerCancelled);\n });\n};\nvar createClearListenerMiddleware = (listenerMap) => {\n return () => {\n listenerMap.forEach(cancelActiveListeners);\n listenerMap.clear();\n };\n};\nvar safelyNotifyError = (errorHandler, errorToNotify, errorInfo) => {\n try {\n errorHandler(errorToNotify, errorInfo);\n } catch (errorHandlerError) {\n setTimeout(() => {\n throw errorHandlerError;\n }, 0);\n }\n};\nvar addListener = /* @__PURE__ */ assign(/* @__PURE__ */ createAction(`${alm}/add`), {\n withTypes: () => addListener\n});\nvar clearAllListeners = /* @__PURE__ */ createAction(`${alm}/removeAll`);\nvar removeListener = /* @__PURE__ */ assign(/* @__PURE__ */ createAction(`${alm}/remove`), {\n withTypes: () => removeListener\n});\nvar defaultErrorHandler = (...args) => {\n console.error(`${alm}/error`, ...args);\n};\nvar createListenerMiddleware = (middlewareOptions = {}) => {\n const listenerMap = /* @__PURE__ */ new Map();\n const {\n extra,\n onError = defaultErrorHandler\n } = middlewareOptions;\n assertFunction(onError, \"onError\");\n const insertEntry = (entry) => {\n entry.unsubscribe = () => listenerMap.delete(entry.id);\n listenerMap.set(entry.id, entry);\n return (cancelOptions) => {\n entry.unsubscribe();\n if (cancelOptions?.cancelActive) {\n cancelActiveListeners(entry);\n }\n };\n };\n const startListening = (options) => {\n const entry = findListenerEntry(listenerMap, options) ?? createListenerEntry(options);\n return insertEntry(entry);\n };\n assign(startListening, {\n withTypes: () => startListening\n });\n const stopListening = (options) => {\n const entry = findListenerEntry(listenerMap, options);\n if (entry) {\n entry.unsubscribe();\n if (options.cancelActive) {\n cancelActiveListeners(entry);\n }\n }\n return !!entry;\n };\n assign(stopListening, {\n withTypes: () => stopListening\n });\n const notifyListener = async (entry, action, api, getOriginalState) => {\n const internalTaskController = new AbortController();\n const take = createTakePattern(startListening, internalTaskController.signal);\n const autoJoinPromises = [];\n try {\n entry.pending.add(internalTaskController);\n await Promise.resolve(entry.effect(\n action,\n // Use assign() rather than ... to avoid extra helper functions added to bundle\n assign({}, api, {\n getOriginalState,\n condition: (predicate, timeout) => take(predicate, timeout).then(Boolean),\n take,\n delay: createDelay(internalTaskController.signal),\n pause: createPause(internalTaskController.signal),\n extra,\n signal: internalTaskController.signal,\n fork: createFork(internalTaskController.signal, autoJoinPromises),\n unsubscribe: entry.unsubscribe,\n subscribe: () => {\n listenerMap.set(entry.id, entry);\n },\n cancelActiveListeners: () => {\n entry.pending.forEach((controller, _, set) => {\n if (controller !== internalTaskController) {\n abortControllerWithReason(controller, listenerCancelled);\n set.delete(controller);\n }\n });\n },\n cancel: () => {\n abortControllerWithReason(internalTaskController, listenerCancelled);\n entry.pending.delete(internalTaskController);\n },\n throwIfCancelled: () => {\n validateActive(internalTaskController.signal);\n }\n })\n ));\n } catch (listenerError) {\n if (!(listenerError instanceof TaskAbortError)) {\n safelyNotifyError(onError, listenerError, {\n raisedBy: \"effect\"\n });\n }\n } finally {\n await Promise.all(autoJoinPromises);\n abortControllerWithReason(internalTaskController, listenerCompleted);\n entry.pending.delete(internalTaskController);\n }\n };\n const clearListenerMiddleware = createClearListenerMiddleware(listenerMap);\n const middleware = (api) => (next) => (action) => {\n if (!isAction3(action)) {\n return next(action);\n }\n if (addListener.match(action)) {\n return startListening(action.payload);\n }\n if (clearAllListeners.match(action)) {\n clearListenerMiddleware();\n return;\n }\n if (removeListener.match(action)) {\n return stopListening(action.payload);\n }\n let originalState = api.getState();\n const getOriginalState = () => {\n if (originalState === INTERNAL_NIL_TOKEN) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(23) : `${alm}: getOriginalState can only be called synchronously`);\n }\n return originalState;\n };\n let result;\n try {\n result = next(action);\n if (listenerMap.size > 0) {\n const currentState = api.getState();\n const listenerEntries = Array.from(listenerMap.values());\n for (const entry of listenerEntries) {\n let runListener = false;\n try {\n runListener = entry.predicate(action, currentState, originalState);\n } catch (predicateError) {\n runListener = false;\n safelyNotifyError(onError, predicateError, {\n raisedBy: \"predicate\"\n });\n }\n if (!runListener) {\n continue;\n }\n notifyListener(entry, action, api, getOriginalState);\n }\n }\n } finally {\n originalState = INTERNAL_NIL_TOKEN;\n }\n return result;\n };\n return {\n middleware,\n startListening,\n stopListening,\n clearListeners: clearListenerMiddleware\n };\n};\n\n// src/dynamicMiddleware/index.ts\nimport { compose as compose3 } from \"redux\";\nvar createMiddlewareEntry = (middleware) => ({\n middleware,\n applied: /* @__PURE__ */ new Map()\n});\nvar matchInstance = (instanceId) => (action) => action?.meta?.instanceId === instanceId;\nvar createDynamicMiddleware = () => {\n const instanceId = nanoid();\n const middlewareMap = /* @__PURE__ */ new Map();\n const withMiddleware = Object.assign(createAction(\"dynamicMiddleware/add\", (...middlewares) => ({\n payload: middlewares,\n meta: {\n instanceId\n }\n })), {\n withTypes: () => withMiddleware\n });\n const addMiddleware = Object.assign(function addMiddleware2(...middlewares) {\n middlewares.forEach((middleware2) => {\n getOrInsertComputed(middlewareMap, middleware2, createMiddlewareEntry);\n });\n }, {\n withTypes: () => addMiddleware\n });\n const getFinalMiddleware = (api) => {\n const appliedMiddleware = Array.from(middlewareMap.values()).map((entry) => getOrInsertComputed(entry.applied, api, entry.middleware));\n return compose3(...appliedMiddleware);\n };\n const isWithMiddleware = isAllOf(withMiddleware, matchInstance(instanceId));\n const middleware = (api) => (next) => (action) => {\n if (isWithMiddleware(action)) {\n addMiddleware(...action.payload);\n return api.dispatch;\n }\n return getFinalMiddleware(api)(next)(action);\n };\n return {\n middleware,\n addMiddleware,\n withMiddleware,\n instanceId\n };\n};\n\n// src/combineSlices.ts\nimport { combineReducers as combineReducers2 } from \"redux\";\nvar isSliceLike = (maybeSliceLike) => \"reducerPath\" in maybeSliceLike && typeof maybeSliceLike.reducerPath === \"string\";\nvar getReducers = (slices) => slices.flatMap((sliceOrMap) => isSliceLike(sliceOrMap) ? [[sliceOrMap.reducerPath, sliceOrMap.reducer]] : Object.entries(sliceOrMap));\nvar ORIGINAL_STATE = Symbol.for(\"rtk-state-proxy-original\");\nvar isStateProxy = (value) => !!value && !!value[ORIGINAL_STATE];\nvar stateProxyMap = /* @__PURE__ */ new WeakMap();\nvar createStateProxy = (state, reducerMap, initialStateCache) => getOrInsertComputed(stateProxyMap, state, () => new Proxy(state, {\n get: (target, prop, receiver) => {\n if (prop === ORIGINAL_STATE) return target;\n const result = Reflect.get(target, prop, receiver);\n if (typeof result === \"undefined\") {\n const cached = initialStateCache[prop];\n if (typeof cached !== \"undefined\") return cached;\n const reducer = reducerMap[prop];\n if (reducer) {\n const reducerResult = reducer(void 0, {\n type: nanoid()\n });\n if (typeof reducerResult === \"undefined\") {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(24) : `The slice reducer for key \"${prop.toString()}\" returned undefined when called for selector(). If the state passed to the reducer is undefined, you must explicitly return the initial state. The initial state may not be undefined. If you don't want to set a value for this reducer, you can use null instead of undefined.`);\n }\n initialStateCache[prop] = reducerResult;\n return reducerResult;\n }\n }\n return result;\n }\n}));\nvar original = (state) => {\n if (!isStateProxy(state)) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(25) : \"original must be used on state Proxy\");\n }\n return state[ORIGINAL_STATE];\n};\nvar emptyObject = {};\nvar noopReducer = (state = emptyObject) => state;\nfunction combineSlices(...slices) {\n const reducerMap = Object.fromEntries(getReducers(slices));\n const getReducer = () => Object.keys(reducerMap).length ? combineReducers2(reducerMap) : noopReducer;\n let reducer = getReducer();\n function combinedReducer(state, action) {\n return reducer(state, action);\n }\n combinedReducer.withLazyLoadedSlices = () => combinedReducer;\n const initialStateCache = {};\n const inject = (slice, config = {}) => {\n const {\n reducerPath,\n reducer: reducerToInject\n } = slice;\n const currentReducer = reducerMap[reducerPath];\n if (!config.overrideExisting && currentReducer && currentReducer !== reducerToInject) {\n if (typeof process !== \"undefined\" && process.env.NODE_ENV === \"development\") {\n console.error(`called \\`inject\\` to override already-existing reducer ${reducerPath} without specifying \\`overrideExisting: true\\``);\n }\n return combinedReducer;\n }\n if (config.overrideExisting && currentReducer !== reducerToInject) {\n delete initialStateCache[reducerPath];\n }\n reducerMap[reducerPath] = reducerToInject;\n reducer = getReducer();\n return combinedReducer;\n };\n const selector = Object.assign(function makeSelector(selectorFn, selectState) {\n return function selector2(state, ...args) {\n return selectorFn(createStateProxy(selectState ? selectState(state, ...args) : state, reducerMap, initialStateCache), ...args);\n };\n }, {\n original\n });\n return Object.assign(combinedReducer, {\n inject,\n selector\n });\n}\n\n// src/formatProdErrorMessage.ts\nfunction formatProdErrorMessage(code) {\n return `Minified Redux Toolkit error #${code}; visit https://redux-toolkit.js.org/Errors?code=${code} for the full message or use the non-minified dev environment for full errors. `;\n}\nexport {\n ReducerType,\n SHOULD_AUTOBATCH,\n TaskAbortError,\n Tuple,\n addListener,\n asyncThunkCreator,\n autoBatchEnhancer,\n buildCreateSlice,\n clearAllListeners,\n combineSlices,\n configureStore,\n createAction,\n createActionCreatorInvariantMiddleware,\n createAsyncThunk,\n createDraftSafeSelector,\n createDraftSafeSelectorCreator,\n createDynamicMiddleware,\n createEntityAdapter,\n createImmutableStateInvariantMiddleware,\n createListenerMiddleware,\n produce as createNextState,\n createReducer,\n createSelector,\n createSelectorCreator2 as createSelectorCreator,\n createSerializableStateInvariantMiddleware,\n createSlice,\n current3 as current,\n findNonSerializableValue,\n formatProdErrorMessage,\n freeze,\n isActionCreator,\n isAllOf,\n isAnyOf,\n isAsyncThunkAction,\n isDraft5 as isDraft,\n isFSA as isFluxStandardAction,\n isFulfilled,\n isImmutableDefault,\n isPending,\n isPlain,\n isRejected,\n isRejectedWithValue,\n lruMemoize,\n miniSerializeError,\n nanoid,\n original2 as original,\n prepareAutoBatched,\n removeListener,\n unwrapResult,\n weakMapMemoize2 as weakMapMemoize\n};\n//# sourceMappingURL=redux-toolkit.modern.mjs.map","import { createAction } from '@reduxjs/toolkit';\n\nimport { TimeRange } from '@grafana/data';\n\nimport { FuncInstance } from '../gfunc';\nimport { GraphiteQuery, GraphiteQueryEditorDependencies, GraphiteSegment, GraphiteTag } from '../types';\n\n/**\n * List of possible actions changing the state of QueryEditor\n */\n\nconst init = createAction<GraphiteQueryEditorDependencies>('init');\n\n/**\n * Synchronise editor dependencies with internal state.\n */\nconst timeRangeChanged = createAction<TimeRange | undefined>('time-range-changed');\nconst queriesChanged = createAction<GraphiteQuery[] | undefined>('queries-changed');\nconst queryChanged = createAction<GraphiteQuery>('query-changed');\n\n// Metrics & Tags\nconst segmentValueChanged = createAction<{ segment: GraphiteSegment | string; index: number }>('segment-value-changed');\n\n// Tags\nconst addNewTag = createAction<{ segment: GraphiteSegment }>('add-new-tag');\nconst tagChanged = createAction<{ tag: GraphiteTag; index: number }>('tag-changed');\nconst unpause = createAction('unpause');\n\n// Functions\nconst addFunction = createAction<{ name: string }>('add-function');\nconst removeFunction = createAction<{ func: FuncInstance }>('remove-function');\nconst moveFunction = createAction<{ func: FuncInstance; offset: number }>('move-function');\nconst updateFunctionParam = createAction<{ func: FuncInstance; index: number; value: string }>('change-function-param');\n\n// Text editor\nconst updateQuery = createAction<{ query: string }>('update-query');\nconst runQuery = createAction('run-current-query');\nconst toggleEditorMode = createAction('toggle-editor');\n\nexport const actions = {\n init,\n timeRangeChanged,\n queriesChanged,\n queryChanged,\n segmentValueChanged,\n tagChanged,\n addNewTag,\n unpause,\n addFunction,\n removeFunction,\n moveFunction,\n updateFunctionParam,\n updateQuery,\n runQuery,\n toggleEditorMode,\n};\n","import { bind } from 'lodash';\n\n// This is auto generated from the unicode tables.\n// The tables are at:\n// http://www.fileformat.info/info/unicode/category/Lu/list.htm\n// http://www.fileformat.info/info/unicode/category/Ll/list.htm\n// http://www.fileformat.info/info/unicode/category/Lt/list.htm\n// http://www.fileformat.info/info/unicode/category/Lm/list.htm\n// http://www.fileformat.info/info/unicode/category/Lo/list.htm\n// http://www.fileformat.info/info/unicode/category/Nl/list.htm\n\nconst unicodeLetterTable = [\n 170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736, 740, 748, 748, 750, 750, 880, 884, 886,\n 887, 890, 893, 902, 902, 904, 906, 908, 908, 910, 929, 931, 1013, 1015, 1153, 1162, 1319, 1329, 1366, 1369, 1369,\n 1377, 1415, 1488, 1514, 1520, 1522, 1568, 1610, 1646, 1647, 1649, 1747, 1749, 1749, 1765, 1766, 1774, 1775, 1786,\n 1788, 1791, 1791, 1808, 1808, 1810, 1839, 1869, 1957, 1969, 1969, 1994, 2026, 2036, 2037, 2042, 2042, 2048, 2069,\n 2074, 2074, 2084, 2084, 2088, 2088, 2112, 2136, 2308, 2361, 2365, 2365, 2384, 2384, 2392, 2401, 2417, 2423, 2425,\n 2431, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2493, 2493, 2510, 2510, 2524, 2525,\n 2527, 2529, 2544, 2545, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2649,\n 2652, 2654, 2654, 2674, 2676, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749,\n 2768, 2768, 2784, 2785, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2877, 2877, 2908,\n 2909, 2911, 2913, 2929, 2929, 2947, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975,\n 2979, 2980, 2984, 2986, 2990, 3001, 3024, 3024, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125, 3129, 3133,\n 3133, 3160, 3161, 3168, 3169, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3261, 3261, 3294, 3294,\n 3296, 3297, 3313, 3314, 3333, 3340, 3342, 3344, 3346, 3386, 3389, 3389, 3406, 3406, 3424, 3425, 3450, 3455, 3461,\n 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634, 3635, 3648, 3654, 3713, 3714, 3716, 3716,\n 3719, 3720, 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757,\n 3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3805, 3840, 3840, 3904, 3911, 3913, 3948, 3976, 3980,\n 4096, 4138, 4159, 4159, 4176, 4181, 4186, 4189, 4193, 4193, 4197, 4198, 4206, 4208, 4213, 4225, 4238, 4238, 4256,\n 4293, 4304, 4346, 4348, 4348, 4352, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744, 4746, 4749,\n 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4992,\n 5007, 5024, 5108, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872, 5888, 5900, 5902, 5905, 5920, 5937,\n 5952, 5969, 5984, 5996, 5998, 6000, 6016, 6067, 6103, 6103, 6108, 6108, 6176, 6263, 6272, 6312, 6314, 6314, 6320,\n 6389, 6400, 6428, 6480, 6509, 6512, 6516, 6528, 6571, 6593, 6599, 6656, 6678, 6688, 6740, 6823, 6823, 6917, 6963,\n 6981, 6987, 7043, 7072, 7086, 7087, 7104, 7141, 7168, 7203, 7245, 7247, 7258, 7293, 7401, 7404, 7406, 7409, 7424,\n 7615, 7680, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061,\n 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182,\n 8188, 8305, 8305, 8319, 8319, 8336, 8348, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477, 8484, 8484,\n 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505, 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584, 11264, 11310, 11312,\n 11358, 11360, 11492, 11499, 11502, 11520, 11557, 11568, 11621, 11631, 11631, 11648, 11670, 11680, 11686, 11688, 11694,\n 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728, 11734, 11736, 11742, 11823, 11823, 12293, 12295, 12321,\n 12329, 12337, 12341, 12344, 12348, 12353, 12438, 12445, 12447, 12449, 12538, 12540, 12543, 12549, 12589, 12593, 12686,\n 12704, 12730, 12784, 12799, 13312, 13312, 19893, 19893, 19968, 19968, 40907, 40907, 40960, 42124, 42192, 42237, 42240,\n 42508, 42512, 42527, 42538, 42539, 42560, 42606, 42623, 42647, 42656, 42735, 42775, 42783, 42786, 42888, 42891, 42894,\n 42896, 42897, 42912, 42921, 43002, 43009, 43011, 43013, 43015, 43018, 43020, 43042, 43072, 43123, 43138, 43187, 43250,\n 43255, 43259, 43259, 43274, 43301, 43312, 43334, 43360, 43388, 43396, 43442, 43471, 43471, 43520, 43560, 43584, 43586,\n 43588, 43595, 43616, 43638, 43642, 43642, 43648, 43695, 43697, 43697, 43701, 43702, 43705, 43709, 43712, 43712, 43714,\n 43714, 43739, 43741, 43777, 43782, 43785, 43790, 43793, 43798, 43808, 43814, 43816, 43822, 43968, 44002, 44032, 44032,\n 55203, 55203, 55216, 55238, 55243, 55291, 63744, 64045, 64048, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285,\n 64285, 64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829,\n 64848, 64911, 64914, 64967, 65008, 65019, 65136, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474,\n 65479, 65482, 65487, 65490, 65495, 65498, 65500, 65536, 65547, 65549, 65574, 65576, 65594, 65596, 65597, 65599, 65613,\n 65616, 65629, 65664, 65786, 65856, 65908, 66176, 66204, 66208, 66256, 66304, 66334, 66352, 66378, 66432, 66461, 66464,\n 66499, 66504, 66511, 66513, 66517, 66560, 66717, 67584, 67589, 67592, 67592, 67594, 67637, 67639, 67640, 67644, 67644,\n 67647, 67669, 67840, 67861, 67872, 67897, 68096, 68096, 68112, 68115, 68117, 68119, 68121, 68147, 68192, 68220, 68352,\n 68405, 68416, 68437, 68448, 68466, 68608, 68680, 69635, 69687, 69763, 69807, 73728, 74606, 74752, 74850, 77824, 78894,\n 92160, 92728, 110592, 110593, 119808, 119892, 119894, 119964, 119966, 119967, 119970, 119970, 119973, 119974, 119977,\n 119980, 119982, 119993, 119995, 119995, 119997, 120003, 120005, 120069, 120071, 120074, 120077, 120084, 120086,\n 120092, 120094, 120121, 120123, 120126, 120128, 120132, 120134, 120134, 120138, 120144, 120146, 120485, 120488,\n 120512, 120514, 120538, 120540, 120570, 120572, 120596, 120598, 120628, 120630, 120654, 120656, 120686, 120688,\n 120712, 120714, 120744, 120746, 120770, 120772, 120779, 131072, 131072, 173782, 173782, 173824, 173824, 177972,\n 177972, 177984, 177984, 178205, 178205, 194560, 195101,\n];\n\nconst identifierStartTable: boolean[] = [];\n\nfor (let i = 0; i < 128; i++) {\n identifierStartTable[i] =\n (i >= 48 && i <= 57) || // 0-9\n i === 36 || // $\n i === 126 || // ~\n i === 124 || // |\n (i >= 65 && i <= 90) || // A-Z\n i === 95 || // _\n i === 45 || // -\n i === 42 || // *\n i === 58 || // :\n i === 91 || // templateStart [\n i === 93 || // templateEnd ]\n i === 63 || // ?\n i === 37 || // %\n i === 35 || // #\n i === 61 || // =\n i === 64 || // @\n (i >= 97 && i <= 122); // a-z\n}\n\nconst identifierPartTable = identifierStartTable;\n\nexport class Lexer {\n input: any;\n char: number;\n from: number;\n\n constructor(expression: any) {\n this.input = expression;\n this.char = 1;\n this.from = 1;\n }\n\n peek(i?: number) {\n return this.input.charAt(i || 0);\n }\n\n skip(i?: number) {\n i = i || 1;\n this.char += i;\n this.input = this.input.slice(i);\n }\n\n tokenize() {\n const list = [];\n let token = this.next();\n while (token) {\n list.push(token);\n token = this.next();\n }\n return list;\n }\n\n next() {\n this.from = this.char;\n\n // Move to the next non-space character.\n if (/\\s/.test(this.peek())) {\n while (/\\s/.test(this.peek())) {\n this.from += 1;\n this.skip();\n }\n\n if (this.peek() === '') {\n // EOL\n return null;\n }\n }\n\n let match = this.scanStringLiteral();\n if (match) {\n return match;\n }\n\n match = this.scanPunctuator() || this.scanNumericLiteral() || this.scanIdentifier() || this.scanTemplateSequence();\n\n if (match) {\n this.skip(match.value.length);\n return match;\n }\n\n // No token could be matched, give up.\n return null;\n }\n\n scanTemplateSequence() {\n if (this.peek() === '[' && this.peek(1) === '[') {\n return {\n type: 'templateStart',\n value: '[[',\n pos: this.char,\n };\n }\n\n if (this.peek() === ']' && this.peek(1) === ']') {\n return {\n type: 'templateEnd',\n value: '[[',\n pos: this.char,\n };\n }\n\n return null;\n }\n\n /*\n * Extract a JavaScript identifier out of the next sequence of\n * characters or return 'null' if its not possible. In addition,\n * to Identifier this method can also produce BooleanLiteral\n * (true/false) and NullLiteral (null).\n */\n scanIdentifier() {\n let id = '';\n let index = 0;\n let type, char;\n\n // Detects any character in the Unicode categories \"Uppercase\n // letter (Lu)\", \"Lowercase letter (Ll)\", \"Titlecase letter\n // (Lt)\", \"Modifier letter (Lm)\", \"Other letter (Lo)\", or\n // \"Letter number (Nl)\".\n //\n // Both approach and unicodeLetterTable were borrowed from\n // Google's Traceur.\n\n function isUnicodeLetter(code: number) {\n for (let i = 0; i < unicodeLetterTable.length; ) {\n if (code < unicodeLetterTable[i++]) {\n return false;\n }\n\n if (code <= unicodeLetterTable[i++]) {\n return true;\n }\n }\n\n return false;\n }\n\n function isHexDigit(str: string) {\n return /^[0-9a-fA-F]$/.test(str);\n }\n\n const readUnicodeEscapeSequence = bind(function (this: Lexer) {\n index += 1;\n\n if (this.peek(index) !== 'u') {\n return null;\n }\n\n const ch1 = this.peek(index + 1);\n const ch2 = this.peek(index + 2);\n const ch3 = this.peek(index + 3);\n const ch4 = this.peek(index + 4);\n let code;\n\n if (isHexDigit(ch1) && isHexDigit(ch2) && isHexDigit(ch3) && isHexDigit(ch4)) {\n code = parseInt(ch1 + ch2 + ch3 + ch4, 16);\n\n if (isUnicodeLetter(code)) {\n index += 5;\n return '\\\\u' + ch1 + ch2 + ch3 + ch4;\n }\n\n return null;\n }\n\n return null;\n }, this);\n\n const getIdentifierStart = bind(function (this: Lexer) {\n const chr = this.peek(index);\n const code = chr.charCodeAt(0);\n\n if (chr === '*') {\n index += 1;\n return chr;\n }\n\n if (code === 92) {\n return readUnicodeEscapeSequence();\n }\n\n if (code < 128) {\n if (identifierStartTable[code]) {\n index += 1;\n return chr;\n }\n\n return null;\n }\n\n if (isUnicodeLetter(code)) {\n index += 1;\n return chr;\n }\n\n return null;\n }, this);\n\n const getIdentifierPart = bind(function (this: Lexer) {\n const chr = this.peek(index);\n const code = chr.charCodeAt(0);\n\n if (code === 92) {\n return readUnicodeEscapeSequence();\n }\n\n if (code < 128) {\n if (identifierPartTable[code]) {\n index += 1;\n return chr;\n }\n\n return null;\n }\n\n if (isUnicodeLetter(code)) {\n index += 1;\n return chr;\n }\n\n return null;\n }, this);\n\n char = getIdentifierStart();\n if (char === null) {\n return null;\n }\n\n id = char;\n for (;;) {\n char = getIdentifierPart();\n\n if (char === null) {\n break;\n }\n\n id += char;\n }\n\n switch (id) {\n case 'true': {\n type = 'bool';\n break;\n }\n case 'false': {\n type = 'bool';\n break;\n }\n default:\n type = 'identifier';\n }\n\n return {\n type: type,\n value: id,\n pos: this.char,\n };\n }\n\n /*\n * Extract a numeric literal out of the next sequence of\n * characters or return 'null' if its not possible. This method\n * supports all numeric literals described in section 7.8.3\n * of the EcmaScript 5 specification.\n *\n * This method's implementation was heavily influenced by the\n * scanNumericLiteral function in the Esprima parser's source code.\n */\n scanNumericLiteral(): any {\n let index = 0;\n let value = '';\n const length = this.input.length;\n let char = this.peek(index);\n let bad;\n\n function isDecimalDigit(str: string) {\n return /^[0-9]$/.test(str);\n }\n\n function isOctalDigit(str: string) {\n return /^[0-7]$/.test(str);\n }\n\n function isHexDigit(str: string) {\n return /^[0-9a-fA-F]$/.test(str);\n }\n\n function isIdentifierStart(ch: string) {\n return ch === '$' || ch === '_' || ch === '\\\\' || (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z');\n }\n\n // handle negative num literals\n if (char === '-') {\n value += char;\n index += 1;\n char = this.peek(index);\n }\n\n // Numbers must start either with a decimal digit or a point.\n if (char !== '.' && !isDecimalDigit(char)) {\n return null;\n }\n\n if (char !== '.') {\n value += this.peek(index);\n index += 1;\n char = this.peek(index);\n\n if (value === '0') {\n // Base-16 numbers.\n if (char === 'x' || char === 'X') {\n index += 1;\n value += char;\n\n while (index < length) {\n char = this.peek(index);\n if (!isHexDigit(char)) {\n break;\n }\n value += char;\n index += 1;\n }\n\n if (value.length <= 2) {\n // 0x\n return {\n type: 'number',\n value: value,\n isMalformed: true,\n pos: this.char,\n };\n }\n\n if (index < length) {\n char = this.peek(index);\n if (isIdentifierStart(char)) {\n return null;\n }\n }\n\n return {\n type: 'number',\n value: value,\n base: 16,\n isMalformed: false,\n pos: this.char,\n };\n }\n\n // Base-8 numbers.\n if (isOctalDigit(char)) {\n index += 1;\n value += char;\n bad = false;\n\n while (index < length) {\n char = this.peek(index);\n\n // Numbers like '019' (note the 9) are not valid octals\n // but we still parse them and mark as malformed.\n\n if (isDecimalDigit(char)) {\n bad = true;\n }\n if (!isOctalDigit(char)) {\n // if the char is a non punctuator then its not a valid number\n if (!this.isPunctuator(char)) {\n return null;\n }\n break;\n }\n value += char;\n index += 1;\n }\n\n if (index < length) {\n char = this.peek(index);\n if (isIdentifierStart(char)) {\n return null;\n }\n }\n\n return {\n type: 'number',\n value: value,\n base: 8,\n isMalformed: bad,\n };\n }\n\n // Decimal numbers that start with '0' such as '09' are illegal\n // but we still parse them and return as malformed.\n\n if (isDecimalDigit(char)) {\n index += 1;\n value += char;\n }\n }\n\n while (index < length) {\n char = this.peek(index);\n if (!isDecimalDigit(char)) {\n break;\n }\n value += char;\n index += 1;\n }\n }\n\n // Decimal digits.\n\n if (char === '.') {\n value += char;\n index += 1;\n\n while (index < length) {\n char = this.peek(index);\n if (!isDecimalDigit(char)) {\n break;\n }\n value += char;\n index += 1;\n }\n }\n\n // Exponent part.\n\n if (char === 'e' || char === 'E') {\n value += char;\n index += 1;\n char = this.peek(index);\n\n if (char === '+' || char === '-') {\n value += this.peek(index);\n index += 1;\n }\n\n char = this.peek(index);\n if (isDecimalDigit(char)) {\n value += char;\n index += 1;\n\n while (index < length) {\n char = this.peek(index);\n if (!isDecimalDigit(char)) {\n break;\n }\n value += char;\n index += 1;\n }\n } else {\n return null;\n }\n }\n\n if (index < length) {\n char = this.peek(index);\n if (!this.isPunctuator(char)) {\n return null;\n }\n }\n\n return {\n type: 'number',\n value: value,\n base: 10,\n pos: this.char,\n isMalformed: !isFinite(+value),\n };\n }\n\n isPunctuator(ch1: string) {\n switch (ch1) {\n case '.':\n case '(':\n case ')':\n case ',':\n case '{':\n case '}':\n return true;\n }\n\n return false;\n }\n\n scanPunctuator() {\n const ch1 = this.peek();\n\n if (this.isPunctuator(ch1)) {\n return {\n type: ch1,\n value: ch1,\n pos: this.char,\n };\n }\n\n return null;\n }\n\n /*\n * Extract a string out of the next sequence of characters and/or\n * lines or return 'null' if its not possible. Since strings can\n * span across multiple lines this method has to move the char\n * pointer.\n *\n * This method recognizes pseudo-multiline JavaScript strings:\n *\n * var str = \"hello\\\n * world\";\n */\n scanStringLiteral() {\n const quote = this.peek();\n\n // String must start with a quote.\n if (quote !== '\"' && quote !== \"'\") {\n return null;\n }\n\n let value = '';\n\n this.skip();\n\n while (this.peek() !== quote) {\n if (this.peek() === '') {\n // End Of Line\n return {\n type: 'string',\n value: value,\n isUnclosed: true,\n quote: quote,\n pos: this.char,\n };\n }\n\n const char = this.peek();\n const jump = 1; // A length of a jump, after we're done\n // parsing this character.\n\n value += char;\n this.skip(jump);\n }\n\n this.skip();\n return {\n type: 'string',\n value: value,\n isUnclosed: false,\n quote: quote,\n pos: this.char,\n };\n }\n}\n","import { Lexer } from './lexer';\nimport { GraphiteParserError } from './types';\nimport { isGraphiteParserError } from './utils';\n\nexport class Parser {\n expression: string;\n lexer: Lexer;\n tokens: AstNode[];\n index: number;\n\n constructor(expression: string) {\n this.expression = expression;\n this.lexer = new Lexer(expression);\n this.tokens = this.lexer.tokenize();\n this.index = 0;\n }\n\n getAst() {\n return this.start();\n }\n\n start(): AstNode | null {\n try {\n return this.functionCall() || this.metricExpression();\n } catch (e) {\n if (isGraphiteParserError(e)) {\n return {\n type: 'error',\n message: e.message,\n pos: e.pos,\n };\n }\n }\n return null;\n }\n\n curlyBraceSegment(): AstNode | null {\n if (this.match('identifier', '{') || this.match('{')) {\n let curlySegment = '';\n\n while (!this.match('') && !this.match('}')) {\n curlySegment += this.consumeToken().value;\n }\n\n if (!this.match('}')) {\n this.errorMark(\"Expected closing '}'\");\n }\n\n curlySegment += this.consumeToken().value;\n\n // if curly segment is directly followed by identifier\n // include it in the segment\n if (this.match('identifier')) {\n curlySegment += this.consumeToken().value;\n }\n\n return {\n type: 'segment',\n value: curlySegment,\n };\n } else {\n return null;\n }\n }\n\n metricSegment(): AstNode | null {\n const curly = this.curlyBraceSegment();\n if (curly) {\n return curly;\n }\n\n if (this.match('identifier') || this.match('number') || this.match('bool')) {\n // hack to handle float numbers in metric segments\n const tokenValue = this.consumeToken().value;\n const parts = tokenValue && typeof tokenValue === 'string' ? tokenValue.split('.') : '';\n if (parts.length === 2) {\n this.tokens.splice(this.index, 0, { type: '.' });\n this.tokens.splice(this.index + 1, 0, {\n type: 'number',\n value: parts[1],\n });\n }\n\n return {\n type: 'segment',\n value: parts[0],\n };\n }\n\n if (!this.match('templateStart')) {\n this.errorMark('Expected metric identifier');\n }\n\n this.consumeToken();\n\n if (!this.match('identifier')) {\n this.errorMark('Expected identifier after templateStart');\n }\n\n const node = {\n type: 'template',\n value: this.consumeToken().value,\n };\n\n if (!this.match('templateEnd')) {\n this.errorMark('Expected templateEnd');\n }\n\n this.consumeToken();\n return node;\n }\n\n metricExpression(): AstNode | null {\n if (!this.match('templateStart') && !this.match('identifier') && !this.match('number') && !this.match('{')) {\n return null;\n }\n\n const node: AstNode = {\n type: 'metric',\n segments: [],\n };\n\n const segments = this.metricSegment();\n\n if (node.segments && segments) {\n node.segments.push(segments);\n }\n\n while (this.match('.')) {\n this.consumeToken();\n\n const segment = this.metricSegment();\n if (!segment) {\n this.errorMark('Expected metric identifier');\n }\n if (node.segments && segment) {\n node.segments.push(segment);\n }\n }\n\n return node;\n }\n\n functionCall(): AstNode | null {\n if (!this.match('identifier', '(')) {\n return null;\n }\n\n let name = '';\n const token = this.consumeToken();\n if (typeof token.value === 'string') {\n name = token.value;\n }\n\n const node: AstNode = {\n type: 'function',\n name: name,\n };\n\n // consume left parenthesis\n this.consumeToken();\n\n node.params = this.functionParameters();\n\n if (!this.match(')')) {\n this.errorMark('Expected closing parenthesis');\n }\n\n this.consumeToken();\n\n return node;\n }\n\n boolExpression(): AstNode | null {\n if (!this.match('bool')) {\n return null;\n }\n\n return {\n type: 'bool',\n value: this.consumeToken().value === 'true',\n };\n }\n\n functionParameters(): AstNode[] | [] {\n if (this.match(')') || this.match('')) {\n return [];\n }\n\n const param =\n this.functionCall() ||\n this.numericLiteral() ||\n this.seriesRefExpression() ||\n this.boolExpression() ||\n this.metricExpression() ||\n this.stringLiteral();\n\n if (!this.match(',') && param) {\n return [param];\n }\n\n this.consumeToken();\n\n if (param) {\n return [param].concat(this.functionParameters());\n }\n return [];\n }\n\n seriesRefExpression(): AstNode | null {\n if (!this.match('identifier')) {\n return null;\n }\n\n const value = this.tokens[this.index].value;\n if (value && typeof value === 'string' && !value.match(/\\#[A-Z]/)) {\n return null;\n }\n\n const token = this.consumeToken();\n\n return {\n type: 'series-ref',\n value: token.value,\n };\n }\n\n numericLiteral(): AstNode | null {\n if (!this.match('number')) {\n return null;\n }\n\n const token = this.consumeToken();\n if (token && token.value && typeof token.value === 'string') {\n return {\n type: 'number',\n value: parseFloat(token.value),\n };\n }\n return null;\n }\n\n stringLiteral(): AstNode | null {\n if (!this.match('string')) {\n return null;\n }\n\n const token = this.consumeToken();\n if (token.isUnclosed && token.pos) {\n const error: GraphiteParserError = {\n message: 'Unclosed string parameter',\n pos: token.pos,\n };\n throw error;\n }\n\n return {\n type: 'string',\n value: token.value,\n };\n }\n\n errorMark(text: string) {\n const currentToken = this.tokens[this.index];\n const type = currentToken ? currentToken.type : 'end of string';\n const error: GraphiteParserError = {\n message: text + ' instead found ' + type,\n pos: currentToken && currentToken.pos ? currentToken.pos : this.lexer.char,\n };\n throw error;\n }\n\n // returns token value and incre\n consumeToken() {\n this.index++;\n return this.tokens[this.index - 1];\n }\n\n matchToken(type: string, index: number) {\n const token = this.tokens[this.index + index];\n return (token === undefined && type === '') || (token && token.type === type);\n }\n\n match(token1: string, token2?: string) {\n return this.matchToken(token1, 0) && (!token2 || this.matchToken(token2, 1));\n }\n}\n\n// Next steps, need to make this applicable to types in graphite_query.ts\nexport type AstNode = {\n type: string;\n name?: string;\n params?: AstNode[];\n value?: string | number | boolean;\n segments?: AstNode[];\n message?: string;\n pos?: number;\n isUnclosed?: boolean;\n};\n","import { last } from 'lodash';\n\nimport { GraphiteParserError } from './types';\n\n/**\n * Graphite-web before v1.6 returns HTTP 500 with full stack traces in an HTML page\n * when a query fails. It results in massive error alerts with HTML tags in the UI.\n * This function removes all HTML tags and keeps only the last line from the stack\n * trace which should be the most meaningful.\n */\nexport function reduceError(error: any) {\n if (error && error.status === 500 && error.data?.message?.startsWith('<body')) {\n // Remove all HTML tags and take the last line from the stack trace\n const newMessage = last<string>(\n error.data.message\n .replace(/(<([^>]+)>)/gi, '')\n .trim()\n .split(/\\n/)\n )!.replace(/u?&#[^;]+;/g, '');\n error.data.message = `Graphite encountered an unexpected error while handling your request. ${newMessage}`;\n }\n return error;\n}\n\nexport function isGraphiteParserError(e: unknown): e is GraphiteParserError {\n return typeof e === 'object' && e !== null && 'message' in e && 'pos' in e;\n}\n\nexport const arrayMove = <T>(array: T[], fromIndex: number, toIndex: number): T[] => {\n array.splice(toIndex, 0, array.splice(fromIndex, 1)[0]);\n return array;\n};\n","import { compact, each, findIndex, flatten, get, join, keyBy, last, map, reduce, without } from 'lodash';\n\nimport { ScopedVars } from '@grafana/data';\nimport { TemplateSrv } from '@grafana/runtime';\n\nimport { GraphiteDatasource } from './datasource';\nimport { FuncInstance } from './gfunc';\nimport { AstNode, Parser } from './parser';\nimport { GraphiteSegment } from './types';\nimport { arrayMove } from './utils';\n\nexport type GraphiteTagOperator = '=' | '=~' | '!=' | '!=~';\n\nexport type GraphiteTag = {\n key: string;\n operator: GraphiteTagOperator;\n value: string;\n};\n\nexport type GraphiteTarget = {\n refId: string | number;\n target: string;\n /**\n * Contains full query after interpolating sub-queries (e.g. \"function(#A)\" referencing query with refId=A)\n */\n targetFull: string;\n textEditor: boolean;\n paused: boolean;\n};\n\nexport default class GraphiteQuery {\n datasource: GraphiteDatasource;\n target: GraphiteTarget;\n functions: FuncInstance[] = [];\n segments: GraphiteSegment[] = [];\n tags: GraphiteTag[] = [];\n error: any;\n seriesByTagUsed = false;\n checkOtherSegmentsIndex = 0;\n removeTagValue: string;\n templateSrv: TemplateSrv | undefined;\n scopedVars?: ScopedVars;\n\n constructor(datasource: GraphiteDatasource, target: any, templateSrv?: TemplateSrv, scopedVars?: ScopedVars) {\n this.datasource = datasource;\n this.target = target;\n this.templateSrv = templateSrv;\n this.scopedVars = scopedVars;\n this.parseTarget();\n\n this.removeTagValue = '-- remove tag --';\n }\n\n parseTarget() {\n this.functions = [];\n this.segments = [];\n this.tags = [];\n this.seriesByTagUsed = false;\n this.error = null;\n\n if (this.target.textEditor) {\n return;\n }\n\n const parser = new Parser(this.target.target);\n const astNode = parser.getAst();\n if (astNode === null) {\n this.checkOtherSegmentsIndex = 0;\n return;\n }\n\n if (astNode.type === 'error') {\n this.error = astNode.message + ' at position: ' + astNode.pos;\n this.target.textEditor = true;\n return;\n }\n\n try {\n this.parseTargetRecursive(astNode, null);\n if (this.target.target) {\n const oldQuery = this.target.target;\n const newQuery = this.generateQueryString();\n\n // Spaces, quotes, and commas are used when rendering the AST back into a string.\n // We are removing these for less false positives of query changes.\n const sanitizeQuery = (o: string): string => o.replace(/\\s|'|\"|,/g, '');\n const oldSanitized = sanitizeQuery(oldQuery);\n const newSanitized = sanitizeQuery(newQuery);\n if (oldSanitized && newSanitized && oldSanitized !== newSanitized) {\n throw new Error(\n `Failed to make a visual query builder query that is equivalent to the query.\\nOriginal query: ${oldQuery}\\nQuery builder query: ${newQuery}`\n );\n }\n }\n } catch (err) {\n if (err instanceof Error) {\n console.error('error parsing target:', err.message);\n this.error = err.message;\n }\n this.target.textEditor = true;\n }\n\n this.checkOtherSegmentsIndex = this.segments.length - 1;\n }\n\n getSegmentPathUpTo(index: number) {\n const arr = this.segments.slice(0, index);\n\n return reduce(\n arr,\n (result, segment) => {\n return result ? result + '.' + segment.value : segment.value;\n },\n ''\n );\n }\n\n parseTargetRecursive(astNode: any, func: any): any {\n if (astNode === null) {\n return null;\n }\n\n switch (astNode.type) {\n case 'function':\n const innerFunc = this.datasource.createFuncInstance(astNode.name, {\n withDefaultParams: false,\n });\n\n // bug fix for parsing multiple functions as params\n handleMultipleSeriesByTagsParams(astNode);\n\n handleDivideSeriesListsNestedFunctions(astNode);\n\n each(astNode.params, (param) => {\n this.parseTargetRecursive(param, innerFunc);\n });\n\n innerFunc.updateText();\n this.functions.push(innerFunc);\n\n // extract tags from seriesByTag function and hide function\n if (innerFunc.def.name === 'seriesByTag' && !this.seriesByTagUsed) {\n this.seriesByTagUsed = true;\n innerFunc.hidden = true;\n this.tags = this.splitSeriesByTagParams(innerFunc);\n }\n\n break;\n case 'series-ref':\n if (this.segments.length > 0 || this.getSeriesByTagFuncIndex() >= 0) {\n this.addFunctionParameter(func, astNode.value);\n } else {\n this.segments.push(astNode);\n }\n break;\n case 'bool':\n case 'string':\n case 'number':\n this.addFunctionParameter(func, astNode.value);\n break;\n case 'metric':\n if (this.segments.length || this.tags.length) {\n this.addFunctionParameter(func, join(map(astNode.segments, 'value'), '.'));\n } else {\n this.segments = astNode.segments;\n }\n break;\n }\n }\n\n updateSegmentValue(segment: GraphiteSegment, index: number) {\n this.segments[index].value = segment.value;\n }\n\n addSelectMetricSegment() {\n this.segments.push({ value: 'select metric' });\n }\n\n addFunction(newFunc: FuncInstance) {\n this.functions.push(newFunc);\n }\n\n addFunctionParameter(func: FuncInstance, value: string) {\n if (func.params.length >= func.def.params.length && !get(last(func.def.params), 'multiple', false)) {\n throw { message: 'too many parameters for function ' + func.def.name };\n }\n func.params.push(value);\n }\n\n removeFunction(func: FuncInstance) {\n this.functions = without(this.functions, func);\n }\n\n moveFunction(func: FuncInstance, offset: number) {\n const index = this.functions.indexOf(func);\n arrayMove(this.functions, index, index + offset);\n }\n\n generateQueryString(): string {\n const wrapFunction = (target: string, func: FuncInstance) => {\n return func.render(target, (value: string) => {\n return this.templateSrv ? this.templateSrv.replace(value, this.scopedVars) : value;\n });\n };\n const metricPath = this.getSegmentPathUpTo(this.segments.length).replace(/\\.?select metric$/, '');\n return reduce(this.functions, wrapFunction, metricPath);\n }\n\n updateModelTarget(targets: any) {\n if (!this.target.textEditor) {\n this.target.target = this.generateQueryString();\n }\n\n this.updateRenderedTarget(this.target, targets);\n\n // loop through other queries and update targetFull as needed\n for (const target of targets || []) {\n if (target.refId !== this.target.refId) {\n this.updateRenderedTarget(target, targets);\n }\n }\n\n // clean-up added param\n this.functions.forEach((func) => (func.added = false));\n }\n\n updateRenderedTarget(target: { refId: string | number; target: string; targetFull: any }, targets: any) {\n // render nested query\n const targetsByRefId = keyBy(targets, 'refId');\n\n const nestedSeriesRefRegex = /\\#([A-Z])/g;\n let targetWithNestedQueries = target.target;\n\n // Use ref count to track circular references\n each(targetsByRefId, (t, id) => {\n const regex = RegExp(`\\#(${id})`, 'g');\n let refCount = 0;\n each(targetsByRefId, (t2, id2) => {\n if (id2 !== id) {\n const refMatches = t2.target.match(regex);\n refCount += refMatches?.length ?? 0;\n }\n });\n t.refCount = refCount;\n });\n\n // Keep interpolating until there are no query references\n // The reason for the loop is that the referenced query might contain another reference to another query\n while (targetWithNestedQueries.match(nestedSeriesRefRegex)) {\n const updated = targetWithNestedQueries.replace(nestedSeriesRefRegex, (match: string, g1: string) => {\n const t = targetsByRefId[g1];\n if (!t) {\n return match;\n }\n\n // no circular references\n if (t.refCount === 0) {\n delete targetsByRefId[g1];\n }\n t.refCount--;\n\n return t.target;\n });\n\n if (updated === targetWithNestedQueries) {\n break;\n }\n\n targetWithNestedQueries = updated;\n }\n\n delete target.targetFull;\n if (target.target !== targetWithNestedQueries) {\n target.targetFull = targetWithNestedQueries;\n }\n }\n\n splitSeriesByTagParams(func: { params: any }) {\n const tagPattern = /([^\\!=~]+)(\\!?=~?)(.*)/;\n return flatten(\n map(func.params, (param: string) => {\n const matches = tagPattern.exec(param);\n if (matches) {\n const tag = matches.slice(1);\n if (tag.length === 3) {\n return {\n key: tag[0],\n operator: tag[1] as GraphiteTagOperator,\n value: tag[2],\n };\n }\n }\n return [];\n })\n );\n }\n\n getSeriesByTagFuncIndex() {\n return findIndex(this.functions, (func) => func.def.name === 'seriesByTag');\n }\n\n getSeriesByTagFunc() {\n const seriesByTagFuncIndex = this.getSeriesByTagFuncIndex();\n if (seriesByTagFuncIndex >= 0) {\n return this.functions[seriesByTagFuncIndex];\n } else {\n return undefined;\n }\n }\n\n addTag(tag: { key: string; operator: GraphiteTagOperator; value: string }) {\n const newTagParam = renderTagString(tag);\n this.getSeriesByTagFunc()!.params.push(newTagParam);\n this.tags.push(tag);\n }\n\n removeTag(index: number) {\n this.getSeriesByTagFunc()!.params.splice(index, 1);\n this.tags.splice(index, 1);\n }\n\n updateTag(tag: { key: string; operator: GraphiteTagOperator; value: string }, tagIndex: number) {\n this.error = null;\n\n if (tag.key === this.removeTagValue) {\n this.removeTag(tagIndex);\n if (this.tags.length === 0) {\n const funcToRemove = this.getSeriesByTagFunc();\n if (funcToRemove) {\n this.removeFunction(funcToRemove);\n }\n this.checkOtherSegmentsIndex = 0;\n this.seriesByTagUsed = false;\n }\n return;\n }\n\n this.getSeriesByTagFunc()!.params[tagIndex] = renderTagString(tag);\n this.tags[tagIndex] = tag;\n }\n\n renderTagExpressions(excludeIndex = -1) {\n return compact(\n map(this.tags, (tagExpr, index) => {\n // Don't render tag that we want to lookup\n if (index !== excludeIndex) {\n return tagExpr.key + tagExpr.operator + tagExpr.value;\n } else {\n return undefined;\n }\n })\n );\n }\n}\n\nfunction renderTagString(tag: { key: string; operator?: GraphiteTagOperator; value?: string }) {\n return tag.key + tag.operator + tag.value;\n}\n\n/**\n * mutates the second seriesByTag function into a string to fix a parsing bug\n * @param astNode\n * @param innerFunc\n */\nfunction handleMultipleSeriesByTagsParams(astNode: AstNode) {\n // if function has two params that are function seriesByTags keep the second as a string otherwise we have a parsing error\n if (astNode.params && astNode.params.length >= 2) {\n let count = 0;\n astNode.params = astNode.params.map((p: AstNode) => {\n if (p.type === 'function') {\n count += 1;\n }\n\n if (count === 2 && p.type === 'function' && p.name === 'seriesByTag') {\n // convert second function to a string\n const stringParams =\n p.params &&\n p.params.reduce((acc: string, p: AstNode, idx: number, paramsArr: AstNode[]) => {\n if (idx === 0 || idx !== paramsArr.length - 1) {\n return `${acc}'${p.value}',`;\n }\n\n return `${acc}'${p.value}'`;\n }, '');\n\n return {\n type: 'string',\n value: `${p.name}(${stringParams})`,\n };\n }\n\n return p;\n });\n }\n}\n\n/**\n * Converts all nested functions as parametors (recursively) to strings\n */\nfunction handleDivideSeriesListsNestedFunctions(astNode: AstNode) {\n // if divideSeriesLists function, the second parameters should be strings\n if (astNode.name === 'divideSeriesLists' && astNode.params && astNode.params.length >= 2) {\n astNode.params = astNode.params.map((p: AstNode, idx: number) => {\n if (idx === 1 && p.type === 'function') {\n // convert nested 2nd functions as parametors to a strings\n // all nested functions should be strings\n // if the node is a function it will have params\n // if these params are functions, they will have params\n // at some point we will have to add the params as strings\n // then wrap them in the function\n let functionString = '';\n let s = p.name + '(' + nestedFunctionsToString(p, functionString);\n\n p = {\n type: 'string',\n value: s,\n };\n }\n\n return p;\n });\n }\n\n return astNode;\n}\n\nfunction nestedFunctionsToString(node: AstNode, functionString: string): string | undefined {\n let count = 0;\n if (node.params) {\n count++;\n\n const paramsLength = node.params?.length ?? 0;\n\n node.params.forEach((innerNode: AstNode, idx: number) => {\n if (idx < paramsLength - 1) {\n functionString += switchCase(innerNode, functionString) + ',';\n } else {\n functionString += switchCase(innerNode, functionString);\n }\n });\n\n return functionString + ')';\n } else {\n return (functionString += switchCase(node, functionString));\n }\n}\n\nfunction switchCase(node: AstNode, functionString: string) {\n switch (node.type) {\n case 'function':\n functionString += node.name + '(';\n return nestedFunctionsToString(node, functionString);\n case 'metric':\n const segmentString = join(map(node.segments, 'value'), '.');\n return segmentString;\n default:\n return node.value;\n }\n}\n","import { clone, some } from 'lodash';\n\nimport { AppEvents } from '@grafana/data';\nimport { getAppEvents } from '@grafana/runtime';\n\nimport { FuncInstance } from '../gfunc';\nimport { GraphiteTagOperator } from '../types';\n\nimport { GraphiteQueryEditorState } from './store';\n\n/**\n * Helpers used by reducers and providers. They modify state object directly so should operate on a copy of the state.\n */\n\nexport const GRAPHITE_TAG_OPERATORS: GraphiteTagOperator[] = ['=', '!=', '=~', '!=~'];\n\n/**\n * Tag names and metric names are displayed in a single dropdown. This prefix is used to\n * distinguish both in the UI.\n */\nexport const TAG_PREFIX = 'tag: ';\n\n/**\n * Create new AST based on new query.\n * Build segments from parsed metric name and functions.\n */\nexport async function parseTarget(state: GraphiteQueryEditorState): Promise<void> {\n state.queryModel.parseTarget();\n await buildSegments(state);\n}\n\n/**\n * Create segments out of the current metric path + add \"select metrics\" if it's possible to add more to the path\n */\nexport async function buildSegments(state: GraphiteQueryEditorState, modifyLastSegment = true): Promise<void> {\n // Start with a shallow copy from the model, then check if \"select metric\" segment should be added at the end\n state.segments = clone(state.queryModel.segments);\n\n const checkOtherSegmentsIndex = state.queryModel.checkOtherSegmentsIndex || 0;\n\n await checkOtherSegments(state, checkOtherSegmentsIndex, modifyLastSegment);\n}\n\n/**\n * Add \"select metric\" segment at the end\n */\nexport function addSelectMetricSegment(state: GraphiteQueryEditorState): void {\n state.queryModel.addSelectMetricSegment();\n state.segments.push({ value: 'select metric', fake: true });\n}\n\n/**\n * Validates the state after adding or changing a segment:\n * - adds \"select metric\" only when more segments can be added to the metric name\n * - check if subsequent segments are still valid if in-between segment changes and\n * removes invalid segments.\n */\nexport async function checkOtherSegments(\n state: GraphiteQueryEditorState,\n fromIndex: number,\n modifyLastSegment = true\n): Promise<void> {\n if (state.queryModel.segments.length === 1 && state.queryModel.segments[0].type === 'series-ref') {\n return;\n }\n\n if (fromIndex === 0) {\n addSelectMetricSegment(state);\n return;\n }\n\n const currentFromIndex = fromIndex + 1;\n const path = state.queryModel.getSegmentPathUpTo(currentFromIndex);\n if (path === '') {\n return;\n }\n\n try {\n const segments = await state.datasource.metricFindQuery(path);\n if (segments.length === 0) {\n if (path !== '' && modifyLastSegment) {\n state.queryModel.segments = state.queryModel.segments.splice(0, currentFromIndex);\n state.segments = state.segments.splice(0, currentFromIndex);\n if (!some(state.segments, { fake: true })) {\n addSelectMetricSegment(state);\n }\n }\n } else if (segments[0].expandable) {\n if (state.segments.length === fromIndex) {\n addSelectMetricSegment(state);\n } else {\n await checkOtherSegments(state, currentFromIndex);\n }\n }\n } catch (err) {\n if (err instanceof Error) {\n handleMetricsAutoCompleteError(state, err);\n }\n }\n}\n\nexport function spliceSegments(state: GraphiteQueryEditorState, index: number): void {\n state.segments = state.segments.splice(0, index);\n state.queryModel.segments = state.queryModel.segments.splice(0, index);\n}\n\nexport function emptySegments(state: GraphiteQueryEditorState): void {\n state.queryModel.segments = [];\n state.segments = [];\n}\n\n/**\n * When seriesByTag function is added the UI changes it's state and only tags can be added from now.\n */\nexport async function addSeriesByTagFunc(state: GraphiteQueryEditorState, tag: string): Promise<void> {\n const newFunc = state.datasource.createFuncInstance('seriesByTag', {\n withDefaultParams: false,\n });\n const tagParam = `${tag}=`;\n newFunc.params = [tagParam];\n state.queryModel.addFunction(newFunc);\n newFunc.added = true;\n\n emptySegments(state);\n handleTargetChanged(state);\n await parseTarget(state);\n}\n\nexport function smartlyHandleNewAliasByNode(state: GraphiteQueryEditorState, func: FuncInstance): void {\n if (func.def.name !== 'aliasByNode') {\n return;\n }\n\n for (let i = 0; i < state.segments.length; i++) {\n if (state.segments[i].value.indexOf('*') >= 0) {\n func.params[0] = i;\n func.added = false;\n handleTargetChanged(state);\n return;\n }\n }\n}\n\n/**\n * Pauses running the query to allow selecting tag value. This is to prevent getting errors if the query is run\n * for a tag with no selected value.\n */\nexport function pause(state: GraphiteQueryEditorState): void {\n state.paused = true;\n}\n\nexport function removeTagPrefix(value: string): string {\n return value.replace(TAG_PREFIX, '');\n}\n\nexport function handleTargetChanged(state: GraphiteQueryEditorState): void {\n if (state.queryModel.error) {\n return;\n }\n\n const oldResolvedTarget = state.queryModel.target.targetFull ?? state.queryModel.target.target;\n const oldTargetRemovedSpaces = oldResolvedTarget.replace(/\\s+/g, '');\n // Interpolate from other queries:\n // Because of mixed data sources the list may contain queries for non-Graphite data sources. To ensure a valid query\n // is used for interpolation we should check required properties are passed though in theory it allows to interpolate\n // with queries that contain \"target\" property as well.\n state.queryModel.updateModelTarget(\n (state.queries || []).filter((query) => 'target' in query && typeof query.target === 'string')\n );\n\n const newResolvedTarget = state.queryModel.target.targetFull ?? state.queryModel.target.target;\n const newTargetRemovedSpaces = newResolvedTarget.replace(/\\s+/g, '');\n\n if (newTargetRemovedSpaces !== oldTargetRemovedSpaces && !state.paused) {\n state.refresh();\n }\n}\n\n/**\n * When metrics autocomplete fails - the error is shown, but only once per page view\n */\nexport function handleMetricsAutoCompleteError(\n state: GraphiteQueryEditorState,\n error: Error\n): GraphiteQueryEditorState {\n if (!state.metricAutoCompleteErrorShown) {\n state.metricAutoCompleteErrorShown = true;\n getAppEvents().publish({\n type: AppEvents.alertError.name,\n payload: [`Fetching metrics failed: ${error.message}.`],\n });\n }\n return state;\n}\n\n/**\n * When tags autocomplete fails - the error is shown, but only once per page view\n */\nexport function handleTagsAutoCompleteError(state: GraphiteQueryEditorState, error: Error): GraphiteQueryEditorState {\n if (!state.tagsAutoCompleteErrorShown) {\n state.tagsAutoCompleteErrorShown = true;\n getAppEvents().publish({\n type: AppEvents.alertError.name,\n payload: [`Fetching tags failed: ${error.message}.`],\n });\n }\n return state;\n}\n","import { AnyAction } from '@reduxjs/toolkit';\nimport { Action, Dispatch } from 'redux';\n\nimport { DataQuery, TimeRange } from '@grafana/data';\nimport { TemplateSrv } from '@grafana/runtime';\n\nimport { GraphiteDatasource } from '../datasource';\nimport { FuncDefs } from '../gfunc';\nimport GraphiteQuery, { GraphiteTarget } from '../graphite_query';\nimport { GraphiteSegment } from '../types';\n\nimport { actions } from './actions';\nimport {\n addSeriesByTagFunc,\n buildSegments,\n checkOtherSegments,\n emptySegments,\n handleTargetChanged,\n parseTarget,\n pause,\n removeTagPrefix,\n smartlyHandleNewAliasByNode,\n spliceSegments,\n} from './helpers';\n\nexport type GraphiteQueryEditorState = {\n // external dependencies\n datasource: GraphiteDatasource;\n target: GraphiteTarget;\n refresh: () => void;\n queries?: DataQuery[];\n templateSrv: TemplateSrv;\n range?: TimeRange;\n\n // internal\n supportsTags: boolean;\n paused: boolean;\n removeTagValue: string;\n funcDefs: FuncDefs | null;\n segments: GraphiteSegment[];\n queryModel: GraphiteQuery;\n error: Error | null;\n tagsAutoCompleteErrorShown: boolean;\n metricAutoCompleteErrorShown: boolean;\n};\n\nconst reducer = async (action: Action, state: GraphiteQueryEditorState): Promise<GraphiteQueryEditorState> => {\n state = { ...state };\n\n if (actions.init.match(action)) {\n const deps = action.payload;\n deps.target.target = deps.target.target || '';\n\n await deps.datasource.waitForFuncDefsLoaded();\n\n state = {\n ...state,\n ...deps,\n queryModel: new GraphiteQuery(deps.datasource, deps.target, state.templateSrv),\n supportsTags: deps.datasource.supportsTags,\n paused: false,\n removeTagValue: '-- remove tag --',\n funcDefs: deps.datasource.funcDefs,\n queries: deps.queries,\n };\n\n await buildSegments(state, false);\n }\n if (actions.timeRangeChanged.match(action)) {\n state.range = action.payload;\n }\n if (actions.queriesChanged.match(action)) {\n state.queries = action.payload;\n handleTargetChanged(state);\n }\n if (actions.queryChanged.match(action)) {\n state.target.target = action.payload.target || '';\n await parseTarget(state);\n handleTargetChanged(state);\n }\n if (actions.segmentValueChanged.match(action)) {\n const { segment: segmentOrString, index: segmentIndex } = action.payload;\n\n let segment;\n // is segment was changed to a string - create a new segment\n if (typeof segmentOrString === 'string') {\n segment = {\n value: segmentOrString,\n expandable: true,\n fake: false,\n };\n } else {\n segment = segmentOrString;\n }\n\n state.error = null;\n state.segments[segmentIndex] = segment;\n state.queryModel.updateSegmentValue(segment, segmentIndex);\n\n if (state.queryModel.functions.length > 0 && state.queryModel.functions[0].def.fake) {\n state.queryModel.functions = [];\n }\n\n if (segment.type === 'tag') {\n const tag = removeTagPrefix(segment.value);\n pause(state);\n await addSeriesByTagFunc(state, tag);\n return state;\n }\n\n // if newly selected segment can be expanded -> check if the path is correct\n if (segment.expandable) {\n await checkOtherSegments(state, segmentIndex + 1);\n } else {\n // if not expandable -> remove all other segments\n spliceSegments(state, segmentIndex + 1);\n }\n\n handleTargetChanged(state);\n }\n if (actions.tagChanged.match(action)) {\n const { tag, index: tagIndex } = action.payload;\n state.queryModel.updateTag(tag, tagIndex);\n handleTargetChanged(state);\n if (state.queryModel.tags.length === 0) {\n await checkOtherSegments(state, 0);\n state.paused = false;\n }\n }\n if (actions.addNewTag.match(action)) {\n const segment = action.payload.segment;\n const newTagKey = segment.value;\n const newTag = { key: newTagKey, operator: '=' as const, value: '' };\n state.queryModel.addTag(newTag);\n handleTargetChanged(state);\n }\n if (actions.unpause.match(action)) {\n state.paused = false;\n state.refresh();\n }\n if (actions.addFunction.match(action)) {\n const newFunc = state.datasource.createFuncInstance(action.payload.name, {\n withDefaultParams: true,\n });\n newFunc.added = true;\n state.queryModel.addFunction(newFunc);\n smartlyHandleNewAliasByNode(state, newFunc);\n\n if (state.segments.length === 1 && state.segments[0].fake) {\n emptySegments(state);\n }\n\n if (!newFunc.params.length && newFunc.added) {\n handleTargetChanged(state);\n }\n\n if (newFunc.def.name === 'seriesByTag') {\n await parseTarget(state);\n }\n }\n if (actions.removeFunction.match(action)) {\n state.queryModel.removeFunction(action.payload.func);\n handleTargetChanged(state);\n }\n if (actions.moveFunction.match(action)) {\n const { func, offset } = action.payload;\n state.queryModel.moveFunction(func, offset);\n handleTargetChanged(state);\n }\n if (actions.updateFunctionParam.match(action)) {\n const { func, index, value } = action.payload;\n func.updateParam(value, index);\n handleTargetChanged(state);\n }\n if (actions.updateQuery.match(action)) {\n state.target.target = action.payload.query;\n handleTargetChanged(state);\n }\n if (actions.runQuery.match(action)) {\n state.refresh();\n }\n if (actions.toggleEditorMode.match(action)) {\n state.target.textEditor = !state.target.textEditor;\n await parseTarget(state);\n }\n\n return { ...state };\n};\n\nexport const createStore = (onChange: (state: GraphiteQueryEditorState) => void): Dispatch<AnyAction> => {\n let state = {} as GraphiteQueryEditorState;\n\n const dispatch = async (action: AnyAction) => {\n state = await reducer(action, state);\n onChange(state);\n };\n\n return dispatch as Dispatch<AnyAction>;\n};\n","import { AnyAction } from '@reduxjs/toolkit';\nimport { createContext, Dispatch, PropsWithChildren, useContext, useEffect, useMemo, useState } from 'react';\nimport { usePrevious } from 'react-use';\n\nimport { QueryEditorProps } from '@grafana/data';\nimport { getTemplateSrv } from '@grafana/runtime';\n\nimport { GraphiteDatasource } from '../datasource';\nimport { GraphiteOptions, GraphiteQuery } from '../types';\n\nimport { actions } from './actions';\nimport { createStore, GraphiteQueryEditorState } from './store';\n\nconst DispatchContext = createContext<Dispatch<AnyAction>>({} as Dispatch<AnyAction>);\nconst GraphiteStateContext = createContext<GraphiteQueryEditorState>({} as GraphiteQueryEditorState);\n\nexport const useDispatch = () => {\n return useContext(DispatchContext);\n};\n\nexport const useGraphiteState = () => {\n return useContext(GraphiteStateContext);\n};\n\nexport type GraphiteQueryEditorProps = QueryEditorProps<GraphiteDatasource, GraphiteQuery, GraphiteOptions>;\n\nexport const GraphiteQueryEditorContext = ({\n datasource,\n onRunQuery,\n onChange,\n query,\n queries,\n range,\n children,\n}: PropsWithChildren<GraphiteQueryEditorProps>) => {\n const [state, setState] = useState<GraphiteQueryEditorState>();\n const [needsRefresh, setNeedsRefresh] = useState<boolean>(false);\n\n const dispatch = useMemo(() => {\n return createStore((state) => {\n setState(state);\n });\n }, []);\n\n // synchronise changes provided in props with editor's state\n const previousRange = usePrevious(range);\n useEffect(() => {\n if (JSON.stringify(previousRange?.raw) !== JSON.stringify(range?.raw)) {\n dispatch(actions.timeRangeChanged(range));\n }\n }, [dispatch, range, previousRange]);\n\n useEffect(\n () => {\n if (state) {\n dispatch(actions.queriesChanged(queries));\n }\n },\n // adding state to dependencies causes infinite loops\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [JSON.stringify(queries)]\n );\n\n useEffect(\n () => {\n if (state && state.target?.target !== query.target) {\n dispatch(actions.queryChanged(query));\n }\n },\n // adding state to dependencies causes infinite loops\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [dispatch, query]\n );\n\n useEffect(\n () => {\n if (needsRefresh && state) {\n setNeedsRefresh(false);\n onChange({ ...query, target: state.target.target, targetFull: state.target.targetFull });\n onRunQuery();\n }\n },\n // adding state to dependencies causes infinite loops\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [needsRefresh, JSON.stringify(query)]\n );\n\n if (!state) {\n dispatch(\n actions.init({\n target: { ...query },\n datasource: datasource,\n range: range,\n templateSrv: getTemplateSrv(),\n // list of queries is passed only when the editor is in Dashboards or Alerting. This is to allow interpolation\n // of sub-queries which are stored in \"targetFull\" property. This is used by alerting in the backend.\n queries: queries || [],\n refresh: () => {\n // do not run onChange/onRunQuery straight away to ensure the internal state gets updated first\n // to avoid race conditions (onChange could update props before the reducer action finishes)\n setNeedsRefresh(true);\n },\n })\n );\n return null;\n } else {\n return (\n <GraphiteStateContext.Provider value={state}>\n <DispatchContext.Provider value={dispatch}>{children}</DispatchContext.Provider>\n </GraphiteStateContext.Provider>\n );\n }\n};\n","import { useEffect, useRef } from 'react';\nexport default function usePrevious(state) {\n var ref = useRef();\n useEffect(function () {\n ref.current = state;\n });\n return ref.current;\n}\n","import { DataQueryRequest, DataSourceJsonData, TimeRange } from '@grafana/data';\nimport { TemplateSrv } from '@grafana/runtime';\nimport { DataQuery } from '@grafana/schema';\n\nimport { GraphiteDatasource } from './datasource';\n\nexport enum GraphiteQueryType {\n Default = 'Default',\n Value = 'Value',\n MetricName = 'Metric Name',\n}\n\nexport interface GraphiteQuery extends DataQuery {\n queryType?: string;\n textEditor?: boolean;\n target?: string;\n targetFull?: string;\n tags?: string[];\n fromAnnotations?: boolean;\n isMetricTank?: boolean;\n}\n\nexport interface GraphiteOptions extends DataSourceJsonData {\n graphiteVersion: string;\n graphiteType: GraphiteType;\n rollupIndicatorEnabled?: boolean;\n importConfiguration: GraphiteQueryImportConfiguration;\n}\n\nexport enum GraphiteType {\n Default = 'default',\n Metrictank = 'metrictank',\n}\n\nexport interface MetricTankRequestMeta {\n [key: string]: any;\n}\n\nexport interface MetricTankSeriesMeta {\n 'schema-name': string;\n 'schema-retentions': string; //\"1s:35d:20min:5:1542274085,1min:38d:2h:1:true,10min:120d:6h:1:true,2h:2y:6h:2\",\n 'archive-read': number;\n 'archive-interval': number;\n 'aggnum-norm': number;\n 'consolidator-normfetch': string; //\"MaximumConsolidator\",\n 'aggnum-rc': number;\n 'consolidator-rc': string; //\"MaximumConsolidator\",\n count: number;\n}\n\nexport interface MetricTankMeta {\n request: MetricTankRequestMeta;\n info: MetricTankSeriesMeta[];\n}\n\nexport interface GraphiteParserError {\n message: string;\n pos: number;\n}\n\nexport type GraphiteQueryImportConfiguration = {\n loki: GraphiteToLokiQueryImportConfiguration;\n};\n\nexport type GraphiteToLokiQueryImportConfiguration = {\n mappings: GraphiteLokiMapping[];\n};\n\nexport type GraphiteLokiMapping = {\n matchers: GraphiteMetricLokiMatcher[];\n};\n\nexport type GraphiteMetricLokiMatcher = {\n value: string;\n labelName?: string;\n};\n\nexport type GraphiteSegment = {\n value: string;\n type?: 'tag' | 'metric' | 'series-ref' | 'template';\n expandable?: boolean;\n fake?: boolean;\n};\n\nexport type GraphiteTagOperator = '=' | '!=' | '=~' | '!=~';\n\nexport type GraphiteTag = {\n key: string;\n operator: GraphiteTagOperator;\n value: string;\n};\n\nexport type GraphiteQueryEditorDependencies = {\n target: any;\n datasource: GraphiteDatasource;\n range?: TimeRange;\n templateSrv: TemplateSrv;\n queries: DataQuery[];\n // schedule onChange/onRunQuery after the reducer actions finishes\n refresh: () => void;\n};\n\nexport interface GraphiteQueryRequest extends DataQueryRequest {\n format: string;\n}\n\nexport interface GraphiteEventsRequest {\n from: number;\n until: number;\n tags: string;\n}\n\nexport interface GraphiteEvents {\n when: number;\n what: string;\n tags: string[];\n data: string;\n}\n","import { forEach, sortBy } from 'lodash';\n\nimport { SelectableValue } from '@grafana/data';\n\nimport { FuncDefs, FuncInstance, ParamDef } from '../gfunc';\nimport { GraphiteQuery, GraphiteQueryType, GraphiteSegment } from '../types';\n\nimport { EditableParam } from './FunctionParamEditor';\n\nexport function mapStringsToSelectables<T extends string>(values: T[]): Array<SelectableValue<T>> {\n return values.map((value) => ({\n value,\n label: value,\n }));\n}\n\nexport function mapSegmentsToSelectables(segments: GraphiteSegment[]): Array<SelectableValue<GraphiteSegment>> {\n return segments.map((segment) => ({\n label: segment.value,\n value: segment,\n }));\n}\n\nexport function mapFuncDefsToSelectables(funcDefs: FuncDefs): Array<SelectableValue<string>> {\n const categories: Record<string, SelectableValue<string>> = {};\n\n forEach(funcDefs, (funcDef) => {\n if (!funcDef.category) {\n return;\n }\n if (!categories[funcDef.category]) {\n categories[funcDef.category] = { label: funcDef.category, value: funcDef.category, options: [] };\n }\n categories[funcDef.category].options.push({\n label: funcDef.name,\n value: funcDef.name,\n });\n });\n\n return sortBy(categories, 'label');\n}\n\nfunction createEditableParam(paramDef: ParamDef, additional: boolean, value?: string | number): EditableParam {\n return {\n name: paramDef.name,\n value: value?.toString() || '',\n optional: !!paramDef.optional || additional, // only first param is required when multiple are allowed\n multiple: !!paramDef.multiple,\n options:\n paramDef.options?.map((option: string | number) => ({\n value: option.toString(),\n label: option.toString(),\n })) ?? [],\n };\n}\n\n/**\n * Create a list of params that can be edited in the function editor.\n */\nexport function mapFuncInstanceToParams(func: FuncInstance): EditableParam[] {\n // list of required parameters (from func.def)\n const params: EditableParam[] = func.def.params.map((paramDef: ParamDef, index: number) =>\n createEditableParam(paramDef, false, func.params[index])\n );\n\n // list of additional (multiple or optional) params entered by the user\n while (params.length < func.params.length) {\n const paramDef = func.def.params[func.def.params.length - 1];\n const value = func.params[params.length];\n params.push(createEditableParam(paramDef, true, value));\n }\n\n // extra \"fake\" param to allow adding more multiple values at the end\n if (params.length && params[params.length - 1].value && params[params.length - 1]?.multiple) {\n const paramDef = func.def.params[func.def.params.length - 1];\n params.push(createEditableParam(paramDef, true, ''));\n }\n\n return params;\n}\n\nexport function convertToGraphiteQueryObject(query: string | GraphiteQuery): GraphiteQuery {\n if (typeof query === 'string') {\n return {\n refId: 'A',\n target: query,\n queryType: GraphiteQueryType.Default.toString(),\n };\n }\n return query;\n}\n","import { css, cx } from '@emotion/css';\nimport { useEffect, useMemo, useState } from 'react';\n\nimport { GrafanaTheme2, SelectableValue } from '@grafana/data';\nimport { Button, Segment, useStyles2 } from '@grafana/ui';\n\nimport { FuncDefs } from '../gfunc';\nimport { actions } from '../state/actions';\nimport { useDispatch } from '../state/context';\n\nimport { mapFuncDefsToSelectables } from './helpers';\n\ntype Props = {\n funcDefs: FuncDefs;\n};\n\nexport function AddGraphiteFunction({ funcDefs }: Props) {\n const dispatch = useDispatch();\n const [value, setValue] = useState<SelectableValue<string> | undefined>(undefined);\n const styles = useStyles2(getStyles);\n\n const options = useMemo(() => mapFuncDefsToSelectables(funcDefs), [funcDefs]);\n\n // Note: actions.addFunction will add a component that will have a dropdown or input in auto-focus\n // (the first param of the function). This auto-focus will cause onBlur() on AddGraphiteFunction's\n // Segment component and trigger onChange once again. (why? we call onChange if the user dismissed\n // the dropdown, see: SegmentSelect.onCloseMenu for more details). To avoid it we need to wait for\n // the Segment to disappear first (hence useEffect) and then dispatch the action that will add new\n // components.\n useEffect(() => {\n if (value?.value !== undefined) {\n dispatch(actions.addFunction({ name: value.value }));\n setValue(undefined);\n }\n }, [value, dispatch]);\n\n return (\n <div>\n <Segment\n Component={\n <Button icon=\"plus\" variant=\"secondary\" className={cx(styles.button)} aria-label=\"Add new function\" />\n }\n options={options}\n onChange={setValue}\n inputMinWidth={150}\n />\n </div>\n );\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n button: css({\n marginRight: theme.spacing(0.5),\n }),\n };\n}\n","import { lazy, Suspense } from 'react';\n\nimport { Icon, Tooltip } from '@grafana/ui';\n\nimport { FuncInstance } from '../gfunc';\n\nexport interface FunctionEditorControlsProps {\n onMoveLeft: (func: FuncInstance) => void;\n onMoveRight: (func: FuncInstance) => void;\n onRemove: (func: FuncInstance) => void;\n}\n\nconst FunctionDescription = lazy(async () => {\n return {\n default(props: { description?: string }) {\n return <div>{props.description}</div>;\n },\n };\n});\n\nconst FunctionHelpButton = (props: { description?: string; name: string }) => {\n if (props.description) {\n let tooltip = (\n <Suspense fallback={<span>Loading description...</span>}>\n <FunctionDescription description={props.description} />\n </Suspense>\n );\n return (\n <Tooltip content={tooltip} placement={'bottom-end'}>\n <Icon className={props.description ? undefined : 'pointer'} name=\"question-circle\" />\n </Tooltip>\n );\n }\n\n return (\n <Icon\n className=\"pointer\"\n name=\"question-circle\"\n onClick={() => {\n window.open(\n 'http://graphite.readthedocs.org/en/latest/functions.html#graphite.render.functions.' + props.name,\n '_blank'\n );\n }}\n />\n );\n};\n\nexport const FunctionEditorControls = (\n props: FunctionEditorControlsProps & {\n func: FuncInstance;\n }\n) => {\n const { func, onMoveLeft, onMoveRight, onRemove } = props;\n return (\n <div\n style={{\n display: 'flex',\n width: '60px',\n justifyContent: 'space-between',\n }}\n >\n <Icon name=\"arrow-left\" onClick={() => onMoveLeft(func)} />\n <FunctionHelpButton name={func.def.name} description={func.def.description} />\n <Icon name=\"times\" onClick={() => onRemove(func)} />\n <Icon name=\"arrow-right\" onClick={() => onMoveRight(func)} />\n </div>\n );\n};\n","import { css } from '@emotion/css';\nimport { memo } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Icon, TextLink, Tooltip, useStyles2, type PopoverContent } from '@grafana/ui';\n\nimport { FuncInstance } from '../gfunc';\n\nimport { FunctionEditorControls, FunctionEditorControlsProps } from './FunctionEditorControls';\n\ninterface FunctionEditorProps extends FunctionEditorControlsProps {\n func: FuncInstance;\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n icon: css({\n marginRight: theme.spacing(0.5),\n }),\n label: css({\n fontWeight: theme.typography.fontWeightMedium,\n fontSize: theme.typography.bodySmall.fontSize,\n cursor: 'pointer',\n display: 'inline-block',\n overflowWrap: 'anywhere',\n height: '100%',\n }),\n };\n};\n\nconst FunctionEditor = ({ onMoveLeft, onMoveRight, func, ...props }: FunctionEditorProps) => {\n const styles = useStyles2(getStyles);\n\n const renderContent: PopoverContent = ({ updatePopperPosition }) => (\n <FunctionEditorControls\n {...props}\n func={func}\n onMoveLeft={() => {\n onMoveLeft(func);\n updatePopperPosition?.();\n }}\n onMoveRight={() => {\n onMoveRight(func);\n updatePopperPosition?.();\n }}\n />\n );\n\n return (\n <>\n {func.def.unknown && (\n <Tooltip content={<TooltipContent />} placement=\"bottom\" interactive>\n <Icon data-testid=\"warning-icon\" name=\"exclamation-triangle\" size=\"xs\" className={styles.icon} />\n </Tooltip>\n )}\n <Tooltip content={renderContent} placement=\"top\" interactive>\n <span className={styles.label}>{func.def.name}</span>\n </Tooltip>\n </>\n );\n};\n\nconst TooltipContent = memo(() => {\n return (\n <span>\n This function is not supported. Check your function for typos and{' '}\n <TextLink external href=\"https://graphite.readthedocs.io/en/latest/functions.html\">\n read the docs\n </TextLink>{' '}\n to see whether you need to upgrade your data source’s version to make this function available.\n </span>\n );\n});\nTooltipContent.displayName = 'FunctionEditorTooltipContent';\n\nexport { FunctionEditor };\n","import { css } from '@emotion/css';\n\nimport { GrafanaTheme2, SelectableValue } from '@grafana/data';\nimport { Segment, SegmentInput, useStyles2 } from '@grafana/ui';\n\nexport type EditableParam = {\n name: string;\n value: string;\n optional: boolean;\n multiple: boolean;\n options: Array<SelectableValue<string>>;\n};\n\ntype FieldEditorProps = {\n editableParam: EditableParam;\n onChange: (value: string) => void;\n onExpandedChange: (expanded: boolean) => void;\n autofocus: boolean;\n};\n\n/**\n * Render a function parameter with a segment dropdown for multiple options or simple input.\n */\nexport function FunctionParamEditor({ editableParam, onChange, onExpandedChange, autofocus }: FieldEditorProps) {\n const styles = useStyles2(getStyles);\n\n if (editableParam.options?.length > 0) {\n return (\n <Segment\n autofocus={autofocus}\n value={editableParam.value}\n inputPlaceholder={editableParam.name}\n className={styles.segment}\n options={editableParam.options}\n placeholder={' +' + editableParam.name}\n onChange={(value) => {\n onChange(value.value || '');\n }}\n onExpandedChange={onExpandedChange}\n inputMinWidth={150}\n allowCustomValue={true}\n allowEmptyValue={true}\n ></Segment>\n );\n } else {\n return (\n <SegmentInput\n autofocus={autofocus}\n className={styles.input}\n value={editableParam.value || ''}\n placeholder={' +' + editableParam.name}\n inputPlaceholder={editableParam.name}\n onChange={(value) => {\n onChange(value.toString());\n }}\n onExpandedChange={onExpandedChange}\n // input style\n style={{\n height: '25px',\n paddingTop: '2px',\n marginTop: '2px',\n paddingLeft: '4px',\n minWidth: '100px',\n }}\n ></SegmentInput>\n );\n }\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n segment: css({\n margin: 0,\n padding: 0,\n overflowWrap: 'anywhere',\n height: '100%',\n }),\n input: css({\n margin: 0,\n padding: 0,\n input: {\n height: '25px',\n },\n overflowWrap: 'anywhere',\n height: '100%',\n }),\n});\n","import { css, cx } from '@emotion/css';\nimport { Fragment, useState } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Stack, InlineLabel, useStyles2 } from '@grafana/ui';\n\nimport { FuncInstance } from '../gfunc';\nimport { actions } from '../state/actions';\nimport { useDispatch } from '../state/context';\n\nimport { FunctionEditor } from './FunctionEditor';\nimport { EditableParam, FunctionParamEditor } from './FunctionParamEditor';\nimport { mapFuncInstanceToParams } from './helpers';\n\nexport type FunctionEditorProps = {\n func: FuncInstance;\n};\n\n/**\n * Allows editing function params and removing/moving a function (note: editing function name is not supported)\n */\nexport function GraphiteFunctionEditor({ func }: FunctionEditorProps) {\n const dispatch = useDispatch();\n const styles = useStyles2(getStyles);\n\n // keep track of mouse over and isExpanded state to display buttons for adding optional/multiple params\n // only when the user mouse over over the function editor OR any param editor is expanded.\n const [mouseOver, setIsMouseOver] = useState(false);\n const [expanded, setIsExpanded] = useState(false);\n\n let params = mapFuncInstanceToParams(func);\n params = params.filter((p: EditableParam, index: number) => {\n // func.added is set for newly added functions - see autofocus below\n return (index < func.def.params.length && !p.optional) || func.added || p.value || expanded || mouseOver;\n });\n\n return (\n <div\n className={cx(styles.container, { [styles.error]: func.def.unknown })}\n onBlur={() => setIsMouseOver(false)}\n onFocus={() => setIsMouseOver(true)}\n onMouseOver={() => setIsMouseOver(true)}\n onMouseOut={() => setIsMouseOver(false)}\n // We set this to ensure if any long text wraps the container expands with it\n style={{ height: '100%' }}\n >\n <Stack gap={0} alignItems={'baseline'}>\n <FunctionEditor\n func={func}\n onMoveLeft={() => {\n dispatch(actions.moveFunction({ func, offset: -1 }));\n }}\n onMoveRight={() => {\n dispatch(actions.moveFunction({ func, offset: 1 }));\n }}\n onRemove={() => {\n dispatch(actions.removeFunction({ func }));\n }}\n />\n <InlineLabel className={styles.label} width={'auto'}>\n (\n </InlineLabel>\n {params.map((editableParam: EditableParam, index: number) => {\n return (\n <Fragment key={index}>\n <FunctionParamEditor\n autofocus={index === 0 && func.added}\n editableParam={editableParam}\n onChange={(value) => {\n if (value !== '' || editableParam.optional) {\n dispatch(actions.updateFunctionParam({ func, index, value }));\n }\n setIsExpanded(false);\n setIsMouseOver(false);\n }}\n onExpandedChange={setIsExpanded}\n />\n {index !== params.length - 1 ? ',' : ''}\n </Fragment>\n );\n })}\n <InlineLabel className={styles.label} width={'auto'}>\n )\n </InlineLabel>\n </Stack>\n </div>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n container: css({\n backgroundColor: theme.colors.background.secondary,\n borderRadius: theme.shape.radius.default,\n marginRight: theme.spacing(0.5),\n padding: `0 ${theme.spacing(1)}`,\n height: `${theme.v1.spacing.formInputHeight}px`,\n }),\n error: css({\n border: `1px solid ${theme.colors.error.main}`,\n }),\n label: css({\n padding: 0,\n margin: 0,\n }),\n button: css({\n padding: theme.spacing(0.5),\n }),\n});\n","import { SegmentSection } from '@grafana/ui';\n\nimport { FuncDefs, FuncInstance } from '../gfunc';\n\nimport { AddGraphiteFunction } from './AddGraphiteFunction';\nimport { GraphiteFunctionEditor } from './GraphiteFunctionEditor';\n\ntype Props = {\n functions: FuncInstance[];\n funcDefs: FuncDefs;\n};\n\nexport function FunctionsSection({ functions = [], funcDefs }: Props) {\n return (\n <SegmentSection label=\"Functions\" fill={true}>\n {functions.map((func: FuncInstance, index: number) => {\n return !func.hidden && <GraphiteFunctionEditor key={index} func={func} />;\n })}\n <AddGraphiteFunction funcDefs={funcDefs} />\n </SegmentSection>\n );\n}\n","import { useCallback } from 'react';\n\nimport { QueryField } from '@grafana/ui';\n\nimport { actions } from '../state/actions';\nimport { useDispatch } from '../state/context';\n\ntype Props = {\n rawQuery: string;\n};\n\nexport function GraphiteTextEditor({ rawQuery }: Props) {\n const dispatch = useDispatch();\n\n const updateQuery = useCallback(\n (query: string) => {\n dispatch(actions.updateQuery({ query }));\n },\n [dispatch]\n );\n\n const runQuery = useCallback(() => {\n dispatch(actions.runQuery());\n }, [dispatch]);\n\n return (\n <QueryField\n query={rawQuery}\n onChange={updateQuery}\n onBlur={runQuery}\n onRunQuery={runQuery}\n placeholder={'Enter a Graphite query (run with Shift+Enter)'}\n portalOrigin=\"graphite\"\n />\n );\n}\n","import { eachRight, map, remove } from 'lodash';\n\nimport { SelectableValue } from '@grafana/data';\n\nimport { mapSegmentsToSelectables, mapStringsToSelectables } from '../components/helpers';\nimport { GraphiteSegment, GraphiteTag, GraphiteTagOperator } from '../types';\n\nimport {\n TAG_PREFIX,\n GRAPHITE_TAG_OPERATORS,\n handleMetricsAutoCompleteError,\n handleTagsAutoCompleteError,\n} from './helpers';\nimport { GraphiteQueryEditorState } from './store';\n\n/**\n * All auto-complete lists are updated while typing. To avoid performance issues we do not render more\n * than MAX_SUGGESTIONS limits in a single dropdown.\n *\n * MAX_SUGGESTIONS is per metrics and tags separately. On the very first dropdown where metrics and tags are\n * combined together meaning it may end up with max of 2 * MAX_SUGGESTIONS items in total.\n */\nconst MAX_SUGGESTIONS = 5000;\n\n/**\n * Providers are hooks for views to provide temporal data for autocomplete. They don't modify the state.\n */\n\n/**\n * Return list of available options for a segment with given index\n *\n * It may be:\n * - mixed list of metrics and tags (only when nothing was selected)\n * - list of metric names (if a metric name was selected for this segment)\n */\nasync function getAltSegments(\n state: GraphiteQueryEditorState,\n index: number,\n prefix: string\n): Promise<GraphiteSegment[]> {\n let query = prefix.length > 0 ? '*' + prefix + '*' : '*';\n if (index > 0) {\n query = state.queryModel.getSegmentPathUpTo(index) + '.' + query;\n }\n const options = {\n range: state.range,\n requestId: 'get-alt-segments',\n };\n\n try {\n const segments = await state.datasource.metricFindQuery(query, options);\n const altSegments: GraphiteSegment[] = map(segments, (segment) => {\n return {\n value: segment.text,\n expandable: segment.expandable,\n };\n });\n\n if (index > 0 && altSegments.length === 0) {\n return altSegments;\n }\n\n // add query references\n if (index === 0) {\n eachRight(state.queries, (target) => {\n if (target.refId === state.queryModel.target.refId) {\n return;\n }\n\n altSegments.unshift({\n type: 'series-ref',\n value: '#' + target.refId,\n expandable: false,\n });\n });\n }\n\n // add template variables\n eachRight(state.templateSrv.getVariables(), (variable) => {\n altSegments.unshift({\n type: 'template',\n value: '$' + variable.name,\n expandable: true,\n });\n });\n\n // add wildcard option and limit number of suggestions (API doesn't support limiting\n // hence we are doing it here)\n altSegments.unshift({ value: '*', expandable: true });\n altSegments.splice(MAX_SUGGESTIONS);\n\n if (state.supportsTags && index === 0) {\n removeTaggedEntry(altSegments);\n return await addAltTagSegments(state, prefix, altSegments);\n } else {\n return altSegments;\n }\n } catch (err) {\n if (err instanceof Error) {\n handleMetricsAutoCompleteError(state, err);\n }\n }\n\n return [];\n}\n\n/**\n * Get the list of segments with tags and metrics. Suggestions are reduced in getAltSegments and addAltTagSegments so in case\n * we hit MAX_SUGGESTIONS limit there are always some tags and metrics shown.\n */\nexport async function getAltSegmentsSelectables(\n state: GraphiteQueryEditorState,\n index: number,\n prefix: string\n): Promise<Array<SelectableValue<GraphiteSegment>>> {\n return mapSegmentsToSelectables(await getAltSegments(state, index, prefix));\n}\n\nexport function getTagOperatorsSelectables(): Array<SelectableValue<GraphiteTagOperator>> {\n return mapStringsToSelectables(GRAPHITE_TAG_OPERATORS);\n}\n\n/**\n * Returns tags as dropdown options\n */\nasync function getTags(state: GraphiteQueryEditorState, index: number, tagPrefix: string): Promise<string[]> {\n try {\n const tagExpressions = state.queryModel.renderTagExpressions(index);\n const values = await state.datasource.getTagsAutoComplete(tagExpressions, tagPrefix, {\n range: state.range,\n limit: MAX_SUGGESTIONS,\n });\n\n const altTags = map(values, 'text');\n altTags.splice(0, 0, state.removeTagValue);\n return altTags;\n } catch (err) {\n if (err instanceof Error) {\n handleTagsAutoCompleteError(state, err);\n }\n }\n\n return [];\n}\n\nexport async function getTagsSelectables(\n state: GraphiteQueryEditorState,\n index: number,\n tagPrefix: string\n): Promise<Array<SelectableValue<string>>> {\n return mapStringsToSelectables(await getTags(state, index, tagPrefix));\n}\n\n/**\n * List of tags when a tag is added. getTags is used for editing.\n * When adding - segment is used. When editing - dropdown is used.\n */\nasync function getTagsAsSegments(state: GraphiteQueryEditorState, tagPrefix: string): Promise<GraphiteSegment[]> {\n let tagsAsSegments: GraphiteSegment[];\n try {\n const tagExpressions = state.queryModel.renderTagExpressions();\n const values = await state.datasource.getTagsAutoComplete(tagExpressions, tagPrefix, {\n range: state.range,\n limit: MAX_SUGGESTIONS,\n });\n tagsAsSegments = map(values, (val) => {\n return {\n value: val.text,\n type: 'tag',\n expandable: false,\n } as const;\n });\n } catch (err) {\n tagsAsSegments = [];\n if (err instanceof Error) {\n handleTagsAutoCompleteError(state, err);\n }\n }\n\n return tagsAsSegments;\n}\n\n/**\n * Get list of tags, used when adding additional tags (first tag is selected from a joined list of metrics and tags)\n */\nexport async function getTagsAsSegmentsSelectables(\n state: GraphiteQueryEditorState,\n tagPrefix: string\n): Promise<Array<SelectableValue<GraphiteSegment>>> {\n return mapSegmentsToSelectables(await getTagsAsSegments(state, tagPrefix));\n}\n\nasync function getTagValues(\n state: GraphiteQueryEditorState,\n tag: GraphiteTag,\n index: number,\n valuePrefix: string\n): Promise<string[]> {\n const tagExpressions = state.queryModel.renderTagExpressions(index);\n const tagKey = tag.key;\n const values = await state.datasource.getTagValuesAutoComplete(tagExpressions, tagKey, valuePrefix, {\n range: state.range,\n limit: MAX_SUGGESTIONS,\n });\n const altValues = map(values, 'text');\n // Add template variables as additional values\n eachRight(state.templateSrv.getVariables(), (variable) => {\n altValues.push('${' + variable.name + ':regex}');\n });\n\n return altValues;\n}\n\nexport async function getTagValuesSelectables(\n state: GraphiteQueryEditorState,\n tag: GraphiteTag,\n index: number,\n valuePrefix: string\n): Promise<Array<SelectableValue<string>>> {\n return mapStringsToSelectables(await getTagValues(state, tag, index, valuePrefix));\n}\n\n/**\n * Add segments with tags prefixed with \"tag: \" to include them in the same list as metrics\n */\nasync function addAltTagSegments(\n state: GraphiteQueryEditorState,\n prefix: string,\n altSegments: GraphiteSegment[]\n): Promise<GraphiteSegment[]> {\n let tagSegments = await getTagsAsSegments(state, prefix);\n\n tagSegments = map(tagSegments, (segment) => {\n segment.value = TAG_PREFIX + segment.value;\n return segment;\n });\n\n return altSegments.concat(...tagSegments);\n}\n\nfunction removeTaggedEntry(altSegments: GraphiteSegment[]) {\n remove(altSegments, (s) => s.value === '_tagged');\n}\n","import { debounce } from 'lodash';\nimport { useCallback, useMemo } from 'react';\n\nimport { SelectableValue } from '@grafana/data';\nimport { SegmentAsync } from '@grafana/ui';\n\nimport { actions } from '../state/actions';\nimport { useDispatch } from '../state/context';\nimport { getAltSegmentsSelectables } from '../state/providers';\nimport { GraphiteQueryEditorState } from '../state/store';\nimport { GraphiteSegment } from '../types';\n\ntype Props = {\n segment: GraphiteSegment;\n metricIndex: number;\n state: GraphiteQueryEditorState;\n};\n\n/**\n * Represents a single metric node in the metric path at the given index. Allows to change the metric name to one of the\n * provided options or a custom value.\n *\n * Options for tag names and metric names are reloaded while user is typing with backend taking care of auto-complete\n * (auto-complete cannot be implemented in front-end because backend returns only limited number of entries)\n *\n * getAltSegmentsSelectables() also returns list of tags for segment with index=0. Once a tag is selected the editor\n * enters tag-adding mode (see SeriesSection and GraphiteQueryModel.seriesByTagUsed).\n */\nexport function MetricSegment({ metricIndex, segment, state }: Props) {\n const dispatch = useDispatch();\n const loadOptions = useCallback(\n (value: string | undefined) => {\n return getAltSegmentsSelectables(state, metricIndex, value || '');\n },\n [state, metricIndex]\n );\n const debouncedLoadOptions = useMemo(() => debounce(loadOptions, 200, { leading: true }), [loadOptions]);\n\n const onSegmentChanged = useCallback(\n (selectableValue: SelectableValue<GraphiteSegment | string>) => {\n // selectableValue.value is always defined because emptyValues are not allowed in SegmentAsync by default\n dispatch(actions.segmentValueChanged({ segment: selectableValue.value!, index: metricIndex }));\n },\n [dispatch, metricIndex]\n );\n\n // segmentValueChanged action will destroy SegmentAsync immediately if a tag is selected. To give time\n // for the clean up the action is debounced.\n const onSegmentChangedDebounced = useMemo(() => debounce(onSegmentChanged, 100), [onSegmentChanged]);\n\n return (\n <SegmentAsync<GraphiteSegment | string>\n value={segment.value}\n inputMinWidth={150}\n allowCustomValue={true}\n loadOptions={debouncedLoadOptions}\n reloadOptionsOnChange={true}\n onChange={onSegmentChangedDebounced}\n />\n );\n}\n","import { GraphiteQueryEditorState } from '../state/store';\nimport { GraphiteSegment } from '../types';\n\nimport { MetricSegment } from './MetricSegment';\n\ntype Props = {\n segments: GraphiteSegment[];\n state: GraphiteQueryEditorState;\n};\n\nexport function MetricsSection({ segments = [], state }: Props) {\n return (\n <div>\n {segments.map((segment, index) => {\n return <MetricSegment segment={segment} metricIndex={index} key={index} state={state} />;\n })}\n </div>\n );\n}\n","import { useCallback } from 'react';\n\nimport { Button } from '@grafana/ui';\n\nimport { actions } from '../state/actions';\nimport { useDispatch } from '../state/context';\n\nexport function PlayButton() {\n const dispatch = useDispatch();\n const onClick = useCallback(() => {\n dispatch(actions.unpause());\n }, [dispatch]);\n return <Button icon=\"play\" onClick={onClick} type=\"button\" variant=\"secondary\" aria-label=\"Unpause query\" />;\n}\n","import { debounce } from 'lodash';\nimport { useCallback, useMemo } from 'react';\n\nimport { Segment, SegmentAsync } from '@grafana/ui';\n\nimport { actions } from '../state/actions';\nimport { useDispatch } from '../state/context';\nimport { getTagOperatorsSelectables, getTagsSelectables, getTagValuesSelectables } from '../state/providers';\nimport { GraphiteQueryEditorState } from '../state/store';\nimport { GraphiteTag, GraphiteTagOperator } from '../types';\n\ntype Props = {\n tag: GraphiteTag;\n tagIndex: number;\n state: GraphiteQueryEditorState;\n};\n\n/**\n * Editor for a tag at given index. Allows changing the name of the tag, operator or value. Tag names are provided with\n * getTagsSelectables and contain only valid tags (it may depend on currently used tags). The dropdown for tag names is\n * also used for removing tag (with a special \"--remove tag--\" option provided by getTagsSelectables).\n *\n * Options for tag names and values are reloaded while user is typing with backend taking care of auto-complete\n * (auto-complete cannot be implemented in front-end because backend returns only limited number of entries)\n */\nexport function TagEditor({ tag, tagIndex, state }: Props) {\n const dispatch = useDispatch();\n const getTagsOptions = useCallback(\n (inputValue: string | undefined) => {\n return getTagsSelectables(state, tagIndex, inputValue || '');\n },\n [state, tagIndex]\n );\n const debouncedGetTagsOptions = useMemo(() => debounce(getTagsOptions, 200, { leading: true }), [getTagsOptions]);\n\n const getTagValueOptions = useCallback(\n (inputValue: string | undefined) => {\n return getTagValuesSelectables(state, tag, tagIndex, inputValue || '');\n },\n [state, tagIndex, tag]\n );\n const debouncedGetTagValueOptions = useMemo(\n () => debounce(getTagValueOptions, 200, { leading: true }),\n [getTagValueOptions]\n );\n\n return (\n <>\n <SegmentAsync\n inputMinWidth={150}\n value={tag.key}\n loadOptions={debouncedGetTagsOptions}\n reloadOptionsOnChange={true}\n onChange={(value) => {\n dispatch(\n actions.tagChanged({\n tag: { ...tag, key: value.value! },\n index: tagIndex,\n })\n );\n }}\n allowCustomValue={true}\n />\n <Segment<GraphiteTagOperator>\n inputMinWidth={50}\n value={tag.operator}\n options={getTagOperatorsSelectables()}\n onChange={(value) => {\n dispatch(\n actions.tagChanged({\n tag: { ...tag, operator: value.value! },\n index: tagIndex,\n })\n );\n }}\n />\n <SegmentAsync\n inputMinWidth={150}\n value={tag.value}\n loadOptions={debouncedGetTagValueOptions}\n reloadOptionsOnChange={true}\n onChange={(value) => {\n dispatch(\n actions.tagChanged({\n tag: { ...tag, value: value.value! },\n index: tagIndex,\n })\n );\n }}\n allowCustomValue={true}\n />\n </>\n );\n}\n","import { css } from '@emotion/css';\nimport { debounce } from 'lodash';\nimport { useCallback, useMemo } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Button, SegmentAsync, useStyles2 } from '@grafana/ui';\n\nimport { GraphiteTag } from '../graphite_query';\nimport { actions } from '../state/actions';\nimport { useDispatch } from '../state/context';\nimport { getTagsAsSegmentsSelectables } from '../state/providers';\nimport { GraphiteQueryEditorState } from '../state/store';\nimport { GraphiteSegment } from '../types';\n\nimport { PlayButton } from './PlayButton';\nimport { TagEditor } from './TagEditor';\n\ntype Props = {\n tags: GraphiteTag[];\n state: GraphiteQueryEditorState;\n};\n\n/**\n * Renders all tags and a button allowing to add more tags.\n *\n * Options for tag names are reloaded while user is typing with backend taking care of auto-complete\n * (auto-complete cannot be implemented in front-end because backend returns only limited number of entries)\n */\nexport function TagsSection({ tags, state }: Props) {\n const dispatch = useDispatch();\n const styles = useStyles2(getStyles);\n\n // Options are reloaded while user is typing with backend taking care of auto-complete (auto-complete cannot be\n // implemented in front-end because backend returns only limited number of entries)\n const getTagsAsSegmentsOptions = useCallback(\n (inputValue?: string) => {\n return getTagsAsSegmentsSelectables(state, inputValue || '');\n },\n [state]\n );\n const debouncedGetTagsAsSegments = useMemo(\n () => debounce(getTagsAsSegmentsOptions, 200, { leading: true }),\n [getTagsAsSegmentsOptions]\n );\n\n return (\n <div>\n {tags.map((tag, index) => {\n return <TagEditor key={index} tagIndex={index} tag={tag} state={state} />;\n })}\n {tags.length && (\n <SegmentAsync<GraphiteSegment>\n inputMinWidth={150}\n onChange={(value) => {\n dispatch(actions.addNewTag({ segment: value.value! }));\n }}\n loadOptions={debouncedGetTagsAsSegments}\n reloadOptionsOnChange={true}\n Component={<Button icon=\"plus\" variant=\"secondary\" className={styles.button} aria-label=\"Add new tag\" />}\n />\n )}\n {state.paused && <PlayButton />}\n </div>\n );\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n button: css({\n marginRight: theme.spacing(0.5),\n }),\n };\n}\n","import { SegmentSection } from '@grafana/ui';\n\nimport { GraphiteQueryEditorState } from '../state/store';\n\nimport { MetricsSection } from './MetricsSection';\nimport { TagsSection } from './TagsSection';\n\ntype Props = {\n state: GraphiteQueryEditorState;\n};\n\nexport function SeriesSection({ state }: Props) {\n const sectionContent = state.queryModel?.seriesByTagUsed ? (\n <TagsSection tags={state.queryModel?.tags} state={state} />\n ) : (\n <MetricsSection segments={state.segments} state={state} />\n );\n\n return (\n <SegmentSection label=\"Series\" fill={true}>\n {sectionContent}\n </SegmentSection>\n );\n}\n","import { css } from '@emotion/css';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Button, useStyles2 } from '@grafana/ui';\n\nimport { actions } from '../state/actions';\nimport { GraphiteQueryEditorContext, GraphiteQueryEditorProps, useDispatch, useGraphiteState } from '../state/context';\n\nimport { FunctionsSection } from './FunctionsSection';\nimport { GraphiteTextEditor } from './GraphiteTextEditor';\nimport { SeriesSection } from './SeriesSection';\n\nexport function GraphiteQueryEditor({\n datasource,\n onRunQuery,\n onChange,\n query,\n range,\n queries,\n}: GraphiteQueryEditorProps) {\n return (\n <GraphiteQueryEditorContext\n datasource={datasource}\n onRunQuery={onRunQuery}\n onChange={onChange}\n query={query}\n queries={queries}\n range={range}\n >\n <GraphiteQueryEditorContent />\n </GraphiteQueryEditorContext>\n );\n}\n\nfunction GraphiteQueryEditorContent() {\n const dispatch = useDispatch();\n const state = useGraphiteState();\n const styles = useStyles2(getStyles);\n\n return (\n <div className={styles.container}>\n <div className={styles.visualEditor}>\n {state.target?.textEditor && <GraphiteTextEditor rawQuery={state.target.target} />}\n {!state.target?.textEditor && (\n <>\n <SeriesSection state={state} />\n <FunctionsSection functions={state.queryModel?.functions} funcDefs={state.funcDefs!} />\n </>\n )}\n </div>\n <Button\n className={styles.toggleButton}\n icon=\"pen\"\n variant=\"secondary\"\n aria-label=\"Toggle editor mode\"\n tooltip={state?.queryModel?.error}\n onClick={() => {\n dispatch(actions.toggleEditorMode());\n }}\n />\n </div>\n );\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n container: css({\n display: 'flex',\n }),\n visualEditor: css({\n flexGrow: 1,\n }),\n toggleButton: css({\n marginLeft: theme.spacing(0.5),\n }),\n };\n}\n","import { useState } from 'react';\n\nimport { InlineField, Input, Select } from '@grafana/ui';\n\nimport { GraphiteQuery, GraphiteQueryType } from '../types';\n\nimport { convertToGraphiteQueryObject } from './helpers';\n\ninterface Props {\n query: GraphiteQuery | string;\n onChange: (query: GraphiteQuery, definition: string) => void;\n}\n\nconst GRAPHITE_QUERY_VARIABLE_TYPE_OPTIONS = [\n { label: 'Default Query', value: GraphiteQueryType.Default },\n { label: 'Value Query', value: GraphiteQueryType.Value },\n { label: 'Metric Name Query', value: GraphiteQueryType.MetricName },\n];\n\nexport const GraphiteVariableEditor = (props: Props) => {\n const { query, onChange } = props;\n const [value, setValue] = useState(convertToGraphiteQueryObject(query));\n\n return (\n <>\n <InlineField label=\"Select query type\" labelWidth={20}>\n <Select\n aria-label=\"select query type\"\n options={GRAPHITE_QUERY_VARIABLE_TYPE_OPTIONS}\n width={25}\n value={value.queryType ?? GraphiteQueryType.Default}\n onChange={(selectableValue) => {\n setValue({\n ...value,\n queryType: selectableValue.value,\n });\n\n if (value.target) {\n onChange(\n {\n ...value,\n queryType: selectableValue.value,\n },\n value.target ?? ''\n );\n }\n }}\n />\n </InlineField>\n <InlineField label=\"Query\" labelWidth={20} grow>\n <Input\n aria-label=\"Variable editor query input\"\n value={value.target}\n onBlur={() => onChange(value, value.target ?? '')}\n onChange={(e) => {\n setValue({\n ...value,\n target: e.currentTarget.value,\n });\n }}\n />\n </InlineField>\n </>\n );\n};\n","import { QueryResultMetaNotice } from '@grafana/data';\n\nimport { MetricTankSeriesMeta } from './types';\n\n// https://github.com/grafana/metrictank/blob/master/scripts/config/storage-schemas.conf#L15-L46\n\nexport interface RetentionInfo {\n interval: string;\n retention?: string;\n chunkspan?: string;\n numchunks?: number;\n ready?: boolean | number; // whether, or as of what data timestamp, the archive is ready for querying.\n}\n\nfunction toInteger(val?: string): number | undefined {\n if (val) {\n return parseInt(val, 10);\n }\n return undefined;\n}\n\nfunction toBooleanOrTimestamp(val?: string): number | boolean | undefined {\n if (val) {\n if (val === 'true') {\n return true;\n }\n if (val === 'false') {\n return false;\n }\n return parseInt(val, 10);\n }\n return undefined;\n}\n\nexport function getRollupNotice(metaList: MetricTankSeriesMeta[]): QueryResultMetaNotice | null {\n for (const meta of metaList) {\n const archiveIndex = meta['archive-read'];\n\n if (archiveIndex > 0) {\n const schema = parseSchemaRetentions(meta['schema-retentions']);\n const intervalString = schema[archiveIndex].interval;\n const func = (meta['consolidator-normfetch'] ?? '').replace('Consolidator', '');\n\n return {\n text: `Data is rolled up, aggregated over ${intervalString} using ${func} function`,\n severity: 'info',\n inspect: 'meta',\n };\n }\n }\n\n return null;\n}\n\nexport function getRuntimeConsolidationNotice(metaList: MetricTankSeriesMeta[]): QueryResultMetaNotice | null {\n for (const meta of metaList) {\n const runtimeNr = meta['aggnum-rc'];\n\n if (runtimeNr > 0) {\n const func = (meta['consolidator-rc'] ?? '').replace('Consolidator', '');\n\n return {\n text: `Data is runtime consolidated, ${runtimeNr} datapoints combined using ${func} function`,\n severity: 'info',\n inspect: 'meta',\n };\n }\n }\n\n return null;\n}\n\nexport function parseSchemaRetentions(spec: string): RetentionInfo[] {\n if (!spec) {\n return [];\n }\n return spec.split(',').map((str) => {\n const vals = str.split(':');\n return {\n interval: vals[0],\n retention: vals[1],\n chunkspan: vals[2],\n numchunks: toInteger(vals[3]),\n ready: toBooleanOrTimestamp(vals[4]),\n };\n });\n}\n","import { css, cx } from '@emotion/css';\nimport { PureComponent } from 'react';\n\nimport { MetadataInspectorProps, rangeUtil } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { stylesFactory } from '@grafana/ui';\n\nimport { GraphiteDatasource } from '../datasource';\nimport { getRollupNotice, getRuntimeConsolidationNotice, parseSchemaRetentions } from '../meta';\nimport { GraphiteOptions, GraphiteQuery, MetricTankSeriesMeta } from '../types';\n\nexport type Props = MetadataInspectorProps<GraphiteDatasource, GraphiteQuery, GraphiteOptions>;\n\nexport interface State {\n index: number;\n}\n\nexport class MetricTankMetaInspector extends PureComponent<Props, State> {\n renderMeta(meta: MetricTankSeriesMeta, key: string) {\n const styles = getStyles();\n const buckets = parseSchemaRetentions(meta['schema-retentions']);\n const rollupNotice = getRollupNotice([meta]);\n const runtimeNotice = getRuntimeConsolidationNotice([meta]);\n const normFunc = (meta['consolidator-normfetch'] ?? '').replace('Consolidator', '');\n\n const totalSeconds = buckets.reduce(\n (acc, bucket) => acc + (bucket.retention ? rangeUtil.intervalToSeconds(bucket.retention) : 0),\n 0\n );\n\n return (\n <div className={styles.metaItem} key={key}>\n <div className={styles.metaItemHeader}>\n Schema: {meta['schema-name']}\n <div className=\"small muted\">Series count: {meta.count}</div>\n </div>\n <div className={styles.metaItemBody}>\n <div className={styles.step}>\n <div className={styles.stepHeading}>Step 1: Fetch</div>\n <div className={styles.stepDescription}>\n First data is fetched, either from raw data archive or a rollup archive\n </div>\n\n {rollupNotice && <p>{rollupNotice.text}</p>}\n {!rollupNotice && <p>No rollup archive was used</p>}\n\n <div>\n {buckets.map((bucket, index) => {\n const bucketLength = bucket.retention ? rangeUtil.intervalToSeconds(bucket.retention) : 0;\n const lengthPercent = (bucketLength / totalSeconds) * 100;\n const isActive = index === meta['archive-read'];\n\n return (\n <div key={bucket.retention} className={styles.bucket}>\n <div className={styles.bucketInterval}>{bucket.interval}</div>\n <div\n className={cx(styles.bucketRetention, { [styles.bucketRetentionActive]: isActive })}\n style={{ flexGrow: lengthPercent }}\n />\n <div style={{ flexGrow: 100 - lengthPercent }}>{bucket.retention}</div>\n </div>\n );\n })}\n </div>\n </div>\n\n <div className={styles.step}>\n <div className={styles.stepHeading}>Step 2: Normalization</div>\n <div className={styles.stepDescription}>\n Normalization happens when series with different intervals between points are combined.\n </div>\n\n {meta['aggnum-norm'] > 1 && <p>Normalization did occur using {normFunc}</p>}\n {meta['aggnum-norm'] === 1 && <p>No normalization was needed</p>}\n </div>\n\n <div className={styles.step}>\n <div className={styles.stepHeading}>Step 3: Runtime consolidation</div>\n <div className={styles.stepDescription}>\n If there are too many data points at this point Metrictank will consolidate them down to below max data\n points (set in queries tab).\n </div>\n\n {runtimeNotice && <p>{runtimeNotice.text}</p>}\n {!runtimeNotice && <p>No runtime consolidation</p>}\n </div>\n </div>\n </div>\n );\n }\n\n render() {\n const { data } = this.props;\n\n // away to dedupe them\n const seriesMetas: Record<string, MetricTankSeriesMeta> = {};\n\n for (const series of data) {\n const seriesMetaList: MetricTankSeriesMeta[] | undefined = series?.meta?.custom?.seriesMetaList;\n if (seriesMetaList) {\n for (const metaItem of seriesMetaList) {\n // key is to dedupe as many series will have identitical meta\n const key = `${JSON.stringify(metaItem)}`;\n\n if (seriesMetas[key]) {\n seriesMetas[key].count += metaItem.count;\n } else {\n seriesMetas[key] = metaItem;\n }\n }\n }\n }\n\n if (Object.keys(seriesMetas).length === 0) {\n return <div>No response meta data</div>;\n }\n\n return (\n <div>\n <h2 className=\"page-heading\">Metrictank Lineage</h2>\n {Object.keys(seriesMetas).map((key) => this.renderMeta(seriesMetas[key], key))}\n </div>\n );\n }\n}\n\nconst getStyles = stylesFactory(() => {\n const { theme } = config;\n const borderColor = theme.isDark ? theme.palette.gray25 : theme.palette.gray85;\n const background = theme.isDark ? theme.palette.dark1 : theme.palette.white;\n const headerBg = theme.isDark ? theme.palette.gray15 : theme.palette.gray85;\n\n return {\n metaItem: css({\n background: background,\n border: `1px solid ${borderColor}`,\n marginBottom: theme.spacing.md,\n }),\n metaItemHeader: css({\n background: headerBg,\n padding: `${theme.spacing.xs} ${theme.spacing.md}`,\n fontSize: theme.typography.size.md,\n display: 'flex',\n justifyContent: 'space-between',\n }),\n metaItemBody: css({\n padding: theme.spacing.md,\n }),\n stepHeading: css({\n fontSize: theme.typography.size.md,\n }),\n stepDescription: css({\n fontSize: theme.typography.size.sm,\n color: theme.colors.textWeak,\n marginBottom: theme.spacing.sm,\n }),\n step: css({\n marginBottom: theme.spacing.lg,\n\n '&:last-child': {\n marginBottom: 0,\n },\n }),\n bucket: css({\n display: 'flex',\n marginBottom: theme.spacing.sm,\n borderRadius: theme.border.radius.sm,\n }),\n bucketInterval: css({\n flexGrow: 0,\n width: '60px',\n }),\n bucketRetention: css({\n background: `linear-gradient(0deg, ${theme.palette.blue85}, ${theme.palette.blue95})`,\n textAlign: 'center',\n color: theme.palette.white,\n marginRight: theme.spacing.md,\n borderRadius: theme.border.radius.sm,\n }),\n bucketRetentionActive: css({\n background: `linear-gradient(0deg, ${theme.palette.greenBase}, ${theme.palette.greenShade})`,\n }),\n };\n});\n","import { last } from 'lodash';\n\nexport const GRAPHITE_VERSIONS = ['0.9', '1.0', '1.1'];\n\nexport const DEFAULT_GRAPHITE_VERSION = last(GRAPHITE_VERSIONS)!;\n","import { Alert } from '@grafana/ui';\n\ntype Props = {\n onDismiss: () => void;\n};\n\nexport default function MappingsHelp(props: Props): JSX.Element {\n return (\n <Alert severity=\"info\" title=\"How to map Graphite metrics to labels?\" onRemove={props.onDismiss}>\n <p>Mappings are currently supported only between Graphite and Loki queries.</p>\n <p>\n When you switch your data source from Graphite to Loki, your queries are mapped according to the mappings\n defined in the example below. To define a mapping, write the full path of the metric and replace nodes you want\n to map to label with the label name in parentheses. The value of the label is extracted from your Graphite query\n when you switch data sources.\n </p>\n <p>\n All tags are automatically mapped to labels regardless of the mapping configuration. Graphite matching patterns\n (using {}) are converted to Loki's regular expressions matching patterns. When you use functions\n in your queries, the metrics, and tags are extracted to match them with defined mappings.\n </p>\n <p>\n Example: for a mapping = <code>servers.(cluster).(server).*</code>:\n </p>\n <table>\n <thead>\n <tr>\n <th>Graphite query</th>\n <th>Mapped to Loki query</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td>\n <code>\n alias(servers.<u>west</u>.<u>001</u>.cpu,1,2)\n </code>\n </td>\n <td>\n <code>\n {cluster="<u>west</u>", server="<u>001</u>"}\n </code>\n </td>\n </tr>\n <tr>\n <td>\n <code>\n alias(servers.*.<u>{001,002}</u>.*,1,2)\n </code>\n </td>\n <td>\n <code>\n {server=~"<u>(001|002)</u>"}\n </code>\n </td>\n </tr>\n <tr>\n <td>\n <code>interpolate(seriesByTag('foo=bar', 'server=002'), inf))</code>\n </td>\n <td>\n <code>{foo="bar", server="002"}</code>\n </td>\n </tr>\n </tbody>\n </table>\n </Alert>\n );\n}\n","import { ChangeEvent, useState } from 'react';\n\nimport { Box, Button, Icon, InlineField, InlineFieldRow, Input } from '@grafana/ui';\n\nimport MappingsHelp from './MappingsHelp';\n\ntype Props = {\n mappings: string[];\n onChange: (mappings: string[]) => void;\n onDismiss: () => void;\n onRestoreHelp: () => void;\n showHelp: boolean;\n};\n\nexport const MappingsConfiguration = (props: Props): JSX.Element => {\n const [mappings, setMappings] = useState(props.mappings || []);\n\n return (\n <div>\n <h3 className=\"page-heading\">Label mappings</h3>\n {!props.showHelp && (\n <p>\n <Button fill=\"text\" onClick={props.onRestoreHelp}>\n Learn how label mappings work\n </Button>\n </p>\n )}\n {props.showHelp && <MappingsHelp onDismiss={props.onDismiss} />}\n\n <Box marginBottom={5}>\n {mappings.map((mapping, i) => (\n <InlineFieldRow key={i}>\n <InlineField label={`Mapping (${i + 1})`}>\n <Input\n width={50}\n onChange={(changeEvent: ChangeEvent<HTMLInputElement>) => {\n let newMappings = mappings.concat();\n newMappings[i] = changeEvent.target.value;\n setMappings(newMappings);\n }}\n onBlur={() => {\n props.onChange(mappings);\n }}\n placeholder=\"e.g. test.metric.(labelName).*\"\n value={mapping}\n />\n </InlineField>\n <Button\n type=\"button\"\n aria-label=\"Remove header\"\n variant=\"secondary\"\n size=\"xs\"\n onClick={(_) => {\n let newMappings = mappings.concat();\n newMappings.splice(i, 1);\n setMappings(newMappings);\n props.onChange(newMappings);\n }}\n >\n <Icon name=\"trash-alt\" />\n </Button>\n </InlineFieldRow>\n ))}\n <Button\n variant=\"secondary\"\n icon=\"plus\"\n type=\"button\"\n onClick={() => {\n setMappings([...mappings, '']);\n }}\n >\n Add label mapping\n </Button>\n </Box>\n </div>\n );\n};\n","import { GraphiteLokiMapping } from '../types';\n\n/**\n * Converts a simple string used in LokiLogsMappings component (e.g. \"servers.(name).*\")\n * to data model saved in data source configuration.\n */\nexport function fromString(text: string): GraphiteLokiMapping {\n return {\n matchers: text.split('.').map((metricNode) => {\n if (metricNode.startsWith('(') && metricNode.endsWith(')')) {\n return {\n value: '*',\n labelName: metricNode.slice(1, -1),\n };\n } else {\n return { value: metricNode };\n }\n }),\n };\n}\n\n/**\n * Coverts configuration stored in data source configuration into a string displayed in LokiLogsMappings component.\n */\nexport function toString(mapping: GraphiteLokiMapping): string {\n return mapping.matchers\n .map((matcher) => {\n return matcher.labelName ? `(${matcher.labelName})` : `${matcher.value}`;\n })\n .join('.');\n}\n","import { PureComponent } from 'react';\n\nimport {\n DataSourcePluginOptionsEditorProps,\n updateDatasourcePluginJsonDataOption,\n onUpdateDatasourceJsonDataOptionSelect,\n onUpdateDatasourceJsonDataOptionChecked,\n store,\n} from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { Alert, DataSourceHttpSettings, Field, FieldSet, Select, Switch } from '@grafana/ui';\n\nimport { GraphiteOptions, GraphiteType } from '../types';\nimport { DEFAULT_GRAPHITE_VERSION, GRAPHITE_VERSIONS } from '../versions';\n\nimport { MappingsConfiguration } from './MappingsConfiguration';\nimport { fromString, toString } from './parseLokiLabelMappings';\n\nexport const SHOW_MAPPINGS_HELP_KEY = 'grafana.datasources.graphite.config.showMappingsHelp';\n\nconst graphiteVersions = GRAPHITE_VERSIONS.map((version) => ({ label: `${version}.x`, value: version }));\n\nconst graphiteTypes = Object.entries(GraphiteType).map(([label, value]) => ({\n label,\n value,\n}));\n\nexport type Props = DataSourcePluginOptionsEditorProps<GraphiteOptions>;\n\ntype State = {\n showMappingsHelp: boolean;\n};\n\nexport class ConfigEditor extends PureComponent<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = {\n showMappingsHelp: store.getObject(SHOW_MAPPINGS_HELP_KEY, true),\n };\n }\n\n componentDidMount() {\n updateDatasourcePluginJsonDataOption(this.props, 'graphiteVersion', this.currentGraphiteVersion);\n }\n\n render() {\n const { options, onOptionsChange } = this.props;\n\n const currentVersion = graphiteVersions.find((item) => item.value === this.currentGraphiteVersion);\n\n return (\n <>\n {options.access === 'direct' && (\n <Alert title=\"Deprecation Notice\" severity=\"warning\">\n This data source uses browser access mode. This mode is deprecated and will be removed in the future. Please\n use server access mode instead.\n </Alert>\n )}\n <DataSourceHttpSettings\n defaultUrl=\"http://localhost:8080\"\n dataSourceConfig={options}\n onChange={onOptionsChange}\n secureSocksDSProxyEnabled={config.secureSocksDSProxyEnabled}\n />\n <FieldSet>\n <legend className=\"page-heading\">Graphite details</legend>\n <Field\n label=\"Version\"\n description=\"This option controls what functions are available in the Graphite query editor.\"\n >\n <Select\n id=\"graphite-version\"\n aria-label=\"Graphite version\"\n value={currentVersion}\n options={graphiteVersions}\n width={16}\n onChange={onUpdateDatasourceJsonDataOptionSelect(this.props, 'graphiteVersion')}\n />\n </Field>\n\n <Field\n label=\"Graphite backend type\"\n description=\"There are different types of Graphite compatible backends. Here you can specify the type you are using. For Metrictank, this will enable specific features, like query processing meta data. Metrictank\n is a multi-tenant timeseries engine for Graphite and friends.\"\n >\n <Select\n id=\"backend-type\"\n options={graphiteTypes}\n value={graphiteTypes.find((type) => type.value === options.jsonData.graphiteType)}\n width={16}\n onChange={onUpdateDatasourceJsonDataOptionSelect(this.props, 'graphiteType')}\n />\n </Field>\n {options.jsonData.graphiteType === GraphiteType.Metrictank && (\n <Field\n label=\"Rollup indicator\"\n description=\"Shows up as an info icon in panel headers when data is aggregated.\"\n >\n <Switch\n id=\"rollup-indicator\"\n value={!!options.jsonData.rollupIndicatorEnabled}\n onChange={onUpdateDatasourceJsonDataOptionChecked(this.props, 'rollupIndicatorEnabled')}\n />\n </Field>\n )}\n </FieldSet>\n <MappingsConfiguration\n mappings={(options.jsonData.importConfiguration?.loki?.mappings || []).map(toString)}\n showHelp={this.state.showMappingsHelp}\n onDismiss={() => {\n this.setState({ showMappingsHelp: false });\n store.setObject(SHOW_MAPPINGS_HELP_KEY, false);\n }}\n onRestoreHelp={() => {\n this.setState({ showMappingsHelp: true });\n store.setObject(SHOW_MAPPINGS_HELP_KEY, true);\n }}\n onChange={(mappings) => {\n onOptionsChange({\n ...options,\n jsonData: {\n ...options.jsonData,\n importConfiguration: {\n ...options.jsonData.importConfiguration,\n loki: {\n mappings: mappings.map(fromString),\n },\n },\n },\n });\n }}\n />\n </>\n );\n }\n\n private get currentGraphiteVersion() {\n return this.props.options.jsonData.graphiteVersion || DEFAULT_GRAPHITE_VERSION;\n }\n}\n","import { css } from '@emotion/css';\nimport { useState } from 'react';\n\nimport { GrafanaTheme2, QueryEditorProps } from '@grafana/data';\nimport { Box, InlineField, Input, TagsInput, useStyles2 } from '@grafana/ui';\n\nimport { GraphiteDatasource } from '../datasource';\nimport { GraphiteQuery, GraphiteOptions } from '../types';\n\nexport const AnnotationEditor = (props: QueryEditorProps<GraphiteDatasource, GraphiteQuery, GraphiteOptions>) => {\n const { query, onChange } = props;\n const [target, setTarget] = useState<string>(query.target ?? '');\n const [tags, setTags] = useState<string[]>(query.tags ?? []);\n const updateValue = <K extends keyof GraphiteQuery, V extends GraphiteQuery[K]>(key: K, val: V) => {\n if (key === 'tags') {\n onChange({\n ...query,\n [key]: val,\n fromAnnotations: true,\n queryType: key,\n });\n } else {\n onChange({\n ...query,\n [key]: val,\n fromAnnotations: true,\n textEditor: true,\n });\n }\n };\n\n const onTagsChange = (tagsInput: string[]) => {\n setTags(tagsInput);\n updateValue('tags', tagsInput);\n };\n const styles = useStyles2(getStyles);\n\n return (\n <Box marginBottom={5}>\n <InlineField label=\"Graphite Query\" labelWidth={24} grow>\n <Input\n value={target}\n onChange={(e) => setTarget(e.currentTarget.value || '')}\n onBlur={() => updateValue('target', target)}\n placeholder=\"Example: statsd.application.counters.*.count\"\n />\n </InlineField>\n\n <h5 className={styles.heading}>Or</h5>\n\n <InlineField label=\"Graphite events tags\" labelWidth={24}>\n <TagsInput id=\"tags-input\" width={50} tags={tags} onChange={onTagsChange} placeholder=\"Example: event_tag\" />\n </InlineField>\n </Box>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n heading: css({\n fontSize: theme.typography.body.fontSize,\n marginBottom: theme.spacing(1),\n }),\n});\n","import { assign, each, filter, forEach, get, includes, isFinite, isString, last, map, toString } from 'lodash';\nimport { coerce, gte } from 'semver';\n\nimport { InterpolateFunction } from '@grafana/data';\n\nexport type ParamDef = {\n name: string;\n type: string;\n options?: Array<string | number>;\n multiple?: boolean;\n optional?: boolean;\n version?: string;\n};\n\nexport interface FuncDef {\n name: string;\n params: ParamDef[];\n defaultParams: Array<string | number>;\n category?: string;\n shortName?: string;\n fake?: boolean;\n version?: string;\n description?: string;\n /**\n * True if the function was not found on the list of available function descriptions.\n */\n unknown?: boolean;\n}\n\nexport type FuncDefs = {\n [functionName in string]: FuncDef;\n};\n\nconst index: FuncDefs = {};\n\nfunction addFuncDef(funcDef: Partial<FuncDef> & { name: string; category: string }) {\n funcDef.params = funcDef.params || [];\n funcDef.defaultParams = funcDef.defaultParams || [];\n\n index[funcDef.name] = funcDef as FuncDef;\n if (funcDef.shortName) {\n index[funcDef.shortName] = funcDef as FuncDef;\n }\n}\n\nconst optionalSeriesRefArgs = [{ name: 'other', type: 'value_or_series', optional: true, multiple: true }];\n\naddFuncDef({\n name: 'scaleToSeconds',\n category: 'Transform',\n params: [{ name: 'seconds', type: 'int' }],\n defaultParams: [1],\n});\n\naddFuncDef({\n name: 'perSecond',\n category: 'Transform',\n params: [{ name: 'max value', type: 'int', optional: true }],\n defaultParams: [],\n});\n\naddFuncDef({\n name: 'holtWintersForecast',\n category: 'Calculate',\n});\n\naddFuncDef({\n name: 'holtWintersConfidenceBands',\n category: 'Calculate',\n params: [{ name: 'delta', type: 'int' }],\n defaultParams: [3],\n});\n\naddFuncDef({\n name: 'holtWintersAberration',\n category: 'Calculate',\n params: [{ name: 'delta', type: 'int' }],\n defaultParams: [3],\n});\n\naddFuncDef({\n name: 'nPercentile',\n category: 'Calculate',\n params: [{ name: 'Nth percentile', type: 'int' }],\n defaultParams: [95],\n});\n\naddFuncDef({\n name: 'diffSeries',\n params: optionalSeriesRefArgs,\n defaultParams: ['#A'],\n category: 'Combine',\n});\n\naddFuncDef({\n name: 'stddevSeries',\n params: optionalSeriesRefArgs,\n defaultParams: [''],\n category: 'Combine',\n});\n\naddFuncDef({\n name: 'divideSeries',\n params: optionalSeriesRefArgs,\n defaultParams: ['#A'],\n category: 'Combine',\n});\n\naddFuncDef({\n name: 'multiplySeries',\n params: optionalSeriesRefArgs,\n defaultParams: ['#A'],\n category: 'Combine',\n});\n\naddFuncDef({\n name: 'asPercent',\n params: optionalSeriesRefArgs,\n defaultParams: ['#A'],\n category: 'Combine',\n});\n\naddFuncDef({\n name: 'group',\n params: optionalSeriesRefArgs,\n defaultParams: ['#A', '#B'],\n category: 'Combine',\n});\n\naddFuncDef({\n name: 'sumSeries',\n shortName: 'sum',\n category: 'Combine',\n params: optionalSeriesRefArgs,\n defaultParams: [''],\n});\n\naddFuncDef({\n name: 'averageSeries',\n shortName: 'avg',\n category: 'Combine',\n params: optionalSeriesRefArgs,\n defaultParams: [''],\n});\n\naddFuncDef({\n name: 'rangeOfSeries',\n category: 'Combine',\n});\n\naddFuncDef({\n name: 'percentileOfSeries',\n category: 'Combine',\n params: [\n { name: 'n', type: 'int' },\n { name: 'interpolate', type: 'boolean', options: ['true', 'false'] },\n ],\n defaultParams: [95, 'false'],\n});\n\naddFuncDef({\n name: 'sumSeriesWithWildcards',\n category: 'Combine',\n params: [{ name: 'node', type: 'int', multiple: true }],\n defaultParams: [3],\n});\n\naddFuncDef({\n name: 'maxSeries',\n shortName: 'max',\n category: 'Combine',\n});\n\naddFuncDef({\n name: 'minSeries',\n shortName: 'min',\n category: 'Combine',\n});\n\naddFuncDef({\n name: 'averageSeriesWithWildcards',\n category: 'Combine',\n params: [{ name: 'node', type: 'int', multiple: true }],\n defaultParams: [3],\n});\n\naddFuncDef({\n name: 'alias',\n category: 'Alias',\n params: [{ name: 'alias', type: 'string' }],\n defaultParams: ['alias'],\n});\n\naddFuncDef({\n name: 'aliasSub',\n category: 'Alias',\n params: [\n { name: 'search', type: 'string' },\n { name: 'replace', type: 'string' },\n ],\n defaultParams: ['', '\\\\1'],\n});\n\naddFuncDef({\n name: 'consolidateBy',\n category: 'Special',\n params: [\n {\n name: 'function',\n type: 'string',\n options: ['sum', 'average', 'min', 'max'],\n },\n ],\n defaultParams: ['max'],\n});\n\naddFuncDef({\n name: 'cumulative',\n category: 'Special',\n params: [],\n defaultParams: [],\n});\n\naddFuncDef({\n name: 'groupByNode',\n category: 'Combine',\n params: [\n {\n name: 'node',\n type: 'int',\n options: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12],\n },\n {\n name: 'function',\n type: 'string',\n options: ['sum', 'avg', 'maxSeries'],\n },\n ],\n defaultParams: [3, 'sum'],\n});\n\naddFuncDef({\n name: 'aliasByNode',\n category: 'Alias',\n params: [\n {\n name: 'node',\n type: 'int',\n options: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12],\n multiple: true,\n },\n ],\n defaultParams: [3],\n});\n\naddFuncDef({\n name: 'substr',\n category: 'Special',\n params: [\n {\n name: 'start',\n type: 'int',\n options: [-6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12],\n },\n {\n name: 'stop',\n type: 'int',\n options: [-6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12],\n },\n ],\n defaultParams: [0, 0],\n});\n\naddFuncDef({\n name: 'sortByName',\n category: 'Sorting',\n params: [\n {\n name: 'natural',\n type: 'boolean',\n options: ['true', 'false'],\n optional: true,\n },\n ],\n defaultParams: ['false'],\n});\n\naddFuncDef({\n name: 'sortByMaxima',\n category: 'Sorting',\n});\n\naddFuncDef({\n name: 'sortByMinima',\n category: 'Sorting',\n});\n\naddFuncDef({\n name: 'sortByTotal',\n category: 'Sorting',\n});\n\naddFuncDef({\n name: 'aliasByMetric',\n category: 'Alias',\n});\n\naddFuncDef({\n name: 'randomWalk',\n fake: true,\n category: 'Special',\n params: [{ name: 'name', type: 'string' }],\n defaultParams: ['randomWalk'],\n});\n\naddFuncDef({\n name: 'countSeries',\n category: 'Combine',\n});\n\naddFuncDef({\n name: 'constantLine',\n category: 'Special',\n params: [{ name: 'value', type: 'int' }],\n defaultParams: [10],\n});\n\naddFuncDef({\n name: 'cactiStyle',\n category: 'Special',\n});\n\naddFuncDef({\n name: 'keepLastValue',\n category: 'Transform',\n params: [{ name: 'n', type: 'int' }],\n defaultParams: [100],\n});\n\naddFuncDef({\n name: 'changed',\n category: 'Special',\n params: [],\n defaultParams: [],\n});\n\naddFuncDef({\n name: 'scale',\n category: 'Transform',\n params: [{ name: 'factor', type: 'int' }],\n defaultParams: [1],\n});\n\naddFuncDef({\n name: 'offset',\n category: 'Transform',\n params: [{ name: 'amount', type: 'int' }],\n defaultParams: [10],\n});\n\naddFuncDef({\n name: 'transformNull',\n category: 'Transform',\n params: [{ name: 'amount', type: 'int' }],\n defaultParams: [0],\n});\n\naddFuncDef({\n name: 'integral',\n category: 'Transform',\n});\n\naddFuncDef({\n name: 'derivative',\n category: 'Transform',\n});\n\naddFuncDef({\n name: 'nonNegativeDerivative',\n category: 'Transform',\n params: [{ name: 'max value or 0', type: 'int', optional: true }],\n defaultParams: [''],\n});\n\naddFuncDef({\n name: 'timeShift',\n category: 'Transform',\n params: [\n {\n name: 'amount',\n type: 'select',\n options: ['1h', '6h', '12h', '1d', '2d', '7d', '14d', '30d'],\n },\n ],\n defaultParams: ['1d'],\n});\n\naddFuncDef({\n name: 'timeStack',\n category: 'Transform',\n params: [\n {\n name: 'timeShiftUnit',\n type: 'select',\n options: ['1h', '6h', '12h', '1d', '2d', '7d', '14d', '30d'],\n },\n { name: 'timeShiftStart', type: 'int' },\n { name: 'timeShiftEnd', type: 'int' },\n ],\n defaultParams: ['1d', 0, 7],\n});\n\naddFuncDef({\n name: 'summarize',\n category: 'Transform',\n params: [\n { name: 'interval', type: 'string' },\n {\n name: 'func',\n type: 'select',\n options: ['sum', 'avg', 'min', 'max', 'last'],\n },\n {\n name: 'alignToFrom',\n type: 'boolean',\n optional: true,\n options: ['false', 'true'],\n },\n ],\n defaultParams: ['1h', 'sum', 'false'],\n});\n\naddFuncDef({\n name: 'smartSummarize',\n category: 'Transform',\n params: [\n { name: 'interval', type: 'string' },\n {\n name: 'func',\n type: 'select',\n options: ['sum', 'avg', 'min', 'max', 'last'],\n },\n ],\n defaultParams: ['1h', 'sum'],\n});\n\naddFuncDef({\n name: 'absolute',\n category: 'Transform',\n});\n\naddFuncDef({\n name: 'hitcount',\n category: 'Transform',\n params: [{ name: 'interval', type: 'string' }],\n defaultParams: ['10s'],\n});\n\naddFuncDef({\n name: 'log',\n category: 'Transform',\n params: [{ name: 'base', type: 'int' }],\n defaultParams: ['10'],\n});\n\naddFuncDef({\n name: 'averageAbove',\n category: 'Filter Series',\n params: [{ name: 'n', type: 'int' }],\n defaultParams: [25],\n});\n\naddFuncDef({\n name: 'averageBelow',\n category: 'Filter Series',\n params: [{ name: 'n', type: 'int' }],\n defaultParams: [25],\n});\n\naddFuncDef({\n name: 'currentAbove',\n category: 'Filter Series',\n params: [{ name: 'n', type: 'int' }],\n defaultParams: [25],\n});\n\naddFuncDef({\n name: 'currentBelow',\n category: 'Filter Series',\n params: [{ name: 'n', type: 'int' }],\n defaultParams: [25],\n});\n\naddFuncDef({\n name: 'maximumAbove',\n category: 'Filter Series',\n params: [{ name: 'value', type: 'int' }],\n defaultParams: [0],\n});\n\naddFuncDef({\n name: 'maximumBelow',\n category: 'Filter Series',\n params: [{ name: 'value', type: 'int' }],\n defaultParams: [0],\n});\n\naddFuncDef({\n name: 'minimumAbove',\n category: 'Filter Series',\n params: [{ name: 'value', type: 'int' }],\n defaultParams: [0],\n});\n\naddFuncDef({\n name: 'minimumBelow',\n category: 'Filter Series',\n params: [{ name: 'value', type: 'int' }],\n defaultParams: [0],\n});\n\naddFuncDef({\n name: 'limit',\n category: 'Filter Series',\n params: [{ name: 'n', type: 'int' }],\n defaultParams: [5],\n});\n\naddFuncDef({\n name: 'mostDeviant',\n category: 'Filter Series',\n params: [{ name: 'n', type: 'int' }],\n defaultParams: [10],\n});\n\naddFuncDef({\n name: 'exclude',\n category: 'Filter Series',\n params: [{ name: 'exclude', type: 'string' }],\n defaultParams: ['exclude'],\n});\n\naddFuncDef({\n name: 'highestCurrent',\n category: 'Filter Series',\n params: [{ name: 'count', type: 'int' }],\n defaultParams: [5],\n});\n\naddFuncDef({\n name: 'highestMax',\n category: 'Filter Series',\n params: [{ name: 'count', type: 'int' }],\n defaultParams: [5],\n});\n\naddFuncDef({\n name: 'lowestCurrent',\n category: 'Filter Series',\n params: [{ name: 'count', type: 'int' }],\n defaultParams: [5],\n});\n\naddFuncDef({\n name: 'movingAverage',\n category: 'Calculate',\n params: [\n {\n name: 'windowSize',\n type: 'int_or_interval',\n options: ['5', '7', '10', '5min', '10min', '30min', '1hour'],\n },\n ],\n defaultParams: [10],\n});\n\naddFuncDef({\n name: 'movingMedian',\n category: 'Calculate',\n params: [\n {\n name: 'windowSize',\n type: 'int_or_interval',\n options: ['5', '7', '10', '5min', '10min', '30min', '1hour'],\n },\n ],\n defaultParams: ['5'],\n});\n\naddFuncDef({\n name: 'stdev',\n category: 'Calculate',\n params: [\n { name: 'n', type: 'int' },\n { name: 'tolerance', type: 'int' },\n ],\n defaultParams: [5, 0.1],\n});\n\naddFuncDef({\n name: 'highestAverage',\n category: 'Filter Series',\n params: [{ name: 'count', type: 'int' }],\n defaultParams: [5],\n});\n\naddFuncDef({\n name: 'lowestAverage',\n category: 'Filter Series',\n params: [{ name: 'count', type: 'int' }],\n defaultParams: [5],\n});\n\naddFuncDef({\n name: 'removeAbovePercentile',\n category: 'Filter Data',\n params: [{ name: 'n', type: 'int' }],\n defaultParams: [5],\n});\n\naddFuncDef({\n name: 'removeAboveValue',\n category: 'Filter Data',\n params: [{ name: 'n', type: 'int' }],\n defaultParams: [5],\n});\n\naddFuncDef({\n name: 'removeBelowPercentile',\n category: 'Filter Data',\n params: [{ name: 'n', type: 'int' }],\n defaultParams: [5],\n});\n\naddFuncDef({\n name: 'removeBelowValue',\n category: 'Filter Data',\n params: [{ name: 'n', type: 'int' }],\n defaultParams: [5],\n});\n\naddFuncDef({\n name: 'useSeriesAbove',\n category: 'Filter Series',\n params: [\n { name: 'value', type: 'int' },\n { name: 'search', type: 'string' },\n { name: 'replace', type: 'string' },\n ],\n defaultParams: [0, 'search', 'replace'],\n});\n\n////////////////////\n// Graphite 1.0.x //\n////////////////////\n\naddFuncDef({\n name: 'aggregateLine',\n category: 'Calculate',\n params: [\n {\n name: 'func',\n type: 'select',\n options: ['sum', 'avg', 'min', 'max', 'last'],\n },\n ],\n defaultParams: ['avg'],\n version: '1.0.0',\n});\n\naddFuncDef({\n name: 'averageOutsidePercentile',\n category: 'Filter Series',\n params: [{ name: 'n', type: 'int' }],\n defaultParams: [95],\n version: '1.0.0',\n});\n\naddFuncDef({\n name: 'delay',\n category: 'Transform',\n params: [{ name: 'steps', type: 'int' }],\n defaultParams: [1],\n version: '1.0.0',\n});\n\naddFuncDef({\n name: 'exponentialMovingAverage',\n category: 'Calculate',\n params: [\n {\n name: 'windowSize',\n type: 'int_or_interval',\n options: ['5', '7', '10', '5min', '10min', '30min', '1hour'],\n },\n ],\n defaultParams: [10],\n version: '1.0.0',\n});\n\naddFuncDef({\n name: 'fallbackSeries',\n category: 'Special',\n params: [{ name: 'fallback', type: 'string' }],\n defaultParams: ['constantLine(0)'],\n version: '1.0.0',\n});\n\naddFuncDef({\n name: 'grep',\n category: 'Filter Series',\n params: [{ name: 'grep', type: 'string' }],\n defaultParams: ['grep'],\n version: '1.0.0',\n});\n\naddFuncDef({\n name: 'groupByNodes',\n category: 'Combine',\n params: [\n {\n name: 'function',\n type: 'string',\n options: ['sum', 'avg', 'maxSeries'],\n },\n {\n name: 'node',\n type: 'int',\n options: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12],\n multiple: true,\n },\n ],\n defaultParams: ['sum', 3],\n version: '1.0.0',\n});\n\naddFuncDef({\n name: 'integralByInterval',\n category: 'Transform',\n params: [\n {\n name: 'intervalUnit',\n type: 'select',\n options: ['1h', '6h', '12h', '1d', '2d', '7d', '14d', '30d'],\n },\n ],\n defaultParams: ['1d'],\n version: '1.0.0',\n});\n\naddFuncDef({\n name: 'interpolate',\n category: 'Transform',\n params: [{ name: 'limit', type: 'int', optional: true }],\n defaultParams: [],\n version: '1.0.0',\n});\n\naddFuncDef({\n name: 'invert',\n category: 'Transform',\n version: '1.0.0',\n});\n\naddFuncDef({\n name: 'isNonNull',\n category: 'Combine',\n version: '1.0.0',\n});\n\naddFuncDef({\n name: 'linearRegression',\n category: 'Calculate',\n params: [\n {\n name: 'startSourceAt',\n type: 'select',\n options: ['-1h', '-6h', '-12h', '-1d', '-2d', '-7d', '-14d', '-30d'],\n optional: true,\n },\n {\n name: 'endSourceAt',\n type: 'select',\n options: ['-1h', '-6h', '-12h', '-1d', '-2d', '-7d', '-14d', '-30d'],\n optional: true,\n },\n ],\n defaultParams: [],\n version: '1.0.0',\n});\n\naddFuncDef({\n name: 'mapSeries',\n shortName: 'map',\n params: [{ name: 'node', type: 'int' }],\n defaultParams: [3],\n category: 'Combine',\n version: '1.0.0',\n});\n\naddFuncDef({\n name: 'movingMin',\n category: 'Calculate',\n params: [\n {\n name: 'windowSize',\n type: 'int_or_interval',\n options: ['5', '7', '10', '5min', '10min', '30min', '1hour'],\n },\n ],\n defaultParams: [10],\n version: '1.0.0',\n});\n\naddFuncDef({\n name: 'movingMax',\n category: 'Calculate',\n params: [\n {\n name: 'windowSize',\n type: 'int_or_interval',\n options: ['5', '7', '10', '5min', '10min', '30min', '1hour'],\n },\n ],\n defaultParams: [10],\n version: '1.0.0',\n});\n\naddFuncDef({\n name: 'movingSum',\n category: 'Calculate',\n params: [\n {\n name: 'windowSize',\n type: 'int_or_interval',\n options: ['5', '7', '10', '5min', '10min', '30min', '1hour'],\n },\n ],\n defaultParams: [10],\n version: '1.0.0',\n});\n\naddFuncDef({\n name: 'multiplySeriesWithWildcards',\n category: 'Combine',\n params: [\n {\n name: 'position',\n type: 'int',\n options: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12],\n multiple: true,\n },\n ],\n defaultParams: [2],\n version: '1.0.0',\n});\n\naddFuncDef({\n name: 'offsetToZero',\n category: 'Transform',\n version: '1.0.0',\n});\n\naddFuncDef({\n name: 'pow',\n category: 'Transform',\n params: [{ name: 'factor', type: 'int' }],\n defaultParams: [10],\n version: '1.0.0',\n});\n\naddFuncDef({\n name: 'powSeries',\n category: 'Transform',\n params: optionalSeriesRefArgs,\n defaultParams: [''],\n version: '1.0.0',\n});\n\naddFuncDef({\n name: 'reduceSeries',\n shortName: 'reduce',\n params: [\n {\n name: 'function',\n type: 'string',\n options: ['asPercent', 'diffSeries', 'divideSeries'],\n },\n {\n name: 'reduceNode',\n type: 'int',\n options: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13],\n },\n { name: 'reduceMatchers', type: 'string', multiple: true },\n ],\n defaultParams: ['asPercent', 2, 'used_bytes'],\n category: 'Combine',\n version: '1.0.0',\n});\n\naddFuncDef({\n name: 'removeBetweenPercentile',\n category: 'Filter Series',\n params: [{ name: 'n', type: 'int' }],\n defaultParams: [95],\n version: '1.0.0',\n});\n\naddFuncDef({\n name: 'removeEmptySeries',\n category: 'Filter Series',\n version: '1.0.0',\n});\n\naddFuncDef({\n name: 'squareRoot',\n category: 'Transform',\n version: '1.0.0',\n});\n\naddFuncDef({\n name: 'timeSlice',\n category: 'Transform',\n params: [\n {\n name: 'startSliceAt',\n type: 'select',\n options: ['-1h', '-6h', '-12h', '-1d', '-2d', '-7d', '-14d', '-30d'],\n },\n {\n name: 'endSliceAt',\n type: 'select',\n options: ['-1h', '-6h', '-12h', '-1d', '-2d', '-7d', '-14d', '-30d'],\n optional: true,\n },\n ],\n defaultParams: ['-1h'],\n version: '1.0.0',\n});\n\naddFuncDef({\n name: 'weightedAverage',\n category: 'Combine',\n params: [\n { name: 'other', type: 'value_or_series', optional: true },\n {\n name: 'node',\n type: 'int',\n options: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12],\n },\n ],\n defaultParams: ['#A', 4],\n version: '1.0.0',\n});\n\naddFuncDef({\n name: 'seriesByTag',\n category: 'Special',\n params: [{ name: 'tagExpression', type: 'string', multiple: true }],\n version: '1.1.0',\n});\n\naddFuncDef({\n name: 'groupByTags',\n category: 'Combine',\n params: [\n {\n name: 'function',\n type: 'string',\n options: ['sum', 'avg', 'maxSeries'],\n },\n { name: 'tag', type: 'string', multiple: true },\n ],\n defaultParams: ['sum', 'tag'],\n version: '1.1.0',\n});\n\naddFuncDef({\n name: 'aliasByTags',\n category: 'Alias',\n params: [{ name: 'tag', type: 'string', multiple: true }],\n defaultParams: ['tag'],\n version: '1.1.0',\n});\n\nfunction isVersionRelatedFunction(obj: { version?: string }, graphiteVersion: string) {\n const fullVersion = coerce(graphiteVersion);\n if (!fullVersion) {\n return false;\n }\n\n return !obj.version || gte(fullVersion, obj.version);\n}\n\nexport class FuncInstance {\n def: FuncDef;\n params: Array<string | number>;\n text = '';\n /**\n * True if this function was just added and not edited yet. It's used to focus on first\n * function param to edit it straight away after adding a function.\n */\n declare added: boolean;\n /**\n * Hidden functions are not displayed in UI but available in text editor\n * This is used for seriesByTagUsed function which when used switches\n * the editor to tag-only mode. Defined tags are provided to seriesByTagUsed\n * as parameters.\n */\n hidden?: boolean;\n\n constructor(funcDef: FuncDef, options?: { withDefaultParams: boolean }) {\n this.def = funcDef;\n this.params = [];\n\n if (options && options.withDefaultParams && funcDef.defaultParams) {\n this.params = funcDef.defaultParams.slice(0);\n }\n\n this.updateText();\n }\n\n render(metricExp: string, replaceVariables: InterpolateFunction): string {\n const str = this.def.name + '(';\n\n const parameters = map(this.params, (value, index) => {\n let paramType;\n\n if (index < this.def.params.length) {\n paramType = this.def.params[index].type;\n } else if (get(last(this.def.params), 'multiple')) {\n paramType = get(last(this.def.params), 'type');\n }\n\n // param types that should never be quoted\n const neverQuotedParams = ['value_or_series', 'boolean', 'int', 'float', 'node', 'int_or_infinity'];\n\n // functions that should not have param types quoted\n // https://github.com/grafana/grafana/issues/54924\n const neverQuotedFunctions = ['asPercent'];\n // params or functions that should never be quoted\n if (includes(neverQuotedParams, paramType) || includes(neverQuotedFunctions, this.def.name)) {\n return value;\n }\n\n const valueInterpolated = isString(value) ? replaceVariables(value) : value;\n\n // param types that might be quoted\n // To quote variables correctly we need to interpolate it to check if it contains a numeric or string value\n if (includes(['int_or_interval', 'node_or_tag'], paramType) && isFinite(+valueInterpolated)) {\n return toString(value);\n }\n\n return \"'\" + value + \"'\";\n });\n\n // don't send any blank parameters to graphite\n while (parameters[parameters.length - 1] === '') {\n parameters.pop();\n }\n\n if (metricExp) {\n parameters.unshift(metricExp);\n }\n\n return str + parameters.join(', ') + ')';\n }\n\n _hasMultipleParamsInString(strValue: string, index: number) {\n if (strValue.indexOf(',') === -1) {\n return false;\n }\n\n if (this.def.params[index + 1] && this.def.params[index + 1].optional) {\n return true;\n }\n\n if (index + 1 >= this.def.params.length && get(last(this.def.params), 'multiple')) {\n return true;\n }\n\n return false;\n }\n\n updateParam(strValue: string, index: number) {\n // handle optional parameters\n // if string contains ',' and next param is optional, split and update both\n if (this._hasMultipleParamsInString(strValue, index)) {\n each(strValue.split(','), (partVal, idx) => {\n this.updateParam(partVal.trim(), index + idx);\n });\n return;\n }\n\n if (strValue === '' && (index >= this.def.params.length || this.def.params[index].optional)) {\n this.params.splice(index, 1);\n } else {\n this.params[index] = strValue;\n }\n\n this.updateText();\n }\n\n updateText() {\n if (this.params.length === 0) {\n this.text = this.def.name + '()';\n return;\n }\n\n let text = this.def.name + '(';\n text += this.params.join(', ');\n text += ')';\n this.text = text;\n }\n}\n\nfunction createFuncInstance(\n funcDef: FuncDef | string,\n options?: { withDefaultParams: boolean },\n idx?: FuncDefs | null\n): FuncInstance {\n if (isString(funcDef)) {\n funcDef = getFuncDef(funcDef, idx);\n }\n return new FuncInstance(funcDef, options);\n}\n\nfunction getFuncDef(name: string, idx?: FuncDefs | null): FuncDef {\n if (!(idx || index)[name]) {\n return { name: name, params: [{ name: '', type: '', multiple: true }], defaultParams: [''], unknown: true };\n }\n return (idx || index)[name];\n}\n\nfunction getFuncDefs(graphiteVersion: string, idx?: FuncDefs | null): FuncDefs {\n const funcs: FuncDefs = {};\n forEach(idx || index, (funcDef: FuncDef) => {\n if (isVersionRelatedFunction(funcDef, graphiteVersion)) {\n funcs[funcDef.name] = assign({}, funcDef, {\n params: filter(funcDef.params, (param) => {\n return isVersionRelatedFunction(param, graphiteVersion);\n }),\n });\n }\n });\n return funcs;\n}\n\n// parse response from graphite /functions endpoint into internal format\nfunction parseFuncDefs(rawDefs: any): FuncDefs {\n const funcDefs: FuncDefs = {};\n\n forEach(rawDefs || {}, (funcDef, funcName) => {\n // skip graphite graph functions\n if (funcDef.group === 'Graph') {\n return;\n }\n\n let description = funcDef.description;\n if (description) {\n // tidy up some pydoc syntax that rst2html can't handle\n description = description\n .replace(/:py:func:`(.+)( <[^>]*>)?`/g, '``$1``')\n .replace(/.. seealso:: /g, 'See also: ')\n .replace(/.. code-block *:: *none/g, '.. code-block::');\n }\n\n const func: FuncDef = {\n name: funcDef.name,\n description,\n category: funcDef.group,\n params: [],\n defaultParams: [],\n fake: false,\n };\n\n // get rid of the first \"seriesList\" param\n if (/^seriesLists?$/.test(get(funcDef, 'params[0].type', ''))) {\n // handle functions that accept multiple seriesLists\n // we leave the param in place but mark it optional, so users can add more series if they wish\n if (funcDef.params[0].multiple) {\n funcDef.params[0].required = false;\n // otherwise chop off the first param, it'll be handled separately\n } else {\n funcDef.params.shift();\n }\n // tag function as fake\n } else {\n func.fake = true;\n }\n\n forEach(funcDef.params, (rawParam) => {\n const param: ParamDef = {\n name: rawParam.name,\n type: 'string',\n optional: !rawParam.required,\n multiple: !!rawParam.multiple,\n options: undefined,\n };\n\n if (rawParam.default !== undefined) {\n if (rawParam.default === Infinity) {\n func.defaultParams.push('inf');\n } else {\n func.defaultParams.push(toString(rawParam.default));\n }\n } else if (rawParam.suggestions) {\n func.defaultParams.push(toString(rawParam.suggestions[0]));\n } else {\n func.defaultParams.push('');\n }\n\n if (rawParam.type === 'boolean') {\n param.type = 'boolean';\n param.options = ['true', 'false'];\n } else if (rawParam.type === 'integer') {\n param.type = 'int';\n } else if (rawParam.type === 'float') {\n param.type = 'float';\n } else if (rawParam.type === 'node') {\n param.type = 'node';\n param.options = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'];\n } else if (rawParam.type === 'nodeOrTag') {\n param.type = 'node_or_tag';\n param.options = ['name', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'];\n } else if (rawParam.type === 'intOrInterval') {\n param.type = 'int_or_interval';\n } else if (rawParam.type === 'seriesList') {\n param.type = 'value_or_series';\n } else if (rawParam.type === 'intOrInf') {\n param.type = 'int_or_infinity';\n }\n\n if (rawParam.options) {\n param.options = map(rawParam.options, toString);\n } else if (rawParam.suggestions) {\n param.options = map(rawParam.suggestions, toString);\n }\n\n func.params.push(param);\n });\n\n funcDefs[funcName] = func;\n });\n\n return funcDefs;\n}\n\nexport default {\n createFuncInstance: createFuncInstance,\n getFuncDef: getFuncDef,\n getFuncDefs: getFuncDefs,\n parseFuncDefs: parseFuncDefs,\n};\n","type LegacyAnnotation = {\n target?: string;\n tags?: string;\n};\n\n// this becomes the target in the migrated annotations\nconst migrateLegacyAnnotation = (json: LegacyAnnotation) => {\n // return the target annotation\n if (typeof json.target === 'string' && json.target) {\n return {\n fromAnnotations: true,\n target: json.target,\n textEditor: true,\n };\n }\n\n // return the tags annotation\n return {\n queryType: 'tags',\n tags: (json.tags || '').split(' '),\n fromAnnotations: true,\n };\n};\n\n// eslint-ignore-next-line\nexport const prepareAnnotation = (json: any) => {\n // annotation attributes are either 'tags' or 'target'(a graphite query string)\n // because the new annotations will also have a target attribute, {}\n // we need to handle the ambiguous 'target' when migrating legacy annotations\n // so, to migrate legacy annotations\n // we check that target is a string\n // or\n // there is a tags attribute with no target\n const resultingTarget = json.target && typeof json.target !== 'string' ? json.target : migrateLegacyAnnotation(json);\n\n json.target = resultingTarget;\n\n return json;\n};\n","import { map as _map, each, indexOf, isArray, isString } from 'lodash';\nimport moment from 'moment';\nimport { lastValueFrom, merge, Observable, of, OperatorFunction, pipe, throwError } from 'rxjs';\nimport { catchError, map } from 'rxjs/operators';\nimport { coerce, gte, SemVer, valid } from 'semver';\n\nimport {\n AbstractLabelMatcher,\n AbstractLabelOperator,\n AbstractQuery,\n DataFrame,\n DataQueryRequest,\n DataQueryResponse,\n DataSourceWithQueryExportSupport,\n dateMath,\n DateTime,\n dateTime,\n getSearchFilterScopedVar,\n MetricFindValue,\n QueryResultMetaStat,\n ScopedVars,\n TimeRange,\n toDataFrame,\n} from '@grafana/data';\nimport {\n BackendSrvRequest,\n config,\n DataSourceWithBackend,\n FetchResponse,\n getBackendSrv,\n getTemplateSrv,\n TemplateSrv,\n} from '@grafana/runtime';\nimport { TimeZone } from '@grafana/schema';\n\nimport { AnnotationEditor } from './components/AnnotationsEditor';\nimport { convertToGraphiteQueryObject } from './components/helpers';\nimport gfunc, { FuncDef, FuncDefs, FuncInstance } from './gfunc';\nimport GraphiteQueryModel from './graphite_query';\nimport { getRollupNotice, getRuntimeConsolidationNotice } from './meta';\nimport { prepareAnnotation } from './migrations';\n// Types\nimport {\n GraphiteEvents,\n GraphiteLokiMapping,\n GraphiteMetricLokiMatcher,\n GraphiteOptions,\n GraphiteQuery,\n GraphiteQueryImportConfiguration,\n GraphiteQueryType,\n GraphiteType,\n MetricTankRequestMeta,\n MetricTankSeriesMeta,\n} from './types';\nimport { reduceError } from './utils';\nimport { DEFAULT_GRAPHITE_VERSION } from './versions';\n\nconst GRAPHITE_TAG_COMPARATORS = {\n '=': AbstractLabelOperator.Equal,\n '!=': AbstractLabelOperator.NotEqual,\n '=~': AbstractLabelOperator.EqualRegEx,\n '!=~': AbstractLabelOperator.NotEqualRegEx,\n};\n\n/**\n * Converts Graphite glob-like pattern to a regular expression\n */\nfunction convertGlobToRegEx(text: string): string {\n if (text.includes('*') || text.includes('{')) {\n return '^' + text.replace(/\\*/g, '.*').replace(/\\{/g, '(').replace(/}/g, ')').replace(/,/g, '|');\n } else {\n return text;\n }\n}\n\nexport class GraphiteDatasource\n extends DataSourceWithBackend<GraphiteQuery, GraphiteOptions>\n implements DataSourceWithQueryExportSupport<GraphiteQuery>\n{\n basicAuth: string;\n url: string;\n name: string;\n graphiteVersion: string;\n supportsTags: boolean;\n isMetricTank: boolean;\n rollupIndicatorEnabled: boolean;\n cacheTimeout: number;\n withCredentials: boolean;\n funcDefs: FuncDefs | null = null;\n funcDefsPromise: Promise<FuncDefs> | null = null;\n _seriesRefLetters: string;\n requestCounter = 100;\n private readonly metricMappings: GraphiteLokiMapping[];\n\n constructor(\n instanceSettings: any,\n private readonly templateSrv: TemplateSrv = getTemplateSrv()\n ) {\n super(instanceSettings);\n this.basicAuth = instanceSettings.basicAuth;\n this.url = instanceSettings.url;\n this.name = instanceSettings.name;\n // graphiteVersion is set when a datasource is created but it hadn't been set in the past so we're\n // still falling back to the default behavior here for backwards compatibility (see also #17429)\n this.graphiteVersion = instanceSettings.jsonData.graphiteVersion || DEFAULT_GRAPHITE_VERSION;\n this.metricMappings = instanceSettings.jsonData.importConfiguration?.loki?.mappings || [];\n this.isMetricTank = instanceSettings.jsonData.graphiteType === GraphiteType.Metrictank;\n this.supportsTags = supportsTags(this.graphiteVersion);\n this.cacheTimeout = instanceSettings.cacheTimeout;\n this.rollupIndicatorEnabled = instanceSettings.jsonData.rollupIndicatorEnabled;\n this.withCredentials = instanceSettings.withCredentials;\n this.funcDefs = null;\n this.funcDefsPromise = null;\n this._seriesRefLetters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n this.annotations = {\n QueryEditor: AnnotationEditor,\n prepareAnnotation,\n };\n }\n\n getQueryOptionsInfo() {\n return {\n maxDataPoints: true,\n cacheTimeout: true,\n links: [\n {\n text: 'Help',\n url: 'http://docs.grafana.org/features/datasources/graphite/#using-graphite-in-grafana',\n },\n ],\n };\n }\n\n getImportQueryConfiguration(): GraphiteQueryImportConfiguration {\n return {\n loki: {\n mappings: this.metricMappings,\n },\n };\n }\n\n async exportToAbstractQueries(queries: GraphiteQuery[]): Promise<AbstractQuery[]> {\n return queries.map((query) => this.exportToAbstractQuery(query));\n }\n\n exportToAbstractQuery(query: GraphiteQuery): AbstractQuery {\n const graphiteQuery: GraphiteQueryModel = new GraphiteQueryModel(\n this,\n {\n ...query,\n target: query.target || '',\n textEditor: false,\n },\n this.templateSrv\n );\n graphiteQuery.parseTarget();\n\n let labels: AbstractLabelMatcher[] = [];\n const config = this.getImportQueryConfiguration().loki;\n\n if (graphiteQuery.seriesByTagUsed) {\n graphiteQuery.tags.forEach((tag) => {\n labels.push({\n name: tag.key,\n operator: GRAPHITE_TAG_COMPARATORS[tag.operator],\n value: tag.value,\n });\n });\n } else {\n const targetNodes = graphiteQuery.segments.map((segment) => segment.value);\n let mappings = config.mappings.filter((mapping) => mapping.matchers.length <= targetNodes.length);\n\n for (let mapping of mappings) {\n const matchers = mapping.matchers.concat();\n\n matchers.every((matcher: GraphiteMetricLokiMatcher, index: number) => {\n if (matcher.labelName) {\n let value = (targetNodes[index] as string)!;\n\n if (value === '*') {\n return true;\n }\n\n const converted = convertGlobToRegEx(value);\n labels.push({\n name: matcher.labelName,\n operator: converted !== value ? AbstractLabelOperator.EqualRegEx : AbstractLabelOperator.Equal,\n value: converted,\n });\n return true;\n }\n return targetNodes[index] === matcher.value || matcher.value === '*';\n });\n }\n }\n\n return {\n refId: query.refId,\n labelMatchers: labels,\n };\n }\n\n filterQuery(item: GraphiteQuery): boolean {\n if (!item.target && !item.fromAnnotations) {\n return false;\n }\n\n return true;\n }\n\n // Note that we do not omit queries with the hide flag set to true to avoid breaking nested series replacement\n // e.g. sumSeries(#A) where A is hidden\n applyTemplateVariables(target: GraphiteQuery, scopedVars: ScopedVars) {\n return {\n ...target,\n target: this.templateSrv.replace(target.target ?? '', scopedVars),\n targetFull: this.templateSrv.replace(target.targetFull ?? '', scopedVars),\n };\n }\n\n frontendQuery(\n options: DataQueryRequest<GraphiteQuery>,\n originalTargetMap: { [key: string]: string },\n formattedRefIdsMap: { [key: string]: string }\n ): Observable<DataQueryResponse> {\n // handle the queries here\n const graphOptions = {\n from: this.translateTime(options.range.from, false, options.timezone),\n until: this.translateTime(options.range.to, true, options.timezone),\n targets: options.targets,\n format: 'json',\n cacheTimeout: options.cacheTimeout || this.cacheTimeout,\n maxDataPoints: options.maxDataPoints,\n };\n\n const params = this.buildGraphiteParams(graphOptions, originalTargetMap, options.scopedVars);\n if (params.length === 0) {\n return of({ data: [] });\n }\n\n if (this.isMetricTank) {\n params.push('meta=true');\n }\n\n const httpOptions: BackendSrvRequest = {\n method: 'POST',\n url: '/render',\n data: params.join('&'),\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n };\n\n this.addTracingHeaders(httpOptions, options);\n\n if (options.panelId) {\n httpOptions.requestId = this.name + '.panelId.' + options.panelId;\n }\n\n return this.doGraphiteRequest(httpOptions).pipe(\n map((result) => this.convertResponseToDataFrames(result, formattedRefIdsMap))\n );\n }\n\n backendBuildGraphiteQueries(\n options: DataQueryRequest<GraphiteQuery>,\n originalTargetMap: { [key: string]: string }\n ): GraphiteQuery[] {\n const referenceTargets: Record<string, string> = {};\n const finalTargets: GraphiteQuery[] = [];\n let target: GraphiteQuery, targetValue, i;\n\n for (i = 0; i < options.targets.length; i++) {\n target = options.targets[i];\n if (!target.target) {\n continue;\n }\n\n if (!target.refId) {\n target.refId = this._seriesRefLetters[i];\n }\n\n referenceTargets[target.refId] = target.target;\n }\n\n const seriesReferenceRegex = /\\#([A-Z])/g;\n\n function nestedSeriesRegexReplacer(match: string, g1: string) {\n // Handle the case where a query references itself to prevent infinite recursion\n if (target.refId === g1) {\n return referenceTargets[g1] || match;\n }\n\n // Recursively replace all nested series references\n return originalTargetMap[g1].replace(seriesReferenceRegex, nestedSeriesRegexReplacer) || match;\n }\n\n for (i = 0; i < options.targets.length; i++) {\n const targetClone = { ...options.targets[i] };\n target = options.targets[i];\n if (!targetClone.target) {\n continue;\n }\n\n targetValue = this.templateSrv.replace(\n referenceTargets[target.refId].replace(seriesReferenceRegex, nestedSeriesRegexReplacer),\n options.scopedVars\n );\n\n targetClone.target = targetValue;\n if (this.isMetricTank) {\n targetClone.isMetricTank = true;\n }\n\n if (!targetClone.hide) {\n finalTargets.push(targetClone);\n }\n }\n\n return finalTargets;\n }\n\n query(options: DataQueryRequest<GraphiteQuery>): Observable<DataQueryResponse> {\n if (options.targets.some((target: GraphiteQuery) => target.fromAnnotations)) {\n const streams: Array<Observable<DataQueryResponse>> = [];\n\n for (const target of options.targets) {\n streams.push(\n new Observable((subscriber) => {\n this.annotationEvents(options.range, target)\n .then((events) => subscriber.next({ data: [toDataFrame(events)] }))\n .catch((ex) => subscriber.error(new Error(ex)))\n .finally(() => subscriber.complete());\n })\n );\n }\n\n return merge(...streams);\n }\n\n // Use this object to map the sanitised refID to the original\n const formattedRefIdsMap: { [key: string]: string } = {};\n // Use this object to map the original refID to the original target\n const originalTargetMap: { [key: string]: string } = {};\n for (const target of options.targets) {\n // Sanitise the refID otherwise the Graphite query will fail\n const formattedRefId = target.refId.replaceAll(' ', '_');\n formattedRefIdsMap[formattedRefId] = target.refId;\n // Track the original target to ensure if we need to interpolate a series, we interpolate using the original target\n // rather than the target wrapped in aliasSub e.g.:\n // Suppose a query has three targets: A: metric1 B: sumSeries(#A) and C: asPercent(#A, #B)\n // We want the targets to be interpolated to: A: aliasSub(metric1, \"(^.*$)\", \"\\\\1 A\"), B: aliasSub(sumSeries(metric1), \"(^.*$)\", \"\\\\1 B\") and C: asPercent(metric1, sumSeries(metric1))\n originalTargetMap[target.refId] = target.target || '';\n\n // We only need to alias queries in frontend mode\n if (!config.featureToggles.graphiteBackendMode) {\n // Use aliasSub to include the refID in the response series name. This allows us to set the refID on the frame.\n const updatedTarget = `aliasSub(${target.target}, \"(^.*$)\", \"\\\\1 ${formattedRefId}\")`;\n target.target = updatedTarget;\n }\n }\n\n if (config.featureToggles.graphiteBackendMode) {\n const graphiteQueries = this.backendBuildGraphiteQueries(options, originalTargetMap);\n\n options.targets = graphiteQueries;\n\n return super.query(options);\n }\n\n return this.frontendQuery(options, originalTargetMap, formattedRefIdsMap);\n }\n\n addTracingHeaders(httpOptions: BackendSrvRequest, options: Partial<DataQueryRequest<GraphiteQuery>>) {\n const proxyMode = !this.url?.match(/^http/);\n if (!httpOptions.headers) {\n httpOptions.headers = {};\n }\n if (proxyMode) {\n if (options.dashboardUID) {\n httpOptions.headers['X-Dashboard-Id'] = options.dashboardUID;\n }\n if (options.panelId) {\n httpOptions.headers['X-Panel-Id'] = options.panelId;\n }\n if (options.panelPluginId) {\n httpOptions.headers['X-Panel-Plugin-Id'] = options.panelPluginId;\n }\n }\n }\n\n convertResponseToDataFrames = (result: FetchResponse, refIdMap: { [key: string]: string }): DataQueryResponse => {\n const data: DataFrame[] = [];\n if (!result || !result.data) {\n return { data };\n }\n\n // Series are either at the root or under a node called 'series'\n const series: Array<{\n target: string;\n title: string;\n tags: Record<string, string | number>;\n datapoints: Array<[number, number]>;\n meta: MetricTankSeriesMeta[];\n }> = result.data.series || result.data;\n\n if (!isArray(series)) {\n throw { message: 'Missing series in result', data: result };\n }\n\n for (let i = 0; i < series.length; i++) {\n const s = series[i];\n\n let refId = '';\n // Retrieve the original refID of the query\n const splitTarget = s.target.split(' ');\n if (splitTarget.length > 1) {\n // refID should always be the last element\n refId = splitTarget.pop() || '';\n s.target = splitTarget.join(' ');\n }\n // Disables Grafana own series naming\n s.title = s.target;\n\n for (let y = 0; y < s.datapoints.length; y++) {\n s.datapoints[y][1] *= 1000;\n }\n\n const frame = toDataFrame(s);\n // Set the refID value on the frame\n frame.refId = refIdMap[refId];\n\n // Metrictank metadata\n if (s.meta) {\n frame.meta = {\n custom: {\n requestMetaList: result.data.meta, // info for the whole request\n seriesMetaList: s.meta, // Array of metadata\n },\n };\n\n if (this.rollupIndicatorEnabled) {\n const rollupNotice = getRollupNotice(s.meta);\n const runtimeNotice = getRuntimeConsolidationNotice(s.meta);\n\n if (rollupNotice) {\n frame.meta.notices = [rollupNotice];\n } else if (runtimeNotice) {\n frame.meta.notices = [runtimeNotice];\n }\n }\n\n // only add the request stats to the first frame\n if (i === 0 && result.data.meta.stats) {\n frame.meta.stats = this.getRequestStats(result.data.meta);\n }\n }\n\n data.push(frame);\n }\n\n return { data };\n };\n\n getRequestStats(meta: MetricTankRequestMeta): QueryResultMetaStat[] {\n const stats: QueryResultMetaStat[] = [];\n\n for (const key in meta.stats) {\n let unit: string | undefined = undefined;\n\n if (key.endsWith('.ms')) {\n unit = 'ms';\n }\n\n stats.push({ displayName: key, value: meta.stats[key], unit });\n }\n\n return stats;\n }\n\n parseTags(tagString: string) {\n let tags: string[] = [];\n tags = tagString.split(',');\n if (tags.length === 1) {\n tags = tagString.split(' ');\n if (tags[0] === '') {\n tags = [];\n }\n }\n return tags;\n }\n\n interpolateVariablesInQueries(queries: GraphiteQuery[], scopedVars: ScopedVars): GraphiteQuery[] {\n let expandedQueries = queries;\n if (queries && queries.length > 0) {\n expandedQueries = queries.map((query) => {\n const expandedQuery = {\n ...query,\n datasource: this.getRef(),\n target: this.templateSrv.replace(query.target ?? '', scopedVars),\n };\n return expandedQuery;\n });\n }\n return expandedQueries;\n }\n\n annotationEvents(range: TimeRange, target: GraphiteQuery) {\n if (target.target) {\n // Graphite query as target as annotation\n const targetAnnotation = this.templateSrv.replace(target.target, {}, 'glob');\n const graphiteQuery = {\n range: range,\n targets: [{ target: targetAnnotation, refId: target.refId }],\n format: 'json',\n maxDataPoints: 100,\n } as unknown as DataQueryRequest<GraphiteQuery>;\n\n return lastValueFrom(\n this.query(graphiteQuery).pipe(\n map((result) => {\n const list = [];\n\n for (let i = 0; i < result.data.length; i++) {\n const target = result.data[i];\n\n for (let y = 0; y < target.length; y++) {\n const time = target.fields[0].values[y];\n const value = target.fields[1].values[y];\n\n if (!value) {\n continue;\n }\n\n list.push({\n annotation: target,\n time,\n title: target.name,\n });\n }\n }\n\n return list;\n })\n )\n );\n } else {\n // Graphite event/tag as annotation\n const tags = this.templateSrv.replace(target.tags?.join(' '));\n return this.events({ range: range, tags: tags }).then((results) => {\n const list = [];\n if (!isArray(results.data)) {\n console.error(`Unable to get annotations.`);\n return [];\n }\n for (let i = 0; i < results.data.length; i++) {\n const e = results.data[i];\n\n let tags = e.tags;\n if (isString(e.tags)) {\n tags = this.parseTags(e.tags);\n }\n\n list.push({\n annotation: target,\n time: e.when * 1000,\n title: e.what,\n tags: tags,\n text: e.data,\n });\n }\n\n return list;\n });\n }\n }\n\n async events(options: {\n range: TimeRange;\n tags: string;\n timezone?: TimeZone;\n }): Promise<{ data: GraphiteEvents[] } | FetchResponse<GraphiteEvents>> {\n try {\n const tags = options.tags || '';\n const from = this.translateTime(options.range.raw.from, false, options.timezone);\n const until = this.translateTime(options.range.raw.to, true, options.timezone);\n if (config.featureToggles.graphiteBackendMode) {\n return await this.postResource<{ data: GraphiteEvents[] }>('events', {\n from: typeof from === 'string' ? from : `${from}`,\n until: typeof until === 'string' ? until : `${until}`,\n tags,\n });\n } else {\n const tagsQueryParam = tags === '' ? '' : `&tags=${tags}`;\n return lastValueFrom(\n this.doGraphiteRequest<GraphiteEvents[]>({\n method: 'GET',\n url: `/events/get_data?from=${from}&until=${until}${tagsQueryParam}`,\n })\n );\n }\n } catch (err) {\n return Promise.reject(err);\n }\n }\n\n targetContainsTemplate(target: GraphiteQuery) {\n return this.templateSrv.containsTemplate(target.target ?? '');\n }\n\n translateTime(date: DateTime | string, roundUp?: boolean, timezone?: TimeZone) {\n const parseDate = () => {\n if (isString(date)) {\n if (date === 'now') {\n return 'now';\n } else if (date.indexOf('now-') >= 0 && date.indexOf('/') === -1) {\n return date.substring(3).replace('m', 'min').replace('M', 'mon');\n }\n const parsedDate = dateMath.toDateTime(date, { roundUp, timezone });\n\n // If the date is invalid return the original string\n // e.g. if an empty string is passed in or if the roundng is invalid e.g. now/2y\n if (!parsedDate || parsedDate.isValid() === false) {\n return date;\n }\n\n return moment(parsedDate.toDate());\n } else {\n return moment(date.toDate());\n }\n };\n\n const parsedDate = parseDate();\n\n if (typeof parsedDate === 'string') {\n return parsedDate;\n }\n\n // graphite' s from filter is exclusive\n // here we step back one minute in order\n // to guarantee that we get all the data that\n // exists for the specified range\n if (roundUp) {\n if (parsedDate.get('s')) {\n parsedDate.add(1, 's');\n }\n } else if (roundUp === false) {\n if (parsedDate.get('s')) {\n parsedDate.subtract(1, 's');\n }\n }\n\n return parsedDate.unix();\n }\n\n metricFindQuery(findQuery: string | GraphiteQuery, optionalOptions?: any): Promise<MetricFindValue[]> {\n const options = optionalOptions || {};\n\n const queryObject = convertToGraphiteQueryObject(findQuery);\n if (queryObject.queryType === GraphiteQueryType.Value || queryObject.queryType === GraphiteQueryType.MetricName) {\n return this.requestMetricRender(queryObject, options, queryObject.queryType);\n }\n\n let query = queryObject.target ?? '';\n\n // First attempt to check for tag-related functions (using empty wildcard for interpolation)\n let interpolatedQuery = this.templateSrv.replace(\n query,\n getSearchFilterScopedVar({ query, wildcardChar: '', options: optionalOptions })\n );\n\n // special handling for tag_values(<tag>[,<expression>]*), this is used for template variables\n let allParams = interpolatedQuery.match(/^tag_values\\((.*)\\)$/);\n let expressions = allParams ? allParams[1].split(/,(?![^{]*\\})/).filter((p) => !!p) : undefined;\n if (expressions) {\n options.limit = 10000;\n return this.getTagValuesAutoComplete(expressions.slice(1), expressions[0], undefined, options);\n }\n\n // special handling for tags(<expression>[,<expression>]*), this is used for template variables\n allParams = interpolatedQuery.match(/^tags\\((.*)\\)$/);\n expressions = allParams ? allParams[1].split(',').filter((p) => !!p) : undefined;\n if (expressions) {\n options.limit = 10000;\n return this.getTagsAutoComplete(expressions, undefined, options);\n }\n\n // If no tag-related query was found, perform metric-based search (using * as the wildcard for interpolation)\n let useExpand = query.match(/^expand\\((.*)\\)$/);\n query = useExpand ? useExpand[1] : query;\n\n interpolatedQuery = this.templateSrv.replace(\n query,\n getSearchFilterScopedVar({ query, wildcardChar: '*', options: optionalOptions })\n );\n\n let range;\n if (options.range) {\n range = {\n from: this.translateTime(options.range.from, false, options.timezone),\n until: this.translateTime(options.range.to, true, options.timezone),\n };\n }\n\n if (useExpand) {\n return this.requestMetricExpand(interpolatedQuery, options.requestId, range);\n } else {\n return this.requestMetricFind(interpolatedQuery, options.requestId, range);\n }\n }\n\n /**\n * Search for metrics matching giving pattern using /metrics/render endpoint.\n * It will return all possible values or names and parse them based on queryType.\n * For example:\n *\n * queryType: GraphiteQueryType.Value\n * query: groupByNode(movingAverage(apps.country.IE.counters.requests.count, 10), 2, 'sum')\n * result: 239.4, 233.4, 230.8, 230.4, 233.9, 238, 239.8, 236.8, 235.8\n *\n * queryType: GraphiteQueryType.MetricName\n * query: highestAverage(carbon.agents.*.*, 5)\n * result: carbon.agents.aa6338c54341-a.memUsage, carbon.agents.aa6338c54341-a.committedPoints, carbon.agents.aa6338c54341-a.updateOperations, carbon.agents.aa6338c54341-a.metricsReceived, carbon.agents.aa6338c54341-a.activeConnections\n */\n private async requestMetricRender(\n queryObject: GraphiteQuery,\n options: any,\n queryType: GraphiteQueryType\n ): Promise<MetricFindValue[]> {\n const requestId: string = options.requestId ?? `Q${this.requestCounter++}`;\n const range: TimeRange = options.range ?? {\n from: dateTime().subtract(6, 'hour'),\n to: dateTime(),\n raw: {\n from: 'now - 6h',\n to: 'now',\n },\n };\n const queryReq: DataQueryRequest<GraphiteQuery> = {\n app: 'graphite-variable-editor',\n interval: '1s',\n intervalMs: 10000,\n startTime: Date.now(),\n targets: [{ ...queryObject }],\n timezone: 'browser',\n scopedVars: {},\n requestId,\n range,\n };\n const data: DataQueryResponse = await lastValueFrom(this.query(queryReq));\n\n let result: MetricFindValue[];\n\n if (queryType === GraphiteQueryType.Value) {\n if (!data.data || data.data.length === 0) {\n return Promise.resolve([]);\n }\n result = data.data[0].fields[1].values\n .filter((f?: number) => !!f)\n .map((v: number) => ({\n text: v.toString(),\n value: v,\n expandable: false,\n }));\n } else if (queryType === GraphiteQueryType.MetricName) {\n result = data.data.map((series) => ({\n text: series.name,\n value: series.name,\n expandable: false,\n }));\n } else {\n result = [];\n }\n\n return Promise.resolve(result);\n }\n\n /**\n * Search for metrics matching giving pattern using /metrics/find endpoint. It will\n * return all possible values at the last level of the query, for example:\n *\n * metrics: prod.servers.001.cpu, prod.servers.002.cpu\n * query: *.servers.*\n * result: 001, 002\n *\n * For more complex searches use requestMetricExpand\n */\n private async requestMetricFind(\n query: string,\n requestId: string,\n range?: { from: string | number; until: string | number }\n ): Promise<MetricFindValue[]> {\n const params: BackendSrvRequest['params'] = {};\n\n if (range) {\n params.from = range.from;\n params.until = range.until;\n }\n\n if (config.featureToggles.graphiteBackendMode) {\n return await this.postResource<MetricFindValue[]>('metrics/find', {\n from: params.from ? (typeof params.from === 'string' ? params.from : `${params.from}`) : undefined,\n until: params.until ? (typeof params.until === 'string' ? params.until : `${params.until}`) : undefined,\n query,\n });\n }\n\n const httpOptions: BackendSrvRequest = {\n method: 'POST',\n url: '/metrics/find',\n params,\n data: `query=${query}`,\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n // for cancellations\n requestId: requestId,\n };\n\n return lastValueFrom(\n this.doGraphiteRequest(httpOptions).pipe(\n map((results: FetchResponse) => {\n return _map(results.data, (metric) => {\n return {\n text: metric.text,\n expandable: metric.expandable ? true : false,\n };\n });\n })\n )\n );\n }\n\n /**\n * Search for metrics matching giving pattern using /metrics/expand endpoint.\n * The result will contain all metrics (with full name) matching provided query.\n * It's a more flexible version of /metrics/find endpoint (@see requestMetricFind)\n */\n private async requestMetricExpand(\n query: string,\n requestId: string,\n range?: { from: string | number; until: string | number }\n ): Promise<MetricFindValue[]> {\n const params: BackendSrvRequest['params'] = { query };\n if (range) {\n params.from = range.from;\n params.until = range.until;\n }\n\n if (config.featureToggles.graphiteBackendMode) {\n const metrics = await this.postResource<MetricFindValue[]>('metrics/expand', {\n from: params.from ? (typeof params.from === 'string' ? params.from : `${params.from}`) : undefined,\n until: params.until ? (typeof params.until === 'string' ? params.until : `${params.until}`) : undefined,\n query,\n });\n return metrics.map((metric) => ({\n text: metric.text,\n expandable: false,\n }));\n }\n\n const httpOptions: BackendSrvRequest = {\n method: 'GET',\n url: '/metrics/expand',\n params,\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n // for cancellations\n requestId,\n };\n\n return lastValueFrom(\n this.doGraphiteRequest(httpOptions).pipe(\n map((results: FetchResponse) => {\n return _map(results.data.results, (metric) => {\n return {\n text: metric,\n expandable: false,\n };\n });\n })\n )\n );\n }\n\n async getTagsAutoComplete(expressions: string[], tagPrefix?: string, optionalOptions?: any) {\n const options = optionalOptions || {};\n const params: BackendSrvRequest['params'] = {\n expr: _map(expressions, (expression) => this.templateSrv.replace((expression || '').trim())),\n };\n\n if (tagPrefix) {\n params.tagPrefix = tagPrefix;\n }\n if (options.limit) {\n params.limit = options.limit;\n }\n if (options.range) {\n params.from = this.translateTime(options.range.from, false, options.timezone);\n params.until = this.translateTime(options.range.to, true, options.timezone);\n }\n\n if (config.featureToggles.graphiteBackendMode) {\n const tags = await this.postResource<string[]>('tags/autoComplete/tags', {\n from: typeof params.from === 'string' ? params.from : `${params.from}`,\n until: typeof params.until === 'string' ? params.until : `${params.until}`,\n tagPrefix,\n limit: options.limit,\n });\n return tags.map((tag) => ({\n text: tag,\n }));\n }\n\n const httpOptions: BackendSrvRequest = {\n method: 'GET',\n url: '/tags/autoComplete/tags',\n params,\n // for cancellations\n requestId: options.requestId,\n };\n\n return lastValueFrom(this.doGraphiteRequest(httpOptions).pipe(mapToTags()));\n }\n\n async getTagValuesAutoComplete(expressions: string[], tag: string, valuePrefix?: string, optionalOptions?: any) {\n const options = optionalOptions || {};\n const params: BackendSrvRequest['params'] = {\n expr: _map(expressions, (expression) => this.templateSrv.replace((expression || '').trim())),\n tag: this.templateSrv.replace((tag || '').trim()),\n };\n if (valuePrefix) {\n params.valuePrefix = valuePrefix;\n }\n if (options.limit) {\n params.limit = options.limit;\n }\n if (options.range) {\n params.from = this.translateTime(options.range.from, false, options.timezone);\n params.until = this.translateTime(options.range.to, true, options.timezone);\n }\n\n if (config.featureToggles.graphiteBackendMode) {\n const tagValues = await this.postResource<string[]>('tags/autoComplete/values', {\n from: typeof params.from === 'string' ? params.from : `${params.from}`,\n until: typeof params.until === 'string' ? params.until : `${params.until}`,\n expr: params.expr,\n tag: params.tag,\n valuePrefix,\n limit: options.limit,\n });\n return tagValues.map((tag) => ({\n text: tag,\n }));\n }\n\n const httpOptions: BackendSrvRequest = {\n method: 'GET',\n url: '/tags/autoComplete/values',\n params,\n // for cancellations\n requestId: options.requestId,\n };\n\n return lastValueFrom(this.doGraphiteRequest(httpOptions).pipe(mapToTags()));\n }\n\n async getVersion(optionalOptions: any) {\n const options = optionalOptions || {};\n\n const httpOptions = {\n method: 'GET',\n url: '/version',\n requestId: options.requestId,\n };\n\n if (config.featureToggles.graphiteBackendMode) {\n const version = await this.getResource<string>('version');\n const semver = new SemVer(version);\n return valid(semver) ? version : '';\n }\n\n return lastValueFrom(\n this.doGraphiteRequest(httpOptions).pipe(\n map((results: FetchResponse) => {\n if (results.data) {\n const semver = new SemVer(results.data);\n return valid(semver) ? results.data : '';\n }\n return '';\n }),\n catchError(() => {\n return of('');\n })\n )\n );\n }\n\n createFuncInstance(funcDef: string | FuncDef, options?: { withDefaultParams: boolean }): FuncInstance {\n return gfunc.createFuncInstance(funcDef, options, this.funcDefs);\n }\n\n getFuncDef(name: string) {\n return gfunc.getFuncDef(name, this.funcDefs);\n }\n\n waitForFuncDefsLoaded() {\n return this.getFuncDefs();\n }\n\n async getFuncDefs() {\n if (this.funcDefsPromise !== null) {\n return this.funcDefsPromise;\n }\n\n if (!supportsFunctionIndex(this.graphiteVersion)) {\n this.funcDefs = gfunc.getFuncDefs(this.graphiteVersion);\n this.funcDefsPromise = Promise.resolve(this.funcDefs);\n return this.funcDefsPromise;\n }\n\n const httpOptions = {\n method: 'GET',\n url: '/functions',\n // add responseType because if this is not defined,\n // backend_srv defaults to json\n responseType: 'text' as const,\n };\n\n if (config.featureToggles.graphiteBackendMode) {\n try {\n const functions = await this.getResource<string>('functions');\n this.funcDefs = gfunc.parseFuncDefs(functions);\n return this.funcDefs;\n } catch (error) {\n console.error('Fetching graphite functions error', error);\n this.funcDefs = gfunc.getFuncDefs(this.graphiteVersion);\n return this.funcDefs;\n }\n }\n\n return lastValueFrom(\n this.doGraphiteRequest(httpOptions).pipe(\n map((results: FetchResponse) => {\n // Fix for a Graphite bug: https://github.com/graphite-project/graphite-web/issues/2609\n // There is a fix for it https://github.com/graphite-project/graphite-web/pull/2612 but\n // it was merged to master in July 2020 but it has never been released (the last Graphite\n // release was 1.1.7 - March 2020). The bug was introduced in Graphite 1.1.7, in versions\n // 1.1.0 - 1.1.6 /functions endpoint returns a valid JSON\n const fixedData = JSON.parse(results.data.replace(/\"default\": ?Infinity/g, '\"default\": 1e9999'));\n this.funcDefs = gfunc.parseFuncDefs(fixedData);\n return this.funcDefs;\n }),\n catchError((error) => {\n console.error('Fetching graphite functions error', error);\n this.funcDefs = gfunc.getFuncDefs(this.graphiteVersion);\n return of(this.funcDefs);\n })\n )\n );\n }\n\n testDatasource() {\n if (config.featureToggles.graphiteBackendMode) {\n return super.testDatasource();\n }\n const query: DataQueryRequest<GraphiteQuery> = {\n app: 'graphite',\n interval: '10ms',\n intervalMs: 10,\n requestId: 'reqId',\n scopedVars: {},\n startTime: 0,\n timezone: 'browser',\n panelId: 3,\n rangeRaw: { from: 'now-1h', to: 'now' },\n range: {\n from: dateTime('now-1h'),\n to: dateTime('now'),\n raw: { from: 'now-1h', to: 'now' },\n },\n targets: [{ refId: 'A', target: 'constantLine(100)' }],\n maxDataPoints: 300,\n };\n\n return lastValueFrom(this.query(query)).then(() => ({ status: 'success', message: 'Data source is working' }));\n }\n\n doGraphiteRequest<T>(\n options: BackendSrvRequest & {\n inspect?: any;\n }\n ) {\n if (this.basicAuth || this.withCredentials) {\n options.withCredentials = true;\n }\n if (this.basicAuth) {\n options.headers = options.headers || {};\n options.headers.Authorization = this.basicAuth;\n }\n\n options.url = this.url + options.url;\n options.inspect = { type: 'graphite' };\n\n return getBackendSrv()\n .fetch<T>(options)\n .pipe(\n catchError((err) => {\n return throwError(() => {\n const reduced = reduceError(err);\n return new Error(`${reduced.data.message}`);\n });\n })\n );\n }\n\n // Can be removed when the frontend query path is removed\n buildGraphiteParams(options: any, originalTargetMap: { [key: string]: string }, scopedVars?: ScopedVars): string[] {\n const graphiteOptions = ['from', 'until', 'rawData', 'format', 'maxDataPoints', 'cacheTimeout'];\n const cleanOptions = [],\n targets: Record<string, string> = {};\n let target: GraphiteQuery, targetValue, i;\n const intervalFormatFixRegex = /'(\\d+)m'/gi;\n let hasTargets = false;\n\n options['format'] = 'json';\n\n function fixIntervalFormat(match: string) {\n return match.replace('m', 'min').replace('M', 'mon');\n }\n\n for (i = 0; i < options.targets.length; i++) {\n target = options.targets[i];\n if (!target.target) {\n continue;\n }\n\n if (!target.refId) {\n target.refId = this._seriesRefLetters[i];\n }\n\n targetValue = this.templateSrv.replace(target.target, scopedVars);\n targetValue = targetValue.replace(intervalFormatFixRegex, fixIntervalFormat);\n targets[target.refId] = targetValue;\n }\n\n const regex = /\\#([A-Z])/g;\n\n function nestedSeriesRegexReplacer(match: string, g1: string) {\n // Handle the case where a query references itself to prevent infinite recursion\n if (target.refId === g1) {\n return targets[g1] || match;\n }\n\n // Recursively replace all nested series references\n return originalTargetMap[g1].replace(regex, nestedSeriesRegexReplacer) || match;\n }\n\n for (i = 0; i < options.targets.length; i++) {\n target = options.targets[i];\n if (!target.target) {\n continue;\n }\n\n targetValue = targets[target.refId];\n targetValue = this.templateSrv.replace(targetValue.replace(regex, nestedSeriesRegexReplacer), scopedVars);\n targets[target.refId] = targetValue;\n\n if (!target.hide) {\n hasTargets = true;\n cleanOptions.push('target=' + encodeURIComponent(targetValue));\n }\n }\n\n each(options, (value, key) => {\n if (indexOf(graphiteOptions, key) === -1) {\n return;\n }\n if (value) {\n cleanOptions.push(key + '=' + encodeURIComponent(value));\n }\n });\n\n if (!hasTargets) {\n return [];\n }\n\n return cleanOptions;\n }\n}\n\nfunction supportsTags(version: string): boolean {\n const fullVersion = coerce(version);\n if (!fullVersion) {\n return false;\n }\n return gte(fullVersion, '1.1.0');\n}\n\nfunction supportsFunctionIndex(version: string): boolean {\n const fullVersion = coerce(version);\n if (!fullVersion) {\n return false;\n }\n return gte(fullVersion, '1.1.0');\n}\n\nfunction mapToTags(): OperatorFunction<FetchResponse, Array<{ text: string }>> {\n return pipe(\n map((results) => {\n if (results.data) {\n return _map(results.data, (value) => {\n return { text: value };\n });\n } else {\n return [];\n }\n })\n );\n}\n","import { DataSourcePlugin } from '@grafana/data';\n\nimport { GraphiteQueryEditor } from './components/GraphiteQueryEditor';\nimport { GraphiteVariableEditor } from './components/GraphiteVariableEditor';\nimport { MetricTankMetaInspector } from './components/MetricTankMetaInspector';\nimport { ConfigEditor } from './configuration/ConfigEditor';\nimport { GraphiteDatasource } from './datasource';\n\nexport const plugin = new DataSourcePlugin(GraphiteDatasource)\n .setQueryEditor(GraphiteQueryEditor)\n .setConfigEditor(ConfigEditor)\n .setVariableQueryEditor(GraphiteVariableEditor)\n .setMetadataInspector(MetricTankMetaInspector);\n"],"names":["outside","module","exports","version","range","options","constructor","this","max","map","Map","get","key","value","undefined","delete","set","size","firstKey","keys","next","Range","er","r1","r2","intersects","SemVer","parse","safeRe","re","t","String","match","rtl","coerceRtlRegex","includePrerelease","COERCERTLFULL","COERCERTL","exec","index","length","lastIndex","COERCEFULL","COERCE","major","minor","patch","prerelease","build","internalRe","constants","identifiers","valid","clean","inc","diff","compare","rcompare","compareLoose","compareBuild","sort","rsort","gt","lt","eq","neq","gte","lte","cmp","coerce","Comparator","satisfies","toComparators","maxSatisfying","minSatisfying","minVersion","validRange","gtr","ltr","simplifyRange","subset","src","tokens","SEMVER_SPEC_VERSION","RELEASE_TYPES","compareIdentifiers","rcompareIdentifiers","a","loose","debug","process","env","NODE_DEBUG","test","args","console","error","list","b","__WEBPACK_EXTERNAL_MODULE__1269__","__WEBPACK_EXTERNAL_MODULE__1308__","numeric","anum","bnum","__WEBPACK_EXTERNAL_MODULE__2007__","ANY","minimumVersionWithPreRelease","minimumVersion","simpleSubset","sub","dom","semver","eqSet","Set","gtltComp","higher","lower","hasDomLT","hasDomGT","c","operator","higherGT","lowerLT","add","needDomLTPre","needDomGTPre","comp","sawNonNull","OUTER","simpleSub","simpleDom","isSub","MAX_SAFE_INTEGER","Number","MAX_LENGTH","MAX_SAFE_COMPONENT_LENGTH","MAX_SAFE_BUILD_LENGTH","FLAG_INCLUDE_PRERELEASE","FLAG_LOOSE","versions","min","minSV","rangeObj","forEach","v","__WEBPACK_EXTERNAL_MODULE__2468__","release","identifier","identifierBase","SPACE_CHARACTERS","parseOptions","raw","formatted","trim","replace","split","r","parseRange","filter","TypeError","first","isNullSet","isAny","i","comps","k","toString","format","memoKey","cached","cache","hr","HYPHENRANGELOOSE","HYPHENRANGE","hyphenReplace","COMPARATORTRIM","comparatorTrimReplace","TILDETRIM","tildeTrimReplace","CARETTRIM","caretTrimReplace","rangeList","parseComparator","join","replaceGTE0","COMPARATORLOOSE","rangeMap","comparators","has","result","values","some","thisComparators","isSatisfiable","rangeComparators","every","thisComparator","rangeComparator","testSet","remainingComparators","slice","testComparator","pop","otherComparator","BUILD","replaceCarets","replaceTildes","replaceXRanges","replaceStars","isX","id","toLowerCase","replaceTilde","TILDELOOSE","TILDE","_","M","m","p","pr","ret","replaceCaret","CARETLOOSE","CARET","z","replaceXRange","XRANGELOOSE","XRANGE","gtlt","xM","xm","xp","anyX","STAR","GTE0PRE","GTE0","incPr","$0","from","fM","fm","fp","fpr","fb","to","tM","tm","tp","tpr","allowed","__WEBPACK_EXTERNAL_MODULE__3059__","__WEBPACK_EXTERNAL_MODULE__3241__","throwErrors","LOOSE","FULL","num","other","compareMain","comparePre","startsWith","Error","PRERELEASELOOSE","PRERELEASE","base","push","isNaN","version1","version2","v1","v2","comparison","v1Higher","highVersion","lowVersion","highHasPre","prefix","op","safeSrc","R","LETTERDASHNUMBER","safeRegexReplacements","createToken","name","isGlobal","safe","token","makeSafeRegex","RegExp","NUMERICIDENTIFIER","NUMERICIDENTIFIERLOOSE","NONNUMERICIDENTIFIER","PRERELEASEIDENTIFIER","PRERELEASEIDENTIFIERLOOSE","BUILDIDENTIFIER","MAINVERSION","FULLPLAIN","MAINVERSIONLOOSE","LOOSEPLAIN","XRANGEIDENTIFIER","XRANGEIDENTIFIERLOOSE","GTLT","XRANGEPLAIN","XRANGEPLAINLOOSE","COERCEPLAIN","LONETILDE","LONECARET","__WEBPACK_EXTERNAL_MODULE__5959__","__WEBPACK_EXTERNAL_MODULE__6089__","parsed","maxSV","minver","setMin","comparator","compver","versionA","versionB","__WEBPACK_EXTERNAL_MODULE__7694__","hilo","gtfn","ltefn","ltfn","ecomp","high","low","__WEBPACK_EXTERNAL_MODULE__7781__","f","Symbol","for","l","Object","prototype","hasOwnProperty","n","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","ReactCurrentOwner","ref","__self","__source","q","g","d","e","h","call","defaultProps","$$typeof","type","props","_owner","current","Fragment","jsx","jsxs","prev","ranges","simplified","original","__WEBPACK_EXTERNAL_MODULE__8531__","s","COMPARATOR","includes","looseOption","freeze","emptyOpts","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","__esModule","definition","o","defineProperty","enumerable","obj","prop","toStringTag","lastIndexOf","window","__REDUX_DEVTOOLS_EXTENSION_COMPOSE__","__REDUX_DEVTOOLS_EXTENSION__","createAction","prepareAction","actionCreator","prepared","formatProdErrorMessage","payload","meta","action","isAction","species","assign","code","init","timeRangeChanged","queriesChanged","queryChanged","segmentValueChanged","addNewTag","actions","tagChanged","unpause","addFunction","removeFunction","moveFunction","updateFunctionParam","updateQuery","runQuery","toggleEditorMode","unicodeLetterTable","identifierStartTable","identifierPartTable","Lexer","peek","input","charAt","skip","char","tokenize","scanStringLiteral","scanPunctuator","scanNumericLiteral","scanIdentifier","scanTemplateSequence","pos","isUnicodeLetter","isHexDigit","str","readUnicodeEscapeSequence","bind","ch1","ch2","ch3","ch4","parseInt","getIdentifierStart","chr","charCodeAt","getIdentifierPart","bad","isDecimalDigit","isOctalDigit","isIdentifierStart","ch","isMalformed","isPunctuator","isFinite","quote","isUnclosed","jump","expression","Parser","getAst","start","functionCall","metricExpression","isGraphiteParserError","message","curlyBraceSegment","curlySegment","consumeToken","errorMark","metricSegment","curly","tokenValue","parts","splice","node","segments","segment","params","functionParameters","boolExpression","param","numericLiteral","seriesRefExpression","stringLiteral","concat","parseFloat","text","currentToken","lexer","matchToken","token1","token2","GraphiteQuery","parseTarget","functions","tags","seriesByTagUsed","target","textEditor","astNode","parseTargetRecursive","oldQuery","newQuery","generateQueryString","sanitizeQuery","oldSanitized","newSanitized","err","checkOtherSegmentsIndex","getSegmentPathUpTo","arr","reduce","func","innerFunc","datasource","createFuncInstance","withDefaultParams","count","stringParams","acc","idx","paramsArr","handleMultipleSeriesByTagsParams","functionString","nestedFunctionsToString","handleDivideSeriesListsNestedFunctions","each","updateText","def","hidden","splitSeriesByTagParams","getSeriesByTagFuncIndex","addFunctionParameter","updateSegmentValue","addSelectMetricSegment","newFunc","last","without","offset","indexOf","array","fromIndex","toIndex","metricPath","render","templateSrv","scopedVars","updateModelTarget","targets","updateRenderedTarget","refId","added","targetsByRefId","keyBy","nestedSeriesRefRegex","targetWithNestedQueries","regex","refCount","t2","id2","refMatches","updated","g1","targetFull","tagPattern","flatten","matches","tag","findIndex","getSeriesByTagFunc","seriesByTagFuncIndex","addTag","newTagParam","renderTagString","removeTag","updateTag","tagIndex","removeTagValue","funcToRemove","renderTagExpressions","excludeIndex","compact","tagExpr","paramsLength","innerNode","switchCase","GRAPHITE_TAG_OPERATORS","TAG_PREFIX","state","queryModel","buildSegments","modifyLastSegment","clone","checkOtherSegments","fake","currentFromIndex","path","metricFindQuery","expandable","handleMetricsAutoCompleteError","emptySegments","handleTargetChanged","oldTargetRemovedSpaces","queries","query","paused","refresh","metricAutoCompleteErrorShown","getAppEvents","publish","AppEvents","alertError","handleTagsAutoCompleteError","tagsAutoCompleteErrorShown","reducer","deps","waitForFuncDefsLoaded","supportsTags","funcDefs","segmentOrString","segmentIndex","pause","tagParam","addSeriesByTagFunc","spliceSegments","newTag","smartlyHandleNewAliasByNode","updateParam","DispatchContext","createContext","GraphiteStateContext","useDispatch","useContext","GraphiteQueryEditorContext","onRunQuery","onChange","children","setState","useState","needsRefresh","setNeedsRefresh","dispatch","useMemo","createStore","previousRange","useRef","useEffect","usePrevious","JSON","stringify","Provider","getTemplateSrv","GraphiteQueryType","GraphiteType","mapStringsToSelectables","label","mapSegmentsToSelectables","createEditableParam","paramDef","additional","optional","multiple","option","convertToGraphiteQueryObject","queryType","Default","AddGraphiteFunction","setValue","styles","useStyles2","getStyles","categories","funcDef","category","sortBy","mapFuncDefsToSelectables","div","Segment","Component","Button","icon","variant","className","cx","button","aria-label","inputMinWidth","theme","css","marginRight","spacing","FunctionDescription","lazy","default","description","FunctionHelpButton","tooltip","Suspense","fallback","span","Tooltip","content","placement","Icon","onClick","open","FunctionEditorControls","onMoveLeft","onMoveRight","onRemove","style","display","width","justifyContent","fontWeight","typography","fontWeightMedium","fontSize","bodySmall","cursor","overflowWrap","height","FunctionEditor","unknown","TooltipContent","interactive","data-testid","updatePopperPosition","memo","TextLink","external","href","FunctionParamEditor","editableParam","onExpandedChange","autofocus","inputPlaceholder","placeholder","allowCustomValue","allowEmptyValue","SegmentInput","paddingTop","marginTop","paddingLeft","minWidth","displayName","margin","padding","GraphiteFunctionEditor","mouseOver","setIsMouseOver","expanded","setIsExpanded","mapFuncInstanceToParams","container","onBlur","onFocus","onMouseOver","onMouseOut","Stack","gap","alignItems","InlineLabel","backgroundColor","colors","background","secondary","borderRadius","shape","radius","formInputHeight","border","main","FunctionsSection","SegmentSection","fill","GraphiteTextEditor","rawQuery","useCallback","QueryField","portalOrigin","MAX_SUGGESTIONS","getAltSegments","requestId","altSegments","eachRight","unshift","getVariables","variable","remove","removeTaggedEntry","tagSegments","getTagsAsSegments","addAltTagSegments","getTagsSelectables","tagPrefix","tagExpressions","getTagsAutoComplete","limit","altTags","getTags","tagsAsSegments","val","getTagValuesSelectables","valuePrefix","tagKey","getTagValuesAutoComplete","altValues","getTagValues","MetricSegment","metricIndex","loadOptions","getAltSegmentsSelectables","debouncedLoadOptions","debounce","leading","onSegmentChanged","selectableValue","onSegmentChangedDebounced","SegmentAsync","reloadOptionsOnChange","MetricsSection","PlayButton","TagEditor","getTagsOptions","inputValue","debouncedGetTagsOptions","getTagValueOptions","debouncedGetTagValueOptions","TagsSection","getTagsAsSegmentsOptions","getTagsAsSegmentsSelectables","debouncedGetTagsAsSegments","SeriesSection","sectionContent","GraphiteQueryEditorContent","visualEditor","toggleButton","flexGrow","marginLeft","GRAPHITE_QUERY_VARIABLE_TYPE_OPTIONS","Value","MetricName","toInteger","toBooleanOrTimestamp","getRollupNotice","metaList","archiveIndex","parseSchemaRetentions","interval","severity","inspect","getRuntimeConsolidationNotice","runtimeNr","spec","vals","retention","chunkspan","numchunks","ready","MetricTankMetaInspector","PureComponent","renderMeta","buckets","rollupNotice","runtimeNotice","normFunc","totalSeconds","bucket","rangeUtil","intervalToSeconds","metaItem","metaItemHeader","metaItemBody","step","stepHeading","stepDescription","lengthPercent","isActive","bucketInterval","bucketRetention","bucketRetentionActive","data","seriesMetas","series","seriesMetaList","custom","h2","stylesFactory","config","borderColor","isDark","palette","gray25","gray85","dark1","white","headerBg","gray15","marginBottom","md","xs","sm","color","textWeak","lg","blue85","blue95","textAlign","greenBase","greenShade","GRAPHITE_VERSIONS","DEFAULT_GRAPHITE_VERSION","MappingsHelp","Alert","title","onDismiss","table","thead","tr","th","tbody","td","u","MappingsConfiguration","mappings","setMappings","h3","showHelp","onRestoreHelp","Box","mapping","InlineFieldRow","InlineField","Input","changeEvent","newMappings","fromString","matchers","metricNode","endsWith","labelName","matcher","SHOW_MAPPINGS_HELP_KEY","graphiteVersions","graphiteTypes","entries","ConfigEditor","componentDidMount","updateDatasourcePluginJsonDataOption","currentGraphiteVersion","onOptionsChange","currentVersion","find","item","access","DataSourceHttpSettings","defaultUrl","dataSourceConfig","secureSocksDSProxyEnabled","FieldSet","legend","Field","Select","onUpdateDatasourceJsonDataOptionSelect","jsonData","graphiteType","Metrictank","Switch","rollupIndicatorEnabled","onUpdateDatasourceJsonDataOptionChecked","importConfiguration","loki","showMappingsHelp","store","setObject","graphiteVersion","super","getObject","AnnotationEditor","setTarget","setTags","updateValue","fromAnnotations","labelWidth","grow","currentTarget","h5","heading","TagsInput","tagsInput","body","addFuncDef","defaultParams","shortName","optionalSeriesRefArgs","isVersionRelatedFunction","fullVersion","FuncInstance","metricExp","replaceVariables","parameters","paramType","valueInterpolated","isString","_hasMultipleParamsInString","strValue","partVal","getFuncDef","getFuncDefs","funcs","parseFuncDefs","rawDefs","funcName","group","required","shift","rawParam","Infinity","suggestions","prepareAnnotation","json","resultingTarget","migrateLegacyAnnotation","GRAPHITE_TAG_COMPARATORS","AbstractLabelOperator","Equal","NotEqual","EqualRegEx","NotEqualRegEx","GraphiteDatasource","DataSourceWithBackend","getQueryOptionsInfo","maxDataPoints","cacheTimeout","links","url","getImportQueryConfiguration","metricMappings","exportToAbstractQueries","exportToAbstractQuery","graphiteQuery","GraphiteQueryModel","labels","targetNodes","converted","labelMatchers","filterQuery","applyTemplateVariables","frontendQuery","originalTargetMap","formattedRefIdsMap","graphOptions","translateTime","timezone","until","buildGraphiteParams","of","isMetricTank","httpOptions","method","headers","addTracingHeaders","panelId","doGraphiteRequest","pipe","convertResponseToDataFrames","backendBuildGraphiteQueries","referenceTargets","finalTargets","targetValue","_seriesRefLetters","seriesReferenceRegex","nestedSeriesRegexReplacer","targetClone","hide","streams","Observable","subscriber","annotationEvents","then","events","toDataFrame","catch","ex","finally","complete","merge","formattedRefId","replaceAll","featureToggles","graphiteBackendMode","updatedTarget","graphiteQueries","proxyMode","dashboardUID","panelPluginId","getRequestStats","stats","unit","parseTags","tagString","interpolateVariablesInQueries","expandedQueries","getRef","lastValueFrom","y","time","fields","annotation","results","isArray","when","what","postResource","tagsQueryParam","Promise","reject","targetContainsTemplate","containsTemplate","date","roundUp","parsedDate","substring","dateMath","toDateTime","isValid","moment","toDate","parseDate","subtract","unix","findQuery","optionalOptions","queryObject","requestMetricRender","interpolatedQuery","getSearchFilterScopedVar","wildcardChar","allParams","expressions","useExpand","requestMetricExpand","requestMetricFind","requestCounter","dateTime","queryReq","app","intervalMs","startTime","Date","now","resolve","_map","metric","expr","mapToTags","getVersion","getResource","catchError","gfunc","funcDefsPromise","supportsFunctionIndex","responseType","fixedData","testDatasource","rangeRaw","status","basicAuth","withCredentials","Authorization","getBackendSrv","fetch","throwError","reduced","newMessage","reduceError","graphiteOptions","cleanOptions","intervalFormatFixRegex","hasTargets","fixIntervalFormat","encodeURIComponent","instanceSettings","refIdMap","splitTarget","datapoints","frame","requestMetaList","notices","annotations","QueryEditor","plugin","DataSourcePlugin","setQueryEditor","setConfigEditor","setVariableQueryEditor","setMetadataInspector"],"sourceRoot":""}
.
Edit
..
Edit
CHANGELOG.md
Edit
LICENSE
Edit
README.md
Edit
dashboards
Edit
img
Edit
module.js
Edit
module.js.LICENSE.txt
Edit
module.js.map
Edit
plugin.json
Edit