{"version":3,"file":"static/js/main.cb24e665.js","mappings":"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1B,KAAM,GACNC,KAAM,GACNC,KAAM,GACNC,KAAM,GACNC,KAAM,GACNC,KAAM,GACNC,KAAM,GACNC,KAAM,GACNC,KAAM,GACNC,KAAM,GACNC,KAAM,GACNC,KAAM,GACNC,KAAM,GACNC,KAAM,GACNl3B,KAAM,GACN,OAAQ,GACRm3B,KAAM,GACN,OAAQ,GACRC,KAAM,GACNC,KAAM,GACNC,KAAM,GACNC,KAAM,GACNC,KAAM,GACNC,KAAM,GACNC,KAAM,GACNC,KAAM,GACNC,KAAM,GACNC,KAAM,GACNC,KAAM,GACNC,KAAM,GACNC,KAAM,GACNC,KAAM,GACNC,KAAM,GACNC,KAAM,GACNC,KAAM,GACNC,KAAM,GACNC,KAAM,IAIEziD,EAAIugD,MACRvgD,EAAIugD,MAAMtjD,eAAemQ,KAC3BpN,EAAIugD,MAAMnzC,GAAK,CACbA,EAAE0S,WAAW,GACb1S,EAAE0S,WAAW,GACb1S,EAAE0S,WAAW,GACb1S,EAAE0S,WAAW,KAKnB,IAAM7S,EAAY,IAAI0J,WAAW,CAC/B,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,IACA,IACA,IACA,IACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,IACA,IACA,IACA,IACA,GACA,GACA,IACA,IACA,IACA,IACA,IACA,IAGIra,EAAY,IAAIqa,WAAW,CAC/B,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,IACA,IACA,IACA,IACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,IACA,IACA,IACA,IACA,GACA,GACA,IACA,IACA,IACA,IACA,IACA,IAGF3W,EAAI0iD,WAAa,CACfnmC,MAAOtP,EACPqP,MAAOhgB,GAGT,IAAMqH,EAAO,IAAIgT,WAAW,CAC1B,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,IACA,IACA,IACA,GACA,EACA,EACA,EACA,IAGIza,EAAO,IAAIya,WAAW,CAC1B,EACA,EACA,EACA,EACA,EACA,EACA,EACA,IAGF3W,EAAI2iD,KAAO3iD,EAAI4iD,KAAO5iD,EAAI6iD,KAAO3mD,EAEjC8D,EAAI8iD,KAAO,IAAInsC,WAAW,CACxB,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,IAEF3W,EAAI+iD,KAAO,IAAIpsC,WAAW,CACxB,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,IAEF3W,EAAIgjD,KAAO,IAAIrsC,WAAW,CACxB,EACA,EACA,EACA,EACA,EACA,EACA,EACA,IAGF3W,EAAIijD,KAAO,IAAItsC,WAAW,CACxB,EACA,EACA,EACA,EACA,EACA,EACA,EACA,IAGF,IAAMzJ,EAAa,IAAIyJ,WAAW,CAAC,IAAK,IAAK,IAAK,MAC5C9I,EAAY,IAAI8I,WAAW,CAAC,GAAI,IAAK,GAAI,KACzClT,EAAe,IAAIkT,WAAW,CAAC,EAAG,EAAG,EAAG,IAE9C3W,EAAIkjD,KAAOljD,EAAImjD,IACbnjD,EAAIugD,MAAMM,KACV3zC,EACAzJ,EACAyJ,EACAW,GAEF7N,EAAIojD,KAAOpjD,EAAImjD,IAAInjD,EAAIugD,MAAMG,KAAM1gD,EAAImjD,IAAInjD,EAAIugD,MAAMI,KAAMh9C,GAAA,EAC5D3D,EAEMmjD,IAAP,SAAWnjD,GACI,IAAb,IAAIoN,EAAO,EAAEH,EAAA3O,UAAAjC,OADKC,EAAA,IAAOE,MAAAyQ,EAAA,EAAAA,EAAA,KAAAtJ,EAAA,EAAAA,EAAAsJ,EAAAtJ,IAAPrH,EAAOqH,EAAA,GAAArF,UAAAqF,GAKzB,IAHA,IAAIzH,EAAII,EAAQD,OACV6Q,EAAMhR,EAELA,KACLkR,GAAQ9Q,EAAQJ,GAAGqlB,WAGrB,IAAM1T,EAAS,IAAI8I,WAAWvJ,GAO9B,IANAS,EAAO,GAAMT,GAAQ,GAAM,IAC3BS,EAAO,GAAMT,GAAQ,GAAM,IAC3BS,EAAO,GAAMT,GAAQ,EAAK,IAC1BS,EAAO,GAAY,IAAPT,EACZS,EAAOgM,IAAI7Z,EAAM,GAEZ9D,EAAI,EAAGkR,EAAO,EAAGlR,EAAIgR,EAAKhR,IAE7B2R,EAAOgM,IAAIvd,EAAQJ,GAAIkR,GACvBA,GAAQ9Q,EAAQJ,GAAGqlB,WAErB,OAAO1T,CAAA,EACR7N,EAEM8gD,KAAP,SAAY1zC,GACV,OAAOpN,EAAImjD,IAAInjD,EAAIugD,MAAMO,KAAM9gD,EAAI0iD,WAAWt1C,GAAA,EAC/CpN,EAEM+gD,KAAP,SAAY3zC,GACV,OAAOpN,EAAImjD,IAAInjD,EAAIugD,MAAMQ,KAAM3zC,EAAA,EAChCpN,EAEMghD,KAAP,SAAY5zC,EAAWH,GACrBA,GAAYG,EACZ,IAAM9Q,EAAoBsS,KAAK2Q,MAAMtS,GAAYmzC,GAAa,IACxDz8C,EAAoBiL,KAAK2Q,MAAMtS,GAAYmzC,GAAa,IAC9D,OAAOpgD,EAAImjD,IACTnjD,EAAIugD,MAAMS,KACV,IAAIrqC,WAAW,CACb,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACCvJ,GAAa,GAAM,IACnBA,GAAa,GAAM,IACnBA,GAAa,EAAK,IACP,IAAZA,EACA9Q,GAAqB,GACpBA,GAAqB,GAAM,IAC3BA,GAAqB,EAAK,IACP,IAApBA,EACAqH,GAAqB,GACpBA,GAAqB,GAAM,IAC3BA,GAAqB,EAAK,IACP,IAApBA,EACA,GACA,IACA,EACA,MAGL3D,EAEMihD,KAAP,SAAY7zC,GACV,OAAOpN,EAAImjD,IACTnjD,EAAIugD,MAAMU,KACVjhD,EAAIghD,KAAK5zC,EAAMuX,UAAWvX,EAAM4K,UAChChY,EAAI8gD,KAAK1zC,EAAMnP,MACf+B,EAAImhD,KAAK/zC,GAAA,EAEZpN,EAEMkhD,KAAP,SAAY9zC,GACV,OAAOpN,EAAImjD,IACTnjD,EAAIugD,MAAMW,KACV,IAAIvqC,WAAW,CACb,EACA,EACA,EACA,EACAvJ,GAAkB,GACjBA,GAAkB,GAAM,IACxBA,GAAkB,EAAK,IACP,IAAjBA,IAAA,EAGLpN,EAEMmhD,KAAP,SAAY/zC,GACV,MAAmB,UAAfA,EAAMnP,KACD+B,EAAImjD,IACTnjD,EAAIugD,MAAMY,KACVnhD,EAAImjD,IAAInjD,EAAIugD,MAAMkC,KAAMziD,EAAIgjD,MAC5BhjD,EAAIojD,KACJpjD,EAAI2hD,KAAKv0C,IAGJpN,EAAImjD,IACTnjD,EAAIugD,MAAMY,KACVnhD,EAAImjD,IAAInjD,EAAIugD,MAAMiC,KAAMxiD,EAAI+iD,MAC5B/iD,EAAIojD,KACJpjD,EAAI2hD,KAAKv0C,GAAA,EAGdpN,EAEMohD,KAAP,SAAYh0C,EAAIH,EAAqB3Q,GACnC,OAAO0D,EAAImjD,IACTnjD,EAAIugD,MAAMa,KACVphD,EAAIkhD,KAAK9zC,GACTpN,EAAImiD,KAAK7lD,EAAO2Q,GAAA,EAEnBjN,EAEMqhD,KAAP,SAAYj0C,GAIV,IAHA,IAAIH,EAAIG,EAAO/Q,OACTC,EAAsB,GAErB2Q,KACL3Q,EAAM2Q,GAAKjN,EAAIoiD,KAAKh1C,EAAOH,IAG7B,OAAOjN,EAAImjD,IAAIzhC,MACb,KACA,CAAC1hB,EAAIugD,MAAMc,KAAMrhD,EAAIwhD,KAAKp0C,EAAO,GAAGuX,UAAWvX,EAAO,GAAG4K,WACtDpY,OAAOtD,GACPsD,OAAOI,EAAIuhD,KAAKn0C,IAAA,EAEtBpN,EAEMuhD,KAAP,SAAYn0C,GAIV,IAHA,IAAIH,EAAIG,EAAO/Q,OACTC,EAAsB,GAErB2Q,KACL3Q,EAAM2Q,GAAKjN,EAAIsiD,KAAKl1C,EAAOH,IAG7B,OAAOjN,EAAImjD,IAAIzhC,MAAM,KAAO,CAAA1hB,EAAIugD,MAAMgB,MAAI3hD,OAAKtD,GAAA,EAChD0D,EAEMwhD,KAAP,SAAYp0C,EAAWH,GACrBA,GAAYG,EACZ,IAAM9Q,EAAoBsS,KAAK2Q,MAAMtS,GAAYmzC,GAAa,IACxDz8C,EAAoBiL,KAAK2Q,MAAMtS,GAAYmzC,GAAa,IACxDlkD,EAAQ,IAAIya,WAAW,CAC3B,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACCvJ,GAAa,GAAM,IACnBA,GAAa,GAAM,IACnBA,GAAa,EAAK,IACP,IAAZA,EACA9Q,GAAqB,GACpBA,GAAqB,GAAM,IAC3BA,GAAqB,EAAK,IACP,IAApBA,EACAqH,GAAqB,GACpBA,GAAqB,GAAM,IAC3BA,GAAqB,EAAK,IACP,IAApBA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,IACA,IACA,IACA,MAEF,OAAO3D,EAAImjD,IAAInjD,EAAIugD,MAAMiB,KAAMtlD,EAAA,EAChC8D,EAEM0hD,KAAP,SAAYt0C,GACV,IAEIH,EACA3Q,EAHEqH,EAAUyJ,EAAMwY,SAAW,GAC3B1pB,EAAQ,IAAIya,WAAW,EAAIhT,EAAQtH,QAKzC,IAAK4Q,EAAI,EAAGA,EAAItJ,EAAQtH,OAAQ4Q,IAC9B3Q,EAAQqH,EAAQsJ,GAAGrQ,MACnBV,EAAM+Q,EAAI,GACP3Q,EAAM+mD,WAAa,EACnB/mD,EAAMgnD,cAAgB,EACvBhnD,EAAMinD,cAGV,OAAOvjD,EAAImjD,IAAInjD,EAAIugD,MAAMmB,KAAMxlD,EAAA,EAChC8D,EAEM2hD,KAAP,SAAYv0C,GACV,OAAOpN,EAAImjD,IACTnjD,EAAIugD,MAAMoB,KACV3hD,EAAI8hD,KAAK10C,GACTpN,EAAImjD,IAAInjD,EAAIugD,MAAMyB,KAAMhiD,EAAI2iD,MAC5B3iD,EAAImjD,IAAInjD,EAAIugD,MAAMsB,KAAM7hD,EAAI4iD,MAC5B5iD,EAAImjD,IAAInjD,EAAIugD,MAAMwB,KAAM/hD,EAAI8iD,MAC5B9iD,EAAImjD,IAAInjD,EAAIugD,MAAMqB,KAAM5hD,EAAI6iD,MAAA,EAE/B7iD,EAEM8qB,KAAP,SAAY1d,GACV,IAEIH,EACA3Q,EACAqH,EAJAzH,EAAgB,GAChBgR,EAAgB,GAMpB,IAAKD,EAAI,EAAGA,EAAIG,EAAMgwC,IAAI/gD,OAAQ4Q,IAEhCtJ,GADArH,EAAO8Q,EAAMgwC,IAAInwC,IACNsU,WACXrlB,EAAI6kB,KAAMpd,IAAQ,EAAK,KACvBzH,EAAI6kB,KAAW,IAANpd,GAGTzH,EAAMA,EAAI0D,OAAOpD,MAAMO,UAAU2Z,MAAMxZ,KAAKZ,IAI9C,IAAK2Q,EAAI,EAAGA,EAAIG,EAAMiwC,IAAIhhD,OAAQ4Q,IAEhCtJ,GADArH,EAAO8Q,EAAMiwC,IAAIpwC,IACNsU,WACXrU,EAAI6T,KAAMpd,IAAQ,EAAK,KACvBuJ,EAAI6T,KAAW,IAANpd,GAETuJ,EAAMA,EAAItN,OAAOpD,MAAMO,UAAU2Z,MAAMxZ,KAAKZ,IAG9C,IAAMuR,EAAO7N,EAAImjD,IACfnjD,EAAIugD,MAAMC,KACV,IAAI7pC,WACF,CACE,EACAza,EAAI,GACJA,EAAI,GACJA,EAAI,GACJ,IACA,IAAOkR,EAAMgwC,IAAI/gD,QAEhBuD,OAAO1D,GACP0D,OAAO,CACNwN,EAAMiwC,IAAIhhD,SAEXuD,OAAOsN,KAGRzJ,EAAQ2J,EAAM/H,MACd2I,EAASZ,EAAM9H,OACfhB,EAAW8I,EAAM0vC,WAAW,GAC5Bz4C,EAAW+I,EAAM0vC,WAAW,GAElC,OAAO98C,EAAImjD,IACTnjD,EAAIugD,MAAMz1B,KACV,IAAInU,WAAW,CACb,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACClT,GAAS,EAAK,IACP,IAARA,EACCuK,GAAU,EAAK,IACP,IAATA,EACA,EACA,GACA,EACA,EACA,EACA,GACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,IACA,GACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,GACA,IACA,IACA,IACA,GACA,IACA,IACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,GACA,KAEFH,EACA7N,EAAImjD,IACFnjD,EAAIugD,MAAME,KACV,IAAI9pC,WAAW,CACb,EACA,GACA,IACA,IACA,EACA,GACA,IACA,IACA,EACA,GACA,IACA,OAGJ3W,EAAImjD,IACFnjD,EAAIugD,MAAMkB,KACV,IAAI9qC,WAAW,CACbrS,GAAY,GACXA,GAAY,GAAM,IAClBA,GAAY,EAAK,IACP,IAAXA,EACAD,GAAY,GACXA,GAAY,GAAM,IAClBA,GAAY,EAAK,IACP,IAAXA,KAAA,EAIPrE,EAEM4gD,KAAP,SAAY5gD,GACV,IAAMoN,EAAYpN,EAAM+F,OAAO1J,OAC/B,OAAO,IAAIsa,WACT,CACE,EACA,EACA,EACA,EAEA,EACA,GAAOvJ,EACP,EACA,EACA,EAEA,EACA,GAAOA,EACP,GACA,GACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EAEA,GAECxN,OAAO,CAACwN,IACRxN,OAAOI,EAAM+F,QACbnG,OAAO,CAAC,EAAM,EAAM,MAE1BI,EAEMwjD,UAAP,SAAiBxjD,GACf,IAAMoN,EAAapN,EAAM44C,WACzB,OAAO,IAAIjiC,WAAW,CACpB,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA3W,EAAM64C,aACN,EACA,GACA,EACA,EACA,EACA,EACCzrC,GAAc,EAAK,IACP,IAAbA,EACA,EACA,KAEHpN,EAEMmqB,KAAP,SAAY/c,GACV,OAAOpN,EAAImjD,IACTnjD,EAAIugD,MAAMp2B,KACVnqB,EAAIwjD,UAAUp2C,GACdpN,EAAImjD,IAAInjD,EAAIugD,MAAMK,KAAM5gD,EAAI4gD,KAAKxzC,IAAA,EAEpCpN,EAEM+/C,IAAP,SAAW3yC,GACT,OAAOpN,EAAImjD,IAAInjD,EAAIugD,MAAM,QAASvgD,EAAIwjD,UAAUp2C,GAAA,EACjDpN,EAEMggD,IAAP,SAAW5yC,GACT,OAAOpN,EAAImjD,IACTnjD,EAAIugD,MAAM,QACVvgD,EAAIwjD,UAAUp2C,GACdpN,EAAImjD,IAAInjD,EAAIugD,MAAMe,KAAMl0C,EAAMrH,QAAA,EAEjC/F,EAEM8hD,KAAP,SAAY10C,GACV,MAAmB,UAAfA,EAAMnP,KACmB,QAAvBmP,EAAMitC,cAA0C,QAAhBjtC,EAAMmY,MACjCvlB,EAAImjD,IAAInjD,EAAIugD,MAAMuB,KAAM9hD,EAAIijD,KAAMjjD,EAAI+/C,IAAI3yC,IAExB,QAAvBA,EAAMitC,aACDr6C,EAAImjD,IAAInjD,EAAIugD,MAAMuB,KAAM9hD,EAAIijD,KAAMjjD,EAAIggD,IAAI5yC,IAE5CpN,EAAImjD,IAAInjD,EAAIugD,MAAMuB,KAAM9hD,EAAIijD,KAAMjjD,EAAImqB,KAAK/c,IAE3CpN,EAAImjD,IAAInjD,EAAIugD,MAAMuB,KAAM9hD,EAAIijD,KAAMjjD,EAAI8qB,KAAK1d,GAAA,EAErDpN,EAEMuiD,KAAP,SAAYn1C,GACV,IAAMH,EAAKG,EAAM6K,GACX3b,EAAW8Q,EAAM4K,SAAW5K,EAAMuX,UAClChhB,EAAQyJ,EAAM/H,MACdnJ,EAASkR,EAAM9H,OACf4H,EAAoB0B,KAAK2Q,MAAMjjB,GAAY8jD,GAAa,IACxDvyC,EAAoBe,KAAK2Q,MAAMjjB,GAAY8jD,GAAa,IAC9D,OAAOpgD,EAAImjD,IACTnjD,EAAIugD,MAAMgC,KACV,IAAI5rC,WAAW,CACb,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACC1J,GAAM,GAAM,IACZA,GAAM,GAAM,IACZA,GAAM,EAAK,IACP,IAALA,EACA,EACA,EACA,EACA,EACAC,GAAqB,GACpBA,GAAqB,GAAM,IAC3BA,GAAqB,EAAK,IACP,IAApBA,EACAW,GAAqB,GACpBA,GAAqB,GAAM,IAC3BA,GAAqB,EAAK,IACP,IAApBA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,EACA,EACA,EACClK,GAAS,EAAK,IACP,IAARA,EACA,EACA,EACCzH,GAAU,EAAK,IACP,IAATA,EACA,EACA,MAGL8D,EAEMmiD,KAAP,SAAY/0C,EAAOH,GACjB,IAAM3Q,EAAwB0D,EAAI0hD,KAAKt0C,GACjCzJ,EAAKyJ,EAAM6K,GACX/b,EAA+B0S,KAAK2Q,MACxCtS,GAAuBmzC,GAAa,IAEhClzC,EAA+B0B,KAAK2Q,MACxCtS,GAAuBmzC,GAAa,IAEtC,OAAOpgD,EAAImjD,IACTnjD,EAAIugD,MAAM4B,KACVniD,EAAImjD,IACFnjD,EAAIugD,MAAM2B,KACV,IAAIvrC,WAAW,CACb,EACA,EACA,EACA,EACAhT,GAAM,GACLA,GAAM,GAAM,IACZA,GAAM,EAAK,IACP,IAALA,KAGJ3D,EAAImjD,IACFnjD,EAAIugD,MAAM0B,KACV,IAAItrC,WAAW,CACb,EACA,EACA,EACA,EACAza,GAAgC,GAC/BA,GAAgC,GAAM,IACtCA,GAAgC,EAAK,IACP,IAA/BA,EACAgR,GAAgC,GAC/BA,GAAgC,GAAM,IACtCA,GAAgC,EAAK,IACP,IAA/BA,KAGJlN,EAAIqiD,KACFj1C,EACA9Q,EAAsBD,OACpB,GACA,GACA,EACA,GACA,EACA,GAEJC,EAEJ,EAEA0D,EAIOoiD,KAAP,SAAYh1C,GAEV,OADAA,EAAM4K,SAAW5K,EAAM4K,UAAY,WAC5BhY,EAAImjD,IAAInjD,EAAIugD,MAAM6B,KAAMpiD,EAAIuiD,KAAKn1C,GAAQpN,EAAIihD,KAAK7zC,GAAA,EAC1DpN,EAEMsiD,KAAP,SAAYl1C,GACV,IAAMH,EAAKG,EAAM6K,GACjB,OAAOjY,EAAImjD,IACTnjD,EAAIugD,MAAM+B,KACV,IAAI3rC,WAAW,CACb,EACA,EACA,EACA,EACA1J,GAAM,GACLA,GAAM,GAAM,IACZA,GAAM,EAAK,IACP,IAALA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,MAGLjN,EAEMqiD,KAAP,SAAYj1C,EAAOH,GACjB,IAII3Q,EACAqH,EACAzH,EACAgR,EACAW,EACApK,EATEuK,EAAUZ,EAAMwY,SAAW,GAC3BthB,EAAM0J,EAAQ3R,OACdgI,EAAW,GAAK,GAAKC,EACrBH,EAAQ,IAAIwS,WAAWtS,GAyB7B,IAlBA4I,GAAU,EAAI5I,EACdF,EAAM0V,IACJ,CACiB,UAAfzM,EAAMnP,KAAmB,EAAO,EAChC,EACA,GACA,EACCqG,IAAQ,GAAM,IACdA,IAAQ,GAAM,IACdA,IAAQ,EAAK,IACR,IAANA,EACC2I,IAAW,GAAM,IACjBA,IAAW,GAAM,IACjBA,IAAW,EAAK,IACR,IAATA,GAEF,GAEG3Q,EAAI,EAAGA,EAAIgI,EAAKhI,IAEnBJ,GADAyH,EAASqK,EAAQ1R,IACC0b,SAClB9K,EAAOvJ,EAAOmf,KACdjV,EAAQlK,EAAO/G,MACf6G,EAAME,EAAO8/C,IACbt/C,EAAM0V,IACJ,CACG3d,IAAa,GAAM,IACnBA,IAAa,GAAM,IACnBA,IAAa,EAAK,IACR,IAAXA,EACCgR,IAAS,GAAM,IACfA,IAAS,GAAM,IACfA,IAAS,EAAK,IACR,IAAPA,EACCW,EAAM61C,WAAa,EAAK71C,EAAMw1C,UAC9Bx1C,EAAMy1C,cAAgB,EACpBz1C,EAAM01C,eAAiB,EACvB11C,EAAM81C,cAAgB,EACvB91C,EAAM+1C,UACY,MAApB/1C,EAAMg2C,WACa,GAAnBh2C,EAAMg2C,WACLpgD,IAAQ,GAAM,IACdA,IAAQ,GAAM,IACdA,IAAQ,EAAK,IACR,IAANA,GAEF,GAAK,GAAKnH,GAGd,OAAO0D,EAAImjD,IAAInjD,EAAIugD,MAAM8B,KAAMl+C,EAAA,EAChCnE,EAEMmb,YAAP,SAAmB/N,GACZpN,EAAIugD,OACPvgD,EAAIsgD,OAGN,IAAMrzC,EAAQjN,EAAIqhD,KAAKj0C,GAEvB,OADesY,GAAiB1lB,EAAIkjD,KAAMj2C,EAAA,EAE3CjN,CAAA,CAvlCM,GAAHqgD,GACUE,WAAA,EADVF,GAEWqC,gBAAA,EAFXrC,GAGWsC,UAAA,EAHXtC,GAIWuC,UAAA,EAJXvC,GAKWwC,UAAA,EALXxC,GAMWyC,UAAA,EANXzC,GAOW0C,UAAA,EAPX1C,GAQW2C,UAAA,EARX3C,GASW4C,UAAA,EATX5C,GAUW6C,UAAA,EAVX7C,GAWW+C,UAAA,ECjBV,SAASU,GACd9jD,EACAoN,EACAH,EACA3Q,QAAA,IADA2Q,IAAAA,EAAkB,YAClB3Q,IAAAA,GAAA,GAEA,IAAMqH,EAAS3D,EAAWoN,EAAYH,EACtC,OAAO3Q,EAAQsS,KAAKwU,MAAMzf,GAAUA,CACtC,CAWO,SAASogD,GACd/jD,EACAoN,GAEA,YAAO,IAFPA,IAAAA,GAAA,GAEO02C,GAAoB9jD,EAAU,IAAM,EA9Bf,IA8B0CoN,EACxE,CCCA,IAKI42C,GAA+B,KAC/BC,GAAqC,KAEpBC,GAAU,WAkB7B,SAAAlkD,EACEA,EACAoN,EACAH,EACA3Q,GAOA,GAPW,KArBL69C,cAAA,EAAQ,KACRp0C,YAAA,EAAM,KACNo4C,mBAAA,EAAa,KACbgG,aAAA,EAA4B,KAC5BC,SAAqC,KAAI,KACzCC,SAAqC,KAAI,KACzCC,WAA4B,KAAI,KAChCC,aAA8B,KAAI,KAClCC,oBAAqC,KAAI,KACzCC,mBAAA,EAAkC,KAClCC,mBAAA,EAAkC,KAClCC,sBAAA,EAYNruC,KAAK6jC,SAAWn6C,EAChBsW,KAAKvQ,OAASqH,EACdkJ,KAAK6nC,cAAgBlxC,EACrBqJ,KAAK6tC,aAAA,EAEiB,OAAlBH,GAAwB,CAC1B,IACMrgD,GADY7B,UAAUC,WAAa,IAChBmuB,MAAM,kBAC/B8zB,GAAgBrgD,EAAS6S,SAAS7S,EAAO,IAAM,CACjD,CACA,GAA4B,OAAxBsgD,GAA8B,CAChC,IAAM/nD,EAAS4F,UAAUC,UAAUmuB,MAAM,kBACzC+zB,GAAsB/nD,EAASsa,SAASta,EAAO,IAAM,CACvD,CACF,CAAC,IAAAkR,EAAApN,EAAAjD,UAkgCA,OAlgCAqQ,EAED2lB,QAAA,WAEEzc,KAAKvQ,OAASuQ,KAAKquC,iBAAmBruC,KAAK8tC,SAAW9tC,KAAK+tC,SAAW,MACvEj3C,EAEDsqC,eAAA,SAAe13C,GACbkW,EAAOL,IAAI,0CACXS,KAAK8tC,SAAW9tC,KAAK+tC,SAAWrkD,CAAA,EACjCoN,EAEDw3C,mBAAA,WACE1uC,EAAOL,IAAI,uCACXS,KAAKouC,mBAAA,EACLpuC,KAAKmuC,mBAAA,CAAoB,EAC1Br3C,EAEDqqC,iBAAA,WACEvhC,EAAOL,IAAI,yCACXS,KAAK6tC,aAAA,EACL7tC,KAAKquC,sBAAA,CAAmB,EACzBv3C,EAEDy3C,iBAAA,SAAiB7kD,GAEf,IAAIoN,GAAA,EACEH,EAAWjN,EAAa,GAAGkmB,IAC3B5pB,EAAW0D,EAAaktB,QAAO,SAACltB,EAAQ1D,GAC5C,IAAIqH,EAAMrH,EAAO4pB,IACbhqB,EAAQyH,EAAM3D,EAOlB,OANI9D,GAAS,aAEXkR,GAAA,EAEAlR,GADAyH,EAAMmhD,GAAanhD,EAAKsJ,IACVjN,GAEZ9D,EAAQ,EACH8D,EAEF2D,CACR,GAAEsJ,GAIH,OAHIG,GACF8I,EAAON,MAAM,yBAERtZ,CAAA,EACR8Q,EAED23C,MAAA,SACE/kD,EACAoN,EACAH,EACA3Q,EACAqH,EACAzH,EACAgR,EACAW,GAEA,IAAIpK,EACAuK,EACA1J,EACAD,EACAF,EACAd,EACAe,EAAkBT,EAClB0hB,EAAkB1hB,EAOhBD,EAAW1D,EAAW+2C,KAAO,EAC7BjzC,EAAWsJ,EAAW2pC,KAAO,EAC7BjsC,EAASsC,EAAWwY,QAAQvpB,OAC5BqS,EAAqB1O,EAAW4lB,QAAQvpB,OAAS,EACjDyS,EAAsB5B,GAASpC,EAAS,GAAMA,EAAS,EAO7D,KALKpH,GAAYgL,MACX5K,GAAYgL,IAChBwH,KAAK6tC,aACLj3C,EAEe,CACf,GAAIoJ,KAAK6tC,YAAa,KAAAn1C,EAAAyD,EAAAM,EAAA2C,EACdpS,EAASgT,KAAKquC,kBAElBrhD,GACC8J,EAAW/H,QAAU/B,EAAO+B,OAC3B+H,EAAW9H,SAAWhC,EAAOgC,SACR,OAArB0J,EAAA5B,EAAW0vC,iBAAA,EAAX9tC,EAAwB,OAAwB,OAAtByD,EAAKnP,EAAOw5C,iBAAA,EAAPrqC,EAAoB,MACnD,OAAAM,EAAA3F,EAAW0vC,iBAAA,EAAX/pC,EAAwB,OAAwB,OAAtB2C,EAAKpS,EAAOw5C,iBAAA,EAAPpnC,EAAoB,KAErDY,KAAKmhC,kBAET,MACEnzC,EAAcgS,KAAK0uC,WACjBhlD,EACAoN,EACAzJ,EACAzH,GAIJ,IAEIC,EAFE8Z,EAAoBK,KAAKouC,kBAC3B3uC,GAAsB,EAG1B,GAAIjH,IACFiH,EA+6BR,SAA2B/V,GACzB,IAAK,IAAIoN,EAAI,EAAGA,EAAIpN,EAAQ3D,OAAQ+Q,IAClC,GAAIpN,EAAQoN,GAAGjQ,IACb,OAAOiQ,EAGX,OAAQ,CACV,CAPA,CA/6B+CA,EAAWwY,UAC7C3P,GAAqBK,KAAKvQ,OAAOk/C,8BAEpC,GADA5hD,GAAA,EACI0S,EAAqB,EAAG,CAC1BG,EAAOzJ,KAAI,0BACiBsJ,EAA6B,WAAAjL,EAAA,4CAEzD,IAAMqL,EAAWG,KAAKuuC,iBAAiBz3C,EAAWwY,SAClDxY,EAAWwY,QAAUxY,EAAWwY,QAAQlP,MAAMX,GAC9C3I,EAAW0nC,SAAW/+B,EAItB5Z,EAHAkpB,IACGjY,EAAWwY,QAAQ,GAAGM,IAAM/P,GAC7B/I,EAAW4pC,cAEf,MAAmC,IAAxBjhC,IACTG,EAAOzJ,KACsC,2CAAA3B,EAAA,kBAE7CzH,GAAA,GAKN,GAAIiT,KAAK6tC,YAAa,CACpB,GAAIz1C,GAAsBI,EAAoB,CAK5C,IAAMsH,EAAWE,KAAKuuC,iBAAiBz3C,EAAWwY,SAG5C/a,GADJi6C,GAAa9kD,EAAW4lB,QAAQ,GAAGM,IAAK9P,GAAYA,GACXhJ,EAAW4pC,eACtD5yC,GAAmBwK,KAAKgN,IAAI,EAAG/Q,GAC/Bwa,GAAmBzW,KAAKgN,IAAI,GAAI/Q,EAClC,CAGA,GAAI6D,GAwBF,GAtBK1O,EAAW44C,aACd1iC,EAAOzJ,KACL,2DAEFnI,EAAcgS,KAAK0uC,WACjBhlD,EACAoN,EACAzJ,EACAzH,IAGJ8R,EAAQsI,KAAK4uC,WACXllD,EACAoE,EACAkS,KAAKmuC,kBACLvoD,EACA4H,GACEgL,GACAjB,IAAiB4jB,GACfpM,OAAA,GAGFvW,EAAoB,CACtB,IAAMwI,EAAmBtJ,EAAQA,EAAM0M,OAAS1M,EAAMyM,SAAW,EAE5DrN,EAAW4pC,iBACd9gC,EAAOzJ,KACL,2DAEFnI,EAAcgS,KAAK0uC,WACjBhlD,EACAoN,EACAzJ,EACAzH,IAGJuH,EAAQ6S,KAAK6uC,WACX/3C,EACAiY,EACApP,EACAqB,EAEJ,OACSxI,IACTrL,EAAQ6S,KAAK6uC,WACX/3C,EACAiY,EACApP,EACA,IAGAxS,IACFA,EAAM2hD,cAAgBrvC,EACtBtS,EAAM2Y,aAAsC,IAAxBrG,EACpBtS,EAAM4hD,iBAAmBlpD,EAE7B,CACF,CAsBA,OAnBIma,KAAK6tC,aAAe7tC,KAAK8tC,UAAY9tC,KAAK+tC,WACxCp3C,EAAS2Y,QAAQvpB,SACnB8H,EAAMmhD,GACJr4C,EACAtJ,EACA2S,KAAK8tC,SACL9tC,KAAK+tC,WAIL/nD,EAAUspB,QAAQvpB,SACpBgI,EAAOkhD,GACLjpD,EACAqH,EACA2S,KAAK8tC,YAKJ,CACL9nC,MAAAtO,EACAuO,MAAA9Y,EACA0X,YAAA7W,EACA8X,YAAA/Y,EACA0gB,KAAA1f,EACAyf,IAAA3f,EAAA,EAEHiJ,EAED43C,WAAA,SACEhlD,EACAoN,EACAH,EACA3Q,GAEA,IAOIqH,EACAzH,EACAgR,EATEW,EAAe7N,EAAW4lB,QAC1BniB,EAAe2J,EAAWwY,QAC1B5X,EAAgBsI,KAAK6nC,cACrB75C,EAAmB,CAAC,EACpBD,EAAWiS,KAAK8tC,SAClBjgD,GAAiBE,GAAY/H,EAC7B+G,EAAY,YAShB,GAJIc,IACFR,EAAUzH,EAAU,KAGlB8D,EAAW+F,QAAU8H,EAAaxR,OAAQ,CAM5C,OADA2D,EAAW2kB,UAAY3kB,EAAW44C,WAC1B54C,EAAWq6C,cACjB,IAAK,MACCrsC,EAAc8xC,MAEhBz8C,EAAY,aACZrD,EAAWulB,MAAQ,IACVvX,EAAc+xC,MAEvB//C,EAAWulB,MAAQ,OAErB,MAEF,IAAK,MACHvlB,EAAWulB,MAAQ,OAGvBjhB,EAAOgY,MAAQ,CACbrE,GAAI,QACJmiC,UAAW/2C,EACXkiB,MAAOvlB,EAAWulB,MAClBpK,YAC8B,QAA5Bnb,EAAWq6C,cAA0BrsC,EAAc8xC,KAC/C,IAAInpC,WAAW,GACf0pC,GAAIllC,YAAY,CAACnb,IACvBwlD,SAAU,CACR3M,aAAc74C,EAAW64C,eAGzB10C,IACF+I,EAAYlN,EAAWg3C,eAClB3yC,GAAY6I,IAAc7I,EAASsgB,UAKtCxgB,GAAA,EAHAR,EAAUzH,EACR2R,EAAa,GAAGqY,IAAMtX,KAAKwU,MAAMlW,EAAYD,GAKrD,CAEA,GAAIG,EAAWgwC,KAAOhwC,EAAWiwC,KAAO55C,EAAapH,OAAQ,CAc3D,GAXA+Q,EAAWuX,UAAYvX,EAAW4pC,eAClC1yC,EAAOiY,MAAQ,CACbtE,GAAI,OACJmiC,UAAW,YACX70B,MAAOnY,EAAWmY,MAClBpK,YAAaklC,GAAIllC,YAAY,CAAC/N,IAC9Bo4C,SAAU,CACRngD,MAAO+H,EAAW/H,MAClBC,OAAQ8H,EAAW9H,SAGnBnB,EAEF,GADA+I,EAAYE,EAAW4pC,eAClB3yC,GAAY6I,IAAc7I,EAASsgB,UAStCxgB,GAAA,MATiD,CACjD,IAAMC,EAAWkS,KAAKuuC,iBAAiBphD,GACjC4hB,EAAczW,KAAKwU,MAAMlW,EAAYD,GAC3C/Q,EAAU0S,KAAK+M,IACbzf,EACA4oD,GAAarhD,EAAa,GAAGu0C,IAAK5zC,GAAYihB,GAEhD1hB,EAAUiL,KAAK+M,IAAIhY,EAAmBS,EAAWihB,EACnD,CAIF/O,KAAKquC,iBAAmB,CACtBt/C,MAAO+H,EAAW/H,MAClBC,OAAQ8H,EAAW9H,OACnBw3C,WAAY1vC,EAAW0vC,WAE3B,CAEA,GAAIhgD,OAAOP,KAAK+H,GAAQjI,OAetB,OAdAia,KAAK6tC,aAAA,EACDhgD,GACFmS,KAAK8tC,SAAW,CACd/L,SAAU10C,EACVghB,UAAWzX,GAEboJ,KAAK+tC,SAAW,CACdhM,SAAUn8C,EACVyoB,UAAWzX,IAGbvJ,EAAUuJ,OAAA,EAGL,CACL21B,OAAAv+B,EACA6sC,QAAAxtC,EACAghB,UAAAzX,EAAA,EAGLE,EAED+3C,WAAA,SACEnlD,EACAoN,EACAH,EACA3Q,GAEA,IAQIqH,EACAzH,EATEgR,EAAoBlN,EAAMg3C,eAC1BvzC,EAAmCzD,EAAM4lB,QACzC5X,EAAkC,GAClC1J,EAAYb,EAAapH,OACzBgI,EAAUiS,KAAK8tC,SACjBjgD,EAAamS,KAAKguC,WAClBjhD,EAAS,EACTe,EAAoBkS,KAAKkuC,oBAGzBn/B,EAAiB7W,OAAO2oB,kBACxBzzB,EAAiB8K,OAAOi3C,kBACxB3hD,GAAA,EAGJ,IAAKmJ,GAA6B,OAAf9I,EAAqB,CACtC,IAAM2G,EAAMsC,EAAaF,EACnBwB,EACJjL,EAAa,GAAGyiB,IAChB4+B,GAAarhD,EAAa,GAAGu0C,IAAKv0C,EAAa,GAAGyiB,KAElD89B,IACe,OAAf7/C,GACAyK,KAAKC,IAAI/D,EAAM4D,EAAMvK,GAAc,KAGnC8I,GAAA,EAGA9I,EAAa2G,EAAM4D,CAEvB,CAKA,IADA,IAAMI,EAAYzK,EAAQg0C,SAAWnrC,EAAa7I,EAAQsgB,UACjDjP,EAAI,EAAGA,EAAIpR,EAAWoR,IAAK,CAClC,IAAMpS,EAASG,EAAaiS,GAC5BpS,EAAO4iB,IAAM4+B,GAAaxhD,EAAO4iB,IAAMpX,EAAU3K,GACjDb,EAAO00C,IAAM8M,GAAaxhD,EAAO00C,IAAMlpC,EAAU3K,GAC7Cb,EAAO00C,IAAMv0C,EAAaiS,EAAI,EAAIA,EAAI,EAAIA,GAAGsiC,MAC/Cl0C,GAAA,EAEJ,CAGIA,GACFL,EAAawnC,MAAK,SAAUjrC,EAAGoN,GAC7B,IAAMH,EAAWjN,EAAEg4C,IAAM5qC,EAAE4qC,IACrB17C,EAAW0D,EAAEkmB,IAAM9Y,EAAE8Y,IAC3B,OAAOjZ,GAAY3Q,CACrB,IAIFqH,EAAWF,EAAa,GAAGu0C,IAK3B,IAAM77C,EAJIsH,EAAaA,EAAapH,OAAS,GAAG27C,IAIhBr0C,EAC1BsS,EAAwB9Z,EAC1ByS,KAAKwU,MAAMjnB,GAAiBmI,EAAY,IACxCF,GAAqBpE,EAAMg3C,eAAiB,GAGhD,GAAI/pC,EAAY,CAEd,IAAM8I,EAAQpS,EAAWQ,EACnBgS,EAAYJ,EAAQE,EACpBG,EAAeL,GAAS,EAC9B,IAAII,GAAaC,KACXD,EACFD,EAAOzJ,KAAI,QACDs3C,GACNhuC,GAAA,GAEO,QAAAA,EAAA,2CAAgD3I,EAAWgzB,QAClE,IAIJlqB,EAAOzJ,KAAI,QACDs3C,IACLhuC,GAAA,GAEM,QAAAA,EAAA,kDAAuD3I,EAAWgzB,QACzE,KAKHhqB,GACDjS,GAAcV,EAAa,GAAGyiB,KAC9B89B,IACA,CACArgD,EAAWQ,EACX,IAAM0G,EAAWpH,EAAa,GAAGyiB,IAAMnQ,EACvC,GAAII,EACF1S,EAAa,GAAGu0C,IAAMr0C,EACtBF,EAAa,GAAGyiB,IAAMrb,OAEtB,IAAK,IAAIyM,EAAI,EAAGA,EAAI7T,EAAapH,UAC3BoH,EAAa6T,GAAG0gC,IAAMntC,GADayM,IAIvC7T,EAAa6T,GAAG0gC,KAAOjiC,EACvBtS,EAAa6T,GAAG4O,KAAOnQ,EAG3BG,EAAOL,IAAG,oCAC4BkuC,GAClCl5C,GAAA,GAED,IAAIk5C,GACHpgD,GAAA,GAED,YAAYogD,GAAoBhuC,GAAA,GAAY,MAEjD,CAEJ,CAOA,IAHA,IAAIwB,EAAS,EACTc,EAAU,EACVY,EAJJtV,EAAWiL,KAAKgN,IAAI,EAAGjY,GAKduV,EAAI,EAAGA,EAAI5U,EAAW4U,IAAK,CAMlC,IAJA,IAAMC,EAAS1V,EAAayV,GACtBE,EAAQD,EAAOsiC,MACf3hC,EAAUV,EAAM/c,OAClB6f,EAAY,EACPO,EAAI,EAAGA,EAAI3C,EAAS2C,IAC3BP,GAAa9C,EAAMqD,GAAGrW,KAAK/J,OAG7Bgc,GAAW6D,EACX3E,GAAUuC,EACVX,EAAO9c,OAAS6f,EAGZ/C,EAAO6+B,IAAM/+B,GACfE,EAAO6+B,IAAM/+B,EACbA,GAAYhD,EAAwB,EAAK,GAAK,GAE9CgD,EAAUE,EAAO6+B,IAGnB3yB,EAASzW,KAAK+M,IAAIxC,EAAO+M,IAAKb,GAC9B3hB,EAASkL,KAAKgN,IAAIzC,EAAO+M,IAAKxiB,EAChC,CACAxH,EAAUuH,EAAaa,EAAY,GAAG0zC,IAItC,IACIr4B,EADE8H,EAAWpP,EAAU,EAAId,EAAS,EAExC,IACEoI,EAAO,IAAIhJ,WAAW8Q,EACvB,CAAC,MAAOznB,GASP,YARAsW,KAAK6jC,SAASpB,KAAK/pC,EAAOkD,MAAOlD,EAAOkD,MAAO,CAC7CjU,KAAMwU,EAAWI,UACjB0gB,QAASxgB,EAAa6B,kBACtBqgB,OAAA,EACAzpB,MAAOxL,EACPmmB,MAAOsB,EACPyN,OAAsC,8BAAAzN,GAG1C,CACA,IAAM1H,EAAO,IAAI4H,SAAShI,EAAK0B,QAC/BtB,EAAK6H,UAAU,EAAGH,GAClB9H,EAAK9F,IAAIwmC,GAAIE,MAAMQ,KAAM,GAOzB,IALA,IAAI/gC,GAAA,EACA9b,EAAcsK,OAAO2oB,kBACrB9W,EAAc7R,OAAO2oB,kBACrB7W,EAAc9R,OAAOi3C,kBACrBllC,EAAc/R,OAAOi3C,kBAChBjlC,EAAI,EAAGA,EAAIlc,EAAWkc,IAAK,CAKlC,IAJA,IAAMC,EAAchd,EAAa+c,GAC3BgQ,EAAmB/P,EAAYg7B,MACjChrB,GAAkB,EAEbC,GAAI,EAAGC,GAAUH,EAAiBn0B,OAAQq0B,GAAIC,GAASD,KAAK,CACnE,IAAMhQ,GAAO8P,EAAiBE,IACxB/P,GAAWD,GAAKta,KAChBwa,GAAcF,GAAKta,KAAKmb,WAC9BxB,EAAK6H,UAAUvkB,EAAQud,IACvBvd,GAAU,EACVsc,EAAK9F,IAAI8G,GAAUtd,GACnBA,GAAUud,GACV6P,IAAmB,EAAI7P,EACzB,CAGA,IAAII,QAAA,EACJ,GAAIR,EAAIlc,EAAY,EAClBF,EAAoBX,EAAa+c,EAAI,GAAGw3B,IAAMv3B,EAAYu3B,IAC1Dh3B,GAAWvd,EAAa+c,EAAI,GAAG0F,IAAMzF,EAAYyF,QAC5C,CACL,IAAMjF,GAAS3K,KAAKvQ,OACdob,GACJX,EAAI,EACAC,EAAYu3B,IAAMv0C,EAAa+c,EAAI,GAAGw3B,IACtC/hC,EAKN,GAJA+K,GACER,EAAI,EACAC,EAAYyF,IAAMziB,EAAa+c,EAAI,GAAG0F,IACtCjQ,EACFgL,GAAOykC,wBAAgD,OAAtBpvC,KAAKiuC,aAAuB,CAM/D,IAAMriC,GAAetT,KAAK2Q,MAAM0B,GAAOoxB,cAAgBnlC,GACjDiV,IACH7lB,EACG+oB,EAAS/oB,EAAmB4Q,EAC5BoJ,KAAKiuC,cAAgB9jC,EAAYyF,IACnC/D,GAAkBD,KAGpB9d,EAAoB+d,GAAkBhB,IACd,EACtB/c,EAAoB+c,GAEpBnB,GAAA,EAEF9J,EAAOL,IAAG,sCAENsM,GAAkB,GAAE,2CAEpB/d,EAAoB,GAAE,kCAI1BA,EAAoB+c,EAExB,MACE/c,EAAoB+c,EAExB,CACA,IAAMiB,GAAwBxT,KAAKwU,MACjC3C,EAAYyF,IAAMzF,EAAYu3B,KAEhC9zC,EAAc0K,KAAK+M,IAAIzX,EAAaE,GACpCkc,EAAc1R,KAAKgN,IAAI0E,EAAalc,GACpCic,EAAczR,KAAK+M,IAAI0E,EAAaW,IACpCT,EAAc3R,KAAKgN,IAAI2E,EAAaS,IAEpChT,EAAc+S,KACZ,IAAI4kC,GACFllC,EAAYtjB,IACZiH,EACAqsB,GACArO,IAGN,CAEA,GAAIpU,EAAc3R,OAChB,GAAI2nD,IACF,GAAIA,GAAgB,GAAI,CAGtB,IAAM3hC,GAAQrU,EAAc,GAAGpR,MAC/BylB,GAAMghC,UAAY,EAClBhhC,GAAMuhC,UAAY,CACpB,OACK,GAAIK,IAIP1jC,EAAcF,EAAcC,EAAcpc,GAC1C+R,EAAwBqK,EAAc,MACb,IAAzBtS,EAAc,GAAGy1C,IACjB,CACAvtC,EAAOzJ,KACL,uGAGF,IADA,IAAI6V,GAAM3e,EACD4e,GAAI,EAAGC,GAAMxU,EAAc3R,OAAQkmB,GAAIC,GAAKD,KAAK,CACxD,IAAME,GAAUH,GAAMtU,EAAcuU,IAAGvK,SACjC2K,GAAML,GAAMtU,EAAcuU,IAAGkhC,IACnC,GAAIlhC,GAAIC,GAAM,EAAG,CACf,IAAMK,GAAUJ,GAAUzU,EAAcuU,GAAI,GAAGkhC,IAC/Cz1C,EAAcuU,IAAGvK,SAAW6K,GAAUF,EACxC,MACE3U,EAAcuU,IAAGvK,SAAWuK,GACxBvU,EAAcuU,GAAI,GAAGvK,SACrB/B,EAENjI,EAAcuU,IAAGkhC,IAAM,EACvBnhC,GAAMG,EACR,CACF,CAIJre,EACE4b,IAAuB5b,EACnB6R,EACA7R,EACNkS,KAAKguC,WAAangD,EAAajI,EAAUkI,EACzCkS,KAAKkuC,oBAAsBpgD,EAC3BkS,KAAKouC,mBAAA,EACL,IAQMhiC,GAAO,CACXiyB,MATW0L,GAAIe,KACfphD,EAAMi3C,iBACNtzC,EACAkK,EAAc,CAAE,EAAE7N,EAAO,CACvB4lB,QAAS5X,KAMX4mC,MAAOj1B,EACPlF,SAAU4K,EAASnY,EACnBwN,QAAShX,EAASU,GAAqB8I,EACvCyN,SAAUhX,EAAWuJ,EACrB0N,OAASzW,EAAwB+I,EACjCjP,KAR6B,QAS7B2nD,UAAA,EACAC,UAAA,EACAC,GAAI93C,EAAc3R,OAClBy4C,QAAS90C,EAAM80C,SAIjB,OAFA90C,EAAM4lB,QAAU,GAChB5lB,EAAM80C,QAAU,EACTpyB,EAAA,EACRtV,EAED24C,mBAAA,SAAmB/lD,GACjB,OAAQA,EAAMq6C,cACZ,IAAK,MACH,OAhvB4B,KAivB9B,IAAK,MACH,OAjvBsB,KAkvBxB,QACE,OArvBsB,OAuvB3BjtC,EAED83C,WAAA,SACEllD,EACAoN,EACAH,EACA3Q,EACAqH,GAEA,IAAMzH,EAAyB8D,EAAMg3C,eAI/B9pC,EAAsBhR,GAHC8D,EAAM44C,WAC/B54C,EAAM44C,WACN18C,GAEEuH,EAA4B6S,KAAKyvC,mBAAmB/lD,GACpDgO,EAA8BvK,EAAoByJ,EAClD5I,EAAUgS,KAAK8tC,SACf//C,EACmB,QAAvBrE,EAAMq6C,cAA0B/jC,KAAK6nC,cAAc2B,KAC/C37C,EAAkC,GAClCd,OAAA,IAAmBM,EAErBS,EAAmCpE,EAAM4lB,QACzCP,EAAiBhhB,EAAU,EAAI,EAC/BX,EAAuB4S,KAAKiuC,eAAiB,EAY3CzgD,EAAmBsJ,EAAalR,EAChC4O,EAAYxG,EAAQ+zC,SAAWn8C,EAAkBoI,EAAQqgB,UAkB/D,GAjBArO,KAAKmuC,kBAAoBx3C,EACvBA,GACE7I,EAAa/H,QACbqH,EAAe,IACbpH,GACAsS,KAAKC,IAAI/K,EAAmBJ,GAAgB,KAC5CkL,KAAKC,IACHi2C,GAAa1gD,EAAa,GAAG8hB,IAAMpb,EAAUhH,GAC3CJ,GAEF,GAAKsK,GAGb5J,EAAasF,SAAQ,SAAU1J,GAC7BA,EAAOkmB,IAAM4+B,GAAa9kD,EAAOkmB,IAAMpb,EAAUhH,EACnD,KAEKmJ,GAAcvJ,EAAe,EAAG,CAOnC,GAHAU,EAAeA,EAAaiT,QAAO,SAACrX,GAAM,OAAKA,EAAOkmB,KAAO,MAGxD9hB,EAAa/H,OAChB,OAKAqH,EAFsB,IAApBC,EAEa,EACNrH,IAAuB+G,EAEjBuL,KAAKgN,IAAI,EAAG9X,GAGZM,EAAa,GAAG8hB,GAEnC,CAQA,GAA2B,QAAvBlmB,EAAMq6C,aAER,IADA,IAAM3rC,EAAsB4H,KAAKvQ,OAAOigD,oBAC/Bl3C,EAAI,EAAG4G,EAAUhS,EAAcoL,EAAI1K,EAAa/H,OAAQyS,IAAK,CAEpE,IAAMxL,EAASc,EAAa0K,GACtB3S,EAAMmH,EAAO4iB,IACbjQ,EAAQ9Z,EAAMuZ,EACdK,EAAWnH,KAAKC,IAAK,IAAOoH,EAAS/Z,GAG3C,GACE+Z,IAAUvH,EAAsBV,GAChC3K,EAEU,IAANyL,IACFoH,EAAOzJ,KAAI,kBACStQ,EAAMD,GAAgBkkC,QACtC,iCAC6BxxB,KAAKwU,MACjC,IAAOnN,EAAS/Z,GAClB,QAEHoa,KAAKiuC,aAAe7gD,EAAegS,EAAUvZ,QAS5C,GACH8Z,GAASvH,EAAsBV,GAC/B+H,EA72BwB,KA82BxB1S,EACA,CACA,IAAI8S,EAAUvH,KAAKwU,MAAMnN,EAAQjI,IAGjC0H,EAAUvZ,EAAMga,EAAUnI,GACZ,IACZmI,IACAT,GAAW1H,GAEH,IAANc,IACFwH,KAAKiuC,aAAe7gD,EAAegS,GAErCQ,EAAOzJ,KAAI,4BACmB0J,EAAO,mBACjCT,EAAUxZ,GACVkkC,QAAQ,GAAc,YAAAxxB,KAAKwU,MAC1B,IAAOnN,EAAS/Z,GAClB,YAEH,IAAK,IAAIka,EAAI,EAAGA,EAAID,EAASC,IAAK,CAChC,IAAMvL,EAAW+D,KAAKgN,IAAIlG,EAAmB,GACzC4B,EAAY4oC,GAAIC,eAClBngD,EAAM84C,eAAiB94C,EAAMulB,MAC7BvlB,EAAM64C,cAEHvhC,IACHpB,EAAOL,IACL,oGAEFyB,EAAYhU,EAAO81C,KAAKn3B,YAE1B7d,EAAaojB,OAAO1Y,EAAG,EAAG,CACxBsqC,KAAM9hC,EACN4O,IAAKrb,IAEP6K,GAAW1H,EACXc,GACF,CACF,CACAxL,EAAO4iB,IAAMxQ,EACbA,GAAW1H,CACb,CAOF,IALA,IAEIuJ,EAFAc,EAA0B,KAC1BY,EAAyB,KAEzBC,EAAmB,EACnBC,EAAuB/U,EAAa/H,OACjC8c,KACLD,GAAY9U,EAAa+U,GAAcigC,KAAK73B,WAE9C,IAAK,IAAInI,EAAI,EAAGU,EAAY1V,EAAa/H,OAAQ+c,EAAIU,EAAWV,IAAK,CACnE,IAAM8C,EAAc9X,EAAagV,GAC3BqD,EAAOP,EAAYk9B,KACrBz5B,EAAMzD,EAAYgK,IACtB,GAAgB,OAAZjN,EAGiB9U,EAAciV,EAAI,GAC1BpB,SAAWpJ,KAAKwU,OAAOzD,EAAM1G,GAAW/L,OAC9C,CAOL,GANID,GAAqC,QAAvBjN,EAAMq6C,eAEtB16B,EAAMjc,GAGR2U,EAAWsH,IACPzG,EAAW,GAwBb,OArBAA,GAAYmM,EACZ,IACE9N,EAAO,IAAIZ,WAAWuC,EACvB,CAAC,MAAOlZ,GASP,YARAsW,KAAK6jC,SAASpB,KAAK/pC,EAAOkD,MAAOlD,EAAOkD,MAAO,CAC7CjU,KAAMwU,EAAWI,UACjB0gB,QAASxgB,EAAa6B,kBACtBqgB,OAAA,EACAzpB,MAAOxL,EACPmmB,MAAOjN,EACPgc,OAAsC,8BAAAhc,GAG1C,CACK7U,IACU,IAAIsjB,SAASpQ,EAAK8J,QAC1BuG,UAAU,EAAG1O,GAClB3B,EAAKsC,IAAIwmC,GAAIE,MAAMQ,KAAM,GAM/B,CACAxpC,EAAKsC,IAAI4C,EAAM4I,GACf,IAAMoC,EAAUhL,EAAK8E,WACrB8D,GAAUoC,EAIVtjB,EAAc4c,KAAK,IAAI4kC,IAAA,EAAgBliD,EAAmBgkB,EAAS,IACnExO,EAAU0G,CACZ,CAGA,IAAMI,EAAY5b,EAAc9H,OAChC,GAAK0jB,EAAL,CAKA,IAAMC,EAAa7b,EAAcA,EAAc9H,OAAS,GACxDia,KAAKiuC,aAAe7gD,EAClBuV,EAAW/L,EAAc8S,EAAWhI,SAGtC,IAAM9T,EAAOG,EACT,IAAIsS,WAAW,GACf0pC,GAAIe,KACFphD,EAAMi3C,iBACN5+B,EAAYnL,EACZW,EAAc,CAAE,EAAE7N,EAAO,CAAE4lB,QAASzhB,KAI1CnE,EAAM4lB,QAAU,GAChB,IAAMvF,EAAQhI,EAAYnc,EACpBokB,EAAM5c,EAAexH,EAErBqkB,EAAY,CAChBo0B,MAAOzwC,EACP0wC,MAAOr9B,EACPkD,SAAU4F,EACV3F,OAAQ4F,EACR3F,SAAU0F,EACVzF,OAAQ0F,EACRriB,KAR6B,QAS7B2nD,UAAA,EACAC,UAAA,EACAC,GAAI/lC,GAIN,OADAzJ,KAAKmuC,mBAAA,EACElkC,CAnCP,GAoCDnT,EAED64C,gBAAA,SACEjmD,EACAoN,EACAH,EACA3Q,GAEA,IAAMqH,EAAyB3D,EAAMg3C,eAI/B96C,EAAsByH,GAHC3D,EAAM44C,WAC/B54C,EAAM44C,WACNj1C,GAEEuJ,EAA8BoJ,KAAKiuC,aAEnC12C,EAAUyI,KAAK+tC,SACf5gD,EAAgC,IAAnBoK,EAAQwqC,SAAoBxqC,EAAQ8W,UACjD3W,GACc,OAAjBd,EACGA,EACA5Q,EAAUqe,SAAWhX,GAAkBF,EACvCa,EAAiBhI,EAAUse,OAASjX,EAAiBF,EAErDY,EArhCoB,KAqhCInI,EAExBiI,EAAoByK,KAAK0zB,MAAMh+B,EAAS0J,GAAY3J,GAEpDhB,EAAsC68C,GAAIC,eAC9CngD,EAAM84C,eAAiB94C,EAAMulB,MAC7BvlB,EAAM64C,cAKR,GAFA3iC,EAAOzJ,KAAK,oCAEPpJ,EAAL,CAQA,IADA,IAAMe,EAAsB,GACnBihB,EAAI,EAAGA,EAAIlhB,EAAWkhB,IAAK,CAClC,IAAM3hB,EAAQsK,EAAWqX,EAAIhhB,EAC7BD,EAAQ2c,KAAK,CAAEq4B,KAAM/1C,EAAa6iB,IAAKxiB,EAAOs0C,IAAKt0C,GACrD,CAGA,OAFA1D,EAAM4lB,QAAUxhB,EAETkS,KAAK4uC,WAAWllD,EAAOoN,EAAYH,GAAA,EAT1C,CAJEiJ,EAAOP,MACL,8GAaL3V,CAAA,CAxiC4B,GA2iCxB,SAAS8kD,GAAa9kD,EAAeoN,GAC1C,IAAIH,EACJ,GAAkB,OAAdG,EACF,OAAOpN,EAaT,IAREiN,EAFEG,EAAYpN,GAEJ,WAGD,WAKJ4O,KAAKC,IAAI7O,EAAQoN,GAAa,YACnCpN,GAASiN,EAGX,OAAOjN,CACT,CAWO,SAASslD,GACdtlD,EACAoN,EACAH,EACA3Q,GAEA,IAAMqH,EAAS3D,EAAM4lB,QAAQvpB,OAC7B,GAAKsH,EAAL,CAIA,IADA,IAAMzH,EAAiB8D,EAAMg3C,eACpB9pC,EAAQ,EAAGA,EAAQvJ,EAAQuJ,IAAS,CAC3C,IAAMW,EAAS7N,EAAM4lB,QAAQ1Y,GAG7BW,EAAOqY,IACL4+B,GACEj3C,EAAOqY,IAAOjZ,EAAQorC,SAAWn8C,EAAkB+Q,EAAQ0X,UAC3DvX,EAAalR,GACXA,EACN2R,EAAOmqC,IACL8M,GACEj3C,EAAOmqC,IAAO17C,EAAQ+7C,SAAWn8C,EAAkBI,EAAQqoB,UAC3DvX,EAAalR,GACXA,CACR,CACA,IAAMuH,EAAUzD,EAAM4lB,QAEtB,OADA5lB,EAAM4lB,QAAU,GACT,CACLA,QAAAniB,EApBF,CAsBF,CAEO,SAAS8hD,GACdvlD,EACAoN,EACAH,GAEA,IAAM3Q,EAAS0D,EAAM4lB,QAAQvpB,OAC7B,GAAKC,EAAL,CAKA,IADA,IAAMqH,EAAiB3D,EAAMg3C,eACpB96C,EAAQ,EAAGA,EAAQI,EAAQJ,IAAS,CAC3C,IAAMgR,EAASlN,EAAM4lB,QAAQ1pB,GAG7BgR,EAAOgZ,IACL4+B,GACE53C,EAAOgZ,IAAOjZ,EAAQorC,SAAW10C,EAAkBsJ,EAAQ0X,UAC3DvX,EAAazJ,GACXA,CACR,CACA3D,EAAM4lB,QAAQqlB,MAAK,SAACjrC,EAAGoN,GAAC,OAAKpN,EAAEkmB,IAAM9Y,EAAE8Y,GAAA,IACvC,IAAMrY,EAAU7N,EAAM4lB,QAEtB,OADA5lB,EAAM4lB,QAAU,GACT,CACLA,QAAA/X,EAjBF,CAmBF,CAAC,IC1pCGq4C,GDqqCEP,GAMJ,SACE3lD,EACAoN,EACAH,EACA3Q,GACA,KAVKwmB,UAAA,EAAI,KACJ9K,cAAA,EAAQ,KACRyrC,SAAA,EAAG,KACH7mD,WAAA,EAQL0Z,KAAK0B,SAAW5K,EAChBkJ,KAAKwM,KAAO7V,EACZqJ,KAAKmtC,IAAMnnD,EACXga,KAAK1Z,MAAQ,CACX8mD,UAAW,EACXJ,aAAc,EACdC,cAAe,EACfM,WAAY,EACZR,UAAWrjD,EAAa,EAAI,EAC5B4jD,UAAW5jD,EAAa,EAAI,EAEhC,EE/qCImmD,GAAkB,oBAAAnmD,IAAA,KACdomD,iBAAA,EAAgC,KAChCt3B,gBAAA,EAAU,KACVqM,gBAAA,EAAU,KACVkrB,cAAA,EAAQ,KACRlV,QAAoC,KAAI,KACxCmV,gBAAA,EAAU,KACVC,YAA6B,IAAI,KAAAn5C,EAAApN,EAAAjD,UA6MxC,OA7MwCqQ,EAElC2lB,QAAP,aAAmB3lB,EAEZsqC,eAAP,SAAsB13C,GACpBsW,KAAK66B,QAAUnxC,EACfsW,KAAKiwC,YAAc,MACpBn5C,EAEMw3C,mBAAP,WACEtuC,KAAKiwC,YAAc,MACpBn5C,EAEMqqC,iBAAP,SACEz3C,EACAoN,EACAH,EACA3Q,GAEAga,KAAKwY,WAAa1hB,EAClBkJ,KAAK6kB,WAAaluB,EAClBqJ,KAAKkwC,oBzD+aF,SACLxmD,EACAoN,GAEA,IAAKpN,IAAgBoN,EACnB,OAAOpN,EAET,IAAMiN,EAAQG,EAAYga,MAqC1B,OApCIna,GAASG,EAAY8Z,oBACT5C,GAAQtkB,EAAa,CAAC,OAAQ,SACtC0J,SAAQ,SAAC1J,GACb,IAGMoN,EAHOkX,GAAQtkB,EAAM,CAAC,OAAQ,OAAQ,OAAQ,SAAS,GAGlCiiB,SAAS,GAChC3lB,EAAWgoB,GAAQlX,EAAe,CAAC,SACjCzJ,EAAUrH,EAASD,OAAS,EAC7BsH,IACHrH,EAAWgoB,GAAQlX,EAAe,CAAC,UAErC9Q,EAASoN,SAAQ,SAAC1J,GAEEskB,GADK3gB,EAAU3D,EAAIiiB,SAAS,IAAMjiB,EAAIiiB,SAAS,IACvB,CAAC,SACjCvY,SAAQ,SAAC1J,GACjB,IAAMoN,EAAOoY,GAAUxlB,GACvB,GAAIoN,EAAM,CAER,IAAM9Q,EAAY8Q,EAAK6U,SAAS,EAAG,IAC9B3lB,EAAUswB,MAAK,SAAC5sB,GAAC,OAAW,IAANA,CAAO,MAChCkW,EAAOL,IAEH,gCAAAlS,EAAU,IAAM,KAAG,qBACA8f,GAAYnnB,GAAiB,OAAAmnB,GAChDxW,IAGJG,EAAKyM,IAAI5M,EAAO,GAEpB,CACF,GACF,GACF,IAGKjN,CACT,CA7CO,CyD/ayCA,EAAa1D,IACzDga,KAAK8vC,iBAAA,CAAkB,EACxBh5C,EAEOo5C,oBAAR,SAA4BxmD,GAC1B,IAAMoN,EAA2BkJ,KAA3BwY,WAAY7hB,EAAeqJ,KAAf6kB,WAClB,GAAgB,MAAXn7B,IAAAA,EAAauhB,WAGhB,OAFAjL,KAAKgwC,gBAAA,OACLhwC,KAAK+vC,cAAA,GAGP,IAAM/pD,EAAYga,KAAK+vC,SAAWvhC,GAAiB9kB,GAG/C1D,EAASggB,QACXlP,EAAaq5C,GACXnqD,EAASggB,MACTrD,IAIA3c,EAASigB,QACXtP,EAAaw5C,GACXnqD,EAASigB,MACTrD,IAIJ,IAAMvV,EAAmB,CAAC,EACtBrH,EAASggB,OAAShgB,EAASigB,MAC7B5Y,EAAO6Y,WAAa,CAClB49B,UAAW,YACX70B,MAAOnY,EAAa,IAAMH,EAC1BkO,YAAAnb,EACAiY,GAAI,QAEG3b,EAASggB,MAClB3Y,EAAO2Y,MAAQ,CACb89B,UAAW,YACX70B,MAAOnY,EACP+N,YAAAnb,EACAiY,GAAI,SAEG3b,EAASigB,MAClB5Y,EAAO4Y,MAAQ,CACb69B,UAAW,YACX70B,MAAOtY,EACPkO,YAAAnb,EACAiY,GAAI,QAGN/B,EAAOzJ,KACL,8EAGJ6J,KAAKgwC,WAAa3iD,CAAA,EACnByJ,EAEM23C,MAAP,SACE/kD,EACAoN,EACAH,EACA3Q,EACAqH,EACAzH,GACe,IAAAgR,EAAAW,EACTpK,EAAyB6S,KAAzB66B,QAASnjC,EAAgBsI,KAAhBiwC,YACTjiD,EAAwB,CAC5BgY,WAAA,EACAC,WAAA,EACAwH,KAAMznB,EACNwnB,IAAK7W,EACLkO,iBAAA,GAMGrQ,EAAgBkD,KACnBA,EAAcsI,KAAKiwC,YAAc5iD,GAAc,GAKjD,IAAMU,EAAO+I,EAAWwY,QACxB,GAAS,MAAJvhB,IAAAA,EAAMhI,OACT,OAAOiI,EAGT,IAAMH,EAA+B,CACnCgtC,aAAA,EACAxsB,UAAW,GAETthB,EAAWiT,KAAK+vC,SAKpB,GAAI,OAJAn5C,EAAC7J,IAAA6J,EAAU7Q,SACbia,KAAKkwC,oBAAoBniD,GACzBhB,EAAWiT,KAAK+vC,UAAA,OAEdx4C,EAACxK,KAAAwK,EAAUxR,OAGb,OADA6Z,EAAOzJ,KAAK,6DACLnI,EAELgS,KAAK8vC,kBACPjiD,EAAY0+B,OAASvsB,KAAKgwC,WAC1BhwC,KAAK8vC,iBAAA,GAGP,IAAMhiD,EzDodH,SAAqBpE,EAAkBoN,GAK5C,IAJA,IAAIH,EAAc,EACd3Q,EAAgB,EAChBqH,EAAgB,EACdzH,EAAQooB,GAAQtkB,EAAM,CAAC,OAAQ,SAC5BkN,EAAI,EAAGA,EAAIhR,EAAMG,OAAQ6Q,IAAK,CACrC,IAAMW,EAAO3R,EAAMgR,GAKbzJ,EAAO6gB,GAAQzW,EAAM,CAAC,SAAS,GAG/BG,EAAQZ,EADH8W,GAAWzgB,EAAM,IAE5B,GAAKuK,EAAL,CAGA,IAAM1J,EAAe0J,EAAMkX,QACrB7gB,EAAY6f,GAAWzgB,EAAM,IAAiB,MAAZa,OAAA,EAAAA,EAAc1H,OAClDuH,EAAqC,MAAAG,OAAA,EAAAA,EAAc0T,SACvC,EAAZ3T,IAKAF,EAAiB+f,GAAWzgB,EAHd,EAAZY,EAGgC,GAGA,IAMtC,IAFA,IAAMhB,EAAY2K,EAAM2W,WAAa,IAC/BvgB,EAAQkgB,GAAQzW,EAAM,CAAC,SACpBwX,EAAI,EAAGA,EAAIjhB,EAAM/H,OAAQgpB,MAChCpY,EAAcwY,GAA8BrhB,EAAMihB,MAC9BlhB,IAElB8I,EAAc9I,EADM+f,GAAW9f,EAAMihB,GAAI,IAGvCrX,EAAM/P,OAASib,EACjB5c,GAAiB2Q,EAAc5J,EACtB2K,EAAM/P,OAASgb,IACxBtV,GAAiBsJ,EAAc5J,EA3BnC,CA8BF,CACA,GAAsB,IAAlB/G,GAAyC,IAAlBqH,EAAqB,CAM9C,IAJA,IAAID,EAAe,IACfI,EAAa,EACb4K,EAAe,EACbI,EAAQwV,GAAQtkB,EAAM,CAAC,SACpBgP,EAAI,EAAGA,EAAIF,EAAMzS,OAAQ2S,IAAK,CACrC,IAAMyD,EAAO8R,GAAkBzV,EAAME,IACrC,GAAQ,MAAJyD,GAAAA,EAAMoS,WAAY,CACpBnhB,EAAekL,KAAK+M,IAClBjY,EACA+O,EAAKiS,yBAA2BjS,EAAKkS,WAEvC,IAAM5R,EAAqBN,EAAKoS,WAAWqI,QACzC,SAACltB,EAAKoN,GAAG,OAAKpN,EAAMoN,EAAI0I,KAAKkC,UAAY,CAAC,GAC1C,GAMFtJ,GAJA5K,EAAa8K,KAAKgN,IAChB9X,EACAiP,EAAqBN,EAAKiS,yBAA2BjS,EAAKkS,YAEhCjhB,CAC9B,CACF,CACA,GAAIgL,GAAgB5D,EAAgB4D,GAClC,OAAOA,CAEX,CACA,OAAIpS,GAGGqH,CACT,CAhFO,CyDpd0BU,EAAMhB,GAC7BgiB,EzD6YH,SACLrlB,EACAoN,GAGA,OAAOkX,GAAQlX,EAAM,CAAC,OAAQ,SAAS8f,QACrC,SAAC9f,EAAuBH,GACtB,IAAM3Q,EAAOgoB,GAAQrX,EAAM,CAAC,SAAS,GAC/BtJ,EAAUrH,EAAK,GACfJ,EAAQooB,GAAQrX,EAAM,CAAC,SAASigB,QACpC,SAAC9f,EAAuBH,GAEtB,IAAM/Q,EAAKgoB,GAAWjX,EAAM,GACtBC,EAAQlN,EAAS9D,GACvB,GAAIgR,EAAO,CACT,IAAIW,EAAWqW,GAAW5nB,EAAM,GAChC,GAAgB,IAAZqH,EAAe,CAIjB,GAAIkK,IAAa6V,GAIf,OAHAxN,EAAOzJ,KAAI,oFAGJW,EAETS,GAAY6V,GAAa,EACzB7V,GAAYqW,GAAW5nB,EAAM,EAC/B,CAEA,IAEMmH,EAAYoK,GAFJX,EAAMyX,WAAa,KAGjC,GACE7Z,EAAgBrH,KACJ,OAAX2J,GAAmB3J,EAAY2J,GAEhC,OAAO3J,CAEX,CACA,OAAO2J,CACR,GACD,MAEF,OACY,OAAVlR,GACA4O,EAAgB5O,KACJ,OAAXkR,GAAmBlR,EAAQkR,GAErBlR,EAEFkR,CACR,GACD,KAEJ,CAvDO,CyD7Y0B/J,EAAUgB,GACjCX,EAA0B,OAAb2hB,EAAoB1hB,EAAa0hB,GA6ExD,SACErlB,EACAoN,EACAH,EACA3Q,GAEA,GAAgB,OAAZ0D,EACF,OAAO,EAGT,IAAM2D,EAAciL,KAAKgN,IAAItf,EAAU,GACjCJ,EAAYkR,EAAWpN,EAAQq4C,SAAWr4C,EAAQ2kB,UACxD,OAAO/V,KAAKC,IAAI3S,EAAY+Q,GAActJ,CAC5C,CAbA,CA3EuBF,EAASC,EAAYC,EAAYS,IACjDD,EAAYwgB,YAAclhB,EAAQkhB,WAAazoB,KAEhDiI,EAAYgtC,QAAUztC,EAAaC,EAC/BF,GAAiC,IAAtBA,EAAQkhB,WACrBzO,EAAOzJ,KAAI,yBACetI,EAAYgtC,QAAU1tC,EAAQ40C,WAG1D/hC,KAAK66B,QAAU1tC,EAAU,CACvB40C,SAAUl0C,EAAYgtC,QACtBxsB,UAAW,IAIf,IAAM7gB,EAAY9D,EACd0D,EAAaD,EAAQ40C,SAAW50C,EAAQkhB,UACvC3W,EACCU,EAAU5K,EAAYM,GzD2kBzB,SACLpE,EACAoN,EACAH,GAEAqX,GAAQlX,EAAM,CAAC,OAAQ,SAAS1D,SAAQ,SAAC0D,GACvCkX,GAAQlX,EAAM,CAAC,SAAS1D,SAAQ,SAACpN,GAE/B,IAAMqH,EAAKugB,GAAW5nB,EAAM,GACtBJ,EAAQ8D,EAAS2D,GACvB,GAAKzH,EAAL,CAIA,IAAMgR,EAAYhR,EAAMyoB,WAAa,IAErCL,GAAQlX,EAAM,CAAC,SAAS1D,SAAQ,SAAC1J,GAC/B,IAAMoN,EAAUpN,EAAK,GACf1D,EAAS2Q,EAAaC,EAC5B,GAAI5Q,EAAQ,CACV,IAAIqH,EAAsBugB,GAAWlkB,EAAM,GAC3C,GAAgB,IAAZoN,EACFzJ,GAAuBrH,EAEvB+nB,GAAYrkB,EAAM,EADlB2D,EAAsBiL,KAAKgN,IAAIjY,EAAqB,QAE/C,CACLA,GAAuBiL,KAAK+U,IAAI,EAAG,IACnChgB,GAAuBugB,GAAWlkB,EAAM,GACxC2D,GAAuBrH,EACvBqH,EAAsBiL,KAAKgN,IAAIjY,EAAqB,GACpD,IAAMzH,EAAQ0S,KAAK2Q,MAAM5b,GAAuB+f,GAAa,IACvD7V,EAAQe,KAAK2Q,MAAM5b,GAAuB+f,GAAa,IAC7DW,GAAYrkB,EAAM,EAAG9D,GACrBmoB,GAAYrkB,EAAM,EAAG6N,EACvB,CACF,CACF,GAxBA,CAyBF,GACF,GACF,CAvCO,CyD1kBYxK,EAAUgB,EAAMZ,EAAQ40C,SAAW50C,EAAQkhB,WAEtDvgB,EAAW,EACbkS,KAAKiwC,YAAc73C,GAEnBwH,EAAOzJ,KAAK,wDACZ6J,KAAKsuC,sBAGP,IAAM91C,IAAazL,EAASiZ,MACtBtN,IAAa3L,EAASkZ,MAExB9J,EAAY,GACZ3D,IACF2D,GAAQ,SAGNzD,IACFyD,GAAQ,SAGV,IAAMM,EAAsB,CAC1B4hC,MAAOtwC,EACPoW,SAAU3W,EACV6W,SAAU7W,EACV4W,OAAQhM,EACRkM,OAAQlM,EACRzQ,KAAAwU,EACAmzC,SAAA92C,EACA+2C,SAAA72C,EACA82C,GAAI,EACJhR,QAAS,GAqBX,OAlBAxwC,EAAOgY,MAAuB,UAAfvJ,EAAM9U,KAAmB8U,OAAA,EACxCzO,EAAOiY,MAAuB,UAAfxJ,EAAM9U,KAAmB8U,OAAA,EACxCzO,EAAO6W,YAAchX,EACrBG,EAAOwf,IAAMwhC,GACXr4C,EACAtJ,EACAF,EACAA,GAGEnH,EAAUspB,QAAQvpB,SACpBiI,EAAOyf,KAAOwhC,GACZjpD,EACAqH,EACAF,IAIGa,CAAA,EACRtE,CAAA,CApNqB,GAsOxB,SAASymD,GACPzmD,EACAoN,GAEA,IAAMH,EAAc,MAAAjN,OAAA,EAAAA,EAAOulB,MAC3B,GAAItY,GAAeA,EAAY5Q,OAAS,EACtC,OAAO4Q,EAET,GAAIG,IAAS6L,EAA6B,CACxC,GACkB,SAAhBhM,GACgB,SAAhBA,GACgB,SAAhBA,EAEA,OAAOA,EAET,GAAoB,SAAhBA,GAA0C,SAAhBA,EAG5B,OAAOogB,GAAuBpgB,GAAA,GAEhC,IAAM3Q,EAAS,YAIf,OAHA4Z,EAAOJ,KAAI,uBACc7I,EAAyD,8CAAA3Q,EAAA,KAE3EA,CACT,CAIA,OADA4Z,EAAOzJ,KAA+B,0BAAAQ,EAAA,KAClB,SAAhBA,GAA0C,SAAhBA,EACrB,mBAEW,SAAhBA,EACK,gBAEF,aACT,CDtRA,IACEi5C,GAAMlwC,KAAKoe,YAAY1U,IAAIxf,KAAK8V,KAAKoe,YACvC,CAAE,MAAOp0B,GACPkW,EAAON,MAAM,qDACbswC,GAAkB,MAAZlmC,OAAA,EAAAA,EAAcnI,KAAK6H,GAC3B,CASA,IAAMgnC,GAAyB,CAC7B,CAAE5O,MAAO0C,GAAYuK,MAAOoB,IAC5B,CAAErO,MAAOoG,GAAW6G,MAAOb,IAC3B,CAAEpM,MAAOoC,GAAY6K,MAAOb,IAC5B,CAAEpM,MAAOmI,GAAY8E,MAAOb,KAI5BwC,GAAUl/B,OAAO,EAAG,EAAG,CAAEswB,MAAO39B,GAAY4qC,MAAOb,KACpD,IAEoByC,GAAU,WAe7B,SAAA3mD,EACEA,EACAoN,EACAH,EACA3Q,EACAqH,GACA,KApBKijD,OAAA,EAAsB,KACrBzM,cAAA,EAAQ,KACRgE,mBAAA,EAAa,KACbp4C,YAAA,EAAM,KACN8gD,YAAA,EAAM,KACN5uC,QAAA,EAAE,KACF6uC,aAAA,EAAO,KACPC,aAAA,EAAO,KACP7V,eAAA,EAAS,KACToJ,WAAA,EAAK,KACL0M,kBAAsD,KAAI,KAC1DC,oBAAA,EAAc,KACdC,0BAAA,EASN5wC,KAAK6jC,SAAWn6C,EAChBsW,KAAK6nC,cAAgB/wC,EACrBkJ,KAAKvQ,OAASkH,EACdqJ,KAAKuwC,OAASvqD,EACdga,KAAK2B,GAAKtU,CACZ,CAAC,IAAAyJ,EAAApN,EAAAjD,UAkYA,OAlYAqQ,EAED+5C,UAAA,SAAUnnD,GACRsW,KAAK2wC,eAAiBjnD,EAClBsW,KAAK46B,WACP56B,KAAK46B,UAAUlC,OAAA,EAElB5hC,EAED2T,KAAA,SACE/gB,EACAoN,EACAH,EACA3Q,GAC8C,IAAAqH,EAAA,KACxCzH,EAAQ+Q,EAAUk+B,YACxBjvC,EAAMkvC,aAAe8a,KAErB,IAAIh5C,EAAuB,IAAIyJ,WAAW3W,GAClC6N,EAAyCyI,KAAzC4wC,qBAAsBzjD,EAAmB6S,KAAnB2wC,eAC1B3qD,IACFga,KAAK4wC,qBAAuB5qD,GAG9B,IAAA0R,EAOI1R,GAASuR,EANXvJ,EAAU0J,EAAVo5C,WACA/iD,EAAa2J,EAAbq5C,cACAljD,EAAW6J,EAAXs5C,YACAjkD,EAAkB2K,EAAlBu5C,mBACAnjD,EAAU4J,EAAVysC,WACAp1B,EAAiBrX,EAAjBw5C,kBAGA9jD,EAKED,EALFqrB,WACAhrB,EAIEL,EAJF03B,WACArwB,EAGErH,EAHFgkD,eACA/4C,EAEEjL,EAFFuU,SACAlJ,EACErL,EADFikD,gBAGIhyC,EA6VV,SACE1V,EACAoN,GAEA,IAAIH,EAAiC,KASrC,OAPEjN,EAAKuhB,WAAa,GACE,OAAT,MAAXnU,OAAA,EAAAA,EAAajQ,MACM,OAAnBiQ,EAAY+Z,IACU,MAAtB/Z,EAAYnF,SAEZgF,EAAiBG,GAEZH,CACT,CAdA,CA7VsCC,EAAUE,GAC5C,GAAIsI,GAA8B,YAAnBA,EAAQzN,OAAsB,CAC3C,IAAM3E,EAAYgT,KAAKqxC,eAEvB,IAAIrkD,EAAUwrC,SAgCZ,OAbAx4B,KAAK0wC,kBAAoB1jD,EACtB6rC,iBAAiBjiC,EAAUwI,EAAQvY,IAAIkkB,OAAQ3L,EAAQyR,GAAG9F,QAC1D2hB,MAAK,SAAChjC,GAGL,IAAMoN,EAASzJ,EAAKod,KAClB/gB,EACA,KACAiN,GAGF,OADAtJ,EAAKqjD,kBAAoB,KAClB55C,CACT,IACKkJ,KAAK0wC,kBA7BZ,IAAI7qD,EAAgBmH,EAAU4rC,gBAC5BhiC,EACAwI,EAAQvY,IAAIkkB,OACZ3L,EAAQyR,GAAG9F,QAOb,GAJqBpU,EAAUqmB,MAAQ,IAErCn3B,EAAgBmH,EAAUyrC,UAEvB5yC,EAEH,OADAD,EAAMmvC,WAAa6a,KACZ0B,GAAY36C,GAErBC,EAAW,IAAIyJ,WAAWxa,EAiB9B,CAEA,IAAM8Z,EAAcK,KAAKuxC,aAAaxjD,EAAeF,GACrD,GAAI8R,EAAa,CACf,IAAMF,EAAQO,KAAKwxC,oBAAoB56C,GACvC,GAAI6I,EAUF,OATAG,EAAOzJ,KAAI,gBAAiBsJ,EAAM7J,SAClCoK,KAAK6jC,SAASpB,KAAK/pC,EAAOkD,MAAOlD,EAAOkD,MAAO,CAC7CjU,KAAMwU,EAAWE,YACjB4gB,QAASxgB,EAAa2B,mBACtBugB,OAAA,EACAzpB,MAAAuK,EACAmf,OAAQnf,EAAM7J,UAEhBhQ,EAAMmvC,WAAa6a,KACZ0B,GAAY36C,EAEvB,EAEI5I,GAAiBF,GAAekhB,GAAqBpP,IACvDK,KAAKmhC,iBACH3oC,EACApL,EACAI,EACA4K,EACAtB,IAIA/I,GAAiBghB,GAAqBpP,IACxCK,KAAKyxC,sBAAsBj9C,GAGxBxG,GACHgS,KAAKqhC,kBAGP,IAAMxhC,EAASG,KAAK0xC,SAClB96C,EACAwI,EACAtR,EACAf,EACA4J,GAEImJ,EAAeE,KAAK4wC,qBAO1B,OALA9wC,EAAagxC,YAAA,EACbhxC,EAAaixC,eAAA,EACbjxC,EAAakxC,aAAA,EAEbprD,EAAMmvC,WAAa6a,KACZ/vC,CACT,EAEA/I,EACA2hC,MAAA,SACE/uC,GACkD,IAAAoN,EAAA,KAC5CH,EAAQjN,EAAUmrC,YACxBl+B,EAAMm+B,aAAe8a,KAErB,IAAQ5pD,EAAuDga,KAAvD46B,UAAWvtC,EAA4C2S,KAA5C4wC,qBAAsBhrD,EAAsBoa,KAAtB0wC,kBAEzC,GAAI9qD,EAGF,OAAOA,EAAkB8mC,MAAK,WAC5B,OAAO51B,EAAK2hC,MAAM/uC,EACpB,IAGF,IAAMkN,EAAsC,GACpCW,EAAelK,EAAf82C,WACR,GAAIn+C,EAAW,CAIb,IAAMmH,EAAgBnH,EAAUyyC,QAC5BtrC,GAEFyJ,EAAgB6T,KACdzK,KAAKyK,KAAKtd,EAAe,KAAMzD,GAGrC,CAEA,IAAQgO,EAAqBsI,KAArBwwC,QAASxiD,EAAYgS,KAAZywC,QACjB,IAAK/4C,IAAY1J,EAGf,OADA2I,EAAMo+B,WAAa6a,KACZ,CAAC0B,GAAY5nD,IAGtB,IAAMqE,EAAuB2J,EAAQ+gC,MAAMlhC,GAC3C,OAAIo6C,GAAU5jD,GAELA,EAAqB2+B,MAAK,SAAC/1B,GAEhC,OADAG,EAAK86C,WAAWh7C,EAAiBD,EAAajN,GACvCkN,CACT,KAGFoJ,KAAK4xC,WAAWh7C,EAAiB7I,EAAsBrE,GAChDkN,EAAA,EACRE,EAEO86C,WAAR,SACEloD,EACAoN,EACAH,GAEA,IAAQ3Q,EAAgD8Q,EAAhD6qC,WAAYt0C,EAAoCyJ,EAApC8qC,WAAYh8C,EAAwBkR,EAAxBmqB,SAAUrqB,EAAcE,EAAd+qC,UAC1CtqC,EAA2CyI,KAAK4wC,qBAAxCzjD,EAAkBoK,EAAlB05C,mBAAoBv5C,EAAUH,EAAV4sC,WAC5BvkC,EAAOL,IAAG,qCAC6B5I,EAAUkN,IAC7ClN,EAAUqmB,MAAQ,EAAI,OAASrmB,EAAUqmB,KAAO,IACrC,aAAArmB,EAAUsN,OAEzB,IAAMjW,EAAcgS,KAAKywC,QAAShC,MAChCzoD,EACAqH,EACAzH,EACAgR,EACAc,EACAvK,GAAA,EAEA6S,KAAK2B,IAEPjY,EAAgB+gB,KAAK,CACnBonC,YAAA7jD,EACAuwC,UAAA5nC,IAGFA,EAAUk+B,YAAYE,WAAa6a,IAAA,EACpC94C,EAED26C,sBAAA,SAAsB/nD,GACpB,IAAQoN,EAAqBkJ,KAArBwwC,QAAS75C,EAAYqJ,KAAZywC,QACZ35C,GAAYH,IAGjBG,EAAQsqC,eAAe13C,GACvBiN,EAAQyqC,eAAe13C,GAAA,EACxBoN,EAEDuqC,gBAAA,WACE,IAAQ33C,EAAqBsW,KAArBwwC,QAAS15C,EAAYkJ,KAAZywC,QACZ/mD,GAAYoN,IAGjBpN,EAAQ23C,kBACRvqC,EAAQw3C,qBAAA,EACTx3C,EAEDqqC,iBAAA,SACEz3C,EACAoN,EACAH,EACA3Q,EACAqH,GAEA,IAAQzH,EAAqBoa,KAArBwwC,QAAS55C,EAAYoJ,KAAZywC,QACZ7qD,GAAYgR,IAGjBhR,EAAQu7C,iBACNz3C,EACAoN,EACAH,EACA3Q,GAEF4Q,EAAQuqC,iBACNz3C,EACAoN,EACAH,EACAtJ,GAAA,EAEHyJ,EAED2lB,QAAA,WACMzc,KAAKwwC,UACPxwC,KAAKwwC,QAAQ/zB,UACbzc,KAAKwwC,aAAA,GAEHxwC,KAAKywC,UACPzwC,KAAKywC,QAAQh0B,UACbzc,KAAKywC,aAAA,EAAU,EAElB35C,EAEO46C,SAAR,SACEhoD,EACAoN,EACAH,EACA3Q,EACAqH,GAmBA,OAhBIyJ,GAA8B,eAAnBA,EAAQnF,OACZqO,KAAK8xC,kBACZpoD,EACAoN,EACAH,EACA3Q,EACAqH,GAGO2S,KAAK+xC,oBACZroD,EACAiN,EACA3Q,EACAqH,EAAA,EAILyJ,EAEOi7C,oBAAR,SACEroD,EACAoN,EACAH,EACA3Q,GAEA,IAAAqH,EACE2S,KAAKwwC,QACLhP,MAAM93C,EAAMoN,GAAA,GAAoBkJ,KAAKvQ,OAAOsuC,aAFtCn4C,EAAUyH,EAAVs0C,WAAY/qC,EAAUvJ,EAAVu0C,WAAYrqC,EAAQlK,EAAR4zB,SAAU9zB,EAASE,EAATw0C,UAa1C,MAAO,CACLgQ,YAXkB7xC,KAAKywC,QAAShC,MAChC7oD,EACAgR,EACAW,EACApK,EACA2J,EACAH,GAAA,EAEAqJ,KAAK2B,IAIL48B,UAAAv4C,EAAA,EAEH8Q,EAEOg7C,kBAAR,SACEpoD,EACAoN,EACAH,EACA3Q,EACAqH,GAC2B,IAAAzH,EAAA,KAC3B,OAAQoa,KAAKwwC,QACV1O,eAAep4C,EAAMoN,EAAaH,GAClC+1B,MAAK,SAAChjC,GAWL,MAAO,CACLmoD,YAXkBjsD,EAAK6qD,QAAShC,MAChC/kD,EAAYi4C,WACZj4C,EAAYk4C,WACZl4C,EAAYu3B,SACZv3B,EAAYm4C,UACZlrC,EACA3Q,GAAA,EAEAJ,EAAK+b,IAIL48B,UAAAlxC,EAEJ,KACHyJ,EAEO06C,oBAAR,SAA4B9nD,GAI1B,IAHA,IAEIoN,EAFIH,EAA4CqJ,KAA5CvQ,OAAQzJ,EAAoCga,KAApC6jC,SAAUx2C,EAA0B2S,KAA1B6nC,cAAejiD,EAAWoa,KAAXuwC,OAGhC35C,EAAI,EAAGW,EAAM64C,GAAUrqD,OAAQ6Q,EAAIW,EAAKX,IAAK,KAAAzJ,EACpD,GAAsB,OAAtBA,EAAIijD,GAAUx5C,GAAG4qC,QAAbr0C,EAAoB62C,MAAMt6C,GAAO,CACnCoN,EAAMs5C,GAAUx5C,GAChB,KACF,CACF,CACA,IAAKE,EACH,OAAO,IAAII,MAAM,mDAGnB,IAAMQ,EAAUsI,KAAKwwC,QACfxiD,EAAUgS,KAAKywC,QACf1iD,EAA8B+I,EAAI23C,MAClC5gD,EAA8BiJ,EAAI0qC,MACnCxzC,GAAaA,aAAmBD,IACnCiS,KAAKywC,QAAU,IAAI1iD,EAAQ/H,EAAU2Q,EAAQtJ,EAAezH,IAEzD8R,GAAaA,aAAmB7J,IACnCmS,KAAKwwC,QAAU,IAAI3iD,EAAQ7H,EAAU2Q,EAAQtJ,GAC7C2S,KAAKgkC,MAAQn2C,EAAQm2C,MAAA,EAExBltC,EAEOy6C,aAAR,SAAqB7nD,EAAwBoN,GAG3C,OAAQkJ,KAAKwwC,UAAYxwC,KAAKywC,SAAW/mD,GAAiBoN,CAAA,EAC3DA,EAEOu6C,aAAR,WACE,IAAI3nD,EAAYsW,KAAK46B,UAIrB,OAHKlxC,IACHA,EAAYsW,KAAK46B,UAAY,IAAIhD,GAAU53B,KAAKvQ,SAE3C/F,CAAA,EACRA,CAAA,CA7Z4B,GAgbzB4nD,GAAc,SAAC5nD,GAAS,MAAwB,CACpDmoD,YAAa,CAAE,EACftT,UAAA70C,EACD,EAEM,SAASioD,GAAajoD,GAC3B,MAAO,SAAUA,GAAKA,EAAEgjC,gBAAgBslB,QAC1C,CAEA,IAAaC,GAOX,SACEvoD,EACAoN,EACAH,EACA3Q,EACAqH,GACA,KAZKmrB,gBAAA,EAAU,KACVqM,gBAAA,EAAU,KACVusB,qBAAA,EAAe,KACf1vC,cAAA,EAAQ,KACRyvC,oBAAA,EASLnxC,KAAKwY,WAAa9uB,EAClBsW,KAAK6kB,WAAa/tB,EAClBkJ,KAAKoxC,gBAAkBz6C,EACvBqJ,KAAK0B,SAAW1b,EAChBga,KAAKmxC,eAAiB9jD,GAAkB,IAC1C,EAGW6kD,GAQX,SACExoD,EACAoN,EACAH,EACA3Q,EACAqH,EACAzH,GACA,KAdKmrD,mBAAA,EAAa,KACbD,gBAAA,EAAU,KACVG,wBAAA,EAAkB,KAClBD,iBAAA,EAAW,KACX7M,gBAAA,EAAU,KACV+M,uBAAA,EAULlxC,KAAK+wC,cAAgBrnD,EACrBsW,KAAK8wC,WAAah6C,EAClBkJ,KAAKixC,mBAAqBt6C,EAC1BqJ,KAAKgxC,YAAchrD,EACnBga,KAAKmkC,WAAa92C,EAClB2S,KAAKkxC,kBAAoBtrD,CAC3B,EAAAusD,GAAA,CAAAzsD,QAAA,cAAAgE,GEnhBF,IAAIoN,EAAMtQ,OAAOC,UAAUE,eACvBgQ,EAAS,IASb,SAAS3Q,IAAW,CA4BpB,SAASqH,EAAG3D,EAAIoN,EAASH,GACvBqJ,KAAK4nC,GAAKl+C,EACVsW,KAAK9V,QAAU4M,EACfkJ,KAAKoyC,KAAOz7C,IAAA,CACb,CAaD,SAAS/Q,EAAY8D,EAASoN,EAAO9Q,EAAIJ,EAASgR,GAChD,GAAkB,mBAAP5Q,EACT,MAAM,IAAIqsD,UAAU,mCAGtB,IAAI96C,EAAW,IAAIlK,EAAGrH,EAAIJ,GAAW8D,EAASkN,GAC1CzJ,EAAMwJ,EAASA,EAASG,EAAQA,EAMpC,OAJKpN,EAAQ4oD,QAAQnlD,GACXzD,EAAQ4oD,QAAQnlD,GAAKy6C,GAC1Bl+C,EAAQ4oD,QAAQnlD,GAAO,CAACzD,EAAQ4oD,QAAQnlD,GAAMoK,GADhB7N,EAAQ4oD,QAAQnlD,GAAKsd,KAAKlT,IADlC7N,EAAQ4oD,QAAQnlD,GAAOoK,EAAU7N,EAAQ6oD,gBAI7D7oD,CACR,CASD,SAASkN,EAAWlN,EAASoN,GACI,KAAzBpN,EAAQ6oD,aAAoB7oD,EAAQ4oD,QAAU,IAAItsD,SAC5C0D,EAAQ4oD,QAAQx7C,EAC7B,CASD,SAASS,IACPyI,KAAKsyC,QAAU,IAAItsD,EACnBga,KAAKuyC,aAAe,CACrB,CAzEG/rD,OAAO8D,SACTtE,EAAOS,UAAYD,OAAO8D,OAAO,OAM5B,IAAItE,GAASwsD,YAAW77C,GAAA,IA2E/BY,EAAa9Q,UAAUgsD,WAAa,WAClC,IACI/oD,EACA1D,EAFAqH,EAAQ,GAIZ,GAA0B,IAAtB2S,KAAKuyC,aAAoB,OAAOllD,EAEpC,IAAKrH,KAAS0D,EAASsW,KAAKsyC,QACtBx7C,EAAIlQ,KAAK8C,EAAQ1D,IAAOqH,EAAMod,KAAK9T,EAAS3Q,EAAKoa,MAAM,GAAKpa,GAGlE,OAAIQ,OAAOqC,sBACFwE,EAAM/D,OAAO9C,OAAOqC,sBAAsBa,IAG5C2D,CACT,EASAkK,EAAa9Q,UAAUisD,UAAY,SAAmBhpD,GACpD,IAAIoN,EAAMH,EAASA,EAASjN,EAAQA,EAChC1D,EAAWga,KAAKsyC,QAAQx7C,GAE5B,IAAK9Q,EAAU,MAAO,GACtB,GAAIA,EAAS4hD,GAAI,MAAO,CAAC5hD,EAAS4hD,IAElC,IAAK,IAAIv6C,EAAI,EAAGzH,EAAII,EAASD,OAAQ6Q,EAAK,IAAI1Q,MAAMN,GAAIyH,EAAIzH,EAAGyH,IAC7DuJ,EAAGvJ,GAAKrH,EAASqH,GAAGu6C,GAGtB,OAAOhxC,CACT,EASAW,EAAa9Q,UAAUksD,cAAgB,SAAuBjpD,GAC5D,IAAIoN,EAAMH,EAASA,EAASjN,EAAQA,EAChC1D,EAAYga,KAAKsyC,QAAQx7C,GAE7B,OAAK9Q,EACDA,EAAU4hD,GAAW,EAClB5hD,EAAUD,OAFM,CAGzB,EASAwR,EAAa9Q,UAAUg8C,KAAO,SAAc/4C,EAAOoN,EAAI9Q,EAAIqH,EAAIzH,EAAIgR,GACjE,IAAIW,EAAMZ,EAASA,EAASjN,EAAQA,EAEpC,IAAKsW,KAAKsyC,QAAQ/6C,GAAM,OAAO,EAE/B,IAEIpK,EACAuK,EAHA1J,EAAYgS,KAAKsyC,QAAQ/6C,GACzBxJ,EAAM/F,UAAUjC,OAIpB,GAAIiI,EAAU45C,GAAI,CAGhB,OAFI55C,EAAUokD,MAAMpyC,KAAK4yC,eAAelpD,EAAOsE,EAAU45C,QAAA,GAAI,GAErD75C,GACN,KAAK,EAAG,OAAOC,EAAU45C,GAAGhhD,KAAKoH,EAAU9D,UAAA,EAC3C,KAAK,EAAG,OAAO8D,EAAU45C,GAAGhhD,KAAKoH,EAAU9D,QAAS4M,IAAA,EACpD,KAAK,EAAG,OAAO9I,EAAU45C,GAAGhhD,KAAKoH,EAAU9D,QAAS4M,EAAI9Q,IAAA,EACxD,KAAK,EAAG,OAAOgI,EAAU45C,GAAGhhD,KAAKoH,EAAU9D,QAAS4M,EAAI9Q,EAAIqH,IAAA,EAC5D,KAAK,EAAG,OAAOW,EAAU45C,GAAGhhD,KAAKoH,EAAU9D,QAAS4M,EAAI9Q,EAAIqH,EAAIzH,IAAA,EAChE,KAAK,EAAG,OAAOoI,EAAU45C,GAAGhhD,KAAKoH,EAAU9D,QAAS4M,EAAI9Q,EAAIqH,EAAIzH,EAAIgR,IAAA,EAGtE,IAAKc,EAAI,EAAGvK,EAAO,IAAIjH,MAAM6H,EAAK,GAAI2J,EAAI3J,EAAK2J,IAC7CvK,EAAKuK,EAAI,GAAK1P,UAAU0P,GAG1B1J,EAAU45C,GAAGx8B,MAAMpd,EAAU9D,QAASiD,EAC1C,KAAS,CACL,IACIU,EADAd,EAASiB,EAAUjI,OAGvB,IAAK2R,EAAI,EAAGA,EAAI3K,EAAQ2K,IAGtB,OAFI1J,EAAU0J,GAAG06C,MAAMpyC,KAAK4yC,eAAelpD,EAAOsE,EAAU0J,GAAGkwC,QAAA,GAAI,GAE3D75C,GACN,KAAK,EAAGC,EAAU0J,GAAGkwC,GAAGhhD,KAAKoH,EAAU0J,GAAGxN,SAAU,MACpD,KAAK,EAAG8D,EAAU0J,GAAGkwC,GAAGhhD,KAAKoH,EAAU0J,GAAGxN,QAAS4M,GAAK,MACxD,KAAK,EAAG9I,EAAU0J,GAAGkwC,GAAGhhD,KAAKoH,EAAU0J,GAAGxN,QAAS4M,EAAI9Q,GAAK,MAC5D,KAAK,EAAGgI,EAAU0J,GAAGkwC,GAAGhhD,KAAKoH,EAAU0J,GAAGxN,QAAS4M,EAAI9Q,EAAIqH,GAAK,MAChE,QACE,IAAKF,EAAM,IAAKU,EAAI,EAAGV,EAAO,IAAIjH,MAAM6H,EAAK,GAAIF,EAAIE,EAAKF,IACxDV,EAAKU,EAAI,GAAK7F,UAAU6F,GAG1BG,EAAU0J,GAAGkwC,GAAGx8B,MAAMpd,EAAU0J,GAAGxN,QAASiD,GAGnD,CAED,OAAO,CACT,EAWAoK,EAAa9Q,UAAUq1B,GAAK,SAAYpyB,EAAOoN,EAAIH,GACjD,OAAO/Q,EAAYoa,KAAMtW,EAAOoN,EAAIH,GAAA,EACtC,EAWAY,EAAa9Q,UAAU2rD,KAAO,SAAc1oD,EAAOoN,EAAIH,GACrD,OAAO/Q,EAAYoa,KAAMtW,EAAOoN,EAAIH,GAAA,EACtC,EAYAY,EAAa9Q,UAAUmsD,eAAiB,SAAwBlpD,EAAOoN,EAAI9Q,EAASqH,GAClF,IAAIzH,EAAM+Q,EAASA,EAASjN,EAAQA,EAEpC,IAAKsW,KAAKsyC,QAAQ1sD,GAAM,OAAOoa,KAC/B,IAAKlJ,EAEH,OADAF,EAAWoJ,KAAMpa,GACVoa,KAGT,IAAIzI,EAAYyI,KAAKsyC,QAAQ1sD,GAE7B,GAAI2R,EAAUqwC,GAEVrwC,EAAUqwC,KAAO9wC,GACfzJ,IAAQkK,EAAU66C,MAClBpsD,GAAWuR,EAAUrN,UAAYlE,GAEnC4Q,EAAWoJ,KAAMpa,OAEd,CACL,IAAK,IAAIuH,EAAI,EAAGuK,EAAS,GAAI1J,EAASuJ,EAAUxR,OAAQoH,EAAIa,EAAQb,KAEhEoK,EAAUpK,GAAGy6C,KAAO9wC,GACnBzJ,IAASkK,EAAUpK,GAAGilD,MACtBpsD,GAAWuR,EAAUpK,GAAGjD,UAAYlE,IAErC0R,EAAO+S,KAAKlT,EAAUpK,IAOtBuK,EAAO3R,OAAQia,KAAKsyC,QAAQ1sD,GAAyB,IAAlB8R,EAAO3R,OAAe2R,EAAO,GAAKA,EACpEd,EAAWoJ,KAAMpa,EACvB,CAED,OAAOoa,IACT,EASAzI,EAAa9Q,UAAUosD,mBAAqB,SAA4BnpD,GACtE,IAAIoN,EAUJ,OARIpN,GACFoN,EAAMH,EAASA,EAASjN,EAAQA,EAC5BsW,KAAKsyC,QAAQx7C,IAAMF,EAAWoJ,KAAMlJ,KAExCkJ,KAAKsyC,QAAU,IAAItsD,EACnBga,KAAKuyC,aAAe,GAGfvyC,IACT,EAKAzI,EAAa9Q,UAAU21B,IAAM7kB,EAAa9Q,UAAUmsD,eACpDr7C,EAAa9Q,UAAUqsD,YAAcv7C,EAAa9Q,UAAUq1B,GAK5DvkB,EAAaw7C,SAAWp8C,EAKxBY,EAAay7C,aAAez7C,EAM1B7N,EAAAhE,QAAiB6R,CAAA,CFuMjB,CEvMiB46C,IAAA,IAAAc,qGAAAlkC,CAAAojC,GAAAzsD,SChNnB,SAASwtD,GACPxpD,EACAoN,GAEA,MAgDqBH,EAhDHG,EAAe+6C,aAkDlB7rC,OACZrP,EAAYsP,OACZtP,EAAY8W,MACZ9W,EAAY6W,KACZ7W,EAAYkO,aArDb,OAAO,EA+CX,IAAuBlO,EA7Cf3Q,EAAmC,GACzCqH,EAAyByJ,EAAe+6C,YAAhCjsD,EAAKyH,EAAL2Y,MAAOpP,EAAKvJ,EAAL4Y,MAWf,OAVIrgB,GACFutD,GAAkBntD,EAAcJ,GAE9BgR,GACFu8C,GAAkBntD,EAAc4Q,GAElClN,EAAK0pD,YACH,CAAEhT,MAAO,mBAAoBtwC,KAAMgH,GACnC9Q,IAAA,CAGJ,CAIA,SAASmtD,GACPzpD,EACAoN,GAEIA,EAAMunC,OACR30C,EAAa+gB,KAAK3T,EAAMunC,MAAMtzB,QAE5BjU,EAAMwnC,OACR50C,EAAa+gB,KAAK3T,EAAMwnC,MAAMvzB,OAElC,CAEA,SAASsoC,GACP3pD,EACAoN,EACAH,GAEeG,EAAQ8f,QACrB,SAAC9f,EAAQH,GAAM,OAAKu8C,GAAqBxpD,EAAMiN,IAAWG,CAAM,QAKhEpN,EAAK0pD,YAAY,CAAEhT,MAAO,mBAAoBtwC,KAAMgH,EAAQ,KAE9DpN,EAAK0pD,YAAY,CAAEhT,MAAO,QAAStwC,KAAM6G,GAC3C,UAxKWG,GAAiCA,GAI5C,SAAqBpN,GACnB,IAAMoN,EAAW,IAAIm8C,GACft8C,EAAiB,SAACG,EAAIH,GAC1BjN,EAAK0pD,YAAY,CAAEhT,MAAOtpC,EAAIhH,KAAM6G,GAAA,EAItCG,EAASglB,GAAGpjB,EAAOwC,eAAgBvE,GACnCG,EAASglB,GAAGpjB,EAAOkD,MAAOjF,GAgB1BjN,EAAKgK,iBAAiB,WAAW,SAACrG,GAChC,IAAMzH,EAAOyH,EAAGyC,KAChB,OAAQlK,EAAK0tD,KACX,IAAK,OACH,IAAM18C,EAAS8pB,KAAK/F,MAAM/0B,EAAK6J,QAC/B/F,EAAKswC,WAAa,IAAIqW,GACpBv5C,EACAlR,EAAKiiD,cACLjxC,EACA,GACAhR,EAAK+b,IAEPlC,EAAW7I,EAAO0I,MAAO1Z,EAAK+b,IAzBV,WAAM,IAAAjY,EAAA,SAAAA,GAS5BkW,EAAOlW,GAPoB,SAACoN,GAC1BH,EAAe,YAAa,CAC1B48C,QAAS7pD,EACTkM,QAAAkB,GAAA,CAIY,EARlB,IAAK,IAAMA,KAAS8I,EAAMlW,EAAAoN,EAAA,CAyBtB9Q,GACA2Q,EAAe,OAAQ,MACvB,MAEF,IAAK,YACHjN,EAAKswC,WAAW6W,UAAUjrD,EAAK6J,QAC/B,MAEF,IAAK,QACH,IAAM8H,EACJ7N,EAAKswC,WAAWvvB,KACd7kB,EAAKkK,KACLlK,EAAKkwC,YACLlwC,EAAK24C,UACL34C,EAAKy1C,OAELsW,GAAUp6C,IACZ7N,EAAKswC,WAAWsW,OAAA,EAChB/4C,EACGm1B,MAAK,SAAC51B,GACLo8C,GAAqBxpD,EAAMoN,EAC7B,IACC61B,OAAM,SAACjjC,GACNiN,EAAe+B,EAAOkD,MAAO,CAC3BjU,KAAMwU,EAAWE,YACjB4gB,QAASxgB,EAAa2B,mBACtBmgC,UAAW34C,EAAK24C,UAChB5f,OAAA,EACAzpB,MAAAxL,EACA+H,IAAK/H,EACLk1B,OAAM,gCAEV,MAEFl1B,EAAKswC,WAAWsW,OAAA,EAChB4C,GAAqBxpD,EAAM6N,IAE7B,MAEF,IAAK,QACH,IAAMpK,EAAKvH,EAAK24C,UACZ7mC,EAAiBhO,EAAKswC,WAAWvB,MAAMtrC,GACxBwkD,GAAUj6C,IACXhO,EAAKswC,WAAWsW,OAC3BqB,GAAUj6C,KACbA,EAAiBzM,QAAQyE,QAAQgI,IAEnCA,EACGg1B,MAAK,SAAC51B,GACLu8C,GAAkB3pD,EAAMoN,EAAoC3J,EAC9D,IACCw/B,OAAM,SAACjjC,GACNiN,EAAe+B,EAAOkD,MAAO,CAC3BjU,KAAMwU,EAAWE,YACjB4gB,QAASxgB,EAAa2B,mBACtBmgC,UAAW34C,EAAK24C,UAChB5f,OAAA,EACAzpB,MAAAxL,EACA+H,IAAK/H,EACLk1B,OAAM,iCAEV,KAEFy0B,GACE3pD,EACAgO,EACAvK,GAQV,GACF,CAhHA,CAHcuS,MCM+B,IASxB8zC,GAAmB,WAgBtC,SAAA18C,EACEA,EACAH,EACA3Q,EACAqH,GACA,IAAAzH,EAAA,UApBKsP,MAAsB,KAAI,KACzBsmB,SAAA,EAAG,KACH7Z,QAAA,EAAE,KACFkiC,cAAA,EAAQ,KACRjc,KAAwB,KAAI,KAC5B5K,KAAoB,KAAI,KACxBy2B,eAAA,EAAS,KACTC,cAAsC,KAAI,KAC1CC,YAAA,EAAM,KAGN3Z,WAAgC,KAAI,KACpC4Z,wBAAA,EAAkB,KAClBC,aAAA,EAQN,IAAMj9C,EAASE,EAAIrH,OACnBuQ,KAAKwb,IAAM1kB,EACXkJ,KAAK2B,GAAKhL,EACVqJ,KAAKyzC,YAAc78C,EAAOk9C,aAC1B9zC,KAAK4zC,mBAAqB5tD,EAC1Bga,KAAK6zC,QAAUxmD,EAEf,IAAMkK,EAAiB,SAAC7N,EAAIoN,IAC1BA,EAAOA,GAAQ,CAAC,GACX8wB,KAAOhiC,EAAKgiC,KACjB9wB,EAAK6K,GAAK/b,EAAK+b,GACXjY,IAAOgP,EAAOkD,QAChBhW,EAAKsP,MAAQ4B,EAAK5B,OAEpBtP,EAAK41B,IAAI6C,QAAQ30B,EAAIoN,EAAA,EAIvBkJ,KAAK6jC,SAAW,IAAIoP,GACpBjzC,KAAK6jC,SAAS/nB,GAAGpjB,EAAOwC,eAAgB3D,GACxCyI,KAAK6jC,SAAS/nB,GAAGpjB,EAAOkD,MAAOrE,GAE/B,ICrDIpK,EAQAuK,EASmB1J,EACnBD,EDmCEF,EAAcwkB,GAAezb,EAAOm9C,2BAA6B,CACrEv9B,gBAAiB,mBAAW,GAExBzpB,EAAmC,CACvCy8C,KAAM37C,EAAY2oB,gBAAgB,cAClCizB,IAAK57C,EAAY2oB,gBAAgB,2BACjCkzB,IACI77C,EAAY2oB,gBAAgB,6BAIlC,IAAIxW,KAAKyzC,WAA+B,oBAAXO,SACHp9C,EAAOq9C,WAAP,GAqD1Bj0C,KAAKg6B,WAAa,IAAIqW,GACpBrwC,KAAK6jC,SACL92C,EACA6J,EACA,GACAD,QAxDE,IACMC,EAAOq9C,YACTr0C,EAAOL,IAA0B,sBAAA3I,EAAOq9C,WAAU,SAASt9C,EAAE,KAC7DqJ,KAAK0zC,eCrDU1lD,EDqDiB4I,EAAOq9C,WCpD3ClmD,EAAY,IAAI2R,KAAKoS,IAAI9jB,EAAM0R,KAAK/S,SAASZ,MAAMA,KAGlD,CACLmoD,OAHa,IAAIx0C,KAAKs0C,OAAOjmD,GAI7BomD,UAAApmD,MDiDQ6R,EAAOL,IAAiC,6BAAA5I,EAAA,KACxCqJ,KAAK0zC,eCzETvmD,EAAO,IAAIuS,KAAK00C,KACpB,CAC0F,wFAAA1qD,EAAsBhD,WAAA,YAEhH,CACEiB,KAAM,oBAGJ+P,EAAYgI,KAAKoS,IAAIuiC,gBAAgBlnD,GAGpC,CACL+mD,OAHa,IAAIx0C,KAAKs0C,OAAOt8C,GAI7B48C,UAAA58C,KD8DMsI,KAAK2zC,OAAS,SAACjqD,GAAK,OAAK9D,EAAK2uD,gBAAgB7qD,EAAM,EACpD,IAAQoE,EAAWkS,KAAK0zC,cAAhBQ,OACRpmD,EAAO4F,iBAAiB,UAAWsM,KAAK2zC,QACxC7lD,EAAOyE,QAAU,SAAC7I,GAChB,IAAMoN,EAAQ,IAAII,MACbxN,EAAMkM,QAAa,MAAAlM,EAAM8qD,SAAQ,IAAI9qD,EAAM+qD,OAAA,KAEhD79C,EAAOk9C,cAAA,EACPl0C,EAAOzJ,KAAkB,aAAAQ,EAAA,oCACzB/Q,EAAK41B,IAAI6C,QAAQ3lB,EAAOkD,MAAO,CAC7BjU,KAAMwU,EAAWK,YACjBygB,QAASxgB,EAAawC,mBACtB0f,OAAA,EACAyhB,MAAO,gBACPlrC,MAAA4B,GAAA,EAGJhJ,EAAOslD,YAAY,CACjBE,IAAK,OACLzL,cAAe96C,EACfwjD,OAAQ,GACR5uC,GAAIhL,EACJlH,OAAQixB,KAAKC,UAAU/pB,IAE1B,CAAC,MAAOlN,GACPkW,EAAOzJ,KAAI,qBACYQ,EAAE,mCACvBjN,GAEFsW,KAAK00C,cACL10C,KAAK9K,MAAQ,KACb8K,KAAKg6B,WAAa,IAAIqW,GACpBrwC,KAAK6jC,SACL92C,EACA6J,EACA,GACAD,EAEJ,CAYN,CAAC,IAAAA,EAAAG,EAAArQ,UA0RA,OA1RAkQ,EAED+9C,YAAA,WACE,GAAI10C,KAAK0zC,cAAe,CACtB,IAAAhqD,EAA8BsW,KAAK0zC,cAA3B58C,EAAMpN,EAANwqD,OAAQv9C,EAASjN,EAAT4qD,UACZ39C,GAEF+I,KAAKoS,IAAI6iC,gBAAgBh+C,GAE3BG,EAAOxG,oBAAoB,UAAW0P,KAAK2zC,QAC3C78C,EAAOvE,QAAU,KACjBuE,EAAO89C,YACP50C,KAAK0zC,cAAgB,IACvB,GACD/8C,EAED8lB,QAAA,WACE,GAAIzc,KAAK0zC,cACP1zC,KAAK00C,cACL10C,KAAK2zC,YAAA,MACA,CACL,IAAMjqD,EAAasW,KAAKg6B,WACpBtwC,IACFA,EAAW+yB,UACXzc,KAAKg6B,WAAa,KAEtB,CACA,IAAMljC,EAAWkJ,KAAK6jC,SAClB/sC,GACFA,EAAS+7C,qBAEX7yC,KAAK4nB,KAAO,KAEZ5nB,KAAK6jC,SAAW,KAEhB7jC,KAAKwb,IAAM,MACZ7kB,EAED8T,KAAA,SACE/gB,EACAoN,EACAH,EACA3Q,EACAqH,EACAzH,EACAgR,EACAW,EACApK,EACAuK,GACA,IAAA1J,EAAAD,EAAAF,EAAA,KACAV,EAAU0nC,YAAYvyB,MAAQ5C,KAAKoe,YAAY1U,MAC/C,IAAQrc,EAAeiT,KAAfg6B,WACFlsC,EAAalI,EAAOA,EAAK0c,MAAQjV,EAAKiV,MAEtCyM,EAAc1hB,EAAKyoC,YACnB1oC,EAAW4S,KAAK4nB,KAEhBp6B,IAAkBJ,GAAYC,EAAK6W,KAAO9W,EAAS8W,IACnD1P,IAAgBpH,GAAYD,EAAU8W,QAAU7W,EAAS6W,OACzD7L,EAAShL,EAAWD,EAAU0W,GAAMzW,EAASyW,IAAiB,EAC9DrL,EAAWwH,KAAKgd,KAAO7vB,EAAU6vB,KAAOhd,KAAKgd,KAAKjX,OAAS,EAC3DrN,EACO,IAAXN,GACAjL,EAAUwU,GAAK,GACfxU,EAAUwU,MAAA,MAAOvU,OAAA,EAAAA,EAAUsX,MAAMvC,YAC7BhG,GACH3H,IACW,IAAX4D,GACa,IAAXA,IAA8B,IAAbI,GAAmBE,GAAeF,GAAY,IAC9DiE,EAAMiD,KAAKoe,YAAY1U,OAEzB5U,GAAe4D,GAAuC,IAA7B/K,EAAKqX,MAAMjC,QAAQH,SAC9CjV,EAAKqX,MAAMjC,QAAQH,MAAQ7F,IAEzB7W,IAAS4S,GAAa2D,IACxBvW,EAAK8e,MAAMjC,QAAQH,MAAQ7F,GAE7B,IAAM2C,IACJhS,IAA4B,OAAhBY,EAAAX,EAAKwX,kBAAA,EAAL7W,EAAkBlC,QAAQ,OAALiC,EAAKX,EAASyX,kBAAA,EAAT9W,EAAsBjC,MAExDkB,EAAQ,IAAIklD,GAChB1kD,EACA2O,EACA5E,EACA/C,EACA1G,EACAsR,GAEF,IAAKjD,GAAc3O,GAAiB4R,EAAmB,CACrDQ,EAAOL,IAA8B,0BAAAlS,EAAK1F,KAAI,4CAA4CwF,EAAU0W,GAAS,OAAA1W,EAAU6vB,KAAA,WAAe7vB,EAAU8W,MAAK,QAAQ9W,EAAUwU,GAAE,4BACtJnU,EACF,0BAAAgH,EACD,yBAAA2H,EAAA,iCACQ5E,EAAkB,yBAC1BzJ,EAAU,gCACHsR,GACvB,IAAMvZ,EAAS,IAAIosD,GACjBt7C,EACA3Q,EACA8Q,EACAF,EACAc,GAEFsI,KAAKwxC,oBAAoB3rD,EAC3B,CAMA,GAJAma,KAAK4nB,KAAOv6B,EACZ2S,KAAKgd,KAAOp3B,EAGRoa,KAAK0zC,cAEP1zC,KAAK0zC,cAAcQ,OAAOd,YACxB,CACEE,IAAK,QACLxjD,KAAApG,EACAosC,YAAA/mB,EACAwvB,UAAApxC,EACAkuC,MAAAruC,GAEFtD,aAAgBmrD,YAAc,CAACnrD,GAAQ,SAEpC,GAAIqD,EAAY,CACrB,IAAM4S,EAAiB5S,EAAW0d,KAChC/gB,EACAqlB,EACA5hB,EACAH,GAEE2kD,GAAUhyC,IACZ5S,EAAWujD,OAAA,EACX3wC,EACG+sB,MAAK,SAAChjC,GACLmE,EAAKinD,uBAAuBprD,EAC9B,IACCijC,OAAM,SAACjjC,GACNmE,EAAKknD,gBACHrrD,EACAyD,EACA,kCAEJ,MAEFJ,EAAWujD,OAAA,EACXtwC,KAAK80C,uBAAuBn1C,GAEhC,GACDhJ,EAED8hC,MAAA,SAAM/uC,GAA0B,IAAAoN,EAAA,KAC9BpN,EAAUmrC,YAAYvyB,MAAQ5C,KAAKoe,YAAY1U,MAC/C,IAAQzS,EAAeqJ,KAAfg6B,WACR,GAAIh6B,KAAK0zC,cAEP1zC,KAAK0zC,cAAcQ,OAAOd,YAAY,CACpCE,IAAK,QACL/U,UAAA70C,SAEG,GAAIiN,EAAY,CACrB,IAAI3Q,EAAiB2Q,EAAW8hC,MAAM/uC,GACnBioD,GAAU3rD,IACX2Q,EAAW25C,OACtBqB,GAAU3rD,KACbA,EAAiBiF,QAAQyE,QAAQ1J,IAEnCA,EACG0mC,MAAK,SAAC/1B,GACLG,EAAKk+C,kBAAkBr+C,EAAMjN,EAC/B,IACCijC,OAAM,SAACh2B,GACNG,EAAKi+C,gBACHp+C,EACAjN,EACA,mCAEJ,KAEFsW,KAAKg1C,kBACHhvD,EACA0D,EAGN,GACDiN,EAEOo+C,gBAAR,SACErrD,EACAoN,EACAH,GAEKqJ,KAAKwb,MAGVxb,KAAK9K,MAAQxL,EACbsW,KAAKwb,IAAI6C,QAAQ3lB,EAAOkD,MAAO,CAC7BjU,KAAMwU,EAAWE,YACjB4gB,QAASxgB,EAAa2B,mBACtBmgC,UAAAznC,EACA8wB,KAAM5nB,KAAK4nB,WAAA,EACXjJ,OAAA,EACAzpB,MAAAxL,EACA+H,IAAK/H,EACLk1B,OAAAjoB,IAAA,EAEHA,EAEOq+C,kBAAR,SACEtrD,EACAoN,GACA,IAAAH,EAAA,KACAjN,EAAQ0J,SAAQ,SAAC1J,GACfiN,EAAKm+C,uBAAuBprD,EAC9B,IACAsW,KAAK6zC,QAAQ/8C,EAAA,EACdH,EAEO49C,gBAAR,SACE7qD,GAEA,IAAMoN,EAAOpN,EAAMoG,KACnB,GAAS,MAAJgH,GAAAA,EAAMspC,MAAX,CAMA,IAAMzpC,EAAMqJ,KAAKwb,IACjB,GAAKxb,KAAKwb,IAGV,OAAQ1kB,EAAKspC,OACX,IAAK,OAAQ,IAAAp6C,EACLqH,EAA8B,OAArBrH,EAAGga,KAAK0zC,oBAAA,EAAL1tD,EAAoBsuD,UAClCjnD,GAEFqS,KAAKoS,IAAI6iC,gBAAgBtnD,GAE3B,MAGF,IAAK,mBACH2S,KAAK80C,uBAAuBh+C,EAAKhH,MACjC,MAGF,IAAK,QACHkQ,KAAK6zC,QAAQ/8C,EAAKhH,MAClB,MAIF,IAAK,YACC8P,EAAO9I,EAAKhH,KAAKyjD,UACnB3zC,EAAO9I,EAAKhH,KAAKyjD,SAASz8C,EAAKhH,KAAK8F,SAEtC,MAEF,QACEkB,EAAKhH,KAAOgH,EAAKhH,MAAQ,CAAC,EAC1BgH,EAAKhH,KAAK83B,KAAO5nB,KAAK4nB,KACtB9wB,EAAKhH,KAAK6R,GAAK3B,KAAK2B,GACpBhL,EAAI0nB,QAAQvnB,EAAKspC,MAA6BtpC,EAAKhH,MApCvD,MAJE8P,EAAOzJ,KAC8B,oCAAAW,EAAO,aAAe,UA2C9DH,EAEO66C,oBAAR,SAA4B9nD,GAC1B,IAAQoN,EAAekJ,KAAfg6B,WACJh6B,KAAK0zC,cACP1zC,KAAK0zC,cAAcQ,OAAOd,YAAY,CACpCE,IAAK,YACL7jD,OAAA/F,IAEOoN,GACTA,EAAW+5C,UAAUnnD,EAAA,EAExBiN,EAEOm+C,uBAAR,SAA+BprD,GAC7BA,EAAO60C,UAAU1J,YAAYryB,IAAM9C,KAAKoe,YAAY1U,MACpDpJ,KAAK4zC,mBAAmBlqD,EAAA,EACzBoN,CAAA,CA9YqC,GEwBlCm+C,GAAA,SAAqBvrD,GAgBzB,SAAAoN,EACEA,EACAH,EACA3Q,GACA,IAAAqH,EAQ0B,OAP1BA,EAAA3D,EAAA9C,KAAA,KACEkQ,EACAH,EACA3Q,EACA,4BACAm1B,KACD,MAvBK+5B,YAAiC,KAAI7nD,EACrC8nD,cAAwB,EAAC9nD,EACzB+nD,gBAA0B,EAAC/nD,EAC3BgoD,cAAsC,KAAIhoD,EAC1CioD,eAAuC,KAAIjoD,EAC3CkoD,SAAmB,EAACloD,EACpBmoD,YAAwC,KAAInoD,EAC5CooD,YAAmC,KAAIpoD,EACvCqoD,UAAA,EAAyBroD,EACzBsoD,eAAA,EAA8BtoD,EAC9BuoD,sBAAgD,KActDvoD,EAAK+zB,qBAAqB/zB,CAC5B,CA7ByBF,EAAA2J,EAAApN,GA6BxB,IAAAiN,EAAAG,EAAArQ,UAq4BA,OAr4BAkQ,EAESi7B,oBAAV,WACE5xB,KAAKqhB,uBACL33B,EAAAjD,UAAMmrC,oBAAmBhrC,KAAC,MAC1BoZ,KAAKy1C,YAAc,KACnBz1C,KAAKq1C,cAAgB,KACrBr1C,KAAKs1C,eAAiB,MACvB3+C,EAEOyqB,mBAAR,WACE,IAAQ13B,EAAQsW,KAARwb,IACR9xB,EAAIoyB,GAAGpjB,EAAOE,eAAgBoH,KAAKshB,gBAAiBthB,MACpDtW,EAAIoyB,GAAGpjB,EAAOG,gBAAiBmH,KAAKuhB,iBAAkBvhB,MACtDtW,EAAIoyB,GAAGpjB,EAAOa,iBAAkByG,KAAK+b,kBAAmB/b,MACxDtW,EAAIoyB,GAAGpjB,EAAOmB,aAAcmG,KAAK4uB,cAAe5uB,MAChDtW,EAAIoyB,GAAGpjB,EAAOuB,qBAAsB+F,KAAK61C,qBAAsB71C,MAC/DtW,EAAIoyB,GAAGpjB,EAAOwB,sBAAuB8F,KAAK81C,sBAAuB91C,MACjEtW,EAAIoyB,GAAGpjB,EAAO2B,mBAAoB2F,KAAK+1C,mBAAoB/1C,MAC3DtW,EAAIoyB,GAAGpjB,EAAOkD,MAAOoE,KAAKke,QAASle,MACnCtW,EAAIoyB,GAAGpjB,EAAOK,aAAciH,KAAKg2C,cAAeh2C,MAChDtW,EAAIoyB,GAAGpjB,EAAOO,eAAgB+G,KAAKi2C,gBAAiBj2C,MACpDtW,EAAIoyB,GAAGpjB,EAAOW,gBAAiB2G,KAAKyhB,iBAAkBzhB,MACtDtW,EAAIoyB,GAAGpjB,EAAOY,eAAgB0G,KAAKk2C,gBAAiBl2C,MACpDtW,EAAIoyB,GAAGpjB,EAAOoC,eAAgBkF,KAAKm2C,eAAgBn2C,MACnDtW,EAAIoyB,GAAGpjB,EAAO6C,cAAeyE,KAAK0uB,eAAgB1uB,KAAA,EACnDrJ,EAEO0qB,qBAAR,WACE,IAAQ33B,EAAQsW,KAARwb,IACR9xB,EAAI0yB,IAAI1jB,EAAOE,eAAgBoH,KAAKshB,gBAAiBthB,MACrDtW,EAAI0yB,IAAI1jB,EAAOG,gBAAiBmH,KAAKuhB,iBAAkBvhB,MACvDtW,EAAI0yB,IAAI1jB,EAAOa,iBAAkByG,KAAK+b,kBAAmB/b,MACzDtW,EAAI0yB,IAAI1jB,EAAOmB,aAAcmG,KAAK4uB,cAAe5uB,MACjDtW,EAAI0yB,IAAI1jB,EAAOuB,qBAAsB+F,KAAK61C,qBAAsB71C,MAChEtW,EAAI0yB,IAAI1jB,EAAOwB,sBAAuB8F,KAAK81C,sBAAuB91C,MAClEtW,EAAI0yB,IAAI1jB,EAAO2B,mBAAoB2F,KAAK+1C,mBAAoB/1C,MAC5DtW,EAAI0yB,IAAI1jB,EAAOkD,MAAOoE,KAAKke,QAASle,MACpCtW,EAAI0yB,IAAI1jB,EAAOK,aAAciH,KAAKg2C,cAAeh2C,MACjDtW,EAAI0yB,IAAI1jB,EAAOO,eAAgB+G,KAAKi2C,gBAAiBj2C,MACrDtW,EAAI0yB,IAAI1jB,EAAOW,gBAAiB2G,KAAKyhB,iBAAkBzhB,MACvDtW,EAAI0yB,IAAI1jB,EAAOY,eAAgB0G,KAAKk2C,gBAAiBl2C,MACrDtW,EAAI0yB,IAAI1jB,EAAOoC,eAAgBkF,KAAKm2C,eAAgBn2C,MACpDtW,EAAI0yB,IAAI1jB,EAAO6C,cAAeyE,KAAK0uB,eAAgB1uB,KACrD,EAEArJ,EACAw/C,eAAA,SACEzsD,EAA4BoN,GAE5B,IADEH,EAAIG,EAAJ8wB,KAAM5hC,EAAE8Q,EAAF6K,GAAItU,EAAOyJ,EAAP+jC,QAASj1C,EAASkR,EAATuX,UAIrB,GAAW,SAAProB,EAAe,CACjB,IAAM4Q,EAAKD,EAAKuN,GAChBlE,KAAK66B,QAAQlkC,EAAKuN,IAAM,CAAE69B,SAAU10C,EAASghB,UAAAzoB,GAC7Coa,KAAKT,IAAG,mBAAoB3I,EAAE,qBAAqBvJ,GACnD2S,KAAKm1C,aAAev+C,EAEhBoJ,KAAKq7B,QAAU1B,IACjB35B,KAAK2xB,MAET,GACDh7B,EAEDglB,UAAA,SAAUjyB,GACR,IAAKsW,KAAK2X,OAGR,OAFA3X,KAAKs6B,cAAgB5wC,OACrBsW,KAAKq7B,MAAQpC,IAGf,IAAMniC,EAAkBkJ,KAAKo6B,gBAC7Bp6B,KAAK4b,WACL5b,KAAKgvB,YA/Ga,KAgHdl4B,EAAkB,IAAwB,IAAnBpN,GACzBsW,KAAKT,IAC6C,gDAAAzI,EAAgBgzB,QAC9D,IAGJpgC,EAAgBoN,EAChBkJ,KAAKq7B,MAAQnC,KAEbl5B,KAAKu6B,gBAAA,EACLv6B,KAAKq7B,MAAQ/B,IAEft5B,KAAKq6B,iBACHr6B,KAAKs6B,cACLt6B,KAAKo6B,gBACH1wC,EAEJsW,KAAK2xB,MAAA,EACNh7B,EAEDs7B,OAAA,WACE,OAAQjyB,KAAKq7B,OACX,KAAKnC,GACHl5B,KAAKo2C,aACL,MACF,KAAK9c,GAAqB,IAAAxiC,EAChBH,EAAoBqJ,KAApB2X,OAAQ3xB,EAAYga,KAAZu1C,QACVloD,EAAgB,MAANsJ,GAAA,OAAMG,EAANH,EAAS3Q,SAAA,EAAT8Q,EAAmBmmB,QACnC,GAAI5vB,EAAS,CACX,GAAI2S,KAAK0/B,iBAAiBryC,GACxB,MAEF2S,KAAKq7B,MAAQ1B,EACf,CACA,MAEF,KAAKN,GAAkC,IAAAzzC,EAC/BgR,EAAMknB,YAAY1U,MAClB7R,EAAYyI,KAAKw6B,UAEvB,IAAKjjC,GAAaX,GAAOW,GAAuB,OAAd3R,EAAIoa,KAAKkhB,QAALt7B,EAAYywD,QAAS,CACzD,IAAQlpD,EAAoB6S,KAApB2X,OAAQjgB,EAAYsI,KAAZu1C,QAChBv1C,KAAKT,IAAI,gDACTS,KAAK6/B,yBAA8B,MAAN1yC,OAAA,EAAAA,EAASuK,KAAY,MAClDsI,KAAKq7B,MAAQnC,EACf,CACA,MAEF,KAAKS,GAEH,IAAM3rC,EAAcgS,KAAKw1C,YACzB,GAAIxnD,EAAa,CACf,IAAQD,EAAgCC,EAAhC45B,KAAM/5B,EAA0BG,EAA1BgvB,KAAMjwB,EAAoBiB,EAApBsoD,MAAOxoD,EAAaE,EAAbuoD,SAC3B,QAAI,IAAAv2C,KAAK66B,QAAQ9sC,EAAKmW,IAAmB,CACvClE,KAAKw1C,YAAc,KACnBx1C,KAAKo1C,gBAAkB,EACvBp1C,KAAKq7B,MAAQjC,GACb,IACMrqB,EAAuB,CAC3B6Y,KAAA75B,EACAivB,KAAAnvB,EACAkoC,QAJchpC,EAAM0rC,QAKpBja,eAAgB,MAElBxe,KAAKs8B,4BAA4BvtB,GAC7BjhB,GACFpE,EAAAjD,UAAM81C,4BAA2B31C,KAAC,KAAAmoB,EAErC,MAAM,GAAI/O,KAAKm1C,eAAiBn1C,KAAKo1C,eAEpCp1C,KAAKT,IAAG,wBACkBxR,EAAKmW,GAAwC,sCAAAlE,KAAKm1C,cAE5En1C,KAAKw2C,2BACA,CAEL,IAAMppD,EAAM4S,KAAK0+B,kBACXlxC,EAAa6mC,GAAaG,WAC9Bx0B,KAAKm6B,YACL/sC,EACA4S,KAAKvQ,OAAOssC,eAEoB7U,GAChC15B,EAAWgV,IACXxC,KAAKvQ,OAAOwsC,uBACZluC,GAE8B,IAC9BiS,KAAKT,IACqB,wBAAAxR,EAAKmW,GAAE,OAAOnW,EAAKuU,MAA+C,0CAAA9U,EAAWgV,IAAA,cAEvGxC,KAAKw2C,uBAET,CACF,MACEx2C,KAAKq7B,MAAQnC,GAKnBl5B,KAAKm7B,WAAA,EACNxkC,EAED6/C,qBAAA,WACE,IAAM9sD,EAAcsW,KAAKw1C,YACrB9rD,IACFsW,KAAK+5B,gBAAgB1G,eAAe3pC,EAAYk+B,MAChD5nB,KAAKw1C,YAAc,KACnBx1C,KAAKo1C,gBAAkB,EACvBp1C,KAAKq7B,MAAQnC,GAAA,EAEhBviC,EAESqlC,kBAAV,WACEh8B,KAAKw2C,uBACL9sD,EAAAjD,UAAMu1C,kBAAiBp1C,KAAC,KAAD,EACxB+P,EAESwkC,UAAV,WACE,IAAQzxC,EAAUsW,KAAVkhB,MACE,MAALx3B,GAAAA,EAAOuI,aAKZ+N,KAAKo6B,gBAAkB1wC,EAAMg5B,YAAA,EAC9B/rB,EAEOy/C,WAAR,WACE,IAAQ1sD,EAAgCsW,KAAhCwb,IAAK1kB,EAA2BkJ,KAA3B2X,OAAQhhB,EAAmBqJ,KAAnBkhB,MAAOl7B,EAAYga,KAAZu1C,QACtBloD,EAAS3D,EAAI+F,OAQnB,GACGuQ,KAAK0C,YACJ/L,IAAUqJ,KAAK26B,oBAAuBttC,EAAOopD,oBACxC,MAAN3/C,GAAAA,EAAS9Q,GAHZ,CAQA,IAAMJ,EAAYkR,EAAO9Q,GAEnB4Q,EAAehR,EAAUq3B,QAC/B,IACGrmB,GACAA,EAAaiQ,MAAQ7G,KAAK06B,kBAAoB90C,GAC/Coa,KAAK0/B,iBAAiB9oC,GAEtBoJ,KAAKq7B,MAAQ/B,OALf,CASA,IAAM/hC,EAAayI,KAAKm6B,YAAcn6B,KAAKm6B,YAAcn6B,KAAKkhB,MAC1DlhB,KAAK21C,eAAiBp+C,IACxByI,KAAK21C,eAAA,EACL31C,KAAKggC,mBACHzoC,EACAoL,EACAwY,KAIJ,IAAMhuB,EAAa6S,KAAK08B,iBACtBnlC,EACA4jB,IAEF,GAAmB,OAAfhuB,EAAJ,CAIA,IAAK6S,KAAKs1C,gBAAkBt1C,KAAKw7B,aAAaruC,EAAYyJ,GAGxD,OAFAlN,EAAI20B,QAAQ3lB,EAAOU,WAAY,CAAEzR,KAAM,eACvCqY,KAAKq7B,MAAQ5B,IAIf,IAAM/hC,EAAiBsI,KAAK08B,iBAC1B18B,KAAKk1C,YAAcl1C,KAAKk1C,YAAcl1C,KAAKkhB,MAC3ChG,IAEIltB,EAAYb,EAAW88B,IACvBl8B,EAAYiS,KAAK4+B,mBAAmB,MAAAlnC,OAAA,EAAAA,EAAgBuyB,KAEpDp8B,EAAY+I,EAAa6P,UACzB1Z,EAAQc,EAAU,GAAGyU,MACrBxU,EAAekS,KAAK0+B,kBACpB3vB,EAAmB/O,KAAK01C,SAAW5nD,EAAeX,EAAWqV,IAEnE,GAAIxC,KAAKs1C,gBAAkB3+C,EAAO,CAChC,IAAMvJ,EAAMU,EAER8I,EAAawP,UAAYhZ,EAAML,IAE7BI,EAAWqV,IAAMzV,GAASI,EAAWunC,aACvC10B,KAAKT,IACH,yEAEF5I,EAAM+rB,YAAc31B,EAAQ,IAGlC,CAGA,KACEiB,GAAaD,IACZiS,KAAKs1C,gBACNvmC,EAAmBlhB,EAAUA,EAAU9H,OAAS,GAAGuc,OAHrD,CAQA,IAAI9U,EAAOwS,KAAK++B,gBAAgBhwB,EAAkBnY,GAC9CpC,GAAA,EAYJ,GAVIhH,GAAQwS,KAAKq/B,cAAc7xC,EAAMuhB,KACnCva,IAAUhH,EAAKuX,IACfvX,EAAOwS,KAAKs/B,2BACV9xC,EACAoJ,EACAzJ,EACA+tB,GACAntB,IAGCP,EAAL,CAMA,IAAM4K,EACJV,GACAlK,EAAK8U,MAAQ5K,EAAe8K,IAAM5L,EAAa2Q,eACjD,GACEnP,IAAA,MAEEV,IAAAA,EAAgBuyB,MAAO98B,EAAW88B,IACpC,CAEA,IAAMzxB,EAAWwH,KAAK8yB,gBAAgBtlC,EAAK8U,MAAO4Y,IAClD,GAAiB,OAAb1iB,EACF,OAKF,GAFAhE,IAAAA,IACIgE,EAASuM,OAAU3M,GAA4C,IAAvBV,EAAeuyB,KAExD7xB,IAAsB5D,GACtBA,GAASrH,EAAWunC,WAAavnC,EAAWunC,UAAYl8B,EAASgK,IAElE,MAEJ,CAEAxC,KAAKk8B,aAAa1uC,EAAM5H,EAAWmpB,EA3BnC,MAFE/O,KAAK21C,eAAA,CAhBP,CAzCA,CAlBA,CAZA,GAqHDh/C,EAESioC,mBAAV,SAA6B9nC,GAC3B,IAAMH,EAAejN,EAAAjD,UAASm4C,mBAAkBh4C,KAAE,MAClD,OAAKkQ,EAGEwB,KAAK+M,IACV/M,KAAKgN,IAAI3O,EAAiBG,GAC1BkJ,KAAKvQ,OAAOqvC,oBAJLnoC,CAAA,EAMVA,EAED4qB,iBAAA,WACEvhB,KAAKk1C,YAAc,KACnBl1C,KAAK21C,cAAgB31C,KAAK01C,UAAA,EAC1BhsD,EAAAjD,UAAM86B,iBAAgB36B,KAAC,KAAD,EACvB+P,EAEDk/C,qBAAA,SACEnsD,EAAkCoN,GAElC,IADEH,EAAWG,EAAXomB,YAGFld,KAAKo7B,kBACLp7B,KAAK2X,OAAShhB,EAAY4Y,KAAI,SAAC7lB,GAAa,OAAK,IAAI+6B,GAAM/6B,EAAA,KAC5DiN,EAEDm/C,sBAAA,SACEpsD,EACAoN,GAGA,IAAMH,IAAaG,EAAKhL,IACxBkU,KAAKu1C,QAAUz+C,EAAK6K,GACpB,IAAQ3b,EAAgBga,KAAhBytB,YAEJznC,IACFA,EAAYmf,gBACZnF,KAAKkgC,sBAAsBl6C,EAAYsc,QAEzCtC,KAAKg8B,oBAEArlC,EAIHqJ,KAAKgvB,YApaW,KAiahBhvB,KAAKo7B,kBAOHzkC,GACFqJ,KAAKs1C,eAAiBx+C,EAEtBkJ,KAAKq7B,MAAQnC,GACbl5B,KAAK02C,mBAAmB5/C,KAExBkJ,KAAKs1C,eAAiB,KACtBt1C,KAAKq1C,cAAgBv+C,EACrBkJ,KAAKq7B,MAAQpC,IAEfj5B,KAAK2xB,MAAA,EACNh7B,EAEDolB,kBAAA,WACE/b,KAAK+5B,gBAAgB5F,qBACrBn0B,KAAKs6B,cAAgBt6B,KAAKo6B,gBAAkB,EAC5Cp6B,KAAK21C,cAAgB31C,KAAK01C,UAAA,EAC1B11C,KAAK2X,OACH3X,KAAKy1C,YACLz1C,KAAKw1C,YACLx1C,KAAKq1C,cACLr1C,KAAK41C,sBACL51C,KAAKs1C,eACH,KACJt1C,KAAK26B,oBAAA,EACL36B,KAAKu1C,QAAUv1C,KAAKm1C,aAAen1C,KAAKo1C,gBAAkB,GAC3Dz+C,EAEDi4B,cAAA,SAAcllC,EAA4BoN,GACxCkJ,KAAKy1C,YAAc3+C,EAAKmmB,QACW,OAA/Bjd,KAAK41C,wBACP51C,KAAKwb,IAAI6C,QAAQ3lB,EAAO2B,mBAAoB2F,KAAK41C,uBACjD51C,KAAK41C,sBAAwB,OAEhCj/C,EAEDo/C,mBAAA,SAAmBrsD,EAAkCoN,GAAuB,IAAAH,EAC1E,GAAwB,MAApBqJ,KAAKy1C,YAAT,CAIA,IAAQzvD,EAAWga,KAAX2X,OACStqB,EAA4ByJ,EAArCmmB,QAAyBr3B,EAAYkR,EAAhB6K,GAC7B,GAAK3b,EAAL,CAIAga,KAAKT,IACY,eAAA3Z,EAAmB,YAAAyH,EAAWga,QAC3C,IAAAha,EAAWmZ,MAAA,KAEXnZ,EAAW0b,WAAU,SACR1b,EAAW0b,WAAU,IAAI1b,EAAW2b,cAAa,IAC1D,IAAE,aACK3b,EAAWma,eAG1B,IAAM5Q,EAAQ5Q,EAAOJ,GACjB2R,EAAU,EACd,GAAIlK,EAAWwZ,MAAqB,OAAjBlQ,EAAIC,EAAMqmB,UAANtmB,EAAekQ,KAAM,CAC1C7G,KAAK88B,gBAAgBzvC,GACrB,IAaOF,EAbDuK,EAAcsI,KAAKy1C,YACzB,GAAIpoD,EAAWgb,oBAAsB3Q,EACnC,QAGCd,EAAMqmB,SACP5vB,EAAW+0B,oBACX1qB,EAAY0qB,oBAIZ+S,GAAwB9nC,EAAYqK,GACpCH,EAAUlK,EAAWoZ,UAAU,GAAGnE,OAElC/K,EAAUyI,KAAKw/B,eACbnyC,EACAuJ,EAAMqmB,QAAA,OAAO9vB,EACb6S,KAAK06B,sBAAA,EAALvtC,EAAsB8vB,QAG5B,CACArmB,EAAMqmB,QAAU5vB,EAChB2S,KAAK06B,gBAAkB9jC,EAGlBoJ,KAAK26B,qBAAuB36B,KAAKy1C,aAAgBpoD,EAAWwZ,MAC/D7G,KAAK2/B,iBAAiB3/B,KAAKy1C,aAAepoD,EAAYkK,GAItDyI,KAAKq7B,QAAU/B,IACdt5B,KAAK0/B,iBAAiBryC,KAEvB2S,KAAKq7B,MAAQnC,IAIfl5B,KAAK2xB,MApDL,MAFE3xB,KAAK7J,KAAoD,+CAAAvQ,EAJ3D,MAFEoa,KAAK41C,sBAAwB9+C,CAAA,EA6DhCH,EAED2lC,4BAAA,SAA4B5yC,GAAsB,IAAAoN,EACxCH,EAAwBjN,EAAxBk+B,KAAM5hC,EAAkB0D,EAAlBszB,KAAM3vB,EAAY3D,EAAZqsC,QACZnwC,EAA4Boa,KAA5BvQ,OAAQmH,EAAoBoJ,KAApBu1C,QAASh+C,EAAWyI,KAAX2X,OACzB,GAAKpgB,EAAL,CAOA,IAAMpK,EAAQoK,EAAOX,GACrB,GAAKzJ,EAAL,CAIA,IAAMuK,EAAUvK,EAAM8vB,QACtB,IAAKvlB,EAGH,OAFAsI,KAAK7J,KAAK,gEACV6J,KAAKkgC,sBAAsBvpC,EAAK2L,OAGlC,IAAMtU,EACJpI,EAAO+wD,mBAAqBxpD,EAAMqrB,YAAc,YAE9CzqB,EAAaiS,KAAKg6B,WACjBjsC,IACHA,EAAaiS,KAAKg6B,WAAa,IAAIwZ,GACjCxzC,KAAKwb,IACLL,GACAnb,KAAK42C,wBAAwBhtD,KAAKoW,MAClCA,KAAKi+B,uBAAuBr0C,KAAKoW,QAMrC,IAAMnS,EAAUmS,KAAK66B,QAAQlkC,EAAKuN,IAC5BnX,EAAkC,OAAnB+J,EAAGH,EAAKkO,kBAAA,EAAL/N,EAAkBhH,KAC1C,QAAI,IAAAjC,EAAuB,CAGzB,IACMC,EAAY9H,EAAOA,EAAK+f,OAAS,EACjCgJ,GAAyB,IAAfjhB,EACVV,EAAY,IAAIwnC,GACpBj+B,EAAKsN,MACLtN,EAAKkN,GACLlN,EAAK+N,MAAMvC,WACX9U,EAAQ4d,WACRnd,EACAihB,GAEFhhB,EAAW0c,KACTpd,EACAN,EACAiB,EACA,GACA2I,EACA3Q,EACA0R,EAAQ8P,eAAA,EAERpa,EACAS,EAEJ,MACEmS,KAAKT,IACyB,4BAAA5I,EAAKuN,GAAE,sDAAsDvN,EAAKkN,GAAA,QAAUnM,EAAQ2P,QAAY,KAAA3P,EAAQ8O,MAAK,WAAW5P,IAEnIoJ,KAAKw1C,YAAcx1C,KAAKw1C,aAAe,CACxD5tB,KAAAjxB,EACAqmB,KAAAh3B,EACAswD,MAAO,IAAIjW,GACXkW,UAAA,IAJMD,MAMF7rC,KAAK,IAAIpK,WAAWhT,IAC1B2S,KAAKo1C,eAAiBp1C,KAAKm1C,aAC3Bn1C,KAAKq7B,MAAQ1B,EA9Df,MAFE35B,KAAK7J,KAAK,qDAJZ,MAJE6J,KAAK7J,KAAI,yEACkEQ,EAAKkN,GAAE,aAAalN,EAAKsN,MAAK,0BAyE5GtN,EAES4lC,4BAAV,SAAsCzlC,GAChCkJ,KAAKw1C,YACPx1C,KAAKw1C,YAAYe,UAAA,EAGnB7sD,EAAAjD,UAAM81C,4BAA2B31C,KAAC,KAAAkQ,EAAA,EACnCH,EAEDq/C,cAAA,WAEEh2C,KAAKm6B,YAAcn6B,KAAKk1C,YAAc,KACtCl1C,KAAKu6B,gBAAA,CAAiB,EACvB5jC,EAEDs/C,gBAAA,SAAgBvsD,EAA8BoN,GAC5C,IAAMH,EAAaG,EAAKy1B,OAAOvmB,MAC3BrP,IACFqJ,KAAKm6B,YAAcxjC,EAAWoU,QAAU,MAEtCjU,EAAKy1B,OAAOtmB,QACdjG,KAAKk1C,YAAcp+C,EAAKy1B,OAAOtmB,MAAM8E,QAAU,OAElDpU,EAED+3B,eAAA,SAAehlC,EAA6BoN,GAC1C,IAAQH,EAAeG,EAAf8wB,KAAMv6B,EAASyJ,EAATkmB,KACd,GAAIrmB,EAAKhP,OAASwzB,GAYlB,GAAInb,KAAKq8B,mBAAmB1lC,GAG1BqJ,KAAK7J,KAAI,YACKQ,EAAKkN,IAAKxW,EAAO,OAASA,EAAK0Y,MAAQ,IACjD,aAAApP,EAAKsN,MAAA,gDAELjE,KAAKq7B,MAAK,mBAEVr7B,KAAKs1C,eAAiBt1C,KAAKs1C,eAAeztD,KAAO,cATvD,CAcA,GAAgB,gBAAZ8O,EAAKkN,GAAsB,CAC7B7D,KAAK85B,aAAenjC,EACpB,IAAM/Q,EAAQoa,KAAKs1C,eACf1vD,IACFoa,KAAKq1C,cAAgBzvD,EACrBoa,KAAKs1C,eAAiB,KACtBt1C,KAAKwb,IAAI6C,QAAQ3lB,EAAOyB,qBAAoBnU,EAAO,GAAAJ,IAEvD,CACAoa,KAAKo9B,qBAAqBzmC,EAAMtJ,EAVhC,MAxBE,IAAK2S,KAAKu6B,gBAAkB5jC,EAAKhP,OAASuzB,GAAwB,CAChE,IAAMtkB,EAAaoJ,KAAKk1C,aAAel1C,KAAKkhB,MACxCtqB,GACyBy9B,GAAaE,YAAY39B,GAC7B7Q,SACrBia,KAAKu6B,gBAAA,EAGX,GA2BH5jC,EAEOunB,QAAR,SAAgBpnB,EAAqBH,GAAiB,IAAA3Q,EACpD,GAAI2Q,EAAKgoB,MACP3e,KAAKq7B,MAAQ3B,QAGf,OAAQ/iC,EAAKsmB,SACX,KAAKxgB,EAAa4B,SAClB,KAAK5B,EAAa2B,mBAClB,KAAK3B,EAAa0B,mBAClB,KAAK1B,EAAawB,gBAClB,KAAKxB,EAAayB,kBAClB,KAAKzB,EAAa8B,eAClB,KAAK9B,EAAa+B,iBAChBwB,KAAK4/B,yBAAyBzkB,GAAyBxkB,GACvD,MACF,KAAK8F,EAAaoB,uBAClB,KAAKpB,EAAaqB,yBAClB,KAAKrB,EAAakB,oBAGbhH,EAAKoxB,YACN/nB,KAAKq7B,QAAU/B,KACf,OAAAtzC,EAAA2Q,EAAKzM,cAAA,EAALlE,EAAc2B,QAASqzB,KAEvBhb,KAAKq7B,MAAQnC,IAEf,MACF,KAAKz8B,EAAakC,oBAClB,KAAKlC,EAAaqC,kBAChB,IAAKnI,EAAKmoB,QAA0B,UAAhBnoB,EAAKmoB,OACvB,OAEF,GAAInoB,EAAKsmB,UAAYxgB,EAAakC,oBAEhC,YADAqB,KAAKg8B,oBAGHh8B,KAAK+/B,2BAA2BppC,KAClCqJ,KAAKq1C,cAAgB,KACrB3rD,EAAAjD,UAAMs2C,gBAAen2C,KAAC,OAAGsR,OAAO2oB,kBAAmB,UAErD,MACF,KAAKpkB,EAAawC,mBAChBe,KAAKmgC,mBAAmBxpC,GAAA,EAK7BA,EAEO8qB,iBAAR,SACE/3B,EAA6BoN,GACvBA,EAAJnP,OAEWib,IACX5C,KAAK01C,UAAA,EAAW,EAEnB/+C,EAEOu/C,gBAAR,SACExsD,EAA4BoN,GAE5B,IADEH,EAAIG,EAAJnP,KAEF,GAAIgP,IAASiM,EAA6B,CACxC5C,KAAK01C,UAAA,EACL11C,KAAK21C,eAAA,EACD31C,KAAKq7B,QAAU5B,KACjBz5B,KAAKq7B,MAAQnC,IAEf,IAAMlzC,EAAcga,KAAKm6B,aAAen6B,KAAKkhB,MACzCl7B,IACFga,KAAKggC,mBAAmBh6C,EAAa2Q,EAAMwkB,IAC3Cnb,KAAK2xB,OAET,GACDh7B,EAEOigD,wBAAR,SAAgCltD,GAAkC,IAAAoN,EAC1DH,EAAK,QACH3Q,EAAQga,KAARwb,IACAnuB,EAA2B3D,EAA3BmoD,YAAajsD,EAAc8D,EAAd60C,UAEf3nC,EAAUoJ,KAAKk+B,kBAAkBt4C,GACvC,GAAKgR,EAAL,CAIA,IAAQzJ,EAAsByJ,EAAtBgxB,KAAMlwB,EAAgBd,EAAhBomB,KAAMhvB,EAAU4I,EAAVqN,MACZlW,EAAYC,EAAZivB,QACApvB,EAAkCR,EAAlC2Y,MAAOjZ,EAA2BM,EAA3BogB,KAAM3f,EAAqBT,EAArBmgB,IAAKuB,EAAgB1hB,EAAhBwX,YAI1B,IAAI7E,KAAKq8B,mBAAmBlvC,IAAUY,EAAtC,CAUA,GALAiS,KAAKq7B,MAAQ9B,GACTv5B,KAAKs1C,gBAAkBznD,GACzBmS,KAAK62C,oBAAoB72C,KAAKs1C,gBAGjB,MAAXvmC,GAAAA,EAAawd,OAAQ,CACvB,IAAMn/B,EAAcD,EAAK0X,aAAe1X,EACxC6S,KAAK82C,mBACH9oD,EACA+gB,EAAYwd,OACZn/B,EACAxH,GAEFI,EAAIq4B,QAAQ3lB,EAAOyC,0BAA2B,CAC5CysB,KAAMx6B,EACNuU,GAAAhL,EACA41B,OAAQxd,EAAYwd,QAGxB,CACA,GAAI1+B,EAAO,CACT,IAAQL,EAAuCK,EAAvCsW,SAAU3P,EAA6B3G,EAA7BuW,OAAQhM,EAAqBvK,EAArBwW,SAAU7L,EAAW3K,EAAXyW,OAChC5M,IACFA,EAAKyL,kBAAkBR,GAA+B,CACpDwB,SAAA3W,EACA4W,OAAA5P,EACA6P,SAAAjM,EACAkM,OAAA9L,IAGJrL,EAAKiY,wBACHzC,EACAnV,EACAgH,EACA4D,EACAI,GAEFwH,KAAKo+B,mBAAmBvwC,EAAOV,EAAMuK,EAAM9R,EAC7C,CAEA,GAAO,MAAHkI,GAAA,OAAGgJ,EAAHhJ,EAAKwhB,UAALxY,EAAc/Q,OAAQ,CACxB,IAAMoW,EAAsC5E,EAC1C,CACEoK,GAAAhL,EACAixB,KAAAz6B,EACA8vB,QAAAlvB,GAEFD,GAEF9H,EAAIq4B,QAAQ3lB,EAAO2C,sBAAuBc,EAC5C,CACA,GAAIpP,EAAM,CACR,IAAM0P,EAAuClF,EAC3C,CACEoK,GAAAhL,EACAixB,KAAAz6B,EACA8vB,QAAAlvB,GAEFhB,GAEF/G,EAAIq4B,QAAQ3lB,EAAO0C,sBAAuBqB,EAC5C,CA/DA,MAFEuD,KAAK+5B,gBAAgB1G,eAAelmC,EARtC,MAFE6S,KAAKigC,wBAAwBr6C,EAAA,EA4EhC+Q,EAEOmgD,mBAAR,SACEptD,EACAoN,EACAH,EACA3Q,GAEA,GAAIga,KAAKq7B,QAAU9B,GAAnB,CAIIziC,EAAOmP,cACFnP,EAAOmP,MAIhB,IAAM5Y,EAAQyJ,EAAOkP,MACrB,GAAK3Y,EAAL,CAIAA,EAAMsU,GAAK,QAEX,IAAM/b,EAAqB8D,EAAa8uB,WACxCxY,KAAKT,IAC6B,gCAAAlS,EAAMy2C,UAAoC,2BAAAl+C,EAAsB,IAAAyH,EAAM4hB,MAAA,KAGpGrpB,GAA+D,IAAzCA,EAAmBmS,MAAM,KAAKhS,SACtDsH,EAAM0pD,WAAanxD,GAErBoa,KAAKwb,IAAI6C,QAAQ3lB,EAAOM,cAAelC,GACvC,IAAMF,EAAcvJ,EAAMwX,YAC1B,GAAe,MAAXjO,GAAAA,EAAaqU,WAAY,CAC3B,IAAM1T,EAA+B,CACnC5P,KAAM,QACNigC,KAAAjxB,EACAqmB,KAAM,KACNuhB,UAAAv4C,EACA84B,OAAQnoB,EAAKhP,KACbmI,KAAM8G,GAERoJ,KAAKwb,IAAI6C,QAAQ3lB,EAAOQ,iBAAkB3B,EAC5C,CAEAyI,KAAKkyB,eA1BL,CAVA,GAqCDv7B,EAESulC,aAAV,SACEplC,EACAH,EACA3Q,GAGA,IAQEqH,EARIzH,EAAYoa,KAAK+5B,gBAAgBhG,SAASj9B,GAIhD,GAHAkJ,KAAKytB,YAAc32B,EAIjBkJ,KAAKs1C,gBACL1vD,IAAcusC,IACdvsC,IAAcysC,GAEd,GAAgB,gBAAZv7B,EAAK+M,GACP7D,KAAKg9B,iBAAiBlmC,EAAMH,QACvB,GAAiB,OAAbtJ,EAAAsJ,EAAMsmB,UAAN5vB,EAAewZ,OAAS7G,KAAK66B,QAAQ/jC,EAAKoN,IAAK,CACxDlE,KAAKT,IAC4C,+CAAAzI,EAAKoN,GAAE,iDAAiDpN,EAAK+M,GAAE,aAAa7D,KAAKu1C,SAElIv1C,KAAKq7B,MAAQ1B,GACb,IAAM/iC,EAAcoJ,KAAKy1C,YAEvB7+C,GACAA,EAAY6P,UAAU,GAAGnE,QAAU3L,EAAMsmB,QAAQxW,UAAU,GAAGnE,OAE9D6yB,GAAwBx+B,EAAMsmB,QAASrmB,EAE3C,MACEoJ,KAAK26B,oBAAA,EACLjxC,EAAAjD,UAAMy1C,aAAYt1C,KAAC,KAAAkQ,EAAMH,EAAO3Q,QAGlCga,KAAKy8B,qBAAqB3lC,EAAA,EAE7BH,EAEO+/C,mBAAR,SAA2B5/C,GACzB,GAAIkJ,KAAKkhB,OAASlhB,KAAKq1C,cAAe,CACpC,IAAA1+C,EACEqJ,KAAKq1C,cAEJvoB,GACC,CAAEjlC,KAJM8O,EAAJ9O,KAIIqxB,KAJMviB,EAAJuiB,KAIIE,UAJWziB,EAATyiB,UAISE,gBAJiB3iB,EAAf2iB,gBAIed,WAJY7hB,EAAV6hB,WAIUa,SAJU1iB,EAAR0iB,UAKxDviB,EACAi2B,MAGF/sB,KAAKT,IAAI,8CACT7V,EAAAjD,UAAMs2C,gBAAen2C,KAAC,OAAGsR,OAAO2oB,kBAAmB,SACnD7gB,KAAKq1C,cAAgB,KAEzB,GACD1+C,EAEOkgD,oBAAR,SAA4BntD,GAC1B,IAAQoN,EAAQkJ,KAARwb,IACRxb,KAAK02C,mBAAmBhtD,GACxBsW,KAAKq1C,cAAgB3rD,EACrBsW,KAAKs1C,eAAiB,KACtBx+C,EAAIunB,QAAQ3lB,EAAOyB,qBAAoBnU,EAAA,GAAO0D,GAAA,EAC/CoN,CAAA,CAl6BG,CACI+iC,IC9CH,SAASmd,GACdttD,EACAoN,GAEA,GAAIpN,EAAW3D,SAAW+Q,EAAW/Q,OACnC,OAAO,EAET,IAAK,IAAI4Q,EAAI,EAAGA,EAAIjN,EAAW3D,OAAQ4Q,IACrC,IACGsgD,GACCvtD,EAAWiN,GAAGmhB,MACdhhB,EAAWH,GAAGmhB,OAGhB,OAAO,EAGX,OAAO,CACT,CAEO,SAASm/B,GACdvtD,EACAoN,EACAH,GAGA,IAAM3Q,EAAoB0D,EAAO,uBACjC,OAAI1D,IAAsB2Q,EACjB3Q,IAAsB8Q,EAAO,yBAIpCH,GAAoB,CAClB,WACA,OACA,kBACA,aACA,UACA,SACA,mBAEF2f,MACA,SAAC3f,GAAiB,OAChBjN,EAAOiN,KAAuBG,EAAOH,EAAkB,GAE7D,CAEO,SAASugD,GACdxtD,EACAoN,GAEA,OACEA,EAAUspB,MAAM9sB,gBAAkB5J,EAAc7B,KAAKyL,iBACnDwD,EAAUqgD,UACVrgD,EAAUqgD,SAAS7jD,iBAChB5J,EAAcwvB,MAAQ,IAAI5lB,cAEnC,CClDmC,IAgB7B8jD,GAAA,SAAoB1tD,GAQxB,SAAAoN,EAAYA,GAAU,IAAAH,EAEK,OADzBA,EAAAjN,EAAA9C,KAAA,KAAMkQ,EAAK,6BAA2B,MARhCy1B,OAA0B,GAAE51B,EAC5B0gD,SAA0C,KAAI1gD,EAC9C2gD,cAAiC,GAAE3gD,EACnC4+C,SAAmB,EAAC5+C,EACpB4gD,aAAqC,KAAI5gD,EACzC6gD,oBAAA,EAIN7gD,EAAK+kB,oBAAoB/kB,CAC3B,CAXwBxJ,EAAA2J,EAAApN,GAWvB,IAAAiN,EAAAG,EAAArQ,UAkNA,OAlNAkQ,EAEO+kB,kBAAR,WACE,IAAQhyB,EAAQsW,KAARwb,IACR9xB,EAAIoyB,GAAGpjB,EAAOa,iBAAkByG,KAAK+b,kBAAmB/b,MACxDtW,EAAIoyB,GAAGpjB,EAAOe,gBAAiBuG,KAAKy3C,iBAAkBz3C,MACtDtW,EAAIoyB,GAAGpjB,EAAOkB,cAAeoG,KAAKgc,eAAgBhc,MAClDtW,EAAIoyB,GAAGpjB,EAAOgB,gBAAiBsG,KAAK2uB,iBAAkB3uB,MACtDtW,EAAIoyB,GAAGpjB,EAAO2B,mBAAoB2F,KAAK+1C,mBAAoB/1C,MAC3DtW,EAAIoyB,GAAGpjB,EAAOkD,MAAOoE,KAAKke,QAASle,KAAA,EACpCrJ,EAEOwlB,oBAAR,WACE,IAAQzyB,EAAQsW,KAARwb,IACR9xB,EAAI0yB,IAAI1jB,EAAOa,iBAAkByG,KAAK+b,kBAAmB/b,MACzDtW,EAAI0yB,IAAI1jB,EAAOe,gBAAiBuG,KAAKy3C,iBAAkBz3C,MACvDtW,EAAI0yB,IAAI1jB,EAAOkB,cAAeoG,KAAKgc,eAAgBhc,MACnDtW,EAAI0yB,IAAI1jB,EAAOgB,gBAAiBsG,KAAK2uB,iBAAkB3uB,MACvDtW,EAAI0yB,IAAI1jB,EAAO2B,mBAAoB2F,KAAK+1C,mBAAoB/1C,MAC5DtW,EAAI0yB,IAAI1jB,EAAOkD,MAAOoE,KAAKke,QAASle,KAAA,EACrCrJ,EAEM8lB,QAAP,WACEzc,KAAKmc,sBACLnc,KAAKusB,OAAOxmC,OAAS,EACrBia,KAAKs3C,cAAcvxD,OAAS,EAC5Bia,KAAKu3C,aAAe,KACpB7tD,EAAAjD,UAAMg2B,QAAO71B,KAAC,KAAD,EACd+P,EAESolB,kBAAV,WACE/b,KAAKusB,OAAS,GACdvsB,KAAKs3C,cAAgB,GACrBt3C,KAAKq3C,SAAW,KAChBr3C,KAAKu3C,aAAe,KACpBv3C,KAAKu1C,SAAW,EAChBv1C,KAAKw3C,oBAAA,CAAqB,EAC3B7gD,EAES8gD,iBAAV,SACE/tD,EACAoN,GAEAkJ,KAAKusB,OAASz1B,EAAKomB,aAAe,IACnCvmB,EAESo/C,mBAAV,SACErsD,EACAoN,GAEA,IAAQH,EAAyBG,EAAzB6K,GAAI3b,EAAqB8Q,EAArBiiB,QAAS1rB,EAAYyJ,EAAZmmB,QACfr3B,EAAqBoa,KAAKs3C,cAAc3gD,GAE9C,GAAK/Q,GAAsBA,EAAmBmzB,UAAY/yB,EAA1D,CAOA,IAAM4Q,EAAahR,EAAmBq3B,QACtCr3B,EAAmBq3B,QAAUnmB,EAAKmmB,QAClCjd,KAAKT,IACY,eAAA5I,EAAA,KAAO/Q,EAAmBiC,KAAI,UAAUjC,EAAmBszB,KAAc,UAAAlzB,EAAmB,YAAAqH,EAAQga,QAAA,IAAWha,EAAQmZ,MAAK,KAGzI7P,IAAOqJ,KAAKu1C,SACdv1C,KAAK6pB,eAAelzB,EAAIG,EAAMF,EAThC,MAJEoJ,KAAK7J,KACoB,uBAAAQ,EAAgB,cAAA3Q,EAAqC,qCAAAJ,OAAA,EAAAA,EAAoBmzB,SAAA,EAcrGpiB,EAESqlB,eAAV,SACEtyB,EACAoN,GAEAkJ,KAAKgpB,YAAYlyB,EAAKmN,MAAA,EACvBtN,EAESg4B,iBAAV,SACEjlC,EACAoN,GAEAkJ,KAAKgpB,YAAYlyB,EAAKmN,MAAA,EACvBtN,EAEOqyB,YAAR,SAAoBt/B,GAClB,IAAMoN,EAAYkJ,KAAKwb,IAAI7D,OAAOjuB,GAClC,GAAKoN,EAAL,CAGA,IAAMH,EAAcG,EAAU8uB,aAAe,KACvC5/B,EAAgBga,KAAKq3C,SACvBhqD,EAAe2S,KAAKu3C,aACxB,IACG5gD,IACD,MAAA3Q,OAAA,EAAAA,EAAeD,WAAA,MAAW4Q,OAAA,EAAAA,EAAa5Q,SAC5B,MAAX4Q,GAAAA,EAAa2f,MAAK,SAAC5sB,GAAO,OAA0C,KAAxB,MAAb1D,OAAA,EAAAA,EAAemM,QAAQzI,GAAe,IACrE,CACAsW,KAAKq3C,SAAW1gD,EAChBqJ,KAAKu1C,SAAW,EAChBv1C,KAAKu3C,aAAe,KAEpB,IAAM3xD,EAAcoa,KAAKusB,OAAOxrB,QAC9B,SAACrX,GAAK,OACHiN,IAAuD,IAAxCA,EAAYxE,QAAQzI,EAAMqvB,QAAe,IAE7D,GAAInzB,EAAYG,OAGZia,KAAKw3C,qBACJ5xD,EAAY0wB,MAAK,SAAC5sB,GAAK,OAAKA,EAAMklB,OAAO,MAE1C5O,KAAKw3C,oBAAA,GAGP5xD,EAAYwN,SAAQ,SAAC1J,EAAOoN,GAC1BpN,EAAMiY,GAAK7K,CACb,SACK,IAAKzJ,IAAiB2S,KAAKs3C,cAAcvxD,OAE9C,OAEFia,KAAKs3C,cAAgB1xD,EAGrB,IAAMgR,EAAkBoJ,KAAKwb,IAAI/rB,OAAOqgC,gBACxC,IAAKziC,GAAgBuJ,EAAiB,CACpC,IAAMW,EAAas1B,GACjBj2B,EACAhR,EACAmnC,IAEF,GAAIx1B,GAAc,EAChBlK,EAAezH,EAAY2R,OACtB,CACL,IAAMpK,EAAW0/B,GAAmBj2B,EAAiBoJ,KAAKusB,QAC1Dl/B,EAAe2S,KAAKusB,OAAOp/B,EAC7B,CACF,CAGA,IAAIuK,EAAUsI,KAAK03C,YAAYrqD,IACd,IAAbqK,GAAkBrK,IACpBqK,EAAUsI,KAAK03C,YAAY,OAI7B,IAAM1pD,EAA6C,CAAEkvB,YAAAt3B,GACrDoa,KAAKT,IAAG,0BAEJ3Z,EAAYG,OACkB,uCAAA4Q,OAAA,EAAAA,EAAasB,KAAK,OAEpD+H,KAAKwb,IAAI6C,QAAQ3lB,EAAOuB,qBAAsBjM,GAE9C,IAAMD,EAAkBiS,KAAKu1C,QAC7B,IAAiB,IAAb79C,IAAuC,IAArB3J,EACpBiS,KAAK23C,cAAcjgD,QACd,GAAI9R,EAAYG,SAA+B,IAArBgI,EAAwB,KAAAF,EACjDd,EAAQ,IAAImK,MAAA,kEAAKrJ,EACqCmS,KAAKq3C,eAAA,EAALxpD,EAAeoK,KACvE,MACgB,iBAAArS,EAAYG,QAEhCia,KAAK7J,KAAKpJ,EAAM6I,SAEhBoK,KAAKwb,IAAI6C,QAAQ3lB,EAAOkD,MAAO,CAC7BjU,KAAMwU,EAAWE,YACjB4gB,QAASxgB,EAAaoB,uBACtB8gB,OAAA,EACAzpB,MAAAnI,GAEJ,CACD,MAAUiT,KAAK4pB,qBAAqBv8B,IAEnC2S,KAAK23C,cAAc33C,KAAKu1C,QAtF1B,GAwFD5+C,EAESunB,QAAV,SAAkBx0B,EAAqBoN,IACjCA,EAAK6nB,OAAU7nB,EAAK5M,UAKtB4M,EAAK5M,QAAQvC,OAASqzB,IACtBlkB,EAAK5M,QAAQyX,KAAO3B,KAAKu1C,SACvBv1C,KAAKq3C,WAA6D,IAAjDr3C,KAAKq3C,SAASllD,QAAQ2E,EAAK5M,QAAQ6uB,WAEtD/Y,KAAKqpB,kBAAoB,EACzBrpB,KAAKkqB,WAAWpzB,IAAA,EAEnBH,EAoBMihD,eAAP,SACEluD,GAEA,IAAMoN,EAAMkJ,KAAKwb,IAEjB,GADA1kB,EAAIrH,OAAOqgC,gBAAkBpmC,EACzBA,EAAa,CACf,IAAMiN,EAAiBqJ,KAAK6vB,eAE5B,GADA7vB,KAAKw3C,oBAAA,EACD7gD,EAAe5Q,OAAQ,CAEzB,IAAMC,EAAega,KAAKu3C,aAC1B,GACEvxD,GACA8mC,GAAcpjC,EAAa1D,EAAc+mC,IAEzC,OAAO/mC,EAGT,IAAMqH,EAAaw/B,GACjBnjC,EACAsW,KAAKs3C,cACLvqB,IAEF,GAAI1/B,GAAc,EAAG,CACnB,IAAMzH,EAAQoa,KAAKs3C,cAAcjqD,GAEjC,OADA2S,KAAK23C,cAActqD,GACZzH,CACR,CAAM,GAAII,EAAc,CAEvB,IAAI4Q,EAAcE,EAAI2wB,WACD,IAAjB7wB,IACFA,EAAcE,EAAIu6B,gBAEpB,IAAM95B,E1CyFT,SACL7N,EACAoN,EACAH,EACA3Q,EACAqH,GAKA,IAAMzH,EAAekR,EAAO9Q,GAYtB4Q,EATWE,EAAO8f,QACtB,SAACltB,EAAyCoN,EAAOH,GAC/C,IAAM3Q,EAAM8Q,EAAM2Z,IAGlB,OAFmB/mB,EAAW1D,KAAS0D,EAAW1D,GAAO,KAC9CykB,KAAK9T,GACTjN,CACR,GACD,CACF,GAC4B9D,EAAa6qB,KACrC7Z,EAAW7Q,OAAS,IACtBC,EAAcsS,KAAKgN,IAAI8F,MAAM9S,KAAM1B,IAGrC,IAAMW,EAAoB3R,EAAaumC,WACjCh/B,EAAmBvH,EAAag/B,UAChCltB,EAAoB9R,EAAa++B,SAAS9sB,UAAU,EAAG,GACvD7J,EAAgBg/B,GACpBl2B,EACA9Q,GACA,SAAC8Q,GACC,GACEA,EAAMq1B,aAAe50B,GACrBT,EAAM8tB,YAAcz3B,GACpB2J,EAAM6tB,SAAS9sB,UAAU,EAAG,KAAOH,EAEnC,OAAO,EAET,IAAM1R,EAAc8Q,EAAM8uB,YACpBhgC,EAAS+Q,EAAeoK,QAC5B,SAACrX,GAAK,OACH1D,IAAuD,IAAxCA,EAAYmM,QAAQzI,EAAMqvB,QAAe,IAE7D,OAAO8T,GAAmBnjC,EAAQ9D,EAAQyH,IAAmB,CAC/D,IAEF,OAAIW,GAAiB,EACZA,EAEFg/B,GAAoBl2B,EAAQ9Q,GAAa,SAAC8Q,GAC/C,IAAM9Q,EAAc8Q,EAAM8uB,YACpBhgC,EAAS+Q,EAAeoK,QAC5B,SAACrX,GAAK,OACH1D,IAAuD,IAAxCA,EAAYmM,QAAQzI,EAAMqvB,QAAe,IAE7D,OAAO8T,GAAmBnjC,EAAQ9D,EAAQyH,IAAmB,CAC/D,GACF,CA5DO,C0CxFK3D,EACAoN,EAAI6gB,OACJhhB,EACAC,EACAm2B,IAEF,IAAqB,IAAjBx1B,EAEF,OAAO,KAGTT,EAAIoyB,cAAgB3xB,CACtB,CACA,GAAI7N,EAAY2vB,UAAY3vB,EAAY8uB,WAAY,CAGlD,IAAMrrB,EAA+B0/B,GACnCnjC,EACAiN,GAEF,GAAIxJ,GAAgC,EAClC,OAAOwJ,EAAexJ,EAE1B,CACF,CACF,CACA,OAAO,MACRwJ,EAEOghD,cAAR,SAAsBjuD,GACpB,IAAMoN,EAASkJ,KAAKs3C,cAGpB,GAAI5tD,EAAQ,GAAKA,GAASoN,EAAO/Q,OAC/Bia,KAAK7J,KAAgC,2BAAAzM,OADvC,CAMAsW,KAAKupB,aAELvpB,KAAKw3C,oBAAA,EACL,IAAM7gD,EAAYqJ,KAAKu3C,aACjBlqD,EAAQyJ,EAAOpN,GACf9D,EAAcyH,EAAM4vB,UAAY5vB,EAAM4vB,QAAQpW,KACpD,KAAInd,IAAUsW,KAAKu1C,SAAWloD,IAAUsJ,GAAa/Q,IAGrDoa,KAAKT,IACyB,4BAAA7V,EAAA,KAAU2D,EAAMxF,KAAc,UAAAwF,EAAM6rB,KAAI,UAAU7rB,EAAM0rB,QAAA,aAAoB1rB,EAAMgsB,UAEhHrZ,KAAKu1C,QAAU7rD,EACfsW,KAAKu3C,aAAelqD,EACpB2S,KAAKwb,IAAI6C,QAAQ3lB,EAAOwB,sBAAqBlU,EAAO,GAAAqH,IAEhDzH,IAAJ,CAGA,IAAMgR,EAAmBoJ,KAAK0pB,aAC5Br8B,EAAMvB,IACG,MAAT6K,OAAA,EAAAA,EAAWsmB,QACX5vB,EAAM4vB,SAERjd,KAAKypB,aAAa7yB,EANlB,CArBA,GA4BDD,EAEO+gD,YAAR,SAAoBhuD,GAElB,IADA,IAAMoN,EAAckJ,KAAKs3C,cAChB3gD,EAAI,EAAGA,EAAIG,EAAY/Q,OAAQ4Q,IAAK,CAC3C,IAAM3Q,EAAQ8Q,EAAYH,GAC1B,KAAIqJ,KAAKw3C,oBAAuBxxD,EAAM4oB,YAInCllB,GACDojC,GAAcpjC,EAAc1D,EAAO+mC,KAEnC,OAAOp2B,CAEX,CACA,GAAIjN,EAAc,CAGhB,IAFA,IAAQ2D,EACN3D,EADM7B,KAAMjC,EACZ8D,EADYwvB,KAAMtiB,EAClBlN,EADkB0vB,UAAW7hB,EAC7B7N,EAD6B4vB,gBAAiBnsB,EAC9CzD,EAD8C8uB,WAAY9gB,EAC1DhO,EAD0D2vB,SAEnDrrB,EAAI,EAAGA,EAAI8I,EAAY/Q,OAAQiI,IAEtC,GACE8+B,GACE,CAAEjlC,KAAAwF,EAAM6rB,KAAAtzB,EAAMwzB,UAAAxiB,EAAW0iB,gBAAA/hB,EAAiBihB,WAAArrB,EAAYksB,SAAA3hB,GAH5CZ,EAAY9I,GAKtB++B,IAGF,OAAO/+B,EAGX,IAAK,IAAID,EAAI,EAAGA,EAAI+I,EAAY/Q,OAAQgI,IAAK,CAC3C,IAAMF,EAAQiJ,EAAY/I,GAC1B,GACEkpD,GAAyBvtD,EAAaouB,MAAOjqB,EAAMiqB,MAAO,CACxD,WACA,iBACA,oBAGF,OAAO/pB,CAEX,CACA,IAAK,IAAIhB,EAAI,EAAGA,EAAI+J,EAAY/Q,OAAQgH,IAAK,CAC3C,IAAMe,EAAQgJ,EAAY/J,GAC1B,GACEkqD,GAAyBvtD,EAAaouB,MAAOhqB,EAAMgqB,MAAO,CACxD,aAGF,OAAO/qB,CAEX,CACF,CACA,OAAQ,GACT4J,EAES8yB,aAAV,SAAuB3yB,GACrB,IAAMH,EAAaqJ,KAAKu3C,aACxB,GAAIv3C,KAAK2pB,mBAAmBhzB,IAAeA,EAAY,CACrDjN,EAAAjD,UAAMgjC,aAAY7iC,KAAC,MACnB,IAAMZ,EAAK2Q,EAAWgL,GAChBtU,EAAUsJ,EAAWoiB,QACvBnzB,EAAM+Q,EAAW7K,IACrB,GAAIgL,EACF,IACElR,EAAMkR,EAAiB0tB,cAAc5+B,EACtC,CAAC,MAAO8D,GACPsW,KAAK7J,KAC0D,6DAAAzM,EAEjE,CAGFsW,KAAKT,IAC6B,gCAAAvZ,EAAA,KAAO2Q,EAAW9O,KAAI,UAAU8O,EAAWuiB,KAAI,UAAU7rB,GAE3F2S,KAAKupB,aACLvpB,KAAKwb,IAAI6C,QAAQ3lB,EAAO0B,oBAAqB,CAC3CtO,IAAAlG,EACA+b,GAAA3b,EACA+yB,QAAA1rB,EACAsvB,mBAAoB7lB,GAAoB,MAE5C,GACDF,EAAAE,EAAA,EAAAjQ,IAAA,iBAAAia,IAzMD,WACE,OAAOd,KAAKusB,MACd,GAAC,CAAA1lC,IAAA,cAAAia,IAED,WACE,OAAOd,KAAKs3C,aACd,GAAC,CAAAzwD,IAAA,aAAAia,IAED,WACE,OAAOd,KAAKu1C,OACb,EAAAhyC,IAED,SAAe7Z,GAEbsW,KAAKw3C,oBAAA,EACLx3C,KAAK23C,cAAcjuD,EACrB,KAACoN,CAAA,CA7NG,CAA6BqyB,ICUtB0uB,GAAA,SAAwBnuD,GAQnC,SAAAoN,EACEA,EACAH,EACA3Q,GACA,IAAAqH,EAQ0B,OAP1BA,EAAA3D,EAAA9C,KAAA,KACEkQ,EACAH,EACA3Q,EACA,+BACAo1B,KACD,MAfK08B,gBAA0B,EAACzqD,EAC3B0qD,eAAqC,GAAE1qD,EACvCooD,YAAmC,KAczCpoD,EAAK+zB,qBAAqB/zB,CAC5B,CArBmCF,EAAA2J,EAAApN,GAqBlC,IAAAiN,EAAAG,EAAArQ,UA6cA,OA7cAkQ,EAESi7B,oBAAV,WACE5xB,KAAKqhB,uBACL33B,EAAAjD,UAAMmrC,oBAAmBhrC,KAAC,MAC1BoZ,KAAKy1C,YAAc,MACpB9+C,EAEOyqB,mBAAR,WACE,IAAQ13B,EAAQsW,KAARwb,IACR9xB,EAAIoyB,GAAGpjB,EAAOE,eAAgBoH,KAAKshB,gBAAiBthB,MACpDtW,EAAIoyB,GAAGpjB,EAAOG,gBAAiBmH,KAAKuhB,iBAAkBvhB,MACtDtW,EAAIoyB,GAAGpjB,EAAOa,iBAAkByG,KAAK+b,kBAAmB/b,MACxDtW,EAAIoyB,GAAGpjB,EAAOmB,aAAcmG,KAAK4uB,cAAe5uB,MAChDtW,EAAIoyB,GAAGpjB,EAAOkD,MAAOoE,KAAKke,QAASle,MACnCtW,EAAIoyB,GAAGpjB,EAAO4B,wBAAyB0F,KAAKg4C,wBAAyBh4C,MACrEtW,EAAIoyB,GAAGpjB,EAAO8B,sBAAuBwF,KAAKi4C,sBAAuBj4C,MACjEtW,EAAIoyB,GAAGpjB,EAAOgC,sBAAuBsF,KAAKk4C,sBAAuBl4C,MACjEtW,EAAIoyB,GAAGpjB,EAAOiC,wBAAyBqF,KAAKm4C,wBAAyBn4C,MACrEtW,EAAIoyB,GAAGpjB,EAAOW,gBAAiB2G,KAAKyhB,iBAAkBzhB,MACtDtW,EAAIoyB,GAAGpjB,EAAO6C,cAAeyE,KAAK0uB,eAAgB1uB,KAAA,EACnDrJ,EAEO0qB,qBAAR,WACE,IAAQ33B,EAAQsW,KAARwb,IACR9xB,EAAI0yB,IAAI1jB,EAAOE,eAAgBoH,KAAKshB,gBAAiBthB,MACrDtW,EAAI0yB,IAAI1jB,EAAOG,gBAAiBmH,KAAKuhB,iBAAkBvhB,MACvDtW,EAAI0yB,IAAI1jB,EAAOa,iBAAkByG,KAAK+b,kBAAmB/b,MACzDtW,EAAI0yB,IAAI1jB,EAAOmB,aAAcmG,KAAK4uB,cAAe5uB,MACjDtW,EAAI0yB,IAAI1jB,EAAOkD,MAAOoE,KAAKke,QAASle,MACpCtW,EAAI0yB,IAAI1jB,EAAO4B,wBAAyB0F,KAAKg4C,wBAAyBh4C,MACtEtW,EAAI0yB,IAAI1jB,EAAO8B,sBAAuBwF,KAAKi4C,sBAAuBj4C,MAClEtW,EAAI0yB,IAAI1jB,EAAOgC,sBAAuBsF,KAAKk4C,sBAAuBl4C,MAClEtW,EAAI0yB,IAAI1jB,EAAOiC,wBAAyBqF,KAAKm4C,wBAAyBn4C,MACtEtW,EAAI0yB,IAAI1jB,EAAOW,gBAAiB2G,KAAKyhB,iBAAkBzhB,MACvDtW,EAAI0yB,IAAI1jB,EAAO6C,cAAeyE,KAAK0uB,eAAgB1uB,KAAA,EACpDrJ,EAEDglB,UAAA,SAAUjyB,GACRsW,KAAK4b,WACL5b,KAAKq7B,MAAQnC,GAEbl5B,KAAKgvB,YAtEa,KAwElBhvB,KAAKq6B,iBACHr6B,KAAKs6B,cACLt6B,KAAKo6B,gBACH1wC,EAEJsW,KAAK2xB,MAAA,EACNh7B,EAEDolB,kBAAA,WACE/b,KAAKy1C,YAAc,KACnBz1C,KAAK+5B,gBAAgB5F,oBAAA,EACtBx9B,EAED4qB,iBAAA,WACEvhB,KAAK+3C,eAAiB,GACtBruD,EAAAjD,UAAM86B,iBAAgB36B,KAAC,KAAD,EACvB+P,EAEDi4B,cAAA,SAAcllC,EAA4BoN,GACxCkJ,KAAKy1C,YAAc3+C,EAAKmmB,OAAA,EACzBtmB,EAEDwhD,wBAAA,SACEzuD,EACAoN,GAEA,IAAQH,EAAkBG,EAAlB8wB,KAAM5hC,EAAY8Q,EAAZshD,QAGd,GAFAp4C,KAAK85B,aAAenjC,EACpBqJ,KAAKq7B,MAAQnC,GACRlzC,EAAL,CAIA,IAAMqH,EAAW2S,KAAK+3C,eAAe/3C,KAAK83C,gBAC1C,GAAKzqD,EAAL,CAQA,IAFA,IAAIzH,EACEgR,EAAYD,EAAK2L,MACd/K,EAAI,EAAGA,EAAIlK,EAAStH,OAAQwR,IACnC,GAAIX,GAAavJ,EAASkK,GAAG+K,OAAS1L,GAAavJ,EAASkK,GAAGiL,IAAK,CAClE5c,EAAYyH,EAASkK,GACrB,KACF,CAGF,IAAMpK,EAAUwJ,EAAK2L,MAAQ3L,EAAK+K,SAC9B9b,EACFA,EAAU4c,IAAMrV,GAEhBvH,EAAY,CACV0c,MAAO1L,EACP4L,IAAKrV,GAEPE,EAASod,KAAK7kB,IAEhBoa,KAAK+5B,gBAAgBpG,aAAah9B,GAClCqJ,KAAKo9B,qBAAqBzmC,EAAM,KAxBhC,CALA,GA8BDA,EAED8qB,iBAAA,SAAiB/3B,EAA+BoN,GAC9C,IAAQH,EAA2BG,EAA3BorB,YAAal8B,EAAc8Q,EAAdqrB,UACrB,GAAoB,IAAhBxrB,GAAqB3Q,IAAckS,OAAO2oB,kBAAmB,CAC/D,IAAMxzB,EAAqBrH,EAAY,EACvC,GAAIqH,GAAsB,EACxB,OAEFyJ,EAAKuhD,mBAAqB//C,KAAKgN,IAAI,EAAGjY,GACtC2S,KAAK+3C,eAAe3kD,SAAQ,SAAC1J,GAC3B,IAAK,IAAIoN,EAAI,EAAGA,EAAIpN,EAAS3D,QAC3B,GAAI2D,EAASoN,GAAG0L,KAAOnV,EACrB3D,EAASumB,YADX,CAGO,KAAIvmB,EAASoN,GAAGwL,MAAQjV,GAG7B,MAFA3D,EAASoN,GAAGwL,MAAQjV,EAItByJ,GADA,CAGJ,IACAkJ,KAAK+5B,gBAAgB7F,uBACnBv9B,EACAtJ,EACA+tB,GAEJ,GACDzkB,EAED+3B,eAAA,SAAehlC,EAA6BoN,GAC6B,IAAAH,EAAlEqJ,KAAKu6B,gBAAkBzjC,EAAK8wB,KAAKjgC,OAASuzB,IACzC,OAAJvkB,EAAIqJ,KAAKkhB,QAALvqB,EAAYstB,SAASl+B,SACvBia,KAAKu6B,gBAAA,EAGX,EAEA5jC,EACAunB,QAAA,SAAQx0B,EAAqBoN,GAC3B,IAAMH,EAAOG,EAAK8wB,MAEV,MAAJjxB,OAAA,EAAAA,EAAMhP,QAASyzB,KACbtkB,EAAKmmB,UAAYxgB,EAAa4B,UAChC2B,KAAK+5B,gBAAgBpG,aAAah9B,GAAA,GAEhCqJ,KAAKytB,aACPztB,KAAKytB,YAAYtoB,gBAEfnF,KAAKq7B,QAAUpC,KACjBj5B,KAAKq7B,MAAQnC,IAGnB,EAEAviC,EACAqhD,wBAAA,SACEtuD,EAAqCoN,GAErC,IAAAH,EAAA,KADE3Q,EAAc8Q,EAAdqmB,eAEEnd,KAAK2X,QAAUq/B,GAAyBh3C,KAAK2X,OAAQ3xB,GACvDga,KAAK2X,OAAS3xB,EAAeupB,KAC3B,SAAC7lB,GAAa,OAAK,IAAI+6B,GAAM/6B,EAAc,KAI/CsW,KAAK+3C,eAAiB,GACtB/3C,KAAK2X,OAAS3xB,EAAeupB,KAAI,SAAC7lB,GAChC,IAAMoN,EAAQ,IAAI2tB,GAAM/6B,GAExB,OADAiN,EAAKohD,eAAejhD,EAAM6K,IAAM,GACzB7K,CACT,IACAkJ,KAAK+5B,gBAAgB7F,uBACnB,EACAh8B,OAAO2oB,kBACPzF,IAEFpb,KAAK85B,aAAe,KACpB95B,KAAKm6B,YAAc,OACpBxjC,EAEDshD,sBAAA,SACEvuD,EACAoN,GACA,IAAAH,EAGA,GAFAqJ,KAAK83C,eAAiBhhD,EAAK6K,GAEtB,OAADhL,EAACqJ,KAAK2X,SAALhhB,EAAa5Q,SAAmC,IAAzBia,KAAK83C,eAAjC,CAMA,IAAM9xD,EAAega,KAAK2X,OAAO3X,KAAK83C,gBACtB,MAAZ9xD,GAAAA,EAAci3B,QAChBjd,KAAKm6B,YAAcn6B,KAAKs4C,sBAExBt4C,KAAKm6B,YAAc,KAEjBn0C,GACFga,KAAKgvB,YA1OW,IAgOlB,MAFEhvB,KAAKovB,eAcT,EAEAz4B,EACAuhD,sBAAA,SACExuD,EACAoN,GACA,IAAAH,EACQ3Q,EAA2Bga,KAA3B83C,eAAgBzqD,EAAW2S,KAAX2X,OACP/xB,EAA4BkR,EAArCmmB,QAAyBrmB,EAAYE,EAAhB6K,GAC7B,GAAKtU,EAAL,CAIA,IAAMkK,EAAelK,EAAOuJ,GAC5B,KAAIA,GAAWvJ,EAAOtH,SAAWwR,EAAjC,CAGAyI,KAAKT,IACe,kBAAA3I,EAAmB,YAAAhR,EAAWyhB,QAC9C,IAAAzhB,EAAW4gB,MAAA,KAEX5gB,EAAWmjB,WAAU,SACRnjB,EAAWmjB,WAAU,IAAInjB,EAAWojB,cAAa,IAC1D,IAAE,aACKpjB,EAAW4hB,eAE1BxH,KAAKm6B,YAAcn6B,KAAKs4C,sBACxB,IAAInrD,EAAU,EACd,GAAIvH,EAAWihB,MAAqB,OAAjBlQ,EAAIY,EAAM0lB,UAANtmB,EAAekQ,KAAM,CAC1C,IAAMnP,EAAcsI,KAAKy1C,YACzB,GAAI7vD,EAAWyiB,oBAAsB3Q,EACnC,OAEF,IAUO1J,EAVDD,EAA2B2J,EAAY+O,UAAU,GAClDlP,EAAM0lB,QAeO,KALhB9vB,EAAU6S,KAAKw/B,eACb55C,EACA2R,EAAM0lB,QAAA,OAAOjvB,EACbgS,KAAK06B,sBAAA,EAAL1sC,EAAsBivB,WAEHlvB,GAGnBq4B,GAAWxgC,EADXuH,EAAUY,EAAyBuU,OAhBjC1c,EAAWw8B,oBAAsB1qB,EAAY0qB,oBAC/C+S,GAAwBvvC,EAAY8R,GACpCvK,EAAUvH,EAAW6gB,UAAU,GAAGnE,OACzBvU,GAGTq4B,GAAWxgC,EADXuH,EAAUY,EAAyBuU,MAezC,CACA/K,EAAM0lB,QAAUr3B,EAChBoa,KAAK06B,gBAAkBnjC,EAEnBX,IAAY5Q,IAIXga,KAAK26B,qBAAuB36B,KAAKy1C,aAAgB7vD,EAAWihB,MAC/D7G,KAAK2/B,iBAAiB3/B,KAAKy1C,aAAe7vD,EAAYuH,GAIxD6S,KAAK2xB,OAIH/rC,EAAWihB,OACV7G,KAAKytB,aACNztB,KAAKkhB,OACLlhB,KAAKq7B,QAAUnC,KAEGjS,GAChB,KACArhC,EAAW6gB,UACXzG,KAAKkhB,MAAMwB,YACX,KAGA1iB,KAAK7J,KAAK,+CACVoB,EAAM0lB,aAAA,IArEV,CAJA,MAFEjd,KAAK7J,KAAuD,kDAAAS,EAAA,EA8E/DD,EAED4lC,4BAAA,SAA4B7yC,GAAgC,IAAAoN,EAAA,KAClDH,EAAkBjN,EAAlBk+B,KAAM5hC,EAAY0D,EAAZqsC,QACR1oC,EAAcsJ,EAAKm/B,YACnBlwC,EAAMoa,KAAKwb,IAEjB,IAAIxb,KAAKq8B,mBAAmB1lC,IAK1B3Q,GACAA,EAAQilB,WAAa,GACrB,MAAA5d,GAAAA,EAAaxG,KACbwG,EAAYwjB,IACW,YAAvBxjB,EAAYsE,OACZ,CACA,IAAMiF,EAAYknB,YAAY1U,MAE9BpJ,KAAK46B,UACFnE,QACC,IAAIp2B,WAAWra,GACfqH,EAAYxG,IAAIkkB,OAChB1d,EAAYwjB,GAAG9F,QAEhB4hB,OAAM,SAACjjC,GASN,MARA9D,EAAIy4B,QAAQ3lB,EAAOkD,MAAO,CACxBjU,KAAMwU,EAAWE,YACjB4gB,QAASxgB,EAAa0B,mBACtBwgB,OAAA,EACAzpB,MAAOxL,EACPk1B,OAAQl1B,EAAIkM,QACZgyB,KAAAjxB,IAEIjN,CACR,IACCgjC,MAAK,SAAChjC,GACL,IAAMoN,EAAUgnB,YAAY1U,MAC5BxjB,EAAIy4B,QAAQ3lB,EAAOwC,eAAgB,CACjC0sB,KAAAjxB,EACAo/B,QAASrsC,EACTgb,MAAO,CACLu4B,OAAQrmC,EACRsmC,SAAUpmC,IAGhB,IACC61B,OAAM,SAACjjC,GACNoN,EAAKX,KAAQzM,EAAI7B,KAAS,KAAA6B,EAAIkM,SAC9BkB,EAAKukC,MAAQnC,EACf,GACJ,GACDviC,EAEDs7B,OAAA,WACE,GAAKjyB,KAAKkhB,OAKV,GAAIlhB,KAAKq7B,QAAUnC,GAAY,CAC7B,IAAQxvC,EAA2BsW,KAA3B83C,eAAgBhhD,EAAWkJ,KAAX2X,OAClBhhB,EAAA,MAAQG,OAAA,EAAAA,EAASpN,GACvB,IAAKiN,IAAUG,EAAO/Q,SAAW4Q,EAAMsmB,QACrC,OAEF,IAAQj3B,EAAWga,KAAXvQ,OACFpC,EAAc2S,KAAK0+B,kBACnB94C,EAAeyuC,GAAaI,aAChCz0B,KAAK+3C,eAAe/3C,KAAK83C,iBAAmB,GAC5CzqD,EACArH,EAAO+1C,eAEInlC,EAAqChR,EAA1C4c,IAA4BjL,EAAc3R,EAAnBqkC,IAEzB98B,EAAiB6S,KAAK08B,iBAC1B18B,KAAKkhB,MACLhG,IAEIxjB,EAAef,EAAMsmB,QAK3B,GAAI1lB,EAHFyI,KAAK4+B,mBAAmB,MAAAzxC,OAAA,EAAAA,EAAgB88B,KACxCvyB,EAAa6gD,oBAGb,OAEF,IAAMvqD,EAAY0J,EAAa+O,UACzB1Y,EAAUC,EAAUjI,OACpB8H,EAAM6J,EAAa+rB,KAErB12B,EAA6B,KAC3Be,EAAekS,KAAK85B,aAC1B,GAAIljC,EAAmB/I,EAAK,CAC1B,IAAMkhB,EAAY/oB,EAAOi2C,uBACnB7uC,EACJwJ,EAAmB/I,EAAMkhB,EAAY,EAAIA,IAC3ChiB,EAAYk6B,GACVn5B,EACAE,EACAsK,KAAKgN,IAAItX,EAAU,GAAGsU,MAAO1L,GAC7BxJ,KAIAU,GACAA,EAAawU,MAAQtU,EAAU,GAAGsU,QAElCvV,EAAYiB,EAAU,GAE1B,MACEjB,EAAYiB,EAAUD,EAAU,GAElC,IAAKhB,EACH,OAGF,GAAqB,iBADrBA,EAAYiT,KAAKo/B,0BAA0BryC,IAC7B8W,GAAsB,CAElC,IACMrW,EAAWQ,EADAjB,EAAU8W,GAAKnM,EAAa2P,QACP,GAEpC7Z,GACAA,EAAS0W,KAAOnX,EAAUmX,IAC1BlE,KAAK+5B,gBAAgBhG,SAASvmC,KAAc2kC,KAE5CplC,EAAYS,EAEhB,CAEEwS,KAAK+5B,gBAAgBhG,SAAShnC,KAAeolC,IAG7CnyB,KAAKk8B,aAAanvC,EAAW4J,EAAOC,EAExC,OA/EEoJ,KAAKq7B,MAAQnC,EAAA,EAgFhBviC,EAESioC,mBAAV,SAA6B9nC,GAC3B,IAAMH,EAAejN,EAAAjD,UAASm4C,mBAAkBh4C,KAAE,MAClD,OAAKkQ,EAGEwB,KAAKgN,IAAI3O,EAAiBG,GAFxBH,CAAA,EAGVA,EAESulC,aAAV,SACEplC,EACAH,EACA3Q,GAEAga,KAAKytB,YAAc32B,EACH,gBAAZA,EAAK+M,GACP7D,KAAKg9B,iBAAiBlmC,EAAMH,IAE5BqJ,KAAK26B,oBAAA,EACLjxC,EAAAjD,UAAMy1C,aAAYt1C,KAAC,KAAAkQ,EAAMH,EAAO3Q,GAAA,EAEnC4Q,EAAAE,EAAA,EAAAjQ,IAAA,wBAAAia,IAED,WACE,OAAO,IAAI03C,GACTx4C,KAAK+3C,eAAe/3C,KAAK83C,iBAAmB,GAEhD,KAAChhD,CAAA,CAleU,CACH+iC,IAoeJ2e,GAGJ,SAAY9uD,GAAyB,KAFrBu6B,cAAA,EAGd,IAAMntB,EAAW,SACfA,EACAH,EACA3Q,GAGA,IADA2Q,KAAkB,GACN3Q,EAAS,EACnB,MAAM,IAAIyyD,aACc,sBAAA3hD,EAAA,0CAA8CH,EAAK,wCAAwC3Q,EAAM,KAG3H,OAAO0D,EAAWiN,GAAOG,EAAA,EAE3BkJ,KAAKikB,SAAW,CACV,UAAAl+B,GACF,OAAO2D,EAAW3D,MACnB,EACDyc,IAAG,SAAC7L,GACF,OAAOG,EAAS,MAAOH,EAAOjN,EAAW3D,OAC1C,EACDuc,MAAK,SAAC3L,GACJ,OAAOG,EAAS,QAASH,EAAOjN,EAAW3D,OAC7C,EAEJ,ECzgBI2yD,GAAA,SAAuBhvD,GAc3B,SAAAoN,EAAYA,GAAU,IAAAH,EAEK,OADzBA,EAAAjN,EAAA9C,KAAA,KAAMkQ,EAAK,gCAA8B,MAdnCoqB,MAAiC,KAAIvqB,EACrC41B,OAA0B,GAAE51B,EAC5B0gD,SAA0C,KAAI1gD,EAC9C2gD,cAAiC,GAAE3gD,EACnC4+C,SAAmB,EAAC5+C,EACpB4gD,aAAqC,KAAI5gD,EACzC6gD,oBAAA,EAAkC7gD,EAClCgiD,oBAA8B,EAAChiD,EAC/BiiD,qBAAmC,kBAAMjiD,EAAKkiD,gBAAgB,EAAE,EAAAliD,EAChEmiD,qBAAA,EAAoCniD,EACpCoiD,yBAAmC,EAACpiD,EACpCqiD,kBAAA,EAAgCriD,EAyfhCsiD,oBAAsB,WAK5B,GAJKtiD,EAAKmiD,qBACRp5C,KAAK0vB,cAAcz4B,EAAKoiD,yBAGrBpiD,EAAKuqB,OAAUvqB,EAAK6kB,IAAI/rB,OAAOypD,yBAApC,CAMA,IAFA,IAAIxvD,EAA8B,KAC5BoN,EAASopB,GAAqBvpB,EAAKuqB,MAAMW,YACtC77B,EAAI,EAAGA,EAAI8Q,EAAO/Q,OAAQC,IACjC,GAAuB,WAAnB8Q,EAAO9Q,GAAGw5B,KAEZ91B,EAAYoN,EAAO9Q,QACd,GAAuB,YAAnB8Q,EAAO9Q,GAAGw5B,KAAoB,CACvC91B,EAAYoN,EAAO9Q,GACnB,KACF,CAIF,IAAMqH,EAAUsJ,EAAKwiD,sBAAsBzvD,GACvCiN,EAAKyiD,gBAAkB/rD,GACzBsJ,EAAK0iD,iBAAiBhsD,EAjBxB,GA5fAsJ,EAAK+kB,oBAAoB/kB,CAC3B,CAjB2BxJ,EAAA2J,EAAApN,GAiB1B,IAAAiN,EAAAG,EAAArQ,UA4UA,OA5UAkQ,EAEM8lB,QAAP,WACEzc,KAAKmc,sBACLnc,KAAKusB,OAAOxmC,OAAS,EACrBia,KAAKs3C,cAAcvxD,OAAS,EAC5Bia,KAAKu3C,aAAe,KACpBv3C,KAAKi5C,oBAAsBj5C,KAAK44C,qBAAuB,KACvDlvD,EAAAjD,UAAMg2B,QAAO71B,KAAC,KAAD,EACd+P,EAaO+kB,kBAAR,WACE,IAAQhyB,EAAQsW,KAARwb,IACR9xB,EAAIoyB,GAAGpjB,EAAOE,eAAgBoH,KAAKshB,gBAAiBthB,MACpDtW,EAAIoyB,GAAGpjB,EAAOG,gBAAiBmH,KAAKuhB,iBAAkBvhB,MACtDtW,EAAIoyB,GAAGpjB,EAAOa,iBAAkByG,KAAK+b,kBAAmB/b,MACxDtW,EAAIoyB,GAAGpjB,EAAOe,gBAAiBuG,KAAKy3C,iBAAkBz3C,MACtDtW,EAAIoyB,GAAGpjB,EAAOkB,cAAeoG,KAAKgc,eAAgBhc,MAClDtW,EAAIoyB,GAAGpjB,EAAOgB,gBAAiBsG,KAAK2uB,iBAAkB3uB,MACtDtW,EAAIoyB,GAAGpjB,EAAOgC,sBAAuBsF,KAAKk4C,sBAAuBl4C,MACjEtW,EAAIoyB,GAAGpjB,EAAOkD,MAAOoE,KAAKke,QAASle,KAAA,EACpCrJ,EAEOwlB,oBAAR,WACE,IAAQzyB,EAAQsW,KAARwb,IACR9xB,EAAI0yB,IAAI1jB,EAAOE,eAAgBoH,KAAKshB,gBAAiBthB,MACrDtW,EAAI0yB,IAAI1jB,EAAOG,gBAAiBmH,KAAKuhB,iBAAkBvhB,MACvDtW,EAAI0yB,IAAI1jB,EAAOa,iBAAkByG,KAAK+b,kBAAmB/b,MACzDtW,EAAI0yB,IAAI1jB,EAAOe,gBAAiBuG,KAAKy3C,iBAAkBz3C,MACvDtW,EAAI0yB,IAAI1jB,EAAOkB,cAAeoG,KAAKgc,eAAgBhc,MACnDtW,EAAI0yB,IAAI1jB,EAAOgB,gBAAiBsG,KAAK2uB,iBAAkB3uB,MACvDtW,EAAI0yB,IAAI1jB,EAAOgC,sBAAuBsF,KAAKk4C,sBAAuBl4C,MAClEtW,EAAI0yB,IAAI1jB,EAAOkD,MAAOoE,KAAKke,QAASle,KACtC,EAEArJ,EACU2qB,gBAAV,SACE53B,EACAoN,GAEAkJ,KAAKkhB,MAAQpqB,EAAKoqB,MACblhB,KAAKkhB,QAINlhB,KAAK24C,oBAAsB,IAC7B34C,KAAKo5C,cAAgBp5C,KAAK24C,mBAC1B34C,KAAK24C,oBAAsB,GAG7B34C,KAAK84C,sBACH94C,KAAKkhB,MAAMW,YAAc,aAAc7hB,KAAKkhB,MAAMW,YAEhD7hB,KAAK84C,oBACP94C,KAAK64C,gBAAgB,KAErB74C,KAAKkhB,MAAMW,WAAWnuB,iBACpB,SACAsM,KAAK44C,sBAAA,EAGVjiD,EAEOkiD,gBAAR,SAAwBnvD,GACtBgW,KAAK0vB,cAAcpvB,KAAK+4C,yBACxB/4C,KAAK+4C,wBAA0Br5C,KAAKsvB,YAClChvB,KAAKi5C,oBACLvvD,EAAA,EAEHiN,EAES4qB,iBAAV,WACOvhB,KAAKkhB,QAIVxhB,KAAK0vB,cAAcpvB,KAAK+4C,yBACnB/4C,KAAK84C,qBACR94C,KAAKkhB,MAAMW,WAAWvxB,oBACpB,SACA0P,KAAK44C,sBAIL54C,KAAKu1C,SAAW,IAClBv1C,KAAK24C,mBAAqB34C,KAAKu1C,SAGdr1B,GAAqBlgB,KAAKkhB,MAAMW,YAExCzuB,SAAQ,SAAC1J,GAClBq2B,GAAiBr2B,EACnB,IAEAsW,KAAKo5C,eAAiB,EACtBp5C,KAAKkhB,MAAQ,OACdvqB,EAESolB,kBAAV,WACE/b,KAAKusB,OAAS,GACdvsB,KAAKq3C,SAAW,KAChBr3C,KAAKs3C,cAAgB,GACrBt3C,KAAKu1C,SAAW,EAChBv1C,KAAKu3C,aAAe,KACpBv3C,KAAKw3C,oBAAA,CACP,EAEA7gD,EACU8gD,iBAAV,SACE/tD,EACAoN,GAEAkJ,KAAKusB,OAASz1B,EAAKqmB,cAAA,EACpBxmB,EAESuhD,sBAAV,SACExuD,EACAoN,GAEA,IAAQH,EAAyBG,EAAzB6K,GAAI3b,EAAqB8Q,EAArBiiB,QAAS1rB,EAAYyJ,EAAZmmB,QACfr3B,EAAqBoa,KAAKs3C,cAAc3gD,GAE9C,GAAK/Q,GAAsBA,EAAmBmzB,UAAY/yB,EAA1D,CAOA,IAAM4Q,EAAahR,EAAmBq3B,QACtCr3B,EAAmBq3B,QAAUnmB,EAAKmmB,QAClCjd,KAAKT,IACe,kBAAA5I,EAAA,KAAO/Q,EAAmBiC,KAAI,UAAUjC,EAAmBszB,KAAc,UAAAlzB,EAAmB,YAAAqH,EAAQga,QAAA,IAAWha,EAAQmZ,MAAK,KAG5I7P,IAAOqJ,KAAKu1C,SACdv1C,KAAK6pB,eAAelzB,EAAIG,EAAMF,EAThC,MAJEoJ,KAAK7J,KACuB,0BAAAQ,EAAgB,cAAA3Q,EAAqC,qCAAAJ,OAAA,EAAAA,EAAoBmzB,SAAA,EAcxGpiB,EAESqlB,eAAV,SACEtyB,EACAoN,GAEAkJ,KAAKgpB,YAAYlyB,EAAKmN,MAAA,EACvBtN,EAESg4B,iBAAV,SACEjlC,EACAoN,GAEAkJ,KAAKgpB,YAAYlyB,EAAKmN,MAAA,EACvBtN,EAEOqyB,YAAR,SAAoBt/B,GAClB,IAAMoN,EAAYkJ,KAAKwb,IAAI7D,OAAOjuB,GAClC,GAAKoN,EAAL,CAGA,IAAMH,EAAiBG,EAAUgvB,gBAAkB,KAC7C9/B,EAAgBga,KAAKq3C,SACvBhqD,EAAe2S,KAAKu3C,aACxB,IACG5gD,IACD,MAAA3Q,OAAA,EAAAA,EAAeD,WAAA,MAAW4Q,OAAA,EAAAA,EAAgB5Q,SAC5B,MAAd4Q,GAAAA,EAAgB2f,MAAK,SAAC5sB,GAAO,OAA0C,KAAxB,MAAb1D,OAAA,EAAAA,EAAemM,QAAQzI,GAAe,IACxE,CACAsW,KAAKq3C,SAAW1gD,EAChBqJ,KAAKu1C,SAAW,EAChBv1C,KAAKu3C,aAAe,KAEpB,IAAM3xD,EAAiBoa,KAAKusB,OAAOxrB,QACjC,SAACrX,GAAK,OACHiN,IAA6D,IAA3CA,EAAexE,QAAQzI,EAAMqvB,QAAe,IAEnE,GAAInzB,EAAeG,OAGfia,KAAKw3C,qBACJ5xD,EAAe0wB,MAAK,SAAC5sB,GAAK,OAAKA,EAAMklB,OAAO,MAE7C5O,KAAKw3C,oBAAA,GAGP5xD,EAAewN,SAAQ,SAAC1J,EAAOoN,GAC7BpN,EAAMiY,GAAK7K,CACb,SACK,IAAKzJ,IAAiB2S,KAAKs3C,cAAcvxD,OAE9C,OAEFia,KAAKs3C,cAAgB1xD,EAGrB,IAAMgR,EAAqBoJ,KAAKwb,IAAI/rB,OAAO6pD,mBAC3C,IAAKjsD,GAAgBuJ,EAAoB,CACvCoJ,KAAKw3C,oBAAA,EACL,IAAMjgD,EAAas1B,GACjBj2B,EACAhR,GAEF,GAAI2R,GAAc,EAChBlK,EAAezH,EAAe2R,OACzB,CACL,IAAMpK,EAAW0/B,GAAmBj2B,EAAoBoJ,KAAKusB,QAC7Dl/B,EAAe2S,KAAKusB,OAAOp/B,EAC7B,CACF,CAGA,IAAIuK,EAAUsI,KAAK03C,YAAYrqD,IACd,IAAbqK,GAAkBrK,IACpBqK,EAAUsI,KAAK03C,YAAY,OAI7B,IAAM1pD,EAAmD,CACvDmvB,eAAAv3B,GAEFoa,KAAKT,IAAG,6BAEJ3Z,EAAeG,OACM,8BAAA4Q,OAAA,EAAAA,EAAgBsB,KAAK,oBAE9C+H,KAAKwb,IAAI6C,QAAQ3lB,EAAO4B,wBAAyBtM,IAEhC,IAAb0J,IAAoC,IAAlBsI,KAAKu1C,SACzBv1C,KAAKq5C,iBAAiB3hD,EAEzB,MAAUsI,KAAK4pB,qBAAqBv8B,IAEnC2S,KAAKq5C,iBAAiBr5C,KAAKu1C,QAzE7B,GA2ED5+C,EAEO+gD,YAAR,SAAoBhuD,GAGlB,IAFA,IAAMoN,EAASkJ,KAAKs3C,cACd3gD,EAAgBqJ,KAAKw3C,mBAClBxxD,EAAI,EAAGA,EAAI8Q,EAAO/Q,OAAQC,IAAK,CACtC,IAAMqH,EAAQyJ,EAAO9Q,GACrB,KACG2Q,GAAkBtJ,EAAMuhB,WACvBjY,GAAkBjN,MAIjBA,GAAgBojC,GAAcz/B,EAAO3D,IACxC,OAAO1D,CAEX,CACA,GAAI0D,EAAc,CAChB,IAAK,IAAI9D,EAAI,EAAGA,EAAIkR,EAAO/Q,OAAQH,IAAK,CACtC,IAAMgR,EAAQE,EAAOlR,GACrB,GACEqxD,GAAyBvtD,EAAaouB,MAAOlhB,EAAMkhB,MAAO,CACxD,WACA,iBACA,oBAGF,OAAOlyB,CAEX,CACA,IAAK,IAAI2R,EAAI,EAAGA,EAAIT,EAAO/Q,OAAQwR,IAAK,CACtC,IAAMpK,EAAQ2J,EAAOS,GACrB,GACE0/C,GAAyBvtD,EAAaouB,MAAO3qB,EAAM2qB,MAAO,CACxD,aAGF,OAAOvgB,CAEX,CACF,CACA,OAAQ,GACTZ,EAEOwiD,sBAAR,SAA8BzvD,GAC5B,GAAIA,EAEF,IADA,IAAMoN,EAASkJ,KAAKs3C,cACX3gD,EAAI,EAAGA,EAAIG,EAAO/Q,OAAQ4Q,IAEjC,GAAIugD,GADUpgD,EAAOH,GACoBjN,GACvC,OAAOiN,EAIb,OAAQ,GACTA,EAESunB,QAAV,SAAkBx0B,EAAqBoN,IACjCA,EAAK6nB,OAAU7nB,EAAK5M,UAKtB4M,EAAK5M,QAAQvC,OAASszB,IACtBnkB,EAAK5M,QAAQyX,KAAO3B,KAAKu1C,SACvBv1C,KAAKq3C,WAA6D,IAAjDr3C,KAAKq3C,SAASllD,QAAQ2E,EAAK5M,QAAQ6uB,UAEtD/Y,KAAKkqB,WAAWpzB,GAAA,EAEnBH,EAqBM4iD,kBAAP,SACE7vD,GAGA,GADAsW,KAAKwb,IAAI/rB,OAAO6pD,mBAAqB5vD,EACjCA,EAAgB,CAClB,IAAMoN,EAAoBkJ,KAAKw5C,kBAE/B,GADAx5C,KAAKw3C,oBAAA,EACD1gD,EAAkB/Q,OAAQ,CAE5B,IAAM4Q,EAAeqJ,KAAKu3C,aAC1B,GAAI5gD,GAAgBm2B,GAAcpjC,EAAgBiN,GAChD,OAAOA,EAGT,IAAM3Q,EAAa6mC,GACjBnjC,EACAsW,KAAKs3C,eAEP,GAAItxD,GAAc,EAAG,CACnB,IAAMqH,EAAQ2S,KAAKs3C,cAActxD,GAEjC,OADAga,KAAKq5C,iBAAiBrzD,GACfqH,CACR,CAAM,GAAIsJ,EAGT,OAAO,KAGP,IAAM/Q,EAAWinC,GACfnjC,EACAoN,GAEF,GAAIlR,GAAY,EACd,OAAOkR,EAAkBlR,EAG/B,CACF,CACA,OAAO,MACR+Q,EAES8yB,aAAV,SAAuB3yB,GACrBpN,EAAAjD,UAAMgjC,aAAY7iC,KAAC,MACnB,IAAM+P,EAAeqJ,KAAKu3C,aAC1B,GAAIv3C,KAAK2pB,mBAAmBhzB,IAAiBA,EAAc,CACzD,IAAM3Q,EAAK2Q,EAAagL,GAClBtU,EAAUsJ,EAAaoiB,QACzBnzB,EAAM+Q,EAAa7K,IACvB,GAAIgL,EACF,IACElR,EAAMkR,EAAiB0tB,cAAc5+B,EACtC,CAAC,MAAO8D,GACPsW,KAAK7J,KAC0D,6DAAAzM,EAEjE,CAEFsW,KAAKT,IAAwC,oCAAAvZ,GAC7Cga,KAAKwb,IAAI6C,QAAQ3lB,EAAO+B,uBAAwB,CAC9C3O,IAAAlG,EACA+b,GAAA3b,EACA+yB,QAAA1rB,EACAsvB,mBAAoB7lB,GAAoB,MAE5C,CACF,EAEAH,EAKQ8iD,iBAAR,WACE,IAAQ/vD,EAAUsW,KAAVkhB,MACR,GAAKx3B,EAAL,CAIA,IAEIoN,EAFEH,EAAaupB,GAAqBx2B,EAAMm4B,YACxC77B,EAAega,KAAKu3C,aAiB1B,GAfIvxD,KACF8Q,EAAYH,EAAWoK,QAAO,SAACrX,GAAS,OACtCwtD,GAA8BlxD,EAAc0D,EAAA,IAC5C,KAEAsW,KAAK7J,KAAI,gDACyCnQ,EAAa6B,KAAI,mBAAmB7B,EAAakzB,KAAI,MAI3G,GAAG9Y,MAAMxZ,KAAK+P,GAAYvD,SAAQ,SAAC1J,GACd,aAAfA,EAAM81B,MAAuB91B,IAAUoN,IACzCpN,EAAM81B,KAAO,WAEjB,IACI1oB,EAAW,CACb,IAAMzJ,EAAO2S,KAAK05C,gBAAkB,UAAY,SAC5C5iD,EAAU0oB,OAASnyB,IACrByJ,EAAU0oB,KAAOnyB,EAErB,CAzBA,CA0BF,EAEAsJ,EAIQ0iD,iBAAR,SAAyB3vD,GACvB,IAAMoN,EAASkJ,KAAKs3C,cAMpB,GAAKt3C,KAAKkhB,MAMV,GAAIx3B,GAAS,GAAKA,GAASoN,EAAO/Q,SAAWyO,EAAgB9K,GAC3DsW,KAAK7J,KAAmC,8BAAAzM,OAD1C,CAMAsW,KAAKupB,aAELvpB,KAAKw3C,oBAAA,EACL,IAAM7gD,EAAYqJ,KAAKu3C,aACjBvxD,EAA8B8Q,EAAOpN,IAAU,KAIrD,GAHAsW,KAAKu1C,QAAU7rD,EACfsW,KAAKu3C,aAAevxD,EACpBga,KAAKy5C,mBACAzzD,EAAL,CAKA,IAAMqH,IAAgBrH,EAAMi3B,UAAYj3B,EAAMi3B,QAAQpW,KACtD,GAAInd,IAAUsW,KAAKu1C,SAAWvvD,IAAU2Q,IAAatJ,EAArD,CAGA2S,KAAKT,IACH,+BAA+B7V,GAC5B1D,EACQ,KAAAA,EAAM6B,KAAA,UAAc7B,EAAMkzB,KAAc,UAAAlzB,EAAM+yB,QACnD,KAER,IAAQnzB,EAAsCI,EAAtC2b,GAAE/K,EAAoC5Q,EAAlC+yB,QAAAxhB,OAAA,IAAOX,EAAG,GAAEA,EAAEzJ,EAAoBnH,EAApB6B,KAAM6P,EAAc1R,EAAd2B,KAAMqG,EAAQhI,EAAR8F,IACtCkU,KAAKwb,IAAI6C,QAAQ3lB,EAAO8B,sBAAuB,CAC7CmH,GAAA/b,EACAmzB,QAAAxhB,EACA1P,KAAAsF,EACAxF,KAAA+P,EACA5L,IAAAkC,IAEF,IAAMD,EAAmBiS,KAAK0pB,aAC5B1jC,EAAM8F,IACG,MAAT6K,OAAA,EAAAA,EAAWsmB,QACXj3B,EAAMi3B,SAERjd,KAAKypB,aAAa17B,EApBlB,CAJA,MAFEiS,KAAKwb,IAAI6C,QAAQ3lB,EAAO8B,sBAAuB,CAAEmH,GAAIjY,GAbvD,MAREsW,KAAK24C,mBAAqBjvD,CAAA,EAgD7BkN,EAAAE,EAAA,EAAAjQ,IAAA,kBAAAia,IAveD,WACE,OAAOd,KAAKg5C,gBACb,EAAAz1C,IAED,SAA2B7Z,GACzBsW,KAAKg5C,iBAAmBtvD,EACpBsW,KAAKu1C,SAAW,GAClBv1C,KAAKy5C,kBAET,GAAC,CAAA5yD,IAAA,oBAAAia,IAuSD,WACE,OAAOd,KAAKusB,MACd,GAEA,CAAA1lC,IAAA,iBAAAia,IACA,WACE,OAAOd,KAAKs3C,aACd,GAEA,CAAAzwD,IAAA,gBAAAia,IACA,WACE,OAAOd,KAAKu1C,OACb,EAAAhyC,IAED,SAAkB7Z,GAChBsW,KAAKw3C,oBAAA,EACLx3C,KAAKq5C,iBAAiB3vD,EACxB,KAACoN,CAAA,CA7VG,CAAgCqyB,ICpBjBwwB,GAAoB,WAQvC,SAAAjwD,EAAYA,GAAsC,KAP1CkwD,aAAA,EAAO,KACPC,OAAgC,CACtC5zC,MAAO,GACPD,MAAO,GACPE,WAAY,IAIZlG,KAAK45C,QAAUlwD,CACjB,CAAC,IAAAoN,EAAApN,EAAAjD,UAkEA,OAlEAqQ,EAEMgjD,OAAP,SACEpwD,EACAoN,EACAH,GAEA,IAAM3Q,EAAQga,KAAK65C,OAAO/iD,GAC1B9Q,EAAMykB,KAAK/gB,GACU,IAAjB1D,EAAMD,QAAiB4Q,GACzBqJ,KAAK+5C,YAAYjjD,EAAA,EAEpBA,EAEMkjD,YAAP,SAAmBtwD,EAA4BoN,GAC/BkJ,KAAK65C,OAAO/iD,GACpB+iB,QAAQnwB,GACdsW,KAAK+5C,YAAYjjD,EAAA,EAClBA,EAEMmjD,cAAP,SAAqBvwD,GACnB,IAAIoN,EACEH,EAAuB,IAAI1L,SAAQ,SAACvB,GACxCoN,EAAUpN,CACZ,IACM1D,EAA6B,CACjCk0D,QAAApjD,EACAqjD,QAAS,WAAQ,EACjBC,WAAY,WAAQ,EACpBl8B,QAAS,WAAO,GAIlB,OADAle,KAAK85C,OAAO9zD,EAAW0D,GAChBiN,CAAA,EACRG,EAEMijD,YAAP,SAAmBrwD,GACjB,IAAMoN,EAAQkJ,KAAK65C,OAAOnwD,GAC1B,GAAIoN,EAAM/Q,OAAQ,CAChB,IAAM4Q,EAA6BG,EAAM,GACzC,IAGEH,EAAUujD,SACX,CAAC,MAAOpjD,GACP8I,EAAOzJ,KAAI,kDACyCzM,EAAI,6BAA6BoN,GAErFH,EAAUunB,QAAQpnB,GAGlB,IAAM9Q,EAAKga,KAAK45C,QAAQlwD,GACjB,MAAF1D,GAAAA,EAAIq0D,UACPr6C,KAAKs6C,oBAAoB5wD,EAE7B,CACF,GACDoN,EAEMwjD,oBAAP,SAA2B5wD,GACzBsW,KAAK65C,OAAOnwD,GAAMumB,QAClBjQ,KAAK+5C,YAAYrwD,EAAA,EAClBoN,EAEM1I,QAAP,SAAe1E,GACb,OAAOsW,KAAK65C,OAAOnwD,GAAM,IAC1BA,CAAA,CA5EsC,GC+BnC6wD,GACJ,uDAOmBC,GAAgB,WA4CnC,SAAA9wD,EAAYA,GAAU,IAAAoN,EAAA,KA3CtB,KACQmmB,QAA+B,KACvC,KACQw9B,WAA4B,KACpC,KACQC,oBAAA,EACR,KACQhI,eAAA,EAAS,KAETl3B,SAAA,EAER,KACOm/B,0BAAoC,EAE3C,KACQC,wBAAkC,EAE1C,KACO15B,MAAiC,KAExC,KACO25B,YAAkC,KAEzC,KACQC,mBAA2C,KAAI,KAE/CC,kBAAA,EAER,KACOC,aAAe,CACpBh1C,MAAO,EACPC,MAAO,EACPC,WAAY,GACb,KAEMqmB,OAAmB,CAAC,EAAC,KACrB0uB,cAA0B,CAAC,EAAC,KAC5BC,kBAAA,EAAY,KAET37C,SAAA,EAAG,KACHpJ,UAAA,EAAI,KACJjB,WAAA,EAAK,KA4IPimD,gBAAkB,SAACzxD,GACpBoN,EAAK0kB,KAGV1kB,EAAK0kB,IAAI8f,gBAAA,EACV,KACO8f,kBAAoB,SAAC1xD,GACtBoN,EAAK0kB,KAGV1kB,EAAK0kB,IAAI+f,iBAAA,EAgvBX,KACQ8f,mBAAqB,WAC3B,IAAQ3xD,EAAuBoN,EAAvBoqB,MAAOvqB,EAAgBG,EAAhB+jD,YACf/jD,EAAKyI,IAAI,uBACL7V,IACFA,EAAM4G,oBAAoB,UAAWwG,EAAKwkD,iBAC1CxkD,EAAKykD,6BACLzkD,EAAK0kB,IAAI6C,QAAQ3lB,EAAOE,eAAgB,CACtCsoB,MAAAx3B,EACAmxD,YAAalkD,KAIbA,GAEFA,EAAYrG,oBAAoB,aAAcwG,EAAKukD,oBAErDvkD,EAAK0kD,oBAAA,EACN,KAEOC,oBAAsB,WAC5B3kD,EAAKyI,IAAI,wBACV,KAEOm8C,oBAAsB,WAC5B5kD,EAAKyI,IAAI,uBACV,KAEO+7C,gBAAkB,WACxB,IAAQ5xD,EAAyBoN,EAAzB6kD,SAAUhlD,EAAeG,EAAf2jD,WACd/wD,IAAaiN,GACfiJ,EAAO1K,MAAK,0DACgDyB,EAAgB,MAAAjN,EAAA,MAn6B9EsW,KAAKwb,IAAM9xB,EACX,IjE3EiCiN,EiE2E3B3Q,EAAY,sBAClBga,KAAK+6C,cjE5E4BpkD,EiE6E/B0b,GAAe3oB,EAAI+F,OAAOskD,0BjE3EZ,oBAATr0C,MAAwB/I,IAAY+I,KAAa6S,oBiE6ExDvS,KAAKT,IAAMK,EAAOL,IAAI3V,KAAKgW,EAAQ5Z,GACnCga,KAAK7J,KAAOyJ,EAAOzJ,KAAKvM,KAAKgW,EAAQ5Z,GACrCga,KAAK9K,MAAQ0K,EAAO1K,MAAMtL,KAAKgW,EAAQ5Z,GACvCga,KAAK47C,oBACL57C,KAAK0b,mBACP,CAAC,IAAA5kB,EAAApN,EAAAjD,UAi6BA,OAj6BAqQ,EAEM+kD,eAAP,WACE,OACE77C,KAAK87C,uBAAuB/1D,OAAS,GACrCS,OAAOP,KAAK+Z,KAAKi7C,eAAel1D,OAAS,GAE5C+Q,EAEM2lB,QAAP,WACEzc,KAAKmc,sBACLnc,KAAKid,QAAU,KACfjd,KAAK86C,mBAAqB,KAE1B96C,KAAKwb,IAAM,MACZ1kB,EAES4kB,kBAAV,WACE,IAAQhyB,EAAQsW,KAARwb,IACR9xB,EAAIoyB,GAAGpjB,EAAOC,gBAAiBqH,KAAK+7C,iBAAkB/7C,MACtDtW,EAAIoyB,GAAGpjB,EAAOG,gBAAiBmH,KAAKuhB,iBAAkBvhB,MACtDtW,EAAIoyB,GAAGpjB,EAAOa,iBAAkByG,KAAK+b,kBAAmB/b,MACxDtW,EAAIoyB,GAAGpjB,EAAOe,gBAAiBuG,KAAKy3C,iBAAkBz3C,MACtDtW,EAAIoyB,GAAGpjB,EAAOK,aAAciH,KAAKg2C,cAAeh2C,MAChDtW,EAAIoyB,GAAGpjB,EAAOQ,iBAAkB8G,KAAKg8C,kBAAmBh8C,MACxDtW,EAAIoyB,GAAGpjB,EAAOM,cAAegH,KAAKi8C,eAAgBj8C,MAClDtW,EAAIoyB,GAAGpjB,EAAOU,WAAY4G,KAAKk8C,YAAal8C,MAC5CtW,EAAIoyB,GAAGpjB,EAAOW,gBAAiB2G,KAAKyhB,iBAAkBzhB,MACtDtW,EAAIoyB,GAAGpjB,EAAOoB,cAAekG,KAAK0hB,eAAgB1hB,MAClDtW,EAAIoyB,GAAGpjB,EAAO4C,YAAa0E,KAAKm8C,aAAcn8C,MAC9CtW,EAAIoyB,GAAGpjB,EAAO8C,aAAcwE,KAAKo8C,cAAep8C,KAAA,EACjDlJ,EAESqlB,oBAAV,WACE,IAAQzyB,EAAQsW,KAARwb,IACR9xB,EAAI0yB,IAAI1jB,EAAOC,gBAAiBqH,KAAK+7C,iBAAkB/7C,MACvDtW,EAAI0yB,IAAI1jB,EAAOG,gBAAiBmH,KAAKuhB,iBAAkBvhB,MACvDtW,EAAI0yB,IAAI1jB,EAAOa,iBAAkByG,KAAK+b,kBAAmB/b,MACzDtW,EAAI0yB,IAAI1jB,EAAOe,gBAAiBuG,KAAKy3C,iBAAkBz3C,MACvDtW,EAAI0yB,IAAI1jB,EAAOK,aAAciH,KAAKg2C,cAAeh2C,MACjDtW,EAAI0yB,IAAI1jB,EAAOQ,iBAAkB8G,KAAKg8C,kBAAmBh8C,MACzDtW,EAAI0yB,IAAI1jB,EAAOM,cAAegH,KAAKi8C,eAAgBj8C,MACnDtW,EAAI0yB,IAAI1jB,EAAOU,WAAY4G,KAAKk8C,YAAal8C,MAC7CtW,EAAI0yB,IAAI1jB,EAAOW,gBAAiB2G,KAAKyhB,iBAAkBzhB,MACvDtW,EAAI0yB,IAAI1jB,EAAOoB,cAAekG,KAAK0hB,eAAgB1hB,MACnDtW,EAAI0yB,IAAI1jB,EAAO4C,YAAa0E,KAAKm8C,aAAcn8C,MAC/CtW,EAAI0yB,IAAI1jB,EAAO8C,aAAcwE,KAAKo8C,cAAep8C,KAAA,EAClDlJ,EAEO8kD,kBAAR,WACE57C,KAAKk7C,aAAe,CAAC,EACrBl7C,KAAK06C,eAAiB,IAAIf,GAAqB35C,KAAKk7C,cACpDl7C,KAAK0yC,UAAY,CACf1sC,MAAO,GACPC,MAAO,GACPC,WAAY,IAEdlG,KAAKg7C,aAAe,CAClBh1C,MAAO,EACPC,MAAO,EACPC,WAAY,GAEdlG,KAAK86C,mBAAqB,MAC3BhkD,EAEOilB,kBAAR,WACE/b,KAAK26C,0BAA4B36C,KAAK46C,wBAA0B,EAChE56C,KAAKid,QAAU,MAChBnmB,EAES2gD,iBAAV,SACE/tD,EACAoN,GAMA,IAAIH,EAAsB,GACrBG,EAAKkP,QAAUlP,EAAKmP,QAAWnP,EAAKulD,YACvC1lD,EAAc,GAEhBqJ,KAAK26C,0BAA4B36C,KAAK46C,wBAA0BjkD,EAChEqJ,KAAKT,IAAOS,KAAK26C,0BAAA,mCAClB7jD,EAESilD,iBAAV,SACEryD,EACAoN,GAEA,IAAMH,EAASqJ,KAAKkhB,MAAQpqB,EAAKoqB,MAC3Bl7B,EAAcqsB,GAAerS,KAAK+6C,cAExC,GAAIpkD,GAAS3Q,EAAa,KAAAqH,EAClBzH,EAAMoa,KAAK66C,YAAc,IAAI70D,EACnCga,KAAKT,IAAG,0BAA0B,OAA1BlS,EAA0BzH,EAAGE,kBAAA,EAAHuH,EAAgBxF,OAElDjC,EAAG8N,iBAAiB,aAAcsM,KAAKq7C,oBACvCz1D,EAAG8N,iBAAiB,cAAesM,KAAK07C,qBACxC91D,EAAG8N,iBAAiB,cAAesM,KAAKy7C,qBACpCz7C,KAAK+6C,eACPn1D,EAAG8N,iBAAiB,iBAAkBsM,KAAKo7C,mBAC3Cx1D,EAAG8N,iBAAiB,eAAgBsM,KAAKm7C,kBAI3C,IAAMvkD,EAAaoJ,KAAKy6C,WAAa/6C,KAAKoS,IAAIuiC,gBAAgBzuD,GAE9D,GAAIoa,KAAK+6C,aACP,IACEpkD,EAAM2lD,gBAAgB,OAEtB,IAAM/kD,EAAOmI,KAAa6S,mBAC1B5b,EAAM4lD,sBACJ5lD,EAAM4lD,uBAA0BhlD,GAAO3R,aAAc2R,EACvDilD,GAAqB7lD,GA88B/B,SAAmBjN,EAAyBoN,GAC1C,IAAMH,EAAS+I,KAAK/T,SAASC,cAAc,UAC3C+K,EAAOhP,KAAO,YACdgP,EAAO8lD,IAAM3lD,EACbpN,EAAMgzD,YAAY/lD,EACpB,CALA,CA78BoBA,EAAOC,GACjBD,EAAM+lB,MACP,CAAC,MAAOhzB,GACPiN,EAAM8lD,IAAM7lD,CACd,MAEAD,EAAM8lD,IAAM7lD,EAEdD,EAAMjD,iBAAiB,UAAWsM,KAAKs7C,gBACzC,GACDxkD,EAcSyqB,iBAAV,WACE,IAAQ73B,EAAmCsW,KAAnCkhB,MAAOpqB,EAA4BkJ,KAA5B66C,YAAalkD,EAAeqJ,KAAfy6C,WAC5B,GAAI3jD,EAAa,CAEf,GADAkJ,KAAKT,IAAI,0BACsB,SAA3BzI,EAAY7E,WACd,IAKE6E,EAAY6lD,aACb,CAAC,MAAOjzD,GACPsW,KAAK7J,KAAI,qBACczM,EAAIkM,QAAA,6BAE7B,CAGFoK,KAAKg2C,gBACLl/C,EAAYxG,oBAAoB,aAAc0P,KAAKq7C,oBACnDvkD,EAAYxG,oBAAoB,cAAe0P,KAAK07C,qBACpD5kD,EAAYxG,oBAAoB,cAAe0P,KAAKy7C,qBAChDz7C,KAAK+6C,eACPjkD,EAAYxG,oBACV,iBACA0P,KAAKo7C,mBAEPtkD,EAAYxG,oBAAoB,eAAgB0P,KAAKm7C,kBAKnDzxD,IACFA,EAAM4G,oBAAoB,UAAW0P,KAAKs7C,iBACtC3kD,GACF+I,KAAKoS,IAAI6iC,gBAAgBh+C,GAKvBqJ,KAAK27C,WAAahlD,GACpBjN,EAAM4yD,gBAAgB,OAClBt8C,KAAK+6C,cACPyB,GAAqB9yD,GAEvBA,EAAMgzB,QAEN1c,KAAK7J,KACH,iEAKN6J,KAAK66C,YAAc,KACnB76C,KAAKkhB,MAAQ,KACblhB,KAAKy6C,WAAa,KAClBz6C,KAAK26C,0BAA4B36C,KAAK46C,wBACtC56C,KAAKi7C,cAAgB,CAAC,EACtBj7C,KAAKusB,OAAS,CAAC,CACjB,CAEAvsB,KAAKwb,IAAI6C,QAAQ3lB,EAAOI,oBAAA,EAAgB,EACzChC,EAESk/C,cAAV,WAA0B,IAAAtsD,EAAA,KACxBsW,KAAK87C,uBAAuB1oD,SAAQ,SAAC0D,GACnCpN,EAAKkzD,YAAY9lD,EACnB,IACAkJ,KAAK47C,oBACL57C,KAAKwb,IAAI+f,iBAAA,EACVzkC,EAEO8lD,YAAR,SAAoBlzD,GAClB,IAAMoN,EAAKkJ,KAAKk7C,aAAaxxD,GAC7B,IACU,IAAAiN,EAAJG,IACFkJ,KAAK68C,sBAAsBnzD,GAG3BsW,KAAKk7C,aAAaxxD,QAAA,EACd,OAAJiN,EAAIqJ,KAAK66C,cAALlkD,EAAkBmmD,cAAc/2D,QAClCia,KAAK66C,YAAYkC,mBAAmBjmD,GAGzC,CAAC,MAAOA,GACPkJ,KAAK7J,KAAI,iBAAkBzM,EAAQoN,EACrC,GACDA,EAESmlD,eAAV,SACEvyD,EACAoN,GACA,IAAAH,EAAA,KACM3Q,EAAoBga,KAAK87C,uBAAuB/1D,OAChDsH,EAAa7G,OAAOP,KAAK6Q,GAgD/B,GA/CAzJ,EAAW+F,SAAQ,SAAC1J,GAClB,GAAI1D,EAAmB,CAErB,IAAMqH,EAAQsJ,EAAK41B,OAAO7iC,GAC1B,GAAI2D,GAA4C,mBAA5BA,EAAM0d,OAAOiyC,WAA2B,KAAAp3D,EAC1DgR,EACEE,EAAKpN,GADC6N,EAAEX,EAAF+K,GAAIxU,EAAKyJ,EAALqY,MAAOvX,EAAUd,EAAVmgD,WAAY/oD,EAAS4I,EAATktC,UAAW/1C,EAAQ6I,EAARs4C,SAEpCrhD,EAAmBmpB,GACvB3pB,EAAM4hB,MACN5hB,EAAM0pD,YAEFhqD,EAAe,MAAAc,OAAA,EAAAA,EAAkB3B,QACrCquD,GACA,MAEEzsD,EAAakpB,GAA0B7pB,EAAOuK,GAC5CqX,EAAsB,OAAbnpB,EAAGkI,QAAA,EAAAlI,EAAYsG,QAC5BquD,GACA,MAEF,GAAIzsD,GAAcf,IAAiBgiB,EAAW,CACd,UAA1BrlB,EAAU0W,MAAM,EAAG,KACrBtS,EAAaipB,GACXjpB,EACA6I,EAAKokD,eAGT,IAAM3tD,EAAcY,EAAS,WAAWF,EACxC6I,EAAKsmD,iBAAiBvzD,EAAW0D,GACjCuJ,EAAK4I,IAAG,mBAAoB1R,EAAgB,OAAOC,GACnD6I,EAAK41B,OAAO7iC,GAAa,CACvBqhB,OAAQ1d,EAAM0d,OACdkE,MAAA9hB,EACA22C,UAAA91C,EACA+oD,WAAAr/C,EACAw3C,SAAAnhD,EACA4T,GAAApK,EAEJ,CACF,CACF,MAEEZ,EAAKskD,cAAcvxD,GAAaoN,EAAKpN,EAEzC,KAGI1D,EAAJ,CAIA,IAAMJ,EAA4B0S,KAAKgN,IACrCtF,KAAK26C,0BAA4B,EACjC,GAEE36C,KAAK26C,4BAA8B/0D,IACrCoa,KAAKT,IACA3Z,EAAyB,kCAAkCyH,EAAW4K,KACvE,MAGJ+H,KAAK26C,0BAA4B/0D,GAE/Boa,KAAK66C,aAA+C,SAAhC76C,KAAK66C,YAAY5oD,YACvC+N,KAAKw7C,oBAfP,GAiBD1kD,EAESmmD,iBAAV,SAA2BvzD,EAAMoN,GAAU,IAAAH,EAAA,KACjC3Q,EAAmBga,KAAnB06C,eACFrtD,EAA6B,CACjC6sD,QAAS,WACP,IAAM7sD,EAAKsJ,EAAKukD,aAAaxxD,GACzB2D,IACFsJ,EAAK4I,IAAG,YAAa7V,EAAI,yBAAyBoN,GAClDzJ,EAAG2vD,WAAWlmD,IAEhB9Q,EAAes0D,oBAAoB5wD,EACpC,EACDywD,QAAS,WAAQ,EACjBC,WAAY,WAAQ,EACpBl8B,QAAS,SAACpnB,GACRH,EAAKR,KAAI,oBAAqBzM,EAAI,qBAAsBoN,EAC1D,GAGF9Q,EAAe8zD,OAAOzsD,EAAW3D,IAAQsW,KAAKi7C,cAAcvxD,GAAA,EAC7DoN,EAESklD,kBAAV,SACEtyD,EACAoN,GACA,IAAAH,EAAA,KACQ3Q,EAAgCga,KAAhCwb,IAAKnuB,EAA2B2S,KAA3B06C,eAAgB90D,EAAWoa,KAAXusB,OACrB31B,EAAsCE,EAAtChH,KAAMyH,EAAgCT,EAAhCnP,KAAMwF,EAA0B2J,EAA1B8wB,KAAMlwB,EAAoBZ,EAApBkmB,KAAMhvB,EAAc8I,EAAdynC,UAC1BxwC,EAAaC,EAAU0U,UAAUnL,GAEjC1J,EAAuB6R,KAAKoe,YAAY1U,MAC9Crb,EAAWuU,MAAQzU,EACnB,IAAMd,EAAgBI,EAAKuX,MAAMhC,UAC3B5U,EAAgB4J,EAAOA,EAAKgN,MAAMhC,UAAY,KACxB,IAAxB3V,EAAcuV,QAChBvV,EAAcuV,MAAQzU,GAEpBC,GAAyC,IAAxBA,EAAcwU,QACjCxU,EAAcwU,MAAQzU,GAQxB,IAAMkhB,EAAanpB,EAAOogB,MACtB5Y,GAAA,EACS,UAATmK,GAA8C,gBAA1B,MAAAwX,OAAA,EAAAA,EAAY+0B,aAClC12C,GACG4S,KAAK86C,oBACW,IAAjB9sD,EAAU2T,IACV3B,KAAK86C,mBAAmBj3C,KAAO7V,EAAU6V,GAC3C7D,KAAK86C,mBAAqB9sD,GAG5B,IAAMR,EAAYL,EAAKmV,MACjB9N,EAA6B,CACjC0lD,QAAS,WAEP,GADAnsD,EAAW+mC,aAAep1B,KAAKoe,YAAY1U,MACvChc,EAAsB,CACxB,IAAM1D,EAAKiN,EAAKukD,aAAa3jD,GAC7B,GAAI7N,EAAI,CACN,IAAMoN,EAAQtJ,EAAY9D,EAAGwzD,gBACzB5kD,KAAKC,IAAIzB,IAAU,KACrBH,EAAK4I,IAAG,kDAC4C/R,EAAS,YAAYsJ,EAAK,SAAS3J,EAAK0W,GAAE,KAE9Fna,EAAGwzD,gBAAkB1vD,EAEzB,CACF,CACAmJ,EAAKwmD,eAAevmD,EAAMW,EAC3B,EACD4iD,QAAS,WAER,EACDC,WAAY,WAEV,IAAM1wD,EAAMgW,KAAKoe,YAAY1U,MAC7Brb,EAAWgnC,WAAahnC,EAAWyU,IAAM9Y,EACb,IAAxBqD,EAAcwV,QAChBxV,EAAcwV,MAAQ7Y,GAEpBoE,GAAyC,IAAxBA,EAAcyU,QACjCzU,EAAcyU,MAAQ7Y,GAGxB,IAAQoN,EAAiBH,EAAjBukD,aACFl1D,EAAa,CAAC,EACpB,IAAK,IAAMqH,KAAQyJ,EACjB9Q,EAAWqH,GAAQgnC,GAAaE,YAAYz9B,EAAazJ,IAE3DsJ,EAAKqkD,aAAazjD,GAAQ,EACb,UAATA,GAA6B,UAATA,EACtBZ,EAAKqkD,aAAa90C,WAAa,GAE/BvP,EAAKqkD,aAAah1C,MAAQ,EAC1BrP,EAAKqkD,aAAa/0C,MAAQ,GAE5BtP,EAAK6kB,IAAI6C,QAAQ3lB,EAAOS,gBAAiB,CACvCxR,KAAA4P,EACAqwB,KAAAz6B,EACA6vB,KAAAtlB,EACA6mC,UAAAvwC,EACA8wB,OAAQ3xB,EAAKxF,KACb+qC,WAAA1sC,GAEH,EACDk4B,QAAS,SAACx0B,GAER,IAAMoN,EAAmB,CACvBnP,KAAMwU,EAAWE,YACjByiB,OAAQ3xB,EAAKxF,KACbs1B,QAASxgB,EAAakC,oBACtBgqB,iBAAkBpxB,EAClBqwB,KAAAz6B,EACA6vB,KAAAtlB,EACA6mC,UAAAvwC,EACAkH,MAAAxL,EACA+H,IAAK/H,EACLi1B,OAAA,GAGF,GAAKj1B,EAAuBm1B,OAAS45B,aAAa2E,mBAGhDtmD,EAAMmmB,QAAUxgB,EAAaqC,sBACxB,CACL,IAAMzR,IAAqBsJ,EAAKqkD,aAAazjD,GAC7CT,EAAMmmB,QAAUxgB,EAAakC,oBAI7BhI,EAAKR,KACO,UAAA9I,EAAoB,IAAArH,EAAIyJ,OAAO4tD,oBAAmD,gCAAA9lD,EAAA,kBAE1FlK,GAAoBrH,EAAIyJ,OAAO4tD,sBACjCvmD,EAAM6nB,OAAA,EAEV,CACA34B,EAAIq4B,QAAQ3lB,EAAOkD,MAAO9E,EAC5B,GAEFzJ,EAAeysD,OAAOtlD,EAAW+C,IAAQyI,KAAKi7C,cAAc1jD,GAAA,EAC7DT,EAES2qB,iBAAV,SACE/3B,EACAoN,GACA,IAAAH,EAAA,KACQ3Q,EAAmBga,KAAnB06C,eACFrtD,EAAiB,SAAC3D,GAAsB,MAAuB,CACnEwwD,QAASvjD,EAAK2mD,eAAe1zD,KAC3B+M,EACAjN,EACAoN,EAAKorB,YACLprB,EAAKqrB,WAEPg4B,QAAS,WAER,EACDC,WAAY,WAEVzjD,EAAK6kB,IAAI6C,QAAQ3lB,EAAOY,eAAgB,CAAE3R,KAAA+B,GAC3C,EACDw0B,QAAS,SAACpnB,GACRH,EAAKR,KAAI,yBAA0BzM,EAAI,gBAAiBoN,EAC1D,IAGEA,EAAKnP,KACP3B,EAAe8zD,OAAOzsD,EAAeyJ,EAAKnP,MAAOmP,EAAKnP,MAEtDqY,KAAK87C,uBAAuB1oD,SAAQ,SAAC1J,GACnC1D,EAAe8zD,OAAOzsD,EAAe3D,GAAOA,EAC9C,KAEHoN,EAESqlD,aAAV,SAAuBzyD,EAA2BoN,GAAsB,IAAAH,EAAA,KAC9D3Q,EAAe8Q,EAAf8wB,KAAMv6B,EAASyJ,EAATkmB,KACRp3B,EAA6C,GAC7CgR,EAAoBvJ,EACtBA,EAAK8V,kBACLnd,EAAKmd,kBACLvM,EAAkBiM,GACpBjd,EAAkB6kB,KAAK,eAEnB7T,EAAkB+L,IACpB/c,EAAkB6kB,KAAK,SAErB7T,EAAkBgM,IACpBhd,EAAkB6kB,KAAK,UAmBM,IAA7B7kB,EAAkBG,QACpBia,KAAK7J,KACiE,oEAAAnQ,EAAK2B,KAAI,WAAW3B,EAAKie,MAAK,QAAQje,EAAK6d,IAInH7D,KAAKu9C,cArBe,WAClB,IAAM7zD,EAAMgW,KAAKoe,YAAY1U,MAC7BpjB,EAAK0e,MAAMhC,UAAUF,IAAM9Y,EACvB2D,IACFA,EAAKqX,MAAMhC,UAAUF,IAAM9Y,GAE7B,IAAMoN,EAAQzJ,EAAOA,EAAKqX,MAAQ1e,EAAK0e,MACvC/N,EAAK6kB,IAAI6C,QAAQ3lB,EAAO6C,cAAe,CACrCqsB,KAAA5hC,EACAg3B,KAAA3vB,EACAqX,MAAA5N,EACA6K,GAAI3b,EAAK2B,MAAA,GAUkB/B,EAAA,EAChCkR,EAEOslD,cAAR,SAAsB1yD,EAA4BoN,GAChDkJ,KAAKw9C,aACP,EAGA1mD,EACUolD,YAAV,SAAsBxyD,EAA0BoN,GAAqB,IAAAH,EAAA,KACrDqJ,KAAK87C,uBAAuBllC,QAAO,SAACltB,EAAK1D,GACrD,IAAMqH,EAAKsJ,EAAKukD,aAAal1D,GAQ7B,OAPIqH,GAAQyJ,EAAKnP,MAAQmP,EAAKnP,OAAS3B,IACrCqH,EAAGowD,QAAA,EACEpwD,EAAGwuC,QACNxuC,EAAGwuC,OAAA,EACHllC,EAAK4I,IAAOvZ,EAAA,2BAGT0D,KAAW2D,IAAMA,EAAGwuC,MAC5B,SAGC77B,KAAKT,IAAG,sCACRS,KAAKu9C,cAAa,WAChB5mD,EAAKmlD,uBAAuB1oD,SAAQ,SAAC1J,GACnC,IAAMoN,EAAKH,EAAKukD,aAAaxxD,GACzBoN,IACFA,EAAG2mD,QAAA,EAEP,IACA,IAAQ/zD,EAAgBiN,EAAhBkkD,YACHnxD,GAA0C,SAA3BA,EAAYuI,YAQhC0E,EAAK4I,IAAG,qCAER7V,EAAYizD,eATNjzD,GACFiN,EAAK4I,IAAG,qEAC+D7V,EAAYuI,WAQzF,MAEH6E,EAES4qB,eAAV,SACEh4B,EAA2BoN,GAE3B,IADEH,EAAOG,EAAPmmB,QAEGtmB,EAAQ8P,UAAU1gB,SAGvBia,KAAKid,QAAUtmB,EAEXqJ,KAAK87C,uBAAuB/1D,OAC9Bia,KAAKu9C,aAAav9C,KAAKu7C,2BAA2B3xD,KAAKoW,OAEvDA,KAAKu7C,6BAAA,EAERzkD,EAED0mD,YAAA,WACE,IAAQ9zD,EAAwBsW,KAAxBwb,IAAK1kB,EAAmBkJ,KAAnBid,QAAStmB,EAAUqJ,KAAVkhB,MACtB,GAAKvqB,GAAqB,OAAZG,GAIYkJ,KAAK87C,uBACR/1D,OAAvB,CAIA,IAAMC,EAA8B0D,EAAI+F,OAClCpC,EAAcsJ,EAAM+rB,YACpB98B,EAAiBkR,EAAQyhD,oBAGzB3hD,EACJE,EAAQ+P,MAAwC,OAAhC7gB,EAAO03D,qBACnB13D,EAAO03D,qBACP13D,EAAO23D,iBAEb,GAAInpD,EAAgBoC,IAAqBA,EAAmB,EAAG,CAC7D,IAAMW,EAAsBe,KAAKgN,IAAI1O,EAAkBhR,GACjDuH,EACJmL,KAAK2Q,MAAM5b,EAAczH,GAAkBA,EAC3C2R,EAEFyI,KAAK49C,gBACHvwD,EACAzH,EACAuH,EAEJ,CAEA,GACEqH,EAAgBxO,EAAO63D,4BACvB73D,EAAO63D,0BAA4B,EACnC,CACA,IAAMnmD,EAAoBY,KAAKgN,IAC7Btf,EAAO22C,gBACP32C,EAAO63D,2BAGH7vD,EAAuBsK,KAAKgN,IAAI5N,EAAmB9R,GACnDmI,EACJuK,KAAK2Q,MAAM5b,EAAczH,GAAkBA,EAC3CoI,EAEFgS,KAAK89C,iBACHzwD,EACAzH,EACAmI,EAEJ,CA5CA,GA6CD+I,EAED8mD,gBAAA,SACEl0D,EACAoN,EACAH,GACA,IAAA3Q,EAAA,KACQqH,EAA0B2S,KAA1Bid,QAASr3B,EAAiBoa,KAAjBk7C,aACSl7C,KAAK87C,uBAEb1oD,SAAQ,SAACwD,GACzB,IAAMW,EAAK3R,EAAagR,GACxB,GAAIW,EAAI,CACN,IAAMpK,EAAWknC,GAAaE,YAAYh9B,GAE1C,GACEpK,EAASpH,OAAS,GAClB4Q,EAA2BxJ,EAASmV,MAAM,GAC1C,CAMA,GALAtc,EAAKw1B,IAAI6C,QAAQ3lB,EAAOuD,oBAAqB,CAC3C8hD,UAAWpnD,IAIF,MAAPtJ,GAAAA,EAASwZ,KACX7gB,EAAKw1B,IAAI6C,QAAQ3lB,EAAOsD,yBAA0B,CAChD+hD,UAAWpnD,SAER,GACLY,EAAGskC,OACH1uC,EAASqV,IAAIrV,EAASpH,OAAS,GAAK2D,EAA+B,EAAjBoN,EAKlD,YAHA9Q,EAAKuZ,IACa,gBAAA3I,EAAA,qDAKpB5Q,EAAKw1B,IAAI6C,QAAQ3lB,EAAOW,gBAAiB,CACvC6oB,YAAa,EACbC,UAAWxrB,EACXhP,KAAAiP,GAEJ,CACF,CACF,KACDE,EAEDgnD,iBAAA,SACEp0D,EACAoN,EACAH,GACA,IAAA3Q,EAAA,KACQqH,EAAiB2S,KAAjBk7C,aACkBl7C,KAAK87C,uBAEb1oD,SAAQ,SAACxN,GACzB,IAAMgR,EAAKvJ,EAAazH,GACxB,GAAIgR,EAAI,CACN,IAAMW,EAAW88B,GAAaE,YAAY39B,GACpCzJ,EAAoBoK,EAASxR,OAEnC,GAAIoH,EAAoB,EACtB,OAEF,IAAMuK,EAAcH,EAAS+K,MAAMnV,EAAoB,GACjDa,EAAYuJ,EAASiL,IAAIrV,EAAoB,GAEnD,GACEwJ,EAA4Be,GAC3BhO,GAAegO,GAAehO,GAAesE,EAE9C,OACK,GAAI4I,EAAGilC,OAASnyC,EAAcsE,EAAY,EAAI8I,EAInD,YAHA9Q,EAAKuZ,IACa,gBAAA3Z,EAAA,sDAKpBI,EAAKw1B,IAAI6C,QAAQ3lB,EAAOW,gBAAiB,CACvC6oB,YAAaxqB,EACbyqB,UAAW,IACXx6B,KAAA/B,GAEJ,CACF,GACF,EAEAkR,EAKQykD,2BAAR,WACE,GACGv7C,KAAKid,SACLjd,KAAKkhB,OACLlhB,KAAK66C,aAC0B,SAAhC76C,KAAK66C,YAAY5oD,WAJnB,CAQA,IAAQvI,EAAqCsW,KAArCid,QAASnmB,EAA4BkJ,KAA5Bwb,IAAK7kB,EAAuBqJ,KAAvBkhB,MAAOl7B,EAAgBga,KAAhB66C,YACvBxtD,EAAgB3D,EAAQ+c,UAAU,GAAGnE,MAAQ5Y,EAAQ8d,cACrD5hB,EAAgB+Q,EAAM+K,SACtB9K,EAAapC,EAAgBxO,EAAY0b,UAC3C1b,EAAY0b,SACZ,EAEAhY,EAAQmd,MAAQ/P,EAAIrH,OAAOuuD,sBAE7Bh4D,EAAY0b,SAAW,IACvB1B,KAAKi+C,oBAAoBv0D,KAExB2D,EAAgBuJ,GAAcvJ,EAAgBzH,IAC9C4O,EAAgB5O,MAMjBoa,KAAKT,IAAyC,qCAAAlS,EAAcy8B,QAAQ,IACpE9jC,EAAY0b,SAAWrU,EArBzB,GAuBDyJ,EAEDmnD,oBAAA,SAAoBv0D,GAClB,IAAMoN,EAAckJ,KAAK66C,YACnBlkD,EAAYjN,EAAa+c,UAE/B,GADY9P,EAAU5Q,QACX2D,EAAamd,MAAQ,MAAA/P,GAAAA,EAAaonD,qBAAsB,CACjE,IAAMl4D,EAAQsS,KAAKgN,IAAI,EAAG3O,EAAU,GAAG2L,OACjCjV,EAAMiL,KAAKgN,IAAItf,EAAOA,EAAQ0D,EAAa8d,eACjDxH,KAAKT,IAAG,mCAC6BzI,EAAY4K,SAAQ,+BAA+B1b,EAAK,IAAIqH,EAAG,KAEpGyJ,EAAYonD,qBAAqBl4D,EAAOqH,EAC1C,GACDyJ,EAES0kD,mBAAV,WACE,IAAQ9xD,EAA6DsW,KAA7D26C,0BAA2B7jD,EAAkCkJ,KAAlC06C,eAAgB/jD,EAAkBqJ,KAAlBi7C,cAM7Cj1D,EAAqBQ,OAAOP,KAAK0Q,GAAe5Q,OACtD,GACEC,KACE0D,GACuB,IAAvB1D,GACA,eAAgB2Q,GAClB,CAEAqJ,KAAKm+C,oBAAoBxnD,GACzBqJ,KAAKi7C,cAAgB,CAAC,EAEtB,IAAM5tD,EAAU2S,KAAK87C,uBACrB,GAAIzuD,EAAQtH,OACVia,KAAKwb,IAAI6C,QAAQ3lB,EAAOO,eAAgB,CAAEszB,OAAQvsB,KAAKusB,SACvDl/B,EAAQ+F,SAAQ,SAAC1J,GACfoN,EAAeijD,YAAYrwD,EAC7B,QACK,CACL,IAAM9D,EAAQ,IAAIsR,MAChB,qDAEF8I,KAAKwb,IAAI6C,QAAQ3lB,EAAOkD,MAAO,CAC7BjU,KAAMwU,EAAWE,YACjB4gB,QAASxgB,EAAaiC,iCACtBigB,OAAA,EACAzpB,MAAAtP,EACAg5B,OAAQh5B,EAAMgQ,SAElB,CACF,GACDkB,EAESqnD,oBAAV,SAA8Bz0D,GAAkB,IAAAoN,EAAA,KACtCH,EAA8BqJ,KAA9Bk7C,aAAcl1D,EAAgBga,KAAhB66C,YACtB,IAAK70D,EACH,MAAMkR,MAAM,wDACb,IAAA7J,EAAA,SAAAA,GAEC,IAAKsJ,EAAatJ,GAAY,KAAAzH,EACtBgR,EAAQlN,EAAO2D,GACrB,IAAKuJ,EACH,MAAMM,MAAK,kCACyB7J,EAAS,4BAI/C,IAAIkK,GACkC,KAApC,OAAA3R,EAAAgR,EAAMmgD,iBAAA,EAANnxD,EAAkBuM,QAAQ,MACtByE,EAAMmgD,WACNngD,EAAMqY,MACR1X,GAC4B,UAA1BlK,EAAU+S,MAAM,EAAG,KACrB7I,EAAQwf,GAAuBxf,EAAOT,EAAKikD,eAG/C,IAAM5tD,EAAcyJ,EAAMktC,UAAA,WAAoBvsC,EAC9CT,EAAKyI,IAA6B,yBAAApS,EAAA,KAClC,IACE,IAAMuK,EAAMf,EAAatJ,GACvBrH,EAAYo4D,gBAAgBjxD,GACxBa,EAASX,EACfyJ,EAAKunD,kBAAkBrwD,EAAQ,cAAe8I,EAAKwnD,kBACnDxnD,EAAKunD,kBAAkBrwD,EAAQ,YAAa8I,EAAKynD,gBACjDznD,EAAKunD,kBAAkBrwD,EAAQ,QAAS8I,EAAK0nD,kBAEzC1nD,EAAKikD,cACPjkD,EAAKunD,kBACHrwD,EACA,kBACA,SAACtE,EAAwBiN,GAEvB,IAAM3Q,EAAgB2Q,EAAM8nD,cACX,MAAbz4D,GAAAA,EAAeD,QACjB+Q,EAAK0kB,IAAI6C,QAAQ3lB,EAAOY,eAAgB,CACtC3R,KAAM0F,GAGZ,IAIJyJ,EAAKy1B,OAAOl/B,GAAa,CACvB0d,OAAQrT,EACRuX,MAAO1X,EACPusC,UAAWltC,EAAMktC,UACjBiT,WAAYngD,EAAMmgD,WAClB7H,SAAUt4C,EAAMs4C,SAChBvtC,GAAI/K,EAAM+K,GAEb,CAAC,MAAOjY,GACPoN,EAAK5B,MAAK,2CAA4CxL,EAAIkM,SAC1DkB,EAAK0kB,IAAI6C,QAAQ3lB,EAAOkD,MAAO,CAC7BjU,KAAMwU,EAAWE,YACjB4gB,QAASxgB,EAAagC,uBACtBkgB,OAAA,EACAzpB,MAAOxL,EACPi/B,iBAAkBt7B,EAClBqxD,SAAUvxD,GAEd,CACF,GA/DF,IAAK,IAAMvH,KAAa8D,EAAM2D,EAAAzH,EAAA,EAiE/BkR,EA4COwnD,iBAAR,SAAyB50D,GACIsW,KAAnB06C,eACyBtsD,QAAQ1E,GAC/BywD,SAAA,EACXrjD,EAEOynD,eAAR,SAAuB70D,GAAwB,IAAAoN,EAC7C,GAAqC,YAAjC,OAAAA,EAAAkJ,KAAK66C,kBAAA,EAAL/jD,EAAkB7E,YAAtB,CAIA,IAAQ0E,EAAmBqJ,KAAnB06C,eACU/jD,EAAevI,QAAQ1E,GAC/B0wD,aACVzjD,EAAe2jD,oBAAoB5wD,EAJnC,MAFEsW,KAAK48C,YAAYlzD,EAAA,EAOpBoN,EAEO0nD,iBAAR,SAAyB90D,EAAwBoN,GAAc,IAAAH,EACvD3Q,EAAQ,IAAIkR,MACbxN,EAAI,iDAAgE,OAAhEiN,EAAgDqJ,KAAK66C,kBAAA,EAALlkD,EAAkB1E,aAE3E+N,KAAK9K,MAAK,GAAIlP,EAAS8Q,GAGvBkJ,KAAKwb,IAAI6C,QAAQ3lB,EAAOkD,MAAO,CAC7BjU,KAAMwU,EAAWE,YACjB4gB,QAASxgB,EAAamC,uBACtB+pB,iBAAkBj/B,EAClBwL,MAAAlP,EACA24B,OAAA,IAGF,IAAMtxB,EAAY2S,KAAK06C,eAAetsD,QAAQ1E,GAC1C2D,GACFA,EAAU6wB,QAAQl4B,EAEtB,EAEA8Q,EACQwmD,eAAR,SACE5zD,EACAoN,EACAH,GAEA,IAAQ3Q,EAAqDga,KAArDkhB,MAAO7zB,EAA8C2S,KAA9C66C,YAAaj1D,EAAiCoa,KAAjC06C,eACtB9jD,EADuDoJ,KAAjBk7C,aACpBxxD,GACxB,IAAK1D,IAAUqH,IAAgBuJ,EAK7B,OAJAoJ,KAAK7J,KAC8B,iCAAAzM,EAAA,6CAEnC9D,EAAe00D,oBAAoB5wD,GAGrC,IAAM6N,EAAgB/C,EAAgBxO,EAAM0b,UACxC1b,EAAM0b,SACN,IACEvU,EAAaqH,EAAgBnH,EAAYqU,UAC3CrU,EAAYqU,SACZ,IACEhK,EAAcY,KAAKgN,IAAI,EAAGxO,GAC1B9I,EAAYsK,KAAK+M,IAAI1O,EAAWY,EAAepK,GACjDa,EAAY0J,KAAiBd,EAAG6mD,QAAU7mD,EAAGilC,QAC/CjlC,EAAGilC,OAAA,EACH77B,KAAKT,IACU,aAAA7H,EAAA,IAAe1J,EAAS,cAActE,EAAI,iBAEzDkN,EAAG+nD,OAAOjnD,EAAa1J,IAGvBpI,EAAe00D,oBAAoB5wD,EAEvC,EAEAoN,EACQqmD,eAAR,SAAuBzzD,EAAkBoN,GACvC,IAAMH,EAAKqJ,KAAKk7C,aAAapkD,GAC7B,GAAKH,EASLA,EAAGklC,OAAA,EACHllC,EAAGioD,aAAal1D,QATd,IAAKsW,KAAKi7C,cAAcnkD,GACtB,MAAM,IAAII,MACuB,+BAAAJ,EAAA,uCAQvC,EAIAA,EACQymD,aAAR,SACE7zD,EACAoN,GACA,IAAAH,EAAA,KACA,QAAI,IAFJG,IAAAA,EAAmCkJ,KAAK87C,yBAEnChlD,EAAQ/Q,OAGX,OAFAia,KAAKT,IAAI,iEACTtU,QAAQyE,UAAUg9B,KAAKhjC,GAGzB,IAAQ1D,EAAmBga,KAAnB06C,eAGFrtD,EAAqByJ,EAAQyY,KAAI,SAAC7lB,GAAI,OAC1C1D,EAAei0D,cAAcvwD,EAAyB,IAExDuB,QAAQF,IAAIsC,GAAoBq/B,MAAK,WAEnChjC,IACAoN,EAAQ1D,SAAQ,SAAC1J,GACf,IAAMoN,EAAKH,EAAKukD,aAAaxxD,GAItB,MAAFoN,GAAAA,EAAIujD,UACPr0D,EAAes0D,oBAAoB5wD,EAEvC,GACF,KACDoN,EAEOglD,qBAAR,WACE,OAAOt1D,OAAOP,KAAK+Z,KAAKk7C,aAAA,EACzBpkD,EAEOunD,kBAAR,SACE30D,EACAoN,EACAH,GAEA,IAAM3Q,EAASga,KAAKk7C,aAAaxxD,GACjC,GAAK1D,EAAL,CAGA,IAAMqH,EAAWsJ,EAAG/M,KAAKoW,KAAMtW,GAC/BsW,KAAK0yC,UAAUhpD,GAAM+gB,KAAK,CAAE21B,MAAAtpC,EAAO+nD,SAAAxxD,IACnCrH,EAAO0N,iBAAiBoD,EAAOzJ,EAH/B,GAIDyJ,EAEO+lD,sBAAR,SAA8BnzD,GAC5B,IAAMoN,EAASkJ,KAAKk7C,aAAaxxD,GAC5BoN,GAGLkJ,KAAK0yC,UAAUhpD,GAAM0J,SAAQ,SAAC1J,GAC5BoN,EAAOxG,oBAAoB5G,EAAE02C,MAAO12C,EAAEm1D,SACxC,KACDjoD,EAAAlN,EAAA,EAAA7C,IAAA,WAAAia,IAzJD,WAA2C,IAAApX,EAAAoN,EACnCH,GAAkB,OAAVjN,EAAAsW,KAAKkhB,QAAL,OAAUpqB,EAAVpN,EAAYo1D,oBAAA,EAAZhoD,EAAAlQ,KAAA8C,EAA4B,YAAasW,KAAKkhB,MAC5D,OAAY,MAALvqB,OAAA,EAAAA,EAAO8lD,GAChB,KAAC/yD,CAAA,CAx9BkC,GAinCrC,SAAS8yD,GAAqB9yD,GAC5B,IAAMoN,EAAiBpN,EAAKq1D,iBAAiB,UAC7C,GAAG3+C,MAAMxZ,KAAKkQ,GAAgB1D,SAAQ,SAAC0D,GACrCpN,EAAKs1D,YAAYloD,EACnB,GACF,CCznCA,IAAMmoD,GAA0B,CAC9B,GAAM,IACN,GAAM,IACN,GAAM,IACN,GAAM,IACN,GAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,KAIN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,KACN,IAAM,IACN,IAAM,IACN,IAAM,KACN,IAAM,IACN,IAAM,GACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IAGN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,KACN,IAAM,IACN,IAAM,GACN,IAAM,KACN,IAAM,KACN,IAAM,IACN,IAAM,KACN,IAAM,KACN,IAAM,KACN,IAAM,KACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IAGN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,GACN,IAAM,GACN,IAAM,GACN,IAAM,IACN,IAAM,KACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,KACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,KACN,IAAM,KACN,IAAM,KACN,IAAM,MAMFC,GAAiB,SAACx1D,GAAY,OAClCwhB,OAAOC,aAAa8zC,GAAwBv1D,IAASA,EAAK,EAEtDy1D,GAAU,GACVC,GAAU,IAEVC,GAAa,CACjB,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,GACN,GAAM,GACN,GAAM,IAEFC,GAAc,CAClB,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,GACN,GAAM,GACN,GAAM,IAEFC,GAAa,CACjB,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,GACN,GAAM,GACN,GAAM,IAEFC,GAAc,CAClB,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,EACN,GAAM,GACN,GAAM,GACN,GAAM,IAGFC,GAAmB,CACvB,QACA,QACA,OACA,OACA,MACA,SACA,UACA,QACA,eAYIC,GAAc,oBAAAh2D,IAAA,KACXypC,KAAsB,KAAI,KAC1BwsB,aAAY,EAOlB,OAPkBj2D,EAAAjD,UAEnB8Y,IAAA,SAAI7V,EAAwBoN,GAC1B,GAAIkJ,KAAK2/C,cAAgBj2D,EAAU,CACjC,IAAMiN,EAA2B,mBAARG,EAAqBA,IAAQA,EACtD8I,EAAOL,IAAOS,KAAKmzB,KAAS,KAAAzpC,EAAa,KAAAiN,EAC3C,GACDjN,CAAA,CATiB,GAYdk2D,GAAqB,SAAUl2D,GAEnC,IADA,IAAMoN,EAAqB,GAClBH,EAAI,EAAGA,EAAIjN,EAAS3D,OAAQ4Q,IACnCG,EAAS2T,KAAK/gB,EAASiN,GAAGjQ,SAAS,KAGrC,OAAOoQ,CACT,EAUM+oD,GAAQ,oBAAAn2D,IAAA,KACLo2D,WAAqB,QAAO,KAC5BC,WAAA,EAA0B,KAC1BC,SAAA,EAAwB,KACxBC,WAAqB,QAAO,KAC5BC,OAAA,CAAsB,KAAAppD,EAAApN,EAAAjD,UAmE5B,OAnE4BqQ,EAE7B4hC,MAAA,WACE14B,KAAK8/C,WAAa,QAClB9/C,KAAK+/C,WAAA,EACL//C,KAAKggD,SAAA,EACLhgD,KAAKigD,WAAa,QAClBjgD,KAAKkgD,OAAA,CAAQ,EACdppD,EAEDqpD,UAAA,SAAUz2D,GAQR,IAPA,IAAMoN,EAAU,CACd,aACA,YACA,UACA,aACA,SAEOH,EAAI,EAAGA,EAAIG,EAAQ/Q,OAAQ4Q,IAAK,CACvC,IAAM3Q,EAAQ8Q,EAAQH,GAClBjN,EAAO/C,eAAeX,KACxBga,KAAKha,GAAS0D,EAAO1D,GAEzB,GACD8Q,EAEDspD,UAAA,WACE,MACsB,UAApBpgD,KAAK8/C,aACJ9/C,KAAK+/C,YACL//C,KAAKggD,SACc,UAApBhgD,KAAKigD,aACJjgD,KAAKkgD,KAAA,EAETppD,EAEDupD,OAAA,SAAO32D,GACL,OACEsW,KAAK8/C,aAAep2D,EAAMo2D,YAC1B9/C,KAAK+/C,YAAcr2D,EAAMq2D,WACzB//C,KAAKggD,UAAYt2D,EAAMs2D,SACvBhgD,KAAKigD,aAAev2D,EAAMu2D,YAC1BjgD,KAAKkgD,QAAUx2D,EAAMw2D,KAAA,EAExBppD,EAEDwpD,KAAA,SAAK52D,GACHsW,KAAK8/C,WAAap2D,EAAYo2D,WAC9B9/C,KAAK+/C,UAAYr2D,EAAYq2D,UAC7B//C,KAAKggD,QAAUt2D,EAAYs2D,QAC3BhgD,KAAKigD,WAAav2D,EAAYu2D,WAC9BjgD,KAAKkgD,MAAQx2D,EAAYw2D,KAAA,EAC1BppD,EAEDpQ,SAAA,WACE,MACE,SACAsZ,KAAK8/C,WACL,eACA9/C,KAAK+/C,UACL,aACA//C,KAAKggD,QACL,gBACAhgD,KAAKigD,WACL,WACAjgD,KAAKkgD,KAAA,EAERx2D,CAAA,CAxEW,GA+ER62D,GAAiB,oBAAA72D,IAAA,KACrB82D,MAAgB,IAAG,KACnBC,SAAqB,IAAIZ,EAAU,KAAA/oD,EAAApN,EAAAjD,UA2BlC,OA3BkCqQ,EAEnC4hC,MAAA,WACE14B,KAAKwgD,MAAQ,IACbxgD,KAAKygD,SAAS/nB,OAAA,EACf5hC,EAED4pD,QAAA,SAAQh3D,EAAeoN,GACrBkJ,KAAKwgD,MAAQ92D,EACbsW,KAAKygD,SAASH,KAAKxpD,EAAA,EACpBA,EAED6pD,YAAA,SAAYj3D,GACVsW,KAAKygD,SAASH,KAAK52D,EAAA,EACpBoN,EAEDupD,OAAA,SAAO32D,GACL,OAAOsW,KAAKwgD,QAAU92D,EAAM82D,OAASxgD,KAAKygD,SAASJ,OAAO32D,EAAM+2D,SAAA,EACjE3pD,EAEDwpD,KAAA,SAAK52D,GACHsW,KAAKwgD,MAAQ92D,EAAQ82D,MACrBxgD,KAAKygD,SAASH,KAAK52D,EAAQ+2D,SAAA,EAC5B3pD,EAED8pD,QAAA,WACE,MAAsB,MAAf5gD,KAAKwgD,OAAiBxgD,KAAKygD,SAASL,WAAA,EAC5C12D,CAAA,CA7BoB,GAoCVm3D,GAAG,WAOd,SAAAn3D,EAAYA,GAAwB,KAN7Bo3D,MAA6B,GAAE,KAC/BC,IAAc,EAAC,KACfC,aAAyB,IAAInB,GAAU,KACvCoB,aAA8B,KAAI,KACjCC,YAAA,EAGN,IAAK,IAAIpqD,EAAI,EAAGA,EAAIsoD,GAAStoD,IAC3BkJ,KAAK8gD,MAAMr2C,KAAK,IAAI81C,IAEtBvgD,KAAKkhD,OAASx3D,CAChB,CAAC,IAAAoN,EAAApN,EAAAjD,UAuIA,OAvIAqQ,EAEDupD,OAAA,SAAO32D,GACL,IAAK,IAAIoN,EAAI,EAAGA,EAAIsoD,GAAStoD,IAC3B,IAAKkJ,KAAK8gD,MAAMhqD,GAAGupD,OAAO32D,EAAMo3D,MAAMhqD,IACpC,OAAO,EAGX,OAAO,GACRA,EAEDwpD,KAAA,SAAK52D,GACH,IAAK,IAAIoN,EAAI,EAAGA,EAAIsoD,GAAStoD,IAC3BkJ,KAAK8gD,MAAMhqD,GAAGwpD,KAAK52D,EAAMo3D,MAAMhqD,GAAA,EAElCA,EAED8pD,QAAA,WAEE,IADA,IAAIl3D,GAAA,EACKoN,EAAI,EAAGA,EAAIsoD,GAAStoD,IAC3B,IAAKkJ,KAAK8gD,MAAMhqD,GAAG8pD,UAAW,CAC5Bl3D,GAAA,EACA,KACF,CAEF,OAAOA,CACT,EAEAoN,EAGAqqD,UAAA,SAAUz3D,GACJsW,KAAK+gD,MAAQr3D,IACfsW,KAAK+gD,IAAMr3D,GAGTsW,KAAK+gD,IAAM,GACb/gD,KAAKkhD,OAAO3hD,IAAG,EAEb,4BAA8BS,KAAK+gD,KAErC/gD,KAAK+gD,IAAM,GACF/gD,KAAK+gD,IAAM3B,KACpBp/C,KAAKkhD,OAAO3hD,IAAG,EAEb,6BAA+BS,KAAK+gD,KAEtC/gD,KAAK+gD,IAAM3B,GAEf,EAEAtoD,EAGAsqD,WAAA,SAAW13D,GACT,IAAMoN,EAASkJ,KAAK+gD,IAAMr3D,EAC1B,GAAIA,EAAS,EACX,IAAK,IAAIiN,EAAIqJ,KAAK+gD,IAAM,EAAGpqD,EAAIG,EAAS,EAAGH,IACzCqJ,KAAK8gD,MAAMnqD,GAAGgqD,YAAY3gD,KAAKghD,cAGnChhD,KAAKmhD,UAAUrqD,EACjB,EAEAA,EAGAuqD,UAAA,WACErhD,KAAKohD,YAAY,GACjBphD,KAAK8gD,MAAM9gD,KAAK+gD,KAAKL,QAAQ,IAAK1gD,KAAKghD,aAAA,EACxClqD,EAEDwqD,WAAA,SAAW53D,GAAc,IAAAoN,EAAA,KACnBpN,GAAQ,KAEVsW,KAAKqhD,YAEP,IAAM1qD,EAAOuoD,GAAex1D,GACxBsW,KAAK+gD,KAAO3B,GACdp/C,KAAKkhD,OAAO3hD,IAEV,oBACE,iBACA7V,EAAKhD,SAAS,IACd,KACAiQ,EACA,iBACAG,EAAKiqD,IACL,gBAAgB,KAItB/gD,KAAK8gD,MAAM9gD,KAAK+gD,KAAKL,QAAQ/pD,EAAMqJ,KAAKghD,cACxChhD,KAAKohD,WAAW,KACjBtqD,EAEDyqD,aAAA,SAAa73D,GACX,IAAIoN,EACJ,IAAKA,EAAIpN,EAAUoN,EAAIsoD,GAAStoD,IAC9BkJ,KAAK8gD,MAAMhqD,GAAG4hC,OAAA,EAEjB5hC,EAED0qD,MAAA,WACExhD,KAAKuhD,aAAa,GAClBvhD,KAAK+gD,IAAM,EACX/gD,KAAKghD,aAAatoB,OAAA,EACnB5hC,EAED2qD,gBAAA,WACEzhD,KAAKuhD,aAAavhD,KAAK+gD,IAAA,EACxBjqD,EAED4qD,cAAA,WAGE,IAFA,IAAMh4D,EAAkB,GACpBoN,GAAA,EACKH,EAAI,EAAGA,EAAIyoD,GAASzoD,IAAK,CAChC,IAAM3Q,EAAOga,KAAK8gD,MAAMnqD,GAAG6pD,MACd,MAATx6D,IACF8Q,GAAA,GAGFpN,EAAM+gB,KAAKzkB,EACb,CACA,OAAI8Q,EACK,GAEApN,EAAMuO,KAAK,KAErBnB,EAED6qD,aAAA,SAAaj4D,GACXsW,KAAKghD,aAAab,UAAUz2D,GACXsW,KAAK8gD,MAAM9gD,KAAK+gD,KACxBJ,YAAY3gD,KAAKghD,aAAA,EAC3Bt3D,CAAA,CAnJa,GA0JHk4D,GAAa,WAOxB,SAAAl4D,EAAYA,GAAwB,KANpCm4D,KAAc,GAAE,KAChBC,QAAkB,GAAW,KAC7BC,aAA8B,KAAI,KAClCC,iBAAyC,KAAI,KAC7Cd,YAAA,EAGE,IAAK,IAAIpqD,EAAI,EAAGA,EAAIqoD,GAASroD,IAC3BkJ,KAAK6hD,KAAKp3C,KAAK,IAAIo2C,GAAIn3D,IAEzBsW,KAAKkhD,OAASx3D,CAChB,CAAC,IAAAoN,EAAApN,EAAAjD,UA8LA,OA9LAqQ,EAED4hC,MAAA,WACE,IAAK,IAAIhvC,EAAI,EAAGA,EAAIy1D,GAASz1D,IAC3BsW,KAAK6hD,KAAKn4D,GAAG83D,QAEfxhD,KAAK8hD,QAAU,IAChBhrD,EAEDupD,OAAA,SAAO32D,GAEL,IADA,IAAIoN,GAAA,EACKH,EAAI,EAAGA,EAAIwoD,GAASxoD,IAC3B,IAAKqJ,KAAK6hD,KAAKlrD,GAAG0pD,OAAO32D,EAAMm4D,KAAKlrD,IAAK,CACvCG,GAAA,EACA,KACF,CAEF,OAAOA,CAAA,EACRA,EAEDwpD,KAAA,SAAK52D,GACH,IAAK,IAAIoN,EAAI,EAAGA,EAAIqoD,GAASroD,IAC3BkJ,KAAK6hD,KAAK/qD,GAAGwpD,KAAK52D,EAAMm4D,KAAK/qD,GAAA,EAEhCA,EAED8pD,QAAA,WAEE,IADA,IAAIl3D,GAAA,EACKoN,EAAI,EAAGA,EAAIqoD,GAASroD,IAC3B,IAAKkJ,KAAK6hD,KAAK/qD,GAAG8pD,UAAW,CAC3Bl3D,GAAA,EACA,KACF,CAEF,OAAOA,CAAA,EACRoN,EAEDuqD,UAAA,WACcrhD,KAAK6hD,KAAK7hD,KAAK8hD,SACvBT,WAAA,EACLvqD,EAED2qD,gBAAA,WACczhD,KAAK6hD,KAAK7hD,KAAK8hD,SACvBL,iBACN,EAEA3qD,EAGAwqD,WAAA,SAAW53D,GACGsW,KAAK6hD,KAAK7hD,KAAK8hD,SACvBR,WAAW53D,EAAA,EAChBoN,EAEDmrD,OAAA,SAAOv4D,GACOsW,KAAK6hD,KAAK7hD,KAAK8hD,SACvBH,aAAaj4D,EAAA,EAClBoN,EAEDsqD,WAAA,SAAW13D,GACGsW,KAAK6hD,KAAK7hD,KAAK8hD,SACvBV,WAAW13D,EAAA,EAChBoN,EAEDqqD,UAAA,SAAUz3D,GACRsW,KAAKkhD,OAAO3hD,IAAA,EAAuB,cAAgB7V,GACvCsW,KAAK6hD,KAAK7hD,KAAK8hD,SACvBX,UAAUz3D,EAAA,EACfoN,EAEDorD,OAAA,SAAOx4D,GACLsW,KAAKkhD,OAAO3hD,IAEV,oBAAM,aAAemhB,KAAKC,UAAUj3B,EAAQ,IAE9C,IAAIoN,EAASpN,EAAQy4D,IAAM,EAM3B,GALIniD,KAAK+hD,cAAgBjrD,EAASkJ,KAAK+hD,aAAe,IACpDjrD,EAASkJ,KAAK+hD,aAAe,GAI3B/hD,KAAK+hD,cAAgB/hD,KAAK8hD,UAAYhrD,EAAQ,CAEhD,IAAK,IAAIH,EAAI,EAAGA,EAAIwoD,GAASxoD,IAC3BqJ,KAAK6hD,KAAKlrD,GAAG6qD,QAKf,IAAMx7D,EAAcga,KAAK8hD,QAAU,EAAI9hD,KAAK+hD,aAGtC10D,EAAmB2S,KAAKgiD,iBAC9B,GAAI30D,EAAkB,CACpB,IAAMzH,EAAeyH,EAAiBw0D,KAAK77D,GAAai7D,aAClDrqD,EAAOoJ,KAAKkhD,OAAO/tB,KACzB,GAAqB,OAAjBvtC,GAAkC,OAATgR,GAAiBhR,EAAegR,EAC3D,IAAK,IAAIW,EAAI,EAAGA,EAAIyI,KAAK+hD,aAAcxqD,IACrCyI,KAAK6hD,KAAK/qD,EAASkJ,KAAK+hD,aAAexqD,EAAI,GAAG+oD,KAC5CjzD,EAAiBw0D,KAAK77D,EAAcuR,GAI5C,CACF,CAEAyI,KAAK8hD,QAAUhrD,EACf,IAAM3J,EAAM6S,KAAK6hD,KAAK7hD,KAAK8hD,SAC3B,GAAuB,OAAnBp4D,EAAQ04D,OAAiB,CAC3B,IAAM1qD,EAAShO,EAAQ04D,OACjBp0D,EAAUsK,KAAKgN,IAAI5N,EAAS,EAAG,GACrCvK,EAAIg0D,UAAUz3D,EAAQ04D,QACtB14D,EAAQ24D,MAAQl1D,EAAI2zD,MAAM9yD,GAASyyD,SAASX,UAC9C,CACA,IAAM/xD,EAAoB,CACxB+xD,WAAYp2D,EAAQ24D,MACpBtC,UAAWr2D,EAAQq2D,UACnBC,QAASt2D,EAAQs2D,QACjBC,WAAY,QACZC,OAAA,GAEFlgD,KAAKiiD,OAAOl0D,EACd,EAEA+I,EAGAwrD,WAAA,SAAW54D,GACTsW,KAAKkhD,OAAO3hD,IAEV,oBAAM,aAAemhB,KAAKC,UAAUj3B,EAAQ,IAE9CsW,KAAKqhD,YACLrhD,KAAKiiD,OAAOv4D,GACZsW,KAAKshD,WAAW,KACjBxqD,EAEDyrD,cAAA,SAAc74D,GACZsW,KAAK+hD,aAAer4D,CAAA,EACrBoN,EAED0rD,OAAA,WAAS,IAAA94D,EAAA,KACP,GAA0B,OAAtBsW,KAAK+hD,aAAT,CAOA/hD,KAAKkhD,OAAO3hD,IAAuB,qBAAM7V,EAAK+4D,gBAAA,IAC9C,IAAM3rD,EAAckJ,KAAK8hD,QAAU,EAAI9hD,KAAK+hD,aACtCprD,EAASqJ,KAAK6hD,KAAK3wC,OAAOpa,EAAa,GAAG,GAChDH,EAAO6qD,QACPxhD,KAAK6hD,KAAK3wC,OAAOlR,KAAK8hD,QAAS,EAAGnrD,GAClCqJ,KAAKkhD,OAAO3hD,IAAG,EAAoB,aANnC,MALES,KAAKkhD,OAAO3hD,IAAG,EAEb,uCAWN,EAEAzI,EAGA2rD,eAAA,SAAe/4D,GACbA,EAAWA,IAAA,EAIX,IAHA,IAAMoN,EAAwB,GAC1BH,EAAO,GACP3Q,GAAS,EACJqH,EAAI,EAAGA,EAAI8xD,GAAS9xD,IAAK,CAChC,IAAMzH,EAAUoa,KAAK6hD,KAAKx0D,GAAGq0D,gBACzB97D,IACFI,EAAQqH,EAAI,EACR3D,EACFoN,EAAY2T,KAAK,OAASzkB,EAAQ,MAAQJ,EAAU,KAEpDkR,EAAY2T,KAAK7kB,EAAQmR,QAG/B,CAQA,OAPID,EAAY/Q,OAAS,IAErB4Q,EADEjN,EACK,IAAMoN,EAAYmB,KAAK,OAAS,IAEhCnB,EAAYmB,KAAK,OAGrBtB,CAAA,EACRG,EAED4rD,iBAAA,WACE,OAAO1iD,KAAK6hD,IAAA,EACbn4D,CAAA,CA1MuB,GAsNpBi5D,GAAa,WAajB,SAAAj5D,EACEA,EACAoN,EACAH,GACA,KAhBFisD,UAAA,EAAI,KACJC,kBAAA,EAAY,KACZrjC,UAAA,EAAI,KACJsjC,aAAA,EAAO,KACPC,qBAAA,EAAe,KACfC,wBAAA,EAAkB,KAClBhB,sBAAA,EAAgB,KAChBiB,mBAAA,EAAa,KACbC,iBAAA,EAAW,KACXjC,kBAAA,EAAY,KACZC,YAAA,EAOElhD,KAAK4iD,KAAOl5D,EACZsW,KAAK6iD,aAAe/rD,EACpBkJ,KAAKwf,KAAO,KACZxf,KAAK8iD,QAAU,EACf9iD,KAAK+iD,gBAAkB,IAAInB,GAAcjrD,GACzCqJ,KAAKgjD,mBAAqB,IAAIpB,GAAcjrD,GAC5CqJ,KAAKgiD,iBAAmB,IAAIJ,GAAcjrD,GAC1CqJ,KAAKijD,cAAgBjjD,KAAK+iD,gBAAgBlB,KAAK,IAC/C7hD,KAAKkjD,YAAcljD,KAAK+iD,gBACxB/iD,KAAKwf,KAAO,KACZxf,KAAKihD,aAAe,KACpBjhD,KAAKkhD,OAASvqD,CAChB,CAAC,IAAAG,EAAApN,EAAAjD,UAgPA,OAhPAqQ,EAED4hC,MAAA,WACE14B,KAAKwf,KAAO,KACZxf,KAAK+iD,gBAAgBrqB,QACrB14B,KAAKgjD,mBAAmBtqB,QACxB14B,KAAKgiD,iBAAiBtpB,QACtB14B,KAAK6iD,aAAanqB,QAClB14B,KAAKijD,cAAgBjjD,KAAK+iD,gBAAgBlB,KAAK,IAC/C7hD,KAAKkjD,YAAcljD,KAAK+iD,gBACxB/iD,KAAKwf,KAAO,KACZxf,KAAKihD,aAAe,MACrBnqD,EAEDqsD,WAAA,WACE,OAAOnjD,KAAK6iD,YAAA,EACb/rD,EAEDssD,WAAA,SAAW15D,GACTsW,KAAK6iD,aAAen5D,CAAA,EACrBoN,EAEDorD,OAAA,SAAOx4D,GACLsW,KAAKkjD,YAAYhB,OAAOx4D,EAAA,EACzBoN,EAEDwrD,WAAA,SAAW54D,GACTsW,KAAKkjD,YAAYZ,WAAW54D,EAAA,EAC7BoN,EAEDusD,QAAA,SAAQ35D,GACFA,IAAYsW,KAAKwf,OAIrBxf,KAAKwf,KAAO91B,EACZsW,KAAKkhD,OAAO3hD,IAAuB,oBAAM,QAAU7V,CAAA,IACjC,gBAAdsW,KAAKwf,KACPxf,KAAKkjD,YAAcljD,KAAKgjD,oBAExBhjD,KAAKkjD,YAAcljD,KAAK+iD,gBACxB/iD,KAAKkjD,YAAYxqB,SAED,iBAAd14B,KAAKwf,OACPxf,KAAK+iD,gBAAgBhB,aAAe,KACpC/hD,KAAKgjD,mBAAmBjB,aAAe,MAEzC/hD,KAAKwf,KAAO91B,EAAA,EACboN,EAEDwsD,YAAA,SAAY55D,GACV,IAD2B,IAAAoN,EAAA,KAClBH,EAAI,EAAGA,EAAIjN,EAAM3D,OAAQ4Q,IAChCqJ,KAAKkjD,YAAY5B,WAAW53D,EAAMiN,IAGpC,IAAM3Q,EACJga,KAAKkjD,cAAgBljD,KAAK+iD,gBAAkB,OAAS,WACvD/iD,KAAKkhD,OAAO3hD,IAEV,qBAAMvZ,EAAS,KAAO8Q,EAAKosD,YAAYT,gBAAA,EAAoB,IAE3C,kBAAdziD,KAAKwf,MAA0C,iBAAdxf,KAAKwf,OACxCxf,KAAKkhD,OAAO3hD,IAEV,oBAAM,cAAgBzI,EAAKisD,gBAAgBN,gBAAA,EAAoB,IAEjEziD,KAAKujD,mBAAA,EAERzsD,EAED0sD,MAAA,WAEExjD,KAAKkhD,OAAO3hD,IAAG,EAAoB,gCACnCS,KAAKqjD,QAAQ,gBACdvsD,EAED2sD,KAAA,WAEEzjD,KAAKkhD,OAAO3hD,IAAG,EAAoB,kBACjB,cAAdS,KAAKwf,OAITxf,KAAKkjD,YAAY7B,YACbrhD,KAAKkjD,cAAgBljD,KAAK+iD,iBAC5B/iD,KAAKujD,mBAAA,EAERzsD,EAED4sD,MAAA,aAEC5sD,EAED6sD,MAAA,aAEC7sD,EAED8sD,MAAA,WAEE5jD,KAAKkhD,OAAO3hD,IAAG,EAAoB,6BACnCS,KAAKkjD,YAAYzB,kBACjBzhD,KAAKujD,kBAAA,EACNzsD,EAED+sD,KAAA,SAAKn6D,GAEHsW,KAAKkhD,OAAO3hD,IAAG,EAAoB,MAAQ7V,EAAS,eACpDsW,KAAKkjD,YAAcljD,KAAK+iD,gBACxB/iD,KAAKqjD,QAAQ,gBACbrjD,KAAKkjD,YAAYX,cAAc74D,EAAA,EAChCoN,EAEDgtD,MAAA,WAEE9jD,KAAKkhD,OAAO3hD,IAAG,EAAoB,kBACnCS,KAAKkjD,YAAYjB,OAAO,CAAE/B,OAAA,GAAO,EAClCppD,EAEDitD,MAAA,WAEE/jD,KAAKkhD,OAAO3hD,IAAG,EAAoB,kCACnCS,KAAKqjD,QAAQ,kBACdvsD,EAEDktD,KAAA,WAEEhkD,KAAKkhD,OAAO3hD,IAAG,EAAoB,MACnCS,KAAKqjD,QAAQ,cACdvsD,EAEDmtD,MAAA,WAEEjkD,KAAKkhD,OAAO3hD,IAAG,EAAoB,OACnCS,KAAKqjD,QAAQ,cACdvsD,EAEDotD,MAAA,WAEElkD,KAAKkhD,OAAO3hD,IAAG,EAAoB,gCACnCS,KAAK+iD,gBAAgBrqB,QACrB14B,KAAKujD,kBAAA,EAAiB,EACvBzsD,EAEDqtD,KAAA,WAEEnkD,KAAKkhD,OAAO3hD,IAAG,EAAoB,wBACnCS,KAAKkjD,YAAYV,SACjBxiD,KAAKujD,kBAAA,EAAiB,EACvBzsD,EAEDstD,MAAA,WAEEpkD,KAAKkhD,OAAO3hD,IAAG,EAAoB,oCACnCS,KAAKgjD,mBAAmBtqB,OAAA,EACzB5hC,EAEDutD,MAAA,WAAQ,IAAA36D,EAAA,KAGN,GADAsW,KAAKkhD,OAAO3hD,IAAG,EAAoB,wBACjB,gBAAdS,KAAKwf,KAAwB,CAC/B,IAAM1oB,EAAMkJ,KAAK+iD,gBACjB/iD,KAAK+iD,gBAAkB/iD,KAAKgjD,mBAC5BhjD,KAAKgjD,mBAAqBlsD,EAC1BkJ,KAAKkjD,YAAcljD,KAAKgjD,mBACxBhjD,KAAKkhD,OAAO3hD,IAEV,oBAAM,SAAW7V,EAAKq5D,gBAAgBN,gBAAgB,GAE1D,CACAziD,KAAKujD,kBAAA,EAAiB,EACvBzsD,EAEDwtD,KAAA,SAAK56D,GAEHsW,KAAKkhD,OAAO3hD,IAAG,EAAoB,MAAQ7V,EAAS,kBACpDsW,KAAKkjD,YAAY9B,WAAW13D,EAAA,EAC7BoN,EAEDytD,SAAA,SAAS76D,GAEP,IAAMoN,EAA6B,CAAEopD,OAAA,GAGrC,GAFAppD,EAAOipD,UAAYr2D,EAAa,GAAM,EACtCoN,EAAOkpD,QAAUt2D,GAAc,GAC1BoN,EAAOkpD,QAaVlpD,EAAOgpD,WAAa,YAbD,CACnB,IAAMnpD,EAAa2B,KAAK2Q,MAAMvf,EAAa,GAAK,GAUhDoN,EAAOgpD,WATQ,CACb,QACA,QACA,OACA,OACA,MACA,SACA,WAEyBnpD,EAC7B,CAGAqJ,KAAKkhD,OAAO3hD,IAAuB,aAAamhB,KAAKC,UAAU7pB,IAC/DkJ,KAAKkjD,YAAYjB,OAAOnrD,EAAA,EACzBA,EAEDysD,iBAAA,SAAiB75D,QAAA,IAAAA,IAAAA,GAAA,GACf,IAAMoN,EAAOkJ,KAAKkhD,OAAO/tB,KACZ,OAATr8B,GAIAkJ,KAAK6iD,eACmB,OAAtB7iD,KAAKihD,cAA0BjhD,KAAK+iD,gBAAgBnC,UAIjD5gD,KAAK+iD,gBAAgB1C,OAAOrgD,KAAKgiD,oBACpChiD,KAAK6iD,aAAa2B,OAChBxkD,KAAKihD,aACLnqD,EACAkJ,KAAKgiD,kBAEHt4D,GAAYsW,KAAK6iD,aAAa4B,aAChCzkD,KAAK6iD,aAAa4B,cAGpBzkD,KAAKihD,aAAejhD,KAAK+iD,gBAAgBnC,UAAY,KAAO9pD,GAZ9DkJ,KAAKihD,aAAenqD,EAetBkJ,KAAKgiD,iBAAiB1B,KAAKtgD,KAAK+iD,iBAAA,EAEnCjsD,EAED4tD,eAAA,SAAeh7D,GACTsW,KAAK6iD,eACF7iD,KAAK+iD,gBAAgBnC,YACpB5gD,KAAK6iD,aAAa2B,QACpBxkD,KAAK6iD,aAAa2B,OAAOxkD,KAAKihD,aAAev3D,EAAGsW,KAAK+iD,iBAGvD/iD,KAAKihD,aAAev3D,GAAA,EAGzBA,CAAA,CA9QgB,GAkSbi7D,GAAY,WAMhB,SAAAj7D,EAAYA,EAAuBoN,EAAoBH,GAAoB,KAL3E0iB,cAAA,EAAQ,KACRurC,eAA2B,EAAC,KAC5BC,WA2YO,CACLj/D,EAAG,KACHC,EAAG,MA7YsC,KAC3Cq7D,YAAA,EAGE,IAAMl7D,EAAUga,KAAKkhD,OAAS,IAAIxB,GAClC1/C,KAAKqZ,SAAW,CACd,KACA,IAAIspC,GAAcj5D,EAAOoN,EAAM9Q,GAC/B,IAAI28D,GAAcj5D,EAAQ,EAAGiN,EAAM3Q,GAEvC,CAAC,IAAA8Q,EAAApN,EAAAjD,UAgXA,OAhXAqQ,EAEDqsD,WAAA,SAAWz5D,GACT,OAAQsW,KAAKqZ,SAAS3vB,GAA2By5D,YAAA,EAClDrsD,EAEDssD,WAAA,SAAW15D,EAAiBoN,GACzBkJ,KAAKqZ,SAAS3vB,GAA2B05D,WAAWtsD,EACvD,EAEAA,EAGAguD,QAAA,SAAQp7D,EAAqBoN,GAAoB,IAAAH,EAAA,KAC/CqJ,KAAKkhD,OAAO/tB,KAAOzpC,EACnB,IADwB,IAAA1D,EAAA,SAAA0D,GAEtB,IAAM1D,EAAkB,IAAd8Q,EAASpN,GACb2D,EAAsB,IAAlByJ,EAASpN,EAAI,GACnB9D,GAAA,EACAgR,EAA8B,KAElC,GAAU,IAAN5Q,GAAiB,IAANqH,EAAS,SAGtBsJ,EAAKuqD,OAAO3hD,IAEV,oBACE,IACAqgD,GAAmB,CAAC9oD,EAASpN,GAAIoN,EAASpN,EAAI,KAC9C,SACAk2D,GAAmB,CAAC55D,EAAGqH,IACvB,GAAG,IAIT,IAAMkK,EAAaZ,EAAKkuD,WAExB,GADsB7+D,GAAK,IAAQA,GAAK,GACrB,CAEjB,GAqVR,SAAwB0D,EAAWoN,EAAWH,GAC5C,OAAOA,EAAW/Q,IAAM8D,GAAKiN,EAAW9Q,IAAMiR,CAChD,CAFA,CArV2B9Q,EAAGqH,EAAGkK,GAQrB,OAPFwtD,GAAW,KAAM,KAAMxtD,GACvBZ,EAAKuqD,OAAO3hD,IAEV,oBACE,qBACAqgD,GAAmB,CAAC55D,EAAGqH,IACvB,cAAc,IAChB,EAGJ03D,GAAW/+D,EAAGqH,EAAGsJ,EAAKkuD,aAEtBj/D,EAAW+Q,EAAKquD,SAASh/D,EAAGqH,MAG1BzH,EAAW+Q,EAAKsuD,YAAYj/D,EAAGqH,IAG5BzH,IACHA,EAAW+Q,EAAKuuD,SAASl/D,EAAGqH,IAGzBzH,IACHA,EAAW+Q,EAAKwuD,0BAA0Bn/D,EAAGqH,GAEjD,MACE03D,GAAW,KAAM,KAAMxtD,GAEzB,IAAK3R,IACHgR,EAAaD,EAAKyuD,WAAWp/D,EAAGqH,IAChB,CACd,IAAMF,EAAWwJ,EAAKiuD,eAClBz3D,GAAYA,EAAW,EACTwJ,EAAK0iB,SAASlsB,GACtBm2D,YAAY1sD,GAEpBD,EAAKuqD,OAAO3hD,IAAG,EAEb,mCAGN,CAEG3Z,GAAagR,GAChBD,EAAKuqD,OAAO3hD,IAEV,oBACE,+BACAqgD,GAAmB,CAAC55D,EAAGqH,IACvB,UACAuyD,GAAmB,CAAC9oD,EAASpN,GAAIoN,EAASpN,EAAI,IAAI,GAGzD,EA9EQ2D,EAAI,EAAGA,EAAIyJ,EAAS/Q,OAAQsH,GAAK,EAACrH,EAAAqH,EA+E7C,EAEAyJ,EAIAkuD,SAAA,SAASt7D,EAAWoN,GAMlB,MAJS,KAANpN,GAAoB,KAANA,GAAoB,KAANA,GAAoB,KAANA,IAC3CoN,GAAK,IACLA,GAAK,KACc,KAANpN,GAAoB,KAANA,IAAeoN,GAAK,IAAQA,GAAK,IAE5D,OAAO,EAGT,IAAMH,EAAa,KAANjN,GAAoB,KAANA,GAAoB,KAANA,EAAa,EAAI,EACpD1D,EAAUga,KAAKqZ,SAAS1iB,GAyC9B,OAvCU,KAANjN,GAAoB,KAANA,GAAoB,KAANA,GAAoB,KAANA,EAClC,KAANoN,EACF9Q,EAAQw9D,QACO,KAAN1sD,EACT9Q,EAAQy9D,OACO,KAAN3sD,EACT9Q,EAAQ09D,QACO,KAAN5sD,EACT9Q,EAAQ29D,QACO,KAAN7sD,EACT9Q,EAAQ49D,QACO,KAAN9sD,EACT9Q,EAAQ69D,KAAK,GACE,KAAN/sD,EACT9Q,EAAQ69D,KAAK,GACE,KAAN/sD,EACT9Q,EAAQ69D,KAAK,GACE,KAAN/sD,EACT9Q,EAAQ89D,QACO,KAANhtD,EACT9Q,EAAQ+9D,QACO,KAANjtD,EACT9Q,EAAQg+D,OACO,KAANltD,EACT9Q,EAAQi+D,QACO,KAANntD,EACT9Q,EAAQk+D,QACO,KAANptD,EACT9Q,EAAQm+D,OACO,KAANrtD,EACT9Q,EAAQo+D,QACO,KAANttD,GACT9Q,EAAQq+D,QAIVr+D,EAAQs+D,KAAKxtD,EAAI,IAEnBkJ,KAAK4kD,eAAiBjuD,GAAA,CAExB,EAEAG,EAGAmuD,YAAA,SAAYv7D,EAAWoN,GACrB,IAAIH,EAAe,EAEnB,IAAW,KAANjN,GAAoB,KAANA,IAAeoN,GAAK,IAAQA,GAAK,GAAM,CAOxD,IALEH,EADQ,KAANjN,EACK,EAEA,KAGIsW,KAAK4kD,eAKhB,OAJA5kD,KAAKkhD,OAAO3hD,IAAG,EAEb,yCAIJ,IAAMvZ,EAAUga,KAAKqZ,SAAS1iB,GAC9B,QAAK3Q,IAGLA,EAAQu+D,SAASztD,GACjBkJ,KAAKkhD,OAAO3hD,IAEV,oBAAM,WAAaqgD,GAAmB,CAACl2D,EAAGoN,IAAM,GAAG,OAGvD,CACA,OAAO,CACT,EAEAA,EAIAouD,SAAA,SAASx7D,EAAWoN,GAClB,IAAIH,EAOJ,MAJIjN,GAAK,IAAQA,GAAK,IAAUA,GAAK,IAAQA,GAAK,KAChDoN,GAAK,IACLA,GAAK,MACc,KAANpN,GAAoB,KAANA,IAAeoN,GAAK,IAAQA,GAAK,IAE5D,OAAO,EAGT,IAAM9Q,EAAiB0D,GAAK,GAAO,EAAI,EAGrCiN,EADEG,GAAK,IAAQA,GAAK,GACL,IAAT9Q,EAAaq5D,GAAW31D,GAAK61D,GAAW71D,GAG/B,IAAT1D,EAAas5D,GAAY51D,GAAK81D,GAAY91D,GAElD,IAAM2D,EAAU2S,KAAKqZ,SAASrzB,GAC9B,QAAKqH,IAGLA,EAAQ60D,OAAOliD,KAAKqlD,aAAa1uD,EAAKG,IACtCkJ,KAAK4kD,eAAiB5+D,GAAA,EAExB,EAEA8Q,EAIAuuD,aAAA,SAAa37D,EAAaoN,GACxB,IAAIH,EACE3Q,EAAmB,CACvBq8D,MAAO,KACPrC,SAAA,EACAoC,OAAQ,KACRrC,WAAA,EACAoC,IAAKz4D,GA2BP,OAvBEiN,EADEG,EAAO,GACEA,EAAO,GAEPA,EAAO,GAGpB9Q,EAAQ+5D,UAA+B,IAAP,EAAXppD,GACjBA,GAAY,GACd3Q,EAAQq8D,MAAQ,CACd,QACA,QACA,OACA,OACA,MACA,SACA,UACA,SACA/pD,KAAK2Q,MAAMtS,EAAW,IACfA,GAAY,IACrB3Q,EAAQg6D,SAAA,EACRh6D,EAAQq8D,MAAQ,SAEhBr8D,EAAQo8D,OAA6C,EAApC9pD,KAAK2Q,OAAOtS,EAAW,IAAQ,GAE3C3Q,CACT,EAEA8Q,EAIAsuD,WAAA,SAAW17D,EAAWoN,GACpB,IAAIH,EAaE3Q,EAZFqH,EAA6B,KAC7BzH,EAA2B,KAwC/B,OAtCI8D,GAAK,IACPiN,EAAY,EACZ/Q,EAAY8D,EAAI,IAEhBiN,EAAY,EACZ/Q,EAAY8D,GAEV9D,GAAa,IAAQA,GAAa,IAIlCI,EADgB,KAAdJ,EACQkR,EAAI,GACS,KAAdlR,EACCkR,EAAI,IAEJA,EAAI,IAGhBkJ,KAAKkhD,OAAO3hD,IAEV,oBACE,iBACA2/C,GAAel5D,GACf,gBACA2Q,CAAS,IAEbtJ,EAAY,CAACrH,IACJ0D,GAAK,IAAQA,GAAK,MAC3B2D,EAAkB,IAANyJ,EAAU,CAACpN,GAAK,CAACA,EAAGoN,IAE9BzJ,GACF2S,KAAKkhD,OAAO3hD,IAEV,oBACE,iBACAqgD,GAAmBvyD,GAAuB4K,KAAK,IAAI,IAGlD5K,CACT,EAEAyJ,EAIAquD,0BAAA,SAA0Bz7D,EAAWoN,GACnC,IAKIH,EAHJ,MAFqB,KAANjN,GAAoB,KAANA,IAAeoN,GAAK,IAAQA,GAAK,KACzC,KAANpN,GAAoB,KAANA,IAAeoN,GAAK,IAAQA,GAAK,IAE5D,OAAO,EAGT,IAAM9Q,EAA8B,CAAC,EAC3B,KAAN0D,GAAoB,KAANA,GAChBiN,EAAQ2B,KAAK2Q,OAAOnS,EAAI,IAAQ,GAChC9Q,EAAQi6D,WAAaR,GAAiB9oD,GAClCG,EAAI,GAAM,IACZ9Q,EAAQi6D,WAAaj6D,EAAQi6D,WAAa,UAE7B,KAANnpD,EACT9Q,EAAQi6D,WAAa,eAErBj6D,EAAQ85D,WAAa,QACX,KAANhpD,IACF9Q,EAAQ+5D,WAAA,IAGZ,IAAM1yD,EAAiB3D,GAAK,GAAO,EAAI,EAGvC,OAF+BsW,KAAKqZ,SAAShsB,GACrCi1D,WAAWt8D,IAAA,CAErB,EAEA8Q,EAGA4hC,MAAA,WACE,IAAK,IAAIhvC,EAAI,EAAGA,EAAIlD,OAAOP,KAAK+Z,KAAKqZ,UAAUtzB,OAAQ2D,IAAK,CAC1D,IAAMoN,EAAUkJ,KAAKqZ,SAAS3vB,GAC1BoN,GACFA,EAAQ4hC,OAEZ,CACAqsB,GAAW,KAAM,KAAM/kD,KAAK6kD,WAC9B,EAEA/tD,EAGA4tD,eAAA,SAAeh7D,GACb,IAAK,IAAIoN,EAAI,EAAGA,EAAIkJ,KAAKqZ,SAAStzB,OAAQ+Q,IAAK,CAC7C,IAAMH,EAAUqJ,KAAKqZ,SAASviB,GAC1BH,GACFA,EAAQ+tD,eAAeh7D,EAE3B,GACDA,CAAA,CA7Xe,GAgYlB,SAASq7D,GACPr7D,EACAoN,EACAH,GAEAA,EAAW/Q,EAAI8D,EACfiN,EAAW9Q,EAAIiR,CACjB,KC33CqBwuD,GAAY,WAQ/B,SAAA57D,EAAYA,EAAwCoN,GAAmB,KAP/DyuD,wBAAA,EAAkB,KAClBC,UAAqC,GAAE,KACvCC,eAAA,EAAS,KACT5lC,UAA2B,KAAI,KAC/BC,QAAyB,KAAI,KAC7B4lC,OAA+B,KAGrC1lD,KAAKulD,mBAAqB77D,EAC1BsW,KAAKylD,UAAY3uD,CACnB,CAAC,IAAAA,EAAApN,EAAAjD,UA8BA,OA9BAqQ,EAED2tD,YAAA,WACyB,OAAnBzkD,KAAK6f,YAIT7f,KAAKulD,mBAAmBI,QACtB3lD,KAAKylD,UACLzlD,KAAK6f,UACL7f,KAAK8f,QACL9f,KAAK0lD,OACL1lD,KAAKwlD,WAEPxlD,KAAK6f,UAAY,OAClB/oB,EAED0tD,OAAA,SAAO96D,EAAmBoN,EAAiBH,IAClB,OAAnBqJ,KAAK6f,WAAsB7f,KAAK6f,UAAYn2B,KAC9CsW,KAAK6f,UAAYn2B,GAGnBsW,KAAK8f,QAAUhpB,EACfkJ,KAAK0lD,OAAS/uD,EACdqJ,KAAKulD,mBAAmBK,oBAAoB5lD,KAAKylD,UAAA,EAClD3uD,EAED4hC,MAAA,WACE14B,KAAKwlD,UAAY,GACjBxlD,KAAK6f,UAAY,MAClBn2B,CAAA,CAzC8B,GCqBjCm8D,GAAe,WACb,GAAgB,MAAZn8C,GAAAA,EAAc8W,OAChB,OAAO9gB,KAAK8gB,OAGd,IAAM92B,EAAoB,CAAC,GAAI,KAAM,MAG/BoN,EAAoB,CACxB,QACA,SACA,MACA,OACA,SAIF,SAASH,EAAqBjN,EAAYoN,GACxC,GAAqB,iBAAVA,EACT,OAAO,EAGT,IAAK5Q,MAAMC,QAAQuD,GACjB,OAAO,EAGT,IAAMiN,EAAUG,EAAMxD,cAEtB,SAAK5J,EAAQyI,QAAQwE,IACZA,CAIX,CASA,SAAS3Q,EAAiB0D,GACxB,OAAOiN,EACLG,EACApN,EAEJ,CAEA,SAAS2D,EAAO3D,GAA0D,QAAAoN,EAAA9O,UAAAjC,OAA7B4Q,EAAA,IAAIzQ,MAAA4Q,EAAA,EAAAA,EAAA,KAAA9Q,EAAA,EAAAA,EAAA8Q,EAAA9Q,IAAJ2Q,EAAI3Q,EAAA,GAAAgC,UAAAhC,GAE/C,IADA,IAAIqH,EAAI,EACDA,EAAIrF,UAAUjC,OAAQsH,IAAK,CAChC,IAAMzH,EAAOoC,UAAUqF,GACvB,IAAK,IAAMuJ,KAAKhR,EACd8D,EAAIkN,GAAKhR,EAAKgR,EAElB,CAEA,OAAOlN,CACT,CAEA,SAAS9D,EAAOkR,EAAmBlR,EAAiBgR,GAClD,IAAMW,EAAMyI,KACN7S,EAAU,CAAE24D,YAAA,GASlBvuD,EAAIwuD,cAAA,EAOJ,IAAIruD,EAAM,GACN1J,GAAA,EACAD,EAAa+I,EACbjJ,EAAWjI,EACXmH,EAAQ6J,EACR9I,EAAU,KACVihB,EAAuB,GACvB3hB,GAAA,EACAI,EAAyB,OACzBgH,EAAwB,QACxB4D,EAAY,GACZI,EAA4B,SAC5BE,EAAQ,GACRyD,EAAoB,SAExB3V,OAAOmC,eACL4O,EACA,KACAlK,EAAO,CAAE,EAAEF,EAAS,CAClB2T,IAAK,WACH,OAAOpJ,CACR,EACD6L,IAAK,SAAU7Z,GACbgO,EAAM,GAAKhO,CACb,KAIJlD,OAAOmC,eACL4O,EACA,cACAlK,EAAO,CAAE,EAAEF,EAAS,CAClB2T,IAAK,WACH,OAAO9S,CACR,EACDuV,IAAK,SAAU7Z,GACbsE,IAAiBtE,CACnB,KAIJlD,OAAOmC,eACL4O,EACA,YACAlK,EAAO,CAAE,EAAEF,EAAS,CAClB2T,IAAK,WACH,OAAO/S,CACR,EACDwV,IAAK,SAAU7Z,GACb,GAAqB,iBAAVA,EACT,MAAM,IAAI2oD,UAAU,uCAGtBtkD,EAAarE,EACbsW,KAAK+lD,cAAA,CACP,KAIJv/D,OAAOmC,eACL4O,EACA,UACAlK,EAAO,CAAE,EAAEF,EAAS,CAClB2T,IAAK,WACH,OAAOjT,CACR,EACD0V,IAAK,SAAU7Z,GACb,GAAqB,iBAAVA,EACT,MAAM,IAAI2oD,UAAU,qCAGtBxkD,EAAWnE,EACXsW,KAAK+lD,cAAA,CACP,KAIJv/D,OAAOmC,eACL4O,EACA,OACAlK,EAAO,CAAE,EAAEF,EAAS,CAClB2T,IAAK,WACH,OAAO/T,CACR,EACDwW,IAAK,SAAU7Z,GACbqD,EAAQ,GAAKrD,EACbsW,KAAK+lD,cAAA,CACP,KAKJv/D,OAAOmC,eACL4O,EACA,SACAlK,EAAO,CAAE,EAAEF,EAAS,CAClB2T,IAAK,WACH,OAAOhT,CACR,EACDyV,IAAK,SAAU7Z,GACboE,EAAUpE,EACVsW,KAAK+lD,cAAA,CACP,KAIJv/D,OAAOmC,eACL4O,EACA,WACAlK,EAAO,CAAE,EAAEF,EAAS,CAClB2T,IAAK,WACH,OAAOiO,CACR,EACDxL,IAAK,SAAUzM,GACb,IAAM9Q,EA9Jd,SAA8B8Q,GAC5B,OAAOH,EACLjN,EACAoN,EAEJ,CALA,CA8J6CA,GAErC,IAAI,IAAA9Q,EACF,MAAM,IAAIggE,YACR,+CAIJj3C,EAAY/oB,EACZga,KAAK+lD,cAAA,CACP,KAIJv/D,OAAOmC,eACL4O,EACA,cACAlK,EAAO,CAAE,EAAEF,EAAS,CAClB2T,IAAK,WACH,OAAO1T,CACR,EACDmW,IAAK,SAAU7Z,GACb0D,IAAiB1D,EACjBsW,KAAK+lD,cAAA,CACP,KAIJv/D,OAAOmC,eACL4O,EACA,OACAlK,EAAO,CAAE,EAAEF,EAAS,CAClB2T,IAAK,WACH,OAAOtT,CACR,EACD+V,IAAK,SAAU7Z,GACb,GAAqB,iBAAVA,GAAgC,SAAVA,EAC/B,MAAM,IAAIs8D,YACR,sDAIJx4D,EAAQ9D,EACRsW,KAAK+lD,cAAA,CACP,KAIJv/D,OAAOmC,eACL4O,EACA,YACAlK,EAAO,CAAE,EAAEF,EAAS,CAClB2T,IAAK,WACH,OAAOtM,CACR,EACD+O,IAAK,SAAU7Z,GACb,IAAMoN,EAAU9Q,EAAiB0D,GACjC,IAAKoN,EACH,MAAM,IAAIkvD,YACR,+CAIJxxD,EAAasC,EACbkJ,KAAK+lD,cAAA,CACP,KAIJv/D,OAAOmC,eACL4O,EACA,WACAlK,EAAO,CAAE,EAAEF,EAAS,CAClB2T,IAAK,WACH,OAAO1I,CACR,EACDmL,IAAK,SAAU7Z,GACb,GAAIA,EAAQ,GAAKA,EAAQ,IACvB,MAAM,IAAIwN,MAAM,uCAGlBkB,EAAY1O,EACZsW,KAAK+lD,cAAA,CACP,KAIJv/D,OAAOmC,eACL4O,EACA,gBACAlK,EAAO,CAAE,EAAEF,EAAS,CAClB2T,IAAK,WACH,OAAOtI,CACR,EACD+K,IAAK,SAAU7Z,GACb,IAAMoN,EAAU9Q,EAAiB0D,GACjC,IAAKoN,EACH,MAAM,IAAIkvD,YACR,+CAIJxtD,EAAiB1B,EACjBkJ,KAAK+lD,cAAA,CACP,KAIJv/D,OAAOmC,eACL4O,EACA,OACAlK,EAAO,CAAE,EAAEF,EAAS,CAClB2T,IAAK,WACH,OAAOpI,CACR,EACD6K,IAAK,SAAU7Z,GACb,GAAIA,EAAQ,GAAKA,EAAQ,IACvB,MAAM,IAAIwN,MAAM,mCAGlBwB,EAAQhP,EACRsW,KAAK+lD,cAAA,CACP,KAIJv/D,OAAOmC,eACL4O,EACA,QACAlK,EAAO,CAAE,EAAEF,EAAS,CAClB2T,IAAK,WACH,OAAO3E,CACR,EACDoH,IAAK,SAAU7Z,GACb,IAAMoN,EAAU9Q,EAAiB0D,GACjC,IAAKoN,EACH,MAAM,IAAIkvD,YACR,+CAIJ7pD,EAASrF,EACTkJ,KAAK+lD,cAAA,CACP,KASJxuD,EAAI0uD,kBAAA,CACN,CAYA,OANArgE,EAAOa,UAAUy/D,aAAe,WAG9B,OADgBxmD,KAAaymD,OACfC,oBAAoB1mD,KAAMM,KAAKyN,KAAA,EAGxC7nB,CACR,CAvWc,GClBTygE,GAAa,oBAAA38D,IAAA,CAYhB,OAZgBA,EAAAjD,UAEjBymB,OAAA,SAAOxjB,EAAoBoN,GACzB,IAAKpN,EACH,MAAO,GAGT,GAAoB,iBAATA,EACT,MAAM,IAAIwN,MAAM,iCAGlB,OAAOovD,mBAAmBz1D,mBAAmBnH,GAAA,EAC9CA,CAAA,CAZgB,GAgBZ,SAAS68D,GAAe78D,GAC7B,SAASoN,EAAepN,EAAGoN,EAAGH,EAAG3Q,GAC/B,OAAiB,MAAL,EAAJ0D,GAA0B,IAAL,EAAJoN,IAAmB,EAAJH,GAAS6J,WAAWxa,GAAK,EACnE,CAEA,IAAM2Q,EAAIjN,EAAMkwB,MAAM,uCACtB,OAAKjjB,EAID6J,WAAW7J,EAAE,IAAM,GAGdG,EAAeH,EAAE,GAAIA,EAAE,GAAI,EAAGA,EAAE,IAGlCG,EAAeH,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,IATjC,IAUX,CAGA,IACM6vD,GAAQ,oBAAA98D,IAAA,KACK+8D,OAAiCjgE,OAAO8D,OAAO,KAAK,KAAAwM,EAAApN,EAAAjD,UAkDpE,OAhDDqQ,EACAyM,IAAA,SAAI7Z,EAAWoN,GACRkJ,KAAKc,IAAIpX,IAAY,KAANoN,IAClBkJ,KAAKymD,OAAO/8D,GAAKoN,EAErB,EAKAA,EACAgK,IAAA,SAAIpX,EAAWoN,EAAYH,GACzB,OAAIA,EACKqJ,KAAKgS,IAAItoB,GAAKsW,KAAKymD,OAAO/8D,GAAKoN,EAAKH,GAGtCqJ,KAAKgS,IAAItoB,GAAKsW,KAAKymD,OAAO/8D,GAAKoN,CACxC,EACAA,EACAkb,IAAA,SAAItoB,GACF,OAAOA,KAAKsW,KAAKymD,MACnB,EACA3vD,EACA4vD,IAAA,SAAIh9D,EAAWoN,EAAQH,GACrB,IAAK,IAAI3Q,EAAI,EAAGA,EAAI2Q,EAAE5Q,SAAUC,EAC9B,GAAI8Q,IAAMH,EAAE3Q,GAAI,CACdga,KAAKuD,IAAI7Z,EAAGoN,GACZ,KACF,CAEJ,EACAA,EACA6vD,QAAA,SAAQj9D,EAAWoN,GACb,UAAUvL,KAAKuL,IAEjBkJ,KAAKuD,IAAI7Z,EAAGwW,SAASpJ,EAAG,IAE5B,EACAA,EACA8vD,QAAA,SAAQl9D,EAAWoN,GACjB,GAAI,2BAA2BvL,KAAKuL,GAAI,CACtC,IAAMH,EAAU6J,WAAW1J,GAC3B,GAAIH,GAAW,GAAKA,GAAW,IAE7B,OADAqJ,KAAKuD,IAAI7Z,EAAGiN,IAAA,CAGhB,CACA,OAAO,GACRjN,CAAA,CAnDW,GAwDd,SAASm9D,GACPn9D,EACAoN,EACAH,EACA3Q,GAEA,IAAMqH,EAASrH,EAAa0D,EAAMqO,MAAM/R,GAAc,CAAC0D,GACvD,IAAK,IAAM9D,KAAKyH,EACd,GAAyB,iBAAdA,EAAOzH,GAAlB,CAIA,IAAMgR,EAAKvJ,EAAOzH,GAAGmS,MAAMpB,GACT,IAAdC,EAAG7Q,QAMP+Q,EAFUF,EAAG,GACHA,EAAG,GARb,CAWJ,CAEA,IAAMkwD,GAAW,IAAIjB,GAAO,EAAG,EAAG,IAG5BkB,GAAwC,WAA9BD,GAASE,MAAgC,SAAW,SAEpE,SAASC,GAASv9D,EAAeoN,EAAaH,GAE5C,IAAM3Q,EAAS0D,EAEf,SAAS2D,IACP,IAAMyJ,EAAKyvD,GAAe78D,GAC1B,GAAW,OAAPoN,EACF,MAAM,IAAII,MAAM,wBAA0BlR,GAK5C,OADA0D,EAAQA,EAAMwC,QAAQ,iBAAkB,IACjC4K,CACT,CAyFA,SAASlR,IACP8D,EAAQA,EAAMwC,QAAQ,OAAQ,GAChC,CAMA,GAHAtG,IACAkR,EAAI+oB,UAAYxyB,IAChBzH,IAC0B,WAAtB8D,EAAM0W,MAAM,EAAG,GAEjB,MAAM,IAAIlJ,MACR,qEACElR,GAGN0D,EAAQA,EAAM0W,MAAM,GACpBxa,IACAkR,EAAIgpB,QAAUzyB,IAGdzH,IA1GA,SAA4B8D,EAAeoN,GACzC,IAAM9Q,EAAW,IAAIwgE,GAErBK,GACEn9D,GACA,SAAUA,EAAGoN,GACX,IAAIzJ,EACJ,OAAQ3D,GACN,IAAK,SAEH,IAAK,IAAI9D,EAAI+Q,EAAW5Q,OAAS,EAAGH,GAAK,EAAGA,IAC1C,GAAI+Q,EAAW/Q,GAAG+b,KAAO7K,EAAG,CAC1B9Q,EAASud,IAAI7Z,EAAGiN,EAAW/Q,GAAGshE,QAC9B,KACF,CAEF,MACF,IAAK,WACHlhE,EAAS0gE,IAAIh9D,EAAGoN,EAAG,CAAC,KAAM,OAC1B,MACF,IAAK,OACHzJ,EAAOyJ,EAAEiB,MAAM,KACf/R,EAAS2gE,QAAQj9D,EAAG2D,EAAK,IACrBrH,EAAS4gE,QAAQl9D,EAAG2D,EAAK,KAC3BrH,EAASud,IAAI,kBAGfvd,EAAS0gE,IAAIh9D,EAAG2D,EAAK,GAAI,CAAC,SACN,IAAhBA,EAAKtH,QACPC,EAAS0gE,IAAI,YAAar5D,EAAK,GAAI,CAAC,QAAS05D,GAAQ,QAGvD,MACF,IAAK,WACH15D,EAAOyJ,EAAEiB,MAAM,KACf/R,EAAS4gE,QAAQl9D,EAAG2D,EAAK,IACL,IAAhBA,EAAKtH,QACPC,EAAS0gE,IAAI,gBAAiBr5D,EAAK,GAAI,CACrC,QACA05D,GACA,MACA,YACA,aACA,SAIJ,MACF,IAAK,OACH/gE,EAAS4gE,QAAQl9D,EAAGoN,GACpB,MACF,IAAK,QACH9Q,EAAS0gE,IAAIh9D,EAAGoN,EAAG,CAAC,QAASiwD,GAAQ,MAAO,OAAQ,UAG1D,GACA,IACA,MAIFjwD,EAAIowD,OAASlhE,EAAS8a,IAAI,SAAU,MACpChK,EAAIqwD,SAAWnhE,EAAS8a,IAAI,WAAY,IACxC,IAAIzT,EAAOrH,EAAS8a,IAAI,OAAQ,QACnB,SAATzT,IAAsC,IAAnBy5D,GAASM,OAE9B/5D,GAAQ,GAEVyJ,EAAIswD,KAAO/5D,EACXyJ,EAAIuwD,UAAYrhE,EAAS8a,IAAI,YAAa,SAC1ChK,EAAIwwD,YAActhE,EAAS8a,IAAI,kBAC/BhK,EAAI0V,KAAOxmB,EAAS8a,IAAI,OAAQ,KAChChK,EAAIkwD,MAAQhhE,EAAS8a,IAAI,QAASimD,IAClC,IAAInhE,EAAWI,EAAS8a,IAAI,WAAY,QACvB,SAAblb,GAA6C,KAAtBkhE,GAASl4D,WAElChJ,EACgB,UAAdkR,EAAIkwD,OAAmC,SAAdlwD,EAAIkwD,MACzB,EACc,QAAdlwD,EAAIkwD,OAAiC,UAAdlwD,EAAIkwD,MACzB,IACA,IAEVlwD,EAAIlI,SAAWhJ,CACjB,CApFA,CA2GmB8D,EAAOoN,EAC5B,CAEO,SAASywD,GAAc79D,GAC5B,OAAOA,EAAMwC,QAAQ,iBAAkB,KACzC,CAOA,IAAas7D,GAAS,oBAAA99D,IAAA,KACZ2xC,MAQO,UAAS,KAChBtwB,OAAiB,GAAE,KACnB08C,QAAyB,IAAIpB,GAAe,KAC5CqB,WAAuB,GAAE,KACzBC,IAAqB,KAAI,KAC1BC,WAAA,EAAK,KACLC,oBAAA,EAAc,KACdC,aAAA,CAAO,KAAAhxD,EAAApN,EAAAjD,UA0Nb,OA1NaqQ,EAEd6jB,MAAA,SAAMjxB,GACJ,IAAMoN,EAAQkJ,KAUd,SAASrJ,IACP,IAAIjN,EAAiBoN,EAAMiU,OACvBpU,EAAM,EAIV,IAFAjN,EAAS69D,GAAc79D,GAGrBiN,EAAMjN,EAAO3D,QACG,OAAhB2D,EAAOiN,IACS,OAAhBjN,EAAOiN,MAELA,EAGJ,IAAM3Q,EAAe0D,EAAO0W,MAAM,EAAGzJ,GAWrC,MAToB,OAAhBjN,EAAOiN,MACPA,EAGgB,OAAhBjN,EAAOiN,MACPA,EAGJG,EAAMiU,OAASrhB,EAAO0W,MAAMzJ,GACrB3Q,CACT,CA/BI0D,IAEFoN,EAAMiU,QAAUjU,EAAM2wD,QAAQv6C,OAAOxjB,EAAM,CAAEq+D,QAAA,KAiD/C,IACE,IAAI/hE,EAAe,GACnB,GAAoB,YAAhB8Q,EAAMukC,MAAqB,CAE7B,IAAK,UAAU9vC,KAAKuL,EAAMiU,QACxB,OAAO/K,KAMT,IAAM3S,GAHNrH,EAAO2Q,KAGQijB,MAAM,qCACrB,GAAM,MAADvsB,IAAAA,EAAI,GACP,MAAM,IAAI6J,MAAM,+BAGlBJ,EAAMukC,MAAQ,QAChB,CAGA,IADA,IAAIz1C,GAAA,EACGkR,EAAMiU,QAAQ,CAEnB,IAAK,UAAUxf,KAAKuL,EAAMiU,QACxB,OAAO/K,KAST,OANKpa,EAGHA,GAAA,EAFAI,EAAO2Q,IAKDG,EAAMukC,OACZ,IAAK,SAEC,IAAI9vC,KAAKvF,GAnDnB6gE,GAoDoB7gE,GAlDlB,SAAU0D,EAAGoN,GAQZ,GACD,KA0CgB9Q,IAEV8Q,EAAMukC,MAAQ,MAEhB,SACF,IAAK,OAEEr1C,IACH8Q,EAAMukC,MAAQ,MAGhB,SACF,IAAK,KAEH,GAAI,iBAAiB9vC,KAAKvF,GAAO,CAC/B8Q,EAAMukC,MAAQ,OACd,KACF,CAEA,IAAKr1C,EACH,SAMF,GAHA8Q,EAAM6wD,IAAM,IAAI9B,GAAO,EAAG,EAAG,IAC7B/uD,EAAMukC,MAAQ,OAEe,IAAzBr1C,EAAKmM,QAAQ,UAAe,CAC9B2E,EAAM6wD,IAAIhmD,GAAK3b,EACf,QACF,CAGF,IAAK,MAEH,IAAK8Q,EAAM6wD,IAAK,CACd7wD,EAAMukC,MAAQ,SACd,QACF,CACA,IACE4rB,GAASjhE,EAAM8Q,EAAM6wD,IAAK7wD,EAAM4wD,WACjC,CAAC,MAAOh+D,GAEPoN,EAAM6wD,IAAM,KACZ7wD,EAAMukC,MAAQ,SACd,QACF,CACAvkC,EAAMukC,MAAQ,UACd,SACF,IAAK,UAED,IAAMzkC,GAAwC,IAAzB5Q,EAAKmM,QAAQ,UAKlC,IAAKnM,GAAS4Q,IAAiBhR,GAAA,GAA+B,CAExDkR,EAAM8wD,OAAS9wD,EAAM6wD,KACvB7wD,EAAM8wD,MAAM9wD,EAAM6wD,KAGpB7wD,EAAM6wD,IAAM,KACZ7wD,EAAMukC,MAAQ,KACd,QACF,CACA,GAAkB,OAAdvkC,EAAM6wD,IACR,SAGE7wD,EAAM6wD,IAAIl6C,OACZ3W,EAAM6wD,IAAIl6C,MAAQ,MAEpB3W,EAAM6wD,IAAIl6C,MAAQznB,EAEpB,SACF,IAAK,SAEEA,IACH8Q,EAAMukC,MAAQ,MAGtB,CACD,CAAC,MAAO3xC,GAEa,YAAhBoN,EAAMukC,OAAuBvkC,EAAM6wD,KAAO7wD,EAAM8wD,OAClD9wD,EAAM8wD,MAAM9wD,EAAM6wD,KAGpB7wD,EAAM6wD,IAAM,KAGZ7wD,EAAMukC,MAAwB,YAAhBvkC,EAAMukC,MAAsB,YAAc,QAC1D,CACA,OAAOr7B,IAAA,EACRlJ,EAED2hC,MAAA,WACE,IAAM/uC,EAAQsW,KACd,IAWE,IAPItW,EAAMi+D,KAAuB,WAAhBj+D,EAAM2xC,SACrB3xC,EAAMqhB,QAAU,OAChBrhB,EAAMixB,SAKY,YAAhBjxB,EAAM2xC,OAAuC,cAAhB3xC,EAAM2xC,MACrC,MAAM,IAAInkC,MAAM,8BAEnB,CAAC,MAAOJ,GACHpN,EAAMm+D,gBACRn+D,EAAMm+D,eAAe/wD,EAEzB,CAKA,OAJIpN,EAAMo+D,SACRp+D,EAAMo+D,UAGD9nD,IAAA,EACRtW,CAAA,CA1OmB,GC7PhBs+D,GAAa,mBAGbC,GAAa,SACjBv+D,EACAoN,EACAH,GAEA,YAAO,IAFPA,IAAAA,EAAmB,GAGjBjN,EAAY0W,MAAMzJ,EAAUA,EAAWG,EAAa/Q,UAAY+Q,CAEpE,EA4BMoxD,GAAO,SAAUx+D,GAGrB,IAFA,IAAIoN,EAAO,KACPH,EAAIjN,EAAK3D,OACN4Q,GACLG,EAAe,GAAPA,EAAapN,EAAK8f,aAAa7S,GAGzC,OAAQG,IAAS,GAAGpQ,UACtB,EAIO,SAASyhE,GACdz+D,EACAoN,EACAH,GAEA,OAAOuxD,GAAKx+D,EAAUhD,YAAcwhE,GAAKpxD,EAAQpQ,YAAcwhE,GAAKvxD,EACtE,CCxDO,IAAMyxD,GAAc,iBAGrBC,GAAa,8CAGbC,GAAkB,kCAElBC,GAAkE,CACtEz5D,KAAM,QACN05D,OAAQ,SACRC,MAAO,MACPnmD,MAAO,QACPE,IAAK,OAGA,SAASkmD,GACdh/D,EACAoN,EACAH,EACA3Q,GAEA,IAAMqH,EAAU2gB,GAAQ,IAAI3N,WAAW3W,GAAU,CAAC,SAClD,GAAuB,IAAnB2D,EAAQtH,OAAZ,CAKA,IpBpBAH,EAEAuH,EACAuK,EoBiBM1J,EAAWX,EAAQkiB,KAAI,SAAC7lB,GAAI,OAAKmjB,GAAenjB,EAAA,IAEhDqE,GpBtBNnI,EoBsBsCkR,EAAQirC,cAAa,KpBpB3D50C,EoBoB2D2J,EAAQuX,apBpBnElhB,EAAmB,YACnBuK,IAAAA,GAAA,GAEO81C,GAAoB5nD,EoBiB6B,EpBjBR,EAAIuH,EAAUuK,IoBmB9D,IACE1J,EAASoF,SAAQ,SAAC1J,GAAI,OAAKiN,EAM/B,SAAmBjN,EAAcoN,GAC/B,IAEM9Q,GAFS,IAAIqlB,WACGC,gBAAgB5hB,EAAM,YAC1B6hB,qBAAqB,MAAM,GAC7C,IAAKvlB,EACH,MAAM,IAAIkR,MAAM,gBAElB,IAAM7J,EAAkB,CACtBu3B,UAAW,GACX+jC,aAAc,EACdC,oBAAqB,EACrBC,SAAU,GAENjjE,EAAmBY,OAAOP,KAAKoH,GAAiBupB,QACpD,SAACltB,EAAQoN,GAEP,OADApN,EAAOoN,GAAO9Q,EAAG0lB,aAAoB,OAAA5U,IAAUzJ,EAAgByJ,GACxDpN,CACR,GACD,CACF,GAEMkN,EAAwC,aAAjC5Q,EAAG0lB,aAAa,aAEvBve,EAAgB27D,GACpBC,GAAqB/iE,EAAI,UAAW,UAEhC0R,EAAiBoxD,GACrBC,GAAqB/iE,EAAI,SAAU,WAE/BgI,EAAc+6D,GAAqB/iE,EAAI,OAAQ,WAErD,MAAO,GAAGupB,IACP3oB,KAAKoH,GAAa,SAACtE,GAClB,IAAMiN,EAAUqyD,GAAet/D,EAAYkN,GAE3C,IAAKD,IAAYjN,EAAWu/D,aAAa,SACvC,OAAO,KAET,IAAMjjE,EAAYkjE,GAChBx/D,EAAWgiB,aAAa,SACxB9lB,GAEIyH,EAAW67D,GAAcx/D,EAAWgiB,aAAa,OAAQ9lB,GAC3DoI,EAAUk7D,GAAcx/D,EAAWgiB,aAAa,OAAQ9lB,GAC5D,GAAkB,OAAdI,EACF,MAAMmjE,GAAsBz/D,GAE9B,GAAgB,OAAZsE,EAAkB,CACpB,GAAiB,OAAbX,EACF,MAAM87D,GAAsBz/D,GAE9BsE,EAAUhI,EAAYqH,CACxB,CACA,IAAMU,EAAM,IAAI83D,GAAO7/D,EAAY8Q,EAAU9I,EAAU8I,EAAUH,GACjE5I,EAAI4T,GAAKwmD,GAAcp6D,EAAI8xB,UAAW9xB,EAAI+xB,QAAS/xB,EAAI0f,MAEvD,IAIM5f,EAuDZ,SACEnE,EACAoN,EACAH,GAEA,IAAM3Q,EAAQ,oCACVqH,EAAc,KAgBZuJ,EAAA,MAAkBlN,GAAAA,EAAQu/D,aAAa,SACzCv/D,EAAOgiB,aAAa,SACpB,KAMJ,OAJI9U,GAAmBD,EAAchQ,eAAeiQ,KAClDvJ,EAAcsJ,EAAcC,IApBN,CACtB,eACA,YACA,QACA,kBACA,WACA,cAiBqBggB,QAAO,SAACjgB,EAAQ/Q,GACrC,IAAMgR,EACJwyD,GAAetyD,EAAO9Q,EAAOJ,IAC7BwjE,GAAe1/D,EAAQ1D,EAAOJ,IAC9BwjE,GAAe/7D,EAAarH,EAAOJ,GAIrC,OAHIgR,IACFD,EAAO/Q,GAAQgR,GAEVD,CACR,GAAE,CAAE,EACP,CAxCA,CA3DqBe,EAAehO,EAAWgiB,aAAa,WACxCve,EAAczD,EAAWgiB,aAAa,UAGRve,GACpCJ,EAAcc,EAAdw7D,UACR,GAAIt8D,EAAW,CAEb,IAAMe,EAAYy6D,GAAqBx7D,GACnCe,IACFC,EAAIs5D,UAAYv5D,GAElBC,EAAIi5D,MAAQj6D,CACd,CAGA,OAFAwK,EAAcxJ,EAAKF,GAEZE,CACT,IACCgT,QAAO,SAACrX,GAAG,OAAa,OAARA,CAAA,GACrB,CA3EA,CANkDA,EAAMqE,GAAA,GACrD,CAAC,MAAOrE,GACP1D,EAAc0D,EAChB,CAVA,MAFE1D,EAAc,IAAIkR,MAAM,8BAa5B,CA+EA,SAAS6xD,GACPr/D,EACAoN,EACAH,GAEA,IAAM3Q,EAAS0D,EAAY6hB,qBAAqBzU,GAAY,GAC5D,OAAI9Q,EACK,GAAGoa,MAAMxZ,KAAKZ,EAAO+4D,iBAAiBpoD,IAExC,EACT,CAEA,SAASmyD,GAAuBp/D,GAG9B,OAAOA,EAAektB,QAAO,SAACltB,EAAMoN,GAClC,IAAMH,EAAKG,EAAQ4U,aAAa,UAIhC,OAHI/U,IACFjN,EAAKiN,GAAMG,GAENpN,CACR,GAAE,CAAE,EACP,CAEA,SAASs/D,GAAet/D,EAASoN,GAC/B,MAAO,GAAGsJ,MAAMxZ,KAAK8C,EAAQ8hB,YAAYoL,QAAO,SAACltB,EAAKiN,EAAM3Q,GAAM,IAAAqH,EAChE,MAAsB,OAAlBsJ,EAAK2yD,UAAqBtjE,EACrB0D,EAAM,KAEX,OAAJ2D,EAAIsJ,EAAK6U,aAALne,EAAiBtH,OACZijE,GAAeryD,EAAMG,GACnBA,EACFpN,EAAMiN,EAAK4yD,YAAYxyD,OAAO7K,QAAQ,OAAQ,KAEhDxC,EAAMiN,EAAK4yD,WACnB,GAAE,GACL,CA4CA,SAASH,GAAe1/D,EAASoN,EAAIH,GACnC,OAAKjN,GAGEA,EAAQ8/D,eAAe1yD,EAAIH,GAC9BjN,EAAQ+/D,eAAe3yD,EAAIH,GAHtB,IAKX,CAEA,SAASwyD,GAAsBz/D,GAC7B,OAAO,IAAIwN,MAAwC,kCAAAxN,EACrD,CAEA,SAASw/D,GAAcx/D,EAAoBoN,GACzC,IAAKpN,EACH,OAAO,KAET,IAAIiN,EAAyB4vD,GAAe78D,GAQ5C,OAPgB,OAAZiN,IACE0xD,GAAW98D,KAAK7B,GAClBiN,EAQN,SAAwCjN,EAAoBoN,GAC1D,IAAMH,EAAI0xD,GAAW5wD,KAAK/N,GACpB1D,GAAiB,EAAP2Q,EAAE,KAAkB,EAAPA,EAAE,IAAUG,EAAS6xD,aAClD,OACe,MAAL,EAAPhyD,EAAE,IACU,IAAL,EAAPA,EAAE,KACK,EAAPA,EAAE,IACH3Q,EAAS8Q,EAAS8tB,SAEtB,CATA,CAR+Cl7B,EAAoBoN,GACpDwxD,GAAgB/8D,KAAK7B,KAC9BiN,EAiBN,SAAwBjN,EAAoBoN,GAC1C,IAAMH,EAAI2xD,GAAgB7wD,KAAK/N,GACzB1D,EAAQkS,OAAOvB,EAAE,IAEvB,OADaA,EAAE,IAEb,IAAK,IACH,OAAe,KAAR3Q,EACT,IAAK,IACH,OAAe,GAARA,EACT,IAAK,KACH,OAAe,IAARA,EACT,IAAK,IACH,OAAOA,EAAQ8Q,EAAS8tB,UAC1B,IAAK,IACH,OAAO5+B,EAAQ8Q,EAAS+xD,SAE5B,OAAO7iE,CACT,CAjBA,CAjB+B0D,EAAoBoN,KAG1CH,CACT,CClLA,IAAa+yD,GAAkB,WA0B7B,SAAAhgE,EAAYA,GAAU,KAzBd8xB,SAAA,EAAG,KACH0F,MAAiC,KAAI,KACrCzxB,YAAA,EAAM,KACNk6D,SAAA,EAAuB,KACvBC,UAAA,EAAI,KACJ/nC,WAA+B,GAAE,KACjC0K,OAA+B,GAAE,KACjCsO,QAA+B,GAAE,KACjCgvB,iBAA8D,GAAE,KAChEC,eAA4C,CAAC,EAAC,KAC9CC,wBAAkE,CAAC,EAAC,KACpEC,mBAAA,EAAa,KACbC,mBAAA,EAAa,KACbC,QAAkB,EAAG,KACrBC,QAAkB,EAAG,KACrBnhD,eAAyB,EAAG,KAC5BohD,QAAkB,EAAG,KACrBC,OAwsBD,CACLC,SAAU,EACVC,mBAAoB,EACpB,EAAG,CACDjoD,MAAO,EACP8nD,QAAS,EACTI,KAAA,IA9sBgC,KAC5BC,wBAAA,EAQNzqD,KAAKwb,IAAM9xB,EACXsW,KAAKvQ,OAAS/F,EAAI+F,OAClBuQ,KAAK4pD,KAAOlgE,EAAI+F,OAAOi7D,WAEvB1qD,KAAKyqD,mBAAqB,CACxBE,WAAY,CACVvqC,MAAOpgB,KAAKvQ,OAAOm7D,wBACnBC,aAAc7qD,KAAKvQ,OAAOq7D,gCAE5BC,WAAY,CACV3qC,MAAOpgB,KAAKvQ,OAAOu7D,wBACnBH,aAAc7qD,KAAKvQ,OAAOw7D,gCAE5BC,WAAY,CACV9qC,MAAOpgB,KAAKvQ,OAAO07D,wBACnBN,aAAc7qD,KAAKvQ,OAAO27D,gCAE5BC,WAAY,CACVjrC,MAAOpgB,KAAKvQ,OAAO67D,wBACnBT,aAAc7qD,KAAKvQ,OAAO87D,iCAI9B7hE,EAAIoyB,GAAGpjB,EAAOC,gBAAiBqH,KAAK+7C,iBAAkB/7C,MACtDtW,EAAIoyB,GAAGpjB,EAAOG,gBAAiBmH,KAAKuhB,iBAAkBvhB,MACtDtW,EAAIoyB,GAAGpjB,EAAOa,iBAAkByG,KAAK+b,kBAAmB/b,MACxDtW,EAAIoyB,GAAGpjB,EAAOc,gBAAiBwG,KAAKi7B,iBAAkBj7B,MACtDtW,EAAIoyB,GAAGpjB,EAAO4B,wBAAyB0F,KAAKg4C,wBAAyBh4C,MACrEtW,EAAIoyB,GAAGpjB,EAAOqC,aAAciF,KAAKwuB,cAAexuB,MAChDtW,EAAIoyB,GAAGpjB,EAAOuC,YAAa+E,KAAKyuB,aAAczuB,MAC9CtW,EAAIoyB,GAAGpjB,EAAO0C,sBAAuB4E,KAAKwrD,sBAAuBxrD,MACjEtW,EAAIoyB,GAAGpjB,EAAOwC,eAAgB8E,KAAKyrD,gBAAiBzrD,MACpDtW,EAAIoyB,GAAGpjB,EAAOoC,eAAgBkF,KAAKm2C,eAAgBn2C,MACnDtW,EAAIoyB,GAAGpjB,EAAO6B,wBAAyByF,KAAK0rD,wBAAyB1rD,MACrEtW,EAAIoyB,GAAGpjB,EAAOW,gBAAiB2G,KAAKyhB,iBAAkBzhB,KACxD,CAAC,IAAAlJ,EAAApN,EAAAjD,UAunBA,OAvnBAqQ,EAEM2lB,QAAP,WACE,IAAQ/yB,EAAQsW,KAARwb,IACR9xB,EAAI0yB,IAAI1jB,EAAOC,gBAAiBqH,KAAK+7C,iBAAkB/7C,MACvDtW,EAAI0yB,IAAI1jB,EAAOG,gBAAiBmH,KAAKuhB,iBAAkBvhB,MACvDtW,EAAI0yB,IAAI1jB,EAAOa,iBAAkByG,KAAK+b,kBAAmB/b,MACzDtW,EAAI0yB,IAAI1jB,EAAOc,gBAAiBwG,KAAKi7B,iBAAkBj7B,MACvDtW,EAAI0yB,IAAI1jB,EAAO4B,wBAAyB0F,KAAKg4C,wBAAyBh4C,MACtEtW,EAAI0yB,IAAI1jB,EAAOqC,aAAciF,KAAKwuB,cAAexuB,MACjDtW,EAAI0yB,IAAI1jB,EAAOuC,YAAa+E,KAAKyuB,aAAczuB,MAC/CtW,EAAI0yB,IAAI1jB,EAAO0C,sBAAuB4E,KAAKwrD,sBAAuBxrD,MAClEtW,EAAI0yB,IAAI1jB,EAAOwC,eAAgB8E,KAAKyrD,gBAAiBzrD,MACrDtW,EAAI0yB,IAAI1jB,EAAOoC,eAAgBkF,KAAKm2C,eAAgBn2C,MACpDtW,EAAI0yB,IAAI1jB,EAAO6B,wBAAyByF,KAAK0rD,wBAAyB1rD,MACtEtW,EAAI0yB,IAAI1jB,EAAOW,gBAAiB2G,KAAKyhB,iBAAkBzhB,MAEvDA,KAAKwb,IAAMxb,KAAKvQ,OAAS,KACzBuQ,KAAKgqD,cAAgBhqD,KAAKiqD,mBAAA,CAAgB,EAC3CnzD,EAEO60D,kBAAR,WACE,GACE3rD,KAAKvQ,OAAOm8D,wBACV5rD,KAAKgqD,gBAAkBhqD,KAAKiqD,eAC9B,CACA,IAAMvgE,EAAW,IAAI47D,GAAatlD,KAAM,cAClClJ,EAAW,IAAIwuD,GAAatlD,KAAM,cAClCrJ,EAAW,IAAI2uD,GAAatlD,KAAM,cAClCha,EAAW,IAAIs/D,GAAatlD,KAAM,cACxCA,KAAKgqD,cAAgB,IAAIrF,GAAa,EAAGj7D,EAAUoN,GACnDkJ,KAAKiqD,cAAgB,IAAItF,GAAa,EAAGhuD,EAAU3Q,EACrD,GACD8Q,EAEM6uD,QAAP,SACEj8D,EACAoN,EACAH,EACA3Q,EACAqH,GAIA,IADA,IA4mBkBzH,EAAYgR,EAAYW,EAAYpK,EA5mBlDuK,GAAA,EACK1J,EAAIX,EAAUtH,OAAQiI,KAAO,CACpC,IAAMD,EAAWV,EAAUW,GACrBH,GAymBUjI,EAxmBdmI,EAAS,GAwmBiB6I,EAvmB1B7I,EAAS,GAumB6BwJ,EAtmBtCT,EAsmBkD3J,EArmBlDwJ,EAsmBC2B,KAAK+M,IAAIzO,EAAIzJ,GAAMmL,KAAKgN,IAAI1f,EAAI2R,IApmBnC,GAAI1J,GAAW,IACbE,EAAS,GAAKuK,KAAK+M,IAAItX,EAAS,GAAI+I,GACpC/I,EAAS,GAAKuK,KAAKgN,IAAIvX,EAAS,GAAI4I,GACpCe,GAAA,EACI7J,GAAW8I,EAAUG,GAAa,IACpC,MAGN,CAKA,GAJKY,GACHrK,EAAUod,KAAK,CAAC3T,EAAWH,IAGzBqJ,KAAKvQ,OAAOypD,yBAA0B,CACxC,IAAMnsD,EAAQiT,KAAK8pD,eAAepgE,GAClCsW,KAAK4pD,KAAKpF,OAAOz3D,EAAO+J,EAAWH,EAAS3Q,EAC9C,KAAO,CACL,IAAM8H,EAAOkS,KAAK4pD,KAAKpF,OAAO,KAAM1tD,EAAWH,EAAS3Q,GACxDga,KAAKwb,IAAI6C,QAAQ3lB,EAAOkC,YAAa,CACnCjT,KAAM,WACN83B,KAAA3xB,EACAuxB,MAAO31B,GAEX,CACF,EAEAoN,EACQq/C,eAAR,SACEzsD,EAA4BoN,GAE5B,IAAAH,EAAA,KADE3Q,EAAI8Q,EAAJ8wB,KAAMv6B,EAAEyJ,EAAF6K,GAAI/b,EAAOkR,EAAP+jC,QAASjkC,EAASE,EAATuX,UAEb9W,EAAqByI,KAArB6pD,iBACG,SAAPx8D,IACF2S,KAAK66B,QAAQ70C,EAAKke,IAAM,CAAE69B,SAAUn8C,EAASyoB,UAAAzX,IAK3CW,EAAiBxR,SACnBia,KAAK6pD,iBAAmB,GACxBtyD,EAAiBnE,SAAQ,SAAC1J,GACxBiN,EAAK83B,aAAa/1B,EAAOuC,YAAavR,EACxC,MAEHoN,EAEO+0D,iBAAR,SAAyBniE,EAAeoN,GACtC,IAAQH,EAAUqJ,KAAVkhB,MACR,GAAIvqB,EACF,IAAK,IAAI3Q,EAAI,EAAGA,EAAI2Q,EAAMkrB,WAAW97B,OAAQC,IAAK,CAChD,IAAMqH,EAAYsJ,EAAMkrB,WAAW77B,GACnC,GACE8lE,GAAqBz+D,EAAW,CAC9BxF,KAAM6B,EACNwvB,KAAMpiB,EACNghB,MAAO,CAAC,IAGV,OAAOzqB,CAEX,CAEF,OAAO,MACRyJ,EAEM8uD,oBAAP,SAA2Bl8D,GACrBsW,KAAKvQ,OAAOypD,yBACdl5C,KAAK+rD,kBAAkBriE,GAEvBsW,KAAKgsD,qBAAqBtiE,EAAA,EAE7BoN,EAEOi1D,kBAAR,SAA0BriE,GACxB,IAAIsW,KAAK8pD,eAAepgE,GAAxB,CAGA,IAAQoN,EAA8CkJ,KAA9CyqD,mBAAoB9zD,EAA0BqJ,KAA1B8pD,eAAgB9jE,EAAUga,KAAVkhB,MAC5C7zB,EAAgCyJ,EAAmBpN,GAA3C9D,EAAKyH,EAAL+yB,MAAOxpB,EAAYvJ,EAAZw9D,aAETtzD,EAAgByI,KAAK6rD,iBAAiBjmE,EAAOgR,GACnD,GAAKW,EAQHZ,EAAejN,GAAa6N,EAC5BwoB,GAAiBppB,EAAejN,IAChCu1B,GAAkBtoB,EAAejN,GAAY1D,OAV3B,CAClB,IAAMmH,EAAY6S,KAAKisD,gBAAgB,WAAYrmE,EAAOgR,GACtDzJ,IAEFA,EAAUzD,IAAA,EACViN,EAAejN,GAAayD,EAEhC,CAZA,GAiBD2J,EAEOk1D,qBAAR,SAA6BtiE,GAC3B,IAAIsW,KAAK+pD,wBAAwBrgE,GAAjC,CAIA,IAAMoN,EAAmCkJ,KAAKyqD,mBAAmB/gE,GACjE,GAAKoN,EAAL,CAGA,IACMH,EAAQ,CACZu1D,IAAKxiE,EACL02B,MAHYtpB,EAAgBspB,MAI5BD,KAAM,WACNvR,UAAS9X,EAAgBoqB,SAAUpqB,EAAgBoqB,MAAMtS,QACzDu9C,eAAgBr1D,EAAgBoqB,OAElClhB,KAAK+pD,wBAAwBrgE,GAAaiN,EAC1CqJ,KAAKwb,IAAI6C,QAAQ3lB,EAAOmC,6BAA8B,CAAE0xB,OAAQ,CAAC51B,IAVjE,CALA,GAgBDG,EAEOm1D,gBAAR,SACEviE,EACAoN,EACAH,GAEA,IAAM3Q,EAAQga,KAAKkhB,MACnB,GAAKl7B,EAGL,OAAOA,EAAM87B,aAAap4B,EAAMoN,EAAOH,EAAA,EACxCG,EAEOilD,iBAAR,SACEryD,EACAoN,GAEAkJ,KAAKkhB,MAAQpqB,EAAKoqB,MAClBlhB,KAAKosD,cAAA,EACNt1D,EAEOyqB,iBAAR,WACE,IAAQ73B,EAAmBsW,KAAnB8pD,eACRtjE,OAAOP,KAAKyD,GAAgB0J,SAAQ,SAAC0D,GACnCipB,GAAiBr2B,EAAeoN,WACzBpN,EAAeoN,EACxB,IACAkJ,KAAK+pD,wBAA0B,CAAC,CAAD,EAChCjzD,EAEOilB,kBAAR,WAEE/b,KAAKkqD,QAAU,EACflqD,KAAKmqD,QAAU,EACfnqD,KAAKgJ,eAAiB,EAEtBhJ,KAAKoqD,QAAU,EACfpqD,KAAKqqD,OAgdA,CACLC,SAAU,EACVC,mBAAoB,EACpB,EAAG,CACDjoD,MAAO,EACP8nD,QAAS,EACTI,KAAA,IApdFxqD,KAAKosD,eACLpsD,KAAKusB,OAAS,GACdvsB,KAAK8pD,eAAiB,CAAC,EACvB9pD,KAAK+pD,wBAA0B,CAAC,EAChC/pD,KAAK6hB,WAAa,GAClB7hB,KAAK6pD,iBAAmB,GACxB7pD,KAAK66B,QAAU,GACX76B,KAAKgqD,eAAiBhqD,KAAKiqD,gBAC7BjqD,KAAKgqD,cAActxB,QACnB14B,KAAKiqD,cAAcvxB,QAAA,EAEtB5hC,EAEOs1D,aAAR,WAEE,IAAQ1iE,EAAUsW,KAAVkhB,MACR,GAAKx3B,EAAL,CAGA,IAAMoN,EAAapN,EAAMm4B,WACzB,GAAI/qB,EACF,IAAK,IAAIH,EAAI,EAAGA,EAAIG,EAAW/Q,OAAQ4Q,IACrCopB,GAAiBjpB,EAAWH,GAJhC,GAODG,EAEOkhD,wBAAR,SACEtuD,EACAoN,GACA,IAAAH,EAAA,KACM3Q,EAA+B8Q,EAAKqmB,gBAAkB,GACtD9vB,EAAWrH,EAAOswB,MAAK,SAAC5sB,GAAK,OAAKA,EAAMgvB,YAAc0vC,EAAA,IAC5D,GAAIpoD,KAAKvQ,OAAO48D,cAAiBh/D,GAAY2S,KAAKvQ,OAAO68D,YAAc,CAErE,GADwBtV,GAAyBh3C,KAAKusB,OAAQvmC,GAG5D,YADAga,KAAKusB,OAASvmC,GAMhB,GAHAga,KAAK6hB,WAAa,GAClB7hB,KAAKusB,OAASvmC,EAEVga,KAAKvQ,OAAOypD,yBAA0B,CACxC,IAAMtzD,EAAQoa,KAAKkhB,MACbtqB,EAA2ChR,EAC7Cs6B,GAAqBt6B,EAAMi8B,YAC3B,KAuCJ,GArCA7hB,KAAKusB,OAAOn5B,SAAQ,SAAC1J,EAAOoN,GAE1B,IAAI9Q,EACJ,GAAI4Q,EAAa,CAEf,IADA,IAAIvJ,EAA+B,KAC1BzH,EAAI,EAAGA,EAAIgR,EAAY7Q,OAAQH,IACtC,GACEgR,EAAYhR,IACZkmE,GAAqBl1D,EAAYhR,GAAI8D,GACrC,CACA2D,EAAauJ,EAAYhR,GACzBgR,EAAYhR,GAAK,KACjB,KACF,CAEEyH,IACFrH,EAAYqH,EAEhB,CACA,GAAIrH,EACF+5B,GAAiB/5B,OACZ,CACL,IAAMuR,EAAgBg1D,GAAuC7iE,IAC7D1D,EAAY2Q,EAAKs1D,gBACf10D,EACA7N,EAAM7B,KACN6B,EAAMwvB,SAGNlzB,EAAUw5B,KAAO,WAErB,CACIx5B,GACF2Q,EAAKkrB,WAAWpX,KAAKzkB,EAEzB,IAEe,MAAX4Q,GAAAA,EAAa7Q,OAAQ,CACvB,IAAMwR,EAAmBX,EACtBmK,QAAO,SAACrX,GAAC,OAAW,OAANA,CAAU,IACxB6lB,KAAI,SAAC7lB,GAAC,OAAMA,EAAgB02B,KAAA,IAC3B7oB,EAAiBxR,QACnB6Z,EAAOzJ,KAAI,kDACyCoB,EAAiBU,KACjE,MACD,iFAGP,CACF,MAAO,GAAI+H,KAAKusB,OAAOxmC,OAAQ,CAE7B,IAAMoH,EAAa6S,KAAKusB,OAAOhd,KAAI,SAAC7lB,GAClC,MAAO,CACL02B,MAAO12B,EAAM7B,KACbs4B,KAAMz2B,EAAM/B,KAAK2L,cACjBsb,QAASllB,EAAMklB,QACfwqC,cAAe1vD,EAEnB,IACAsW,KAAKwb,IAAI6C,QAAQ3lB,EAAOmC,6BAA8B,CACpD0xB,OAAQp/B,GAEZ,CACF,GACD2J,EAEOmkC,iBAAR,SACEvxC,EACAoN,GACA,IAAAH,EAAA,KACIqJ,KAAKvQ,OAAOm8D,sBAAwB90D,EAAKynB,UAC3CznB,EAAKynB,SAASnrB,SAAQ,SAAC1J,GACrB,IAAMoN,EAAkB,wBAAwBW,KAC9C/N,EAAc6vB,YAEhB,GAAKziB,EAAL,CAGA,IAAM9Q,EAAS,YAAe8Q,EAAgB,GACxCzJ,EACJsJ,EAAK8zD,mBAAmBzkE,GACrBqH,IAGLA,EAAgB+yB,MAAQ12B,EAAc7B,KAClC6B,EAAcwvB,OAEhB7rB,EAAgBw9D,aAAenhE,EAAcwvB,MAE/C7rB,EAAgB6zB,MAAQx3B,EAZxB,CAaF,KAEHoN,EAEO01D,uBAAR,SAA+B9iE,GAC7B,IAAMoN,EAAQkJ,KAAKwb,IAAI7D,OAAOjuB,EAAKua,OACnC,OAAO,MAAAnN,OAAA,EAAAA,EAAOghB,MAAM,oBACrBhhB,EAEO03B,cAAR,SAAsB9kC,EAA4BoN,GAEhD,GAAIkJ,KAAK2pD,SAAW7yD,EAAK8wB,KAAKjgC,OAASuzB,GAAwB,KAAAvkB,EAAA3Q,EACrDqH,EAAyC2S,KAAzCgqD,cAAepkE,EAA0Boa,KAA1BiqD,cAAerzD,EAAWoJ,KAAXmqD,OACtC5yD,EAAmBT,EAAK8wB,KAAhBz6B,EAAEoK,EAAF2M,GAAIxM,EAAEH,EAAFsM,GACN7V,EAAA,OAAS2I,EAAY,OAAZ3Q,EAAG8Q,EAAKkmB,WAAA,EAALh3B,EAAW+f,OAAKpP,GAAK,EACnCtJ,GAAiBzH,IAEjB8R,IAAOd,EAAS,GACfc,IAAOd,GAAU5I,IAAcgS,KAAKgJ,cAAgB,GACrD7b,IAAO6S,KAAKkqD,UAEZ78D,EAAcqrC,QACd9yC,EAAc8yC,SAGlB14B,KAAKkqD,OAAS/8D,EACd6S,KAAKmqD,OAASzyD,EACdsI,KAAKgJ,cAAgBhb,CACvB,GACD8I,EAEO23B,aAAR,SACE/kC,EACAoN,GAEA,IAAQH,EAAkBG,EAAlB8wB,KAAM5hC,EAAY8Q,EAAZi/B,QACd,GAAIp/B,EAAKhP,OAASyzB,GAEhB,GAAIp1B,EAAQilB,WAAY,CACtB,IAAM5d,EAAcsJ,EAAKm/B,YAEnBlwC,EAAY,UAAWkR,EAE7B,GAAmB,MAAfzJ,IAAwBA,EAAYsY,WAAa/f,EAAW,CAC9D,IAAMgR,EAAqBoJ,KAAKusB,OAAO51B,EAAKsN,OACtC1M,EAASyI,KAAKqqD,OACf9yD,EAAOZ,EAAKuN,MACf3M,EAAOZ,EAAKuN,IAAM,CAChB5B,MAAO3L,EAAK2L,MACZ8nD,OAAQpqD,KAAKoqD,OACbI,KAAA,GAEFxqD,KAAKoqD,OAASzzD,EAAKuN,IAGnBtN,GACAA,EAAmB8hB,YAAc0vC,GAEjCpoD,KAAKysD,YAAY91D,EAAM3Q,GAEvBga,KAAK0sD,WAAW51D,EAEpB,CACF,MAEEkJ,KAAKwb,IAAI6C,QAAQ3lB,EAAOiC,wBAAyB,CAC/Cy9C,SAAA,EACAxwB,KAAAjxB,EACAzB,MAAO,IAAIgC,MAAM,6BAIxBJ,EAEO21D,YAAR,SAAoB/iE,EAAgBoN,GAAsB,IAAAH,EAAA,KAClD3Q,EAAMga,KAAKwb,IACjBktC,GACE5xD,EACAkJ,KAAK66B,QAAQnxC,EAAKwa,KAClB,SAACpN,GACCH,EAAKg2D,YAAY71D,EAAMpN,EAAKua,OAC5Bje,EAAIq4B,QAAQ3lB,EAAOiC,wBAAyB,CAC1Cy9C,SAAA,EACAxwB,KAAMl+B,GAET,IACD,SAACoN,GACC8I,EAAOL,IAA8B,0BAAAzI,GACrC9Q,EAAIq4B,QAAQ3lB,EAAOiC,wBAAyB,CAC1Cy9C,SAAA,EACAxwB,KAAMl+B,EACNwL,MAAA4B,GAEJ,KAEHA,EAEO41D,WAAR,SAAmBhjE,GAA0C,IAAAoN,EAAAH,EAAA,KACnD3Q,EAAkB0D,EAAlBk+B,KAAMv6B,EAAY3D,EAAZqsC,QAENnwC,EAA8Boa,KAA9B66B,QAASjkC,EAAqBoJ,KAArB6pD,iBACXtyD,EAAU3R,EAAQG,OAAS,EACjC,GAAKH,EAAQI,EAAKke,MAAoB,IAAb3M,EAAzB,CAKA,IAAMpK,EAAM6S,KAAKwb,KF3dd,SACL9xB,EACAoN,EACAH,EACA3Q,EACAqH,EACAzH,EACAgR,GAEA,InBnEAW,EACApK,EmBgFIuK,EAdE1J,EAAS,IAAIw5D,GAGbz5D,EAAW8e,GAAe,IAAIxM,WAAW3W,IAC5CqN,OACA7K,QAAQ87D,GAAY,MACpBjwD,MAAM,MACHlK,EAAiB,GACjBd,EAAY+J,GnB3ElBS,EmB4E+BT,EAAQirC,cAAA,KnB3EvC50C,EmB2EiD2J,EAAQuX,anB3EzDlhB,EAAmB,GAEZqgD,GAAoBj2C,EArCC,IAqCgC,EAAIpK,ImB0E5D,EACAW,EAAU,YACVihB,EAAqB,EACrB3hB,EAAoB,EAEpBI,GAAA,EAEJQ,EAAO45D,MAAQ,SAAUl+D,GAEvB,IAAM9D,EAAS+Q,EAAO3Q,GAClB4Q,EAAYD,EAAO2zD,SAGjB/yD,GAAyBwX,EAAqBhiB,GAAa,IAWjE,GARU,MAANnH,GAAAA,EAAQ4kE,WAAA,IACNp9D,EAEFwJ,EAAYD,EAAO2zD,SAAW1kE,EAAO0c,MA9DrB,SAAU5Y,EAAgBoN,EAAIH,GACpD,IAAI3Q,EAAS0D,EAAOoN,GAChBzJ,EAAS3D,EAAO1D,EAAOokE,QAI3B,IAAK/8D,IAAYA,EAAOm9D,KAAOxkE,EAAOwkE,IAGpC,OAFA9gE,EAAO4gE,SAAW5gE,EAAO6gE,mBAAqBvkE,EAAOsc,WACrDtc,EAAOwkE,KAAA,GAMT,YAAA5kE,EAAOyH,IAAAzH,EAAQ4kE,KAAK,KAAA5kE,EAClB8D,EAAO4gE,UAAYtkE,EAAOsc,MAAQjV,EAAOiV,MACzCtc,EAAOwkE,KAAA,EAEPn9D,EAAS3D,GADT1D,EAASqH,GACc+8D,OACzB,CAEA1gE,EAAO6gE,mBAAqB5zD,CAC9B,CAtBwB,CAgEAA,EAAQ3Q,EAAIuR,IAG5BA,EAAuB,CACzB,IAAKT,EAEH,YADAY,EAAe,IAAIR,MAAM,mCAI3BN,EAAYW,EAAwBZ,EAAO4zD,kBAC7C,CAEA,IAAMp9D,EAAWzD,EAAIo2B,QAAUp2B,EAAIm2B,UAC7B7xB,EACJwgD,GACoD,KAAjD9kD,EAAIm2B,UAAYjpB,EAAYxJ,GAChB,IAAbC,GACE,IACN3D,EAAIm2B,UAAYvnB,KAAKgN,IAAItX,EAAW,GACpCtE,EAAIo2B,QAAUxnB,KAAKgN,IAAItX,EAAYb,EAAU,GAG7C,IAAMY,EAAOrE,EAAI+jB,KAAK1W,OAGtBrN,EAAI+jB,KAAO64C,mBAAmBz1D,mBAAmB9C,IAG5CrE,EAAIiY,KACPjY,EAAIiY,GAAKwmD,GAAcz+D,EAAIm2B,UAAWn2B,EAAIo2B,QAAS/xB,IAGjDrE,EAAIo2B,QAAU,GAChBjyB,EAAK4c,KAAK/gB,EAAA,EAIdsE,EAAO65D,eAAiB,SAAUn+D,GAChCgO,EAAehO,CAAA,EAGjBsE,EAAO85D,QAAU,WACXpwD,EACFd,EAAcc,GAGhB9R,EAASiI,EAAA,EAIXE,EAASqF,SAAQ,SAAC1J,GAChB,GAAI8D,EAAU,CAEZ,GAAIy6D,GAAWv+D,EAAM,oBAAqB,CAExC8D,GAAA,EAEA9D,EACG0W,MAAM,IACNrI,MAAM,KACN3E,SAAQ,SAAC1J,GACJu+D,GAAWv+D,EAAW,UACxBoE,EAAUpE,EAAU0W,MAAM,GACjB6nD,GAAWv+D,EAAW,aAC/BqlB,EAAqB7O,SAASxW,EAAU0W,MAAM,IAElD,IACF,IAEEhT,EAnLe,SAAU1D,GACjC,IAAIoN,EAAKoJ,SAASxW,EAAW0W,OAAO,IAC9BzJ,EAAOuJ,SAASxW,EAAW0W,OAAO,GAAI,IACtCpa,EAAOka,SAASxW,EAAW0W,OAAO,GAAI,IACtC/S,EACJ3D,EAAW3D,OAAS,EAChBma,SAASxW,EAAWmO,UAAU,EAAGnO,EAAWyI,QAAQ,OACpD,EAEN,KACGqC,EAAgBsC,IAChBtC,EAAgBmC,IAChBnC,EAAgBxO,IAChBwO,EAAgBnH,IAEjB,MAAM6J,MAA0C,oCAAAxN,GAOlD,OAJAoN,GAAM,IAAOH,GACbG,GAAM,IAAY9Q,GACZ,KAAiBqH,CAGzB,CAvByB,CAmLsBS,GAAW,GACjD,CAAC,MAAOpE,GACPgO,EAAehO,CACjB,CAEA,MACF,CAAoB,KAATA,IACT8D,GAAA,EAEJ,CAEAQ,EAAO2sB,MAAMjxB,EAAO,KACtB,IAEAsE,EAAOyqC,OACT,CEoWIm0B,CAHsB,OAAA91D,EAAA9Q,EAAK6e,cAAL/N,EAAkBhH,KACpCsf,GAAiBppB,EAAK6e,YAAY/U,KAAM,IAAIuQ,WAAWhT,IACvDA,EAGF2S,KAAK66B,QAAQ70C,EAAKke,IAClBlE,KAAKqqD,OACLrkE,EAAKke,GACLle,EAAKsc,OACL,SAAC5Y,GACCiN,EAAKg2D,YAAYjjE,EAAM1D,EAAKie,OAC5B9W,EAAIkxB,QAAQ3lB,EAAOiC,wBAAyB,CAC1Cy9C,SAAA,EACAxwB,KAAM5hC,GAET,IACD,SAAC8Q,GACC,IAAMlR,EACc,mCAAlBkR,EAAMlB,QACJhQ,EACFgR,EAAiB6T,KAAK/gB,GAEtBiN,EAAKk2D,iBAAiB7mE,EAAMqH,GAG9BuS,EAAOL,IAAgC,4BAAAzI,GACnClR,GAAkB2R,EAAUvR,EAAKke,IAGrC/W,EAAIkxB,QAAQ3lB,EAAOiC,wBAAyB,CAC1Cy9C,SAAA,EACAxwB,KAAM5hC,EACNkP,MAAA4B,GAEJ,GAtCF,MAFEF,EAAiB6T,KAAK/gB,EAAA,EA0CzBoN,EAEO+1D,iBAAR,SAAyBnjE,EAAgBoN,GAAsB,IAAAH,EAAA,KAEvD3Q,EAAqBga,KAAKusB,OAAO7iC,EAAKua,OACvCje,EAAmB0yB,WACtBgwC,GACE5xD,EACAkJ,KAAK66B,QAAQnxC,EAAKwa,KAClB,WACEle,EAAmB0yB,UAAY0vC,GAC/BzxD,EAAK81D,YAAY/iE,EAAMoN,EACzB,IACA,WACE9Q,EAAmB0yB,UAAY,MACjC,KAGL5hB,EAEO61D,YAAR,SAAoBjjE,EAAgBoN,GAClC,IAAMH,EAAMqJ,KAAKwb,IACjB,GAAIxb,KAAKvQ,OAAOypD,yBAA0B,CACxC,IAAMlzD,EAAYga,KAAK6hB,WAAW/qB,GAKlC,IAAK9Q,GAAgC,aAAnBA,EAAUw5B,KAC1B,OAEF91B,EAAK0J,SAAQ,SAAC1J,GAAG,OAAK61B,GAAcv5B,EAAW0D,EAAA,GACjD,KAAO,CACL,IAAM2D,EAAe2S,KAAKusB,OAAOz1B,GACjC,IAAKzJ,EACH,OAEF,IAAMzH,EAAQyH,EAAauhB,QAAU,UAAY,YAAc9X,EAC/DH,EAAI0nB,QAAQ3lB,EAAOkC,YAAa,CAAEjT,KAAM,YAAa83B,KAAA/1B,EAAM21B,MAAAz5B,GAC7D,GACDkR,EAEO20D,gBAAR,SACE/hE,EACAoN,GAEiBA,EAAT8wB,KACCjgC,OAASyzB,IAChBpb,KAAKyuB,aAAa/1B,EAAOuC,YAAanE,EAAA,EAEzCA,EAEO40D,wBAAR,WACE1rD,KAAKusB,OAAS,GACdvsB,KAAK8pD,eAAiB,CAAC,CAAD,EACvBhzD,EAEO00D,sBAAR,SACE9hE,EACAoN,GAEAkJ,KAAK2rD,oBACL,IAAQh1D,EAAiCqJ,KAAjCgqD,cAAehkE,EAAkBga,KAAlBiqD,cACvB,GAAKjqD,KAAK2pD,SAAYhzD,GAAkB3Q,EAAxC,CAGA,IAAQqH,EAAkByJ,EAAlB8wB,KAAMhiC,EAAYkR,EAAZwY,QACd,GACEjiB,EAAK1F,OAASuzB,IACwB,SAAtClb,KAAKwsD,uBAAuBn/D,GAM9B,IAAK,IAAIuJ,EAAI,EAAGA,EAAIhR,EAAQG,OAAQ6Q,IAAK,CACvC,IAAMW,EAAU3R,EAAQgR,GAAGiZ,MAC3B,GAAItY,EAAS,CACX,IAAMpK,EAAU6S,KAAK8sD,kBAAkBv1D,GACvCZ,EAAcmuD,QAAQl/D,EAAQgR,GAAGgZ,IAAKziB,EAAQ,IAC9CnH,EAAc8+D,QAAQl/D,EAAQgR,GAAGgZ,IAAKziB,EAAQ,GAChD,CACF,CAjBA,GAkBD2J,EAED2qB,iBAAA,SACE/3B,EAA6BoN,GAE7B,IADEH,EAAWG,EAAXorB,YAAal8B,EAAS8Q,EAATqrB,UAAW90B,EAAkByJ,EAAlBuhD,mBAAoBzyD,EAAIkR,EAAJnP,KAEtCiP,EAAUoJ,KAAVkhB,MACR,GAAKtqB,KAASA,EAAM8rB,YAAc18B,GAAlC,CAKA,IAAKJ,GAAiB,UAATA,EAAkB,CAC7B,IAAQ2R,EAAmByI,KAAnB8pD,eACRtjE,OAAOP,KAAKsR,GAAgBnE,SAAQ,SAAC1J,GAAS,OAC5Cu2B,GAAkB1oB,EAAe7N,GAAYiN,EAAa3Q,EAAU,GAExE,CACA,GAAIga,KAAKvQ,OAAOypD,0BAEM,IAAhBviD,QAAA,IAAqBtJ,EAAkC,CACzD,IAAQF,EAAe6S,KAAf6hB,WACRr7B,OAAOP,KAAKkH,GAAYiG,SAAQ,SAAC1J,GAAS,OACxCu2B,GACE9yB,EAAWzD,GACXiN,EACAtJ,EACD,GAEL,CApBF,GAsBDyJ,EAEOg2D,kBAAR,SAA0BpjE,GAKxB,IAJA,IAAMoN,EAA4B,CAAC,GAAI,IACjCH,EAAuB,GAAfjN,EAAU,GACpB1D,EAAW,EAENqH,EAAI,EAAGA,EAAIsJ,EAAOtJ,IAAK,CAC9B,IAAMzH,EAAU8D,EAAU1D,KACpB4Q,EAAU,IAAOlN,EAAU1D,KAC3BuR,EAAU,IAAO7N,EAAU1D,KACjC,IAAgB,IAAZ4Q,GAA6B,IAAZW,IAGgB,IAApB,EAAO3R,GACX,CACX,IAAMuH,EAAS,EAAOvH,EAEpB,IAA4BuH,GAC5B,IAA4BA,IAG5B2J,EAAc3J,GAAQsd,KAAK7T,GAC3BE,EAAc3J,GAAQsd,KAAKlT,GAE/B,CACF,CACA,OAAOT,CAAA,EACRpN,CAAA,CArrB4B,GAwrB/B,SAAS6iE,GACP7iE,GAEA,OAAIA,EAAM4vB,iBAEN,8BAA8B/tB,KAAK7B,EAAM4vB,kBACzC,8BAA8B/tB,KAAK7B,EAAM4vB,iBAElC,WAIJ,WACT,CAEA,SAASwyC,GACPpiE,EACAoN,GAKA,QACIpN,GACFA,EAAWy2B,OAASosC,GAAuCz1D,IAC3DogD,GAA8BpgD,EAAepN,EAEjD,CC3vByC,IAKnCqjE,GAAkB,WAUtB,SAAArjE,EAAYA,GAAU,KATd8xB,SAAA,EAAG,KACHwxC,sBAAA,EAAgB,KAChBp9B,gBAAA,EAAU,KACV1O,WAAA,EAAK,KACL+rC,sBAAA,EAAgB,KAChB7jC,WAAA,EAAK,KACL8jC,gBAAA,EAAU,KACVC,sBAAA,EAGNntD,KAAKwb,IAAM9xB,EACXsW,KAAKgtD,iBAAmB90D,OAAO2oB,kBAC/B7gB,KAAK4vB,YAAc,EACnB5vB,KAAKkhB,MAAQ,KACblhB,KAAKitD,iBAAmB,GACxBjtD,KAAKopB,WAAA,EACLppB,KAAKktD,WAAa,KAElBltD,KAAK0b,mBACP,CAAC,IAAA5kB,EAAApN,EAAAjD,UA6NA,OA7NAqQ,EAEMs2D,oBAAP,SAA2B1jE,GACzBsW,KAAKmtD,iBAAmBzjE,CAAA,EACzBoN,EAEM2lB,QAAP,WACMzc,KAAKwb,KACPxb,KAAKqtD,qBAEHrtD,KAAKopB,OACPppB,KAAKstD,cAEPttD,KAAKkhB,MAAQ,KACblhB,KAAKktD,WAAa,KAElBltD,KAAKwb,IAAMxb,KAAKmtD,iBAAmB,MACpCr2D,EAES4kB,kBAAV,WACE,IAAQhyB,EAAQsW,KAARwb,IACR9xB,EAAIoyB,GAAGpjB,EAAOgD,uBAAwBsE,KAAKutD,sBAAuBvtD,MAClEtW,EAAIoyB,GAAGpjB,EAAOC,gBAAiBqH,KAAK+7C,iBAAkB/7C,MACtDtW,EAAIoyB,GAAGpjB,EAAOe,gBAAiBuG,KAAKy3C,iBAAkBz3C,MACtDtW,EAAIoyB,GAAGpjB,EAAOsB,eAAgBgG,KAAK6uB,gBAAiB7uB,MACpDtW,EAAIoyB,GAAGpjB,EAAOM,cAAegH,KAAKi8C,eAAgBj8C,MAClDtW,EAAIoyB,GAAGpjB,EAAOG,gBAAiBmH,KAAKuhB,iBAAkBvhB,KAAA,EACvDlJ,EAESu2D,mBAAV,WACE,IAAQ3jE,EAAQsW,KAARwb,IACR9xB,EAAI0yB,IAAI1jB,EAAOgD,uBAAwBsE,KAAKutD,sBAAuBvtD,MACnEtW,EAAI0yB,IAAI1jB,EAAOC,gBAAiBqH,KAAK+7C,iBAAkB/7C,MACvDtW,EAAI0yB,IAAI1jB,EAAOe,gBAAiBuG,KAAKy3C,iBAAkBz3C,MACvDtW,EAAI0yB,IAAI1jB,EAAOsB,eAAgBgG,KAAK6uB,gBAAiB7uB,MACrDtW,EAAI0yB,IAAI1jB,EAAOM,cAAegH,KAAKi8C,eAAgBj8C,MACnDtW,EAAI0yB,IAAI1jB,EAAOG,gBAAiBmH,KAAKuhB,iBAAkBvhB,KAAA,EACxDlJ,EAESy2D,sBAAV,SACE7jE,EACAoN,GAGA,IAAMH,EAAQqJ,KAAKwb,IAAI7D,OAAO7gB,EAAK02D,cAC/BxtD,KAAKytD,eAAe92D,IACtBqJ,KAAKitD,iBAAiBxiD,KAAK,CACzBsN,QAASphB,EAAMohB,QACf/oB,OAAQ2H,EAAM3H,OACdD,MAAO4H,EAAM5H,OAAA,EAGlB+H,EAESilD,iBAAV,SACEryD,EACAoN,GAEAkJ,KAAKkhB,MAAQpqB,EAAKoqB,iBAAiBwsC,iBAAmB52D,EAAKoqB,MAAQ,KACnElhB,KAAKktD,WAAa,KACdltD,KAAKopB,OAASppB,KAAKwb,IAAI7D,OAAO5xB,QAChCia,KAAK2tD,kBAAA,EAER72D,EAES2gD,iBAAV,SACE/tD,EACAoN,GAEA,IAAMH,EAAMqJ,KAAKwb,IACjBxb,KAAKitD,iBAAmB,GACxBjtD,KAAK4vB,WAAa94B,EAAK84B,WACnBj5B,EAAIlH,OAAOm+D,sBAAwB92D,EAAKmP,OAE1CjG,KAAK6tD,cAAA,EAER/2D,EAEO+3B,gBAAR,SACEnlC,EACAoN,GAEIkJ,KAAKopB,OAAS50B,EAAgBwL,KAAKgtD,mBACrChtD,KAAK2tD,kBAET,EAGA72D,EACUmlD,eAAV,SACEvyD,EACAoN,GAEYkJ,KAAKwb,IACT/rB,OAAOm+D,sBAAwB92D,EAAKmP,OAE1CjG,KAAK6tD,cAAA,EAER/2D,EAESyqB,iBAAV,WACEvhB,KAAKstD,aAAA,EACNx2D,EAED62D,iBAAA,WACE,GAAI3tD,KAAKkhB,MAAO,CACd,GAAIlhB,KAAK8tD,aAAe,GAAK9tD,KAAK+tD,YAAc,EAE9C,YADA/tD,KAAKktD,WAAa,MAGpB,IAAMxjE,EAASsW,KAAKwb,IAAI7D,OACxB,GAAIjuB,EAAO3D,OAAQ,CACjB,IAAM+Q,EAAMkJ,KAAKwb,IACX7kB,EAAWqJ,KAAKguD,YAAYtkE,EAAO3D,OAAS,GAC9C4Q,IAAaqJ,KAAKgtD,kBACpBptD,EAAOL,IAAG,+BACuB5I,EAAQ,KAAKjN,EAAOiN,GAAU3H,OAAW,KAAAtF,EAAOiN,GAAUohB,QAAqB,cAAA/X,KAAK+tD,WAAc,IAAA/tD,KAAK8tD,aAG1Ih3D,EAAIk2D,iBAAmBr2D,EAErBG,EAAIk2D,iBAAmBhtD,KAAKgtD,kBAC5BhtD,KAAKmtD,kBAILntD,KAAKmtD,iBAAiBc,kBAExBjuD,KAAKgtD,iBAAmBl2D,EAAIk2D,gBAC9B,CACF,CACF,EAEAl2D,EAGAk3D,YAAA,SAAYl3D,GAA+B,IAAAH,EAAA,KACnC3Q,EAASga,KAAKwb,IAAI7D,OACxB,IAAK3xB,EAAOD,OACV,OAAQ,EAGV,IAAMsH,EAAcrH,EAAO+a,QACzB,SAACrX,EAAO1D,GAAK,OAAK2Q,EAAK82D,eAAe/jE,IAAU1D,GAAS8Q,CAAa,IAIxE,OADAkJ,KAAKktD,WAAa,KACXxjE,EAAmBwkE,uBACxB7gE,EACA2S,KAAK+tD,WACL/tD,KAAK8tD,YAAA,EAERh3D,EAED+2D,aAAA,WACM7tD,KAAKopB,QAITppB,KAAKgtD,iBAAmB90D,OAAO2oB,kBAC/BnhB,KAAK0vB,cAAcpvB,KAAKopB,OACxBppB,KAAKopB,MAAQ1pB,KAAKsvB,YAAYhvB,KAAK2tD,iBAAiB/jE,KAAKoW,MAAO,KAChEA,KAAK2tD,mBAAA,EACN72D,EAEDw2D,YAAA,WACEttD,KAAKitD,iBAAmB,GACxBjtD,KAAK4vB,YAAc,EACnB5vB,KAAKgtD,iBAAmB90D,OAAO2oB,kBAC3B7gB,KAAKopB,QACP1pB,KAAK0vB,cAAcpvB,KAAKopB,OACxBppB,KAAKopB,WAAA,EAAQ,EAEhBtyB,EAEDq3D,cAAA,WACE,GAAInuD,KAAKktD,WACP,OAAOltD,KAAKktD,WAEd,IAAMxjE,EAAQsW,KAAKkhB,MACbpqB,EAAa,CACjB/H,MAAO,EACPC,OAAQ,GAGV,GAAItF,EAAO,CACT,IAAMiN,EAAajN,EAAM0kE,wBACzBt3D,EAAW/H,MAAQ4H,EAAW5H,MAC9B+H,EAAW9H,OAAS2H,EAAW3H,OAC1B8H,EAAW/H,OAAU+H,EAAW9H,SAGnC8H,EAAW/H,MACT4H,EAAW8xD,MAAQ9xD,EAAW7H,MAAQpF,EAAMqF,OAAS,EACvD+H,EAAW9H,OACT2H,EAAW03D,OAAS13D,EAAW9H,KAAOnF,EAAMsF,QAAU,EAE5D,CAEA,OADAgR,KAAKktD,WAAap2D,EACXA,CAAA,EACRA,EAuBO22D,eAAR,SAAuB/jE,GAErB,OADyBsW,KAAKitD,iBACL32C,MAAK,SAACxf,GAC7B,OACEpN,EAAMquB,UAAYjhB,EAAgBihB,SAClCruB,EAAMqF,QAAU+H,EAAgB/H,OAChCrF,EAAMsF,SAAW8H,EAAgB9H,MAErC,KACDtF,EAEMwkE,uBAAP,SACExkE,EACAoN,EACAH,GAEA,GAAW,MAANjN,IAAAA,EAAQ3D,OACX,OAAQ,EAwBV,IAnBA,IACEC,EACAqH,EAcEzH,EAAgB8D,EAAO3D,OAAS,EAE9B6Q,EAAa0B,KAAKgN,IAAIxO,EAAOH,GAC1BY,EAAI,EAAGA,EAAI7N,EAAO3D,OAAQwR,GAAK,EAAG,CACzC,IAAMpK,EAAQzD,EAAO6N,GACrB,IACGpK,EAAM4B,OAAS6H,GAAczJ,EAAM6B,QAAU4H,KArBhD5Q,EAsBsBmH,IArBtBE,EAqB6B3D,EAAO6N,EAAI,KAdtCvR,EAAS+I,QAAU1B,EAAU0B,OAC7B/I,EAASgJ,SAAW3B,EAAU2B,QAc9B,CACApJ,EAAgB2R,EAChB,KACF,CACF,CAEA,OAAO3R,CAAA,EACRgR,EAAAlN,EAAA,EAAA7C,IAAA,aAAAia,IA1ED,WACE,OAAOd,KAAKmuD,gBAAgBp/D,MAAQiR,KAAKsuD,kBAC3C,GAAC,CAAAznE,IAAA,cAAAia,IAED,WACE,OAAOd,KAAKmuD,gBAAgBn/D,OAASgR,KAAKsuD,kBAC5C,GAAC,CAAAznE,IAAA,qBAAAia,IAED,WACE,IAAIpX,EAAa,EACjB,IAAKsW,KAAKwb,IAAI/rB,OAAO8+D,uBACnB,IACE7kE,EAAagW,KAAK8uD,gBACnB,CAAC,MAAO9kE,GACP,CAIJ,OAAOA,CACT,KAACA,CAAA,CAjPqB,GCZlB+kE,GAAa,WAWjB,SAAA/kE,EAAYA,GAAU,KAVd8xB,SAAA,EAAG,KACHkzC,iCAAA,EAAgD,KAChDtlC,WAAA,EAAK,KACLlI,MAAiC,KAAI,KACrCytC,cAAA,EAAQ,KACRC,kBAA4B,EAAC,KAC7BC,kBAA4B,EACpC,KACQ1B,sBAAA,EAGNntD,KAAKwb,IAAM9xB,EAEXsW,KAAK0b,mBACP,CAAC,IAAA5kB,EAAApN,EAAAjD,UAmHA,OAnHAqQ,EAEMs2D,oBAAP,SAA2B1jE,GACzBsW,KAAKmtD,iBAAmBzjE,CAAA,EACzBoN,EAES4kB,kBAAV,WACE1b,KAAKwb,IAAIM,GAAGpjB,EAAOC,gBAAiBqH,KAAK+7C,iBAAkB/7C,KAAA,EAC5DlJ,EAESqlB,oBAAV,WACEnc,KAAKwb,IAAIY,IAAI1jB,EAAOC,gBAAiBqH,KAAK+7C,iBAAkB/7C,KAAA,EAC7DlJ,EAED2lB,QAAA,WACMzc,KAAKopB,OACPgG,cAAcpvB,KAAKopB,OAGrBppB,KAAKmc,sBACLnc,KAAK0uD,iCAAA,EACL1uD,KAAKkhB,MAAQ,MACdpqB,EAESilD,iBAAV,SACEryD,EACAoN,GAEA,IAAMH,EAASqJ,KAAKwb,IAAI/rB,OACxB,GAAIkH,EAAOm4D,kBAAmB,CAC5B,IAAM9oE,EACJ8Q,EAAKoqB,iBAAiBxhB,KAAKguD,iBAAmB52D,EAAKoqB,MAAQ,KAC7DlhB,KAAKkhB,MAAQl7B,EACTA,GAAkD,mBAAlCA,EAAM+oE,0BACxB/uD,KAAK0uD,iCAAA,GAGPhvD,KAAK0vB,cAAcpvB,KAAKopB,OACxBppB,KAAKopB,MAAQ1pB,KAAKsvB,YAChBhvB,KAAKgvD,iBAAiBplE,KAAKoW,MAC3BrJ,EAAOs4D,2BAEX,GACDn4D,EAEDo4D,SAAA,SACExlE,EACAoN,EACAH,GAEA,IAAM3Q,EAAc83B,YAAY1U,MAChC,GAAItS,EAAe,CACjB,GAAIkJ,KAAK2uD,SAAU,CACjB,IAAMthE,EAAgBrH,EAAcga,KAAK2uD,SACnC/oE,EAAiB+Q,EAAgBqJ,KAAK4uD,kBACtCh4D,EAAiBE,EAAgBkJ,KAAK6uD,kBACtCt3D,EAAc,IAAO3R,EAAkByH,EACvCF,EAAM6S,KAAKwb,IAMjB,GALAruB,EAAIkxB,QAAQ3lB,EAAO+C,SAAU,CAC3B0zD,eAAgBvpE,EAChBwpE,eAAgBx4D,EAChBy4D,mBAAoB14D,IAElBY,EAAa,GAGb3R,EACAuH,EAAIsC,OAAO6/D,8BAAgC14D,EAC3C,CACA,IAAIc,EAAevK,EAAIoiE,aACvB3vD,EAAOzJ,KACL,mEACEuB,GAGFA,EAAe,KACY,IAA1BvK,EAAI6/D,kBACH7/D,EAAI6/D,kBAAoBt1D,KAE1BA,GAA8B,EAC9BvK,EAAIkxB,QAAQ3lB,EAAOgD,uBAAwB,CACzCuI,MAAOvM,EACP81D,aAAcrgE,EAAIoiE,eAEpBpiE,EAAI6/D,iBAAmBt1D,EACvBsI,KAAKmtD,iBAAiBc,kBAE1B,CAEJ,CACAjuD,KAAK2uD,SAAW3oE,EAChBga,KAAK4uD,kBAAoBj4D,EACzBqJ,KAAK6uD,kBAAoB/3D,CAC3B,GACDA,EAEDk4D,iBAAA,WACE,IAAMtlE,EAAQsW,KAAKkhB,MACnB,GAAIx3B,EACF,GAAIsW,KAAK0uD,gCAAiC,CACxC,IAAM53D,EAAuBpN,EAAMqlE,0BACnC/uD,KAAKkvD,SACHxlE,EACAoN,EAAqB04D,iBACrB14D,EAAqB24D,mBAEzB,MAEEzvD,KAAKkvD,SACHxlE,EACCA,EAAcgmE,wBACdhmE,EAAcimE,wBAAA,EAItBjmE,CAAA,CAlIgB,GCyCb4K,GAAgB,QA0BhBs7D,GAAa,WA4BjB,SAAAlmE,EAAYoN,GAAU,IAAAH,EAAA,UAzBL6kB,SAAA,EAAG,KACH/rB,YAAA,EAAM,KAKfyxB,MAAiC,KAAI,KACrC2uC,iBAAqD,KAAI,KACzDC,wBAEJ,CAAC,EAAC,KACEC,4BAAsC,EAAC,KACvCC,iBAA6C,GAAE,KAC/CC,yBAEJ,CAAC,EAAC,KACEC,kBAAqCxmE,EAAcymE,kBACvD,CAACzmE,EAAcymE,mBACf,GAAE,KAEE7wD,MAA4BM,EAAON,MAAM1V,KAAKgW,EAAQtL,IAAc,KACpEiL,IAA0BK,EAAOL,IAAI3V,KAAKgW,EAAQtL,IAAc,KAChE6B,KAA2ByJ,EAAOzJ,KAAKvM,KAAKgW,EAAQtL,IAAc,KAClEY,MAA4B0K,EAAO1K,MAAMtL,KAAKgW,EAAQtL,IAAc,KA6apE87D,iBAAmB,SAAC1mE,GAC1B,IAAQoN,EAA2BpN,EAA3B2mE,aAAcrqE,EAAa0D,EAAbqmD,SAChB1iD,EAAiB,IAAA3D,EAAM/B,KAAI,6BAA6BmP,EAAe,IAI7E,GAHAH,EAAK2I,MAAMjS,GAGM,OAAbrH,EAAJ,CAIA,IAAK2Q,EAAKk5D,iBAAkB,CAC1B,IAAIjqE,EAAaY,OAAOP,KACtB0Q,EAAKm5D,yBAEFlqE,EAAWG,SACdH,EAAa0kB,EAAuB3T,EAAKlH,SAE3C,IAAMmH,EAAahR,EAChB2pB,IAAIlF,GACJtJ,QAAO,SAACrX,GAAC,QAAOA,CAAA,IACnBiN,EAAKk5D,iBAAmBl5D,EAAK25D,oBAAoB15D,EACnD,CAEAD,EAAKk5D,iBAAiBnjC,MAAK,SAAC9mC,GAC1B,IAEIgR,EACAW,EAHEpK,EAAYgd,EAAiCvkB,GAKnD,GAAqB,SAAjBkR,EAAyB,CAC3B,GAAI3J,IAAcS,EAAWgc,SAI3B,YAHAjT,EAAKR,KAAI,wBACiBzM,EAAM/B,KAAqC,iCAAAmP,EAAyC,6BAAA3J,GAKhH,IAAMuK,EAAOgW,GAAQ,IAAIrN,WAAWra,IACpC,IACE,IACMgI,EAAOkhB,GADA7F,EAAaqX,KAAK/F,MAAMjjB,GAAM64D,OAE3C,IAAKviE,EACH,MAAM,IAAIkJ,MAAK,wDAIjBN,EAAQ5I,EAAK2d,SAAS,EAAG,IACzBpU,EAAkB3J,EAAWgc,QAC9B,CAAC,MAAOlgB,GAEP,YADAiN,EAAKR,KAAQ9I,EAAU,0BAA0B3D,EAEnD,CACF,KAAO,CACL,GACEyD,IAAcS,EAAWkc,UACzB3c,IAAcS,EAAWic,UAKzB,YAHAlT,EAAKR,KAAI,wBACiBzM,EAAM/B,KAAqC,iCAAAmP,EAAyC,6BAAA3J,GAKhH,IAAMY,E9EswBP,SACLrE,GAEA,IAAMoN,EAA4C,GAClD,GAAIpN,aAAoBmrD,YAGtB,IAFA,IAAMl+C,EAASjN,EAASuhB,WACpBjlB,EAAS,EACNA,EAAS,GAAK2Q,GAAQ,CAC3B,IACMtJ,EAAO6iB,GADA,IAAImB,SAAS3nB,EAAU1D,IAEpC8Q,EAAQ2T,KAAKpd,GACbrH,GAAUqH,EAAKmf,IACjB,CAEF,OAAO1V,CACT,CAfO,C8EtwBoC9Q,GAE7B6H,EAAYE,EAAYgT,QAC5B,SAACrX,GAAI,QACDA,EAAK2mB,UACPjG,EAA6B1gB,EAAK2mB,YAAcljB,CAAS,IAGzDU,EAAU9H,OAAS,GACrB4Q,EAAKR,KACA9I,EAAU,mBAAmBQ,EAAU9H,OAA6C,uCAAAoH,GAI3F,IAAMJ,EAAWc,EAAU,GAE3B,IAAKd,EAeH,YAbyB,IAAvBgB,EAAYhI,QACZgI,EAAYuoB,MACV,SAAC5sB,GAAI,OAAiCA,EAAK2mB,QAAQ,IAGrD1Z,EAAKR,KAAQ9I,EAAA,6CAEbsJ,EAAK4I,IAAG,YACMlS,EAAU,QAASU,EAC5BwhB,KAAI,SAAC7lB,GAAI,OAAK0gB,EAA6B1gB,EAAK2mB,SAAS,IACzDpY,KAAK,8CAOd,GADAV,EAAkB6S,EAA6Brd,EAASsjB,UAC/B,IAArBtjB,EAAS4I,SAAiB5I,EAAS+C,KACrC,GAAIyH,IAAoB3J,EAAWkc,SAAU,CAC3C,IAAMhc,EAASf,EAAS+C,KAAK/J,OAAS,GACtC6Q,EAAQ7J,EAAS+C,KAAK6b,SAAS7d,EAAQA,EAAS,GAClD,MAAWyJ,IAAoB3J,EAAWic,YACxCjT,EAAQiU,GAAkB9d,EAAS+C,MAGzC,CAEA,GAAKyH,GAAoBX,EAAzB,CASA,IAJA,IAmCCmY,EAnCK3hB,EAAW+f,GAAYvW,GACrBpJ,EAA+CmJ,EAA/Cs5D,yBAA0Bz7D,EAAqBmC,EAArBq5D,iBAE9B53D,EAA2B5K,EAAyBJ,GAAUoL,EAAA,WAGhE,IAAM9O,EAAa8K,EAAiBkE,GAC9BrL,EAAc3D,EAAWosC,YAC/B,IAAKzoC,EAAYyjB,MAAO,SAGxB,IAAMlrB,EAAcunB,GAAY9f,EAAYyjB,OAC5C,OACE1jB,IAAaxH,IAC4C,IAAzDyH,EAAYojB,IAAIvkB,QAAQ,KAAM,IAAIiG,QAAQ/E,IAE1CgL,EAA2B5K,EAAyB5H,GAChDyH,EAAY0jB,cAGTvjB,EAAyB5H,GAChCyH,EAAY0jB,KAAO,IAAI1Q,WAAWra,GAClCqH,EAAYyjB,MAAQla,GACpBwB,EAA2B5K,EAAyBJ,GAClDgL,EAAyBs0B,MAAK,WAC5B,OAAO/1B,EAAK65D,uCACV9mE,EACAoN,EACA9Q,EACA,4BAEJ,KACuB2mC,OAAM,SAACjjC,GAAK,OAAKiN,EAAK85D,YAAY/mE,EAAA,KAfrC,SAkBzB,EA/BQgP,EAAI,EAAGA,EAAIlE,EAAiBzO,SAKjC,KAL4CgpB,EAAAvW,MAc1C,IATOuW,GALgCrW,KAiC7C,IAAKN,EAA0B,CAC7B,GAAIb,IAAoBpK,EAItB,YAHAwJ,EAAK4I,IACU,aAAAlS,EAAA,UAAoBkK,EAAe,sCAAsCpK,GAK1FiL,EAA2B5K,EAAyBJ,GAClDuJ,EAAK+5D,6BAA6B,CAACn5D,IAAkBm1B,MACnD,SAAAhjC,GAA8B,IAAA2D,EAA3BzH,EAAS8D,EAATinE,UAAWp5D,EAAS7N,EAATknE,UACZj6D,EAAKk6D,mBAEL,IAAM1jE,EAAc,IAAIqjB,GACtB,cACApjB,EAAA,OAAQC,EACRgd,EAA2BzkB,IAAUyH,EAAI,IAI3C,OAFAF,EAAY4jB,KAAO,IAAI1Q,WAAWra,GAClCmH,EAAY2jB,MAAQla,EACbD,EAAKm6D,oBAAoBlrE,EAAW2R,GAAWm1B,MAAK,WACzD/1B,EAAKk6D,mBACL,IAAMnnE,EAAoBiN,EAAKo6D,6BAA6B,CAC1Dj7B,YAAA3oC,EACAwjE,UAAA/qE,EACAgrE,UAAAr5D,IAEF,OAAOZ,EAAK65D,uCACV9mE,EACAoN,EACA9Q,EACA,2BAEJ,GACF,IAGJoS,EAAyBu0B,OAAM,SAACjjC,GAAK,OAAKiN,EAAK85D,YAAY/mE,EAAA,GAC7D,CA7EA,MAFEiN,EAAK4I,IAAG,oBAAqBlS,EAAU,oBAAoBF,EAgF/D,GArLA,GAsLD,KAEO6jE,gBAAkB,SAACtnE,GACzBiN,EAAK4I,IAAG,IAAK7V,EAAM/B,KAAA,YA3mBnBqY,KAAKwb,IAAM1kB,EACXkJ,KAAKvQ,OAASqH,EAAIrH,OAClBuQ,KAAK0b,mBACP,CAAC,IAAA5kB,EAAApN,EAAAjD,UA2wCA,OA3wCAqQ,EAEM2lB,QAAP,WACEzc,KAAKmc,sBACLnc,KAAKixD,kBAEL,IAAMvnE,EAASsW,KAAKvQ,OACpB/F,EAAOwnE,gCAAkC,KACzCxnE,EAAOynE,gBAAkBznE,EAAO0nE,6BAAA,EAChC1nE,EAAO6gB,WAAa7gB,EAAO2nE,iBAAmB,CAAC,EAE/CrxD,KAAKwb,IAAMxb,KAAKvQ,OAASuQ,KAAKiwD,yBAA2B,KAEzDjwD,KAAKowD,iBAAmBpwD,KAAKgxD,gBAAkB,MAChDl6D,EAEO4kB,kBAAR,WACE1b,KAAKwb,IAAIM,GAAGpjB,EAAOE,eAAgBoH,KAAKshB,gBAAiBthB,MACzDA,KAAKwb,IAAIM,GAAGpjB,EAAOI,eAAgBkH,KAAKixD,gBAAiBjxD,MACzDA,KAAKwb,IAAIM,GAAGpjB,EAAOa,iBAAkByG,KAAK+b,kBAAmB/b,MAC7DA,KAAKwb,IAAIM,GAAGpjB,EAAOc,gBAAiBwG,KAAKi7B,iBAAkBj7B,KAAA,EAC5DlJ,EAEOqlB,oBAAR,WACEnc,KAAKwb,IAAIY,IAAI1jB,EAAOE,eAAgBoH,KAAKshB,gBAAiBthB,MAC1DA,KAAKwb,IAAIY,IAAI1jB,EAAOI,eAAgBkH,KAAKixD,gBAAiBjxD,MAC1DA,KAAKwb,IAAIY,IAAI1jB,EAAOa,iBAAkByG,KAAK+b,kBAAmB/b,MAC9DA,KAAKwb,IAAIY,IAAI1jB,EAAOc,gBAAiBwG,KAAKi7B,iBAAkBj7B,KAAA,EAC7DlJ,EAEOw6D,oBAAR,SAA4B5nE,GAC1B,IAAAoN,EAA2CkJ,KAAKvQ,OAAxCkH,EAAUG,EAAVyT,WAAYvkB,EAAkB8Q,EAAlB0T,mBACdnd,EAAyBsJ,EAAWjN,GAE1C,OAAI2D,EACKA,EAAuBkkE,WAI5B7nE,IAAckE,EAAWkc,UAAY9jB,EAChCA,OAAA,CADT,EAGD8Q,EAEO06D,2BAAR,SAAmC9nE,GACjC,IAAMoN,EAAMkJ,KAAKsxD,oBAAoB5nE,GACrC,QAAI,IAAAoN,EACF,MAAM,IAAII,MAC4C,oDAAAxN,EAAA,KAGxD,OAAOoN,CAAA,EACRA,EAEO26D,wBAAR,SAAgC/nE,GAC9B,IACMoN,EADiBkJ,KAAKvQ,OAApB8a,WACkC7gB,GAE1C,GAAIoN,EACF,OAAOA,EAAuB46D,qBAE9B1xD,KAAKT,IAAmD,+CAAA7V,EAAA,OAE3DoN,EAEO66D,uBAAR,SACEjoE,GAC0D,IAAAoN,EAAA,KACpDH,EAASqJ,KAAKwb,IAAI7D,OAClB3xB,EAAc,SAAC0D,EAA2BoN,EAAGH,GAAC,QAChDjN,GAASiN,EAAExE,QAAQzI,KAAWoN,CAAC,EAC7BzJ,EAAcsJ,EACjB4Y,KAAI,SAAC7lB,GAAK,OAAKA,EAAM8uB,UAAU,IAC/BzX,OAAO/a,GACJJ,EAAc+Q,EACjB4Y,KAAI,SAAC7lB,GAAK,OAAKA,EAAMm7B,UAAU,IAC/B9jB,OAAO/a,GAKV,OAJIqH,EAAYtH,OAASH,EAAYG,SAAW,GAC9CH,EAAY6kB,KAAK,eAGZ,IAAIxf,SACT,SACE0L,EAIA3Q,IAEgB,SAAV0D,EAAWkN,GACf,IAAMW,EAAYX,EAAWqZ,QAC7BnZ,EAAK86D,oBAAoBr6D,EAAWlK,EAAazH,GAC9C8mC,MAAK,SAAChjC,GAAS,OAAKiN,EAAQ,CAAEg6D,UAAAp5D,EAAWq5D,UAAAlnE,GAAY,IACrDijC,OAAM,SAAC71B,GACFF,EAAW7Q,OACb2D,EAAQkN,GAER5Q,EADS8Q,aAAiB+6D,GACnB/6D,EAGL,IAAI+6D,GACF,CACElqE,KAAMwU,EAAWG,iBACjB2gB,QAASxgB,EAAaE,qBACtBzH,MAAA4B,EACA6nB,OAAA,GAEF7nB,EAAMlB,SAId,IAtBY,CAwBRlM,EACV,KAEHoN,EAEO8T,4BAAR,SACElhB,EACAoN,GAEA,IAAQH,EAAoCqJ,KAAKvQ,OAAzCyhE,gCACR,GAAiD,mBAApCv6D,EAAiD,CAC5D,IAAI3Q,EAAA,4DAAyE2Q,EAO7E,OALkC,OAAhCgU,GAC2B,UAA3BjL,KAAK/S,SAASV,WAEdjG,EAAU,iFAAoF2G,SAASV,UAElGhB,QAAQ0E,OAAO,IAAIuH,MAAMlR,GAClC,CAEA,OAAO2Q,EAAgCjN,EAAWoN,EAAA,EACnDA,EAEO86D,oBAAR,SACEloE,EACAoN,EACAH,GACoB,IAAA3Q,EAAA,KAEdqH,ElF1IH,SACL3D,EACAoN,EACAH,EACA3Q,GAEA,IAAIqH,EACJ,OAAQ3D,GACN,KAAKkE,EAAWgc,SACdvc,EAAgB,CAAC,OAAQ,QACzB,MACF,KAAKO,EAAWkc,SAChB,KAAKlc,EAAWic,UACdxc,EAAgB,CAAC,QACjB,MACF,KAAKO,EAAW+b,SACdtc,EAAgB,CAAC,OAAQ,UACzB,MACF,QACE,MAAM,IAAI6J,MAA6B,uBAAAxN,GAE3C,OAQF,SACEA,EACAoN,EACAH,EACA3Q,GAqBA,MAAO,CAnByC,CAC9C8rE,cAAepoE,EACfqoE,gBAAiB/rE,EAAiB+rE,iBAAmB,WACrDC,sBAAuBhsE,EAAiBgsE,uBAAyB,WACjEC,aAAcjsE,EAAiBisE,cAAgB,CAC7CjsE,EAAiBksE,aAAe,aAElCC,kBAAmBr7D,EAAYyY,KAAI,SAAC7lB,GAAK,MAAM,CAC7C2iC,YAAW,sBAAwB3iC,EAAQ,IAC3C0oE,WAAYpsE,EAAiBqsE,iBAAmB,GAChDC,iBAAkBtsE,EAAiBusE,uBAAyB,KAC7D,IACDC,kBAAmB77D,EAAY4Y,KAAI,SAAC7lB,GAAK,MAAM,CAC7C2iC,YAAW,sBAAwB3iC,EAAQ,IAC3C0oE,WAAYpsE,EAAiBysE,iBAAmB,GAChDH,iBAAkBtsE,EAAiB0sE,uBAAyB,UAKlE,CA1BA,CAPIrlE,EACAyJ,EACAH,EACA3Q,EAEJ,CA3BO,CkF2ID0D,EACAoN,EACAH,EACAqJ,KAAKvQ,OAAO4hE,kBAERzrE,EACJoa,KAAK8vD,wBAAwBpmE,GAC3BkN,EAAkB,MAAAhR,OAAA,EAAAA,EAAyB+sE,gBAC/C,IAAK/7D,EAAiB,CACpBoJ,KAAKT,IAAG,+BACyB7V,EAAS,oCAAoCg3B,KAAKC,UAC/EtzB,IAGJuJ,EAAkBoJ,KAAK4K,4BACrBlhB,EACA2D,GAEF,IAAMkK,EACHyI,KAAK8vD,wBAAwBpmE,GAAa,CACzCipE,gBAAA/7D,GAOJ,OALAA,EAAgB+1B,OAAM,SAAC71B,GACrB9Q,EAAKuZ,IAAG,0CACoC7V,EAAS,MAAMoN,EAE7D,IACOF,EAAgB81B,MAAK,SAAC51B,GAC3B9Q,EAAKuZ,IAAG,0BACoBzI,EAAqB65D,UAAA,cAGjD,IAAMh6D,EAAqB3Q,EAAK4sE,uBAAuBlpE,GAyBvD,OAvBA1D,EAAKuZ,IAA8B,0BAAA7V,EAAA,KACnC6N,EAAwBq5D,UAAY95D,EACjC+7D,kBACAnmC,MAAK,SAAC51B,GAEL,OADA9Q,EAAKuZ,IAA+B,2BAAA7V,EAAA,KAC7BiN,EAAmB+1B,MAAK,SAAC/1B,GAC9B,OAAIA,EACK3Q,EAAK8sE,8BACVh8D,EACApN,EACAiN,GAGGG,CACT,GACF,IAEFS,EAAwBq5D,UAAUjkC,OAAM,SAAC71B,GACvC9Q,EAAKkP,MAAK,oCAC4BxL,EAAS,OAAOoN,EAExD,IAEOS,EAAwBq5D,SACjC,GACF,CACA,OAAOh6D,EAAgB81B,MAAK,kBAAM9mC,EAAwBgrE,SAAS,KACpE95D,EAEOi6D,6BAAR,SAAArnE,GAQ2B,IAPzBoN,EAAWpN,EAAXosC,YACAn/B,EAASjN,EAATinE,UACA3qE,EAAS0D,EAATknE,UAMA5wD,KAAKT,IAC6B,gCAAA5I,EAAA,YAAqBwW,GACnDrW,EAAYga,OAAU,KAI1B,IAAMzjB,EAAmBrH,EAAU+sE,gBAE7BntE,EAAiD,CACrDkwC,YAAAh/B,EACA65D,UAAAh6D,EACAi6D,UAAA5qE,EACAgtE,iBAAA3lE,EACA4lE,UAAW,kBAKb,OAFAjzD,KAAKgwD,iBAAiBvlD,KAAK7kB,GAEpBA,CAAA,EACRkR,EAEOo8D,gBAAR,SAAwBxpE,GACtB,IAAMoN,EAAcpN,EAAuBosC,YAC3C,GAAIh/B,EAAYia,KAAM,CACpB,IAAMpa,EAAoBqJ,KAAK+wD,6BAC7BrnE,GAEI1D,EAAQga,KAAKmzD,eAAer8D,GAElCkJ,KAAKiwD,yBAAyBjqE,GAC5Bga,KAAKwwD,uCACH75D,EAHW,OAKXG,EAAYia,KACZ,UAEN,MACE/Q,KAAK7J,KAAI,2DAEX6J,KAAKozD,cAAc1pE,EAAA,EACpBoN,EAEOq8D,eAAR,SAAuBzpE,GACrB,IAAKA,EACH,MAAM,IAAIwN,MAAM,iDAElB,GAA0B,OAAtBxN,EAAYonB,MACd,MAAM,IAAI5Z,MAAM,iBAElB,OAAOiW,GAAYzjB,EAAYonB,MAAA,EAChCha,EAEOu8D,iBAAR,SACE3pE,EACAoN,GACe,IAAAH,EACT3Q,EAAa0D,EAAuBspE,iBAO1C,OANAhzD,KAAKT,IACsB,yBAAAvZ,EAAWstE,UAAS,eAAenmD,IACxB,OAAlCxW,EAAAjN,EAAuBosC,kBAAA,EAAvBn/B,EAAoCma,QAAU,IAC/C,4BACiBha,EAAOA,EAAKmU,WAAanU,GAAA,KAEtC9Q,EAAWmlC,OAAOr0B,EAAA,EAC1BA,EAEMy8D,sBAAP,SAA6B7pE,GAC3B,IAAMoN,EAAatQ,OAAOP,KAAKyD,EAAKoa,WAAa,CAAC,GASlD,OARK9D,KAAK6vD,mBACR7vD,KAAKT,IACwC,2CAAA7V,EAAKma,GAAE,IAAIna,EAAK/B,KAAA,KACzD+B,EAAKua,MACU,iBAAAnN,EAAWmB,KAAK,OAEnC+H,KAAK6vD,iBAAmB7vD,KAAKswD,oBAAoBx5D,IAE5CkJ,KAAK6vD,gBAAA,EACb/4D,EAEOw5D,oBAAR,SACE5mE,GAC2B,IAAAoN,EAAA,KAC3B,OAAO,IAAI7L,SAAQ,SAAC0L,EAAS3Q,GAC3B,IAAMqH,EAAqBid,EAAuBxT,EAAKrH,QACjD7J,EAAsB8D,EACzB6lB,IAAIpF,GACJpJ,QACC,SAACrX,GAAK,QAAOA,IAAgD,IAAvC2D,EAAmB8E,QAAQzI,EAAa,IAElE,OAAOoN,EAAK45D,6BAA6B9qE,GACtC8mC,MAAK,SAAAhjC,GAAmB,IAAhBoN,EAASpN,EAATinE,UACDtjE,EAAkBgd,EAA2BvT,GAC/CzJ,EACFsJ,EAAQtJ,GAERrH,EACE,IAAIkR,MAAA,yCAA+CJ,EAAS,KAGlE,IACC61B,MAAM3mC,EACX,KACD8Q,EAEM08D,QAAP,SAAe9pE,GAAsD,IAAAoN,EAAA,KAC7DH,EAAcjN,EAAK+pE,QAAQ39B,YAE3B9vC,EAAQga,KAAKmzD,eAAex8D,GAC5BtJ,EAAU,WAAcrH,EAAK,aAAa2Q,EAAY+Z,UAAsB,aAAA/Z,EAAYhF,OAAM,SAASgF,EAAY8Z,IAAM,IAE/HzQ,KAAKT,IAAgC,4BAAAlS,GAErC,IAAIzH,EAA2Boa,KAAKiwD,yBAAyBjqE,GA+B7D,OA9BKJ,IACHA,EAA2Boa,KAAKiwD,yBAAyBjqE,GACvDga,KAAK0zD,0BAA0B/8D,GAAa+1B,MAC1C,SAAA1mC,GAA8B,IAA3BJ,EAASI,EAAT2qE,UAAW/5D,EAAS5Q,EAAT4qE,UAMZ,OALA95D,EAAK+5D,mBACL/5D,EAAKyI,IAC2B,8BAAA7V,EAAKk+B,KAAK/jB,GAAE,IAAIna,EAAKk+B,KAAKjgC,KAAA,KAAS+B,EAAKk+B,KAAK3jB,MAAmB,cAAA5W,GAGzFyJ,EAAKg6D,oBAAoBlrE,EAAWgR,GAAW81B,MAAK,WACzD51B,EAAK+5D,mBACL,IAAMnnE,EAAoBoN,EAAKi6D,6BAA6B,CAC1DJ,UAAA/qE,EACAgrE,UAAAh6D,EACAk/B,YAAAn/B,IAGF,OAAOG,EAAK05D,uCACV9mE,EAFa,OAIbiN,EAAYoa,KACZ,eAEJ,GACF,KAGqB4b,OAAM,SAACjjC,GAAK,OAAKoN,EAAK25D,YAAY/mE,EAAA,IAGtD9D,CAAA,EACRkR,EAEO+5D,iBAAR,SAAyBnnE,GACvB,IAAKsW,KAAKwb,IACR,MAAM,IAAItkB,MAAM,kBAEnBJ,EAEO25D,YAAR,SAAoB/mE,GACbsW,KAAKwb,MAGVxb,KAAK9K,MAAMxL,EAAMkM,SACblM,aAAiBmoE,GACnB7xD,KAAKwb,IAAI6C,QAAQ3lB,EAAOkD,MAAOlS,EAAMoG,MAErCkQ,KAAKwb,IAAI6C,QAAQ3lB,EAAOkD,MAAO,CAC7BjU,KAAMwU,EAAWG,iBACjB2gB,QAASxgB,EAAaC,mBACtBxH,MAAAxL,EACAi1B,OAAA,IAAO,EAGZ7nB,EAEO48D,0BAAR,SACEhqE,GAEA,IAAMoN,EAAQkJ,KAAKmzD,eAAezpE,GAC5BiN,EAAyBqJ,KAAKiwD,yBAAyBn5D,GAC7D,IAAKH,EAAwB,CAC3B,IAAM3Q,EAAYmkB,EAChBzgB,EAAYgnB,WAERrjB,EAAsBrH,EACxB,CAACA,GACDskB,EAAuBtK,KAAKvQ,QAChC,OAAOuQ,KAAK2xD,uBAAuBtkE,EACrC,CACA,OAAOsJ,CAAA,EACRG,EAEO45D,6BAAR,SACEhnE,GAKA,GAHKA,EAAoB3D,SACvB2D,EAAsB4gB,EAAuBtK,KAAKvQ,SAEjB,IAA/B/F,EAAoB3D,OACtB,MAAM,IAAI8rE,GACR,CACElqE,KAAMwU,EAAWG,iBACjB2gB,QAASxgB,EAAaI,iCACtB8hB,OAAA,GAEkD,oDAAA+B,KAAKC,UAAU,CACjEpW,WAAYvK,KAAKvQ,OAAO8a,cAI9B,OAAOvK,KAAK2xD,uBAAuBjoE,EAAA,EACpCoN,EAsMOg6D,oBAAR,SACEpnE,EACAoN,GACe,IAAAH,EAAA,KACT3Q,EAAQga,KAAKkwD,kBAAkB9vD,QAErCJ,KAAKT,IAA+B,2BAAA7V,EAAA,KAGpC,IAAM2D,EAAsBpC,QAAQF,IAAI/E,GAAO0mC,MAAK,WAClD,IAAK/1B,EAAKuqB,MACR,MAAM,IAAIhqB,MACR,6DAGJ,OAAOP,EAAKuqB,MAAMyyC,aAAa78D,EACjC,IAEA,OADAkJ,KAAKkwD,kBAAkBzlD,KAAKpd,GACrBA,EAAoBq/B,MAAK,WAC9B/1B,EAAK4I,IAA2B,uBAAA7V,EAAA,KAChC1D,EAAMykB,KAAKpd,GACXsJ,EAAKu5D,kBAAoBv5D,EAAKu5D,kBAAkBnvD,QAC9C,SAACrX,GAAC,OAA2B,IAAtB1D,EAAMmM,QAAQzI,EAAS,GAElC,KACDoN,EAEO05D,uCAAR,SACE9mE,EACAoN,EACAH,EACA3Q,GAKyC,IAAAqH,EAAAzH,EAAAgR,EAAA,KACnCW,EACkB,OADGlK,EACzB2S,KAAKvQ,OAAO8a,aAA+B,OAArB3kB,EAAtByH,EAAyB3D,EAAQinE,iBAAA,EAAjC/qE,EAA6CguE,gBAC/C,GAAIr8D,EACF,IACE,IAAMpK,EACJoK,EAAsB3Q,KAAKoZ,KAAKwb,IAAK1kB,EAAcH,EAAUjN,GAC/D,IAAKyD,EACH,MAAM,IAAI+J,MACR,2DAGJJ,EAAe3J,EAAekjE,aAC9B15D,EAAWjN,EAAQosC,YAAY/kB,KAAO5jB,EAAe4iD,SACjD,IAAI1vC,WAAWlT,EAAe4iD,UAC9B,IACL,CAAC,MAAOrmD,GAAO,IAAAgO,EAEd,GADAsI,KAAK7J,KAAKzM,EAAMkM,SACZ,OAAJ8B,EAAIsI,KAAKwb,MAAL9jB,EAAUjI,OAAO6P,MACnB,MAAM5V,CAEV,CAGF,GAAiB,OAAbiN,EAEF,OADAqJ,KAAKT,IAAyC,qCAAAvZ,EAAA,mBACvCiF,QAAQyE,QAAQhG,GAGzB,IAAMsE,EAAQgS,KAAKmzD,eAAezpE,EAAQosC,aAC1C91B,KAAKT,IAAG,uCACiCvZ,EAAM,MAAMgI,EAA0B,qBAAA8I,EAC3E,aAAAH,EAAWA,EAASsU,WAAa,WAIrC,IAAMld,EAAgB,IAAIklD,GAEpBplD,EAAanE,EAAQmqE,WAAa,SAAC/8D,GACvC,IAAMH,EAAajN,EAAQspE,iBAC3B,GAAKr8D,EAAL,CAIA,IAAQ3Q,EAAyB8Q,EAAzBg9D,YAAazmE,EAAYyJ,EAAZlB,QACrBgB,EAAK2I,IACC,IAAAvZ,EAA2C,gCAAA2Q,EAAW28D,UAA4B,mBAAAjmE,EAAQ4d,YAG9E,oBAAhBjlB,GACgB,oBAAhBA,EAEA4Q,EAAKm9D,aAAarqE,EAAS2D,GAASs/B,OAAM,SAACjjC,GACzCkN,EAAK65D,YAAY/mE,GACjBqE,EAAc00C,KAAK,QAAS/4C,EAC9B,IACyB,oBAAhB1D,EACL0D,EAAQinE,YAAc/iE,EAAWgc,WACnChT,EAAKy8D,iBAAiB3pE,EAAS+f,EAAe,iBAC9C7S,EAAKw8D,cAAc1pE,IAGrBkN,EAAKT,KAA0C,qCAAAnQ,EAAA,IAnBjD,MAFE+H,EAAc00C,KAAK,QAAS,IAAIvrC,MAAM,mBAyBpCnK,EAAuBrD,EAAQsqE,qBAAuB,SAC1Dl9D,GAGA,GADmBpN,EAAQspE,iBAC3B,CAIAp8D,EAAKq9D,kBAAkBvqE,GACvB,IAAMiN,EAAYjN,EAAQupE,UAC1BllE,EAAc00C,KAAK,YAAa9rC,GACd,YAAdA,IACFC,EAAKT,KAAQzM,EAAQinE,UAAS,oBAAoB3iE,GAClD4I,EAAKs8D,gBAAgBxpE,GANvB,MAFEqE,EAAc00C,KAAK,QAAS,IAAIvrC,MAAM,mBAY1CxN,EAAQspE,iBAAiBt/D,iBAAiB,UAAW7F,GACrDnE,EAAQspE,iBAAiBt/D,iBACvB,oBACA3G,GAGF,IAAMe,EAAmB,IAAI7C,SAC3B,SAACvB,EAAiCoN,GAChC/I,EAAc+tB,GAAG,QAAShlB,GAE1B/I,EAAc+tB,GAAG,aAAa,SAACnlB,GACzBA,EAAU4xB,WAAW,UACvB7+B,IACuB,sBAAdiN,EACTG,EACE,IAAI+6D,GACF,CACElqE,KAAMwU,EAAWG,iBACjB2gB,QAASxgB,EAAaS,oCACtByhB,OAAA,GAEF,iCAGmB,mBAAdhoB,EACTG,EACE,IAAI+6D,GACF,CACElqE,KAAMwU,EAAWG,iBACjB2gB,QAASxgB,EAAaU,iCACtBwhB,OAAA,GAEwB,0BAAAhoB,EAC5B,MAEqB,YAAdA,EACTG,EAAO,IAAII,MAAM,yCAEjBN,EAAKT,KAAqC,gCAAAQ,EAAA,IAE9C,GACF,IAGF,OAAOjN,EAAQspE,iBACZY,gBAAgB98D,EAAcH,GAC9B+1B,MAAK,WAAM,IAAA51B,EACVF,EAAK2I,IAAG,uCACwD,OADxDzI,EACgCpN,EAAQspE,uBAAA,EAARl8D,EAA0Bw8D,WAAS,YAAYtlE,EAEzF,IACC2+B,OAAM,SAACjjC,GACN,MAAM,IAAImoE,GACR,CACElqE,KAAMwU,EAAWG,iBACjB2gB,QAASxgB,EAAaG,sBACtB1H,MAAAxL,EACAi1B,OAAA,GACD,yCACwCj1B,EAAA,IAG5CgjC,MAAK,kBAAM5+B,CAAgB,IAC3B6+B,OAAM,SAAC71B,GAGN,MAFA/I,EAAc8kD,qBACdj8C,EAAKw8D,cAAc1pE,GACboN,CACR,IACC41B,MAAK,WAEJ,OADA3+B,EAAc8kD,qBACPnpD,CACT,KACHoN,EAEOm9D,kBAAR,SAA0BvqE,GAAgD,IAAAoN,EAAA,KACxEpN,EAAuBspE,iBAAiBkB,YAAY9gE,SAClD,SAACuD,EAAwB3Q,GACvB8Q,EAAKyI,IAAG,sBACgB5I,EAAM,4BAA4BwW,GACtD,WAAYnnB,EACR,IAAIqa,WAAWra,EAAM+kB,OAAQ/kB,EAAMglB,WAAYhlB,EAAMilB,YACrD,IAAI5K,WAAWra,IACpB,mBAAmBmnB,GAClB,IAAI9M,WAAW3W,EAAuBosC,YAAYhlB,OAAS,KACnD,SAAApnB,EAAuBosC,YAAYrlB,KAE/C/mB,EAAuBupE,UAAYt8D,CACrC,KAEHG,EAEO87D,uBAAR,SACElpE,GAEA,IAAMoN,EAASkJ,KAAKvQ,OAEdkH,EAAa,IAAI,EADRG,EAAOiN,QACQjN,GACxBzJ,EAAM2S,KAAKyxD,wBAAwB/nE,GACzC,OAAK2D,GAGL2S,KAAKT,IAAwC,oCAAA7V,EAAA,KACtC,IAAIuB,SAAQ,SAACrF,EAASgR,GAC3B,IAAMW,EAA+B,CACnCtH,aAAc,cACdnE,IAAAuB,GAEIF,EAAa2J,EAAOq9D,eAAevlD,QACnClX,EAAoC,CACxC4lB,WAAAnwB,EACA4E,QAAS5E,EAAWkwB,cACpBE,SAAU,EACVE,WAAY,EACZE,cAAe,GAEX3vB,EAAkD,CACtD6vB,UAAW,SAACn0B,EAAUoN,EAAOH,EAAS3Q,GACpCJ,EAAQ8D,EAASoG,KAClB,EACDouB,QAAS,SAACpnB,EAAUH,EAAQ/Q,EAAgBuH,GAC1CyJ,EACE,IAAIi7D,GACF,CACElqE,KAAMwU,EAAWG,iBACjB2gB,QACExgB,EAAaM,6CACf4hB,OAAA,EACAH,eAAA54B,EACAwL,SAAQpL,EAAA,CACN8F,IAAKyL,EAAczL,IACnBgE,UAAA,GACGgH,IAGH,IAAApN,EAA0C,iCAAA2D,EAAA,cAAiByJ,EAAS+nB,KAAI,KAAK/nB,EAAS2W,KAAI,KAGnG,EACD2Q,UAAW,SAACtnB,EAAOH,EAAS3Q,GAC1B4Q,EACE,IAAIi7D,GACF,CACElqE,KAAMwU,EAAWG,iBACjB2gB,QACExgB,EAAaM,6CACf4hB,OAAA,EACAH,eAAAx4B,EACAoL,SAAU,CACRtF,IAAKyL,EAAczL,IACnBgE,UAAA,IAAM,IAGNpG,EAAS,oCAAoC2D,EAAG,KAGzD,EACD2oC,QAAS,SAACtsC,EAAOoN,EAASH,GACxBC,EAAO,IAAIM,MAAM,WACnB,GAEFP,EAAW+lB,KAAKnlB,EAAeG,EAAc1J,EAC/C,KA9DS/C,QAAQyE,SAAA,EA+DlBoH,EAEOg8D,8BAAR,SACEppE,EACAoN,EACAH,GACoB,IAAA3Q,EAAA,KACpB,OAAO,IAAIiF,SAAQ,SAACoC,EAASzH,GAC3B8D,EACG0qE,qBAAqBz9D,GACrB+1B,MAAK,SAAC9mC,GACLI,EAAKuZ,IAAG,yBAEJ3Z,EAAU,UAAY,wBACnB,YAAA+Q,OAAA,EAAAA,EAAMsU,YAAmB,SAAAnU,EAAA,KAEhCzJ,EAAQ3D,EACV,IACCijC,OAAM,SAACjjC,GACN9D,EACE,IAAIisE,GACF,CACElqE,KAAMwU,EAAWG,iBACjB2gB,QACExgB,EAAaO,4CACf9H,MAAAxL,EACAi1B,OAAA,GAEFj1B,EAAMkM,SAGZ,GACJ,KACDkB,EAEOi9D,aAAR,SACErqE,EACAoN,GACe,IAAAH,EAAA,KACf,OAAOqJ,KAAKq0D,eAAe3qE,EAAS,IAAI2W,WAAWvJ,IAAa41B,MAC9D,SAAC51B,GACC,OAAOH,EAAK08D,iBAAiB3pE,EAAS,IAAI2W,WAAWvJ,IAAO61B,OAC1D,SAACjjC,GACC,MAAM,IAAImoE,GACR,CACElqE,KAAMwU,EAAWG,iBACjB2gB,QAASxgB,EAAaQ,iCACtB/H,MAAAxL,EACAi1B,OAAA,GAEFj1B,EAAMkM,QAEV,GAEJ,KAEHkB,EAEOw9D,0BAAR,SACE5qE,EACAoN,GAOA,IAAMH,EAAYuU,OAAOC,aAAaC,MACpC,KACA,IAAIN,YAAYhU,EAAiBiU,SAEnC,IAAKpU,EAAUoW,SAAS,uBAMtB,OADArjB,EAAI6J,iBAAiB,eAAgB,2BAC9BuD,EAET,IAAM9Q,GAAgB,IAAIqlB,WAAYC,gBACpC3U,EACA,mBAGItJ,EAAUrH,EAAc+4D,iBAAiB,cAC/C,GAAI1xD,EAAQtH,OAAS,EAEnB,IADA,IAAIH,EACKgR,EAAI,EAAGW,EAAMlK,EAAQtH,OAAQ6Q,EAAIW,EAAKX,IAAK,KAAAzJ,EAAAuK,EAE5C1J,EAAO,OAAHb,GADVvH,EAASyH,EAAQuJ,IACGkoD,cAAc,gBAArB3xD,EAA8Bo8D,YACrCx7D,EAAQ,OAAH2J,EAAG9R,EAAOk5D,cAAc,iBAArBpnD,EAA+B6xD,YACzCv7D,GAAQD,GACVrE,EAAI6J,iBAAiBvF,EAAMD,EAE/B,CAEF,IAAMF,EAAmB7H,EAAc84D,cAAc,aAC/C/xD,EAAgB,MAAAc,OAAA,EAAAA,EAAkB07D,YACxC,IAAKx8D,EACH,MAAM,IAAImK,MAAK,0CAEjB,OAAOuS,EAAeF,KAAKxc,GAAA,EAC5B+J,EAEOy9D,gBAAR,SACE7qE,EACAoN,EACAH,EACA3Q,GACgE,IAAAqH,EAAA,KAC1DzH,EAAkBoa,KAAKvQ,OAAO0hE,gBAEpC,OAAKvrE,EAMEqF,QAAQyE,UACZg9B,MAAK,WACJ,IAAK/1B,EAAam/B,YAChB,MAAM,IAAI5+B,MAAM,eAElB,OAAOtR,EAAgBgB,KACrByG,EAAKmuB,IACL9xB,EACAoN,EACAH,EACA3Q,EAEJ,IACC2mC,OAAM,SAAC/1B,GACN,IAAKD,EAAam/B,YAEhB,MAAMl/B,EAKR,OAFAlN,EAAIgI,KAAK,OAAQoF,GAAA,GAEVlR,EAAgBgB,KACrByG,EAAKmuB,IACL9xB,EACAoN,EACAH,EACA3Q,EAEJ,IACC0mC,MAAK,SAAC/1B,GAQL,OANKjN,EAAIuI,YACPvI,EAAIgI,KAAK,OAAQoF,GAAA,GAKZ,CAAE09D,IAAA9qE,EAAK+qE,iBAHgB99D,GAE1B3Q,EAEN,KA3CA0D,EAAIgI,KAAK,OAAQoF,GAAA,GAEV7L,QAAQyE,QAAQ,CAAE8kE,IAAA9qE,EAAK+qE,iBAAAzuE,IAAA,EA0CjC8Q,EAEOu9D,eAAR,SACE3qE,EACAoN,GACsB,IAAAH,EAAA,KAChB3Q,EAAgBga,KAAKvQ,OAAO64B,cAAc1Z,QAChD,OAAO,IAAI3jB,SAAQ,SAACoC,EAASzH,GAC3B,IAAMgR,EAAMD,EAAK66D,2BAA2B9nE,EAAkBinE,WAC9Dh6D,EAAK4I,IAAuC,mCAAA3I,GAC5C,IAAMW,EAAM,IAAI/G,eAChB+G,EAAItH,aAAe,cACnBsH,EAAIvF,mBAAqB,WACvB,IAAK2E,EAAK6kB,MAAQ9xB,EAAkBspE,iBAClC,OAAOptE,EAAO,IAAIsR,MAAM,kBAE1B,GAAuB,IAAnBK,EAAItF,WACN,GAAmB,MAAfsF,EAAIjG,OAAgB,CACtBqF,EAAKo5D,4BAA8B,EACnC,IAAI5iE,EAAOoK,EAAInG,SACfuF,EAAK4I,IAED,qBAAApS,aAAgB0nD,YAAc1nD,EAAK8d,WAAa9d,IAGpD,IAAMuK,EAA0Bf,EAAKlH,OAAO2hE,wBAC5C,GAAI15D,EACF,IACEvK,EAAOuK,EAAwB9Q,KAC7B+P,EAAK6kB,IACLjkB,EACAX,EACAlN,EAEH,CAAC,MAAOA,GACPiN,EAAKzB,MAAMxL,EACb,CAEF2D,EAAQF,EACV,KAAO,CACL,IAAMa,EAAchI,EAAc+2B,WAC5BhvB,EAAcC,EAAcA,EAAYwvB,YAAc,EAE5D,GADA7mB,EAAKo5D,8BAEHp5D,EAAKo5D,4BAA8BhiE,GAClCwJ,EAAIjG,QAAU,KAAOiG,EAAIjG,OAAS,IAEnC1L,EACE,IAAIisE,GACF,CACElqE,KAAMwU,EAAWG,iBACjB2gB,QAASxgB,EAAaK,kCACtB6hB,OAAA,EACAH,eAAgBjnB,EAChBnG,SAAU,CACRtF,IAAA8K,EACA9G,UAAA,EACA+uB,KAAMtnB,EAAIjG,OACVmc,KAAMlW,EAAIhG,aAGiB,+BAAAqF,EAAiB,cAAAW,EAAIjG,OAAW,KAAAiG,EAAIhG,WACrE,UAEG,CACL,IAAM1D,EACJE,EAAc4I,EAAKo5D,4BAA8B,EACnDp5D,EAAKR,KAC0B,6BAAAtI,EAAA,kBAE/B8I,EAAK09D,eAAe3qE,EAAmBoN,GAAkB41B,KACvDr/B,EACAzH,EAEJ,CACF,GAIF8D,EAAkBgrE,YAClBhrE,EAAkBgrE,WAAWziE,aAAezB,eAAemkE,MAE3DjrE,EAAkBgrE,WAAW5gE,QAE/BpK,EAAkBgrE,WAAan9D,EAE/BZ,EAAK49D,gBAAgBh9D,EAAKX,EAAKlN,EAAmBoN,GAAkB41B,MAClE,SAAA51B,GAA+B,IAA5B9Q,EAAG8Q,EAAH09D,IAAKnnE,EAAgByJ,EAAhB29D,iBACF/qE,EAAkBinE,WAAa/iE,EAAWic,YAC5Cxc,EAAmBsJ,EAAK29D,0BACtBtuE,EACAqH,IAGJrH,EAAIkO,KAAK7G,EACX,GAEJ,KACDyJ,EAEOwqB,gBAAR,SACE53B,EACAoN,GAEA,GAAKkJ,KAAKvQ,OAAOmlE,WAAjB,CAIA,IAAMj+D,EAAQG,EAAKoqB,MAGnBlhB,KAAKkhB,MAAQvqB,EAEbA,EAAMrG,oBAAoB,YAAa0P,KAAKowD,kBAC5Cz5D,EAAMrG,oBAAoB,gBAAiB0P,KAAKgxD,iBAChDr6D,EAAMjD,iBAAiB,YAAasM,KAAKowD,kBACzCz5D,EAAMjD,iBAAiB,gBAAiBsM,KAAKgxD,gBAV7C,GAWDl6D,EAEOm6D,gBAAR,WAA0B,IAAAn6D,EAAA,KAClBH,EAAQqJ,KAAKkhB,MACbl7B,EAAgBga,KAAKgwD,iBACvBr5D,IACFA,EAAMrG,oBAAoB,YAAa0P,KAAKowD,kBAC5Cz5D,EAAMrG,oBAAoB,gBAAiB0P,KAAKgxD,iBAChDhxD,KAAKkhB,MAAQ,MAGflhB,KAAK+vD,4BAA8B,EACnC/vD,KAAKkwD,kBAAoB,GACzBlwD,KAAKgwD,iBAAmB,GACxBhwD,KAAKiwD,yBAA2B,CAAC,EACjCz/C,GAASQ,wBAGT,IAAM3jB,EAAkBrH,EAAcD,OACtC2D,EAAcymE,kBAAoBllE,QAAQF,IACxC/E,EACGupB,KAAI,SAAC7lB,GAAsB,OAC1BoN,EAAKs8D,cAAc1pE,EACrB,IACCJ,OAAA,MACCqN,OAAA,EAAAA,EAAOg9D,aAAa,MAAMhnC,OAAM,SAACjjC,GAC/BoN,EAAKyI,IAAmC,+BAAA7V,EAC1C,MAGHgjC,MAAK,WACAr/B,IACFyJ,EAAKyI,IAAI,yDACTvZ,EAAcD,OAAS,EAE3B,IACC4mC,OAAM,SAACjjC,GACNoN,EAAKyI,IAAsD,kDAAA7V,EAC7D,KACHoN,EAEOilB,kBAAR,WACE/b,KAAK6vD,iBAAmB,MACzB/4D,EAEOmkC,iBAAR,SACEvxC,EAA6BoN,GAE7B,IADEH,EAAWG,EAAX+gB,YAEF,GAAKlhB,GAAgBqJ,KAAKvQ,OAAOmlE,aAG5B50D,KAAK6vD,iBAAkB,CAC1B,IAAM7pE,EAAiC2Q,EAAYigB,QACjD,SAACltB,EAA6BoN,GAM5B,OAJiE,IAA/DpN,EAAQyI,QAAQ2E,EAAW4Z,YAE3BhnB,EAAQ+gB,KAAK3T,EAAW4Z,WAEnBhnB,CACR,GACD,IAEFsW,KAAKT,IACuC,0CAAAvZ,EAAWiS,KAAK,OAE5D+H,KAAK6vD,iBAAmB7vD,KAAKswD,oBAAoBtqE,EACnD,GACD8Q,EAEOs8D,cAAR,SACE1pE,GACsB,IAAAoN,EAAA,KACdH,EAAiCjN,EAAjCspE,iBAAkBhtE,EAAe0D,EAAfgrE,WAC1B,GAAI/9D,EAAkB,CACpBqJ,KAAKT,IAAG,8CACwC5I,EAAiB28D,WAE7D5pE,EAAuBmqE,aACzBl9D,EAAiBrG,oBACf,UACA5G,EAAuBmqE,YAEzBnqE,EAAuBmqE,gBAAA,GAErBnqE,EAAuBsqE,uBACzBr9D,EAAiBrG,oBACf,oBACA5G,EAAuBsqE,sBAEzBtqE,EAAuBsqE,0BAAA,GAGrBhuE,GAAcA,EAAWiM,aAAezB,eAAemkE,MACzD3uE,EAAW8N,QAEbpK,EAAuBspE,iBACrBtpE,EAAuBosC,YACvBpsC,EAAuBgrE,gBAAA,EAEzB,IAAMrnE,EAAQ2S,KAAKgwD,iBAAiB79D,QAAQzI,GAI5C,OAHI2D,GAAS,GACX2S,KAAKgwD,iBAAiB9+C,OAAO7jB,EAAO,GAE/BsJ,EACJgoD,SACAhyB,OAAM,SAACjjC,GACNoN,EAAKyI,IAAiC,6BAAA7V,EACxC,IACCgjC,MAAK,WACJ,OAAO/1B,EAAiBk+D,OAC1B,IACCloC,OAAM,SAACjjC,GACNoN,EAAKyI,IAAgC,4BAAA7V,EACvC,GACJ,GACDA,CAAA,CA3yCgB,GAAbkmE,GACUO,uBAAA,EAAiB,ICnErB2E,GCAAC,GCDAC,GAAAC,GHi3CNpD,GAAA,SAAWnoE,GAEf,SAAAoN,EACEA,EACAH,GACA,IAAA3Q,EAIsB,OAHtBA,EAAA0D,EAAA9C,KAAA,KAAM+P,IAAQ,MALA7G,UAAA,EAMdgH,EAAK5B,QAAL4B,EAAK5B,MAAU,IAAIgC,MAAMP,IACzB3Q,EAAK8J,KAAOgH,EACZA,EAAKrF,IAAMqF,EAAK5B,MAAMlP,CACxB,CAAC,OAVcmH,EAAA2J,EAAApN,GAUdoN,CAAA,CAVG,CAUHjJ,EAVuBqJ,SCh3C1B,SAAYxN,GAIXA,EAAcwrE,SAAA,IAKdxrE,EAAW6uB,MAAA,IAKX7uB,EAAWyrE,MAAA,IAKXzrE,EAAY0rE,MAAA,KAKZ1rE,EAAU2rE,KAAA,IAKV3rE,EAAa4rE,QAAA,IAKb5rE,EAAiB6rE,WAAA,KAKjB7rE,EAAS8rE,IAAA,IAKT9rE,EAAW+rE,MAAA,GACX,CA7CD,CAAYX,KAAAA,GAAY,KCAxB,SAAYprE,GAIXA,EAAUgsE,KAAA,IAKVhsE,EAASisE,IAAA,IAKTjsE,EAAYksE,OAAA,IAKZlsE,EAAW+rE,MAAA,GACX,CApBD,CAAYV,KAAAA,GAAiB,KCD7B,SAAYrrE,GAIXA,EAAsBmsE,OAAA,cAKtBnsE,EAAwBosE,QAAA,eAKxBpsE,EAAwBqsE,QAAA,eAKxBrsE,EAAsBssE,OAAA,aACtB,CApBD,CAAYhB,KAAAA,GAAe,KCGpB,IAAMiB,KAAahB,GAAA,IACxBD,GAAgBa,QAAS,CAAC,KAAM,IAAK,KAAM,MAAKZ,GAChDD,GAAgBc,SAAU,CAAC,KAAM,KAAM,MAAO,MAAO,MAAO,MAAKb,GACjED,GAAgBe,SAAU,CAAC,MAAO,KAAM,KAAM,MAAO,KAAM,KAAId,GAC/DD,GAAgBgB,QAAS,CAAC,KAAM,OAAMf,ICJ3BiB,GAMZ,SAAAxsE,EAAYoN,EAAYH,GAAqB,KAJ7CnF,WAAA,EAAK,KAELK,YAAA,EAGK3L,MAAMC,QAAQ2Q,KACjBA,EAAQA,EAAMyY,KAAI,SAACzY,GAAC,OAAMA,aAAapN,EAAUoN,EAAI,IAAIpN,EAAOoN,EAAA,KAGjE,KAAKtF,MAAQsF,EACb,KAAKjF,OAAS8E,CACf,EChBYw/D,GACZ,SAAmBzsE,GAAmB,KAAnB0sE,iBAAA,OAAAA,YAAA1sE,CAAuB,ECRpC,IAAM2sE,GAAY,YCAZC,GAAe,mBCEtB,SAAUC,GAAe7sE,EAAUoN,EAAcH,GACtD,OCaK,SAAqBjN,EAAgBoN,EAAUH,EAAc3Q,GAClE,OAAO,IAAIkR,MAAK,aAAcxN,EAAM,MAjBrB2D,EAiBiCyJ,GAhB5C5Q,MAAMC,QAAQkH,GACVqzB,KAAKC,UAAUtzB,GAEnBA,aAAiBmpE,IACb,QAEJnpE,aAAiBopE,IACb,QAEa,iBAAVppE,EACHqzB,KAAKC,UAAUtzB,GAEhB6d,OAAO7d,IAI8C,SAAAsJ,EAAQ,CAAE+/D,MAAA1wE,IAjBvE,IAAgBqH,CAkBhB,CDfQspE,CAAW,YAAajtE,EAAKoN,EAAMH,EAC3C,CEkBM,SAAUigE,GAAiBltE,GAChC,GCvBK,SAAuBA,GAC5B,OAAOA,GAAS,iBAAmB,gBAAkBA,CACtD,CAFM,CDuBYA,GAChB,MAAM6sE,GAAe7sE,EExBA,WF2BtB,OAAOA,EAAMhD,UACd,CGhBM,SAAUmwE,GAAYntE,EAAeoN,GAC1C,GAAIpN,EAAQ,EACX,OAAQmtE,IAAantE,EAAOoN,GAG7B,IAAMH,EAAe2B,KAAK+U,IAAI,GAAIvW,GAGlC,GAFsBwB,KAAKC,IAAM7O,EAAQiN,EAAgB,EAAK,IAAOuB,OAAO4+D,QAEzD,CAElB,IAAM9wE,EAAesS,KAAK2Q,MAAMvf,EAAQiN,GACxC,OAAQ3Q,EAAe,GAAM,EAAIA,EAAeA,EAAe,GAAK2Q,CAAA,CAIpE,OAAO2B,KAAKwU,MAAMpjB,EAAQiN,GAAgBA,CAE5C,CCSM,SAAUogE,GAAiBrtE,GAChC,IAAMoN,EAAe+/D,GAAYntE,EAAO,GACxC,GAAI4O,KAAK2Q,MAAM3Q,KAAKC,IAAIzB,IAAepQ,WAAWX,OAAS,GAC1D,MAAMwwE,GAAe7sE,ECzCA,WD2CtB,IAAMiN,EAAcG,EAAapQ,WACjC,OAAOiQ,EAAYoW,SAAS,KAAOpW,EAAiBA,EAAe,IACpE,CErBM,SAAUqgE,GAAettE,GAC9B,ICvB2BoN,EDuBrBH,GCvBqBG,EDuBDpN,GCtBZ0sE,aAAet/D,EAAOpQ,WAAW0Z,MAAM,GAAI,GDuBzD,QAAI,yCAAyC7U,KAAKoL,GACjD,MAAM4/D,GAAe5/D,EE3BF,SF6BpB,OAAOA,CACR,CGQM,SAAUsgE,GAAkBvtE,GACjC,cAAeA,GACd,IAAK,SACJ,IAAK8K,EAAgB9K,GACpB,MAAM6sE,GAAe7sE,EAAO2sE,IAG7B,OAAIn+D,OAAOg/D,UAAUxtE,GACbktE,GAAiBltE,GAElBqtE,GAAiBrtE,GACzB,IAAK,SACJ,OCtBG,SAA0BA,GAC/B,GAAI4sE,GAAa/qE,KAAK7B,GACrB,MAAM6sE,GAAe7sE,EC9BD,UDiCrB,UAAWA,EAAMwC,QAAQ,MAAK,QAAUA,QAAQ,KAAI,OAAQ,GAC7D,CANM,CDsBoBxC,GACxB,IAAK,SACJ,OAAOstE,GAAettE,GACvB,IAAK,UACJ,OGnCG,SAA2BA,GAChC,GAAqB,kBAAVA,EACV,MAAM6sE,GAAe7sE,ECrBA,WDuBtB,OAAOA,EAAQ,KAAO,IACvB,CALM,CHmCqBA,GACzB,IAAK,SACJ,GAAIA,aAAiB6X,KACpB,OK/CE,SAAwB7X,GAC7B,MAAW,IAAAktE,GAAiBltE,EAAM8X,UAAY,IAC/C,CAFM,CL+CmB9X,GAEtB,GAAIA,aAAiB2W,WACpB,OMhCE,SAAgC3W,GACrC,QAAImrD,YAAYsiB,OAAOztE,GACtB,MAAM6sE,GAAe7sE,EC9BF,iBDgCpB,MAAW,KEtBiBoN,EFsBJpN,EErBjBqH,KAAKma,OAAOC,aAAYC,MAAnBF,OAAuBpU,IFqBL,KEtBzB,IAAuBA,CFuB7B,CN2BWsgE,CAAsB1tE,GAE9B,GAAIA,aAAiBysE,GACpB,OAAOa,GAAettE,GAExB,QAEC,MAAM6sE,GAAe7sE,EAAO2sE,IAE/B,CS/CM,SAAUgB,GAAa3tE,GAC5B,QAAI,yBAAyB6B,KAAK7B,GACjC,MAAM6sE,GAAe7sE,ECxBJ,OD0BlB,OAAOA,CACR,CEAM,SAAU4tE,GAAgB5tE,GAC/B,OAAc,MAAVA,EACI,GAGDlD,OAAO+wE,QAAQ7tE,GACpB6lB,KAAI,SAAA7lB,GAAiB,IAAfoN,EAAGpN,EAAA,GAAEiN,EAAKjN,EAAA,GAChB,WAAIiN,EACH,IAAW0gE,GAAavgE,GAGd,IAAAugE,GAAavgE,GAAA,IAAQmgE,GAAkBtgE,EACnD,IACCsB,KAAK,GACR,CCtBM,SAAUu/D,GAAc9tE,GAC7B,OAAIA,aAAiBwsE,GACpB,GAAUe,GAAkBvtE,EAAM8H,OAAS8lE,GAAgB5tE,EAAMmI,QAG1DolE,GAAkBvtE,EAE3B,CCfO,ICND+tE,GAAY,SAAC/tE,GAAgB,OAAK4O,KAAKwU,MAAMpjB,EAAgB,EAO7DguE,GAAY,SAAChuE,GAAgB,OAAwC,IAAnC+tE,GAAU/tE,EAAkB,IAAU,EASjEiuE,GAAgD,CAI5DxwC,GAAIswC,GAKJ1pE,EAAG0pE,GAKHG,GAAIF,GAKJG,GAAIH,GAKJI,IAAKJ,GAKLK,IA5CiB,SAACruE,EAAkBoN,GAIpC,OAHW,MAAPA,GAAAA,EAASkhE,UACZtuE,ECGI,SAA4BA,EAAaoN,GAC9C,IAAMH,EAAK,IAAImb,IAAIpoB,GACb1D,EAAO,IAAI8rB,IAAIhb,GAErB,GAAIH,EAAGshE,SAAWjyE,EAAKiyE,OACtB,OAAOvuE,EAOR,IAJA,IAAM2D,EAASsJ,EAAGnK,SAASuL,MAAM,KAAKqI,MAAM,GACtCxa,EAAWI,EAAKwG,SAASuL,MAAM,KAAKqI,MAAM,GAAI,GAG7C/S,EAAO,KAAOzH,EAAS,IAC7ByH,EAAO4iB,QACPrqB,EAASqqB,QAIV,KAAOrqB,EAASG,QACfH,EAASqqB,QACT5iB,EAAOwsB,QAAQ,MAGhB,OAAOxsB,EAAO4K,KAAK,IACpB,CAxBM,CDHsBvO,EAAiBoN,EAAQkhE,UAE7CnnE,mBAAmBnH,EAC3B,EA4CCwuE,IAAKR,GAKLS,GAAIV,IE3CC,SAAUW,GAAW1uE,EAAYoN,GACtC,gBADsCA,IAAAA,EAA6B,IAC9DpN,ECLA,SAAuBA,EAA+CoN,GAC3E,OCiCK,SAAwBpN,EAA8CoN,GAA+C,IAAAH,EAC1H,YAD2EG,IAAAA,EAA2B,CAAEuhE,YAAA,IACpF,iBAAT3uE,EACV,MAAM6sE,GAAe7sE,ECjDH,QDoDnB,IAAM1D,EAAU0D,aAAgB8sE,IAAM9sE,EAAK6tE,UAAY/wE,OAAO+wE,QAAQ7tE,GAChE2D,EAAqB,OAAAsJ,EAAAG,IAAAH,EAAS0hE,WAAa,IAAM,GAEvD,OAAOnyE,MAAMojB,KAAKtjB,GAChBupB,KAAI,SAAA7lB,GAAgB,IAAdoN,EAAGpN,EAAA,GAAEiN,EAAIjN,EAAA,GACXiN,aAAgBu/D,IAAW,IAC9Bv/D,EAAO,IAAIu/D,GAAOv/D,IAEnB,IElCgC3Q,EFkC5BqH,EAASgqE,GAAavgE,GAa1B,WAZIH,EAAKnF,MACRnE,GAAUiqE,GAAgB3gE,EAAK9E,SAG/BxE,GAAU,IACNnH,MAAMC,QAAQwQ,EAAKnF,OACtBnE,GExCJ,KADkCrH,EFyCD2Q,GExChBnF,MAAM+d,IAAIioD,IAAev/D,KAAK,KAAQ,IAAAq/D,GAAgBtxE,EAAM6L,QF2CzExE,GAAUmqE,GAAc7gE,IAGnBtJ,CACP,IACA4K,KAAI,IAAK5K,EACZ,CD9DQirE,CAAc5uE,EAAOoN,EAC7B,CAFM,CIOA,SAAsBpN,EAA8BoN,GACzD,IAAMH,EAAgB,GAEtB,GAAW,MAAPjN,GAA8B,iBAARA,EACzB,OAAOiN,EAGR,IAAM3Q,EAAOQ,OAAOP,KAAKyD,GAAKirC,OACxBtnC,EAAakK,EAAc,CAAE,EAAEogE,GAAuB,MAAP7gE,OAAA,EAAAA,EAASyhE,YACxD3yE,EAAS,MAAAkR,OAAA,EAAAA,EAASiK,OAoCxB,OAlCA/a,EAAKoN,SAAQ,SAAApN,GACZ,GAAI,MAAAJ,IAAAA,EAASI,GAAb,CAIA,IAAI4Q,EAAQlN,EAAI1D,GAEVuR,EAAYlK,EAAWrH,GACzBuR,IACHX,EAAQW,EAAUX,EAAOE,IAId,MAAR9Q,GAAyB,IAAV4Q,GAKR,MAAP5Q,GAAyB,IAAV4Q,GC/CE,SAAClN,GACvB,MAAqB,iBAAVA,EACH8K,EAAgB9K,GAGR,MAATA,GAA2B,KAAVA,IAAA,IAAgBA,CACzC,CD8CO8uE,CAAQ5hE,KR3Ca,SAAClN,GAAW,MAC/B,OAARA,GAAwB,OAARA,GAAwB,OAARA,CAAY,CQ8CvC+uE,CAAazyE,IAAyB,iBAAV4Q,IAC/BA,EAAQ,IAAIu/D,GAAQv/D,IAGrBD,EAAQ3Q,GAAc4Q,EAAA,CACvB,IAEOD,CACR,CA9CM,CLE2BjN,EAAMoN,GAAUS,EAAc,CAAE8gE,YAAA,GAAqBvhE,IAH7E,EAIT,COhBO,ICHD4hE,GAAQ,cCuBd,IAIqBC,GAAc,WAcjC,SAAAjvE,EAAYA,GAAU,IAAAoN,EAAA,UAbd0kB,SAAA,EAAG,KACH/rB,YAAA,EAAM,KACNyxB,WAAA,EAAK,KACL03C,SAAA,EAAG,KACHC,SAAA,EAAG,KACHC,YAAA,EAA2B,KAC3BC,iBAAA,EAAW,KACXC,aAAA,EAA4B,KAC5BC,SAAA,EAAwB,KACxBv2D,WAAA,EAAyB,KACzBw2D,iBAAA,EAA4B,KAC5BhkB,iBAAA,EAAW,KAwEXikB,UAAY,WACdriE,EAAKkiE,cACPliE,EAAKmiE,SAAA,GAGPniE,EAAK4L,WAAA,CAAY,EAClB,KAEO02D,UAAY,WACbtiE,EAAKkiE,cACRliE,EAAKkiE,aAAA,GAGPliE,EAAK4L,WAAA,CAAY,EA4DnB,KAGQ22D,kBAAoB,SAAC3vE,GAC3B,IACEoN,EAAKsU,MAAM1hB,EAAS,CAClB2oB,GAAIyiD,GAAeI,SACnBoE,IAAKxiE,EAAKkiE,aAEb,CAAC,MAAOtvE,GACPkW,EAAOzJ,KAAK,yCAA0CzM,EACxD,GAGF,KAGQ6vE,kBAAoB,SAAC7vE,GAC3B,IACE,IAAMiN,EAAWjN,EAAQk+B,KACnB5hC,EAAQ8Q,EAAK0kB,IAAI7D,OAAOhhB,EAASsN,OACjC5W,EAAKyJ,EAAK0iE,cAAc7iE,GACxB/Q,EAAa,CACjBmI,EAAuB,IAApB4I,EAAS+K,SACZ2Q,GAAAhlB,GAIAA,IAAOynE,GAAeK,OACtB9nE,IAAOynE,GAAev8C,OACtBlrB,GAAMynE,GAAeM,QAErBxvE,EAAKuhC,GAAKnhC,EAAM+xB,QAAU,IAC1BnyB,EAAKuyE,GAAKrhE,EAAK2iE,gBAAgBpsE,GAAM,IACrCzH,EAAKgyE,GAAK9gE,EAAK4iE,gBAAgBrsE,IAGjCyJ,EAAKsU,MAAM1hB,EAAS9D,EACrB,CAAC,MAAO8D,GACPkW,EAAOzJ,KAAK,wCAAyCzM,EACvD,GAtLAsW,KAAKwb,IAAM9xB,EACX,IAAMiN,EAAUqJ,KAAKvQ,OAAS/F,EAAI+F,OAC1BzJ,EAAS2Q,EAATgjE,KAEI,MAAR3zE,IACF2Q,EAAO2lB,QAAUtc,KAAK45D,uBACtBjjE,EAAO6+B,QAAUx1B,KAAK65D,uBAEtB75D,KAAK44D,IAAM5yE,EAAKstE,WC7ChB,WACL,IACC,OAAOh7B,OAAOwhC,YACd,CACA,MAAM9zE,GACN,IACC,IAAM0D,EAAMooB,IAAIuiC,gBAAgB,IAAID,MAC9Bt9C,EAAOpN,EAAIhD,WAEjB,OADAorB,IAAI6iC,gBAAgBjrD,GACboN,EAAKsJ,MAAMtJ,EAAKgB,YAAY,KAAO,EAC1C,CACA,MAAMpO,GACN,IAAIiN,GAAK,IAAI4K,MAAOC,UAMpB,MALa,uCAAuCtV,QAAQ,SAAS,SAACxC,GACrE,IAAMoN,GAAKH,EAAqB,GAAhB2B,KAAKyhE,UAAiB,GAAK,EAE3C,OADApjE,EAAK2B,KAAK2Q,MAAMtS,EAAK,KACR,KAALjN,EAAWoN,EAAS,EAAJA,EAAU,GAAMpQ,SAAS,GAClD,KAIH,CArBM,GD8CAsZ,KAAK64D,IAAM7yE,EAAKg0E,UAChBh6D,KAAK84D,YAAA,IAAa9yE,EAAK8yE,WACvB94D,KAAK+4D,YAAc/yE,EAAK+yE,YACxB/4D,KAAK0b,oBAET,CAAC,IAAA5kB,EAAApN,EAAAjD,UAwUA,OAxUAqQ,EAEO4kB,kBAAR,WACE,IAAMhyB,EAAMsW,KAAKwb,IACjB9xB,EAAIoyB,GAAGpjB,EAAOE,eAAgBoH,KAAKshB,gBAAiBthB,MACpDtW,EAAIoyB,GAAGpjB,EAAOI,eAAgBkH,KAAKixD,gBAAiBjxD,MACpDtW,EAAIoyB,GAAGpjB,EAAOO,eAAgB+G,KAAKi2C,gBAAiBj2C,KAAA,EACrDlJ,EAEOqlB,oBAAR,WACE,IAAMzyB,EAAMsW,KAAKwb,IACjB9xB,EAAI0yB,IAAI1jB,EAAOE,eAAgBoH,KAAKshB,gBAAiBthB,MACrDtW,EAAI0yB,IAAI1jB,EAAOI,eAAgBkH,KAAKixD,gBAAiBjxD,MACrDtW,EAAI0yB,IAAI1jB,EAAOO,eAAgB+G,KAAKi2C,gBAAiBj2C,KAAA,EACtDlJ,EAED2lB,QAAA,WACEzc,KAAKmc,sBACLnc,KAAKixD,kBAGLjxD,KAAKwb,IAAMxb,KAAKvQ,OAASuQ,KAAKk5D,YAAcl5D,KAAKk1C,YAAc,KAE/Dl1C,KAAKm5D,UAAYn5D,KAAKo5D,UAAY,MACnCtiE,EAEOwqB,gBAAR,SACE53B,EACAoN,GAEAkJ,KAAKkhB,MAAQpqB,EAAKoqB,MAClBlhB,KAAKkhB,MAAMxtB,iBAAiB,UAAWsM,KAAKm5D,WAC5Cn5D,KAAKkhB,MAAMxtB,iBAAiB,UAAWsM,KAAKo5D,UAAA,EAC7CtiE,EAEOm6D,gBAAR,WACOjxD,KAAKkhB,QAIVlhB,KAAKkhB,MAAM5wB,oBAAoB,UAAW0P,KAAKm5D,WAC/Cn5D,KAAKkhB,MAAM5wB,oBAAoB,UAAW0P,KAAKo5D,WAG/Cp5D,KAAKkhB,MAAQ,OACdpqB,EAEOm/C,gBAAR,SACEvsD,EACAoN,GACA,IAAAH,EAAA3Q,EACAga,KAAKk5D,YAAc,OAAHviE,EAAGG,EAAKy1B,OAAOvmB,YAAA,EAAZrP,EAAmBoU,OACtC/K,KAAKk1C,YAAc,OAAHlvD,EAAG8Q,EAAKy1B,OAAOtmB,YAAA,EAAZjgB,EAAmB+kB,MAAA,EAmBxCjU,EAGQmjE,WAAR,WAA2B,IAAAvwE,EACzB,MAAO,CACLqlB,EAAG,EACHmrD,GAAInF,GAAoBY,IACxBiD,IAAK54D,KAAK44D,IACVC,IAAK74D,KAAK64D,IACVtyC,GAAc,OAAZ78B,EAAEsW,KAAKkhB,YAAA,EAALx3B,EAAY65B,aAChBu0C,IAAK93D,KAAKwb,IAAI2+C,kBAAoB,IAEtC,EAEArjE,EAGQsU,MAAR,SAAc1hB,EAAwBoN,QAAA,IAAAA,IAAAA,EAAa,CAAC,GAElDS,EAAcT,EAAMkJ,KAAKi6D,cAEzB,IAAMtjE,EACJG,EAAKub,KAAOyiD,GAAeO,MAC3Bv+D,EAAKub,KAAOyiD,GAAeK,OAC3Br+D,EAAKub,KAAOyiD,GAAeM,MAEzBp1D,KAAKi5D,SAAWtiE,IAClBG,EAAK+/D,IAAA,EACL//D,EAAKwiE,IAAA,EACLt5D,KAAKi5D,SAAA,GAGQ,MAAXniE,EAAKwiE,KACPxiE,EAAKwiE,GAAKt5D,KAAK0C,WAKjB,IAAQ1c,EAAgBga,KAAhB+4D,YACJ/yE,IACF8Q,EAAOtQ,OAAOP,KAAK6Q,GAAM8f,QAAO,SAACltB,EAAKiN,GAEpC,OADA3Q,EAAY+mB,SAASpW,KAASjN,EAAIiN,GAAOG,EAAKH,IACvCjN,CACR,GAAE,CAAE,IAGHsW,KAAK84D,YACFpvE,EAAQsG,UACXtG,EAAQsG,QAAU,CAAC,GElKrB,SAA4BtG,EAAiCoN,EAAYH,GACvEY,EAAc7N,ECChB,SAAwBA,EAAYoN,GAA+B,IAAAH,EACxE,YADyCG,IAAAA,EAA6B,KACjEpN,EACJ,MAAO,GAGR,IAAM1D,EAAUQ,OAAO+wE,QAAQ7tE,GACzB2D,EAAY7G,OAAO+wE,QAAQtB,IAC/B3sE,OAAO9C,OAAO+wE,SAAe,OAAP5gE,EAAAG,QAAA,EAAAH,EAASyjE,kBAAmB,CAAE,IAChDx0E,EAASI,EAAQ4wB,QAAO,SAACltB,EAAKoN,GAAS,IAAAH,EACrC3Q,EAAc8Q,EAAiC,GAA1ClR,EAASkR,EAAiC,GAChDF,GAAuD,OAA/CD,EAAAtJ,EAAUgtE,MAAK,SAAA3wE,GAAK,OAAIA,EAAM,GAAGqjB,SAAS/mB,EAAA,YAA1C2Q,EAAkD,KAAyBq+D,GAAgBc,QAGzG,OAFU,MAAVpsE,EAAIkN,KAAJlN,EAAIkN,GAAW,IACflN,EAAIkN,GAAO5Q,GAAcJ,EAClB8D,CACP,GAAE,CAAmC,GAEtC,OAAOlD,OAAO+wE,QAAQ3xE,GACpBgxB,QAAO,SAACltB,EAAGiN,GAAoB,IAAjB3Q,EAAK2Q,EAAA,GAAEtJ,EAAKsJ,EAAA,GAE1B,OADAjN,EAAI1D,GAA4BoyE,GAAW/qE,EAAOyJ,GAC3CpN,CACP,GAAE,CAAqC,EAC1C,CArBM,CDDuCoN,EAAMH,GACnD,CFmKM2jE,CAAkB5wE,EAAQsG,QAAS8G,IAEnCpN,EAAQoC,IDrKR,SAA0BpC,EAAaoN,EAAYH,GAIxD,IAAM3Q,EKND,SAAsB0D,EAAYoN,GACvC,YADuCA,IAAAA,EAA6B,KAC/DpN,EACJ,MAAO,GAGR,IAAMiN,EAASyhE,GAAW1uE,EAAMoN,GAEhC,MAAUyjE,QAAc1pE,mBAAmB8F,EAC5C,CARM,CLMqBG,EAAMH,GAChC,IAAK3Q,EACJ,OAAO0D,EAGR,GAAIgvE,GAAMntE,KAAK7B,GACd,OAAOA,EAAIwC,QAAQwsE,GAAO1yE,GAG3B,IAAMqH,EAAY3D,EAAIqjB,SAAS,KAAO,IAAM,IAC5C,SAAUrjB,EAAM2D,EAAYrH,CAC7B,CCsJoBw0E,CAAgB9wE,EAAQoC,IAAKgL,EAAA,EA+C/CA,EAGQ0iE,cAAR,SAAsB9vE,GACpB,IAAQoN,EAASpN,EAAT/B,KAER,MAAa,aAATmP,EACKg+D,GAAeS,WAGJ,gBAAhB7rE,EAASma,GACJixD,GAAeO,KAGX,UAATv+D,EACKg+D,GAAev8C,MAGX,SAATzhB,EACGkJ,KAAKwb,IAAI0B,YAAYn3B,OAInB+uE,GAAeK,MAHbL,GAAeM,WAAA,CAO5B,EAEAt+D,EAGQ2iE,gBAAR,SAAwB/vE,GACtB,IACIoN,EADAH,EAAkB,EAEhB3Q,EAAMga,KAAKwb,IAEjB,GAAI9xB,IAASorE,GAAev8C,MAC1BzhB,EAAS9Q,EAAIk3B,gBACR,CACL,IAAM7vB,EAAMrH,EAAIyiC,aACV7iC,EAAMyH,GAAO,EAAIA,EAAM,EAAIrH,EAAI2xB,OAAO5xB,OAC5C+Q,EAAS9Q,EAAI2xB,OAAOvX,MAAM,EAAGxa,EAC/B,CAEA,IAAK,IAAqBgR,EAA1BW,4sBAAAzJ,CAAoBgJ,KAAMF,EAAAW,KAAArH,MAAE,KAAjB/C,EAAKyJ,EAAApF,MACVrE,EAAM4qB,QAAUphB,IAClBA,EAAUxJ,EAAM4qB,QAEpB,CAEA,OAAOphB,EAAU,EAAIA,EAAU0mC,GACjC,EAEAvmC,EAGQ4iE,gBAAR,SAAwBhwE,GACtB,IAAMoN,EAAQkJ,KAAKwb,IAAI0F,MACjBvqB,EACJjN,IAASorE,GAAev8C,MAAQvY,KAAKk5D,YAAcl5D,KAAKk1C,YAE1D,OAAKv+C,GAAWG,EAUE,IANLu9B,GAAaG,WACxB79B,EACAG,EAAM4rB,YACN1iB,KAAKvQ,OAAOssC,eAGF9R,IATHoT,GAUX,EAEAvmC,EAGQ8iE,qBAAR,WACE,IAAQlwE,EAAYsW,KAAKvQ,OAAjB6sB,QACFxlB,EAAQkJ,KAAKq5D,kBACb1iE,EAAOjN,GAAYsW,KAAKvQ,OAAOsU,OAErC,OAAO,WAGL,SAAAra,EAAYA,GAAmB,KAFvBqa,YAAA,EAGN/D,KAAK+D,OAAS,IAAIpN,EAAKjN,EACzB,CAAC,IAAA1D,EAAA0D,EAAAjD,UAQA,OARAT,EAUDy2B,QAAA,WACEzc,KAAK+D,OAAO0Y,SAAA,EACbz2B,EAED8N,MAAA,WACEkM,KAAK+D,OAAOjQ,OAAA,EACb9N,EAED02B,KAAA,SACEhzB,EACAiN,EACA3Q,GAEA8Q,EAAMpN,GACNsW,KAAK+D,OAAO2Y,KAAKhzB,EAASiN,EAAQ3Q,EAAA,EACnC4Q,EAAAlN,EAAA,EAAA7C,IAAA,QAAAia,IAvBD,WACE,OAAOd,KAAK+D,OAAOW,KACrB,GAAC,CAAA7d,IAAA,UAAAia,IAED,WACE,OAAOd,KAAK+D,OAAO7Z,OACrB,KAACR,CAAA,CAbI,EAgCT,EAEAoN,EAGQ+iE,qBAAR,WACE,IAAQnwE,EAAYsW,KAAKvQ,OAAjB+lC,QACF1+B,EAAQkJ,KAAKu5D,kBACb5iE,EAAOjN,GAAYsW,KAAKvQ,OAAOsU,OAErC,OAAO,WAGL,SAAAra,EAAYA,GAAmB,KAFvBqa,YAAA,EAGN/D,KAAK+D,OAAS,IAAIpN,EAAKjN,EACzB,CAAC,IAAA1D,EAAA0D,EAAAjD,UAQA,OARAT,EAUDy2B,QAAA,WACEzc,KAAK+D,OAAO0Y,SAAA,EACbz2B,EAED8N,MAAA,WACEkM,KAAK+D,OAAOjQ,OAAA,EACb9N,EAED02B,KAAA,SACEhzB,EACAiN,EACA3Q,GAEA8Q,EAAMpN,GACNsW,KAAK+D,OAAO2Y,KAAKhzB,EAASiN,EAAQ3Q,EAAA,EACnC4Q,EAAAlN,EAAA,EAAA7C,IAAA,QAAAia,IAvBD,WACE,OAAOd,KAAK+D,OAAOW,KACrB,GAAC,CAAA7d,IAAA,UAAAia,IAED,WACE,OAAOd,KAAK+D,OAAO7Z,OACrB,KAACR,CAAA,CAbI,EAAP,EAgCDA,CAAA,CArWgC,GKmBd+wE,GAAyB,WAiB5C,SAAA/wE,EAAYA,GAAU,KAhBL8xB,SAAA,EAAG,KACZjc,SAAA,EAAG,KACHwE,OAAuC,KAAI,KAC3C0M,IAAqB,KAAI,KACzB2H,UAAoB,IAAG,KACvBsiD,gBAAmC,KAAI,KACvCC,WAAqB,IAAG,KACxBC,aAAuB,EAAC,KACxB5zD,QAAkB,EAAC,KACnB6zD,SAAA,EAAwB,KACxBlR,SAAA,EAAuB,KACvBhyC,OAAyB,KAAI,KAC7BuF,YAAsC,KAAI,KAC1CC,eAAyC,KAAI,KAC7C29C,kBAAqD,CAAC,EAG5D96D,KAAKwb,IAAM9xB,EACXsW,KAAKT,IAAMK,EAAOL,IAAI3V,KAAKgW,EAAM,uBACjCI,KAAK0b,mBACP,CAAC,IAAA5kB,EAAApN,EAAAjD,UAgdA,OAhdAqQ,EAEO4kB,kBAAR,WACE,IAAMhyB,EAAMsW,KAAKwb,IACjB9xB,EAAIoyB,GAAGpjB,EAAOa,iBAAkByG,KAAK+b,kBAAmB/b,MACxDtW,EAAIoyB,GAAGpjB,EAAOc,gBAAiBwG,KAAKi7B,iBAAkBj7B,MACtDtW,EAAIoyB,GAAGpjB,EAAOe,gBAAiBuG,KAAKy3C,iBAAkBz3C,MACtDtW,EAAIoyB,GAAGpjB,EAAOkD,MAAOoE,KAAKke,QAASle,KAAA,EACpClJ,EAEOqlB,oBAAR,WACE,IAAMzyB,EAAMsW,KAAKwb,IACZ9xB,IAGLA,EAAI0yB,IAAI1jB,EAAOa,iBAAkByG,KAAK+b,kBAAmB/b,MACzDtW,EAAI0yB,IAAI1jB,EAAOc,gBAAiBwG,KAAKi7B,iBAAkBj7B,MACvDtW,EAAI0yB,IAAI1jB,EAAOe,gBAAiBuG,KAAKy3C,iBAAkBz3C,MACvDtW,EAAI0yB,IAAI1jB,EAAOkD,MAAOoE,KAAKke,QAASle,MAAA,EACrClJ,EAED6kB,UAAA,WAGE,GAFA3b,KAAK66D,SAAA,EACL76D,KAAKwpB,eACDxpB,KAAK2pD,SAAW3pD,KAAKyQ,IAAK,CAC5B,GAAIzQ,KAAKgH,QAAS,CAChB,IAAMtd,EAAwB,IAAlBsW,KAAK26D,YAAqB78C,YAAY1U,MAAQpJ,KAAKgH,SAC/D,GAAItd,EAAM,EAER,YADAsW,KAAK+6D,gBAAgB/6D,KAAKyQ,IAAK/mB,EAGnC,CACAsW,KAAKg7D,qBAAqBh7D,KAAKyQ,IACjC,GACD3Z,EAED8kB,SAAA,WACE5b,KAAK66D,SAAA,EACD76D,KAAK+D,SACP/D,KAAK+D,OAAO0Y,UACZzc,KAAK+D,OAAS,MAEhB/D,KAAKwpB,cAAA,EACN1yB,EAED0yB,aAAA,YAC4B,IAAtBxpB,KAAK46D,cACPl7D,KAAK8pB,aAAaxpB,KAAK46D,aACvB56D,KAAK46D,aAAe,IAEvB9jE,EAED2lB,QAAA,WACEzc,KAAKmc,sBACLnc,KAAK4b,WAEL5b,KAAKwb,IAAM,KACXxb,KAAK2X,OAAS3X,KAAKkd,YAAcld,KAAKmd,eAAiB,MACxDrmB,EAEDo6B,YAAA,SAAYxnC,GACV,IAAMoN,EAASkJ,KAAK2X,OAChB7gB,IACFkJ,KAAK2X,OAAS7gB,EAAOiK,QAAO,SAACjK,GAAK,OAAKA,IAAUpN,CAAA,MAEpDoN,EAEOilB,kBAAR,WACE/b,KAAK4b,WACL5b,KAAK2pD,SAAA,EACL3pD,KAAK26D,WAAa,IAClB36D,KAAKgH,QAAU,EACfhH,KAAKyQ,IAAM,KACXzQ,KAAKoY,UAAY,IACjBpY,KAAK2X,OAAS3X,KAAKkd,YAAcld,KAAKmd,eAAiB,MACxDrmB,EAEOmkC,iBAAR,SACEvxC,EACAoN,GAEA,IAAQH,EAAoBG,EAApB4gB,gBACgB,OAApB/gB,IAGJqJ,KAAKoY,UAAYzhB,EAAgByhB,UACjCpY,KAAKyQ,IAAM9Z,EAAgB8Z,IACvBzQ,KAAK66D,SACP76D,KAAK2b,YAAA,EAER7kB,EAEO2gD,iBAAR,SACE/tD,EACAoN,GAEAkJ,KAAKkd,YAAcpmB,EAAKomB,YACxBld,KAAKmd,eAAiBrmB,EAAKqmB,cAAA,EAC5BrmB,EAEOonB,QAAR,SAAgBx0B,EAAqBoN,GACnC,IAAQH,EAAgBG,EAAhB4wB,YACR,G/G3JgC,K+G4JnB,MAAX/wB,OAAA,EAAAA,EAAakxB,S/GnJe,I+GoJ5BlxB,EAAYrQ,MACZ,CACA,IAAMN,EAASga,KAAK2X,OAChBtqB,EAAkB2S,KAAK06D,gBACvB90E,EAAeoa,KAAKoY,UACxB,GAAIthB,EAAK5M,QAAS,CAChB,IAAA0M,EAAqCE,EAAK5M,QAAlCqN,EAAOX,EAAPmiB,QAAS5rB,EAASyJ,EAATwhB,UAAW1gB,EAAId,EAAJjP,KACxB4P,GAAWvR,EACbJ,EAAeoa,KAAKi7D,qBAAqB1jE,EAASG,EAAM9R,GAC/CuH,IACTvH,EAAeuH,EAEnB,CACMvH,KAAgBoa,KAAK86D,oBACzB96D,KAAK86D,kBAAkBl1E,GAAgBk4B,YAAY1U,QAEhD/b,GAAmBrH,IAEtBqH,EAAkBrH,EAAO4wB,QAAO,SAACltB,EAAUoN,GAIzC,OAH2C,IAAvCpN,EAASyI,QAAQ2E,EAAMshB,YACzB1uB,EAAS+gB,KAAK3T,EAAMshB,WAEf1uB,CACR,GAAE,KAED2D,GAAmBA,EAAgBtH,OAAS,IAC9Cia,KAAKk7D,sBAAsB7tE,GAC3BsJ,EAAYmyB,SAAW9oB,KAAKoY,YAAcxyB,GAEvC+Q,EAAYmyB,UACflpB,EAAOzJ,KAAI,qBACYW,EAAKmmB,QACxB,MAAAnmB,EAAK5B,MAAMU,QAAO,yCACqBhQ,EACvC,aAAAI,EAASA,EAAOD,OAASC,GACX,gBAAA06B,KAAKC,UACnBtzB,GACc,eAAAqzB,KAAKC,UAAU3gB,KAAK86D,mBAG1C,GACDhkE,EAEMqkE,mBAAP,SAA0BzxE,GAExBsW,KAAK2X,OAASjuB,EACd,IAAIoN,EAAgBkJ,KAAKo7D,oBAAoBp7D,KAAKoY,WAClD,GAA6B,IAAzBthB,EAAc/Q,OAAc,CAC9B,IAAM4Q,EAAYjN,EAAO,GAAG0uB,UAC5BpY,KAAKT,IAC2B,8BAAAS,KAAKoY,UAAS,iCAAiCzhB,EAAS,KAExFG,EAAgBkJ,KAAKo7D,oBAAoBzkE,GACzCqJ,KAAKoY,UAAYzhB,CACnB,CAMA,OALIG,EAAc/Q,SAAW2D,EAAO3D,QAClCia,KAAKT,IACM,SAAAzI,EAAc/Q,OAAM,IAAI2D,EAAO3D,OAA6B,uBAAAia,KAAKoY,UAAA,KAGvEthB,CAAA,EACRA,EAEOskE,oBAAR,SAA4B1xE,GAC1B,OAAoB,OAAhBsW,KAAK2X,OACA,GAEF3X,KAAK2X,OAAO5W,QAAO,SAACjK,GAAK,OAAKpN,IAAcoN,EAAMshB,SAAA,KAC1DthB,EAEOokE,sBAAR,SAA8BxxE,GAE5B,IAAIoN,EADJkJ,KAAK06D,gBAAkBhxE,EAIvB,IAAMiN,EAAoBqJ,KAAK86D,kBACzB90E,EAAM83B,YAAY1U,MACxB5iB,OAAOP,KAAK0Q,GAAmBvD,SAAQ,SAAC1J,GAClC1D,EAAM2Q,EAAkBjN,GA7ME,YA8MrBiN,EAAkBjN,EAE7B,IACA,IAAK,IAAI2D,EAAI,EAAGA,EAAI3D,EAAgB3D,OAAQsH,IAAK,CAC/C,IAAMzH,EAAY8D,EAAgB2D,GAClC,KAAIzH,KAAa+Q,GAAjB,CAGA,GAAI/Q,IAAcoa,KAAKoY,UACrB,OAEF,IAAMxhB,EAAgBoJ,KAAKwb,IAAI0N,cACzB3xB,EAAuByI,KAAKwb,IAAI7D,OAAO/gB,GAE7C,IADAE,EAASkJ,KAAKo7D,oBAAoBx1E,IACvBG,OAAS,EAAG,CACrBia,KAAKT,IAA2B,uBAAA3Z,EAAA,KAChCoa,KAAKoY,UAAYxyB,EACjB2gC,GAA6BzvB,GAC7BkJ,KAAKwb,IAAI6C,QAAQ3lB,EAAOsB,eAAgB,CAAE2d,OAAA7gB,IAE1C,IAAM3J,EAAmB6S,KAAKwb,IAAI7D,OAAO/gB,GACrCW,GAAiBpK,GAAoB6S,KAAK2X,SAE1CxqB,EAAiB2qB,MAAM,uBACrBvgB,EAAcugB,MAAM,sBACtB3qB,EAAiB4qB,UAAYxgB,EAAcwgB,SAE3C/X,KAAKT,IAAG,yCACmChI,EAAcwgB,QAAc,OAAA5qB,EAAiB4qB,SAG1F/X,KAAKwb,IAAI0N,cAAgBtyB,GAE3B,KACF,CA3BA,CA4BF,GACDE,EAEOmkE,qBAAR,SACEvxE,EACAoN,EACAH,GAKA,IAHA,IAAM3Q,EAASga,KAAKo7D,oBAAoBzkE,GAAgBrN,OACtD0W,KAAK2X,QAAU,IAERtqB,EAAI,EAAGA,EAAIrH,EAAOD,OAAQsH,IACjC,GACGyJ,IAASkkB,IACRh1B,EAAOqH,GAAGm4B,cAAc97B,IACzBoN,IAASmkB,IACRj1B,EAAOqH,GAAGq4B,iBAAiBh8B,GAE7B,OAAO1D,EAAOqH,GAAG+qB,UAGrB,OAAOzhB,CAAA,EACRG,EAEOukE,cAAR,SAAsB3xE,GAA+B,IAAAoN,EAAA,KAC7CH,EAASqJ,KAAK2X,OACpB,GAAKhhB,EAAL,CAGA,IAAM3Q,EAA6C,CAAC,EAC9CqH,EAAgD,CAAC,EACvD3D,EAAc0J,SAAQ,SAAC1J,GACrB,IACM9D,EAGF8D,EAHF4X,GACW1K,EAETlN,EAFF,WACmB6N,EACjB7N,EADF,mBAEF,IAAIiN,EAAO2f,MAAK,SAAC5sB,GAAK,OAAKA,EAAM0uB,YAAcxyB,CAAO,IAAtD,CAGA,IAAMuH,EAAiB2J,EAAKskE,oBAAoBxkE,GAAQ2Y,KACtD,SAAC7lB,GACC,IAAMoN,EAAa,IAAIvC,EAAS7K,EAAUouB,OAC1ChhB,EAAW,cAAgBlR,EAC3B,IAAM+Q,EACJG,EAAWyhB,OAAYzhB,EAAWyhB,MAAK,UAAU3yB,EAC7CgR,EACJE,EAAW2hB,WAAgB3hB,EAAW2hB,UAAS,UAAU7yB,EACvD+Q,IACF3Q,EAAmB8Q,EAAWyhB,OAAS5hB,EACvCG,EAAWyhB,MAAQ5hB,GAEjBC,IACFvJ,EAAsByJ,EAAW2hB,WAAa7hB,EAC9CE,EAAW2hB,UAAY7hB,GAEzB,IAAMzJ,EAAMmuE,GACV5xE,EAAU+mB,IACV3Z,EAAW,qBACX,mBACAS,GAEIG,EAAc,IAAI+sB,GAAM,CAC5B3M,MAAOhhB,EACP0hB,WAAY9uB,EAAU8uB,WACtBT,QAASruB,EAAUquB,QACnB/oB,OAAQtF,EAAUsF,OAClBnH,KAAM6B,EAAU7B,KAChBiE,IAAAqB,EACA03B,WAAYn7B,EAAUm7B,WACtB91B,MAAOrF,EAAUqF,QAEnB,GAAIrF,EAAUk8B,YACZ,IAAK,IAAI53B,EAAI,EAAGA,EAAItE,EAAUk8B,YAAY7/B,OAAQiI,IAChD0J,EAAY6tB,WACV,QACG77B,EAAUk8B,YAAY53B,GAAE,UAAUpI,GAI3C,GAAI8D,EAAUo8B,eACZ,IAAK,IAAI/3B,EAAI,EAAGA,EAAIrE,EAAUo8B,eAAe//B,OAAQgI,IACnD2J,EAAY6tB,WACV,OACG77B,EAAUo8B,eAAe/3B,GAAE,UAAUnI,GAI9C,OAAO8R,CACT,IAEFf,EAAO8T,KAAIW,MAAXzU,EAAexJ,GACfouE,GACEzkE,EAAKomB,YACLl3B,EACAuR,EACA3R,GAEF21E,GACEzkE,EAAKqmB,eACL9vB,EACAkK,EACA3R,EA/DF,CAiEF,GA5EA,GA6EDkR,EAEOkkE,qBAAR,SAA6BtxE,GAAa,IAQpCoN,EARoCH,EAAA,KAClC3Q,EAASga,KAAKwb,IAAI/rB,OAClBpC,EAASrH,EAAO+d,OAClB/D,KAAK+D,QACP/D,KAAK+D,OAAO0Y,UAEdzc,KAAK+D,OAAS,IAAI1W,EAAOrH,GAGzB,IACE8Q,EAAM,IAAI4I,KAAKoS,IAAIpoB,EACpB,CAAC,MAAOoN,GAGP,OAFAkJ,KAAK2pD,SAAA,OACL3pD,KAAKT,IAA8C,0CAAA7V,EAErD,CACA,GAAqB,UAAjBoN,EAAI7K,SAAsB,CAC5B,IAAMrG,EAC4D,GAA/Doa,KAAKwb,IAAI2+C,mBAAqBn0E,EAAOqoC,wBACxCv3B,EAAIib,aAAaxO,IAAI,eAAgBvD,KAAKoY,WAC1CthB,EAAIib,aAAaxO,IAAI,kBAAmB,GAAK3d,EAC/C,CACA,IAAMgR,EAAyB,CAC7B3G,aAAc,OACdnE,IAAKgL,EAAI/K,MAGLwL,EAAavR,EAAOw1E,2BAA2B5sD,QAC/CzhB,EACJoK,EAAWwlB,YAAcxlB,EAAWulB,cAAgB,CAAC,EACjDplB,EAAoC,CACxC4lB,WAAA/lB,EACAxF,QAASwF,EAAW8lB,cACpBE,SAAUpwB,EAAyBqwB,aAAe,EAClDC,WAAYtwB,EAAyBuwB,cAAgB,EACrDC,cAAexwB,EAAyBywB,iBAAmB,GAGvD5vB,EAA4C,CAChD6vB,UAAW,SACTn0B,EACA1D,EACAqH,EACAzH,GAEA+Q,EAAK4I,IAAkC,8BAAAzI,EAAA,KACvC,IAAMF,EAAelN,EAASoG,KAC9B,GAA6B,IAAzB8G,EAAajM,QAAjB,CAIAgM,EAAKqQ,QAAU8W,YAAY1U,MAC3BzS,EAAKgkE,WAAa/jE,EAAa6kE,IAC/B,IACgBlkE,EAGZX,EAHF,cACkBzJ,EAEhByJ,EAFF,kBACoBc,EAClBd,EADF,oBAEF,GAAIW,EACF,IACEZ,EAAK8Z,IAAM,IAAI/Q,KAAKoS,IAAIva,EAAWT,GAAK/K,IACzC,CAAC,MAAOrC,GAKP,OAJAiN,EAAKgzD,SAAA,OACLhzD,EAAK4I,IAC8C,iDAAAhI,EAGrD,CAEFZ,EAAKokE,gBAAgBpkE,EAAK8Z,KAAOpjB,EAAQvB,KACrCqB,GACFwJ,EAAK0kE,cAAcluE,GAGrB,IAAMa,EAAiD,CACrD0tE,iBAAkB9kE,EAClB9K,IAAKgL,EAAIpQ,YAEXiQ,EAAK6kB,IAAI6C,QAAQ3lB,EAAOwD,yBAA0BlO,GAE9C0J,GACFf,EAAKukE,sBAAsBxjE,EA/B7B,MAFEf,EAAK4I,IAAG,oBAAqB3I,EAAajM,QAAA,kBAmC7C,EAEDuzB,QAAS,SACPx0B,EACAoN,EACA9Q,EACAqH,GAMA,GAJAsJ,EAAK4I,IACiC,oCAAA7V,EAAMm1B,KAAI,IAAIn1B,EAAM+jB,KAAS,KAAA3W,EAAQhL,IAAA,KAE3E6K,EAAKilB,WACc,MAAflyB,EAAMm1B,KAGR,OAFAloB,EAAKgzD,SAAA,OACLhzD,EAAK4I,IAAG,qBAAsBzI,EAAQhL,IAAA,wBAGxC,IAAIlG,EAAwB,IAAlB+Q,EAAKgkE,WACf,GAAmB,MAAfjxE,EAAMm1B,KAWVloB,EAAKokE,gBAAgBpkE,EAAK8Z,KAAO3Z,EAAQhL,IAAKlG,OAX9C,CACE,IAAMgR,EAASD,EAAKoN,OACpB,GAAyC,mBAA9B,MAAAnN,OAAA,EAAAA,EAAQ+kE,mBAAkC,CACnD,IAAMpkE,EAAaX,EAAO+kE,kBAAkB,eACxCpkE,IACF3R,EAA+B,IAAzB4a,WAAWjJ,GAErB,CACAZ,EAAK4I,IAAG,qBAAsBzI,EAAQhL,IAAA,gBAExC,CAED,EAEDsyB,UAAW,SACT10B,EACAoN,EACA9Q,GAEA2Q,EAAK4I,IAAG,sCAAuCzI,EAAQhL,IAAA,KACvD6K,EAAKokE,gBAAgBpkE,EAAK8Z,KAAO3Z,EAAQhL,IAC3C,GAGFkU,KAAKT,IAAqC,iCAAAzI,GAC1CkJ,KAAK+D,OAAO2Y,KAAK9lB,EAASc,EAAc1J,EAAA,EACzC8I,EAEOikE,gBAAR,SAAwBrxE,EAAaoN,GAAwC,IAAAH,EAAA,cAAxCG,IAAAA,EAAkC,IAAlBkJ,KAAK26D,YACxD36D,KAAKwpB,eACLxpB,KAAK46D,YAAcl7D,KAAKtN,YAAW,WAAM,IAAA0E,EACjC9Q,EAAgB,OAAX8Q,EAAGH,EAAK6kB,UAAA,EAAL1kB,EAAUoqB,OACpBl7B,GAAUA,EAAM61C,MAIpBllC,EAAKokE,gBAAgBrxE,EAAuB,IAAlBiN,EAAKgkE,YAH7BhkE,EAAKqkE,qBAAqBtxE,EAI7B,GAAEoN,EAAA,EACJpN,CAAA,CAre2C,GAwe9C,SAAS6xE,GACP7xE,EACAoN,EACAH,EACA3Q,GAEK0D,GAGLlD,OAAOP,KAAK6Q,GAAe1D,SAAQ,SAAC/F,GAClC,IAAMzH,EAAe8D,EAClBqX,QAAO,SAACrX,GAAK,OAAKA,EAAMqvB,UAAY1rB,CAAY,IAChDkiB,KAAI,SAAC7lB,GACJ,IAAM9D,EAAc2R,EAAc,CAAE,EAAE7N,GAYtC,OAXA9D,EAAYq3B,aAAA,EACZr3B,EAAYkyB,MAAQ,IAAIvjB,EAAS3O,EAAYkyB,OAC7ClyB,EAAYkG,IAAMlG,EAAYkyB,MAAMqB,IAAMmiD,GACxC5xE,EAAMoC,IACNpC,EAAMouB,MAAM,uBACZ,qBACAnhB,GAEF/Q,EAAYmzB,QAAUnzB,EAAYkyB,MAAM,YACtChhB,EAAczJ,GAChBzH,EAAYkyB,MAAM,cAAgB9xB,EAC3BJ,CACT,IACF8D,EAAO+gB,KAAIW,MAAX1hB,EAAe9D,EACjB,GACF,CAEA,SAAS01E,GACP5xE,EACAoN,EACAH,EACA3Q,GAEA,IAKIqH,EAJIzH,EAGJI,EAHF41E,KACQhlE,EAEN5Q,EAFF61E,OACgBtkE,EACdvR,EADD2Q,GAGCG,IACFzJ,EAA6B,MAAbkK,OAAA,EAAAA,EAAgBT,MAE9BpN,EAAM2D,GAGV,IAAMF,EAAM,IAAIuS,KAAKoS,IAAIpoB,GAazB,OAZI9D,IAASyH,IACXF,EAAIhB,KAAOvG,GAETgR,GACFpQ,OAAOP,KAAK2Q,GACT+9B,OACAvhC,SAAQ,SAAC1J,GACJA,GACFyD,EAAI4kB,aAAaxO,IAAI7Z,EAAKkN,EAAOlN,GAErC,IAEGyD,EAAIpB,IACb,CC5kBA,IAAM+vE,GAAwB,uBAExBC,GAAS,WAcb,SAAAryE,EAAYA,GAAmB,KAbvBsyE,cAAA,EAAQ,KAGRC,oBAAA,EAAc,KACdC,kBAAA,EAAY,KACZz+C,gBAAA,EAAU,KACVhuB,OAAqC,KAAI,KACzC0sE,UAAmD,KAAI,KACxDjyE,QAAgC,KAAI,KAEnC6Z,OAAgC,KAAI,KACrCW,WAAA,EAGL1E,KAAKg8D,SAAWtyE,GAASA,EAAOsyE,UAAmB,KACnDh8D,KAAK0E,MAAQ,IAAI3C,EACjB/B,KAAKyd,WAAa,CACpB,CAAC,IAAA3mB,EAAApN,EAAAjD,UAkTA,OAlTAqQ,EAED2lB,QAAA,WACEzc,KAAKm8D,UAAY,KACjBn8D,KAAKo8D,gBACLp8D,KAAK+D,OAAS,KACd/D,KAAKvQ,OAAS,KACduQ,KAAK9V,QAAU,KACf8V,KAAKg8D,SAAW,MACjBllE,EAEDslE,cAAA,WACE,IAAM1yE,EAASsW,KAAK+D,OACpBrE,KAAK8pB,aAAaxpB,KAAKi8D,gBACvBv8D,KAAK8pB,aAAaxpB,KAAKk8D,cACnBxyE,IACFA,EAAOsI,mBAAqB,KAC5BtI,EAAO2yE,WAAa,KACM,IAAtB3yE,EAAOuI,aACT+N,KAAK0E,MAAM1Q,SAAA,EACXtK,EAAOoK,SAAA,EAGZgD,EAEDhD,MAAA,WAAQ,IAAApK,EACNsW,KAAKo8D,gBACD,OAAJ1yE,EAAIsW,KAAKm8D,YAALzyE,EAAgBssC,SAClBh2B,KAAKm8D,UAAUnmC,QACbh2B,KAAK0E,MACL1E,KAAK9V,QACL8V,KAAK+D,OAAA,EAGVjN,EAED4lB,KAAA,SACEhzB,EACAoN,EACAH,GAEA,GAAIqJ,KAAK0E,MAAMrC,QAAQC,MACrB,MAAM,IAAIpL,MAAM,iCAElB8I,KAAK0E,MAAMrC,QAAQC,MAAQ5C,KAAKoe,YAAY1U,MAC5CpJ,KAAK9V,QAAUR,EACfsW,KAAKvQ,OAASqH,EACdkJ,KAAKm8D,UAAYxlE,EACjBqJ,KAAKs8D,cAAA,EACNxlE,EAEDwlE,aAAA,WAAe,IAAA5yE,EAAA,KACLoN,EAAoBkJ,KAApBvQ,OAAQkH,EAAYqJ,KAAZ9V,QAChB,GAAK4M,GAAWH,EAAhB,CAGA,IAAM3Q,EAAOga,KAAK+D,OAAS,IAAIrE,KAAKlP,eAE9BnD,EAAQ2S,KAAK0E,MACnBrX,EAAMgV,QAAQE,MAAQ,EACtBlV,EAAM2U,OAAS,EACf3U,EAAM2G,SAAA,EACN,IAAMpO,EAAWoa,KAAKg8D,SAElBp2E,EACFqF,QAAQyE,UACLg9B,MAAK,WACJ,GAAIhjC,EAAKqa,SAAW/d,IAAO0D,EAAKgb,MAAM1Q,QACtC,OAAOpO,EAASI,EAAK2Q,EAAQ7K,IAC/B,IACC6gC,OAAM,SAAC71B,GACN,GAAIpN,EAAKqa,SAAW/d,IAAO0D,EAAKgb,MAAM1Q,QAEtC,OADAhO,EAAI0L,KAAK,MAAOiF,EAAQ7K,KAAA,GACjBlG,EAASI,EAAK2Q,EAAQ7K,IAC/B,IACC4gC,MAAK,WACAhjC,EAAKqa,SAAW/d,GAAO0D,EAAKgb,MAAM1Q,SACtCtK,EAAK6yE,eAAev2E,EAAK2Q,EAASG,EACpC,IACC61B,OAAM,SAAC71B,GAENpN,EAAKyyE,UAAWj+C,QACd,CAAEW,KAAM74B,EAAIsL,OAAQmc,KAAM3W,EAAMlB,SAChCe,EACA3Q,EACAqH,EAGJ,IAEF2S,KAAKu8D,eAAev2E,EAAK2Q,EAASG,EAnCpC,GAqCDA,EAEDylE,eAAA,SACE7yE,EACAoN,EACAH,GAEKjN,EAAIuI,YACPvI,EAAIgI,KAAK,MAAOoF,EAAQhL,KAAA,GAG1B,IAAM9F,EAAU8Q,EAAQ9G,QACxB3C,EAAgDsJ,EAAO2mB,WAA/C13B,EAAoByH,EAApB+vB,qBAAsBxmB,EAAavJ,EAAbgwB,cAC9B,GAAIr3B,EACF,IAAK,IAAMuR,KAAUvR,EACnB0D,EAAI6J,iBAAiBgE,EAAQvR,EAAQuR,IAIrCT,EAAQu/B,UACV3sC,EAAI6J,iBACF,QACA,SAAWuD,EAAQs/B,WAAa,KAAOt/B,EAAQu/B,SAAW,IAI9D3sC,EAAIsI,mBAAqBgO,KAAKw8D,iBAAiB5yE,KAAKoW,MACpDtW,EAAI2yE,WAAar8D,KAAKy8D,aAAa7yE,KAAKoW,MACxCtW,EAAIuG,aAAe6G,EAAQ7G,aAE3ByP,KAAK8pB,aAAaxpB,KAAKi8D,gBACvBtlE,EAAO5E,QACLnM,GAAwB4O,EAAgB5O,GACpCA,EACAgR,EACNoJ,KAAKi8D,eAAiBv8D,KAAKtN,WACzB4N,KAAK08D,YAAY9yE,KAAKoW,MACtBrJ,EAAO5E,SAETrI,EAAIwK,MAAA,EACL4C,EAED0lE,iBAAA,WACE,IAAQ9yE,EAAgCsW,KAAhC9V,QAAiB4M,EAAekJ,KAAvB+D,OAAapN,EAAUqJ,KAAV0E,MAC9B,GAAKhb,GAAYoN,EAAjB,CAGA,IAAM9Q,EAAa8Q,EAAI7E,WACjB5E,EAAS2S,KAAKvQ,OAGpB,IAAIkH,EAAM3C,SAKNhO,GAAc,IACY,IAAxB2Q,EAAM0L,QAAQE,QAChB5L,EAAM0L,QAAQE,MAAQjK,KAAKgN,IACzB5F,KAAKoe,YAAY1U,MACjBzS,EAAM0L,QAAQC,OAGZjV,EAAO0E,UAAY1E,EAAOiwB,WAAWD,gBACvC3d,KAAK8pB,aAAaxpB,KAAKi8D,gBACvB5uE,EAAO0E,QAAU1E,EAAOiwB,WAAWD,cACnCrd,KAAKi8D,eAAiBv8D,KAAKtN,WACzB4N,KAAK08D,YAAY9yE,KAAKoW,MACtB3S,EAAOiwB,WAAWD,eACf1mB,EAAM0L,QAAQE,MAAQ5L,EAAM0L,QAAQC,UAK1B,IAAftc,GAAkB,CACpB0Z,KAAK8pB,aAAaxpB,KAAKi8D,gBACvBnlE,EAAI9E,mBAAqB,KACzB8E,EAAIulE,WAAa,KACjB,IAAMz2E,EAASkR,EAAIxF,OAEbsF,EACiB,SAArBE,EAAI7G,aAA0B6G,EAAIzF,aAAe,KACnD,GAAIzL,GAAU,KAAOA,EAAS,IAAK,CACjC,IAAM2R,EAAsB,MAAfX,EAAAA,EAAmBE,EAAI1F,SACpC,GAAY,MAARmG,EAAc,CAChBZ,EAAM0L,QAAQG,IAAMlK,KAAKgN,IACvB5F,KAAKoe,YAAY1U,MACjBzS,EAAM0L,QAAQE,OAEhB,IAAMpV,EACiB,gBAArB2J,EAAI7G,aACAsH,EAAK0T,WACL1T,EAAKxR,OAIX,GAHA4Q,EAAMqL,OAASrL,EAAMuL,MAAQ/U,EAC7BwJ,EAAMyL,WACW,IAAdzL,EAAMuL,OAAiBvL,EAAM0L,QAAQG,IAAM7L,EAAM0L,QAAQE,QACvDvC,KAAKm8D,UACR,OAEF,IAAMzkE,EAAasI,KAAKm8D,UAAUlmC,WAIlC,GAHIv+B,GACFA,EAAWf,EAAOjN,EAAS6N,EAAMT,IAE9BkJ,KAAKm8D,UACR,OAEF,IAAMnuE,EAA2B,CAC/BlC,IAAKgL,EAAI5E,YACTpC,KAAMyH,EACNsnB,KAAMj5B,GAIR,YADAoa,KAAKm8D,UAAUt+C,UAAU7vB,EAAU2I,EAAOjN,EAASoN,EAErD,CACF,CAGA,IAAM/I,EAAcV,EAAOiwB,WAAWP,WAQlC8J,GAAY94B,EAPG4I,EAAMsL,OAAA,EAEQ,CAC/BnW,IAAKpC,EAAQoC,IACbgE,UAAA,EACA+uB,KAAMj5B,IAGNoa,KAAKiC,MAAMlU,IAEX6R,EAAO1K,MAAStP,EAAA,kBAAwB8D,EAAQoC,KAChDkU,KAAKm8D,UAAWj+C,QACd,CAAEW,KAAMj5B,EAAQ6nB,KAAM3W,EAAIvF,YAC1B7H,EACAoN,EACAH,GAGN,CA3FF,GA6FDG,EAED4lE,YAAA,WACE,GAAK18D,KAAKvQ,OAAV,CACA,IAAM/F,EAAcsW,KAAKvQ,OAAO6tB,WAAWR,aAE3C,GAAI+J,GAAYn9B,EADGsW,KAAK0E,MAAMzC,OAAA,GAE5BjC,KAAKiC,MAAMvY,OACN,KAAAoN,EACL8I,EAAOzJ,KAAI,0BAA0B,OAA1BW,EAA0BkJ,KAAK9V,cAAA,EAAL4M,EAAchL,MACnD,IAAM6K,EAAYqJ,KAAKm8D,UACnBxlE,IACFqJ,KAAKo8D,gBACLzlE,EAAUynB,UACRpe,KAAK0E,MACL1E,KAAK9V,QACL8V,KAAK+D,QAGX,CAhBkB,GAiBnBjN,EAEDmL,MAAA,SAAMvY,GACJ,IAAQoN,EAAmBkJ,KAAnB9V,QAASyM,EAAUqJ,KAAV0E,MACjB1E,KAAKyd,WAAaiJ,GAAch9B,EAAaiN,EAAMsL,OACnDtL,EAAMsL,QACNrC,EAAOzJ,MAEH7E,OAAS,eAAiBA,OAAS,WACnB,yBAAAwF,OAAA,EAAAA,EAAShL,KAAiB,cAAA6K,EAAMsL,MAChD,IAAAvY,EAAY8zB,YACP,OAAAxd,KAAKyd,WAAA,MAGdzd,KAAKo8D,gBACLp8D,KAAK+D,OAAS,KAEdrE,KAAK8pB,aAAaxpB,KAAKk8D,cACvBl8D,KAAKk8D,aAAex8D,KAAKtN,WACvB4N,KAAKs8D,aAAa1yE,KAAKoW,MACvBA,KAAKyd,WAAA,EAER3mB,EAED2lE,aAAA,SAAa/yE,GACX,IAAMoN,EAAQkJ,KAAK0E,MAEnB5N,EAAMkL,OAAStY,EAAMsY,OACjBtY,EAAMizE,mBACR7lE,EAAMoL,MAAQxY,EAAMwY,MAAA,EAEvBpL,EAEDioB,YAAA,WACE,IAAIr1B,EAAwB,KAC5B,GACEsW,KAAK+D,QACL+3D,GAAsBvwE,KAAKyU,KAAK+D,OAAO5S,yBACvC,CACA,IAAM2F,EAAYkJ,KAAK+D,OAAO43D,kBAAkB,OAChDjyE,EAASoN,EAAY0J,WAAW1J,GAAa,IAC/C,CACA,OAAOpN,CAAA,EACRoN,EAED6kE,kBAAA,SAAkBjyE,GAChB,OACEsW,KAAK+D,QACL,IAAI3d,OAAM,IAAKsD,EAAI,oBAAqB,MAAM6B,KAC5CyU,KAAK+D,OAAO5S,yBAGP6O,KAAK+D,OAAO43D,kBAAkBjyE,GAEhC,MACRA,CAAA,CApUY,GCeTkzE,GAAY,qBAEZC,GAAW,WAYf,SAAAnzE,EAAYA,GAAwB,KAX5BozE,gBAAA,EAAU,KACVb,oBAAA,EAAc,KACd7xE,QAA0B,KAAI,KAC9BgH,SAA4B,KAAI,KAChC2rE,gBAAA,EAAU,KACX7yE,QAAgC,KAAI,KACnCuF,OAAqC,KAAI,KACzC0sE,UAAmD,KAAI,KACxDz3D,WAAA,EAAK,KACJX,OAA0B,KAGhC/D,KAAK88D,WAAapzE,EAAOozE,YAAcE,GACvCh9D,KAAK+8D,WAAa,IAAIr9D,KAAKu9D,gBAC3Bj9D,KAAK0E,MAAQ,IAAI3C,CACnB,CAAC,IAAAjL,EAAApN,EAAAjD,UAwNA,OAxNAqQ,EAED2lB,QAAA,WACEzc,KAAK+D,OACH/D,KAAKm8D,UACLn8D,KAAK9V,QACL8V,KAAKvQ,OACLuQ,KAAK5V,QACH,KACJ4V,KAAKo8D,gBACLp8D,KAAK5O,SAAW,KAEhB4O,KAAK88D,WAAa98D,KAAK+8D,WAAa/8D,KAAK0E,MAAQ,MAClD5N,EAEDslE,cAAA,WACMp8D,KAAK+8D,aAAe/8D,KAAK0E,MAAMrC,QAAQG,MACzCxC,KAAK0E,MAAM1Q,SAAA,EACXgM,KAAK+8D,WAAWjpE,QAAA,EAEnBgD,EAEDhD,MAAA,WAAc,IAAApK,EACZsW,KAAKo8D,gBACD,OAAJ1yE,EAAIsW,KAAKm8D,YAALzyE,EAAgBssC,SAClBh2B,KAAKm8D,UAAUnmC,QACbh2B,KAAK0E,MACL1E,KAAK9V,QACL8V,KAAK5O,SAAA,EAGV0F,EAED4lB,KAAA,SACEhzB,EACAoN,EACAH,GACM,IAAA3Q,EAAA,KACAqH,EAAQ2S,KAAK0E,MACnB,GAAIrX,EAAMgV,QAAQC,MAChB,MAAM,IAAIpL,MAAM,iCAElB7J,EAAMgV,QAAQC,MAAQ5C,KAAKoe,YAAY1U,MAEvC,IAAMxjB,EA+KV,SAA8B8D,EAAwBoN,GACpD,IAAMH,EAAkB,CACtBhF,OAAQ,MACR6tB,KAAM,OACN09C,YAAa,cACb7sE,OAAAyG,EACA9G,QAAS,IAAI0P,KAAKy9D,QAAQ5lE,EAAc,CAAC,EAAG7N,EAAQsG,WAUtD,OAPItG,EAAQ2sC,UACV1/B,EAAW3G,QAAQuT,IACjB,QACA,SAAW7Z,EAAQ0sC,WAAa,IAAMlrB,OAAOxhB,EAAQ2sC,SAAW,IAI7D1/B,CACT,CAjBA,CA/K4CjN,EAASsW,KAAK+8D,WAAW1sE,QAC3DuG,EACJD,EAAUs/B,WACN9oC,EAAyC,gBAAzBzD,EAAQuG,aACxByH,EAASvK,EAAgB,aAAe,SAC9Ca,EAAgD8I,EAAOwmB,WAA/CvvB,EAAoBC,EAApBovB,qBAAsBvvB,EAAaG,EAAbqvB,cAE9Brd,KAAK9V,QAAUR,EACfsW,KAAKvQ,OAASqH,EACdkJ,KAAKm8D,UAAYxlE,EACjBqJ,KAAK5V,QAAU4V,KAAK88D,WAAWpzE,EAAS9D,GACxC8Z,KAAK8pB,aAAaxpB,KAAKi8D,gBACvBnlE,EAAO/E,QACLhE,GAAwByG,EAAgBzG,GACpCA,EACAF,EACNmS,KAAKi8D,eAAiBv8D,KAAKtN,YAAW,WACpCpM,EAAKo2E,gBACLzlE,EAAUynB,UAAU/wB,EAAO3D,EAAS1D,EAAKoL,SAC3C,GAAG0F,EAAO/E,SAEV2N,KACG09D,MAAMp9D,KAAK5V,SACXsiC,MAAK,SAAC9mC,GACLI,EAAKoL,SAAWpL,EAAK+d,OAASne,EAE9B,IAAM2R,EAAQe,KAAKgN,IAAI5F,KAAKoe,YAAY1U,MAAO/b,EAAMgV,QAAQC,OAY7D,GAVA5C,KAAK8pB,aAAaxjC,EAAKi2E,gBACvBnlE,EAAO/E,QAAUlE,EACjB7H,EAAKi2E,eAAiBv8D,KAAKtN,YACzB,WACEpM,EAAKo2E,gBACLzlE,EAAUynB,UAAU/wB,EAAO3D,EAAS1D,EAAKoL,SAAA,GAE3CvD,GAAiB0J,EAAQlK,EAAMgV,QAAQC,SAGpC1c,EAASy3E,GAAI,CAChB,IAAQ3lE,EAAuB9R,EAAvB0L,OAAQtD,EAAepI,EAAf2L,WAChB,MAAM,IAAI+rE,GACRtvE,GAAc,8BACd0J,EACA9R,EAEJ,CAKA,OAJAyH,EAAMgV,QAAQE,MAAQhL,EAEtBlK,EAAM6U,MAyJd,SAA0BxY,GACxB,IAAMoN,EAAepN,EAAQoX,IAAI,iBACjC,GAAIhK,EAAc,CAChB,IAAMH,EAVV,SAA4BjN,GAC1B,IAAMoN,EAAS8lE,GAAUnlE,KAAK/N,GAC9B,GAAIoN,EACF,OAAOoJ,SAASpJ,EAAO,IAAMoJ,SAASpJ,EAAO,IAAM,CAEvD,CALA,CAU+CA,GAC3C,GAAItC,EAAgBmC,GAClB,OAAOA,CAEX,CACA,IAAM3Q,EAAgB0D,EAAQoX,IAAI,kBAClC,GAAI9a,EACF,OAAOka,SAASla,EAEpB,CAZA,CAzJuCJ,EAASoK,UAAY3C,EAAM6U,MAEtDtL,GAAcpC,EAAgBsC,EAAO6+B,eAChC3vC,EAAKu3E,kBACV33E,EACAyH,EACA3D,EACAoN,EAAO6+B,cACP/+B,GAIAzJ,EACKvH,EAAS43E,cAEW,SAAzB9zE,EAAQuG,aACHrK,EAAS63E,OAEX73E,EAAS6nB,MAClB,IACCif,MAAK,SAAC9mC,GACL,IAAM2R,EAAWvR,EAAKoL,SACtB,IAAKmG,EACH,MAAM,IAAIL,MAAM,oBAElBwI,KAAK8pB,aAAaxjC,EAAKi2E,gBACvB5uE,EAAMgV,QAAQG,IAAMlK,KAAKgN,IACvB5F,KAAKoe,YAAY1U,MACjB/b,EAAMgV,QAAQE,OAEhB,IAAMpV,EAAQvH,EAAa8R,GACvBvK,IACFE,EAAM2U,OAAS3U,EAAM6U,MAAQ/U,GAG/B,IAAMa,EAAiC,CACrClC,IAAKyL,EAASzL,IACdgE,KAAMlK,EACNi5B,KAAMtnB,EAASjG,QAGbsF,IAAepC,EAAgBsC,EAAO6+B,gBACxC/+B,EAAWvJ,EAAO3D,EAAS9D,EAAc2R,GAG3CZ,EAAUknB,UAAU7vB,EAAgBX,EAAO3D,EAAS6N,EACtD,IACCo1B,OAAM,SAAC71B,GAEN,GADA4I,KAAK8pB,aAAaxjC,EAAKi2E,iBACnB5uE,EAAM2G,QAAV,CAKA,IAAMpO,EAAgBkR,GAAYA,EAAM+nB,MAAV,EACxBjoB,EAAgBE,EAAeA,EAAMlB,QAAb,KAC9Be,EAAUunB,QACR,CAAEW,KAAAj5B,EAAM6nB,KAAA7W,GACRlN,EACAoN,EAAQA,EAAMmmB,QAAU,KACxB5vB,EATF,CAWF,KACHyJ,EAEDioB,YAAA,WACE,IAAIr1B,EAAwB,KAC5B,GAAIsW,KAAK5O,SAAU,CACjB,IAAM0F,EAAYkJ,KAAK5O,SAASpB,QAAQ8Q,IAAI,OAC5CpX,EAASoN,EAAY0J,WAAW1J,GAAa,IAC/C,CACA,OAAOpN,CAAA,EACRoN,EAED6kE,kBAAA,SAAkBjyE,GAChB,OAAOsW,KAAK5O,SAAW4O,KAAK5O,SAASpB,QAAQ8Q,IAAIpX,GAAQ,MAC1DoN,EAEOymE,kBAAR,SACE7zE,EACAoN,EACAH,EACA3Q,EACAqH,QAAA,IADArH,IAAAA,EAAwB,GAGxB,IAAMJ,EAAa,IAAIy6C,GACjBzpC,EAAUlN,EAASspC,KAAwB0qC,YAqCjD,OAnCa,SAAPnmE,IACJ,OAAOX,EACJ3D,OACAy5B,MAAK,SAAC91B,GACL,GAAIA,EAAK1G,KAKP,OAJItK,EAAW26C,YACblzC,EAAWyJ,EAAOH,EAAS/Q,EAAW6yC,QAAS/uC,GAG1CuB,QAAQyE,QAAQ,IAAImlD,YAAY,IAEzC,IAAM1nD,EAAoByJ,EAAKpF,MACzBkG,EAAMvK,EAAMpH,OAelB,OAdA+Q,EAAMkL,QAAUtK,EACZA,EAAM1R,GAAiBJ,EAAW26C,YAGpC36C,EAAW6kB,KAAKtd,GACZvH,EAAW26C,YAAcv6C,GAE3BqH,EAAWyJ,EAAOH,EAAS/Q,EAAW6yC,QAAS/uC,IAKjD2D,EAAWyJ,EAAOH,EAASxJ,EAAOzD,GAE7B6N,GACT,IACCo1B,OAAM,WAEL,OAAO1hC,QAAQ0E,QACjB,IAhCS,EAmCN,EACRjG,CAAA,CAxOc,GAmRjB,SAASszE,GAAWtzE,EAAwBoN,GAC1C,OAAO,IAAI4I,KAAKi+D,QAAQj0E,EAAQoC,IAAKgL,EACvC,CAAC,ICxRG8mE,GD0REN,GAAA,SAAU5zE,GAGd,SAAAoN,EAAYA,EAAiBH,EAAc3Q,GAAc,IAAAqH,EAGhC,OAFvBA,EAAA3D,EAAA9C,KAAA,KAAMkQ,IAAQ,MAHT+nB,UAAA,EAAIxxB,EACJ4vB,aAAA,EAGL5vB,EAAKwxB,KAAOloB,EACZtJ,EAAK4vB,QAAUj3B,EAAQqH,CACzB,CAAC,OAPaF,EAAA2J,EAAApN,GAOboN,CAAA,CAPG,CAOHjJ,EAPsBqJ,QElTnB2mE,GAAkB,KCyUXC,GAA2B93E,EAAAA,EAAA,CACtC41C,eAAA,EACAtB,eAAgB,EAChBqc,uBAAA,EACAr3C,OAAA,EACAwvD,mBAAA,EACAlB,sBAAA,EACAW,wBAAA,EACAxa,0BAAA,EACA/U,wBAAyB,EACzBrC,gBAAiB,GACjBghB,iBAAkB,IAClBE,0BAA2B,IAC3Bhf,cAAe,IACf9C,cAAe,GACfgiC,yBAA0B,EAC1BC,YAAa,GACbC,cAAe,EACfhiC,uBAAwB,IACxBnY,sBAAuB,EACvBF,4BAA6B,IAC7BC,sBAAA,EACAF,4BAAA,EACAV,wBAAyB,EACzB+6B,sBAAA,EAIAN,qBAAsB,KACtB5e,mBAAoB,IACpBgV,cAAA,EACAG,WAAY,KACZ5b,mBAAA,EACA6lC,gBAAA,EACAznB,mBAAA,EACAwY,2BAA4B,IAC5BK,8BAA+B,GAC/BjS,oBAAqB,EACrBt5C,OAAQg4D,GAERvmC,aAAA,EACAlZ,aAAA,EACA0/C,cAAA,EACA7K,qBAAA,EACAC,6BAAA,EACA+M,cAAelxC,GACfmxC,iBAAkB5jB,GAClB6jB,mBAAoBtR,GACpBuR,gBAAiBl3C,GACjBm3C,cAAe9P,GACfrf,wBAAA,EACAM,oBAAqB,EACrBf,8BAAA,EACAzf,gBAAiB,EACjBD,gBAAiB,EACjBV,eAAgB,EAChBD,eAAgB,EAChBD,uBAAwB,IACxBmwC,0BAA2B,IAC3BhvC,mBAAoB,IACpBtB,qBAAsB,GACtBiB,uBAAA,EACAO,mBAAoB,EACpBC,gBAAiB,EACjB8uC,eAAgB,EAChB7J,YAAA,EACApqD,wBAAA,EACAD,WAAY,CAAE,EACd8mD,iBAAkB,CAAE,EACpBH,gCACIvmD,EAEJ+zD,eAAA,EACA3gC,aAAA,EACA/a,gBAAA,EACA22C,UAAA,EACAt3C,6BAAA,EACAN,wBAAA,EACAC,uBAAA,EACAgP,sBAAA,EAEAmjC,eAAgB,CACdvlD,QA/FoC,CACtCwO,qBAAsB,IACtBC,cAAe,IACfP,aAAc,KACdC,WAAY,OA6FZuL,cAAe,CACb1Z,QAAS,CACPwO,qBAAsB,IACtBC,cAAe,IACfP,aAAc,CACZU,YAAa,EACbE,aAAc,IACdE,gBAAiB,IACjB+I,QAAS,UAEX5J,WAAY,CACVS,YAAa,EACbE,aAAc,IACdE,gBAAiB,IACjB+I,QAAS,YAIf/J,mBAAoB,CAClBhO,QAAS,CACPwO,qBAAsB,IACtBC,cAAe,IACfP,aAAc,CACZU,YAAa,EACbE,aAAc,EACdE,gBAAiB,GAEnBb,WAAY,CACVS,YAAa,EACbE,aAAc,IACdE,gBAAiB,OAIvBf,mBAAoB,CAClBjO,QAAS,CACPwO,qBAAsB,IACtBC,cAAe,IACfP,aAAc,CACZU,YAAa,EACbE,aAAc,EACdE,gBAAiB,GAEnBb,WAAY,CACVS,YAAa,EACbE,aAAc,IACdE,gBAAiB,OAIvByK,eAAgB,CACdzZ,QAAS,CACPwO,qBAAsB,IACtBC,cAAe,KACfP,aAAc,CACZU,YAAa,EACbE,aAAc,EACdE,gBAAiB,GAEnBb,WAAY,CACVS,YAAa,EACbE,aAAc,IACdE,gBAAiB,OAIvB49C,2BAA4B,CAC1B5sD,QACI,CACEwO,qBAAsB,IACtBC,cAAe,IACfP,aAAc,CACZU,YAAa,EACbE,aAAc,EACdE,gBAAiB,GAEnBb,WAAY,CACVS,YAAa,EACbE,aAAc,IACdE,gBAAiB,OAQ3B+gD,uBAAwB,IACxBC,wBAAyB,EACzBC,0BAA2B,IAC3BC,+BAAgC,KAChCC,oBAAqB,IACrBC,qBAAsB,EACtBC,uBAAwB,IACxBC,4BAA6B,KAC7BC,mBAAoB,IACpBC,oBAAqB,EACrBC,sBAAuB,IACvBC,2BAA4B,MAqBrB,CACL5U,WD1gBwB,CAC1BlG,OAAM,SACJ96D,EACAoN,EACAH,EACA3Q,GAWA,IATA,IACIqH,EAEAzH,EACAgR,EACAW,EACApK,EANEuK,EAAmB,GAOnB1J,EAAO0R,KAAK8gB,QAAU9gB,KAAKkgB,aAExB7xB,EAAI,EAAGA,EAAI/H,EAAc67D,KAAK97D,OAAQgI,IAM7C,GAJA6I,GAAA,EACAW,EAAS,EACTpK,EAAO,KAHPE,EAAMrH,EAAc67D,KAAK9zD,IAKhB6yD,UAAW,CAClB,IADkB,IAAA/yD,EACTd,EAAI,EAAGA,EAAIM,EAAIyzD,MAAM/6D,OAAQgH,IAChC8wE,GAAgBtyE,KAAK8B,EAAIyzD,MAAM/zD,GAAGyzD,QAAU5pD,EAC9CW,KAEApK,GAAQE,EAAIyzD,MAAM/zD,GAAGyzD,MACrB5pD,GAAA,GAIJvJ,EAAI4zD,aAAenqD,EAGfA,IAAcH,IAChBA,GAAW,MAGTY,GAAU,GACZA,IAEAA,IAGF,IAAMzJ,EAAUy5D,GAAcp6D,EAAK4J,QAC7BgY,EAAKo5C,GAAcrxD,EAAWH,EAAS7I,GAGnC,MAALpE,GAAW,OAANmE,EAALnE,EAAO+1B,OAAP5xB,EAAa6xB,WAAW3Q,MAC3BnpB,EAAM,IAAIoI,EAAI8I,EAAWH,EAAS7I,IAC9B6T,GAAKoN,EACTnpB,EAAIwhE,KAAOr5D,EAAI,EACfnI,EAAIohE,MAAQ,OAIZphE,EAAIgJ,SAAW,GAAK0J,KAAK+M,IAAI,GAAoC,GAAhC/M,KAAK2Q,MAAgB,EAAT1R,EAAc,KAC3DG,EAAO+S,KAAK7kB,GAEhB,CAeF,OAbI8D,GAASgO,EAAO3R,SAElB2R,EAAOi9B,MAAK,SAACjrC,EAAMoN,GACjB,MAAkB,SAAdpN,EAAK09D,MAAiC,SAAdtwD,EAAKswD,KACxB,EAEL19D,EAAK09D,KAAO,GAAKtwD,EAAKswD,KAAO,EACxBtwD,EAAKswD,KAAO19D,EAAK09D,KAEnB19D,EAAK09D,KAAOtwD,EAAKswD,IAC1B,IACA1vD,EAAOtE,SAAQ,SAAC0D,GAAG,OAAKyoB,GAAc71B,EAAOoN,EAAA,KAExCY,CACT,GC+bE20D,cAAA,EACAC,aAAA,EACAV,sBAAA,EACAhB,wBAAyB,UACzBE,+BAAgC,KAChCE,wBAAyB,UACzBC,+BAAgC,KAChCE,wBAAyB,aACzBC,+BAAgC,GAChCE,wBAAyB,aACzBC,+BAAgC,GAChCrS,0BAAA,IA/BiB,IACnBqmB,yBACI1nB,GAEJ2nB,wBACI9mB,GAEJ6M,mBAAwCmE,GACxC+V,sBAA2CxqB,GAC3CyqB,qBAA0CtoB,GAC1CuoB,cAAiC/P,GACjCgQ,eAA+BjH,GAC/BkH,0BACIpF,KAsHN,SAASqF,GAAQp2E,GACf,OAAIA,GAAsB,iBAARA,EACZxD,MAAMC,QAAQuD,GACTA,EAAI6lB,IAAIuwD,IAEVt5E,OAAOP,KAAKyD,GAAKktB,QAAO,SAAC9f,EAAQH,GAEtC,OADAG,EAAOH,GAAOmpE,GAAQp2E,EAAIiN,IACnBG,CACR,GAAE,CAAE,GAEApN,CACT,CFxnB6B,IAERq2E,GAAA,SAAer2E,GAYlC,SAAAoN,EACEA,EACAH,GACA,IAAA3Q,EAG0B,OAF1BA,EAAA0D,EAAA9C,KAAA,KAAMkQ,EAAK,uBAAqB,MAf1BkpE,QAAmB,GAAEh6E,EACrBi6E,aAAuB,EAACj6E,EACxBk6E,eAAyB,EAACl6E,EAC1Bm6E,iBAAA,EAAWn6E,EACXupE,aAA6B,KAAIvpE,EACjCo6E,mBAA6B,EAACp6E,EAC9Bq6E,kBAA4B,EAACr6E,EAC7Bs6E,cAAA,EAAQt6E,EAETu6E,sBAAA,EAOLv6E,EAAKs6E,SAAW3pE,EAChB3Q,EAAKo7B,qBAAqBp7B,CAC5B,CAnBkCmH,EAAA2J,EAAApN,GAmBjC,IAAAiN,EAAAG,EAAArQ,UA0kBA,OA1kBAkQ,EAEOyqB,mBAAR,WACE,IAAQ13B,EAAQsW,KAARwb,IACR9xB,EAAIoyB,GAAGpjB,EAAOa,iBAAkByG,KAAK+b,kBAAmB/b,MACxDtW,EAAIoyB,GAAGpjB,EAAOc,gBAAiBwG,KAAKi7B,iBAAkBj7B,MACtDtW,EAAIoyB,GAAGpjB,EAAOmB,aAAcmG,KAAK4uB,cAAe5uB,MAChDtW,EAAIoyB,GAAGpjB,EAAOsB,eAAgBgG,KAAK6uB,gBAAiB7uB,MACpDtW,EAAIoyB,GAAGpjB,EAAO6C,cAAeyE,KAAK0uB,eAAgB1uB,MAClDtW,EAAIoyB,GAAGpjB,EAAOkD,MAAOoE,KAAKke,QAASle,KAAA,EACpCrJ,EAEO0qB,qBAAR,WACE,IAAQ33B,EAAQsW,KAARwb,IACR9xB,EAAI0yB,IAAI1jB,EAAOa,iBAAkByG,KAAK+b,kBAAmB/b,MACzDtW,EAAI0yB,IAAI1jB,EAAOc,gBAAiBwG,KAAKi7B,iBAAkBj7B,MACvDtW,EAAI0yB,IAAI1jB,EAAOmB,aAAcmG,KAAK4uB,cAAe5uB,MACjDtW,EAAI0yB,IAAI1jB,EAAOsB,eAAgBgG,KAAK6uB,gBAAiB7uB,MACrDtW,EAAI0yB,IAAI1jB,EAAO6C,cAAeyE,KAAK0uB,eAAgB1uB,MACnDtW,EAAI0yB,IAAI1jB,EAAOkD,MAAOoE,KAAKke,QAASle,KAAA,EACrCrJ,EAEM8lB,QAAP,WACEzc,KAAKqhB,uBACLrhB,KAAKsgE,SAAW,KAChBtgE,KAAKwgE,cACL92E,EAAAjD,UAAMg2B,QAAO71B,KAAC,KAAD,EACd+P,EAEMilB,SAAP,WACiB5b,KAAKggE,QAGb5sE,SAAQ,SAAC1J,GACdA,EAAMq7B,UAAY,EAClBr7B,EAAMo7B,cAAgB,CACxB,IAEAp7B,EAAAjD,UAAMm1B,SAAQh1B,KAAC,KAAD,EACf+P,EAEO6pE,YAAR,WACExgE,KAAKmgE,iBAAA,EACLngE,KAAKqgE,kBAAoB,EACzBrgE,KAAKogE,mBAAqB,EAC1BpgE,KAAKuvD,aAAe,KACpBvvD,KAAKggE,QAAU,GACfhgE,KAAKkgE,eAAiB,GACvBvpE,EAEOolB,kBAAR,SACEryB,EACAoN,GAEAkJ,KAAKwgE,aAAA,EACN7pE,EAESskC,iBAAV,SACEvxC,EACAoN,GAEA,IAAMH,EAA2BqJ,KAAKwb,IAAI/rB,OAAOskD,yBAC3C/tD,EAAkB,GAClBqH,EAAyC,CAAC,EAC1CzH,EAAgD,CAAC,EACnDgR,GAAA,EACAW,GAAA,EACApK,GAAA,EAEJ2J,EAAK6gB,OAAOvkB,SAAQ,SAAC1J,GAA6B,IAAAoN,EAAAY,EAC1C1J,EAAatE,EAAYouB,MAIzB/pB,EAA2BrE,EAA3B8uB,WAAY3qB,EAAenE,EAAfm7B,YACyB,YAAvC/tB,EAAA/I,QAAA,EAAA+I,EAAY3E,QAAQ,iBACtByrE,KAAAA,GAAoB,kBAAkBryE,KAAKC,UAAUC,YACjDmyE,KACFl0E,EAAY8uB,WAAazqB,OAAA,IAIzBA,IACFrE,EAAY8uB,WAAazqB,EAAagpB,GACpChpB,EACA4I,IAIgC,KAAhC,OAAAe,EAAA7J,QAAA,EAAA6J,EAAYvF,QAAQ,WACtBtE,EAAanE,EAAYm7B,W/H0D1B,SAA6Bn7B,GAIlC,IADA,IAAMoN,EAASpN,EAAMqO,MAAM,KAClBpB,EAAI,EAAGA,EAAIG,EAAO/Q,OAAQ4Q,IAAK,CACtC,IAAM3Q,EAAU8Q,EAAOH,GAAGoB,MAAM,KAChC,GAAI/R,EAAQD,OAAS,EAAG,CACtB,IAAIsH,EAASrH,EAAQiqB,QAAU,IAC/B5iB,GAAU6S,SAASla,EAAQiqB,SAAmBvpB,SAAS,IACvD2G,IACE,MAAQ6S,SAASla,EAAQiqB,SAAmBvpB,SAAS,KACrD0Z,OAAO,GACTtJ,EAAOH,GAAKtJ,CACd,CACF,CACA,OAAOyJ,EAAOmB,KAAK,IACrB,CAhBO,C+H1D2DpK,IAI5D,IAAQd,EAAiCrD,EAAjCqF,MAAOjB,EAA0BpE,EAA1BsF,OAAQ+f,EAAkBrlB,EAAlBwuB,cAIvB,GAHAthB,IAAAA,KAAuB7J,IAASe,IAChCyJ,IAAAA,IAAsB1J,GACtBV,IAAAA,IAAsBY,KAEP,MAAbghB,GAAAA,EAAehpB,QACdgI,IACEsoB,GACCtoB,EACA,QACA4I,IAEH9I,IACEwoB,GACCxoB,EACA,QACA8I,IAZN,CAkBA,IACEvJ,EAMEY,EANFiqB,OACczqB,EAKZQ,EALF,cACcwG,EAIZxG,EAJF,cACcoK,EAGZpK,EAHF,cACAwK,EAEExK,EAFFyyE,WACe/nE,EACb1K,EADF,eAGImO,GAD2B/D,GAAW,KAAM,IACN1O,EAAYquB,QAAO,IAAIvf,EAAU,IAAIhL,EAAa,IAAAJ,EAAU,IAAAsL,EAAA,IAAelE,EAEvH,GAAKnH,EAAa8O,GAKX,GACL9O,EAAa8O,GAAUsU,MAAQ/mB,EAAYoC,KAC1CpC,EAAYouB,MAAM,cAUnBzqB,EAAa8O,GAAUopB,WAAW,QAASv3B,EAAWuqB,OACtDlrB,EAAa8O,GAAUopB,WAAW,OAAQv3B,EAAWyqB,eAVrD,CAGA,IAAMhc,EAAgB7W,EAAmBuW,IAAa,EACtDzS,EAAYouB,MAAM,cAAgB,IAAI5xB,MAAMuW,EAAe,GAAGxE,KAAK,KACnE,IAAMmH,EAAQ,IAAIqlB,GAAM/6B,GACxB2D,EAAa8O,GAAYiD,EACzBpZ,EAAOykB,KAAKrL,EACd,KAhB6B,CAC3B,IAAMpS,EAAQ,IAAIy3B,GAAM/6B,GACxB2D,EAAa8O,GAAYnP,EACzBpH,EAAmBuW,GAAY,EAC/BnW,EAAOykB,KAAKzd,EACb,CAlBD,CAiCF,IAEAgT,KAAK0gE,0BACH16E,EACA8Q,EACAF,EACAW,EACApK,EAAA,EAEHwJ,EAEO+pE,0BAAR,SACEh3E,EACAoN,EACAH,EACA3Q,EACAqH,GACA,IAAAzH,EAAA,KACIgR,EAA+B,GAC/BW,EAAkC,GAClCpK,EAASzD,EAUb,IAPKiN,GAAmB3Q,IAAoBqH,IAC1CF,EAASA,EAAO4T,QACd,SAAArX,GAAA,IvH7KqBoN,EuH6KlBH,EAAUjN,EAAVm7B,WAAY7+B,EAAU0D,EAAVyiC,WAAY9+B,EAAK3D,EAALqF,MAAOnJ,EAAM8D,EAANsF,OAAM,SACnC2H,MAAiBtJ,IAASzH,QvH9KVkR,EuH8KmC9Q,IvH7K5Cm+B,GAAiBhyB,QAAQ2E,IAAU,CuH6KoB,KAIjD,IAAlB3J,EAAOpH,OAAX,CA2BA,GAAI+Q,EAAKomB,YAAa,CACpB,IAAQxlB,EAA6BsI,KAAKwb,IAAI/rB,OAAtCskD,yBAWR4sB,GAVA/pE,EAAcE,EAAKomB,YAAYnc,QAC7B,SAACrX,GAAK,OACHA,EAAM8uB,YACPnC,GACE3sB,EAAM8uB,WACN,QACA9gB,EACD,IAIP,CAEIZ,EAAKwnB,WAEPqiD,GADAppE,EAAiBT,EAAKwnB,WAIxB,IAAMtwB,EAAiBb,EAAOiT,MAAM,GAEpCjT,EAAOwnC,MAAK,SAACjrC,EAAGoN,GACd,GAAIpN,EAAEouB,MAAM,gBAAkBhhB,EAAEghB,MAAM,cACpC,OAAQpuB,EAAEouB,MAAM,eAAiB,KAAOhhB,EAAEghB,MAAM,eAAiB,IAC7D,GACC,EAGP,GAAInhB,GAAmBjN,EAAEsF,SAAW8H,EAAE9H,OACpC,OAAOtF,EAAEsF,OAAS8H,EAAE9H,OAEtB,GAAItF,EAAEk7B,YAAc9tB,EAAE8tB,UACpB,OAAOl7B,EAAEk7B,UAAY9tB,EAAE8tB,UAEzB,GAAIl7B,EAAEyiC,aAAer1B,EAAEq1B,WACrB,OACEhI,GAAiBhyB,QAAQzI,EAAEyiC,YAC3BhI,GAAiBhyB,QAAQ2E,EAAEq1B,YAG/B,GAAIziC,EAAEm7B,aAAe/tB,EAAE+tB,WAAY,CACjC,IAAM7+B,EAAS0wB,GAA0BhtB,EAAEm7B,YACrCx3B,EAASqpB,GAA0B5f,EAAE+tB,YAC3C,GAAI7+B,IAAWqH,EACb,OAAOA,EAASrH,CAEpB,CACA,GAAI0D,EAAE+mB,MAAQ3Z,EAAE2Z,KAAO/mB,EAAEi7B,WAAa7tB,EAAE6tB,SAAU,CAChD,IAAM/+B,EAAS+wB,GAAkCjtB,EAAEi7B,UAC7C/tB,EAAS+f,GAAkC7f,EAAE6tB,UACnD,GAAI/+B,IAAWgR,EACb,OAAOA,EAAShR,CAEpB,CACA,OAAI8D,EAAEuiC,iBAAmBn1B,EAAEm1B,eAClBviC,EAAEuiC,eAAiBn1B,EAAEm1B,eAEvB,CACT,IAEA,IAAIl+B,EAAuBC,EAAe,GAC1C,GAAIgS,KAAKsgE,WACPnzE,EAAS6S,KAAKsgE,SAASnF,mBAAmBhuE,IAC/BpH,SAAWiI,EAAejI,OACnC,IAAK,IAAI8H,EAAI,EAAGA,EAAIG,EAAejI,OAAQ8H,IACzC,GAAIG,EAAeH,GAAGuqB,YAAcjrB,EAAO,GAAGirB,UAAW,CACvDrqB,EAAuBC,EAAeH,GACtC,KACF,CAKNmS,KAAKggE,QAAU7yE,EAGf,IAAK,IAAIJ,EAAI,EAAGA,EAAII,EAAOpH,OAAQgH,IACjC,GAAII,EAAOJ,KAAOgB,EAAsB,KAAAD,EACtCkS,KAAKigE,YAAclzE,EACnB,IAAMgiB,EAAoBhhB,EAAqBgqB,QACzC3qB,EAAoB4S,KAAKwb,IAAI2+C,kBAKnC,GAJAn6D,KAAKT,IACiB,oBAAApS,EAAOpH,OAAM,mCAAmCgpB,QAAA,KAG/C,OAAnBjhB,EAAI,KAAC0tB,IAAIuI,iBAAA,EAATj2B,EAAqBugC,wBAAsC,CAC7D,IAAM7gC,EAAqB8K,KAAK+M,IAC9B0J,EACA/O,KAAKwb,IAAI/rB,OAAO+uE,2BAGhBhxE,EAAqBJ,GACrBA,IAAsB0wE,GAAiBzvC,yBAEvCruB,KAAKwb,IAAI2+C,kBAAoB3sE,EAEjC,CACA,KACF,CAKF,IAAMgH,EAAYnH,IAAoBrH,EAChCoS,EAA4B,CAChCuf,OAAAxqB,EACA+vB,YAAAtmB,EACAumB,eAAA5lB,EACAqgB,YAAa9gB,EAAK8gB,YAClBC,YAAa/gB,EAAK+gB,YAClB+X,WAAY5vB,KAAKigE,YACjBv7D,MAAO5N,EAAK4N,MACZsB,MAAO3Y,EACP4Y,MAAOjgB,EACPq2D,UAAW7nD,GAAaoC,EAAY0f,MAAK,SAAC5sB,GAAC,QAAOA,EAAEoC,GAAG,KAEzDkU,KAAKwb,IAAI6C,QAAQ3lB,EAAOe,gBAAiBrB,IAGrC4H,KAAKwb,IAAI/rB,OAAOmsC,eAAiB57B,KAAKwb,IAAIolD,iBAC5C5gE,KAAKwb,IAAIG,UAAU3b,KAAKwb,IAAI/rB,OAAO6qC,cA3HrC,MAvBErvC,QAAQyE,UAAUg9B,MAAK,WACrB,GAAI9mC,EAAK41B,IAAK,CACR1kB,EAAK6gB,OAAO5xB,QACdH,EAAKuQ,KAAI,gDACyCuqB,KAAKC,UACnD7pB,EAAK6gB,OAAO,GAAGG,QAIrB,IAAMpuB,EAAQ,IAAIwN,MAChB,qDAEFtR,EAAK41B,IAAI6C,QAAQ3lB,EAAOkD,MAAO,CAC7BjU,KAAMwU,EAAWE,YACjB4gB,QAASxgB,EAAac,mCACtBohB,OAAA,EACA7yB,IAAKgL,EAAKhL,IACVoJ,MAAAxL,EACAk1B,OAAQl1B,EAAMkM,SAElB,CACF,KA+HHe,EAkJSunB,QAAV,SAAkBx0B,EAAqBoN,IACjCA,EAAK6nB,OAAU7nB,EAAK5M,SAKtB4M,EAAK5M,QAAQvC,OAASozB,IACtBjkB,EAAK5M,QAAQ+Z,QAAUjE,KAAKiE,OAE5BjE,KAAKkqB,WAAWpzB,EAEpB,EAEAH,EACU+3B,eAAV,SACEhlC,EAA2BoN,GAE3B,IADEH,EAAIG,EAAJ8wB,KAEF,QAAI,IAAAjxB,GAAsBA,EAAKhP,OAASuzB,GAAwB,CAC9D,IAAMl1B,EAAK2Q,EAAKwM,kBAChB,IAAK3c,OAAOP,KAAKD,GAAIswB,MAAK,SAAC5sB,GAAI,QAAO1D,EAAG0D,EAAK,IAC5C,OAEF,IAAM2D,EAAQ2S,KAAKggE,QAAQrpE,EAAKsN,OACvB,MAAL5W,GAAAA,EAAO03B,YACT/kB,KAAKT,IAAG,kCAC4BlS,EAAM03B,UAAA,qBAE1C13B,EAAM03B,UAAY,EAEtB,GACDpuB,EAESi4B,cAAV,SAAwBllC,EAA4BoN,GAAuB,IAAAH,EAI1D3Q,EAHPqH,EAAmByJ,EAAnBmN,MAAOre,EAAYkR,EAAZmmB,QACTrmB,EAAWoJ,KAAKggE,QAAQ3yE,GAE9B,IAAKuJ,EAKH,OAJAoJ,KAAK7J,KAA4B,uBAAA9I,QAC7B,OAAJrH,EAAI8Q,EAAK6lB,qBAAL32B,EAAyBu+B,OAC3B3+B,EAAQyiB,mBAAA,IAMRhb,IAAU2S,KAAKogE,mBAEc,IAA3BxpE,EAASkuB,gBACXluB,EAASmuB,UAAY,GAEvB/kB,KAAK6pB,eAAex8B,EAAOyJ,EAAMF,EAASqmB,UACjC,OAAJtmB,EAAIG,EAAK6lB,qBAALhmB,EAAyB4tB,OAElC3+B,EAAQyiB,mBAAA,EAAoB,EAE/B1R,EAES8yB,aAAV,SAAuB3yB,GACrBpN,EAAAjD,UAAMgjC,aAAY7iC,KAAC,MACnB,IAAM+P,EAAoBqJ,KAAKogE,kBACzBp6E,EAAega,KAAKuvD,aAE1B,GAAIvpE,GAAgBga,KAAK2pB,mBAAmB3jC,GAAe,CACzD,IAAIqH,EAAMrH,EAAayqB,IACvB,GAAI3Z,EACF,IACEzJ,EAAMyJ,EAAiB0tB,cAAcn3B,EACtC,CAAC,MAAO3D,GACPsW,KAAK7J,KAC0D,6DAAAzM,EAEjE,CAGF,IAAM9D,EAAYI,EAAa8xB,MAAM,cACrC9X,KAAKT,IAAG,uBACiB5I,QAAA,KACL,MAAhBG,OAAA,EAAAA,EAAkBwtB,KACd,UACAxtB,EAAiBwtB,IACjB,SACAxtB,EAAiBkmB,KACjB,IAAE,SACAp3B,EAAY,YAAcA,EAAY,IAAE,IAAIyH,GAKtD2S,KAAKupB,aACLvpB,KAAKwb,IAAI6C,QAAQ3lB,EAAOkB,cAAe,CACrC9N,IAAAuB,EACA4W,MAAOtN,EACPyhB,UAAWpyB,EAAa8xB,MAAM,cAC9BnW,GAAI,EACJgb,mBAAoB7lB,GAAoB,MAE5C,GACDH,EAiBDu6B,YAAA,SAAYxnC,GAAoB,IAAAoN,EAAAH,EAAA,KACxB3Q,EAASga,KAAKggE,QAAQj/D,QAAO,SAACjK,EAAO9Q,GACzC,OAAIA,IAAU0D,IAGViN,EAAK2pE,UACP3pE,EAAK2pE,SAASpvC,YAAYp6B,GAExBA,IAAUH,EAAK44D,eACjB54D,EAAK44D,aAAe,KACpB54D,EAAKypE,mBAAqB,EACtBtpE,EAAMmmB,SACRnmB,EAAMmmB,QAAQxW,UAAUrT,SAAQ,SAAC1J,GAAC,OAAMA,EAAEua,OAAS,CAAC,QAI1D,IACAsiB,GAA6BvgC,GAC7Bga,KAAKggE,QAAUh6E,EACXga,KAAKogE,mBAAqB,GAAsB,OAArBtpE,EAAIkJ,KAAKuvD,eAALz4D,EAAmBmmB,UACpDjd,KAAKogE,kBAAoBpgE,KAAKuvD,aAAatyC,QAAQxW,UAAU,GAAGxC,OAElEjE,KAAKwb,IAAI6C,QAAQ3lB,EAAOsB,eAAgB,CAAE2d,OAAA3xB,GAAA,EAC3C2Q,EAEOk4B,gBAAR,SACEnlC,EAA4BoN,GAE5B,IADEH,EAAMG,EAAN6gB,OAEF3X,KAAKggE,QAAUrpE,CAAA,EAChBA,EAEMkqE,oBAAP,WACE,IAAAn3E,EAAyDsW,KAAKwb,IAAtD1kB,EAAgBpN,EAAhBsjE,iBAAkBr2D,EAAYjN,EAAZ++B,aAAcziC,EAAY0D,EAAZu/B,aACpCjpB,KAAKkgE,gBAAkBvpE,IACzBqJ,KAAKkgE,cAAgBvpE,EACrBqJ,KAAKwb,IAAI6C,QAAQ3lB,EAAOiD,uBAAwB,CAC9CqxD,iBAAAl2D,EACA6gB,OAAQ3X,KAAK2X,OACb8Q,aAAA9xB,EACA6xB,aAAcxoB,KAAKwb,IAAIgN,aACvBS,aAAAjjC,IAAA,EAGL4Q,EAAAE,EAAA,EAAAjQ,IAAA,SAAAia,IA/SD,WACE,OAA4B,IAAxBd,KAAKggE,QAAQj6E,OACR,KAEFia,KAAKggE,OACd,GAAC,CAAAn5E,IAAA,QAAAia,IAED,WACE,OAAOd,KAAKogE,iBACb,EAAA78D,IAED,SAAU7Z,GACR,IAAMoN,EAASkJ,KAAKggE,QACpB,GAAsB,IAAlBlpE,EAAO/Q,OAAX,CAIA,GAAI2D,EAAW,GAAKA,GAAYoN,EAAO/Q,OAAQ,CAE7C,IAAM4Q,EAAQ,IAAIO,MAAM,qBAClBlR,EAAQ0D,EAAW,EASzB,GARAsW,KAAKwb,IAAI6C,QAAQ3lB,EAAOkD,MAAO,CAC7BjU,KAAMwU,EAAWK,YACjBygB,QAASxgB,EAAamB,mBACtBqG,MAAOva,EACPi1B,MAAA34B,EACAkP,MAAAyB,EACAioB,OAAQjoB,EAAMf,UAEZ5P,EACF,OAEF0D,EAAW4O,KAAK+M,IAAI3b,EAAUoN,EAAO/Q,OAAS,EAChD,CAEA,IAAMsH,EAAiB2S,KAAKogE,kBACtBx6E,EAAYoa,KAAKuvD,aACjB34D,EAAgBhR,EAAYA,EAAUkyB,MAAM,qBAC5CvgB,EAAQT,EAAOpN,GACfyD,EAAYoK,EAAMugB,MAAM,cAI9B,GAHA9X,KAAKogE,kBAAoB12E,EACzBsW,KAAKuvD,aAAeh4D,EAGlBlK,IAAmB3D,IACnB6N,EAAM0lB,UACNr3B,GACAgR,IAAkBzJ,EAJpB,CASA6S,KAAKT,IACmB,sBAAA7V,EACpB,MAAA6N,EAAMvI,OAASuI,EAAMvI,OAAS,KAAO,KACpCuI,EAAM40B,WAAa50B,EAAM40B,WAAa,IAAM,KAC7C50B,EAAMotB,SAAWptB,EAAMotB,SAAW,IAAM,IAAE,IACxCptB,EAAMwgB,QAAO,KACf5qB,EAAY,iBAAmBA,EAAY,IAC9B,eAAAE,GACbuJ,EAAgB,iBAAmBA,EAAgB,KAIvD,IAAMc,EAAyC,CAC7CuM,MAAOva,EACPouB,MAAOvgB,EAAMugB,MACbmF,QAAS1lB,EAAM0lB,QACflF,QAASxgB,EAAMwgB,QACfkU,eAAgB10B,EAAM00B,eACtB+B,WAAYz2B,EAAMy2B,WAClBhJ,YAAaztB,EAAMytB,YACnBj2B,MAAOwI,EAAMxI,MACbC,OAAQuI,EAAMvI,OACd21B,SAAUptB,EAAMotB,SAChBnM,WAAYjhB,EAAMihB,WAClBqM,WAAYttB,EAAMstB,WAClBe,YAAaruB,EAAMquB,YACnBE,eAAgBvuB,EAAMuuB,eACtB9jB,OAAQzK,EAAMyK,OACd+iB,UAAWxtB,EAAMwtB,UACjBD,cAAevtB,EAAMutB,cACrBj9B,KAAM0P,EAAM1P,KACZ8Z,GAAIpK,EAAMoK,GACV8O,IAAKlZ,EAAMkZ,IACX3kB,IAAKyL,EAAMzL,IACXkZ,MAAO,EACP87D,cAAevpE,EAAMupE,cACrBC,aAAcxpE,EAAMwpE,cAGtB/gE,KAAKwb,IAAI6C,QAAQ3lB,EAAOgB,gBAAiBhC,GAEzC,IAAM1J,EAAeuJ,EAAM0lB,QAC3B,IAAKjvB,GAAgBA,EAAa6Y,KAAM,CAEtC,IAAM9Y,EAAmBiS,KAAK0pB,aAC5BnyB,EAAMkZ,IACN,MAAA7qB,OAAA,EAAAA,EAAWq3B,QACXjvB,GAEFgS,KAAKypB,aAAa17B,EACpB,CApDA,CAnCA,CAwFF,GAAC,CAAAlH,IAAA,cAAAia,IAED,WACE,OAAOd,KAAKqgE,gBACb,EAAA98D,IAED,SAAgB7Z,GACdsW,KAAKqgE,iBAAmB32E,OAAA,IACpBsW,KAAKmgE,cACPngE,KAAKmgE,YAAcz2E,IAGH,IAAdA,IACFsW,KAAKiE,MAAQva,EAEjB,GAAC,CAAA7C,IAAA,aAAAia,IAED,WACE,OAAOd,KAAKigE,WACb,EAAA18D,IAED,SAAe7Z,GACbsW,KAAKigE,YAAcv2E,CACrB,GAAC,CAAA7C,IAAA,aAAAia,IAED,WAEE,QAAI,IAAAd,KAAKmgE,YAA2B,CAClC,IAAMz2E,EAAmBsW,KAAKwb,IAAI/rB,OAAOyuE,WACzC,gBAAIx0E,EACKA,EAEFsW,KAAKwb,IAAI6V,cAClB,CACA,OAAOrxB,KAAKmgE,WACb,EAAA58D,IAED,SAAe7Z,GACbsW,KAAKmgE,YAAcz2E,CACrB,GAAC,CAAA7C,IAAA,gBAAAia,IAsGD,WACE,OAA+B,IAA3Bd,KAAKqgE,iBACArgE,KAAKqgE,iBAELrgE,KAAKwb,IAAIoN,aAEnB,EAAArlB,IAED,SAAkB7Z,GAChBsW,KAAKiE,MAAQva,GACkB,IAA3BsW,KAAKqgE,mBACPrgE,KAAKwb,IAAIoN,cAAgBl/B,EAE7B,KAACoN,CAAA,CA7lBkB,CAAwBqyB,IA8oB7C,SAASw3C,GAAsBj3E,GAC7B,IAAMoN,EAAS,CAAC,EAChBpN,EAAO0J,SAAQ,SAAC1J,GACd,IAAMiN,EAAUjN,EAAMqvB,SAAW,GACjCrvB,EAAMiY,GAAK7K,EAAOH,GAAWG,EAAOH,IAAY,EAChDG,EAAOH,IACT,GACF,CG1qB8C,IAgBzBqqE,GAAS,WAK5B,SAAAt3E,EAAYA,GAAmB,KAJd+F,YAAA,EAAM,KAChBwxE,gBAAuD,CAAC,EAAC,KACzDtB,cAAsC,KAG3C3/D,KAAKvQ,OAAS/F,CAChB,CAAC,IAAAoN,EAAApN,EAAAjD,UAsUA,OAtUAqQ,EAEDhD,MAAA,SAAMpK,GACJ,IAAK,IAAMoN,KAAOkJ,KAAKihE,gBAAiB,CACtC,IAAMtqE,EAASqJ,KAAKihE,gBAAgBnqE,GAAKiN,OACzC,GAAIpN,EAAQ,KAAA3Q,EACV,GAAI0D,GAAQA,KAAA,OAAI1D,EAAK2Q,EAAOzM,cAAA,EAAPlE,EAAgB4hC,KAAKjgC,MACxC,OAEFgP,EAAO7C,OACT,CACF,GACDgD,EAEDglC,OAAA,WACE,IAAK,IAAMpyC,KAAOsW,KAAKihE,gBAAiB,CACtC,IAAMnqE,EAAUkJ,KAAKihE,gBAAgBv3E,IAGnCoN,EAAQoqE,wBACRpqE,EAAQg/B,YAAYllB,4BAEb5Q,KAAKihE,gBAAgBv3E,EAEhC,GACDoN,EAED2lB,QAAA,WAEE,IAAK,IAAM/yB,KADXsW,KAAK87B,SACa97B,KAAKihE,gBAAiB,CACtC,IAAMnqE,EAASkJ,KAAKihE,gBAAgBv3E,GAAKqa,OACrCjN,GACFA,EAAO2lB,SAEX,CACAzc,KAAKihE,gBAAkB,CAAC,CAAD,EACxBnqE,EAEDqqE,mBAAA,SACEz3E,EACAoN,EACAH,EACA3Q,EACAqH,GAEA,YAAO,IALPyJ,IAAAA,EAAwB2F,EAAa8B,gBAK9B,IAAIg3B,GAAU,CACnB5tC,KAAMwU,EAAWC,cACjB6gB,QAAAnmB,EACA6nB,OAAA,EACAiJ,KAAAl+B,EACA0H,SAAA/D,EACA6H,MAAAyB,EACA6nB,eAAAx4B,GAAA,EAEH8Q,EAED2mC,UAAA,SACE/zC,EACAoN,GACsB,IAAAH,EAAA,KACtB,GAAIqJ,KAAK2/D,eAAiB3/D,KAAKvQ,OAAOmlE,WAGpC,IADA,IAAQ5uE,EAAW0D,EAAXma,GAAIxW,EAAO3D,EAAPwa,GAAmBte,EAAA,WAE7B,IAAM8D,EAAOoN,EAAmBF,GAChC,GACEvJ,GAAM3D,EAAKwa,KACH,gBAAPle,GAAoC,gBAAZ0D,EAAKma,IAAwB7d,EAAK0D,EAAKma,IAM3D,OAJLlN,EAAKgpE,cACFpM,sBAAsB7pE,GACtBgjC,MAAK,SAAC51B,GACLpN,EAAKub,aAAanO,EACpB,IAAG,GAVAF,EAAI,EAAGA,EAAIE,EAAmB/Q,SAAWH,IAAHgR,KAAA,EAelDE,EAED4lB,KAAA,SAAKhzB,GAAwC,IAAAoN,EAAA,KAC3C,OACGpN,EAAKosC,aACNpsC,EAAKic,WACL3F,KAAK2/D,eACL3/D,KAAKvQ,OAAOmlE,WAGL50D,KAAK2/D,cACTpM,sBAAsB7pE,GACtBgjC,MAAK,SAAC/1B,GACL,OAAOG,EAAKwlE,aAAa5yE,EAAMiN,EACjC,IAGGqJ,KAAKs8D,aAAa5yE,EAAA,EAC1BoN,EAEDwlE,aAAA,SACE5yE,EACAoN,GACwB,IAAAH,EAAA3Q,EACpB8Q,GACFpN,EAAKub,aAAanO,GAEpB,IAAMzJ,EAAc3D,EAAKosC,YACzB,IAAKzoC,EAAa,CAChB,IAAMzH,EAAQ,IAAIsR,MAChBJ,EACoE,gEAAAA,EAChE,uDAEN,OAAO7L,QAAQ0E,OACbqQ,KAAKmhE,mBAAmBz3E,EAAM+S,EAAa8B,eAAgB3Y,GAE/D,CACA,IAAMgR,EAAMvJ,EAAYojB,IACxB,IAAK7Z,EACH,OAAO3L,QAAQ0E,OACbqQ,KAAKmhE,mBACHz3E,EACA+S,EAAa8B,eACb,IAAIrH,MAAA,qBAA2BN,EAAG,OAIxC,IAO6BW,EAPzBpK,EAAU6S,KAAKihE,gBAAgBrqE,GAEnC,GAAW,OAAXD,EAAIxJ,IAAAwJ,EAASm/B,YAAYjvC,IAEvB,OADAwG,EAAYxG,IAAMsG,EAAQ2oC,YAAYjvC,IAC/BoE,QAAQyE,QAAQ,CAAEk4B,KAAAl+B,EAAM+pE,QAAAtmE,IAGjC,GAAI,OAAJnH,EAAImH,IAAAnH,EAASo7E,eACX,OAAQ,OAAR7pE,EAAQpK,EAAQ+zE,6BAAA,EAAR3pE,EAAgC07D,WACtC,UAAK,EACL,IAAK,iBACL,IAAK,SACL,IAAK,mBACH,OAAO9lE,EAAQi0E,eAAe10C,MAAK,SAAC51B,GAGlC,OADAzJ,EAAYxG,IAAMiQ,EAAc28D,QAAQ39B,YAAYjvC,IAC7C,CAAE+gC,KAAAl+B,EAAM+pE,QAAAtmE,EACjB,IAcN,OAPAA,EAAU6S,KAAKihE,gBAAgBrqE,GAAO,CACpCk/B,YAAAzoC,EACA+zE,eAAgB,KAChBr9D,OAAQ,KACRm9D,uBAAwB,MAGlB7zE,EAAYsE,QAClB,IAAK,cACL,IAAK,aACL,IAAK,kBACL,IAAK,iBACH,MAA8B,aAA1BtE,EAAYqjB,UAEP1Q,KAAKqhE,YAAYl0E,EAASzD,GAE5BsW,KAAKshE,WAAWn0E,EAASzD,GAClC,IAAK,UACH,OAAOsW,KAAKqhE,YAAYl0E,EAASzD,GACnC,QACE,OAAOuB,QAAQ0E,OACbqQ,KAAKmhE,mBACHz3E,EACA+S,EAAa8B,eACb,IAAIrH,MACwC,0CAAA7J,EAAYsE,OAAM,SAKvEmF,EAEDwqE,WAAA,SAAW53E,EAAwBoN,GACjC,IAAMH,EAA+B,CAAEixB,KAAA9wB,EAAM28D,QAAA/pE,GAC7C,GAAIsW,KAAK2/D,eAAiB3/D,KAAKvQ,OAAOmlE,WAAY,CAChD,IAAM5uE,EACJga,KAAK2/D,cAAcnM,QAAQ78D,GAC7B,GAAI3Q,EACF,OAAQ0D,EAAQ03E,eAAiBp7E,EAAyB0mC,MACxD,SAAC51B,GAEC,OADApN,EAAQw3E,uBAAyBpqE,EAC1BH,CACT,KACCg2B,OAAM,SAAC71B,GAGR,MADApN,EAAQ03E,eAAiB,KACnBtqE,CACR,GAEJ,CACA,OAAO7L,QAAQyE,QAAQiH,EAAA,EACxBG,EAEDuqE,YAAA,SAAY33E,EAAwBoN,GAAwC,IAAAH,EAAA,KACpEtJ,EAAS2S,KAAKvQ,OAEd7J,EAAY,IAAI,EADPyH,EAAO0W,QACO1W,GAG7B,OAFAyJ,EAAKkN,UAAYta,EAAQqa,OAASne,EAE1B8D,EAAQ03E,eAAiB,IAAIn2E,SAAQ,SAAC2L,EAASW,GACrD,IAAMpK,EAAkC,CACtCsmE,QAAA/pE,EACAk+B,KAAA9wB,EACA7G,aAAc,cACdnE,IAAKpC,EAAQosC,YAAYrlB,KAMrB/Y,EAAarK,EAAOi7B,cAAc1Z,QAClC5gB,EAAoC,CACxCsvB,WAAA5lB,EACA3F,QAAS2F,EAAW2lB,cACpBE,SAAU,EACVE,WAAY,EACZE,cAAe,GAGX5vB,EAAqD,CACzD8vB,UAAW,SACTn0B,EACAoN,EACA9Q,EACAqH,GAEA,IAAQzH,EAA4BI,EAA5B4hC,KAAMz6B,EAAsBnH,EAAtBytE,QAAc/7D,EAAQ1R,EAAb8F,IACvB,IAAKlG,EAAKkwC,aAAe3oC,IAAYwJ,EAAKsqE,gBAAgBvpE,GACxD,OAAOH,EACLZ,EAAKwqE,mBACHv7E,EACA6W,EAAa8B,eACb,IAAIrH,MAAM,gDACV7J,IAKNF,EAAQ2oC,YAAYjvC,IAAMjB,EAAKkwC,YAAYjvC,IAAM,IAAIwZ,WACnD3W,EAASoG,MAIXlK,EAAKoe,UAAY,KACjB7W,EAAQ4W,OAAS,KACjBnN,EAAQ,CAAEgxB,KAAAhiC,EAAM6tE,QAAAtmE,GACjB,EAED+wB,QAAS,SACPx0B,EACA2D,EACAzH,EACAgR,GAEAD,EAAKi/B,YAAYvoC,GACjBkK,EACEZ,EAAKwqE,mBACHrqE,EACA2F,EAAa8B,eACb,IAAIrH,MACY,cAAAxN,EAASm1B,KAAoB,gBAAAn1B,EAAS+jB,MAEtD7nB,EAAcI,EAAA,CACZ8F,IAAKqB,EAAcrB,IAAKgE,UAAA,GAAoBpG,IAGnD,EAED00B,UAAW,SACT10B,EACA1D,EACAqH,GAEAsJ,EAAKi/B,YAAY5vC,GACjBuR,EACEZ,EAAKwqE,mBACHrqE,EACA2F,EAAa+B,iBACb,IAAItH,MAAM,yBACV7J,GAGL,EAED2oC,QAAS,SACPtsC,EACA1D,EACAqH,GAEAsJ,EAAKi/B,YAAY5vC,GACjBuR,EACEZ,EAAKwqE,mBACHrqE,EACA2F,EAAayC,iBACb,IAAIhI,MAAM,uBACV7J,GAGN,GAGFzH,EAAU82B,KAAKvvB,EAAea,EAAcD,EAC9C,KACD+I,EAEO8+B,YAAR,SAAoBlsC,GAClB,IAAQoN,EAA4BpN,EAA5Bk+B,KAAMjxB,EAAsBjN,EAAtB+pE,QAAcztE,EAAQ0D,EAAboC,IACjBuB,EAASsJ,EAAQoN,OACnBjN,EAAKkN,YAAc3W,IACrByJ,EAAKkN,UAAY,KACjBrN,EAAQoN,OAAS,aAEZ/D,KAAKihE,gBAAgBj7E,GACxBqH,GACFA,EAAOovB,SAAA,EAEV/yB,CAAA,CA7U2B,GCtB9B,SAAS63E,KACP,OAAO7hE,KAAK8hE,cAAiB9hE,KAAa+hE,kBAC5C,CAEO,SAASC,KAEd,IADoBrvD,KAElB,OAAO,EAKT,IAAM3oB,EAAe63E,KACrB,OACG73E,GACAA,EAAajD,WACmC,mBAAxCiD,EAAajD,UAAUm4D,cACW,mBAAlCl1D,EAAajD,UAAUk4D,MAEpC,CCZO,IAKcgjB,GAAa,WAWhC,SAAAj4E,EAAYA,EAAQoN,EAAOH,EAAiB3Q,GAAK,KAVzCyJ,YAAA,EAAM,KACNyxB,MAAiC,KAAI,KACrC6Y,qBAAA,EAAe,KACfve,SAAA,EAAG,KACHomD,WAAqB,EAAC,KACtBC,eAAA,EAA8B,KAC9BC,QAAyB,KAAI,KAC7BC,OAAA,EAAsB,KACtB1rB,SAAA,EAGNr2C,KAAKvQ,OAAS/F,EACdsW,KAAKkhB,MAAQpqB,EACbkJ,KAAK+5B,gBAAkBpjC,EACvBqJ,KAAKwb,IAAMx1B,CACb,CAAC,IAAA8Q,EAAApN,EAAAjD,UAkVA,OAlVAqQ,EAEM2lB,QAAP,WACEzc,KAAKkhB,MAAQ,KAEblhB,KAAKwb,IAAMxb,KAAK+5B,gBAAkB,IACpC,EAEAjjC,EAMOkrE,KAAP,SAAYt4E,EAAyBoN,GACnC,IAAQH,EAA2BqJ,KAA3BvQ,OAAQzJ,EAAmBga,KAAnBkhB,MAAO7zB,EAAY2S,KAAZ8hE,QACvB,GAAc,OAAV97E,EAAJ,CAGA,IAAQJ,EAAyBI,EAAzB08B,YAAa9rB,EAAY5Q,EAAZqwD,QACf9+C,EAASyI,KAAKq2C,UAAYz/C,EAC1BzJ,GAAa6S,KAAKq2C,SAAWz/C,EAKnC,GAHAoJ,KAAKq2C,QAAUz/C,EAGXhR,IAAgB8D,EAsBpB,GAAIyD,GAAaoK,EACfyI,KAAK8hE,QAAU,UAKjB,GACG97E,EAAM8nC,SAAWl3B,GAClB5Q,EAAM61C,OACiB,IAAvB71C,EAAMu9B,eACL8Q,GAAaE,YAAYvuC,GAAOD,OAEjCia,KAAK4hE,WAAa,MANpB,CAUA,IAAMlqE,EAAa28B,GAAaG,WAAWxuC,EAAOJ,EAAa,GACzDoI,EAAY0J,EAAWg9B,WAAa,EAE1C,GAAI99B,EAAS,CAEX,IAAM7I,EAAkB2J,EAAWuyB,IAzFP,EA2FtBp8B,GACHG,GACA8I,GAAcA,EAAWwL,OAAS1c,GAClCoI,EAAYpI,EA9Fa,IA+FvBoa,KAAK+5B,gBAAgBlG,mBAAmBjuC,GAC7C,GAAImI,GAAmBF,EACrB,OAGFmS,KAAK+hE,OAAA,CACP,CAIA,IAAK/hE,KAAK+hE,OAA0B,OAAjB/hE,KAAK8hE,QAAkB,KAAA/0E,EAGxC,KADmB2K,EAAWuyB,IAAM,GAChBj8B,GAClB,OAGF,IAAMF,EACJwK,KAAKgN,IAAItX,EAAW0J,EAAW4K,OAAS,GAAK1c,EAKzCmpB,EAAQ/O,KAAKwb,IAAI7D,OACnB3X,KAAKwb,IAAI7D,OAAO3X,KAAKwb,IAAI+zC,cACzB,KAEEniE,GADc,MAAL2hB,GAAc,OAAThiB,EAALgiB,EAAOkO,cAAA,EAAPlwB,EAAgB8Z,MAEM,EAAjCkI,EAAOkO,QAAS1V,eA3HQ,EA6HtB/Z,EAAewS,KAAK+5B,gBAAgBlG,mBAAmBjuC,GAC7D,GAAIkI,EAAY,IAAMA,GAAaV,GAAmBI,GAIpD,YAHKxH,EAAM8nC,QACT9tB,KAAKiiE,mBAAmBz0E,GAI9B,CAGA,IAAMgH,EAAOkL,KAAKoe,YAAY1U,MAC9B,GAAgB,OAAZ/b,EAAJ,CAKA,IAAM+K,EAAkB5D,EAAOnH,EAC/B,GAAKuJ,KAAWwB,GA/IqB,OAiJnC4H,KAAKkiE,aAAaxqE,GACbsI,KAAKkhB,OAHZ,CAQA,IAAM1oB,EAAoB67B,GAAaG,WACrCxuC,EACAJ,EACA+Q,EAAOolC,eAET/7B,KAAKmiE,mBAAmB3pE,EAAmBJ,EAP3C,CATA,MAFE4H,KAAK8hE,QAAUttE,CAvDjB,MA/BE,GAJAwL,KAAK+hE,OAAA,EACAnrE,IACHoJ,KAAK4hE,WAAa,GAEJ,OAAZv0E,EAAkB,CAEpB,GAAI2S,KAAK6hE,cAAe,CACtB,IAAMnpE,EAAkBgH,KAAKoe,YAAY1U,MAAQ/b,EACjDuS,EAAOzJ,KAC0B,+BAAAvQ,EAAsB,WAAA0S,KAAKwU,MACxDpU,GACD,MAEHsH,KAAK6hE,eAAA,CACP,CACA7hE,KAAK8hE,QAAU,IACjB,CAzBF,CAsHF,EAEAhrE,EAMQqrE,mBAAR,SACEz4E,EACAoN,GAEA,IAAQH,EAAmCqJ,KAAnCvQ,OAAQzJ,EAA2Bga,KAA3B+5B,gBAAiB1sC,EAAU2S,KAAVkhB,MACjC,GAAc,OAAV7zB,EAAJ,CAGA,IAAMzH,EAAcyH,EAAMq1B,YAEpB9rB,EAAU5Q,EAAgB6tC,mBAAmBjuC,GACnD,GAAIgR,IAGiBoJ,KAAKiiE,mBAAmBrrE,KAGxBoJ,KAAKkhB,OACtB,QASDx3B,EAAWugC,IAAMtzB,EAAOolC,eACtBryC,EAAWgrC,WACVhrC,EAAWgrC,UAAY9uC,EAAc+Q,EAAOolC,gBAChDjlC,EAAsD,IAAlCH,EAAOonE,2BAE3Bn+D,EAAOzJ,KAAK,6CAIZ6J,KAAK8hE,QAAU,KACf9hE,KAAKoiE,kBA9BP,CAgCF,EAEAtrE,EAKQorE,aAAR,SAAqBx4E,GACnB,IAAQoN,EAA8BkJ,KAA9Bwb,IAAK7kB,EAAyBqJ,KAAzBkhB,MACb,IADsClhB,KAAlB6hE,eACElrE,EAAO,CAE3BqJ,KAAK6hE,eAAA,EACL,IAAM77E,EAAQ,IAAIkR,MAAK,yBAEnBP,EAAM+rB,YACe,uBAAAhC,KAAKC,UAAUj3B,GAAA,KAExCkW,EAAOzJ,KAAKnQ,EAAM4P,SAClBkB,EAAIunB,QAAQ3lB,EAAOkD,MAAO,CACxBjU,KAAMwU,EAAWE,YACjB4gB,QAASxgB,EAAaoC,qBACtB8f,OAAA,EACAzpB,MAAAlP,EACA+kB,OAAQrhB,EAAWugC,KAEvB,CACF,EAEAnzB,EAKQmrE,mBAAR,SAA2Bv4E,GACzB,IAAQoN,EAAuBkJ,KAAvBvQ,OAAQkH,EAAeqJ,KAAfwb,IAAKx1B,EAAUga,KAAVkhB,MACrB,GAAc,OAAVl7B,EACF,OAAO,EAIT,IAAMqH,EAAcrH,EAAM08B,YACpB98B,EAAayuC,GAAaG,WAAWxuC,EAAOqH,EAAa,GACzDuJ,EACJvJ,EAAczH,EAAW0c,MAAQ1c,EAAW0c,MAAQ1c,EAAW8uC,UACjE,GAAI99B,EAAW,CACb,IAAMW,EAAgB3R,EAAWqkC,KAAOnzB,EAAOilC,cACzC5uC,EACJvH,EAAWqkC,IAAM,GAAKrkC,EAAWqkC,IAAM,GAAKjkC,EAAMiM,WAAa,EAC3DyF,EAAYd,EAAYvJ,EAC9B,GAAIqK,EAAY,IAAMH,GAAiBpK,GAAU,CAE/C,GAAIuK,EAAYZ,EAAOilC,cAAe,CACpC,IAAQ/tC,EAAoBgS,KAApB+5B,gBACJhsC,GAAA,EACJ,GAAoB,IAAhBV,EAAmB,CACrB,IAAMQ,EAAYG,EAAgB8kC,gBAChC,EACA5X,IAEErtB,GAAa+I,EAAY/I,EAAU2U,MACrCzU,GAAA,EAEJ,CACA,IAAKA,EAAU,CACb,IAAMhB,EACJrD,GACAsE,EAAgB8kC,gBACdzlC,EACA6tB,IAEJ,GAAInuB,EAAkB,CAGpB,IAFA,IAAIe,GAAA,EACAihB,EAAMhiB,EAAiByV,IACpBuM,EAAMnY,GAAW,CACtB,IAAMxJ,EAAcY,EAAgB6lC,mBAAmB9kB,GACvD,IAAI3hB,EAEG,CACLU,GAAA,EACA,KACF,CAJEihB,GAAO3hB,EAAYsU,QAKvB,CACA,GAAI5T,EACF,OAAO,CAEX,CACF,CACF,CACA,IAAMN,EAAa8K,KAAKgN,IACtB1O,EAlS6B,IAmS7BvJ,EApSmC,IA4SrC,GANAuS,EAAOzJ,KAAI,6CACoC9I,EAAW,OAAOG,GAEjEwS,KAAK+hE,OAAA,EACL/hE,KAAK8hE,QAAU,KACf97E,EAAM08B,YAAcl1B,EAChB9D,IAAYA,EAAQqb,IAAK,CAC3B,IAAMvQ,EAAQ,IAAI0C,MAAA,mDACmC7J,EAAW,OAAOG,GAEvEmJ,EAAI0nB,QAAQ3lB,EAAOkD,MAAO,CACxBjU,KAAMwU,EAAWE,YACjB4gB,QAASxgB,EAAasC,sBACtB4f,OAAA,EACAzpB,MAAAV,EACAoqB,OAAQpqB,EAAMoB,QACdgyB,KAAMl+B,GAEV,CACA,OAAO8D,CACT,CACF,CACA,OAAO,CACT,EAEAsJ,EAIQsrE,gBAAR,WACE,IAAQ14E,EAAmCsW,KAAnCvQ,OAAQqH,EAA2BkJ,KAA3Bwb,IAAK7kB,EAAsBqJ,KAAtBkhB,MAAOl7B,EAAega,KAAf4hE,WAC5B,GAAc,OAAVjrE,EAAJ,CAGA,IAAMtJ,EAAcsJ,EAAM+rB,YAG1B,GAFA1iB,KAAK4hE,aAED57E,EAAa0D,EAAOu0E,cAAe,CACrC,IAAMr4E,EAAayH,GAAerH,EAAa,GAAK0D,EAAOs0E,YAErDpnE,EAAQ,IAAIM,MAAA,8BACc7J,EAAW,OAAOzH,GAElDga,EAAOzJ,KAAKS,EAAMhB,SAClBe,EAAM+rB,YAAc98B,EACpBkR,EAAIunB,QAAQ3lB,EAAOkD,MAAO,CACxBjU,KAAMwU,EAAWE,YACjB4gB,QAASxgB,EAAauC,sBACtB9J,MAAA0B,EACA+nB,OAAA,GAEJ,KAAO,CACL,IAAMpnB,EAAQ,IAAIL,MAAK,yDACoC7J,EAAW,UAAU3D,EAAOu0E,cAAa,WAEpGr+D,EAAO1K,MAAMqC,EAAM3B,SACnBkB,EAAIunB,QAAQ3lB,EAAOkD,MAAO,CACxBjU,KAAMwU,EAAWE,YACjB4gB,QAASxgB,EAAaoC,qBACtB3J,MAAAqC,EACAonB,OAAA,GAEJ,CA7BA,GA8BDj1B,CAAA,CAlW+B,GCwBb24E,GAAA,SAAgB34E,GAmBnC,SAAAoN,EACEA,EACAH,EACA3Q,GACA,IAAAqH,EAQ0B,OAP1BA,EAAA3D,EAAA9C,KAAA,KACEkQ,EACAH,EACA3Q,EACA,sBACAk1B,KACD,MA1BKonD,gBAAA,EAA+Bj1E,EAC/Bk1E,cAAsC,KAAIl1E,EAC1C4W,OAAiB,EAAC5W,EAClBm1E,iBAAA,EAAgCn1E,EAChCgvD,UAAA,EAAyBhvD,EACzBo1E,WAAA,EAA0Bp1E,EAC1Bq1E,YAA+B,KAAIr1E,EACnCs1E,WAAmC,KAAIt1E,EACvCu1E,UAAkC,KAAIv1E,EACtCw1E,aAAuB,EAACx1E,EACxBy1E,gBAAA,EAA+Bz1E,EAC/BuvC,kBAAqC,KAAIvvC,EACzC01E,kBAAA,EAAiC11E,EACjC6nD,YAA0B,KAchC7nD,EAAK+zB,qBAAqB/zB,CAC5B,CAhCmCF,EAAA2J,EAAApN,GAgClC,IAAAiN,EAAAG,EAAArQ,UA+2CA,OA/2CAkQ,EAEOyqB,mBAAR,WACE,IAAQ13B,EAAQsW,KAARwb,IACR9xB,EAAIoyB,GAAGpjB,EAAOE,eAAgBoH,KAAKshB,gBAAiBthB,MACpDtW,EAAIoyB,GAAGpjB,EAAOG,gBAAiBmH,KAAKuhB,iBAAkBvhB,MACtDtW,EAAIoyB,GAAGpjB,EAAOa,iBAAkByG,KAAK+b,kBAAmB/b,MACxDtW,EAAIoyB,GAAGpjB,EAAOe,gBAAiBuG,KAAKy3C,iBAAkBz3C,MACtDtW,EAAIoyB,GAAGpjB,EAAOkB,cAAeoG,KAAKgc,eAAgBhc,MAClDtW,EAAIoyB,GAAGpjB,EAAOmB,aAAcmG,KAAK4uB,cAAe5uB,MAChDtW,EAAIoyB,GACFpjB,EAAOsC,4BACPgF,KAAKgjE,2BACLhjE,MAEFtW,EAAIoyB,GAAGpjB,EAAOkD,MAAOoE,KAAKke,QAASle,MACnCtW,EAAIoyB,GAAGpjB,EAAOwB,sBAAuB8F,KAAK81C,sBAAuB91C,MACjEtW,EAAIoyB,GAAGpjB,EAAOyB,qBAAsB6F,KAAKijE,qBAAsBjjE,MAC/DtW,EAAIoyB,GAAGpjB,EAAOO,eAAgB+G,KAAKi2C,gBAAiBj2C,MACpDtW,EAAIoyB,GAAGpjB,EAAOY,eAAgB0G,KAAKk2C,gBAAiBl2C,MACpDtW,EAAIoyB,GAAGpjB,EAAOsB,eAAgBgG,KAAK6uB,gBAAiB7uB,MACpDtW,EAAIoyB,GAAGpjB,EAAO6C,cAAeyE,KAAK0uB,eAAgB1uB,KAAA,EACnDrJ,EAES0qB,qBAAV,WACE,IAAQ33B,EAAQsW,KAARwb,IACR9xB,EAAI0yB,IAAI1jB,EAAOE,eAAgBoH,KAAKshB,gBAAiBthB,MACrDtW,EAAI0yB,IAAI1jB,EAAOG,gBAAiBmH,KAAKuhB,iBAAkBvhB,MACvDtW,EAAI0yB,IAAI1jB,EAAOa,iBAAkByG,KAAK+b,kBAAmB/b,MACzDtW,EAAI0yB,IAAI1jB,EAAOe,gBAAiBuG,KAAKy3C,iBAAkBz3C,MACvDtW,EAAI0yB,IAAI1jB,EAAOmB,aAAcmG,KAAK4uB,cAAe5uB,MACjDtW,EAAI0yB,IACF1jB,EAAOsC,4BACPgF,KAAKgjE,2BACLhjE,MAEFtW,EAAI0yB,IAAI1jB,EAAOkD,MAAOoE,KAAKke,QAASle,MACpCtW,EAAI0yB,IAAI1jB,EAAOwB,sBAAuB8F,KAAK81C,sBAAuB91C,MAClEtW,EAAI0yB,IAAI1jB,EAAOyB,qBAAsB6F,KAAKijE,qBAAsBjjE,MAChEtW,EAAI0yB,IAAI1jB,EAAOO,eAAgB+G,KAAKi2C,gBAAiBj2C,MACrDtW,EAAI0yB,IAAI1jB,EAAOY,eAAgB0G,KAAKk2C,gBAAiBl2C,MACrDtW,EAAI0yB,IAAI1jB,EAAOsB,eAAgBgG,KAAK6uB,gBAAiB7uB,MACrDtW,EAAI0yB,IAAI1jB,EAAO6C,cAAeyE,KAAK0uB,eAAgB1uB,KAAA,EACpDrJ,EAESi7B,oBAAV,WACE5xB,KAAKqhB,uBACL33B,EAAAjD,UAAMmrC,oBAAmBhrC,KAAC,KAAD,EAC1B+P,EAEMglB,UAAP,SAAiBjyB,GACf,GAAIsW,KAAK2X,OAAQ,CACf,IAAQ7gB,EAAyBkJ,KAAzBo6B,gBAAiBzjC,EAAQqJ,KAARwb,IAIzB,GAHAxb,KAAK4b,WACL5b,KAAKgvB,YAxFW,KAyFhBhvB,KAAKiE,OAAS,GACTjE,KAAK26B,mBAAoB,CAE5B,IAAI30C,EAAa2Q,EAAIunE,YACD,IAAhBl4E,IACE2Q,EAAIlH,OAAOivE,eAAiB1+D,KAAK2X,OAAO5xB,OAAS,GAEnDC,EAAa,EACbga,KAAK2E,aAAA,GAEL3e,EAAa2Q,EAAI06B,gBAKrB16B,EAAIuyB,cAAgBljC,EACpBga,KAAKiE,MAAQtN,EAAI8wB,UACjBznB,KAAKu6B,gBAAA,CACP,CAEIzjC,EAAkB,IAAwB,IAAnBpN,IACzBsW,KAAKT,IAC6C,gDAAAzI,EAAgBgzB,QAC9D,IAGJpgC,EAAgBoN,GAElBkJ,KAAKq7B,MAAQnC,GACbl5B,KAAKq6B,iBACHr6B,KAAKs6B,cACLt6B,KAAKo6B,gBACH1wC,EACJsW,KAAK2xB,MACP,MACE3xB,KAAKwiE,iBAAA,EACLxiE,KAAKq7B,MAAQpC,EAAA,EAEhBtiC,EAEMilB,SAAP,WACE5b,KAAKwiE,iBAAA,EACL94E,EAAAjD,UAAMm1B,SAAQh1B,KAAC,KAAD,EACf+P,EAESs7B,OAAV,WACE,OAAQjyB,KAAKq7B,OACX,KAAKzB,GACH,IAAQlwC,EAAkBsW,KAAlB2X,OAAQ7gB,EAAUkJ,KAAViE,MACVtN,EAAA,MAAejN,OAAA,EAAAA,EAASoN,GACxB9Q,EAAU,MAAA2Q,OAAA,EAAAA,EAAcsmB,QAC9B,GACEj3B,KACEA,EAAQ6gB,MAAQ7G,KAAK06B,kBAAoB/jC,GAC3C,CACA,GAAIqJ,KAAK0/B,iBAAiB15C,GACxB,MAEFga,KAAKq7B,MAAQnC,GACb,KACD,CAAM,GAAIl5B,KAAKwb,IAAI0N,gBAAkBlpB,KAAKiE,MAAO,CAChDjE,KAAKq7B,MAAQnC,GACb,KACF,CACA,MAEF,KAAKG,GACH,IAAAhsC,EACQzH,EAAM8Z,KAAKoe,YAAY1U,MACvBxS,EAAYoJ,KAAKw6B,UAEvB,IAAK5jC,GAAahR,GAAOgR,GAAuB,OAAdvJ,EAAI2S,KAAKkhB,QAAL7zB,EAAYgpD,QAAS,CACzD,IAAQ9+C,EAAkByI,KAAlB2X,OAAQxqB,EAAU6S,KAAViE,MACVvM,EAAA,MAAeH,OAAA,EAAAA,EAASpK,GAC9B6S,KAAK6/B,wBAAwBnoC,GAAgB,MAC7CsI,KAAKq7B,MAAQnC,EACf,EAMFl5B,KAAKq7B,QAAUnC,IACjBl5B,KAAKo2C,aAEPp2C,KAAKm7B,WAAA,EACNxkC,EAESwkC,UAAV,WACEzxC,EAAAjD,UAAM00C,UAASv0C,KAAC,MAChBoZ,KAAKkjE,cACLljE,KAAKmjE,sBAAA,EACNxsE,EAEOy/C,WAAR,WACE,IAAQ1sD,EAAwCsW,KAAxCwb,IAAK1kB,EAAmCkJ,KAAnC06B,gBAAiB/jC,EAAkBqJ,KAAlB2X,OAAQ3xB,EAAUga,KAAVkhB,MAKtC,GACsB,OAApBpqB,IACE9Q,IAAUga,KAAK26B,oBAAuBjxC,EAAI+F,OAAOgnD,sBAMjDz2C,KAAKq8C,WAAYr8C,KAAKyiE,WAA1B,CAIA,IAAMp1E,EAAQ2S,KAAK0C,UAAYhZ,EAAIw/B,cAAgBx/B,EAAI+9B,UACvD,GAAW,MAAN9wB,GAAAA,EAAStJ,GAAd,CAIA,IAAMzH,EAAY+Q,EAAOtJ,GAInBuJ,EAAaoJ,KAAKojE,uBACxB,GAAmB,OAAfxsE,EAAJ,CAIA,IAAMW,EAAcyI,KAAKy7B,kBACzB,GAAIlkC,GAAeyI,KAAKw7B,aAAa5kC,EAAYW,GAAc,CAC7D,IAAMpK,EAAsB,CAAC,EAO7B,OANI6S,KAAKq8C,WACPlvD,EAAKxF,KAAO,SAGdqY,KAAKwb,IAAI6C,QAAQ3lB,EAAOU,WAAYjM,QACpC6S,KAAKq7B,MAAQ5B,GAEf,CACA,GAAKz5B,KAAK0C,UAAV,CAKIhZ,EAAI+9B,YAAcp6B,IAA8B,IAArB3D,EAAI25E,aACjCrjE,KAAKT,IAAyB,qBAAAlS,EAAA,eAAoB2S,KAAKiE,OAEzDjE,KAAKiE,MAAQva,EAAIw/B,cAAgB77B,EAEjC,IAAMqK,EAAe9R,EAAUq3B,QAI/B,IACGvlB,GACDsI,KAAKq7B,QAAUzB,IACdliC,EAAamP,MAAQ7G,KAAK06B,kBAAoB90C,EAI/C,OAFAoa,KAAKiE,MAAQ5W,OACb2S,KAAKq7B,MAAQzB,IAIf,IAAM5rC,EAAY4I,EAAWqzB,IAGvBl8B,EAAYiS,KAAK4+B,mBAAmBh5C,EAAUooC,YAGpD,KAAIhgC,GAAaD,GAAjB,CAKEiS,KAAK48B,mBACL58B,KAAK48B,kBAAkBt6B,MAAQ1L,EAAW4L,MAE1CxC,KAAK48B,kBAAoB,MAE3B,IAAM/uC,EAAmBmS,KAAK48B,kBAC1B58B,KAAK48B,kBAAkBt6B,MACvB1L,EAAW4L,IACXzV,EAAOiT,KAAK++B,gBAAgBlxC,EAAkB6J,GAElD,GACEsI,KAAK8iE,iBACJ9iE,KAAK85B,cACN/sC,GACY,gBAAZA,EAAK8W,IACL7D,KAAK+5B,gBAAgBhG,SAAShnC,KAAUulC,GACxC,KAAAxkC,EAEMihB,GADqC,OAAvBjhB,EAACkS,KAAK48B,mBAAiB9uC,EAAIf,GAAM8W,GACvBnM,EAAa2P,QACrCja,EAAgBsK,EAAa+O,UAAUsI,EAAU,GACnD3hB,GAAiBL,EAAKmX,KAAO9W,EAAc8W,KAC7CnX,EAAOK,EACP4S,KAAK+5B,gBAAgB1G,eAAejmC,GAEvC,MAAU4S,KAAK48B,mBAAqBhmC,EAAWqzB,MAC9CjqB,KAAK48B,kBAAoB,MAG3B,GAAI7vC,GAAQiT,KAAKq/B,cAActyC,EAAMc,GAAmB,CAEtD,IADiBd,EAAKgY,IACP,CAEb,IAAMvX,EACJwS,KAAKyiE,YAAcziE,KAAKq8C,SACpB15C,EACAC,EACApO,GACHhH,IAASoV,EACN5C,KAAKk1C,YACLl1C,KAAKm6B,cAAgBn6B,KAAKkhB,MAC5B1sB,GACFwL,KAAKggC,mBAAmBxrC,EAAahH,EAAM0tB,GAE/C,CACAnuB,EAAOiT,KAAKs/B,2BACVvyC,EACA2K,EACAd,EACAskB,GACAntB,EAEJ,CACKhB,KAGDA,EAAK8X,aAAgB9X,EAAK8X,YAAY/U,MAASkQ,KAAK2E,cACtD5X,EAAOA,EAAK8X,aAGd7E,KAAKk8B,aAAanvC,EAAMnH,EAAWiI,GA9DnC,CA9BA,CAfA,CATA,CALA,GA0HD8I,EAESulC,aAAV,SACEplC,EACAH,EACA3Q,GAGA,IAAMqH,EAAY2S,KAAK+5B,gBAAgBhG,SAASj9B,GAChDkJ,KAAKytB,YAAc32B,EAEjBzJ,IAAc8kC,IACd9kC,IAAcglC,GAEE,gBAAZv7B,EAAK+M,GACP7D,KAAKg9B,iBAAiBlmC,EAAMH,GACnBqJ,KAAK2E,aACd3E,KAAKT,IAAG,YACMzI,EAAK+M,GAAE,aAAa/M,EAAKmN,MAAK,iEAE5CjE,KAAKsjE,qBAAqBxsE,EAAMH,KAEhCqJ,KAAK26B,oBAAA,EACLjxC,EAAAjD,UAAMy1C,aAAYt1C,KAAC,KAAAkQ,EAAMH,EAAO3Q,IAGlCga,KAAKy8B,qBAAqB3lC,EAAA,EAE7BH,EAEOo8B,gBAAR,SAAwBrpC,GACtB,OAAOsW,KAAK+5B,gBAAgBhH,gBAC1BrpC,EACAwxB,GAAA,EAEHvkB,EAEO4sE,sBAAR,SAA8B75E,GAC5B,OAAIA,EAEKsW,KAAK+yB,gBAAgBrpC,EAAK8Y,IAAM,IAElC,IACT,EAEA7L,EAMO6sE,qBAAP,WACExjE,KAAKyjE,mBACLzjE,KAAK+8B,gBAAgB,EAAG7kC,OAAO2oB,kBACjC,EAEAlqB,EAMOs3D,gBAAP,WACE,IAAQvkE,EAAkBsW,KAAlB2X,OAAQ7gB,EAAUkJ,KAAVkhB,MAEhB,GAAS,MAALpqB,GAAAA,EAAO7E,WAAY,CACrB,IAAI0E,EACE3Q,EAAqBga,KAAK8yB,gBAAgBh8B,EAAM4rB,aAClD18B,GAAsBA,EAAmBsc,MAAQ,GAGnDtC,KAAK+8B,gBAAgB,EAAG/2C,EAAmBsc,MAAQ,GAErD,IAAMjV,EAAe2S,KAAKy7B,kBAC1B,GAAgB,MAAZpuC,GAAAA,EAAcwZ,KAAM,CACtB,IAAMjhB,EAAaoa,KAAKojE,uBAExB,IAAKx9E,GAAcA,EAAWqkC,IAAoC,EAA9B58B,EAAaka,eAC/C,MAEJ,CACA,IAAKzQ,EAAMg3B,QAAUpkC,EAAQ,CAE3B,IACMkN,EAAYlN,EADEsW,KAAKwb,IAAI0N,eAEvB3xB,EAAeyI,KAAK6iE,aAExBlsE,EADEY,GAAgByI,KAAKytB,YAEpBztB,KAAKytB,YAAY/rB,SAAW9K,EAAUo3B,YACpC,IAAOz2B,GACV,EAEW,CAEjB,MACEZ,EAAa,EAIf,IAAMxJ,EAAe6S,KAAK+yB,gBAAgBj8B,EAAM4rB,YAAc/rB,GAC9D,GAAIxJ,EAAc,CAEhB,IAAMuK,EAAmBsI,KAAKujE,sBAAsBp2E,GACpD,GAAIuK,EAAkB,CAEpBsI,KAAKyjE,mBAEL,IAAMz1E,EAAW0J,EAAiB8M,YAC9B9M,EAAiB8M,YACjB9M,EAAiB4K,MACfvU,EAAe2J,EAAiBgK,SAChC7T,EAAWyK,KAAKgN,IACpBnY,EAAaqV,IACbxU,EACEsK,KAAK+M,IACH/M,KAAKgN,IACHvX,EAAeiS,KAAKvQ,OAAOwsC,uBAC3BluC,GAAgBiS,KAAK8iE,eAAiB,GAAM,OAE9C/0E,GAAgBiS,KAAK8iE,eAAiB,IAAO,OAGnD9iE,KAAK+8B,gBAAgBlvC,EAAUqK,OAAO2oB,kBACxC,CACF,CACF,GACDlqB,EAEO8sE,iBAAR,WACE,IAAM/5E,EAAcsW,KAAKytB,YAOzB,OANAztB,KAAKytB,YAAc,KACnBztB,KAAK48B,kBAAoB,KACrBlzC,IACFA,EAAYyb,gBACZnF,KAAK+5B,gBAAgB1G,eAAe3pC,IAE9BsW,KAAKq7B,OACX,KAAKlC,GACL,KAAKC,GACL,KAAKC,GACL,KAAKE,GACL,KAAKC,GACHx5B,KAAKq7B,MAAQnC,GAGjBl5B,KAAKq6B,iBAAmBr6B,KAAK0+B,iBAAA,EAC9B/nC,EAESomC,gBAAV,SAA0BjmC,EAAqBH,GAC7CjN,EAAAjD,UAAMs2C,gBAAen2C,KACnB,KAAAkQ,EACAH,EACAqJ,KAAKq8C,SAAW,QAAU,OAE7B1lD,EAES2qB,gBAAV,SACExqB,EACAH,GAEAjN,EAAAjD,UAAM66B,gBAAe16B,KAAC,KAAAkQ,EAAOH,GAC7B,IAAM3Q,EAAQ2Q,EAAKuqB,MACnBlhB,KAAK2iE,WAAa3iE,KAAK0jE,eAAe95E,KAAKoW,MAC3CA,KAAK4iE,UAAY5iE,KAAK2jE,cAAc/5E,KAAKoW,MACzCha,EAAM0N,iBAAiB,UAAWsM,KAAK2iE,YACvC38E,EAAM0N,iBAAiB,SAAUsM,KAAK4iE,WACtC5iE,KAAKuiE,cAAgB,IAAIZ,GACvB3hE,KAAKvQ,OACLzJ,EACAga,KAAK+5B,gBACL/5B,KAAKwb,IAAA,EAER7kB,EAES4qB,iBAAV,WACE,IAAQzqB,EAAUkJ,KAAVkhB,MACJpqB,GAASkJ,KAAK2iE,YAAc3iE,KAAK4iE,YACnC9rE,EAAMxG,oBAAoB,UAAW0P,KAAK2iE,YAC1C7rE,EAAMxG,oBAAoB,SAAU0P,KAAK4iE,WACzC5iE,KAAK2iE,WAAa3iE,KAAK4iE,UAAY,KACnC5iE,KAAKk1C,YAAc,MAErBl1C,KAAK0iE,YAAc,KACf1iE,KAAKuiE,gBACPviE,KAAKuiE,cAAc9lD,UACnBzc,KAAKuiE,cAAgB,MAEvB74E,EAAAjD,UAAM86B,iBAAgB36B,KAAC,KAAD,EACvB+P,EAEO+sE,eAAR,WAEE1jE,KAAK2xB,MAAA,EACNh7B,EAEOgtE,cAAR,WACE,IAAMj6E,EAAQsW,KAAKkhB,MACbpqB,EAAcpN,EAAQA,EAAMg5B,YAAc,KAC5CluB,EAAgBsC,IAClBkJ,KAAKT,IAAwB,mBAAAzI,EAAuBgzB,QAAQ,IAI9D,IAAMnzB,EAAaqJ,KAAKojE,uBACL,OAAfzsE,GAA0C,IAAnBA,EAAWszB,IAUtCjqB,KAAK2xB,OATH3xB,KAAK7J,KAAI,iDAELQ,EAAaA,EAAWszB,IAAM,SAAO,MAQ5CtzB,EAEOolB,kBAAR,WAEE/b,KAAKT,IAAI,wBACTS,KAAKwb,IAAI6C,QAAQ3lB,EAAOK,kBAAA,GACxBiH,KAAK+5B,gBAAgB5F,qBACrBn0B,KAAK8iE,gBAAA,EACL9iE,KAAKs6B,cAAgBt6B,KAAKo6B,gBAAkBp6B,KAAK6iE,aAAe,EAChE7iE,KAAK2X,OACH3X,KAAK0iE,YACL1iE,KAAK48B,kBACL58B,KAAK06B,gBACH,KACJ16B,KAAKq8C,SAAWr8C,KAAKyiE,UAAYziE,KAAK26B,oBAAA,CAAqB,EAC5DhkC,EAEO8gD,iBAAR,SACE/tD,EACAoN,GAGA,IFriB2CH,EACvC3Q,EEoiBAqH,GAAA,EACAzH,GAAA,EACJkR,EAAK6gB,OAAOvkB,SAAQ,SAAC1J,GACnB,IAAMoN,EAAQpN,EAAM8uB,WAChB1hB,IACFzJ,EAAMA,IAAuC,IAAhCyJ,EAAM3E,QAAQ,aAC3BvM,EAAQA,IAAyC,IAAhCkR,EAAM3E,QAAQ,aAEnC,IACA6N,KAAK+iE,iBAAmB11E,GAAOzH,KF1iB/B,mBADoB,OAFhBI,EAAeu7E,OAEZ,OAAa5qE,EAAZ3Q,EAAcS,gBAAA,EAAfkQ,EAAmDqmD,aE4iBtDh9C,KAAK+iE,kBACP/iE,KAAKT,IACH,0EAIJS,KAAK2X,OAAS7gB,EAAK6gB,OACnB3X,KAAK26B,oBAAA,CAAqB,EAC3BhkC,EAEOqlB,eAAR,SAAuBtyB,EAA6BoN,GAClD,IAAQH,EAAWqJ,KAAX2X,OACR,GAAKhhB,GAAUqJ,KAAKq7B,QAAUnC,GAA9B,CAGA,IAAMlzC,EAAQ2Q,EAAOG,EAAKmN,SAEvBje,EAAMi3B,SACNj3B,EAAMi3B,QAAQpW,MAAQ7G,KAAK06B,kBAAoB10C,GAChDga,KAAK0/B,iBAAiB15C,EAAMi3B,YAE5Bjd,KAAKq7B,MAAQzB,GAPf,GASDjjC,EAEOi4B,cAAR,SAAsBllC,EAA4BoN,GAAuB,IAAAH,EAC/D3Q,EAAWga,KAAX2X,OACFtqB,EAAayJ,EAAKmN,MAClBre,EAAakR,EAAKmmB,QAClBrmB,EAAWhR,EAAW4hB,cAE5B,GAAKxhB,EAAL,CAIAga,KAAKT,IAAG,SACGlS,EAAU,YAAYzH,EAAWyhB,QAAW,IAAAzhB,EAAW4gB,MAAK,KACnE5gB,EAAWmjB,WACE,SAAAnjB,EAAWmjB,WAAA,IAAcnjB,EAAWojB,cAAa,IAC1D,IACG,SAAApjB,EAAWwhB,QAAA,KAAYxhB,EAAW2gB,MAAK,cAAc3P,GAGhE,IAAMW,EAAWvR,EAAOqH,GAClBF,EAAc6S,KAAKytB,aAEvBtgC,GACC6S,KAAKq7B,QAAUjC,IACdp5B,KAAKq7B,QAAUhC,IAEblsC,EAAY8W,QAAUnN,EAAKmN,OAAS9W,EAAY4W,QAClD/D,KAAKyjE,mBAIT,IAAI/rE,EAAU,EACd,GAAI9R,EAAWihB,MAAwB,OAApBlQ,EAAIY,EAAS0lB,UAATtmB,EAAkBkQ,KAAM,KAAA7Y,EAE7C,GADAgS,KAAK88B,gBAAgBl3C,GACjBA,EAAWyiB,kBACb,OAEF3Q,EAAUsI,KAAKw/B,eACb55C,EACA2R,EAAS0lB,QAAA,OAAOjvB,EAChBgS,KAAK06B,sBAAA,EAAL1sC,EAAsBivB,QAE1B,CAWA,GATA1lB,EAAS0lB,QAAUr3B,EACnBoa,KAAK06B,gBAAkBnjC,EAEvByI,KAAKwb,IAAI6C,QAAQ3lB,EAAOoB,cAAe,CACrCmjB,QAASr3B,EACTqe,MAAO5W,IAIL2S,KAAKq7B,QAAUzB,GAAqB,CACtC,GAAI55B,KAAK0/B,iBAAiB95C,GAExB,OAEFoa,KAAKq7B,MAAQnC,EACf,CAEKl5B,KAAK26B,mBAEC/0C,EAAWihB,MACpB7G,KAAKu/B,sBAAsB35C,GAF3Boa,KAAK2/B,iBAAiB/5C,EAAY8R,GAMpCsI,KAAK2xB,MA1DL,MAFE3xB,KAAK7J,KAA8C,yCAAA9I,EAAA,EA6DtDsJ,EAES2lC,4BAAV,SAAsC5yC,GAAsB,IAAAoN,EAClDH,EAAwBjN,EAAxBk+B,KAAM5hC,EAAkB0D,EAAlBszB,KAAM3vB,EAAY3D,EAAZqsC,QACZnwC,EAAWoa,KAAX2X,OACR,GAAK/xB,EAAL,CAMA,IAAMgR,EAAehR,EAAO+Q,EAAKsN,OAC3B1M,EAAUX,EAAaqmB,QAC7B,IAAK1lB,EAKH,OAJAyI,KAAK7J,KAAI,qBACcQ,EAAKkN,GAAE,aAAalN,EAAKsN,MAAK,wCAErDjE,KAAK+5B,gBAAgB1G,eAAe18B,GAGtC,IAAMxJ,EAAayJ,EAAaiuB,WAG1BntB,EAAqBH,EAAQ6O,WAAa7O,EAAQsP,KAClD7Y,EAAkC,OAAnB8I,EAAGH,EAAKkO,kBAAA,EAAL/N,EAAkBhH,KACpC/B,EAAaiS,KAAK4jE,eAAehtE,GAIjC/I,EAAcmS,KAAKg6B,WACvBh6B,KAAKg6B,YACL,IAAIwZ,GACFxzC,KAAKwb,IACLN,GACAlb,KAAK42C,wBAAwBhtD,KAAKoW,MAClCA,KAAKi+B,uBAAuBr0C,KAAKoW,OAE/BjT,EAAY/G,EAAOA,EAAK+f,OAAS,EACjCjY,GAAyB,IAAff,EACVgiB,EAAY,IAAI6lB,GACpBj+B,EAAKsN,MACLtN,EAAKkN,GACLlN,EAAK+N,MAAMvC,WACX9U,EAAQ4d,WACRle,EACAe,GAEIV,EAAU4S,KAAK66B,QAAQlkC,EAAKuN,IAElCrW,EAAW4c,KACTpd,EACAW,EACAD,EACAZ,EACAwJ,EACA3Q,EACAuR,EAAQiQ,cACR9P,EACAqX,EACA3hB,EAjDF,MAJE4S,KAAK7J,KAAI,mEAC4DQ,EAAKkN,GAAE,aAAalN,EAAKsN,MAAK,0BAsDtGtN,EAEOm/C,sBAAR,SACEpsD,EACAoN,GAGA,IAAMH,EAAeqJ,KAAKq8C,SAK1B,IAJmBvlD,EAAKhL,IAIT,CACb,GAAIkU,KAAKm6B,cAAgBn6B,KAAKkhB,MAAO,CACnClhB,KAAKT,IACH,iFAEFS,KAAKm6B,YAAcn6B,KAAKkhB,MACxB,IAAMl7B,EAAcga,KAAKytB,YAErBznC,IACFga,KAAKT,IAAI,4DACTvZ,EAAYmf,gBACZnF,KAAK+5B,gBAAgB1G,eAAertC,IAGtCga,KAAKo7B,kBAELp7B,KAAKg8B,mBACP,MAAWh8B,KAAKyiE,WAEdziE,KAAKo7B,kBAEP,IAAM/tC,EAAM2S,KAAKwb,IAEb7kB,IACFtJ,EAAIgxB,QAAQ3lB,EAAOW,gBAAiB,CAClC6oB,YAAa,EACbC,UAAWjqB,OAAO2oB,kBAClBl5B,KAAM,OAERqY,KAAK+5B,gBAAgB5F,sBAEvB9mC,EAAIgxB,QAAQ3lB,EAAOyB,qBAAsBrD,EAC3C,GACDH,EAEOssE,qBAAR,SACEv5E,EACAoN,GAEA,IAAMH,EAAUG,EAAK6K,GACf3b,IAAaga,KAAKwb,IAAI0B,YAAYvmB,GAAS7K,IACjD,GAAI9F,EAAU,CACZ,IAAMqH,EAAc2S,KAAKk1C,YAErB7nD,GAAe2S,KAAKm6B,cAAgB9sC,IACtC2S,KAAKT,IACH,sFAEFS,KAAKm6B,YAAc9sC,EAEvB,CACA2S,KAAKq8C,SAAWr2D,EAChBga,KAAK2xB,MAAA,EACNh7B,EAEOs/C,gBAAR,SACEvsD,EACAoN,GAEA,IACIH,EACA3Q,EAFEqH,EAASyJ,EAAKy1B,OAGhB3mC,GAAA,EACJ,IAAK,IAAMgR,KAAQvJ,EAAQ,CACzB,IAAMkK,EAAQlK,EAAOuJ,GACrB,GAAiB,SAAbW,EAAMoK,IAIR,GAHA3b,EAAO4Q,EACPD,EAAaY,EAEA,UAATX,EAAkB,CACpB,IAAMzJ,EAAaE,EAAOuJ,GACtBzJ,IACF6S,KAAKk1C,YAAc/nD,EAAW4d,OAElC,OAEAnlB,GAAA,CAEJ,CACIA,GAAa+Q,GACfqJ,KAAKT,IAC2B,8BAAAvZ,EAAA,+CAEhCga,KAAKm6B,YAAcxjC,EAAWoU,QAE9B/K,KAAKm6B,YAAcn6B,KAAKkhB,KAAA,EAE3BvqB,EAEO+3B,eAAR,SAAuBhlC,EAA6BoN,GAClD,IAAQH,EAAeG,EAAf8wB,KAAM5hC,EAAS8Q,EAATkmB,KACd,IAAIrmB,GAAQA,EAAKhP,OAASuzB,GAA1B,CAGA,GAAIlb,KAAKq8B,mBAAmB1lC,GAW1B,OARAqJ,KAAK7J,KAAI,YACKQ,EAAKkN,IAAK7d,EAAO,OAASA,EAAK+f,MAAQ,IAAE,aACnDpP,EAAKsN,MACyC,gDAAAjE,KAAKq7B,YAEnDr7B,KAAKq7B,QAAU7B,KACjBx5B,KAAKq7B,MAAQnC,KAIjB,IAAM7rC,EAAQrH,EAAOA,EAAK0e,MAAQ/N,EAAK+N,MACvC1E,KAAK6iE,aAAevqE,KAAKwU,MACtB,EAAIzf,EAAM6U,OAAU7U,EAAMqV,UAAUF,IAAMnV,EAAMgV,QAAQE,QAE3C,gBAAZ5L,EAAKkN,KACP7D,KAAK85B,aAAenjC,GAEtBqJ,KAAKo9B,qBAAqBzmC,EAAM3Q,EArBhC,GAsBD2Q,EAEOunB,QAAR,SAAgBx0B,EAAqBoN,GAAiB,IAAAH,EACpD,GAAIG,EAAK6nB,MACP3e,KAAKq7B,MAAQ3B,QAGf,OAAQ5iC,EAAKmmB,SACX,KAAKxgB,EAAa4B,SAClB,KAAK5B,EAAa2B,mBAClB,KAAK3B,EAAa0B,mBAClB,KAAK1B,EAAawB,gBAClB,KAAKxB,EAAayB,kBAClB,KAAKzB,EAAa8B,eAClB,KAAK9B,EAAa+B,iBAChBwB,KAAK4/B,yBAAyB1kB,GAAwBpkB,GACtD,MACF,KAAK2F,EAAagB,iBAClB,KAAKhB,EAAaiB,mBAClB,KAAKjB,EAAakB,oBAGb7G,EAAKixB,YACN/nB,KAAKq7B,QAAUzB,KACf,OAAAjjC,EAAAG,EAAK5M,cAAA,EAALyM,EAAchP,QAASozB,KAEvB/a,KAAKq7B,MAAQnC,IAEf,MACF,KAAKz8B,EAAakC,oBAClB,KAAKlC,EAAaqC,kBAChB,IAAKhI,EAAKgoB,QAA0B,SAAhBhoB,EAAKgoB,OACvB,OAEF,GAAIhoB,EAAKmmB,UAAYxgB,EAAakC,oBAEhC,YADAqB,KAAKg8B,oBAGHh8B,KAAK+/B,2BAA2BjpC,IAClCkJ,KAAK+8B,gBAAgB,EAAG7kC,OAAO2oB,mBAEjC,MACF,KAAKpkB,EAAawC,mBAChBe,KAAKmgC,mBAAmBrpC,GAK9B,EAEAH,EACQusE,YAAR,WACE,IAAQx5E,EAAyBsW,KAAzBkhB,MAAOpqB,EAAkBkJ,KAAlBuiE,cACf,GAAK74E,GAAUoN,GAAkBpN,EAAMuI,WAAvC,CAKA,GAAI+N,KAAKu6B,iBAAmBlG,GAAaE,YAAY7qC,GAAO3D,OAAQ,CAElE,IAAM4Q,EAAaqJ,KAAKq7B,QAAUnC,GAAal5B,KAAKytB,YAAc,KAClE32B,EAAckrE,KAAKhiE,KAAKo6B,gBAAiBzjC,EAC3C,CAEAqJ,KAAKo6B,gBAAkB1wC,EAAMg5B,WAR7B,GASD/rB,EAEOqsE,2BAAR,WACEhjE,KAAKq7B,MAAQnC,GAGRl5B,KAAKu6B,iBACRv6B,KAAK26B,oBAAA,EACL36B,KAAKq6B,iBAAmBr6B,KAAKs6B,eAE/Bt6B,KAAKkyB,eAAA,EACNv7B,EAEOu/C,gBAAR,SACExsD,EAA4BoN,GAE5B,IADEH,EAAIG,EAAJnP,KAEF,GACEgP,IAASgM,GACR3C,KAAKyiE,YAAcziE,KAAKq8C,SACzB,CACA,IAAMr2D,GACH2Q,IAASiM,EACN5C,KAAKk1C,YACLl1C,KAAKm6B,cAAgBn6B,KAAKkhB,MAChClhB,KAAKggC,mBAAmBh6C,EAAa2Q,EAAMukB,IAC3Clb,KAAK2xB,MACP,GACDh7B,EAEOk4B,gBAAR,SACEnlC,EACAoN,GAEIkJ,KAAKiE,OAAS,GAAKjE,KAAKytB,cAC1BztB,KAAKiE,MAAQjE,KAAKytB,YAAYxpB,OAEhCjE,KAAK2X,OAAS7gB,EAAK6gB,MAAA,EACpBhhB,EAEMktE,eAAP,WACE7jE,KAAKsiE,gBAAkBtiE,KAAKsiE,cAC9B,EAEA3rE,EAGU4mC,eAAV,WACE,IAAQ7zC,EAAUsW,KAAVkhB,MACR,GAAKx3B,EAAL,CAGA,IAAMoN,EAAcpN,EAAMg5B,YACtB/rB,EAAgBqJ,KAAKs6B,cAGzB,GAAI3jC,GAAiB,GAAKG,EAAcH,EAAe,CACrD,GAAIjN,EAAM2sD,QAIR,YAHAr2C,KAAKT,IAAG,qBACe5I,EAAa,wBAAwBG,GAI9D,IAAM9Q,EAAWquC,GAAaE,YAAY7qC,GAEpC2D,GADcrH,EAASD,OAASC,EAASsc,MAAM,GAAK,GAC9B3L,EAE1BtJ,EAAQ,IACPA,EAAQ2S,KAAKvQ,OAAOssC,eACnB1uC,EAAQ2S,KAAKvQ,OAAOwsC,0BAEtBj8B,KAAKT,IAAmC,+BAAAlS,EAAA,0BACxCsJ,GAAiBtJ,EACjB2S,KAAKs6B,cAAgB3jC,GAEvBqJ,KAAKT,IAAG,iCAC2B5I,EAAa,sBAAsBG,GAEtEpN,EAAMg5B,YAAc/rB,CACtB,CA5BA,GA6BDA,EAEOitE,eAAR,SAAuBl6E,GACrB,IAAIoN,EAAakJ,KAAKvQ,OAAOknD,mBAAqBjtD,EAAa8uB,WAU/D,OATIxY,KAAKsiE,gBAAkBxrE,IACzBkJ,KAAKT,IAAI,wBAEPzI,GADuC,IAArCA,EAAW3E,QAAQ,aACR,YAEA,aAIV2E,CAAA,EACRH,EAEO2sE,qBAAR,SAA6B55E,EAAgBoN,GAAc,IAAAH,EAAA,KACzDjN,EAAKib,aAAA,EACL3E,KAAKo8B,YAAY1yC,EAAMoN,GAAO41B,MAAK,SAAC1mC,GAClC,IAAQqH,EAAQsJ,EAAR6kB,IACR,GAAKx1B,IAAQ2Q,EAAK0lC,mBAAmB3yC,GAArC,CAGAoN,EAAMguB,cAAgB,EACtBnuB,EAAK0kC,MAAQnC,GACbviC,EAAKgkC,oBAAA,EACLhkC,EAAKgO,aAAA,EACL,IAAM/e,EAAQ8D,EAAKgb,MAEnB9e,EAAM6c,QAAQH,MACZ1c,EAAM6c,QAAQD,IACd5c,EAAM8c,UAAUJ,MAChB1c,EAAM8c,UAAUF,IACd9C,KAAKoe,YAAY1U,MACrB/b,EAAIgxB,QAAQ3lB,EAAOuC,YAAajV,GAChC0D,EAAKib,aAAA,CAbL,CAcF,KACDhO,EAEOigD,wBAAR,SAAgCltD,GAAkC,IAAAoN,EAC1DH,EAAK,OACH3Q,EAAQga,KAARwb,IACAnuB,EAA2B3D,EAA3BmoD,YAAajsD,EAAc8D,EAAd60C,UAEf3nC,EAAUoJ,KAAKk+B,kBAAkBt4C,GACvC,GAAKgR,EAAL,CAIA,IAAQW,EAAsBX,EAAtBgxB,KAAMz6B,EAAgByJ,EAAhBomB,KAAMtlB,EAAUd,EAAVqN,MACZjW,EAAkCX,EAAlC4Y,MAAOlY,EAA2BV,EAA3BogB,KAAM5f,EAAqBR,EAArBmgB,IAAKzgB,EAAgBM,EAAhBwX,YAClB/W,EAAY4J,EAAZulB,QAEFlO,EAAQ/O,KAAKq8C,cAAA,EAAuBhvD,EAAY2Y,MAItD,GAAIhG,KAAKq8B,mBAAmB9kC,GAC1ByI,KAAK+5B,gBAAgB1G,eAAe97B,OADtC,CAOA,GAFAyI,KAAKq7B,MAAQ9B,GAETxsC,EAAa,CACf,GAAe,MAAXA,GAAAA,EAAaw/B,OAAQ,CACvB,IAAMn/B,EAAcmK,EAAKsN,aAAetN,EACxCyI,KAAK82C,mBACHp/C,EACA3K,EAAYw/B,OACZn/B,EACAxH,GAEFI,EAAIq4B,QAAQ3lB,EAAOyC,0BAA2B,CAC5CysB,KAAMx6B,EACNuU,GAAAhL,EACA41B,OAAQx/B,EAAYw/B,QAExB,CAGA,IAAM/+B,EAAUT,EAAY8tC,QACtBziC,EAAYrL,EAAYshB,UAC1B7Z,EAAgBhH,KAClBwS,KAAK66B,QAAQtjC,EAAK2M,IAAM,CAAE69B,SAAUv0C,EAAS6gB,UAAAjW,GAC7CpS,EAAIq4B,QAAQ3lB,EAAOoC,eAAgB,CAAE8sB,KAAArwB,EAAMoK,GAAAhL,EAAIkkC,QAAArtC,EAAS6gB,UAAAjW,IAE5D,CAGA,GAAIpK,GAASF,GAAuB,gBAAZyJ,EAAKsM,GAAsB,CACjD,IAAMrL,EAAW1K,EAAQ2Y,UAAUlP,EAAKsM,GAAK,EAAI/V,EAAQuZ,SACnDlL,EAAkB5E,EAAKsM,KAAO/V,EAAQuZ,QACtC5K,GAA0BjE,GAAYjB,EAAK2M,GAAK1L,EAAS0L,GAC/D,IAAI,IAAA7W,EAAYyY,YAAuB,CACrC,IAAQ1G,EAAuCpR,EAAvCmW,SAAUnX,EAA6BgB,EAA7BoW,OAAQve,EAAqBmI,EAArBqW,SAAU1E,EAAW3R,EAAXsW,OACpC,GAAInX,EACFA,EAAKgW,kBAAkBnV,EAAMrG,MAAQ,CACnCwc,SAAA/E,EACAgF,OAAApX,EACAqX,SAAAxe,EACAye,OAAA3E,QAWF,GAPE3R,EAAM8gD,eACN9gD,EAAM8X,aACW,IAAjBlgB,EAAU+b,KACTlF,IAEDuD,KAAK8iE,gBAAA,GAEH90E,EAAMwwC,SAAWxwC,EAAM8X,YAAa,CAGtC,IAAMrG,EAAaO,KAAKojE,uBAClBxjE,GACHH,EAAaA,EAAW+C,IAAMxC,KAAK0+B,mBACpC1+B,KAAKvQ,OAAOssC,cACRl8B,EAAY7R,EAAM+gD,iBACpB/gD,EAAM+gD,iBACN3vC,EACJ,IACGjD,GACDyD,EAAmBC,EAAYG,KAAKvQ,OAAOssC,gBAC1Ct/B,EAGD,YADAuD,KAAK8jE,UAAUvsE,GAENkF,IAETlF,EAAKwN,KAAA,GAGPxN,EAAK6N,wBACHpX,EAAMrG,KACN4P,EAAK+K,MACLtV,EACAuK,EAAK+K,MACL3C,GAAA,EAGJ,MAAWxD,GAAmBiD,ED1oCN,IC4oCtB7H,EAAKwN,KAAA,GAGTxN,EAAK6N,wBACHpX,EAAMrG,KACNyX,EACApS,EACAnH,EACA8Z,GAEEK,KAAK48B,oBACP58B,KAAK48B,kBAAoBrlC,GAE3ByI,KAAKo+B,mBACHpwC,EACAuJ,EACApK,EACAvH,EACAuW,GAAmBM,EAEvB,KAAO,KAAIN,IAAmBM,EAK5B,YADAuD,KAAK8jE,UAAUvsE,GAFfA,EAAKwN,KAAA,CAIP,CACF,CAEA,GAAIgK,EAAO,CACT,IAAQjP,EAAuCiP,EAAvC5K,SAAU5P,EAA6Bwa,EAA7B3K,OAAQpD,EAAqB+N,EAArB1K,SAAUpD,EAAW8N,EAAXzK,OAChCnX,IACFA,EAAKgW,kBAAkBR,GAA+B,CACpDwB,SAAArE,EACAsE,OAAA7P,EACA8P,SAAArD,EACAsD,OAAArD,IAGJ1J,EAAK6N,wBACHzC,EACA7C,EACAvL,EACAyM,EACAC,GAEFjB,KAAKo+B,mBAAmBrvB,EAAOxX,EAAMpK,EAAMvH,EAC7C,CAEA,GAAIkI,GAAc,MAAHD,GAAY,OAATiJ,EAAHjJ,EAAKyhB,UAALxY,EAAc/Q,OAAQ,CACnC,IAAMgc,EAAsC,CAC1CJ,GAAAhL,EACAixB,KAAArwB,EACA0lB,QAAAnvB,EACAwhB,QAASzhB,EAAIyhB,SAEftpB,EAAIq4B,QAAQ3lB,EAAO2C,sBAAuB0G,EAC5C,CACA,GAAIjU,GAAWC,EAAM,CACnB,IAAM6U,EAAuC,CAC3CjB,GAAAhL,EACAixB,KAAArwB,EACA0lB,QAAAnvB,EACAwhB,QAASvhB,EAAKuhB,SAEhBtpB,EAAIq4B,QAAQ3lB,EAAO0C,sBAAuBwH,EAC5C,CAtJA,CAZA,MAFE5C,KAAKigC,wBAAwBr6C,EAAA,EAqKhC+Q,EAEOmgD,mBAAR,SACEptD,EACAoN,EACAH,EACA3Q,GACA,IAAAqH,EAAA,KACA,GAAI2S,KAAKq7B,QAAU9B,GAAnB,CAIAv5B,KAAKyiE,YAAc3rE,EAAOkP,QAAUlP,EAAOmP,MAGvCjG,KAAKq8C,WAAar8C,KAAKyiE,kBAClB3rE,EAAOkP,MAGhB,IAAQpgB,EAA6BkR,EAA7BkP,MAAOpP,EAAsBE,EAAtBmP,MAAO1O,EAAeT,EAAfoP,WACtB,GAAItgB,EAAO,CACT,IAAIuH,EAAazD,EAAa8uB,WACxB9gB,EAAKlM,UAAUC,UAAU6H,cAC/B,GAAI0M,KAAK+iE,iBAAkB,CACrB51E,IAEAA,GADuC,IAArCA,EAAWgF,QAAQ,aACR,YAEA,aAMjB,IAAMnE,EAAgBpI,EAAMspD,SAE1BlhD,GACA,iBAAkBA,GACoB,KAArCA,EAAcu0C,cAAgB,KACJ,IAA3B7qC,EAAGvF,QAAQ,aAEXhF,EAAa,YAEjB,CAGEA,IACqC,IAArCA,EAAWgF,QAAQ,eACQ,IAA3BuF,EAAGvF,QAAQ,YACS,eAApBvM,EAAMk+C,YAGN32C,EAAa,YACb6S,KAAKT,IAAqC,iCAAApS,IAExCzD,EAAa8uB,YAAc9uB,EAAa8uB,aAAerrB,GACzD6S,KAAKT,IAC+B,kCAAA7V,EAAa8uB,WAAU,UAAUrrB,EAAU,KAGjFvH,EAAMmxD,WAAa5pD,EACnBvH,EAAM+b,GAAK,OACX3B,KAAKT,IAED,gCAAA3Z,EAAMk+C,UAAS,qCACmB32C,GAAc,SAChDzD,EAAa8uB,YAAc,QACzB5yB,EAAMqpB,MAAK,IAEnB,CACIrY,IACFA,EAAMmgD,WAAartD,EAAam7B,WAChCjuB,EAAM+K,GAAK,OACX3B,KAAKT,IAAG,gCAEJ3I,EAAMktC,UACmB,4BAAAp6C,EAAam7B,YAAc,IAAE,IACtDjuB,EAAMqY,MAAA,MAIR1X,GACFyI,KAAKT,IACkC,qCAAAhI,EAAWusC,UAAS,2BAA2Bp6C,EAAa0nC,OAAU,IAAA75B,EAAW0X,MAAA,KAG1HjP,KAAKwb,IAAI6C,QAAQ3lB,EAAOM,cAAelC,GAEvCtQ,OAAOP,KAAK6Q,GAAQ1D,SAAQ,SAAC1J,GAC3B,IACM9D,EADQkR,EAAOpN,GACKmb,YACX,MAAXjf,GAAAA,EAAaqlB,YACf5d,EAAKmuB,IAAI6C,QAAQ3lB,EAAOQ,iBAAkB,CACxCvR,KAAM+B,EACNoG,KAAMlK,EACNgiC,KAAAjxB,EACAqmB,KAAM,KACNuhB,UAAAv4C,EACA84B,OAAQnoB,EAAKhP,MAGnB,IAEAqY,KAAKkyB,eA7FL,GA8FDv7B,EAEMysE,qBAAP,WACE,OAAOpjE,KAAK08B,iBACV18B,KAAKm6B,YAAcn6B,KAAKm6B,YAAcn6B,KAAKkhB,MAC3ChG,GAAA,EAEHvkB,EAEOmtE,UAAR,SAAkBp6E,GAChBsW,KAAK8iE,gBAAA,EAEL9iE,KAAK48B,kBAAoBlzC,EACzBsW,KAAKo7B,kBACLp7B,KAAKy+B,eAAe/0C,GACpBsW,KAAK+5B,gBAAgB1G,eAAe3pC,GACpCsW,KAAK85B,aAAe,KACpB95B,KAAKq6B,iBAAmB3wC,EAAK4Y,MAC7BtC,KAAKq7B,MAAQnC,EAAA,EACdviC,EAEOwsE,qBAAR,WACE,IAAMz5E,EAAQsW,KAAKkhB,MACfpqB,EAAsC,KAC1C,GAAIpN,GAASA,EAAMuI,WAAa,IAAK,IAAAvI,EAAM2sD,QAAmB,CAC5D,IAAM1/C,EAAcjN,EAAMg5B,YAkB1B,GAVI2R,GAAaC,WAAW5qC,EAAOiN,GACjCG,EAAqBkJ,KAAK8yB,gBAAgBn8B,GACjC09B,GAAaC,WAAW5qC,EAAOiN,EAAc,MAMtDG,EAAqBkJ,KAAK8yB,gBAAgBn8B,EAAc,KAEtDG,EAAoB,CACtBkJ,KAAK48B,kBAAoB,KACzB,IAAM52C,EAAcga,KAAK0iE,YACnBr1E,EAAmByJ,EAAmBmN,MAEzCje,GACD8Q,EAAmB+M,KAAO7d,EAAY6d,IACtC7d,EAAYie,QAAU5W,IAEtB2S,KAAK0iE,YAAc5rE,EACnBkJ,KAAKwb,IAAI6C,QAAQ3lB,EAAO8C,aAAc,CAAEosB,KAAM9wB,IACzC9Q,GAAeA,EAAYie,QAAU5W,GACxC2S,KAAKwb,IAAI6C,QAAQ3lB,EAAOiB,eAAgB,CACtCsK,MAAO5W,IAIf,CACF,GACDuJ,EAAAE,EAAA,EAAAjQ,IAAA,YAAAia,IAED,WACE,IAAMpX,EAAOsW,KAAK+jE,iBAClB,OAAIr6E,EACKA,EAAKua,OAEN,CACV,GAAC,CAAApd,IAAA,cAAAia,IAED,WACE,IAAMpX,EAAQsW,KAAKkhB,MACnB,OAAIx3B,EACKsW,KAAK0iE,aAAe1iE,KAAK8yB,gBAAgBppC,EAAMg5B,aAEjD,IACT,GAAC,CAAA77B,IAAA,yBAAAia,IAED,WACE,IAAMpX,EAAQsW,KAAKkhB,MACnB,GAAIx3B,EAAO,CACT,IAAMoN,EAAcpN,EAAMg5B,YACpB/rB,EAAOqJ,KAAKgkE,YAClB,GACErtE,GACAnC,EAAgBsC,IAChBtC,EAAgBmC,EAAKgN,iBACrB,CACA,IAAM3d,EACH2Q,EAAKgN,gBAA0D,KAA5B7M,EAAcH,EAAK2L,OACzD,OAAO,IAAIf,KAAKvb,EAClB,CACF,CACA,OAAO,IACT,GAAC,CAAAa,IAAA,eAAAia,IAED,WACE,IAAMpX,EAAOsW,KAAKgkE,YAClB,OAAIt6E,EACKA,EAAKua,OAEN,CACV,GAAC,CAAApd,IAAA,mBAAAia,IAED,WACE,IAAMpX,EAAOsW,KAAKgkE,YAClB,OAAIt6E,EACKsW,KAAKujE,sBAAsB75E,GAE7B,IACT,GAAC,CAAA7C,IAAA,iBAAAia,IAED,WACE,OAAOd,KAAKwiE,eACd,KAAC1rE,CAAA,CA/4CkB,CACX+iC,ICOWoqC,GAAG,WA+FtB,SAAAv6E,EAAYoN,QAAA,IAAAA,IAAAA,EAAiC,CAAC,GA5F9C,KAGgBrH,YAAA,EAEhB,KAGgBs0B,gBAAA,EAAU,KAElBmgD,oBAAA,EAAc,KACdC,wBAAA,EAAkB,KAClBtJ,SAAA,EAAwB,KACxBuJ,SAA4B,IAAInxB,GAAc,KAC9CoxB,mBAA6B,EAAC,KAC9BC,cAA2B,KAAI,KAC/BnG,mBAAA,EAAa,KACbC,sBAAA,EAAgB,KAChBC,wBAAA,EAAkB,KAClBkG,uBAAA,EAAiB,KACjBC,qBAAA,EAAe,KACfrX,sBAAA,EAAgB,KAChBuS,0BAAA,EAAoB,KACpBF,6BAAA,EAAuB,KACvBG,mBAAA,EAAa,KACbC,oBAAA,EAAc,KACd6E,OAAkC,KAAI,KACtC34E,IAAqB,KAAI,KACzB44E,yBAAA,EAiENjlE,EAAW3I,EAAWwI,QAAA,EAAgB,gBACtC,IAAM3I,EAAUqJ,KAAKvQ,OL4ZlB,SACL/F,EACAoN,GAEA,IACGA,EAAWgtB,uBACVhtB,EAAW8sB,+BACZ9sB,EAAW+sB,kBAAoB/sB,EAAW6sB,wBAE3C,MAAM,IAAIzsB,MACR,qIAIJ,QAAI,IACFJ,EAAW8sB,mCAAA,IACV9sB,EAAWgtB,uBACVhtB,EAAW8sB,6BACT9sB,EAAWgtB,uBAEf,MAAM,IAAI5sB,MACR,qGAIJ,QAAI,IACFJ,EAAW6sB,8BAAA,IACV7sB,EAAW+sB,kBACV/sB,EAAW6sB,wBAA0B7sB,EAAW+sB,kBAElD,MAAM,IAAI3sB,MACR,2FAIJ,IAAMP,EAAempE,GAAQp2E,GAIvB2D,EAAqB,CACzB,UACA,WACA,aACA,mBA4CF,MAjD+B,CAAC,WAAY,QAAS,QAO9B+F,SAAQ,SAAC1J,GAC9B,IAAM1D,GAAyB,UAAT0D,EAAmB,WAAaA,GAAgB,aAChE9D,OAAA,IAAekR,EAAW9Q,GAC1B4Q,EAAmB,GACzBvJ,EAAmB+F,SAAQ,SAAC/F,GAC1B,IAAMkK,EAAuB7N,EAAI,UAAU2D,EACrCF,EAAQ2J,EAAWS,GACzB,QAAI,IAAApK,GAAuBvH,EAAc,CACvCgR,EAAO6T,KAAKlT,GACZ,IAAMG,EAAyBf,EAAa3Q,GAAY4oB,QAExD,OADA9X,EAAW9Q,GAAc,CAAE4oB,QAASlX,GAC5BrK,GACN,IAAK,UACHqK,EAAS2lB,cAAgBlwB,EACzBuK,EAAS0lB,qBAAuBjwB,EAChC,MACF,IAAK,WACHuK,EAASqlB,WAAYS,YAAcrwB,EACnCuK,EAASolB,aAAcU,YAAcrwB,EACrC,MACF,IAAK,aACHuK,EAASqlB,WAAYW,aAAevwB,EACpCuK,EAASolB,aAAcY,aAAevwB,EACtC,MACF,IAAK,kBACHuK,EAASqlB,WAAYa,gBAAkBzwB,EACvCuK,EAASolB,aAAcc,gBAAkBzwB,EAG/C,CACF,IACIyJ,EAAO7Q,QACT6Z,EAAOzJ,KACc,mBAAAS,EAAOqB,KACxB,QACD,qCAAqCjS,EAAgB,MAAA06B,KAAKC,UACzD7pB,EAAW9Q,IAInB,IAEAA,EAAAA,EACK,GAAA2Q,GACAG,EAEP,CA3FO,CK5ZuCpN,EAAIi7E,cAAe7tE,GAC7DkJ,KAAK+jB,WAAajtB,EAEdH,EAAOonC,aLsgBR,SAA6Br0C,GAClC,IAAMoN,EAAgBpN,EAAOqa,OACzBjN,IAAkB+lE,IAAe/lE,IAAkBilE,IAErDn8D,EAAOL,IACL,yEAEF7V,EAAOq0C,aAAA,GHrpBJ,WACL,GAEEr+B,KAAK09D,OACL19D,KAAKu9D,iBACLv9D,KAAKklE,gBACLllE,KAAKi+D,QAEL,IAEE,OADA,IAAIj+D,KAAKklE,eAAe,CAAC,IAAD,CAEzB,CAAC,MAAOl7E,GACP,CAGJ,OAAO,CACT,CAhBO,KGypBDA,EAAOqa,OAAS84D,GAChBnzE,EAAOq0C,aAAA,EACPr0C,EAAO2uC,mBAAA,EACPz4B,EAAOL,IAAI,8DAGjB,CKthBMslE,CAAoBluE,GAItB,IACiBtJ,EAKbsJ,EALFwnE,cACkBv4E,EAIhB+Q,EAJFynE,iBACoBxnE,EAGlBD,EAHF0nE,mBACiB9mE,EAEfZ,EAFF2nE,gBACenxE,EACbwJ,EADF4nE,cAEI7mE,EAAkB,IAAIH,EAAsByI,MAC5ChS,EAAiBgS,KAAKm+D,cAAgB,IAAI9wE,EAAoB2S,MAC9DjS,EAAoBiS,KAAKo+D,iBAC7B,IAAIx4E,EAAuBoa,MACvBnS,EAAsBmS,KAAKq+D,mBAC/B,IAAIznE,EAAyBoJ,MAEzBjT,EAAgB,IAAII,EAAoB6S,MACxClS,EAAiB,IAAIytB,GAAevb,MACpC+O,EAAqB,IAAIiS,GAAmBhhB,MAE5C5S,EAAkCuJ,EAAOkpE,0BAEzCryE,EAAkBJ,EACpB,IAAIA,EAAgC4S,MACpC,KACExL,EAAmBwL,KAAKwkE,gBAAkB,IAAIzE,GAClD//D,KACAxS,GAGI4K,EAAkB,IAAIm6B,GAAgBvyB,MACtCxH,EAAY,IAAIwoE,GAAUhhE,KAAKvQ,QAC/B0M,EAAoB6D,KAAKmtD,iBAAmB,IAAIkV,GACpDriE,KACA5H,EACAI,GAIF3K,EAAmBu/D,oBAAoBjxD,GAEvCpP,EAAcqgE,oBAAoBjxD,GAElC,IAAMM,EAA4C,CAChD3O,EACA0G,EACA2H,GAEE3O,GACFiP,EAAmByU,OAAO,EAAG,EAAG1jB,GAGlCwS,KAAKmkE,mBAAqB1nE,EAC1B,IAAM2C,EAAiC,CACrCpR,EACAD,EACAF,EACAd,EACAgiB,EACA3W,GAGF4H,KAAK0/D,qBAAuB1/D,KAAK8kE,iBAC/BnuE,EAAO+oE,qBACPjjE,GAEF,IAAMzP,EAA6B2J,EAAO8oE,sBACtCzyE,GACFyP,EAAmBgO,KACjB,IAAIzd,EAA2BgT,KAAM5H,EAAiBI,IAI1DwH,KAAKw/D,wBAA0Bx/D,KAAK8kE,iBAClCnuE,EAAO6oE,wBACP/iE,GAEF,IAAM5W,EAAgC8Q,EAAO4oE,yBACzC15E,GACF4W,EAAmBgO,KACjB,IAAI5kB,EAA8Bma,KAAM5H,EAAiBI,IAG7DwH,KAAK8kE,iBAAiBnuE,EAAO4uD,mBAAoBnmD,GACjD5G,EAAUmnE,cAAgB3/D,KAAK2/D,cAAgB3/D,KAAK8kE,iBAClDnuE,EAAOgpE,cACPvgE,GAEFY,KAAK4/D,eAAiB5/D,KAAK8kE,iBACzBnuE,EAAOipE,eACPxgE,GAEFY,KAAKukE,kBAAoBvkE,KAAK8kE,iBAC5BriD,GACArjB,GAGFY,KAAKkkE,eAAiB9kE,EAItB3C,EAAmBgO,KAAK/S,GACxB,IAAMiI,EAAajI,EAAgB6vB,WACT,mBAAf5nB,GACTK,KAAK8b,GAAGpjB,EAAOkD,MAAO+D,EAAYjI,EAEtC,CAzKAhO,EAGOq7E,eAAP,WACE,OAAOrD,IACT,EAEAh4E,EAGOunB,YAAP,WACE,OH1EG,WACL,IAAKywD,KACH,OAAO,EAGT,IAAMh4E,EAAc2oB,KACpB,MAC0C,mBAAjC,MAAA3oB,OAAA,EAAAA,EAAa8sB,mBACnB,CAAC,wBAAyB,gBAAiB,iBAAiBF,MAC3D,SAACxf,GAAuB,OACtBpN,EAAY8sB,gBACVC,GAAiB3f,EAAyB,cAG9C,CAAC,YAAa,QAAQwf,MAAK,SAACxf,GAAsB,OAChDpN,EAAY8sB,gBACVC,GAAiB3f,EAAwB,SAE7C,IAEN,CApBO,EG2EL,EAEApN,EAGOs7E,eAAP,WACE,OAAO3yD,IAAA,EAuJR,IAAAvb,EAAApN,EAAAjD,UAxHA,OAwHAqQ,EAEDguE,iBAAA,SAAiBp7E,EAAiBoN,GAChC,GAAIpN,EAAiB,CACnB,IAAMiN,EAAqB,IAAIjN,EAAgBsW,MAI/C,OAHIlJ,GACFA,EAAW2T,KAAK9T,GAEXA,CACT,CACA,OAAO,IACT,EAEAG,EACAglB,GAAA,SACEpyB,EACAoN,EACAH,QAAA,IAAAA,IAAAA,EAAmBqJ,MAEnBA,KAAKokE,SAAStoD,GAAGpyB,EAAOoN,EAAUH,EAAA,EACnCG,EAEDs7C,KAAA,SACE1oD,EACAoN,EACAH,QAAA,IAAAA,IAAAA,EAAmBqJ,MAEnBA,KAAKokE,SAAShyB,KAAK1oD,EAAOoN,EAAUH,EAAA,EACrCG,EAED+7C,mBAAA,SAAiDnpD,GAC/CsW,KAAKokE,SAASvxB,mBAAmBnpD,EAAA,EAClCoN,EAEDslB,IAAA,SACE1yB,EACAoN,EACAH,EACA3Q,QAAA,IADA2Q,IAAAA,EAAmBqJ,MAGnBA,KAAKokE,SAAShoD,IAAI1yB,EAAOoN,EAAUH,EAAS3Q,EAAA,EAC7C8Q,EAED47C,UAAA,SAAwChpD,GACtC,OAAOsW,KAAKokE,SAAS1xB,UAAUhpD,EAAA,EAChCoN,EAED2rC,KAAA,SACE/4C,EACAoN,EACAH,GAEA,OAAOqJ,KAAKokE,SAAS3hC,KAAK/4C,EAAOoN,EAAMH,EAAA,EACxCG,EAEDunB,QAAA,SACE30B,EACAoN,GAEA,GAAIkJ,KAAKvQ,OAAO6P,MACd,OAAOU,KAAKyiC,KAAK/4C,EAAOA,EAAOoN,GAE/B,IACE,OAAOkJ,KAAKyiC,KAAK/4C,EAAOA,EAAOoN,EAChC,CAAC,MAAOA,GAUP,GATA8I,EAAO1K,MACL,mDACExL,EACA,qBACAoN,EAAMlB,QACN,2BACFkB,IAGGkJ,KAAK0kE,oBAAqB,CAC7B1kE,KAAK0kE,qBAAA,EACL,IAAM/tE,EAAQjN,IAAUgP,EAAOkD,MAC/BoE,KAAKqe,QAAQ3lB,EAAOkD,MAAO,CACzBjU,KAAMwU,EAAWK,YACjBygB,QAASxgB,EAAawC,mBACtB0f,MAAAhoB,EACAypC,MAAA12C,EACAwL,MAAA4B,IAEFkJ,KAAK0kE,qBAAA,CACP,CACF,CAEF,OAAO,GACR5tE,EAED67C,cAAA,SAA4CjpD,GAC1C,OAAOsW,KAAKokE,SAASzxB,cAAcjpD,EACrC,EAEAoN,EAGA2lB,QAAA,WACE7c,EAAOL,IAAI,WACXS,KAAKqe,QAAQ3lB,EAAOmD,gBAAA,GACpBmE,KAAKilE,cACLjlE,KAAK6yC,qBACL7yC,KAAKqkE,mBAAqB,EAC1BrkE,KAAKlU,IAAM,KAEXkU,KAAKmkE,mBAAmB/wE,SAAQ,SAAC1J,GAAS,OAAKA,EAAU+yB,SAAA,IACzDzc,KAAKmkE,mBAAmBp+E,OAAS,EAEjCia,KAAKkkE,eAAe9wE,SAAQ,SAAC1J,GAAS,OAAKA,EAAU+yB,SAAA,IACrDzc,KAAKkkE,eAAen+E,OAAS,EAE7B,IAAM2D,EAASsW,KAAKvQ,OACpB/F,EAAOsyE,SAAWtyE,EAAOozE,gBAAA,EAEzB98D,KAAK+jB,WAAa,IACpB,EAEAjtB,EAGAouE,YAAA,SAAYx7E,GACVkW,EAAOL,IAAI,eACXS,KAAKykE,OAAS/6E,EACdsW,KAAKqe,QAAQ3lB,EAAOC,gBAAiB,CAAEuoB,MAAOx3B,GAChD,EAEAoN,EAGAmuE,YAAA,WACErlE,EAAOL,IAAI,eACXS,KAAKqe,QAAQ3lB,EAAOG,qBAAA,GACpBmH,KAAKykE,OAAS,IAChB,EAEA3tE,EAGAquE,WAAA,SAAWz7E,GACTsW,KAAK4b,WACL,IAAM9kB,EAAQkJ,KAAKkhB,MACbvqB,EAAeqJ,KAAKlU,IACpB9F,EAAiBga,KAAKlU,IAAM0B,EAAAqJ,iBAChC6I,KAAK/S,SAASZ,KACdrC,EACA,CACEsN,iBAAA,IAGJgJ,KAAKqkE,mBAAqB,EAC1BrkE,KAAKskE,cAAgB,KACrB1kE,EAAOL,IAAkB,cAAAvZ,GAEvB8Q,GACAH,IACCA,IAAiB3Q,GAAiBga,KAAKo+D,iBAAiBviB,oBAEzD77C,KAAKilE,cACLjlE,KAAKklE,YAAYpuE,IAGnBkJ,KAAKqe,QAAQ3lB,EAAOa,iBAAkB,CAAEzN,IAAKpC,GAC/C,EAEAoN,EAOA6kB,UAAA,SAAUjyB,QAAA,IAAAA,IAAAA,GAAyB,GACjCkW,EAAOL,IAAiB,aAAA7V,EAAA,KACxBsW,KAAK66D,SAAA,EACL76D,KAAKu7B,kBACL,IAAK,IAAIzkC,EAAI,EAAGA,EAAIkJ,KAAKmkE,mBAAmBp+E,SAC1Cia,KAAKmkE,mBAAmBrtE,GAAG6kB,UAAUjyB,GAChCsW,KAAK66D,SAAY76D,KAAKmkE,oBAFuBrtE,KAMtD,EAEAA,EAGA8kB,SAAA,WACEhc,EAAOL,IAAI,YACXS,KAAK66D,SAAA,EACL,IAAK,IAAInxE,EAAI,EAAGA,EAAIsW,KAAKmkE,mBAAmBp+E,SAC1Cia,KAAKmkE,mBAAmBz6E,GAAGkyB,YACvB5b,KAAK66D,SAAY76D,KAAKmkE,oBAFwBz6E,KAMtD,EAEAoN,EAGAykC,gBAAA,WACE37B,EAAOL,IAAG,oBACVS,KAAKmkE,mBAAmB/wE,SAAQ,SAAC1J,GAC3BA,EAAW6xC,iBACb7xC,EAAW6xC,iBAEf,GACF,EAEAzkC,EAIAwkC,eAAA,WACE17B,EAAOL,IAAG,mBACVS,KAAKmkE,mBAAmB/wE,SAAQ,SAAC1J,GAC3BA,EAAW4xC,gBACb5xC,EAAW4xC,gBAEf,GACF,EAEAxkC,EAGA+sE,eAAA,WACEjkE,EAAOL,IAAI,kBACXS,KAAKmtD,iBAAiB0W,gBACxB,EAEA/sE,EAMAiyB,kBAAA,WACEnpB,EAAOL,IAAI,qBACX,IAAM7V,EAAQsW,KAAKykE,OACnBzkE,KAAKilE,cACDv7E,GACFsW,KAAKklE,YAAYx7E,EAAA,EAEpBoN,EAEDo6B,YAAA,SAAYxnC,GACVsW,KAAKwkE,gBAAgBtzC,YAAYxnC,EACnC,EA2SAoN,EAIO8gD,eAAP,SACEluD,GACsB,IAAAoN,EACtB,OAAO,OAAPA,EAAOkJ,KAAK0/D,2BAAA,EAAL5oE,EAA2B8gD,eAAeluD,EACnD,EACAoN,EAIOyiD,kBAAP,SACE7vD,GACsB,IAAAoN,EAEtB,OAD4B,OAA5BA,EAAI,KAAC0oE,0BAAL1oE,EAA8ByiD,kBAAkB7vD,GACzC,IACT,EAEAkN,EAAAlN,EAAA,EAAA7C,IAAA,SAAAia,IA1TA,WAEE,OADed,KAAKwkE,gBAAgB7sD,QACX,EAC3B,GAEA,CAAA9wB,IAAA,eAAAia,IAGA,WACE,OAAOd,KAAKmtD,iBAAiBoC,YAC/B,EAEAhsD,IAGA,SAAiB7Z,GACfkW,EAAOL,IAAwB,oBAAA7V,GAC/BsW,KAAKwkE,gBAAgBnB,YAAc35E,EACnCsW,KAAKmtD,iBAAiBqW,sBACxB,GAEA,CAAA38E,IAAA,YAAAia,IAGA,WACE,OAAOd,KAAKmtD,iBAAiBiY,SAC/B,EAEA7hE,IAMA,SAAc7Z,GACZkW,EAAOL,IAAqB,iBAAA7V,GAC5BsW,KAAKwkE,gBAAgBnB,YAAc35E,EACnCsW,KAAKmtD,iBAAiBc,iBACxB,GAEA,CAAApnE,IAAA,YAAAia,IAGA,WACE,OAAOd,KAAKwkE,gBAAgBvgE,KAC9B,EAEAV,IAMA,SAAc7Z,GACZkW,EAAOL,IAAqB,iBAAA7V,GAC5BsW,KAAKwkE,gBAAgBnB,YAAc35E,CACrC,GAEA,CAAA7C,IAAA,gBAAAia,IAGA,WACE,OAAOd,KAAKwkE,gBAAgBt7C,aAC9B,EAEA3lB,IAIA,SAAkB7Z,GAChBsW,KAAKwkE,gBAAgBt7C,cAAgBx/B,CACvC,GAEA,CAAA7C,IAAA,aAAAia,IAIA,WACE,OAAOxI,KAAKgN,IAAItF,KAAKwkE,gBAAgB50C,WAAY5vB,KAAKwoB,aACxD,EAEAjlB,IAGA,SAAe7Z,GACbkW,EAAOL,IAAsB,kBAAA7V,GAC7BsW,KAAKwkE,gBAAgB50C,WAAalmC,CACpC,GAEA,CAAA7C,IAAA,aAAAia,IAMA,WACE,IAAMpX,EAAasW,KAAKwkE,gBAAgBtG,WACxC,OAAoB,IAAhBx0E,GAAqBsW,KAAKm+D,cAAchtC,iBAAmB,EACtDnxB,KAAKm+D,cAAchtC,gBAErBznC,CACT,EAEA6Z,IAMA,SAAe7Z,GACbkW,EAAOL,IAAsB,kBAAA7V,IAEX,IAAdA,IACFA,EAAW4O,KAAKgN,IAAI5b,EAAUsW,KAAKwoB,eAGrCxoB,KAAKwkE,gBAAgBtG,WAAax0E,CACpC,GAEA,CAAA7C,IAAA,uBAAAia,IAIA,WACE,OAAOd,KAAKvQ,OAAOm+D,oBACrB,EAEArqD,IAGA,SAAyB7Z,GACvB,IAAMoN,IAA4BpN,EAE9BoN,IAA4BkJ,KAAKvQ,OAAOm+D,uBACtC92D,EACFkJ,KAAKq+D,mBAAmBxQ,gBAExB7tD,KAAKq+D,mBAAmB/Q,cACxBttD,KAAKgtD,kBAAoB,EACzBhtD,KAAKmtD,iBAAiBc,mBAGxBjuD,KAAKvQ,OAAOm+D,qBAAuB92D,EAEvC,GAEA,CAAAjQ,IAAA,mBAAAia,IAGA,WACE,OAAOd,KAAKqkE,iBACd,EAEA9gE,IA8BA,SAAqB7Z,GACfsW,KAAKqkE,oBAAsB36E,IAC7BkW,EAAOL,IAA4B,wBAAA7V,GACnCsW,KAAKqkE,kBAAoB36E,EACzBsW,KAAKwkE,gBAAgB3D,sBAEzB,GAAC,CAAAh6E,IAAA,oBAAAia,IAjCD,WACE,IAAQpX,EAAgBsW,KAAKm+D,cAArBvwC,YACR,OAAKlkC,EAGEA,EAAYghC,cAFV2S,GAGV,EAAA95B,IAED,SAAsB7Z,GACpBsW,KAAKm+D,cAAchwC,eAAezkC,EACpC,GAEA,CAAA7C,IAAA,eAAAia,IAIA,WACE,IAAQpX,EAAgBsW,KAAKm+D,cAArBvwC,YACR,OAAKlkC,EAGEA,EAAY6hC,kBAFV8R,GAGX,GAAC,CAAAx2C,IAAA,eAAAia,IAaD,WACE,OAAOd,KAAKskE,aACb,EAAA/gE,IAED,SAAiB7Z,IAAA,S9HvpBSA,GAC1B,OAAOw6B,GAAW/xB,QAAQzI,IAAU,CACrC,E8HqpBkB,CACCA,IAAUsW,KAAKskE,gBAAkB56E,IAC/CsW,KAAKskE,cAAgB56E,EACrBsW,KAAKwkE,gBAAgB3D,sBAEzB,GAEA,CAAAh6E,IAAA,mBAAAia,IAGA,WACE,OAA6C,IAAtCd,KAAKwkE,gBAAgBnB,WAC9B,GAEA,CAAAx8E,IAAA,cAAAia,IAGA,WACE,OAAOd,KAAKwkE,gBAAgBnB,WAC9B,GAEA,CAAAx8E,IAAA,eAAAia,IAGA,WACE,IACEpX,EAEEsW,KAFF2X,OACU7gB,EACRkJ,KADFvQ,OAAUgvE,eAEZ,IAAK/0E,EAAQ,OAAO,EAGpB,IADA,IAAMiN,EAAMjN,EAAO3D,OACVC,EAAI,EAAGA,EAAI2Q,EAAK3Q,IACvB,GAAI0D,EAAO1D,GAAGgoC,YAAcl3B,EAC1B,OAAO9Q,EAIX,OAAO,CACT,GAEA,CAAAa,IAAA,eAAAia,IAGA,WACE,IAEIpX,EAFIoN,EAA2CkJ,KAA3C2X,OAAQhhB,EAAmCqJ,KAAnCgtD,iBAAkBhnE,EAAiBga,KAAjBipB,aASlC,GALEv/B,GADwB,IAAtBiN,GAA2B,MAAAG,GAAAA,EAAQ/Q,OACtB+Q,EAAO/Q,OAAS,EAEhB4Q,EAGb3Q,EACF,IAAK,IAAIqH,EAAI3D,EAAc2D,KAAO,CAChC,IAAMzH,EAAYkR,EAAOzJ,GAAGyqB,MAAM,cAClC,GAAIlyB,GAAaA,GAAaI,EAC5B,OAAOqH,CAEX,CAGF,OAAO3D,CACT,GAAC,CAAA7C,IAAA,iBAAAia,IAED,WACE,OAAOd,KAAKm+D,cAAc9sC,cAC5B,GAEA,CAAAxqC,IAAA,gBAAAia,IAGA,WACE,OAAOd,KAAKm+D,cAAcv1C,aAC5B,EAEArlB,IAOA,SAAkB7Z,GAChBsW,KAAKm+D,cAAcv1C,cAAgBl/B,CACrC,GAEA,CAAA7C,IAAA,cAAAia,IAGA,WACE,OAAOd,KAAKmtD,iBAAiBkY,sBAC/B,GAAC,CAAAx+E,IAAA,wBAAAia,IAED,WACE,OAAOd,KAAKmtD,iBAAiBiW,sBAC/B,GAAC,CAAAv8E,IAAA,iBAAAia,IAyBD,WACE,IAAMpX,EAAuBsW,KAAK0/D,qBAClC,OAAOh2E,EAAuBA,EAAqBmmC,eAAiB,EACtE,GAEA,CAAAhpC,IAAA,cAAAia,IAGA,WACE,IAAMpX,EAAuBsW,KAAK0/D,qBAClC,OAAOh2E,EAAuBA,EAAqBwzB,YAAc,EACnE,GAEA,CAAAr2B,IAAA,aAAAia,IAGA,WACE,IAAMpX,EAAuBsW,KAAK0/D,qBAClC,OAAOh2E,EAAuBA,EAAqBi4C,YAAc,CACnE,EAEAp+B,IAGA,SAAe7Z,GACb,IAAMoN,EAAuBkJ,KAAK0/D,qBAC9B5oE,IACFA,EAAqB6qC,WAAaj4C,EAEtC,GAEA,CAAA7C,IAAA,oBAAAia,IAGA,WACE,IAAMpX,EAA0BsW,KAAKw/D,wBACrC,OAAO91E,EACHA,EAAwB8vD,kBACxB,EACN,GAEA,CAAA3yD,IAAA,iBAAAia,IAGA,WACE,IAAMpX,EAA0BsW,KAAKw/D,wBACrC,OAAO91E,EACHA,EAAwByzB,eACxB,EACN,GAEA,CAAAt2B,IAAA,gBAAAia,IAGA,WACE,IAAMpX,EAA0BsW,KAAKw/D,wBACrC,OAAO91E,EAA0BA,EAAwB0vD,eAAiB,CAC3E,EAAA71C,IASD,SAAkB7Z,GAChB,IAAMoN,EAA0BkJ,KAAKw/D,wBACjC1oE,IACFA,EAAwBsiD,cAAgB1vD,EAE5C,GAEA,CAAA7C,IAAA,QAAAia,IAdA,WACE,OAAOd,KAAKykE,MACd,GAAC,CAAA59E,IAAA,kBAAAia,IAeD,WACE,IAAMpX,EAA0BsW,KAAKw/D,wBACrC,QAAO91E,GACHA,EAAwBgwD,eAE9B,EAEAn2C,IAGA,SAAoB7Z,GAClB,IAAMoN,EAA0BkJ,KAAKw/D,wBACjC1oE,IACFA,EAAwB4iD,gBAAkBhwD,EAE9C,GAEA,CAAA7C,IAAA,iBAAAia,IAGA,WACE,OAAOd,KAAKvQ,OAAOuzB,cACrB,EAEAzf,IAGA,SAAmB7Z,GACjBsW,KAAKvQ,OAAOuzB,eAAiBt5B,CAC/B,GAEA,CAAA7C,IAAA,mBAAAia,IAIA,WACE,OAAOd,KAAKukE,kBAAkBrlC,gBAChC,GAEA,CAAAr4C,IAAA,UAAAia,IAIA,WACE,OAAOd,KAAKukE,kBAAkBe,OAChC,GAEA,CAAAz+E,IAAA,aAAAia,IAKA,WACE,OAAOd,KAAKukE,kBAAkBphD,UAChC,GAEA,CAAAt8B,IAAA,gBAAAia,IAGA,WACE,OAAOd,KAAKukE,kBAAkBrhD,aAChC,GAEA,CAAAr8B,IAAA,QAAAia,IAGA,WACE,OAAOd,KAAKukE,kBAAkBvgD,KAChC,GAEA,CAAAn9B,IAAA,iBAAAia,IAGA,WACE,OAAOd,KAAKmtD,iBAAiByT,cAC/B,IAAC,EAAA/5E,IAAA,UAAAia,IA93BD,WACE,MAAO,QACT,GAAC,CAAAja,IAAA,SAAAia,IAuBD,WACE,OAAOpI,CACT,GAAC,CAAA7R,IAAA,aAAAia,IAED,WACE,OAAO3E,CACT,GAAC,CAAAtV,IAAA,eAAAia,IAED,WACE,OAAOrE,CACT,GAEA,CAAA5V,IAAA,gBAAAia,IAGA,WACE,OAAKpX,EAAIO,cAIFP,EAAIO,cAHF6zE,EAIX,EAEAv6D,IAGA,SAAyBzM,GACvBpN,EAAIO,cAAgB6M,CACtB,KAACpN,CAAA,CAzFqB,UAAHu6E,GACJh6E,mBAAA,EAAag6E,EAAA,EAAAx+E,EAAAC,QAAAM,GAAA,mCC/C9B,IAAI2D,EAAQ5C,EAAQ,MAYpB,SAAS8D,EAAW+K,EAASipB,EAAMpvB,EAAQrF,EAASgH,GAClD8F,MAAMtQ,KAAKoZ,MACXA,KAAKpK,QAAUA,EACfoK,KAAKnY,KAAO,aACZg3B,IAAS7e,KAAK6e,KAAOA,GACrBpvB,IAAWuQ,KAAKvQ,OAASA,GACzBrF,IAAY4V,KAAK5V,QAAUA,GAC3BgH,IAAa4O,KAAK5O,SAAWA,EAC/B,CAEAzH,EAAM47E,SAAS16E,EAAYqM,MAAO,CAChCsuE,OAAQ,WACN,MAAO,CAEL5vE,QAASoK,KAAKpK,QACd/N,KAAMmY,KAAKnY,KAEXuuE,YAAap2D,KAAKo2D,YAClBqP,OAAQzlE,KAAKylE,OAEbC,SAAU1lE,KAAK0lE,SACfC,WAAY3lE,KAAK2lE,WACjBC,aAAc5lE,KAAK4lE,aACnBC,MAAO7lE,KAAK6lE,MAEZp2E,OAAQuQ,KAAKvQ,OACbovB,KAAM7e,KAAK6e,KACXvtB,OAAQ0O,KAAK5O,UAAY4O,KAAK5O,SAASE,OAAS0O,KAAK5O,SAASE,OAAS,KAE3E,IAGF,IAAI7K,EAAYoE,EAAWpE,UACvBq/E,EAAc,CAAC,EAEnB,CACE,uBACA,iBACA,eACA,YACA,cACA,4BACA,iBACA,mBACA,kBACA,gBAEA1yE,SAAQ,SAASyrB,GACjBinD,EAAYjnD,GAAQ,CAACrtB,MAAOqtB,EAC9B,IAEAr4B,OAAOu/E,iBAAiBl7E,EAAYi7E,GACpCt/E,OAAOmC,eAAelC,EAAW,eAAgB,CAAC+K,OAAO,IAGzD3G,EAAWye,KAAO,SAASpU,EAAO2pB,EAAMpvB,EAAQrF,EAASgH,EAAU40E,GACjE,IAAIC,EAAaz/E,OAAO8D,OAAO7D,GAY/B,OAVAkD,EAAMu8E,aAAahxE,EAAO+wE,GAAY,SAAgBE,GACpD,OAAOA,IAAQjvE,MAAMzQ,SACvB,IAEAoE,EAAWjE,KAAKq/E,EAAY/wE,EAAMU,QAASipB,EAAMpvB,EAAQrF,EAASgH,GAElE60E,EAAWp+E,KAAOqN,EAAMrN,KAExBm+E,GAAex/E,OAAO4/E,OAAOH,EAAYD,GAElCC,CACT,EAEAxgF,EAAOC,QAAUmF,+BClFfpF,EAAOC,QAAU,EAAjBD,mCCSW,IAAI+0D,EAAGzzD,EAAQ,MAASu4D,EAAGv4D,EAAQ,MAAa,SAASyG,EAAE5H,GAAG,IAAI,IAAIC,EAAE,yDAAyDD,EAAEiI,EAAE,EAAEA,EAAE7F,UAAUjC,OAAO8H,IAAIhI,GAAG,WAAWgL,mBAAmB7I,UAAU6F,IAAI,MAAM,yBAAyBjI,EAAE,WAAWC,EAAE,gHAAgH,CAAC,IAAIw5D,EAAG,IAAIoX,IAAI5e,EAAG,CAAC,EAAE,SAAS0H,EAAG35D,EAAEC,GAAGu5D,EAAGx5D,EAAEC,GAAGu5D,EAAGx5D,EAAE,UAAUC,EAAE,CACxb,SAASu5D,EAAGx5D,EAAEC,GAAW,IAARgyD,EAAGjyD,GAAGC,EAAMD,EAAE,EAAEA,EAAEC,EAAEE,OAAOH,IAAIy5D,EAAGgnB,IAAIxgF,EAAED,GAAG,CAC5D,IAAI+zD,IAAK,qBAAqBjtD,QAAQ,qBAAqBA,OAAOf,UAAU,qBAAqBe,OAAOf,SAASC,eAAem9D,EAAGviE,OAAOC,UAAUE,eAAe2+D,EAAG,8VAA8VpG,EACpgB,CAAC,EAAEQ,EAAG,CAAC,EACiN,SAAS3wC,EAAEnpB,EAAEC,EAAEgI,EAAEE,EAAErE,EAAEqD,EAAEe,GAAGkS,KAAKsmE,gBAAgB,IAAIzgF,GAAG,IAAIA,GAAG,IAAIA,EAAEma,KAAKumE,cAAcx4E,EAAEiS,KAAKwmE,mBAAmB98E,EAAEsW,KAAKymE,gBAAgB54E,EAAEmS,KAAK0mE,aAAa9gF,EAAEoa,KAAKrY,KAAK9B,EAAEma,KAAK2mE,YAAY55E,EAAEiT,KAAK4mE,kBAAkB94E,CAAC,CAAC,IAAIkc,EAAE,CAAC,EACpb,uIAAuIjS,MAAM,KAAK3E,SAAQ,SAASxN,GAAGokB,EAAEpkB,GAAG,IAAImpB,EAAEnpB,EAAE,GAAE,EAAGA,EAAE,MAAK,GAAG,EAAG,IAAG,CAAC,CAAC,gBAAgB,kBAAkB,CAAC,YAAY,SAAS,CAAC,UAAU,OAAO,CAAC,YAAY,eAAewN,SAAQ,SAASxN,GAAG,IAAIC,EAAED,EAAE,GAAGokB,EAAEnkB,GAAG,IAAIkpB,EAAElpB,EAAE,GAAE,EAAGD,EAAE,GAAG,MAAK,GAAG,EAAG,IAAG,CAAC,kBAAkB,YAAY,aAAa,SAASwN,SAAQ,SAASxN,GAAGokB,EAAEpkB,GAAG,IAAImpB,EAAEnpB,EAAE,GAAE,EAAGA,EAAE0N,cAAc,MAAK,GAAG,EAAG,IAC1e,CAAC,cAAc,4BAA4B,YAAY,iBAAiBF,SAAQ,SAASxN,GAAGokB,EAAEpkB,GAAG,IAAImpB,EAAEnpB,EAAE,GAAE,EAAGA,EAAE,MAAK,GAAG,EAAG,IAAG,8OAA8OmS,MAAM,KAAK3E,SAAQ,SAASxN,GAAGokB,EAAEpkB,GAAG,IAAImpB,EAAEnpB,EAAE,GAAE,EAAGA,EAAE0N,cAAc,MAAK,GAAG,EAAG,IACxb,CAAC,UAAU,WAAW,QAAQ,YAAYF,SAAQ,SAASxN,GAAGokB,EAAEpkB,GAAG,IAAImpB,EAAEnpB,EAAE,GAAE,EAAGA,EAAE,MAAK,GAAG,EAAG,IAAG,CAAC,UAAU,YAAYwN,SAAQ,SAASxN,GAAGokB,EAAEpkB,GAAG,IAAImpB,EAAEnpB,EAAE,GAAE,EAAGA,EAAE,MAAK,GAAG,EAAG,IAAG,CAAC,OAAO,OAAO,OAAO,QAAQwN,SAAQ,SAASxN,GAAGokB,EAAEpkB,GAAG,IAAImpB,EAAEnpB,EAAE,GAAE,EAAGA,EAAE,MAAK,GAAG,EAAG,IAAG,CAAC,UAAU,SAASwN,SAAQ,SAASxN,GAAGokB,EAAEpkB,GAAG,IAAImpB,EAAEnpB,EAAE,GAAE,EAAGA,EAAE0N,cAAc,MAAK,GAAG,EAAG,IAAG,IAAIolD,EAAG,gBAAgB,SAAS8D,EAAG52D,GAAG,OAAOA,EAAE,GAAGgM,aAAa,CAIxZ,SAAS4mD,EAAG5yD,EAAEC,EAAEgI,EAAEE,GAAG,IAAIrE,EAAEsgB,EAAErjB,eAAed,GAAGmkB,EAAEnkB,GAAG,MAAQ,OAAO6D,EAAE,IAAIA,EAAE/B,KAAKoG,KAAK,EAAElI,EAAEE,SAAS,MAAMF,EAAE,IAAI,MAAMA,EAAE,IAAI,MAAMA,EAAE,IAAI,MAAMA,EAAE,MAP9I,SAAYD,EAAEC,EAAEgI,EAAEE,GAAG,GAAG,OAAOlI,GAAG,qBAAqBA,GADqE,SAAYD,EAAEC,EAAEgI,EAAEE,GAAG,GAAG,OAAOF,GAAG,IAAIA,EAAElG,KAAK,OAAM,EAAG,cAAc9B,GAAG,IAAK,WAAW,IAAK,SAAS,OAAM,EAAG,IAAK,UAAU,OAAGkI,IAAc,OAAOF,GAASA,EAAEy4E,gBAAmD,WAAnC1gF,EAAEA,EAAE0N,cAAc8M,MAAM,EAAE,KAAsB,UAAUxa,GAAE,QAAQ,OAAM,EAAG,CAC/Tg6D,CAAGh6D,EAAEC,EAAEgI,EAAEE,GAAG,OAAM,EAAG,GAAGA,EAAE,OAAM,EAAG,GAAG,OAAOF,EAAE,OAAOA,EAAElG,MAAM,KAAK,EAAE,OAAO9B,EAAE,KAAK,EAAE,OAAM,IAAKA,EAAE,KAAK,EAAE,OAAOm5B,MAAMn5B,GAAG,KAAK,EAAE,OAAOm5B,MAAMn5B,IAAI,EAAEA,EAAE,OAAM,CAAE,CAOtEijE,CAAGjjE,EAAEgI,EAAEnE,EAAEqE,KAAKF,EAAE,MAAME,GAAG,OAAOrE,EARxK,SAAY9D,GAAG,QAAGmjE,EAAGniE,KAAK84D,EAAG95D,KAAemjE,EAAGniE,KAAKs4D,EAAGt5D,KAAe0/D,EAAG/5D,KAAK3F,GAAU85D,EAAG95D,IAAG,GAAGs5D,EAAGt5D,IAAG,GAAS,GAAE,CAQwDq5D,CAAGp5D,KAAK,OAAOgI,EAAEjI,EAAE02D,gBAAgBz2D,GAAGD,EAAEoG,aAAanG,EAAE,GAAGgI,IAAInE,EAAE+8E,gBAAgB7gF,EAAE8D,EAAEg9E,cAAc,OAAO74E,EAAE,IAAInE,EAAE/B,MAAQ,GAAGkG,GAAGhI,EAAE6D,EAAE68E,cAAcx4E,EAAErE,EAAE88E,mBAAmB,OAAO34E,EAAEjI,EAAE02D,gBAAgBz2D,IAAagI,EAAE,KAAXnE,EAAEA,EAAE/B,OAAc,IAAI+B,IAAG,IAAKmE,EAAE,GAAG,GAAGA,EAAEE,EAAEnI,EAAEihF,eAAe94E,EAAElI,EAAEgI,GAAGjI,EAAEoG,aAAanG,EAAEgI,KAAI,CAHjd,0jCAA0jCkK,MAAM,KAAK3E,SAAQ,SAASxN,GAAG,IAAIC,EAAED,EAAEsG,QAAQwsD,EACzmC8D,GAAIxyC,EAAEnkB,GAAG,IAAIkpB,EAAElpB,EAAE,GAAE,EAAGD,EAAE,MAAK,GAAG,EAAG,IAAG,2EAA2EmS,MAAM,KAAK3E,SAAQ,SAASxN,GAAG,IAAIC,EAAED,EAAEsG,QAAQwsD,EAAG8D,GAAIxyC,EAAEnkB,GAAG,IAAIkpB,EAAElpB,EAAE,GAAE,EAAGD,EAAE,gCAA+B,GAAG,EAAG,IAAG,CAAC,WAAW,WAAW,aAAawN,SAAQ,SAASxN,GAAG,IAAIC,EAAED,EAAEsG,QAAQwsD,EAAG8D,GAAIxyC,EAAEnkB,GAAG,IAAIkpB,EAAElpB,EAAE,GAAE,EAAGD,EAAE,wCAAuC,GAAG,EAAG,IAAG,CAAC,WAAW,eAAewN,SAAQ,SAASxN,GAAGokB,EAAEpkB,GAAG,IAAImpB,EAAEnpB,EAAE,GAAE,EAAGA,EAAE0N,cAAc,MAAK,GAAG,EAAG,IACld0W,EAAE88D,UAAU,IAAI/3D,EAAE,YAAY,GAAE,EAAG,aAAa,gCAA+B,GAAG,GAAI,CAAC,MAAM,OAAO,SAAS,cAAc3b,SAAQ,SAASxN,GAAGokB,EAAEpkB,GAAG,IAAImpB,EAAEnpB,EAAE,GAAE,EAAGA,EAAE0N,cAAc,MAAK,GAAG,EAAG,IAE5L,IAAI6rD,EAAG3E,EAAGltD,mDAAmDmyD,EAAGxyD,OAAOC,IAAI,iBAAiBs5D,EAAGv5D,OAAOC,IAAI,gBAAgB2yD,EAAG5yD,OAAOC,IAAI,kBAAkBk8D,EAAGn8D,OAAOC,IAAI,qBAAqBy3D,EAAG13D,OAAOC,IAAI,kBAAkBi7D,EAAGl7D,OAAOC,IAAI,kBAAkB25D,EAAG55D,OAAOC,IAAI,iBAAiBm5D,EAAGp5D,OAAOC,IAAI,qBAAqBqzD,EAAGtzD,OAAOC,IAAI,kBAAkBq6D,EAAGt6D,OAAOC,IAAI,uBAAuB0/D,EAAG3/D,OAAOC,IAAI,cAAcm7D,EAAGp7D,OAAOC,IAAI,cAAcD,OAAOC,IAAI,eAAeD,OAAOC,IAAI,0BACje,IAAIq5D,EAAGt5D,OAAOC,IAAI,mBAAmBD,OAAOC,IAAI,uBAAuBD,OAAOC,IAAI,eAAeD,OAAOC,IAAI,wBAAwB,IAAIg8D,EAAGj8D,OAAO85E,SAAS,SAAS3e,EAAGxiE,GAAG,OAAG,OAAOA,GAAG,kBAAkBA,EAAS,KAAwC,oBAAnCA,EAAEsjE,GAAItjE,EAAEsjE,IAAKtjE,EAAE,eAA0CA,EAAE,IAAI,CAAC,IAAoB+8D,EAAhBlmD,EAAEjW,OAAO4/E,OAAU,SAAS5e,EAAG5hE,GAAG,QAAG,IAAS+8D,EAAG,IAAI,MAAMzrD,OAAQ,CAAC,MAAMrJ,GAAG,IAAIhI,EAAEgI,EAAEg4E,MAAM9uE,OAAO6iB,MAAM,gBAAgB+oC,EAAG98D,GAAGA,EAAE,IAAI,EAAE,CAAC,MAAM,KAAK88D,EAAG/8D,CAAC,CAAC,IAAIqiE,GAAG,EACzb,SAASD,EAAGpiE,EAAEC,GAAG,IAAID,GAAGqiE,EAAG,MAAM,GAAGA,GAAG,EAAG,IAAIp6D,EAAEqJ,MAAM8vE,kBAAkB9vE,MAAM8vE,uBAAkB,EAAO,IAAI,GAAGnhF,EAAE,GAAGA,EAAE,WAAW,MAAMqR,OAAQ,EAAE1Q,OAAOmC,eAAe9C,EAAEY,UAAU,QAAQ,CAAC8c,IAAI,WAAW,MAAMrM,OAAQ,IAAI,kBAAkB+vE,SAASA,QAAQC,UAAU,CAAC,IAAID,QAAQC,UAAUrhF,EAAE,GAAG,CAAC,MAAMsH,GAAG,IAAIY,EAAEZ,CAAC,CAAC85E,QAAQC,UAAUthF,EAAE,GAAGC,EAAE,KAAK,CAAC,IAAIA,EAAEe,MAAM,CAAC,MAAMuG,GAAGY,EAAEZ,CAAC,CAACvH,EAAEgB,KAAKf,EAAEY,UAAU,KAAK,CAAC,IAAI,MAAMyQ,OAAQ,CAAC,MAAM/J,GAAGY,EAAEZ,CAAC,CAACvH,GAAG,CAAC,CAAC,MAAMuH,GAAG,GAAGA,GAAGY,GAAG,kBAAkBZ,EAAE04E,MAAM,CAAC,IAAI,IAAIn8E,EAAEyD,EAAE04E,MAAM9tE,MAAM,MACnfhL,EAAEgB,EAAE83E,MAAM9tE,MAAM,MAAMjK,EAAEpE,EAAE3D,OAAO,EAAEiI,EAAEjB,EAAEhH,OAAO,EAAE,GAAG+H,GAAG,GAAGE,GAAGtE,EAAEoE,KAAKf,EAAEiB,IAAIA,IAAI,KAAK,GAAGF,GAAG,GAAGE,EAAEF,IAAIE,IAAI,GAAGtE,EAAEoE,KAAKf,EAAEiB,GAAG,CAAC,GAAG,IAAIF,GAAG,IAAIE,EAAG,MAAMF,IAAQ,IAAJE,GAAStE,EAAEoE,KAAKf,EAAEiB,GAAG,CAAC,IAAIhB,EAAE,KAAKtD,EAAEoE,GAAG5B,QAAQ,WAAW,QAA6F,OAArFtG,EAAEyB,aAAa2F,EAAE+f,SAAS,iBAAiB/f,EAAEA,EAAEd,QAAQ,cAActG,EAAEyB,cAAqB2F,CAAC,QAAO,GAAGc,GAAG,GAAGE,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQi6D,GAAG,EAAG/wD,MAAM8vE,kBAAkBn5E,CAAC,CAAC,OAAOjI,EAAEA,EAAEA,EAAEyB,aAAazB,EAAEiC,KAAK,IAAI2/D,EAAG5hE,GAAG,EAAE,CAC9Z,SAASqhE,EAAGrhE,GAAG,OAAOA,EAAEuhF,KAAK,KAAK,EAAE,OAAO3f,EAAG5hE,EAAE+B,MAAM,KAAK,GAAG,OAAO6/D,EAAG,QAAQ,KAAK,GAAG,OAAOA,EAAG,YAAY,KAAK,GAAG,OAAOA,EAAG,gBAAgB,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO5hE,EAAEoiE,EAAGpiE,EAAE+B,MAAK,GAAM,KAAK,GAAG,OAAO/B,EAAEoiE,EAAGpiE,EAAE+B,KAAKc,QAAO,GAAM,KAAK,EAAE,OAAO7C,EAAEoiE,EAAGpiE,EAAE+B,MAAK,GAAM,QAAQ,MAAM,GAAG,CACxR,SAASwhE,EAAGvjE,GAAG,GAAG,MAAMA,EAAE,OAAO,KAAK,GAAG,oBAAoBA,EAAE,OAAOA,EAAEyB,aAAazB,EAAEiC,MAAM,KAAK,GAAG,kBAAkBjC,EAAE,OAAOA,EAAE,OAAOA,GAAG,KAAKi6D,EAAG,MAAM,WAAW,KAAK2G,EAAG,MAAM,SAAS,KAAK7B,EAAG,MAAM,WAAW,KAAKyE,EAAG,MAAM,aAAa,KAAK7I,EAAG,MAAM,WAAW,KAAKgH,EAAG,MAAM,eAAe,GAAG,kBAAkB3hE,EAAE,OAAOA,EAAEqI,UAAU,KAAK44D,EAAG,OAAOjhE,EAAEyB,aAAa,WAAW,YAAY,KAAK8gE,EAAG,OAAOviE,EAAEwhF,SAAS//E,aAAa,WAAW,YAAY,KAAKg/D,EAAG,IAAIxgE,EAAED,EAAE6C,OAC7Z,OADoa7C,EAAEA,EAAEyB,eACndzB,EAAE,MADieA,EAAEC,EAAEwB,aAClfxB,EAAEgC,MAAM,IAAY,cAAcjC,EAAE,IAAI,cAAqBA,EAAE,KAAKgnE,EAAG,OAA6B,QAAtB/mE,EAAED,EAAEyB,aAAa,MAAcxB,EAAEsjE,EAAGvjE,EAAE+B,OAAO,OAAO,KAAK0gE,EAAGxiE,EAAED,EAAEyhF,SAASzhF,EAAEA,EAAE0hF,MAAM,IAAI,OAAOne,EAAGvjE,EAAEC,GAAG,CAAC,MAAMgI,GAAG,EAAE,OAAO,IAAI,CAC3M,SAASk3D,EAAGn/D,GAAG,IAAIC,EAAED,EAAE+B,KAAK,OAAO/B,EAAEuhF,KAAK,KAAK,GAAG,MAAM,QAAQ,KAAK,EAAE,OAAOthF,EAAEwB,aAAa,WAAW,YAAY,KAAK,GAAG,OAAOxB,EAAEuhF,SAAS//E,aAAa,WAAW,YAAY,KAAK,GAAG,MAAM,qBAAqB,KAAK,GAAG,OAAkBzB,GAAXA,EAAEC,EAAE4C,QAAWpB,aAAazB,EAAEiC,MAAM,GAAGhC,EAAEwB,cAAc,KAAKzB,EAAE,cAAcA,EAAE,IAAI,cAAc,KAAK,EAAE,MAAM,WAAW,KAAK,EAAE,OAAOC,EAAE,KAAK,EAAE,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,KAAK,EAAE,MAAM,OAAO,KAAK,GAAG,OAAOsjE,EAAGtjE,GAAG,KAAK,EAAE,OAAOA,IAAIujE,EAAG,aAAa,OAAO,KAAK,GAAG,MAAM,YACtf,KAAK,GAAG,MAAM,WAAW,KAAK,GAAG,MAAM,QAAQ,KAAK,GAAG,MAAM,WAAW,KAAK,GAAG,MAAM,eAAe,KAAK,GAAG,MAAM,gBAAgB,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,GAAG,KAAK,GAAG,GAAG,oBAAoBvjE,EAAE,OAAOA,EAAEwB,aAAaxB,EAAEgC,MAAM,KAAK,GAAG,kBAAkBhC,EAAE,OAAOA,EAAE,OAAO,IAAI,CAAC,SAAS+7D,EAAGh8D,GAAG,cAAcA,GAAG,IAAK,UAAU,IAAK,SAAS,IAAK,SAAS,IAAK,YAAqB,IAAK,SAAS,OAAOA,EAAE,QAAQ,MAAM,GAAG,CACra,SAASi7D,EAAGj7D,GAAG,IAAIC,EAAED,EAAE+B,KAAK,OAAO/B,EAAEA,EAAE0jE,WAAW,UAAU1jE,EAAE0N,gBAAgB,aAAazN,GAAG,UAAUA,EAAE,CAEtF,SAASyiE,EAAG1iE,GAAGA,EAAE2hF,gBAAgB3hF,EAAE2hF,cADvD,SAAY3hF,GAAG,IAAIC,EAAEg7D,EAAGj7D,GAAG,UAAU,QAAQiI,EAAErH,OAAOsC,yBAAyBlD,EAAEE,YAAYW,UAAUZ,GAAGkI,EAAE,GAAGnI,EAAEC,GAAG,IAAID,EAAEe,eAAed,IAAI,qBAAqBgI,GAAG,oBAAoBA,EAAEiT,KAAK,oBAAoBjT,EAAE0V,IAAI,CAAC,IAAI7Z,EAAEmE,EAAEiT,IAAI/T,EAAEc,EAAE0V,IAAiL,OAA7K/c,OAAOmC,eAAe/C,EAAEC,EAAE,CAAC2hF,cAAa,EAAG1mE,IAAI,WAAW,OAAOpX,EAAE9C,KAAKoZ,KAAK,EAAEuD,IAAI,SAAS3d,GAAGmI,EAAE,GAAGnI,EAAEmH,EAAEnG,KAAKoZ,KAAKpa,EAAE,IAAIY,OAAOmC,eAAe/C,EAAEC,EAAE,CAACigE,WAAWj4D,EAAEi4D,aAAmB,CAAC2hB,SAAS,WAAW,OAAO15E,CAAC,EAAE25E,SAAS,SAAS9hF,GAAGmI,EAAE,GAAGnI,CAAC,EAAE+hF,aAAa,WAAW/hF,EAAE2hF,cACxf,YAAY3hF,EAAEC,EAAE,EAAE,CAAC,CAAkDqiE,CAAGtiE,GAAG,CAAC,SAAS8iE,EAAG9iE,GAAG,IAAIA,EAAE,OAAM,EAAG,IAAIC,EAAED,EAAE2hF,cAAc,IAAI1hF,EAAE,OAAM,EAAG,IAAIgI,EAAEhI,EAAE4hF,WAAe15E,EAAE,GAAqD,OAAlDnI,IAAImI,EAAE8yD,EAAGj7D,GAAGA,EAAEgiF,QAAQ,OAAO,QAAQhiF,EAAE4L,QAAO5L,EAAEmI,KAAaF,IAAGhI,EAAE6hF,SAAS9hF,IAAG,EAAM,CAAC,SAASojE,EAAGpjE,GAAwD,GAAG,qBAAxDA,EAAEA,IAAI,qBAAqB+F,SAASA,cAAS,IAAkC,OAAO,KAAK,IAAI,OAAO/F,EAAEiiF,eAAejiF,EAAEotC,IAAI,CAAC,MAAMntC,GAAG,OAAOD,EAAEotC,IAAI,CAAC,CACpa,SAASu1B,EAAG3iE,EAAEC,GAAG,IAAIgI,EAAEhI,EAAE+hF,QAAQ,OAAOnrE,EAAE,CAAC,EAAE5W,EAAE,CAACiiF,oBAAe,EAAOC,kBAAa,EAAOv2E,WAAM,EAAOo2E,QAAQ,MAAM/5E,EAAEA,EAAEjI,EAAEoiF,cAAcC,gBAAgB,CAAC,SAAS1b,EAAG3mE,EAAEC,GAAG,IAAIgI,EAAE,MAAMhI,EAAEkiF,aAAa,GAAGliF,EAAEkiF,aAAah6E,EAAE,MAAMlI,EAAE+hF,QAAQ/hF,EAAE+hF,QAAQ/hF,EAAEiiF,eAAej6E,EAAE+zD,EAAG,MAAM/7D,EAAE2L,MAAM3L,EAAE2L,MAAM3D,GAAGjI,EAAEoiF,cAAc,CAACC,eAAel6E,EAAEm6E,aAAar6E,EAAEs6E,WAAW,aAAatiF,EAAE8B,MAAM,UAAU9B,EAAE8B,KAAK,MAAM9B,EAAE+hF,QAAQ,MAAM/hF,EAAE2L,MAAM,CAAC,SAAS42E,EAAGxiF,EAAEC,GAAe,OAAZA,EAAEA,EAAE+hF,UAAiBpvB,EAAG5yD,EAAE,UAAUC,GAAE,EAAG,CAC9d,SAASwiF,EAAGziF,EAAEC,GAAGuiF,EAAGxiF,EAAEC,GAAG,IAAIgI,EAAE+zD,EAAG/7D,EAAE2L,OAAOzD,EAAElI,EAAE8B,KAAK,GAAG,MAAMkG,EAAK,WAAWE,GAAM,IAAIF,GAAG,KAAKjI,EAAE4L,OAAO5L,EAAE4L,OAAO3D,KAAEjI,EAAE4L,MAAM,GAAG3D,GAAOjI,EAAE4L,QAAQ,GAAG3D,IAAIjI,EAAE4L,MAAM,GAAG3D,QAAQ,GAAG,WAAWE,GAAG,UAAUA,EAA8B,YAA3BnI,EAAE02D,gBAAgB,SAAgBz2D,EAAEc,eAAe,SAAS2hF,GAAG1iF,EAAEC,EAAE8B,KAAKkG,GAAGhI,EAAEc,eAAe,iBAAiB2hF,GAAG1iF,EAAEC,EAAE8B,KAAKi6D,EAAG/7D,EAAEkiF,eAAe,MAAMliF,EAAE+hF,SAAS,MAAM/hF,EAAEiiF,iBAAiBliF,EAAEkiF,iBAAiBjiF,EAAEiiF,eAAe,CACla,SAASS,GAAG3iF,EAAEC,EAAEgI,GAAG,GAAGhI,EAAEc,eAAe,UAAUd,EAAEc,eAAe,gBAAgB,CAAC,IAAIoH,EAAElI,EAAE8B,KAAK,KAAK,WAAWoG,GAAG,UAAUA,QAAG,IAASlI,EAAE2L,OAAO,OAAO3L,EAAE2L,OAAO,OAAO3L,EAAE,GAAGD,EAAEoiF,cAAcE,aAAar6E,GAAGhI,IAAID,EAAE4L,QAAQ5L,EAAE4L,MAAM3L,GAAGD,EAAEmiF,aAAaliF,CAAC,CAAU,MAATgI,EAAEjI,EAAEiC,QAAcjC,EAAEiC,KAAK,IAAIjC,EAAEkiF,iBAAiBliF,EAAEoiF,cAAcC,eAAe,KAAKp6E,IAAIjI,EAAEiC,KAAKgG,EAAE,CACzV,SAASy6E,GAAG1iF,EAAEC,EAAEgI,GAAM,WAAWhI,GAAGmjE,EAAGpjE,EAAE4iF,iBAAiB5iF,IAAE,MAAMiI,EAAEjI,EAAEmiF,aAAa,GAAGniF,EAAEoiF,cAAcE,aAAatiF,EAAEmiF,eAAe,GAAGl6E,IAAIjI,EAAEmiF,aAAa,GAAGl6E,GAAE,CAAC,IAAI46E,GAAGviF,MAAMC,QAC7K,SAASuiF,GAAG9iF,EAAEC,EAAEgI,EAAEE,GAAe,GAAZnI,EAAEA,EAAEyQ,QAAWxQ,EAAE,CAACA,EAAE,CAAC,EAAE,IAAI,IAAI6D,EAAE,EAAEA,EAAEmE,EAAE9H,OAAO2D,IAAI7D,EAAE,IAAIgI,EAAEnE,KAAI,EAAG,IAAImE,EAAE,EAAEA,EAAEjI,EAAEG,OAAO8H,IAAInE,EAAE7D,EAAEc,eAAe,IAAIf,EAAEiI,GAAG2D,OAAO5L,EAAEiI,GAAG86E,WAAWj/E,IAAI9D,EAAEiI,GAAG86E,SAASj/E,GAAGA,GAAGqE,IAAInI,EAAEiI,GAAG+6E,iBAAgB,EAAG,KAAK,CAAmB,IAAlB/6E,EAAE,GAAG+zD,EAAG/zD,GAAGhI,EAAE,KAAS6D,EAAE,EAAEA,EAAE9D,EAAEG,OAAO2D,IAAI,CAAC,GAAG9D,EAAE8D,GAAG8H,QAAQ3D,EAAiD,OAA9CjI,EAAE8D,GAAGi/E,UAAS,OAAG56E,IAAInI,EAAE8D,GAAGk/E,iBAAgB,IAAW,OAAO/iF,GAAGD,EAAE8D,GAAGm/E,WAAWhjF,EAAED,EAAE8D,GAAG,CAAC,OAAO7D,IAAIA,EAAE8iF,UAAS,EAAG,CAAC,CACxY,SAASG,GAAGljF,EAAEC,GAAG,GAAG,MAAMA,EAAEkjF,wBAAwB,MAAM7xE,MAAM1J,EAAE,KAAK,OAAOiP,EAAE,CAAC,EAAE5W,EAAE,CAAC2L,WAAM,EAAOu2E,kBAAa,EAAOiB,SAAS,GAAGpjF,EAAEoiF,cAAcE,cAAc,CAAC,SAASe,GAAGrjF,EAAEC,GAAG,IAAIgI,EAAEhI,EAAE2L,MAAM,GAAG,MAAM3D,EAAE,CAA+B,GAA9BA,EAAEhI,EAAEmjF,SAASnjF,EAAEA,EAAEkiF,aAAgB,MAAMl6E,EAAE,CAAC,GAAG,MAAMhI,EAAE,MAAMqR,MAAM1J,EAAE,KAAK,GAAGi7E,GAAG56E,GAAG,CAAC,GAAG,EAAEA,EAAE9H,OAAO,MAAMmR,MAAM1J,EAAE,KAAKK,EAAEA,EAAE,EAAE,CAAChI,EAAEgI,CAAC,CAAC,MAAMhI,IAAIA,EAAE,IAAIgI,EAAEhI,CAAC,CAACD,EAAEoiF,cAAc,CAACE,aAAatmB,EAAG/zD,GAAG,CACnY,SAASq7E,GAAGtjF,EAAEC,GAAG,IAAIgI,EAAE+zD,EAAG/7D,EAAE2L,OAAOzD,EAAE6zD,EAAG/7D,EAAEkiF,cAAc,MAAMl6E,KAAIA,EAAE,GAAGA,KAAMjI,EAAE4L,QAAQ5L,EAAE4L,MAAM3D,GAAG,MAAMhI,EAAEkiF,cAAcniF,EAAEmiF,eAAel6E,IAAIjI,EAAEmiF,aAAal6E,IAAI,MAAME,IAAInI,EAAEmiF,aAAa,GAAGh6E,EAAE,CAAC,SAASo7E,GAAGvjF,GAAG,IAAIC,EAAED,EAAE2jE,YAAY1jE,IAAID,EAAEoiF,cAAcE,cAAc,KAAKriF,GAAG,OAAOA,IAAID,EAAE4L,MAAM3L,EAAE,CAAC,SAASujF,GAAGxjF,GAAG,OAAOA,GAAG,IAAK,MAAM,MAAM,6BAA6B,IAAK,OAAO,MAAM,qCAAqC,QAAQ,MAAM,+BAA+B,CAC7c,SAASyjF,GAAGzjF,EAAEC,GAAG,OAAO,MAAMD,GAAG,iCAAiCA,EAAEwjF,GAAGvjF,GAAG,+BAA+BD,GAAG,kBAAkBC,EAAE,+BAA+BD,CAAC,CAChK,IAAI0jF,GAAG95B,GAAG,SAAS5pD,GAAG,MAAM,qBAAqB2jF,OAAOA,MAAMC,wBAAwB,SAAS3jF,EAAEgI,EAAEE,EAAErE,GAAG6/E,MAAMC,yBAAwB,WAAW,OAAO5jF,EAAEC,EAAEgI,EAAM,GAAE,EAAEjI,CAAC,CAA7J,EAA+J,SAASA,EAAEC,GAAG,GAAG,+BAA+BD,EAAE6jF,cAAc,cAAc7jF,EAAEA,EAAE8jF,UAAU7jF,MAAM,CAA2F,KAA1FyjF,GAAGA,IAAI39E,SAASC,cAAc,QAAU89E,UAAU,QAAQ7jF,EAAEU,UAAUG,WAAW,SAAab,EAAEyjF,GAAGK,WAAW/jF,EAAE+jF,YAAY/jF,EAAEo5D,YAAYp5D,EAAE+jF,YAAY,KAAK9jF,EAAE8jF,YAAY/jF,EAAE82D,YAAY72D,EAAE8jF,WAAW,CAAC,IACnd,SAASC,GAAGhkF,EAAEC,GAAG,GAAGA,EAAE,CAAC,IAAIgI,EAAEjI,EAAE+jF,WAAW,GAAG97E,GAAGA,IAAIjI,EAAEikF,WAAW,IAAIh8E,EAAEi8E,SAAwB,YAAdj8E,EAAE4d,UAAU5lB,EAAS,CAACD,EAAE2jE,YAAY1jE,CAAC,CACtH,IAAIkkF,GAAG,CAACC,yBAAwB,EAAGC,aAAY,EAAGC,mBAAkB,EAAGC,kBAAiB,EAAGC,kBAAiB,EAAGC,SAAQ,EAAGC,cAAa,EAAGC,iBAAgB,EAAGC,aAAY,EAAGC,SAAQ,EAAGC,MAAK,EAAGC,UAAS,EAAGC,cAAa,EAAGC,YAAW,EAAGC,cAAa,EAAGC,WAAU,EAAGC,UAAS,EAAGC,SAAQ,EAAGC,YAAW,EAAGC,aAAY,EAAGC,cAAa,EAAGC,YAAW,EAAGC,eAAc,EAAGC,gBAAe,EAAGC,iBAAgB,EAAGC,YAAW,EAAGC,WAAU,EAAGC,YAAW,EAAGC,SAAQ,EAAGC,OAAM,EAAGC,SAAQ,EAAGC,SAAQ,EAAGC,QAAO,EAAGC,QAAO,EAClfC,MAAK,EAAGC,aAAY,EAAGC,cAAa,EAAGC,aAAY,EAAGC,iBAAgB,EAAGC,kBAAiB,EAAGC,kBAAiB,EAAGC,eAAc,EAAGC,aAAY,GAAIC,GAAG,CAAC,SAAS,KAAK,MAAM,KAA6H,SAASC,GAAGhnF,EAAEC,EAAEgI,GAAG,OAAO,MAAMhI,GAAG,mBAAmBA,GAAG,KAAKA,EAAE,GAAGgI,GAAG,kBAAkBhI,GAAG,IAAIA,GAAGkkF,GAAGpjF,eAAef,IAAImkF,GAAGnkF,IAAI,GAAGC,GAAGkR,OAAOlR,EAAE,IAAI,CACzb,SAASgnF,GAAGjnF,EAAEC,GAAa,IAAI,IAAIgI,KAAlBjI,EAAEA,EAAEknF,MAAmBjnF,EAAE,GAAGA,EAAEc,eAAekH,GAAG,CAAC,IAAIE,EAAE,IAAIF,EAAEsE,QAAQ,MAAMzI,EAAEkjF,GAAG/+E,EAAEhI,EAAEgI,GAAGE,GAAG,UAAUF,IAAIA,EAAE,YAAYE,EAAEnI,EAAEmnF,YAAYl/E,EAAEnE,GAAG9D,EAAEiI,GAAGnE,CAAC,CAAC,CADYlD,OAAOP,KAAK8jF,IAAI32E,SAAQ,SAASxN,GAAG+mF,GAAGv5E,SAAQ,SAASvN,GAAGA,EAAEA,EAAED,EAAE6G,OAAO,GAAGmF,cAAchM,EAAEiS,UAAU,GAAGkyE,GAAGlkF,GAAGkkF,GAAGnkF,EAAE,GAAE,IAChI,IAAIuyE,GAAG17D,EAAE,CAACuwE,UAAS,GAAI,CAACC,MAAK,EAAGC,MAAK,EAAG/lD,IAAG,EAAGgmD,KAAI,EAAGC,OAAM,EAAGpnD,IAAG,EAAGqnD,KAAI,EAAGC,OAAM,EAAGC,QAAO,EAAGC,MAAK,EAAGC,MAAK,EAAGC,OAAM,EAAGrnF,QAAO,EAAGg5B,OAAM,EAAGsuD,KAAI,IAClT,SAASC,GAAGhoF,EAAEC,GAAG,GAAGA,EAAE,CAAC,GAAGsyE,GAAGvyE,KAAK,MAAMC,EAAEmjF,UAAU,MAAMnjF,EAAEkjF,yBAAyB,MAAM7xE,MAAM1J,EAAE,IAAI5H,IAAI,GAAG,MAAMC,EAAEkjF,wBAAwB,CAAC,GAAG,MAAMljF,EAAEmjF,SAAS,MAAM9xE,MAAM1J,EAAE,KAAK,GAAG,kBAAkB3H,EAAEkjF,2BAA2B,WAAWljF,EAAEkjF,yBAAyB,MAAM7xE,MAAM1J,EAAE,IAAK,CAAC,GAAG,MAAM3H,EAAEinF,OAAO,kBAAkBjnF,EAAEinF,MAAM,MAAM51E,MAAM1J,EAAE,IAAK,CAAC,CAClW,SAASqgF,GAAGjoF,EAAEC,GAAG,IAAI,IAAID,EAAEuM,QAAQ,KAAK,MAAM,kBAAkBtM,EAAEyO,GAAG,OAAO1O,GAAG,IAAK,iBAAiB,IAAK,gBAAgB,IAAK,YAAY,IAAK,gBAAgB,IAAK,gBAAgB,IAAK,mBAAmB,IAAK,iBAAiB,IAAK,gBAAgB,OAAM,EAAG,QAAQ,OAAM,EAAG,CAAC,IAAIkoF,GAAG,KAAK,SAASC,GAAGnoF,GAA6F,OAA1FA,EAAEA,EAAEooF,QAAQpoF,EAAEqoF,YAAYvhF,QAASwhF,0BAA0BtoF,EAAEA,EAAEsoF,yBAAgC,IAAItoF,EAAEkkF,SAASlkF,EAAEuoF,WAAWvoF,CAAC,CAAC,IAAIwoF,GAAG,KAAKC,GAAG,KAAKC,GAAG,KACpc,SAASC,GAAG3oF,GAAG,GAAGA,EAAE4oF,GAAG5oF,GAAG,CAAC,GAAG,oBAAoBwoF,GAAG,MAAMl3E,MAAM1J,EAAE,MAAM,IAAI3H,EAAED,EAAE6oF,UAAU5oF,IAAIA,EAAE6oF,GAAG7oF,GAAGuoF,GAAGxoF,EAAE6oF,UAAU7oF,EAAE+B,KAAK9B,GAAG,CAAC,CAAC,SAAS8oF,GAAG/oF,GAAGyoF,GAAGC,GAAGA,GAAG7jE,KAAK7kB,GAAG0oF,GAAG,CAAC1oF,GAAGyoF,GAAGzoF,CAAC,CAAC,SAASgpF,KAAK,GAAGP,GAAG,CAAC,IAAIzoF,EAAEyoF,GAAGxoF,EAAEyoF,GAAoB,GAAjBA,GAAGD,GAAG,KAAKE,GAAG3oF,GAAMC,EAAE,IAAID,EAAE,EAAEA,EAAEC,EAAEE,OAAOH,IAAI2oF,GAAG1oF,EAAED,GAAG,CAAC,CAAC,SAASipF,GAAGjpF,EAAEC,GAAG,OAAOD,EAAEC,EAAE,CAAC,SAASipF,KAAK,CAAC,IAAIC,IAAG,EAAG,SAASC,GAAGppF,EAAEC,EAAEgI,GAAG,GAAGkhF,GAAG,OAAOnpF,EAAEC,EAAEgI,GAAGkhF,IAAG,EAAG,IAAI,OAAOF,GAAGjpF,EAAEC,EAAEgI,EAAE,CAAC,QAAWkhF,IAAG,GAAG,OAAOV,IAAI,OAAOC,MAAGQ,KAAKF,KAAI,CAAC,CAChb,SAASK,GAAGrpF,EAAEC,GAAG,IAAIgI,EAAEjI,EAAE6oF,UAAU,GAAG,OAAO5gF,EAAE,OAAO,KAAK,IAAIE,EAAE2gF,GAAG7gF,GAAG,GAAG,OAAOE,EAAE,OAAO,KAAKF,EAAEE,EAAElI,GAAGD,EAAE,OAAOC,GAAG,IAAK,UAAU,IAAK,iBAAiB,IAAK,gBAAgB,IAAK,uBAAuB,IAAK,cAAc,IAAK,qBAAqB,IAAK,cAAc,IAAK,qBAAqB,IAAK,YAAY,IAAK,mBAAmB,IAAK,gBAAgBkI,GAAGA,EAAE86E,YAAqB96E,IAAI,YAAbnI,EAAEA,EAAE+B,OAAuB,UAAU/B,GAAG,WAAWA,GAAG,aAAaA,IAAIA,GAAGmI,EAAE,MAAMnI,EAAE,QAAQA,GAAE,EAAG,GAAGA,EAAE,OAAO,KAAK,GAAGiI,GAAG,oBACleA,EAAE,MAAMqJ,MAAM1J,EAAE,IAAI3H,SAASgI,IAAI,OAAOA,CAAC,CAAC,IAAIqhF,IAAG,EAAG,GAAGv1B,EAAG,IAAI,IAAIw1B,GAAG,CAAC,EAAE3oF,OAAOmC,eAAewmF,GAAG,UAAU,CAACruE,IAAI,WAAWouE,IAAG,CAAE,IAAIxiF,OAAOgH,iBAAiB,OAAOy7E,GAAGA,IAAIziF,OAAO4D,oBAAoB,OAAO6+E,GAAGA,GAAG,CAAC,MAAMvpF,GAAGspF,IAAG,CAAE,CAAC,SAASE,GAAGxpF,EAAEC,EAAEgI,EAAEE,EAAErE,EAAEqD,EAAEe,EAAEE,EAAEhB,GAAG,IAAIG,EAAEjH,MAAMO,UAAU2Z,MAAMxZ,KAAKoB,UAAU,GAAG,IAAInC,EAAEulB,MAAMvd,EAAEV,EAAE,CAAC,MAAMC,GAAG4S,KAAKke,QAAQ9wB,EAAE,CAAC,CAAC,IAAIiiF,IAAG,EAAGC,GAAG,KAAKC,IAAG,EAAGC,GAAG,KAAKC,GAAG,CAACvxD,QAAQ,SAASt4B,GAAGypF,IAAG,EAAGC,GAAG1pF,CAAC,GAAG,SAAS8pF,GAAG9pF,EAAEC,EAAEgI,EAAEE,EAAErE,EAAEqD,EAAEe,EAAEE,EAAEhB,GAAGqiF,IAAG,EAAGC,GAAG,KAAKF,GAAGhkE,MAAMqkE,GAAGznF,UAAU,CACjW,SAAS2nF,GAAG/pF,GAAG,IAAIC,EAAED,EAAEiI,EAAEjI,EAAE,GAAGA,EAAEgqF,UAAU,KAAK/pF,EAAEgqF,QAAQhqF,EAAEA,EAAEgqF,WAAW,CAACjqF,EAAEC,EAAE,GAAO,KAAa,MAAjBA,EAAED,GAASU,SAAcuH,EAAEhI,EAAEgqF,QAAQjqF,EAAEC,EAAEgqF,aAAajqF,EAAE,CAAC,OAAO,IAAIC,EAAEshF,IAAIt5E,EAAE,IAAI,CAAC,SAASiiF,GAAGlqF,GAAG,GAAG,KAAKA,EAAEuhF,IAAI,CAAC,IAAIthF,EAAED,EAAEmqF,cAAsE,GAAxD,OAAOlqF,IAAkB,QAAdD,EAAEA,EAAEgqF,aAAqB/pF,EAAED,EAAEmqF,gBAAmB,OAAOlqF,EAAE,OAAOA,EAAEmqF,UAAU,CAAC,OAAO,IAAI,CAAC,SAASC,GAAGrqF,GAAG,GAAG+pF,GAAG/pF,KAAKA,EAAE,MAAMsR,MAAM1J,EAAE,KAAM,CAE1S,SAAS0iF,GAAGtqF,GAAW,OAAO,QAAfA,EADtN,SAAYA,GAAG,IAAIC,EAAED,EAAEgqF,UAAU,IAAI/pF,EAAE,CAAS,GAAG,QAAXA,EAAE8pF,GAAG/pF,IAAe,MAAMsR,MAAM1J,EAAE,MAAM,OAAO3H,IAAID,EAAE,KAAKA,CAAC,CAAC,IAAI,IAAIiI,EAAEjI,EAAEmI,EAAElI,IAAI,CAAC,IAAI6D,EAAEmE,EAAEgiF,OAAO,GAAG,OAAOnmF,EAAE,MAAM,IAAIqD,EAAErD,EAAEkmF,UAAU,GAAG,OAAO7iF,EAAE,CAAY,GAAG,QAAdgB,EAAErE,EAAEmmF,QAAmB,CAAChiF,EAAEE,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAGrE,EAAEymF,QAAQpjF,EAAEojF,MAAM,CAAC,IAAIpjF,EAAErD,EAAEymF,MAAMpjF,GAAG,CAAC,GAAGA,IAAIc,EAAE,OAAOoiF,GAAGvmF,GAAG9D,EAAE,GAAGmH,IAAIgB,EAAE,OAAOkiF,GAAGvmF,GAAG7D,EAAEkH,EAAEA,EAAEqjF,OAAO,CAAC,MAAMl5E,MAAM1J,EAAE,KAAM,CAAC,GAAGK,EAAEgiF,SAAS9hF,EAAE8hF,OAAOhiF,EAAEnE,EAAEqE,EAAEhB,MAAM,CAAC,IAAI,IAAIe,GAAE,EAAGE,EAAEtE,EAAEymF,MAAMniF,GAAG,CAAC,GAAGA,IAAIH,EAAE,CAACC,GAAE,EAAGD,EAAEnE,EAAEqE,EAAEhB,EAAE,KAAK,CAAC,GAAGiB,IAAID,EAAE,CAACD,GAAE,EAAGC,EAAErE,EAAEmE,EAAEd,EAAE,KAAK,CAACiB,EAAEA,EAAEoiF,OAAO,CAAC,IAAItiF,EAAE,CAAC,IAAIE,EAAEjB,EAAEojF,MAAMniF,GAAG,CAAC,GAAGA,IAC5fH,EAAE,CAACC,GAAE,EAAGD,EAAEd,EAAEgB,EAAErE,EAAE,KAAK,CAAC,GAAGsE,IAAID,EAAE,CAACD,GAAE,EAAGC,EAAEhB,EAAEc,EAAEnE,EAAE,KAAK,CAACsE,EAAEA,EAAEoiF,OAAO,CAAC,IAAItiF,EAAE,MAAMoJ,MAAM1J,EAAE,KAAM,CAAC,CAAC,GAAGK,EAAE+hF,YAAY7hF,EAAE,MAAMmJ,MAAM1J,EAAE,KAAM,CAAC,GAAG,IAAIK,EAAEs5E,IAAI,MAAMjwE,MAAM1J,EAAE,MAAM,OAAOK,EAAE4gF,UAAUrgF,UAAUP,EAAEjI,EAAEC,CAAC,CAAkBwqF,CAAGzqF,IAAmB0qF,GAAG1qF,GAAG,IAAI,CAAC,SAAS0qF,GAAG1qF,GAAG,GAAG,IAAIA,EAAEuhF,KAAK,IAAIvhF,EAAEuhF,IAAI,OAAOvhF,EAAE,IAAIA,EAAEA,EAAEuqF,MAAM,OAAOvqF,GAAG,CAAC,IAAIC,EAAEyqF,GAAG1qF,GAAG,GAAG,OAAOC,EAAE,OAAOA,EAAED,EAAEA,EAAEwqF,OAAO,CAAC,OAAO,IAAI,CAC1X,IAAIG,GAAGjxB,EAAGkxB,0BAA0BC,GAAGnxB,EAAGoxB,wBAAwBxsE,GAAGo7C,EAAGqxB,qBAAqBC,GAAGtxB,EAAGuxB,sBAAsB/tE,GAAEw8C,EAAGwxB,aAAaC,GAAGzxB,EAAG0xB,iCAAiCC,GAAG3xB,EAAG4xB,2BAA2BC,GAAG7xB,EAAG8xB,8BAA8BC,GAAG/xB,EAAGgyB,wBAAwBC,GAAGjyB,EAAGkyB,qBAAqBC,GAAGnyB,EAAGoyB,sBAAsBC,GAAG,KAAKC,GAAG,KACvV,IAAIC,GAAGv5E,KAAKw5E,MAAMx5E,KAAKw5E,MAAiC,SAAYlsF,GAAU,OAAO,KAAdA,KAAK,GAAe,GAAG,IAAImsF,GAAGnsF,GAAGosF,GAAG,GAAG,CAAC,EAA/ED,GAAGz5E,KAAKiH,IAAIyyE,GAAG15E,KAAK25E,IAA4D,IAAIC,GAAG,GAAGC,GAAG,QAC7H,SAASC,GAAGxsF,GAAG,OAAOA,GAAGA,GAAG,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,GAAG,OAAO,GAAG,KAAK,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,QAAQ,KAAK,QAAQ,OAAS,QAAFA,EAAU,KAAK,QAAQ,KAAK,QAAQ,KAAK,SAAS,KAAK,SAAS,KAAK,SAAS,OAAS,UAAFA,EAAY,KAAK,UAAU,OAAO,UAAU,KAAK,UAAU,OAAO,UAAU,KAAK,UAAU,OAAO,UAAU,KAAK,WAAW,OAAO,WACzgB,QAAQ,OAAOA,EAAE,CAAC,SAASysF,GAAGzsF,EAAEC,GAAG,IAAIgI,EAAEjI,EAAE0sF,aAAa,GAAG,IAAIzkF,EAAE,OAAO,EAAE,IAAIE,EAAE,EAAErE,EAAE9D,EAAE2sF,eAAexlF,EAAEnH,EAAE4sF,YAAY1kF,EAAI,UAAFD,EAAY,GAAG,IAAIC,EAAE,CAAC,IAAIE,EAAEF,GAAGpE,EAAE,IAAIsE,EAAED,EAAEqkF,GAAGpkF,GAAS,KAALjB,GAAGe,KAAUC,EAAEqkF,GAAGrlF,GAAI,MAAa,KAAPe,EAAED,GAAGnE,GAAQqE,EAAEqkF,GAAGtkF,GAAG,IAAIf,IAAIgB,EAAEqkF,GAAGrlF,IAAI,GAAG,IAAIgB,EAAE,OAAO,EAAE,GAAG,IAAIlI,GAAGA,IAAIkI,GAAG,KAAKlI,EAAE6D,MAAKA,EAAEqE,GAAGA,KAAEhB,EAAElH,GAAGA,IAAQ,KAAK6D,GAAG,KAAO,QAAFqD,IAAY,OAAOlH,EAA0C,GAAxC,KAAO,EAAFkI,KAAOA,GAAK,GAAFF,GAA4B,KAAtBhI,EAAED,EAAE6sF,gBAAwB,IAAI7sF,EAAEA,EAAE8sF,cAAc7sF,GAAGkI,EAAE,EAAElI,GAAc6D,EAAE,IAAbmE,EAAE,GAAGgkF,GAAGhsF,IAAUkI,GAAGnI,EAAEiI,GAAGhI,IAAI6D,EAAE,OAAOqE,CAAC,CACvc,SAAS4kF,GAAG/sF,EAAEC,GAAG,OAAOD,GAAG,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAOC,EAAE,IAAI,KAAK,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,QAAQ,KAAK,QAAQ,OAAOA,EAAE,IAAuJ,QAAQ,OAAO,EAAE,CACrN,SAAS+sF,GAAGhtF,GAAgC,OAAO,KAApCA,GAAkB,WAAhBA,EAAE0sF,cAAsC1sF,EAAI,WAAFA,EAAa,WAAW,CAAC,CAAC,SAASitF,KAAK,IAAIjtF,EAAEssF,GAAoC,OAA1B,KAAQ,SAAfA,KAAK,MAAqBA,GAAG,IAAWtsF,CAAC,CAAC,SAASktF,GAAGltF,GAAG,IAAI,IAAIC,EAAE,GAAGgI,EAAE,EAAE,GAAGA,EAAEA,IAAIhI,EAAE4kB,KAAK7kB,GAAG,OAAOC,CAAC,CAC3a,SAASktF,GAAGntF,EAAEC,EAAEgI,GAAGjI,EAAE0sF,cAAczsF,EAAE,YAAYA,IAAID,EAAE2sF,eAAe,EAAE3sF,EAAE4sF,YAAY,IAAG5sF,EAAEA,EAAEotF,YAAWntF,EAAE,GAAGgsF,GAAGhsF,IAAQgI,CAAC,CACzH,SAASolF,GAAGrtF,EAAEC,GAAG,IAAIgI,EAAEjI,EAAE6sF,gBAAgB5sF,EAAE,IAAID,EAAEA,EAAE8sF,cAAc7kF,GAAG,CAAC,IAAIE,EAAE,GAAG8jF,GAAGhkF,GAAGnE,EAAE,GAAGqE,EAAErE,EAAE7D,EAAED,EAAEmI,GAAGlI,IAAID,EAAEmI,IAAIlI,GAAGgI,IAAInE,CAAC,CAAC,CAAC,IAAImW,GAAE,EAAE,SAASqzE,GAAGttF,GAAS,OAAO,GAAbA,IAAIA,GAAa,EAAEA,EAAE,KAAO,UAAFA,GAAa,GAAG,UAAU,EAAE,CAAC,CAAC,IAAIutF,GAAGC,GAAGC,GAAGC,GAAGC,GAAGC,IAAG,EAAGC,GAAG,GAAGC,GAAG,KAAKC,GAAG,KAAKC,GAAG,KAAKC,GAAG,IAAIrd,IAAIsd,GAAG,IAAItd,IAAIud,GAAG,GAAGC,GAAG,6PAA6Pj8E,MAAM,KAChiB,SAASk8E,GAAGruF,EAAEC,GAAG,OAAOD,GAAG,IAAK,UAAU,IAAK,WAAW8tF,GAAG,KAAK,MAAM,IAAK,YAAY,IAAK,YAAYC,GAAG,KAAK,MAAM,IAAK,YAAY,IAAK,WAAWC,GAAG,KAAK,MAAM,IAAK,cAAc,IAAK,aAAaC,GAAGK,OAAOruF,EAAEsuF,WAAW,MAAM,IAAK,oBAAoB,IAAK,qBAAqBL,GAAGI,OAAOruF,EAAEsuF,WAAW,CACnT,SAASC,GAAGxuF,EAAEC,EAAEgI,EAAEE,EAAErE,EAAEqD,GAAG,OAAG,OAAOnH,GAAGA,EAAEyuF,cAActnF,GAASnH,EAAE,CAAC0uF,UAAUzuF,EAAE0uF,aAAa1mF,EAAE2mF,iBAAiBzmF,EAAEsmF,YAAYtnF,EAAE0nF,iBAAiB,CAAC/qF,IAAI,OAAO7D,IAAY,QAARA,EAAE2oF,GAAG3oF,KAAautF,GAAGvtF,IAAID,IAAEA,EAAE4uF,kBAAkBzmF,EAAElI,EAAED,EAAE6uF,iBAAiB,OAAO/qF,IAAI,IAAI7D,EAAEsM,QAAQzI,IAAI7D,EAAE4kB,KAAK/gB,GAAU9D,EAAC,CAEpR,SAAS8uF,GAAG9uF,GAAG,IAAIC,EAAE8uF,GAAG/uF,EAAEooF,QAAQ,GAAG,OAAOnoF,EAAE,CAAC,IAAIgI,EAAE8hF,GAAG9pF,GAAG,GAAG,OAAOgI,EAAE,GAAW,MAARhI,EAAEgI,EAAEs5E,MAAY,GAAW,QAARthF,EAAEiqF,GAAGjiF,IAA4D,OAA/CjI,EAAE0uF,UAAUzuF,OAAE0tF,GAAG3tF,EAAEgvF,UAAS,WAAWvB,GAAGxlF,EAAE,SAAgB,GAAG,IAAIhI,GAAGgI,EAAE4gF,UAAUrgF,QAAQ2hF,cAAc8E,aAAmE,YAArDjvF,EAAE0uF,UAAU,IAAIzmF,EAAEs5E,IAAIt5E,EAAE4gF,UAAUqG,cAAc,KAAY,CAAClvF,EAAE0uF,UAAU,IAAI,CAClT,SAASS,GAAGnvF,GAAG,GAAG,OAAOA,EAAE0uF,UAAU,OAAM,EAAG,IAAI,IAAIzuF,EAAED,EAAE6uF,iBAAiB,EAAE5uF,EAAEE,QAAQ,CAAC,IAAI8H,EAAEmnF,GAAGpvF,EAAE2uF,aAAa3uF,EAAE4uF,iBAAiB3uF,EAAE,GAAGD,EAAEyuF,aAAa,GAAG,OAAOxmF,EAAiG,OAAe,QAARhI,EAAE2oF,GAAG3gF,KAAaulF,GAAGvtF,GAAGD,EAAE0uF,UAAUzmF,GAAE,EAA3H,IAAIE,EAAE,IAAtBF,EAAEjI,EAAEyuF,aAAwBvuF,YAAY+H,EAAElG,KAAKkG,GAAGigF,GAAG//E,EAAEF,EAAEmgF,OAAO1uD,cAAcvxB,GAAG+/E,GAAG,KAA0DjoF,EAAEoqB,OAAO,CAAC,OAAM,CAAE,CAAC,SAASglE,GAAGrvF,EAAEC,EAAEgI,GAAGknF,GAAGnvF,IAAIiI,EAAEqmF,OAAOruF,EAAE,CAAC,SAASqvF,KAAK1B,IAAG,EAAG,OAAOE,IAAIqB,GAAGrB,MAAMA,GAAG,MAAM,OAAOC,IAAIoB,GAAGpB,MAAMA,GAAG,MAAM,OAAOC,IAAImB,GAAGnB,MAAMA,GAAG,MAAMC,GAAGzgF,QAAQ6hF,IAAInB,GAAG1gF,QAAQ6hF,GAAG,CACnf,SAASE,GAAGvvF,EAAEC,GAAGD,EAAE0uF,YAAYzuF,IAAID,EAAE0uF,UAAU,KAAKd,KAAKA,IAAG,EAAGl0B,EAAGkxB,0BAA0BlxB,EAAGgyB,wBAAwB4D,KAAK,CAC5H,SAASE,GAAGxvF,GAAG,SAASC,EAAEA,GAAG,OAAOsvF,GAAGtvF,EAAED,EAAE,CAAC,GAAG,EAAE6tF,GAAG1tF,OAAO,CAACovF,GAAG1B,GAAG,GAAG7tF,GAAG,IAAI,IAAIiI,EAAE,EAAEA,EAAE4lF,GAAG1tF,OAAO8H,IAAI,CAAC,IAAIE,EAAE0lF,GAAG5lF,GAAGE,EAAEumF,YAAY1uF,IAAImI,EAAEumF,UAAU,KAAK,CAAC,CAAyF,IAAxF,OAAOZ,IAAIyB,GAAGzB,GAAG9tF,GAAG,OAAO+tF,IAAIwB,GAAGxB,GAAG/tF,GAAG,OAAOguF,IAAIuB,GAAGvB,GAAGhuF,GAAGiuF,GAAGzgF,QAAQvN,GAAGiuF,GAAG1gF,QAAQvN,GAAOgI,EAAE,EAAEA,EAAEkmF,GAAGhuF,OAAO8H,KAAIE,EAAEgmF,GAAGlmF,IAAKymF,YAAY1uF,IAAImI,EAAEumF,UAAU,MAAM,KAAK,EAAEP,GAAGhuF,QAAiB,QAAR8H,EAAEkmF,GAAG,IAAYO,WAAYI,GAAG7mF,GAAG,OAAOA,EAAEymF,WAAWP,GAAG9jE,OAAO,CAAC,IAAIolE,GAAGl2B,EAAGm2B,wBAAwBC,IAAG,EAC5a,SAASC,GAAG5vF,EAAEC,EAAEgI,EAAEE,GAAG,IAAIrE,EAAEmW,GAAE9S,EAAEsoF,GAAGI,WAAWJ,GAAGI,WAAW,KAAK,IAAI51E,GAAE,EAAE61E,GAAG9vF,EAAEC,EAAEgI,EAAEE,EAAE,CAAC,QAAQ8R,GAAEnW,EAAE2rF,GAAGI,WAAW1oF,CAAC,CAAC,CAAC,SAAS4oF,GAAG/vF,EAAEC,EAAEgI,EAAEE,GAAG,IAAIrE,EAAEmW,GAAE9S,EAAEsoF,GAAGI,WAAWJ,GAAGI,WAAW,KAAK,IAAI51E,GAAE,EAAE61E,GAAG9vF,EAAEC,EAAEgI,EAAEE,EAAE,CAAC,QAAQ8R,GAAEnW,EAAE2rF,GAAGI,WAAW1oF,CAAC,CAAC,CACjO,SAAS2oF,GAAG9vF,EAAEC,EAAEgI,EAAEE,GAAG,GAAGwnF,GAAG,CAAC,IAAI7rF,EAAEsrF,GAAGpvF,EAAEC,EAAEgI,EAAEE,GAAG,GAAG,OAAOrE,EAAEksF,GAAGhwF,EAAEC,EAAEkI,EAAE4T,GAAG9T,GAAGomF,GAAGruF,EAAEmI,QAAQ,GANtF,SAAYnI,EAAEC,EAAEgI,EAAEE,EAAErE,GAAG,OAAO7D,GAAG,IAAK,UAAU,OAAO6tF,GAAGU,GAAGV,GAAG9tF,EAAEC,EAAEgI,EAAEE,EAAErE,IAAG,EAAG,IAAK,YAAY,OAAOiqF,GAAGS,GAAGT,GAAG/tF,EAAEC,EAAEgI,EAAEE,EAAErE,IAAG,EAAG,IAAK,YAAY,OAAOkqF,GAAGQ,GAAGR,GAAGhuF,EAAEC,EAAEgI,EAAEE,EAAErE,IAAG,EAAG,IAAK,cAAc,IAAIqD,EAAErD,EAAEyqF,UAAkD,OAAxCN,GAAGtwE,IAAIxW,EAAEqnF,GAAGP,GAAG/yE,IAAI/T,IAAI,KAAKnH,EAAEC,EAAEgI,EAAEE,EAAErE,KAAU,EAAG,IAAK,oBAAoB,OAAOqD,EAAErD,EAAEyqF,UAAUL,GAAGvwE,IAAIxW,EAAEqnF,GAAGN,GAAGhzE,IAAI/T,IAAI,KAAKnH,EAAEC,EAAEgI,EAAEE,EAAErE,KAAI,EAAG,OAAM,CAAE,CAM1QmsF,CAAGnsF,EAAE9D,EAAEC,EAAEgI,EAAEE,GAAGA,EAAE+nF,uBAAuB,GAAG7B,GAAGruF,EAAEmI,GAAK,EAAFlI,IAAM,EAAEmuF,GAAG7hF,QAAQvM,GAAG,CAAC,KAAK,OAAO8D,GAAG,CAAC,IAAIqD,EAAEyhF,GAAG9kF,GAA0D,GAAvD,OAAOqD,GAAGomF,GAAGpmF,GAAiB,QAAdA,EAAEioF,GAAGpvF,EAAEC,EAAEgI,EAAEE,KAAa6nF,GAAGhwF,EAAEC,EAAEkI,EAAE4T,GAAG9T,GAAMd,IAAIrD,EAAE,MAAMA,EAAEqD,CAAC,CAAC,OAAOrD,GAAGqE,EAAE+nF,iBAAiB,MAAMF,GAAGhwF,EAAEC,EAAEkI,EAAE,KAAKF,EAAE,CAAC,CAAC,IAAI8T,GAAG,KACpU,SAASqzE,GAAGpvF,EAAEC,EAAEgI,EAAEE,GAA2B,GAAxB4T,GAAG,KAAwB,QAAX/b,EAAE+uF,GAAV/uF,EAAEmoF,GAAGhgF,KAAuB,GAAW,QAARlI,EAAE8pF,GAAG/pF,IAAYA,EAAE,UAAU,GAAW,MAARiI,EAAEhI,EAAEshF,KAAW,CAAS,GAAG,QAAXvhF,EAAEkqF,GAAGjqF,IAAe,OAAOD,EAAEA,EAAE,IAAI,MAAM,GAAG,IAAIiI,EAAE,CAAC,GAAGhI,EAAE4oF,UAAUrgF,QAAQ2hF,cAAc8E,aAAa,OAAO,IAAIhvF,EAAEshF,IAAIthF,EAAE4oF,UAAUqG,cAAc,KAAKlvF,EAAE,IAAI,MAAMC,IAAID,IAAIA,EAAE,MAAW,OAAL+b,GAAG/b,EAAS,IAAI,CAC7S,SAASmwF,GAAGnwF,GAAG,OAAOA,GAAG,IAAK,SAAS,IAAK,QAAQ,IAAK,QAAQ,IAAK,cAAc,IAAK,OAAO,IAAK,MAAM,IAAK,WAAW,IAAK,WAAW,IAAK,UAAU,IAAK,YAAY,IAAK,OAAO,IAAK,UAAU,IAAK,WAAW,IAAK,QAAQ,IAAK,UAAU,IAAK,UAAU,IAAK,WAAW,IAAK,QAAQ,IAAK,YAAY,IAAK,UAAU,IAAK,QAAQ,IAAK,QAAQ,IAAK,OAAO,IAAK,gBAAgB,IAAK,cAAc,IAAK,YAAY,IAAK,aAAa,IAAK,QAAQ,IAAK,SAAS,IAAK,SAAS,IAAK,SAAS,IAAK,cAAc,IAAK,WAAW,IAAK,aAAa,IAAK,eAAe,IAAK,SAAS,IAAK,kBAAkB,IAAK,YAAY,IAAK,mBAAmB,IAAK,iBAAiB,IAAK,oBAAoB,IAAK,aAAa,IAAK,YAAY,IAAK,cAAc,IAAK,OAAO,IAAK,mBAAmB,IAAK,QAAQ,IAAK,aAAa,IAAK,WAAW,IAAK,SAAS,IAAK,cAAc,OAAO,EAAE,IAAK,OAAO,IAAK,YAAY,IAAK,WAAW,IAAK,YAAY,IAAK,WAAW,IAAK,YAAY,IAAK,WAAW,IAAK,YAAY,IAAK,cAAc,IAAK,aAAa,IAAK,cAAc,IAAK,SAAS,IAAK,SAAS,IAAK,YAAY,IAAK,QAAQ,IAAK,aAAa,IAAK,aAAa,IAAK,eAAe,IAAK,eAAe,OAAO,EACpqC,IAAK,UAAU,OAAOmrF,MAAM,KAAKE,GAAG,OAAO,EAAE,KAAKE,GAAG,OAAO,EAAE,KAAKE,GAAG,KAAKE,GAAG,OAAO,GAAG,KAAKE,GAAG,OAAO,UAAU,QAAQ,OAAO,GAAG,QAAQ,OAAO,GAAG,CAAC,IAAIuE,GAAG,KAAKC,GAAG,KAAKC,GAAG,KAAK,SAASC,KAAK,GAAGD,GAAG,OAAOA,GAAG,IAAItwF,EAAkBmI,EAAhBlI,EAAEowF,GAAGpoF,EAAEhI,EAAEE,OAAS2D,EAAE,UAAUssF,GAAGA,GAAGxkF,MAAMwkF,GAAGzsB,YAAYx8D,EAAErD,EAAE3D,OAAO,IAAIH,EAAE,EAAEA,EAAEiI,GAAGhI,EAAED,KAAK8D,EAAE9D,GAAGA,KAAK,IAAIkI,EAAED,EAAEjI,EAAE,IAAImI,EAAE,EAAEA,GAAGD,GAAGjI,EAAEgI,EAAEE,KAAKrE,EAAEqD,EAAEgB,GAAGA,KAAK,OAAOmoF,GAAGxsF,EAAE0W,MAAMxa,EAAE,EAAEmI,EAAE,EAAEA,OAAE,EAAO,CACxY,SAASqoF,GAAGxwF,GAAG,IAAIC,EAAED,EAAEywF,QAA+E,MAAvE,aAAazwF,EAAgB,KAAbA,EAAEA,EAAE0wF,WAAgB,KAAKzwF,IAAID,EAAE,IAAKA,EAAEC,EAAE,KAAKD,IAAIA,EAAE,IAAW,IAAIA,GAAG,KAAKA,EAAEA,EAAE,CAAC,CAAC,SAAS2wF,KAAK,OAAM,CAAE,CAAC,SAASC,KAAK,OAAM,CAAE,CAC5K,SAASC,GAAG7wF,GAAG,SAASC,EAAEA,EAAEkI,EAAErE,EAAEqD,EAAEe,GAA6G,IAAI,IAAID,KAAlHmS,KAAK02E,WAAW7wF,EAAEma,KAAK22E,YAAYjtF,EAAEsW,KAAKrY,KAAKoG,EAAEiS,KAAKq0E,YAAYtnF,EAAEiT,KAAKguE,OAAOlgF,EAAEkS,KAAK42E,cAAc,KAAkBhxF,EAAEA,EAAEe,eAAekH,KAAKhI,EAAED,EAAEiI,GAAGmS,KAAKnS,GAAGhI,EAAEA,EAAEkH,GAAGA,EAAEc,IAAgI,OAA5HmS,KAAK62E,oBAAoB,MAAM9pF,EAAE+pF,iBAAiB/pF,EAAE+pF,kBAAiB,IAAK/pF,EAAEgqF,aAAaR,GAAGC,GAAGx2E,KAAKg3E,qBAAqBR,GAAUx2E,IAAI,CAC9E,OAD+EvD,EAAE5W,EAAEY,UAAU,CAACwwF,eAAe,WAAWj3E,KAAK82E,kBAAiB,EAAG,IAAIlxF,EAAEoa,KAAKq0E,YAAYzuF,IAAIA,EAAEqxF,eAAerxF,EAAEqxF,iBAAiB,mBAAmBrxF,EAAEmxF,cAC7enxF,EAAEmxF,aAAY,GAAI/2E,KAAK62E,mBAAmBN,GAAG,EAAET,gBAAgB,WAAW,IAAIlwF,EAAEoa,KAAKq0E,YAAYzuF,IAAIA,EAAEkwF,gBAAgBlwF,EAAEkwF,kBAAkB,mBAAmBlwF,EAAEsxF,eAAetxF,EAAEsxF,cAAa,GAAIl3E,KAAKg3E,qBAAqBT,GAAG,EAAEY,QAAQ,WAAW,EAAEC,aAAab,KAAY1wF,CAAC,CACjR,IAAoLwxF,GAAGC,GAAGC,GAAtLC,GAAG,CAACC,WAAW,EAAEC,QAAQ,EAAEC,WAAW,EAAEC,UAAU,SAAShyF,GAAG,OAAOA,EAAEgyF,WAAWr2E,KAAK6H,KAAK,EAAE0tE,iBAAiB,EAAEe,UAAU,GAAGC,GAAGrB,GAAGe,IAAIO,GAAGt7E,EAAE,CAAC,EAAE+6E,GAAG,CAACQ,KAAK,EAAEC,OAAO,IAAIC,GAAGzB,GAAGsB,IAAaI,GAAG17E,EAAE,CAAC,EAAEs7E,GAAG,CAACK,QAAQ,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,SAAS,EAAEC,OAAO,EAAEC,QAAQ,EAAEC,iBAAiBC,GAAGC,OAAO,EAAEC,QAAQ,EAAEC,cAAc,SAAStzF,GAAG,YAAO,IAASA,EAAEszF,cAActzF,EAAEuzF,cAAcvzF,EAAEqoF,WAAWroF,EAAEwzF,UAAUxzF,EAAEuzF,YAAYvzF,EAAEszF,aAAa,EAAEG,UAAU,SAASzzF,GAAG,MAAG,cAC3eA,EAASA,EAAEyzF,WAAUzzF,IAAI2xF,KAAKA,IAAI,cAAc3xF,EAAE+B,MAAM0vF,GAAGzxF,EAAEwyF,QAAQb,GAAGa,QAAQd,GAAG1xF,EAAEyyF,QAAQd,GAAGc,SAASf,GAAGD,GAAG,EAAEE,GAAG3xF,GAAUyxF,GAAE,EAAEiC,UAAU,SAAS1zF,GAAG,MAAM,cAAcA,EAAEA,EAAE0zF,UAAUhC,EAAE,IAAIiC,GAAG9C,GAAG0B,IAAiCqB,GAAG/C,GAA7Bh6E,EAAE,CAAC,EAAE07E,GAAG,CAACsB,aAAa,KAA4CC,GAAGjD,GAA9Bh6E,EAAE,CAAC,EAAEs7E,GAAG,CAACmB,cAAc,KAA0ES,GAAGlD,GAA5Dh6E,EAAE,CAAC,EAAE+6E,GAAG,CAACoC,cAAc,EAAEC,YAAY,EAAEC,cAAc,KAAsHC,GAAGtD,GAAxGh6E,EAAE,CAAC,EAAE+6E,GAAG,CAACwC,cAAc,SAASp0F,GAAG,MAAM,kBAAkBA,EAAEA,EAAEo0F,cAActtF,OAAOstF,aAAa,KAAmCC,GAAGxD,GAArBh6E,EAAE,CAAC,EAAE+6E,GAAG,CAAC1nF,KAAK,KAAcoqF,GAAG,CAACC,IAAI,SACxfC,SAAS,IAAIC,KAAK,YAAYC,GAAG,UAAUC,MAAM,aAAaC,KAAK,YAAYC,IAAI,SAASC,IAAI,KAAKC,KAAK,cAAcC,KAAK,cAAcC,OAAO,aAAaC,gBAAgB,gBAAgBC,GAAG,CAAC,EAAE,YAAY,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,GAAG,IAAI,GAAG,SAAS,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,YAAY,GAAG,UAAU,GAAG,aAAa,GAAG,YAAY,GAAG,SAAS,GAAG,SAAS,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KACtf,IAAI,KAAK,IAAI,KAAK,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,UAAU,IAAI,aAAa,IAAI,QAAQC,GAAG,CAACC,IAAI,SAASC,QAAQ,UAAUC,KAAK,UAAUC,MAAM,YAAY,SAASC,GAAGz1F,GAAG,IAAIC,EAAEma,KAAKq0E,YAAY,OAAOxuF,EAAEizF,iBAAiBjzF,EAAEizF,iBAAiBlzF,MAAIA,EAAEo1F,GAAGp1F,OAAMC,EAAED,EAAK,CAAC,SAASmzF,KAAK,OAAOsC,EAAE,CAChS,IACiEC,GAAG7E,GAD7Dh6E,EAAE,CAAC,EAAEs7E,GAAG,CAAClxF,IAAI,SAASjB,GAAG,GAAGA,EAAEiB,IAAI,CAAC,IAAIhB,EAAEq0F,GAAGt0F,EAAEiB,MAAMjB,EAAEiB,IAAI,GAAG,iBAAiBhB,EAAE,OAAOA,CAAC,CAAC,MAAM,aAAaD,EAAE+B,KAAc,MAAR/B,EAAEwwF,GAAGxwF,IAAU,QAAQslB,OAAOC,aAAavlB,GAAI,YAAYA,EAAE+B,MAAM,UAAU/B,EAAE+B,KAAKozF,GAAGn1F,EAAEywF,UAAU,eAAe,EAAE,EAAEx3D,KAAK,EAAElyB,SAAS,EAAE+rF,QAAQ,EAAEC,SAAS,EAAEC,OAAO,EAAEC,QAAQ,EAAE0C,OAAO,EAAEC,OAAO,EAAE1C,iBAAiBC,GAAGzC,SAAS,SAAS1wF,GAAG,MAAM,aAAaA,EAAE+B,KAAKyuF,GAAGxwF,GAAG,CAAC,EAAEywF,QAAQ,SAASzwF,GAAG,MAAM,YAAYA,EAAE+B,MAAM,UAAU/B,EAAE+B,KAAK/B,EAAEywF,QAAQ,CAAC,EAAEoF,MAAM,SAAS71F,GAAG,MAAM,aAC7eA,EAAE+B,KAAKyuF,GAAGxwF,GAAG,YAAYA,EAAE+B,MAAM,UAAU/B,EAAE+B,KAAK/B,EAAEywF,QAAQ,CAAC,KAA2IqF,GAAGjF,GAA7Hh6E,EAAE,CAAC,EAAE07E,GAAG,CAAChE,UAAU,EAAEplF,MAAM,EAAEC,OAAO,EAAE2sF,SAAS,EAAEC,mBAAmB,EAAEC,MAAM,EAAEC,MAAM,EAAEC,MAAM,EAAEC,YAAY,EAAEC,UAAU,KAAmIC,GAAGzF,GAArHh6E,EAAE,CAAC,EAAEs7E,GAAG,CAACoE,QAAQ,EAAEC,cAAc,EAAEC,eAAe,EAAEzD,OAAO,EAAEC,QAAQ,EAAEH,QAAQ,EAAEC,SAAS,EAAEG,iBAAiBC,MAA0EuD,GAAG7F,GAA3Dh6E,EAAE,CAAC,EAAE+6E,GAAG,CAAC9Q,aAAa,EAAEmT,YAAY,EAAEC,cAAc,KAC/PyC,GAAG9F,GAD6Qh6E,EAAE,CAAC,EAAE07E,GAAG,CAACqE,OAAO,SAAS52F,GAAG,MAAM,WAAWA,EAAEA,EAAE42F,OAAO,gBAAgB52F,GAAGA,EAAE62F,YAAY,CAAC,EACnfC,OAAO,SAAS92F,GAAG,MAAM,WAAWA,EAAEA,EAAE82F,OAAO,gBAAgB92F,GAAGA,EAAE+2F,YAAY,eAAe/2F,GAAGA,EAAEg3F,WAAW,CAAC,EAAEC,OAAO,EAAEC,UAAU,KAAcC,GAAG,CAAC,EAAE,GAAG,GAAG,IAAIzyE,GAAGqvC,GAAI,qBAAqBjtD,OAAOugB,GAAG,KAAK0sC,GAAI,iBAAiBhuD,WAAWshB,GAAGthB,SAASqxF,cAAc,IAAIjxE,GAAG4tC,GAAI,cAAcjtD,SAASugB,GAAGnB,GAAG6tC,KAAMrvC,IAAI2C,IAAI,EAAEA,IAAI,IAAIA,IAAIkN,GAAGjP,OAAOC,aAAa,IAAIa,IAAG,EAC1W,SAASC,GAAGrmB,EAAEC,GAAG,OAAOD,GAAG,IAAK,QAAQ,OAAO,IAAIm3F,GAAG5qF,QAAQtM,EAAEwwF,SAAS,IAAK,UAAU,OAAO,MAAMxwF,EAAEwwF,QAAQ,IAAK,WAAW,IAAK,YAAY,IAAK,WAAW,OAAM,EAAG,QAAQ,OAAM,EAAG,CAAC,SAASxqE,GAAGjmB,GAAc,MAAM,kBAAjBA,EAAEA,EAAEqyF,SAAkC,SAASryF,EAAEA,EAAEkK,KAAK,IAAI,CAAC,IAAIsa,IAAG,EAE9Q,IAAIS,GAAG,CAACw3C,OAAM,EAAG46B,MAAK,EAAGC,UAAS,EAAG,kBAAiB,EAAGC,OAAM,EAAGC,OAAM,EAAG3X,QAAO,EAAG90E,UAAS,EAAGuiC,OAAM,EAAG9mC,QAAO,EAAGixF,KAAI,EAAG5vE,MAAK,EAAG0lB,MAAK,EAAGrnC,KAAI,EAAGwxF,MAAK,GAAI,SAASnxE,GAAGvmB,GAAG,IAAIC,EAAED,GAAGA,EAAE0jE,UAAU1jE,EAAE0jE,SAASh2D,cAAc,MAAM,UAAUzN,IAAIglB,GAAGjlB,EAAE+B,MAAM,aAAa9B,CAAO,CAAC,SAASwkB,GAAGzkB,EAAEC,EAAEgI,EAAEE,GAAG4gF,GAAG5gF,GAAsB,GAAnBlI,EAAE8kB,GAAG9kB,EAAE,aAAgBE,SAAS8H,EAAE,IAAIiqF,GAAG,WAAW,SAAS,KAAKjqF,EAAEE,GAAGnI,EAAE6kB,KAAK,CAAC21B,MAAMvyC,EAAE6kD,UAAU7sD,IAAI,CAAC,IAAIwmB,GAAG,KAAKgD,GAAG,KAAK,SAASgL,GAAGz0B,GAAG8kB,GAAG9kB,EAAE,EAAE,CAAC,SAASw0B,GAAGx0B,GAAe,GAAG8iE,EAAT98C,GAAGhmB,IAAY,OAAOA,CAAC,CACpe,SAASsmB,GAAGtmB,EAAEC,GAAG,GAAG,WAAWD,EAAE,OAAOC,CAAC,CAAC,IAAIynB,IAAG,EAAG,GAAGqsC,EAAG,CAAC,IAAIhsC,GAAG,GAAGgsC,EAAG,CAAC,IAAIptC,GAAG,YAAY5gB,SAAS,IAAI4gB,GAAG,CAAC,IAAIkD,GAAG9jB,SAASC,cAAc,OAAO6jB,GAAGzjB,aAAa,UAAU,WAAWugB,GAAG,oBAAoBkD,GAAG8tE,OAAO,CAAC5vE,GAAGpB,EAAE,MAAMoB,IAAG,EAAGL,GAAGK,MAAMhiB,SAASqxF,cAAc,EAAErxF,SAASqxF,aAAa,CAAC,SAASrwE,KAAKN,KAAKA,GAAGmxE,YAAY,mBAAmBhvE,IAAIa,GAAGhD,GAAG,KAAK,CAAC,SAASmC,GAAG5oB,GAAG,GAAG,UAAUA,EAAE8gF,cAActsD,GAAG/K,IAAI,CAAC,IAAIxpB,EAAE,GAAGwkB,GAAGxkB,EAAEwpB,GAAGzpB,EAAEmoF,GAAGnoF,IAAIopF,GAAG30D,GAAGx0B,EAAE,CAAC,CAC/b,SAAS0nB,GAAG3nB,EAAEC,EAAEgI,GAAG,YAAYjI,GAAG+mB,KAAU0C,GAAGxhB,GAARwe,GAAGxmB,GAAU43F,YAAY,mBAAmBjvE,KAAK,aAAa5oB,GAAG+mB,IAAI,CAAC,SAASQ,GAAGvnB,GAAG,GAAG,oBAAoBA,GAAG,UAAUA,GAAG,YAAYA,EAAE,OAAOw0B,GAAG/K,GAAG,CAAC,SAASjD,GAAGxmB,EAAEC,GAAG,GAAG,UAAUD,EAAE,OAAOw0B,GAAGv0B,EAAE,CAAC,SAASioB,GAAGloB,EAAEC,GAAG,GAAG,UAAUD,GAAG,WAAWA,EAAE,OAAOw0B,GAAGv0B,EAAE,CAAiE,IAAIgpB,GAAG,oBAAoBroB,OAAO8N,GAAG9N,OAAO8N,GAA5G,SAAY1O,EAAEC,GAAG,OAAOD,IAAIC,IAAI,IAAID,GAAG,EAAEA,IAAI,EAAEC,IAAID,IAAIA,GAAGC,IAAIA,CAAC,EACtW,SAASunB,GAAGxnB,EAAEC,GAAG,GAAGgpB,GAAGjpB,EAAEC,GAAG,OAAM,EAAG,GAAG,kBAAkBD,GAAG,OAAOA,GAAG,kBAAkBC,GAAG,OAAOA,EAAE,OAAM,EAAG,IAAIgI,EAAErH,OAAOP,KAAKL,GAAGmI,EAAEvH,OAAOP,KAAKJ,GAAG,GAAGgI,EAAE9H,SAASgI,EAAEhI,OAAO,OAAM,EAAG,IAAIgI,EAAE,EAAEA,EAAEF,EAAE9H,OAAOgI,IAAI,CAAC,IAAIrE,EAAEmE,EAAEE,GAAG,IAAIg7D,EAAGniE,KAAKf,EAAE6D,KAAKmlB,GAAGjpB,EAAE8D,GAAG7D,EAAE6D,IAAI,OAAM,CAAE,CAAC,OAAM,CAAE,CAAC,SAAS6nB,GAAG3rB,GAAG,KAAKA,GAAGA,EAAE+jF,YAAY/jF,EAAEA,EAAE+jF,WAAW,OAAO/jF,CAAC,CACtU,SAASkpB,GAAGlpB,EAAEC,GAAG,IAAwBkI,EAApBF,EAAE0jB,GAAG3rB,GAAO,IAAJA,EAAE,EAAYiI,GAAG,CAAC,GAAG,IAAIA,EAAEi8E,SAAS,CAA0B,GAAzB/7E,EAAEnI,EAAEiI,EAAE07D,YAAYxjE,OAAUH,GAAGC,GAAGkI,GAAGlI,EAAE,MAAM,CAAC63F,KAAK7vF,EAAEuiB,OAAOvqB,EAAED,GAAGA,EAAEmI,CAAC,CAACnI,EAAE,CAAC,KAAKiI,GAAG,CAAC,GAAGA,EAAE8vF,YAAY,CAAC9vF,EAAEA,EAAE8vF,YAAY,MAAM/3F,CAAC,CAACiI,EAAEA,EAAEsgF,UAAU,CAACtgF,OAAE,CAAM,CAACA,EAAE0jB,GAAG1jB,EAAE,CAAC,CAAC,SAAS+e,GAAGhnB,EAAEC,GAAG,SAAOD,IAAGC,KAAED,IAAIC,KAAKD,GAAG,IAAIA,EAAEkkF,YAAYjkF,GAAG,IAAIA,EAAEikF,SAASl9D,GAAGhnB,EAAEC,EAAEsoF,YAAY,aAAavoF,EAAEA,EAAEg4F,SAAS/3F,KAAGD,EAAEi4F,4BAAwD,GAA7Bj4F,EAAEi4F,wBAAwBh4F,KAAY,CAC9Z,SAASgoB,KAAK,IAAI,IAAIjoB,EAAE8G,OAAO7G,EAAEmjE,IAAKnjE,aAAaD,EAAEk4F,mBAAmB,CAAC,IAAI,IAAIjwF,EAAE,kBAAkBhI,EAAEk4F,cAAcpxF,SAASZ,IAAI,CAAC,MAAMgC,GAAGF,GAAE,CAAE,CAAC,IAAGA,EAAyB,MAAMhI,EAAEmjE,GAA/BpjE,EAAEC,EAAEk4F,eAAgCpyF,SAAS,CAAC,OAAO9F,CAAC,CAAC,SAASmoB,GAAGpoB,GAAG,IAAIC,EAAED,GAAGA,EAAE0jE,UAAU1jE,EAAE0jE,SAASh2D,cAAc,OAAOzN,IAAI,UAAUA,IAAI,SAASD,EAAE+B,MAAM,WAAW/B,EAAE+B,MAAM,QAAQ/B,EAAE+B,MAAM,QAAQ/B,EAAE+B,MAAM,aAAa/B,EAAE+B,OAAO,aAAa9B,GAAG,SAASD,EAAEo4F,gBAAgB,CACxa,SAASjwE,GAAGnoB,GAAG,IAAIC,EAAEgoB,KAAKhgB,EAAEjI,EAAEq4F,YAAYlwF,EAAEnI,EAAEs4F,eAAe,GAAGr4F,IAAIgI,GAAGA,GAAGA,EAAE26E,eAAe57D,GAAG/e,EAAE26E,cAAc2V,gBAAgBtwF,GAAG,CAAC,GAAG,OAAOE,GAAGigB,GAAGngB,GAAG,GAAGhI,EAAEkI,EAAEuU,WAAc,KAAR1c,EAAEmI,EAAEyU,OAAiB5c,EAAEC,GAAG,mBAAmBgI,EAAEA,EAAEuwF,eAAev4F,EAAEgI,EAAEwwF,aAAa/lF,KAAK+M,IAAIzf,EAAEiI,EAAE2D,MAAMzL,aAAa,IAAGH,GAAGC,EAAEgI,EAAE26E,eAAe78E,WAAW9F,EAAEy4F,aAAa5xF,QAAS6xF,aAAa,CAAC34F,EAAEA,EAAE24F,eAAe,IAAI70F,EAAEmE,EAAE07D,YAAYxjE,OAAOgH,EAAEuL,KAAK+M,IAAItX,EAAEuU,MAAM5Y,GAAGqE,OAAE,IAASA,EAAEyU,IAAIzV,EAAEuL,KAAK+M,IAAItX,EAAEyU,IAAI9Y,IAAI9D,EAAEyE,QAAQ0C,EAAEgB,IAAIrE,EAAEqE,EAAEA,EAAEhB,EAAEA,EAAErD,GAAGA,EAAEolB,GAAGjhB,EAAEd,GAAG,IAAIe,EAAEghB,GAAGjhB,EACvfE,GAAGrE,GAAGoE,IAAI,IAAIlI,EAAE44F,YAAY54F,EAAE64F,aAAa/0F,EAAEg0F,MAAM93F,EAAE84F,eAAeh1F,EAAE0mB,QAAQxqB,EAAE+4F,YAAY7wF,EAAE4vF,MAAM93F,EAAEg5F,cAAc9wF,EAAEsiB,WAAUvqB,EAAEA,EAAEg5F,eAAgBC,SAASp1F,EAAEg0F,KAAKh0F,EAAE0mB,QAAQxqB,EAAEm5F,kBAAkBhyF,EAAEgB,GAAGnI,EAAEo5F,SAASn5F,GAAGD,EAAEyE,OAAOyD,EAAE4vF,KAAK5vF,EAAEsiB,UAAUvqB,EAAEo5F,OAAOnxF,EAAE4vF,KAAK5vF,EAAEsiB,QAAQxqB,EAAEo5F,SAASn5F,IAAI,CAAM,IAALA,EAAE,GAAOD,EAAEiI,EAAEjI,EAAEA,EAAEuoF,YAAY,IAAIvoF,EAAEkkF,UAAUjkF,EAAE4kB,KAAK,CAACy0E,QAAQt5F,EAAEkJ,KAAKlJ,EAAEu5F,WAAWtwF,IAAIjJ,EAAEw5F,YAAmD,IAAvC,oBAAoBvxF,EAAEwxF,OAAOxxF,EAAEwxF,QAAYxxF,EAAE,EAAEA,EAAEhI,EAAEE,OAAO8H,KAAIjI,EAAEC,EAAEgI,IAAKqxF,QAAQC,WAAWv5F,EAAEkJ,KAAKlJ,EAAEs5F,QAAQE,UAAUx5F,EAAEiJ,GAAG,CAAC,CACzf,IAAI+e,GAAG+rC,GAAI,iBAAiBhuD,UAAU,IAAIA,SAASqxF,aAAattE,GAAG,KAAKpD,GAAG,KAAKI,GAAG,KAAKD,IAAG,EAC3F,SAASwB,GAAGroB,EAAEC,EAAEgI,GAAG,IAAIE,EAAEF,EAAEnB,SAASmB,EAAEA,EAAElC,SAAS,IAAIkC,EAAEi8E,SAASj8E,EAAEA,EAAE26E,cAAc/7D,IAAI,MAAMiD,IAAIA,KAAKs5C,EAAGj7D,KAAU,mBAALA,EAAE2hB,KAAyB1B,GAAGjgB,GAAGA,EAAE,CAACuU,MAAMvU,EAAEqwF,eAAe57E,IAAIzU,EAAEswF,cAAuFtwF,EAAE,CAAC0wF,YAA3E1wF,GAAGA,EAAEy6E,eAAez6E,EAAEy6E,cAAc8V,aAAa5xF,QAAQ6xF,gBAA+BE,WAAWC,aAAa3wF,EAAE2wF,aAAaC,UAAU5wF,EAAE4wF,UAAUC,YAAY7wF,EAAE6wF,aAAclyE,IAAIU,GAAGV,GAAG3e,KAAK2e,GAAG3e,EAAsB,GAApBA,EAAE4c,GAAG2B,GAAG,aAAgBvmB,SAASF,EAAE,IAAIiyF,GAAG,WAAW,SAAS,KAAKjyF,EAAEgI,GAAGjI,EAAE6kB,KAAK,CAAC21B,MAAMv6C,EAAE6sD,UAAU3kD,IAAIlI,EAAEmoF,OAAOt+D,KAAK,CACtf,SAASV,GAAGppB,EAAEC,GAAG,IAAIgI,EAAE,CAAC,EAAiF,OAA/EA,EAAEjI,EAAE0N,eAAezN,EAAEyN,cAAczF,EAAE,SAASjI,GAAG,SAASC,EAAEgI,EAAE,MAAMjI,GAAG,MAAMC,EAASgI,CAAC,CAAC,IAAIshB,GAAG,CAACmwE,aAAatwE,GAAG,YAAY,gBAAgBuwE,mBAAmBvwE,GAAG,YAAY,sBAAsBwwE,eAAexwE,GAAG,YAAY,kBAAkBywE,cAAczwE,GAAG,aAAa,kBAAkBQ,GAAG,CAAC,EAAEN,GAAG,CAAC,EACpF,SAASqB,GAAG3qB,GAAG,GAAG4pB,GAAG5pB,GAAG,OAAO4pB,GAAG5pB,GAAG,IAAIupB,GAAGvpB,GAAG,OAAOA,EAAE,IAAYiI,EAARhI,EAAEspB,GAAGvpB,GAAK,IAAIiI,KAAKhI,EAAE,GAAGA,EAAEc,eAAekH,IAAIA,KAAKqhB,GAAG,OAAOM,GAAG5pB,GAAGC,EAAEgI,GAAG,OAAOjI,CAAC,CAA/X+zD,IAAKzqC,GAAGvjB,SAASC,cAAc,OAAOkhF,MAAM,mBAAmBpgF,gBAAgByiB,GAAGmwE,aAAaI,iBAAiBvwE,GAAGowE,mBAAmBG,iBAAiBvwE,GAAGqwE,eAAeE,WAAW,oBAAoBhzF,eAAeyiB,GAAGswE,cAAchK,YAAwJ,IAAIvlE,GAAGK,GAAG,gBAAgBovE,GAAGpvE,GAAG,sBAAsBqvE,GAAGrvE,GAAG,kBAAkBsvE,GAAGtvE,GAAG,iBAAiBuvE,GAAG,IAAItpB,IAAIupB,GAAG,smBAAsmBhoF,MAAM,KAC/lC,SAASioF,GAAGp6F,EAAEC,GAAGi6F,GAAGv8E,IAAI3d,EAAEC,GAAG05D,EAAG15D,EAAE,CAACD,GAAG,CAAC,IAAI,IAAIq6F,GAAG,EAAEA,GAAGF,GAAGh6F,OAAOk6F,KAAK,CAAC,IAAIC,GAAGH,GAAGE,IAA2DD,GAApDE,GAAG5sF,cAAuD,MAAtC4sF,GAAG,GAAGtuF,cAAcsuF,GAAG9/E,MAAM,IAAiB,CAAC4/E,GAAG9vE,GAAG,kBAAkB8vE,GAAGL,GAAG,wBAAwBK,GAAGJ,GAAG,oBAAoBI,GAAG,WAAW,iBAAiBA,GAAG,UAAU,WAAWA,GAAG,WAAW,UAAUA,GAAGH,GAAG,mBAAmBzgC,EAAG,eAAe,CAAC,WAAW,cAAcA,EAAG,eAAe,CAAC,WAAW,cAAcA,EAAG,iBAAiB,CAAC,aAAa,gBAC7cA,EAAG,iBAAiB,CAAC,aAAa,gBAAgBG,EAAG,WAAW,oEAAoExnD,MAAM,MAAMwnD,EAAG,WAAW,uFAAuFxnD,MAAM,MAAMwnD,EAAG,gBAAgB,CAAC,iBAAiB,WAAW,YAAY,UAAUA,EAAG,mBAAmB,2DAA2DxnD,MAAM,MAAMwnD,EAAG,qBAAqB,6DAA6DxnD,MAAM,MAC/fwnD,EAAG,sBAAsB,8DAA8DxnD,MAAM,MAAM,IAAIooF,GAAG,6NAA6NpoF,MAAM,KAAKqoF,GAAG,IAAI3pB,IAAI,0CAA0C1+D,MAAM,KAAKzO,OAAO62F,KACzZ,SAASE,GAAGz6F,EAAEC,EAAEgI,GAAG,IAAIE,EAAEnI,EAAE+B,MAAM,gBAAgB/B,EAAEgxF,cAAc/oF,EAlDjE,SAAYjI,EAAEC,EAAEgI,EAAEE,EAAErE,EAAEqD,EAAEe,EAAEE,EAAEhB,GAA4B,GAAzB0iF,GAAGtkE,MAAMpL,KAAKhY,WAAcqnF,GAAG,CAAC,IAAGA,GAAgC,MAAMn4E,MAAM1J,EAAE,MAA1C,IAAIL,EAAEmiF,GAAGD,IAAG,EAAGC,GAAG,KAA8BC,KAAKA,IAAG,EAAGC,GAAGriF,EAAE,CAAC,CAkDpEmzF,CAAGvyF,EAAElI,OAAE,EAAOD,GAAGA,EAAEgxF,cAAc,IAAI,CACxG,SAASlsE,GAAG9kB,EAAEC,GAAGA,EAAE,KAAO,EAAFA,GAAK,IAAI,IAAIgI,EAAE,EAAEA,EAAEjI,EAAEG,OAAO8H,IAAI,CAAC,IAAIE,EAAEnI,EAAEiI,GAAGnE,EAAEqE,EAAEqyC,MAAMryC,EAAEA,EAAE2kD,UAAU9sD,EAAE,CAAC,IAAImH,OAAE,EAAO,GAAGlH,EAAE,IAAI,IAAIiI,EAAEC,EAAEhI,OAAO,EAAE,GAAG+H,EAAEA,IAAI,CAAC,IAAIE,EAAED,EAAED,GAAGd,EAAEgB,EAAE7D,SAASgD,EAAEa,EAAE4oF,cAA2B,GAAb5oF,EAAEA,EAAE6wD,SAAY7xD,IAAID,GAAGrD,EAAEstF,uBAAuB,MAAMpxF,EAAEy6F,GAAG32F,EAAEsE,EAAEb,GAAGJ,EAAEC,CAAC,MAAM,IAAIc,EAAE,EAAEA,EAAEC,EAAEhI,OAAO+H,IAAI,CAAoD,GAA5Cd,GAAPgB,EAAED,EAAED,IAAO3D,SAASgD,EAAEa,EAAE4oF,cAAc5oF,EAAEA,EAAE6wD,SAAY7xD,IAAID,GAAGrD,EAAEstF,uBAAuB,MAAMpxF,EAAEy6F,GAAG32F,EAAEsE,EAAEb,GAAGJ,EAAEC,CAAC,CAAC,CAAC,CAAC,GAAGuiF,GAAG,MAAM3pF,EAAE4pF,GAAGD,IAAG,EAAGC,GAAG,KAAK5pF,CAAE,CAC5a,SAAS+Z,GAAE/Z,EAAEC,GAAG,IAAIgI,EAAEhI,EAAE06F,SAAI,IAAS1yF,IAAIA,EAAEhI,EAAE06F,IAAI,IAAI9pB,KAAK,IAAI1oE,EAAEnI,EAAE,WAAWiI,EAAEmkB,IAAIjkB,KAAKyyF,GAAG36F,EAAED,EAAE,GAAE,GAAIiI,EAAEw4E,IAAIt4E,GAAG,CAAC,SAAS0yF,GAAG76F,EAAEC,EAAEgI,GAAG,IAAIE,EAAE,EAAElI,IAAIkI,GAAG,GAAGyyF,GAAG3yF,EAAEjI,EAAEmI,EAAElI,EAAE,CAAC,IAAI66F,GAAG,kBAAkBpoF,KAAKyhE,SAASrzE,SAAS,IAAI0Z,MAAM,GAAG,SAAS85D,GAAGt0E,GAAG,IAAIA,EAAE86F,IAAI,CAAC96F,EAAE86F,KAAI,EAAGrhC,EAAGjsD,SAAQ,SAASvN,GAAG,oBAAoBA,IAAIu6F,GAAGpuE,IAAInsB,IAAI46F,GAAG56F,GAAE,EAAGD,GAAG66F,GAAG56F,GAAE,EAAGD,GAAG,IAAG,IAAIC,EAAE,IAAID,EAAEkkF,SAASlkF,EAAEA,EAAE4iF,cAAc,OAAO3iF,GAAGA,EAAE66F,MAAM76F,EAAE66F,KAAI,EAAGD,GAAG,mBAAkB,EAAG56F,GAAG,CAAC,CACjb,SAAS26F,GAAG56F,EAAEC,EAAEgI,EAAEE,GAAG,OAAOgoF,GAAGlwF,IAAI,KAAK,EAAE,IAAI6D,EAAE8rF,GAAG,MAAM,KAAK,EAAE9rF,EAAEisF,GAAG,MAAM,QAAQjsF,EAAEgsF,GAAG7nF,EAAEnE,EAAEE,KAAK,KAAK/D,EAAEgI,EAAEjI,GAAG8D,OAAE,GAAQwlF,IAAI,eAAerpF,GAAG,cAAcA,GAAG,UAAUA,IAAI6D,GAAE,GAAIqE,OAAE,IAASrE,EAAE9D,EAAE8N,iBAAiB7N,EAAEgI,EAAE,CAAC8yF,SAAQ,EAAGC,QAAQl3F,IAAI9D,EAAE8N,iBAAiB7N,EAAEgI,GAAE,QAAI,IAASnE,EAAE9D,EAAE8N,iBAAiB7N,EAAEgI,EAAE,CAAC+yF,QAAQl3F,IAAI9D,EAAE8N,iBAAiB7N,EAAEgI,GAAE,EAAG,CAClV,SAAS+nF,GAAGhwF,EAAEC,EAAEgI,EAAEE,EAAErE,GAAG,IAAIqD,EAAEgB,EAAE,GAAG,KAAO,EAAFlI,IAAM,KAAO,EAAFA,IAAM,OAAOkI,EAAEnI,EAAE,OAAO,CAAC,GAAG,OAAOmI,EAAE,OAAO,IAAID,EAAEC,EAAEo5E,IAAI,GAAG,IAAIr5E,GAAG,IAAIA,EAAE,CAAC,IAAIE,EAAED,EAAE0gF,UAAUqG,cAAc,GAAG9mF,IAAItE,GAAG,IAAIsE,EAAE87E,UAAU97E,EAAEmgF,aAAazkF,EAAE,MAAM,GAAG,IAAIoE,EAAE,IAAIA,EAAEC,EAAE8hF,OAAO,OAAO/hF,GAAG,CAAC,IAAId,EAAEc,EAAEq5E,IAAI,IAAG,IAAIn6E,GAAG,IAAIA,MAAKA,EAAEc,EAAE2gF,UAAUqG,iBAAkBprF,GAAG,IAAIsD,EAAE88E,UAAU98E,EAAEmhF,aAAazkF,GAAE,OAAOoE,EAAEA,EAAE+hF,MAAM,CAAC,KAAK,OAAO7hF,GAAG,CAAS,GAAG,QAAXF,EAAE6mF,GAAG3mF,IAAe,OAAe,GAAG,KAAXhB,EAAEc,EAAEq5E,MAAc,IAAIn6E,EAAE,CAACe,EAAEhB,EAAEe,EAAE,SAASlI,CAAC,CAACoI,EAAEA,EAAEmgF,UAAU,CAAC,CAACpgF,EAAEA,EAAE8hF,MAAM,CAACb,IAAG,WAAW,IAAIjhF,EAAEhB,EAAErD,EAAEqkF,GAAGlgF,GAAGC,EAAE,GACpflI,EAAE,CAAC,IAAIoI,EAAE8xF,GAAGh/E,IAAIlb,GAAG,QAAG,IAASoI,EAAE,CAAC,IAAIhB,EAAE8qF,GAAGzqF,EAAEzH,EAAE,OAAOA,GAAG,IAAK,WAAW,GAAG,IAAIwwF,GAAGvoF,GAAG,MAAMjI,EAAE,IAAK,UAAU,IAAK,QAAQoH,EAAEsuF,GAAG,MAAM,IAAK,UAAUjuF,EAAE,QAAQL,EAAE0sF,GAAG,MAAM,IAAK,WAAWrsF,EAAE,OAAOL,EAAE0sF,GAAG,MAAM,IAAK,aAAa,IAAK,YAAY1sF,EAAE0sF,GAAG,MAAM,IAAK,QAAQ,GAAG,IAAI7rF,EAAEmrF,OAAO,MAAMpzF,EAAE,IAAK,WAAW,IAAK,WAAW,IAAK,YAAY,IAAK,YAAY,IAAK,UAAU,IAAK,WAAW,IAAK,YAAY,IAAK,cAAcoH,EAAEusF,GAAG,MAAM,IAAK,OAAO,IAAK,UAAU,IAAK,YAAY,IAAK,WAAW,IAAK,YAAY,IAAK,WAAW,IAAK,YAAY,IAAK,OAAOvsF,EAC1iBwsF,GAAG,MAAM,IAAK,cAAc,IAAK,WAAW,IAAK,YAAY,IAAK,aAAaxsF,EAAEkvF,GAAG,MAAM,KAAKhsE,GAAG,KAAKyvE,GAAG,KAAKC,GAAG5yF,EAAE2sF,GAAG,MAAM,KAAKkG,GAAG7yF,EAAEsvF,GAAG,MAAM,IAAK,SAAStvF,EAAEkrF,GAAG,MAAM,IAAK,QAAQlrF,EAAEuvF,GAAG,MAAM,IAAK,OAAO,IAAK,MAAM,IAAK,QAAQvvF,EAAE+sF,GAAG,MAAM,IAAK,oBAAoB,IAAK,qBAAqB,IAAK,gBAAgB,IAAK,cAAc,IAAK,cAAc,IAAK,aAAa,IAAK,cAAc,IAAK,YAAY/sF,EAAE0uF,GAAG,IAAI5kF,EAAE,KAAO,EAAFjR,GAAKqkB,GAAGpT,GAAG,WAAWlR,EAAE2O,EAAEuC,EAAE,OAAO9I,EAAEA,EAAE,UAAU,KAAKA,EAAE8I,EAAE,GAAG,IAAI,IAAQY,EAAJkI,EAAE7R,EAAI,OAC/e6R,GAAG,CAAK,IAAIqB,GAARvJ,EAAEkI,GAAU6uE,UAAsF,GAA5E,IAAI/2E,EAAEyvE,KAAK,OAAOlmE,IAAIvJ,EAAEuJ,EAAE,OAAO1M,IAAc,OAAV0M,EAAEguE,GAAGrvE,EAAErL,KAAYuC,EAAE2T,KAAKo2E,GAAGjhF,EAAEqB,EAAEvJ,MAASwS,EAAE,MAAMtK,EAAEA,EAAEiwE,MAAM,CAAC,EAAE/4E,EAAE/Q,SAASiI,EAAE,IAAIhB,EAAEgB,EAAEX,EAAE,KAAKQ,EAAEnE,GAAGoE,EAAE2c,KAAK,CAAC21B,MAAMpyC,EAAE0kD,UAAU57C,IAAI,CAAC,CAAC,GAAG,KAAO,EAAFjR,GAAK,CAA4E,GAAnCmH,EAAE,aAAapH,GAAG,eAAeA,KAAtEoI,EAAE,cAAcpI,GAAG,gBAAgBA,IAA2CiI,IAAIigF,MAAKzgF,EAAEQ,EAAEqrF,eAAerrF,EAAEsrF,eAAexE,GAAGtnF,KAAIA,EAAEyzF,OAAgB9zF,GAAGgB,KAAGA,EAAEtE,EAAEgD,SAAShD,EAAEA,GAAGsE,EAAEtE,EAAE8+E,eAAex6E,EAAEswF,aAAatwF,EAAE+yF,aAAar0F,OAAUM,GAAqCA,EAAEe,EAAiB,QAAfV,GAAnCA,EAAEQ,EAAEqrF,eAAerrF,EAAEurF,WAAkBzE,GAAGtnF,GAAG,QAC9dA,KAAR6c,EAAEylE,GAAGtiF,KAAU,IAAIA,EAAE85E,KAAK,IAAI95E,EAAE85E,OAAK95E,EAAE,QAAUL,EAAE,KAAKK,EAAEU,GAAKf,IAAIK,GAAE,CAAgU,GAA/TyJ,EAAEyiF,GAAGt4E,EAAE,eAAe1M,EAAE,eAAeqL,EAAE,QAAW,eAAeha,GAAG,gBAAgBA,IAAEkR,EAAE4kF,GAAGz6E,EAAE,iBAAiB1M,EAAE,iBAAiBqL,EAAE,WAAUsK,EAAE,MAAMld,EAAEgB,EAAE4d,GAAG5e,GAAG0K,EAAE,MAAMrK,EAAEW,EAAE4d,GAAGve,IAAGW,EAAE,IAAI8I,EAAEmK,EAAErB,EAAE,QAAQ5S,EAAEa,EAAEnE,IAAKskF,OAAO9jE,EAAElc,EAAEkrF,cAAcxhF,EAAEuJ,EAAE,KAAK0zE,GAAGjrF,KAAKqE,KAAI+I,EAAE,IAAIA,EAAEvC,EAAEqL,EAAE,QAAQvS,EAAEQ,EAAEnE,IAAKskF,OAAOt2E,EAAEZ,EAAEoiF,cAAchvE,EAAEjJ,EAAEnK,GAAGoT,EAAEjJ,EAAKjU,GAAGK,EAAExH,EAAE,CAAa,IAAR0O,EAAElH,EAAEuS,EAAE,EAAMlI,EAAhBZ,EAAE9J,EAAkB0K,EAAEA,EAAEspF,GAAGtpF,GAAGkI,IAAQ,IAAJlI,EAAE,EAAMuJ,EAAE1M,EAAE0M,EAAEA,EAAE+/E,GAAG//E,GAAGvJ,IAAI,KAAK,EAAEkI,EAAElI,GAAGZ,EAAEkqF,GAAGlqF,GAAG8I,IAAI,KAAK,EAAElI,EAAEkI,GAAGrL,EACpfysF,GAAGzsF,GAAGmD,IAAI,KAAKkI,KAAK,CAAC,GAAG9I,IAAIvC,GAAG,OAAOA,GAAGuC,IAAIvC,EAAEq7E,UAAU,MAAM/pF,EAAEiR,EAAEkqF,GAAGlqF,GAAGvC,EAAEysF,GAAGzsF,EAAE,CAACuC,EAAE,IAAI,MAAMA,EAAE,KAAK,OAAO9J,GAAGi0F,GAAGnzF,EAAEE,EAAEhB,EAAE8J,GAAE,GAAI,OAAOzJ,GAAG,OAAO6c,GAAG+2E,GAAGnzF,EAAEoc,EAAE7c,EAAEyJ,GAAE,EAAG,CAA8D,GAAG,YAA1C9J,GAAjBgB,EAAED,EAAE6d,GAAG7d,GAAGrB,QAAW48D,UAAUt7D,EAAEs7D,SAASh2D,gBAA+B,UAAUtG,GAAG,SAASgB,EAAErG,KAAK,IAAI4yD,EAAGruC,QAAQ,GAAGC,GAAGne,GAAG,GAAGsf,GAAGitC,EAAGzsC,OAAO,CAACysC,EAAGptC,GAAG,IAAI45C,EAAGx5C,EAAE,MAAMvgB,EAAEgB,EAAEs7D,WAAW,UAAUt8D,EAAEsG,gBAAgB,aAAatF,EAAErG,MAAM,UAAUqG,EAAErG,QAAQ4yD,EAAGnuC,IACrV,OAD4VmuC,IAAKA,EAAGA,EAAG30D,EAAEmI,IAAKsc,GAAGvc,EAAEysD,EAAG1sD,EAAEnE,IAAWq9D,GAAIA,EAAGnhE,EAAEoI,EAAED,GAAG,aAAanI,IAAImhE,EAAG/4D,EAAEg6E,gBAClfjhB,EAAGohB,YAAY,WAAWn6E,EAAErG,MAAM2gF,GAAGt6E,EAAE,SAASA,EAAEwD,QAAOu1D,EAAGh5D,EAAE6d,GAAG7d,GAAGrB,OAAc9G,GAAG,IAAK,WAAaumB,GAAG46C,IAAK,SAASA,EAAGi3B,mBAAgBtuE,GAAGq3C,EAAGz6C,GAAGve,EAAE2e,GAAG,MAAK,MAAM,IAAK,WAAWA,GAAGJ,GAAGoD,GAAG,KAAK,MAAM,IAAK,YAAYjD,IAAG,EAAG,MAAM,IAAK,cAAc,IAAK,UAAU,IAAK,UAAUA,IAAG,EAAGwB,GAAGngB,EAAED,EAAEnE,GAAG,MAAM,IAAK,kBAAkB,GAAGkkB,GAAG,MAAM,IAAK,UAAU,IAAK,QAAQK,GAAGngB,EAAED,EAAEnE,GAAG,IAAIggE,EAAG,GAAGp/C,GAAGzkB,EAAE,CAAC,OAAOD,GAAG,IAAK,mBAAmB,IAAIigE,EAAG,qBAAqB,MAAMhgE,EAAE,IAAK,iBAAiBggE,EAAG,mBACpe,MAAMhgE,EAAE,IAAK,oBAAoBggE,EAAG,sBAAsB,MAAMhgE,EAAEggE,OAAG,CAAM,MAAMz7C,GAAG6B,GAAGrmB,EAAEiI,KAAKg4D,EAAG,oBAAoB,YAAYjgE,GAAG,MAAMiI,EAAEwoF,UAAUxwB,EAAG,sBAAsBA,IAAK/5C,IAAI,OAAOje,EAAE2tF,SAASpxE,IAAI,uBAAuBy7C,EAAG,qBAAqBA,GAAIz7C,KAAKs/C,EAAGysB,OAAYF,GAAG,UAARD,GAAGtsF,GAAkBssF,GAAGxkF,MAAMwkF,GAAGzsB,YAAYn/C,IAAG,IAAiB,GAAZ28C,EAAGp8C,GAAG5c,EAAE83D,IAAS9/D,SAAS8/D,EAAG,IAAIo0B,GAAGp0B,EAAGjgE,EAAE,KAAKiI,EAAEnE,GAAGoE,EAAE2c,KAAK,CAAC21B,MAAMylB,EAAGnT,UAAUqU,IAAK2C,EAAG7D,EAAG/1D,KAAK45D,EAAa,QAATA,EAAG79C,GAAGhe,MAAeg4D,EAAG/1D,KAAK45D,MAAUA,EAAG39C,GA5BhM,SAAYnmB,EAAEC,GAAG,OAAOD,GAAG,IAAK,iBAAiB,OAAOimB,GAAGhmB,GAAG,IAAK,WAAW,OAAG,KAAKA,EAAE41F,MAAa,MAAKzvE,IAAG,EAAUmO,IAAG,IAAK,YAAY,OAAOv0B,EAAEC,EAAEiK,QAASqqB,IAAInO,GAAG,KAAKpmB,EAAE,QAAQ,OAAO,KAAK,CA4BEwpB,CAAGxpB,EAAEiI,GA3Bzd,SAAYjI,EAAEC,GAAG,GAAGukB,GAAG,MAAM,mBAAmBxkB,IAAI0kB,IAAI2B,GAAGrmB,EAAEC,IAAID,EAAEuwF,KAAKD,GAAGD,GAAGD,GAAG,KAAK5rE,IAAG,EAAGxkB,GAAG,KAAK,OAAOA,GAAG,IAAK,QAAgQ,QAAQ,OAAO,KAA3P,IAAK,WAAW,KAAKC,EAAE6yF,SAAS7yF,EAAE+yF,QAAQ/yF,EAAEgzF,UAAUhzF,EAAE6yF,SAAS7yF,EAAE+yF,OAAO,CAAC,GAAG/yF,EAAEq7F,MAAM,EAAEr7F,EAAEq7F,KAAKn7F,OAAO,OAAOF,EAAEq7F,KAAK,GAAGr7F,EAAE41F,MAAM,OAAOvwE,OAAOC,aAAatlB,EAAE41F,MAAM,CAAC,OAAO,KAAK,IAAK,iBAAiB,OAAO3vE,IAAI,OAAOjmB,EAAE21F,OAAO,KAAK31F,EAAEiK,KAAyB,CA2BqF+c,CAAGjnB,EAAEiI,MACje,GADoeE,EAAE4c,GAAG5c,EAAE,kBACvehI,SAAS2D,EAAE,IAAIuwF,GAAG,gBAAgB,cAAc,KAAKpsF,EAAEnE,GAAGoE,EAAE2c,KAAK,CAAC21B,MAAM12C,EAAEgpD,UAAU3kD,IAAIrE,EAAEoG,KAAK45D,GAAG,CAACh/C,GAAG5c,EAAEjI,EAAE,GAAE,CAAC,SAASg7F,GAAGj7F,EAAEC,EAAEgI,GAAG,MAAM,CAAC1D,SAASvE,EAAEi5D,SAASh5D,EAAE+wF,cAAc/oF,EAAE,CAAC,SAAS8c,GAAG/kB,EAAEC,GAAG,IAAI,IAAIgI,EAAEhI,EAAE,UAAUkI,EAAE,GAAG,OAAOnI,GAAG,CAAC,IAAI8D,EAAE9D,EAAEmH,EAAErD,EAAE+kF,UAAU,IAAI/kF,EAAEy9E,KAAK,OAAOp6E,IAAIrD,EAAEqD,EAAY,OAAVA,EAAEkiF,GAAGrpF,EAAEiI,KAAYE,EAAE8rB,QAAQgnE,GAAGj7F,EAAEmH,EAAErD,IAAc,OAAVqD,EAAEkiF,GAAGrpF,EAAEC,KAAYkI,EAAE0c,KAAKo2E,GAAGj7F,EAAEmH,EAAErD,KAAK9D,EAAEA,EAAEiqF,MAAM,CAAC,OAAO9hF,CAAC,CAAC,SAASizF,GAAGp7F,GAAG,GAAG,OAAOA,EAAE,OAAO,KAAK,GAAGA,EAAEA,EAAEiqF,aAAajqF,GAAG,IAAIA,EAAEuhF,KAAK,OAAOvhF,GAAI,IAAI,CACnd,SAASq7F,GAAGr7F,EAAEC,EAAEgI,EAAEE,EAAErE,GAAG,IAAI,IAAIqD,EAAElH,EAAE6wF,WAAW5oF,EAAE,GAAG,OAAOD,GAAGA,IAAIE,GAAG,CAAC,IAAIC,EAAEH,EAAEb,EAAEgB,EAAE4hF,UAAUziF,EAAEa,EAAEygF,UAAU,GAAG,OAAOzhF,GAAGA,IAAIe,EAAE,MAAM,IAAIC,EAAEm5E,KAAK,OAAOh6E,IAAIa,EAAEb,EAAEzD,EAAa,OAAVsD,EAAEiiF,GAAGphF,EAAEd,KAAYe,EAAE+rB,QAAQgnE,GAAGhzF,EAAEb,EAAEgB,IAAKtE,GAAc,OAAVsD,EAAEiiF,GAAGphF,EAAEd,KAAYe,EAAE2c,KAAKo2E,GAAGhzF,EAAEb,EAAEgB,KAAMH,EAAEA,EAAEgiF,MAAM,CAAC,IAAI/hF,EAAE/H,QAAQH,EAAE6kB,KAAK,CAAC21B,MAAMv6C,EAAE6sD,UAAU5kD,GAAG,CAAC,IAAIqzF,GAAG,SAASC,GAAG,iBAAiB,SAASC,GAAGz7F,GAAG,OAAO,kBAAkBA,EAAEA,EAAE,GAAGA,GAAGsG,QAAQi1F,GAAG,MAAMj1F,QAAQk1F,GAAG,GAAG,CAAC,SAASE,GAAG17F,EAAEC,EAAEgI,GAAW,GAARhI,EAAEw7F,GAAGx7F,GAAMw7F,GAAGz7F,KAAKC,GAAGgI,EAAE,MAAMqJ,MAAM1J,EAAE,KAAM,CAAC,SAAS+zF,KAAK,CAC9e,IAAIC,GAAG,KAAKC,GAAG,KAAK,SAASC,GAAG97F,EAAEC,GAAG,MAAM,aAAaD,GAAG,aAAaA,GAAG,kBAAkBC,EAAEmjF,UAAU,kBAAkBnjF,EAAEmjF,UAAU,kBAAkBnjF,EAAEkjF,yBAAyB,OAAOljF,EAAEkjF,yBAAyB,MAAMljF,EAAEkjF,wBAAwB4Y,MAAM,CAC5P,IAAIC,GAAG,oBAAoBxvF,WAAWA,gBAAW,EAAOyvF,GAAG,oBAAoBr4D,aAAaA,kBAAa,EAAOs4D,GAAG,oBAAoB72F,QAAQA,aAAQ,EAAO82F,GAAG,oBAAoBC,eAAeA,eAAe,qBAAqBF,GAAG,SAASl8F,GAAG,OAAOk8F,GAAGpyF,QAAQ,MAAMg9B,KAAK9mC,GAAG+mC,MAAMs1D,GAAG,EAAEL,GAAG,SAASK,GAAGr8F,GAAGwM,YAAW,WAAW,MAAMxM,CAAE,GAAE,CACpV,SAASs8F,GAAGt8F,EAAEC,GAAG,IAAIgI,EAAEhI,EAAEkI,EAAE,EAAE,EAAE,CAAC,IAAIrE,EAAEmE,EAAE8vF,YAA6B,GAAjB/3F,EAAEo5D,YAAYnxD,GAAMnE,GAAG,IAAIA,EAAEogF,SAAS,GAAY,QAATj8E,EAAEnE,EAAEoG,MAAc,CAAC,GAAG,IAAI/B,EAA0B,OAAvBnI,EAAEo5D,YAAYt1D,QAAG0rF,GAAGvvF,GAAUkI,GAAG,KAAK,MAAMF,GAAG,OAAOA,GAAG,OAAOA,GAAGE,IAAIF,EAAEnE,CAAC,OAAOmE,GAAGunF,GAAGvvF,EAAE,CAAC,SAASs8F,GAAGv8F,GAAG,KAAK,MAAMA,EAAEA,EAAEA,EAAE+3F,YAAY,CAAC,IAAI93F,EAAED,EAAEkkF,SAAS,GAAG,IAAIjkF,GAAG,IAAIA,EAAE,MAAM,GAAG,IAAIA,EAAE,CAAU,GAAG,OAAZA,EAAED,EAAEkK,OAAiB,OAAOjK,GAAG,OAAOA,EAAE,MAAM,GAAG,OAAOA,EAAE,OAAO,IAAI,CAAC,CAAC,OAAOD,CAAC,CACjY,SAASw8F,GAAGx8F,GAAGA,EAAEA,EAAEy8F,gBAAgB,IAAI,IAAIx8F,EAAE,EAAED,GAAG,CAAC,GAAG,IAAIA,EAAEkkF,SAAS,CAAC,IAAIj8E,EAAEjI,EAAEkK,KAAK,GAAG,MAAMjC,GAAG,OAAOA,GAAG,OAAOA,EAAE,CAAC,GAAG,IAAIhI,EAAE,OAAOD,EAAEC,GAAG,KAAK,OAAOgI,GAAGhI,GAAG,CAACD,EAAEA,EAAEy8F,eAAe,CAAC,OAAO,IAAI,CAAC,IAAIC,GAAGhqF,KAAKyhE,SAASrzE,SAAS,IAAI0Z,MAAM,GAAGmiF,GAAG,gBAAgBD,GAAGE,GAAG,gBAAgBF,GAAGxB,GAAG,oBAAoBwB,GAAG/B,GAAG,iBAAiB+B,GAAGG,GAAG,oBAAoBH,GAAGI,GAAG,kBAAkBJ,GAClX,SAAS3N,GAAG/uF,GAAG,IAAIC,EAAED,EAAE28F,IAAI,GAAG18F,EAAE,OAAOA,EAAE,IAAI,IAAIgI,EAAEjI,EAAEuoF,WAAWtgF,GAAG,CAAC,GAAGhI,EAAEgI,EAAEizF,KAAKjzF,EAAE00F,IAAI,CAAe,GAAd10F,EAAEhI,EAAE+pF,UAAa,OAAO/pF,EAAEsqF,OAAO,OAAOtiF,GAAG,OAAOA,EAAEsiF,MAAM,IAAIvqF,EAAEw8F,GAAGx8F,GAAG,OAAOA,GAAG,CAAC,GAAGiI,EAAEjI,EAAE28F,IAAI,OAAO10F,EAAEjI,EAAEw8F,GAAGx8F,EAAE,CAAC,OAAOC,CAAC,CAAKgI,GAAJjI,EAAEiI,GAAMsgF,UAAU,CAAC,OAAO,IAAI,CAAC,SAASK,GAAG5oF,GAAkB,QAAfA,EAAEA,EAAE28F,KAAK38F,EAAEk7F,MAAc,IAAIl7F,EAAEuhF,KAAK,IAAIvhF,EAAEuhF,KAAK,KAAKvhF,EAAEuhF,KAAK,IAAIvhF,EAAEuhF,IAAI,KAAKvhF,CAAC,CAAC,SAASgmB,GAAGhmB,GAAG,GAAG,IAAIA,EAAEuhF,KAAK,IAAIvhF,EAAEuhF,IAAI,OAAOvhF,EAAE6oF,UAAU,MAAMv3E,MAAM1J,EAAE,IAAK,CAAC,SAASkhF,GAAG9oF,GAAG,OAAOA,EAAE48F,KAAK,IAAI,CAAC,IAAIG,GAAG,GAAGC,IAAI,EAAE,SAASC,GAAGj9F,GAAG,MAAM,CAACwI,QAAQxI,EAAE,CACve,SAASwS,GAAExS,GAAG,EAAEg9F,KAAKh9F,EAAEwI,QAAQu0F,GAAGC,IAAID,GAAGC,IAAI,KAAKA,KAAK,CAAC,SAASp/E,GAAE5d,EAAEC,GAAG+8F,KAAKD,GAAGC,IAAIh9F,EAAEwI,QAAQxI,EAAEwI,QAAQvI,CAAC,CAAC,IAAIi9F,GAAG,CAAC,EAAE38E,GAAE08E,GAAGC,IAAIC,GAAGF,IAAG,GAAIG,GAAGF,GAAG,SAASG,GAAGr9F,EAAEC,GAAG,IAAIgI,EAAEjI,EAAE+B,KAAKR,aAAa,IAAI0G,EAAE,OAAOi1F,GAAG,IAAI/0F,EAAEnI,EAAE6oF,UAAU,GAAG1gF,GAAGA,EAAEm1F,8CAA8Cr9F,EAAE,OAAOkI,EAAEo1F,0CAA0C,IAASp2F,EAALrD,EAAE,CAAC,EAAI,IAAIqD,KAAKc,EAAEnE,EAAEqD,GAAGlH,EAAEkH,GAAoH,OAAjHgB,KAAInI,EAAEA,EAAE6oF,WAAYyU,4CAA4Cr9F,EAAED,EAAEu9F,0CAA0Cz5F,GAAUA,CAAC,CAC9d,SAAS05F,GAAGx9F,GAAyB,OAAO,QAA7BA,EAAEA,EAAEqB,yBAAmC,IAASrB,CAAC,CAAC,SAASy9F,KAAKjrF,GAAE2qF,IAAI3qF,GAAE+N,GAAE,CAAC,SAASm9E,GAAG19F,EAAEC,EAAEgI,GAAG,GAAGsY,GAAE/X,UAAU00F,GAAG,MAAM5rF,MAAM1J,EAAE,MAAMgW,GAAE2C,GAAEtgB,GAAG2d,GAAEu/E,GAAGl1F,EAAE,CAAC,SAAS01F,GAAG39F,EAAEC,EAAEgI,GAAG,IAAIE,EAAEnI,EAAE6oF,UAAgC,GAAtB5oF,EAAEA,EAAEoB,kBAAqB,oBAAoB8G,EAAEy1F,gBAAgB,OAAO31F,EAAwB,IAAI,IAAInE,KAA9BqE,EAAEA,EAAEy1F,kBAAiC,KAAK95F,KAAK7D,GAAG,MAAMqR,MAAM1J,EAAE,IAAIu3D,EAAGn/D,IAAI,UAAU8D,IAAI,OAAO+S,EAAE,CAAC,EAAE5O,EAAEE,EAAE,CACxX,SAAS01F,GAAG79F,GAA2G,OAAxGA,GAAGA,EAAEA,EAAE6oF,YAAY7oF,EAAE89F,2CAA2CZ,GAAGE,GAAG78E,GAAE/X,QAAQoV,GAAE2C,GAAEvgB,GAAG4d,GAAEu/E,GAAGA,GAAG30F,UAAe,CAAE,CAAC,SAASu1F,GAAG/9F,EAAEC,EAAEgI,GAAG,IAAIE,EAAEnI,EAAE6oF,UAAU,IAAI1gF,EAAE,MAAMmJ,MAAM1J,EAAE,MAAMK,GAAGjI,EAAE29F,GAAG39F,EAAEC,EAAEm9F,IAAIj1F,EAAE21F,0CAA0C99F,EAAEwS,GAAE2qF,IAAI3qF,GAAE+N,IAAG3C,GAAE2C,GAAEvgB,IAAIwS,GAAE2qF,IAAIv/E,GAAEu/E,GAAGl1F,EAAE,CAAC,IAAI+1F,GAAG,KAAKC,IAAG,EAAGC,IAAG,EAAG,SAASC,GAAGn+F,GAAG,OAAOg+F,GAAGA,GAAG,CAACh+F,GAAGg+F,GAAGn5E,KAAK7kB,EAAE,CAChW,SAASo+F,KAAK,IAAIF,IAAI,OAAOF,GAAG,CAACE,IAAG,EAAG,IAAIl+F,EAAE,EAAEC,EAAEga,GAAE,IAAI,IAAIhS,EAAE+1F,GAAG,IAAI/jF,GAAE,EAAEja,EAAEiI,EAAE9H,OAAOH,IAAI,CAAC,IAAImI,EAAEF,EAAEjI,GAAG,GAAGmI,EAAEA,GAAE,SAAU,OAAOA,EAAE,CAAC61F,GAAG,KAAKC,IAAG,CAAE,CAAC,MAAMn6F,GAAG,MAAM,OAAOk6F,KAAKA,GAAGA,GAAGxjF,MAAMxa,EAAE,IAAI2qF,GAAGU,GAAG+S,IAAIt6F,CAAE,CAAC,QAAQmW,GAAEha,EAAEi+F,IAAG,CAAE,CAAC,CAAC,OAAO,IAAI,CAAC,IAAIG,GAAG,GAAGC,GAAG,EAAEC,GAAG,KAAKC,GAAG,EAAEC,GAAG,GAAGC,GAAG,EAAEC,GAAG,KAAKC,GAAG,EAAEC,GAAG,GAAG,SAASC,GAAG9+F,EAAEC,GAAGo+F,GAAGC,MAAME,GAAGH,GAAGC,MAAMC,GAAGA,GAAGv+F,EAAEw+F,GAAGv+F,CAAC,CACjV,SAAS8+F,GAAG/+F,EAAEC,EAAEgI,GAAGw2F,GAAGC,MAAME,GAAGH,GAAGC,MAAMG,GAAGJ,GAAGC,MAAMC,GAAGA,GAAG3+F,EAAE,IAAImI,EAAEy2F,GAAG5+F,EAAE6+F,GAAG,IAAI/6F,EAAE,GAAGmoF,GAAG9jF,GAAG,EAAEA,KAAK,GAAGrE,GAAGmE,GAAG,EAAE,IAAId,EAAE,GAAG8kF,GAAGhsF,GAAG6D,EAAE,GAAG,GAAGqD,EAAE,CAAC,IAAIe,EAAEpE,EAAEA,EAAE,EAAEqD,GAAGgB,GAAG,GAAGD,GAAG,GAAGpH,SAAS,IAAIqH,IAAID,EAAEpE,GAAGoE,EAAE02F,GAAG,GAAG,GAAG3S,GAAGhsF,GAAG6D,EAAEmE,GAAGnE,EAAEqE,EAAE02F,GAAG13F,EAAEnH,CAAC,MAAM4+F,GAAG,GAAGz3F,EAAEc,GAAGnE,EAAEqE,EAAE02F,GAAG7+F,CAAC,CAAC,SAASg/F,GAAGh/F,GAAG,OAAOA,EAAEiqF,SAAS6U,GAAG9+F,EAAE,GAAG++F,GAAG/+F,EAAE,EAAE,GAAG,CAAC,SAASi/F,GAAGj/F,GAAG,KAAKA,IAAIu+F,IAAIA,GAAGF,KAAKC,IAAID,GAAGC,IAAI,KAAKE,GAAGH,KAAKC,IAAID,GAAGC,IAAI,KAAK,KAAKt+F,IAAI2+F,IAAIA,GAAGF,KAAKC,IAAID,GAAGC,IAAI,KAAKG,GAAGJ,KAAKC,IAAID,GAAGC,IAAI,KAAKE,GAAGH,KAAKC,IAAID,GAAGC,IAAI,IAAI,CAAC,IAAIQ,GAAG,KAAKC,GAAG,KAAKtlF,IAAE,EAAGulF,GAAG,KACje,SAASC,GAAGr/F,EAAEC,GAAG,IAAIgI,EAAEq3F,GAAG,EAAE,KAAK,KAAK,GAAGr3F,EAAEs3F,YAAY,UAAUt3F,EAAE4gF,UAAU5oF,EAAEgI,EAAEgiF,OAAOjqF,EAAgB,QAAdC,EAAED,EAAEw/F,YAAoBx/F,EAAEw/F,UAAU,CAACv3F,GAAGjI,EAAEU,OAAO,IAAIT,EAAE4kB,KAAK5c,EAAE,CACxJ,SAASw3F,GAAGz/F,EAAEC,GAAG,OAAOD,EAAEuhF,KAAK,KAAK,EAAE,IAAIt5E,EAAEjI,EAAE+B,KAAyE,OAAO,QAA3E9B,EAAE,IAAIA,EAAEikF,UAAUj8E,EAAEyF,gBAAgBzN,EAAEyjE,SAASh2D,cAAc,KAAKzN,KAAmBD,EAAE6oF,UAAU5oF,EAAEi/F,GAAGl/F,EAAEm/F,GAAG5C,GAAGt8F,EAAE8jF,aAAY,GAAO,KAAK,EAAE,OAAoD,QAA7C9jF,EAAE,KAAKD,EAAE0/F,cAAc,IAAIz/F,EAAEikF,SAAS,KAAKjkF,KAAYD,EAAE6oF,UAAU5oF,EAAEi/F,GAAGl/F,EAAEm/F,GAAG,MAAK,GAAO,KAAK,GAAG,OAA+B,QAAxBl/F,EAAE,IAAIA,EAAEikF,SAAS,KAAKjkF,KAAYgI,EAAE,OAAO02F,GAAG,CAAC5iF,GAAG6iF,GAAGe,SAASd,IAAI,KAAK7+F,EAAEmqF,cAAc,CAACC,WAAWnqF,EAAE2/F,YAAY33F,EAAE43F,UAAU,aAAY53F,EAAEq3F,GAAG,GAAG,KAAK,KAAK,IAAKzW,UAAU5oF,EAAEgI,EAAEgiF,OAAOjqF,EAAEA,EAAEuqF,MAAMtiF,EAAEi3F,GAAGl/F,EAAEm/F,GAClf,MAAK,GAAO,QAAQ,OAAM,EAAG,CAAC,SAASW,GAAG9/F,GAAG,OAAO,KAAY,EAAPA,EAAE45B,OAAS,KAAa,IAAR55B,EAAEU,MAAU,CAAC,SAASq/F,GAAG//F,GAAG,GAAG6Z,GAAE,CAAC,IAAI5Z,EAAEk/F,GAAG,GAAGl/F,EAAE,CAAC,IAAIgI,EAAEhI,EAAE,IAAIw/F,GAAGz/F,EAAEC,GAAG,CAAC,GAAG6/F,GAAG9/F,GAAG,MAAMsR,MAAM1J,EAAE,MAAM3H,EAAEs8F,GAAGt0F,EAAE8vF,aAAa,IAAI5vF,EAAE+2F,GAAGj/F,GAAGw/F,GAAGz/F,EAAEC,GAAGo/F,GAAGl3F,EAAEF,IAAIjI,EAAEU,OAAe,KAATV,EAAEU,MAAY,EAAEmZ,IAAE,EAAGqlF,GAAGl/F,EAAE,CAAC,KAAK,CAAC,GAAG8/F,GAAG9/F,GAAG,MAAMsR,MAAM1J,EAAE,MAAM5H,EAAEU,OAAe,KAATV,EAAEU,MAAY,EAAEmZ,IAAE,EAAGqlF,GAAGl/F,CAAC,CAAC,CAAC,CAAC,SAASggG,GAAGhgG,GAAG,IAAIA,EAAEA,EAAEiqF,OAAO,OAAOjqF,GAAG,IAAIA,EAAEuhF,KAAK,IAAIvhF,EAAEuhF,KAAK,KAAKvhF,EAAEuhF,KAAKvhF,EAAEA,EAAEiqF,OAAOiV,GAAGl/F,CAAC,CACha,SAASigG,GAAGjgG,GAAG,GAAGA,IAAIk/F,GAAG,OAAM,EAAG,IAAIrlF,GAAE,OAAOmmF,GAAGhgG,GAAG6Z,IAAE,GAAG,EAAG,IAAI5Z,EAAkG,IAA/FA,EAAE,IAAID,EAAEuhF,QAAQthF,EAAE,IAAID,EAAEuhF,OAAgBthF,EAAE,UAAXA,EAAED,EAAE+B,OAAmB,SAAS9B,IAAI67F,GAAG97F,EAAE+B,KAAK/B,EAAEkgG,gBAAmBjgG,IAAIA,EAAEk/F,IAAI,CAAC,GAAGW,GAAG9/F,GAAG,MAAMmgG,KAAK7uF,MAAM1J,EAAE,MAAM,KAAK3H,GAAGo/F,GAAGr/F,EAAEC,GAAGA,EAAEs8F,GAAGt8F,EAAE83F,YAAY,CAAO,GAANiI,GAAGhgG,GAAM,KAAKA,EAAEuhF,IAAI,CAAgD,KAA7BvhF,EAAE,QAApBA,EAAEA,EAAEmqF,eAAyBnqF,EAAEoqF,WAAW,MAAW,MAAM94E,MAAM1J,EAAE,MAAM5H,EAAE,CAAiB,IAAhBA,EAAEA,EAAE+3F,YAAgB93F,EAAE,EAAED,GAAG,CAAC,GAAG,IAAIA,EAAEkkF,SAAS,CAAC,IAAIj8E,EAAEjI,EAAEkK,KAAK,GAAG,OAAOjC,EAAE,CAAC,GAAG,IAAIhI,EAAE,CAACk/F,GAAG5C,GAAGv8F,EAAE+3F,aAAa,MAAM/3F,CAAC,CAACC,GAAG,KAAK,MAAMgI,GAAG,OAAOA,GAAG,OAAOA,GAAGhI,GAAG,CAACD,EAAEA,EAAE+3F,WAAW,CAACoH,GACjgB,IAAI,CAAC,MAAMA,GAAGD,GAAG3C,GAAGv8F,EAAE6oF,UAAUkP,aAAa,KAAK,OAAM,CAAE,CAAC,SAASoI,KAAK,IAAI,IAAIngG,EAAEm/F,GAAGn/F,GAAGA,EAAEu8F,GAAGv8F,EAAE+3F,YAAY,CAAC,SAASqI,KAAKjB,GAAGD,GAAG,KAAKrlF,IAAE,CAAE,CAAC,SAASwmF,GAAGrgG,GAAG,OAAOo/F,GAAGA,GAAG,CAACp/F,GAAGo/F,GAAGv6E,KAAK7kB,EAAE,CAAC,IAAIsgG,GAAG/mC,EAAGm2B,wBAChM,SAAS6Q,GAAGvgG,EAAEC,EAAEgI,GAAW,GAAG,QAAXjI,EAAEiI,EAAEJ,MAAiB,oBAAoB7H,GAAG,kBAAkBA,EAAE,CAAC,GAAGiI,EAAEM,OAAO,CAAY,GAAXN,EAAEA,EAAEM,OAAY,CAAC,GAAG,IAAIN,EAAEs5E,IAAI,MAAMjwE,MAAM1J,EAAE,MAAM,IAAIO,EAAEF,EAAE4gF,SAAS,CAAC,IAAI1gF,EAAE,MAAMmJ,MAAM1J,EAAE,IAAI5H,IAAI,IAAI8D,EAAEqE,EAAEhB,EAAE,GAAGnH,EAAE,OAAG,OAAOC,GAAG,OAAOA,EAAE4H,KAAK,oBAAoB5H,EAAE4H,KAAK5H,EAAE4H,IAAI24F,aAAar5F,EAASlH,EAAE4H,KAAI5H,EAAE,SAASD,GAAG,IAAIC,EAAE6D,EAAE28F,KAAK,OAAOzgG,SAASC,EAAEkH,GAAGlH,EAAEkH,GAAGnH,CAAC,EAAEC,EAAEugG,WAAWr5F,EAASlH,EAAC,CAAC,GAAG,kBAAkBD,EAAE,MAAMsR,MAAM1J,EAAE,MAAM,IAAIK,EAAEM,OAAO,MAAM+I,MAAM1J,EAAE,IAAI5H,GAAI,CAAC,OAAOA,CAAC,CAC/c,SAAS0gG,GAAG1gG,EAAEC,GAAuC,MAApCD,EAAEY,OAAOC,UAAUC,SAASE,KAAKf,GAASqR,MAAM1J,EAAE,GAAG,oBAAoB5H,EAAE,qBAAqBY,OAAOP,KAAKJ,GAAGoS,KAAK,MAAM,IAAIrS,GAAI,CAAC,SAAS2gG,GAAG3gG,GAAiB,OAAOC,EAAfD,EAAE0hF,OAAe1hF,EAAEyhF,SAAS,CACrM,SAASmf,GAAG5gG,GAAG,SAASC,EAAEA,EAAEgI,GAAG,GAAGjI,EAAE,CAAC,IAAImI,EAAElI,EAAEu/F,UAAU,OAAOr3F,GAAGlI,EAAEu/F,UAAU,CAACv3F,GAAGhI,EAAES,OAAO,IAAIyH,EAAE0c,KAAK5c,EAAE,CAAC,CAAC,SAASA,EAAEA,EAAEE,GAAG,IAAInI,EAAE,OAAO,KAAK,KAAK,OAAOmI,GAAGlI,EAAEgI,EAAEE,GAAGA,EAAEA,EAAEqiF,QAAQ,OAAO,IAAI,CAAC,SAASriF,EAAEnI,EAAEC,GAAG,IAAID,EAAE,IAAI4wE,IAAI,OAAO3wE,GAAG,OAAOA,EAAEgB,IAAIjB,EAAE2d,IAAI1d,EAAEgB,IAAIhB,GAAGD,EAAE2d,IAAI1d,EAAEkgB,MAAMlgB,GAAGA,EAAEA,EAAEuqF,QAAQ,OAAOxqF,CAAC,CAAC,SAAS8D,EAAE9D,EAAEC,GAAsC,OAAnCD,EAAE6gG,GAAG7gG,EAAEC,IAAKkgB,MAAM,EAAEngB,EAAEwqF,QAAQ,KAAYxqF,CAAC,CAAC,SAASmH,EAAElH,EAAEgI,EAAEE,GAAa,OAAVlI,EAAEkgB,MAAMhY,EAAMnI,EAA6C,QAAjBmI,EAAElI,EAAE+pF,YAA6B7hF,EAAEA,EAAEgY,OAAQlY,GAAGhI,EAAES,OAAO,EAAEuH,GAAGE,GAAElI,EAAES,OAAO,EAASuH,IAArGhI,EAAES,OAAO,QAAQuH,EAAqF,CAAC,SAASC,EAAEjI,GACzd,OAD4dD,GAC7f,OAAOC,EAAE+pF,YAAY/pF,EAAES,OAAO,GAAUT,CAAC,CAAC,SAASmI,EAAEpI,EAAEC,EAAEgI,EAAEE,GAAG,OAAG,OAAOlI,GAAG,IAAIA,EAAEshF,MAAWthF,EAAE6gG,GAAG74F,EAAEjI,EAAE45B,KAAKzxB,IAAK8hF,OAAOjqF,EAAEC,KAAEA,EAAE6D,EAAE7D,EAAEgI,IAAKgiF,OAAOjqF,EAASC,EAAC,CAAC,SAASmH,EAAEpH,EAAEC,EAAEgI,EAAEE,GAAG,IAAIhB,EAAEc,EAAElG,KAAK,OAAGoF,IAAI8yD,EAAUzyD,EAAExH,EAAEC,EAAEgI,EAAEK,MAAM86E,SAASj7E,EAAEF,EAAEhH,KAAQ,OAAOhB,IAAIA,EAAEs/F,cAAcp4F,GAAG,kBAAkBA,GAAG,OAAOA,GAAGA,EAAEkB,WAAWo6D,GAAIk+B,GAAGx5F,KAAKlH,EAAE8B,QAAaoG,EAAErE,EAAE7D,EAAEgI,EAAEK,QAAST,IAAI04F,GAAGvgG,EAAEC,EAAEgI,GAAGE,EAAE8hF,OAAOjqF,EAAEmI,KAAEA,EAAE44F,GAAG94F,EAAElG,KAAKkG,EAAEhH,IAAIgH,EAAEK,MAAM,KAAKtI,EAAE45B,KAAKzxB,IAAKN,IAAI04F,GAAGvgG,EAAEC,EAAEgI,GAAGE,EAAE8hF,OAAOjqF,EAASmI,EAAC,CAAC,SAASZ,EAAEvH,EAAEC,EAAEgI,EAAEE,GAAG,OAAG,OAAOlI,GAAG,IAAIA,EAAEshF,KACjfthF,EAAE4oF,UAAUqG,gBAAgBjnF,EAAEinF,eAAejvF,EAAE4oF,UAAUmY,iBAAiB/4F,EAAE+4F,iBAAsB/gG,EAAEghG,GAAGh5F,EAAEjI,EAAE45B,KAAKzxB,IAAK8hF,OAAOjqF,EAAEC,KAAEA,EAAE6D,EAAE7D,EAAEgI,EAAEm7E,UAAU,KAAM6G,OAAOjqF,EAASC,EAAC,CAAC,SAASuH,EAAExH,EAAEC,EAAEgI,EAAEE,EAAEhB,GAAG,OAAG,OAAOlH,GAAG,IAAIA,EAAEshF,MAAWthF,EAAEihG,GAAGj5F,EAAEjI,EAAE45B,KAAKzxB,EAAEhB,IAAK8iF,OAAOjqF,EAAEC,KAAEA,EAAE6D,EAAE7D,EAAEgI,IAAKgiF,OAAOjqF,EAASC,EAAC,CAAC,SAAS+H,EAAEhI,EAAEC,EAAEgI,GAAG,GAAG,kBAAkBhI,GAAG,KAAKA,GAAG,kBAAkBA,EAAE,OAAOA,EAAE6gG,GAAG,GAAG7gG,EAAED,EAAE45B,KAAK3xB,IAAKgiF,OAAOjqF,EAAEC,EAAE,GAAG,kBAAkBA,GAAG,OAAOA,EAAE,CAAC,OAAOA,EAAEoI,UAAU,KAAKwxD,EAAG,OAAO5xD,EAAE84F,GAAG9gG,EAAE8B,KAAK9B,EAAEgB,IAAIhB,EAAEqI,MAAM,KAAKtI,EAAE45B,KAAK3xB,IACjfJ,IAAI04F,GAAGvgG,EAAE,KAAKC,GAAGgI,EAAEgiF,OAAOjqF,EAAEiI,EAAE,KAAK24D,EAAG,OAAO3gE,EAAEghG,GAAGhhG,EAAED,EAAE45B,KAAK3xB,IAAKgiF,OAAOjqF,EAAEC,EAAE,KAAKwiE,EAAiB,OAAOz6D,EAAEhI,GAAEmI,EAAnBlI,EAAEyhF,OAAmBzhF,EAAEwhF,UAAUx5E,GAAG,GAAG46E,GAAG5iF,IAAIuiE,EAAGviE,GAAG,OAAOA,EAAEihG,GAAGjhG,EAAED,EAAE45B,KAAK3xB,EAAE,OAAQgiF,OAAOjqF,EAAEC,EAAEygG,GAAG1gG,EAAEC,EAAE,CAAC,OAAO,IAAI,CAAC,SAAS8Q,EAAE/Q,EAAEC,EAAEgI,EAAEE,GAAG,IAAIrE,EAAE,OAAO7D,EAAEA,EAAEgB,IAAI,KAAK,GAAG,kBAAkBgH,GAAG,KAAKA,GAAG,kBAAkBA,EAAE,OAAO,OAAOnE,EAAE,KAAKsE,EAAEpI,EAAEC,EAAE,GAAGgI,EAAEE,GAAG,GAAG,kBAAkBF,GAAG,OAAOA,EAAE,CAAC,OAAOA,EAAEI,UAAU,KAAKwxD,EAAG,OAAO5xD,EAAEhH,MAAM6C,EAAEsD,EAAEpH,EAAEC,EAAEgI,EAAEE,GAAG,KAAK,KAAKy4D,EAAG,OAAO34D,EAAEhH,MAAM6C,EAAEyD,EAAEvH,EAAEC,EAAEgI,EAAEE,GAAG,KAAK,KAAKs6D,EAAG,OAAiB1xD,EAAE/Q,EACpfC,GADwe6D,EAAEmE,EAAEy5E,OACxez5E,EAAEw5E,UAAUt5E,GAAG,GAAG06E,GAAG56E,IAAIu6D,EAAGv6D,GAAG,OAAO,OAAOnE,EAAE,KAAK0D,EAAExH,EAAEC,EAAEgI,EAAEE,EAAE,MAAMu4F,GAAG1gG,EAAEiI,EAAE,CAAC,OAAO,IAAI,CAAC,SAAS2G,EAAE5O,EAAEC,EAAEgI,EAAEE,EAAErE,GAAG,GAAG,kBAAkBqE,GAAG,KAAKA,GAAG,kBAAkBA,EAAE,OAAwBC,EAAEnI,EAAnBD,EAAEA,EAAEkb,IAAIjT,IAAI,KAAW,GAAGE,EAAErE,GAAG,GAAG,kBAAkBqE,GAAG,OAAOA,EAAE,CAAC,OAAOA,EAAEE,UAAU,KAAKwxD,EAAG,OAA2CzyD,EAAEnH,EAAtCD,EAAEA,EAAEkb,IAAI,OAAO/S,EAAElH,IAAIgH,EAAEE,EAAElH,MAAM,KAAWkH,EAAErE,GAAG,KAAK88D,EAAG,OAA2Cr5D,EAAEtH,EAAtCD,EAAEA,EAAEkb,IAAI,OAAO/S,EAAElH,IAAIgH,EAAEE,EAAElH,MAAM,KAAWkH,EAAErE,GAAG,KAAK2+D,EAAiB,OAAO7zD,EAAE5O,EAAEC,EAAEgI,GAAEd,EAAvBgB,EAAEu5E,OAAuBv5E,EAAEs5E,UAAU39E,GAAG,GAAG++E,GAAG16E,IAAIq6D,EAAGr6D,GAAG,OAAwBX,EAAEvH,EAAnBD,EAAEA,EAAEkb,IAAIjT,IAAI,KAAWE,EAAErE,EAAE,MAAM48F,GAAGzgG,EAAEkI,EAAE,CAAC,OAAO,IAAI,CAC9f,SAASV,EAAE3D,EAAEoE,EAAEE,EAAEhB,GAAG,IAAI,IAAIG,EAAE,KAAKC,EAAE,KAAKsK,EAAE5J,EAAE8R,EAAE9R,EAAE,EAAEyG,EAAE,KAAK,OAAOmD,GAAGkI,EAAE5R,EAAEjI,OAAO6Z,IAAI,CAAClI,EAAEqO,MAAMnG,GAAGrL,EAAEmD,EAAEA,EAAE,MAAMnD,EAAEmD,EAAE04E,QAAQ,IAAI/iF,EAAEsJ,EAAEjN,EAAEgO,EAAE1J,EAAE4R,GAAG5S,GAAG,GAAG,OAAOK,EAAE,CAAC,OAAOqK,IAAIA,EAAEnD,GAAG,KAAK,CAAC3O,GAAG8R,GAAG,OAAOrK,EAAEuiF,WAAW/pF,EAAE6D,EAAEgO,GAAG5J,EAAEf,EAAEM,EAAES,EAAE8R,GAAG,OAAOxS,EAAED,EAAEE,EAAED,EAAEgjF,QAAQ/iF,EAAED,EAAEC,EAAEqK,EAAEnD,CAAC,CAAC,GAAGqL,IAAI5R,EAAEjI,OAAO,OAAO8H,EAAEnE,EAAEgO,GAAG+H,IAAGilF,GAAGh7F,EAAEkW,GAAGzS,EAAE,GAAG,OAAOuK,EAAE,CAAC,KAAKkI,EAAE5R,EAAEjI,OAAO6Z,IAAkB,QAAdlI,EAAE9J,EAAElE,EAAEsE,EAAE4R,GAAG5S,MAAcc,EAAEf,EAAE2K,EAAE5J,EAAE8R,GAAG,OAAOxS,EAAED,EAAEuK,EAAEtK,EAAEgjF,QAAQ14E,EAAEtK,EAAEsK,GAAc,OAAX+H,IAAGilF,GAAGh7F,EAAEkW,GAAUzS,CAAC,CAAC,IAAIuK,EAAE3J,EAAErE,EAAEgO,GAAGkI,EAAE5R,EAAEjI,OAAO6Z,IAAsB,QAAlBrL,EAAEC,EAAEkD,EAAEhO,EAAEkW,EAAE5R,EAAE4R,GAAG5S,MAAcpH,GAAG,OAAO2O,EAAEq7E,WAAWl4E,EAAEw8E,OAAO,OACvf3/E,EAAE1N,IAAI+Y,EAAErL,EAAE1N,KAAKiH,EAAEf,EAAEwH,EAAEzG,EAAE8R,GAAG,OAAOxS,EAAED,EAAEoH,EAAEnH,EAAEgjF,QAAQ77E,EAAEnH,EAAEmH,GAAuD,OAApD3O,GAAG8R,EAAEtE,SAAQ,SAASxN,GAAG,OAAOC,EAAE6D,EAAE9D,EAAE,IAAG6Z,IAAGilF,GAAGh7F,EAAEkW,GAAUzS,CAAC,CAAC,SAAS2J,EAAEpN,EAAEoE,EAAEE,EAAEhB,GAAG,IAAIG,EAAEi7D,EAAGp6D,GAAG,GAAG,oBAAoBb,EAAE,MAAM+J,MAAM1J,EAAE,MAAkB,GAAG,OAAfQ,EAAEb,EAAEvG,KAAKoH,IAAc,MAAMkJ,MAAM1J,EAAE,MAAM,IAAI,IAAIkK,EAAEvK,EAAE,KAAKC,EAAEU,EAAE8R,EAAE9R,EAAE,EAAEyG,EAAE,KAAKlH,EAAEW,EAAE+4F,OAAO,OAAO35F,IAAIC,EAAE6C,KAAK0P,IAAIvS,EAAEW,EAAE+4F,OAAO,CAAC35F,EAAE2Y,MAAMnG,GAAGrL,EAAEnH,EAAEA,EAAE,MAAMmH,EAAEnH,EAAEgjF,QAAQ,IAAIt5E,EAAEH,EAAEjN,EAAE0D,EAAEC,EAAEmE,MAAMxE,GAAG,GAAG,OAAO8J,EAAE,CAAC,OAAO1J,IAAIA,EAAEmH,GAAG,KAAK,CAAC3O,GAAGwH,GAAG,OAAO0J,EAAE84E,WAAW/pF,EAAE6D,EAAE0D,GAAGU,EAAEf,EAAE+J,EAAEhJ,EAAE8R,GAAG,OAAOlI,EAAEvK,EAAE2J,EAAEY,EAAE04E,QAAQt5E,EAAEY,EAAEZ,EAAE1J,EAAEmH,CAAC,CAAC,GAAGlH,EAAE6C,KAAK,OAAOrC,EAAEnE,EACzf0D,GAAGqS,IAAGilF,GAAGh7F,EAAEkW,GAAGzS,EAAE,GAAG,OAAOC,EAAE,CAAC,MAAMC,EAAE6C,KAAK0P,IAAIvS,EAAEW,EAAE+4F,OAAwB,QAAjB15F,EAAEO,EAAElE,EAAE2D,EAAEmE,MAAMxE,MAAcc,EAAEf,EAAEM,EAAES,EAAE8R,GAAG,OAAOlI,EAAEvK,EAAEE,EAAEqK,EAAE04E,QAAQ/iF,EAAEqK,EAAErK,GAAc,OAAXoS,IAAGilF,GAAGh7F,EAAEkW,GAAUzS,CAAC,CAAC,IAAIC,EAAEW,EAAErE,EAAE0D,IAAIC,EAAE6C,KAAK0P,IAAIvS,EAAEW,EAAE+4F,OAA4B,QAArB15F,EAAEmH,EAAEpH,EAAE1D,EAAEkW,EAAEvS,EAAEmE,MAAMxE,MAAcpH,GAAG,OAAOyH,EAAEuiF,WAAWxiF,EAAE8mF,OAAO,OAAO7mF,EAAExG,IAAI+Y,EAAEvS,EAAExG,KAAKiH,EAAEf,EAAEM,EAAES,EAAE8R,GAAG,OAAOlI,EAAEvK,EAAEE,EAAEqK,EAAE04E,QAAQ/iF,EAAEqK,EAAErK,GAAuD,OAApDzH,GAAGwH,EAAEgG,SAAQ,SAASxN,GAAG,OAAOC,EAAE6D,EAAE9D,EAAE,IAAG6Z,IAAGilF,GAAGh7F,EAAEkW,GAAUzS,CAAC,CAG3T,OAH4T,SAAS+c,EAAEtkB,EAAEmI,EAAEhB,EAAEiB,GAAkF,GAA/E,kBAAkBjB,GAAG,OAAOA,GAAGA,EAAEpF,OAAOk4D,GAAI,OAAO9yD,EAAElG,MAAMkG,EAAEA,EAAEmB,MAAM86E,UAAa,kBAAkBj8E,GAAG,OAAOA,EAAE,CAAC,OAAOA,EAAEkB,UAAU,KAAKwxD,EAAG75D,EAAE,CAAC,IAAI,IAAIoH,EAC7hBD,EAAElG,IAAIsG,EAAEY,EAAE,OAAOZ,GAAG,CAAC,GAAGA,EAAEtG,MAAMmG,EAAE,CAAU,IAATA,EAAED,EAAEpF,QAAYk4D,GAAI,GAAG,IAAI1yD,EAAEg6E,IAAI,CAACt5E,EAAEjI,EAAEuH,EAAEijF,UAASriF,EAAErE,EAAEyD,EAAEJ,EAAEmB,MAAM86E,WAAY6G,OAAOjqF,EAAEA,EAAEmI,EAAE,MAAMnI,CAAC,OAAO,GAAGuH,EAAEg4F,cAAcn4F,GAAG,kBAAkBA,GAAG,OAAOA,GAAGA,EAAEiB,WAAWo6D,GAAIk+B,GAAGv5F,KAAKG,EAAExF,KAAK,CAACkG,EAAEjI,EAAEuH,EAAEijF,UAASriF,EAAErE,EAAEyD,EAAEJ,EAAEmB,QAAST,IAAI04F,GAAGvgG,EAAEuH,EAAEJ,GAAGgB,EAAE8hF,OAAOjqF,EAAEA,EAAEmI,EAAE,MAAMnI,CAAC,CAACiI,EAAEjI,EAAEuH,GAAG,KAAK,CAAMtH,EAAED,EAAEuH,GAAGA,EAAEA,EAAEijF,OAAO,CAACrjF,EAAEpF,OAAOk4D,IAAI9xD,EAAE+4F,GAAG/5F,EAAEmB,MAAM86E,SAASpjF,EAAE45B,KAAKxxB,EAAEjB,EAAElG,MAAOgpF,OAAOjqF,EAAEA,EAAEmI,KAAIC,EAAE24F,GAAG55F,EAAEpF,KAAKoF,EAAElG,IAAIkG,EAAEmB,MAAM,KAAKtI,EAAE45B,KAAKxxB,IAAKP,IAAI04F,GAAGvgG,EAAEmI,EAAEhB,GAAGiB,EAAE6hF,OAAOjqF,EAAEA,EAAEoI,EAAE,CAAC,OAAOF,EAAElI,GAAG,KAAK4gE,EAAG5gE,EAAE,CAAC,IAAIuH,EAAEJ,EAAElG,IAAI,OACzfkH,GAAG,CAAC,GAAGA,EAAElH,MAAMsG,EAAC,CAAC,GAAG,IAAIY,EAAEo5E,KAAKp5E,EAAE0gF,UAAUqG,gBAAgB/nF,EAAE+nF,eAAe/mF,EAAE0gF,UAAUmY,iBAAiB75F,EAAE65F,eAAe,CAAC/4F,EAAEjI,EAAEmI,EAAEqiF,UAASriF,EAAErE,EAAEqE,EAAEhB,EAAEi8E,UAAU,KAAM6G,OAAOjqF,EAAEA,EAAEmI,EAAE,MAAMnI,CAAC,CAAMiI,EAAEjI,EAAEmI,GAAG,KAAM,CAAKlI,EAAED,EAAEmI,GAAGA,EAAEA,EAAEqiF,OAAO,EAACriF,EAAE84F,GAAG95F,EAAEnH,EAAE45B,KAAKxxB,IAAK6hF,OAAOjqF,EAAEA,EAAEmI,CAAC,CAAC,OAAOD,EAAElI,GAAG,KAAKyiE,EAAG,OAAiBn+C,EAAEtkB,EAAEmI,GAAdZ,EAAEJ,EAAEu6E,OAAcv6E,EAAEs6E,UAAUr5E,GAAG,GAAGy6E,GAAG17E,GAAG,OAAOM,EAAEzH,EAAEmI,EAAEhB,EAAEiB,GAAG,GAAGo6D,EAAGr7D,GAAG,OAAO+J,EAAElR,EAAEmI,EAAEhB,EAAEiB,GAAGs4F,GAAG1gG,EAAEmH,EAAE,CAAC,MAAM,kBAAkBA,GAAG,KAAKA,GAAG,kBAAkBA,GAAGA,EAAE,GAAGA,EAAE,OAAOgB,GAAG,IAAIA,EAAEo5E,KAAKt5E,EAAEjI,EAAEmI,EAAEqiF,UAASriF,EAAErE,EAAEqE,EAAEhB,IAAK8iF,OAAOjqF,EAAEA,EAAEmI,IACnfF,EAAEjI,EAAEmI,IAAGA,EAAE24F,GAAG35F,EAAEnH,EAAE45B,KAAKxxB,IAAK6hF,OAAOjqF,EAAEA,EAAEmI,GAAGD,EAAElI,IAAIiI,EAAEjI,EAAEmI,EAAE,CAAS,CAAC,IAAIi5F,GAAGR,IAAG,GAAIS,GAAGT,IAAG,GAAIU,GAAGrE,GAAG,MAAMsE,GAAG,KAAKC,GAAG,KAAKC,GAAG,KAAK,SAASC,KAAKD,GAAGD,GAAGD,GAAG,IAAI,CAAC,SAASI,GAAG3hG,GAAG,IAAIC,EAAEqhG,GAAG94F,QAAQgK,GAAE8uF,IAAIthG,EAAE4hG,cAAc3hG,CAAC,CAAC,SAAS4hG,GAAG7hG,EAAEC,EAAEgI,GAAG,KAAK,OAAOjI,GAAG,CAAC,IAAImI,EAAEnI,EAAEgqF,UAA+H,IAApHhqF,EAAE8hG,WAAW7hG,KAAKA,GAAGD,EAAE8hG,YAAY7hG,EAAE,OAAOkI,IAAIA,EAAE25F,YAAY7hG,IAAI,OAAOkI,IAAIA,EAAE25F,WAAW7hG,KAAKA,IAAIkI,EAAE25F,YAAY7hG,GAAMD,IAAIiI,EAAE,MAAMjI,EAAEA,EAAEiqF,MAAM,CAAC,CACnZ,SAAS8X,GAAG/hG,EAAEC,GAAGshG,GAAGvhG,EAAEyhG,GAAGD,GAAG,KAAsB,QAAjBxhG,EAAEA,EAAEgiG,eAAuB,OAAOhiG,EAAEiiG,eAAe,KAAKjiG,EAAEkiG,MAAMjiG,KAAKkiG,IAAG,GAAIniG,EAAEiiG,aAAa,KAAK,CAAC,SAASG,GAAGpiG,GAAG,IAAIC,EAAED,EAAE4hG,cAAc,GAAGH,KAAKzhG,EAAE,GAAGA,EAAE,CAACsE,QAAQtE,EAAEqiG,cAAcpiG,EAAEkhG,KAAK,MAAM,OAAOK,GAAG,CAAC,GAAG,OAAOD,GAAG,MAAMjwF,MAAM1J,EAAE,MAAM45F,GAAGxhG,EAAEuhG,GAAGS,aAAa,CAACE,MAAM,EAAED,aAAajiG,EAAE,MAAMwhG,GAAGA,GAAGL,KAAKnhG,EAAE,OAAOC,CAAC,CAAC,IAAIqiG,GAAG,KAAK,SAASC,GAAGviG,GAAG,OAAOsiG,GAAGA,GAAG,CAACtiG,GAAGsiG,GAAGz9E,KAAK7kB,EAAE,CACvY,SAASwiG,GAAGxiG,EAAEC,EAAEgI,EAAEE,GAAG,IAAIrE,EAAE7D,EAAEwiG,YAA+E,OAAnE,OAAO3+F,GAAGmE,EAAEk5F,KAAKl5F,EAAEs6F,GAAGtiG,KAAKgI,EAAEk5F,KAAKr9F,EAAEq9F,KAAKr9F,EAAEq9F,KAAKl5F,GAAGhI,EAAEwiG,YAAYx6F,EAASy6F,GAAG1iG,EAAEmI,EAAE,CAAC,SAASu6F,GAAG1iG,EAAEC,GAAGD,EAAEkiG,OAAOjiG,EAAE,IAAIgI,EAAEjI,EAAEgqF,UAAqC,IAA3B,OAAO/hF,IAAIA,EAAEi6F,OAAOjiG,GAAGgI,EAAEjI,EAAMA,EAAEA,EAAEiqF,OAAO,OAAOjqF,GAAGA,EAAE8hG,YAAY7hG,EAAgB,QAAdgI,EAAEjI,EAAEgqF,aAAqB/hF,EAAE65F,YAAY7hG,GAAGgI,EAAEjI,EAAEA,EAAEA,EAAEiqF,OAAO,OAAO,IAAIhiF,EAAEs5E,IAAIt5E,EAAE4gF,UAAU,IAAI,CAAC,IAAI8Z,IAAG,EAAG,SAASC,GAAG5iG,GAAGA,EAAE6iG,YAAY,CAACC,UAAU9iG,EAAEmqF,cAAc4Y,gBAAgB,KAAKC,eAAe,KAAKC,OAAO,CAACC,QAAQ,KAAKT,YAAY,KAAKP,MAAM,GAAGiB,QAAQ,KAAK,CAC/e,SAASC,GAAGpjG,EAAEC,GAAGD,EAAEA,EAAE6iG,YAAY5iG,EAAE4iG,cAAc7iG,IAAIC,EAAE4iG,YAAY,CAACC,UAAU9iG,EAAE8iG,UAAUC,gBAAgB/iG,EAAE+iG,gBAAgBC,eAAehjG,EAAEgjG,eAAeC,OAAOjjG,EAAEijG,OAAOE,QAAQnjG,EAAEmjG,SAAS,CAAC,SAASE,GAAGrjG,EAAEC,GAAG,MAAM,CAACqjG,UAAUtjG,EAAEujG,KAAKtjG,EAAEshF,IAAI,EAAEpxC,QAAQ,KAAKqzD,SAAS,KAAKrC,KAAK,KAAK,CACtR,SAASsC,GAAGzjG,EAAEC,EAAEgI,GAAG,IAAIE,EAAEnI,EAAE6iG,YAAY,GAAG,OAAO16F,EAAE,OAAO,KAAgB,GAAXA,EAAEA,EAAE86F,OAAU,KAAO,EAAFjjF,IAAK,CAAC,IAAIlc,EAAEqE,EAAE+6F,QAA+D,OAAvD,OAAOp/F,EAAE7D,EAAEkhG,KAAKlhG,GAAGA,EAAEkhG,KAAKr9F,EAAEq9F,KAAKr9F,EAAEq9F,KAAKlhG,GAAGkI,EAAE+6F,QAAQjjG,EAASyiG,GAAG1iG,EAAEiI,EAAE,CAAoF,OAAnE,QAAhBnE,EAAEqE,EAAEs6F,cAAsBxiG,EAAEkhG,KAAKlhG,EAAEsiG,GAAGp6F,KAAKlI,EAAEkhG,KAAKr9F,EAAEq9F,KAAKr9F,EAAEq9F,KAAKlhG,GAAGkI,EAAEs6F,YAAYxiG,EAASyiG,GAAG1iG,EAAEiI,EAAE,CAAC,SAASy7F,GAAG1jG,EAAEC,EAAEgI,GAAmB,GAAG,QAAnBhI,EAAEA,EAAE4iG,eAA0B5iG,EAAEA,EAAEgjG,OAAO,KAAO,QAAFh7F,IAAY,CAAC,IAAIE,EAAElI,EAAEiiG,MAAwBj6F,GAAlBE,GAAGnI,EAAE0sF,aAAkBzsF,EAAEiiG,MAAMj6F,EAAEolF,GAAGrtF,EAAEiI,EAAE,CAAC,CACrZ,SAAS07F,GAAG3jG,EAAEC,GAAG,IAAIgI,EAAEjI,EAAE6iG,YAAY16F,EAAEnI,EAAEgqF,UAAU,GAAG,OAAO7hF,GAAoBF,KAAhBE,EAAEA,EAAE06F,aAAmB,CAAC,IAAI/+F,EAAE,KAAKqD,EAAE,KAAyB,GAAG,QAAvBc,EAAEA,EAAE86F,iBAA4B,CAAC,EAAE,CAAC,IAAI76F,EAAE,CAACo7F,UAAUr7F,EAAEq7F,UAAUC,KAAKt7F,EAAEs7F,KAAKhiB,IAAIt5E,EAAEs5E,IAAIpxC,QAAQloC,EAAEkoC,QAAQqzD,SAASv7F,EAAEu7F,SAASrC,KAAK,MAAM,OAAOh6F,EAAErD,EAAEqD,EAAEe,EAAEf,EAAEA,EAAEg6F,KAAKj5F,EAAED,EAAEA,EAAEk5F,IAAI,OAAO,OAAOl5F,GAAG,OAAOd,EAAErD,EAAEqD,EAAElH,EAAEkH,EAAEA,EAAEg6F,KAAKlhG,CAAC,MAAM6D,EAAEqD,EAAElH,EAAiH,OAA/GgI,EAAE,CAAC66F,UAAU36F,EAAE26F,UAAUC,gBAAgBj/F,EAAEk/F,eAAe77F,EAAE87F,OAAO96F,EAAE86F,OAAOE,QAAQh7F,EAAEg7F,cAASnjG,EAAE6iG,YAAY56F,EAAQ,CAAoB,QAAnBjI,EAAEiI,EAAE+6F,gBAAwB/6F,EAAE86F,gBAAgB9iG,EAAED,EAAEmhG,KACnflhG,EAAEgI,EAAE+6F,eAAe/iG,CAAC,CACpB,SAAS2jG,GAAG5jG,EAAEC,EAAEgI,EAAEE,GAAG,IAAIrE,EAAE9D,EAAE6iG,YAAYF,IAAG,EAAG,IAAIx7F,EAAErD,EAAEi/F,gBAAgB76F,EAAEpE,EAAEk/F,eAAe56F,EAAEtE,EAAEm/F,OAAOC,QAAQ,GAAG,OAAO96F,EAAE,CAACtE,EAAEm/F,OAAOC,QAAQ,KAAK,IAAI97F,EAAEgB,EAAEb,EAAEH,EAAE+5F,KAAK/5F,EAAE+5F,KAAK,KAAK,OAAOj5F,EAAEf,EAAEI,EAAEW,EAAEi5F,KAAK55F,EAAEW,EAAEd,EAAE,IAAII,EAAExH,EAAEgqF,UAAU,OAAOxiF,KAAoBY,GAAhBZ,EAAEA,EAAEq7F,aAAgBG,kBAAmB96F,IAAI,OAAOE,EAAEZ,EAAEu7F,gBAAgBx7F,EAAEa,EAAE+4F,KAAK55F,EAAEC,EAAEw7F,eAAe57F,GAAG,CAAC,GAAG,OAAOD,EAAE,CAAC,IAAIa,EAAElE,EAAEg/F,UAA6B,IAAnB56F,EAAE,EAAEV,EAAED,EAAEH,EAAE,KAAKgB,EAAEjB,IAAI,CAAC,IAAI4J,EAAE3I,EAAEm7F,KAAK30F,EAAExG,EAAEk7F,UAAU,IAAIn7F,EAAE4I,KAAKA,EAAE,CAAC,OAAOvJ,IAAIA,EAAEA,EAAE25F,KAAK,CAACmC,UAAU10F,EAAE20F,KAAK,EAAEhiB,IAAIn5E,EAAEm5E,IAAIpxC,QAAQ/nC,EAAE+nC,QAAQqzD,SAASp7F,EAAEo7F,SACvfrC,KAAK,OAAOnhG,EAAE,CAAC,IAAIyH,EAAEzH,EAAEkR,EAAE9I,EAAU,OAAR2I,EAAE9Q,EAAE2O,EAAE3G,EAASiJ,EAAEqwE,KAAK,KAAK,EAAc,GAAG,oBAAf95E,EAAEyJ,EAAEi/B,SAAiC,CAACnoC,EAAEP,EAAEzG,KAAK4N,EAAE5G,EAAE+I,GAAG,MAAM/Q,CAAC,CAACgI,EAAEP,EAAE,MAAMzH,EAAE,KAAK,EAAEyH,EAAE/G,OAAe,MAAT+G,EAAE/G,MAAa,IAAI,KAAK,EAAsD,GAAG,QAA3CqQ,EAAE,oBAAdtJ,EAAEyJ,EAAEi/B,SAAgC1oC,EAAEzG,KAAK4N,EAAE5G,EAAE+I,GAAGtJ,SAAe,IAASsJ,EAAE,MAAM/Q,EAAEgI,EAAE6O,EAAE,CAAC,EAAE7O,EAAE+I,GAAG,MAAM/Q,EAAE,KAAK,EAAE2iG,IAAG,EAAG,CAAC,OAAOv6F,EAAEo7F,UAAU,IAAIp7F,EAAEm7F,OAAOvjG,EAAEU,OAAO,GAAe,QAAZqQ,EAAEjN,EAAEq/F,SAAiBr/F,EAAEq/F,QAAQ,CAAC/6F,GAAG2I,EAAE8T,KAAKzc,GAAG,MAAMwG,EAAE,CAAC00F,UAAU10F,EAAE20F,KAAKxyF,EAAEwwE,IAAIn5E,EAAEm5E,IAAIpxC,QAAQ/nC,EAAE+nC,QAAQqzD,SAASp7F,EAAEo7F,SAASrC,KAAK,MAAM,OAAO35F,GAAGD,EAAEC,EAAEoH,EAAExH,EAAEY,GAAGR,EAAEA,EAAE25F,KAAKvyF,EAAE1G,GAAG6I,EAC3e,GAAG,QAAZ3I,EAAEA,EAAE+4F,MAAiB,IAAsB,QAAnB/4F,EAAEtE,EAAEm/F,OAAOC,SAAiB,MAAe96F,GAAJ2I,EAAE3I,GAAM+4F,KAAKpwF,EAAEowF,KAAK,KAAKr9F,EAAEk/F,eAAejyF,EAAEjN,EAAEm/F,OAAOC,QAAQ,IAAI,EAAsG,GAA5F,OAAO17F,IAAIJ,EAAEY,GAAGlE,EAAEg/F,UAAU17F,EAAEtD,EAAEi/F,gBAAgBx7F,EAAEzD,EAAEk/F,eAAex7F,EAA4B,QAA1BvH,EAAE6D,EAAEm/F,OAAOR,aAAwB,CAAC3+F,EAAE7D,EAAE,GAAGiI,GAAGpE,EAAEy/F,KAAKz/F,EAAEA,EAAEq9F,WAAWr9F,IAAI7D,EAAE,MAAM,OAAOkH,IAAIrD,EAAEm/F,OAAOf,MAAM,GAAG2B,IAAI37F,EAAElI,EAAEkiG,MAAMh6F,EAAElI,EAAEmqF,cAAcniF,CAAC,CAAC,CAC9V,SAAS87F,GAAG9jG,EAAEC,EAAEgI,GAA8B,GAA3BjI,EAAEC,EAAEkjG,QAAQljG,EAAEkjG,QAAQ,KAAQ,OAAOnjG,EAAE,IAAIC,EAAE,EAAEA,EAAED,EAAEG,OAAOF,IAAI,CAAC,IAAIkI,EAAEnI,EAAEC,GAAG6D,EAAEqE,EAAEq7F,SAAS,GAAG,OAAO1/F,EAAE,CAAqB,GAApBqE,EAAEq7F,SAAS,KAAKr7F,EAAEF,EAAK,oBAAoBnE,EAAE,MAAMwN,MAAM1J,EAAE,IAAI9D,IAAIA,EAAE9C,KAAKmH,EAAE,CAAC,CAAC,CAAC,IAAI47F,GAAG,CAAC,EAAEC,GAAG/G,GAAG8G,IAAIE,GAAGhH,GAAG8G,IAAIG,GAAGjH,GAAG8G,IAAI,SAASI,GAAGnkG,GAAG,GAAGA,IAAI+jG,GAAG,MAAMzyF,MAAM1J,EAAE,MAAM,OAAO5H,CAAC,CACnS,SAASokG,GAAGpkG,EAAEC,GAAyC,OAAtC2d,GAAEsmF,GAAGjkG,GAAG2d,GAAEqmF,GAAGjkG,GAAG4d,GAAEomF,GAAGD,IAAI/jG,EAAEC,EAAEikF,UAAmB,KAAK,EAAE,KAAK,GAAGjkF,GAAGA,EAAEA,EAAEs4F,iBAAiBt4F,EAAE4jF,aAAaJ,GAAG,KAAK,IAAI,MAAM,QAAkExjF,EAAEwjF,GAArCxjF,GAAvBD,EAAE,IAAIA,EAAEC,EAAEsoF,WAAWtoF,GAAM4jF,cAAc,KAAK7jF,EAAEA,EAAEqkG,SAAkB7xF,GAAEwxF,IAAIpmF,GAAEomF,GAAG/jG,EAAE,CAAC,SAASqkG,KAAK9xF,GAAEwxF,IAAIxxF,GAAEyxF,IAAIzxF,GAAE0xF,GAAG,CAAC,SAASK,GAAGvkG,GAAGmkG,GAAGD,GAAG17F,SAAS,IAAIvI,EAAEkkG,GAAGH,GAAGx7F,SAAaP,EAAEw7E,GAAGxjF,EAAED,EAAE+B,MAAM9B,IAAIgI,IAAI2V,GAAEqmF,GAAGjkG,GAAG4d,GAAEomF,GAAG/7F,GAAG,CAAC,SAASu8F,GAAGxkG,GAAGikG,GAAGz7F,UAAUxI,IAAIwS,GAAEwxF,IAAIxxF,GAAEyxF,IAAI,CAAC,IAAI1tF,GAAE0mF,GAAG,GACxZ,SAASwH,GAAGzkG,GAAG,IAAI,IAAIC,EAAED,EAAE,OAAOC,GAAG,CAAC,GAAG,KAAKA,EAAEshF,IAAI,CAAC,IAAIt5E,EAAEhI,EAAEkqF,cAAc,GAAG,OAAOliF,IAAmB,QAAfA,EAAEA,EAAEmiF,aAAqB,OAAOniF,EAAEiC,MAAM,OAAOjC,EAAEiC,MAAM,OAAOjK,CAAC,MAAM,GAAG,KAAKA,EAAEshF,UAAK,IAASthF,EAAEigG,cAAcwE,aAAa,GAAG,KAAa,IAARzkG,EAAES,OAAW,OAAOT,OAAO,GAAG,OAAOA,EAAEsqF,MAAM,CAACtqF,EAAEsqF,MAAMN,OAAOhqF,EAAEA,EAAEA,EAAEsqF,MAAM,QAAQ,CAAC,GAAGtqF,IAAID,EAAE,MAAM,KAAK,OAAOC,EAAEuqF,SAAS,CAAC,GAAG,OAAOvqF,EAAEgqF,QAAQhqF,EAAEgqF,SAASjqF,EAAE,OAAO,KAAKC,EAAEA,EAAEgqF,MAAM,CAAChqF,EAAEuqF,QAAQP,OAAOhqF,EAAEgqF,OAAOhqF,EAAEA,EAAEuqF,OAAO,CAAC,OAAO,IAAI,CAAC,IAAIma,GAAG,GACrc,SAASC,KAAK,IAAI,IAAI5kG,EAAE,EAAEA,EAAE2kG,GAAGxkG,OAAOH,IAAI2kG,GAAG3kG,GAAG6kG,8BAA8B,KAAKF,GAAGxkG,OAAO,CAAC,CAAC,IAAI2kG,GAAGvrC,EAAGwrC,uBAAuBC,GAAGzrC,EAAGm2B,wBAAwBuV,GAAG,EAAE9oF,GAAE,KAAKa,GAAE,KAAKD,GAAE,KAAKmoF,IAAG,EAAGC,IAAG,EAAGC,GAAG,EAAEC,GAAG,EAAE,SAASjqF,KAAI,MAAM9J,MAAM1J,EAAE,KAAM,CAAC,SAAS09F,GAAGtlG,EAAEC,GAAG,GAAG,OAAOA,EAAE,OAAM,EAAG,IAAI,IAAIgI,EAAE,EAAEA,EAAEhI,EAAEE,QAAQ8H,EAAEjI,EAAEG,OAAO8H,IAAI,IAAIghB,GAAGjpB,EAAEiI,GAAGhI,EAAEgI,IAAI,OAAM,EAAG,OAAM,CAAE,CAChW,SAASs9F,GAAGvlG,EAAEC,EAAEgI,EAAEE,EAAErE,EAAEqD,GAAyH,GAAtH89F,GAAG99F,EAAEgV,GAAElc,EAAEA,EAAEkqF,cAAc,KAAKlqF,EAAE4iG,YAAY,KAAK5iG,EAAEiiG,MAAM,EAAE4C,GAAGt8F,QAAQ,OAAOxI,GAAG,OAAOA,EAAEmqF,cAAcqb,GAAGC,GAAGzlG,EAAEiI,EAAEE,EAAErE,GAAMqhG,GAAG,CAACh+F,EAAE,EAAE,EAAE,CAAY,GAAXg+F,IAAG,EAAGC,GAAG,EAAK,IAAIj+F,EAAE,MAAMmK,MAAM1J,EAAE,MAAMT,GAAG,EAAE4V,GAAEC,GAAE,KAAK/c,EAAE4iG,YAAY,KAAKiC,GAAGt8F,QAAQk9F,GAAG1lG,EAAEiI,EAAEE,EAAErE,EAAE,OAAOqhG,GAAG,CAA+D,GAA9DL,GAAGt8F,QAAQm9F,GAAG1lG,EAAE,OAAO+c,IAAG,OAAOA,GAAEmkF,KAAK8D,GAAG,EAAEloF,GAAEC,GAAEb,GAAE,KAAK+oF,IAAG,EAAMjlG,EAAE,MAAMqR,MAAM1J,EAAE,MAAM,OAAO5H,CAAC,CAAC,SAAS4lG,KAAK,IAAI5lG,EAAE,IAAIolG,GAAQ,OAALA,GAAG,EAASplG,CAAC,CAC/Y,SAAS6lG,KAAK,IAAI7lG,EAAE,CAACmqF,cAAc,KAAK2Y,UAAU,KAAKgD,UAAU,KAAKC,MAAM,KAAK5E,KAAK,MAA8C,OAAxC,OAAOpkF,GAAEZ,GAAEguE,cAAcptE,GAAE/c,EAAE+c,GAAEA,GAAEokF,KAAKnhG,EAAS+c,EAAC,CAAC,SAASipF,KAAK,GAAG,OAAOhpF,GAAE,CAAC,IAAIhd,EAAEmc,GAAE6tE,UAAUhqF,EAAE,OAAOA,EAAEA,EAAEmqF,cAAc,IAAI,MAAMnqF,EAAEgd,GAAEmkF,KAAK,IAAIlhG,EAAE,OAAO8c,GAAEZ,GAAEguE,cAAcptE,GAAEokF,KAAK,GAAG,OAAOlhG,EAAE8c,GAAE9c,EAAE+c,GAAEhd,MAAM,CAAC,GAAG,OAAOA,EAAE,MAAMsR,MAAM1J,EAAE,MAAU5H,EAAE,CAACmqF,eAAPntE,GAAEhd,GAAqBmqF,cAAc2Y,UAAU9lF,GAAE8lF,UAAUgD,UAAU9oF,GAAE8oF,UAAUC,MAAM/oF,GAAE+oF,MAAM5E,KAAK,MAAM,OAAOpkF,GAAEZ,GAAEguE,cAAcptE,GAAE/c,EAAE+c,GAAEA,GAAEokF,KAAKnhG,CAAC,CAAC,OAAO+c,EAAC,CACje,SAASkpF,GAAGjmG,EAAEC,GAAG,MAAM,oBAAoBA,EAAEA,EAAED,GAAGC,CAAC,CACnD,SAASimG,GAAGlmG,GAAG,IAAIC,EAAE+lG,KAAK/9F,EAAEhI,EAAE8lG,MAAM,GAAG,OAAO99F,EAAE,MAAMqJ,MAAM1J,EAAE,MAAMK,EAAEk+F,oBAAoBnmG,EAAE,IAAImI,EAAE6U,GAAElZ,EAAEqE,EAAE29F,UAAU3+F,EAAEc,EAAEi7F,QAAQ,GAAG,OAAO/7F,EAAE,CAAC,GAAG,OAAOrD,EAAE,CAAC,IAAIoE,EAAEpE,EAAEq9F,KAAKr9F,EAAEq9F,KAAKh6F,EAAEg6F,KAAKh6F,EAAEg6F,KAAKj5F,CAAC,CAACC,EAAE29F,UAAUhiG,EAAEqD,EAAEc,EAAEi7F,QAAQ,IAAI,CAAC,GAAG,OAAOp/F,EAAE,CAACqD,EAAErD,EAAEq9F,KAAKh5F,EAAEA,EAAE26F,UAAU,IAAI16F,EAAEF,EAAE,KAAKd,EAAE,KAAKG,EAAEJ,EAAE,EAAE,CAAC,IAAIK,EAAED,EAAEg8F,KAAK,IAAI0B,GAAGz9F,KAAKA,EAAE,OAAOJ,IAAIA,EAAEA,EAAE+5F,KAAK,CAACoC,KAAK,EAAEthE,OAAO16B,EAAE06B,OAAOmkE,cAAc7+F,EAAE6+F,cAAcC,WAAW9+F,EAAE8+F,WAAWlF,KAAK,OAAOh5F,EAAEZ,EAAE6+F,cAAc7+F,EAAE8+F,WAAWrmG,EAAEmI,EAAEZ,EAAE06B,YAAY,CAAC,IAAIj6B,EAAE,CAACu7F,KAAK/7F,EAAEy6B,OAAO16B,EAAE06B,OAAOmkE,cAAc7+F,EAAE6+F,cACngBC,WAAW9+F,EAAE8+F,WAAWlF,KAAK,MAAM,OAAO/5F,GAAGgB,EAAEhB,EAAEY,EAAEE,EAAEC,GAAGf,EAAEA,EAAE+5F,KAAKn5F,EAAEmU,GAAE+lF,OAAO16F,EAAEq8F,IAAIr8F,CAAC,CAACD,EAAEA,EAAE45F,IAAI,OAAO,OAAO55F,GAAGA,IAAIJ,GAAG,OAAOC,EAAEc,EAAEC,EAAEf,EAAE+5F,KAAK/4F,EAAE6gB,GAAG9gB,EAAElI,EAAEkqF,iBAAiBgY,IAAG,GAAIliG,EAAEkqF,cAAchiF,EAAElI,EAAE6iG,UAAU56F,EAAEjI,EAAE6lG,UAAU1+F,EAAEa,EAAEq+F,kBAAkBn+F,CAAC,CAAiB,GAAG,QAAnBnI,EAAEiI,EAAEw6F,aAAwB,CAAC3+F,EAAE9D,EAAE,GAAGmH,EAAErD,EAAEy/F,KAAKpnF,GAAE+lF,OAAO/6F,EAAE08F,IAAI18F,EAAErD,EAAEA,EAAEq9F,WAAWr9F,IAAI9D,EAAE,MAAM,OAAO8D,IAAImE,EAAEi6F,MAAM,GAAG,MAAM,CAACjiG,EAAEkqF,cAAcliF,EAAEs+F,SAAS,CAC9X,SAASC,GAAGxmG,GAAG,IAAIC,EAAE+lG,KAAK/9F,EAAEhI,EAAE8lG,MAAM,GAAG,OAAO99F,EAAE,MAAMqJ,MAAM1J,EAAE,MAAMK,EAAEk+F,oBAAoBnmG,EAAE,IAAImI,EAAEF,EAAEs+F,SAASziG,EAAEmE,EAAEi7F,QAAQ/7F,EAAElH,EAAEkqF,cAAc,GAAG,OAAOrmF,EAAE,CAACmE,EAAEi7F,QAAQ,KAAK,IAAIh7F,EAAEpE,EAAEA,EAAEq9F,KAAK,GAAGh6F,EAAEnH,EAAEmH,EAAEe,EAAE+5B,QAAQ/5B,EAAEA,EAAEi5F,WAAWj5F,IAAIpE,GAAGmlB,GAAG9hB,EAAElH,EAAEkqF,iBAAiBgY,IAAG,GAAIliG,EAAEkqF,cAAchjF,EAAE,OAAOlH,EAAE6lG,YAAY7lG,EAAE6iG,UAAU37F,GAAGc,EAAEq+F,kBAAkBn/F,CAAC,CAAC,MAAM,CAACA,EAAEgB,EAAE,CAAC,SAASs+F,KAAK,CACpW,SAASC,GAAG1mG,EAAEC,GAAG,IAAIgI,EAAEkU,GAAEhU,EAAE69F,KAAKliG,EAAE7D,IAAIkH,GAAG8hB,GAAG9gB,EAAEgiF,cAAcrmF,GAAsE,GAAnEqD,IAAIgB,EAAEgiF,cAAcrmF,EAAEq+F,IAAG,GAAIh6F,EAAEA,EAAE49F,MAAMY,GAAGv3D,GAAGprC,KAAK,KAAKiE,EAAEE,EAAEnI,GAAG,CAACA,IAAOmI,EAAEiH,cAAcnP,GAAGkH,GAAG,OAAO4V,IAAuB,EAApBA,GAAEotE,cAAc5I,IAAM,CAAuD,GAAtDt5E,EAAEvH,OAAO,KAAKizC,GAAG,EAAE7D,GAAG9rC,KAAK,KAAKiE,EAAEE,EAAErE,EAAE7D,QAAG,EAAO,MAAS,OAAOokB,GAAE,MAAM/S,MAAM1J,EAAE,MAAM,KAAQ,GAAHq9F,KAAQx1D,GAAGxnC,EAAEhI,EAAE6D,EAAE,CAAC,OAAOA,CAAC,CAAC,SAAS2rC,GAAGzvC,EAAEC,EAAEgI,GAAGjI,EAAEU,OAAO,MAAMV,EAAE,CAACoP,YAAYnP,EAAE2L,MAAM3D,GAAmB,QAAhBhI,EAAEkc,GAAE0mF,cAAsB5iG,EAAE,CAAC2mG,WAAW,KAAKC,OAAO,MAAM1qF,GAAE0mF,YAAY5iG,EAAEA,EAAE4mG,OAAO,CAAC7mG,IAAgB,QAAXiI,EAAEhI,EAAE4mG,QAAgB5mG,EAAE4mG,OAAO,CAAC7mG,GAAGiI,EAAE4c,KAAK7kB,EAAG,CAClf,SAAS8vC,GAAG9vC,EAAEC,EAAEgI,EAAEE,GAAGlI,EAAE2L,MAAM3D,EAAEhI,EAAEmP,YAAYjH,EAAE0lC,GAAG5tC,IAAI4vC,GAAG7vC,EAAE,CAAC,SAASovC,GAAGpvC,EAAEC,EAAEgI,GAAG,OAAOA,GAAE,WAAW4lC,GAAG5tC,IAAI4vC,GAAG7vC,EAAE,GAAE,CAAC,SAAS6tC,GAAG7tC,GAAG,IAAIC,EAAED,EAAEoP,YAAYpP,EAAEA,EAAE4L,MAAM,IAAI,IAAI3D,EAAEhI,IAAI,OAAOgpB,GAAGjpB,EAAEiI,EAAE,CAAC,MAAME,GAAG,OAAM,CAAE,CAAC,CAAC,SAAS0nC,GAAG7vC,GAAG,IAAIC,EAAEyiG,GAAG1iG,EAAE,GAAG,OAAOC,GAAG0vC,GAAG1vC,EAAED,EAAE,GAAG,EAAE,CAClQ,SAASwvC,GAAGxvC,GAAG,IAAIC,EAAE4lG,KAA8M,MAAzM,oBAAoB7lG,IAAIA,EAAEA,KAAKC,EAAEkqF,cAAclqF,EAAE6iG,UAAU9iG,EAAEA,EAAE,CAACkjG,QAAQ,KAAKT,YAAY,KAAKP,MAAM,EAAEqE,SAAS,KAAKJ,oBAAoBF,GAAGK,kBAAkBtmG,GAAGC,EAAE8lG,MAAM/lG,EAAEA,EAAEA,EAAEumG,SAAS93D,GAAGzqC,KAAK,KAAKmY,GAAEnc,GAAS,CAACC,EAAEkqF,cAAcnqF,EAAE,CAC5P,SAAS2zC,GAAG3zC,EAAEC,EAAEgI,EAAEE,GAA8O,OAA3OnI,EAAE,CAACuhF,IAAIvhF,EAAE0E,OAAOzE,EAAE42B,QAAQ5uB,EAAE6+F,KAAK3+F,EAAEg5F,KAAK,MAAsB,QAAhBlhG,EAAEkc,GAAE0mF,cAAsB5iG,EAAE,CAAC2mG,WAAW,KAAKC,OAAO,MAAM1qF,GAAE0mF,YAAY5iG,EAAEA,EAAE2mG,WAAW5mG,EAAEmhG,KAAKnhG,GAAmB,QAAfiI,EAAEhI,EAAE2mG,YAAoB3mG,EAAE2mG,WAAW5mG,EAAEmhG,KAAKnhG,GAAGmI,EAAEF,EAAEk5F,KAAKl5F,EAAEk5F,KAAKnhG,EAAEA,EAAEmhG,KAAKh5F,EAAElI,EAAE2mG,WAAW5mG,GAAWA,CAAC,CAAC,SAASq9C,KAAK,OAAO2oD,KAAK7b,aAAa,CAAC,SAASz2C,GAAG1zC,EAAEC,EAAEgI,EAAEE,GAAG,IAAIrE,EAAE+hG,KAAK1pF,GAAEzb,OAAOV,EAAE8D,EAAEqmF,cAAcx2C,GAAG,EAAE1zC,EAAEgI,OAAE,OAAO,IAASE,EAAE,KAAKA,EAAE,CAC9Y,SAAS0xC,GAAG75C,EAAEC,EAAEgI,EAAEE,GAAG,IAAIrE,EAAEkiG,KAAK79F,OAAE,IAASA,EAAE,KAAKA,EAAE,IAAIhB,OAAE,EAAO,GAAG,OAAO6V,GAAE,CAAC,IAAI9U,EAAE8U,GAAEmtE,cAA0B,GAAZhjF,EAAEe,EAAE2uB,QAAW,OAAO1uB,GAAGm9F,GAAGn9F,EAAED,EAAE4+F,MAAmC,YAA5BhjG,EAAEqmF,cAAcx2C,GAAG1zC,EAAEgI,EAAEd,EAAEgB,GAAU,CAACgU,GAAEzb,OAAOV,EAAE8D,EAAEqmF,cAAcx2C,GAAG,EAAE1zC,EAAEgI,EAAEd,EAAEgB,EAAE,CAAC,SAAS2oC,GAAG9wC,EAAEC,GAAG,OAAOyzC,GAAG,QAAQ,EAAE1zC,EAAEC,EAAE,CAAC,SAAS0mG,GAAG3mG,EAAEC,GAAG,OAAO45C,GAAG,KAAK,EAAE75C,EAAEC,EAAE,CAAC,SAAS+uC,GAAGhvC,EAAEC,GAAG,OAAO45C,GAAG,EAAE,EAAE75C,EAAEC,EAAE,CAAC,SAASqvC,GAAGtvC,EAAEC,GAAG,OAAO45C,GAAG,EAAE,EAAE75C,EAAEC,EAAE,CAChX,SAASgxC,GAAGjxC,EAAEC,GAAG,MAAG,oBAAoBA,GAASD,EAAEA,IAAIC,EAAED,GAAG,WAAWC,EAAE,KAAK,GAAK,OAAOA,QAAG,IAASA,GAASD,EAAEA,IAAIC,EAAEuI,QAAQxI,EAAE,WAAWC,EAAEuI,QAAQ,IAAI,QAA1E,CAA2E,CAAC,SAAS80C,GAAGt9C,EAAEC,EAAEgI,GAA6C,OAA1CA,EAAE,OAAOA,QAAG,IAASA,EAAEA,EAAEvE,OAAO,CAAC1D,IAAI,KAAY65C,GAAG,EAAE,EAAE5I,GAAGjtC,KAAK,KAAK/D,EAAED,GAAGiI,EAAE,CAAC,SAASumC,KAAK,CAAC,SAASa,GAAGrvC,EAAEC,GAAG,IAAIgI,EAAE+9F,KAAK/lG,OAAE,IAASA,EAAE,KAAKA,EAAE,IAAIkI,EAAEF,EAAEkiF,cAAc,OAAG,OAAOhiF,GAAG,OAAOlI,GAAGqlG,GAAGrlG,EAAEkI,EAAE,IAAWA,EAAE,IAAGF,EAAEkiF,cAAc,CAACnqF,EAAEC,GAAUD,EAAC,CAC7Z,SAAS2tC,GAAG3tC,EAAEC,GAAG,IAAIgI,EAAE+9F,KAAK/lG,OAAE,IAASA,EAAE,KAAKA,EAAE,IAAIkI,EAAEF,EAAEkiF,cAAc,OAAG,OAAOhiF,GAAG,OAAOlI,GAAGqlG,GAAGrlG,EAAEkI,EAAE,IAAWA,EAAE,IAAGnI,EAAEA,IAAIiI,EAAEkiF,cAAc,CAACnqF,EAAEC,GAAUD,EAAC,CAAC,SAASuvC,GAAGvvC,EAAEC,EAAEgI,GAAG,OAAG,KAAQ,GAAHg9F,KAAcjlG,EAAE8iG,YAAY9iG,EAAE8iG,WAAU,EAAGX,IAAG,GAAIniG,EAAEmqF,cAAcliF,IAAEghB,GAAGhhB,EAAEhI,KAAKgI,EAAEglF,KAAK9wE,GAAE+lF,OAAOj6F,EAAE47F,IAAI57F,EAAEjI,EAAE8iG,WAAU,GAAW7iG,EAAC,CAAC,SAASywC,GAAG1wC,EAAEC,GAAG,IAAIgI,EAAEgS,GAAEA,GAAE,IAAIhS,GAAG,EAAEA,EAAEA,EAAE,EAAEjI,GAAE,GAAI,IAAImI,EAAE68F,GAAGnV,WAAWmV,GAAGnV,WAAW,CAAC,EAAE,IAAI7vF,GAAE,GAAIC,GAAG,CAAC,QAAQga,GAAEhS,EAAE+8F,GAAGnV,WAAW1nF,CAAC,CAAC,CAAC,SAAS2rC,KAAK,OAAOkyD,KAAK7b,aAAa,CAC1d,SAASl2C,GAAGj0C,EAAEC,EAAEgI,GAAG,IAAIE,EAAE6pC,GAAGhyC,GAAkE,GAA/DiI,EAAE,CAACs7F,KAAKp7F,EAAE85B,OAAOh6B,EAAEm+F,eAAc,EAAGC,WAAW,KAAKlF,KAAK,MAAS3jD,GAAGx9C,GAAGwzC,GAAGvzC,EAAEgI,QAAQ,GAAiB,QAAdA,EAAEu6F,GAAGxiG,EAAEC,EAAEgI,EAAEE,IAAY,CAAWwnC,GAAG1nC,EAAEjI,EAAEmI,EAAXqR,MAAgB8iC,GAAGr0C,EAAEhI,EAAEkI,EAAE,CAAC,CAC/K,SAASsmC,GAAGzuC,EAAEC,EAAEgI,GAAG,IAAIE,EAAE6pC,GAAGhyC,GAAG8D,EAAE,CAACy/F,KAAKp7F,EAAE85B,OAAOh6B,EAAEm+F,eAAc,EAAGC,WAAW,KAAKlF,KAAK,MAAM,GAAG3jD,GAAGx9C,GAAGwzC,GAAGvzC,EAAE6D,OAAO,CAAC,IAAIqD,EAAEnH,EAAEgqF,UAAU,GAAG,IAAIhqF,EAAEkiG,QAAQ,OAAO/6F,GAAG,IAAIA,EAAE+6F,QAAiC,QAAxB/6F,EAAElH,EAAEkmG,qBAA8B,IAAI,IAAIj+F,EAAEjI,EAAEqmG,kBAAkBl+F,EAAEjB,EAAEe,EAAED,GAAqC,GAAlCnE,EAAEsiG,eAAc,EAAGtiG,EAAEuiG,WAAWj+F,EAAK6gB,GAAG7gB,EAAEF,GAAG,CAAC,IAAId,EAAEnH,EAAEwiG,YAA+E,OAAnE,OAAOr7F,GAAGtD,EAAEq9F,KAAKr9F,EAAEy+F,GAAGtiG,KAAK6D,EAAEq9F,KAAK/5F,EAAE+5F,KAAK/5F,EAAE+5F,KAAKr9F,QAAG7D,EAAEwiG,YAAY3+F,EAAQ,CAAC,CAAC,MAAMyD,GAAG,CAAwB,QAAdU,EAAEu6F,GAAGxiG,EAAEC,EAAE6D,EAAEqE,MAAoBwnC,GAAG1nC,EAAEjI,EAAEmI,EAAbrE,EAAE0V,MAAgB8iC,GAAGr0C,EAAEhI,EAAEkI,GAAG,CAAC,CAC/c,SAASq1C,GAAGx9C,GAAG,IAAIC,EAAED,EAAEgqF,UAAU,OAAOhqF,IAAImc,IAAG,OAAOlc,GAAGA,IAAIkc,EAAC,CAAC,SAASq3B,GAAGxzC,EAAEC,GAAGklG,GAAGD,IAAG,EAAG,IAAIj9F,EAAEjI,EAAEkjG,QAAQ,OAAOj7F,EAAEhI,EAAEkhG,KAAKlhG,GAAGA,EAAEkhG,KAAKl5F,EAAEk5F,KAAKl5F,EAAEk5F,KAAKlhG,GAAGD,EAAEkjG,QAAQjjG,CAAC,CAAC,SAASq8C,GAAGt8C,EAAEC,EAAEgI,GAAG,GAAG,KAAO,QAAFA,GAAW,CAAC,IAAIE,EAAElI,EAAEiiG,MAAwBj6F,GAAlBE,GAAGnI,EAAE0sF,aAAkBzsF,EAAEiiG,MAAMj6F,EAAEolF,GAAGrtF,EAAEiI,EAAE,CAAC,CAC9P,IAAI09F,GAAG,CAACoB,YAAY3E,GAAG4E,YAAY5rF,GAAE6rF,WAAW7rF,GAAEtM,UAAUsM,GAAE8rF,oBAAoB9rF,GAAE+rF,mBAAmB/rF,GAAErM,gBAAgBqM,GAAEgsF,QAAQhsF,GAAEisF,WAAWjsF,GAAEksF,OAAOlsF,GAAEvM,SAASuM,GAAEpM,cAAcoM,GAAEmsF,iBAAiBnsF,GAAEosF,cAAcpsF,GAAEqsF,iBAAiBrsF,GAAE1L,qBAAqB0L,GAAEssF,MAAMtsF,GAAEusF,0BAAyB,GAAInC,GAAG,CAACuB,YAAY3E,GAAG4E,YAAY,SAAShnG,EAAEC,GAA4C,OAAzC4lG,KAAK1b,cAAc,CAACnqF,OAAE,IAASC,EAAE,KAAKA,GAAUD,CAAC,EAAEinG,WAAW7E,GAAGtzF,UAAUgiC,GAAGo2D,oBAAoB,SAASlnG,EAAEC,EAAEgI,GAA6C,OAA1CA,EAAE,OAAOA,QAAG,IAASA,EAAEA,EAAEvE,OAAO,CAAC1D,IAAI,KAAY0zC,GAAG,QAC3f,EAAEzC,GAAGjtC,KAAK,KAAK/D,EAAED,GAAGiI,EAAE,EAAE8G,gBAAgB,SAAS/O,EAAEC,GAAG,OAAOyzC,GAAG,QAAQ,EAAE1zC,EAAEC,EAAE,EAAEknG,mBAAmB,SAASnnG,EAAEC,GAAG,OAAOyzC,GAAG,EAAE,EAAE1zC,EAAEC,EAAE,EAAEmnG,QAAQ,SAASpnG,EAAEC,GAAG,IAAIgI,EAAE49F,KAAqD,OAAhD5lG,OAAE,IAASA,EAAE,KAAKA,EAAED,EAAEA,IAAIiI,EAAEkiF,cAAc,CAACnqF,EAAEC,GAAUD,CAAC,EAAEqnG,WAAW,SAASrnG,EAAEC,EAAEgI,GAAG,IAAIE,EAAE09F,KAAkM,OAA7L5lG,OAAE,IAASgI,EAAEA,EAAEhI,GAAGA,EAAEkI,EAAEgiF,cAAchiF,EAAE26F,UAAU7iG,EAAED,EAAE,CAACkjG,QAAQ,KAAKT,YAAY,KAAKP,MAAM,EAAEqE,SAAS,KAAKJ,oBAAoBnmG,EAAEsmG,kBAAkBrmG,GAAGkI,EAAE49F,MAAM/lG,EAAEA,EAAEA,EAAEumG,SAAStyD,GAAGjwC,KAAK,KAAKmY,GAAEnc,GAAS,CAACmI,EAAEgiF,cAAcnqF,EAAE,EAAEsnG,OAAO,SAAStnG,GAC3d,OAAdA,EAAE,CAACwI,QAAQxI,GAAhB6lG,KAA4B1b,cAAcnqF,CAAC,EAAE6O,SAAS2gC,GAAGxgC,cAAcw/B,GAAG+4D,iBAAiB,SAASvnG,GAAG,OAAO6lG,KAAK1b,cAAcnqF,CAAC,EAAEwnG,cAAc,WAAW,IAAIxnG,EAAEwvC,IAAG,GAAIvvC,EAAED,EAAE,GAA6C,OAA1CA,EAAE0wC,GAAG1sC,KAAK,KAAKhE,EAAE,IAAI6lG,KAAK1b,cAAcnqF,EAAQ,CAACC,EAAED,EAAE,EAAEynG,iBAAiB,WAAW,EAAE/3F,qBAAqB,SAAS1P,EAAEC,EAAEgI,GAAG,IAAIE,EAAEgU,GAAErY,EAAE+hG,KAAK,GAAGhsF,GAAE,CAAC,QAAG,IAAS5R,EAAE,MAAMqJ,MAAM1J,EAAE,MAAMK,EAAEA,GAAG,KAAK,CAAO,GAANA,EAAEhI,IAAO,OAAOokB,GAAE,MAAM/S,MAAM1J,EAAE,MAAM,KAAQ,GAAHq9F,KAAQx1D,GAAGtnC,EAAElI,EAAEgI,EAAE,CAACnE,EAAEqmF,cAAcliF,EAAE,IAAId,EAAE,CAACyE,MAAM3D,EAAEmH,YAAYnP,GACvZ,OAD0Z6D,EAAEiiG,MAAM5+F,EAAE2pC,GAAG1B,GAAGprC,KAAK,KAAKmE,EACpfhB,EAAEnH,GAAG,CAACA,IAAImI,EAAEzH,OAAO,KAAKizC,GAAG,EAAE7D,GAAG9rC,KAAK,KAAKmE,EAAEhB,EAAEc,EAAEhI,QAAG,EAAO,MAAagI,CAAC,EAAEy/F,MAAM,WAAW,IAAI1nG,EAAE6lG,KAAK5lG,EAAEokB,GAAEujF,iBAAiB,GAAG/tF,GAAE,CAAC,IAAI5R,EAAE42F,GAAkD5+F,EAAE,IAAIA,EAAE,KAA9CgI,GAAH22F,KAAU,GAAG,GAAG3S,GAAhB2S,IAAsB,IAAI99F,SAAS,IAAImH,GAAuB,GAAPA,EAAEm9F,QAAWnlG,GAAG,IAAIgI,EAAEnH,SAAS,KAAKb,GAAG,GAAG,MAAaA,EAAE,IAAIA,EAAE,KAAfgI,EAAEo9F,MAAmBvkG,SAAS,IAAI,IAAI,OAAOd,EAAEmqF,cAAclqF,CAAC,EAAE0nG,0BAAyB,GAAIlC,GAAG,CAACsB,YAAY3E,GAAG4E,YAAY33D,GAAG43D,WAAW7E,GAAGtzF,UAAU63F,GAAGO,oBAAoB5pD,GAAG6pD,mBAAmBn4D,GAAGjgC,gBAAgBugC,GAAG83D,QAAQz5D,GAAG05D,WAAWnB,GAAGoB,OAAOjqD,GAAGxuC,SAAS,WAAW,OAAOq3F,GAAGD,GAAG,EACrhBj3F,cAAcw/B,GAAG+4D,iBAAiB,SAASvnG,GAAc,OAAOuvC,GAAZy2D,KAAiBhpF,GAAEmtE,cAAcnqF,EAAE,EAAEwnG,cAAc,WAAgD,MAAM,CAArCtB,GAAGD,IAAI,GAAKD,KAAK7b,cAAyB,EAAEsd,iBAAiBhB,GAAG/2F,qBAAqBg3F,GAAGgB,MAAM5zD,GAAG6zD,0BAAyB,GAAIjC,GAAG,CAACqB,YAAY3E,GAAG4E,YAAY33D,GAAG43D,WAAW7E,GAAGtzF,UAAU63F,GAAGO,oBAAoB5pD,GAAG6pD,mBAAmBn4D,GAAGjgC,gBAAgBugC,GAAG83D,QAAQz5D,GAAG05D,WAAWb,GAAGc,OAAOjqD,GAAGxuC,SAAS,WAAW,OAAO23F,GAAGP,GAAG,EAAEj3F,cAAcw/B,GAAG+4D,iBAAiB,SAASvnG,GAAG,IAAIC,EAAE+lG,KAAK,OAAO,OACzfhpF,GAAE/c,EAAEkqF,cAAcnqF,EAAEuvC,GAAGtvC,EAAE+c,GAAEmtE,cAAcnqF,EAAE,EAAEwnG,cAAc,WAAgD,MAAM,CAArChB,GAAGP,IAAI,GAAKD,KAAK7b,cAAyB,EAAEsd,iBAAiBhB,GAAG/2F,qBAAqBg3F,GAAGgB,MAAM5zD,GAAG6zD,0BAAyB,GAAI,SAAS5zD,GAAG/zC,EAAEC,GAAG,GAAGD,GAAGA,EAAEwB,aAAa,CAA4B,IAAI,IAAIyG,KAAnChI,EAAE4W,EAAE,CAAC,EAAE5W,GAAGD,EAAEA,EAAEwB,kBAA4B,IAASvB,EAAEgI,KAAKhI,EAAEgI,GAAGjI,EAAEiI,IAAI,OAAOhI,CAAC,CAAC,OAAOA,CAAC,CAAC,SAAS2zC,GAAG5zC,EAAEC,EAAEgI,EAAEE,GAA8BF,EAAE,QAAXA,EAAEA,EAAEE,EAAtBlI,EAAED,EAAEmqF,sBAAmC,IAASliF,EAAEhI,EAAE4W,EAAE,CAAC,EAAE5W,EAAEgI,GAAGjI,EAAEmqF,cAAcliF,EAAE,IAAIjI,EAAEkiG,QAAQliG,EAAE6iG,YAAYC,UAAU76F,EAAE,CACrd,IAAIyvC,GAAG,CAACmwD,UAAU,SAAS7nG,GAAG,SAAOA,EAAEA,EAAE8nG,kBAAiB/d,GAAG/pF,KAAKA,CAAI,EAAE+nG,gBAAgB,SAAS/nG,EAAEC,EAAEgI,GAAGjI,EAAEA,EAAE8nG,gBAAgB,IAAI3/F,EAAEqR,KAAI1V,EAAEkuC,GAAGhyC,GAAGmH,EAAEk8F,GAAGl7F,EAAErE,GAAGqD,EAAEgpC,QAAQlwC,OAAE,IAASgI,GAAG,OAAOA,IAAId,EAAEq8F,SAASv7F,GAAe,QAAZhI,EAAEwjG,GAAGzjG,EAAEmH,EAAErD,MAAc6rC,GAAG1vC,EAAED,EAAE8D,EAAEqE,GAAGu7F,GAAGzjG,EAAED,EAAE8D,GAAG,EAAEkkG,oBAAoB,SAAShoG,EAAEC,EAAEgI,GAAGjI,EAAEA,EAAE8nG,gBAAgB,IAAI3/F,EAAEqR,KAAI1V,EAAEkuC,GAAGhyC,GAAGmH,EAAEk8F,GAAGl7F,EAAErE,GAAGqD,EAAEo6E,IAAI,EAAEp6E,EAAEgpC,QAAQlwC,OAAE,IAASgI,GAAG,OAAOA,IAAId,EAAEq8F,SAASv7F,GAAe,QAAZhI,EAAEwjG,GAAGzjG,EAAEmH,EAAErD,MAAc6rC,GAAG1vC,EAAED,EAAE8D,EAAEqE,GAAGu7F,GAAGzjG,EAAED,EAAE8D,GAAG,EAAEmkG,mBAAmB,SAASjoG,EAAEC,GAAGD,EAAEA,EAAE8nG,gBAAgB,IAAI7/F,EAAEuR,KAAIrR,EACnf6pC,GAAGhyC,GAAG8D,EAAEu/F,GAAGp7F,EAAEE,GAAGrE,EAAEy9E,IAAI,OAAE,IAASthF,GAAG,OAAOA,IAAI6D,EAAE0/F,SAASvjG,GAAe,QAAZA,EAAEwjG,GAAGzjG,EAAE8D,EAAEqE,MAAcwnC,GAAG1vC,EAAED,EAAEmI,EAAEF,GAAGy7F,GAAGzjG,EAAED,EAAEmI,GAAG,GAAG,SAASyyC,GAAG56C,EAAEC,EAAEgI,EAAEE,EAAErE,EAAEqD,EAAEe,GAAiB,MAAM,oBAApBlI,EAAEA,EAAE6oF,WAAsCqf,sBAAsBloG,EAAEkoG,sBAAsB//F,EAAEhB,EAAEe,IAAGjI,EAAEY,YAAWZ,EAAEY,UAAUsnG,wBAAsB3gF,GAAGvf,EAAEE,KAAKqf,GAAG1jB,EAAEqD,GAAK,CAC1S,SAASo1C,GAAGv8C,EAAEC,EAAEgI,GAAG,IAAIE,GAAE,EAAGrE,EAAEo5F,GAAO/1F,EAAElH,EAAEqB,YAA2W,MAA/V,kBAAkB6F,GAAG,OAAOA,EAAEA,EAAEi7F,GAAGj7F,IAAIrD,EAAE05F,GAAGv9F,GAAGm9F,GAAG78E,GAAE/X,QAAyBrB,GAAGgB,EAAE,QAAtBA,EAAElI,EAAEsB,oBAA4B,IAAS4G,GAAGk1F,GAAGr9F,EAAE8D,GAAGo5F,IAAIj9F,EAAE,IAAIA,EAAEgI,EAAEd,GAAGnH,EAAEmqF,cAAc,OAAOlqF,EAAEw1C,YAAO,IAASx1C,EAAEw1C,MAAMx1C,EAAEw1C,MAAM,KAAKx1C,EAAEmoG,QAAQ1wD,GAAG13C,EAAE6oF,UAAU5oF,EAAEA,EAAE6nG,gBAAgB9nG,EAAEmI,KAAInI,EAAEA,EAAE6oF,WAAYyU,4CAA4Cx5F,EAAE9D,EAAEu9F,0CAA0Cp2F,GAAUlH,CAAC,CAC5Z,SAASw8C,GAAGz8C,EAAEC,EAAEgI,EAAEE,GAAGnI,EAAEC,EAAEw1C,MAAM,oBAAoBx1C,EAAEooG,2BAA2BpoG,EAAEooG,0BAA0BpgG,EAAEE,GAAG,oBAAoBlI,EAAEqoG,kCAAkCroG,EAAEqoG,iCAAiCrgG,EAAEE,GAAGlI,EAAEw1C,QAAQz1C,GAAG03C,GAAGswD,oBAAoB/nG,EAAEA,EAAEw1C,MAAM,KAAK,CACpQ,SAAS5B,GAAG7zC,EAAEC,EAAEgI,EAAEE,GAAG,IAAIrE,EAAE9D,EAAE6oF,UAAU/kF,EAAEwE,MAAML,EAAEnE,EAAE2xC,MAAMz1C,EAAEmqF,cAAcrmF,EAAE28F,KAAK,CAAC,EAAEmC,GAAG5iG,GAAG,IAAImH,EAAElH,EAAEqB,YAAY,kBAAkB6F,GAAG,OAAOA,EAAErD,EAAEQ,QAAQ89F,GAAGj7F,IAAIA,EAAEq2F,GAAGv9F,GAAGm9F,GAAG78E,GAAE/X,QAAQ1E,EAAEQ,QAAQ+4F,GAAGr9F,EAAEmH,IAAIrD,EAAE2xC,MAAMz1C,EAAEmqF,cAA2C,oBAA7BhjF,EAAElH,EAAE2B,4BAAiDgyC,GAAG5zC,EAAEC,EAAEkH,EAAEc,GAAGnE,EAAE2xC,MAAMz1C,EAAEmqF,eAAe,oBAAoBlqF,EAAE2B,0BAA0B,oBAAoBkC,EAAEykG,yBAAyB,oBAAoBzkG,EAAE0kG,2BAA2B,oBAAoB1kG,EAAE2kG,qBAAqBxoG,EAAE6D,EAAE2xC,MACrf,oBAAoB3xC,EAAE2kG,oBAAoB3kG,EAAE2kG,qBAAqB,oBAAoB3kG,EAAE0kG,2BAA2B1kG,EAAE0kG,4BAA4BvoG,IAAI6D,EAAE2xC,OAAOiC,GAAGswD,oBAAoBlkG,EAAEA,EAAE2xC,MAAM,MAAMmuD,GAAG5jG,EAAEiI,EAAEnE,EAAEqE,GAAGrE,EAAE2xC,MAAMz1C,EAAEmqF,eAAe,oBAAoBrmF,EAAE4kG,oBAAoB1oG,EAAEU,OAAO,QAAQ,CAAC,SAASg9C,GAAG19C,EAAEC,GAAG,IAAI,IAAIgI,EAAE,GAAGE,EAAElI,EAAE,GAAGgI,GAAGo5D,EAAGl5D,GAAGA,EAAEA,EAAE8hF,aAAa9hF,GAAG,IAAIrE,EAAEmE,CAAC,CAAC,MAAMd,GAAGrD,EAAE,6BAA6BqD,EAAE6I,QAAQ,KAAK7I,EAAE84E,KAAK,CAAC,MAAM,CAACr0E,MAAM5L,EAAES,OAAOR,EAAEggF,MAAMn8E,EAAE6kG,OAAO,KAAK,CAC1d,SAASnsD,GAAGx8C,EAAEC,EAAEgI,GAAG,MAAM,CAAC2D,MAAM5L,EAAES,OAAO,KAAKw/E,MAAM,MAAMh4E,EAAEA,EAAE,KAAK0gG,OAAO,MAAM1oG,EAAEA,EAAE,KAAK,CAAC,SAASszC,GAAGvzC,EAAEC,GAAG,IAAIqQ,QAAQhB,MAAMrP,EAAE2L,MAAM,CAAC,MAAM3D,GAAGuE,YAAW,WAAW,MAAMvE,CAAE,GAAE,CAAC,CAAC,IAAI+yC,GAAG,oBAAoB4tD,QAAQA,QAAQh4B,IAAI,SAASx0B,GAAGp8C,EAAEC,EAAEgI,IAAGA,EAAEo7F,IAAI,EAAEp7F,IAAKs5E,IAAI,EAAEt5E,EAAEkoC,QAAQ,CAACmpD,QAAQ,MAAM,IAAInxF,EAAElI,EAAE2L,MAAsD,OAAhD3D,EAAEu7F,SAAS,WAAW3nD,KAAKA,IAAG,EAAGpB,GAAGtyC,GAAGorC,GAAGvzC,EAAEC,EAAE,EAASgI,CAAC,CACrW,SAASw1C,GAAGz9C,EAAEC,EAAEgI,IAAGA,EAAEo7F,IAAI,EAAEp7F,IAAKs5E,IAAI,EAAE,IAAIp5E,EAAEnI,EAAE+B,KAAKJ,yBAAyB,GAAG,oBAAoBwG,EAAE,CAAC,IAAIrE,EAAE7D,EAAE2L,MAAM3D,EAAEkoC,QAAQ,WAAW,OAAOhoC,EAAErE,EAAE,EAAEmE,EAAEu7F,SAAS,WAAWjwD,GAAGvzC,EAAEC,EAAE,CAAC,CAAC,IAAIkH,EAAEnH,EAAE6oF,UAA8O,OAApO,OAAO1hF,GAAG,oBAAoBA,EAAE0hG,oBAAoB5gG,EAAEu7F,SAAS,WAAWjwD,GAAGvzC,EAAEC,GAAG,oBAAoBkI,IAAI,OAAOsrC,GAAGA,GAAG,IAAIo9B,IAAI,CAACz2D,OAAOq5B,GAAGgtC,IAAIrmE,OAAO,IAAInS,EAAEhI,EAAEggF,MAAM7lE,KAAKyuF,kBAAkB5oG,EAAE2L,MAAM,CAACk9F,eAAe,OAAO7gG,EAAEA,EAAE,IAAI,GAAUA,CAAC,CACnb,SAASqrC,GAAGtzC,EAAEC,EAAEgI,GAAG,IAAIE,EAAEnI,EAAE+oG,UAAU,GAAG,OAAO5gG,EAAE,CAACA,EAAEnI,EAAE+oG,UAAU,IAAI/tD,GAAG,IAAIl3C,EAAE,IAAI+sE,IAAI1oE,EAAEwV,IAAI1d,EAAE6D,EAAE,WAAiB,KAAXA,EAAEqE,EAAE+S,IAAIjb,MAAgB6D,EAAE,IAAI+sE,IAAI1oE,EAAEwV,IAAI1d,EAAE6D,IAAIA,EAAEsoB,IAAInkB,KAAKnE,EAAE28E,IAAIx4E,GAAGjI,EAAEqzC,GAAGrvC,KAAK,KAAKhE,EAAEC,EAAEgI,GAAGhI,EAAE6mC,KAAK9mC,EAAEA,GAAG,CAAC,SAASq8C,GAAGr8C,GAAG,EAAE,CAAC,IAAIC,EAA4E,IAAvEA,EAAE,KAAKD,EAAEuhF,OAAsBthF,EAAE,QAApBA,EAAED,EAAEmqF,gBAAyB,OAAOlqF,EAAEmqF,YAAuBnqF,EAAE,OAAOD,EAAEA,EAAEA,EAAEiqF,MAAM,OAAO,OAAOjqF,GAAG,OAAO,IAAI,CAChW,SAAS88C,GAAG98C,EAAEC,EAAEgI,EAAEE,EAAErE,GAAG,OAAG,KAAY,EAAP9D,EAAE45B,OAAe55B,IAAIC,EAAED,EAAEU,OAAO,OAAOV,EAAEU,OAAO,IAAIuH,EAAEvH,OAAO,OAAOuH,EAAEvH,QAAQ,MAAM,IAAIuH,EAAEs5E,MAAM,OAAOt5E,EAAE+hF,UAAU/hF,EAAEs5E,IAAI,KAAIthF,EAAEojG,IAAI,EAAE,IAAK9hB,IAAI,EAAEkiB,GAAGx7F,EAAEhI,EAAE,KAAKgI,EAAEi6F,OAAO,GAAGliG,IAAEA,EAAEU,OAAO,MAAMV,EAAEkiG,MAAMp+F,EAAS9D,EAAC,CAAC,IAAIo9C,GAAGmc,EAAG5xD,kBAAkBw6F,IAAG,EAAG,SAAS5kD,GAAGv9C,EAAEC,EAAEgI,EAAEE,GAAGlI,EAAEsqF,MAAM,OAAOvqF,EAAEqhG,GAAGphG,EAAE,KAAKgI,EAAEE,GAAGi5F,GAAGnhG,EAAED,EAAEuqF,MAAMtiF,EAAEE,EAAE,CACnV,SAAS40C,GAAG/8C,EAAEC,EAAEgI,EAAEE,EAAErE,GAAGmE,EAAEA,EAAEpF,OAAO,IAAIsE,EAAElH,EAAE4H,IAAqC,OAAjCk6F,GAAG9hG,EAAE6D,GAAGqE,EAAEo9F,GAAGvlG,EAAEC,EAAEgI,EAAEE,EAAEhB,EAAErD,GAAGmE,EAAE29F,KAAQ,OAAO5lG,GAAImiG,IAA2EtoF,IAAG5R,GAAG+2F,GAAG/+F,GAAGA,EAAES,OAAO,EAAE68C,GAAGv9C,EAAEC,EAAEkI,EAAErE,GAAU7D,EAAEsqF,QAA7GtqF,EAAE4iG,YAAY7iG,EAAE6iG,YAAY5iG,EAAES,QAAQ,KAAKV,EAAEkiG,QAAQp+F,EAAEg6C,GAAG99C,EAAEC,EAAE6D,GAAoD,CACzN,SAAS+5C,GAAG79C,EAAEC,EAAEgI,EAAEE,EAAErE,GAAG,GAAG,OAAO9D,EAAE,CAAC,IAAImH,EAAEc,EAAElG,KAAK,MAAG,oBAAoBoF,GAAI6hG,GAAG7hG,SAAI,IAASA,EAAE3F,cAAc,OAAOyG,EAAE1F,cAAS,IAAS0F,EAAEzG,eAAoDxB,EAAE+gG,GAAG94F,EAAElG,KAAK,KAAKoG,EAAElI,EAAEA,EAAE25B,KAAK91B,IAAK+D,IAAI5H,EAAE4H,IAAI7H,EAAEiqF,OAAOhqF,EAASA,EAAEsqF,MAAMvqF,IAArGC,EAAEshF,IAAI,GAAGthF,EAAE8B,KAAKoF,EAAE8hG,GAAGjpG,EAAEC,EAAEkH,EAAEgB,EAAErE,GAAyE,CAAW,GAAVqD,EAAEnH,EAAEuqF,MAAS,KAAKvqF,EAAEkiG,MAAMp+F,GAAG,CAAC,IAAIoE,EAAEf,EAAE+4F,cAA0C,IAAhBj4F,EAAE,QAAdA,EAAEA,EAAE1F,SAAmB0F,EAAEuf,IAAQtf,EAAEC,IAAInI,EAAE6H,MAAM5H,EAAE4H,IAAI,OAAOi2C,GAAG99C,EAAEC,EAAE6D,EAAE,CAA6C,OAA5C7D,EAAES,OAAO,GAAEV,EAAE6gG,GAAG15F,EAAEgB,IAAKN,IAAI5H,EAAE4H,IAAI7H,EAAEiqF,OAAOhqF,EAASA,EAAEsqF,MAAMvqF,CAAC,CAC1b,SAASipG,GAAGjpG,EAAEC,EAAEgI,EAAEE,EAAErE,GAAG,GAAG,OAAO9D,EAAE,CAAC,IAAImH,EAAEnH,EAAEkgG,cAAc,GAAG14E,GAAGrgB,EAAEgB,IAAInI,EAAE6H,MAAM5H,EAAE4H,IAAI,IAAGs6F,IAAG,EAAGliG,EAAEy/F,aAAav3F,EAAEhB,EAAE,KAAKnH,EAAEkiG,MAAMp+F,GAAsC,OAAO7D,EAAEiiG,MAAMliG,EAAEkiG,MAAMpkD,GAAG99C,EAAEC,EAAE6D,GAAjE,KAAa,OAAR9D,EAAEU,SAAgByhG,IAAG,EAAyC,EAAC,OAAO+G,GAAGlpG,EAAEC,EAAEgI,EAAEE,EAAErE,EAAE,CACxN,SAASqlG,GAAGnpG,EAAEC,EAAEgI,GAAG,IAAIE,EAAElI,EAAEy/F,aAAa57F,EAAEqE,EAAEi7E,SAASj8E,EAAE,OAAOnH,EAAEA,EAAEmqF,cAAc,KAAK,GAAG,WAAWhiF,EAAEyxB,KAAK,GAAG,KAAY,EAAP35B,EAAE25B,MAAQ35B,EAAEkqF,cAAc,CAACif,UAAU,EAAEC,UAAU,KAAKC,YAAY,MAAM1rF,GAAE2rF,GAAGC,IAAIA,IAAIvhG,MAAM,CAAC,GAAG,KAAO,WAAFA,GAAc,OAAOjI,EAAE,OAAOmH,EAAEA,EAAEiiG,UAAUnhG,EAAEA,EAAEhI,EAAEiiG,MAAMjiG,EAAE6hG,WAAW,WAAW7hG,EAAEkqF,cAAc,CAACif,UAAUppG,EAAEqpG,UAAU,KAAKC,YAAY,MAAMrpG,EAAE4iG,YAAY,KAAKjlF,GAAE2rF,GAAGC,IAAIA,IAAIxpG,EAAE,KAAKC,EAAEkqF,cAAc,CAACif,UAAU,EAAEC,UAAU,KAAKC,YAAY,MAAMnhG,EAAE,OAAOhB,EAAEA,EAAEiiG,UAAUnhG,EAAE2V,GAAE2rF,GAAGC,IAAIA,IAAIrhG,CAAC,MAAM,OACtfhB,GAAGgB,EAAEhB,EAAEiiG,UAAUnhG,EAAEhI,EAAEkqF,cAAc,MAAMhiF,EAAEF,EAAE2V,GAAE2rF,GAAGC,IAAIA,IAAIrhG,EAAc,OAAZo1C,GAAGv9C,EAAEC,EAAE6D,EAAEmE,GAAUhI,EAAEsqF,KAAK,CAAC,SAASkf,GAAGzpG,EAAEC,GAAG,IAAIgI,EAAEhI,EAAE4H,KAAO,OAAO7H,GAAG,OAAOiI,GAAG,OAAOjI,GAAGA,EAAE6H,MAAMI,KAAEhI,EAAES,OAAO,IAAIT,EAAES,OAAO,QAAO,CAAC,SAASwoG,GAAGlpG,EAAEC,EAAEgI,EAAEE,EAAErE,GAAG,IAAIqD,EAAEq2F,GAAGv1F,GAAGm1F,GAAG78E,GAAE/X,QAAmD,OAA3CrB,EAAEk2F,GAAGp9F,EAAEkH,GAAG46F,GAAG9hG,EAAE6D,GAAGmE,EAAEs9F,GAAGvlG,EAAEC,EAAEgI,EAAEE,EAAEhB,EAAErD,GAAGqE,EAAEy9F,KAAQ,OAAO5lG,GAAImiG,IAA2EtoF,IAAG1R,GAAG62F,GAAG/+F,GAAGA,EAAES,OAAO,EAAE68C,GAAGv9C,EAAEC,EAAEgI,EAAEnE,GAAU7D,EAAEsqF,QAA7GtqF,EAAE4iG,YAAY7iG,EAAE6iG,YAAY5iG,EAAES,QAAQ,KAAKV,EAAEkiG,QAAQp+F,EAAEg6C,GAAG99C,EAAEC,EAAE6D,GAAoD,CACla,SAAS4lG,GAAG1pG,EAAEC,EAAEgI,EAAEE,EAAErE,GAAG,GAAG05F,GAAGv1F,GAAG,CAAC,IAAId,GAAE,EAAG02F,GAAG59F,EAAE,MAAMkH,GAAE,EAAW,GAAR46F,GAAG9hG,EAAE6D,GAAM,OAAO7D,EAAE4oF,UAAU8gB,GAAG3pG,EAAEC,GAAGs8C,GAAGt8C,EAAEgI,EAAEE,GAAG0rC,GAAG5zC,EAAEgI,EAAEE,EAAErE,GAAGqE,GAAE,OAAQ,GAAG,OAAOnI,EAAE,CAAC,IAAIkI,EAAEjI,EAAE4oF,UAAUzgF,EAAEnI,EAAEigG,cAAch4F,EAAEI,MAAMF,EAAE,IAAIhB,EAAEc,EAAE5D,QAAQiD,EAAEU,EAAE3G,YAAY,kBAAkBiG,GAAG,OAAOA,EAAEA,EAAE66F,GAAG76F,GAAyBA,EAAE81F,GAAGp9F,EAA1BsH,EAAEi2F,GAAGv1F,GAAGm1F,GAAG78E,GAAE/X,SAAmB,IAAIhB,EAAES,EAAErG,yBAAyBoG,EAAE,oBAAoBR,GAAG,oBAAoBU,EAAEqgG,wBAAwBvgG,GAAG,oBAAoBE,EAAEogG,kCAAkC,oBAAoBpgG,EAAEmgG,4BAC1djgG,IAAID,GAAGf,IAAIG,IAAIk1C,GAAGx8C,EAAEiI,EAAEC,EAAEZ,GAAGo7F,IAAG,EAAG,IAAI5xF,EAAE9Q,EAAEkqF,cAAcjiF,EAAEutC,MAAM1kC,EAAE6yF,GAAG3jG,EAAEkI,EAAED,EAAEpE,GAAGsD,EAAEnH,EAAEkqF,cAAc/hF,IAAID,GAAG4I,IAAI3J,GAAG+1F,GAAG30F,SAASm6F,IAAI,oBAAoBn7F,IAAIosC,GAAG3zC,EAAEgI,EAAET,EAAEW,GAAGf,EAAEnH,EAAEkqF,gBAAgB/hF,EAAEu6F,IAAI/nD,GAAG36C,EAAEgI,EAAEG,EAAED,EAAE4I,EAAE3J,EAAEG,KAAKS,GAAG,oBAAoBE,EAAEsgG,2BAA2B,oBAAoBtgG,EAAEugG,qBAAqB,oBAAoBvgG,EAAEugG,oBAAoBvgG,EAAEugG,qBAAqB,oBAAoBvgG,EAAEsgG,2BAA2BtgG,EAAEsgG,6BAA6B,oBAAoBtgG,EAAEwgG,oBAAoBzoG,EAAES,OAAO,WAClf,oBAAoBwH,EAAEwgG,oBAAoBzoG,EAAES,OAAO,SAAST,EAAEigG,cAAc/3F,EAAElI,EAAEkqF,cAAc/iF,GAAGc,EAAEI,MAAMH,EAAED,EAAEutC,MAAMruC,EAAEc,EAAE5D,QAAQiD,EAAEY,EAAEC,IAAI,oBAAoBF,EAAEwgG,oBAAoBzoG,EAAES,OAAO,SAASyH,GAAE,EAAG,KAAK,CAACD,EAAEjI,EAAE4oF,UAAUua,GAAGpjG,EAAEC,GAAGmI,EAAEnI,EAAEigG,cAAc34F,EAAEtH,EAAE8B,OAAO9B,EAAEs/F,YAAYn3F,EAAE2rC,GAAG9zC,EAAE8B,KAAKqG,GAAGF,EAAEI,MAAMf,EAAES,EAAE/H,EAAEy/F,aAAa3uF,EAAE7I,EAAE5D,QAAwB,kBAAhB8C,EAAEa,EAAE3G,cAAiC,OAAO8F,EAAEA,EAAEg7F,GAAGh7F,GAAyBA,EAAEi2F,GAAGp9F,EAA1BmH,EAAEo2F,GAAGv1F,GAAGm1F,GAAG78E,GAAE/X,SAAmB,IAAIoG,EAAE3G,EAAErG,0BAA0B4F,EAAE,oBAAoBoH,GAAG,oBAAoB1G,EAAEqgG,0BAC9e,oBAAoBrgG,EAAEogG,kCAAkC,oBAAoBpgG,EAAEmgG,4BAA4BjgG,IAAIJ,GAAG+I,IAAI3J,IAAIq1C,GAAGx8C,EAAEiI,EAAEC,EAAEf,GAAGu7F,IAAG,EAAG5xF,EAAE9Q,EAAEkqF,cAAcjiF,EAAEutC,MAAM1kC,EAAE6yF,GAAG3jG,EAAEkI,EAAED,EAAEpE,GAAG,IAAI2D,EAAExH,EAAEkqF,cAAc/hF,IAAIJ,GAAG+I,IAAItJ,GAAG01F,GAAG30F,SAASm6F,IAAI,oBAAoB/zF,IAAIglC,GAAG3zC,EAAEgI,EAAE2G,EAAEzG,GAAGV,EAAExH,EAAEkqF,gBAAgB5iF,EAAEo7F,IAAI/nD,GAAG36C,EAAEgI,EAAEV,EAAEY,EAAE4I,EAAEtJ,EAAEL,KAAI,IAAKI,GAAG,oBAAoBU,EAAE0hG,4BAA4B,oBAAoB1hG,EAAE2hG,sBAAsB,oBAAoB3hG,EAAE2hG,qBAAqB3hG,EAAE2hG,oBAAoB1hG,EAAEV,EAAEL,GAAG,oBAAoBc,EAAE0hG,4BAC5f1hG,EAAE0hG,2BAA2BzhG,EAAEV,EAAEL,IAAI,oBAAoBc,EAAE4hG,qBAAqB7pG,EAAES,OAAO,GAAG,oBAAoBwH,EAAEqgG,0BAA0BtoG,EAAES,OAAO,QAAQ,oBAAoBwH,EAAE4hG,oBAAoB1hG,IAAIpI,EAAEkgG,eAAenvF,IAAI/Q,EAAEmqF,gBAAgBlqF,EAAES,OAAO,GAAG,oBAAoBwH,EAAEqgG,yBAAyBngG,IAAIpI,EAAEkgG,eAAenvF,IAAI/Q,EAAEmqF,gBAAgBlqF,EAAES,OAAO,MAAMT,EAAEigG,cAAc/3F,EAAElI,EAAEkqF,cAAc1iF,GAAGS,EAAEI,MAAMH,EAAED,EAAEutC,MAAMhuC,EAAES,EAAE5D,QAAQ8C,EAAEe,EAAEZ,IAAI,oBAAoBW,EAAE4hG,oBAAoB1hG,IAAIpI,EAAEkgG,eAAenvF,IACjf/Q,EAAEmqF,gBAAgBlqF,EAAES,OAAO,GAAG,oBAAoBwH,EAAEqgG,yBAAyBngG,IAAIpI,EAAEkgG,eAAenvF,IAAI/Q,EAAEmqF,gBAAgBlqF,EAAES,OAAO,MAAMyH,GAAE,EAAG,CAAC,OAAO4hG,GAAG/pG,EAAEC,EAAEgI,EAAEE,EAAEhB,EAAErD,EAAE,CACnK,SAASimG,GAAG/pG,EAAEC,EAAEgI,EAAEE,EAAErE,EAAEqD,GAAGsiG,GAAGzpG,EAAEC,GAAG,IAAIiI,EAAE,KAAa,IAARjI,EAAES,OAAW,IAAIyH,IAAID,EAAE,OAAOpE,GAAGi6F,GAAG99F,EAAEgI,GAAE,GAAI61C,GAAG99C,EAAEC,EAAEkH,GAAGgB,EAAElI,EAAE4oF,UAAUzrC,GAAG50C,QAAQvI,EAAE,IAAImI,EAAEF,GAAG,oBAAoBD,EAAEtG,yBAAyB,KAAKwG,EAAEtF,SAAwI,OAA/H5C,EAAES,OAAO,EAAE,OAAOV,GAAGkI,GAAGjI,EAAEsqF,MAAM6W,GAAGnhG,EAAED,EAAEuqF,MAAM,KAAKpjF,GAAGlH,EAAEsqF,MAAM6W,GAAGnhG,EAAE,KAAKmI,EAAEjB,IAAIo2C,GAAGv9C,EAAEC,EAAEmI,EAAEjB,GAAGlH,EAAEkqF,cAAchiF,EAAEstC,MAAM3xC,GAAGi6F,GAAG99F,EAAEgI,GAAE,GAAWhI,EAAEsqF,KAAK,CAAC,SAASyf,GAAGhqG,GAAG,IAAIC,EAAED,EAAE6oF,UAAU5oF,EAAEgqG,eAAevM,GAAG19F,EAAEC,EAAEgqG,eAAehqG,EAAEgqG,iBAAiBhqG,EAAEqE,SAASrE,EAAEqE,SAASo5F,GAAG19F,EAAEC,EAAEqE,SAAQ,GAAI8/F,GAAGpkG,EAAEC,EAAEivF,cAAc,CAC5e,SAASgb,GAAGlqG,EAAEC,EAAEgI,EAAEE,EAAErE,GAAuC,OAApCs8F,KAAKC,GAAGv8F,GAAG7D,EAAES,OAAO,IAAI68C,GAAGv9C,EAAEC,EAAEgI,EAAEE,GAAUlI,EAAEsqF,KAAK,CAAC,IAaqL4f,GAAGC,GAAGC,GAAGC,GAb1LC,GAAG,CAACngB,WAAW,KAAKwV,YAAY,KAAKC,UAAU,GAAG,SAAS2K,GAAGxqG,GAAG,MAAM,CAACopG,UAAUppG,EAAEqpG,UAAU,KAAKC,YAAY,KAAK,CAClM,SAASmB,GAAGzqG,EAAEC,EAAEgI,GAAG,IAA0DG,EAAtDD,EAAElI,EAAEy/F,aAAa57F,EAAEyS,GAAE/N,QAAQrB,GAAE,EAAGe,EAAE,KAAa,IAARjI,EAAES,OAAqJ,IAAvI0H,EAAEF,KAAKE,GAAE,OAAOpI,GAAG,OAAOA,EAAEmqF,gBAAiB,KAAO,EAAFrmF,IAASsE,GAAEjB,GAAE,EAAGlH,EAAES,QAAQ,KAAY,OAAOV,GAAG,OAAOA,EAAEmqF,gBAAcrmF,GAAG,GAAE8Z,GAAErH,GAAI,EAAFzS,GAAQ,OAAO9D,EAA2B,OAAxB+/F,GAAG9/F,GAAwB,QAArBD,EAAEC,EAAEkqF,gBAA2C,QAAfnqF,EAAEA,EAAEoqF,aAA4B,KAAY,EAAPnqF,EAAE25B,MAAQ35B,EAAEiiG,MAAM,EAAE,OAAOliG,EAAEkK,KAAKjK,EAAEiiG,MAAM,EAAEjiG,EAAEiiG,MAAM,WAAW,OAAKh6F,EAAEC,EAAEi7E,SAASpjF,EAAEmI,EAAEuiG,SAAgBvjG,GAAGgB,EAAElI,EAAE25B,KAAKzyB,EAAElH,EAAEsqF,MAAMriF,EAAE,CAAC0xB,KAAK,SAASwpD,SAASl7E,GAAG,KAAO,EAAFC,IAAM,OAAOhB,GAAGA,EAAE26F,WAAW,EAAE36F,EAAEu4F,aAC7ex3F,GAAGf,EAAEwjG,GAAGziG,EAAEC,EAAE,EAAE,MAAMnI,EAAEkhG,GAAGlhG,EAAEmI,EAAEF,EAAE,MAAMd,EAAE8iF,OAAOhqF,EAAED,EAAEiqF,OAAOhqF,EAAEkH,EAAEqjF,QAAQxqF,EAAEC,EAAEsqF,MAAMpjF,EAAElH,EAAEsqF,MAAMJ,cAAcqgB,GAAGviG,GAAGhI,EAAEkqF,cAAcogB,GAAGvqG,GAAG4qG,GAAG3qG,EAAEiI,IAAqB,GAAG,QAArBpE,EAAE9D,EAAEmqF,gBAA2C,QAAf/hF,EAAEtE,EAAEsmF,YAAqB,OAGpM,SAAYpqF,EAAEC,EAAEgI,EAAEE,EAAErE,EAAEqD,EAAEe,GAAG,GAAGD,EAAG,OAAW,IAARhI,EAAES,OAAiBT,EAAES,QAAQ,IAAwBmqG,GAAG7qG,EAAEC,EAAEiI,EAA3BC,EAAEq0C,GAAGlrC,MAAM1J,EAAE,SAAsB,OAAO3H,EAAEkqF,eAAqBlqF,EAAEsqF,MAAMvqF,EAAEuqF,MAAMtqF,EAAES,OAAO,IAAI,OAAKyG,EAAEgB,EAAEuiG,SAAS5mG,EAAE7D,EAAE25B,KAAKzxB,EAAEwiG,GAAG,CAAC/wE,KAAK,UAAUwpD,SAASj7E,EAAEi7E,UAAUt/E,EAAE,EAAE,OAAMqD,EAAE+5F,GAAG/5F,EAAErD,EAAEoE,EAAE,OAAQxH,OAAO,EAAEyH,EAAE8hF,OAAOhqF,EAAEkH,EAAE8iF,OAAOhqF,EAAEkI,EAAEqiF,QAAQrjF,EAAElH,EAAEsqF,MAAMpiF,EAAE,KAAY,EAAPlI,EAAE25B,OAASwnE,GAAGnhG,EAAED,EAAEuqF,MAAM,KAAKriF,GAAGjI,EAAEsqF,MAAMJ,cAAcqgB,GAAGtiG,GAAGjI,EAAEkqF,cAAcogB,GAAUpjG,GAAE,GAAG,KAAY,EAAPlH,EAAE25B,MAAQ,OAAOixE,GAAG7qG,EAAEC,EAAEiI,EAAE,MAAM,GAAG,OAAOpE,EAAEoG,KAAK,CAChd,GADid/B,EAAErE,EAAEi0F,aAAaj0F,EAAEi0F,YAAY+S,QAC3e,IAAI1iG,EAAED,EAAE4iG,KAA0C,OAArC5iG,EAAEC,EAA0CyiG,GAAG7qG,EAAEC,EAAEiI,EAA/BC,EAAEq0C,GAAlBr1C,EAAEmK,MAAM1J,EAAE,MAAaO,OAAE,GAA0B,CAAwB,GAAvBC,EAAE,KAAKF,EAAElI,EAAE8hG,YAAeK,IAAI/5F,EAAE,CAAK,GAAG,QAAPD,EAAEkc,IAAc,CAAC,OAAOnc,GAAGA,GAAG,KAAK,EAAEpE,EAAE,EAAE,MAAM,KAAK,GAAGA,EAAE,EAAE,MAAM,KAAK,GAAG,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,SAAS,KAAK,SAAS,KAAK,SAASA,EAAE,GAAG,MAAM,KAAK,UAAUA,EAAE,UAAU,MAAM,QAAQA,EAAE,EAChd,KADkdA,EAAE,KAAKA,GAAGqE,EAAEwkF,eAAezkF,IAAI,EAAEpE,IAC5eA,IAAIqD,EAAE04F,YAAY14F,EAAE04F,UAAU/7F,EAAE4+F,GAAG1iG,EAAE8D,GAAG6rC,GAAGxnC,EAAEnI,EAAE8D,GAAG,GAAG,CAA0B,OAAzBknG,KAAgCH,GAAG7qG,EAAEC,EAAEiI,EAAlCC,EAAEq0C,GAAGlrC,MAAM1J,EAAE,OAAyB,CAAC,MAAG,OAAO9D,EAAEoG,MAAYjK,EAAES,OAAO,IAAIT,EAAEsqF,MAAMvqF,EAAEuqF,MAAMtqF,EAAEgrG,GAAGjnG,KAAK,KAAKhE,GAAG8D,EAAEonG,YAAYjrG,EAAE,OAAKD,EAAEmH,EAAEy4F,YAAYT,GAAG5C,GAAGz4F,EAAEi0F,aAAamH,GAAGj/F,EAAE4Z,IAAE,EAAGulF,GAAG,KAAK,OAAOp/F,IAAIy+F,GAAGC,MAAME,GAAGH,GAAGC,MAAMG,GAAGJ,GAAGC,MAAMC,GAAGC,GAAG5+F,EAAE+b,GAAG8iF,GAAG7+F,EAAE2/F,SAAShB,GAAG1+F,GAAGA,EAAE2qG,GAAG3qG,EAAEkI,EAAEi7E,UAAUnjF,EAAES,OAAO,KAAYT,EAAC,CALrKkrG,CAAGnrG,EAAEC,EAAEiI,EAAEC,EAAEC,EAAEtE,EAAEmE,GAAG,GAAGd,EAAE,CAACA,EAAEgB,EAAEuiG,SAASxiG,EAAEjI,EAAE25B,KAAexxB,GAAVtE,EAAE9D,EAAEuqF,OAAUC,QAAQ,IAAIpjF,EAAE,CAACwyB,KAAK,SAASwpD,SAASj7E,EAAEi7E,UAChF,OAD0F,KAAO,EAAFl7E,IAAMjI,EAAEsqF,QAAQzmF,IAAGqE,EAAElI,EAAEsqF,OAAQuX,WAAW,EAAE35F,EAAEu3F,aAAat4F,EAAEnH,EAAEu/F,UAAU,OAAOr3F,EAAE04F,GAAG/8F,EAAEsD,IAAKgkG,aAA4B,SAAftnG,EAAEsnG,aAAuB,OAAOhjG,EAAEjB,EAAE05F,GAAGz4F,EAAEjB,IAAIA,EAAE+5F,GAAG/5F,EAAEe,EAAED,EAAE,OAAQvH,OAAO,EAAGyG,EAAE8iF,OACnfhqF,EAAEkI,EAAE8hF,OAAOhqF,EAAEkI,EAAEqiF,QAAQrjF,EAAElH,EAAEsqF,MAAMpiF,EAAEA,EAAEhB,EAAEA,EAAElH,EAAEsqF,MAA8BriF,EAAE,QAA1BA,EAAElI,EAAEuqF,MAAMJ,eAAyBqgB,GAAGviG,GAAG,CAACmhG,UAAUlhG,EAAEkhG,UAAUnhG,EAAEohG,UAAU,KAAKC,YAAYphG,EAAEohG,aAAaniG,EAAEgjF,cAAcjiF,EAAEf,EAAE26F,WAAW9hG,EAAE8hG,YAAY75F,EAAEhI,EAAEkqF,cAAcogB,GAAUpiG,CAAC,CAAoO,OAAzNnI,GAAVmH,EAAEnH,EAAEuqF,OAAUC,QAAQriF,EAAE04F,GAAG15F,EAAE,CAACyyB,KAAK,UAAUwpD,SAASj7E,EAAEi7E,WAAW,KAAY,EAAPnjF,EAAE25B,QAAUzxB,EAAE+5F,MAAMj6F,GAAGE,EAAE8hF,OAAOhqF,EAAEkI,EAAEqiF,QAAQ,KAAK,OAAOxqF,IAAkB,QAAdiI,EAAEhI,EAAEu/F,YAAoBv/F,EAAEu/F,UAAU,CAACx/F,GAAGC,EAAES,OAAO,IAAIuH,EAAE4c,KAAK7kB,IAAIC,EAAEsqF,MAAMpiF,EAAElI,EAAEkqF,cAAc,KAAYhiF,CAAC,CACnd,SAASyiG,GAAG5qG,EAAEC,GAA8D,OAA3DA,EAAE0qG,GAAG,CAAC/wE,KAAK,UAAUwpD,SAASnjF,GAAGD,EAAE45B,KAAK,EAAE,OAAQqwD,OAAOjqF,EAASA,EAAEuqF,MAAMtqF,CAAC,CAAC,SAAS4qG,GAAG7qG,EAAEC,EAAEgI,EAAEE,GAAwG,OAArG,OAAOA,GAAGk4F,GAAGl4F,GAAGi5F,GAAGnhG,EAAED,EAAEuqF,MAAM,KAAKtiF,IAAGjI,EAAE4qG,GAAG3qG,EAAEA,EAAEy/F,aAAatc,WAAY1iF,OAAO,EAAET,EAAEkqF,cAAc,KAAYnqF,CAAC,CAGkJ,SAASqrG,GAAGrrG,EAAEC,EAAEgI,GAAGjI,EAAEkiG,OAAOjiG,EAAE,IAAIkI,EAAEnI,EAAEgqF,UAAU,OAAO7hF,IAAIA,EAAE+5F,OAAOjiG,GAAG4hG,GAAG7hG,EAAEiqF,OAAOhqF,EAAEgI,EAAE,CACxc,SAASqjG,GAAGtrG,EAAEC,EAAEgI,EAAEE,EAAErE,GAAG,IAAIqD,EAAEnH,EAAEmqF,cAAc,OAAOhjF,EAAEnH,EAAEmqF,cAAc,CAACohB,YAAYtrG,EAAEurG,UAAU,KAAKC,mBAAmB,EAAEC,KAAKvjG,EAAEwjG,KAAK1jG,EAAE2jG,SAAS9nG,IAAIqD,EAAEokG,YAAYtrG,EAAEkH,EAAEqkG,UAAU,KAAKrkG,EAAEskG,mBAAmB,EAAEtkG,EAAEukG,KAAKvjG,EAAEhB,EAAEwkG,KAAK1jG,EAAEd,EAAEykG,SAAS9nG,EAAE,CAC3O,SAAS+nG,GAAG7rG,EAAEC,EAAEgI,GAAG,IAAIE,EAAElI,EAAEy/F,aAAa57F,EAAEqE,EAAEu8F,YAAYv9F,EAAEgB,EAAEwjG,KAAsC,GAAjCpuD,GAAGv9C,EAAEC,EAAEkI,EAAEi7E,SAASn7E,GAAkB,KAAO,GAAtBE,EAAEoO,GAAE/N,UAAqBL,EAAI,EAAFA,EAAI,EAAElI,EAAES,OAAO,QAAQ,CAAC,GAAG,OAAOV,GAAG,KAAa,IAARA,EAAEU,OAAWV,EAAE,IAAIA,EAAEC,EAAEsqF,MAAM,OAAOvqF,GAAG,CAAC,GAAG,KAAKA,EAAEuhF,IAAI,OAAOvhF,EAAEmqF,eAAekhB,GAAGrrG,EAAEiI,EAAEhI,QAAQ,GAAG,KAAKD,EAAEuhF,IAAI8pB,GAAGrrG,EAAEiI,EAAEhI,QAAQ,GAAG,OAAOD,EAAEuqF,MAAM,CAACvqF,EAAEuqF,MAAMN,OAAOjqF,EAAEA,EAAEA,EAAEuqF,MAAM,QAAQ,CAAC,GAAGvqF,IAAIC,EAAE,MAAMD,EAAE,KAAK,OAAOA,EAAEwqF,SAAS,CAAC,GAAG,OAAOxqF,EAAEiqF,QAAQjqF,EAAEiqF,SAAShqF,EAAE,MAAMD,EAAEA,EAAEA,EAAEiqF,MAAM,CAACjqF,EAAEwqF,QAAQP,OAAOjqF,EAAEiqF,OAAOjqF,EAAEA,EAAEwqF,OAAO,CAACriF,GAAG,CAAC,CAAQ,GAAPyV,GAAErH,GAAEpO,GAAM,KAAY,EAAPlI,EAAE25B,MAAQ35B,EAAEkqF,cAC/e,UAAU,OAAOrmF,GAAG,IAAK,WAAqB,IAAVmE,EAAEhI,EAAEsqF,MAAUzmF,EAAE,KAAK,OAAOmE,GAAiB,QAAdjI,EAAEiI,EAAE+hF,YAAoB,OAAOya,GAAGzkG,KAAK8D,EAAEmE,GAAGA,EAAEA,EAAEuiF,QAAY,QAAJviF,EAAEnE,IAAYA,EAAE7D,EAAEsqF,MAAMtqF,EAAEsqF,MAAM,OAAOzmF,EAAEmE,EAAEuiF,QAAQviF,EAAEuiF,QAAQ,MAAM8gB,GAAGrrG,GAAE,EAAG6D,EAAEmE,EAAEd,GAAG,MAAM,IAAK,YAA6B,IAAjBc,EAAE,KAAKnE,EAAE7D,EAAEsqF,MAAUtqF,EAAEsqF,MAAM,KAAK,OAAOzmF,GAAG,CAAe,GAAG,QAAjB9D,EAAE8D,EAAEkmF,YAAuB,OAAOya,GAAGzkG,GAAG,CAACC,EAAEsqF,MAAMzmF,EAAE,KAAK,CAAC9D,EAAE8D,EAAE0mF,QAAQ1mF,EAAE0mF,QAAQviF,EAAEA,EAAEnE,EAAEA,EAAE9D,CAAC,CAACsrG,GAAGrrG,GAAE,EAAGgI,EAAE,KAAKd,GAAG,MAAM,IAAK,WAAWmkG,GAAGrrG,GAAE,EAAG,KAAK,UAAK,GAAQ,MAAM,QAAQA,EAAEkqF,cAAc,KAAK,OAAOlqF,EAAEsqF,KAAK,CAC7d,SAASof,GAAG3pG,EAAEC,GAAG,KAAY,EAAPA,EAAE25B,OAAS,OAAO55B,IAAIA,EAAEgqF,UAAU,KAAK/pF,EAAE+pF,UAAU,KAAK/pF,EAAES,OAAO,EAAE,CAAC,SAASo9C,GAAG99C,EAAEC,EAAEgI,GAAyD,GAAtD,OAAOjI,IAAIC,EAAE+hG,aAAahiG,EAAEgiG,cAAc6B,IAAI5jG,EAAEiiG,MAAS,KAAKj6F,EAAEhI,EAAE6hG,YAAY,OAAO,KAAK,GAAG,OAAO9hG,GAAGC,EAAEsqF,QAAQvqF,EAAEuqF,MAAM,MAAMj5E,MAAM1J,EAAE,MAAM,GAAG,OAAO3H,EAAEsqF,MAAM,CAA4C,IAAjCtiF,EAAE44F,GAAZ7gG,EAAEC,EAAEsqF,MAAavqF,EAAE0/F,cAAcz/F,EAAEsqF,MAAMtiF,EAAMA,EAAEgiF,OAAOhqF,EAAE,OAAOD,EAAEwqF,SAASxqF,EAAEA,EAAEwqF,SAAQviF,EAAEA,EAAEuiF,QAAQqW,GAAG7gG,EAAEA,EAAE0/F,eAAgBzV,OAAOhqF,EAAEgI,EAAEuiF,QAAQ,IAAI,CAAC,OAAOvqF,EAAEsqF,KAAK,CAO9a,SAASuhB,GAAG9rG,EAAEC,GAAG,IAAI4Z,GAAE,OAAO7Z,EAAE4rG,UAAU,IAAK,SAAS3rG,EAAED,EAAE2rG,KAAK,IAAI,IAAI1jG,EAAE,KAAK,OAAOhI,GAAG,OAAOA,EAAE+pF,YAAY/hF,EAAEhI,GAAGA,EAAEA,EAAEuqF,QAAQ,OAAOviF,EAAEjI,EAAE2rG,KAAK,KAAK1jG,EAAEuiF,QAAQ,KAAK,MAAM,IAAK,YAAYviF,EAAEjI,EAAE2rG,KAAK,IAAI,IAAIxjG,EAAE,KAAK,OAAOF,GAAG,OAAOA,EAAE+hF,YAAY7hF,EAAEF,GAAGA,EAAEA,EAAEuiF,QAAQ,OAAOriF,EAAElI,GAAG,OAAOD,EAAE2rG,KAAK3rG,EAAE2rG,KAAK,KAAK3rG,EAAE2rG,KAAKnhB,QAAQ,KAAKriF,EAAEqiF,QAAQ,KAAK,CAC5U,SAAS13E,GAAE9S,GAAG,IAAIC,EAAE,OAAOD,EAAEgqF,WAAWhqF,EAAEgqF,UAAUO,QAAQvqF,EAAEuqF,MAAMtiF,EAAE,EAAEE,EAAE,EAAE,GAAGlI,EAAE,IAAI,IAAI6D,EAAE9D,EAAEuqF,MAAM,OAAOzmF,GAAGmE,GAAGnE,EAAEo+F,MAAMp+F,EAAEg+F,WAAW35F,GAAkB,SAAfrE,EAAEsnG,aAAsBjjG,GAAW,SAARrE,EAAEpD,MAAeoD,EAAEmmF,OAAOjqF,EAAE8D,EAAEA,EAAE0mF,aAAa,IAAI1mF,EAAE9D,EAAEuqF,MAAM,OAAOzmF,GAAGmE,GAAGnE,EAAEo+F,MAAMp+F,EAAEg+F,WAAW35F,GAAGrE,EAAEsnG,aAAajjG,GAAGrE,EAAEpD,MAAMoD,EAAEmmF,OAAOjqF,EAAE8D,EAAEA,EAAE0mF,QAAyC,OAAjCxqF,EAAEorG,cAAcjjG,EAAEnI,EAAE8hG,WAAW75F,EAAShI,CAAC,CAC7V,SAAS8rG,GAAG/rG,EAAEC,EAAEgI,GAAG,IAAIE,EAAElI,EAAEy/F,aAAmB,OAANT,GAAGh/F,GAAUA,EAAEshF,KAAK,KAAK,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,GAAG,OAAOzuE,GAAE7S,GAAG,KAAK,KAAK,EAUtD,KAAK,GAAG,OAAOu9F,GAAGv9F,EAAE8B,OAAO07F,KAAK3qF,GAAE7S,GAAG,KAVqD,KAAK,EAA2Q,OAAzQkI,EAAElI,EAAE4oF,UAAUyb,KAAK9xF,GAAE2qF,IAAI3qF,GAAE+N,IAAGqkF,KAAKz8F,EAAE8hG,iBAAiB9hG,EAAE7D,QAAQ6D,EAAE8hG,eAAe9hG,EAAE8hG,eAAe,MAAS,OAAOjqG,GAAG,OAAOA,EAAEuqF,QAAM0V,GAAGhgG,GAAGA,EAAES,OAAO,EAAE,OAAOV,GAAGA,EAAEmqF,cAAc8E,cAAc,KAAa,IAARhvF,EAAES,SAAaT,EAAES,OAAO,KAAK,OAAO0+F,KAAK4M,GAAG5M,IAAIA,GAAG,QAAOgL,GAAGpqG,EAAEC,GAAG6S,GAAE7S,GAAU,KAAK,KAAK,EAAEukG,GAAGvkG,GAAG,IAAI6D,EAAEqgG,GAAGD,GAAG17F,SAC7e,GAATP,EAAEhI,EAAE8B,KAAQ,OAAO/B,GAAG,MAAMC,EAAE4oF,UAAUwhB,GAAGrqG,EAAEC,EAAEgI,EAAEE,EAAErE,GAAG9D,EAAE6H,MAAM5H,EAAE4H,MAAM5H,EAAES,OAAO,IAAIT,EAAES,OAAO,aAAa,CAAC,IAAIyH,EAAE,CAAC,GAAG,OAAOlI,EAAE4oF,UAAU,MAAMv3E,MAAM1J,EAAE,MAAW,OAALkL,GAAE7S,GAAU,IAAI,CAAkB,GAAjBD,EAAEmkG,GAAGH,GAAGx7F,SAAYy3F,GAAGhgG,GAAG,CAACkI,EAAElI,EAAE4oF,UAAU5gF,EAAEhI,EAAE8B,KAAK,IAAIoF,EAAElH,EAAEigG,cAA+C,OAAjC/3F,EAAEw0F,IAAI18F,EAAEkI,EAAEy0F,IAAIz1F,EAAEnH,EAAE,KAAY,EAAPC,EAAE25B,MAAe3xB,GAAG,IAAK,SAAS8R,GAAE,SAAS5R,GAAG4R,GAAE,QAAQ5R,GAAG,MAAM,IAAK,SAAS,IAAK,SAAS,IAAK,QAAQ4R,GAAE,OAAO5R,GAAG,MAAM,IAAK,QAAQ,IAAK,QAAQ,IAAIrE,EAAE,EAAEA,EAAEy2F,GAAGp6F,OAAO2D,IAAIiW,GAAEwgF,GAAGz2F,GAAGqE,GAAG,MAAM,IAAK,SAAS4R,GAAE,QAAQ5R,GAAG,MAAM,IAAK,MAAM,IAAK,QAAQ,IAAK,OAAO4R,GAAE,QACnhB5R,GAAG4R,GAAE,OAAO5R,GAAG,MAAM,IAAK,UAAU4R,GAAE,SAAS5R,GAAG,MAAM,IAAK,QAAQw+D,EAAGx+D,EAAEhB,GAAG4S,GAAE,UAAU5R,GAAG,MAAM,IAAK,SAASA,EAAEi6E,cAAc,CAAC6pB,cAAc9kG,EAAE+kG,UAAUnyF,GAAE,UAAU5R,GAAG,MAAM,IAAK,WAAWk7E,GAAGl7E,EAAEhB,GAAG4S,GAAE,UAAU5R,GAAkB,IAAI,IAAID,KAAvB8/E,GAAG//E,EAAEd,GAAGrD,EAAE,KAAkBqD,EAAE,GAAGA,EAAEpG,eAAemH,GAAG,CAAC,IAAIE,EAAEjB,EAAEe,GAAG,aAAaA,EAAE,kBAAkBE,EAAED,EAAEw7D,cAAcv7D,KAAI,IAAKjB,EAAEglG,0BAA0BzQ,GAAGvzF,EAAEw7D,YAAYv7D,EAAEpI,GAAG8D,EAAE,CAAC,WAAWsE,IAAI,kBAAkBA,GAAGD,EAAEw7D,cAAc,GAAGv7D,KAAI,IAAKjB,EAAEglG,0BAA0BzQ,GAAGvzF,EAAEw7D,YAC1ev7D,EAAEpI,GAAG8D,EAAE,CAAC,WAAW,GAAGsE,IAAI6pD,EAAGlxD,eAAemH,IAAI,MAAME,GAAG,aAAaF,GAAG6R,GAAE,SAAS5R,EAAE,CAAC,OAAOF,GAAG,IAAK,QAAQy6D,EAAGv6D,GAAGw6E,GAAGx6E,EAAEhB,GAAE,GAAI,MAAM,IAAK,WAAWu7D,EAAGv6D,GAAGo7E,GAAGp7E,GAAG,MAAM,IAAK,SAAS,IAAK,SAAS,MAAM,QAAQ,oBAAoBhB,EAAEilG,UAAUjkG,EAAEkkG,QAAQ1Q,IAAIxzF,EAAErE,EAAE7D,EAAE4iG,YAAY16F,EAAE,OAAOA,IAAIlI,EAAES,OAAO,EAAE,KAAK,CAACwH,EAAE,IAAIpE,EAAEogF,SAASpgF,EAAEA,EAAE8+E,cAAc,iCAAiC5iF,IAAIA,EAAEwjF,GAAGv7E,IAAI,iCAAiCjI,EAAE,WAAWiI,IAAGjI,EAAEkI,EAAElC,cAAc,QAAS89E,UAAU,qBAAuB9jF,EAAEA,EAAEo5D,YAAYp5D,EAAE+jF,aAC/f,kBAAkB57E,EAAEuG,GAAG1O,EAAEkI,EAAElC,cAAciC,EAAE,CAACyG,GAAGvG,EAAEuG,MAAM1O,EAAEkI,EAAElC,cAAciC,GAAG,WAAWA,IAAIC,EAAElI,EAAEmI,EAAE+jG,SAAShkG,EAAEgkG,UAAS,EAAG/jG,EAAEye,OAAO1e,EAAE0e,KAAKze,EAAEye,QAAQ5mB,EAAEkI,EAAEokG,gBAAgBtsG,EAAEiI,GAAGjI,EAAE28F,IAAI18F,EAAED,EAAE48F,IAAIz0F,EAAEgiG,GAAGnqG,EAAEC,GAAE,GAAG,GAAIA,EAAE4oF,UAAU7oF,EAAEA,EAAE,CAAW,OAAVkI,EAAE+/E,GAAGhgF,EAAEE,GAAUF,GAAG,IAAK,SAAS8R,GAAE,SAAS/Z,GAAG+Z,GAAE,QAAQ/Z,GAAG8D,EAAEqE,EAAE,MAAM,IAAK,SAAS,IAAK,SAAS,IAAK,QAAQ4R,GAAE,OAAO/Z,GAAG8D,EAAEqE,EAAE,MAAM,IAAK,QAAQ,IAAK,QAAQ,IAAIrE,EAAE,EAAEA,EAAEy2F,GAAGp6F,OAAO2D,IAAIiW,GAAEwgF,GAAGz2F,GAAG9D,GAAG8D,EAAEqE,EAAE,MAAM,IAAK,SAAS4R,GAAE,QAAQ/Z,GAAG8D,EAAEqE,EAAE,MAAM,IAAK,MAAM,IAAK,QAAQ,IAAK,OAAO4R,GAAE,QAClf/Z,GAAG+Z,GAAE,OAAO/Z,GAAG8D,EAAEqE,EAAE,MAAM,IAAK,UAAU4R,GAAE,SAAS/Z,GAAG8D,EAAEqE,EAAE,MAAM,IAAK,QAAQw+D,EAAG3mE,EAAEmI,GAAGrE,EAAE6+D,EAAG3iE,EAAEmI,GAAG4R,GAAE,UAAU/Z,GAAG,MAAM,IAAK,SAAiL,QAAQ8D,EAAEqE,QAAxK,IAAK,SAASnI,EAAEoiF,cAAc,CAAC6pB,cAAc9jG,EAAE+jG,UAAUpoG,EAAE+S,EAAE,CAAC,EAAE1O,EAAE,CAACyD,WAAM,IAASmO,GAAE,UAAU/Z,GAAG,MAAM,IAAK,WAAWqjF,GAAGrjF,EAAEmI,GAAGrE,EAAEo/E,GAAGljF,EAAEmI,GAAG4R,GAAE,UAAU/Z,GAAiC,IAAImH,KAAhB6gF,GAAG//E,EAAEnE,GAAGsE,EAAEtE,EAAa,GAAGsE,EAAErH,eAAeoG,GAAG,CAAC,IAAIC,EAAEgB,EAAEjB,GAAG,UAAUA,EAAE8/E,GAAGjnF,EAAEoH,GAAG,4BAA4BD,EAAuB,OAApBC,EAAEA,EAAEA,EAAE20F,YAAO,IAAgBnyC,GAAG5pD,EAAEoH,GAAI,aAAaD,EAAE,kBAAkBC,GAAG,aAC7ea,GAAG,KAAKb,IAAI48E,GAAGhkF,EAAEoH,GAAG,kBAAkBA,GAAG48E,GAAGhkF,EAAE,GAAGoH,GAAG,mCAAmCD,GAAG,6BAA6BA,GAAG,cAAcA,IAAI8qD,EAAGlxD,eAAeoG,GAAG,MAAMC,GAAG,aAAaD,GAAG4S,GAAE,SAAS/Z,GAAG,MAAMoH,GAAGwrD,EAAG5yD,EAAEmH,EAAEC,EAAEc,GAAG,CAAC,OAAOD,GAAG,IAAK,QAAQy6D,EAAG1iE,GAAG2iF,GAAG3iF,EAAEmI,GAAE,GAAI,MAAM,IAAK,WAAWu6D,EAAG1iE,GAAGujF,GAAGvjF,GAAG,MAAM,IAAK,SAAS,MAAMmI,EAAEyD,OAAO5L,EAAEoG,aAAa,QAAQ,GAAG41D,EAAG7zD,EAAEyD,QAAQ,MAAM,IAAK,SAAS5L,EAAEksG,WAAW/jG,EAAE+jG,SAAmB,OAAV/kG,EAAEgB,EAAEyD,OAAck3E,GAAG9iF,IAAImI,EAAE+jG,SAAS/kG,GAAE,GAAI,MAAMgB,EAAEg6E,cAAcW,GAAG9iF,IAAImI,EAAE+jG,SAAS/jG,EAAEg6E,cAClf,GAAI,MAAM,QAAQ,oBAAoBr+E,EAAEsoG,UAAUpsG,EAAEqsG,QAAQ1Q,IAAI,OAAO1zF,GAAG,IAAK,SAAS,IAAK,QAAQ,IAAK,SAAS,IAAK,WAAWE,IAAIA,EAAEokG,UAAU,MAAMvsG,EAAE,IAAK,MAAMmI,GAAE,EAAG,MAAMnI,EAAE,QAAQmI,GAAE,EAAG,CAACA,IAAIlI,EAAES,OAAO,EAAE,CAAC,OAAOT,EAAE4H,MAAM5H,EAAES,OAAO,IAAIT,EAAES,OAAO,QAAQ,CAAM,OAALoS,GAAE7S,GAAU,KAAK,KAAK,EAAE,GAAGD,GAAG,MAAMC,EAAE4oF,UAAUyhB,GAAGtqG,EAAEC,EAAED,EAAEkgG,cAAc/3F,OAAO,CAAC,GAAG,kBAAkBA,GAAG,OAAOlI,EAAE4oF,UAAU,MAAMv3E,MAAM1J,EAAE,MAAsC,GAAhCK,EAAEk8F,GAAGD,GAAG17F,SAAS27F,GAAGH,GAAGx7F,SAAYy3F,GAAGhgG,GAAG,CAAyC,GAAxCkI,EAAElI,EAAE4oF,UAAU5gF,EAAEhI,EAAEigG,cAAc/3F,EAAEw0F,IAAI18F,GAAKkH,EAAEgB,EAAE0d,YAAY5d,IAC/e,QADofjI,EACvfk/F,IAAY,OAAOl/F,EAAEuhF,KAAK,KAAK,EAAEma,GAAGvzF,EAAE0d,UAAU5d,EAAE,KAAY,EAAPjI,EAAE45B,OAAS,MAAM,KAAK,GAAE,IAAK55B,EAAEkgG,cAAciM,0BAA0BzQ,GAAGvzF,EAAE0d,UAAU5d,EAAE,KAAY,EAAPjI,EAAE45B,OAASzyB,IAAIlH,EAAES,OAAO,EAAE,MAAMyH,GAAG,IAAIF,EAAEi8E,SAASj8E,EAAEA,EAAE26E,eAAe4pB,eAAerkG,IAAKw0F,IAAI18F,EAAEA,EAAE4oF,UAAU1gF,CAAC,CAAM,OAAL2K,GAAE7S,GAAU,KAAK,KAAK,GAA0B,GAAvBuS,GAAE+D,IAAGpO,EAAElI,EAAEkqF,cAAiB,OAAOnqF,GAAG,OAAOA,EAAEmqF,eAAe,OAAOnqF,EAAEmqF,cAAcC,WAAW,CAAC,GAAGvwE,IAAG,OAAOslF,IAAI,KAAY,EAAPl/F,EAAE25B,OAAS,KAAa,IAAR35B,EAAES,OAAWy/F,KAAKC,KAAKngG,EAAES,OAAO,MAAMyG,GAAE,OAAQ,GAAGA,EAAE84F,GAAGhgG,GAAG,OAAOkI,GAAG,OAAOA,EAAEiiF,WAAW,CAAC,GAAG,OAC5fpqF,EAAE,CAAC,IAAImH,EAAE,MAAMmK,MAAM1J,EAAE,MAAqD,KAA7BT,EAAE,QAApBA,EAAElH,EAAEkqF,eAAyBhjF,EAAEijF,WAAW,MAAW,MAAM94E,MAAM1J,EAAE,MAAMT,EAAEw1F,IAAI18F,CAAC,MAAMmgG,KAAK,KAAa,IAARngG,EAAES,SAAaT,EAAEkqF,cAAc,MAAMlqF,EAAES,OAAO,EAAEoS,GAAE7S,GAAGkH,GAAE,CAAE,MAAM,OAAOi4F,KAAK4M,GAAG5M,IAAIA,GAAG,MAAMj4F,GAAE,EAAG,IAAIA,EAAE,OAAe,MAARlH,EAAES,MAAYT,EAAE,IAAI,CAAC,OAAG,KAAa,IAARA,EAAES,QAAkBT,EAAEiiG,MAAMj6F,EAAEhI,KAAEkI,EAAE,OAAOA,MAAO,OAAOnI,GAAG,OAAOA,EAAEmqF,gBAAgBhiF,IAAIlI,EAAEsqF,MAAM7pF,OAAO,KAAK,KAAY,EAAPT,EAAE25B,QAAU,OAAO55B,GAAG,KAAe,EAAVuW,GAAE/N,SAAW,IAAIoK,KAAIA,GAAE,GAAGo4F,OAAO,OAAO/qG,EAAE4iG,cAAc5iG,EAAES,OAAO,GAAGoS,GAAE7S,GAAU,MAAK,KAAK,EAAE,OAAOqkG,KACrf8F,GAAGpqG,EAAEC,GAAG,OAAOD,GAAGs0E,GAAGr0E,EAAE4oF,UAAUqG,eAAep8E,GAAE7S,GAAG,KAAK,KAAK,GAAG,OAAO0hG,GAAG1hG,EAAE8B,KAAKy/E,UAAU1uE,GAAE7S,GAAG,KAA+C,KAAK,GAA0B,GAAvBuS,GAAE+D,IAAwB,QAArBpP,EAAElH,EAAEkqF,eAA0B,OAAOr3E,GAAE7S,GAAG,KAAuC,GAAlCkI,EAAE,KAAa,IAARlI,EAAES,OAA4B,QAAjBwH,EAAEf,EAAEqkG,WAAsB,GAAGrjG,EAAE2jG,GAAG3kG,GAAE,OAAQ,CAAC,GAAG,IAAIyL,IAAG,OAAO5S,GAAG,KAAa,IAARA,EAAEU,OAAW,IAAIV,EAAEC,EAAEsqF,MAAM,OAAOvqF,GAAG,CAAS,GAAG,QAAXkI,EAAEu8F,GAAGzkG,IAAe,CAAmG,IAAlGC,EAAES,OAAO,IAAIorG,GAAG3kG,GAAE,GAAoB,QAAhBgB,EAAED,EAAE26F,eAAuB5iG,EAAE4iG,YAAY16F,EAAElI,EAAES,OAAO,GAAGT,EAAEmrG,aAAa,EAAEjjG,EAAEF,EAAMA,EAAEhI,EAAEsqF,MAAM,OAAOtiF,GAAOjI,EAAEmI,GAANhB,EAAEc,GAAQvH,OAAO,SAC/d,QAAdwH,EAAEf,EAAE6iF,YAAoB7iF,EAAE26F,WAAW,EAAE36F,EAAE+6F,MAAMliG,EAAEmH,EAAEojF,MAAM,KAAKpjF,EAAEikG,aAAa,EAAEjkG,EAAE+4F,cAAc,KAAK/4F,EAAEgjF,cAAc,KAAKhjF,EAAE07F,YAAY,KAAK17F,EAAE66F,aAAa,KAAK76F,EAAE0hF,UAAU,OAAO1hF,EAAE26F,WAAW55F,EAAE45F,WAAW36F,EAAE+6F,MAAMh6F,EAAEg6F,MAAM/6F,EAAEojF,MAAMriF,EAAEqiF,MAAMpjF,EAAEikG,aAAa,EAAEjkG,EAAEq4F,UAAU,KAAKr4F,EAAE+4F,cAAch4F,EAAEg4F,cAAc/4F,EAAEgjF,cAAcjiF,EAAEiiF,cAAchjF,EAAE07F,YAAY36F,EAAE26F,YAAY17F,EAAEpF,KAAKmG,EAAEnG,KAAK/B,EAAEkI,EAAE85F,aAAa76F,EAAE66F,aAAa,OAAOhiG,EAAE,KAAK,CAACkiG,MAAMliG,EAAEkiG,MAAMD,aAAajiG,EAAEiiG,eAAeh6F,EAAEA,EAAEuiF,QAA2B,OAAnB5sE,GAAErH,GAAY,EAAVA,GAAE/N,QAAU,GAAUvI,EAAEsqF,KAAK,CAACvqF,EAClgBA,EAAEwqF,OAAO,CAAC,OAAOrjF,EAAEwkG,MAAMzuF,KAAIuvF,KAAKxsG,EAAES,OAAO,IAAIyH,GAAE,EAAG2jG,GAAG3kG,GAAE,GAAIlH,EAAEiiG,MAAM,QAAQ,KAAK,CAAC,IAAI/5F,EAAE,GAAW,QAARnI,EAAEykG,GAAGv8F,KAAa,GAAGjI,EAAES,OAAO,IAAIyH,GAAE,EAAmB,QAAhBF,EAAEjI,EAAE6iG,eAAuB5iG,EAAE4iG,YAAY56F,EAAEhI,EAAES,OAAO,GAAGorG,GAAG3kG,GAAE,GAAI,OAAOA,EAAEwkG,MAAM,WAAWxkG,EAAEykG,WAAW1jG,EAAE8hF,YAAYnwE,GAAE,OAAO/G,GAAE7S,GAAG,UAAU,EAAEid,KAAI/V,EAAEskG,mBAAmBgB,IAAI,aAAaxkG,IAAIhI,EAAES,OAAO,IAAIyH,GAAE,EAAG2jG,GAAG3kG,GAAE,GAAIlH,EAAEiiG,MAAM,SAAS/6F,EAAEokG,aAAarjG,EAAEsiF,QAAQvqF,EAAEsqF,MAAMtqF,EAAEsqF,MAAMriF,IAAa,QAATD,EAAEd,EAAEukG,MAAczjG,EAAEuiF,QAAQtiF,EAAEjI,EAAEsqF,MAAMriF,EAAEf,EAAEukG,KAAKxjG,EAAE,CAAC,OAAG,OAAOf,EAAEwkG,MAAY1rG,EAAEkH,EAAEwkG,KAAKxkG,EAAEqkG,UAC9evrG,EAAEkH,EAAEwkG,KAAK1rG,EAAEuqF,QAAQrjF,EAAEskG,mBAAmBvuF,KAAIjd,EAAEuqF,QAAQ,KAAKviF,EAAEsO,GAAE/N,QAAQoV,GAAErH,GAAEpO,EAAI,EAAFF,EAAI,EAAI,EAAFA,GAAKhI,IAAE6S,GAAE7S,GAAU,MAAK,KAAK,GAAG,KAAK,GAAG,OAAOysG,KAAKvkG,EAAE,OAAOlI,EAAEkqF,cAAc,OAAOnqF,GAAG,OAAOA,EAAEmqF,gBAAgBhiF,IAAIlI,EAAES,OAAO,MAAMyH,GAAG,KAAY,EAAPlI,EAAE25B,MAAQ,KAAQ,WAAH4vE,MAAiB12F,GAAE7S,GAAkB,EAAfA,EAAEmrG,eAAiBnrG,EAAES,OAAO,OAAOoS,GAAE7S,GAAG,KAAK,KAAK,GAAe,KAAK,GAAG,OAAO,KAAK,MAAMqR,MAAM1J,EAAE,IAAI3H,EAAEshF,KAAM,CAClX,SAASorB,GAAG3sG,EAAEC,GAAS,OAANg/F,GAAGh/F,GAAUA,EAAEshF,KAAK,KAAK,EAAE,OAAOic,GAAGv9F,EAAE8B,OAAO07F,KAAiB,OAAZz9F,EAAEC,EAAES,QAAeT,EAAES,OAAS,MAAHV,EAAS,IAAIC,GAAG,KAAK,KAAK,EAAE,OAAOqkG,KAAK9xF,GAAE2qF,IAAI3qF,GAAE+N,IAAGqkF,KAAe,KAAO,OAAjB5kG,EAAEC,EAAES,SAAqB,KAAO,IAAFV,IAAQC,EAAES,OAAS,MAAHV,EAAS,IAAIC,GAAG,KAAK,KAAK,EAAE,OAAOukG,GAAGvkG,GAAG,KAAK,KAAK,GAA0B,GAAvBuS,GAAE+D,IAAwB,QAArBvW,EAAEC,EAAEkqF,gBAA2B,OAAOnqF,EAAEoqF,WAAW,CAAC,GAAG,OAAOnqF,EAAE+pF,UAAU,MAAM14E,MAAM1J,EAAE,MAAMw4F,IAAI,CAAW,OAAS,OAAnBpgG,EAAEC,EAAES,QAAsBT,EAAES,OAAS,MAAHV,EAAS,IAAIC,GAAG,KAAK,KAAK,GAAG,OAAOuS,GAAE+D,IAAG,KAAK,KAAK,EAAE,OAAO+tF,KAAK,KAAK,KAAK,GAAG,OAAO3C,GAAG1hG,EAAE8B,KAAKy/E,UAAU,KAAK,KAAK,GAAG,KAAK,GAAG,OAAOkrB,KAC1gB,KAAyB,QAAQ,OAAO,KAAK,CArB7CvC,GAAG,SAASnqG,EAAEC,GAAG,IAAI,IAAIgI,EAAEhI,EAAEsqF,MAAM,OAAOtiF,GAAG,CAAC,GAAG,IAAIA,EAAEs5E,KAAK,IAAIt5E,EAAEs5E,IAAIvhF,EAAE82D,YAAY7uD,EAAE4gF,gBAAgB,GAAG,IAAI5gF,EAAEs5E,KAAK,OAAOt5E,EAAEsiF,MAAM,CAACtiF,EAAEsiF,MAAMN,OAAOhiF,EAAEA,EAAEA,EAAEsiF,MAAM,QAAQ,CAAC,GAAGtiF,IAAIhI,EAAE,MAAM,KAAK,OAAOgI,EAAEuiF,SAAS,CAAC,GAAG,OAAOviF,EAAEgiF,QAAQhiF,EAAEgiF,SAAShqF,EAAE,OAAOgI,EAAEA,EAAEgiF,MAAM,CAAChiF,EAAEuiF,QAAQP,OAAOhiF,EAAEgiF,OAAOhiF,EAAEA,EAAEuiF,OAAO,CAAC,EAAE4f,GAAG,WAAW,EACxTC,GAAG,SAASrqG,EAAEC,EAAEgI,EAAEE,GAAG,IAAIrE,EAAE9D,EAAEkgG,cAAc,GAAGp8F,IAAIqE,EAAE,CAACnI,EAAEC,EAAE4oF,UAAUsb,GAAGH,GAAGx7F,SAAS,IAA4RN,EAAxRf,EAAE,KAAK,OAAOc,GAAG,IAAK,QAAQnE,EAAE6+D,EAAG3iE,EAAE8D,GAAGqE,EAAEw6D,EAAG3iE,EAAEmI,GAAGhB,EAAE,GAAG,MAAM,IAAK,SAASrD,EAAE+S,EAAE,CAAC,EAAE/S,EAAE,CAAC8H,WAAM,IAASzD,EAAE0O,EAAE,CAAC,EAAE1O,EAAE,CAACyD,WAAM,IAASzE,EAAE,GAAG,MAAM,IAAK,WAAWrD,EAAEo/E,GAAGljF,EAAE8D,GAAGqE,EAAE+6E,GAAGljF,EAAEmI,GAAGhB,EAAE,GAAG,MAAM,QAAQ,oBAAoBrD,EAAEsoG,SAAS,oBAAoBjkG,EAAEikG,UAAUpsG,EAAEqsG,QAAQ1Q,IAAyB,IAAIp0F,KAAzBygF,GAAG//E,EAAEE,GAASF,EAAE,KAAcnE,EAAE,IAAIqE,EAAEpH,eAAewG,IAAIzD,EAAE/C,eAAewG,IAAI,MAAMzD,EAAEyD,GAAG,GAAG,UAAUA,EAAE,CAAC,IAAIa,EAAEtE,EAAEyD,GAAG,IAAIW,KAAKE,EAAEA,EAAErH,eAAemH,KACjfD,IAAIA,EAAE,CAAC,GAAGA,EAAEC,GAAG,GAAG,KAAK,4BAA4BX,GAAG,aAAaA,GAAG,mCAAmCA,GAAG,6BAA6BA,GAAG,cAAcA,IAAI0qD,EAAGlxD,eAAewG,GAAGJ,IAAIA,EAAE,KAAKA,EAAEA,GAAG,IAAI0d,KAAKtd,EAAE,OAAO,IAAIA,KAAKY,EAAE,CAAC,IAAIf,EAAEe,EAAEZ,GAAyB,GAAtBa,EAAE,MAAMtE,EAAEA,EAAEyD,QAAG,EAAUY,EAAEpH,eAAewG,IAAIH,IAAIgB,IAAI,MAAMhB,GAAG,MAAMgB,GAAG,GAAG,UAAUb,EAAE,GAAGa,EAAE,CAAC,IAAIF,KAAKE,GAAGA,EAAErH,eAAemH,IAAId,GAAGA,EAAErG,eAAemH,KAAKD,IAAIA,EAAE,CAAC,GAAGA,EAAEC,GAAG,IAAI,IAAIA,KAAKd,EAAEA,EAAErG,eAAemH,IAAIE,EAAEF,KAAKd,EAAEc,KAAKD,IAAIA,EAAE,CAAC,GAAGA,EAAEC,GAAGd,EAAEc,GAAG,MAAMD,IAAId,IAAIA,EAAE,IAAIA,EAAE0d,KAAKtd,EACpfU,IAAIA,EAAEb,MAAM,4BAA4BG,GAAGH,EAAEA,EAAEA,EAAE20F,YAAO,EAAO3zF,EAAEA,EAAEA,EAAE2zF,YAAO,EAAO,MAAM30F,GAAGgB,IAAIhB,IAAID,EAAEA,GAAG,IAAI0d,KAAKtd,EAAEH,IAAI,aAAaG,EAAE,kBAAkBH,GAAG,kBAAkBA,IAAID,EAAEA,GAAG,IAAI0d,KAAKtd,EAAE,GAAGH,GAAG,mCAAmCG,GAAG,6BAA6BA,IAAI0qD,EAAGlxD,eAAewG,IAAI,MAAMH,GAAG,aAAaG,GAAGwS,GAAE,SAAS/Z,GAAGmH,GAAGiB,IAAIhB,IAAID,EAAE,MAAMA,EAAEA,GAAG,IAAI0d,KAAKtd,EAAEH,GAAG,CAACa,IAAId,EAAEA,GAAG,IAAI0d,KAAK,QAAQ5c,GAAG,IAAIV,EAAEJ,GAAKlH,EAAE4iG,YAAYt7F,KAAEtH,EAAES,OAAO,EAAC,CAAC,EAAE4pG,GAAG,SAAStqG,EAAEC,EAAEgI,EAAEE,GAAGF,IAAIE,IAAIlI,EAAES,OAAO,EAAE,EAkBlb,IAAIksG,IAAG,EAAG3vF,IAAE,EAAG4vF,GAAG,oBAAoBC,QAAQA,QAAQj8B,IAAIptD,GAAE,KAAK,SAASspF,GAAG/sG,EAAEC,GAAG,IAAIgI,EAAEjI,EAAE6H,IAAI,GAAG,OAAOI,EAAE,GAAG,oBAAoBA,EAAE,IAAIA,EAAE,KAAK,CAAC,MAAME,GAAG0b,GAAE7jB,EAAEC,EAAEkI,EAAE,MAAMF,EAAEO,QAAQ,IAAI,CAAC,SAASwkG,GAAGhtG,EAAEC,EAAEgI,GAAG,IAAIA,GAAG,CAAC,MAAME,GAAG0b,GAAE7jB,EAAEC,EAAEkI,EAAE,CAAC,CAAC,IAAI8kG,IAAG,EAIxR,SAASC,GAAGltG,EAAEC,EAAEgI,GAAG,IAAIE,EAAElI,EAAE4iG,YAAyC,GAAG,QAAhC16F,EAAE,OAAOA,EAAEA,EAAEy+F,WAAW,MAAiB,CAAC,IAAI9iG,EAAEqE,EAAEA,EAAEg5F,KAAK,EAAE,CAAC,IAAIr9F,EAAEy9E,IAAIvhF,KAAKA,EAAE,CAAC,IAAImH,EAAErD,EAAE+yB,QAAQ/yB,EAAE+yB,aAAQ,OAAO,IAAS1vB,GAAG6lG,GAAG/sG,EAAEgI,EAAEd,EAAE,CAACrD,EAAEA,EAAEq9F,IAAI,OAAOr9F,IAAIqE,EAAE,CAAC,CAAC,SAASglG,GAAGntG,EAAEC,GAAgD,GAAG,QAAhCA,EAAE,QAAlBA,EAAEA,EAAE4iG,aAAuB5iG,EAAE2mG,WAAW,MAAiB,CAAC,IAAI3+F,EAAEhI,EAAEA,EAAEkhG,KAAK,EAAE,CAAC,IAAIl5F,EAAEs5E,IAAIvhF,KAAKA,EAAE,CAAC,IAAImI,EAAEF,EAAEvD,OAAOuD,EAAE4uB,QAAQ1uB,GAAG,CAACF,EAAEA,EAAEk5F,IAAI,OAAOl5F,IAAIhI,EAAE,CAAC,CAAC,SAASmtG,GAAGptG,GAAG,IAAIC,EAAED,EAAE6H,IAAI,GAAG,OAAO5H,EAAE,CAAC,IAAIgI,EAAEjI,EAAE6oF,UAAiB7oF,EAAEuhF,IAA8BvhF,EAAEiI,EAAE,oBAAoBhI,EAAEA,EAAED,GAAGC,EAAEuI,QAAQxI,CAAC,CAAC,CAClf,SAASqtG,GAAGrtG,GAAG,IAAIC,EAAED,EAAEgqF,UAAU,OAAO/pF,IAAID,EAAEgqF,UAAU,KAAKqjB,GAAGptG,IAAID,EAAEuqF,MAAM,KAAKvqF,EAAEw/F,UAAU,KAAKx/F,EAAEwqF,QAAQ,KAAK,IAAIxqF,EAAEuhF,MAAoB,QAAdthF,EAAED,EAAE6oF,oBAA4B5oF,EAAE08F,WAAW18F,EAAE28F,WAAW38F,EAAE06F,WAAW16F,EAAE48F,WAAW58F,EAAE68F,MAAM98F,EAAE6oF,UAAU,KAAK7oF,EAAEiqF,OAAO,KAAKjqF,EAAEgiG,aAAa,KAAKhiG,EAAEkgG,cAAc,KAAKlgG,EAAEmqF,cAAc,KAAKnqF,EAAE0/F,aAAa,KAAK1/F,EAAE6oF,UAAU,KAAK7oF,EAAE6iG,YAAY,IAAI,CAAC,SAASyK,GAAGttG,GAAG,OAAO,IAAIA,EAAEuhF,KAAK,IAAIvhF,EAAEuhF,KAAK,IAAIvhF,EAAEuhF,GAAG,CACna,SAASgsB,GAAGvtG,GAAGA,EAAE,OAAO,CAAC,KAAK,OAAOA,EAAEwqF,SAAS,CAAC,GAAG,OAAOxqF,EAAEiqF,QAAQqjB,GAAGttG,EAAEiqF,QAAQ,OAAO,KAAKjqF,EAAEA,EAAEiqF,MAAM,CAA2B,IAA1BjqF,EAAEwqF,QAAQP,OAAOjqF,EAAEiqF,OAAWjqF,EAAEA,EAAEwqF,QAAQ,IAAIxqF,EAAEuhF,KAAK,IAAIvhF,EAAEuhF,KAAK,KAAKvhF,EAAEuhF,KAAK,CAAC,GAAW,EAARvhF,EAAEU,MAAQ,SAASV,EAAE,GAAG,OAAOA,EAAEuqF,OAAO,IAAIvqF,EAAEuhF,IAAI,SAASvhF,EAAOA,EAAEuqF,MAAMN,OAAOjqF,EAAEA,EAAEA,EAAEuqF,KAAK,CAAC,KAAa,EAARvqF,EAAEU,OAAS,OAAOV,EAAE6oF,SAAS,CAAC,CACzT,SAAS2kB,GAAGxtG,EAAEC,EAAEgI,GAAG,IAAIE,EAAEnI,EAAEuhF,IAAI,GAAG,IAAIp5E,GAAG,IAAIA,EAAEnI,EAAEA,EAAE6oF,UAAU5oF,EAAE,IAAIgI,EAAEi8E,SAASj8E,EAAEsgF,WAAWklB,aAAaztG,EAAEC,GAAGgI,EAAEwlG,aAAaztG,EAAEC,IAAI,IAAIgI,EAAEi8E,UAAUjkF,EAAEgI,EAAEsgF,YAAaklB,aAAaztG,EAAEiI,IAAKhI,EAAEgI,GAAI6uD,YAAY92D,GAA4B,QAAxBiI,EAAEA,EAAEylG,2BAA8B,IAASzlG,GAAG,OAAOhI,EAAEosG,UAAUpsG,EAAEosG,QAAQ1Q,UAAU,GAAG,IAAIxzF,GAAc,QAAVnI,EAAEA,EAAEuqF,OAAgB,IAAIijB,GAAGxtG,EAAEC,EAAEgI,GAAGjI,EAAEA,EAAEwqF,QAAQ,OAAOxqF,GAAGwtG,GAAGxtG,EAAEC,EAAEgI,GAAGjI,EAAEA,EAAEwqF,OAAO,CAC1X,SAASmjB,GAAG3tG,EAAEC,EAAEgI,GAAG,IAAIE,EAAEnI,EAAEuhF,IAAI,GAAG,IAAIp5E,GAAG,IAAIA,EAAEnI,EAAEA,EAAE6oF,UAAU5oF,EAAEgI,EAAEwlG,aAAaztG,EAAEC,GAAGgI,EAAE6uD,YAAY92D,QAAQ,GAAG,IAAImI,GAAc,QAAVnI,EAAEA,EAAEuqF,OAAgB,IAAIojB,GAAG3tG,EAAEC,EAAEgI,GAAGjI,EAAEA,EAAEwqF,QAAQ,OAAOxqF,GAAG2tG,GAAG3tG,EAAEC,EAAEgI,GAAGjI,EAAEA,EAAEwqF,OAAO,CAAC,IAAIrmE,GAAE,KAAKypF,IAAG,EAAG,SAASC,GAAG7tG,EAAEC,EAAEgI,GAAG,IAAIA,EAAEA,EAAEsiF,MAAM,OAAOtiF,GAAG6lG,GAAG9tG,EAAEC,EAAEgI,GAAGA,EAAEA,EAAEuiF,OAAO,CACnR,SAASsjB,GAAG9tG,EAAEC,EAAEgI,GAAG,GAAG+jF,IAAI,oBAAoBA,GAAG+hB,qBAAqB,IAAI/hB,GAAG+hB,qBAAqBhiB,GAAG9jF,EAAE,CAAC,MAAMG,GAAG,CAAC,OAAOH,EAAEs5E,KAAK,KAAK,EAAEtkE,IAAG8vF,GAAG9kG,EAAEhI,GAAG,KAAK,EAAE,IAAIkI,EAAEgc,GAAErgB,EAAE8pG,GAAGzpF,GAAE,KAAK0pF,GAAG7tG,EAAEC,EAAEgI,GAAO2lG,GAAG9pG,EAAE,QAATqgB,GAAEhc,KAAkBylG,IAAI5tG,EAAEmkB,GAAElc,EAAEA,EAAE4gF,UAAU,IAAI7oF,EAAEkkF,SAASlkF,EAAEuoF,WAAWnvB,YAAYnxD,GAAGjI,EAAEo5D,YAAYnxD,IAAIkc,GAAEi1C,YAAYnxD,EAAE4gF,YAAY,MAAM,KAAK,GAAG,OAAO1kE,KAAIypF,IAAI5tG,EAAEmkB,GAAElc,EAAEA,EAAE4gF,UAAU,IAAI7oF,EAAEkkF,SAASoY,GAAGt8F,EAAEuoF,WAAWtgF,GAAG,IAAIjI,EAAEkkF,UAAUoY,GAAGt8F,EAAEiI,GAAGunF,GAAGxvF,IAAIs8F,GAAGn4E,GAAElc,EAAE4gF,YAAY,MAAM,KAAK,EAAE1gF,EAAEgc,GAAErgB,EAAE8pG,GAAGzpF,GAAElc,EAAE4gF,UAAUqG,cAAc0e,IAAG,EAClfC,GAAG7tG,EAAEC,EAAEgI,GAAGkc,GAAEhc,EAAEylG,GAAG9pG,EAAE,MAAM,KAAK,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,IAAImZ,KAAoB,QAAhB9U,EAAEF,EAAE46F,cAAsC,QAAf16F,EAAEA,EAAEy+F,aAAsB,CAAC9iG,EAAEqE,EAAEA,EAAEg5F,KAAK,EAAE,CAAC,IAAIh6F,EAAErD,EAAEoE,EAAEf,EAAE0vB,QAAQ1vB,EAAEA,EAAEo6E,SAAI,IAASr5E,IAAI,KAAO,EAAFf,IAAe,KAAO,EAAFA,KAAf6lG,GAAG/kG,EAAEhI,EAAEiI,GAAyBpE,EAAEA,EAAEq9F,IAAI,OAAOr9F,IAAIqE,EAAE,CAAC0lG,GAAG7tG,EAAEC,EAAEgI,GAAG,MAAM,KAAK,EAAE,IAAIgV,KAAI8vF,GAAG9kG,EAAEhI,GAAiB,oBAAdkI,EAAEF,EAAE4gF,WAAgCmlB,sBAAsB,IAAI7lG,EAAEG,MAAML,EAAEi4F,cAAc/3F,EAAEstC,MAAMxtC,EAAEkiF,cAAchiF,EAAE6lG,sBAAsB,CAAC,MAAM5lG,GAAGyb,GAAE5b,EAAEhI,EAAEmI,EAAE,CAACylG,GAAG7tG,EAAEC,EAAEgI,GAAG,MAAM,KAAK,GAAG4lG,GAAG7tG,EAAEC,EAAEgI,GAAG,MAAM,KAAK,GAAU,EAAPA,EAAE2xB,MAAQ3c,IAAG9U,EAAE8U,KAAI,OAChfhV,EAAEkiF,cAAc0jB,GAAG7tG,EAAEC,EAAEgI,GAAGgV,GAAE9U,GAAG0lG,GAAG7tG,EAAEC,EAAEgI,GAAG,MAAM,QAAQ4lG,GAAG7tG,EAAEC,EAAEgI,GAAG,CAAC,SAASgmG,GAAGjuG,GAAG,IAAIC,EAAED,EAAE6iG,YAAY,GAAG,OAAO5iG,EAAE,CAACD,EAAE6iG,YAAY,KAAK,IAAI56F,EAAEjI,EAAE6oF,UAAU,OAAO5gF,IAAIA,EAAEjI,EAAE6oF,UAAU,IAAIgkB,IAAI5sG,EAAEuN,SAAQ,SAASvN,GAAG,IAAIkI,EAAE+lG,GAAGlqG,KAAK,KAAKhE,EAAEC,GAAGgI,EAAEmkB,IAAInsB,KAAKgI,EAAEw4E,IAAIxgF,GAAGA,EAAE6mC,KAAK3+B,EAAEA,GAAG,GAAE,CAAC,CACzQ,SAASgmG,GAAGnuG,EAAEC,GAAG,IAAIgI,EAAEhI,EAAEu/F,UAAU,GAAG,OAAOv3F,EAAE,IAAI,IAAIE,EAAE,EAAEA,EAAEF,EAAE9H,OAAOgI,IAAI,CAAC,IAAIrE,EAAEmE,EAAEE,GAAG,IAAI,IAAIhB,EAAEnH,EAAEkI,EAAEjI,EAAEmI,EAAEF,EAAElI,EAAE,KAAK,OAAOoI,GAAG,CAAC,OAAOA,EAAEm5E,KAAK,KAAK,EAAEp9D,GAAE/b,EAAEygF,UAAU+kB,IAAG,EAAG,MAAM5tG,EAAE,KAAK,EAA4C,KAAK,EAAEmkB,GAAE/b,EAAEygF,UAAUqG,cAAc0e,IAAG,EAAG,MAAM5tG,EAAEoI,EAAEA,EAAE6hF,MAAM,CAAC,GAAG,OAAO9lE,GAAE,MAAM7S,MAAM1J,EAAE,MAAMkmG,GAAG3mG,EAAEe,EAAEpE,GAAGqgB,GAAE,KAAKypF,IAAG,EAAG,IAAIxmG,EAAEtD,EAAEkmF,UAAU,OAAO5iF,IAAIA,EAAE6iF,OAAO,MAAMnmF,EAAEmmF,OAAO,IAAI,CAAC,MAAM1iF,GAAGsc,GAAE/f,EAAE7D,EAAEsH,EAAE,CAAC,CAAC,GAAkB,MAAftH,EAAEmrG,aAAmB,IAAInrG,EAAEA,EAAEsqF,MAAM,OAAOtqF,GAAGmuG,GAAGnuG,EAAED,GAAGC,EAAEA,EAAEuqF,OAAO,CACje,SAAS4jB,GAAGpuG,EAAEC,GAAG,IAAIgI,EAAEjI,EAAEgqF,UAAU7hF,EAAEnI,EAAEU,MAAM,OAAOV,EAAEuhF,KAAK,KAAK,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAiB,GAAd4sB,GAAGluG,EAAED,GAAGquG,GAAGruG,GAAQ,EAAFmI,EAAI,CAAC,IAAI+kG,GAAG,EAAEltG,EAAEA,EAAEiqF,QAAQkjB,GAAG,EAAEntG,EAAE,CAAC,MAAMkR,GAAG2S,GAAE7jB,EAAEA,EAAEiqF,OAAO/4E,EAAE,CAAC,IAAIg8F,GAAG,EAAEltG,EAAEA,EAAEiqF,OAAO,CAAC,MAAM/4E,GAAG2S,GAAE7jB,EAAEA,EAAEiqF,OAAO/4E,EAAE,CAAC,CAAC,MAAM,KAAK,EAAEi9F,GAAGluG,EAAED,GAAGquG,GAAGruG,GAAK,IAAFmI,GAAO,OAAOF,GAAG8kG,GAAG9kG,EAAEA,EAAEgiF,QAAQ,MAAM,KAAK,EAAgD,GAA9CkkB,GAAGluG,EAAED,GAAGquG,GAAGruG,GAAK,IAAFmI,GAAO,OAAOF,GAAG8kG,GAAG9kG,EAAEA,EAAEgiF,QAAmB,GAARjqF,EAAEU,MAAS,CAAC,IAAIoD,EAAE9D,EAAE6oF,UAAU,IAAI7E,GAAGlgF,EAAE,GAAG,CAAC,MAAMoN,GAAG2S,GAAE7jB,EAAEA,EAAEiqF,OAAO/4E,EAAE,CAAC,CAAC,GAAK,EAAF/I,GAAoB,OAAdrE,EAAE9D,EAAE6oF,WAAmB,CAAC,IAAI1hF,EAAEnH,EAAEkgG,cAAch4F,EAAE,OAAOD,EAAEA,EAAEi4F,cAAc/4F,EAAEiB,EAAEpI,EAAE+B,KAAKqF,EAAEpH,EAAE6iG,YACje,GAAnB7iG,EAAE6iG,YAAY,KAAQ,OAAOz7F,EAAE,IAAI,UAAUgB,GAAG,UAAUjB,EAAEpF,MAAM,MAAMoF,EAAElF,MAAMugF,EAAG1+E,EAAEqD,GAAG8gF,GAAG7/E,EAAEF,GAAG,IAAIX,EAAE0gF,GAAG7/E,EAAEjB,GAAG,IAAIe,EAAE,EAAEA,EAAEd,EAAEjH,OAAO+H,GAAG,EAAE,CAAC,IAAIV,EAAEJ,EAAEc,GAAGF,EAAEZ,EAAEc,EAAE,GAAG,UAAUV,EAAEy/E,GAAGnjF,EAAEkE,GAAG,4BAA4BR,EAAEoiD,GAAG9lD,EAAEkE,GAAG,aAAaR,EAAEw8E,GAAGlgF,EAAEkE,GAAG4qD,EAAG9uD,EAAE0D,EAAEQ,EAAET,EAAE,CAAC,OAAOa,GAAG,IAAK,QAAQq6E,EAAG3+E,EAAEqD,GAAG,MAAM,IAAK,WAAWm8E,GAAGx/E,EAAEqD,GAAG,MAAM,IAAK,SAAS,IAAI4J,EAAEjN,EAAEs+E,cAAc6pB,YAAYnoG,EAAEs+E,cAAc6pB,cAAc9kG,EAAE+kG,SAAS,IAAIt9F,EAAEzH,EAAEyE,MAAM,MAAMgD,EAAEk0E,GAAGh/E,IAAIqD,EAAE+kG,SAASt9F,GAAE,GAAImC,MAAM5J,EAAE+kG,WAAW,MAAM/kG,EAAEg7E,aAAaW,GAAGh/E,IAAIqD,EAAE+kG,SACnf/kG,EAAEg7E,cAAa,GAAIW,GAAGh/E,IAAIqD,EAAE+kG,SAAS/kG,EAAE+kG,SAAS,GAAG,IAAG,IAAKpoG,EAAE84F,IAAIz1F,CAAC,CAAC,MAAM+J,GAAG2S,GAAE7jB,EAAEA,EAAEiqF,OAAO/4E,EAAE,CAAC,CAAC,MAAM,KAAK,EAAgB,GAAdi9F,GAAGluG,EAAED,GAAGquG,GAAGruG,GAAQ,EAAFmI,EAAI,CAAC,GAAG,OAAOnI,EAAE6oF,UAAU,MAAMv3E,MAAM1J,EAAE,MAAM9D,EAAE9D,EAAE6oF,UAAU1hF,EAAEnH,EAAEkgG,cAAc,IAAIp8F,EAAE+hB,UAAU1e,CAAC,CAAC,MAAM+J,GAAG2S,GAAE7jB,EAAEA,EAAEiqF,OAAO/4E,EAAE,CAAC,CAAC,MAAM,KAAK,EAAgB,GAAdi9F,GAAGluG,EAAED,GAAGquG,GAAGruG,GAAQ,EAAFmI,GAAK,OAAOF,GAAGA,EAAEkiF,cAAc8E,aAAa,IAAIO,GAAGvvF,EAAEivF,cAAc,CAAC,MAAMh+E,GAAG2S,GAAE7jB,EAAEA,EAAEiqF,OAAO/4E,EAAE,CAAC,MAAM,KAAK,EAG4G,QAAQi9F,GAAGluG,EACnfD,GAAGquG,GAAGruG,SAJ4Y,KAAK,GAAGmuG,GAAGluG,EAAED,GAAGquG,GAAGruG,GAAqB,MAAlB8D,EAAE9D,EAAEuqF,OAAQ7pF,QAAayG,EAAE,OAAOrD,EAAEqmF,cAAcrmF,EAAE+kF,UAAUylB,SAASnnG,GAAGA,GAClf,OAAOrD,EAAEkmF,WAAW,OAAOlmF,EAAEkmF,UAAUG,gBAAgBokB,GAAGrxF,OAAQ,EAAF/U,GAAK8lG,GAAGjuG,GAAG,MAAM,KAAK,GAAsF,GAAnFwH,EAAE,OAAOS,GAAG,OAAOA,EAAEkiF,cAAqB,EAAPnqF,EAAE45B,MAAQ3c,IAAG1V,EAAE0V,KAAIzV,EAAE2mG,GAAGluG,EAAED,GAAGid,GAAE1V,GAAG4mG,GAAGluG,EAAED,GAAGquG,GAAGruG,GAAQ,KAAFmI,EAAO,CAA0B,GAAzBZ,EAAE,OAAOvH,EAAEmqF,eAAkBnqF,EAAE6oF,UAAUylB,SAAS/mG,KAAKC,GAAG,KAAY,EAAPxH,EAAE45B,MAAQ,IAAInW,GAAEzjB,EAAEwH,EAAExH,EAAEuqF,MAAM,OAAO/iF,GAAG,CAAC,IAAIQ,EAAEyb,GAAEjc,EAAE,OAAOic,IAAG,CAAe,OAAV7U,GAAJmC,EAAE0S,IAAM8mE,MAAax5E,EAAEwwE,KAAK,KAAK,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG2rB,GAAG,EAAEn8F,EAAEA,EAAEk5E,QAAQ,MAAM,KAAK,EAAE8iB,GAAGh8F,EAAEA,EAAEk5E,QAAQ,IAAIxiF,EAAEsJ,EAAE83E,UAAU,GAAG,oBAAoBphF,EAAEumG,qBAAqB,CAAC7lG,EAAE4I,EAAE9I,EAAE8I,EAAEk5E,OAAO,IAAIhqF,EAAEkI,EAAEV,EAAEa,MACpfrI,EAAEigG,cAAcz4F,EAAEguC,MAAMx1C,EAAEkqF,cAAc1iF,EAAEumG,sBAAsB,CAAC,MAAM98F,GAAG2S,GAAE1b,EAAEF,EAAEiJ,EAAE,CAAC,CAAC,MAAM,KAAK,EAAE67F,GAAGh8F,EAAEA,EAAEk5E,QAAQ,MAAM,KAAK,GAAG,GAAG,OAAOl5E,EAAEo5E,cAAc,CAACqkB,GAAGxmG,GAAG,QAAQ,EAAE,OAAO4G,GAAGA,EAAEq7E,OAAOl5E,EAAE0S,GAAE7U,GAAG4/F,GAAGxmG,EAAE,CAACR,EAAEA,EAAEgjF,OAAO,CAACxqF,EAAE,IAAIwH,EAAE,KAAKQ,EAAEhI,IAAI,CAAC,GAAG,IAAIgI,EAAEu5E,KAAK,GAAG,OAAO/5E,EAAE,CAACA,EAAEQ,EAAE,IAAIlE,EAAEkE,EAAE6gF,UAAUthF,EAAa,oBAAVJ,EAAErD,EAAEojF,OAA4BC,YAAYhgF,EAAEggF,YAAY,UAAU,OAAO,aAAahgF,EAAEsnG,QAAQ,QAASrmG,EAAEJ,EAAE6gF,UAAkC3gF,OAAE,KAA1Bd,EAAEY,EAAEk4F,cAAchZ,QAAoB,OAAO9/E,GAAGA,EAAErG,eAAe,WAAWqG,EAAEqnG,QAAQ,KAAKrmG,EAAE8+E,MAAMunB,QACzfznB,GAAG,UAAU9+E,GAAG,CAAC,MAAMgJ,GAAG2S,GAAE7jB,EAAEA,EAAEiqF,OAAO/4E,EAAE,CAAC,OAAO,GAAG,IAAIlJ,EAAEu5E,KAAK,GAAG,OAAO/5E,EAAE,IAAIQ,EAAE6gF,UAAUhjE,UAAUte,EAAE,GAAGS,EAAEk4F,aAAa,CAAC,MAAMhvF,GAAG2S,GAAE7jB,EAAEA,EAAEiqF,OAAO/4E,EAAE,OAAO,IAAI,KAAKlJ,EAAEu5E,KAAK,KAAKv5E,EAAEu5E,KAAK,OAAOv5E,EAAEmiF,eAAeniF,IAAIhI,IAAI,OAAOgI,EAAEuiF,MAAM,CAACviF,EAAEuiF,MAAMN,OAAOjiF,EAAEA,EAAEA,EAAEuiF,MAAM,QAAQ,CAAC,GAAGviF,IAAIhI,EAAE,MAAMA,EAAE,KAAK,OAAOgI,EAAEwiF,SAAS,CAAC,GAAG,OAAOxiF,EAAEiiF,QAAQjiF,EAAEiiF,SAASjqF,EAAE,MAAMA,EAAEwH,IAAIQ,IAAIR,EAAE,MAAMQ,EAAEA,EAAEiiF,MAAM,CAACziF,IAAIQ,IAAIR,EAAE,MAAMQ,EAAEwiF,QAAQP,OAAOjiF,EAAEiiF,OAAOjiF,EAAEA,EAAEwiF,OAAO,CAAC,CAAC,MAAM,KAAK,GAAG2jB,GAAGluG,EAAED,GAAGquG,GAAGruG,GAAK,EAAFmI,GAAK8lG,GAAGjuG,GAAS,KAAK,IACtd,CAAC,SAASquG,GAAGruG,GAAG,IAAIC,EAAED,EAAEU,MAAM,GAAK,EAAFT,EAAI,CAAC,IAAID,EAAE,CAAC,IAAI,IAAIiI,EAAEjI,EAAEiqF,OAAO,OAAOhiF,GAAG,CAAC,GAAGqlG,GAAGrlG,GAAG,CAAC,IAAIE,EAAEF,EAAE,MAAMjI,CAAC,CAACiI,EAAEA,EAAEgiF,MAAM,CAAC,MAAM34E,MAAM1J,EAAE,KAAM,CAAC,OAAOO,EAAEo5E,KAAK,KAAK,EAAE,IAAIz9E,EAAEqE,EAAE0gF,UAAkB,GAAR1gF,EAAEzH,QAAWsjF,GAAGlgF,EAAE,IAAIqE,EAAEzH,QAAQ,IAAgBitG,GAAG3tG,EAATutG,GAAGvtG,GAAU8D,GAAG,MAAM,KAAK,EAAE,KAAK,EAAE,IAAIoE,EAAEC,EAAE0gF,UAAUqG,cAAsBse,GAAGxtG,EAATutG,GAAGvtG,GAAUkI,GAAG,MAAM,QAAQ,MAAMoJ,MAAM1J,EAAE,MAAO,CAAC,MAAMR,GAAGyc,GAAE7jB,EAAEA,EAAEiqF,OAAO7iF,EAAE,CAACpH,EAAEU,QAAQ,CAAC,CAAG,KAAFT,IAASD,EAAEU,QAAQ,KAAK,CAAC,SAASguG,GAAG1uG,EAAEC,EAAEgI,GAAGwb,GAAEzjB,EAAE2uG,GAAG3uG,EAAEC,EAAEgI,EAAE,CACvb,SAAS0mG,GAAG3uG,EAAEC,EAAEgI,GAAG,IAAI,IAAIE,EAAE,KAAY,EAAPnI,EAAE45B,MAAQ,OAAOnW,IAAG,CAAC,IAAI3f,EAAE2f,GAAEtc,EAAErD,EAAEymF,MAAM,GAAG,KAAKzmF,EAAEy9E,KAAKp5E,EAAE,CAAC,IAAID,EAAE,OAAOpE,EAAEqmF,eAAeyiB,GAAG,IAAI1kG,EAAE,CAAC,IAAIE,EAAEtE,EAAEkmF,UAAU5iF,EAAE,OAAOgB,GAAG,OAAOA,EAAE+hF,eAAeltE,GAAE7U,EAAEwkG,GAAG,IAAIrlG,EAAE0V,GAAO,GAAL2vF,GAAG1kG,GAAM+U,GAAE7V,KAAKG,EAAE,IAAIkc,GAAE3f,EAAE,OAAO2f,IAAOrc,GAAJc,EAAEub,IAAM8mE,MAAM,KAAKriF,EAAEq5E,KAAK,OAAOr5E,EAAEiiF,cAAcykB,GAAG9qG,GAAG,OAAOsD,GAAGA,EAAE6iF,OAAO/hF,EAAEub,GAAErc,GAAGwnG,GAAG9qG,GAAG,KAAK,OAAOqD,GAAGsc,GAAEtc,EAAEwnG,GAAGxnG,EAAElH,EAAEgI,GAAGd,EAAEA,EAAEqjF,QAAQ/mE,GAAE3f,EAAE8oG,GAAGxkG,EAAE6U,GAAE1V,CAAC,CAACsnG,GAAG7uG,EAAM,MAAM,KAAoB,KAAf8D,EAAEsnG,eAAoB,OAAOjkG,GAAGA,EAAE8iF,OAAOnmF,EAAE2f,GAAEtc,GAAG0nG,GAAG7uG,EAAM,CAAC,CACvc,SAAS6uG,GAAG7uG,GAAG,KAAK,OAAOyjB,IAAG,CAAC,IAAIxjB,EAAEwjB,GAAE,GAAG,KAAa,KAARxjB,EAAES,OAAY,CAAC,IAAIuH,EAAEhI,EAAE+pF,UAAU,IAAI,GAAG,KAAa,KAAR/pF,EAAES,OAAY,OAAOT,EAAEshF,KAAK,KAAK,EAAE,KAAK,GAAG,KAAK,GAAGtkE,IAAGkwF,GAAG,EAAEltG,GAAG,MAAM,KAAK,EAAE,IAAIkI,EAAElI,EAAE4oF,UAAU,GAAW,EAAR5oF,EAAES,QAAUuc,GAAE,GAAG,OAAOhV,EAAEE,EAAEugG,wBAAwB,CAAC,IAAI5kG,EAAE7D,EAAEs/F,cAAct/F,EAAE8B,KAAKkG,EAAEi4F,cAAcnsD,GAAG9zC,EAAE8B,KAAKkG,EAAEi4F,eAAe/3F,EAAE2hG,mBAAmBhmG,EAAEmE,EAAEkiF,cAAchiF,EAAE2mG,oCAAoC,CAAC,IAAI3nG,EAAElH,EAAE4iG,YAAY,OAAO17F,GAAG28F,GAAG7jG,EAAEkH,EAAEgB,GAAG,MAAM,KAAK,EAAE,IAAID,EAAEjI,EAAE4iG,YAAY,GAAG,OAAO36F,EAAE,CAAQ,GAAPD,EAAE,KAAQ,OAAOhI,EAAEsqF,MAAM,OAAOtqF,EAAEsqF,MAAMhJ,KAAK,KAAK,EACvf,KAAK,EAAEt5E,EAAEhI,EAAEsqF,MAAM1B,UAAUib,GAAG7jG,EAAEiI,EAAED,EAAE,CAAC,MAAM,KAAK,EAAE,IAAIG,EAAEnI,EAAE4oF,UAAU,GAAG,OAAO5gF,GAAW,EAARhI,EAAES,MAAQ,CAACuH,EAAEG,EAAE,IAAIhB,EAAEnH,EAAEigG,cAAc,OAAOjgG,EAAE8B,MAAM,IAAK,SAAS,IAAK,QAAQ,IAAK,SAAS,IAAK,WAAWqF,EAAEmlG,WAAWtkG,EAAEwxF,QAAQ,MAAM,IAAK,MAAMryF,EAAEyvD,MAAM5uD,EAAE4uD,IAAIzvD,EAAEyvD,KAAK,CAAC,MAAM,KAAK,EAAQ,KAAK,EAAQ,KAAK,GAAyJ,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAhM,KAAK,GAAG,GAAG,OAAO52D,EAAEkqF,cAAc,CAAC,IAAI5iF,EAAEtH,EAAE+pF,UAAU,GAAG,OAAOziF,EAAE,CAAC,IAAIC,EAAED,EAAE4iF,cAAc,GAAG,OAAO3iF,EAAE,CAAC,IAAIQ,EAAER,EAAE4iF,WAAW,OAAOpiF,GAAGwnF,GAAGxnF,EAAE,CAAC,CAAC,CAAC,MAC5c,QAAQ,MAAMsJ,MAAM1J,EAAE,MAAOqV,IAAW,IAARhd,EAAES,OAAW0sG,GAAGntG,EAAE,CAAC,MAAM8Q,GAAG8S,GAAE5jB,EAAEA,EAAEgqF,OAAOl5E,EAAE,CAAC,CAAC,GAAG9Q,IAAID,EAAE,CAACyjB,GAAE,KAAK,KAAK,CAAa,GAAG,QAAfxb,EAAEhI,EAAEuqF,SAAoB,CAACviF,EAAEgiF,OAAOhqF,EAAEgqF,OAAOxmE,GAAExb,EAAE,KAAK,CAACwb,GAAExjB,EAAEgqF,MAAM,CAAC,CAAC,SAASukB,GAAGxuG,GAAG,KAAK,OAAOyjB,IAAG,CAAC,IAAIxjB,EAAEwjB,GAAE,GAAGxjB,IAAID,EAAE,CAACyjB,GAAE,KAAK,KAAK,CAAC,IAAIxb,EAAEhI,EAAEuqF,QAAQ,GAAG,OAAOviF,EAAE,CAACA,EAAEgiF,OAAOhqF,EAAEgqF,OAAOxmE,GAAExb,EAAE,KAAK,CAACwb,GAAExjB,EAAEgqF,MAAM,CAAC,CACvS,SAAS2kB,GAAG5uG,GAAG,KAAK,OAAOyjB,IAAG,CAAC,IAAIxjB,EAAEwjB,GAAE,IAAI,OAAOxjB,EAAEshF,KAAK,KAAK,EAAE,KAAK,GAAG,KAAK,GAAG,IAAIt5E,EAAEhI,EAAEgqF,OAAO,IAAIkjB,GAAG,EAAEltG,EAAE,CAAC,MAAMmH,GAAGyc,GAAE5jB,EAAEgI,EAAEb,EAAE,CAAC,MAAM,KAAK,EAAE,IAAIe,EAAElI,EAAE4oF,UAAU,GAAG,oBAAoB1gF,EAAEugG,kBAAkB,CAAC,IAAI5kG,EAAE7D,EAAEgqF,OAAO,IAAI9hF,EAAEugG,mBAAmB,CAAC,MAAMthG,GAAGyc,GAAE5jB,EAAE6D,EAAEsD,EAAE,CAAC,CAAC,IAAID,EAAElH,EAAEgqF,OAAO,IAAImjB,GAAGntG,EAAE,CAAC,MAAMmH,GAAGyc,GAAE5jB,EAAEkH,EAAEC,EAAE,CAAC,MAAM,KAAK,EAAE,IAAIc,EAAEjI,EAAEgqF,OAAO,IAAImjB,GAAGntG,EAAE,CAAC,MAAMmH,GAAGyc,GAAE5jB,EAAEiI,EAAEd,EAAE,EAAE,CAAC,MAAMA,GAAGyc,GAAE5jB,EAAEA,EAAEgqF,OAAO7iF,EAAE,CAAC,GAAGnH,IAAID,EAAE,CAACyjB,GAAE,KAAK,KAAK,CAAC,IAAIrb,EAAEnI,EAAEuqF,QAAQ,GAAG,OAAOpiF,EAAE,CAACA,EAAE6hF,OAAOhqF,EAAEgqF,OAAOxmE,GAAErb,EAAE,KAAK,CAACqb,GAAExjB,EAAEgqF,MAAM,CAAC,CAC7d,IAwBkN8kB,GAxB9MC,GAAGt8F,KAAK0zB,KAAK6oE,GAAG11C,EAAGwrC,uBAAuBmK,GAAG31C,EAAG5xD,kBAAkB8vE,GAAGle,EAAGm2B,wBAAwB1vE,GAAE,EAAEqE,GAAE,KAAKkH,GAAE,KAAK+I,GAAE,EAAEk1E,GAAG,EAAED,GAAGtM,GAAG,GAAGrqF,GAAE,EAAEu8F,GAAG,KAAKtL,GAAG,EAAEuL,GAAG,EAAEC,GAAG,EAAEC,GAAG,KAAKC,GAAG,KAAKhB,GAAG,EAAE9B,GAAG+C,IAASC,GAAG,KAAK5zD,IAAG,EAAGpB,GAAG,KAAKhH,GAAG,KAAKi8D,IAAG,EAAGC,GAAG,KAAKC,GAAG,EAAEC,GAAG,EAAEC,GAAG,KAAKC,IAAI,EAAEC,GAAG,EAAE,SAASx2F,KAAI,OAAO,KAAO,EAAFwG,IAAK9C,MAAK,IAAI6yF,GAAGA,GAAGA,GAAG7yF,IAAG,CAChU,SAAS80B,GAAGhyC,GAAG,OAAG,KAAY,EAAPA,EAAE45B,MAAe,EAAK,KAAO,EAAF5Z,KAAM,IAAIsU,GAASA,IAAGA,GAAK,OAAOgsE,GAAGzQ,YAAkB,IAAImgB,KAAKA,GAAG/iB,MAAM+iB,IAAU,KAAPhwG,EAAEia,IAAkBja,EAAiBA,OAAE,KAAjBA,EAAE8G,OAAO0zC,OAAmB,GAAG21C,GAAGnwF,EAAE+B,KAAc,CAAC,SAAS4tC,GAAG3vC,EAAEC,EAAEgI,EAAEE,GAAG,GAAG,GAAG0nG,GAAG,MAAMA,GAAG,EAAEC,GAAG,KAAKx+F,MAAM1J,EAAE,MAAMulF,GAAGntF,EAAEiI,EAAEE,GAAM,KAAO,EAAF6X,KAAMhgB,IAAIqkB,KAAErkB,IAAIqkB,KAAI,KAAO,EAAFrE,MAAOovF,IAAInnG,GAAG,IAAI2K,IAAGq9F,GAAGjwG,EAAEs0B,KAAI47E,GAAGlwG,EAAEmI,GAAG,IAAIF,GAAG,IAAI+X,IAAG,KAAY,EAAP/f,EAAE25B,QAAU6yE,GAAGvvF,KAAI,IAAI+gF,IAAIG,MAAK,CAC1Y,SAAS8R,GAAGlwG,EAAEC,GAAG,IAAIgI,EAAEjI,EAAEmwG,cA3MzB,SAAYnwG,EAAEC,GAAG,IAAI,IAAIgI,EAAEjI,EAAE2sF,eAAexkF,EAAEnI,EAAE4sF,YAAY9oF,EAAE9D,EAAEowG,gBAAgBjpG,EAAEnH,EAAE0sF,aAAa,EAAEvlF,GAAG,CAAC,IAAIe,EAAE,GAAG+jF,GAAG9kF,GAAGiB,EAAE,GAAGF,EAAEd,EAAEtD,EAAEoE,IAAO,IAAId,EAAM,KAAKgB,EAAEH,IAAI,KAAKG,EAAED,KAAGrE,EAAEoE,GAAG6kF,GAAG3kF,EAAEnI,IAAQmH,GAAGnH,IAAID,EAAEqwG,cAAcjoG,GAAGjB,IAAIiB,CAAC,CAAC,CA2MnLkoG,CAAGtwG,EAAEC,GAAG,IAAIkI,EAAEskF,GAAGzsF,EAAEA,IAAIqkB,GAAEiQ,GAAE,GAAG,GAAG,IAAInsB,EAAE,OAAOF,GAAG4iF,GAAG5iF,GAAGjI,EAAEmwG,aAAa,KAAKnwG,EAAEuwG,iBAAiB,OAAO,GAAGtwG,EAAEkI,GAAGA,EAAEnI,EAAEuwG,mBAAmBtwG,EAAE,CAAgB,GAAf,MAAMgI,GAAG4iF,GAAG5iF,GAAM,IAAIhI,EAAE,IAAID,EAAEuhF,IA5IsJ,SAAYvhF,GAAGi+F,IAAG,EAAGE,GAAGn+F,EAAE,CA4I5KwwG,CAAGC,GAAGzsG,KAAK,KAAKhE,IAAIm+F,GAAGsS,GAAGzsG,KAAK,KAAKhE,IAAIm8F,IAAG,WAAW,KAAO,EAAFn8E,KAAMo+E,IAAI,IAAGn2F,EAAE,SAAS,CAAC,OAAOqlF,GAAGnlF,IAAI,KAAK,EAAEF,EAAEojF,GAAG,MAAM,KAAK,EAAEpjF,EAAEsjF,GAAG,MAAM,KAAK,GAAwC,QAAQtjF,EAAEwjF,SAApC,KAAK,UAAUxjF,EAAE4jF,GAAsB5jF,EAAEyoG,GAAGzoG,EAAE0oG,GAAG3sG,KAAK,KAAKhE,GAAG,CAACA,EAAEuwG,iBAAiBtwG,EAAED,EAAEmwG,aAAaloG,CAAC,CAAC,CAC7c,SAAS0oG,GAAG3wG,EAAEC,GAAc,GAAX8vG,IAAI,EAAEC,GAAG,EAAK,KAAO,EAAFhwF,IAAK,MAAM1O,MAAM1J,EAAE,MAAM,IAAIK,EAAEjI,EAAEmwG,aAAa,GAAGS,MAAM5wG,EAAEmwG,eAAeloG,EAAE,OAAO,KAAK,IAAIE,EAAEskF,GAAGzsF,EAAEA,IAAIqkB,GAAEiQ,GAAE,GAAG,GAAG,IAAInsB,EAAE,OAAO,KAAK,GAAG,KAAO,GAAFA,IAAO,KAAKA,EAAEnI,EAAEqwG,eAAepwG,EAAEA,EAAE4wG,GAAG7wG,EAAEmI,OAAO,CAAClI,EAAEkI,EAAE,IAAIrE,EAAEkc,GAAEA,IAAG,EAAE,IAAI7Y,EAAE2pG,KAAgD,IAAxCzsF,KAAIrkB,GAAGs0B,KAAIr0B,IAAEwvG,GAAG,KAAKhD,GAAGvvF,KAAI,IAAI6zF,GAAG/wG,EAAEC,UAAU+wG,KAAK,KAAK,CAAC,MAAM5oG,GAAG6oG,GAAGjxG,EAAEoI,EAAE,CAAUs5F,KAAKuN,GAAGzmG,QAAQrB,EAAE6Y,GAAElc,EAAE,OAAOynB,GAAEtrB,EAAE,GAAGokB,GAAE,KAAKiQ,GAAE,EAAEr0B,EAAE2S,GAAE,CAAC,GAAG,IAAI3S,EAAE,CAAyC,GAAxC,IAAIA,IAAY,KAAR6D,EAAEkpF,GAAGhtF,MAAWmI,EAAErE,EAAE7D,EAAEixG,GAAGlxG,EAAE8D,KAAQ,IAAI7D,EAAE,MAAMgI,EAAEknG,GAAG4B,GAAG/wG,EAAE,GAAGiwG,GAAGjwG,EAAEmI,GAAG+nG,GAAGlwG,EAAEkd,MAAKjV,EAAE,GAAG,IAAIhI,EAAEgwG,GAAGjwG,EAAEmI,OAChf,CAAuB,GAAtBrE,EAAE9D,EAAEwI,QAAQwhF,UAAa,KAAO,GAAF7hF,KAGnC,SAAYnI,GAAG,IAAI,IAAIC,EAAED,IAAI,CAAC,GAAW,MAARC,EAAES,MAAY,CAAC,IAAIuH,EAAEhI,EAAE4iG,YAAY,GAAG,OAAO56F,GAAe,QAAXA,EAAEA,EAAE4+F,QAAiB,IAAI,IAAI1+F,EAAE,EAAEA,EAAEF,EAAE9H,OAAOgI,IAAI,CAAC,IAAIrE,EAAEmE,EAAEE,GAAGhB,EAAErD,EAAEsL,YAAYtL,EAAEA,EAAE8H,MAAM,IAAI,IAAIqd,GAAG9hB,IAAIrD,GAAG,OAAM,CAAE,CAAC,MAAMoE,GAAG,OAAM,CAAE,CAAC,CAAC,CAAW,GAAVD,EAAEhI,EAAEsqF,MAAwB,MAAftqF,EAAEmrG,cAAoB,OAAOnjG,EAAEA,EAAEgiF,OAAOhqF,EAAEA,EAAEgI,MAAM,CAAC,GAAGhI,IAAID,EAAE,MAAM,KAAK,OAAOC,EAAEuqF,SAAS,CAAC,GAAG,OAAOvqF,EAAEgqF,QAAQhqF,EAAEgqF,SAASjqF,EAAE,OAAM,EAAGC,EAAEA,EAAEgqF,MAAM,CAAChqF,EAAEuqF,QAAQP,OAAOhqF,EAAEgqF,OAAOhqF,EAAEA,EAAEuqF,OAAO,CAAC,CAAC,OAAM,CAAE,CAHvX2mB,CAAGrtG,KAAe,KAAV7D,EAAE4wG,GAAG7wG,EAAEmI,MAAmB,KAARhB,EAAE6lF,GAAGhtF,MAAWmI,EAAEhB,EAAElH,EAAEixG,GAAGlxG,EAAEmH,KAAK,IAAIlH,GAAG,MAAMgI,EAAEknG,GAAG4B,GAAG/wG,EAAE,GAAGiwG,GAAGjwG,EAAEmI,GAAG+nG,GAAGlwG,EAAEkd,MAAKjV,EAAqC,OAAnCjI,EAAEoxG,aAAattG,EAAE9D,EAAEqxG,cAAclpG,EAASlI,GAAG,KAAK,EAAE,KAAK,EAAE,MAAMqR,MAAM1J,EAAE,MAAM,KAAK,EAC8B,KAAK,EAAE0pG,GAAGtxG,EAAEuvG,GAAGE,IAAI,MAD7B,KAAK,EAAU,GAARQ,GAAGjwG,EAAEmI,IAAS,UAAFA,KAAeA,GAAiB,IAAblI,EAAEsuG,GAAG,IAAIrxF,MAAU,CAAC,GAAG,IAAIuvE,GAAGzsF,EAAE,GAAG,MAAyB,KAAnB8D,EAAE9D,EAAE2sF,gBAAqBxkF,KAAKA,EAAE,CAACqR,KAAIxZ,EAAE4sF,aAAa5sF,EAAE2sF,eAAe7oF,EAAE,KAAK,CAAC9D,EAAEuxG,cAAcvV,GAAGsV,GAAGttG,KAAK,KAAKhE,EAAEuvG,GAAGE,IAAIxvG,GAAG,KAAK,CAACqxG,GAAGtxG,EAAEuvG,GAAGE,IAAI,MAAM,KAAK,EAAU,GAARQ,GAAGjwG,EAAEmI,IAAS,QAAFA,KAC9eA,EAAE,MAAqB,IAAflI,EAAED,EAAEotF,WAAetpF,GAAG,EAAE,EAAEqE,GAAG,CAAC,IAAID,EAAE,GAAG+jF,GAAG9jF,GAAGhB,EAAE,GAAGe,GAAEA,EAAEjI,EAAEiI,IAAKpE,IAAIA,EAAEoE,GAAGC,IAAIhB,CAAC,CAAqG,GAApGgB,EAAErE,EAAqG,IAA3FqE,GAAG,KAAXA,EAAE+U,KAAI/U,GAAW,IAAI,IAAIA,EAAE,IAAI,KAAKA,EAAE,KAAK,KAAKA,EAAE,KAAK,IAAIA,EAAE,IAAI,KAAKA,EAAE,KAAK,KAAK6mG,GAAG7mG,EAAE,OAAOA,GAAU,CAACnI,EAAEuxG,cAAcvV,GAAGsV,GAAGttG,KAAK,KAAKhE,EAAEuvG,GAAGE,IAAItnG,GAAG,KAAK,CAACmpG,GAAGtxG,EAAEuvG,GAAGE,IAAI,MAA+B,QAAQ,MAAMn+F,MAAM1J,EAAE,MAAO,CAAC,CAAW,OAAVsoG,GAAGlwG,EAAEkd,MAAYld,EAAEmwG,eAAeloG,EAAE0oG,GAAG3sG,KAAK,KAAKhE,GAAG,IAAI,CACrX,SAASkxG,GAAGlxG,EAAEC,GAAG,IAAIgI,EAAEqnG,GAA2G,OAAxGtvG,EAAEwI,QAAQ2hF,cAAc8E,eAAe8hB,GAAG/wG,EAAEC,GAAGS,OAAO,KAAe,KAAVV,EAAE6wG,GAAG7wG,EAAEC,MAAWA,EAAEsvG,GAAGA,GAAGtnG,EAAE,OAAOhI,GAAG+rG,GAAG/rG,IAAWD,CAAC,CAAC,SAASgsG,GAAGhsG,GAAG,OAAOuvG,GAAGA,GAAGvvG,EAAEuvG,GAAG1qF,KAAKW,MAAM+pF,GAAGvvG,EAAE,CAE5L,SAASiwG,GAAGjwG,EAAEC,GAAuD,IAApDA,IAAIovG,GAAGpvG,IAAImvG,GAAGpvG,EAAE2sF,gBAAgB1sF,EAAED,EAAE4sF,cAAc3sF,EAAMD,EAAEA,EAAEowG,gBAAgB,EAAEnwG,GAAG,CAAC,IAAIgI,EAAE,GAAGgkF,GAAGhsF,GAAGkI,EAAE,GAAGF,EAAEjI,EAAEiI,IAAI,EAAEhI,IAAIkI,CAAC,CAAC,CAAC,SAASsoG,GAAGzwG,GAAG,GAAG,KAAO,EAAFggB,IAAK,MAAM1O,MAAM1J,EAAE,MAAMgpG,KAAK,IAAI3wG,EAAEwsF,GAAGzsF,EAAE,GAAG,GAAG,KAAO,EAAFC,GAAK,OAAOiwG,GAAGlwG,EAAEkd,MAAK,KAAK,IAAIjV,EAAE4oG,GAAG7wG,EAAEC,GAAG,GAAG,IAAID,EAAEuhF,KAAK,IAAIt5E,EAAE,CAAC,IAAIE,EAAE6kF,GAAGhtF,GAAG,IAAImI,IAAIlI,EAAEkI,EAAEF,EAAEipG,GAAGlxG,EAAEmI,GAAG,CAAC,GAAG,IAAIF,EAAE,MAAMA,EAAEknG,GAAG4B,GAAG/wG,EAAE,GAAGiwG,GAAGjwG,EAAEC,GAAGiwG,GAAGlwG,EAAEkd,MAAKjV,EAAE,GAAG,IAAIA,EAAE,MAAMqJ,MAAM1J,EAAE,MAAiF,OAA3E5H,EAAEoxG,aAAapxG,EAAEwI,QAAQwhF,UAAUhqF,EAAEqxG,cAAcpxG,EAAEqxG,GAAGtxG,EAAEuvG,GAAGE,IAAIS,GAAGlwG,EAAEkd,MAAY,IAAI,CACvd,SAASs0F,GAAGxxG,EAAEC,GAAG,IAAIgI,EAAE+X,GAAEA,IAAG,EAAE,IAAI,OAAOhgB,EAAEC,EAAE,CAAC,QAAY,KAAJ+f,GAAE/X,KAAUwkG,GAAGvvF,KAAI,IAAI+gF,IAAIG,KAAK,CAAC,CAAC,SAASqT,GAAGzxG,GAAG,OAAO2vG,IAAI,IAAIA,GAAGpuB,KAAK,KAAO,EAAFvhE,KAAM4wF,KAAK,IAAI3wG,EAAE+f,GAAEA,IAAG,EAAE,IAAI/X,EAAEwvE,GAAGoY,WAAW1nF,EAAE8R,GAAE,IAAI,GAAGw9D,GAAGoY,WAAW,KAAK51E,GAAE,EAAEja,EAAE,OAAOA,GAAG,CAAC,QAAQia,GAAE9R,EAAEsvE,GAAGoY,WAAW5nF,EAAM,KAAO,GAAX+X,GAAE/f,KAAam+F,IAAI,CAAC,CAAC,SAASsO,KAAKlD,GAAGD,GAAG/gG,QAAQgK,GAAE+2F,GAAG,CAChT,SAASwH,GAAG/wG,EAAEC,GAAGD,EAAEoxG,aAAa,KAAKpxG,EAAEqxG,cAAc,EAAE,IAAIppG,EAAEjI,EAAEuxG,cAAiD,IAAlC,IAAItpG,IAAIjI,EAAEuxG,eAAe,EAAEtV,GAAGh0F,IAAO,OAAOsjB,GAAE,IAAItjB,EAAEsjB,GAAE0+D,OAAO,OAAOhiF,GAAG,CAAC,IAAIE,EAAEF,EAAQ,OAANg3F,GAAG92F,GAAUA,EAAEo5E,KAAK,KAAK,EAA6B,QAA3Bp5E,EAAEA,EAAEpG,KAAKV,yBAA4B,IAAS8G,GAAGs1F,KAAK,MAAM,KAAK,EAAE6G,KAAK9xF,GAAE2qF,IAAI3qF,GAAE+N,IAAGqkF,KAAK,MAAM,KAAK,EAAEJ,GAAGr8F,GAAG,MAAM,KAAK,EAAEm8F,KAAK,MAAM,KAAK,GAAc,KAAK,GAAG9xF,GAAE+D,IAAG,MAAM,KAAK,GAAGorF,GAAGx5F,EAAEpG,KAAKy/E,UAAU,MAAM,KAAK,GAAG,KAAK,GAAGkrB,KAAKzkG,EAAEA,EAAEgiF,MAAM,CAAqE,GAApE5lE,GAAErkB,EAAEurB,GAAEvrB,EAAE6gG,GAAG7gG,EAAEwI,QAAQ,MAAM8rB,GAAEk1E,GAAGvpG,EAAE2S,GAAE,EAAEu8F,GAAG,KAAKE,GAAGD,GAAGvL,GAAG,EAAE0L,GAAGD,GAAG,KAAQ,OAAOhN,GAAG,CAAC,IAAIriG,EAC1f,EAAEA,EAAEqiG,GAAGniG,OAAOF,IAAI,GAA2B,QAAhBkI,GAARF,EAAEq6F,GAAGriG,IAAOwiG,aAAqB,CAACx6F,EAAEw6F,YAAY,KAAK,IAAI3+F,EAAEqE,EAAEg5F,KAAKh6F,EAAEc,EAAEi7F,QAAQ,GAAG,OAAO/7F,EAAE,CAAC,IAAIe,EAAEf,EAAEg6F,KAAKh6F,EAAEg6F,KAAKr9F,EAAEqE,EAAEg5F,KAAKj5F,CAAC,CAACD,EAAEi7F,QAAQ/6F,CAAC,CAACm6F,GAAG,IAAI,CAAC,OAAOtiG,CAAC,CAC3K,SAASixG,GAAGjxG,EAAEC,GAAG,OAAE,CAAC,IAAIgI,EAAEsjB,GAAE,IAAuB,GAAnBm2E,KAAKoD,GAAGt8F,QAAQm9F,GAAMT,GAAG,CAAC,IAAI,IAAI/8F,EAAEgU,GAAEguE,cAAc,OAAOhiF,GAAG,CAAC,IAAIrE,EAAEqE,EAAE49F,MAAM,OAAOjiG,IAAIA,EAAEo/F,QAAQ,MAAM/6F,EAAEA,EAAEg5F,IAAI,CAAC+D,IAAG,CAAE,CAA4C,GAA3CD,GAAG,EAAEloF,GAAEC,GAAEb,GAAE,KAAKgpF,IAAG,EAAGC,GAAG,EAAE8J,GAAG1mG,QAAQ,KAAQ,OAAOP,GAAG,OAAOA,EAAEgiF,OAAO,CAACr3E,GAAE,EAAEu8F,GAAGlvG,EAAEsrB,GAAE,KAAK,KAAK,CAACvrB,EAAE,CAAC,IAAImH,EAAEnH,EAAEkI,EAAED,EAAEgiF,OAAO7hF,EAAEH,EAAEb,EAAEnH,EAAqB,GAAnBA,EAAEq0B,GAAElsB,EAAE1H,OAAO,MAAS,OAAO0G,GAAG,kBAAkBA,GAAG,oBAAoBA,EAAE0/B,KAAK,CAAC,IAAIv/B,EAAEH,EAAEI,EAAEY,EAAEJ,EAAER,EAAE+5E,IAAI,GAAG,KAAY,EAAP/5E,EAAEoyB,QAAU,IAAI5xB,GAAG,KAAKA,GAAG,KAAKA,GAAG,CAAC,IAAI+I,EAAEvJ,EAAEwiF,UAAUj5E,GAAGvJ,EAAEq7F,YAAY9xF,EAAE8xF,YAAYr7F,EAAE2iF,cAAcp5E,EAAEo5E,cACxe3iF,EAAE06F,MAAMnxF,EAAEmxF,QAAQ16F,EAAEq7F,YAAY,KAAKr7F,EAAE2iF,cAAc,KAAK,CAAC,IAAIv7E,EAAEytC,GAAGn0C,GAAG,GAAG,OAAO0G,EAAE,CAACA,EAAElO,QAAQ,IAAIo8C,GAAGluC,EAAE1G,EAAEE,EAAEjB,EAAElH,GAAU,EAAP2O,EAAEgrB,MAAQ0Z,GAAGnsC,EAAEI,EAAEtH,GAAOmH,EAAEG,EAAE,IAAIE,GAAZxH,EAAE2O,GAAci0F,YAAY,GAAG,OAAOp7F,EAAE,CAAC,IAAIyJ,EAAE,IAAI2/D,IAAI3/D,EAAEuvE,IAAIr5E,GAAGnH,EAAE4iG,YAAY3xF,CAAC,MAAMzJ,EAAEg5E,IAAIr5E,GAAG,MAAMpH,CAAC,CAAM,GAAG,KAAO,EAAFC,GAAK,CAACqzC,GAAGnsC,EAAEI,EAAEtH,GAAG+qG,KAAK,MAAMhrG,CAAC,CAACoH,EAAEkK,MAAM1J,EAAE,KAAM,MAAM,GAAGiS,IAAU,EAAPzR,EAAEwxB,KAAO,CAAC,IAAItV,EAAE+3B,GAAGn0C,GAAG,GAAG,OAAOoc,EAAE,CAAC,KAAa,MAARA,EAAE5jB,SAAe4jB,EAAE5jB,OAAO,KAAKo8C,GAAGx4B,EAAEpc,EAAEE,EAAEjB,EAAElH,GAAGogG,GAAG3iD,GAAGt2C,EAAEgB,IAAI,MAAMpI,CAAC,CAAC,CAACmH,EAAEC,EAAEs2C,GAAGt2C,EAAEgB,GAAG,IAAIwK,KAAIA,GAAE,GAAG,OAAO08F,GAAGA,GAAG,CAACnoG,GAAGmoG,GAAGzqF,KAAK1d,GAAGA,EAAEe,EAAE,EAAE,CAAC,OAAOf,EAAEo6E,KAAK,KAAK,EAAEp6E,EAAEzG,OAAO,MACpfT,IAAIA,EAAEkH,EAAE+6F,OAAOjiG,EAAkB0jG,GAAGx8F,EAAbi1C,GAAGj1C,EAAEC,EAAEnH,IAAW,MAAMD,EAAE,KAAK,EAAEoI,EAAEhB,EAAE,IAAI4S,EAAE7S,EAAEpF,KAAK+P,EAAE3K,EAAE0hF,UAAU,GAAG,KAAa,IAAR1hF,EAAEzG,SAAa,oBAAoBsZ,EAAErY,0BAA0B,OAAOmQ,GAAG,oBAAoBA,EAAE+2F,oBAAoB,OAAOp1D,KAAKA,GAAGrnB,IAAIta,KAAK,CAAC3K,EAAEzG,OAAO,MAAMT,IAAIA,EAAEkH,EAAE+6F,OAAOjiG,EAAkB0jG,GAAGx8F,EAAbs2C,GAAGt2C,EAAEiB,EAAEnI,IAAW,MAAMD,CAAC,EAAEmH,EAAEA,EAAE8iF,MAAM,OAAO,OAAO9iF,EAAE,CAACuqG,GAAGzpG,EAAE,CAAC,MAAM0sD,GAAI10D,EAAE00D,EAAGppC,KAAItjB,GAAG,OAAOA,IAAIsjB,GAAEtjB,EAAEA,EAAEgiF,QAAQ,QAAQ,CAAC,KAAK,CAAS,CAAC,SAAS6mB,KAAK,IAAI9wG,EAAEivG,GAAGzmG,QAAsB,OAAdymG,GAAGzmG,QAAQm9F,GAAU,OAAO3lG,EAAE2lG,GAAG3lG,CAAC,CACrd,SAASgrG,KAAQ,IAAIp4F,IAAG,IAAIA,IAAG,IAAIA,KAAEA,GAAE,GAAE,OAAOyR,IAAG,KAAQ,UAAHw/E,KAAe,KAAQ,UAAHuL,KAAea,GAAG5rF,GAAEiQ,GAAE,CAAC,SAASu8E,GAAG7wG,EAAEC,GAAG,IAAIgI,EAAE+X,GAAEA,IAAG,EAAE,IAAI7X,EAAE2oG,KAAqC,IAA7BzsF,KAAIrkB,GAAGs0B,KAAIr0B,IAAEwvG,GAAG,KAAKsB,GAAG/wG,EAAEC,UAAU0xG,KAAK,KAAK,CAAC,MAAM7tG,GAAGmtG,GAAGjxG,EAAE8D,EAAE,CAAgC,GAAtB49F,KAAK1hF,GAAE/X,EAAEgnG,GAAGzmG,QAAQL,EAAK,OAAOojB,GAAE,MAAMja,MAAM1J,EAAE,MAAiB,OAAXyc,GAAE,KAAKiQ,GAAE,EAAS1hB,EAAC,CAAC,SAAS++F,KAAK,KAAK,OAAOpmF,IAAGqmF,GAAGrmF,GAAE,CAAC,SAASylF,KAAK,KAAK,OAAOzlF,KAAIjN,MAAMszF,GAAGrmF,GAAE,CAAC,SAASqmF,GAAG5xG,GAAG,IAAIC,EAAE8uG,GAAG/uG,EAAEgqF,UAAUhqF,EAAEwpG,IAAIxpG,EAAEkgG,cAAclgG,EAAE0/F,aAAa,OAAOz/F,EAAEyxG,GAAG1xG,GAAGurB,GAAEtrB,EAAEivG,GAAG1mG,QAAQ,IAAI,CAC1d,SAASkpG,GAAG1xG,GAAG,IAAIC,EAAED,EAAE,EAAE,CAAC,IAAIiI,EAAEhI,EAAE+pF,UAAqB,GAAXhqF,EAAEC,EAAEgqF,OAAU,KAAa,MAARhqF,EAAES,QAAc,GAAgB,QAAbuH,EAAE8jG,GAAG9jG,EAAEhI,EAAEupG,KAAkB,YAAJj+E,GAAEtjB,OAAc,CAAW,GAAG,QAAbA,EAAE0kG,GAAG1kG,EAAEhI,IAAmC,OAAnBgI,EAAEvH,OAAO,WAAM6qB,GAAEtjB,GAAS,GAAG,OAAOjI,EAAmE,OAAX4S,GAAE,OAAE2Y,GAAE,MAA5DvrB,EAAEU,OAAO,MAAMV,EAAEorG,aAAa,EAAEprG,EAAEw/F,UAAU,IAA4B,CAAa,GAAG,QAAfv/F,EAAEA,EAAEuqF,SAAyB,YAAJj/D,GAAEtrB,GAASsrB,GAAEtrB,EAAED,CAAC,OAAO,OAAOC,GAAG,IAAI2S,KAAIA,GAAE,EAAE,CAAC,SAAS0+F,GAAGtxG,EAAEC,EAAEgI,GAAG,IAAIE,EAAE8R,GAAEnW,EAAE2zE,GAAGoY,WAAW,IAAIpY,GAAGoY,WAAW,KAAK51E,GAAE,EAC3Y,SAAYja,EAAEC,EAAEgI,EAAEE,GAAG,GAAGyoG,WAAW,OAAOjB,IAAI,GAAG,KAAO,EAAF3vF,IAAK,MAAM1O,MAAM1J,EAAE,MAAMK,EAAEjI,EAAEoxG,aAAa,IAAIttG,EAAE9D,EAAEqxG,cAAc,GAAG,OAAOppG,EAAE,OAAO,KAA2C,GAAtCjI,EAAEoxG,aAAa,KAAKpxG,EAAEqxG,cAAc,EAAKppG,IAAIjI,EAAEwI,QAAQ,MAAM8I,MAAM1J,EAAE,MAAM5H,EAAEmwG,aAAa,KAAKnwG,EAAEuwG,iBAAiB,EAAE,IAAIppG,EAAEc,EAAEi6F,MAAMj6F,EAAE65F,WAA8J,GAzNtT,SAAY9hG,EAAEC,GAAG,IAAIgI,EAAEjI,EAAE0sF,cAAczsF,EAAED,EAAE0sF,aAAazsF,EAAED,EAAE2sF,eAAe,EAAE3sF,EAAE4sF,YAAY,EAAE5sF,EAAEqwG,cAAcpwG,EAAED,EAAE6xG,kBAAkB5xG,EAAED,EAAE6sF,gBAAgB5sF,EAAEA,EAAED,EAAE8sF,cAAc,IAAI3kF,EAAEnI,EAAEotF,WAAW,IAAIptF,EAAEA,EAAEowG,gBAAgB,EAAEnoG,GAAG,CAAC,IAAInE,EAAE,GAAGmoF,GAAGhkF,GAAGd,EAAE,GAAGrD,EAAE7D,EAAE6D,GAAG,EAAEqE,EAAErE,IAAI,EAAE9D,EAAE8D,IAAI,EAAEmE,IAAId,CAAC,CAAC,CAyN5G2qG,CAAG9xG,EAAEmH,GAAGnH,IAAIqkB,KAAIkH,GAAElH,GAAE,KAAKiQ,GAAE,GAAG,KAAoB,KAAfrsB,EAAEmjG,eAAoB,KAAa,KAARnjG,EAAEvH,QAAagvG,KAAKA,IAAG,EAAGgB,GAAGjlB,IAAG,WAAgB,OAALmlB,KAAY,IAAI,KAAIzpG,EAAE,KAAa,MAARc,EAAEvH,OAAgB,KAAoB,MAAfuH,EAAEmjG,eAAqBjkG,EAAE,CAACA,EAAEswE,GAAGoY,WAAWpY,GAAGoY,WAAW,KAChf,IAAI3nF,EAAE+R,GAAEA,GAAE,EAAE,IAAI7R,EAAE4X,GAAEA,IAAG,EAAEkvF,GAAG1mG,QAAQ,KA1CpC,SAAYxI,EAAEC,GAAgB,GAAb27F,GAAGjM,GAAavnE,GAAVpoB,EAAEioB,MAAc,CAAC,GAAG,mBAAmBjoB,EAAE,IAAIiI,EAAE,CAACyU,MAAM1c,EAAEw4F,eAAe57E,IAAI5c,EAAEy4F,mBAAmBz4F,EAAE,CAA8C,IAAImI,GAAjDF,GAAGA,EAAEjI,EAAE4iF,gBAAgB36E,EAAEywF,aAAa5xF,QAAe6xF,cAAc1wF,EAAE0wF,eAAe,GAAGxwF,GAAG,IAAIA,EAAEywF,WAAW,CAAC3wF,EAAEE,EAAE0wF,WAAW,IAAI/0F,EAAEqE,EAAE2wF,aAAa3xF,EAAEgB,EAAE4wF,UAAU5wF,EAAEA,EAAE6wF,YAAY,IAAI/wF,EAAEi8E,SAAS/8E,EAAE+8E,QAAQ,CAAC,MAAM7oE,GAAGpT,EAAE,KAAK,MAAMjI,CAAC,CAAC,IAAIkI,EAAE,EAAEE,GAAG,EAAEhB,GAAG,EAAEG,EAAE,EAAEC,EAAE,EAAEQ,EAAEhI,EAAE+Q,EAAE,KAAK9Q,EAAE,OAAO,CAAC,IAAI,IAAI2O,EAAK5G,IAAIC,GAAG,IAAInE,GAAG,IAAIkE,EAAEk8E,WAAW97E,EAAEF,EAAEpE,GAAGkE,IAAIb,GAAG,IAAIgB,GAAG,IAAIH,EAAEk8E,WAAW98E,EAAEc,EAAEC,GAAG,IAAIH,EAAEk8E,WAAWh8E,GACnfF,EAAE6d,UAAU1lB,QAAW,QAAQyO,EAAE5G,EAAE+7E,aAAkBhzE,EAAE/I,EAAEA,EAAE4G,EAAE,OAAO,CAAC,GAAG5G,IAAIhI,EAAE,MAAMC,EAA8C,GAA5C8Q,IAAI9I,KAAKV,IAAIzD,IAAIsE,EAAEF,GAAG6I,IAAI5J,KAAKK,IAAIW,IAAIf,EAAEc,GAAM,QAAQ0G,EAAE5G,EAAE+vF,aAAa,MAAUhnF,GAAJ/I,EAAE+I,GAAMw3E,UAAU,CAACvgF,EAAE4G,CAAC,CAAC3G,GAAG,IAAIG,IAAI,IAAIhB,EAAE,KAAK,CAACsV,MAAMtU,EAAEwU,IAAIxV,EAAE,MAAMa,EAAE,IAAI,CAACA,EAAEA,GAAG,CAACyU,MAAM,EAAEE,IAAI,EAAE,MAAM3U,EAAE,KAA+C,IAA1C4zF,GAAG,CAACxD,YAAYr4F,EAAEs4F,eAAerwF,GAAG0nF,IAAG,EAAOlsE,GAAExjB,EAAE,OAAOwjB,IAAG,GAAOzjB,GAAJC,EAAEwjB,IAAM8mE,MAAM,KAAoB,KAAftqF,EAAEmrG,eAAoB,OAAOprG,EAAEA,EAAEiqF,OAAOhqF,EAAEwjB,GAAEzjB,OAAO,KAAK,OAAOyjB,IAAG,CAACxjB,EAAEwjB,GAAE,IAAI,IAAIhc,EAAExH,EAAE+pF,UAAU,GAAG,KAAa,KAAR/pF,EAAES,OAAY,OAAOT,EAAEshF,KAAK,KAAK,EAAE,KAAK,GAAG,KAAK,GACvK,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,MAA3W,KAAK,EAAE,GAAG,OAAO95E,EAAE,CAAC,IAAIyJ,EAAEzJ,EAAEy4F,cAAc57E,EAAE7c,EAAE0iF,cAAcx7E,EAAE1O,EAAE4oF,UAAU7uE,EAAErL,EAAE45F,wBAAwBtoG,EAAEs/F,cAAct/F,EAAE8B,KAAKmP,EAAE6iC,GAAG9zC,EAAE8B,KAAKmP,GAAGoT,GAAG3V,EAAEmgG,oCAAoC90F,CAAC,CAAC,MAAM,KAAK,EAAE,IAAIlI,EAAE7R,EAAE4oF,UAAUqG,cAAc,IAAIp9E,EAAEoyE,SAASpyE,EAAE6xD,YAAY,GAAG,IAAI7xD,EAAEoyE,UAAUpyE,EAAEymF,iBAAiBzmF,EAAEsnD,YAAYtnD,EAAEymF,iBAAiB,MAAyC,QAAQ,MAAMjnF,MAAM1J,EAAE,MAAO,CAAC,MAAMyT,GAAGwI,GAAE5jB,EAAEA,EAAEgqF,OAAO5uE,EAAE,CAAa,GAAG,QAAfrb,EAAEC,EAAEuqF,SAAoB,CAACxqF,EAAEiqF,OAAOhqF,EAAEgqF,OAAOxmE,GAAEzjB,EAAE,KAAK,CAACyjB,GAAExjB,EAAEgqF,MAAM,CAACxiF,EAAEwlG,GAAGA,IAAG,CAAW,CAwCld8E,CAAG/xG,EAAEiI,GAAGmmG,GAAGnmG,EAAEjI,GAAGmoB,GAAG0zE,IAAIlM,KAAKiM,GAAGC,GAAGD,GAAG,KAAK57F,EAAEwI,QAAQP,EAAEymG,GAAGzmG,EAAEjI,EAAE8D,GAAGknF,KAAKhrE,GAAE5X,EAAE6R,GAAE/R,EAAEuvE,GAAGoY,WAAW1oF,CAAC,MAAMnH,EAAEwI,QAAQP,EAAsF,GAApFynG,KAAKA,IAAG,EAAGC,GAAG3vG,EAAE4vG,GAAG9rG,GAAGqD,EAAEnH,EAAE0sF,aAAa,IAAIvlF,IAAIssC,GAAG,MAhOmJ,SAAYzzC,GAAG,GAAGgsF,IAAI,oBAAoBA,GAAGgmB,kBAAkB,IAAIhmB,GAAGgmB,kBAAkBjmB,GAAG/rF,OAAE,EAAO,OAAuB,IAAhBA,EAAEwI,QAAQ9H,OAAW,CAAC,MAAMT,GAAG,CAAC,CAgOxRgyG,CAAGhqG,EAAE4gF,WAAaqnB,GAAGlwG,EAAEkd,MAAQ,OAAOjd,EAAE,IAAIkI,EAAEnI,EAAEkyG,mBAAmBjqG,EAAE,EAAEA,EAAEhI,EAAEE,OAAO8H,IAAInE,EAAE7D,EAAEgI,GAAGE,EAAErE,EAAE8H,MAAM,CAACk9F,eAAehlG,EAAEm8E,MAAM0oB,OAAO7kG,EAAE6kG,SAAS,GAAG9sD,GAAG,MAAMA,IAAG,EAAG77C,EAAEy6C,GAAGA,GAAG,KAAKz6C,EAAE,KAAQ,EAAH4vG,KAAO,IAAI5vG,EAAEuhF,KAAKqvB,KAAKzpG,EAAEnH,EAAE0sF,aAAa,KAAO,EAAFvlF,GAAKnH,IAAI8vG,GAAGD,MAAMA,GAAG,EAAEC,GAAG9vG,GAAG6vG,GAAG,EAAEzR,IAAgB,CAFxF+T,CAAGnyG,EAAEC,EAAEgI,EAAEE,EAAE,CAAC,QAAQsvE,GAAGoY,WAAW/rF,EAAEmW,GAAE9R,CAAC,CAAC,OAAO,IAAI,CAGhc,SAASyoG,KAAK,GAAG,OAAOjB,GAAG,CAAC,IAAI3vG,EAAEstF,GAAGsiB,IAAI3vG,EAAEw3E,GAAGoY,WAAW5nF,EAAEgS,GAAE,IAAmC,GAA/Bw9D,GAAGoY,WAAW,KAAK51E,GAAE,GAAGja,EAAE,GAAGA,EAAK,OAAO2vG,GAAG,IAAIxnG,GAAE,MAAO,CAAmB,GAAlBnI,EAAE2vG,GAAGA,GAAG,KAAKC,GAAG,EAAK,KAAO,EAAF5vF,IAAK,MAAM1O,MAAM1J,EAAE,MAAM,IAAI9D,EAAEkc,GAAO,IAALA,IAAG,EAAMyD,GAAEzjB,EAAEwI,QAAQ,OAAOib,IAAG,CAAC,IAAItc,EAAEsc,GAAEvb,EAAEf,EAAEojF,MAAM,GAAG,KAAa,GAAR9mE,GAAE/iB,OAAU,CAAC,IAAI0H,EAAEjB,EAAEq4F,UAAU,GAAG,OAAOp3F,EAAE,CAAC,IAAI,IAAIhB,EAAE,EAAEA,EAAEgB,EAAEjI,OAAOiH,IAAI,CAAC,IAAIG,EAAEa,EAAEhB,GAAG,IAAIqc,GAAElc,EAAE,OAAOkc,IAAG,CAAC,IAAIjc,EAAEic,GAAE,OAAOjc,EAAE+5E,KAAK,KAAK,EAAE,KAAK,GAAG,KAAK,GAAG2rB,GAAG,EAAE1lG,EAAEL,GAAG,IAAIa,EAAER,EAAE+iF,MAAM,GAAG,OAAOviF,EAAEA,EAAEiiF,OAAOziF,EAAEic,GAAEzb,OAAO,KAAK,OAAOyb,IAAG,CAAK,IAAI1S,GAARvJ,EAAEic,IAAU+mE,QAAQ57E,EAAEpH,EAAEyiF,OAAa,GAANojB,GAAG7lG,GAAMA,IACnfD,EAAE,CAACkc,GAAE,KAAK,KAAK,CAAC,GAAG,OAAO1S,EAAE,CAACA,EAAEk5E,OAAOr7E,EAAE6U,GAAE1S,EAAE,KAAK,CAAC0S,GAAE7U,CAAC,CAAC,CAAC,CAAC,IAAInH,EAAEN,EAAE6iF,UAAU,GAAG,OAAOviF,EAAE,CAAC,IAAIyJ,EAAEzJ,EAAE8iF,MAAM,GAAG,OAAOr5E,EAAE,CAACzJ,EAAE8iF,MAAM,KAAK,EAAE,CAAC,IAAIjmE,EAAEpT,EAAEs5E,QAAQt5E,EAAEs5E,QAAQ,KAAKt5E,EAAEoT,CAAC,OAAO,OAAOpT,EAAE,CAAC,CAACuS,GAAEtc,CAAC,CAAC,CAAC,GAAG,KAAoB,KAAfA,EAAEikG,eAAoB,OAAOljG,EAAEA,EAAE+hF,OAAO9iF,EAAEsc,GAAEvb,OAAOjI,EAAE,KAAK,OAAOwjB,IAAG,CAAK,GAAG,KAAa,MAApBtc,EAAEsc,IAAY/iB,OAAY,OAAOyG,EAAEo6E,KAAK,KAAK,EAAE,KAAK,GAAG,KAAK,GAAG2rB,GAAG,EAAE/lG,EAAEA,EAAE8iF,QAAQ,IAAIt7E,EAAExH,EAAEqjF,QAAQ,GAAG,OAAO77E,EAAE,CAACA,EAAEs7E,OAAO9iF,EAAE8iF,OAAOxmE,GAAE9U,EAAE,MAAM1O,CAAC,CAACwjB,GAAEtc,EAAE8iF,MAAM,CAAC,CAAC,IAAIjwE,EAAEha,EAAEwI,QAAQ,IAAIib,GAAEzJ,EAAE,OAAOyJ,IAAG,CAAK,IAAI3R,GAAR5J,EAAEub,IAAU8mE,MAAM,GAAG,KAAoB,KAAfriF,EAAEkjG,eAAoB,OAClft5F,EAAEA,EAAEm4E,OAAO/hF,EAAEub,GAAE3R,OAAO7R,EAAE,IAAIiI,EAAE8R,EAAE,OAAOyJ,IAAG,CAAK,GAAG,KAAa,MAApBrb,EAAEqb,IAAY/iB,OAAY,IAAI,OAAO0H,EAAEm5E,KAAK,KAAK,EAAE,KAAK,GAAG,KAAK,GAAG4rB,GAAG,EAAE/kG,GAAG,CAAC,MAAMusD,GAAI9wC,GAAEzb,EAAEA,EAAE6hF,OAAOt1B,EAAG,CAAC,GAAGvsD,IAAIF,EAAE,CAACub,GAAE,KAAK,MAAMxjB,CAAC,CAAC,IAAIob,EAAEjT,EAAEoiF,QAAQ,GAAG,OAAOnvE,EAAE,CAACA,EAAE4uE,OAAO7hF,EAAE6hF,OAAOxmE,GAAEpI,EAAE,MAAMpb,CAAC,CAACwjB,GAAErb,EAAE6hF,MAAM,CAAC,CAAU,GAATjqE,GAAElc,EAAEs6F,KAAQpS,IAAI,oBAAoBA,GAAGomB,sBAAsB,IAAIpmB,GAAGomB,sBAAsBrmB,GAAG/rF,EAAE,CAAC,MAAM20D,GAAI,CAACxsD,GAAE,CAAE,CAAC,OAAOA,CAAC,CAAC,QAAQ8R,GAAEhS,EAAEwvE,GAAGoY,WAAW5vF,CAAC,CAAC,CAAC,OAAM,CAAE,CAAC,SAASoyG,GAAGryG,EAAEC,EAAEgI,GAAyBjI,EAAEyjG,GAAGzjG,EAAjBC,EAAEm8C,GAAGp8C,EAAfC,EAAEy9C,GAAGz1C,EAAEhI,GAAY,GAAY,GAAGA,EAAEuZ,KAAI,OAAOxZ,IAAImtF,GAAGntF,EAAE,EAAEC,GAAGiwG,GAAGlwG,EAAEC,GAAG,CACze,SAAS4jB,GAAE7jB,EAAEC,EAAEgI,GAAG,GAAG,IAAIjI,EAAEuhF,IAAI8wB,GAAGryG,EAAEA,EAAEiI,QAAQ,KAAK,OAAOhI,GAAG,CAAC,GAAG,IAAIA,EAAEshF,IAAI,CAAC8wB,GAAGpyG,EAAED,EAAEiI,GAAG,KAAK,CAAM,GAAG,IAAIhI,EAAEshF,IAAI,CAAC,IAAIp5E,EAAElI,EAAE4oF,UAAU,GAAG,oBAAoB5oF,EAAE8B,KAAKJ,0BAA0B,oBAAoBwG,EAAE0gG,oBAAoB,OAAOp1D,KAAKA,GAAGrnB,IAAIjkB,IAAI,CAAuBlI,EAAEwjG,GAAGxjG,EAAjBD,EAAEy9C,GAAGx9C,EAAfD,EAAE09C,GAAGz1C,EAAEjI,GAAY,GAAY,GAAGA,EAAEwZ,KAAI,OAAOvZ,IAAIktF,GAAGltF,EAAE,EAAED,GAAGkwG,GAAGjwG,EAAED,IAAI,KAAK,CAAC,CAACC,EAAEA,EAAEgqF,MAAM,CAAC,CACnV,SAAS52C,GAAGrzC,EAAEC,EAAEgI,GAAG,IAAIE,EAAEnI,EAAE+oG,UAAU,OAAO5gG,GAAGA,EAAEmmF,OAAOruF,GAAGA,EAAEuZ,KAAIxZ,EAAE4sF,aAAa5sF,EAAE2sF,eAAe1kF,EAAEoc,KAAIrkB,IAAIs0B,GAAErsB,KAAKA,IAAI,IAAI2K,IAAG,IAAIA,KAAM,UAAF0hB,MAAeA,IAAG,IAAIpX,KAAIqxF,GAAGwC,GAAG/wG,EAAE,GAAGqvG,IAAIpnG,GAAGioG,GAAGlwG,EAAEC,EAAE,CAAC,SAASqyG,GAAGtyG,EAAEC,GAAG,IAAIA,IAAI,KAAY,EAAPD,EAAE45B,MAAQ35B,EAAE,GAAGA,EAAEssF,GAAU,KAAQ,WAAfA,KAAK,MAAuBA,GAAG,WAAW,IAAItkF,EAAEuR,KAAc,QAAVxZ,EAAE0iG,GAAG1iG,EAAEC,MAAcktF,GAAGntF,EAAEC,EAAEgI,GAAGioG,GAAGlwG,EAAEiI,GAAG,CAAC,SAASgjG,GAAGjrG,GAAG,IAAIC,EAAED,EAAEmqF,cAAcliF,EAAE,EAAE,OAAOhI,IAAIgI,EAAEhI,EAAE4/F,WAAWyS,GAAGtyG,EAAEiI,EAAE,CACjZ,SAASimG,GAAGluG,EAAEC,GAAG,IAAIgI,EAAE,EAAE,OAAOjI,EAAEuhF,KAAK,KAAK,GAAG,IAAIp5E,EAAEnI,EAAE6oF,UAAc/kF,EAAE9D,EAAEmqF,cAAc,OAAOrmF,IAAImE,EAAEnE,EAAE+7F,WAAW,MAAM,KAAK,GAAG13F,EAAEnI,EAAE6oF,UAAU,MAAM,QAAQ,MAAMv3E,MAAM1J,EAAE,MAAO,OAAOO,GAAGA,EAAEmmF,OAAOruF,GAAGqyG,GAAGtyG,EAAEiI,EAAE,CAQqK,SAASyoG,GAAG1wG,EAAEC,GAAG,OAAO0qF,GAAG3qF,EAAEC,EAAE,CACjZ,SAASsyG,GAAGvyG,EAAEC,EAAEgI,EAAEE,GAAGiS,KAAKmnE,IAAIvhF,EAAEoa,KAAKnZ,IAAIgH,EAAEmS,KAAKowE,QAAQpwE,KAAKmwE,MAAMnwE,KAAK6vE,OAAO7vE,KAAKyuE,UAAUzuE,KAAKrY,KAAKqY,KAAKmlF,YAAY,KAAKnlF,KAAK+F,MAAM,EAAE/F,KAAKvS,IAAI,KAAKuS,KAAKslF,aAAaz/F,EAAEma,KAAK4nF,aAAa5nF,KAAK+vE,cAAc/vE,KAAKyoF,YAAYzoF,KAAK8lF,cAAc,KAAK9lF,KAAKwf,KAAKzxB,EAAEiS,KAAKgxF,aAAahxF,KAAK1Z,MAAM,EAAE0Z,KAAKolF,UAAU,KAAKplF,KAAK0nF,WAAW1nF,KAAK8nF,MAAM,EAAE9nF,KAAK4vE,UAAU,IAAI,CAAC,SAASsV,GAAGt/F,EAAEC,EAAEgI,EAAEE,GAAG,OAAO,IAAIoqG,GAAGvyG,EAAEC,EAAEgI,EAAEE,EAAE,CAAC,SAAS6gG,GAAGhpG,GAAiB,UAAdA,EAAEA,EAAEa,aAAuBb,EAAEwyG,iBAAiB,CAEpd,SAAS3R,GAAG7gG,EAAEC,GAAG,IAAIgI,EAAEjI,EAAEgqF,UACuB,OADb,OAAO/hF,IAAGA,EAAEq3F,GAAGt/F,EAAEuhF,IAAIthF,EAAED,EAAEiB,IAAIjB,EAAE45B,OAAQ2lE,YAAYv/F,EAAEu/F,YAAYt3F,EAAElG,KAAK/B,EAAE+B,KAAKkG,EAAE4gF,UAAU7oF,EAAE6oF,UAAU5gF,EAAE+hF,UAAUhqF,EAAEA,EAAEgqF,UAAU/hF,IAAIA,EAAEy3F,aAAaz/F,EAAEgI,EAAElG,KAAK/B,EAAE+B,KAAKkG,EAAEvH,MAAM,EAAEuH,EAAEmjG,aAAa,EAAEnjG,EAAEu3F,UAAU,MAAMv3F,EAAEvH,MAAc,SAARV,EAAEU,MAAeuH,EAAE65F,WAAW9hG,EAAE8hG,WAAW75F,EAAEi6F,MAAMliG,EAAEkiG,MAAMj6F,EAAEsiF,MAAMvqF,EAAEuqF,MAAMtiF,EAAEi4F,cAAclgG,EAAEkgG,cAAcj4F,EAAEkiF,cAAcnqF,EAAEmqF,cAAcliF,EAAE46F,YAAY7iG,EAAE6iG,YAAY5iG,EAAED,EAAEgiG,aAAa/5F,EAAE+5F,aAAa,OAAO/hG,EAAE,KAAK,CAACiiG,MAAMjiG,EAAEiiG,MAAMD,aAAahiG,EAAEgiG,cAC/eh6F,EAAEuiF,QAAQxqF,EAAEwqF,QAAQviF,EAAEkY,MAAMngB,EAAEmgB,MAAMlY,EAAEJ,IAAI7H,EAAE6H,IAAWI,CAAC,CACxD,SAAS84F,GAAG/gG,EAAEC,EAAEgI,EAAEE,EAAErE,EAAEqD,GAAG,IAAIe,EAAE,EAAM,GAAJC,EAAEnI,EAAK,oBAAoBA,EAAEgpG,GAAGhpG,KAAKkI,EAAE,QAAQ,GAAG,kBAAkBlI,EAAEkI,EAAE,OAAOlI,EAAE,OAAOA,GAAG,KAAKi6D,EAAG,OAAOinC,GAAGj5F,EAAEm7E,SAASt/E,EAAEqD,EAAElH,GAAG,KAAKujE,EAAGt7D,EAAE,EAAEpE,GAAG,EAAE,MAAM,KAAKi7D,EAAG,OAAO/+D,EAAEs/F,GAAG,GAAGr3F,EAAEhI,EAAI,EAAF6D,IAAOy7F,YAAYxgC,EAAG/+D,EAAEkiG,MAAM/6F,EAAEnH,EAAE,KAAK26D,EAAG,OAAO36D,EAAEs/F,GAAG,GAAGr3F,EAAEhI,EAAE6D,IAAKy7F,YAAY5kC,EAAG36D,EAAEkiG,MAAM/6F,EAAEnH,EAAE,KAAK2hE,EAAG,OAAO3hE,EAAEs/F,GAAG,GAAGr3F,EAAEhI,EAAE6D,IAAKy7F,YAAY59B,EAAG3hE,EAAEkiG,MAAM/6F,EAAEnH,EAAE,KAAK2gE,EAAG,OAAOgqC,GAAG1iG,EAAEnE,EAAEqD,EAAElH,GAAG,QAAQ,GAAG,kBAAkBD,GAAG,OAAOA,EAAE,OAAOA,EAAEqI,UAAU,KAAKk6D,EAAGr6D,EAAE,GAAG,MAAMlI,EAAE,KAAKihE,EAAG/4D,EAAE,EAAE,MAAMlI,EAAE,KAAKygE,EAAGv4D,EAAE,GACpf,MAAMlI,EAAE,KAAKgnE,EAAG9+D,EAAE,GAAG,MAAMlI,EAAE,KAAKyiE,EAAGv6D,EAAE,GAAGC,EAAE,KAAK,MAAMnI,EAAE,MAAMsR,MAAM1J,EAAE,IAAI,MAAM5H,EAAEA,SAASA,EAAE,KAAuD,OAAjDC,EAAEq/F,GAAGp3F,EAAED,EAAEhI,EAAE6D,IAAKy7F,YAAYv/F,EAAEC,EAAE8B,KAAKoG,EAAElI,EAAEiiG,MAAM/6F,EAASlH,CAAC,CAAC,SAASihG,GAAGlhG,EAAEC,EAAEgI,EAAEE,GAA2B,OAAxBnI,EAAEs/F,GAAG,EAAEt/F,EAAEmI,EAAElI,IAAKiiG,MAAMj6F,EAASjI,CAAC,CAAC,SAAS2qG,GAAG3qG,EAAEC,EAAEgI,EAAEE,GAAuE,OAApEnI,EAAEs/F,GAAG,GAAGt/F,EAAEmI,EAAElI,IAAKs/F,YAAY5+B,EAAG3gE,EAAEkiG,MAAMj6F,EAAEjI,EAAE6oF,UAAU,CAACylB,UAAS,GAAWtuG,CAAC,CAAC,SAAS8gG,GAAG9gG,EAAEC,EAAEgI,GAA8B,OAA3BjI,EAAEs/F,GAAG,EAAEt/F,EAAE,KAAKC,IAAKiiG,MAAMj6F,EAASjI,CAAC,CAC5W,SAASihG,GAAGjhG,EAAEC,EAAEgI,GAA8J,OAA3JhI,EAAEq/F,GAAG,EAAE,OAAOt/F,EAAEojF,SAASpjF,EAAEojF,SAAS,GAAGpjF,EAAEiB,IAAIhB,IAAKiiG,MAAMj6F,EAAEhI,EAAE4oF,UAAU,CAACqG,cAAclvF,EAAEkvF,cAAcujB,gBAAgB,KAAKzR,eAAehhG,EAAEghG,gBAAuB/gG,CAAC,CACtL,SAASyyG,GAAG1yG,EAAEC,EAAEgI,EAAEE,EAAErE,GAAGsW,KAAKmnE,IAAIthF,EAAEma,KAAK80E,cAAclvF,EAAEoa,KAAKg3F,aAAah3F,KAAK2uF,UAAU3uF,KAAK5R,QAAQ4R,KAAKq4F,gBAAgB,KAAKr4F,KAAKm3F,eAAe,EAAEn3F,KAAK+1F,aAAa/1F,KAAK6vF,eAAe7vF,KAAK9V,QAAQ,KAAK8V,KAAKm2F,iBAAiB,EAAEn2F,KAAKgzE,WAAWF,GAAG,GAAG9yE,KAAKg2F,gBAAgBljB,IAAI,GAAG9yE,KAAKyyE,eAAezyE,KAAKi3F,cAAcj3F,KAAKy3F,iBAAiBz3F,KAAKi2F,aAAaj2F,KAAKwyE,YAAYxyE,KAAKuyE,eAAevyE,KAAKsyE,aAAa,EAAEtyE,KAAK0yE,cAAcI,GAAG,GAAG9yE,KAAKwtF,iBAAiBz/F,EAAEiS,KAAK83F,mBAAmBpuG,EAAEsW,KAAKu4F,gCAC/e,IAAI,CAAC,SAAS3gC,GAAGhyE,EAAEC,EAAEgI,EAAEE,EAAErE,EAAEqD,EAAEe,EAAEE,EAAEhB,GAAgN,OAA7MpH,EAAE,IAAI0yG,GAAG1yG,EAAEC,EAAEgI,EAAEG,EAAEhB,GAAG,IAAInH,GAAGA,EAAE,GAAE,IAAKkH,IAAIlH,GAAG,IAAIA,EAAE,EAAEkH,EAAEm4F,GAAG,EAAE,KAAK,KAAKr/F,GAAGD,EAAEwI,QAAQrB,EAAEA,EAAE0hF,UAAU7oF,EAAEmH,EAAEgjF,cAAc,CAACmP,QAAQnxF,EAAE8mF,aAAahnF,EAAEyoD,MAAM,KAAK44C,YAAY,KAAKsJ,0BAA0B,MAAMhQ,GAAGz7F,GAAUnH,CAAC,CACzP,SAASiyE,GAAGjyE,GAAG,IAAIA,EAAE,OAAOk9F,GAAuBl9F,EAAE,CAAC,GAAG+pF,GAA1B/pF,EAAEA,EAAE8nG,mBAA8B9nG,GAAG,IAAIA,EAAEuhF,IAAI,MAAMjwE,MAAM1J,EAAE,MAAM,IAAI3H,EAAED,EAAE,EAAE,CAAC,OAAOC,EAAEshF,KAAK,KAAK,EAAEthF,EAAEA,EAAE4oF,UAAUvkF,QAAQ,MAAMtE,EAAE,KAAK,EAAE,GAAGw9F,GAAGv9F,EAAE8B,MAAM,CAAC9B,EAAEA,EAAE4oF,UAAUiV,0CAA0C,MAAM99F,CAAC,EAAEC,EAAEA,EAAEgqF,MAAM,OAAO,OAAOhqF,GAAG,MAAMqR,MAAM1J,EAAE,KAAM,CAAC,GAAG,IAAI5H,EAAEuhF,IAAI,CAAC,IAAIt5E,EAAEjI,EAAE+B,KAAK,GAAGy7F,GAAGv1F,GAAG,OAAO01F,GAAG39F,EAAEiI,EAAEhI,EAAE,CAAC,OAAOA,CAAC,CACpW,SAAS4yG,GAAG7yG,EAAEC,EAAEgI,EAAEE,EAAErE,EAAEqD,EAAEe,EAAEE,EAAEhB,GAAwK,OAArKpH,EAAEgyE,GAAG/pE,EAAEE,GAAE,EAAGnI,EAAE8D,EAAEqD,EAAEe,EAAEE,EAAEhB,IAAK9C,QAAQ2tE,GAAG,MAAMhqE,EAAEjI,EAAEwI,SAAsBrB,EAAEk8F,GAAhBl7F,EAAEqR,KAAI1V,EAAEkuC,GAAG/pC,KAAeu7F,cAAS,IAASvjG,GAAG,OAAOA,EAAEA,EAAE,KAAKwjG,GAAGx7F,EAAEd,EAAErD,GAAG9D,EAAEwI,QAAQ05F,MAAMp+F,EAAEqpF,GAAGntF,EAAE8D,EAAEqE,GAAG+nG,GAAGlwG,EAAEmI,GAAUnI,CAAC,CAAC,SAAS8yG,GAAG9yG,EAAEC,EAAEgI,EAAEE,GAAG,IAAIrE,EAAE7D,EAAEuI,QAAQrB,EAAEqS,KAAItR,EAAE8pC,GAAGluC,GAAsL,OAAnLmE,EAAEgqE,GAAGhqE,GAAG,OAAOhI,EAAEqE,QAAQrE,EAAEqE,QAAQ2D,EAAEhI,EAAEgqG,eAAehiG,GAAEhI,EAAEojG,GAAGl8F,EAAEe,IAAKioC,QAAQ,CAACmpD,QAAQt5F,GAAuB,QAApBmI,OAAE,IAASA,EAAE,KAAKA,KAAalI,EAAEujG,SAASr7F,GAAe,QAAZnI,EAAEyjG,GAAG3/F,EAAE7D,EAAEiI,MAAcynC,GAAG3vC,EAAE8D,EAAEoE,EAAEf,GAAGu8F,GAAG1jG,EAAE8D,EAAEoE,IAAWA,CAAC,CAC3b,SAAS6qG,GAAG/yG,GAAe,OAAZA,EAAEA,EAAEwI,SAAc+hF,OAAyBvqF,EAAEuqF,MAAMhJ,IAAoDvhF,EAAEuqF,MAAM1B,WAAhF,IAA0F,CAAC,SAASmqB,GAAGhzG,EAAEC,GAAqB,GAAG,QAArBD,EAAEA,EAAEmqF,gBAA2B,OAAOnqF,EAAEoqF,WAAW,CAAC,IAAIniF,EAAEjI,EAAE6/F,UAAU7/F,EAAE6/F,UAAU,IAAI53F,GAAGA,EAAEhI,EAAEgI,EAAEhI,CAAC,CAAC,CAAC,SAASgzG,GAAGjzG,EAAEC,GAAG+yG,GAAGhzG,EAAEC,IAAID,EAAEA,EAAEgqF,YAAYgpB,GAAGhzG,EAAEC,EAAE,CAnB7S8uG,GAAG,SAAS/uG,EAAEC,EAAEgI,GAAG,GAAG,OAAOjI,EAAE,GAAGA,EAAEkgG,gBAAgBjgG,EAAEy/F,cAAcvC,GAAG30F,QAAQ25F,IAAG,MAAO,CAAC,GAAG,KAAKniG,EAAEkiG,MAAMj6F,IAAI,KAAa,IAARhI,EAAES,OAAW,OAAOyhG,IAAG,EAzE1I,SAAYniG,EAAEC,EAAEgI,GAAG,OAAOhI,EAAEshF,KAAK,KAAK,EAAEyoB,GAAG/pG,GAAGmgG,KAAK,MAAM,KAAK,EAAEmE,GAAGtkG,GAAG,MAAM,KAAK,EAAEu9F,GAAGv9F,EAAE8B,OAAO87F,GAAG59F,GAAG,MAAM,KAAK,EAAEmkG,GAAGnkG,EAAEA,EAAE4oF,UAAUqG,eAAe,MAAM,KAAK,GAAG,IAAI/mF,EAAElI,EAAE8B,KAAKy/E,SAAS19E,EAAE7D,EAAEigG,cAAct0F,MAAMgS,GAAE0jF,GAAGn5F,EAAEy5F,eAAez5F,EAAEy5F,cAAc99F,EAAE,MAAM,KAAK,GAAqB,GAAG,QAArBqE,EAAElI,EAAEkqF,eAA2B,OAAG,OAAOhiF,EAAEiiF,YAAkBxsE,GAAErH,GAAY,EAAVA,GAAE/N,SAAWvI,EAAES,OAAO,IAAI,MAAQ,KAAKuH,EAAEhI,EAAEsqF,MAAMuX,YAAmB2I,GAAGzqG,EAAEC,EAAEgI,IAAG2V,GAAErH,GAAY,EAAVA,GAAE/N,SAA8B,QAAnBxI,EAAE89C,GAAG99C,EAAEC,EAAEgI,IAAmBjI,EAAEwqF,QAAQ,MAAK5sE,GAAErH,GAAY,EAAVA,GAAE/N,SAAW,MAAM,KAAK,GAC7d,GADgeL,EAAE,KAAKF,EACrfhI,EAAE6hG,YAAe,KAAa,IAAR9hG,EAAEU,OAAW,CAAC,GAAGyH,EAAE,OAAO0jG,GAAG7rG,EAAEC,EAAEgI,GAAGhI,EAAES,OAAO,GAAG,CAA6F,GAA1E,QAAlBoD,EAAE7D,EAAEkqF,iBAAyBrmF,EAAE0nG,UAAU,KAAK1nG,EAAE6nG,KAAK,KAAK7nG,EAAE8iG,WAAW,MAAMhpF,GAAErH,GAAEA,GAAE/N,SAAYL,EAAE,MAAW,OAAO,KAAK,KAAK,GAAG,KAAK,GAAG,OAAOlI,EAAEiiG,MAAM,EAAEiH,GAAGnpG,EAAEC,EAAEgI,GAAG,OAAO61C,GAAG99C,EAAEC,EAAEgI,EAAE,CAwE7GirG,CAAGlzG,EAAEC,EAAEgI,GAAGk6F,GAAG,KAAa,OAARniG,EAAEU,MAAmB,MAAMyhG,IAAG,EAAGtoF,IAAG,KAAa,QAAR5Z,EAAES,QAAgBq+F,GAAG9+F,EAAEu+F,GAAGv+F,EAAEkgB,OAAiB,OAAVlgB,EAAEiiG,MAAM,EAASjiG,EAAEshF,KAAK,KAAK,EAAE,IAAIp5E,EAAElI,EAAE8B,KAAK4nG,GAAG3pG,EAAEC,GAAGD,EAAEC,EAAEy/F,aAAa,IAAI57F,EAAEu5F,GAAGp9F,EAAEsgB,GAAE/X,SAASu5F,GAAG9hG,EAAEgI,GAAGnE,EAAEyhG,GAAG,KAAKtlG,EAAEkI,EAAEnI,EAAE8D,EAAEmE,GAAG,IAAId,EAAEy+F,KACvI,OAD4I3lG,EAAES,OAAO,EAAE,kBAAkBoD,GAAG,OAAOA,GAAG,oBAAoBA,EAAEjB,aAAQ,IAASiB,EAAEuE,UAAUpI,EAAEshF,IAAI,EAAEthF,EAAEkqF,cAAc,KAAKlqF,EAAE4iG,YAC1e,KAAKrF,GAAGr1F,IAAIhB,GAAE,EAAG02F,GAAG59F,IAAIkH,GAAE,EAAGlH,EAAEkqF,cAAc,OAAOrmF,EAAE2xC,YAAO,IAAS3xC,EAAE2xC,MAAM3xC,EAAE2xC,MAAM,KAAKmtD,GAAG3iG,GAAG6D,EAAEskG,QAAQ1wD,GAAGz3C,EAAE4oF,UAAU/kF,EAAEA,EAAEgkG,gBAAgB7nG,EAAE4zC,GAAG5zC,EAAEkI,EAAEnI,EAAEiI,GAAGhI,EAAE8pG,GAAG,KAAK9pG,EAAEkI,GAAE,EAAGhB,EAAEc,KAAKhI,EAAEshF,IAAI,EAAE1nE,IAAG1S,GAAG63F,GAAG/+F,GAAGs9C,GAAG,KAAKt9C,EAAE6D,EAAEmE,GAAGhI,EAAEA,EAAEsqF,OAActqF,EAAE,KAAK,GAAGkI,EAAElI,EAAEs/F,YAAYv/F,EAAE,CAAqF,OAApF2pG,GAAG3pG,EAAEC,GAAGD,EAAEC,EAAEy/F,aAAuBv3F,GAAVrE,EAAEqE,EAAEu5E,OAAUv5E,EAAEs5E,UAAUxhF,EAAE8B,KAAKoG,EAAErE,EAAE7D,EAAEshF,IAQtU,SAAYvhF,GAAG,GAAG,oBAAoBA,EAAE,OAAOgpG,GAAGhpG,GAAG,EAAE,EAAE,QAAG,IAASA,GAAG,OAAOA,EAAE,CAAc,IAAbA,EAAEA,EAAEqI,YAAgBo4D,EAAG,OAAO,GAAG,GAAGzgE,IAAIgnE,EAAG,OAAO,EAAE,CAAC,OAAO,CAAC,CAR2LmsC,CAAGhrG,GAAGnI,EAAE+zC,GAAG5rC,EAAEnI,GAAU8D,GAAG,KAAK,EAAE7D,EAAEipG,GAAG,KAAKjpG,EAAEkI,EAAEnI,EAAEiI,GAAG,MAAMjI,EAAE,KAAK,EAAEC,EAAEypG,GAAG,KAAKzpG,EAAEkI,EAAEnI,EAAEiI,GAAG,MAAMjI,EAAE,KAAK,GAAGC,EAAE88C,GAAG,KAAK98C,EAAEkI,EAAEnI,EAAEiI,GAAG,MAAMjI,EAAE,KAAK,GAAGC,EAAE49C,GAAG,KAAK59C,EAAEkI,EAAE4rC,GAAG5rC,EAAEpG,KAAK/B,GAAGiI,GAAG,MAAMjI,EAAE,MAAMsR,MAAM1J,EAAE,IACvgBO,EAAE,IAAK,CAAC,OAAOlI,EAAE,KAAK,EAAE,OAAOkI,EAAElI,EAAE8B,KAAK+B,EAAE7D,EAAEy/F,aAA2CwJ,GAAGlpG,EAAEC,EAAEkI,EAArCrE,EAAE7D,EAAEs/F,cAAcp3F,EAAErE,EAAEiwC,GAAG5rC,EAAErE,GAAcmE,GAAG,KAAK,EAAE,OAAOE,EAAElI,EAAE8B,KAAK+B,EAAE7D,EAAEy/F,aAA2CgK,GAAG1pG,EAAEC,EAAEkI,EAArCrE,EAAE7D,EAAEs/F,cAAcp3F,EAAErE,EAAEiwC,GAAG5rC,EAAErE,GAAcmE,GAAG,KAAK,EAAEjI,EAAE,CAAO,GAANgqG,GAAG/pG,GAAM,OAAOD,EAAE,MAAMsR,MAAM1J,EAAE,MAAMO,EAAElI,EAAEy/F,aAA+B57F,GAAlBqD,EAAElH,EAAEkqF,eAAkBmP,QAAQ8J,GAAGpjG,EAAEC,GAAG2jG,GAAG3jG,EAAEkI,EAAE,KAAKF,GAAG,IAAIC,EAAEjI,EAAEkqF,cAA0B,GAAZhiF,EAAED,EAAEoxF,QAAWnyF,EAAE8nF,aAAY,CAAC,GAAG9nF,EAAE,CAACmyF,QAAQnxF,EAAE8mF,cAAa,EAAGv+B,MAAMxoD,EAAEwoD,MAAMkiD,0BAA0B1qG,EAAE0qG,0BAA0BtJ,YAAYphG,EAAEohG,aAAarpG,EAAE4iG,YAAYC,UAChf37F,EAAElH,EAAEkqF,cAAchjF,EAAU,IAARlH,EAAES,MAAU,CAAuBT,EAAEiqG,GAAGlqG,EAAEC,EAAEkI,EAAEF,EAAjCnE,EAAE45C,GAAGpsC,MAAM1J,EAAE,MAAM3H,IAAmB,MAAMD,CAAC,CAAM,GAAGmI,IAAIrE,EAAE,CAAuB7D,EAAEiqG,GAAGlqG,EAAEC,EAAEkI,EAAEF,EAAjCnE,EAAE45C,GAAGpsC,MAAM1J,EAAE,MAAM3H,IAAmB,MAAMD,CAAC,CAAM,IAAIm/F,GAAG5C,GAAGt8F,EAAE4oF,UAAUqG,cAAcnL,YAAYmb,GAAGj/F,EAAE4Z,IAAE,EAAGulF,GAAG,KAAKn3F,EAAEo5F,GAAGphG,EAAE,KAAKkI,EAAEF,GAAGhI,EAAEsqF,MAAMtiF,EAAEA,GAAGA,EAAEvH,OAAe,EAATuH,EAAEvH,MAAS,KAAKuH,EAAEA,EAAEuiF,OAAQ,KAAI,CAAM,GAAL4V,KAAQj4F,IAAIrE,EAAE,CAAC7D,EAAE69C,GAAG99C,EAAEC,EAAEgI,GAAG,MAAMjI,CAAC,CAACu9C,GAAGv9C,EAAEC,EAAEkI,EAAEF,EAAE,CAAChI,EAAEA,EAAEsqF,KAAK,CAAC,OAAOtqF,EAAE,KAAK,EAAE,OAAOskG,GAAGtkG,GAAG,OAAOD,GAAG+/F,GAAG9/F,GAAGkI,EAAElI,EAAE8B,KAAK+B,EAAE7D,EAAEy/F,aAAav4F,EAAE,OAAOnH,EAAEA,EAAEkgG,cAAc,KAAKh4F,EAAEpE,EAAEs/E,SAAS0Y,GAAG3zF,EAAErE,GAAGoE,EAAE,KAAK,OAAOf,GAAG20F,GAAG3zF,EAAEhB,KAAKlH,EAAES,OAAO,IACnf+oG,GAAGzpG,EAAEC,GAAGs9C,GAAGv9C,EAAEC,EAAEiI,EAAED,GAAGhI,EAAEsqF,MAAM,KAAK,EAAE,OAAO,OAAOvqF,GAAG+/F,GAAG9/F,GAAG,KAAK,KAAK,GAAG,OAAOwqG,GAAGzqG,EAAEC,EAAEgI,GAAG,KAAK,EAAE,OAAOm8F,GAAGnkG,EAAEA,EAAE4oF,UAAUqG,eAAe/mF,EAAElI,EAAEy/F,aAAa,OAAO1/F,EAAEC,EAAEsqF,MAAM6W,GAAGnhG,EAAE,KAAKkI,EAAEF,GAAGs1C,GAAGv9C,EAAEC,EAAEkI,EAAEF,GAAGhI,EAAEsqF,MAAM,KAAK,GAAG,OAAOpiF,EAAElI,EAAE8B,KAAK+B,EAAE7D,EAAEy/F,aAA2C3iD,GAAG/8C,EAAEC,EAAEkI,EAArCrE,EAAE7D,EAAEs/F,cAAcp3F,EAAErE,EAAEiwC,GAAG5rC,EAAErE,GAAcmE,GAAG,KAAK,EAAE,OAAOs1C,GAAGv9C,EAAEC,EAAEA,EAAEy/F,aAAaz3F,GAAGhI,EAAEsqF,MAAM,KAAK,EAAmD,KAAK,GAAG,OAAOhtC,GAAGv9C,EAAEC,EAAEA,EAAEy/F,aAAatc,SAASn7E,GAAGhI,EAAEsqF,MAAM,KAAK,GAAGvqF,EAAE,CACxZ,GADyZmI,EAAElI,EAAE8B,KAAKy/E,SAAS19E,EAAE7D,EAAEy/F,aAAav4F,EAAElH,EAAEigG,cAClfh4F,EAAEpE,EAAE8H,MAAMgS,GAAE0jF,GAAGn5F,EAAEy5F,eAAez5F,EAAEy5F,cAAc15F,EAAK,OAAOf,EAAE,GAAG8hB,GAAG9hB,EAAEyE,MAAM1D,IAAI,GAAGf,EAAEi8E,WAAWt/E,EAAEs/E,WAAW+Z,GAAG30F,QAAQ,CAACvI,EAAE69C,GAAG99C,EAAEC,EAAEgI,GAAG,MAAMjI,CAAC,OAAO,IAAc,QAAVmH,EAAElH,EAAEsqF,SAAiBpjF,EAAE8iF,OAAOhqF,GAAG,OAAOkH,GAAG,CAAC,IAAIiB,EAAEjB,EAAE66F,aAAa,GAAG,OAAO55F,EAAE,CAACF,EAAEf,EAAEojF,MAAM,IAAI,IAAInjF,EAAEgB,EAAE65F,aAAa,OAAO76F,GAAG,CAAC,GAAGA,EAAE9C,UAAU6D,EAAE,CAAC,GAAG,IAAIhB,EAAEo6E,IAAI,EAACn6E,EAAEi8F,IAAI,EAAEp7F,GAAGA,IAAKs5E,IAAI,EAAE,IAAIh6E,EAAEJ,EAAE07F,YAAY,GAAG,OAAOt7F,EAAE,CAAY,IAAIC,GAAfD,EAAEA,EAAE07F,QAAeC,QAAQ,OAAO17F,EAAEJ,EAAE+5F,KAAK/5F,GAAGA,EAAE+5F,KAAK35F,EAAE25F,KAAK35F,EAAE25F,KAAK/5F,GAAGG,EAAE27F,QAAQ97F,CAAC,CAAC,CAACD,EAAE+6F,OAAOj6F,EAAgB,QAAdb,EAAED,EAAE6iF,aAAqB5iF,EAAE86F,OAAOj6F,GAAG45F,GAAG16F,EAAE8iF,OAClfhiF,EAAEhI,GAAGmI,EAAE85F,OAAOj6F,EAAE,KAAK,CAACb,EAAEA,EAAE+5F,IAAI,CAAC,MAAM,GAAG,KAAKh6F,EAAEo6E,IAAIr5E,EAAEf,EAAEpF,OAAO9B,EAAE8B,KAAK,KAAKoF,EAAEojF,WAAW,GAAG,KAAKpjF,EAAEo6E,IAAI,CAAY,GAAG,QAAdr5E,EAAEf,EAAE8iF,QAAmB,MAAM34E,MAAM1J,EAAE,MAAMM,EAAEg6F,OAAOj6F,EAAgB,QAAdG,EAAEF,EAAE8hF,aAAqB5hF,EAAE85F,OAAOj6F,GAAG45F,GAAG35F,EAAED,EAAEhI,GAAGiI,EAAEf,EAAEqjF,OAAO,MAAMtiF,EAAEf,EAAEojF,MAAM,GAAG,OAAOriF,EAAEA,EAAE+hF,OAAO9iF,OAAO,IAAIe,EAAEf,EAAE,OAAOe,GAAG,CAAC,GAAGA,IAAIjI,EAAE,CAACiI,EAAE,KAAK,KAAK,CAAa,GAAG,QAAff,EAAEe,EAAEsiF,SAAoB,CAACrjF,EAAE8iF,OAAO/hF,EAAE+hF,OAAO/hF,EAAEf,EAAE,KAAK,CAACe,EAAEA,EAAE+hF,MAAM,CAAC9iF,EAAEe,CAAC,CAACq1C,GAAGv9C,EAAEC,EAAE6D,EAAEs/E,SAASn7E,GAAGhI,EAAEA,EAAEsqF,KAAK,CAAC,OAAOtqF,EAAE,KAAK,EAAE,OAAO6D,EAAE7D,EAAE8B,KAAKoG,EAAElI,EAAEy/F,aAAatc,SAAS2e,GAAG9hG,EAAEgI,GAAWE,EAAEA,EAAVrE,EAAEs+F,GAAGt+F,IAAU7D,EAAES,OAAO,EAAE68C,GAAGv9C,EAAEC,EAAEkI,EAAEF,GACpfhI,EAAEsqF,MAAM,KAAK,GAAG,OAAgBzmF,EAAEiwC,GAAX5rC,EAAElI,EAAE8B,KAAY9B,EAAEy/F,cAA6B7hD,GAAG79C,EAAEC,EAAEkI,EAAtBrE,EAAEiwC,GAAG5rC,EAAEpG,KAAK+B,GAAcmE,GAAG,KAAK,GAAG,OAAOghG,GAAGjpG,EAAEC,EAAEA,EAAE8B,KAAK9B,EAAEy/F,aAAaz3F,GAAG,KAAK,GAAG,OAAOE,EAAElI,EAAE8B,KAAK+B,EAAE7D,EAAEy/F,aAAa57F,EAAE7D,EAAEs/F,cAAcp3F,EAAErE,EAAEiwC,GAAG5rC,EAAErE,GAAG6lG,GAAG3pG,EAAEC,GAAGA,EAAEshF,IAAI,EAAEic,GAAGr1F,IAAInI,GAAE,EAAG69F,GAAG59F,IAAID,GAAE,EAAG+hG,GAAG9hG,EAAEgI,GAAGs0C,GAAGt8C,EAAEkI,EAAErE,GAAG+vC,GAAG5zC,EAAEkI,EAAErE,EAAEmE,GAAG8hG,GAAG,KAAK9pG,EAAEkI,GAAE,EAAGnI,EAAEiI,GAAG,KAAK,GAAG,OAAO4jG,GAAG7rG,EAAEC,EAAEgI,GAAG,KAAK,GAAG,OAAOkhG,GAAGnpG,EAAEC,EAAEgI,GAAG,MAAMqJ,MAAM1J,EAAE,IAAI3H,EAAEshF,KAAM,EAYxC,IAAI6xB,GAAG,oBAAoBC,YAAYA,YAAY,SAASrzG,GAAGsQ,QAAQhB,MAAMtP,EAAE,EAAE,SAASszG,GAAGtzG,GAAGoa,KAAKm5F,cAAcvzG,CAAC,CACjI,SAASwzG,GAAGxzG,GAAGoa,KAAKm5F,cAAcvzG,CAAC,CAC5J,SAASyzG,GAAGzzG,GAAG,SAASA,GAAG,IAAIA,EAAEkkF,UAAU,IAAIlkF,EAAEkkF,UAAU,KAAKlkF,EAAEkkF,SAAS,CAAC,SAASwvB,GAAG1zG,GAAG,SAASA,GAAG,IAAIA,EAAEkkF,UAAU,IAAIlkF,EAAEkkF,UAAU,KAAKlkF,EAAEkkF,WAAW,IAAIlkF,EAAEkkF,UAAU,iCAAiClkF,EAAE6lB,WAAW,CAAC,SAAS8tF,KAAK,CAExa,SAASC,GAAG5zG,EAAEC,EAAEgI,EAAEE,EAAErE,GAAG,IAAIqD,EAAEc,EAAEylG,oBAAoB,GAAGvmG,EAAE,CAAC,IAAIe,EAAEf,EAAE,GAAG,oBAAoBrD,EAAE,CAAC,IAAIsE,EAAEtE,EAAEA,EAAE,WAAW,IAAI9D,EAAE+yG,GAAG7qG,GAAGE,EAAEpH,KAAKhB,EAAE,CAAC,CAAC8yG,GAAG7yG,EAAEiI,EAAElI,EAAE8D,EAAE,MAAMoE,EADxJ,SAAYlI,EAAEC,EAAEgI,EAAEE,EAAErE,GAAG,GAAGA,EAAE,CAAC,GAAG,oBAAoBqE,EAAE,CAAC,IAAIhB,EAAEgB,EAAEA,EAAE,WAAW,IAAInI,EAAE+yG,GAAG7qG,GAAGf,EAAEnG,KAAKhB,EAAE,CAAC,CAAC,IAAIkI,EAAE2qG,GAAG5yG,EAAEkI,EAAEnI,EAAE,EAAE,MAAK,EAAG,EAAG,GAAG2zG,IAAmF,OAA/E3zG,EAAE0tG,oBAAoBxlG,EAAElI,EAAEk7F,IAAIhzF,EAAEM,QAAQ8rE,GAAG,IAAIt0E,EAAEkkF,SAASlkF,EAAEuoF,WAAWvoF,GAAGyxG,KAAYvpG,CAAC,CAAC,KAAKpE,EAAE9D,EAAEikF,WAAWjkF,EAAEo5D,YAAYt1D,GAAG,GAAG,oBAAoBqE,EAAE,CAAC,IAAIC,EAAED,EAAEA,EAAE,WAAW,IAAInI,EAAE+yG,GAAG3rG,GAAGgB,EAAEpH,KAAKhB,EAAE,CAAC,CAAC,IAAIoH,EAAE4qE,GAAGhyE,EAAE,GAAE,EAAG,KAAK,GAAK,EAAG,EAAG,GAAG2zG,IAA0G,OAAtG3zG,EAAE0tG,oBAAoBtmG,EAAEpH,EAAEk7F,IAAI9zF,EAAEoB,QAAQ8rE,GAAG,IAAIt0E,EAAEkkF,SAASlkF,EAAEuoF,WAAWvoF,GAAGyxG,IAAG,WAAWqB,GAAG7yG,EAAEmH,EAAEa,EAAEE,EAAE,IAAUf,CAAC,CACpUysG,CAAG5rG,EAAEhI,EAAED,EAAE8D,EAAEqE,GAAG,OAAO4qG,GAAG7qG,EAAE,CAHpLsrG,GAAG3yG,UAAUgC,OAAOywG,GAAGzyG,UAAUgC,OAAO,SAAS7C,GAAG,IAAIC,EAAEma,KAAKm5F,cAAc,GAAG,OAAOtzG,EAAE,MAAMqR,MAAM1J,EAAE,MAAMkrG,GAAG9yG,EAAEC,EAAE,KAAK,KAAK,EAAEuzG,GAAG3yG,UAAUizG,QAAQR,GAAGzyG,UAAUizG,QAAQ,WAAW,IAAI9zG,EAAEoa,KAAKm5F,cAAc,GAAG,OAAOvzG,EAAE,CAACoa,KAAKm5F,cAAc,KAAK,IAAItzG,EAAED,EAAEkvF,cAAcuiB,IAAG,WAAWqB,GAAG,KAAK9yG,EAAE,KAAK,KAAK,IAAGC,EAAEi7F,IAAI,IAAI,CAAC,EACzTsY,GAAG3yG,UAAUkzG,2BAA2B,SAAS/zG,GAAG,GAAGA,EAAE,CAAC,IAAIC,EAAEytF,KAAK1tF,EAAE,CAAC0uF,UAAU,KAAKtG,OAAOpoF,EAAEgvF,SAAS/uF,GAAG,IAAI,IAAIgI,EAAE,EAAEA,EAAEkmF,GAAGhuF,QAAQ,IAAIF,GAAGA,EAAEkuF,GAAGlmF,GAAG+mF,SAAS/mF,KAAKkmF,GAAG7iE,OAAOrjB,EAAE,EAAEjI,GAAG,IAAIiI,GAAG6mF,GAAG9uF,EAAE,CAAC,EAEXutF,GAAG,SAASvtF,GAAG,OAAOA,EAAEuhF,KAAK,KAAK,EAAE,IAAIthF,EAAED,EAAE6oF,UAAU,GAAG5oF,EAAEuI,QAAQ2hF,cAAc8E,aAAa,CAAC,IAAIhnF,EAAEukF,GAAGvsF,EAAEysF,cAAc,IAAIzkF,IAAIolF,GAAGptF,EAAI,EAAFgI,GAAKioG,GAAGjwG,EAAEid,MAAK,KAAO,EAAF8C,MAAOysF,GAAGvvF,KAAI,IAAIkhF,MAAM,CAAC,MAAM,KAAK,GAAGqT,IAAG,WAAW,IAAIxxG,EAAEyiG,GAAG1iG,EAAE,GAAG,GAAG,OAAOC,EAAE,CAAC,IAAIgI,EAAEuR,KAAIm2B,GAAG1vC,EAAED,EAAE,EAAEiI,EAAE,CAAC,IAAGgrG,GAAGjzG,EAAE,GAAG,EAC/bwtF,GAAG,SAASxtF,GAAG,GAAG,KAAKA,EAAEuhF,IAAI,CAAC,IAAIthF,EAAEyiG,GAAG1iG,EAAE,WAAW,GAAG,OAAOC,EAAa0vC,GAAG1vC,EAAED,EAAE,UAAXwZ,MAAwBy5F,GAAGjzG,EAAE,UAAU,CAAC,EAAEytF,GAAG,SAASztF,GAAG,GAAG,KAAKA,EAAEuhF,IAAI,CAAC,IAAIthF,EAAE+xC,GAAGhyC,GAAGiI,EAAEy6F,GAAG1iG,EAAEC,GAAG,GAAG,OAAOgI,EAAa0nC,GAAG1nC,EAAEjI,EAAEC,EAAXuZ,MAAgBy5F,GAAGjzG,EAAEC,EAAE,CAAC,EAAEytF,GAAG,WAAW,OAAOzzE,EAAC,EAAE0zE,GAAG,SAAS3tF,EAAEC,GAAG,IAAIgI,EAAEgS,GAAE,IAAI,OAAOA,GAAEja,EAAEC,GAAG,CAAC,QAAQga,GAAEhS,CAAC,CAAC,EAClSugF,GAAG,SAASxoF,EAAEC,EAAEgI,GAAG,OAAOhI,GAAG,IAAK,QAAyB,GAAjBwiF,EAAGziF,EAAEiI,GAAGhI,EAAEgI,EAAEhG,KAAQ,UAAUgG,EAAElG,MAAM,MAAM9B,EAAE,CAAC,IAAIgI,EAAEjI,EAAEiI,EAAEsgF,YAAYtgF,EAAEA,EAAEsgF,WAAsF,IAA3EtgF,EAAEA,EAAEkxD,iBAAiB,cAAcr+B,KAAKC,UAAU,GAAG96B,GAAG,mBAAuBA,EAAE,EAAEA,EAAEgI,EAAE9H,OAAOF,IAAI,CAAC,IAAIkI,EAAEF,EAAEhI,GAAG,GAAGkI,IAAInI,GAAGmI,EAAE6rG,OAAOh0G,EAAEg0G,KAAK,CAAC,IAAIlwG,EAAEglF,GAAG3gF,GAAG,IAAIrE,EAAE,MAAMwN,MAAM1J,EAAE,KAAKk7D,EAAG36D,GAAGs6E,EAAGt6E,EAAErE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAK,WAAWw/E,GAAGtjF,EAAEiI,GAAG,MAAM,IAAK,SAAmB,OAAVhI,EAAEgI,EAAE2D,QAAek3E,GAAG9iF,IAAIiI,EAAEikG,SAASjsG,GAAE,GAAI,EAAEgpF,GAAGuoB,GAAGtoB,GAAGuoB,GACpa,IAAIwC,GAAG,CAACC,uBAAsB,EAAGC,OAAO,CAACvrB,GAAG5iE,GAAG8iE,GAAGC,GAAGC,GAAGwoB,KAAK4C,GAAG,CAACC,wBAAwBtlB,GAAGulB,WAAW,EAAEvkG,QAAQ,SAASwkG,oBAAoB,aAC1IC,GAAG,CAACF,WAAWF,GAAGE,WAAWvkG,QAAQqkG,GAAGrkG,QAAQwkG,oBAAoBH,GAAGG,oBAAoBE,eAAeL,GAAGK,eAAeC,kBAAkB,KAAKC,4BAA4B,KAAKC,4BAA4B,KAAKC,cAAc,KAAKC,wBAAwB,KAAKC,wBAAwB,KAAKC,gBAAgB,KAAKC,mBAAmB,KAAKC,eAAe,KAAKC,qBAAqB57C,EAAGwrC,uBAAuBqQ,wBAAwB,SAASp1G,GAAW,OAAO,QAAfA,EAAEsqF,GAAGtqF,IAAmB,KAAKA,EAAE6oF,SAAS,EAAEwrB,wBAAwBD,GAAGC,yBARjN,WAAc,OAAO,IAAI,EASpUgB,4BAA4B,KAAKlgC,gBAAgB,KAAKmgC,aAAa,KAAKC,kBAAkB,KAAKC,gBAAgB,KAAKC,kBAAkB,mCAAmC,GAAG,qBAAqBC,+BAA+B,CAAC,IAAIC,GAAGD,+BAA+B,IAAIC,GAAGC,YAAYD,GAAGE,cAAc,IAAI9pB,GAAG4pB,GAAGG,OAAOtB,IAAIxoB,GAAG2pB,EAAE,CAAC,MAAM31G,GAAG,CAAC,CAACF,EAAQ4H,mDAAmDusG,GAC/Yn0G,EAAQi2G,aAAa,SAAS/1G,EAAEC,GAAG,IAAIgI,EAAE,EAAE7F,UAAUjC,aAAQ,IAASiC,UAAU,GAAGA,UAAU,GAAG,KAAK,IAAIqxG,GAAGxzG,GAAG,MAAMqR,MAAM1J,EAAE,MAAM,OAbuH,SAAY5H,EAAEC,EAAEgI,GAAG,IAAIE,EAAE,EAAE/F,UAAUjC,aAAQ,IAASiC,UAAU,GAAGA,UAAU,GAAG,KAAK,MAAM,CAACiG,SAASu4D,EAAG3/D,IAAI,MAAMkH,EAAE,KAAK,GAAGA,EAAEi7E,SAASpjF,EAAEkvF,cAAcjvF,EAAE+gG,eAAe/4F,EAAE,CAa1R+tG,CAAGh2G,EAAEC,EAAE,KAAKgI,EAAE,EAAEnI,EAAQm2G,WAAW,SAASj2G,EAAEC,GAAG,IAAIwzG,GAAGzzG,GAAG,MAAMsR,MAAM1J,EAAE,MAAM,IAAIK,GAAE,EAAGE,EAAE,GAAGrE,EAAEsvG,GAA4P,OAAzP,OAAOnzG,QAAG,IAASA,KAAI,IAAKA,EAAEi2G,sBAAsBjuG,GAAE,QAAI,IAAShI,EAAE2nG,mBAAmBz/F,EAAElI,EAAE2nG,uBAAkB,IAAS3nG,EAAEiyG,qBAAqBpuG,EAAE7D,EAAEiyG,qBAAqBjyG,EAAE+xE,GAAGhyE,EAAE,GAAE,EAAG,KAAK,EAAKiI,EAAE,EAAGE,EAAErE,GAAG9D,EAAEk7F,IAAIj7F,EAAEuI,QAAQ8rE,GAAG,IAAIt0E,EAAEkkF,SAASlkF,EAAEuoF,WAAWvoF,GAAU,IAAIszG,GAAGrzG,EAAE,EACrfH,EAAQq2G,YAAY,SAASn2G,GAAG,GAAG,MAAMA,EAAE,OAAO,KAAK,GAAG,IAAIA,EAAEkkF,SAAS,OAAOlkF,EAAE,IAAIC,EAAED,EAAE8nG,gBAAgB,QAAG,IAAS7nG,EAAE,CAAC,GAAG,oBAAoBD,EAAE6C,OAAO,MAAMyO,MAAM1J,EAAE,MAAiC,MAA3B5H,EAAEY,OAAOP,KAAKL,GAAGqS,KAAK,KAAWf,MAAM1J,EAAE,IAAI5H,GAAI,CAAqC,OAA5BA,EAAE,QAAVA,EAAEsqF,GAAGrqF,IAAc,KAAKD,EAAE6oF,SAAkB,EAAE/oF,EAAQs2G,UAAU,SAASp2G,GAAG,OAAOyxG,GAAGzxG,EAAE,EAAEF,EAAQu2G,QAAQ,SAASr2G,EAAEC,EAAEgI,GAAG,IAAIyrG,GAAGzzG,GAAG,MAAMqR,MAAM1J,EAAE,MAAM,OAAOgsG,GAAG,KAAK5zG,EAAEC,GAAE,EAAGgI,EAAE,EAC/YnI,EAAQw2G,YAAY,SAASt2G,EAAEC,EAAEgI,GAAG,IAAIwrG,GAAGzzG,GAAG,MAAMsR,MAAM1J,EAAE,MAAM,IAAIO,EAAE,MAAMF,GAAGA,EAAEsuG,iBAAiB,KAAKzyG,GAAE,EAAGqD,EAAE,GAAGe,EAAEkrG,GAAyO,GAAtO,OAAOnrG,QAAG,IAASA,KAAI,IAAKA,EAAEiuG,sBAAsBpyG,GAAE,QAAI,IAASmE,EAAE2/F,mBAAmBzgG,EAAEc,EAAE2/F,uBAAkB,IAAS3/F,EAAEiqG,qBAAqBhqG,EAAED,EAAEiqG,qBAAqBjyG,EAAE4yG,GAAG5yG,EAAE,KAAKD,EAAE,EAAE,MAAMiI,EAAEA,EAAE,KAAKnE,EAAE,EAAGqD,EAAEe,GAAGlI,EAAEk7F,IAAIj7F,EAAEuI,QAAQ8rE,GAAGt0E,GAAMmI,EAAE,IAAInI,EAAE,EAAEA,EAAEmI,EAAEhI,OAAOH,IAA2B8D,GAAhBA,GAAPmE,EAAEE,EAAEnI,IAAOw2G,aAAgBvuG,EAAEwuG,SAAS,MAAMx2G,EAAE0yG,gCAAgC1yG,EAAE0yG,gCAAgC,CAAC1qG,EAAEnE,GAAG7D,EAAE0yG,gCAAgC9tF,KAAK5c,EACvhBnE,GAAG,OAAO,IAAI0vG,GAAGvzG,EAAE,EAAEH,EAAQ+C,OAAO,SAAS7C,EAAEC,EAAEgI,GAAG,IAAIyrG,GAAGzzG,GAAG,MAAMqR,MAAM1J,EAAE,MAAM,OAAOgsG,GAAG,KAAK5zG,EAAEC,GAAE,EAAGgI,EAAE,EAAEnI,EAAQ42G,uBAAuB,SAAS12G,GAAG,IAAI0zG,GAAG1zG,GAAG,MAAMsR,MAAM1J,EAAE,KAAK,QAAO5H,EAAE0tG,sBAAqB+D,IAAG,WAAWmC,GAAG,KAAK,KAAK5zG,GAAE,GAAG,WAAWA,EAAE0tG,oBAAoB,KAAK1tG,EAAEk7F,IAAI,IAAI,GAAE,KAAG,EAAM,EAAEp7F,EAAQ62G,wBAAwBnF,GAC/U1xG,EAAQ82G,oCAAoC,SAAS52G,EAAEC,EAAEgI,EAAEE,GAAG,IAAIurG,GAAGzrG,GAAG,MAAMqJ,MAAM1J,EAAE,MAAM,GAAG,MAAM5H,QAAG,IAASA,EAAE8nG,gBAAgB,MAAMx2F,MAAM1J,EAAE,KAAK,OAAOgsG,GAAG5zG,EAAEC,EAAEgI,GAAE,EAAGE,EAAE,EAAErI,EAAQiQ,QAAQ,yDCzT7LlQ,EAAOC,QAAU,SAAuBoG,GAItC,MAAO,8BAA8BP,KAAKO,EAC5C,+BCXA,IAAInC,EAAQ5C,EAAQ,MAChB01G,EAAsB11G,EAAQ,MAC9B8D,EAAa9D,EAAQ,MACrBwI,EAAuBxI,EAAQ,MAC/B6D,EAAa7D,EAAQ,MAErB21G,EAAuB,CACzB,eAAgB,qCAGlB,SAASC,EAAsB3sG,EAASwB,IACjC7H,EAAM6J,YAAYxD,IAAYrG,EAAM6J,YAAYxD,EAAQ,mBAC3DA,EAAQ,gBAAkBwB,EAE9B,CA6BA,IAAIorG,EAAW,CAEbjqG,aAAcpD,EAEdstG,QA/BF,WACE,IAAIA,EAQJ,OAP8B,qBAAnBrsG,gBAGmB,qBAAZssG,SAAuE,qBAA5Ct2G,OAAOC,UAAUC,SAASE,KAAKk2G,YAD1ED,EAAU91G,EAAQ,OAKb81G,CACT,CAqBWE,GAETC,iBAAkB,CAAC,SAA0BltG,EAAME,GAIjD,GAHAysG,EAAoBzsG,EAAS,UAC7BysG,EAAoBzsG,EAAS,gBAEzBrG,EAAM4G,WAAWT,IACnBnG,EAAMszG,cAAcntG,IACpBnG,EAAMuzG,SAASptG,IACfnG,EAAMwzG,SAASrtG,IACfnG,EAAMyzG,OAAOttG,IACbnG,EAAM0zG,OAAOvtG,GAEb,OAAOA,EAET,GAAInG,EAAM2zG,kBAAkBxtG,GAC1B,OAAOA,EAAKib,OAEd,GAAIphB,EAAM4zG,kBAAkBztG,GAE1B,OADA6sG,EAAsB3sG,EAAS,mDACxBF,EAAKpJ,WAGd,IAGI82G,EAHAC,EAAkB9zG,EAAM+zG,SAAS5tG,GACjCu8B,EAAcr8B,GAAWA,EAAQ,gBAIrC,IAAKwtG,EAAa7zG,EAAM6zG,WAAW1tG,KAAW2tG,GAAmC,wBAAhBpxE,EAAwC,CACvG,IAAIsxE,EAAY39F,KAAK49F,KAAO59F,KAAK49F,IAAIC,SACrC,OAAOjzG,EAAW4yG,EAAa,CAAC,UAAW1tG,GAAQA,EAAM6tG,GAAa,IAAIA,EAC5E,CAAO,OAAIF,GAAmC,qBAAhBpxE,GAC5BswE,EAAsB3sG,EAAS,oBAnDrC,SAAyB8tG,EAAUC,EAAQC,GACzC,GAAIr0G,EAAMmD,SAASgxG,GACjB,IAEE,OADCC,GAAUr9E,KAAK/F,OAAOmjF,GAChBn0G,EAAMoN,KAAK+mG,EACpB,CAAE,MAAOp0G,GACP,GAAe,gBAAXA,EAAE7B,KACJ,MAAM6B,CAEV,CAGF,OAAQs0G,GAAWt9E,KAAKC,WAAWm9E,EACrC,CAuCaG,CAAgBnuG,IAGlBA,CACT,GAEAouG,kBAAmB,CAAC,SAA2BpuG,GAC7C,IAAI6C,EAAeqN,KAAKrN,cAAgBiqG,EAASjqG,aAC7CwrG,EAAoBxrG,GAAgBA,EAAawrG,kBACjDC,EAAoBzrG,GAAgBA,EAAayrG,kBACjDC,GAAqBF,GAA2C,SAAtBn+F,KAAK/P,aAEnD,GAAIouG,GAAsBD,GAAqBz0G,EAAMmD,SAASgD,IAASA,EAAK/J,OAC1E,IACE,OAAO26B,KAAK/F,MAAM7qB,EACpB,CAAE,MAAOpG,GACP,GAAI20G,EAAmB,CACrB,GAAe,gBAAX30G,EAAE7B,KACJ,MAAMgD,EAAWye,KAAK5f,EAAGmB,EAAWyzG,iBAAkBt+F,KAAM,KAAMA,KAAK5O,UAEzE,MAAM1H,CACR,CACF,CAGF,OAAOoG,CACT,GAMAiC,QAAS,EAETiB,eAAgB,aAChBG,eAAgB,eAEhBorG,kBAAmB,EACnBC,eAAgB,EAEhBZ,IAAK,CACHC,SAAU92G,EAAQ,OAGpB03G,eAAgB,SAAwBntG,GACtC,OAAOA,GAAU,KAAOA,EAAS,GACnC,EAEAtB,QAAS,CACP0uG,OAAQ,CACN,OAAU,uCAKhB/0G,EAAMyJ,QAAQ,CAAC,SAAU,MAAO,SAAS,SAA6BzB,GACpEirG,EAAS5sG,QAAQ2B,GAAU,CAAC,CAC9B,IAEAhI,EAAMyJ,QAAQ,CAAC,OAAQ,MAAO,UAAU,SAA+BzB,GACrEirG,EAAS5sG,QAAQ2B,GAAUhI,EAAMg1G,MAAMjC,EACzC,IAEAj3G,EAAOC,QAAUk3G,+BC/IjB,IAAIjzG,EAAQ5C,EAAQ,MAChB61G,EAAW71G,EAAQ,MAUvBtB,EAAOC,QAAU,SAAuBoK,EAAME,EAAS4uG,GACrD,IAAI10G,EAAU8V,MAAQ48F,EAMtB,OAJAjzG,EAAMyJ,QAAQwrG,GAAK,SAAmBh3D,GACpC93C,EAAO83C,EAAGhhD,KAAKsD,EAAS4F,EAAME,EAChC,IAEOF,CACT,YCpBArK,EAAOC,QAAU,gCCMhB,SAASgE,EAAEoN,EAAEH,EAAE/Q,GAAK,IAAII,EAAE,oBAAoB64G,WAAWA,WAAW,oBAAoBn/F,KAAKA,KAAK,oBAAoBhT,OAAOA,OAAO,oBAAoBoyG,EAAAA,EAAOA,EAAAA,EAAO,CAAC,EAAEzxG,EAAE,mBAAmBrH,EAAEJ,IAAII,EAAEJ,GAAGgR,EAAEvJ,EAAEipD,OAAO,CAAC,EAAEnpD,EAA8B,mBAAmB1H,EAAOsB,SAAStB,EAAOsB,QAAQ6C,KAAKnE,GAAQ,SAASoI,EAAEiJ,EAAEH,GAAG,IAAIC,EAAEE,GAAG,CAAC,IAAIpN,EAAEoN,GAAG,CAAC,IAAIS,EAAE,mBAAmBvR,EAAEJ,IAAII,EAAEJ,GAAG,IAAI+Q,GAAGY,EAAE,OAAOA,EAAET,GAAE,GAAI,GAAGzJ,EAAE,OAAOA,EAAEyJ,GAAE,GAAI,GAAG3J,GAAG,iBAAiB2J,EAAE,OAAO3J,EAAE2J,GAAG,IAAItJ,EAAE0J,MAAM,uBAAuBJ,EAAE,KAAK,MAAMtJ,EAAEqxB,KAAK,mBAAmBrxB,CAAC,CAACO,EAAE2B,QAAQ,SAASiH,GAAG,IAAI/Q,EAAE8D,EAAEoN,GAAG,GAAGH,GAAG,OAAO,MAAM/Q,EAAEA,EAAE+Q,CAAC,EAAE5I,EAAEuoD,MAAM,CAAC,EAAE,IAAI5+C,EAAEd,EAAEE,GAAG,IAAIjJ,EAAEkxG,OAAOjoG,GAAGpN,EAAEoN,GAAG,GAAGlQ,KAAK8Q,EAAEhS,QAAQqI,EAAE2J,EAAEA,EAAEhS,QAAQsa,KAAK,CAAC,OAAOpJ,EAAEE,GAAGpR,QAAQ,SAASqI,EAAErE,GAAG,IAAIoN,EAAE/I,EAAE2B,QAAQhG,GAAG,OAAM,IAAKoN,EAAE,CAAC,EAAEjJ,EAAEiJ,EAAE,CAAC,CAACjJ,EAAEmxG,iBAAgB,EAAGnxG,EAAEkxG,OAAO,SAASr1G,GAAGsW,KAAK2B,GAAGjY,EAAEsW,KAAKi/F,OAAOpxG,EAAEmS,KAAKta,QAAQ,CAAC,CAAC,EAAEmI,EAAEqxG,QAAQx1G,EAAEmE,EAAEyoD,MAAM1/C,EAAE/I,EAAEixB,OAAOzxB,EAAEQ,EAAEsxG,SAAS,SAASroG,EAAEH,GAAGjN,EAAEoN,GAAG,CAAC,SAASpN,EAAEoN,GAAGA,EAAEpR,QAAQiR,CAAC,EAAE,CAAC,EAAE,EAAEnQ,OAAOmC,eAAekF,EAAE,OAAO,CAACiT,IAAI,WAAW,OAAO9a,EAAEJ,EAAE,IAAII,EAAEJ,GAAGiI,EAAE,IAAI,IAAIL,EAAE,EAAEA,EAAEsJ,EAAE/Q,OAAOyH,IAAIK,EAAEiJ,EAAEtJ,IAAI,GAAGmJ,EAAE,CAAC,IAAIe,EAAE7J,EAAE8I,GAAwDlR,EAAOC,QAAQgS,CAAqE,CAAC,CAAtqC,CAAwqC,CAAC,QAAQ,CAAC,SAAShO,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG,IAAIY,EAAE7N,EAAE,kCAAkC1D,EAAEJ,EAAEy5G,eAAe9nG,GAAGlK,EAAE3D,EAAE,oBAAoBkN,EAAEhR,EAAEy5G,eAAehyG,GAAGF,EAAEzD,EAAE,mBAAmBmE,EAAEjI,EAAEy5G,eAAelyG,GAAGK,EAAE9D,EAAE,WAAWgO,EAAEhO,EAAE,YAAYqE,EAAEnI,EAAEy5G,eAAe3nG,GAAG3K,EAAErD,EAAE,YAAYsE,EAAEpI,EAAEy5G,eAAetyG,GAAGK,EAAE1D,EAAE,cAAcoE,EAAElI,EAAEy5G,eAAejyG,GAAG2hB,EAAErlB,EAAE,UAAU8K,EAAE5O,EAAEy5G,eAAetwF,GAAGlpB,EAAE6D,EAAE,YAAY6K,EAAE3O,EAAEy5G,eAAex5G,GAAG+Z,EAAElW,EAAE,aAAaggB,EAAE9jB,EAAEy5G,eAAez/F,GAAG5S,EAAEtD,EAAE,iBAAiBmW,EAAEja,EAAEy5G,eAAeryG,GAAG0L,EAAEhP,EAAE,UAAU+V,EAAE7Z,EAAEy5G,eAAe3mG,GAAGF,EAAE9O,EAAE,cAAcygB,EAAEvkB,EAAEy5G,eAAe7mG,GAAGJ,EAAE1O,EAAE,YAAYqY,EAAEnc,EAAEy5G,eAAejnG,GAAG6I,EAAEvX,EAAE,YAAYyc,EAAEvgB,EAAEy5G,eAAep+F,GAAGtB,EAAEjW,EAAE,WAAWsgB,EAAEpkB,EAAEy5G,eAAe1/F,GAAGlD,EAAE/S,EAAE,aAAa0V,EAAExZ,EAAEy5G,eAAe5iG,GAAGkG,EAAEjZ,EAAE,YAAYyS,EAAEvW,EAAEy5G,eAAe18F,GAAGwO,EAAEznB,EAAE,UAAUsX,EAAEpb,EAAEy5G,eAAeluF,GAAG9H,EAAE3f,EAAE,WAAWkE,EAAEhI,EAAEy5G,eAAeh2F,GAAGvJ,EAAEpW,EAAE,aAAakZ,EAAEhd,EAAEy5G,eAAev/F,GAAGgD,EAAEpZ,EAAE,aAAa+f,EAAE7jB,EAAEy5G,eAAev8F,GAAGD,EAAEnZ,EAAE,aAAakc,EAAEhgB,EAAEy5G,eAAex8F,GAAG,IAAIqX,EAAE,EAAEnQ,EAAE,GAAG,MAAMvG,UAAU3V,EAAE+gB,QAAQ9oB,WAAAA,CAAY4D,EAAEoN,GAAGwoG,QAAQt/F,KAAK2B,KAAKuY,EAAE,IAAIvjB,EAAEnJ,EAAE+xG,UAAU/7F,EAAEg8F,OAAO91G,GAAG,GAAGiN,EAAEmtC,UAAUp6C,EAAEo6C,UAAU9jC,KAAKw/F,QAAO,EAAG5oG,EAAEgY,SAASjY,EAAE5I,EAAE6gB,SAAS5O,KAAKy/F,QAAO,EAAGz/F,KAAK0/F,SAAQ,EAAG1/F,KAAK2/F,SAAQ,EAAG3/F,KAAK4/F,SAAQ,EAAG5/F,KAAK6/F,UAAS,EAAG7/F,KAAK8/F,WAAU,EAAG9/F,KAAK+/F,SAAS,IAAIjyG,EAAE8gB,QAAQ5O,MAAMA,KAAKggG,OAAO,IAAIj+F,EAAE6M,QAAQ5O,MAAMA,KAAKigG,QAAQ,IAAIx2F,EAAEmF,QAAQ5O,MAAMA,KAAKkgG,MAAM,IAAItyG,EAAEghB,QAAQ5O,MAAMA,KAAKmgG,KAAK,IAAI3rG,EAAEoa,QAAQ5O,MAAMA,KAAKogG,OAAO,IAAIjkG,EAAEyS,QAAQ5O,MAAMA,KAAKqgG,OAAO,IAAI9rG,EAAEqa,QAAQ5O,MAAMA,KAAKsgG,OAAO,IAAIt2F,EAAE4E,QAAQ5O,MAAMA,KAAKugG,SAAS,IAAI72F,EAAEkF,QAAQ5O,MAAMA,KAAKwgG,YAAY,IAAI3gG,EAAE+O,QAAQ5O,MAAMA,KAAKygG,SAAS,IAAIt2F,EAAEyE,QAAQ5O,MAAMA,KAAKR,KAAK,IAAIC,EAAEmP,QAAQ5O,MAAMA,KAAKqC,QAAQ,IAAIjD,EAAEwP,QAAQ5O,MAAMA,KAAK0gG,OAAO,IAAIv6F,EAAEyI,QAAQ5O,MAAMA,KAAK2gG,KAAK,IAAI3/F,EAAE4N,QAAQ5O,MAAMA,KAAK4gG,QAAQ,IAAIh+F,EAAEgM,QAAQ5O,MAAMA,KAAK6gG,QAAQ,IAAIj7F,EAAEgJ,QAAQ5O,MAAM,mBAAmBlJ,GAAGkJ,KAAK8b,GAAG,SAAQ,IAAIhlB,EAAElQ,KAAKoZ,KAAKA,QAAOwD,EAAEs9F,MAAM,CAAC,IAAIp3G,EAAEA,GAAGwM,QAAQqJ,IAAI,QAAQS,KAAK2B,UAAUjY,KAAKA,EAAE,WAAW8Z,EAAE7N,SAASjM,EAAE,OAAO8Z,EAAEo6F,KAAKl0G,EAAE,SAAS8Z,EAAEu9F,OAAO,IAAI,IAAIjqG,EAAE,EAAEA,EAAE9I,EAAE4gB,QAAQoxF,OAAOj6G,OAAO+Q,IAAIkJ,KAAK8b,GAAG,SAAS9tB,EAAE4gB,QAAQoxF,OAAOlpG,IAAGA,GAAGpN,EAAE,SAASoN,EAAEnP,OAAM,CAACoiB,EAAEU,KAAKzK,KAAK,CAAC,oBAAWghG,GAAY,OAAOj3F,CAAC,CAAC,kBAAWpU,GAAU,MAAM,OAAO,CAAC,cAAWioG,GAAM,MAAM,YAAY,CAAC,gBAAWmD,GAAQ,MAAM,qBAAqB,CAAC,iBAAWtxG,GAAS,OAAOzB,EAAE4gB,OAAO,CAAC,gBAAWjlB,GAAQ,OAAO6D,CAAC,CAAC,iBAAW8J,GAAS,OAAOvJ,EAAE6gB,OAAO,CAAC,kBAAWqyF,GAAU,OAAOpzG,EAAE+gB,OAAO,CAAC,oBAAWlZ,GAAY,OAAOkB,EAAEgY,OAAO,CAAC,iBAAWsyF,GAAS,OAAOtqG,EAAEgY,QAAQsyF,MAAM,CAAC,eAAWC,GAAO,OAAOrzG,EAAE8gB,QAAQuyF,IAAI,CAAC,iBAAW3B,GAAS,MAAM,CAAC79F,GAAG,GAAGmiC,UAAU,aAAah4C,IAAI,GAAGs1G,OAAO,GAAGz5G,KAAK,GAAG05G,MAAM,OAAOC,OAAO,GAAGC,QAAO,EAAGC,OAAM,EAAGC,UAAS,EAAGC,UAAS,EAAGC,UAAS,EAAGC,MAAK,EAAGC,MAAK,EAAGt+E,cAAa,EAAG0mD,aAAY,EAAG63B,YAAW,EAAGlB,SAAQ,EAAGF,QAAO,EAAGqB,KAAI,EAAGC,OAAM,EAAGC,UAAS,EAAGC,YAAW,EAAGC,eAAc,EAAGC,gBAAe,EAAGC,iBAAgB,EAAGC,QAAO,EAAGC,aAAY,EAAGC,MAAK,EAAGC,aAAY,EAAGC,cAAa,EAAGC,iBAAgB,EAAGC,SAAQ,EAAGC,WAAM,EAAOvC,OAAO,GAAGE,YAAY,GAAGD,SAAS,GAAGuC,SAAS,GAAGC,QAAQ,GAAGC,UAAU,GAAGnC,QAAQ,GAAGoC,WAAW,CAACn3G,IAAI,GAAG25E,OAAO,GAAGy9B,OAAO,GAAGn0G,MAAM,EAAEC,OAAO,EAAEm0G,MAAM,GAAG1C,SAAS,CAAC30G,IAAI,GAAGnE,KAAK,GAAGmlF,MAAM,CAAC,EAAEjlF,KAAK,GAAGu7G,QAAO,EAAGC,SAAS,QAAQC,UAAU55G,GAAGA,GAAG65G,cAAc,CAAChD,UAAS,EAAGiD,QAAQh2G,EAAEi2G,SAAS,OAAO,YAAYtD,KAAK,CAAC,EAAED,MAAM,CAAC,EAAEwD,OAAO,CAAC,EAAEC,WAAW,CAAC,EAAEzqF,KAAK1tB,WAAW2rD,SAAS7jD,cAAc,CAAC,SAAIuvG,GAAQ,OAAO7iG,KAAKggG,OAAO6C,KAAK,CAAC,SAAIlrG,GAAQ,OAAOqI,KAAK+/F,SAASpoG,KAAK,CAAC,SAAIsO,GAAQ,OAAOjG,KAAK+/F,SAAS6D,MAAM,CAACnnF,OAAAA,GAAa,IAAL/yB,IAAC1B,UAAAjC,OAAA,QAAAmN,IAAAlL,UAAA,KAAAA,UAAA,GAAKgY,KAAKggG,OAAOvjF,UAAUzc,KAAK+/F,SAAStjF,QAAQ/yB,GAAGqgB,EAAEmH,OAAOnH,EAAE5X,QAAQ6N,MAAM,GAAGA,KAAK8/F,WAAU,EAAG9/F,KAAKyiC,KAAK,UAAU,EAAE9rC,EAAEiY,QAAQpL,EAAEA,EAAEqgG,MAAM79G,EAAE4oB,QAAQpL,EAAEs9F,OAAM,EAAGt9F,EAAEsgG,aAAY,EAAGtgG,EAAEugG,YAAY,IAAIvgG,EAAEwgG,cAAc,IAAIxgG,EAAEygG,mBAAmB,IAAIzgG,EAAE0gG,oBAAoB,GAAG1gG,EAAE2gG,YAAY,IAAI3gG,EAAE4gG,YAAY,IAAI5gG,EAAE6gG,WAAW,GAAG7gG,EAAE8gG,kBAAkB,GAAG9gG,EAAE+gG,kBAAkB,EAAE/gG,EAAEghG,sBAAsB,IAAIhhG,EAAEihG,mBAAmB,EAAEjhG,EAAEkhG,qBAAqB,IAAIlhG,EAAEmhG,kBAAkB,IAAInhG,EAAEohG,aAAa,IAAIphG,EAAEqhG,oBAAmB,EAAGrhG,EAAEshG,qBAAoB,EAAGthG,EAAEuhG,mBAAkB,EAAGvhG,EAAEwhG,sBAAsB,IAAIxhG,EAAEyhG,eAAe,IAAIzhG,EAAE0hG,mBAAmB,EAAE1hG,EAAE2hG,kBAAkB,IAAI3hG,EAAE4hG,iBAAiB,GAAG5hG,EAAE6hG,YAAY,GAAG7hG,EAAE8hG,UAAU,EAAE9hG,EAAE+hG,cAAc,CAAC,GAAG,IAAI,EAAE,KAAK,IAAI,GAAG/hG,EAAEgiG,aAAa,CAAC,UAAU,MAAM,QAAQhiG,EAAEiiG,KAAK,CAAC,SAAS,aAAa,YAAYjiG,EAAEkiG,wBAAuB,EAAGliG,EAAEmiG,aAAY,EAAGniG,EAAEoiG,SAAQ,EAAGp4G,EAAEq4G,YAAYn5G,OAAOo5G,UAAUtiG,EAAEhW,EAAEu4G,aAAa,kBAAkB//G,EAAE4oB,SAASxc,YAAW,KAAKoR,EAAEmiG,aAAazvG,QAAQqJ,IAAI,mBAAmBiE,EAAE7N,mCAAmC,mCAAmC,mCAAmC,GAAG,GAAE,KAAK,EAAE,CAAC,iCAAiC,QAAQ,mBAAmB,QAAQ,kBAAkB,QAAQ,UAAU,QAAQ,WAAW,QAAQ,WAAW,QAAQ,aAAa,QAAQ,SAAS,QAAQ,WAAW,QAAQ,YAAY,QAAQ,gBAAgB,QAAQ,SAAS,QAAQ,aAAa,QAAQ,WAAW,QAAQ,WAAW,QAAQ,UAAU,QAAQ,YAAY,QAAQ,WAAW,QAAQ,SAAS,QAAQ,UAAU,QAAQ,YAAY,QAAQ,YAAY,QAAQ,YAAY,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAASjM,EAAEoN,EAAEH,GAAGG,EAAEpR,QAAQ,8/4BAA8/4B,EAAE,CAAC,GAAGsgH,MAAM,CAAC,SAASt8G,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAEA,EAAE,WAAW,SAAS8D,EAAEoN,GAAG,OAAOpN,EAAE,mBAAmBuD,QAAQ,iBAAiBA,OAAO85E,SAAS,SAASr9E,GAAG,cAAcA,CAAC,EAAE,SAASA,GAAG,OAAOA,GAAG,mBAAmBuD,QAAQvD,EAAE5D,cAAcmH,QAAQvD,IAAIuD,OAAOxG,UAAU,gBAAgBiD,CAAC,GAAGoN,EAAE,CAAC,IAAIA,EAAEtQ,OAAOC,UAAUC,SAASiQ,EAAE,SAASA,GAAG,QAAG,IAASA,EAAE,MAAM,YAAY,GAAG,OAAOA,EAAE,MAAM,OAAO,IAAIY,EAAE7N,EAAEiN,GAAG,GAAG,YAAYY,EAAE,MAAM,UAAU,GAAG,WAAWA,EAAE,MAAM,SAAS,GAAG,WAAWA,EAAE,MAAM,SAAS,GAAG,WAAWA,EAAE,MAAM,SAAS,GAAG,aAAaA,EAAE,MAAM,sBAAsB3R,EAAE+Q,GAAG,oBAAoB,WAAW,GAAGzQ,MAAMC,QAAQD,MAAMC,QAAQwQ,GAAGA,aAAazQ,MAAM,MAAM,QAAQ,GAAGyQ,EAAE7Q,aAAa,mBAAmB6Q,EAAE7Q,YAAYo3G,UAAUvmG,EAAE7Q,YAAYo3G,SAASvmG,GAAG,MAAM,SAAS,GAAG,SAASjN,GAAG,IAAI,GAAG,iBAAiBA,EAAE3D,QAAQ,mBAAmB2D,EAAE3B,OAAO,OAAM,CAAE,CAAC,MAAM2B,GAAG,IAAI,IAAIA,EAAEkM,QAAQzD,QAAQ,UAAU,OAAM,CAAE,CAAC,OAAM,CAAE,CAAjJ,CAAmJwE,GAAG,MAAM,YAAY,GAAGA,aAAa4K,MAAM,mBAAmB5K,EAAEsvG,cAAc,mBAAmBtvG,EAAEuvG,SAAS,mBAAmBvvG,EAAEwvG,QAAQ,MAAM,OAAO,GAAGxvG,aAAaO,OAAO,iBAAiBP,EAAEf,SAASe,EAAE7Q,aAAa,iBAAiB6Q,EAAE7Q,YAAYsgH,gBAAgB,MAAM,QAAQ,GAAGzvG,aAAavQ,QAAQ,iBAAiBuQ,EAAErQ,OAAO,kBAAkBqQ,EAAE0vG,YAAY,kBAAkB1vG,EAAE2vG,WAAW,kBAAkB3vG,EAAEmoG,OAAO,MAAM,SAAS,OAAOl5G,EAAE+Q,IAAI,IAAI,SAAS,MAAM,SAAS,IAAI,UAAU,MAAM,UAAU,IAAI,UAAU,MAAM,UAAU,IAAI,UAAU,MAAM,UAAU,IAAI,MAAM,MAAM,MAAM,IAAI,MAAM,MAAM,MAAM,IAAI,YAAY,MAAM,YAAY,IAAI,aAAa,MAAM,aAAa,IAAI,oBAAoB,MAAM,oBAAoB,IAAI,aAAa,MAAM,aAAa,IAAI,cAAc,MAAM,cAAc,IAAI,aAAa,MAAM,aAAa,IAAI,cAAc,MAAM,cAAc,IAAI,eAAe,MAAM,eAAe,IAAI,eAAe,MAAM,eAAe,GAAG,mBAAmBA,EAAE4vG,OAAO,mBAAmB5vG,EAAEk5E,QAAQ,mBAAmBl5E,EAAEowF,KAAK,MAAM,YAAY,OAAOxvF,EAAET,EAAElQ,KAAK+P,IAAI,IAAI,kBAAkB,MAAM,SAAS,IAAI,wBAAwB,MAAM,cAAc,IAAI,wBAAwB,MAAM,cAAc,IAAI,2BAA2B,MAAM,iBAAiB,IAAI,0BAA0B,MAAM,gBAAgB,OAAOY,EAAE6I,MAAM,GAAG,GAAG9M,cAAcpH,QAAQ,MAAM,GAAG,EAAE,SAAStG,EAAE8D,GAAG,OAAOA,EAAE5D,YAAY4D,EAAE5D,YAAY+B,KAAK,IAAI,CAAC,SAAS0P,EAAE7N,EAAEoN,GAAG,IAAIlR,EAAE,EAAEoC,UAAUjC,aAAQ,IAASiC,UAAU,GAAGA,UAAU,GAAG,CAAC,UAAU,OAAOhC,EAAE0D,EAAEoN,EAAElR,GAAGyH,EAAE3D,EAAEoN,EAAElR,GAAG,SAAS8D,EAAEoN,EAAElR,GAAG,IAAIgR,EAAED,EAAEG,GAAG3J,EAAEwJ,EAAEjN,GAAG,GAAG,WAAWkN,EAAE,CAAC,GAAG,WAAWzJ,EAAE,MAAM+J,MAAM,kBAAkB5N,OAAO1D,EAAEqS,KAAK,KAAK,sCAAsC3O,OAAO6D,EAAE,MAAM3G,OAAOP,KAAK6Q,GAAG1D,SAAQ,SAASuD,GAAG,IAAIC,EAAElN,EAAEiN,GAAGxJ,EAAE2J,EAAEH,GAAG9I,EAAEjI,EAAEwa,QAAQvS,EAAE4c,KAAK9T,GAAG3Q,EAAE4Q,EAAEzJ,EAAEU,GAAGR,EAAEuJ,EAAEzJ,EAAEU,GAAG0J,EAAEX,EAAEzJ,EAAEU,EAAE,GAAE,CAAC,GAAG,UAAU+I,EAAE,CAAC,GAAG,UAAUzJ,EAAE,MAAM+J,MAAM,kBAAkB5N,OAAO1D,EAAEqS,KAAK,KAAK,qCAAqC3O,OAAO6D,EAAE,MAAMzD,EAAE0J,SAAQ,SAASuD,EAAEC,GAAG,IAAIzJ,EAAEzD,EAAEkN,GAAG/I,EAAEiJ,EAAEF,IAAIE,EAAE,GAAGtJ,EAAE5H,EAAEwa,QAAQ5S,EAAEid,KAAK7T,GAAG5Q,EAAEmH,EAAEU,EAAEL,GAAGH,EAAEF,EAAEU,EAAEL,GAAG+J,EAAEpK,EAAEU,EAAEL,EAAE,GAAE,CAAC,CAAxf,CAA0f9D,EAAEoN,EAAElR,GAAG8D,CAAC,CAAC,SAAS1D,EAAE0D,EAAEoN,EAAElR,GAAG,GAAG,WAAW+Q,EAAEG,GAAG,CAAC,IAAIS,EAAEZ,EAAEjN,GAAG,GAAG,MAAMoN,EAAE,KAAKA,EAAEA,EAAEsJ,MAAM,GAAG,iBAAiB,EAAEtJ,EAAE3E,QAAQ,KAAK2E,EAAEiB,MAAM,KAAKwX,KAAI,SAAS7lB,GAAG,OAAOA,EAAE4J,cAAcyD,MAAM,IAAGgK,OAAOylG,SAASlwF,MAAK,SAAS5sB,GAAG,OAAO6N,IAAI7N,CAAC,IAAGoN,EAAExD,cAAcyD,SAASQ,GAAG,MAAML,MAAM,kBAAkB5N,OAAO1D,EAAEqS,KAAK,KAAK,eAAe3O,OAAOwN,EAAE,qBAAqBxN,OAAOiO,EAAE,KAAK,CAAC,CAAC,SAASlK,EAAE3D,EAAEoN,EAAElR,GAAG,GAAG,aAAa+Q,EAAEG,GAAG,CAAC,IAAIS,EAAET,EAAEpN,EAAEiN,EAAEjN,GAAG9D,GAAG,IAAG,IAAK2R,EAAE,CAAC,IAAIvR,EAAE2Q,EAAEY,GAAG,KAAK,WAAWvR,EAAEkR,MAAMK,GAAG,UAAUvR,EAAEuR,EAAEL,MAAM,sCAAsC5N,OAAO1D,EAAEqS,KAAK,KAAK,8CAA8C3O,OAAOiO,EAAE,KAAK,CAAC,CAAC,CAAC,OAAOA,EAAE2pG,OAAOvqG,EAAEY,CAAC,EAAET,EAAEpR,QAAQE,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,SAAS8D,EAAEoN,EAAEH,GAAGjN,EAAE,kDAAkD01G,kBAAkBzoG,GAAGA,EAAEiY,QAAQ,MAAMkN,EAAAA,CAAGpyB,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAEoa,KAAKtW,IAAIsW,KAAKtW,EAAE,CAAC,GAAG,OAAO9D,EAAE8D,KAAK9D,EAAE8D,GAAG,KAAK+gB,KAAK,CAACm9B,GAAG9wC,EAAE2vG,IAAI9vG,IAAIqJ,IAAI,CAACoyC,IAAAA,CAAK1oD,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAEoa,KAAK,SAASzI,IAAO,QAAAmvG,EAAA1+G,UAAAjC,OAAFC,EAAC,IAAAE,MAAAwgH,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAD3gH,EAAC2gH,GAAA3+G,UAAA2+G,GAAE/gH,EAAEw2B,IAAI1yB,EAAE6N,GAAGT,EAAEsU,MAAMzU,EAAE3Q,EAAE,CAAC,OAAOuR,EAAEuI,EAAEhJ,EAAEkJ,KAAK8b,GAAGpyB,EAAE6N,EAAEZ,EAAE,CAAC8rC,IAAAA,CAAK/4C,GAAQ,IAAIiN,IAAIqJ,KAAKtW,IAAIsW,KAAKtW,EAAE,CAAC,IAAIA,IAAI,IAAI0W,QAAQ,QAAAwmG,EAAA5+G,UAAAjC,OAAhD+Q,EAAC,IAAA5Q,MAAA0gH,EAAA,EAAAA,EAAA,KAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAD/vG,EAAC+vG,EAAA,GAAA7+G,UAAA6+G,GAA+C,IAAI,IAAIn9G,EAAE,EAAEA,EAAEiN,EAAE5Q,OAAO2D,GAAG,EAAEiN,EAAEjN,GAAGk+C,GAAGx8B,MAAMzU,EAAEjN,GAAG+8G,IAAI3vG,GAAG,OAAOkJ,IAAI,CAACoc,GAAAA,CAAI1yB,EAAEoN,GAAG,IAAIH,EAAEqJ,KAAKtW,IAAIsW,KAAKtW,EAAE,CAAC,GAAG9D,EAAE+Q,EAAEjN,GAAG6N,EAAE,GAAG,GAAG3R,GAAGkR,EAAE,IAAI,IAAIpN,EAAE,EAAEiN,EAAE/Q,EAAEG,OAAO2D,EAAEiN,EAAEjN,GAAG,EAAE9D,EAAE8D,GAAGk+C,KAAK9wC,GAAGlR,EAAE8D,GAAGk+C,GAAG9nC,IAAIhJ,GAAGS,EAAEkT,KAAK7kB,EAAE8D,IAAI,OAAO6N,EAAExR,OAAO4Q,EAAEjN,GAAG6N,SAASZ,EAAEjN,GAAGsW,IAAI,EAAE,EAAE,CAAC,iDAAiD,UAAU,QAAQ,CAAC,SAAStW,EAAEoN,EAAEH,GAAGA,EAAE0oG,eAAe,SAAS31G,GAAG,OAAOA,GAAGA,EAAEo9G,WAAWp9G,EAAE,CAACklB,QAAQllB,EAAE,EAAEiN,EAAEyoG,kBAAkB,SAAS11G,GAAGlD,OAAOmC,eAAee,EAAE,aAAa,CAAC8H,OAAM,GAAI,EAAEmF,EAAEowG,UAAU,SAASr9G,EAAEoN,GAAG,OAAOtQ,OAAOP,KAAKyD,GAAG0J,SAAQ,SAASuD,GAAG,YAAYA,GAAG,eAAeA,GAAGnQ,OAAOC,UAAUE,eAAeC,KAAKkQ,EAAEH,IAAInQ,OAAOmC,eAAemO,EAAEH,EAAE,CAACmvD,YAAW,EAAGhlD,IAAI,WAAW,OAAOpX,EAAEiN,EAAE,GAAG,IAAGG,CAAC,EAAEH,EAAEqwG,OAAO,SAASt9G,EAAEoN,EAAEH,GAAGnQ,OAAOmC,eAAee,EAAEoN,EAAE,CAACgvD,YAAW,EAAGhlD,IAAInK,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,SAASjN,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG,IAAIY,EAAE7N,EAAE,SAAS9D,EAAEmhH,UAAUxvG,EAAEZ,GAAG,IAAI3Q,EAAE0D,EAAE,WAAW9D,EAAEmhH,UAAU/gH,EAAE2Q,GAAG,IAAItJ,EAAE3D,EAAE,cAAc9D,EAAEmhH,UAAU15G,EAAEsJ,GAAG,IAAIC,EAAElN,EAAE,UAAU9D,EAAEmhH,UAAUnwG,EAAED,GAAG,IAAIxJ,EAAEzD,EAAE,cAAc9D,EAAEmhH,UAAU55G,EAAEwJ,GAAG,IAAI9I,EAAEnE,EAAE,UAAU9D,EAAEmhH,UAAUl5G,EAAE8I,GAAG,IAAInJ,EAAE9D,EAAE,YAAY9D,EAAEmhH,UAAUv5G,EAAEmJ,GAAG,IAAIe,EAAEhO,EAAE,mBAAmB9D,EAAEmhH,UAAUrvG,EAAEf,EAAE,EAAE,CAAC,QAAQ,QAAQ,UAAU,QAAQ,aAAa,QAAQ,SAAS,QAAQ,aAAa,QAAQ,SAAS,QAAQ,WAAW,QAAQ,kBAAkB,QAAQ,iDAAiD,UAAUswG,MAAM,CAAC,SAASv9G,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,SAAQ,IAAI3Q,IAAGJ,EAAEohH,OAAOrwG,EAAE,YAAW,IAAItJ,IAAGzH,EAAEohH,OAAOrwG,EAAE,YAAW,IAAIC,IAAGhR,EAAEohH,OAAOrwG,EAAE,eAAc,IAAIxJ,IAAGvH,EAAEohH,OAAOrwG,EAAE,YAAW,IAAI9I,IAAGjI,EAAEohH,OAAOrwG,EAAE,UAAS,IAAInJ,IAAG5H,EAAEohH,OAAOrwG,EAAE,UAAS,IAAIe,IAAG9R,EAAEohH,OAAOrwG,EAAE,YAAW,IAAI5I,IAAGnI,EAAEohH,OAAOrwG,EAAE,aAAY,IAAI5J,IAAGnH,EAAEohH,OAAOrwG,EAAE,YAAW,IAAI3I,IAAGpI,EAAEohH,OAAOrwG,EAAE,YAAW,IAAIvJ,IAAGxH,EAAEohH,OAAOrwG,EAAE,gBAAe,IAAI7I,IAAGlI,EAAEohH,OAAOrwG,EAAE,WAAU,IAAIoY,IAAGnpB,EAAEohH,OAAOrwG,EAAE,gBAAe,IAAInC,IAAG5O,EAAEohH,OAAOrwG,EAAE,oBAAmB,IAAI9Q,IAAGD,EAAEohH,OAAOrwG,EAAE,kBAAiB,IAAIpC,IAAG3O,EAAEohH,OAAOrwG,EAAE,iBAAgB,IAAIiJ,IAAGha,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI+S,IAAG9jB,EAAEohH,OAAOrwG,EAAE,gBAAe,IAAI3J,IAAGpH,EAAEohH,OAAOrwG,EAAE,gBAAe,IAAIkJ,IAAGja,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI+B,IAAG9S,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI8I,IAAG,IAAIlI,EAAE7N,EAAE,mBAAmB,SAAS1D,EAAE0D,GAAc,OAAX1B,UAAAjC,OAAA,QAAAmN,IAAAlL,UAAA,GAAAA,UAAA,GAAC2D,UAAmBmzD,cAAcp1D,EAAE,CAAC,SAAS2D,EAAE3D,GAAa,IAAXoN,EAAC9O,UAAAjC,OAAA,QAAAmN,IAAAlL,UAAA,GAAAA,UAAA,GAAC2D,SAAU,OAAOzF,MAAMojB,KAAKxS,EAAEioD,iBAAiBr1D,GAAG,CAAC,SAASkN,EAAElN,EAAEoN,GAAG,OAAOpN,EAAEw9G,UAAU7gC,IAAIvvE,EAAE,CAAC,SAAS3J,EAAEzD,EAAEoN,GAAG,OAAOpN,EAAEw9G,UAAUvoD,OAAO7nD,EAAE,CAAC,SAASjJ,EAAEnE,EAAEoN,GAAG,OAAOpN,EAAEw9G,UAAUtpB,SAAS9mF,EAAE,CAAC,SAAStJ,EAAE9D,EAAEoN,GAAG,OAAOA,aAAaqwG,QAAQz9G,EAAEgzD,YAAY5lD,GAAGpN,EAAE09G,mBAAmB,YAAYl8F,OAAOpU,IAAIpN,EAAE29G,kBAAkB39G,EAAEmgF,SAAS,CAAC,SAASnyE,EAAEhO,GAAG,OAAOA,EAAEykF,WAAWnvB,YAAYt1D,EAAE,CAAC,SAASqE,EAAErE,EAAEoN,EAAEH,GAAG,OAAOjN,EAAEojF,MAAMh2E,GAAGH,EAAEjN,CAAC,CAAC,SAASqD,EAAErD,EAAEoN,GAAG,IAAI,IAAIH,KAAKG,EAAE/I,EAAErE,EAAEiN,EAAEG,EAAEH,IAAI,OAAOjN,CAAC,CAAC,SAASsE,EAAEtE,EAAEoN,GAAO,IAALH,IAAC3O,UAAAjC,OAAA,QAAAmN,IAAAlL,UAAA,KAAAA,UAAA,GAASpC,EAAE8G,OAAO46G,iBAAiB59G,EAAE,MAAM69G,iBAAiBzwG,GAAG,OAAOH,EAAE6J,WAAW5a,GAAGA,CAAC,CAAC,SAASwH,EAAE1D,GAAG,OAAOxD,MAAMojB,KAAK5f,EAAE89G,cAAcx+B,UAAUjoE,QAAOjK,GAAGA,IAAIpN,GAAE,CAAC,SAASoE,EAAEpE,EAAEoN,GAAG1J,EAAE1D,GAAG0J,SAAQ1J,GAAGyD,EAAEzD,EAAEoN,KAAIF,EAAElN,EAAEoN,EAAE,CAAC,SAASiY,EAAErlB,EAAEoN,GAAU,IAARH,EAAC3O,UAAAjC,OAAA,QAAAmN,IAAAlL,UAAA,GAAAA,UAAA,GAAC,MAAOuP,EAAEkwG,WAAW/9G,EAAEsC,aAAa,aAAa8K,GAAGF,EAAElN,EAAE,iBAAiBkN,EAAElN,EAAE,SAASiN,KAAK,CAAC,SAASnC,EAAE9K,GAAM,IAAJoN,EAAC9O,UAAAjC,OAAA,QAAAmN,IAAAlL,UAAA,GAAAA,UAAA,GAAC,EAAO2O,EAAEjN,EAAE0kE,wBAAwBxoE,EAAE8G,OAAOg7G,aAAa/7G,SAASwyF,gBAAgBwpB,aAAapwG,EAAE7K,OAAOk7G,YAAYj8G,SAASwyF,gBAAgB0pB,YAAY7hH,EAAE2Q,EAAE9H,IAAIiI,GAAGlR,GAAG+Q,EAAE9H,IAAI8H,EAAE3H,OAAO8H,GAAG,EAAEzJ,EAAEsJ,EAAE7H,KAAKgI,GAAGS,EAAET,GAAGH,EAAE7H,KAAK6H,EAAE5H,MAAM+H,GAAG,EAAE,OAAO9Q,GAAGqH,CAAC,CAAC,SAASxH,EAAE6D,EAAEoN,GAAG,OAAOpN,EAAEo+G,cAAcp+G,EAAEo+G,eAAe31G,QAAQ2E,IAAI,CAAC,CAAC,SAASvC,EAAE7K,EAAEoN,GAAG,OAAOA,EAAEq3E,WAAW45B,aAAar+G,EAAEoN,GAAGpN,CAAC,CAAC,SAASkW,EAAElW,GAAG,OAAOiC,SAASC,cAAclC,EAAE,CAAC,SAASggB,IAAY,IAAVhgB,EAAC1B,UAAAjC,OAAA,QAAAmN,IAAAlL,UAAA,GAAAA,UAAA,GAAC,GAAG8O,EAAC9O,UAAAjC,OAAA,QAAAmN,IAAAlL,UAAA,GAAAA,UAAA,GAAC,GAAQ2O,EAAEiJ,EAAE,KAAK,OAAOhJ,EAAED,EAAE,YAAYC,EAAED,EAAE,YAAYjN,KAAK8D,EAAEmJ,EAAEG,GAAGH,CAAC,CAAC,SAAS3J,EAAEtD,EAAEoN,GAAG,IAAIH,EAAEhL,SAASq8G,eAAet+G,GAAGiN,KAAKA,EAAEhL,SAASC,cAAc,UAAU+V,GAAGjY,EAAE,YAAYiC,SAASsG,WAAWtG,SAAS+H,iBAAiB,oBAAmB,KAAK/H,SAASs8G,KAAKvrD,YAAY/lD,EAAE,KAAIhL,SAASs8G,MAAMt8G,SAASwyF,iBAAiBzhC,YAAY/lD,IAAIA,EAAE4yD,YAAYzyD,CAAC,CAAC,SAAS+I,IAAI,IAAInW,EAAEiC,SAASC,cAAc,OAAO,OAAOlC,EAAEojF,MAAMunB,QAAQ,OAAO,SAAS3qG,EAAEojF,MAAMunB,OAAO,CAAC,SAAS37F,EAAEhP,GAAG,OAAOA,EAAE0kE,uBAAuB,CAAC,SAAS3uD,EAAE/V,EAAEoN,GAAG,OAAO,IAAI7L,SAAQ,CAAC0L,EAAE/Q,KAAK,IAAI2R,EAAE,IAAI2wG,MAAM3wG,EAAE4wG,OAAO,WAAW,GAAGrxG,GAAG,IAAIA,EAAE,CAAC,IAAI9Q,EAAE2F,SAASC,cAAc,UAAUyB,EAAErH,EAAEoiH,WAAW,MAAMpiH,EAAE+I,MAAMwI,EAAExI,MAAM+H,EAAE9Q,EAAEgJ,OAAOuI,EAAEvI,OAAO8H,EAAEzJ,EAAEg7G,UAAU9wG,EAAE,EAAE,EAAEvR,EAAE+I,MAAM/I,EAAEgJ,QAAQhJ,EAAEsiH,QAAOxxG,IAAI,IAAIS,EAAEua,IAAIuiC,gBAAgBv9C,GAAG9Q,EAAE,IAAIkiH,MAAMliH,EAAEmiH,OAAO,WAAWxxG,EAAE3Q,EAAE,EAAEA,EAAEuM,QAAQ,WAAWuf,IAAI6iC,gBAAgBp9C,GAAG3R,EAAEsR,MAAM,sBAAsBxN,KAAK,EAAE1D,EAAEy2D,IAAIllD,CAAC,GAAE,MAAMZ,EAAEY,EAAE,EAAEA,EAAEhF,QAAQ,WAAW3M,EAAEsR,MAAM,sBAAsBxN,KAAK,EAAE6N,EAAEklD,IAAI/yD,CAAC,GAAE,CAAC,EAAE,CAAC,kBAAkB,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAASA,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,aAAY,IAAIY,IAAG3R,EAAEohH,OAAOrwG,EAAE,YAAW,IAAI3Q,IAAGJ,EAAEohH,OAAOrwG,EAAE,YAAW,IAAItJ,IAAGzH,EAAEohH,OAAOrwG,EAAE,QAAO,IAAIC,IAAGhR,EAAEohH,OAAOrwG,EAAE,aAAY,IAAIxJ,IAAGvH,EAAEohH,OAAOrwG,EAAE,SAAQ,IAAI9I,IAAGjI,EAAEohH,OAAOrwG,EAAE,WAAU,IAAInJ,IAAG5H,EAAEohH,OAAOrwG,EAAE,YAAW,IAAIe,IAAG9R,EAAEohH,OAAOrwG,EAAE,aAAY,IAAI5I,IAAG,IAAIwJ,EAAE,oBAAoB/L,UAAUA,UAAUC,UAAU,GAAGzF,EAAE,iCAAiCuF,KAAKgM,GAAGlK,EAAE,kBAAkB9B,KAAKgM,GAAGX,EAAE,gBAAgBrL,KAAKgM,GAAGpK,EAAE,WAAW5B,KAAKgM,GAAG1J,EAAE,oBAAoBtC,KAAKgM,KAAK7K,OAAO67G,SAAS/6G,EAAEK,GAAG0J,EAAEwV,SAAS,cAAcvhB,UAAUg9G,gBAAgB,EAAE9wG,EAAE,iEAAiEnM,KAAKgM,IAAI/J,EAAEO,EAAE,oBAAoBrB,MAAM,EAAE,CAAC,iDAAiD,UAAU+7G,MAAM,CAAC,SAAS/+G,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,kBAAiB,IAAIY,IAAG3R,EAAEohH,OAAOrwG,EAAE,eAAc,IAAI3Q,IAAG,MAAMuR,UAAUL,MAAMpR,WAAAA,CAAY4D,EAAEoN,GAAGwoG,MAAM51G,GAAG,mBAAmBwN,MAAMwxG,mBAAmBxxG,MAAMwxG,kBAAkB1oG,KAAKlJ,GAAGkJ,KAAKla,aAAaka,KAAKnY,KAAK,gBAAgB,EAAE,SAAS7B,EAAE0D,EAAEoN,GAAG,IAAIpN,EAAE,MAAM,IAAI6N,EAAET,GAAG,OAAOpN,CAAC,CAAC,EAAE,CAAC,iDAAiD,UAAUi/G,MAAM,CAAC,SAASj/G,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD,SAAS6N,EAAE7N,GAAG,MAAM,kBAAkBJ,OAAOI,EAAEwC,QAAQ,8BAA6B,CAACxC,EAAEoN,EAAEH,KAAK,IAAI/Q,EAAE+Q,EAAEyJ,MAAM,EAAE,GAAG,OAAO,IAAIzJ,EAAE5Q,SAASH,EAAE+Q,EAAE,MAAM,IAAIA,EAAE5Q,SAASH,EAAE+Q,EAAE,KAAK,GAAGG,KAAKlR,GAAG,IAAGsG,QAAQ,iBAAiB,SAASA,QAAQ,kBAAkB,QAAQA,QAAQ,eAAe,QAAQA,QAAQ,iBAAiB,SAASA,QAAQ,6BAA6B,SAASA,QAAQ,cAAc,IAAI5C,OAAO,YAAY,CAAC,SAAStD,EAAE0D,GAAG,OAAOooB,IAAIuiC,gBAAgB,IAAID,KAAK,CAAC1qD,GAAG,CAAC/B,KAAK,aAAa,CAAC,SAAS0F,EAAE3D,GAAG,IAAIoN,EAAE1Q,OAAO,oHAAoH,KAAK,SAASuQ,IAAQ,OAAL3O,UAAAjC,OAAA,QAAAmN,IAAAlL,UAAA,GAAAA,UAAA,GAAC,IAAa+P,MAAM,QAAQwX,KAAI,CAAC7lB,EAAEoN,EAAEH,KAAK,GAAGG,IAAIH,EAAE5Q,OAAO,EAAE,CAAC,GAAG,IAAI2D,EAAE3D,OAAO,MAAM,IAAI2D,MAAM,GAAG,IAAIA,EAAE3D,OAAO,MAAM,IAAI2D,IAAI,MAAM,GAAG,IAAIA,EAAE3D,OAAO,OAAO,IAAI+Q,EAAE,IAAI,MAAMpN,EAAE,OAAO,IAAIoN,EAAEpN,EAAEoN,IAAIH,EAAE5Q,OAAO,EAAE,IAAI2D,IAAI,IAAIA,GAAG,IAAGuO,KAAK,GAAG,CAAC,MAAM,aAAavO,EAAEqO,MAAM,SAASwX,KAAI7lB,IAAI,IAAI9D,EAAE8D,EAAEkwB,MAAM9iB,GAAG,OAAOlR,EAAE,CAAC0c,MAAM3L,EAAE/Q,EAAE,GAAGmR,QAAQyL,IAAI7L,EAAE/Q,EAAE,GAAGmR,QAAQ0W,KAAK7nB,EAAE,GAAGsG,QAAQ,cAAc,IAAIA,QAAQ,SAAS,MAAM6K,OAAOgB,MAAM,SAASwX,KAAI7lB,GAAGA,EAAEqN,SAAQkB,KAAK,OAAO,IAAI,IAAG8I,QAAOrX,GAAGA,IAAG6lB,KAAI,CAAC7lB,EAAEoN,IAAIpN,EAAEoN,EAAE,EAAE,KAAK,GAAGpN,EAAE4Y,gBAAa5Y,EAAE8Y,QAAW,GAAG9Y,EAAE+jB,OAAO,KAAI1M,QAAOrX,GAAGA,EAAEqN,SAAQkB,KAAK,OAAO,CAACrS,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,YAAW,IAAIY,IAAG3R,EAAEohH,OAAOrwG,EAAE,aAAY,IAAI3Q,IAAGJ,EAAEohH,OAAOrwG,EAAE,YAAW,IAAItJ,GAAE,EAAE,CAAC,iDAAiD,UAAU,QAAQ,CAAC,SAAS3D,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD,SAAS6N,EAAE7N,EAAEoN,GAAG,IAAIH,EAAEhL,SAASC,cAAc,KAAK+K,EAAEm2E,MAAMunB,QAAQ,OAAO19F,EAAE5K,KAAKrC,EAAEiN,EAAEiyG,SAAS9xG,EAAEnL,SAASqnC,KAAK0pB,YAAY/lD,GAAGA,EAAEkyG,QAAQl9G,SAASqnC,KAAKgsB,YAAYroD,EAAE,CAAC/Q,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,UAAS,IAAI,SAASjN,EAAEoN,GAAG,OAAOA,EAAEiW,SAAS,KAAKrjB,EAAEoN,EAAEiB,MAAM,KAAK,IAAIjB,EAAEiW,SAAS,KAAKrjB,EAAEoN,EAAEiB,MAAM,KAAK,IAAIjB,EAAEC,OAAOzD,cAAcyE,MAAM,KAAKuiB,KAAK,IAAG10B,EAAEohH,OAAOrwG,EAAE,YAAW,IAAIY,GAAE,EAAE,CAAC,iDAAiD,UAAU,QAAQ,CAAC,SAAS7N,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,OAAM,IAAIY,IAAG3R,EAAEohH,OAAOrwG,EAAE,OAAM,IAAItJ,IAAGzH,EAAEohH,OAAOrwG,EAAE,OAAM,IAAIC,IAAGhR,EAAEohH,OAAOrwG,EAAE,aAAY,IAAI,SAASjN,IAAQ,IAAIiN,EAAEjN,GAAGA,GAAG,iBAAiBA,IAAIxD,MAAMC,QAAQuD,GAAG,QAAAo/G,EAAA9gH,UAAAjC,OAArD+Q,EAAC,IAAA5Q,MAAA4iH,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAADjyG,EAACiyG,GAAA/gH,UAAA+gH,GAAoD,OAAOjyG,EAAE8f,QAAO,CAAC9f,EAAElR,KAAKY,OAAOP,KAAKL,GAAGwN,SAAQmE,IAAI,IAAIvR,EAAE8Q,EAAES,GAAGlK,EAAEzH,EAAE2R,GAAGrR,MAAMC,QAAQH,IAAIE,MAAMC,QAAQkH,GAAGyJ,EAAES,GAAGvR,EAAEsD,UAAU+D,GAAGsJ,EAAE3Q,IAAI2Q,EAAEtJ,GAAGyJ,EAAES,GAAG7N,EAAE1D,EAAEqH,GAAGyJ,EAAES,GAAGlK,CAAC,IAAGyJ,IAAG,CAAC,EAAE,IAAG,IAAIS,EAAE/Q,OAAOmC,gBAAgBhC,eAAeX,GAAGQ,OAAOC,UAAU,SAAS4G,EAAE3D,EAAEoN,GAAG,OAAO9Q,EAAEY,KAAK8C,EAAEoN,EAAE,CAAC,SAASF,EAAElN,EAAEoN,GAAG,OAAOtQ,OAAOsC,yBAAyBY,EAAEoN,EAAE,CAAC,EAAE,CAAC,iDAAiD,UAAUkyG,MAAM,CAAC,SAASt/G,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD,SAAS6N,IAAM,IAAJ7N,EAAC1B,UAAAjC,OAAA,QAAAmN,IAAAlL,UAAA,GAAAA,UAAA,GAAC,EAAG,OAAO,IAAIiD,SAAQ6L,GAAG1E,WAAW0E,EAAEpN,IAAG,CAAC,SAAS1D,EAAE0D,EAAEoN,GAAG,IAAIH,EAAE,OAAO,WAAc,QAAAsyG,EAAAjhH,UAAAjC,OAAFH,EAAC,IAAAM,MAAA+iH,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAADtjH,EAACsjH,GAAAlhH,UAAAkhH,GAAE1/E,aAAa7yB,GAAGA,EAAEvE,YAAW,KAAKuE,EAAE,KAAKjN,EAAE0hB,MAAMpL,KAAKpa,KAAIkR,EAAE,CAAC,CAAC,SAASzJ,EAAE3D,EAAEoN,GAAG,IAAIH,GAAE,EAAG,OAAO,WAAc,QAAAwyG,EAAAnhH,UAAAjC,OAAFH,EAAC,IAAAM,MAAAijH,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAADxjH,EAACwjH,GAAAphH,UAAAohH,GAAEzyG,IAAIjN,EAAE0hB,MAAMpL,KAAKpa,GAAG+Q,GAAE,EAAGvE,YAAW,WAAWuE,GAAE,CAAE,GAAEG,GAAG,CAAC,CAAClR,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,SAAQ,IAAIY,IAAG3R,EAAEohH,OAAOrwG,EAAE,YAAW,IAAI3Q,IAAGJ,EAAEohH,OAAOrwG,EAAE,YAAW,IAAItJ,GAAE,EAAE,CAAC,iDAAiD,UAAUg8G,MAAM,CAAC,SAAS3/G,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD,SAAS6N,EAAE7N,EAAEoN,EAAEH,GAAG,OAAO2B,KAAKgN,IAAIhN,KAAK+M,IAAI3b,EAAE4O,KAAKgN,IAAIxO,EAAEH,IAAI2B,KAAK+M,IAAIvO,EAAEH,GAAG,CAAC,SAAS3Q,EAAE0D,GAAG,OAAOA,EAAE+C,OAAO,GAAGmF,cAAclI,EAAE0W,MAAM,EAAE,CAAC,SAAS/S,EAAE3D,GAAG,IAAIA,EAAE,MAAM,QAAQ,IAAIoN,EAAEwB,KAAK2Q,MAAMvf,EAAE,MAAMiN,EAAE2B,KAAK2Q,OAAOvf,EAAE,KAAKoN,GAAG,IAAIlR,EAAE0S,KAAK2Q,MAAMvf,EAAE,KAAKoN,EAAE,GAAGH,GAAG,OAAOG,EAAE,EAAE,CAACA,EAAEH,EAAE/Q,GAAG,CAAC+Q,EAAE/Q,IAAI2pB,KAAI7lB,GAAGA,EAAE,GAAG,IAAIA,IAAIwhB,OAAOxhB,KAAIuO,KAAK,IAAI,CAAC,SAASrB,EAAElN,GAAG,OAAOA,EAAEwC,QAAQ,YAAWxC,IAAG,CAAE,IAAI,QAAQ,IAAI,OAAO,IAAI,OAAO,IAAI,QAAQ,IAAI,UAAWA,IAAIA,IAAE,CAAC,SAASyD,EAAEzD,GAAG,IAAIoN,EAAE,CAAC,QAAQ,IAAI,OAAO,IAAI,OAAO,IAAI,QAAQ,IAAI,SAAS,KAAKH,EAAEvQ,OAAO,IAAII,OAAOP,KAAK6Q,GAAGmB,KAAK,QAAQ,KAAK,OAAOvO,EAAEwC,QAAQyK,GAAEjN,GAAGoN,EAAEpN,IAAIA,GAAE,CAAC9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,SAAQ,IAAIY,IAAG3R,EAAEohH,OAAOrwG,EAAE,cAAa,IAAI3Q,IAAGJ,EAAEohH,OAAOrwG,EAAE,gBAAe,IAAItJ,IAAGzH,EAAEohH,OAAOrwG,EAAE,UAAS,IAAIC,IAAGhR,EAAEohH,OAAOrwG,EAAE,YAAW,IAAIxJ,GAAE,EAAE,CAAC,iDAAiD,UAAUm8G,MAAM,CAAC,SAAS5/G,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,mBAAkB,IAAI5I,IAAG,IAAIwJ,EAAE7N,EAAE,YAAY,IAAI1D,EAAE,QAAQqH,EAAE,UAAUuJ,EAAE,SAASzJ,EAAE,SAASU,EAAE,SAASL,EAAE,WAAW,SAASkK,EAAEhO,EAAEoN,EAAEH,GAAG,OAAM,EAAGY,EAAEgyG,aAAazyG,IAAIF,GAAGE,IAAI3J,GAAGzD,aAAay9G,QAAQ,GAAGxwG,EAAEsB,KAAK,iBAAiBrB,uBAAuB,CAAC,IAAI7I,EAAE,CAACozG,KAAKzpG,EAAE8xG,QAAQ,IAAIn8G,IAAIxF,KAAK,IAAI+O,IAAImP,MAAM,IAAI5Y,IAAI2/E,MAAM,IAAIj/E,IAAIg7G,MAAM,IAAIr7G,IAAIi8G,QAAQ,IAAIj8G,IAAIk8G,QAAQ,IAAI9yG,KAAKzJ,IAAI4B,MAAM,IAAI5B,IAAIw8G,SAAS,IAAI3jH,IAAI4jH,SAAS,IAAIp8G,IAAIq8G,OAAO,IAAIx8G,IAAIy8G,SAAS,IAAIt8G,IAAI0lC,MAAM,IAAIltC,IAAI+jH,QAAQ,IAAIv8G,IAAIw8G,SAAS,IAAIx8G,KAAKmJ,EAAEiY,QAAQ,CAACjN,GAAG/K,EAAEktC,UAAUpsC,EAAE5L,IAAI8K,EAAEwqG,OAAOxqG,EAAEjP,KAAKiP,EAAEyqG,MAAMzqG,EAAEsiB,KAAKtiB,EAAE0qG,OAAOn0G,EAAEo0G,OAAOl0G,EAAEm0G,MAAMn0G,EAAEo0G,SAASp0G,EAAEq0G,SAASr0G,EAAEs0G,SAASt0G,EAAEu0G,KAAKv0G,EAAEw0G,KAAKx0G,EAAEk2B,aAAal2B,EAAE48E,YAAY58E,EAAEy0G,WAAWz0G,EAAEuzG,QAAQvzG,EAAEqzG,OAAOrzG,EAAE00G,IAAI10G,EAAE20G,MAAM30G,EAAE40G,SAAS50G,EAAE60G,WAAW70G,EAAE80G,cAAc90G,EAAE+0G,eAAe/0G,EAAEg1G,gBAAgBh1G,EAAEi1G,OAAOj1G,EAAEk1G,YAAYl1G,EAAEm1G,KAAKn1G,EAAEo1G,YAAYp1G,EAAEq1G,aAAar1G,EAAEs1G,gBAAgBt1G,EAAEu1G,QAAQv1G,EAAEw1G,MAAM,IAAIr1G,IAAIqzG,QAAQ,CAACrzG,GAAG8yG,OAAO,CAACvyG,GAAGyyG,YAAY,CAACzyG,GAAG+0G,SAAS,CAAC/0G,GAAGwyG,SAAS,CAAC,IAAIxyG,EAAEa,SAASA,CAAClF,EAAEoN,EAAEH,KAAK,IAAI/Q,EAAE,CAAC,MAAM,OAAO,SAAS,OAAM,EAAG2R,EAAEgyG,aAAa3jH,EAAEmnB,SAASrjB,GAAG,GAAGiN,EAAEsB,KAAK,oBAAoBrS,EAAEc,2BAA2B,IAAIq8G,QAAQ,CAAC,CAACn0F,QAAQ,IAAIvhB,IAAI8zG,KAAKvqG,EAAE9K,IAAI8K,IAAIosG,UAAU,CAAC,CAAC7vE,KAAKhmC,EAAEsgB,KAAK7W,IAAIqsG,WAAW,CAACn3G,IAAI8K,EAAE6uE,OAAOt4E,EAAE+1G,OAAO/1G,EAAE4B,MAAM5B,EAAE6B,OAAO7B,EAAEg2G,MAAMh2G,GAAGszG,SAAS,CAAC30G,IAAI8K,EAAE/O,KAAK+O,EAAEjP,KAAKiP,EAAEk2E,MAAMj/E,EAAEu1G,OAAO/1G,EAAEg2G,SAASzsG,EAAE0sG,UAAU91G,GAAG+1G,cAAc11G,EAAEsyG,KAAKtyG,EAAEqyG,MAAMryG,EAAE61G,OAAO71G,EAAE81G,WAAW91G,EAAE,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAUo8G,MAAM,CAAC,SAASvgH,EAAEoN,EAAEH,GAAGjN,EAAE,kDAAkD01G,kBAAkBzoG,GAAGA,EAAEiY,QAAQ,CAACs7F,UAAU,CAAC,cAAc,WAAW,WAAW,aAAa,WAAW,cAAc,aAAa,cAAc,eAAe,sBAAsB,WAAW,QAAQ,QAAQ,OAAO,aAAa,QAAQ,eAAe,SAAS,eAAe,SAAS,UAAU,aAAa,WAAW,UAAU,MAAM,YAAY,aAAa,cAAc,UAAUC,QAAQ,CAAC,eAAe,cAAc,OAAO,OAAO,SAASnK,OAAO,CAAC,QAAQ,UAAU,iBAAiB,iBAAiB,UAAU,QAAQ,QAAQ,aAAa,iBAAiB,YAAY,QAAQ,OAAO,UAAU,WAAW,aAAa,SAAS,UAAU,UAAU,UAAU,aAAa,eAAe,WAAWoK,WAAW,CAAC,QAAQ,SAAS,aAAa,cAAc,SAAS,0BAA0B,0BAA0B,cAAc,2BAA2B,6BAA6B,0BAA0B,0BAA0B,0BAA0B,2BAA2B,4BAA4B,0BAA0B,0BAA0B,wBAAwB,wBAAwB,uBAAuB,wBAAwB,EAAE,CAAC,iDAAiD,UAAUC,MAAM,CAAC,SAAS3gH,EAAEoN,EAAEH,GAAGjN,EAAE,kDAAkD01G,kBAAkBzoG,GAAG,IAAI/Q,EAAE8D,EAAE,WAAW,MAAM6N,EAAEzR,WAAAA,CAAY4D,GAAGsW,KAAKsqG,IAAI5gH,EAAE,IAAI81G,OAAO1oG,EAAEhR,YAAY6Q,GAAGjN,EAAEoN,EAAEgtC,qBAAqBqjE,QAAQnnG,KAAKuqG,WAAWzzG,EAAEgtC,WAAW9jC,KAAKuqG,YAAW,EAAG3kH,EAAE+R,OAAOb,EAAEgtC,YAAW,EAAGl+C,EAAE2jH,aAAavpG,KAAKuqG,WAAW,iCAAiCzzG,EAAEgtC,eAAc,EAAGl+C,EAAE2jH,cAAa,EAAG3jH,EAAE4kH,gBAAgB,oDAAoD,IAAIjzG,EAAEyI,KAAKuqG,WAAWtgB,QAAQ32F,eAAc,EAAG1N,EAAE2jH,aAAa,QAAQhyG,EAAE,mEAAmEA,OAAM,EAAG3R,EAAE2jH,aAAa5yG,EAAEqqG,UAAUyJ,OAAM/gH,GAAGA,EAAEq2G,SAASwK,aAAavqG,KAAKuqG,aAAY,2DAA2DvqG,KAAKrI,MAAMqI,KAAKrI,MAAM/N,KAAKoW,MAAMA,KAAKuqG,WAAW7Z,QAAQga,MAAMhhH,EAAEiY,GAAG3B,KAAKgqC,MAAM,CAAC,eAAWm3D,GAAO,MAAM,iqDAAiqD,CAACxpG,KAAAA,CAAMjO,GAAG,OAAM,EAAG9D,EAAE+R,OAAOjO,EAAEsW,KAAKuqG,WAAW,CAACvgE,IAAAA,GAAO,IAAIw1D,OAAO91G,GAAGsW,KAAKsqG,IAAI,GAAG5gH,EAAE44G,SAAStiG,KAAKuqG,WAAW7gC,UAAUnyE,EAAE4pG,MAAMnhG,KAAK2qG,QAAQ3qG,KAAKrI,MAAM,qBAAqBqI,KAAK4jG,OAAO5jG,KAAKrI,MAAM,cAAcqI,KAAK4qG,OAAO5qG,KAAKrI,MAAM,SAASqI,KAAK6qG,QAAQ7qG,KAAKrI,MAAM,eAAeqI,KAAK8qG,UAAU9qG,KAAKrI,MAAM,iBAAiBqI,KAAK+qG,SAAS/qG,KAAKrI,MAAM,gBAAgBqI,KAAKgrG,QAAQhrG,KAAKrI,MAAM,eAAeqI,KAAKirG,UAAUjrG,KAAKrI,MAAM,iBAAiBqI,KAAKkrG,UAAUlrG,KAAKrI,MAAM,iBAAiBqI,KAAKmrG,cAAcnrG,KAAKrI,MAAM,sBAAsBqI,KAAKorG,gBAAgBprG,KAAKrI,MAAM,wBAAwBqI,KAAKqrG,eAAerrG,KAAKrI,MAAM,uBAAuBqI,KAAKsrG,OAAOtrG,KAAKrI,MAAM,eAAeqI,KAAKurG,SAASvrG,KAAKrI,MAAM,gBAAgBqI,KAAKwrG,QAAQxrG,KAAKrI,MAAM,eAAeqI,KAAKyrG,aAAazrG,KAAKrI,MAAM,qBAAqBqI,KAAK0rG,MAAM1rG,KAAKrI,MAAM,aAAaqI,KAAK2rG,OAAO3rG,KAAKrI,MAAM,cAAcqI,KAAK4rG,SAAS5rG,KAAKrI,MAAM,iBAAiBqI,KAAK6rG,MAAM7rG,KAAKrI,MAAM,aAAaqI,KAAK8rG,WAAW9rG,KAAKrI,MAAM,mBAAmBqI,KAAK+rG,WAAW/rG,KAAKrI,MAAM,mBAAmBqI,KAAKgsG,aAAahsG,KAAKrI,MAAM,qBAAqBjO,EAAEm5G,MAAM,CAAC,IAAI/rG,EAAEpN,EAAEm5G,MAAMj8G,KAAKoZ,KAAKsqG,IAAItqG,KAAKsqG,MAAK,EAAG1kH,EAAE2jH,aAAazyG,aAAa42D,kBAAkB52D,aAAam1G,kBAAkB,sFAAqF,EAAGrmH,EAAEsmH,gBAAgBp1G,EAAEkJ,KAAK4jG,QAAQ9sG,EAAEq1G,UAAU,YAAYnsG,KAAK4jG,OAAO9sG,CAAC,CAACpN,EAAEu4G,WAAU,EAAGr8G,EAAEwmH,UAAUpsG,KAAK2qG,QAAQ,gBAAgB/kH,EAAE6hH,WAAU,EAAG7hH,EAAEwmH,UAAUpsG,KAAK2qG,QAAQ,aAAa,CAACluF,OAAAA,CAAQ/yB,GAAGA,EAAEsW,KAAKuqG,WAAW7gC,UAAU,IAAG,EAAG9jF,EAAEwmH,UAAUpsG,KAAK2qG,QAAQ,cAAc,EAAEh0G,EAAEiY,QAAQrX,CAAC,EAAE,CAAC,UAAU,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAAS7N,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG,IAAIY,EAAE7N,EAAE,YAAY1D,EAAE0D,EAAE,WAAW2D,EAAEzH,EAAEy5G,eAAer5G,GAAG2Q,EAAEiY,QAAQ,MAAM9oB,WAAAA,CAAY4D,GAAGsW,KAAKsqG,IAAI5gH,EAAEsW,KAAKqsG,UAAU,CAAC,QAAQh/G,EAAEuhB,SAAS5O,KAAKm3C,SAAS,CAAC,EAAEn3C,KAAKmrB,OAAOzhC,EAAE81G,OAAOW,KAAK,CAACn2D,IAAAA,GAAO,IAAItgD,EAAEsW,KAAKsqG,IAAI9K,OAAOtmF,KAAK5lB,cAAc0M,KAAKm3C,SAASn3C,KAAKqsG,UAAU3iH,IAAI,CAAC,CAAC,CAACoX,GAAAA,CAAIpX,GAAG,OAAOsW,KAAKm3C,SAASztD,IAAIA,CAAC,CAACyhC,MAAAA,CAAOzhC,GAAGsW,KAAKqsG,WAAU,EAAG90G,EAAEgoG,WAAWv/F,KAAKqsG,UAAU3iH,GAAGsW,KAAKgqC,MAAM,EAAE,EAAE,CAAC,WAAW,QAAQ,UAAU,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAAStgD,EAAEoN,EAAEH,GAAGjN,EAAE,kDAAkD01G,kBAAkBzoG,GAAG,IAAI/Q,EAAE,CAAC,aAAa,2BAAO0mH,MAAM,eAAK,oBAAoB,2BAAOC,OAAO,eAAKC,KAAK,eAAKC,MAAM,eAAKC,KAAK,eAAKC,KAAK,eAAK,aAAa,2BAAOC,WAAW,eAAKC,SAAS,eAAKC,UAAU,2BAAO,eAAe,2BAAO,eAAe,2BAAOC,WAAW,eAAK,aAAa,2BAAO,eAAe,2BAAOC,QAAQ,eAAKC,OAAO,eAAKC,KAAK,eAAK,eAAe,eAAK,kBAAkB,2BAAOC,WAAW,eAAK,kBAAkB,2BAAO,iBAAiB,2BAAO,sBAAsB,uCAAS,cAAc,iCAAQ,WAAW,iCAAQ,gBAAgB,iCAAQ,oBAAoB,uCAAS,2BAA2B,iCAAQ,kBAAkB,2BAAO,YAAY,2BAAO,YAAY,2BAAOC,QAAQ,2BAAO,wBAAwB,8CAAWz2G,EAAEiY,QAAQhpB,EAAE,oBAAoB8G,SAASA,OAAO,wBAAwB9G,EAAE,EAAE,CAAC,iDAAiD,UAAUynH,MAAM,CAAC,SAAS3jH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG,IAAIY,EAAE7N,EAAE,YAAY1D,EAAEJ,EAAEy5G,eAAe9nG,GAAGlK,EAAE3D,EAAE,aAAakN,EAAEhR,EAAEy5G,eAAehyG,GAAGF,EAAEzD,EAAE,aAAamE,EAAEjI,EAAEy5G,eAAelyG,GAAGK,EAAE9D,EAAE,cAAcgO,EAAE9R,EAAEy5G,eAAe7xG,GAAGO,EAAErE,EAAE,eAAeqD,EAAEnH,EAAEy5G,eAAetxG,GAAGC,EAAEtE,EAAE,aAAa0D,EAAExH,EAAEy5G,eAAerxG,GAAGF,EAAEpE,EAAE,eAAeqlB,EAAEnpB,EAAEy5G,eAAevxG,GAAG0G,EAAE9K,EAAE,oBAAoB7D,EAAED,EAAEy5G,eAAe7qG,GAAGD,EAAE7K,EAAE,iBAAiBkW,EAAEha,EAAEy5G,eAAe9qG,GAAGmV,EAAEhgB,EAAE,eAAesD,EAAEpH,EAAEy5G,eAAe31F,GAAG7J,EAAEnW,EAAE,qBAAqBgP,EAAE9S,EAAEy5G,eAAex/F,GAAGJ,EAAE/V,EAAE,oBAAoB8O,EAAE5S,EAAEy5G,eAAe5/F,GAAG0K,EAAEzgB,EAAE,mBAAmB0O,EAAExS,EAAEy5G,eAAel1F,GAAGpI,EAAErY,EAAE,mBAAmBuX,EAAErb,EAAEy5G,eAAet9F,GAAGoE,EAAEzc,EAAE,sBAAsBiW,EAAE/Z,EAAEy5G,eAAel5F,GAAG6D,EAAEtgB,EAAE,YAAY+S,EAAE7W,EAAEy5G,eAAer1F,GAAG5K,EAAE1V,EAAE,eAAeiZ,EAAE/c,EAAEy5G,eAAejgG,GAAGjD,EAAEzS,EAAE,eAAeynB,EAAEvrB,EAAEy5G,eAAeljG,GAAG6E,EAAEtX,EAAE,gBAAgB2f,EAAEzjB,EAAEy5G,eAAer+F,GAAGpT,EAAElE,EAAE,iBAAiBoW,EAAEla,EAAEy5G,eAAezxG,GAAGgV,EAAElZ,EAAE,aAAaoZ,EAAEld,EAAEy5G,eAAez8F,GAAG6G,EAAE/f,EAAE,aAAamZ,EAAEjd,EAAEy5G,eAAe51F,GAAG7D,EAAElc,EAAE,aAAawwB,EAAEt0B,EAAEy5G,eAAez5F,GAAGmE,EAAErgB,EAAE,eAAe8Z,EAAE5d,EAAEy5G,eAAet1F,GAAGE,EAAEvgB,EAAE,mBAAmBwgB,EAAEtkB,EAAEy5G,eAAep1F,GAAGkQ,GAAGzwB,EAAE,eAAe8mB,GAAG5qB,EAAEy5G,eAAellF,IAAIsI,GAAG/4B,EAAE,cAAcmuD,GAAGjyD,EAAEy5G,eAAe58E,IAAIm7C,GAAGl0E,EAAE,aAAa+pC,GAAG7tC,EAAEy5G,eAAezhC,IAAIj6B,GAAGj6C,EAAE,cAAcoiE,GAAGlmE,EAAEy5G,eAAe17D,IAAI80D,GAAG/uG,EAAE,uBAAuBqnF,GAAGnrF,EAAEy5G,eAAe5G,IAAI6U,GAAG5jH,EAAE,gBAAgB6jH,GAAG3nH,EAAEy5G,eAAeiO,IAAI93B,GAAG9rF,EAAE,gBAAgBq2F,GAAGn6F,EAAEy5G,eAAe7pB,IAAIwS,GAAGt+F,EAAE,mBAAmB8jH,GAAG5nH,EAAEy5G,eAAerX,IAAIpE,GAAGl6F,EAAE,gBAAgB+jH,GAAG7nH,EAAEy5G,eAAezb,IAAI8pB,GAAGhkH,EAAE,eAAe++E,GAAG7iF,EAAEy5G,eAAeqO,IAAI/2G,EAAEiY,QAAQ,MAAM9oB,WAAAA,CAAY4D,IAAG,EAAG1D,EAAE4oB,SAASllB,IAAG,EAAGkN,EAAEgY,SAASllB,IAAG,EAAGmE,EAAE+gB,SAASllB,IAAG,EAAGgO,EAAEkX,SAASllB,IAAG,EAAGqD,EAAE6hB,SAASllB,IAAG,EAAG0D,EAAEwhB,SAASllB,IAAG,EAAGqlB,EAAEH,SAASllB,IAAG,EAAG7D,EAAE+oB,SAASllB,IAAG,EAAGkW,EAAEgP,SAASllB,IAAG,EAAGsD,EAAE4hB,SAASllB,IAAG,EAAGgP,EAAEkW,SAASllB,IAAG,EAAG8O,EAAEoW,SAASllB,IAAG,EAAG0O,EAAEwW,SAASllB,IAAG,EAAGuX,EAAE2N,SAASllB,IAAG,EAAGiW,EAAEiP,SAASllB,IAAG,EAAG+S,EAAEmS,SAASllB,IAAG,EAAGiZ,EAAEiM,SAASllB,IAAG,EAAGynB,EAAEvC,SAASllB,IAAG,EAAG2f,EAAEuF,SAASllB,IAAG,EAAGoW,EAAE8O,SAASllB,IAAG,EAAGoZ,EAAE8L,SAASllB,IAAG,EAAGmZ,EAAE+L,SAASllB,IAAG,EAAGwwB,EAAEtL,SAASllB,IAAG,EAAG8Z,EAAEoL,SAASllB,IAAG,EAAGwgB,EAAE0E,SAASllB,IAAG,EAAG8mB,GAAG5B,SAASllB,IAAG,EAAGmuD,GAAGjpC,SAASllB,IAAG,EAAG+pC,GAAG7kB,SAASllB,IAAG,EAAGoiE,GAAGl9C,SAASllB,IAAG,EAAGqnF,GAAGniE,SAASllB,IAAG,EAAG6jH,GAAG3+F,SAASllB,IAAG,EAAGq2F,GAAGnxE,SAASllB,IAAG,EAAG8jH,GAAG5+F,SAASllB,IAAG,EAAG++E,GAAG75D,SAASllB,IAAG,EAAG+jH,GAAG7+F,SAASllB,EAAE,EAAE,EAAE,CAAC,WAAW,QAAQ,YAAY,QAAQ,YAAY,QAAQ,aAAa,QAAQ,cAAc,QAAQ,YAAY,QAAQ,cAAc,QAAQ,mBAAmB,QAAQ,gBAAgB,QAAQ,cAAc,QAAQ,oBAAoB,QAAQ,mBAAmB,QAAQ,kBAAkB,QAAQ,kBAAkB,QAAQ,qBAAqB,QAAQ,WAAW,QAAQ,cAAc,QAAQ,cAAc,QAAQ,eAAe,QAAQ,gBAAgB,QAAQ,YAAY,QAAQ,YAAY,QAAQ,YAAY,QAAQ,cAAc,QAAQ,kBAAkB,QAAQ,cAAc,QAAQ,aAAa,QAAQ,YAAY,QAAQ,aAAa,QAAQ,sBAAsB,QAAQ,eAAe,QAAQ,eAAe,QAAQ,kBAAkB,QAAQ,eAAe,QAAQ,cAAc,QAAQ,iDAAiD,UAAUikH,MAAM,CAAC,SAASjkH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,IAAI81G,OAAO1oG,EAAEipG,UAAU6D,OAAOjtG,IAAIjN,GAAE,EAAG6N,EAAEq2G,KAAKlkH,EAAE,MAAM,CAACoX,IAAIA,IAAInK,EAAE8lD,IAAI,SAAMl5C,CAAI3d,GAAG,GAAGA,EAAE,CAAC,IAAII,EAAE0D,EAAEoC,IAAIuB,EAAEyJ,EAAEnP,OAAM,EAAG4P,EAAEs2G,QAAQjoH,GAAGgR,EAAEE,EAAE6sG,WAAWt2G,GAAGA,GAAGuJ,SAAS,EAAGW,EAAEu2G,SAASpkH,EAAE2Y,QAAQ0rG,MAAK,EAAGn3G,EAAEhQ,KAAK8C,EAAEiN,EAAE/Q,EAAE8D,KAAKooB,IAAI6iC,gBAAgB3uD,GAAG2Q,EAAE8lD,IAAI72D,GAAGI,IAAI0D,EAAEoC,MAAMpC,EAAE81G,OAAO1zG,IAAIlG,EAAE8D,EAAEg2G,SAAS15G,GAAG0D,EAAE0oD,KAAK,iBAAgB,KAAK1oD,EAAE+4C,KAAK,UAAU78C,EAAE,IAAG,YAAY,EAAG2R,EAAEu2G,SAASpkH,EAAE2Y,QAAQ0rG,MAAK,CAAE,GAAG,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAUC,MAAM,CAAC,SAAStkH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,IAAIq2G,UAAU6D,OAAO9sG,IAAIpN,GAAE,EAAG6N,EAAEq2G,KAAKlkH,EAAE,OAAO,CAAC8H,KAAAA,CAAM9H,EAAEiN,GAAG,QAAG,IAASA,EAAE,OAAOG,EAAEpN,GAAGoN,EAAEpN,GAAGiN,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAUs3G,MAAM,CAAC,SAASvkH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,IAAIy2G,KAAKrpG,EAAEspG,OAAOzpG,EAAE6oG,OAAO55G,EAAEE,aAAak7G,UAAUh7G,GAAG+5G,UAAU6D,OAAOv2G,IAAI3D,GAAE,EAAG6N,EAAEq2G,KAAKlkH,EAAE,OAAO,CAAC8H,MAAM8+C,iBAAiB,IAAI/4C,QAAQlK,EAAE6gH,OAAO,GAAGv3G,EAAEo3G,KAAKj3G,EAAEgK,IAAI,QAAQpX,EAAE+4C,KAAK,QAAQ78C,EAAEo8G,MAAM,IAAI,IAAIlrG,EAAE,EAAEA,EAAE9Q,EAAED,OAAO+Q,IAAI,CAAC,IAAIH,EAAE3Q,EAAE8Q,GAAGH,IAAIjN,GAAGiN,EAAEw3G,OAAO,CAAC,OAAO52G,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAU62G,MAAM,CAAC,SAAS1kH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,IAAIq2G,UAAU6D,OAAO9sG,GAAGqpG,KAAKxpG,EAAEypG,OAAOx6G,GAAG8D,GAAE,EAAG6N,EAAEq2G,KAAKlkH,EAAE,QAAQ,CAAC8H,KAAAA,GAAQ,IAAI+F,EAAET,EAAEq3G,QAAQ,OAAOvoH,EAAEmoH,KAAKp3G,EAAEmK,IAAI,SAASpX,EAAE+4C,KAAK,SAASlrC,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAU82G,MAAM,CAAC,SAAS3kH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,IAAG,EAAG6N,EAAEq2G,KAAKlkH,EAAE,SAAS,CAAC8H,MAAMA,IAAI9H,EAAE4kH,QAAQ5kH,EAAEykH,QAAQzkH,EAAEwkH,QAAQ,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAUK,MAAM,CAAC,SAAS7kH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,IAAI02G,OAAOtpG,GAAGpN,GAAE,EAAG6N,EAAEq2G,KAAKlkH,EAAE,OAAO,CAAC6Z,GAAAA,CAAI5M,GAAGjN,EAAEg5B,YAAY/rB,EAAEjN,EAAE+4C,KAAK,OAAO/4C,EAAEg5B,aAAah5B,EAAEgY,WAAW5K,EAAEi3G,KAAK,IAAG,EAAGx2G,EAAEi3G,cAAc9kH,EAAEg5B,mBAAkB,EAAGnrB,EAAEi3G,cAAc9kH,EAAEgY,YAAY,KAAI,EAAGnK,EAAEq2G,KAAKlkH,EAAE,UAAU,CAAC6Z,GAAAA,CAAIzM,GAAGpN,EAAE+kH,KAAK/kH,EAAEg5B,YAAY5rB,CAAC,KAAI,EAAGS,EAAEq2G,KAAKlkH,EAAE,WAAW,CAAC6Z,GAAAA,CAAIzM,GAAGpN,EAAE+kH,KAAK/kH,EAAEg5B,YAAY5rB,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAASpN,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,IAAIq2G,UAAU6D,OAAO9sG,GAAGqpG,KAAKxpG,EAAEypG,OAAOx6G,EAAEq6G,QAAQj6G,GAAG0D,GAAE,EAAG6N,EAAEq2G,KAAKlkH,EAAE,SAAS,CAACoX,IAAIA,IAAIhK,EAAEwqG,QAAQ,EAAE/9F,IAAI7Z,IAAIoN,EAAEwqG,QAAO,EAAG/pG,EAAEm3G,OAAOhlH,EAAE,EAAE,GAAG9D,EAAEmoH,KAAK,GAAGp3G,EAAEmK,IAAI,cAAcZ,SAAS,IAAIpJ,EAAEwqG,OAAO,MAAM,IAAIxqG,EAAEwqG,QAAQt7G,EAAEud,IAAI,SAASzM,EAAEwqG,OAAO,KAAI,EAAG/pG,EAAEq2G,KAAKlkH,EAAE,QAAQ,CAACoX,IAAIA,IAAIhK,EAAE0qG,MAAMj+F,IAAI5M,IAAIG,EAAE0qG,MAAM7qG,EAAEjN,EAAE+4C,KAAK,QAAQ9rC,EAAE,GAAG,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAUg4G,MAAM,CAAC,SAASjlH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,IAAIk6G,OAAO9sG,GAAGpN,EAAEq2G,UAAS,EAAGxoG,EAAEq2G,KAAKlkH,EAAE,cAAc,CAACoX,IAAIA,IAAIhK,EAAE4rB,aAAa,EAAEnf,IAAI5M,IAAIuB,OAAO8mB,MAAMroB,EAAE6J,WAAW7J,MAAMG,EAAE4rB,aAAY,EAAGnrB,EAAEm3G,OAAO/3G,EAAE,EAAEjN,EAAEgY,UAAU,GAAG,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAAShY,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,IAAG,EAAG6N,EAAEq2G,KAAKlkH,EAAE,WAAW,CAACoX,IAAIA,KAAK,IAAIY,SAAS5K,GAAGpN,EAAEq2G,SAAS6D,OAAO,OAAO9sG,IAAI,IAAI,EAAEA,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAU83G,MAAM,CAAC,SAASllH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,SAASoN,EAAEA,EAAEH,GAAG,OAAO,IAAI1L,SAAQ,CAACrF,EAAE2R,KAAK,GAAGT,IAAIpN,EAAEoC,IAAI,OAAO,IAAIwiH,QAAQtoH,EAAEikF,YAAY58E,EAAEk2B,aAAa3sB,GAAGlN,EAAEA,EAAEykH,QAAQzkH,EAAEoC,IAAIgL,EAAEpN,EAAE02G,OAAO2N,KAAK,GAAGrkH,EAAE0oD,KAAK,cAAc76C,GAAG7N,EAAE0oD,KAAK,wBAAuB,KAAK1oD,EAAEg5B,YAAY/rB,CAAC,IAAGjN,EAAE0oD,KAAK,iBAAgB9B,UAAU5mD,EAAE65B,aAAa3sB,EAAElN,EAAEugF,YAAY58E,EAAErH,SAAS0D,EAAEwkH,OAAOxkH,EAAE02G,OAAO2N,KAAK,GAAGnoH,GAAG,GAAE,GAAE,EAAC,EAAG2R,EAAEq2G,KAAKlkH,EAAE,gBAAgB,CAAC8H,MAAMmF,GAAGG,EAAEH,EAAEjN,EAAEg5B,gBAAe,EAAGnrB,EAAEq2G,KAAKlkH,EAAE,YAAY,CAAC8H,MAAM9H,GAAGoN,EAAEpN,EAAE,MAAK,EAAG6N,EAAEq2G,KAAKlkH,EAAE,SAAS,CAAC6Z,IAAI7Z,EAAEmlH,WAAW,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAUC,MAAM,CAAC,SAASplH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,IAAIq2G,UAAU6D,OAAO9sG,GAAGqpG,KAAKxpG,EAAEypG,OAAOx6G,GAAG8D,GAAE,EAAG6N,EAAEq2G,KAAKlkH,EAAE,eAAe,CAACoX,IAAIA,IAAIhK,EAAEysB,aAAahgB,GAAAA,CAAIhM,GAAGA,EAAEA,IAAIT,EAAEysB,eAAezsB,EAAEysB,aAAahsB,EAAE3R,EAAEmoH,KAAK,GAAGp3G,EAAEmK,IAAI,YAAY,IAAIvJ,EAAEZ,EAAEmK,IAAI,UAAU,GAAGvJ,QAAQ7N,EAAE65B,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAUwrF,MAAM,CAAC,SAASrlH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,IAAIy2G,KAAKrpG,EAAEspG,OAAOzpG,EAAEopG,UAAU6D,OAAOh+G,EAAE+kH,QAAQ3kH,IAAI0D,GAAE,EAAG6N,EAAEq2G,KAAKlkH,EAAE,cAAc,CAACoX,IAAIA,IAAI9a,EAAE0qG,QAAQzmB,aAAa,UAAU1mE,GAAAA,CAAIlW,GAAG,GAAGA,IAAIA,EAAE,WAAW,YAAYA,GAAE,EAAGkK,EAAEy3G,UAAUppH,EAAE,QAAQ,OAAM,EAAG2R,EAAEy3G,UAAUppH,EAAE,SAAS,OAAM,EAAG2R,EAAEy3G,UAAUppH,EAAE,SAAS,aAAaI,EAAE0qG,QAAQzmB,gBAAgB,CAAC,IAAIvgF,EAAE2D,EAAE0K,MAAM,KAAKwX,IAAIrX,SAAS2vG,YAAY/wG,EAAE6wG,aAAahxG,GAAG3Q,EAAE4Q,EAAElN,EAAE,GAAGA,EAAE,GAAGoN,EAAEH,EAAEC,IAAG,EAAGW,EAAEy3G,UAAUppH,EAAE,QAAWgR,EAAED,EAAL,OAAY,EAAGY,EAAEy3G,UAAUppH,EAAE,SAAS,SAAQ,EAAG2R,EAAEy3G,UAAUppH,EAAE,SAAS,aAAY,EAAG2R,EAAEy3G,UAAUppH,EAAE,QAAQ,SAAQ,EAAG2R,EAAEy3G,UAAUppH,EAAE,SAAYkR,EAAEF,EAAL,OAAY,EAAGW,EAAEy3G,UAAUppH,EAAE,SAAS,WAAWI,EAAE0qG,QAAQzmB,YAAY58E,CAAC,CAACsJ,EAAEo3G,KAAK,GAAGj3G,EAAEgK,IAAI,oBAAoB,YAAYzT,EAAEyJ,EAAEgK,IAAI,WAAWzT,IAAI3D,EAAE+4C,KAAK,cAAcp1C,EAAE,GAAG,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAAS3D,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,IAAI02G,OAAOtpG,EAAEipG,UAAU6D,OAAOjtG,IAAIjN,EAAE9D,GAAE,EAAG2R,EAAE3L,eAAe,WAAU,EAAG2L,EAAEq2G,KAAKlkH,EAAE,aAAa,CAAC8H,MAAMA,IAAI,IAAIvG,SAAQ,CAACvB,EAAE6N,KAAK,IAAI3R,EAAEmJ,MAAM4H,EAAEs4G,WAAWrpH,EAAEoJ,OAAO2H,EAAEu4G,YAAYtpH,EAAEwiH,WAAW,MAAMC,UAAU1xG,EAAE,EAAE,GAAGjN,EAAE9D,EAAEupH,UAAU,aAAa,CAAC,MAAMzlH,GAAGoN,EAAEi3G,KAAKrkH,EAAE6N,EAAE7N,EAAE,QAAM,EAAG6N,EAAEq2G,KAAKlkH,EAAE,aAAa,CAAC8H,MAAMA,IAAI,IAAIvG,SAAQ,CAACvB,EAAE6N,KAAK,IAAI3R,EAAEmJ,MAAM4H,EAAEs4G,WAAWrpH,EAAEoJ,OAAO2H,EAAEu4G,YAAYtpH,EAAEwiH,WAAW,MAAMC,UAAU1xG,EAAE,EAAE,GAAG/Q,EAAE0iH,QAAOxxG,IAAIpN,EAAEooB,IAAIuiC,gBAAgBv9C,GAAG,GAAE,CAAC,MAAMpN,GAAGoN,EAAEi3G,KAAKrkH,EAAE6N,EAAE7N,EAAE,QAAM,EAAG6N,EAAEq2G,KAAKlkH,EAAE,aAAa,CAAC8H,MAAM8+C,UAAU,IAAI1qD,QAAQ8D,EAAE0lH,aAAappH,EAAE8Q,GAAG,cAAa,EAAGS,EAAEi3G,cAAc73G,EAAE+rB,eAAe,OAAM,EAAGnrB,EAAEqxG,UAAUhjH,EAAE,GAAGI,SAAS0D,EAAE+4C,KAAK,aAAa78C,GAAGA,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAAS8D,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAIC,IAAG,IAAIW,EAAE7N,EAAE,sBAAsB1D,EAAEJ,EAAEy5G,eAAe9nG,GAAGlK,EAAE3D,EAAE,YAAY,SAASkN,EAAElN,GAAG,IAAIy2G,KAAKrpG,EAAEspG,OAAOzpG,EAAEopG,UAAU6D,OAAOh+G,EAAE+kH,QAAQpzG,IAAI7N,EAAgqBA,EAAE0oD,KAAK,wBAAuB,KAAKpsD,EAAE4oB,QAAQygG,UAAzsB3lH,KAAO1D,EAAE4oB,QAASkN,GAAG,UAAS,KAAKpyB,EAAE+4C,KAAK,aAAaz8C,EAAE4oB,QAAQ0gG,cAActpH,EAAE4oB,QAAQ0gG,cAAc5lH,EAAE2xC,MAAM,cAAa,EAAGhuC,EAAE++G,UAAU70G,EAAE,oBAAmB,EAAGlK,EAAEkiH,aAAah4G,EAAE,kBAAkB7N,EAAE+4C,KAAK,SAAS,IAAMz8C,EAAE4oB,QAASkN,GAAG,SAAQhlB,IAAIpN,EAAE+4C,KAAK,kBAAkB3rC,EAAE,KAAG,EAAGzJ,EAAEugH,KAAKlkH,EAAE,aAAa,CAACoX,IAAIA,IAAI9a,EAAE4oB,QAAQ0gG,aAAa,SAAM/rG,CAAI7Z,GAAGA,QAAW1D,EAAE4oB,QAASxkB,QAAQmN,SAAYvR,EAAE4oB,QAAS4gG,MAAM,GAAG,EAA2T54G,CAAElN,GAAG9D,EAAE6pH,yBAA9T/lH,KAAIA,EAAEm5G,MAAMl3G,SAAS,0BAAyB,KAAKjC,EAAE+4C,KAAK,aAAa/4C,EAAEw4G,YAAYx4G,EAAE+4C,KAAK,SAAS,KAAG,EAAGp1C,EAAEugH,KAAKlkH,EAAE,aAAa,CAACoX,IAAIA,IAAInV,SAAS+jH,oBAAoB9pH,EAAE2d,GAAAA,CAAIzM,GAAGA,GAAGpN,EAAE2xC,MAAM,aAAaz1C,EAAE+pH,yBAAyB/pH,EAAEgqH,sBAAsB,GAAG,EAAyFziH,CAAEzD,IAAG,EAAG2D,EAAEugH,KAAKlkH,EAAE,aAAa,CAACoX,IAAIA,KAAI,EAAGyC,GAAAA,GAAM5M,EAAEo3G,KAAKj3G,EAAEgK,IAAI,2BAA2B,KAAI,EAAGzT,EAAEugH,KAAKlkH,EAAE,cAAa,EAAG2D,EAAEyT,KAAKpX,EAAE,cAAc,GAAE,CAAC,EAAE,CAAC,qBAAqB,QAAQ,WAAW,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAASA,EAAEoN,EAAEH,GAAGjN,EAAE,kDAAkD01G,kBAAkBzoG,GAAG,IAAI/Q,EAAE,CAAC,CAAC,oBAAoB,iBAAiB,oBAAoB,oBAAoB,mBAAmB,mBAAmB,CAAC,0BAA0B,uBAAuB,0BAA0B,0BAA0B,yBAAyB,yBAAyB,CAAC,0BAA0B,yBAAyB,iCAAiC,yBAAyB,yBAAyB,yBAAyB,CAAC,uBAAuB,sBAAsB,uBAAuB,uBAAuB,sBAAsB,sBAAsB,CAAC,sBAAsB,mBAAmB,sBAAsB,sBAAsB,qBAAqB,sBAAsB2R,EAAE,MAAM,GAAG,oBAAoB5L,SAAS,OAAM,EAAG,IAAIjC,EAAE9D,EAAE,GAAGkR,EAAE,CAAC,EAAE,IAAI,IAAIH,KAAK/Q,EAAE,GAAG+Q,EAAE,KAAKhL,SAAS,CAAC,IAAI,IAAI/F,EAAE2R,KAAKZ,EAAE4gE,UAAUzgE,EAAEpN,EAAE9D,IAAI2R,EAAE,OAAOT,CAAC,CAAC,OAAM,CAAG,EAAzJ,GAA6J9Q,EAAE,CAAC6pH,OAAOt4G,EAAEu4G,iBAAiB56G,MAAMqC,EAAEw4G,iBAAiB1iH,EAAE,CAACjD,QAAQ,eAACV,EAAC1B,UAAAjC,OAAA,QAAAmN,IAAAlL,UAAA,GAAAA,UAAA,GAAC2D,SAASwyF,gBAAgBrnF,EAAC9O,UAAAjC,OAAA,EAAAiC,UAAA,QAAAkL,EAAA,OAAG,IAAIjI,SAAQ,CAAC0L,EAAE/Q,KAAK,IAAII,EAAEA,KAAKqH,EAAE+uB,IAAI,SAASp2B,GAAG2Q,GAAG,EAAEtJ,EAAEyuB,GAAG,SAAS91B,GAAG,IAAI4Q,EAAElN,EAAE6N,EAAEy4G,mBAAmBl5G,GAAGF,aAAa3L,SAAS2L,EAAE81B,KAAK1mC,GAAG2mC,MAAM/mC,EAAE,GAAE,EAAC4pH,KAAKA,IAAI,IAAIvkH,SAAQ,CAACvB,EAAEoN,KAAK,IAAIzJ,EAAEiiH,aAAkB,YAAJ5lH,IAAW,IAAIiN,EAAEA,KAAKtJ,EAAE+uB,IAAI,SAASzlB,GAAGjN,GAAG,EAAE2D,EAAEyuB,GAAG,SAASnlB,GAAG,IAAI/Q,EAAE+F,SAAS4L,EAAE04G,kBAAkBrqH,aAAaqF,SAASrF,EAAE8mC,KAAK/1B,GAAGg2B,MAAM71B,EAAE,IAAGo5G,OAAOA,CAACxmH,EAAEoN,IAAIzJ,EAAEiiH,aAAajiH,EAAEmiH,OAAOniH,EAAEjD,QAAQV,EAAEoN,GAAGq5G,QAAAA,CAASzmH,GAAG2D,EAAEyuB,GAAG,SAASpyB,EAAE,EAAE6I,OAAAA,CAAQ7I,GAAG2D,EAAEyuB,GAAG,QAAQpyB,EAAE,EAAEoyB,EAAAA,CAAGpyB,EAAEoN,GAAG,IAAIH,EAAE3Q,EAAE0D,GAAGiN,GAAGhL,SAAS+H,iBAAiBiD,EAAEG,GAAE,EAAG,EAAEslB,GAAAA,CAAI1yB,EAAEoN,GAAG,IAAIH,EAAE3Q,EAAE0D,GAAGiN,GAAGhL,SAAS2E,oBAAoBqG,EAAEG,GAAE,EAAG,EAAEs5G,IAAI74G,GAAG/Q,OAAOu/E,iBAAiB14E,EAAE,CAACiiH,aAAa,CAACxuG,IAAIA,MAAMnV,SAAS4L,EAAEm4G,oBAAoBxwB,QAAQ,CAACp5B,YAAW,EAAGhlD,IAAIA,IAAInV,SAAS4L,EAAEm4G,oBAAoBL,UAAU,CAACvpD,YAAW,EAAGhlD,IAAIA,MAAMnV,SAAS4L,EAAE84G,sBAAsB94G,IAAIlK,EAAE,CAACgiH,WAAU,IAAK14G,EAAEiY,QAAQvhB,CAAC,EAAE,CAAC,iDAAiD,UAAU,QAAQ,CAAC,SAAS3D,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,IAAI5D,YAAYgR,EAAEipG,UAAUwK,WAAW5zG,EAAEg0G,QAAQ/kH,IAAI8D,EAAE1D,EAAE,IAAG,EAAGuR,EAAEq2G,KAAKlkH,EAAE,gBAAgB,CAACoX,IAAIA,KAAI,EAAGvJ,EAAE+4G,UAAU1qH,EAAE,sBAAsB2d,GAAAA,CAAIlW,GAAGA,GAAGrH,EAAEJ,EAAEknF,MAAMyjC,QAAQz5G,EAAE4uG,yBAAwB,EAAGnuG,EAAEuiD,QAAQnuD,SAASqnC,KAAKptC,GAAG8D,EAAE2xC,MAAM,iBAAgB,EAAG9jC,EAAEy3G,UAAUppH,EAAE,QAAQ,SAAQ,EAAG2R,EAAEy3G,UAAUppH,EAAE,SAAS,SAAQ,EAAG2R,EAAE60G,UAAUxmH,EAAE,sBAAsB8D,EAAE+4C,KAAK,iBAAgB,KAAM3rC,EAAE4uG,yBAAwB,EAAGnuG,EAAEuiD,QAAQnjD,EAAE/Q,GAAGI,IAAIJ,EAAEknF,MAAMyjC,QAAQvqH,EAAEA,EAAE,KAAI,EAAGuR,EAAEg4G,aAAa3pH,EAAE,sBAAsB8D,EAAE+4C,KAAK,iBAAgB,IAAK/4C,EAAE+4C,KAAK,SAAS,GAAG,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAAS/4C,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,IAAIy2G,KAAKrpG,EAAEspG,OAAOzpG,EAAEopG,UAAU6D,OAAOh+G,IAAI8D,EAAEiC,SAAS6kH,wBAAwB,SAAS9mH,GAAG,IAAIq2G,UAAU6D,OAAO9sG,GAAG+rG,MAAMlsG,EAAEypG,OAAOx6G,GAAG8D,EAAEoN,EAAE25G,yBAAwB,GAAG,EAAGl5G,EAAEq2G,KAAKlkH,EAAE,MAAM,CAACoX,IAAIA,IAAInV,SAAS+kH,wBAAwBntG,GAAAA,CAAI5M,GAAGA,GAAGjN,EAAE2xC,MAAM,MAAMvkC,EAAE65G,0BAA0BhkF,OAAMjjC,IAAI,MAAM9D,EAAEmoH,KAAKrkH,EAAEA,CAAC,KAAIiC,SAASilH,uBAAuBjkF,OAAMjjC,IAAI,MAAM9D,EAAEmoH,KAAKrkH,EAAEA,CAAC,GAAE,IAAIiN,EAAEG,EAAE,yBAAwB,KAAKpN,EAAE+4C,KAAK,OAAM,EAAG,IAAG9rC,EAAEG,EAAE,yBAAwB,KAAKpN,EAAE+4C,KAAK,OAAM,EAAG,GAAE,CAA1Y,CAA4Y/4C,GAAG9D,EAAEirH,+BAA+B,SAASnnH,GAAG,IAAIk6G,OAAO9sG,GAAGpN,EAAEq2G,SAASjpG,EAAEg6G,0BAA0B,WAAU,EAAGv5G,EAAEq2G,KAAKlkH,EAAE,MAAM,CAACoX,IAAIA,IAAI,uBAAuBhK,EAAEi6G,uBAAuBxtG,GAAAA,CAAI5M,GAAGA,GAAGjN,EAAE2xC,MAAM,MAAMvkC,EAAEg6G,0BAA0B,sBAAsBpnH,EAAE+4C,KAAK,OAAM,KAAM3rC,EAAEg6G,0BAA0B,UAAUpnH,EAAE+4C,KAAK,OAAM,GAAI,GAAG,CAA7S,CAA+S/4C,IAAG,EAAG6N,EAAEq2G,KAAKlkH,EAAE,MAAM,CAACoX,IAAIA,KAAI,EAAGyC,GAAAA,GAAM5M,EAAEo3G,KAAKj3G,EAAEgK,IAAI,oBAAoB,GAAG,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAASpX,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,IAAIk6G,OAAO9sG,GAAGpN,EAAEq2G,UAAS,EAAGxoG,EAAEq2G,KAAKlkH,EAAE,SAAS,CAACoX,IAAIA,IAAIpX,EAAEsnH,WAAWl6G,EAAE4K,YAAW,EAAGnK,EAAEq2G,KAAKlkH,EAAE,aAAa,CAACoX,IAAIA,IAAIhK,EAAEmtB,SAASl+B,OAAO+Q,EAAEmtB,SAASzhB,IAAI1L,EAAEmtB,SAASl+B,OAAO,GAAG,GAAG,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAUkrH,MAAM,CAAC,SAASvnH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,IAAG,EAAG6N,EAAEq2G,KAAKlkH,EAAE,SAAS,CAACoX,IAAIA,IAAIpX,EAAEg5B,YAAYh5B,EAAEgY,UAAU,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAAShY,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,IAAIk6G,OAAO9sG,GAAGpN,EAAEq2G,UAAS,EAAGxoG,EAAEq2G,KAAKlkH,EAAE,UAAU,CAACoX,IAAIA,IAAI,kBAAkBhK,EAAEw3G,QAAQx3G,EAAEw3G,WAAWx3G,EAAE4rB,YAAY,IAAI5rB,EAAEg3B,SAASh3B,EAAE+kC,OAAO/kC,EAAE7E,WAAW,IAAI,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAUi/G,MAAM,CAAC,SAASxnH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,IAAI6gH,WAAWzzG,EAAE6zG,QAAQh0G,EAAEitG,OAAOh+G,GAAG8D,EAAEq2G,UAAS,EAAGxoG,EAAEq2G,KAAKlkH,EAAE,WAAW,CAAC8H,KAAAA,GAAQ,IAAIy9G,WAAWjpH,EAAEkpH,YAAY7hH,GAAGzH,GAAGmJ,MAAM6H,EAAE5H,OAAO7B,IAAG,EAAGoK,EAAE45G,SAASr6G,GAAGjJ,EAAE7H,EAAEqH,EAAEuJ,EAAEzJ,EAAEU,IAAG,EAAG0J,EAAEy3G,UAAUr4G,EAAE,QAAWxJ,EAAEU,EAAE+I,EAAE,IAAT,MAAiB,EAAGW,EAAEy3G,UAAUr4G,EAAE,SAAS,WAAU,EAAGY,EAAEy3G,UAAUr4G,EAAE,QAAQ,SAAQ,EAAGY,EAAEy3G,UAAUr4G,EAAE,SAAYC,EAAE/I,EAAEV,EAAE,IAAT,MAAkBzD,EAAE+4C,KAAK,WAAW,CAAC1zC,MAAMrF,EAAEqF,MAAMC,OAAOtF,EAAEsF,QAAQ,GAAG,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAUoiH,MAAM,CAAC,SAAS1nH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,IAAG,EAAG6N,EAAEq2G,KAAKlkH,EAAE,OAAO,CAACoX,IAAIA,KAAI,EAAGvJ,EAAE45G,SAASznH,EAAEq2G,SAAS4K,WAAW,IAAI7zG,EAAE,CAAC,SAAS,SAAS,OAAO,QAAQ,MAAM,SAAS,IAAI,IAAIH,EAAE,EAAEA,EAAEG,EAAE/Q,OAAO4Q,IAAI,CAAC,IAAI/Q,EAAEkR,EAAEH,IAAG,EAAGY,EAAEq2G,KAAKlkH,EAAE9D,EAAE,CAACkb,IAAIA,IAAIpX,EAAE2nH,KAAKzrH,IAAI,EAAC,EAAG2R,EAAEq2G,KAAKlkH,EAAE,IAAI,CAACoX,IAAIA,IAAIpX,EAAEoF,KAAKpC,OAAO4kH,eAAc,EAAG/5G,EAAEq2G,KAAKlkH,EAAE,IAAI,CAACoX,IAAIA,IAAIpX,EAAEmF,IAAInC,OAAO6kH,aAAa,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAAS7nH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,IAAIq2G,UAAU4K,QAAQ7zG,GAAGqpG,KAAKxpG,EAAEypG,OAAOx6G,GAAG8D,GAAE,EAAG6N,EAAEq2G,KAAKlkH,EAAE,OAAO,CAACoX,IAAIA,IAAIhK,EAAE45F,QAAQmR,MAAM,SAASt+F,GAAAA,CAAIvd,GAAGA,IAAIA,EAAE,UAAU,WAAWA,SAAS8Q,EAAE45F,QAAQmR,KAAK/qG,EAAE45F,QAAQmR,KAAK77G,EAAEJ,EAAEmoH,KAAK,GAAGp3G,EAAEmK,IAAI,kBAAkBnK,EAAEmK,KAAI,EAAGvJ,EAAEi6G,YAAYxrH,MAAM0D,EAAE+4C,KAAK,OAAOz8C,EAAE,GAAG,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAUyrH,MAAM,CAAC,SAAS/nH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,IAAIw2G,MAAMppG,EAAE+rG,MAAMlsG,EAAEspG,QAAQr6G,EAAEm6G,UAAU4K,QAAQ3kH,EAAE49G,OAAOv2G,IAAI3D,EAAEkN,GAAE,EAAGzJ,EAAE,EAAEU,EAAE,EAAE,SAASL,IAAI,IAAIkkH,MAAM56G,GAAGpN,EAAEq2G,SAASjpG,KAAI,EAAGS,EAAEg4G,aAAavpH,EAAE,aAAY,EAAGuR,EAAEy3G,UAAUl4G,EAAE,UAAU,QAAQ9Q,EAAE2rH,QAAQtkH,GAAG3D,EAAE+4C,KAAK,QAAO,GAAI,CAAC,SAAS/qC,EAAEZ,EAAEH,GAAGjN,EAAE4kH,UAAS,EAAG/2G,EAAEy3G,UAAUl4G,EAAE,UAAU,SAAQ,EAAGS,EAAEy3G,UAAUr4G,EAAE,UAAU,WAAU,EAAGY,EAAEy3G,UAAUl4G,EAAE,UAAU,SAAQ,EAAGS,EAAEy3G,UAAUr4G,EAAE,UAAU,QAAQ,CAAC,SAAS5I,IAAI,IAAI2jH,MAAM56G,GAAGpN,EAAEq2G,SAASppG,GAAE,EAAGY,EAAE45G,SAASr6G,GAAG9Q,EAAE0G,OAAOg7G,YAAY/wG,EAAE3H,OAAO,GAAG3B,EAAEX,OAAOk7G,WAAWjxG,EAAE5H,MAAM,GAAGnJ,EAAE2d,IAAI,MAAMvd,GAAGJ,EAAE2d,IAAI,OAAOlW,IAAG,EAAGkK,EAAEy3G,UAAUl4G,EAAE,MAAM,GAAG9Q,QAAO,EAAGuR,EAAEy3G,UAAUl4G,EAAE,OAAO,GAAGzJ,MAAM,EAAC,EAAGkK,EAAEq2G,KAAKlkH,EAAE,OAAO,CAACoX,IAAIA,KAAI,EAAGvJ,EAAE+4G,UAAUtqH,EAAE,YAAYud,GAAAA,CAAIxW,GAAG,GAAGA,EAAE,CAACrD,EAAE2xC,MAAM,QAAO,EAAG9jC,EAAE60G,UAAUpmH,EAAE,YAAY,IAAI+G,EAAE,WAAW,IAAI2kH,MAAM1rH,GAAG0D,EAAEq2G,SAAS,GAAG/5G,EAAE,OAAM,EAAGuR,EAAEuiD,QAAQ9zD,EAAEqH,IAAG,EAAGkK,EAAEy3G,UAAUhpH,EAAE,UAAU,QAAQ,CAAC,IAAIA,GAAE,EAAGuR,EAAE3L,eAAe,QAAO,EAAG2L,EAAE60G,UAAUpmH,EAAE,mBAAkB,EAAGuR,EAAEuiD,QAAQnuD,SAASqnC,KAAKhtC,GAAG0D,EAAEq2G,SAAS2R,MAAM1rH,GAAE,EAAGuR,EAAEuiD,QAAQ9zD,EAAEqH,GAAG,IAAIU,GAAE,EAAGwJ,EAAEuiD,QAAQ9zD,EAAE,uCAAsC,EAAGuR,EAAEuiD,QAAQ/rD,EAAE+I,EAAE+9D,OAAOl+D,EAAE5I,EAAE,QAAQP,GAAG,IAAIT,GAAE,EAAGwK,EAAEuiD,QAAQ9zD,EAAE,sCAAsCgI,GAAE,EAAGuJ,EAAEuiD,QAAQ/sD,EAAE+J,EAAEo3G,MAAM9gH,GAAE,EAAGmK,EAAEuiD,QAAQ/sD,EAAE+J,EAAEq3G,OAAO,OAAOx3G,EAAE3I,EAAE,SAAQ,IAAItE,EAAEwkH,SAAQv3G,EAAEvJ,EAAE,SAAQ,IAAI1D,EAAEykH,UAASz2G,EAAE1J,EAAEZ,GAAG1D,EAAEoyB,GAAG,iBAAgB,IAAIpkB,EAAE1J,EAAEZ,KAAI1D,EAAEoyB,GAAG,eAAc,IAAIpkB,EAAE1J,EAAEZ,KAAI1D,EAAEoyB,GAAG,oBAAmB,IAAIpkB,EAAE1J,EAAEZ,KAAIuJ,EAAE3Q,EAAE,aAAY0D,IAAIkN,EAAE,IAAIlN,EAAEsvF,OAAO7rF,EAAEzD,EAAE8uF,MAAM3qF,EAAEnE,EAAE+uF,KAAK,IAAG/uF,EAAEoyB,GAAG,sBAAqBpyB,IAAI,GAAGkN,EAAE,EAAC,EAAGW,EAAE60G,UAAUpmH,EAAE,oBAAoB,IAAI8Q,EAAEpN,EAAE8uF,MAAMrrF,EAAEwJ,EAAEjN,EAAE+uF,MAAM5qF,GAAE,EAAG0J,EAAEy3G,UAAUhpH,EAAE,YAAY,aAAa8Q,QAAQH,OAAO,KAAIjN,EAAEoyB,GAAG,oBAAmB,KAAK,GAAGllB,EAAE,CAACA,GAAE,GAAG,EAAGW,EAAEg4G,aAAavpH,EAAE,oBAAoB,IAAI0D,GAAE,EAAG6N,EAAE45G,SAASnrH,GAAGJ,EAAE2d,IAAI,OAAO7Z,EAAEoF,MAAMlJ,EAAE2d,IAAI,MAAM7Z,EAAEmF,MAAK,EAAG0I,EAAEy3G,UAAUhpH,EAAE,OAAO,GAAG0D,EAAEoF,WAAU,EAAGyI,EAAEy3G,UAAUhpH,EAAE,MAAM,GAAG0D,EAAEmF,UAAS,EAAG0I,EAAEy3G,UAAUhpH,EAAE,YAAY,KAAK,KAAIA,CAAC,CAAC,CAAhkC,GAAokCgI,EAAEpI,EAAEkb,IAAI,OAAO1T,EAAExH,EAAEkb,IAAI,QAAQ9S,GAAGZ,IAAG,EAAGmK,EAAEy3G,UAAUjiH,EAAE,MAAM,GAAGiB,QAAO,EAAGuJ,EAAEy3G,UAAUjiH,EAAE,OAAO,GAAGK,QAAO,EAAGmK,EAAEq6G,cAAc7kH,IAAIgB,KAAKA,IAAIrE,EAAE+4C,KAAK,QAAO,EAAG,MAAMj1C,GAAG,GAAG,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAAS9D,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,IAAIq2G,UAAU8K,QAAQ/zG,IAAIpN,GAAE,EAAG6N,EAAEq2G,KAAKlkH,EAAE,SAAS,CAACoX,IAAIA,KAAK,IAAI,OAAOhK,EAAEg2E,MAAM+kC,gBAAgBj4F,MAAM,UAAU,EAAE,CAAC,MAAMlwB,GAAG,MAAM,EAAE,GAAG6Z,GAAAA,CAAI7Z,IAAG,EAAG6N,EAAEy3G,UAAUl4G,EAAE,kBAAkB,OAAOpN,KAAK,GAAG,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAASA,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,IAAIq2G,UAAUwK,WAAWzzG,EAAE8sG,OAAOjtG,IAAIjN,GAAE,EAAG6N,EAAEq2G,KAAKlkH,EAAE,aAAa,CAAC8H,KAAAA,GAAQ,IAAIq2G,YAAYjiH,GAAGkR,GAAGo4G,YAAYlpH,EAAEipH,WAAW5hH,GAAGsJ,EAAEC,EAAEhR,EAAEyH,EAAErH,GAAE,EAAGuR,EAAEy3G,UAAUl4G,EAAE,SAASF,EAAE,MAAMlN,EAAE+4C,KAAK,aAAa7rC,EAAE,GAAG,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAASlN,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,IAAIihH,QAAQ7zG,GAAGpN,EAAEq2G,UAAS,EAAGxoG,EAAEq2G,KAAKlkH,EAAE,SAAS,CAAC8H,MAAMA,CAAC9H,EAAEiN,IAAIA,EAAEG,EAAEg2E,MAAMC,YAAYrjF,EAAEiN,GAAG2wG,iBAAiBxwG,GAAGywG,iBAAiB79G,IAAI,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAASA,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,IAAG,EAAG6N,EAAEq2G,KAAKlkH,EAAE,QAAQ,CAACoX,IAAIA,IAAIpX,EAAEg6G,OAAO,eAAengG,GAAAA,CAAIzM,GAAGpN,EAAEg6G,OAAO,cAAc5sG,EAAE,GAAG,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAASpN,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,IAAG,EAAG6N,EAAEq2G,KAAKlkH,EAAE,OAAO,CAACoX,IAAIA,IAAIpX,EAAE81G,OAAO73G,KAAK4b,GAAAA,CAAIzM,GAAGpN,EAAE81G,OAAO73G,KAAKmP,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAUg7G,MAAM,CAAC,SAASpoH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,IAAIoN,EAAE,CAAC,OAAO,MAAM,aAAa,kBAAiB,EAAGS,EAAEq2G,KAAKlkH,EAAE,QAAQ,CAACoX,IAAIA,IAAIhK,EAAEujE,MAAKvjE,GAAGpN,EAAEoN,MAAK,WAAWyM,GAAAA,CAAI5M,GAAG,IAAI,IAAI/Q,EAAE,EAAEA,EAAEkR,EAAE/Q,OAAOH,IAAI,CAAC,IAAI2R,EAAET,EAAElR,GAAG2R,IAAIZ,GAAGjN,EAAE6N,KAAK7N,EAAE6N,IAAG,EAAG,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAAS7N,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,IAAI02G,OAAOtpG,EAAEqpG,KAAKxpG,EAAEopG,SAASn6G,GAAG8D,GAAE,EAAG6N,EAAEq2G,KAAKlkH,EAAE,iBAAiB,CAACoX,IAAIA,IAAIlb,EAAEglH,QAAQx6F,QAAQ,EAAE7M,GAAAA,CAAIvd,GAAG,IAAIy5B,KAAKpyB,GAAG3D,EAAE+2G,SAAS,IAAI76G,EAAEglH,QAAQ,IAAIv9G,EAAEtH,OAAO,OAAO,IAAI6Q,GAAE,EAAGW,EAAEm3G,OAAO1oH,GAAG,GAAG,IAAIJ,EAAEglH,OAAOx6F,OAAOxZ,EAAE,IAAI,IAAIE,EAAE,EAAEA,EAAEzJ,EAAEtH,OAAO+Q,IAAI,CAAC,IAAIH,EAAEtJ,EAAEyJ,GAAGH,EAAEo7G,kBAAkBp7G,EAAEo7G,mBAAmBp7G,EAAEkpB,UAAUlpB,EAAEq7G,gBAAgBr7G,EAAEq7G,iBAAiBr7G,EAAEmpB,QAAQnpB,EAAEkpB,WAAU,EAAGtoB,EAAEm3G,OAAO/3G,EAAEo7G,kBAAkBn7G,EAAE,EAAElN,EAAEgY,UAAU/K,EAAEmpB,SAAQ,EAAGvoB,EAAEm3G,OAAO/3G,EAAEq7G,gBAAgBp7G,EAAE,EAAElN,EAAEgY,SAAS,CAAChY,EAAE+2G,SAASt1E,SAASr0B,EAAEi3G,KAAK,GAAGp3G,EAAEmK,IAAI,uBAAuB9a,KAAK0D,EAAE+4C,KAAK,iBAAiBz8C,EAAE,GAAG,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAUisH,MAAM,CAAC,SAASvoH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,IAAIy2G,KAAKrpG,EAAEspG,OAAOzpG,EAAEksG,MAAMj9G,EAAEm6G,UAAU6D,OAAO59G,IAAI0D,EAAE2D,GAAE,EAAGX,OAAOwlH,uCAAuClsH,EAAEmsH,+BAA+BvsH,EAAEI,EAAE,2CAA0C0D,IAAI,OAAOA,EAAE0oH,cAAc,IAAI,YAAY/kH,GAAE,EAAG,MAAM,IAAI,gBAAgBA,GAAE,EAAE,IAAIA,GAAE,GAAG,EAAGkK,EAAEq2G,KAAKlkH,EAAE,UAAU,CAAC8H,KAAAA,GAAQnE,GAAGrH,EAAEmsH,iCAAiCzoH,EAAE+4C,KAAK,YAAY9rC,EAAEo3G,KAAKj3G,EAAEgK,IAAI,wBAAwB,GAAG,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAASpX,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,IAAG,EAAG6N,EAAEq2G,KAAKlkH,EAAE,UAAU,CAAC6Z,GAAAA,CAAIzM,GAAG,IAAIypG,SAAS5pG,EAAEypG,OAAOx6G,EAAEu6G,KAAK5oG,GAAG7N,EAAE1D,EAAE8Q,EAAEujE,MAAK3wE,GAAGA,EAAEklB,WAAU9X,EAAE,GAAGH,EAAEw0B,OAAO,CAACtjC,KAAK,UAAU+G,SAAS,QAAQmX,MAAM,GAAG+mE,MAAM,CAACulC,YAAY,QAAQlR,KAAKn7G,GAAGm7G,MAAM,GAAGwI,SAAS7yG,EAAE8yG,SAASt5D,gBAAgB5mD,EAAE4oH,cAAcx7G,EAAEhL,KAAKlG,EAAEmoH,KAAK,GAAGx2G,EAAEuJ,IAAI,oBAAoBhK,EAAEqqG,OAAOrqG,EAAEqqG,OAAO,GAAG,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAASz3G,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,IAAIs2G,OAAOlpG,EAAE0oG,OAAO7oG,EAAEopG,UAAUkL,UAAUrlH,EAAEg+G,OAAO59G,IAAI0D,EAAE2D,EAAE,KAAKuJ,EAAE,KAAKzJ,GAAE,EAAGU,GAAE,EAAGL,GAAE,EAAGsJ,EAAEy7G,MAAM3sH,GAAE,KAAK4H,GAAE,CAAE,IAAE,KAAKA,GAAE,CAAE,IAAG9D,EAAEoyB,GAAG,UAASw0B,MAAMx5C,EAAEY,EAAE3J,KAAK,IAAIhB,EAAErD,EAAE62G,UAAU0C,YAAYn3G,IAAIkC,EAAEm1G,MAAM/1G,GAAGuJ,EAAEssG,WAAW,IAAIl2G,IAAIiB,EAAE,OAAO,IAAIF,EAAE,WAAWgJ,GAAG/I,GAAGwJ,EAAEkwG,SAAS,GAAG,UAAU3wG,GAAGhJ,EAAE,CAAC,GAAGX,IAAIA,GAAE,EAAGyJ,QAAQ,EAAGW,EAAEi7G,SAASxkH,EAAEZ,GAAGS,GAAE,IAAKA,IAAIL,EAAE,OAAO,IAAIsJ,EAAElR,EAAEiiH,YAAYnwG,GAAE,EAAGH,EAAEy3G,UAAUjiH,EAAE,UAAU,QAAQ+J,EAAE,GAAGA,EAAElR,EAAEiiH,YAAY,SAAS/wG,GAAG,IAAIzJ,EAAE3D,EAAE62G,UAAU0C,WAAW,IAAI51G,EAAE,OAAO,IAAIo4E,OAAOt4E,EAAE+1G,OAAOr1G,EAAEkB,MAAMvB,EAAEwB,OAAO0I,EAAEyrG,MAAMp1G,GAAG4I,EAAEssG,WAAWl2G,EAAES,EAAEO,GAAG6I,EAAE67G,aAAa5kH,EAAEG,EAAE0J,EAAE3J,GAAGhB,GAAG/G,EAAEipH,WAAWjpH,EAAEkpH,aAAa9hH,EAAEkL,KAAK2Q,MAAMnS,GAAGlR,EAAEiiH,YAAY16G,IAAIW,EAAEwK,KAAK0zB,KAAK5+B,EAAES,GAAG,GAAE,EAAG0J,EAAEy3G,UAAU3hH,EAAE,kBAAkB,OAAOuJ,EAAE6lD,SAAQ,EAAGllD,EAAEy3G,UAAU3hH,EAAE,SAAS,GAAGW,QAAO,EAAGuJ,EAAEy3G,UAAU3hH,EAAE,QAAQ,GAAGN,QAAO,EAAGwK,EAAEy3G,UAAU3hH,EAAE,qBAAqB,KAAKD,EAAES,GAAGA,EAAE,GAAGd,QAAQe,EAAEE,OAAO8I,GAAG/J,EAAE,GAAE,EAAGwK,EAAEy3G,UAAU3hH,EAAE,OAAO,GAAGyJ,EAAElR,EAAEiiH,YAAY96G,EAAE,GAAE,EAAGwK,EAAEy3G,UAAU3hH,EAAE,OAAUzH,EAAEiiH,YAAY96G,EAAjB,OAAwB,EAAGwK,EAAEy3G,UAAU3hH,EAAE,OAAUyJ,EAAE/J,EAAE,EAAP,KAAa,CAAljB,CAAojB+J,GAAGS,EAAEkwG,WAAU,EAAGlwG,EAAEy3G,UAAUjiH,EAAE,UAAU,QAAQe,IAAI07B,aAAan8B,GAAGA,EAAE+E,YAAW,MAAK,EAAGmF,EAAEy3G,UAAUjiH,EAAE,UAAU,OAAO,GAAE,KAAK,MAAI,EAAGwK,EAAEq2G,KAAKlkH,EAAE,aAAa,CAACoX,IAAIA,IAAIpX,EAAE81G,OAAOyD,WAAW1/F,GAAAA,CAAIzM,GAAGA,EAAEhL,MAAMpC,EAAE81G,OAAO+B,SAAS73G,EAAE81G,OAAOyD,WAAWnsG,EAAE0yB,aAAan8B,GAAGA,EAAE,KAAKuJ,EAAE,KAAKzJ,GAAE,EAAGU,GAAE,EAAG,GAAG,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAU6kH,MAAM,CAAC,SAAShpH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,IAAI81G,OAAO1oG,EAAEmpG,QAAQtpG,EAAEopG,UAAU6D,OAAOh+G,EAAEilH,QAAQ7kH,IAAI0D,EAAE,IAAI,IAAIiN,KAAKG,EAAEysG,cAAc75G,EAAEwX,KAAKvK,EAAEG,EAAEysG,cAAc5sG,IAAIG,EAAE0qG,QAAQ93G,EAAE83G,MAAM1qG,EAAE0qG,OAAO1qG,EAAEwqG,SAAS17G,EAAE07G,QAAO,EAAG/pG,EAAEm3G,OAAO53G,EAAEwqG,OAAO,EAAE,IAAI,IAAIj0G,EAAEsJ,EAAEmK,IAAI,UAAU,IAAI,IAAInK,IAAI,iBAAiBtJ,IAAIzH,EAAE07G,QAAO,EAAG/pG,EAAEm3G,OAAOrhH,EAAE,EAAE,IAAIyJ,EAAEsqG,SAAQ,EAAG7pG,EAAEy3G,UAAUhpH,EAAE,kBAAkB,OAAO8Q,EAAEsqG,WAAWtqG,EAAE2qG,WAAW77G,EAAE67G,SAAS3qG,EAAE2qG,UAAU3qG,EAAEyrG,cAAc38G,EAAE28G,aAAY,EAAG38G,EAAE,uBAAsB,GAAIkR,EAAEuqG,QAAQvqG,EAAE4sG,OAAO,eAAe5sG,EAAEuqG,OAAOvqG,EAAE4sG,OAAOh6G,EAAEg6G,OAAO/sG,EAAEG,EAAE4sG,OAAO/sG,IAAIjN,EAAEoC,IAAIgL,EAAEhL,GAAG,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAU6mH,MAAM,CAAC,SAASjpH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAIC,IAAG,IAAIW,EAAE7N,EAAE,aAAa1D,EAAEJ,EAAEy5G,eAAe9nG,GAAGlK,EAAE3D,EAAE,YAAY,SAASkN,EAAElN,GAAG,IAAIy2G,KAAKrpG,EAAEspG,OAAOzpG,EAAE6oG,OAAO55G,EAAEE,YAAYyR,EAAEsrG,MAAMjsG,EAAEmpG,UAAU4K,QAAQx9G,EAAEy2G,OAAO/1G,EAAEg9G,QAAQr9G,IAAI9D,EAAEgO,EAAE,EAAE,IAAI,IAAIZ,EAAE,EAAEA,EAAE9Q,EAAE4oB,QAAQoxF,OAAOj6G,OAAO+Q,IAAIF,EAAE/I,EAAE7H,EAAE4oB,QAAQoxF,OAAOlpG,IAAGA,IAAIpN,EAAE+4C,KAAK,SAAS3rC,EAAEnP,OAAOmP,EAAE,IAAGpN,EAAEoyB,GAAG,iBAAgB,KAAKpkB,EAAE,EAAEhO,EAAE2Y,QAAQ0rG,MAAK,CAAE,IAAGrkH,EAAE0oD,KAAK,iBAAgB,KAAK1oD,EAAE2Y,QAAQ0rG,MAAK,EAAGrkH,EAAE62G,SAASwN,MAAK,EAAGrkH,EAAEi3G,KAAKoN,MAAK,EAAGrkH,EAAEg2G,SAAQ,EAAGh2G,EAAE+4C,KAAK,QAAQ,IAAG/4C,EAAEoyB,GAAG,eAAc,KAAKl2B,EAAEg8G,MAAMl4G,EAAE+kH,KAAK,EAAE/kH,EAAEwkH,OAAOxkH,EAAE62G,SAASwN,MAAK,EAAGrkH,EAAEi3G,KAAKoN,MAAK,IAAKrkH,EAAE62G,SAASwN,MAAK,EAAGrkH,EAAEi3G,KAAKoN,MAAK,EAAG,IAAGrkH,EAAEoyB,GAAG,eAAcw0B,UAAU54C,EAAEH,EAAEktG,0BAA0B,EAAGp3G,EAAEygH,OAAOv2G,EAAEmtG,sBAAsBhtG,GAAG,EAAEhO,EAAEoC,IAAIlG,EAAEkG,IAAI6K,EAAEo3G,KAAK,GAAGj3G,EAAEgK,IAAI,iBAAiBpJ,IAAIhO,EAAE+4C,KAAK,QAAQz8C,EAAE0R,KAAKhO,EAAEi3G,KAAKoN,MAAK,EAAGrkH,EAAE2Y,QAAQ0rG,MAAK,EAAGrkH,EAAE62G,SAASwN,MAAK,GAAG,EAAG1gH,EAAE++G,UAAUj/G,EAAE,mBAAmB,EAAGE,EAAEygH,OAAOv2G,EAAEmtG,sBAAsB/tG,EAAEo3G,KAAKj3G,EAAEgK,IAAI,qBAAqB,IAAGpX,EAAEoyB,GAAG,wBAAuB,KAAKpyB,EAAE+4C,KAAK,UAAUp1C,EAAEo6G,WAAW/9G,EAAE2Y,QAAQ0rG,MAAK,EAAGrkH,EAAE62G,SAASwN,MAAK,EAAGrkH,EAAEi3G,KAAKoN,MAAK,EAAG,IAAGrkH,EAAEoyB,GAAG,mBAAkB,KAAKpyB,EAAE2Y,QAAQ0rG,MAAK,EAAGrkH,EAAEi3G,KAAKoN,MAAK,EAAGrkH,EAAE62G,SAASwN,MAAK,CAAE,IAAGrkH,EAAEoyB,GAAG,eAAc,KAAKpyB,EAAE62G,SAASwN,MAAK,EAAGrkH,EAAEi3G,KAAKoN,MAAK,CAAE,IAAGrkH,EAAEoyB,GAAG,cAAa,KAAKpyB,EAAEi3G,KAAKoN,MAAK,GAAG,EAAG1gH,EAAE2hH,UAAUxhH,EAAE,UAAU,OAAO,IAAG9D,EAAEoyB,GAAG,iBAAgB,KAAKpyB,EAAEi3G,KAAKoN,MAAK,CAAE,IAAGrkH,EAAEoyB,GAAG,kBAAiB,KAAKpyB,EAAE4kH,UAAU5kH,EAAE2Y,QAAQ0rG,MAAK,EAAG,IAAGrkH,EAAEoyB,GAAG,gBAAe,KAAKpyB,EAAE2Y,QAAQ0rG,MAAK,EAAGrkH,EAAEi3G,KAAKoN,MAAK,CAAE,IAAGrkH,EAAEoyB,GAAG,iBAAgB,KAAKpyB,EAAE2Y,QAAQ0rG,MAAK,EAAGrkH,EAAEi3G,KAAKoN,MAAK,CAAE,IAAGrkH,EAAEoyB,GAAG,oBAAmB,KAAKpyB,EAAEi3G,KAAKoN,MAAK,CAAE,IAAGrkH,EAAEoyB,GAAG,iBAAgB,KAAKpyB,EAAE2Y,QAAQ0rG,MAAK,EAAGrkH,EAAEi3G,KAAKoN,MAAK,CAAE,GAAE,CAAC,EAAE,CAAC,YAAY,QAAQ,WAAW,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAASrkH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG,IAAIY,EAAE7N,EAAE,sBAAsB1D,EAAEJ,EAAEy5G,eAAe9nG,GAAGlK,EAAE3D,EAAE,gBAAgBkN,EAAEhR,EAAEy5G,eAAehyG,GAAGF,EAAEzD,EAAE,mBAAmBmE,EAAEjI,EAAEy5G,eAAelyG,GAAGK,EAAE9D,EAAE,SAASgO,EAAE9R,EAAEy5G,eAAe7xG,GAAGO,EAAErE,EAAE,kBAAkBqD,EAAEnH,EAAEy5G,eAAetxG,GAAGC,EAAEtE,EAAE,cAAc0D,EAAExH,EAAEy5G,eAAerxG,GAAGF,EAAEpE,EAAE,UAAUqlB,EAAEnpB,EAAEy5G,eAAevxG,GAAG0G,EAAE9K,EAAE,YAAY7D,EAAED,EAAEy5G,eAAe7qG,GAAGD,EAAE7K,EAAE,aAAakW,EAAEha,EAAEy5G,eAAe9qG,GAAGmV,EAAEhgB,EAAE,gBAAgBsD,EAAEpH,EAAEy5G,eAAe31F,GAAG7J,EAAEnW,EAAE,aAAagP,EAAE9S,EAAEy5G,eAAex/F,GAAGJ,EAAE/V,EAAE,YAAY,MAAM8O,UAAUxS,EAAE4oB,QAAQ9oB,WAAAA,CAAY4D,GAAG41G,MAAM51G,GAAGsW,KAAK4yG,SAAQ,EAAG5yG,KAAKnY,KAAK,UAAUmY,KAAKopB,MAAM7nB,KAAK6H,MAAM,IAAItjB,YAAYgR,GAAGpN,GAAGihH,QAAQh0G,EAAEq0G,QAAQplH,GAAGoa,KAAKsqG,IAAIvK,SAASr2G,EAAEoyB,GAAG,aAAY,KAAKrc,EAAEgoG,WAAWznG,KAAK+tG,MAAK,EAAG,IAAGrkH,EAAEoyB,GAAG,SAAQ,KAAKrc,EAAEgoG,SAASznG,KAAKkwG,SAASlwG,KAAK+tG,MAAK,CAAE,IAAGrkH,EAAEoyB,GAAG,sBAAqBpyB,IAAIsW,KAAK4yG,SAAQ,EAAGnzG,EAAEozG,kBAAkBnpH,EAAE9D,EAAE,IAAG8D,EAAEoyB,GAAG,oBAAmB,MAAMpyB,EAAEk3G,QAAQmN,OAAO/tG,KAAK4yG,UAAUlpH,EAAEk2G,SAASl2G,EAAE4kH,SAAStuG,KAAK+tG,MAAMxsG,KAAK6H,MAAMpJ,KAAKopB,OAAOtyB,EAAE6tG,oBAAoB3kG,KAAK+tG,MAAK,EAAG,IAAGrkH,EAAEoyB,GAAG,WAAUpyB,IAAIA,IAAG,EAAG+V,EAAE8vG,aAAa54G,EAAE,oBAAmB,EAAG8I,EAAE2sG,UAAUz1G,EAAE,aAAaqJ,KAAKopB,MAAM7nB,KAAK6H,SAAQ,EAAG3J,EAAE2sG,UAAUz1G,EAAE,oBAAmB,EAAG8I,EAAE8vG,aAAa54G,EAAE,aAAa,IAAGqJ,KAAKgqC,MAAM,CAACA,IAAAA,GAAO,IAAIw1D,OAAO91G,GAAGsW,KAAKsqG,IAAI5gH,EAAE63G,QAAQvhG,KAAKqmE,KAAI,EAAGj5E,EAAEwhB,SAAS,CAAC/mB,KAAK,WAAW+G,SAAS,MAAMmX,MAAM,MAAM/F,KAAKqmE,IAAI,CAACx+E,KAAK,aAAa+G,SAAS,MAAMmX,MAAM,KAAK/F,KAAKqmE,KAAI,EAAGt5E,EAAE6hB,SAAS,CAAC/mB,KAAK,eAAe+G,SAAS,OAAOmX,MAAM,MAAM/F,KAAKqmE,KAAI,EAAGxgF,EAAE+oB,SAAS,CAAC/mB,KAAK,SAAS+G,SAAS,OAAOmX,MAAM,MAAMrc,EAAE63G,QAAQvhG,KAAKqmE,KAAI,EAAGt3D,EAAEH,SAAS,CAAC/mB,KAAK,OAAO+G,SAAS,OAAOmX,MAAM,MAAMrc,EAAEq5G,QAAQh9G,SAAQ,EAAG0Z,EAAEquG,SAASphF,MAAK,KAAK1sB,KAAKsqG,IAAIvH,QAAQr5G,EAAEq5G,OAAO,IAAGr5G,EAAEo4G,aAAariG,EAAEgoG,UAAUznG,KAAKqmE,KAAI,EAAGr5E,EAAE4hB,SAAS,CAAC/mB,KAAK,aAAa+G,SAAS,QAAQmX,MAAM,MAAMrc,EAAEk3G,SAAS5gG,KAAKqmE,KAAI,EAAGzmE,EAAEgP,SAAS,CAAC/mB,KAAK,UAAU+G,SAAS,QAAQmX,MAAM,MAAMrc,EAAEq4G,KAAK/hG,KAAKqmE,KAAI,EAAG3uE,EAAEkX,SAAS,CAAC/mB,KAAK,MAAM+G,SAAS,QAAQmX,MAAM,MAAMrc,EAAEk5G,SAASl2G,OAAOwlH,uCAAuClyG,KAAKqmE,KAAI,EAAG3tE,EAAEkW,SAAS,CAAC/mB,KAAK,UAAU+G,SAAS,QAAQmX,MAAM,MAAMrc,EAAEy4G,eAAeniG,KAAKqmE,KAAI,EAAGx4E,EAAE+gB,SAAS,CAAC/mB,KAAK,gBAAgB+G,SAAS,QAAQmX,MAAM,MAAMrc,EAAEw4G,YAAYliG,KAAKqmE,KAAI,EAAGzvE,EAAEgY,SAAS,CAAC/mB,KAAK,aAAa+G,SAAS,QAAQmX,MAAM,MAAM,IAAI,IAAIjP,EAAE,EAAEA,EAAEpN,EAAE62G,SAASx6G,OAAO+Q,IAAIkJ,KAAKqmE,IAAI38E,EAAE62G,SAASzpG,GAAG,CAACuvE,GAAAA,CAAI38E,GAAG,IAAIoN,EAAE,mBAAmBpN,EAAEA,EAAEsW,KAAKsqG,KAAK5gH,GAAGuhH,UAAUt0G,EAAEw0G,cAAcvlH,EAAEylH,eAAe9zG,GAAGyI,KAAKsqG,IAAIvK,SAAS,OAAOjpG,EAAElI,UAAU,IAAI,MAAMoR,KAAK8yG,QAAQn8G,EAAE,MAAM,IAAI,OAAOqJ,KAAK8yG,QAAQltH,EAAE,MAAM,IAAI,QAAQoa,KAAK8yG,QAAQv7G,EAAE,MAAM,SAAQ,EAAGkI,EAAE8pG,cAAa,EAAG,8DAA8DjK,MAAMj5B,IAAIvvE,EAAE,CAACi8G,KAAAA,CAAMrpH,GAAGA,EAAEspH,eAAetpC,UAAUhgF,EAAEy3G,KAAK,IAAI,IAAIrqG,EAAE,EAAEA,EAAEpN,EAAEupH,gBAAgBltH,OAAO+Q,IAAI,CAAC,IAAIH,EAAEjN,EAAEupH,gBAAgBn8G,GAAGH,EAAEiY,QAAQjY,IAAIjN,EAAEiN,EAAEiY,UAAS,EAAGnP,EAAEyzG,cAAcv8G,EAAEw8G,cAAc,cAAc,CAAC,CAACxJ,QAAAA,CAASjgH,EAAEoN,EAAEH,GAAG,IAAIksG,MAAMj9G,GAAGoa,KAAKsqG,IAAItK,QAAO,EAAGvgG,EAAE2sG,UAAUt1G,EAAE,wBAAwB,IAAIS,GAAE,EAAGkI,EAAE7T,eAAe,QAAO,EAAG6T,EAAE2sG,UAAU70G,EAAE,uBAAsB,EAAGkI,EAAEq6C,QAAQviD,EAAE7N,EAAEy3G,MAAMrqG,EAAEs8G,UAAU,IAAG,EAAG3zG,EAAEq6C,QAAQhjD,EAAES,GAAG,IAAIvR,GAAE,EAAGyZ,EAAE7T,eAAe,QAAO,EAAG6T,EAAE2sG,UAAUpmH,EAAE,sBAAqB,EAAGyZ,EAAEq6C,QAAQhjD,EAAE9Q,GAAG,IAAI,IAAI8Q,EAAE,EAAEA,EAAEpN,EAAEigH,SAAS5jH,OAAO+Q,IAAI,CAAC,IAAIH,EAAEjN,EAAEigH,SAAS7yG,GAAGlR,GAAE,EAAG6Z,EAAE7T,eAAe,QAAO,EAAG6T,EAAE2sG,UAAUxmH,EAAE,qBAAqB+Q,EAAEiY,UAAS,EAAGnP,EAAE2sG,UAAUxmH,EAAE,eAAeA,EAAE8qG,QAAQ3qF,MAAMjP,EAAElR,EAAE8qG,QAAQl/F,MAAMmF,EAAEnF,MAAM5L,EAAE8jF,UAAU/yE,EAAEwqG,MAAK,EAAG1hG,EAAEq6C,QAAQ9zD,EAAEJ,IAAG,EAAG6Z,EAAEmuG,KAAKj3G,EAAE,kBAAkB,CAACmK,IAAIA,IAAIpX,EAAEigH,YAAW,EAAGlqG,EAAEmuG,KAAKj3G,EAAE,gBAAgB,CAACmK,IAAIA,IAAIlb,KAAI,EAAG6Z,EAAEmuG,KAAKj3G,EAAE,iBAAiB,CAACmK,IAAIA,IAAIvJ,GAAG,CAAC,IAAIlK,EAAEzH,EAAEI,EAAE,SAAQsqD,UAAU,IAAI35C,EAAEG,EAAEgxG,gBAAgB,GAAGliH,EAAE8D,EAAEigH,SAAStvC,MAAK3wE,GAAGA,EAAEypH,gBAAgBx8G,EAAE0jE,MAAKvjE,GAAGpN,EAAEypH,gBAAgBr8G,MAAIkJ,KAAK+yG,MAAMntH,GAAG8D,EAAEkgH,WAAWryG,EAAEmyE,gBAAgBhgF,EAAEkgH,SAAShjH,KAAKoZ,KAAKsqG,IAAI1kH,EAAEA,EAAEutH,cAAcr8G,GAAG,IAAGH,EAAE8T,KAAKpd,EAAE,EAAEsJ,EAAEiY,QAAQpW,CAAC,EAAE,CAAC,qBAAqB,QAAQ,eAAe,QAAQ,kBAAkB,QAAQ,QAAQ,QAAQ,iBAAiB,QAAQ,aAAa,QAAQ,SAAS,QAAQ,WAAW,QAAQ,YAAY,QAAQ,eAAe,QAAQ,YAAY,QAAQ,WAAW,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAAS9O,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG,IAAIY,EAAE7N,EAAE,SAAS1D,EAAE0D,EAAE,WAAW2D,EAAE3D,EAAE,oBAAoBkN,EAAEhR,EAAEy5G,eAAehyG,GAAGF,EAAEzD,EAAE,aAAaiN,EAAEiY,QAAQ,MAAM9oB,WAAAA,CAAY4D,GAAGsW,KAAK2B,GAAG,EAAE3B,KAAKsqG,IAAI5gH,EAAEsW,KAAKs2C,MAAM,IAAIkgB,IAAIx2D,KAAKqmE,IAAIrmE,KAAKqmE,IAAIz8E,KAAKoW,MAAMA,KAAK2+C,OAAO3+C,KAAK2+C,OAAO/0D,KAAKoW,MAAMA,KAAKmrB,OAAOnrB,KAAKmrB,OAAOvhC,KAAKoW,KAAK,CAAC,QAAI+tG,GAAO,OAAM,EAAGx2G,EAAE+4G,UAAUtwG,KAAKsqG,IAAIvK,SAAS4K,QAAQ,OAAO3qG,KAAKnY,YAAY,CAAC,QAAIkmH,CAAKrkH,GAAG,IAAIihH,QAAQ7zG,GAAGkJ,KAAKsqG,IAAIvK,SAASppG,EAAE,OAAOqJ,KAAKnY,YAAY6B,GAAE,EAAG6N,EAAE60G,UAAUt1G,EAAEH,IAAG,EAAGY,EAAEg4G,aAAaz4G,EAAEH,GAAGqJ,KAAKsqG,IAAI7nE,KAAKziC,KAAKnY,KAAK6B,EAAE,CAACwmH,MAAAA,GAASlwG,KAAK+tG,MAAM/tG,KAAK+tG,IAAI,CAAC1nC,GAAAA,CAAI38E,GAAG,IAAIoN,EAAE,mBAAmBpN,EAAEA,EAAEsW,KAAKsqG,KAAK5gH,EAAE,GAAGoN,EAAEqqG,KAAKrqG,EAAEqqG,MAAM,IAAG,EAAGvqG,EAAEgY,SAAS9X,EAAE3J,EAAEkmH,kBAAkBrzG,KAAK8yG,UAAU9yG,KAAKnY,MAAMiP,EAAE0yG,QAAQ,OAAO,IAAI7yG,EAAEG,EAAEjP,MAAM,GAAGmY,KAAKnY,OAAOmY,KAAK2B,KAAK/b,EAAEoa,KAAKs2C,MAAMx1C,IAAInK,IAAG,EAAG3Q,EAAEujH,cAAc3jH,EAAE,0BAA0B+Q,cAAcqJ,KAAKnY,SAASmY,KAAK2B,IAAI,EAAE,IAAItU,GAAE,EAAGkK,EAAE3L,eAAe,QAAO,EAAG2L,EAAE60G,UAAU/+G,EAAE,OAAO2S,KAAKnY,SAAQ,EAAG0P,EAAE60G,UAAU/+G,EAAE,OAAO2S,KAAKnY,QAAQ8O,KAAK,IAAI9I,EAAE3H,MAAMojB,KAAKtJ,KAAK8yG,QAAQ9pC,UAAU37E,EAAEqjG,QAAQ3qF,MAAMjP,EAAEiP,OAAO/F,KAAK2B,GAAG,IAAInU,EAAEK,EAAEwsE,MAAK3wE,GAAGwO,OAAOxO,EAAEgnG,QAAQ3qF,QAAQ7N,OAAO7K,EAAEqjG,QAAQ3qF,SAAQvY,EAAEA,EAAE8lH,sBAAsB,cAAcjmH,IAAG,EAAGkK,EAAEuiD,QAAQ95C,KAAK8yG,QAAQzlH,GAAGyJ,EAAEqqG,OAAM,EAAG5pG,EAAEuiD,QAAQzsD,EAAEyJ,EAAEqqG,MAAMrqG,EAAEg2E,QAAO,EAAGv1E,EAAE4oD,WAAW9yD,EAAEyJ,EAAEg2E,OAAOh2E,EAAE4yG,UAAS,EAAGnyG,EAAEmyG,SAASr8G,EAAEyJ,EAAE4yG,SAAS,IAAIhyG,EAAE,GAAG,GAAGZ,EAAE+xG,MAAM,CAAC,IAAIn/G,EAAEsW,KAAKsqG,IAAItK,OAAO6C,MAAMx1G,EAAE,SAAQ3D,IAAIA,EAAEutF,iBAAiBngF,EAAE+xG,MAAMjiH,KAAKoZ,KAAKsqG,IAAItqG,KAAKtW,EAAE,IAAGgO,EAAE+S,KAAK/gB,EAAE,CAAC,OAAOoN,EAAE6yG,UAAU,CAAC,OAAO,SAAS58F,SAASjW,EAAElI,WAAWoR,KAAK2pG,SAAS7yG,EAAEzJ,EAAEqK,GAAGsI,KAAKrJ,GAAGtJ,EAAE2S,KAAKs2C,MAAM/yC,IAAI5M,EAAE,CAAC48G,KAAKlmH,EAAE2yG,OAAOtoG,EAAE8nG,OAAO1oG,IAAIA,EAAE2yG,SAAS3yG,EAAE2yG,QAAQ7iH,KAAKoZ,KAAKsqG,IAAIj9G,GAAGA,CAAC,CAACsxD,MAAAA,CAAOj1D,GAAG,IAAIoN,EAAEkJ,KAAKs2C,MAAMx1C,IAAIpX,IAAG,EAAG1D,EAAEujH,aAAazyG,EAAE,eAAepN,gBAAgBsW,KAAKnY,SAASiP,EAAE0oG,OAAOgU,eAAe18G,EAAE0oG,OAAOgU,cAAc5sH,KAAKoZ,KAAKsqG,IAAIxzG,EAAEy8G,MAAM,IAAI,IAAI7pH,EAAE,EAAEA,EAAEoN,EAAEkpG,OAAOj6G,OAAO2D,IAAIsW,KAAKsqG,IAAItK,OAAOrhD,OAAO7nD,EAAEkpG,OAAOt2G,IAAIsW,KAAKs2C,MAAM49B,OAAOxqF,UAAUsW,KAAKtW,IAAG,EAAG6N,EAAEonD,QAAQ7nD,EAAEy8G,KAAK,CAACpoF,MAAAA,CAAOzhC,GAAG,IAAIoN,EAAEkJ,KAAKs2C,MAAMx1C,IAAIpX,EAAE7B,MAAM,OAAOiP,IAAIpN,EAAElD,OAAO4/E,OAAOtvE,EAAE0oG,OAAO91G,GAAGsW,KAAK2+C,OAAOj1D,EAAE7B,OAAOmY,KAAKqmE,IAAI38E,EAAE,EAAE,EAAE,CAAC,QAAQ,QAAQ,UAAU,QAAQ,mBAAmB,QAAQ,YAAY,QAAQ,iDAAiD,UAAU+pH,MAAM,CAAC,SAAS/pH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,OAAOoN,IAAC,IAAOpN,EAAEggH,QAAQ5yG,EAAEqpG,KAAKr/F,IAAI,cAAc2oG,QAAQ//G,IAAI,IAAIm5G,MAAMlsG,EAAEupG,MAAMt6G,EAAEu6G,KAAKn6G,GAAG8Q,EAAEzJ,GAAE,EAAGkK,EAAEuiD,QAAQpwD,EAAE9D,EAAE8tH,cAAc98G,GAAE,EAAGW,EAAEuiD,QAAQpwD,EAAE9D,EAAE+tH,gBAAe,EAAGp8G,EAAEy3G,UAAUp4G,EAAE,UAAU,QAAQD,EAAEjN,EAAE,SAAQ,KAAKoN,EAAEorG,YAAYprG,EAAEorG,UAAU,IAAGprG,EAAEglB,GAAG,cAAahlB,IAAIA,IAAG,EAAGS,EAAEmyG,SAAShgH,EAAE1D,EAAE8a,IAAI,qBAAoB,EAAGvJ,EAAEy3G,UAAU3hH,EAAE,UAAU,SAAQ,EAAGkK,EAAEy3G,UAAUp4G,EAAE,UAAU,kBAAiB,EAAGW,EAAEmyG,SAAShgH,EAAE1D,EAAE8a,IAAI,gBAAe,EAAGvJ,EAAEy3G,UAAU3hH,EAAE,UAAU,gBAAe,EAAGkK,EAAEy3G,UAAUp4G,EAAE,UAAU,QAAQ,GAAE,GAAG,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAASlN,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,OAAOoN,IAAC,IAAOpN,EAAEggH,QAAQ5yG,EAAEqpG,KAAKr/F,IAAI,kBAAkB2oG,QAAQ//G,IAAI,IAAIm5G,MAAMlsG,EAAEupG,MAAMt6G,EAAEu6G,KAAKn6G,GAAG8Q,EAAEzJ,GAAE,EAAGkK,EAAEuiD,QAAQpwD,EAAE9D,EAAEguH,iBAAiBh9G,GAAE,EAAGW,EAAEuiD,QAAQpwD,EAAE9D,EAAEiuH,mBAAkB,EAAGt8G,EAAEy3G,UAAUp4G,EAAE,UAAU,QAAQD,EAAEjN,EAAE,SAAQ,KAAKoN,EAAEqrG,eAAerrG,EAAEqrG,aAAa,IAAGrrG,EAAEglB,GAAG,iBAAgBhlB,IAAIA,IAAG,EAAGS,EAAEmyG,SAAShgH,EAAE1D,EAAE8a,IAAI,yBAAwB,EAAGvJ,EAAEy3G,UAAU3hH,EAAE,UAAU,SAAQ,EAAGkK,EAAEy3G,UAAUp4G,EAAE,UAAU,kBAAiB,EAAGW,EAAEmyG,SAAShgH,EAAE1D,EAAE8a,IAAI,oBAAmB,EAAGvJ,EAAEy3G,UAAU3hH,EAAE,UAAU,gBAAe,EAAGkK,EAAEy3G,UAAUp4G,EAAE,UAAU,QAAQ,GAAE,GAAG,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAUk9G,MAAM,CAAC,SAASpqH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,OAAOoN,IAAC,IAAOpN,EAAEggH,QAAQ5yG,EAAEqpG,KAAKr/F,IAAI,YAAY2oG,QAAQ//G,IAAI,IAAIm5G,MAAMlsG,EAAEupG,MAAMt6G,EAAEu6G,KAAKn6G,GAAG8Q,GAAE,EAAGS,EAAEuiD,QAAQpwD,EAAE9D,EAAEm8G,KAAKprG,EAAEjN,EAAE,SAAQ,KAAKoN,EAAEirG,KAAKjrG,EAAEirG,GAAG,IAAGjrG,EAAEglB,GAAG,OAAMhlB,KAAI,EAAGS,EAAEmyG,SAAShgH,EAAE1D,EAAE8a,IAAIhK,EAAE,gBAAgB,YAAY,GAAE,GAAG,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAUi9G,MAAM,CAAC,SAASrqH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,OAAOoN,IAAC,IAAOpN,EAAE+/G,QAAQ//G,IAAI,IAAIm5G,MAAMlsG,EAAEupG,MAAMt6G,EAAEu6G,KAAKn6G,GAAG8Q,EAAEzJ,GAAE,EAAGkK,EAAEuiD,QAAQpwD,EAAE9D,EAAEsoH,MAAMt3G,GAAE,EAAGW,EAAEuiD,QAAQpwD,EAAE9D,EAAEuoH,OAAO,SAAShhH,KAAI,EAAGoK,EAAEy3G,UAAU3hH,EAAE,UAAU,SAAQ,EAAGkK,EAAEy3G,UAAUp4G,EAAE,UAAU,OAAO,CAAC,SAAS/I,KAAI,EAAG0J,EAAEy3G,UAAU3hH,EAAE,UAAU,SAAQ,EAAGkK,EAAEy3G,UAAUp4G,EAAE,UAAU,OAAO,EAAC,EAAGW,EAAEmyG,SAASr8G,EAAErH,EAAE8a,IAAI,UAAS,EAAGvJ,EAAEmyG,SAAS9yG,EAAE5Q,EAAE8a,IAAI,UAAUnK,EAAEtJ,EAAE,SAAQ,KAAKyJ,EAAEo3G,MAAM,IAAGv3G,EAAEC,EAAE,SAAQ,KAAKE,EAAEq3G,OAAO,IAAGr3G,EAAEw3G,QAAQzgH,IAAIV,IAAI2J,EAAEglB,GAAG,iBAAgB,KAAKjuB,GAAG,IAAGiJ,EAAEglB,GAAG,eAAc,KAAK3uB,GAAG,GAAE,GAAG,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAU6mH,MAAM,CAAC,SAAStqH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,mBAAkB,IAAI3Q,IAAGJ,EAAEohH,OAAOrwG,EAAE,kBAAiB,IAAItJ,IAAGzH,EAAEohH,OAAOrwG,EAAE,WAAU,IAAIC,IAAG,IAAIW,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,EAAEoN,GAAG,IAAIm0G,UAAUt0G,GAAGjN,EAAEq2G,UAAUjxG,KAAKlJ,IAAG,EAAG2R,EAAE45G,SAASx6G,GAAG3Q,EAAEuR,EAAEkwG,SAAS3wG,EAAEqlF,QAAQ,GAAG7D,QAAQxhF,EAAEwhF,QAAQjrF,GAAE,EAAGkK,EAAEm3G,OAAO1oH,EAAEJ,EAAE,EAAE+Q,EAAEkxG,aAAajxG,EAAEvJ,EAAEsJ,EAAEkxG,YAAYn+G,EAAEgY,SAAoE,MAAM,CAACuyG,OAAOr9G,EAAEu8B,MAAzE,EAAG57B,EAAEi3G,cAAc53G,GAA6D7H,MAAM1B,EAAE6mH,YAAhE,EAAG38G,EAAEm3G,OAAOrhH,EAAEsJ,EAAEkxG,YAAY,EAAE,GAA+C,CAAC,SAASx6G,EAAE3D,EAAEoN,GAAG,GAAGpN,EAAEm2G,SAAS,CAAC,IAAIlpG,EAAEG,EAAEqlF,QAAQ,GAAG5D,QAAQ7uF,EAAEsF,OAAOpJ,EAAE+Q,EAAEjN,EAAEgY,SAAShY,EAAE+4C,KAAK,SAAS,SAAS9rC,EAAEG,GAAGpN,EAAE+kH,KAAK7oH,CAAC,KAAK,CAAC,IAAIquH,OAAOt9G,EAAEu9G,WAAWtuH,GAAGI,EAAE0D,EAAEoN,GAAGpN,EAAE+4C,KAAK,SAAS,SAAS78C,EAAEkR,GAAGpN,EAAE+kH,KAAK93G,CAAC,CAAC,CAAC,SAASC,EAAElN,GAAG,OAAOoN,IAAI,IAAIopG,MAAMvpG,EAAE6oG,OAAO55G,EAAEi9G,MAAMjsG,GAAGE,EAAE,MAAM,IAAIpN,EAAEy3G,KAAK,6RAA6RsI,QAAQ//G,IAAI,IAAIyD,EAAE,KAAKU,GAAE,EAAGL,GAAE,EAAG+J,EAAEI,OAAO,sBAAsBjO,GAAGgO,GAAE,EAAGH,EAAEI,OAAO,uBAAuBjO,GAAGqE,GAAE,EAAGwJ,EAAEI,OAAO,uBAAuBjO,GAAGqD,GAAE,EAAGwK,EAAEI,OAAO,0BAA0BjO,GAAGsE,GAAE,EAAGuJ,EAAEI,OAAO,0BAA0BjO,GAAG0D,GAAE,EAAGmK,EAAEI,OAAO,oBAAoBjO,GAAG,SAASoE,EAAE6I,EAAE/Q,GAAG,IAAImJ,MAAM1B,EAAE8lC,KAAKv8B,GAAGhR,GAAGI,EAAE8Q,EAAEH,GAAGvJ,EAAEgmH,UAAUx8G,EAAE,IAAIzJ,EAAEC,EAAEy6G,YAAYx6G,GAAGF,EAAE,GAAE,EAAGoK,EAAEy3G,UAAU5hH,EAAE,OAAO,GAAGC,EAAE3D,EAAEm+G,YAAY16G,EAAE,GAAE,EAAGoK,EAAEy3G,UAAU5hH,EAAE,OAAU1D,EAAEm+G,YAAY16G,EAAjB,OAAwB,EAAGoK,EAAEy3G,UAAU5hH,EAAE,OAAUC,EAAEF,EAAE,EAAP,KAAa,CAACwJ,EAAEw9G,WAAU,EAAG58G,EAAEuiD,QAAQ9rD,EAAE2I,EAAEw9G,YAAW,EAAG58G,EAAEy3G,UAAUhhH,EAAE,kBAAkB,oBAAoB8I,EAAEglB,GAAG,UAAS,SAASnlB,EAAE/Q,EAAEI,GAAG,IAAIqH,EAAE,WAAWsJ,GAAG3Q,GAAGuR,EAAEkwG,SAAS,WAAW9wG,IAAG,EAAGY,EAAEy3G,UAAUt3G,EAAE,QAAW,IAAI9R,EAAP,KAAa,UAAU+Q,IAAG,EAAGY,EAAEy3G,UAAUxhH,EAAE,QAAW,IAAI5H,EAAP,KAAa,WAAW+Q,KAAI,EAAGY,EAAEy3G,UAAUjhH,EAAE,QAAW,IAAInI,EAAP,MAAa,EAAG2R,EAAEy3G,UAAUhhH,EAAE,OAAU,IAAIpI,EAAP,MAAcyH,KAAI,EAAGkK,EAAEy3G,UAAU5hH,EAAE,UAAU,QAAQU,EAAE9H,EAAE,CAAC+I,MAAMrF,EAAEm+G,YAAYjiH,EAAEutC,MAAK,EAAG57B,EAAEi3G,cAAc5oH,EAAEkR,EAAE4K,YAAY8nB,aAAar8B,GAAGA,EAAEiF,YAAW,MAAK,EAAGmF,EAAEy3G,UAAU5hH,EAAE,UAAU,OAAO,GAAE,KAAK,IAAG0J,EAAEglB,GAAG,wBAAuB,WAAW/uB,EAAEqmH,UAAU,GAAG,IAAI,IAAI1pH,EAAE,EAAEA,EAAE9D,EAAEo9G,UAAUj9G,OAAO2D,IAAI,CAAC,IAAIiN,EAAE/Q,EAAEo9G,UAAUt5G,GAAG1D,GAAE,EAAGuR,EAAEm3G,OAAO/3G,EAAEw8B,KAAK,EAAEr8B,EAAE4K,UAAU5K,EAAE4K,SAAS,IAAIrU,EAAE,oBAAoBsJ,EAAE8W,oBAAoB9W,EAAEw8B,sBAAsBntC,eAAc,EAAGuR,EAAEuiD,QAAQ/sD,EAAEM,EAAE,CAAC,IAAGyJ,EAAEglB,GAAG,kBAAiB,KAAKhlB,EAAE2rC,KAAK,SAAS,SAAS3rC,EAAEkL,OAAO,IAAGlL,EAAEhR,YAAY8/G,QAAQ9uG,EAAEglB,GAAG,OAAM,KAAKhlB,EAAE2rC,KAAK,SAAS,SAAS3rC,EAAEs9G,OAAO,IAAGt9G,EAAEglB,GAAG,oBAAmB,KAAKhlB,EAAE2rC,KAAK,SAAS,SAAS3rC,EAAEs9G,OAAO,IAAGt9G,EAAEglB,GAAG,eAAc,KAAKhlB,EAAE2rC,KAAK,SAAS,SAAS,EAAE,IAAG3rC,EAAE2rC,KAAK,SAAS,SAAS3rC,EAAEkL,QAAQ,GAAGzK,EAAEkwG,WAAW7wG,EAAElN,EAAE,SAAQA,IAAIA,EAAEskF,SAAShgF,GAAGX,EAAEyJ,EAAEpN,EAAE,IAAGkN,EAAElN,EAAE,aAAYiN,IAAI,IAAIu9G,WAAWtuH,GAAGI,EAAE8Q,EAAEH,GAAGG,EAAE2rC,KAAK,SAAS,QAAQ78C,EAAE+Q,IAAG,EAAGY,EAAEy3G,UAAU5hH,EAAE,UAAU,SAAQ,EAAGmK,EAAEs7G,kBAAkBl8G,EAAE5J,GAAG,SAAS4J,GAAG,IAAI5H,MAAMnJ,GAAGI,EAAE8Q,EAAEH,IAAI8W,KAAKpgB,GAAGsJ,EAAEq3E,OAAO0iB,QAAQtjG,EAAEgmH,UAAU/lH,EAAE,IAAIuJ,EAAExJ,EAAEy6G,YAAYjiH,GAAGgR,EAAE,GAAE,EAAGW,EAAEy3G,UAAU5hH,EAAE,OAAO,GAAGxH,EAAE8D,EAAEm+G,YAAYjxG,EAAE,GAAE,EAAGW,EAAEy3G,UAAU5hH,EAAE,OAAU1D,EAAEm+G,YAAYjxG,EAAjB,OAAwB,EAAGW,EAAEy3G,UAAU5hH,EAAE,OAAUxH,EAAEgR,EAAE,EAAP,KAAa,CAAvO,CAAyOD,GAAG7I,EAAE6I,EAAE,IAAGC,EAAElN,EAAE,cAAaA,KAAI,EAAG6N,EAAEy3G,UAAU5hH,EAAE,UAAU,QAAQ0J,EAAE2rC,KAAK,SAAS,QAAQ,EAAE/4C,EAAE,IAAGkN,EAAElN,EAAE,aAAYA,IAAImE,EAAE,IAAInE,EAAEsvF,MAAM,IAAGliF,EAAEglB,GAAG,sBAAqBpyB,IAAI,GAAGmE,EAAE,CAAC,IAAIomH,OAAOt9G,EAAEu9G,WAAWtuH,GAAGI,EAAE8Q,EAAEpN,GAAGoN,EAAE2rC,KAAK,SAAS,SAAS78C,EAAE8D,GAAGoN,EAAE23G,KAAK93G,CAAC,KAAIG,EAAEglB,GAAG,oBAAmB,KAAKjuB,IAAIA,GAAE,EAAG,IAAG,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAUwmH,MAAM,CAAC,SAAS3qH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,OAAOoN,IAAC,IAAOpN,EAAEojF,MAAMv1E,EAAEkwG,SAAS,CAAC6M,SAAS,OAAOC,QAAQ,SAAS,CAACC,OAAO,OAAOD,QAAQ,UAAU9K,QAAQ//G,IAAI,SAASiN,IAAI,IAAIA,EAAE,IAAG,EAAGY,EAAEi3G,cAAc13G,EAAE4rB,mBAAkB,EAAGnrB,EAAEi3G,cAAc13G,EAAE4K,YAAY/K,IAAIjN,EAAE0pH,YAAY1pH,EAAE0pH,UAAUz8G,EAAE,CAACA,IAAI,IAAI/Q,EAAE,CAAC,uBAAuB,mBAAmB,kBAAkB,IAAI,IAAI8D,EAAE,EAAEA,EAAE9D,EAAEG,OAAO2D,IAAIoN,EAAEglB,GAAGl2B,EAAE8D,GAAGiN,EAAE,GAAG,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAU89G,MAAM,CAAC,SAAS/qH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,OAAOoN,IAAC,IAAOpN,EAAE+/G,QAAQ//G,IAAI,IAAIm5G,MAAMlsG,EAAEupG,MAAMt6G,GAAGkR,EAAE9Q,GAAE,EAAGuR,EAAEuiD,QAAQpwD,EAAE9D,EAAE07G,QAAQj0G,GAAE,EAAGkK,EAAEuiD,QAAQpwD,EAAE9D,EAAE8uH,aAAa99G,GAAE,EAAGW,EAAEuiD,QAAQpwD,EAAE,wCAAwCyD,GAAE,EAAGoK,EAAEuiD,QAAQljD,EAAE,wCAAwC/I,GAAE,EAAG0J,EAAEuiD,QAAQ3sD,EAAE,sCAAsCK,GAAE,EAAG+J,EAAEuiD,QAAQ3sD,EAAE,yCAAyCuK,GAAE,EAAGH,EAAEuiD,QAAQtsD,EAAE,yCAAyCO,GAAE,EAAGwJ,EAAEuiD,QAAQpiD,EAAE,yCAAyC3K,GAAE,EAAGwK,EAAEuiD,QAAQtsD,EAAE,4CAA4C,SAASQ,EAAEtE,GAAG,IAAImF,IAAIiI,EAAE9H,OAAO2H,IAAG,EAAGY,EAAE45G,SAAS3jH,GAAG,OAAO,GAAG9D,EAAE6uF,QAAQzhF,GAAGH,CAAC,CAAC,SAASvJ,IAAI,GAAG0J,EAAE0qG,OAAO,IAAI1qG,EAAEwqG,QAAO,EAAG/pG,EAAEy3G,UAAUhpH,EAAE,UAAU,SAAQ,EAAGuR,EAAEy3G,UAAU3hH,EAAE,UAAU,SAAQ,EAAGkK,EAAEy3G,UAAUjiH,EAAE,MAAM,SAAQ,EAAGwK,EAAEy3G,UAAUjhH,EAAE,MAAM,QAAQF,EAAEulH,UAAU,MAAM,CAAC,IAAI1pH,EAAE,IAAIoN,EAAEwqG,QAAO,EAAG/pG,EAAEy3G,UAAUhpH,EAAE,UAAU,SAAQ,EAAGuR,EAAEy3G,UAAU3hH,EAAE,UAAU,SAAQ,EAAGkK,EAAEy3G,UAAUjiH,EAAE,MAAS,IAAIrD,EAAP,MAAa,EAAG6N,EAAEy3G,UAAUjhH,EAAE,MAAS,IAAIrE,EAAP,KAAamE,EAAEulH,UAAU96G,KAAK2Q,MAAMvf,EAAE,CAAC,CAAC,GAAG0D,IAAI0J,EAAEglB,GAAG,qBAAqB1uB,GAAGuJ,EAAE3Q,EAAE,SAAQ,KAAK8Q,EAAE0qG,OAAM,CAAE,IAAG7qG,EAAEtJ,EAAE,SAAQ,KAAKyJ,EAAE0qG,OAAM,CAAE,IAAGjqG,EAAEkwG,UAAS,EAAGlwG,EAAEy3G,UAAUp4G,EAAE,UAAU,YAAY,CAAC,IAAIlN,GAAE,EAAGiN,EAAEnJ,EAAE,aAAYmJ,IAAIjN,EAAE,IAAIiN,EAAEqiF,OAAOliF,EAAEwqG,OAAOtzG,EAAE2I,EAAE,IAAGG,EAAEglB,GAAG,sBAAqBnlB,IAAIjN,IAAIoN,EAAE0qG,OAAM,EAAG1qG,EAAEwqG,OAAOtzG,EAAE2I,GAAG,IAAGG,EAAEglB,GAAG,oBAAmB,KAAKpyB,IAAIA,GAAE,EAAG,GAAE,IAAI,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAASA,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,OAAOoN,IAAC,IAAOpN,EAAEggH,QAAQ5yG,EAAEqpG,KAAKr/F,IAAI,gBAAgB2oG,QAAQ//G,IAAI,IAAIm5G,MAAMlsG,EAAEupG,MAAMt6G,EAAEu6G,KAAKn6G,GAAG8Q,GAAE,EAAGS,EAAEuiD,QAAQpwD,EAAE9D,EAAEg7G,SAASjqG,EAAEjN,EAAE,SAAQ,KAAKoN,EAAE8pG,QAAQsP,SAASp5G,EAAE8pG,QAAQ+T,QAAQ,IAAG79G,EAAEglB,GAAG,WAAUhlB,KAAI,EAAGS,EAAEmyG,SAAShgH,EAAE1D,EAAE8a,IAAIhK,EAAE,eAAe,gBAAgB,GAAE,GAAG,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAASpN,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,OAAOoN,IAAC,IAAOpN,EAAEggH,QAAQ5yG,EAAEqpG,KAAKr/F,IAAI,cAAc2oG,QAAQ//G,IAAI,IAAIm5G,MAAMlsG,EAAEupG,MAAMt6G,GAAGkR,GAAE,EAAGS,EAAEuiD,QAAQpwD,EAAE9D,EAAEk8G,YAAYnrG,EAAEjN,EAAE,SAAQ,KAAKoN,EAAEgrG,YAAY,GAAE,GAAG,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAASp4G,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,OAAOoN,IAAC,IAAOpN,EAAEggH,QAAQ5yG,EAAEqpG,KAAKr/F,IAAI,WAAW2oG,QAAQ//G,IAAI,IAAIm5G,MAAMlsG,EAAEupG,MAAMt6G,GAAGkR,GAAE,EAAGS,EAAEuiD,QAAQpwD,EAAE9D,EAAEg9G,SAASjsG,EAAEjN,EAAE,SAAQ,IAAIoN,EAAE8rG,WAAU,GAAG,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAASl5G,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG,IAAIY,EAAE7N,EAAE,YAAY1D,EAAE0D,EAAE,sBAAsB2D,EAAEzH,EAAEy5G,eAAer5G,GAAG4Q,EAAElN,EAAE,kBAAkByD,EAAEvH,EAAEy5G,eAAezoG,GAAG/I,EAAEnE,EAAE,iBAAiB8D,EAAE5H,EAAEy5G,eAAexxG,GAAG6J,EAAEhO,EAAE,UAAUqE,EAAEnI,EAAEy5G,eAAe3nG,GAAG3K,EAAErD,EAAE,UAAUsE,EAAEpI,EAAEy5G,eAAetyG,GAAGK,EAAE1D,EAAE,aAAaoE,EAAElI,EAAEy5G,eAAejyG,GAAG2hB,EAAErlB,EAAE,WAAW8K,EAAE5O,EAAEy5G,eAAetwF,GAAG,MAAMlpB,UAAUwH,EAAEuhB,QAAQ9oB,WAAAA,CAAY4D,GAAG41G,MAAM51G,GAAGsW,KAAKnY,KAAK,cAAcmY,KAAK8yG,QAAQppH,EAAEq2G,SAASiM,aAAaz0G,EAAEkwG,UAAUznG,KAAKgqC,MAAM,CAACA,IAAAA,GAAO,IAAIw1D,OAAO91G,EAAEm5G,MAAM/rG,EAAEipG,UAAU4K,QAAQh0G,EAAEq1G,aAAapmH,IAAIoa,KAAKsqG,IAAI5gH,EAAE65B,cAAcvjB,KAAKqmE,KAAI,EAAGl5E,EAAEyhB,SAAS,CAAC/mB,KAAK,eAAeke,MAAM,MAAMrc,EAAEugF,aAAajqE,KAAKqmE,KAAI,EAAG74E,EAAEohB,SAAS,CAAC/mB,KAAK,cAAcke,MAAM,MAAMrc,EAAEm4G,MAAM7hG,KAAKqmE,KAAI,EAAGt4E,EAAE6gB,SAAS,CAAC/mB,KAAK,OAAOke,MAAM,MAAM/F,KAAKqmE,KAAI,EAAGr4E,EAAE4gB,SAAS,CAAC/mB,KAAK,OAAOke,MAAM,MAAM/F,KAAKqmE,KAAI,EAAGv4E,EAAE8gB,SAAS,CAAC/mB,KAAK,UAAUke,MAAM,MAAM/F,KAAKqmE,KAAI,EAAG7xE,EAAEoa,SAAS,CAAC/mB,KAAK,QAAQke,MAAM,MAAM,IAAI,IAAIjP,EAAE,EAAEA,EAAEpN,EAAE82G,YAAYz6G,OAAO+Q,IAAIkJ,KAAKqmE,IAAI38E,EAAE82G,YAAY1pG,IAAIA,EAAEH,EAAE,eAAcjN,IAAI,IAAIsW,KAAKsqG,IAAIxkH,YAAYg+G,YAAY,OAAOp6G,EAAEutF,iBAAiBj3E,KAAK+tG,MAAK,EAAG,IAAIj3G,EAAEpN,EAAE4uF,QAAQtyF,EAAE0D,EAAE6uF,SAASvpF,OAAO3B,EAAE0B,MAAM6H,EAAE9H,KAAK3B,EAAE0B,IAAIhB,IAAG,EAAG0J,EAAE45G,SAASx6G,IAAI3H,OAAOxB,EAAEuB,MAAM2I,IAAG,EAAGH,EAAE45G,SAASvrH,GAAGmI,EAAE+I,EAAE3J,EAAEJ,EAAE/G,EAAE6H,EAAEiJ,EAAEY,EAAEvK,EAAEyJ,IAAI7I,EAAE6I,EAAEc,GAAG1R,EAAEwH,EAAEK,EAAER,IAAIN,EAAEM,EAAEG,IAAG,EAAG+J,EAAE4oD,WAAWv6D,EAAE,CAACiJ,IAAI,GAAG9B,MAAM+B,KAAK,GAAGf,OAAO,IAAG+I,EAAEH,EAAE,SAAQjN,KAAI,EAAG6N,EAAEs7G,kBAAkBnpH,EAAE9D,KAAKoa,KAAK+tG,MAAK,EAAG,IAAG/tG,KAAKsqG,IAAIxuF,GAAG,QAAO,KAAK9b,KAAK+tG,MAAK,CAAE,GAAE,EAAEp3G,EAAEiY,QAAQ/oB,CAAC,EAAE,CAAC,WAAW,QAAQ,qBAAqB,QAAQ,iBAAiB,QAAQ,gBAAgB,QAAQ,SAAS,QAAQ,SAAS,QAAQ,YAAY,QAAQ,UAAU,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAAS6D,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,OAAOoN,IAAI,IAAIqpG,KAAKxpG,EAAE7Q,aAAay/G,cAAc3/G,IAAIkR,EAAE9Q,EAAEJ,EAAE2pB,KAAI7lB,GAAG,qBAAqBA,MAAM,IAAIA,EAAEiN,EAAEmK,IAAI,UAAUpX,EAAEogC,QAAQ,cAAa7xB,KAAK,IAAI,MAAM,IAAIvO,EAAEy3G,KAAK,GAAGxqG,EAAEmK,IAAI,kBAAkB9a,IAAI6iH,MAAMA,CAACn/G,EAAEiN,KAAK,IAAInF,MAAM5L,GAAG+Q,EAAEq3E,OAAO0iB,QAAQ9qG,IAAIkR,EAAEysB,aAAarrB,OAAOtS,GAAG8D,EAAEqkH,MAAK,EAAG,EAAEtE,QAAQ//G,IAAI,IAAIiN,GAAE,EAAGY,EAAEI,OAAO,mBAAmBjO,GAAGiN,IAAG,EAAGY,EAAE27G,cAAcv8G,EAAE,eAAeG,EAAEglB,GAAG,oBAAmB,KAAK,IAAInlB,GAAE,EAAGY,EAAEq9G,UAAU,OAAOlrH,GAAG2wE,MAAK3wE,GAAGwO,OAAOxO,EAAEgnG,QAAQl/F,SAASsF,EAAEysB,eAAc5sB,IAAG,EAAGY,EAAE27G,cAAcv8G,EAAE,cAAc,GAAE,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAUk+G,MAAM,CAAC,SAASnrH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,OAAOoN,IAAI,IAAIqpG,KAAKxpG,EAAE7Q,aAAa0/G,aAAa5/G,IAAIkR,EAAE9Q,EAAEJ,EAAE2pB,KAAI7lB,GAAG,qBAAqBA,MAAM,YAAYA,EAAEiN,EAAEmK,IAAI,WAAWpX,aAAYuO,KAAK,IAAI,MAAM,IAAIvO,EAAEy3G,KAAK,GAAGxqG,EAAEmK,IAAI,oBAAoB9a,IAAI6iH,MAAMA,CAACn/G,EAAEiN,KAAK,IAAInF,MAAM5L,GAAG+Q,EAAEq3E,OAAO0iB,QAAQ9qG,IAAIkR,EAAEmzE,YAAYrkF,EAAE8D,EAAEqkH,MAAK,EAAG,EAAEtE,QAAQ//G,IAAI,IAAIiN,GAAE,EAAGY,EAAEI,OAAO,yBAAyBjO,GAAGiN,IAAG,EAAGY,EAAE27G,cAAcv8G,EAAE,eAAeG,EAAEglB,GAAG,eAAchlB,IAAI,IAAIH,GAAE,EAAGY,EAAEq9G,UAAU,OAAOlrH,GAAG2wE,MAAK3wE,GAAGA,EAAEgnG,QAAQl/F,QAAQsF,IAAGH,IAAG,EAAGY,EAAE27G,cAAcv8G,EAAE,cAAc,GAAE,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAUm+G,MAAM,CAAC,SAASprH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,OAAOoN,IAAI,IAAIqpG,KAAKxpG,EAAE7Q,aAAa2/G,KAAK7/G,IAAIkR,EAAE9Q,EAAEJ,EAAE2pB,KAAI7lB,GAAG,qBAAqBA,MAAMiN,EAAEmK,KAAI,EAAGvJ,EAAEi6G,YAAY9nH,eAAcuO,KAAK,IAAI,MAAM,IAAIvO,EAAEy3G,KAAK,GAAGxqG,EAAEmK,IAAI,kBAAkB9a,IAAI6iH,MAAMA,CAACn/G,EAAEiN,KAAK,IAAInF,MAAM5L,GAAG+Q,EAAEq3E,OAAO0iB,QAAQ9qG,IAAIkR,EAAE+qG,KAAKj8G,EAAE0N,cAAc5J,EAAEqkH,MAAK,EAAG,EAAEtE,QAAQ//G,IAAI,IAAIiN,GAAE,EAAGY,EAAEI,OAAO,wBAAwBjO,GAAGiN,IAAG,EAAGY,EAAE27G,cAAcv8G,EAAE,eAAeG,EAAEglB,GAAG,QAAOhlB,IAAI,IAAIH,GAAE,EAAGY,EAAEq9G,UAAU,OAAOlrH,GAAG2wE,MAAK3wE,GAAGA,EAAEgnG,QAAQl/F,QAAQsF,IAAGH,IAAG,EAAGY,EAAE27G,cAAcv8G,EAAE,cAAc,GAAE,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAUo+G,MAAM,CAAC,SAASrrH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD,SAAS6N,EAAE7N,GAAG,OAAOoN,IAAC,IAAOpN,EAAEy3G,KAAKrqG,EAAEqpG,KAAKr/F,IAAI,cAAc+nG,MAAMn/G,IAAIoN,EAAE0I,KAAKuuG,MAAK,EAAGrkH,EAAEqkH,MAAK,CAAE,GAAG,CAACnoH,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAIY,GAAE,EAAE,CAAC,iDAAiD,UAAUy9G,MAAM,CAAC,SAAStrH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD,SAAS6N,EAAE7N,GAAG,MAAM,IAAIA,EAAEy3G,KAAK,sEAAsE,CAACv7G,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAIY,GAAE,EAAE,CAAC,iDAAiD,UAAU09G,MAAM,CAAC,SAASvrH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD,SAAS6N,EAAE7N,GAAG,OAAOoN,IAAC,IAAOpN,EAAEy3G,KAAKrqG,EAAEqpG,KAAKr/F,IAAI,SAAS+nG,MAAMn/G,IAAIA,EAAEqkH,MAAK,CAAE,GAAG,CAACnoH,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAIY,GAAE,EAAE,CAAC,iDAAiD,UAAU,QAAQ,CAAC,SAAS7N,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG,IAAIY,EAAE7N,EAAE,WAAW1D,EAAE0D,EAAE,qBAAqB2D,EAAEzH,EAAEy5G,eAAer5G,GAAG,MAAM4Q,UAAUvJ,EAAEuhB,QAAQ9oB,WAAAA,CAAY4D,GAAG41G,MAAM51G,GAAGsW,KAAKnY,KAAK,OAAO0P,EAAEkwG,UAAUznG,KAAKgqC,MAAM,CAACA,IAAAA,GAAO,IAAI64D,MAAMn5G,EAAE5D,YAAYgR,EAAEipG,UAAU+L,WAAWn1G,EAAEo1G,WAAWnmH,EAAEg+G,OAAO59G,IAAIga,KAAKsqG,IAAI5gH,EAAE9D,EAAE,SAAQ,KAAKoa,KAAK+tG,MAAK,CAAE,IAAG,IAAI1gH,EAAE,KAAKuJ,GAAE,EAAGW,EAAEq9G,UAAU,eAAej+G,IAAI,GAAGqJ,KAAKsqG,IAAIxuF,GAAG,WAAU,IAAI0N,aAAan8B,KAAI,SAAS3D,IAAI,IAAI,IAAIA,EAAE,EAAEA,EAAEkN,EAAE7Q,OAAO2D,IAAI,CAAC,IAAIoN,EAAEF,EAAElN,GAAGiN,EAAE3Q,EAAE8Q,EAAE45F,QAAQzqF,OAAOrgB,EAAE,iBAAiB+Q,EAAEA,EAAEmzB,QAAQ,GAAGnzB,EAAEG,EAAEs8G,YAAYxtH,IAAIkR,EAAEs8G,UAAUxtH,EAAE,CAACyH,EAAE+E,WAAW1I,EAAEoN,EAAEmuG,eAAe,CAA9K,EAAiL,EAAEtuG,EAAEiY,QAAQhY,CAAC,EAAE,CAAC,UAAU,QAAQ,oBAAoB,QAAQ,iDAAiD,UAAUs+G,MAAM,CAAC,SAASxrH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG,IAAIY,EAAE7N,EAAE,WAAW1D,EAAE0D,EAAE,qBAAqB2D,EAAEzH,EAAEy5G,eAAer5G,GAAG4Q,EAAElN,EAAE,oBAAoByD,EAAEvH,EAAEy5G,eAAezoG,GAAG/I,EAAEnE,EAAE,YAAY8D,EAAE5H,EAAEy5G,eAAexxG,GAAG,MAAM6J,UAAUrK,EAAEuhB,QAAQ9oB,WAAAA,CAAY4D,GAAG41G,MAAM51G,GAAGsW,KAAKnY,KAAK,WAAWmY,KAAKw/F,OAAO,KAAKx/F,KAAKm1G,aAAa,IAAI,KAAKn1G,KAAKgqC,KAAKtgD,EAAE81G,OAAOiB,UAAU,IAAI3pG,GAAE,EAAGpN,EAAEoyB,GAAG,oBAAmB,KAAK,IAAI9b,KAAKlU,IAAI,OAAO,IAAIpC,EAAEsW,KAAKsqG,IAAIvK,SAAS6D,OAAOwR,2BAA2B,kBAAkB1rH,GAAGA,IAAIoN,IAAIA,EAAEpN,EAAEsW,KAAK2hB,YAAYj4B,EAAE,YAAY,WAAWsW,KAAKlU,KAAK,GAAE,CAAC,OAAIA,GAAM,OAAOkU,KAAKsqG,IAAIvK,SAAS6K,OAAOnuD,GAAG,CAAC,OAAI3wD,CAAIpC,GAAGsW,KAAK6pG,OAAOngH,EAAE,CAAC,aAAIm4C,GAAY,OAAO7hC,KAAKsqG,IAAIvK,SAAS6D,QAAQ/hF,aAAa,EAAE,CAAC,cAAIwzF,GAAa,OAAOr1G,KAAK6hC,UAAU37C,MAAMojB,KAAKtJ,KAAK6hC,UAAUwzE,YAAY,EAAE,CAAC,QAAI51F,GAAO,OAAOzf,KAAK6hC,UAAU37C,MAAMojB,KAAKtJ,KAAK6hC,UAAUpiB,MAAM,EAAE,CAACqtD,KAAAA,CAAMpjF,EAAEoN,GAAG,IAAIg0G,UAAUn0G,GAAGqJ,KAAKsqG,IAAIvK,SAAS,MAAM,iBAAiBr2G,GAAE,EAAG6N,EAAE4oD,WAAWxpD,EAAEjN,IAAG,EAAG6N,EAAEy3G,UAAUr4G,EAAEjN,EAAEoN,EAAE,CAACq0B,MAAAA,GAAS,IAAIq0E,QAAQiB,SAAS/2G,GAAGq2G,UAAU+K,UAAUh0G,IAAIkJ,KAAKsqG,IAAIxzG,EAAE4yE,UAAU,GAAG1pE,KAAKq1G,WAAWtvH,SAASia,KAAKsqG,IAAI7nE,KAAK,uBAAuBziC,KAAKq1G,YAAYv+G,EAAE4yE,UAAU1pE,KAAKq1G,WAAW9lG,KAAI,CAACzY,EAAEH,IAAIG,EAAE2W,KAAK1V,MAAM,SAASgJ,QAAOrX,GAAGA,EAAEqN,SAAQwY,KAAIzY,GAAG,8CAA8CH,MAAMjN,EAAE05G,QAAO,EAAG7rG,EAAE6rG,QAAQtsG,GAAGA,YAAWmB,KAAK,MAAKA,KAAK,IAAI+H,KAAKsqG,IAAI7nE,KAAK,sBAAsBziC,KAAKq1G,YAAY,CAAC,YAAMxL,CAAOngH,GAAO,IAALoN,EAAC9O,UAAAjC,OAAA,QAAAmN,IAAAlL,UAAA,GAAAA,UAAA,GAAC,CAAC,GAAOm4G,KAAKxpG,EAAEypG,OAAOx6G,EAAE45G,OAAOjoG,GAAGyI,KAAKsqG,IAAItkH,EAAE,IAAIuR,EAAEkpG,YAAY3pG,EAAEhL,IAAIpC,GAAG2D,QAAQ2S,KAAKgqC,KAAKhkD,GAAG,OAAO8Q,EAAEjP,OAAOjC,EAAEmoH,KAAK,GAAGp3G,EAAEmK,IAAI,uBAAuBhK,EAAEjP,QAAQwF,CAAC,CAACs0B,WAAAA,CAAYj4B,EAAEoN,GAAG,IAAIipG,SAASppG,EAAEksG,MAAMj9G,EAAE45G,OAAOx5G,GAAGga,KAAKsqG,KAAK1G,OAAOv2G,EAAEu9G,OAAOh0G,GAAGD,EAAExJ,GAAE,EAAGoK,EAAE3L,eAAe,SAASuB,EAAEyhB,SAAQ,EAAGzhB,EAAEgzB,KAAKz2B,EAAEyD,EAAEsvD,IAAI3lD,EAAE3J,EAAEizB,MAAMp6B,EAAEy6G,SAAS54G,MAAM,YAAYsF,EAAEkyB,MAAMG,KAAK,SAASryB,EAAEg7G,OAAO,KAAKnoG,KAAKsqG,IAAI7nE,KAAK,eAAeziC,KAAKyf,KAAKzf,KAAKw/F,OAAO,EAAEx/F,KAAKsqG,IAAItK,OAAOrhD,OAAO3+C,KAAKm1G,cAAcv+G,EAAEuxG,OAAO,MAAK,EAAG5wG,EAAEonD,QAAQ/nD,IAAG,EAAGW,EAAEuiD,QAAQzsD,EAAEF,GAAGwJ,EAAEi0G,OAAOz9G,EAAE6S,KAAKm1G,aAAavvH,EAAEoa,KAAK6hC,UAAU,aAAY,IAAI7hC,KAAKmrB,UAAS,CAAC,UAAM6e,CAAKtgD,GAAG,IAAI02G,OAAOtpG,EAAEipG,UAAU+K,UAAUn0G,IAAIqJ,KAAKsqG,IAAI,OAAOtqG,KAAK6hC,YAAW,EAAG10C,EAAEyhB,SAASllB,EAAE8D,EAAEohB,QAAQ6xF,UAAU/2G,EAAEoC,KAAMkU,KAAKw/F,OAAO91G,EAAEsW,KAAK8sE,MAAMpjF,EAAEojF,OAAO1P,MAAM1zE,EAAEoC,KAAK4gC,MAAKhjC,GAAGA,EAAE8zE,gBAAe9wC,MAAK51B,IAAI,IAAIH,EAAE,IAAIqW,YAAYtjB,EAAE25G,UAAUn2F,OAAOpW,GAAG,OAAOpN,EAAE/B,OAAM,EAAG4P,EAAEs2G,QAAQnkH,EAAEoC,MAAM,IAAI,MAAM,CAAC,IAAIgL,GAAE,EAAGS,EAAE+9G,UAAU3+G,GAAG/Q,EAAE8D,EAAE45G,UAAUxsG,GAAG,OAAM,EAAGS,EAAEg+G,WAAW3vH,EAAE,CAAC,IAAI,MAAM,CAAC,IAAIkR,GAAE,EAAGS,EAAEi+G,UAAU7+G,GAAG/Q,EAAE8D,EAAE45G,UAAUxsG,GAAG,OAAM,EAAGS,EAAEg+G,WAAW3vH,EAAE,CAAC,IAAI,MAAM,CAAC,IAAIkR,EAAEpN,EAAE45G,UAAU3sG,GAAG,OAAM,EAAGY,EAAEg+G,WAAWz+G,EAAE,CAAC,QAAQ,OAAOpN,EAAEoC,IAAG,IAAI4gC,MAAKhjC,IAAIiN,EAAE+yE,UAAU,GAAG1pE,KAAKlU,MAAMpC,IAAIooB,IAAI6iC,gBAAgB30C,KAAKlU,KAAKkU,KAAK2hB,YAAY,WAAWj4B,IAAIA,KAAIijC,OAAMjjC,IAAI,MAAMiN,EAAE+yE,UAAU,GAAG5yE,EAAEi3G,KAAKrkH,EAAEA,CAAC,UAAI,GAAO,IAAI,EAAEiN,EAAEiY,QAAQlX,CAAC,EAAE,CAAC,UAAU,QAAQ,oBAAoB,QAAQ,mBAAmB,QAAQ,WAAW,QAAQ,iDAAiD,UAAU+9G,MAAM,CAAC,SAAS/rH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG,IAAIY,EAAE7N,EAAE,eAAe1D,EAAEJ,EAAEy5G,eAAe9nG,GAAGlK,EAAE3D,EAAE,eAAekN,EAAEhR,EAAEy5G,eAAehyG,GAAGF,EAAEzD,EAAE,cAAcmE,EAAEjI,EAAEy5G,eAAelyG,GAAGK,EAAE9D,EAAE,gBAAgBgO,EAAE9R,EAAEy5G,eAAe7xG,GAAGO,EAAErE,EAAE,iBAAiBqD,EAAEnH,EAAEy5G,eAAetxG,GAAGC,EAAEtE,EAAE,cAAc0D,EAAExH,EAAEy5G,eAAerxG,GAAGF,EAAEpE,EAAE,kBAAkBqlB,EAAEnpB,EAAEy5G,eAAevxG,GAAG0G,EAAE9K,EAAE,gBAAgB7D,EAAED,EAAEy5G,eAAe7qG,GAAGD,EAAE7K,EAAE,iBAAiBkW,EAAEha,EAAEy5G,eAAe9qG,GAAGoC,EAAEiY,QAAQ,MAAM9oB,WAAAA,CAAY4D,GAAGsW,KAAK01G,cAAc,GAAG11G,KAAK6iG,MAAM7iG,KAAK6iG,MAAMj5G,KAAKoW,MAAMA,KAAKuyG,MAAMvyG,KAAKuyG,MAAM3oH,KAAKoW,OAAM,EAAGha,EAAE4oB,SAASllB,EAAEsW,OAAM,EAAGpJ,EAAEgY,SAASllB,EAAEsW,OAAM,EAAGnS,EAAE+gB,SAASllB,EAAEsW,OAAM,EAAGtI,EAAEkX,SAASllB,EAAEsW,OAAM,EAAGjT,EAAE6hB,SAASllB,EAAEsW,OAAM,EAAG5S,EAAEwhB,SAASllB,EAAEsW,OAAM,EAAG+O,EAAEH,SAASllB,EAAEsW,OAAM,EAAGna,EAAE+oB,SAASllB,EAAEsW,OAAM,EAAGJ,EAAEgP,SAASllB,EAAEsW,KAAK,CAAC6iG,KAAAA,CAAMn5G,EAAEoN,EAAEH,GAAO,IAAL/Q,EAACoC,UAAAjC,OAAA,QAAAmN,IAAAlL,UAAA,GAAAA,UAAA,GAAC,CAAC,EAAG,GAAG9B,MAAMC,QAAQ2Q,GAAG,OAAOA,EAAEyY,KAAIzY,GAAGkJ,KAAK6iG,MAAMn5G,EAAEoN,EAAEH,EAAE/Q,KAAI8D,EAAEgK,iBAAiBoD,EAAEH,EAAE/Q,GAAG,IAAI2R,EAAEA,IAAI7N,EAAE4G,oBAAoBwG,EAAEH,EAAE/Q,GAAG,OAAOoa,KAAK01G,cAAcjrG,KAAKlT,GAAGA,CAAC,CAACg7G,KAAAA,CAAM7oH,EAAEoN,EAAEH,GAAGG,GAAGkJ,KAAK6iG,MAAMn5G,EAAE,aAAaoN,GAAGH,GAAGqJ,KAAK6iG,MAAMn5G,EAAE,aAAaiN,EAAE,CAACgoD,MAAAA,CAAOj1D,GAAG,IAAIoN,EAAEkJ,KAAK01G,cAAcvjH,QAAQzI,GAAGoN,GAAG,IAAIpN,IAAIsW,KAAK01G,cAAcxkG,OAAOpa,EAAE,GAAG,CAAC2lB,OAAAA,GAAU,IAAI,IAAI/yB,EAAE,EAAEA,EAAEsW,KAAK01G,cAAc3vH,OAAO2D,IAAIsW,KAAK01G,cAAchsH,IAAI,EAAE,EAAE,CAAC,cAAc,QAAQ,cAAc,QAAQ,aAAa,QAAQ,eAAe,QAAQ,gBAAgB,QAAQ,aAAa,QAAQ,iBAAiB,QAAQ,eAAe,QAAQ,gBAAgB,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAASA,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,EAAEoN,GAAG,IAAIhR,YAAY6Q,EAAEopG,UAAU4K,QAAQ/kH,EAAEg+G,OAAO59G,IAAI0D,EAAEoN,EAAE+rG,MAAMl3G,SAAS,CAAC,QAAQ,gBAAemL,KAAI,EAAGS,EAAEs7G,kBAAkB/7G,EAAElR,IAAI8D,EAAEk2G,QAAQ,UAAU9oG,EAAEk3E,OAAOic,QAAQvgG,EAAEi2G,SAAQ,EAAGj2G,EAAE+4C,KAAK,QAAQ3rC,KAAKpN,EAAEk2G,SAAQ,EAAGl2G,EAAEi2G,SAAQ,EAAGj2G,EAAE+4C,KAAK,OAAO3rC,GAAG,IAAG,IAAIzJ,EAAE,GAAGyJ,EAAE+rG,MAAM78G,EAAE,SAAQ8Q,IAAI,IAAIlR,EAAE2b,KAAK6H,MAAM/b,EAAEod,KAAK7kB,GAAG,IAAIm/G,kBAAkB/+G,EAAE4+G,aAAahuG,EAAEkuG,oBAAoB33G,EAAE03G,mBAAmBh3G,GAAG8I,EAAEnJ,EAAEH,EAAE0T,QAAOrX,GAAG9D,EAAE8D,GAAGkN,IAAG,OAAOpJ,EAAEzH,QAAQ,KAAK,EAAE2D,EAAE+4C,KAAK,QAAQ3rC,GAAGS,EAAEkwG,UAAU/9G,EAAE+1G,QAAQz5G,GAAG0D,EAAEwmH,SAASxmH,EAAEwmH,SAAS7iH,EAAEG,EAAE,MAAM,KAAK,EAAE9D,EAAE+4C,KAAK,WAAW3rC,GAAGS,EAAEkwG,UAAU/9G,EAAE+1G,QAAQtyG,GAAGzD,EAAEwmH,SAASriH,IAAInE,EAAEw4G,YAAYx4G,EAAEw4G,YAAY70G,EAAE,GAAG,MAAM,QAAQA,EAAE,GAAE,GAAG,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAAS3D,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,EAAEoN,GAAG,IAAI6zG,QAAQh0G,GAAGjN,EAAEq2G,SAASjpG,EAAEy7G,MAAM57G,GAAEG,KAAI,EAAGS,EAAE60G,UAAUz1G,EAAE,aAAajN,EAAE+4C,KAAK,SAAQ,EAAG3rC,EAAE,IAAEA,KAAI,EAAGS,EAAEg4G,aAAa54G,EAAE,aAAajN,EAAE+4C,KAAK,SAAQ,EAAG3rC,EAAE,GAAE,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAU6+G,MAAM,CAAC,SAASjsH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD,SAAS6N,EAAE7N,EAAEoN,GAAG,IAAI6zG,QAAQh0G,GAAGjN,EAAEq2G,SAASjpG,EAAE+rG,MAAMlsG,EAAE,aAAYG,IAAIpN,EAAE+4C,KAAK,YAAY3rC,EAAE,GAAE,CAAClR,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAIY,GAAE,EAAE,CAAC,iDAAiD,UAAUq+G,MAAM,CAAC,SAASlsH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,EAAEoN,GAAG,IAAI0oG,OAAO7oG,EAAE7Q,YAAYF,GAAG8D,EAAEA,EAAEoyB,GAAG,UAAS,KAAK,IAAImuD,YAAYnzE,EAAEspG,OAAOx6G,GAAG8D,EAAE,aAAaA,EAAE2xC,OAAO1kC,EAAE+qG,UAAUh4G,EAAEg4G,WAAWh4G,EAAEugF,YAAYnzE,EAAElR,EAAEmoH,KAAK,EAAE,IAAG,IAAI/nH,GAAE,EAAGuR,EAAEs+G,WAAU,IAAInsH,EAAE+4C,KAAK,WAAU78C,EAAEu+G,aAAartG,EAAE+rG,MAAMn2G,OAAO,CAAC,oBAAoB,WAAU,IAAI1G,MAAK0/D,QAAQA,OAAOowD,aAAapwD,OAAOowD,YAAY3F,UAAUr5G,EAAE+rG,MAAMn9C,OAAOowD,YAAY,UAAS,IAAI9vH,KAAI,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAAS0D,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAItJ,IAAG,IAAIkK,EAAE7N,EAAE,YAAY1D,EAAE0D,EAAE,uBAAuB,SAAS2D,EAAE3D,EAAEoN,GAAG,GAAGS,EAAEkwG,WAAW/9G,EAAE81G,OAAO+B,OAAO,CAAC,IAAIqC,OAAOjtG,EAAEs0G,UAAUrlH,GAAG8D,EAAEq2G,SAAS1yG,EAAE,KAAKuJ,GAAE,EAAGzJ,EAAE,EAAEU,EAAE,EAAEL,EAAE,EAAEkK,EAAEZ,IAAI,GAAG,IAAIA,EAAEqlF,QAAQp2F,SAAS2D,EAAE+1G,OAAO,CAACpyG,IAAIzH,IAAG,EAAGI,EAAE+vH,gBAAgBrsH,EAAEoN,GAAGF,GAAE,EAAG,IAAI4hF,MAAM7hF,EAAE8hF,MAAMlhF,GAAGT,EAAEqlF,QAAQ,GAAGhvF,EAAEwJ,EAAE9I,EAAE0J,EAAE/J,EAAE9D,EAAEg5B,WAAW,GAAG30B,EAAE+I,IAAI,GAAG,IAAIA,EAAEqlF,QAAQp2F,QAAQ6Q,GAAGlN,EAAEgY,SAAS,CAAC,IAAI82E,MAAM5yF,EAAE6yF,MAAMzyF,GAAG8Q,EAAEqlF,QAAQ,GAAGvlF,EAAE,SAASlN,EAAEoN,EAAEH,EAAE/Q,GAAG,IAAI2R,EAAET,EAAElR,EAAEI,EAAE2Q,EAAEjN,EAAE2D,EAAE,EAAE,GAAG,EAAEiL,KAAKC,IAAIvS,IAAI,EAAEsS,KAAKC,IAAIhB,GAAG,OAAOlK,EAAE,IAAIuJ,EAAE,IAAI0B,KAAK09G,MAAMz+G,EAAEvR,GAAGsS,KAAK29G,GAAG,OAAOr/G,IAAI,IAAIA,EAAE,GAAGvJ,EAAE,EAAEuJ,GAAG,IAAIA,EAAE,IAAIvJ,EAAE,EAAEuJ,IAAI,KAAKA,GAAG,GAAGvJ,EAAE,GAAGuJ,GAAG,KAAKA,GAAG,KAAKA,IAAI,KAAKA,GAAG,OAAOvJ,EAAE,GAAGA,CAAC,CAAvN,CAAyNF,EAAEU,EAAEjI,EAAEI,GAAG0R,EAAE,CAAC,EAAE,GAAGqV,SAASnW,GAAG7I,EAAE,CAAC,EAAE,GAAGgf,SAASnW,GAAG,GAAGc,IAAIhO,EAAEm2G,UAAU9xG,GAAGrE,EAAEm2G,SAAS,CAAC,IAAIjpG,GAAE,EAAGW,EAAEm3G,QAAQ9oH,EAAEuH,GAAGzD,EAAEqF,OAAO,EAAE,GAAG2I,GAAE,EAAGH,EAAEm3G,QAAQ1oH,EAAE6H,GAAGnE,EAAEsF,QAAQ,EAAE,GAAGjB,EAAErE,EAAEm2G,SAASnoG,EAAEd,EAAE7J,EAAEM,IAAIsJ,EAAEjN,EAAE5D,YAAYs/G,iBAAiB,EAAEp3G,GAAE,EAAGuJ,EAAEm3G,OAAOlhH,EAAE9D,EAAEgY,SAAS3T,EAAEhB,EAAE,EAAErD,EAAEgY,UAAUhY,EAAE+kH,KAAKzgH,EAAEtE,EAAE+4C,KAAK,SAAS,UAAS,EAAGlrC,EAAEm3G,OAAO1gH,EAAEtE,EAAEgY,SAAS,EAAE,GAAG5K,GAAGpN,EAAE02G,OAAO2N,KAAK,IAAG,EAAGx2G,EAAEi3G,cAAcxgH,SAAQ,EAAGuJ,EAAEi3G,cAAc9kH,EAAEgY,WAAW,CAAC,GAAG5K,EAAE+rG,MAAMj9G,EAAE,cAAa8D,IAAI2D,EAAEzH,EAAE8R,EAAEhO,EAAE,IAAGoN,EAAE+rG,MAAMlsG,EAAE,cAAajN,IAAI2D,EAAEsJ,EAAEe,EAAEhO,EAAE,IAAGoN,EAAE+rG,MAAMlsG,EAAE,YAAY5I,GAAG+I,EAAE+rG,MAAMj9G,EAAE,YAAYmI,GAAG+I,EAAE+rG,MAAMl3G,SAAS,YAAW,KAAKiL,IAAIzJ,EAAE,EAAEU,EAAE,EAAEL,EAAE,EAAEoJ,GAAE,EAAGvJ,EAAE,KAAK,GAAE,CAAC,CAAC,EAAE,CAAC,WAAW,QAAQ,sBAAsB,QAAQ,iDAAiD,UAAU6oH,MAAM,CAAC,SAASxsH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,EAAEoN,GAAG,IAAI0oG,OAAO7oG,EAAE7Q,YAAYF,EAAEm6G,UAAUwK,WAAWvkH,IAAI0D,EAAE2D,GAAE,EAAGkK,EAAE4+G,WAAU,KAAKzsH,EAAE+4C,KAAK,QAAO,EAAGlrC,EAAEq6G,cAAc5rH,EAAEJ,EAAEy+G,YAAY,GAAEz+G,EAAEw+G,aAAattG,EAAE+rG,MAAMn2G,OAAO,UAAS,IAAIW,MAAK3D,EAAEoyB,GAAG,QAAOhlB,IAAIH,EAAEgrG,WAAWj4G,EAAE0sH,MAAMt/G,EAAE,GAAE,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAUu/G,MAAM,CAAC,SAAS3sH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD,SAAS6N,EAAE7N,EAAEoN,GAAGA,EAAE+rG,MAAMl3G,SAAS,aAAYmL,IAAIpN,EAAE+4C,KAAK,qBAAqB3rC,EAAE,IAAGA,EAAE+rG,MAAMl3G,SAAS,WAAUmL,IAAIpN,EAAE+4C,KAAK,mBAAmB3rC,EAAE,GAAE,CAAClR,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAIY,GAAE,EAAE,CAAC,iDAAiD,UAAU++G,MAAM,CAAC,SAAS5sH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD,SAAS6N,EAAE7N,GAAG,GAAGA,EAAE5D,YAAY8/G,QAAQ,CAAC,IAAI9uG,EAAE,MAAM,SAASH,IAAIjN,EAAE4kH,SAAS5kH,EAAE+4C,KAAK,OAAO/4C,EAAEo2G,YAAYhpG,EAAEy/G,sBAAsB5/G,GAAG,CAA/E,GAAmFjN,EAAEoyB,GAAG,WAAU,KAAK06F,qBAAqB1/G,EAAE,GAAE,CAAC,CAAClR,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAIY,GAAE,EAAE,CAAC,iDAAiD,UAAUk/G,MAAM,CAAC,SAAS/sH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD,SAAS6N,EAAE7N,EAAEoN,GAAG,CAAClR,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAIY,GAAE,EAAE,CAAC,iDAAiD,UAAU,QAAQ,CAAC,SAAS7N,EAAEoN,EAAEH,GAAGjN,EAAE,kDAAkD01G,kBAAkBzoG,GAAG,IAAI/Q,EAAE8D,EAAE,WAAWiN,EAAEiY,QAAQ,MAAM9oB,WAAAA,CAAY4D,GAAGsW,KAAKsqG,IAAI5gH,EAAEsW,KAAK/Z,KAAK,CAAC,EAAEyD,EAAE81G,OAAOkB,SAAS96G,EAAE6hH,UAAUznG,KAAKgqC,MAAM,CAACA,IAAAA,GAAO,IAAI64D,MAAMn5G,EAAE5D,YAAYgR,GAAGkJ,KAAKsqG,IAAItqG,KAAKqmE,IAAI,UAAS,KAAKrmE,KAAKsqG,IAAInI,gBAAgBniG,KAAKsqG,IAAInI,eAAc,EAAG,IAAGniG,KAAKqmE,IAAI,SAAQ,KAAKrmE,KAAKsqG,IAAI4F,QAAQ,IAAGlwG,KAAKqmE,IAAI,aAAY,KAAKrmE,KAAKsqG,IAAIoM,SAAS5/G,EAAEwuG,SAAS,IAAGtlG,KAAKqmE,IAAI,WAAU,KAAKrmE,KAAKsqG,IAAIhJ,QAAQxqG,EAAEuuG,WAAW,IAAGrlG,KAAKqmE,IAAI,cAAa,KAAKrmE,KAAKsqG,IAAIqM,QAAQ7/G,EAAEwuG,SAAS,IAAGtlG,KAAKqmE,IAAI,aAAY,KAAKrmE,KAAKsqG,IAAIhJ,QAAQxqG,EAAEuuG,WAAW,IAAG37G,EAAEiC,SAAS,WAAUjC,IAAI,GAAGsW,KAAKsqG,IAAI3K,QAAQ,CAAC,IAAI7oG,EAAEnL,SAASk8E,cAAcoiB,QAAQr4F,cAAc+E,EAAEhL,SAASk8E,cAAcn8D,aAAa,mBAAmB,GAAG,UAAU5U,GAAG,aAAaA,GAAG,KAAKH,GAAG,SAASA,IAAIjN,EAAEkvF,SAASlvF,EAAEgvF,UAAUhvF,EAAEmvF,UAAUnvF,EAAEivF,SAAS,CAAC,IAAI7hF,EAAEkJ,KAAK/Z,KAAKyD,EAAEm1B,MAAM,GAAG/nB,EAAE,CAACpN,EAAEutF,iBAAiB,IAAI,IAAItgF,EAAE,EAAEA,EAAEG,EAAE/Q,OAAO4Q,IAAIG,EAAEH,GAAG/P,KAAKoZ,KAAKsqG,IAAI5gH,GAAGsW,KAAKsqG,IAAI7nE,KAAK,SAAS/4C,EAAE,CAAC,CAAC,CAACsW,KAAKsqG,IAAI7nE,KAAK,UAAU/4C,EAAE,GAAE,CAAC28E,GAAAA,CAAI38E,EAAEoN,GAAG,OAAOkJ,KAAK/Z,KAAKyD,GAAGsW,KAAK/Z,KAAKyD,GAAG+gB,KAAK3T,GAAGkJ,KAAK/Z,KAAKyD,GAAG,CAACoN,GAAGkJ,IAAI,CAAC2+C,MAAAA,CAAOj1D,EAAEoN,GAAG,GAAGkJ,KAAK/Z,KAAKyD,GAAG,CAAC,IAAIiN,EAAEqJ,KAAK/Z,KAAKyD,GAAGyI,QAAQ2E,IAAI,IAAIH,GAAGqJ,KAAK/Z,KAAKyD,GAAGwnB,OAAOva,EAAE,EAAE,CAAC,OAAOqJ,IAAI,EAAE,EAAE,CAAC,UAAU,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAAStW,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG,IAAIY,EAAE7N,EAAE,qBAAqB1D,EAAEJ,EAAEy5G,eAAe9nG,GAAG,MAAMlK,UAAUrH,EAAE4oB,QAAQ9oB,WAAAA,CAAY4D,GAAG41G,MAAM51G,GAAG,IAAI81G,OAAO1oG,EAAEipG,UAAUuL,OAAO30G,IAAIjN,EAAEsW,KAAKnY,KAAK,QAAQmY,KAAK8yG,QAAQn8G,EAAE,IAAI,IAAIjN,EAAE,EAAEA,EAAEoN,EAAEwpG,OAAOv6G,OAAO2D,IAAIsW,KAAKqmE,IAAIvvE,EAAEwpG,OAAO52G,GAAG,EAAEiN,EAAEiY,QAAQvhB,CAAC,EAAE,CAAC,oBAAoB,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAAS3D,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG,IAAIY,EAAE7N,EAAE,WAAW1D,EAAE0D,EAAE,qBAAqB2D,EAAEzH,EAAEy5G,eAAer5G,GAAG,MAAM4Q,UAAUvJ,EAAEuhB,QAAQ9oB,WAAAA,CAAY4D,GAAG41G,MAAM51G,GAAGsW,KAAKnY,KAAK,WAAU,EAAG0P,EAAEuiD,QAAQpwD,EAAEq2G,SAASwL,SAAS7hH,EAAEw2G,MAAM79F,QAAQ,EAAE1L,EAAEiY,QAAQhY,CAAC,EAAE,CAAC,UAAU,QAAQ,oBAAoB,QAAQ,iDAAiD,UAAUggH,MAAM,CAAC,SAASltH,EAAEoN,EAAEH,GAAGjN,EAAE,kDAAkD01G,kBAAkBzoG,GAAG,IAAI/Q,EAAE8D,EAAE,WAAWiN,EAAEiY,QAAQ,MAAM9oB,WAAAA,CAAY4D,GAAGsW,KAAKsqG,IAAI5gH,EAAEsW,KAAKopB,MAAM,IAAI,CAAC,QAAI2kF,CAAKrkH,GAAG,IAAI5D,YAAYgR,EAAEipG,UAAU4K,QAAQh0G,EAAE80G,aAAal0G,IAAIyI,KAAKsqG,IAAI5gH,GAAG6N,EAAE67G,UAAU1pH,aAAawN,MAAMxN,EAAEkM,QAAQmB,OAAOrN,GAAE,EAAG9D,EAAEwmH,UAAUz1G,EAAE,mBAAmB6yB,aAAaxpB,KAAKopB,OAAOppB,KAAKopB,MAAMh3B,YAAW,KAAKmF,EAAE67G,UAAU,IAAG,EAAGxtH,EAAE2pH,aAAa54G,EAAE,kBAAkB,GAAEG,EAAEitG,eAAc,EAAGn+G,EAAE2pH,aAAa54G,EAAE,kBAAkB,EAAE,EAAE,CAAC,UAAU,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAASjN,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG,IAAIY,EAAE7N,EAAE,WAAW1D,EAAE0D,EAAE,qBAAqB2D,EAAEzH,EAAEy5G,eAAer5G,GAAG,MAAM4Q,UAAUvJ,EAAEuhB,QAAQ9oB,WAAAA,CAAY4D,GAAG41G,MAAM51G,GAAGsW,KAAKnY,KAAK,OAAO,IAAIk4G,SAASjpG,EAAEopG,MAAMvpG,EAAEqpG,OAAOp6G,GAAG8D,EAAE1D,GAAE,EAAGuR,EAAEuiD,QAAQhjD,EAAE60G,OAAOh1G,EAAE0kC,OAAOhuC,GAAE,EAAGkK,EAAEuiD,QAAQhjD,EAAE60G,OAAOh1G,EAAEzB,QAAO,EAAGqC,EAAEy3G,UAAU3hH,EAAE,UAAU,QAAQ3D,EAAEoyB,GAAG,WAAU,MAAK,EAAGvkB,EAAEy3G,UAAUhpH,EAAE,UAAU,SAAQ,EAAGuR,EAAEy3G,UAAU3hH,EAAE,UAAU,KAAK,IAAGzH,EAAEi9G,MAAM/rG,EAAE60G,OAAO,SAAQ,IAAIjiH,EAAEwkH,QAAO,EAAEv3G,EAAEiY,QAAQhY,CAAC,EAAE,CAAC,UAAU,QAAQ,oBAAoB,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAASlN,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG,IAAIY,EAAE7N,EAAE,YAAY1D,EAAE0D,EAAE,6BAA6B2D,EAAEzH,EAAEy5G,eAAer5G,GAAG4Q,EAAElN,EAAE,2BAA2ByD,EAAEvH,EAAEy5G,eAAezoG,GAAG/I,EAAEnE,EAAE,2BAA2B8D,EAAE5H,EAAEy5G,eAAexxG,GAAG6J,EAAEhO,EAAE,0BAA0BqE,EAAEnI,EAAEy5G,eAAe3nG,GAAG3K,EAAErD,EAAE,2BAA2BsE,EAAEpI,EAAEy5G,eAAetyG,GAAGK,EAAE1D,EAAE,4BAA4BoE,EAAElI,EAAEy5G,eAAejyG,GAAG2hB,EAAErlB,EAAE,kCAAkC8K,EAAE5O,EAAEy5G,eAAetwF,GAAGlpB,EAAE6D,EAAE,gCAAgC6K,EAAE3O,EAAEy5G,eAAex5G,GAAG+Z,EAAElW,EAAE,6BAA6BggB,EAAE9jB,EAAEy5G,eAAez/F,GAAG5S,EAAEtD,EAAE,gCAAgCmW,EAAEja,EAAEy5G,eAAeryG,GAAG0L,EAAEhP,EAAE,iCAAiC+V,EAAE7Z,EAAEy5G,eAAe3mG,GAAGF,EAAE9O,EAAE,mCAAmCygB,EAAEvkB,EAAEy5G,eAAe7mG,GAAGJ,EAAE1O,EAAE,kCAAkCqY,EAAEnc,EAAEy5G,eAAejnG,GAAG6I,EAAEvX,EAAE,4BAA4Byc,EAAEvgB,EAAEy5G,eAAep+F,GAAGtB,EAAEjW,EAAE,yBAAyBsgB,EAAEpkB,EAAEy5G,eAAe1/F,GAAGlD,EAAE/S,EAAE,0BAA0B0V,EAAExZ,EAAEy5G,eAAe5iG,GAAGkG,EAAEjZ,EAAE,4BAA4ByS,EAAEvW,EAAEy5G,eAAe18F,GAAGwO,EAAEznB,EAAE,oCAAoCsX,EAAEpb,EAAEy5G,eAAeluF,GAAG9H,EAAE3f,EAAE,mCAAmCkE,EAAEhI,EAAEy5G,eAAeh2F,GAAGvJ,EAAEpW,EAAE,wCAAwCkZ,EAAEhd,EAAEy5G,eAAev/F,GAAGgD,EAAEpZ,EAAE,uCAAuC+f,EAAE7jB,EAAEy5G,eAAev8F,GAAGD,EAAEnZ,EAAE,+BAA+Bkc,EAAEhgB,EAAEy5G,eAAex8F,GAAGqX,EAAExwB,EAAE,gCAAgCqgB,EAAEnkB,EAAEy5G,eAAenlF,GAAG1W,EAAE9Z,EAAE,0BAA0BugB,EAAErkB,EAAEy5G,eAAe77F,GAAG0G,EAAExgB,EAAE,2BAA2BywB,GAAGv0B,EAAEy5G,eAAen1F,GAAGsG,GAAG9mB,EAAE,2BAA2B+4B,GAAG78B,EAAEy5G,eAAe7uF,IAAIqnC,GAAGnuD,EAAE,6BAA6Bk0E,GAAGh4E,EAAEy5G,eAAexnD,IAAIlhD,EAAEiY,QAAQ,MAAM9oB,WAAAA,CAAY4D,GAAG,IAAIoN,EAAE,CAACuL,QAAQhV,EAAEuhB,QAAQysB,MAAMluC,EAAEyhB,QAAQs/F,KAAKngH,EAAE6gB,QAAQu/F,MAAMngH,EAAE4gB,QAAQmkG,MAAMvlH,EAAEohB,QAAQ0yF,OAAOxzG,EAAE8gB,QAAQ8lG,YAAYlgH,EAAEoa,QAAQkzF,WAAWvtG,EAAEqa,QAAQgyF,QAAQl3F,EAAEkF,QAAQmzF,IAAI/3F,EAAE4E,QAAQioG,UAAUh3G,EAAE+O,QAAQkoG,WAAWr3G,EAAEmP,QAAQ2U,aAAapZ,EAAEyE,QAAQq7D,YAAYloE,EAAE6M,QAAQnf,OAAO0W,EAAEyI,QAAQ4zF,KAAKpjG,EAAEwP,QAAQizF,KAAK53F,EAAE2E,QAAQmoG,OAAO56G,EAAEyS,QAAQ+kG,cAAc3yG,EAAE4N,QAAQ8kG,aAAa9lH,EAAEghB,QAAQilG,iBAAiBjxG,EAAEgM,QAAQglG,gBAAgBnqG,EAAEmF,QAAQooG,SAASpxG,EAAEgJ,QAAQqoG,UAAUltG,EAAE6E,QAAQ1Z,MAAMilB,GAAGvL,QAAQimD,MAAMpyC,GAAG7T,QAAQg0F,QAAQhlC,GAAGhvD,WAAWllB,EAAE81G,OAAOU,OAAO,IAAI,IAAIx2G,KAAKoN,GAAE,EAAGS,EAAEq2G,KAAK5tG,KAAKtW,EAAE,CAACoX,IAAIA,KAAI,EAAGvJ,EAAE2/G,SAASxtH,EAAEoN,EAAEpN,KAAK,EAAE,EAAE,CAAC,WAAW,QAAQ,4BAA4B,QAAQ,0BAA0B,QAAQ,0BAA0B,QAAQ,yBAAyB,QAAQ,0BAA0B,QAAQ,2BAA2B,QAAQ,iCAAiC,QAAQ,+BAA+B,QAAQ,4BAA4B,QAAQ,+BAA+B,QAAQ,gCAAgC,QAAQ,kCAAkC,QAAQ,iCAAiC,QAAQ,2BAA2B,QAAQ,wBAAwB,QAAQ,yBAAyB,QAAQ,2BAA2B,QAAQ,mCAAmC,QAAQ,kCAAkC,QAAQ,uCAAuC,QAAQ,sCAAsC,QAAQ,8BAA8B,QAAQ,+BAA+B,QAAQ,yBAAyB,QAAQ,0BAA0B,QAAQ,0BAA0B,QAAQ,4BAA4B,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAASA,EAAEoN,EAAEH,GAAGG,EAAEpR,QAAQ,utFAAutF,EAAE,CAAC,GAAG,QAAQ,CAAC,SAASgE,EAAEoN,EAAEH,GAAGG,EAAEpR,QAAQ,kdAAkd,EAAE,CAAC,GAAGyxH,MAAM,CAAC,SAASztH,EAAEoN,EAAEH,GAAGG,EAAEpR,QAAQ,6KAA6K,EAAE,CAAC,GAAG0xH,MAAM,CAAC,SAAS1tH,EAAEoN,EAAEH,GAAGG,EAAEpR,QAAQ,kOAAkO,EAAE,CAAC,GAAG,QAAQ,CAAC,SAASgE,EAAEoN,EAAEH,GAAGG,EAAEpR,QAAQ,+MAA+M,EAAE,CAAC,GAAG2xH,MAAM,CAAC,SAAS3tH,EAAEoN,EAAEH,GAAGG,EAAEpR,QAAQ,yaAAya,EAAE,CAAC,GAAG4xH,MAAM,CAAC,SAAS5tH,EAAEoN,EAAEH,GAAGG,EAAEpR,QAAQ,wpBAAwpB,EAAE,CAAC,GAAG,QAAQ,CAAC,SAASgE,EAAEoN,EAAEH,GAAGG,EAAEpR,QAAQ,0XAA0X,EAAE,CAAC,GAAG,QAAQ,CAAC,SAASgE,EAAEoN,EAAEH,GAAGG,EAAEpR,QAAQ,yyBAAyyB,EAAE,CAAC,GAAG6xH,MAAM,CAAC,SAAS7tH,EAAEoN,EAAEH,GAAGG,EAAEpR,QAAQ,oKAAoK,EAAE,CAAC,GAAG8xH,MAAM,CAAC,SAAS9tH,EAAEoN,EAAEH,GAAGG,EAAEpR,QAAQ,oKAAoK,EAAE,CAAC,GAAG+xH,MAAM,CAAC,SAAS/tH,EAAEoN,EAAEH,GAAGG,EAAEpR,QAAQ,2cAA2c,EAAE,CAAC,GAAG,QAAQ,CAAC,SAASgE,EAAEoN,EAAEH,GAAGG,EAAEpR,QAAQ,m1BAAm1B,EAAE,CAAC,GAAGgyH,MAAM,CAAC,SAAShuH,EAAEoN,EAAEH,GAAGG,EAAEpR,QAAQ,6OAA6O,EAAE,CAAC,GAAG,QAAQ,CAAC,SAASgE,EAAEoN,EAAEH,GAAGG,EAAEpR,QAAQ,yOAAyO,EAAE,CAAC,GAAGiyH,MAAM,CAAC,SAASjuH,EAAEoN,EAAEH,GAAGG,EAAEpR,QAAQ,uaAAua,EAAE,CAAC,GAAGkyH,MAAM,CAAC,SAASluH,EAAEoN,EAAEH,GAAGG,EAAEpR,QAAQ,gZAAgZ,EAAE,CAAC,GAAGmyH,MAAM,CAAC,SAASnuH,EAAEoN,EAAEH,GAAGG,EAAEpR,QAAQ,uTAAuT,EAAE,CAAC,GAAGoyH,MAAM,CAAC,SAASpuH,EAAEoN,EAAEH,GAAGG,EAAEpR,QAAQ,4TAA4T,EAAE,CAAC,GAAGqyH,MAAM,CAAC,SAASruH,EAAEoN,EAAEH,GAAGG,EAAEpR,QAAQ,goBAAgoB,EAAE,CAAC,GAAG,QAAQ,CAAC,SAASgE,EAAEoN,EAAEH,GAAGG,EAAEpR,QAAQ,ioBAAioB,EAAE,CAAC,GAAG,QAAQ,CAAC,SAASgE,EAAEoN,EAAEH,GAAGG,EAAEpR,QAAQ,oPAAoP,EAAE,CAAC,GAAG,QAAQ,CAAC,SAASgE,EAAEoN,EAAEH,GAAGG,EAAEpR,QAAQ,8ZAA8Z,EAAE,CAAC,GAAG,QAAQ,CAAC,SAASgE,EAAEoN,EAAEH,GAAGG,EAAEpR,QAAQ,gxBAAgxB,EAAE,CAAC,GAAG,QAAQ,CAAC,SAASgE,EAAEoN,EAAEH,GAAGG,EAAEpR,QAAQ,2kBAA2kB,EAAE,CAAC,GAAG,QAAQ,CAAC,SAASgE,EAAEoN,EAAEH,GAAGG,EAAEpR,QAAQ,4jBAA4jB,EAAE,CAAC,GAAGsyH,MAAM,CAAC,SAAStuH,EAAEoN,EAAEH,GAAGG,EAAEpR,QAAQ,8OAA8O,EAAE,CAAC,GAAG,QAAQ,CAAC,SAASgE,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG,IAAIY,EAAE7N,EAAE,UAAU1D,EAAEJ,EAAEy5G,eAAe9nG,GAAGlK,EAAE3D,EAAE,iBAAiBkN,EAAEhR,EAAEy5G,eAAehyG,GAAGF,EAAEzD,EAAE,kBAAkBmE,EAAEjI,EAAEy5G,eAAelyG,GAAGK,EAAE9D,EAAE,oBAAoBgO,EAAE9R,EAAEy5G,eAAe7xG,GAAGO,EAAErE,EAAE,sBAAsBqD,EAAEnH,EAAEy5G,eAAetxG,GAAGC,EAAEtE,EAAE,YAAY,MAAM0D,UAAUL,EAAE6hB,QAAQ9oB,WAAAA,CAAY4D,GAAG41G,MAAM51G,GAAG,IAAI81G,OAAO1oG,EAAEypG,SAAS5pG,EAAEopG,UAAU6L,SAAShmH,IAAI8D,EAAEsW,KAAKnY,KAAK,UAAUmY,KAAK8yG,QAAQltH,EAAEoa,KAAK2B,GAAG,EAAE3B,KAAKi4G,OAAO,KAAKj4G,KAAKs2C,MAAM,IAAIkgB,IAAIx2D,KAAKw/F,OAAO,IAAIx/F,KAAKk4G,WAAWphH,EAAEgsG,UAAUhsG,EAAE8pG,UAAU5gG,KAAKm4G,SAASn4G,KAAKvX,SAASiB,EAAEoyB,GAAG,QAAO,KAAK9b,KAAK+tG,OAAO/tG,KAAK+tG,MAAK,EAAG/tG,KAAKvX,SAAS,IAAGiB,EAAEoyB,GAAG,SAAQpyB,IAAI,IAAIoN,GAAE,EAAG9I,EAAE6kH,kBAAkBnpH,EAAEiN,EAAEiqG,SAASh7G,GAAE,EAAGoI,EAAE6kH,kBAAkBnpH,EAAEsW,KAAK8yG,UAAU9yG,KAAK+tG,MAAMj3G,GAAGlR,IAAIoa,KAAK+tG,MAAK,EAAG/tG,KAAKvX,SAAS,IAAGiB,EAAEoyB,GAAG,UAAS,IAAI9b,KAAK20G,WAAU,CAAC,WAAIuD,GAAU,IAAIxuH,EAAE,IAAI81G,OAAO1oG,GAAGkJ,KAAKsqG,IAAI,OAAOxzG,EAAEysB,cAAc75B,EAAE+gB,MAAK,EAAG5c,EAAE+gB,SAAS5O,KAAKsqG,MAAMxzG,EAAEmzE,aAAavgF,EAAE+gB,MAAK,EAAG7T,EAAEgY,SAAS5O,KAAKsqG,MAAMxzG,EAAE+qG,MAAMn4G,EAAE+gB,MAAK,EAAGzkB,EAAE4oB,SAAS5O,KAAKsqG,MAAMxzG,EAAEsrG,gBAAgB14G,EAAE+gB,MAAK,EAAG/S,EAAEkX,SAAS5O,KAAKsqG,MAAM5gH,CAAC,CAAC0uH,QAAAA,CAAS1uH,GAAgB,IAAdoN,EAAC9O,UAAAjC,OAAA,QAAAmN,IAAAlL,UAAA,GAAAA,UAAA,GAACgY,KAAKw/F,OAAQ,IAAI,IAAI7oG,EAAE,EAAEA,EAAEG,EAAE/Q,OAAO4Q,IAAI,CAAC,IAAI/Q,EAAEkR,EAAEH,GAAGjN,EAAE9D,GAAGA,EAAE+jH,UAAU5jH,QAAQia,KAAKo4G,SAASxxH,KAAKoZ,KAAKtW,EAAE9D,EAAE+jH,SAAS,CAAC,CAACoJ,KAAAA,CAAMrpH,GAAGA,EAAEopH,QAAQpJ,QAAQhgH,EAAEy3G,KAAKnhG,KAAKo4G,UAASthH,IAAIA,EAAE8X,QAAQ9X,IAAIpN,EAAEoN,EAAE8X,SAAS9X,EAAEuhH,QAAO,EAAGrqH,EAAEklH,cAAcp8G,EAAEuhH,MAAM,cAAc,GAAE3uH,EAAE4uH,SAASt4G,KAAKvX,OAAOiB,EAAE6uH,SAAS,CAACJ,MAAAA,GAA8B,IAAvBzuH,EAAC1B,UAAAjC,OAAA,QAAAmN,IAAAlL,UAAA,GAAAA,UAAA,GAACgY,KAAKw/F,OAAO1oG,EAAC9O,UAAAjC,OAAA,EAAAiC,UAAA,QAAAkL,EAACyD,EAAC3O,UAAAjC,OAAA,EAAAiC,UAAA,QAAAkL,EAACtN,EAACoC,UAAAjC,OAAA,QAAAmN,IAAAlL,UAAA,GAAAA,UAAA,GAAC,GAAI,IAAI,IAAIuP,EAAE,EAAEA,EAAE7N,EAAE3D,OAAOwR,IAAI,CAAC,IAAIvR,EAAE0D,EAAE6N,GAAG,GAAGvR,GAAG6B,OAAM,EAAGmG,EAAEu7G,cAAc3jH,EAAEmnB,SAAS/mB,EAAE6B,MAAM,QAAQ7B,EAAE6B,uCAAuCjC,EAAE6kB,KAAKzkB,EAAE6B,OAAO7B,EAAE6B,KAAK,WAAWmY,KAAK2B,MAAQ3b,EAAEwyH,WAAW,EAAC,EAAGxqH,EAAE4/G,KAAK5nH,EAAE,UAAU,CAAC8a,IAAIA,IAAIhK,KAAI,EAAG9I,EAAE4/G,KAAK5nH,EAAE,WAAW,CAAC8a,IAAIA,IAAInK,KAAI,EAAG3I,EAAE4/G,KAAK5nH,EAAE,UAAU,CAAC8a,IAAIA,IAAIpX,IAAI,IAAI9D,EAAE,IAAG,EAAGoI,EAAE4/G,KAAK5nH,EAAE,UAAU,CAAC8a,IAAIA,IAAIlb,KAAI,EAAGoI,EAAE4/G,KAAK5nH,EAAE,aAAa,CAAC8a,IAAIA,KAAI,GAAI,CAACd,KAAKm4G,OAAOnyH,EAAE2jH,UAAU,GAAG3jH,EAAE0D,EAAE9D,EAAE,CAACoa,KAAKw/F,OAAO91G,CAAC,CAAC2wE,IAAAA,GAAU,IAAL3wE,EAAC1B,UAAAjC,OAAA,QAAAmN,IAAAlL,UAAA,GAAAA,UAAA,GAAC,GAAQ8O,EAAE,KAAK,OAAOkJ,KAAKo4G,UAASzhH,IAAIA,EAAE9O,OAAO6B,IAAIoN,EAAEH,EAAE,IAAGG,CAAC,CAAC69G,MAAAA,GAAS,IAAIpU,SAAS72G,EAAE5D,aAAak+G,cAAcltG,EAAEotG,oBAAoBvtG,GAAGopG,UAAU4K,QAAQ/kH,EAAEgmH,SAASr0G,IAAIyI,KAAKsqG,IAAI,GAAG5gH,EAAEk3G,SAAS5gG,KAAK+tG,KAAK,CAAC,IAAI/nH,EAAEga,KAAKi4G,OAAO,IAAInF,SAAS/jH,OAAO+H,GAAGhI,KAAKzB,EAAE0B,MAAM6H,IAAG,EAAG5I,EAAEmjH,SAASznH,EAAEk3G,UAAU9xG,KAAK3B,EAAE4B,MAAMlB,IAAG,EAAGG,EAAEmjH,SAASvrH,GAAG4H,EAAEH,EAAEF,EAAEyJ,EAAE,EAAE5Q,EAAE,EAAE0R,EAAEsI,KAAKi4G,SAASj4G,KAAKw/F,OAAOx/F,KAAKi4G,OAAOlyH,OAAO4Q,GAAGqJ,KAAKi4G,OAAOlyH,OAAO,GAAG4Q,EAAE,IAAG,EAAG3I,EAAEghH,UAAUz3G,EAAE,SAAS,GAAGG,QAAO,EAAG1J,EAAEghH,UAAUz3G,EAAE,QAAQ,GAAGvR,OAAOga,KAAKsqG,IAAIzK,UAAU7xG,EAAEy5G,SAAS,OAAOj6G,EAAExH,EAAE6H,IAAG,EAAGG,EAAEghH,UAAUz3G,EAAE,OAAO,OAAM,EAAGvJ,EAAEghH,UAAUz3G,EAAE,QAAQ,SAAQ,EAAGvJ,EAAEghH,UAAUz3G,EAAE,OAAO,GAAG/J,QAAO,EAAGQ,EAAEghH,UAAUz3G,EAAE,QAAQ,QAAQ,CAAC,CAACkhH,UAAAA,CAAW/uH,GAAG,IAAI,IAAIoN,EAAE,EAAEA,EAAEpN,EAAEgvH,QAAQ3yH,OAAO+Q,IAAIkJ,KAAKsqG,IAAItK,OAAOrhD,OAAOj1D,EAAEgvH,QAAQ5hH,IAAIpN,EAAEgvH,QAAQ3yH,OAAO,CAAC,CAAC44D,MAAAA,CAAOj1D,GAAG,IAAIoN,EAAEkJ,KAAKq6D,KAAK3wE,IAAG,EAAGsE,EAAEu7G,aAAazyG,EAAE,eAAepN,uBAAuB,IAAIiN,EAAEG,EAAEwhH,QAAQnmH,QAAQ2E,GAAGA,EAAEwhH,QAAQpnG,OAAOva,EAAE,GAAGqJ,KAAKy4G,WAAW3hH,GAAGA,EAAEuhH,QAAO,EAAGrqH,EAAE2wD,QAAQ7nD,EAAEuhH,OAAOr4G,KAAKvX,QAAQ,CAAC0iC,MAAAA,CAAOzhC,GAAG,IAAIoN,EAAEkJ,KAAKq6D,KAAK3wE,EAAE7B,MAAM,OAAOiP,GAAGkJ,KAAKy4G,WAAW3hH,GAAGtQ,OAAO4/E,OAAOtvE,EAAEpN,GAAGsW,KAAKm4G,SAASn4G,KAAK24G,UAAU7hH,GAAE,GAAIkJ,KAAKvX,SAASqO,GAAGkJ,KAAKqmE,IAAI38E,EAAE,CAAC28E,GAAAA,CAAI38E,GAAiB,OAAd1B,UAAAjC,OAAA,QAAAmN,IAAAlL,UAAA,GAAAA,UAAA,GAACgY,KAAKw/F,QAAiB/0F,KAAK/gB,GAAGsW,KAAKm4G,SAASn4G,KAAK24G,UAAUjvH,GAAGsW,KAAKvX,SAASiB,CAAC,CAACkvH,WAAAA,CAAYlvH,GAAG,IAAIsW,KAAKs2C,MAAMtkC,IAAItoB,EAAE4uH,SAAS,OAAO,IAAIxhH,EAAEkJ,KAAKs2C,MAAMx1C,IAAIpX,EAAE4uH,UAAUzV,MAAMlsG,EAAEupG,OAAO2W,UAAUjxH,GAAGE,aAAao+G,oBAAoB3sG,IAAIyI,KAAKsqG,IAAItkH,GAAE,EAAGgI,EAAEpC,eAAe,QAAO,EAAGoC,EAAEghH,UAAUhpH,EAAE,SAAS,GAAGuR,QAAO,EAAGvJ,EAAEo+G,UAAUpmH,EAAE,qBAAoB,EAAGgI,EAAEo+G,UAAUpmH,EAAE,yBAAyB,IAAIqH,GAAE,EAAGW,EAAE8rD,QAAQ9zD,EAAE,6CAA6C4Q,GAAE,EAAG5I,EAAEpC,eAAe,QAAO,EAAGoC,EAAEo+G,UAAUx1G,EAAE,+BAA8B,EAAG5I,EAAE8rD,QAAQljD,EAAEhR,IAAG,EAAGoI,EAAE8rD,QAAQzsD,EAAEuJ,IAAG,EAAG5I,EAAE8rD,QAAQzsD,EAAE3D,EAAEopH,QAAQ3R,MAAM,IAAIh0G,EAAEwJ,EAAE3Q,EAAE,SAAQ,IAAIga,KAAKvX,OAAOiB,EAAE6uH,YAAW7uH,EAAEopH,QAAQ4F,QAAQjuG,KAAKtd,IAAG,EAAGa,EAAE8rD,QAAQhjD,EAAE9Q,EAAE,CAAC2yH,SAAAA,CAAUjvH,GAAO,IAALoN,EAAC9O,UAAAjC,OAAA,QAAAmN,IAAAlL,UAAA,IAAAA,UAAA,GAAK,IAAIgY,KAAKs2C,MAAMtkC,IAAItoB,EAAE4uH,SAAS,OAAO,IAAI3hH,EAAEqJ,KAAKs2C,MAAMx1C,IAAIpX,EAAE4uH,SAAS1yH,EAAE8D,EAAE2uH,MAAM9gH,EAAE,YAAW,EAAGvJ,EAAEgkB,KAAKtoB,EAAE,YAAY6N,EAAE,WAAU,EAAGvJ,EAAEgkB,KAAKtoB,EAAE,WAAW6N,EAAE,SAAS,IAAI2oG,MAAMl6G,EAAE68G,MAAMx1G,EAAEvH,YAAY8Q,GAAGoJ,KAAKsqG,IAAIn9G,GAAE,EAAGa,EAAEpC,eAAe,QAAO,EAAGoC,EAAEo+G,UAAUj/G,EAAE,qBAAoB,EAAGa,EAAEghH,UAAU7hH,EAAE,SAAS,GAAGyJ,EAAEstG,yBAAyB/2G,EAAEujG,QAAQ7oG,KAAK6B,EAAE7B,MAAM,GAAGsF,EAAEujG,QAAQl/F,MAAM9H,EAAE8H,OAAO,GAAG,IAAI3D,GAAE,EAAGG,EAAE8rD,QAAQ3sD,EAAE,6CAA6CK,GAAE,EAAGQ,EAAE8rD,QAAQ3sD,EAAE,8CAA8CuK,GAAE,EAAG1J,EAAEpC,eAAe,OAAO,QAAO,EAAGoC,EAAEo+G,UAAU10G,EAAE,8BAA8BH,GAAG,IAAI,SAAS,IAAI,SAAQ,EAAGvJ,EAAE8rD,QAAQpiD,EAAEhO,EAAEmvH,MAAM7yH,EAAEyJ,QAAQ,MAAM,IAAI,WAAW/F,EAAEigH,UAAU5jH,QAAO,EAAGiI,EAAE8rD,QAAQpiD,EAAEhO,EAAEmvH,MAAM7yH,EAAEyJ,SAAQ,EAAGzB,EAAE8rD,QAAQpiD,EAAE1R,EAAE+sH,QAAO,EAAG/kH,EAAE8rD,QAAQjsD,EAAE6J,IAAG,EAAG1J,EAAE4/G,KAAKlkH,EAAE,QAAQ,CAAC89E,cAAa,EAAG1mE,IAAIA,IAAIpJ,KAAI,EAAG1J,EAAE4/G,KAAKlkH,EAAE,OAAO,CAAC89E,cAAa,EAAG1mE,IAAIA,IAAIpJ,EAAEgyE,UAAUnmE,GAAAA,CAAI7Z,GAAGgO,EAAEgyE,UAAU,IAAG,EAAG17E,EAAE8rD,QAAQpiD,EAAEhO,EAAE,IAAI,IAAIqE,GAAE,EAAGC,EAAEpC,eAAe,QAAO,EAAGoC,EAAEo+G,UAAUr+G,EAAE,+BAA8B,EAAGC,EAAE8rD,QAAQ/rD,EAAErE,EAAEy3G,MAAM,KAAI,EAAGnzG,EAAE8rD,QAAQjsD,EAAEE,IAAG,EAAGC,EAAE4/G,KAAKlkH,EAAE,QAAQ,CAAC89E,cAAa,EAAG1mE,IAAIA,IAAI/S,KAAI,EAAGC,EAAE4/G,KAAKlkH,EAAE,OAAO,CAAC89E,cAAa,EAAG1mE,IAAIA,IAAI/S,EAAE27E,UAAUnmE,GAAAA,CAAI7Z,GAAGqE,EAAE27E,UAAU,IAAG,EAAG17E,EAAE8rD,QAAQ/rD,EAAErE,EAAE,IAAI,IAAIqD,GAAE,EAAGiB,EAAEpC,eAAe,OAAO,QAAO,EAAGoC,EAAEo+G,UAAUr/G,EAAE,mCAAkC,EAAGiB,EAAE8rD,QAAQ/sD,EAAErD,EAAEggH,SAAS,KAAI,EAAG17G,EAAE8rD,QAAQtsD,EAAET,IAAG,EAAGiB,EAAE4/G,KAAKlkH,EAAE,WAAW,CAAC89E,cAAa,EAAG1mE,IAAIA,IAAI/T,KAAI,EAAGiB,EAAE4/G,KAAKlkH,EAAE,UAAU,CAAC89E,cAAa,EAAG1mE,IAAIA,IAAI/T,EAAE28E,UAAUnmE,GAAAA,CAAI7Z,GAAGqD,EAAE28E,UAAU,IAAG,EAAG17E,EAAE8rD,QAAQ/sD,EAAErD,EAAE,IAAI6N,GAAG,IAAI,SAAS,CAAC,IAAIT,GAAE,EAAG9I,EAAEpC,eAAe,QAAO,EAAGoC,EAAEo+G,UAAUt1G,EAAE,+BAA+B,IAAIH,GAAE,EAAG3I,EAAE8rD,QAAQhjD,EAAE9Q,EAAEgxH,UAAUpxH,GAAE,EAAGoI,EAAE8rD,QAAQhjD,EAAE9Q,EAAEixH,YAAW,EAAGjpH,EAAEghH,UAAUtlH,EAAEmgH,OAAOjkH,EAAE+Q,EAAE,UAAU,SAAQ,EAAG3I,EAAE8rD,QAAQtsD,EAAEsJ,IAAG,EAAG9I,EAAE4/G,KAAKlkH,EAAE,UAAU,CAAC89E,cAAa,EAAG1mE,IAAIA,IAAIhK,IAAI,IAAIS,EAAE7N,EAAEmgH,QAAO,EAAG77G,EAAE4/G,KAAKlkH,EAAE,SAAS,CAAC89E,cAAa,EAAG1mE,IAAIA,IAAIvJ,EAAEgM,GAAAA,CAAI7Z,GAAG6N,EAAE7N,EAAEA,IAAG,EAAGsE,EAAEghH,UAAUppH,EAAE,UAAU,SAAQ,EAAGoI,EAAEghH,UAAUr4G,EAAE,UAAU,SAAQ,EAAG3I,EAAEghH,UAAUppH,EAAE,UAAU,OAAM,EAAGoI,EAAEghH,UAAUr4G,EAAE,UAAU,QAAQ,IAAI,KAAK,CAAC,IAAI,QAAQ,CAAC,IAAIG,GAAE,EAAG9I,EAAEpC,eAAe,QAAO,EAAGoC,EAAEo+G,UAAUt1G,EAAE,+BAA+B,IAAIH,GAAE,EAAG3I,EAAE8rD,QAAQhjD,EAAE,wBAAwBH,EAAEnF,MAAM9H,EAAEwpC,MAAM,GAAGv8B,EAAE0O,IAAI3b,EAAEwpC,MAAM,GAAGv8B,EAAE2O,IAAI5b,EAAEwpC,MAAM,GAAGv8B,EAAEmiH,KAAKpvH,EAAEwpC,MAAM,IAAG,EAAGllC,EAAEo+G,UAAUz1G,EAAE,sBAAqB,EAAG3I,EAAE8rD,QAAQtsD,EAAEsJ,IAAG,EAAG9I,EAAE4/G,KAAKlkH,EAAE,SAAS,CAAC89E,cAAa,EAAG1mE,IAAIA,IAAInK,IAAI,IAAI/Q,EAAE,IAAI8D,EAAEwpC,QAAO,EAAGllC,EAAE4/G,KAAKlkH,EAAE,QAAQ,CAAC89E,cAAa,EAAG1mE,IAAIA,IAAIlb,EAAE2d,GAAAA,CAAI7Z,GAAG9D,EAAE,IAAI8D,GAAGiN,EAAEnF,MAAM9H,EAAE,GAAGiN,EAAE0O,IAAI3b,EAAE,GAAGiN,EAAE2O,IAAI5b,EAAE,GAAGiN,EAAEmiH,KAAKpvH,EAAE,EAAE,GAAG,CAAC,MAAM,IAAI,WAAW,GAAGA,EAAEigH,UAAU5jH,OAAO,CAAC,IAAI2D,GAAE,EAAGsE,EAAEpC,eAAe,QAAO,EAAGoC,EAAEo+G,UAAU1iH,EAAE,gCAA+B,EAAGsE,EAAE8rD,QAAQpwD,EAAE1D,EAAE8wH,aAAY,EAAG9oH,EAAE8rD,QAAQtsD,EAAE9D,EAAE,EAAE,OAAO6N,GAAG,IAAI,SAAS,GAAG7N,EAAEogH,SAAS,CAAC,IAAIhzG,EAAEzJ,EAAEF,EAAE,SAAQmjD,UAAU5mD,EAAEmgH,aAAangH,EAAEogH,SAASljH,KAAKoZ,KAAKsqG,IAAI5gH,EAAEyD,EAAE2J,EAAE,IAAGpN,EAAEgvH,QAAQjuG,KAAK3T,EAAE,CAAC,MAAM,IAAI,QAAQ,GAAGpN,EAAEqvH,OAAO,CAAC,GAAGrvH,EAAEqgH,QAAQ,CAAC,IAAIjzG,EAAEzJ,EAAE3D,EAAEqvH,OAAO,UAASzoE,UAAU5mD,EAAEwpC,MAAM,GAAGxpC,EAAEqvH,OAAOC,cAActvH,EAAEggH,cAAchgH,EAAEqgH,QAAQnjH,KAAKoZ,KAAKsqG,IAAI5gH,EAAEyD,EAAE2J,EAAE,IAAGpN,EAAEgvH,QAAQjuG,KAAK3T,EAAE,CAAC,GAAGpN,EAAEsgH,SAAS,CAAC,IAAIlzG,EAAEzJ,EAAE3D,EAAEqvH,OAAO,SAAQzoE,UAAU5mD,EAAEwpC,MAAM,GAAGxpC,EAAEqvH,OAAOC,cAActvH,EAAEggH,cAAchgH,EAAEsgH,SAASpjH,KAAKoZ,KAAKsqG,IAAI5gH,EAAEyD,EAAE2J,EAAE,IAAGpN,EAAEgvH,QAAQjuG,KAAK3T,EAAE,CAAC,CAAC,MAAM,IAAI,WAAW,CAAC,IAAIA,EAAEzJ,EAAEF,EAAE,SAAQmjD,UAAU5mD,EAAEigH,UAAU5jH,OAAOia,KAAKvX,OAAOiB,EAAEigH,WAAW3pG,KAAK+yG,MAAMrpH,GAAGA,EAAEopH,QAAQlJ,WAAWlgH,EAAEopH,QAAQpJ,cAAchgH,EAAEopH,QAAQlJ,SAAShjH,KAAKoZ,KAAKsqG,IAAI5gH,EAAEyD,EAAE2J,IAAI,IAAGpN,EAAEgvH,QAAQjuG,KAAK3T,GAAGpN,EAAEklB,UAAS,EAAG5gB,EAAEo+G,UAAUj/G,EAAE,cAAc,GAAE,EAAGa,EAAE4/G,KAAKlkH,EAAE,QAAQ,CAAC89E,cAAa,EAAG1mE,IAAIA,IAAI3T,IAAI2J,GAAE,EAAG9I,EAAEk+G,gBAAgB/+G,EAAEvH,IAAG,EAAGoI,EAAE8rD,QAAQnjD,EAAExJ,GAAGzD,EAAE+/G,SAASr3G,YAAW,IAAI1I,EAAE+/G,QAAQ7iH,KAAKoZ,KAAKsqG,IAAI5gH,EAAE2uH,MAAM3uH,IAAG,EAAE,CAACjB,MAAAA,GAAqB,IAAdiB,EAAC1B,UAAAjC,OAAA,QAAAmN,IAAAlL,UAAA,GAAAA,UAAA,GAACgY,KAAKw/F,OAAQ,GAAGx/F,KAAKi4G,OAAOvuH,EAAEsW,KAAKs2C,MAAMtkC,IAAItoB,GAAG,CAAC,IAAIoN,EAAEkJ,KAAKs2C,MAAMx1C,IAAIpX,IAAG,EAAGsE,EAAEklH,cAAcp8G,EAAE,cAAc,KAAK,CAAC,IAAIA,GAAE,EAAG9I,EAAEpC,eAAe,OAAOoU,KAAKs2C,MAAM/yC,IAAI7Z,EAAEoN,IAAG,EAAG9I,EAAEo+G,UAAUt1G,EAAE,sBAAqB,EAAG9I,EAAE8rD,QAAQ95C,KAAK8yG,QAAQh8G,IAAG,EAAG9I,EAAEklH,cAAcp8G,EAAE,eAAepN,EAAE,IAAIopH,SAAS9yG,KAAK44G,YAAYlvH,EAAE,IAAI,IAAI,IAAIoN,EAAE,EAAEA,EAAEpN,EAAE3D,OAAO+Q,IAAIkJ,KAAK24G,UAAUjvH,EAAEoN,GAAG,CAACkJ,KAAK20G,QAAQ,EAAEh+G,EAAEiY,QAAQxhB,CAAC,EAAE,CAAC,SAAS,QAAQ,gBAAgB,QAAQ,iBAAiB,QAAQ,mBAAmB,QAAQ,qBAAqB,QAAQ,WAAW,QAAQ,iDAAiD,UAAU6rH,MAAM,CAAC,SAASvvH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,IAAIy2G,KAAKrpG,EAAEopG,MAAMvpG,EAAE7Q,aAAam+G,mBAAmBr+G,EAAE6/G,KAAKz/G,IAAI0D,EAAE,SAAS2D,EAAE3D,GAAG,OAAOoN,EAAEgK,KAAI,EAAGvJ,EAAEi6G,YAAY9nH,GAAG,CAAC,SAASkN,IAAI,IAAIE,EAAEpN,EAAEk3G,QAAQvmC,KAAK,QAAQ3wE,EAAEm4G,QAAQn4G,EAAEk3G,QAAQmS,MAAMj8G,EAAE,CAAC,MAAM,CAAC/H,MAAMnJ,EAAEiC,KAAK,OAAOs5G,KAAKrqG,EAAEgK,IAAI,cAAc4oG,QAAQr8G,EAAE3D,EAAEm4G,MAAMgX,KAAKliH,EAAEkrG,KAAK8H,SAAS3jH,EAAEupB,KAAIzY,IAAC,CAAItF,MAAMsF,EAAEjP,KAAK,QAAQiP,IAAI8X,QAAQ9X,IAAIpN,EAAEm4G,KAAKV,KAAK9zG,EAAEyJ,OAAM8yG,SAAS9yG,IAAIpN,EAAEm4G,KAAK/qG,EAAEtF,MAAMsF,EAAEqqG,MAAMsI,QAAQA,KAAK7yG,IAAIlN,EAAEoyB,GAAG,QAAO,IAAIllB,KAAI,EAAE,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAASlN,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD,SAAS6N,EAAE7N,GAAG,IAAIy2G,KAAKrpG,EAAEopG,MAAMvpG,EAAE7Q,aAAam+G,mBAAmBr+G,EAAE4/G,aAAajuG,IAAI7N,EAAE,SAAS1D,EAAE0D,GAAG,MAAM,YAAYA,EAAEoN,EAAEgK,IAAI,WAAWpX,CAAC,CAAC,SAAS2D,IAAI,IAAIyJ,EAAEpN,EAAEk3G,QAAQvmC,KAAK,gBAAgB3wE,EAAEugF,eAAevgF,EAAEk3G,QAAQmS,MAAMj8G,EAAE,CAAC,MAAM,CAAC/H,MAAMnJ,EAAEiC,KAAK,eAAes5G,KAAKrqG,EAAEgK,IAAI,gBAAgB+3G,KAAKliH,EAAEszE,YAAYy/B,QAAQ1jH,EAAE0D,EAAEugF,aAAa0/B,SAASpyG,EAAEgY,KAAIzY,IAAC,CAAItF,MAAMsF,EAAEjP,KAAK,gBAAgBiP,IAAI8X,QAAQ9X,IAAIpN,EAAEugF,YAAYk3B,KAAKn7G,EAAE8Q,OAAM8yG,SAAS9yG,IAAIpN,EAAEugF,YAAYnzE,EAAEtF,MAAMsF,EAAEqqG,MAAMsI,QAAQA,KAAKp8G,IAAI3D,EAAEoyB,GAAG,eAAc,IAAIzuB,KAAI,EAAE,CAACzH,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAIY,GAAE,EAAE,CAAC,iDAAiD,UAAU2hH,MAAM,CAAC,SAASxvH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD,SAAS6N,EAAE7N,GAAG,IAAIy2G,KAAKrpG,EAAEopG,MAAMvpG,EAAE7Q,aAAam+G,mBAAmBr+G,EAAE2/G,cAAchuG,IAAI7N,EAAE,SAAS1D,EAAE0D,GAAG,OAAO,IAAIA,EAAEoN,EAAEgK,IAAI,UAAUpX,EAAEogC,QAAQ,EAAE,CAAC,SAASz8B,IAAI,IAAIyJ,EAAEpN,EAAEk3G,QAAQvmC,KAAK,iBAAiB3wE,EAAE65B,gBAAgB75B,EAAEk3G,QAAQmS,MAAMj8G,EAAE,CAAC,MAAM,CAAC/H,MAAMnJ,EAAEiC,KAAK,gBAAgBs5G,KAAKrqG,EAAEgK,IAAI,cAAc4oG,QAAQ1jH,EAAE0D,EAAE65B,cAAcs1F,KAAKliH,EAAE4sB,aAAaomF,SAASpyG,EAAEgY,KAAIzY,IAAC,CAAItF,MAAMsF,EAAEjP,KAAK,iBAAiBiP,IAAI8X,QAAQ9X,IAAIpN,EAAE65B,aAAa49E,KAAKn7G,EAAE8Q,OAAM8yG,SAAS9yG,IAAIpN,EAAE65B,aAAazsB,EAAEtF,MAAMsF,EAAEqqG,MAAMsI,QAAQA,KAAKp8G,IAAI3D,EAAEoyB,GAAG,oBAAmB,IAAIzuB,KAAI,EAAE,CAACzH,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAIY,GAAE,EAAE,CAAC,iDAAiD,UAAU4hH,MAAM,CAAC,SAASzvH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD,SAAS6N,EAAE7N,GAAG,IAAIy2G,KAAKrpG,EAAEopG,MAAMvpG,EAAE7Q,YAAYF,GAAG8D,EAAE,MAAM,CAACqF,MAAMnJ,EAAEq+G,mBAAmBp8G,KAAK,kBAAkBs5G,KAAKrqG,EAAEgK,IAAI,mBAAmB+3G,KAAKliH,EAAE8pG,SAASiJ,QAAQ,KAAKx2E,MAAM,CAAC,GAAG,GAAG,GAAG,IAAI82E,SAASlzG,IAAIpN,EAAE04G,eAAetrG,EAAEo8B,MAAM,GAAGp8B,EAAEo8B,MAAM,GAAG,KAAKu2E,QAAQA,CAAC3yG,EAAEH,KAAKjN,EAAEoyB,GAAG,kBAAiBpyB,IAAIiN,EAAEoiH,OAAOvnH,MAAM9H,EAAEiN,EAAE+yG,QAAQhgH,EAAE,GAAG,GAAE,EAAE,CAAC9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAIY,GAAE,EAAE,CAAC,iDAAiD,UAAU,QAAQ,CAAC,SAAS7N,EAAEoN,EAAEH,GAAGjN,EAAE,kDAAkD01G,kBAAkBzoG,GAAGA,EAAEiY,QAAQ,MAAM9oB,WAAAA,GAAcka,KAAKnY,KAAK,qBAAqBmY,KAAK8iG,SAAS,CAAC,CAAC,CAAChiG,GAAAA,CAAIpX,GAAG,IAAI,IAAIoN,EAAE4pB,KAAK/F,MAAMjuB,OAAO0sH,aAAaC,QAAQr5G,KAAKnY,QAAQ,CAAC,EAAE,OAAO6B,EAAEoN,EAAEpN,GAAGoN,CAAC,CAAC,MAAMA,GAAG,OAAOpN,EAAEsW,KAAK8iG,SAASp5G,GAAGsW,KAAK8iG,QAAQ,CAAC,CAACv/F,GAAAA,CAAI7Z,EAAEoN,GAAG,IAAI,IAAIH,EAAEnQ,OAAO4/E,OAAO,CAAC,EAAEpmE,KAAKc,MAAM,CAAC,CAACpX,GAAGoN,IAAIpK,OAAO0sH,aAAaE,QAAQt5G,KAAKnY,KAAK64B,KAAKC,UAAUhqB,GAAG,CAAC,MAAMA,GAAGqJ,KAAK8iG,SAASp5G,GAAGoN,CAAC,CAAC,CAACyiH,GAAAA,CAAI7vH,GAAG,IAAI,IAAIoN,EAAEkJ,KAAKc,aAAahK,EAAEpN,GAAGgD,OAAO0sH,aAAaE,QAAQt5G,KAAKnY,KAAK64B,KAAKC,UAAU7pB,GAAG,CAAC,MAAMA,UAAUkJ,KAAK8iG,SAASp5G,EAAE,CAAC,CAAC83D,KAAAA,GAAQ,IAAI90D,OAAO0sH,aAAaI,WAAWx5G,KAAKnY,KAAK,CAAC,MAAM6B,GAAGsW,KAAK8iG,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iDAAiD,UAAU,QAAQ,CAAC,SAASp5G,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG,IAAIY,EAAE7N,EAAE,YAAY1D,EAAE0D,EAAE,qBAAqB2D,EAAEzH,EAAEy5G,eAAer5G,GAAG4Q,EAAElN,EAAE,qBAAqByD,EAAEvH,EAAEy5G,eAAezoG,GAAG/I,EAAEnE,EAAE,kBAAkB8D,EAAE5H,EAAEy5G,eAAexxG,GAAG6J,EAAEhO,EAAE,iBAAiBqE,EAAEnI,EAAEy5G,eAAe3nG,GAAG3K,EAAErD,EAAE,UAAUsE,EAAEpI,EAAEy5G,eAAetyG,GAAG4J,EAAEiY,QAAQ,MAAM9oB,WAAAA,CAAY4D,GAAGsW,KAAKsqG,IAAI5gH,EAAEsW,KAAK2B,GAAG,EAAE,IAAI69F,OAAO1oG,GAAGpN,EAAEoN,EAAEurG,kBAAkBvrG,EAAEyqG,QAAQvhG,KAAKqmE,IAAIh5E,EAAEuhB,SAAS9X,EAAE0rG,MAAMjrG,EAAEkwG,UAAUznG,KAAKqmE,IAAIr4E,EAAE4gB,SAAS9X,EAAE4rG,eAAe5rG,EAAEyqG,QAAQvhG,KAAKqmE,IAAI74E,EAAEohB,SAAS9X,EAAE6rG,iBAAiBprG,EAAEkwG,UAAUznG,KAAKqmE,IAAIl5E,EAAEyhB,SAAS9X,EAAE2rG,aAAalrG,EAAEkwG,WAAW3wG,EAAEyqG,QAAQvhG,KAAKqmE,IAAIt4E,EAAE6gB,SAAS,IAAI,IAAIllB,EAAE,EAAEA,EAAEoN,EAAE+pG,QAAQ96G,OAAO2D,IAAIsW,KAAKqmE,IAAIvvE,EAAE+pG,QAAQn3G,GAAG,CAAC28E,GAAAA,CAAI38E,GAAGsW,KAAK2B,IAAI,EAAE,IAAI7K,EAAEpN,EAAE9C,KAAKoZ,KAAKsqG,IAAItqG,KAAKsqG,KAAK,OAAOxzG,aAAa7L,QAAQ6L,EAAE41B,MAAK51B,GAAGkJ,KAAK+mF,KAAKr9F,EAAEoN,KAAIkJ,KAAK+mF,KAAKr9F,EAAEoN,EAAE,CAACiwF,IAAAA,CAAKr9F,EAAEoN,GAAG,IAAIH,EAAEG,GAAGA,EAAEjP,MAAM6B,EAAE7B,MAAM,SAASmY,KAAK2B,KAAK,OAAM,EAAGpK,EAAEgyG,eAAc,EAAGhyG,EAAEya,KAAKhS,KAAKrJ,GAAG,uDAAuDA,MAAK,EAAGY,EAAEq2G,KAAK5tG,KAAKrJ,EAAE,CAACnF,MAAMsF,IAAIkJ,IAAI,EAAE,EAAE,CAAC,WAAW,QAAQ,oBAAoB,QAAQ,oBAAoB,QAAQ,iBAAiB,QAAQ,gBAAgB,QAAQ,SAAS,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAAStW,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,OAAOA,EAAEoyB,GAAG,WAAUhlB,IAAIA,GAAE,EAAGS,EAAEg4G,aAAa7lH,EAAEq2G,SAAS4K,QAAQ,0BAAyB,EAAGpzG,EAAE60G,UAAU1iH,EAAEq2G,SAAS4K,QAAQ,wBAAwB,IAAG,CAAC9iH,KAAK,oBAAoB,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAU4xH,MAAM,CAAC,SAAS/vH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,IAAI5D,YAAYgR,EAAEipG,UAAU4K,QAAQh0G,EAAEitG,OAAOh+G,IAAI8D,EAAE,OAAOA,EAAEoyB,GAAG,iBAAgB91B,IAAI,GAAGA,EAAE,CAAC,IAAIipH,WAAWjpH,EAAEkpH,YAAY7hH,GAAGzH,GAAGiiH,YAAYjxG,EAAE+wG,aAAax6G,GAAGxB,SAASwyF,iBAAiBn4F,EAAEqH,GAAGuJ,EAAEzJ,GAAGnH,EAAEqH,GAAGuJ,EAAEzJ,IAAIiF,YAAW,MAAK,EAAGmF,EAAEy3G,UAAUr4G,EAAE,QAAQ,GAAGxJ,QAAO,EAAGoK,EAAEy3G,UAAUr4G,EAAE,SAAS,GAAGC,QAAO,EAAGW,EAAEy3G,UAAUr4G,EAAE,mBAAmB,QAAO,EAAGY,EAAEy3G,UAAUr4G,EAAE,YAAY,+BAA+BC,SAAQ,EAAGW,EAAE60G,UAAUz1G,EAAE,wBAAwBjN,EAAEm2G,UAAS,EAAGn2G,EAAE+4C,KAAK,SAAS,GAAE3rC,EAAEkuG,sBAAsB,MAAK,EAAGztG,EAAE+4G,UAAU35G,EAAE,2BAA0B,EAAGY,EAAEg4G,aAAa54G,EAAE,wBAAwBjN,EAAEm2G,UAAS,EAAGn2G,EAAE+4C,KAAK,UAAU,IAAG/4C,EAAEoyB,GAAG,cAAaw0B,UAAU,IAAIoV,QAAQowD,aAAatT,KAAK,OAAO,IAAI1rG,EAAE4uD,OAAOowD,YAAYnuH,KAAK,GAAG+B,EAAE,CAAC,IAAIulH,WAAWvlH,EAAEwlH,YAAYlpH,GAAGJ,GAAGiiH,YAAYx6G,EAAEs6G,aAAa/wG,GAAGjL,SAASwyF,gBAAgB,GAAGz0F,EAAE1D,GAAGqH,EAAEuJ,GAAGlN,EAAE1D,GAAGqH,EAAEuJ,EAAE,CAAC,IAAIlN,EAAEoN,EAAEyxB,WAAW,YAAY,YAAY,iBAAiBm9B,OAAOowD,YAAYtT,KAAK94G,IAAG,EAAG6N,EAAE60G,UAAUz1G,EAAE,kCAAkC,CAAC,MAAK,EAAGY,EAAE+4G,UAAU35G,EAAE,2CAA2C+uD,OAAOowD,YAAYtT,KAAK1rG,IAAG,EAAGS,EAAEg4G,aAAa54G,EAAE,mCAAmC,IAAG,CAAC9O,KAAK,kBAAkB,SAAIwzC,GAAQ,OAAM,EAAG9jC,EAAE+4G,UAAU35G,EAAE,uBAAuB,EAAE,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAU+iH,MAAM,CAAC,SAAShwH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,IAAIy2G,KAAKrpG,EAAEopG,MAAMvpG,EAAEspG,QAAQr6G,EAAEE,YAAYE,EAAE68G,MAAMx1G,EAAE0yG,UAAU8K,QAAQj0G,IAAIlN,EAAEyD,EAAEzD,EAAE42G,OAAOj6B,IAAI,CAACx+E,KAAK,gBAAgBs5G,KAAK,oIAAoItzG,GAAE,EAAG0J,EAAEI,OAAO,0BAA0BxK,GAAGK,GAAE,EAAG+J,EAAEI,OAAO,0BAA0BxK,GAAGuK,GAAE,EAAGH,EAAEI,OAAO,2BAA2BxK,IAAG,EAAGoK,EAAEuiD,QAAQpiD,EAAEf,EAAEk+D,OAAO,IAAI9mE,EAAE,KAAK,SAAShB,IAAI,IAAI4J,GAAG/Q,EAAEkb,IAAI,UAAU,CAAC,GAAGpX,EAAE81G,OAAO79F,IAAIjY,EAAE81G,OAAO1zG,KAAK09B,aAAaz7B,IAAG,EAAGwJ,EAAEy3G,UAAU7hH,EAAE,UAAU,QAAQwJ,GAAGA,GAAG3Q,EAAEu+G,qBAAoB,EAAGhtG,EAAEy3G,UAAU7hH,EAAE,UAAU,QAAQU,EAAEulH,UAAU,GAAGt8G,EAAEgK,IAAI,iBAAgB,EAAGvJ,EAAEi3G,cAAc73G,KAAKnJ,EAAE4lH,UAAUt8G,EAAEgK,IAAI,aAAazT,EAAEqK,EAAE,SAAQ,MAAK,EAAGH,EAAEy3G,UAAU7hH,EAAE,UAAU,OAAO,IAAGE,EAAEG,EAAE,SAAQ,KAAK9D,EAAE+kH,KAAK93G,EAAEjN,EAAEwkH,QAAO,EAAG32G,EAAEy3G,UAAUp4G,EAAE,UAAU,SAAQ,EAAGW,EAAEy3G,UAAU7hH,EAAE,UAAU,OAAO,IAAGzD,EAAE0oD,KAAK,oBAAmB,KAAKrkD,EAAEqE,YAAW,MAAK,EAAGmF,EAAEy3G,UAAU7hH,EAAE,UAAU,OAAO,GAAEnH,EAAEw+G,sBAAsB,IAAG,CAAC,OAAO96G,EAAEoyB,GAAG,oBAAmB,KAAK,GAAGpyB,EAAE4kH,QAAQ,CAAC,IAAIx3G,EAAElR,EAAEkb,IAAI,UAAU,CAAC,EAAEnK,EAAEnQ,OAAOP,KAAK6Q,GAAGH,EAAE5Q,OAAOC,EAAEs+G,0BAA0BxtG,EAAEH,EAAE,IAAIG,EAAEpN,EAAE81G,OAAO79F,IAAIjY,EAAE81G,OAAO1zG,KAAKpC,EAAEg5B,YAAY98B,EAAE2d,IAAI,QAAQzM,EAAE,KAAIpN,EAAEoyB,GAAG,QAAQ/uB,GAAGrD,EAAEoyB,GAAG,UAAU/uB,GAAG,CAAClF,KAAK,gBAAgB,SAAI8xH,GAAQ,OAAO/zH,EAAEkb,IAAI,UAAU,CAAC,CAAC,EAAE0gD,MAAMA,IAAI57D,EAAE2zH,IAAI,SAASrlC,OAAOxqF,GAAG,IAAIoN,EAAElR,EAAEkb,IAAI,UAAU,CAAC,EAAE,cAAchK,EAAEpN,GAAG9D,EAAE2d,IAAI,QAAQzM,GAAGA,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAU8iH,MAAM,CAAC,SAASlwH,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,IAAI5D,YAAYgR,EAAE+rG,MAAMlsG,EAAEopG,UAAU4K,QAAQ/kH,EAAEg+G,OAAO59G,IAAI0D,EAAE2D,EAAE,KAAKuJ,GAAE,EAAGzJ,EAAE,EAAEU,EAAEA,KAAK27B,aAAan8B,GAAGuJ,IAAIA,GAAE,EAAGlN,EAAE65B,aAAap2B,GAAE,EAAGoK,EAAEg4G,aAAa3pH,EAAE,oBAAoB,EAAE,OAAO+Q,EAAE3Q,EAAE,cAAa2Q,IAAI,IAAIA,EAAEwlF,QAAQp2F,QAAQ2D,EAAE4kH,UAAU5kH,EAAE+1G,SAASpyG,EAAE+E,YAAW,KAAKwE,GAAE,EAAGzJ,EAAEzD,EAAE65B,aAAa75B,EAAE65B,aAAazsB,EAAEouG,oBAAmB,EAAG3tG,EAAE60G,UAAUxmH,EAAE,mBAAmB,GAAEkR,EAAEquG,mBAAmB,IAAGxuG,EAAEhL,SAAS,YAAYkC,GAAG8I,EAAEhL,SAAS,WAAWkC,GAAG,CAAChG,KAAK,cAAc,SAAIwzC,GAAQ,OAAM,EAAG9jC,EAAE+4G,UAAU1qH,EAAE,mBAAmB,EAAE,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,UAAU,QAAQ,CAAC,SAAS8D,EAAEoN,EAAEH,GAAG,IAAI/Q,EAAE8D,EAAE,kDAAkD9D,EAAEw5G,kBAAkBzoG,GAAG/Q,EAAEohH,OAAOrwG,EAAE,WAAU,IAAI3Q,IAAG,IAAIuR,EAAE7N,EAAE,YAAY,SAAS1D,EAAE0D,GAAG,IAAI42G,OAAOxpG,EAAEopG,MAAMvpG,EAAEopG,UAAU4K,QAAQ/kH,IAAI8D,EAAE,SAAS1D,IAAI,OAAM,EAAGuR,EAAE+4G,UAAU1qH,EAAE,WAAW,CAAC,SAASyH,KAAI,EAAGkK,EAAE60G,UAAUxmH,EAAE,YAAY8D,EAAE+1G,QAAO,EAAG/1G,EAAE+4C,KAAK,QAAO,EAAG,CAAC,SAAS7rC,KAAI,EAAGW,EAAEg4G,aAAa3pH,EAAE,YAAY8D,EAAE+1G,QAAO,EAAG/1G,EAAE+4C,KAAK,QAAO,EAAG,CAAC,OAAO3rC,EAAEuvE,IAAI,CAACx+E,KAAK,OAAO4hH,OAAAA,CAAQ3yG,GAAG,IAAIlR,GAAE,EAAG2R,EAAEuiD,QAAQhjD,EAAEH,EAAE6rG,MAAMx8G,GAAE,EAAGuR,EAAEuiD,QAAQhjD,EAAEH,EAAEogH,SAAQ,EAAGx/G,EAAEy3G,UAAUppH,EAAE,UAAU,QAAQ8D,EAAEoyB,GAAG,QAAOpyB,IAAIA,IAAG,EAAG6N,EAAEy3G,UAAUppH,EAAE,UAAU,gBAAe,EAAG2R,EAAEy3G,UAAUhpH,EAAE,UAAU,WAAU,EAAGuR,EAAEy3G,UAAUppH,EAAE,UAAU,SAAQ,EAAG2R,EAAEy3G,UAAUhpH,EAAE,UAAU,eAAe,GAAE,EAAE6iH,KAAAA,GAAQ7iH,IAAI4Q,IAAIvJ,GAAG,IAAI,CAACxF,KAAK,OAAO,SAAIwzC,GAAQ,OAAOr1C,GAAG,EAAE,SAAIq1C,CAAM7pC,GAAOA,EAAMnE,IAAIuJ,GAAG,EAAE,CAAC,EAAE,CAAC,WAAW,QAAQ,iDAAiD,WAAW,CAAC,SAAS,QAAQ,kDCLx+xJ,IAAIjN,EAAQ5C,EAAQ,MAIhB8yH,EAAoB,CACtB,MAAO,gBAAiB,iBAAkB,eAAgB,OAC1D,UAAW,OAAQ,OAAQ,oBAAqB,sBAChD,gBAAiB,WAAY,eAAgB,sBAC7C,UAAW,cAAe,cAgB5Bp0H,EAAOC,QAAU,SAAsBsK,GACrC,IACInJ,EACAwM,EACArN,EAHA6G,EAAS,CAAC,EAKd,OAAKmD,GAELrG,EAAMyJ,QAAQpD,EAAQ+H,MAAM,OAAO,SAAgBqvD,GAKjD,GAJAphE,EAAIohE,EAAKj1D,QAAQ,KACjBtL,EAAM8C,EAAMoN,KAAKqwD,EAAK0yD,OAAO,EAAG9zH,IAAIsN,cACpCD,EAAM1J,EAAMoN,KAAKqwD,EAAK0yD,OAAO9zH,EAAI,IAE7Ba,EAAK,CACP,GAAIgG,EAAOhG,IAAQgzH,EAAkB1nH,QAAQtL,IAAQ,EACnD,OAGAgG,EAAOhG,GADG,eAARA,GACagG,EAAOhG,GAAOgG,EAAOhG,GAAO,IAAIyC,OAAO,CAAC+J,IAEzCxG,EAAOhG,GAAOgG,EAAOhG,GAAO,KAAOwM,EAAMA,CAE3D,CACF,IAEOxG,GAnBgBA,CAoBzB,YCpDApH,EAAOC,QAAU,CACf,QAAW,uCCCb,IAAImF,EAAa9D,EAAQ,MASzBtB,EAAOC,QAAU,SAAgBgK,EAASC,EAAQyB,GAChD,IAAIqtG,EAAiBrtG,EAAS3B,OAAOgvG,eAChCrtG,EAASE,QAAWmtG,IAAkBA,EAAertG,EAASE,QAGjE3B,EAAO,IAAI9E,EACT,mCAAqCuG,EAASE,OAC9C,CAACzG,EAAWoJ,gBAAiBpJ,EAAWyzG,kBAAkBhmG,KAAK2Q,MAAM7X,EAASE,OAAS,KAAO,GAC9FF,EAAS3B,OACT2B,EAAShH,QACTgH,IAPF1B,EAAQ0B,EAUZ,iJCgIO,SAAwBI,GAC7B,IAAAuoH,EAAAC,GAA0B,EAAAC,EAAAxlH,UAASjD,GAAnC,GAAO6pC,EAAP0+E,EAAA,GAAcG,EAAdH,EAAA,GAIA,OAFAI,GAAqB,kBAAMD,EAAS1oH,EAAf,GAAuB,CAACA,IAEtC6pC,CACR,4CA9JD,IAAA4+E,EAAAlzH,EAAA,MACAqzH,EAAAC,EAAAtzH,EAAA,OACAuzH,EAAAD,EAAAtzH,EAAA,OACAwzH,EAAAxzH,EAAA,MACAyzH,EAAAzzH,EAAA,ojEA8B6B,SAC3B0zH,EACAC,EACAjrH,GAEA,IAAAkrH,EAAAX,GAAoC,EAAAC,EAAAxlH,UAAsB,IAA1D,GAAOmmH,EAAPD,EAAA,GAAmBE,EAAnBF,EAAA,GA6BA,OA1BA,EAAAV,EAAAvlH,YAAU,WACRmmH,GAAc,SAACD,GACb,IAAME,EAAiBJ,EAASE,EAAW70H,OAE3C,OAAI+0H,EAAiB,EACZ,GAAPxxH,OAAAyxH,EAAWH,GAAXG,EAnCiB,SACvBN,EACAC,EACAjrH,GAEA,IAAKgrH,EAAUrsH,QAAS,MAAO,GAI/B,IAFA,IAAMwsH,EAA0B,GAEvB50H,EAAI,EAAGA,EAAI00H,EAAQ10H,IAC1B40H,EAAWnwG,KAAK,IAAI6vG,EAAA,QAAUG,EAAUrsH,QAASqB,IAGnD,OAAOmrH,CACR,CAqBiCI,CAAiBP,EAAWK,EAAgBrrH,KAGpEqrH,EAAiB,EACZF,EAAWx6G,MAAM,EAAGs6G,GAGtBE,CACR,GACF,GAAE,CAACF,EAAQD,EAAWhrH,KAGvB,EAAAwqH,EAAAvlH,YAAU,WACRmmH,GAAc,SAACD,GAAD,OACZA,EAAWrrG,KAAI,SAAC0rG,GAEd,OADAA,EAAUC,aAAazrH,GAChBwrH,CACR,GAJW,GAMf,GAAE,CAACxrH,IAEGmrH,CACR,qBAO+B,SAACntH,GAC/B,IAAA0tH,EAAAnB,GAAwB,EAAAC,EAAAxlH,WAAS,EAAA+lH,EAAAY,SAAQ3tH,EAAIW,UAA7C,GAAOoe,EAAP2uG,EAAA,GAAaE,EAAbF,EAAA,GAEMG,GAAgB,EAAArB,EAAArtB,cAAY,WAC5Bn/F,EAAIW,SACNitH,GAAQ,EAAAb,EAAAY,SAAQ3tH,EAAIW,SAEvB,GAAE,CAACX,IAoBJ,OAlBA,EAAAwsH,EAAAtlH,kBAAgB,WACd,IAAQ4mH,EAAmB7uH,OAAnB6uH,eAER,GAAK9tH,EAAIW,QAAT,CAGA,GAFAktH,IAE8B,oBAAnBC,EAA+B,CACxC,IAAMC,EAAiB,IAAID,EAAeD,GAG1C,OAFAE,EAAeC,QAAQhuH,EAAIW,SAEpB,kBAAMotH,EAAeE,YAArB,CACR,CAGC,OAFAhvH,OAAOgH,iBAAiB,SAAU4nH,GAE3B,kBAAM5uH,OAAO4D,oBAAoB,SAAUgrH,EAA3C,CAXe,CAazB,GAAE,CAAC7tH,EAAK6tH,IAEF9uG,CACR,EAyBM,SAAS2tG,EAAqBwB,EAA8BjvB,GACjE,IAAMj/F,GAAM,EAAAwsH,EAAA/sB,QAA6BR,GAQzC,OALK,EAAA0tB,EAAA,SAAQ1tB,EAAMj/F,EAAIW,WACrBX,EAAIW,QAAUs+F,IAIT,EAAAutB,EAAAvlH,WAAUinH,EAAQluH,EAAIW,QAC9B,oBA7B+B,SAACwtH,GAS/B,OARe,EAAA3B,EAAAjtB,UACb,kBAAA6uB,EAAAA,EAAC,CAAD,EACKtB,EAAAuB,mBACCF,GAAa,CAAC,EAFpB,GAIA,CAACA,GAIJ,yBCtHDn2H,EAAOC,QAAU,SAAuBoG,GACtC,IAAI8tB,EAAQ,4BAA4BniB,KAAK3L,GAC7C,OAAO8tB,GAASA,EAAM,IAAM,EAC9B,gRCLA,IAAAqgG,4bAAA8B,CAAAh1H,EAAA,OACAwzH,EAAAxzH,EAAA,MACAi1H,EAAAj1H,EAAA,MACAuzH,EAAAvzH,EAAA,sIAeA,MAAiB,WAUsB,IAAAk1H,EAAAj0H,UAAAjC,OAAA,QAAAmN,IAAAlL,UAAA,GAAAA,UAAA,GAApB,CAAC,EAAmBk0H,EAAAD,EATrC55D,MAAAA,OASqC,IAAA65D,EAT7B5B,EAAArwH,cAAco4D,MASe65D,EAAAC,EAAAF,EARrCG,gBAAAA,OAQqC,IAAAD,EARnB7B,EAAArwH,cAAcmyH,gBAQKD,EAAAE,EAAAJ,EAPrCK,OAAAA,OAOqC,IAAAD,EAP5B/B,EAAArwH,cAAcqyH,OAOcD,EAAAE,EAAAN,EANrCO,MAAAA,OAMqC,IAAAD,EAN7BjC,EAAArwH,cAAcuyH,MAMeD,EAAAE,EAAAR,EALrCS,KAAAA,OAKqC,IAAAD,EAL9BnC,EAAArwH,cAAcyyH,KAKgBD,EAAAE,EAAAV,EAJrCW,cAAAA,OAIqC,IAAAD,EAJrBrC,EAAArwH,cAAc2yH,cAIOD,EAAAE,EAAAZ,EAHrCa,eAAAA,OAGqC,IAAAD,EAHpB,IAGoBA,EAFrCE,EAEqCd,EAFrCc,OACAjwC,EACqCmvC,EADrCnvC,MAEMkwC,GAAc,EAAAhB,EAAAiB,kBAAiBnwC,GAE/B2tC,GAAY,EAAAR,EAAA/sB,QAA0B,MACtCgwB,GAAa,EAAAlB,EAAAmB,kBAAiB1C,GAC9B2C,GAAiB,EAAAnD,EAAA/sB,QAAO,GAExBmwB,GAAa,EAAApD,EAAA/sB,QAAO3rF,KAAK6H,OACzB3Z,GAAS,EAAAusH,EAAAsB,aAA4B,CAAEj7D,MAAAA,EAAO+5D,gBAAAA,EAAiBE,OAAAA,EAAQE,MAAAA,EAAOE,KAAAA,EAAME,cAAAA,EAAeG,OAAAA,IACnGnC,GAAa,EAAAoB,EAAAuB,eAAc9C,EAAWqC,EAAgBrtH,GAEtDhH,GAAS,EAAAwxH,EAAArtB,cACb,WAAsB,IAArB4wB,EAAqBx1H,UAAAjC,OAAA,QAAAmN,IAAAlL,UAAA,GAAAA,UAAA,GAAN,EACRy1H,EAAShD,EAAUrsH,QACzB,GAAIqvH,EAAQ,CAEV7C,EAAWxnH,SAAQ,SAAC6nH,GAAD,OAAeA,EAAU9vF,OAAOsyF,EAAQD,EAAxC,IAGnB,IAAM/W,EAAMgX,EAAOrV,WAAW,MAC1B3B,IACFA,EAAIiX,aAAa,EAAG,EAAG,EAAG,EAAG,EAAG,GAChCjX,EAAIkX,UAAU,EAAG,EAAGF,EAAOG,YAAaH,EAAOI,cAE/CjD,EAAWxnH,SAAQ,SAAC6nH,GAAD,OAAeA,EAAU6C,KAAKrX,EAA9B,IAEtB,CACF,GACD,CAACmU,IAGGhZ,GAAO,EAAAqY,EAAArtB,cAAY,WAEvB,IAAMxjF,EAAM7H,KAAK6H,MACX20G,EAAWx8G,KAAK6H,MAAQi0G,EAAWjvH,QACzCivH,EAAWjvH,QAAUgb,EAGrB,IAAMo0G,EAAeO,EAAWxD,EAAAyD,gBAEhCv1H,EAAO+0H,GAEPJ,EAAehvH,QAAUmoH,sBAAsB3U,EAChD,GAAE,CAACn5G,IAOJ,OALA,EAAAwxH,EAAAvlH,YAAU,WAER,OADAktG,IACO,kBAAM4U,qBAAqB4G,EAAehvH,QAA1C,CACR,GAAE,CAACwzG,IAGFqY,EAAA,QAAAruH,cAAA,UACE6B,IAAKgtH,EACLzrH,OAAQkuH,EAAWluH,OACnBD,MAAOmuH,EAAWnuH,MAClB+9E,MAAOkwC,EACP,cAAY,kBAGjB,mCC9EY,IAAI7vH,EAAEF,OAAOC,IAAI,iBAAiBG,EAAEJ,OAAOC,IAAI,gBAAgBM,EAAEP,OAAOC,IAAI,kBAAkBU,EAAEX,OAAOC,IAAI,qBAAqByJ,EAAE1J,OAAOC,IAAI,kBAAkB4J,EAAE7J,OAAOC,IAAI,kBAAkBwK,EAAEzK,OAAOC,IAAI,iBAAiB6hB,EAAE9hB,OAAOC,IAAI,qBAAqB0S,EAAE3S,OAAOC,IAAI,kBAAkBqH,EAAEtH,OAAOC,IAAI,cAAcsH,EAAEvH,OAAOC,IAAI,cAAc8c,EAAE/c,OAAO85E,SACzW,IAAIjkE,EAAE,CAAC2qF,UAAU,WAAW,OAAM,CAAE,EAAEI,mBAAmB,WAAW,EAAED,oBAAoB,WAAW,EAAED,gBAAgB,WAAW,GAAG9tF,EAAErZ,OAAO4/E,OAAOzmE,EAAE,CAAC,EAAE,SAASvH,EAAExS,EAAEC,EAAE6D,GAAGsW,KAAK9R,MAAMtI,EAAEoa,KAAK9V,QAAQrE,EAAEma,KAAKqmF,KAAK1mF,EAAEK,KAAKguF,QAAQtkG,GAAGoZ,CAAC,CACwI,SAAS7B,IAAI,CAAyB,SAASuC,EAAE5d,EAAEC,EAAE6D,GAAGsW,KAAK9R,MAAMtI,EAAEoa,KAAK9V,QAAQrE,EAAEma,KAAKqmF,KAAK1mF,EAAEK,KAAKguF,QAAQtkG,GAAGoZ,CAAC,CADxP1K,EAAE3R,UAAU2xG,iBAAiB,CAAC,EACpQhgG,EAAE3R,UAAUyzH,SAAS,SAASt0H,EAAEC,GAAG,GAAG,kBAAkBD,GAAG,oBAAoBA,GAAG,MAAMA,EAAE,MAAMsR,MAAM,yHAAyH8I,KAAKguF,QAAQL,gBAAgB3tF,KAAKpa,EAAEC,EAAE,WAAW,EAAEuS,EAAE3R,UAAU4O,YAAY,SAASzP,GAAGoa,KAAKguF,QAAQH,mBAAmB7tF,KAAKpa,EAAE,cAAc,EAAgBqb,EAAExa,UAAU2R,EAAE3R,UAAsF,IAAI0f,EAAE3C,EAAE/c,UAAU,IAAIwa,EACrfkF,EAAErgB,YAAY0d,EAAE3D,EAAEsG,EAAE/N,EAAE3R,WAAW0f,EAAE4nF,sBAAqB,EAAG,IAAItuF,EAAEvZ,MAAMC,QAAQ+jB,EAAE1jB,OAAOC,UAAUE,eAAeif,EAAE,CAACxX,QAAQ,MAAM+N,EAAE,CAACtV,KAAI,EAAG4G,KAAI,EAAGC,QAAO,EAAGC,UAAS,GACtK,SAASoU,EAAEnc,EAAEC,EAAE6D,GAAG,IAAIqE,EAAEF,EAAE,CAAC,EAAEb,EAAE,KAAKgB,EAAE,KAAK,GAAG,MAAMnI,EAAE,IAAIkI,UAAK,IAASlI,EAAE4H,MAAMO,EAAEnI,EAAE4H,UAAK,IAAS5H,EAAEgB,MAAMmG,EAAE,GAAGnH,EAAEgB,KAAKhB,EAAEqkB,EAAEtjB,KAAKf,EAAEkI,KAAKoO,EAAExV,eAAeoH,KAAKF,EAAEE,GAAGlI,EAAEkI,IAAI,IAAID,EAAE9F,UAAUjC,OAAO,EAAE,GAAG,IAAI+H,EAAED,EAAEm7E,SAASt/E,OAAO,GAAG,EAAEoE,EAAE,CAAC,IAAI,IAAIf,EAAE7G,MAAM4H,GAAGV,EAAE,EAAEA,EAAEU,EAAEV,IAAIL,EAAEK,GAAGpF,UAAUoF,EAAE,GAAGS,EAAEm7E,SAASj8E,CAAC,CAAC,GAAGnH,GAAGA,EAAEwB,aAAa,IAAI2G,KAAKD,EAAElI,EAAEwB,kBAAe,IAASyG,EAAEE,KAAKF,EAAEE,GAAGD,EAAEC,IAAI,MAAM,CAACE,SAASd,EAAExF,KAAK/B,EAAEiB,IAAImG,EAAES,IAAIO,EAAEE,MAAML,EAAEM,OAAOyX,EAAExX,QAAQ,CAChV,SAASuU,EAAE/c,GAAG,MAAM,kBAAkBA,GAAG,OAAOA,GAAGA,EAAEqI,WAAWd,CAAC,CAAoG,IAAI6T,EAAE,OAAO,SAASiJ,EAAErkB,EAAEC,GAAG,MAAM,kBAAkBD,GAAG,OAAOA,GAAG,MAAMA,EAAEiB,IAA7K,SAAgBjB,GAAG,IAAIC,EAAE,CAAC,IAAI,KAAK,IAAI,MAAM,MAAM,IAAID,EAAEsG,QAAQ,SAAQ,SAAStG,GAAG,OAAOC,EAAED,EAAE,GAAE,CAA+Ew9G,CAAO,GAAGx9G,EAAEiB,KAAKhB,EAAEa,SAAS,GAAG,CAC/W,SAAS0Y,EAAExZ,EAAEC,EAAE6D,EAAEqE,EAAEF,GAAG,IAAIb,SAASpH,EAAK,cAAcoH,GAAG,YAAYA,IAAEpH,EAAE,MAAK,IAAIoI,GAAE,EAAG,GAAG,OAAOpI,EAAEoI,GAAE,OAAQ,OAAOhB,GAAG,IAAK,SAAS,IAAK,SAASgB,GAAE,EAAG,MAAM,IAAK,SAAS,OAAOpI,EAAEqI,UAAU,KAAKd,EAAE,KAAKE,EAAEW,GAAE,GAAI,GAAGA,EAAE,OAAWH,EAAEA,EAANG,EAAEpI,GAASA,EAAE,KAAKmI,EAAE,IAAIkc,EAAEjc,EAAE,GAAGD,EAAE0R,EAAE5R,IAAInE,EAAE,GAAG,MAAM9D,IAAI8D,EAAE9D,EAAEsG,QAAQ8U,EAAE,OAAO,KAAK5B,EAAEvR,EAAEhI,EAAE6D,EAAE,IAAG,SAAS9D,GAAG,OAAOA,CAAC,KAAI,MAAMiI,IAAI8U,EAAE9U,KAAKA,EADnW,SAAWjI,EAAEC,GAAG,MAAM,CAACoI,SAASd,EAAExF,KAAK/B,EAAE+B,KAAKd,IAAIhB,EAAE4H,IAAI7H,EAAE6H,IAAIS,MAAMtI,EAAEsI,MAAMC,OAAOvI,EAAEuI,OAAO,CACyQyU,CAAE/U,EAAEnE,IAAImE,EAAEhH,KAAKmH,GAAGA,EAAEnH,MAAMgH,EAAEhH,IAAI,IAAI,GAAGgH,EAAEhH,KAAKqF,QAAQ8U,EAAE,OAAO,KAAKpb,IAAIC,EAAE4kB,KAAK5c,IAAI,EAAyB,GAAvBG,EAAE,EAAED,EAAE,KAAKA,EAAE,IAAIA,EAAE,IAAO0R,EAAE7Z,GAAG,IAAI,IAAIkI,EAAE,EAAEA,EAAElI,EAAEG,OAAO+H,IAAI,CAC/e,IAAIf,EAAEgB,EAAEkc,EADwejd,EACrfpH,EAAEkI,GAAeA,GAAGE,GAAGoR,EAAEpS,EAAEnH,EAAE6D,EAAEqD,EAAEc,EAAE,MAAM,GAAGd,EAPsU,SAAWnH,GAAG,OAAG,OAAOA,GAAG,kBAAkBA,EAAS,KAAsC,oBAAjCA,EAAEokB,GAAGpkB,EAAEokB,IAAIpkB,EAAE,eAA0CA,EAAE,IAAI,CAO5b6W,CAAE7W,GAAG,oBAAoBmH,EAAE,IAAInH,EAAEmH,EAAEnG,KAAKhB,GAAGkI,EAAE,IAAId,EAAEpH,EAAEmhG,QAAQ72F,MAA6BlC,GAAGoR,EAA1BpS,EAAEA,EAAEwE,MAA0B3L,EAAE6D,EAAtBqD,EAAEgB,EAAEkc,EAAEjd,EAAEc,KAAkBD,QAAQ,GAAG,WAAWb,EAAE,MAAMnH,EAAEqlB,OAAOtlB,GAAGsR,MAAM,mDAAmD,oBAAoBrR,EAAE,qBAAqBW,OAAOP,KAAKL,GAAGqS,KAAK,MAAM,IAAIpS,GAAG,6EAA6E,OAAOmI,CAAC,CACzZ,SAAS0K,EAAE9S,EAAEC,EAAE6D,GAAG,GAAG,MAAM9D,EAAE,OAAOA,EAAE,IAAImI,EAAE,GAAGF,EAAE,EAAmD,OAAjDuR,EAAExZ,EAAEmI,EAAE,GAAG,IAAG,SAASnI,GAAG,OAAOC,EAAEe,KAAK8C,EAAE9D,EAAEiI,IAAI,IAAUE,CAAC,CAAC,SAASyK,EAAE5S,GAAG,IAAI,IAAIA,EAAEq4H,QAAQ,CAAC,IAAIp4H,EAAED,EAAEs4H,SAAQr4H,EAAEA,KAAM6mC,MAAK,SAAS7mC,GAAM,IAAID,EAAEq4H,UAAU,IAAIr4H,EAAEq4H,UAAQr4H,EAAEq4H,QAAQ,EAAEr4H,EAAEs4H,QAAQr4H,EAAC,IAAE,SAASA,GAAM,IAAID,EAAEq4H,UAAU,IAAIr4H,EAAEq4H,UAAQr4H,EAAEq4H,QAAQ,EAAEr4H,EAAEs4H,QAAQr4H,EAAC,KAAI,IAAID,EAAEq4H,UAAUr4H,EAAEq4H,QAAQ,EAAEr4H,EAAEs4H,QAAQr4H,EAAE,CAAC,GAAG,IAAID,EAAEq4H,QAAQ,OAAOr4H,EAAEs4H,QAAQtvG,QAAQ,MAAMhpB,EAAEs4H,OAAQ,CAC5Z,IAAIr7G,EAAE,CAACzU,QAAQ,MAAMib,EAAE,CAACosE,WAAW,MAAMhsE,EAAE,CAACkhF,uBAAuB9nF,EAAEyyE,wBAAwBjsE,EAAE9b,kBAAkBqY,GAAG,SAASmE,IAAI,MAAM7S,MAAM,2DAA4D,CACzMxR,EAAQy4H,SAAS,CAAC5uG,IAAI7W,EAAEtF,QAAQ,SAASxN,EAAEC,EAAE6D,GAAGgP,EAAE9S,GAAE,WAAWC,EAAEulB,MAAMpL,KAAKhY,UAAU,GAAE0B,EAAE,EAAE00H,MAAM,SAASx4H,GAAG,IAAIC,EAAE,EAAuB,OAArB6S,EAAE9S,GAAE,WAAWC,GAAG,IAAUA,CAAC,EAAEw4H,QAAQ,SAASz4H,GAAG,OAAO8S,EAAE9S,GAAE,SAASA,GAAG,OAAOA,CAAC,KAAI,EAAE,EAAE04H,KAAK,SAAS14H,GAAG,IAAI+c,EAAE/c,GAAG,MAAMsR,MAAM,yEAAyE,OAAOtR,CAAC,GAAGF,EAAQ64H,UAAUnmH,EAAE1S,EAAQ2I,SAASb,EAAE9H,EAAQ84H,SAAS7nH,EAAEjR,EAAQ+4H,cAAcj7G,EAAE9d,EAAQg5H,WAAW9wH,EAAElI,EAAQi5H,SAAS/+G,EAClcla,EAAQ4H,mDAAmDmc,EAAE/jB,EAAQk5H,IAAI70G,EACzErkB,EAAQm5H,aAAa,SAASj5H,EAAEC,EAAE6D,GAAG,GAAG,OAAO9D,QAAG,IAASA,EAAE,MAAMsR,MAAM,iFAAiFtR,EAAE,KAAK,IAAImI,EAAE8R,EAAE,CAAC,EAAEja,EAAEsI,OAAOL,EAAEjI,EAAEiB,IAAImG,EAAEpH,EAAE6H,IAAIO,EAAEpI,EAAEuI,OAAO,GAAG,MAAMtI,EAAE,CAAoE,QAAnE,IAASA,EAAE4H,MAAMT,EAAEnH,EAAE4H,IAAIO,EAAE4X,EAAExX,cAAS,IAASvI,EAAEgB,MAAMgH,EAAE,GAAGhI,EAAEgB,KAAQjB,EAAE+B,MAAM/B,EAAE+B,KAAKP,aAAa,IAAI0G,EAAElI,EAAE+B,KAAKP,aAAa,IAAI2F,KAAKlH,EAAEqkB,EAAEtjB,KAAKf,EAAEkH,KAAKoP,EAAExV,eAAeoG,KAAKgB,EAAEhB,QAAG,IAASlH,EAAEkH,SAAI,IAASe,EAAEA,EAAEf,GAAGlH,EAAEkH,GAAG,CAAC,IAAIA,EAAE/E,UAAUjC,OAAO,EAAE,GAAG,IAAIgH,EAAEgB,EAAEi7E,SAASt/E,OAAO,GAAG,EAAEqD,EAAE,CAACe,EAAE5H,MAAM6G,GACrf,IAAI,IAAIK,EAAE,EAAEA,EAAEL,EAAEK,IAAIU,EAAEV,GAAGpF,UAAUoF,EAAE,GAAGW,EAAEi7E,SAASl7E,CAAC,CAAC,MAAM,CAACG,SAASd,EAAExF,KAAK/B,EAAE+B,KAAKd,IAAIgH,EAAEJ,IAAIT,EAAEkB,MAAMH,EAAEI,OAAOH,EAAE,EAAEtI,EAAQo5H,cAAc,SAASl5H,GAAqK,OAAlKA,EAAE,CAACqI,SAASyJ,EAAE8vF,cAAc5hG,EAAEm5H,eAAen5H,EAAEo5H,aAAa,EAAEC,SAAS,KAAKC,SAAS,KAAKC,cAAc,KAAKC,YAAY,OAAQH,SAAS,CAAChxH,SAAS6I,EAAEswE,SAASxhF,GAAUA,EAAEs5H,SAASt5H,CAAC,EAAEF,EAAQkG,cAAcmW,EAAErc,EAAQ25H,cAAc,SAASz5H,GAAG,IAAIC,EAAEkc,EAAEnY,KAAK,KAAKhE,GAAY,OAATC,EAAE8B,KAAK/B,EAASC,CAAC,EAAEH,EAAQ45H,UAAU,WAAW,MAAM,CAAClxH,QAAQ,KAAK,EAC9d1I,EAAQ65H,WAAW,SAAS35H,GAAG,MAAM,CAACqI,SAAS8gB,EAAEtmB,OAAO7C,EAAE,EAAEF,EAAQ85H,eAAe78G,EAAEjd,EAAQ+5H,KAAK,SAAS75H,GAAG,MAAM,CAACqI,SAASuG,EAAE6yE,SAAS,CAAC42C,SAAS,EAAEC,QAAQt4H,GAAG0hF,MAAM9uE,EAAE,EAAE9S,EAAQg6H,KAAK,SAAS95H,EAAEC,GAAG,MAAM,CAACoI,SAASsG,EAAE5M,KAAK/B,EAAEuC,aAAQ,IAAStC,EAAE,KAAKA,EAAE,EAAEH,EAAQi6H,gBAAgB,SAAS/5H,GAAG,IAAIC,EAAEwjB,EAAEosE,WAAWpsE,EAAEosE,WAAW,CAAC,EAAE,IAAI7vF,GAAG,CAAC,QAAQyjB,EAAEosE,WAAW5vF,CAAC,CAAC,EAAEH,EAAQk6H,aAAa71G,EAAErkB,EAAQknG,YAAY,SAAShnG,EAAEC,GAAG,OAAOgd,EAAEzU,QAAQw+F,YAAYhnG,EAAEC,EAAE,EAAEH,EAAQmnG,WAAW,SAASjnG,GAAG,OAAOid,EAAEzU,QAAQy+F,WAAWjnG,EAAE,EAC3fF,EAAQkP,cAAc,WAAW,EAAElP,EAAQynG,iBAAiB,SAASvnG,GAAG,OAAOid,EAAEzU,QAAQ++F,iBAAiBvnG,EAAE,EAAEF,EAAQgP,UAAU,SAAS9O,EAAEC,GAAG,OAAOgd,EAAEzU,QAAQsG,UAAU9O,EAAEC,EAAE,EAAEH,EAAQ4nG,MAAM,WAAW,OAAOzqF,EAAEzU,QAAQk/F,OAAO,EAAE5nG,EAAQonG,oBAAoB,SAASlnG,EAAEC,EAAE6D,GAAG,OAAOmZ,EAAEzU,QAAQ0+F,oBAAoBlnG,EAAEC,EAAE6D,EAAE,EAAEhE,EAAQqnG,mBAAmB,SAASnnG,EAAEC,GAAG,OAAOgd,EAAEzU,QAAQ2+F,mBAAmBnnG,EAAEC,EAAE,EAAEH,EAAQiP,gBAAgB,SAAS/O,EAAEC,GAAG,OAAOgd,EAAEzU,QAAQuG,gBAAgB/O,EAAEC,EAAE,EACzdH,EAAQsnG,QAAQ,SAASpnG,EAAEC,GAAG,OAAOgd,EAAEzU,QAAQ4+F,QAAQpnG,EAAEC,EAAE,EAAEH,EAAQunG,WAAW,SAASrnG,EAAEC,EAAE6D,GAAG,OAAOmZ,EAAEzU,QAAQ6+F,WAAWrnG,EAAEC,EAAE6D,EAAE,EAAEhE,EAAQwnG,OAAO,SAAStnG,GAAG,OAAOid,EAAEzU,QAAQ8+F,OAAOtnG,EAAE,EAAEF,EAAQ+O,SAAS,SAAS7O,GAAG,OAAOid,EAAEzU,QAAQqG,SAAS7O,EAAE,EAAEF,EAAQ4P,qBAAqB,SAAS1P,EAAEC,EAAE6D,GAAG,OAAOmZ,EAAEzU,QAAQkH,qBAAqB1P,EAAEC,EAAE6D,EAAE,EAAEhE,EAAQ0nG,cAAc,WAAW,OAAOvqF,EAAEzU,QAAQg/F,eAAe,EAAE1nG,EAAQiQ,QAAQ,mBChBja+J,KAPDja,EAAOC,QAQF,WAAP,IAAAgE,EAAA,eAAAA,EAAAoN,GCLA,IAiDUzJ,EACFsJ,EA0BA3Q,EAQAuR,EAqBAG,EAzGJvK,EACU,SAASzD,GAEnB,IADA,IAAIoN,EAAI,GACCzJ,EAAI,EAAGA,EAAI3D,EAAE3D,SAAUsH,EAAG,CAC/B,IAAIsJ,EAAIjN,EAAE8f,WAAWnc,GACjBsJ,EAAI,IACJG,EAAE2T,KAAK9T,GACAA,EAAI,MACXG,EAAE2T,KAAK,IAAQ9T,GAAK,GACpBG,EAAE2T,KAAK,IAAQ,GAAK9T,IACbA,EAAI,OACXG,EAAE2T,KAAK,IAAQ9T,GAAK,IACpBG,EAAE2T,KAAK,IAAQ,GAAM9T,GAAK,GAC1BG,EAAE2T,KAAK,IAAQ,GAAK9T,KAEpBG,EAAE2T,KAAK,IAAQ9T,GAAK,IACpBG,EAAE2T,KAAK,IAAQ,GAAM9T,GAAK,IAC1BG,EAAE2T,KAAK,IAAQ,GAAM9T,GAAK,GAC1BG,EAAE2T,KAAK,IAAQ,GAAK9T,GAE3B,CACD,OAAOG,CACV,EAtBGjJ,EAuBU,SAASnE,GAGnB,IAFA,IAAIoN,EAAI,GACJzJ,EAAI,EACDA,EAAI3D,EAAE3D,QAAQ,CACjB,IAAI4Q,EAAIjN,EAAE2D,KACNsJ,EAAI,MAEGA,EAAI,KACXA,GAAK,GAAKA,IAAM,EAChBA,GAAM,GAAKjN,EAAE2D,MACNsJ,EAAI,KACXA,GAAK,GAAKA,IAAM,GAChBA,IAAM,GAAKjN,EAAE2D,OAAS,EACtBsJ,GAAM,GAAKjN,EAAE2D,OAEbsJ,GAAK,EAAIA,IAAM,GACfA,IAAM,GAAKjN,EAAE2D,OAAS,GACtBsJ,IAAM,GAAKjN,EAAE2D,OAAS,EACtBsJ,GAAM,GAAKjN,EAAE2D,OAEjByJ,EAAE2T,KAAKS,OAAOC,aAAaxU,GAC9B,CACD,OAAOG,EAAEmB,KAAK,GACjB,EAEGlL,EAAS,CAAC,EACJM,EA0FP,mEAzFKsJ,EAAc,SAASjN,GAIvB,IAHA,IAAIoN,EAAI,EACJH,EAAI,GACJ3Q,EAAI,EAAK0D,EAAE3D,OAAS,EACjB,EAAIC,KAAK,CACZ,IAAIJ,GAAK8D,EAAEoN,IAAM,KAAOpN,EAAEoN,EAAE,IAAM,GAAKpN,EAAEoN,EAAE,GAC3CA,GAAK,EACLH,EAAE8T,KAAKpd,EAAEZ,OAAO,GAAM7G,GAAK,KAC3B+Q,EAAE8T,KAAKpd,EAAEZ,OAAO,GAAM7G,GAAK,KAC3B+Q,EAAE8T,KAAKpd,EAAEZ,OAAO,GAAM7G,GAAK,IAC3B+Q,EAAE8T,KAAKpd,EAAEZ,OAAO,GAAK7G,GACxB,CAaD,OAZI,GAAM8D,EAAE3D,OAAS+Q,GACblR,GAAK8D,EAAEoN,IAAM,KAAOpN,EAAEoN,EAAE,IAAM,GAClCH,EAAE8T,KAAKpd,EAAEZ,OAAO,GAAM7G,GAAK,KAC3B+Q,EAAE8T,KAAKpd,EAAEZ,OAAO,GAAM7G,GAAK,KAC3B+Q,EAAE8T,KAAKpd,EAAEZ,OAAO,GAAM7G,GAAK,IAC3B+Q,EAAE8T,KAAK,MACA,GAAM/gB,EAAE3D,OAAS+Q,IACpBlR,EAAK8D,EAAEoN,IAAM,GACjBH,EAAE8T,KAAKpd,EAAEZ,OAAO,GAAM7G,GAAK,KAC3B+Q,EAAE8T,KAAKpd,EAAEZ,OAAO,GAAM7G,GAAK,KAC3B+Q,EAAE8T,KAAK,OAEJ9T,EAAEsB,KAAK,GACjB,EACGjS,EAAK,WAEL,IADA,IAAI0D,EAAI,GACCoN,EAAE,EAAGA,EAAEzJ,EAAEtH,SAAU+Q,EACxBpN,EAAE2D,EAAEmc,WAAW1S,IAAMA,EAGzB,OADApN,EAAE,IAAI8f,WAAW,IAAM,EAChB9f,CACV,CAPQ,GAQL6N,EAAc,SAAS7N,GAIvB,IAHA,IAAIoN,EAAI,EACJzJ,EAAI,GACJsJ,EAAI,EAAKjN,EAAE3D,OAAS,EACjB,EAAI4Q,KAAK,CACZ,IAAI/Q,GAAKI,EAAE0D,EAAE8f,WAAW1S,KAAO,KAAO9Q,EAAE0D,EAAE8f,WAAW1S,EAAE,KAAO,KAAO9Q,EAAE0D,EAAE8f,WAAW1S,EAAE,KAAO,GAAK9Q,EAAE0D,EAAE8f,WAAW1S,EAAE,IACnHzJ,EAAEod,KAAK,IAAO7kB,GAAK,IACnByH,EAAEod,KAAK,IAAO7kB,GAAK,GACnByH,EAAEod,KAAK,IAAM7kB,GACbkR,GAAK,CACR,CASD,OARIzJ,IACI,KAAO3D,EAAE+C,OAAOqK,EAAE,IAClBzJ,EAAEitB,MACFjtB,EAAEitB,OACK,KAAO5wB,EAAE+C,OAAOqK,EAAE,IACzBzJ,EAAEitB,OAGHjtB,CACV,EACGqK,EAAQ,CACZmoH,OAAe,SAASn2H,GAEpB,IADA,IAAIoN,EAAI,GACCzJ,EAAI,EAAGA,EAAE3D,EAAE3D,SAAUsH,EAC1ByJ,EAAE2T,KAAK/gB,EAAE8f,WAAWnc,IAExB,OAAOyJ,CACV,EACDoW,OAAe,SAASxjB,GACpB,IAAK,IAAIoN,EAAI,EAAGA,EAAEF,EAAE7Q,SAAU+Q,EAC1BlR,EAAEkR,GAAKoU,OAAOC,aAAavlB,EAAEkR,IAEjC,OAAOlR,EAAEqS,KAAK,GACjB,GACDlL,EAAO+yH,YAAc,SAASp2H,GAC1B,IAAIoN,EAAIS,EAAY7N,GACpB,OAAO,IAAI2W,WAAWvJ,EACzB,EACD/J,EAAOgzH,YAAc,SAASr2H,GAC1B,IAAIoN,EAAIY,EAAMmoH,OAAOn2H,GACrB,OAAOiN,EAAYG,EACtB,EACD/J,EAAOizH,YAAc,SAASt2H,GAC1B,IAAIoN,EAAIS,EAAY7N,GACpB,OAAOgO,EAAMwV,OAAOpW,EACvB,EACD/J,EAAO8yH,OAAS,SAASn2H,GACrB,IAAIoN,EAAI3J,EAAYzD,GACpB,OAAOiN,EAAYG,EACtB,EACD/J,EAAOmgB,OAAS,SAASxjB,GACrB,IAAIoN,EAAIS,EAAY7N,GACpB,OAAOmE,EAAYiJ,EACtB,EAcDA,EAAQoW,OAASngB,EAAOmgB,OACxBpW,EAAQgpH,YAAc/yH,EAAO+yH,YAC7BhpH,EAAQ+oH,OAAS9yH,EAAO8yH,OACxB/oH,EAAQipH,YAAchzH,EAAOgzH,WAAA,eAAAr2H,EAAAoN,IClIhC,SAASpN,GAEN,aAMA,IAAIoN,EAA0B,CAC1B,GAAO,IACP,GAAO,IACP,GAAO,IACP,GAAO,IACP,GAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,KAIP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,KACP,IAAO,IACP,IAAO,IACP,IAAO,KACP,IAAO,IACP,IAAO,GACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IAGP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,KACP,IAAO,IACP,IAAO,GACP,IAAO,KACP,IAAO,KACP,IAAO,IACP,IAAO,KACP,IAAO,KACP,IAAO,KACP,IAAO,KACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IAGP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,GACP,IAAO,GACP,IAAO,GACP,IAAO,IACP,IAAO,KACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,KACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,IACP,IAAO,KACP,IAAO,KACP,IAAO,KACP,IAAO,MAMPzJ,EAAiB,SAAS3D,GAC1B,IAAI2D,EAAW3D,EAIf,OAHIoN,EAAwBnQ,eAAe+C,KACvC2D,EAAWyJ,EAAwBpN,IAEhCwhB,OAAOC,aAAa9d,EAC9B,EAEGsJ,EAAU,GACV3Q,EAAU,GAEVJ,EAAa,CAAC,GAAO,EAAG,GAAO,EAAG,GAAO,EAAG,GAAO,EAAG,GAAO,EAAG,GAAO,GAAI,GAAO,GAAI,GAAO,IAC7F2R,EAAc,CAAC,GAAO,EAAG,GAAO,EAAG,GAAO,EAAG,GAAO,EAAG,GAAO,GAAI,GAAO,GAAI,GAAO,IACpFX,EAAa,CAAC,GAAO,EAAG,GAAO,EAAG,GAAO,EAAG,GAAO,EAAG,GAAO,EAAG,GAAO,GAAI,GAAO,GAAI,GAAO,IAC7Fc,EAAc,CAAC,GAAO,EAAG,GAAO,EAAG,GAAO,EAAG,GAAO,EAAG,GAAO,GAAI,GAAO,GAAI,GAAO,IAEpFvK,EAAmB,CAAC,QAAS,QAAS,OAAQ,OAAQ,MAAO,SAAU,UAAW,QAAS,eAK3FU,EAAS,CACToyH,cAAgB,CAACC,KAAS,EAAGpf,MAAU,EAAGqf,KAAS,EAAGC,QAAY,EAAGC,KAAS,EAAGzkH,MAAU,GAC3Fu3B,KAAO,KACPwsB,aAAe,EACf2gE,QAAU,SAAS52H,GACfsW,KAAKmzB,KAAOzpC,CACf,EACD6V,IAAM,SAAS7V,EAAUoN,GACrB,IAAIzJ,EAAW2S,KAAKigH,cAAcv2H,GAC9BsW,KAAK2/C,cAAgBtyD,GACrB6I,QAAQqJ,IAAIS,KAAKmzB,KAAO,KAAOzpC,EAAW,KAAOoN,EAExD,GAGD/J,EAAqB,SAASrD,GAE9B,IADA,IAAIoN,EAAW,GACNzJ,EAAI,EAAGA,EAAI3D,EAAS3D,OAAQsH,IACjCyJ,EAAS2T,KAAK/gB,EAAS2D,GAAG3G,SAAS,KAEvC,OAAOoQ,CACV,EAMG/I,EAAW,SAASrE,EAAYoN,EAAWzJ,EAASsJ,EAAY3Q,GAChEga,KAAK8/C,WAAap2D,GAAc,QAChCsW,KAAK+/C,UAAYjpD,IAAA,EACjBkJ,KAAKggD,QAAU3yD,IAAA,EACf2S,KAAKigD,WAAatpD,GAAc,QAChCqJ,KAAKkgD,MAAQl6D,IAAA,CAChB,EAED+H,EAAStH,UAAY,CAEjBiyC,MAAQ,WACJ14B,KAAK8/C,WAAa,QAClB9/C,KAAK+/C,WAAA,EACL//C,KAAKggD,SAAA,EACLhgD,KAAKigD,WAAa,QAClBjgD,KAAKkgD,OAAA,CACR,EAEDC,UAAY,SAASz2D,GAEjB,IADA,IAAIoN,EAAU,CAAC,aAAc,YAAa,UAAW,aAAc,SAC1DzJ,EAAI,EAAIA,EAAIyJ,EAAQ/Q,OAAQsH,IAAK,CACtC,IAAIsJ,EAAQG,EAAQzJ,GAChB3D,EAAO/C,eAAegQ,KACtBqJ,KAAKrJ,GAASjN,EAAOiN,GAE5B,CACJ,EAEDypD,UAAY,WACR,MAA4B,UAApBpgD,KAAK8/C,aAA2B9/C,KAAK+/C,YAAc//C,KAAKggD,SACpC,UAApBhgD,KAAKigD,aAA2BjgD,KAAKkgD,KAChD,EAEDG,OAAS,SAAS32D,GACd,OAAUsW,KAAK8/C,aAAep2D,EAAMo2D,YAC1B9/C,KAAK+/C,YAAcr2D,EAAMq2D,WACzB//C,KAAKggD,UAAYt2D,EAAMs2D,SACvBhgD,KAAKigD,aAAev2D,EAAMu2D,YAC1BjgD,KAAKkgD,QAAUx2D,EAAMw2D,KAClC,EAEDI,KAAO,SAAS52D,GACZsW,KAAK8/C,WAAap2D,EAAYo2D,WAC9B9/C,KAAK+/C,UAAYr2D,EAAYq2D,UAC7B//C,KAAKggD,QAAUt2D,EAAYs2D,QAC3BhgD,KAAKigD,WAAav2D,EAAYu2D,WAC9BjgD,KAAKkgD,MAAQx2D,EAAYw2D,KAC5B,EAEDx5D,SAAU,WACN,MAAQ,SAAWsZ,KAAK8/C,WAAa,eAAiB9/C,KAAK+/C,UAAY,aAAe//C,KAAKggD,QACvF,gBAAkBhgD,KAAKigD,WAAa,WAAajgD,KAAKkgD,KAC7D,GAOL,IAAIpyD,EAAoB,SAASpE,EAAOoN,EAAYzJ,EAAWsJ,EAAS3Q,EAAYJ,GAChFoa,KAAKwgD,MAAQ92D,GAAS,IACtBsW,KAAKygD,SAAW,IAAI1yD,EAAS+I,EAAYzJ,EAAUsJ,EAAS3Q,EAAYJ,EAC3E,EAEDkI,EAAkBrH,UAAY,CAE1BiyC,MAAO,WACH14B,KAAKwgD,MAAQ,IACbxgD,KAAKygD,SAAS/nB,OACjB,EAEDgoB,QAAS,SAASh3D,EAAOoN,GACrBkJ,KAAKwgD,MAAQ92D,EACbsW,KAAKygD,SAASH,KAAKxpD,EACtB,EAED6pD,YAAa,SAASj3D,GAClBsW,KAAKygD,SAASH,KAAK52D,EACtB,EAED22D,OAAQ,SAAS32D,GACb,OAAOsW,KAAKwgD,QAAU92D,EAAM82D,OAASxgD,KAAKygD,SAASJ,OAAO32D,EAAM+2D,SACnE,EAEDH,KAAM,SAAS52D,GACXsW,KAAKwgD,MAAQ92D,EAAQ82D,MACrBxgD,KAAKygD,SAASH,KAAK52D,EAAQ+2D,SAC9B,EAEDG,QAAU,WACN,MAAsB,MAAf5gD,KAAKwgD,OAAiBxgD,KAAKygD,SAASL,WAC9C,GAOL,IAAIpyD,EAAM,WACNgS,KAAK8gD,MAAQ,GACb,IAAK,IAAIp3D,EAAI,EAAIA,EAAI1D,EAAU0D,IAC3BsW,KAAK8gD,MAAMr2C,KAAK,IAAI3c,GAExBkS,KAAK+gD,IAAM,EACX/gD,KAAKghD,aAAe,IAAIjzD,CAC3B,EAEDC,EAAIvH,UAAY,CAEZ45D,OAAQ,SAAS32D,GAEb,IADA,IAAIoN,GAAA,EACKzJ,EAAI,EAAIA,EAAIrH,EAASqH,IAC1B,IAAK2S,KAAK8gD,MAAMzzD,GAAGgzD,OAAO32D,EAAMo3D,MAAMzzD,IAAK,CACvCyJ,GAAA,EACA,KACH,CAEL,OAAOA,CACV,EAEDwpD,KAAM,SAAS52D,GACX,IAAK,IAAIoN,EAAI,EAAIA,EAAI9Q,EAAS8Q,IAC1BkJ,KAAK8gD,MAAMhqD,GAAGwpD,KAAK52D,EAAMo3D,MAAMhqD,GAEtC,EAED8pD,QAAU,WAEN,IADA,IAAIl3D,GAAA,EACKoN,EAAI,EAAIA,EAAI9Q,EAAS8Q,IAC1B,IAAKkJ,KAAK8gD,MAAMhqD,GAAG8pD,UAAW,CAC1Bl3D,GAAA,EACA,KACH,CAEL,OAAOA,CACV,EAKDy3D,UAAY,SAASz3D,GACbsW,KAAK+gD,MAAQr3D,IACbsW,KAAK+gD,IAAMr3D,GAEXsW,KAAK+gD,IAAM,GACXlzD,EAAO0R,IAAI,QAAS,4BAA8BS,KAAK+gD,KACvD/gD,KAAK+gD,IAAM,GACJ/gD,KAAK+gD,IAAM/6D,IAClB6H,EAAO0R,IAAI,QAAS,6BAA+BS,KAAK+gD,KACxD/gD,KAAK+gD,IAAM/6D,EAElB,EAKDo7D,WAAa,SAAS13D,GAClB,IAAIoN,EAASkJ,KAAK+gD,IAAMr3D,EACxB,GAAIA,EAAS,EACT,IAAK,IAAI2D,EAAI2S,KAAK+gD,IAAI,EAAG1zD,EAAIyJ,EAAO,EAAIzJ,IACpC2S,KAAK8gD,MAAMzzD,GAAGszD,YAAY3gD,KAAKghD,cAGvChhD,KAAKmhD,UAAUrqD,EAClB,EAKDuqD,UAAY,WACRrhD,KAAKohD,YAAY,GACjBphD,KAAK8gD,MAAM9gD,KAAK+gD,KAAKL,QAAQ,IAAK1gD,KAAKghD,aAC1C,EAEDM,WAAY,SAAS53D,GACbA,GAAQ,KACRsW,KAAKqhD,YAET,IAAIvqD,EAAOzJ,EAAe3D,GACtBsW,KAAK+gD,KAAO/6D,EACZ6H,EAAO0R,IAAI,QAAS,iBAAmB7V,EAAKhD,SAAS,IACzC,KAAOoQ,EAAO,iBAAmBkJ,KAAK+gD,IAAM,mBAG5D/gD,KAAK8gD,MAAM9gD,KAAK+gD,KAAKL,QAAQ5pD,EAAMkJ,KAAKghD,cACxChhD,KAAKohD,WAAW,GACnB,EAEDG,aAAe,SAAS73D,GACpB,IAAIoN,EACJ,IAAKA,EAAIpN,EAAWoN,EAAI9Q,EAAU8Q,IAC9BkJ,KAAK8gD,MAAMhqD,GAAG4hC,OAErB,EAED8oB,MAAQ,WACJxhD,KAAKuhD,aAAa,GAClBvhD,KAAK+gD,IAAM,EACX/gD,KAAKghD,aAAatoB,OACrB,EAED+oB,gBAAkB,WACdzhD,KAAKuhD,aAAavhD,KAAK+gD,IAC1B,EAEDW,cAAe,WAGX,IAFA,IAAIh4D,EAAQ,GACRoN,GAAA,EACKzJ,EAAI,EAAIA,EAAIrH,EAAUqH,IAAK,CAChC,IAAIsJ,EAAOqJ,KAAK8gD,MAAMzzD,GAAGmzD,MACZ,MAAT7pD,IACAG,GAAA,GAEJpN,EAAM+gB,KAAK9T,EACd,CACD,OAAIG,EACO,GAEApN,EAAMuO,KAAK,GAEzB,EAED0pD,aAAc,SAASj4D,GACnBsW,KAAKghD,aAAab,UAAUz2D,GACbsW,KAAK8gD,MAAM9gD,KAAK+gD,KACtBJ,YAAY3gD,KAAKghD,aAC7B,GAOL,IAAIxzD,EAAgB,WAEhBwS,KAAK6hD,KAAO,GACZ,IAAK,IAAIn4D,EAAI,EAAIA,EAAKiN,EAASjN,IAC3BsW,KAAK6hD,KAAKp3C,KAAK,IAAIzc,GAEvBgS,KAAK8hD,QAAU,GACf9hD,KAAK+hD,aAAe,KACpB/hD,KAAK04B,OACR,EAEDlrC,EAAc/G,UAAY,CAEtBiyC,MAAQ,WACJ,IAAK,IAAIhvC,EAAI,EAAIA,EAAIiN,EAAUjN,IAC3BsW,KAAK6hD,KAAKn4D,GAAG83D,QAEjBxhD,KAAK8hD,QAAU,EAClB,EAEDzB,OAAS,SAAS32D,GAEd,IADA,IAAIoN,GAAA,EACKzJ,EAAI,EAAIA,EAAIsJ,EAAUtJ,IAC3B,IAAK2S,KAAK6hD,KAAKx0D,GAAGgzD,OAAO32D,EAAMm4D,KAAKx0D,IAAK,CACrCyJ,GAAA,EACA,KACH,CAEL,OAAOA,CACV,EAEDwpD,KAAO,SAAS52D,GACZ,IAAK,IAAIoN,EAAI,EAAIA,EAAIH,EAAUG,IAC3BkJ,KAAK6hD,KAAK/qD,GAAGwpD,KAAK52D,EAAMm4D,KAAK/qD,GAEpC,EAED8pD,QAAU,WAEN,IADA,IAAIl3D,GAAA,EACKoN,EAAI,EAAIA,EAAIH,EAAUG,IAC3B,IAAKkJ,KAAK6hD,KAAK/qD,GAAG8pD,UAAW,CACzBl3D,GAAA,EACA,KACH,CAEL,OAAOA,CACV,EAED23D,UAAY,WACErhD,KAAK6hD,KAAK7hD,KAAK8hD,SACrBT,WACP,EAEDI,gBAAkB,WACJzhD,KAAK6hD,KAAK7hD,KAAK8hD,SACrBL,iBACP,EAKDH,WAAa,SAAS53D,GACRsW,KAAK6hD,KAAK7hD,KAAK8hD,SACrBR,WAAW53D,EAClB,EAEDu4D,OAAS,SAASv4D,GACJsW,KAAK6hD,KAAK7hD,KAAK8hD,SACrBH,aAAaj4D,EACpB,EAED03D,WAAa,SAAS13D,GACRsW,KAAK6hD,KAAK7hD,KAAK8hD,SACrBV,WAAW13D,EAClB,EAEDy3D,UAAY,SAASz3D,GACjBmE,EAAO0R,IAAI,OAAQ,cAAgB7V,GACzBsW,KAAK6hD,KAAK7hD,KAAK8hD,SACrBX,UAAUz3D,EACjB,EAEDw4D,OAAS,SAASx4D,GACdmE,EAAO0R,IAAI,OAAQ,aAAemhB,KAAKC,UAAUj3B,IACjD,IAAIoN,EAASpN,EAAQy4D,IAAM,EACvBniD,KAAK+hD,cAAiBjrD,EAASkJ,KAAK+hD,aAAe,IAC/CjrD,EAASkJ,KAAK+hD,aAAa,GAEnC/hD,KAAK8hD,QAAUhrD,EACf,IAAIzJ,EAAM2S,KAAK6hD,KAAK7hD,KAAK8hD,SACzB,GAAuB,OAAnBp4D,EAAQ04D,OAAiB,CACzB,IAAIzrD,EAASjN,EAAQ04D,OACjBp8D,EAAUsS,KAAKgN,IAAI3O,EAAO,EAAG,GACjCtJ,EAAI8zD,UAAUz3D,EAAQ04D,QACtB14D,EAAQ24D,MAAQh1D,EAAIyzD,MAAM96D,GAASy6D,SAASX,UAC/C,CACD,IAAIl6D,EAAS,CAACk6D,WAAap2D,EAAQ24D,MAAOtC,UAAYr2D,EAAQq2D,UAAWC,QAAUt2D,EAAQs2D,QAASC,WAAa,QAASC,OAAA,GAC1HlgD,KAAKiiD,OAAOr8D,EACf,EAKD08D,WAAa,SAAS54D,GAElBmE,EAAO0R,IAAI,OAAQ,aAAemhB,KAAKC,UAAUj3B,IACjDsW,KAAKqhD,YACLrhD,KAAKiiD,OAAOv4D,GACZsW,KAAKshD,WAAW,GACnB,EAEDiB,cAAgB,SAAS74D,GACrBsW,KAAK+hD,aAAer4D,CACvB,EAED84D,OAAS,WACL,GAA0B,OAAtBxiD,KAAK+hD,aAAT,CAIAl0D,EAAO0R,IAAI,OAAQS,KAAKyiD,kBACxB,IAAI/4D,EAAcsW,KAAK8hD,QAAU,EAAI9hD,KAAK+hD,aACtCjrD,EAASkJ,KAAK6hD,KAAK3wC,OAAOxnB,EAAa,GAAG,GAC9CoN,EAAO0qD,QACPxhD,KAAK6hD,KAAK3wC,OAAOlR,KAAK8hD,QAAS,EAAGhrD,GAClCjJ,EAAO0R,IAAI,OAAQ,aANlB,MAFG1R,EAAO0R,IAAI,QAAS,uCAU3B,EAKDkjD,eAAiB,SAAS/4D,GACtBA,EAAWA,IAAA,EAIX,IAHA,IAAIoN,EAAc,GACdzJ,EAAO,GACPrH,GAAS,EACJJ,EAAI,EAAIA,EAAI+Q,EAAU/Q,IAAK,CAChC,IAAI2R,EAAUyI,KAAK6hD,KAAKj8D,GAAG87D,gBACvBnqD,IACAvR,EAAQJ,EAAE,EACN8D,EACAoN,EAAY2T,KAAK,OAASzkB,EAAQ,MAAQuR,EAAU,KAEpDT,EAAY2T,KAAKlT,EAAQR,QAGpC,CAQD,OAPID,EAAY/Q,OAAS,IAEjBsH,EADA3D,EACO,IAAMoN,EAAYmB,KAAK,OAAS,IAEhCnB,EAAYmB,KAAK,OAGzB5K,CACV,EAEDq1D,iBAAmB,WACf,OAAO1iD,KAAK6hD,IACf,GASL,IAAIz0D,EAAgB,SAAS1D,EAAeoN,GAExCkJ,KAAK4iD,KAAOl5D,EACZsW,KAAK6iD,aAAe/rD,EACpBkJ,KAAKwf,KAAO,KACZxf,KAAK8iD,QAAU,EACf9iD,KAAK+iD,gBAAkB,IAAIv1D,EAC3BwS,KAAKgjD,mBAAqB,IAAIx1D,EAC9BwS,KAAKgiD,iBAAmB,IAAIx0D,EAC5BwS,KAAKijD,cAAgBjjD,KAAK+iD,gBAAgBlB,KAAK,IAC/C7hD,KAAKkjD,YAAcljD,KAAK+iD,gBACxB/iD,KAAKwf,KAAO,KACZxf,KAAKihD,aAAe,IACvB,EAED7zD,EAAc3G,UAAY,CAEtB85H,MAAQ,CAAC,eAAgB,cAAe,gBAAiB,aAEzD7nF,MAAQ,WACJ14B,KAAKwf,KAAO,KACZxf,KAAK+iD,gBAAgBrqB,QACrB14B,KAAKgjD,mBAAmBtqB,QACxB14B,KAAKgiD,iBAAiBtpB,QACtB14B,KAAKijD,cAAgBjjD,KAAK+iD,gBAAgBlB,KAAK,IAC/C7hD,KAAKkjD,YAAcljD,KAAK+iD,gBACxB/iD,KAAKwf,KAAO,KACZxf,KAAKihD,aAAe,KACpBjhD,KAAKwgH,eAAiB,IACzB,EAEDr9D,WAAa,WACT,OAAOnjD,KAAK6iD,YACf,EAEDO,WAAa,SAAS15D,GAClBsW,KAAK6iD,aAAen5D,CACvB,EAEDw4D,OAAS,SAASx4D,GACdsW,KAAKkjD,YAAYhB,OAAOx4D,EAC3B,EAED44D,WAAa,SAAS54D,GAClBsW,KAAKkjD,YAAYZ,WAAW54D,EAC/B,EAED25D,QAAU,SAAS35D,GACXA,IAAYsW,KAAKwf,OAGrBxf,KAAKwf,KAAO91B,EACZmE,EAAO0R,IAAI,OAAQ,QAAU7V,GACZ,eAAbsW,KAAKwf,KACLxf,KAAKkjD,YAAcljD,KAAKgjD,oBAExBhjD,KAAKkjD,YAAcljD,KAAK+iD,gBACxB/iD,KAAKkjD,YAAYxqB,SAEH,iBAAd14B,KAAKwf,OACLxf,KAAK+iD,gBAAgBhB,aAAe,KACpC/hD,KAAKgjD,mBAAmBjB,aAAe,MAE3C/hD,KAAKwf,KAAO91B,EACf,EAED45D,YAAc,SAAS55D,GACnB,IAAK,IAAIoN,EAAI,EAAIA,EAAIpN,EAAM3D,OAAS+Q,IAChCkJ,KAAKkjD,YAAY5B,WAAW53D,EAAMoN,IAEtC,IAAIzJ,EAAS2S,KAAKkjD,cAAgBljD,KAAK+iD,gBAAkB,OAAS,WAClEl1D,EAAO0R,IAAI,OAAQlS,EAAS,KAAO2S,KAAKkjD,YAAYT,gBAAA,IAClC,kBAAdziD,KAAKwf,MAA0C,iBAAdxf,KAAKwf,OACtC3xB,EAAO0R,IAAI,OAAQ,cAAgBS,KAAK+iD,gBAAgBN,gBAAA,IACxDziD,KAAKujD,mBAEZ,EAEDk9D,OAAQ,WACJ5yH,EAAO0R,IAAI,OAAQ,gCACnBS,KAAKqjD,QAAQ,cAChB,EACDq9D,MAAO,WACH7yH,EAAO0R,IAAI,OAAQ,kBACD,cAAdS,KAAKwf,OAGTxf,KAAKkjD,YAAY7B,YACbrhD,KAAKkjD,cAAgBljD,KAAK+iD,iBAC1B/iD,KAAKujD,mBAEZ,EACDo9D,OAAS,WAER,EACDC,OAAQ,WAEP,EACDC,OAAQ,WACJhzH,EAAO0R,IAAI,OAAQ,6BACnBS,KAAKkjD,YAAYzB,kBACjBzhD,KAAKujD,kBACR,EACDu9D,MAAO,SAASp3H,GACZmE,EAAO0R,IAAI,OAAQ,MAAQ7V,EAAQ,eACnCsW,KAAKkjD,YAAcljD,KAAK+iD,gBACxB/iD,KAAKqjD,QAAQ,gBACbrjD,KAAKkjD,YAAYX,cAAc74D,EAClC,EACDq3H,OAAQ,WACJlzH,EAAO0R,IAAI,OAAQ,kBACnBS,KAAKkjD,YAAYjB,OAAO,CAAC/B,OAAA,GAC5B,EACD8gE,OAAQ,WACJnzH,EAAO0R,IAAI,OAAQ,kCACnBS,KAAKqjD,QAAQ,gBAChB,EACD49D,MAAO,WACHpzH,EAAO0R,IAAI,OAAQ,MACnBS,KAAKqjD,QAAQ,YAChB,EACD69D,OAAQ,WACJrzH,EAAO0R,IAAI,OAAQ,OACnBS,KAAKqjD,QAAQ,YAChB,EACD89D,OAAQ,WACJtzH,EAAO0R,IAAI,OAAQ,gCACnBS,KAAK+iD,gBAAgBrqB,QACrB14B,KAAKujD,kBACR,EACD69D,MAAO,WACHvzH,EAAO0R,IAAI,wBACXS,KAAKkjD,YAAYV,SACjBxiD,KAAKujD,kBACR,EACD89D,OAAQ,WACJxzH,EAAO0R,IAAI,OAAQ,oCACnBS,KAAKgjD,mBAAmBtqB,OAC3B,EACD4oF,OAAQ,WAEJ,GADAzzH,EAAO0R,IAAI,OAAQ,wBACD,gBAAdS,KAAKwf,KAAwB,CAC7B,IAAI91B,EAAMsW,KAAK+iD,gBACf/iD,KAAK+iD,gBAAkB/iD,KAAKgjD,mBAC5BhjD,KAAKgjD,mBAAqBt5D,EAC1BsW,KAAKkjD,YAAcljD,KAAKgjD,mBACxBn1D,EAAO0R,IAAI,OAAQ,SAAWS,KAAK+iD,gBAAgBN,iBACtD,CACDziD,KAAKujD,kBACR,EACDg+D,MAAO,SAAS73H,GACZmE,EAAO0R,IAAI,OAAQ,MAAQ7V,EAAS,kBACpCsW,KAAKkjD,YAAY9B,WAAW13D,EAC/B,EACD83H,UAAW,SAAS93H,GAChB,IAAIoN,EAAS,CAACopD,OAAA,GAGd,GAFAppD,EAAOipD,UAAYr2D,EAAa,GAAM,EACtCoN,EAAOkpD,QAAUt2D,GAAc,GAC1BoN,EAAOkpD,QAKRlpD,EAAOgpD,WAAa,YALH,CACjB,IAAIzyD,EAAaiL,KAAK2Q,MAAMvf,EAAW,GAAK,GAE5CoN,EAAOgpD,WADM,CAAC,QAAS,QAAS,OAAQ,OAAQ,MAAO,SAAU,WACtCzyD,EAC9B,CAGDQ,EAAO0R,IAAI,OAAQ,WAAamhB,KAAKC,UAAU7pB,IAC/CkJ,KAAKkjD,YAAYjB,OAAOnrD,EAC3B,EAEDysD,iBAAkB,WACd,IAAI75D,EAAImE,EAAOslC,KACL,OAANzpC,GAGAsW,KAAK6iD,eACD7iD,KAAK6iD,aAAa4+D,YAClBzhH,KAAK6iD,aAAa4+D,WAAW/3H,EAAGsW,KAAK+iD,iBAEf,OAAtB/iD,KAAKihD,cAA0BjhD,KAAK+iD,gBAAgBnC,UAG/C5gD,KAAK+iD,gBAAgB1C,OAAOrgD,KAAKgiD,oBAC9BhiD,KAAK6iD,aAAa2B,QAClBxkD,KAAK6iD,aAAa2B,OAAOxkD,KAAKihD,aAAcv3D,EAAGsW,KAAKgiD,kBAExDhiD,KAAKihD,aAAejhD,KAAK+iD,gBAAgBnC,UAAY,KAAOl3D,GANhEsW,KAAKihD,aAAev3D,EASxBsW,KAAKgiD,iBAAiB1B,KAAKtgD,KAAK+iD,iBAEvC,EAED2B,eAAiB,SAASh7D,GAClBsW,KAAK6iD,eACA7iD,KAAK+iD,gBAAgBnC,YAClB5gD,KAAK6iD,aAAa2B,QAClBxkD,KAAK6iD,aAAa2B,OAAOxkD,KAAKihD,aAAcv3D,EAAGsW,KAAK+iD,iBAExD/iD,KAAKihD,aAAev3D,GAG/B,GAUL,IAAI8K,EAAe,SAAS9K,EAAOoN,EAAMzJ,GACrC2S,KAAK0hH,MAAQh4H,GAAS,EACtBsW,KAAK2hH,QAAU,CAAC7qH,EAAMzJ,GACtB2S,KAAKqZ,SAAW,CAAC,IAAIjsB,EAAc,EAAG0J,GAAO,IAAI1J,EAAc,EAAGC,IAClE2S,KAAK4hH,UAAY,EACjB5hH,KAAK6hH,SAAW,KAChB7hH,KAAK8hH,SAAW,KAChB9hH,KAAK+hH,aAAe,GACpB/hH,KAAK6f,UAAY,KACjB7f,KAAK2uD,SAAW,KAChB3uD,KAAKgiH,aAAe,CAACzN,QAAY,EAAGrzB,KAAS,EAAG5tC,IAAQ,EAAG2uE,MAAU,EACxE,EAEDztH,EAAa/N,UAAY,CAErB08D,WAAa,SAASz5D,GAClB,OAAOsW,KAAKqZ,SAAS3vB,GAAOy5D,YAC/B,EAEDC,WAAa,SAAS15D,EAAOoN,GACzBkJ,KAAKqZ,SAAS3vB,GAAO05D,WAAWtsD,EACnC,EAKDguD,QAAU,SAASp7D,EAAGoN,GAClB,IAAIzJ,EAAUsJ,EAAG3Q,EACjBJ,GAAA,EAEAoa,KAAK2uD,SAAWjlE,EAChBmE,EAAOyyH,QAAQ52H,GAEf,IAAK,IAAI6N,EAAI,EAAIA,EAAIT,EAAS/Q,OAASwR,GAAG,EACtCZ,EAAkB,IAAdG,EAASS,GACbvR,EAAoB,IAAhB8Q,EAASS,EAAE,GAEXZ,GAAK,IAAQA,GAAK,IAAQA,IAAMqJ,KAAK6hH,UAAY77H,IAAMga,KAAK8hH,UAC5D9hH,KAAK6hH,SAAW,KAChB7hH,KAAK8hH,SAAW,KAChBj0H,EAAO0R,IAAI,QAAS,qBAAuBxS,EAAmB,CAAC4J,EAAG3Q,IAAM,iBAIlE,IAAN2Q,GAAiB,IAAN3Q,GAIX6H,EAAO0R,IAAI,OAAQ,IAAMxS,EAAmB,CAAC+J,EAASS,GAAIT,EAASS,EAAE,KAAM,SAAWxK,EAAmB,CAAC4J,EAAG3Q,IAAM,MAEvHqH,EAAW2S,KAAKglD,SAASruD,EAAG3Q,MAExBqH,EAAW2S,KAAKilD,YAAYtuD,EAAG3Q,IAE9BqH,IACDA,EAAW2S,KAAKklD,SAASvuD,EAAG3Q,IAE3BqH,IACDA,EAAW2S,KAAKmlD,0BAA0BxuD,EAAG3Q,IAE5CqH,IACDzH,EAAaoa,KAAKolD,WAAWzuD,EAAG3Q,MAExBga,KAAK4hH,UAAY5hH,KAAK4hH,UAAW,EACnB5hH,KAAKqZ,SAASrZ,KAAK4hH,SAAS,GAClCt+D,YAAY19D,GAEpBiI,EAAO0R,IAAI,UAAW,qCAI9BlS,EACA2S,KAAKgiH,aAAa1uE,KAAO,EAClB1tD,EACPoa,KAAKgiH,aAAL9gC,MAA0B,GAE1BlhF,KAAKgiH,aAAaC,OAAS,EAC3Bp0H,EAAO0R,IAAI,UAAW,+BAAiCxS,EAAmB,CAAC4J,EAAG3Q,IAClE,UAAY+G,EAAmB,CAAC+J,EAASS,GAAIT,EAASS,EAAE,QAjCpEyI,KAAKgiH,aAAazN,SAAW,CAoCxC,EAMDvvD,SAAU,SAASt7D,EAAGoN,GAClB,IAAIzJ,EAIJ,MAFmB,KAAN3D,GAAoB,KAANA,GAAoB,KAANA,GAAoB,KAANA,IAAgB,IAAQoN,GAAKA,GAAK,KACtE,KAANpN,GAAoB,KAANA,IAAgB,IAAQoN,GAAKA,GAAK,IAEzD,OAAO,EAIPzJ,EADM,KAAN3D,GAAoB,KAANA,GAAoB,KAANA,EACrB,EAEA,EAGX,IAAIiN,EAAUqJ,KAAKqZ,SAAShsB,EAAO,GA0CnC,OAxCU,KAAN3D,GAAoB,KAANA,GAAoB,KAANA,GAAoB,KAANA,EAChC,KAANoN,EACAH,EAAQ8pH,SACK,KAAN3pH,EACPH,EAAQ+pH,QACK,KAAN5pH,EACPH,EAAQgqH,SACK,KAAN7pH,EACPH,EAAQiqH,SACK,KAAN9pH,EACPH,EAAQkqH,SACK,KAAN/pH,EACPH,EAAQmqH,MAAM,GACD,KAANhqH,EACPH,EAAQmqH,MAAM,GACD,KAANhqH,EACPH,EAAQmqH,MAAM,GACD,KAANhqH,EACPH,EAAQoqH,SACK,KAANjqH,EACPH,EAAQqqH,SACK,KAANlqH,EACPH,EAAQsqH,QACK,KAANnqH,EACPH,EAAQuqH,SACK,KAANpqH,EACPH,EAAQwqH,SACK,KAANrqH,EACPH,EAAQyqH,QACK,KAANtqH,EACPH,EAAQ0qH,SACK,KAANvqH,GACPH,EAAQ2qH,SAGZ3qH,EAAQ4qH,MAAMzqH,EAAI,IAEtBkJ,KAAK6hH,SAAWn4H,EAChBsW,KAAK8hH,SAAWhrH,EAChBkJ,KAAK4hH,SAAWv0H,GAAA,CAEnB,EAMD43D,YAAc,SAASv7D,EAAGoN,GACtB,IAAIzJ,EAAO,KAEX,IAAa,KAAN3D,GAAsB,KAANA,IAAgB,IAAQoN,GAAKA,GAAK,GAAM,CAM3D,IAJIzJ,EADM,KAAN3D,EACO,EAEA,KAEEsW,KAAK4hH,SAEd,OADA/zH,EAAO0R,IAAI,QAAS,yCAGxB,IAAI5I,EAAUqJ,KAAKqZ,SAAShsB,EAAK,GAOjC,OALAsJ,EAAQ2sD,YAAY,CAAC,KACrB3sD,EAAQ6qH,UAAU1qH,GAClBjJ,EAAO0R,IAAI,QAAS,WAAaxS,EAAmB,CAACrD,EAAGoN,IAAM,KAC9DkJ,KAAK6hH,SAAWn4H,EAChBsW,KAAK8hH,SAAWhrH,GAAA,CAEnB,CACD,OAAO,CACV,EAKDouD,SAAW,SAASx7D,EAAGoN,GAEpB,IAAIzJ,EACAsJ,EAIH,MAFc,IAAQjN,GAAMA,GAAK,IAAU,IAAQA,GAAKA,GAAK,KAAW,IAAQoN,GAAKA,GAAK,MACvE,KAANpN,GAAoB,KAANA,IAAgB,IAAQoN,GAAKA,GAAK,IAEzD,OAAO,EAGXzJ,EAAQ3D,GAAK,GAAQ,EAAI,EAGrBiN,EADA,IAAQG,GAAKA,GAAK,GACF,IAATzJ,EAAczH,EAAW8D,GAAKkN,EAAWlN,GAEhC,IAAT2D,EAAckK,EAAY7N,GAAKgO,EAAYhO,GAEtD,IAAI1D,EAAUga,KAAKqlD,aAAa1uD,EAAKG,GAMrC,OALckJ,KAAKqZ,SAAShsB,EAAK,GACzB60D,OAAOl8D,GACfga,KAAK6hH,SAAWn4H,EAChBsW,KAAK8hH,SAAWhrH,EAChBkJ,KAAK4hH,SAAWv0H,GAAA,CAEnB,EAMDg4D,aAAe,SAAU37D,EAAKoN,GAC1B,IAAIzJ,EACAsJ,EAAU,CAAC0rD,MAAQ,KAAMrC,SAAA,EAAiBoC,OAAS,KAAMrC,WAAA,EAAmBoC,IAAMz4D,GAgBtF,OAbI2D,EADAyJ,EAAO,GACIA,EAAO,GAEPA,EAAO,GAEtBH,EAAQopD,UAA+B,IAAP,EAAX1yD,GACjBA,GAAY,GACZsJ,EAAQ0rD,MAAQ,CAAC,QAAS,QAAS,OAAQ,OAAQ,MAAO,SAAU,UAAW,SAAS/pD,KAAK2Q,MAAM5b,EAAS,IACrGA,GAAY,IACnBsJ,EAAQqpD,SAAA,EACRrpD,EAAQ0rD,MAAQ,SAEhB1rD,EAAQyrD,OAAyC,EAA/B9pD,KAAK2Q,OAAO5b,EAAS,IAAM,GAE1CsJ,CACV,EAMDyuD,WAAa,SAAS17D,EAAGoN,GAEtB,IAcSS,EAdJZ,EAAY,KACZ3Q,EAAY,KACZJ,EAAY,KA6BhB,GA1BI8D,GAAK,IACLiN,EAAY,EACZ/Q,EAAY8D,EAAI,IAEhBiN,EAAY,EACZ/Q,EAAY8D,GAEZ,IAAQ9D,GAAaA,GAAa,IAI9B2R,EADc,KAAd3R,EACUkR,EAAI,GACO,KAAdlR,EACGkR,EAAI,IAEJA,EAAI,IAElBjJ,EAAO0R,IAAI,OAAQ,iBAAmBlS,EAAekK,GAAW,gBAAkBZ,GAClF3Q,EAAY,CAACuR,GACbyI,KAAK6hH,SAAWn4H,EAChBsW,KAAK8hH,SAAWhrH,GACT,IAAQpN,GAAKA,GAAK,MACzB1D,EAAmB,IAAN8Q,EAAW,CAACpN,GAAK,CAACA,EAAGoN,GAClCkJ,KAAK6hH,SAAW,KAChB7hH,KAAK8hH,SAAW,MAEhB97H,EAAW,CACX,IAAI4Q,EAAW7J,EAAmB/G,GAClC6H,EAAO0R,IAAI,QAAS,iBAAmB3I,EAASqB,KAAK,KACxD,CACD,OAAOjS,CACV,EAMDm/D,0BAA4B,SAASz7D,EAAGoN,GACrC,IAAKzJ,EACAsJ,EACA3Q,EAKJ,QAFmB,KAAN0D,GAAoB,KAANA,IAAgB,IAAQoN,GAAKA,GAAK,KAC1C,KAANpN,GAAoB,KAANA,IAAgB,IAAOoN,GAAKA,GAAK,MAI5DzJ,EAAU,CAAC,EACA,KAAP3D,GAAqB,KAANA,GACfiN,EAAQ2B,KAAK2Q,OAAOnS,EAAE,IAAM,GAC5BzJ,EAAQ4yD,WAAa9yD,EAAiBwJ,GAClCG,EAAI,GAAM,IACVzJ,EAAQ4yD,WAAa5yD,EAAQ4yD,WAAa,UAEjC,KAANnpD,EACPzJ,EAAQ4yD,WAAa,eAErB5yD,EAAQyyD,WAAa,QACX,KAANhpD,IACAzJ,EAAQ0yD,WAAA,IAGhB/5D,EAAQ0D,EAAI,GAAQ,EAAI,EACdsW,KAAKqZ,SAASrzB,EAAK,GACrBs8D,WAAWj1D,GACnB2S,KAAK6hH,SAAWn4H,EAChBsW,KAAK8hH,SAAWhrH,GAAA,EAEnB,EAKD4hC,MAAQ,WACJ,IAAK,IAAIhvC,EAAE,EAAIA,EAAIsW,KAAKqZ,SAAStzB,OAAS2D,IAClCsW,KAAKqZ,SAAS3vB,IACdsW,KAAKqZ,SAAS3vB,GAAGgvC,QAGzB14B,KAAK6hH,SAAW,KAChB7hH,KAAK8hH,SAAW,IACnB,EAKDp9D,eAAiB,SAASh7D,GACtB,IAAK,IAAIoN,EAAE,EAAIA,EAAIkJ,KAAKqZ,SAAStzB,OAAS+Q,IAClCkJ,KAAKqZ,SAASviB,IACdkJ,KAAKqZ,SAASviB,GAAG4tD,eAAeh7D,EAG3C,GA4FLA,EAAQw3D,OAASrzD,EACjBnE,EAAQw4H,SAAWn0H,EACnBrE,EAAQy4H,cAAgB30H,EACxB9D,EAAQ04H,aAAe5tH,EACvB9K,EAAQ24H,gBAtFc,SAAS34H,EAAKoN,EAAUzJ,GAgB1C,IAfA,IAAIsJ,EAAU,EACV3Q,EAAS8Q,EAETlR,EAAmB,GAEnB2R,EAAc,SAAU7N,EAAaoN,EAAazJ,EAAKsJ,GACnD,GAAoB,IAAhBjN,GAAqBoN,EAAc,EACnC,OAAO,KAEX,IAAI9Q,EAAcqH,EAAIsrC,SAAShiC,GAC3B/Q,EAAeyH,EAAIi1H,UAAU3rH,EAAM,GACnCY,EAAiBlK,EAAI8iB,UAAUxZ,EAAM,GACrCC,EAAmBvJ,EAAIsrC,SAAShiC,EAAM,GAC1C,OAAsB,KAAf3Q,GAAuC,IAAhBJ,GAA0C,YAAlB2R,GAAoD,GAApBX,CACzF,EACE5Q,EAAS8Q,EAAWzJ,GAAM,CAI7B,GAHAsJ,EAAUjN,EAAIymB,UAAUnqB,GAGR,IAFqB,GAA3B0D,EAAIivC,SAAS3yC,EAAS,IAO5B,IAFA,IAAI4Q,EAAM5Q,EAAS,EACf0R,GAAe,EACZd,EAAM5Q,EAAS,EAAI2Q,EAAU,GAAG,CACnCe,EAAc,EAEd,IADA,IAAIvK,EAAI,IACK,MAANA,GAEHuK,GADAvK,EAAIzD,EAAIivC,SAAS/hC,GAEjBA,IAEJ,IAAI/I,EAAc,EAElB,IADAV,EAAI,IACS,MAANA,GAEHU,GADAV,EAAIzD,EAAIivC,SAAS/hC,GAEjBA,IAEAW,EAAYG,EAAa7J,EAAanE,EAAKkN,IAE3ChR,EAAiB6kB,KAAK,CAAC7T,EAAK/I,IAEhC+I,GAAO/I,CACV,CAEL7H,GAAU2Q,EAAU,CACvB,CACD,OAAO/Q,CACV,EAqCD8D,EAAQ64H,2BAnCyB,SAAS74H,EAAKoN,GAC3C,IAAIzJ,EAAMyJ,EAAY,GAClBH,EAAY,CAAC,GAAI,IAErBtJ,GAAO,EACP,IAAIrH,EAA8B,GAApB0D,EAAIivC,SAAStrC,GAC3BA,GAAO,EAEP,IAAK,IAAIzH,EAAI,EAAGA,EAAII,EAASJ,IAAK,CAC9B,IAAI2R,EAAO7N,EAAIivC,SAAStrC,GACpBuJ,EAAiB,EAAPW,EACVG,EAAgB,EAAPH,EACblK,IACA,IAAIF,EAAUzD,EAAIivC,SAAStrC,GAC3BA,IACA,IAAIQ,EAAUnE,EAAIivC,SAAStrC,GAC3BA,IACIuJ,IAAuB,IAAVzJ,IAA6B,IAAVU,IAAoB,IACrC,IAAX6J,GACAf,EAAU,GAAG8T,KAAKtd,GAClBwJ,EAAU,GAAG8T,KAAK5c,IACA,IAAX6J,IACPf,EAAU,GAAG8T,KAAKtd,GAClBwJ,EAAU,GAAG8T,KAAK5c,IAG7B,CACD,OAAO8I,CACV,CA7qCJ,EAsrC2DG,EAAA,gBAAApN,EAAAoN,EAAAzJ,GAAA,iBAAAsJ,EAAAtJ,EAAA,MAAArH,EAAAqH,EAAA,MAAAzH,EAAAyH,EAAA,MAAAkK,EAAAlK,EAAA,MC7qCxDuJ,GAAAvJ,EAAA,MAA6B,oBAAXX,QAA0BA,QAAWW,EAAAS,GAEvD4J,EAASd,EAAQ4rH,OAChB9qH,IACDA,EAASd,EAAQ4rH,OAAS,CAAC,GAG/B9qH,EAAO+qH,YAAc9rH,EAAAujB,EACrBxiB,EAAOgrH,aAAe18H,EAAAk0B,EACtBxiB,EAAOirH,MAAQ/8H,EAAAs0B,EACfxiB,EAAOkrH,SAAA,EAAUrrH,EAAA7N,IAAA,gBAAAA,EAAAoN,EAAAzJ,GAAA,iBAAAsJ,EAAAtJ,EAAA,MAAArH,EAAAqH,EAAA,MAAAzH,EAAAyH,EAAA,MCdXkK,EAAkB,EAClBX,EAAkB,EAClBc,EAAoB,EACpBvK,EAAiB,EACjBU,EAAkB,EAOxB,SAASd,EAAMrD,GAEXA,EAASA,GAAU,CAAC,EACpB,IAMIoN,EACAzJ,EACAzH,EACAmH,EATEgB,EAAUiS,KAAK9V,QACf4D,GAAA,EAAW6I,EAAAujB,GAASnsB,GAAS80H,cAC7B70H,EAAWtE,EAAOo5G,SAElBt1G,EAAQ,GAqBd,SAASJ,EAAS1D,GACd,OAAIA,GAAMA,EAAGE,KACFF,EAAGE,KAAK8C,OAAOwJ,SAGnBxJ,OAAOwJ,QAAQqJ,IAAI3V,KAAK8C,OAAOwJ,QACzC,CA0CD,SAAS1B,IAAiB,QAAA9K,EAAA1B,UAAAjC,OAAR+Q,EAAQ,IAAA5Q,MAAAwD,GAAA2D,EAAA,EAAAA,EAAA3D,EAAA2D,IAARyJ,EAAQzJ,GAAArF,UAAAqF,GACtBqL,EAAK0S,WAAC,EAAN,CAAM7T,EAAiByI,MAAvB1W,OAAgCwN,GACnC,CAED,SAASsB,IAAiB,QAAA1O,EAAA1B,UAAAjC,OAAR+Q,EAAQ,IAAA5Q,MAAAwD,GAAA2D,EAAA,EAAAA,EAAA3D,EAAA2D,IAARyJ,EAAQzJ,GAAArF,UAAAqF,GACtBqL,EAAK0S,WAAC,EAAN,CAAMxU,EAAiBoJ,MAAvB1W,OAAgCwN,GACnC,CAED,SAASiY,IAAgB,QAAArlB,EAAA1B,UAAAjC,OAAR+Q,EAAQ,IAAA5Q,MAAAwD,GAAA2D,EAAA,EAAAA,EAAA3D,EAAA2D,IAARyJ,EAAQzJ,GAAArF,UAAAqF,GACrBqL,EAAK0S,WAAC,EAAN,CAAM1T,EAAmBsI,MAAzB1W,OAAkCwN,GACrC,CAED,SAASgJ,IAAgB,QAAApW,EAAA1B,UAAAjC,OAAR+Q,EAAQ,IAAA5Q,MAAAwD,GAAA2D,EAAA,EAAAA,EAAA3D,EAAA2D,IAARyJ,EAAQzJ,GAAArF,UAAAqF,GACrBqL,EAAK0S,WAAC,EAAN,CAAMje,EAAgB6S,MAAtB1W,OAA+BwN,GAClC,CAED,SAAS0B,IAAiB,QAAA9O,EAAA1B,UAAAjC,OAAR+Q,EAAQ,IAAA5Q,MAAAwD,GAAA2D,EAAA,EAAAA,EAAA3D,EAAA2D,IAARyJ,EAAQzJ,GAAArF,UAAAqF,GACtBqL,EAAK0S,WAAC,EAAN,CAAMvd,EAAiBmS,MAAvB1W,OAAgCwN,GACnC,CAED,SAAS4B,EAAMhP,EAAOoN,GAClB,IAAIH,EAAU,GACVY,EAAU,KAEVlK,IACAkK,GAAU,IAAIgK,MAAOC,UACrB7K,GAAW,KAAOY,EAAUxK,GAAa,KAGzCnH,GAAkBkR,GAASA,EAAMgsH,eACjCnsH,GAAW,IAAMG,EAAMgsH,eAAiB,IACpChsH,EAAMisH,UACNpsH,GAAW,IAAMG,EAAMisH,UAAY,MAIvCpsH,EAAQ5Q,OAAS,IACjB4Q,GAAW,KAjBqB,QAAAC,EAAA5O,UAAAjC,OAAR2R,EAAQ,IAAAxR,MAAA0Q,EAAA,EAAAA,EAAA,KAAAzJ,EAAA,EAAAA,EAAAyJ,EAAAzJ,IAARuK,EAAQvK,EAAA,GAAAnF,UAAAmF,GAoBpCjH,MAAMklB,MAAM,KAAM1T,GAAQtE,SAAQ,SAAU1J,GACxCiN,GAAWjN,EAAO,GACrB,IAGG8D,EAAM9D,IAAUsE,GAAYA,EAAS8S,MAAMxB,MAAM0jH,UAAYt5H,GAC7D8D,EAAM9D,GAAOiN,GAIb3I,GAAYA,EAAS8S,MAAMxB,MAAMggB,eACjCxxB,EAASuwB,QAAQr4B,EAAAk0B,EAAA+oG,IAAY,CAAErtH,QAASe,EAASsN,MAAOva,GAE/D,CAUD,OARAoN,EAAW,CACPosH,UAxFJ,SAAmBx5H,GACf,MAAO,CACHi1B,MAAOnqB,EAAM5K,KAAKF,GAClBwL,MAAOkD,EAAMxO,KAAKF,GAClByM,KAAM4Y,EAAKnlB,KAAKF,GAChB8V,KAAMM,EAAKlW,KAAKF,GAChB4V,MAAO9G,EAAM5O,KAAKF,GAEzB,EAiFGy5H,uBAxEJ,SAAgCz5H,GAC5B2D,EAAmB3D,CACtB,EAuEG05H,qBA9DJ,SAA8B15H,GAC1B9D,EAAiB8D,CACpB,GA3DG2D,GAAA,EACAzH,GAAA,EACAmH,GAAY,IAAIwU,MAAOC,UAED,oBAAX9U,QAA0BA,OAAOwJ,UACxC1I,EAAM+J,GAAmBnK,EAASV,OAAOwJ,QAAQhB,OACjD1H,EAAMoJ,GAAmBxJ,EAASV,OAAOwJ,QAAQhB,OACjD1H,EAAMkK,GAAqBtK,EAASV,OAAOwJ,QAAQC,MACnD3I,EAAML,GAAkBC,EAASV,OAAOwJ,QAAQsJ,MAChDhS,EAAMK,GAAmBT,EAASV,OAAOwJ,QAAQoJ,QAmHlDxI,CACV,CAED/J,EAAMs2H,sBAAwB,QAE9B,IAAMt1H,EAAUnI,EAAAs0B,EAAAopG,oBAAiCv2H,GACjDgB,EAAQw1H,eA7Je,EA8JvBx1H,EAAQy1H,gBAAkBjsH,EAC1BxJ,EAAQ01H,gBAAkB7sH,EAC1B7I,EAAQ21H,kBAAoBhsH,EAC5B3J,EAAQ41H,eAAiBx2H,EACzBY,EAAQ61H,gBAAkB/1H,EAC1BjI,EAAAs0B,EAAA2pG,uBAAoC92H,EAAMs2H,sBAAuBt1H,GACjE+I,EAAAojB,EAAAnsB,CAAA,gBAAArE,EAAAoN,EAAAzJ,GAAA,iBAAAsJ,EAAAtJ,EAAA,MAAArH,EAAAqH,EAAA,MClKA,SAASzH,IAEL,IAAI8D,EAAW,CAAC,EAwFhB,SAASoN,EAAcA,EAAMzJ,EAAUsJ,GAEnC,IAAI3Q,GAAO,EAEX,OAAK0D,EAASoN,IAEdpN,EAASoN,GAAMwf,MAAK,SAAC5sB,EAAMoN,GACvB,GAAIpN,GAAQA,EAAK0/F,WAAa/7F,KAAcsJ,GAASA,IAAUjN,EAAKo6H,OAEhE,OADA99H,EAAM8Q,GAAA,CAGb,IACM9Q,GARqBA,CAS/B,CAMD,IAAMqH,EAAW,CACbyuB,GA1GJ,SAAYzuB,EAAMsJ,EAAU3Q,GAAqB,IAAdJ,EAAcoC,UAAAjC,OAAA,YAAAiC,UAAA,GAAAA,UAAA,GAAJ,CAAC,EAE1C,IAAKqF,EACD,MAAM,IAAI6J,MAAM,0CAEpB,IAAKP,GAAkC,mBAAdA,EACrB,MAAM,IAAIO,MAAM,gCAAkCP,GAGtD,IAAIY,EAAW3R,EAAQgvF,UAhBJ,EAkBnB,KAAI99E,EAAczJ,EAAMsJ,EAAU3Q,IAAU,GAA5C,CAEA0D,EAAS2D,GAAQ3D,EAAS2D,IAAS,GAEnC,IAAMuJ,EAAU,CACZwyF,SAAUzyF,EACVmtH,MAAA99H,EACA4uF,SAAAr9E,GAGAvR,GAASA,EAAM+9H,cACfntH,EAAQotH,SAAWh+H,EAAM+9H,eAEzB/9H,GAASA,EAAM+8H,UACfnsH,EAAQqtH,UAAYj+H,EAAM+8H,WAE1Bn9H,GAAWA,EAAQ45B,OACnB5oB,EAAQ4oB,KAAO55B,EAAQ45B,MAG3B,IAAM9nB,EAAWhO,EAAS2D,GAAMipB,MAAK,SAACxf,EAAMH,GACxC,GAAIG,GAAQS,EAAWT,EAAK89E,SAExB,OADAlrF,EAAS2D,GAAM6jB,OAAOva,EAAK,EAAGC,IAAA,CAGrC,IAEIc,GACDhO,EAAS2D,GAAMod,KAAK7T,EA5B6B,CA8BxD,EAkEGwlB,IAhEJ,SAAa/uB,EAAMsJ,EAAU3Q,GACzB,GAAKqH,GAASsJ,GAAajN,EAAS2D,GAApC,CACA,IAAMzH,EAAMkR,EAAczJ,EAAMsJ,EAAU3Q,GACtCJ,EAAM,IACV8D,EAAS2D,GAAMzH,GAAO,KAH2B,CAIpD,EA4DGy4B,QA1DJ,SAAiBvnB,GAAkC,IAA5BzJ,EAA4BrF,UAAAjC,OAAA,YAAAiC,UAAA,GAAAA,UAAA,GAAlB,CAAC,EAAG2O,EAAc3O,UAAAjC,OAAA,YAAAiC,UAAA,GAAAA,UAAA,GAAJ,CAAC,EAC5C,GAAK8O,GAASpN,EAASoN,GAAvB,CAIA,IAFAzJ,EAAUA,GAAW,CAAC,GAEV1G,eAAe,QAAS,MAAM,IAAIuQ,MAAM,mDAEpD7J,EAAQ1F,KAAOmP,EAEXH,EAAQqtH,WACR32H,EAAQ22H,SAAWrtH,EAAQqtH,UAE3BrtH,EAAQstH,YACR52H,EAAQ42H,UAAYttH,EAAQstH,WAGhCv6H,EAASoN,GACJiK,QAAO,SAACrX,GACL,SAAKA,GAGDiN,EAAQqtH,UAAYt6H,EAAQs6H,UAAYt6H,EAAQs6H,WAAartH,EAAQqtH,UAGrErtH,EAAQstH,WAAav6H,EAAQu6H,WAAav6H,EAAQu6H,YAActtH,EAAQstH,WAIvEttH,EAAQ6oB,MAAQ91B,EAAQ81B,MAAQ91B,EAAQ81B,OAAS7oB,EAAQ6oB,OAAW91B,EAAQ81B,MAAQ7oB,EAAQ6oB,MAAQ7oB,EAAQ6oB,OAASx5B,EAAAk0B,EAAAgqG,sBAI7H,IACA9wH,SAAQ,SAAA1J,GAAO,OAAIA,GAAWA,EAAQ0/F,SAASxiG,KAAK8C,EAAQo6H,MAAOz2H,EAApD,GAhCgB,CAiCvC,EAyBGqrC,MARJ,WACIhvC,EAAW,CAAC,CACf,GASD,OAAO2D,CACV,CAEDzH,EAASy9H,sBAAwB,WACjC,IAAM9rH,EAAUZ,EAAAujB,EAAAopG,oBAAiC19H,GACjD2R,EAAQ4sH,mBA5HmB,EA6H3B5sH,EAAQ6sH,oBA5HoB,IA6H5BztH,EAAAujB,EAAA2pG,uBAAoCj+H,EAASy9H,sBAAuB9rH,GACpET,EAAAojB,EAAA3iB,CAAA,gBAAA7N,EAAAoN,GAAA,aC9HA,IAAMzJ,EAAgB,WAElB,IAAI3D,EACAoN,EAAoB,GAClBzJ,EAAqB,CAAC,EACtBsJ,EAAiB,CAAC,EAuBxB,SAAS3Q,EAAqB0D,EAAS2D,GACnC,IAAK,IAAMsJ,KAAKG,EAAmB,CAC/B,IAAM9Q,EAAM8Q,EAAkBH,GAC9B,GAAI3Q,EAAIkE,UAAYR,GAAW1D,EAAI6B,OAASwF,EACxC,OAAOrH,EAAImE,QAElB,CACD,OAAO,IACV,CA2CD,SAASvE,EAAiB8D,EAAMoN,GAC5B,OAAOA,EAAepN,EACzB,CAED,SAAS6N,EAAc7N,EAAMoN,EAASzJ,GAC9B3D,KAAQ2D,IACRA,EAAe3D,GAAQoN,EAE9B,CAmFD,SAASF,EAAME,EAAkBzJ,EAASsJ,GAEtC,IAAI3Q,EACEJ,EAAYkR,EAAiBusH,sBAC7B9rH,EAAkBlK,EAAQzH,GAEhC,GAAI2R,EAAiB,CAEjB,IAAIX,EAAYW,EAAgBpN,SAEhC,IAAIoN,EAAgB8sH,SAiBhB,OAAOztH,EAAUwU,MAAM,CACnBlhB,QAAAmD,EACAi3H,QAAS56H,GACViN,GAXH,IAAK,IAAMe,KAPX1R,EAAgB8Q,EAAiBsU,MAAM,CAAClhB,QAAAmD,GAAUsJ,GAClDC,EAAYA,EAAUwU,MAAM,CACxBlhB,QAAAmD,EACAi3H,QAAS56H,EACTo1B,OAAQ94B,GACT2Q,GAGK3Q,EAAcW,eAAe+Q,KAC7B1R,EAAc0R,GAAQd,EAAUc,GAY/C,MAEG1R,EAAgB8Q,EAAiBsU,MAAM,CAAClhB,QAAAmD,GAAUsJ,GAMtD,OAFA3Q,EAAc88H,aAAe,WAAa,OAAOl9H,CAAW,EAErDI,CACV,CAeD,OAbA0D,EAAW,CACPW,OAhNJ,SAAgBX,EAAMoN,EAAezJ,EAAUsJ,IACtCA,EAAQjN,IAASoN,IAClBH,EAAQjN,GAAQ,CACZS,SAAU2M,EACVutH,SAAUh3H,GAGrB,EA0MGk3H,qBAAsBv+H,EACtBw+H,qBA1KJ,SAA8B96H,EAAS2D,EAAWsJ,GAC9C,IAAK,IAAM3Q,KAAK8Q,EAAmB,CAC/B,IAAMlR,EAAMkR,EAAkB9Q,GAC9B,GAAIJ,EAAIsE,UAAYR,GAAW9D,EAAIiC,OAASwF,EAExC,YADAyJ,EAAkB9Q,GAAGmE,SAAWwM,EAGvC,CACDG,EAAkB2T,KAAK,CACnB5iB,KAAMwF,EACNnD,QAASR,EACTS,SAAUwM,GAEjB,EA8JG8tH,yBArJJ,SAAkC/6H,GAC9BoN,EAAoBA,EAAkBiK,QAAO,SAAAjK,GAAC,OAAIA,EAAE5M,UAAYR,CAAlB,GACjD,EAoJG45H,oBAlFJ,SAA6B55H,GACzB,IAAIiN,EAAU/Q,EAAiB8D,EAAiB25H,sBAAuBh2H,GA6BvE,OA5BKsJ,IACDA,EAAU,SAAUtJ,GAChB,IAAIsJ,EAIJ,YAAO,IAHHtJ,IACAA,EAAU,CAAC,GAER,CACHw1H,YAAa,WAcT,OAZKlsH,IACDA,EAAW3Q,EAAqBqH,EAAS3D,EAAiB25H,wBAGzD1sH,IACDA,EAAWC,EAAMlN,EAAkB2D,EAASrF,WAC5C8O,EAAkB2T,KAAK,CACnB5iB,KAAM6B,EAAiB25H,sBACvBn5H,QAASmD,EACTlD,SAAUwM,KAGXA,CACV,EAER,EACDtJ,EAAmB3D,EAAiB25H,uBAAyB1sH,GAG1DA,CACV,EAoDG+tH,0BAvFJ,SAAmCh7H,GAC/B,OAAO9D,EAAiB8D,EAAM2D,EACjC,EAsFGw2H,uBA5FJ,SAAgCn6H,EAAMoN,GAClCS,EAAc7N,EAAMoN,EAASzJ,EAChC,EA2FGs3H,gBAvHJ,SAAyBj7H,GACrB,IAAIoN,EAAUlR,EAAiB8D,EAAiB25H,sBAAuB1sH,GAgBvE,OAdKG,IACDA,EAAU,SAAUA,GAIhB,YAAO,IAHHA,IACAA,EAAU,CAAC,GAER,CACHxM,OAAQ,WACJ,OAAOsM,EAAMlN,EAAkBoN,EAAS9O,UAC3C,EAER,EAED2O,EAAejN,EAAiB25H,uBAAyBvsH,GAEtDA,CACV,EAsGG8tH,sBA5HJ,SAA+Bl7H,GAC3B,OAAO9D,EAAiB8D,EAAMiN,EACjC,EA2HGkuH,mBAjIJ,SAA4Bn7H,EAAMoN,GAC9BS,EAAc7N,EAAMoN,EAASH,EAChC,GAkIMjN,CAEV,CArOqB,GAuOtBoN,EAAAojB,EAAA7sB,CAAA,gBAAA3D,EAAAoN,EAAAzJ,GAAA,iBAAAsJ,EAAAtJ,EAAA,MAAArH,EAAAqH,EAAA,KAAAzH,EAAAyH,EAAA,MAAAkK,EAAAlK,EAAA,MAAAuJ,EAAAvJ,EAAA,MAAAqK,EAAArK,EAAA,MAAAF,EAAAE,EAAA,eAAAQ,EAAAnE,GAAA,OAAAmE,EAAA,mBAAAZ,QAAA,iBAAAA,OAAA85E,SAAA,SAAAr9E,GAAA,cAAAA,CAAA,WAAAA,GAAA,OAAAA,GAAA,mBAAAuD,QAAAvD,EAAA5D,cAAAmH,QAAAvD,IAAAuD,OAAAxG,UAAA,gBAAAiD,CAAA,EAAAmE,EAAAnE,EAAA,UAAAqD,EAAArD,EAAAoN,EAAAzJ,GAAA,OAAAyJ,KAAApN,EAAAlD,OAAAmC,eAAAe,EAAAoN,EAAA,CAAAtF,MAAAnE,EAAAy4D,YAAA,EAAA0hB,cAAA,EAAAs9C,UAAA,IAAAp7H,EAAAoN,GAAAzJ,EAAA3D,CAAA,CC4kBA,SAASqE,IAAW,IAAArE,EAAAoN,EAEVzJ,EAAU2S,KAAK9V,QACfyM,GAAA,EAAWe,EAAAwiB,GAAS7sB,GAASw1H,cAC7B90H,EAAmB,CACrB,4BAA6BZ,EAAA+sB,EAAA6qG,2BAC7B,yCAA0C53H,EAAA+sB,EAAA8qG,0CAC1C,gCAAiC73H,EAAA+sB,EAAA+qG,gCACjC,yCAA0C93H,EAAA+sB,EAAAgrG,kCAC1C,yCAA0C/3H,EAAA+sB,EAAAirG,mCAQxCr3H,EAAkB,CACpBwR,MAAO,CACH0jH,SAAUp9H,EAAAs0B,EAAAwpG,kBACVpkG,eAAA,GAEJ8lG,UAAW,CACPC,mBAAoB,IACpBC,4BAA6B,IAC7BC,4BAA6B,IAC7BC,sCAAuC,EACvCC,mBAAA,EACAC,yBAAA,EACAC,4BAAA,EACAC,sBAAA,EACAC,4BAA6B,IAC7BC,mCAAA,EACAC,iBAAA,EACAC,oCAAA,EACAC,aAAc,CACVC,sCAAA,EACAC,yBAAA,GAEJC,gBAAiB,CACbC,yBAAA,EACAC,2BAAA,GAEJC,QAAS,CACLC,aAAc,KAElBC,MAAO,CACHC,uBAAwBrpF,IACxBspF,UAAWtpF,IACXupF,+BAAA,GAEJC,WAAY,CACRC,yBAAA,EACAC,yBAAA,EACAC,8BAAA,GAEJj8G,OAAQ,CACJk8G,4BAAA,EACAC,mBAAA,EACAC,0BAAA,EACAC,4BAAA,EACAC,sBAAuB,GACvBC,aAAc,GACdC,uBAAwB,GACxBC,+BAAgC,GAChCC,mBAAoBpqF,IACpBqqF,iBAAkB,GAClBC,iCAAkC,IAClCC,eAAgB,GAChBC,iBAAA,EACAC,eAAA,EACAC,8BAAA,EACAC,6BAAA,EACAC,6BAAA,EACAC,kCAAA,GAEJC,KAAM,CACFC,UAAA,EACAC,eAAA,EACAC,cAAe,IACfC,UAAW,GACXC,eAAA,EACAC,gBAAA,EACAC,UAAW,IAEfC,mBAAoB,CAChBh/D,SAAA,EACAi/D,iCAAA,EACAC,mBAAoB,EACpBC,wBAAyB,GACzBC,+BAAgC,IAChCC,+BAAgC,EAChCC,wCAAyC,EACzCC,oBAAqB,IACrBC,+CAAA,EACAC,oBAAqB,CACjB9xH,OAAQ,qCACR9F,MAAO,oCAGf63H,WAAY,CACRC,eAAgB,IAChBC,kBAAmB,EACnBC,qBAAA,GAEJ/7G,KAAM,CACFg8G,gBAAA,EACAC,4BAAA,EACAC,qBAAA,EACAC,KAAM,CACFC,uBAAA,EACAC,cAAA,GAEJC,OAAQ,CACJC,wBAAA,IAGRC,YAAa,CACTC,SAAU7sF,IACV9Z,aAAc,CACVle,IAAKg4B,IACL/3B,IAAK+3B,KAET8sF,kBAAmB,GACnBxgE,QAAS,KACTnqC,KAAMjoB,EAAA2iB,EAAAkwG,2BAEVC,uBAAwB,CACpB1gE,SAAA,EACA2gE,IAAK,MAETC,6BAA8B,CAC1B5gE,SAAA,EACA2gE,IAAK,MAETE,iDAAA,EACAC,oBAAqB,CACjBxkH,MAAO,GACPD,MAAO,GAEX0kH,gBAAiB,CACb1kH,MAAOzO,EAAA2iB,EAAAywG,iCACP1kH,MAAO1O,EAAA2iB,EAAA0wG,iCAEXC,6BAA8BtzH,EAAA2iB,EAAA4wG,gDAC9BC,uBAAwB,IACxBC,gCAAiC,EACjCC,uBAAwB,IACxBC,gBAAcxhI,EAAA,GAAAqD,EAAArD,EACTkN,EAAAgJ,EAAAurH,SAAuB,KADdp+H,EAAArD,EAETkN,EAAAgJ,EAAAwrH,qBAAmC,KAF1Br+H,EAAArD,EAGTkN,EAAAgJ,EAAAyrH,mBAAiC,KAHxBt+H,EAAArD,EAITkN,EAAAgJ,EAAA0rH,kBAAgC,KAJvBv+H,EAAArD,EAKTkN,EAAAgJ,EAAA2rH,iCAA+C,KALtCx+H,EAAArD,EAMTkN,EAAAgJ,EAAA4rH,mBAAiC,KANxBz+H,EAAArD,EAOTkN,EAAAgJ,EAAA6rH,+BAA6C,KAPpC1+H,EAAArD,EAQTkN,EAAAgJ,EAAA8rH,QAAsB,KARb3+H,EAAArD,EASTkN,EAAAgJ,EAAA+rH,WAAyB,KAThB5+H,EAAArD,EAAA,4BAUiB,IAVjBA,GAYdkiI,eAAa90H,EAAA,GAAA/J,EAAA+J,EACRF,EAAAgJ,EAAAurH,SAAuB,GADfp+H,EAAA+J,EAERF,EAAAgJ,EAAAwrH,qBAAmC,GAF3Br+H,EAAA+J,EAGRF,EAAAgJ,EAAAyrH,mBAAiC,GAHzBt+H,EAAA+J,EAIRF,EAAAgJ,EAAA0rH,kBAAgC,GAJxBv+H,EAAA+J,EAKRF,EAAAgJ,EAAA2rH,iCAA+C,GALvCx+H,EAAA+J,EAMRF,EAAAgJ,EAAA4rH,mBAAiC,GANzBz+H,EAAA+J,EAORF,EAAAgJ,EAAA6rH,+BAA6C,GAPrC1+H,EAAA+J,EAQRF,EAAAgJ,EAAA8rH,QAAsB,GARd3+H,EAAA+J,EASRF,EAAAgJ,EAAA+rH,WAAyB,GATjB5+H,EAAA+J,EAAA,2BAUiB,GAVjBA,GAYb+0H,IAAK,CACDC,oBAAqBv0H,EAAA2iB,EAAA6xG,8BACrBC,YAAaz0H,EAAA2iB,EAAA+xG,qBACbC,mBAAoB,CAChBC,wBAAA,EACAC,mBAAA,EACAC,mBAAA,EACAC,qBAAA,GAEJC,mBAAoB,CAChBD,oBAAqB,CACjBE,mBAAoB,IACpBC,kBAAmB,IACnBC,mBAAoB,IAG5BC,sBAAuB,GACvBC,oBAAA,EACAC,oBAAA,EACAC,sBAAA,EACAC,qCAAA,EACA/+F,WAAY,CACRhoB,OAAQ,EACRC,OAAQ,GAEZmqB,WAAY,CACRpqB,OAAQ,EACRC,OAAQ,GAEZ+mH,uBAAwB,CACpBhnH,MAAO,EACPC,MAAO,GAEXgnH,eAAgB,CACZjnH,OAAQ,EACRC,OAAQ,GAEZinH,2BAA4B,CACxBlnH,OAAQ,EACRC,OAAQ,GAEZknH,kBAAmB,CACfnnH,OAAA,EACAC,OAAA,GAEJmnH,+BAAgC71H,EAAA2iB,EAAAmzG,+CAEpC1zD,KAAM,CACFhQ,SAAA,EACAiP,IAAK,KACLC,IAAK,KACLX,IAAK,KACLo1D,gBAAiB,EACjB9tG,KAAMjoB,EAAA2iB,EAAAqzG,gBACNC,YAAa,CAAC,KAAM,IAAK,KAAM,KAAM,KAAM,KAAM,MAAO,MAAO,MAAO,KAAM,KAAM,MAAO,MAAO,KAAM,KAAM,MAAO,KAAM,MAE7HC,KAAM,CACF9jE,SAAA,EACAkiE,IAAK,CACD6B,SAAA,EACAC,eAAgB,KAI5BC,OAAQ,CACJC,gBAAiB,CACbC,iBAAkB,KAK1B9/H,EAAWhI,EAAAk0B,EAAA6zG,MAAYjgI,GAI3B,SAASN,EAAc9D,EAAQoN,EAAMzJ,GACjC,IAAK,IAAIzH,KAAK8D,EACNA,EAAO/C,eAAef,KAClBkR,EAAKnQ,eAAef,GACK,WAArBiI,EAAOnE,EAAO9D,KAAqB8D,EAAO9D,aAAcM,OAAwB,OAAdwD,EAAO9D,IAGzEkR,EAAKlR,GAAKI,EAAAk0B,EAAA6zG,MAAYrkI,EAAO9D,IACzBmI,EAAiBV,EAAOzH,IACxB+Q,EAAS0nB,QAAQtwB,EAAiBV,EAAOzH,KAJ7C4H,EAAc9D,EAAO9D,GAAIkR,EAAKlR,GAAIyH,EAAK+S,QAAUxa,EAAI,KAQzDsQ,QAAQhB,MAAM,sBAAwB7H,EAAOzH,EAAI,qBAIhE,CA4CD,MANW,CACPkb,IAhCJ,WACI,OAAO9S,CACV,EA+BGm9B,OAlBJ,SAAgBzhC,GACe,WAAvBmE,EAAOnE,IACP8D,EAAc9D,EAAasE,EAAU,GAE5C,EAeG0qC,MAPJ,WACI1qC,EAAWhI,EAAAk0B,EAAA6zG,MAAYjgI,EAC1B,EASJ,CAGDC,EAASs1H,sBAAwB,WACjC,IAAIv1H,EAAU6I,EAAAujB,EAAAopG,oBAAiCv1H,GAC/C+I,EAAAojB,EAAApsB,CAAA,eAAApE,EAAAoN,EAAAzJ,GAAA,iBAAAsJ,EAAAtJ,EAAA,MAAArH,EAAAqH,EAAAA,EAAAsJ,GAAA/Q,EAAAyH,EAAA,eAAAkK,EAAA7N,GAAA,OAAA6N,EAAA,mBAAAtK,QAAA,iBAAAA,OAAA85E,SAAA,SAAAr9E,GAAA,cAAAA,CAAA,WAAAA,GAAA,OAAAA,GAAA,mBAAAuD,QAAAvD,EAAA5D,cAAAmH,QAAAvD,IAAAuD,OAAAxG,UAAA,gBAAAiD,CAAA,EAAA6N,EAAA7N,EAAA,UAAAkN,EAAAlN,EAAAoN,GAAA,QAAAzJ,EAAA,EAAAA,EAAAyJ,EAAA/Q,OAAAsH,IAAA,KAAAsJ,EAAAG,EAAAzJ,GAAAsJ,EAAAmvD,WAAAnvD,EAAAmvD,aAAA,EAAAnvD,EAAA6wE,cAAA,YAAA7wE,IAAAA,EAAAmuH,UAAA,GAAAt+H,OAAAmC,eAAAe,EAAAiN,EAAA9P,IAAA8P,EAAA,MCxmCMe,EAAA,oBAAAhO,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,2CAAA3oD,EAAA,KAAA2D,EAAA,OAAAA,EAAA,EAAAxG,IAAA,QAAA2K,MACF,SAAasF,EAAMzJ,EAAQsJ,GACvB,IAAI3Q,EACAJ,EAAQ,CAAC,EACb,GAAIkR,EACA,IAAK,IAAIF,KAAQvJ,EACTA,EAAO1G,eAAeiQ,KACtB5Q,EAAIqH,EAAOuJ,GACLA,KAAQE,IAAUA,EAAKF,KAAU5Q,GAAQ4Q,KAAQhR,GAAUA,EAAMgR,KAAU5Q,KACnD,WAAtBuR,EAAOT,EAAKF,KAAqC,OAAfE,EAAKF,GACvCE,EAAKF,GAAQlN,EAAMskI,MAAMl3H,EAAKF,GAAO5Q,EAAG2Q,GAExCG,EAAKF,GAAQD,EAAK3Q,KAMtC,OAAO8Q,CACV,IAAAjQ,IAAA,QAAA2K,MAED,SAAasF,GACT,IAAKA,GAAsB,WAAfS,EAAOT,GACf,OAAOA,EAEX,IAAIzJ,EACJ,GAAIyJ,aAAe5Q,MAAO,CAEtBmH,EAAI,GACJ,IAAK,IAAIsJ,EAAI,EAAG3Q,EAAI8Q,EAAI/Q,OAAQ4Q,EAAI3Q,IAAK2Q,EACjCA,KAAKG,GACLzJ,EAAEod,KAAK/gB,EAAMqkI,MAAMj3H,EAAIH,IAGlC,MACGtJ,EAAI,CAAC,EAET,OAAO3D,EAAMskI,MAAM3gI,EAAGyJ,EAAKpN,EAAMqkI,MACpC,IAAAlnI,IAAA,kCAAA2K,MAED,SAAuC9H,EAAKoN,GACxC,IACI,IAAKA,GAA4B,IAAlBA,EAAO/Q,OAClB,OAAO2D,EAGX,IAAI2D,EAAc,IAAIykB,IAAIpoB,GAQ1B,OANAoN,EAAO1D,SAAQ,SAAC1J,GACRA,EAAM7C,KAAO6C,EAAM8H,OACnBnE,EAAY0kB,aAAaxO,IAAI7Z,EAAM7C,IAAK6C,EAAM8H,MAErD,IAEMnE,EAAYtB,IAKtB,CAFC,MAAO+K,GACL,OAAOpN,CACV,CACJ,IAAA7C,IAAA,mBAAA2K,MAED,SAAwB9H,GACpB,IAAIoN,EAAU,CAAC,EACf,IAAKpN,EACD,OAAOoN,EAMX,IADA,IAAIzJ,EAAc3D,EAAUqN,OAAOgB,MAAM,QAChCpB,EAAI,EAAG3Q,EAAOqH,EAAYtH,OAAQ4Q,EAAI3Q,EAAM2Q,IAAK,CACtD,IAAI/Q,EAAayH,EAAYsJ,GACzBY,EAAQ3R,EAAWuM,QAAQ,MAC3BoF,EAAQ,IACRT,EAAQlR,EAAWiS,UAAU,EAAGN,IAAU3R,EAAWiS,UAAUN,EAAQ,GAE9E,CACD,OAAOT,CACV,IAAAjQ,IAAA,eAAA2K,MAED,WACI,IAAI9H,GAAK,IAAI6X,MAAOC,UAMpB,MALa,uCAAuCtV,QAAQ,SAAS,SAAU4K,GAC3E,IAAMzJ,GAAK3D,EAAqB,GAAhB4O,KAAKyhE,UAAiB,GAAK,EAE3C,OADArwE,EAAK4O,KAAK2Q,MAAMvf,EAAK,KACR,KAALoN,EAAWzJ,EAAS,EAAJA,EAAU,GAAM3G,SAAS,GACpD,GAEJ,IAAAG,IAAA,mBAAA2K,MAED,SAAwB9H,GACpB,IAAIoN,EAAO,EAEX,GAAsB,IAAlBpN,EAAO3D,OACP,OAAO+Q,EAGX,IAAK,IAAIzJ,EAAI,EAAGA,EAAI3D,EAAO3D,OAAQsH,IAE/ByJ,GAASA,GAAQ,GAAKA,EADVpN,EAAO8f,WAAWnc,GAE9ByJ,GAAQ,EAEZ,OAAOA,CACV,IAAAjQ,IAAA,iBAAA2K,MAQD,SAAsB9H,EAAaoN,GAC/B,IACI,IAAMzJ,EAAW,IAAIykB,IAAIpoB,GACnBiN,EAAS,IAAImb,IAAIhb,GAIvB,GADAzJ,EAASpB,SAAW0K,EAAO1K,SACvBoB,EAAS4qE,SAAWthE,EAAOshE,OAC3B,OAAOnhE,EAIX,IAAIlR,EAAeI,IAAAioI,SAAc5gI,EAASb,SAASstH,OAAO,EAAGzsH,EAASb,SAASsL,YAAY,MAAOnB,EAAOnK,SAASstH,OAAO,EAAGnjH,EAAOnK,SAASsL,YAAY,OAGlJP,EAA2C,IAAxB3R,EAAaG,OAAe,EAAI,EAIzD,OAHAH,GAAgB+Q,EAAOnK,SAASstH,OAAOnjH,EAAOnK,SAASsL,YAAY,KAAOP,EAAkBZ,EAAOnK,SAASzG,OAAS,GAGjH4Q,EAAOnK,SAASzG,OAASH,EAAaG,OAC/B4Q,EAAOnK,SAEX5G,CAGV,CAFC,MAAO8D,GACL,OAAOoN,CACV,CACJ,IAAAjQ,IAAA,iBAAA2K,MAED,WAAiC,IAAX9H,EAAW1B,UAAAjC,OAAA,YAAAiC,UAAA,GAAAA,UAAA,GAAN,KACvB,IACI,IAAM8O,EAAkB,OAAPpN,GAAmC,oBAAd8B,UAA4BA,UAAUC,UAAU6H,cAAqB,GAE3G,OAAO,EAAA1N,EAAAsoI,UAASp3H,EAInB,CAFD,MAAMpN,GACF,MAAO,CAAC,CACX,CACJ,IAAA7C,IAAA,oBAAA2K,MAOD,SAAyB9H,GACrB,MAAQ,mBAAmB6B,KAAK7B,EACnC,IAAA2D,GAAAuJ,EA9JClN,EA8JD2D,GAAA3D,CAAA,CA9JC,GAiKNoN,EAAAojB,EAAAxiB,CAAA,gBAAAhO,EAAAoN,EAAAzJ,GAAA,aCvMO,SAASsJ,IACZ,MAFY,OAGf,CAAAtJ,EAAAU,EAAA+I,EAAA,CAAApN,EAAA,kBAAAiN,CAAA,mBAAAjN,EAAAoN,GAAA,sBAAAzJ,EAAA3D,EAAAoN,GAAA,QAAAzJ,EAAA,EAAAA,EAAAyJ,EAAA/Q,OAAAsH,IAAA,KAAAsJ,EAAAG,EAAAzJ,GAAAsJ,EAAAmvD,WAAAnvD,EAAAmvD,aAAA,EAAAnvD,EAAA6wE,cAAA,YAAA7wE,IAAAA,EAAAmuH,UAAA,GAAAt+H,OAAAmC,eAAAe,EAAAiN,EAAA9P,IAAA8P,EAAA,MC+BKA,EAAA,oBAAAjN,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,2CAAA3oD,EAAA,KAAAiN,EAAA,OAAAA,EAAA,EAAA9P,IAAA,SAAA2K,MACF,SAAQ9H,EAAQoN,GACZ,GAAKpN,EAAL,CAEA,IAAI2D,IAAWyJ,GAASA,EAAOutH,SAC3B1tH,IAAaG,GAASA,EAAOq3H,WAGjC,IAAK,IAAMnoI,KAAO0D,GACTA,EAAO/C,eAAeX,IAASga,KAAKha,KAASqH,GAC9CsJ,IAAkD,IAApCjN,EAAO1D,GAAKmM,QAAQ,aACtC6N,KAAKha,GAAO0D,EAAO1D,GATJ,CAYtB,MAAAqH,EAdC3D,EAcDjD,UAAAkQ,GAAAjN,CAAA,CAdC,GAiBNoN,EAAAojB,EAAAvjB,CAAA,gBAAAjN,EAAAoN,EAAAzJ,GAAA,sBAAAsJ,EAAAjN,GAAA,OAAAiN,EAAA,mBAAA1J,QAAA,iBAAAA,OAAA85E,SAAA,SAAAr9E,GAAA,cAAAA,CAAA,WAAAA,GAAA,OAAAA,GAAA,mBAAAuD,QAAAvD,EAAA5D,cAAAmH,QAAAvD,IAAAuD,OAAAxG,UAAA,gBAAAiD,CAAA,EAAAiN,EAAAjN,EAAA,UAAA1D,EAAA0D,EAAAoN,GAAA,OAAA9Q,EAAAQ,OAAA4nI,gBAAA,SAAA1kI,EAAAoN,GAAA,OAAApN,EAAA8oD,UAAA17C,EAAApN,CAAA,EAAA1D,EAAA0D,EAAAoN,EAAA,UAAAlR,EAAA8D,EAAAoN,GAAA,OAAAA,GAAA,WAAAH,EAAAG,IAAA,mBAAAA,EAAA,SAAApN,GAAA,YAAAA,EAAA,UAAAwxC,eAAA,oEAAAxxC,CAAA,EAAAA,GAAAoN,CAAA,UAAAS,EAAA7N,GAAA,OAAA6N,EAAA/Q,OAAA4nI,eAAA5nI,OAAAuC,eAAA,SAAAW,GAAA,OAAAA,EAAA8oD,WAAAhsD,OAAAuC,eAAAW,EAAA,EAAA6N,EAAA7N,EAAA,KCZMkN,EAAA,SAAAlN,IAAA,SAAAA,EAAAoN,GAAA,sBAAAA,GAAA,OAAAA,EAAA,UAAAu7C,UAAA,sDAAA3oD,EAAAjD,UAAAD,OAAA8D,OAAAwM,GAAAA,EAAArQ,UAAA,CAAAX,YAAA,CAAA0L,MAAA9H,EAAAo7H,UAAA,EAAAt9C,cAAA,KAAA1wE,GAAA9Q,EAAA0D,EAAAoN,EAAA,EAAAF,EAAAlN,GAAA,IAAAoN,EAAAzJ,EAAAsJ,GAAAG,EAAAF,EAAAvJ,EAAA,kCAAA45E,UAAAA,QAAAC,UAAA,YAAAD,QAAAC,UAAAmnD,KAAA,+BAAAC,MAAA,oBAAA9nB,QAAA//G,UAAAF,QAAAK,KAAAqgF,QAAAC,UAAAs/B,QAAA,6BAAA98G,GAAA,4BAAAA,EAAAiN,EAAAY,EAAAT,GAAA,GAAAzJ,EAAA,KAAArH,EAAAuR,EAAA,MAAAzR,YAAA4D,EAAAu9E,QAAAC,UAAAvwE,EAAA3O,UAAAhC,EAAA,MAAA0D,EAAAiN,EAAAyU,MAAA,KAAApjB,WAAA,OAAApC,EAAA,KAAA8D,EAAA,GACF,SAAAkN,IAAe,IAAAlN,EAAA,gBAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,2CAAAz7C,IACXlN,EAAAiN,EAAA/P,KAAA,OACK2nI,wBAA0B,wBAC/B7kI,EAAK8kI,oBAAsB,qBAC3B9kI,EAAK+kI,eAAiB,gBACtB/kI,EAAKglI,4BAA8B,2BACnChlI,EAAKilI,2BAA6B,2BAClCjlI,EAAKklI,8BAAgC,6BACrCllI,EAAKmlI,mBAAqB,mBAC1BnlI,EAAKolI,sBAAwB,sBAC7BplI,EAAKqlI,sBAAwB,sBAC7BrlI,EAAKslI,cAAgB,eACrBtlI,EAAKulI,sBAAwB,sBAC7BvlI,EAAKwlI,qBAAuB,qBAC5BxlI,EAAKylI,qBAAuB,qBAC5BzlI,EAAK0lI,yBAA2B,yBAChC1lI,EAAK2lI,yBAA2B,yBAChC3lI,EAAK4lI,kBAAoB,mBACzB5lI,EAAK6lI,iBAAmB,kBACxB7lI,EAAK8lI,sBAAwB,sBAC7B9lI,EAAK+lI,kBAAoB,iBACzB/lI,EAAKgmI,iBAAmB,kBACxBhmI,EAAKimI,sBAAwB,sBAC7BjmI,EAAKkmI,sBAAwB,sBAC7BlmI,EAAKmmI,eAAiB,gBACtBnmI,EAAKomI,+BAAiC,8BACtCpmI,EAAKqmI,mCAAqC,kCAC1CrmI,EAAKsmI,wCAA0C,8BAC/CtmI,EAAKumI,4CAA8C,kCACnDvmI,EAAKwmI,wCAA0C,sCAC/CxmI,EAAKymI,4CAA8C,0CACnDzmI,EAAK0mI,mCAAqC,iCAC1C1mI,EAAK2mI,wBAA0B,uBAC/B3mI,EAAK4mI,oBAAsB,oBAC3B5mI,EAAK6mI,iBAAmB,kBACxB7mI,EAAK8mI,2BAA6B,2BAClC9mI,EAAK+mI,4BAA8B,4BACnC/mI,EAAKgnI,8BAAgC,6BACrChnI,EAAKinI,+BAAiC,8BACtCjnI,EAAKknI,wBAA0B,uBAC/BlnI,EAAKmnI,sBAAwB,sBAC7BnnI,EAAKonI,qBAAuB,qBAC5BpnI,EAAKqnI,uBAAyB,uBAC9BrnI,EAAKsnI,qBAAuB,qBAC5BtnI,EAAKunI,YAAc,aACnBvnI,EAAKwnI,YAAc,aACnBxnI,EAAKq7H,2BAA6B,0BAClCr7H,EAAKs7H,0CAA4C,uCACjDt7H,EAAKu7H,gCAAkC,+BACvCv7H,EAAKw7H,kCAAoC,gCACzCx7H,EAAKy7H,kCAAoC,gCAlD9Bz7H,CAmDd,QAAAkN,CAAA,CApDC,CAAAvJ,EAAA,MAAmB6sB,GAuDzBpjB,EAAAojB,EAAAtjB,CAAA,gBAAAlN,EAAAoN,EAAAzJ,GAAA,sBAAAsJ,EAAAjN,GAAA,OAAAiN,EAAA,mBAAA1J,QAAA,iBAAAA,OAAA85E,SAAA,SAAAr9E,GAAA,cAAAA,CAAA,WAAAA,GAAA,OAAAA,GAAA,mBAAAuD,QAAAvD,EAAA5D,cAAAmH,QAAAvD,IAAAuD,OAAAxG,UAAA,gBAAAiD,CAAA,EAAAiN,EAAAjN,EAAA,UAAA1D,EAAA0D,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,8CAAAzsD,EAAA8D,EAAAoN,GAAA,OAAAlR,EAAAY,OAAA4nI,gBAAA,SAAA1kI,EAAAoN,GAAA,OAAApN,EAAA8oD,UAAA17C,EAAApN,CAAA,EAAA9D,EAAA8D,EAAAoN,EAAA,UAAAS,EAAA7N,EAAAoN,GAAA,OAAAA,GAAA,WAAAH,EAAAG,IAAA,mBAAAA,EAAA,SAAApN,GAAA,YAAAA,EAAA,UAAAwxC,eAAA,oEAAAxxC,CAAA,EAAAA,GAAAoN,CAAA,UAAAF,EAAAlN,GAAA,OAAAkN,EAAApQ,OAAA4nI,eAAA5nI,OAAAuC,eAAA,SAAAW,GAAA,OAAAA,EAAA8oD,WAAAhsD,OAAAuC,eAAAW,EAAA,EAAAkN,EAAAlN,EAAA,KC3DMgO,EAAA,SAAAhO,IAAA,SAAAA,EAAAoN,GAAA,sBAAAA,GAAA,OAAAA,EAAA,UAAAu7C,UAAA,sDAAA3oD,EAAAjD,UAAAD,OAAA8D,OAAAwM,GAAAA,EAAArQ,UAAA,CAAAX,YAAA,CAAA0L,MAAA9H,EAAAo7H,UAAA,EAAAt9C,cAAA,KAAA1wE,GAAAlR,EAAA8D,EAAAoN,EAAA,EAAAY,EAAAhO,GAAA,IAAAoN,EAAAzJ,EAAAsJ,GAAAG,EAAAY,EAAArK,EAAA,kCAAA45E,UAAAA,QAAAC,UAAA,YAAAD,QAAAC,UAAAmnD,KAAA,+BAAAC,MAAA,oBAAA9nB,QAAA//G,UAAAF,QAAAK,KAAAqgF,QAAAC,UAAAs/B,QAAA,6BAAA98G,GAAA,4BAAAA,EAAAiN,EAAAC,EAAAE,GAAA,GAAAzJ,EAAA,KAAArH,EAAA4Q,EAAA,MAAA9Q,YAAA4D,EAAAu9E,QAAAC,UAAAvwE,EAAA3O,UAAAhC,EAAA,MAAA0D,EAAAiN,EAAAyU,MAAA,KAAApjB,WAAA,OAAAuP,EAAA,KAAA7N,EAAA,YAAAgO,IAAA,OAAA1R,EAAA,KAAA0R,GAAAf,EAAAyU,MAAA,KAAApjB,UAAA,QAAA0P,CAAA,EAAArK,EAAA,MAAe6sB,GAEjB/sB,EAAS,IAAIuK,EACjBZ,EAAAojB,EAAA/sB,CAAA,gBAAAzD,EAAAoN,GAAA,sBAAAzJ,EAAA3D,EAAAoN,GAAA,QAAAzJ,EAAA,EAAAA,EAAAyJ,EAAA/Q,OAAAsH,IAAA,KAAAsJ,EAAAG,EAAAzJ,GAAAsJ,EAAAmvD,WAAAnvD,EAAAmvD,aAAA,EAAAnvD,EAAA6wE,cAAA,YAAA7wE,IAAAA,EAAAmuH,UAAA,GAAAt+H,OAAAmC,eAAAe,EAAAiN,EAAA9P,IAAA8P,EAAA,MCJMA,EAAA,oBAAAjN,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,2CAAA3oD,EAAA,KAAAiN,EAAA,OAAAA,EAAA,EAAA9P,IAAA,SAAA2K,MACF,SAAQ9H,EAAQoN,GACZ,GAAKpN,EAAL,CAEA,IAAI2D,IAAWyJ,GAASA,EAAOutH,SAC3B1tH,IAAaG,GAASA,EAAOq3H,WAGjC,IAAK,IAAMnoI,KAAO0D,GACTA,EAAO/C,eAAeX,IAASga,KAAKha,KAASqH,GAC9CsJ,IAAkD,IAApCjN,EAAO1D,GAAKmM,QAAQ,aACtC6N,KAAKha,GAAO0D,EAAO1D,GATJ,CAYtB,MAAAqH,EAdC3D,EAcDjD,UAAAkQ,GAAAjN,CAAA,CAdC,GAiBNoN,EAAAojB,EAAAvjB,CAAA,gBAAAjN,EAAAoN,EAAAzJ,GAAA,iBAAAsJ,EAAAtJ,EAAA,MAAArH,EAAAqH,EAAA,MAAAzH,EAAAyH,EAAA,MAAAkK,EAAAlK,EAAA,MAAAuJ,EAAAvJ,EAAA,MAAAqK,EAAArK,EAAA,MCNA,SAASF,EAAYzD,GAIjB,IASIoN,EACAzJ,EACAzH,EACAuH,EACAU,EAbEd,GAFNrD,EAASA,GAAU,CAAC,GAEIynI,SAClBpjI,EAAQrE,EAAO4V,MACfxR,EAAWpE,EAAO0nI,SAClBpjI,EAAOtE,EAAO/B,KACd6F,EAAa9D,EAAO2nI,WACpBjkI,EAAqB1D,EAAO4nI,mBAC5B98H,EAAoB9K,EAAO6nI,kBAC3Bn5H,EAAoB1O,EAAO8nI,kBAyBjC,SAASziH,IACL,OAAO/gB,CACV,CAMD,SAAS8R,IACLla,EAAc,IACjB,CAOD,SAAS4S,EAAe9O,EAASoN,EAAazJ,GAC1C,IACIsJ,EACA3Q,EAFEJ,EAAUwS,EAAkB1I,QAAQrC,EAAe8J,MAGrDI,EAAc,CAAC,EAcnB,OAZK3R,GAAYkR,IAAgBlR,EAAQkG,KAAUgC,EAAS2jI,WAAW36H,IAGnEH,EAAM/Q,EAAQkG,IACd9F,EAAkBJ,EAAQ8rI,gBAC1Bn6H,EAAc3R,EAAQ+rI,YAElB76H,IACAH,EAAM7I,EAAS4B,QAAQoH,EAAaH,KAPxCA,EAAMG,GAWNhJ,EAAS2jI,WAAW96H,KAIxBjN,EAAQoC,IAAM6K,EACdjN,EAAQgoI,gBAAkB1rI,EAC1B0D,EAAQioI,YAAcp6H,GAAA,EAGzB,CA2BD,SAASmB,EAAsBhP,EAAWoN,GACtC,GAAI,MAAAA,EACA,OAAO,KAGX,IAAMzJ,EAAU,IAAIsJ,EAAAujB,EACdt0B,EAAiBkR,EAAQ86H,eACzBr6H,EAAY3R,EAAeisI,WAAWC,OAAOC,IAAIC,SAASC,eAAersI,EAAeisI,WAAWC,OAAO/rH,OAAOmsH,sBAAsBtsI,EAAeisI,WAAW9rH,OAAOosH,uBAAuBvsI,EAAemgB,OAAOqsH,UACvN16H,EAAMZ,EAAQoqB,MAyBlB,OAvBAxpB,GAAA,EAAMd,EAAA0/B,IAAwB5+B,EAAK,SAAUZ,EAAQu7H,mBACrD36H,GAAA,EAAMd,EAAA0/B,IAAwB5+B,EAAK,OAAQZ,EAAQw7H,iBACnD56H,GAAA,EAAMd,EAAA0/B,IAAwB5+B,EAAK,YAAaH,GAChDG,GAAA,EAAMd,EAAAo5F,IAAqBt4F,EAAK9R,EAAe+b,IAC/CjK,GAAA,EAAMd,EAAA27H,IAA0B76H,GAEhCrK,EAAQ42H,UAAYl1G,IACpB1hB,EAAQ1F,KAAO3B,EAAA4Z,EAAAyrH,mBACfh+H,EAAQ6lC,MAAQp8B,EAAQ07H,WACxBnlI,EAAQwyB,UAAY/oB,EAAQ27H,sBAC5BplI,EAAQqlI,eAAiB57H,EAAQ47H,eACjCrlI,EAAQqU,SAAW5K,EAAQ4K,SAC3BrU,EAAQghB,UAAYzoB,EAAeyoB,UACnChhB,EAAQslI,sBAAwB77H,EAAQ67H,sBACxCtlI,EAAQulI,oBAAsB97H,EAAQ87H,oBACtCvlI,EAAQwlI,yBAA2BjtI,EAAeitI,yBAClDxlI,EAAQylI,cAAgBh8H,EAAQg8H,cAChCzlI,EAAQ01G,QAAUn9G,EAAemgB,MACjC1Y,EAAQ0Y,MAAQjP,EAAQiP,MACxB1Y,EAAQ0lI,UAAYrpI,EACpB2D,EAAQ2lI,gBAAkBptI,EAAeisI,WAAW9rH,MACpD1Y,EAAQ4lI,iBAAmBrtI,EAAe+b,GAEtCnJ,EAAenL,EAASqK,EAAK9R,GACtByH,OAAA,CAEd,CA+CD,SAASxH,EAAyB6D,EAAWoN,EAAgBH,GACzD,IAAI3Q,EAAU,KAEd,IAAK8Q,IAAmBA,EAAeo8H,gBACnC,OAAOltI,EAGX,IAAMuR,EAAUnK,EAAmB+lI,iBAAiBr8H,EAAgBH,GAOpE,OANIY,IACA3R,EAAc2R,EACdlK,EAAOiS,MAAM,kBAAoB3I,EAAO,OAASY,EAAQwO,OACzD/f,EAAU0S,EAAsBhP,EAAW6N,IAGxCvR,CACV,CA+CD,SAASyW,EAAY/S,EAAWoN,EAAgBH,GAC5C,IAAI3Q,EAAU,KACRuR,EAAUnK,EAAmBgmI,kBAAkBt8H,EAAgBH,EAAgB/Q,EAAcA,EAAY8sI,gBAAkB,GAGjI,GAAKn7H,EASDvR,EAAU0S,EAAsBhP,EAAW6N,GAC3C3R,EAAc2R,MAVJ,CAEV,GAAIpK,IAAsBU,EAEtB,OADAR,EAAOiS,MAAMyP,IAAY,+BAAiCpY,EAAiB,wBACpE,KAEP9I,GAAA,CAEP,CAKD,OAAO7H,CACV,CAoFD,SAASyZ,IACLpS,EAAOiS,MAAM,2BACbzR,GAAA,CACH,CAoBD,OAlBAiJ,EAAW,CACPu8H,gBAVJ,WACI,OAAOztI,EAAcA,EAAYmgB,OAAS,CAC7C,EASGutH,eAxRJ,SAAwB5pI,EAAWoN,GAC/B,OAAKA,EAIT,SAA8BpN,EAAWoN,EAAgBzJ,GACrD,IAAMzH,EAAU,IAAI+Q,EAAAujB,EACd3iB,EAAST,EAAe+6H,WAAWC,OACnCp6H,EAAwBH,EAAO+K,MAWrC,GATA1c,EAAQq+H,UAAY52H,EACpBzH,EAAQ+B,KAAO3B,EAAA4Z,EAAA0rH,kBACf1lI,EAAQstC,MAAQp8B,EAAeo8B,MAC/BttC,EAAQ+sI,sBAAwBn+H,EAAkB++H,8CAA8C77H,EAAuBZ,EAAgB3J,GACvIvH,EAAQgtI,oBAAsBp+H,EAAkBg/H,4CAA4C97H,EAAwBH,EAAOmK,SAAU5K,EAAgB3J,GACrJvH,EAAQm9G,QAAUjsG,EAAeiP,MACjCngB,EAAQmtI,UAAYrpI,EACpB9D,EAAQqtI,iBAAmBn8H,EAAe6K,GAEtCnJ,EAAe5S,EAASkR,EAAe28H,eAAgB38H,GAEvD,OADAlR,EAAQkG,KAAA,EAAM8K,EAAA0/B,IAAwB1wC,EAAQkG,IAAK,YAAagL,EAAes7H,WACxExsI,CAEd,CAlBD,CAHgC8D,EAAWoN,EAAgBiY,KAD3B,IAE/B,EAsRG2kH,sBAnIJ,SAA+BhqI,EAAWoN,GACtC,OAAKA,GAAmBA,EAAeo8H,gBAMhCz2H,EAAY/S,EAAWoN,EAFTlR,EAAcA,EAAYmgB,MAAQ,EAAI,GAHhD,IAMd,EA4HG4tH,gCAvJJ,SAAyCjqI,EAAWoN,GAChD,IACIzJ,EAAiBzH,EAAcA,EAAYmgB,MAAQ,EAAI,EACrDpP,EAAUvJ,EAAmBgmI,kBAC/Bt8H,EACAzJ,EACAzH,EAAcA,EAAY8sI,gBAAkB,GAEhD,OAAK/7H,EACK+B,EAAsBhP,EAAWiN,GADtB,IAGxB,EA6IGi9H,yBAAA/tI,EACAk+H,YA9UJ,WACI,OAAOv2H,EAAWmU,EACrB,EA6UGkyH,cAvUJ,WACI,OAAOrmI,CACV,EAsUGu1H,QAAAh0G,EACA+kH,8BAvFJ,SAAuCpqI,EAAMoN,EAAWzJ,EAAgBsJ,GACpE,IAEI,GAAIqoB,MAAMt1B,KAAUoN,IAAczJ,EAC9B,OAAOgwC,IAWX,GARI3zC,EAAO,IACPA,EAAO,GAGPs1B,MAAMroB,KACNA,EAzS2B,IA4S3B9Q,EAAyBiR,EAAWzJ,EAAgB3D,GACpD,OAAOA,EAGX,GAAI2D,EAAewkI,WAAWC,OAAOxvH,MAAQjV,EAAewkI,WAAWC,OAAOpwH,SAAWhY,EACrF,OAAO2zC,IASX,IALA,IAAMr3C,EAAMmS,SAAS9K,EAAewkI,WAAWC,OAAOpwH,UAAYrU,EAAewkI,WAAWC,OAAOxvH,MAAQjV,EAAewkI,WAAWC,OAAOpwH,SAAWhY,EAAO,GAC1J9D,EAAmB0S,KAAK+M,IAAI3b,EAAOiN,EAAiB3Q,GACpDuR,EAAe8lC,IACfzmC,EAAgB,KAEbhR,GAAoBI,GAAK,CAC5B,IAAI0R,EAAe,KAMnB,GAJI9R,GAAoBI,IACpB0R,EAAe7R,EAAyBiR,EAAWzJ,EAAgBzH,IAGnE8R,EAAc,CACdH,EAAe3R,EACfgR,EAAgBc,EAChB,KACH,CAED9R,GAAoB+Q,CACvB,CAED,GAAIC,EAAe,CACf,IAAMzJ,EAAiByJ,EAAcipB,UAAYjpB,EAAc8K,SAG/D,OAAIhY,EAAOkN,EAAcipB,WAAa1yB,EAAiBzD,EAAOiN,EACnDjN,GAGNs1B,MAAMpoB,EAAcipB,YAAcn2B,EAAOkN,EAAcipB,WAAatoB,EAAeX,EAAcipB,UAE3FjpB,EAAcipB,UAnVR,KAsVVvnB,KAAK+M,IAAIlY,EAAiBwJ,EAAiBY,EACrD,CAED,OAAOA,CAKV,CAFC,MAAO7N,GACL,OAAO2zC,GACV,CACJ,EAqBG02F,WAxVJ,SAAoBrqI,GAChByD,EAAoBzD,EACpBmE,GAAA,EACAT,EAAmB2mI,WAAWrqI,EACjC,EAqVGsqI,uBAlOJ,SAAgCtqI,EAAgBoN,GAC5C,IAAKpN,IAAmB9D,EACpB,OAAO,EAIX,GAAIiI,EACA,OAAO,EAIX,IAAKsK,SAASzO,EAAemoI,WAAWC,OAAOpwH,UAC3C,OAAO,EAIX,GAAI9b,EAAY6sI,sBAAwB7sI,EAAY8b,SAAW5K,EAC3D,OAAO,EAUX,GAAIpN,EAAeuqI,2BAA6Bj1G,MAAMt1B,EAAeuqI,yBAAyBC,oBAAsBl1G,MAAMp5B,EAAYmgB,QAAUngB,EAAYmgB,OAAUrc,EAAeuqI,yBAAyBC,iBAAmB,EAAI,CAEjO,IAAK/mI,GAAqBzD,EAAewpI,kBAAoBx7H,EAAAwiB,EAAAi6G,iBACzD,OAAO,EAGN,GAAIhnI,GAAqBzD,EAAewpI,kBAAoBx7H,EAAAwiB,EAAAk6G,cAA8B1qI,EAAemoI,WAAWC,OAAOuC,aAC5H,OAAO,CAEd,CAID,SAAUlnI,GAAqBzD,EAAemoI,WAAWC,OAAOuC,cAAgB3qI,EAAewpI,kBAAoBx7H,EAAAwiB,EAAAo6G,kBAAkC5qI,EAAeuqI,2BAC/Jj1G,MAAMt1B,EAAeuqI,yBAAyBM,iCAAmC3uI,IAAgBo5B,MAAMp5B,EAAY8sI,kBAAoB1zG,MAAMp5B,EAAY8b,WAAa9b,EAAY8sI,eAAiB9sI,EAAY8b,UAAahY,EAAeuqI,yBAAyBM,+BAAiC,IAC7S,EAyLGC,qBAlIJ,SAA8B9qI,EAAWoN,GACrC,OAAKA,GAAmBA,EAAeo8H,gBAMhCz2H,EAAY/S,EAAWoN,EAFTlR,EAAcA,EAAYmgB,MAAQ,GAH5C,IAMd,EA2HG2yB,MArUJ,WACI54B,IACA/S,EAASqvB,IAAI7kB,EAAA2iB,EAAAu6G,kBAAqCh1H,EAAoB3I,EACzE,GA/BGzJ,EAASU,EAAMm1H,UAAUpsH,GACzBgJ,IAEA/S,EAAS+uB,GAAGvkB,EAAA2iB,EAAAu6G,kBAAqCh1H,EAAoB3I,GAmWlEA,CACV,CAED3J,EAAYk2H,sBAAwB,cACpCvsH,EAAAojB,EAAet0B,EAAAs0B,EAAAyqG,gBAA6Bx3H,EAAA,gBAAAzD,EAAAoN,GAAA,sBAAAzJ,EAAA3D,EAAAoN,GAAA,QAAAzJ,EAAA,EAAAA,EAAAyJ,EAAA/Q,OAAAsH,IAAA,KAAAsJ,EAAAG,EAAAzJ,GAAAsJ,EAAAmvD,WAAAnvD,EAAAmvD,aAAA,EAAAnvD,EAAA6wE,cAAA,YAAA7wE,IAAAA,EAAAmuH,UAAA,GAAAt+H,OAAAmC,eAAAe,EAAAiN,EAAA9P,IAAA8P,EAAA,MC9OxCA,EAAY,IAzJV,WAoJF,SAAAjN,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAe,KAAA3oD,GACXsW,KAAKgqC,MACR,KAAArzC,EAAA,OAAAA,EAAA,EAAA9P,IAAA,OAAA2K,MApJD,WACIwO,KAAK00H,SAAW,UAChB10H,KAAK20H,aAAe,cACpB30H,KAAKm0H,iBAAmB,kBACxBn0H,KAAKo0H,aAAe,cACpBp0H,KAAK40H,YAAc,aACnB50H,KAAKs0H,iBAAmB,kBACxBt0H,KAAK60H,iBAAmB,kBACxB70H,KAAK80H,eAAiB,gBACtB90H,KAAK+0H,eAAiB,iBACtB/0H,KAAKg1H,qBAAuB,sBAC5Bh1H,KAAKi1H,mBAAqB,oBAC1Bj1H,KAAKk1H,eAAiB,iBACtBl1H,KAAKm1H,qBAAuB,iBAC5Bn1H,KAAKo1H,IAAM,MACXp1H,KAAKq1H,OAAS,SACdr1H,KAAKs1H,iBAAmB,kBACxBt1H,KAAKu1H,aAAe,cACpBv1H,KAAKsB,GAAK,KACVtB,KAAKw1H,SAAW,WAChBx1H,KAAKy1H,iBAAmB,kBACxBz1H,KAAK01H,MAAQ,QACb11H,KAAK21H,MAAQ,QACb31H,KAAK41H,MAAQ,QACb51H,KAAK61H,WAAa,YAClB71H,KAAK81H,YAAc,aACnB91H,KAAK+1H,YAAc,aACnB/1H,KAAKkS,MAAQ,QACblS,KAAKg2H,aAAe,cACpBh2H,KAAKi2H,UAAY,WACjBj2H,KAAKk2H,oBAAsB,qBAC3Bl2H,KAAKm2H,0BAA4B,qBACjCn2H,KAAKiY,OAAS,SACdjY,KAAKo2H,cAAgB,eACrBp2H,KAAKq2H,0BAA4B,yBACjCr2H,KAAKs2H,QAAU,UACft2H,KAAKu2H,cAAgB,UACrBv2H,KAAKw2H,UAAY,YACjBx2H,KAAKy2H,MAAQ,QACbz2H,KAAK02H,OAAS,SACd12H,KAAK22H,IAAM,MACX32H,KAAK42H,UAAY,YACjB52H,KAAK62H,oBAAsB,oBAC3B72H,KAAK82H,mBAAqB,mBAC1B92H,KAAK+2H,eAAiB,eACtB/2H,KAAKg3H,iBAAmB,iBACxBh3H,KAAKi3H,kBAAoB,mBACzBj3H,KAAKk3H,UAAY,WACjBl3H,KAAKm3H,cAAgB,eACrBn3H,KAAKo3H,4BAA8B,4BACnCp3H,KAAKq3H,mBAAqB,oBAC1Br3H,KAAKs3H,mBAAqB,oBAC1Bt3H,KAAKu3H,2BAA6B,4BAClCv3H,KAAKw3H,sBAAwB,uBAC7Bx3H,KAAKy3H,8BAAgC,+BACrCz3H,KAAK03H,oBAAsB,oBAC3B13H,KAAK23H,wBAA0B,wBAC/B33H,KAAK43H,OAAS,SACd53H,KAAK2Y,KAAO,OACZ3Y,KAAK63H,cAAgB,gBACrB73H,KAAK83H,KAAO,OACZ93H,KAAK+3H,OAAS,SACd/3H,KAAKg4H,kBAAoB,mBACzBh4H,KAAKi4H,OAAS,SACdj4H,KAAKk4H,KAAO,OACZl4H,KAAKm4H,UAAY,YACjBn4H,KAAKo4H,kBAAoB,oBACzBp4H,KAAKq4H,aAAe,eACpBr4H,KAAKs4H,uBAAyB,yBAC9Bt4H,KAAKu4H,8BAAgC,gCACrCv4H,KAAKw4H,sBAAwB,wBAC7Bx4H,KAAKy4H,kCAAoC,oCACzCz4H,KAAK04H,0BAA4B,4BACjC14H,KAAK24H,KAAO,OACZ34H,KAAK44H,QAAU,UACf54H,KAAK64H,OAAS,SACd74H,KAAK84H,4BAA8B,4BACnC94H,KAAK+4H,sBAAwB,sBAC7B/4H,KAAKg5H,mBAAqB,mBAC1Bh5H,KAAKi5H,SAAW,YAChBj5H,KAAKk5H,WAAa,YAClBl5H,KAAKm5H,UAAY,YACjBn5H,KAAKo5H,SAAW,WAChBp5H,KAAKq5H,aAAe,cACpBr5H,KAAKs5H,yBAA2B,yBAChCt5H,KAAKu5H,wBAA0B,wBAC/Bv5H,KAAKw5H,sBAAwB,sBAC7Bx5H,KAAKy5H,uBAAyB,uBAC9Bz5H,KAAK05H,qBAAuB,qBAC5B15H,KAAK25H,kBAAoB,mBACzB35H,KAAK45H,gBAAkB,gBACvB55H,KAAK65H,wBAA0B,wBAC/B75H,KAAK85H,MAAQ,QACb95H,KAAK+5H,yBAA2B,yBAChC/5H,KAAKg6H,2BAA6B,2BAClCh6H,KAAKi6H,iBAAmB,mBACxBj6H,KAAKk6H,aAAe,eACpBl6H,KAAKm6H,WAAa,aAClBn6H,KAAKo6H,QAAU,UACfp6H,KAAKq6H,aAAe,eACpBr6H,KAAKs6H,eAAiB,iBACtBt6H,KAAKu6H,6BAA+B,6BACpCv6H,KAAKw6H,oBAAsB,qBAC3Bx6H,KAAKy6H,0BAA4B,QACjCz6H,KAAK06H,4BAA8B,UACnC16H,KAAK26H,kCAAoC,eACzC36H,KAAK46H,sCAAwC,mBAC7C56H,KAAK66H,wCAA0C,qBAC/C76H,KAAK86H,eAAiB,gBACtB96H,KAAK+6H,wBAA0B,wBAC/B/6H,KAAKg7H,SAAW,WAChBh7H,KAAKi7H,kBAAoB,mBACzBj7H,KAAKk7H,aAAe,cACpBl7H,KAAKm7H,sBAAwB,sBAC7Bn7H,KAAKo7H,gBAAkB,QACvBp7H,KAAKq7H,gBAAkB,gBACvBr7H,KAAK25H,kBAAoB,mBACzB35H,KAAKs7H,MAAQ,QACbt7H,KAAKu7H,YAAc,aACnBv7H,KAAKw7H,iBAAmB,kBACxBx7H,KAAKy7H,0BAA4B,0BACjCz7H,KAAK07H,yBAA2B,yBAChC17H,KAAK27H,mBAAqB,mBAC1B37H,KAAK47H,mBAAqB,oBAC1B57H,KAAKy7D,IAAM,MACXz7D,KAAK67H,0BAA4B,CAC7BlxI,QAAS,UACT8wE,IAAK,MACLqgE,WAAY,aACZC,iBAAmB,mBACnBC,eAAiB,iBACjBC,QAAS,UACT36H,GAAI,KACJ46H,gBAAiB,kBACjBtgE,KAAM,OACNC,OAAQ,UAEZ77D,KAAKm8H,6BAA+B,CAChCC,QAAS,UACTC,SAAU,WACVC,YAAa,eAEjBt8H,KAAKu8H,kBAAoB,mBACzBv8H,KAAKw8H,sBAAwB,qBAChC,MAAAnvI,EAIA3D,EAJAjD,UAAAkQ,GAAAjN,CAAA,CAOe,IACpBoN,EAAAojB,EAAAvjB,CAAA,gBAAAjN,EAAAoN,EAAAzJ,GAAA,iBAAAsJ,EAAAtJ,EAAA,MAAArH,EAAAqH,EAAA,MAAAzH,EAAAyH,EAAA,MAAAkK,EAAAlK,EAAA,MAAAuJ,EAAAvJ,EAAA,MC1JA,SAASqK,EAAmBhO,GACxBA,EAASA,GAAU,CAAC,EAEpB,IAKIoN,EACAzJ,EANEsJ,EAAUqJ,KAAK9V,QACfwN,EAAgBhO,EAAO+yI,cACvBtvI,EAAOzD,EAAO/B,KACdkG,EAAwBnE,EAAOgzI,sBAqCrC,SAAS3vI,EAAkBrD,GACvB,OAAOA,EAAiBA,EAAeizI,SAAWtvI,EAAQqK,EAAci9H,cAAgBtnI,EAAQ3D,EAAewpI,iBAAmB,IACrI,CA+BD,OAXAp8H,EAAW,CACPi9H,WAnDJ,SAAoBj9H,GAChBzJ,EAAQqK,EAAc48H,mBAAA,EAAoBtuI,EAAAk0B,GAAuBvjB,GAASrM,OAAOZ,EAAQoN,GACzFzJ,EAAQqK,EAAcy8H,mBAAA,EAAoBvuI,EAAAs0B,GAAuBvjB,GAASrM,OAAOZ,EAAQoN,GACzFzJ,EAAQqK,EAAc08H,eAAA,EAAgB78H,EAAA2iB,GAAmBvjB,GAASrM,OAAOZ,EAAQoN,GACjFzJ,EAAQqK,EAAci9H,eAAA,EAAgB/9H,EAAAsjB,GAAkBvjB,GAASrM,OAAOZ,EAAQoN,EACnF,EA+CG8lI,eA7CJ,SAAwBlzI,EAAkBoN,GACtC,OAAIA,EACO7L,QAAQyE,UAEZ7B,EAAsBgvI,0BAA0B,CACnDjL,eAAgBloI,EAChBu6H,UAAW92H,GAElB,EAsCG2vI,kBApCJ,SAA2BpzI,EAAkBoN,GACzC,OAAIA,EACO7L,QAAQyE,UAEZ7B,EAAsBkvI,eAAe,CACxCr+E,SAAUh1D,EAAiBg1D,SAC3BkzE,eAAgBloI,EAChBu6H,UAAW92H,GAElB,EA4BGimI,kBAtBJ,SAA2B1pI,EAAgBoN,EAAOzJ,GAC9C,IAAMsJ,EAAS5J,EAAkBrD,GACjC,OAAOiN,EAASA,EAAOy8H,kBAAkB1pI,EAAgBoN,EAAOzJ,GAAmB,IACtF,EAoBG8lI,iBAlBJ,SAA0BzpI,EAAgBoN,GACtC,IAAMzJ,EAASN,EAAkBrD,GACjC,OAAO2D,EAASA,EAAO8lI,iBAAiBzpI,EAAgBoN,GAAQ,IACnE,EAgBGkmI,4BAdJ,SAAqCtzI,GACjC,IAAMoN,EAAS/J,EAAkBrD,GACjC,OAAOoN,EAASA,EAAOkmI,4BAA4BtzI,GAAkB,CACjEwqI,iBAAkB,EAClBK,+BAAgCl3F,IAEvC,GAnDGhwC,EAAU,CAAC,EAgERyJ,CACV,CAEDY,EAAmB2rH,sBAAwB,qBAC3C,IAAMl2H,EAAUwJ,EAAAujB,EAAAyqG,gBAA6BjtH,GAC7CZ,EAAAojB,EAAA/sB,CAAA,gBAAAzD,EAAAoN,EAAAzJ,GAAA,iBAAAsJ,EAAAtJ,EAAA,MAAArH,EAAAqH,EAAA,MAAAzH,EAAAyH,EAAA,MCjFA,SAASkK,EAAmB7N,EAAQoN,GAGhC,IAAMzJ,GADN3D,EAASA,GAAU,CAAC,GACa6nI,kBAIjC,SAAS56H,IACL,IAAKtJ,IAAsBA,EAAkB1G,eAAe,6CACxD,MAAM,IAAIuQ,MAAMlR,EAAAk0B,EAAA+iH,qBAEvB,CAkBD,SAAS1lI,EAAkB7N,EAAgB1D,GAGvC,GAFA2Q,KAEKjN,EACD,OAAO,KAGX,IAAM6N,EAAO7N,EAAemoI,WAAWC,OAAOC,IAAIC,SAASC,eAAevoI,EAAemoI,WAAWC,OAAO/rH,OAAOmsH,sBAAsBxoI,EAAemoI,WAAW9rH,OAAOosH,uBAAuBzoI,EAAeqc,OAAOm3H,YAChNtmI,EAAMW,EAAK4lI,mBAAmBp3I,OAE9B2R,EAAchO,IAAmBs1B,MAAMt1B,EAAe0zI,aAAe1zI,EAAe0zI,YAAc,EAClGjwI,EAAmBmL,KAAKgN,IAAI5N,EAAc,EAAG,GAE7C7J,EAAgByK,KAAKgN,IAAItf,EAAQmH,EAAkB,GAErDJ,EAAU,KACd,GAAIc,EAAgB+I,EAAK,CACrB,IAAM7I,EAAIwJ,EAAK4lI,mBAAmBtvI,IAElCd,GAAA,EAAUnH,EAAAy3I,IAAqBhwI,EAAmByJ,EAAWpN,EAAgB1D,MAEzE+G,EAAQulI,iBAAmB56H,EAAc1R,EAAQ,GAAK0D,EAAe4zI,gBACrEvwI,EAAQm0B,MAAQnzB,EAAEmzB,MAAQnzB,EAAEmzB,MAAQ,GACpCn0B,EAAQylI,WAAazkI,EAAEykI,WACvBzlI,EAAQwwI,WAAaxvI,EAAEwvI,WAE9B,CAED,OAAOxwI,CACV,CA2BD,MANW,CACPqmI,kBAAA77H,EACA47H,iBArBJ,SAA0BzpI,EAAgBoN,GAGtC,GAFAH,KAEKjN,EACD,OAAO,KAGX,IAAM1D,EAAW0D,EAAe4zI,gBAEhC,GAAIt+G,MAAMh5B,GACN,OAAO,KAGX,IAAMJ,EAAayH,EAAkBmwI,0CAA0C9zI,EAAgBoN,GAG/F,OAAOS,EAAkB7N,EAFX4O,KAAK2Q,MAAMrjB,EAAaI,GAGzC,EAKGg3I,4BArEJ,SAAqCtzI,GACjC,IAAMoN,EAA2B,CAAEo9H,iBAAkB,EAAGK,+BAAgCl3F,KAExF,IAAK3zC,EACD,OAAOoN,EAGX,IAAMzJ,EAAO3D,EAAemoI,WAAWC,OAAOC,IAAIC,SAASC,eAAevoI,EAAemoI,WAAWC,OAAO/rH,OAAOmsH,sBAAsBxoI,EAAemoI,WAAW9rH,OAAOosH,uBAAuBzoI,EAAeqc,OAAOm3H,YAChNvmI,EAAcjN,IAAmBs1B,MAAMt1B,EAAe0zI,aAAe1zI,EAAe0zI,YAAc,EAClGp3I,EAASsS,KAAKgN,IAAI3O,EAAc,EAAG,GAIzC,OAFAG,EAAyBo9H,iBAAmBluI,EAASqH,EAAK8vI,mBAAmBp3I,OAEtE+Q,CACV,EA2DJ,CAEDS,EAAmB8rH,sBAAwB,qBAC3C,IAAMzsH,EAAUD,EAAAujB,EAAAyqG,gBAA6BptH,GAC7CT,EAAAojB,EAAAtjB,CAAA,gBAAAlN,EAAAoN,EAAAzJ,GAAA,iBAAAsJ,EAAAtJ,EAAA,MAAArH,EAAAqH,EAAA,MC3FA,SAASzH,EAAkB8D,GAGvB,IAAMoN,GADNpN,EAASA,GAAU,CAAC,GACa6nI,kBAIjC,SAASlkI,IACL,IAAKyJ,IAAsBA,EAAkBnQ,eAAe,6CACxD,MAAM,IAAIuQ,MAAMlR,EAAAk0B,EAAA+iH,qBAEvB,CAcD,SAAStmI,EAAkBjN,EAAgBoN,GAGvC,GAFAzJ,KAEK3D,EACD,OAAO,KAGX,IACIiN,EADE3Q,EAAM0D,EAAeizI,SAAWjzI,EAAeizI,SAAS52I,QAAU,EAExE,GAAI+Q,EAAQ9Q,IACR2Q,EAAMjN,EAAeizI,SAAS7lI,KACnBH,EAAIoP,QAAUjP,EACrB,OAAOH,EAIf,IAAK,IAAI/Q,EAAI,EAAGA,EAAII,EAAKJ,IAGrB,IAFA+Q,EAAMjN,EAAeizI,SAAS/2I,KAEnB+Q,EAAIoP,QAAUjP,EACrB,OAAOH,EAIf,OAAO,IACV,CAiDD,MANW,CACPy8H,kBAAAz8H,EACAw8H,iBA3CJ,SAA0BzpI,EAAgBoN,GACtCzJ,IAEA,IAAMrH,EAKV,SAAwB0D,EAAgBoN,GACpC,IAAKpN,EACD,OAAQ,EAGZ,IAII2D,EACAsJ,EACA3Q,EACAJ,EACA2R,EAREX,EAAWlN,EAAeizI,SAC1BjlI,EAAKd,EAAWA,EAAS7Q,OAAS,KAEpCoH,GAAO,EAOX,GAAIyJ,GAAYc,EAAK,EACjB,IAAKH,EAAI,EAAGA,EAAIG,EAAIH,IAMhB,GAJAvR,GADA2Q,EAAMC,EAASW,IACNk7H,sBAIJ37H,GADLzJ,GAFAzH,EAAK+Q,EAAI+K,UAEM,IACS1b,GACnB8Q,EAAOzJ,EAAYrH,EAAKJ,EAAK,CAC9BuH,EAAMwJ,EAAIoP,MACV,KACH,CAIT,OAAO5Y,CACV,CA/BD,CALiCzD,EAAgBoN,GAE7C,OAAOH,EAAkBjN,EAAgB1D,EAC5C,EAsCGg3I,4BAnFJ,SAAqCtzI,GACjC,IAAMoN,EAA2B,CAAEo9H,iBAAkB,EAAGK,+BAAgCl3F,KAExF,OAAK3zC,GAAmBA,EAAeizI,UAIvC7lI,EAAyBo9H,iBAAmBxqI,EAAeizI,SAAS52I,OAE7D+Q,GALIA,CAMd,EA6EJ,CAEDlR,EAAkBy9H,sBAAwB,oBAC1C,IAAM9rH,EAAUZ,EAAAujB,EAAAyqG,gBAA6B/+H,GAC7CkR,EAAAojB,EAAA3iB,CAAA,gBAAA7N,EAAAoN,EAAAzJ,GAAA,aAAAA,EAAAU,EAAA+I,EAAA,CAAAk5F,GAAA,kBAAAz4F,CAAA,EAAA8lI,GAAA,kBAAAxvI,CAAA,EAAA4vI,GAAA,kBAAA1wI,CAAA,EAAAwlI,GAAA,kBAAA3sI,CAAA,EAAA0wC,GAAA,kBAAA1/B,CAAA,QAAAD,EAAAtJ,EAAA,MCzGA,SAASrH,EAAgB0D,EAAQoN,GAC7B,KAAOpN,EAAO3D,OAAS+Q,GACnBpN,EAAS,IAAMA,EAEnB,OAAOA,CACV,CAMM,SAAS9D,EAA0B8D,GACtC,OAAOA,EAAMA,EAAIqO,MAAM,MAAME,KAAK,KAAOvO,CAC5C,CAEM,SAAS6N,EAAqB7N,EAAKoN,GACtC,IAAKA,IAAUpN,IAA8C,IAAvCA,EAAIyI,QAAQ,sBAC9B,OAAOzI,EAEX,IAAI2D,EAAIyJ,EAAMpQ,WACd,OAAOgD,EAAIqO,MAAM,sBAAsBE,KAAK5K,EAC/C,CAEM,SAASuJ,EAAwBlN,EAAKoN,EAAOzJ,GAChD,IAEIsJ,EACA/Q,EACA2R,EACAX,EACAc,EACAvK,EAEEU,EAAWiJ,EAAM/Q,OACjBgH,EAVY,EAYlB,IAAKrD,EACD,OAAOA,EAMX,OAAa,CAKT,IADAiN,EAAWjN,EAAIyI,QAAQ,IAAM2E,IACd,EACX,OAAOpN,EAMX,IADA9D,EAAS8D,EAAIyI,QAAQ,IAAKwE,EAAW9I,IACxB,EACT,OAAOnE,EAMX,IADA6N,EAAe7N,EAAIyI,QArCL,KAqCwBwE,EAAW9I,IAC9B8I,GAAYY,EAAe3R,EAO1C,OALAgR,EAAYlN,EAAI+C,OAAO7G,EAAS,GAChC8R,EAAQwI,SAASxW,EAAImO,UAAUN,EAAexK,EAAcnH,EAAS,GAAI,IAIjEgR,GAGJ,IAAK,IACL,IAAK,IACL,IAAK,IACDzJ,EAAcnH,EAAgBqH,EAAM3G,WAAYgR,GAChD,MACJ,IAAK,IACDvK,EAAcnH,EAAgBqH,EAAM3G,SAAS,IAAKgR,GAClD,MACJ,IAAK,IACDvK,EAAcnH,EAAgBqH,EAAM3G,SAAS,IAAKgR,GAAO9F,cACzD,MACJ,IAAK,IACDzE,EAAcnH,EAAgBqH,EAAM3G,SAAS,GAAIgR,GACjD,MACJ,QACI,OAAOhO,OAGfyD,EAAcE,EAGlB3D,EAAMA,EAAImO,UAAU,EAAGlB,GAAYxJ,EAAczD,EAAImO,UAAUjS,EAAS,EAC3E,CACJ,CAED,SAAS8R,EAAWhO,EAAgBoN,EAAUzJ,EAAuBrH,EAAgBJ,EAAmB2R,EAAqBX,EAAWc,GACpI,IA3FkCvK,EA2F9BU,EAAM,IAAI8I,EAAAujB,EAYd,OAVArsB,EAAI+jI,eAAiBloI,EACrBmE,EAAI6T,SAAW5K,EACfjJ,EAAI4kI,sBAAwBplI,EAC5BQ,EAAI6kI,eAAiB1sI,EACrB6H,EAAI8kI,sBAAwB/sI,EAAkB2tI,8CAA8Ch8H,EAAqB7N,EAAgBkN,GACjI/I,EAAI+kI,oBAAsBhtI,EAAkB4tI,4CAA4Cj8H,EAAsBT,EAAUpN,EAAgBkN,GACxI/I,EAAIilI,cAAgBltI,EAAkB83I,uBAAuB7vI,EAAK+I,GAClE/I,EAAIwkI,mBApG8BllI,EAoGeuK,EAAL7J,EAnG7B+jI,eAAewL,YAAcjwI,GAoG5CU,EAAIkY,MAAQrO,EAEL7J,CACV,CAED,SAASV,EAAmBzD,EAAmBoN,EAAgBzJ,EAASsJ,GACpE,IAAM3Q,EAAW8Q,EAAe+6H,WAAWC,OAG3C,GAAI35H,SAASnS,EAAS0b,WAAa1b,EAASsc,MAAQtc,EAAS0b,UAAYrU,EAAQolI,sBAC7E,OAAO,EAGX,GAAI97H,EAAW,CAEX,GAA8C,QAA1CG,EAAe6mI,uBACf,OAAO,EAQX,IAAM/3I,EAAU8D,EAAkBk0I,yBAClC,OAAOvwI,EAAQslI,sBAAsBnxH,WAAa5b,KAAauS,SAAS9K,EAAQulI,sBAAwBvlI,EAAQulI,oBAAoBpxH,WAAa5b,EACpJ,CAED,OAAO,CACV,CAEM,SAASiI,EAAqBnE,EAAmBoN,EAAWzJ,EAAgBsJ,GAC/E,IAAI3Q,EACAJ,EACA2R,EAGJvR,EAAWqH,EAAeiwI,gBAOtBt+G,MAAMh5B,KACNA,EAAWqH,EAAewkI,WAAWC,OAAOpwH,UAGhD9b,EAAwB4a,YAAYnT,EAAewkI,WAAWC,OAAOxvH,MAAS3L,EAAQ3Q,GAAW8jC,QAAQ,IACzGvyB,EAAsBiJ,YAAY5a,EAAwBI,GAAU8jC,QAAQ,IAE5E,IAEMlzB,EAAUc,EAAWrK,EAAgBrH,EAAUJ,EAFnC8D,EAAkBm0I,kCAAkCj4I,EAAuByH,GAGzF3D,EAAmB6N,EAAqBT,EAAWH,GAEvD,OAAKxJ,EAAmBzD,EAAmB2D,EAAgBuJ,EAASE,GAI7DF,EAHI,IAId,CAEM,SAAS7J,EAAoBrD,EAAmBoN,EAAWzJ,EAAgBsJ,EAAM3Q,EAAUJ,EAAY2R,EAAK1J,EAAOd,EAAOgB,GAC7H,IAGID,EAEAE,EALER,EAAamJ,EAAO/Q,EACpBwH,EAAiBpH,EAAWJ,EAalC,OAPAkI,EAAwBpE,EAAkBo0I,kCAAkCtwI,EAAYH,GAOnFF,EAAmBzD,EAAmB2D,EAJ3CW,EAAM0J,EAAWrK,EAAgBD,EAAgBU,EAC7CN,EACA9D,EAJkBoE,EAAwBV,EAIF0J,EAAW/J,GAES+J,IAIhE9I,EAAIskI,gBAAkBvkI,GAAwB4I,EAE9CY,EAAMX,EAAwBW,EAAK,SAAUvJ,EAAIqkI,mBACjD96H,EAAMX,EAAwBW,EAAK,OAAQvJ,EAAIskI,iBAC/CtkI,EAAIkzB,MAAQ3pB,EACZvJ,EAAIwkI,WAAa3kI,EAEVG,GAVI,IAWd,iBAAAtE,EAAAoN,EAAAzJ,GAAA,iBAAAsJ,EAAAtJ,EAAA,MAAArH,EAAAqH,EAAA,MAAAzH,EAAAyH,EAAA,MCpMD,SAASkK,EAAuB7N,EAAQoN,GAEpC,IAAMzJ,GADN3D,EAASA,GAAU,CAAC,GACa6nI,kBAIjC,SAAS56H,IACL,IAAKtJ,IAAsBA,EAAkB1G,eAAe,6CACxD,MAAM,IAAIuQ,MAAMlR,EAAAk0B,EAAA+iH,qBAEvB,CAkBD,SAAS1lI,EAAkB7N,EAAgB1D,GAGvC,GAFA2Q,KAEKjN,EACD,OAAO,KAGX,IAAM6N,EAAW7N,EAAemoI,WAAWC,OAAOC,IAAIC,SAASC,eAAevoI,EAAemoI,WAAWC,OAAO/rH,OAAOmsH,sBAAsBxoI,EAAemoI,WAAW9rH,OAAOosH,uBAAuBzoI,EAAeqc,OAAOg4H,gBAG1N/3I,EAAQsS,KAAKgN,IAAItf,EAAO,GAExB,IAAM4Q,GAAA,EAAMhR,EAAAy3I,IAAqBhwI,EAAmByJ,EAAWpN,EAAgB1D,GAC/E,GAAI4Q,EAAK,CACLA,EAAI07H,gBAAkBh6H,KAAKwU,OAAO9mB,EAAQ,GAAK0D,EAAe4zI,gBAAkB5zI,EAAe2kB,UAAW,IAE1G,IAAI3W,EAAMH,EAAS2pB,MACnBxpB,GAAA,EAAM9R,EAAA0wC,IAAwB5+B,EAAK,SAAUd,EAAIy7H,mBACjD36H,GAAA,EAAM9R,EAAA0wC,IAAwB5+B,EAAK,OAAQd,EAAI07H,iBAC/C17H,EAAIsqB,MAAQxpB,CACf,CAED,OAAOd,CACV,CA4BD,MANW,CACPw8H,kBAAA77H,EACA47H,iBAtBJ,SAA0BzpI,EAAgBoN,GAGtC,GAFAH,KAEKjN,EACD,OAAO,KAGX,IAAM1D,EAAW0D,EAAe4zI,gBAEhC,GAAIt+G,MAAMh5B,GACN,OAAO,KAIX,IAAIJ,EAAayH,EAAkBmwI,0CAA0C9zI,EAAgBoN,GAG7F,OAAOS,EAAkB7N,EAFX4O,KAAK2Q,MAAMrjB,EAAaI,GAGzC,EAKGg3I,4BAhEJ,SAAqCtzI,GACjC,IAAMoN,EAA2B,CAAEo9H,iBAAkB,EAAGK,+BAAgCl3F,KACxF,IAAK3zC,EACD,OAAOoN,EAGX,IAAMzJ,EAAW3D,EAAe4zI,gBAOhC,OANIt+G,MAAM3xB,GACNyJ,EAAyBo9H,iBAAmB,EAE5Cp9H,EAAyBo9H,iBAAmB57H,KAAK0zB,KAAKtiC,EAAemoI,WAAWC,OAAOpwH,SAAWrU,GAG/FyJ,CACV,EAsDJ,CAEDS,EAAuB8rH,sBAAwB,yBAC/C,IAAMzsH,EAAUD,EAAAujB,EAAAyqG,gBAA6BptH,GAC7CT,EAAAojB,EAAAtjB,CAAA,gBAAAlN,EAAAoN,EAAAzJ,GAAA,iBAAAsJ,EAAAtJ,EAAA,MAAArH,EAAAqH,EAAA,MAAAzH,EAAAyH,EAAA,MCpFA,SAASkK,EAAuB7N,EAAQoN,GAGpC,IAAMzJ,GADN3D,EAASA,GAAU,CAAC,GACa6nI,kBAC3B56H,EAAcjN,EAAOs0I,YAI3B,SAASzmI,IACL,IAAKlK,EACD,MAAM,IAAI6J,MAAMlR,EAAAk0B,EAAA+iH,qBAEvB,CA4DD,SAASrmI,EAAgBlN,EAAgBoN,GACrC,IAQIzJ,EACAsJ,EACA3Q,EACAJ,EACA2R,EACAX,EACAzJ,EAdEU,EAAOnE,EAAemoI,WAAWC,OAAOC,IAAIC,SAASC,eAAevoI,EAAemoI,WAAWC,OAAO/rH,OAAOmsH,sBAAsBxoI,EAAemoI,WAAW9rH,OAAOosH,uBAAuBzoI,EAAeqc,OAAOg4H,iBAClNr0I,EAAemoI,WAAWC,OAAOC,IAAIC,SAASC,eAAevoI,EAAemoI,WAAWC,OAAO/rH,OAAOmsH,sBAAsBxoI,EAAemoI,WAAW9rH,OAAOosH,uBAAuBzoI,EAAeqc,OAAOm3H,YACvMnwI,EAAWc,EAAKowI,gBAChBlwI,EAAOF,EAAKsvI,mBAEdrvI,EAAO,EACPE,GAAe,EAUnBb,EAAazD,EAAe2kB,UAG5B,IAAI7gB,GAAA,EAEJ,IAAKxH,EAAI,EAAGJ,GAJZyH,EAAYN,EAASmxI,WAIOn4I,OAAQC,EAAIJ,IAAQ4H,EAAexH,IAmB3D,IAjBA4Q,EAAS,GADTD,EAAOtJ,EAAUrH,IAERW,eAAe,OACpBiQ,EAASD,EAAKA,GAIdA,EAAKhQ,eAAe,OACpBmH,EAAO6I,EAAKG,GAKZF,EAAS,IAETA,EAASc,EAAkChO,EAD1B2D,EAAUrH,EAAI,GACsC2Q,EAAMxJ,EAAYW,EAAOX,IAG7FoK,EAAI,EAAGA,GAAKX,IAAWpJ,EAAe+J,KAGvC/J,EAAgBsJ,EAAShJ,EAAMD,EAAME,EAAM4I,EAAMxJ,IAFjDa,EAE0EhI,MAGtE0D,EAAe4zI,gBAAkB3mI,EAAK5I,EAAIZ,GAG9CW,GAAQ6I,EAAK5I,CAGxB,CAED,SAAS2J,EAAkChO,EAAgBoN,EAAU9Q,EAAMJ,EAAY2R,GACnF,IAAIX,EAEJ,GAAIE,GAAYA,EAASnQ,eAAe,KACpCiQ,EAAgBE,EAASA,EAAIlR,OAE7B,IACI,IAAI8R,EAAkB,EACtB,GAAKsnB,MAAMt1B,EAAemoI,WAAWC,OAAOxvH,QAAW0c,MAAMt1B,EAAemoI,WAAWC,OAAOpwH,YAAavJ,SAASzO,EAAemoI,WAAWC,OAAOpwH,UAG9I,CAEH,IAAMvU,EAAYwJ,EAAYwnI,oBAC9BzmI,EAAmBsnB,MAAM7xB,EAAUqV,KAAuB,EAAhBrV,EAAUqV,GACvD,MALG9K,EAAkBhO,EAAemoI,WAAWC,OAAOxvH,MAAQ5Y,EAAemoI,WAAWC,OAAOpwH,SAMhG9K,EAAgBvJ,EAAkBwwI,kCAAkCnmI,EAAiBhO,GACrFA,EAAe4zI,gBAAkBt3I,EAAK+H,EAAInI,CAG7C,CAFC,MAAO8D,GACLkN,EAAgB,CACnB,CAGL,OAAO0B,KAAKgN,IAAIhN,KAAK0zB,MAAMp1B,EAAgBW,IAAevR,EAAK+H,EAAInI,IAAe,EAAG,EACxF,CA0GD,MANW,CACPwtI,kBAlGJ,SAA2B1pI,EAAgBiN,EAAO3Q,GAG9C,GAFAuR,KAEK7N,EACD,OAAO,KAGX,IAAIgO,EAAU,KACVvK,GAAA,EAiCJ,OA/BAyJ,EAAgBlN,GAAgB,SAAUiN,EAAMY,EAAMX,EAAM/I,EAAMd,EAAYgB,EAAaD,GACvF,GAAIX,GAASnH,EAAkB,EAAG,CAC9B,IAAIgI,EAAQuJ,EAAK2pB,MACb1zB,EAAaK,EAAK2kI,WAmBtB,OAjBI57H,IACA5I,EAAQ4I,EAAK9I,GAAGozB,OAAS,GACzB1zB,EAAaoJ,EAAK9I,GAAG0kI,YAGzB96H,GAAA,EAAU9R,EAAA63I,IACNpwI,EACAyJ,EACApN,EACAiN,EACA9I,EAAKE,EACLhB,EACAiB,EACAR,EACAO,EACAF,EAAKuwI,YAAA,CAGZ,CAKD,OALWznI,GAAS3Q,EAAkB+G,EAAwB,GAATc,EAAKE,IAEtDZ,GAAA,IAAQ,CAIf,IAEMuK,CACV,EAyDGy7H,iBAvDJ,SAA0BzpI,EAAgBiN,GAGtC,GAFAY,KAEK7N,EACD,OAAO,cAGPiN,IACAA,EAAgB,MAGpB,IAAI3Q,EAAU,KACR0R,EAAoBrK,EAAkBwwI,kCAAkClnI,EAAejN,GAkC7F,OAhCAkN,EAAgBlN,GAAgB,SAAUiN,EAAMY,EAAMX,EAAMzJ,EAAMU,EAAYd,EAAagB,GAIvF,IAAMD,EAgCH0S,YAhCoC9I,EAAoB7J,GAgCtCwwI,YAAY,KA/BjC,GAAIvwI,EAAmB6I,EAAOxJ,EAAKY,GAAMD,GAAmB6I,EAAM,CAC9D,IAAI3I,EAAQuJ,EAAK2pB,MACb1zB,EAAaL,EAAKqlI,WAmBtB,OAjBI57H,IACA5I,EAAQ4I,EAAK7I,GAAGmzB,OAAS,GACzB1zB,EAAaoJ,EAAK7I,GAAGykI,YAGzBxsI,GAAA,EAAUJ,EAAA63I,IACNpwI,EACAyJ,EACApN,EACAiN,EACAxJ,EAAKY,EACLF,EACAG,EACAR,EACAT,EACAI,EAAKixI,YAAA,CAGZ,CAED,OAAO,CACV,IAEMp4I,CACV,EASGg3I,4BAhPJ,SAAqCtzI,GACjC,IAAKA,EACD,OAAO,EAGX,IAQIoN,EACAzJ,EACAsJ,EACA3Q,EACAJ,EACA2R,EACAX,EAZEzJ,GAFOzD,EAAemoI,WAAWC,OAAOC,IAAIC,SAASC,eAAevoI,EAAemoI,WAAWC,OAAO/rH,OAAOmsH,sBAAsBxoI,EAAemoI,WAAW9rH,OAAOosH,uBAAuBzoI,EAAeqc,OAAOg4H,iBAClNr0I,EAAemoI,WAAWC,OAAOC,IAAIC,SAASC,eAAevoI,EAAemoI,WAAWC,OAAO/rH,OAAOmsH,sBAAsBxoI,EAAemoI,WAAW9rH,OAAOosH,uBAAuBzoI,EAAeqc,OAAOm3H,aACvLe,gBAElBpwI,EAAO,EACPd,EAAa,EACbgB,EAAoB,EAexB,IALA6I,EAAalN,EAAe2kB,UAG5BroB,GAFA8Q,EAAY3J,EAAS+wI,WAELn4I,OAEX4Q,EAAI,EAAGA,EAAI3Q,EAAK2Q,IAoBjB,IAlBAY,EAAS,GADTlK,EAAOyJ,EAAUH,IAERhQ,eAAe,OACpB4Q,EAASlK,EAAKsJ,GAIdtJ,EAAK1G,eAAe,OAEpBoG,GADAc,EAAOR,EAAKyJ,GACQF,GAKpBW,EAAS,IAETA,EAASG,EAAkChO,EAD1BoN,EAAUH,EAAI,GACsCtJ,EAAMuJ,EAAY7J,IAGtFnH,EAAI,EAAGA,GAAK2R,EAAQ3R,IACrBmI,IAGAhB,GADAc,GAAQR,EAAKU,GACO6I,EAK5B,MAAO,CAAEs9H,iBAAkBnmI,EAAmBwmI,+BAAgCxnI,EACjF,EA4LJ,CAEDwK,EAAuB8rH,sBAAwB,yBAC/C,IAAMzsH,EAAUD,EAAAujB,EAAAyqG,gBAA6BptH,GAC7CT,EAAAojB,EAAAtjB,CAAA,gBAAAlN,EAAAoN,GAAA,aC5OAA,EAAAojB,EA3BI,SAAAxwB,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAA3oD,GACVsW,KAAKu9H,WAAa,KAElBv9H,KAAK+F,MAAQ,KACb/F,KAAKwyH,WAAa,KAClBxyH,KAAKkhB,MAAQ,KACblhB,KAAK0B,SAAW27B,IAEhBr9B,KAAKsyH,gBAAkB,KAEvBtyH,KAAKqyH,kBAAoBh1F,IAEzBr9B,KAAK0yH,eAAiBr1F,IAGtBr9B,KAAKyyH,sBAAwBp1F,IAE7Br9B,KAAK2yH,sBAAwBt1F,IAE7Br9B,KAAK4yH,oBAAsBv1F,IAG3Br9B,KAAK8yH,cAAgBz1F,IACrBr9B,KAAK4xH,eAAiB,IACzB,iBAAAloI,EAAAoN,GAAA,aCjBLA,EAAAojB,EAPI,SAAAxwB,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAA3oD,GAEVsW,KAAKykC,YAAc,GACnBzkC,KAAKxO,MAAQ,EAChB,iBAAA9H,EAAAoN,EAAAzJ,GAAA,aAAAA,EAAAU,EAAA+I,EAAA,CAAAojB,EAAA,kBAAAwvC,EAAA,QAAA/yD,EAAAtJ,EAAA,KAAArH,EAAAqH,EAAAA,EAAAsJ,GAAA/Q,EAAAyH,EAAA,MAAAkK,EAAAlK,EAAA,MAAAuJ,EAAAvJ,EAAA,MAAAqK,EAAArK,EAAA,MAAAF,EAAAE,EAAA,MAAAQ,EAAAR,EAAA,MAAAN,EAAAM,EAAA,MAAAU,EAAAV,EAAA,MCCL,SAASS,IAEL,IAGIpE,EACAoN,EACAzJ,EACAsJ,EACA3Q,EACAuR,EACA1J,EACAC,EACAE,EACAR,EACAJ,EACAoH,EACA4D,EACA2W,EACAjP,EACAtH,EACAE,EACA7S,EACA4W,EACAgD,EACAL,EACAQ,EACAgD,EACA/C,EACAF,EA3BEgD,EAAU3C,KAAK9V,QACf6X,GAAA,EAAWrK,EAAAwiB,GAASvX,GAASkgH,cAqCnC,SAAS7hH,IACLhU,IACA+hB,GAAA,EACAvhB,EAAY,EACZJ,EAAoB,EACpBsL,EAAwB,EACxBkK,GAAA,EACA/c,GAAA,EACA4W,GAAA,EACAoD,GAAA,EACAJ,EAAa49B,IACb7kC,EAAqB6kC,IAEjBxvC,IACAkU,EAASqa,IAAIjvB,EAAA+sB,EAAA60G,sBAA8B7kH,EAAwBxgB,GACnEqY,EAASqa,IAAIjvB,EAAA+sB,EAAAq1G,iBAAyBnjH,GAAyB1iB,GAC/DqY,EAASqa,IAAIjvB,EAAA+sB,EAAAw1G,iBAAyBhjH,GAAoBhjB,GAC1DqY,EAASqa,IAAIjvB,EAAA+sB,EAAAq2G,iBAAyBtjH,GAAoBvjB,GAC1DqY,EAASqa,IAAIruB,EAAAmsB,EAAAokH,eAAkCjyH,GAAkB3iB,GACjEqY,EAASqa,IAAIruB,EAAAmsB,EAAAqkH,oBAAuC7wH,GAAuBhkB,GAC3EqY,EAASqa,IAAIruB,EAAAmsB,EAAAskH,sBAAyC/xH,GAAyB/iB,GAC/EqY,EAASqa,IAAIruB,EAAAmsB,EAAAukH,2BAA8CrkH,GAA4B1wB,GACvFugB,IAkwBJpc,EAAWyC,oBAAoB,UAAW6Z,GAC1Ctc,EAAWyC,oBAAoB,iBAAkB6pB,IACjDtsB,EAAWyC,oBAAoB,OAAQ+Z,IACvCxc,EAAWyC,oBAAoB,UAAW+pB,IAC1CxsB,EAAWyC,oBAAoB,UAAW8Z,IAC1Cvc,EAAWyC,oBAAoB,QAASga,IACxCzc,EAAWyC,oBAAoB,QAAS6b,IACxCte,EAAWyC,oBAAoB,UAAWqa,IAC1C9c,EAAWyC,oBAAoB,SAAUoa,IACzC7c,EAAWyC,oBAAoB,aAAcsb,IAC7C/d,EAAWyC,oBAAoB,WAAYua,IAC3Chd,EAAWyC,oBAAoB,aAAcyb,IAC7Cle,EAAWyC,oBAAoB,iBAAkB0b,IACjDne,EAAWyC,oBAAoB,aAAcwb,IAC7Cje,EAAWyC,oBAAoB,UAAW4b,IAC1Cre,EAAWyC,oBAAoB,QAAS2b,IACxCpe,EAAWyC,oBAAoB,eAAgBub,KA9wB/C7d,EAA0B,KAC1BH,EAAa,KACb2G,EAAa,KACb4D,EAAY,IACf,CAuDD,SAAS+D,IACL,OAAOqE,YAAYS,EADmBjZ,UAAAjC,OAAA,YAAAiC,UAAA,GAAAA,UAAA,GAAN,MACawb,KAAWsmB,QAAQ,GACnE,CAOD,SAAS7oB,EAAiBvX,GACtB,IAAMoN,EAAUpN,GAAgB8K,EAChC,OAAOsC,EAAQwL,MAAQxL,EAAQ4K,QAClC,CAKD,SAASnN,IAA8B,IAAzB7K,EAAyB1B,UAAAjC,OAAA,YAAAiC,UAAA,IAAAA,UAAA,GAC/BwM,GAAc3G,GAAcA,EAAW6wI,cACnCh1I,GAAmB0O,GACnB0K,EAAqCU,KAEzC3V,EAAWqgH,QAEXn/F,GAAA,CAEP,CAKD,SAAS/hB,IACDwH,GAAc3G,GACdA,EAAWsgH,OAElB,CASD,SAAStrG,EAAKnZ,GAA0E,IAApE2D,EAAoErF,UAAAjC,OAAA,YAAAiC,UAAA,IAAAA,UAAA,GAA3C2O,EAA2C3O,UAAAjC,OAAA,YAAAiC,UAAA,IAAAA,UAAA,GAAzBhC,EAAyBgC,UAAAjC,OAAA,YAAAiC,UAAA,IAAAA,UAAA,GAC/EwM,GAAe3G,GAAeA,EAAW6wI,cAG1Ch1I,KADes1B,MAAMvf,GAA2B5R,EAAW2T,UAAxB/B,MAGvCL,GAAA,IAAgBzI,KAGZ8I,EAAa/V,GAEjBoN,EAAO0I,KAAK,4BAA8B9V,GAAQ0V,EAAe,cAAgB,KAG7EhH,GAAapS,GACb8c,EAAqCpZ,GAGzCmE,EAAWkoH,eAAersH,EAAM2D,GACnC,CAuCD,SAAS6sB,IACL,GAAK1lB,GAAe3G,GAAeuK,EAAnC,CAIA,IAAM1O,EAAO2D,GAAoBA,EAAiBsxI,gBAAkB/4I,EAAAs0B,EAAAi7C,MAAkBvvE,EAAAs0B,EAAA3B,MAChFzhB,EAAU9Q,EAAYm4I,kBAAkBz0I,GAE9C,OAAOoN,GAAWA,EAAQo8B,MAAQp8B,EAAQo8B,MAAM1wB,IAAM,CALrD,CAMJ,CAGD,SAASM,EAAqCpZ,GAC1C,IAAMoN,EAAM,IAAIyK,KAAKzT,EAAkB8vI,0BACjCvwI,EAASkK,EAAQqnI,oBAAoB,GACrCjoI,EAAwB7I,EAAkB+wI,iCAAiC/nI,EAAKzJ,GAEtFG,EAAYmJ,EAAwBjN,CACvC,CAMD,SAAS8Z,IACL,OAAOhP,GAAc3G,EAAaA,EAAW2T,UAAY,IAC5D,CAMD,SAAS5T,IACL,OAAO4G,GAAc3G,EAAaA,EAAWixI,WAAa,IAC7D,CAMD,SAAS3tH,IACL,OAAO3c,GAAc3G,EAAaA,EAAWkxI,YAAc,IAC9D,CAMD,SAASr1H,IACL,OAAOlV,GAAc3G,EAAaA,EAAWmxI,YAAc,IAC9D,CAMD,SAAS74H,IACL,OAAO3R,GAAc3G,EAAaA,EAAWoxI,kBAAoB,IACpE,CAcD,SAAS51H,IACL,OAAO7U,GAAc3G,EAAaA,EAAWqxI,WAAa,IAC7D,CAMD,SAASt5H,IACL,OAAOxN,CACV,CAwJD,SAAS4R,IAAoC,IAAlBtgB,EAAkB1B,UAAAjC,OAAA,YAAAiC,UAAA,GAAAA,UAAA,GAAN,KACnC,IAAI4F,KAAewK,GAA4C,IAA/BvK,EAAWsxI,kBAAyBhuH,MAAevO,EAAnF,CAIKlZ,IACDA,EAAY2D,EAAiBsxI,gBAAkB/4I,EAAAs0B,EAAAi7C,MAAkBvvE,EAAAs0B,EAAA3B,OAGrE,IAAM5hB,EAAc6M,IACdxd,EAAayjB,EAA6B9S,EAAajN,IACvCs1B,MAAMh5B,IAAeA,IAAe2Q,IACtCwa,MAAgBzH,KAAe9J,GAAkD,IAA/B/R,EAAWsxI,mBAC7EroI,EAAOwI,MAAP,2CAAAhW,OAAwDtD,EAAxD,uBAAAsD,OAAwFqN,IACxFkM,EAAK7c,GAAA,GAAY,GAb8F,CAetH,CASD,SAASyjB,EAA6B/f,EAAaoN,GAC/C,IAAMzJ,EAAarH,EAAYm4I,kBAAkBrnI,GAC3CH,EAAYtJ,EAAaA,EAAW6lC,MAAQ,KAGlD,OAAKv8B,EAIDjN,EAAciN,EAAU6L,IACXlK,KAAKgN,IAAI3O,EAAU6L,IAAMhV,EAAWmJ,EAAU2L,OAEpD5Y,EAAc,GAAKA,EAAc,IAAQiN,EAAU2L,OAAShK,KAAKC,IAAI7O,EAAciN,EAAU2L,OAAS,QAOzG7F,EACanE,KAAKgN,IAAI3O,EAAU6L,IAAMhV,EAAWmJ,EAAU2L,OAE9C3L,EAAU2L,MAGd5Y,EAnBN2zC,GAuBd,CAKD,SAAStzB,IAC2B,OAA5B/b,IAEJA,EAA0BghC,aAAY,YA2J1C,WAQI,GAPAjtB,EAASsc,QAAQlxB,EAAA+sB,EAAA62G,uBAA+B,CAC5CqO,UAAWhnI,EACX+6B,KAAM,IAAI5xB,OAKVqE,IAAgB,CAChB,IAAMlc,EAAM6X,KAAK6H,OACb4V,MAAMxmB,IAAuB9O,EAAM8O,EAAqBmH,EAASmB,MAAMskH,UAAUI,yCACjFn4H,EAAiBgyI,eACbzxI,IAchB,WACI,IAAMlE,EAAM6X,KAAK6H,QACZtJ,GAAwBpW,EAAMoW,EApsBG,OAqsBlCA,EAAuBpW,EACvBkiB,KAEP,CAND,GAXgB5B,IAEJxR,EAAqB9O,EAE5B,CACJ,CApBD,EAzJK,GAAEiW,EAASmB,MAAMskH,UAAUE,6BAC/B,CAKD,SAASr7G,IACLmlB,cAAcphC,GACdA,EAA0B,IAC7B,CAED,SAASkc,EAAuBxgB,GAC5B,IAAMoN,EAAqBS,EAAQ+nI,0CAA0C51I,EAAE61I,uBACzElyI,EAAOyJ,EAAqBA,EAAmBi8H,UAAU1B,WAAa,KAE/D,OAAThkI,GAAiBmH,EAAWmN,KAAOtU,EAAKsU,KAC5CnN,EAAanH,EAChB,CAED,SAAS8c,IACLpI,EAASsc,QAAQlxB,EAAA+sB,EAAAslH,SACpB,CAED,SAASrlH,KACLpY,EAASsc,QAAQlxB,EAAA+sB,EAAAulH,iBACpB,CAED,SAASrlH,GAA2B1wB,GAE5BA,EAAEs6H,WAAa32H,EAAiBqyI,sBAAsB/9H,KAI1D/B,EAAkBlW,EAAE2xC,QAAUzkC,EAAAsjB,EAAAylH,aAE1BhgI,EAASmB,MAAMskH,UAAUr6G,OAAO+8G,eAChCj6H,EAAWi6H,cAAcp+H,EAAEu6H,UAAWv6H,EAAE2xC,QAAUzkC,EAAAsjB,EAAAylH,cAEzD,CAED,SAASt1H,KACLvT,EAAO0I,KAAK,oCACZwK,IACAD,IACAhI,EAASsc,QAAQlxB,EAAA+sB,EAAA0lH,iBAAyB,CAAE//G,UAAWrc,KAC1D,CAED,SAAS6W,KACLvjB,EAAO0I,KAAK,uCACZuC,EAASsc,QAAQlxB,EAAA+sB,EAAA2lH,iBAAyB,CAAEC,YAAat8H,KAC5D,CAED,SAAS4G,KACLtT,EAAO0I,KAAK,uCACZJ,GAAA,EACA2C,EAASsc,QAAQlxB,EAAA+sB,EAAA6lH,iBAAyB,CAAED,YAAat8H,KAC5D,CAED,SAAS8G,KACLxT,EAAO0I,KAAK,qCACZuC,EAASsc,QAAQlxB,EAAA+sB,EAAA8lH,gBAAwB,CAAEnkG,MAAOxyB,KACrD,CAED,SAASsB,KAEL,IAAIvL,EAAJ,CAIA,IAAI1V,EAAW8Z,IAGVwb,MAAMvf,IAAeA,IAAe/V,IACrCA,EAAW+V,GAEfA,EAAa49B,IAEbvmC,EAAO0I,KAAK,eAAiB9V,GAC7BqgB,IACAhI,EAASsc,QAAQlxB,EAAA+sB,EAAA+lH,iBAAyB,CACtCC,SAAUx2I,EACVs6H,SAAUxvH,EAAWmN,IAdxB,CAgBJ,CAED,SAAS+I,KACL5T,EAAO0I,KAAK,sCACZJ,GAAA,EACA2C,EAASsc,QAAQlxB,EAAA+sB,EAAAimH,gBACpB,CAED,SAASv0H,KACDpX,GACAuN,EAASsc,QAAQlxB,EAAA+sB,EAAAkmH,sBAA8B,CAC3CC,UAAWlkI,IACXg3B,KAAM3vB,IACNwgH,SAAUxvH,EAAWmN,IAGhC,CAED,SAASkJ,KACL9I,EAASsc,QAAQlxB,EAAA+sB,EAAAomH,kBAA0B,CAAEtc,SAAUxvH,EAAWmN,IACrE,CAED,SAASoK,KACL,IAAMriB,EAAOyc,IACbrP,EAAO0I,KAAK,2CAA4C9V,GACxDqY,EAASsc,QAAQlxB,EAAA+sB,EAAAqmH,sBAA8B,CAAEh9G,aAAc75B,GAClE,CAED,SAASsiB,KACLlV,EAAO0I,KAAK,8CACZuC,EAASsc,QAAQlxB,EAAA+sB,EAAAsmH,0BACjBz2H,GACH,CAED,SAAS+B,KACLhV,EAAO0I,KAAK,0CACZuC,EAASsc,QAAQlxB,EAAA+sB,EAAAumH,qBACpB,CAGD,SAASx0H,KACLnV,EAAO0I,KAAK,qCACZxS,IACAid,IACA,IAAMvgB,EAAa2D,EAAmBA,EAAiBqyI,sBAAwB,KAC1Eh2I,GACLqY,EAASsc,QAAQlxB,EAAA+sB,EAAAokH,eAAuB,CAAEoC,OAAUh3I,EAAWg3I,QAClE,CAED,SAAS70H,KACL9J,EAASsc,QAAQlxB,EAAA+sB,EAAAymH,wBACpB,CAGD,SAASt0H,GAAiB3iB,GACtB,GAAIsE,GAA2BtE,EAAEg3I,OAAQ,CAErC5pI,EAAO0I,KAAK,gFACZ,IAAMnS,EAAW3D,EAAEw2I,SAAWx2I,EAAEw2I,SAAWj/H,IAC3CpT,EAAWkoH,eAAe1oH,GAC1BL,IACAid,GACH,CACJ,CAED,SAASkC,GAAiBziB,GACtB,IAAMoN,EAASpN,EAAMskF,QAAUtkF,EAAMukF,WACrClsE,EAASsc,QAAQlxB,EAAA+sB,EAAA0mH,eAAuB,CAAE1rI,MAAO4B,EAAO5B,OAC3D,CAwBD,SAASqX,KACLnU,GAAA,CACH,CAwCD,SAASgU,GAAwB1iB,GAE7B,IAAI,IAAAA,EAAEq+D,QAAoBtrD,IAA0BuiB,MAAMt1B,EAAEU,QAAQsX,UAAW,CAC3E,IAAMrU,EAAW,IAAM3D,EAAEU,QAAQsX,SAC7BrU,EAAWG,IACXsJ,EAAOX,KAAK,sHAAuH9I,EAASy8B,QAAQ,IACpJt8B,EAAYH,EACZD,EAAoBC,EAE3B,CACJ,CAED,SAAS6e,GAAkBxiB,GACvBqY,EAASsc,QAAQlxB,EAAA+sB,EAAA2mH,iBAAyB,CAAEn3I,EAAGA,GAClD,CAED,SAASgkB,GAAsBhkB,GA4C/B,IAAgC2D,GAAAA,EA3CL3D,EAAEqpI,YA4CR1lI,EAAUyzI,wBACvBzzI,EAAUyzI,uBAAuBl7I,EAAAs0B,EAAA6mH,sCACyD,SAA1F1zI,EAAUyzI,uBAAuBl7I,EAAAs0B,EAAA6mH,qCAA+CvvI,QAChFsF,EAAOwI,MAAM,uEACb7C,GAAA,EA/CP,CAOD,SAASgQ,GAAwB/iB,GAC7B,IAAMoN,EAAmBzJ,EAAiBqyI,sBACrCh2I,GAAMoN,GAAqBpN,EAAE61I,uBAA0B71I,EAAEs6H,UAAYt6H,EAAEs6H,WAAaltH,EAAiB6K,IAAOjY,EAAEu6H,YAAcv6H,EAAEu6H,YAAcr+H,EAAAs0B,EAAAi7C,OAAmBzrE,EAAEu6H,YAAcr+H,EAAAs0B,EAAA3B,SAIpL1yB,EAA2B6D,EAAE61I,sBAAsB1M,0BACnDp2H,GAAyB5W,KAGKga,IAC1BA,GAAA,GAEP,CAUD,SAAS6M,KACL9J,GAAA,CACH,CAMD,SAASqK,KACLrK,GAAA,CACH,CAsFD,OAnCAlZ,EAAW,CACPqqI,WAvwBJ,SAAoBj9H,EAAOzJ,GACvBmH,EAAasC,GAAA,IAETzJ,IA4tBJQ,EAAW6F,iBAAiB,UAAWyW,GACvCtc,EAAW6F,iBAAiB,iBAAkBymB,IAC9CtsB,EAAW6F,iBAAiB,OAAQ2W,IACpCxc,EAAW6F,iBAAiB,UAAW2mB,IACvCxsB,EAAW6F,iBAAiB,UAAW0W,IACvCvc,EAAW6F,iBAAiB,QAAS4W,IACrCzc,EAAW6F,iBAAiB,QAASyY,IACrCte,EAAW6F,iBAAiB,UAAWiX,IACvC9c,EAAW6F,iBAAiB,SAAUgX,IACtC7c,EAAW6F,iBAAiB,aAAckY,IAC1C/d,EAAW6F,iBAAiB,WAAYmX,IACxChd,EAAW6F,iBAAiB,aAAcqY,IAC1Cle,EAAW6F,iBAAiB,iBAAkBsY,IAC9Cne,EAAW6F,iBAAiB,aAAcoY,IAC1Cje,EAAW6F,iBAAiB,UAAWwY,IACvCre,EAAW6F,iBAAiB,QAASuY,IACrCpe,EAAW6F,iBAAiB,eAAgBmY,IAjuB5CzT,EAAY5D,EAAWwsI,aAAa5B,UAEpCx/H,GAAA,EACAR,GAAA,EAEA2C,EAAS+Z,GAAG3uB,EAAA+sB,EAAA60G,sBAA8B7kH,EAAwBxgB,GAClEqY,EAAS+Z,GAAG3uB,EAAA+sB,EAAAq1G,iBAAyBnjH,GAAyB1iB,GAC9DqY,EAAS+Z,GAAG3uB,EAAA+sB,EAAAw1G,iBAAyBhjH,GAAoBhjB,GACzDqY,EAAS+Z,GAAG3uB,EAAA+sB,EAAAq2G,iBAAyBtjH,GAAoBvjB,GACzDqY,EAAS+Z,GAAG/tB,EAAAmsB,EAAAokH,eAAkCjyH,GAAkB3iB,EAAU,CAAEkrF,SAAUl9E,EAAAwiB,EAAAkqG,sBACtFriH,EAAS+Z,GAAG/tB,EAAAmsB,EAAAqkH,oBAAuC7wH,GAAuBhkB,GAC1EqY,EAAS+Z,GAAG/tB,EAAAmsB,EAAAskH,sBAAyC/xH,GAAyB/iB,GAC9EqY,EAAS+Z,GAAG/tB,EAAAmsB,EAAAukH,2BAA8CrkH,GAA4B1wB,GACtFqY,EAAS+Z,GAAG/tB,EAAAmsB,EAAAu6G,kBAAqCloH,GAAoB7iB,GAEjEqlB,IACAA,GAAA,EACAxa,KAzBP,EAkwBG0sI,UAtaJ,SAAmBv3I,GACVA,IAEDA,EAAOyjE,mBACP9/D,EAAmB3D,EAAOyjE,kBAE1BzjE,EAAOw3I,+BACPvqI,EAA+BjN,EAAOw3I,8BAEtCx3I,EAAOs0I,cACPh4I,EAAc0D,EAAOs0I,aAErBt0I,EAAOmzG,UACPtlG,EAAU7N,EAAOmzG,SAEjBnzG,EAAOy3I,aACPtzI,EAAanE,EAAOy3I,YAEpBz3I,EAAO6nI,oBACPzjI,EAAoBpE,EAAO6nI,mBAE3B7nI,EAAOo5G,WACPnjG,EAAWjW,EAAOo5G,UAEzB,EA+YGs+B,mBAAAjlI,EACAklI,eA1IJ,WAA2C,IAAnB33I,EAAmB1B,UAAAjC,OAAA,YAAAiC,UAAA,GAAAA,UAAA,GAAN,KAC7B8O,EAAc,KAYlB,OAXAzJ,EAAiBi0I,4BAA4BluI,SAAQ,SAAA/F,GACjD,IAAK3D,GAAoC,IAAtBA,EAAW3D,SAAqD,IAArC2D,EAAWyI,QAAQ9E,EAAE01H,WAAmB,CAClF,IAAMpsH,EAAKtJ,EAAEg0I,iBAETvqI,EADgB,OAAhBA,EACcH,EAEA2B,KAAK+M,IAAIvO,EAAaH,EAE3C,CACJ,IAEMG,CACV,EA6HGyqI,mBApuBJ,WACI,OAAO3hI,CACV,EAmuBG4B,QAAAgC,EACAg+H,yBAzHJ,WACI,OAAO/kI,CACV,EAwHGglI,+BA7EJ,WACI,OAAO5hI,CACV,EA4EG6hI,8BAzhBJ,WACI,OAAO9+H,CACV,EAwhBGq8H,gBAAA94H,EACAw7H,gBA3jBJ,WACI,OAAOntI,GAAc3G,EAAaA,EAAW8zI,kBAAoB,IACpE,EA0jBGzC,SAAA71H,EACAu4H,aAAAh8H,EACAi8H,oBAtiBJ,WACI,OAAOx0I,CACV,EAqiBGy0I,uBA5eJ,SAAgCp4I,EAAkBoN,GAC9C,IAAIzJ,EACArH,EACAJ,EAGEgR,GAA4BooB,MAAMt1B,IAAqByO,SAASzO,GAAoBA,EAAmB2zC,IAEzG3lC,EAA6BH,EAAQwqI,gCACnC50I,EAA6BwJ,EAA6BqrI,gCA6ChE,OA/BI30I,EAXC2xB,MAAMrf,EAASmB,MAAMskH,UAAUqB,MAAME,WAKyB,OAA1DhnH,EAASmB,MAAMskH,UAAUqB,MAAMC,wBAAoC1nG,MAAMrf,EAASmB,MAAMskH,UAAUqB,MAAMC,yBAA4B1nG,MAAMpoB,GAK1IzJ,IAA+B6xB,MAAM7xB,EAA2Bw5H,YAAcx5H,EAA2Bw5H,UAAY,EAClHx5H,EAA2Bw5H,WAAA,IAG9BhnH,EAASmB,MAAMskH,UAAUqB,MAAMG,+BAAyE,OAA/BlvH,IAAwCsnB,MAAMtnB,IAA+BA,EAA6B,EAChLA,EAIFsnB,MAAMpoB,GAMJE,IAAiBkoB,MAAMloB,EAAamrI,eAjCjB,EAiCkCnrI,EAAamrI,cAjC/C,EAiCwFztI,EAAWwsI,aAAaiB,cAhC9G,EA2BrBrrI,EAdAA,EAA2B+I,EAASmB,MAAMskH,UAAUqB,MAAMC,uBAL1D/mH,EAASmB,MAAMskH,UAAUqB,MAAME,UA4BzB,QADlB/gI,EAAY2R,EAAQ2qI,8BAEhBxpI,EAAwB9S,GAKxBI,EAFA8Q,GAAgBA,EAAaqrI,cAAgB,EAEvC7pI,KAAK+M,IAAIhY,EAAOyJ,EAAaqrI,eAE7B90I,EAEVG,EAAYxH,EACZoH,EAAoBpH,EAEbA,CACV,EAsbGo8I,aAhhBJ,WACI,OAAO50I,CACV,EA+gBG60I,qBA1gBJ,WACI,OAAOj1I,CACV,EAygBGk1I,sBAngBJ,WACI,IAAKlqI,GAAa4mB,MAAMtmB,GACpB,OAAO2kC,IAEX,IAAI3zC,EAAc8Z,IAClB,GAAIwb,MAAMt1B,IAAgC,IAAhBA,EACtB,OAAO,EAGX,IAAMoN,GAAM,IAAIyK,MAAOC,UAAsD,IAA1C1T,EAAkBy0I,sBACrD,OAAOjqI,KAAKgN,MAAMxO,EAAM4B,EAAsC,IAAdhP,GAAsB,KAAMogC,QAAQ,GAAI,EAC3F,EAyfGokF,KAAA35G,EACAuqI,SAAAlxI,EACAoxI,UAAAt1H,EACAykG,MAAAnhH,EACA+xI,UAAA5tH,EACAqxH,iBAAAvhI,EACAwtG,KAAA5rG,EACA4/H,mBAzqBJ,WAAgG,IAApE/4I,EAAoE1B,UAAAjC,OAAA,YAAAiC,UAAA,IAAAA,UAAA,GAA3C8O,EAA2C9O,UAAAjC,OAAA,YAAAiC,UAAA,IAAAA,UAAA,GAAzBqF,EAAyBrF,UAAAjC,OAAA,YAAAiC,UAAA,IAAAA,UAAA,GACtF2O,EAAeujB,IAEA,IAAjBvjB,GAOJkM,EAFiBlM,GADjBnJ,EAAYJ,GAGG1D,EAAiBoN,EAAUzJ,EAC7C,EA+pBGq1I,kBAvpBJ,WAA+F,IAApEh5I,EAAoE1B,UAAAjC,OAAA,YAAAiC,UAAA,IAAAA,UAAA,GAA3C8O,EAA2C9O,UAAAjC,OAAA,YAAAiC,UAAA,IAAAA,UAAA,GAAzBqF,EAAyBrF,UAAAjC,OAAA,YAAAiC,UAAA,IAAAA,UAAA,GACrF2O,EAAeujB,IAEA,IAAjBvjB,GAMJkM,EAFiBlM,EAAenJ,EAEjB9D,EAAiBoN,EAAUzJ,EAC7C,EA8oBGqrC,MAAA13B,EACA2hI,kBAAA34H,EACAk4H,yBAtiBJ,WACI,OAAOxpI,CACV,GA7SG5B,GAAA,EAAS/J,EAAAmtB,GAAMvX,GAASkgH,cAAcK,UAAUx5H,GAEhDsX,IAo1BGtX,CACV,CAEDoE,EAAmBu1H,sBAAwB,qBAC3C,IAAAr1H,EAAeH,EAAAqsB,EAAAopG,oBAAiCx1H,GAAAN,EAAAH,EAAA,MCh4B1CD,EAAyB,UACzBoH,EAA0B,WAE1B4D,EAAwB,SAE9B,SAAS2W,EAAcrlB,GAGnB,IAQIoN,EACAzJ,EACAsJ,EACA3Q,EAXEJ,GADN8D,EAASA,GAAU,CAAC,GACIynI,SAClB55H,EAAS7N,EAAOs2G,OAChBppG,EAAclN,EAAOs0I,YACrBtmI,EAAiBhO,EAAO+wC,eACxBttC,EAAQzD,EAAO4V,MACfzR,EAAanE,EAAO2nI,WACpBtkI,EAAOrD,EAAO/B,KAuBpB,SAASoG,EAAiBrE,GACtB,IAaQoN,EAWR,QAAKpN,IAXGoN,GAAA,EAeKH,EAbA2f,MAAK,SAAAjpB,GACV,GAZuBsJ,EAYNjN,EAZY1D,EAYHqH,GAXtB2xB,MAAMroB,EAAKoP,QAAWpP,EAAKkpB,YAAc75B,EAAK65B,WAAelpB,EAAKq8H,kBAAoBhtI,EAAKgtI,iBAAqBr8H,EAAKhP,OAAS3B,EAAK2B,MAG3H,SAAU+B,EAAMoN,GAChC,OAAOkoB,MAAMt1B,EAAKqc,QAAUiZ,MAAMloB,EAAKiP,QAAWrc,EAAKq5G,UAAYjsG,EAAKisG,OAC3E,CAFmB,CAQkCr5G,EAAS2D,IAhBvC,SAAU3D,EAAMoN,GACpC,OAASpN,EAAKm+B,SAAWr6B,EAAA0sB,EAAA0oH,iBAAqCl5I,EAAKm+B,SAAW/wB,EAAK+wB,MACtF,CAFuB,CAgB+Dn+B,EAAS2D,GAEpF,OADAyJ,GAAA,EAbS,IAAUH,EAAM3Q,CAgBhC,IACM8Q,EAQd,CAgDD,SAAShJ,EAAoBpE,GACzB,OAAOs1B,MAAMt1B,EAAIgY,UAAY,IAAOpJ,KAAK+M,IAAI3b,EAAIgY,SAAW,EAAG,GAClE,CAED,SAAS1T,EAAiCtE,GACtCiN,EAAmBA,EAAiBoK,QAAO,SAAAjK,GACvC,IAAMzJ,EAAYS,EAAoBgJ,GACtC,OAAOkoB,MAAMloB,EAAI+oB,iBAAA,IAAen2B,GAAqBoN,EAAI+oB,WAAan2B,EAAO2D,CAChF,GACJ,CAQD,SAAS0hB,EAAkCrlB,EAAOoN,GAC1CA,GAAOpN,EAAQ,KAInBiN,EAAmBA,EAAiBoK,QAAO,SAAA1T,GACvC,IAAMsJ,EAAY7I,EAAoBT,GACtC,OAAQ2xB,MAAM3xB,EAAIwyB,YAAcxyB,EAAIwyB,WAAc/oB,EAAMH,GACnDqoB,MAAM3xB,EAAIqU,WAAcrU,EAAIwyB,UAAYxyB,EAAIqU,UAAchY,EAAQiN,CAC1E,IACJ,CA6CD,SAASmJ,EAAkBpW,EAAKoN,EAAMzJ,GAGlC,IADA,IACSsJ,EADOjN,EAAI3D,OAAS,EACP4Q,GAAK,EAAGA,IAAK,CAC/B,IAAM3Q,EAAM0D,EAAIiN,GACV/Q,EAAQI,EAAI65B,UACZtoB,EAAM3R,EAAQI,EAAI0b,SAExB,GADArU,EAAa2xB,MAAM3xB,GAAyBS,EAAoB9H,GAAhCqH,GAC1B2xB,MAAMp5B,KAAWo5B,MAAMznB,IAAUT,EAAOzJ,GAAczH,GAAYkR,EAAOzJ,EAAakK,GAAUynB,MAAMp5B,IAAUo5B,MAAMloB,GACxH,OAAO9Q,CAEd,CACD,OAAO,IACV,CAiCD,SAASwS,EAAyB9O,EAASoN,GACvCF,EAAYisI,kBAAkBn5I,EAASoN,GACvCF,EAAYksI,iBAAiBp5I,EAAQu6H,UAAWj+H,EAAiB2Q,EACpE,CAED,SAAS+B,EAAmBhP,GACpBA,EAAEq5I,SAAWrrI,IAEjB1R,EAAgBkrB,OAAOlrB,EAAgBmM,QAAQzI,EAAEU,SAAU,GAEvDV,EAAE0H,WAAa1H,EAAEwL,OACjByB,EAAiB8T,KAAK/gB,EAAEU,SAG5BoO,EAAyB9O,EAAEU,QAASV,EAAEwL,MAAQkD,EAAwB5D,GAEtE5O,EAASy4B,QAAQ9mB,EAAOyrI,2BACpB,CACI54I,QAASV,EAAEU,QACXgH,SAAU1H,EAAE0H,SACZ8D,MAAOxL,EAAEwL,MACT6tI,OAAQ/iI,MAEZ,CAAEgkH,SAAUn2H,EAAW8T,GAAIsiH,UAAWl3H,IAE7C,CAED,SAASlH,EAAoB6D,GACrBA,EAAEq5I,SAAWrrI,GAEjB9R,EAASy4B,QAAQ9mB,EAAO0rI,0BACpB,CACI74I,QAASV,EAAEU,QACXgH,SAAU1H,EAAE0H,SACZ8D,MAAOxL,EAAEwL,MACT6tI,OAAQ/iI,MAEZ,CAAEgkH,SAAUn2H,EAAW8T,GAAIsiH,UAAWl3H,GAE7C,CAED,SAAS0P,EAAiB/S,GAClBA,EAAEq5I,SAAWrrI,GAEjB9R,EAASy4B,QAAQ9mB,EAAO2rI,2BACpB,CAAE94I,QAASV,EAAEU,SACb,CAAE45H,SAAUn2H,EAAW8T,GAAIsiH,UAAWl3H,GAE7C,CAED,SAAS0S,IACL9I,EAAmB,GACnB3Q,EAAkB,EACrB,CAkCD,OAjBA8Q,EAAW,CACPitH,YAnRJ,WACI,OAAOl2H,EAAW8T,EACrB,EAkRGohH,QAhRJ,WACI,OAAOh2H,CACV,EA+QGo2I,YA3MJ,SAAqBz5I,GACjB,IAAMoN,EAASpN,EAASA,EAAO2xC,iBAAiBn1C,MAAQwD,EAAO2xC,MAAQ,CAAC3xC,EAAO2xC,OAAS,GAEpFhuC,EAAmB,GAMvB,OALAyJ,EAAO1D,SAAQ,SAAA0D,GACX,IAAMlR,EA8Gd,SAA6B8D,GACzB,IAAIoN,EACJ,OAAQpN,GACJ,KAAK0D,EACD0J,EAAW9Q,EACX,MACJ,KAAKwO,EACDsC,EAAWH,EACX,MACJ,QACIG,EAAW,GAEnB,OAAOA,CACV,CAbD,CA9G6CA,GACrCzJ,EAAmBA,EAAiB/D,OA6F5C,SAAwBI,EAAKoN,GAEzB,OAAIA,EAAOnQ,eAAe,QACf,CAACmZ,EAAkBpW,EAAKoN,EAAOq8B,KAAMr8B,EAAOyxH,YAGhD7+H,EAAIqX,QAAO,SAAArX,GACd,IAAK,IAAM2D,KAAQyJ,EACf,GAAa,UAATzJ,GACAyJ,EAAOnQ,eAAe0G,IAAS3D,EAAQ2D,IAASyJ,EAAOzJ,GAAO,OAAO,EAG7E,OAAO,CACV,GACJ,CAdD,CA7FkEzH,EAAU8D,GACvE,IAEM2D,CACV,EAkMG+1I,iBAAAr1I,EACAs1I,0BA/OJ,SAAmC35I,GAC/B,IAEIoN,EAFAzJ,GAAA,EACAsJ,EAAI,EAOR,KAHAtJ,EAAWU,EAAiBrE,IAIxB,IAAKiN,EAAI,EAAGA,EAAI3Q,EAAgBD,OAAQ4Q,IACpCG,EAAM9Q,EAAgB2Q,GACjBjN,EAAQoC,MAAQgL,EAAIhL,KAASpC,EAAQm2B,YAAc/oB,EAAI+oB,YACxDxyB,GAAA,GAKZ,OAAOA,CACV,EA6NGi2I,iCAAAt1I,EACAu1I,gCAxLJ,SAAyC75I,GACrCiN,EAAmBA,EAAiBoK,QAAO,SAAAjK,GACvC,OAAOkoB,MAAMloB,EAAI+oB,iBAAA,IAAen2B,GAAqBoN,EAAI+oB,UAAYn2B,CACxE,GACJ,EAqLG85I,sCAtKJ,SAA+C95I,EAAgBoN,GAC3D,GAAKpN,GAA4C,IAA1BA,EAAe3D,OAAtC,CAMA,IADA,IAAIsH,EAAQ,EACHsJ,EAAI,EAAG3Q,EAAK0D,EAAe3D,OAAQ4Q,EAAI3Q,EAAI2Q,IAChDoY,EAAkC1hB,EAAO3D,EAAe4Y,MAAM3L,IAC9DtJ,EAAQ3D,EAAe8Y,IAAI7L,GAE3BG,EAAiB,GACjBiY,EAAkC1hB,EAAOyJ,EAR5C,MAFG9I,GAYP,EAyJGmX,cAvJJ,WACI9X,EAAOiS,MAAM,kBACb5H,EAAe5D,QACf9N,EAAkB,EACrB,EAoJGy9I,eAlJJ,SAAwB/5I,GACZA,EAAQm+B,SACPr6B,EAAA0sB,EAAAwpH,iBACDlrI,EAAyB9O,EAAS0D,GAClCpH,EAAgBykB,KAAK/gB,GAQjC,SAA6BA,GACzB9D,EAASy4B,QAAQ9mB,EAAOosI,yBACpB,CAAEv5I,QAASV,GACX,CAAEs6H,SAAUn2H,EAAW8T,GAAIsiH,UAAWl3H,IAE1C2K,EAAeglB,KAAKhzB,EACvB,CAND,CAPgCA,IAGpB2D,EAAO8I,KAAK,0BAEvB,EAyIGuiC,MA1BJ,WACI9yC,EAASw2B,IAAI7kB,EAAO+3H,kBAAmB52H,EAAoBsH,MAC3Dpa,EAASw2B,IAAI7kB,EAAOi4H,sBAAuB3pI,EAAqBma,MAChEpa,EAASw2B,IAAI7kB,EAAOk4H,kBAAmBhzH,EAAkBuD,MAErDtI,GACAA,EAAeghC,QAEnBj5B,GACH,EAkBGmkI,qBAAAnkI,EACAokI,mBAjBJ,SAA4Bn6I,GACxBiN,EAAiB8T,KAAK/gB,EACzB,GAvRG2D,EAASF,EAAM+1H,UAAUpsH,GACzB2I,IACA7Z,EAASk2B,GAAGvkB,EAAO+3H,kBAAmB52H,EAAoB5B,GAC1DlR,EAASk2B,GAAGvkB,EAAOi4H,sBAAuB3pI,EAAqBiR,GAC/DlR,EAASk2B,GAAGvkB,EAAOk4H,kBAAmBhzH,EAAkB3F,GAsSrDA,CACV,CAEDiY,EAAcs0G,sBAAwB,gBACtC,IAAMvjH,EAAUjS,EAAAqsB,EAAAyqG,gBAA6B51G,GAC7CjP,EAAQgkI,uBAAyB12I,EACjC0S,EAAQikI,wBAA0BvvI,EAClCsL,EAAQkkI,wBArUwB,WAsUhClkI,EAAQmkI,sBAAwB7rI,EAChCvK,EAAAqsB,EAAA2qG,mBAAgC91G,EAAcs0G,sBAAuBvjH,GACrE,IAAAtH,EAAAsH,EAAApH,EAAArL,EAAA,eAAAxH,EAAA6D,GAAA,OAAA7D,EAAA,mBAAAoH,QAAA,iBAAAA,OAAA85E,SAAA,SAAAr9E,GAAA,cAAAA,CAAA,WAAAA,GAAA,OAAAA,GAAA,mBAAAuD,QAAAvD,EAAA5D,cAAAmH,QAAAvD,IAAAuD,OAAAxG,UAAA,gBAAAiD,CAAA,EAAA7D,EAAA6D,EAAA,UAAA+S,EAAA/S,EAAAoN,GAAA,OAAA2F,EAAAjW,OAAA4nI,gBAAA,SAAA1kI,EAAAoN,GAAA,OAAApN,EAAA8oD,UAAA17C,EAAApN,CAAA,EAAA+S,EAAA/S,EAAAoN,EAAA,UAAA2I,EAAA/V,EAAAoN,GAAA,OAAAA,GAAA,WAAAjR,EAAAiR,IAAA,mBAAAA,EAAA,SAAApN,GAAA,YAAAA,EAAA,UAAAwxC,eAAA,oEAAAxxC,CAAA,EAAAA,GAAAoN,CAAA,UAAAsI,EAAA1V,GAAA,OAAA0V,EAAA5Y,OAAA4nI,eAAA5nI,OAAAuC,eAAA,SAAAW,GAAA,OAAAA,EAAA8oD,WAAAhsD,OAAAuC,eAAAW,EAAA,EAAA0V,EAAA1V,EAAA,KC5LAkW,EADa,IA3IP,SAAAlW,IAAA,SAAAA,EAAAoN,GAAA,sBAAAA,GAAA,OAAAA,EAAA,UAAAu7C,UAAA,sDAAA3oD,EAAAjD,UAAAD,OAAA8D,OAAAwM,GAAAA,EAAArQ,UAAA,CAAAX,YAAA,CAAA0L,MAAA9H,EAAAo7H,UAAA,EAAAt9C,cAAA,KAAA1wE,GAAA2F,EAAA/S,EAAAoN,EAAA,EAAA9Q,EAAA0D,GAAA,IAAAoN,EAAAzJ,EAAAsJ,GAAAG,EAAA9Q,EAAAqH,EAAA,kCAAA45E,UAAAA,QAAAC,UAAA,YAAAD,QAAAC,UAAAmnD,KAAA,+BAAAC,MAAA,oBAAA9nB,QAAA//G,UAAAF,QAAAK,KAAAqgF,QAAAC,UAAAs/B,QAAA,6BAAA98G,GAAA,4BAAAA,EAAAiN,EAAAyI,EAAAtI,GAAA,GAAAzJ,EAAA,KAAArH,EAAAoZ,EAAA,MAAAtZ,YAAA4D,EAAAu9E,QAAAC,UAAAvwE,EAAA3O,UAAAhC,EAAA,MAAA0D,EAAAiN,EAAAyU,MAAA,KAAApjB,WAAA,OAAAyX,EAAA,KAAA/V,EAAA,GACF,SAAA1D,IAAc,IAAA0D,EAAA,gBAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,2CAAArsD,IACV0D,EAAAiN,EAAA/P,KAAA,OAKKs9I,2CAA6C,GAKlDx6I,EAAKy6I,2CAA6C,GAKlDz6I,EAAK06I,wCAA0C,GAK/C16I,EAAK26I,+BAAiC,GAKtC36I,EAAK46I,4BAA8B,GAKnC56I,EAAK66I,2CAA6C,GAKlD76I,EAAK86I,wCAA0C,GAK/C96I,EAAK+6I,yCAA2C,GAKhD/6I,EAAKg7I,kBAAoB,GAKzBh7I,EAAKi7I,kBAAoB,GAKzBj7I,EAAKk7I,8BAAgC,GAKrCl7I,EAAKm7I,kCAAoC,GAKzCn7I,EAAKo7I,gCAAkC,GAKvCp7I,EAAKq7I,gCAAkC,GAKvCr7I,EAAKs7I,4BAA8B,GAKnCt7I,EAAKu7I,+BAAiC,GAKtCv7I,EAAKw7I,sCAAwC,GAK7Cx7I,EAAKy7I,6BAA+B,GAKpCz7I,EAAK07I,6BAA+B,GAKpC17I,EAAK27I,iCAAmC,GAKxC37I,EAAK47I,+BAAiC,GAMtC57I,EAAK67I,mCAAqC,GAK1C77I,EAAK87I,kCAAoC,GAEzC97I,EAAK+7I,8CAAgD,sBACrD/7I,EAAKg8I,8CAAgD,4BACrDh8I,EAAKi8I,2CAA6C,iCAClDj8I,EAAKk8I,qCAAuC,yBAC5Cl8I,EAAKm8I,mCAAqC,gCAC1Cn8I,EAAKo8I,kCAAoC,yCACzCp8I,EAAKq8I,+BAAiC,+CACtCr8I,EAAKs8I,2CAA6C,kBAClDt8I,EAAKu8I,4CAA8C,gCACnDv8I,EAAKw8I,qBAAuB,uBAC5Bx8I,EAAKy8I,qBAAuB,sCAC5Bz8I,EAAK08I,iCAAmC,qBACxC18I,EAAK28I,qCAAuC,+BAC5C38I,EAAK48I,mCAAqC,6BAC1C58I,EAAK68I,+BAAiC,kBACtC78I,EAAK88I,qCAAuC,0CAtIlC98I,CAuIb,QAAA1D,CAAA,CAGY,CA3IXqH,EAAA,MAAe6sB,IAAAtX,EAAAvV,EAAA,MAAAwS,EAAAxS,EAAA,MCcrB,SAASsS,EAAiBjW,GACtB,IAKIoN,EACAzJ,EACAsJ,EACA3Q,EACAuR,EACAX,EAVEc,EAAUsI,KAAK9V,QACf2D,GAAA,EAAW+U,EAAAsX,GAASxiB,GAASmrH,cAC7B90H,EAAiBrE,EAAO+8I,eACxB34I,EAAWpE,EAAOynI,SASpBnjI,EAAY,GACZR,EAAc,GACdJ,GAAA,EACAoH,EAAc9K,EAAOmxD,YACrBziD,EAAsB,KA8B1B,SAAS2W,EAAWrlB,GAChB,OAAO,IAAIuB,SAAQ,SAAC6L,GAChBiL,GAAkB,WACV/b,EAAOg3D,YACPh3D,EAAOg3D,WAAWtzD,GAEtBoN,GACH,GACJ,GACJ,CA0CD,SAASgJ,EAAmBpW,GAExB,OADA1D,EAAS+H,EAAe24I,oBAAoBh9I,GACrCuB,QAAQyE,SAClB,CAED,SAAS8I,IAEL,GAAuC,mBAA5BxS,EAAO0N,iBACd,IACI1N,EAAO0N,iBAAiB,YAAaiM,GAAA,GACrC3Z,EAAO0N,iBAAiB,QAASiP,GAAA,GACjC3c,EAAO0N,iBAAiB,QAASiP,GAAA,EAKpC,CAHC,MAAOjZ,GAELkN,EAAao4B,YAAYrvB,EAnHlB,GAoHV,MAGD/I,EAAao4B,YAAYrvB,EAvHd,GAyHlB,CAmBD,SAAS9Z,EAAmB6D,GACxB,OAAO,IAAIuB,SAAQ,SAAC6L,GAEX9Q,GAAW6H,EAASiT,MAAMskH,UAAUr6G,OAAO88G,gBAKhD9lH,GAAkB,WACd,IACI,IAAK/b,EAED,YADA8Q,IAIJ,IAAIzJ,EAAkBmH,EAAYkN,SAC9B9b,EAAoB,EACpB8D,IAAUs1B,MAAMt1B,EAAM4Y,SAAW0c,MAAMt1B,EAAMgY,WAAavJ,SAASzO,EAAMgY,YACzErU,EAAkB3D,EAAM4Y,MAAQ5Y,EAAMgY,UAEtChY,IAAUs1B,MAAMt1B,EAAM4Y,SACtB1c,EAAoB8D,EAAM4Y,OAE1Btc,EAAO2gJ,kBAAoBt5I,GAAmBrH,EAAO4gJ,oBAAsBhhJ,IAC3EI,EAAO4gJ,kBAAoB,EAC3B5gJ,EAAO2gJ,gBAAkBt5I,EA7KhB,IA8KTrH,EAAO4gJ,kBAAoBtuI,KAAKgN,IAAI1f,EA/KzB,GA+KyE,GACpF+Q,EAAO2I,MAAP,6BAAAhW,OAA0CiO,EAAU5P,KAApD,mBAAA2B,OAA0EtD,EAAO4gJ,kBAAjF,gBAAAt9I,OAAiHtD,EAAO2gJ,mBAG5H7vI,GAIH,CAHC,MAAOpN,GACLiN,EAAOR,KAAP,+BACAW,GACH,CACJ,IA/BGA,GAgCP,GACJ,CAED,SAAS2F,EAAsB/S,GAC3B,OAAO,IAAIuB,SAAQ,SAAC6L,GAEX9Q,EAKL+b,GAAkB,WACd,IACQ/b,EAAOk3D,kBAAoBxzD,GAAkBs1B,MAAMt1B,KACnD1D,EAAOk3D,gBAAkBxzD,EACzBiN,EAAO2I,MAAP,+BAAAhW,OAA4CI,KAEhDoN,GAGH,CAFC,MAAOpN,GACLoN,GACH,CACJ,IAdGA,GAeP,GACJ,CA0GD,SAAS2I,IACL,IAAIrS,GAIAI,EAAYzH,OAAS,EAAG,CACxBqH,GAAA,EACA,IAAM1D,EAAY8D,EAAY,GAC9BA,EAAY0jB,OAAO,EAAG,GAEtB,IAAMpa,EAAe,WACjB1J,GAAA,EACII,EAAYzH,OAAS,GACrB0Z,EAAmB7Y,KAAKoZ,MAGxBtW,GAAaA,EAAUoG,MAAQpG,EAAUoG,KAAK+2I,aAAen9I,EAAUoG,KAAK+2I,cAAgBhnI,EAAAD,EAAA0rH,0BACrF5hI,EAAUoG,KAAK+f,MAE1BnmB,EAAUo9I,QAAQp3I,QAAQ,CAAEq3I,MAAOr9I,EAAUoG,MAChD,EAED,IACIsI,EAAsB1O,EAAUU,QACQ,IAApCV,EAAUoG,KAAK+f,MAAM5E,WACrBnU,EAAalQ,KAAKoZ,OAEdha,EAAO44D,aACP54D,EAAO44D,aAAal1D,EAAUoG,KAAK+f,OAEnC7pB,EAAO8zD,OAAOpwD,EAAUoG,KAAK+f,MAAOnmB,EAAUoG,MAGlDiS,EAAkBjL,EAAalN,KAAKoW,OAY3C,CAVC,MAAOlJ,GACLH,EAAOgoB,MAAM,+BAAiC7nB,EAAM,KAChDtJ,EAAYzH,OAAS,EACrB0Z,IAEArS,GAAA,SAGG1D,EAAUoG,KAAK+f,MACtBnmB,EAAUo9I,QAAQn3I,OAAO,CAAEo3I,MAAOr9I,EAAUoG,KAAMoF,MAAO,IAAIwD,EAAAwhB,EAAYpjB,EAAI+nB,KAAM/nB,EAAIlB,UAC1F,CACJ,CACJ,CA6BD,SAASwJ,IACDpR,EAAUjI,OAAS,IACdC,EAAOq0D,WACGrsD,EAAUiiB,OAAVjiB,GAGXoR,KAGX,CAED,SAASO,IAED3Z,EAAOq0D,UAKXj7C,GACH,CAED,SAASuD,EAAYjZ,GACjB,IAImBoN,EACfH,EALE3Q,EAAQ0D,EAAEskF,QAAU,CAAC,EAIRl3E,EAHL3J,EAAA+sB,EAAAo2G,oBAIV35H,EAJsC,CAAEzB,MAAAlP,EAAOghJ,oBAAA5uI,IAI7B,CAAC,EACvBtK,EAASuwB,QAAQvnB,EAAWH,EAAS,CAAEqtH,SAAUzsH,EAAU85H,WAAW1vH,GAAIsiH,UAAW52H,GAJxF,CAOD,SAAS0U,EAAkBrY,GACvBsE,EAAUyc,KAAK/gB,GAEV1D,EAAOq0D,UACRj7C,GAEP,CAmBD,OAjBAtI,EAAW,CACPisH,QA1SJ,WACI,OAAO11H,CACV,EAySG45I,mBArMJ,WACI,IACI,OAAOjhJ,EAAOi+B,QAIjB,CAHC,MAAOv6B,GAEL,OADAiN,EAAOzB,MAAM,iCAAmCxL,EAAEkM,SAC3C,IACV,CACJ,EA+LGsxI,UA1MJ,WACI,OAAOlhJ,CACV,EAyMG8zD,OA9LJ,SAAgBpwD,GAAuB,IAAAoN,EAAA,KAAhBzJ,EAAgBrF,UAAAjC,OAAA,YAAAiC,UAAA,GAAAA,UAAA,GAAN,KAC7B,OAAO,IAAIiD,SAAQ,SAAC0L,EAAS3Q,GACpB0D,GAOL8D,EAAYid,KAAK,CAAE3a,KAAMpG,EAAOo9I,QAAS,CAAEp3I,QAAAiH,EAAShH,OAAA3J,GAAUoE,QAAAiD,IAC9D0U,EAAkBtC,EAAmB7V,KAAKkN,KAPtC9Q,EAAO,CACH+gJ,MAAOr9I,EACPwL,MAAO,IAAIwD,EAAAwhB,EAAYta,EAAA8kI,kBAA0B9kI,EAAAsmI,uBAM5D,GACJ,EAmLGvnF,OAhKJ,SAAgBj1D,GACZ,OAAO,IAAIuB,SAAQ,SAAC6L,EAASzJ,GACzB,IAAMsJ,EAAQjN,EAAM4Y,MACd1c,EAAM8D,EAAM8Y,IAGX7L,GAAS,GAAO/Q,EAAM+Q,EAK7BoL,GAAkB,WACd,IACI/b,EAAO24D,OAAOhoD,EAAO/Q,GAErBmc,GAAkB,WACdjL,EAAQ,CACJwS,KAAM3S,EACN2mE,GAAI13E,EACJuhJ,YAAA,IAEAz9I,EAAMgG,SACNhG,EAAMgG,SAEb,GAWJ,CAVC,MAAOoH,GACLzJ,EAAO,CACHic,KAAM3S,EACN2mE,GAAI13E,EACJuhJ,YAAA,EACAjyI,MAAO,IAAIwD,EAAAwhB,EAAYta,EAAA+kI,kBAA0B/kI,EAAAumI,wBAEjDz8I,EAAMiG,QACNjG,EAAMiG,OAAOmH,EAEpB,CACJ,IA7BGA,GA8BP,GACJ,EA2HGhD,MAxEJ,WACI,OAAO,IAAI7I,SAAQ,SAACvB,GAChB,IACI8D,EAAc,GACiB,SAA3BgH,EAAYvC,WACZ8P,GAAkB,WACd,IACQ/b,GACAA,EAAO8N,QAEXpK,GAGH,CAFC,MAAOoN,GACLpN,GACH,CACJ,IACM1D,GAAUA,EAAOohJ,cAA2C,UAA3B5yI,EAAYvC,YACpDjM,EAAO8N,QACPpK,KAEAA,GAIP,CAFC,MAAOoN,GACLpN,GACH,CACJ,GACJ,EAgDGgvC,MAjOJ,WACI,GAAI1yC,EAAQ,CACR,IACIgI,EAAY,GA9ExB,WACI,IAC8C,mBAA/BhI,EAAOsK,sBACdtK,EAAOsK,oBAAoB,YAAaqP,GAAA,GACxC3Z,EAAOsK,oBAAoB,QAASqS,GAAA,GACpC3c,EAAOsK,oBAAoB,QAASqS,GAAA,IAExCysB,cAAcx4B,EAGjB,CAFC,MAAOlN,GACLiN,EAAOzB,MAAMxL,EAChB,CACJ,CAXD,GAgFY0D,GAAA,EACAI,EAAc,GACTxH,EAAO88H,cAA0C,qBAA1B98H,EAAO88H,iBAC/BnsH,EAAO2I,MAAP,2CACA9K,EAAYuoD,mBAAmB/2D,GAItC,CAFC,MAAO0D,GAER,CACD1D,EAAS,IACZ,CACDoS,EAAsB,IACzB,EAiNGivI,sBAAA5qI,EACA6qI,0BApZJ,SAAmC59I,EAAOoN,EAAwBH,GAE9DtJ,GADAkK,EAAY7N,GACK/B,KACjB,IAAM/B,EAAQ2R,EAAU0X,OAgC5B,SAA+BvlB,GAC3B1D,EAAS0D,EAAoBw9I,WAChC,CAFD,CA9B0BvwI,GACtB6B,IAEA,IAAM5B,EAAW,GAajB,OAXAA,EAAS6T,KAsNF,IAAIxf,SAAQ,SAACvB,GAChBqY,GAAkB,WAEd,IAAMjL,EAAoB9Q,EAAO4gJ,kBAC3Bv5I,EAAkBrH,EAAO2gJ,gBAE3B3gJ,IACAA,EAAO8N,QACP9N,EAAO4gJ,kBAAoB9vI,EAC3B9Q,EAAO2gJ,gBAAkBt5I,GAE7B3D,GACH,GACJ,KAlODkN,EAAS6T,KAAK5kB,EAAmB0R,EAAU85H,aAEvCxjI,EAASiT,MAAMskH,UAAUr6G,OAAOi9G,6BAChCpxH,EAAS6T,KAAKsE,EAAWnpB,IAGzBkR,QAAA,IAA0BA,EAAuBywI,eACjD3wI,EAAS6T,KAAKhO,EAAsB3F,EAAuBywI,gBAGxDt8I,QAAQF,IAAI6L,EACtB,EA+XG4wI,sBA9WJ,SAA+B99I,EAAYoN,EAAOH,GAE9CtJ,GADAkK,EAAYT,GACKnP,KACjB,IAAMiP,EAAQW,EAAU0X,MACxB,IAKI,GAAIrY,EAAMgjB,MAAM,+CACZ,OAAO9Z,EAAmBpW,GAG9B1D,EAASwO,EAAY4pD,gBAAgBxnD,GAErC4B,IAEA,IAAMd,EAAW,GAQjB,OANAA,EAAS+S,KAAK5kB,EAAmB0R,EAAU85H,aAEvC16H,QAAA,IAA0BA,EAAuB4wI,eACjD7vI,EAAS+S,KAAKhO,EAAsB9F,EAAuB4wI,gBAGxDt8I,QAAQF,IAAI2M,EAQtB,CANC,MAAOZ,GAEL,OAAKS,EAAU5P,MAAQ/B,EAAAs0B,EAAAmmG,OAAmB9oH,EAAUkwI,eAAqD,IAAnC7wI,EAAMzE,QAAQ,kBAA8D,IAAlCyE,EAAMzE,QAAQ,iBAA0D,IAA/ByE,EAAMzE,QAAQ,YAC5J2N,EAAmBpW,GAEvBuB,QAAQ0E,OAAOmH,EACzB,CACJ,EA6UG4wI,mBAAA7hJ,EACAm3D,WAAAjuC,GA1ZApY,GAAA,EAAS5J,EAAAmtB,GAAMxiB,GAASmrH,cAAcK,UAAUpsH,GA+Z7CA,CACV,CAED6I,EAAiB0jH,sBAAwB,mBACzC,IACA1gH,EADgB9U,EAAAqsB,EAAAyqG,gBAA6BhlH,GChc7C,SAASoC,EAAcrY,GACnB,IAEIoN,EACAzJ,EACAsJ,EAJE3Q,EAAUga,KAAK9V,QAKjBtE,EAAS,GACT2R,EAAa7N,EAgCjB,SAASkN,EAAOlN,EAAOoN,GAEnB,OADAlR,EAASA,EAAOmb,QAAO,SAAA1T,GAAC,SAAO2xB,MAAMloB,IAAQzJ,EAAEiV,MAAQxL,KAASkoB,MAAMt1B,IAAU2D,EAAEmV,IAAM9Y,GAAhE,IACjBuB,QAAQyE,SAClB,CAyFD,OAdAoH,EAAW,CACPmwI,mBArEJ,WAGI,IAFA,IAAIv9I,EAAS,GAEJoN,EAAI,EAAGA,EAAIlR,EAAOG,OAAQ+Q,IAAK,CACpC,IAAIzJ,EAAQzH,EAAOkR,GACG,IAAlBpN,EAAO3D,QAAgBsH,EAAMiV,MAAQ5Y,EAAOA,EAAO3D,OAAS,GAAGyc,IAC/D9Y,EAAO+gB,KAAK,CAACnI,MAAOjV,EAAMiV,MAAOE,IAAKnV,EAAMmV,MAE5C9Y,EAAOA,EAAO3D,OAAS,GAAGyc,IAAMnV,EAAMmV,GAE7C,CAGD,IAAM7L,EAAa,CACf2L,MAAO,SAAUxL,GACb,OAAOpN,EAAOoN,GAAGwL,KACpB,EACDE,IAAK,SAAU1L,GACX,OAAOpN,EAAOoN,GAAG0L,GACpB,GASL,OANAhc,OAAOmC,eAAegO,EAAY,SAAU,CACxCmK,IAAK,WACD,OAAOpX,EAAO3D,MACjB,IAGE4Q,CACV,EAyCGmjD,OApGJ,SAAgBpwD,GAiBZ,MAhB0B,0BAAtBA,EAAMm9I,aACNjhJ,EAAO6kB,KAAK/gB,GACZ9D,EAAO+uC,MAAK,SAAUjrC,EAAGoN,GACrB,OAAOpN,EAAE4Y,MAAQxL,EAAEwL,KACtB,IACD3L,EAAkB,MAElBA,EAAkBjN,EAGtB2D,EAAOiS,MAAM,mCAAqC5V,EAAM4Y,MAAQ,QAAU5Y,EAAM8Y,KAC5EjL,GACAA,EAAW,CACPwvI,MAAOr9I,IAGRuB,QAAQyE,SAClB,EAmFGivD,OAAA/nD,EACA9C,MA5EJ,WACI,OAAO7I,QAAQyE,SAClB,EA2EGi4I,UAzBJ,SAAmBj+I,EAAOoN,GACtB,IAAMzJ,EAWV,SAAqB3D,EAAOoN,GACxB,OAAOlR,EAAOmb,QAAO,SAAA1T,GAAC,OAAM2xB,MAAMloB,IAAQzJ,EAAEiV,MAAQxL,KAASkoB,MAAMt1B,IAAU2D,EAAEmV,IAAM9Y,EAA/D,GACzB,CAFD,CAX+BA,EAAOoN,GAQlC,OAPIH,IACAtJ,EAAOod,KAAK9T,GACZA,EAAkB,MAGtBC,EAAOlN,EAAOoN,GAEPzJ,CACV,EAgBGqrC,MA9GJ,WACI9yC,EAAS,GACT+Q,EAAkB,KAClBY,EAAa,IAChB,EA2GG8vI,sBA5CJ,WACI,OAAOp8I,QAAQyE,SAClB,EA2CGk4I,iBAZJ,SAA0Bl+I,GACtBA,GACH,EAWGw9I,UA1CJ,WACI,OAAOlnI,IACV,GA5EG3S,GAAA,EAASN,EAAAmtB,GAAMl0B,GAAS68H,cAAcK,UAAUpsH,GAyH7CA,CACV,CAEDiL,EAAcshH,sBAAwB,gBACtC,IACAriH,EADgBnT,EAAAqsB,EAAAyqG,gBAA6B5iH,GC3I7C,SAAS5F,IAEL,IAAIzS,EAAO,CAAC,EA6BZ,MANiB,CACbm+I,KAtBJ,SAAe/wI,GACX,IAAMzJ,EAAKyJ,EAAMktH,SACXrtH,EAAmBG,EAAMm8H,iBAE/BvpI,EAAK2D,GAAM3D,EAAK2D,IAAO,CAAC,EACxB3D,EAAK2D,GAAIsJ,GAAoBG,CAChC,EAiBGgxI,QAfJ,SAAkBhxI,EAAUzJ,GACxB,OAAI3D,GAAQA,EAAKoN,IAAapN,EAAKoN,GAAUzJ,GAClC3D,EAAKoN,GAAUzJ,GAEf,IAEd,EAUGqrC,MAPJ,WACIhvC,EAAO,CAAC,CACX,EASJ,CAEDyS,EAAUknH,sBAAwB,YAClC,IAAApiH,EAAepT,EAAAqsB,EAAAopG,oBAAiCnnH,GC1B1C5H,EAAqC,IAGrCvH,EAAyB,mBAE/B,SAAS6V,EAAiBnZ,GAEtBA,EAASA,GAAU,CAAC,EACpB,IAaIoN,EACAzJ,EACAsJ,EACA3Q,EACAuR,EACA1J,EACAC,EACAE,EACAR,EACAJ,EACAoH,EACA4D,EACA2W,EACAjP,EACAja,EACA4W,EACAgD,EACAL,EACAwD,EACAjD,EACAoC,EAjCE5F,EAAU6D,KAAK9V,QACf2Y,GAAA,EAAWnL,EAAAwiB,GAAS/d,GAAS0mH,cAC7B3oG,EAAaxwB,EAAOq+I,WACpBjlI,EAAgBpZ,EAAOs+I,cACvBxkI,EAA2B9Z,EAAOu+I,yBAClCr6I,EAAUlE,EAAOmzG,QACjB1rF,EAAiBznB,EAAO+8I,eACxB/8H,EAAgBhgB,EAAOy0E,cACvBh4D,EAAqBzc,EAAOw+I,mBAC5B7+H,EAAa3f,EAAO2nI,WACpBzrH,EAAOlc,EAAO/B,KACdqiB,EAAWtgB,EAAOo5G,SA+ExB,SAASr5F,EAAe/f,GAAyB,IAAlBoN,EAAkB9O,UAAAjC,OAAA,YAAAiC,UAAA,GAAAA,UAAA,GAAN,KACvC,OAAO,IAAIiD,SAAQ,SAACoC,EAASsJ,GACzB9I,EAAcnE,EAEV8D,GAAoBsJ,GAAmD,mBAA/BtJ,EAAiBm6I,WACzDv6I,EAAkBI,EAClByc,EAAiBnT,GACZ41B,MAAK,WACFr/B,GACH,IAHLs/B,OAIW,SAACjjC,GACJiN,EAAOjN,EACV,KAEL2D,GAEP,GAEJ,CAQD,SAAS0c,EAAuBrgB,GAC5B,OAAOkE,EAAQ0xI,0CAA0C97H,EAAyB2kI,4BAA4Bz+I,GACjH,CAQD,SAASugB,EAAiBvgB,GAAgC,IAArBoN,EAAqB9O,UAAAjC,OAAA,YAAAiC,UAAA,GAAAA,UAAA,GAAJ,GAClD,OAAO,IAAIiD,SAAQ,SAACoC,EAASsJ,GACpByI,GAAc1V,EAIfmE,GACA2G,GAAA,EACA2V,EAA+BzgB,EAAWoN,GACrC41B,MAAK,SAAChjC,GACH2D,EAAQ3D,EACX,IAHLijC,OAIW,SAACjjC,GACJiN,EAAOjN,EACV,MAEL8K,GAAA,EACA0V,IACKwiB,MAAK,SAAChjC,GACH2D,EAAQ3D,EACX,IAHLijC,OAIW,SAACjjC,GACJiN,EAAOjN,EACV,KApBL2D,EAAQ,KAsBf,GACJ,CAED,SAAS6c,IAAiC,IAAAxgB,EAAA,KACtC,OAAO,IAAIuB,SAAQ,SAAC6L,EAASzJ,GACzB,IAAMsJ,EAAkB+S,EAAc0+H,cAAcxiI,EAAMyD,EAAW1H,IACrEnU,EAAmBwT,EAAc7E,GAAS7R,OAAO8f,GAAYxgB,KAAKF,IAClEgkB,GAA4B3D,EAAuBpT,IAC9C+1B,MAAK,WACF51B,EAAQtJ,EACX,IAHLm/B,OAIW,WACHt/B,GACH,GACR,GACJ,CAED,SAAS8c,EAA+BzgB,EAAWoN,GAC/C,OAAO,IAAI7L,SAAQ,SAAC0L,EAAS3Q,GACzB,IAAMuR,EAAkBmS,EAAc0+H,cAAcxiI,EAAMyD,EAAW1H,IACrEnU,EAAmBmV,EAAiBxG,GAAS7R,OAAO,CAChDuwD,YAAAhtD,EACA44I,eAAAt1H,EACAggH,SAAAtuH,IAiBZ,SAAyBnZ,EAAWoN,EAAgBzJ,GAChD,IAAMsJ,EAAyBoT,EAAuB1c,GAEtD,OAAIyJ,GAAkBA,EAAe8O,KAAUA,IAAShgB,EAAAs0B,EAAAi7C,OAAmBvvD,IAAShgB,EAAAs0B,EAAA3B,OACzE/qB,EAAiB85I,0BAA0B59I,EAAWiN,EAAwBG,EAAe8O,IAE7FpY,EAAiBg6I,sBAAsBn+H,EAAY3f,EAAWiN,EAE5E,CARD,CAfwBjN,EAAWoN,EAAgBS,GACtCm1B,MAAK,WACF,OAAOhf,GAA4B3D,EAAuBxS,GAC7D,IACAm1B,MAAK,WACF/1B,EAAQnJ,EACX,IANLm/B,OAOW,SAACjjC,GACJ2D,EAAOsxB,MAAM,wCAA0Cj1B,GACvDwwB,EAAWhlB,MAAM,IAAIwD,EAAAwhB,EAAYta,EAAA4lI,kCAA0C5lI,EAAA4mI,qCAA8C5gI,IACzH5f,EAAO0D,EACV,GACR,GACJ,CAyDD,SAASywB,GAAsBzwB,GACvBsgB,EAASlJ,MAAMskH,UAAUK,oBACzBp4H,EAAOmS,KAAK,2CAA4CoG,EAAO,iBAC/DxG,EAAUyoI,KAAKn+I,EAAEq9I,QAErB15I,EAAOiS,MAAM,uBAAwBsG,EAAM,0BAA2Blc,EAAEq9I,MAAM9T,iBAAkB,gBAAiBvpI,EAAEq9I,MAAMhkC,QAAS,eAAgBr5G,EAAEq9I,MAAMl3H,MAAM5E,YAChKZ,GAAgB3gB,EAAEq9I,MACrB,CA2BD,SAAS3sH,GAAuB1wB,GAC5B2gB,GAAgB3gB,EAAEq9I,MAAOr9I,EAAEU,QAC9B,CAQD,SAASigB,GAAgB3gB,GAAuB,IAAhBoN,EAAgB9O,UAAAjC,OAAA,YAAAiC,UAAA,GAAAA,UAAA,GAAN,KACjCwF,IAGLA,EAAiBssD,OAAOpwD,EAAOoN,GAC1B41B,MAAK,SAAChjC,GACH0gB,GAAY1gB,EACf,IAHLijC,OAIW,SAACjjC,GACJ0gB,GAAY1gB,EACf,IAEDA,EAAMqpI,UAAUprI,OAAS/B,EAAAs0B,EAAAi7C,OACzBnnD,GAAc7gB,EAAA+sB,EAAA42G,qBAA6B,CAAEiW,MAAOr9I,IAE3D,CAED,SAAS2wB,GAAkB3wB,GACvB,GAAIA,GAAUA,EAAO3D,OAAS,EAC1B,IAAK,IAAI+Q,EAAI,EAAGH,EAAMjN,EAAO3D,OAAQ+Q,EAAIH,EAAKG,IAC1CzJ,EAAOiS,MAAM,mBAAqB5V,EAAO4Y,MAAMxL,GAAK,MAAQpN,EAAO8Y,IAAI1L,GAAK,mBAAoBqP,EAAmB3E,UAG9H,CAED,SAAS4I,GAAY1gB,GACjB,GAAIA,EAAEwL,MAcF,OAjVsB,KAqUlBxL,EAAEwL,MAAM2pB,MAqGpB,WAKI,GAJApf,GAAA,EACAlI,EAA+C,GAAzB6V,KACtB/f,EAAO8I,KAAK,oCAAsCoB,GAE9CA,EAAsB,EAAG,CAEzB,IAAM7N,EAAe4O,KAAKgN,IAAI,GAAM/N,EAAqB,GACnDT,EAAcS,EAAsB7N,EACpCiN,EAAyB2B,KAAK+M,IAAI2E,EAASlJ,MAAMskH,UAAUr6G,OAAOw8G,uBAAsC,GAAdzwH,GAC1F9Q,EAAiCsS,KAAK+M,IAAI2E,EAASlJ,MAAMskH,UAAUr6G,OAAOy8G,+BAA8C,GAAd1wH,GAC1GlR,EAAI,CACNw/H,UAAW,CACPr6G,OAAQ,CACJu8G,aAAc9mH,WAAW9W,EAAaogC,QAAQ,IAC9Cy9F,uBAAwB/mH,WAAW7J,EAAuBmzB,QAAQ,IAClE09F,+BAAgChnH,WAAWxa,EAA+B8jC,QAAQ,OAI9F9f,EAASmhB,OAAOvlC,EACnB,CACJ,CAtBD,QA1a8B,KAwUlB8D,EAAEwL,MAAM2pB,MAAuCvR,OAC/CjgB,EAAO8I,KAAK,+DAEZ6X,GAAc7gB,EAAA+sB,EAAA21G,eAAuB,CACjCwY,oBAAqB9wI,EACrB+wI,kBAAmB5+I,EAAEq9I,MAAMzkI,QAE/BiK,GAAaJ,QAMrB,GAAK3e,IAELwe,KAEAvM,GAAA,GACAK,EAAoBpW,EAAEq9I,QAEKjnI,EAAkByoI,aAA7C,CAIIzoI,IAAsBkf,MAAMlf,EAAkBiG,SAC9CjY,EAAmBwK,KAAKgN,IAAIxF,EAAkBiG,MAAOjY,GACrDge,MAGJ,IAAMhV,EAAStJ,EAAiBy5I,qBAC5BnnI,EAAkB+mI,cAAgBhnI,EAAAD,EAAAyrH,qBAClChxG,GAAkBvjB,GAClB4T,KA6BR,WACI,IAAIsU,MAAMjd,KAAevN,EAEzB,GAAIoR,IAAShgB,EAAAs0B,EAAA3B,OAAmB3S,IAAShgB,EAAAs0B,EAAAi7C,MAAzC,CAMA,IAAMzrE,EAAcyc,EAAmB3E,UACjC1K,EAAoBiV,GAAWriB,EAAa,GAC5C2D,EAAoB0e,GAAWhK,EAAY,GACjD,GAAIjL,GAAqBzJ,GAAqByJ,EAAkBwL,QAAUjV,EAAkBiV,MACxFP,EAAas7B,QADjB,CAMA,IAAM1mC,EAAkB6M,EAAyBglI,2BAA2BlL,gBACtEt3I,EAAQ+lB,GAAWhK,EAAYpL,GAChC3Q,IAEDgkB,EAASlJ,MAAMskH,UAAUr6G,OAAOk8G,4BAA8B3uH,KAAKC,IAAI7O,EAAcqY,GAAcpL,EAK/FoL,GAAc/b,EAAMwc,KAEpB2D,EAAmBsoG,KAAKn2G,KAAKgN,IAAIvD,EAAY/b,EAAMsc,QAAA,GAAQ,GAExD5Y,EAAc1D,EAAMsc,OAE3B6D,EAAmBsoG,KAAKzoH,EAAMsc,OAAA,GAAO,GAlBxC,CATA,MAFGP,EAAas7B,GA+BpB,CAnCD,IAzBI,IAAI1mC,GAAA,EACAyB,IACIA,EAAmBjG,QAAQ2N,GAAqB,IAChDnJ,GAAA,GAEJyB,EAAqB,MAGrB0H,IAAsBnJ,GACtBqX,GAAc7gB,EAAA+sB,EAAAw0G,4BAAoC,CAC9C3rB,QAASjjG,EAAkBijG,QAC3BljF,UAAW/f,EAAkBwC,MAC7ByD,MAAOjG,EAAkBiG,MACzB0iI,eAAgB3xI,EAChB+vI,YAAa/mI,EAAkB+mI,YAC/B5iB,UAAWr+G,GA7BlB,CAgCJ,CAoJD,SAAS0E,KACL,OAAO,IAAIrf,SAAQ,SAACvB,EAASoN,GACzB,IAAIzJ,EAASsd,KAEb,IAAKtd,GAA4B,IAAlBA,EAAOtH,OAGlB,OAFA2kB,UACAhhB,IAIJ6iB,GAAalf,GACRq/B,MAAK,WACFhjC,GACH,IAHLijC,OAIW,SAACjjC,GACJoN,EAAOpN,EACV,GACR,GACJ,CAED,SAASihB,GAA6BjhB,GAClC,IAAMoN,EAAc,GACdH,EAASnJ,EAAiBy5I,qBAGhC,IAAKtwI,GAA4B,IAAlBA,EAAO5Q,OAClB,OAAO+Q,EAIX,IAAMpN,GAAyB,IAAbA,GAAmBs1B,MAAMt1B,GACvCoN,EAAY2T,KAAK,CACbnI,MAAO3L,EAAO2L,MAAM,GACpBE,IAAK7L,EAAO6L,IAAI7L,EAAO5Q,OAAS,GArjBnB,SA0jBhB,CAED,IAAMC,EAed,SAAmC0D,EAAYoN,GAC3C,IAAMzJ,EAAqB2c,EAASlJ,MAAMskH,UAAUr6G,OAAOu8G,aACrD3wH,EAAgBG,EAAOwL,MAAM,GAInC,GADmB5Y,EAAaiN,EACftJ,EAAoB,CAEjC,IAAIrH,EAAWsS,KAAKgN,IAAI,EAAG5b,EAAa2D,GAElCzH,EAAqBkd,EAAcqgI,YAAY,CACjD9nG,MAAO7iC,EAAAurI,wBACP5wG,KAAMzpC,EACN6+H,UAAWh0H,IACZ,GAKH,GAHI3O,IACAI,EAAWsS,KAAK+M,IAAIzf,EAAmBi6B,UAAW75B,IAElDA,EAAW,EACX,MAAO,CACHsc,MAAO3L,EACP6L,IAAKxc,EAGhB,CAED,OAAO,IACV,CA5BD,CAf6D0D,EAAUiN,GACzD/Q,EA4Cd,SAAkC8D,EAAYoN,GAI1C,IAAMH,EAAcG,EAAO0L,IAAI1L,EAAO/Q,OAAS,GA7mB1B,GA8mBfC,EAAuBsmB,GAAqC5iB,GAI5D9D,EADoByjB,EAAW23H,aAAat/H,UAAYsI,EAASlJ,MAAMskH,UAAUr6G,OAAO48G,iCAChD39G,EAASlJ,MAAMskH,UAAUr6G,OAAOy8G,+BAAiCx9G,EAASlJ,MAAMskH,UAAUr6G,OAAOw8G,uBAI3IhwH,EAAcynB,MAAMh5B,GAAyF0D,EAAjE4O,KAAK+M,IAAIrf,EAAsB0D,EAAa9D,GAG5F,GAAI2R,GAAcT,EAAO0L,IAAI1L,EAAO/Q,OAAS,GACzC,OAAO,KAIX,IAAM6Q,EAAqBkM,EAAcqgI,YAAY,CACjD9nG,MAAO7iC,EAAAurI,wBACP5wG,KAAMzpC,EACN6+H,UAAWh0H,IACZ,GAQH,GANIqC,IACAW,EAAae,KAAKgN,IAAI1O,EAAmBipB,UAAYjpB,EAAmB8K,SAAUnK,IAIjDyS,EAASlJ,MAAMskH,UAAUr6G,OAAOg9G,6BAEjE,IAAK,IAAIrwH,EAAI,EAAGA,EAAIZ,EAAO/Q,OAAQ2R,IAC/B,GAAIZ,EAAOwL,MAAM5K,IAAMhO,GAAcA,GAAcoN,EAAO0L,IAAI9K,IACvDZ,EAAOwL,MAAM5K,IAAMH,GAAcA,GAAcT,EAAO0L,IAAI9K,GAAI,CACjE,IAAIvK,EAAgBoK,EAEhBA,EADAG,EAAI,EAAIZ,EAAO/Q,OACF+Q,EAAOwL,MAAM5K,EAAI,GAEjBZ,EAAO0L,IAAI9K,GAAK,EAEjCrK,EAAOiS,MAAM,mBAAqBxI,EAAOwL,MAAM5K,GAAK,KAAOZ,EAAO0L,IAAI9K,GAAK,8BAAgChO,EAAa,4BAA8ByD,EAAgB,KAAOwJ,EAAc,aAAeY,EAAa,KAAOZ,EAAc,aAAgBY,EAAaZ,EAAe,GAAK,yBAC7R,KACH,CAIT,OAAIY,EAAaT,EAAO0L,IAAI1L,EAAO/Q,OAAS,GACjC,CACHuc,MAAO/K,EACPiL,IAAK7L,GAGN,IACV,CAxDD,CA5C2DjN,EAAUiN,GAEzD3Q,GACA8Q,EAAY2T,KAAKzkB,GAGjBJ,GACAkR,EAAY2T,KAAK7kB,EAExB,CAED,OAAOkR,CACV,CA2FD,SAAS4T,OACA/K,GAAoBiG,IAAShgB,EAAAs0B,EAAAmmG,MAAkBlvG,EAAeu3H,kBAC/D18H,IAEP,CAED,SAASJ,KACLK,IACH,CAED,SAASpB,KACLoB,KACAlK,EAAas7B,GAChB,CA+BD,SAAStxB,GAAWriB,EAAMoN,GACtB,IAAKtJ,EACD,OAAO,KAEX,IAMIH,EACAsJ,EAPE3Q,EAASwH,EAAiBy5I,qBAC5BrhJ,EAAQ,EACR2R,EAAM,EACNX,EAAa,KACbc,EAAU,KACVvK,EAAM,EAIJU,EAASmxB,MAAMloB,GAAyB,IAAZA,EAElC,GAAI,MAAA9Q,EAAyC,CACzC,IAAK2Q,EAAI,EAAGtJ,EAAMrH,EAAOD,OAAQ4Q,EAAItJ,EAAKsJ,IAGtC,GAFA/Q,EAAQI,EAAOsc,MAAM3L,GACrBY,EAAMvR,EAAOwc,IAAI7L,GACE,OAAfC,EACAzJ,EAAMmL,KAAKC,IAAI3S,EAAQ8D,IACnBA,GAAQ9D,GAAS8D,EAAO6N,GAIjBpK,GAAOU,KAFd+I,EAAahR,EACb8R,EAAUH,OAMX,CAEH,MADApK,EAAMvH,EAAQ8R,IACH7J,GAIP,MAFA6J,EAAUH,CAIjB,CAGL,GAAmB,OAAfX,EACA,MAAO,CACH0L,MAAO1L,EACP4L,IAAK9K,EAGhB,CAED,OAAO,IACV,CAsBD,SAASsU,KACL,GAAI7F,EAAoB,CACpB,IAAIzc,EAAgByc,EAAmB3E,WAAa,EAEhDhN,IACA9K,EAAiBs1B,MAAMjd,GAA2B,EAAbA,GAEzC,IAAMjL,EAAYkT,EAASlJ,MAAMskH,UAAU+C,KAAKC,WAAappG,MAAMhV,EAASlJ,MAAMskH,UAAU+C,KAAKG,eAAiBt+G,EAASlJ,MAAMskH,UAAU+C,KAAKG,cAAgBjrF,IAChKr3C,EAAcsS,KAAKgN,IA5B3B,SAAyB5b,EAAMoN,GAC3B,IAAIzJ,EAgBJ,OAZI2c,EAASlJ,MAAMskH,UAAU+C,KAAKC,WAC9BtxH,EAAYkT,EAASlJ,MAAMskH,UAAU+C,KAAKG,eAKhC,QAFdj7H,EAAQ0e,GAAWriB,EAAMoN,IAGZ,EAEAzJ,EAAMmV,IAAM9Y,CAI5B,CAlBD,CA4B+CA,EAAeoN,GAAY,GAClEkX,GAAc7gB,EAAA+sB,EAAAyuH,qBAA6B,CAAE1kB,UAAWr+G,EAAMgjI,YAAa5iJ,IAC3EimB,IACH,CACJ,CAED,SAASH,KACL,IAAMpiB,EAAoBoE,GAAoBE,EAAe,EAEvD8I,EAAiBqP,EAAmBi7H,mBAAmB/3H,GAAcrjB,EAAc,MACpF0D,IAAqBoN,GAAoBH,IAC1CgW,IAAA,GACAtf,EAAOiS,MAAP,uEAAAhW,OAAoF+f,EAAW1H,GAA/F,cAAArY,OAA8Gsc,IAErH,CAED,SAASqG,KAEDrG,IAAShgB,EAAAs0B,EAAA3B,OAAmB3S,IAAShgB,EAAAs0B,EAAAi7C,UAKlChvD,EAAmBq7H,4BAA8Bx7I,EAAcgkB,EAASlJ,MAAMskH,UAAUr6G,OAAO68G,gBAAmC,IAAhB5hI,KAAuB2Q,EAC5IkV,GAA0BjV,EAAAsjB,EAAAylH,eAEtBhpI,GAAwB3Q,GAAegkB,EAASlJ,MAAMskH,UAAUr6G,OAAO68G,gBAAmBzhH,EAAmBq7H,4BAA8Bx7I,EAAc,IACzJ6lB,GAA0BjV,EAAAsjB,EAAA2uH,eAGrC,CAED,SAASh9H,GAA0BniB,GAC3BqlB,IAAgBrlB,GACfA,IAAUkN,EAAAsjB,EAAAylH,cAAkE,IAAjCx5H,EAAmB3E,WAC9DoE,IAAShgB,EAAAs0B,EAAAmmG,OAAmBlvG,EAAeu3H,kBAIhD35H,EAAcrlB,EAEdskB,GAAc7gB,EAAA+sB,EAAAukH,2BAAmC,CAAEpjG,MAAO3xC,IAC1DskB,GAActkB,IAAUkN,EAAAsjB,EAAA2uH,cAAiC17I,EAAA+sB,EAAA2uH,cAAuB17I,EAAA+sB,EAAAylH,cAChFtyI,EAAOiS,MAAM5V,IAAUkN,EAAAsjB,EAAA2uH,cAAiC,6BAA+B,oDAC1F,CAGD,SAASx8H,KACA7e,GAAoBoY,IAAShgB,EAAAs0B,EAAAmmG,OAI7B1pH,GACD4V,GAAaJ,MAEpB,CAED,SAASA,KACL,IAAMziB,EAAc,GACdoN,EAAStJ,EAAiBy5I,qBAChC,IAAKnwI,GAA4B,IAAlBA,EAAO/Q,OAClB,OAAO2D,EAGX,IAAM2D,EAAc8Y,EAAmB3E,UACnC7K,EAAmB2B,KAAKgN,IAAI,EAAGjY,EAAc2c,EAASlJ,MAAMskH,UAAUr6G,OAAOu8G,cAE3EthI,EAAqB8c,EAAcqgI,YAAY,CACjD9nG,MAAO7iC,EAAAurI,wBACP5wG,KAAM9lC,EACNk7H,UAAWh0H,IACZ,GAGH,GAAIvO,EACA2Q,EAAmB2B,KAAK+M,IAAIrf,EAAmB65B,UAAWlpB,QACvD,GAAoB,IAAhBtJ,GAAqB8Y,EAAmBy7H,eAE/C,MAAO,GAGX,GAAI9qI,EAAOwL,MAAM,IAAM3L,EAAkB,CAKrC,IAJA,IAAM/Q,EAAc,CAChB0c,MAAO,EACPE,IAAK7L,GAEAY,EAAI,EAAGA,EAAIT,EAAO/Q,QAAU+Q,EAAO0L,IAAIjL,IAAMZ,EAAkBY,IACpE3R,EAAY4c,IAAM1L,EAAO0L,IAAIjL,GAE7B3R,EAAY0c,MAAQ1c,EAAY4c,KAChC9Y,EAAY+gB,KAAK7kB,EAExB,CAED,OAAO8D,CACV,CAED,SAAS6iB,GAAa7iB,GAClB,OAAO,IAAIuB,SAAQ,SAAC6L,EAASzJ,GACzB,GAAK3D,GAAW8D,GAAsC,IAAlB9D,EAAO3D,OAA3C,CAKA,IAAM4Q,EAAW,GACjBjN,EAAO0J,SAAQ,SAAC1J,GACZiN,EAAS8T,KAkBrB,SAAmC/gB,GAC/B,OAAO,IAAIuB,SAAQ,SAAC6L,EAASzJ,GACzB3D,EAAMgG,QAAUoH,EAChBpN,EAAMiG,OAAStC,EACfuV,EAAqB6H,KAAK/gB,EAC7B,GACJ,CAND,CAlBoDA,GAC3C,IAGI+S,GACD2P,KAGJnhB,QAAQF,IAAI4L,GACP+1B,MAAK,WACF51B,GACH,IAHL61B,OAIW,SAACjjC,GACJ2D,EAAO3D,EACV,GAlBJ,MAFGoN,GAqBP,GACJ,CAUD,SAASsV,KACL,IAEI,GAAoC,IAAhCxJ,EAAqB7c,SAAiByH,EAItC,OAHAH,EAAOiS,MAAM,kCACbsD,EAAuB,QACvBnG,GAAA,GAIJ,IAAM/S,EAAe8D,EAAiB05I,YAEtC,IAAKx9I,IAAiBA,EAAau6B,UAA6C,IAAjCv6B,EAAau6B,SAASl+B,OAIjE,OAHAsH,EAAOiS,MAAM,2DACbsD,EAAuB,QACvBnG,GAAA,GAIJ,IAAM3F,EAAQ8L,EAAqBqN,QACnC5iB,EAAOiS,MAAP,GAAAhW,OAAgBsc,EAAhB,4BAAAtc,OAA+CwN,EAAMwL,MAArD,QAAAhZ,OAAiEwN,EAAM0L,MACvE/F,GAAA,EAGoB0J,EAAmB3E,UACrB1K,EAAM0L,KACpBmK,IAAA,GAGJnf,EAAiBmxD,OAAO7nD,GACnB41B,MAAK,SAAChjC,GACHwiB,GAAWxiB,EACd,IAHLijC,OAIW,SAACjjC,GACJwiB,GAAWxiB,EACd,GAGR,CAFC,MAAOA,GACL+S,GAAA,CACH,CACJ,CAED,SAASyP,GAAWxiB,GAChB2D,EAAOiS,MAAM,yBAA0B5V,EAAE4f,KAAM,KAAM5f,EAAE4zE,IAElD9vE,IAKL6sB,GADe7sB,EAAiBy5I,sBAGI,IAAhCrkI,EAAqB7c,SACrB0W,GAAA,EACAuP,MAGAtiB,EAAEy9I,aACF95I,EAAO8I,KAAK,oCAAqCzM,EAAE4f,KAAM,KAAM5f,EAAE4zE,GAAI,kCAAmC5zE,EAAE4f,MAC1G0E,GAAc7gB,EAAA+sB,EAAAg3G,YAAoB,CAAE/9F,KAAMzpC,EAAE4f,QAG5C7M,EACA2P,MAEKzM,EAGDA,GAAA,EAFAqM,KAIJgC,GAAc7gB,EAAA+sB,EAAAu0G,eAAuB,CACjCnlH,KAAM5f,EAAE4f,KACRg0D,GAAI5zE,EAAE4zE,GACN6pE,WAAYz9I,EAAEy9I,WACd2B,uBAAwBx7H,KACxBy7H,cAAetpI,KAG1B,CAED,SAASiO,GAA4BhkB,GACjC,OAAO,IAAIuB,SAAQ,SAAC6L,GACXpN,QAAA,IAAsBA,EAAmB69I,eAAgC/5I,GAAqBA,EAAiB65I,sBAMpH75I,EAAiB65I,sBAAsB39I,EAAmB69I,eACrD76G,MAAK,WACF51B,GACH,IAHL61B,OAIW,WACH71B,GACH,IAXDA,GAYP,GAEJ,CAED,SAAS2V,KACL,OAAIjf,IAAqBmJ,EACdnJ,EAAiBk6I,mBAAmBr+H,GAExCpe,QAAQyE,SAClB,CASD,SAASgd,OACL7mB,GAC2CmkB,EAASlJ,MAAMskH,UAAUE,4BAA8B,MAC3Et7G,EAASlJ,MAAMskH,UAAUr6G,OAAOs8G,wBACnDxhI,EAAkB,EAClBwmB,KAEP,CAED,SAASY,KACLhB,IACH,CAkBD,SAASU,GAAwBjjB,IAC7BiN,EAAuBjN,GAGnBskB,GAAc7gB,EAAA+sB,EAAAs0G,qBAEdxgI,EAAekK,OAAO2oB,iBAE7B,CAMD,SAASzT,KACL,IACI,IAEI1jB,EACAoN,EAHEzJ,EAASG,EAAiBy5I,qBAC5BtwI,EAAoB,EAIxB,IAAKtJ,EAAQ,OAAOsJ,EAEpB,IAAKG,EAAI,EAAGpN,EAAK2D,EAAOtH,OAAQ+Q,EAAIpN,EAAIoN,IACpCH,GAAqBtJ,EAAOmV,IAAI1L,GAAKzJ,EAAOiV,MAAMxL,GAGtD,OAAOH,CAGV,CAFC,MAAOjN,GACL,OAAO,CACV,CACJ,CAOD,SAAS4iB,GAAqC5iB,GAC1C,IACI,IAAIoN,EAAepN,EACb2D,EAASG,EAAiBy5I,qBAEhC,IAAK55I,GAA4B,IAAlBA,EAAOtH,OAClB,OAAOs3C,IAKX,IAFA,IAAI1mC,EAAI,EAEDG,IAAiBpN,GAAciN,EAAItJ,EAAOtH,QAAQ,CACrD,IAAMC,EAAQqH,EAAOiV,MAAM3L,GACrB/Q,EAAMyH,EAAOmV,IAAI7L,GAEnBG,GAAgB9Q,GAAS8Q,GAAgBlR,IACzCkR,EAAelR,GAGnB+Q,GAAK,CACR,CAED,OAAOG,IAAiBpN,EAAa2zC,IAAMvmC,CAI9C,CAFC,MAAOpN,GAER,CACJ,CAED,SAAS4jB,KACL,IAAM5jB,EAAoB0jB,KAC1B,OAAQ4R,MAAMt1B,IAAsBA,EAAoB6N,CAC3D,CAMD,SAASyW,GAActkB,EAAWoN,GAC9B,IAAIzJ,EAAUyJ,GAAQ,CAAC,EACvB+L,EAASwb,QAAQ30B,EAAW2D,EAAS,CAAE22H,SAAU36G,EAAW1H,GAAIsiH,UAAWr+G,GAC9E,CAED,SAAS2H,GAAqB7jB,EAASoN,GAenC,GAdAS,EAAsBW,OAAO2oB,kBAC7B9R,OAAA,EACA/gB,EAAekK,OAAO2oB,kBACtB/yB,EAAmB,EACnBgS,EAAoB,KACpBnJ,GAAA,EACA8F,GAAA,EACAgD,GAAA,EACAzZ,EAAc,EACdH,EAAkB,EAClB+c,EAAuB,GACvBb,EAAas7B,IACb7oC,GAAA,EAEIhH,EAAkB,CAClB,IAAIH,EAA6BG,EACjCA,EAAmB,KACd9D,GAAYoN,GACbzJ,EAA2ByG,QACtB44B,MAAK,WACFr/B,EAA2BqrC,MAAM5hC,GACjCzJ,EAA6B,IAChC,GAEZ,CAEDsS,GAAA,CACH,CAmDD,OAlCA7I,EAAW,CACPi9H,WAxnCJ,SAAoBrqI,GAChB+f,EAAe/f,GAEfmZ,EAASiZ,GAAG3uB,EAAA+sB,EAAAg1G,qBAA6B/0G,GAAuBrjB,GAChE+L,EAASiZ,GAAG3uB,EAAA+sB,EAAAy1G,sBAA8Bv1G,GAAwBtjB,GAClE+L,EAASiZ,GAAG3uB,EAAA+sB,EAAA62G,uBAA+BrkH,GAAyB5V,GAEpE+L,EAASiZ,GAAG/tB,EAAAmsB,EAAA6lH,iBAAoCl1H,GAAoB/T,GACpE+L,EAASiZ,GAAG/tB,EAAAmsB,EAAAomH,kBAAqC51H,GAAwB5T,GACzE+L,EAASiZ,GAAG/tB,EAAAmsB,EAAAkmH,sBAAyC11H,GAAwB5T,GAC7E+L,EAASiZ,GAAG/tB,EAAAmsB,EAAAqmH,sBAAyCtzH,GAAwBnW,GAC7E+L,EAASiZ,GAAG/tB,EAAAmsB,EAAA2mH,iBAAoCj1H,GAAoB9U,EACvE,EA6mCGitH,YAvmCJ,WACI,OAAO16G,EAAW1H,EACrB,EAsmCGohH,QAhmCJ,WACI,OAAOn9G,CACV,EA+lCGojI,wBAzlCJ,WACI,OAAOh8I,CACV,EAwlCGi8I,iBAAAh/H,EACAi/H,mBAn+BJ,WACI,GAAI17I,GAAoBJ,GAAwD,mBAA9BA,EAAgBu6I,UAA0B,CACxF,IAAMj+I,EAAS0D,EAAgB65I,qBAE/B,GAAIv9I,EAAO3D,OAAS,EAAG,CAEnB,IADA,IAAI+Q,EAAW,aAAe8O,EAAO,0CAC5BjP,EAAI,EAAGA,EAAIjN,EAAO3D,OAAQ4Q,IAC/BG,GAAY,WAAapN,EAAO4Y,MAAM3L,GAAK,UAAYjN,EAAO8Y,IAAI7L,GAAK,IAE3EtJ,EAAOiS,MAAMxI,EAChB,MACGzJ,EAAOiS,MAAM,qFAIjBlH,EAAqB,GAGrB,IAFA,IAAIpS,EAASoH,EAAgBu6I,YACzB/hJ,EAAW,KACN2R,EAAI,EAAGA,EAAIvR,EAAOD,OAAQwR,IAAK,CACpC,IAAMX,EAAQ5Q,EAAOuR,GACrB,GAAIX,EAAMiwI,cAAgBhnI,EAAAD,EAAA0rH,kBAA+B,CACrD,IAAM5zH,EAAY0H,EAAU0oI,QAAQlxI,EAAMotH,SAAUptH,EAAMq8H,kBACtDv7H,GACI9R,IAAa8R,IACbU,EAAmBqS,KAAK/S,GACxBlK,EAAiBssD,OAAOpiD,GACxB9R,EAAW8R,EAGtB,CACDU,EAAmBqS,KAAK7T,GACxBpJ,EAAiBssD,OAAOljD,EAC3B,CAEDxJ,EAAgBsrC,QAChBtrC,EAAkB,IACrB,CACJ,EA+7BG85I,UArJJ,WACI,OAAO15I,CACV,EAoJG6zI,eAlJJ,WACI,OAAOr7I,CACV,EAiJGmjJ,WAAAp9H,GACAq9H,gBAtgBJ,SAAyB1/I,GACrB,IACI,IAAMoN,EAAStJ,EAAiBy5I,qBAEhC,IAAKnwI,GAA4B,IAAlBA,EAAO/Q,OAClB,OAAO,EAKX,IAFA,IAAI4Q,EAAI,EAEDA,EAAIG,EAAO/Q,QAAQ,CACtB,IAAMC,EAAQ8Q,EAAOwL,MAAM3L,GACrB/Q,EAAMkR,EAAO0L,IAAI7L,GAEvB,GAAIjN,GAAQ1D,GAAS0D,GAAQ9D,EACzB,OAAO,EAGX+Q,GAAK,CACR,CAED,OAAO,CAKV,CAHC,MAAOjN,GAEL,OADA2D,EAAO6H,MAAMxL,IAAA,CAEhB,CACJ,EA4eG2/I,YAAAh9H,GACAi9H,eAAA7/H,EACAu7D,eAnJJ,WACI,OAAOn3E,CACV,EAkJG07I,2BAh7BJ,SAAoC7/I,GAEhC,IAAMoN,EAAQsI,EAAU0oI,QAAQz+H,EAAW1H,GAAIjY,GAE/C,QAAKoN,IAMLzJ,EAAOmS,KAAK,uBAAwBoG,EAAM,0BAA2B9O,EAAMm8H,iBAAkB,gBAAiBn8H,EAAMisG,QAAS,eAAgBjsG,EAAM+Y,MAAM5E,YACzJZ,GAAgBvT,IAAA,EAGnB,EAm6BG0yI,wBAjJJ,WACI,OAAO7yI,CACV,EAgJG8yI,wBAAA98H,GACA+8H,uBArIJ,WACI,OAAOjtI,CACV,EAoIGi8B,MAjCJ,SAAehvC,EAASoN,GACpB+L,EAASuZ,IAAIjvB,EAAA+sB,EAAAg1G,qBAA6B/0G,GAAuBna,MACjE6C,EAASuZ,IAAIjvB,EAAA+sB,EAAAy1G,sBAA8Bv1G,GAAwBpa,MACnE6C,EAASuZ,IAAIjvB,EAAA+sB,EAAA62G,uBAA+BrkH,GAAyB1M,MAErE6C,EAASuZ,IAAIruB,EAAAmsB,EAAA6lH,iBAAoCl1H,GAAoB7K,MACrE6C,EAASuZ,IAAIruB,EAAAmsB,EAAAomH,kBAAqC51H,GAAwB1K,MAC1E6C,EAASuZ,IAAIruB,EAAAmsB,EAAAkmH,sBAAyC11H,GAAwB1K,MAC9E6C,EAASuZ,IAAIruB,EAAAmsB,EAAAqmH,sBAAyCtzH,GAAwBjN,MAC9E6C,EAASuZ,IAAIruB,EAAAmsB,EAAA2mH,iBAAoCj1H,GAAoB5L,MAGrEuN,GAAqB7jB,EAASoN,EACjC,EAqBG6yI,uBA3vBJ,WAMI,OALIhzI,GACAgW,IAAA,GAIGnf,EAAiBsG,OAC3B,EAqvBG81I,iCAnvBJ,SAA0ClgJ,GACtC,OAAO,IAAIuB,SAAQ,SAAC6L,EAASzJ,GACzBG,EAAiBsG,QACZ44B,MAAK,WACF,OAAOjgB,IACV,IACAigB,MAAK,WACF,OAAI1iB,EAASlJ,MAAMskH,UAAUr6G,OAAOi9G,4BACzBx6H,EAAiBwvD,WAAWtzD,GAGhCuB,QAAQyE,SAClB,IACAg9B,MAAK,WACF,OAAOpiB,IACV,IACAoiB,MAAK,WACF/f,IAAA,GACA7V,GACH,IAjBL61B,OAkBW,SAACjjC,GACJ2D,EAAO3D,EACV,GACR,GACJ,EA4tBGmgJ,oCAnsBJ,SAA6CngJ,GACzC,OAAO,IAAIuB,SAAQ,SAAC6L,EAASzJ,GACzBof,KACKigB,MAAK,WACF,OAAI1iB,EAASlJ,MAAMskH,UAAUr6G,OAAOi9G,4BACzBx6H,EAAiBwvD,WAAWtzD,GAGhCuB,QAAQyE,SAClB,IACAg9B,MAAK,WACF51B,GACH,IAVL61B,OAWW,SAACjjC,GACJ2D,EAAO3D,EACV,GACR,GACJ,EAmrBGogJ,wCA3tBJ,SAAiDpgJ,GAC7C,OAAO,IAAIuB,SAAQ,SAAC6L,EAASzJ,GACzBG,EAAiBsG,QACZ44B,MAAK,WACF,OAAOjgB,IACV,IACAigB,MAAK,WACF,OAAOpiB,IACV,IACAoiB,MAAK,WAEF,OAAOhf,GAA4BhkB,EACtC,IACAgjC,MAAK,WACF/f,IAAA,GACA7V,GACH,IAdL61B,OAeW,SAACjjC,GACJ2D,EAAO3D,EACV,GACR,GACJ,EAusBGg+I,mBAAAj7H,GACAs9H,6BAAAp/H,GACAq/H,qCAAA19H,GACA29H,aAAA19H,GACA29H,eAAA5/H,GACA6/H,4BAAAz8H,GACA08H,cAnFJ,SAAuB1gJ,GACnBqY,EAAarY,CAChB,EAkFG2gJ,2BAhMJ,SAAoC3gJ,GAC3Bs1B,MAAMt1B,KACPsE,EAAetE,EACfoiB,KAEP,GAp+BGze,GAAA,EAASN,EAAAmtB,GAAM/d,GAAS0mH,cAAcK,UAAUpsH,GAChDsI,EAAY6B,EAAU9E,GAAS0mH,cAE/Bt1G,KAgqCGzW,CACV,CAED+L,EAAiBwgH,sBAAwBr2H,EACzC,IAAAktB,EAAersB,EAAAqsB,EAAAyqG,gBAA6B9hH,GC5tCtCC,EAAyB,oCAE/B,SAASU,EAAkC9Z,GAEvCA,EAASA,GAAU,CAAC,EACpB,IAQIoN,EACAzJ,EACAsJ,EACA3Q,EACAJ,EACA2R,EAbEX,EAAUoJ,KAAK9V,QACf2D,GAAA,EAAW6J,EAAAwiB,GAAStjB,GAASisH,cAE7B91H,EAAiBrD,EAAO+8I,eACxB14I,EAAarE,EAAOq+I,WACpBj6I,EAAapE,EAAO2nI,WACpBrjI,EAAOtE,EAAO/B,KA2DpB,SAAS6F,EAAe9D,GACpB1D,EAAc0D,CACjB,CAqBD,SAAS0D,EAAwB1D,GA0FjC,IAAsBoN,EACdH,EA1FAtJ,IAAyB3D,IAI7B2D,EAAuB3D,KAqFLoN,EAlFD3J,EAAA+sB,EAAAs0G,oBAmFb73H,EAAkB,CAAC,EACvB9I,EAASwwB,QAAQvnB,EAAWH,EAAS,CAAEqtH,SAAUl2H,EAAW6T,GAAIsiH,UAAWj2H,IAlF9E,CAiBD,SAASwG,EAAsB9K,GACtBA,EAAEq9I,MAAMl3H,QAASxiB,IAEtBkK,EAAUswI,KAAKn+I,EAAEq9I,OAEjBnhJ,EAAiBk0D,OAAOpwD,EAAEq9I,OAE1B35I,GAAA,GACH,CA6FD,OAjCA0J,EAAW,CACPi9H,WA3JJ,SAAoBrqI,GAChB8D,EAAe9D,EAClB,EA0JGq6H,YApIJ,WACI,OAAOj2H,EAAW6T,EACrB,EAmIGohH,QAjIJ,WACI,OAAO/0H,CACV,EAgIGg7I,wBAlKJ,WACI,OAAOlmI,CACV,EAiKGmmI,iBA3JJ,SAA0Bv/I,GACtB,OAAO,IAAIuB,SAAQ,SAAC6L,EAASzJ,GACzB,KACIzH,EAAmB+c,EAAiB/L,GAAStM,OAAO,CAAEuwD,YAAA70D,EAAaygJ,eAAA15I,EAAgBokI,SAAAtjI,KAClE25I,sBAAsB15I,EAAYpE,GAC9CiN,IACG/Q,EAAiBshJ,aAAkE,mBAA5CthJ,EAAiBshJ,YAAYnT,YACpEnuI,EAAiBshJ,YAAYnT,aAEjCp9H,GAAA,GAEJG,EAAQlR,EAIX,CAHC,MAAO8D,GACLqE,EAAWmH,MAAM,IAAIwD,EAAAwhB,EAAYta,EAAA4lI,kCAA0C5lI,EAAA4mI,qCAA8Cx4I,IACzHX,EAAO3D,EACV,CACJ,GAEJ,EA0IGw/I,mBAhHJ,WACC,EAgHGhC,UAjIJ,WACI,OAAOthJ,CACV,EAgIGy7I,eA/GJ,WACI,OAAO,CACV,EA8GG8H,WAnEJ,WACI,OAAO,IACV,EAkEGE,YAhDJ,WAEC,EA+CGD,gBAjEJ,WACI,OAAO,CACV,EAgEGW,6BA9DJ,WACI,MAAO,EACV,EA6DGC,qCA3DJ,WACI,OAAO9xI,OAAO2oB,iBACjB,EA0DGyoH,eAAA97I,EACAw3E,eAjIJ,WACI,OAAOh/E,CACV,EAgIGujJ,2BAzFJ,SAAoC7/I,GAEhC,OAA8D,OAAvD6N,EAAUuwI,QAAQh6I,EAAW6T,GAAIjY,EAC3C,EAuFG8/I,wBApHJ,WACI,OAAOn8I,CACV,EAmHGo8I,wBAAAr8I,EACAs8I,uBAjIJ,WACI,OAAO,CACV,EAgIGhxG,MAvGJ,SAAehvC,GACXmE,EAASuuB,IAAIjvB,EAAA+sB,EAAAg1G,qBAA6B16H,EAAuBsC,IAE5DpN,GAAW9D,IACZA,EAAiBkO,QACjBlO,EAAiB8yC,QACjB9yC,EAAmB,KAE1B,EAgGGqkJ,aA/DJ,WACI,OAAOh/I,QAAQyE,SAClB,EA8DGi6I,uBApDJ,WACI,OAAO1+I,QAAQyE,SAClB,EAmDGk6I,iCAjDJ,WAEI,OADAv8I,GAAA,EACOpC,QAAQyE,SAClB,EA+CG06I,cAzCJ,WAEC,EAwCG1C,mBA9CJ,WACI,OAAOz8I,QAAQyE,SAClB,EA6CGw6I,eAnCJ,WACI,OAAOj/I,QAAQyE,SAClB,EAkCGy6I,4BA7DJ,WACI,OAAOl/I,QAAQyE,SAClB,EA4DG26I,2BAzCJ,WAEC,GA5JG1zI,GAAA,EACA3Q,EAAc,KACdqH,GAAA,EAEAkK,EAAY0J,EAAUrK,GAASisH,cAE/Bh1H,EAASiuB,GAAG3uB,EAAA+sB,EAAAg1G,qBAA6B16H,EAAuBsC,GAkM7DA,CACV,CAED0M,EAAkC6/G,sBAAwBvgH,EAC1D,IAAAlV,EAAeC,EAAAqsB,EAAAyqG,gBAA6BnhH,GChO5C,SAAS2N,EAAmBznB,GAExBA,EAASA,GAAU,CAAC,EACpB,IAaIoN,EACAzJ,EACAsJ,EACA3Q,EACAuR,EACA1J,EACAC,EACAE,EACAR,EACAJ,EACAoH,EACA4D,EACA2W,EAzBEjP,EAAUE,KAAK9V,QACfwO,GAAA,EAAWhB,EAAAwiB,GAASpa,GAAS+iH,cAC7Bh9H,EAAc6D,EAAOs0I,YACrBvhI,EAAmB/S,EAAO4gJ,iBAC1B7qI,EAAgB/V,EAAOs+I,cACvB5oI,EAAgB1V,EAAOy0E,cACvBv+D,EAAqBlW,EAAOw+I,mBAC5BtlI,EAAiBlZ,EAAO+8I,eACxB5mI,EAAOnW,EAAO/B,KACdgY,EAAmBjW,EAAO00E,iBAC1Bz7D,EAA2BjZ,EAAOu+I,yBAClClmI,EAAWrY,EAAOo5G,SAiCxB,SAAS9hG,IACL5I,GAAA,CACH,CAED,SAAS+D,IACL/D,GAAA,CACH,CAUD,SAAS6I,EAAmBvX,GAGxB,IAAIiW,EAAiB6pI,0BAArB,CAIAj1I,IACA,IAAMuC,EAAgBkoB,MAAMt1B,GAAiB,EAARA,EACrC6N,EAAkBnF,WAAWpF,EAAU8J,EAJtC,CAKJ,CAED,SAASvC,IACDgD,IACAiyB,aAAajyB,GACbA,EAAkB,KAEzB,CAkBD,SAASvK,IACL,IAEI,GAgER,WACI,IACI,OAAU6S,IAASja,EAAAs0B,EAAAmmG,OAAoBz9G,EAAe8lI,iBACjD9oI,EAAmBk/H,cAAgBl/H,EAAmBiiI,sBAAsB0I,uBAAyB3qI,EAAmBiiI,sBAAsB2I,iBAAmBzoI,EAASjB,MAAMskH,UAAUiE,WAAWG,mBAG7M,CAFC,MAAO9/H,GACL,OAAO,CACV,CACJ,CAPD,GA9DY,YADA6K,IAIJ,GAyER,WACI,IACI,QAAK6D,GAG6BuK,EAAyB8nI,iCACtBzrH,MAAMxxB,IAA2BJ,IAtGpE1D,EAAW2D,EAAWsU,GACtB7K,EAAqBsI,EAAcsrI,sBAAsB7qI,EAAMnW,MAEjEs1B,MAAMhxB,IAAoBA,GAAmB8I,IAC7CH,EAAO6I,KAAK,eAAiBK,EAAO,2BAA6B7R,EAAkB,OAAS8I,GAC5F9I,EAAkB8I,EACX,MA2Gf,WACI,IAAMpN,EAA4BiZ,EAAyB8nI,+BAC3D,OAAK5qI,IAASnW,GAGM7D,EAAY8kJ,sBAAsB9qI,GACjCgD,GACxB,CAPD,GARK,CAFC,MAAOnZ,GACL,OAAO,CACV,CA1GL,IACUA,EACAoN,CAyGT,CAVD,GAzE0C,CAC9B,IAAIpN,GAAA,EACAqlB,IAGArlB,EAAgB0V,EAAcwrI,qBAAqB/qI,EAAMxS,EAAWsU,KAEnEjY,IAiBP1D,EAA4B2c,EAAyB8nI,+BAGvDj2I,GAAuBxO,EAA0B+8G,UAAYv1G,GAA0BJ,GACnFA,GACAuJ,EAAO2I,MAAM,oBAAsBO,EAAO,yBAA2B7Z,EAA0B2b,IAC/FvU,GAAA,GAEAuJ,EAAO2I,MAAM,gEAAkEtZ,EAA0B2b,IAE7GjJ,EAAS2lB,QAAQlxB,EAAA+sB,EAAAi1G,qBACb,CAAE8D,iBAAkBjtI,EAA0B2b,GAAIohI,OAAQjsI,GAC1D,CAAEktH,SAAU32H,EAAWsU,GAAIsiH,UAAWpkH,IAE1CkP,GAAA,EACAva,GAAA,IAKAmC,EAAO2I,MAAP,4BAAAhW,OAAyCuW,EAAzC,mBAAAvW,OAA+D+D,EAAWsU,KAC1EjJ,EAAS2lB,QAAQlxB,EAAA+sB,EAAA01G,sBACb,CAAC,EACD,CAAE5L,SAAU32H,EAAWsU,GAAIsiH,UAAWpkH,IAE1CkP,GAAA,GAtCC,MACG9N,EAAmBrB,EAAmB4hI,2BAA6Bz/H,EAASjB,MAAMskH,UAAUiE,WAAWE,kBAAoBxnH,EAASjB,MAAMskH,UAAUiE,WAAWC,eAItK,CAFC,MAAO5/H,GACLuX,EAAmBrB,EAAmB4hI,2BAA6Bz/H,EAASjB,MAAMskH,UAAUiE,WAAWE,kBAAoBxnH,EAASjB,MAAMskH,UAAUiE,WAAWC,eAClK,CAOL,IACUtjI,CAPT,CAsFD,SAAS6c,IACL,IAAInZ,EAAe2zC,IACbvmC,EAA4B6L,EAAyB8nI,+BAE3D,OAAK5qI,GAAS/I,GAKVpN,EADAmW,IAASja,EAAAs0B,EAAAmmG,KAgBjB,WACI,IACI,GAAIz9G,EAAe8lI,gBAAiB,CAChC,IAAMh/I,EAA4BiZ,EAAyB8nI,+BAC3D,GAAIzrH,MAAMt1B,EAA0BmhJ,kBAAmB,CAGnD,IAAM/zI,EAAiBjR,EAAYilJ,yBAAyBl0I,EAAAsjB,EAAA6wH,iBAC5D,OAAOj0I,EAAiBA,EAAe4K,SAAW,CACrD,CACG,OAAOhY,EAA0BmhJ,gBAExC,CACG,OAAO,CAId,CAFC,MAAOnhJ,GACL,OAAO,CACV,CACJ,CAlBD,GAdemW,IAASja,EAAAs0B,EAAA3B,OAAmB1qB,EAuC3C,WACI,IACI,IAAMnE,EAAmB7D,EAAY8kJ,sBAAsB/kJ,EAAAs0B,EAAAi7C,OACrDr+D,EAA4B6L,EAAyB8nI,+BAK3D,OAAIzrH,MAAMloB,EAA0B+zI,kBACzBnhJ,EAAmB,EAEnB4O,KAAKgN,IAAI5b,EAAmB,EAAGoN,EAA0B+zI,iBAIvE,CAFC,MAAOnhJ,GACL,OAAO,CACV,CACJ,CAhBD,GAuBA,WACI,IACI,IACMA,EAD4BiZ,EAAyB8nI,+BACd1X,UAAU1B,WACvD,OAAIjyH,EAAc4rI,sBAAsBthJ,GACVA,EAAWs3I,aAAat/H,UAAYK,EAASjB,MAAMskH,UAAUr6G,OAAO48G,iCACnE5lH,EAASjB,MAAMskH,UAAUr6G,OAAOy8G,+BAAiCzlH,EAASjB,MAAMskH,UAAUr6G,OAAOw8G,uBAErH9qH,EAAiBwuI,qBAI/B,CAFC,MAAOvhJ,GACL,OAAO+S,EAAiBwuI,qBAC3B,CACJ,CAbD,GAxDWvhJ,GAXIA,CAYd,CA8ED,SAASwwB,IACLpX,GAAA,EACH,CAED,SAASA,EAAuBpZ,GAC5B,GAAIkW,GAAsBH,EAAe,CACrC,IAAM3I,EAAO2I,EAAc0jI,YAAY,CACnC9nG,MAAO7iC,EAAAurI,wBACP5wG,KAAMvzB,EAAmB4B,UACzB+mH,UAAW,IACZ,GAECzxH,GAAQ8I,EAAmB4B,WAAa1K,EAAK+oB,cACvC/xB,EAAoBilI,WAAcj8H,EAAKi8H,UAAUprI,OAASmG,EAAoBilI,UAAUprI,MAAQmP,EAAKi8H,UAAUhtH,QAAUjY,EAAoBilI,UAAUhtH,QAAWrc,GACpKgP,EAAS2lB,QAAQlxB,EAAA+sB,EAAAgxH,sBAA8B,CAC3CjnB,UAAWpkH,EACXsrI,aAAcr9I,EAAoBilI,UAClCqY,aAAct0I,EAAKi8H,UACnB/O,SAAU32H,EAAWsU,KAGxB7K,EAAKisG,UAAYj1G,EAAoBi1G,SAAWjsG,EAAKk8H,kBAAoBllI,EAAoBklI,kBAAoBtpI,IAClHiN,EAAO2I,MAAP,wCAAAhW,OAAqD+D,EAAWsU,GAAhE,cAAArY,OAA+EuW,IAC/EnH,EAAS2lB,QAAQlxB,EAAA+sB,EAAAmxH,wBAAgC,CAC7CpnB,UAAWpkH,EACXyrI,WAAYx9I,EAAoBi1G,QAChCwoC,WAAYz0I,EAAKisG,QACjBihB,SAAU32H,EAAWsU,MAG7B7T,EAAsB,CAClBilI,UAAWj8H,EAAKi8H,UAChBhwB,QAASjsG,EAAKisG,QACdiwB,gBAAiBl8H,EAAKk8H,iBAGjC,CACJ,CAGD,SAASxvH,IACL/D,EAAc0F,gBACd5Q,GACH,CAED,SAAS3G,IACAmU,EAASjB,MAAMskH,UAAUiE,WAAWG,qBACrCvoH,GAEP,CAED,SAASkQ,EAAuBznB,GAC5B7D,EAAY2lJ,2BAA2B,CAAEC,cAAe/hJ,EAAE65B,aAAa78B,YAC1E,CAsBD,SAASgjB,IACLqF,GAAA,EACA/oB,EAAkB,EAClBwH,EAAyB6vC,IACzBvvC,EAAsB,CAClBilI,eAAA,EACAhwB,QAAS1lE,IACT21F,gBAAiB31F,KAErBrvC,EAAkBqvC,IAClBjwC,GAAA,EACAoH,GAAA,EACA4D,GAAA,CACH,CAwCD,OApBAtB,EAAW,CACPi9H,WAzXJ,SAAoBrqI,GAChBmE,EAAgBnE,EAEhBgP,EAASojB,GAAG3uB,EAAA+sB,EAAA22G,sBAA8BrtH,EAAwB1M,GAClE4B,EAASojB,GAAG/tB,EAAAmsB,EAAA0lH,iBAAoChyI,EAAoBkJ,GACpE4B,EAASojB,GAAG/tB,EAAAmsB,EAAAqmH,sBAAyCpvH,EAAwBra,GAC7E4B,EAASojB,GAAG/tB,EAAAmsB,EAAAkmH,sBAAyClmH,EAAwBpjB,GAC7E4B,EAASojB,GAAG/tB,EAAAmsB,EAAAwxH,qCAAwD1qI,EAAqClK,GACzG4B,EAASojB,GAAG/tB,EAAAmsB,EAAAyxH,mCAAsDxvI,EAAmCrF,EACxG,EAiXGisH,QAvWJ,WACI,OAAOljH,CACV,EAsWGkkH,YApWJ,WACI,OAAO12H,EAAWsU,EACrB,EAmWGiqI,mBAzDJ,SAA4BliJ,GACxB1D,EAAkB0D,CACrB,EAwDGmiJ,mBAtDJ,WACI,OAAO7lJ,CACV,EAqDG8lJ,eA1HJ,SAAwBpiJ,GACpB0D,EAAc1D,CACjB,EAyHGqiJ,eAvHJ,WACI,OAAO3+I,CACV,EAsHG4+I,mBAAA/qI,EACAgrI,mBAAA13I,EACAmkC,MA5BJ,WACIhgC,EAAS0jB,IAAIjvB,EAAA+sB,EAAA22G,sBAA8BrtH,EAAwB1M,GACnE4B,EAAS0jB,IAAIruB,EAAAmsB,EAAA0lH,iBAAoChyI,EAAoBkJ,GACrE4B,EAAS0jB,IAAIruB,EAAAmsB,EAAAqmH,sBAAyCpvH,EAAwBra,GAC9E4B,EAAS0jB,IAAIruB,EAAAmsB,EAAAkmH,sBAAyClmH,EAAwBpjB,GAC9E4B,EAAS0jB,IAAIruB,EAAAmsB,EAAAwxH,qCAAwD1qI,EAAqClK,GAC1G4B,EAAS0jB,IAAIruB,EAAAmsB,EAAAyxH,mCAAsDxvI,EAAmCrF,GAEtGvC,IACAuO,GAAA,GACA4G,IACArc,EAAa,IAChB,EAiBG6+I,gBAAArpI,EACAspI,sBAhBJ,WACI,OAAOvsI,CACV,EAeGwsI,wBA1DJ,SAAiC1iJ,GAC7BqlB,EAAuBrlB,CAC1B,EAyDG2iJ,uBAvDJ,SAAgC3iJ,GAC5B8K,EAAsB9K,CACzB,EAsDG4iJ,0BApDJ,SAAmC5iJ,GAC/B8D,EAAyB9D,CAC5B,GA1VGiN,GAAA,EAAS5J,EAAAmtB,GAAMpa,GAAS+iH,cAAcK,UAAUpsH,GAChD4S,IACArc,EAAa3D,EAAO2nI,WA+YjBv6H,CACV,CAEDqa,EAAmBkyG,sBAAwB,qBAC3C,IAAA35G,EAAe7b,EAAAqsB,EAAAyqG,gBAA6BxzG,GAAAhL,EAAA9Y,EAAA,MCxb5C,SAASgc,EAAyB3f,GAG9B,IAaIoN,EACAzJ,EACAsJ,EACA3Q,EACAuR,EACAX,EAlBEc,GADNhO,EAASA,GAAU,CAAC,GACIynI,SAClBhkI,EAASzD,EAAOs2G,OAChBnyG,EAAgBnE,EAAOy0E,cACvBpxE,EAAcrD,EAAOs0I,YACrBlwI,EAAqBpE,EAAOw+I,mBAC5Bl6I,EAAoBtE,EAAO6nI,kBAC3B/jI,EAAO9D,EAAO/B,KACdyF,EAAa1D,EAAO2nI,WACpB78H,EAAgB9K,EAAO+yI,cACvBrkI,EAAqB1O,EAAO4nI,mBAC5BviH,EAAYrlB,EAAO01I,UACnBt/H,EAAUpW,EAAOmzG,QAmBvB,SAASrkG,IACL,OAAOhL,CACV,CAYD,SAASkL,IACL,OAAO/B,CACV,CAED,SAAS9Q,IACL,OAAO+Q,CACV,CAMD,SAAS6F,IACLpP,EAAiB,KACjBsJ,GAAA,EACA3Q,EAA6B,GAC7BuR,EAA4B,IAC/B,CA0CD,SAASkI,EAAsB/V,GAC3B,OAAO,IAAIuB,SAAQ,SAAC6L,EAASzJ,GACzB,IAAMsJ,EAAoBjN,EAAW6iJ,oBAC/B3mJ,EAAc8D,EAAW8iJ,cAIzBj1I,EAAW,GAEjBA,EAASkT,KAAKrS,EAAmBwkI,eAAelzI,EAAYiN,IAC5DY,EAASkT,KAAKrS,EAAmB0kI,kBAAkBpzI,EAAY9D,IAE/DqF,QAAQF,IAAIwM,GACPm1B,MAAK,SAACr/B,GAiBnB,IAAsCsJ,EAhBlBtJ,EAAK,KAAOA,EAAK,GAAG6H,QACpBxL,EAmBpB,SAAuBA,EAAgBoN,GACnC,OAAKA,IAAKA,EAAE5B,OAAU4B,EAAE86H,eAGjB96H,EAAE86H,eAFEloI,CAGd,CALD,CAnB+CA,EAAY2D,EAAK,KAE5CA,EAAK,KAAOA,EAAK,GAAG6H,QACpBxL,EAuBpB,SAA2BA,EAAgBoN,GACvC,GAAKA,IAAKA,EAAE5B,MAAZ,CAEA,IAII7H,EACAsJ,EACA3Q,EACAJ,EAPE2R,EAAYT,EAAE6lI,SACd/lI,EAAW,GACbc,EAAQ,EAOZ,IAAKrK,EAAI,EAAGsJ,EAAMY,EAAYA,EAAUxR,OAAS,EAAGsH,EAAIsJ,EAAKtJ,IACzDrH,EAAIuR,EAAUlK,IAEdzH,GAAA,EAAMugB,EAAAs3H,IACFzvI,EACA+gB,EACArlB,EACA1D,EAAE65B,UACF75B,EAAE0b,SACF1b,EAAEqoB,UACFroB,EAAEk7B,MACFl7B,EAAEwsI,WACF96H,MAGAd,EAAS6T,KAAK7kB,GACdA,EAAM,KACN8R,KAQR,OAJId,EAAS7Q,OAAS,IAClB2D,EAAeizI,SAAW/lI,GAGvBlN,CApCkB,CAqC5B,CAtCD,CAvBmDA,EAAY2D,EAAK,MAY9BsJ,EAVOjN,GAW1BuqI,yBAA2B77H,EAAmB4kI,4BAA4BrmI,GAoG7F,SAAkCjN,GAC9B,GAAKgP,IAAL,CAEA,IAEI5B,EAlC6BzJ,EAgC7BsJ,EAAqB5J,EAAY0/I,2BACjC7mJ,GAAA,EAKJ,GAAI+Q,EAAoB,CACpB,IAAK,IAAIY,EAAI,EAAGA,EAAIZ,EAAmB+1I,mBAAmB3mJ,OAAQwR,IAE9D,IADAT,EAAUH,EAAmB+1I,mBAAmBn1I,IACpCwO,QAAUrc,EAAEqc,OAASjP,EAAQmtH,YAAczrH,IAAW,CAC9D5S,GAAA,EACA,KACH,CAGAA,GACDmH,EAAY4/I,oCAAoCjjJ,EAAG8O,IAE1D,CAED,GAhDJ,WACI,IAAK,IAAI9O,EAAI,EAAGoN,EAAK9Q,EAA2BD,OAAQ2D,EAAIoN,EAAIpN,IAAK,CACjE,IAAI2D,EAAkBrH,EAA2B0D,GAAGwpI,gBACpD,IAAKltI,EAA2B0D,GAAG6iJ,sBAC7Bl/I,IAAoBmH,EAAcmgI,cAAgBtnI,IAAoBmH,EAAckgI,YAAc1uI,EAA2B0D,GAAGizI,SAElI,OAAO,CAEd,CAED,OAAO,CACV,CAXD,GAgDuC,CAC/B9uI,EAAc++I,mBAAmBp/I,EAAMJ,GArDVC,EAqDkDuJ,EApD5E5Q,EAA2BmM,QAAQ9E,KAqDtC,IAAMqK,EAAU3K,EAAYoxI,kBAAkB3wI,GAC1CkK,GACA3K,EAAY8/I,yBAAyB,CAAEvnE,QAAS5tE,EAAQw7B,MAAM1wB,IAAM1U,EAAmB0T,YAG/EzU,EAAY+/I,+BAA+BjnJ,IAA2BgsI,WAAWlqI,OAGzFyX,IAEJwD,GACH,CAnCwB,CAoC5B,CArCD,CA9GyClZ,GACzBoN,GACH,IAXL61B,OAYW,SAACjjC,GACJ2D,EAAO3D,EACV,GACR,GACJ,CAqDD,SAAS0V,KAtJT,WACI,KAAKvR,GAAkBd,GAAgBe,GAAuBE,GAC1D,MAAM,IAAIkJ,MAAMtR,EAAAs0B,EAAA+iH,qBAEvB,CAJD,GAwJI,IAAMvzI,EAAM,IAAI6X,KACVzK,EAAwBjR,IACxBwH,EAAoD,IAA/BS,EAAmB0T,UAC1C1K,GACA/J,EAAYggJ,wBAAwBj2I,EAAsB+6H,WAAWlqI,KAAM+B,EAAK2D,EAAoByJ,EAAsB6K,IAG9HjK,EAAS2mB,QAAQtwB,EAAAmsB,EAAAskH,sBAAyC,CACtDva,UAAWz2H,EACXw2H,SAAU52H,EAAWuU,GACrB49H,sBAAAzoI,EACAk2I,wBAAyBhnJ,EAA2BD,QACrD,CAAEi+H,SAAU52H,EAAWuU,GAAIsiH,UAAWz2H,GAC5C,CAED,SAASoS,EAA4BlW,GACjC,OAAO,MAAAA,GAA6CA,GAAW1D,EAA2BD,OAAS,KAAOC,EAA2B0D,EACxI,CAmBD,SAASkZ,EAAclZ,GACnBiN,GAAA,EACAe,EAAS2mB,QAAQlxB,EAAO4hI,sBACpB,CACIj/H,KAAMzC,EACNkyI,sBAAuB3oI,EACvB1B,MAAOxL,GAEX,CAAEs6H,SAAU52H,EAAWuU,GAAIsiH,UAAWz2H,GAE7C,CA+CD,SAASqS,EAA4BnW,GACjCkN,EAA0BlN,EAC1B6N,EAA4BuI,EAAQw/H,0CAA0C1oI,EACjF,CAED,SAAS+I,EAA0BjW,GAC/B,GAAIA,EAAEujJ,YAAa,CACf,IAAMn2I,EAAiBjR,IACnBiR,GAAkBA,EAAe+6H,WAAWC,SAC7Bh7H,EAAe+6H,WAAWC,OAClCpwH,SAAWhY,EAAEujJ,YAE3B,CACJ,CAgBD,OAdAn2I,EAAW,CACPitH,YA7QJ,WACI,OAAO32H,EAAWuU,EACrB,EA4QGohH,QAAAvqH,EACA00I,QAjQJ,WACI,OAAO7/I,CACV,EAgQG8/I,WAAAz0I,EACA+oH,WAtOJ,SAAoB/3H,EAAmBoN,EAA0BS,EAAMX,EAAcc,GACjF,OAAO,IAAIzM,SAAQ,SAACkC,EAASU,GAOzB,GANA8I,GAAA,EACA3Q,EAA6B8Q,EAC7BzJ,EAAiB3D,EAEjBmW,EADYD,EAA4BlI,IAGpCH,IAAS3R,EAAAs0B,EAAAi7C,OAAmB59D,IAAS3R,EAAAs0B,EAAA3B,QAAoBhhB,IAAS3R,EAAAs0B,EAAAmmG,OAAmBzpH,GAGrF,OAFAgM,SACAzV,IAKJ,IADA,IAAMJ,EAAW,GACRgB,EAAI,EAAGD,EAAK9H,EAA2BD,OAAQgI,EAAID,EAAIC,IAAK,CACjE,IAAMC,EAAahI,EAA2B+H,GAC9ChB,EAAS0d,KAAKhL,EAAsBzR,GACvC,CAED/C,QAAQF,IAAIgC,GACP2/B,MAAK,WAGF7sB,EADYD,EAA4BlI,IAExCvK,GACH,IANLw/B,OAOW,SAACjjC,GACJmE,EAAOnE,EACV,GACR,GAEJ,EAuMG8+I,yBAAA3iJ,EACA4kJ,6BAzPJ,WACI,OAAOlzI,CACV,EAwPG4wI,4BAAAvoI,EACAwtI,qBA9BJ,SAA8B1jJ,GAE1BmW,EADeD,EAA4BlW,IAE3C0V,GACH,EA2BGs5B,MAjPJ,WACIhhC,EAAS0kB,IAAIruB,EAAAmsB,EAAAmzH,0BAA6C1tI,EAA2B7I,GAErF2F,GACH,GA9CGA,IAEA/E,EAASokB,GAAG/tB,EAAAmsB,EAAAmzH,0BAA6C1tI,EAA2B7I,GA6RjFA,CACV,CAEDuS,EAAyBg6G,sBAAwB,2BACjD,IAAAz9G,EAAe/X,EAAAqsB,EAAAyqG,gBAA6Bt7G,GAAAW,EAAA3c,EAAA,MAAAoc,EAAApc,EAAA,MAAA0c,EAAA1c,EAAA,MAAA4c,EAAA5c,EAAA,eAAA6c,EAAAxgB,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,yCC5TtCloC,EAIF,SAAAzgB,IAAcwgB,EAAA,KAAAxgB,GAMVsW,KAAKsC,MAAQ,KAKbtC,KAAKstI,OAAS,KASdttI,KAAKutI,UAAY,KAMjBvtI,KAAKX,MAAQ,EAChB,EAIL8K,EAASqjI,6BAA+B,kBACxCrjI,EAASsjI,kBAAoB,OAC7BtjI,EAASujI,+BAAiC,SAC1CvjI,EAASwjI,gCAAkC,+BAMrCxzH,GAIF,SAAAzwB,IAAcwgB,EAAA,KAAAxgB,GAMVsW,KAAK4tI,iBAAmB,KAQxB5tI,KAAK6tI,YAAc,KAMnB7tI,KAAKsC,MAAQ,KAMbtC,KAAKstI,OAAS,KAMdttI,KAAK0B,SAAW,KAMhB1B,KAAKyrI,cAAgB,KAcrBzrI,KAAK8tI,WAAa,IACrB,EAGL3zH,GAAc4zH,kCAAoC,wBAClD5zH,GAAc6zH,mBAAqB,cACnC7zH,GAAc8zH,yBAA2B,eACzC9zH,GAAc+zH,0BAA4B,gBAC1C/zH,GAAcg0H,2BAA6B,iBAC3Ch0H,GAAci0H,+BAAiC,yBAC/Cj0H,GAAck0H,oBAAsB,cAAAj0H,GAAA/sB,EAAA,MC1GpC,SAASgd,KAoBL,MAJW,CACPikI,SANJ,SAAkB5kJ,GACd,IAAMoN,EAAQ,IAAIyK,KAAKA,KAAKgtI,IAAI,KAAM,EAAG,EAAG,EAAG,EAAG,IAClD,OAAO,IAAIhtI,KAAKzK,EAAM0K,UAAY9X,GAAc8X,SACjD,EAON,CAED6I,GAAUg5G,sBAAwB,YAClC,IAAAhpG,GAAexsB,EAAAqsB,EAAAopG,oBAAiCj5G,ICPhD,SAASD,GAAgB1gB,GAErBA,EAASA,GAAU,CAAC,EACpB,IAqBIoN,EACAzJ,EACAsJ,EACA3Q,EACA6H,EACAC,EACAE,EACAR,EACAJ,EACAoH,EACA4D,EACA2W,EACAjP,EACAja,EACA4W,EAnCAgD,EAAUO,KAAK9V,QACfkV,GAAA,EAAW1H,EAAAwiB,GAASza,GAASojH,cAE7BjgH,EAAalZ,EAAO2nI,WACpB1xH,EAAOjW,EAAO/B,KACdgb,EAAajZ,EAAOq+I,WACpBhmI,EAAWrY,EAAOg1D,SAClB19C,EAAoBtX,EAAO6nI,kBAC3Bp1H,EAAUzS,EAAOmzG,QACjB57F,EAAgBvX,EAAO8kJ,cACvBj6I,EAAmB7K,EAAO4gJ,iBAC1Bt9I,EAAgBtD,EAAOs+I,cACvBnlI,EAAgBnZ,EAAOy0E,cACvBr7D,EAAqBpZ,EAAOw+I,mBAC5B1kI,EAAkB9Z,EAAO+kJ,gBACzBt9H,EAAiBznB,EAAO+8I,eACxBtgI,EAAczc,EAAOs0I,YACrB30H,EAAW3f,EAAOo5G,SAClB54F,EAAYxgB,EAAOglJ,UACnBvkI,EAA6BzgB,EAAOilJ,2BA2HxC,SAAStkI,KACL,OAAOzH,EAAWjB,EACrB,CAED,SAASyI,KACL,OAAOzK,CACV,CAED,SAAS2K,KACL,OAAOnO,EAAQyyI,eAAephJ,EAAyB0/I,UAC1D,CAED,SAASviI,KACL9c,EAAe,GACf7H,EAAY,KACZH,EAAgB,EAChBuH,GAAA,EACAoH,GAAA,EACA4D,GAAA,EACAqE,EAAoC,IACvC,CAmID,SAASiO,GAA4BhhB,GACjC,OAAQs1B,MAAMt1B,KAA0Bs1B,MAAMpc,EAAWlB,WAAavJ,SAASyK,EAAWlB,WAAahY,GAAwBkZ,EAAWN,MAAQM,EAAWlB,QAChK,CAqCD,SAASkK,GAAsBliB,GAAiC,IAA9BoN,IAA8B9O,UAAAjC,OAAA,YAAAiC,UAAA,KAAAA,UAAA,GAE5D,GAAK0B,EAAEq5I,OAEP,GAAIjgI,EAAmB4+H,gCACnBz1H,UAIJ,KAAI3B,MAAqB6G,EAAeu3H,kBAEpC56I,GAAoBpE,EAAEupI,mBACjBnlI,EAAiBy7I,2BAA2B7/I,EAAEupI,kBAAmB,CAClE,IAAM5lI,EAAMG,EAAyBg7I,2BAErC,GAAkB,IAAdn7I,EAAI6lC,MAEJ,YADAroB,KAIJ,IAAMlU,EAAUoY,EAAcA,EAAYukH,eAAettI,EAAWqH,GAAO,KACvEsJ,EACA3J,EAAcy2I,eAAe9sI,GACtBG,IACP9I,EAAmBq+I,wBAAA,GACnBpgI,KAEP,CAER,CAQD,SAASpB,GAAuBnhB,GAAiC,IAA9BoN,IAA8B9O,UAAAjC,OAAA,YAAAiC,UAAA,KAAAA,UAAA,GAE7D,GAAI8a,EAAmB4+H,iCAAmC5zI,EAAiB47I,yBACvEz9H,SADJ,CAKA,IAAI5e,EAAUye,KACVze,GACAD,GAAA,EACAoH,GAAA,EACAuX,GAAuB1e,IAEvB2e,GAAyBlV,EAR5B,CAUJ,CAOD,SAASiV,GAAuBriB,GACvBs1B,MAAMt1B,EAAQm2B,UAAYn2B,EAAQgY,YACnC7b,EAAgB6D,EAAQm2B,UAAYn2B,EAAQgY,UAEhDhY,EAAQmlJ,kBAAmB,IAAIttI,MAAOC,UAAYxT,EAAmB69I,qBACrE79I,EAAmB49I,mBAAmB,GAsE1C,SAA8BliJ,GAC1B,IAAIoN,EAAepN,EAAQoC,IAM3B,OAJIpC,EAAQwpC,QACRp8B,EAAeA,EAAaxN,OAAO,IAAKI,EAAQwpC,QAG7C/oB,EAA2ByzE,SAAS9mF,EAC9C,CARD,CArE8BpN,IAItB2D,EAAO8I,KAAP,wBAAA7M,OAAoCI,EAAQoC,IAA5C,mBAAAxC,OAAiEsZ,EAAWjB,GAA5E,oBAAArY,OAAiGqW,EAAjG,+CACAsM,OAJA5e,EAAOiS,MAAP,2CAAAhW,OAAwDsZ,EAAWjB,GAAnE,oBAAArY,OAAwFqW,EAAxF,QAAArW,OAAmGI,EAAQoC,MAC3GkB,EAAcy2I,eAAe/5I,GAKpC,CAOD,SAASsiB,GAAyBtiB,GAC9B,IAMQoN,EANFlR,EAAiB4H,EAAyBg7I,2BAKhD,IAAIn/H,EAASvI,MAAMskH,UAAU+C,KAAKK,gBAAkBp7H,GAAoE,IAAjC0V,EAAmBtB,YAEjG7K,EAEMA,GAAa/Q,EAAestI,kBAAoB37H,EAAA2iB,EAAAo6G,mBAEvDx9H,EAAeiY,EAAY+kH,8BAA8BjuI,EAAeG,EAAWJ,EAAgByjB,EAASvI,MAAMskH,UAAU+C,KAAKI,YAHjIzxH,EAAeiY,EAAY+kH,8BAA8BjuI,EAAeG,EAAWJ,EAAgByjB,EAASvI,MAAMskH,UAAU+C,KAAKI,WAKhIvpG,MAAMloB,IAAiBA,IAAiBjR,GARjD,CA4BA,GAD+BkpB,EAAYilH,uBAAuBpuI,EAAgBC,GACtD,CACxB,IAAM+Q,EAAemY,EAAYskH,kBAQjC,OAPAhmI,EAAOiS,MAAP,iCAAAhW,OAA8CsZ,EAAWjB,GAAzD,kBACAvC,EAASif,QAAQlxB,EAAA+sB,EAAAu2G,4BAAoC,CAAEqe,aAAAl4I,GAAgB,CACnEotH,SAAUphH,EAAWjB,GACrBsiH,UAAWtkH,IAEf7R,EAAiBu8I,2BAA2BzzI,QAC5C5I,EAAmBi+I,oBAEtB,CAEGviJ,GACAuiB,IAjBH,MAfWnJ,EAAmBi8H,aAAgD,IAAjCj8H,EAAmBtB,WAErDnU,EAAO8I,KAAP,2BAAA7M,OAAuCwN,EAAvC,gDAAAxN,OAAkGwN,EAAejR,IACjHid,EAAmB2rG,KAAK33G,GAAA,GAAc,KAGtCzJ,EAAO8I,KAAP,4BAAA7M,OAAwCwN,EAAxC,uDAAAxN,OAA0GwN,EAAejR,IACzHioB,GAAyBhX,GAErBpN,GACAuiB,KAwBnB,CAqBD,SAASH,KACL,IACIpiB,EADEoN,EAAqBkX,KAG3B,GAAIgR,MAAMn5B,IAAmBukB,OAAcxkB,EAAAs0B,EAAAmmG,OAAmBlvG,EAAeu3H,gBACzE,OAAO,KAGX,GAAI35H,EAAa,CACb,IAAM1hB,EAAiBG,GAA4BsJ,EAAqBtJ,EAAyB26I,4BAA4BrxI,EAAmBisG,SAAW,KAGvJr5G,EADA0D,EACU2hB,EAAY6kH,yBAAyB5tI,EAAWqH,EAAgBxH,GACnE2O,EACGua,EAAYylH,qBAAqBxuI,EAAWqH,GAE5C0hB,EAAY2kH,sBAAsB1tI,EAAWqH,EAE9D,CAED,OAAO3D,CACV,CAMD,SAASuiB,KACLje,EAAmBg+I,mBAAmBlpI,EAAmB0+H,2BAA6Bn4H,EAASvI,MAAMskH,UAAUiE,WAAWE,kBAAoBlgH,EAASvI,MAAMskH,UAAUiE,WAAWC,eACrL,CAED,SAASz9G,GAAuBniB,GACvBA,EAAEwL,OACEpH,EAAiB07I,2BAClB17I,EAAiBq8I,4BAA4BzgJ,EAAE61I,sBAG1D,CAED,SAASlzH,GAA2B3iB,GAChCyc,EAAY4oI,eAAepvI,EAAMjW,EAAE2xC,MAAOrtC,EAAmBk+I,mBACzDxiJ,EAAE2xC,QAAUzkC,EAAAsjB,EAAAylH,cAAkC78H,EAAmBi8H,cACjE1xI,EAAOmS,KAAK,8BACZ2G,EAAY6oI,yBAAyB,IAAIztI,KAAQ4Y,GAAc6zH,oBAEtE,CAED,SAAS7hI,GAAiBziB,GAEtBsD,EAAcw2I,sCACV11I,EAAiBo5I,YAAYD,qBAC7BrkI,EAAWlB,UAGXhY,EAAEq/I,eAAiBr/I,EAAE4f,KAAOxG,EAAmBtB,WAC/CsM,GAAyBpkB,EAAE4f,MAI3B5f,EAAEo/I,wBAA0Bp/I,EAAEq/I,eAC9B/6I,EAAmBg+I,oBAE1B,CAQD,SAASz/H,GAAqB7iB,GAC1B,GAAKA,GAAMA,EAAEs9I,qBAAwBt9I,EAAEs9I,oBAAoBl7I,IAA3D,CAIA,IAAIgL,EAAepN,EAAEs9I,oBAAoBl7I,IAErCpC,EAAEs9I,oBAAoB9zG,QACtBp8B,EAAeA,EAAaxN,OAAO,IAAKI,EAAEs9I,oBAAoB9zG,QAElE7lC,EAAO8I,KAAP,iCAAA7M,OAA6CwN,IAC7CqT,EAA2Bk8D,IAAIvvE,EAR9B,CASJ,CAED,SAASsV,GAAiB1iB,GAItB,GAHA2D,EAAOiS,MAAP,sBAAAhW,OAAmCI,EAAEu6H,UAArC,mBAAA36H,OAAgEI,EAAEs6H,WAG9Dt6H,EAAEm9I,cAAgBhnI,EAAAD,EAAA0rH,kBAA+B,CACjD,IAAMx0H,EAAyBpN,EAAEq5G,QACjC/0G,EAAmBs+I,0BAA0Bx1I,GAC7CzJ,EAAOmS,KAAK,IAAMG,EAAN,kDAAsEjW,EAAEq5G,QACvF,CAEGtmG,EACAyP,GAAgCzP,GAEhCzO,EAAmBg+I,mBAAmB,EAE7C,CAqID,SAAS9/H,GAAgCxiB,GAGrC,IAAMoN,EAAkB9J,EAAcm2I,YAAY,CAAE9nG,MAAO7iC,EAAAsrI,yBAC3D,GAAIhtI,GAAmBA,EAAgB/Q,OAAS,EAG5C,OAFAsH,EAAOiS,MAAM,yHACb7C,EAAoC/S,GAIxCoE,EAAiBq8I,4BAA4BzgJ,GACxCgjC,MAAK,WACF1+B,EAAmBo+I,yBAAA,GACfpmJ,EAAUipJ,kBAAoBjpJ,EAAUkpJ,oBACxClhJ,EAAmBg+I,qBAEnBp+H,KAEJnR,EAAoC,KACpCrE,GAAA,CACH,IAVLu0B,OAWW,WACHlwB,EAAoC,KACpCrE,GAAA,CACH,GACR,CAMD,SAASsV,GAA4BhkB,GACjC2D,EAAOmS,KAAK,uCAAyC9V,EAAEU,QAAQ0B,IAAM,qBAGhEgX,EAAmBi8H,aAAgB/wI,EAAmB+9I,kBAAqB3zI,IAC5E/K,EAAOmS,KAAK,uCAAyC9V,EAAEU,QAAQ0B,IAAM,mFAGjEpC,EAAEU,SAAWV,EAAEU,QAAQ+kJ,0BACvBnhJ,EAAmBq+I,wBAAA,GAKnBv+H,GAAyBpkB,EAAEU,QAAQy1B,UAAan2B,EAAEU,QAAQsX,SAAW,GAIzE1T,EAAmBg+I,mBAAmB,GAE7C,CAMD,SAASv/H,GAA4B/iB,GACjC2D,EAAOmS,KAAK,4CAA8CoD,EAAWjB,GAAK,mBAAqBhC,EAAO,UAAWjW,EAAEU,QAAUV,EAAEU,QAAQ0B,IAAM,YAAapC,EAAEU,QAAQ8oC,MAAQ,WAAaxpC,EAAEU,QAAQ8oC,MAAQ,IAEvM5oB,MACAtc,EAAmBg+I,mBAAmB,GAGtCtiJ,EAAEwL,OAASxL,EAAEU,QAAQsnI,iBAS7B,SAAqChoI,GACjC2D,EAAOmS,KAAP,4CAEK9V,GAAMA,EAAEU,SAAYV,EAAEU,QAAQzC,OAQ/B+B,EAAEU,QAAQzC,OAASkY,EAAAD,EAAA0rH,kBACnB1/G,GAAsB,CAClBqnH,iBAAkBvpI,EAAEU,QAAQ6oI,iBAC5B8P,OAAQ,CAAC,OAKRr5I,EAAEU,QAAQzC,OAASkY,EAAAD,EAAAyrH,qBACxBv9G,GAAyBpkB,EAAEU,QAAQy1B,UAAan2B,EAAEU,QAAQsX,SAAW,GACrEmJ,GAAuB,CAAC,GAAG,IAElC,CAvBD,CARoCnhB,EAEnC,CAmCD,SAASgjB,KACLoB,GAAyBhL,EAAmBtB,WAC5C8L,KAAwB0+H,oBAC3B,CAOD,SAAS/+H,GAAwBvjB,GAC7B,IAAMoN,EAAmBpN,EAAE0lJ,iBAE3B,GAAKt4I,EAAL,CAIA,IAAMzJ,EAAQQ,EAAawsE,MAAK,SAAC3wE,GAC7B,OAAOA,EAAKqc,QAAUjP,EAAiBiP,OAASrc,EAAKwvB,OAASpiB,EAAiBoiB,IAClF,IAEG7rB,GACAif,GAAgBjf,GACXq/B,MAAK,WACF5+B,EAAiB27I,yBAAA,GACjB37H,GAAyBhL,EAAmBtB,WAC5CxT,EAAmBq+I,wBAAA,GACnBr+I,EAAmBg+I,oBACtB,GAbR,CAeJ,CAED,SAASr/H,GAAiBjjB,GAEtBokB,GAAyBpkB,EAAE4+I,mBAC3Bt6I,EAAmBi+I,oBACtB,CAMD,SAAS7+H,KACL,OAAOtf,EAAmBA,EAAiBo5I,YAAc,IAC5D,CA8BD,SAAS56H,GAAgB5iB,GACjBA,IAAiB1D,GAAe0D,GAAiB1D,GAAc0D,EAAa/B,OAAS3B,EAAU2B,OAC/F3B,EAAY0D,GAGhB,IAAMoN,EAAoBqF,EAAQkzI,kBAAkBzsI,EAAY5c,GAC1DqH,EAAoB8O,EAAQmzI,qBAAqBtpJ,GAEvD,GAAIwH,EAA0B,CAC1B,IAII+J,EAJEX,EAAiBpJ,EAAyB0/I,UAC1Cx1I,EAAamL,EAAc6nI,sBAAsB/qI,EAAMiD,EAAWjB,IAClExU,EAAS0V,EAAc0sI,sBAAsB5vI,EAAMiD,EAAWjB,IAIhE9T,EAAU,KAgBd,OAdwB,OAAnB+I,GAA4BA,EAAe+K,KAAO7K,EAAkB6K,IAAQhC,IAAS/Z,EAAAs0B,EAAAmmG,KAKtF9oH,EAAUsL,EAAculI,cAAczoI,EAAMiD,EAAWjB,KAHvD9T,EADoBgV,EAAc2sI,uBAAuBC,qBAAqB9vI,EAAMhJ,IACrDkM,EAAc6sI,qBAAqB/vI,EAAMiD,EAAWjB,IACnFpK,EAAUsL,EAAc8sI,qBAAqB3pJ,EAAW6H,EAAS+U,EAAWjB,UAAA,IAK5ExU,GAAwBoK,EAAUpK,IAClCoK,EAAUpK,GAEVoK,EAAUG,IACVH,EAAUG,GAEPlK,EAAyBi0H,WAAW3qH,EAAmBzJ,EAAmBsS,EAAM3Z,EAAUyhJ,aAAclwI,EAClH,CACG,OAAOtM,QAAQyE,SAEtB,CAwBD,SAAS4d,KACL,OAAOtf,CACV,CAOD,SAASggB,GAAsBtkB,GAC3B,IAAIoN,EASJ,YAAO,IAPHpN,IAAA,EACAsgB,EAAA4lI,IAAalmJ,GACboN,EAAmBtJ,EAA2BA,EAAyB26I,4BAA4Bz+I,GAAW,MAE9GoN,EAAmBtJ,EAA2BA,EAAyBg7I,2BAA6B,KAGjGrsI,EAAQmjI,0CAA0CxoI,EAC5D,CAED,SAASyW,KACL,QAAOzf,GAAmBA,EAAiB07I,yBAC9C,CAsBD,SAASr8H,GAAsBzjB,GAC3B,GAAK2f,EAASvI,MAAMskH,UAAUY,mCAA9B,CAGA,IAAMlvH,EAAQpN,EAAEq9I,MACV15I,EAAQyJ,EAAM+Y,MAEdlZ,EAAwBqX,GADdlX,EAAMisG,SAEhB/8G,EAAmBwH,GAA4BmJ,EAAwBnJ,EAAyB26I,4BAA4BxxI,EAAsBosG,SAAW,KAC/JpsG,GAAyB3Q,IACzBA,EAAiBqoB,UAAYnE,EAAU2lI,0BAA0BxiJ,GAPpE,CASJ,CAED,SAAS0gB,GAAuBrkB,GAC5B,IAAMoN,EAAQpN,EAAEq9I,MAEV15I,EAAQyJ,EAAM+Y,MACdlZ,EAAUG,EAAMisG,QAChB/8G,EAAwBgoB,GAAsBrX,GAC9C/Q,EAAmB4H,GAA4BxH,EAAwBwH,EAAyB26I,4BAA4BniJ,EAAsB+8G,SAAW,KAInK,GAAI/8G,GAAyBJ,EAAkB,CAE3C,IAAIgR,EAGJ,GAAIyS,EAASvI,MAAMskH,UAAUW,iBAAmBr8H,EAAEU,QAAQzC,OAASkY,EAAAD,EAAAyrH,mBAAgC,CAE/F,IACM3zH,EA6BlB,SAA4BhO,EAASoN,GACjC,IAAMzJ,EAAY3D,EAAQomJ,SAAS,QAE7Bn5I,EAAQ,GAKd,OAJAtJ,EAAU+F,SAAQ,SAAA1J,GACdiN,EAAM8T,KAMd,SAAuB/gB,EAAMoN,GAEzB,IAAIzJ,EAAO,UACX,OAAQ3D,EAAKpD,OACT,KAAK,EACD+G,EAAOkK,EAAA2iB,EAAAiiH,6BAAAC,QACP,MACJ,KAAK,GACD/uI,EAAOkK,EAAA2iB,EAAAiiH,6BAAAG,YACP,MACJ,KAAK,GACDjvI,EAAOkK,EAAA2iB,EAAAiiH,6BAAAE,SAOf,IAAI1lI,EAAyC,IAAzBjN,EAAKqmJ,kBAA6BrmJ,EAAKsmJ,mBAAL13I,KAAA+U,IAA0B,EAAK,IAAK,IAK1F,MAAO,CACH1lB,KAAA0F,EACA4iJ,aANJt5I,EAAe0jB,GAAU5a,GAASojH,cAAcyrB,SAAS33I,GAOrDu5I,UALexmJ,EAAKymJ,WAAar5I,EAOxC,CA5BD,CANiCpN,EAAMoN,GAClC,IAEMH,CACV,CATD,CA/BYC,EAAUA,GAAoBsT,EAAUyQ,MAAMttB,GAC5BzH,EAAiByoB,WAE/B3W,GAASA,EAAM3R,QACfqZ,EAASif,QAAQtwB,EAAAmsB,EAAAk2H,YACb,CAAEtgJ,KAAM4H,GACR,CAAEssH,SAAUphH,EAAWjB,GAAIsiH,UAAWtkH,GAGjD,CAED,IAAM9R,EAAmBsO,EAAQk0I,aAAarqJ,EAAsB+sI,UAAW,KAAMnwH,GAC/E7V,EAAmBoP,EAAQk0I,aAAarqJ,EAAuBJ,EAAkBgd,GAEvF,GAAI/U,GAAoBA,EAAiB9H,OAAS,GAAKgH,GAAoBA,EAAiBhH,OAAS,EAAG,CACpG,IAAM+H,EAAUd,EAAcm2I,YAAY,CACtC9nG,MAAO7iC,EAAAurI,wBACPhhC,QAASpsG,EACToP,MAAOjP,EAAMiP,QACd,GAGG/X,EAkDlB,SAA6BtE,EAASoN,EAASzJ,EAAmBsJ,GAC9D,IAMI,IALA,IAAM3Q,EAAe,CAAC,EAChBJ,EAAS,GAGT2R,EAAelK,EAAkB/D,OAAOqN,GACrCC,EAAI,EAAGc,EAAKH,EAAaxR,OAAQ6Q,EAAIc,EAAId,IAC9C5Q,EAAauR,EAAaX,GAAG6tC,YAAc,IAAMltC,EAAaX,GAAGpF,OAAS+F,EAAaX,GAG3F,IAAMzJ,EAAazD,EAAQomJ,SAAS,QAEpC,IAAK3iJ,GAAoC,IAAtBA,EAAWpH,OAC1B,OAAOH,EAQX,IALA,IAAMiI,EAAOnE,EAAQ4mJ,OAAO,QACtBvjJ,GAAkBc,GAASmxB,MAAMnxB,EAAK0iJ,6BAAgCvxH,MAAMnxB,EAAKwgB,WAAgEvX,IAAYkoB,MAAMloB,EAAQ47H,gBAAkB57H,EAAQ47H,eAAiB,EAAxH7kI,EAAK0iJ,2BAA6B1iJ,EAAKwgB,UACrItgB,EAAyBuK,KAAKgN,IAAIvY,EAAiB,GACnDe,EAAmBN,EAAyBg7I,2BAEzCx6I,EAAI,EAAGZ,EAAKD,EAAWpH,OAAQiI,EAAIZ,EAAIY,IAAK,CACjD,IAAMwG,EAAQ2H,EAAQq0I,SAASrjJ,EAAWa,GAAIhI,EAAc+H,EAAwBD,GAEhF0G,GACA5O,EAAO6kB,KAAKjW,EAEnB,CAED,OAAO5O,CAGV,CAFC,MAAO8D,GACL,MAAO,EACV,CACJ,CAlCD,CAnDYkN,EAAUA,GAAoBsT,EAAUyQ,MAAMttB,GACFS,EAASD,EAAkBd,GACvEqS,EAASif,QAAQlxB,EAAA+sB,EAAA80G,cACb,CAAEhvB,OAAQhyG,GACV,CAAEg2H,SAAUphH,EAAWjB,IAE9B,CACJ,CACJ,CA6JD,SAASkM,KACL,IAAMnkB,EAAaoZ,EAAmBtB,UAElC6H,EAASvI,MAAMskH,UAAUr6G,OAAOo8G,0BAGhCrkH,EAAmB2rG,KAAK/kH,EAAa,SAAO,GAGhDokB,GAAyBpkB,GACzBoE,EAAiBs8I,cAAc1gJ,GAC/BsE,EAAmBg+I,oBACtB,CAED,SAASp+H,KACL,IAAMlkB,EAAOoZ,EAAmBtB,UAC1B1K,EAAuBhJ,EAAiBk8I,qCAAqCtgJ,GAGnFokB,GAFmBkR,MAAMloB,GAAwBpN,EAAOoN,GAGxD9I,EAAmBg+I,oBACtB,CAyCD,SAASp/H,GAAcljB,GACfA,IAAMs1B,MAAMt1B,EAAEypC,QACdrlB,GAAyBpkB,EAAEypC,MAC3BrlC,EAAiBs8I,cAAc1gJ,EAAEypC,MAExC,CAED,SAASrlB,GAAyBpkB,GAC9B7D,EAAgB6D,EAChB0D,GAAA,CACH,CAyCD,OAnCA0J,EAAW,CACPi9H,WA/sCJ,SAAoB1mI,EAAarH,EAAe4Q,GAE5CkJ,GAAA,EAAqBsa,GAAAF,GAAmBza,GAASnV,OAAO,CACpD01G,OAAQ7yG,EAAA+sB,EACRi3G,SAAA/xH,EACAiyH,WAAAzuH,EACA2uH,kBAAAvwH,EACAy7H,cAAellI,EAAA2iB,EACfwiH,sBAAuBhzI,EAAOgzI,sBAC9B/0I,KAAAgY,IAGJoP,GAAA,EAActF,EAAAyQ,GAAYza,GAASnV,OAAO,CACtC+mI,WAAAzuH,EACAjb,KAAAgY,EACA4xH,kBAAAvwH,EACAg9H,YAAA73H,EACAmkI,iBAAA/1I,EACAi9H,kBAAmB9nI,EAAO8nI,kBAC1BuW,WAAAplI,EACA2uH,mBAAAxxH,EACAgjG,SAAAz5F,EACAqlI,UAAAxkI,EACA81F,OAAQ7yG,EAAA+sB,EACRi3G,SAAA/xH,EACAwuH,OAAQhuH,EACRN,OAAA,EAAOvS,EAAAmtB,GAAMza,GAASojH,cACtB4tB,iBAAA,EAAiB1mI,EAAAmQ,GAAgBza,GAASojH,cAC1C4Z,cAAellI,EAAA2iB,EACfw2H,UAAW9qJ,EAAAs0B,EACXk3G,UAAA,EAAUnnH,EAAAiQ,GAASza,GAASojH,gBAGhClsH,EAAYiM,EAAWo+H,aAAa5B,UAGpCrwH,EAAYglH,WAAWp9H,GACvBkM,EAAc8tI,mBAAmBhxI,EAAM7I,GAEvCtJ,EAA2BoY,EAAyBnG,GAASnV,OAAO,CAChE+mI,WAAAzuH,EACAjb,KAAAgY,EACAw+D,cAAAt7D,EACAm7H,YAAA73H,EACA+hI,mBAAAplI,EACAyuH,kBAAAvwH,EACAy7H,cAAellI,EAAA2iB,EACf8lF,OAAQ7yG,EAAA+sB,EACRi3G,SAAA/xH,EACAwuH,OAAQhuH,EACRw/H,UAAAzoI,EACAkmG,QAAA1gG,EACAm1H,mBAAAxxH,IAGJhS,EAgmCJ,SAAwCpE,EAAMoN,GAG1C,OAAKpN,EAKDA,IAAS9D,EAAAs0B,EAAAmmG,MAAmBvpH,EAWfojB,EAAiBza,GAASnV,OAAO,CAC1C+mI,WAAAzuH,EACAjb,KAAA+B,EACA4gJ,iBAAA/1I,EACAi6I,cAAAvtI,EACA+mI,cAAAh7I,EACA+6I,WAAAplI,EACA8rI,gBAAAjrI,EACAykI,yBAAAz6I,EACAqvG,QAAA1gG,EACAsqI,eAAAt1H,EACAgtD,cAAAt7D,EACAqlI,mBAAAplI,EACAggG,SAAAz5F,IAvBSzb,EAAkC6R,GAASnV,OAAO,CAC3D+mI,WAAAzuH,EACAjb,KAAA+B,EACAg1D,SAAA38C,EACAimI,cAAAh7I,EACAy5I,eAAAt1H,EACA42H,WAAAplI,EACAmgG,SAAAz5F,KAZJ1G,EAAWzN,MAAM,IAAIwD,EAAAwhB,EAAYta,EAAA4lI,kCAA0C5lI,EAAA4mI,qCAA8C,yBAClH,KAgCd,CArCD,CAhmCsD7mI,EAAM/I,GACpD9I,GACAA,EAAiBimI,WAAW1mI,IAGhCW,EAAqB0b,EAAmBjK,GAASnV,OAAO,CACpD+mI,WAAAzuH,EACAjb,KAAAgY,EACA++C,SAAA38C,EACA86F,QAAA1gG,EACA6hI,YAAA73H,EACAmkI,iBAAA/1I,EACAyzI,cAAAh7I,EACAmxE,cAAAt7D,EACAqlI,mBAAAplI,EACA2jI,eAAAt1H,EACAs9H,gBAAAjrI,EACA46D,iBAAAtwE,EACAm6I,yBAAAz6I,EACAs1G,SAAAz5F,KAGe0qH,WAAW/tI,GAE9BH,EAAgB,EAChBuH,GAAA,EACAoH,GAAA,CACH,EA8nCGuvH,YAAA15G,GACA04G,QAAA34G,GACA+iI,WAtjCJ,WACI,QAAO3/I,GAA2BA,EAAyB2/I,YAC9D,EAqjCGyD,oBAhbJ,WACI,OAAO9iJ,CACV,EA+aGo7I,mBA7aJ,WACIp7I,EAAiBo7I,oBACpB,EA4aG2H,iBA1aJ,WACI,OAAO7jJ,CACV,EAyaG8jJ,sBAAAxjI,GACAyjI,4BA5bJ,WACI,OAAOvjJ,CACV,EA2bGwjJ,sBAAAhjI,GACAqzH,eArUJ,WACI,OAAOvzI,EAAmBA,EAAiBuzI,iBAAmB,CACjE,EAoUG4P,qBAAA1jI,GACA2jI,kBAzKJ,SAA2BxnJ,GACvB,IAAMoN,EAASsW,KAEf,OAAItW,EACO7L,QAAQyE,QAAQoH,GAGpBhJ,EAAmBA,EAAiBm7I,iBAAiBjjJ,EAAW0D,GAAuBuB,QAAQyE,QAAQ,KACjH,EAkKGyhJ,iBA7aJ,SAA0BznJ,GAEtB,OADAkZ,EAAalZ,EACR6jB,KAGEtiB,QAAQyE,UAFJ5B,EAAiB45I,oBAG/B,EAwaG7T,cAtaJ,WACI,OAAOjxH,CACV,EAqaGwuI,gBAAA9kI,GACA+kI,oBArXJ,WACIxjJ,EAAe,EAClB,EAoXGyjJ,aA5XJ,SAAsB5nJ,IAC0B,IAAxCmE,EAAasE,QAAQzI,IACrBmE,EAAa4c,KAAK/gB,EAEzB,EAyXG6nJ,mBArKJ,WACI,OAAO,IAAItmJ,SAAQ,SAACvB,GAChB2D,EAAOiS,MAAP,mCAAAhW,OAAgDqW,IAChD,IAAM7I,EAAgB6I,IAAS/Z,EAAAs0B,EAAAmmG,MAAmBh3G,EAASvI,MAAMskH,UAAUsF,gBAAgB/qH,KAAU/Z,EAAAs0B,EAAAywG,kCAA8C7nH,EAAmBs+H,mBAAmBx+H,GAAcyG,EAASvI,MAAMskH,UAAUr6G,OAAO68G,eAIvO,GAAI95H,EAAiB07I,4BAA8B1yI,EAS/C,OARAhJ,EAAiB+7I,oCAAoC7jJ,EAAUipB,OAC1Dyd,MAAK,WACFttB,EAASif,QAAQlxB,EAAA+sB,EAAAs0G,oBAA4B,CAAC,EAAG,CAAExK,SAAUphH,EAAWjB,GAAIsiH,UAAWtkH,GAC1F,IAHLgtB,OAIW,WACHvtB,EAASif,QAAQlxB,EAAA+sB,EAAAs0G,oBAA4B,CAAC,EAAG,CAAExK,SAAUphH,EAAWjB,GAAIsiH,UAAWtkH,GAC1F,SACLjW,IAKJsE,EAAmBi+I,qBACnBj+I,EAAmB89I,gBAAA,GAGfh1I,GAEAsI,EAASif,QAAQlxB,EAAA+sB,EAAAy0G,2BAAmC,CAChD1K,UAAWtkH,EACXqkH,SAAUphH,EAAWjB,IACtB,CAAEsiH,UAAWtkH,EAAMqkH,SAAUphH,EAAWjB,KAG3C3U,EAAcmY,gBAGdrX,EAAiB87I,iCAAiC5jJ,EAAUipB,OACvDyd,MAAK,WAEF,IAAMhjC,EAAqBskB,KAC3B,OAAOlgB,EAAiBq8I,4BAA4BzgJ,EACvD,IACAgjC,MAAK,WACF7e,KACAnkB,GACH,IATLijC,OAUW,WACH9e,KACAnkB,GACH,KAGLoE,EAAiB+7I,oCAAoC7jJ,EAAUipB,OAC1Dyd,MAAK,WACF9e,KACAlkB,GACH,IAJLijC,OAKW,WACH/e,KACAlkB,GACH,GAEZ,GACJ,EAwGG0jJ,qBAjtBJ,SAA8B1jJ,GACtB+S,GACApP,EAAO8I,KAAP,6CAAA7M,OAAyDmT,EAAkCsmG,QAA3F,SAAAz5G,OAA0GqW,IAE9GtS,EAAOiS,MAAP,qCAAAhW,OAAkDqW,IAClD,IAAM7I,EAAapN,EAAE6hJ,WAErBnzI,GAAA,EAGApK,EAAmBi+I,qBAEnBz+I,EAAyB4/I,qBAAqBt2I,GAE9C,IAAMH,EAAqBqX,GAAsBlX,GAE7CpN,EAAEk1B,QAAUl1B,EAAEk1B,OAAO4yH,aAwB7B,SAAkD9nJ,GAK9CsD,EAAcmY,gBAGd/F,EAASif,QAAQlxB,EAAA+sB,EAAAy0G,2BAAmC,CAChD1K,UAAWtkH,EACXqkH,SAAUphH,EAAWjB,IACtB,CAAEsiH,UAAWtkH,EAAMqkH,SAAUphH,EAAWjB,KAG3C3T,EAAmBo+I,yBAAA,GACnBt+I,EAAiBg8I,wCAAwCpgJ,GACpDgjC,MAAK,WACF7e,KACApR,EAAoC,KACpCrE,GAAA,CACH,IALLu0B,OAMW,WACH9e,KACApR,EAAoC,KACpCrE,GAAA,CACH,GACR,CA1BD,CAvBiDzB,GAIpCjN,GAAKA,EAAEk1B,QAAUl1B,EAAEk1B,OAAO6yH,aA+CvC,SAAyC/nJ,GACrCoE,EAAiBq8I,4BAA4BzgJ,GACxCgjC,MAAK,WACF1/B,EAAcmY,gBACd3Q,GAAA,EACAxG,EAAmBo+I,yBAAA,GACnBp+I,EAAmBg+I,qBACnB5zI,GAAA,EACAqE,EAAoC,IACvC,IARLkwB,OASW,WACHlwB,EAAoC,KACpCrE,GAAA,CACH,GACR,CAdD,CA9CwCzB,GAI3B0S,EAASvI,MAAMskH,UAAUr6G,OAAOm8G,kBA0D7C,SAAsCx9H,GAElC,IAAMoN,EAAOgM,EAAmBtB,UAC5BnU,EAAkB,KAAQ2xB,MAAMt1B,EAAmBmhJ,kBAA0D,EAAtCnhJ,EAAmBmhJ,kBACxFl0I,EAAU3J,EAAcm2I,YAAY,CACtC9nG,MAAO7iC,EAAAurI,wBACP5wG,KAAMr8B,EAAOzJ,EACbk7H,UAAW,IACZ,GAEH,GAAI5xH,IAAY2T,KAAkB,CAC9B,IAAMtkB,EAAc8H,EAAiBuzI,iBAC/Bz7I,EAAmBid,EAAc6uI,uBAAuB9uI,EAAWjB,GAAIhC,GAGzEhJ,EAAQosG,QAAUr5G,EAAmBq5G,SAAW/8G,GAAeqH,GAAmBzH,IAAqBgR,EAAAsjB,EAAAy3H,aACvG7jJ,EAAiBq8I,4BAA4BzgJ,GACxCgjC,MAAK,WAIF1/B,EAAcmY,gBAEd2I,GADmBhX,EAAOzJ,GAE1BW,EAAmBo+I,yBAAA,GACnBp+I,EAAmBg+I,qBACnB5zI,GAAA,CACH,IAXLu0B,OAYW,WACHv0B,GAAA,CACH,IAKL8T,GAAgCxiB,EAEvC,MACGwiB,GAAgCxiB,EAEvC,CAxCD,CAzDqCiN,GAK7BuV,GAAgCvV,GAGpCwP,EAAY6oI,yBAAyB,IAAIztI,KAAQ4Y,GAAc4zH,mCAC/D5nI,EAAYyrI,2BAA2Bj7I,EAAmBgL,GAAmC,IAA/BmB,EAAmBtB,UAAkBsB,EAAmBm8H,kBAEzH,EA4qBG4S,aArXJ,WACI,OAAO7rJ,CACV,EAoXGg/E,eAlXJ,WACI,OAAOl3E,EAAiBk3E,gBAC3B,EAiXGskE,eA/WJ,SAAwB5/I,GACpB,OAAOoE,EAAiBw7I,eAAe5/I,EAAa1D,EACvD,EA8WGkhJ,UAAA95H,GACA0kI,yBAAAhkI,GACAikI,iBA9BJ,SAA0BroJ,EAAMoN,GAC5BqP,EAAY6oI,yBAAyBtlJ,EAAMoN,EAC9C,EA6BGk7I,iBA7UJ,WACI,IAAMtoJ,EAAqBskB,KAErBlX,EAAiBtJ,GAA4B9D,EAC/C8D,EAAyB26I,4BAA4Bz+I,EAAmBq5G,SAAW,KAEvF,OAAOh0F,EAAY4kH,gCACf3tI,EACA8Q,EAEP,EAoUGm7I,kCArkCJ,SAA2CvoJ,GACvC,OAAO,IAAIuB,SAAQ,SAAC6L,GAMhB,GAD8BhJ,EAAiBs7I,gBAAgB1/I,EAAEw2I,UAQ7D,OANApyI,EAAiBu7I,cAEb3+H,GADyB5c,EAAiBk8I,qCAAqCtgJ,EAAEw2I,YAEjFpyI,EAAiB27I,yBAAA,QAErB3yI,IAKJ9I,EAAmBi+I,qBACnBj/I,EAAcmY,gBAGdrX,EAAiB67I,yBACZj9G,MAAK,WAEF,IAAM51B,EAAchJ,EAAiBi8I,6BAA6BrgJ,EAAEw2I,UAEpE,OAAOpyI,EAAiBm8I,aAAanzI,EACxC,IACA41B,MAAK,WAEF,IAAMr/B,EAAuBS,EAAiBk8I,qCAAqCtgJ,EAAEw2I,UAGrF,GAAIx1H,GAA4Brd,GAC5BS,EAAiB27I,yBAAA,GACjB3yI,QACG,CACH,IAAMH,EAAaqoB,MAAM3xB,GAAwB3D,EAAEw2I,SAAW7yI,EAC9DygB,GAAyBnX,GACzB7I,EAAiBs8I,cAAczzI,GAE/B,IAAM3Q,EAAW,GAGjBA,EAASykB,KAAK3c,EAAiB45I,sBAG/B,IAAM9hJ,EAAqBooB,KAC3BhoB,EAASykB,KAAK3c,EAAiBq8I,4BAA4BvkJ,IAE3DqF,QAAQF,IAAI/E,GACP0mC,MAAK,WAEF1+B,EAAmBq+I,wBAAA,GAGnBr+I,EAAmBo+I,yBAAA,GACnBp+I,EAAmBg+I,qBACnBl1I,GACH,GACR,CACJ,IAxCL61B,OAyCW,SAACjjC,GACJ2D,EAAO6H,MAAMxL,EAChB,GAER,GACJ,EAkgCGwoJ,kCAx/BJ,WACI,OAAO,IAAIjnJ,SAAQ,SAACvB,EAASoN,GACzB,IAEI9I,EAAmBi+I,qBAGnBj/I,EAAcmY,gBAGdrX,EAAiB67I,yBACZj9G,MAAK,WAEF,OAAO5+B,EAAiBo8I,gBAC3B,IACAx9G,MAAK,WACFhjC,GACH,GAIR,CAFC,MAAOA,GACLoN,EAAOpN,EACV,CACJ,GACJ,EAk+BGgvC,MAloCJ,SAAehvC,EAAS2D,GAChB0hB,GACAA,EAAY2pB,QAGZ5qC,IACAA,EAAiB4qC,MAAMhvC,EAAS2D,GAChCS,EAAmB,MAGnBE,IACAA,EAAmB0qC,QACnB1qC,EAAqB,MAGrBR,IACAA,EAAyBkrC,QACzBlrC,EAA2B,MAG3BsS,IACAA,EAAqB,MAGrB+C,GACAA,EAAcsvI,qBAAqB9nI,KAAe1K,GAGtDP,EAASgd,IAAIjvB,EAAA+sB,EAAA60G,sBAA8BljH,GAAwB/U,GACnEsI,EAASgd,IAAIjvB,EAAA+sB,EAAAi1G,qBAA6BvjH,GAAuB9U,GACjEsI,EAASgd,IAAIjvB,EAAA+sB,EAAA01G,sBAA8B/kH,GAAwB/T,GACnEsI,EAASgd,IAAIjvB,EAAA+sB,EAAAg1G,qBAA6B/hH,GAAuBrW,GACjEsI,EAASgd,IAAIjvB,EAAA+sB,EAAAy1G,sBAA8B5hH,GAAwBjX,GACnEsI,EAASgd,IAAIjvB,EAAA+sB,EAAAukH,2BAAmCpyH,GAA4BvV,GAC5EsI,EAASgd,IAAIjvB,EAAA+sB,EAAAu0G,eAAuBtiH,GAAkBrV,GACtDsI,EAASgd,IAAIjvB,EAAA+sB,EAAAg3G,YAAoBtkH,GAAe9V,GAChDsI,EAASgd,IAAIjvB,EAAA+sB,EAAAgpH,2BAAmCx1H,GAA6B5W,GAC7EsI,EAASgd,IAAIjvB,EAAA+sB,EAAA8oH,2BAAmCv2H,GAA6B3V,GAC7EsI,EAASgd,IAAIjvB,EAAA+sB,EAAAk2G,mCAA2C1jH,GAAmC5V,GAC3FsI,EAASgd,IAAIjvB,EAAA+sB,EAAAm2G,wBAAgCpjH,GAAyBnW,GACtEsI,EAASgd,IAAIjvB,EAAA+sB,EAAA21G,eAAuBljH,GAAkB7V,GACtDsI,EAASgd,IAAIjvB,EAAA+sB,EAAAo2G,oBAA4B/jH,GAAsBzV,GAC/DsI,EAASgd,IAAIjvB,EAAA+sB,EAAAw0G,4BAAoCtiH,GAAkBtV,GAGnE6T,KACAhL,EAAO,KACPiD,EAAa,IAChB,GA9KGvV,GAAA,EAASN,EAAAmtB,GAAMza,GAASojH,cAAcK,UAAUpsH,GAChD6T,KAEAvL,EAAS0c,GAAG3uB,EAAA+sB,EAAA60G,sBAA8BljH,GAAwB/U,EAAU,CAAE89E,SAAUl9E,EAAAwiB,EAAAkqG,sBACxFhlH,EAAS0c,GAAG3uB,EAAA+sB,EAAAi1G,qBAA6BvjH,GAAuB9U,GAChEsI,EAAS0c,GAAG3uB,EAAA+sB,EAAA01G,sBAA8B/kH,GAAwB/T,GAClEsI,EAAS0c,GAAG3uB,EAAA+sB,EAAAg1G,qBAA6B/hH,GAAuBrW,GAChEsI,EAAS0c,GAAG3uB,EAAA+sB,EAAAy1G,sBAA8B5hH,GAAwBjX,GAClEsI,EAAS0c,GAAG3uB,EAAA+sB,EAAAukH,2BAAmCpyH,GAA4BvV,GAC3EsI,EAAS0c,GAAG3uB,EAAA+sB,EAAAu0G,eAAuBtiH,GAAkBrV,GACrDsI,EAAS0c,GAAG3uB,EAAA+sB,EAAAg3G,YAAoBtkH,GAAe9V,GAC/CsI,EAAS0c,GAAG3uB,EAAA+sB,EAAAgpH,2BAAmCx1H,GAA6B5W,GAC5EsI,EAAS0c,GAAG3uB,EAAA+sB,EAAA8oH,2BAAmCv2H,GAA6B3V,GAC5EsI,EAAS0c,GAAG3uB,EAAA+sB,EAAA21G,eAAuBljH,GAAkB7V,GACrDsI,EAAS0c,GAAG3uB,EAAA+sB,EAAAk2G,mCAA2C1jH,GAAmC5V,GAC1FsI,EAAS0c,GAAG3uB,EAAA+sB,EAAAm2G,wBAAgCpjH,GAAyBnW,GACrEsI,EAAS0c,GAAG3uB,EAAA+sB,EAAAo2G,oBAA4B/jH,GAAsBzV,GAC9DsI,EAAS0c,GAAG3uB,EAAA+sB,EAAAw0G,4BAAoCtiH,GAAkBtV,GAovC/DA,CACV,CAEDsT,GAAgBi5G,sBAAwB,kBACxC,IAAA/4G,GAAezc,EAAAqsB,EAAAyqG,gBAA6Bv6G,ICrzC5CO,GAfI,SAAAjhB,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAA3oD,GACVsW,KAAKgkH,SAAW,KAChBhkH,KAAK+yH,UAAY,KACjB/yH,KAAK6mI,YAAc,KACnB7mI,KAAK+iG,QAAU1lE,IACfr9B,KAAK+F,MAAQs3B,IACbr9B,KAAK6P,MAAQ,KACb7P,KAAKsC,MAAQ+6B,IACbr9B,KAAKwC,IAAM66B,IACXr9B,KAAK0B,SAAW27B,IAChBr9B,KAAKizH,iBAAmB,KACxBjzH,KAAKuoI,YAAc,IACtB,EAAA79H,GAAArd,EAAA,eAAAue,GAAAliB,EAAAoN,GAAA,GAAApN,EAAA,qBAAAA,EAAA,OAAAmhB,GAAAnhB,EAAAoN,GAAA,IAAAzJ,EAAA7G,OAAAC,UAAAC,SAAAE,KAAA8C,GAAA0W,MAAA,uBAAA/S,GAAA3D,EAAA5D,cAAAuH,EAAA3D,EAAA5D,YAAA+B,MAAA,QAAAwF,GAAA,QAAAA,EAAAnH,MAAAojB,KAAA5f,GAAA,cAAA2D,GAAA,2CAAA9B,KAAA8B,GAAAwd,GAAAnhB,EAAAoN,QAAA,YAAA+T,GAAAnhB,EAAAoN,IAAA,MAAAA,GAAAA,EAAApN,EAAA3D,UAAA+Q,EAAApN,EAAA3D,QAAA,QAAAsH,EAAA,EAAAsJ,EAAA,IAAAzQ,MAAA4Q,GAAAzJ,EAAAyJ,EAAAzJ,IAAAsJ,EAAAtJ,GAAA3D,EAAA2D,GAAA,OAAAsJ,CAAA,CCPL,SAASoV,GAAYriB,GAEjBA,EAAMA,GAAO,CAAC,EACd,IAKIoN,EAAUzJ,EALRsJ,EAAUqJ,KAAK9V,QACflE,EAAkB0D,EAAI+mJ,gBACtBl5I,EAA4B7N,EAAI0oJ,0BAChCx7I,EAAYlN,EAAIglJ,UAChBh3I,GAAA,EAAWkL,EAAAsX,GAASvjB,GAASksH,cAiBnC,SAAS11H,EAAQzD,GAEb,IAmCIoN,EAnCEH,EAAmB,IAAI4K,KACvBpU,EAAUzD,EAAYU,QAEtB2D,EAAU,IAAIovE,QAKpB,GAJIhwE,EAAQ+lC,OACRnlC,EAAQ+rD,OAAO,QAAS,SAAW3sD,EAAQ+lC,OAG3CxpC,EAAYsG,QACZ,IAAK,IAAIlC,KAAUpE,EAAYsG,QAAS,CACpC,IAAIhC,EAAQtE,EAAYsG,QAAQlC,GAC5BE,GACAD,EAAQ+rD,OAAOhsD,EAAQE,EAE9B,CAGAb,EAAQklJ,mBACTllJ,EAAQklJ,iBAAmB17I,GAG3B3Q,GAAmBA,EAAgBssJ,qBAKnCtsJ,EAAgBssJ,oBAAoB,CAChC/+I,iBAAkB,SAAU7J,EAAQoN,GAChC/I,EAAQ+rD,OAAOpwD,EAAQoN,EAC1B,GACF,CACChL,IAAKpC,EAAYoC,MAKa,mBAA3BY,OAAOuwE,kBACdnmE,EAAkB,IAAImmE,gBACtBvzE,EAAY6oJ,gBAAkBz7I,EAC9BA,EAAgBzG,OAAOgC,QAAU3I,EAAY2I,SAGjD,IAAM7E,EAAa,CACfmE,OAAQjI,EAAYiI,OACpB3B,QAASjC,EACTmvE,YAAaxzE,EAAYqJ,gBAAkB,iBAC3C1C,OAAQyG,EAAkBA,EAAgBzG,YAAA,GAGxCjD,EAAkBsK,EAASoJ,MAAMskH,UAAUyG,IAAIuB,+BAC/C54H,EAAc+M,KAAK6H,MACrBhR,EAA4B,EAEhC,IAAInN,SAAQ,SAACvB,GACT,GAAI0D,IAAoBxH,EAAAs0B,EAAAs4H,uCAAmDj7I,IACvEa,EAA4Bb,EAA0Bk7I,6BAA6BtlJ,EAAgE,IAAvDE,EAAYs9I,sBAAsBx9I,EAAQ82H,aAIlI,OAAO7xH,WAAW1I,EAAS0O,GAGnC1O,GACH,IACIgjC,MAAK,WACF,IAAI51B,EAAkByK,KAAK6H,MAE3Bg0D,MAAM1zE,EAAYoC,IAAK0B,GAAYk/B,MAAK,SAAU/1B,GACzCjN,EAAY0H,WACb1H,EAAY0H,SAAW,CAAC,GAE5B1H,EAAY0H,SAASE,OAASqF,EAASrF,OACvC5H,EAAY0H,SAASG,WAAaoF,EAASpF,WAC3C7H,EAAY0H,SAASc,YAAcyE,EAAS7K,IAEvC6K,EAAS0mE,IACV3zE,EAAY6I,UAGhB,IAZwDvM,EAYpD0R,EAAkB,GAZkC3J,EAAA,SAAArE,GAAA,IAAA2D,EAAA,uBAAAJ,QAAA,MAAAvD,EAAAuD,OAAA85E,UAAA,IAAA7gF,MAAAC,QAAAuD,KAAA2D,EAAAue,GAAAliB,IAAA,CAAA2D,IAAA3D,EAAA2D,GAAA,IAAAsJ,EAAA,EAAA3Q,EAAA,oBAAA4Q,EAAA5Q,EAAAqH,EAAA,kBAAAsJ,GAAAjN,EAAA3D,OAAA,CAAAmK,MAAA,IAAAA,MAAA,EAAAsB,MAAA9H,EAAAiN,KAAA,EAAAjN,EAAA,SAAAA,GAAA,MAAAA,CAAA,EAAAqD,EAAA/G,EAAA,WAAAqsD,UAAA,6IAAAzsD,EAAA2R,GAAA,EAAAX,GAAA,SAAAA,EAAA,WAAAvJ,EAAA3D,EAAAuD,OAAA85E,WAAA,EAAA15E,EAAA,eAAA3D,EAAA2D,EAAA05F,OAAA,OAAAxvF,EAAA7N,EAAAwG,KAAAxG,CAAA,EAAAA,EAAA,SAAAA,GAAAkN,GAAA,EAAAhR,EAAA8D,CAAA,EAAAqD,EAAA,eAAAwK,GAAA,MAAAlK,EAAAwiF,QAAAxiF,EAAAwiF,QAAA,YAAAj5E,EAAA,MAAAhR,CAAA,KAatC+Q,EAAS3G,QAAQ/J,QAbqB,IAaxD,IAAA8H,EAAA6I,MAAA5Q,EAAA+H,EAAAV,KAAA6C,MAA2C,KAAhCpC,EAAgC9H,EAAAwL,MACvCkG,GAAmB5J,EAAM,KAAO6I,EAAS3G,QAAQ8Q,IAAIhT,GAAO,MAC/D,CAfuD,OAAApE,GAAAqE,EAAArE,EAAAA,EAAA,SAAAqE,EAAAhB,GAAA,CAkBxD,GAFArD,EAAY0H,SAASF,gBAAkBwG,GAElCf,EAASq8B,KAIV,OAAOr8B,EAAS6mE,cAAc9wC,MAAK,SAAU51B,GACzCpN,EAAY0H,SAASA,SAAW0F,EAChC,IAAMzJ,EAAQ,CACV2U,OAAQlL,EAAOmU,WACf/I,MAAOpL,EAAOmU,WACd88C,QAAA,GAEJr+D,EAAYgpJ,SAASrlJ,GACrB3D,EAAYy+G,SACZz+G,EAAYipJ,OAEf,IAGL,IAWc3kJ,EACAR,EAAAuhB,EAAAjP,EAZRtH,EAAa0H,SAASvJ,EAAS3G,QAAQ8Q,IAAI,kBAAmB,IAChEpI,EAAgB,EAChB7S,GAAA,EACA4W,EAAY,IAAI4D,WAChBZ,EAAS,EAEb,GAAIrS,IAAoBxH,EAAAs0B,EAAAs4H,uCAAmDj7I,EAA2B,KAC9F6H,EAAQtI,EACR8I,EAAQ,EAFsFgD,GA+ClD9C,EA/CkD,WAAApW,GAAA,GAAAxD,MAAAC,QAAAuD,GAAA,OAAAA,CAAA,EAAAqlB,EA+ChEpY,EAASq8B,KAAK4/G,QA/CkD,SAAAlpJ,EAAAoN,GAAA,uBAAA7J,QAAAA,OAAA85E,YAAAvgF,OAAAkD,GAAA,KAAA2D,EAAA,GAAAsJ,GAAA,EAAA3Q,GAAA,EAAAJ,OAAA,cAAA2R,EAAAX,EAAAlN,EAAAuD,OAAA85E,cAAApwE,GAAAY,EAAAX,EAAAmwF,QAAA72F,QAAA7C,EAAAod,KAAAlT,EAAA/F,QAAAsF,GAAAzJ,EAAAtH,SAAA+Q,GAAAH,GAAA,UAAAjN,GAAA1D,GAAA,EAAAJ,EAAA8D,CAAA,aAAAiN,GAAA,MAAAC,EAAAi5E,QAAAj5E,EAAAi5E,QAAA,YAAA7pF,EAAA,MAAAJ,CAAA,SAAAyH,CAAA,GAAA0hB,EAAAjP,IAAA8L,GAAAmD,EAAAjP,IAAA,qBAAAuyC,UAAA,iJA+C3FxyC,EA/C2F+C,EAAA,GA+C/EjD,EA/C+EiD,EAAA,GAKxF5U,EA2CQ6R,EA3CQ69D,YAChBlwE,EAAc,GAEpBQ,EAAOiF,OAAOy5B,MAAK,SAAS/1B,EAAa3Q,GACrC,IAAMJ,EAAQI,EAAKwL,MACboF,EAAO5Q,EAAKkK,KAGlB,GAFA0P,EAAQ2B,KAAK6H,MAETxjB,GAASA,EAAMG,OAAQ,CACvB,IAAM8H,EAA0B+R,EAAQR,EAClCrS,EAAanH,EAAMG,OACzByH,EAAYid,KAAK,CACbooI,4BAA6BjzI,EAAQ9I,EACrCg8I,wBAAAjlJ,EACAklJ,WAAAhmJ,EACAimJ,KAAM16I,KAAKwU,MAAM,EAAI/f,GAAcc,EAA0B,MAC7D+6I,YAAav7I,EAAYs9I,sBAAsBx9I,EAAQ82H,YAE9D,CAED,GAAIrtH,EAAM,CAEN,IAAM7I,EAAgB6R,EAAQ9I,EACxBhJ,EAAiBN,EAAYopB,QAAO,SAACltB,EAAMoN,GAAP,OAAgBpN,EAAOoN,EAAKi8I,UAA5B,GAAwC,GAWlF,OATAx7I,EAA0B07I,eAAe9lJ,EAASY,EAAeP,EAAagH,EAAa4D,EAA2BV,QAEtHhO,EAAYgpJ,SAAS,CACjB1wI,OAAQlU,EACRoU,MAAOpU,EACP6uE,kBAAA,EACAxpC,KAAM57B,EAA0B27I,+BAA+B/lJ,GAC/D46D,QAAA,GAGP,CAED,OADA3oD,EAAQmC,KAAK6H,MACNpb,EAAOiF,OAAOy5B,KAAK/1B,EAC7B,IAMLjN,EAAYypJ,OAASxzI,EAAY+9D,WACpC,MACGh0E,EAAYypJ,OAASx8I,EAASq8B,KAAK0qC,YAGvC,IAAI/6D,EAAiB,GACjBZ,EAAgB,GAChBf,EAAc,GACd7E,GAAA,EA6GJtO,EAAKnE,GA1GiB,SAAhBoN,EAAgBzJ,GAA2B,IAAfsJ,EAAetJ,EAAfmE,MAC9B,GAD6CnE,EAAR6C,KAC3B,CACN,GAAIuM,EAAW,CACX,GAAIrP,IAAoBxH,EAAAs0B,EAAAs4H,sCAAiD,CAIrE,IAAIxsJ,EAAuB,KACvBuR,EAAiB,KACjBnK,IAAoBxH,EAAAs0B,EAAAmzG,+CACpBrnI,EAqKpC,SAAwC0D,EAAeoN,GACnD,IACI,IAAIzJ,EAAOsJ,EAEXtJ,EAAQ3D,EAAcqX,QAAO,SAACjK,EAAMzJ,GAAP,OAAaA,EAAI3D,EAAc3D,OAAS,CAAxC,IAC7B4Q,EAASG,EAAYiK,QAAO,SAACrX,EAAO2D,GAAR,OAAcA,EAAIyJ,EAAY/Q,OAAS,CAAvC,IAC5B,IAAIC,EAAmB,GAEvB,GAAIqH,EAAMtH,OAAS,EAAG,CAGlB,IAFA,IAAIH,EAA6B,EAC7B2R,EAAyB,EACpBX,EAAI,EAAGA,EAAIvJ,EAAMtH,OAAQ6Q,IAC9B,GAAIvJ,EAAMuJ,IAAMD,EAAOC,GAAI,CACvB,IAAIc,EAAoBf,EAAOC,GAAGm2D,GAAK1/D,EAAMuJ,GAAGm2D,GAChD,GAAIr1D,EAAoB,EACpB1R,EAAiBykB,KAAM,EAAI9T,EAAOC,GAAGiZ,MAASnY,GAC9CH,EAAyB,MACtB,CAC4B,IAA3BA,IACAA,EAAyBlK,EAAMuJ,GAAGm2D,GAClCnnE,EAA6B,GAEjC,IAAIuH,EAA6BwJ,EAAOC,GAAGm2D,GAAKx1D,EAC5CpK,EAA6B,GAC7BvH,GAA8B+Q,EAAOC,GAAGiZ,MACxC7pB,EAAiBykB,KAAM,EAAI7kB,EAA8BuH,GACzDoK,EAAyB,GAGzB3R,GAA8B+Q,EAAOC,GAAGiZ,KAE/C,CACJ,CAGL,GAAI7pB,EAAiBD,OAAS,EAE1B,OAD8BC,EAAiB4wB,QAAO,SAACltB,EAAGoN,GAAJ,OAAUpN,EAAIoN,CAAd,GAAiB,GACxC9Q,EAAiBD,MAEvD,CAED,OAAO,IAGV,CAFC,MAAO2D,GACL,OAAO,IACV,CACJ,CA7CD,CArK0FqY,EAAef,GACjEhb,IACAuR,EAAiC,EAAhBmB,EAAoB1S,IAGpCoH,IAAoBxH,EAAAs0B,EAAAk5H,mDACzB77I,EAAiBxK,EAAwB4V,EAAgBjK,IAG7DhP,EAAYgpJ,SAAS,CACjB1wI,OAAQtJ,EACRwJ,MAAO8c,MAAMxmB,GAAcE,EAAgBF,EAC3CmkE,kBAAA,EACAxpC,KAAM57B,EACNwwD,QAAA,GAEP,CAEDr+D,EAAY0H,SAASA,SAAWqL,EAAUsO,MAC7C,CAGD,OAFArhB,EAAYy+G,cACZz+G,EAAYipJ,OAEf,CAED,GAAIh8I,GAASA,EAAM5Q,OAAS,EAAG,CAC3B0W,EA2FxB,SAA0B/S,EAAWoN,GACjC,GAAyB,IAArBpN,EAAU3D,OACV,OAAO+Q,EAEX,IAAMzJ,EAAS,IAAIgT,WAAW3W,EAAU3D,OAAS+Q,EAAK/Q,QAGtD,OAFAsH,EAAOkW,IAAI7Z,GACX2D,EAAOkW,IAAIzM,EAAMpN,EAAU3D,QACpBsH,CACV,CARD,CA3FqDoP,EAAW9F,GACxC+B,GAAiB/B,EAAM5Q,OAEvB4c,EAAe8H,KAAK,CAChBsiD,GAAIxrD,KAAK6H,MACTyG,MAAOlZ,EAAM5Q,SAGbqH,IAAoBxH,EAAAs0B,EAAAmzG,+CAA2DlxH,GAE7DvF,EAAUy8I,2BAA2B,CAAC,QAAS52I,EAAWgD,GAC9D6zI,QAEVn3I,GAAA,EACA4F,EAAc0I,KAAK,CACfsiD,GAAIjvC,YAAY1U,MAChByG,MAAOlZ,EAAM5Q,UAKzB,IAAM2R,EAAYd,EAAUy8I,2BAA2B,CAAC,OAAQ,QAAS52I,EAAWgD,GACpF,GAAI/H,EAAU47I,MAAO,CACjB,IAeInmJ,EAfEY,EAAM2J,EAAU67I,oBAAsB77I,EAAU8U,KAGlDpf,IAAoBxH,EAAAs0B,EAAAmzG,+CAA4DlxH,IAChFA,GAAA,EACA6E,EAAYyJ,KAAK,CACbsiD,GAAIjvC,YAAY1U,MAChByG,MAAOpT,EAAU1W,UASrBgI,IAAQ0O,EAAU1W,QAClBoH,EAAOsP,EACPA,EAAY,IAAI4D,aAEhBlT,EAAO,IAAIkT,WAAW5D,EAAUkP,SAAS,EAAG5d,IAC5C0O,EAAYA,EAAUkP,SAAS5d,IAInCrE,EAAYgpJ,SAAS,CACjB5iJ,KAAM3C,EAAK4d,OACX4xD,kBAAA,EACA62E,SAAA,IAGJ/zI,EAAS,CACZ,MACGA,EAAS/H,EAAU67I,oBAGd1tJ,IACD6D,EAAYgpJ,SAAS,CACjB/1E,kBAAA,EACA62E,SAAA,IAEJ3tJ,GAAA,EAGX,CACDgI,EAAKnE,EAAaoN,EACrB,GAEJ,IAjND61B,OAkNW,SAAU71B,GACTpN,EAAY6I,SACZ7I,EAAY6I,QAAQuE,EAE3B,GACR,GACR,CAED,SAASjJ,EAAKnE,EAAaoN,GACvBpN,EAAYypJ,OAAOlgJ,OACdy5B,KAAK51B,GADV61B,OAEW,SAAU71B,GACTpN,EAAY6I,SAA2C,MAAhC7I,EAAY0H,SAASE,QAE5C5H,EAAY6I,QAAQuE,EAE3B,GACR,CA4BD,SAAS/J,EAAwBrD,EAAgBoN,GAC7C,IAEI,IADApN,EAAiBA,EAAeqX,QAAO,SAAA1T,GAAI,OAAIA,EAAKwiB,MAAU/Y,EAAgB,EAAKpN,EAAe3D,MAAvD,KACxBA,OAAS,EAAG,CAC3B,IAAIsH,EAAO,EACLsJ,GAAmBjN,EAAeA,EAAe3D,OAAS,GAAGgnE,GAAKrjE,EAAe,GAAGqjE,IAAMrjE,EAAe3D,OAS/G,OARA2D,EAAe0J,SAAQ,SAAC0D,EAAM9Q,GAE1B,IAAMJ,EAAO8D,EAAe1D,EAAQ,GACpC,GAAIJ,EAAM,CACN,IAAM2R,EAAW3R,EAAKmnE,GAAKj2D,EAAKi2D,GAChC1/D,GAAQkK,EAAWZ,EAAkBY,EAAW,CACnD,CACJ,IACMlK,CACV,CACD,OAAO,IAGV,CAFC,MAAO3D,GACL,OAAO,IACV,CACJ,CAwDD,OAPAoN,EAAW,CACP4lB,KApZJ,SAAchzB,GACN1D,GAAmBA,EAAgBytJ,eAAA,EACnC1pI,EAAA/c,GAActD,EAAa1D,GACtB0mC,MAAK,kBAAMv/B,EAAQzD,EAAd,IAGVyD,EAAQzD,EAEf,EA6YGoK,MAvFJ,SAAepK,GACX,GAAIA,EAAQ6oJ,gBAER7oJ,EAAQ6oJ,gBAAgBz+I,aACrB,GAAIpK,EAAQypJ,OAEf,IACIzpJ,EAAQypJ,OAAOt/I,SACfnK,EAAQ2I,SAIX,CAHC,MAAO3I,GAGR,CAER,EA0EGgqJ,wBAAyB3mJ,EACzB4mJ,MA3ZJ,SAAejqJ,GACX2D,EAAc3D,EAAIs0I,WACrB,GA4ZMlnI,CACV,CAEDiV,GAAYs3G,sBAAwB,cAEpC,IACAr3G,GADgBne,EAAAqsB,EAAAyqG,gBAA6B54G,IAAAD,GAAAze,EAAA,eAAA4e,GAAAviB,EAAAoN,GAAA,QAAAzJ,EAAA,EAAAA,EAAAyJ,EAAA/Q,OAAAsH,IAAA,KAAAsJ,EAAAG,EAAAzJ,GAAAsJ,EAAAmvD,WAAAnvD,EAAAmvD,aAAA,EAAAnvD,EAAA6wE,cAAA,YAAA7wE,IAAAA,EAAAmuH,UAAA,GAAAt+H,OAAAmC,eAAAe,EAAAiN,EAAA9P,IAAA8P,EAAA,MCzY7CkV,GAzCM,WACF,SAAAniB,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAA3oD,GACVsW,KAAK2B,GAAK,KACV3B,KAAK+F,OAAS,EACd/F,KAAK6xH,WAAa,KAClB7xH,KAAKkzH,gBAAkB,KACvBlzH,KAAKyzH,eAAiB,KACtBzzH,KAAKoxB,OAAS,KACdpxB,KAAK0+C,SAAW,KAChB1+C,KAAK4zI,iBAAmB,KACxB5zI,KAAKs9H,gBAAkBjgG,IACvBr9B,KAAKqO,UAAY,EACjBrO,KAAKo9H,YAAc,EACnBp9H,KAAKu9H,WAAa,KAClBv9H,KAAKkzB,MAAQ,KACblzB,KAAK6zI,uBAAyB,EAE9B7zI,KAAKunI,cAAgBlqG,IAErBr9B,KAAKi0H,yBAA2B,CAAEC,iBAAkB,EAAGK,+BAAgCl3F,KACvFr9B,KAAKoyH,UAAY/0F,IACjBr9B,KAAKjR,MAAQsuC,IACbr9B,KAAKhR,OAASquC,IACdr9B,KAAK8zI,SAAW,KAChB9zI,KAAK+zI,eAAiB12G,IACtBr9B,KAAK29H,uBAAyB,EAC9B39H,KAAK6yH,0BAAA,EACL7yH,KAAK4kB,UAAY,IACpB,KAAAv3B,EAAA,OAAAA,EAAA,EAAAxG,IAAA,oBAAA2K,MAED,WACI,OAAgC,OAAxBwO,KAAKyzH,gBAA0C,OAAfzzH,KAAKkzB,KAChD,IAAArsC,IAAA,cAAA2K,MAED,WACI,OAAOwO,KAAKkzH,kBAAoB37H,EAAA2iB,EAAAw6G,UAC5B10H,KAAKkzH,kBAAoB37H,EAAA2iB,EAAAy6G,eACxB30H,KAAKu9H,UACb,MAAAtxH,GAVAviB,EAUAjD,UAAA4G,GAAA3D,CAAA,CAtCC,GCKN2iB,GAPI,SAAA3iB,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAA3oD,GACVsW,KAAK8xH,OAAS,KACd9xH,KAAK+F,OAAS,EACd/F,KAAKrY,KAAO,IACf,ECLCwkB,GACF,SAAAziB,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAA3oD,GACVsW,KAAK2B,GAAK,KACV3B,KAAK+F,OAAS,EACd/F,KAAK0B,SAAW27B,IAChBr9B,KAAKsC,MAAQ+6B,IACbr9B,KAAK+xH,IAAM,KACX/xH,KAAKq0H,aAAe,IACvB,EAGLloH,GAAO6nI,WAAa,YAEpB,IAAAznI,GAAAJ,GCCAC,GAbI,SAAA1iB,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAA3oD,GACVsW,KAAKgyH,SAAW,KAChBhyH,KAAKi0I,2BAA6B,EAClCj0I,KAAK2yH,sBAAwB,KAC7B3yH,KAAK4yH,oBAAsB16H,OAAO2oB,kBAClC7gB,KAAKk0I,qBAAuBh8I,OAAO2oB,kBACnC7gB,KAAKm0I,mBAAqBj8I,OAAO2oB,kBACjC7gB,KAAKo0I,YAAc,KACnBp0I,KAAKq0I,oBAAsBh3G,IAC3Br9B,KAAKs0I,0BAA4Bj3G,GACpC,EAAAnxB,GAAA7e,EAAA,MCCLqgB,GAXI,SAAAhkB,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAA3oD,GACVsW,KAAKrY,KAAO,GACZqY,KAAK0B,SAAW27B,IAChBr9B,KAAK2kC,iBAAmBtH,IACxBr9B,KAAK2B,GAAK07B,IACVr9B,KAAKu0I,YAAc,GACnBv0I,KAAKw0I,YAAc,KACnBx0I,KAAK4kC,sBAAwBvH,GAChC,ECLC5wB,GACF,SAAA/iB,EAAYoN,EAAKzJ,EAAiBsJ,EAAU3Q,IAAA,SAAA0D,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAQ,KAAA3oD,GAChDsW,KAAKlU,IAAMgL,GAAO,GAClBkJ,KAAK0xH,gBAAkBrkI,GAAmByJ,GAAO,GAGjDkJ,KAAKy0I,YAAc99I,GATE,EAUrBqJ,KAAK00I,UAAY1uJ,GATE,EAWnBga,KAAK29H,uBAAyB,EAC9B39H,KAAK6yH,0BAAA,EACL7yH,KAAK2xH,YAAc,CAAC,CAKvB,EAGLllH,GAAQkoI,qBAtBqB,EAuB7BloI,GAAQmoI,mBAtBmB,EAwB3B,IAAAloI,GAAAD,GCdAQ,GAXI,SAAAvjB,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAA3oD,GACVsW,KAAK60I,YAAc,KACnB70I,KAAK4xH,eAAiB,KACtB5xH,KAAK8xH,OAAS,KACd9xH,KAAKqO,UAAY,EACjBrO,KAAKxO,MAAQ,GACbwO,KAAKykC,YAAc,GACnBzkC,KAAK6zI,uBAAyB,CACjC,ECGLlnI,GAXI,SAAAjjB,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAA3oD,GACVsW,KAAK2B,GAAK,KACV3B,KAAK80I,QAAA,EACL90I,KAAKrY,KAAO,UACZqY,KAAK+0I,kBAAoB,KACzB/0I,KAAKg1I,cAAgB,KACrBh1I,KAAK2kC,iBAAmBtH,IACxBr9B,KAAKi1I,UAAY,IACpB,ECCL7nI,GATI,SAAA1jB,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAA3oD,GACVsW,KAAKk1I,uBAAyB,KAC9Bl1I,KAAKm1I,4BAA8B,GACnCn1I,KAAKo1I,kBAAA,EACLp1I,KAAKq1I,UAAY,KACjBr1I,KAAKs1I,mBAAA,CACR,WAAAhpI,GAAA5iB,EAAAoN,GAAA,QAAAzJ,EAAA,EAAAA,EAAAyJ,EAAA/Q,OAAAsH,IAAA,KAAAsJ,EAAAG,EAAAzJ,GAAAsJ,EAAAmvD,WAAAnvD,EAAAmvD,aAAA,EAAAnvD,EAAA6wE,cAAA,YAAA7wE,IAAAA,EAAAmuH,UAAA,GAAAt+H,OAAAmC,eAAAe,EAAAiN,EAAA9P,IAAA8P,EAAA,MCsBL2W,GA3BM,WACF,SAAA5jB,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAA3oD,GACVsW,KAAKykC,YAAc,KACnBzkC,KAAKxO,MAAQ,KACbwO,KAAK2B,GAAK,IACb,KAAAtU,EAAA,OAAAA,EAAA,EAAAxG,IAAA,OAAA2K,MAED,SAAK9H,GAgBD,OAfIA,IACAsW,KAAKykC,YAAc/6C,EAAK+6C,YAAc/6C,EAAK+6C,YAAc,KACzDzkC,KAAKxO,MAAQ9H,EAAK8H,MAAQ9H,EAAK8H,MAAQ,KACvCwO,KAAK2B,GAAKjY,EAAKiY,GAAKjY,EAAKiY,GAAK,KAE1BjY,EAAK6N,EAAA2iB,EAAAkgH,WACLp6H,KAAKu1I,OAAS7rJ,EAAK6N,EAAA2iB,EAAAkgH,UAEnB1wI,EAAK6N,EAAA2iB,EAAAmgH,gBACLr6H,KAAKw1I,YAAc9rJ,EAAK6N,EAAA2iB,EAAAmgH,eAExB3wI,EAAK6N,EAAA2iB,EAAAogH,kBACLt6H,KAAKy1I,cAAgB/rJ,EAAK6N,EAAA2iB,EAAAogH,kBAG3Bt6H,IACV,MAAAsM,GAnBA5iB,EAmBAjD,UAAA4G,GAAA3D,CAAA,CAxBC,GAAAskB,GAAA3gB,EAAA,MAAAkgB,GAAAlgB,EAAAA,EAAA2gB,ICGN,SAASb,KAoBL,MAJW,CACPuoI,SALJ,SAAkBhsJ,EAAMoN,GACpB,OAAOyW,KAAU7jB,EAAMoN,EAC1B,EAOJ,CAEDqW,GAAYk2G,sBAAwB,cACpC,IAAAt1G,GAAelgB,EAAAqsB,EAAAopG,oBAAiCn2G,IAAAU,GAAAxgB,EAAA,MCrBhDugB,GAPI,SAAAlkB,EAAYoN,EAAKzJ,IAAA,SAAA3D,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAiB,KAAA3oD,GAC9BsW,KAAKlU,IAAMgL,GAAO,GAClBkJ,KAAK0xH,gBAAkBrkI,GAAmB,KAC1C2S,KAAK2xH,YAAc,CAAC,CACvB,ECIL/kH,GARI,SAAAljB,EAAYoN,EAAKzJ,EAAiBsJ,IAAA,SAAAjN,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAK,KAAA3oD,GACnCsW,KAAKlU,IAAMgL,GAAO,GAClBkJ,KAAK0xH,gBAAkBrkI,GAAmB,KAC1C2S,KAAKsqH,IAAM3zH,GAAO0mC,IAClBr9B,KAAK2xH,YAAc,CAAC,CACvB,WAAA7jH,GAAApkB,EAAAoN,GAAA,IAAAzJ,EAAA7G,OAAAP,KAAAyD,GAAA,GAAAlD,OAAAqC,sBAAA,KAAA8N,EAAAnQ,OAAAqC,sBAAAa,GAAAoN,IAAAH,EAAAA,EAAAoK,QAAA,SAAAjK,GAAA,OAAAtQ,OAAAsC,yBAAAY,EAAAoN,GAAAgvD,UAAA,KAAAz4D,EAAAod,KAAAW,MAAA/d,EAAAsJ,EAAA,QAAAtJ,CAAA,UAAAsgB,GAAAjkB,GAAA,QAAAoN,EAAA,EAAAA,EAAA9O,UAAAjC,OAAA+Q,IAAA,KAAAzJ,EAAA,MAAArF,UAAA8O,GAAA9O,UAAA8O,GAAA,GAAAA,EAAA,EAAAgX,GAAAtnB,OAAA6G,IAAA,GAAA+F,SAAA,SAAA0D,GAAA+V,GAAAnjB,EAAAoN,EAAAzJ,EAAAyJ,GAAA,IAAAtQ,OAAAmvJ,0BAAAnvJ,OAAAu/E,iBAAAr8E,EAAAlD,OAAAmvJ,0BAAAtoJ,IAAAygB,GAAAtnB,OAAA6G,IAAA+F,SAAA,SAAA0D,GAAAtQ,OAAAmC,eAAAe,EAAAoN,EAAAtQ,OAAAsC,yBAAAuE,EAAAyJ,GAAA,WAAApN,CAAA,UAAAmjB,GAAAnjB,EAAAoN,EAAAzJ,GAAA,OAAAyJ,KAAApN,EAAAlD,OAAAmC,eAAAe,EAAAoN,EAAA,CAAAtF,MAAAnE,EAAAy4D,YAAA,EAAA0hB,cAAA,EAAAs9C,UAAA,IAAAp7H,EAAAoN,GAAAzJ,EAAA3D,CAAA,UAAAukB,GAAAvkB,EAAAoN,GAAA,IAAAzJ,EAAA,uBAAAJ,QAAA,MAAAvD,EAAAuD,OAAA85E,UAAA,IAAA7gF,MAAAC,QAAAuD,KAAA2D,EAAAkjB,GAAA7mB,KAAAoN,GAAApN,GAAA,iBAAAA,EAAA3D,OAAA,CAAAsH,IAAA3D,EAAA2D,GAAA,IAAAsJ,EAAA,EAAA3Q,EAAA,oBAAA4Q,EAAA5Q,EAAAqH,EAAA,kBAAAsJ,GAAAjN,EAAA3D,OAAA,CAAAmK,MAAA,IAAAA,MAAA,EAAAsB,MAAA9H,EAAAiN,KAAA,EAAAjN,EAAA,SAAAA,GAAA,MAAAA,CAAA,EAAAqD,EAAA/G,EAAA,WAAAqsD,UAAA,6IAAAzsD,EAAA2R,GAAA,EAAAX,GAAA,SAAAA,EAAA,WAAAvJ,EAAA3D,EAAAuD,OAAA85E,WAAA,EAAA15E,EAAA,eAAA3D,EAAA2D,EAAA05F,OAAA,OAAAxvF,EAAA7N,EAAAwG,KAAAxG,CAAA,EAAAA,EAAA,SAAAA,GAAAkN,GAAA,EAAAhR,EAAA8D,CAAA,EAAAqD,EAAA,eAAAwK,GAAA,MAAAlK,EAAAwiF,QAAAxiF,EAAAwiF,QAAA,YAAAj5E,EAAA,MAAAhR,CAAA,aAAA2qB,GAAA7mB,EAAAoN,GAAA,GAAApN,EAAA,qBAAAA,EAAA,OAAA8kB,GAAA9kB,EAAAoN,GAAA,IAAAzJ,EAAA7G,OAAAC,UAAAC,SAAAE,KAAA8C,GAAA0W,MAAA,uBAAA/S,GAAA3D,EAAA5D,cAAAuH,EAAA3D,EAAA5D,YAAA+B,MAAA,QAAAwF,GAAA,QAAAA,EAAAnH,MAAAojB,KAAA5f,GAAA,cAAA2D,GAAA,2CAAA9B,KAAA8B,GAAAmhB,GAAA9kB,EAAAoN,QAAA,YAAA0X,GAAA9kB,EAAAoN,IAAA,MAAAA,GAAAA,EAAApN,EAAA3D,UAAA+Q,EAAApN,EAAA3D,QAAA,QAAAsH,EAAA,EAAAsJ,EAAA,IAAAzQ,MAAA4Q,GAAAzJ,EAAAyJ,EAAAzJ,IAAAsJ,EAAAtJ,GAAA3D,EAAA2D,GAAA,OAAAsJ,CAAA,CCaL,SAASgY,KACL,IAAIjlB,EACAoN,EACAzJ,EACAsJ,EAEE3Q,EAAUga,KAAK9V,QACf0M,GAAA,EAAWqT,EAAAiQ,GAASl0B,GAAS68H,cAE7BnrH,EAAYQ,OAAOg/D,WAAa,SAAUxtE,GAC5C,MAAwB,iBAAVA,GACVyO,SAASzO,IACT4O,KAAK2Q,MAAMvf,KAAWA,CAC7B,EAMD,SAASyD,EAAYzD,EAAYoN,GAC7B,IAAKpN,EACD,MAAM,IAAIwN,MAAM,6BAGpB,IAAKJ,EACD,MAAM,IAAII,MAAM,uBAIpB,GAAIxN,EAAWyoI,wBAA0BzoI,EAAWyoI,uBAAuBpsI,OAAQ,CAC/E,IAAMsH,EAAsB0hB,EAAwCrlB,EAAWyoI,uBAAuB,IACtG,GAAI9kI,GAAuBA,EAAoBtH,OAAS,GAAK8nB,GAAAsD,EAAAhf,QAAkC9E,EAAoB,GAAGo3C,cAAgB,EAClI,OAAQ3tC,IAASlR,EAAAs0B,EAAA07H,KAExB,CAGD,GAAIlsJ,EAAWmsJ,0BAA4BnsJ,EAAWmsJ,yBAAyB9vJ,OAAS,EAAG,CACvF,GAAI2D,EAAWmsJ,yBAAyB9vJ,OAAS,EAC7C,OAAQ+Q,IAASlR,EAAAs0B,EAAAk7C,MACd,GAAI1rE,EAAWmsJ,yBAAyB,GAAGxpH,cAAgBv1B,EAC9D,OAAO,CAEd,CAED,IAAMH,EAAiBG,IAASlR,EAAAs0B,EAAAmmG,KAAkB,IAAIj6H,OAAO,wBAA0B,IAAIA,OAAO0Q,GAGlG,GAAIpN,EAAWyoI,wBAA0BzoI,EAAWyoI,uBAAuBpsI,OAAQ,CAC/E,IAAMC,EAAS0D,EAAWyoI,uBAAuB,GAAG/gG,OACpD,GAAIz6B,EAAcpL,KAAKvF,GACnB,OAAO,CAEd,CAGD,GAAI0D,EAAW/C,eAAe4Q,EAAA2iB,EAAA+7G,WAC1B,OAAOt/H,EAAcpL,KAAK7B,EAAWg1D,UAIzC,GAAIh1D,EAAWyoI,uBAEX,IADA,IAAIv7H,EACKc,EAAI,EAAGA,EAAIhO,EAAWyoI,uBAAuBpsI,OAAQ2R,IAE1D,IADAd,EAAiBlN,EAAWyoI,uBAAuBz6H,IAChC/Q,eAAe4Q,EAAA2iB,EAAA+7G,WAC9B,OAAOt/H,EAAcpL,KAAKqL,EAAe8nD,UAKrD,OAAO,CACV,CAED,SAAS7wD,EAAgBnE,GACrB,IAAKA,EACD,MAAM,IAAIwN,MAAM,6BAEpB,GAAIxN,EAAW/C,eAAe4Q,EAAA2iB,EAAAi6G,mBAC1BzqI,EAAW/C,eAAe4Q,EAAA2iB,EAAAo6G,mBAC1B5qI,EAAW/C,eAAe4Q,EAAA2iB,EAAAk6G,eAC1B1qI,EAAW/C,eAAe4Q,EAAA2iB,EAAAy6G,cAC1B,OAAO,EAEX,GAAIjrI,EAAWyoI,wBAA0BzoI,EAAWyoI,uBAAuBpsI,OAAS,EAAG,CACnF,IAAM+Q,EAAiBpN,EAAWyoI,uBAAuB,GACzD,GAAIr7H,EAAenQ,eAAe4Q,EAAA2iB,EAAAi6G,mBAC9Br9H,EAAenQ,eAAe4Q,EAAA2iB,EAAAo6G,mBAC9Bx9H,EAAenQ,eAAe4Q,EAAA2iB,EAAAk6G,eAC9Bt9H,EAAenQ,eAAe4Q,EAAA2iB,EAAAy6G,cAC9B,OAAO,CAEd,CACD,OAAO,CACV,CAMD,SAAS5mI,EAAWrE,GAChB,OAAOyD,EAAYzD,EAAY9D,EAAAs0B,EAAAi7C,MAClC,CAED,SAASrnE,EAAUpE,GACf,OAAOyD,EAAYzD,EAAY9D,EAAAs0B,EAAAmmG,KAClC,CAMD,SAASryH,EAAWtE,GAChB,OAAOyD,EAAYzD,EAAY9D,EAAAs0B,EAAA07H,MAClC,CA+GD,SAASpoJ,EAAkB9D,GAKvB,OAJIA,GAAkBxD,MAAMC,QAAQuD,EAAeyoI,yBAC/CzoI,EAAeyoI,uBAAuBx9F,MALnC,SAACjrC,EAAGoN,GAAJ,OAAUpN,EAAE0oI,UAAYt7H,EAAEs7H,SAA1B,IAQA1oI,CACV,CAED,SAAS0D,EAAmB1D,EAAUoN,GAClC,OAAOpN,GAAYA,EAASuoI,gBAAkBv6H,EAAUZ,IAAepN,EAASuoI,eAAen7H,GAAepN,EAASuoI,eAAen7H,GAAao7H,sBAA6B,EACnL,CAED,SAAS19H,EAAe9K,GACpB,OAAOA,GAAYA,EAASuoI,eAAiBvoI,EAASuoI,eAAiB,EAC1E,CA2ID,SAAS75H,EAAa1O,GAClB,IAAIoN,GAAA,EAIJ,OAHIpN,GAAYA,EAAS/C,eAAe,UACpCmQ,EAAapN,EAAS/B,OAAS4P,EAAA2iB,EAAA0+G,SAE5B9hI,CACV,CA4ED,SAASiY,EAAwCrlB,GAC7C,OAAKA,GAAuBA,EAAmBosJ,2BAA8BpsJ,EAAmBosJ,0BAA0B/vJ,OAEnH2D,EAAmBosJ,0BAA0BvmI,KAAI,SAAC7lB,GACrD,MAAO,CACH+6C,YAAa/6C,EAAK+6C,YAClBjzC,MAAO9H,EAAK8H,MAEnB,IAPwI,IAQ5I,CAsKD,SAASsO,EAAoBpW,GACzB,IAAKA,IAAoBA,EAAgBw0I,UACrC,OAAO7gG,IAEX,IAAIvmC,EAAKpN,EAAgBw0I,UAAU,GAC/B7wI,EAAK3D,EAAgBw0I,UAAU,GACnC,OAAOpnI,EAAGnQ,eAAe,KAAOmQ,EAAG/I,EAAKV,EAAGyJ,EAAIA,EAAGA,CACrD,CA4HD,SAAS0B,EAAY9O,EAAYoN,GAC7B,IAAKpN,EACD,MAAM,IAAIwN,MAAM,sCAGpB,IAAI7J,EAAKkf,GAAAynI,WAAoB,IAAMl9I,EAMnC,OAJIpN,EAAW/C,eAAe4Q,EAAA2iB,EAAA5Y,KAAqB5X,EAAWiY,GAAG5b,OAAS,GAAuB,cAAlB2D,EAAWiY,KACtFtU,EAAK3D,EAAWiY,IAGbtU,CACV,CA+ID,SAASxH,EAAgB6D,EAAeoN,EAAgBzJ,GACpD,IACIsJ,EADE3Q,EAAe,GAGrB,IAAK0D,EAAe,OAAO1D,EAE3B,IAAK2Q,EAAI,EAAGA,EAAIjN,EAAc3D,OAAQ4Q,IAAK,CACvC,IAAMC,EAAc,IAAIqW,GAIxB,GAHArW,EAAYyX,UAAY,EACxBzX,EAAYg7H,eAAiB96H,GAEzBpN,EAAciN,GAAGhQ,eAAef,EAAAs0B,EAAA67H,eAGhC,MAAM,IAAI7+I,MAAM,kDAFhBN,EAAY6tC,YAAc/6C,EAAciN,GAAG8tC,YAI3C/6C,EAAciN,GAAGhQ,eAAe4Q,EAAA2iB,EAAAi/G,aAChCviI,EAAYyX,UAAY3kB,EAAciN,GAAG0X,WAEzC3kB,EAAciN,GAAGhQ,eAAe4Q,EAAA2iB,EAAAhI,SAChCtb,EAAYpF,MAAQ9H,EAAciN,GAAGnF,OAEzCxL,EAAaykB,KAAK7T,GAClBA,EAAYk7H,OAASzkI,CACxB,CAED,OAAOrH,CACV,CAwFD,SAASyW,EAAuB/S,GAC5B,IAAMoN,EAAW,GAGXzJ,EAAU3D,EAAKssJ,iBAAmB,CAACtsJ,EAAKusJ,SAC1Ct/I,GAAA,EA6DJ,OA3DAtJ,EAAQipB,MAAK,SAAAjpB,GACT,GAAIA,EAAO,CACP,IAAMrH,EAAU,IAAI0mB,GAChB9mB,EAAOyH,EAAM6oJ,QAAU7oJ,EAoD3B,OAlDIuJ,EAAS66H,WAAW7rI,KAKpB+Q,GAAA,EAMIjN,EAAKusJ,UACLrwJ,EAAOgR,EAASlH,QAAQ9J,EAAM8D,EAAKusJ,WAI3CjwJ,EAAQ8F,IAAMlG,EAOVyH,EAAM1G,eAAe4Q,EAAA2iB,EAAAu7G,mBACrBpoI,EAAMqkI,gBAAgB3rI,OACtBC,EAAQ0rI,gBAAkBrkI,EAAMqkI,gBAEhC1rI,EAAQ0rI,gBAAkB9rI,EAG1ByH,EAAM1G,eAAe4Q,EAAA2iB,EAAAggH,gBACrBl0I,EAAQyuJ,YAAcpnJ,EAAMkK,EAAA2iB,EAAAggH,eAG5B7sI,EAAM1G,eAAe4Q,EAAA2iB,EAAAigH,cACrBn0I,EAAQ0uJ,UAAYrnJ,EAAMkK,EAAA2iB,EAAAigH,aAG1B9sI,EAAM1G,eAAe4Q,EAAA2iB,EAAA6/G,4BACrB/zI,EAAQ23I,uBAAyBtwI,EAAMkK,EAAA2iB,EAAA6/G,2BAGvC1sI,EAAM1G,eAAe4Q,EAAA2iB,EAAA8/G,8BACrBh0I,EAAQ6sI,yBAA+E,UAApDxlI,EAAMkK,EAAA2iB,EAAA8/G,6BAK7CljI,EAAS2T,KAAKzkB,GAEP2Q,CACV,CACJ,IAEMG,CACV,CAYD,SAAS2I,EAA+B/V,GACpC,IAAMoN,EAAQ,IAAIsW,GAiBlB,OAfAtW,EAAMu+I,UAAY3rJ,EAAQwsJ,OAEtBxsJ,EAAQ/C,eAAe4Q,EAAA2iB,EAAAwhH,4BACvB5kI,EAAMo+I,uBAAyBxrJ,EAAQ6N,EAAA2iB,EAAAwhH,0BACvC5kI,EAAMq+I,4BAA8Br+I,EAAMo+I,uBAAuBn9I,MAAM,MAGvErO,EAAQ/C,eAAe4Q,EAAA2iB,EAAAyhH,sBACvB7kI,EAAMs+I,iBAA+E,SAA5D1rJ,EAAQ6N,EAAA2iB,EAAAyhH,oBAAkCroI,eAGnE5J,EAAQ/C,eAAe4Q,EAAA2iB,EAAA0hH,sBACvB9kI,EAAMw+I,kBAAgF,UAA5D5rJ,EAAQ6N,EAAA2iB,EAAA0hH,oBAAkCtoI,eAGjEwD,CACV,CAsPD,OA/DApN,EAAW,CACPysJ,YAAAhpJ,EACAipJ,UAAAtoJ,EACAuoJ,gBAAAxoJ,EACAyoJ,uCArrCJ,SAAgD5sJ,GAC5C,IAAMoN,EAAWpN,GAAcA,EAAW/C,eAAe4Q,EAAA2iB,EAAAq+G,+BAA+C7uI,EAAW6N,EAAA2iB,EAAAq+G,+BAA+C,IAGrI7uI,GAAcA,EAAW/C,eAAe4Q,EAAA2iB,EAAAo+G,wBAAwC5uI,EAAW6N,EAAA2iB,EAAAo+G,wBAAwC,IAE3IllI,SAAQ,SAAC1J,GAAA,IAAA2D,EACtB3D,EAAI/C,eAAe4Q,EAAA2iB,EAAAq+G,gCACnBzhI,EAAS2T,KAATW,MAAAtU,EAAA,SAAApN,GAAA,GAAAxD,MAAAC,QAAAuD,GAAA,OAAA8kB,GAAA9kB,EAAA,EAAA2D,EAAiB3D,EAAI6N,EAAA2iB,EAAAq+G,iCAAA,SAAA7uI,GAAA,uBAAAuD,QAAAA,OAAA85E,YAAAvgF,OAAAkD,GAAA,OAAAxD,MAAAojB,KAAA5f,EAAA,EAAA2D,IAAAkjB,GAAAljB,IAAA,qBAAAglD,UAAA,2IAE5B,IAED,IAAMhlD,EAAoB,GAwC1B,OArCAyJ,EAAS1D,SAAQ,SAAC1J,GACd,IAAMoN,EAAQ,IAAI6V,GAEdjjB,EAAI/C,eAAe4Q,EAAA2iB,EAAA5Y,MACnBxK,EAAMS,EAAA2iB,EAAA5Y,IAAoB5X,EAAI6N,EAAA2iB,EAAA5Y,IAM9B5X,EAAI/C,eAAe4Q,EAAA2iB,EAAAmhH,mBACnBvkI,EAAMS,EAAA2iB,EAAAmhH,iBAAiC3xI,EAAI6N,EAAA2iB,EAAAmhH,iBAM3C3xI,EAAI/C,eAAe4Q,EAAA2iB,EAAAy/G,qBACnB7iI,EAAMS,EAAA2iB,EAAAy/G,mBAAmCjwI,EAAI6N,EAAA2iB,EAAAy/G,mBAM7CjwI,EAAI/C,eAAe4Q,EAAA2iB,EAAA09G,UACnB9gI,EAAMS,EAAA2iB,EAAA09G,QAAsD,UAA9BluI,EAAI6N,EAAA2iB,EAAA09G,SAGlCluI,EAAI/C,eAAe4Q,EAAA2iB,EAAAvB,QACnB7hB,EAAMS,EAAA2iB,EAAAvB,MAAsBjvB,EAAI6N,EAAA2iB,EAAAvB,OAKpCtrB,EAAkBod,KAAK3T,KAC1B,IAEMzJ,CACV,EAioCGkpJ,yBA/nCJ,SAAkC7sJ,GAC9B,IAAIoN,EAAO,GAMX,OAJIpN,GAAcA,EAAW/C,eAAe4Q,EAAA2iB,EAAAg+G,QACxCphI,EAAOpN,EAAWwvB,MAGfpiB,CACV,EAwnCG0/I,0BAtnCJ,SAAmC9sJ,GAC/B,OAAKA,GAAeA,EAAW/C,eAAe4Q,EAAA2iB,EAAAk+G,oBAAqC1uI,EAAW6N,EAAA2iB,EAAAk+G,mBAAiCryI,OACxH2D,EAAW6N,EAAA2iB,EAAAk+G,mBAAiC7oH,KAAK,SAAA7lB,GAEpD,OADW,IAAI4jB,IACL08B,KAAKtgD,EAClB,IAJ6I,EAKjJ,EAinCG+sJ,sBA/mCJ,SAA+B/sJ,GAC3B,OAAKA,GAAeA,EAAW/C,eAAe4Q,EAAA2iB,EAAAm+G,eAAgC3uI,EAAW6N,EAAA2iB,EAAAm+G,cAA4BtyI,OAC9G2D,EAAW6N,EAAA2iB,EAAAm+G,cAA4B9oH,KAAK,SAAA7lB,GAE/C,OADU,IAAI4jB,IACL08B,KAAKtgD,EACjB,IAJmI,EAKvI,EA0mCGgtJ,8BAxmCJ,SAAuChtJ,GACnC,OAAKA,GAAeA,EAAW/C,eAAe4Q,EAAA2iB,EAAAs+G,wBAAyC9uI,EAAW6N,EAAA2iB,EAAAs+G,uBAAqCzyI,OAChI2D,EAAW6N,EAAA2iB,EAAAs+G,uBAAqCjpH,KAAK,SAAA7lB,GAExD,OADU,IAAI4jB,IACL08B,KAAKtgD,EACjB,IAJqJ,EAKzJ,EAmmCGitJ,0CAjmCJ,SAAmDjtJ,GAC/C,OAAKA,GAAeA,EAAW/C,eAAe4Q,EAAA2iB,EAAAu+G,oCAAqD/uI,EAAW6N,EAAA2iB,EAAAu+G,mCAAiD1yI,OACxJ2D,EAAW6N,EAAA2iB,EAAAu+G,mCAAiDlpH,KAAK,SAAA7lB,GAEpE,OADY,IAAI4jB,IACL08B,KAAKtgD,EACnB,IAJ6K,EAKjL,EA4lCGktJ,8CA1lCJ,SAAuDltJ,GACnD,OAAKA,GAAmBA,EAAe/C,eAAe4Q,EAAA2iB,EAAAu+G,oCAAqD/uI,EAAe6N,EAAA2iB,EAAAu+G,mCAAiD1yI,OACpK2D,EAAe6N,EAAA2iB,EAAAu+G,mCAAiDlpH,KAAK,SAAA7lB,GAExE,OADY,IAAI4jB,IACL08B,KAAKtgD,EACnB,IAJyL,EAK7L,EAqlCGmtJ,sBAxiCJ,SAA+BntJ,EAAOoN,EAAUzJ,GAC5C,IAAMsJ,EAAkBvJ,EAAmB0J,EAAUzJ,GACrD,OAAIsJ,EAAgB5Q,OAAS,GAAK2R,EAAUhO,GACjCiN,EAAgBjN,GAEhB,IAEd,EAkiCGotJ,sBAhiCJ,SAA+BptJ,EAAgBoN,EAAUzJ,GACrD,IAAK3D,EACD,OAAQ,EAKZ,IAFA,IAAMiN,EAAkBvJ,EAAmB0J,EAAUzJ,GAE5CzH,EAAI,EAAGA,EAAI+Q,EAAgB5Q,OAAQH,IAExC,GADkBmoB,GAAY/nB,GAAS68H,cACvB6yB,SAAS/+I,EAAgB/Q,GAAI8D,GACzC,OAAO9D,EAIf,OAAQ,CACX,EAkhCGmxJ,mBAxjCJ,SAA4BrtJ,EAAIoN,EAAUzJ,GACtC,IACIsJ,EACA3Q,EAFEJ,EAAkBwH,EAAmB0J,EAAUzJ,GAIrD,IAAKsJ,EAAI,EAAG3Q,EAAMJ,EAAgBG,OAAQ4Q,EAAI3Q,EAAK2Q,IAC/C,GAAI/Q,EAAgB+Q,GAAGhQ,eAAe4Q,EAAA2iB,EAAA5Y,KAAqB1b,EAAgB+Q,GAAGgL,KAAOjY,EACjF,OAAO9D,EAAgB+Q,GAI/B,OAAO,IACV,EA6iCGqgJ,sBAjhCJ,SAA+BttJ,EAAUoN,EAAazJ,GAClD,IACIsJ,EACA3Q,EAFEJ,EAAkBwH,EAAmB1D,EAAUoN,GAG/CS,EAAc,GAEpB,IAAKZ,EAAI,EAAG3Q,EAAMJ,EAAgBG,OAAQ4Q,EAAI3Q,EAAK2Q,IAC3CxJ,EAAYvH,EAAgB+Q,GAAItJ,IAChCkK,EAAYkT,KAAKjd,EAAkB5H,EAAgB+Q,KAI3D,OAAOY,CACV,EAqgCG0/I,eAAAziJ,EACA0iJ,sBApkCJ,SAA+BxtJ,EAAOoN,GAClC,IAAMzJ,EAAcmH,EAAesC,GACnC,OAAIzJ,EAAYtH,OAAS,GAAK2R,EAAUhO,GAC7B2D,EAAY3D,GAEZ,IAEd,EA8jCGytJ,SArgCJ,SAAkBztJ,EAAYoN,EAAkBzJ,GAC5C,IAAIsJ,EAAQ,KAEZ,GAAIjN,GAAcA,EAAWyoI,wBAA0BzoI,EAAWyoI,uBAAuBpsI,OAAS,EAAG,CACjG,IAAMC,EAAiB0R,EAAUZ,IAAqBA,GAAoB,GAAKA,EAAmBpN,EAAWyoI,uBAAuBpsI,OAChI2D,EAAWyoI,uBAAuBr7H,GAAoBpN,EAAWyoI,uBAAuB,GACxFnsI,IACA2Q,EAAQ3Q,EAAe04D,SAAW,YAAc14D,EAAeorC,OAAS,IACpE/jC,QAAA,IAAqBrH,EAAe+I,QACpC4H,GAAS,WAAa3Q,EAAe+I,MAAQ,aAAe/I,EAAegJ,OAAS,KAG/F,CAOD,OAJI2H,IACAA,EAAQA,EAAMzK,QAAQ,oBAAqB,KAGxCyK,CACV,EAk/BGygJ,qBAr3BJ,SAA8B1tJ,GAC1B,IACI,IAAMoN,EAAWpN,QAAA,IAAuBA,EAAa2tJ,kBAAoCn3I,SAASxW,EAAa2tJ,mBAAqB,EAEpI,OAAOr4H,MAAMloB,GAAY,EAAIA,CAGhC,CAFC,MAAOpN,GACL,OAAO,CACV,CACJ,EA82BG4tJ,YAj/BJ,SAAqB5tJ,GACjB,OAAOA,GAAcA,EAAWyoI,wBAA0BzoI,EAAWyoI,uBAAuBpsI,OAAS,EAAI2D,EAAWyoI,uBAAuB,GAAGzzE,SAAW,IAC5J,EAg/BG64F,OA99BJ,SAAgB7tJ,GACZ,OAAKA,GAAeA,EAAW/C,eAAe4Q,EAAA2iB,EAAA+/G,kBAGvCvwI,EAAW6N,EAAA2iB,EAAA+/G,kBAFP,IAGd,EA09BGud,uBAx9BJ,SAAgC9tJ,GAC5B,IAAKA,IAAexD,MAAMC,QAAQuD,EAAW+tJ,eACzC,MAAO,GAKX,IAFA,IAAM3gJ,EAAa,GAEVzJ,EAAI,EAAGA,EAAI3D,EAAW+tJ,cAAc1xJ,OAAQsH,IACjDyJ,EAAW2T,KAAK,CACZyO,KAAMxvB,EAAW+tJ,cAAcpqJ,GAAG6rB,KAClCzL,KAAM/jB,EAAW+tJ,cAAcpqJ,GAAG6oJ,QAAUxsJ,EAAW+tJ,cAAcpqJ,KAI7E,OAAOyJ,CACV,EA08BG4gJ,yBAx8BJ,SAAkChuJ,GAC9B,OAAKA,GAAeA,EAAW/C,eAAe4Q,EAAA2iB,EAAAw+G,4BAA4F,IAAhDhvI,EAAWiuJ,0BAA0B5xJ,OAGxH2D,EAAWiuJ,0BAFP,IAGd,EAo8BG/V,aAAAxpI,EACAw/I,MA37BJ,SAAeluJ,GACX,OAAQA,GAAYA,EAAS6N,EAAA2iB,EAAA5Y,KAAsB,IACtD,EA07BGu2I,WAx7BJ,SAAoBnuJ,EAAUoN,GAC1B,IAAIzJ,GAAA,EAMJ,OAJI3D,GAAYA,EAASouJ,UAAYpuJ,EAASouJ,SAAS/xJ,OAAS,IAC5DsH,GAA+C,IAAxC3D,EAASouJ,SAAS3lJ,QAAQ2E,IAG9BzJ,CACV,EAi7BG0qJ,YA/6BJ,SAAqBruJ,GAYjB,OARIA,GAAYA,EAAS/C,eAAe4Q,EAAA2iB,EAAA4+G,6BACtBpvI,EAAS4qJ,0BAChB5qJ,GAA6B,WAAjBA,EAAS/B,KACduQ,OAAO2oB,kBAEP3oB,OAAOO,kBAAoBP,OAAO4oB,SAIvD,EAm6BGk3H,aAj6BJ,SAAsBtuJ,GAClB,OAAOA,GAAkBA,EAAe0oI,UAAY1oI,EAAe0oI,UAAY/0F,GAClF,EAg6BG46G,wBA95BJ,SAAiCvuJ,GAAmC,IAAzBoN,EAAyB9O,UAAAjC,OAAA,YAAAiC,UAAA,GAAAA,UAAA,GAAH,EACzDqF,EAAQgwC,IAIZ,OAHI3zC,GAAYA,EAAS/C,eAAe4Q,EAAA2iB,EAAA6+G,yBACpC1rI,EAAQ3D,EAAS2qJ,qBAEdr1H,MAAM3xB,GAASA,EAAQiL,KAAKgN,IAAIjY,EAAQyJ,EAAqB,EACvE,EAy5BGohJ,eAv5BJ,SAAwBxuJ,GACpB,OAAOA,GAAYA,EAAS/C,eAAe4Q,EAAA2iB,EAAAghH,cAA8B,IAAI35H,KAAK7X,EAAS6N,EAAA2iB,EAAAghH,eAA+B,IAC7H,EAs5BGid,uBAp5BJ,SAAgCzuJ,GAC5B,OAAOA,GAAcxD,MAAMC,QAAQuD,EAAWyoI,wBAA0BzoI,EAAWyoI,uBAAuBpsI,OAAS,CACtH,EAm5BGqyJ,4BAj5BJ,SAAqC1uJ,GACjC,IAAMoN,EAA0BtJ,EAAkB9D,GAGlD,OAF4BoN,GAA2B5Q,MAAMC,QAAQ2Q,EAAwBq7H,wBAA0Br7H,EAAwBq7H,uBAAyB,IAE7I5iH,KAAI,SAAC7lB,GAC5B,MAAO,CACH0oI,UAAW1oI,EAAmB0oI,UAC9BrjI,MAAOrF,EAAmBqF,OAAS,EACnCC,OAAQtF,EAAmBsF,QAAU,EACrC8kJ,SAAUpqJ,EAAmBoqJ,UAAY,KACzCnyI,GAAIjY,EAAmBiY,IAAM,KAEpC,GACJ,EAq4BG02I,qBA92BJ,SAA8B3uJ,EAAOoN,GACjC,OAAOA,GAAcA,EAAWq7H,wBAA0Br7H,EAAWq7H,uBAAuBpsI,OAAS,GACrG2R,EAAUhO,GAASoN,EAAWq7H,uBAAuBzoI,GAAS,IACjE,EA42BG4uJ,gCAj2BJ,SAAyC5uJ,GACrC,IAEIoN,EACAzJ,EA2JmBsJ,EAEjB3Q,EAhKAJ,EAAoB,GACpBgR,EAXV,SAA8BlN,GAC1B,GAAIA,GAAgBA,EAAaooI,QAAUp6H,EAAUhO,EAAaooI,OAAO/rH,OAAQ,CAC7E,IAAMjP,EAAcpN,EAAaooI,OAAOC,IAAIC,SAASC,eAAevoI,EAAaooI,OAAO/rH,OACxF,GAAIjP,GAAeA,EAAYo7H,uBAAyBx6H,EAAUhO,EAAaqc,OAC3E,OAAOvY,EAAkBsJ,EAAYo7H,sBAAsBxoI,EAAaqc,OAE/E,CACJ,CAPD,CAWyDrc,GAIrD,GAAIkN,GAA2BA,EAAwBu7H,uBAAwB,CAK3E,GAAIzoI,GAAgBA,EAAaooI,QAAUp6H,EAAUhO,EAAaooI,OAAO/rH,OAAQ,CAC7E,IAAM5Y,EAAWsP,EAAuB/S,EAAaooI,OAAOC,IAAIC,UAC5D7kI,IACAE,EAAUF,EAAS,GAE1B,CACD,IAAK,IAAIJ,EAAI,EAAGgB,EAAM6I,EAAwBu7H,uBAAuBpsI,OAAQgH,EAAIgB,IAAOhB,EAAG,CACvF,IAAMiB,EAAqB4I,EAAwBu7H,uBAAuBplI,GACpEK,EAAmB,IAAIye,GA8D7B,GA7DAze,EAAiB2Y,MAAQhZ,EACzBK,EAAiBykI,WAAanoI,EAE1BsE,EAAmBrH,eAAe4Q,EAAA2iB,EAAA5Y,MAClClU,EAAiBuU,GAAK3T,EAAmB2T,IAEzC3T,EAAmBrH,eAAe4Q,EAAA2iB,EAAAjC,UAClC7qB,EAAiBgkC,OAASpjC,EAAmBojC,QAE7CpjC,EAAmBrH,eAAe4Q,EAAA2iB,EAAA+7G,aAClC7oI,EAAiBsxD,SAAW1wD,EAAmBuJ,EAAA2iB,EAAA+7G,YAE/CjoI,EAAmBrH,eAAe4Q,EAAA2iB,EAAA8+G,sBAClC5rI,EAAiBwmJ,iBAAmB5lJ,EAAmB4lJ,kBAEvD5lJ,EAAmBrH,eAAe4Q,EAAA2iB,EAAA++G,YAClC7rI,EAAiBglI,UAAYpkI,EAAmBokI,WAEhDpkI,EAAmBrH,eAAe4Q,EAAA2iB,EAAAu8G,SAClCrpI,EAAiB2B,MAAQf,EAAmBe,OAE5Cf,EAAmBrH,eAAe4Q,EAAA2iB,EAAAw8G,UAClCtpI,EAAiB4B,OAAShB,EAAmBgB,QAE7ChB,EAAmBrH,eAAe4Q,EAAA2iB,EAAAg9G,aAClC9pI,EAAiB0mJ,SAAW9lJ,EAAmB8lJ,UAE/C9lJ,EAAmBrH,eAAe4Q,EAAA2iB,EAAA88G,oBAClC5pI,EAAiB2mJ,eAAiB/lJ,EAAmB+lJ,gBAGrD/lJ,EAAmBrH,eAAe4Q,EAAA2iB,EAAAy6G,eAClC79H,EAAc9I,EAAmBuqJ,YACjCnrJ,EAAiB8lI,gBAAkB37H,EAAA2iB,EAAAy6G,cAC5B3mI,EAAmBrH,eAAe4Q,EAAA2iB,EAAAk6G,eACzCt9H,EAAc9I,EAAmBkvI,aAEjBv2I,eAAe4Q,EAAA2iB,EAAAo6G,kBAC3BlnI,EAAiB8lI,gBAAkB37H,EAAA2iB,EAAAo6G,iBAEnClnI,EAAiB8lI,gBAAkB37H,EAAA2iB,EAAAk6G,aAEhCpmI,EAAmBrH,eAAe4Q,EAAA2iB,EAAAi6G,oBACzCr9H,EAAc9I,EAAmB+vI,iBAEjBp3I,eAAe4Q,EAAA2iB,EAAAo6G,kBAC3BlnI,EAAiB8lI,gBAAkB37H,EAAA2iB,EAAAo6G,iBAEnClnI,EAAiB8lI,gBAAkB37H,EAAA2iB,EAAAi6G,iBAGnCr9H,EAAYnQ,eAAe4Q,EAAA2iB,EAAAi7G,wBAC3B/nI,EAAiBqmI,eAAiB38H,EAAY28H,eAAe17H,MAAM,eAC9DE,KAAKjK,EAAmBokI,WAAWr6H,MAAM,sBAAsBE,KAAKjK,EAAmB2T,MAGhGvU,EAAiB8lI,gBAAkB37H,EAAA2iB,EAAAw6G,SAGvCtnI,EAAiBorJ,oBAAsBzpI,EAAwC/gB,GAE3E8I,EAAa,CACb,GAAIA,EAAYnQ,eAAe4Q,EAAA2iB,EAAAg7G,gBAA+B,CAC1D,IAAM1gI,EAAiBsC,EAAY2hJ,eAE/BjkJ,EAAe7N,eAAe4Q,EAAA2iB,EAAAg/G,cAC9B9rI,EAAiBqmI,eAAiBj/H,EAAekkJ,WAGjDlkJ,EAAe7N,eAAe4Q,EAAA2iB,EAAAw7G,SAC9BtoI,EAAiB8lC,MAAQ1+B,EAAe0+B,MAI/C,MAAUplC,EAAU8I,IACjB/I,EAAgB+I,IAChBA,EAAwB8nD,WACyC,IAAjE9nD,EAAwB8nD,SAASvsD,QAAQ,qBACzC/E,EAAiB8lC,MAAQ,GAGzBp8B,EAAYnQ,eAAe4Q,EAAA2iB,EAAAi/G,aAC3B/rI,EAAiBihB,UAAYvX,EAAYuX,WAEzCvX,EAAYnQ,eAAe4Q,EAAA2iB,EAAAk/G,UAK3BhsI,EAAiBkwI,gBAAkBxmI,EAAY4K,SAAWtU,EAAiBihB,UACpErgB,EAAmBrH,eAAe4Q,EAAA2iB,EAAAi6G,oBACzCr9H,EAAc9I,EAAmB+vI,iBAEjBp3I,eAAe4Q,EAAA2iB,EAAAo6G,oBAC3BlnI,EAAiBkwI,gBAAkBx9H,EAAoBhJ,EAAYmnI,iBAAmB7wI,EAAiBihB,WAG3GvX,EAAYnQ,eAAe4Q,EAAA2iB,EAAA07G,SAC3BxoI,EAAiB8zB,MAAQpqB,EAAYoqB,OAErCpqB,EAAYnQ,eAAe4Q,EAAA2iB,EAAAm/G,gBAC3BjsI,EAAiBgwI,YAActmI,EAAYsmI,aAE3CtmI,EAAYnQ,eAAe4Q,EAAA2iB,EAAA47G,eAC3B1oI,EAAiBmwI,WAAazmI,EAAYymI,YAE1CzmI,EAAYnQ,eAAe4Q,EAAA2iB,EAAAo/G,4BAC3BlsI,EAAiBymJ,uBAAyB/8I,EAAY+8I,uBAAyBzmJ,EAAiBihB,WAEhGvX,EAAYnQ,eAAe4Q,EAAA2iB,EAAA6/G,0BAC3B3sI,EAAiBuwI,uBAAyB7mI,EAAY6mI,uBAC/CtwI,QAAA,IAAWA,EAAQswI,yBAC1BvwI,EAAiBuwI,uBAAyBtwI,EAAQswI,wBAElD7mI,EAAYnQ,eAAe4Q,EAAA2iB,EAAA8/G,4BAC3B5sI,EAAiBylI,yBAAoE,UAAzC/7H,EAAY+7H,yBACjDxlI,QAAA,IAAWA,EAAQwlI,2BAC1BzlI,EAAiBylI,yBAA2BxlI,EAAQwlI,yBAE3D,CAEDzlI,EAAiBm6I,eAoBnBvhJ,GAFiB2Q,EAlBoCvJ,GAoBjBymJ,uBACtBl9I,EAAek7H,WAAWC,OAAOxvH,MAC/Btc,GArBdoH,EAAiB+J,KAAO,CAACzN,EAAaooI,OAAO/rH,MAAOrc,EAAaqc,MAAOhZ,GACxEnH,EAAkB6kB,KAAKrd,EAC1B,CACJ,CAED,OAAOxH,CACV,EA8sBG+yJ,wBA5rBJ,SAAiCjvJ,GAC7B,IAEI2D,EACAsJ,EACA3Q,EAJE4Q,EAAalN,GAAYgO,EAAUhO,EAASqc,OAASrc,EAASqoI,IAAIC,SAASC,eAAevoI,EAASqc,OAAS,KAC5GlY,EAAgB,GAKtB,GAAI+I,GAAcA,EAAWs7H,sBACzB,IAAKlsI,EAAI,EAAGA,EAAI4Q,EAAWs7H,sBAAsBnsI,OAAQC,IACrD2Q,EAAoBC,EAAWs7H,sBAAsBlsI,GACrDqH,EAAkB,IAAIgf,GAClB1V,EAAkBhQ,eAAe4Q,EAAA2iB,EAAA5Y,MACjCjU,EAAgBsU,GAAKhL,EAAkBgL,IAE3CtU,EAAgB0Y,MAAQ/f,EACxBqH,EAAgBykI,OAASpoI,EA7iB1ByD,EA+iBgBwJ,EA/iBQ/Q,EAAAs0B,EAAAk7C,OAgjBnB/nE,EAAgB1F,KAAO/B,EAAAs0B,EAAAk7C,MA5jB5BjoE,EA6jBuBwJ,EA7jBC/Q,EAAAs0B,EAAA3B,OA8jBnBlrB,EAAgB1F,KAAO/B,EAAAs0B,EAAA3B,MAChBxqB,EAAW4I,GAClBtJ,EAAgB1F,KAAO/B,EAAAs0B,EAAAi7C,MAChBrnE,EAAU6I,GACjBtJ,EAAgB1F,KAAO/B,EAAAs0B,EAAAmmG,KAChBryH,EAAW2I,GAClBtJ,EAAgB1F,KAAO/B,EAAAs0B,EAAA07H,MAEvB9+I,EAAOX,KAAK,kCAEhBtI,EAAc4c,KAAKpd,GAI3B,OAAOQ,CACV,EA0pBG+wI,kBAxpBJ,SAA2Bl1I,GACvB,IAMIiN,EACA3Q,EAPE4Q,IAAYlN,GAAM0O,EAAa1O,EAAIsoI,UACnCt6H,EAAY,GACdvK,EAAqB,KACrBU,EAAa,KACbd,EAAmB,KACnBgB,EAAW,KAIf,IAAK/H,EAAI,EAAG2Q,EAAMjN,GAAOA,EAAIsoI,UAAYtoI,EAAIsoI,SAASC,eAAiBvoI,EAAIsoI,SAASC,eAAelsI,OAAS,EAAGC,EAAI2Q,EAAK3Q,KACpH6H,EAAanE,EAAIsoI,SAASC,eAAejsI,IAK1BW,eAAe4Q,EAAA2iB,EAAA4/G,QAC1B/rI,EAAW,IAAIwe,IACNjK,MAAQzU,EAAWyU,MAGA,OAAvBnV,GAA+BA,EAAmBxG,eAAe4Q,EAAA2iB,EAAAk/G,WAAgD,OAArBrsI,GACjGgB,EAAW,IAAIwe,IACNjK,MAAQ9B,YAAYzT,EAAiBuV,MAAQvV,EAAiB2U,UAAUooB,QAAQ,IAG9E,IAAN9jC,GAAY4Q,KACjB7I,EAAW,IAAIwe,IACNjK,MAAQ,GAMI,OAArBvV,GAA6BiyB,MAAMjyB,EAAiB2U,YACnC,OAAb3T,EACAhB,EAAiB2U,SAAWlB,YAAYzS,EAASuU,MAAQvV,EAAiBuV,OAAOwnB,QAAQ,IAEzFhzB,EAAOX,KAAK,sJAIH,OAAbpI,IACAA,EAAS4T,GAAKnJ,EAAY3K,EAAY7H,GACtC+H,EAASgY,MAAQ/f,EACjB+H,EAASgkI,IAAMroI,EAEXmE,EAAWlH,eAAe4Q,EAAA2iB,EAAAk/G,YAC1BrrI,EAAS2T,SAAW7T,EAAW6T,UAG/B3U,IACAA,EAAiBsnI,aAAetmI,EAAS4T,IAG7CjK,EAAU+S,KAAK1c,GACfZ,EAAqBU,EACrBd,EAAmBgB,GAGvBF,EAAa,KACbE,EAAW,KAGf,OAAyB,IAArB2J,EAAU3R,QAOW,OAArBgH,GAA6BiyB,MAAMjyB,EAAiB2U,YACpD3U,EAAiB2U,SAAWlB,YAwEpC,SAAiC9W,IANjC,WACI,IAAK2D,IAAeA,EAAW1G,eAAe,SAC1C,MAAM,IAAIuQ,MAAMtR,EAAAs0B,EAAA+iH,qBAEvB,CAJD,GAQI,IAEInmI,EAFEH,EAAYyB,EAAa1O,EAASqoI,IAAIC,UAa5C,OAVItoI,EAASqoI,IAAIC,SAASsiB,0BACtBx9I,EAAYpN,EAASqoI,IAAIC,SAASsiB,0BAC3B5qJ,EAASgY,SAChB5K,EAAYpN,EAASgY,SACd/K,EACPG,EAAYoB,OAAO2oB,kBAEnBxzB,EAAW6H,MAAM,IAAIwD,EAAAwhB,EAAYta,EAAAwlI,6BAAqC,2FAA4F17I,IAG/JoN,CACV,CAhBD,CAxEwE/J,GAAoBA,EAAiBuV,OAAOwnB,QAAQ,KAP7GpyB,CAWd,EA6kBGkhJ,OA7jBJ,SAAgBlvJ,GACZ,IAAMoN,EAAM,IAAIsV,GA0ChB,OAxCI1iB,IACAoN,EAAIk7H,SAAWtoI,EAEXA,EAAS/C,eAAe4Q,EAAA2iB,EAAAq/G,yBACxBziI,EAAI67H,sBAAwB,IAAIpxH,KAAK7X,EAASipI,sBAAsBnxH,WAEhE9X,EAASsnH,aACTl6G,EAAI67H,sBAAwB,IAAIpxH,KAAK7X,EAASsnH,WAAWxvG,YAI7D9X,EAAS/C,eAAe4Q,EAAA2iB,EAAAs/G,yBACxB1iI,EAAI87H,oBAAsB,IAAIrxH,KAAK7X,EAASkpI,oBAAoBpxH,YAGhE9X,EAAS/C,eAAe4Q,EAAA2iB,EAAA6+G,yBACxBjiI,EAAIu9I,oBAAsB3qJ,EAAS2qJ,qBAGnC3qJ,EAAS/C,eAAe4Q,EAAA2iB,EAAA4+G,+BACxBhiI,EAAIw9I,0BAA4B5qJ,EAAS4qJ,2BAGzC5qJ,EAAS/C,eAAe4Q,EAAA2iB,EAAAqgH,gCACxBzjI,EAAIm9I,2BAA6BvqJ,EAASuqJ,4BAG1CvqJ,EAAS/C,eAAe4Q,EAAA2iB,EAAAu/G,0BACxB3iI,EAAIo9I,qBAAuBxqJ,EAASwqJ,sBAGpCxqJ,EAAS/C,eAAe4Q,EAAA2iB,EAAAw/G,wBACxB5iI,EAAIq9I,mBAAqBzqJ,EAASyqJ,oBAGlCzqJ,EAAS/C,eAAe4Q,EAAA2iB,EAAAghH,gBACxBpkI,EAAIs9I,YAAc,IAAI7yI,KAAK7X,EAAS0qJ,eAIrCt9I,CACV,EAkhBG+hJ,mBAxfJ,SAA4BnvJ,GACxB,IAIIoN,EACAzJ,EALErH,EAAW0D,GAAUA,EAAOqoI,KAAOroI,EAAOqoI,IAAIC,SAAWtoI,EAAOqoI,IAAIC,SAAW,KAC/Ep7H,EAAc5Q,EAAWA,EAASisI,eAAiB,KACnD9kI,EAAeyJ,GAAelN,GAAUgO,EAAUhO,EAAOqc,OAASnP,EAAYlN,EAAOqc,OAAO+yI,oBAAsB,KAClHjrJ,EAAS,GAIf,GAAIV,EACA,IAAK2J,EAAI,EAAGA,EAAI3J,EAAapH,OAAQ+Q,IAAK,CACtC,IAAM/J,EAAc,IAAIkgB,GAIxB,GAHAlgB,EAAY+kI,OAASpoI,EACrBqD,EAAYshB,UAAY,GAEpBlhB,EAAa2J,GAAGnQ,eAAef,EAAAs0B,EAAA67H,eAG/B,MAAM,IAAI7+I,MAAM,kDAWpB,IAbInK,EAAY03C,YAAct3C,EAAa2J,GAAGlR,EAAAs0B,EAAA67H,eAI1C5oJ,EAAa2J,GAAGnQ,eAAe4Q,EAAA2iB,EAAAi/G,aAC/BpsI,EAAYshB,UAAYlhB,EAAa2J,GAAGS,EAAA2iB,EAAAi/G,YAExChsI,EAAa2J,GAAGnQ,eAAe4Q,EAAA2iB,EAAAhI,SAC/BnlB,EAAYyE,MAAQrE,EAAa2J,GAAGS,EAAA2iB,EAAAhI,QAEpC/kB,EAAa2J,GAAGnQ,eAAe4Q,EAAA2iB,EAAAo/G,4BAC/BvsI,EAAY8mJ,uBAAyB1mJ,EAAa2J,GAAGS,EAAA2iB,EAAAo/G,2BAEpDjsI,EAAI,EAAGF,EAAa2J,GAAGiiJ,eAAiB1rJ,EAAIF,EAAa2J,GAAGiiJ,cAAchzJ,OAAQsH,IAAK,CACxF,IAAMU,EAAkBZ,EAAa2J,GAAGiiJ,cAAc1rJ,GAChDS,EAAQ,IAAI4f,GAClB5f,EAAM62C,iBAAmB,EACzB72C,EAAM0mJ,YAAcznJ,EAEhBgB,EAAgBpH,eAAe4Q,EAAA2iB,EAAAy/G,qBAC/B7rI,EAAM62C,iBAAmB52C,EAAgB42C,kBAE7C,IAAM32C,EAAyBjB,EAAY8mJ,uBAAyB9mJ,EAAY8mJ,uBAAyB9mJ,EAAYshB,UAAY,EACjIvgB,EAAMkrJ,2BAA6BlrJ,EAAM62C,iBAAmB53C,EAAYshB,UAAY3kB,EAAO4Y,MAAQtU,EAE/FD,EAAgBpH,eAAe4Q,EAAA2iB,EAAAk/G,YAC/BtrI,EAAM4T,SAAW3T,EAAgB2T,SAAW3U,EAAYshB,WAExDtgB,EAAgBpH,eAAe4Q,EAAA2iB,EAAA5Y,IAC/BxT,EAAM6T,GAAK5T,EAAgB4T,GAE3B7T,EAAM6T,GAAK,KAGX5T,EAAgBkrJ,QAAUlrJ,EAAgBkrJ,OAAOC,OAEjDprJ,EAAMymJ,YAAc59I,EAAOmpH,YAAY/xH,EAAgBkrJ,OAAOC,OAAOxyJ,YAMrEoH,EAAMymJ,YACFxmJ,EAAgBwmJ,aAChBxmJ,EAAgBorJ,SAChBprJ,EAAgBmoJ,OAGxBroJ,EAAO4c,KAAK3c,EACf,CACJ,CAGL,OAAOD,CACV,EAobGurJ,oCAxEJ,SAA6C1vJ,GACzC,IAAMoN,EAAsB,CAAC,EAE7B,GAAIpN,GAAcA,EAAW/C,eAAe4Q,EAAA2iB,EAAAq9G,4BAA2C,KAAAlqI,EAAAsJ,EAAAsX,GAClEvkB,EAAWosJ,2BADuD,IACnF,IAAAn/I,EAAAC,MAAAvJ,EAAAsJ,EAAAtJ,KAAA6C,MAAuD,KAA5ClK,EAA4CqH,EAAAmE,MAC/CxL,EAAGW,eAAef,EAAAs0B,EAAA67H,iBAElBj/I,EAAoB9Q,EAAGJ,EAAAs0B,EAAA67H,gBAAvBpoI,GAAA,GAAuD3nB,GAE9D,CANkF,OAAA0D,GAAAiN,EAAAjN,EAAAA,EAAA,SAAAiN,EAAA5J,GAAA,CAOtF,CACD,OAAO+J,CACV,EA6DGuiJ,2CA3DJ,SAAoD3vJ,GAChD,OAAKA,GAAeA,EAAW/C,eAAe4Q,EAAA2iB,EAAAq9G,6BAA8C7tI,EAAWosJ,0BAA0B/vJ,OAC1H2D,EAAWosJ,0BAA0BvmI,KAAK,SAAA7lB,GAE7C,OADU,IAAI4jB,IACL08B,KAAKtgD,EACjB,IAJ+I,EAKnJ,EAsDG4vJ,wCAAAvqI,EACAwqI,+BAxZJ,SAAwC7vJ,EAAUoN,EAAYzJ,GAC1D,IAAIsJ,EACA3Q,EACAJ,EAYJ,OAVI8D,GAAYA,EAASuoI,gBAAkBn7H,GAAcA,EAAWg7H,QAAUp6H,EAAUZ,EAAWg7H,OAAO/rH,SACtG/f,EAAc0D,EAASuoI,eAAen7H,EAAWg7H,OAAO/rH,SACrC/f,EAAYksI,uBAAyBx6H,EAAUZ,EAAWiP,SACzEngB,EAAkBI,EAAYksI,sBAAsBp7H,EAAWiP,UAE3DpP,EAAgB/Q,EAAgB4zJ,2BAKrC3zJ,EAAgB8Q,EAAe,KAAMtJ,EAC/C,EAyYGosJ,gCAvYJ,SAAyC/vJ,EAAUoN,EAAgBzJ,GAC/D,IAAIsJ,EACA3Q,EACAJ,EACA2R,EAeJ,OAbI7N,GAAYA,EAASuoI,gBAAkBn7H,GAAkBA,EAAe+6H,YAAc/6H,EAAe+6H,WAAWC,QAAUp6H,EAAUZ,EAAe+6H,WAAWC,OAAO/rH,SACrK/f,EAAc0D,EAASuoI,eAAen7H,EAAe+6H,WAAWC,OAAO/rH,SACpD/f,EAAYksI,uBAAyBx6H,EAAUZ,EAAe+6H,WAAW9rH,SACxFngB,EAAkBI,EAAYksI,sBAAsBp7H,EAAe+6H,WAAW9rH,SACvDngB,EAAgBusI,wBAA0Bz6H,EAAUZ,EAAeiP,SACtFxO,EAAsB3R,EAAgBusI,uBAAuBr7H,EAAeiP,UAExEpP,EAAgBY,EAAoBiiJ,2BAM7C3zJ,EAAgB8Q,EAAeG,EAAgBzJ,EACzD,EAoXGqsJ,oBAlXJ,SAA6BhwJ,GACzB,IAAMoN,EAAYsB,EAAa1O,GACzB2D,IAAS3D,GAAWA,EAAS/C,eAAe4Q,EAAA2iB,EAAAq/G,yBAC5C5iI,EAAkBjN,EAAWA,EAASiwJ,kBAAoB,KAC1D3zJ,EAAmB,GAuCzB,OAnCK8Q,GAAazJ,IACVsJ,GAIAA,EAAgBvD,SAAQ,SAAU1J,GAC9B,IAAMoN,EAAQ,IAAIoV,GAAAgO,EAEdxwB,EAAU/C,eAAef,EAAAs0B,EAAA67H,iBACzBj/I,EAAM2tC,YAAc/6C,EAAU+6C,YAU9B/6C,EAAU/C,eAAe4Q,EAAA2iB,EAAAhI,SACzBpb,EAAMtF,MAAQ9H,EAAU8H,MAAM9K,WAUlCV,EAAiBykB,KAAK3T,IACzB,IAIF9Q,CACV,EAuUG4zJ,uBAAAn9I,EACAo9I,8BArnCJ,WACI,OAAO,SAACnwJ,EAAGoN,GAAJ,OAAUpN,EAAE0oI,UAAYt7H,EAAEs7H,SAA1B,CACV,EAonCG0nB,mBAlQJ,SAA4BpwJ,GACxB,GAAIA,GAAYA,EAAS/C,eAAe4Q,EAAA2iB,EAAAuhH,2BAGpC,OAAOh8H,EADS/V,EAAS6N,EAAA2iB,EAAAuhH,2BAAyC,GAKzE,EA2PGse,YApOJ,SAAqBrwJ,GACjB,OAAIA,GAAYA,EAAS/C,eAAe4Q,EAAA2iB,EAAA+gH,mBAC7BvxI,EAAS6N,EAAA2iB,EAAA+gH,mBAAiC1rH,KAAI,SAAC7lB,GAClD,IAAMoN,EAAOpN,EAAMwsJ,QAAUxsJ,EACvB2D,EAAkB3D,EAAM/C,eAAe4Q,EAAA2iB,EAAAu7G,kBAAkC/rI,EAAM6N,EAAA2iB,EAAAu7G,kBAAkC,KAEvH,OAAO,IAAI7nH,GAAY9W,EAAMzJ,EAChC,IAGE,EACV,EA0NG2sJ,iBAxNJ,SAA0BtwJ,GACtB,OAAIA,GAAYA,EAAS/C,eAAe4Q,EAAA2iB,EAAA6gH,yBAC7BrxI,EAAS6N,EAAA2iB,EAAA6gH,yBAAuCxrH,KAAI,SAAC7lB,GACxD,IAAMoN,EAAOpN,EAAMwsJ,QAAUxsJ,EACvB2D,EAAkB3D,EAAM/C,eAAe4Q,EAAA2iB,EAAAu7G,kBAAkC/rI,EAAM6N,EAAA2iB,EAAAu7G,kBAAkC,KACnH9+H,EAAMjN,EAAM/C,eAAe4Q,EAAA2iB,EAAAuhD,KAA4D,IAAvCj7D,WAAW9W,EAAM6N,EAAA2iB,EAAAuhD,MAA6Bp+B,IAElG,OAAO,IAAIzwB,GAAc9V,EAAMzJ,EAAiBsJ,EACnD,IAGE,EACV,EA6MGorI,8BA3MJ,SAAuCr4I,GACnC,OAAOA,GAAOA,EAAI/C,eAAe4Q,EAAA2iB,EAAAqgH,8BAA8C7wI,EAAIuqJ,2BAA6B,IACnH,EA0MG/R,yBAxMJ,SAAkCx4I,GAC9B,OAAOA,GAAOA,EAAI/C,eAAe4Q,EAAA2iB,EAAAq/G,0BAAwE,OAA9B7vI,EAAIipI,sBAAiCjpI,EAAIipI,sBAAsBnxH,UAAY,IACzJ,EAuMGy4I,uBArMJ,SAAgCvwJ,GAC5B,IAAMoN,EAAsB,GAC5B,GAAIpN,GAAYA,EAAS/C,eAAe4Q,EAAA2iB,EAAAsgH,qBAAoC,KAAAntI,EAAAsJ,EAAAsX,GACvDvkB,EAASwwJ,4BAD8C,IACxE,IAAAvjJ,EAAAC,MAAAvJ,EAAAsJ,EAAAtJ,KAAA6C,MAAsD,KAA3ClK,EAA2CqH,EAAAmE,MAE9C5L,EAAK,KACLgR,EAAc,KACdc,EAAU,KACVvK,EAAe,KACfU,EAAmB,KACnBd,EAAqB,KACrBgB,EAAkB,KAEtB,IAAK,IAAMD,KAAQ9H,EACXA,EAAGW,eAAemH,KACdA,IAASyJ,EAAA2iB,EAAA5Y,GACT1b,EAAKI,EAAG8H,GACDA,IAASyJ,EAAA2iB,EAAAugH,0BAChB7jI,EAAc5Q,EAAG8H,GAAM22C,YAChB32C,IAASyJ,EAAA2iB,EAAAwgH,4BAChBhjI,EAAU,CACNs2E,OAAQ9tE,SAASla,EAAG8H,GAAMkgF,QAC1B1oE,IAAKpF,SAASla,EAAG8H,GAAMwX,KACvBD,IAAKnF,SAASla,EAAG8H,GAAMuX,KACvB80I,YAAaj6I,SAASla,EAAG8H,GAAMqsJ,cAE5BrsJ,IAASyJ,EAAA2iB,EAAAygH,kCAChBxtI,EAAe,CACXmY,IAAK9E,WAAWxa,EAAG8H,GAAMwX,KACzBD,IAAK7E,WAAWxa,EAAG8H,GAAMuX,MAEtBvX,IAASyJ,EAAA2iB,EAAA0gH,sCAChB/sI,EAAmB,CACfo2H,UAAWj+H,EAAG8H,GAAMm2H,UACpB3+G,IAAKpF,SAASla,EAAG8H,GAAMwX,KACvBD,IAAKnF,SAASla,EAAG8H,GAAMuX,KACvB2oE,OAAQ9tE,SAASla,EAAG8H,GAAMkgF,QAC1BrmF,KAAM3B,EAAG8H,GAAMnG,KACfyyJ,qBAAsBl6I,SAASla,EAAG8H,GAAMssJ,uBAErCtsJ,IAASyJ,EAAA2iB,EAAA2gH,wCAChB9tI,EAAqB,CACjBk3H,UAAWj+H,EAAG8H,GAAMm2H,UACpB3+G,IAAKpF,SAASla,EAAG8H,GAAMwX,KACvBD,IAAKnF,SAASla,EAAG8H,GAAMuX,KACvB2oE,OAAQ9tE,SAASla,EAAG8H,GAAMkgF,SAEvBlgF,IAASyJ,EAAA2iB,EAAAshH,mBAChBztI,EAAkB0R,EAA+BzZ,EAAG8H,MAKhEgJ,EAAoB2T,KAAK,CACrB9I,GAAA/b,EACA6+C,YAAA7tC,EACA0uE,QAAA5tE,EACA6rB,aAAAp2B,EACAktJ,iBAAAxsJ,EACAysJ,mBAAAvtJ,EACA2qB,gBAAA3pB,GAEP,CA5DuE,OAAArE,GAAAiN,EAAAjN,EAAAA,EAAA,SAAAiN,EAAA5J,GAAA,CA6D3E,CAED,OAAO+J,CACV,EAoIGyjJ,oBA9gCJ,SAA6B7wJ,GACzB,SAAIA,IAAcA,EAAW/C,eAAe4Q,EAAA2iB,EAAAqiH,qBACe,SAAhD7yI,EAAW6N,EAAA2iB,EAAAqiH,kBAIzB,EAygCGie,uBAvgCJ,SAAgC9wJ,GAC5B,SAAIA,IAAcA,EAAW/C,eAAe4Q,EAAA2iB,EAAAsiH,yBACmB,SAApD9yI,EAAW6N,EAAA2iB,EAAAsiH,sBAIzB,EAkgCGie,uCApIJ,SAAgD/wJ,GAC5C,IAAMoN,EAAyB,CAAC,EAEhC,GAAIpN,GAAcA,EAAW/C,eAAe4Q,EAAA2iB,EAAAu9G,+BAA8C,KAAApqI,EAAAsJ,EAAAsX,GACrEvkB,EAAWgxJ,8BAD0D,IACtF,IAAA/jJ,EAAAC,MAAAvJ,EAAAsJ,EAAAtJ,KAAA6C,MAA0D,KAA/ClK,EAA+CqH,EAAAmE,MAClDxL,EAAGW,eAAef,EAAAs0B,EAAA67H,iBAElBj/I,EAAuB9Q,EAAGJ,EAAAs0B,EAAA67H,gBAA1BpoI,GAAA,GAA0D3nB,GAEjE,CANqF,OAAA0D,GAAAiN,EAAAjN,EAAAA,EAAA,SAAAiN,EAAA5J,GAAA,CAOzF,CACD,OAAO+J,CACV,EAyHG6jJ,8CAvHJ,SAAuDjxJ,GACnD,OAAKA,GAAeA,EAAW/C,eAAe4Q,EAAA2iB,EAAAu9G,gCAAiD/tI,EAAWgxJ,6BAA6B30J,OAChI2D,EAAWgxJ,6BAA6BnrI,KAAK,SAAA7lB,GAEhD,OADU,IAAI4jB,IACL08B,KAAKtgD,EACjB,IAJqJ,EAKzJ,EAkHGkxJ,2CAhHJ,SAAoDlxJ,GAChD,IAAMoN,EAAyB,CAAC,EAEhC,GAAIpN,GAAkBA,EAAe/C,eAAe4Q,EAAA2iB,EAAAu9G,+BAA8C,KAAApqI,EAAAsJ,EAAAsX,GAC7EvkB,EAAegxJ,8BAD8D,IAC9F,IAAA/jJ,EAAAC,MAAAvJ,EAAAsJ,EAAAtJ,KAAA6C,MAA8D,KAAnDlK,EAAmDqH,EAAAmE,MACtDxL,EAAGW,eAAef,EAAAs0B,EAAA67H,iBAElBj/I,EAAuB9Q,EAAGJ,EAAAs0B,EAAA67H,gBAA1BpoI,GAAA,GAA0D3nB,GAEjE,CAN6F,OAAA0D,GAAAiN,EAAAjN,EAAAA,EAAA,SAAAiN,EAAA5J,GAAA,CAOjG,CACD,OAAO+J,CACV,EAqGG+jJ,kDAnGJ,SAA2DnxJ,GACvD,OAAKA,GAAmBA,EAAe/C,eAAe4Q,EAAA2iB,EAAAu9G,gCAAiD/tI,EAAegxJ,6BAA6B30J,OAC5I2D,EAAegxJ,6BAA6BnrI,KAAK,SAAA7lB,GAEpD,OADU,IAAI4jB,IACL08B,KAAKtgD,EACjB,IAJiK,EAKrK,EA8FGu3I,UAtEJ,SAAmBv3I,GACVA,IAEDA,EAAOq+I,aACP16I,EAAa3D,EAAOq+I,YAGpBr+I,EAAOoxJ,SACPnkJ,EAASjN,EAAOoxJ,QAEvB,GAnxCGhkJ,GAAA,EAAS/J,EAAAmtB,GAAMl0B,GAAS68H,cAAcK,UAAUx5H,GAo1C7CA,CACV,CAEDilB,GAAkB00G,sBAAwB,oBAC1C,IAAAh0G,GAAexhB,EAAAqsB,EAAAopG,oBAAiC30G,IAAAO,GAAA7hB,EAAA,cAAA+hB,GAAA1lB,EAAAoN,GAAA,IAAAzJ,EAAA,uBAAAJ,QAAA,MAAAvD,EAAAuD,OAAA85E,UAAA,IAAA7gF,MAAAC,QAAAuD,KAAA2D,EAAA,SAAA3D,EAAAoN,GAAA,GAAApN,EAAA,qBAAAA,EAAA,OAAAmlB,GAAAnlB,EAAAoN,GAAA,IAAAzJ,EAAA7G,OAAAC,UAAAC,SAAAE,KAAA8C,GAAA0W,MAAA,uBAAA/S,GAAA3D,EAAA5D,cAAAuH,EAAA3D,EAAA5D,YAAA+B,MAAA,QAAAwF,GAAA,QAAAA,EAAAnH,MAAAojB,KAAA5f,GAAA,cAAA2D,GAAA,2CAAA9B,KAAA8B,GAAAwhB,GAAAnlB,EAAAoN,QAAA,IAAApN,KAAAoN,GAAApN,GAAA,iBAAAA,EAAA3D,OAAA,CAAAsH,IAAA3D,EAAA2D,GAAA,IAAAsJ,EAAA,EAAA3Q,EAAA,oBAAA4Q,EAAA5Q,EAAAqH,EAAA,kBAAAsJ,GAAAjN,EAAA3D,OAAA,CAAAmK,MAAA,IAAAA,MAAA,EAAAsB,MAAA9H,EAAAiN,KAAA,EAAAjN,EAAA,SAAAA,GAAA,MAAAA,CAAA,EAAAqD,EAAA/G,EAAA,WAAAqsD,UAAA,6IAAAzsD,EAAA2R,GAAA,EAAAX,GAAA,SAAAA,EAAA,WAAAvJ,EAAA3D,EAAAuD,OAAA85E,WAAA,EAAA15E,EAAA,eAAA3D,EAAA2D,EAAA05F,OAAA,OAAAxvF,EAAA7N,EAAAwG,KAAAxG,CAAA,EAAAA,EAAA,SAAAA,GAAAkN,GAAA,EAAAhR,EAAA8D,CAAA,EAAAqD,EAAA,eAAAwK,GAAA,MAAAlK,EAAAwiF,QAAAxiF,EAAAwiF,QAAA,YAAAj5E,EAAA,MAAAhR,CAAA,aAAAipB,GAAAnlB,EAAAoN,IAAA,MAAAA,GAAAA,EAAApN,EAAA3D,UAAA+Q,EAAApN,EAAA3D,QAAA,QAAAsH,EAAA,EAAAsJ,EAAA,IAAAzQ,MAAA4Q,GAAAzJ,EAAAyJ,EAAAzJ,IAAAsJ,EAAAtJ,GAAA3D,EAAA2D,GAAA,OAAAsJ,CAAA,CC/1ChD,SAASqY,KAEL,IAAItlB,EACAoN,EACAzJ,EACAsJ,EACA3Q,EACAuR,EACAX,EACAzJ,EACAU,EACAd,EAEAe,EAAUkS,KAAK9V,QACf8D,GAAA,EAAW0J,EAAAwiB,GAASpsB,GAAS+0H,cAC7Br1H,GAAA,EAAWoV,EAAAsX,GAASpsB,GAAS+0H,cAgCjC,SAASz1H,IACLC,EAAe,CACXk5B,GAAI,EACJwxC,IAAK,KACL5lD,GAAI,KACJ+nD,GAAI,KACJtB,IAAK,GAAFtvE,OAAK4lB,GAAAgL,EAAA6gI,gBACRliF,IAAK,MAEThrE,EAAsB,CAAC,EACvBV,EAAa,CAAC,EACdJ,EAA4B,CAAC,EAC7BqL,GACH,CAED,SAAS5D,IACL4D,GACH,CAED,SAASA,IACL,GAAKb,EAAL,CACA,IAAM7N,EAAmB6N,EAAmBsqI,sBAC5C,GAAKn4I,GAC2C,mBAArCA,EAAiBsxJ,gBAA5B,CACA,IAAMlkJ,EAAepN,EAAiBsxJ,kBACjClkJ,IACLF,EAAmBE,EAAamkJ,gBAHkC,CAHnC,CAOlC,CA2CD,SAASlsI,EAAgBrlB,EAAMoN,GAC3B,IAD2CzJ,EACrCsJ,EAAa,CAAC,EADuB3Q,EAAAopB,GAE1BtY,GAF0B,IAE3C,IAAA9Q,EAAA4Q,MAAAvJ,EAAArH,EAAAqH,KAAA6C,MAAiC,KAAxBtK,EAAwByH,EAAAmE,MACzB9H,EAAK9D,KACL+Q,EAAW/Q,GAAQ8D,EAAK9D,GAE/B,CAN0C,OAAA8D,GAAA1D,EAAA0D,EAAAA,EAAA,SAAA1D,EAAA+G,GAAA,CAO3C,OAAO4J,CACV,CAgCD,SAASmJ,EAAsBpW,GAC3B,IAAMoN,EAAkBtJ,EAASsT,MAAMskH,UAAUzrD,KAAK6zD,YAEtD,OAAO9jI,EAAKqX,QAAO,SAAArX,GAAG,OAAIoN,EAAgBiW,SAASrjB,EAA7B,GACzB,CAED,SAAS8O,EAAa9O,GAClB,IAGI,OAAIA,EAAQ/B,OAASkY,EAAAD,EAAAurH,WA4BnBzzH,EAAOgB,KAER2Z,GAxNC,IA0NC3a,GA9BQhO,EAAQ/B,OAASkY,EAAAD,EAAAyrH,oBAsHTv0H,EArHGpN,EAAQu6H,UAuH7Bl3H,EAA0BpG,eAAemQ,KAC1C/J,EAA0B+J,IAAA,GAGzB3J,EAAWxG,eAAemQ,KAC3B3J,EAAW2J,IAAA,GAGVjJ,EAAoBlH,eAAemQ,KACpCjJ,EAAoBiJ,IAAA,GAhG5B,SAAqCpN,GACjC,IAWIoN,EAXEY,EAAOgB,IACP3K,EAiJV,SAA8BrE,GAC1B,IACI,IAAMoN,EAAUpN,EAAQq5G,QAClB11G,EAAc3D,EAAQqpI,UAAUmoB,YAEtC,OAAOh7I,SAAS7S,EAAYyJ,GAASs7H,UAAY,IAGpD,CAFC,MAAO1oI,GACL,OAAO,IACV,CACJ,CATD,CAjJgDA,GACtCoE,EAoKV,SAAqCpE,GACjC,IACI,OAAQs1B,MAAMt1B,EAAQgY,UAAkD27B,IAAtC/kC,KAAKwU,MAAyB,IAAnBpjB,EAAQgY,SAGxD,CAFC,MAAOhY,GACL,OAAO,IACV,CACJ,CAND,CApK0CA,GAChCsE,EA2KV,SAAsCtE,GAClC,IACI,OAAkG,IAA3FwW,SAASvJ,EAAc64I,uBAAuB2L,yBAAyBzxJ,GAAa,IAG9F,CAFC,MAAOA,GACL,OAAO,IACV,CACJ,CAND,CA3K6CA,EAAQu6H,WAC3C72H,EAkLV,SAA4B1D,GACxB,IACI,IAAMoN,EAAezJ,EAAak5B,GAC5B5vB,EAAc3Q,EAAY2kJ,sBAAsBjhJ,GAEtD,OAAKs1B,MAAMloB,IAAkBkoB,MAAMroB,GAI5B,KAHkD,IAA9CuJ,SAAUvJ,EAAcG,EAAgB,GAMtD,CAFC,MAAOpN,GACL,OAAO,IACV,CACJ,CAbD,CAlLkCA,EAAQu6H,WAChCzvH,EAAK3O,EAAsB6D,EAAQu6H,WACnC7rH,EAuJV,SAA8B1O,GAC1B,IACI,IAAMoN,EAAOH,EAAcykJ,qBAAqB1xJ,GAChD,OAAO4O,KAAKwU,MAAMhW,EAAKihB,QAAU,IAGpC,CAFC,MAAOruB,GACL,OAAO,IACV,CACJ,CAPD,CAvJoCA,EAAQu6H,WAClCl1G,EAAK1hB,EAAak5B,GAElBzmB,EA+RV,SAA2BpW,GACvB,GAAKkN,GAAgD,IAA5BA,EAAiB7Q,OAA1C,CADkC,IAAA+Q,EAAAzJ,EAAA+hB,GAENxY,GAFM,IAElC,IAAAvJ,EAAAuJ,MAAAE,EAAAzJ,EAAAA,KAAA6C,MAA8C,KAArCyG,EAAqCG,EAAAtF,MAC1C,GAAImF,EAAgBosH,YAAcr5H,EAC9B,OAAOiN,EAAgBq7I,kBAE9B,CANiC,OAAAtoJ,GAAA2D,EAAA3D,EAAAA,EAAA,SAAA2D,EAAAN,GAAA,CAC4B,CAMjE,CAPD,CA/R0CrD,EAAQu6H,WAG1Cv6H,EAAQu6H,YAAcr+H,EAAAs0B,EAAAi7C,QAAiBr+D,EAxOxC,KAyOCpN,EAAQu6H,YAAcr+H,EAAAs0B,EAAA3B,QAAiBzhB,EA1OxC,KA2OCpN,EAAQu6H,YAAcr+H,EAAAs0B,EAAAmmG,OAElBvpH,EAD+B,oBAA/BpN,EAAQqpI,UAAUr0E,SAxOV,KADX,KAgPL,IAAIlmD,EAAMhL,EAASsT,MAAMskH,UAAUzrD,KAAKzB,IA2DxC,OA1DK1/D,IACDA,EAyRR,SAAuB9O,GACnB,IAEI,IAAIoN,EAAeS,EAAmB0nI,kBACjCnoI,IAAcA,EAAe,GAHlC,IAIMzJ,EAA4C3D,EAA5Cq5G,QAASpsG,EAAmCjN,EAAnCu6H,UAAWj+H,EAAwB0D,EAAxBqpI,UAAWntI,EAAa8D,EAAbgY,SAErC,IAAK1b,EACD,OAAOq3C,IAEX,IAAIzmC,EAAqB/Q,EAAsB8Q,GACpB,IAAvBC,IAA0BA,EAAqB,KACnD,IAKIc,EALU1R,EAAUk1J,YAAY7tJ,GAAS+kI,UAGhBxsI,EAAY,KACvBgR,EAAqBE,EAAgB,KAEnD3J,EAAkBK,EAASsT,MAAMskH,UAAUzrD,KAAK2zD,kBAAoBtuG,MAAMxxB,EAASsT,MAAMskH,UAAUzrD,KAAK2zD,iBAAmB9/H,EAASsT,MAAMskH,UAAUzrD,KAAK2zD,gBAhhB/I,EAqhBd,OAA4C,KAApCptH,SAJWxI,EAAevK,EAIF,KAAO,EAG1C,CAFC,MAAOzD,GACL,OAAO2zC,GACV,CACJ,CA3BD,CAzR4B3zC,IAEnBs1B,MAAMxmB,KACPd,EAAKwgE,IAAM1/D,GAGXsH,IACIpW,EAAQoC,MAAQgU,EAAYhU,IAC5B4L,EAAKqgE,IAAMlnE,mBAAmBqe,GAAAgL,EAAAmhI,eAAqB3xJ,EAAQoC,IAAKgU,EAAYhU,MACrEgU,EAAYozB,QACnBx7B,EAAK4jJ,IAAMx7I,EAAYozB,QAI3BnlC,IACA2J,EAAKyvB,GAAKp5B,GAGV+I,IACAY,EAAK2a,GAAKvb,GAGTkoB,MAAMlxB,KACP4J,EAAK3J,EAAID,GAGRkxB,MAAMhxB,KACP0J,EAAKogE,IAAM9pE,GAGVgxB,MAAM5xB,KACPsK,EAAKmgE,GAAKzqE,GAGT4xB,MAAMxqB,KACPkD,EAAKkgE,GAAKpjE,GAGTwqB,MAAM5mB,KACPV,EAAKygE,GAAK//D,GAGT4mB,MAAMjQ,IAAc,IAAPA,IACdrX,EAAK6uB,GAAKxX,GAGVlhB,EAAoBnE,EAAQu6H,aAC5BvsH,EAAKm/D,IAAA,EACLhpE,EAAoBnE,EAAQu6H,YAAA,IAG5B92H,EAAWzD,EAAQu6H,YAAel3H,EAA0BrD,EAAQu6H,aACpEvsH,EAAK4hE,IAAA,EACLnsE,EAAWzD,EAAQu6H,YAAA,EACnBl3H,EAA0BrD,EAAQu6H,YAAA,GAG/BvsH,CACV,CAnFD,CA/B+ChO,IAC5BA,EAAQ/B,OAASkY,EAAAD,EAAA0rH,kBAkIpC,WACI,IAAM5hI,EAAOgP,IAKb,OAHAhP,EAAK2oB,GAjUH,IAkUF3oB,EAAK4vE,IAAA,EAEE5vE,CACV,CAPD,GAhImBA,EAAQ/B,OAASkY,EAAAD,EAAA+rH,YAA0BjiI,EAAQ/B,OAASkY,EAAAD,EAAAwrH,qBAyI/E,WACI,IAAM1hI,EAAOgP,IAIb,OAFAhP,EAAK2oB,GAtUF,IAwUI3oB,CACV,CAND,GAvImBA,EAAQ/B,OAASkY,EAAAD,EAAA8rH,QAUpC,WACI,IAAM50H,EAAO4B,IAIb,OAFA5B,EAAKub,GA1MO,IA4MLvb,CACV,CAND,GArBuB,IAkBlB,CAFC,MAAOpN,GACL,OAAO,IACV,CAwGL,IAA2BoN,EA5FjBY,CAXT,CAwID,SAASgB,IACL,IAAMhP,EAAO,CAAC,EAEVoN,EAAMtJ,EAASsT,MAAMskH,UAAUzrD,KAAKd,IAAMrrE,EAASsT,MAAMskH,UAAUzrD,KAAKd,IAAMxrE,EAAawrE,IAuB/F,OArBAnvE,EAAKqlB,EA1VQ,EA2VbrlB,EAAKkvE,IAAMprE,EAASsT,MAAMskH,UAAUzrD,KAAKf,IAAMprE,EAASsT,MAAMskH,UAAUzrD,KAAKf,IAAMvrE,EAAaurE,IAEhGlvE,EAAKkvE,IAAL,GAAAtvE,OAAcI,EAAKkvE,KAEf9hE,IACApN,EAAKmvE,IAAL,GAAAvvE,OAAcwN,IAGbkoB,MAAM3xB,EAAak5B,KAA2B,IAApBl5B,EAAak5B,IAAgC,OAApBl5B,EAAak5B,KACjE78B,EAAK68B,GAAKl5B,EAAak5B,IAGvBl5B,EAAa8kB,KACbzoB,EAAKyoB,GAAK9kB,EAAa8kB,IAGvB9kB,EAAa6sE,KACbxwE,EAAKwwE,GAAK7sE,EAAa6sE,IAGpBxwE,CACV,CAqDD,SAAS7D,EAAsB6D,GAC3B,IACI,IAAMoN,EAAc9Q,EAAY2kJ,sBAAsBjhJ,GAEtD,OAAKs1B,MAAMloB,GAIJ,KAHiC,IAA7BoJ,SAAuB,GAAdpJ,EAMvB,CAFC,MAAOpN,GACL,OAAO,IACV,CACJ,CAED,SAAS+S,EAAuB/S,GAC5B,IACI2D,EAAak5B,GAAK78B,EAAK65B,YAG1B,CAFC,MAAO75B,GAER,CACJ,CAED,SAAS+V,EAAkB3I,GACvB,IACI,IACMH,EADYjN,EAAkBk4I,aAAa9qI,EAAKhH,MA5axD,IADD,IA+aS9J,EAAK8Q,EAAK7K,UAA8B,QAAlB6K,EAAK7K,SAlbpC,IADC,IAqbEoB,EAAa8kB,GAAb,GAAA7oB,OAAqBqN,GACrBtJ,EAAa6sE,GAAb,GAAA5wE,OAAqBtD,EAExB,CADC,MAAO0D,GACR,CACJ,CAED,SAAS0V,EAA2B1V,GAChC,IACQA,EAAK2xC,OAAS3xC,EAAKu6H,WACfv6H,EAAK2xC,QAAUttC,EAAAmsB,EAAAylH,eAEV9xI,EAAoBnE,EAAKu6H,aAC1Bp2H,EAAoBnE,EAAKu6H,YAAA,GAExB92H,EAAWzD,EAAKu6H,aACjB92H,EAAWzD,EAAKu6H,YAAA,GAM/B,CAFC,MAAOv6H,GAER,CACJ,CAED,SAASkW,IACL,IAAK,IAAIlW,KAAOmE,EACRA,EAAoBlH,eAAe+C,KACnCmE,EAAoBnE,IAAA,GAI5B,IAAK,IAAIoN,KAAO3J,EACRA,EAAWxG,eAAemQ,KAC1B3J,EAAW2J,IAAA,EAGtB,CAED,SAAS6I,EAAkBjW,GACvB,IACI,IAAKA,EACD,OAAO,KAEX,IAAMoN,EAAOtQ,OAAOP,KAAKyD,GAAUirC,MAAK,SAACjrC,EAAGoN,GAAJ,OAAUpN,EAAE6xJ,cAAczkJ,EAA1B,IAClCzJ,EAASyJ,EAAK/Q,OAEhB4Q,EAAaG,EAAK8f,QAAO,SAAC9f,EAAKH,EAAK3Q,GACpC,MAAY,MAAR2Q,GAAiC,IAAlBjN,EAASiN,KACC,iBAAlBjN,EAASiN,IAA6B,OAARA,GAAwB,OAARA,GAAwB,OAARA,EACrEG,GAAO,GAAJxN,OAAOqN,EAAP,KAAArN,OAAco3B,KAAKC,UAAUj3B,EAASiN,KAEzCG,GAAO,GAAJxN,OAAOqN,EAAP,KAAArN,OAAcI,EAASiN,IAE1B3Q,EAAQqH,EAAS,IACjByJ,GAAO,MAPoCA,CAWlD,GAAE,IAOH,OALAH,EAAaA,EAAWzK,QAAQ,SAAU,KAGlBA,QAAQ,QAAS,GAK5C,CAFC,MAAOxC,GACL,OAAO,IACV,CACJ,CA2DD,OAVAoN,EAAW,CACP0kJ,kBAvdJ,SAA2B9xJ,GACvB,IACI,GAAI8D,EAASsT,MAAMskH,UAAUzrD,MAAQnsE,EAASsT,MAAMskH,UAAUzrD,KAAKhQ,QAAS,CACxE,IAAM7yD,EAAW0B,EAAa9O,GACxB2D,EAqBlB,SAAyB3D,GACrB,IACI,IAAMoN,EAAkBtJ,EAASsT,MAAMskH,UAAUzrD,KAAK6zD,YAEtD,OAAOhnI,OAAOP,KAAKyD,GACdqX,QAAO,SAAArX,GAAG,OAAIoN,EAAgBiW,SAASrjB,EAA7B,IACVktB,QAAO,SAAC9f,EAAKzJ,GAGV,OAFAyJ,EAAIzJ,GAAO3D,EAAS2D,GAEbyJ,CACV,GAAE,CAAC,EAGX,CAFC,MAAOA,GACL,OAAOpN,CACV,CACJ,CAdD,CArBqDoN,GACnCH,EAAqBgJ,EAAkBtS,GAQ7C,OANAW,EAASqwB,QAAQvS,GAAAoO,EAAAuhI,oBAA4C,CACzD3vJ,IAAKpC,EAAQoC,IACbm4H,UAAWv6H,EAAQu6H,UACnBy3B,SAAA5kJ,EACA6kJ,WAAYhlJ,IAET,CACH9P,IAhHY,OAiHZ2K,MAAOmF,EAEd,CAED,OAAO,IAGV,CAFC,MAAOjN,GACL,OAAO,IACV,CACJ,EAicGkyJ,oBAraJ,SAA6BlyJ,GACzB,IACI,GAAI8D,EAASsT,MAAMskH,UAAUzrD,MAAQnsE,EAASsT,MAAMskH,UAAUzrD,KAAKhQ,QAAS,CACxE,IAAM7yD,EAAW0B,EAAa9O,GACxB2D,EAAmB0hB,EAAgBjY,EAAUgJ,EAAsB,CAAC,KAAM,IAAK,KAAM,QACrFnJ,EAAoBoY,EAAgBjY,EAAUgJ,EAAsB,CAAC,KAAM,KAAM,MAAO,MAAO,MAAO,QACtG9Z,EAAmB+oB,EAAgBjY,EAAUgJ,EAAsB,CAAC,KAAM,SAC1Ela,EAAoBmpB,EAAgBjY,EAAUgJ,EAAsB,CAAC,MAAO,KAAM,KAAM,MAAO,KAAM,OACrGvI,EAAU,CACZ,cAAeoI,EAAkBtS,GACjC,eAAgBsS,EAAkBhJ,GAClC,cAAegJ,EAAkB3Z,GACjC,eAAgB2Z,EAAkB/Z,IAStC,OANAoI,EAASqwB,QAAQvS,GAAAoO,EAAAuhI,oBAA4C,CACzD3vJ,IAAKpC,EAAQoC,IACbm4H,UAAWv6H,EAAQu6H,UACnBy3B,SAAA5kJ,EACA9G,QAAAuH,IAEGA,CACV,CAED,OAAO,IAGV,CAFC,MAAO7N,GACL,OAAO,IACV,CACJ,EA0YGu3I,UAtgBJ,SAAmBv3I,GACVA,IAEDA,EAAOy0E,gBACPxnE,EAAgBjN,EAAOy0E,eAGvBz0E,EAAOs0I,cACPh4I,EAAc0D,EAAOs0I,aAGrBt0I,EAAOw+I,qBACP3wI,EAAqB7N,EAAOw+I,oBAEnC,EAyfGxvG,MAbJ,WACI1qC,EAASouB,IAAIruB,EAAAmsB,EAAAqmH,sBAAyC9jI,EAAwBuD,MAC9EhS,EAASouB,IAAIruB,EAAAmsB,EAAA1gB,gBAAmCiG,EAAmBO,MACnEhS,EAASouB,IAAIruB,EAAAmsB,EAAAukH,2BAA8Cr/H,EAA4BtI,GACvF9I,EAASouB,IAAIruB,EAAAmsB,EAAAimH,gBAAmCvgI,EAAmB9I,GAEnE1J,GACH,EAOG2mI,WAhhBJ,WACI/lI,EAAS8tB,GAAG/tB,EAAAmsB,EAAAqmH,sBAAyC9jI,EAAwB3F,GAC7E9I,EAAS8tB,GAAG/tB,EAAAmsB,EAAA1gB,gBAAmCiG,EAAmB3I,GAClE9I,EAAS8tB,GAAG/tB,EAAAmsB,EAAAukH,2BAA8Cr/H,EAA4BtI,GACtF9I,EAAS8tB,GAAG/tB,EAAAmsB,EAAAimH,gBAAmCvgI,EAAmB9I,GAClE9I,EAAS8tB,GAAG/tB,EAAAmsB,EAAA2hI,wBAA2CrnJ,EAAyBsC,EACnF,GAXGpN,EAAoB2lB,GAAkBvhB,GAAS+0H,cAE/Cz1H,IAwhBG0J,CACV,CAEDkY,GAAUq0G,sBAAwB,YAClC,IAAAv0G,GAAejhB,EAAAqsB,EAAAopG,oBAAiCt0G,IAAA,SAAAS,GAAA/lB,GAAA,OAAA+lB,GAAA,mBAAAxiB,QAAA,iBAAAA,OAAA85E,SAAA,SAAAr9E,GAAA,cAAAA,CAAA,WAAAA,GAAA,OAAAA,GAAA,mBAAAuD,QAAAvD,EAAA5D,cAAAmH,QAAAvD,IAAAuD,OAAAxG,UAAA,gBAAAiD,CAAA,EAAA+lB,GAAA/lB,EAAA,UAAAylB,GAAAzlB,EAAAoN,GAAAqY,GAAA,SAAAzlB,EAAAoN,GAAA,WAAAlR,EAAA8D,OAAA,EAAAoN,EAAA,MAAAzJ,EAAAqiB,GAAAtpB,QAAAuQ,EAAAvQ,OAAAK,UAAAT,EAAA,IAAAwoG,QAAA,SAAA5oG,EAAA8D,EAAAoN,EAAAH,GAAA,IAAA/Q,EAAAyH,EAAAzG,KAAA,KAAA8C,EAAAoN,GAAA,OAAA9Q,EAAAud,IAAA3d,EAAA+Q,GAAA3Q,EAAA8a,IAAApX,IAAA9D,CAAA,UAAA2R,EAAA7N,EAAAoN,GAAA,IAAAzJ,EAAArH,EAAA8a,IAAAhK,GAAA,OAAAtQ,OAAAP,KAAAoH,GAAAupB,QAAA,SAAA9f,EAAAH,GAAA,OAAAG,EAAAH,GAAAjN,EAAA2D,EAAAsJ,IAAAG,CAAA,GAAAtQ,OAAA8D,OAAA,cAAAklB,GAAA5pB,EAAAyH,GAAAzH,EAAAa,UAAAgR,KAAA,SAAA/N,GAAA,IAAAoN,EAAAH,EAAAc,KAAA7Q,KAAA,KAAA8C,GAAA,OAAAoN,IAAAA,EAAAw1B,OAAA/0B,EAAAT,EAAA,OAAAA,CAAA,EAAAlR,EAAAa,UAAAwG,OAAAf,SAAA,SAAAxC,EAAAoN,GAAA,oBAAAA,EAAA,KAAAzJ,EAAArH,EAAA8a,IAAA,aAAAnK,EAAA1J,OAAAf,SAAAtF,KAAA,KAAA8C,EAAAoN,EAAA5K,QAAA,yBAAAxC,EAAAoN,GAAA,UAAAzJ,EAAAyJ,EAAA,2BAAAA,EAAA,KAAAlR,EAAA,YAAA+Q,EAAA1J,OAAAf,SAAAtF,KAAA,KAAA8C,GAAA,eAAAA,EAAA,UAAAA,EAAA+gB,KAAAW,MAAA1hB,EAAA1B,WAAA,WAAAynB,GAAA/lB,EAAAA,EAAA3D,OAAA,KAAA2D,EAAA+gB,KAAAlT,EAAA7N,EAAA9D,IAAAkR,EAAAsU,MAAA,KAAA1hB,EAAA,WAAAiN,EAAA1J,OAAAf,SAAAtF,KAAA,KAAA8C,EAAAoN,EAAA,EAAAqY,GAAA/D,MAAA,KAAApjB,UAAA,UAAAwnB,GAAA9lB,EAAAoN,GAAA,sBAAAA,GAAA,OAAAA,EAAA,UAAAu7C,UAAA,sDAAA3oD,EAAAjD,UAAAD,OAAA8D,OAAAwM,GAAAA,EAAArQ,UAAA,CAAAX,YAAA,CAAA0L,MAAA9H,EAAAo7H,UAAA,EAAAt9C,cAAA,KAAA1wE,GAAA0Z,GAAA9mB,EAAAoN,EAAA,UAAA4Y,GAAAhmB,GAAA,IAAAoN,EAAA,mBAAA0/D,IAAA,IAAAA,SAAA,SAAA9mD,GAAA,SAAAhmB,GAAA,UAAAA,IAAA2D,EAAA3D,GAAA,IAAAsoD,SAAAtrD,SAAAE,KAAAyG,GAAA8E,QAAA,yBAAAzI,EAAA,IAAA2D,EAAA,sBAAA3D,EAAA,UAAA2oD,UAAA,kEAAAv7C,EAAA,IAAAA,EAAAkb,IAAAtoB,GAAA,OAAAoN,EAAAgK,IAAApX,GAAAoN,EAAAyM,IAAA7Z,EAAAiN,EAAA,UAAAA,IAAA,OAAA4a,GAAA7nB,EAAA1B,UAAAwpB,GAAA,MAAA1rB,YAAA,QAAA6Q,EAAAlQ,UAAAD,OAAA8D,OAAAZ,EAAAjD,UAAA,CAAAX,YAAA,CAAA0L,MAAAmF,EAAAmvD,YAAA,EAAAg/D,UAAA,EAAAt9C,cAAA,KAAAh3D,GAAA7Z,EAAAjN,EAAA,EAAAgmB,GAAAhmB,EAAA,UAAA6nB,GAAA7nB,EAAAoN,EAAAzJ,GAAA,OAAAkkB,GAAArB,KAAA+2D,QAAAC,UAAA,SAAAx9E,EAAAoN,EAAAzJ,GAAA,IAAAsJ,EAAA,OAAAA,EAAA8T,KAAAW,MAAAzU,EAAAG,GAAA,IAAA9Q,EAAA,IAAAgsD,SAAApoD,KAAAwhB,MAAA1hB,EAAAiN,IAAA,OAAAtJ,GAAAmjB,GAAAxqB,EAAAqH,EAAA5G,WAAAT,CAAA,EAAAurB,GAAAnG,MAAA,KAAApjB,UAAA,UAAAkoB,KAAA,uBAAA+2D,UAAAA,QAAAC,UAAA,YAAAD,QAAAC,UAAAmnD,KAAA,+BAAAC,MAAA,oBAAA9nB,QAAA//G,UAAAF,QAAAK,KAAAqgF,QAAAC,UAAAs/B,QAAA,6BAAA98G,GAAA,mBAAA8mB,GAAA9mB,EAAAoN,GAAA,OAAA0Z,GAAAhqB,OAAA4nI,gBAAA,SAAA1kI,EAAAoN,GAAA,OAAApN,EAAA8oD,UAAA17C,EAAApN,CAAA,EAAA8mB,GAAA9mB,EAAAoN,EAAA,UAAA0a,GAAA9nB,GAAA,OAAA8nB,GAAAhrB,OAAA4nI,eAAA5nI,OAAAuC,eAAA,SAAAW,GAAA,OAAAA,EAAA8oD,WAAAhsD,OAAAuC,eAAAW,EAAA,EAAA8nB,GAAA9nB,EAAA,CC1kBhD,IAAMioB,GAAc,SACdF,GAAe,UACfC,GAA+B,QAC/BE,GAAkCF,GAA+BC,GACjEU,GAAmCX,GAA+BD,GAoBlEU,GASM,SAGNkE,GAAoB,CAxBC,KAQV,KACK,KACT,KAqBP5D,GAA0B,CAC5BxM,MAjBO,IAkBPD,MAnBO,IAoBPyH,KAhBoB,KAiBpBs6C,OAAU51C,IAGRuE,GAAe,UAErB,SAASC,KAEL,IAGIjtB,EACAoN,EACAzJ,EACAsJ,EANE3Q,EAAUga,KAAK9V,QACftE,GAAA,EAAW8R,EAAAwiB,GAASl0B,GAAS68H,cAgBnC,SAAStrH,IACLlK,EAAoB,CAAC,EACrBsJ,EAAqB,CAAC,CACzB,CAED,SAASC,EAAalN,GACbA,GAGLlD,OAAOP,KAAKyD,GAAQ0J,SAAQ,SAAA0D,GACnBuf,GAAkBtJ,SAASjW,WACrBpN,EAAOoN,EAErB,GACJ,CAED,SAASjJ,EAAqBnE,GAE1B,OAAKA,GAIuB,UAAxBA,EAAM4J,gBAINojB,GAAanrB,KAAK7B,GACXwW,SAASxW,EAAO,IAGpBA,EAAMwC,QAAQ,QAAS,IACjC,CAED,SAAS6B,EAAiBrE,GACtB,IAGI,IAFA,IAAM2D,EAAS,CAAC,EACVsJ,EAAQjN,EAAMqO,MAAM,KACjB/R,EAAI,EAAGA,EAAI2Q,EAAM5Q,OAAQC,IAAK,CAEnC,IAAMJ,EAAU+Q,EAAM3Q,GAAG+R,MAAM,KACzBR,EAAM3R,EAAQ,GACdgR,EAAI/I,EAAqBjI,EAAQ,IACvCyH,EAAOkK,GAAOX,CACjB,CACD,OAAOvJ,CAGV,CAFC,MAAO3D,GACLoN,EAAO5B,MAAM,qDAAsDxL,EACtE,CACJ,CAED,SAASoE,EAAkBpE,GACvB,IAOI,IANA,IAAM2D,EAAS,CAAC,EACVsJ,EAAUjN,EAAMqO,MAAM,KAGtB/R,EADQ2Q,EAAQA,EAAQ5Q,OAAS,GACnBgS,MAAM,KAEjBnS,EAAI,EAAGA,EAAII,EAAMD,OAAQH,IAAK,CAEnC,IAAM2R,EAAUvR,EAAMJ,GAAGmS,MAAM,KACzBnB,EAAMW,EAAQ,GACdG,EAAI7J,EAAqB0J,EAAQ,IACvClK,EAAOuJ,GAAOc,CACjB,CACD,OAAOrK,CAIV,CAHC,MAAO3D,GAEL,OADAoN,EAAO5B,MAAM,sDAAuDxL,GAC7D,EACV,CACJ,CAED,SAASsE,EAAuBtE,GAC5B,OAAO+oB,GAAwB/oB,IAhH5B,GAiHN,CAED,SAAS8D,EAA4B9D,EAAYoN,EAAI9Q,GACjD,IAAMJ,EAAS8D,IAAeioB,GAActkB,EAAoBsJ,EAC1DY,EAAW3R,EAAOkR,IAAO,CAAC,EAC1BF,EAAehR,EAAOusB,KAAwB,CAAC,EAErD,OADc5a,EAASvR,IAAQ4Q,EAAa5Q,EAE/C,CAiGD,OAbA0D,EAAW,CACPu3I,UAzKJ,WAAiC,EA0K7BlN,WA5KJ,WAAwB,EA6KpBr7F,MAPJ,WACInhC,GACH,EAMGukJ,qBAtFJ,SAA8BpyJ,EAAiBoN,GAK3C,IAJA,IAAI9Q,EAAe,KACfuR,EAAgB,KACdG,EAAUhO,EAAgBqO,MAAM,QAE7BlK,EAAI6J,EAAQ3R,OAAS,EAAG8H,GAAK,EAAGA,IAAK,CAC1C,IACId,EADW2K,EAAQ7J,GACR+rB,MAAPzK,GAAa,gGAAb,CAAAtoB,IAAA,EAAA2K,MAAA,KACR,GAAIzE,GAAKA,EAAEu/B,OAAQ,CAEf,IAAI9+B,EAAMT,EAAEu/B,OAAOzlC,IAAIyM,cACnBlG,EAAQL,EAAEu/B,OAAO96B,MACrB,OAAQhE,GACJ,KAAKokB,GACD5rB,EAAe+H,EAAiBX,GAChCxH,EAASy4B,QAAQlxB,EAAA+sB,EAAA20G,mBAA2B7oI,GAC5C,MACJ,KAAKqsB,GACI9a,IACDA,EAAgBzJ,EAAkBV,IAMjD,CACJ,CAGD,IAAIoH,EAAK2d,GAmBT,OAlBInsB,GAAgBA,EAAYqsB,GAC5B7d,EAAKxO,EAAYqsB,GACVvb,IACPtC,EAAKxG,EAAuB8I,IAIhCF,EAAavJ,EAAkBmH,IAC/BoC,EAAaD,EAAmBnC,IAG5BxO,IACAqH,EAAkBmH,GAAMhO,OAAO4/E,OAAO/4E,EAAkBmH,IAAO,CAAC,EAAGxO,IAEnEuR,IACAZ,EAAmBnC,GAAMhO,OAAO4/E,OAAOzvE,EAAmBnC,IAAO,CAAC,EAAG+C,IAGlE,CACHwkJ,OAAQ/1J,EACRg2J,QAASzkJ,EAEhB,EAmCG0kJ,cAjCJ,SAAuBvyJ,GACnB,IAAIoN,EAAK9I,EAAuBtE,GAEhC,OADS8D,EAA4BikB,GAAc3a,EAvMhC,QAwMD,CACrB,EA8BGolJ,uBA5BJ,SAAgCxyJ,GAC5B,IAAIoN,EAAK9I,EAAuBtE,GAEhC,OADU8D,EAA4BikB,GAAc3a,EAhNlC,QAiNC,IACtB,EAyBGqlJ,iBAvBJ,SAA0BzyJ,GACtB,IAAIoN,EAAK9I,EAAuBtE,GAEhC,OADS8D,EAA4BikB,GAAc3a,EA9MvC,OA+MK,IACpB,EAoBGslJ,iBAlBJ,SAA0B1yJ,GACtB,IAAIoN,EAAK9I,EAAuBtE,GAEhC,OADS8D,EAA4BikB,GAAc3a,EAnNtC,QAoNI,IACpB,GAxKGA,GAAA,EAAS/J,EAAAmtB,GAAMl0B,GAAS68H,cAAcK,UAAUx5H,GAChD6N,IA0LG7N,CACV,CAEDitB,GAAU0sG,sBAAwB,YAClC,IAAA5sG,GAAe5oB,EAAAqsB,EAAAopG,oBAAiC3sG,ICjQhD,SAASE,KAEL,IASIntB,EACAoN,EAFEzJ,EAAU2S,KAAK9V,QAGjByM,EAAe,CAAC,EAEpB,SAAS3Q,IACL8Q,GAAA,EAAS/J,EAAAmtB,GAAM7sB,GAASw1H,cAAcK,UAAUx5H,EACnD,CAOD,SAAS9D,EAA+B8D,GAUpC,IATA,IAAMoN,EAAS,CAAC,EAEZzJ,EAAO,EACPsJ,EAAO,EACP3Q,EAAQ,EACRJ,EAAS,EACP2R,EAAI7N,EAAkB3D,OAGnB6Q,EAAI,EAAGA,EAAIW,IAAKX,EACrBvJ,GAAQ3D,EAAkBkN,GAAGi8I,4BAC7Bl8I,GAAQjN,EAAkBkN,GAAGgyI,YAC7B5iJ,GAAS0D,EAAkBkN,GAAGi8I,4BAA8BnpJ,EAAkBkN,GAAGgyI,YACjFhjJ,GAAU8D,EAAkBkN,GAAGi8I,4BAA8BnpJ,EAAkBkN,GAAGi8I,4BAMtF,OAHA/7I,EAAO1J,GAAMpH,EAAQqH,EAAOsJ,EAAOY,IAAO3R,EAASyH,EAAOA,EAAOkK,GACjET,EAAOjR,EAAI8Q,EAAOY,EAAIT,EAAO1J,EAAIC,EAAOkK,EAEjC,SAAU7N,GACb,OAAOoN,EAAO1J,EAAI1D,EAAIoN,EAAOjR,CAChC,CACJ,CAED,SAAS0R,EAAsB7N,GAC3B,IACIoN,EADAzJ,GAAA,EAEEsJ,EAA8BjN,EAAiBktB,QAAO,SAACltB,EAAMoN,GAAP,OAAgBpN,EAAOoN,EAAKulJ,uBAA5B,GAAqD,GAAK3yJ,EAAiB3D,OAmBvI,OAlBA2D,EAAiB0J,SAAQ,SAAA1J,GAEjB4O,KAAKC,IAAI7O,EAAE2yJ,wBAA0B3yJ,EAAE4yJ,2BAA6B,MACpEjvJ,GAAA,GAIA3D,EAAE2yJ,wBAA0B1lJ,EAA8B,KAC1DtJ,GAAA,GAICyJ,EAEMA,EAAcpN,EAAEquB,UACvB1qB,GAAA,GAFAyJ,EAAcpN,EAAEquB,OAIvB,IACM1qB,CACV,CA6JD,OATA3D,EAAW,CACPiqJ,MAAA3tJ,EACAitJ,eA7BJ,SAAwBvpJ,EAASoN,EAAyBzJ,EAAmBrH,EAAeuR,GACpF7N,GAAWA,EAAQu6H,YAActtH,EAAajN,EAAQu6H,aACtDttH,EAAajN,EAAQu6H,WAAa,IAEtC,IAAMrtH,EAAelN,EAAQqpI,UAAUmoB,YAAY7gF,MAAK,SAAAvjE,GAAI,OAAIA,EAAK6K,KAAOjY,EAAQupI,gBAAxB,IAC5Dt8H,EAAajN,EAAQu6H,WAAWx5G,KAAK,CACjC1E,MAAOrc,EAAQqc,MACfw2I,MAAO7yJ,EAAQupI,iBACfhP,UAAWv6H,EAAQu6H,UACnBu4B,cAAAx2J,EACAy2J,gCAAiC/yJ,EAAQipI,sBAAsBnxH,UAC/Dk7I,cAAkC,IAAnBhzJ,EAAQgY,SACvBi7I,iBAAkBtvJ,EAAkBupB,QAAO,SAACltB,EAAMoN,GAAP,OAAgBpN,EAAOoN,EAAKg8I,uBAA5B,GAAqD,GAChG8J,aAAcvvJ,EAAkBupB,QAAO,SAACltB,EAAMoN,GAAP,OAAgBpN,EAAOoN,EAAKi8I,UAA5B,GAAwC,GAC/Eh7H,QAASnhB,GAAgBA,EAAaw7H,UACtC8oB,YAAaxxJ,EAAQqpI,UAAUmoB,YAC/B2B,kBAAAxvJ,EACAyvJ,wBAAAhmJ,EACAimJ,0BAAAxlJ,EACAylJ,wBAAyBp3J,EAA+ByH,EAAkB+S,MAAM,MAGhFzJ,EAAajN,EAAQu6H,WAAWl+H,OArNV,IAsNtB4Q,EAAajN,EAAQu6H,WAAWh0G,OAEvC,EAKGwiI,6BAxDJ,SAAsC/oJ,EAASoN,GAC3C,IAAMzJ,EAAwBsJ,EAAajN,EAAQu6H,YAActtH,EAAajN,EAAQu6H,WAAW7jH,OAAO,GAExG,OAAK/S,GAAyBA,EAAsBtH,OAAS,EAClD,EAMNwR,EAAsBlK,GAKpByJ,EAAuB,EA9KR,QA8KoDA,EAAuB,EAJtF,CAKd,EAyCGo8I,+BAhJJ,SAAwCxpJ,GACpC,IAAM2D,EAAkBsJ,EAAajN,EAAQu6H,WAAW7jH,OAAO,GAAGka,MAC5Dt0B,EAAwB2Q,EAAajN,EAAQu6H,WAAW7jH,OAAO,GAG/Dxa,EAA0ByH,EAAgBwvJ,kBAAkBz8I,OAAO,GAAGka,MAAMu4H,4BAClFxlJ,EAAgBivJ,0BAA4BjvJ,EAAgB2vJ,wBAAwBp3J,EAA0B,GAC9GyH,EAAgBgvJ,wBAA0BhvJ,EAAgB2vJ,wBAAwBp3J,GAElF,IAAMgR,EAAiBW,EAAsBvR,GAEvC0R,EAA2Bd,EAtFG,GADK,GA0FzC,GAAIvJ,EAAgB4vJ,gBAvFqB,KAuFH5vJ,EAAgBqvJ,cAAuDrvJ,EAAgByvJ,wBACzH,OAAOzvJ,EAAgByvJ,wBAG3B,IAAKlmJ,GAAkBvJ,EAAgBqvJ,cAAgBrvJ,EAAgByvJ,wBACnE,MA/FqC,GA+F9BzvJ,EAAgByvJ,wBAM3B,GAAIzvJ,EAAgBovJ,iCAAoCpvJ,EAAgBmvJ,cAAgBnvJ,EAAgB0vJ,0BAA6B1vJ,EAAgBqvJ,cACjJ,MAtGqC,GAsG9BrvJ,EAAgByvJ,wBAS3B,IAJA,IAAM3vJ,EAAwBE,EAAgBmvJ,cAAgBnvJ,EAAgB0vJ,0BAA6B1vJ,EAAgBovJ,gCACvH5uJ,EAAiB,EACjBd,EAA0B,EAC1BgB,EAAa,EACRD,EAAQ,EAAGA,EAAQT,EAAgBwvJ,kBAAkB92J,OAAQ+H,IAAS,CAC3E,IAAME,EAAQX,EAAgBwvJ,kBAAkB/uJ,GAChD,GAAIX,EAAuBJ,EAA0BiB,EAAM8kJ,wBACvD,MAEJ/lJ,GAA2BiB,EAAM8kJ,wBACjCjlJ,GAAkBG,EAAM+kJ,WACxBhlJ,GACH,CAQD,GANIZ,EAAuB,GACvB2J,EAAOX,KAAK,2DAKZtI,GAAkBd,GAA2BgB,EAAwD,GAA3CV,EAAgBwvJ,kBAAkB92J,OAAc,CAC1G,IAAMyH,EAAqBK,EAAiBd,EACtCK,EAA0BC,EAAgBuvJ,aAAepvJ,EAE/D,OAAIH,EAAgByvJ,wBAA0B1vJ,EACnCC,EAAgByvJ,wBAA0BplJ,EAE9CtK,EAA0BsK,CACpC,CAMD,IAAIlD,EAAoBnH,EAAgB0qB,QASxC,OARA1qB,EAAgB6tJ,YAAY5kI,MAAK,SAAA5sB,GAC7B,GAAIA,EAAE0oI,UAAY/kI,EAAgB0qB,QAE9B,OADAvjB,EAAoB9K,EAAE0oI,WAAA,CAG7B,IAGG59H,IAAsBnH,EAAgB0qB,QAC/B1qB,EAAgByvJ,wBAA0BplJ,EAE9CA,EAA2BrK,EAAgBuvJ,aAAe,EAAI,IAAOpoJ,CAC/E,GAqEDxO,IAEO0D,CACV,CAEDmtB,GAA0BwsG,sBAAwB,4BAClD,IAAA9sG,GAAe1oB,EAAAqsB,EAAAopG,oBAAiCzsG,IAAAG,GAAA3pB,EAAA,eAAA0pB,GAAArtB,EAAAoN,EAAAzJ,GAAA,OAAAyJ,KAAApN,EAAAlD,OAAAmC,eAAAe,EAAAoN,EAAA,CAAAtF,MAAAnE,EAAAy4D,YAAA,EAAA0hB,cAAA,EAAAs9C,UAAA,IAAAp7H,EAAAoN,GAAAzJ,EAAA3D,CAAA,CCtNhD,SAASutB,GAAWvtB,GAEhBA,EAAMA,GAAO,CAAC,EAEd,IAWIoN,EACAzJ,EACAsJ,EACA3Q,EACAuR,EACAX,EACA/I,EACAE,EACAD,EACAE,EAEaR,EAtBXJ,EAAU4S,KAAK9V,QACfsK,EAAa9K,EAAIq+I,WACjB3vI,EAAc1O,EAAIs0I,YAClBjvH,EAAmBrlB,EAAI4gJ,iBACvBxqI,EAAkBpW,EAAI+mJ,gBACtBj4I,EAAY9O,EAAIglJ,UAChB7oJ,EAAS6D,EAAIkkI,OACbnxH,EAAiB/S,EAAIuyE,gBAAkB,EACvCx8D,GAAA,EAAW/H,EAAAwiB,GAAS9sB,GAASy1H,cAC7BzjH,GAAA,EAAWwD,EAAAsX,GAAS9sB,GAASy1H,cAkCnC,SAASjjH,EAAalW,EAAQoN,GAC1B,IASIY,EATE3K,EAAUrD,EAAOU,QACjBoD,EAAS,GACX3H,GAAA,EACA+c,GAAA,EACAjD,EAAmB,IAAI4B,KACvBoB,EAAgBhD,EAChBoC,EAAyB,EACzBf,EAAkB,KAClB7E,EAAiB,KAGrB,IAAK2D,IAAoB1H,IAAgB5D,EACrC,MAAM,IAAI0C,MAAM,2CAGpB,IA6KI+J,EA7KE1M,EAAuB,SAAS7K,GAClCqD,EAAQslJ,iBAAmB1yI,EAC3B5S,EAAQmwJ,eAAiB,IAAI37I,KAC7BxU,EAAQowJ,cAAgBpwJ,EAAQowJ,eAAiBx9I,EACjD5S,EAAQqwJ,eAAiBjhJ,EAEzB,IAAMrF,EAAcY,EAAYtG,SAAWsG,EAAYtG,SAASc,YAAc,KACxE7E,EAAiBqK,EAAYtG,SAAWsG,EAAYtG,SAASE,OAAS,KACtEqF,EAAkBe,EAAYtG,UAAYsG,EAAYtG,SAASD,sBAAwBuG,EAAYtG,SAASD,wBAC9GuG,EAAYtG,SAAWsG,EAAYtG,SAASF,gBAAkB,KAE5DlL,EAAO2Q,GAAmByI,EAAS0B,MAAMskH,UAAUqI,MAAQruH,EAAS0B,MAAMskH,UAAUqI,KAAK9jE,QAAU97D,EAAUiuJ,qBAAqBnlJ,EAAiB5J,EAAQk3H,WAAa,KAE9K7rH,EAAYilJ,eAAetwJ,EAAS+J,EAAazJ,EAAgBsJ,EAAiBjN,EAAU8D,EAAS,KAAMxH,EAC9G,EAEKgH,EAAe,SAAUtD,GAC3BkZ,GAAA,EAEArO,EAAqB7K,GAEjBqD,EAAQpF,OAASkY,EAAAD,EAAAurH,WACjB/yH,EAAYklJ,kBAAkBvwJ,GAC9B0S,EAAS4e,QAAQlxB,EAAA+sB,EAAAqjI,0BAAkC,CAAEnzJ,QAAA2C,IAE5D,EAEK8V,EAAY,WAKd,GAJI7B,IACAwoB,aAAaxoB,GACbA,EAAkB,OAEiB,IAAnC3T,EAAS8E,QAAQuF,KAGjBrK,EAAS6jB,OAAO7jB,EAAS8E,QAAQuF,GAAc,GAG/CkL,GAGA,GAFA5V,GAAA,GAEI8J,EAAoB,EAAG,CAGvB,IACQsI,EAAS0B,MAAMskH,UAAUuD,mBAAmBQ,+CAAiDp8H,EAAQpF,OAASkY,EAAAD,EAAAyrH,oBAE9Et8G,EAAiByuI,wBAAwB39I,EAAAD,EAAAyrH,sBACzCv0H,GAC5B2I,EAAS4e,QAAQlxB,EAAA+sB,EAAAq0G,wBAK5B,CAFC,MAAO7kI,GAER,CAEDoN,IACA,IAAIH,EAAe,CAAElH,OAAQ/F,GAC7B1D,EAAcykB,KAAK9T,GACnBA,EAAa5E,QAAUK,YAAW,YACe,IAAzCpM,EAAcmM,QAAQwE,KAGtB3Q,EAAckrB,OAAOlrB,EAAcmM,QAAQwE,GAAe,GAE9DiJ,EAAalW,EAAQoN,GACxB,GAAEiY,EAAiB0uI,yBAAyB1wJ,EAAQpF,MACxD,KAAM,CACH,GAAIoF,EAAQpF,OAASkY,EAAAD,EAAA6rH,+BACjB,OAGJj3H,EAAWU,MAAM,IAAIwD,EAAAwhB,EAAY3iB,EAA8BxK,EAAQpF,MAAOoF,EAAQjB,IAAM,oBAAqB,CAC7G1B,QAAS2C,EACTqE,SAAUsG,EAAYtG,YAGtB1H,EAAOwL,OACPxL,EAAOwL,MAAMnI,EAAS,QAAS2K,EAAYtG,SAASG,WAAYmG,EAAYtG,UAG5E1H,EAAO6sD,UACP7sD,EAAO6sD,SAASxpD,EAAS2K,EAAYtG,SAASG,WAErD,CAER,EAwFGxE,EAAQpG,eAAe,kCAA+BoG,EAAQ8lI,0BAAsCnmI,OAAO0wE,OAAkC,gBAAzBrwE,EAAQkD,cAAkClD,EAAQpF,OAASkY,EAAAD,EAAAyrH,qBAC/KpqH,EAAS+K,GAAY5e,GAAS9C,OAAO,CACjCmmJ,gBAAiB3wI,EACjBsyI,0BAAAtkJ,EACA4gJ,UAAWl2I,KAERm7I,MAAM,CACT3V,YAAA5lI,IAEJ+D,EAAiBvW,EAAAs0B,EAAAwjI,kBAAAC,QAEjB18I,GAAA,EAASyJ,GAAAwP,GAAU9sB,GAAS9C,OAAO,CAC/BmmJ,gBAAiB3wI,IAErB3D,EAAiBvW,EAAAs0B,EAAAwjI,kBAAAE,KAGrB,IAAI1jI,EAAU,KACVpX,EAAchD,EAAgB+9I,iBAAmB/9I,EAAgB+9I,iBAAiB9wJ,EAAQjB,KAAOiB,EAAQjB,IAC7G,GAAIsT,EAAS0B,MAAMskH,UAAUzrD,MAAQv6D,EAAS0B,MAAMskH,UAAUzrD,KAAKhQ,QAAS,CACxE,IAAMnmD,EAAWpE,EAAS0B,MAAMskH,UAAUzrD,KAAKn6C,KAC/C,GAAIhc,IAAa5d,EAAAs0B,EAAAqzG,gBAA2B,CACxC,IAAM3/H,EAkElB,SAAsClE,GAClC,IACI,IAAMoN,EAA2B,GAC3BzJ,EAAqBuJ,EAAU4kJ,kBAAkB9xJ,GAMvD,OAJI2D,GACAyJ,EAAyB2T,KAAKpd,GAG3ByJ,CAGV,CAFC,MAAOpN,GACL,MAAO,EACV,CACJ,CAbD,CAlE0EqD,GAC9D+V,EAAcoM,GAAAgL,EAAA4jI,gCAAsCh7I,EAAalV,EACpE,MAAU4V,IAAa5d,EAAAs0B,EAAA6jI,mBACpB7jI,EAAUtjB,EAAUglJ,oBAAoB7uJ,GAE/C,CAED,IAAMokB,EAAkBpjB,EAAsBiwJ,6BAA6BjxJ,EAAQpF,MAGnF,GAAIoF,EAAQ4kI,YAAa,CACrB,IAAMjoH,EAAcljB,OAAOP,KAAK8G,EAAQ4kI,aAAapiH,KAAI,SAAC7lB,GACtD,MAAO,CACH7C,IAAA6C,EACA8H,MAAOzE,EAAQ4kI,YAAYjoI,GAElC,IACDoZ,EAAcoM,GAAAgL,EAAA4jI,gCAAsCh7I,EAAa4G,EACpE,CAED3c,EAAQjB,IAAMgX,EAEdpL,EAAc,CACV5L,IAAKgX,EACLnR,OAAQkO,EAAAD,EAAAq+I,IACRlrJ,gBAAiBoe,EACjB/mB,QAAS2C,EACTo7G,OAxFW,WACPzwG,EAAYtG,SAASE,QAAU,KAAOoG,EAAYtG,SAASE,QAAU,MACrEtE,GAAA,GAEItD,EAAO0uD,SACP1uD,EAAO0uD,QAAQ1gD,EAAYtG,SAASA,SAAUsG,EAAYtG,SAASG,WAAYmG,EAAYtG,SAASc,aAGpGxI,EAAO6sD,UACP7sD,EAAO6sD,SAASxpD,EAAS2K,EAAYtG,SAASG,YAGzD,EA6EGohJ,MAAO9vI,EACPtQ,QAASsQ,EACT6vI,SA1Ia,SAAU57I,GACvB,IAAMzJ,EAAc,IAAIkU,KAEpB1b,IACAA,GAAA,IACKiR,EAAM6lE,kBACN7lE,EAAM6lE,kBAAoB7lE,EAAMoL,QAAUpL,EAAMkL,UACjDjV,EAAQowJ,cAAgB9vJ,IAI5ByJ,EAAM6lE,mBACN5vE,EAAQmxJ,YAAcpnJ,EAAMkL,OAC5BjV,EAAQoxJ,WAAarnJ,EAAMoL,OAG1BpL,EAAM08I,UACPhmJ,EAAOid,KAAK,CACR7T,EAAG+L,EACH5U,EAAG+I,EAAMq8B,KAAOr8B,EAAMq8B,KAAO9lC,EAAYmU,UAAYmB,EAAcnB,UACnE3b,EAAG,CAACiR,EAAMkL,OAASlL,EAAMkL,OAASD,EAAyB,KAG/DY,EAAgBtV,EAChB0U,EAAyBjL,EAAMkL,QAG/BhB,IACAwoB,aAAaxoB,GACbA,EAAkB,MAGlB5B,EAAS0B,MAAMskH,UAAU4F,+BAAiC,IAC1DhqH,EAAkB5O,YAAW,WAEzBpE,EAAOmI,KAAK,iBAAmBuB,EAAY5L,IAAM,4BACjD4L,EAAYtG,SAASiB,QAAU,KAC/BqF,EAAYqM,OAAOjQ,MAAM4D,GACzBmL,GACH,GAAEzD,EAAS0B,MAAMskH,UAAU4F,iCAG5BthI,EAAOgpJ,UAAY57I,GACnBpN,EAAOgpJ,SAAS57I,EAEvB,EA8FGzE,QA9EY,WACZkC,GAAA,GAEIyM,IACAwoB,aAAaxoB,GACbA,EAAkB,MAElBtX,EAAOoK,OACPpK,EAAOoK,MAAM/G,EAEpB,EAqEG0F,UAnEc,SAAU/I,GACxB,IAAIoN,EACJ,GAAIpN,EAAMizE,iBAAkB,CACxB,IAAItvE,EAAsB3D,EAAMsY,OAAStY,EAAMwY,MAAS,IACxDpL,EAAiB,4BAA8BpN,EAAMsY,OAAS,aAAetY,EAAMwY,MAAQ,MAAQ7U,EAAmBy8B,QAAQ,GAAK,aACtI,MACGhzB,EAAiB,gDAErB9I,EAAOmI,KAAKW,EACf,EA2DGiN,OAAQ9C,EACRlP,QAAS0K,EACTzM,QAASkqB,GAIb,IAAI/T,GAAM,IAAI5E,MAAOC,UACrB,GAAIwd,MAAMjyB,EAAQ8hJ,mBAAqB1oI,GAAOpZ,EAAQ8hJ,iBAElDxhJ,EAASod,KAAK/S,GACduJ,EAAOyb,KAAKhlB,OACT,CAEH,IAAI2R,EAAiB,CAAE+0I,YAAa1mJ,GACpCf,EAAgB8T,KAAKpB,GACrBA,EAAeg1I,aAAejsJ,YAAW,WACrC,IAAiD,IAA7CuE,EAAgBxE,QAAQkX,GAA5B,CAGI1S,EAAgBua,OAAOva,EAAgBxE,QAAQkX,GAAiB,GAEpE,IACI1J,EAAmB,IAAI4B,KACvBoB,EAAgBhD,EAChBtS,EAASod,KAAKpB,EAAe+0I,aAC7Bn9I,EAAOyb,KAAKrT,EAAe+0I,YAG9B,CAFC,MAAO10J,GACL2f,EAAe+0I,YAAY7rJ,SAC9B,CARA,CASJ,GAAGxF,EAAQ8hJ,iBAAmB1oI,EAClC,CACJ,CA8ED,OAPArP,EAAW,CACP4lB,KAjDJ,SAAchzB,GACNA,EAAOU,QACPwV,EACIlW,EACAqlB,EAAiByuI,wBACb9zJ,EAAOU,QAAQzC,OAInB+B,EAAOwL,OACPxL,EAAOwL,MAAMxL,EAAOU,QAAS,QAGxC,EAqCG0J,MA9BJ,WACI9N,EAAcoN,SAAQ,SAAA1J,GAClB8/B,aAAa9/B,EAAEqI,SAEXrI,EAAE+F,OAAOrF,SAAWV,EAAE+F,OAAOqE,OAC7BpK,EAAE+F,OAAOqE,MAAMpK,EAAE+F,OAAOrF,QAE/B,IACDpE,EAAgB,GAEhB2Q,EAAgBvD,SAAQ,SAAA1J,GAAC,OAAI8/B,aAAa9/B,EAAE20J,aAAnB,IACzB1nJ,EAAkB,GAElBtJ,EAAS+F,SAAQ,SAAA1J,GAETA,EAAEU,QAAQzC,OAASkY,EAAAD,EAAA6rH,iCAOvB/hI,EAAEuH,UAAYvH,EAAE6I,QAAU7I,EAAE2yE,gBAAA,EAC5B3yE,EAAEqa,OAAOjQ,MAAMpK,GAClB,IACD2D,EAAW,EACd,GA7WGW,GAAA,EAASjB,EAAAmtB,GAAM9sB,GAASy1H,cAAcK,UAAUpsH,GAChDzJ,EAAW,GACXsJ,EAAkB,GAClB3Q,EAAgB,GAChB4Q,EAAYkY,GAAU1hB,GAASy1H,cAC/Bh1H,EAAY4oB,GAAUrpB,GAASy1H,cAC/B/0H,EAA4ByoB,GAA0BnpB,GAASy1H,cAC/D90H,GAAA,EAAwBipB,GAAAkD,GAAsB9sB,GAASy1H,cAE1B9rG,GAAAvpB,EAAG,CAAC,EAC5BqS,EAAAD,EAAAurH,SAAuBtlI,EAAOk/I,iCADNhuH,GAAAvpB,EAExBqS,EAAAD,EAAAwrH,qBAAmCvlI,EAAOs/I,8BAFlBpuH,GAAAvpB,EAGxBqS,EAAAD,EAAA0rH,kBAAgCzlI,EAAOq/I,uCAHfnuH,GAAAvpB,EAIxBqS,EAAAD,EAAAyrH,mBAAiCxlI,EAAOo/I,gCAJhBluH,GAAAvpB,EAKxBqS,EAAAD,EAAA4rH,mBAAiC3lI,EAAOo/I,gCALhBluH,GAAAvpB,EAMxBqS,EAAAD,EAAA2rH,iCAA+C1lI,EAAOo/I,gCAN9BluH,GAAAvpB,EAOxBqS,EAAAD,EAAA+rH,WAAyB9lI,EAAOo/I,gCAPrC1tI,EAA6B/J,EA6W1BsJ,CACV,CAEDmgB,GAAWosG,sBAAwB,aAEnC,IACAnsG,GADgBrpB,EAAAqsB,EAAAyqG,gBAA6B1tG,ICpa7C,SAASH,KAEL,IAEIptB,EAYJ,SAASoN,IACLpN,EAAkB,CAAC,CACtB,CAcD,SAAS2D,IACLyJ,GACH,CAgBD,OAbIzJ,IAKO,CACPixJ,UAvBJ,SAAmBxnJ,GAGf,IAAK,IAAIzJ,KAAU3D,EACf,GAAIA,EAAgB/C,eAAe0G,IAAWyJ,EAAIyxB,WAAWl7B,GACzD,OAAO3D,EAAgB2D,GAI/B,OAAO6pB,EACV,EAcGqnI,eAtCJ,SAAwBznJ,EAAQzJ,GAC5B3D,EAAgBoN,GAAUzJ,CAC7B,EAqCGmxJ,iBAnCJ,SAA0B1nJ,GAClBpN,EAAgBoN,WACTpN,EAAgBoN,EAE9B,EAgCG2nJ,oBAAqB3nJ,EACrB4hC,MAAOrrC,EAId,CAEDypB,GAAoBusG,sBAAwB,sBAC5C,IACAvoG,GADgBjtB,EAAAqsB,EAAAopG,oBAAiCxsG,ICrDjD,SAASK,GAAUztB,GAEfA,EAAMA,GAAO,CAAC,EACd,IAGIoN,EACAzJ,EAJEsJ,EAAUqJ,KAAK9V,QAqCrB,OA/BA4M,EAAsBgkB,GAAoBnkB,GAASksH,cA0BxC,CACPnmG,KAzBJ,SAAc12B,GACV,IAAKqH,EAAQ,CACT,IAAIzH,EAAgBkR,EAAoBwnJ,UAAUt4J,GAAUA,EAAOoE,QAAUpE,EAAOoE,QAAQ0B,IAAM,MAClGuB,EAASzH,EAAc+Q,GAASrM,OAAO,CACnCy9I,WAAYr+I,EAAIq+I,WAChBuC,iBAAkB5gJ,EAAI4gJ,iBACtBmG,gBAAiB/mJ,EAAI+mJ,gBACrBzS,YAAat0I,EAAIs0I,YACjB0Q,UAAWhlJ,EAAIglJ,UAAYhlJ,EAAIglJ,UAAY,KAC3CgC,UAAWhnJ,EAAIgnJ,UAAYhnJ,EAAIgnJ,UAAY,KAC3CjU,cAAe/yI,EAAI+yI,cAAgB/yI,EAAI+yI,cAAgB,KACvDrL,SAAU1nI,EAAI0nI,SAAW1nI,EAAI0nI,SAAW,KACxCn1D,eAAiBj9C,MAAMt1B,EAAIuyE,gBAAuC,EAArBvyE,EAAIuyE,eACjD2xD,OAAQlkI,EAAIkkI,QAEnB,CACDvgI,EAAOqvB,KAAK12B,EACf,EASG8N,MAPJ,WACQzG,GACAA,EAAOyG,OAEd,EAQJ,CACDqjB,GAAUksG,sBAAwB,YAElC,IACAjsG,GADgBvpB,EAAAqsB,EAAAyqG,gBAA6BxtG,IAAA,SAAAa,GAAAtuB,GAAA,OAAAsuB,GAAA,mBAAA/qB,QAAA,iBAAAA,OAAA85E,SAAA,SAAAr9E,GAAA,cAAAA,CAAA,WAAAA,GAAA,OAAAA,GAAA,mBAAAuD,QAAAvD,EAAA5D,cAAAmH,QAAAvD,IAAAuD,OAAAxG,UAAA,gBAAAiD,CAAA,EAAAsuB,GAAAtuB,EAAA,UAAA4tB,GAAA5tB,EAAAoN,GAAA,OAAAwgB,GAAA9wB,OAAA4nI,gBAAA,SAAA1kI,EAAAoN,GAAA,OAAApN,EAAA8oD,UAAA17C,EAAApN,CAAA,EAAA4tB,GAAA5tB,EAAAoN,EAAA,UAAA6iB,GAAAjwB,EAAAoN,GAAA,OAAAA,GAAA,WAAAkhB,GAAAlhB,IAAA,mBAAAA,EAAA,SAAApN,GAAA,YAAAA,EAAA,UAAAwxC,eAAA,oEAAAxxC,CAAA,EAAAA,GAAAoN,CAAA,UAAAqhB,GAAAzuB,GAAA,OAAAyuB,GAAA3xB,OAAA4nI,eAAA5nI,OAAAuC,eAAA,SAAAW,GAAA,OAAAA,EAAA8oD,WAAAhsD,OAAAuC,eAAAW,EAAA,EAAAyuB,GAAAzuB,EAAA,KCzC7CswB,GAPM,SAAAtwB,IAAA,SAAAA,EAAAoN,GAAA,sBAAAA,GAAA,OAAAA,EAAA,UAAAu7C,UAAA,sDAAA3oD,EAAAjD,UAAAD,OAAA8D,OAAAwM,GAAAA,EAAArQ,UAAA,CAAAX,YAAA,CAAA0L,MAAA9H,EAAAo7H,UAAA,EAAAt9C,cAAA,KAAA1wE,GAAAwgB,GAAA5tB,EAAAoN,EAAA,EAAA9Q,EAAA0D,GAAA,IAAAoN,EAAAzJ,EAAAsJ,GAAAG,EAAA9Q,EAAAqH,EAAA,kCAAA45E,UAAAA,QAAAC,UAAA,YAAAD,QAAAC,UAAAmnD,KAAA,+BAAAC,MAAA,oBAAA9nB,QAAA//G,UAAAF,QAAAK,KAAAqgF,QAAAC,UAAAs/B,QAAA,6BAAA98G,GAAA,4BAAAA,EAAAiN,EAAAwhB,GAAArhB,GAAA,GAAAzJ,EAAA,KAAArH,EAAAmyB,GAAA,MAAAryB,YAAA4D,EAAAu9E,QAAAC,UAAAvwE,EAAA3O,UAAAhC,EAAA,MAAA0D,EAAAiN,EAAAyU,MAAA,KAAApjB,WAAA,OAAA2xB,GAAA,KAAAjwB,EAAA,GACF,SAAA1D,EAAY0D,GAAK,IAAAoN,EAAA,gBAAApN,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,2CAAArsD,IACb8Q,EAAAH,EAAA/P,KAAA,KAAM8C,IACDg1J,uBAAA,EAFQ5nJ,CAGhB,QAAA9Q,CAAA,CAJC,CAAoBwH,EAAA0sB,GCA1B,SAASkB,GAAe1xB,GAEpBA,EAASA,GAAU,CAAC,EACpB,IAOIoN,EACAzJ,EAREsJ,EAAUqJ,KAAK9V,QACflE,EAAW0D,EAAOynI,SAClB55H,EAAS7N,EAAOs2G,OAChBppG,EAAWlN,EAAO0nI,SAClB15H,EAAShO,EAAOkkI,OAChBzgI,EAAWzD,EAAOs6H,SA8HxB,OATAltH,EAAW,CACP6nJ,kBAlGJ,SAA2Bj1J,GACvB,IAAMoN,EAAS,SAAUA,GACrB9Q,EAASq4B,QAAQ9mB,EAAOq3H,8BAA+B,CAAExkI,QAASV,EAASk1J,OAAQ9nJ,GAEtF,EAED,GAAIpN,EAAS,CACT,IAAIiN,EAAc,IAAIqjB,GAAYtwB,EAAQoC,KAC1CuB,EAAUqvB,KAAK,CACXtyB,QAASuM,EACTyhD,QAAS,WACLthD,GAAA,EACH,EACD5B,MAAO,WACH4B,GAAA,EACH,GAER,MACGA,GAAA,EAEP,EA+EG4lB,KA7EJ,SAAchzB,GACV,IAAMiN,EAAS,SAAUtJ,EAAMsJ,GAC3B3Q,EAASq4B,QAAQ9mB,EAAO+3H,kBAAmB,CACvCllI,QAASV,EACT0H,SAAU/D,GAAQ,KAClB6H,MAAOyB,GAAS,KAChBosI,OAAQjsI,GAEf,EAEGpN,EACA2D,EAAUqvB,KAAK,CACXtyB,QAASV,EACTgpJ,SAAU,SAAUrlJ,GAChBrH,EAASq4B,QAAQ9mB,EAAOg4H,iBAAkB,CACtCnlI,QAASV,EACTq+D,OAAQ16D,EAAM06D,OACdi8D,SAAA72H,IAEAE,EAAMyC,MACN9J,EAASq4B,QAAQ9mB,EAAOi4H,sBAAuB,CAC3CplI,QAASV,EACT0H,SAAU/D,EAAMyC,MAAQ,KACxBoF,MAAO,KACP6tI,OAAQjsI,GAGnB,EACDshD,QAAS,SAAU1uD,GACfiN,EAAOjN,EACV,EACDwL,MAAO,SAAUxL,EAASoN,EAAYzJ,GAClCsJ,OAAA,EAEI,IAAI+B,EAAAwhB,EACAxiB,EAAO6sI,2CACPl3I,EACAyJ,GAGX,EACDhD,MAAO,SAAUpK,GACTA,GACA1D,EAASq4B,QAAQ9mB,EAAOk4H,kBAAmB,CACvCxL,UAAWv6H,EAAQu6H,UACnB75H,QAASV,EACTq5I,OAAQjsI,GAGnB,IAGLH,OAAA,EAEI,IAAI+B,EAAAwhB,EACAxiB,EAAO8sI,wCACP9sI,EAAOsuI,4CAItB,EAkBGlyI,MAhBJ,WACQzG,GACAA,EAAUyG,OAEjB,EAaG4kC,MAXJ,WACQrrC,IACAA,EAAUyG,QACVzG,EAAY,KAEnB,GA7GGA,EAAY+pB,GAAUzgB,GAASrM,OAAO,CAClCy9I,WAAYr+I,EAAOq+I,WACnBna,OAAQl2H,EACRsmI,YAAat0I,EAAOs0I,YACpBsM,iBAAkB5gJ,EAAO4gJ,iBACzBmG,gBAAiB/mJ,EAAO+mJ,gBACxBrf,SAAUx6H,EACV85I,UAAW9qJ,EAAAs0B,EACXw0H,UAAWhlJ,EAAOglJ,UAClBjS,cAAe/yI,EAAO+yI,cACtBxgE,eAAgBvyE,EAAOo5G,SAAShiG,MAAMskH,UAAU2F,yBA8GjDj0H,CACV,CAEDskB,GAAeioG,sBAAwB,iBACvC,IAAA3pG,GAAe7rB,EAAAqsB,EAAAyqG,gBAA6BvpG,IC7I5C,SAAS5B,KAYL,MAJW,CACPqlI,oBALJ,SAA6Bn1J,GACzB,OAAOuB,QAAQyE,QAAQhG,EAC1B,EAOJ,CAED8vB,GAAwB6pG,sBAAwB,0BAChD,IAAAloG,GAAettB,EAAAqsB,EAAAopG,oBAAiC9pG,ICNhD,SAAS0B,GAAmBxxB,GAExBA,EAASA,GAAU,CAAC,EACpB,IAUIoN,EACAzJ,EACAsJ,EAZE3Q,EAAUga,KAAK9V,QACfqN,GAAA,EAAWG,EAAAwiB,GAASl0B,GAAS68H,cAE7BjsH,EAAalN,EAAOq+I,WACpBl6I,EAAmBnE,EAAO4gJ,iBAC1Bx8I,EAAcpE,EAAOs0I,YACrBhwI,GAAA,EAAQjB,EAAAmtB,GAAMl0B,GAAS68H,cACvBr1H,EAA0B2tB,GAAwBn1B,GAAS68H,cAC3Dz1H,EAAa1D,EAAO2nI,WAa1B,SAAS78H,IACL,OAAOpH,EAAWuU,EACrB,CAkCD,SAASvJ,IACL,IAAK,IAAI1O,KAASiN,EACdA,EAAejN,GAAOgvC,QAE1B/hC,EAAiB,CAAC,CACrB,CA0BD,SAASoY,EAA2BrlB,GAEhC,GAAKA,EAAEq5I,OAAP,CAEA,IAAMjsI,EAAUpN,EAAEU,QACZuM,EAAQjN,EAAE0H,SACVpL,EAAS8Q,EAAQq4I,0BACjBv4I,EAAUE,EAAQi8H,UAAU1B,WASlC,GAPI3nI,EAAEwL,QACE4B,EAAQmtH,YAAcr+H,EAAAs0B,EAAA3B,OAAmBzhB,EAAQmtH,YAAcr+H,EAAAs0B,EAAAi7C,OAAoBr+D,EAAQmtH,YAAcr+H,EAAAs0B,EAAAmmG,MAAkBvpH,EAAQi8H,UAAU0U,eAE7IlwI,EAAS8mB,QAAQlxB,EAAA+sB,EAAA81G,wCAAgD,CAAE8uB,MAAOp1J,EAAEU,QAAQsnI,kBAIvF/6H,GAAUC,EAAf,CAIA,IAAMc,EAtCV,SAAyBhO,EAAOoN,EAASzJ,EAAUsJ,GAC/C,IAAM3Q,EAAQ,IAAI2kB,GAclB,OAZA3kB,EAAMg+H,SAAW32H,EACjBrH,EAAM+sI,UAAYj8H,EAAQi8H,UAC1B/sI,EAAM6gJ,YAAc/vI,EAAQnP,KAC5B3B,EAAMsc,MAAQxL,EAAQ+oB,UACtB75B,EAAM0b,SAAW5K,EAAQ4K,SACzB1b,EAAMwc,IAAMxc,EAAMsc,MAAQtc,EAAM0b,SAChC1b,EAAM6pB,MAAQnmB,EACd1D,EAAM+f,MAAQjP,EAAQiP,MACtB/f,EAAM+8G,QAAUjsG,EAAQisG,QACxB/8G,EAAMitI,iBAAmBn8H,EAAQm8H,iBACjCjtI,EAAMuiJ,YAAc5xI,EAEb3Q,CACV,CAhBD,CAsCkC2Q,EAAOG,EAAS1J,EAAWuU,GAAIjY,EAAE/B,OAASwF,EAAA+sB,EAAA+oH,2BACxEz1I,EAAwBqxJ,oBAAoBnnJ,GACvCg1B,MAAK,SAAChjC,GACH6N,EAAS8mB,QAAQr4B,EAASmH,EAAA+sB,EAAAg1G,qBAA8B/hI,EAAA+sB,EAAAy1G,sBACpD,CACIoX,MAAOr9I,EACPU,QAAS0M,GAEb,CAAEktH,SAAUptH,EAAQ+K,GAAIsiH,UAAWntH,EAAQmtH,WAElD,IATLt3F,OAUW,SAACjjC,GACJ2D,EAAO6H,MAAMxL,GACb6N,EAAS8mB,QAAQr4B,EAASmH,EAAA+sB,EAAAg1G,qBAA8B/hI,EAAA+sB,EAAAy1G,sBACpD,CACIoX,MAAOrvI,EACPtN,QAAS0M,GAEb,CAAEktH,SAAUptH,EAAQ+K,GAAIsiH,UAAWntH,EAAQmtH,WAElD,GArBJ,MAFG52H,EAAO8I,KAAK,MAAQW,EAAQmtH,UAAY,wCAfvB,CAuCxB,CAUD,OARAntH,EAAW,CACPitH,YAAAvvH,EACAuqJ,SA5GJ,SAAkBjoJ,GACd,IAAIzJ,EAAQsJ,EAAeG,GA4B3B,OA3BKzJ,IACDA,EAAQmL,EAAcxS,GAASsE,OAAO,CAClC+mI,WAAYjkI,EACZzF,KAAMmP,EACNknI,YAAalwI,EACb2sC,eAAgB/gB,GAAe1zB,GAASsE,OAAO,CAC3C0zI,YAAalwI,EACbw8I,iBAAkBz8I,EAClBk6I,WAAYnxI,EACZ65I,iBAAA,EAAiB1mI,EAAAmQ,GAAgBl0B,GAAS68H,cAC1C/f,SAAUp5G,EAAOo5G,SACjB4rC,UAAWhlJ,EAAOglJ,UAClBvd,SAAU55H,EACVyoG,OAAQ7yG,EAAA+sB,EACR0zG,OAAQhuH,EACR68H,cAAe/yI,EAAO+yI,cACtBrL,SAAU1nI,EAAO0nI,SACjBpN,SAAUxvH,MAEd8K,MAAOtR,EACPmjI,SAAU55H,EACVyoG,OAAQ7yG,EAAA+sB,IAGZvjB,EAAeG,GAAQzJ,GAGpBA,CACV,EA+EGqrC,MAtEJ,WACInhC,EAAS6kB,IAAIruB,EAAAmsB,EAAA8oH,2BAA8Cj0H,EAA4B/O,MACvFzI,EAAS6kB,IAAIruB,EAAAmsB,EAAA+oH,0BAA6Cl0H,EAA4B/O,MACtF5H,GACH,GArDG/K,EAASW,EAAMk1H,UAAUpsH,GACzBsB,IACAb,EAASukB,GAAG/tB,EAAAmsB,EAAA8oH,2BAA8Cj0H,EAA4BjY,GACtFS,EAASukB,GAAG/tB,EAAAmsB,EAAA+oH,0BAA6Cl0H,EAA4BjY,GAyHlFA,CACV,CAEDokB,GAAmBmoG,sBAAwB,qBAC3C,IAAAroG,GAAentB,EAAAqsB,EAAAyqG,gBAA6BzpG,ICjJ5C7D,GATI,SAAA3tB,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAA3oD,GACVsW,KAAKlU,IAAM,KACXkU,KAAKjR,MAAQ,KACbiR,KAAKhR,OAAS,KACdgR,KAAKzL,EAAI,KACTyL,KAAKxL,EAAI,IACZ,ECILymB,GAVI,SAAAvxB,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAA3oD,GACVsW,KAAKikH,UAAY,KACjBjkH,KAAK+X,QAAU,KACf/X,KAAKjR,MAAQ,KACbiR,KAAKhR,OAAS,KACdgR,KAAK8zI,SAAW,KAChB9zI,KAAKg/I,aAAe3hH,GACvB,ECJL,SAAStiB,GAAoBrxB,GAEzB,IAGIoN,EACAzJ,EAJEsJ,EAAUqJ,KAAK9V,QACflE,EAAa0D,EAAO2nI,WAwF1B,SAAS95H,EAAgB7N,GACrB2D,EAAgB4xJ,gBAAgBv1J,EACnC,CAqBD,SAASkN,IACDvJ,GACAA,EAAgBqrC,OAEvB,CAcD,OAZA5hC,EAAW,CACPitH,YAxFJ,WACI,OAAO/9H,EAAW2b,EACrB,EAuFGoyH,WAlGJ,WACI1mI,EAAgB6xJ,YAChB,IAAMx1J,EAAS2D,EAAgB8xJ,YAE3Bz1J,GAAUA,EAAO3D,OAAS,GAC1BwR,EAAgB,EAEvB,EA4FG6nJ,QAtFJ,SAAiB11J,EAAMoN,GAEnB,GAAwB,mBAAbA,EAAX,CAGA,IACIH,EACA3Q,EAFEJ,EAAQyH,EAAgBgyJ,kBAG9B,IAAKz5J,GAASA,EAAM03I,iBAAmB,GAAnC,MAAwC5zI,EACxCoN,EAAS,UADb,EAKA9Q,EAAUqH,EAAgBiyJ,2BAA2B51J,MAEjD9D,EAAM03I,gBAAkBt3I,EAAQ0b,UAGpC/K,EAASjN,EAAO9D,EAAM03I,gBAEtB,IAAM/lI,EAAae,KAAK2Q,MAAOtS,EAAS/Q,EAAM25J,SAAW35J,EAAM45J,UAAa55J,EAAM03I,iBAE5E1mI,EAAY,IAAIygB,GAOtB,GALAzgB,EAAU7H,MAAQuJ,KAAK2Q,MAAMrjB,EAAM65J,cACnC7oJ,EAAU5H,OAASsJ,KAAK2Q,MAAMrjB,EAAM85J,eACpC9oJ,EAAUrC,EAAI+D,KAAK2Q,MAAM1R,EAAa3R,EAAM25J,UAAY35J,EAAM65J,aAC9D7oJ,EAAUpC,EAAI8D,KAAK2Q,MAAM1R,EAAa3R,EAAM25J,UAAY35J,EAAM85J,cAE1D,kBAAmB95J,EACnB,OAAOA,EAAM+5J,cAAcj2J,GAAM,SAACA,GAC9BkN,EAAU9K,IAAMpC,EAChBoN,EAASF,EACZ,IAED,GAAK5Q,EAID4Q,EAAU9K,IAAM9F,EAAQ8F,IACxBlG,EAAM03I,gBAAkBjgG,QALd,CACV,IAAM3lC,EAAMY,KAAK2Q,MAAMvf,EAAO9D,EAAM03I,iBACpC1mI,EAAU9K,IAStB,SAA+BpC,EAAOoN,GAClC,IAAMzJ,EAASyJ,EAAMpN,EAAM0zI,YACvBzmI,GAAA,EAAMwP,EAAAmwB,IAAwB5sC,EAAMk2J,YAAa,SAAUvyJ,GAG/D,OAFAsJ,GAAA,EAAMwP,EAAAmwB,IAAwB3/B,EAAK,QAAStJ,EAAS,GAAK3D,EAAM4zI,gBAAkB5zI,EAAM2kB,WACxF1X,GAAA,EAAMwP,EAAAmwB,IAAwB3/B,EAAK,YAAajN,EAAM0oI,YAAA,EAC/CjsH,EAAAosH,IAA0B57H,EACpC,CAND,CATkD/Q,EAAO8R,EAChD,CAIDZ,EAASF,EA/BZ,CAPA,CAwCJ,EA2CGqoJ,gBAAA1nJ,EACAsoJ,qBA9BJ,WACI,OAAOxyJ,EAAgBwyJ,sBAC1B,EA6BGC,eA3BJ,WACI,IAAMp2J,EAAS2D,EAAgB8xJ,YAC3BroJ,EAAI,EAER,OAAOpN,EAAO6lB,KAAI,SAAC7lB,GACf,IAAM2D,EAAc,IAAI4tB,GAMxB,OALA5tB,EAAY42H,UAAYr+H,EAAAs0B,EAAA07H,MACxBvoJ,EAAY2xJ,aAAeloJ,IAC3BzJ,EAAY0qB,QAAUruB,EAAEquB,QACxB1qB,EAAY0B,MAAQrF,EAAEqF,MACtB1B,EAAY2B,OAAStF,EAAEsF,OAChB3B,CACV,GACJ,EAeGqrC,MAAA9hC,GAtHAA,IACAvJ,GAAA,EAAkBwgB,GAAAqM,GAAgBvjB,GAASrM,OAAO,CAC9C+mI,WAAYrrI,EACZ62G,QAASnzG,EAAOmzG,QAChB20B,kBAAmB9nI,EAAO8nI,kBAC1BD,kBAAmB7nI,EAAO6nI,kBAC1BjyH,MAAO5V,EAAO4V,MACd6xH,SAAUznI,EAAOynI,SACjBnxB,OAAQt2G,EAAOs2G,OACfy8B,cAAe/yI,EAAO+yI,cACtBuB,YAAat0I,EAAOs0I,YACpBtB,sBAAuBhzI,EAAOgzI,wBAgH/B5lI,CACV,CAEDikB,GAAoBsoG,sBAAwB,sBAC5C,IAAAhrG,GAAexqB,EAAAqsB,EAAAyqG,gBAA6B5pG,IAAAM,GAAAhuB,EAAA,MC5I5C,SAAS2zB,GAAoBt3B,GAGzB,IAAIoN,EADJpN,EAASA,GAAU,CAAC,EAEpB,IAAI2D,EAAY,GAEVsJ,GAAA,EAAWe,EAAAwiB,GAASla,KAAK9V,SAAS24H,cAClC78H,EAAkB0D,EAAOq2J,gBACzBn6J,EAAwB8D,EAAOs2J,sBAUrC,SAASzoJ,EAAI7N,IACyB,IAA9B2D,EAAU8E,QAAQzI,KAItB2D,EAAUod,KAAK/gB,GAEfiN,EAAS0nB,QAAQr4B,EAAiB,CAAE84J,MAAOp1J,IAC9C,CAuBD,OAPAoN,EAAW,CACPuvE,IAAK9uE,EACLqmF,SAlCJ,SAAkBl0F,GACd,SAAK2D,EAAUtH,QAAW2D,GAAUA,EAAM3D,UAIJ,IAA9BsH,EAAU8E,QAAQzI,EAC7B,EA6BGgvC,MAPJ,WACIrrC,EAAY,EACf,GAPOzH,GACA+Q,EAASmlB,GAAGl2B,GANpB,SAAwB8D,GACpB6N,EAAI7N,EAAEo1J,MACT,GAI0DhoJ,GAepDA,CACV,CAEDkqB,GAAoBqiG,sBAAwB,sBAC5C,IAAA/nG,GAAeztB,EAAAqsB,EAAAyqG,gBAA6B3jG,ICzCtCzF,GAAc,CAAC31B,EAAAs0B,EAAAi7C,MAAiBvvE,EAAAs0B,EAAA3B,MAAiB3yB,EAAAs0B,EAAAmmG,KAAgBz6H,EAAAs0B,EAAAk7C,MAAiBxvE,EAAAs0B,EAAA07H,OAGxF,SAASqK,GAAOv2J,GAEZA,EAASA,GAAU,CAAC,EACpB,IAuBIoN,EACAzJ,EACAsJ,EACA3Q,EACA4Q,EACA/I,EACAE,EACAD,EACAE,EACAR,EACAJ,EACAoH,EACA4D,EACA2W,EACAjP,EACAtH,EACA3S,EACA4W,EAxCEgD,EAAUO,KAAK9V,QACfkV,GAAA,EAAW1H,EAAAwiB,GAASza,GAASojH,cAC7BjgH,GAAA,EAAWqH,EAAAiQ,GAASza,GAASojH,cAE7BhjH,EAAgBnW,EAAO8kJ,cACvB7uI,EAAmBjW,EAAO4gJ,iBAC1B3nI,EAAcjZ,EAAOs0I,YACrBj8H,EAAkBrY,EAAOw2J,gBACzBl/I,EAAUtX,EAAOmzG,QACjB1gG,EAAoBzS,EAAO6nI,kBAC3BtwH,EAAevX,EAAOu8H,aACtB1xH,EAAa7K,EAAOq+I,WACpB/6I,EAAgBtD,EAAOy0E,cACvBt7D,EAAqBnZ,EAAOw+I,mBAC5BhuH,EAAkBxwB,EAAOy2J,gBACzBr9I,EAAkBpZ,EAAO+kJ,gBACzBjrI,EAAuB9Z,EAAO02J,qBAC9BxyJ,EAAiBlE,EAAO+8I,eACxBt1H,EAAaznB,EAAOy3I,WACtBz3H,EAAahgB,EAAO2nI,WAClBlrH,EAAWzc,EAAOo5G,SAuMxB,SAASz5F,EAA2B3f,EAAaoN,GAC7C,OAAO,IAAI7L,SAAQ,SAACjF,EAASuR,GACzB8S,KAEA7c,GAAA,EACA4c,KAGA,IAAIxT,EAAUua,EAAWutH,aACnBhnI,EAAW,GACjB6jB,GAAYnoB,SAAQ,SAAC0D,IAEXA,IAAclR,EAAAs0B,EAAAmmG,MAAmB32H,KAAiBoN,IAAclR,EAAAs0B,EAAAi7C,QAAqBv+D,GAAYA,GAAY,WAAYrL,KAAKqL,EAAQ0yD,YACxI5xD,EAAS+S,KAAK7E,EAAwB9O,EAAWpN,GAExD,IAEDuB,QAAQF,IAAI2M,GACPg1B,MAAK,WACF,OAsNYhjC,EAtNcoN,EAuN/B,IAAI7L,SAAQ,SAAC6L,GAChB,IAAMzJ,EAAU,CAAC,EACXrH,EAAW2Q,EAAiB4Y,KAAI,SAACzY,GACnC,OAAOA,EAAGo6I,kBAAkBxnJ,EAC/B,IAEDuB,QAAQF,IAAI/E,GACP0mC,MAAK,SAAChjC,GACHA,EAAY0J,SAAQ,SAAC1J,GACbA,IACA2D,EAAQ3D,EAAKq5H,WAAar5H,EAEjC,IACDoN,EAAQzJ,EACX,IARLs/B,OASW,WACH71B,EAAQzJ,EACX,GACR,IAnBL,IAA4B3D,CArNf,IACAgjC,MAAK,SAAC51B,GAGH,GAFAtJ,GAAA,EAEgC,IAA5BmJ,EAAiB5Q,OAAc,CAC/B,IAAMH,EAAM,sBACZ2O,EAAWW,MAAM,IAAIwD,EAAAwhB,EAAYta,EAAAylI,iCAAyCz/I,EAAKia,EAAc4nE,aAC7Fp6E,EAAOsxB,MAAM/4B,EAChB,MACG+kB,KAGAjhB,GAEAkE,EAAeyyJ,aAAa32I,GAGhC1jB,EAAQ8Q,EACX,IArBL61B,OAsBW,SAACjjC,GACJ6N,EAAO7N,EACV,GACR,GACJ,CA6BD,SAASkc,EAAwB9O,EAAM9Q,GACnC,IAII4Q,EAJAc,EAAkBsJ,EAAQs/I,uBAAuB52I,EAAY5S,GAC7DjJ,EAAqB,GAErBd,EAAY,KAGhB,IAAK2K,GAA8C,IAA3BA,EAAgB3R,OAEpC,OADAsH,EAAOmS,KAAK,MAAQ1I,EAAO,UACpB7L,QAAQyE,UAGfoH,IAASlR,EAAAs0B,EAAAi7C,QACTpnE,GAAA,GAGA+I,IAASlR,EAAAs0B,EAAA3B,QACTzqB,GAAA,GAGJ,IAAK,IAAIE,EAAI,EAAGR,EAAKkK,EAAgB3R,OAAQiI,EAAIR,EAAIQ,IACjDjB,EAAY2K,EAAgB1J,GAExB8I,IAASlR,EAAAs0B,EAAAmmG,MAAoBtzH,EAAUwzJ,aACvC3yJ,EAAe4yJ,iBAAiB92I,EAAY3c,GAC5Cc,EAAmB4c,KAAK1d,IAExBid,EAAkBjd,IAClB+V,EAAgB29I,SAAS1zJ,GAajC,GATIc,EAAmB9H,OAAS,IAC5B+c,EAAgB49I,+BAA+B5pJ,EAAM4S,GACrD9b,EAAe+yJ,sBAAsBj3I,EAAY5S,EAAMjJ,IAI3D6J,EAAkBA,EAAgBqJ,QAAO,SAAArX,GACrC,OAAQA,EAAU62J,UACrB,IAC8B,IAA3B7oJ,EAAgB3R,OAChB,OAAOkF,QAAQyE,UAGnB,GAAIoH,IAASlR,EAAAs0B,EAAA07H,MAcT,OAbAphJ,EAAsB6jB,GAAoB5Y,GAASnV,OAAO,CACtD+mI,WAAY3nH,EACZmzF,QAAS77F,EACTwwH,kBAAmB9nI,EAAO8nI,kBAC1BD,kBAAmB7nI,EAAO6nI,kBAC1BjyH,MAAO9G,EACP24H,SAAU/xH,EACV4gG,OAAQ7yG,EAAA+sB,EACRuiH,cAAellI,EAAA2iB,EACf8jH,YAAat0I,EAAOs0I,YACpBtB,sBAAuBhzI,EAAOgzI,yBAEd3I,aACb9oI,QAAQyE,UAGnB0P,EAASif,QAAQlxB,EAAA+sB,EAAAqkH,oBAA4B,CACzClN,WAAY3nH,EACZqpH,UAAWhmI,IAGf+V,EAAgB49I,+BAA+B5pJ,EAAM4S,GAErD,IAAIqF,EA0CR,SAAgCjY,EAAiBzJ,GAE7C,IAAMrH,EAAa8Q,GAAmBA,EAAgB/Q,OAAS,EAAK+Q,EAAgB,GAAK,KACrFS,EAAgBnK,EAAmB2xJ,SAAS/4J,EAAYA,EAAU2B,KAAO,MACvEiP,EAAO5Q,EAAYA,EAAU2B,KAAO,KACpC+P,EAAW1R,EAAYA,EAAU04D,SAAW,KAC5CvxD,EAAenH,EAAYA,EAAUyhJ,aAAe,KAEtD55I,EAAkByc,GAAgB7K,GAASnV,OAAO,CAClD+mI,WAAA3nH,EACA/hB,KAAAiP,EACA8nD,SAAAhnD,EACA65H,kBAAAp1H,EACA0gG,QAAA77F,EACAwtI,cAAA3uI,EACAyqI,iBAAA3qI,EACAqoI,cAAAzwI,EACAymI,YAAat0I,EAAOs0I,YACpBxM,kBAAmB9nI,EAAO8nI,kBAC1BkL,sBAAuBhzI,EAAOgzI,sBAC9Bv+D,cAAAnxE,EACAk7I,mBAAArlI,EACA4rI,gBAAA3rI,EACA2jI,eAAA74I,EACAm6I,WAAAxzI,EACAuuG,SAAA38F,EACAuoI,UAAA5uI,EACA6uI,2BAAAv2I,IAGJvK,EAAgBkmI,WAAW1mI,EAAaU,EAAeZ,GACvDwJ,EAAiB8T,KAAK5c,GAEtB,IAAK,IAAId,EAAI,EAAGA,EAAI+J,EAAgB/Q,OAAQgH,IACxCc,EAAgByjJ,aAAax6I,EAAgB/J,IAOjD,OAJI6J,IAAShR,EAAAs0B,EAAAmmG,MACTzyH,EAAe+yJ,sBAAsBj3I,EAAY9S,EAAME,EAAiBS,GAGrE1J,CACV,CA1CD,CA1CiD6J,EAAiB1R,GAI9D,OAFA4Q,EAAmBkM,EAAgB89I,mBAAmB9pJ,EAAM4S,EAAW/H,MAGnE3U,EAAc6zJ,sBAAsBjqJ,GAE7BmY,EAAgBqiI,gBAAiBt6I,IAASlR,EAAAs0B,EAAAmmG,MAAmBzpH,EAAiB2pJ,WAAiC7oJ,EAAgB,GAAnCd,IAGhG3L,QAAQyE,SAClB,CAED,SAASsa,EAAkBtgB,GACvB,IACIoN,EADEH,EAAOjN,EAAYA,EAAU/B,KAAO,KAG1C,OAAIgP,IAAS/Q,EAAAs0B,EAAAk7C,OACTt+D,EAAM,0HACNzJ,EAAOsxB,MAAM7nB,GACbvC,EAAWW,MAAM,IAAIwD,EAAAwhB,EAAYta,EAAA2lI,mCAA2CzuI,EAAK+I,EAAc4nE,cAAA,KAI/F9wE,IAAS/Q,EAAAs0B,EAAAmmG,MAAkB1pH,IAAS/Q,EAAAs0B,EAAA07H,OAIlClsJ,EAAUo3J,oBAAsB7/I,EAAa8/I,2BAC/CxsJ,EAAWW,MAAM,IAAIwD,EAAAwhB,EAAYta,EAAAklI,gCAAwCllI,EAAA0mI,qCAClE,GAId,CA8FD,SAAS78H,EAAW/f,GAGhB,IAFA,IAAIoN,EAAKH,EAAmBA,EAAiB5Q,OAAS,EAE7CsH,EAAI,EAAGA,EAAIyJ,EAAIzJ,IAAK,CACzB,IAAIrH,EAAgB2Q,EAAiBtJ,GAAGwjJ,mBACxC7qJ,EAAcmf,gBACdnf,EAAc49I,uBACdjtI,EAAiBtJ,GAAGqrC,OAAA,EAAehvC,EACtC,CACGkE,GACAA,EAAeozJ,iBAAiBt3I,GAEpC/S,EAAmB,GACnBC,GAAA,EACA/I,GAAA,EACAse,IAAA,GACAjC,GAAA,GACA9K,EAASif,QAAQlxB,EAAA+sB,EAAA+mI,mBAA2B,CAAE5vB,WAAA3nH,GACjD,CAyCD,SAASK,EAAqBrgB,GAC1B+f,EAAW/f,GACX1D,GAAA,EACA+H,GAAA,EACAD,GAAA,EACAE,EAAc,CAAC,EACfR,GAAA,EACA3H,GAAA,EACA4W,EAAqB,EACxB,CAoCD,SAASyN,EAAwBxgB,GAC7B7D,EAAuB6D,CAC1B,CAED,SAASygB,IACL,OAAOT,EAAaA,EAAWpH,MAAQ+6B,GAC1C,CAED,SAASljB,KACL,OAAOzQ,EAAaA,EAAW/H,GAAK,IACvC,CAED,SAASyY,KACL,OAAO1Q,CACV,CAcD,SAASW,KACL,IAAK8G,IAAenkB,EAChB,MAAM,IAAIkK,MAAMtR,EAAAs0B,EAAA+iH,qBAEvB,CAmBD,SAAS5iH,GAAkB3wB,GACnBA,EAAMwL,QACNX,EAAWW,MAAMxL,EAAMwL,OACvB7H,EAAOsxB,MAAMj1B,EAAMwL,MAAMU,SAEhC,CA8CD,SAASwU,KACL,GAAI8P,EAAiB,CACjB,IAAMxwB,EAASsX,EAAQqvI,aAAa3mI,GAChChgB,GAAUA,EAAO3D,OAAS,GAC1Bm0B,EAAgBgnI,gBAAgBx3J,EAAQggB,EAAW/H,GAE1D,CACJ,CAED,SAASgJ,KAKL,IAJA,IAAMjhB,EAAKiN,EAAiB5Q,OAExB+Q,EADe9I,EAAYgY,OAAWhY,EAAYiY,MAC/B,IAAIvN,EAAAwhB,EAAYta,EAAAglI,8BAAsChlI,EAAAwmI,kCAA2C,KAE/G/4I,EAAI,EAAGA,EAAI3D,EAAI2D,IACpB,GAAIsJ,EAAiBtJ,GAAG8/I,cAAgB3/I,EACpC,OAIR,GAAIgW,EAAsB,CAGtBA,EAAqB6tI,sBACrB,IAAK,IAAI95I,EAAI,EAAGA,EAAI7N,GAAMiN,EAAiBY,GAAIA,IAAK,CAChD,IAAMX,EAAOD,EAAiBY,GAAGwrH,UAC3BrrH,EAAYf,EAAiBY,GAAGs6I,eACtC,GAAIj7I,IAAShR,EAAAs0B,EAAA3B,OACT3hB,IAAShR,EAAAs0B,EAAAi7C,OACRv+D,IAAShR,EAAAs0B,EAAAmmG,MAAkB3oH,EAAU+vI,aAAe,CACrD,IAAI55I,EAAY8I,EAAiBY,GAAGs6I,eAChChkJ,GACA2V,EAAqB29I,mBAAmBtzJ,EAE/C,CACJ,CACD2V,EAAqB49I,6BACxB,CAEGtqJ,EACAvC,EAAWW,MAAM4B,GACT9Q,IACRA,GAAA,EACAmrB,EAAWkwI,kBAAkBz7J,EAAAs0B,EAAAonI,2BAAAC,eAAoD,WAC7EniJ,EAASif,QAAQlxB,EAAA+sB,EAAAsnI,mBAA2B,CACxCnwB,WAAY3nH,GAEnB,IAGR,CAgBD,SAASgB,KACL,IAAIhhB,EAAaoiB,KACXhV,EAAKpN,EAAW3D,OAEtB,GAAW,IAAP+Q,EAAJ,CAMA,IAAK,IAAIH,EAAI,EAAGA,EAAIG,EAAIH,IAEpB,IAAKjN,EAAWiN,GAAGs6I,yBAA2BvnJ,EAAWiN,GAAGosH,YAAcn9H,EAAAs0B,EAAA3B,OAAmB7uB,EAAWiN,GAAGosH,YAAcn9H,EAAAs0B,EAAAi7C,OAErH,YADA9nE,EAAOiS,MAAM,8DAA+D5V,EAAWiN,GAAGosH,UAAW,kCAK7G11H,EAAOiS,MAAM,6DACbzR,GAAA,EACAuR,EAASif,QAAQlxB,EAAA+sB,EAAAs2G,2BAAmC,CAAEa,WAAY3nH,GAAc,CAAE2nH,WAAA3nH,GAbjF,MAFGrc,EAAO8I,KAAK,wGAgBnB,CAED,SAASyV,GAAsBliB,GAC3BsE,EAAYtE,EAAEu6H,WAAav6H,EAAEwL,MAC7ByV,IACH,CAED,SAASE,GAAenhB,GAChBwwB,GACAA,EAAgBunI,gBAAgB/3J,EAAEs2G,OAAQt2F,EAAW/H,GAE5D,CAED,SAASoK,GAAyBriB,GAC9B,OAAKA,GAAcA,EAAU/B,KAItBqkB,GAAoBtiB,EAAU/B,MAH1B,IAId,CAED,SAASqkB,GAAoBtiB,GACzB,OAAKA,EAIYoiB,KAEC/K,QAAO,SAAUjK,GAC/B,OAAQA,EAAUisH,YAAcr5H,CACnC,IAAE,GAPQ,IAQd,CAED,SAASoiB,KAML,IALA,IAEIpiB,EACAoN,EAHAzJ,EAAM,GAKDrH,EAAI,EAAGA,EAAI2Q,EAAiB5Q,OAAQC,KAEzC0D,GADAoN,EAAkBH,EAAiB3Q,IACZ+8H,aAEVn9H,EAAAs0B,EAAA3B,OAAmB7uB,IAAS9D,EAAAs0B,EAAAi7C,OAAmBzrE,IAAS9D,EAAAs0B,EAAAmmG,MACjEhzH,EAAIod,KAAK3T,GAIjB,OAAOzJ,CACV,CAiFD,SAAS4e,GAAyBviB,EAAMoN,GACpC,IAAMzJ,EAAoB+sB,KACpBzjB,EAAgBG,EAAU+8H,gBAEhC,IAAKl9H,IAAkBtJ,EACnB,OAAO,EAGX,IAAMrH,EAAgBgb,EAAQ0gJ,qBAAqB/qJ,EAAcoP,MAAOrc,EAAMiN,GACxE/Q,EAAoBob,EAAQ0gJ,qBAAqBr0J,EAAkB0Y,MAAOrc,EAAM2D,GAEtF,OAAKrH,GAAkBJ,KAMbimB,GAA0BjmB,IAAsBimB,GAA0B7lB,KAJxEA,IAAkBJ,CAKjC,CAED,SAASimB,GAA0BniB,GAE/B,QAAKA,MAMKA,EAAWi4J,mBAAsBj4J,EAAWyoI,wBAA0BzoI,EAAWyoI,uBAAuBpsI,OAAS,GAAK2D,EAAWyoI,uBAAuB,GAAGwvB,kBACxK,CAED,SAASt1I,GAAc3iB,EAAWoN,GAA6B,IAAvBzJ,EAAuBrF,UAAAjC,OAAA,YAAAiC,UAAA,GAAAA,UAAA,GAAN,KACrD,IAAK0B,IAAcA,EAAU/C,eAAe,iBACxC,OAAO,EAEX,IAAMgQ,EAAgBjN,EAAUmqI,gBAC1B7tI,EAAoBqH,EAAiBA,EAAewmI,gBAAkBz5G,KAE5E,IAAKzjB,IAAkB3Q,EACnB,OAAO,EAGX,IAAMJ,EAAgBob,EAAQ0gJ,qBAAqB/qJ,EAAcoP,MAAOjP,EAAMH,GACxEY,EAAoByJ,EAAQ0gJ,qBAAqB17J,EAAkB+f,MAAOjP,EAAM9Q,GAEtF,IAAKJ,IAAkB2R,EAEnB,OAAQ3R,IAAkB2R,EAG9B,IAAMX,EAAehR,GAAiB2R,GAAqB3R,EAAc84D,WAAannD,EAAkBmnD,SAClGhnD,EAAYH,EAAkB46H,uBAAuB5iH,KAAI,SAAC7lB,GAC5D,OAAOA,EAAe0nC,MACzB,IAEKjkC,EAAYvH,EAAcusI,uBAAuB5iH,KAAI,SAAC7lB,GACxD,OAAOA,EAAe0nC,MACzB,IAEKvjC,EAAaV,EAAUmpB,MAAK,SAAC5sB,GAC/B,OAAOgO,EAAUvF,QAAQzI,IAAa,CACzC,IAEKqD,EAAoBI,EAAUmpB,MAAK,SAAC5sB,GAAD,OAAcgO,EAAU4e,MAAK,SAACxf,GAAD,OAAcmK,EAAa2gJ,6BAA6B9qJ,EAAUpN,EAAlE,GAA7B,IACzC,OAAOmE,GAAed,GAAqB6J,CAC9C,CAED,SAASuV,GAAaziB,GAClBqlB,EAAYrlB,CACf,CAED,SAAS6iB,KACL,OAAOwC,CACV,CA4CD,OAlCAjY,EAAW,CACPi9H,WAt5BJ,WAWI30H,EAAS0c,GAAG3uB,EAAA+sB,EAAAs0G,oBAA4B9jH,GAAsB5T,GAC9DsI,EAAS0c,GAAG3uB,EAAA+sB,EAAA60G,sBAA8BnjH,GAAuB9U,GACjEsI,EAAS0c,GAAG3uB,EAAA+sB,EAAA80G,cAAsBnkH,GAAgB/T,GAgB9C0M,IACApE,EAAS0c,GAAG3uB,EAAA+sB,EAAA2nI,UAAkBxnI,GAAmBvjB,GACjDsI,EAAS0c,GAAG3uB,EAAA+sB,EAAA4nI,2BAAmCznI,GAAmBvjB,GAClEsI,EAAS0c,GAAG3uB,EAAA+sB,EAAA6nI,yBAAiC1nI,GAAmBvjB,GAChEsI,EAAS0c,GAAG3uB,EAAA+sB,EAAA8nI,oBAA4B3nI,GAAmBvjB,GAC3DsI,EAAS0c,GAAG3uB,EAAA+sB,EAAA+nI,oBAA4B5nI,GAAmBvjB,GAC3DsI,EAAS0c,GAAG3uB,EAAA+sB,EAAAgoI,qBAA6B7nI,GAAmBvjB,IAhChElJ,EAAeu0J,oBAAoBz4I,GACnCtK,EAASif,QAAQlxB,EAAA+sB,EAAAkoI,eAAuB,CAAE/wB,WAAY3nH,GACzD,EAk5BGq6G,YA91BJ,WACI,OAAOr6G,EAAaA,EAAW/H,GAAK,IACvC,EA61BG0gJ,SAr1BJ,SAAkB34J,EAAaoN,GAC3B,OAAO,IAAI7L,SAAQ,SAACoC,EAASsJ,GACzB,IAAIC,EAKJ,OAAI2V,MACA3V,GAAA,EACAwI,EAASif,QAAQlxB,EAAA+sB,EAAAooI,iBAAyB,CACtCjxB,WAAA3nH,SAEJrc,EAAQyJ,SAoDpB,SAA0BpN,EAAaoN,GACnC,OAAOuS,EAA2B3f,EAAaoN,EAClD,CAFD,CA/CyBpN,EAAaoN,GACzB41B,MAAK,SAAChjC,GACHkN,GAAA,EACAwI,EAASif,QAAQlxB,EAAA+sB,EAAAooI,iBAAyB,CACtCjxB,WAAA3nH,IAEJrc,EAAQ3D,EACX,IAPLijC,OAQW,SAACjjC,GACJiN,EAAOjN,EACV,IAxBD2D,EAAQyJ,EAyBf,GACJ,EAyzBGyrJ,WAAA94I,EACA+4I,YA3eJ,WACI,OAAO5rJ,CACV,EA0eGmhJ,YAhaJ,WACI,OAAOruI,EAAaA,EAAWhI,SAAW27B,GAC7C,EA+ZGolH,aAAAt4I,EACAytI,MAAAz9H,GACA05G,cAAAz5G,GACAsoI,iBA5YJ,WACI,OAAO50J,CACV,EA2YG60J,iBAzYJ,WACI,OAAO50J,CACV,EAwYG60J,gBA/zBJ,SAAyBl5J,EAAaoN,GAClC,OAAO,IAAI7L,SAAQ,SAACjF,EAASJ,GAErB2mB,KACA3mB,KAIJyH,EAAOmS,KAAP,oDAAAlW,OAAgE6wB,OAChEhO,IAAA,GAEA9C,EAA2B3f,EAAaoN,GACnC41B,MAAK,WACF,IAAK,IAAIhjC,EAAI,EAAGA,EAAIiN,EAAiB5Q,QAAU4Q,EAAiBjN,GAAIA,IAChEiN,EAAiBjN,GAAGooJ,yBAAyB3nI,KAC7CxT,EAAiBjN,GAAGonJ,wBAAwB9E,qBAEhDhmJ,GACH,IAPL2mC,OAQW,WACHxgB,IAAA,GACAvmB,GACH,IACR,GACJ,EAwyBGi9J,iCAluBJ,SAA0Cn5J,GACtC,OAAO,IAAIuB,SAAQ,SAAC6L,EAASzJ,GACzBuY,EAAwBhgB,EAAAs0B,EAAAmmG,KAAgB32H,GACnCgjC,MAAK,WACF,OA0MNhjC,EAAKsiB,GAAoBpmB,EAAAs0B,EAAAmmG,OAEpB32H,EAAGwnJ,oBAGPjmJ,QAAQyE,UANnB,IACUhG,CAzMG,IACAgjC,MAAK,WACF9+B,EAAeyyJ,aAAa32I,GAC5B5S,GACH,IAPL61B,OAQW,SAACjjC,GACJ2D,EAAO3D,EACV,GACR,GACJ,EAqtBGo5J,uBAxYJ,WACI,OAAOtuJ,CACV,EAuYGuuJ,kBA1XJ,SAA2Br5J,GAEvB,GADA2gB,KACI3gB,IAAS9D,EAAAs0B,EAAA07H,MACT,OAAKphJ,EAGEA,EAAoBsrJ,iBAFhB,GAIf,IAAMhpJ,EA2GV,SAAsBpN,GAGlB,IAFA,IAAIoN,EAAkB,KAEbzJ,EAAI,EAAGA,EAAIsJ,EAAiB5Q,OAAQsH,IAGzC,IAFAyJ,EAAkBH,EAAiBtJ,IAEf01H,YAAcr5H,EAC9B,OAAOoN,EAAgB+6I,eAI/B,OAAO,IACV,CAZD,CA3GmCnoJ,GAC/B,OAAOsD,EAAc8yJ,eAAehpJ,EACvC,EAiXG2qH,WA3KJ,SAAoB/3H,GAChB,OAAO,IAAIuB,SAAQ,SAAC6L,GAChBtJ,GAAA,EACAkc,EAAahgB,EAETwwB,GACA9P,KAIJ,IADA,IAAI/c,EAAW,GACNrH,EAAI,EAAGJ,EAAK+Q,EAAiB5Q,OAAQC,EAAIJ,EAAII,IAAK,CACvD,IAAIuR,EAAkBZ,EAAiB3Q,GACjC4Q,EAAmBW,EAAgBs6I,eACzCxkJ,EAASod,KAAKlT,EAAgB45I,iBAAiBznI,IAC/C,IAAIhS,EAAkBsJ,EAAQs/I,uBAAuB52I,EAAYnS,EAAgBwrH,WAQjF,GALArrH,EAAkBA,EAAgBqJ,QAAO,SAAArX,GACrC,OAAQA,EAAU62J,UACrB,IAGoB,CAEjBhpJ,EAAgB85I,sBAChB,IAAK,IAAIxjJ,EAAI,EAAGA,EAAI6J,EAAgB3R,OAAQ8H,IAAK,CAC7C,IAAMd,EAAQ2K,EAAgB7J,GAC9B0J,EAAgB+5I,aAAa55I,EAAgB7J,IACzCmT,EAAQgiJ,mBAAmBpsJ,EAAkB7J,KAC7CC,EAAc6zJ,sBAAsB9zJ,GACpCM,EAASod,KAAKlT,EAAgB65I,gBAAgBrkJ,IAErD,CACJ,CACJ,CAED9B,QAAQF,IAAIsC,GACPq/B,MAAK,WAGF,IAFAr/B,EAAW,GAEJoP,EAAmB1W,OAAS,GAAG,CAClC,IAAI2D,EAAoB+S,EAAmB6d,MACvCxjB,EAAYpN,EAAkB0hJ,aAC9Bz0I,EAAYoV,GAAyBriB,EAAkByhJ,cAC3D,IAAKx0I,EAAW,OAChBtJ,EAASod,KAAK9T,EAAU46I,sBACxBlkJ,EAASod,KAAK9T,EAAUy6I,gBAAgBt6I,GAC3C,CAED,OAAO7L,QAAQF,IAAIsC,EACtB,IACAq/B,MAAK,WACFl/B,GAAA,EACAmd,KACAvL,EAASif,QAAQlxB,EAAA+sB,EAAAkoI,eAAuB,CAAE/wB,WAAY3nH,IACtD5S,GACH,GAER,GACJ,EAiHG4hC,MArcJ,SAAehvC,GAEP0D,IACAA,EAAmBsrC,QACnBtrC,EAAqB,MAGrBJ,GAAiB0c,GACjB1c,EAAci2J,mBAAmBv5I,EAAW/H,IAG5CvJ,IACAA,EAA2BsgC,QAC3BtgC,EAA6B,MAGjC2R,EAAqBrgB,GAErBggB,EAAa,KA/dbtK,EAASgd,IAAIjvB,EAAA+sB,EAAA60G,sBAA8BnjH,GAAuB9U,GAClEsI,EAASgd,IAAIjvB,EAAA+sB,EAAAs0G,oBAA4B9jH,GAAsB5T,GAC/DsI,EAASgd,IAAIjvB,EAAA+sB,EAAA80G,cAAsBnkH,GAAgB/T,GAqB/C0M,IACApE,EAASgd,IAAIjvB,EAAA+sB,EAAA2nI,UAAkBxnI,GAAmBvjB,GAClDsI,EAASgd,IAAIjvB,EAAA+sB,EAAA4nI,2BAAmCznI,GAAmBvjB,GACnEsI,EAASgd,IAAIjvB,EAAA+sB,EAAA6nI,yBAAiC1nI,GAAmBvjB,GACjEsI,EAASgd,IAAIjvB,EAAA+sB,EAAA8nI,oBAA4B3nI,GAAmBvjB,GAC5DsI,EAASgd,IAAIjvB,EAAA+sB,EAAA+nI,oBAA4B5nI,GAAmBvjB,GAC5DsI,EAASgd,IAAIjvB,EAAA+sB,EAAAgoI,qBAA6B7nI,GAAmBvjB,GAwcpE,EA8aGmkJ,cAAAnvI,GACAw9H,eArfJ,SAAwB5/I,GACpB,OAAO,IAAIuB,SAAQ,SAAC6L,EAAS9Q,GAEzB,IADA,IAAMJ,EAAW,GACR2R,EAAI,EAAGA,EAAIZ,EAAiB5Q,QAC7BikB,EAAkBrT,EAAiBY,GAAGs6I,iBACtCjsJ,EAAS6kB,KAAK9T,EAAiBY,GAAG+xI,eAAe5/I,IACjD6N,MAEAZ,EAAiBY,GAAGmhC,QACpB/hC,EAAiBua,OAAO3Z,EAAG,IAInCtM,QAAQF,IAAInF,GACP8mC,MAAK,WACF,IAAK,IAAIhjC,EAAI,EAAGA,EAAIiN,EAAiB5Q,OAAQ2D,IAGzCiN,EAAiBjN,GAAGw/I,qBAGxB,GAAgC,IAA5BvyI,EAAiB5Q,OAAc,CAC/B,IAAMC,EAAM,sBACZuO,EAAWW,MAAM,IAAIwD,EAAAwhB,EAAYta,EAAAylI,iCAAyCr/I,EAAM,YAAa6Z,EAAc4nE,aAC3Gp6E,EAAOsxB,MAAM34B,EAChB,CACD8Q,GACH,IAdL61B,OAeW,SAACjjC,GACJ2D,EAAO6H,MAAMxL,GACb1D,EAAO0D,EACV,GACR,GACJ,EAqdGw5J,uBAlHJ,SAAgCx5J,GAAkC,IAAvBoN,EAAuB9O,UAAAjC,OAAA,YAAAiC,UAAA,GAAAA,UAAA,GAAN,KACxD,OAAOqkB,GAAc3iB,EAAW9D,EAAAs0B,EAAAi7C,MAAiBr+D,IAAmBuV,GAAc3iB,EAAW9D,EAAAs0B,EAAA3B,MAAiBzhB,EACjH,EAiHGqsJ,uBA/GJ,SAAgCz5J,GAC5B,OAAKA,GAGEuiB,GAAyBrmB,EAAAs0B,EAAAi7C,MAAiBzrE,IAAcuiB,GAAyBrmB,EAAAs0B,EAAA3B,MAAiB7uB,EAC5G,EA2GG05J,aAAA72I,GACA82I,wBA7aJ,WACI,OAAOx9J,CACV,EA4aGy9J,wBAAAp5I,EACAq5I,WA7BJ,WACI,OAAOviJ,CACV,EA4BGwiJ,wBAlCJ,WACI,OAAO31J,CACV,EAiCG41J,aAAAt3I,GACAu3I,yBA9LJ,WAEI,IADA,IAAMh6J,EAAKiN,EAAiB5Q,OACnB+Q,EAAI,EAAGA,EAAIpN,GAAMiN,EAAiBG,GAAIA,IAC3CH,EAAiBG,GAAGg6I,wBAAwB9E,oBAEnD,EA0LG2X,mBArXJ,SAA4Bj6J,GACxB,GAAKkN,GAAa8S,EAAlB,CAIA7b,GAAA,EAEA,IAAIiJ,EAAYpN,EAAE0hJ,aACdz0I,EAAWkJ,EAAc4nE,WAE7BzmE,EAAQ4iJ,oBAAoBl6I,EAAW/H,GAAI7K,EAAUnP,KAAMmP,GAE3D,IAAI9Q,EAAY+lB,GAAyBjV,GACzC,GAAK9Q,EAAL,CAEA,IAAIuR,EAAcsL,EAAmBrB,UACrCnU,EAAOmS,KAAK,mDAAqDjI,GAG7DZ,EAASktJ,8BACTpnJ,EAAmBgO,KAAK/gB,GACnBqY,EAAgB+hJ,kBACjBz2J,EAAOiS,MAAM,kDACbyC,EAAgBgiJ,oBAGpB/9J,EAAUorJ,gBAAgBt6I,GACrB41B,MAAK,WACE51B,EAAUnP,OAAS/B,EAAAs0B,EAAAi7C,OAAmBr+D,EAAUnP,OAAS/B,EAAAs0B,EAAA3B,OACzDvrB,EAAc6zJ,sBAAsB/pJ,GAExC9Q,EAAUurJ,oBACb,GAnBa,CAVrB,CA+BJ,EAoVGnE,qBAlVJ,SAA8B1jJ,GAC1B,IAAMoN,EAAYkV,GAAoBtiB,EAAEu6H,WAEpCntH,GACAA,EAAUs2I,qBAAqB1jJ,EAEtC,GAvoBD,WACI,IACI8O,GAAA,EAAQzL,EAAAmtB,GAAMza,GAASojH,cACvBx1H,EAASmL,EAAM0qH,UAAUpsH,GACzBiT,IAEAjK,GAAA,EAAYub,GAAAnB,GAAUza,GAASojH,cAE/BzqH,EAA6BkjB,GAAoB7b,GAASnV,OAAO,CAC7Dy1J,gBAAiB5yJ,EAAA+sB,EAAA61G,mCACjBiwB,sBAAuB7yJ,EAAA+sB,EAAA41G,iCAG3B1iI,EAAqB4tB,GAAmBvb,GAASnV,OAAO,CACpD+mI,WAAY3nH,EACZ4gI,iBAAkB3qI,EAClBq+H,YAAar7H,EACbolI,WAAYxzI,EACZuuG,SAAU38F,EACVuoI,UAAW5uI,EACX28H,cAAellI,EAAA2iB,EACfk3G,SAAUxuH,GAKjB,CAFC,MAAOlZ,GACL,MAAMA,CACT,CACJ,CA3BD,GAu9BOoN,CACV,CAEDmpJ,GAAO58B,sBAAwB,SAC/B,IAAApjG,GAAepyB,EAAAqsB,EAAAyqG,gBAA6Bs7B,IC/gC5C5/H,GAPI,SAAA32B,EAAYoN,IAAA,SAAApN,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAK,KAAA3oD,GACbsW,KAAKlU,IAAMgL,GAAO,KAClBkJ,KAAKrY,KAAOkY,EAAAD,EAAAokJ,sBACZhkJ,KAAK/P,aAAe,MACvB,ECELsvB,GATI,SAAA71B,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAA3oD,GACVsW,KAAKrK,QAAU,KACfqK,KAAKsqH,IAAM,IACXtqH,KAAKikJ,UAAY,KACjBjkJ,KAAK06D,gBAAkB,GACvB16D,KAAKkkJ,cAAgB,EACxB,ECUL,SAASnkI,KACL,IAGIr2B,EACAoN,EACAzJ,EACAsJ,EACA3Q,EACAJ,EACAgR,EACAc,EACAvK,EACAU,EACAC,EACAE,EACAR,EACAJ,EACAoH,EAjBE4D,EAAU4H,KAAK9V,QACf6kB,GAAA,EAAW9E,EAAAiQ,GAAS9hB,GAASyqH,cA2EnC,SAAS/iH,EAA0BpW,GAC/B+V,EAA0B/V,EAAG,UAChC,CAOD,SAAS8O,EAA0B9O,GAC/B+V,EAA0B/V,EAAG,WAChC,CAOD,SAASgP,EAA2BhP,GAChC,GAAKA,GAAMA,EAAEU,SAAYV,EAAEU,QAAQsnI,iBAAoBhoI,EAAEU,QAAQioJ,kBAAqB3oJ,EAAEU,QAAQ8yJ,iBAAkBl+H,MAAMt1B,EAAEU,QAAQ+zJ,YAAlI,CAIA,IAAMrnJ,EAAkBpN,EAAEU,QAAQsnI,gBAC5BrkI,EAAc3D,EAAEU,QAAQ8yJ,eAAe17I,UAAY9X,EAAEU,QAAQioJ,iBAAiB7wI,UAGpF/E,EAAmC3F,EAFhBoJ,SAAmC,EAAvBxW,EAAEU,QAAQ+zJ,WAAkB9wJ,EAAe,KAJzE,CAOJ,CAOD,SAASxH,EAA+B6D,GAC/BA,GAAMA,EAAE00J,aAAgB10J,EAAE00J,YAAY+F,mBAAoBnlI,MAAMt1B,EAAE06J,aAMvE3nJ,EAHwB/S,EAAE00J,YAAY+F,iBACJ,IAAfz6J,EAAE06J,WAGxB,CAQD,SAAS3nJ,EAAmC/S,EAAiBoN,GACpD9Q,EAAe0D,KAChB1D,EAAe0D,GAAmB,IAEtC1D,EAAe0D,GAAiB+gB,KAAK3T,GACjC9Q,EAAe0D,GAAiB3D,OAvIjB,GAwIfC,EAAe0D,GAAiBumB,OAEvC,CAQD,SAASxQ,EAA0B/V,EAAGoN,GAClC,GAAIpN,GAAKA,EAAEU,SAAWV,EAAEU,QAAQsnI,gBAAiB,CAC7C,IAAMrkI,EAAkB3D,EAAEU,QAAQsnI,iBAC8B,IAA5D/6H,EAAoBG,GAAM/L,IAAIoH,QAAQ9E,IACtCsJ,EAAoBG,GAAM/L,IAAI0f,KAAKpd,GAEvCsJ,EAAoBG,GAAM1I,QAAUf,CACvC,CACJ,CAMD,SAAS+R,IACL,IAAM1V,EAAWoE,EAAc25E,WAC3B3wE,EAAsBtC,EAAQslJ,mBAAmBpwJ,GAMrD,OAJKoN,IACDA,EAAsBtJ,EAA6Bw0I,gCAAgCtqH,iBAGhF5gB,CACV,CAeD,SAAS8L,IACL,OAAO,IAAI3X,SAAQ,SAACvB,GAChB,IACI,IAAM9D,EAA2BwZ,IACjC,IAAKxZ,IAA6BA,EAAyByvJ,UAEvD,YADA3rJ,IAIJ,IAAMgO,EAiDlB,SAA+BhO,GAC3B,IAAIoN,EAAMpN,EAAyB2rJ,UAC/BhoJ,GAA+BA,EAA4B42J,YAEvDntJ,EADAiY,EAAS0iH,WAAWpkI,EAA4B42J,WAC1Cl1I,EAASrf,QAAQrC,EAA4B42J,UAAWv6J,EAAyB2rJ,WAEjFhoJ,EAA4B42J,WAI1C,IAAMr+J,EAA2B,GAG3B2R,EAAmBZ,EAAoBqhE,QAAQjtE,IAAIzB,OAAOqN,EAAoBhK,SAAS5B,KAC7F,GAAIwM,EAAiBxR,OAAS,EAAG,CAG7B,IAAM6Q,EAAOW,EAAiBgY,KAAI,SAAC7lB,GAC/B,IAAMoN,EAgDlB,SAAgDpN,GAC5C,IAAKA,IAAoB1D,EAAe0D,IAA+D,IAA3C1D,EAAe0D,GAAiB3D,OACxF,OAAQ,EAGZ,IAAM+Q,EAAa9Q,EAAe0D,GAAiBktB,QAAO,SAACltB,EAAKoN,GAC5D,OAAOpN,EAAMoN,CAChB,IAAI9Q,EAAe0D,GAAiB3D,OAErC,OAAOma,SAASpJ,EACnB,CAVD,CAhDsEpN,GAC1D,MAAO,CACHgoI,gBAAAhoI,EACA06J,WAAAttJ,EAEP,IAGDF,EAAK+9B,MAAK,SAACjrC,EAAGoN,GACV,OAAOA,EAAEstJ,WAAa16J,EAAE06J,UAC3B,IAED,IAAI1sJ,EAAgB,GAChBvK,EAAmB,GAEvByJ,EAAKxD,SAAQ,SAAC1J,EAAOoN,GACH,IAAVA,IACAY,EAAgB,GAAHpO,OAAMoO,EAAN,KACThO,EAAM06J,YAAc,IACpBj3J,EAAmB,GAAH7D,OAAM6D,EAAN,OAGxBuK,EAAgB,GAAHpO,OAAMoO,GAANpO,OAAsBI,EAAMgoI,iBACrChoI,EAAM06J,YAAc,IACpBj3J,EAAmB,GAAH7D,OAAM6D,GAAN7D,OAAyBI,EAAM06J,YAEtD,IAEDx+J,EAAyB6kB,KAAK,CAC1B5jB,IArSH,gBAsSG2K,MAAO,IAAFlI,OAAMoO,EAAN,OAET9R,EAAyB6kB,KAAK,CAC1B5jB,IA1SA,mBA2SA2K,MAAOrE,GAEd,CAGD,OADM+hB,GAAAgL,EAAA4jI,gCAAsChnJ,EAAKlR,EAEpD,CA1DD,CAjD8CA,GAC5BuH,EAAU,IAAIkzB,GAAuB3oB,GAC3Cd,EAAU8lB,KAAK,CACXtyB,QAAS+C,EACTirD,QAAS,SAACthD,IAiI1B,SAAiCpN,GACxBA,GAASA,EAAK6N,EAAA2iB,EAAA2hH,0BAAAlxI,UAAwH,IAApEuV,SAASxW,EAAK6N,EAAA2iB,EAAA2hH,0BAAAlxI,aAKrF0C,EAA8B,IAAIkyB,IACN5pB,QAAUjM,EAAK6N,EAAA2iB,EAAA2hH,0BAAAlxI,SAEvCjB,EAAK6N,EAAA2iB,EAAA2hH,0BAAApgE,OAAiDz8C,MAAMt1B,EAAK6N,EAAA2iB,EAAA2hH,0BAAApgE,QACjEpuE,EAA4Bi9H,IAAM5gI,EAAK6N,EAAA2iB,EAAA2hH,0BAAApgE,MAEvC/xE,EAAK6N,EAAA2iB,EAAA2hH,0BAAAC,cACLzuI,EAA4B42J,UAAYv6J,EAAK6N,EAAA2iB,EAAA2hH,0BAAAC,aAE7CpyI,EAAK6N,EAAA2iB,EAAA2hH,0BAAAE,oBACL1uI,EAA4BqtE,gBAAkBhxE,EAAK6N,EAAA2iB,EAAA2hH,0BAAAE,mBAEnDryI,EAAK6N,EAAA2iB,EAAA2hH,0BAAAG,kBACL3uI,EAA4B62J,cAAgBx6J,EAAK6N,EAAA2iB,EAAA2hH,0BAAAG,gBACjD3uI,EAA4B62J,cAAgB72J,EAA4B62J,cAAcnjJ,QAAO,SAACrX,GAC1F,OAaZ,SAA8BA,GAC1B,OAAOA,EAAa6N,EAAA2iB,EAAA2hH,0BAAAI,UACbvyI,EAAa6N,EAAA2iB,EAAA2hH,0BAAAv6H,KACb5X,EAAa6N,EAAA2iB,EAAA2hH,0BAAAK,kBACbxyI,EAAa6N,EAAA2iB,EAAA2hH,0BAAAK,iBAAyD3kI,EAAA2iB,EAAA2hH,0BAAAjgE,KAChF,CALD,CAbwClyE,EAC/B,KAGLiZ,IACH,CA1BD,CAhI4C7L,GACxB1J,EAASixB,QAAQtwB,EAAAmsB,EAAAmqI,mCAAsD,CACnEC,4BAAAj3J,EACAvB,IAAA4L,IAEJhO,GACH,EACDwL,MAAO,SAACyB,EAAG3Q,EAAOJ,EAAY2R,IA+R9C,SAAsC7N,EAAGiN,GACrC,IAII,OAHAG,EAAOX,KAAP,mDAAgEzM,GAC7CiN,EAASrF,QAIxB,KAAK,IACD,MAEJ,KAAK,IACD,IAAMtL,EAAa2Q,GAAYA,EAASglE,kBAAoBhlE,EAASglE,kBAAkB,eAAiB,KACrF,OAAf31E,IACKqH,IACDA,EAA8B,CAAC,GAEnCA,EAA4Bi9H,IAAMpqH,SAASla,IAE/C2c,IACA,MACJ,QACIA,IAKX,CAFC,MAAOjZ,GACLoN,EAAO5B,MAAMxL,EAChB,CACJ,CA3BD,CA9RiDiN,EAAGY,GAChC7N,EAAQiN,EACX,EACD4/C,SAAU,WAEN5/C,EAAoBqhE,QAAQjtE,IAAM8U,EAAmDlJ,EAAoBqhE,SACzGrhE,EAAoBhK,SAAS5B,IAAM8U,EAAmDlJ,EAAoBhK,SAC7G,GAIR,CAFC,MAAOmK,GACLpN,EAAQoN,EACX,CACJ,GACJ,CAQD,SAAS+I,EAAmDnW,GACxD,OAAKA,EAAKqB,KAA2B,IAApBrB,EAAKqB,IAAIhF,QAAiB2D,EAAK0E,QAGzC1E,EAAKqB,IAAIgW,QAAO,SAACjK,GACpB,OAAOA,IAAUpN,EAAK0E,OACzB,IAJU,EAKd,CA2LD,SAASuR,EAAwBjW,GAC7B,IACI,IAAMiN,EAAsB,GAE5B,OAAKjN,GAAkD,IAA7BA,EAAkB3D,QAAiBsH,GAAgCA,EAA4B62J,eAAsE,IAArD72J,EAA4B62J,cAAcn+J,QAIpLsH,EAA4B62J,cAAc9wJ,SAAQ,SAAC0D,GAC/C,IAAIzJ,EAAe3D,EAAkBqX,QAAO,SAACrX,GACzC,OAAOoN,EAAaS,EAAA2iB,EAAA2hH,0BAAAI,WAAqDvyI,EAAOgoI,eACnF,IACG1rI,EAAY,KAIhB,GAHIqH,GAAgBA,EAAatH,OAAS,IACtCC,EAAYqH,EAAa,IAEzBrH,EAAW,CACX,IAAMJ,EAAe,IAAIksB,IAAI9rB,EAAU8F,KACnC8K,EAAOE,EAAaS,EAAA2iB,EAAA2hH,0BAAAK,iBAAyD3kI,EAAA2iB,EAAA2hH,0BAAAjgE,MACjFhlE,EAAOsY,GAAAgL,EAAAqqI,kBAAwB3tJ,GAAQA,EAAhC,GAAAtN,OAA0C1D,EAAaqG,SAAvD,MAAA3C,OAAoEsN,GAC3E,IAAMc,EACF,CACI8sJ,eAAgB,GAAFl7J,OAAKsN,GAALtN,OAAY1D,EAAa4G,UACvCklI,gBAAiB56H,EAAaS,EAAA2iB,EAAA2hH,0BAAAv6H,IAC9BqwH,YAAa76H,EAAaS,EAAA2iB,EAAA2hH,0BAAAK,iBAAyD3kI,EAAA2iB,EAAA2hH,0BAAAhgE,QACnF4oF,UAAAz+J,GAGR2Q,EAAoB8T,KAAK/S,EAC5B,CACJ,IAEMf,GA3BIA,CA+Bd,CAHC,MAAOjN,GAEL,OADAoN,EAAO5B,MAAMxL,GACN,EACV,CACJ,CAMD,SAASiZ,IAEDtV,GAA+BA,EAA4Bi9H,MAAQtrG,MAAM3xB,EAA4Bi9H,OACjG1kI,GACA4jC,aAAa5jC,GAEjBA,EAAmBwM,YAAW,WAC1BwQ,GACH,GAAoC,IAAlCvV,EAA4Bi9H,KAEtC,CAKD,SAASvoH,IACDnc,GACA4jC,aAAa5jC,GAEjBA,EAAmB,IACtB,CAqDD,SAASob,IACL3T,EAA8B,KAC9BrH,EAAiB,CAAC,EAClB2Q,EAAsB,CAClBqhE,QAAS,CACL5pE,QAAS,KACTrD,IAAK,IAET4B,SAAU,CACNyB,QAAS,KACTrD,IAAK,KAGbgX,GACH,CAkBD,OAfArY,EAAW,CACPgvC,MA1BJ,WACI13B,IACA5T,EAASgvB,IAAIruB,EAAAmsB,EAAAypH,yBAA4C7jI,EAA2BpW,GACpF0D,EAASgvB,IAAIruB,EAAAmsB,EAAAwqI,yBAA4ClsJ,EAA2B9O,GACpF0D,EAASgvB,IAAIruB,EAAAmsB,EAAAqjI,0BAA6C7kJ,EAA4BhP,GACtF0D,EAASgvB,IAAIruB,EAAAmsB,EAAAyqI,8BAAiD9+J,EAAgC6D,EACjG,EAqBGu3I,UAjhBJ,SAAmBv3I,GACVA,IAEDA,EAAOmzG,UACProG,EAAU9K,EAAOmzG,SAEjBnzG,EAAOq+I,aACPrwI,EAAahO,EAAOq+I,YAEpBr+I,EAAOs0I,cACP7wI,EAAczD,EAAOs0I,aAErBt0I,EAAO4gJ,mBACPz8I,EAAmBnE,EAAO4gJ,kBAE1B5gJ,EAAO+mJ,kBACPziJ,EAAkBtE,EAAO+mJ,iBAEzB/mJ,EAAO8kJ,gBACP1gJ,EAAgBpE,EAAO8kJ,eAEvB9kJ,EAAOw3I,+BACP1zI,EAA+B9D,EAAOw3I,8BAEtCx3I,EAAOynI,WACP/jI,EAAW1D,EAAOynI,UAEzB,EAufGyzB,iBAAAhiJ,EACAiiJ,+BAjCJ,WACI,OAAOx3J,CACV,EAgCGy3J,uBAhYJ,WACI,IAAMp7J,EAA2B0V,IACjC,QAAS1V,GAA4BA,EAAyB0rJ,gBACjE,EA8XG2P,4BAAA3lJ,EACA4lJ,yBAAAjjJ,EACAkjJ,8BA9LJ,SAAuCv7J,GACnC,IAGI,OAF4BiW,EAAwBjW,GAEzB6lB,KAAI,SAAC7lB,GAC5B,IAAMoN,EAAqB,IAAI4V,GAAQhjB,EAAQ86J,eAAgB96J,EAAQgoI,iBAOvE,OANA56H,EAAmB66H,YAAcjoI,EAAQioI,YACzC76H,EAAmB29I,YAAc/qJ,EAAQ+6J,UAAUhQ,YACnD39I,EAAmB49I,UAAYhrJ,EAAQ+6J,UAAU/P,UACjD59I,EAAmB6mI,uBAAyBj0I,EAAQ+6J,UAAU9mB,uBAC9D7mI,EAAmB+7H,yBAA2BnpI,EAAQ+6J,UAAU5xB,yBAEzD/7H,CACV,GAKJ,CAHC,MAAOpN,GAEL,OADAoN,EAAO5B,MAAMxL,GACN,EACV,CACJ,EA4KGw7J,+BArKJ,SAAwCx7J,GACpC,IAGI,OAF4BiW,EAAwBjW,GAEzB6lB,KAAI,SAAC7lB,GAC5B,IAAMoN,EAAsB,IAAI8W,GAAYlkB,EAAQ86J,eAAgB96J,EAAQgoI,iBAG5E,OAFA56H,EAAoB66H,YAAcjoI,EAAQioI,YAEnC76H,CACV,GAKJ,CAHC,MAAOpN,GAEL,OADAoN,EAAO5B,MAAMxL,GACN,EACV,CACJ,EAuJGqqI,WAzfJ,WACIn9H,EAAYwgB,GAAUhf,GAAS9N,OAAO,CAClCy9I,WAAArwI,EACAsmI,YAAA7wI,EACAm9I,iBAAAz8I,EACA4iJ,gBAAAziJ,EACA4/H,OAAQhuH,IAEZxS,EAAS0uB,GAAG/tB,EAAAmsB,EAAAypH,yBAA4C7jI,EAA2BpW,GACnF0D,EAAS0uB,GAAG/tB,EAAAmsB,EAAAwqI,yBAA4ClsJ,EAA2B9O,GACnF0D,EAAS0uB,GAAG/tB,EAAAmsB,EAAAqjI,0BAA6C7kJ,EAA4BhP,GACrF0D,EAAS0uB,GAAG/tB,EAAAmsB,EAAAyqI,8BAAiD9+J,EAAgC6D,EAEhG,GAjDGoN,GAAA,EAAS/J,EAAAmtB,GAAM9hB,GAASyqH,cAAcK,UAAUx5H,GAChDsX,IAiiBGtX,CACV,CAEDq2B,GAA0BsjG,sBAAwB,4BAClD,IAAApkG,GAAepxB,EAAAqsB,EAAAopG,oBAAiCvjG,ICxkBhD,SAASQ,KAEL,IAGI72B,EACAoN,EACAzJ,EALEsJ,EAAUqJ,KAAK9V,QACflE,GAAA,EAAW4c,EAAAsX,GAASvjB,GAASksH,cAwFnC,OARAn5H,EAAW,CACPy7J,OArDJ,SAAgBz7J,GACZ,IAAKA,GAAwC,IAAxBA,EAAa3D,OAC9B,OAAO,KAGX,IAAI4Q,EAAc,KASlB,OARI3Q,EAAS8a,MAAMskH,UAAUQ,uBACzBjvH,EAUR,SAAkCjN,GAE9B,IAAMiN,EAA8BtJ,EAA0Bw3J,iCAC9D,OAAIluJ,GAA+BA,EAA4B+jE,iBAAmB/jE,EAA4B+jE,gBAAgB30E,OAAS,EAO3I,WAGI,IAH+D,IAAzC2D,EAAyC1B,UAAAjC,OAAA,YAAAiC,UAAA,GAAAA,UAAA,GAAvB,GAAIqF,EAAmBrF,UAAAjC,OAAA,YAAAiC,UAAA,GAAAA,UAAA,GAAJ,GACvD2O,EAAI,EACJ3Q,EAAS,KAFkDJ,EAAA,WAI3D,IAAMA,EAAO8D,EAAgBiN,GACvBY,EAAMlK,EAAa+3J,WAAU,SAAC17J,GAChC,OAAOA,EAAKgoI,iBAAmBhoI,EAAKgoI,kBAAoB9rI,CAC3D,IACD,IAAa,IAAT2R,IAAeT,EAAoB8mF,SAASvwF,EAAakK,GAAKm6H,iBAE9D,OADA1rI,EAASqH,EAAakK,GACtB,QAEJZ,GAAK,CAZsD,EAGxDA,EAAIjN,EAAgB3D,QAAQ,UAAAH,MAWnC,OAAOI,CACV,CAfD,CANgC2Q,EAA4B+jE,gBAAiBhxE,GAGlE,IACV,CARD,CAV+CA,IAGtCiN,IACDA,EAiCR,SAA0BjN,GACtB,OAAOA,EAAa,EACvB,CAFD,CAjCuCA,IAG5BiN,CACV,EAuCGsqI,UApEJ,SAAmBv3I,GACXA,EAAO27J,sBACPvuJ,EAAsBpN,EAAO27J,qBAE7B37J,EAAOm2E,4BACPxyE,EAA4B3D,EAAOm2E,0BAE1C,EA8DGnnC,MAPJ,WACI5hC,EAAoB4hC,OACvB,GAvEG5hC,EAAsBwkB,GAAoB3kB,GAASrM,OAAO,CACtDy1J,gBAAiB5yJ,EAAA+sB,EAAAi2G,4CACjB6vB,sBAAuB7yJ,EAAA+sB,EAAAg2G,0CAE3B7iI,EAA4B4xB,GAA0BtoB,GAASksH,cA6E5Dn5H,CACV,CAED62B,GAAiB8iG,sBAAwB,mBACzC,IAAAnjG,GAAeryB,EAAAqsB,EAAAyqG,gBAA6BpkG,IC7F5C,SAASD,KAEL,IAII52B,EACAoN,EACAzJ,EACAsJ,EACA3Q,EACAJ,EACAgR,EACA/I,EACAC,EACAE,EACAR,EACAJ,EACAoH,EACA4D,EAjBE2W,EAAU/O,KAAK9V,QACf4V,GAAA,EAAWpI,EAAAwiB,GAASnL,GAAS8zG,cAC7BrqH,GAAA,EAAWyR,EAAAiQ,GAASnL,GAAS8zG,cA6DnC,SAASnqH,IACLrL,EAAegwC,IACfzmC,GAAA,EACA5Q,GAAA,EACAJ,GAAA,EACAC,GACH,CAYD,SAASA,IACgB,OAAjB8Q,IACA6yB,aAAa7yB,GACbA,EAAe,KAEtB,CAED,SAAS8F,EAA0B/S,GAC/B7D,IAEID,IAIAo5B,MAAMt1B,KAAWs1B,MAAM3xB,KACvB3D,EAAuB,IAAf2D,GAGP2xB,MAAMt1B,KACPoN,EAAOwI,MAAM,uBAAyB5V,EAAQ,kBAC9CiN,EAAevE,WAAWyN,EAAgBnW,IAEjD,CAED,SAAS+V,IAAqC,IAArB/V,EAAqB1B,UAAAjC,OAAA,YAAAiC,UAAA,IAAAA,UAAA,GAC1C4O,GAAA,EACA,IAAME,EAAWhJ,EAAc25E,WAG3Bp6E,EAAMyJ,EAAShL,IAGf6K,EAAkB,KAChB3Q,EAA0BwH,EAAQwsJ,iBAAiBljJ,GACnDlR,EAAgBoI,EAAiBm3J,OAAOn/J,GAC1CuR,EAAc,KAClB,GAAI3R,IAAkB8D,EAClB2D,EAAMzH,EAAckG,IACpB6K,EAAkB/Q,EAAc8rI,gBAChCn6H,EAAc3R,EAAc+rI,gBACzB,CACH,IAAMj6H,EAAwB0H,EAA0BtI,GAClD3J,EAAca,EAAiBm3J,OAAOztJ,GACxCvK,IACAE,EAAMF,EAAYrB,IAClB6K,EAAkBxJ,EAAYukI,gBAC9Bn6H,EAAcpK,EAAYwkI,YAEjC,CAGGn5H,EAASi5H,WAAWpkI,KACpBA,EAAMmL,EAAS9I,QAAQrC,EAAKyJ,EAAShL,MAGzC+B,EAAe6uB,KAAKrvB,EAAKsJ,EAAiBY,EAC7C,CAED,SAAS6H,EAA0B1V,GAC/B,IAAMoN,EAAoBtJ,EAAQusJ,YAAYrwJ,GACxC2D,EAAsBmH,EAA0B0wJ,+BAA+BpuJ,GAErF,OAAOA,EAAkBxN,OAAO+D,EACnC,CAED,SAASuV,EAAOlZ,GACZ,GAAKA,GAME,GAAI8D,EAAQ83J,WAAW57J,GAAW,CAErC,IAAIiN,EAAQjN,EACZA,EAAWoE,EAAc25E,WAGzB,IAAI/vE,EAAelK,EAAQ+3J,aAAa77J,EAAUiN,GAC9C9I,EAAkB6J,EAEtB,GAAIA,EAAc,CAEd,IAAI3K,EAAcS,EAAQ0qJ,eAAexuJ,GAGzCmE,EAAkBL,EAAQg4J,qBAAqB97J,EAAUiN,GAGzD,IAAI5I,EAAqBP,EAAQ0qJ,eAAexuJ,GAGhDmE,EAAkBd,EAAYyU,WAAazT,EAAmByT,SACjE,CAGD,IAAK3T,EAGD,OAFAiJ,EAAOwI,MAAM,oEACbG,GAAA,GAKJ/V,EAASsnH,WAAa,IAAIzvG,IAC7B,OApCG7X,EAAWoE,EAAc25E,YAGhBupC,WAAa,IAAIzvG,KAqC9B,GAAIzT,EAAc25E,YAAc35E,EAAc25E,WAAW9/E,OAAS4P,EAAA2iB,EAAA0+G,SAAyBlvI,EAAS/B,OAAS4P,EAAA2iB,EAAA2+G,OAIzG,OAHA/4H,EAASue,QAAQlxB,EAAA+sB,EAAAu6G,mBACjB79H,GAAA,OACAhR,GAAA,GAIJkI,EAAc45E,SAASh+E,GAEvB,IAAMsE,EAAO,IAAIuT,KACXnU,GAAuBY,EAAKwT,UAAY9X,EAASsnH,WAAWxvG,WAAa,IAI5D,KAHnBnU,EAAeG,EAAQyqJ,wBAAwBvuJ,EAAU0D,IAG/B,aACtBC,EAAe,aAEnByS,EAASue,QAAQlxB,EAAA+sB,EAAAw1G,iBAAyB,CAAEsC,SAAUtoI,IACtDoN,EAAO0I,KAAK,kCAAoCxR,EAAO,IAAMA,EAAKwT,UAAY,IAAO,MAEhFxb,GACDyW,GAEP,CAED,SAASoD,IACD7Z,IAGA4Q,EACA6F,EAA0BrE,EAAS0I,MAAMskH,UAAUG,6BAGvD9lH,IACH,CAED,SAASE,EAAiBjW,GACjBA,EAAEwL,MAEIxL,EAAEwL,MAAM2pB,OAASjf,EAAAskI,4CACxB92I,EAAW8H,MAAMxL,EAAEwL,OAFnB0N,EAAOlZ,EAAEsoI,SAIhB,CAED,SAASrvH,IACL3c,GAAA,EACAyW,GACH,CAED,SAASsF,KACL/b,GAAYoS,EAAS0I,MAAMskH,UAAUiE,WAAWG,sBAG5C3jI,GAEP,CAED,SAASmb,IAELpK,GAAA,CACH,CAgBD,OAVAlN,EAAW,CACPqqI,WA9MJ,WACIr7H,IAEAoH,EAASgc,GAAG3uB,EAAA+sB,EAAAq2G,iBAAyBvvH,EAAmBhB,MACxDF,EAASgc,GAAG/tB,EAAAmsB,EAAA0lH,iBAAoCj9H,EAAmB3C,MACnEF,EAASgc,GAAG/tB,EAAAmsB,EAAA8lH,gBAAmCj+H,EAAkB/B,MACjEF,EAASgc,GAAG3uB,EAAA+sB,EAAAk1G,yBAAiCzvH,EAAkBK,KAClE,EAwMGylJ,YAtMJ,SAAqB/7J,GACjBkZ,EAAOlZ,EACV,EAqMGq6J,gBAAiBtkJ,EACjBqkJ,cARJ,WACI,OAAOltJ,CACV,EAOGqqI,UA5OJ,SAAmBv3I,GACVA,IAEDA,EAAO8kJ,gBACP1gJ,EAAgBpE,EAAO8kJ,eAEvB9kJ,EAAOmzG,UACPrvG,EAAU9D,EAAOmzG,SAEjBnzG,EAAOg8J,iBACP73J,EAAiBnE,EAAOg8J,gBAExBh8J,EAAOq+I,aACP36I,EAAa1D,EAAOq+I,YAEpBr+I,EAAOi8J,mBACP33J,EAAmBtE,EAAOi8J,kBAE1Bj8J,EAAOo5G,WACP1qG,EAAW1O,EAAOo5G,UAElBp5G,EAAOm2E,4BACPrrE,EAA4B9K,EAAOm2E,2BAE1C,EAqNGnnC,MA9LJ,WAEI54B,EAASsc,IAAIruB,EAAAmsB,EAAA0lH,iBAAoCj9H,EAAmB3C,MACpEF,EAASsc,IAAIruB,EAAAmsB,EAAA8lH,gBAAmCj+H,EAAkB/B,MAClEF,EAASsc,IAAIjvB,EAAA+sB,EAAAq2G,iBAAyBvvH,EAAmBhB,MACzDF,EAASsc,IAAIjvB,EAAA+sB,EAAAk1G,yBAAiCzvH,EAAkBK,MAEhEtH,GACH,GA3DG5B,GAAA,EAAS/J,EAAAmtB,GAAMnL,GAAS8zG,cAAcK,UAAUx5H,GAChDsE,EAAmBkyB,GAAiBnR,GAASzkB,SAoP1CZ,CACV,CAED42B,GAAgB+iG,sBAAwB,kBACxC,IAAA5iG,GAAe5yB,EAAAqsB,EAAAyqG,gBAA6BrkG,ICvQ5C,SAASM,KAEL,IAIIl3B,EACAoN,EACAzJ,EACAsJ,EACA3Q,EACAJ,EACA2R,EACAX,EACA/I,EACAE,EACAD,EACAE,EACAR,EACAJ,EACAoH,EACA4D,EAnBE2W,EAAU/O,KAAK9V,QACf4V,GAAA,EAAWpI,EAAAwiB,GAASnL,GAAS8zG,cAC7BrqH,GAAA,EAAWyR,EAAAiQ,GAASnL,GAAS8zG,cA6CnC,SAASh9H,IACL+Q,EAA4B,GAC5B/I,EAAgB,GAChBE,EAAiB,KACjBD,EAA2B,KAC3BN,EAAmB,KACnBQ,EAAaqvC,IACbhwC,GAAA,EACAsJ,GAAA,EACAvJ,EAAkCpH,EAAS8a,MAAMskH,UAAUuD,mBAAmBG,uBACjF,CA8DD,SAASrsH,IACAzW,EAAS8a,MAAMskH,UAAUuD,mBAAmBh/D,UAAWt8D,IAAmBsJ,GAA8BnJ,GAAqBA,EAAiBgE,OAAUhE,EAAiBi3C,cAAezlB,MAAMhxB,KAAegxB,MAAMh5B,EAAS8a,MAAMskH,UAAUuD,mBAAmBE,sBAIhQ/6H,IAA8ByT,KAAK6H,MAAQtb,GAA4B,IAlIrB,KAsItD8I,EAA4B,GAC5BD,GAAA,EAEA8I,EAD4Buf,MAAMh5B,EAAS8a,MAAMskH,UAAUuD,mBAAmBE,oBA1IlD,EA0IwE7iI,EAAS8a,MAAMskH,UAAUuD,mBAAmBE,qBAEnJ,CAOD,SAASppH,EAAuB/V,GAC5B,IACI,GAAIA,GAAY,EAEZ,YADAoZ,IAIJ,IAAMhM,EAAuByK,KAAK6H,MAClCxjB,EAAS4H,EAAiBi3C,aACtBj3C,EAAiBgE,OACjB,SAAUnE,GAEN,IAAMsJ,EAAsB4K,KAAK6H,MAC3BpjB,EAAS4c,EAAiB9L,EAAsBH,EAAqBtJ,GAE3EuJ,EAA0B6T,KAAKzkB,GAC/ByZ,EAAuB/V,EAAW,EACrC,IACD,WACIoZ,GACH,GAIR,CAFC,MAAOpZ,GACLoZ,GACH,CACJ,CAMD,SAAS1D,IAA0C,IAE3CtI,GAF2C9O,UAAAjC,OAAA,YAAAiC,UAAA,GAAAA,UAAA,GAAN,OAEd,EAK3B,IAAK6F,GAA0C,IAAzBA,EAAc9H,QAAgB+Q,GAASjJ,EAAc9H,OACvE4Z,QADJ,CAIA,IAAItS,EAASQ,EAAciJ,GAE3B,GAAIzJ,EAEA,GAAIzH,EAASe,eAAe0G,EAAOo3C,aAAc,CAE7C,IAAM9tC,GAAuB,IAAI4K,MAAOC,UACxC5b,EAASyH,EAAOo3C,aACZp3C,EAAOmE,OACP,SAAU9H,GAEN,IAAMoN,GAAsB,IAAIyK,MAAOC,UACjCxb,EAAS4c,EAAiBjM,EAAsBG,EAAqBpN,GAC3E8D,EAAmBH,EAEnBsS,EAAY3Z,EACf,IACD,WAIIoZ,EAAsBtI,EAAQ,EACjC,GAER,MAGGsI,EAAsBtI,EAAQ,QAIlC6I,GAhCH,CAmCJ,CAUD,SAASiD,EAAiBlZ,EAAsBoN,EAAqBzJ,GAGjE,OAAOA,GAFqByJ,GAAwBA,EAAsBpN,GAAwB,EAGrG,CA8BD,SAASiW,IAA0B,IAAdjW,EAAc1B,UAAAjC,OAAA,YAAAiC,UAAA,GAAAA,UAAA,GAALq1C,IACtBvmC,EAASkoB,MAAMt1B,GACfoN,GAAU9Q,EAAS8a,MAAMskH,UAAUuD,mBAAmBC,gCAEtD/lH,IAEAqX,EAA0BpjB,EAAQpN,EAEzC,CA+CD,SAASiZ,EAAmBjZ,GACxB,IAAIoN,EAAayK,KAAKoZ,MAAMjxB,GAM5B,OAJIs1B,MAAMloB,KACNA,EA3CR,SAAqCpN,GAEjC,IAKIoN,EACAzJ,EAEAsJ,EALgB,mHAKMc,KAAK/N,GAoB/B,OAfAoN,EAAUyK,KAAKgtI,IACXruI,SAASvJ,EAAM,GAAI,IACnBuJ,SAASvJ,EAAM,GAAI,IAAM,EACzBuJ,SAASvJ,EAAM,GAAI,IACnBuJ,SAASvJ,EAAM,GAAI,IACnBuJ,SAASvJ,EAAM,GAAI,IAClBA,EAAM,KAAOuJ,SAASvJ,EAAM,GAAI,KAAO,GACvCA,EAAM,IAlBqB,IAkBf6J,WAAW7J,EAAM,KAAkC,GAGhEA,EAAM,IAAMA,EAAM,MAClBtJ,EAvBoB,GAuBH6S,SAASvJ,EAAM,GAAI,IAAwBuJ,SAASvJ,EAAM,IAAK,IAChFG,IAAyB,MAAbH,EAAM,IAAc,EAAI,GAAMtJ,EAzBvB,GAES,KA0BzB,IAAIkU,KAAKzK,GAAS0K,SAC5B,CA/BD,CA2CiD9X,IAGtCoN,CACV,CAOD,SAASiL,EAAgBrY,GACrB,OAAO6X,KAAKoZ,MAAMjxB,EACrB,CAOD,SAASsX,EAAgBtX,GACrB,OAAO6X,KAAKoZ,MAAMjxB,EACrB,CASD,SAASyS,EAAqBzS,EAAKoN,EAAazJ,GAC5CA,GACH,CAQD,SAAS4T,EAAevX,EAAeoN,EAAazJ,GAChD,IAAIsJ,EAAOgM,EAAmBjZ,GAEzBs1B,MAAMroB,GAKXtJ,IAJIyJ,EAAYH,EAKnB,CAWD,SAASpC,EAAa7K,EAASoN,EAAKzJ,EAAasJ,EAAa3Q,GAC1D,IAAIJ,EACA2R,EACAX,GAAA,EACAc,EAAM,IAAIlH,eAEVrD,EAAOnH,EAAgB6Z,EAAAD,EAAAgmJ,KAAmB/lJ,EAAAD,EAAAq+I,IAC1CpwJ,EAAOiJ,EAAI8iB,MAAM,QA0CrB,GAtCA9iB,EAAMjJ,EAAKoiB,QAEXrqB,EAAa,WACLgR,IAMJA,GAAA,EAGI/I,EAAK9H,OACLwO,EAAa7K,EAASmE,EAAKoK,KAAK,KAAM5K,EAAasJ,EAAa3Q,GAEhE2Q,IAEP,EAEDY,EAAS,WACL,IAAIT,EACAH,EAEe,MAAfe,EAAIpG,SACJwF,EAAO9Q,EACH0R,EAAIikE,kBAAkB,QACtBjkE,EAAItG,SAERuF,EAASjN,EAAQoN,GAGZkoB,MAAMroB,KACPtJ,EAAYsJ,GACZC,GAAA,GAGX,EAEG4B,EAASi5H,WAAW36H,GAAM,CAE1B,IAAM/J,EAAUqL,EAAkB1I,UAC9B3C,IACA+J,EAAM0B,EAAS9I,QAAQoH,EAAK/J,EAAQjB,KAE3C,CAED4L,EAAIhG,KAAKvE,EAAM2J,GACfY,EAAI3F,QAhcY,IAichB2F,EAAIywG,OAAS5wG,EACbG,EAAIzG,UAAYrL,EAChB8R,EAAIxD,MACP,CASD,SAASlH,EAAiBtD,EAAKoN,EAAazJ,GACxCkH,EAAayM,EAAiBtX,EAAKoN,EAAazJ,GAAA,EACnD,CAMD,SAASwV,IACL,IAAInZ,EAAkB6N,EAAYsuJ,mCAAmC,QACjE/uJ,EAAqC,OAApBpN,EAA2B,IAAI6X,KAAK7X,GAAiB8X,UAAYtJ,OAAOmlC,IAExFre,MAAMloB,GAIPojB,GAAA,GAFAA,GAAA,EAD6BpjB,EAAiByK,KAAK6H,MAK1D,CAQD,SAAS8Q,EAA0BxwB,EAAQiN,GAQvC,GALKqoB,MAAMhxB,IAAgBgxB,MAAMroB,IAAYjN,GA+BjD,SAAwCA,GACpC,IACI,IAKI2D,EALEsJ,EAA+B6M,EAA8B9Z,GAC7D9D,EAA2Bo5B,MAAM5xB,GAxgBR,GAwgB2CA,EACpEmK,EAA2CynB,MAAMh5B,EAAS8a,MAAMskH,UAAUuD,mBAAmBM,yCA3gBlD,EA2gB6FjjI,EAAS8a,MAAMskH,UAAUuD,mBAAmBM,wCACpLryH,EAAkCooB,MAAMh5B,EAAS8a,MAAMskH,UAAUuD,mBAAmBI,gCAxgB5D,IAwgB8F/iI,EAAS8a,MAAMskH,UAAUuD,mBAAmBI,+BAClKrxH,EAAkCsnB,MAAMh5B,EAAS8a,MAAMskH,UAAUuD,mBAAmBK,gCAxgB5D,EAwgB8FhjI,EAAS8a,MAAMskH,UAAUuD,mBAAmBK,+BAGpKryH,GAEAtJ,EAAkCiL,KAAK+M,IAAIzf,EAA0B2R,EAAyCX,GAC9GE,EAAOwI,MAAP,yCAAAhW,OAAsD+D,MAGtDA,EAAkCiL,KAAKgN,IAAI1f,EAA0B2R,EAAyCG,GAC9GZ,EAAOwI,MAAP,yCAAAhW,OAAsD+D,KAG1DD,EAAkCC,CAGrC,CAFC,MAAO3D,GAER,CACJ,CAvBD,CA9BuCiN,IAI9BjN,IAAWs1B,MAAMroB,GAAS,CAC3B5I,EAAiBwT,KAAK6H,MACtB/b,GAAA,EAGA,IAAMzH,EAA8Bo5B,MAAMhxB,GAC1CA,EAAa2I,EACT/Q,GACA6W,IAEJ3F,EAAOwI,MAAP,yDAAAhW,OAAsEqN,GACzE,CAEGjN,IACA8D,EAAmB,KACnBH,GAAA,EACAmH,EAAWU,MAAM,IAAIwD,EAAAwhB,EAAYta,EAAA0kI,4BAAoC1kI,EAAAmmI,kCAIzEjmI,EAASue,QAAQlxB,EAAA+sB,EAAA02G,wBAAgC,CAC7CxgH,OAAQzZ,IAEZmJ,EAASue,QAAQlxB,EAAA+sB,EAAAy2G,+BACpB,CA+BD,SAAS7tH,IACL,GAAKlM,GAAkE,IAArCA,EAA0B7Q,OAA5D,CAIA,IAAM2D,EAAgBkN,EAA0BggB,QAAO,SAACltB,EAAKoN,GACzD,OAAOpN,EAAMoN,CAChB,GAAE,GAAKF,EAA0B7Q,OAE7Byd,EAA8B9Z,GAO/BoN,EAAOwI,MAAP,2FANAxI,EAAOwI,MAAP,oEAAAhW,OAAiFI,IACjFsE,EAAatE,EACboW,EAASue,QAAQlxB,EAAA+sB,EAAA02G,wBAAgC,CAC7CxgH,OAAQpiB,KAMhB2I,GAAA,EACA7I,EAA2ByT,KAAK6H,KAjB/B,CAkBJ,CAED,SAAS5F,EAA8B9Z,GACnC,IACI,GAAIs1B,MAAMhxB,GACN,OAAO,EAGX,IAAM8I,EAAkB9Q,EAAS8a,MAAMskH,UAAUuD,mBAAmBO,sBAAwBlqG,MAAMh5B,EAAS8a,MAAMskH,UAAUuD,mBAAmBO,qBAAuBljI,EAAS8a,MAAMskH,UAAUuD,mBAAmBO,oBAlkBvL,IAskB1B,OAAOx/H,GAHYsE,EAAa8I,GAGDpN,GAFZsE,EAAa8I,CAKnC,CAFC,MAAOpN,GACL,OAAO,CACV,CACJ,CAiBD,OATAA,EAAW,CACPqqI,WA3gBJ,WACIluI,IAGAD,EAAW,CACP,mCAAoCoH,EACpC,qCAAsCuH,EAAa3K,KAAK,KAAM+Y,GAC9D,kCAAmCpO,EAAa3K,KAAK,KAAMmY,GAC3D,gCAAiCd,EAIjC,mCAAoCjU,EACpC,qCAAsCuH,EAAa3K,KAAK,KAAM+Y,GAC9D,kCAAmCpO,EAAa3K,KAAK,KAAMmY,GAC3D,gCAAiCd,EAMjC,kCAAmC9E,EAGnC,6BAA8BA,EAC9B,8BAA+BA,EAGtC,EAgfG2pJ,YAzeJ,SAAqBp8J,EAAUoN,GAE3BjJ,EAAgBnE,EAGZ2D,IAuIR,SAAuC3D,GACnC,IACI,IAAKA,IAAc1D,EAAS8a,MAAMskH,UAAUuD,mBAAmBh/D,QAC3D,OAAO,EAEX,IAAM7yD,EAA2BkoB,MAAM5xB,GAzPR,GAyP2CA,EAE1E,QAAKW,GAAmB+I,IAA2BkoB,MAAMloB,MAIhDyK,KAAK6H,MAAQrb,GAAkB,KAAS+I,CAGpD,CAFC,MAAOpN,GACL,OAAO,CACV,CACJ,CAfD,CAlIuCoN,IAKnCzJ,GAAA,EACA+R,KALIU,EAASue,QAAQlxB,EAAA+sB,EAAAy2G,gCAMxB,EAydGsQ,UAhjBJ,SAAmBv3I,GACVA,IAEDA,EAAOs0I,cACPzmI,EAAc7N,EAAOs0I,aAGrBt0I,EAAO8nI,oBACPp5H,EAAoB1O,EAAO8nI,mBAG3B9nI,EAAOq+I,aACPvzI,EAAa9K,EAAOq+I,YAGpBr+I,EAAOo5G,WACP98G,EAAW0D,EAAOo5G,UAEzB,EA+hBGpqE,MAVJ,WACI7yC,IAEAia,EAASsc,IAAIjvB,EAAA+sB,EAAAq0G,wBAAgC9xH,EAA0B/S,EAC1E,GAhjBGoN,GAAA,EAAS/J,EAAAmtB,GAAMnL,GAAS8zG,cAAcK,UAAUx5H,GAEhDoW,EAASgc,GAAG3uB,EAAA+sB,EAAAq0G,wBAAgC9xH,EAA0B/S,GAyjBnEA,CACV,CAEDk3B,GAAmByiG,sBAAwB,qBAC3C,IAAMtiG,GAAUlzB,EAAAqsB,EAAAopG,oBAAiC1iG,IACjDG,GAAQglI,gBAjmBgB,IAkmBxBl4J,EAAAqsB,EAAA2pG,uBAAoCjjG,GAAmByiG,sBAAuBtiG,IAC9E,IAAA4iB,GAAA5iB,GCvmBA,SAAS6iB,KAEL,IAAIl6C,EACAoN,EACAzJ,EACAsJ,EACA3Q,EAEEJ,EAAUoa,KAAK9V,QACfqN,GAAA,EAAWG,EAAAwiB,GAASt0B,GAASi9H,cAmInC,OAZAn5H,EAAW,CACPs8J,kBA3FJ,SAA2Bt8J,GAEvB,IAAI2D,EAAYX,OAAOolB,IAAIuiC,gBAAgBv9C,GAc3C,OAZApN,EAAWu8J,UAAU54J,GAEG,uBAApBsJ,IACAjN,EAAWw8J,0BAAA,GACXpvJ,EAAYpD,iBAAiB,kBAAkB,WAC3C6D,EAAS8mB,QAAQtwB,EAAAmsB,EAAAwxH,qCACpB,IACD50I,EAAYpD,iBAAiB,gBAAgB,WACzC6D,EAAS8mB,QAAQtwB,EAAAmsB,EAAAyxH,mCACpB,KAGEt+I,CACV,EA2EG84J,kBAnHJ,WAEI,IAAIz8J,EAAa,sBAAuBgD,OACpCW,EAAkB,gBAAiBX,OAiBvC,MAhB6B,uBAAwBA,QAIjDoK,EAAc,IAAIyb,mBAClB5b,EAAkB,qBAClB3Q,EAAOwZ,KAAP,+BACOnS,GACPyJ,EAAc,IAAIwb,YAClB3b,EAAkB,cAClB3Q,EAAOwZ,KAAP,wBACO9V,IACPoN,EAAc,IAAI0b,kBAClBxsB,EAAOwZ,KAAP,8BAGG1I,CACV,EA+FGsvJ,kBA1EJ,SAA2B18J,GACvBA,EAAWu8J,UAAU,KACxB,EAyEGhlB,UAbJ,SAAmBv3I,GACVA,GAGDA,EAAOo5G,WACPz1G,EAAW3D,EAAOo5G,SAEzB,EAOGujD,YAxEJ,SAAS38J,EAAYiN,GACZG,GAA0C,SAA3BA,EAAY7E,aAClB,OAAV0E,GAAkBqoB,MAAMroB,IACxBG,EAAY4K,WAAa/K,IAEzBA,IAAU,KAAatJ,EAASyT,MAAMskH,UAAUr6G,OAAOk9G,8BACvDtxH,EAAQ2B,KAAK+U,IAAI,EAAG,KAsC5B,SAA0B3jB,GAEtB,IADA,IAAIoN,EAAUpN,EAAOozD,cACZzvD,EAAI,EAAGA,EAAIyJ,EAAQ/Q,OAAQsH,IAChC,GAAIyJ,EAAQzJ,GAAGgtD,SACX,OAAO,EAGf,OAAO,CACV,CARD,CAnC0BvjD,GAIlB1E,WAAW1I,EAAYE,KAAK,KAAM+M,GAAQ,KAH1C3Q,EAAOwZ,KAAK,4BAA8B7I,GAC1CG,EAAY4K,SAAW/K,IAI9B,EA0DG2vJ,YAxDJ,SAAqB58J,EAAO2D,GACpByJ,GAA2D,mBAArCA,EAAYonD,sBAAqF,mBAAvCpnD,EAAYyvJ,wBACjE,SAA3BzvJ,EAAY7E,YAAyBvI,GAAS,GAAKA,EAAQ2D,IAC3DyJ,EAAYyvJ,yBACZzvJ,EAAYonD,qBAAqBx0D,EAAO2D,GAE/C,EAmDGm5J,kBAjDJ,SAA2B98J,GACvB,GAAKA,GAAgC,SAAtBA,EAAOuI,WAAtB,CAMA,IAFA,IAAI6E,EAAUpN,EAAOozD,cAEZzvD,EAAI,EAAGA,EAAIyJ,EAAQ/Q,OAAQsH,IAAK,CACrC,GAAIyJ,EAAQzJ,GAAGgtD,SACX,OAEJ,GAAmC,IAA/BvjD,EAAQzJ,GAAG42B,SAASl+B,OACpB,MAEP,CACDC,EAAOwZ,KAAK,mCACZ9V,EAAOizD,aAbN,CAcJ,GA3FG32D,GAAA,EAAS+G,EAAAmtB,GAAMt0B,GAASi9H,cAAcK,UAAUx5H,GAgI7CA,CACV,CAEDk6C,GAAsBy/E,sBAAwB,wBAC9C,IAAAn/E,GAAer2C,EAAAqsB,EAAAopG,oBAAiC1/E,IC9IhD,SAASK,KAEL,IAiBIv6C,EACAoN,EACAzJ,EACAsJ,EACA3Q,EACAJ,EACA2R,EACAX,EACAzJ,EACAU,EACAC,EA3BEE,EAAoB,2BAQpBR,EACS,YADTJ,EAEO,UAFPoH,EAGK,QAGL4D,EAAU4H,KAAK9V,QACf6kB,GAAA,EAAWrX,EAAAwiB,GAAS9hB,GAASyqH,cAyBnC,SAAS/iH,IACL,IAAKvI,IAAoBX,EACrB,MAAM,IAAIM,MAAM,iDAEvB,CAKD,SAASsB,IACL1K,GAAA,EACAT,EAAe,CAAC,EAChBsJ,EAAe,CAAC,EAChB3Q,EAAgB,KAChB6H,GAAA,EACAjI,EAAqB2b,KAAK6H,MAAQ,GACrC,CAsCD,SAAS1Q,IACL,IACI,IAAK7K,EAAyB,CAC1BA,GAAA,EACA,IAAMnE,EAAmBkN,EAAmB4K,UACxCxb,EAA6B0D,EAAmB9D,EAGpDI,EAA4BJ,EAAqB,EAAI0S,KAAKgN,IAAI,EAAGtf,GAA6B,EAE9FH,EAAe8Q,EAAc3Q,EAA2B0D,GACxD7D,EAAewH,EAAcrH,EAA2B0D,GACxD+S,EAA4B9F,GAC5B8F,EAA4BpP,GAE5BzH,EAAqB8D,EACrBmE,GAAA,CACH,CAIJ,CAHC,MAAOnE,GACLmE,GAAA,EACAiJ,EAAO5B,MAAMxL,EAChB,CACJ,CASD,SAAS7D,EAAe6D,EAAQ2D,EAA2BsJ,GACvD,IAcIiM,EAA2BlZ,GAbV,SAAU1D,GACvB,QAAI,IAAAA,EAAqB,CACrB,IAAMJ,EAAYo5B,MAAMh5B,EAAM0b,UAA6B,EAAjB1b,EAAM0b,SAE3C1b,EAAMgzJ,4BAA8BriJ,GAAoB3Q,EAAMgzJ,2BAA6B3rJ,EAA4BzH,GAAY+Q,EACpIgJ,EAAY3Z,EAAO+H,EAAAmsB,EAAAusI,sBACZ5mJ,EAAiBlJ,EAAkB/Q,EAAWyH,EAA2BrH,EAAMgzJ,6BAmR1G,SAAyBtvJ,GACrB,IACI,IAAM2D,EAAgB3D,EAAM8qJ,YAAY1iB,OAAOxvH,MAAQ5Y,EAAM8qJ,YAAY1iB,OAAOpwH,SAEhF,OAAOhY,EAAMsvJ,2BAA6B3rJ,CAI7C,CAHC,MAAO3D,GAEL,OADAoN,EAAO5B,MAAMxL,IAAA,CAEhB,CACJ,CATD,CAnRyJ1D,MACrI8Q,EAAOwI,MAAP,kBAAAhW,OAA+BtD,EAAM2b,GAArC,iBAAArY,OAAuDtD,EAAMwuJ,YAAY1iB,OAAOnwH,GAAhF,iCA6UpB,SAAsBjY,EAAQ2D,GAC1B,IACI,IAAMsJ,EAActJ,EAAMmnJ,YAAY/vG,YAChCz+C,EAAWqH,EAAMmnJ,YAAY1iB,OAAOnwH,GACpC/b,EAAQyH,EAAMmnJ,YAAYhjJ,MAC1B+F,EAAKlK,EAAMsU,GAEjBjY,EAAO1D,GAAU2Q,GAAejN,EAAO1D,GAAU2Q,GAAaoK,QAAO,SAACrX,GAClE,OAAQ9D,GAAS8D,EAAE8qJ,YAAYhjJ,OAAS9H,EAAE8qJ,YAAYhjJ,QAAU5L,GAAU8D,EAAEiY,KAAOpK,CACtF,IAE4C,IAAzC7N,EAAO1D,GAAU2Q,GAAa5Q,eACvB2D,EAAO1D,GAAU2Q,EAI/B,CAFC,MAAOjN,GACLoN,EAAO5B,MAAMxL,EAChB,CACJ,CAjBD,CA5UiCA,EAAQ1D,GAE5B,CACJ,GAKJ,CAFC,MAAO0D,GACLoN,EAAO5B,MAAMxL,EAChB,CACJ,CAOD,SAAS+S,EAA4B/S,GACjC,IACI,IAAK,IAAM2D,KAAO3D,EACVA,EAAO/C,eAAe0G,IACkB,IAApC7G,OAAOP,KAAKyD,EAAO2D,IAAMtH,eAClB2D,EAAO2D,EAK7B,CAFC,MAAO3D,GACLoN,EAAO5B,MAAMxL,EAChB,CACJ,CAsFD,SAAS+V,EAAkB/V,EAAOoN,GAA+C,IAAvCzJ,EAAuCrF,UAAAjC,OAAA,YAAAiC,UAAA,IAAAA,UAAA,GACvE2O,EAAcjN,EAAM8qJ,YAAY/vG,YAChCz+C,EAAQ0D,EAAM8qJ,YAAYhjJ,MAC1B5L,EAAK8D,EAAMiY,GACbpK,EAAa/J,EAEZsJ,EAAOH,KACRG,EAAOH,GAAe,IAG1B,IAAMC,EAAuBE,EAAOH,GAAayuJ,WAAU,SAAC17J,GACxD,QAAU1D,GAAU0D,EAAE8qJ,YAAYhjJ,OAAS9H,EAAE8qJ,YAAYhjJ,QAAUxL,IAAY0D,EAAEiY,KAAO/b,CAC3F,IAGD,IAA8B,IAA1BgR,EACAE,EAAOH,GAAa8T,KAAK/gB,GACzBA,EAAMg9J,wBAAA,EACNh9J,EAAMi9J,qBAAA,EACNpvJ,EAAa/C,OAIZ,GAAInH,EAA+B,CACpC,IAAMqK,EAAWZ,EAAOH,GAAaC,GACrClN,EAAMg9J,uBAAyBhvJ,EAASgvJ,uBACxCh9J,EAAMi9J,oBAAsBjvJ,EAASivJ,oBACrC7vJ,EAAOH,GAAaC,GAAwBlN,EAC5C6N,EAAanK,CAChB,CAED,OAAOmK,CACV,CAOD,SAAS6H,EAA2B1V,GAChC,IACI,GAhSiB,GAgSbA,EAAM8qJ,YAAYhjJ,MAA2B,CAC7C,IACInE,EADEsJ,EAAajN,EAAMsvJ,2BAGrB3rJ,EADoC,YAApC3D,EAAMsvJ,2BACQ37G,IAEA3zC,EAAMsvJ,2BAA6BtvJ,EAAMgY,SAG3DqN,EAASsP,QAAQtwB,EAAAmsB,EAAAmzH,0BAA6C,CAC1D1rI,GAAIjY,EAAMiY,GACVilJ,WAAYjwJ,EACZs2I,YAAa5/I,EACbw5J,sBAAuBxpH,KACxB,CACC7d,KAAMzxB,EAAAmsB,EAAAusI,qBAEb,CAGJ,CAFC,MAAO/8J,GACLoN,EAAO5B,MAAMxL,EAChB,CACJ,CAqBD,SAASkW,EAAwBlW,GAC7B,IACI,IAAM2D,EAAcuJ,EAAmB4K,UAiBvCoB,EAA2BlZ,GAhBV,SAAUA,GACvB,IAAMoN,EAAiBpN,EAAM8qJ,aAAe9qJ,EAAM8qJ,YAAY1iB,SAAW9yG,MAAMt1B,EAAM8qJ,YAAY1iB,OAAOpwH,UAAYhY,EAAM8qJ,YAAY1iB,OAAOpwH,SAAW27B,IAClJ1mC,EAAcjN,EAAM8qJ,aAAe9qJ,EAAM8qJ,YAAY1iB,SAAW9yG,MAAMt1B,EAAM8qJ,YAAY1iB,OAAOxvH,OAAS5Y,EAAM8qJ,YAAY1iB,OAAOxvH,MAAQ+6B,IAE/I,IAAIre,MAAMloB,KAAmBkoB,MAAMroB,GAAnC,CAIA,IAAM3Q,EAAsC0D,EAAMsvJ,2BAE9C1gJ,KAAKC,IAAIvS,EAAsCqH,GAlV5B,KAmVnBsS,EAAYjW,EAAOqE,EAAAmsB,EAAAusI,oBALtB,CAQJ,GAMJ,CAFC,MAAO/8J,GACLoN,EAAO5B,MAAMxL,EAChB,CACJ,CAQD,SAASkZ,EAA2BlZ,EAAQ2D,GACxC,IACI,GAAI3D,EAEA,IADA,IAAMiN,EAAYnQ,OAAOP,KAAKyD,GACrB1D,EAAI,EAAGA,EAAI2Q,EAAU5Q,OAAQC,IAGlC,IAFA,IAAMJ,EAAgB8D,EAAOiN,EAAU3Q,IACjCuR,EAAe/Q,OAAOP,KAAKL,GACxBgR,EAAI,EAAGA,EAAIW,EAAaxR,OAAQ6Q,IACdhR,EAAc2R,EAAaX,IACnCxD,SAAQ,SAAC1J,QAAA,IAChBA,GACA2D,EAAS3D,EAEhB,GAMhB,CAFC,MAAOA,GACLoN,EAAO5B,MAAMxL,EAChB,CACJ,CAUD,SAASmW,EAAiBnW,EAAkB2D,EAAWsJ,GACnD,IACI,OAAOjN,EAAmB2D,EAAYsJ,CAIzC,CAHC,MAAOjN,GAEL,OADAoN,EAAO5B,MAAMxL,IAAA,CAEhB,CACJ,CA4BD,SAASiW,EAAYjW,EAAO2D,GACxB,IACI,IAAMsJ,EAAmBC,EAAmB4K,UACtCxb,EAAU0D,EAAMiY,GAEtB,GAAItU,IAASU,EAAAmsB,EAAAgqG,wBAA4Cx6H,EAAMg9J,uBAI3D,OAHA5vJ,EAAOwI,MAAP,kBAAAhW,OAA+BtD,IAC/B0D,EAAMg9J,wBAAA,OACN33I,EAASsP,QAAQ30B,EAAM8qJ,YAAY/vG,YAAa,CAAErE,MAAO12C,GAAS,CAAE81B,KAAAnyB,IAInE3D,EAAMi9J,sBACHj9J,EAAM8qJ,YAAY/vG,cAAgBz2C,GAxbzB,GAwb8CtE,EAAM8qJ,YAAYhjJ,MAElD,IAAnB9H,EAAMgY,UAAkD,IAAhChY,EAAMk7C,wBAC9B9tC,EAAOwI,MAAP,mCAAAhW,OAAgDtD,EAAhD,QAAAsD,OAA8DqN,IA8ClF,WACI,IACImJ,IACAvI,EAAgBwsJ,iBAGnB,CAFC,MAAOr6J,GACLoN,EAAO5B,MAAMxL,EAChB,CACJ,CAPD,IAve4B,sCA4bLA,EAAM8qJ,YAAY/vG,aA3bd,GA2bqD/6C,EAAM8qJ,YAAYhjJ,OAClFsF,EAAOwI,MAAP,2BAAAhW,OAAwCtD,EAAxC,QAAAsD,OAAsDqN,IAwDtE,SAA8BjN,GAC1B,OACiBghB,GAAAwP,GAAU9hB,GAAS9N,OAAO,CAAC,GACjCoyB,KAAK,CACR/qB,OAAQ,MACR7F,IAAKpC,EACLU,QAAS,CACL6F,aAAc,gBAKzB,CAFC,MAAOvG,GACLoN,EAAO5B,MAAMxL,EAChB,CACJ,CAbD,CAvDqCA,EAAM6qJ,eAE3Bz9I,EAAOwI,MAAP,kBAAAhW,OAA+BtD,EAA/B,iBAAAsD,OAAsDI,EAAM8qJ,YAAY1iB,OAAOnwH,GAA/E,QAAArY,OAAwFqN,IACxFoY,EAASsP,QAAQ30B,EAAM8qJ,YAAY/vG,YAAa,CAAErE,MAAO12C,GAAS,CAAE81B,KAAAnyB,KAExE3D,EAAMi9J,qBAAA,EAIb,CAFC,MAAOj9J,GACLoN,EAAO5B,MAAMxL,EAChB,CACJ,CAwHD,OAZAA,EAAW,CACPw3J,gBA7YJ,SAAyBx3J,EAAQiN,GAC7B,IAOI,GANAmJ,IAEKzS,EAAasJ,KACdtJ,EAAasJ,GAAY,CAAC,GAG1BjN,EACA,IAAK,IAAI1D,EAAI,EAAGA,EAAI0D,EAAO3D,OAAQC,IAAK,CACpC,IAAIJ,EAAQ8D,EAAO1D,GAGnB,IAAK6Z,EAFejJ,EAAmB4K,UACrBwd,MAAMp5B,EAAM8b,UAA6B,EAAjB9b,EAAM8b,SACH9b,EAAMozJ,4BAA6B,CAC5E,IAAIzhJ,EAASkI,EAAkB7Z,EAAOyH,EAAasJ,IAAA,GAE/CY,IAAW/C,GACXsC,EAAOwI,MAAP,8BAAAhW,OAA2C1D,EAAM+b,GAAjD,iBAAArY,OAAmEqN,IAEnEgJ,EAAY/Z,EAAOmI,EAAAmsB,EAAAgqG,wBACZ3sH,IAAWnK,GAClB0J,EAAOwI,MAAP,gCAAAhW,OAA6C1D,EAAM+b,GAAnD,iBAAArY,OAAqEqN,GAE5E,CACJ,CAIR,CAFC,MAAOjN,GACL,MAAMA,CACT,CACJ,EAiXG+3J,gBAzWJ,SAAyB/3J,EAAQ2D,GAC7B,IACIyS,IAEKnJ,EAAatJ,KACdsJ,EAAatJ,GAAY,CAAC,GAG9B,IAAK,IAAIrH,EAAI,EAAGA,EAAI0D,EAAO3D,OAAQC,IAAK,CACpC,IAAIJ,EAAQ8D,EAAO1D,GAGd6Z,EAFejJ,EAAmB4K,UACrBwd,MAAMp5B,EAAM8b,UAA6B,EAAjB9b,EAAM8b,SACH9b,EAAMozJ,8BAClCv5I,EAAkB7Z,EAAO+Q,EAAatJ,IAAA,KAEpCmH,GACP5O,EAAM4uJ,YAAY/vG,cAAgBz2C,GAClCoR,EAA2BxZ,GAE/BkR,EAAOwI,MAAP,8BAAAhW,OAA2C1D,EAAM+b,GAAjD,iBAAArY,OAAmE+D,IACnEsS,EAAY/Z,EAAOmI,EAAAmsB,EAAAgqG,wBAEnBptH,EAAOwI,MAAP,mCAAAhW,OAAgD1D,EAAM4uJ,YAAY/vG,YAAlE,YAAAn7C,OAAwF1D,EAAM4uJ,YAAYhjJ,MAA1G,gBAAAlI,OAA8H+D,EAA9H,kBAAA/D,OAAuJ1D,EAAM+b,GAA7J,mDAGX,CACDjJ,GAGH,CAFC,MAAOhP,GACL,MAAMA,CACT,CACJ,EA4UGo9J,gBAfJ,WACI,OAAOnwJ,CACV,EAcGowJ,gBAxBJ,WACI,OAAO15J,CACV,EAuBGiV,MA/eJ,WACI,IACIxC,IACAhJ,EAAOwI,MAAM,0BACb,IAAM5V,EAAeyD,EAAS2T,MAAMskH,UAAUS,4BACzC/3H,GAAckxB,MAAMt1B,KACrBoE,GAAA,EACA9H,EAAgBgpC,YAAYt2B,EAAehP,GAIlD,CAFC,MAAOA,GACL,MAAMA,CACT,CACJ,EAoeGu3I,UAlDJ,SAAmBv3I,GACf,IACI,IAAKA,EACD,OAEAA,EAAOw2J,kBACP3oJ,EAAkB7N,EAAOw2J,iBAEzBx2J,EAAOw+I,qBACPtxI,EAAqBlN,EAAOw+I,oBAE5Bx+I,EAAOo5G,WACP31G,EAAWzD,EAAOo5G,SAKzB,CAFC,MAAOp5G,GACL,MAAMA,CACT,CACJ,EAiCGgvC,MAZJ,uBApfI,IAC0B,OAAlB1yC,GAA0B8H,IAC1BshC,cAAcppC,GACdA,EAAgB,KAChB8H,GAAA,EA0PZ,WACI,IAEI8R,EAAwBjJ,GACxBiJ,EAAwBvS,EAG3B,CAFC,MAAO3D,GACLoN,EAAO5B,MAAMxL,EAChB,CACJ,CARD,GArPK,CAFC,MAAOA,GACL,MAAMA,CACT,CACJ,EA0eD,GAEI8O,GACH,GAphBG1B,GAAA,EAAS/J,EAAAmtB,GAAM9hB,GAASyqH,cAAcK,UAAUx5H,GAChD8O,IAiiBG9O,CACV,CAEDu6C,GAAgBo/E,sBAAwB,kBACxC,IAAAv+E,GAAej3C,EAAAqsB,EAAAopG,oBAAiCr/E,IC/kBhDnoB,GAAA,CACIkrI,OAAQ,CACJC,WAAY,aACZ7mC,QAAS,UACTxkH,MAAO,SAEXsrJ,OAAQ,CACJC,sBAAuB,CACnBtgK,IAAK,wBACL+O,QAAS,wJAEbwxJ,oCAAqC,CACjCvgK,IAAK,sCACL+O,QAAS,+FAEbyxJ,mBAAoB,CAChBxgK,IAAK,qBACL+O,QAAS,kJAAAiO,GAAAna,EAAAoN,IAAA,MAAAA,GAAAA,EAAApN,EAAA3D,UAAA+Q,EAAApN,EAAA3D,QAAA,QAAAsH,EAAA,EAAAsJ,EAAA,IAAAzQ,MAAA4Q,GAAAzJ,EAAAyJ,EAAAzJ,IAAAsJ,EAAAtJ,GAAA3D,EAAA2D,GAAA,OAAAsJ,CAAA,CCKrB,SAAS2uC,KAEL,IAGI57C,EAAUoN,EAAQzJ,EAAcsJ,EAAoB3Q,EAAiBuR,EAAgB1J,EAAeC,EACpGE,EAAaR,EAAuBJ,EAAoBoH,EAA2B4D,EACnF2W,EAAuBjP,EAAkBtH,EAAe3S,EAAiB4W,EAAiBgD,EAC1FL,EAAYwD,EAAmB/C,EAASF,EAAcgD,EAAsBZ,EAAgBf,EAC5F7E,EAAU5H,EAA6BvH,EAAe6V,EAAwBqX,EAAapX,EAC3FU,EAAoB5V,EAA8BujB,EAAkBzH,EAAuBvD,EAC3FkD,EAAiBzD,EAAwBoE,EAA4BP,EAAaM,EAClFE,EAAoBC,EACpBkQ,GAAuB/P,GAA6BgQ,GAAmBjQ,GAXrEE,GAAUtK,KAAK9V,QACfygB,IAAA,EAAWjT,EAAAwiB,GAAS5P,IAASu4G,cAkHnC,SAASn4G,KACL,KAAKnT,GAAmBA,EAAe5Q,eAAe,SAAYic,GAAsBA,EAAkBjc,eAAe,eAAkBic,EAAkBjc,eAAe,UAAaic,EAAkBjc,eAAe,wBAA2BkH,GAAkBuR,GAAepR,GAAgBwV,GAClS,MAAM,IAAItM,MAAMtR,EAAAs0B,EAAA+iH,qBAEvB,CAED,SAASrxH,KACL,IAAK5lB,IAAoBA,EAAgBW,eAAe,eACpD,MAAM,IAAIuQ,MAAM,kDAEvB,CA4BD,SAAS2T,MAgBT,WACI,IACI,IAAMnhB,EAAcoE,EAAQw5J,iBAE5B,IAAK3nJ,GAAuC,IAAvBjW,EAAY3D,OAC7B,MAAM,IAAImR,MAAM,mCAGhByI,GAAgBjW,EAAY3D,OAAS,GACrCiI,EAAY6+I,yBAAyB,CACjCnqH,YAAalf,EAAmBhC,UAChCyiB,SAAUnhB,EAAWykJ,iBACrB90B,sBAAuB/oI,EAAY,GAAG4Y,MACtCklJ,iBAAkB5kJ,EAAkB2/H,wBAKxC1iI,EAAQ9Z,OAAS,GAg8B7B,SAAgC2D,GACD,IAAvBA,EAAY3D,OAKhB8Z,EAAUA,EAAQkB,QAAO,SAAC1T,GACtB,IAIMsJ,EAJkBjN,EAAYqX,QAAO,SAACrX,GACxC,OAAOA,EAAMiY,KAAOtU,EAAOuqJ,OAC9B,IAAE7xJ,OAAS,GAEgCsH,EAAOuqJ,UAAYj4I,EAAai4I,QAO5E,OALKjhJ,IACDG,EAAOwI,MAAP,mBAAAhW,OAAgC+D,EAAOuqJ,UACvCvqJ,EAAOqrC,OAAA,IAGJ/hC,CACV,IAjBGG,EAAOX,KAAP,kGAkBP,CApBD,CA/7BmCzM,GAI3B,IADA,IAAM2D,EAAW,GACRsJ,EAAI,EAAG3Q,EAAK0D,EAAY3D,OAAQ4Q,EAAI3Q,EAAI2Q,IAAK,CAClD,IAAM/Q,EAAa8D,EAAYiN,GAC/BtJ,EAASod,KAAKuB,GAA0BpmB,IACxCoI,EAAYy5J,4BAA4B7hK,EAC3C,CAEDqF,QAAQF,IAAIsC,GACPq/B,MAAK,WACF,OAAO,IAAIzhC,SAAQ,SAAC6L,EAASzJ,GACpBsS,EAGD7I,IAFAgV,GAA0BpiB,EAAaoN,EAASzJ,EAIvD,GACJ,IACAq/B,MAAK,WACF/hB,GAAS0T,QAAQlxB,EAAA+sB,EAAAq2G,kBAEjB1iH,IACH,IAdL8e,OAeW,SAACjjC,GACJ,MAAMA,CACT,GAMR,CAJC,MAAOA,GACL0V,EAAWlK,MAAM,IAAIwD,EAAAwhB,EAAYta,EAAAylI,iCAAyC37I,EAAEkM,QAAU,qBAAsB/H,EAAc45E,aAC1H5kE,GAAA,EACA6M,IACH,CACJ,CArDD,EAdC,CAMD,SAAS3D,KACLqO,IAAA,CACH,CAkED,SAASpO,GAA0BtiB,GAC/B,IAAIoN,EAAS2Y,GAAc/lB,EAAWiY,IAItC,OAAK7K,EA2BMA,EAAO2qH,WAAW/3H,IA1BzBoN,EAASmpB,GAAO3V,IAAShgB,OAAO,CAC5BkkJ,cAAA3gJ,EACAy8I,iBAAAn5H,EACA6sH,YAAAhwI,EACAkyJ,gBAAAl6J,EACA62G,QAAA/uG,EACAyjI,kBAAA3uH,EACAqjH,aAAA54H,EACAq6J,mBAAA/wJ,EACAoxI,WAAA3oI,EACAoyH,kBAAAp5H,EACAskI,sBAAA3tH,EACA03H,eAAA1kI,EACAo8D,cAAA3lE,EACA0vI,mBAAA1kI,EACA28I,gBAAA1jJ,EACAgyI,gBAAA5oJ,EACAu6J,qBAAAz9I,EACAw+H,WAAAr+H,EACAuuH,WAAA3nI,EACAo5G,SAAA54F,IAEJrK,EAAQ4K,KAAK3T,GACbA,EAAOi9H,aACA9oI,QAAQyE,UAItB,CAOD,SAASoc,GAA0BpiB,EAAa2D,EAASsJ,GACrD,IAGIgW,KAGA,IAAM3mB,EAAWgI,EAAYmwI,oBAAoBjrG,MACjD,GAAIltC,EAASwc,IAAMxc,EAASsc,MAAO,CAC3B+H,IACAmf,aAAanf,IAEjB,IAAMzkB,EAAc0S,KAAK+M,IAAoE,MAA3B,GAAlCrf,EAASwc,IAAMxc,EAASsc,OA9R7C,GA8RwF,YAMnG,OALAxL,EAAOwI,MAAP,eAAAhW,OAA4B1D,EAA5B,kCACA+kB,GAAS0T,QAAQlxB,EAAA+sB,EAAAytI,cAAsB,CAAElhC,MAAO7gI,SAChDykB,GAA8BjY,YAAW,WACrC0Z,GAA0BpiB,EAAa2D,EAASsJ,EACnD,GAAE/Q,GAEN,CAIGskB,EAASpJ,MAAMskH,UAAUO,4BACzB/3H,EAA6Bg6J,sCAAsCl+J,GAIvE,IAAM6N,EAAe7N,EAAY,GAAGs3I,aAMpC,GALI92H,EAASpJ,MAAMskH,UAAUM,yBACzB93H,EAA6B83H,wBAAwBnuH,GAIrDzJ,EAAQ8zI,eAAgB,CACxB,IAAMhrI,EAAmB4X,GAA4C9kB,EAAa6N,GAClFiM,EAAmBs+H,uBAAuBlrI,EAAkBW,EAC/D,EAuBD2S,EAASpJ,MAAMskH,UAAUQ,sBAAwBpxH,EAA0BswJ,yBACpEtwJ,EAA0BowJ,mBAE9B35J,QAAQyE,WAtBNg9B,MAAK,WACF,IAAMhjC,EAAWmE,EAAc45E,WAC3B/9E,GACA0O,EAAkB+yB,OAAOzhC,GAE7BuiB,KACA5e,GACH,IARLs/B,OASW,SAACjjC,GACJoN,EAAO5B,MAAMxL,GACbuiB,KACA5e,GACH,GAGR,CAFC,MAAO3D,GACLiN,EAAOjN,EACV,CACJ,CASD,SAASuiB,KAEL,IAAMviB,EAirBV,WAKI,IAAIA,EAEJ,GADkBoE,EAAQ8zI,eACX,CAEX,IAAMv0I,EAAUW,EAAYmwI,oBAG5Bz0I,GAFiB2D,GAAWA,EAAQ6lC,MAAQ7lC,EAAQ6lC,MAAM1wB,IAAM,GAEzCgB,EAAmB6+H,uBAE1C,IAAM1rI,EAAYtJ,EAAUA,EAAQ6lC,MAAQ,KAC5C,GAAIv8B,EAAW,CAEX,GAAKqoB,MAAM3E,MAA0E,IAApDA,GAAkB3zB,WAAWyL,QAAQ,UAO/D,CAEH,IAAMnM,EAAmB6mB,IAAA,GACpBmS,MAAMh5B,KACP8Q,EAAO0I,KAAP,mCAAAlW,OAA+CtD,IAE/C0D,EAAY4O,KAAK+M,IAAI3b,EAAW1D,GAEvC,KAfuF,CACpF8Q,EAAO0I,KAAP,mCAAAlW,OAA+C+wB,KAC/C,IAAMz0B,EAAsCqoB,IAAA,EAAoCoM,IAC3E2E,MAAMp5B,KAEP8D,EAAY4O,KAAK+M,IAAI3b,EAAW9D,GAEvC,CAUD,IAAM2R,EAAS2S,EAASpJ,MAAMskH,UAAUgB,gBAAgBC,wBAA0B,GAAM,EACxF38H,EAAY4O,KAAKgN,IAAI5b,EAAWiN,EAAU2L,MAAQ/K,EACrD,CACJ,MAOG,GAHA7N,EAFgBwmB,KACW,GAAG2jH,gBACPvxH,MAGlB0c,MAAM3E,IAOJ,CAEH,IAAMzjB,EAAmBiW,IAAA,GACpBmS,MAAMpoB,KACPE,EAAO0I,KAAP,mCAAAlW,OAA+CsN,IAE/ClN,EAAY4O,KAAKgN,IAAI5b,EAAWkN,GAEvC,KAf8B,CAC3BE,EAAO0I,KAAP,mCAAAlW,OAA+C+wB,KAC/C,IAAM3iB,EAAsCuW,IAAA,EAAqCoM,IAC5E2E,MAAMtnB,KAEPhO,EAAY4O,KAAKgN,IAAI5b,EAAWgO,GAEvC,CAWL,OAAOhO,CACV,CA/DD,GAhrBQ2D,EAAgB4f,GAAiBvjB,GAC/BiN,EAAgC,OAAlBtJ,EAAyBA,EAAgBwS,EAAQ,GACrE8K,GAAS0T,QAAQlxB,EAAA+sB,EAAA+0G,sBAA8B,CAAEpvG,UAAAn2B,IACjDmiB,GAAclV,EAAa,KAAMjN,GAkf5BsgB,IACDA,EAA6BglB,aAAY,YAChCz6B,GAA+BiP,EAAmB49H,sBAAwB,IAAM59H,EAAmBu7H,aACpGp0H,GAAS0T,QAAQlxB,EAAA+sB,EAAAokH,eAAuB,CAAEoC,OAAU5xH,KAAsB4xH,QAEjF,GAl1ByB,KA6VjC,CASD,SAAS70H,GAAcniB,EAAQ2D,EAAgBsJ,GAC3C,IACI,GAAIpC,IAAgC7K,GAAW2D,IAAmB3D,GAAUA,EAAO84J,cAC/E,OAGJjuJ,GAAA,EACAoW,GAAS0T,QAAQlxB,EAAA+sB,EAAA2tI,sBAA8B,CAC3CC,eAAgBz6J,EAAiBA,EAAewmI,gBAAkB,KAClEk0B,aAAcr+J,EAAOmqI,kBAGzB,IAAI7tI,GAAA,EACJ2Z,EAAejW,EAEX2D,IACArH,EAAcymB,GAA0B/iB,EAAQ2D,GAChDA,EAAek1J,WAAWv8J,IAM9B2Q,EAAYqoB,MAAMroB,IAAyB3Q,GAAeqH,EAAiB3D,EAAOmqI,gBAAgBvxH,MAAQ+6B,IAA5E1mC,EAC9BG,EAAO0I,KAAP,oBAAAlW,OAAgCI,EAAOkuJ,QAAvC,kBAAAtuJ,OAA+DqN,EAA/D,+BAAArN,OAAqGka,EAAmBhC,UAAxH,uCAAAlY,OAAuKtD,IAEvK+jB,EAAoBA,EAAkBhJ,QAAO,SAACrX,GAC1C,OAAOA,EAAEkuJ,UAAYj4I,EAAai4I,OACrC,IACDp0I,EAAmBuwH,WAAWjlH,OAAyBzhB,GAGnDyV,EAAW47H,aACXryH,GAAiB1V,EAAU3Q,GAAA,GAE3BmmB,GAAgBxV,EAAU3Q,EAIjC,CAFC,MAAO0D,GACL6K,GAAA,CACH,CACJ,CASD,SAAS8X,GAAiB3iB,EAAU2D,GAAsC,IAClEsJ,EADyC3Q,EAAyBgC,UAAAjC,OAAA,YAAAiC,UAAA,IAAAA,UAAA,GAGtE,SAASpC,IAEL,GAAKs0B,GAA0C,SAA3BA,EAAYjoB,WAAhC,CAEA6E,EAAOwI,MAAM,wBACb5S,OAAOolB,IAAI6iC,gBAAgBh+C,GAC3BujB,EAAY5pB,oBAAoB,aAAc1K,GAC9Cs0B,EAAY5pB,oBAAoB,mBAAoB1K,GAEpD+nB,KACA,IAAMpW,EAAUvJ,EAAYmwI,oBAC5B3wI,EAAsB84J,YAAY/uJ,EAAQ27B,MAAM5wB,MAAO/K,EAAQ27B,MAAM1wB,KACjExc,GACKg5B,MAAMt1B,IACP8Z,EAAmBirG,KAAK/kH,GAAA,GAAU,GAGtCiW,EAAa2pI,eAAepvH,GACvBwS,MAAK,WAEF/sB,EAAakjJ,iCAAiC3oI,EACjD,KAEL/N,GAAgBziB,EAAU2D,EArB+B,CAuBhE,CAED,SAASkK,IACL2iB,EAAYxmB,iBAAiB,aAAc9N,GAAA,GAC3Cs0B,EAAYxmB,iBAAiB,mBAAoB9N,GAAA,GACjD+Q,EAAYnJ,EAAsBw4J,kBAAkBljJ,GACpDhM,EAAOwI,MAAM,uDAChB,CAEI4a,EAIG7sB,EACA8e,GAAgBziB,EAAU2D,IAE1BG,EAAsB44J,kBAAkBtjJ,GACxCvL,MAPJ2iB,EAAc1sB,EAAsB24J,oBACpC5uJ,IASP,CAOD,SAAS4U,GAAgBziB,EAAUoN,GAC/B6I,EAAa0iJ,SAASnoI,EAAapjB,EAAc2S,OAAA,EAAyB/f,GACrEgjC,MAAK,SAAC51B,GAEH,GAAIA,EAAO,CACP,IAAMzJ,EAAO7G,OAAOP,KAAK6Q,GACrBzJ,EAAKtH,OAAS,GAAK+Q,EAAMzJ,EAAK,IAAI65I,YAAYlqF,aAC9C/yC,GAAA,GAEJR,EAAc3S,CACjB,CAGIkoB,MAAMt1B,KACPihB,GAAS0T,QAAQlxB,EAAA+sB,EAAAg3G,YAAoB,CAAE/9F,KAAMzpC,GAAY,CAAEs6H,SAAUrkH,EAAai4I,UAClFp0I,EAAmBirG,KAAK/kH,GAAA,GAAU,GAClCiW,EAAa+jJ,4BAGjBnvJ,GAAA,EACAoW,GAAS0T,QAAQlxB,EAAA+sB,EAAA2hI,wBAAgC,CAAEkM,aAAcj5I,MACpE,GACR,CAQD,SAASvC,GAAmB7iB,GACxB,IACMoN,EAAemW,GADLvjB,EAAEw2I,UAGbppI,GAAgBA,IAAiB6I,EAG3B7I,GAAgBA,IAAiB6I,IACxCyM,KA4DR,SAAgC1iB,EAAGoN,GAE/B,IAAMzJ,EAAW3D,IAAMs1B,MAAMt1B,EAAEw2I,UAAYx2I,EAAEw2I,SAAW7iG,IAGlD1mC,EAFmBgJ,EAAas7I,gBAEJ1rI,KAAI,SAACzY,GAEnC,OAAOA,EAAGo7I,kCAAkCxoJ,EAC/C,IAEDuB,QAAQF,IAAI4L,GACP+1B,MAAK,WACF7gB,GAAc/U,EAAc6I,EAActS,EAC7C,IAHLs/B,OAIW,SAACjjC,GACJ0V,EAAWlK,MAAMxL,EACpB,GACR,CAjBD,CA3D+BA,EAAGoN,KAJ1BsV,KA+CR,SAAgC1iB,GACHiW,EAAas7I,gBAErB7nJ,SAAQ,SAAC0D,GACtB,OAAOA,EAAGm7I,kCAAkCvoJ,EAC/C,IAED0lB,GAAsB+K,GAAc8zH,yBACvC,CARD,CA9C+BvkJ,IAM3BmlB,GAAuB1E,EAASsjI,kBACnC,CAOD,SAASrhI,KAQDF,IAGP,CAMD,SAASA,KACDnC,GAAqBA,EAAkBhkB,OAAS,IAChDgkB,EAAkB3W,SAAQ,SAAC1J,GACvBA,EAAE64J,YAAA,EACL,IACDx4I,EAAoB,GAE3B,CAgDD,SAAS2D,GAAuBhkB,GAE5B,GAAIA,EAAE0hJ,aAAa/Z,WAAW1vH,KAAOhC,EAAai4I,QAAlD,CAOA,GAFA1rI,KAEIhC,EAASpJ,MAAMskH,UAAUr6G,OAAOm9G,kCAAoCx+H,EAAEyhJ,cAAgBzhJ,EAAEyhJ,aAAal8H,QAAUvlB,EAAE0hJ,aAAan8H,MAAO,CACrI,IAAMnY,EAAO0M,EAAmBhC,UAGhC,OAFA7B,EAAa4iJ,YAAA,QACbl2I,GAAiBvV,GAAA,GAAM,EAE1B,CAED6I,EAAagkJ,mBAAmBj6J,EAZ/B,CAaJ,CASD,SAAS+iB,GAA0B/iB,EAAYoN,GAC3C,IAII,OAAQoT,EAASpJ,MAAMskH,UAAUr6G,OAAOq8G,6BAA+BtwH,EAAeqsJ,uBAAuBz5J,IAAe0wB,MAA2BnQ,GAAsBC,EAASpJ,MAAMskH,UAAUr6G,OAAOi9G,6BAA+BlxH,EAAeosJ,uBAAuBx5J,EAAYoN,GAGjS,CAFC,MAAOpN,GACL,OAAO,CACV,CACJ,CAQD,SAASgjB,GAAqBhjB,GAAmC,IAAvBoN,EAAuB9O,UAAAjC,OAAA,YAAAiC,UAAA,GAAAA,UAAA,GAAN,KAEnDkyB,IAAgBxwB,EAAW05J,gBACA32I,GAA0B/iB,EAAYoN,IAG7DpN,EAAWk5J,gBAAgB1oI,EAAazQ,GACnCijB,MAAK,WACF3iB,EAAkBU,KAAK/gB,EAC1B,GAGhB,CAOD,SAASujB,GAAiBvjB,GAEtB,GAAIs1B,MAAMt1B,GACN,OAAO,KAKX,IAFA,IAAMoN,EAAK+I,EAAQ9Z,OAEVsH,EAAI,EAAGA,EAAIyJ,EAAIzJ,IAAK,CACzB,IAAMsJ,EAASkJ,EAAQxS,GAGvB,GAAI3D,EAFc8W,YAAY7J,EAAO8rJ,eAAiB9rJ,EAAOohJ,eAAejuH,QAAQ,IAGhF,OAAOnzB,CAEd,CAED,OAAO,IACV,CAKD,SAASgW,KACL,IACI,IAAMjjB,EAAYoE,EAAQ8zI,eAEpB9qI,EADchJ,EAAQw5J,iBACK,GAAGtmB,aAC9B3zI,EAAOmW,EAAmBhC,UAC1B7K,EAAQiM,EAAkBolJ,0BAA0BnoJ,EAASnW,GAC7D1D,EAAyB4mB,KAE/B,QAAI,IAAOjW,EAAM2L,YAAA,IAAgC3L,EAAM6L,IACnD,OAGCxc,GAA4D,IAAlCA,EAAuBD,OAGlDC,EAAuBoN,SAAQ,SAAC1J,GAC5BsE,EAAYi6J,WAAWv+J,EAAGq5H,UAAW11H,EAAMyJ,EAAcH,EAC5D,IAJD3I,EAAYi6J,WAAWriK,EAAAs0B,EAAAi7C,MAAiB9nE,EAAMyJ,EAAcH,EAOnE,CADC,MAAOjN,GACR,CACJ,CAQD,SAAS0jB,GAAsB1jB,GAG3B,GAAI2f,GAAmBlN,EAAU,CAC7B,IAAMrF,EAAqBqa,EAAiB+2I,wBACtC76J,EAA2B,CAACzH,EAAAs0B,EAAAmmG,OAC9BrhG,MAAMloB,IAAuBA,GAAsB0M,EAAmB69H,eAAeh0I,IAA8BS,EAAQ8zI,gBAAkB9qI,EAAqB0M,EAAmB4+H,kBACrL/4H,GAAA,EACAwF,GAAuB1E,EAASqjI,8BAChChqI,EAAmB0qG,OAE1B,CAEGxkH,GAAKA,EAAEu6H,WACPj2H,EAAYm6J,eAAez+J,EAAEu6H,UAAW,IAAI1iH,KAAwB,IAAhB7X,EAAEk/I,YAE7D,CAQD,SAASt8H,GAAkB5iB,GACnBA,EAAE2nI,WAAW1vH,KAAOhC,EAAai4I,SAAWluJ,EAAEk1B,QAAUl1B,EAAEk1B,OAAO4yH,cACjEtlI,KAGWuD,GAAc/lB,EAAE2nI,WAAW1vH,IAEnCyrI,qBAAqB1jJ,EAC/B,CAMD,SAAS4jB,KACL,GAAIxf,EAAQ8zI,gBAAgE,IAA9Cp+H,EAAmB6+H,wBAAgC1iI,EAAc,CAC3F,IAAMjW,EAAcoE,EAAQw5J,iBAC5B,GAAI59J,EAAY3D,OAAS,EAAG,CACxB,IAAM+Q,EAAepN,EAAY,GAAGs3I,aAC9B3zI,EAAmBmhB,GAA4C9kB,EAAaoN,GAElF0M,EAAmBs+H,uBAAuBz0I,EAAkByJ,EAC/D,CACJ,CACJ,CAMD,SAASkX,KACL,GAAIqB,KAAiB,CACjB,IAAM3lB,EAAkBoZ,EAAWslJ,qBAC/B1+J,GACAsE,EAAYq6J,iBAAiB3+J,EAEpC,CACJ,CAMD,SAAS6jB,KACLzW,EAAOwI,MAAM,wBACR+J,GAAmBlD,GACpB0I,GAAuB1E,EAASujI,gCAEhCrkI,IACAA,GAAA,GAEAzD,IACAA,GAAA,EAEIsE,EAASpJ,MAAMskH,UAAUQ,uBAAyBpxH,EAA0BswJ,0BAC5EtwJ,EAA0BowJ,oBAIlCz+I,GAAA,CACH,CAOD,SAASgH,GAAkBzjB,GACvBoN,EAAOwI,MAAM,sBACR5V,EAAEmyC,QACH11B,GAAA,EACAiJ,GAAsB+K,GAAc8zH,0BAE3C,CAOD,SAASlgI,GAA4BrkB,GACjCoN,EAAOwI,MAAP,kBAAAhW,OAA+BI,EAAE2nI,WAAW1vH,GAA5C,wBACA,IAAMtU,EAAS3D,EAAE2nI,WAAWqP,OACxBxmH,GAAe7sB,GACfyJ,EAAO0I,KAAK,kFACZhS,EAAsBg5J,kBAAkBtsI,IAExCrM,IAEP,CAMD,SAASA,KAEL,GAAKlO,GAAiBA,EAAa6jJ,0BAMnC,IAHA,IAAM95J,EAyJV,WAAwC,IAAfA,EAAe1B,UAAAjC,OAAA,YAAAiC,UAAA,GAAAA,UAAA,GAAN,KAC9B,IACI,IAAM8O,EAAYpN,GAAkBiW,GAA8B,KAElE,GAAI7I,EAAW,CACX,IAAMzJ,EAAgByJ,EAAU+8H,gBAEhC,OAAOh0H,EAAQkB,QAAO,SAAUrX,GAC5B,IAAMoN,EAAQpN,EAAOmqI,gBACrB,OAAO/8H,EAAMwL,MAAQjV,EAAciV,OAASjV,EAAcsU,KAAO7K,EAAM6K,EAC1E,GACJ,CAGJ,CAFC,MAAOjY,GACL,MAAO,EACV,CACJ,CAfD,CAzJ4CiW,GACpC7I,EAAI,EAEDA,EAAIpN,EAAgB3D,QAAQ,CAC/B,IAAMsH,EAAS3D,EAAgBoN,GACzBH,EAAuB,IAANG,EAAU6I,EAAejW,EAAgBoN,EAAI,IAG/DzJ,EAAO+1J,gBAAkBzsJ,EAAe6sJ,2BACrCtpI,GACAxN,GAAqBrf,EAAQsJ,GAGrCG,GAAK,CACR,CACJ,CAoBD,SAAS8W,KACD5D,IACAolB,cAAcplB,GACdA,EAA6B,KAEpC,CA0CD,SAAS4C,KACL,OAAOjN,EAAeA,EAAas7I,gBAAkB,EACxD,CAMD,SAASntI,GAAiBpkB,GACtB,GAAIiW,IAAiBA,EAAa0jJ,0BAA2B,CACzD1jJ,EAAa2jJ,yBAAA,GACb,IAAMj2J,EAsBd,WAAuC,IAC7ByJ,GAD6B9O,UAAAjC,OAAA,YAAAiC,UAAA,GAAAA,UAAA,GAAN,OACO2X,GAA8B,KAElE,IAAK7I,EACD,OAAO,KASX,IANA,IAAMzJ,EAAgByJ,EAAU+8H,gBAC1Bl9H,EAAQtJ,EAAciV,MACxBtc,EAAI,EACJJ,GAAe,EACf2R,EAAW8lC,IAERr3C,EAAI6Z,EAAQ9Z,QAAQ,CACvB,IACM6Q,EADIiJ,EAAQ7Z,GACF6tI,gBACVn8H,EAAOd,EAAM0L,MAAQ3L,EAEvBe,EAAO,IAAMsnB,MAAMznB,IAAaG,EAAOH,IAAalK,EAAcsU,KAAO/K,EAAM+K,KAC/EpK,EAAWG,EACX9R,EAAcI,GAGlBA,GAAK,CACR,CAED,OAAIJ,GAAe,EACRia,EAAQja,GAGZ,IACV,CA/BD,GArBYyH,GACAyJ,EAAOwI,MAAP,uDAAAhW,OAAoE+D,EAAWwmI,gBAAgBlyH,GAA/F,qBAAArY,OAAqHqW,EAAak0H,gBAAgBlyH,GAAlJ,QAAArY,OAA2J+D,EAAWwmI,gBAAgBlyH,KACtLkK,GAAcxe,EAAYsS,EAAc09B,OAExCvmC,EAAOwI,MAAM,yCACbK,EAAa2jJ,yBAAA,IAEjBl0I,GAAsB/hB,EAAa8sB,GAAc+zH,0BAA4B/zH,GAAcg0H,2BAC9F,CACGzkJ,GAAKA,EAAEg3I,SACP9yH,KACApZ,EAA0BwwJ,2BAEjC,CAoED,SAASr3I,GAAkBjkB,GACvB,IAAMoN,EAAmBpN,GAAsBolB,KAAsBkyH,aAAat/H,SAClFlU,EAAsB64J,YAAYvvJ,EACrC,CAsGD,SAAS+V,GAA+BnjB,GACpC,IAAMoN,EAAWgJ,EAAiBwoJ,qBAClC,IAAKxxJ,IAAaA,EAASA,EACvB,OAAOumC,IAEX,IACMhwC,EADY6iB,KAAa,GACC2jH,gBAAgBvxH,MAGhD,OAFAxL,EAASA,EAAIA,EAASA,EAAEiB,MAAM,KAAK,GAE5BwY,GAAwB7mB,EAAWoN,EAASA,EAAGzJ,EACzD,CASD,SAAS4gB,GAA8BvkB,EAAWoN,GAC9C,IAAIzJ,EAAgB,EAOpB,OALK3D,IAED2D,EADkB6iB,KAAa,GACL2jH,gBAAgBvxH,OAGvCiO,GAAwB7mB,EAAWoN,EAAmBzJ,EAChE,CAGD,SAASkjB,GAAwB7mB,EAAWoN,EAAazJ,GAKrD,IAAMsJ,EAAS7I,EAAQ8wI,oBAAoB,GACrC54I,EAAe8Q,EAAYpQ,WAC3Bd,GAA4C,IAApCI,EAAamM,QAAQ,UAAiD,QAA9BnM,EAAa6R,UAAU,GAAe0J,KAAK6H,MAAQ,IAAO5I,WAAWxa,EAAa6R,UAAU,IAAMwlC,IAGxJ,OAFiB3zC,IAAcs1B,MAAMp5B,GAAUgd,EAAkBi8H,iCAAiC,IAAIt9H,KAAa,IAAR3b,GAAe+Q,GAAU6J,WAAWxa,GAAgBqH,CAGlK,CAoCD,SAASmhB,GAA4C9kB,EAAaoN,GAC9D,IACI,IAAIzJ,EAAmBgwC,IAGvB,GAAIvmC,IAAiBkoB,MAAMloB,EAAayxJ,sBAAwBpwJ,SAASrB,EAAayxJ,qBAClF,OAAOzxJ,EAAayxJ,oBAIxB,GAAI7+J,GAAsC,IAAvBA,EAAY3D,OAAc,CACzC,IAAM4Q,EAAajN,EAAY,GAIzB1D,EAHa,CAACJ,EAAAs0B,EAAAi7C,MAAiBvvE,EAAAs0B,EAAA3B,MAAiB3yB,EAAAs0B,EAAAmmG,MAIjDzpG,QAAO,SAACltB,EAAKoN,GACV,IAAMzJ,EAAYS,EAAQ06J,oBAAoB7xJ,EAAYG,GAM1D,OAJIzJ,IAAA,IAAaA,EAAUo6I,cACvB/9I,EAAI+gB,KAAKpd,GAGN3D,CACV,GAAE,IACFktB,QAAO,SAACltB,EAAKoN,GACV,IAAMzJ,EAAoBS,EAAQwhJ,qBAAqBx4I,GAUvD,OARIzJ,GAAqBA,EAAkBtH,OAAS,GAChDsH,EAAkB+F,SAAQ,SAAC0D,GACnBA,GACApN,EAAI+gB,KAAK3T,EAEhB,IAGEpN,CACV,GAAE,IACFktB,QAAO,SAACltB,EAAKoN,GACV,IAAMzJ,EAAiBS,EAAQwxI,0CAA0CxoI,GAMzE,OAJIzJ,GAAkBA,EAAew9I,mBAAqB7rH,MAAM3xB,EAAew9I,mBAC3EnhJ,EAAI+gB,KAAKpd,EAAew9I,kBAGrBnhJ,CACV,GAAE,IAEP2D,EAAmBiL,KAAKgN,IAAL8F,MAAA9S,KAAA,SAAA5O,GAAA,GAAAxD,MAAAC,QAAAuD,GAAA,OAAAma,GAAAna,EAAA,EAAA6N,EAAYvR,IAAA,SAAA0D,GAAA,uBAAAuD,QAAAA,OAAA85E,YAAAvgF,OAAAkD,GAAA,OAAAxD,MAAAojB,KAAA5f,EAAA,EAAA6N,IAAA,SAAA7N,EAAAoN,GAAA,GAAApN,EAAA,qBAAAA,EAAA,OAAAma,GAAAna,EAAAoN,GAAA,IAAAzJ,EAAA7G,OAAAC,UAAAC,SAAAE,KAAA8C,GAAA0W,MAAA,uBAAA/S,GAAA3D,EAAA5D,cAAAuH,EAAA3D,EAAA5D,YAAA+B,MAAA,QAAAwF,GAAA,QAAAA,EAAAnH,MAAAojB,KAAA5f,GAAA,cAAA2D,GAAA,2CAAA9B,KAAA8B,GAAAwW,GAAAna,EAAAoN,QAAA,IAAAS,IAAA,qBAAA86C,UAAA,2IAClC,CAED,OAAOl6C,SAAS9K,GAAoBA,EAAmBgwC,GAG1D,CAFC,MAAO3zC,GACL,OAAO2zC,GACV,KAAA9lC,CACJ,CAQD,SAASoX,GAAmBjlB,GACxB,GAAKA,EAAEwL,MAyBH2N,GAAA,EACA6M,SA1BU,CACV5Y,EAAO0I,KAAK,kDAGZ,IAAMnS,EAAW3D,EAAEsoI,SACnBlkI,EAAQ26J,cAAcp7J,GAEtB,IAAIrH,EAA2B8H,EAAQ4rJ,uBAEnC5rJ,EAAQ8zI,gBAAoB57I,GAAgE,IAApCA,EAAyBD,QACjF4kB,GAAS0T,QAAQtwB,EAAAmsB,EAAAwuI,sBAAyC,CACtDzkJ,MAAO6X,GAA8BkrI,OAAO5mC,QAC5ChgF,MAAOtkB,GAA8BorI,OAAOC,wBAIpD,IAAIvhK,EAAwBkI,EAAQ8zI,eAA6C57I,EAAyBsD,OAAOogB,EAAsBgwI,uBAAjF1zJ,EAGtD2Q,EAAmBgyJ,0BAA0Bt7J,GACxCq/B,MAAK,WACFt0B,EAAkB27H,WAAW1mI,GAC7BD,EAAmB04J,YAAYlgK,EAAqBkI,EAAQ8zI,eAC/D,GACR,CAIJ,CAMD,SAASvyH,KACL,QAAO1P,GAAeA,EAAagjJ,kBACtC,CAMD,SAASzzI,KACL,QAAOvP,GAAeA,EAAa+iJ,kBACtC,CAUD,SAAStzI,GAAsB1lB,EAAQoN,GACnCA,EAAOA,GAAQ,IAAIyK,KAEnBqL,KAA4BxZ,SAAQ,SAAA/F,GAChCA,EAAE0kJ,iBAAiBj7I,EAAMpN,EAC5B,IACDsE,EAAY46J,aACf,CAED,SAAS/5I,GAAuBnlB,GAC5BsE,EAAY66J,sBAAqD,IAA/BrlJ,EAAmBhC,UAAkB9X,EAC1E,CAED,SAASslB,GAAiBtlB,GACtB,GAAKA,EAAEwL,MAAP,CAEA,IAAI7H,EAAM,GAEV,OAAQ3D,EAAEwL,MAAM2pB,MACZ,KAAK,EACDxxB,EAAM,oBACN,MACJ,KAAK,EACDA,EAAM,oBACN,MACJ,KAAK,EACDA,EAAM,mBACN+c,GAAiB0+I,OAAOh7B,kBAAoB,EAC5C,MACJ,KAAK,EACDzgI,EAAM,8BACN,MACJ,KAAK,EACDA,EAAM,sBACN,MACJ,QACIA,EAAM,UAKF,qBAARA,GAA8B6c,EAASpJ,MAAM8sH,OAAOC,gBAAgBC,kBAAoB1jH,GAAiB0+I,OAAOh7B,iBA2BxH,WACIh3H,EAAOX,KAAK,yDACZ,IAAMzM,EAAO8Z,EAAmBhC,UAEhC7B,EAAa4iJ,YAAA,GAGbzrJ,EAAOX,KAAP,8DAAA7M,OAA0EI,IAC1E2iB,GAAiB3iB,GAAA,GAAM,EAC1B,CATD,IAtBIsD,GAAA,EAEItD,EAAEwL,MAAMU,UACRvI,GAAO,KAAO3D,EAAEwL,MAAMU,QAAU,KAGhClM,EAAEwL,MAAM6zJ,iBACR17J,GAAO,QAAU3D,EAAEwL,MAAM6zJ,iBAAmB,GAAGriK,SAAS,IAAIkL,cAAgB,KAGhFkF,EAAO6nB,MAAM,wBAA0BtxB,GACnC3D,EAAEwL,OACF4B,EAAO6nB,MAAMj1B,EAAEwL,OAEnBkK,EAAWlK,MAAM,IAAIwD,EAAAwhB,EAAYxwB,EAAEwL,MAAM2pB,KAAMxxB,IAC/CqiB,KA/CoB,CAgDvB,CAiBD,SAASZ,KACL,OAAOnP,EAAeA,EAAak0H,gBAAkB,IACxD,CAUD,SAASpkH,GAAc/lB,GACnB,IAAK,IAAIoN,EAAI,EAAGzJ,EAAKwS,EAAQ9Z,OAAQ+Q,EAAIzJ,EAAIyJ,IACzC,GAAI+I,EAAQ/I,GAAG8gJ,UAAYluJ,EACvB,OAAOmW,EAAQ/I,GAGvB,OAAO,IACV,CAED,SAASqY,GAA2BzlB,GAC3Bs1B,MAAMt1B,EAAEujJ,cACTt/H,GAAkBjkB,EAAEujJ,YAE3B,CAmFD,SAASz9H,KACL3P,EAAU,GACVwa,GAAoBgjB,IACpB16B,EAAuB,KACvBpO,GAAA,EACAoL,EAAe,KACf3S,GAAA,EACA6V,GAAA,EACAwG,GAAA,EACAzD,GAAA,EACAO,GAAA,EACAhK,GAAA,EACA6N,EAA6B,KAC7BoQ,IAAA,EACAnQ,GAAA,EACAF,EAAoB,GACpBM,GAA8B,KAC9BD,GAAmB,CACf0+I,OAAQ,CACJh7B,iBAAkB,GAG7B,CAED,SAASp+G,KACLhF,KAEAtd,EAAmBsrC,QAEnBtpB,GAAsBpiB,GAAiB6V,EAAyBsX,GAAck0H,oBAAsBl0H,GAAc8zH,0BAElH,IAAK,IAAIn3I,EAAI,EAAGzJ,EAAKwS,EAAUA,EAAQ9Z,OAAS,EAAG+Q,EAAIzJ,EAAIyJ,IACxC+I,EAAQ/I,GAChB4hC,MAAM1rC,GA94CjB2d,GAASyR,IAAIruB,EAAAmsB,EAAAkmH,sBAAyCpyH,GAAwBtkB,GAC9EihB,GAASyR,IAAIruB,EAAAmsB,EAAA+lH,iBAAoC1zH,GAAoB7iB,GACrEihB,GAASyR,IAAIruB,EAAAmsB,EAAA0mH,eAAkC5xH,GAAkBtlB,GACjEihB,GAASyR,IAAIruB,EAAAmsB,EAAA0lH,iBAAoCryH,GAAoB7jB,GACrEihB,GAASyR,IAAIruB,EAAAmsB,EAAA8lH,gBAAmC7yH,GAAmBzjB,GACnEihB,GAASyR,IAAIruB,EAAAmsB,EAAAokH,eAAkCxwH,GAAkBpkB,GACjEihB,GAASyR,IAAIruB,EAAAmsB,EAAA8uI,aAAgCz3I,GAAgB7nB,GAC7DihB,GAASyR,IAAIruB,EAAAmsB,EAAAmzH,0BAA6Cl+H,GAA4BzlB,GACtFihB,GAASyR,IAAIruB,EAAAmsB,EAAAyuH,qBAAwCv7H,GAAuB1jB,GAC5EihB,GAASyR,IAAIruB,EAAAmsB,EAAA+uI,yBAA4C38I,GAAmB5iB,GAExEyD,EAAA+sB,EAAAgvI,qBACAv+I,GAASyR,IAAIjvB,EAAA+sB,EAAAgvI,oBAA4Bn9I,GAAsBriB,GAGnEihB,GAASyR,IAAIjvB,EAAA+sB,EAAAw1G,iBAAyB/gH,GAAoBjlB,GAC1DihB,GAASyR,IAAIjvB,EAAA+sB,EAAAs2G,2BAAmCziH,GAA6BrkB,GAC7EihB,GAASyR,IAAIjvB,EAAA+sB,EAAAy2G,+BAAuC9lH,GAAsBnhB,GAC1EihB,GAASyR,IAAIjvB,EAAA+sB,EAAA40G,sBAA8BphH,GAAwBhkB,GACnEihB,GAASyR,IAAIjvB,EAAA+sB,EAAA6qG,2BAAmCz3G,GAA4B5jB,GAC5EihB,GAASyR,IAAIjvB,EAAA+sB,EAAA8qG,0CAAkD13G,GAA4B5jB,GA+3C3F0O,EAAkBsgC,QAClB1yC,EAAgB0yC,QAChBj8B,EAAgBi8B,QAChB1qC,EAAYm7J,yBACZt7J,EAAc65E,SAAS,MACvBnwE,EAAemhC,QACf91B,EAAkB81B,QAClBj5B,EAAUi5B,QAENxe,IACA1sB,EAAsB44J,kBAAkBtjJ,GACxCoX,EAAc,MAElBpX,EAAa,KACTH,IACAA,EAAuB,KACvB3B,EAAiB,KACbnT,EAAc45E,YACd98D,GAAS0T,QAAQlxB,EAAA+sB,EAAAkvI,qBAA6B,CAAEt5J,KAAMjC,EAAc45E,WAAW37E,OAIvF8hB,KACAjD,GAAS0T,QAAQlxB,EAAA+sB,EAAAmvI,0BACjB75I,IACH,CAED,SAAS+B,GAAe7nB,GACpB,GAAIA,EAAE4/J,SAAW1yJ,EAAAsjB,EAAAqvI,SAA2B,CAGxC,IAAMzyJ,EAAkBoY,KAAkBtpB,EAAAs0B,EAAA3B,MAAkB3yB,EAAAs0B,EAAAi7C,MACxDzrE,EAAEu6H,YAAcntH,GAChBtJ,EAAsB84J,YAAY58J,EAAE8H,MAAM0hC,MAAM5wB,MAAO5Y,EAAE8H,MAAM0hC,MAAM1wB,IAE5E,CACJ,CAQD,SAAS0N,KACL,OAAOrQ,CACV,CA6BD,OA3BAnW,EAAW,CACPqqI,WA1gDJ,SAAoBj9H,EAAQzJ,GACxBqd,KAEAvO,EAAWrF,EACXkK,EAAiB3T,EACjBuV,EAAkBmxH,cAElB/tI,EAAkBy6B,GAAgBnW,IAAShgB,UAC3B22I,UAAU,CACtBuN,cAAA3gJ,EACAgvG,QAAA/uG,EACA43J,eAAAnuJ,EACAwwI,WAAA3oI,EACA0jG,SAAA54F,EACA21D,0BAAArrE,IAEJxO,EAAgB+tI,cAEhBt3H,EAAkBqoC,GAAgBx6B,IAASu4G,eAC3Boe,UAAU,CACtBif,gBAAiBl6J,EAAiBkiJ,mBAAoB1kI,EAAoBs/F,SAAA54F,IAE9EzN,EAAgB6F,QAGhBlV,EAAmB6zI,UAAU,CACzBjD,YAAAhwI,EAAawjI,kBAAAp5H,EAAmB2vI,WAAA3oI,EAAY0jG,SAAA54F,IAEhD9c,EAAmB2mI,aAEnBvmI,EAAsByzI,UAAU,CAAEn+B,SAAA54F,IAE9BvH,IACAgI,GAAS0T,QAAQlxB,EAAA+sB,EAAAsvI,mBAA2B,CACxCzsF,WAAYp6D,IAEhBA,EAAqB8mJ,gBAAgB3mJ,EAAW47H,cAC5C19H,GACA2B,EAAqB+mJ,kBAAkB1oJ,IAQ/C2J,GAASmR,GAAG/tB,EAAAmsB,EAAAkmH,sBAAyCpyH,GAAwBtkB,GAC7EihB,GAASmR,GAAG/tB,EAAAmsB,EAAA+lH,iBAAoC1zH,GAAoB7iB,GACpEihB,GAASmR,GAAG/tB,EAAAmsB,EAAA0mH,eAAkC5xH,GAAkBtlB,GAChEihB,GAASmR,GAAG/tB,EAAAmsB,EAAA0lH,iBAAoCryH,GAAoB7jB,GACpEihB,GAASmR,GAAG/tB,EAAAmsB,EAAA8lH,gBAAmC7yH,GAAmBzjB,GAClEihB,GAASmR,GAAG/tB,EAAAmsB,EAAAokH,eAAkCxwH,GAAkBpkB,GAChEihB,GAASmR,GAAG/tB,EAAAmsB,EAAA8uI,aAAgCz3I,GAAgB7nB,GAC5DihB,GAASmR,GAAG/tB,EAAAmsB,EAAAmzH,0BAA6Cl+H,GAA4BzlB,GACrFihB,GAASmR,GAAG/tB,EAAAmsB,EAAAyuH,qBAAwCv7H,GAAuB1jB,GAC3EihB,GAASmR,GAAG/tB,EAAAmsB,EAAA+uI,yBAA4C38I,GAAmB5iB,GAEvEyD,EAAA+sB,EAAAgvI,qBACAv+I,GAASmR,GAAG3uB,EAAA+sB,EAAAgvI,oBAA4Bn9I,GAAsBriB,GAGlEihB,GAASmR,GAAG3uB,EAAA+sB,EAAAw1G,iBAAyB/gH,GAAoBjlB,GACzDihB,GAASmR,GAAG3uB,EAAA+sB,EAAAs2G,2BAAmCziH,GAA6BrkB,GAC5EihB,GAASmR,GAAG3uB,EAAA+sB,EAAAy2G,+BAAuC9lH,GAAsBnhB,GACzEihB,GAASmR,GAAG3uB,EAAA+sB,EAAA40G,sBAA8BphH,GAAwBhkB,GAClEihB,GAASmR,GAAG3uB,EAAA+sB,EAAA6qG,2BAAmCz3G,GAA4B5jB,GAC3EihB,GAASmR,GAAG3uB,EAAA+sB,EAAA8qG,0CAAkD13G,GAA4B5jB,EAvB7F,EAg+CGg2I,oBAAA5wH,GACAuwH,aAAA1yH,GACAgyH,cAAAtvH,GACAs6I,cAAAz6I,GACA06I,cAAAn6I,GACAo6I,iBAAA58I,GACA68I,0BApsBJ,SAAmCpgK,EAAMoN,GAMrC,IALA,IAAIzJ,EAAS,KACTsJ,EAAY,EACZ3Q,EAAc,EACdJ,EAAY,KAEP2R,EAAI,EAAGA,EAAIsI,EAAQ9Z,OAAQwR,IAAK,CAUrC,GARAvR,GADAqH,EAASwS,EAAQtI,IACIkrJ,eACrB78J,EAAYyH,EAAO0qJ,cAGf7/I,OAAOC,SAASnS,KAChB2Q,EAAY3Q,GAGZqH,EAAOuqJ,UAAY9gJ,EACnB,OAAOpN,EAAOiN,EAGVuB,OAAOC,SAASvS,KAChB+Q,GAAa/Q,EAGxB,CAED,OAAO,IACV,EA0qBG82B,KAp6CJ,SAAchzB,GAAsB,IAAjBoN,EAAiB9O,UAAAjC,OAAA,YAAAiC,UAAA,GAAAA,UAAA,GAALq1C,IAC3B3yB,KACA2P,GAAoBvjB,EACpBS,EAAemlB,KAAKhzB,EACvB,EAi6CGqgK,iBA15CJ,SAA0BrgK,GAA2B,IAAjBoN,EAAiB9O,UAAAjC,OAAA,YAAAiC,UAAA,GAAAA,UAAA,GAALq1C,IAC5CzxB,KACAyO,GAAoBvjB,EACpB9Q,EAAgBy/J,YAAY/7J,EAC/B,EAu5CG43I,0BAAA10H,GACAq0H,UAnLJ,SAAmBv3I,GACVA,IAEDA,EAAOu8H,eACP54H,EAAe3D,EAAOu8H,cAEtBv8H,EAAOg+J,qBACP/wJ,EAAqBjN,EAAOg+J,oBAE5Bh+J,EAAOg8J,iBACPnuJ,EAAiB7N,EAAOg8J,gBAExBh8J,EAAO8kJ,gBACP3gJ,EAAgBnE,EAAO8kJ,eAEvB9kJ,EAAO4gJ,mBACPn5H,EAAmBznB,EAAO4gJ,kBAE1B5gJ,EAAOsgK,wBACPtgJ,EAAwBhgB,EAAOsgK,uBAE/BtgK,EAAO02J,uBACPz9I,EAAuBjZ,EAAO02J,sBAE9B12J,EAAOmzG,UACP/uG,EAAUpE,EAAOmzG,SAEjBnzG,EAAOs0I,cACPhwI,EAActE,EAAOs0I,aAErBt0I,EAAOq+I,aACP3oI,EAAa1V,EAAOq+I,YAEpBr+I,EAAO6nI,oBACP3uH,EAAoBlZ,EAAO6nI,mBAE3B7nI,EAAOy3I,aACPr+H,EAAapZ,EAAOy3I,YAEpBz3I,EAAOw+I,qBACP1kI,EAAqB9Z,EAAOw+I,oBAE5Bx+I,EAAOw3I,+BACPtzI,EAA+BlE,EAAOw3I,8BAEtCx3I,EAAOm2E,4BACPrrE,EAA4B9K,EAAOm2E,2BAEnCn2E,EAAO+8I,iBACP1kI,EAAiBrY,EAAO+8I,gBAExB/8I,EAAOy0E,gBACP3lE,EAAgB9O,EAAOy0E,eAEvBz0E,EAAO+kJ,kBACP5oJ,EAAkB6D,EAAO+kJ,iBAEzB/kJ,EAAOo5G,WACP54F,EAAWxgB,EAAOo5G,UAElBp5G,EAAO8nI,oBACPp5H,EAAoB1O,EAAO8nI,mBAE3B9nI,EAAOugK,mBACPnqJ,EAAmBpW,EAAOugK,kBAE1BvgK,EAAOgzI,wBACP3tH,EAAwBrlB,EAAOgzI,uBAE/BhzI,EAAOw2J,kBACPl6J,EAAkB0D,EAAOw2J,iBAEhC,EA4GGwJ,kBA1GJ,SAA2BhgK,GACvBsX,EAAiBtX,EACbiZ,GACAA,EAAqB+mJ,kBAAkB1oJ,EAE9C,EAsGGkpJ,4BA5MJ,WACI,OAAO31J,CACV,EA2MG41J,qBAvSJ,SAA8BzgK,GACtBiW,IACA6D,EAAmBuwH,WAAWjlH,MAC9BzC,GAAiB3iB,GAAA,GAAU,GAElC,EAmSG0gK,iCA1MJ,WACI,OAAOp9J,GAAiB6V,CAC3B,EAyMGwnJ,WAAAn6I,GACA8qI,gBAvkBJ,WACI,OAAOr7I,CACV,EAskBG4qI,mBAhkBJ,WACI,OAAOlhI,CACV,EA+jBGmhI,YAzjBJ,WACI,OAAOruI,CACV,EAwjBG4nJ,gBA/BJ,WACS/9J,EAAgB89J,iBACjB99J,EAAgB+9J,iBAEvB,EA4BGrrH,MAAAhpB,IAviDA5Y,GAAA,EAAS/J,EAAAmtB,GAAM5P,IAASu4G,cAAcK,UAAUx5H,GAChD0D,EAAqBu2C,GAAmBr5B,IAASu4G,cACjDr1H,EAAwB02C,GAAsB55B,IAASu4G,cACvDpjH,EAAYwB,EAAUqJ,IAASu4G,cAE/BrzG,KAuiDG9lB,CACV,CAED47C,GAAiB+9E,sBAAwB,mBACzC,IAAAt+E,GAAel3C,EAAAqsB,EAAAopG,oBAAiCh+E,IC7kDhD,SAASqC,KACL,IAGIj+C,EACAoN,EACAzJ,EACAsJ,EACA3Q,EACAuR,EACAX,EACA/I,EACAE,EACAD,EACAE,EACAR,EAdEJ,EAAU4S,KAAK9V,QACfsK,GAAA,EAAWkD,EAAAwiB,GAAS9sB,GAASy1H,cAyBnC,SAASzqH,IAmOL5K,EAAO8R,MAAM,+BACTtZ,IACAopC,cAAcppC,GACdA,EAAqB,MA9L7B,WACIwO,EAAS4nB,IAAIjvB,EAAA+sB,EAAA62G,uBAA+BlrI,EAAyBma,MACrExL,EAAS4nB,IAAIjvB,EAAA+sB,EAAA+0G,sBAA8Bv2H,EAAwBsH,MACnExL,EAAS4nB,IAAIjvB,EAAA+sB,EAAA+lH,iBAAyBlxH,EAAoB/O,MAC1DxL,EAAS4nB,IAAIjvB,EAAA+sB,EAAAy0G,2BAAmC7uH,EAA6BpW,GAC7E8K,EAAS4nB,IAAIjvB,EAAA+sB,EAAAgxH,sBAA8B1yI,EAA2B9O,EACzE,CAND,GAjCI1D,EAAqB,KACrBuR,EAAsB8lC,IACtB1mC,EAAkB,EAClB7I,EAAqB,KACrBE,EAAyB,CAAC,CAP7B,CAgDD,SAAS+gB,IACDjhB,IACA07B,aAAa17B,GACbA,EAAqB,KAE5B,CAQD,SAASgS,EAA4BpW,GACjC,IACI,GAAIA,EAAEs6H,WAAan2H,EAAiB6xI,sBAAsB/9H,IAAOjY,EAAEu6H,YAAcr+H,EAAAs0B,EAAAi7C,OAAmBzrE,EAAEu6H,YAAcr+H,EAAAs0B,EAAA3B,MAChH,OAGA7uB,EAAEs6H,WAAan2H,EAAiB6xI,sBAAsB/9H,KACtD3T,EAAuBtE,EAAEu6H,YAAA,EAIhC,CAFC,MAAOv6H,GACL8D,EAAO0H,MAAMxL,EAChB,CACJ,CAOD,SAAS8O,EAA0B9O,GAC1BA,GAAMA,EAAEu6H,YAIbj2H,EAAuBtE,EAAEu6H,YAAA,EAC5B,CAMD,SAASvrH,IACA1S,GA4GT,WACI,IACSA,IACDwH,EAAO8R,MAAM,+BACbtZ,EAAqBgpC,aAAY,WACxBvyB,KAILmG,EADoBhM,EAAmB4K,UAG1C,GAvPY,KA0PpB,CADC,MAAO9X,GACR,CACJ,CAfD,EAzGC,CAMD,SAAS7D,IACL,GAAK4W,EAAoBpP,EAASyT,MAAMskH,UAAU+C,KAAKK,kBAIvD7xH,GA7IoB,GA8IwB,CACxC,IAAMjN,EAAckN,EAAmB4K,UACnC1K,IAAqBpN,EACrBkZ,EAASlZ,GAAA,IAEToN,EAAmBpN,EACnB6N,EAAsB8lC,KAE1B1mC,EAAkB,CACrB,CACJ,CAQD,SAAS8F,IAA+C,IAA3B/S,EAA2B1B,UAAAjC,OAAA,YAAAiC,UAAA,IAAAA,UAAA,GACpD,IAAK6F,EAAiBmtJ,kBAClB,OAAO,EAEX,IAAMlkJ,EAAwBtQ,OAAOP,KAAK+H,GAAwBsoB,MAAK,SAAC5sB,GACpE,OAAOsE,EAAuBtE,EACjC,IACKiN,IAA2BjN,GAAoB+V,IAErD,OAAQ3I,GAAyBzJ,EAASyT,MAAMskH,UAAU+C,KAAKC,UAAYv6H,EAAiByzI,4BAA4Bv7I,OAAS,KAAO6Q,EAAmBmoI,aAAepoI,KAA8BC,EAAmBkoI,aAAejxI,EAAiBq8J,gCACtPr8J,EAAiBu8J,kCACzB,CAOD,SAAS3qJ,IACL,IAAM/V,EAAemE,EAAiBmtJ,kBAChClkJ,EAAY0J,YAAY9W,EAAa+4J,eAAiB/4J,EAAaquJ,eAAejuH,QAAQ,IAEhG,OAAOlzB,EAAmB4K,UAAYnU,EAASyT,MAAMskH,UAAU+C,KAAKI,WAAazxH,CACpF,CASD,SAASsI,EAAmB1V,EAAQoN,GAChC,IAEI,IAAKpN,GAAWA,EAAO3D,QAAU,GAAK+Q,EAAc,EAChD,OAAOumC,IAKX,IAHA,IAAI1mC,EAAiB0mC,IACjBr3C,EAAI,EAEDg5B,MAAMroB,IAAmB3Q,EAAI0D,EAAO3D,QAAQ,CAC/C,IAAMH,EAAWI,EAAI,EAAI0D,EAAO8Y,IAAIxc,EAAI,GAAK,EACzC8Q,EAAcpN,EAAO4Y,MAAMtc,IAAMJ,EAAWkR,EAAczJ,EAASyT,MAAMskH,UAAU+C,KAAKI,YACxF5xH,EAAiB3Q,GAErBA,GAAK,CACR,CACD,OAAO2Q,CAIV,CAFC,MAAOjN,GACL,OAAO,IACV,CACJ,CASD,SAASkW,EAAgBlW,EAAQoN,GAC7B,IAAK,IAAIzJ,EAAI,EAAGsJ,EAAMjN,EAAO3D,OAAQsH,EAAIsJ,EAAKtJ,IAC1C,GAAIyJ,GAAepN,EAAO4Y,MAAMjV,IAAMyJ,GAAepN,EAAO8Y,IAAInV,GAC5D,OAAO,EAGf,OAAO,CACV,CAyCD,SAASuV,EAASlZ,GAAsC,IAMhDoN,EANuBH,EAAyB3O,UAAAjC,OAAA,YAAAiC,UAAA,IAAAA,UAAA,GAC9ChC,EAAiBqH,EAASyT,MAAMskH,UAAU+C,KAAKM,eAC/C7iI,EAAYyH,EAASyT,MAAMskH,UAAU+C,KAAKO,UAC1ChxH,EAAgBrK,EAASyT,MAAMskH,UAAU+C,KAAKG,cAC9Cn7H,EAAgBE,EAASyT,MAAMskH,UAAU+C,KAAKE,cAC9Ct7H,EAASgB,EAAWw5J,iBAEtBv5J,EAAiBqvC,IACjBjwC,GAAA,EAMJ,GAFA0J,EAAiBsI,EAAmBrS,EAAQrD,IAEvCs1B,MAAMloB,GAAiB,CACxB,IAAMtC,EAAQzH,EAAOuV,MAAMxL,GACrBsB,EAAM5D,EAAQ9K,EAChB0O,EAAM,IAAMA,GAAOV,GAAiBvK,KACpCa,EAAiBwG,EAExB,CAGD,IAAMua,EAAkBnY,EAAmBwqI,qBAiB3C,GAhBIpiH,MAAMhxB,IAAmB2I,GAAmBwB,SAAS4W,KAAqBiQ,MAAMjQ,IAAoBA,EAAkBrX,IACtH1J,EAAiBwS,WAAW5J,EAAmB4rI,mBAAmB14G,QAAQ,IAC1E18B,GAAA,GAGApH,GAAkBg5B,MAAMhxB,IAAmB2I,GAAmBqoB,MAAMloB,IAAmB8I,EAAgB7S,EAAQrD,KAC7F,IAAd9D,GACA4H,EAAO2I,KAAP,oCACApI,EAAWogH,QACXpgH,EAAWmgH,SAEX1gH,EAAO2I,KAAP,WAAA7M,OAAuB1D,EAAvB,qBACAoI,EAAiBtE,EAAc9D,IAInCoI,EAAiB,GAAKuJ,IAAwBvJ,GAAkBA,EAAiBtE,IAAgBoE,EAAoB,CACrH,IAAMgS,EAAkB9R,EAAiBtE,EAEzC,GAAI0D,EAAiB,CACjB,IAAMoL,EAAa3K,EAAiBg8J,iBAAiB77J,GAC/C0K,EAAeF,KAAgBA,EAAW4qJ,eAEhD51J,EAAO2I,KAAP,gDAAA7M,OAA4DI,EAA5D,QAAAJ,OAA8E0E,EAA9E,oBAAA1E,OAA+GwW,IAC/GlJ,EAAmB63G,KAAKzgH,GAAA,EAAsB0K,EACjD,KAAM,CACH,IAAM7S,EAAY+Q,EAAmBgrI,eAC/BnlI,EAAQ3F,EAAiB,EAAI/J,EAAOyV,IAAI1L,EAAiB,GAAKpN,EAC9D+V,EAAc5Z,EAA8E,IAA9DyS,KAAKgN,IAAI,EAAGxF,EAjU3B,IAiUW,EAEhChS,EAAqBpB,OAAO0F,YAAW,WACnCwE,EAAmB63G,KAAKzgH,GAAA,GAAgB,GACxCR,EAAO2I,KAAP,kCAAA7M,OAA8CuE,EAAiBmtJ,kBAAkBj3B,cAAjF,iBAAAz6H,OAA8GmT,EAA9G,mBAAAnT,OAAqI0E,EAArI,kBAAA1E,OAAoK0E,EAAiByO,IACrL3O,EAAqB,IACxB,GAAE2R,EACN,CACDlI,EAAsBvJ,CACzB,CACJ,CAUD,OARAtE,EAAW,CACPgvC,MAAAtgC,EACA6oI,UApSJ,SAAmBv3I,GACVA,IAGDA,EAAOo5G,WACPz1G,EAAW3D,EAAOo5G,UAElBp5G,EAAOw+I,qBACPtxI,EAAqBlN,EAAOw+I,oBAE5Bx+I,EAAOyjE,mBACPt/D,EAAmBnE,EAAOyjE,kBAE1BzjE,EAAOy3I,aACPpzI,EAAarE,EAAOy3I,YAE3B,EAqRGpN,WA7TJ,YA0CA,WACIv/H,EAASsnB,GAAG3uB,EAAA+sB,EAAA62G,uBAA+BlrI,EAAyBma,MACpExL,EAASsnB,GAAG3uB,EAAA+sB,EAAA+0G,sBAA8Bv2H,EAAwBsH,MAClExL,EAASsnB,GAAG3uB,EAAA+sB,EAAA+lH,iBAAyBlxH,EAAoB/O,MACzDxL,EAASsnB,GAAG3uB,EAAA+sB,EAAAy0G,2BAAmC7uH,EAA6BpW,GAC5E8K,EAASsnB,GAAG3uB,EAAA+sB,EAAAgxH,sBAA8B1yI,EAA2B9O,EACxE,CAND,EAxCC,GAGG8D,GAAA,EAAST,EAAAmtB,GAAM9sB,GAASy1H,cAAcK,UAAUx5H,GAEhD0O,IA2TG1O,CACV,CAEDi+C,GAAc07E,sBAAwB,gBACtC,IAAAz7E,GAAe/5C,EAAAqsB,EAAAopG,oBAAiC37E,ICxVhD,SAASV,KACL,IAGIv9C,EACAoN,EACAzJ,EACAsJ,EACA3Q,EACAuR,EACA1J,EACAC,EACAE,EACAR,EAZEJ,EAAU4S,KAAK9V,QACfsK,GAAA,EAAWkD,EAAAwiB,GAAS9sB,GAASy1H,cAgFnC,SAASzqH,IACLtB,GAAA,EACA,IAAMpN,EAAKwlB,GAAAgL,EAAAowI,iBACXj9J,EAAW3D,GAAMA,EAAG6gK,SAAW7gK,EAAG6gK,QAAQ1iK,MAA0C,WAAlC6B,EAAG6gK,QAAQ1iK,KAAKyL,aACrE,CAGD,SAASyb,IACLjY,GAAA,CACH,CAOD,SAASgJ,EAAsBpW,GAE3B,GAAIA,EAAEs6H,WAAazsH,EAAiBmoI,sBAAsB/9H,IAAO3T,EAAjE,CAKA,IAAM8I,EAAYjJ,EAAmBu0I,eACjBv0I,EAAmBwzI,iBACrBvqI,EAAY,IAC1B9I,GAAA,EANH,CAQJ,CAOD,SAASwK,EAA2B9O,GAE5BA,EAAEs6H,WAAazsH,EAAiBmoI,sBAAsB/9H,KAI1D3T,EAAkBtE,EAAE2xC,QAAUzkC,EAAAsjB,EAAAylH,aACjC,CAMD,SAASjnI,IACA5K,EAAiB08J,yBAClB7zJ,EAAW8zJ,gBAAgB,EAElC,CAMD,SAAS5kK,IAEDgI,EAAmB+zI,gBACnB9zI,EAAiB08J,0BACf18J,EAAiB48J,0BAA0BplJ,IAAM,GAAOxX,EAAiB48J,0BAA0BrlJ,IAAM,KAC1GxX,EAAmBixI,aACnBjxI,EAAmBkxI,aA2E5B,WACI,IACI,SAAKlxI,EAAmB2T,UAAY,GAAK1K,KAIrB2I,MAEA7Z,EAAAs0B,EAAAywI,uBAgD5B,SAAkCjhK,EAAeoN,GAC7C,IAGI,OAFqBwB,KAAKC,IAAIkE,KAER,GAAK/S,EAAgBoN,CAG9C,CAFC,MAAOpN,GACL,OAAO,CACV,CACJ,CARD,CA/CkCmE,EAAmBwzI,iBACfr7I,EAAS8a,MAAMskH,UAAU6E,YAAYE,mBA6B3E,WACI,IAGI,OAFqB7xH,KAAKC,IAAIkE,KAER,CAGzB,CAFC,MAAO/S,GACL,OAAO,CACV,CACJ,CARD,GApBK,CAFC,MAAOA,GACL,OAAO,CACV,CACJ,CApBD,IAlEA,WAGI,IAAIoN,GAIAH,EAAY,CACZ,IAAIjN,EACE6N,EAAsBZ,EAAWsoI,kBACjCroI,EAA2B9I,EAAiB48J,0BAC5ChzJ,EAAc7J,EAAmBwzI,iBACjCl0I,EAAesP,IAGf1P,EAAWe,EAAiB88J,qBAClC,IAAK5rI,MAAMjyB,IAAaA,EAAW,GAC/BI,EAAeJ,EACfS,EAAOgS,KAAK,oGACZ1I,GAAA,EACAjJ,EAAmB60I,mBAAA,GAAkB,OAIpC,CACD,IAAM30I,EAAqBF,EAAmBy0I,wBACxCl1I,EAAkBS,EAAmBu0I,eAKvC14I,EAHA+V,MAAsB7Z,EAAAs0B,EAAAywI,uBA2JtC,SAAuCjhK,EAA0BoN,EAAoBzJ,EAAWsJ,EAAmB3Q,GAC/G,IAAIJ,EAGJ,GAAII,EAAc2Q,EAAmB,CAEjC,IAAMY,EAAMe,KAAKC,IAAI7O,EAAyB2b,KAExCzO,EAAkB,GADJ5Q,EAAc2Q,GAMlC/Q,EAAW,EAAI2R,EADE,EAANA,GAAY,EAAIe,KAAK+U,IAAI/U,KAAKF,GAAIxB,IAG7CpJ,EAAO8R,MAAM,qDAAuDtZ,EAAc,cAAgBJ,EACrG,KAAM,CAIH,GAAI0S,KAAKC,IAAIzB,EAAqBzJ,IADZ,IAC2CA,EAC7DzH,EAAU,MACP,CACH,IAAM8R,EAAeZ,EAAqBzJ,EAEpCF,EAAOuK,EAAe,EAAKY,KAAKC,IAAI7O,EAAyB2b,KAAO3b,EAAyB4b,IAC7FzX,EAAmB,EAAf6J,EAKV9R,EAAW,EAAIuH,EADE,EAANA,GAAY,EAAImL,KAAK+U,IAAI/U,KAAKF,GAAIvK,GAEhD,CAEDL,EAAO8R,MAAM,kDAAoDxI,EAAqB,cAAgBlR,EACzG,CAED,OAAOA,CACV,CAtCD,CAxJwDgR,EAA0B7I,EAAoBX,EAD5DpH,EAAS8a,MAAMskH,UAAU6E,YAAYE,kBAC2DzyH,GAiH1I,SAA0ChO,EAA0BoN,EAAoBzJ,EAAWsJ,GAE/F,GAAI3I,EACA,OAAO,EAGX,IAAMhI,EAAe8Q,EAAqBzJ,EACpCzH,EAAOI,EAAe,EAAKsS,KAAKC,IAAI7O,EAAyB2b,KAAO3b,EAAyB4b,IAC7F/N,EAAmB,EAAfvR,EAKN4Q,EAAW,EAAIhR,EADF,EAANA,GAAY,EAAI0S,KAAK+U,IAAI/U,KAAKF,GAAIb,IAW7C,OANI1J,EAAmB0zI,sBACf5qI,GAAetJ,EAAY,GAAKrH,EAAe,IAC/C4Q,EAAU,GAIXA,CACV,CAxBD,CA9G2DA,EAA0B7I,EAAoBX,EAAiBsK,GAK9G,IAAMlD,EAAwBnH,EAAW,IAAO,KAAQ,GAAMuJ,EAAyB0O,KAGnF5b,GAAW4O,KAAKC,IAAIhB,EAAsB7N,IAAY8K,IACtDhH,EAAO8R,MAAP,iDAAAhW,OAA8DI,IAC9DiN,EAAW8zJ,gBAAgB/gK,GAElC,CACJ,CACJ,CAhDD,EALC,CA4DD,SAAS+S,IAIL,OAH2B5O,EAAmBy0I,wBACtBz0I,EAAmBu0I,cAG9C,CAkCD,SAAS3iI,IACL,IAAM/V,EAAoB1D,EAAS8a,MAAMskH,UAAU6E,YAAYE,kBAE/D,OAAOnkI,EAAS8a,MAAMskH,UAAU6E,YAAYzqG,OAAS55B,EAAAs0B,EAAAywI,wBAA0D,OAAtBjhK,GAA+Bs1B,MAAMt1B,GAAwD9D,EAAAs0B,EAAAkwG,0BAAnCxkI,EAAAs0B,EAAAywI,sBACtJ,CA6HD,SAASvrJ,IACLtR,EAAiB48J,yBAAA,EACpB,CAUD,OARAhhK,EAAW,CACPgvC,MAnTJ,WAjBIlkC,EAAS4nB,IAAIruB,EAAAmsB,EAAAyuH,qBAAwC7oI,EAAuBpW,GAC5E8K,EAAS4nB,IAAIruB,EAAAmsB,EAAAukH,2BAA8CjmI,EAA4B9O,GACvF8K,EAAS4nB,IAAIruB,EAAAmsB,EAAAomH,kBAAqCz6I,EAAwB6D,GAC1E8K,EAAS4nB,IAAIruB,EAAAmsB,EAAAkmH,sBAAyCv6I,EAAwB6D,GAC9E8K,EAAS4nB,IAAIruB,EAAAmsB,EAAAimH,gBAAmCpxH,EAAmBrlB,GACnE8K,EAAS4nB,IAAIjvB,EAAA+sB,EAAA+qG,gCAAwCvsH,EAA0BhP,GAC/E8K,EAAS4nB,IAAIjvB,EAAA+sB,EAAAgrG,kCAA0C9lH,EAAqB1V,GAC5E8K,EAAS4nB,IAAIjvB,EAAA+sB,EAAAirG,kCAA0C/lH,EAAqB1V,GAC5E8K,EAAS4nB,IAAIruB,EAAAmsB,EAAAsnI,mBAAsCpiJ,EAAqB1V,GAWxE0O,IACAzB,EAAW8zJ,gBAAgB,KAC9B,EAgTGxpB,UA5WJ,SAAmBv3I,GACVA,IAIDA,EAAOo5G,WACP98G,EAAW0D,EAAOo5G,UAGlBp5G,EAAOy3I,aACPxqI,EAAajN,EAAOy3I,YAGpBz3I,EAAOyjE,mBACP51D,EAAmB7N,EAAOyjE,kBAG1BzjE,EAAOw+I,qBACPr6I,EAAqBnE,EAAOw+I,oBAG5Bx+I,EAAO4gJ,mBACPx8I,EAAmBpE,EAAO4gJ,kBAEjC,EAqVGvW,WAlXJ,WAgCIv/H,EAASsnB,GAAG/tB,EAAAmsB,EAAAyuH,qBAAwC7oI,EAAuBpW,GAC3E8K,EAASsnB,GAAG/tB,EAAAmsB,EAAAukH,2BAA8CjmI,EAA4B9O,GACtF8K,EAASsnB,GAAG/tB,EAAAmsB,EAAAomH,kBAAqCz6I,EAAwB6D,GACzE8K,EAASsnB,GAAG/tB,EAAAmsB,EAAAkmH,sBAAyCv6I,EAAwB6D,GAC7E8K,EAASsnB,GAAG/tB,EAAAmsB,EAAAimH,gBAAmCpxH,EAAmBrlB,GAClE8K,EAASsnB,GAAG3uB,EAAA+sB,EAAA+qG,gCAAwCvsH,EAA0BhP,GAC9E8K,EAASsnB,GAAG3uB,EAAA+sB,EAAAgrG,kCAA0C9lH,EAAqB1V,GAC3E8K,EAASsnB,GAAG3uB,EAAA+sB,EAAAirG,kCAA0C/lH,EAAqB1V,GAC3E8K,EAASsnB,GAAG/tB,EAAAmsB,EAAAsnI,mBAAsCpiJ,EAAqB1V,GAtCvE0V,GACH,GAqDG5R,GAAA,EAAST,EAAAmtB,GAAM9sB,GAASy1H,cAAcK,UAAUx5H,GAEhD0O,IA6TG1O,CACV,CAEDu9C,GAAkBo8E,sBAAwB,oBAC1C,IAAA96E,GAAe16C,EAAAqsB,EAAAopG,oBAAiCr8E,IC9Y1CP,GAAoB,CAAC9gD,EAAAs0B,EAAA2wI,mCACrBxhH,GACK,QADLN,GAEK,QAKX,SAASQ,KACL,IAEI7/C,EACAoN,EACAzJ,EACAsJ,EACA3Q,EANE4Q,EAAUoJ,KAAK9V,QAyBrB,SAASwN,IACLZ,EAA6B,CACzB6vH,UAAWtpF,IACX4sF,YAAa,CACTC,SAAU7sF,IACV9Z,aAAc,CACVle,IAAKg4B,IACL/3B,IAAK+3B,MAGbjN,WAAY,CAAC,EACbpC,WAAY,CAAC,EACbi/F,eAAgB,CAAC,EACjBv1G,gBAAiB,MAErBrqB,EAAc,EACjB,CAgMD,SAASF,EAAwBzD,EAAO2D,EAAWrH,GAC/C,IAEI8Q,EAA2BpN,GAAO2D,GAAarH,EAAQ,GAG1D,CAFC,MAAO0D,GACLiN,EAAOzB,MAAMxL,EAChB,CACJ,CA6GD,OAXAA,EAAW,CACPs4I,8BArSJ,WACI,OAAOlrI,CACV,EAoSGg0J,gCArFJ,WACI,OAAOz9J,CACV,EAoFGu6J,sCA3EJ,SAA+Cl+J,GAC3C,IACI,IAAIoN,EAAc,GAClB,GAAIpN,GAAeA,EAAY3D,OAAS,EAAG,CACvC,IAAM6Q,EAAa,CAAChR,EAAAs0B,EAAAi7C,MAAiBvvE,EAAAs0B,EAAA3B,MAAiB3yB,EAAAs0B,EAAAmmG,MAChD3oH,EAAe1R,EAAQk8I,2BAA6B,IAE1Dx4I,EAAY0J,SAAQ,SAAC1J,GACjB,IAAM2D,EAAUuJ,EACXggB,QAAO,SAAC9f,EAAKzJ,GAEV,OADMyJ,EAAIxN,OAAOtD,EAAQs6J,uBAAuB52J,EAAY2D,GAE/D,GAAE,IACFupB,QAAO,SAAC9f,EAAKzJ,GAqBV,OApBarH,EAAQ+kK,0BAA0BrhK,EAAY2D,GACtD+F,SAAQ,SAACuD,GACV,IAAM/Q,EAAoBI,EAAQspJ,qBAAqBjiJ,GACvD,GAAIzH,GAAqBA,EAAkBG,OAAS,GAAKH,EAAkB,GAAGisI,YAAcjsI,EAAkB,GAAGstI,kBAAoB37H,EAAA2iB,EAAAi6G,iBAAgC,CACjK,IAAMv9H,EAAQhR,EAAkB,GAS1BuH,EARI,IAAIoU,KAAK5K,EAAIY,EAAA2iB,EAAAmhH,kBACC75H,UAAY,KAOJ7K,EAAIY,EAAA2iB,EAAAy/G,mBAAmC/iI,EAAMW,EAAA2iB,EAAAi/G,WAA4BviI,EAAMW,EAAA2iB,EAAAo/G,0BAA2C5vI,EAAW4Y,OAE/JzU,EAAK6J,EAAevK,EAE1B2J,EAAI2T,KAAK,CAAE9I,GAAIhL,EAAIY,EAAA2iB,EAAA5Y,IAAmBg8D,GAAAzvE,GACzC,CACJ,IACMiJ,CACV,GAAE,IAEPA,EAAcA,EAAYxN,OAAO+D,EACpC,GACJ,CACDA,EAAcyJ,CAIjB,CAHC,MAAOpN,GACLiN,EAAOzB,MAAMxL,GACb2D,EAAc,EACjB,CACJ,EA+BGq4H,wBA/RJ,SAAiCh8H,GAC7B,GAAKA,GAAiBA,EAAashK,oBAAnC,CAIA,IAAMhlK,EAA+B0D,EAAashK,oBAAoBjqJ,QAAO,SAAArX,GAAE,OAAIg9C,GAAkB35B,SAASrjB,EAAG+6C,YAAlC,IACzEltC,EAAgC7N,EAAashK,oBAAoBjqJ,QAAO,SAAArX,GAAE,OAAsB,MAAlBA,EAAG+6C,WAAP,IAC5E7tC,EAAM5Q,EAA6BD,OAAS,EAC1CC,EAA6BA,EAA6BD,OAAS,GACnEwR,EAA8BA,EAA8BxR,OAAS,GACtE6Q,IAEDA,EAAG0uE,SAAW1uE,EAAG0uE,QAAQ0I,OAAS,GA0B1C,SAAyCtkF,GACrC,IAAI1D,EAQJ,GANI0D,EAAG+6C,YAAgB7+C,EAAAs0B,EAAA2wI,kCACnB7kK,EAkDR,SAAoD0D,GAKhD,MAAO,CACHi9H,UALcj9H,EAAG47E,QAAQ0I,OAAS,IAMlCk8C,UALYlrG,MAAMt1B,EAAG47E,QAAQhgE,MAAQ5b,EAAG47E,QAAQhgE,IAAM5b,EAAG47E,QAAQ0I,QAAUtkF,EAAG47E,QAAQhgE,IAAM5b,EAAG47E,QAAQ0I,OAAS,KAAO,IAAO3wC,IAM9H88G,YALgBzwJ,EAAG47E,QAAQ60E,aAAe98G,IAOjD,CAVD,CAlD4D3zC,GAKpD2D,EAAYtH,OAAS,EAAG,KAAAwR,EAyNhC,SAA8B7N,GAC1B,IAAYoN,EAARH,EAAK,EACL3Q,EAASqH,EAAY0T,QAAO,SAAAjK,GAC5B,OAAOA,EAAI6K,KAAOjY,EAAUywJ,WAC/B,IAYD,OATsB,IAAlBn0J,EAAOD,QACP4Q,EAAMtJ,EAAYtH,OAAS,EAAKsH,EAAY,GAAGiwE,GAAK,EACpDxmE,EAAKzJ,EAAY,GAAGsU,IAAM07B,MAG1B1mC,EAAK3Q,EAAO,GAAGs3E,IAAM,EACrBxmE,EAAK9Q,EAAO,GAAG2b,IAAM07B,KAGlB,CAAEigC,GAAA3mE,EAAIgL,GAAA7K,EAChB,CAjBD,CAxN8C9Q,GAAhC4Q,EADkBW,EAClB+lE,GAAI5lE,EADcH,EACdoK,GAKV7K,EAA2B6vH,UAAY3gI,EAAO2gI,UAAY/vH,EAC1DE,EAA2BmzH,YAAYC,SAAWlkI,EAAOkkI,SAEzDvzH,EAAO2I,MAAP,sGAAAhW,OACuFsN,EADvF,gDAAAtN,OACwIoO,EADxI,mCAAApO,OAEkBtD,EAAO2gI,UAAY/vH,EAFrC,8BAAAtN,OAEoEtD,EAAOkkI,SAF3E,kBAIH,MACGpzH,EAA2B6vH,UAAY3gI,EAAO2gI,UAC9C7vH,EAA2BmzH,YAAYC,SAAWlkI,EAAOkkI,SAEzDvzH,EAAO2I,MAAP,yEAAAhW,OAAsFtD,EAAO2gI,UAA7F,8BAAAr9H,OAAmItD,EAAOkkI,UAEjJ,CA5BD,CAzBwCtzH,GAGhCA,EAAG2sB,cA6FX,SAA8C75B,GAE1C,IAAM2D,EAAM3D,EAAG65B,aAAale,IAAO/M,KAAKwU,MAAoC,KAA7BpjB,EAAG65B,aAAale,IAAM,IAAe,IAAQg4B,IACtFr3C,EAAM0D,EAAG65B,aAAaje,IAAOhN,KAAKwU,MAAoC,KAA7BpjB,EAAG65B,aAAaje,IAAM,IAAe,IAAQ+3B,IAC5FvmC,EAA2BmzH,YAAY1mG,aAAale,IAAMhY,EAC1DyJ,EAA2BmzH,YAAY1mG,aAAaje,IAAMtf,EAE1D2Q,EAAO2I,MAAP,6FAAAhW,OAA0G+D,IAC1GsJ,EAAO2I,MAAP,6FAAAhW,OAA0GtD,GAC7G,CATD,CA5F6C4Q,GAGrCA,EAAGyjJ,iBAIHzjJ,EAAG0jJ,oBA6GX,SAAoD5wJ,GAGhD,GAAKA,GAAOA,EAAG4wJ,oBAAuB5wJ,EAAG4wJ,mBAAmBr2B,WAnM3D,QAmMwEv6H,EAAG4wJ,mBAAmBr2B,UAA/F,CAIA,IAAMntH,EAAS,CAAC,EAEhBA,EAAOm0J,aAAevhK,EAAG4wJ,mBAAmBj1I,IAC5CvO,EAAOo0J,aAAexhK,EAAG4wJ,mBAAmBh1I,IAC5CxO,EAAOq0J,gBAAkBzhK,EAAG4wJ,mBAAmBtsE,OAE/C,IAAM3gF,EAAoB,GAEtB3D,EAAG4wJ,mBAAmBr2B,YAAc56E,IAAqB3/C,EAAG4wJ,mBAAmBr2B,YAAcl7E,GAC7F17C,EAAkBod,KAAK/gB,EAAG4wJ,mBAAmBr2B,WAjNhD,QAkNUv6H,EAAG4wJ,mBAAmBr2B,YAC7B52H,EAAkBod,KAAKs+B,IACvB17C,EAAkBod,KAAK4+B,KAG3Bh8C,EAAkB+F,SAAQ,SAAC1J,GAElBs1B,MAAMloB,EAAOm0J,eACd99J,EAAwB,aAAczD,EAAWoN,EAAOm0J,cAGvDjsI,MAAMloB,EAAOo0J,eACd/9J,EAAwB,aAAczD,EAAWoN,EAAOo0J,cAGvDlsI,MAAMloB,EAAOq0J,kBACdh+J,EAAwB,iBAAkBzD,EAAWoN,EAAOq0J,gBAEnE,GA9BA,CA+BJ,CApCD,CA5GmDv0J,GAG3CA,EAAG8gB,iBAoKX,SAAiDhuB,GAC7CoN,EAA2B4gB,gBAAkBhuB,EAAGguB,eACnD,CAFD,CAnKgD9gB,GA1B3C,CA4BJ,EAiQG8hC,MAlUJ,WACIhhC,GACH,EAiUGupI,UA3UJ,SAAmBv3I,GACVA,GAEDA,EAAOmzG,UACP72G,EAAU0D,EAAOmzG,QAExB,GAVGlmG,GAAA,EAAS5J,EAAAmtB,GAAMtjB,GAASisH,cAAcK,UAAUx5H,GAChDgO,IAmVGhO,CACV,CAED6/C,GAA6B85E,sBAAwB,+BACrD,IAAA56E,GAAe56C,EAAAqsB,EAAAopG,oBAAiC/5E,IAAAT,GAAAz7C,EAAA,MAAA2hD,GAAA3hD,EAAAA,EAAAy7C,IAAAa,GAAAt8C,EAAA,MCvWhD,SAASu8C,KAEL,IAGIlgD,EACAoN,EACAzJ,EACAsJ,EACA3Q,EACAuR,EACAX,EACA/I,EAVEE,EAAUiS,KAAK9V,QACf4D,GAAA,EAAW4J,EAAAwiB,GAASnsB,GAAS80H,cA+FnC,SAAS70H,EAAatE,EAAMoN,GACxB,OAAKpN,GAEA2D,EAAOyJ,IAAczJ,EAAOyJ,GAAUpN,GAEpC2D,EAAOyJ,GAAUpN,GAAM0hK,KAJZ,EAKrB,CAQD,SAAS59J,EAAmB9D,EAAMoN,GAC9B,OAAKpN,GAAS2D,EAAOyJ,IAAczJ,EAAOyJ,GAAUpN,GAC7C2D,EAAOyJ,GAAUpN,GAAM0E,QADoC,IAErE,CAsBD,SAAShB,EAAS1D,GAA+B,IAAxBoN,EAAwB9O,UAAAjC,OAAA,YAAAiC,UAAA,IAAAA,UAAA,GAC7C,GAAK0B,GAAUA,EAAM2nI,WAArB,CAEA,IAAMrrI,EAAO0D,EAAM/B,KAEb+P,EADahO,EAAM2nI,WACH1vH,GAChB5U,EAAUS,EAAmBxH,EAAM0R,GAEzC,GAAKrK,EAAOqK,IAAQrK,EAAOqK,GAAI1R,KAE/BqH,EAAOqK,GAAI1R,GAAMoI,QAAU1E,EAEvB2D,EAAOqK,GAAI1R,GAAMoI,UAAapI,IAASJ,EAAAs0B,EAAAmmG,OAAmBtxG,EAAcrlB,EAAOqD,IAAc/G,IAASJ,EAAAs0B,EAAAmmG,MAAkB32H,EAAM+9I,eAC9H35I,EAASuwB,QAAQlxB,EAAA+sB,EAAA40G,sBAA8B,CAC3Cqc,aAAcp+I,EACdq+I,aAAc1hJ,EACd2hK,WAAY10J,EAASmK,MAAMskH,UAAUsF,gBAAgB1kI,IACtD,CAAEg+H,SAAUtsH,KAGdZ,GAAgB,CAEjB,IAAI/I,EAAWyK,EAAgB9O,GAE/B,IAAKqE,IAAaV,EAAOqK,GAAI1R,GAAMslK,kBAAmB,OAElDv9J,EAASw9J,QACTx9J,EAASy9J,KAAOz9J,EAASw9J,MAAM,UACxBx9J,EAASw9J,OAGhBx9J,EAAS09J,gBACT19J,EAAS09J,cAAgB19J,EAAS09J,cAAc,IAGhD19J,EAAS29J,4BACT39J,EAAS29J,0BAA4B39J,EAAS29J,0BAA0B,IAG5En0J,EAAmBvR,GAAQ+H,EAC3BF,EAAW89J,sBAAsB3lK,EAAM+H,EAC1C,CAxCsC,CAyC1C,CAOD,SAASyG,EAAmB9K,EAAMoN,GACzBpN,GAASoN,IAEd9Q,EAAgB0D,GAAQoN,EAC3B,CAOD,SAASsB,EAAmB1O,GACxB,OAAKA,EAEE1D,EAAgB0D,GAFL,IAGrB,CAwBD,SAASqlB,EAAcrlB,EAAIoN,GACvB,IAAKpN,IAAOoN,EACR,OAAO,EAGX,IAAKpN,IAAOoN,EACR,OAAO,EAGX,IAAMzJ,EAAS3D,EAAGiY,KAAO7K,EAAG6K,GACtBhL,EAAgBjN,EAAGkiK,YAAc90J,EAAG80J,UACpC5lK,EAA2B06B,KAAKC,UAAUj3B,EAAGmiK,6BAA+BnrI,KAAKC,UAAU7pB,EAAG+0J,2BAC9FjmK,EAAW8D,EAAGwvB,OAASpiB,EAAGoiB,KAC1B3hB,EAAY7N,EAAGulB,QAAUnY,EAAGmY,MAC5BrY,EAAYlN,EAAG6hK,MAAM7kK,aAAeoQ,EAAGy0J,MAAM7kK,WAC7CgR,EAAsBgpB,KAAKC,UAAUj3B,EAAGoiK,wBAA0BprI,KAAKC,UAAU7pB,EAAGg1J,sBACpF3+J,EAAoBzD,EAAG+hK,cAAc/kK,aAAeoQ,EAAG20J,cAAc/kK,WACrEmH,EAA+B6yB,KAAKC,UAAUj3B,EAAGqiK,kCAAoCrrI,KAAKC,UAAU7pB,EAAGi1J,gCACvGh/J,EAAgCrD,EAAGgiK,0BAA0BhlK,aAAeoQ,EAAG40J,0BAA0BhlK,WACzGqH,EAA2C2yB,KAAKC,UAAUj3B,EAAGsiK,6CAA+CtrI,KAAKC,UAAU7pB,EAAGk1J,2CAEpI,OAAQ3+J,GAAUkK,GAAaZ,GAAiB3Q,GAA4BJ,GAAYgR,GAAac,GAAuBvK,GAAqBU,GAAgCd,GAAiCgB,CACrN,CAsBD,SAAS+R,IACLzS,EAAS,CAAC,EACVkK,EAAqB,CAAC,EAiItBvR,EAAkB,CACdggB,MAAO,KACPC,MAAO,KACPwH,KAAM,KAlIb,CAED,SAASjV,EAAgB9O,GACrB,IAAMoN,EAAW,CACboiB,KAAMxvB,EAAUwvB,KAChB0yI,UAAWliK,EAAUkiK,UACrBL,MAAO7hK,EAAU6hK,MACjBE,cAAe/hK,EAAU+hK,cACzBC,0BAA2BhiK,EAAUgiK,0BACrCz8I,MAAOvlB,EAAUulB,OAKrB,OAHenY,EAASoiB,MAAQpiB,EAAS80J,WAAc90J,EAAS00J,MAAQ10J,EAAS00J,KAAKzlK,OAAS,GAC1F+Q,EAAS20J,eAAiB30J,EAAS20J,cAAc1lK,OAAS,GAAO+Q,EAAS40J,2BAA6B50J,EAAS40J,0BAA0B3lK,OAAS,EAEtI+Q,EAAW,IAChC,CAED,SAAS4B,EAAuBhP,EAAQoN,EAAUzJ,GAC9C,IAAIsJ,EAAqB,GAMzB,OALAjN,EAAO0J,SAAQ,SAAU1J,GACjBoN,EAASzJ,EAAU3D,IACnBiN,EAAmB8T,KAAK/gB,EAE/B,IACiC,IAA9BiN,EAAmB5Q,OACZ4Q,EAEJjN,CACV,CAED,SAAS7D,EAAkB6D,EAAUoN,GACjC,IACI,OAAQpN,EAASwvB,MAChBxvB,EAASwvB,gBAAgB9yB,OACrB0Q,EAAMoiB,KAAKU,MAAMlwB,EAASwvB,MAAwB,KAAfpiB,EAAMoiB,OAAA,EACrCywB,GAAAsiH,gBAAen1J,EAAMoiB,KAAM81B,KAAetlD,EAASwvB,OAAOnzB,OAAS,CAG/E,CAFC,MAAO2D,GACL,OAAO,CACV,CACJ,CAED,SAAS+S,EAAmB/S,EAAUoN,GAClC,YAAO,IAACpN,EAASqc,OAA4C,OAAnBrc,EAASqc,OAAoBjP,EAAMiP,QAAUrc,EAASqc,KACnG,CAED,SAAStG,EAAuB/V,EAAUoN,GACtC,OAAQpN,EAASkiK,WAAcliK,EAASkiK,YAAc90J,EAAM80J,SAC/D,CAED,SAASxsJ,EAAkB1V,EAAUoN,GAA8B,IAAvBzJ,EAAuBrF,UAAAjC,OAAA,YAAAiC,UAAA,IAAAA,UAAA,GAI/D,OAHmB0B,EAAS8hK,QAAU10J,EAAMy0J,MAAMxqJ,QAAO,SAAUjK,GAC/D,OAAOA,IAASpN,EAAS8hK,IAC5B,IAAE,IACmB10J,EAAMnP,OAAS/B,EAAAs0B,EAAA3B,OAAmBlrB,CAC3D,CAED,SAASuS,EAA2BlW,EAAUoN,GAa1C,OAVKpN,EAAS+hK,gBAKa30J,EAAM20J,cAAc1qJ,QAAO,SAAUjK,GACxD,OAAOA,IAASpN,EAAS+hK,aAC5B,IAAE,IAJmB30J,EAAM20J,cAAc1lK,MAQjD,CAED,SAAS6c,EAAgClZ,EAAUoN,GAK/C,OAJsCpN,EAASgiK,6BAA+B50J,EAAM40J,0BAA0B3qJ,QAAO,SAAUjK,GAC3H,OAAOA,IAASpN,EAASgiK,yBAC5B,IAAE,EAGN,CAED,SAAS7rJ,EAAmBnW,EAAUoN,GAClC,OAAQpN,EAASulB,OAAUvlB,EAASulB,QAAUnY,EAAMmY,KACvD,CA0ED,SAAStP,EAA4BjW,GACjC,IAEIoN,EAFAzJ,EAAM,EACNsJ,EAAS,GAgBb,OAbAjN,EAAS0J,SAAQ,SAAU1J,IACvBoN,EAAMwB,KAAKgN,IAAI8F,MAAM9S,KAAM5O,EAAMwxJ,YAAY3rI,KAAI,SAAU7lB,GACvD,OAAOA,EAAI0oI,SACd,MAES/kI,GACNA,EAAMyJ,EACNH,EAAS,CAACjN,IACHoN,IAAQzJ,GACfsJ,EAAO8T,KAAK/gB,EAEnB,IAEMiN,CACV,CAED,SAASgM,EAA+BjZ,GACpC,IAEIoN,EAFAzJ,EAAM,IACNsJ,EAAS,GAmBb,OAhBAjN,EAAS0J,SAAQ,SAAU1J,GACvB,IAAM1D,EAAM0D,EAAMwxJ,YAAYtkI,QAAO,SAAUltB,EAAKoN,GAChD,IAAMzJ,EAAaiL,KAAKgN,IAAI,EAAGxO,EAAI/H,MAAQ+H,EAAI9H,QAE/C,OAAOtF,EADYoN,EAAIs7H,UAAY/kI,CAEtC,GAAE,IACHyJ,EAAM9Q,EAAM0D,EAAMwxJ,YAAYn1J,QAEpBsH,GACNA,EAAMyJ,EACNH,EAAS,CAACjN,IACHoN,IAAQzJ,GACfsJ,EAAO8T,KAAK/gB,EAEnB,IAEMiN,CACV,CAED,SAASoL,EAAyBrY,GAC9B,IAEIoN,EAFAzJ,EAAM,EACNsJ,EAAS,GAcb,OAXAjN,EAAS0J,SAAQ,SAAU1J,IACvBoN,EAAMpN,EAAMwiK,qBAEF7+J,GACNA,EAAMyJ,EACNH,EAAS,CAACjN,IACHoN,IAAQzJ,GACfsJ,EAAO8T,KAAK/gB,EAEnB,IAEMiN,CACV,CAED,SAASqK,EAAmBtX,EAAM2D,GAC9B,GAAI3D,IAAS9D,EAAAs0B,EAAAmmG,KAAgB,OAAOhzH,EAAO,GAE3C,IACIrH,EADAuR,EAAOZ,EAASmK,MAAMskH,UAAUyF,6BAE9BnzH,EAAsCd,EAAsBu1J,yCAElE,GAAIz0J,GAAsF,mBAAxCA,EAC9C1R,EAAS0R,EAAoCrK,QAE7C,OAAQkK,GACJ,KAAK3R,EAAAs0B,EAAA4wG,gDACD9kI,EAyBhB,SAAqD0D,GACjD,IA3HIoN,EACAzJ,EA0HAsJ,GA3HAG,EAAM,EACNzJ,EAAS,GA0HsC3D,EAxH1C0J,SAAQ,SAAC1J,GACTs1B,MAAMt1B,EAAM2tJ,qBAET3tJ,EAAM2tJ,kBAAoBvgJ,GAC1BA,EAAMpN,EAAM2tJ,kBACZhqJ,EAAS,CAAC3D,IAGLA,EAAM2tJ,oBAAsBvgJ,GACjCzJ,EAAOod,KAAK/gB,GAIvB,IAEM2D,GAmHP,OARIsJ,EAAO5Q,OAAS,IAChB4Q,EAASgJ,EAA4BhJ,IAGrCA,EAAO5Q,OAAS,IAChB4Q,EAASoL,EAAyBpL,IAG/BA,CACV,CAZD,CAzBqEtJ,GACrD,MACJ,KAAKzH,EAAAs0B,EAAAkyI,qCACDpmK,EAoChB,SAA2C0D,GACvC,IAAIoN,EAAS6I,EAA4BjW,GAMzC,OAJIoN,EAAO/Q,OAAS,IAChB+Q,EAASiL,EAAyBjL,IAG/BA,CACV,CARD,CApC2DzJ,GAC3C,MACJ,KAAKzH,EAAAs0B,EAAAmyI,iCACDrmK,EAASmW,EAA8B9O,GACvC,MACJ,KAAKzH,EAAAs0B,EAAAoyI,wCACDtmK,EA4ChB,SAA8C0D,GAC1C,IAAIoN,EAAS6L,EAA+BjZ,GAM5C,OAJIoN,EAAO/Q,OAAS,IAChB+Q,EAAS6I,EAA4B7I,IAGlCA,CACV,CARD,CA5C8DzJ,GAC9C,MACJ,KAAKzH,EAAAs0B,EAAAqyI,kCACDvmK,EAmDhB,SAAwC0D,GACpC,IAAIoN,EAASiL,EAAyBrY,GAMtC,OAJIoN,EAAO/Q,OAAS,IAChB+Q,EAAS6I,EAA4BjW,IAGlCoN,CACV,CARD,CAnDwDzJ,GACxC,MACJ,QACIyJ,EAAOX,KAAP,wBAAA7M,OAAoCiO,EAApC,wEACAvR,EAASmW,EAA8B9O,GAKnD,OAAOrH,EAAOD,OAAS,EAAIC,EAAO,GAAKqH,EAAO,EACjD,CA2BD,SAAS8O,EAA8BzS,GACnC,OAAOA,EAAO,EACjB,CA8ED,OA5BAA,EAAW,CACPg3J,+BAvkBJ,SAAwCh3J,EAAMoN,GAC1C,IAAIzJ,EAAWkK,EAAmB7N,IAAS0O,EAAmB1O,GACxDiN,EAAgB3I,EAAatE,EAAMoN,EAAW6K,IAChD3b,EAAS,GAERqH,KACDA,EAAWQ,EAAW2+J,sBAAsB9iK,YAIjC2D,EAAS4hB,MAEpBza,EAAmB9K,EAAM2D,IAGxBsJ,GAA2C,IAAzBA,EAAc5Q,SAEjCsH,IAGArH,EAAS0S,EAFT1S,EAASE,MAAMojB,KAAK3S,GAEoB9Q,EAAmBwH,GAC3DrH,EAAS0S,EAAuB1S,EAAQyW,EAAoBpP,GAC5DrH,EAAS0S,EAAuB1S,EAAQyZ,EAAwBpS,GAC1D3D,IAAS9D,EAAAs0B,EAAA3B,OAAqBhhB,EAAmB7N,KACnD1D,EAAS0S,EAAuB1S,EAAQoZ,EAAmB/R,IAE/DrH,EAAS0S,EAAuB1S,EAAQ4Z,EAA4BvS,GACpErH,EAAS0S,EAAuB1S,EAAQ4c,EAAiCvV,GACzErH,EAAS0S,EAAuB1S,EAAQ6Z,EAAoBxS,IAG1C,IAAlBrH,EAAOD,OACPqH,EAAS4T,EAAmBtX,EAAMiN,IAAA,GAE9B3Q,EAAOD,OAAS,EAChBqH,EAAS4T,EAAmBtX,EAAM1D,IAElCoH,EAASpH,EAAO,IAG3B,EAgiBGy6J,SA1hBJ,SAAkB/2J,GACd,GAAKA,EAAL,CAEA,IAAMoN,EAAYpN,EAAM/B,KACxB,IA6IkC3B,EA7IA8Q,KA8IjBlR,EAAAs0B,EAAA3B,OAAmBvyB,IAASJ,EAAAs0B,EAAAi7C,OAAmBnvE,IAASJ,EAAAs0B,EAAAmmG,MAAkBr6H,IAASJ,EAAAs0B,EAAA07H,MA9IpG,CA6IJ,IAAsC5vJ,EA6W5BuR,EAxfFX,EAAWlN,EAAM2nI,WAAW1vH,GAC3BtU,EAAOuJ,KACRvJ,EAAOuJ,GAwfJ,CACHoP,MAAO,CACHolJ,KAAM,GACNE,kBALF/zJ,EAAoBZ,EAASmK,MAAMskH,UAAUoF,gDAM3Cp8H,QAAS,MAEb6X,MAAO,CACHmlJ,KAAM,GACNE,kBAAA/zJ,EACAnJ,QAAS,MAEbqf,KAAM,CACF29I,KAAM,GACNE,kBAAA/zJ,EACAnJ,QAAS,MAEbq+J,MAAO,CACHrB,KAAM,GACNE,kBAAA/zJ,EACAnJ,QAAS,QAvgBjB,IADA,IAAMsJ,EAAcrK,EAAOuJ,GAAUE,GAAWs0J,KACvCj+J,EAAI,EAAGU,EAAM6J,EAAY3R,OAAQoH,EAAIU,IAAOV,EAEjD,GAAI4hB,EAAcrX,EAAYvK,GAAIzD,GAC9B,OAIRgO,EAAY+S,KAAK/gB,EAfmC,CAHlC,CAmBrB,EAugBGgjK,aAAA1+J,EACA4yJ,mBAAApzJ,EACAm/J,eAzeJ,SAAwBjjK,GACpB,IAAKA,EACD,OAAO,EAEX,IAAMoN,EAAOpN,EAAM/B,KACbgP,EAAKjN,EAAM2nI,WAAW1vH,GAE5B,OAAQtU,EAAOsJ,IAAOtJ,EAAOsJ,GAAIG,IAASiY,EAAc1hB,EAAOsJ,GAAIG,GAAM1I,QAAS1E,EACrF,EAkeGkjK,SAAAx/J,EACAy/J,mBAAA7rJ,EACA8rJ,mBAAAt4J,EACAu4J,mBAAA30J,EACA40J,4BAAArtJ,EACAstJ,+BAAAtqJ,EACAuqJ,yBAAAnrJ,EACAorJ,cAAAp+I,EACAq+I,cAvQJ,SAAuB1jK,EAAUoN,GAA8B,IAAvBzJ,EAAuBrF,UAAAjC,OAAA,YAAAiC,UAAA,IAAAA,UAAA,GAC3D,IACI,IAAI2O,GAAA,EAGJ,GAAKjN,EAASwvB,MAKT,GAAIxvB,EAASwvB,gBAAgB9yB,OAC9BuQ,EAAYG,EAAMoiB,KAAKU,MAAMlwB,EAASwvB,WAIrC,GAAmB,KAAfpiB,EAAMoiB,KAAa,CACxB,IAAMlzB,EAAyBgpD,KAAetlD,EAASwvB,MACnDlzB,IACA2Q,GAAA,EAAYgzC,GAAAsiH,gBAAen1J,EAAMoiB,KAAMlzB,GAAwBD,OAAS,EAE/E,OAdG4Q,GAAA,EAgBJ,IAAMY,OAAA,IAAc7N,EAASqc,OAA4C,OAAnBrc,EAASqc,OAAoBjP,EAAMiP,QAAUrc,EAASqc,MACtGnP,GAAkBlN,EAASkiK,WAAcliK,EAASkiK,YAAc90J,EAAM80J,UACtEl0J,GAAahO,EAAS8hK,QAAU10J,EAAMy0J,MAAMxqJ,QAAO,SAAUjK,GAC/D,OAAOA,IAASpN,EAAS8hK,IAC5B,IAAE,GACCr+J,GAAsBzD,EAAS+hK,iBAAmB30J,EAAM20J,cAAc1qJ,QAAO,SAAUjK,GACvF,OAAOA,IAASpN,EAAS+hK,aAC5B,IAAE,GACC59J,GAAkCnE,EAASgiK,6BAA+B50J,EAAM40J,0BAA0B3qJ,QAAO,SAAUjK,GAC3H,OAAOA,IAASpN,EAASgiK,yBAC5B,IAAE,GAGH,OAAQ/0J,GAAaY,GAAcX,IAAmBc,GAAcZ,EAAMnP,OAAS/B,EAAAs0B,EAAA3B,OAAmBlrB,IAAmBF,GAAsBU,CAIlJ,CAHC,MAAOnE,GACL,OAAO,CAEV,CACJ,EAgOG2jK,kBAAAxnK,EACAynK,mBAAA7wJ,EACA8wJ,uBAAA9tJ,EACA+tJ,kBAAApuJ,EACAquJ,2BAAA7tJ,EACA8tJ,gCAAA9qJ,EACA+qJ,yBAraJ,WACI9/J,EAAW89J,sBAAsB/lK,EAAAs0B,EAAAmmG,KAAgB,KACpD,EAoaG4gB,UA3XJ,SAAmBv3I,GACVA,IAEDA,EAAOkkK,aACP//J,EAAanE,EAAOkkK,YAGpBlkK,EAAOo5G,WACPnsG,EAAWjN,EAAOo5G,UAGlBp5G,EAAOsgK,wBACPpzJ,EAAwBlN,EAAOsgK,uBAEtC,EA8WGtxH,MAAA54B,GAtmBAhJ,GAAA,EAAS/J,EAAAmtB,GAAMnsB,GAAS80H,cAAcK,UAAUx5H,GAChDoW,IA0mBGpW,CACV,CAEDkgD,GAAgBy5E,sBAAwB,kBACxC,IAAM51E,GAAU5/C,EAAAqsB,EAAAopG,oBAAiC15E,IACjD/7C,EAAAqsB,EAAA2pG,uBAAoCj6E,GAAgBy5E,sBAAuB51E,IAC3E,IAAA1D,GAAA0D,GCpoBME,GAAgBtQ,IAEhBwwH,GACF,SAAAnkK,EAAYoN,EAAWzJ,IAAA,SAAA3D,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAA3oD,GACjCsW,KAAKlQ,KAAO,CACRg+J,SAAUh3J,GAAa,KACvBi3J,YAAa1gK,GAAgBsgD,IAEjC3tC,KAAKgpE,SAAW,EACnB,EAGL,SAASp7B,KACL,IAAIlkD,EACAoN,EACAzJ,EACAsJ,EAEE3Q,EAAUga,KAAK9V,QACftE,EAAcmoB,GAAY/nB,GAAS68H,cAqBzC,SAAStrH,EAAgB7N,EAAMoN,EAAOzJ,GAClC,IAAMsJ,EAAWC,EAAsBvJ,GAElC3D,EAAKoN,GAGDlR,EAAY8vJ,SAAS/+I,EAAUjN,EAAKoN,GAAOhH,KAAKg+J,YACjDpkK,EAAKoN,GAAOhH,KAAKg+J,SAAWn3J,EAC5BjN,EAAKoN,GAAOhH,KAAKi+J,YAAcpgH,IAJnCjkD,EAAKoN,GAAS,IAAI+2J,GAAKl3J,EAO9B,CAqCD,SAASC,EAAsBlN,GAC3B,IAAIoN,EAAiBzJ,EAAQusJ,uBAAuBlwJ,GAC9C1D,EAAsB2Q,EAA0BsuJ,8BAA8BnuJ,GAMpF,OAJI9Q,GAAuBA,EAAoBD,OAAS,IACpD+Q,EAAiBA,EAAexN,OAAOtD,IAGpC8Q,CACV,CAMD,SAASY,EAAKhO,EAAU2D,GACpB,IAAMsJ,EAAStJ,GAAQyJ,EAEvBpN,EAASiN,EAAO7G,MAEZ6G,EAAOqyE,UACPryE,EAAOqyE,SAAS51E,SAAQ,SAAA0D,GAAK,OAAIY,EAAKhO,EAAUoN,EAAnB,GAEpC,CAgBD,SAAS3J,IACL2J,EAAO,IAAI+2J,EACd,CA8BD,OAXAnkK,EAAW,CACPgvC,MAAAvrC,EACAg+B,OA3BJ,SAAgBzhC,IAtEhB,SAA2CA,IAnB3C,WACI,IAAK2D,IAAYA,EAAQ1G,eAAe,4BAA8B0G,EAAQ1G,eAAe,iCACzF,MAAM,IAAIuQ,MAAM,iDAEvB,CAJD,GAsBI,IAAMP,EAAWC,EAAsBlN,GAElC9D,EAAY8vJ,SAAS/+I,EAAUG,EAAKhH,KAAKg+J,YAC1Ch3J,EAAKhH,KAAKg+J,SAAWn3J,EACrBG,EAAKhH,KAAKi+J,YAAcpgH,IAGxBjkD,GAAYA,EAASuoI,gBACrBvoI,EAASuoI,eAAe7+H,SAAQ,SAAC1J,EAAGiN,GAChCY,EAAgBT,EAAKkyE,SAAUryE,EAAIjN,GAE/BA,EAAEwoI,uBACFxoI,EAAEwoI,sBAAsB9+H,SAAQ,SAAC1J,EAAG1D,GAChCuR,EAAgBT,EAAKkyE,SAASryE,GAAIqyE,SAAUhjF,EAAI0D,GAE5CA,EAAEyoI,wBACFzoI,EAAEyoI,uBAAuBx9F,KACrBtnC,EAAQwsJ,iCACVzmJ,SAAQ,SAAC1J,EAAG2D,GACVkK,EACIT,EAAKkyE,SAASryE,GAAIqyE,SAAShjF,GAAIgjF,SAC/B37E,EACA3D,EAEP,GAER,GAER,GAER,CAjCD,CAuEsCA,EACrC,EA0BGskK,WApBJ,SAAoBtkK,GAChB,IAAI2D,EAASyJ,EACPH,EAAQ,CAACtJ,EAAOyC,MAYtB,OAVIpG,GACAA,EAAK0J,SAAQ,SAAA1J,IACT2D,EAASA,EAAO27E,SAASt/E,KAGrBiN,EAAM8T,KAAKpd,EAAOyC,KAEzB,IAGE6G,EAAMoK,QAAO,SAAArX,GAAC,OAAIA,EAAEokK,SAAS/nK,MAAf,GACxB,EAMGkoK,0BAvCJ,SAAmCvkK,GAC/BgO,GAAK,SAACZ,GACGkoB,MAAMloB,EAAKi3J,cACRrkK,IAAoBoN,EAAKg3J,SAASh3J,EAAKi3J,aAAar8B,kBACpD56H,EAAKi3J,YAAcpgH,GAG9B,GACJ,EAgCGszF,UAhIJ,SAAmBv3I,GACXA,EAAOmzG,UACPxvG,EAAU3D,EAAOmzG,SAEjBnzG,EAAOm2E,4BACPlpE,EAA4BjN,EAAOm2E,0BAE1C,EA0HGquF,YAvDJ,SAAqBxkK,GACjB,OAAOkN,EAAsBlN,EAChC,GA/EGyD,IAyIGzD,CACV,CAEDkkD,GAAiBy1E,sBAAwB,mBACzC,IAAAjzE,GAAeviD,EAAAqsB,EAAAyqG,gBAA6B/2E,ICrK5C,SAASY,GAAY9kD,GAGjB,IAEMoN,GAHNpN,EAASA,GAAU,CAAC,GAGe27J,oBA0GnC,MAJW,CACPF,OATJ,SAAgBz7J,GACZ,OAAOA,GA1DX,SAAwBA,GACpB,IAeIoN,EACAzJ,EAJAsJ,EAAc,EACd3Q,EAAe,GACfJ,EAAM,EASV,IAFAyH,EAAO3D,EAAcirC,MArBE,SAAUjrC,EAAGoN,GAChC,IAAIzJ,EAAO3D,EAAE+qJ,YAAc39I,EAAE29I,YAC7B,OAAOz1H,MAAM3xB,GAAQ,EAAIA,CAC5B,IAkByC0T,QAhBhB,SAAUrX,EAASoN,EAAKzJ,GAC9C,OAAQyJ,GACHzJ,EAAI,GAAGonJ,aAAe/qJ,EAAQ+qJ,aAC9BpnJ,EAAI,GAAGonJ,cAAgB/qJ,EAAQ+qJ,WAEvC,KAaQ1uJ,OA6BL,OA5BIsH,EAAKtH,OAAS,IAQdsH,EAAK+F,SAAQ,SAAA1J,GACTiN,GAAejN,EAAQgrJ,UACvB1uJ,EAAaykB,KAAK9T,EACrB,IAGDG,EAAKwB,KAAK2Q,MAAM3Q,KAAKyhE,UAAYpjE,EAAc,IAG/C3Q,EAAaykH,OAAM,SAAC/gH,EAAO2D,GAGvB,OAFAzH,EAAMyH,IAEFyJ,EAAKpN,EAKZ,KAGE2D,EAAKzH,EAEnB,CAvDD,EAlCQyH,EAAoB,GA8FhB3D,EA/DIqX,QAlBkB,SAAUrX,GACpC,OAAIoN,EAAoB8mF,SAASl0F,EAAQgoI,mBAIjChoI,EAAQ+qJ,aACRpnJ,EAAkBod,KAAK/gB,EAAQ+qJ,cAAA,EAU1C,IAEyC1zI,QA7Bb,SAAUrX,GACnC,OAAI2D,EAAkBtH,SACb2D,EAAG+qJ,cACgD,IAA/CpnJ,EAAkB8E,QAAQzI,EAAG+qJ,YAM7C,MAZL,IACQpnJ,CAiGP,EAOJ,CAEDmhD,GAAY60E,sBAAwB,cACpC,IAAA31E,GAAe7/C,EAAAqsB,EAAAyqG,gBAA6Bn2E,IClH5C,SAAS2B,GAAczmD,GAGnB,IAEMoN,GAHNpN,EAASA,GAAU,CAAC,GAGe27J,oBAqBnC,MAJW,CACPF,OAhBJ,SAAgBz7J,GACZ,IACI2D,EADAsJ,EAAQ,EAWZ,OARIjN,GAAYA,EAAS4sB,MAAK,SAAC5sB,EAAS2D,GAGpC,OAFAsJ,EAAQtJ,GAECyJ,EAAoB8mF,SAASl0F,EAAQgoI,gBACjD,MACGrkI,EAAkB3D,EAASiN,IAGxBtJ,CACV,EAOJ,CAED8iD,GAAckzE,sBAAwB,gBACtC,IAAAxzE,GAAehiD,EAAAqsB,EAAAyqG,gBAA6Bx0E,IC7B5C,SAASP,KAEL,IACIlmD,EACAoN,EACAzJ,EAHEsJ,EAAUqJ,KAAK9V,QAuCrB,SAASlE,IAGL,IAHwE,IAArC0D,EAAqC1B,UAAAjC,OAAA,YAAAiC,UAAA,GAAAA,UAAA,GAAnB,GAAI8O,EAAe9O,UAAAjC,OAAA,YAAAiC,UAAA,GAAAA,UAAA,GAAJ,GAChE2O,EAAI,EACJ3Q,EAAgBq3C,IAFoDz3C,EAAA,WAIpE,IAAMA,EAAO8D,EAAgBiN,GACvBY,EAAMT,EAASsuJ,WAAU,SAAC17J,GAC5B,OAAOA,EAAKgoI,iBAAmBhoI,EAAKgoI,kBAAoB9rI,CAC3D,IACD,IAAa,IAAT2R,IAAelK,EAAoBuwF,SAAS9mF,EAASS,GAAKm6H,iBAE1D,OADA1rI,EAAgBuR,EAChB,QAEJZ,GAAK,CAZ+D,EAGjEA,EAAIjN,EAAgB3D,QAAQ,UAAAH,MAWnC,OAAOI,CACV,CASD,OAPA0D,EAAW,CACPykK,mBAvCJ,SAA4BzkK,GACxB,IAAI2D,EAAgBgwC,IAGpB,GAAIre,MAAMt1B,EAAKqkK,aAAc,CACzB,IAAMp3J,EAAsBG,EAA0BiuJ,8BAClDpuJ,GAAuBA,EAAoBw+I,4BAA4BpvJ,OAAS,IAChFsH,EAAgBrH,EAA8B2Q,EAAoBw+I,4BAA6BzrJ,EAAKokK,UAE3G,CAGD,IAAMloK,EAA8BkR,EAA0B+tJ,iCAM9D,OALIn7J,EAAKokK,UAAYpkK,EAAKokK,SAAS/nK,QAAUH,GACzCA,EAA4B80E,iBAAmB90E,EAA4B80E,gBAAgB30E,SAC3FsH,EAAgBrH,EAA8BJ,EAA4B80E,gBAAiBhxE,EAAKokK,WAG7FzgK,CACV,EAqBG4zI,UAjDJ,SAAmBv3I,GACXA,EAAO27J,sBACPh4J,EAAsB3D,EAAO27J,qBAE7B37J,EAAOm2E,4BACP/oE,EAA4BpN,EAAOm2E,0BAE1C,GAVG/oE,EAA4BmoB,GAA0BtoB,GAASksH,cAyD5Dn5H,CACV,CAEDkmD,GAAwByzE,sBAAwB,0BAChD,IAAAv5E,GAAej8C,EAAAqsB,EAAAyqG,gBAA6B/0E,IC5D5C,SAASP,KAEL,IAII3lD,EACAoN,EACAzJ,EACAsJ,EACA3Q,EACAJ,EATE2R,EAAUyI,KAAK9V,QACf0M,GAAA,EAAWc,EAAAwiB,GAAS3iB,GAASsrH,cAC7Bh1H,GAAA,EAAW+U,EAAAsX,GAAS3iB,GAASsrH,cAqFnC,SAAS91H,IACL+J,EAAmC4hC,OACtC,CAWD,OATAhvC,EAAW,CACP0kK,eAlDJ,SAAwB1kK,IAAA,EACpBsgB,EAAAqkJ,IAAmB3kK,EAAO,WAC1B9D,EAAW8D,EAAQiN,EAActJ,CACpC,EAgDG83J,OA9CJ,SAAgBz7J,GACZ,GAAKA,EAAL,CAKA,GAAGmE,EAASiT,MAAMskH,UAAUQ,qBAAsB,CAC9C,IAAM9uH,EAAgB9Q,EAAwBmoK,mBAAmBzkK,GAC5Ds1B,MAAMloB,KAAqC,IAAnBA,IACzBpN,EAAKqkK,YAAcj3J,EAE1B,CAKD,IAAKkoB,MAAMt1B,EAAKqkK,aACZ,OAAOrkK,EAAKokK,SAASpkK,EAAKqkK,aAG9B,IAAIp3J,EAAkB/Q,EAASu/J,OAAOz7J,EAAKokK,UAE3C,OAAKn3J,GAaLjN,EAAKqkK,YAAcrkK,EAAKokK,SAAS37J,QAAQwE,GAElCA,IAdHC,EAASynB,QAAQlxB,EAAA+sB,EAAA22G,sBAA8B,CAC3C37H,MAAO,IAAIwD,EAAAwhB,EACPta,EAAA6kI,yCACA7kI,EAAAqmI,oDAGJrgJ,IAAayH,GACbN,KA3BP,CAmCJ,EASG2rC,MAAO3rC,EACPk0I,UA9DJ,SAAmBv3I,GACXA,EAAOigH,WACP/jH,EAAW8D,EAAOigH,UAElBjgH,EAAO4kK,0BACPtoK,EAA0B0D,EAAO4kK,wBAExC,GA5BGx3J,EAAqCwkB,GAAoB/jB,GAASjN,OAAO,CACrEy1J,gBAAiB5yJ,EAAA+sB,EAAA+1G,4CACjB+vB,sBAAuB7yJ,EAAA+sB,EAAA81G,0CAG3B3iI,EAAgBwiD,GAAct4C,GAASjN,OAAO,CAC1C+6J,oBAAqBvuJ,IAGzBH,EAAc+2C,GAAYn2C,GAASjN,OAAO,CACtC+6J,oBAAqBvuJ,KAGzB9Q,EAA0B8jD,GAAwBvyC,GAASjN,UACnC22I,UAAU,CAC9BokB,oBAAqBvuJ,IAGzBlR,EAAWyH,EAsER3D,CACV,CAED2lD,GAAgBg0E,sBAAwB,kBACxC,IAAAp0E,GAAephD,EAAAqsB,EAAAyqG,gBAA6Bt1E,IC7G5C,SAAS7B,KAEL,IAAI9jD,EACAoN,EAMAzJ,EACAsJ,EACA3Q,EANEJ,EAAUoa,KAAK9V,QACfqN,GAAA,EAAWG,EAAAwiB,GAASt0B,GAASi9H,cAC7BjsH,GAAA,EAAWqT,EAAAiQ,GAASt0B,GAASi9H,cAmCnC,SAASh1H,EAAOnE,GACZ2D,EAAiB89B,OAAOzhC,GACxBiN,EAAgBy3J,eAAet3J,EAAQy3J,SAAS7kK,IAChD6N,EAAS8mB,QAAQtwB,EAAAmsB,EAAAs0I,kBAAqC,CAClDV,SAAU/gK,EAAYrD,IAE7B,CAmCD,SAASqD,EAAYrD,GACjB,OAAO2D,EAAiB6gK,YAAYxkK,EACvC,CAwBD,OAXAA,EAAW,CACPgvC,MArBJ,WACIrrC,EAAiBqrC,QACjB/hC,EAAgB+hC,OACnB,EAmBGq7F,WAbJ,SAAoBrqI,GAGhB2D,EAAiB4zI,UAAU,CACvBpkC,QAAA/lG,EACA+oE,0BAAA75E,IAGJ6H,EAAOnE,EACV,EAKGgG,QAnDJ,SAAiBhG,GACb,IAEMoN,EAFWzJ,EAAiB2gK,WAAWtkK,GAEpBktB,QAAO,SAACltB,EAAGoN,GAChC,IAAMzJ,EAAIsJ,EAAgBwuJ,OAAOruJ,GAEjC,OAAIzJ,GACKuJ,EAAS66H,WAAWpkI,EAAEvB,KAIvBpC,EAAEoC,IAAM8K,EAASlH,QAAQrC,EAAEvB,IAAKpC,EAAEoC,MAHlCpC,EAAEoC,IAAMuB,EAAEvB,IACVpC,EAAEgoI,gBAAkBrkI,EAAEqkI,iBAI1BhoI,EAAEi0I,uBAAyBtwI,EAAEswI,uBAC7Bj0I,EAAEmpI,yBAA2BxlI,EAAEwlI,yBAC/BnpI,EAAEioI,YAActkI,EAAEskI,YAKfjoI,GAHI,IAAIgjB,EAIlB,GAAE,IAAIA,IAEP,IAAK9V,EAAS66H,WAAW36H,EAAQhL,KAC7B,OAAOgL,CAEd,EA0BGmqI,UA9EJ,SAAmBv3I,GACXA,EAAO+kK,mBACPphK,EAAmB3D,EAAO+kK,kBAG1B/kK,EAAOglK,kBACP/3J,EAAkBjN,EAAOglK,iBAGzBhlK,EAAOmzG,UACP/lG,EAAUpN,EAAOmzG,SAGjBnzG,EAAOm2E,4BACP75E,EAA4B0D,EAAOm2E,0BAE1C,EA+DGquF,YAAAnhK,EACAo+B,OAAAt9B,GAtFAR,EAAmB+iD,GAAiBxqD,GAAS0E,SAC7CqM,EAAkBs4C,GAAgBrpD,GAAS0E,SAE3CiN,EAASukB,GAAG3uB,EAAA+sB,EAAA+1G,6CARhB,SAA4BvmI,GACxB2D,EAAiB4gK,0BAA0BvkK,EAAEo1J,MAChD,GAMuFp1J,GAwFjFA,CACV,CAED8jD,GAAkB61E,sBAAwB,oBAC1C,IAAAhzE,GAAexiD,EAAAqsB,EAAAyqG,gBAA6Bn3E,IAAA,SAAA4J,GAAA1tD,GAAA,OAAA0tD,GAAA,mBAAAnqD,QAAA,iBAAAA,OAAA85E,SAAA,SAAAr9E,GAAA,cAAAA,CAAA,WAAAA,GAAA,OAAAA,GAAA,mBAAAuD,QAAAvD,EAAA5D,cAAAmH,QAAAvD,IAAAuD,OAAAxG,UAAA,gBAAAiD,CAAA,EAAA0tD,GAAA1tD,EAAA,UAAA4nD,GAAA5nD,EAAAoN,GAAA,OAAAw6C,GAAA9qD,OAAA4nI,gBAAA,SAAA1kI,EAAAoN,GAAA,OAAApN,EAAA8oD,UAAA17C,EAAApN,CAAA,EAAA4nD,GAAA5nD,EAAAoN,EAAA,UAAA66C,GAAAjoD,EAAAoN,GAAA,OAAAA,GAAA,WAAAsgD,GAAAtgD,IAAA,mBAAAA,EAAA,SAAApN,GAAA,YAAAA,EAAA,UAAAwxC,eAAA,oEAAAxxC,CAAA,EAAAA,GAAAoN,CAAA,UAAAu8C,GAAA3pD,GAAA,OAAA2pD,GAAA7sD,OAAA4nI,eAAA5nI,OAAAuC,eAAA,SAAAW,GAAA,OAAAA,EAAA8oD,WAAAhsD,OAAAuC,eAAAW,EAAA,EAAA2pD,GAAA3pD,EAAA,KC1G5CupD,GAVM,SAAAvpD,IAAA,SAAAA,EAAAoN,GAAA,sBAAAA,GAAA,OAAAA,EAAA,UAAAu7C,UAAA,sDAAA3oD,EAAAjD,UAAAD,OAAA8D,OAAAwM,GAAAA,EAAArQ,UAAA,CAAAX,YAAA,CAAA0L,MAAA9H,EAAAo7H,UAAA,EAAAt9C,cAAA,KAAA1wE,GAAAw6C,GAAA5nD,EAAAoN,EAAA,EAAA9Q,EAAA0D,GAAA,IAAAoN,EAAAzJ,EAAAsJ,GAAAG,EAAA9Q,EAAAqH,EAAA,kCAAA45E,UAAAA,QAAAC,UAAA,YAAAD,QAAAC,UAAAmnD,KAAA,+BAAAC,MAAA,oBAAA9nB,QAAA//G,UAAAF,QAAAK,KAAAqgF,QAAAC,UAAAs/B,QAAA,6BAAA98G,GAAA,4BAAAA,EAAAiN,EAAA08C,GAAAv8C,GAAA,GAAAzJ,EAAA,KAAArH,EAAAqtD,GAAA,MAAAvtD,YAAA4D,EAAAu9E,QAAAC,UAAAvwE,EAAA3O,UAAAhC,EAAA,MAAA0D,EAAAiN,EAAAyU,MAAA,KAAApjB,WAAA,OAAA2pD,GAAA,KAAAjoD,EAAA,GACF,SAAA1D,EAAY0D,EAAKoN,GAAM,IAAAzJ,EAAA,gBAAA3D,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,2CAAArsD,IACnBqH,EAAAsJ,EAAA/P,KAAA,OACKkF,IAAMpC,GAAO,KAClB2D,EAAK1F,KAAOmP,GAAQ,KACpBzJ,EAAK42H,UAAYr+H,EAAAs0B,EAAAy0I,OACjBthK,EAAK4C,aAAe,GALD5C,CAMtB,QAAArH,CAAA,CAPC,CAAoBwH,EAAA0sB,GCE1B,SAASi5B,GAAYzpD,GAEjBA,EAASA,GAAU,CAAC,EACpB,IAEMoN,EAAUkJ,KAAK9V,QACfmD,GAAA,EAAWqK,EAAAwiB,GAASpjB,GAAS+rH,cAE/BlsH,EAAYygB,GAAUtgB,GAASxM,OAAO,CACtCy9I,WAAYr+I,EAAOq+I,WACnB/J,YAAat0I,EAAOs0I,YACpBsM,iBAAkB5gJ,EAAO4gJ,iBACzBmG,gBAAiB/mJ,EAAO+mJ,gBACxB7iB,OAAQhuH,IAmDZ,MALW,CACP8c,KA1CJ,SAAchzB,EAAKoN,EAAS9Q,GACxB,IAAMJ,EAAS,SAAU+Q,EAAS/Q,GAC9BkR,EAAQgyB,UAAA,EACRhyB,EAAQ83J,gBAAkBj4J,GAAoB,KAE9CtJ,EAASgxB,QAAQlxB,EAAA+sB,EAAA82G,qBAA6B,CAC1C9xC,QAASpoF,EACT+3J,cAAe7oK,EACfkP,MAAOyB,GAAW/Q,EACd,KACA,IAAI8S,EAAAwhB,EACAta,EAAAwkI,wCACAxkI,EAAA+lI,2CAAoDj8I,IAGnE,EAED,GAhCoB,uCAgChBA,EACA9D,EAAO,MAAM,OACV,CACH,IAAM2R,EAAU,IAAI07C,GAAYvpD,EAAKmW,EAAAD,EAAAwrH,sBAErCz0H,EAAU+lB,KAAK,CACXtyB,QAASmN,EACT6gD,QAAS,SAAU1uD,GACf9D,EAAO8D,EACV,EACDwL,MAAO,WACHtP,EAAO,KACV,GAER,CACJ,EAWG8yC,MATJ,WACQ/hC,IACAA,EAAU7C,QACV6C,EAAY,KAEnB,EAQJ,CAEDw8C,GAAYkwE,sBAAwB,cACpC,IAAAnxE,GAAerkD,EAAAqsB,EAAAyqG,gBAA6BxxE,IC0f5ChB,GA1kBA,SAAczoD,GA4DV,SAASoN,EAAkBpN,GACvB,IAAIoN,EAAgBpN,EAAKolK,UAKzB,OAJoB,MAAjBh4J,IACCA,EAAgBpN,EAAKqlK,UACL,MAAjBj4J,GAAwC,IAAfA,IACxBA,EAAgBpN,EAAK4/D,UAClBxyD,CACV,CAMD,SAASzJ,EAAe3D,GACpB,MAAkB,iBAARA,EACCA,EAAIwC,QAAQ,KAAM,SAASA,QAAQ,KAAM,QAAQA,QAAQ,KAAM,QAAQA,QAAQ,KAAM,UAAUA,QAAQ,KAAM,UAE7GxC,CACd,CAMD,SAASiN,EAA2BjN,EAAqBoN,EAAKzJ,EAAMsJ,GAEhE,IADA,IAAI3Q,EAAM,EACJA,EAAM0D,EAAoB3D,OAAQC,IAAO,CAC3C,IAAIJ,EAAa8D,EAAoB1D,GACrC,GAA0B,iBAAfJ,GACP,GAAGA,GAAc+Q,EACb,WAGR,GAAI/Q,aAAsBQ,QACtB,GAAGR,EAAW2F,KAAKoL,GACf,WAGR,GAA0B,mBAAf/Q,GACJA,EAAWkR,EAAKzJ,EAAMsJ,GACrB,KAEX,CACD,OAAO3Q,GAAK0D,EAAoB3D,MACnC,CAED,SAASC,EAAkB8Q,EAAKzJ,EAAWrH,GAE9B,aADF0D,EAAOslK,kBAEDl4J,EAAIzJ,aAAsBnH,MAG3B4Q,EAAIzJ,EAAU,YAAcyJ,EAAIzJ,GAFhCyJ,EAAIzJ,EAAU,YAAc,CAACyJ,EAAIzJ,OAQxCyJ,EAAIzJ,aAAsBnH,QAAUwD,EAAOulK,qBAAqBlpK,OAAS,GACvE4Q,EAA2BjN,EAAOulK,qBAAsBn4J,EAAKzJ,EAAWrH,KACvE8Q,EAAIzJ,GAAa,CAACyJ,EAAIzJ,IAGjC,CAED,SAASzH,EAAgB8D,GAGrB,IAAIoN,EAAOpN,EAAKqO,MAAM,YAElB1K,EAAI,IAAIkU,KAAKzK,EAAK,GAAIA,EAAK,GAAG,EAAGA,EAAK,IACtCH,EAAaG,EAAK,GAAGiB,MAAM,KAM/B,GALA1K,EAAE6hK,SAASp4J,EAAK,GAAIA,EAAK,GAAIH,EAAW,IACrCA,EAAW5Q,OAAO,GACjBsH,EAAE8hK,gBAAgBx4J,EAAW,IAG9BG,EAAK,IAAMA,EAAK,GAAI,CACnB,IAAI9Q,EAA0B,GAAV8Q,EAAK,GAAUoB,OAAOpB,EAAK,IAI/C9Q,EAAgB,GAAa,MAHlB,kBAAkBuF,KAAK7B,GAAO,IAAM,MAGZ,EAAI1D,EAAgBA,GAGvDqH,EAAE+hK,WAAW/hK,EAAEgiK,aAAerpK,EAAgBqH,EAAEiiK,oBACnD,MAE8C,IAAxC5lK,EAAKyI,QAAQ,IAAKzI,EAAK3D,OAAS,KAC/BsH,EAAI,IAAIkU,KAAKA,KAAKgtI,IAAIlhJ,EAAEkiK,cAAeliK,EAAEmiK,WAAYniK,EAAE64G,UAAW74G,EAAEoiK,WAAYpiK,EAAEgiK,aAAchiK,EAAEqiK,aAAcriK,EAAEsiK,qBAI1H,OAAOtiK,CACV,CAeD,SAASkK,EAAuBT,EAAKzJ,EAAWrH,EAAWJ,GACvD,QAxHmB,GAwHfyH,GAA0C3D,EAAOkmK,kBAAkB7pK,OAAS,IACrE4Q,EAA2BjN,EAAOkmK,kBAAmB94J,EAAK9Q,EAAWJ,EAInF,CAED,SAASgR,EAAkBvJ,EAAMqK,GAC7B,GA5HoB,GA4HjBrK,EAAKy8E,SAAwC,CAI5C,IAHA,IAAI38E,EAAS,IAAI3G,OACbqH,EAAeR,EAAKme,WAEhBze,EAAK,EAAGA,EAAMc,EAAa9H,OAAQgH,IApI5B,IAqIPe,EAAQD,EAAad,IAChB+8E,WACDpgF,EAAOmmK,WACP1iK,EAASyJ,EAAiB9I,IAE1BX,EAAS,CAAC,GACNa,EAAY8I,EAAiBhJ,IACb8I,EAAiB9I,IAIjD,OAAOX,CACV,CAED,GAnJmB,GAmJhBE,EAAKy8E,SAAuC,EACvC38E,EAAS,IAAI3G,QACVspK,MAAM,EAEb,IAAI/hK,EAAW,GAIf,IAHIF,EAAeR,EAAKme,WAGhBze,EAAK,EAAGA,EAAMc,EAAa9H,OAAQgH,IAAQ,CAC/C,IAAIe,EACAE,EAAY8I,EADZhJ,EAAQD,EAAad,IAGzB,GA5JU,GA4JPe,EAAMg8E,SAAsC,CAC3C,IAAIt8E,EAAYkK,EAAK,IAAI1J,EACzB,GAAIuJ,EAAuBpK,EAAOW,EAAMg8E,SAAS97E,EAAUR,GAEvD,GADAL,EAAO2iK,QACiB,MAArB3iK,EAAOa,GAAoB,CAC1B,IAAIZ,EAAIwJ,EAAiB9I,EAAON,IACf,SAAbQ,GAAwB,QAAQzC,KAAK6B,OACjCoH,EAAI,CAAC,GACPxG,GAAaZ,EACfW,EAAS0c,KAAKjW,IAElBrH,EAAOa,GAAaZ,EACpBpH,EAAkBmH,EAAQa,EAAWR,EACxC,KACI,CAQD,IAEQgH,EATgB,MAArBrH,EAAOa,KACAb,EAAOa,aAAsB9H,QAC/BiH,EAAOa,GAAa,CAACb,EAAOa,IAC5BhI,EAAkBmH,EAAQa,EAAWR,KAIzCJ,EAAIwJ,EAAiB9I,EAAON,IACf,SAAbQ,GAAwB,QAAQzC,KAAK6B,OACjCoH,EAAI,CAAC,GACPxG,GAAaZ,EACfW,EAAS0c,KAAMjW,IAElBrH,EAAOa,GAAYb,EAAOa,GAAWjI,QAAUqH,CACnD,CAER,CACJ,CAEDD,EAAO4iK,WAAahiK,EAIpB,IADA,IAAIqK,EAAgBtB,EAAiBzJ,GAC7B0hB,EAAK,EAAGA,EAAM1hB,EAAK2iK,WAAWjqK,OAAQgpB,IAAQ,CAClD,IAAIjP,EAAOzS,EAAK2iK,WAAWjhJ,GAC3B5hB,EAAO2iK,QAGP,IADA,IAAIt3J,EAASsH,EAAKtO,MACVkH,EAAE,EAAG7S,EAAG6D,EAAOumK,SAASlqK,OAAQ2S,EAAI7S,EAAI6S,IAAK,CACjD,IAAI+D,EAAW/S,EAAOumK,SAASv3J,GAC3B+D,EAASlR,KAAKuU,EAAM1H,KACpBI,EAASiE,EAASyzJ,UAAUpwJ,EAAKtO,OACxC,CAEDrE,EAAOzD,EAAOymK,gBAAgBrwJ,EAAKjY,MAAM2Q,CAC5C,CAGD,IAAIiH,EAjMZ,SAAuB/V,GACnB,OAAOA,EAAK0mK,MACf,CAFD,CAiMuC/iK,GAoD/B,OAnDe,MAAZoS,GAAgC,IAAZA,IACnBtS,EAAO2iK,QACP3iK,EAAOkjK,SAAS5wJ,GAGA,MAAjBtS,EAAO,WACNA,EAAO+oJ,OAAS/oJ,EAAO,SACpBA,EAAO+oJ,kBAAkBhwJ,QACxBiH,EAAO+oJ,OAAS/oJ,EAAO+oJ,OAAOj+I,KAAK,OAIpCvO,EAAO4mK,mBACNnjK,EAAO+oJ,OAAS/oJ,EAAO+oJ,OAAOn/I,eAC3B5J,EAAO,SACa,YAAxBzD,EAAOslK,wBACC7hK,EAAO,iBAClBA,EAAO+oJ,OA5HnB,SAAmCp/I,EAAOzJ,EAAWrH,GACjD,GAAG0D,EAAO6mK,wBAAwBxqK,OAAS,EAAG,CAC1C,IAAIwR,EAAOvR,EAAS+R,MAAM,MAAO,GACjC,OAAGpB,EAA2BjN,EAAO6mK,wBAAyBz5J,EAAOzJ,EAAWkK,GACrE3R,EAAgBkR,GAGhBA,CACd,CAEG,OAAOA,CACd,CAXD,CA4HsD3J,EAAO+oJ,OAAQloJ,EAAW0J,EAAK,IAAI1J,IAEpD,MAA1Bb,EAAO,oBACNA,EAAOgsJ,QAAUhsJ,EAAO,yBACjBA,EAAO,kBACa,YAAxBzD,EAAOslK,wBACC7hK,EAAO,2BAGF,GAAhBA,EAAO2iK,OAAoC,QAAtBpmK,EAAO8mK,cAC5BrjK,EAAS,GAGO,GAAhBA,EAAO2iK,OAA6B,MAAf3iK,EAAO+oJ,OAC5B/oJ,EAASA,EAAO+oJ,OAGA,GAAhB/oJ,EAAO2iK,OAA8B,MAAhB3iK,EAAOgsJ,SAAkBzvJ,EAAO+mK,UAIpDtjK,EAAO2iK,MAAQ,GAAoB,MAAf3iK,EAAO+oJ,QAAgBxsJ,EAAOgnK,2BAC9ChnK,EAAO4mK,kBAAmC,IAAfnjK,EAAO+oJ,QAAsC,IAAtB/oJ,EAAO+oJ,OAAOn/I,gBAC1D5J,EAAO+oJ,OALlB/oJ,EAASA,EAAOgsJ,eAQbhsJ,EAAO2iK,OAEVpmK,EAAOinK,oBAAsC,MAAfxjK,EAAO+oJ,QAAgC,MAAhB/oJ,EAAOgsJ,UAC5DhsJ,EAAOzG,SAAW,WACd,OAAqB,MAAbsZ,KAAKk2I,OAAcl2I,KAAKk2I,OAAO,KAAoB,MAAdl2I,KAAKm5I,QAAgBn5I,KAAKm5I,QAAQ,GAClF,GAGEhsJ,CACV,CAED,GA1QmB,GA0QhBE,EAAKy8E,UAzQa,GAyQyBz8E,EAAKy8E,SAC/C,OAAOz8E,EAAKoe,SAEnB,CAED,SAAS/T,EAASZ,EAASH,EAAS3Q,EAAUJ,GAC1C,IAAI2R,EAAY,KAAiB,MAATT,GAAmC,MAAlBA,EAAQu5J,SAAkBv5J,EAAQu5J,SAAS,IAAK,IAAM15J,EAC/F,GAAa,MAAV3Q,EACC,IAAI,IAAI4Q,EAAO,EAAGA,EAAO5Q,EAASD,OAAQ6Q,IAAQ,CAC9C,IAAIc,EAAW1R,EAAS4Q,GACpBzJ,EAAU2J,EAAQY,GACnBhO,EAAOknK,aACNzjK,EAAQE,EAAeF,IAC3BoK,GAAW,IAAIG,EAASoiH,OAAOpwH,EAAOymK,gBAAgBpqK,QAAQ,IAC3D2D,EAAOmnK,gBACNt5J,GAAW,IAAIpK,EAAQ,IAEvBoK,GAAW,IAAIpK,EAAQ,GAC9B,CAML,OADIoK,GAHA3R,EAGW,KAFA,IAIlB,CAED,SAASuH,EAAOzD,EAAQoN,GACpB,MAAO,MAAyB,MAAlBpN,EAAQ2mK,SAAiB3mK,EAAQ2mK,SAAS,IAAK,IAAIv5J,EAAY,GAChF,CAMD,SAASjJ,EAAqBiJ,EAASzJ,GACnC,MAA4B,YAAxB3D,EAAOslK,kBALQhpK,EAKyD,YAJhB,KAD9C2Q,EAKqCtJ,EAAa3G,YAJrDyL,QAAQnM,EAAQ2Q,EAAI5Q,OAASC,EAAOD,UAKqB,GAAzDsH,EAAa3G,WAAWyL,QAAQzI,EAAOymK,kBACA,GAAvC9iK,EAAa3G,WAAWyL,QAAQ,OAC/B2E,EAAQzJ,aAAyB2kD,SARjD,IAAkBr7C,EAAK3Q,CAYtB,CAED,SAAS+G,EAAmBrD,GACxB,IAAIoN,EAAc,EAClB,GAAGpN,aAAmBlD,OAClB,IAAK,IAAI6G,KAAM3D,EACRmE,EAAqBnE,EAAS2D,IAEjCyJ,IAGR,OAAOA,CACV,CAED,SAAS/I,EAA6B+I,EAASzJ,EAAcrH,GACzD,OAA6C,GAAtC0D,EAAOonK,qBAAqB/qK,QACf,IAAbC,GACA2Q,EAA2BjN,EAAOonK,qBAAsBh6J,EAASzJ,EAAcrH,EACzF,CAED,SAAS8H,EAAsBgJ,GAC3B,IAAIzJ,EAAW,GACf,GAAGyJ,aAAmBtQ,OAClB,IAAK,IAAImQ,KAAOG,GACuB,GAAhCH,EAAIjQ,WAAWyL,QAAQ,OAA8D,GAAhDwE,EAAIjQ,WAAWyL,QAAQzI,EAAOymK,kBAClE9iK,EAASod,KAAK9T,GAI1B,OAAOtJ,CACV,CAkBD,SAASW,EAAsB8I,GAC3B,IAAIH,EAAQ,GAaZ,OAXIG,aAAsBtQ,OACtBmQ,GApBR,SAA8BG,GAC1B,IAAIH,EAAQ,GAYZ,OAVuB,MAApBG,EAAWqiJ,UACVxiJ,GAAQ,YAAYG,EAAWqiJ,QAAQ,OAGrB,MAAnBriJ,EAAWo/I,SACPxsJ,EAAOknK,WACNj6J,GAAQtJ,EAAeyJ,EAAWo/I,QAElCv/I,GAAQG,EAAWo/I,QAEpBv/I,CACV,CAdD,CAoBqCG,GAGd,MAAZA,IACIpN,EAAOknK,WACNj6J,GAAQtJ,EAAeyJ,GAEvBH,GAAQG,GAGbH,CACV,CAED,SAASnJ,EAAoB9D,EAAaoN,GACtC,MAAkB,KAAdpN,EACOoN,EAGApN,EAAY,IAAIoN,CAC9B,CAED,SAAS1J,EAAiB1D,EAAaoN,EAAYzJ,EAAUsJ,GACzD,IAAI3Q,EAAS,GACb,GAAyB,GAAtB0D,EAAY3D,OACXC,GAAQ0R,EAAShO,EAAaoN,EAAYzJ,GAAA,QAG1C,IAAI,IAAIzH,EAAQ,EAAGA,EAAQ8D,EAAY3D,OAAQH,IAC3CI,GAAQ0R,EAAShO,EAAY9D,GAAQkR,EAAYhJ,EAAoBpE,EAAY9D,KAAA,GACjFI,GAAQwO,EAAgB9K,EAAY9D,GAAQ4H,EAAoBmJ,EAAYG,IAC5E9Q,GAAQmH,EAAOzD,EAAY9D,GAAOkR,GAG1C,OAAO9Q,CACV,CAED,SAASwO,EAAkB9K,EAASoN,GAChC,IAAIzJ,EAAS,GAIb,GAFkBN,EAAmBrD,GAEpB,EACb,IAAK,IAAIiN,KAAMjN,EAEX,IAAGmE,EAAqBnE,EAASiN,KAAqB,IAAbG,GAAoB/I,EAA6BrE,EAASiN,EAAInJ,EAAoBsJ,EAAYH,KAAvI,CAGA,IAAI3Q,EAAS0D,EAAQiN,GAEjB/Q,EAAWkI,EAAqB9H,GAEvB,MAAVA,GAA4B,MAAVA,EACjBqH,GAAQqK,EAAS1R,EAAQ2Q,EAAI/Q,GAAA,GAG9BI,aAAkBQ,OAEdR,aAAkBE,MACjBmH,GAAQD,EAAgBpH,EAAQ2Q,EAAI/Q,EAAUkR,GAE1C9Q,aAAkBub,MACtBlU,GAAQqK,EAAS1R,EAAQ2Q,EAAI/Q,GAAA,GAC7ByH,GAAQrH,EAAO+qK,cACf1jK,GAAQF,EAAOnH,EAAO2Q,IAGE5J,EAAmB/G,GACpB,GAAoB,MAAfA,EAAOkwJ,QAAgC,MAAhBlwJ,EAAOmzJ,SACtD9rJ,GAAQqK,EAAS1R,EAAQ2Q,EAAI/Q,GAAA,GAC7ByH,GAAQmH,EAAgBxO,EAAQwH,EAAoBsJ,EAAYH,IAChEtJ,GAAQF,EAAOnH,EAAO2Q,IAGtBtJ,GAAQqK,EAAS1R,EAAQ2Q,EAAI/Q,GAAA,IAKrCyH,GAAQqK,EAAS1R,EAAQ2Q,EAAI/Q,GAAA,GAC7ByH,GAAQW,EAAoBhI,GAC5BqH,GAAQF,EAAOnH,EAAO2Q,GAnCd,CAyCpB,OAFAtJ,EAAQW,EAAoBtE,EAG/B,MAnfS,KAKVA,EAASA,GAAU,CAAC,GAKNknK,aACNlnK,EAAOknK,YAAA,QAAa,IAGpBlnK,EAAOymK,kBACPzmK,EAAOymK,gBAAkB,KAG7BzmK,EAAOslK,gBAAkBtlK,EAAOslK,iBAAmB,OACnDtlK,EAAO8mK,cAAgB9mK,EAAO8mK,eAAiB,gBAE5C9mK,EAAOinK,qBACNjnK,EAAOinK,oBAAA,GAEXjnK,EAAOulK,qBAAuBvlK,EAAOulK,sBAAwB,YAC1DvlK,EAAOgnK,2BACNhnK,EAAOgnK,0BAAA,QAA2B,IAEnChnK,EAAO4mK,mBACN5mK,EAAO4mK,kBAAA,GAEX5mK,EAAO6mK,wBAA0B7mK,EAAO6mK,yBAA2B,YAEhE7mK,EAAOmnK,kBACNnnK,EAAOmnK,iBAAA,GAGXnnK,EAAOkmK,kBAAoBlmK,EAAOkmK,mBAAqB,GACvDlmK,EAAOonK,qBAAuBpnK,EAAOonK,sBAAwB,YAE1DpnK,EAAO+mK,YACN/mK,EAAO+mK,WAAA,QAAY,IAGnB/mK,EAAOmmK,aACPnmK,EAAOmmK,YAAA,GAwcf7vJ,KAAKgxJ,eAAiB,SAAStnK,GAC3B,IAIIoN,EAHJ,GADiBpK,OAAOukK,eAAoCvkK,YAAA,IACxDhD,EACA,OAAO,KAGX,GAAIgD,OAAO2e,UAAW,CAClB,IAAIhe,EAAO,IAAIX,OAAO2e,UAEtB,KACIvU,EAASzJ,EAAOie,gBAAiB5hB,EAAW,aAClCwnK,uBAAuB,IAAK,eAAenrK,OAAS,IAC1D+Q,EAAS,KAKhB,CAFD,MAAMpN,GACFoN,EAAS,IACZ,CACJ,MAG+B,GAAzBpN,EAAUyI,QAAQ,QACjBzI,EAAYA,EAAUowH,OAAQpwH,EAAUyI,QAAQ,MAAQ,KAE5D2E,EAAO,IAAIm6J,cAAc,qBAClB3gH,MAAM,QACbx5C,EAAOq6J,QAAQznK,GAEnB,OAAOoN,CACV,EAEDkJ,KAAKoxJ,QAAU,SAAS1nK,GACpB,gBAAIA,GAA8B,MAARA,EACf,GAERA,aAAgBxD,MACRwD,EAEA,CAACA,EACf,EAEDsW,KAAKqxJ,cAAgB,SAAS3nK,GAC1B,OAAGA,aAAc6X,KACN7X,EAAGqnK,cAEI,iBAARrnK,EACC,IAAI6X,KAAK7X,GAAIqnK,cAEb,IACd,EAED/wJ,KAAKsxJ,WAAa,SAAS5nK,GACvB,MAAmB,iBAATA,EACC9D,EAAgB8D,GAGhBA,CACd,EAEDsW,KAAKuxJ,SAAW,SAAU7nK,GACtB,OAAOkN,EAAmBlN,EAC7B,EAEDsW,KAAKwxJ,aAAe,SAAU9nK,GAC1B,IAAIoN,EAASkJ,KAAKgxJ,eAAetnK,GACjC,OAAW,MAARoN,EACQkJ,KAAKuxJ,SAASz6J,GAEd,IACd,EAEDkJ,KAAKyxJ,aAAe,SAAU/nK,GAC1B,OAAO8K,EAAkB9K,EAAS,GACrC,EAEDsW,KAAK0xJ,SAAW,SAAUhoK,GACtB,IAAIoN,EAAYkJ,KAAKyxJ,aAAc/nK,GACnC,OAAOsW,KAAKgxJ,eAAel6J,EAC9B,EAEDkJ,KAAK2xJ,WAAa,WACd,MAnkBU,OAokBb,CACJ,EC7jBK1/G,GAAsB,SAI5B,SAASgD,GAAgBvrD,GAErBA,EAASA,GAAU,CAAC,EACpB,IAIIoN,EACAzJ,EACAsJ,EACA3Q,EACAJ,EACAgR,EATA/I,EAAUmS,KAAK9V,QACf6C,GAAA,EAAW2K,EAAAwiB,GAASrsB,GAASg1H,cAC3B90H,GAAA,EAAWkc,EAAAiQ,GAASrsB,GAASg1H,cAsEnC,SAAS/0H,EAAQpE,EAAUoN,EAAMzJ,GAC7B,IACIsJ,EACA3Q,EAFAJ,EAAgB,CAAC,EAIrBA,EAAcgsK,SAAWloK,EACzB9D,EAAc+B,KAAOmP,EACrBlR,EAAcisK,YAAcxkK,EAEU,IAAlCzH,EAAcgsK,SAAS7rK,QACvByH,EAAyB5H,GAE7B,IAAK,IAAI2R,EAAI,EAAGA,EAAI3R,EAAcgsK,SAAS7rK,OAAQwR,IAC/CZ,EAAU/Q,EAAcgsK,SAASr6J,GAE7BvR,EADA+H,EAAS+jK,UAAUn7J,EAAQ7K,KACrB6K,EAAQ7K,IAER6K,EAAQo7J,gBAAgBC,QAAUr7J,EAAQ7K,IAEpD8K,EAAY8lB,KAAK12B,EAAK2Q,EAAS/Q,EAEtC,CAED,SAASoI,EAAqBtE,GAC1B,IAAIoN,EACAzJ,EAIAsJ,EAAgB,GAKpB,GAHAG,EAAUpN,EAAMw1F,QAChB7xF,EAAgB3D,EAAMmlK,cAElB/3J,EAAQ83J,gBAAiB,CACzB,IAAI5oK,EAAQ,EAEqC,IAA7C8Q,EAAQ83J,gBAAgBz8J,QAAQ,WAChCnM,EAAQ8Q,EAAQ83J,gBAAgBz8J,QAAQ,MAAQ,GAEpDwE,EAAgBG,EAAQ83J,gBAAgB90C,OAAO,EAAE9zH,GAblC,aAawD8Q,EAAQ83J,gBAAgB90C,OAAO9zH,GAZvF,cAaf8Q,EAAQ83J,gBAAkBhpK,EAAU4rK,aAAa76J,EACpD,WAoHwBjN,GACzB,IAAIoN,EAEJ,IAAKA,EAAI,EAAGA,EAAIpN,EAAkBkoK,SAAS7rK,OAAQ+Q,IAE/C,IAAI,IADEpN,EAAkBkoK,SAAS96J,GACzBgyB,SACJ,OAAO,EAGf,OAAO,CACV,EA9HI,CACuBz7B,IACpBG,EAAyBH,EAEhC,CAGD,SAASG,EAA0B9D,GAC/B,IACIoN,EACAzJ,EAFAzH,EAAW,GAQf,GA+CJ,SAA2B8D,GACvB,IACIoN,EACAzJ,EACAzH,EACA2R,EACAX,EACAc,EANAvK,EAAmB,GAQvB,IAAKoK,EAAI7N,EAAckoK,SAAS7rK,OAAS,EAAGwR,GAAK,EAAGA,IAAM,CAKtD,GAHAlK,GADAyJ,EAAUpN,EAAckoK,SAASr6J,IAClB5P,KAAO,WAGjBmP,EAAQ83J,iBAMR,GAAI93J,EAAQ83J,gBACb,IAAKh4J,EAAI,EAAGA,EAAIE,EAAQ83J,gBAAgBvhK,GAAMtH,OAAQ6Q,IAElDhR,EAAMkR,EAAQ83J,gBAAgBvhK,GAAMuJ,GACpCzJ,EAAiBsd,KAAK7kB,eATnBkR,EAAQi7J,gBAAgB,wBACxBj7J,EAAQi7J,gBAAgB,cAC/B5kK,EAAiBsd,KAAK3T,EAAQi7J,iBAYlC,IADAj7J,EAAQ0wG,cAAcn6G,GAAM6jB,OAAOpa,EAAQiP,MAAO,GAC7CrO,EAAI,EAAGA,EAAIvK,EAAiBpH,OAAQ2R,IACrCZ,EAAQ0wG,cAAcn6G,GAAM6jB,OAAOpa,EAAQiP,MAAQrO,EAAG,EAAGvK,EAAiBuK,IAE9EvK,EAAmB,EACtB,CACGzD,EAAckoK,SAAS7rK,OAAS,GAChC4Q,EAAKs7J,IAAIjsK,EAEhB,CArCD,CAnDsB0D,GApIK,cAqInBA,EAAcmoK,aACd9kK,EAASsxB,QAAQlxB,EAAA+sB,EAAA+2G,YAAoB,CAAEe,SAAUhsI,IAEjD0D,EAAcmoK,cAAgB5/G,GAC9B,OAAQvoD,EAAc/B,MAElB,KAAK4P,EAAA2iB,EAAAm7G,OACD,IAAKv+H,EAAI,EAAGA,EAAI9Q,EAASuR,EAAA2iB,EAAAm7G,OAAuB,YAAYtvI,OAAQ+Q,KAChEzJ,EAAMrH,EAASuR,EAAA2iB,EAAAm7G,OAAuB,YAAYv+H,IAC1CnQ,eAAe4Q,EAAA2iB,EAAA46G,eAA+B,cAClDlvI,EAAWA,EAAS0D,OAAO8D,EAAqBC,EAAIkK,EAAA2iB,EAAA46G,eAA+B,YAAaznI,EAAKkK,EAAA2iB,EAAA46G,eAA8B7iF,MAEnI5kD,EAAI1G,eAAe4Q,EAAA2iB,EAAAq7G,aAA6B,cAChD3vI,EAAWA,EAAS0D,OAAO8D,EAAqBC,EAAIkK,EAAA2iB,EAAAq7G,aAA6B,YAAaloI,EAAKkK,EAAA2iB,EAAAq7G,aAA4BtjF,MAGvInkD,EAAQlI,EAAU2R,EAAA2iB,EAAA46G,eAA8B7iF,IAChD,MACJ,KAAK16C,EAAA2iB,EAAA46G,eAED/nI,EAASsxB,QAAQlxB,EAAA+sB,EAAA+2G,YAAoB,CAAEe,SAAUhsI,IAIhE,CAGD,SAASoH,EAAqB1D,EAAUoN,EAAezJ,EAAMsJ,GACzD,IACI3Q,EACAJ,EACA2R,EAHAX,EAAY,GAKhB,IAAKhR,EAAI8D,EAAS3D,OAAS,EAAGH,GAAK,EAAGA,KAClCI,EAAU0D,EAAS9D,IACPe,eAAe,eAvKf,uCAuKgCX,EAAQ,eAChD0D,EAASwnB,OAAOtrB,EAAG,GAI3B,IAAKA,EAAI,EAAGA,EAAI8D,EAAS3D,OAAQH,KAC7BI,EAAU0D,EAAS9D,IACPe,eAAe,eAAiBX,EAAQW,eAAe,kBAAoBX,EAAQ,mBAAqB2Q,IAChHY,EAAc/C,EAAkBxO,EAAQ,cAAe8Q,EAAezJ,EAAMzH,EAAG+Q,EAAa3Q,GAC5F4Q,EAAU6T,KAAKlT,IAGvB,OAAOX,CACV,CAyCD,SAASpC,EAAkB9K,EAAKoN,EAAezJ,EAAMsJ,EAAO3Q,EAAaJ,GACrE,MAAO,CACHkG,IAAKpC,EACL89G,cAAe1wG,EACfnP,KAAM0F,EACN0Y,MAAOpP,EACPk7J,YAAa7rK,EACb+rK,gBAAiBnsK,EACjBgpK,gBAAiB,KACjB9lI,UAAA,EAEP,CA4BD,OARAhyB,EAAW,CACPo7J,sBAjNJ,SAA+BxoK,GAG3B9D,EAAY,IAAIusD,GAAK,CACjBy+G,YAAA,EACAT,gBAAoB,GACpBnB,gBAAoB,WACpBwB,cAAoB,SACpBF,kBAAA,EACAK,oBAAA,EACAd,YAAA,EACAI,SAAoB5iK,KAGxBrH,EAAW0D,GAEEuoI,eAETnkI,EADWV,EAAqBpH,EAASisI,eAAgBjsI,EAAUuR,EAAA2iB,EAAAm7G,OAAsBpjF,IACvE16C,EAAA2iB,EAAAm7G,OAAsBpjF,IAExCllD,EAASsxB,QAAQlxB,EAAA+sB,EAAA+2G,YAAoB,CAACe,SAAUhsI,GAEvD,EA4LGmsK,YAlOJ,SAAqBzoK,GACbA,IACA2D,EAAW3D,EAElB,EA+NG0oK,QA7NJ,SAAiB1oK,GACTA,IACAiN,EAAOjN,EAEd,EA0NGgvC,MA5LJ,WACI3rC,EAASqvB,IAAIjvB,EAAA+sB,EAAA82G,qBAA6BhjI,EAAsB8I,GAE5DF,IACAA,EAAY8hC,QACZ9hC,EAAc,KAErB,GA1DG7J,EAAS+uB,GAAG3uB,EAAA+sB,EAAA82G,qBAA6BhjI,EAAsB8I,GAE/DF,EAAcs7C,GAAYrkD,GAASvD,OAAO,CACtCy9I,WAAYr+I,EAAOq+I,WACnB/J,YAAat0I,EAAOs0I,YACpBsM,iBAAkB5gJ,EAAO4gJ,iBACzBmG,gBAAiB/mJ,EAAO+mJ,gBACxB3tC,SAAUp5G,EAAOo5G,WA4OlBhsG,CACV,CAEDm+C,GAAgBouE,sBAAwB,kBACxC,IAAAnwE,GAAerlD,EAAAqsB,EAAAyqG,gBAA6B1vE,IAAA,SAAAzB,GAAA9pD,GAAA,OAAA8pD,GAAA,mBAAAvmD,QAAA,iBAAAA,OAAA85E,SAAA,SAAAr9E,GAAA,cAAAA,CAAA,WAAAA,GAAA,OAAAA,GAAA,mBAAAuD,QAAAvD,EAAA5D,cAAAmH,QAAAvD,IAAAuD,OAAAxG,UAAA,gBAAAiD,CAAA,EAAA8pD,GAAA9pD,EAAA,CChR5C,SAASstD,GAAWttD,GAEhB,SAASoN,EAAYpN,EAAYoN,GAC7B,IAAK,IAAIzJ,KAAQ3D,EACRoN,EAAUnQ,eAAe0G,KAC1ByJ,EAAUzJ,GAAQ3D,EAAW2D,GAGxC,CAED,SAASA,EAAc3D,EAAY2D,EAAQsJ,GACvC,IAAK,IAAI3Q,EAAI,EAAGJ,EAAM8D,EAAW3D,OAAQC,EAAIJ,IAAOI,EAAG,CACnD,IAAMuR,EAAW7N,EAAW1D,GAE5B,GAAIqH,EAAOkK,EAAS1P,MAChB,GAAI8O,EAAMY,EAAS1P,OAEf,GAAI0P,EAASonG,MAAO,CAChB,IAAM/nG,EAAcvJ,EAAOkK,EAAS1P,MAC9B6P,EAAaf,EAAMY,EAAS1P,MAGP,WAAvB2rD,GAAO58C,IAAkD,WAAtB48C,GAAO97C,GAC1CZ,EAAYF,EAAac,GAIzBf,EAAMY,EAAS1P,MAAQ+O,EAAcc,CAE5C,OAGDf,EAAMY,EAAS1P,MAAQwF,EAAOkK,EAAS1P,KAGlD,CACJ,CAED,SAAS8O,EAAQjN,EAAMoN,GACnB,IAAK,IAAI9Q,EAAI,EAAGJ,EAAM8D,EAAKs/E,SAASjjF,OAAQC,EAAIJ,IAAOI,EAAG,CACtD,IAAMuR,EAAY7N,EAAKs/E,SAAShjF,GAE1B4Q,EAAQE,EAAKS,EAAU1P,KAAO,YACpC,GAAI+O,EACA,IAAK,IAAIc,EAAI,EAAGvK,EAAOyJ,EAAM7Q,OAAQ2R,EAAIvK,IAAQuK,EAAG,CAChD,IAAM7J,EAAY+I,EAAMc,GACxBrK,EAAc3D,EAAK2oK,WAAYv7J,EAAMjJ,GACrC8I,EAAQY,EAAW1J,EACtB,CAER,CACJ,CA8BD,MAAO,CACHokK,IA7BJ,SAAan7J,GAET,GAAe,OAAXA,GAAqC,WAAlB08C,GAAO18C,GAC1B,OAAOA,EAGX,GAAIA,EAAOm7H,gBAAkB,WAAYvoI,EAGrC,IAFA,IAAM2D,EAAe3D,EAAQooI,OACvB9rI,EAAU8Q,EAAOm7H,eACdrsI,EAAI,EAAG2R,EAAMvR,EAAQD,OAAQH,EAAI2R,IAAO3R,EAAG,CAChD,IAAMgR,EAAS5Q,EAAQJ,GAGvB,GAFA+Q,EAAQtJ,EAAcuJ,GAElB,kBAAmBlN,EAAS,CAC5B,IAAMgO,EAAiBd,EAAOs7H,sBAC9B,GAAIx6H,EAEA,IADA,IAAMvK,EAAsBzD,EAAQ4oK,cAC3BzkK,EAAI,EAAGd,EAAM2K,EAAe3R,OAAQ8H,EAAId,IAAOc,EACpD8I,EAAQxJ,EAAqBuK,EAAe7J,GAGvD,CACJ,CAGL,OAAOiJ,CACV,EAKJ,CAGDkgD,GAAWqsE,sBAAwB,aACnC,IACApsE,GADgBppD,EAAAqsB,EAAAyqG,gBAA6B3tE,IAAA,SAAAE,GAAAxtD,EAAAoN,GAAA,QAAAzJ,EAAA,EAAAA,EAAAyJ,EAAA/Q,OAAAsH,IAAA,KAAAsJ,EAAAG,EAAAzJ,GAAAsJ,EAAAmvD,WAAAnvD,EAAAmvD,aAAA,EAAAnvD,EAAA6wE,cAAA,YAAA7wE,IAAAA,EAAAmuH,UAAA,GAAAt+H,OAAAmC,eAAAe,EAAAiN,EAAA9P,IAAA8P,EAAA,MCpE7C8rB,GAfM,WACF,SAAA/4B,EAAYoN,EAAMzJ,IAAA,SAAA3D,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAW,KAAA3oD,GACzBsW,KAAKuyJ,MAAQz7J,EACbkJ,KAAKwyJ,WAAanlK,CACrB,KAAAA,EAAA,OAAAA,EAAA,EAAAxG,IAAA,OAAAia,IAED,WACI,OAAOd,KAAKuyJ,KACf,IAAA1rK,IAAA,YAAAia,IAED,WACI,OAAOd,KAAKwyJ,UACf,MAAAt7G,GARAxtD,EAQAjD,UAAA4G,GAAA3D,CAAA,CAZC,YAAAw6B,GAAAx6B,GAAA,OAAAw6B,GAAA,mBAAAj3B,QAAA,iBAAAA,OAAA85E,SAAA,SAAAr9E,GAAA,cAAAA,CAAA,WAAAA,GAAA,OAAAA,GAAA,mBAAAuD,QAAAvD,EAAA5D,cAAAmH,QAAAvD,IAAAuD,OAAAxG,UAAA,gBAAAiD,CAAA,EAAAw6B,GAAAx6B,EAAA,UAAA+oK,GAAA/oK,EAAAoN,EAAAzJ,GAAA,OAAAyJ,KAAApN,EAAAlD,OAAAmC,eAAAe,EAAAoN,EAAA,CAAAtF,MAAAnE,EAAAy4D,YAAA,EAAA0hB,cAAA,EAAAs9C,UAAA,IAAAp7H,EAAAoN,GAAAzJ,EAAA3D,CAAA,UAAAy6B,GAAAz6B,EAAAoN,GAAA,OAAAqtB,GAAA39B,OAAA4nI,gBAAA,SAAA1kI,EAAAoN,GAAA,OAAApN,EAAA8oD,UAAA17C,EAAApN,CAAA,EAAAy6B,GAAAz6B,EAAAoN,EAAA,UAAA47J,GAAAhpK,EAAAoN,GAAA,OAAAA,GAAA,WAAAotB,GAAAptB,IAAA,mBAAAA,EAAA,SAAApN,GAAA,YAAAA,EAAA,UAAAwxC,eAAA,oEAAAxxC,CAAA,EAAAA,GAAAoN,CAAA,UAAA67J,GAAAjpK,GAAA,OAAAipK,GAAAnsK,OAAA4nI,eAAA5nI,OAAAuC,eAAA,SAAAW,GAAA,OAAAA,EAAA8oD,WAAAhsD,OAAAuC,eAAAW,EAAA,EAAAipK,GAAAjpK,EAAA,KCgDN26B,GAjDM,SAAA36B,IAAA,SAAAA,EAAAoN,GAAA,sBAAAA,GAAA,OAAAA,EAAA,UAAAu7C,UAAA,sDAAA3oD,EAAAjD,UAAAD,OAAA8D,OAAAwM,GAAAA,EAAArQ,UAAA,CAAAX,YAAA,CAAA0L,MAAA9H,EAAAo7H,UAAA,EAAAt9C,cAAA,KAAA1wE,GAAAqtB,GAAAz6B,EAAAoN,EAAA,EAAA9Q,EAAA0D,GAAA,IAAAoN,EAAAzJ,EAAAsJ,GAAAG,EAAA9Q,EAAAqH,EAAA,kCAAA45E,UAAAA,QAAAC,UAAA,YAAAD,QAAAC,UAAAmnD,KAAA,+BAAAC,MAAA,oBAAA9nB,QAAA//G,UAAAF,QAAAK,KAAAqgF,QAAAC,UAAAs/B,QAAA,6BAAA98G,GAAA,4BAAAA,EAAAiN,EAAAg8J,GAAA77J,GAAA,GAAAzJ,EAAA,KAAArH,EAAA2sK,GAAA,MAAA7sK,YAAA4D,EAAAu9E,QAAAC,UAAAvwE,EAAA3O,UAAAhC,EAAA,MAAA0D,EAAAiN,EAAAyU,MAAA,KAAApjB,WAAA,OAAA0qK,GAAA,KAAAhpK,EAAA,GACF,SAAA1D,IAAc,gBAAA0D,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,2CAAArsD,GAAA2Q,EAAA/P,KAAA,MAEN,SAAC8C,EAAMoN,GAAa,IAAAzJ,EACVsJ,GAAqB87J,GAAAplK,EAAG,CAAC,EAC1BkK,EAAA2iB,EAAAk7G,IAA+C,CAAE79H,EAAA2iB,EAAA5Y,GAAkB/J,EAAA2iB,EAAAs7G,WAD7Ci9B,GAAAplK,EAEtBkK,EAAA2iB,EAAAm7G,OAA+C,CAAE99H,EAAA2iB,EAAA5Y,KAF3BmxJ,GAAAplK,EAGtBkK,EAAA2iB,EAAAw6G,SAA+C,CAAEn9H,EAAA2iB,EAAAu7G,iBAAgCl+H,EAAA2iB,EAAA27G,aAH3D48B,GAAAplK,EAItBkK,EAAA2iB,EAAAy6G,aAA+C,CAAEp9H,EAAA2iB,EAAA47G,cAJ3B28B,GAAAplK,EAKtBkK,EAAA2iB,EAAAg7G,eAA+C,CAAE39H,EAAA2iB,EAAAw7G,QAL3B+8B,GAAAplK,EAMtBkK,EAAA2iB,EAAA86G,qBAA+C,CAAEz9H,EAAA2iB,EAAAw7G,QAN3B+8B,GAAAplK,EAOtBkK,EAAA2iB,EAAAk6G,aAA+C,CAAE78H,EAAA2iB,EAAA47G,cAP3B28B,GAAAplK,EAQtBkK,EAAA2iB,EAAAg8G,oBAA+C,CAAE3+H,EAAA2iB,EAAAw7G,QAR3B+8B,GAAAplK,EAStBkK,EAAA2iB,EAAA06G,YAA+C,CAAEr9H,EAAA2iB,EAAA67G,YAA2Bx+H,EAAA2iB,EAAA47G,cATtD28B,GAAAplK,EAUtBkK,EAAA2iB,EAAAi6G,iBAA+C,CAAE58H,EAAA2iB,EAAA47G,YAA2Bv+H,EAAA2iB,EAAA07G,MAAqBr+H,EAAA2iB,EAAAy7G,MAAqBp+H,EAAA2iB,EAAAi7G,qBAAoC59H,EAAA2iB,EAAAi8G,4BAVpIs8B,GAAAplK,EAWtBkK,EAAA2iB,EAAAo7G,iBAA+C,CAAE/9H,EAAA2iB,EAAAhI,MAAqB3a,EAAA2iB,EAAA5Y,KAXhDmxJ,GAAAplK,EAYtBkK,EAAA2iB,EAAAq7G,aAA+C,CAAEh+H,EAAA2iB,EAAAhI,QAZ3BugJ,GAAAplK,EAatBkK,EAAA2iB,EAAA46G,eAA+C,CAAEv9H,EAAA2iB,EAAAs7G,SAAwBj+H,EAAA2iB,EAAA+7G,UAAyB1+H,EAAA2iB,EAAA26G,iBAAgCt9H,EAAA2iB,EAAAjC,OAAsB1gB,EAAA2iB,EAAA87G,eAblIy8B,GAAAplK,EActBkK,EAAA2iB,EAAAi9G,cAA+C,CAAE5/H,EAAA2iB,EAAAhI,MAAqB3a,EAAA2iB,EAAA5Y,KAdhDmxJ,GAAAplK,EAetBkK,EAAA2iB,EAAAk9G,4BAA+C,CAAE7/H,EAAA2iB,EAAAhI,MAAqB3a,EAAA2iB,EAAA5Y,KAfhDmxJ,GAAAplK,EAgBtBkK,EAAA2iB,EAAAm9G,mBAA+C,CAAE9/H,EAAA2iB,EAAAhI,MAAqB3a,EAAA2iB,EAAA5Y,KAhBhDmxJ,GAAAplK,EAiBtBkK,EAAA2iB,EAAAo9G,mBAA+C,CAAE//H,EAAA2iB,EAAAhI,MAAqB3a,EAAA2iB,EAAA5Y,KAjBhDmxJ,GAAAplK,EAkBtBkK,EAAA2iB,EAAAs9G,sBAA+C,CAAEjgI,EAAA2iB,EAAAhI,MAAqB3a,EAAA2iB,EAAA5Y,KAlBhDmxJ,GAAAplK,EAmBtBkK,EAAA2iB,EAAAw9G,oBAA+C,CAAEngI,EAAA2iB,EAAAhI,MAAqB3a,EAAA2iB,EAAA5Y,KAnBhDmxJ,GAAAplK,EAoBtBkK,EAAA2iB,EAAA29G,cAA+C,CAAEtgI,EAAA2iB,EAAAhI,MAAqB3a,EAAA2iB,EAAA5Y,KApBhDmxJ,GAAAplK,EAqBtBkK,EAAA2iB,EAAA49G,KAA+C,CAAEvgI,EAAA2iB,EAAAhI,MAAqB3a,EAAA2iB,EAAA5Y,KArBhDmxJ,GAAAplK,EAsBtBkK,EAAA2iB,EAAA69G,OAA+C,CAAExgI,EAAA2iB,EAAAhI,MAAqB3a,EAAA2iB,EAAA5Y,KAtBhDmxJ,GAAAplK,EAuBtBkK,EAAA2iB,EAAAi+G,UAA+C,CAAE5gI,EAAA2iB,EAAAhI,MAAqB3a,EAAA2iB,EAAA5Y,KAvBhDmxJ,GAAAplK,EAwBtBkK,EAAA2iB,EAAA89G,kBAA+C,CAAEzgI,EAAA2iB,EAAA87G,eAxB3By8B,GAAAplK,EAyBtBkK,EAAA2iB,EAAA66G,eAA+C,CAAEx9H,EAAA2iB,EAAA5Y,GAAkB/J,EAAA2iB,EAAAk8G,cAA6B7+H,EAAA2iB,EAAAm8G,4BAzB1Eo8B,GAAAplK,EA0BtBkK,EAAA2iB,EAAA+9G,OAA+C,CAAE1gI,EAAA2iB,EAAA5Y,KA1B3BmxJ,GAAAplK,EA2BtBkK,EAAA2iB,EAAAo8G,QAA+C,CAAE/+H,EAAA2iB,EAAAq8G,gBA3B3Bk8B,GAAAplK,EA4BtBkK,EAAA2iB,EAAAs8G,UAA+C,CAAEj/H,EAAA2iB,EAAAhI,MAAqB3a,EAAA2iB,EAAA5Y,KA5BhDjU,GA8B3B,GAAIsJ,EAAsBhQ,eAAemQ,GAAW,CAChD,IAAI9Q,EAAY2Q,EAAsBG,GACtC,gBAAI9Q,GACOA,EAAUmM,QAAQzI,EAAK7B,OAAS,CAI9C,CACD,OAAO,CACV,IACD,SAAA6B,GAAG,OAAIwhB,OAAOxhB,EAAX,GAEV,QAAA1D,CAAA,CA9CC,CAAsBy8B,IAAA,SAAA2B,GAAA16B,GAAA,OAAA06B,GAAA,mBAAAn3B,QAAA,iBAAAA,OAAA85E,SAAA,SAAAr9E,GAAA,cAAAA,CAAA,WAAAA,GAAA,OAAAA,GAAA,mBAAAuD,QAAAvD,EAAA5D,cAAAmH,QAAAvD,IAAAuD,OAAAxG,UAAA,gBAAAiD,CAAA,EAAA06B,GAAA16B,EAAA,UAAA+7B,GAAA/7B,EAAAoN,GAAA,OAAA2uB,GAAAj/B,OAAA4nI,gBAAA,SAAA1kI,EAAAoN,GAAA,OAAApN,EAAA8oD,UAAA17C,EAAApN,CAAA,EAAA+7B,GAAA/7B,EAAAoN,EAAA,UAAA2tB,GAAA/6B,EAAAoN,GAAA,OAAAA,GAAA,WAAAstB,GAAAttB,IAAA,mBAAAA,EAAA,SAAApN,GAAA,YAAAA,EAAA,UAAAwxC,eAAA,oEAAAxxC,CAAA,EAAAA,GAAAoN,CAAA,UAAAovB,GAAAx8B,GAAA,OAAAw8B,GAAA1/B,OAAA4nI,eAAA5nI,OAAAuC,eAAA,SAAAW,GAAA,OAAAA,EAAA8oD,WAAAhsD,OAAAuC,eAAAW,EAAA,EAAAw8B,GAAAx8B,EAAA,CCC5B,IAAMy8B,GAAgB,qFAgDtBF,GAxCM,SAAAv8B,IAAA,SAAAA,EAAAoN,GAAA,sBAAAA,GAAA,OAAAA,EAAA,UAAAu7C,UAAA,sDAAA3oD,EAAAjD,UAAAD,OAAA8D,OAAAwM,GAAAA,EAAArQ,UAAA,CAAAX,YAAA,CAAA0L,MAAA9H,EAAAo7H,UAAA,EAAAt9C,cAAA,KAAA1wE,GAAA2uB,GAAA/7B,EAAAoN,EAAA,EAAA9Q,EAAA0D,GAAA,IAAAoN,EAAAzJ,EAAAsJ,GAAAG,EAAA9Q,EAAAqH,EAAA,kCAAA45E,UAAAA,QAAAC,UAAA,YAAAD,QAAAC,UAAAmnD,KAAA,+BAAAC,MAAA,oBAAA9nB,QAAA//G,UAAAF,QAAAK,KAAAqgF,QAAAC,UAAAs/B,QAAA,6BAAA98G,GAAA,4BAAAA,EAAAiN,EAAAuvB,GAAApvB,GAAA,GAAAzJ,EAAA,KAAArH,EAAAkgC,GAAA,MAAApgC,YAAA4D,EAAAu9E,QAAAC,UAAAvwE,EAAA3O,UAAAhC,EAAA,MAAA0D,EAAAiN,EAAAyU,MAAA,KAAApjB,WAAA,OAAAy8B,GAAA,KAAA/6B,EAAA,GACF,SAAA1D,IAAc,gBAAA0D,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,2CAAArsD,GAAA2Q,EAAA/P,KAAA,MAEN,SAAA8C,GASI,IARA,IAAMoN,EAAgB,CAClBS,EAAA2iB,EAAA0/G,gBAA+BriI,EAAA2iB,EAAA4+G,4BAC/BvhI,EAAA2iB,EAAA6+G,sBAAqCxhI,EAAA2iB,EAAAu/G,uBAAsCliI,EAAA2iB,EAAAw/G,qBAC3EniI,EAAA2iB,EAAA2/G,wBAAuCtiI,EAAA2iB,EAAAqgH,6BAA4ChjI,EAAA2iB,EAAA4/G,MACnFl0I,EAAAs0B,EAAA04I,WAAsBr7J,EAAA2iB,EAAAk/G,UAEpB/rI,EAAMyJ,EAAc/Q,OAEjB4Q,EAAI,EAAGA,EAAItJ,EAAKsJ,IACrB,GAAIjN,EAAK4/D,WAAaxyD,EAAcH,GAChC,OAAOwvB,GAAc56B,KAAK7B,EAAK8H,OAIvC,OAAO,CACV,IACD,SAAA9H,GAEI,IAAMoN,EAAQqvB,GAAc1uB,KAAK/N,GAC7B2D,EA7BI,QA6BMmT,WAAW1J,EAAM,IAAM,GA5B5B,OA6BL0J,WAAW1J,EAAM,IAAM,GA5BpB,MA6BH0J,WAAW1J,EAAM,IAAM,GA5BnB,KA6BJ0J,WAAW1J,EAAM,IAAM,GA5BpB,GA6BH0J,WAAW1J,EAAM,KAAO,GACxB0J,WAAW1J,EAAM,KAAO,GAM5B,YAAO,IAJHA,EAAM,KACNzJ,GAAUA,GAGPA,CACV,GAER,QAAArH,CAAA,CArCC,CAAwBy8B,IAAA,SAAA2D,GAAA18B,GAAA,OAAA08B,GAAA,mBAAAn5B,QAAA,iBAAAA,OAAA85E,SAAA,SAAAr9E,GAAA,cAAAA,CAAA,WAAAA,GAAA,OAAAA,GAAA,mBAAAuD,QAAAvD,EAAA5D,cAAAmH,QAAAvD,IAAAuD,OAAAxG,UAAA,gBAAAiD,CAAA,EAAA08B,GAAA18B,EAAA,UAAAs8B,GAAAt8B,EAAAoN,GAAA,OAAAkvB,GAAAx/B,OAAA4nI,gBAAA,SAAA1kI,EAAAoN,GAAA,OAAApN,EAAA8oD,UAAA17C,EAAApN,CAAA,EAAAs8B,GAAAt8B,EAAAoN,EAAA,UAAAyvB,GAAA78B,EAAAoN,GAAA,OAAAA,GAAA,WAAAsvB,GAAAtvB,IAAA,mBAAAA,EAAA,SAAApN,GAAA,YAAAA,EAAA,UAAAwxC,eAAA,oEAAAxxC,CAAA,EAAAA,GAAAoN,CAAA,UAAAwvB,GAAA58B,GAAA,OAAA48B,GAAA9/B,OAAA4nI,eAAA5nI,OAAAuC,eAAA,SAAAW,GAAA,OAAAA,EAAA8oD,WAAAhsD,OAAAuC,eAAAW,EAAA,EAAA48B,GAAA58B,EAAA,CCV9B,IAIM88B,GAAgB,wHAkCtBC,GAhCM,SAAA/8B,IAAA,SAAAA,EAAAoN,GAAA,sBAAAA,GAAA,OAAAA,EAAA,UAAAu7C,UAAA,sDAAA3oD,EAAAjD,UAAAD,OAAA8D,OAAAwM,GAAAA,EAAArQ,UAAA,CAAAX,YAAA,CAAA0L,MAAA9H,EAAAo7H,UAAA,EAAAt9C,cAAA,KAAA1wE,GAAAkvB,GAAAt8B,EAAAoN,EAAA,EAAA9Q,EAAA0D,GAAA,IAAAoN,EAAAzJ,EAAAsJ,GAAAG,EAAA9Q,EAAAqH,EAAA,kCAAA45E,UAAAA,QAAAC,UAAA,YAAAD,QAAAC,UAAAmnD,KAAA,+BAAAC,MAAA,oBAAA9nB,QAAA//G,UAAAF,QAAAK,KAAAqgF,QAAAC,UAAAs/B,QAAA,6BAAA98G,GAAA,4BAAAA,EAAAiN,EAAA2vB,GAAAxvB,GAAA,GAAAzJ,EAAA,KAAArH,EAAAsgC,GAAA,MAAAxgC,YAAA4D,EAAAu9E,QAAAC,UAAAvwE,EAAA3O,UAAAhC,EAAA,MAAA0D,EAAAiN,EAAAyU,MAAA,KAAApjB,WAAA,OAAAu+B,GAAA,KAAA78B,EAAA,GACF,SAAA1D,IAAc,gBAAA0D,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,2CAAArsD,GAAA2Q,EAAA/P,KAAA,MAEN,SAAA8C,GAAI,OAAI88B,GAAcj7B,KAAK7B,EAAK8H,MAA5B,IACJ,SAAA9H,GACI,IACIoN,EADEzJ,EAAQm5B,GAAc/uB,KAAK/N,GAgBjC,GAVAoN,EAAUyK,KAAKgtI,IACXruI,SAAS7S,EAAM,GAAI,IACnB6S,SAAS7S,EAAM,GAAI,IAAM,EACzB6S,SAAS7S,EAAM,GAAI,IACnB6S,SAAS7S,EAAM,GAAI,IACnB6S,SAAS7S,EAAM,GAAI,IAClBA,EAAM,IAAM6S,SAAS7S,EAAM,GAAI,KAAO,EACtCA,EAAM,IAtBK,IAsBCmT,WAAWnT,EAAM,KAAkC,GAGhEA,EAAM,IAAMA,EAAM,IAAK,CACvB,IAAMsJ,EA3BF,GA2BmBuJ,SAAS7S,EAAM,GAAI,IAAwB6S,SAAS7S,EAAM,IAAK,IACtFyJ,IAAyB,MAAbzJ,EAAM,IAAc,EAAI,GAAMsJ,EA7BvC,GAES,GA4Bf,CAED,OAAO,IAAI4K,KAAKzK,EACnB,GAER,QAAA9Q,CAAA,CA7BC,CAAwBy8B,IAAA,SAAA4D,GAAA38B,GAAA,OAAA28B,GAAA,mBAAAp5B,QAAA,iBAAAA,OAAA85E,SAAA,SAAAr9E,GAAA,cAAAA,CAAA,WAAAA,GAAA,OAAAA,GAAA,mBAAAuD,QAAAvD,EAAA5D,cAAAmH,QAAAvD,IAAAuD,OAAAxG,UAAA,gBAAAiD,CAAA,EAAA28B,GAAA38B,EAAA,UAAAmpK,GAAAnpK,EAAAoN,GAAA,OAAA+7J,GAAArsK,OAAA4nI,gBAAA,SAAA1kI,EAAAoN,GAAA,OAAApN,EAAA8oD,UAAA17C,EAAApN,CAAA,EAAAmpK,GAAAnpK,EAAAoN,EAAA,UAAA4vB,GAAAh9B,EAAAoN,GAAA,OAAAA,GAAA,WAAAuvB,GAAAvvB,IAAA,mBAAAA,EAAA,SAAApN,GAAA,YAAAA,EAAA,UAAAwxC,eAAA,oEAAAxxC,CAAA,EAAAA,GAAAoN,CAAA,UAAA8vB,GAAAl9B,GAAA,OAAAk9B,GAAApgC,OAAA4nI,eAAA5nI,OAAAuC,eAAA,SAAAW,GAAA,OAAAA,EAAA8oD,WAAAhsD,OAAAuC,eAAAW,EAAA,EAAAk9B,GAAAl9B,EAAA,CCN9B,IAAMy9B,GAAe,4CAWrBH,GATM,SAAAt9B,IAAA,SAAAA,EAAAoN,GAAA,sBAAAA,GAAA,OAAAA,EAAA,UAAAu7C,UAAA,sDAAA3oD,EAAAjD,UAAAD,OAAA8D,OAAAwM,GAAAA,EAAArQ,UAAA,CAAAX,YAAA,CAAA0L,MAAA9H,EAAAo7H,UAAA,EAAAt9C,cAAA,KAAA1wE,GAAA+7J,GAAAnpK,EAAAoN,EAAA,EAAA9Q,EAAA0D,GAAA,IAAAoN,EAAAzJ,EAAAsJ,GAAAG,EAAA9Q,EAAAqH,EAAA,kCAAA45E,UAAAA,QAAAC,UAAA,YAAAD,QAAAC,UAAAmnD,KAAA,+BAAAC,MAAA,oBAAA9nB,QAAA//G,UAAAF,QAAAK,KAAAqgF,QAAAC,UAAAs/B,QAAA,6BAAA98G,GAAA,4BAAAA,EAAAiN,EAAAiwB,GAAA9vB,GAAA,GAAAzJ,EAAA,KAAArH,EAAA4gC,GAAA,MAAA9gC,YAAA4D,EAAAu9E,QAAAC,UAAAvwE,EAAA3O,UAAAhC,EAAA,MAAA0D,EAAAiN,EAAAyU,MAAA,KAAApjB,WAAA,OAAA0+B,GAAA,KAAAh9B,EAAA,GACF,SAAA1D,IAAc,gBAAA0D,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,2CAAArsD,GAAA2Q,EAAA/P,KAAA,MAEN,SAAA8C,GAAI,OAAIy9B,GAAa57B,KAAK7B,EAAK8H,MAA3B,IACJ,SAAA9H,GAAG,OAAI8W,WAAW9W,EAAf,GAEV,QAAA1D,CAAA,CANC,CAAuBy8B,IAAA,SAAAqwI,GAAAppK,GAAA,OAAAopK,GAAA,mBAAA7lK,QAAA,iBAAAA,OAAA85E,SAAA,SAAAr9E,GAAA,cAAAA,CAAA,WAAAA,GAAA,OAAAA,GAAA,mBAAAuD,QAAAvD,EAAA5D,cAAAmH,QAAAvD,IAAAuD,OAAAxG,UAAA,gBAAAiD,CAAA,EAAAopK,GAAAppK,EAAA,UAAAu9B,GAAAv9B,EAAAoN,EAAAzJ,GAAA,OAAAyJ,KAAApN,EAAAlD,OAAAmC,eAAAe,EAAAoN,EAAA,CAAAtF,MAAAnE,EAAAy4D,YAAA,EAAA0hB,cAAA,EAAAs9C,UAAA,IAAAp7H,EAAAoN,GAAAzJ,EAAA3D,CAAA,UAAAqpK,GAAArpK,EAAAoN,GAAA,OAAAi8J,GAAAvsK,OAAA4nI,gBAAA,SAAA1kI,EAAAoN,GAAA,OAAApN,EAAA8oD,UAAA17C,EAAApN,CAAA,EAAAqpK,GAAArpK,EAAAoN,EAAA,UAAA6zB,GAAAjhC,EAAAoN,GAAA,OAAAA,GAAA,WAAAg8J,GAAAh8J,IAAA,mBAAAA,EAAA,SAAApN,GAAA,YAAAA,EAAA,UAAAwxC,eAAA,oEAAAxxC,CAAA,EAAAA,GAAAoN,CAAA,UAAAk8J,GAAAtpK,GAAA,OAAAspK,GAAAxsK,OAAA4nI,eAAA5nI,OAAAuC,eAAA,SAAAW,GAAA,OAAAA,EAAA8oD,WAAAhsD,OAAAuC,eAAAW,EAAA,EAAAspK,GAAAtpK,EAAA,KCiC7BupK,GAjCM,SAAAvpK,IAAA,SAAAA,EAAAoN,GAAA,sBAAAA,GAAA,OAAAA,EAAA,UAAAu7C,UAAA,sDAAA3oD,EAAAjD,UAAAD,OAAA8D,OAAAwM,GAAAA,EAAArQ,UAAA,CAAAX,YAAA,CAAA0L,MAAA9H,EAAAo7H,UAAA,EAAAt9C,cAAA,KAAA1wE,GAAAi8J,GAAArpK,EAAAoN,EAAA,EAAA9Q,EAAA0D,GAAA,IAAAoN,EAAAzJ,EAAAsJ,GAAAG,EAAA9Q,EAAAqH,EAAA,kCAAA45E,UAAAA,QAAAC,UAAA,YAAAD,QAAAC,UAAAmnD,KAAA,+BAAAC,MAAA,oBAAA9nB,QAAA//G,UAAAF,QAAAK,KAAAqgF,QAAAC,UAAAs/B,QAAA,6BAAA98G,GAAA,4BAAAA,EAAAiN,EAAAq8J,GAAAl8J,GAAA,GAAAzJ,EAAA,KAAArH,EAAAgtK,GAAA,MAAAltK,YAAA4D,EAAAu9E,QAAAC,UAAAvwE,EAAA3O,UAAAhC,EAAA,MAAA0D,EAAAiN,EAAAyU,MAAA,KAAApjB,WAAA,OAAA2iC,GAAA,KAAAjhC,EAAA,GACF,SAAA1D,IAAc,gBAAA0D,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,2CAAArsD,GAAA2Q,EAAA/P,KAAA,MAEN,SAAC8C,EAAMoN,GAAa,IAAAzJ,EACVsJ,GAAqBswB,GAAA55B,EAAG,CAAC,EAC1BkK,EAAA2iB,EAAA46G,eAA+C,CAAEv9H,EAAA2iB,EAAAg+G,OAD3BjxG,GAAA55B,EAEtBkK,EAAA2iB,EAAA66G,eAA+C,CAAEx9H,EAAA2iB,EAAAg+G,OAF3BjxG,GAAA55B,EAGtBkK,EAAA2iB,EAAA89G,kBAA+C,CAAEzgI,EAAA2iB,EAAAg+G,OAH3BjxG,GAAA55B,EAItBkK,EAAA2iB,EAAAohH,MAA+C,CAAE/jI,EAAA2iB,EAAAg+G,OAJ3BjxG,GAAA55B,EAKtBkK,EAAA2iB,EAAAqhH,YAA+C,CAAEhkI,EAAA2iB,EAAAg+G,OAL3B7qI,GAQ3B,GAAIsJ,EAAsBhQ,eAAemQ,GAAW,CAChD,IAAI9Q,EAAY2Q,EAAsBG,GACtC,gBAAI9Q,GACOA,EAAUmM,QAAQzI,EAAK7B,OAAS,CAI9C,CACD,OAAO,CACV,IACD,SAAA6B,GAEI,OADWslD,KAAetlD,IAInBwhB,OAAOxhB,EACjB,GAER,QAAA1D,CAAA,CA9BC,CAAoBy8B,IAAA,SAAA0H,GAAAzgC,EAAAoN,GAAA,QAAAzJ,EAAA,EAAAA,EAAAyJ,EAAA/Q,OAAAsH,IAAA,KAAAsJ,EAAAG,EAAAzJ,GAAAsJ,EAAAmvD,WAAAnvD,EAAAmvD,aAAA,EAAAnvD,EAAA6wE,cAAA,YAAA7wE,IAAAA,EAAAmuH,UAAA,GAAAt+H,OAAAmC,eAAAe,EAAAiN,EAAA9P,IAAA8P,EAAA,MCgB1BwyB,GAlBM,WACF,SAAAz/B,EAAYoN,GACR,IACOzJ,GAAA,SAAA3D,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAFO,KAAA3oD,GAIdsW,KAAKkzJ,MAAQp8J,EACbkJ,KAAKmzJ,QAHE9lK,EAG8ByJ,IAHnBzJ,EAAEtH,QAAUsH,EAAEZ,OAAO,KAAOY,EAAEZ,OAAO,GAAGmF,aAI7D,KAAAvE,EAAA,OAAAA,EAAA,EAAAxG,IAAA,OAAAia,IAED,WACI,OAAOd,KAAKkzJ,KACf,IAAArsK,IAAA,QAAAia,IAED,WACI,OAAOd,KAAKmzJ,MACf,MAAAhpI,GARAzgC,EAQAjD,UAAA4G,GAAA3D,CAAA,CAfC,YAAA0pK,GAAA1pK,EAAAoN,GAAA,QAAAzJ,EAAA,EAAAA,EAAAyJ,EAAA/Q,OAAAsH,IAAA,KAAAsJ,EAAAG,EAAAzJ,GAAAsJ,EAAAmvD,WAAAnvD,EAAAmvD,aAAA,EAAAnvD,EAAA6wE,cAAA,YAAA7wE,IAAAA,EAAAmuH,UAAA,GAAAt+H,OAAAmC,eAAAe,EAAAiN,EAAA9P,IAAA8P,EAAA,MC0BNkwB,GA1BM,WACF,SAAAn9B,EAAYoN,EAAMzJ,EAAYsJ,GAAU,IAAA3Q,EAAA,eAAA0D,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,2CAAA3oD,GACpCsW,KAAKkzJ,MAAQp8J,GAAQ,GACrBkJ,KAAKqzJ,YAAc,GACnBrzJ,KAAKszJ,UAAY38J,GAAY,GAEzBzQ,MAAMC,QAAQkH,IACdA,EAAW+F,SAAQ,SAAA1J,GACf1D,EAAKqtK,YAAY5oJ,KAAK,IAAI0e,GAAez/B,GAC5C,GAER,KAAA2D,EAAA,OAAAA,EAAA,EAAAxG,IAAA,OAAAia,IAED,WACI,OAAOd,KAAKkzJ,KACf,IAAArsK,IAAA,WAAAia,IAED,WACI,OAAOd,KAAKszJ,SACf,IAAAzsK,IAAA,aAAAia,IAED,WACI,OAAOd,KAAKqzJ,WACf,MAAAD,GAZA1pK,EAYAjD,UAAA4G,GAAA3D,CAAA,CAvBC,YAAA09B,GAAA19B,GAAA,OAAA09B,GAAA,mBAAAn6B,QAAA,iBAAAA,OAAA85E,SAAA,SAAAr9E,GAAA,cAAAA,CAAA,WAAAA,GAAA,OAAAA,GAAA,mBAAAuD,QAAAvD,EAAA5D,cAAAmH,QAAAvD,IAAAuD,OAAAxG,UAAA,gBAAAiD,CAAA,EAAA09B,GAAA19B,EAAA,UAAA6pK,GAAA7pK,EAAAoN,GAAA,OAAAy8J,GAAA/sK,OAAA4nI,gBAAA,SAAA1kI,EAAAoN,GAAA,OAAApN,EAAA8oD,UAAA17C,EAAApN,CAAA,EAAA6pK,GAAA7pK,EAAAoN,EAAA,UAAAowB,GAAAx9B,EAAAoN,GAAA,OAAAA,GAAA,WAAAswB,GAAAtwB,IAAA,mBAAAA,EAAA,SAAApN,GAAA,YAAAA,EAAA,UAAAwxC,eAAA,oEAAAxxC,CAAA,EAAAA,GAAAoN,CAAA,UAAA00B,GAAA9hC,GAAA,OAAA8hC,GAAAhlC,OAAA4nI,eAAA5nI,OAAAuC,eAAA,SAAAW,GAAA,OAAAA,EAAA8oD,WAAAhsD,OAAAuC,eAAAW,EAAA,EAAA8hC,GAAA9hC,EAAA,KCeN6oC,GAdM,SAAA7oC,IAAA,SAAAA,EAAAoN,GAAA,sBAAAA,GAAA,OAAAA,EAAA,UAAAu7C,UAAA,sDAAA3oD,EAAAjD,UAAAD,OAAA8D,OAAAwM,GAAAA,EAAArQ,UAAA,CAAAX,YAAA,CAAA0L,MAAA9H,EAAAo7H,UAAA,EAAAt9C,cAAA,KAAA1wE,GAAAy8J,GAAA7pK,EAAAoN,EAAA,EAAA9Q,EAAA0D,GAAA,IAAAoN,EAAAzJ,EAAAsJ,GAAAG,EAAA9Q,EAAAqH,EAAA,kCAAA45E,UAAAA,QAAAC,UAAA,YAAAD,QAAAC,UAAAmnD,KAAA,+BAAAC,MAAA,oBAAA9nB,QAAA//G,UAAAF,QAAAK,KAAAqgF,QAAAC,UAAAs/B,QAAA,6BAAA98G,GAAA,4BAAAA,EAAAiN,EAAA60B,GAAA10B,GAAA,GAAAzJ,EAAA,KAAArH,EAAAwlC,GAAA,MAAA1lC,YAAA4D,EAAAu9E,QAAAC,UAAAvwE,EAAA3O,UAAAhC,EAAA,MAAA0D,EAAAiN,EAAAyU,MAAA,KAAApjB,WAAA,OAAAk/B,GAAA,KAAAx9B,EAAA,GACF,SAAA1D,KAAA,SAAA0D,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAArsD,GACV,IAAM0D,EAAmB,CACrB6N,EAAA2iB,EAAAs7G,SAAwBj+H,EAAA2iB,EAAAu8G,MAAqBl/H,EAAA2iB,EAAAw8G,OAAsBn/H,EAAA2iB,EAAAy8G,IAAmBp/H,EAAA2iB,EAAA08G,UAAyBr/H,EAAA2iB,EAAA28G,oBAAmCt/H,EAAA2iB,EAAA+7G,UAAyB1+H,EAAA2iB,EAAA26G,iBAAgCt9H,EAAA2iB,EAAAjC,OAAsB1gB,EAAA2iB,EAAA48G,mBAAkCv/H,EAAA2iB,EAAA68G,eAA8Bx/H,EAAA2iB,EAAA88G,iBAAgCz/H,EAAA2iB,EAAA+8G,kBAAiC1/H,EAAA2iB,EAAAg9G,UAAyB3/H,EAAA2iB,EAAAi9G,cAA6B5/H,EAAA2iB,EAAAk9G,4BAA2C7/H,EAAA2iB,EAAAm9G,mBAAkC9/H,EAAA2iB,EAAAo9G,mBAAkC//H,EAAA2iB,EAAAo9G,mBAAiC,WAAY//H,EAAA2iB,EAAAs9G,sBAAqCjgI,EAAA2iB,EAAAw9G,qBAFnlB,OAAA/gI,EAAA/P,KAAA,KAKJ2Q,EAAA2iB,EAAA46G,eAA8BprI,EAAkB,CAClD,IAAIm9B,GAAQtvB,EAAA2iB,EAAA66G,eAA8BrrI,EAAkB,CACxD,IAAIm9B,GAAQtvB,EAAA2iB,EAAA+6G,mBAAkCvrI,MAGzD,QAAA1D,CAAA,CAXC,CAAoC6gC,IAAA,SAAAiF,GAAApiC,GAAA,OAAAoiC,GAAA,mBAAA7+B,QAAA,iBAAAA,OAAA85E,SAAA,SAAAr9E,GAAA,cAAAA,CAAA,WAAAA,GAAA,OAAAA,GAAA,mBAAAuD,QAAAvD,EAAA5D,cAAAmH,QAAAvD,IAAAuD,OAAAxG,UAAA,gBAAAiD,CAAA,EAAAoiC,GAAApiC,EAAA,UAAAqiC,GAAAriC,EAAAoN,GAAA,OAAAi1B,GAAAvlC,OAAA4nI,gBAAA,SAAA1kI,EAAAoN,GAAA,OAAApN,EAAA8oD,UAAA17C,EAAApN,CAAA,EAAAqiC,GAAAriC,EAAAoN,EAAA,UAAAm2B,GAAAvjC,EAAAoN,GAAA,OAAAA,GAAA,WAAAg1B,GAAAh1B,IAAA,mBAAAA,EAAA,SAAApN,GAAA,YAAAA,EAAA,UAAAwxC,eAAA,oEAAAxxC,CAAA,EAAAA,GAAAoN,CAAA,UAAAg2B,GAAApjC,GAAA,OAAAojC,GAAAtmC,OAAA4nI,eAAA5nI,OAAAuC,eAAA,SAAAW,GAAA,OAAAA,EAAA8oD,WAAAhsD,OAAAuC,eAAAW,EAAA,EAAAojC,GAAApjC,EAAA,KCc1CsjC,GAdM,SAAAtjC,IAAA,SAAAA,EAAAoN,GAAA,sBAAAA,GAAA,OAAAA,EAAA,UAAAu7C,UAAA,sDAAA3oD,EAAAjD,UAAAD,OAAA8D,OAAAwM,GAAAA,EAAArQ,UAAA,CAAAX,YAAA,CAAA0L,MAAA9H,EAAAo7H,UAAA,EAAAt9C,cAAA,KAAA1wE,GAAAi1B,GAAAriC,EAAAoN,EAAA,EAAA9Q,EAAA0D,GAAA,IAAAoN,EAAAzJ,EAAAsJ,GAAAG,EAAA9Q,EAAAqH,EAAA,kCAAA45E,UAAAA,QAAAC,UAAA,YAAAD,QAAAC,UAAAmnD,KAAA,+BAAAC,MAAA,oBAAA9nB,QAAA//G,UAAAF,QAAAK,KAAAqgF,QAAAC,UAAAs/B,QAAA,6BAAA98G,GAAA,4BAAAA,EAAAiN,EAAAm2B,GAAAh2B,GAAA,GAAAzJ,EAAA,KAAArH,EAAA8mC,GAAA,MAAAhnC,YAAA4D,EAAAu9E,QAAAC,UAAAvwE,EAAA3O,UAAAhC,EAAA,MAAA0D,EAAAiN,EAAAyU,MAAA,KAAApjB,WAAA,OAAAilC,GAAA,KAAAvjC,EAAA,GACF,SAAA1D,KAAA,SAAA0D,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAArsD,GACV,IAAM0D,EAAmB,CACrB6N,EAAA2iB,EAAAy6G,aAA4Bp9H,EAAA2iB,EAAAi6G,iBAAgC58H,EAAA2iB,EAAAk6G,cAFtD,OAAAz9H,EAAA/P,KAAA,KAKJ2Q,EAAA2iB,EAAAm7G,OAAsB3rI,EAAkB,CAC1C,IAAIm9B,GAAQtvB,EAAA2iB,EAAA46G,eAA8BprI,EAAkB,CACxD,IAAIm9B,GAAQtvB,EAAA2iB,EAAA66G,eAA8BrrI,MAGrD,QAAA1D,CAAA,CAXC,CAAyB6gC,ICK/B,SAAS+F,GAAWljC,GAEhBA,EAASA,GAAU,CAAC,EACpB,IAGIoN,EACAzJ,EACAsJ,EACA3Q,EACAJ,EAPE2R,EAAUyI,KAAK9V,QACf0M,EAAQlN,EAAO4V,MAuFrB,OARAxI,EAAW,CACP6jB,MArCJ,SAAejxB,GACX,IAAIoN,EACEH,EAAYjK,OAAOoxB,YAAY1U,MAIrC,KAFAtS,EAAW9Q,EAAUwrK,aAAa9nK,IAG9B,MAAM,IAAIwN,MAAM,+BAGpB,IAAMK,EAAW7K,OAAOoxB,YAAY1U,MAGhCtS,EAAS08J,QACT18J,EAAWA,EAAS08J,OAEPC,aACT38J,EAAS28J,YAAYrgK,SAAQ,SAAC1J,GAAD,OAAa9D,EAAWqsK,IAAIvoK,EAA5B,IAE7BoN,EAAS48J,iBACT58J,EAAS48J,gBAAgBtgK,SAAQ,SAAC1J,GAAD,OAAa9D,EAAWqsK,IAAIvoK,EAA5B,MAIrCoN,EAAWA,EAASs+H,IACpBxvI,EAAWqsK,IAAIn7J,IAGnB,IAAMF,EAAalK,OAAOoxB,YAAY1U,MAKtC,OAJA/b,EAAOmS,KAAK,kCAAoCjI,EAAWZ,GAAW0nI,YAAY,GAAK,oBAAsBznI,EAAaW,GAAU8mI,YAAY,GAAK,gBAAkBznI,EAAaD,GAAa,KAAM0nI,YAAY,GAAK,MAExNvnI,EAAS7K,SAAW,OAEb6K,CACV,EAIG68J,YA9CJ,WACI,OAAOh9J,CACV,EA6CGi9J,QA3CJ,WACI,OAAOhuK,CACV,GAhCGyH,EAASuJ,EAAMssH,UAAUpsH,GACzBH,EAAW,CACP,IAAIsvB,GACJ,IAAIQ,GACJ,IAAIO,GACJ,IAAIisI,GACJ,IAAI5uI,IAGRr+B,EAAY,IAAImsD,GAAK,CACjBy+G,YAAA,EACAT,gBAAiB,GACjBnB,gBAAiB,WACjBwB,cAAe,SACfF,kBAAA,EACAK,oBAAA,EACAd,YAAA,EACAI,SAAUt5J,IAGd/Q,EAAaqxD,GAAW1/C,GAASjN,OAAO,CACpCgoK,cAAe,IAAI//H,GACnBu/F,OAAQ,IAAI9kG,KAwDbl2B,CACV,CAED81B,GAAWy2F,sBAAwB,aACnC,IAAAx2F,GAAeh/B,EAAAqsB,EAAAyqG,gBAA6B/3F,IC5F5C,SAASmE,GAAernC,GAEpBA,EAASA,GAAU,CAAC,EACpB,IAMIoN,EACAzJ,EACAsJ,EACA3Q,EACA4Q,EAVE/I,EAAUmS,KAAK9V,QACf6C,EAAQrD,EAAO4V,MACfvR,EAAWrE,EAAOo5G,SAClBh1G,GAAA,EAAW4J,EAAAwiB,GAASrsB,GAASg1H,cAC7B70H,GAAA,EAAWic,EAAAiQ,GAASrsB,GAASg1H,cAQ/Br1H,EAAa9D,EAAOmqK,WACpBzmK,EAAa1D,EAAOq+I,WA6BxB,SAASvzI,EAAa9K,GAClBoE,EAASuwB,QAAQlxB,EAAA+sB,EAAAk1G,yBAAiC,CAAE4C,SAAUtoI,EAAMsoI,UACvE,CAED,SAAS55H,EAAa1O,GAClB,IAAIoN,EAAS,KAEb,OAAIpN,EAAKyI,QAAQ,yBAA2B,GAEpC3E,IACAsJ,EAAStJ,EAAWsmK,kBACpBtmK,EAAWumK,6BACXvmK,EAAWwmK,kBAERl9J,GACApN,EAAKyI,QAAQ,QAAU,GAAKzI,EAAKyI,QAAQ,UAAY,EACrD06B,GAAWh/B,GAASvD,OAAO,CAAEgV,MAAOvS,IAEpC+J,CAEd,CAwKD,OAPAA,EAAW,CACP4lB,KAhKJ,SAAchzB,GAAiD,IAA5CoN,EAA4C9O,UAAAjC,OAAA,YAAAiC,UAAA,GAAAA,UAAA,GAA1B,KAAMpC,EAAoBoC,UAAAjC,OAAA,YAAAiC,UAAA,GAAAA,UAAA,GAAN,KAE/CuP,EAAmB,IAAIgK,KACvB7J,EAAU,IAAIu7C,GAAYvpD,EAAKmW,EAAAD,EAAAurH,UAEjCr0H,IACAY,EAAQg6H,gBAAkB56H,GAG1BlR,IACA8R,EAAQi6H,YAAc/rI,GAGrB8R,EAAQ26I,mBACT36I,EAAQ26I,iBAAmB96I,GAG/BzJ,EAASuwB,QACLlxB,EAAA+sB,EAAAwqI,yBAAiC,CAC7Bt6J,QAAAsN,IAIRf,EAAU+lB,KAAK,CACXtyB,QAASsN,EACT0gD,QAAS,SAAUthD,EAAMH,EAAY/Q,GAIjC,IAAI2R,EACAG,EACA7J,EAJJ,GAAK7H,EAuBL,GAfIJ,GAAeA,IAAgB8D,GAC/BgO,EAAU1J,EAASimK,aAAaruK,GAChC2R,EAAY3R,IAKRoI,EAASyjI,WAAW/nI,KACpBA,EAAMsE,EAAS0B,QAAQhG,EAAKgD,OAAOC,SAASZ,OAGhD2L,EAAU1J,EAASimK,aAAavqK,IAIlB,cAAdiN,EAcJ,GAJe,OAAXC,IACAA,EAASwB,EAAatB,IAGX,OAAXF,EAAJ,CAYA5Q,EAAgBmsK,YAAYv7J,EAAO+8J,eACnC3tK,EAAgBosK,QAAQx7J,EAAOg9J,WAE/B,IACI/lK,EAAW+I,EAAO+jB,MAAM7jB,EAU3B,CATC,MAAOA,GAQL,YAPAhJ,EAASuwB,QAAQlxB,EAAA+sB,EAAAk1G,yBAAiC,CAC9C4C,SAAU,KACV98H,MAAO,IAAIwD,EAAAwhB,EACPta,EAAAskI,2CACAtkI,EAAA6lI,8CAAA,GAAAn8I,OAA0DI,KAIrE,CAED,GAAImE,EAAU,CAWV,GAVAA,EAAS/B,IAAMyL,GAAa7N,EAGvBmE,EAASqmK,cACVrmK,EAASqmK,YAAcrmK,EAAS/B,KAMhCiC,GACAA,EAAS+S,MAAMskH,UAAUU,mCACzBj4H,EAASymJ,2BACTzmJ,EAASokI,eAAelsI,OAAS,EAAG,CACpC,IAAMgH,EAAqBc,EAASokI,eAAer7G,QAAO,SAACltB,EAAeoN,GAAhB,OAA2BpN,EAAgBoN,EAAO4K,QAAlD,GAA4D,IACjHsd,MAAMjyB,IAAuBc,EAASymJ,0BAA4BvnJ,IACnEM,EAAO8I,KAAK,+GACZtI,EAASymJ,0BAA4BvnJ,EAE5C,CAEDc,EAASooJ,QAAUv+I,EACnB7J,EAASmjH,WAAa,IAAIzvG,KAC1Bvb,EAAgBksK,sBAAsBrkK,GAEtCC,EAASuwB,QAAQlxB,EAAA+sB,EAAAm1G,yBAAiC,CAAE8kC,iBAAkBr9J,GACzE,MACGhJ,EAASuwB,QAAQlxB,EAAA+sB,EAAAk1G,yBAAiC,CAC9C4C,SAAU,KACV98H,MAAO,IAAIwD,EAAAwhB,EACPta,EAAAskI,2CACAtkI,EAAA6lI,8CAAA,GAAAn8I,OAA0DI,KAnDrE,MARGoE,EAASuwB,QAAQlxB,EAAA+sB,EAAAk1G,yBAAiC,CAC9C4C,SAAU,KACV98H,MAAO,IAAIwD,EAAAwhB,EACPta,EAAAskI,2CACAtkI,EAAA6lI,8CAAA,GAAAn8I,OAA0DI,WAlBlEoE,EAASuwB,QACLlxB,EAAA+sB,EAAAk1G,yBAAiC,CAC7B4C,SAAU,MA2EzB,EACD98H,MAAO,SAAU4B,EAASzJ,EAAYsJ,GAClC7I,EAASuwB,QAAQlxB,EAAA+sB,EAAAk1G,yBAAiC,CAC9C4C,SAAU,KACV98H,MAAO,IAAIwD,EAAAwhB,EACPta,EAAAukI,2CACAvkI,EAAA8lI,8CAAA,GAAAp8I,OAA0DI,EAA1D,MAAAJ,OAAkEqN,KAG7E,GAER,EAsBG+hC,MApBJ,WACI5qC,EAASsuB,IAAIjvB,EAAA+sB,EAAA+2G,YAAoBz8H,EAAcsC,GAE3CtJ,GACAA,EAAWkrC,QAGX1yC,IACAA,EAAgB0yC,QAChB1yC,EAAkB,MAGlB2Q,IACAA,EAAU7C,QACV6C,EAAY,KAEnB,GA7MGtJ,EAASN,EAAMm2H,UAAUpsH,GACzBhJ,EAASguB,GAAG3uB,EAAA+sB,EAAA+2G,YAAoBz8H,EAAcsC,GAE9CH,EAAYygB,GAAUvpB,GAASvD,OAAO,CAClCy9I,WAAYr+I,EAAOq+I,WACnB/J,YAAat0I,EAAOs0I,YACpBsM,iBAAkB5gJ,EAAO4gJ,iBACzBmG,gBAAiB/mJ,EAAO+mJ,gBACxBrf,SAAUpjI,EACV0iJ,UAAW9qJ,EAAAs0B,EACXuiH,cAAellI,EAAA2iB,EACf0zG,OAAQhuH,EACRq8D,eAAgBvyE,EAAOo5G,SAAShiG,MAAMskH,UAAU6F,yBAGpDjlI,EAAkBktD,GAAgBrlD,GAASvD,OAAO,CAC9Cy9I,WAAY36I,EACZ4wI,YAAat0I,EAAOs0I,YACpBsM,iBAAkB5gJ,EAAO4gJ,iBACzBmG,gBAAiB/mJ,EAAO+mJ,gBACxB3tC,SAAUp5G,EAAOo5G,WAGrBlsG,EAAS,KA+LNE,CACV,CAEDi6B,GAAesyF,sBAAwB,iBAEvC,IACAlxF,GADgBtkC,EAAAqsB,EAAAyqG,gBAA6B5zF,ICpP7C,SAAShE,KAEL,IACMrjC,EAAUsW,KAAK9V,QACf4M,GAAA,EAAWY,EAAAwiB,GAASxwB,GAASm5H,cAanC,MAJW,CACP3tH,MAJJ,SAAexL,GACXoN,EAASunB,QAAQlxB,EAAA+sB,EAAAte,MAAc,CAAE1G,MAAOxL,GAC3C,EAMJ,CAEDqjC,GAAas2F,sBAAwB,eACrC,IAAA/xF,GAAezjC,EAAAqsB,EAAAopG,oBAAiCv2F,IAAAqF,GAAA/kC,EAAA,MCrDhD,SAASglC,KAEL,IAGI3oC,EACAoN,EACAzJ,EACAsJ,EACA3Q,EACAuR,EAREX,EAAUoJ,KAAK9V,QACf2D,GAAA,EAAW6J,EAAAwiB,GAAStjB,GAASisH,cA2DnC,SAAS90H,EAAyBrE,EAAMiN,GACpC,IAAKA,IAAaA,EAASs7H,gBAAqD,IAAnCt7H,EAASs7H,eAAelsI,OACjE,OAAOkF,QAAQyE,UAGnB,IAAM1J,EAAW,GAKjB,OAJA2Q,EAASs7H,eAAe7+H,SAAQ,SAACuD,GAC7B3Q,EAASykB,KAMjB,SAAkD/gB,EAAQiN,GACtD,OAAO,IAAI1L,SAAQ,SAACjF,GAEhB,GAAK0D,GAAWA,EAAOwoI,uBAAiE,IAAxCxoI,EAAOwoI,sBAAsBnsI,OAA7E,CAKA,IAAM6Q,EAAW,GACjBlN,EAAOwoI,sBAAsB9+H,SAAQ,SAAC1J,GAC9BoN,EAAQq/I,YAAYzsJ,EAAIiN,IACxBC,EAAS6T,KA4BzB,SAAuD/gB,EAAIiN,GACvD,OAAO,IAAI1L,SAAQ,SAACjF,GAEhB,GAAK0D,EAAGyoI,wBAA+D,IAArCzoI,EAAGyoI,uBAAuBpsI,OAA5D,CAKA,IAAM6Q,EAAW,GACXc,EAAiB,GAEvBhO,EAAGyoI,uBAAuB/+H,SAAQ,SAACpN,EAAKuR,GACpC,IAAMpK,EAAQ2J,EAAQqgJ,SAASztJ,EAAI6N,GAAA,GAC7B1J,EAsBlB,SAA8BnE,EAAMoN,EAAKzJ,GACrC,OAAQ3D,GACJ,KAAK9D,EAAAs0B,EAAAi7C,MACD,OASZ,SAAmCzrE,EAAKoN,GAMpC,MAAO,CACHmY,MAAAnY,EACA/H,MAPUrF,EAAIqF,OAAS,KAQvBC,OAPWtF,EAAIsF,QAAU,KAQzBk9B,UAPcxiC,EAAIk7B,WAAa,KAQ/B7M,QAPYruB,EAAI0oI,WAAa,KASpC,CAbD,CAT6Ct7H,EAAKzJ,GAC1C,KAAKzH,EAAAs0B,EAAA3B,MACD,OAsBZ,SAAmC7uB,EAAKoN,GACpC,IAAMzJ,EAAa3D,EAAI0qK,mBAAqB,KAG5C,MAAO,CACHnlJ,MAAAnY,EACAihB,QAJYruB,EAAI0oI,WAAa,KAK7B9vF,WAAAj1C,EAEP,CATD,CAtB6CyJ,EAAKzJ,GAC1C,QACI,OAAO,KAGlB,CAVD,CAtBgDsJ,EAAM3Q,EAAKmH,GAE/CuK,EAAe+S,KAAK5c,GACpB+I,EAAS6T,KAAKpd,EAAagnK,cAAcxmK,EAAQ8I,GACpD,IAED1L,QAAQF,IAAI6L,GACP81B,MAAK,SAAC51B,GACHpN,EAAGyoI,uBAAyBzoI,EAAGyoI,uBAAuBpxH,QAAO,SAACrX,EAAG2D,GAI7D,OAHKyJ,EAAUzJ,IACXkK,EAAO+H,MAAP,kBAAAhW,OAA+BoO,EAAerK,GAAG4hB,MAAjD,oBAEGnY,EAAUzJ,EACpB,IACDrH,GACH,IATL2mC,OAUW,WACH3mC,GACH,GAzBJ,MAFGA,GA4BP,GACJ,CAjCD,CA5B4E0D,EAAIiN,GAEvE,IAED1L,QAAQF,IAAI6L,GACP81B,MAAK,WACFhjC,EAAOwoI,sBAAwBxoI,EAAOwoI,sBAAsBnxH,QAAO,SAACrX,GAChE,IAAMoN,EAAYpN,EAAGyoI,wBAA0BzoI,EAAGyoI,uBAAuBpsI,OAAS,EASlF,OAPK+Q,IACDjJ,EAASwwB,QAAQlxB,EAAA+sB,EAAAo6I,uCAA+C,CAC5DC,cAAe7qK,IAEnB6N,EAAOpB,KAAP,0EAGGW,CACV,IAED9Q,GACH,IAhBL2mC,OAiBW,WACH3mC,GACH,GA5BJ,MAFGA,GA+BP,GAEJ,CArCD,CAN+D2Q,EAAQjN,GAClE,IAEMuB,QAAQF,IAAI/E,EACtB,CAmLD,OAPA0D,EAAW,CACPu3I,UArOJ,SAAmBv3I,GACVA,IAIDA,EAAOmzG,UACP/lG,EAAUpN,EAAOmzG,SAGjBnzG,EAAOu8H,eACP54H,EAAe3D,EAAOu8H,cAGtBv8H,EAAOo5G,WACPnsG,EAAWjN,EAAOo5G,UAGlBp5G,EAAOsgK,wBACPhkK,EAAwB0D,EAAOsgK,uBAGtC,EAiNGrB,0BA/MJ,SAAmCj/J,GAC/B,OAAO,IAAIuB,SAAQ,SAAC2L,GAChB,IAAMc,EAAW,GAEjBA,EAAS+S,KAAK1c,EAAyBnI,EAAAs0B,EAAAi7C,MAAiBzrE,IACxDgO,EAAS+S,KAAK1c,EAAyBnI,EAAAs0B,EAAA3B,MAAiB7uB,IAExDuB,QAAQF,IAAI2M,GACPg1B,MAAK,WACE/1B,EAASmK,MAAMskH,UAAUa,aAAaC,sCA0I1D,SAA+Cx8H,GAEtCA,GAAaA,EAASuoI,gBAAqD,IAAnCvoI,EAASuoI,eAAelsI,QAIrE2D,EAASuoI,eAAe7+H,SAAQ,SAAC1J,GAC7BA,EAAOwoI,sBAAwBxoI,EAAOwoI,sBAAsBnxH,QAAO,SAACrX,GAEhE,OAAKA,EAAGyoI,wBAA+D,IAArCzoI,EAAGyoI,uBAAuBpsI,SAI5D2D,EAAGyoI,uBAAyBzoI,EAAGyoI,uBAAuBpxH,QAAO,SAACrX,GAC1D,IAAMiN,EAAsBG,EAAQwiJ,wCAAwC5vJ,GAE5E,GAAIiN,GAAuBA,EAAoB5Q,OAAS,EAEpD,IADA,IAAIC,EAAI,EACDA,EAAI2Q,EAAoB5Q,QAAQ,CACnC,IAAKsH,EAAamnK,0BAA0B79J,EAAoB3Q,IAE5D,OADAuR,EAAO+H,MAAM,6CAA+C3I,EAAoB3Q,GAAGy+C,cAAA,EAGvFz+C,GAAK,CACR,CAGL,OAAO,CACV,IAEM0D,EAAGyoI,wBAA0BzoI,EAAGyoI,uBAAuBpsI,OAAS,EAC1E,GACJ,GAEJ,CAlCD,CAzI0D2D,GA6K1D,SAA6BA,GACzB,IAAMoN,EAA4B9Q,EAAsByuK,+BACnD39J,GAAkE,IAArCA,EAA0B/Q,QAAiB2D,GAAaA,EAASuoI,gBAAqD,IAAnCvoI,EAASuoI,eAAelsI,QAI7I2D,EAASuoI,eAAe7+H,SAAQ,SAAC1J,GAC7BA,EAAOwoI,sBAAwBxoI,EAAOwoI,sBAAsBnxH,QAAO,SAACrX,GAEhE,OAAKA,EAAGyoI,wBAA+D,IAArCzoI,EAAGyoI,uBAAuBpsI,SAI5D2D,EAAGyoI,uBAAyBzoI,EAAGyoI,uBAAuBpxH,QAAO,SAACrX,GAC1D,OAAQoN,EAA0Bwf,MAAK,SAAAxf,GAAY,OAAKA,EAAapN,EAAlB,GACtD,IAEMA,EAAGyoI,wBAA0BzoI,EAAGyoI,uBAAuBpsI,OAAS,EAC1E,GACJ,GACJ,CApBD,CA3KoC2D,GACpBkN,GACH,IAPL+1B,OAQW,WACH/1B,GACH,GACR,GACJ,GA7CGW,GAAA,EAASxK,EAAAmtB,GAAMtjB,GAASisH,cAAcK,UAAUx5H,GA8O7CA,CACV,CAED2oC,GAAmBgxF,sBAAwB,qBAC3C,IAAA/wF,GAAezkC,EAAAqsB,EAAAopG,oBAAiCjxF,ICzNhDoB,GAVI,SAAA/pC,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAA3oD,GACVsW,KAAKlJ,EAAI,KACTkJ,KAAK00J,KAAO,KACZ10J,KAAKqf,MAAQ,KACbrf,KAAK2B,GAAK,KACV3B,KAAKpJ,EAAI,KACToJ,KAAKrJ,EAAI,IACZ,ECJL,SAAS48B,KAEL,IACI7pC,EA0CJ,MALW,CACPqqI,WA/BJ,SAAoBj9H,GAGhB,GAFApN,EAAoB,IAAI+pC,IAEnB38B,EAAK,OAAO,KAEjB,IAAMzJ,EAAYyJ,EAAI3E,QAAQ,KAC9B,IAAmB,IAAf9E,EAEA,IADA,IAAMsJ,EAAYG,EAAIgjH,OAAOzsH,EAAY,GAAG0K,MAAM,KACzC/R,EAAI,EAAGJ,EAAM+Q,EAAU5Q,OAAQC,EAAIJ,IAAOI,EAAG,CAClD,IAAMuR,EAAWZ,EAAU3Q,GACrB4Q,EAAaW,EAASpF,QAAQ,KACpC,IAAoB,IAAhByE,EAAmB,CACnB,IAAMc,EAAMH,EAASM,UAAU,EAAEjB,GAC7BlN,EAAkB/C,eAAe+Q,KACjChO,EAAkBgO,GAAOH,EAASuiH,OAAOljH,EAAa,GAE7D,CACJ,CAER,EAaG0xJ,mBANJ,WACI,OAAO5+J,CACV,EAQJ,CAED6pC,GAAiB8vF,sBAAwB,mBACzC,IAAAzuF,GAAe/mC,EAAAqsB,EAAAopG,oBAAiC/vF,ICrDhD,SAASa,KAEL,IAII1qC,EAJAoN,EAAUkJ,KAAK9V,QACfmD,GAAA,EAAWqK,EAAAwiB,GAASpjB,GAAS+rH,cAqBjC,MALW,CACPp7C,SAZJ,WACI,OAAO/9E,CACV,EAWGg+E,SATJ,SAAkB5wE,GACdpN,EAAWoN,EACPA,GACAzJ,EAASgxB,QAAQlxB,EAAA+sB,EAAA1gB,gBAAwB,CAAE1J,KAAMgH,GAExD,EAQJ,CAEDs9B,GAAcivF,sBAAwB,gBACtC,IAAAhvF,GAAexmC,EAAAqsB,EAAAopG,oBAAiClvF,ICrB1CY,IAAmC,GASzC,SAASE,KAEL,IAAIxrC,EACAoN,EACAzJ,EACAsJ,EAEE3Q,EAAUga,KAAK9V,QACftE,GAAA,EAAWgd,EAAAsX,GAASl0B,GAAS68H,cAqBnC,SAAStrH,EAAuB7N,EAAM2D,GAClC,OAAI2xB,MAAMt1B,GAAc,EACpBA,EAAO,GACH2D,GACAyJ,EAAOX,KAAP,gKAEG,GAEPzM,EAAOsrC,IACH3nC,GACAyJ,EAAOX,KAAP,yEAAA7M,OAAqF0rC,GAArF,MAAA1rC,QAAyH,GAAzH,sBAEG0rC,IAEJtrC,CACV,CAQD,SAASkN,EAAuBlN,EAAM2D,GAClC,OAAI2xB,MAAMt1B,GAAc,EACpBA,EAAO,GACH2D,GACAyJ,EAAOX,KAAP,gKAEG,GAEPzM,EApE4B,GAqExB2D,GACAyJ,EAAOX,KAAP,yEAAA7M,OAtEwB,EAsExB,MAAAA,OAAyH,IAAzH,sBAtEwB,GA0EzBI,CACV,CAuGD,SAASgO,IACL,IAAIhO,EAAmB9D,EAASkb,MAAMskH,UAAUr6G,OAAO28G,iBAAmB,EAAI9hI,EAASkb,MAAMskH,UAAUr6G,OAAO28G,iBAAmB9hI,EAASkb,MAAMskH,UAAUr6G,OAAOm8G,kBA1L7H,GADZ,GA4LlBpwH,EAAYzJ,EAAmB+0I,eAErC,OAAQpjH,MAAMloB,IAAcA,EAAY,EAAIwB,KAAK+M,IAAI3b,EAAkBoN,GAAapN,CACvF,CA0CD,OAfAA,EAAW,CACPkhK,mBAlIJ,WACI,IAAK5rI,MAAMp5B,EAASkb,MAAMskH,UAAU6E,YAAYC,WAAatkI,EAASkb,MAAMskH,UAAU6E,YAAYC,SAAW,EACzG,OAAOtkI,EAASkb,MAAMskH,UAAU6E,YAAYC,SAGhD,IAAMxgI,EAA6BiN,EAA6BqrI,gCAChE,OAAIt4I,GAA8BA,EAA2BugI,cAAgBjrG,MAAMt1B,EAA2BugI,YAAYC,WAAaxgI,EAA2BugI,YAAYC,SAAW,EAC9KxgI,EAA2BugI,YAAYC,SA5FxB,EAgG7B,EAwHGsgC,sBApFJ,WACI,OAAqD,OAAjD5kK,EAASkb,MAAMskH,UAAU6E,YAAYtgE,QAC9B/jE,EAASkb,MAAMskH,UAAU6E,YAAYtgE,QAGzCt8D,EAAmBo0I,gCAC7B,EA+EGwJ,oBAAAvzI,EACAwwJ,sBAlDJ,WACI,IAAMx+J,EAAqB9D,EAASkb,MAAMskH,UAAUr6G,OAAO08G,mBAE3D,OAAIzoG,MAAMt1B,IAAuBA,EAAqB,EAC3C,EAGJ4O,KAAK+M,IAAI3N,IAAuBhO,EAC1C,EA2CG8zJ,wBAzBJ,SAAiC9zJ,GAC7B,IAAMoN,EAA4BkoB,MAAMp5B,EAASkb,MAAMskH,UAAUwG,cAAc+oC,0BApMnD,EAoM+E/uK,EAASkb,MAAMskH,UAAUwG,cAAc+oC,yBAElJ,OAAOtnK,EAAmBm0I,2BAA6B57I,EAASkb,MAAMskH,UAAUwG,cAAcliI,GAAQoN,EAA2BlR,EAASkb,MAAMskH,UAAUwG,cAAcliI,EAC3K,EAsBG+zJ,yBAfJ,SAAkC/zJ,GAC9B,IAAMoN,EAA6BkoB,MAAMp5B,EAASkb,MAAMskH,UAAU8F,eAAe0pC,2BAhNpD,GAgNiFhvK,EAASkb,MAAMskH,UAAU8F,eAAe0pC,0BAEtJ,OAAOvnK,EAAmBm0I,2BAA6B57I,EAASkb,MAAMskH,UAAU8F,eAAexhI,GAAQoN,EAA4BlR,EAASkb,MAAMskH,UAAU8F,eAAexhI,EAC9K,EAYGghK,wBAtHJ,SAAiChhK,GAC7B,IAAMoN,EAAuBlR,EAASkb,MAAMskH,UAAU6E,YAAY1mG,aAElE,IAAIvE,MAAMloB,EAAqBuO,OAAS2Z,MAAMloB,EAAqBwO,KAC/D,MAAO,CACHD,IAAK9N,EAAsBT,EAAqBuO,IAAK3b,GACrD4b,IAAK1O,EAAsBE,EAAqBwO,IAAK5b,IAI7D,IAAM2D,EAA6BsJ,EAA6BqrI,gCAChE,GAAI30I,GAA8BA,EAA2B48H,eAAiBjrG,MAAM3xB,EAA2B48H,YAAY1mG,aAAale,OAAS2Z,MAAM3xB,EAA2B48H,YAAY1mG,aAAaje,MAAO,CAC9M,IAAMtf,EAAiBqH,EAA2B48H,YAAY1mG,aAC9D,MAAO,CACHle,IAAK9N,EAAsBvR,EAAeqf,IAAK3b,GAC/C4b,IAAK1O,EAAsB5Q,EAAesf,IAAK5b,GAEtD,CAED,MAAO,CACH2b,KA1H8B,GA2H9BC,IA1H8B,GA4HrC,EAgGGuvJ,uBA7EJ,SAAgCnrK,EAAOoN,GACnC,IACI,IAAMzJ,EAAUzH,EAASkb,MAAMskH,UAAUyG,IAAIniI,GAAOoN,GACpD,IAAIkoB,MAAM3xB,KAAyB,IAAbA,EAClB,OAAOA,EAGX,IAAMrH,EAA6B2Q,EAA6BqrI,gCAChE,OAAGh8I,GAA8BA,EAA2B0D,KAAWs1B,MAAMh5B,EAA2B0D,GAAOoN,IACpG9Q,EAA2B0D,GAAOoN,IAGrC,CAIX,CAFD,MAAMpN,GACF,OAAQ,CACX,CACJ,EA6DGu3I,UArMJ,SAAmBv3I,GACXA,EAAOw+I,qBACP76I,EAAqB3D,EAAOw+I,oBAE5Bx+I,EAAOw3I,+BACPvqI,EAA+BjN,EAAOw3I,6BAE7C,EA+LGxoG,MAbJ,WACC,GA7LG5hC,GAAA,EAAS/J,EAAAmtB,GAAMl0B,GAAS68H,cAAcK,UAAUx5H,GA8M7CA,CACV,CAEDwrC,GAAiBmuF,sBAAwB,mBACzC,IAAApuF,GAAepnC,EAAAqsB,EAAAopG,oBAAiCpuF,IAAAC,GAAA9nC,EAAA,MC9OhD,SAASoyC,GAAa/1C,GAGlB,IACMoN,GAFNpN,EAASA,GAAU,CAAC,GAESy0E,cACvB9wE,EAAgB3D,EAAOorK,cACvBn+J,EAAuBjN,EAAOqrK,qBAC9B/uK,EAAiB0D,EAAOsrK,eACxBpvK,EAAqB8D,EAAOurK,sBAC5B19J,EAAS7N,EAAOwrK,UAChBt+J,EAAOlN,EAAOyrK,WACdz9J,EAAqBhO,EAAO0rK,gBAAkB1rK,EAAO0rK,gBAAgBtkB,wBAA0B,KAC/F3jJ,EAAqBzD,EAAO0rK,gBAAkB1rK,EAAO0rK,gBAAgBpkB,wBAA0B,KAC/FnjJ,EAAanE,EAAOy3I,WAAaz3I,EAAOy3I,WAAa,KAY3D,SAASp0I,IACL,OAAOI,EAAqBA,EAAmB4lI,UAAY,IAC9D,CAyDD,MAhBW,CACPsiC,aAtDJ,WACI,IAAM3rK,EAAYqD,IAClB,OAAOrD,EAAYA,EAAU/B,KAAO,IACvC,EAoDGkqJ,aAAA9kJ,EACAuoK,wBAtBJ,WACI,OAAO3+J,CACV,EAqBG4+J,kBAnBJ,WACI,OAAOvvK,CACV,EAkBGwvK,iBAhCJ,WACI,OAAOnoK,CACV,EA+BGwmI,cAtDJ,WACI,IAAMnqI,EAAYqD,IAClB,OAAOrD,EAAYA,EAAU2nI,WAAa,IAC7C,EAoDGyf,sBA1CJ,WACI,OAAOp5I,CACV,EAyCG+9J,iBAvCJ,WACI,OAAO3+J,CACV,EAsCGk6I,sBAhDJ,WACI,OAAO7jJ,CACV,EA+CG8nK,sBArBJ,WACI,OAAOrvK,CACV,EAoBGsvK,UAnBJ,WACI,OAAO39J,CACV,EAkBG49J,WAhBJ,WACI,OAAOv+J,CACV,EAeG8+J,cApCJ,WACI,OAAO7nK,CACV,EAsCJ,CAED4xC,GAAa4jF,sBAAwB,eACrC,IAAA3tF,GAAe7nC,EAAAqsB,EAAAyqG,gBAA6BllF,IAAAhK,GAAApoC,EAAA,MCrF5C,SAASgoC,KACL,IAAI3rC,EAAiB,GACjBoN,EAAY,GA0ChB,MAAO,CACH2T,KAzCJ,SAAcpd,GACNA,EAAcsoK,WAAalgI,GAAAvb,EAAA07I,YAC3BvoK,EAAcsoK,SAAWtoK,EAAcwoK,UAEtCnsK,EAAe2D,EAAcwoK,YAC9BnsK,EAAe2D,EAAcwoK,UAAY,CAACC,QAAS,EAAGC,MAAO,EAAGC,SAAU,IAI9E,IAAIr/J,EAAYtJ,EAAcsoK,SAAWtoK,EAAcwoK,SACnD7vK,EAAQ2Q,EAAY,EAAK,EAAI,EAC7B/Q,EAAWI,GAAQ2Q,EAAY,EAC/BY,EAASvR,EAAO,EAAI,EAWxB,GARA0D,EAAe2D,EAAcwoK,UAAUE,OAAS/vK,EAChD0D,EAAe2D,EAAcwoK,UAAUG,UAAYpwK,EACnD8D,EAAe2D,EAAcwoK,UAAUC,SAAWv+J,EAGlDT,EAAU2T,KAAK,CAACwrJ,IAAK5oK,EAAcwoK,SAAUK,OAAQ3+J,EAAQ4+J,KAAMnwK,EAAMgwK,SAAUpwK,IAG9EkR,EAAU/Q,OA7Bc,EA6B0B,CACnD,IAAI6Q,EAAiBE,EAAUmZ,QAC/BvmB,EAAekN,EAAeq/J,KAAKF,OAASn/J,EAAeu/J,KAC3DzsK,EAAekN,EAAeq/J,KAAKD,UAAYp/J,EAAeo/J,SAC9DtsK,EAAekN,EAAeq/J,KAAKH,SAAWl/J,EAAes/J,MAChE,CACJ,EAaGE,kBAXJ,WACI,OAAO1sK,CACV,EAUGgvC,MARJ,WACIhvC,EAAiB,GACjBoN,EAAY,EACf,EAOJ,CAEDu+B,GAAqBguF,sBAAwB,uBAC7C,IACA9tF,GADgB1nC,EAAAqsB,EAAAyqG,gBAA6BtvF,ICtF7C,SAASD,KAEL,IAAI1rC,EAAS,CAAC,EACVoN,EAAoB,CAAC,EACrBzJ,EAAkB,CAAC,EAsDvB,MAAO,CACHod,KArDJ,SAAc9T,EAAU3Q,EAAOJ,GAE3B,GAAKI,EAAL,CAIK0D,EAAOiN,KACRjN,EAAOiN,GAAY,GACnBG,EAAkBH,GAAY,EAC9BtJ,EAAgBsJ,GAAY,GAGhC,IAAIY,EAAqB3R,GAAmBA,EAAgB6pE,mBAAqB7pE,EAAgB6pE,mBAAqB,EAClH74D,EAAmBhR,GAAmBA,EAAgB4pE,iBAAmB5pE,EAAgB4pE,iBAAmB,EAE5G93D,EAAwBH,EAAqBT,EAAkBH,GACnEG,EAAkBH,GAAYY,EAE9B,IAAIpK,EAAsByJ,EAAmBvJ,EAAgBsJ,GAC7DtJ,EAAgBsJ,GAAYC,EAE5B,IAAM/I,EAAUnE,EAAOiN,GAClBqoB,MAAMh5B,KACF6H,EAAQ7H,IAGT6H,EAAQ7H,GAAOypE,oBAAsB/3D,EACrC7J,EAAQ7H,GAAOwpE,kBAAoBriE,GAHnCU,EAAQ7H,GAAS,CAAEypE,mBAAoB/3D,EAAuB83D,iBAAkBriE,GApBvF,CA0BJ,EAwBGkpK,gBAtBJ,SAAyBv/J,GACrB,OAAOpN,EAAOoN,EACjB,EAqBGw/J,eAnBJ,SAAwB3/J,GACpB,WACWjN,EAAOiN,UACPG,EAAkBH,UAClBtJ,EAAgBsJ,EAG1B,CAFC,MAAOjN,GAER,CACJ,EAYGgvC,MAVJ,WACIhvC,EAAS,CAAC,EACVoN,EAAoB,CAAC,EACrBzJ,EAAkB,CAAC,CACtB,EAQJ,CAED+nC,GAAqBiuF,sBAAwB,uBAC7C,IACAxsF,GADgBhpC,EAAAqsB,EAAAyqG,gBAA6BvvF,IC9B7C,SAASsB,GAAkBhtC,GACvB,IAmBIoN,EACAzJ,EACAsJ,EACA3Q,EACAuR,EAvBEX,EAAUoJ,KAAK9V,QAgBfiD,GAfNzD,EAASA,GAAU,CAAC,GAeIo5G,SAClBj1G,GAAA,EAAW6J,EAAAwiB,GAAStjB,GAASisH,cA+FnC,SAAS91H,EAAmBrD,EAASoN,EAAOzJ,EAAQsJ,GAMhD,IAAM3Q,EAAYsS,KAAK+U,IAAI,GAAKhgB,EAASsJ,EAAS4/J,MAClD7sK,EAAQ8sK,cAAgB,EAAIxwK,GAAa8Q,EAAQ9Q,EAAY0D,EAAQ8sK,aAErE,IAAM5wK,EAAY0S,KAAK+U,IAAI,GAAKhgB,EAASsJ,EAAS8/J,MAClD/sK,EAAQgtK,cAAgB,EAAI9wK,GAAakR,EAAQlR,EAAY8D,EAAQgtK,aAErEhtK,EAAQitK,aAAetpK,CAC1B,CAkCD,SAASS,EAAWpE,EAAckN,EAAWc,GAEzC,OAAOvK,EAAS2T,MAAMskH,UAAUyG,IAAIC,sBAAwBlmI,EAAAs0B,EAAA6xG,8BAkBhE,SAAwBriI,EAAcoN,GAClC,IAAMzJ,EAAW3D,EAAe6N,EAAaq/J,mBAAqBr/J,EAAas/J,gBACzEjxK,EAAU8D,EAAeiN,EAAmBG,GAAa9Q,EAAgB8Q,GAE/E,IAAKlR,GAAWA,EAAQ+wK,aAAe,EACnC,OAAOt5H,IAIX,IAAMzmC,EAAehR,EAAQ4wK,cAAgB,EAAIl+J,KAAK+U,IAAI,GAAKznB,EAAQ+wK,YAActpK,EAASkpK,OACxF7+J,EAAe9R,EAAQ8wK,cAAgB,EAAIp+J,KAAK+U,IAAI,GAAKznB,EAAQ+wK,YAActpK,EAASopK,OAC9F,OAAO/sK,EAAe4O,KAAK+M,IAAIzO,EAAcc,GAAgBY,KAAKgN,IAAI1O,EAAcc,EACvF,CAZD,CAjBuBhO,EAAckN,GAGrC,SAAiClN,EAAciN,EAAW3Q,GACtD,IAAMJ,EAvCV,SAAuB8D,EAAciN,EAAW3Q,GAC5C,IAAIJ,EACA2R,EAUJ,GARI7N,GACA9D,EAAMkR,EAAeH,GACrBY,EAAavR,EAjIyB,EACD,IAkIrCJ,EAAMyH,EAAYsJ,GAClBY,EAlI8B,GAqI7B3R,GAEE,GAAI2R,GAAc3R,EAAIG,OACzBwR,EAAa3R,EAAIG,YACd,GAAI2D,EAEP,IAAK,IAAIkN,EAAI,EAAGA,EAAIW,IAAcX,EAAG,CACjC,IAAMc,EAAQ9R,EAAIA,EAAIG,OAAS6Q,GAAKhR,EAAIA,EAAIG,OAAS6Q,EAAI,GACzD,IAAIc,GA3IkB,KA2IoBA,GAAS,EA5I7B,OA6IlBH,GAAc,KACK3R,EAAIG,OACnB,KAGX,OAbDwR,EAAa,EAgBjB,OAAOA,CACV,CA9BD,CAuCqC7N,EAAciN,EAAW3Q,GAEtDuR,GADS7N,EAAeoN,EAAiBzJ,GAC9BsJ,GAEf,OAAmB,IAAf/Q,GAAqB2R,GAAsB,IAAfA,EAAIxR,QAIpCwR,EAAMA,EAAI6I,OAAOxa,IAENgxB,QAAO,SAACltB,EAAOoN,GAAR,OAAiBpN,EAAQoN,CAAzB,IAAiCS,EAAIxR,OAL5Cs3C,GAMd,CAZD,CAH0E3zC,EAAckN,EAAWc,EAClG,CA8BD,SAAS1J,EAAqBtE,EAAWoN,GACrC,OAAOhJ,GAAA,EAAiBpE,EAAWoN,EACtC,CAcD,SAAStJ,EAA0B9D,GAC/BoN,EAAepN,GAAaoN,EAAepN,IAAc,GACzD2D,EAAY3D,GAAa2D,EAAY3D,IAAc,GACnDiN,EAAmBjN,GAAaiN,EAAmBjN,IAAc,CAC7D8sK,aAAc,EACdE,aAAc,EACdC,YAAa,GAEjB3wK,EAAgB0D,GAAa1D,EAAgB0D,IAAc,CAAE8sK,aAAc,EAAGE,aAAc,EAAGC,YAAa,EAC/G,CAUD,SAASvpK,IACL0J,EAAiB,CAAC,EAClBzJ,EAAc,CAAC,EACfsJ,EAAqB,CAAC,EACtB3Q,EAAkB,CAAC,CACtB,CAED,IAAMwO,EAAW,CACbiW,KA/LJ,SAAc/gB,EAAWkN,EAAac,GAClC,GAAKd,EAAYyI,OAAUzI,EAAYyI,MAAMtZ,OAA7C,CAIA,IAGI+H,EAHEE,EAA6B4I,EAAYkgK,UAAUt1J,UAAY5K,EAAYmgK,SAASv1J,WAAc,EAClGpU,EAA8BwJ,EAAYogK,SAASx1J,UAAY5K,EAAYkgK,UAAUt1J,WAAc,EACnGhN,EAAgBoC,EAAYyI,MAAMuX,QAAO,SAACltB,EAAGoN,GAAJ,OAAUpN,EAAIoN,EAAEjR,EAAE,EAAlB,GAAsB,GACtCuS,EAAa,EAa5C,GAL8B,KAL1BtK,EADA8I,EAAYqgK,iBAAmBrgK,EAAYqgK,kBAAoBrxK,EAAAs0B,EAAAwjI,kBAAAC,MACvC/mJ,EAAYyI,MAAMuX,QAAO,SAACltB,EAAGoN,GAAJ,OAAUpN,EAAIoN,EAAE/I,CAAhB,GAAmB,GAE5C2J,EAAqBtK,EAA6BY,EAA4BZ,KAItGgL,EAAaE,KAAKwU,MAAO,EAAItY,EAAiB1G,IAI9C8I,EAAY62H,KAAM,CAClB,IAAM1+G,EAAMnY,EAAY62H,KAAKuuB,SAAWplJ,EAAY62H,KAAKuuB,QAAQkb,IAAMtgK,EAAY62H,KAAKuuB,QAAQkb,IAAM,KACtG,GAAInoJ,EAAK,CAEL,IAAMjP,EAAiB3S,EAAS2T,MAAMskH,UAAUqI,KAAK5B,IAAI8B,eACrD7tH,EAAiB,GAAKA,GAAkB,IACxC1H,EAAcA,GAAc,EAAI0H,GAAoBiP,EAAMjP,EAEjE,CACJ,CAID,GAFAtS,EAA0B9D,GAxC9B,SAA0BA,EAAWoN,EAAWzJ,GAC5C,OAAI3D,IAAc9D,EAAAs0B,EAAAi7C,MACP9nE,EAAiBF,EAAS2T,MAAMskH,UAAUqF,oBAAoB7kI,EAAAs0B,EAAAi7C,OAC9DzrE,IAAc9D,EAAAs0B,EAAA3B,MACdlrB,EAAiBF,EAAS2T,MAAMskH,UAAUqF,oBAAoB7kI,EAAAs0B,EAAA3B,YAAA,CAE5E,CAND,CA0CyB7uB,EAAW,EAA2B0D,GAA6B,CACpF,GAAI0J,EAAepN,GAAW3D,OAAS,IAAM+Q,EAAepN,GAAWytK,iBAGnE,OAGArgK,EAAepN,GAAWytK,kBAAA,CAEjC,MAAUrgK,EAAepN,IAAcoN,EAAepN,GAAWytK,kBAoItE,SAAmCztK,UACxBoN,EAAepN,UACf2D,EAAY3D,UACZiN,EAAmBjN,UACnB1D,EAAgB0D,GACvB8D,EAA0B9D,EAC7B,CAND,CAlIkCA,GAG9BoN,EAAepN,GAAW+gB,KAAKrS,GAC/BvK,EAASwwB,QAAQtwB,EAAAmsB,EAAAyqI,8BAAiD,CAC9DP,WAAAhsJ,EACA6rH,UAAAv6H,EACA00J,YAAAxnJ,IAEAE,EAAepN,GAAW3D,OAhGD,IAiGzB+Q,EAAepN,GAAWumB,QAG9B5iB,EAAY3D,GAAW+gB,KAAKzc,GACxBX,EAAY3D,GAAW3D,OArGE,IAsGzBsH,EAAY3D,GAAWumB,QAG3BljB,EAAmB4J,EAAmBjN,GAAY0O,EAAY,KAAQhL,EAA4BmK,EAAaq/J,oBAC/G7pK,EAAmB/G,EAAgB0D,GAAYsE,EAA2B,EAAGuJ,EAAas/J,gBA7DzF,CA8DJ,EA+HGpnB,qBAAAzhJ,EACAmtJ,yBAzCJ,SAAkCzxJ,EAAWoN,GACzC,IAAIzJ,EAAUW,EAAqBtE,EAAWoN,GAI9C,OAHKkoB,MAAM3xB,KACPA,GAAWF,EAAS2T,MAAMskH,UAAUyG,IAAIc,uBAErCt/H,CACV,EAoCG+pK,kBAlCJ,SAA2B1tK,GACvB,OAAOoE,GAAA,EAAkBpE,EAC5B,EAiCGgvC,MAAAtrC,GAIJ,OA1NImK,EAAe,CACXq/J,mBAAoB,CAChBL,KAhBmC,EAiBnCE,KAlBmC,GAoBvCI,gBAAiB,CAAEN,KAjBe,EAiB0BE,KAlB1B,IAqBtCrpK,IAkNGoH,CACV,CAEDkiC,GAAkB2sF,sBAAwB,oBAC1C,IAAAzrF,GAAe/pC,EAAAqsB,EAAAyqG,gBAA6BjuF,IC3O5C,SAAS4G,KAEL,IAII5zC,EACAoN,EACAzJ,EACAsJ,EACA3Q,EACAuR,EACA1J,EACAC,EACAE,EACAR,EACAJ,EACAoH,EACA4D,EACA2W,EACAjP,EACApH,EACA7S,EACA4W,EACAgD,EACAL,EACAQ,EACAgD,EACAjD,EACAgD,EACAZ,EACAf,EACA7E,EA9BE8E,EAAUjB,KAAK9V,QACfqK,GAAA,EAAQxH,EAAAmtB,GAAMjZ,GAAS4hH,cACvB71H,GAAA,EAAW0K,EAAAwiB,GAASjZ,GAAS4hH,cAyInC,SAAShgH,IACL7c,EAAe,CAAC,EAChBuR,EAAc,CAAC,EACfzJ,EAAuB,CAAC,EACxBD,EAAsB,CAAC,EACvBuR,EAAoB,CAAC,EACrBO,EAAgC,CAAC,EACjCgD,EAAoB,CAAC,EACrBZ,EAAqB,CAAC,WAElBvU,IACAA,GAAA,GAEAoS,GACAA,EAAqB84B,QAGzBj5B,OAAA,EACAG,OAAA,EACAgD,OAAA,EACA4mB,aAAax7B,GACbA,EAAqB,IACxB,CA0DD,SAASksB,EAAwBpjB,GAC7B,IAAM9Q,EAAO8Q,EAAE1M,QAAQ65H,UACjBr+H,EAAWkR,EAAEktH,SAEnB,GAAKh+H,GAASJ,GAAaiI,EAAoBjI,IAAcuW,EAAS2E,MAAMskH,UAAUyG,IAAIsB,kBAAkBnnI,GAA5G,CAIA,IAAMuR,EAAkB1J,EAAoBjI,GAAUI,GACtD,GAAKuR,EAAL,CAIA,IAAMG,EAAeg+B,GAAaz0B,GAAS3W,OAAO,CAC9C6zE,cAAez0E,EACf0rK,gBAAiB79J,EACjBy9J,eAAgBl+J,EAAE1M,QAClB6qK,sBAAuBt1J,EAA8B3Z,GACrDkvK,UAAWvyJ,EAAkB3c,GAC7BmvK,WAAYpzJ,EAAmB/b,GAC/Bm7I,WAAApyH,IAEE5hB,EAAgBE,EAAmBgqK,sBAAsB3/J,EAAc9R,GAEzEuH,EAAc41G,QAAUttE,GAAAvb,EAAA07I,WACFr+J,EAAgBs5I,mBACR1N,YAAY,CACtC9nG,MAAO7iC,EAAAsrI,uBACP/9H,MAAOjP,EAAE1M,QAAQ2b,QAClB,KAECjY,EAAqBlI,GAAUI,GAAMq1C,MAAQzkC,EAAAsjB,EAAAy3H,aAC7CvyI,EAAkBxZ,GAAUI,GAAM0yC,QAClCt5B,EAAkBxZ,GAAUI,GAAMykB,KAAK,CACnCorJ,SAAUnsJ,EAAc1jB,EAAMJ,GAC9B+vK,SAAUxoK,EAAc41G,QACxBu0D,WAAY,EACZ14I,OAAQzxB,EAAcyxB,SAE1BzY,EAAmBngB,EAAM2Q,EAAiB+oI,sBAAuBvyI,EAAc41G,QAAS51G,EAAcyxB,QAEtG4K,aAAax7B,GACbA,EAAqBoE,YACjB,WACItE,EAAqBlI,GAAUI,GAAMq1C,MAAQzkC,EAAAsjB,EAAAq9I,WAC7CvpK,EAAqB,IACxB,GACDmO,EAAS2E,MAAMskH,UAAUC,oBApCpC,CALA,CA6CJ,CAOD,SAASviH,EAAyBpZ,GAC1BA,EAAEu6H,YAAcr+H,EAAAs0B,EAAAi7C,aAAA,IACZ11D,GACAG,EAAqB6K,KAAK/gB,EAAEs6H,SAAUvkH,EAAesP,EAAWq5I,sBAEpE3oJ,EAAgB/V,EAAE6hJ,WAEzB,CAOD,SAAS/nI,EAAe9Z,GAkfxB,IAA4B2D,EAAWsJ,EAjf/BjN,EAAE4/J,SAAW1yJ,EAAAsjB,EAAAs9I,eAAiC9tK,EAAE8H,OAAS9H,EAAE8H,MAAM7J,OAASkY,EAAAD,EAAAyrH,oBAAmC3hI,EAAEu6H,YAAcr+H,EAAAs0B,EAAA3B,OAAmB7uB,EAAEu6H,YAAcr+H,EAAAs0B,EAAAi7C,OAChKvyD,EAAkB6H,KAAK/gB,EAAEu6H,UAAWv6H,EAAE8H,MAAO2K,EAAS2E,MAAMskH,UAAUyG,IAAIgB,oBAG1EnjI,EAAE4/J,SAAW1yJ,EAAAsjB,EAAAu9I,cAAkC/tK,EAAEu6H,YAAcr+H,EAAAs0B,EAAA3B,OAAmB7uB,EAAEu6H,YAAcr+H,EAAAs0B,EAAAi7C,QA6e9E9nE,EA5eD3D,EAAEu6H,UA4eUttH,EA5eC,KAAQjN,EAAE8H,MAAMyS,MA8enC9H,EAAS2E,MAAMskH,UAAUyG,IAAIG,cAE7BpmI,EAAAs0B,EAAA+xG,sBAKrB,SAAmCviI,EAAW2D,GAC1C,IACI,IAAMsJ,EAAmBmJ,EAAiBmrI,sBACpCjlJ,EAAoB2Q,EACpB/Q,EAAqB,GAAM+Q,EAE3BY,EAAeoI,EAA8BjW,GAC7CkN,EAAkBvJ,GAAekK,EAAe3R,EAAqBI,GAC3E2Z,EAA8BjW,GAAakN,EAEvCA,IAAoBW,IAChBX,EACAE,EAAO0I,KAAK,IAAM9V,EAAY,qEAAuE2D,EAAYy8B,QAAQ,GAAK,MAE9HhzB,EAAO0I,KAAK,IAAM9V,EAAY,qEAAuE2D,EAAYy8B,QAAQ,GAAK,MAKzI,CAFC,MAAOpgC,GACLoN,EAAO5B,MAAMxL,EAChB,CACJ,CApBD,CAJkC2D,EAAWsJ,GA/e5C,CAQD,SAAS/I,EAAsBlE,EAAM2D,GACjC,IACI,IAAIsJ,EAcJ,OAbA3Q,EAAaqH,GAAYrH,EAAaqH,IAAa,CAAC,EAE/CrH,EAAaqH,GAAU1G,eAAe+C,KACvC1D,EAAaqH,GAAU3D,GAAQ,GAGnCiN,EA+ER,SAA0BjN,EAAMoN,GAC5B,IAAIzJ,EAAMrH,EAAa8Q,GAAUpN,GAC7BiN,EAAStJ,EAEb,IAAKQ,EAAoBiJ,KAAcjJ,EAAoBiJ,GAAUpN,GACjE,OAAOiN,EAGX,IAAM/Q,EAASurB,EAAsBznB,EAAMoN,QAAA,IACvClR,IACA+Q,EAAS2B,KAAKgN,IAAIjY,EAAKzH,IAG3B,IAAM2R,EA3DV,SAAuC7N,EAAMoN,GACzC,IACI,IAAMzJ,EAAayS,EAAiB+0J,uBAAuB,aAAcnrK,GACzE,OAAI2D,GAAc,EACPoc,EAAqB5b,EAAoBiJ,GAAUpN,GAAMmoJ,eAAgBxkJ,EAAYyJ,QAAA,CAMnG,CAFC,MAAOpN,GACL,MACH,CACJ,CAXD,CA2DiDA,EAAMoN,GAKnD,YAAO,IAJHS,IACAZ,EAAS2B,KAAK+M,IAAI1O,EAAQY,IAGvBZ,CACV,CAnBD,CA/E+BjN,EAAM2D,GAC7BsJ,EAmIR,SAAsCjN,EAAKoN,EAAMzJ,GAC7C,IAAIsJ,EAAS3Q,EAAaqH,GAAUyJ,GAC9BlR,EAAyBuW,EAAS2E,MAAMskH,UAAUyG,IAAImB,uBAAuBl2H,GAEnF,OAAIkoB,MAAMp5B,IAA2BA,GAA0B,GAAKA,EAAyB,EAClF8D,EAEJ4O,KAAK+M,IAAI3b,EAAK4O,KAAKwU,MAAMnW,EAAS/Q,GAC5C,CARD,CAnI2C+Q,EAAKjN,EAAM2D,GAC9CsJ,EAoJR,SAA0BjN,EAAKoN,EAAMzJ,GACjC,GAAIyJ,IAASlR,EAAAs0B,EAAAi7C,QAAoBh5D,EAAS2E,MAAMskH,UAAUyG,IAAIiB,uBAAyBj/H,EAAoBR,KAAcQ,EAAoBR,GAAUyJ,GACnJ,OAAOpN,EAGN8D,GACDyc,IAEJ,IAAMtT,EAAa9I,EAAoBR,GAAUyJ,GAAM+8H,gBACjD7tI,EAAiBoS,EAAQspJ,qBAAqB/qJ,EAAWoP,MAAOjP,EAAMH,GAAYw7H,uBACpF56H,EAAS7N,EAEb,GAAI0D,EAAe,GAAKoH,EAAgB,EAAG,CACvC,KACI+C,EAAS,GACTvR,EAAeuR,IACfnK,EAAepH,EAAeuR,GAAQxI,OACtC3B,EAAepH,EAAeuR,EAAS,GAAGxI,MAAQ/I,EAAeuR,GAAQxI,MAAQ3B,GACjFmK,GAAkB,EAKtB,KAAOA,EAASvR,EAAeD,OAAS,GAAKC,EAAeuR,GAAQxI,QAAU/I,EAAeuR,EAAS,GAAGxI,OACrGwI,GAAkB,CAEzB,CAED,OAAOA,CACV,CA7BD,CApJ+BZ,EAAKjN,EAAM2D,GAE9B8O,EAAS2E,MAAMskH,UAAUqI,KAAK9jE,SAAWxtD,EAAS2E,MAAMskH,UAAUqI,KAAK5B,IAAI6B,UAC3E/2H,EAqGZ,SAA8BjN,EAAK2D,EAAMsJ,GAErC,GAAa,UAATtJ,EACA,OAAO3D,EAGX,IAAI1D,EAAiBH,EAAUo2J,cAAc5uJ,GAC7C,GAAIrH,EAAiB,EACjB,OAAO0D,EAGX,IAAM9D,EAAeggB,EAA0BjP,EAAU,QAAS+S,EAAc,QAAS/S,IACzF3Q,GAAkBJ,EAAgBA,EAAamyB,QAAU,IAAQ,EACjE,IAAMxgB,EAASkS,EAAqB5b,EAAoB8I,GAAUtJ,GAAMwkJ,eAAgB7rJ,EAAgB2Q,GAExG,OADAG,EAAOwI,MAAM,cAAgB3I,EAAW,KAAOtJ,EAAO,mCAAqCrH,GACpFsS,KAAK+M,IAAI3b,EAAK6N,EACxB,CAhBD,CArGuCZ,EAAKjN,EAAM2D,IAEnCsJ,CAGV,CAFC,MAAOjN,GACL,MACH,CACJ,CAQD,SAASynB,EAAsBznB,EAAMoN,GACjC,IACI,OA+BR,SAAuCpN,EAAMoN,GACzC,IACI,IAAMzJ,EAAayS,EAAiB+0J,uBAAuB,aAAcnrK,GAEzE,GAAI2D,GAAc,EAAG,CACjB,IAAMsJ,EAAY9I,EAAoBiJ,GAAUpN,GAAMmoJ,eAChD7rJ,EAAc+jB,EAAepT,GAE/B/Q,EAAS6jB,EAAqB9S,EAAWtJ,EAAYyJ,GAIzD,OAHI9Q,EAAYJ,IAAWA,EAASI,EAAYD,OAAS,GAAKC,EAAYJ,GAAQmyB,QAAuB,IAAb1qB,GACxFzH,IAEGA,CACV,CACG,MAIP,CAFC,MAAO8D,GACL,MACH,CACJ,CAnBD,CA/B6CA,EAAMoN,EAG9C,CAFC,MAAOpN,GACL,MACH,CACJ,CAwRD,SAASggB,EAAchgB,GAAuB,IAAjBoN,EAAiB9O,UAAAjC,OAAA,YAAAiC,UAAA,GAAAA,UAAA,GAAN,KACpC,IAII,OAHK8O,IACDA,EAAWH,EAAiB+oI,sBAAsB/9H,IAElDjY,GAAQmE,EAAoBiJ,IAAajJ,EAAoBiJ,GAAUpN,IAGnEoN,GACAS,EAAYT,GAAYS,EAAYT,IAAa,CAAC,EAE7CS,EAAYT,GAAUnQ,eAAe+C,KACtC6N,EAAYT,GAAUpN,GA7nBtB,GAgoBM6N,EAAYT,GAAUpN,IAhoB5B,CAuoBf,CAFC,MAAOA,GACL,OAtoBY,CAuoBf,CACJ,CAUD,SAASyc,EAAmBzc,EAAMoN,EAAYzJ,GAA2B,IAAfsJ,EAAe3O,UAAAjC,OAAA,YAAAiC,UAAA,GAAAA,UAAA,GAAN,KAC/D,GAAK8O,GAAeA,EAAW6K,IAAOjY,EAAtC,CAGA,IAAM1D,EAAW8Q,EAAW6K,GACtB/b,EAAa8jB,EAAchgB,EAAM1D,IAAA,EAEvCgkB,EAAA4lI,IAAaviJ,GAEb,IAAMkK,EAAgB3J,EAAsBlE,EAAM1D,GAE9CqH,IAAezH,GAAcyH,GAAc,GAAKA,GAAckK,GAC9D8R,EAAe3f,EAAM9D,EAAYyH,EAAYkK,EAAeZ,EAAQ3Q,EATvE,CAWJ,CAuBD,SAASqjB,EAAe3f,EAAM2D,EAAYsJ,EAAY3Q,EAAQJ,EAAQgR,GAClE,GAAIlN,GAAQmE,EAAoB+I,IAAa/I,EAAoB+I,GAAUlN,GAAO,CAC9E,IAAMgO,EAAa7J,EAAoB+I,GAAUlN,GAAMmqI,gBACjD9mI,EAAY2K,GAAcA,EAAWspI,cAAgBtpI,EAAWspI,aAAa5B,UAC7ErxI,EAAciT,EAAY2pI,sBAAsBjhJ,GACtDoN,EAAO0I,KAAK,cAAgB5I,EAAW,KAAOlN,EAAO,iBAAmB2D,EAAa,OAASsJ,EAAa,IAAM3Q,EAAS,aAAe+H,EAAc,MAAQnI,EAAS86B,KAAKC,UAAU/6B,GAAU,MAEjM2R,EAAYX,GAAYW,EAAYX,IAAa,CAAC,EAClDW,EAAYX,GAAUlN,GAAQiN,EAC9B,IAAM7I,EAAc8X,EAA0BhP,EAAUlN,EAAMiN,GAC9D3J,EAASqxB,QAAQlxB,EAAA+sB,EAAA+uI,yBACb,CACI3d,WAAAj+I,EACAk+I,WAAA50I,EACAioB,OAAAh5B,EACAyrI,WAAA35H,EACAggK,YAAA5pK,EACA6pK,OAAA3xK,EACAi+H,UAAWv6H,GAEf,CAAEs6H,SAAUtsH,EAAWiK,GAAIsiH,UAAWv6H,IAE1C,IAAMsE,EAAU4U,EAAkB6sI,qBAAqB/lJ,EAAMqD,GACxDiyB,MAAMhxB,IACPyO,EAAWm7J,wBAAwBluK,EAAMsE,EAEhD,CACJ,CAED,SAAS4X,EAA0Blc,EAAUoN,EAAMzJ,GAC/C,GAAIyJ,GAAQjJ,GAAuBA,EAAoBnE,IAAamE,EAAoBnE,GAAUoN,GAAO,CACrG,IAAMH,EAAWoT,EAAelc,EAAoBnE,GAAUoN,GAAM+6I,gBACpE,OAAOl7I,EAAStJ,GAAOsJ,EAAStJ,GAAO,IAC1C,CACD,OAAO,IACV,CAUD,SAASoc,EAAqB/f,EAAWoN,EAASzJ,GAA0B,IAAhBsJ,EAAgB3O,UAAAjC,OAAA,YAAAiC,UAAA,GAAAA,UAAA,GAAN,KAC5DhC,EAAmB0D,GAAaA,EAAU/B,KAAOkG,EAAoBR,GAAU3D,EAAU/B,MAAMqpJ,wBAA0B,KAE/H,GAAI70I,EAAS2E,MAAMskH,UAAUyG,IAAIgB,oBAAsBl2H,GAAW3Q,GAAoBA,EAAiB6kJ,iBAAkB,CACrHl0I,GAAoB,IACpB,IAAM/Q,EAAmBI,EAAiB6kJ,iBAC1C,GAAIl0I,EAAU/Q,EACV,OAAO,EAGPkR,GAAqB,EADCH,EAAU/Q,CAGvC,CAID,IAFA,IAAMgR,EAAcmT,EAAergB,GAE1BgO,EAAId,EAAY7Q,OAAS,EAAG2R,GAAK,EAAGA,IAEzC,GAAc,IAAVZ,GADgBF,EAAYc,GACEqgB,QAC9B,OAAOrgB,EAGf,OA1vBgB,CA2vBnB,CAOD,SAASqS,EAAergB,GACpB,IAAMoN,EAAW,GACjB,IAAKpN,IAAcA,EAAUwxJ,YAAa,OAAOpkJ,EAOjD,IALA,IAGIzJ,EAHEsJ,EAAcjN,EAAUwxJ,YACxBl1J,EAAO0D,EAAU/B,KAId/B,EAAI,EAAG2R,EAAKZ,EAAY5Q,OAAQH,EAAI2R,EAAI3R,KAC7CyH,EAAc,IAAI4tB,IACNgpG,UAAYj+H,EACxBqH,EAAY2xJ,aAAep5J,EAC3ByH,EAAY0qB,QAAUphB,EAAY/Q,GAAGwsI,UACrC/kI,EAAY0B,MAAQ4H,EAAY/Q,GAAGmJ,MACnC1B,EAAY2B,OAAS2H,EAAY/Q,GAAGoJ,OACpC3B,EAAYymJ,SAAWn9I,EAAY/Q,GAAGkuJ,SACtCh9I,EAAS2T,KAAKpd,GAGlB,OAAOyJ,CACV,CA+DD,SAASmT,IACL,GAAI8E,EAAY,CACZ,IACMrlB,EADgByS,EAAS2E,MAAMskH,UAAUyG,IAAIkB,qCAAuCrgI,OAAO/F,eAAe,oBAC7E+F,OAAO8hE,iBAAmB,EAC7DphE,EAAe2hB,EAAW8oJ,iBAAmBnuK,EAC7C8K,EAAgBua,EAAW+oJ,kBAAoBpuK,CAClD,CACJ,CA4CD,OA1BAA,EAAW,CACPqqI,WAp0BJ,WACIn0H,EAAuBi3B,GAAqB51B,GAAS3W,SACrDsY,EAAoBg1B,GAAkB32B,GAAS3W,OAAO,CAClDw4G,SAAA3mG,KAGJ9O,GAAA,EAAqB8nC,GAAAjb,GAAmBjZ,GAAS3W,OAAO,CACpD0zI,YAAAh9H,EACAgpJ,sBAAAtxJ,EACA4xI,iBAAAxqI,EACAgjG,SAAA3mG,KAGe43H,aAEnB/mI,EAAS8uB,GAAG/tB,EAAAmsB,EAAAmxH,wBAA2CvoI,EAA0BpZ,GACjFsD,EAAS8uB,GAAG/tB,EAAAmsB,EAAA8uI,aAAgCxlJ,EAAgB9Z,GAC5DsD,EAAS8uB,GAAG3uB,EAAA+sB,EAAAq1G,iBAAyBr1G,EAAyBxwB,EACjE,EAmzBGshJ,sBA1CJ,SAA+BthJ,GAC3B,IAAMoN,EAAWpN,EAAaA,EAAWiY,GAAK,KACxCtU,EAAeqc,EAAc9jB,EAAAs0B,EAAA3B,MAAiBzhB,GAC9CH,EAAe+S,EAAc9jB,EAAAs0B,EAAAi7C,MAAiBr+D,GAKpD,OAHiBzJ,IAAiBO,EAAsBhI,EAAAs0B,EAAA3B,MAAiBzhB,IACpEH,IAAiB/I,EAAsBhI,EAAAs0B,EAAAi7C,MAAiBr+D,EAGhE,EAkCG+pJ,sBAtDJ,SAA+Bn3J,GAC3B,IAAMoN,EAAOpN,EAAU/B,KACjB0F,EAAW3D,EAAU2nI,WAAW1vH,GAChChL,EAAMjN,EAAUwiK,oBAAsB,EAK5C,OAHAlmK,EAAaqH,GAAYrH,EAAaqH,IAAa,CAAC,EACpDrH,EAAaqH,GAAUyJ,GAAQH,EAExBA,CACV,EA8CGssJ,mBApBJ,SAA4Bv5J,GACpBkW,GACAA,EAAqB02J,eAAe5sK,GAEpCmE,EAAoBnE,WACbmE,EAAoBnE,GAE3B0V,EAAkB1V,WACX0V,EAAkB1V,GAGzBoE,EAAqBpE,WACdoE,EAAqBpE,EAEnC,EAOG8lJ,qBA5DJ,WACI,OAAO5sI,CACV,EA2DGk9I,eAAA/1I,EACA4lI,qBAAAlmI,EACA2xI,qBA5XJ,SAA8B1xJ,GAAuB,IAAjBoN,EAAiB9O,UAAAjC,OAAA,YAAAiC,UAAA,GAAAA,UAAA,GAAN,KAI3C,GAHK8O,IACDA,EAAWH,EAAiB+oI,sBAAsB/9H,IAElDjY,GAAQmE,GAAuBA,EAAoBiJ,IAAajJ,EAAoBiJ,GAAUpN,GAAO,CACrG,IAAM2D,EAAMO,EAAsBlE,EAAMoN,GAClC9Q,EAAW+jB,EAAelc,EAAoBiJ,GAAUpN,GAAMmoJ,gBACpE,OAAO7rJ,EAASqH,GAAOrH,EAASqH,GAAO,IAC1C,CACD,OAAO,IACV,EAmXGkiJ,sBAAAp+H,EACAu5H,sBAAA98I,EACA8hJ,qBA5WJ,SAA8BhmJ,EAAMoN,GAGhC,GA7TJ,WACI,IAAK2F,IAAeA,EAAW9V,eAAe,2BAC1C,MAAM,IAAIuQ,MAAMtR,EAAAs0B,EAAA+iH,qBAEvB,CAJD,GA6TQvzI,IAAS9D,EAAAs0B,EAAAmmG,KACT,OAAOhjF,IAGX,IAAMhwC,EAAeoP,EAAWs7J,wBAAwBruK,GACpDiN,EAAgBmJ,EAAiB+0J,uBAAuB,iBAAkBnrK,GAC1E1D,EAAcmW,EAAS2E,MAAMskH,UAAUyG,IAAIqB,2BAA2BxjI,GAE1E,IAAuB,IAAnBiN,EACA,GAAI3Q,GAAe,EAAG,CAClB,IAAMuR,EAAa1J,EAAoBiJ,GAAUpN,GAAMmqI,gBACjDj9H,EAAiBwB,EAAQspJ,qBAAqBnqJ,EAAWwO,MAAOrc,EAAM6N,GAAY46H,uBAGpFx7H,EAFAzQ,MAAMC,QAAQyQ,GAEEA,EADD0B,KAAKgN,IAAIhN,KAAKwU,MAAMlW,EAAe7Q,OAASC,GAAe,EAAG,IACtCosI,UAAY,IAEnC,CAEvB,MAGGz7H,EAHQqoB,MAAM3xB,GAGG3D,IAAS9D,EAAAs0B,EAAAi7C,MAxiBZ,IACA,IAqiBE9nE,EAMxB,OAAOsJ,CACV,EAgVGyxI,cAAA1+H,EACAgoI,uBApNJ,SAAgChoJ,EAAUoN,GACtC,OAAOhJ,EAAqBpE,IAAaoE,EAAqBpE,GAAUoN,GAAQhJ,EAAqBpE,GAAUoN,GAAMukC,MAAQ,IAChI,EAmNGuxG,mBAAAzmI,EACAykI,qBA3UJ,SAA8B9zI,EAAMH,GAChC,IACI,KAAKG,GAASjJ,GAAwBA,EAAoB8I,IAAc9I,EAAoB8I,GAAUG,IAClG,OAAO,EAGX,GAAI8I,EAAsB,CACtB,IAAM5Z,EAAkB+oB,EAAWq5I,qBAC/BpiK,GACA4Z,EAAqB6K,KAAK9T,EAAU8I,EAAezZ,EAE1D,CAGD,IAAKmW,EAAS2E,MAAMskH,UAAUyG,IAAIsB,kBAAkBr2H,GAChD,OAAO,EAGX,IAAMlR,EAAa8jB,EAAc5S,EAAMH,GACjCY,EAAem+B,GAAaz0B,GAAS3W,OAAO,CAC9C6zE,cAAez0E,EACforK,cAAe11J,EAAkBzI,GAAUG,GAC3Ci+J,qBAAsBn1J,EACtBw1J,gBAAiBvnK,EAAoB8I,GAAUG,GAC/CkhK,aAAcpyK,EACdqvK,sBAAuBt1J,EAA8B7I,GACrDo+J,UAAWvyJ,EAAkB7L,GAC7Bq+J,WAAYpzJ,EAAmBjL,GAC/BqqI,WAAApyH,IAEErX,EAASyZ,EAAsBra,EAAMH,GACrCxJ,EAASS,EAAsBkJ,EAAMH,GACrC5J,EAAgBM,EAAmB4qK,cAAc1gK,GACnDxJ,EAAahB,EAAcg2G,QAW/B,gBATIrrG,IAA0B3J,EAAa0nC,GAAAvb,EAAA07I,UAA2B7nK,EAAanI,GAAc8R,IAC7F3J,EAAa2J,GAEb3J,EAAaZ,IACbY,EAAaZ,GAGjBiS,EAAkBzI,GAAUG,GAAM2T,KAAK,CAAEorJ,SAAUjwK,EAAY+vK,SAAU5nK,IAErEA,EAAa0nC,GAAAvb,EAAA07I,WAA2B7nK,IAAenI,IAAekI,EAAqB6I,GAAUG,GAAMukC,QAAUzkC,EAAAsjB,EAAAq9I,YAA+BxpK,EAAanI,KACjKyjB,EAAevS,EAAMlR,EAAYmI,EAAYZ,EAAQJ,EAAc6xB,OAAQjoB,IAAA,EAOlF,CAFC,MAAOjN,GACL,OAAO,CACV,CAEJ,EAsRGwuK,eAAAjuJ,EACAkuJ,2BA9CJ,SAAoCzuK,GAChC8D,EAA0B9D,CAC7B,EA6CGinJ,mBA3zBJ,SAA4BjnJ,EAAMoN,GAC9B,IAAMzJ,EAAWyJ,EAAgB+8H,gBAAgBlyH,GAE5C9T,EAAoBR,KACrBQ,EAAoBR,GAAY,CAAC,GAGhC+R,EAAkB/R,KACnB+R,EAAkB/R,GAAY,CAAC,GAG9BS,EAAqBT,KACtBS,EAAqBT,GAAY,CAAC,GAGtC+R,EAAkB/R,GAAU3D,GAAQ6rC,GAAqBt0B,GAAS3W,SAClEuD,EAAoBR,GAAU3D,GAAQoN,EAEtChJ,EAAqBT,GAAU3D,GAAQ,CAAC,EACxCoE,EAAqBT,GAAU3D,GAAM2xC,MAAQzkC,EAAAsjB,EAAAq9I,WASjD,SAAgC7tK,GAC5B,IAAMoN,EAAWqF,EAAS2E,MAAMskH,UAAUyG,IAAIG,YAE1Cl1H,IAAalR,EAAAs0B,EAAAk+I,kBACbz4J,EAA8BjW,IAAA,EAC9BqY,EAAmBrY,IAAA,EACnBiZ,EAAkBjZ,IAAA,GACXoN,IAAalR,EAAAs0B,EAAAm+I,mBACpB14J,EAA8BjW,IAAA,EAC9BqY,EAAmBrY,IAAA,EACnBiZ,EAAkBjZ,IAAA,GACXoN,IAAalR,EAAAs0B,EAAAo+I,mBACpB34J,EAA8BjW,IAAA,EAC9BqY,EAAmBrY,IAAA,EACnBiZ,EAAkBjZ,IAAA,GACXoN,IAAalR,EAAAs0B,EAAAq+I,yBACpB54J,EAA8BjW,IAAA,EAC9BqY,EAAmBrY,IAAA,EACnBiZ,EAAkBjZ,IAAA,GACXoN,IAAalR,EAAAs0B,EAAA+xG,uBACpBtsH,EAA8BjW,MAAQiW,IAAiCA,EAA8BjW,KAAQiW,EAA8BjW,GAC3IqY,EAAmBrY,IAAA,EACnBiZ,EAAkBjZ,IAAA,EAEzB,CAxBD,CAP2BA,GAEnBA,IAAS9D,EAAAs0B,EAAAi7C,OACTlrD,GAEP,EAkyBGkoI,qBAtwBJ,SAA8BzoJ,EAAUoN,GACpC,IACQjJ,EAAoBnE,IAAamE,EAAoBnE,GAAUoN,WACxDjJ,EAAoBnE,GAAUoN,GAGrCsI,EAAkB1V,IAAa0V,EAAkB1V,GAAUoN,WACpDsI,EAAkB1V,GAAUoN,GAGnChJ,EAAqBpE,IAAaoE,EAAqBpE,GAAUoN,WAC1DhJ,EAAqBpE,GAAUoN,EAK7C,CAFC,MAAOpN,GAER,CACJ,EAsvBGu3I,UA/sBJ,SAAmBv3I,GACVA,IAEDA,EAAOyjE,mBACPx2D,EAAmBjN,EAAOyjE,kBAE1BzjE,EAAOkkK,aACPnxJ,EAAa/S,EAAOkkK,YAEpBlkK,EAAO4gJ,mBACPxqI,EAAmBpW,EAAO4gJ,kBAE1B5gJ,EAAOsgK,wBACPtxJ,EAAwBhP,EAAOsgK,uBAE/BtgK,EAAO8uK,YACP3yK,EAAY6D,EAAO8uK,WAEnB9uK,EAAOs0I,cACPh9H,EAActX,EAAOs0I,aAErBt0I,EAAOmzG,UACPzkG,EAAU1O,EAAOmzG,SAEjBnzG,EAAOy3I,aACPpyH,EAAarlB,EAAOy3I,YAEpBz3I,EAAOo5G,WACP3mG,EAAWzS,EAAOo5G,UAEzB,EAkrBGpqE,MA7tBJ,WAEI71B,IAEA7V,EAASovB,IAAIjvB,EAAA+sB,EAAAq1G,iBAAyBr1G,EAAyBxwB,GAC/DsD,EAASovB,IAAIruB,EAAAmsB,EAAAmxH,wBAA2CvoI,EAA0BpZ,GAClFsD,EAASovB,IAAIruB,EAAAmsB,EAAA8uI,aAAgCxlJ,EAAgB9Z,GAEzD2D,GACAA,EAAmBqrC,OAE1B,GA7IG5hC,EAASvC,EAAM2uH,UAAUx5H,GACzBmZ,IAm2BGnZ,CACV,CAED4zC,GAAc+lF,sBAAwB,gBACtC,IAAM/sF,GAAUzoC,EAAAqsB,EAAAopG,oBAAiChmF,IACjDhH,GAAQmiI,gBA94BgB,EA+4BxB5qK,EAAAqsB,EAAA2pG,uBAAoCvmF,GAAc+lF,sBAAuB/sF,IACzE,IAAAsD,GAAAtD,GC75BM2C,GAA8B,IAAIu9B,IAAI,CACxC,CAAC5wE,EAAAs0B,EAAAonI,2BAAAC,cAAoD,kBACrD,CAAC37J,EAAAs0B,EAAAonI,2BAAAoX,kBAAwD,cACzD,CAAC9yK,EAAAs0B,EAAAonI,2BAAAqX,iBAAuD,WACxD,CAAC/yK,EAAAs0B,EAAAonI,2BAAAsX,iBAAuD,oBAG5D,SAAS1/H,KAEL,IAAIxvC,EACAoN,EACAzJ,EACAsJ,EACA3Q,EACAuR,EACAX,EAEA/I,EAIEE,EAAUiS,KAAK9V,QACf4D,GAAA,EAAW4J,EAAAwiB,GAASnsB,GAAS80H,cAC7B70H,EAAiB,GAgBvB,SAASR,IACDH,IACAA,EAAQk2B,aAAuC,EAC/Cl2B,EAAQiD,oBAAoB,UAAW9C,GAE9C,CAoJD,SAASJ,IACL,OAAQY,EAAejI,OAAS,CACnC,CAgCD,SAASyO,IACL,GAAInH,GAAWD,KAAwC,IAAzBC,EAAQk2B,aAAoB,CACtD,IAAM75B,EAAQiC,SAASwzB,YAAY,SACnCz1B,EAAM01B,UAAU,cAAW,GAC3B/xB,EAAQiyB,cAAc51B,EACzB,CACJ,CAqED,SAAS0O,EAAiB1O,EAAWoN,GAC7BzJ,GACAA,EAAQqG,iBAAiBhK,EAAWoN,EAE3C,CAED,SAASiY,EAAoBrlB,EAAWoN,GAChCzJ,GACAA,EAAQiD,oBAAoB5G,EAAWoN,EAE9C,CAED,SAASgJ,IACL,OAAOzS,EAAUA,EAAQ4E,WAAaorC,GACzC,CAED,SAAS7kC,IACL,OAAOnL,EAAUA,EAAQ42B,SAAW,IACvC,CAsCD,SAASvrB,EAAahP,EAAMoN,EAAOH,EAAM3Q,EAAQJ,GAC7C,GAAIyH,EACA,IAAK,IAAIkK,EAAI,EAAGA,EAAIlK,EAAQw0B,WAAW97B,OAAQwR,IAG3C,GAAIlK,EAAQw0B,WAAWtqB,GAAG4oB,OAASz2B,KAASoN,GAAQzJ,EAAQw0B,WAAWtqB,GAAG6oB,OAAStpB,IAC/EzJ,EAAQw0B,WAAWtqB,GAAG4/C,WAAaxgD,GAAQtJ,EAAQw0B,WAAWtqB,GAAGshK,SAAW7yK,GAAUqH,EAAQw0B,WAAWtqB,GAAGgpJ,aAAe36J,EAC3H,OAAOyH,EAAQw0B,WAAWtqB,GAKtC,OAAO,IACV,CAkCD,SAAS1R,EAAkB6D,EAAkBoN,GACzC,OAAIpN,IAAqB9D,EAAAs0B,EAAAonI,2BAAAwX,cACrBh5J,KAAmBpW,GACnBoN,IACO,MAQf,SAAqBpN,EAAOoN,GACxB,IAAMzJ,EAAO,SAAPA,IAEF0hB,EAAoBrlB,EAAO2D,GAE3ByJ,EAASpN,EACZ,EAGD,OAFA0O,EAAiB1O,EAAO2D,GAEjB,CAAE0rK,KAAA1rK,EAAM+yC,MAAA12C,EAClB,CAVD,CALsBuvC,GAA4Bn4B,IAAIpX,GACpBoN,EAEjC,CA2DD,OA7CApN,EAAW,CACPgK,iBAAA0E,EACA0pB,aA1DJ,SAAsBp4B,EAAMoN,EAAOH,EAAM3Q,EAAQJ,GAC7C,IAAKyH,EACD,OAAO,KAIX,IAAIkK,EAAQmB,EAAahP,EAAMoN,EAAOH,EAAM3Q,EAAQJ,GAMpD,OALK2R,KACDA,EAAQlK,EAAQy0B,aAAap4B,EAAMoN,EAAOH,IACpC4pJ,WAAa36J,EACnB2R,EAAMshK,OAAS7yK,GAEZuR,CACV,EA8CGmlD,YA5CJ,SAAqBhzD,GACb2D,IACAA,EAAQqvD,YAAYhzD,QAAA,IAEhBA,EAAamvK,SACbxrK,EAAQw0B,WAAWx0B,EAAQw0B,WAAW97B,OAAS,GAAG8yK,OAASnvK,EAAamvK,OACxExrK,EAAQw0B,WAAWx0B,EAAQw0B,WAAW97B,OAAS,GAAGw6J,WAAa72J,EAAa62J,YAGvF,EAoCGgH,eAAA/uJ,EACAs/J,gBA5GJ,WACI,OAAOzqK,EAAUA,EAAQs6G,aAAetqE,GAC3C,EA2GGw6H,eAjHJ,WACI,OAAOxqK,EAAUA,EAAQw6G,YAAcxqE,GAC1C,EAgHGqhG,WApTJ,WACI,OAAOrxI,CACV,EAmTG6xI,SA3IJ,WACI,OAAO7xI,EAAUA,EAAQwuC,MAAQ,IACpC,EA0IGusH,mBA3MJ,WACI,IAAK/6J,EACD,OAAO,KAEX,IAAI3D,EAAa,4BAA6B2D,GAAa,4BAA6BA,EAEpFyJ,EAAS,KAYb,MAbkB,4BAA6BzJ,EAI3CyJ,EAASzJ,EAAQ0hE,0BACVrlE,IACPoN,EAAS,CACL24D,mBAAoBpiE,EAAQsiE,wBAC5BH,iBAAkBniE,EAAQsiE,wBAA0BtiE,EAAQqiE,wBAC5DspG,aAAc,IAAIz3J,OAInBzK,CACV,EAyLGmoI,gBArJJ,WACI,OAAO5xI,EAAUA,EAAQk2B,aAAe,IAC3C,EAoJGo+G,gBAlJJ,WACI,OAAOt0I,EAAUA,EAAQ+mH,OAAS,IACrC,EAiJG+qB,cAAAr/H,EACAm5J,UAxRJ,WACI,OAAO5rK,EAAUA,EAAQovD,IAAM,IAClC,EAuRGy8G,oBArRJ,WACI,OAAO3hK,CACV,EAoRG4hK,aAAAzgK,EACA0gK,cA3FJ,WACI,OAAO/rK,EAAUA,EAAQw0B,WAAa,EACzC,EA0FGrgB,QAhKJ,WACI,OAAOnU,EAAY2xB,MAAMroB,GAA+BtJ,EAAQq1B,YAAvB/rB,EAAsC,IAClF,EA+JG0iK,eAjHJ,WACI,OAAOhsK,EAAUA,EAAQ6hH,YAAc7xE,GAC1C,EAgHGi8H,2BAtGJ,WACI,GAAIjsK,EAAS,CACT,IAAM3D,EAAgB2D,EAAQ8gF,WAAWhiF,MAAQkB,EAAQ8gF,WACzD,OAAOzkF,EAAgB2D,EAAQ+gE,wBAAwBt/D,KAAOpF,EAAc0kE,wBAAwBt/D,KAAOuuC,GAC9G,CACD,OAAOA,GACV,EAiGGk8H,0BA/GJ,WACI,GAAIlsK,EAAS,CACT,IAAM3D,EAAgB2D,EAAQ8gF,WAAWhiF,MAAQkB,EAAQ8gF,WACzD,OAAOzkF,EAAgB2D,EAAQ+gE,wBAAwBv/D,IAAMnF,EAAc0kE,wBAAwBv/D,IAAMwuC,GAC5G,CACD,OAAOA,GACV,EA0GGm8H,cAxHJ,WACI,OAAOnsK,EAAUA,EAAQ4hH,WAAa5xE,GACzC,EAuHGo8H,mBAzRJ,WACI,OAAO7iK,CACV,EAwRGm9H,WAraJ,WACIjmI,EAASguB,GAAG3uB,EAAA+sB,EAAA6lH,iBAAyBvrI,EAAWwL,KACnD,EAoaG8+H,SAtLJ,WACI,OAAOzxI,EAAUA,EAAQygC,OAAS,IACrC,EAqLGixG,UA5KJ,WACI,OAAO1xI,EAAWA,EAAQgpD,UAAYr3B,MAAMroB,GAAiB,IAChE,EA2KGqoI,UAAA5xI,EACA+gH,MArLJ,WACQ9gH,IACAA,EAAQ8gH,QACR9gH,EAAQo0G,UAAA,EAEf,EAiLGyM,KAzMJ,WACI,GAAI7gH,EAAS,CACTA,EAAQo0G,UAAA,EACR,IAAM/3G,EAAI2D,EAAQ6gH,OACdxkH,GAAKA,EAACijC,OAA6B,oBAAZ1hC,SACvBvB,EAACijC,OAAO,SAACjjC,GACU,oBAAXA,EAAE7B,MACFiG,EAASuwB,QAAQlxB,EAAA+sB,EAAAw/I,sBAErB5iK,EAAOX,KAAP,+CAAA7M,OAA2DI,EAA3D,KACH,GAER,CACJ,EA6LGs1D,YA3DJ,SAAqBt1D,GACb2D,GACAA,EAAQ2xD,YAAYt1D,EAE3B,EAwDG4G,oBAAAye,EACA2pB,MAzaJ,WACIlP,aAAa37B,GACbC,EAASsuB,IAAIjvB,EAAA+sB,EAAA6lH,iBAAyBvrI,EAAWwL,KACpD,EAuaG+1G,eAnZJ,SAAwBrsH,EAAaoN,GAC7BzJ,IACIrH,GAAoCA,EAAiC+yK,MAAQ/yK,EAAiCo6C,OAC9GrxB,EAAoB/oB,EAAiCo6C,MAAOp6C,EAAiC+yK,MAEjGpiK,EAAejN,EACf1D,EAAmCH,EAAkBD,EAAAs0B,EAAAonI,2BAAAC,eAAoD,WACrG,GAAKl0J,EAML,GAAIA,EAAQq1B,cAAgB/rB,EAU5B,IACIA,EAAeG,EAiB/B,SAA6BpN,GACzB,IAAMoN,EAAW0B,IACbnL,EAAc3D,EACdiN,EAAkB,WACtB,GAAIG,EACA,IAAK,IAAI9Q,EAAI,EAAGA,EAAI8Q,EAAS/Q,OAAQC,IAAK,CACtC,IAAMJ,EAAQkR,EAASwL,MAAMtc,GACvBuR,EAAMT,EAAS0L,IAAIxc,GACnB4Q,EAAkB0B,KAAKC,IAAI3S,EAAQ8D,GACnCgO,EAAgBY,KAAKC,IAAIhB,EAAM7N,GAErC,GAAIA,GAAQ9D,GAAS8D,GAAQ6N,EACzB,OAAO7N,EAGPkN,EAAkBD,IAClBA,EAAkBC,EAClBvJ,EAAczH,GAGd8R,EAAgBf,IAChBA,EAAkBe,EAClBrK,EAAckK,EAErB,CAEL,OAAOlK,CACV,CA3BD,CAjBqEsJ,GAAgBA,EAChEqoB,MAAMroB,KACPtJ,EAAQq1B,YAAc/rB,GAE1BA,EAAe0mC,GAQlB,CAPC,MAAO3zC,GACsB,IAAvB2D,EAAQ4E,YAAoBvI,EAAEm1B,OAASn1B,EAAEiwK,oBACzC9rK,EAAUuE,YAAW,WACjB/E,EAAQq1B,YAAc/rB,EACtBA,EAAe0mC,GAClB,GAAE,KAEV,MAtBG1mC,EAAe0mC,GAuBtB,IAER,EA6WGu8H,WA1UJ,SAAoBlwK,GAEhB,KAAI,MAAAA,GAA0CA,GAAU,mBAAoB6B,KAAK7B,EAAM4/D,WAOnF,KAzH+B,2CAmH/Bj8D,EAAU3D,KAGN2D,EAAQm2G,QAAU,OAK7B,EAgUGinD,gBAhaJ,SAAyB/gK,GAChB2D,MADiDrF,UAAAjC,OAAA,YAAAiC,UAAA,IAAAA,UAAA,KAE7BqF,EAAQ4E,YAAc,GAAKvI,EAAQ,EAExD2D,EAAQqG,iBAAiB,UAAWlG,GAEpCH,EAAQk2B,aAAe75B,EAE9B,EAyZGu8J,UA/TJ,SAAmBv8J,GACX2D,IACI3D,EACA2D,EAAQovD,IAAM/yD,GAEd2D,EAAQivD,gBAAgB,OACxBjvD,EAAQqvB,QAGnB,EAuTGorG,cApRJ,SAAuBp+H,EAAMoN,IA6B7B,SAAqBpN,EAAMoN,GACnBA,EAtBR,SAA0BpN,GAET,OAATA,GAAkB2D,IAAWA,EAAQgpD,UAA6C,IAAlCroD,EAAemE,QAAQzI,IAI3EsE,EAAeyc,KAAK/gB,EACvB,CAPD,CAuByBA,GAdzB,SAA6BA,GACzB,IAAIoN,EAAQ9I,EAAemE,QAAQzI,GAEtB,OAATA,IAGW,IAAXoN,GACA9I,EAAekjB,OAAOpa,EAAO,EAGpC,CAVD,CAgB4BpN,EAE3B,CAND,CA5BgBA,EAAMoN,EACrB,EAmRG+iK,oBApSJ,SAA6BnwK,IACzB6N,EAAmB7N,GAEFojF,MAAMl+E,SAAW,WAClC2I,EAAiBu1E,MAAMunB,QAAU,OACjC98F,EAAiBu1E,MAAMyY,SAAW,SAClChuF,EAAiBu1E,MAAMp+E,cAAgB,OACvC6I,EAAiBu1E,MAAMj+E,IAAM,EAC7B0I,EAAiBu1E,MAAMh+E,KAAO,CACjC,EA4RGgrK,mBA1RJ,SAA4BpwK,GACxBkN,EAAkBlN,CACrB,EAyRG23J,kBAAAx7J,EACAqgK,yBAzTJ,SAAkCx8J,GAC1B2D,IACAA,EAAQkvD,sBAAwB7yD,EAEvC,GArIGoN,GAAA,EAAS/J,EAAAmtB,GAAMnsB,GAAS80H,cAAcK,UAAUx5H,GAChDiN,EAAe0mC,IA8bZ3zC,CACV,CAEDwvC,GAAWmqF,sBAAwB,aACnC,IAAA9pF,GAAe1rC,EAAAqsB,EAAAopG,oBAAiCpqF,ICje1CE,GAA4B,CAC9B,CAAE2gI,OAAQ,kBAAmBC,OAAQ,wBACrC,CAAED,OAAQ,kBAAmBC,OAAQ,wBACrC,CAAED,OAAQ,mBAAoBC,OAAQ,yBACtC,CAAED,OAAQ,mBAAoBC,OAAQ,0BAGpCvgI,GAAqC,mBACrCJ,GAAsC,oBAEtCK,GAAqB,eAErBsI,GAAe,cACfrI,GAAsB,oBAE5B,SAASH,GAAW9vC,GAEhBA,EAASA,GAAU,CAAC,EACpB,IAGIoN,EACAzJ,EACAsJ,EALE3Q,EAAUga,KAAK9V,QACfqN,EAAW7N,EAAOo5G,SAYxB,SAASlsG,EAAYlN,GACjB,QAAI,IAAAiN,EAAyB,OAAOA,EAIpC,IAEIG,EAJJH,GAAA,EAMA,IAC0B,oBAAXjK,SACPoK,EAAUpK,OAAOhD,GAKxB,CAHC,MAAOA,GAEL,OADA2D,EAAO8I,KAAK,6BAA+BzM,EAAMkM,SAC1Ce,CACV,CAED,IAAKG,GAAYpN,IAASgwC,IAtCL,mBAsC2BhwC,EAC5C,OAAOiN,EAQX,IACIG,EAAQwiH,QAvBI,IACE,KAuBdxiH,EAAQ0iH,WAxBI,KAyBZ7iH,GAAA,CAGH,CAFC,MAAOjN,GACL2D,EAAO8I,KAAK,gDAAkDzM,EAAMkM,QACvE,CAED,OAAOe,CACV,CAqBD,SAASe,IACL,IAAMhO,EAAiB,IACvB,OAAO4O,KAAKwU,OAAM,IAAIvL,MAAOC,UAAY9X,GAAkBA,CAC9D,CAED,SAASyD,EAASzD,EAAaoN,GAC3B,OAAOF,EAAYlN,IAAgB6N,EAASuJ,MAAMskH,UAAUtuH,EAAM,eAAe6yD,OACpF,CAED,SAAS97D,IACL,IAAK0J,EACD,MAAM,IAAIL,MAAMtR,EAAAs0B,EAAA+iH,qBAEvB,CA2FD,OARAnmI,EAAW,CACPihK,wBAtDJ,SAAiCruK,GAG7B,GAFAmE,KAEK0J,EAASuJ,MAAMskH,UAAUiF,uBAAuB1gE,QACjD,OAAOtsB,IAGX,IAAIvmC,EAAeumC,IAInB,GAAIlwC,EAASusC,GAAoBsI,IAAe,CAC5C,IAAMrrC,EAAM8iC,GAAmCvtC,QAAQ,KAAMxC,GAC7D,IACI,IAAM1D,EAAM06B,KAAK/F,MAAMy+F,aAAaC,QAAQ1iH,KAAS,CAAC,EAChD/Q,GAAa,IAAI2b,MAAOC,UAAYtB,SAASla,EAAIi0K,UAAW,KAAQ1iK,EAASuJ,MAAMskH,UAAUiF,uBAAuBC,MAAA,EACpH1zH,EAAU4J,WAAWxa,EAAI+xB,SAE1BiH,MAAMpoB,IAAahR,EAGbA,GACPwzH,aAAaI,WAAW7iH,IAHxBG,EAAeF,EACfvJ,EAAOiS,MAAM,0BAA4B5V,EAAO,QAAUkN,GAMjE,CAFC,MAAOlN,GACL,OAAO,IACV,CACJ,CACD,OAAOoN,CACV,EA0BG8gK,wBAbJ,SAAiCluK,EAAMoN,GACnC,GAAI3J,EAASusC,GAAoBsI,KAAiBlrC,EAAS,CACvD,IAAMH,EAAM8iC,GAAmCvtC,QAAQ,KAAMxC,GAC7D,IACI0vH,aAAaE,QAAQ3iH,EAAK+pB,KAAKC,UAAU,CAAE5I,QAASjhB,EAAQgzB,QAAQ,GAAImwI,UAAWviK,MAGtF,CAFC,MAAOhO,GACL2D,EAAO6H,MAAMxL,EAAEkM,QAClB,CACJ,CACJ,EAKG42J,sBApFJ,SAA+B9iK,GAG3B,GAFAmE,KAEK0J,EAASuJ,MAAMskH,UAAUmF,6BAA6B5gE,QACvD,OAAO,KAGX,IAAI7yD,EAAgB,KAGpB,GAAI3J,EAASusC,GAAoBC,IAAsB,CACnD,IAAMtsC,EAAMgsC,GAAoCntC,QAAQ,KAAMxC,GAC9D,IACI,IAAMiN,EAAM+pB,KAAK/F,MAAMy+F,aAAaC,QAAQhsH,KAAS,CAAC,EAChDrH,GAAa,IAAIub,MAAOC,UAAYtB,SAASvJ,EAAIsjK,UAAW,KAAQ1iK,EAASuJ,MAAMskH,UAAUmF,6BAA6BD,MAAA,EAChIxzH,EAAgBH,EAAImsG,SAEhB98G,IACAozH,aAAaI,WAAWnsH,GACxByJ,EAAgB,KAIvB,CAFC,MAAOpN,GACL,OAAO,IACV,CACJ,CACD,OAAOoN,CACV,EA2DG60J,sBA1BJ,SAA+BjiK,EAAMoN,GACjC,GAAI3J,EAASusC,GAAoBC,IAAsB,CACnD,IAAMhjC,EAAM0iC,GAAoCntC,QAAQ,KAAMxC,GAC9D,IACI0vH,aAAaE,QAAQ3iH,EAAK+pB,KAAKC,UAAU,CAAEmiF,SAAUhsG,EAAOmjK,UAAWviK,MAG1E,CAFC,MAAOhO,GACL2D,EAAO6H,MAAMxL,EAAEkM,QAClB,CACJ,CACJ,GAjJGvI,GAAA,EAASN,EAAAmtB,GAAMl0B,GAAS68H,cAAcK,UAAUpsH,GA4C5CF,EAAY8iC,KACZN,GAA0BhmC,SAAQ,SAAA1J,GAC9B,IAAMoN,EAAQsiH,aAAaC,QAAQ3vH,EAAMqwK,QAEzC,GAAIjjK,EAAO,CACPsiH,aAAaI,WAAW9vH,EAAMqwK,QAE9B,IACI3gD,aAAaE,QAAQ5vH,EAAMswK,OAAQljK,EAGtC,CAFC,MAAOpN,GACL2D,EAAO6H,MAAMxL,EAAEkM,QAClB,CACJ,CACJ,IA6GFkB,CACV,CAED0iC,GAAW6pF,sBAAwB,aACnC,IACA5hF,GADgB5zC,EAAAqsB,EAAAopG,oBAAiC9pF,IAAAoH,GAAAvzC,EAAA,MAAAgzC,GAAAhzC,EAAA,MClMjD,SAAS8rC,KAEL,IAEIzvC,EACAoN,EACAzJ,EACAsJ,EACA3Q,EACAJ,EACA2R,EACAX,EACAc,EACAvK,EACAU,EACAd,EACAgB,EAdED,EAAUkS,KAAK9V,QAqFrB,SAAS8D,EAA+BtE,EAAgB2D,EAAWrH,EAASJ,GACxE,IAAI2R,EAAY,KACVG,EAAUhO,EAAiBqE,EAAkB2B,QAAQhG,EAAeyN,MAAQ,KAC5EhK,EAAOvH,GAAe,CACxBokD,MAAA,EACAl+C,IAAK4L,EAAUA,EAAQ5L,SAAA,EACvBonC,MAAO,CACH5wB,MAAO,EACPE,IAAK,MAET03J,WAAA,EACAhc,YAAa,EACbic,YAAa,KACbl2C,UAAW52H,GAGfyJ,EAAOwI,MAAM,uCAEb,IAAMzR,EAAUuK,EAAmBjL,GAqBnCyJ,EAAU8lB,KAAK,CAAEtyB,QAASyD,EAASuqD,QAnBpB,SAAUthD,GAIrB,GAHA3J,EAAK+wJ,YAAc/wJ,EAAK+lC,MAAM1wB,MAC9BjL,EAAYZ,EAAUyjK,cAActjK,IAShC,OADA3J,EAAK+lC,MAAM1wB,IAAMrV,EAAK+wJ,YAAc/wJ,EAAKgtK,YAClCnsK,EAA+BtE,EAAgB2D,EAAWrH,EAASmH,GAN1EzD,EAAewpC,MAAQ37B,EAGvBvR,EAAQ0D,EAKf,EAMmDwL,MAJpC,WACZlP,EAAQ0D,EACX,IAIDoN,EAAOwI,MAAM,wBAA0BnS,EAAKrB,IAC/C,CAQD,SAASsB,EAAyB1D,EAAgB2D,EAAWrH,EAAOJ,EAAS2R,EAAUG,GACnF,GAAI1R,SAAA,IAAUA,EAAMsc,YAAA,IAAuBtc,EAAMwc,KAAoB,CACjE,IAAMrV,EAAQnH,EAAQA,EAAMU,WAAWqR,MAAM,KAAO,KACpD/R,EAAQmH,EAAQ,CAAEmV,MAAO9B,WAAWrT,EAAM,IAAKqV,IAAKhC,WAAWrT,EAAM,KAAQ,IAChF,CAEDoK,EAAYA,GAAW/C,EACvB,IAAI3G,EAAU,KACVd,EAAO,KACLe,IAAa9H,EACbgI,EAAUtE,EAAiBqE,EAAkB2B,QAAQhG,EAAeyN,MAAQ,KAC5E3J,EAAO,CACTw8C,MAAA,EACAl+C,IAAKkC,EAAUA,EAAQlC,SAAA,EACvBonC,MAAOplC,EAAW9H,EAAQ,CAAEsc,MAAO,EAAGE,IAAK,MAC3C03J,WAAYpsK,EACZowJ,YAAaxmJ,EAAcA,EAAYwmJ,YAAc,EACrDic,YAAa,KACbl2C,UAAW52H,GAGT0hB,EAAU3W,EAAmB5K,GAmFnCoJ,EAAU8lB,KAAK,CAAEtyB,QAAS2kB,EAASqpC,QAjFpB,SAAUpyD,GACrB,IAAM4Q,EAAapJ,EAAK2sK,YAClBziK,EAAe1R,EAASilB,WAM9B,GAJAzd,EAAK0wJ,YAAc1wJ,EAAK0lC,MAAM1wB,IAAMhV,EAAK0lC,MAAM5wB,MAC/CzU,EAAU8I,EAAUgkB,MAAM30B,IAC1B+G,EAAOc,EAAQyiJ,OAAO,UAERvjJ,EAAKstK,WAmBZ,CACH,IACIltK,EACAY,EAFED,EAAMf,EAAKwhB,WAQjB,GAJI,MAAAzgB,GAAqCA,EAAI/H,OAAS,IAClDoH,EAA2C,IAA1BW,EAAI,GAAGwsK,gBAGxBntK,EAAe,CAIf,IAAIa,EAAGwG,EAAK4D,EAAI2W,EAHhBjY,EAAOwI,MAAM,gCACb9R,EAAK0lC,MAAM1wB,IAAMhV,EAAK0lC,MAAM5wB,MAAQvV,EAAKyf,KAGzC,IAAI1M,EAAO,GACPtH,EAAQ,EACRE,GAAU3L,EAAKqjB,QAAU5iB,EAAK0lC,MAAM5wB,OAASvV,EAAKyf,KAChD3mB,EAAc,SAAUiR,GACtBA,GACAgJ,EAAOA,EAAKxW,OAAOwN,KACnB0B,GAEahE,IAETsL,EAAK60B,MAAK,SAAUjrC,EAAGoN,GACnB,OAAOpN,EAAEm2B,UAAY/oB,EAAE+oB,UAAY,GAAK,EAAI,CAC/C,IACDtoB,EAASuI,EAAMpW,EAAgB9D,KAGnC2R,EAAS,KAAM7N,EAAgB9D,EAEtC,EAED,IAAKoI,EAAI,EAAGwG,EAAM1G,EAAI/H,OAAQiI,EAAIwG,EAAKxG,IACnCoK,EAAKM,EACLqW,EAAKrW,EAAS5K,EAAIE,GAAGusK,gBAAkB,EACvC7hK,GAAkB5K,EAAIE,GAAGusK,gBAEzBntK,EAAyB1D,EAAgB2D,EADrC,CAAEiV,MAAOlK,EAAIoK,IAAKuM,GACiCnpB,EAASC,EAAa2H,EAGpF,MACGsJ,EAAOwI,MAAM,8CAAgDjS,EAAY,UAAY3D,EAAeiY,GAAK,gBAAkBnU,EAAK0lC,MAAM5wB,MAAQ,MAAQ9U,EAAK0lC,MAAM1wB,KACjKzU,EA6BhB,SAA4BrE,EAAMoN,GAY9B,IAXA,IAMIzJ,EACAsJ,EACA3Q,EACAJ,EATE2R,EAAO7N,EAAK6kB,WACZ3X,EAAMW,EAAKxR,OACX2R,EAAYhO,EAAK2kB,UACnBlhB,EAAOzD,EAAK6mJ,2BACZ1iJ,EAAQiJ,EAAKo8B,MAAM5wB,MAAQ5Y,EAAK0mB,OAAS1mB,EAAK8wK,aAAe9wK,EAAK8iB,KAChEzf,EAAW,GAMRgB,EAAI,EAAGA,EAAI6I,EAAK7I,IACrB/H,EAAWuR,EAAKxJ,GAAG0sK,oBACnB70K,EAAO2R,EAAKxJ,GAAGwsK,iBAEfltK,EAAU,IAAIgzC,GAAAnmB,GAGNxY,SAAW1b,EACnBqH,EAAQwyB,UAAY1yB,EACpBE,EAAQghB,UAAY3W,EACpBf,EAAM9I,EAAQjI,EAAO,EACrByH,EAAQmlI,WAAa3kI,EAAQ,IAAM8I,EACnC5J,EAAS0d,KAAKpd,GACdF,GAAQnH,EACR6H,GAASjI,EAGb,OAAOmH,CACV,CA9BD,CA7B8CA,EAAMS,GACpC+J,EAASxJ,EAAUrE,EAAgB9D,EAE1C,KAlE8B,CAC3B,GAAImH,EACAS,EAAK0lC,MAAM5wB,MAAQvV,EAAKqjB,QAAU5iB,EAAK0lC,MAAM5wB,MAC7C9U,EAAK0lC,MAAM1wB,IAAMhV,EAAK0lC,MAAM5wB,OAASvV,EAAKyf,MAAQ5V,OAC/C,IAAIc,EAAelK,EAAK0wJ,YAG3B,YADA3mJ,EAAS,KAAM7N,EAAgB9D,GAG/B,IAAM6W,EAAU5O,EAAQ6sK,aAEpBj+J,GAAWA,EAAQ+P,MACnBhf,EAAK0lC,MAAM5wB,MAAQ7F,EAAQ2T,OAAS3T,EAAQ+P,KAC5Chf,EAAK0lC,MAAM1wB,IAAMhV,EAAK0lC,MAAM5wB,MAAQ1L,GAEpCpJ,EAAK0lC,MAAM1wB,KAAO5L,CAEzB,CACDxJ,EAAyB1D,EAAgB2D,EAAWG,EAAK0lC,MAAOttC,EAAS,KAAM4H,EAClF,CAgDJ,EAMmD0H,MAJpC,WACZqC,EAAS,KAAM7N,EAAgB9D,EAClC,IAGDkR,EAAOwI,MAAP,8BAAAhW,OAA2C+D,EAA3C,OAAA/D,OAA0DkE,EAAK1B,IAA/D,gBAAAxC,OAAiFkE,EAAK0lC,MAAM5wB,MAA5F,OAAAhZ,OAAuGkE,EAAK0lC,MAAM1wB,KACrH,CAED,SAAShO,EAAS9K,EAAUoN,EAAgBzJ,GACxCA,EAAQ,CACJsvI,SAAUjzI,EACVkoI,eAAgB96H,EAChB5B,MAAOxL,OAAA,EAAuB,IAAIgP,EAAAwhB,EAAYxiB,EAAO2sI,+BAAgC3sI,EAAOouI,oCAEnG,CAyCD,SAAS1tI,EAAmB1O,GACxB,GAAKA,EAAKoC,IAAV,CAGA,IAAMgL,EAAU,IAAItJ,EAAA0sB,EAEpB,OADApjB,EAAQ6jK,QAAQjxK,GACToN,CAHN,CAIJ,CAYD,OAVApN,EAAW,CACPu3I,UA3QJ,SAAmBrqI,GACXA,EAAO46H,oBACPzjI,EAAoB6I,EAAO46H,mBAG3B56H,EAAOonI,cACPp4I,EAAcgR,EAAOonI,aAGrBpnI,EAAO0zI,mBACP/yI,EAAmBX,EAAO0zI,kBAG1B1zI,EAAOmxI,aACP16I,EAAauJ,EAAOmxI,YAGpBnxI,EAAO83I,YACP/3I,EAAYC,EAAO83I,WAGnB93I,EAAO0I,QACPxI,EAASF,EAAO0I,MAAM4jH,UAAUx5H,IAGhCkN,EAAO65I,kBACPzqJ,EAAkB4Q,EAAO65I,iBAGzB75I,EAAOg3H,SACPl2H,EAASd,EAAOg3H,QAGhBh3H,EAAOw6H,WACPrkI,EAAW6J,EAAOw6H,UAGlBx6H,EAAO85I,YACPvjJ,EAAYyJ,EAAO85I,WAGnB95I,EAAO6lI,gBACP5uI,EAAgB+I,EAAO6lI,cAE9B,EAgOG1I,WA1RJ,WACIn9H,EAAYwgB,GAAUtpB,GAASxD,OAAO,CAClCy9I,WAAY16I,EACZ2wI,YAAap4I,EACb0kJ,iBAAkB/yI,EAClBk5I,gBAAiBzqJ,EACjB0oJ,UAAW/3I,EACXi3H,OAAQl2H,EACR05H,SAAUrkI,EACV2jJ,UAAWvjJ,EACXsvI,cAAe5uI,GAEtB,EA+QG+sK,mBA/NJ,SAA4BlxK,EAAgBoN,GACxC,OAAO,IAAI7L,SAAQ,SAACoC,GAChBW,EAA+BtE,EAAgBoN,EAAWzJ,EAC7D,GACJ,EA4NGwtK,aA9KJ,SAAsBnxK,EAAgBoN,EAAWzJ,GAC7C,OAAO,IAAIpC,SAAQ,SAAC0L,GAChBvJ,EAAyB1D,EAAgBoN,EAAWzJ,EAAOsJ,EAC9D,GACJ,EA2KG+hC,MArDJ,WACQ9hC,IACAA,EAAU9C,QACV8C,EAAY,KAEnB,EAsDJ,CAEDuiC,GAAkBkqF,sBAAwB,oBAC1C,IAAA7iF,GAAe3yC,EAAAqsB,EAAAopG,oBAAiCnqF,ICtVhD,SAASU,GAAWnwC,GAGhB,IAAIoN,EADJpN,EAASA,GAAU,CAAC,EAGpB,IAAI2D,EAAO,IAAIgkB,SAAS3nB,EAAOoG,MAC3B6G,EAAM,EAsBV,SAAS3Q,EAAW0D,EAAKoN,GACrB,IAAI9Q,GAAA,EACAJ,EAAgB,EAmCpB,QAAI,IA/BAkR,IACAA,GAAA,GAGApN,EAAIy9E,IAAM,UACN95E,EAAK8iB,UAAUxZ,KAASjN,EAAIy9E,MAC5BnhF,GAAA,GAEJJ,EAAgB,GACT8D,EAAIy9E,IAAM,OAMR,IAJJ95E,EAAKi1H,UAAU3rH,GACftJ,EAAKsrC,SAAShiC,EAAM,KAGHjN,EAAIy9E,MACtBnhF,GAAA,GAEJJ,EAAgB,GACT8D,EAAIy9E,IAAM,KACb95E,EAAKi1H,UAAU3rH,KAASjN,EAAIy9E,MAC5BnhF,GAAA,GAEJJ,EAAgB,IAEZyH,EAAKsrC,SAAShiC,KAASjN,EAAIy9E,MAC3BnhF,GAAA,GAEJJ,EAAgB,IAGfI,GAAS0D,EAAIoxK,WAAahkK,EAC3B,MAAM,IAAII,MAAM,0BAOpB,OAJIlR,IACA2Q,GAAO/Q,GAGJI,CACV,CAqFD,SAASJ,EAAoB8D,GACzB,IAAIoN,EAAY,EACZ9Q,EAAO,IAEPJ,GAAc,EACd2R,EAAM,EACNX,EAAKvJ,EAAKsrC,SAAShiC,GACnBe,EAAI,EAER,IAAKA,EAAI,EAAGA,EANG,EAMWA,GAAK,EAAG,CAC9B,IAAKd,EAAK5Q,KAAUA,EAAM,CACtBuR,OAAA,IAAO7N,EAA2BkN,GAAM5Q,EAAO4Q,EAC/ChR,EAAa8R,EACb,KACH,CACD1R,IAAS,CACZ,CAED,IAAK0R,EAAI,EAAGA,EAAI9R,EAAY8R,GAAK,EAAGZ,GAAa,EAC7CS,EAAOA,GAAO,EAAM,IAAOlK,EAAKsrC,SAAShiC,EAAMG,GAKnD,OAFAH,GAAOG,EAEAS,CACV,CAuGD,OAbAT,EAAW,CACPikK,OA3QJ,WACI,OAAOpkK,CACV,EA0QGqkK,OAxQJ,SAAgBtxK,GACZiN,EAAMjN,CACT,EAuQGuxK,WAAYj1K,EACZk1K,kBA5LJ,SAA2BxxK,EAAKoN,GAC5B,IAAIzJ,EAAQrH,EAAW0D,EAAKoN,GAM5B,OAJIzJ,GACAzH,IAGGyH,CACV,EAqLG8tK,SAtKJ,SAAkBzxK,GACd,IAAI2D,EAIJ,OAFArH,EAAW0D,GACX2D,EAAOzH,IACAkR,EAASpN,EAAIixB,OAAOttB,EAC9B,EAiKG+tK,gBAhJJ,SAAyB1xK,EAAKoN,GAC1B,IACIzJ,EADAkK,EAAQvR,EAAW0D,EAAKoN,GAQ5B,OALIS,IACAlK,EAAazH,IACb+Q,GAAOtJ,GAGJkK,CACV,EAuIG8jK,oBAAqBz1K,EACrB01K,iBAvFJ,SAA0B5xK,GACtB,IAAIoN,EAEJ,OAAQpN,GACJ,KAAK,EACDoN,EAAWzJ,EAAKkuK,WAAW5kK,GAC3BA,GAAO,EACP,MACJ,KAAK,EACDG,EAAWzJ,EAAKmuK,WAAW7kK,GAC3BA,GAAO,EAGf,OAAOG,CACV,EA0EG2kK,gBA/DJ,SAAyB/xK,GACrB,GAAIA,EAAO,EACP,OAsBR,SAA8BA,GAI1B,IAHA,IAAMoN,EAAQwB,KAAK2Q,MAAM/Q,OAAOO,iBAAmB,KAC/CzS,EAAM,EAEDJ,EAAI,EAAGA,EAAI8D,EAAM9D,GAAK,EAAG,CAC9B,GAAII,EAAM8Q,EACN,MAAM,IAAII,MAAM,oCAEpBlR,GAAO,IACP,IAAMuR,EAAIlK,EAAKsrC,SAAShiC,EAAM/Q,GAC9B,GAAII,EAAMkS,OAAOO,iBAAmBlB,EAChC,MAAM,IAAIL,MAAM,oCAEpBlR,GAAOuR,CACV,CAGD,OADAZ,GAAOjN,EACA1D,CACV,CAlBD,CAtBoC0D,GAKhC,IAFA,IAAIoN,EAAM,EAED9Q,EAAI,EAAGA,EAAI0D,EAAM1D,GAAK,EAC3B8Q,IAAQ,EACRA,GAAgC,IAAzBzJ,EAAKsrC,SAAShiC,EAAM3Q,GAI/B,OADA2Q,GAAOjN,EACAoN,IAAQ,CAClB,EAkDG4kK,SAdJ,WACI,OAAO/kK,EAAMtJ,EAAK4d,UACrB,EAgBJ,CAED4uB,GAAWwpF,sBAAwB,aACnC,IAAA/pF,GAAezrC,EAAAqsB,EAAAyqG,gBAA6B9qF,ICpS5C,SAASoI,KAEL,IAEIv4C,EACAoN,EACAzJ,EACAsJ,EACA3Q,EACAuR,EACAX,EACAc,EACAvK,EACAU,EAXEd,EAAUiT,KAAK9V,QAwXrB,SAAS6D,EAAoBrE,GACzB,IAAMoN,EAAU,IAAItJ,EAAA0sB,EAEpB,OADApjB,EAAQ6jK,QAAQjxK,GACToN,CACV,CAmBD,OAVApN,EAAW,CACPu3I,UA7SJ,SAAmB5zI,GACf,KAAKA,EAAOmkI,mBAAsBnkI,EAAO2wI,aAAgB3wI,EAAOi9I,kBAAqBj9I,EAAO06I,YACxF,MAAM,IAAI7wI,MAAMtR,EAAAs0B,EAAA+iH,sBAEpBpvI,EAAoBR,EAAOmkI,kBAC3Bj6H,EAAclK,EAAO2wI,YACrBpnI,EAAmBvJ,EAAOi9I,iBAC1B3zI,EAAatJ,EAAO06I,WACpB56I,EAASE,EAAOugI,OAChB92H,EAASzJ,EAAOiS,MAAM4jH,UAAUx5H,GAChC1D,EAAkBqH,EAAOojJ,eAC5B,EAmSG1c,WAxTJ,WACIr8H,EAAY0f,GAAUrqB,GAASzC,OAAO,CAClCy9I,WAAYpxI,EACZqnI,YAAazmI,EACb+yI,iBAAkB1zI,EAClB65I,gBAAiBzqJ,EACjB4nI,OAAQzgI,GAEf,EAiTGytK,mBA7GJ,SAA4BlxK,EAAgB2D,GACxC,OAAO,IAAIpC,SAAQ,SAAC0L,GAChB,IAAI3Q,EAAU,KACVJ,EAAU8D,EAAiBmE,EAAkB6B,QAAQhG,EAAeyN,MAAQ,KAC5EI,EAAY7N,EAAiBA,EAAewpC,MAAMn7B,MAAM,KAAO,KAC/DnB,EAAO,CACPs8B,MAAO,CACH5wB,MAAO/K,EAAYiJ,WAAWjJ,EAAU,IAAM,KAC9CiL,IAAKjL,EAAYiJ,WAAWjJ,EAAU,IAAM,MAEhDnN,QAASpE,EACT8F,IAAKlG,EAAUA,EAAQkG,SAAA,EACvBk+C,MAAA,EACAi6E,UAAW52H,GAGfyJ,EAAO0I,KAAK,iCAEZxZ,EAAU+H,EAAoB6I,GAY9Bc,EAAUglB,KAAK,CACXtyB,QAASpE,EACToyD,QAZW,WAGXzhD,EAAQjN,EACX,EASGwL,MAPc,WACdyB,EAAQjN,EACX,IAQDoN,EAAOwI,MAAM,sBAAwB1I,EAAK9K,IAC7C,GACJ,EAwEG+uK,aAtEJ,SAAsBnxK,EAAgBiN,EAAW3Q,GAC7C,OAAO,IAAIiF,SAAQ,SAACrF,GAChB,IAAI2R,EAAU,KACVX,EAAUlN,EAAiBmE,EAAkB6B,QAAQhG,EAAeyN,MAAQ,KAC5ErJ,EAAQ8I,EAAUA,EAAQ9K,SAAA,EAe9ByL,EAAUxJ,EAbC,CACPmwJ,YAAa,EACbic,YAHc,KAIdjnI,MAAO,CACH5wB,MAAO,EACPE,IANU,MAQdpY,QAASmN,EACTzL,IAAKgC,EACLk8C,MAAA,EACAi6E,UAAWttH,IAQfG,EAAOwI,MAAM,uBAmBb5H,EAAUglB,KAAK,CACXtyB,QAASmN,EACT6gD,QAnBW,SAAUzhD,IAtJjC,SAAyBjN,EAAMiN,EAAO3Q,EAAUJ,GAC5C,GAAK8D,GAA4B,IAApBA,EAAKuhB,WAAlB,CAIA,IAGI1T,EACAX,EACAzJ,EACAU,EANAC,EAAawrC,GAAWvsC,GAASzC,OAAO,CACxCwF,KAAMpG,IAMNsE,EAAQhI,EAAWA,EAAS+R,MAAM,KAAO,KACzCvK,EAAU,KACVJ,EAAO,CACPtB,IAAK6K,EACLu8B,MAAO,CACH5wB,MAAOtU,EAAQwS,WAAWxS,EAAM,IAAM,KACtCwU,IAAKxU,EAAQwS,WAAWxS,EAAM,IAAM,MAExC5D,QAASoD,GAeb,IAZAsJ,EAAOwI,MAAM,sBAAwBlS,EAAKtB,KAG1CgC,EAAWstK,gBAAgB/tK,EAAKsuK,MAChC7tK,EAAWmtK,WAAW5tK,EAAKuuK,SAG3BzuK,EAAaW,EAAWutK,sBACxBluK,GAAcW,EAAWitK,SACzBltK,EAAeC,EAAWitK,SAGnBjtK,EAAW4tK,aACjB5tK,EAAWotK,kBAAkB7tK,EAAKuuK,QAAQC,MAAA,IACvC,KAAM/tK,EAAWstK,gBAAgB/tK,EAAKuuK,QAAQE,UAAA,IAC1ChuK,EAAWstK,gBAAgB/tK,EAAKuuK,QAAQG,QAAA,IACxCjuK,EAAWstK,gBAAgB/tK,EAAKuuK,QAAQhyG,MAAA,IACxC97D,EAAWstK,gBAAgB/tK,EAAK2uK,MAAA,IAChC,MAAM,IAAI9kK,MAAM,oCAKxB,cAAOK,GAAwB,CAC3B,IAAI/C,EAAU1G,EAAWutK,qBAAA,GACrBjjK,EAAkBtK,EAAWutK,sBAEzB7mK,IACCnH,EAAKuuK,QAAQC,KAAKI,SAAS90F,IAC5B5vE,EAAWzJ,EAAWT,EAAKuuK,QAAQC,KAAKI,SAASthJ,OAAOviB,GAGxDtK,EAAWktK,OAAOltK,EAAWitK,SAAW3iK,EAGnD,CAKD5K,EAAUO,EAAoBX,GAY9BsK,EAAUglB,KAAK,CACXtyB,QAASoD,EACT4qD,QAZW,SAAU1uD,GACrBkN,EAlHR,SAAuBlN,EAAMiN,EAAc3Q,EAAYJ,GACnD,IAAI2R,EACAX,EACAc,EACAvK,EACAU,EACAE,EACAD,EACAE,EAQJ,IALA0J,EAAW,GAKN7J,EAAI,EAAGE,GANZ6I,EA3DJ,SAAmBlN,GACf,IAIIoN,EACAH,EALA3Q,EAAO,GACPJ,EAAa0zC,GAAWvsC,GAASzC,OAAO,CACxCwF,KAAMpG,IAOV,IAFA9D,EAAWs1K,kBAAkB7tK,EAAKuuK,QAAQhyG,MAEnChkE,EAAW81K,YAClB91K,EAAWs1K,kBAAkB7tK,EAAKuuK,QAAQhyG,KAAKsyG,UAAA,IAAiB,CAM5D,KALAplK,EAAM,CAAC,GAEHqlK,QAAUv2K,EAAWu1K,SAAS9tK,EAAKuuK,QAAQhyG,KAAKsyG,SAASC,SAE7DrlK,EAAIslK,UAAY,GACTx2K,EAAW81K,YAClB91K,EAAWq1K,WAAW5tK,EAAKuuK,QAAQhyG,KAAKsyG,SAASG,mBAAA,IAA0B,CACvE,IAAM9kK,EAAuB3R,EAAWy1K,sBAClCzkK,EAAWhR,EAAWm1K,SAI5B,IAHApkK,EAAW,CAAC,GAEH2lK,MAAQ12K,EAAWu1K,SAAS9tK,EAAKuuK,QAAQhyG,KAAKsyG,SAASG,kBAAkBE,UAC3D,IAAnB5lK,EAAS2lK,MACT,MAAM,IAAIplK,MAAM,yBAGpBP,EAAS6lK,gBACL52K,EAAWu1K,SAAS9tK,EAAKuuK,QAAQhyG,KAAKsyG,SAASG,kBAAkBI,oBAErE3lK,EAAIslK,UAAU3xJ,KAAK9T,GAGnB/Q,EAAWo1K,OAAOpkK,EAAWW,EAChC,CAED,GAA6B,IAAzBT,EAAIslK,UAAUr2K,OACd,MAAM,IAAImR,MAAM,gCAEpBlR,EAAKykB,KAAK3T,EACb,CAED,GAAoB,IAAhB9Q,EAAKD,OACL,MAAM,IAAImR,MAAM,gCAEpB,OAAOlR,CACV,CA/CD,CA2DuB0D,IAMM3D,OAAQ8H,EAAIE,EAAKF,GAAK,EAC3CV,EAAU,IAAIkzC,GAAAnmB,EAIV3iB,EADA1J,EAAI+I,EAAO7Q,OAAS,EACT6Q,EAAO/I,EAAI,GAAGsuK,QAAUvlK,EAAO/I,GAAGsuK,QAElCv2K,EAAkBgR,EAAO/I,GAAGsuK,QAK3ChvK,EAAQuU,SAAWnK,EACnBpK,EAAQ0yB,UAAYjpB,EAAO/I,GAAGsuK,QAC9BhvK,EAAQkhB,UAAY,IACpBvgB,EAAQ8I,EAAO/I,GAAGuuK,UAAU,GAAGI,gBAAkB7lK,EAG7C3I,EADAH,EAAI+I,EAAO7Q,OAAS,EACd6Q,EAAO/I,EAAI,GAAGuuK,UAAU,GAAGI,gBAAkB7lK,EAAe,EAE5D3Q,EAAa,EAGvBmH,EAAQqlI,WAAa1kI,EAAQ,IAAME,EACnC0J,EAAS+S,KAAKtd,GAKlB,OAFA2J,EAAOwI,MAAM,gBAAkB5H,EAAS3R,OAAS,UAE1C2R,CACV,CA9CD,CAkHiChO,EAAUmE,EAAcV,EAAYoK,GAC7D3R,EAASgR,EACZ,EAUG1B,MARc,WACd4B,EAAO5B,MAAM,wBAA0B9H,EAAKtB,KAC5ClG,EAAS,KACZ,IAQDkR,EAAOwI,MAAM,sBAAwBlS,EAAKtB,IAAM,UAAYsB,EAAK8lC,MAAM5wB,MAAQ,IAAMlV,EAAK8lC,MAAM1wB,IA7E/F,MAFG5c,EAAS,KAgFhB,CAlFD,CAuJ4B+Q,EAAU7I,EAAO9H,GAAU,SAAU8Q,GACjDlR,EAAQ,CACJ+2I,SAAU7lI,EACV86H,eAAgBloI,EAChBwL,MAAO4B,OAAA,EAAuB,IAAI4B,EAAAwhB,EAAY/sB,EAAOk3I,+BAAgCl3I,EAAO24I,oCAEnG,GACJ,EAYG5wI,MAVc,WACdtP,EAAQ,CACJgsI,eAAgBloI,EAChBwL,MAAO,IAAIwD,EAAAwhB,EAAY/sB,EAAOk3I,+BAAgCl3I,EAAO24I,oCAE5E,GAOJ,GAEJ,EAqBGptG,MAZJ,WACQhhC,IACAA,EAAU5D,QACV4D,EAAY,KAEnB,GArXGrK,EAAO,CACHsuK,KAAM,CACFx0F,IAAK,UACL2zF,UAAA,GAEJc,QAAS,CACLz0F,IAAK,UACL2zF,UAAA,EACAgB,SAAU,CACN30F,IAAK,UACL2zF,UAAA,GAEJe,KAAM,CACF10F,IAAK,UACL2zF,UAAA,EACA4B,cAAe,CACXv1F,IAAK,QACL2zF,UAAA,EACAngJ,MAAO,mBAEXshJ,SAAU,CACN90F,IAAK,MACL2zF,UAAA,EACAngJ,MAAO,qBAGfohJ,OAAQ,CACJ50F,IAAK,UACL2zF,UAAA,GAEJlxG,KAAM,CACFud,IAAK,UACL2zF,UAAA,EACAoB,SAAU,CACN/0F,IAAK,IACL2zF,UAAA,EACAqB,QAAS,CACLh1F,IAAK,IACL2zF,UAAA,EACAngJ,MAAO,mBAEX0hJ,kBAAmB,CACfl1F,IAAK,IACL2zF,UAAA,EACAyB,SAAU,CACNp1F,IAAK,IACL2zF,UAAA,EACAngJ,MAAO,mBAEX8hJ,mBAAoB,CAChBt1F,IAAK,IACL2zF,UAAA,EACAngJ,MAAO,uBAM3BqhJ,KAAM,CACF70F,IAAK,IACL2zF,UAAA,IAqULpxK,CACV,CAEDu4C,GAAsBohF,sBAAwB,wBAC9C,IAAA3/E,GAAe71C,EAAAqsB,EAAAopG,oBAAiCrhF,IC1XhD,SAASC,GAAsBx4C,GAC3BA,EAASA,GAAU,CAAC,EAEpB,IAYIoN,EACAzJ,EACAsJ,EAdE3Q,EAAUga,KAAK9V,QACftE,EAAW8D,EAAOynI,SAClB55H,EAAS7N,EAAOs2G,OAChBppG,EAAclN,EAAOs0I,YACrBtmI,EAAmBhO,EAAO4gJ,iBAC1Bn9I,EAAazD,EAAOq+I,WACpBl6I,EAAoBnE,EAAO8nI,kBAC3BzkI,EAAQrD,EAAO4V,MACfvR,EAAYrE,EAAOglJ,UACnB5gJ,EAAkBpE,EAAO+mJ,gBACzBziJ,EAAStE,EAAOkkI,OAoCtB,SAASpgI,EAAO9D,GAEZ,MAAO,UADMA,EAAWA,EAASqO,MAAM,KAAK,GAAK,IAC1BzE,aAC1B,CAsCD,OATAwD,EAAW,CACPi9H,WA5BJ,WACI1mI,EAAkB0mI,aAClBp9H,EAAsBo9H,YACzB,EA0BG8I,0BAxBJ,SAAmCnzI,GAC/B,OAAI8D,EAAO9D,EAAKkoI,eAAelzE,UACpB/nD,EAAsBikK,mBAAmBlxK,EAAKkoI,eAAgBloI,EAAKu6H,WAEnE52H,EAAkButK,mBAAmBlxK,EAAKkoI,eAAgBloI,EAAKu6H,UAE7E,EAmBG8Y,eAjBJ,SAAwBrzI,GACpB,OAAI8D,EAAO9D,EAAEg1D,UACF/nD,EAAsBkkK,aAAanxK,EAAEkoI,eAAgBloI,EAAEu6H,UAAWv6H,EAAEkoI,eAAiBloI,EAAEkoI,eAAe2L,WAAa,MAEnHlwI,EAAkBwtK,aAAanxK,EAAEkoI,eAAgBloI,EAAEu6H,UAAWv6H,EAAEkoI,eAAiBloI,EAAEkoI,eAAe2L,WAAa,KAE7H,EAYG7kG,MAVJ,WACIrrC,EAAkBqrC,QAClB/hC,EAAsB+hC,OACzB,GA1DGrrC,EAAoBmzC,GAAkBx6C,GAAS68H,cAC/ClsH,EAAwB+sC,GAAsB19C,GAAS68H,cAEvDx1H,EAAkB4zI,UAAU,CACxBzP,kBAAmB3jI,EACnBmwI,YAAapnI,EACb0zI,iBAAkB5yI,EAClBqwI,WAAY56I,EACZgkI,SAAUvrI,EACVo6G,OAAQzoG,EACRq2H,OAAQ5/H,EACRsR,MAAOvS,EACP2hJ,UAAW3gJ,EACX0iJ,gBAAiB3iJ,IAGrB6I,EAAsBsqI,UAAU,CAC5BzP,kBAAmB3jI,EACnBmwI,YAAapnI,EACb0zI,iBAAkB5yI,EAClBqwI,WAAY56I,EACZgkI,SAAUvrI,EACVo6G,OAAQzoG,EACRq2H,OAAQ5/H,EACRsR,MAAOvS,EACP0jJ,gBAAiB3iJ,IA6ClBgJ,CACV,CAEDorC,GAAsBmhF,sBAAwB,wBAC9C,IACAlhF,GADgBt0C,EAAAqsB,EAAAopG,oBAAiCphF,ICrFjDgB,GATI,SAAAx5C,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAA3oD,GACVsW,KAAK2B,GAAK,KACV3B,KAAK+iG,QAAU,KACf/iG,KAAK6qI,iBAAmB,KACxB7qI,KAAK+yH,UAAY,KACjB/yH,KAAKunI,cAAgB,IACxB,EC6BL5kG,GAnCI,SAAAj5C,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAA3oD,GACVsW,KAAK2B,GAAK,KACV3B,KAAK+F,MAAQ,KACb/F,KAAKrY,KAAO,KACZqY,KAAKqxH,WAAa,KAClBrxH,KAAKksJ,oBAAsB,EAC3BlsJ,KAAK28J,OAAS,KACd38J,KAAKkZ,KAAO,KACZlZ,KAAK4rJ,UAAY,KACjB5rJ,KAAK6rJ,0BAA4B,KACjC7rJ,KAAKyrJ,cAAgB,KACrBzrJ,KAAK+rJ,+BAAiC,KACtC/rJ,KAAK0rJ,0BAA4B,KACjC1rJ,KAAKgsJ,0CAA4C,KACjDhsJ,KAAKurJ,MAAQ,KACbvrJ,KAAK8rJ,qBAAuB,KAC5B9rJ,KAAKiP,MAAQ,KACbjP,KAAK0+C,SAAW,KAChB1+C,KAAK8gJ,kBAAoB,KACzB9gJ,KAAK48J,QAAA,EACL58J,KAAK68J,IAAM,KACX78J,KAAKk7I,YAAc,KACnBl7I,KAAKynI,aAAe,KACpBznI,KAAKugJ,WAAa,KAClBvgJ,KAAKq3I,kBAAoB,EACzBr3I,KAAK8gI,uBAAyB,CAAC,EAC/B9gI,KAAK88J,8BAAgC,GACrC98J,KAAKw4I,oBAAsB,CAAC,EAC5Bx4I,KAAK+8J,2BAA6B,GAClC/8J,KAAKivI,kBAAA,EACLjvI,KAAKkvI,qBAAA,CACR,ECrBLjsG,GAVI,SAAAv5C,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAA3oD,GACVsW,KAAK2B,GAAK,KACV3B,KAAK+F,MAAQ,KACb/F,KAAKsC,MAAQ+6B,IACbr9B,KAAK0B,SAAW27B,IAChBr9B,KAAKghI,aAAe,KACpBhhI,KAAK0gI,QAAA,CACR,ECMLr+F,GAbI,SAAA34C,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAA3oD,GACVsW,KAAKmiI,cAAgB9kG,IACrBr9B,KAAKgxG,WAAa,KAClBhxG,KAAKg9J,cAAgB,KACrBh9J,KAAKiiI,cAAgB5kG,IACrBr9B,KAAK0B,SAAW27B,IAChBr9B,KAAKo/H,WAAA,EACLp/H,KAAKuoJ,oBAAsB,KAC3BvoJ,KAAKgrJ,oBAAsB,GAC3BhrJ,KAAK/T,SAAW,IACnB,WAAAy2C,GAAAh5C,EAAAoN,GAAA,QAAAzJ,EAAA,EAAAA,EAAAyJ,EAAA/Q,OAAAsH,IAAA,KAAAsJ,EAAAG,EAAAzJ,GAAAsJ,EAAAmvD,WAAAnvD,EAAAmvD,aAAA,EAAAnvD,EAAA6wE,cAAA,YAAA7wE,IAAAA,EAAAmuH,UAAA,GAAAt+H,OAAAmC,eAAAe,EAAAiN,EAAA9P,IAAA8P,EAAA,MCsHLyrC,GAjIM,WACF,SAAA14C,EAAYoN,GAAU,IAAAzJ,EAAA,eAAA3D,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,2CAAA3oD,GAElBsW,KAAKskC,MAAuB,KAAfxtC,EAAS,GAItBkJ,KAAK7I,KAAOL,EAASiB,MAAM,KACtBgJ,QAAO,SAACrX,GAAD,OAAoC,IAArBA,EAAU3D,MAAzB,IACPwpB,KAAI,SAAC7lB,GACF,IAAIoN,EAAS,CACTjP,KAAM6B,GAGNiN,EAAiBjN,EAAUyI,QAAQ,KACvC,IAAuB,GAAnBwE,EAAsB,CACtBG,EAAOjP,KAAO6B,EAAUmO,UAAU,EAAGlB,GAErC,IAAI3Q,EAAY0D,EAAUmO,UAAUlB,EAAiB,EAAGjN,EAAU3D,OAAS,GAG3EsH,EAAKi3C,MAAQj3C,EAAKi3C,QAAoC,GAA3Bt+C,EAAUmM,QAAQ,KAE7C,IAAIvM,EAAgBI,EAAUmM,QAAQ,MAChB,GAAlBvM,GACAkR,EAAOmmK,UAAY,CACfp1K,KAAM7B,EAAU6R,UAAU,EAAGjS,GAC7B4L,MAAOxL,EAAU6R,UAAUjS,EAAgB,KAIQ,GAAnD,CAAC,IAAM,KAAKuM,QAAQ2E,EAAOmmK,UAAUzrK,MAAM,MAC3CsF,EAAOmmK,UAAUzrK,MAAQsF,EAAOmmK,UAAUzrK,MAAMqG,UAAU,EAAGf,EAAOmmK,UAAUzrK,MAAMzL,OAAS,KAKjG+Q,EAAOlI,SAAWsR,SAASla,EAAW,IAAM,CAEnD,CAED,OAAO8Q,CACV,GACR,KAAAzJ,EAAA,OAAAA,EAAA,EAAAxG,IAAA,UAAA2K,MAED,WACI,OAAOwO,KAAKskC,KACf,IAAAz9C,IAAA,eAAA2K,MAED,WACI,OAAQwO,KAAKk9J,gBAChB,IAAAr2K,IAAA,iBAAA2K,MAED,WACI,OAAOwO,KAAK7I,KAAK6I,KAAK7I,KAAKpR,OAAS,GAAG8B,KAAK0gC,WAAW,IAC1D,IAAA1hC,IAAA,mBAAA2K,MAED,WACI,MAAgD,WAAzCwO,KAAK7I,KAAK6I,KAAK7I,KAAKpR,OAAS,GAAG8B,IAC1C,IAAAhB,IAAA,eAAA2K,MAED,SAAa9H,EAAMoN,GAOf,IANA,IAAIzJ,EAAS,KACTsJ,EAAOjN,EAEP1D,EAAQ,EACRJ,EAAO,MAEHI,EAAQga,KAAK7I,KAAKpR,QAAmB,OAAT4Q,GAAe,CAE/CtJ,EAASsJ,EAGT,IAAIY,EAAYyI,KAAK7I,KAAKnR,GAI1B,GAHAJ,EAAO2R,EAAU1P,KAGb7B,IAAUga,KAAK7I,KAAKpR,OAAS,IAAOH,EAAK2iC,WAAW,MAAiB,WAAT3iC,EAAoB,CAChF,IAAIgR,EAAWvJ,EAAOzH,EAAO,aAAe,GACpB,IAApBgR,EAAS7Q,QAAgBsH,EAAOzH,IAChCgR,EAAS6T,KAAKpd,EAAOzH,IAGrB2R,EAAU3I,SACV+H,EAAOC,EAASW,EAAU3I,WAAa,KAChC2I,EAAU0lK,UAAW,WAC5B,IAAIvzK,EAAO6N,EAAU0lK,UACrBtmK,EAAOC,EAASmK,QAAO,SAACjK,GAAD,OAASA,EAAIpN,EAAK7B,OAAS6B,EAAK8H,KAAhC,IAAuC,IAAM,IAFxC,IAK5BmF,EAAOC,EAAS,IAAM,IAE7B,CAED5Q,GACH,CAED,OAAa,OAAT2Q,EAEO,KAIP/Q,EAAK2iC,WAAW,KACT,CACH1gC,KAAMjC,EAAKiS,UAAU,GACrBslK,KAAMxmK,EACNq3E,OAAQr3E,GAKE,WAAT/Q,EACE,CACHiC,KAAM,SACNs1K,KAAMxmK,EACNq3E,OAAQr3E,GAKT,CACH9O,KAAMjC,EACNu3K,KAAMxmK,EACNq3E,OAAQl3E,EAAqBzJ,EAASsJ,EAE7C,MAAA+rC,GAnFAh5C,EAmFAjD,UAAA4G,GAAA3D,CAAA,CA9HC,YAAA05C,GAAA15C,EAAAoN,GAAA,QAAAzJ,EAAA,EAAAA,EAAAyJ,EAAA/Q,OAAAsH,IAAA,KAAAsJ,EAAAG,EAAAzJ,GAAAsJ,EAAAmvD,WAAAnvD,EAAAmvD,aAAA,EAAAnvD,EAAA6wE,cAAA,YAAA7wE,IAAAA,EAAAmuH,UAAA,GAAAt+H,OAAAmC,eAAAe,EAAAiN,EAAA9P,IAAA8P,EAAA,MCcNqsC,GAdM,WACF,SAAAt5C,EAAYoN,EAAQzJ,EAAOsJ,IAAA,SAAAjN,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAO,KAAA3oD,GAC9BsW,KAAK6nB,OAAS/wB,EACdkJ,KAAKo9J,MAAQ/vK,EACb2S,KAAKxO,MAAQmF,EACbqJ,KAAKpR,SAAW,IACnB,KAAAvB,EAAA,OAAAA,EAAA,EAAAxG,IAAA,eAAA2K,MAED,SAAa9H,GACT,IAAIoN,EAAqC,WAAhBkJ,KAAK6nB,QAAuC,YAAhB7nB,KAAK6nB,QAA0C,WAAlB7nB,KAAKpR,UAA2C,UAAlBoR,KAAKpR,SACrH,OAAOoR,KAAKo9J,MAAMC,aAAa3zK,EAAMoN,EACxC,MAAAssC,GALA15C,EAKAjD,UAAA4G,GAAA3D,CAAA,CAXC,GCEN,SAASy5C,KACL,IAAIz5C,EACAoN,EAEEzJ,EAAU2S,KAAK9V,QAkGrB,OAVAR,EAAW,CACP47J,WAnFJ,SAAoB57J,GAChB,OAAOA,GAASA,EAAM/C,eAAe4Q,EAAA2iB,EAAAkhH,mBAAA,CACxC,EAkFG8c,eAhFJ,SAAwBxuJ,GACpB,OAAOA,GAASA,EAAM/C,eAAe4Q,EAAA2iB,EAAAghH,cAA8B,IAAI35H,KAAK7X,EAAM6N,EAAA2iB,EAAAghH,eAA+B,IACpH,EA+EGoiC,uBA7EJ,SAAgC5zK,GAC5B,OAAOA,GAASA,EAAM/C,eAAe4Q,EAAA2iB,EAAAihH,uBAAuC,IAAI55H,KAAK7X,EAAM6N,EAAA2iB,EAAAihH,wBAAwC,IACtI,EA4EGoiC,SA1EJ,SAAkB7zK,GACd,OAAQA,GAASA,EAAM6N,EAAA2iB,EAAAkhH,kBAAmC,IAC7D,EAyEGoiC,mBAvEJ,SAA4B9zK,GACxB,OAAKA,GAKGA,EAAMqmK,YAAc,IAAIxgJ,KAAI,SAAC7lB,GACjC,IAAI2D,EAAS7G,OAAOP,KAAKyD,GAAe,GAGxC,GAAe,QAAX2D,GAA+B,WAAXA,GAAkC,YAAXA,EAE3C,OADAyJ,EAAOX,KAAP,oCAAA7M,OAAgD+D,IACzC,KAGX,IAAIsJ,EAAOjN,EAAc2D,GACrBrH,EAAW2Q,EAAK8mK,IAGpB,GAAe,QAAXpwK,GAAoBsJ,EAAKhP,KAAM,CAC/B,IAAKgP,EAAKhP,KAAK4gC,WAAW,KAEtB,OADAzxB,EAAOX,KAAP,2DAAA7M,OAAuEqN,EAAKhP,KAA5E,KAAA2B,OAAoFqN,EAAKu/I,SAClF,KAKXlwJ,EAAW,GAAHsD,OAAMtD,EAAN,KAAAsD,OAAkBqN,EAAKhP,KAClC,CAED,IAAI/B,EAAQ,IAAIw8C,GAAYp8C,GAC5B,IAAKJ,EAAMm0B,UAEP,OADAjjB,EAAOX,KAAP,0CAAA7M,OAAsD+D,EAAtD,OAAA/D,OAAkEtD,IAC3D,KAGX,IAAIuR,EAAQ,KACR3R,EAAMs3K,kBAAoBt3K,EAAM83K,mBAChCnmK,EAAQZ,EAAKu/I,QAAU,GACL,WAAX7oJ,IACPkK,EAAQZ,EAAKo5J,WAAWn5I,QAAO,SAACltB,EAAQoN,GAMpC,IAAIzJ,EAAM7G,OAAOP,KAAK6Q,GAAO,GAM7B,MAJY,UAARzJ,IACA3D,EAAO2D,GAAO3D,EAAO2D,IAAQ,GAC7B3D,EAAO2D,GAAKod,KAAK3T,EAAMzJ,KAEpB3D,CACV,GAAE,CAAC,IAGR,IAAIkN,EAAY,IAAIosC,GAAe31C,EAAQzH,EAAO2R,GAMlD,MAJe,QAAXlK,IACAuJ,EAAUhI,SAAW+H,EAAKoqD,KAGvBnqD,CACV,IAAEmK,QAAO,SAACrX,GAAD,QAAiBA,CAAjB,IA7DC,EA8Dd,GAnFGoN,GAAA,EAAS/J,EAAAmtB,GAAM7sB,GAASw1H,cAAcK,UAAUx5H,GA+F7CA,CACV,CAEDy5C,GAAmBkgF,sBAAwB,qBAC3C,IAAAhgF,GAAex1C,EAAAqsB,EAAAopG,oBAAiCngF,IC/FhD,SAASG,KACL,IAAI55C,EACAoN,EACAzJ,EACAsJ,EACA3Q,EACAJ,EACAgR,EAEEc,EAAUsI,KAAK9V,QA0GrB,SAASiD,EAAqBzD,EAAa2D,EAAMzH,GAC7C,IAhBegR,EAgBTc,EAAcZ,EAAkBkgJ,sBAAsBrgJ,EAAU,GAAGo7H,IAAIC,SAAUtoI,EAAa2D,GAEpG,IAAKqK,GAAsC,IAAvBA,EAAY3R,OAAc,OAAO,KAErD,GAAI2R,EAAY3R,OAAS,GAAKH,EAAY,CACtC,IAAMuH,EAAsBY,EAAuBnI,EAAYyH,GAE/D,GAAIrH,EAAiBJ,EAAW+b,KAAO3b,EAAiBJ,EAAW+b,IAAItU,GACnE,IAAK,IAAIN,EAAI,EAAGe,EAAK4J,EAAY3R,OAAQgH,EAAIe,EAAIf,IAC7C,GAAIc,EAAmB7H,EAAiBJ,EAAW+b,IAAItU,GAAOF,EAAoBJ,IAC9E,OAAO2K,EAAY3K,GAK/B,IAAK,IAAIiB,EAAI,EAAGR,EAAKkK,EAAY3R,OAAQiI,EAAIR,EAAIQ,IAC7C,GAhCO4I,EAgCOc,EAAY1J,GA/B3B8I,EAAkB2/I,sBAAsB7/I,GAAYmK,QAAO,SAAUrX,GACxE,OAAOA,EAAK8H,QAAU+F,EAAA2iB,EAAAy+G,IACzB,IAAE,GA8BS,OAAOjhI,EAAY1J,EAG9B,CAED,OAAO0J,EAAY,EACtB,CAUD,SAAS7J,EAAmBnE,EAAUoN,GAClC,IAAKpN,IAAaoN,EACd,OAAO,EAGX,IAAMzJ,EAAS3D,EAASiY,KAAO7K,EAAS6K,GAClChL,EAAYjN,EAASulB,QAAUnY,EAASmY,MACxCjpB,EAAgB0D,EAASkiK,YAAc90J,EAAS80J,UAChDhmK,EAA+B86B,KAAKC,UAAUj3B,EAASmiK,6BAA+BnrI,KAAKC,UAAU7pB,EAAS+0J,2BAC9Gt0J,EAAW7N,EAASwvB,OAASpiB,EAASoiB,KACtCtiB,EAAYlN,EAAS6hK,MAAM7kK,aAAeoQ,EAASy0J,MAAM7kK,WACzDgR,EAA2BgpB,KAAKC,UAAUj3B,EAASoiK,wBAA0BprI,KAAKC,UAAU7pB,EAASg1J,sBACrG3+J,EAAoBzD,EAAS+hK,cAAc/kK,aAAeoQ,EAAS20J,cAAc/kK,WACjFmH,EAAmC6yB,KAAKC,UAAUj3B,EAASqiK,kCAAoCrrI,KAAKC,UAAU7pB,EAASi1J,gCACvHh/J,EAAgCrD,EAASgiK,0BAA0BhlK,aAAeoQ,EAAS40J,0BAA0BhlK,WACrHqH,EAA+C2yB,KAAKC,UAAUj3B,EAASsiK,6CAA+CtrI,KAAKC,UAAU7pB,EAASk1J,2CAEpJ,OAAQ3+J,GAAUsJ,GAAa3Q,GAAiBJ,GAAgC2R,GAAYX,GAAac,GAA4BvK,GAAqBU,GAAoCd,GAAiCgB,CAClO,CAED,SAAShB,EAAiBrD,EAAU2D,EAAQsJ,EAAY3Q,EAAauR,EAAMX,GACvE,IACIc,EACAvK,EACAU,EACAd,EACAgB,EACAD,EANAE,EAAW,GAQf,IAAKhI,GAAsC,IAAvBA,EAAYD,OAC5B,MAAO,GAGX,IAAMyH,EAAgBsJ,EAAkB6hJ,wBAAwBtrJ,GAEhE,IAAKN,EAAI,EAAGe,EAAK9H,EAAYD,OAAQgH,EAAIe,EAAIf,IAKzC,GAJA2K,EAAO1R,EAAY+G,GAEnBI,EAAQ4hB,EAA6BvhB,EADrCK,EAAMiJ,EAAkBggJ,sBAAsBp/I,EAAMhO,EAAUiN,EAAWoP,SAGrEnP,EAAc,CACd,IAAIxJ,EAAsBD,EAAMs+J,cAAc1lK,OAC9C,IAAKgI,EAAI,EAAGA,EAAIX,EAAqBW,IACjC,GAAKZ,EAAL,CAGA,IAAIqH,EAAgBrH,EAAMs+J,cAAc19J,GACxC,GAA0C,IAAtCyG,EAAcrC,QAAQ,YAAmB,CACzC,IACIiG,EADQ5D,EAAcqD,UAAU,GAClBE,MAAM,KACxB,GAAiC,OAA7BK,EAAM,GAAGP,UAAU,EAAG,GACtB,IAAK9J,EAAI,EAAGA,EAAIqK,EAAMrS,OAAQgI,IACrBZ,IACDA,EAAQ4hB,EAA6BnoB,KAAKoZ,KAAMxS,EAAcK,KAElEiS,EAAmC3S,EAAOiL,EAAMrK,GAAG8J,UAAU,EAAG,GAAIO,EAAMrK,GAAG8J,UAAU,IACvF7J,EAASyc,KAAKtd,GACdA,EAAQ,UAGZ,IAAKY,EAAI,EAAGA,EAAIqK,EAAMrS,OAAQgI,IACrBZ,IACDA,EAAQ4hB,EAA6BnoB,KAAKoZ,KAAMxS,EAAcK,KAElEiS,EAAmC3S,EAAO,MAAQY,EAAI,GAAIqK,EAAMrK,IAChEC,EAASyc,KAAKtd,GACdA,EAAQ,IAGnB,MAA+C,IAArCqH,EAAcrC,QAAQ,aAC7B2N,EAAmC3S,EAAOvH,EAAU+3K,IAAK,OACzD3vK,EAASyc,KAAKtd,GACdA,EAAQ,KA3BX,CA8BR,MAAUoK,IAAS3R,EAAUgwJ,OACMzoJ,EA02B9BxF,KAAO/B,EAAUgwJ,MAz2BnB5nJ,EAASyc,KAAKtd,GACdA,EAAQ,MACDA,GACPa,EAASyc,KAAKtd,GAItB,OAAOa,CACV,CAWD,SAASD,EAAuBrE,EAAY2D,EAAMrH,GAC9C,IAAIuR,EAAiBZ,EACjBC,EAAW5Q,EACX0R,EAAW,GAEf,GAAId,EACA8B,IAEAnB,EAAiBzJ,EAAkB8I,OAChC,CACH,KAAID,EAAU5Q,OAAS,GAGnB,OAAO2R,EAFPd,EAAWD,EAAU,GAAGo7H,IAAIC,QAInC,CAED,IAAM7kI,EAAmBiL,EAAuB1O,EAAY6N,GACxD1J,EAAqBiJ,EAAkBkgJ,sBAAsBpgJ,EAAUlN,EAAaA,EAAWqc,MAAQ,KAAM1Y,GAUjH,OARAqK,EAAW3K,EAAiB6J,EAAUzJ,EAAkBzD,EAAYmE,EAAoBR,GAGpFA,IAASzH,EAAUy6H,OACnBxyH,EAAqBiJ,EAAkBkgJ,sBAAsBpgJ,EAAUlN,EAAaA,EAAWqc,MAAQ,KAAMngB,EAAUuvE,OACvHz9D,EAAWA,EAASpO,OAAOyD,EAAiB6J,EAAUzJ,EAAkBzD,EAAYmE,EAAoBR,GAAA,KAGrGqK,CACV,CA2TD,SAAS5J,EAAkBpE,GACvB,IAAM2D,EAAMW,EAAOtE,GACnB,OAAOoN,EAAkB8nI,kBAAkBvxI,EAC9C,CASD,SAASW,EAAOtE,GACZ,IAAM2D,EAAWD,EAAY1D,GAC7B,OAAOoN,EAAkB8hJ,OAAOvrJ,EACnC,CA+MD,SAASG,IACLmJ,EAAY,GACZ3Q,EAAmB,CAAC,CACvB,CAwID,SAASoH,EAAY1D,GACjB,OAAOA,IAAsCiN,EAAU5Q,OAAS,EAAI4Q,EAAU,GAAGo7H,IAAIC,SAAW,KACnG,CAED,SAASx9H,EAA0B9K,GAC/B,IACI,IAAM2D,EAAmB+K,EAAuB1O,EAAU2nI,WAAY16H,GAChE3Q,EAAgB8Q,EAAkB6hJ,wBAAwBtrJ,GAEhE,OAAK3D,GAAcA,EAAU2nI,iBAAA,IAAc3nI,EAAU2nI,WAAW1vH,IAAqB3b,EAC9EA,EAAc0D,EAAUqc,OAD4E,IAI9G,CAFC,MAAOrc,GACL,OAAO,IACV,CACJ,CAED,SAAS0O,EAAuB1O,EAAYoN,GAGxC,IAFA,IAAMzJ,EAAKyJ,EAAe/Q,OAEjB4Q,EAAI,EAAGA,EAAItJ,EAAIsJ,IAAK,CACzB,IAAI3Q,EAAW8Q,EAAeH,GAE9B,GAAIjN,GAAcA,EAAWiY,KAAO3b,EAAS2b,GAAI,OAAO3b,CAC3D,CAED,OAAO,IACV,CAED,SAAS+oB,EAA6BrlB,GAClC,IAAKA,EACD,OAAO,KAGX,IAEI2D,EAAWsJ,EAAK3Q,EAASJ,EAAO2R,EAFhCG,EAAY,IAAIirC,GACdx1C,EAAiBzD,EAAWooI,OAAOC,IAAIC,SAASC,eAAevoI,EAAWooI,OAAO/rH,OAAOmsH,sBAAsBxoI,EAAWqc,OA2D/H,GAxDArO,EAAUiK,GAAKjY,EAAWiY,GAC1BjK,EAAUqO,MAAQrc,EAAWqc,MAC7BrO,EAAU/P,KAAO+B,EAAW/B,KAC5B+P,EAAU25H,WAAa74H,EAA0B9O,EAAWooI,QAC5Dp6H,EAAUw0J,oBAAsBp1J,EAAkBqhJ,uBAAuBhrJ,GACzEuK,EAAUilK,OAAS7lK,EAAkB0gJ,uBAAuBrqJ,GAC5DuK,EAAUwhB,KAAOpiB,EAAkBy/I,yBAAyBppJ,GAC5DuK,EAAUu3I,iBAAmBn4I,EAAkByjJ,oBAAoBptJ,GACnEuK,EAAUw3I,oBAAsBp4I,EAAkB0jJ,uBAAuBrtJ,GAEzEE,EAAYyJ,EAAkB0/I,0BAA0BrpJ,GACxDuK,EAAUk0J,UAAYv+J,EAAUtH,OAASsH,EAAU,GAAGmE,WAAA,EACtDkG,EAAUm0J,0BAA4Bx+J,EAEtCkK,EAAgBT,EAAkB4/I,8BAA8BvpJ,GAChEuK,EAAU+zJ,cAAgBl0J,EAAcgY,KAAI,SAAU7lB,GAClD,IAAIoN,EAAqBpN,EAAc8H,MACnCnE,EAAoByJ,EASxB,OARIpN,EAAc+6C,aAAgB/6C,EAAc+6C,YAAYr4C,OAAO,YAAc,YAAcwK,IAEvFvJ,EADAyJ,EACoB,WAAaA,EAEb,UAExBY,EAAUkmK,kBAAA,GAEPvwK,CACV,IACDqK,EAAUq0J,+BAAiCx0J,EAE3CZ,EAAMG,EAAkB6/I,0CAA0CxpJ,GAClEuK,EAAUg0J,0BAA4B/0J,EAAI4Y,KAAI,SAAU7lB,GACpD,OAAOA,EAA0B8H,KACpC,IACDkG,EAAUs0J,0CAA4Cr1J,EAEH,IAA/Ce,EAAUg0J,0BAA0B3lK,QAAgBG,MAAMC,QAAQgH,EAAeglI,yBAA2BhlI,EAAeglI,uBAAuBpsI,OAAS,IAC3JC,EAAU8Q,EAAkB8/I,8CAA8CzpJ,EAAeglI,uBAAuB,IAChHz6H,EAAUg0J,0BAA4B1lK,EAAQupB,KAAI,SAAU7lB,GACxD,OAAOA,EAA0B8H,KACpC,IACDkG,EAAUs0J,0CAA4ChmK,GAG1DJ,EAAQkR,EAAkB2/I,sBAAsBtpJ,GAChDuK,EAAU6zJ,MAAQ3lK,EAAM2pB,KAAI,SAAU7lB,GAClC,OAAOA,EAAK8H,KACf,IACDkG,EAAUo0J,qBAAuBlmK,EAEjC8R,EAAUuX,MAAQnY,EAAkBqgJ,SAAShqJ,GAC7CuK,EAAUgnD,SAAW5nD,EAAkBwgJ,YAAYnqJ,GACnDuK,EAAUopJ,kBAAoBhqJ,EAAkB4gJ,yBAAyBvqJ,GACzEuK,EAAUwjJ,YAAcpkJ,EAAkBshJ,4BAA4BjrJ,GACtEuK,EAAU2/I,kBAAoBvgJ,EAAkBsgJ,qBAAqBjqJ,GAEjEuK,EAAUopJ,kBAAmB,CAE7B,IAAMjzJ,EAAS6J,EAAUopJ,kBAAkBvxI,KAAI,SAAA7lB,GAAE,OAAIoN,EAAkBygJ,OAAO7tJ,EAA7B,IAAkCqX,QAAO,SAAArX,GAAG,OAAY,OAARA,CAAJ,IAC7F,GAAImE,EAAO9H,OAAQ,CACf,IAAMgH,EAAQc,EAAO,GACrB6J,EAAUopJ,kBAAkB1tJ,SAAQ,SAAA1J,GAChCA,EAAGonB,MAAQ/jB,CACd,GACJ,CACJ,CAID,GAFA2K,EAAUklK,OAAS9lK,EAAkBs/I,UAAUjpJ,GAC/CuK,EAAUopI,uBAAyBhqI,EAAkB2jJ,uCAAuCttJ,KACrFuK,EAAUopI,wBAAmF,IAAzDt6I,OAAOP,KAAKyR,EAAUopI,wBAAwB/6I,SAAiBG,MAAMC,QAAQgH,EAAeglI,yBAA2BhlI,EAAeglI,uBAAuBpsI,OAAS,EAAG,CAChN,IAAIgI,EAAMZ,EAAeglI,uBAAuB5iH,KAAK,SAAA7lB,GACjD,OAAOoN,EAAkB8jJ,2CAA2ClxJ,EACvE,IACIqE,EAAI08G,OAAO,SAAA/gH,GAAC,OAAIg3B,KAAKC,UAAUj3B,KAAOg3B,KAAKC,UAAU5yB,EAAI,GAA7C,MAEb2J,EAAUopI,uBAAyB/yI,EAAI,GAE9C,CAED,GADA2J,EAAUolK,8BAAgChmK,EAAkB6jJ,8CAA8CxtJ,KACnGuK,EAAUolK,+BAAoF,IAAnDplK,EAAUolK,8BAA8B/2K,SAAiBG,MAAMC,QAAQgH,EAAeglI,yBAA2BhlI,EAAeglI,uBAAuBpsI,OAAS,EAAG,CACjN,IAAI+H,EAAMX,EAAeglI,uBAAuB5iH,KAAK,SAAA7lB,GACjD,OAAOoN,EAAkB+jJ,kDAAkDnxJ,EAC9E,IACIoE,EAAI28G,OAAO,SAAA/gH,GAAC,OAAIg3B,KAAKC,UAAUj3B,KAAOg3B,KAAKC,UAAU7yB,EAAI,GAA7C,MAEb4J,EAAUolK,8BAAgChvK,EAAI,GAErD,CAQD,OANA4J,EAAU8gJ,oBAAsB1hJ,EAAkBsiJ,oCAAoCjsJ,GACtFuK,EAAUqlK,2BAA6BjmK,EAAkBuiJ,2CAA2ClsJ,GAEpGuK,EAAU+vI,aAAe3wI,EAAkBu/I,gBAAgBlpJ,GAC3DuK,EAAU6oJ,YAAA,EAEH7oJ,CACV,CAED,SAASoI,EAAmCpW,EAAWoN,EAASzJ,GAC5D3D,EAAUiY,GAAK7K,EACfpN,EAAUqc,MAAQ,IAAM7F,SAASpJ,EAAQe,UAAU,EAAG,IACtDnO,EAAU/B,KAAO/B,EAAUy6H,KAC3B32H,EAAUulB,MAAQ,iBAClBvlB,EAAU62J,YAAA,EACV72J,EAAU+9I,cAAA,EACV,IAAI9wI,EAAWq4C,KAAe3hD,GAC9B3D,EAAUwvB,KAAQviB,GAAuBtJ,EACzC3D,EAAU6hK,MAAQ,CAAC,WACnB7hK,EAAUoiK,qBAAuB,CAAC,CAACrnH,YAAY,0BAA2BjzC,MAAM,WACnF,CAMD,SAASgH,EAA0B9O,GAC/B,IAa8B2D,EAC1BsJ,EAdA3Q,EAAa,IAAIi9C,GAUrB,OAPAj9C,EAAW2b,GAAKjY,EAAOiY,GACvB3b,EAAW+f,MAAQrc,EAAOqc,MAC1B/f,EAAWsc,MAAQ5Y,EAAO4Y,MAC1Btc,EAAW0b,SAAWhY,EAAOgY,SAC7B1b,EAAWg7I,cAMmB3zI,EANqB3D,EAAOqoI,KAOtDp7H,EAAe,IAAI0rC,IAEV8/F,cAAgB90I,EAAI6mJ,qBACjCv9I,EAAaq6G,WAAa3jH,EAAI2kI,SAAShhB,WACvCr6G,EAAaqmK,cAAgB3vK,EAAIslI,sBACjCh8H,EAAasrI,cAAgB50I,EAAI2kI,SAASiQ,cAC1CtrI,EAAa4xJ,oBAAsBl7J,EAAI8mJ,mBACvCx9I,EAAa+K,SAAW5K,EAAkBihJ,YAAY1qJ,EAAI2kI,UAC1Dr7H,EAAayoI,UAAYtoI,EAAkB8qI,aAAav0I,EAAI2kI,UAC5Dr7H,EAAaq0J,oBAAsBl0J,EAAkBmjJ,uBAAuB5sJ,EAAI2kI,UAChFr7H,EAAa1K,SAAWoB,EAAI2kI,SAAS/lI,SAE9B0K,GAlBP3Q,EAAW06I,OAAuD,IAA9Ch3I,EAAOqoI,IAAIC,SAASC,eAAelsI,QAAgBuS,KAAKC,IAAKvS,EAAWsc,MAAQtc,EAAW0b,SAAY1b,EAAWg7I,aAAat/H,UAPjI,EASX1b,CACV,CAkBD,SAAS0S,IACL,IAAK9S,EACD,MAAM,IAAIsR,MAAM,iDAEvB,CAED,SAASrR,EAAU6D,GACf,OAAOiN,EAAU5Q,OAAS,EAAI4Q,EAAU,GAAGo7H,IAAIC,SAASC,eAAevoI,GAAa,IACvF,CAQD,SAAS+S,EAAmB/S,EAAQoN,EAAkBzJ,GAClD,IACIsJ,EACA3Q,EACAJ,EACA2R,EACAX,EAEJ,GAAIlN,EAEA,IADAiN,EAAqBjN,EAAOwoI,sBACvB36H,EAA0B,EAAGA,EAA0BZ,EAAmB5Q,OAAQwR,GAAoD,EAGvI,IADA3R,EADgB+Q,EAAmBY,GACC46H,uBAC/Bv7H,EAA2B,EAAGA,EAA2BhR,EAAoBG,OAAQ6Q,GAAsD,EAE5I,GAAIE,KADJ9Q,EAAiBJ,EAAoBgR,IACG+K,GACpC,OAAItU,EACOuJ,EAEA5Q,EAO3B,OAAO,IACV,CAsED,OA9CA0D,EAAW,CACPm0K,8BA5cJ,SAAuCn0K,EAAkBoN,GACrD,IAAIzJ,EAKJ,OAFAA,EAAiBoP,EAFJ5W,EAAUiR,GAEqBpN,IAEpB2D,EAAe+kI,UAAY,IACtD,EAscG0rC,0BA5bJ,SAAmCp0K,EAAkBoN,GAGjD,OA8XJ,SAAiCpN,EAAQoN,GACrC,IAAMzJ,EAAQoP,EAAmB/S,EAAQoN,GAAA,GAEzC,OAAiB,OAAVzJ,EAAiBA,GAAS,CACpC,CAJD,CAhYiBxH,EAAUiR,GAEgBpN,EAC1C,EAybGq0K,yBA/aJ,SAAkCr0K,EAAY2D,GAG1C,OAmZJ,SAA4B3D,EAAQ2D,GAChC,IAAIsJ,EACA3Q,EACAJ,EACA2R,EAEJ,IAAK7N,IAAW2D,EAAY,OAAQ,EAGpC,IADArH,EAAqB0D,EAAOwoI,sBACvB36H,EAA0B,EAAGA,EAA0BvR,EAAmBD,OAAQwR,GAAoD,EAGvI,GADA3R,GADA+Q,EAAgB3Q,EAAmBuR,IACC46H,uBAChCr7H,EAAkBq/I,YAAYx/I,EAAetJ,GAC7C,OAAOzH,EAAoBG,OAInC,OAAQ,CACX,CAlBD,CArZiBF,EAAUwH,GAEW3D,EACrC,EA4aG41I,0CAloCJ,SAAmD51I,GAC/C,GAAIA,EAAkB,CAClB,IAAI2D,EAAqB,IAAI61C,GACvBvsC,EAAiBjN,EAAiBmoI,WAAWC,OAAOC,IAAIC,SAASC,eAAevoI,EAAiBmoI,WAAWC,OAAO/rH,OAAOmsH,sBAAsBxoI,EAAiBmoI,WAAW9rH,OAC5K/f,EAAqB8Q,EAAkBuhJ,qBAAqB3uJ,EAAiBqc,MAAOpP,GAS1F,OAPAtJ,EAAmBsU,GAAKjY,EAAiBiY,GACzCtU,EAAmB01G,QAAUr5G,EAAiBqc,MAC9C1Y,EAAmB+kI,UAAYt7H,EAAkBkhJ,aAAahyJ,GAC9DqH,EAAmBw9I,iBAAmBnhJ,EAAiB4zI,kBAAoB5zI,EAAiBizI,UAAYjzI,EAAiBizI,SAAS52I,OAAS,EAAI2D,EAAiBizI,SAAS,GAAGj7H,SAAW27B,KACvLhwC,EAAmBk6I,cAAgB79I,EAAiB69I,cACpDl6I,EAAmB0lI,UAAYhkH,EAA6BrlB,EAAiBmoI,YAEtExkI,CACV,CACG,OAAO,IAEd,EAknCGi6J,eAv4BJ,SAAwB59J,EAAkBoN,GACtC,IAAMzJ,EAAU,GACZrH,EAAiB2Q,EAQrB,GALIjN,IACAgP,IACA1S,EAAiB8H,EAAkBpE,IAGnC1D,EAAeD,OAAS,EAAG,GACtB+Q,GAAkBA,EAAiB9Q,EAAeD,UACnD+Q,EAAiB9Q,EAAeD,QAEpC,IAAK,IAAIH,EAAI,EAAGA,EAAIkR,EAAgBlR,IAChCyH,EAAQod,KAAKjS,EAA0BxS,EAAeJ,IAE7D,CAED,OAAOyH,CACV,EAo3BGm7J,oBAzmCJ,SAA6B9+J,EAAY2D,GACrC,GAAyB,IAArBsJ,EAAU5Q,SAAiB2D,EAC3B,OAAO,KAGX,IAAI1D,EAAmBoS,EAAuB1O,EAAYiN,GAC1D,IAAK3Q,EAAkB,OAAO,KAE9B,IAAMJ,EAAgBkR,EAAkB6hJ,wBAAwB3yJ,GAE5DuR,EAAiBpK,EAAqBzD,EAAWqc,MAAO1Y,EAAM3D,GAClE,OAAK6N,EAGEwX,EAA6BnpB,EAF1BkR,EAAkBggJ,sBAAsBv/I,EAAgBZ,EAAU,GAAGo7H,IAAIC,SAAUtoI,EAAWqc,SAD5E,IAI/B,EA2lCGu6I,uBAAAvyJ,EACA2zJ,qBAAAv0J,EACAkiJ,kBA72BJ,SAA2B3lJ,EAAY2D,GACnC,IAAIrH,EACAJ,EAEE2R,EAAmBa,EAAuB1O,EAAYiN,GAQ5D,OANA3Q,EAAKqH,EAAYA,EAAUsU,GAAK,KAE5BhL,EAAU5Q,OAAS,GAAKwR,IACxB3R,EAAiBI,EAAK8Q,EAAkBigJ,mBAAmB/wJ,EAAI2Q,EAAU,GAAGo7H,IAAIC,SAAUz6H,EAAiBwO,OAASjP,EAAkB+/I,sBAAsBxpJ,EAAYA,EAAU0Y,MAAQ,KAAMpP,EAAU,GAAGo7H,IAAIC,SAAUz6H,EAAiBwO,QAGzOngB,CACV,EAi2BGmlK,0BAv1BJ,SAAmCrhK,EAAY2D,GAC3C,IAAIrH,EAAIJ,EAEF2R,EAAmBa,EAAuB1O,EAAYiN,GAO5D,OANA3Q,EAAKqH,EAAYA,EAAUsU,GAAK,KAE5BhL,EAAU5Q,OAAS,GAAKwR,IACxB3R,EAAiBI,EAAK8Q,EAAkBigJ,mBAAmB/wJ,EAAI2Q,EAAU,GAAGo7H,IAAIC,SAAUz6H,EAAiBwO,OAASjP,EAAkB+/I,sBAAsBxpJ,EAAYA,EAAU0Y,MAAQ,KAAMpP,EAAU,GAAGo7H,IAAIC,SAAUz6H,EAAiBwO,QAG3OngB,EACEkR,EAAkBw/I,uCAAuC1wJ,GADpC,EAE/B,EA40BGo4K,qBAtzBJ,SAA8Bt0K,GAC1B,OAAOoN,EAAkBogJ,sBAAsBxtJ,EAAOiN,EAAU,GAAGo7H,IAAIC,SAC1E,EAqzBGsnB,wCAt0BJ,SAAiD5vJ,GAC7C,IACI,OAAOoN,EAAkBwiJ,wCAAwC5vJ,EAGpE,CAFC,MAAOA,GACL,MAAO,EACV,CACJ,EAi0BG4lJ,qBA7yBJ,SAA8B5lJ,GAC1B,IAEM2D,EAAemH,EAA0B9K,GAG/C,OAFSoN,EAAkBwhJ,gCAAgCjrJ,EAG9D,EAuyBGgjJ,aAjuBJ,SAAsB3mJ,EAAM2D,EAAkBrH,GAC1C,IAAIJ,EAAS,GAEb,GAAI+Q,EAAU5Q,OAAS,EAAG,CACtB,IAAMwR,EAAWZ,EAAU,GAAGo7H,IAAIC,SAElC,GAAItoI,aAAgBu5C,GAAY,CAC5B,IAAMrsC,EAASwB,EAAuB1O,EAAMiN,GAC5C/Q,EAASkR,EAAkB+hJ,mBAAmBjiJ,EACjD,MAAM,GAAIlN,aAAgBi5C,GAAW,CAClC,IAAMjrC,EAASU,EAAuBpS,EAAY2Q,GAClD/Q,EAASkR,EAAkByiJ,+BAA+BhiJ,EAAU/C,EAA0B9K,GAAOgO,EACxG,MAAM,GAAIhO,aAAgBw5C,GAAoB,CAC3C,IAAM/1C,EAASiL,EAAuBpS,EAAY2Q,GAClD/Q,EAASkR,EAAkB2iJ,gCAAgCliJ,EAAUlK,EAAkBF,EAC1F,CACJ,CAED,OAAOvH,CACV,EA+sBG4qJ,SA3xBJ,SAAkB9mJ,EAAUoN,EAAczJ,EAAgBsJ,GACtD,IACI,IAAKjN,IAAaoN,GAAgBkoB,MAAM3xB,KAAoBsJ,EACxD,OAAO,KAGX,IAAM3Q,EAAc0D,EAASu0K,cACvBr4K,EAAQ8D,EAAS8H,MAEvB,IAAKsF,EAAa9Q,EAAc,IAAMJ,GAClC,OAAO,KAGX,IAQI2R,EAREX,EAAQ,IAAI8W,GACZhW,EAAYhO,EAAS2kB,WAAa,EAClClhB,EAAcwJ,EAAiBk7H,WAAWC,OAAOxvH,MACjDzU,EAAciJ,EAAa9Q,EAAc,IAAMJ,GAE/CmH,EAA0BiyB,MAAMroB,EAAiBk9I,wBAAqE70H,MAAMnxB,EAAYgmJ,wBAA+D,EAArChmJ,EAAYgmJ,uBAAnGl9I,EAAiBk9I,uBAE9F9lJ,EAAwBrE,EAASw0K,wBAA0BxmK,EAI3DH,EADqB,IAArB7N,EAASiM,QACoBxI,EAAcE,EAAiBN,EAAyBgB,EAExDZ,EAAcJ,EAAyBgB,EAGxE,IAAMD,EAAWpE,EAASy0K,eAAiBzmK,EACrC1J,EAAKtE,EAASiY,GACdnU,EAAc9D,EAAS00K,aAW7B,OATAxnK,EAAM49I,YAAc3mJ,EACpB+I,EAAM49I,YAAYhjJ,MAAQ5L,EAC1BgR,EAAM49I,YAAYnmI,UAAY3W,EAC9Bd,EAAM8K,SAAW5T,EACjB8I,EAAM+K,GAAK3T,EACX4I,EAAMoiJ,2BAA6BzhJ,EACnCX,EAAM29I,YAAc/mJ,EACpBoJ,EAAMguC,sBAAwB72C,EAEvB6I,CAGV,CAFC,MAAOlN,GACL,OAAO,IACV,CACJ,EA8uBGkvJ,OAAA5qJ,EACAizI,UA3qCJ,SAAmBv3I,GACVA,IAEDA,EAAOgnJ,YACP9qJ,EAAY8D,EAAOgnJ,WAGnBhnJ,EAAO20K,eACPznK,EAAelN,EAAO20K,cAGtB30K,EAAOq+I,YACPjxI,EAAkBmqI,UAAU,CAAE8G,WAAYr+I,EAAOq+I,aAGjDr+I,EAAOoxJ,QACPhkJ,EAAkBmqI,UAAU,CAAE6Z,OAAQpxJ,EAAOoxJ,SAEpD,EA0pCG2N,cAr6BJ,SAAuB/+J,GACnB,IAAKA,EAAa,OAAO,KAEzBgP,IAEA/B,EAAY7I,EAAkBpE,EACjC,EAg6BGklJ,eA1rBJ,SAAwBllJ,GACpB,OAAOoN,EAAkBs/I,UAAU1sJ,EACtC,EAyrBGgwJ,oBAjrBJ,WACI,IAAMhwJ,EAAW0D,IACjB,OAAO0J,EAAkB4iJ,oBAAoBhwJ,EAChD,EA+qBGq4I,8BAvqBJ,WACI,IAAMr4I,EAAMiN,EAAU5Q,OAAS,EAAI4Q,EAAU,GAAGo7H,IAAM,KACtD,OAAOj7H,EAAkBirI,8BAA8Br4I,EAC1D,EAqqBGw4I,yBA5pBJ,SAAkCx4I,GAC9B,IAAM2D,EAAMW,EAAOtE,GACnB,OAAOoN,EAAkBorI,yBAAyB70I,EACrD,EA0pBG8oJ,YA/ZJ,SAAqBzsJ,EAAY2D,GAC7B,OAAOyJ,EAAkBq/I,YAAYzsJ,EAAY2D,EACpD,EA8ZGu0I,aAlpBJ,SAAsBl4I,GAClB,IAAM2D,EAAWD,EAAY1D,GAC7B,OAAOoN,EAAkB8qI,aAAav0I,EACzC,EAgpBG0qJ,YAvoBJ,SAAqBruJ,GACjB,IAAM2D,EAAWD,EAAY1D,GAC7B,OAAOoN,EAAkBihJ,YAAY1qJ,EACxC,EAqoBGuxI,kBAAA9wI,EACAgsJ,mBArmBJ,SAA4BpwJ,GACxB,OAAOoN,EAAkBgjJ,mBAAmBpwJ,EAC/C,EAomBGqwJ,YA3lBJ,SAAqBrwJ,GACjB,OAAOoN,EAAkBijJ,YAAYrwJ,EACxC,EA0lBGswJ,iBA1jBJ,SAA0BtwJ,GACtB,IAAM2D,EAAiByJ,EAAkBkjJ,iBAAiBtwJ,GACpDiN,EAAcG,EAAkBohJ,eAAexuJ,GAGrD,OAAK2D,GAA4C,IAA1BA,EAAetH,QAAiB4Q,EAIhDtJ,EAAe0T,QAAO,SAACrX,GAE1B,OAAOs1B,MAAMt1B,EAAc4gI,MAAS3zH,EAAY6K,UAAY9X,EAAc4gI,KAAM,IAAI/oH,MAAOC,SAC9F,IANU,EAOd,EA8iBGy2I,wBAjlBJ,SAAiCvuJ,GAAmC,IAAzB2D,EAAyBrF,UAAAjC,OAAA,YAAAiC,UAAA,GAAAA,UAAA,GAAH,EAC7D,OAAO8O,EAAkBmhJ,wBAAwBvuJ,EAAU2D,EAC9D,EAglBG6qJ,eAvkBJ,SAAwBxuJ,GACpB,OAAOoN,EAAkBohJ,eAAexuJ,EAC3C,EAskBG6kK,SAtiBJ,SAAkB7kK,GACd,OAAOoN,EAAkB+gJ,WAAWnuJ,EA/pBpB,qCAgqBnB,EAqiBG47J,WA5hBJ,SAAoB57J,GAChB,OAAO2D,EAAmBi4J,WAAW57J,EACxC,EA2hBGkwJ,uBAjhBJ,SAAgClwJ,GAC5B,OAAOoN,EAAkB8iJ,uBAAuBlwJ,EACnD,EAghBGmwJ,8BAvgBJ,WACI,OAAO/iJ,EAAkB+iJ,+BAC5B,EAsgBG1C,SA3fJ,SAAkBztJ,EAAY2D,EAAkBsJ,GAC5C,OAAOG,EAAkBqgJ,SAASztJ,EAAY2D,EAAkBsJ,EACnE,EA0fG2nK,cApcJ,SAAuB50K,GACnB,IAAKA,GAA2B,IAArBiN,EAAU5Q,OACjB,OAAO,KAEX,IAAM+Q,EAAUH,EAAUoK,QAAO,SAACjK,GAC9B,OAAOA,EAAE6K,KAAOjY,CACnB,IAED,OAAIoN,GAAWA,EAAQ/Q,OAAS,EACrB+Q,EAAQ,GAGZ,IACV,EAwbG8sJ,oBA3tBJ,SAA6Bl6J,EAAUoN,EAAMzJ,GACzCrH,EAAiB0D,GAAY1D,EAAiB0D,IAAa,CAAC,EAC5D1D,EAAiB0D,GAAUoN,GAAQ9Q,EAAiB0D,GAAUoN,IAAS,CAAC,EACxE9Q,EAAiB0D,GAAUoN,GAAQzJ,CACtC,EAwtBGk4J,aA9ZJ,SAAsB77J,EAAUiN,GAC5B,IAAI3Q,EAAa8Q,EAAkB8gJ,MAAMluJ,GACrC9D,EAAkByH,EAAmBkwK,SAAS5mK,GAC9CY,EAAsBT,EAAkBohJ,eAAexuJ,GACvDkN,EAAmBvJ,EAAmB6qJ,eAAevhJ,GACrDe,EAA8BrK,EAAmBiwK,uBAAuB3mK,GAO5E,SAAU3Q,GAAcJ,GAAoBI,GAAcJ,GACtD2R,GAAuBG,GAAgCH,EAAoBiK,WAAa9J,EAA4B8J,WACpH5K,GAAqBW,EAAoBiK,UAAY5K,EAAiB4K,UAC7E,EAgZGgkJ,qBAvYJ,SAA8B97J,EAAUoN,GAEpCzJ,EAAmBmwK,mBAAmB1mK,GACjC1D,SAAQ,SAAC0D,GACN,IAAIzJ,EAASyJ,EAAUumK,aAAa3zK,GAGpC,GAAe,OAAX2D,EAAJ,CAJoB,IAQdsJ,EAAuBtJ,EAAvBxF,KAAM7B,EAAiBqH,EAAjB2gF,OAAQpoF,EAASyH,EAAT8vK,KAGpB,GAAIrmK,EAAUsmK,MAAMF,kBAA6B,WAATvmK,EACpC,OAAQG,EAAU+wB,QACd,IAAK,MACL,IAAK,UAED7hC,EAAO2Q,GAAQG,EAAUtF,MACzB,MACJ,IAAK,gBAEMxL,EAAO2Q,OAT1B,CAgBA,IAAIY,GAAoBvR,EAAO2Q,EAAO,aAAe,IAAIxE,QAAQvM,GAC7DgR,EAAuC,YAAvBE,EAAUlI,UAAiD,WAAvBkI,EAAUlI,SAGlE,IAAyB,WAArBkI,EAAU+wB,QAA4C,YAArB/wB,EAAU+wB,iBAIpC7hC,EAAO2Q,IAGW,GAArBY,GAAwB,CACxB,IAAIG,EAAc1R,EAAO2Q,EAAO,YAChCe,EAAYwZ,OAAO3Z,EAAkB,GACjCG,EAAY3R,OAAS,EACrBC,EAAO2Q,GAAQe,EACc,GAAtBA,EAAY3R,OAEnBC,EAAO2Q,GAAQe,EAAY,UAGpB1R,EAAO2Q,EAAO,WAE5B,CAOoB,QAArBG,EAAU+wB,QAAyC,YAArB/wB,EAAU+wB,QAExCrhC,OAAOP,KAAK6Q,EAAUtF,OAAO4B,SAAQ,SAAC1J,GAClC,IAAI2D,EAAcyJ,EAAUtF,MAAM9H,GAE9B9D,EAAeI,EAAO0D,EAAS,aAAe,GAKlD,GAJ4B,IAAxB9D,EAAaG,QAAgBC,EAAO0D,IACpC9D,EAAa6kB,KAAKzkB,EAAO0D,IAGD,IAAxB9D,EAAaG,OAEbH,EAAeyH,MACZ,CAEH,IAAIqK,EAAW9R,EAAaG,OAKxB2R,EAJAhO,GAAUiN,IAA6B,GAArBY,EAIPA,GAAoBX,EAAe,EAAI,IAA0B,WAApBE,EAAU+wB,QAAuB,EAAI,GAGlFjxB,EAAe,EAAIhR,EAAaG,OAI/CH,EAAasrB,OAAO9F,MAAMxlB,EAAc,CAAC8R,EAAU,GAAGpO,OAAO+D,GAChE,CAGDrH,EAAO0D,EAAS,YAAc9D,EAC9BI,EAAO0D,GAAiC,GAAvB9D,EAAaG,OAAcH,EAAa,GAAKA,CACjE,GAlEJ,CAlBA,CAsFJ,GACR,EAwSGo9J,mBAAAn1J,EACA6qC,MAAAlrC,GA3sCAsJ,EAAoBuY,GAAkB3X,GAASmrH,cAC/Cx1H,EAAqBg2C,GAAmB3rC,GAASmrH,cACjDr1H,IA6sCG9D,CACV,CAED45C,GAAY+/E,sBAAwB,cACpC,IAAA5/E,GAAe51C,EAAAqsB,EAAAopG,oBAAiChgF,IAAA,SAAAuU,GAAAnuD,EAAAoN,GAAA,QAAAzJ,EAAA,EAAAA,EAAAyJ,EAAA/Q,OAAAsH,IAAA,KAAAsJ,EAAAG,EAAAzJ,GAAAsJ,EAAAmvD,WAAAnvD,EAAAmvD,aAAA,EAAAnvD,EAAA6wE,cAAA,YAAA7wE,IAAAA,EAAAmuH,UAAA,GAAAt+H,OAAAmC,eAAAe,EAAAiN,EAAA9P,IAAA8P,EAAA,MCvuC3B6hD,GAAA,oBAAA9uD,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,2CAAA3oD,EAAA,KAAA2D,EAAA,OAAAA,EAAA,EAAAxG,IAAA,UAAA2K,MASjB,SAAe9H,EAAOoN,GAClB,OAaR,SAAwBpN,EAAMoN,EAAOzJ,GAEjC,gBAAWA,GAAgC,IAARA,EACxBiL,KAAK5O,GAAMoN,IAItBzJ,GAAOA,EAGO,QAJdyJ,GAASA,IAIakoB,MAAMloB,IAA2B,iBAARzJ,GAAoBA,EAAM,GAAM,EACpEgwC,KAIXvmC,EAAQA,EAAMpQ,WAAWqR,MAAM,QAI/BjB,GAHAA,EAAQwB,KAAK5O,KAAQoN,EAAM,GAAK,KAAOA,EAAM,IAAOA,EAAM,GAAKzJ,GAAQA,MAGzD3G,WAAWqR,MAAM,MAChB,GAAK,KAAOjB,EAAM,IAAOA,EAAM,GAAKzJ,EAAOA,KAC7D,CArBD,CAb8B,QAAS3D,EAAOoN,EACzC,IAAAzJ,GAAAwqD,GAXgBnuD,EAWhB2D,GAAA3D,CAAA,CAXgB,GCUrB6wD,GAhBI,SAAA7wD,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAA3oD,GACVsW,KAAKu+J,QAAU,GACfv+J,KAAKw+J,SAAW,GAChBx+J,KAAKy+J,cAAgB,GACrBz+J,KAAK0+J,YAAc,GACnB1+J,KAAK2+J,YAAc,GACnB3+J,KAAK4+J,SAAW,GAChB5+J,KAAK6+J,cAAgB,GACrB7+J,KAAK8+J,eAAiB,GACtB9+J,KAAK++J,QAAU,GACf/+J,KAAKg/J,eAAiB,GACtBh/J,KAAKi/J,cAAgB,KACrBj/J,KAAKk/J,UAAY,EACpB,ECsBLxmH,GAhCI,SAAAhvD,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAA3oD,GAMVsW,KAAKlJ,EAAI,KAQTkJ,KAAK+W,GAAK,KAKV/W,KAAKs9D,GAAK,KAQVt9D,KAAKm/J,IAAM,IAEd,ECZLxlH,GAhBI,SAAAjwD,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAA3oD,GAKVsW,KAAKlJ,EAAI,KAOTkJ,KAAKiE,MAAQ,IAChB,ECELu2C,GAdI,SAAA9wD,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAA3oD,GAKVsW,KAAKguE,OAAS,KAKdhuE,KAAKq7B,MAAQzkC,EAAAsjB,EAAAylH,YAChB,ECSL1gF,GArBI,SAAAv1D,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAA3oD,GAMVsW,KAAKmzB,KAAO,KAMZnzB,KAAKkzB,MAAQ,KAKblzB,KAAKghI,aAAe,IACvB,ECJLxkF,GAfI,SAAA9yD,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCACA,KAAA3oD,GAKIsW,KAAKmzB,KAAO,KAKZnzB,KAAKo/J,cAAgB,IACxB,WAAAjgH,GAAAz1D,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,yCChBC6M,GAIF,SAAAx1D,IAAcy1D,GAAA,KAAAz1D,GAMVsW,KAAKikH,UAAY,KAKjBjkH,KAAKrY,KAAO,KAKZqY,KAAKq/J,YAAc,KAKnBr/J,KAAKs/J,UAAY,KAKjBt/J,KAAK2yH,sBAAwB,KAK7B3yH,KAAKyyH,sBAAwB,EAK7BzyH,KAAKwnJ,iBAAmB,EAKxBxnJ,KAAK0iB,YAAc,KAKnB1iB,KAAKikB,SAAW,KAKhBjkB,KAAKslE,QAAU,EAKftlE,KAAKqxH,WAAa,GAKlBrxH,KAAK0sI,mBAAqB,EAE7B,EAOCptF,GAIF,SAAA51D,IAAcy1D,GAAA,KAAAz1D,GAKVsW,KAAK2B,GAAK,KAKV3B,KAAK+F,MAAQ,KAKb/F,KAAKsC,MAAQ,KAKbtC,KAAK0B,SAAW,IACnB,EAOC69C,GAIF,SAAA71D,IAAcy1D,GAAA,KAAAz1D,GAKVsW,KAAK2B,GAAK,KAKV3B,KAAK+F,MAAQ,KAKb/F,KAAKikH,UAAY,KAKjBjkH,KAAKu/J,YAAc,KAKnBv/J,KAAK6zI,uBAAyB,KAK9B7zI,KAAKo9H,YAAc,KAKnBp9H,KAAKw/J,iBAAmB,IAC3B,EC1FLngH,GApDI,SAAA31D,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAA3oD,GAMVsW,KAAKikH,UAAY,KAKjBjkH,KAAKlJ,EAAI,KAMTkJ,KAAKrY,KAAO,KAKZqY,KAAK6f,UAAY,KAKjB7f,KAAK2yH,sBAAwB,KAK7B3yH,KAAK0B,SAAW,KAKhB1B,KAAK+iG,QAAU,KAKf/iG,KAAKkzB,MAAQ,KAMblzB,KAAKq7B,MAAQ,IAChB,ECjCLmkB,GAhBI,SAAA91D,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAA3oD,GAOVsW,KAAKy/J,gBAAkB,GAKvBz/J,KAAK0/J,iBAAmB,EAC3B,ECLL,SAAStgH,GAAa11D,GAIlB,IAKIoN,EACAzJ,EANEsJ,GAFNjN,EAASA,GAAU,CAAC,GAEIo5G,SAEpB98G,EAAUga,KAAK9V,QACfqN,GAAA,EAAWG,EAAAwiB,GAASl0B,GAAS68H,cASjC,SAASh1H,IACL0J,EAAS8mB,QAAQlxB,EAAA+sB,EAAAylJ,gBACpB,CAED,SAAS5yK,EAAcrD,GACnB6N,EAAS8mB,QAAQlxB,EAAA+sB,EAAA0lJ,eAAuB,CAAE37C,UAAWv6H,IACrDmE,GACH,CAED,SAASE,EAAcrE,EAAWoN,EAAYzJ,GAC1CkK,EAAS8mB,QAAQlxB,EAAA+sB,EAAA2lJ,eAAuB,CAAE57C,UAAWv6H,EAAW4/J,OAAQxyJ,EAAYtF,MAAOnE,IAC3FN,EAAcrD,EACjB,CAED,SAASoE,EAAYpE,EAAWoN,EAAYzJ,GACxCkK,EAAS8mB,QAAQlxB,EAAA+sB,EAAA8uI,aAAqB,CAAE/kC,UAAWv6H,EAAW4/J,OAAQxyJ,EAAYtF,MAAOnE,IACzFN,EAAcrD,EACjB,CAYD,SAASsE,EAActE,EAAMoN,GACzB,IAAIH,EAAU,KAEd,OAAKjN,GAID2D,EAAc1G,eAAe+C,GAC7BiN,EAAUtJ,EAAc3D,GAChBoN,IACRH,EAAU,IAAI4jD,GACdltD,EAAc3D,GAAQiN,GAGnBA,GAVIA,CAWd,CAED,SAASnJ,EAAY9D,EAAMoN,EAAMzJ,GAC7B,IAAIrH,EAAUgI,EAActE,GACZ,OAAZ1D,IACAA,EAAQ8Q,GAAM2T,KAAKpd,GACfrH,EAAQ8Q,GAAM/Q,OAAS4Q,EAASmK,MAAMskH,UAAUmB,QAAQC,cACxDxgI,EAAQ8Q,GAAMmZ,QAGzB,CAsGD,SAAS7iB,EAAc1D,EAAWoN,EAAYzJ,GAC1CG,EAAY9D,EAAWoN,EAAYzJ,GACnCS,EAAYpE,EAAWoN,EAAYzJ,EACtC,CA2KD,OArBAyJ,EAAW,CACPgpK,2BAnSJ,SAAoCp2K,UACzB2D,EAAc3D,GACrBqD,EAAcrD,EACjB,EAiSGy/J,uBA/RJ,WACI97J,EAAgB,CAAC,EACjBQ,GACH,EA6RGkyK,cAAe/xK,EACfqvJ,eA/OJ,SAAS3zJ,EAAeoN,EAAWzJ,EAAOsJ,EAAM3Q,EAAKJ,EAAS2R,EAAWG,EAAiBvK,EAAOU,EAAUd,EAAWgB,EAASD,EAAcE,EAAeR,EAAiBgH,EAAQ4D,EAAgB2W,GACjM,IAAIjP,EAAK,IAAID,EAAAD,EAST,MAAArI,GAAkDA,IAAcvR,IAGhE0D,EACIoN,EACA,KACAH,EACA3Q,EACAJ,EACA,KACA,KACAuH,EACAU,EACA,KACA,KACA,KACAG,EACA,KACA,KACAoK,EACA2W,GAGJjP,EAAGkgK,UAAYzoK,GAGnBuI,EAAGmgK,MAAQ5yK,EACXyS,EAAGnY,KAAOgP,EACVmJ,EAAGhU,IAAM9F,EACT8Z,EAAGozB,MAAQ/lC,EACX2S,EAAGi3J,SAAWlpK,EACdiS,EAAGg3J,UAAY/pK,EACf+S,EAAGogK,aAAepyK,EAClBgS,EAAG2tH,KAAO1+G,EAEVjP,EAAGk3J,SAAWjpK,EACd+R,EAAGqgK,QAAUrpK,EACbgJ,EAAGsgK,eAAiBpyK,EACpB8R,EAAGugK,SAAWz6K,EACdka,EAAGwgK,iBAAmB9yK,EACtBsS,EAAGqkJ,iBAAmBzsJ,EACtBoI,EAAGm3J,gBAAkB7+J,EAEjB5D,EACAA,EAAOpB,SAAQ,SAAA1J,IAxEvB,SAAyBA,EAAaoN,EAAGzJ,EAAGsJ,GACxC,IAAI3Q,EAAK,IAAI6Z,EAAA8C,EAEb3c,EAAG4Q,EAAIE,EACP9Q,EAAG+H,EAAIV,EACPrH,EAAGH,EAAI8Q,EAEPjN,EAAY2V,MAAMoL,KAAKzkB,GAElB0D,EAAY62K,WACb72K,EAAY62K,SAAW,GAG3B72K,EAAY62K,UAAYlzK,CAG3B,CAhBD,CAyE4ByS,EAAIpW,EAAMkN,EAAGlN,EAAMqE,EAAGrE,EAAM7D,EAC/C,YAGMia,EAAGygK,gBACHzgK,EAAGT,OAGdjS,EAAc0J,EAAWF,EAAAsjB,EAAAs9I,aAA+B13J,EAC3D,EAgLGitI,wBA9KJ,SAAiCrjJ,EAAWoN,EAAGzJ,EAAIsJ,EAAI3Q,GACnD,IAAIJ,EAAK,IAAI8yD,GAEb9yD,EAAGkR,EAAIA,EACPlR,EAAGmxB,GAAK1pB,EACRzH,EAAG03E,GAAK3mE,EAEJ3Q,EACAJ,EAAGu5K,IAAMn5K,SAEFJ,EAAGu5K,IAGd/xK,EAAc1D,EAAWkN,EAAAsjB,EAAAsmJ,aAA+B56K,EAC3D,EAiKGuiK,eA1JJ,SAAwBz+J,EAAWoN,EAAGzJ,GAClC,IAAIsJ,EAAK,IAAIgjD,GACbhjD,EAAGG,EAAIA,EACPH,EAAGsN,MAAQ5W,EAEXD,EAAc1D,EAAWkN,EAAAsjB,EAAAu9I,aAA+B9gK,EAC3D,EAqJGo4I,eAnJJ,SAAwBrlJ,EAAWoN,EAAOzJ,GACtC,IAAIsJ,EAAK,IAAI6jD,GACb7jD,EAAGq3E,OAAS3gF,EACZsJ,EAAG0kC,MAAQvkC,EAEX1J,EAAc1D,EAAWkN,EAAAsjB,EAAAumJ,aAA+B9pK,EAC3D,EA8IGsxJ,WA5IJ,SAAoBv+J,EAAWoN,EAAazJ,EAAKsJ,GAC7C,IAAI3Q,EAAK,IAAIi5D,GACbj5D,EAAGmtC,KAAOr8B,EACV9Q,EAAGktC,MAAQv8B,EACX3Q,EAAGg7I,aAAe3zI,EAElBD,EAAc1D,EAAWkN,EAAAsjB,EAAAqvI,SAA2BvjK,EACvD,EAsIGqiK,iBApIJ,SAA0B3+J,EAAWoN,GACjC,IAAIzJ,EAAK,IAAImvD,GACT7lD,EAAO3I,EAActE,GAAWm1K,cAE/B/nK,IAILzJ,EAAG8lC,KAAOr8B,EAAQkiK,aAClB3rK,EAAG+xK,cAAgBtoK,EAAQ24D,mBAEvB94D,EAAK5Q,OAAS,GAAK4Q,EAAKA,EAAK5Q,OAAS,IAAMsH,GAIhDD,EAAc1D,EAAWkN,EAAAsjB,EAAAwmJ,eAAiCrzK,GAC7D,EAqHGw1I,kBAnHJ,SAA2Bn5I,EAAWoN,EAAGzJ,EAAMsJ,EAAW3Q,EAAuBJ,EAAU2R,EAASG,EAAOvK,GACvG,IAAIU,EAAK,IAAIwxD,GAEbxxD,EAAGo2H,UAAYv6H,EACfmE,EAAGiJ,EAAIA,EAEPjJ,EAAGlG,KAAO0F,EACVQ,EAAGgyB,UAAYlpB,EACf9I,EAAG8kI,sBAAwB3sI,EAC3B6H,EAAG6T,SAAW9b,EACdiI,EAAGk1G,QAAUxrG,EACb1J,EAAGqlC,MAAQx7B,EAEX7J,EAAGwtC,MAAQluC,EAEXC,EAAc1D,EAAWkN,EAAAsjB,EAAA6wH,gBAAkCl9I,EAC9D,EAoGGi1I,iBAlGJ,SAA0Bp5I,EAAWoN,EAAiBzJ,GAClD,IAAIsJ,EAAK,IAAI6oD,GAEb7oD,EAAG8oK,gBAAkB3oK,EACrBH,EAAG+oK,iBAAmBryK,EAEtBW,EAActE,GAAWu1K,cAAgBtoK,EACzC7I,EAAYpE,EAAWkN,EAAAsjB,EAAAymJ,eAAiChqK,EAC3D,EA2FG2mJ,kBAzFJ,SAA2B5zJ,EAAWoN,EAAMzJ,EAAasJ,EAAW3Q,EAAuBuR,EAAuBG,EAAkBvK,EAAaU,EAAUd,GACvJ,IAAIgB,EAAK,IAAImxD,GAEbnxD,EAAGk2H,UAAYv6H,EACfqE,EAAGpG,KAAOmP,EACV/I,EAAGsxK,YAAchyK,EACjBU,EAAGuxK,UAAY3oK,EACf5I,EAAG4kI,sBAAwB3sI,EAC3B+H,EAAG0kI,sBAAwBl7H,EAC3BxJ,EAAGy5J,iBAAmB9vJ,EACtB3J,EAAG20B,YAAcv1B,EACjBY,EAAGk2B,SAAWp2B,EACdE,EAAGu3E,QAAUv4E,EAEbS,EAAY5H,EAAAs0B,EAAAy0I,OAAkB/3J,EAAAsjB,EAAA0mJ,gBAAkC7yK,GAChED,EAAYpE,EAAWkN,EAAAsjB,EAAA0mJ,gBAAkC7yK,EAC5D,EA0EG8+I,yBAxEJ,SAAkCnjJ,EAAgBoN,GAC9C,GAAIpN,EAAgB,CAChB,IAAK,IAAI2D,KAASyJ,EACdpN,EAAe2D,GAASyJ,EAAczJ,GAG1CU,EAAcrE,EAAeu6H,UAAWrtH,EAAAsjB,EAAA0mJ,gBAAkCl3K,EAC7E,CACJ,EAiEG+9J,4BA/DJ,SAAqC/9J,EAAgBoN,EAAIzJ,EAAOsJ,EAAO3Q,GACnE,GAAI0D,EAAgB,CAChB,IAAI9D,EAAK,IAAI05D,GAEb15D,EAAG+b,GAAK7K,EACRlR,EAAGmgB,MAAQ1Y,EACXzH,EAAG0c,MAAQ3L,EACX/Q,EAAG8b,SAAW1b,EAEd0D,EAAe2nI,WAAW5mH,KAAK7kB,GAC/BmI,EAAcrE,EAAeu6H,UAAWrtH,EAAAsjB,EAAA2mJ,4BAA8Cn3K,EACzF,CACJ,EAoDGijJ,oCAlDJ,SAA6CjjJ,EAAgBoN,EAAIzJ,EAAOsJ,EAAa3Q,EAAWJ,EAAwB2R,EAAaG,GACjI,GAAIhO,GAAkBA,EAAegjJ,mBAAoB,CAErD,IAAMv/I,EAAK,IAAIoyD,GACfpyD,EAAGwU,GAAK7K,EACR3J,EAAG4Y,MAAQ1Y,EACXF,EAAGoyK,YAAc5oK,EACjBxJ,EAAG82H,UAAYj+H,EACfmH,EAAGiwI,YAAc7lI,EACjBpK,EAAGqyK,iBAAmB9nK,EACtBvK,EAAG0mJ,uBAAyBjuJ,EAE5B8D,EAAegjJ,mBAAmBjiI,KAAKtd,GACvCY,EAAcrE,EAAeu6H,UAAWrtH,EAAAsjB,EAAA4mJ,2BAA6Cp3K,EACxF,CACJ,EAoCGk/J,YAlCJ,SAAqBl/J,GACbA,EAAG2V,OAASnZ,MAAMC,QAAQuD,EAAG2V,OAC7B3V,EAAG2V,MAAMjM,SAAQ,SAAA1J,GACTA,EAAM/C,eAAe,iBAAmB+C,EAAMmkJ,oBACvCnkJ,EAAMmkJ,WAEpB,WAEMnkJ,EAAG2V,MAGdjS,EAAcxH,EAAAs0B,EAAAy0I,OAAkB/3J,EAAAsjB,EAAA6mJ,UAA4Br3K,EAC/D,EAuBGs3K,aArBJ,SAAsBt3K,GAClB0D,EAAcxH,EAAAs0B,EAAAy0I,OAAkB/3J,EAAAsjB,EAAA+mJ,WAA6Bv3K,EAChE,GAtTG2D,EAAgB,CAAC,EA6UdyJ,CACV,CAEDsoD,GAAaikE,sBAAwB,eACrC,IAAAzjE,GAAe/xD,EAAAqsB,EAAAopG,oBAAiClkE,IC5VhD,SAASM,GAAYh2D,GAEjBA,EAASA,GAAU,CAAC,EAEpB,IACIoN,EACAzJ,EACAsJ,EACA3Q,EAJEuR,EAAUyI,KAAK9V,QAMjBwN,EAAehO,EAAOw3K,aA6G1B,SAAS/zK,EAAsBzD,GAC3B,IAAMoN,EAAUY,EAAaqoK,cAAcr2K,GAAA,GAE3C,IAAKoN,EACD,OAAO,KAGX,IAGIzJ,EAHEsJ,EAAWG,EAAQ0nK,SACrBx4K,EAAkB,KAItB,IAAK2Q,GAAYA,EAAS5Q,QAAU,EAChC,OAAO,KAKX,IAFAsH,EAAoBsJ,EAAS5Q,OAAS,EAE/BsH,GAAqB,GAAG,CAC3B,GAAIsJ,EAAStJ,GAAmB6yK,aAAc,CAC1Cl6K,EAAkB2Q,EAAStJ,GAC3B,KACH,CACDA,GACH,CACD,OAAOrH,CACV,CASD,SAAS6H,EAAgBnE,GACrB,IAAMoN,EAAUY,EAAaqoK,cAAcr2K,GAAA,GAC3C,OAAKoN,GAIIA,EAAQ0nK,SAAW1nK,EAAQ0nK,SAHzB,EAId,CAsBD,SAASzxK,EAAWrD,EAASoN,GACzB,IAAKpN,EACD,OAAO,KAEX,IAAM2D,EAAO3D,EAAQoN,GACrB,OAASzJ,GAAwB,IAAhBA,EAAKtH,OAAuBsH,EAAKA,EAAKtH,OAAS,GAA1B,IACzC,CAyVD,OAnCA+Q,EAAW,CACPg2I,+BAtdJ,SAAwCpjJ,GAEpC,OAAOqD,EADS2K,EAAaqoK,cAAcr2K,GAAA,GAChBkN,EAAAsjB,EAAAsmJ,aAC9B,EAodGW,sBA7bJ,SAA+Bz3K,GAE3B,OAAOqD,EADS2K,EAAaqoK,cAAcr2K,GAAA,GAChBkN,EAAAsjB,EAAAumJ,aAC9B,EA2bG91B,sBAlbJ,SAA+BjhJ,GAC3B,IACMoN,EAAS/J,EADC2K,EAAaqoK,cAAcr2K,GAAA,GACRkN,EAAAsjB,EAAAu9I,cAEnC,OAAI3gK,EACO0hD,GAAQ4oH,QAAQtqK,EAAOmN,MAAQ,KAAO,GAG1C,CACV,EA0aGo9J,sBAAAl0K,EACAm0K,gBAAAzzK,EACA0zK,wBApTJ,WAEI,OAAOx0K,EADS2K,EAAaqoK,cAAcn6K,EAAAs0B,EAAAi7C,OAAA,GAChBv+D,EAAAsjB,EAAAwmJ,eAC9B,EAkTG51B,yBA/RJ,SAAkCphJ,GAE9B,OAAOqD,EADS2K,EAAaqoK,cAAcr2K,GAAA,GAChBkN,EAAAsjB,EAAA6wH,gBAC9B,EA6RG5M,kBAvKJ,SAA2Bz0I,GAGvB,OAAOqD,EAFSrD,EAAYgO,EAAaqoK,cAAcr2K,GAAA,GACnDgO,EAAaqoK,cAAcn6K,EAAAs0B,EAAAi7C,OAAA,IAA0Bz9D,EAAaqoK,cAAcn6K,EAAAs0B,EAAA3B,OAAA,GACzD3hB,EAAAsjB,EAAAqvI,SAC9B,EAoKG9c,yBAlQJ,WAEI,OAAO1/I,EADe2K,EAAaqoK,cAAcn6K,EAAAs0B,EAAAy0I,QAChB/3J,EAAAsjB,EAAA0mJ,gBACpC,EAgQGY,wCA9GJ,SAAiD93K,EAAWoN,GACxD,IAAKA,EACD,OAAO,KAGX,IAAIzJ,EAAU,CAAC,EACXsJ,EAAcxJ,EAAsBzD,GACpCiN,IACAtJ,EAAU6hB,GAAAgL,EAAAunJ,iBAAuB9qK,EAAY2pK,mBAGjD,IAAMt6K,EAAQqH,EAAQyJ,EAAGxD,eACzB,YAAO,IAAAtN,EAAsB,KAAOA,CACvC,EAkGG6/J,mCAhJJ,SAA4Cn8J,GACxC,IAAKA,EACD,OAAO,KAGX,IACIoN,EACAzJ,EACAsJ,EAHA3Q,EAAU,CAAC,EAOf,IAAK2Q,GAFLG,EAAkBjJ,EAAgBjI,EAAAs0B,EAAAy0I,SAET5oK,OAAS,EAAG4Q,GAAK,EAAGA,IAGzC,IAFAtJ,EAAcyJ,EAAgBH,IAEdhP,OAASkY,EAAAD,EAAAurH,SAAsB,CAC3CnlI,EAAUkpB,GAAAgL,EAAAunJ,iBAAuBp0K,EAAYizK,kBAC7C,KACH,CAGL,IAAM/oK,EAAQvR,EAAQ0D,EAAG4J,eACzB,YAAO,IAAAiE,EAAsB,KAAOA,CACvC,EA0HGw1I,wBAldJ,SAAiCrjJ,EAAWoN,EAAGzJ,EAAIsJ,EAAI3Q,GACnD0R,EAAaq1I,wBAAwBrjJ,EAAWoN,EAAGzJ,EAAIsJ,EAAI3Q,EAC9D,EAidGiiK,WA7JJ,SAAoBv+J,EAAWoN,EAAazJ,EAAKsJ,GAC7Ce,EAAauwJ,WAAWv+J,EAAWoN,EAAazJ,EAAKsJ,EACxD,EA4JGk2I,yBA5PJ,SAAkCnjJ,GAC9B,IAAMoN,EAAiBkJ,KAAKysI,2BAC5B/0I,EAAam1I,yBAAyB/1I,EAAgBpN,EACzD,EA0PG+9J,4BAlPJ,SAAqC/9J,GACjC,GAAIA,EAAY,CACZ,IAAMoN,EAAiBkJ,KAAKysI,2BAC5B/0I,EAAa+vJ,4BAA4B3wJ,EAAgBpN,EAAWiY,GAAIjY,EAAWqc,MAAOrc,EAAW4Y,MAAO5Y,EAAWgY,SAC1H,CACJ,EA8OGirI,oCA7LJ,SAA6CjjJ,EAAgBoN,GACzD,GAAIpN,EAAgB,CAChB,IAAM2D,EAAqB2S,KAAKysI,2BAChC/0I,EAAai1I,oCAAoCt/I,EAAoB3D,EAAeiY,GAAIjY,EAAeqc,MAAOrc,EAAe61K,YAAazoK,EAAWpN,EAAemqJ,uBAAwBnqJ,EAAe0zI,YAAa1zI,EAAe81K,iBAC1O,CACJ,EAyLGliB,kBAvOJ,SAA2B5zJ,GACvBgO,EAAa4lJ,kBAAkB13J,EAAAs0B,EAAAy0I,OAAkBjlK,EAAQ/B,KAAM+B,EAAQ2oJ,iBAAkB3oJ,EAAQwzJ,eACpG,EAsOGG,eA1NJ,SAAwB3zJ,EAASoN,EAAazJ,EAAgBsJ,EAAiB3Q,EAAQJ,GACnF8R,EAAa2lJ,eAAe3zJ,EAAQu6H,UAChC,KACAv6H,EAAQ/B,KACR+B,EAAQoC,IACRpC,EAAQq5G,QACRjsG,EACApN,EAAQgoI,iBAAmB,KAC3BhoI,EAAQwpC,OAAS,KACjBxpC,EAAQ2oJ,iBACR3oJ,EAAQyzJ,cACRzzJ,EAAQwzJ,eACR7vJ,EACA3D,EAAQgY,SACR/K,EACA3Q,EACA0D,EAAQ0zJ,eACRx3J,EACP,EAyMGi9I,kBA/RJ,SAA2Bn5I,EAASoN,GAChCY,EAAamrI,kBACTn5I,EAAQu6H,UACR,IAAI1iH,KACJ7X,EAAQ/B,KACR+B,EAAQm2B,UACRn2B,EAAQipI,sBACRjpI,EAAQgY,SACRhY,EAAQq5G,QACRr5G,EAAQwpC,MACRp8B,EACP,EAqRGgsI,iBA5VJ,SAA0Bp5I,EAAWoN,EAAiBzJ,GAClDqK,EAAaorI,iBAAiBp5I,EAAWoN,EAAiBzJ,EAC7D,EA2VG86J,eAjbJ,SAAwBz+J,EAAWoN,EAAGzJ,GAClCqK,EAAaywJ,eAAez+J,EAAWoN,EAAGzJ,EAC7C,EAgbG0hJ,eAtaJ,SAAwBrlJ,EAAWoN,EAAOzJ,GACtCqK,EAAaq3I,eAAerlJ,EAAWoN,EAAOzJ,EACjD,EAqaGg7J,iBA1TJ,SAA0B3+J,GACtBgO,EAAa2wJ,iBAAiBziK,EAAAs0B,EAAAi7C,MAAiBzrE,EAClD,EAyTGk/J,YAxGJ,WACQ5iK,IACA0R,EAAakxJ,YAAY5iK,GACzBA,EAAkB,KAEzB,EAoGGg7K,aA7BJ,SAAsBt3K,GAClBgO,EAAaspK,aAAat3K,EAC7B,EA4BGm/J,sBA7FJ,SAA+Bn/J,EAAgBoN,IAC3C9Q,EAAkB,IAAImkB,GAEN7H,MAAQ,IAAIf,KAC5Bvb,EAAgBsnJ,OAAS5jJ,EACzB1D,EAAgBunJ,UAAYz2I,CAC/B,EAwFG86I,2BA/EJ,SAAoCloJ,EAAkBoN,EAAgB9Q,IAAA,IAC9DqH,IACAA,GAAA,GACAsJ,EAAuB,IAAIwjB,IAENyzH,iBAAmBlkJ,EACxCiN,EAAqB2L,MAAQ,IAAIf,KACjC5K,EAAqB22I,OAASx2I,EAC9BH,EAAqB80I,cAA0B,OAAVzlJ,EAAiBA,EAAMU,WAAa,KAEhF,EAsEG8kJ,2BA/DJ,SAAoC9hJ,GAChC,GAAIiN,EACA,IAAK,IAAIG,KAASH,EACdA,EAAqBG,GAASpN,EAAcoN,EAGvD,EA0DGk4I,yBAlDJ,SAAkCtlJ,EAASoN,GACvC,IAAI,IAAAzJ,GAAwCrH,GAAmB2Q,GAAwBA,EAAqB2L,MAAO,CAC/G,IAAM1c,EAAY+Q,EAAqB2L,MACjC/K,EAAW7N,EAAQ8X,UAAY5b,EAAU4b,UAC/C7K,EAAqB+K,SAAWnK,EAChCZ,EAAqBm3I,WAAah3I,EAClC9Q,EAAgBqZ,MAAMoL,KAAK9T,GAC3BtJ,GAAA,CACH,CACJ,EA0CG87J,uBAraJ,WACIzxJ,EAAayxJ,wBAChB,GAjGGzxJ,EAAeA,GAAgBkoD,GAAaroD,GAASsrH,YAAY,CAAC/f,SAAUp5G,EAAOo5G,WAKnFz1G,GAAA,EACAsJ,EAAuB,KACvB3Q,EAAkB,KAkgBf8Q,CACV,CAED4oD,GAAY2jE,sBAAwB,cACpC,IAAAxjE,GAAehyD,EAAAqsB,EAAAopG,oBAAiC5jE,ICliBhD,SAASa,KAEL,IAII72D,EACAoN,EACAzJ,EACAsJ,EAPE3Q,EAAUga,KAAK9V,QACf0M,GAAA,EAAWc,EAAAwiB,GAASl0B,GAAS68H,cAC7Bh1H,GAAA,EAAW+U,EAAAsX,GAASl0B,GAAS68H,cAqBnC,SAAS91H,EAAoBrD,GACzBiN,EAAwBjN,CAC3B,CAUD,SAASoE,EAA0CpE,EAAqBoN,EAAgBzJ,EAAWsJ,GAC/F,IAAI3Q,EACAJ,EAAMkR,EAAe+6H,WAAWC,OAAOC,IACrCx6H,EAAwB3R,EAAI+sI,sBAElC,GAAIh8H,EAMI3Q,EAFAqH,GAAazH,EAAIsuJ,uBAAyBh8I,OAAO2oB,kBAE9B,IAAItf,KAAKhK,EAAsBiK,UAAgE,KAAlD9X,EAAsB9D,EAAIsuJ,uBAEvEtuJ,EAAIgtI,yBAG3B,GAAIvlI,EAAW,CAGX,IAAMuJ,EAAyBE,EAAe6mI,uBAE9C33I,EAAmB,IAAIub,KAAKhK,EAAsBiK,UAA6D,KAAhD9X,EAAsBkN,GACxF,MAEG5Q,EAAmBuR,EAI3B,OAAOvR,CACV,CAUD,SAASgI,EAAiCtE,EAAUoN,GAChD,OAASpN,EAAS8X,UAAY1K,EAAOi7H,IAAIY,sBAAsBnxH,UAAoC,IAAxB7K,GAAgC,GAC9G,CAED,SAASnJ,EAAkC9D,EAAWoN,GAIlD,OAAOpN,GAHaoN,EAAe+6H,WAAWC,OAAOxvH,MAC1BxL,EAAe+8I,uBAG7C,CAsGD,SAASzmJ,EAAqD1D,GAC1D,IAAM2D,EAAQ,CAAEiV,MAAO+6B,IAAK76B,IAAK66B,KAC3B1mC,EAAWjN,EAAQ,GAAG65J,aAAa3kB,oBAAoB,GACvD54I,EAAMgI,EAAiC,IAAIuT,KAAQ5K,GAEzD,IAAKjN,GAA8B,IAAnBA,EAAQ3D,OACpB,MAAO,CAAEmtC,MAAA7lC,EAAO+b,IAAApjB,GAGpB0D,EAAQ0J,SAAQ,SAAC1J,GACb,IAAMiN,EAAUjN,EAAO65J,aACjB3sJ,EAAYD,EAAQ6xJ,oBAAoB9+J,EAAOmqI,gBAAiBjuI,EAAAs0B,EAAAi7C,QAAoBx+D,EAAQ6xJ,oBAAoB9+J,EAAOmqI,gBAAiBjuI,EAAAs0B,EAAA3B,OAExI7gB,EADoBf,EAAQ24I,qBAAqB14I,GACZ,GACvCzJ,EAAc,CAAEmV,MAAO+6B,IAAK76B,IAAK66B,KAErC,GAAI3lC,EACA,GAAIA,EAAiBw7H,kBAAoB37H,EAAA2iB,EAAAo6G,iBACrCnnI,EAmEhB,SAA+BzD,GAC3B,IAWI2D,EACAsJ,EACA3Q,EACAJ,EAdE2R,EAAa7N,EAAiBmoI,WAAWC,OAAOC,IAAIC,SAASC,eAAevoI,EAAiBmoI,WAAWC,OAAO/rH,OAAOmsH,sBAAsBxoI,EAAiBmoI,WAAW9rH,OACxKnP,EAAiBE,EAAkBuhJ,qBAAqB3uJ,EAAiBqc,MAAOxO,GAChFG,EAAOd,EAAemnI,iBAAmBnnI,EAAesmI,YACxD/vI,EAAWuK,EAAKumI,gBAChBpwI,EAAY6J,EAAK2W,UACjBthB,EAAWI,EAAS+wI,UACpBnwI,EAAQ,CAAEuU,MAAO,EAAGE,IAAK,GACzB1U,EAAcf,EAAS,GAAG+J,EAC1B9I,GAAuBgxB,MAAMlxB,GAC7BV,EAAsBY,EAAsBF,EAAc,EAC5D0G,EAAI,EAUR,IAJGxG,IACCD,EAAMuU,MAAQ9U,EAAkCJ,EAAsBS,EAAWnE,IAGhF1D,EAAI,EAAGJ,EAAMmH,EAAShH,OAAQC,EAAIJ,EAAKI,IAExC2Q,EAAS,GADTtJ,EAAUN,EAAS/G,IAEPW,eAAe,OACvBgQ,EAAStJ,EAAQsJ,GAErBnC,GAAKnH,EAAQU,GAAK,EAAI4I,GAK1B,OAFA5I,EAAMyU,IAAMhV,GAAmCJ,EAAsBoH,GAAK3G,EAAWnE,GAE9EqE,CACV,CAjCD,CAnEoD2J,OACjC,CACH,IAAM7J,EAAkB6J,EAAiBm6H,WAAWC,OACpD3kI,EAAYmV,MAAQzU,EAAgByU,MACpCnV,EAAYqV,IAAMlK,KAAKgN,IAAItf,EAAK6H,EAAgByU,MAAQzU,EAAgB6T,SAC3E,EAGAsd,MAAM7xB,EAAYmV,SAAW0c,MAAM3xB,EAAMiV,QAAUjV,EAAMiV,MAAQnV,EAAYmV,SAC9EjV,EAAMiV,MAAQnV,EAAYmV,QAEzB0c,MAAM7xB,EAAYqV,OAASwc,MAAM3xB,EAAMmV,MAAQnV,EAAMmV,IAAMrV,EAAYqV,OACxEnV,EAAMmV,IAAMrV,EAAYqV,IAE/B,IAGDnV,EAAMmV,IAAMlK,KAAK+M,IAAIrf,EAAKqH,EAAMmV,KAChC,IAAM5L,EAAkBwB,EAA+B1O,EAAS2D,EAAMmV,KAAA,GAQtE,OALAnV,EAAMmV,IAAMwc,MAAMpoB,GAAmBvJ,EAAMmV,IAAM5L,EAEjDvJ,EAAMiV,MAAQ3L,GAAYA,EAASo7H,KAAOp7H,EAASo7H,IAAImiB,uBAAyBl1H,MAAMroB,EAASo7H,IAAImiB,wBAA0Bl1H,MAAM3xB,EAAMmV,KAAOlK,KAAKgN,IAAIjY,EAAMmV,IAAM7L,EAASo7H,IAAImiB,qBAAsB7mJ,EAAMiV,OAASjV,EAAMiV,MAC7NjV,EAAMiV,MAAQlK,EAA+B1O,EAAS2D,EAAMiV,OAErD,CAAE4wB,MAAA7lC,EAAO+b,IAAApjB,EACnB,CAED,SAASwO,EAAwC9K,EAAKoN,GAClDzJ,EAAmC3D,EAAMoN,EAAM0L,GAClD,CAED,SAASpK,EAA+B1O,EAASoN,GAAgC,IAA1BzJ,EAA0BrF,UAAAjC,OAAA,YAAAiC,UAAA,IAAAA,UAAA,GAC7E,IAKI,IAJA,IAAI2O,EAAI,EACJ3Q,GAAA,EACAJ,EAAey3C,KAEXr3C,GAAS2Q,EAAIjN,EAAQ3D,QAAQ,CACjC,IAAMwR,EAAa7N,EAAQiN,GAAGk9H,gBAG1Bt8H,EAAW+K,OAASxL,KAAUqB,SAASZ,EAAWmK,WAAcnK,EAAW+K,MAAQ/K,EAAWmK,UAAY5K,IAC1GlR,EAAekR,EACf9Q,GAAA,IAIMqH,GAAqBkK,EAAW+K,MAAQxL,IAASkoB,MAAMp5B,IAAiB2R,EAAW+K,MAAQ1c,GACjGA,EAAe2R,EAAW+K,MAIrBjV,GAAsBkK,EAAW+K,MAAQ/K,EAAWmK,SAAY5K,IAASkoB,MAAMp5B,IAAkB2R,EAAW+K,MAAQ/K,EAAWmK,SAAW9b,KAC/IA,EAAe2R,EAAW+K,MAAQ/K,EAAWmK,UAGjD/K,GAAK,CACR,CAED,OAAO/Q,CAGV,CAFC,MAAO8D,GACL,OAAOoN,CACV,CACJ,CA0CD,SAASiY,EAAwBrlB,QAAA,IACzBA,EAAE0mB,QAAyB4O,MAAMt1B,EAAE0mB,SACnCrjB,EAAoBrD,EAAE0mB,OAAS,IAEtC,CAED,SAAStQ,IACLnJ,EAAwB,EACxBtJ,EAAmC,CACtC,CAED,SAASmL,IACL5B,EAASwlB,IAAIjvB,EAAA+sB,EAAA02G,wBAAgC7hH,EAAyB/O,MACtEF,GACH,CAmBD,OAjBApW,EAAW,CACPqqI,WAzTJ,WACIj0H,IACAlJ,EAASklB,GAAG3uB,EAAA+sB,EAAA02G,wBAAgC7hH,EAAyB/O,KACxE,EAuTGuiI,oBArTJ,WACI,OAAO5rI,CACV,EAoTG+qK,oBAAA30K,EACA6wI,uBA3SJ,WACI,OAAOr8H,KAAK6H,MAA4C,IAAnC/b,EAAoE,IAAxBsJ,CACpE,EA0SG48H,8CAzQJ,SAAuD7pI,EAAqBoN,EAAgBzJ,GACxF,OAAOS,EAA0CpE,EAAqBoN,EAAgBzJ,EACzF,EAwQGmmI,4CAtQJ,SAAqD9pI,EAAqBoN,EAAgBzJ,GACtF,OAAOS,EAA0CpE,EAAqBoN,EAAgBzJ,GAAA,EACzF,EAqQGwxI,iCAAA7wI,EACA8vI,kCAAAtwI,EACAgwI,0CA9BJ,SAAmD9zI,EAAgBoN,GAE/D,OAAOA,EADiBpN,EAAemoI,WAAWC,OAAOxvH,KAE5D,EA4BGu7H,kCA3PJ,SAA2Cn0I,EAAkBoN,GAIzD,OAAOpN,EAHaoN,EAAe+6H,WAAWC,OAAOxvH,MAC1BxL,EAAe+8I,sBAG7C,EAuPGnW,uBArPJ,SAAgCh0I,EAASoN,GACrC,IAAIzJ,EACAsJ,EACA3Q,EAQJ,OANI8Q,IACAzJ,EAA6B3D,EAAQkoI,eAAeC,WAAWC,OAAOC,IAAIkiB,2BAC1Et9I,EAAmBjN,EAAQ+oI,sBAAwBplI,EACnDrH,EAAW,IAAIub,KAAK7X,EAAQipI,sBAAsBnxH,UAAgC,IAAnB7K,IAG5D3Q,CACV,EA0OGgiK,0BAlOJ,SAAmCt+J,EAASoN,GAExC,IAAKA,EACD,OAcR,SAA+CpN,GAE3C,IAAMoN,EAAQ,CAAEwL,MAAO+6B,IAAK76B,IAAK66B,KAC7BhwC,EAAW,EACXsJ,EAAQ0mC,IAaZ,OAZA3zC,EAAQ0J,SAAQ,SAAC1J,GACb,IAAMoN,EAAapN,EAAOmqI,gBAC1BxmI,GAAYyJ,EAAW4K,UAEnBsd,MAAMroB,IAAUG,EAAWwL,MAAQ3L,KACnCA,EAAQG,EAAWwL,MAE1B,IAEDxL,EAAMwL,MAAQ3L,EACdG,EAAM0L,IAAM7L,EAAQtJ,EAEbyJ,CACV,CAlBD,CAdqDpN,GAIjD,GAAImE,EAASiT,MAAMskH,UAAUgB,gBAAgBC,wBAAyB,CAClE,IAAMh5H,EAAOD,EAAqD1D,GAGlE,OAFA8K,EAAwCnH,EAAK+b,IAAK/b,EAAK6lC,OAEhD7lC,EAAK6lC,KACf,CAED,OAuBJ,SAAsDxpC,GAClD,IAAMoN,EAAQ,CAAEwL,MAAO+6B,IAAK76B,IAAK66B,KAEjC,IAAK3zC,GAA8B,IAAnBA,EAAQ3D,OACpB,OAAO+Q,EAGX,IAAMzJ,EAAW3D,EAAQ,GAAG65J,aAAa3kB,oBAAoB,GACvDjoI,EAAM3I,EAAiC,IAAIuT,KAAQlU,GACnDrH,EAAuBqH,EAAS0kI,IAAImiB,qBACpCtuJ,EAASo5B,MAAMh5B,GAAqD,EAA7B2Q,EAAM3Q,EAWnD,GATA8Q,EAAMwL,MAAQlK,EAA+B1O,EAAS9D,GACtDkR,EAAM0L,KAAOwc,MAAMloB,EAAMwL,QAAU3L,EAAMG,EAAMwL,MAAQ3L,EAAMyB,EAA+B1O,EAASiN,GAAA,IAEhGqoB,MAAMh5B,IAAyB8Q,EAAM0L,IAAM7L,EAAM3Q,IAClD8Q,EAAM0L,IAAM66B,KAKZxvC,EAASiT,MAAMskH,UAAUgB,gBAAgBE,0BAA2B,CACpE,IAAM/uH,EAAkBnK,EAAqD1D,GAC7E,GAAI6N,EAAgB27B,MAAM1wB,IAAM1L,EAAMwL,MAMlC,OALA1L,EAASynB,QAAQtwB,EAAAmsB,EAAAwuI,sBAAyC,CACtDzkJ,MAAO6X,GAA8BkrI,OAAO5mC,QAC5ChgF,MAAOtkB,GAA8BorI,OAAOG,qBAEhD7yJ,EAAwC+C,EAAgB6R,IAAK7R,EAAgB27B,OACtE37B,EAAgB27B,KAE9B,CAED,OAAOp8B,CACV,CAlCD,CAvBwDpN,EACvD,EAoNGgvC,MAAAlgC,GAzUA1B,EAAoBuY,GAAkBrpB,GAAS68H,cAC/CrqH,IA4UG9O,CACV,CAED62D,GAAkB8iE,sBAAwB,oBAC1C,IAAA5jE,GAAe5xD,EAAAqsB,EAAAopG,oBAAiC/iE,IAAAuG,GAAAz5D,EAAA,MAAAwzD,GAAAxzD,EAAA,eAAAu0D,GAAAl4D,GAAA,OAAAk4D,GAAA,mBAAA30D,QAAA,iBAAAA,OAAA85E,SAAA,SAAAr9E,GAAA,cAAAA,CAAA,WAAAA,GAAA,OAAAA,GAAA,mBAAAuD,QAAAvD,EAAA5D,cAAAmH,QAAAvD,IAAAuD,OAAAxG,UAAA,gBAAAiD,CAAA,EAAAk4D,GAAAl4D,EAAA,UAAAm8D,GAAAn8D,EAAAoN,GAAA,OAAA+uD,GAAAr/D,OAAA4nI,gBAAA,SAAA1kI,EAAAoN,GAAA,OAAApN,EAAA8oD,UAAA17C,EAAApN,CAAA,EAAAm8D,GAAAn8D,EAAAoN,EAAA,UAAA6tD,GAAAj7D,EAAAoN,GAAA,OAAAA,GAAA,WAAA8qD,GAAA9qD,IAAA,mBAAAA,EAAA,SAAApN,GAAA,YAAAA,EAAA,UAAAwxC,eAAA,oEAAAxxC,CAAA,EAAAA,GAAAoN,CAAA,UAAAyvD,GAAA78D,GAAA,OAAA68D,GAAA//D,OAAA4nI,eAAA5nI,OAAAuC,eAAA,SAAAW,GAAA,OAAAA,EAAA8oD,WAAAhsD,OAAAuC,eAAAW,EAAA,EAAA68D,GAAA78D,EAAA,KCnVhDq7D,GAbM,SAAAr7D,IAAA,SAAAA,EAAAoN,GAAA,sBAAAA,GAAA,OAAAA,EAAA,UAAAu7C,UAAA,sDAAA3oD,EAAAjD,UAAAD,OAAA8D,OAAAwM,GAAAA,EAAArQ,UAAA,CAAAX,YAAA,CAAA0L,MAAA9H,EAAAo7H,UAAA,EAAAt9C,cAAA,KAAA1wE,GAAA+uD,GAAAn8D,EAAAoN,EAAA,EAAA9Q,EAAA0D,GAAA,IAAAoN,EAAAzJ,EAAAsJ,GAAAG,EAAA9Q,EAAAqH,EAAA,kCAAA45E,UAAAA,QAAAC,UAAA,YAAAD,QAAAC,UAAAmnD,KAAA,+BAAAC,MAAA,oBAAA9nB,QAAA//G,UAAAF,QAAAK,KAAAqgF,QAAAC,UAAAs/B,QAAA,6BAAA98G,GAAA,4BAAAA,EAAAiN,EAAA4vD,GAAAzvD,GAAA,GAAAzJ,EAAA,KAAArH,EAAAugE,GAAA,MAAAzgE,YAAA4D,EAAAu9E,QAAAC,UAAAvwE,EAAA3O,UAAAhC,EAAA,MAAA0D,EAAAiN,EAAAyU,MAAA,KAAApjB,WAAA,OAAA28D,GAAA,KAAAj7D,EAAA,GACF,SAAA1D,IAAe,IAAA0D,EAAA,gBAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,2CAAArsD,IACX0D,EAAAiN,EAAA/P,KAAA,OACK+6K,YAAc,KACnBj4K,EAAK02B,MAAQ,KACb12B,EAAKk4K,cAAA,EACLl4K,EAAKy2B,KAAO,KACZz2B,EAAK+9I,cAAA,EACL/9I,EAAK62J,YAAA,EACL72J,EAAKmvK,OAAS,KARHnvK,CASd,QAAA1D,CAAA,CAVC,CAAsB28C,IAAA6jB,GAAAn5D,EAAA,MCL5B,SAAS46D,KAEL,IAAIv+D,EAAY,EAIhB,SAASoN,EAAYpN,GAGjB,IAFA,IAAIoN,EAAO,GAEFzJ,EAAI,EAAGA,EAAI3D,EAAM3D,SAAUsH,EAEhCyJ,GADWpN,EAAM2D,GACNmzD,MAKf,OAFU1pD,EAAK/Q,OACJ+Q,EAAK5K,QAAQ,OAAQ,IAAInG,MAEvC,CAED,SAASsH,EAAoB3D,GACzB,MAAO,SAAuB,MAAXA,EAAO6K,EAAa,WAA0B,KAAZ7K,EAAOm4K,GAAa,cAAgB,IAAkB,MAAXn4K,EAAO6K,GAAc,cAA4D,KAA3C+D,KAAKgN,IAAK5b,EAAOo4K,GAAK,EAAKp4K,EAAOm4K,GAAI,GAAa,qFAC5L,CAED,SAASlrK,EAAUjN,GACf,MAAc,QAAVA,EACO,iBACU,UAAVA,EACA,iBACU,SAAVA,EACA,iBACU,SAAVA,EACA,mBACU,YAAVA,EACA,mBACU,WAAVA,EACA,mBACU,UAAVA,EACA,qBACU,UAAVA,EACA,eAEJA,CACV,CAED,SAAS1D,EAAS0D,EAAcoN,GAC5B,IAAMzJ,EAAW3D,EAAawlH,YAAc,GAC5C,OAAIp4G,EACO,cAAgBzJ,EAAW,uEAA4EyJ,EAAMgpD,WAAcnpD,EAAUG,EAAMgpD,YAAc,sBAAwB,kBAAoBhpD,EAAMkpD,QAAU,SAAW,UAAY,uBAAyBlpD,EAAMipD,UAAY,YAAc,QAAU,0CAA6CjpD,EAAMmpD,WAActpD,EAAUG,EAAMmpD,YAAc,eAAiB,IAE/Z,cAAgB5yD,EAAW,0QAEzC,CAED,SAASzH,EAAM8D,GACX,OAAOA,EAAEwC,QAAQ,QAAS,GAC7B,CAED,SAASqL,EAAM7N,GACX,OAAOA,EAAEwC,QAAQ,QAAS,GAC7B,CA6ND,MAHW,CACP61K,6BAzNJ,SAAsCprK,EAAcC,EAAWc,EAASvK,GACpE,IASIU,EAAGd,EATHgB,EAAa,KAEbD,GAAA,EACAE,GAAkB,EAClBR,EAAQ,CAAE8U,MAAO1L,EAAW4L,IAAK9K,EAASsqK,MAAO,IACjD50K,EAAe,2BACboH,EAAc,CAAC,EACf4D,EAAc,CAAC,EACf2W,EAAU,GAGhB,IAAKlhB,EAAI,EAAGA,EAAI,KAAMA,EAAG,CACrB,IAAMiS,EAAM3S,EAAc00D,KAAKh0D,GAC3B2K,EAAO,GACPE,EAAe,KAEnB,IAAI,IAAUoH,EAAI8gD,UAAW,CAIzB,IAAM/6D,EAAYiR,EAAYgJ,EAAIghD,OAGf,OAAf/yD,IACAA,EAAa,CAAEwG,EAAG1O,EAAWg8K,GAAIh0K,EAAGi0K,GAAKj0K,EAAI,EAAIL,EAAG,KAInD3H,IAAcmI,GAAmBF,IAClCC,EAAWP,EAAEid,KAAKjd,GAClBA,EAAQ,CAAE8U,MAAO1L,EAAW4L,IAAK9K,EAASsqK,MAAO,IACjDj0K,EAAW+zK,GAAKj0K,EAChBE,EAAWlG,KAAO,UAAYkG,EAAWwG,EAAI,IAAMxG,EAAW8zK,GAAK,IAAM9zK,EAAW+zK,IAAA,IACtEttK,EAAY7N,eAAeoH,EAAWlG,OAChDknB,EAAQtE,KAAK1c,GACbyG,EAAYzG,EAAWlG,MAAQkG,GAEdyG,EAAYzG,EAAWlG,MACzB2F,EAAEy0K,OAAOl0K,EAAWP,GAGvCO,EAAa,CAAEwG,EAAG1O,EAAWg8K,GAAIh0K,EAAGi0K,GAAKj0K,EAAI,EAAIL,EAAG,KAGxD,IAAK,IAAIiP,EAAI,EAAGA,EAAIqD,EAAIghD,MAAM/6D,SAAU0W,EAAG,CACvC,IAAMgD,EAAKK,EAAIghD,MAAMrkD,GACf2C,EAAeK,EAAGghD,SACxB,GAAsB,OAAjB/nD,IAA4B0G,EAAaihD,OAAO3nD,GAAgB,CAC7DF,EAAKzB,OAAOhR,OAAS,IACrByH,EAAMw0K,MAAMv3J,KAAK,CAAE5iB,KAAMuF,EAAcg6D,KAAM5uD,EAAM2pD,IAAKt0D,IACxD2K,EAAO,IAGX,IAAIoH,EAAqB,gBAAkBR,EAAa0gD,WAAa,IAAM1gD,EAAa6gD,WACpF7gD,EAAa2gD,YACbngD,GAAsB,cAEtBR,EAAa4gD,UACbpgD,GAAsB,YAGrBxH,EAAYzR,eAAeiZ,KAC5BxH,EAAYwH,GAAsB8gB,KAAK/F,MAAM+F,KAAKC,UAAUvhB,KAGhE1G,EAAe0G,EAEfhS,EAAewS,CAClB,CAEDpH,GAAQiH,EAAG+gD,KACd,CAEGhoD,EAAKzB,OAAOhR,OAAS,GACrByH,EAAMw0K,MAAMv3J,KAAK,CAAE5iB,KAAMuF,EAAcg6D,KAAM5uD,EAAM2pD,IAAKt0D,IAG5DC,GAAA,EACAE,EAAiBnI,CACpB,MAEGiI,GAAA,EACAE,GAAkB,EAEdD,IACAA,EAAWP,EAAEid,KAAKjd,GAClBA,EAAQ,CAAE8U,MAAO1L,EAAW4L,IAAK9K,EAASsqK,MAAO,IACjDj0K,EAAW+zK,GAAKj0K,EAChBE,EAAWlG,KAAO,UAAYkG,EAAWwG,EAAI,IAAMxG,EAAW8zK,GAAK,IAAM9zK,EAAW+zK,IAAA,IACtEttK,EAAY7N,eAAeoH,EAAWlG,OAChDknB,EAAQtE,KAAK1c,GACbyG,EAAYzG,EAAWlG,MAAQkG,GAEdyG,EAAYzG,EAAWlG,MACzB2F,EAAEy0K,OAAOl0K,EAAWP,GAGvCO,EAAa,KAIxB,CAEGA,IACAA,EAAWP,EAAEid,KAAKjd,GAClBO,EAAW+zK,GAAKj0K,EAAI,EACpBE,EAAWlG,KAAO,UAAYkG,EAAWwG,EAAI,IAAMxG,EAAW8zK,GAAK,IAAM9zK,EAAW+zK,IAAA,IACtEttK,EAAY7N,eAAeoH,EAAWlG,OAChDknB,EAAQtE,KAAK1c,GACbyG,EAAYzG,EAAWlG,MAAQkG,GAEdyG,EAAYzG,EAAWlG,MACzB2F,EAAEy0K,OAAOl0K,EAAWP,GAGvCO,EAAa,MAGjB,IAAM6U,EAAgB,GAGtB,IAAK/U,EAAI,EAAGA,EAAIkhB,EAAQhpB,SAAU8H,EAAG,CACjC,IAAMgS,EAASkP,EAAQlhB,GAEjB8R,EAAQ,cAAiBjW,IACzBiZ,EAAWhX,SAASC,cAAc,OACxC+W,EAAShB,GAAKhC,EACd,IAAMoC,EAAsB1U,EAAoBwS,GAChD8C,EAASmqE,MAAMyjC,QAAU,8FAAgGxuG,EAEzH,IAAMf,EAAUrV,SAASC,cAAc,OACvCoV,EAAQmrG,UAAY,sBACpBnrG,EAAQ8rE,MAAMyjC,QAAUvqH,EAAS2Q,GAEjC,IAAMwF,EAAgBxQ,SAASC,cAAc,OAC7CuQ,EAAcgwG,UAAY,gBAC1BhwG,EAAc2wE,MAAMyjC,QAAU,wCAE9B,IAAK,IAAItvG,EAAI,EAAGA,EAAIpB,EAAOrS,EAAEzH,SAAUkb,EAAG,CACtC,IAAM1M,EAAOsL,EAAOrS,EAAEyT,GAClBjU,EAAc,EAClB,IAAKD,EAAI,EAAGA,EAAIwH,EAAKytK,MAAMj8K,SAAUgH,EAAG,CACpC,IAAI8V,EAAOtO,EAAKytK,MAAMj1K,GACtB,GAAI8V,EAAKukD,KAAKrhE,OAAS,EAAG,CACtB,GAAW,IAANgH,GAAYC,GAAe6V,EAAKs/C,IAAK,CACtC,IAAMjoC,EAAYvuB,SAASC,cAAc,MACzCsuB,EAAUiyF,UAAY,YACtBhwG,EAAcugD,YAAYxiC,EAC7B,CACD,IAAIpX,GAAA,EACA9V,IAAgB6V,EAAKs/C,MACrBr/C,GAAA,GAEJ9V,EAAc6V,EAAKs/C,IACnB,IAAM3+C,EAAYpL,EAAYyK,EAAKhb,MAC7B+F,EAAcjC,SAASC,cAAc,QAC3CgC,EAAYu+G,UAAY,eAAiBtpG,EAAKhb,KAAO,mBACrD+F,EAAYk/E,MAAMyjC,QAAUvqH,EAAS2Q,EAAc6M,GAGxC,IAANzW,GAAY+V,EAET/V,IAAMwH,EAAKytK,MAAMj8K,OAAS,EAE1B6H,EAAY27D,YAAchyD,EAAMsL,EAAKukD,MAGrCx5D,EAAY27D,YAAc1mD,EAAKukD,KAI/B7yD,EAAKytK,MAAMj8K,OAAS,GAAKgH,EAAKwH,EAAKytK,MAAMj8K,OAAS,GAE9C8c,EAAKs/C,MAAQ5tD,EAAKytK,MAAMj1K,EAAI,GAAGo1D,IAE/Bv0D,EAAY27D,YAAc3jE,EAAMid,EAAKukD,MAMzCx5D,EAAY27D,YAAc1mD,EAAKukD,KAAKrwD,OAG5CoF,EAAcugD,YAAY9uD,EAC7B,CACJ,CACJ,CAEDoT,EAAQ07C,YAAYvgD,GACpBwG,EAAS+5C,YAAY17C,GAErB,IAAMmQ,EAAW,CAAE+wJ,UAAa,CAAC,IAAK,KACtC,IAAK,IAAMx4J,KAAKtR,EACRA,EAAYzR,eAAe+iB,KAC3ByH,EAASzH,GAAK,CAAC,IAAK,KAI5B9G,EAAc6H,KAAK,CACf9iB,KAAM,OACN2a,MAAO1L,EACP4L,IAAK9K,EACLyqK,eAAgBx/J,EAChBy/J,MAAOziK,EACP0iK,eAAgB,CAAC,GAAI,IACrBC,cAAA,EACAhuD,SAAUnjG,EACVw6D,WAAY,CAAC,EACb42F,YAAa,CAAC,GAErB,CACD,OAAO3/J,CACV,EAMJ,CAEDqlD,GAAuBo7D,sBAAwB,yBAC/C,IAAAx8D,GAAeh5D,EAAAqsB,EAAAopG,oBAAiCr7D,IC/QhD,SAAS5B,GAAiB38D,GACtB,IAeIoN,EACAzJ,EACAsJ,EACAY,EACAX,EACA/I,EACAE,EACAD,EACAE,EACAR,EACAJ,EACAoH,EACA4D,EACA2W,EACAjP,EACAtH,EACA3S,EA/BE4W,EAAa/S,EAAOq+I,WACpBtoI,EAAgB/V,EAAO8kJ,cACvBpvI,EAAkB1V,EAAO+kJ,gBACzB7rI,EAAalZ,EAAOy3I,WACpBxhI,EAAajW,EAAOm4B,WACpBlf,EAAYjZ,EAAO84K,UACnBzgK,EAA2BrY,EAAO+4K,yBAClCzhK,EAAatX,EAAOg5K,WACpBvmK,EAAazS,EAAO2nI,WACpBpwH,EAAWvX,EAAOo5G,SAElBvuG,EAAUyL,KAAK9V,QACf8C,GAAA,EAAW0K,EAAAwiB,GAAS3lB,GAASsuH,cAC/BhgH,GAAA,EAuCJ,SAASqX,IAPLrsB,EAAgB,KAChBC,EAAYuvC,IACZrvC,EAAmB,GACnBR,EAA+B,KAC/BO,GAAA,EAMA6I,EAAa,GACbW,EAAS,IACZ,CA4CD,SAASuL,EAA8BpZ,GACnC,IAAMoN,EAAgB,IAAIiuD,GAG1B,IAAK,IAAI13D,KAAO3D,EACZoN,EAAczJ,GAAO3D,EAAU2D,GAGnCyJ,EAAc6lK,OAASjzK,EAAUizK,OACjC7lK,EAAc8qK,aAyalB,SAAsBl4K,GAIlB,IAAIoN,GAAA,EAUJ,OATItC,EAAezO,OAAS,GAAK2D,EAAU62J,WACvCzpJ,EAAapN,EAAUiY,IAAMjY,EAAUiY,KAAO/b,EAAAs0B,EAAAyjJ,IACb,IAA1BnpK,EAAezO,OAClB2D,EAAUiY,IAA8B,iBAAjBjY,EAAUiY,IAAoD,OAAjCjY,EAAUiY,GAAG9J,UAAU,EAAG,KAC9Ef,GAAA,GAE6B,IAA1BtC,EAAezO,SACtB+Q,EAAapN,EAAUqc,QAAUnP,EAAW,GAAGmP,OAE5CjP,CACV,CAfD,CAza8CpN,GAC1CoN,EAAc2wI,aAAe/9I,EAAU+9I,aACvC3wI,EAAcypJ,aAAe72J,EAAU62J,WACvCzpJ,EAAc+hK,OAqFlB,SAAoBnvK,GAChB,OAAQA,EAAUulB,OAASvlB,EAAUulB,MAAM7iB,OAAOxG,EAAAs0B,EAAAyoJ,OAAmB,GAAOj5K,EAAUg1D,UAAYh1D,EAAUg1D,SAAStyD,OAAOxG,EAAAs0B,EAAA0oJ,OAAmB,CAClJ,CAFD,CArFsCl5K,GAClCoN,EAAcqpB,KAwFlB,SAAkBz2B,EAAWoN,GACzB,IAAIzJ,EAAQ3D,EAAU6hK,OAAS7hK,EAAU6hK,MAAMxlK,OAAS,EAAK+Q,EAAapN,EAAU6hK,MAAM,IAAMz0J,EAAa+rK,QAI7G,OAFQx1K,IAASyJ,EAAa+rK,SAAWx1K,IAASyJ,EAAa2pG,SAAYpzG,EAAOyJ,EAAa+rK,OAGlG,CAND,CAxFkCn5K,EAXT,CAAE+2G,SAAU,YAAaoiE,QAAS,aAavDljK,EAAWmiB,aAAahrB,EAC3B,CAYD,SAAS0M,EAAsB9Z,GAC3B,IAAMoN,EAAQpN,EAAEq9I,MAEZjwI,EAAMi8H,UAAU6qC,kBAChBzsJ,EAAOra,EAAM+Y,MAAO/Y,EAE3B,CA2DD,SAASlJ,EAA6BlE,GAClC0D,EAAyB1D,CAC5B,CAcD,SAASynB,EAAOznB,EAAOkN,GACnB,IAAMc,EAAYd,EAAMm8H,UAClB5lI,EAAYuK,EAAU/P,KACtBoF,EAAW2K,EAAUgnD,SACrB1wD,EAAY0J,EAAUuX,OAASliB,EAEhCiB,GAK+C,IAAhD0J,EAAUuX,MAAM9c,QAAQ,mBAShC,SAA+BzI,EAAO1D,EAAO4Q,GACzC,IAAIc,EAGJ,GAA0B,0BAAtB1R,EAAM6gJ,YACN94I,GAAA,EACAD,EAAY6I,EAAUk5I,0BAA0BnmJ,OAC7C,CACH,IAAKqE,EACD,QAGJ2J,EADcf,EAAUmsK,eAAep5K,GACdq5K,YACVh9K,OAAS,IACpByH,EAA+BkK,EAAW,GAAGy1C,IAAMnnD,EAAMsc,MAAQxU,GAGjE8I,EAAUxK,OAAOxG,EAAAs0B,EAAAyoJ,OAAmB,EAQhD,SAA+Bj5K,EAAOiN,EAAY3Q,GAC9C,IAAI4Q,EAAGc,EAIP,IAFAH,EAAoB,OAAXA,EAAkBA,EAAS8R,EAAWrjB,GAE1C4Q,EAAI,EAAGA,EAAID,EAAW5Q,OAAQ6Q,IAAK,CACpC,IAAMzJ,EAASwJ,EAAWC,GACpB7J,EAAcI,EAAOggD,IACrBp/C,EAAkBoY,IAClBnY,EAAQD,EAAkBhB,EAAce,EACxCN,EAAMQ,EAAQb,EAAOuU,SAAW5T,EACtCgJ,EAASmtB,SAASoiD,IAAIr4E,EAAOR,GAC7B,IAAMgH,EAAW,IAAI6c,SAAS3nB,EAAOyD,EAAOijB,OAAQjjB,EAAO61K,SAAS,IAChE5qK,EAAYyoD,GAAAoiH,MAAAC,iBAAgC1uK,EAAU5O,EAAAs0B,EAAAipJ,MACpDp0J,EAAS,GACXjP,EAAY3S,EAAOijB,OAASjjB,EAAO61K,SAAS,GAEhD,IAAKtrK,EAAI,EAAGA,EAAIvK,EAAO61K,SAASj9K,OAAQ2R,IAAK,CACzC,IAAMc,EAAS,IAAI6H,WAAW3W,EAAOoW,EAAW3S,EAAO61K,SAAStrK,IAC1DgB,EAAMwS,OAAOC,aAAaC,MAAM,KAAM5S,GAC5CuW,EAAOtE,KAAK/R,GACZoH,GAAa3S,EAAO61K,SAAStrK,EAChC,CAED,IACI,IAGM7R,EAHW4Z,EAAcgoE,WAGH27F,mBAAqBr2K,EAAce,EAAY,EACrE2O,EAASlF,EAAOojB,MAAMviB,EAAWvS,EAAakH,EAAce,GAAcf,EAAcI,EAAOuU,UAAY5T,EAAYihB,GAC7HpP,EAAW0jK,YAAYj2K,EAAwBW,EAAiB0O,EAMnE,CAJC,MAAO/S,GACLmE,EAAcy1I,mCACdtjI,KAAK2+C,SACLtxD,EAAO6H,MAAM,sBAAwBxL,EAAEkM,QAC1C,CACJ,CACJ,CAtCD,CAPkClM,EAAOgO,EAAYd,GA+CrD,SAAiClN,EAAOiN,GACpC,IAAI3Q,EAAGJ,EAAG2R,EAEJX,EAAe,GACrB,IAAK5Q,EAAI,EAAGA,EAAI2Q,EAAW5Q,OAAQC,IAAK,CACpC,IAAM0R,EAASf,EAAW3Q,GAC1B0R,EAAOy1C,KAAO3/C,EACd,IACML,EADkBgZ,IACQzO,EAAOy1C,IAAMr/C,EACvCD,EAAMV,EAAQuK,EAAOgK,SAAW5T,EACtCgJ,EAASmtB,SAASoiD,IAAIl5E,EAAOU,GAC7B,IAAMd,EAAarD,EAAM0W,MAAM1I,EAAO0Y,OAAQ1Y,EAAO0Y,OAAS1Y,EAAO8U,MAE/Dze,EAAc8yD,GAAAyiH,YAAqBv2K,GAEzC,IAAKnH,EAAI,EAAGA,EAAImI,EAAYw1K,MAAMx9K,OAAQH,IAAK,CAC3C,IAAMoI,EAAOD,EAAYw1K,MAAM39K,GAE/B,GADAyH,EAAOiS,MAAM,aAAetR,EAAKrG,MACf,SAAdqG,EAAKrG,MAGS,SAAdqG,EAAKrG,KAAiB,CACtB0F,EAAOiS,MAAM,2BAA6BtR,EAAKu1K,MAAMx9K,QACrD,IAAIyO,EAAQ,CACRgvK,OAAQ,CAAC,GAEb,IAAKjsK,EAAI,EAAGA,EAAIvJ,EAAKu1K,MAAMx9K,OAAQwR,IAAK,CACpC,IAAMa,EAAOpK,EAAKu1K,MAAMhsK,GAIxB,GAHAlK,EAAOiS,MAAM,aAAelH,EAAKzQ,MAGf,SAAdyQ,EAAKzQ,KACL6M,EAAM8N,MAAQ5K,EAAOy1C,IAAMr/C,EAC3B0G,EAAMgO,KAAO9K,EAAOy1C,IAAMz1C,EAAOgK,UAAY5T,EAC7C0G,EAAM1E,KAAOsI,EAAKqrK,cAIjB,GAAkB,SAAdrrK,EAAKzQ,MAAmByQ,EAAK0qG,UAA8B,KAAlB1qG,EAAK0qG,SACnD,IACI,IAAM/zF,EAAW3W,EAAK0qG,SAAS/qG,MAAM,KACrCvD,EAAMgvK,OAAS7gK,EAAU+gK,iBAAiB30J,EAG7C,CAFC,MAAOrlB,GAER,CAER,CACG8K,GAASA,EAAM1E,OACf8G,EAAa6T,KAAKjW,GAClBnH,EAAOiS,MAAP,QAAAhW,OAAqBkL,EAAM8N,MAA3B,OAAAhZ,OAAsCkL,EAAMgO,IAA5C,QAAAlZ,OAAsDkL,EAAM1E,OAEnE,CACJ,CACJ,CACG8G,EAAa7Q,OAAS,GACtB4Z,EAAW0jK,YAAYj2K,EAAwB,EAAGwJ,EAEzD,CAzDD,CA7CoClN,EAAOgO,EAEtC,CACJ,CAvBD,CAR8BhO,EAAOkN,EAAO5I,GAC7Bb,IAAcvH,EAAAs0B,EAAAi7C,MAiK7B,SAA6BzrE,EAAOoN,GAChC,IAAIlR,EAAG2R,EAGP,GAAIT,EAAM+vI,cAAgBhnI,EAAAD,EAAA0rH,kBACI,IAAtBlzH,IACAA,EAAoBzB,EAAUk5I,0BAA0BnmJ,SAK3D,GAAIoN,EAAM+vI,cAAgBhnI,EAAAD,EAAAyrH,mBAAgC,CAE3D,GAA0B,IAAtBjzH,EAEA,YADA/K,EAAO8I,KAAK,mDAMhB,IAAMS,GAFNW,EAAcZ,EAAUmsK,eAAep5K,IAEJi6K,mBAC7BjsK,EAAaY,KAAKsrK,MAAM9sK,EAAMwL,OAC9BnV,EAAWmL,KAAKsrK,MAAM9sK,EAAM0L,KAMlC,GAJKhK,EAA2B,IAAOA,EAA2B,IA8B1E,WAGI,IADA,IAAI9O,EACKoN,EAAI,EAAGA,EAAItC,EAAezO,OAAQ+Q,IAAK,CAG5C,IAAkB,KAFlBpN,EAAWiW,EAAWkkK,iBAAiBrvK,EAAesC,GAAG6K,KAIrD,YADAtU,EAAO8I,KAAK,wCAIhB,IAAMQ,EAAU+S,EAAsBhgB,GACtC8O,EAA2B1B,GAAK,IAAI9Q,IAAA,cAA0B8Q,EAAI,EAAG,CACjE0tD,OAAQ7tD,GACT,KACN,CACJ,CAhBD,GA1BYyB,EAAmB,CACnB,GAzCZ,SAAkC1O,EAA4BoN,EAAgBzJ,EAAcsJ,EAAc3Q,GACtG,OAAmC,OAA/B0D,GAA0D,OAAnBoN,GAA4C,OAAjBH,GAAwC,OAAf3Q,IAI3F8Q,IAAmBpN,EAEZiN,IAAiB3Q,EAErB8Q,IAAmBpN,EAA6B2D,EAC1D,CAVD,CAyCyC0hB,EAA4BnY,EAAgBW,EAAYusK,aAAchkK,EAAcpI,GAC7G,IAAK9R,EAAI,EAAGA,EAAI4S,EAA2BzS,OAAQH,IAC3C4S,EAA2B5S,IAC3B4S,EAA2B5S,GAAG8yC,QAO1C,IAFA,IAAM7qC,EA+DlB,SAA4BnE,EAAMoN,GAC9B,GAAuB,IAAnBA,EAAQ/Q,OACR,OAAO,KAQX,IALA,IAAMsH,EAAY,CACd02K,OAAQ,GACRC,OAAQ,CAAC,GAAI,KAEXrtK,EAAM,IAAI0a,SAAS3nB,GAChB9D,EAAI,EAAGA,EAAIkR,EAAQ/Q,OAAQH,IAKhC,IAJA,IAAM2R,EAAST,EAAQlR,GACjBgR,EAAe5Q,IAAAq8H,gBAA6B1rH,EAAKY,EAAO6Y,OAAQ7Y,EAAOiV,MACzE9U,EAAiB,KACjBvK,EAAM,EACDU,EAAI,EAAGA,EAAI+I,EAAa7Q,OAAQ8H,IAErC,IADA,IAAMd,EAAS/G,IAAAu8H,2BAAwC5rH,EAAKC,EAAa/I,IAChEE,EAAI,EAAGA,EAAI,EAAGA,IACnB,GAAIhB,EAAOgB,GAAGhI,OAAS,EAAG,CAClBwR,EAAO41C,MAAQz1C,EACfvK,EAAM,EAENA,GAAO,EAEX,IAAMW,EAAkBqY,IACxB9Y,EAAU22K,OAAOj2K,GAAG0c,KAAK,CAAClT,EAAO41C,IAAOr/C,EAAkBsK,EAAoBrL,EAAOgB,GAAIZ,IACzFuK,EAAiBH,EAAO41C,GAC3B,CAiBb,OATA9/C,EAAU22K,OAAO5wK,SAAQ,SAAmB1J,GACxCA,EAAMirC,MAAK,SAAUjrC,EAAGoN,GACpB,OAAIpN,EAAE,KAAOoN,EAAE,GACJpN,EAAE,GAAKoN,EAAE,GAEbpN,EAAE,GAAKoN,EAAE,EACnB,GACJ,IAEMzJ,CACV,CA7CD,CA/DiD3D,EAAO6N,EAAYwrK,YAE/Ch2K,EAAU,EAAGA,EAAUyL,EAA2BzS,OAAQgH,IAAW,CAC1E,IAAMgB,EAASF,EAAUm2K,OAAOj3K,GAC1Be,EAAc0K,EAA2BzL,GAC/C,GAAIe,EACA,IAAKlI,EAAI,EAAGA,EAAImI,EAAOhI,OAAQH,IAC3BkI,EAAYg3D,QAAQ/2D,EAAOnI,GAAG,GAAKwS,EAAmBrK,EAAOnI,GAAG,GAG3E,CACDmpB,EAA6BnY,EAC7BkJ,EAAe3S,CAClB,CACJ,CACJ,CApDD,CAhK4BzD,EAAOkN,GAkInC,SAAqBlN,EAAO2D,EAAOsJ,GAC/B,IAAI3Q,EACAuR,EAEEX,EAAW,IAAIya,SAAS3nB,EAAO,EAAGA,EAAMuhB,YAC9C1T,EAAYspD,GAAAoiH,MAAAC,iBAAgCtsK,EAAUhR,EAAAs0B,EAAAipJ,MAEtD,IACIn9K,EAASqjB,EAAW1S,GAAWgkB,MAAMpjB,EAAW,GAChDoI,EAAW0jK,YAAY1jK,EAAWskK,qBAAsB,EAAGj+K,GACvD8Q,EAASmtB,UACTntB,EAASmtB,SAASoiD,IAAIh5E,EAAMiV,MAAOjV,EAAMmV,IAIhD,CAFC,MAAO9Y,GACL+S,EAAWvH,MAAM,IAAIwD,EAAAwhB,EAAYta,EAAA0lI,+BAAuC1lI,EAAA2mI,+BAAwC78I,EAAEkM,QAAS2B,GAC9H,CACJ,CAhBD,CAhIoB7N,EAAOkN,EAAO5I,GAT1BX,EAAO6H,MAAM,uBAWpB,CAoOD,SAASwU,EAAsBhgB,GAmB3B,OAlBA,SAAgBoN,EAAWzJ,EAASsJ,GAChC,IAAI3Q,GAEAA,EADA4c,EAAWs2J,sBACKrzK,EAAuBk8K,6BAA6Bn/J,EAAW87H,aAAc5nI,EAAWzJ,EAASsJ,GAGjG,CAAC,CACb2L,MAAOxL,EACP0L,IAAKnV,EACLyC,KAJS6G,EAAc8rD,iBAKvB+gH,OAAQ,CAAC,MAIb7jK,EAAW0jK,YAAY35K,EAAY,EAAG1D,EAE7C,CAGJ,CAuDD,SAASmgB,IACL,OAAQ6Y,MAAMloB,EAASomD,iBAA8C,EAA3BpmD,EAASomD,eACtD,CAmBD,SAAS7zC,EAAW3f,GAChB,IAAIoN,EAMJ,OALIpN,EAAU0C,OAAOxG,EAAAs0B,EAAAgqJ,MAAkB,EACnCptK,EAASmK,EAASH,MAAMskH,UAAU33G,KAAKs8G,OAAOC,wBAA0BjoH,EAA2BA,EAA2BY,GACvHjZ,EAAU0C,OAAOxG,EAAAs0B,EAAA0oJ,OAAmB,GAAKl5K,EAAU0C,OAAOxG,EAAAs0B,EAAAyoJ,OAAmB,KACpF7rK,EAASkK,GAENlK,CACV,CAYD,SAAS8O,EAAqBlc,GAC1B8K,EAAepB,SAAQ,SAAU0D,GAC7B,IAAMzJ,EAAWsS,EAAWkkK,iBAAiB/sK,EAAM6K,IAC/CtU,GAAY,GACZsS,EAAWwkK,uBAAuB92K,EAAU3D,EAAE4f,KAAM5f,EAAE4zE,GAE7D,GACJ,CAuBD,OAjBAxmE,EAAW,CACPi9H,WA/gBJ,WAESlxH,IA6ELrO,EAAiB,GACjBpH,EAAyB,KACzBgL,EAAoB,EACpBI,EAA6B,GAC7BuW,EAA6B,KAC7BjP,EAAe,KACf+C,GAAA,EACAhd,EAAyBghE,GAAuBtyD,GAASsuH,cAEzD71H,EAAS8uB,GAAG3uB,EAAA+sB,EAAA42G,qBAA6BttH,EAAuB1M,GAChE9J,EAAS8uB,GAAG3uB,EAAA+sB,EAAAu0G,eAAuB7oH,EAAsB9O,GAnF5D,EA0gBGstK,cAlgBJ,SAAuB16K,EAAM2D,EAAQsJ,GAIjC,GAFAC,EAAaA,EAAWtN,OAAO+D,GAE3B3D,IAAS9D,EAAAs0B,EAAAmmG,MAAkBhzH,EAAO,GAAGo6I,eAAiBp6I,EAAO,GAAGkzJ,WAAY,CAC5E1yJ,EAAgB8I,EAChBG,EAASmtB,UAAA,EAAWuiC,GAAAtsC,GAAiB3lB,GAASjK,SAC9C0D,EAAmBoR,EAAgBstJ,aAAa9mK,EAAAs0B,EAAAmmG,KAAgBlkH,EAAWwF,IAAIZ,QAAO,SAAArX,GAAK,OAAIA,EAAM+9I,YAAV,IAE3F,IADA,IAAMzhJ,EAAgBoZ,EAAgBwhJ,mBAAmBh7J,EAAAs0B,EAAAmmG,KAAgBlkH,EAAWwF,IAC3EpK,EAAI,EAAGA,EAAIvJ,EAAiBjI,OAAQwR,IACzC,GAAIvJ,EAAiBuJ,KAAOvR,EAAe,CACvC4H,EAA6B2J,GAC7B,KACH,CAER,CAED,IAAK,IAAIG,EAAI,EAAGA,EAAIrK,EAAOtH,OAAQ2R,IAC/BoL,EAA8BzV,EAAOqK,GAG5C,EA8eG2sK,gBAPJ,WACIztK,EAAa,EAChB,EAMGmtH,YAriBJ,WACI,OAAO5nH,EAAWwF,EACrB,EAoiBGm4C,OAAA3oC,EACArd,MAxdJ,WACC,EAwdG0sJ,iBA5aJ,SAA0B92J,GAEtB,GAAKmZ,GAIDnZ,EACA,GAAIA,EAAUiY,KAAO/b,EAAAs0B,EAAAyjJ,KAAiBj0K,EAAUiY,KAAO/b,EAAAs0B,EAAAoqJ,IAAe,CAClE,IAAK,IAAIxtK,EAAI,EAAGA,EAAItC,EAAezO,OAAQ+Q,IACvC,GAAItC,EAAesC,GAAG6K,KAAOjY,EAAUiY,GACnC,OAGRnN,EAAeiW,KAAK/gB,EACvB,MACG2D,EAAO8I,KAAK,kBAAoBzM,EAAUiY,GAAK,kBAG1D,EA2ZG4iK,cA1bJ,WACIv3K,EAASovB,IAAIjvB,EAAA+sB,EAAA42G,qBAA6BttH,EAAuB1M,GACjE9J,EAASovB,IAAIjvB,EAAA+sB,EAAAu0G,eAAuB7oH,EAAsB9O,GACtD6I,GACAA,EAAW6kK,sBAEf3hK,GAAA,EACArO,EAAiB,GACjBgE,EAA6B,CAAC,KAAM,MACpCuW,EAA6B,KAC7BjP,EAAe,IAClB,EAgbG2kK,UA1ZJ,WAOI,MANe,CACXz8B,cAAen6I,EACf62K,iBAAkB12K,EAClBmzI,WAAYv+H,EAInB,EAmZG+hK,6BAAA/2K,EACA+wD,OAlCJ,SAAgBj1D,EAAO2D,QAAA,IAEd3D,GAAyBA,IAAU2D,IACpC3D,EAAQoN,EAASmtB,SAAS3hB,MAAM,GAChCjV,EAAMyJ,EAASmtB,SAASzhB,IAAI1L,EAASmtB,SAASl+B,OAAS,IAE3D+Q,EAASmtB,SAAS06B,OAAOj1D,EAAO2D,GAChCsS,EAAWwkK,uBAAuB/2K,EAAwB1D,EAAO2D,EACpE,EA2BGqrC,MA3dJ,WACIxe,IAEAtjB,EAAa,GACbD,EAAY,IACf,GA7FGtJ,GAAA,EAASN,EAAAmtB,GAAM3lB,GAASsuH,cAAcK,UAAUpsH,GAChDH,GAAA,EAAY0kB,GAAAnB,GAAU3lB,GAASsuH,cAE/B3oG,IAqjBGpjB,CACV,CAEDuvD,GAAiBg9D,sBAAwB,mBACzC,IAAAr7D,GAAen6D,EAAAqsB,EAAAyqG,gBAA6Bt+D,IAAAmB,GAAAn6D,EAAA,eAAA45D,GAAAv9D,EAAAoN,IAAA,MAAAA,GAAAA,EAAApN,EAAA3D,UAAA+Q,EAAApN,EAAA3D,QAAA,QAAAsH,EAAA,EAAAsJ,EAAA,IAAAzQ,MAAA4Q,GAAAzJ,EAAAyJ,EAAAzJ,IAAAsJ,EAAAtJ,GAAA3D,EAAA2D,GAAA,OAAAsJ,CAAA,CCtmB5C,IAAMgsD,GAAuB,CACzB,OACA,QACA,WACA,KACA,MACA,OACA,YACA,aACA,cACA,WACA,gBACA,SACA,OACA,cACA,YAGJ,SAAS4E,GAAW79D,GAEhB,IAMIoN,EACAzJ,EACAsJ,EACA3Q,EACAuR,EACAX,EACA/I,EACAC,EACAE,EACAR,EACAJ,EACAoH,EACA4D,EACA2W,EACAjP,EACAtH,EACAE,EACA7S,EACA4W,EACAgD,EAzBEL,EAAUY,KAAK9V,QACf0V,GAAA,EAAWlI,EAAAwiB,GAAS9a,GAASyjH,cAC7BjgH,EAAalZ,EAAOy3I,WACpBthI,EAAanW,EAAO2nI,WACpB1xH,EAAWjW,EAAOo5G,SAsJxB,SAASngG,EAAyBjZ,EAAWoN,EAAYzJ,EAAYsJ,EAAa3Q,EAAaJ,GAC3F,IAGI2R,EAAoB,EACpBX,EAAqB,EAJDlN,EAAYoN,EACXzJ,EAAasJ,EAOlCY,GADAX,EAAqBE,GACqBH,EAAetJ,EAGzDuJ,GADAW,EAAoB7N,GACsB2D,EAAcsJ,EAG5D,IAAIe,EACAvK,EACAU,EAA0B,EAC1Bd,EAA2B,EAa/B,OAZ2BwK,EAAoBX,EAEtB5Q,GACrB+G,EAA2B6J,EAC3B/I,EAA0B+I,EAAqB5Q,IAE/C6H,EAA0B0J,EAC1BxK,EAA2BwK,EAAoBvR,GAEnD0R,GAAuBhO,EAAYmE,GAA2B,EAC9DV,GAAuB2J,EAAa/J,GAA4B,EAE5DnH,EACO,CACH2O,EAAGmD,EAAiD,GAA1B7J,EAC1B2G,EAAGrH,EAAkD,GAA3BJ,EAC1B6S,EAA6B,GAA1B/R,EACHG,EAA8B,GAA3BjB,GAGA,CACHwH,EAAGmD,EACHlD,EAAGrH,EACHyS,EAAG/R,EACHG,EAAGjB,EAGd,CAED,SAASgV,EAAerY,EAAOoN,GAC3B,IAAMzJ,EAAcuV,EAAWi1J,iBACzBlhK,EAAeiM,EAAWk1J,kBAC1B9xK,EAAa4c,EAAW42J,gBACxB5zK,EAAcgd,EAAWy2J,iBACzB9hK,EAAiBqL,EAAW22J,4BAC5B3iK,EAAkBgM,EAAW02J,6BAEnC,GAAmB,IAAftzK,GAAoC,IAAhBJ,EAAmB,CAEvC,IAAI8R,EAAc1R,EAAaJ,EAC3BuH,GAAA,EACAzD,EAAM44K,eAEN5qK,EAAc,IAAM,EACpBvK,GAAA,GAGJ,IAAMJ,EAAgB4V,EAAyB/b,KAAKoZ,KAAM3S,EAAasJ,EAAc3Q,EAAYJ,EAAa8R,EAAavK,GAErHqH,EAAgBzH,EAAc6S,EAC9BxH,EAAiBrL,EAAciB,EAC/BwK,EAAezL,EAAcwH,EAC7B1O,EAAckH,EAAcyH,EAElC,GAAIA,GAAiBxG,GAAoBoK,GAAkB5K,GAAqBgL,GAAgB3K,GAAmBhI,GAAeiI,GAAkBgJ,EAAc,CAM9J,GALAjJ,EAAkB2K,EAAe5B,EACjC9I,EAAiBjI,EAAc0R,EAC/BvJ,EAAmBwG,EACnBhH,EAAoB4K,EAEhBhL,EAAkB,CAClB,IAAMqP,EAAiBrP,EAAiB0/E,MACpCrwE,IACAA,EAAe3N,KAAOjB,EAAkB,KACxC4O,EAAe5N,IAAMf,EAAiB,KACtC2O,EAAe1N,MAAQf,EAAmB,KAC1CyO,EAAezN,OAASxB,EAAoB,KAC5CiP,EAAewvE,OAAUl9D,GAAuBpjB,SAASojB,IAAyBjP,EAAiBpH,EAAY,KAC/GkH,EAASye,QAAQtwB,EAAAmsB,EAAA0qJ,0BAExB,CAGD,IAAMnlK,EAAa/V,EAAM2rH,WACzB,GAAI51G,EAEA,IADA,IAAML,EAAMK,EAAW1Z,OACd8Z,EAAI,EAAGA,EAAIT,IAAOS,EAAG,CAC1B,IAAMF,EAAMF,EAAWI,GACvBF,EAAIklK,SAASllK,EAChB,CAER,CACJ,CACJ,CAED,SAASqB,EAAUtX,GACf,IAEIoN,EACAzJ,EACAsJ,EACA3Q,EACAJ,EANE2R,EAAavJ,EACb4I,EAAcpJ,EAOpB,GAAI9D,EAAU24K,eAAgB,CAC1B,IAAM3qK,EAAW,CAACH,EAAa7N,EAAU24K,eAAe,GAAIzrK,EAAclN,EAAU24K,eAAe,IACnG,GAAI34K,EAAU64K,YACV,IAAKzrK,KAAOpN,EAAU64K,YAClB,GAAI74K,EAAU64K,YAAY57K,eAAemQ,GAAM,CAE3CzJ,GADyB3D,EAAU64K,YAAYzrK,GACZY,EAAS,IAAIhR,WAGhD,IADA,IAAMyG,EAAexB,SAASm5K,uBAAuB,eAC5Cj3K,EAAI,EAAGA,EAAIV,EAAapH,OAAQ8H,IACrCV,EAAaU,GAAGi/E,MAAMyjC,QAAUpjH,EAAaU,GAAGi/E,MAAMyjC,QAAQrkH,QAAQ,0CAA2C,KAAOmB,GACxHF,EAAaU,GAAGi/E,MAAMyjC,QAAUpjH,EAAaU,GAAGi/E,MAAMyjC,QAAQrkH,QAAQ,2CAA4C,KAAOmB,EAEhI,CAIT,GAAI3D,EAAU4qH,SAAU,CACpB,IAAKx9G,KAAOpN,EAAU4qH,SAClB,GAAI5qH,EAAU4qH,SAAS3tH,eAAemQ,GAAM,CACL,MAA/BpN,EAAU4qH,SAASx9G,GAAK,GACxBH,EAAgBjN,EAAU4qH,SAASx9G,GAAK,GAAK,IACP,MAA/BpN,EAAU4qH,SAASx9G,GAAK,KAC/BH,EAAgBjN,EAAU4qH,SAASx9G,GAAK,IAG5CzJ,GAAgBsJ,EAAgBe,EAAS,IAAIhR,WAGzCd,EADQ,oBAARkR,EACWnL,SAASm5K,uBAAuBhuK,GAEhCnL,SAASm5K,uBAAuB,aAG/C,IAAK,IAAI/3K,EAAI,EAAGA,EAAInH,EAASG,OAAQgH,IACjCnH,EAASmH,GAAG+/E,MAAMyjC,QAAU3qH,EAASmH,GAAG+/E,MAAMyjC,QAAQrkH,QAAQ,uCAAwC,KAAOmB,EAEpH,CAGL,GAAI3D,EAAUiiF,WACV,IAAK70E,KAAOpN,EAAUiiF,WAClB,GAAIjiF,EAAUiiF,WAAWhlF,eAAemQ,GAAM,CACL,MAAjCpN,EAAUiiF,WAAW70E,GAAK,GAC1B9Q,EAAkB0D,EAAUiiF,WAAW70E,GAAK,GAAK,IACX,MAA/BpN,EAAU4qH,SAASx9G,GAAK,KAC/B9Q,EAAkB0D,EAAUiiF,WAAW70E,GAAK,IAGhDzJ,GAAgBrH,EAAkB0R,EAAS,IAAIhR,WAC/Cd,EAAW+F,SAASm5K,uBAAuBhuK,GAC3C,IAAK,IAAI/I,EAAI,EAAGA,EAAInI,EAASG,OAAQgI,IACjCnI,EAASmI,GAAG++E,MAAMyjC,QAAU3qH,EAASmI,GAAG++E,MAAMyjC,QAAQrkH,QAAQ,yCAA0C,KAAOmB,EAEtH,CAGZ,CACJ,CAED,GAAI3D,EAAUq7K,IAAK,CACf,IAAIj3K,EAAiBnC,SAASq8G,eAAet+G,EAAU04K,OACnDt0K,GACAV,EAAiB4xD,YAAYlxD,GAEjCmT,EAAevX,EAClB,CACJ,CAED,SAASyS,EAAiBzS,EAAKoN,GAC3B,IAAMzJ,EAAoB,yDACpBsJ,EAAoB,UAC1B,GAAItJ,EAAkB9B,KAAKuL,GAAM,CAC7B,IAAM9Q,EAAQqH,EAAkBoK,KAAKX,GAC/BlR,EAAUsa,SAASla,EAAM,GAAI,IAAM,EAGzC,MADiB,yBADC+K,KAAKrH,EAAIqzH,OAAOn3H,GAGrC,CAAM,GAAI+Q,EAAkBpL,KAAKuL,GAAM,CACpC,IACMS,EADQZ,EAAkBc,KAAKX,GACf,GAEtB,MADiB,yBAA2BpN,EAAIs7K,eAAeztK,EAElE,CACG,OAAOT,CAEd,CAED,SAASmK,EAAevX,GACpB,GAAI0D,EAAkB,CAClBgd,GAAsBxjB,KAAKoZ,MAE3B,IAAMlJ,EAAWnL,SAASC,cAAc,OACxCwB,EAAiBsvD,YAAY5lD,GAE7B0B,GAAA,EAAmBgvD,GAAAy9G,YACfv7K,EAAIq7K,IACJjuK,GACA,SAAUA,GAAO,OAAOqF,EAAiBzS,EAAKoN,EAAM,GACpD1J,EAAiBu6G,aACjBv6G,EAAiBy6G,YACjBloG,EAASmB,MAAMskH,UAAU33G,KAAKm8G,KAAKC,uBACnC,SAAUngI,GAAO2D,EAAOmS,KAAK,kBAAmB9V,EAA4C,GAC5F8O,EACAmH,EAASmB,MAAMskH,UAAU33G,KAAKm8G,KAAKE,cAEvChzH,EAAS6K,GAAKjY,EAAI04K,MAClBxiK,EAASye,QAAQtwB,EAAAmsB,EAAAgrJ,iBAAoC,CAAEC,WAAYruK,EAAUsuK,gBAAAxuK,GAChF,CACJ,CAGD,SAASrC,EAAiB7K,EAAKoN,GAC3B,QAAKA,GAKEA,EAAQgpB,SAAWp2B,EAAIm2B,SACjC,CAGD,SAAS7yB,EAAetD,EAAKoN,GACzB,QAAK6I,EAASmB,MAAMskH,UAAU33G,KAAKk8G,uBAYvC,SAA8BjgI,EAAMoN,EAAMzJ,GACtC,IAAK,IAAIsJ,EAAI,EAAGA,EAAItJ,EAAMtH,OAAQ4Q,IAAK,CACnC,IAAM3Q,EAAMqH,EAAMsJ,GAClB,GAAI+pB,KAAKC,UAAUj3B,EAAK1D,MAAU06B,KAAKC,UAAU7pB,EAAK9Q,IAClD,OAAO,CAEd,CACD,OAAO,CACV,CARD,CAR8B8Q,EAASpN,EAAKi5D,MAIxC7rD,EAAQgpB,QAAUxnB,KAAKgN,IAAIxO,EAAQgpB,QAASp2B,EAAIo2B,UAAA,EAEnD,CAYD,SAASjd,EAAyBnZ,EAAKoN,GAC9BA,GAGLA,EAAS1D,SAAQ,SAAA0D,GACTA,EAAEqpB,MAAmB,UAAXrpB,EAAEqpB,OACZrpB,EAAE2lD,IAAMtgD,EAAiBzS,EAAKoN,EAAE2lD,MAEpC55C,EAAyBnZ,EAAKoN,EAAEuuK,SACnC,GACJ,CAKD,SAASnrJ,EAAYxwB,EAAUoN,EAAYH,GACvC,IAAM3Q,EAAQyjB,EAAc/f,GACtB6N,EAA6BoI,EAASmB,MAAMskH,UAAU33G,KAAKi8G,2BAEjE,GAAK1jI,GAIAE,MAAMC,QAAQwQ,IAAuC,IAAvBA,EAAY5Q,OAI/C,IAAK,IAAI6Q,EAAO,EAAGA,EAAOD,EAAY5Q,OAAQ6Q,IAAQ,CAClD,IAAIc,EAAM,KACJvK,EAAcwJ,EAAYC,GAEhC5Q,EAAMq8K,eAAiBl1K,EAAYk1K,eACnCr8K,EAAMs8K,aAAen1K,EAAYm1K,aAE5BtjJ,MAAM7xB,EAAYmV,QAAW0c,MAAM7xB,EAAYqV,OAC5CjL,EACAG,EAAMoL,EAAqB3V,EAAa2J,GACjCqP,EAAWhZ,IAAgBC,EAClCsK,EAAMyZ,EAAmBhkB,EAAa2J,EAAY9Q,GAC3CmH,EAAY2C,OACnB4H,EAAMgS,EAAsBvc,EAAa2J,EAAY9Q,KAI7D,IACI,GAAI0R,EAAK,CACL,IAAKwS,EAAWlkB,EAAO0R,GACnB,GAAIiI,EAASmB,MAAMskH,UAAU33G,KAAKs8G,OAAOC,uBAChChkI,EAAMs/K,gBACPt/K,EAAMs/K,cAAgB,IAE1Bt/K,EAAMs/K,cAAc76J,KAAK/S,OACtB,CAEH,IAAI7J,OAAA,EACA7H,EAAMy5B,MAA8B,IAAtBz5B,EAAMy5B,KAAK15B,SACzB8H,EAAU7H,EAAMy5B,KAAKz5B,EAAMy5B,KAAK15B,OAAS,IAGzCwO,EAAiBmD,EAAK7J,GACjBb,EAAe0K,EAAK7J,KAKjBA,EAAQk3K,MACRl3K,EAAQ03K,OAAS,WAAe,GAGhCv/K,EAAMw5B,OAAS55B,EAAAs0B,EAAAsrJ,eACfx/K,EAAM25B,OAAOjoB,IAIjB1R,EAAMw5B,OAAS55B,EAAAs0B,EAAAsrJ,eACfx/K,EAAM25B,OAAOjoB,EAGxB,CAIL,IAAM3K,EAAe4S,EAASmB,MAAMskH,UAAUr6G,OAAOu8G,aAErDntG,GAAyBn0B,EAAO,EADZ4c,EAAWpB,UACkBzU,EACpD,MACGM,EAAO6H,MAAM,0IAQpB,CANC,MAAOxL,GAKL,MAFA0wB,GAAiBp0B,GACjBA,EAAM25B,OAAOjoB,GACPhO,CACT,CACJ,CACJ,CAED,SAASoZ,EAAqBpZ,EAAaoN,GACvC,IAAIzJ,EAAMgc,EAAmB3f,EAAaoN,GAoB1C,OAlBAzJ,EAAIo4K,QAAU,WAGNt/J,EAAWzc,IAAgB+V,GAA0BA,EAAuB2iK,QAAU/0K,EAAI+0K,OAC1Fx0K,EAAgB6R,UAGbpS,EAAI1F,KAEX8X,EAAyBpS,EACzBmW,EAAiBnW,EACpB,EAEDA,EAAIk4K,OAAS,WACT33K,EAAgBP,GAChBoS,EAAyB,IAC5B,EAEMpS,CACV,CAED,SAASmW,EAAiB9Z,GACtBkW,EAASye,QAAQtwB,EAAAmsB,EAAAwrJ,UAA6Bh8K,EACjD,CAED,SAASkE,EAAgBlE,GACrBkW,EAASye,QAAQtwB,EAAAmsB,EAAAyrJ,SAA4B,CACzCvD,MAAO14K,EAAI04K,OAElB,CAED,SAASjxJ,EAAmBznB,EAAaoN,EAAYH,GACjD,IAAM3Q,EAAOga,KACTzI,EAAM8R,EAAmB3f,EAAaoN,GA0C1C,OAxCA1J,EAAiB0/E,MAAMh+E,KAAOjB,EAAkB,KAChDT,EAAiB0/E,MAAMj+E,IAAMf,EAAiB,KAC9CV,EAAiB0/E,MAAM/9E,MAAQf,EAAmB,KAClDZ,EAAiB0/E,MAAM99E,OAASxB,EAAoB,KAEpD+J,EAAIkuK,QAAU,WAAY,IAAA/7K,EAAA,KAClBiN,EAAM6oB,OAAS55B,EAAAs0B,EAAA0rJ,eACX5lK,KAAK+kK,KACDtoK,EAEA85G,uBAAsB,kBAAMt1G,EAAevX,EAArB,IAEtBuX,EAAejB,MAEnB3S,EAAOiS,MAAM,gBAAkBU,KAAKoiK,SAEpCh1K,EAAiBsvD,YAAY18C,KAAKmiK,gBAClCnhK,EAAUpa,KAAKZ,EAAMga,MACrBJ,EAASye,QAAQtwB,EAAAmsB,EAAAgrJ,iBAAoC,CACjDC,WAAYnlK,KAAKmiK,eACjBiD,gBAAAxuK,KAIf,EAGDW,EAAIguK,OAAS,WACT,GAAIn4K,EAEA,IADA,IAAM1D,EAAO0D,EAAiBoe,WACrB1U,EAAI,EAAGA,EAAIpN,EAAK3D,SAAU+Q,EAC3BpN,EAAKoN,GAAG6K,KAAO3B,KAAKoiK,QACpB/0K,EAAOiS,MAAM,eAAiB5V,EAAKoN,GAAG6K,IACtCvU,EAAiB4xD,YAAYt1D,EAAKoN,MAChCA,EAIjB,EAEMS,CACV,CAED,SAASmS,EAAsBhgB,EAAaoN,EAAYH,GACpD,IAAI3Q,EAAMqjB,EAAmB3f,EAAaoN,GAG1C,GAFA9Q,EAAI6/K,UAAA,EAEAn8K,EAAY85K,OACZ,aACQ95K,EAAY85K,OAAOx8G,OAAuB,UAAWhhE,IACrDA,EAAIghE,MAAQt9D,EAAY85K,OAAOx8G,YAAA,IAE/Bt9D,EAAY85K,OAAOp8G,MAAsB,SAAUphE,IACnDA,EAAIohE,KAAO19D,EAAY85K,OAAOp8G,WAAA,IAE9B19D,EAAY85K,OAAOl8G,aAA6B,gBAAiBthE,IACjEA,EAAIshE,YAAc59D,EAAY85K,OAAOl8G,kBAAA,IAErC59D,EAAY85K,OAAO50K,UAA0B,aAAc5I,IAC3DA,EAAI4I,SAAWlF,EAAY85K,OAAO50K,eAAA,IAElClF,EAAY85K,OAAOh3J,MAAsB,SAAUxmB,IACnDA,EAAIwmB,KAAO9iB,EAAY85K,OAAOh3J,KAIrC,CAFC,MAAO9iB,GACL2D,EAAO6H,MAAMxL,EAChB,CASL,OANA1D,EAAIy/K,QAAU,WACN9uK,EAAM6oB,OAAS55B,EAAAs0B,EAAA0rJ,cACfhmK,EAASye,QAAQtwB,EAAAmsB,EAAAgrJ,iBAAoC,CAAEE,gBAAAxuK,GAE9D,EAEM5Q,CACV,CAED,SAASmgB,EAAWzc,GAChB,MAAqB,SAAbA,EAAI/B,IACf,CAED,SAAS0hB,EAAmB3f,EAAaoN,GACrC,OAAIqP,EAAWzc,GAOnB,SAAmCA,EAAaoN,GAC5C,IAAIzJ,EAAM,IAAIsJ,EAAIjN,EAAY4Y,MAAQxL,EAAYpN,EAAY8Y,IAAM1L,EAAY,IAkBhF,OAjBAzJ,EAAI80K,eAAiBz4K,EAAYy4K,eACjC90K,EAAI03K,IAAMr7K,EAAYq7K,IACtB13K,EAAI0vH,OAASrzH,EAAYqzH,OACzB1vH,EAAI23K,eAAiBt7K,EAAYs7K,eACjC33K,EAAI+0K,MAAQ14K,EAAY04K,MACxB/0K,EAAIw3K,SAAW7jK,EAAUpX,KAAK8V,MAE9BrS,EAAIg1K,eAAiB34K,EAAY24K,eACjCh1K,EAAIs+E,WAAajiF,EAAYiiF,WAC7Bt+E,EAAIk1K,YAAc74K,EAAY64K,YAC9Bl1K,EAAIinH,SAAW5qH,EAAY4qH,SAGvBjnH,EAAI03K,KACJliK,EAAyBxV,EAAKA,EAAI03K,IAAIM,UAGnCh4K,CACV,CApBD,CANyC3D,EAAaoN,GA4BtD,SAAsCpN,EAAaoN,GAC/C,IAAIzJ,EAAM,IAAIsJ,EAAIjN,EAAY4Y,MAAQxL,EAAYpN,EAAY8Y,IAAM1L,EAAYpN,EAAYoG,MAE5F,OADAzC,EAAI+0K,MAAJ,GAAA94K,OAAe+D,EAAIwyB,UAAnB,KAAAv2B,OAAgC+D,EAAIyyB,SAC7BzyB,CACV,CAJD,CAzBwC3D,EAAaoN,EACpD,CA6DD,SAAS8O,EAAiBlc,GACtB,GAAI8K,EAEA,IADA,IAAMsC,EAAOtC,EAAoBgX,WACxBne,EAAI,EAAGA,EAAIyJ,EAAK/Q,SAAUsH,EAC3ByJ,EAAKzJ,GAAGsU,KAAOjY,EAAI04K,QACnB5tK,EAAoBwqD,YAAYloD,EAAKzJ,MACnCA,EAIjB,CA+BD,SAAS2c,IACL,IAD8BtgB,EAExBoN,EAAe,GAFSzJ,EAAA,SAAA3D,EAAAoN,GAAA,IAAAzJ,EAAA,uBAAAJ,QAAA,MAAAvD,EAAAuD,OAAA85E,UAAA,IAAA7gF,MAAAC,QAAAuD,KAAA2D,EAAA,SAAA3D,EAAAoN,GAAA,GAAApN,EAAA,qBAAAA,EAAA,OAAAu9D,GAAAv9D,EAAAoN,GAAA,IAAAzJ,EAAA7G,OAAAC,UAAAC,SAAAE,KAAA8C,GAAA0W,MAAA,uBAAA/S,GAAA3D,EAAA5D,cAAAuH,EAAA3D,EAAA5D,YAAA+B,MAAA,QAAAwF,GAAA,QAAAA,EAAAnH,MAAAojB,KAAA5f,GAAA,cAAA2D,GAAA,2CAAA9B,KAAA8B,GAAA45D,GAAAv9D,EAAAoN,QAAA,IAAApN,KAAAoN,GAAApN,GAAA,iBAAAA,EAAA3D,OAAA,CAAAsH,IAAA3D,EAAA2D,GAAA,IAAAsJ,EAAA,EAAA3Q,EAAA,oBAAA4Q,EAAA5Q,EAAAqH,EAAA,kBAAAsJ,GAAAjN,EAAA3D,OAAA,CAAAmK,MAAA,IAAAA,MAAA,EAAAsB,MAAA9H,EAAAiN,KAAA,EAAAjN,EAAA,SAAAA,GAAA,MAAAA,CAAA,EAAAqD,EAAA/G,EAAA,WAAAqsD,UAAA,6IAAAzsD,EAAA2R,GAAA,EAAAX,GAAA,SAAAA,EAAA,WAAAvJ,EAAA3D,EAAAuD,OAAA85E,WAAA,EAAA15E,EAAA,eAAA3D,EAAA2D,EAAA05F,OAAA,OAAAxvF,EAAA7N,EAAAwG,KAAAxG,CAAA,EAAAA,EAAA,SAAAA,GAAAkN,GAAA,EAAAhR,EAAA8D,CAAA,EAAAqD,EAAA,eAAAwK,GAAA,MAAAlK,EAAAwiF,QAAAxiF,EAAAwiF,QAAA,YAAAj5E,EAAA,MAAAhR,CAAA,KACfgd,EAAWw2J,iBADI,IAI9B,IAAA/rK,EAAAuJ,MAAAlN,EAAA2D,EAAAA,KAAA6C,MAA4B,KAAjByG,EAAiBjN,EAAA8H,MACpBmF,EAAMmvK,aAAelgL,EAAAs0B,EAAA0rJ,cACrB9uK,EAAa2T,KAAK9T,EAEzB,CAR6B,OAAAjN,GAAA2D,EAAA3D,EAAAA,EAAA,SAAA2D,EAAAN,GAAA,CAS9B,OAAO+J,CACV,CAED,SAAS2S,EAAc/f,GACnB,OAAOA,GAAO,GAAK1D,EAAe0D,GAC9BkZ,EAAWu2J,aAAanzK,EAAe0D,GAAKy2B,KAAMn6B,EAAe0D,GAAKiY,GAAI3b,EAAe0D,GAAKwvB,KAAMlzB,EAAe0D,GAAKmvK,OAAQ7yK,EAAe0D,GAAK62J,YAAc,IACzK,CAkBD,SAASx2I,EAAmBrgB,GAAK,IAAAoN,EAAA,KAC7B,GAAIpN,IAAQkN,EAAZ,CAIA,IAAMvJ,EAAQoc,EADd7S,EAAkBlN,GAElBugB,EAAmBrjB,KAAKoZ,KAAM3S,GAE1B+K,IACAg3B,cAAch3B,GACdA,EAAyB,MAGzB/K,GAAiC,SAAxBA,EAAM04K,gBACfhkK,EAAenb,KAAKoZ,KAAM3S,GAAA,GACtBX,OAAO6uH,gBACP11H,EAAiB,IAAI6G,OAAO6uH,gBAAe,WACvCx5G,EAAenb,KAAKkQ,EAAMzJ,GAAA,EAC7B,KACcouH,QAAQ74G,EAAW87H,cAElCtmI,EAAyB42B,YAAYjtB,EAAenY,KAAKoW,KAAM3S,GAAQ,KAlB9E,CAqBJ,CAED,SAAS4c,EAAmBvgB,GACxB0gB,GAAsBxjB,KAAKoZ,MACvBtW,GAC4B,SAAxBA,EAAMq8K,cACN17J,GAAkBzjB,KAAKoZ,MAK3Bqa,GAAqBzzB,KAAKoZ,KAEjC,CAED,SAASkK,EAAWxgB,EAAOoN,GACvB,IAAKpN,EAAM+1B,KAAM,OAAO,EACxB,IAAK,IAAIpyB,EAAI,EAAGA,EAAI3D,EAAM+1B,KAAK15B,OAAQsH,IACnC,GAAK3D,EAAM+1B,KAAKpyB,GAAGwyB,YAAc/oB,EAAI+oB,WAChCn2B,EAAM+1B,KAAKpyB,GAAGyyB,UAAYhpB,EAAIgpB,QAC/B,OAAO,EAGf,OAAO,CACV,CAED,SAAS3V,EAAWzgB,EAAKoN,EAAOzJ,GAAoB,IAAfsJ,IAAe3O,UAAAjC,OAAA,YAAAiC,UAAA,KAAAA,UAAA,GAChD,QAAK0B,IAGGs1B,MAAMloB,KAAWH,EAASjN,EAAIm2B,UAAYn2B,EAAIo2B,UAAYhpB,KAAWkoB,MAAM3xB,KAASsJ,EAASjN,EAAIo2B,QAAUp2B,EAAIm2B,YAAcxyB,EACxI,CAED,SAAS8sB,GAAyBzwB,EAAOoN,EAAOzJ,GAsDhD,IAAsBsJ,EACZ3Q,EArDN,KAAIqH,EAAMyJ,IAINpN,IAAUA,EAAM+1B,MAAQ/1B,EAAM47K,eAAgB,CAC9C,IAAM1/K,EAAO8D,EAAM+1B,MAAQ/1B,EAAM+1B,KAAK15B,OAAS,EAAI,SAAW,SACxDwR,EAAgB,WAAT3R,EAAoB8D,EAAM+1B,KAAO/1B,EAAM47K,cAEpD,IAAK/tK,GAAwB,IAAhBA,EAAKxR,OACd,OAIJ,IAFA,IAES6Q,EAFOW,EAAKxR,OAAS,EAER6Q,GAAK,EAAGA,KACtBuT,EAAW5S,EAAKX,GAAIE,EAAOzJ,GAAA,KAsCrBsJ,EAtCiDY,EAAKX,GAuClE5Q,EAAc4c,EAAWpB,UAExB7K,EAAIkpB,WAAa75B,GAAe2Q,EAAImpB,SAAW95B,KAxC7B,WAATJ,EACA8D,EAAMs2B,UAAUzoB,EAAKX,KAErBgP,EAAiBrO,EAAKX,WACflN,EAAM47K,cAAc1uK,IAI1C,CACJ,CAED,SAASwjB,GAAiB1wB,EAAOoN,EAAOzJ,GAAoB,IAAfsJ,IAAe3O,UAAAjC,OAAA,YAAAiC,UAAA,KAAAA,UAAA,GACxD,GAAI0B,IAAUA,EAAM+1B,MAAQ/1B,EAAM47K,eAAgB,CAC9C,IAAMt/K,EAAO0D,EAAM+1B,MAAQ/1B,EAAM+1B,KAAK15B,OAAS,EAAI,SAAW,SACxDH,EAAgB,WAATI,EAAoB0D,EAAM+1B,KAAO/1B,EAAM47K,cAEpD,IAAK1/K,GAAwB,IAAhBA,EAAKG,OACd,OAIJ,IAFA,IAES6Q,EAFOhR,EAAKG,OAAS,EAER6Q,GAAK,EAAGA,IACtBuT,EAAWvkB,EAAKgR,GAAIE,EAAOzJ,EAAKsJ,KACnB,WAAT3Q,GACIJ,EAAKgR,GAAG2uK,QACR3/K,EAAKgR,GAAG2uK,SAEZ77K,EAAMs2B,UAAUp6B,EAAKgR,MAErBgP,EAAiBhgB,EAAKgR,WACflN,EAAM47K,cAAc1uK,IAI1C,CACJ,CAsCD,SAASyT,KACL,IAAI3gB,EAAeiC,SAASq8G,eAAe,oBAC3C,IAAIt+G,EAAJ,EAIAA,EAAeiC,SAASC,cAAc,UACzB+V,GAAK,mBAClBhW,SAASs8G,KAAKvrD,YAAYhzD,GAC1B,IAAMoN,EAAapN,EAAas8K,MAC1BrvK,EAAQiM,EAAW87H,aACzB,IACQ/nI,IACIA,EAAMgL,GACN7K,EAAWmvK,WAAW,IAAMtvK,EAAMgL,GAAK,kCAAmC,GACxC,IAA3BhL,EAAMuwG,UAAUnhH,OACvB+Q,EAAWmvK,WAAW,IAAMtvK,EAAMw1G,UAAY,kCAAmC,GAEjFr1G,EAAWmvK,WAAW,uCAAwC,GAKzE,CAFC,MAAOv8K,GACL2D,EAAOmS,KAAK,GAAK9V,EAAEkM,QACtB,CAnBA,CAoBJ,CAGD,SAASykB,KACL,IAAM3wB,EAAeiC,SAASq8G,eAAe,oBACzCt+G,GACAiC,SAASs8G,KAAKjpD,YAAYt1D,EAEjC,CAED,SAAS0gB,KACL,GAAIhd,EACA,KAAOA,EAAiBu8E,YACpBv8E,EAAiB4xD,YAAY5xD,EAAiBu8E,WAGzD,CAmCD,OAnBA7yE,EAAW,CACPi9H,WAh7BJ,WAC0B,oBAAXrnI,QAA+C,oBAAdlB,YAI5CmL,EAAMjK,OAAO8zB,QAAU9zB,OAAOkzB,aAC9B55B,EAAiB,GACjBuR,EAAwB,GACxBX,GAAmB,EACnB/I,EAAkB,EAClBC,EAAiB,EACjBE,EAAmB,EACnBR,EAAoB,EACpBJ,EAAmB,KACnBoH,EAAsB,KACtB4D,EAAyB,KACzB0H,GAAA,EACApH,EAAY,WACZF,EAAmB,KACnBiE,EAA4B,0BAA2B/P,YAAA,IAEnDf,SAAS+jH,kBACT3gG,EAAsB,6BACfpjB,SAASu6K,mBAChBn3J,EAAsB,qBACfpjB,SAASw6K,oBAChBp3J,EAAsB,sBACfpjB,SAASy6K,gBAChBr3J,EAAsB,iBAE7B,EAm5BGg1G,YAj5BJ,WACI,OAAOlkH,EAAW8B,EACrB,EAg5BGmgB,aAn4BJ,SAAsBp4B,GAClB1D,EAAeykB,KAAK/gB,EACvB,EAk4BG25K,YAAAnpJ,EACAmmI,aAj4BJ,WACI,IAAM32J,EAA6BiW,EAASmB,MAAMskH,UAAU33G,KAAKi8G,2BAGjE1jI,EAAe2uC,MAAK,SAAUjrC,EAAGoN,GAC7B,OAAOpN,EAAEqc,MAAQjP,EAAEiP,KACtB,IAED3Y,EAAmBwV,EAAWs2J,sBAC9B1kK,EAAsBoO,EAAW62J,qBAEjC,IADA,IAzB8B3iK,EACxBzJ,EACAsJ,EACAe,EACA7J,EACAd,EAoBFe,GAAgB,EACXE,EAAI,EAAGA,EAAIhI,EAAeD,OAAQiI,IAAK,CAC5C,IAAMR,GA1BJH,GADwByJ,EA2Ba9Q,EAAegI,IA1BrCmyB,KACfxpB,OAAA,IAAQG,EAAQ6K,GAAmB7K,EAAQ6K,GAAK7K,EAAQoiB,KACxDxhB,EAAOZ,EAAQoiB,KACfrrB,EAASiJ,EAAQ+hK,OACjB9rK,EAAa+J,EAAQypJ,WACb39I,EAAWkf,aAAaz0B,EAAMsJ,EAAOe,EAAM7J,EAAQd,IAwB7DwK,EAAsBkT,KAAKjd,GAEvBxH,EAAegI,GAAG4zK,eAIlBp0K,EAAKohB,SAAA,EACL9gB,EAAeE,GAGnB,IAAMoK,EAAYqR,EAAczb,GAC5BoK,IAGAA,EAAUonB,KAAO55B,EAAAs0B,EAAA0rJ,aACbx4K,IAAqBpH,EAAegI,GAAG6qK,QAAU7yK,EAAegI,GAAGuyJ,YACnEnoJ,EAAU2tK,cAAgB,OAE1B3tK,EAAU2tK,cAAgB,WAIlC7rJ,EAAYlsB,EAAG,EAAGhI,EAAegI,GAAG2zK,aACpC/hK,EAASye,QAAQtwB,EAAAmsB,EAAAmsJ,iBACpB,CAKD,GAFAt8J,EAAmBnjB,KAAKoZ,KAAMlS,GAE1BA,GAAgB,EAAG,CAUnB8R,EAASkc,GAAG/tB,EAAAmsB,EAAAsmH,0BARW,SAAnB92I,IACA,IAAMoN,EAAQ2S,EAAc3b,GACxBgJ,GAAiC,SAAxBA,EAAMivK,eACfhkK,EAAenb,KAAKoZ,KAAMlJ,GAAA,GAE9B8I,EAASwc,IAAIruB,EAAAmsB,EAAAsmH,yBAA4C92I,EAAkBsW,KAC9E,GAEyEA,MAE1E,IAAK,IAAI+O,EAAM,EAAGA,EAAM/oB,EAAeD,OAAQgpB,IAAO,CAClD,IAAMjP,EAAiB2J,EAAcsF,GACjCjP,IACAA,EAAe0f,KAAQzQ,IAAQjhB,GAAiBpE,EAAuD9D,EAAAs0B,EAAAosJ,YAAzB1gL,EAAAs0B,EAAA0rJ,aAC9E9lK,EAAegmK,WAAc/2J,IAAQjhB,EAAgBlI,EAAAs0B,EAAA0rJ,aAAyBhgL,EAAAs0B,EAAAosJ,YAErF,CACJ,CAED1mK,EAASye,QAAQlxB,EAAA+sB,EAAAw2G,8BAAsC,CACnD3qH,MAAOnP,EACP21B,OAAQvmC,EACRg+H,SAAUnkH,EAAW8B,IAE5B,EA4zBGsiK,mBAjOJ,WACI,OAAOrtK,CACV,EAgOG2vK,mBAAAx8J,EACA85J,iBA/NJ,SAA0Bn6K,GAEtB,IADA,IAAIoN,GAAO,EACFzJ,EAAI,EAAGA,EAAIrH,EAAeD,OAAQsH,IACvC,GAAIrH,EAAeqH,GAAGsU,KAAOjY,EAAS,CAClCoN,EAAMzJ,EACN,KACH,CAGL,OAAOyJ,CACV,EAsNG0vK,oBAbJ,WACI,OAAOxgL,EAAe4Q,EACzB,EAYG6vK,mBAxBJ,SAA4B/8K,EAAKoN,GAC7B,IAAMzJ,EAAQoc,EAAc/f,GACxB2D,GAASA,EAAMmyB,OAAS1oB,IACxBzJ,EAAMmyB,KAAO1oB,GAEbzJ,GAASA,EAAMy4K,aAAehvK,IAC9BzJ,EAAMy4K,WAAahvK,EAE1B,EAiBGqtK,uBAjGJ,SAAgCz6K,EAAUoN,EAAOzJ,GAC7C,IAAMsJ,EAAQ8S,EAAc/f,GACxBiN,GACAyjB,GAAiBzjB,EAAOG,EAAOzJ,EAEtC,EA6FGm3K,oBA3FJ,WAEI,IADA,IAAM96K,EAAK6N,EAAwBA,EAAsBxR,OAAS,EACzD+Q,EAAI,EAAGA,EAAIpN,EAAIoN,IAAK,CACzB,IAAMzJ,EAAQoc,EAAc3S,GACxBzJ,GACA+sB,GAAiBxzB,KAAKoZ,KAAM3S,EAAOwS,EAAWyC,MAAOzC,EAAWyC,MAAQzC,EAAW6B,UAAA,EAE1F,CACDnK,EAAwB,GACxBvR,EAAiB,GACboS,IACAg3B,cAAch3B,GACdA,EAAyB,MAEzBvS,GAAkB+c,IAClB/c,EAAe6gL,UAAU9jK,EAAW87H,cACpC74I,EAAiB,MAErB+Q,GAAmB,EACnBwT,GAAsBxjB,KAAKoZ,KAC9B,EAwEG2mK,oBAjUJ,SAA6Bj9K,GACzB,IAAMoN,EAAekT,IAErB,GAAIlT,GAAgBA,EAAa/Q,OAAS,EAAG,CACzC,IACMsH,EADcyJ,EAAa,GACRwuK,cAErBj4K,GAAQA,EAAKtH,OAAS,GACtBsH,EAAK+F,SAAQ,SAAC0D,GAENA,EAAI+oB,WAAan2B,GAAQoN,EAAIgpB,SAAWp2B,IAASoN,EAAI+uK,UACrD/uK,EAAI+uK,UAAA,EACAlmK,EAASmB,MAAMskH,UAAU33G,KAAKi8G,2BAC9BlmH,EAAiB1M,GAGjBqvD,OAAOygH,YAAYl6K,OAAQ,CAACoK,GAAMtC,EAAqBsC,EAAIsrK,QAExDtrK,EAAI+uK,WAAa/uK,EAAI+oB,UAAYn2B,GAAQoN,EAAIgpB,QAAUp2B,KAC9DoN,EAAI+uK,UAAA,EACAlmK,EAASmB,MAAMskH,UAAU33G,KAAKi8G,2BAC9B97H,EAAgBkJ,GAEhB8O,EAAiB9O,GAG5B,GAER,CACJ,EAqSG+vK,oBAvRJ,WACI,IAAMn9K,EAAesgB,IAErB,GAAItgB,GAAgBA,EAAa3D,OAAS,EAAG,CACzC,IACM+Q,EADcpN,EAAa,GACR47K,cAGrBxuK,GAAQA,EAAK/Q,OAAS,GACtB+Q,EAAK1D,SAAQ,SAAC1J,GACV,GAAIA,EAAIm8K,SAEJ,GADAn8K,EAAIm8K,UAAA,EACAlmK,EAASmB,MAAMskH,UAAU33G,KAAKi8G,2BAC9B97H,EAAgBlE,QACb,GAAI8K,EAEP,IADA,IAAMsC,EAAOtC,EAAoBgX,WACxBne,EAAI,EAAGA,EAAIyJ,EAAK/Q,SAAUsH,EAC3ByJ,EAAKzJ,GAAGsU,KAAOjY,EAAI04K,QACnB5tK,EAAoBwqD,YAAYloD,EAAKzJ,MACnCA,EAKrB,GAER,CACJ,GApsBGA,GAAA,EAASN,EAAAmtB,GAAM9a,GAASyjH,cAAcK,UAAUpsH,GAq8B7CA,CACV,CAEDywD,GAAW87D,sBAAwB,aACnC,IAAAt8D,GAAel5D,EAAAqsB,EAAAyqG,gBAA6Bp9D,IC5/B5C,SAASjC,KACL,IAEI57D,EACAoN,EACAzJ,EACAsJ,EACA3Q,EACAJ,EAPE2R,EAAUyI,KAAK9V,QAmErB,SAAS0M,EAAqBlN,GAC1B,IAAMoN,EAAYpN,EAAKqO,MAAM,KACvB1K,EAAMyJ,EAAU/Q,OAAS,EAQ/B,OANA2D,EAA4C,GAArCwW,SAAUpJ,EAAUzJ,EAAM,GAAI,IAAYmT,WAAY1J,EAAUzJ,IAE1D,IAARA,IACD3D,GAAuC,KAA/BwW,SAAUpJ,EAAU,GAAI,KAG7BpN,CACV,CAED,SAASgO,EAAoBhO,GACzB,IAAMoN,EAAepN,EAAKqO,MAAMpB,GAC1BtJ,EAAMyJ,EAAa,GAAGiB,MAAMnS,GAIlC,OAHAyH,EAAI4iB,QACJnZ,EAAa,GAAKzJ,EAAI,GACtBA,EAAI4iB,QACG,CAAC62J,UAAWhwK,EAAc0sK,OAAQr2K,EAAiBE,GAC7D,CAED,SAASF,EAAiBzD,GACtB,IAAMoN,EAAc,CAAC,EA2BrB,OA1BApN,EAAI0J,SAAQ,SAAU1J,GAClB,GAAIA,EAAQqO,MAAM,KAAKhS,OAAS,EAAG,CAC/B,IAAIsH,EAAM3D,EAAQqO,MAAM,KAAK,GACzBpB,GAAA,EACAtJ,IAA2B,GAApBA,EAAIjB,OAAO,OAClBuK,GAAA,EACAtJ,EAAM6S,SAAS7S,EAAInB,QAAQ,IAAK,IAAK,MAErCxC,EAAQkwB,MAAM,UAAYlwB,EAAQkwB,MAAM,QACxC9iB,EAAYkwD,MAAQ35D,IAEpB3D,EAAQkwB,MAAM,SAAWlwB,EAAQkwB,MAAM,QACvC9iB,EAAYswD,KAAe,SAAR/5D,EAAiBA,EAAM6S,SAAS7S,EAAK,IACpDsJ,IACAG,EAAYwwD,aAAA,KAGhB59D,EAAQkwB,MAAM,aAAelwB,EAAQkwB,MAAM,QAC3C9iB,EAAYlI,SAAWvB,IAEvB3D,EAAQkwB,MAAM,SAAWlwB,EAAQkwB,MAAM,QACvC9iB,EAAY0V,KAAOnf,EAE1B,CACJ,IAEMyJ,CACV,CAKD,SAASjJ,EAAYnE,EAAMoN,GAOvB,IANA,IAIIzJ,EAJArH,EAAI8Q,EAEJlR,EAAU,GACV2R,EAAW,GAGI,KAAZ7N,EAAK1D,IAAaA,EAAI0D,EAAK3D,QAC9BC,IAIJ,IADAqH,EAAYrH,EAAI8Q,GACA,EACZ,IAAK,IAAIF,EAAI,EAAGA,EAAIvJ,EAAWuJ,IAAK,CAEhC,IADAW,EAAW7N,EAAMoN,EAAMF,IACTgjB,MAAMjjB,GAMf,CAED/Q,EAAU,GACV,KACH,CATGA,GAAW2R,EACPX,IAAMvJ,EAAY,IAClBzH,GAAW,KAQtB,MAED2R,EAAW7N,EAAKoN,IACF8iB,MAAMjjB,KAChB/Q,EAAU2R,GAElB,OAAO3R,CACV,CAQD,OANA8D,EAAW,CACPixB,MA9IJ,SAAejxB,GACX,IACI9D,EACA2R,EAFEpK,EAAe,GAIrB,IAAKzD,EACD,OAAOyD,EAIXvH,GADA8D,EAAOA,EAAKqO,MAAO1K,IACRtH,OACXwR,GAAiB,EAEjB,IAAK,IAAIxK,EAAI,EAAIA,EAAInH,EAAKmH,IAAK,CAC3B,IAAIgB,EAAOrE,EAAKqD,GAEhB,GAAIgB,EAAKhI,OAAS,GApCf,WAoCoBgI,GACfA,EAAK6rB,MAAMjjB,GAAa,CACxB,IAAM7I,EAAa4J,EAAoB3J,GACjCC,EAAYF,EAAWg5K,UACvBt5K,EAASM,EAAW01K,OACpBp2K,EAAOS,EAAYnE,EAAMqD,EAAI,GAC7ByH,EAAYoC,EAAqB5I,EAAU,GAAG9B,QAAQlG,EAAiB,KACvEoS,EAAUxB,EAAqB5I,EAAU,GAAG9B,QAAQlG,EAAiB,MAErEg5B,MAAMxqB,KAAewqB,MAAM5mB,IAAa5D,GAAa+C,GAAiBa,EAAU5D,EACrE,KAATpH,GACAmK,EAAgB/C,EAEhBrH,EAAasd,KAAK,CACdnI,MAAO9N,EACPgO,IAAKpK,EACLtI,KAAM1C,EACNo2K,OAAQh2K,KAIZsJ,EAAO5B,MAAM,gDAIjB4B,EAAO5B,MAAM,2CAEpB,CAER,CAED,OAAO/H,CACV,EA+FGu2K,iBAAAv2K,GAtJA2J,GAAA,EAAS/J,EAAAmtB,GAAM3iB,GAASsrH,cAAcK,UAAUx5H,GAChD2D,EAAe,mBACfsJ,EAAa,MACb3Q,EAAkB,mBAClBJ,EAA8B,QAsJ3B8D,CACV,CACD47D,GAAU+9D,sBAAwB,YAClC,IAAAn7D,GAAer6D,EAAAqsB,EAAAopG,oBAAiCh+D,IC3KhD,SAASiH,KAEL,IAAI7iE,EACAoN,EAyCJ,OALApN,EAAW,CACPixB,MApBJ,SAAejxB,GACX,IAAI2D,EAAO,GAeX,OAdAyJ,EAAM8wD,MAAQ,SAAUl+D,GACpBA,EAAI4Y,MAAQ5Y,EAAIm2B,UAChBn2B,EAAI8Y,IAAM9Y,EAAIo2B,QACdp2B,EAAIoG,KAAOpG,EAAI+jB,KACf/jB,EAAI85K,OAAS,CACTx8G,MAAOt9D,EAAIs9D,MACXI,KAAM19D,EAAI09D,KACVx4D,SAAUlF,EAAIkF,SACd4d,KAAM9iB,EAAI8iB,MAEdnf,EAAKod,KAAK/gB,EACb,EACDoN,EAAM6jB,MAAMjxB,GAEL2D,CACV,GAhCD,WACI,IACQX,QAAUA,OAAOy5D,QAAUz5D,OAAOy5D,OAAO4gH,SACzCjwK,EAAQ,IAAIpK,OAAOy5D,OAAO4gH,OACtBr6K,OACAA,OAAOs6K,MACPt6K,OAAOy5D,OAAO8gH,iBAMzB,CAFD,MAAMv9K,GAEL,CACJ,CAbD,GAuCOA,CACV,CAED6iE,GAAyB82D,sBAAwB,2BACjD,IAAAl7D,GAAet6D,EAAAqsB,EAAAopG,oBAAiC/2D,IC1ChD,SAASK,KAEL,IAMIljE,EACAoN,EAPEzJ,EAAU2S,KAAK9V,QACfyM,GAAA,EAAWe,EAAAwiB,GAAS7sB,GAASw1H,cAQ/B78H,EAAa,EA8HjB,OALA0D,EAAW,CACPixB,MApGJ,SAAejxB,EAAM2D,EAAYzH,EAAkB2R,EAAgBX,GAC/D,IAEIc,EACA7J,EACAd,EAJAe,EAAW,GACTE,EAAe,GAKfR,EAAU,CAAC,EAEXJ,EAAiB,CAAC,EACpBoH,EAAiB,GACjB4D,EAAyB,GACzB2W,EAAkB,CAElBm4J,UAAW,SAAUx9K,EAAI2D,EAAMrH,GAU3B,GARIA,EAAM,gBAAkBA,EAAM,gBAC9B2Q,EAAS0nB,QAAQtwB,EAAAmsB,EAAAwuI,sBAAyC,CACtDzkJ,MAAO6X,GAA8BkrI,OAAOprJ,MAC5CwkC,MAAOtkB,GAA8BorI,OAAOE,sCAEhDphK,EAAM,cAAgBA,EAAM,eAGnB,UAATqH,IACQ,yDAAP3D,GACU,yDAAPA,GAAgE,CACpE,IAAK1D,EAAM,eAA+C,QAA9BA,EAAM,cAAcwL,MAE5C,YADAsF,EAAOX,KAAK,wCAGhB3B,EAAiBxO,EAAM,2CAA2CwL,KACrE,CACJ,EAED21K,WAAY,WACJ3yK,IACApH,EAAeoH,GAAkB4D,EAAuBrB,QAE5DqB,EAAyB,GACzB5D,EAAiB,EACpB,EAED4yK,OAAQ,SAAU19K,GACV8K,IACA4D,GAAkD1O,EAEzD,GAGL,IAAKA,EAED,MADAoE,EAAW,wBACL,IAAIoJ,MAAMpJ,GAGpBN,EAAQsC,KAAOpG,EAEfiN,EAAS0nB,QAAQlxB,EAAA+sB,EAAAmtJ,cAAsB75K,GAEvC,IAAIsS,GAAA,EAAW0nD,GAAA8/G,SAAQ95K,EAAQsC,MAAM,SAAUpG,GAC3CoE,EAAWpE,CACd,GAAEqlB,GAEHpY,EAAS0nB,QAAQlxB,EAAA+sB,EAAAqtJ,YAAoB,CAAEC,WAAYh6K,EAAQsC,KAAM23K,QAAS3nK,IAE1E,IAhFMtH,EAgFAE,EAAkBoH,EAAS4nK,qBAEjC,IAAK36K,EAAI,EAAGA,EAAI2L,EAAgB3S,OAAQgH,IAAK,CACzC,IAAIlH,GAAA,EAAM2hE,GAAAmgH,aAAY7nK,EAAUpH,EAAgB3L,IAAI,SAAUrD,GAC1DoE,EAAWpE,CACd,IAEG7D,EAAIw/K,SAAS/uJ,MAAK,SAAA5sB,GAAgB,OAAIA,EAAiB27K,SAASt/K,MAA9B,MAElC2R,EAAYgB,EAAgB3L,GAAKM,IACjCQ,EAAU6K,EAAgB3L,EAAI,GAAKM,IAG/BW,EAAayc,KAAK,CACdnI,MAAO5K,EACP8K,IAAK3U,EACLlG,KAAM,OACNy6K,OAjGV5pK,EAAK,YAAcxS,EACzBA,IACOwS,GAgGSusK,IAAKl/K,EACLk3H,OAAQnmH,EACRouK,eAAgB53K,GAI/B,CAED,GAAiB,KAAbU,EAEA,MADAgJ,EAAO5B,MAAMpH,GACP,IAAIoJ,MAAMpJ,GAGpB,OAAOE,CACV,GApHG8I,GAAA,EAAS/J,EAAAmtB,GAAM7sB,GAASw1H,cAAcK,UAAUx5H,GA2H7CA,CACV,CAEDkjE,GAAWy2D,sBAAwB,aACnC,IAAAv6D,GAAej7D,EAAAqsB,EAAAopG,oBAAiC12D,IAAA,SAAArE,GAAA7+D,EAAAoN,GAAA,IAAAzJ,EAAA7G,OAAAP,KAAAyD,GAAA,GAAAlD,OAAAqC,sBAAA,KAAA8N,EAAAnQ,OAAAqC,sBAAAa,GAAAoN,IAAAH,EAAAA,EAAAoK,QAAA,SAAAjK,GAAA,OAAAtQ,OAAAsC,yBAAAY,EAAAoN,GAAAgvD,UAAA,KAAAz4D,EAAAod,KAAAW,MAAA/d,EAAAsJ,EAAA,QAAAtJ,CAAA,UAAA07D,GAAAr/D,GAAA,QAAAoN,EAAA,EAAAA,EAAA9O,UAAAjC,OAAA+Q,IAAA,KAAAzJ,EAAA,MAAArF,UAAA8O,GAAA9O,UAAA8O,GAAA,GAAAA,EAAA,EAAAyxD,GAAA/hE,OAAA6G,IAAA,GAAA+F,SAAA,SAAA0D,GAAAuxD,GAAA3+D,EAAAoN,EAAAzJ,EAAAyJ,GAAA,IAAAtQ,OAAAmvJ,0BAAAnvJ,OAAAu/E,iBAAAr8E,EAAAlD,OAAAmvJ,0BAAAtoJ,IAAAk7D,GAAA/hE,OAAA6G,IAAA+F,SAAA,SAAA0D,GAAAtQ,OAAAmC,eAAAe,EAAAoN,EAAAtQ,OAAAsC,yBAAAuE,EAAAyJ,GAAA,WAAApN,CAAA,UAAA2+D,GAAA3+D,EAAAoN,EAAAzJ,GAAA,OAAAyJ,KAAApN,EAAAlD,OAAAmC,eAAAe,EAAAoN,EAAA,CAAAtF,MAAAnE,EAAAy4D,YAAA,EAAA0hB,cAAA,EAAAs9C,UAAA,IAAAp7H,EAAAoN,GAAAzJ,EAAA3D,CAAA,UAAA4+D,GAAA5+D,EAAAoN,IAAA,MAAAA,GAAAA,EAAApN,EAAA3D,UAAA+Q,EAAApN,EAAA3D,QAAA,QAAAsH,EAAA,EAAAsJ,EAAA,IAAAzQ,MAAA4Q,GAAAzJ,EAAAyJ,EAAAzJ,IAAAsJ,EAAAtJ,GAAA3D,EAAA2D,GAAA,OAAAsJ,CAAA,CC9IhD,SAASyxD,GAAS1+D,GAEd,IAYIoN,EACAzJ,EACAsJ,EAdA3Q,EAAUga,KAAK9V,QACbqN,GAAA,EAAWG,EAAAwiB,GAASl0B,GAAS68H,cAC7BjsH,GAAA,EAAWqT,EAAAiQ,GAASl0B,GAAS68H,cAC7B11H,EAAUzD,EAAOmzG,QACjBhvG,EAAoBnE,EAAO8nI,kBAuBjC,SAAS1jI,EAAkBpE,EAAOoN,GAC9B,IAAIzJ,EAEArH,EADAuR,GAAA,EAIJ,GAAI1J,EAAkB6B,UAAW,CAC7B,IAAMgI,EAAOvK,EAAQmiJ,qBAAqB5lJ,GACtCgO,GAAQA,EAAK3R,OAAS,IACtBsH,EAAYQ,EAAkB6B,QAAQgI,EAAK,GAAGP,MAAMrL,IAE3D,CAED,IAAMiB,EAAgBrD,EAAMqzK,2BAA2Bh8J,QAAO,SAAArX,GAAG,OAC5DA,EAAI+6C,aAAe/6C,EAAI+6C,cAAgB7+C,EAAAs0B,EAAA0tJ,wBADqB,IAG3D75K,EAAmBrE,EAAMozK,8BAA8B/7J,QAAO,SAAArX,GAAG,OAClEA,EAAI+6C,aAAe/6C,EAAI+6C,cAAgB7+C,EAAAs0B,EAAA0tJ,wBAD2B,IAKnE76K,EAAchH,OAAS,GACvBwR,GAAA,EACAvR,EAAe+G,GAEf/G,EAAe+H,EAGnB/H,EAAaoN,SAAQ,SAAApN,GACjB,GAsCR,SAAwC0D,GACpC,UAAWA,EAAM8H,OAAyB,MAAhB9H,EAAM8H,OAC3B9H,EAAM6rJ,QAAU7rJ,EAAM6rJ,OAAOxvJ,OAAS,GACtC2D,EAAM+rJ,eAAiB/rJ,EAAM+rJ,cAAc1vJ,OAAS,GACpD2D,EAAM8rJ,cAAgB9rJ,EAAM8rJ,cAAgB5vJ,EAAAs0B,EAAA2tJ,cAA0Bn+K,EAAM8rJ,cAAgB5vJ,EAAAs0B,EAAA4tJ,cACpG,CALD,CAtC2C9hL,GAAQ,CACvC,IAAI0R,GAmDSvK,EAnDqBnH,EAAMuvJ,OAmDlB1nJ,EAnD0BR,EAoDpDuJ,EAASmxK,eAAe56K,GACjBA,EACAyJ,EAAS66H,WAAWtkI,GACvBU,EACO+I,EAASlH,QAAQvC,EAASU,GAE1B+I,EAASlH,QAAQvC,GAGrBA,GA5DHwJ,EAAY8T,KAAK,CACbu9J,WAAYhiL,EAAMyvJ,cAClB3pJ,IAAK4L,EACLgnD,SAAU14D,EAAMwvJ,YAChBjgG,QAAS7rD,EAAMiY,GACfqiH,SAAAltH,EACAmxK,YAAA1wK,EACAjG,OAxDF,WAyDE42K,SAAU,IAAIC,SACVniL,EAAMyvJ,cADA,OAAAnsJ,OAECoO,EAFD,KAGN,CAAE28F,QAAS,UAGtB,CAoCT,IAAyBlnG,EAASU,CAnC7B,GACJ,CAuDD,SAASG,EAAkBtE,EAAOoN,GAC9B,IAAMzJ,EAAOsJ,EAAYjN,GACzBiN,EAAYjN,GAAZq/D,GAAAA,GAAA,GAA0B17D,GAA1B,IAAgCiE,OAAQwF,GAC3C,CA4DD,SAAStJ,IACLmJ,EAAc,EACjB,CAgBD,OARAG,EAAW,CACPsxK,mBAhEJ,SAA4B1+K,EAAQoN,GAChC,GAAIpN,GAAUxD,MAAMC,QAAQuD,IAAWoN,EACnC,IAAK,IAAIzJ,EAAI,EAAGA,EAAI3D,EAAO3D,OAAQsH,IAE/BS,EADYpE,EAAO2D,GACMyJ,EAGpC,EA0DGuxK,cApDJ,WACI,IADqB,IAAA3+K,EAAA,SACZA,GACL,IAAIoN,EAAOH,EAAYjN,GAEvBiC,SAAS28K,MAAMjiG,IAAIvvE,EAAKoxK,UACxB3wK,EAAS8mB,QAAQtwB,EAAAmsB,EAAAquJ,wBAA2CzxK,GAE5DA,EAAKoxK,SAASxrJ,OAAOgQ,MACjB,WACI1+B,EAAkBtE,EAzJtB,UA0JI6N,EAAS8mB,QAAQtwB,EAAAmsB,EAAAsuJ,2BAA8C1xK,EAClE,IACD,SAACH,GACG3I,EAAkBtE,EA9JvB,SA+JK2D,EAAOiS,MAAM,wBAAyB3I,GACtCY,EAAS8mB,QAAQtwB,EAAAmsB,EAAAuuJ,yBAA4C3xK,EAChE,GAhBY,EACZA,EAAI,EAAGA,EAAIH,EAAY5Q,OAAQ+Q,IAAKpN,EAApCoN,EAkBZ,EAkCG4xK,SA5BJ,WACI,OAAO/xK,CACV,EA2BGgyK,mBApBJ,SAA4Bj/K,GACxB,OAAOiN,EAAYoK,QAAO,SAAAjK,GAAI,OACzBA,EAAKy+C,SAAWz+C,EAAKy+C,UAAY7rD,CADR,GAGjC,EAiBGgvC,MAVJ,YArHA,WAAkC,IAAAhvC,EAAAoN,EAAA,SAAApN,EAAAoN,GAAA,IAAAzJ,EAAA,uBAAAJ,QAAA,MAAAvD,EAAAuD,OAAA85E,UAAA,IAAA7gF,MAAAC,QAAAuD,KAAA2D,EAAA,SAAA3D,EAAAoN,GAAA,GAAApN,EAAA,qBAAAA,EAAA,OAAA4+D,GAAA5+D,EAAAoN,GAAA,IAAAzJ,EAAA7G,OAAAC,UAAAC,SAAAE,KAAA8C,GAAA0W,MAAA,uBAAA/S,GAAA3D,EAAA5D,cAAAuH,EAAA3D,EAAA5D,YAAA+B,MAAA,QAAAwF,GAAA,QAAAA,EAAAnH,MAAAojB,KAAA5f,GAAA,cAAA2D,GAAA,2CAAA9B,KAAA8B,GAAAi7D,GAAA5+D,EAAAoN,QAAA,IAAApN,KAAAoN,GAAApN,GAAA,iBAAAA,EAAA3D,OAAA,CAAAsH,IAAA3D,EAAA2D,GAAA,IAAAsJ,EAAA,EAAA3Q,EAAA,oBAAA4Q,EAAA5Q,EAAAqH,EAAA,kBAAAsJ,GAAAjN,EAAA3D,OAAA,CAAAmK,MAAA,IAAAA,MAAA,EAAAsB,MAAA9H,EAAAiN,KAAA,EAAAjN,EAAA,SAAAA,GAAA,MAAAA,CAAA,EAAAqD,EAAA/G,EAAA,WAAAqsD,UAAA,6IAAAzsD,EAAA2R,GAAA,EAAAX,GAAA,SAAAA,EAAA,WAAAvJ,EAAA3D,EAAAuD,OAAA85E,WAAA,EAAA15E,EAAA,eAAA3D,EAAA2D,EAAA05F,OAAA,OAAAxvF,EAAA7N,EAAAwG,KAAAxG,CAAA,EAAAA,EAAA,SAAAA,GAAAkN,GAAA,EAAAhR,EAAA8D,CAAA,EAAAqD,EAAA,eAAAwK,GAAA,MAAAlK,EAAAwiF,QAAAxiF,EAAAwiF,QAAA,YAAAj5E,EAAA,MAAAhR,CAAA,KACX+Q,GADW,IAC9B,IAAAG,EAAAF,MAAAlN,EAAAoN,EAAAzJ,KAAA6C,MAAgC,KAArBlK,EAAqB0D,EAAA8H,MACxB5L,EAAU+F,SAAS28K,MAATp0F,OAAsBluF,EAAKkiL,UACzC76K,EAAOiS,MAAP,0BAAAhW,OAAuCtD,EAAKgiL,WAA5C,SAAA1+K,OAA8D1D,EAAU,aAAe,gBAC1F,CAJ6B,OAAA8D,GAAAoN,EAAApN,EAAAA,EAAA,SAAAoN,EAAA/J,GAAA,CAKjC,CALD,GAuHIS,GACH,GAvLGH,GAAA,EAASN,EAAAmtB,GAAMl0B,GAAS68H,cAAcK,UAAUpsH,GAChDtJ,IAgMGsJ,CACV,CAEDsxD,GAASi7D,sBAAwB,WACjC,IAAAj6D,GAAev7D,EAAAqsB,EAAAyqG,gBAA6Bv8D,ICjN5C,SAASM,GAAeh/D,GAEpB,IAUIoN,EACAzJ,EACAsJ,EACA3Q,EACAuR,EACAX,EACA/I,EACAC,EACAE,EACAR,EACAJ,EACAoH,EACA4D,EACA2W,EAvBAjP,EAAUE,KAAK9V,QAEbsO,EAAU9O,EAAOmzG,QACjBnkG,EAAahP,EAAOq+I,WACpBliJ,EAAgB6D,EAAO8kJ,cACvB/xI,EAAkB/S,EAAO+kJ,gBACzBhvI,EAAoB/V,EAAO8nI,kBAC3BpyH,EAAa1V,EAAOy3I,WACpBvhI,EAAWlW,EAAOo5G,SAqIxB,SAASlgG,EAAuBlZ,GAE5B,GADAqlB,EAAO7Z,MAAP,sBAAA5L,OAAmCI,EAAKu+K,YAAc,eAAiB,IAAvE,wBAAA3+K,OAAiGI,EAAKs+K,WAAtG,WAAA1+K,OAA0HI,EAAKoC,MAC3HpC,EAAKu+K,YAAa,CAClB,IAAInxK,EAAM9Q,EAAW0D,EAAKs6H,UAAU6/C,iBAAiBn6K,EAAK6rD,SAC1DvvD,EAAW0D,EAAKs6H,UAAUyiD,mBAAmB3vK,EAAKlR,EAAAs0B,EAAAsrJ,cACrD,CACJ,CAMD,SAAS3lK,EAAuBnW,GAE5B,GADAqlB,EAAOzP,MAAP,2BAAAhW,OAAwCI,EAAKu+K,YAAc,eAAiB,IAA5E,wBAAA3+K,OAAsGI,EAAKs+K,WAA3G,WAAA1+K,OAA+HI,EAAKoC,MAChIpC,EAAKu+K,YAAa,CAClB,IAAInxK,EAAM9Q,EAAW0D,EAAKs6H,UAAU6/C,iBAAiBn6K,EAAK6rD,SACtDz+C,IAAQ9Q,EAAW0D,EAAKs6H,UAAUigD,qBAClCj+K,EAAW0D,EAAKs6H,UAAUyiD,mBAAmB3vK,EAAKlR,EAAAs0B,EAAA0rJ,cAElD5/K,EAAW0D,EAAKs6H,UAAUyiD,mBAAmB3vK,EAAKlR,EAAAs0B,EAAAosJ,YAEzD,CACJ,CAED,SAAS3mK,EAAmBjW,GACxB,IAAIoN,EAASpN,EAAE6iC,OACX51B,EAAQjN,EAAEqc,MACRxO,EAAW7N,EAAEs6H,SAInB,IAAI,IAFuBpkH,EAASkB,MAAMskH,UAAU33G,KAAKg8G,iBAEnBzoH,KAAoBxM,EAEtD2H,EAAa5E,GAAW,OACrB,CACH,IAAMX,EAAe6F,EAAgBmkJ,mBAAmBh7J,EAAAs0B,EAAAmmG,KAAgB9oH,GACxE,GAAIX,EAAc,CACd,IAAMc,EAAkB,CACpBwhB,KAAMtiB,EAAasiB,KACnBsyI,KAAM50J,EAAa20J,MAAM,GACzBxlJ,MAAOnP,EAAamP,MACpBkJ,MAAOrY,EAAaqY,MACpBw8I,cAAe70J,EAAa60J,cAAc,IAE9C30J,EAAOwf,MAAK,SAAC5sB,EAAMoN,GAEf,GAAI2F,EAAgB2wJ,cAAc11J,EAAiBhO,GAG/C,OAFAyS,EAAa5E,EAAUT,GACvBH,EAAQG,GAAA,CAGf,GACJ,CACD9I,GAAA,CACH,CAEDX,EAAWkK,GAAUqxK,iBAAmBjyK,EAExC7I,EAASuwB,QAAQtwB,EAAAmsB,EAAA2uJ,kBAAqC,CAClDl/G,QAAS3oD,IACT+E,MAAOpP,EACP41B,OAAQz1B,EACRktH,SAAAzsH,IAGJnK,GAAA,EAEAgL,EAASgwK,mBAAmBtxK,EAAQS,GAGpCa,EAASswK,WAAWt1K,SAAQ,SAAA1J,GACxB,GAAIA,EAAKu+K,YAAa,CAClB,IAAInxK,EAAM9Q,EAAW0D,EAAKs6H,UAAU6/C,iBAAiBn6K,EAAK6rD,SAC1DvvD,EAAW0D,EAAKs6H,UAAUyiD,mBAAmB3vK,EAAKlR,EAAAs0B,EAAAsrJ,cACrD,CACJ,IAEDptK,EAASiwK,eACZ,CAED,SAAS1lK,EAAuBjZ,GAC5B,IACI,IAAMoN,EAAWpN,EAAEs6H,SAEnB,IAAKh+H,EAAW8Q,IAAakoB,MAAMt1B,EAAEypC,MACjC,OAEJntC,EAAW8Q,GAAU6vK,oBAAoBj9K,EAAEypC,KAE9C,CADC,MAAOzpC,GACR,CACJ,CAED,SAASqY,EAAmBrY,GACxB,IACI,IAAMoN,EAAWpN,EAAEs6H,SAEnB,IAAKh+H,EAAW8Q,GACZ,OAEJ9Q,EAAW8Q,GAAU+vK,qBAGxB,CAFC,MAAOn9K,GAER,CACJ,CAyBD,SAASsX,IACL,IAAItX,GAAA,EAIJ,OAHIsE,IAAyBR,IACzB9D,GAAA,GAEGA,CACV,CASD,SAASyS,EAAazS,EAAUoN,IAG5B9I,GAAgC,IAAT8I,IAEK2F,GACxBA,EAAgBkxJ,2BAGpB,IAAItgK,EAAc4T,EAAmBvX,GAGrC,GAAI2D,IAAgByJ,GAAQ9Q,EAAW0D,GAAvC,CAIA1D,EAAW0D,GAAUm9K,sBAErB,IAAItvK,EAAmBvR,EAAW0D,GAAU88K,sBACxC5vK,EAA0BW,EAAoB6H,EAAW+5J,aAAa5hK,EAAiB4oB,KAAM5oB,EAAiBoK,GAAIpK,EAAiB2hB,KAAM3hB,EAAiBshK,OAAQthK,EAAiBgpJ,YAAc,KAGjM3pJ,GAA2BA,EAAuB4oB,OAAS55B,EAAAs0B,EAAAsrJ,eAC3Dx/K,EAAW0D,GAAU+8K,mBAAmBp5K,EAAazH,EAAAs0B,EAAAosJ,aAGzDtgL,EAAW0D,GAAU68K,mBAAmBzvK,GAExCS,EAAmBvR,EAAW0D,GAAU88K,sBAExC,IAAM9uK,EAA6BkI,EAASkB,MAAMskH,UAAU33G,KAAKi8G,2BAE7DnyH,IAAqBG,GAA+BH,EAAiBioB,OAAS55B,EAAAs0B,EAAAsrJ,eAC9Ex/K,EAAW0D,GAAU+8K,mBAAmB3vK,EAAKlR,EAAAs0B,EAAA0rJ,cAG7CruK,GAAoBA,EAAiBkwI,eAAiBlwI,EAAiBgpJ,WAS/E,SAAiC72J,EAAUoN,EAAkBzJ,GAEzD,GAAKsJ,EAAkBjN,GAOvB,IAHA,IACI6N,EADSZ,EAAkBjN,GAAU+6K,YACXC,iBAErB9tK,EAAI,EAAGA,EAAIW,EAAiBxR,OAAQ6Q,IAAK,CAC9C,IAAIc,EAAYH,EAAiBX,GACjC,GAAIE,EAAiBoiB,OAASxhB,EAAUwhB,OACnCxhB,EAAUiK,GAAK7K,EAAiB6K,KAAOjK,EAAUiK,GAAK7K,EAAiBiP,QAAUrO,EAAUqO,OAAQ,CACpG,IAAIlY,EAAmB4O,EAAgBmkJ,mBAAmBh7J,EAAAs0B,EAAAmmG,KAAgB32H,IACtEgO,EAAUiK,GAAK9T,EAAiB8T,KAAOjK,EAAUiK,GAAK9T,EAAiBkY,QAAUrO,EAAUqO,QAC3F/f,EAAW0D,GAAUy6K,uBAAuB92K,GAC5CsJ,EAAkBjN,GAAUi7K,6BAA6B/tK,KACjC,IAAjBvJ,GAIPS,EAASuwB,QAAQlxB,EAAA+sB,EAAAk2G,mCAA2C,CAAC,EAAG,CAC5DpM,SAAAt6H,EACAu6H,UAAWr+H,EAAAs0B,EAAAmmG,MAGtB,CACJ,CACJ,CA5BD,CARgC32H,EAAU6N,EAAkBlK,GAC7CkK,IAAqBA,EAAiBkwI,cAqCrD,SAAoC/9I,EAAUoN,GAC1ChJ,EAASuwB,QAAQlxB,EAAA+sB,EAAAm2G,wBAAgC,CAC7C+e,iBAAAt4I,GACD,CACCktH,SAAAt6H,EACAu6H,UAAWr+H,EAAAs0B,EAAAmmG,MAElB,CAPD,CApCmC32H,EAAU6N,GAGzCkF,EAAgBmwJ,SAASr1J,EA5BxB,CA6BJ,CAyCD,SAAS0J,EAAmBvX,GACxB,OAAO1D,EAAW0D,GAAUu6K,oBAC/B,CAiBD,SAAS1vK,IACLoC,EAAoB,CAAC,EACrB3Q,EAAa,CAAC,EACdqH,EAAa,CAAC,EACdW,GAAA,EACAZ,GAAA,EACAoH,GAAA,CACH,CAoCD,OAjBAsC,EAAW,CACPkqJ,iBA1CJ,SAA0Bt3J,GACtB,GAAKA,EAAL,CAGA,IAAMoN,EAAWpN,EAAWiY,GAExBhL,EAAkBG,IAClBH,EAAkBG,GAAUutK,kBAG5Br+K,EAAW8Q,IACX9Q,EAAW8Q,GAAU0tK,qBARxB,CAUJ,EA8BGzwC,WAxXJ,WACI37H,EAAWgxD,GAAStpD,GAASxV,OAAO,CAChCuyG,QAAArkG,EACAg5H,kBAAA/xH,IAEJ3R,EAASguB,GAAG3uB,EAAA+sB,EAAAw2G,8BAAsC/wH,EAAoB7I,GACtEhJ,EAASguB,GAAG3uB,EAAA+sB,EAAAuuJ,yBAAiC7lK,EAAwB9L,GACrEhJ,EAASguB,GAAG3uB,EAAA+sB,EAAAsuJ,2BAAmC3oK,EAAwB/I,GACnE8I,EAASkB,MAAMskH,UAAU33G,KAAKs8G,OAAOC,yBACrCl8H,EAASguB,GAAG3uB,EAAA+sB,EAAAkmH,sBAA8Bz9H,EAAwB7L,GAClEhJ,EAASguB,GAAG3uB,EAAA+sB,EAAA+lH,iBAAyBl+H,EAAoBjL,GAEhE,EA6WGqrJ,oBA3WJ,SAA6Bz4J,GACzB,IAAMoN,EAAWpN,EAAWiY,GACtB/b,EAASmhE,GAAWjnD,GAASxV,OAAO,CACtC62I,WAAA/hI,EACA0jG,SAAAljG,EACAyxH,WAAA3nI,IAEJ9D,EAAOmuI,aACP/tI,EAAW8Q,GAAYlR,EAEvB,IAAM8R,EAAmBswD,GAAiBloD,GAASxV,OAAO,CACtDy9I,WAAArvI,EACAmkG,QAAArkG,EACAswK,SAAA1wK,EACAo2I,cAAA3oJ,EACA4oJ,gBAAAhyI,EACA0kI,WAAA/hI,EACAyiB,WAAYj8B,EACZ48K,UAAAjrK,EACAkrK,yBAAA7rK,EACA8rK,WAAA70K,EACAwjI,WAAA3nI,EACAo5G,SAAAljG,IAEJlI,EAAiBq8H,aACjBp9H,EAAkBG,GAAYY,EAE9BrK,EAAWyJ,GAAY,CAAC,EACxBzJ,EAAWyJ,GAAU8xK,kBAAoB,CAC5C,EA+UGvoB,aAzUJ,SAAsB32J,GAClB,IAAMoN,EAAWpN,EAAWiY,GAEvB3b,EAAW8Q,IAGhB9Q,EAAW8Q,GAAUupJ,cACxB,EAmUG3Z,oBAjTJ,SAA6Bh9I,GACzB,IAAMoN,EAAWpN,EAAWiY,GAE5B,GAAIhL,GAAqBA,EAAkBG,GACvC,OAAOH,EAAkBG,EAEhC,EA4SGiyK,wBA1SJ,WACI,OAAO/6K,CACV,EAySGwyJ,iBAvSJ,SAA0B92J,EAAYoN,GAClC,IAAMzJ,EAAW3D,EAAWiY,GAEvBhL,EAAkBtJ,IAIvBsJ,EAAkBtJ,GAAUmzJ,iBAAiB1pJ,EAChD,EAgSGkyK,WA/KJ,SAAoBt/K,EAAUoN,GAoB1B,OAAO,EAnBPkT,EAAAqkJ,IAAmBv3J,EAAQ,WACvBkK,MAAoBlK,IAEhBA,GAEAqF,EAAazS,EAAU2D,EAAW3D,GAAUk/K,kBAG3C9xK,IAEDzJ,EAAW3D,GAAUk/K,iBAAmB3nK,EAAmBvX,GACtD0D,EAGD+O,EAAazS,GAAW,GAFxB8K,GAAA,KAAmC,CAQlD,EA2JGk0I,cAAA1nI,EACAomI,aAAAjrI,EACA8nK,mBAAAhjK,EACAgoK,0BAnJJ,SAAmCv/K,GAG/B,OAAO,EAFPsgB,EAAAqkJ,IAAmB3kK,EAAQ,WAC3B8D,EAAqB9D,GAAA,CAExB,EAgJGi3J,sBAlUJ,SAA+Bj3J,EAAYoN,EAAMzJ,GAA8B,IAAtBrH,EAAsBgC,UAAAjC,OAAA,YAAAiC,UAAA,GAAAA,UAAA,GAAN,KAC/DpC,EAAW8D,EAAWiY,GAEvBhL,EAAkB/Q,IAGvB+Q,EAAkB/Q,GAAUw+K,cAActtK,EAAMzJ,EAAQrH,EAC3D,EA4TG0yC,MA/BJ,WACItgC,EAASsgC,QACTnkC,IACAzG,EAASsuB,IAAIjvB,EAAA+sB,EAAAw2G,8BAAsC/wH,EAAoB7I,GACvEhJ,EAASsuB,IAAIjvB,EAAA+sB,EAAAuuJ,yBAAiC7lK,EAAwB9L,GACtEhJ,EAASsuB,IAAIjvB,EAAA+sB,EAAAsuJ,2BAAmC3oK,EAAwB/I,GACpE8I,EAASkB,MAAMskH,UAAU33G,KAAKs8G,OAAOC,yBACrCl8H,EAASsuB,IAAIjvB,EAAA+sB,EAAAkmH,sBAA8Bz9H,EAAwB7L,GACnEhJ,EAASsuB,IAAIjvB,EAAA+sB,EAAA+lH,iBAAyBl+H,EAAoBjL,IAG9DtQ,OAAOP,KAAK0Q,GAAmBvD,SAAQ,SAAC1J,GACpCiN,EAAkBjN,GAAK66K,gBACvB5tK,EAAkBjN,GAAKgvC,OAC1B,GACJ,GAjYGlrC,GAAA,EACAJ,GAAA,EACAoH,GAAA,EAEA+C,EAAY2wD,GAAUpoD,GAAS+iH,cAC/BjsH,EAA2BuxD,GAAyBroD,GAAS+iH,cAC7Dh1H,EAAai7D,GAAWhpD,GAAS+iH,cACjC/0H,GAAA,EAAW4J,EAAAwiB,GAASpa,GAAS+iH,cAC7B9zG,GAAA,EAAShiB,EAAAmtB,GAAMpa,GAAS+iH,cAAcK,UAAUpsH,GAEhDvC,IA0YGuC,CACV,CAED4xD,GAAe26D,sBAAwB,iBACvC,IAAAr6D,GAAen7D,EAAAqsB,EAAAyqG,gBAA6Bj8D,IClY5C,SAASS,KAKL,IA2BIz/D,EACAoN,EACAzJ,EACAsJ,EACA7I,EACAN,EACAJ,EACAoH,EACA4D,EACA2W,EACAjP,EACAtH,EACA3S,EACA4W,EACAgD,EACAL,EACAO,EACAgD,EACAZ,EACAf,EACA7E,EACA8E,EACA1M,EACAvH,EACA6V,EACAqX,EACApX,EACAU,EACA5V,EACAujB,EACAzH,EACAvD,EACAkD,EACAzD,EACA6D,EACAS,EACAC,EACAgQ,GACAC,GAjEE/P,GAAkC,+EAKlCgQ,GAAiC,8FAKjCjQ,GAA6B,uFAK7BE,GAA4B,oFAK5BK,GAAqC,+BAErCD,GAAU1K,KAAK9V,QACf0hB,IAAA,EAAWlU,EAAAwiB,GAASxP,IAASm4G,cAC/Bh4G,IAAA,EAAWjI,EAAAsX,GAASxP,IAASm4G,cAC3B92G,IAAA,EAAQhf,EAAAmtB,GAAMxP,IAASm4G,YAAY,CAAE/f,SAAUj4F,KAyTrD,SAASmB,KACLoB,GAAa,MACbH,GAAW,MACXtW,EAAiB,KACb8F,IACAA,EAAqBi8B,QACrBj8B,EAAuB,MAEvBgD,IACAA,EAA2Bi5B,QAC3Bj5B,EAA6B,MAE7BuB,GACAA,EAAsB03B,QAG1B7tB,GAAS6tB,QAEL/4B,IACAA,EAAkB+4B,QAClB/4B,EAAoB,KAE3B,CAsBD,SAASmM,KACL,QAAUze,KAAY6c,EAAWw0H,YACpC,CAmCD,SAASzyH,KACL,OAAO,EAAA20B,GAAAl3C,IACV,CAkFD,SAASmiB,KACL,IAAKze,EACD,MAAMitB,GAEV,OAAO7W,EAAmBs7H,UAC7B,CAwED,SAASzyH,KACL,IAAKjf,EACD,MAAMitB,GAEV,OAAO7W,EAAmBo+H,cAC7B,CA+ID,SAASz1H,GAAiBziB,GACtB,IAAMoN,EAAO+L,GAAoBA,EAAiB87H,gBAAkB/4I,EAAAs0B,EAAAi7C,MAAkBvvE,EAAAs0B,EAAA3B,MAClFlrB,EAAS8Y,EAAYg4H,kBAAkBrnI,GAC3C,IAAKzJ,EACD,OAAO,EAGX,IAAIsJ,EAAY6M,EAAmB6+H,uBAE/Br8I,EAAMqH,EAAO6lC,MAAM5wB,MAAQ5Y,EAM/B,OAJI1D,EAAOqH,EAAO6lC,MAAM1wB,IAAM7L,IAC1B3Q,EAAMqH,EAAO6lC,MAAM1wB,IAAM7L,GAGtB3Q,CACV,CA4BD,SAASumB,GAAK7iB,GACV,IAAK0D,EACD,MAAMitB,GAEV,IAAIvjB,EAAI4V,KAAkBgW,YAE1B,QAAI,IAAAh5B,EACAoN,EAAI+L,EAAiBinJ,0BAA0BhzJ,EAAGpN,QAC/C,GAAI8Z,EAAmBo+H,eAAgB,CAC1C,IAAMv0I,EAAOwV,GAAoBA,EAAiB87H,gBAAkB/4I,EAAAs0B,EAAAi7C,MAAkBvvE,EAAAs0B,EAAA3B,MAClF5hB,EAASwP,EAAYg4H,kBAAkB9wI,GAC3CyJ,EAAgB,OAAXH,GAAyB,IAANG,EAAW,EAAIwB,KAAKgN,IAAI,EAAIxO,EAAIH,EAAOu8B,MAAM5wB,MACxE,CAED,OAAOxL,CACV,CAUD,SAASsV,KACL,IAAKhf,EACD,MAAMitB,GAEV,IAAI3wB,EAAIgjB,KAAkBhL,SAE1B,GAAI8B,EAAmBo+H,eAAgB,CACnC,IAAM9qI,EAAO+L,GAAoBA,EAAiB87H,gBAAkB/4I,EAAAs0B,EAAAi7C,MAAkBvvE,EAAAs0B,EAAA3B,MAClFlrB,EAAS8Y,EAAYg4H,kBAAkBrnI,GAC3CpN,EAAI2D,EAAUA,EAAO6lC,MAAM1wB,IAAMnV,EAAO6lC,MAAM5wB,MAAS,CAC1D,CACD,OAAO5Y,CACV,CAsJD,SAASwiB,GAAYxiB,IAAA,EACjBsgB,EAAAqkJ,IAAmB3kK,EAAO,WAC1B8K,EAAW9K,CACd,CAmJD,SAASgkB,KACL1M,EAAsBkoK,gCACzB,CA6ED,SAASz8J,KACL,OAAOtG,CACV,CAmHD,SAASuG,KACL,IAAKxC,EAAWw0H,aACZ,MAAMt0H,GAEV,OAAOF,EAAWw0H,YACrB,CAUD,SAASzxH,GAAWvjB,GAChB,IAAKoE,EACD,MAAM6c,GAGVT,EAAW0vJ,WAAWlwK,GAElBA,IACAyjB,KAo4BR,WACI,IAAI1N,EAAJ,CAIA,IAAI/V,EAAmB84H,OAAO2mD,iBAC9B,GAAgC,mBAArBz/K,EAAiC,CACxC,IAAIoN,EAAmBpN,EAAiBghB,IAASpgB,SAEjDmV,EAA6B3I,EAAiBsyK,uBAAuB,CACjE9pK,MAAOyM,GACPolH,SAAUvlH,GACVy9J,aAAc38J,KACdmwF,QAASl6F,EACTq7H,YAAa73H,EACbmkI,iBAAkBvoI,EAClBi+F,OAAQ7yG,EAAA+sB,EACRw2H,UAAW9qJ,EAAAs0B,EACXovJ,iBAAkB1yK,EAAAsjB,GAEzB,CAjBA,CAkBJ,CArBD,GAuBA,WACI,IAAI9a,EAAJ,CAIA,IAAI1V,EAAa84H,OAAO+mD,WACE,mBAAf7/K,IACPkW,EAAAvV,OAAcX,EAAWkkI,QACzBxuH,EAAa1V,EAAWghB,IAASpgB,OAAO,CACpC6mI,SAAUvlH,GACV0+H,iBAAkBvoI,EAClBi8H,YAAa73H,EACbqoI,cAAenlI,EACf6+H,mBAAoB1kI,EACpB2pD,iBAAkBtqD,EAClBu9I,qBAAsB3jJ,EACtB+0H,kBAAmBvwH,EACnB8mI,WAAY5rI,EACZ6jG,OAAQ7yG,EAAA+sB,EACRw2H,UAAW9qJ,EAAAs0B,EACX5a,MAAOyM,GACPy9J,gBAAiB3pK,EAAAD,EAAA0rH,kBACjBwvB,OAAQh0F,GACR2iH,SAAU5oH,GACViiD,SAAUj4F,KArBjB,CAwBJ,CA3BD,GAv5BYhI,GACAA,EAAiBsnJ,qBAAqB/xJ,IAI1ChL,GACAkgB,KAGJM,GAAoBxV,EACvB,CA+ED,SAASuU,GAAajjB,GAClB,IAAK8D,EACD,MAAM6c,GAEV,IAAIvT,EAAa+L,EAAiB68H,sBAElC,OAAK5oI,EAIEjR,EAAgB6mK,aAAahjK,EAAMoN,EAAW6K,IAH1C,EAId,CA6VD,SAASyL,GAAa1jB,GAAgC,IAAjBoN,EAAiB9O,UAAAjC,OAAA,YAAAiC,UAAA,GAAAA,UAAA,GAALq1C,IAC7C,IAAKvvC,EACD,MAAM6c,GAGmB,iBAAlBjhB,GACPygB,EAAiB4pH,WAAWrqI,GAGf,MAAboN,IACAA,EAAYumC,KAGXre,MAAMloB,KACPA,EAAYwB,KAAKgN,IAAI,EAAGxO,IAG5BsB,EAAoBtB,EACpBzJ,EAAS3D,GAEL8D,GAAwBJ,IACxBkgB,KAGAxB,MACA8B,GAAoBxV,EAE3B,CA2JD,SAASkU,KACL,IAAK9e,EACD,MAAM6c,GAEV,IAAI3gB,EAAamZ,EAAiB68H,sBAClC,OAAOh2I,EAAamZ,EAAiB+mJ,cAAclgK,EAAWiY,IAAM,IACvE,CAuED,SAAS2L,KACLlgB,GAAA,EACAI,GAAA,EACAmV,EAAQ+1B,QACR71B,EAAiB61B,QACjB51B,EAAc41B,QACdhvB,EAAkBgvB,QAClBl1B,EAAmBk1B,QACnB9qC,EAA6B8qC,QAC7BvnB,EAA0BunB,QAC1B3pB,EAAc2pB,QACd7yC,EAAgB6yC,QAChBte,GAAsBse,QAClBj8B,IACIoO,GAAS/J,MAAMskH,UAAUyB,WAAWC,wBACpCrqH,EAAqBitK,QAErBjtK,EAAqBi8B,QACrBj8B,EAAuB,KACvB0Q,OAGR+M,EAAewe,QACf9yB,EAAU8yB,QACVjvB,EAAUivB,OACb,CAED,SAAS1qB,KAEL,IAAMtkB,EAAiB6jB,KAElB1K,IACDA,EAAmBkiC,GAAiBr6B,IAASm4G,eAG5C3oG,IACDA,EAAiB8uC,GAAet+C,IAASpgB,OAAO,CAC5Cy9I,WAAA5rI,EACAqyI,cAAAnlI,EACAwzF,QAAAl6F,EACA8rI,gBAAA5oJ,EACA2rI,kBAAAvwH,EACAkgI,WAAAj3H,EACA44F,SAAAj4F,MAIR7d,EAAmBi0I,UAAU,CACzBhb,aAAA1xH,EACAy1J,sBAAAhpJ,EACA67F,QAAAl6F,EACAmgG,SAAAj4F,GACA2jI,cAAAnlI,EACA0+H,WAAA5rI,IAGJ0G,EAAiBo+H,UAAU,CACvBhb,aAAA1xH,EACAmzJ,mBAAA16J,EACA04J,eAAAh8J,EACA8kJ,cAAAnlI,EACAihI,iBAAAvoI,EACAioJ,sBAAAhpJ,EACAo/I,qBAAA3jJ,EACAgqI,eAAAvsH,EACA2iF,QAAAl6F,EACAq7H,YAAA73H,EACA4hI,WAAA5rI,EACAo1H,kBAAA/4H,EACA2oI,WAAAj3H,EACAg+H,mBAAA1kI,EACA09H,6BAAAtzI,EACAiyE,0BAAA1uD,EACAgtD,cAAApvD,EACA0/H,gBAAA5oJ,EACAi9G,SAAAj4F,GACA2mH,kBAAAvwH,EACAgpJ,iBAAA9/I,EACAuyH,sBAAAtiH,KAGJtX,EAAcm+H,UAAU,CACpBn+B,SAAAj4F,GACAq9H,mBAAA1kI,EACA2pD,iBAAAtqD,EACAs+H,WAAAj3H,EACAqnH,kBAAA/4H,EACAqkG,QAAAl6F,IAGJa,EAAmBy9H,UAAU,CACzB9zE,iBAAAtqD,EACAq+H,6BAAAtzI,EACAowI,YAAA73H,EACA02F,QAAAl6F,EACAw+H,WAAAj3H,EACAqnH,kBAAA/4H,EACAsqG,SAAAj4F,KAGJnB,EAAkBu3H,UAAU,CACxB9zE,iBAAAtqD,EACAqlI,mBAAA1kI,EACA8mI,iBAAAvoI,EACAo/H,WAAAj3H,EACA44F,SAAAj4F,KAGJkE,EAAckyH,UAAU,CACpB9zE,iBAAAtqD,EACA+qJ,WAAAzzI,GACAmwH,iBAAAvoI,EACAioJ,sBAAAhpJ,EACAw3J,UAAA/uJ,EACAu0H,YAAA73H,EACA02F,QAAAl6F,EACAw+H,WAAAj3H,EACA44F,SAAAj4F,KAGJjF,EAAUq7H,UAAU,CAChB9iE,cAAApvD,EACAivH,YAAA73H,EACA+hI,mBAAA1kI,IAGJiG,EAAUw3H,UAAU,CAAC,GAGrBlyH,EAAcglH,aACdlxH,EAAiBkxH,WAAWv/H,EAAUmC,GACtCujB,EAAe65G,aACfjxH,EAAcixH,aACdrqH,EAAkBqqH,aAClBnuH,EAAUmuH,aACVtqH,EAAUsqH,aACV5iH,EAA0B4iH,aAC1B35G,GAAsB25G,YACzB,CAED,SAASxmH,KACL,OAAO4kB,GAAeznB,IAASpgB,OAAO,CAClCgV,MAAOyM,GACPg8H,WAAY5rI,EACZ6hI,YAAa73H,EACbmkI,iBAAkBvoI,EAClB0uI,iBAAA,EAAiB1mI,EAAAmQ,GAAgBxP,IAASm4G,cAC1CgxC,WAAYz0J,EACZ0jG,SAAUj4F,IAEjB,CAED,SAASsC,KACL,GAAI1Q,EACA,OAAOA,EAGX,IAAI/S,EAAa84H,OAAOmnD,WACxB,GAA0B,mBAAfjgL,EAA2B,CAClC,IAAIoN,EAAapN,EAAWghB,IAASpgB,SAuBrC,OAtBA6C,EAAA+sB,EAAA7vB,OAAcX,EAAWs2G,QACzBjyG,EAAAmsB,EAAA7vB,OAAyBX,EAAWs2G,OAAQ,CACxCmuB,YAAA,IAEJvuH,EAAAvV,OAAcX,EAAWkkI,QACpBr5H,IACDA,GAAA,EAAe69B,GAAAlY,GAAaxP,IAASm4G,eAEzCpmH,EAAuB3F,EAAW8yK,uBAAuB,CACrDtqK,MAAAyM,GACAg8H,WAAA5rI,EACAglI,WAAAj3H,EACA8/I,sBAAAhpJ,EACAilH,aAAA1xH,EACA48H,SAAAvlH,GACAo0F,OAAQ7yG,EAAA+sB,EACR4gI,OAAAh0F,GACA4pF,UAAW9qJ,EAAAs0B,EACX2vJ,UAAAjkK,EACAk9F,SAAAj4F,IAIP,CAED,OAAO,IACV,CAsDD,SAASkD,KACL,IAAKjgB,EACD,MAAM6c,GAGV,GAAIhL,EACA,OAAOA,EAIX,IAAIjW,EAAoB84H,OAAOsnD,kBAE/B,GAAiC,mBAAtBpgL,EAAkC,CACzCyD,EAAA+sB,EAAA7vB,OAAcX,EAAkBs2G,QAChCjyG,EAAAmsB,EAAA7vB,OAAyBX,EAAkBs2G,OAAQ,CAC/CmuB,YAAA,IAEJvuH,EAAAvV,OAAcX,EAAkBkkI,QAEhC,IAAM92H,EAAiByW,KACjBlgB,EAAkBozB,GAAgB/V,IAASpgB,SAiCjD,OA/BA+C,EAAgB4zI,UAAU,CACtBuN,cAAAnlI,EACAwzF,QAAAl6F,EACA+iJ,eAAA5uJ,EACAixI,WAAA5rI,EACA0jE,0BAAA1uD,IAGJxR,EAAoBjW,EAAkBghB,IAASpgB,OAAO,CAClDgV,MAAOyM,GACPm0I,gBAAiB7yJ,EACjBmkI,kBAAmBvwH,EACnBykJ,eAAgB5uJ,EAChB03I,cAAenlI,EACfihI,iBAAkBvoI,EAClBo8D,cAAepvD,EACfm5H,mBAAoB1kI,EACpBq5F,QAASl6F,EACTolI,WAAY5rI,EACZ6hI,YAAa73H,EACborH,kBAAmB/4H,EACnBkkI,sBAAuBtiH,GACvB2vJ,oBAAqBjqK,EACrBqxH,SAAUvlH,GACVo0F,OAAQ7yG,EAAA+sB,EACR0zG,OAAQhuH,EACR8wI,UAAW9qJ,EAAAs0B,EACX4oF,SAAUj4F,GACV4xH,cAAellI,EAAA2iB,EACfk3G,UAAA,EAAUnnH,EAAAiQ,GAASxP,IAASm4G,eAGnC,CAED,OAAO,IACV,CAED,SAASh1G,GAAUnkB,GACf,IAAMoN,EAAO+L,GAAoBA,EAAiB87H,gBAAkB/4I,EAAAs0B,EAAAi7C,MAAkBvvE,EAAAs0B,EAAA3B,MAClFlrB,EAAS8Y,EAAYg4H,kBAAkBrnI,GAI3C,OAAKzJ,EAIM3D,GADK2D,EAAO2zI,aAAag8B,cAAcx7J,UAAY,IACnBnU,EAAO6lC,MAAM5wB,OAH7C,CAKd,CAMD,SAASsL,KAAqC,IAAjBlkB,EAAiB1B,UAAAjC,OAAA,YAAAiC,UAAA,GAAAA,UAAA,GAALq1C,IAEjC19B,GACAA,EAAkBqqK,gBAGjBx8K,GAAwBH,IACzBG,GAAA,EACAsJ,EAAO0I,KAAK,yBACZwO,KAEsB,iBAAX3gB,EACPwV,EAAiB6Z,KAAKrvB,EAAQ3D,GAE9BmZ,EAAiBknJ,iBAAiB18J,EAAQ3D,KAI7C0D,GAAuB0e,OACxB1e,GAAA,EACA0J,EAAO0I,KAAK,wBAEnB,CA0GD,OAxGA9V,EAAW,CACPqqI,WAnqEJ,SAAoBrqI,EAAM2D,EAAQsJ,GAA2B,IAAjBY,EAAiBvP,UAAAjC,OAAA,YAAAiC,UAAA,GAAAA,UAAA,GAALq1C,IAC/C9oC,IACDA,GAAA,EAAe69B,GAAAlY,GAAaxP,IAASm4G,eACxBoe,UAAU,CACnBn+B,SAAAj4F,KAIH1O,IACDA,EAAam1B,GAAa5mB,IAASm4G,eAGlCtuH,EAAa01K,uBAKbn8K,IACDA,GAAA,EAGA0K,EAAoBinD,GAAkB/0C,IAASm4G,cAC1C9zG,IACDA,EAAgB6qB,GAAclvB,IAASm4G,eACzBoe,UAAU,CACpBn+B,SAAUj4F,KAIb/K,IACDA,EAAsBgb,GAAoBpQ,IAASm4G,eAGlDr/G,IACDA,EAAqBxV,EAAmB0c,IAASm4G,eAGhDh9H,IACDA,EAAkBkkD,GAAgBr/B,IAASm4G,eAG1ChgH,IACDA,EAAmBkiC,GAAiBr6B,IAASm4G,eAG5C//G,IACDA,EAAgB8kC,GAAcl9B,IAASm4G,eAGtCn5G,IACDA,EAAoB6+B,GAAkB79B,IAASm4G,eAG9Cj1H,IACDA,EAA+B66C,GAA6B/9B,IAASm4G,eAGpE1xG,IACDA,EAA4B8N,GAA0BvU,IAASm4G,eAG9D71H,IACDA,EAAqBslC,GAAmB5nB,IAASm4G,eAGrDlgH,EAAU8gC,GAAY/4B,IAASm4G,cAE/Bx5G,EAAgBgrB,GAAc3pB,IAASm4G,cAEvCj9G,EAAYkJ,GAAUpE,IAASm4G,cAE/Bp5G,EAAYgN,GAAU/L,IAASm4G,cAE/B18G,EAAc05C,GAAYn1C,IAASm4G,YAAY,CAC3C/f,SAAUj4F,KAGdsP,GAAasnB,GAAW/2B,IAASm4G,YAAY,CACzC/f,SAAUj4F,KAGdlI,EAAQs+H,UAAU,CACdyP,UAAW9qJ,EAAAs0B,EACXmkJ,aAAcr4K,IACd+hJ,WAAY5rI,EACZ2+I,OAAQh0F,KAGP7lD,IACDA,EAAoBovC,GAAkB3lC,IAASpgB,UAGnD2W,EAAkBggI,UAAU,CACxBpkC,QAAAl6F,EACAk9D,0BAAA1uD,IAGJvjB,EAA6BqzI,UAAU,CACnCpkC,QAAAl6F,IAGCyX,KACDA,GAAwB+nB,GAAsBz3B,IAASm4G,YAAY,CAC/Dmb,YAAa73H,EACbmkI,iBAAkBvoI,EAClBgmI,WAAY5rI,EACZq1H,kBAAmBvwH,EACnB++F,OAAQ7yG,EAAA+sB,EACRi3G,SAAUvlH,GACVtM,MAAOyM,GACP2iI,WAAA,EAAWrzH,GAAAnB,GAAUxP,IAASm4G,cAC9B4tB,iBAAA,EAAiB1mI,EAAAmQ,GAAgBxP,IAASm4G,cAC1C+K,OAAQhuH,KAKhB/Z,EAAgBo7I,UAAU,CACtB2sB,WAAAzzI,GACA2oF,SAAAj4F,GACAm/I,sBAAAhpJ,IAGJe,EAAiBk/H,UAAU,CACvBiH,mBAAA1kI,EACA09H,6BAAAtzI,IAGJujB,EAA0B8vH,UAAU,CAChCpkC,QAAAl6F,EACAolI,WAAA5rI,EACA6hI,YAAA73H,EACAmkI,iBAAAvoI,EACAysI,cAAAnlI,EACA63H,6BAAAtzI,EACAujI,SAAAvlH,GACA6kI,iBAAA,EAAiB1mI,EAAAmQ,GAAgBxP,IAASm4G,gBAG9Cn1G,KACAxB,QAAA,IAAYvV,GAAyBA,GAGrCoX,MAGArkB,GACAujB,GAAWvjB,GAGX2D,GACA+f,GAAa/f,EAAQkK,GAGzBT,EAAO0I,KAAK,YAAcyM,KAAd,uCA7IR9P,EAAWjH,MAAM,IAAIwD,EAAAwhB,EAAYta,EAAAilI,kCAA0CjlI,EAAAymI,sCA8IlF,EAygEGpF,UA3uEJ,SAAmBv3I,GACVA,IAGDA,EAAOu8H,eACP1xH,EAAe7K,EAAOu8H,cAEtBv8H,EAAOg+J,qBACP16J,EAAqBtD,EAAOg+J,oBAE5Bh+J,EAAOyjE,mBACPtqD,EAAmBnZ,EAAOyjE,kBAE1BzjE,EAAO+8I,iBACPvsH,EAAiBxwB,EAAO+8I,gBAExB/8I,EAAO64E,gBACPz/D,EAAgBpZ,EAAO64E,eAEvB74E,EAAOw+I,qBACP1kI,EAAqB9Z,EAAOw+I,oBAE5Bx+I,EAAOw3I,+BACPtzI,EAA+BlE,EAAOw3I,8BAEtCx3I,EAAOm2E,4BACP1uD,EAA4BznB,EAAOm2E,2BAEnCn2E,EAAOwgL,oBACPxgK,EAAoBhgB,EAAOwgL,mBAE3BxgL,EAAO4gJ,mBACPvoI,EAAmBrY,EAAO4gJ,kBAE1B5gJ,EAAOsgK,wBACPhpJ,EAAwBtX,EAAOsgK,uBAE/BtgK,EAAOy0E,gBACPpvD,EAAgBrlB,EAAOy0E,eAEvBz0E,EAAOqgL,sBACPjqK,EAAsBpW,EAAOqgL,qBAE7BrgL,EAAO+kJ,kBACP5oJ,EAAkB6D,EAAO+kJ,iBAEzB/kJ,EAAOo5G,WACPj4F,GAAWnhB,EAAOo5G,UAEzB,EA2rEGhnF,GAp8DJ,SAAYpyB,EAAMoN,EAAUzJ,EAAOsJ,GAC/BiV,GAASkQ,GAAGpyB,EAAMoN,EAAUzJ,EAAOsJ,EACtC,EAm8DGylB,IAx7DJ,SAAa1yB,EAAMoN,EAAUzJ,GACzBue,GAASwQ,IAAI1yB,EAAMoN,EAAUzJ,EAChC,EAu7DGhD,OAlbJ,SAAgBX,EAAkBoN,EAAezJ,GAC7CQ,EAAAqsB,EAAA7vB,OAAoBX,EAAkBoN,EAAezJ,EAAUqd,GAClE,EAibGy/J,WAAAl9J,GACAm9J,aAAAh9J,GACA22I,gBA5jBJ,SAAyBr6J,GACrB,IAAKoE,EACD,MAAM6c,GAGV,IAAKmB,KACD,OAAOpiB,EAAS,KAAM4gB,IAG1B,IAAIxT,EAAOkJ,KAEa,mBAAbtW,GAYPkiB,GAASkQ,GAAG3uB,EAAA+sB,EAAAk1G,0BAXI,SAAV/hI,EAAoBsJ,GACtBiV,GAASwQ,IAAIjvB,EAAA+sB,EAAAk1G,yBAAiC/hI,EAASyJ,GAEnDH,EAAEzB,MACFxL,EAAS,KAAMiN,EAAEzB,OAIrBxL,EAASiN,EAAEq7H,SACd,GAEqDl7H,GAG1D+L,EAAiBkhJ,iBACpB,EAkiBGrkD,QAAA5zF,GACA03F,QAl5DJ,WACI,IAAIt5F,EAAWw0H,eAAgBlxI,EAA/B,CAGA,IAAIH,EAGA,MAAMid,GAFNsD,GAAoBxV,EAFvB,CAMJ,EA04DG81G,KA/3DJ,WACI,IAAK9gH,EACD,MAAMitB,KAEL7lB,GAAaqX,MAAcze,IAC5BoW,EAAmB0qG,MAAA,EAE1B,EAy3DG4wB,SAAAjzH,GACAsiG,MAj3DJ,WACI,IAAK/gH,EACD,MAAMitB,GAEV7W,EAAmB2qG,OACtB,EA62DG4wB,UAryDJ,WACI,IAAK3xI,EACD,MAAMitB,GAEV,OAAO7W,EAAmBu7H,WAC7B,EAiyDGK,UAAA/yH,GACAm1H,yBA5wDJ,WACI,IAAKp0I,EACD,MAAMitB,GAEV,OAAO7W,EAAmBg+H,0BAC7B,EAwwDG/yB,KAp1DJ,SAAc/kH,GACV,IAAK0D,EACD,MAAMitB,GAKV,IAAI,EAFJrQ,EAAAqkJ,IAAmB3kK,EAAO,UAEtBs1B,MAAMt1B,GACN,MAAM9D,EAAAs0B,EAAAmwJ,mBAGN3gL,EAAQ,IACRA,EAAQ,GAGZ,IAAIoN,EAAI0M,EAAmBo+H,eAAiBz1H,GAAiBziB,GAASA,EAGhE2D,EAAeqf,MAChBlJ,EAAmBo+H,gBAAkBv0I,EAAaqU,WACnD5K,EAAIwB,KAAK+M,IAAIhY,EAAaqU,SAAU5K,IAGxC0M,EAAmBirG,KAAK33G,GAAA,GAAG,GAAO,EACrC,EA6zDG2rI,mBAxzDJ,WACSr1I,GAAwBif,MAI7B7I,EAAmBi/H,oBACtB,EAmzDGgoB,gBAlwDJ,SAAyB/gK,GACrBgjB,KAAkB6W,aAAe75B,CACpC,EAiwDGu1I,gBAzvDJ,WACI,OAAOvyH,KAAkB6W,YAC5B,EAwvDG+mJ,QA/uDJ,SAAiB5gL,IAAA,EACbsgB,EAAAqkJ,IAAmB3kK,EAAO,WAC1BgjB,KAAkB80F,MAAQ93G,CAC7B,EA6uDG6gL,QAruDJ,WACI,OAAO79J,KAAkB80F,KAC5B,EAouDGgpE,UA3tDJ,SAAmB9gL,GACf,GAAqB,iBAAVA,GAAsBs1B,MAAMt1B,IAAUA,EAAQ,GAAOA,EAAQ,EACpE,MAAM9D,EAAAs0B,EAAAmwJ,mBAEV39J,KAAkB40F,OAAS53G,CAC9B,EAutDG+gL,UA/sDJ,WACI,OAAO/9J,KAAkB40F,MAC5B,EA8sDGnuE,KAAA5mB,GACA7K,SAAA0K,GACAs+J,UApjDJ,WACI,IAAKt9K,EACD,MAAMitB,GAEV,OAAI9N,KAAS,EACF8wB,IAEJxvB,GAAUtB,KACpB,EA6iDGo+J,cAliDJ,WACI,IAAKv9K,EACD,MAAMitB,GAEV,OAAOxM,GAAUzB,KACpB,EA8hDG4uI,gBAAA1uI,GACAs+J,iBAvqDJ,WACI,IAAMlhL,EAAOmZ,GAAoBA,EAAiB87H,gBAAkB/4I,EAAAs0B,EAAAi7C,MAAkBvvE,EAAAs0B,EAAA3B,MAClFzhB,EAASqP,EAAYg4H,kBAAkBz0I,GAC3C,OAAKoN,EAGEA,EAAOkqI,aAAamB,cAFhB,CAGd,EAiqDG0oC,iBAAA1+J,GACA2+J,qBArZJ,WACI,IAAMphL,EAAW2f,EAAco+D,WAE/B,OAAK/9E,EAIEuX,EAAkBitJ,YAAYxkK,GAH1B,EAId,EA8YGqhL,sBAvYJ,WACI,IAAMrhL,EAAW2f,EAAco+D,WAE/B,IAAK/9E,EACD,MAAO,GAGX,IAAMoN,EAAoB6L,EAAQo3I,YAAYrwJ,GACxC2D,EAAsB8jB,EAA0B+zI,+BAA+BpuJ,GAErF,OAAOA,EAAkBxN,OAAO+D,EACnC,EA6XG29K,mBA/nDJ,WACI,IAAK59K,EACD,MAAMitB,GAGV,OAAO7W,EAAmB6+H,sBAC7B,EA0nDG4oC,kBAlfJ,SAA2BvhL,GACvBA,EAAQ4O,KAAKgN,IAAI5b,EAAO,GAExB,IAAIoN,EAAIwB,KAAK2Q,MAAMvf,EAAQ,MACvB2D,EAAIiL,KAAK2Q,MAAOvf,EAAQ,KAAQ,IAChCiN,EAAI2B,KAAK2Q,MAAOvf,EAAQ,KAAQ,IACpC,OAAc,IAANoN,EAAU,GAAMA,EAAI,GAAK,IAAMA,EAAEpQ,WAAa,IAAMoQ,EAAEpQ,WAAa,MAAS2G,EAAI,GAAK,IAAMA,EAAE3G,WAAa2G,EAAE3G,YAAc,KAAOiQ,EAAI,GAAK,IAAMA,EAAEjQ,WAAaiQ,EAAEjQ,WAC5K,EA4eGwkL,UApgBJ,SAAmBxhL,EAAMoN,EAASzJ,GAA0B,IAAlBsJ,EAAkB3O,UAAAjC,OAAA,YAAAiC,UAAA,IAAAA,UAAA,GAClDhC,EAAK,IAAIub,KAAY,IAAP7X,GACd9D,EAAII,EAAGmlL,mBAAmBr0K,GAC1BS,EAAIvR,EAAGolL,mBAAmBt0K,EAAS,CACrCu0K,OAAQh+K,IAEZ,OAAOsJ,EAAWY,EAAI,IAAM3R,EAAI2R,CACnC,EA8fGo6J,WAAA1lJ,GACAq/J,SAr8DJ,WACI,OAAOv/J,EACV,EAo8DG2tD,gBA3sDJ,SAAyBhwE,GACrB,IAAM2D,EAAQ,CAACzH,EAAAs0B,EAAAi7C,MAAiBvvE,EAAAs0B,EAAA3B,MAAiB3yB,EAAAs0B,EAAAmmG,MACjD,GAAK32H,EAQD,OAA6B,IAAzB2D,EAAM8E,QAAQzI,GACC+iB,KAAiBk+H,sBAAsBjhJ,IAC7B2zC,KAEzBvmC,EAAOX,KAAK,8CACLknC,KAZX,IAAM1mC,EAAStJ,EAAMkiB,KACjB,SAAA7lB,GAAC,OAAIijB,GAAajjB,GAAG3D,OAAS,EAAI0mB,KAAiBk+H,sBAAsBjhJ,GAAKwO,OAAO4oB,SAApF,IACHlK,QACE,SAACltB,EAAGoN,GAAJ,OAAUwB,KAAK+M,IAAI3b,EAAGoN,EAAtB,IAEJ,OAAOH,IAAWuB,OAAO4oB,UAAYuc,IAAM1mC,CAUlD,EA0rDGuiK,oBA/iCJ,WACI,OAAOhvJ,EAAaA,EAAWgvJ,sBAAwB,IAC1D,EA8iCGqS,gBAAA7+J,GACAusJ,UApqBJ,WACI,IAAK5rK,EACD,MAAMid,GAEV,OAAOjd,CACV,EAgqBGm+K,aAzpBJ,SAAsB9hL,GAClB2D,EAAS3D,EACTmZ,EAAiB6Z,KAAKrvB,EACzB,EAupBGi1I,sBAt6CJ,WACI,IAAKx0I,EACD,MAAM6c,GAGV,OAAKvd,EAIEoW,EAAmB8+H,wBAHfjlG,GAId,EA65CG+9G,qBA3hDJ,SAA8B1xJ,GAC1B,IAAK8D,EACD,MAAM6c,GAEV,OAAO0E,EAAcqsI,qBAAqB1xJ,EAC7C,EAuhDG+hL,YAAAv/J,GACAs+H,YAn7CJ,WACI,OAAOh2I,CACV,EAk7CGk3K,eAAAj/J,GACA27H,cA5gDJ,SAAuB1+I,GACnB,IAAK8D,EACD,MAAM6c,GAEV,GAAI3gB,IAAS9D,EAAAs0B,EAAA07H,MAAiB,CAC1B,IAAM9+I,EAAewV,KACrB,IAAKxV,EACD,OAAQ,EAEZ,IAAMzJ,EAAsByJ,EAAagsJ,yBAEzC,OAAQz1J,EAA2BA,EAAoBwyJ,wBAAxB,CAClC,CACD,OAAO9wI,EAAcq5H,cAAc1+I,EACtC,EA+/CGiiL,cAj/CJ,SAAuBjiL,EAAMoN,GAA6B,IAAtBzJ,EAAsBrF,UAAAjC,OAAA,YAAAiC,UAAA,IAAAA,UAAA,GACtD,IAAKwF,EACD,MAAM6c,GAEV,GAAI3gB,IAAS9D,EAAAs0B,EAAA07H,MAAiB,CAC1B,IAAMj/I,EAAe2V,KACrB,IAAK3V,EACD,OAEJ,IAAM3Q,EAAsB2Q,EAAamsJ,yBACrC98J,GACAA,EAAoBi5J,gBAAgBnoJ,EAE3C,CACDiY,EAAc69H,mBAAmBljJ,EAAMmZ,EAAiB68H,sBAAuB5oI,EAAO,CAAE06I,aAAAnkJ,GAC3F,EAm+CGu+K,iBAx9CJ,WACI78J,EAAcmpJ,iBACdnpJ,EAAcopJ,4BAAA,EACjB,EAs9CG6Q,WAzsCJ,SAAoBt/K,GAChB,IAAMoN,EAAmB+L,EAAiB68H,sBAE1C,SAAK5oI,IAAqBojB,IAInBA,EAAe8uJ,WAAWlyK,EAAiB6K,GAAIjY,EACzD,EAksCGu/K,0BAxrCJ,SAAmCv/K,GAG/B,SAFyBmZ,EAAiB68H,wBAEhBxlH,IAInBA,EAAe+uJ,0BAA0Bv/K,EACnD,EAirCGg/I,cAxqCJ,WACI,IAAMh/I,EAAmBmZ,EAAiB68H,sBAE1C,SAAKh2I,IAAqBwwB,IAInBA,EAAewuH,cAAch/I,EACvC,EAiqCG09I,aAtpCJ,SAAsB19I,GAClB,IAAK0D,EACD,MAAMitB,GAGV,IAAMvjB,EAAmB+L,EAAiB68H,sBAErC5oI,GAAqBojB,GAI1BA,EAAektH,aAAatwI,EAAiB6K,GAAIjY,EACpD,EA2oCGmiL,sBAvhCJ,SAA+BniL,GAC3B,IAAK8D,EACD,MAAM6c,GAEV,IAAIvT,EAASwV,KACb,OAAOxV,EAASA,EAAOisJ,kBAAkBr5J,GAAQ,EACpD,EAkhCGoiL,uBAxgCJ,SAAgCpiL,GAC5B,IAAK8D,EACD,MAAM6c,GAEV,OAAO1H,EAAQ2kJ,eAAe59J,EACjC,EAogCGgjK,aAAA//I,GACAo/J,6BAp+BJ,SAAsCriL,EAAMoN,EAAUzJ,GAClD,IAAKG,EACD,MAAM6c,GAKV,OAFAhd,EAAaA,GAAcsV,EAAQ2kJ,eAAexwJ,EAAU,GAAG,IAE3C6L,EAAQ29I,uBAAuBjzJ,EAAY3D,EAAMoN,GAAY,EACpF,EA69BG8pJ,mBAn9BJ,SAA4Bl3J,GACxB,IAAK8D,EACD,MAAM6c,GAEV,IAAIvT,EAAa+L,EAAiB68H,sBAClC,OAAO75I,EAAgB+6J,mBAAmBl3J,EAAMoN,EAAW6K,GAC9D,EA88BGqqK,2BA57BJ,SAAoCtiL,EAAMoN,GACtC,IAAKhJ,EACD,MAAM6c,GAEV9kB,EAAgBinK,mBAAmBpjK,EAAMoN,EAC5C,EAw7BGm1K,2BAv6BJ,SAAoCviL,GAChC,IAAKoE,EACD,MAAM6c,GAEV,OAAO9kB,EAAgBknK,mBAAmBrjK,EAC7C,EAm6BGwiL,gBA15BJ,SAAyBxiL,GAA+B,IAAxBoN,EAAwB9O,UAAAjC,OAAA,YAAAiC,UAAA,IAAAA,UAAA,GACpD,IAAKwF,EACD,MAAM6c,GAEVxkB,EAAgB+mK,SAASljK,EAAOoN,EACnC,EAs5BGq1K,iBAn6CJ,SAA0BziL,EAAMoN,EAAUzJ,GACtC2T,EAAsBorK,iBAAiB1iL,EAAMoN,EAAUzJ,EAC1D,EAk6CGg/K,oBAz5CJ,SAA6B3iL,GACzBsX,EAAsBsrK,oBAAoB5iL,EAC7C,EAw5CG6iL,uBAj5CJ,WACIvrK,EAAsBwrK,wBACzB,EAg5CGC,kBA14CJ,WACI,OAAOzrK,EAAsB0rK,mBAChC,EAy4CGj9B,qBAhzCJ,SAA8B/lJ,GAC1B,IAAMoN,EAAoBiY,EAAcygI,uBAClCniJ,EAAYmW,EAAmBo+H,eAErC,OAAO9qI,EAAoBA,EAAkB24I,qBAAqB/lJ,EAAM2D,GAAa,CACxF,EA4yCGs/K,iBA1tBJ,SAA0BjjL,EAAKoN,GAC3B,IAAIzJ,EAAiBkgB,KACjB5W,EAAOqJ,KAYX4L,GAASkQ,GAAG3uB,EAAA+sB,EAAAk1G,0BAVI,SAAV1lI,EAAoB1D,GACjBA,EAAEkP,MAGH4B,EAAS,KAAM9Q,EAAEkP,OAFjB4B,EAAS9Q,EAAEgsI,UAIfpmH,GAASwQ,IAAIjvB,EAAA+sB,EAAAk1G,yBAAiC1lI,EAASiN,GACvDtJ,EAAeqrC,OAClB,GAEqD/hC,GAEtDwT,EAAiB4pH,WAAWrqI,GAC5B2D,EAAeqvB,KAAKhzB,EACvB,EAysBGkjL,mBA52CJ,SAA4BljL,EAAaoN,GACrCkK,EAAsB4rK,mBAAmBljL,EAAaoN,EACzD,EA22CG+1K,sBA/1CJ,SAA+BnjL,EAAaoN,GACxCkK,EAAsB6rK,sBAAsBnjL,EAAaoN,EAC5D,EA81CGg2K,6BAj1CJ,WACI9rK,EAAsB8rK,8BACzB,EAg1CG5D,+BAAAx7J,GACAq/J,6BAryCJ,SAAsCrjL,EAAMoN,GACxCkK,EAAsB+rK,6BAA6BrjL,EAAMoN,EAC5D,EAoyCGknJ,6BAzxCJ,SAAsCt0J,GAClC,OAAOsX,EAAsBg9I,6BAA6Bt0J,EAC7D,EAwxCGsjL,wBA1zBJ,WACI,OAAO7/J,IACV,EAyzBG8/J,2BAjzBJ,SAAoCvjL,GAChC+S,EAAuB/S,CAC1B,EAgzBGggK,kBAnyBJ,SAA2BhgK,GACvBiN,EAAiBjN,EAGbmZ,GACAA,EAAiB6mJ,kBAAkB/yJ,EAE1C,EA6xBGu2K,6BA92BJ,SAAsCxjL,GAClCsX,EAAsBksK,6BAA6BxjL,EACtD,EA62BGyjL,8BAn2BJ,SAAuCzjL,GACnCsX,EAAsBmsK,8BAA8BzjL,EACvD,EAk2BG0jL,+BA11BJ,SAAwC1jL,GACpCsX,EAAsBosK,+BAA+B1jL,EACxD,EAy1BG2jL,gCAj1BJ,SAAyC3jL,GACrCsX,EAAsBqsK,gCAAgC3jL,EACzD,EAg1BG4jL,iCAx5BJ,SAA0C5jL,GACtCsX,EAAsBssK,iCAAiC5jL,EAC1D,EAu5BG6jL,mCA/4BJ,SAA4C7jL,GACxCsX,EAAsBusK,mCAAmC7jL,EAC5D,EA84BG8jL,uCAx4BJ,SAAgD9jL,GAC5CsX,EAAsBwsK,uCAAuC9jL,EAChE,EAu4BG+jL,yCAl4BJ,WACIzsK,EAAsBysK,yCAAyC,KAElE,EAg4BGC,uBAllCJ,SAAgChkL,GAC5B,IAAKwgB,EAAWw0H,aACZ,MAAMt0H,GAEVF,EAAW2vJ,oBAAoBnwK,EAClC,EA8kCGikL,sBA5kCJ,SAA+BjkL,GAC3B,IAAKwgB,EAAWw0H,aACZ,MAAMt0H,GAEVF,EAAW4vJ,mBAAmBpwK,EACjC,EAwkCGkkL,yBA1qCJ,WACI,IAEMlkL,EAAmBmZ,EAAiB68H,sBAE1C,GAAKh2I,GAAqBwwB,EAM1B,OAFMA,EAAe+pJ,mBAAmBv6K,EAAiBiY,GAG5D,EA+pCGksK,iBAtxBJ,SAA0BnkL,EAAMoN,GAC5B,GAAwB,mBAAbA,EAGX,GAAIpN,EAAO,EACPoN,EAAS,UADb,CAIA,IAAMzJ,EAAImW,EAAmBo+H,eAAiBz1H,GAAiBziB,GAAQA,EACjEiN,EAASkM,EAAiBgnJ,iBAAiBx8J,GACjD,GAAe,OAAXsJ,EAAJ,CAKA,IAAM3Q,EAAsB2Q,EAAOmsJ,yBACnC,GAAK98J,EAKL,OAAOA,EAAoBo5J,QAAQ/xJ,EAAGyJ,GAJlCA,EAAS,KAJZ,MAFGA,EAAS,KAJZ,CAeJ,EAiwBGg3K,eA7eJ,WACI,OAAOnrK,CACV,EA4eGorK,qBAzxCJ,WACI,OAAOhgK,IACV,EAwxCGigK,uBAveJ,WACI,GAAI78J,EACA,OAAOA,EAA0ByzI,kBAExC,EAoeGC,+BA9dJ,WACI,GAAI1zI,EACA,OAAOA,EAA0B0zI,gCAExC,EA2dGopB,YA/mBJ,WACI,OAAOpjK,GAAS/J,KACnB,EA8mBGotK,eAzlBJ,SAAwBxkL,GACpBmhB,GAASsgB,OAAOzhC,EACnB,EAwlBGykL,cAhlBJ,WACItjK,GAAS6tB,OACZ,EA+kBGA,MAAA1sB,GACAyQ,QAhkEJ,WACIzQ,KACAne,EAAAqsB,EAAAuqG,yBAAsC/5G,GACzC,GAxSG5T,EAASiV,GAAMm3G,UAAUx5H,GACzBoE,GAAA,EACAV,GAAA,EACAI,GAAA,EACAgH,GAAA,EACA4D,EAAoBilC,IACpB5gC,EAAuB,KACvBkD,EAAoB,KACpBhJ,EAAiB,KACjBgM,EAAU,KACVyX,GAAwB,KACxBjtB,EAAA+sB,EAAA7vB,OAAc0D,EAAAmsB,GACdnY,EAAmBkzB,GAAiBvqB,IAASm4G,cAC7C7hH,GAAA,EAAwBgW,GAAAkD,GAAsBxP,IAASm4G,cACvD34G,EAAaqvB,GAAW7uB,IAASm4G,cACjC14G,EAAmByqB,GAAiBlqB,IAASm4G,cA21E1Cn5H,CACV,CAEDy/D,GAAYk6D,sBAAwB,cACpC,IAAMn6D,GAAUr7D,EAAAqsB,EAAAyqG,gBAA6Bx7D,IAC7CD,GAAQ82C,OAASjyG,EAAAmsB,EACjBgvC,GAAQ0kE,OAAShuH,EACjB/R,EAAAqsB,EAAA2qG,mBAAgC17D,GAAYk6D,sBAAuBn6D,IAEnE,IAAAQ,GAAAR,EAAA,gBAAAx/D,EAAAoN,EAAAzJ,GAAA,sBAAAsJ,EAAAjN,GAAA,OAAAiN,EAAA,mBAAA1J,QAAA,iBAAAA,OAAA85E,SAAA,SAAAr9E,GAAA,cAAAA,CAAA,WAAAA,GAAA,OAAAA,GAAA,mBAAAuD,QAAAvD,EAAA5D,cAAAmH,QAAAvD,IAAAuD,OAAAxG,UAAA,gBAAAiD,CAAA,EAAAiN,EAAAjN,EAAA,UAAA1D,EAAA0D,EAAAoN,GAAA,OAAA9Q,EAAAQ,OAAA4nI,gBAAA,SAAA1kI,EAAAoN,GAAA,OAAApN,EAAA8oD,UAAA17C,EAAApN,CAAA,EAAA1D,EAAA0D,EAAAoN,EAAA,UAAAlR,EAAA8D,EAAAoN,GAAA,OAAAA,GAAA,WAAAH,EAAAG,IAAA,mBAAAA,EAAA,SAAApN,GAAA,YAAAA,EAAA,UAAAwxC,eAAA,oEAAAxxC,CAAA,EAAAA,GAAAoN,CAAA,UAAAS,EAAA7N,GAAA,OAAA6N,EAAA/Q,OAAA4nI,eAAA5nI,OAAAuC,eAAA,SAAAW,GAAA,OAAAA,EAAA8oD,WAAAhsD,OAAAuC,eAAAW,EAAA,EAAA6N,EAAA7N,EAAA,KC5jEIkN,EAAoB,IAjclB,SAAAlN,IAAA,SAAAA,EAAAoN,GAAA,sBAAAA,GAAA,OAAAA,EAAA,UAAAu7C,UAAA,sDAAA3oD,EAAAjD,UAAAD,OAAA8D,OAAAwM,GAAAA,EAAArQ,UAAA,CAAAX,YAAA,CAAA0L,MAAA9H,EAAAo7H,UAAA,EAAAt9C,cAAA,KAAA1wE,GAAA9Q,EAAA0D,EAAAoN,EAAA,EAAAF,EAAAlN,GAAA,IAAAoN,EAAAzJ,EAAAsJ,GAAAG,EAAAF,EAAAvJ,EAAA,kCAAA45E,UAAAA,QAAAC,UAAA,YAAAD,QAAAC,UAAAmnD,KAAA,+BAAAC,MAAA,oBAAA9nB,QAAA//G,UAAAF,QAAAK,KAAAqgF,QAAAC,UAAAs/B,QAAA,6BAAA98G,GAAA,4BAAAA,EAAAiN,EAAAY,EAAAT,GAAA,GAAAzJ,EAAA,KAAArH,EAAAuR,EAAA,MAAAzR,YAAA4D,EAAAu9E,QAAAC,UAAAvwE,EAAA3O,UAAAhC,EAAA,MAAA0D,EAAAiN,EAAAyU,MAAA,KAAApjB,WAAA,OAAApC,EAAA,KAAA8D,EAAA,GAKF,SAAAkN,IAAc,IAAAlN,EAAA,gBAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,2CAAAz7C,IACVlN,EAAAiN,EAAA/P,KAAA,OAOK+gK,cAAgB,cAMrBj+J,EAAK8kK,kBAAoB,kBAOzB9kK,EAAKi2I,aAAe,gBAOpBj2I,EAAKm/I,cAAgB,eAMrBn/I,EAAK+0I,2BAA6B,qBAMlC/0I,EAAKi/I,qBAAuB,qBAM5Bj/I,EAAK6+K,wBAA0B,uBAM/B7+K,EAAK8+K,2BAA6B,0BAMlC9+K,EAAK++K,yBAA2B,wBAMhC/+K,EAAK+qI,kBAAoB,kBAMzB/qI,EAAKkS,MAAQ,QAKblS,EAAKs5I,2BAA6B,2BAMlCt5I,EAAKu5I,0BAA4B,0BAKjCv5I,EAAKi6I,yBAA2B,yBAMhCj6I,EAAKw5I,2BAA6B,2BAMlCx5I,EAAKu5H,IAAM,MAMXv5H,EAAKg7J,yBAA2B,yBAMhCh7J,EAAK6zJ,0BAA4B,0BAMjC7zJ,EAAK8P,gBAAkB,iBAMvB9P,EAAKi2K,gBAAkB,iBAMvBj2K,EAAKk2K,eAAiB,gBAMtBl2K,EAAKs/J,aAAe,cAMpBt/J,EAAKm2K,eAAiB,gBAMtBn2K,EAAKm+J,sBAAwB,sBAM7Bn+J,EAAKmyJ,wBAA0B,wBAM/BnyJ,EAAKu/J,yBAA2B,yBAMhCv/J,EAAK2hJ,wBAA0B,wBAM/B3hJ,EAAKwhJ,sBAAwB,sBAM7BxhJ,EAAK60I,oBAAsB,qBAM3B70I,EAAK04J,eAAiB,gBAMtB14J,EAAK44J,iBAAmB,kBAMxB54J,EAAKu3J,mBAAqB,oBAM1Bv3J,EAAK83J,mBAAqB,oBAM1B93J,EAAK2/J,yBAA2B,yBAMhC3/J,EAAKm/K,kBAAoB,qBAMzBn/K,EAAK28K,iBAAmB,iBAMxB38K,EAAKg8K,UAAY,WAMjBh8K,EAAKi8K,SAAW,UAMhBj8K,EAAKi7J,8BAAgC,8BAMrCj7J,EAAK69K,YAAc,aAMnB79K,EAAK29K,cAAgB,cAMrB39K,EAAKw7K,iBAAmB,kBAMxBx7K,EAAKk7K,yBAA2B,yBAQhCl7K,EAAK81I,SAAW,UAMhB91I,EAAK+1I,iBAAmB,iBAMxB/1I,EAAK40I,eAAiB,gBAOtB50I,EAAKk3I,eAAiB,gBAMtBl3I,EAAKgwK,qBAAuB,qBAO5BhwK,EAAK82I,yBAA2B,yBAOhC92I,EAAK+2I,qBAAuB,qBAM5B/2I,EAAKs2I,gBAAkB,iBAQvBt2I,EAAKq2I,iBAAmB,kBAQxBr2I,EAAK42I,kBAAoB,mBAMzB52I,EAAK62I,sBAAwB,sBAM7B72I,EAAKy2I,gBAAkB,iBAMvBz2I,EAAKu2I,iBAAmB,kBAMxBv2I,EAAKm3I,iBAAmB,kBAQxBn3I,EAAKk2I,iBAAmB,kBAMxBl2I,EAAK02I,sBAAwB,sBAM7B12I,EAAKi3I,wBAA0B,wBAO/Bj3I,EAAKm2I,iBAAmB,kBAMxBn2I,EAAK2jJ,0BAA4B,0BAMjC3jJ,EAAK+8J,oBAAsB,mBAM3B/8J,EAAKw6H,sBAAwB,qBAM7Bx6H,EAAKg/J,sBAAwB,uBAM7Bh/J,EAAK80I,sBAAwB,uBAM7B90I,EAAK4qK,uCAAyC,qCAM9C5qK,EAAK26J,mCAAqC,kCAM1C36J,EAAK0mJ,YAAc,aAMnB1mJ,EAAKgiJ,qCAAuC,mCAM5ChiJ,EAAKiiJ,mCAAqC,iCAxbhCjiJ,CAybb,QAAAkN,CAAA,CAGuB,CAjctBvJ,EAAA,MAA0B6sB,IAkchCpjB,EAAAojB,EAAAtjB,CAAA,gBAAAlN,EAAAoN,GAAA,sBAAAzJ,EAAA3D,EAAAoN,GAAA,QAAAzJ,EAAA,EAAAA,EAAAyJ,EAAA/Q,OAAAsH,IAAA,KAAAsJ,EAAAG,EAAAzJ,GAAAsJ,EAAAmvD,WAAAnvD,EAAAmvD,aAAA,EAAAnvD,EAAA6wE,cAAA,YAAA7wE,IAAAA,EAAAmuH,UAAA,GAAAt+H,OAAAmC,eAAAe,EAAAiN,EAAA9P,IAAA8P,EAAA,MC7KMA,EAAY,IApRZ,WA+QF,SAAAjN,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAA3oD,GACVsW,KAAKgqC,MACR,KAAArzC,EAAA,OAAAA,EAAA,EAAA9P,IAAA,OAAA2K,MA/QD,WAMIwO,KAAK2uJ,OAAS,SAOd3uJ,KAAKm1D,MAAQ,QAObn1D,KAAKuY,MAAQ,QAObvY,KAAKqgH,KAAO,OAOZrgH,KAAKo1D,MAAQ,QAObp1D,KAAK41I,MAAQ,QAOb51I,KAAK2iK,KAAO,OAOZ3iK,KAAK4iK,KAAO,OAOZ5iK,KAAKkkK,IAAM,MAOXlkK,KAAKouK,KAAO,OAOZpuK,KAAKw7H,iBAAmB,kBAOxBx7H,KAAKisH,qBAAuB,aAO5BjsH,KAAKs4J,kBAAoB,UAOzBt4J,KAAKo4J,iBAAmB,SAOxBp4J,KAAKq4J,kBAAoB,UAOzBr4J,KAAKu4J,wBAA0B,gBAO/Bv4J,KAAKozI,iDAAmD,8CAOxDpzI,KAAKqtH,8CAAgD,2CAOrDrtH,KAAKwyI,sCAAwC,oCAO7CxyI,KAAKoqH,0BAA4B,yBAOjCpqH,KAAK2qJ,uBAAyB,sBAO9B3qJ,KAAK+rH,8BAAgC,gBAOrC/rH,KAAKquK,oBAAsB,OAO3BruK,KAAKqqK,mBAAqB,oBAO1BrqK,KAAKi9H,qBAAuB,8BAO5Bj9H,KAAK2qH,iCAAmC,gBAOxC3qH,KAAK4qH,gCAAkC,eAOvC5qH,KAAKqsJ,iCAAmC,aAOxCrsJ,KAAKosJ,qCAAuC,iBAO5CpsJ,KAAKssJ,wCAA0C,oBAO/CtsJ,KAAKusJ,kCAAoC,cAOzCvsJ,KAAK8qH,gDAAkD,2BAOvD9qH,KAAKutH,gBAAkB,QAOvBvtH,KAAK+9I,iBAAmB,SACxB/9I,KAAKsuK,WAAa,aAClBtuK,KAAK4lK,aAAe,UACpB5lK,KAAKsmK,YAAc,SACnBtmK,KAAKwlK,cAAgB,WACrBxlK,KAAK29J,IAAM,MACX39J,KAAKskK,IAAM,MACXtkK,KAAKmjK,KAAO,QACZnjK,KAAK+1I,cAAgB,cACrB/1I,KAAK4yJ,WAAa,YAClB5yJ,KAAK6qJ,kCAAoC,qCACzC7qJ,KAAK+gI,oCAAsC,wCAC3C/gI,KAAK4nK,yBAA2B,iCAChC5nK,KAAKuuK,IAAM,MACXvuK,KAAKwuK,aAAe,cACpBxuK,KAAKyuK,kBAAoB,mBACzBzuK,KAAK0uK,gBAAkB,kBACvB1uK,KAAK6nK,aAAe,wBACpB7nK,KAAK8nK,cAAgB,wBACrB9nK,KAAKshJ,2BAA6B,CAC9BwX,aAAc,EACdvX,cAAe,EACfmX,kBAAmB,EACnBC,iBAAkB,EAClBC,iBAAkB,GAEtB54J,KAAK09I,kBAAoB,CACrBC,MAAO,eACPC,IAAK,aAEZ,MAAAvwJ,EAIA3D,EAJAjD,UAAAkQ,GAAAjN,CAAA,CAOiB,IACtBoN,EAAAojB,EAAAvjB,CAAA,gBAAAjN,EAAAoN,GAAA,sBAAAzJ,EAAA3D,EAAAoN,GAAA,QAAAzJ,EAAA,EAAAA,EAAAyJ,EAAA/Q,OAAAsH,IAAA,KAAAsJ,EAAAG,EAAAzJ,GAAAsJ,EAAAmvD,WAAAnvD,EAAAmvD,aAAA,EAAAnvD,EAAA6wE,cAAA,YAAA7wE,IAAAA,EAAAmuH,UAAA,GAAAt+H,OAAAmC,eAAAe,EAAAiN,EAAA9P,IAAA8P,EAAA,MCzPIA,EAAY,IA7BV,WAwBF,SAAAjN,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAA3oD,GACVsW,KAAKgqC,MACR,KAAArzC,EAAA,OAAAA,EAAA,EAAA9P,IAAA,OAAA2K,MAxBD,WACIwO,KAAK2uK,eAAiB,UACtB3uK,KAAKw3J,aAAe,WACpBx3J,KAAKwgK,aAAe,gBACpBxgK,KAAKy3J,aAAe,cACpBz3J,KAAK6oI,cAAgB,eACrB7oI,KAAK2xI,aAAe,cACpB3xI,KAAKu3J,WAAa,YAClBv3J,KAAK2/H,aAAe,gBACpB3/H,KAAKygK,aAAe,cACpBzgK,KAAKupJ,SAAW,UAChBvpJ,KAAK0gK,eAAiB,gBACtB1gK,KAAK+qI,gBAAkB,iBACvB/qI,KAAK2gK,eAAiB,gBACtB3gK,KAAK4gK,gBAAkB,iBACvB5gK,KAAK6gK,4BAA8B,2BACnC7gK,KAAK8gK,2BAA6B,mCAClC9gK,KAAK+gK,UAAY,WACjB/gK,KAAKihK,WAAa,YAClBjhK,KAAK4uK,gCAAkC,cAC1C,MAAAvhL,EAIA3D,EAJAjD,UAAAkQ,GAAAjN,CAAA,CAOe,IACpBoN,EAAAojB,EAAAvjB,CAAA,gBAAAjN,EAAAoN,EAAAzJ,GAAA,aAAAA,EAAAU,EAAA+I,EAAA,CAAA8X,QAAA,kBAAAvF,CAAA,QChCM1S,EACF,SAAAjN,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAA3oD,GACVsW,KAAK6uK,OAAS,KAId7uK,KAAK8uK,UAAY,KAoBjB9uK,KAAK+uK,OAAS,KAId/uK,KAAKlU,IAAM,KAOXkU,KAAKgvK,UAAY,KAOjBhvK,KAAKivK,gBAAkB,IAK1B,EAGLt4K,EAAUu4K,6BAA+B,MACzCv4K,EAAUw4K,sBAAwB,MAClCx4K,EAAUy4K,iBAAmB,MAC7Bz4K,EAAU04K,mBAAqB,MAC/B14K,EAAU24K,iBAAmB,MAC7B34K,EAAU44K,sBAAwB,MAClC54K,EAAU64K,oBAAsB,MAChC74K,EAAU84K,iBAAmB,MAC7B94K,EAAU+4K,gBAAkB,MAE5B,IAAA1pL,EAAA2Q,EAAA/Q,EAAAyH,EAAA,MC9DA,SAASkK,EAAoB7N,GAGzB,IAAIoN,EACAzJ,EACEsJ,GAHNjN,EAASA,GAAU,CAAC,GAGIynI,SAClB55H,EAAc7N,EAAOs0I,YACrBpnI,EAAmBlN,EAAO4/K,iBAE1B5xK,EAAShO,EAAOs2G,OAEtB,SAAS7yG,EAAOzD,GACZ,IAAIoN,EAAI,IAAI9Q,EAEZ,GAAKqH,EAAL,CAIA,IAAK,IAAMsJ,KAAOjN,EACVA,EAAG/C,eAAegQ,KAClBG,EAAEH,GAAOjN,EAAGiN,IAIfG,EAAE+3K,SACH/3K,EAAE+3K,OAASxhL,EAAI6mK,aAAe7mK,EAAIvB,KAGjCgL,EAAEi4K,SACHj4K,EAAEi4K,OAAS,IAAIxtK,MAGnBhK,EAAYypK,aAAalqK,EAhBxB,CAiBJ,CAED,SAASjJ,EAAiBnE,GAClBA,EAAEwL,QAIN7H,EAAM3D,EAAEsoI,SACX,CAED,SAASjlI,EAAyBrD,GAC9ByD,EAAO,CACH2hL,UAAW9oL,EAAAypL,iBACXR,gBAAiBvlL,EAAEo1J,OAE1B,CAED,SAAS/wJ,IACLZ,EAAO,CACH2hL,UAAW9oL,EAAA0pL,iBAElB,CAiBD,SAAS5hL,EAAcpE,GAfvB,IAA0BoN,EAgBdpN,EAAE4/J,SACD1yJ,EAAiB4gK,eAhBD,KADH1gK,EAkBGpN,EAAE8H,OAjBnB0uK,cACgB,MAAnBppK,EAAGopK,cACHppK,EAAGopK,cAAgB,KACnBppK,EAAGopK,aAAe,KAClBppK,EAAGopK,cAAgB,MACpB/yK,EAAO,CACH2hL,UAAWh4K,EAAGopK,cAAgBl6K,EAAAspL,iBAC9BxjL,IAAKgL,EAAGhL,IACRijL,OAAQj4K,EAAGggK,UACXmY,gBAAiBn4K,EAAGqtJ,kBAa/B,CAED,SAASn2J,EAAgBtE,GACrB,IACIoN,EAEJ,OAHapN,EAAEwL,MAAQxL,EAAEwL,MAAM2pB,KAAO,GAIlC,KAAK8wJ,WAAWC,kBACZ94K,EAAY9Q,EAAAspL,iBACZ,MACJ,KAAKK,WAAWE,iBACZ/4K,EAAY9Q,EAAAwpL,oBACZ,MACJ,QACI,OAGRriL,EAAO,CACH2hL,UAAWh4K,GAElB,CAyCD,OALAA,EAAW,CACPi9H,WAnCJ,WACIp9H,EAASmlB,GAAGpkB,EAAOg4H,iBAAkB7hI,EAAkBiJ,GACvDH,EAASmlB,GACLpkB,EAAOu4H,4CACPljI,EACA+J,GAEJH,EAASmlB,GAAGpkB,EAAOsxJ,aAAcl7J,EAAegJ,GAChDH,EAASmlB,GAAGpkB,EAAOmoK,eAAgB/xK,EAAegJ,GAClDH,EAASmlB,GAAGpkB,EAAOkpI,eAAgB5yI,EAAiB8I,GACpDH,EAASmlB,GACLl2B,EAAAs0B,EAAA41J,wBACA/hL,EACA+I,EAEP,EAqBG4hC,MAnBJ,WACI/hC,EAASylB,IAAI1kB,EAAOg4H,iBAAkB7hI,EAAkBiJ,GACxDH,EAASylB,IACL1kB,EAAOu4H,4CACPljI,EACA+J,GAEJH,EAASylB,IAAI1kB,EAAOsxJ,aAAcl7J,EAAegJ,GACjDH,EAASylB,IAAI1kB,EAAOmoK,eAAgB/xK,EAAegJ,GACnDH,EAASylB,IAAI1kB,EAAOkpI,eAAgB5yI,EAAiB8I,GACrDH,EAASylB,IACLx2B,EAAAs0B,EAAA41J,wBACA/hL,EACA+I,EAEP,EAQJ,CAEDS,EAAoB8rH,sBAAwB,sBAC5C,IAAAzsH,EAAe4rH,OAAOE,aAAaY,oBAAoB/rH,GAAAG,EAAArK,EAAA,MCjJvD,SAASF,EAAgBzD,GAErBA,EAASA,GAAU,CAAC,EACpB,IAEIoN,EACAzJ,EAHAsJ,GAAA,EACA3Q,EAAUga,KAAK9V,QAIftE,EAAe8D,EAAO2/K,aAyD1B,OARAvyK,EAAW,CACPi9H,WAhDJ,SAAoBrqI,GACZA,GAAMA,EAAG3D,SACT2D,EAAG0J,SAAQ,SAAA1J,GACP,IAAIoN,EAAQpN,EAAEqmL,UACVp5K,EAAMG,EAAQpN,EAAEgY,SAEpBrU,EAAOg5E,IAAIvvE,EAAOH,EACrB,IAEDA,IAAqBjN,EAAG,GAAGsmL,kBAElC,EAsCGt3I,MApCJ,WACIrrC,EAAOm0D,OACV,EAmCG6tD,UA7BJ,WACI,IACI3lH,EADAoN,EAAYzJ,EAAOtH,OAGvB,IAAK+Q,EACD,OAAO,EAKXpN,EAAOiN,GACF,IAAI4K,MAAOC,UAAY,IACxB5b,EAAa88B,YAEjB,IAAK,IAAI18B,EAAI,EAAGA,EAAI8Q,EAAW9Q,GAAK,EAAG,CACnC,IAAIuR,EAAQlK,EAAOiV,MAAMtc,GACrB4Q,EAAMvJ,EAAOmV,IAAIxc,GAErB,GAAKuR,GAAS7N,GAAUA,EAAOkN,EAC3B,OAAO,CAEd,CAED,OAAO,CACV,GA3BGvJ,GAAA,EAASqK,EAAAwiB,GAAiBl0B,GAASsE,SAqChCwM,CACV,CAED3J,EAAgBk2H,sBAAwB,kBACxC,IAAAx1H,EAAe20H,OAAOE,aAAaiC,gBAAgBx3H,GCpEnD,SAASJ,IA2DL,MAAO,CACHkjL,UAvDJ,SAASvmL,EAAUoN,GACf,IAEIzJ,EACAsJ,EAHA3Q,EAAQ,GACRJ,EAAM,GASV,IAAKyH,KAAOyJ,EACR,GAAIA,EAAOnQ,eAAe0G,IAA8B,IAArBA,EAAI8E,QAAQ,KAAa,CAUxD,GALK,OAJLwE,EAAQG,EAAOzJ,MAKXsJ,EAAQ,IAIRzQ,MAAMC,QAAQwQ,GAAQ,CAEtB,IAAKA,EAAM5Q,OACP,SAGJH,EAAM,GAEN+Q,EAAMvD,SAAQ,SAAU0D,GACpB,IAAIzJ,EAA+D,WAAnD7G,OAAOC,UAAUC,SAASE,KAAKkQ,GAAGsJ,MAAM,GAAI,GAE5Dxa,EAAI6kB,KAAKpd,EAAYyJ,EAAIpN,EAAUoN,GACtC,IAEDH,EAAQ/Q,EAAI2pB,IAAI1e,oBAAoBoH,KAAK,IAC5C,KAA2B,iBAAVtB,EACdA,EAAQ9F,mBAAmB8F,GACpBA,aAAiB4K,KACxB5K,EAAQA,EAAMo6J,cACU,iBAAVp6J,IACdA,EAAQ2B,KAAKwU,MAAMnW,IAGvB3Q,EAAMykB,KAAKpd,EAAM,IAAMsJ,EAC1B,CAKL,OAAO3Q,EAAMiS,KAAK,IACrB,EAKJ,CAEDlL,EAAiBs2H,sBAAwB,mBACzC,IAAAt1H,EAAey0H,OAAOE,aAAaY,oBAAoBv2H,GCjEvD,SAASe,IAIL,IAWIpE,EACAoN,EACAzJ,EAbAsJ,EAASjK,OAAO4rC,QAAU5rC,OAAOwjL,SAGjClqL,EAAYgxC,YACZpxC,EAAY0S,KAAK+U,IAAI,EAAiC,EAA9BrnB,EAAUmqL,mBAAyB,EAW/D,SAAS54K,IACDZ,IACKjN,IACDA,EAAgB,IAAI1D,EATP,KAWjB2Q,EAAOy5K,gBAAgB1mL,GACvBoN,EAAQ,EAEf,CAiCD,OANAzJ,EAAW,CACP0sE,OA1BJ,SAAc1sE,EAAKrH,GACf,IAAI4Q,EAqBJ,OAnBKvJ,IACDA,EAAM,GAGLrH,IACDA,EAAM,GAGN2Q,GACIG,IAAUpN,EAAc3D,QACxBwR,IAGJX,EAAIlN,EAAcoN,GAASlR,EAC3BkR,GAAS,GAETF,EAAI0B,KAAKyhE,SAGLnjE,GAAK5Q,EAAMqH,GAAQA,CAC9B,GAMDkK,IAEOlK,CACV,CAEDS,EAAIu1H,sBAAwB,MAC5B,IAAAr1H,EAAew0H,OAAOE,aAAaY,oBAAoBx1H,GAAAN,EAAAH,EAAA,MC/DvD,SAASD,EAAa1D,GAElB,IAAIoN,EADJpN,EAASA,GAAU,CAAC,EAGpB,IACI2D,EACAsJ,EACA3Q,EACAJ,EACA2R,EACAX,EACAc,EAPAvK,EAAU6S,KAAK9V,QAWf2D,EAAkB,GAEhBd,EAAmBrD,EAAO4/K,iBAuHhC,SAASx7K,IACLlI,GAAA,EACA2R,GAAA,EACAX,EAAe,KACfc,EAAkB,IACrB,CAmBD,OARAZ,EAAW,CACPu5K,OA3FJ,SAAgB3mL,EAAMoN,GACb5Q,MAAMC,QAAQ2Q,KACfA,EAAM,CAACA,IAOPS,GAAqBG,EAAgB23G,aAIrCv4G,EAAI1D,SAAQ,SAAU0D,GAClB,IAAI9Q,EAAMqH,EAAiB4iL,UAAUn5K,GAGVpN,IAASqD,EAAiBk0K,aACjDj7K,EAAM,cAAHsD,OAAiBI,EAAjB,KAAAJ,OAAyBtD,IArD5C,SAAsB0D,EAAKoN,EAAWzJ,GAClC,IAAIrH,EAAM,IAAIwK,eACdxK,EAAI+M,gBAAkB4D,EAAsBqnJ,6BAA6BjxJ,EAAiB6hL,iCAC1F,IAAMhpL,EAAa,WACf,IAAI8D,EAAWmE,EAAgBsE,QAAQnM,IAErB,IAAd0D,IAGAmE,EAAgBqjB,OAAOxnB,EAAU,KAGhC1D,EAAIsL,QAAU,KAAStL,EAAIsL,OAAS,MAKjCjE,GACAA,IAGX,EAEDQ,EAAgB4c,KAAKzkB,GAErB,IACIA,EAAI0L,KAAK,MAAOhI,GAChB1D,EAAIiL,UAAYrL,EAChBI,EAAIuM,QAAU3M,EACdI,EAAIkO,MAGP,CAFC,MAAOxK,GACL1D,EAAIuM,SACP,CACJ,CAjCD,CA2DYvM,EAAM,GAAHsD,OAAMsN,EAAN,KAAAtN,OAAsBtD,GAIP,GAAM,WAOpBuR,GAAA,CACH,GACJ,GAER,EAqDGw8H,WAnDJ,SAAoBrqI,EAAOoN,GACvB,IAAIzJ,EAQJ,GANAqK,EAAkBZ,IAElBF,EAAelN,EAAM4mL,iBAKjB,MAAM,IAAIp5K,MACN,iDAOHtR,KACDyH,EAAc3D,EAAM6mL,kBAMgB,MAAhBljL,GAA0BA,EAAc,KAASrH,EAAsB+zE,YACvFxiE,GAAA,GAGJ3R,GAAA,EAEP,EAqBG8yC,MAZJ,WAMI5qC,GACH,GAlIGT,EAAmBU,EAAiBZ,GAAS01H,cAC7C78H,EAAwBgI,EAAIb,GAAS01H,cACrClsH,GAAA,EAAwBnJ,EAAA0sB,GAAsB/sB,GAAS01H,cAEvD/0H,IAwIGgJ,CACV,CAED1J,EAAai2H,sBAAwB,eACrC,IAAA7uH,EAAeguH,OAAOE,aAAaiC,gBAAgBv3H,GCtKnD,SAASgL,EAAiB1O,GACtBA,EAASA,GAAU,CAAC,EAEpB,IAKIoN,EALEzJ,EAA6B,CAC/B,8BAA+BmH,GAG7BmC,EAAUqJ,KAAK9V,QAEflE,EAAS0D,EAAO4V,MAAQ5V,EAAO4V,MAAM4jH,UAAUpsH,GAAY,CAAC,EAC5DlR,EAAmB8D,EAAO4/K,iBAC1B/xK,EAAmB7N,EAAO4gJ,kBAAoB,CAAC,EAkCrD,MANW,CACPhgJ,OA3BJ,SAAgBZ,EAAOoN,GACnB,IAAIF,EAEJ,KACIA,EAAYvJ,EAA2B3D,EAAM+6C,aAAa9tC,GAASrM,OAAO,CACtEg/K,iBAAkB1jL,EAClB0kJ,iBAAkB/yI,KAGZw8H,WAAWrqI,EAAOoN,EAI/B,CAHC,MAAOA,GACLF,EAAY,KACZ5Q,EAAOkP,MAAP,iEAAA5L,OAA8EI,EAAM+6C,YAApF,MAAAn7C,OAAoGwN,EAAElB,QAAtG,KACH,CAED,OAAOgB,CACV,EAYGuoG,SAVJ,SAAkBz1G,EAAaoN,GAC3BzJ,EAA2B3D,GAAeoN,CAC7C,EASG05K,WAPJ,SAAoB9mL,UACT2D,EAA2B3D,EACrC,EASJ,CAED0O,EAAiBirH,sBAAwB,mBACzC,IAAAt0G,EAAeyzG,OAAOE,aAAaY,oBAAoBlrH,GCjDvD,SAAS0H,EAAoBpW,GAEzB,IAAIoN,EAAY,GAGVzJ,EAAmB0hB,EAAiB/O,KAAK9V,SAAS24H,YAAYn5H,GAgCpE,MANW,CACPqqI,WAzBJ,SAAoBrqI,EAAWiN,GAK3BjN,EAAU4sB,MAAK,SAAA5sB,GACX,IAAI1D,EAAWqH,EAAiB/C,OAAOZ,EAAGiN,GAE1C,GAAI3Q,EAEA,OADA8Q,EAAU2T,KAAKzkB,IAAA,CAGtB,GACJ,EAaG0yC,MAXJ,WACI5hC,EAAU1D,SAAQ,SAAA1J,GAAC,OAAIA,EAAEgvC,OAAN,IACnB5hC,EAAY,EACf,EASGu5K,OAPJ,SAAgB3mL,EAAM2D,GAClByJ,EAAU1D,SAAQ,SAAA0D,GAAC,OAAIA,EAAEu5K,OAAO3mL,EAAM2D,EAAnB,GACtB,EASJ,CAEDyS,EAAoBujH,sBAAwB,sBAC5C,IAAA7qH,EAAegqH,OAAOE,aAAaiC,gBAAgB7kH,GCxCnD,SAASpH,IACL,MAAO,CACH+3K,0BAA2B,SAAU/mL,EAAKoN,EAAGzJ,GACzC,IAAIsJ,EAAKjN,EAYT,OAVIoN,IACAH,GAAM,IAAMG,EAERzJ,GAAQA,EAAKtH,SACb4Q,GAAM,IAAMtJ,GAGhBsJ,GAAM,KAGHA,CACV,EAED+5K,UAAW,SAAUhnL,GACjB,IAAKA,EACD,MAAM,IAAIwN,MAAM,aAGpB,GAAI8nB,MAAMt1B,GACN,MAAM,IAAIwN,MAAM,YAKpB,GAAIxN,EAAO,EACP,MAAM,IAAIwN,MAAM,sBAGpB,OAAOxN,CACV,EAER,CAEDgP,EAAe2qH,sBAAwB,iBACvC,IAAAx9H,EAAe28H,OAAOE,aAAaY,oBAAoB5qH,GCxCvD,SAAS+D,EAAmB/S,GAGxB,IACIoN,EACAzJ,EACAsJ,EACA3Q,EACAJ,EANJ8D,EAASA,GAAU,CAAC,EAQpB,IAAI6N,EAAUyI,KAAK9V,QACf0M,EAAiB/Q,EAAe0R,GAASsrH,cAEzCnrH,EAAY,GAEVvK,EAAmBzD,EAAO4/K,iBAgBhC,SAASz7K,IACL,IAAInE,EAfR,WACI,IACI,OAAOlD,OAAOP,KAAKyR,GAAW6X,KAC1B,SAAA7lB,GAAG,OAAIgO,EAAUhO,EAAd,IACLktB,QACE,SAACltB,EAAGoN,GACA,OAAQpN,EAAEua,MAAQnN,EAAEmN,MAASva,EAAIoN,CACpC,GAIR,CAFC,MAAOpN,GACL,MACH,CACJ,CAZD,GAiBQA,GACI9D,IAAqB8D,EAAGoN,IACxBlR,EAAmB8D,EAAGoN,EACtBA,EAAoBu5K,OAAO15K,EAAMjN,GAG5C,CAiCD,MANW,CACPqqI,WA1BJ,SAAoBrqI,EAAU9D,EAAI2R,GAC1B3R,IAGAyH,EAAIuJ,EAAe85K,UAAUn5K,GAC7BT,EAAsBlR,EACtB+Q,EAAOC,EAAe65K,0BAA0B/mL,EAAU6N,GAC1DvR,EAAWgpC,YAAYnhC,EAAkBR,GAEhD,EAkBGqrC,MAhBJ,WACItJ,cAAcppC,GACdA,EAAW,KACXqH,EAAI,EACJyJ,EAAsB,KACtBlR,EAAmB,IACtB,EAWG+qL,gBATJ,SAAyBjnL,EAAQoN,EAAIzJ,GAC7B3D,IAAWyD,EAAiBsqK,eAC5B//J,EAAUrK,GAAQyJ,EAEzB,EASJ,CAED2F,EAAmB4mH,sBAAwB,qBAC3C,IAAA5jH,EAAe+iH,OAAOE,aAAaiC,gBAAgBloH,GCrBnD2C,EAAeojH,OAAOE,aAAaiC,iBAxDnC,SAA0Bj7H,GAGtB,IACIoN,EAEAzJ,GAJJ3D,EAASA,GAAU,CAAC,GAIEynI,SAChBx6H,EAAmBjN,EAAO4/K,iBAEhC,SAAStjL,IAELqH,EAAS+uB,IACLx2B,EAAAs0B,EAAA02J,gCACA5qL,EACAga,MAKJ3S,EAASgxB,QAAQz4B,EAAAs0B,EAAA41J,wBACpB,CAiCD,MANW,CACP/7C,WA1BJ,SAAoBrqI,EAAQiN,GACpBA,IACAG,EAAsBH,EAEtBtJ,EAASyuB,GACLl2B,EAAAs0B,EAAA02J,gCACA5qL,EACAga,MAGX,EAiBG04B,MAfJ,WACI5hC,EAAsB,IACzB,EAcG65K,gBAZJ,SAAyBjnL,EAAQ2D,GAEzB3D,IAAWiN,EAAiBsqK,YACxBnqK,GACAA,EAAoBu5K,OAAO3mL,EAAQ2D,EAG9C,EASJ,ICtDD,SAASuS,EAAgBlW,GAGrB,IACIoN,EACAzJ,EACAsJ,EACA3Q,EACAJ,EANJ8D,EAASA,GAAU,CAAC,EAQpB,IAAI6N,EAAY,GAEZX,EAAiB/Q,EAAema,KAAK9V,SAAS24H,cAE5CnrH,EAAmBhO,EAAO4/K,iBAEhC,SAASn8K,IACL,IAAIzD,EAAM6N,EAEN7N,EAAI3D,QACA+Q,GACAA,EAAoBu5K,OAAOrqL,EAAM0D,GAIzC6N,EAAY,EACf,CAgDD,MANW,CACPw8H,WAzCJ,SAAoBrqI,EAAU6N,EAAIG,EAAM7J,GAChC0J,IAIAlK,EAAIuJ,EAAe85K,UAAUh5K,GAE7BZ,EAAsBS,EAElB1J,GAAeA,EAAY9H,SAC3B4Q,EAAO9I,GAGX7H,EAAO4Q,EAAe65K,0BAClB/mL,EACAgO,EACA7J,GAGJjI,EAAWopC,YAAY7hC,EAAkBE,GAEhD,EAqBGqrC,MAnBJ,WACItJ,cAAcxpC,GACdA,EAAW,KACXyH,EAAI,KACJsJ,EAAO,KACPY,EAAY,GACZT,EAAsB,IACzB,EAaG65K,gBAXJ,SAAyBjnL,EAAQoN,GACzBpN,IAAWgO,EAAiB8/J,eACvB7gK,GAASA,IAASG,EAAGnP,MACtB4P,EAAUkT,KAAK3T,GAG1B,EASJ,CAED8I,EAAgByjH,sBAAwB,kBACxC,IAAAzgH,EAAe4/G,OAAOE,aAAaiC,gBAAgB/kH,GC7EnD,SAASC,IAEL,IACInW,EACAoN,EA2BJ,MANW,CACPi9H,WApBJ,SAAoB1mI,EAAMsJ,GACtBjN,EAAa2D,EACbyJ,EAAsBH,CACzB,EAkBG+hC,MAhBJ,WACI5hC,EAAsB,KACtBpN,OAAA,CACH,EAcGinL,gBAZJ,SAAyBtjL,EAAQsJ,GAEzBtJ,IAAW3D,GACPoN,GACAA,EAAoBu5K,OAAO3mL,EAAYiN,EAGlD,EASJ,CAEDkJ,EAAqBwjH,sBAAwB,uBAC7C,IAAA1jH,EAAe6iH,OAAOE,aAAaiC,gBAAgB9kH,GCjCnD,SAAS8C,EAAsBjZ,GAG3B,IAAIoN,EACEzJ,GAFN3D,EAASA,GAAU,CAAC,GAEE4V,MAAQ5V,EAAO4V,MAAM4jH,UAAUpsH,GAAY,CAAC,EAG9DH,EAAW,gDAET3Q,EAAUga,KAAK9V,QACjBtE,EAAuB,CACvB84K,YAAgBj/J,EAChBy/J,UAAgB9/J,EAChBo/J,SAAgB57J,EAChBg8J,SAAgBj/J,EAChB8+J,cAAgB9+J,EAChB4+J,QAAgB5+J,GA6CpB,MANW,CACPrV,OArCJ,SAAgBwM,EAAUS,GACtB,IACIX,EADAc,EAAUZ,EAAS8iB,MAAMjjB,GAG7B,GAAKe,EAAL,CAIA,KACId,EAAUhR,EAAqB8R,EAAQ,IAAI1R,GAASsE,OAAO,CACvD6mI,SAAUznI,EAAOynI,SACjBm4C,iBAAkB5/K,EAAO4/K,oBAGrBv1C,WACJr8H,EAAQ,GACRH,EACAG,EAAQ,GACRA,EAAQ,GAKf,CAHC,MAAOhO,GACLkN,EAAU,KACVvJ,EAAO6H,MAAP,4DAAA5L,OAAyEoO,EAAQ,GAAjF,eAAApO,OAAiGoO,EAAQ,GAAzG,MAAApO,OAAgHoO,EAAQ,GAAxH,MAAApO,OAA+HI,EAAEkM,QAAjI,KACH,CAED,OAAOgB,CAnBN,CAoBJ,EAYGuoG,SAVJ,SAAkBz1G,EAAKoN,GACnBlR,EAAqB8D,GAAOoN,CAC/B,EASG05K,WAPJ,SAAoB9mL,UACT9D,EAAqB8D,EAC/B,EASJ,CAEDiZ,EAAsB0gH,sBAAwB,wBAC9C,IAAAthH,EAAeygH,OAAOE,aAAaY,oBAAoB3gH,GCpEvD,SAAS3B,EAA0BtX,GAE/BA,EAASA,GAAU,CAAC,EACpB,IAEIoN,EAFAzJ,EAAW,GAGTsJ,EAAUqJ,KAAK9V,QACflE,EAAW0D,EAAOynI,SAClBvrI,EAAS8D,EAAOs2G,OAElBzoG,EAAwBwK,EAAsBpL,GAASksH,YAAY,CACnEvjH,MAAO5V,EAAO4V,MACd6xH,SAAUznI,EAAOynI,SACjBm4C,iBAAkB5/K,EAAO4/K,mBAG7B,SAAS1yK,EAAOlN,GACZ2D,EAAS+F,SAAQ,SAAA0D,GACbA,EAAQ65K,gBAAgBjnL,EAAE4/J,OAAQ5/J,EAAE8H,MAAO9H,EAAEu6H,UAChD,GACJ,CAsED,OALAntH,EAAW,CACPi9H,WAhEJ,SAAoBrqI,EAASiN,GACzBjN,EAAQqO,MAAM,KAAK3E,SACf,SAAC1J,EAAGoN,EAAM9Q,GACN,IAAIJ,EAKJ,IAAyB,IAApB8D,EAAEyI,QAAQ,OAAoC,IAApBzI,EAAEyI,QAAQ,KAAa,CAClD,IAAIyE,EAAQ5Q,EAAG8Q,EAAO,GAElBF,IAC6B,IAAxBA,EAAMzE,QAAQ,OACU,IAAxByE,EAAMzE,QAAQ,OACnBzI,GAAK,IAAMkN,SAGJ5Q,EAAG8Q,EAAO,GAExB,EAEDlR,EAAU2R,EAAsBjN,OAC5BZ,EACAiN,KAIAtJ,EAASod,KAAK7kB,EAErB,IAGLI,EAAS81B,GACLl2B,EAAOojK,aACPpyJ,EACAE,GAGJ9Q,EAAS81B,GACLl2B,EAAOi6K,eACPjpK,EACAE,EAEP,EAsBG4hC,MApBJ,WACI1yC,EAASo2B,IACLx2B,EAAOojK,aACPpyJ,EACAE,GAGJ9Q,EAASo2B,IACLx2B,EAAOi6K,eACPjpK,EACAE,GAGJzJ,EAAS+F,SAAQ,SAAA1J,GAAO,OAAIA,EAAQgvC,OAAZ,IAExBrrC,EAAW,EACd,EAQJ,CAED2T,EAA0BqiH,sBAAwB,4BAClD,IAAAlnH,EAAeqmH,OAAOE,aAAaiC,gBAAgB3jH,GC5FnD,SAASC,EAAkBvX,GAGvB,IAAIoN,EACAzJ,EACAsJ,EAHJjN,EAASA,GAAU,CAAC,EAMpB,IAAI1D,EAAUga,KAAK9V,QAgCnB,SAAStE,IACDkR,GACAA,EAA0B4hC,QAG1BrrC,GACAA,EAAoBqrC,QAGpB/hC,GACAA,EAAgB+hC,OAEvB,CAOD,MALW,CACPq7F,WA7CJ,SAAoBx8H,GAChB,KACIZ,EAAkB9I,EAAgB7H,GAASsE,OAAO,CAC9C++K,aAAc3/K,EAAO2/K,gBAGTt1C,WAAWx8H,EAAas5K,QAExCxjL,EAAsBmL,EAAoBxS,GAASsE,OAAO,CACtDgV,MAAO5V,EAAO4V,MACdgqK,iBAAkB5/K,EAAO4/K,iBACzBh/B,iBAAkB5gJ,EAAO4gJ,oBAGTvW,WAAWx8H,EAAau5K,UAAWn6K,IAEvDG,EAA4BqF,EAA0BnW,GAASsE,OAAO,CAClEgV,MAAO5V,EAAO4V,MACd6xH,SAAUznI,EAAOynI,SACjBm4C,iBAAkB5/K,EAAO4/K,iBACzBtpE,OAAQt2G,EAAOs2G,UAGO+zB,WAAWx8H,EAAagvH,QAASl5H,EAI9D,CAHC,MAAO3D,GAEL,MADA9D,IACM8D,CACT,CACJ,EAkBGgvC,MAAY9yC,EAInB,CAEDqb,EAAkBoiH,sBAAwB,oBAC1C,IAAA9uH,EAAeiuH,OAAOE,aAAaiC,gBAAgB1jH,GCvDnDjU,EARI,SAAAtD,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAA3oD,GAEVsW,KAAKumH,QAAU,GACfvmH,KAAK6wK,MAAQ,GACb7wK,KAAK8wK,UAAY,EACpB,ECMLjuK,EAXI,SAAAnZ,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAA3oD,GAGVsW,KAAK+vK,UAAY,EACjB/vK,KAAK0B,SAAW,IAGhB1B,KAAKgwK,mBAAA,CACR,ECOL91J,EAXI,SAAAxwB,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAA3oD,GAEVsW,KAAKykC,YAAc,GACnBzkC,KAAKxO,MAAQ,GAGbwO,KAAKswK,gBAAkB,GACvBtwK,KAAKuwK,eAVmB,GAW3B,EC3CL,SAASztK,EAAiBpZ,GAEtB,IACIoN,GAFJpN,EAASA,GAAU,CAAC,GAECmzG,QACfxvG,EAAY3D,EAAOgnJ,UAgHzB,MAJW,CACPqgC,WAzEJ,SAAoBrnL,GAChB,IAAIiN,EAAU,GAoEd,OAlEIjN,GAAYA,EAASsnL,iBACrBtnL,EAASsnL,gBAAgB59K,SAAQ,SAAApN,GAC7B,IAAIJ,EAAc,IAAIoH,EAClBuK,EAAYT,EAAQ8qI,aAAal4I,GAEjC1D,EAAOW,eAAe,aACtBf,EAAY2gI,QAAUvgI,EAAOugI,QAK7BvgI,EAAOirL,eACPjrL,EAAOirL,cAAc79K,SAAQ,SAAAuD,GACzB,IAAI3Q,EAAa,IAAI6c,EAErB7c,EAAW+pL,UApD/B,SAAkCrmL,EAAUiN,EAAS3Q,GACjD,IAAIJ,EACA2R,EACAX,EAAwB,EA4B5B,OA1BID,EAKAC,EAAwBE,EAAQorI,yBAAyBx4I,GAAY,KAKrE9D,EAAYkR,EAAQ8nI,kBAAkBl1I,IAExB3D,SACV6Q,EAAwBhR,EAAU,GAAG0c,OAO7C/K,EAAqBX,EAEjB5Q,GAASA,EAAMW,eAAe0G,EAAUulK,cACxCr7J,GAAsBvR,EAAM+pL,WAGzBx4K,CACV,CAhCD,CAqDiD7N,EAAU6N,EAAWZ,GAE9CA,EAAMhQ,eAAe,YACrBX,EAAW0b,SAAW/K,EAAM+K,SAI5B1b,EAAW0b,SAAW5K,EAAQihJ,YAAYruJ,GAG9C1D,EAAWgqL,kBAAoBz4K,EAE/B3R,EAAYirL,MAAMpmK,KAAKzkB,EAC1B,IAGDA,EAAOkrL,oBACPlrL,EAAOkrL,kBAAkB99K,SAAQ,SAAA1J,GAC7B,IAAIoN,EAAiB,IAAIojB,EAErBxwB,EAAU/C,eAAe0G,EAAU0oJ,iBACnCj/I,EAAe2tC,YAAc/6C,EAAU+6C,YAMvC/6C,EAAU/C,eAAe,WACzBmQ,EAAetF,MAAQ9H,EAAU8H,OAGjC9H,EAAU/C,eAAe0G,EAAUohL,qBACnC33K,EAAew5K,gBAAkB5mL,EAAU2D,EAAUohL,oBAGrD/kL,EAAU/C,eAAe0G,EAAUqhL,mBACnC53K,EAAey5K,eAAiB7mL,EAAU2D,EAAUqhL,kBAGxD9oL,EAAYkrL,UAAUrmK,KAAK3T,GAC9B,IAMLH,EAAQ8T,KAAK7kB,IAChB,IAGE+Q,CACV,EAOJ,CAEDmM,EAAgBugH,sBAAwB,kBACxC,IAAA7/G,EAAeg/G,OAAOE,aAAaY,oBAAoBxgH,GCzFvD,SAASlV,EAA4BlE,GAGjC,IAAIoN,EADJpN,EAASA,GAAU,CAAC,EAEpB,IAAI2D,EAAqB,CAAC,EACtBsJ,EAAUqJ,KAAK9V,QACflE,EAAW0D,EAAOynI,SAChB55H,EAAS7N,EAAOs2G,OAEtB,SAASppG,EAAOE,GACZ,IAAIA,EAAE5B,MAAN,CAKA,IAAIqC,EAAsB/Q,OAAOP,KAAKoH,GAEtBmW,EAAgB7M,GAASksH,YAAY,CACjDhmB,QAASnzG,EAAOmzG,QAChB6zC,UAAWhnJ,EAAOgnJ,YACnBqgC,WAAWj6K,EAAEk7H,UAER5+H,SAAQ,SAAA0D,GACZ,IAAM9Q,EAAM06B,KAAKC,UAAU7pB,GAE3B,GAAKzJ,EAAmB1G,eAAeX,GAUnCuR,EAAoB2Z,OAAOlrB,EAAK,QAThC,IACI,IAAIJ,EAAa2O,EAAkBoC,GAASrM,OAAOZ,GACnD9D,EAAWmuI,WAAWj9H,GACtBzJ,EAAmBrH,GAAOJ,CAG7B,CAFC,MAAO8D,GAER,CAKR,IAGD6N,EAAoBnE,SAAQ,SAAA1J,GACxB2D,EAAmB3D,GAAGgvC,eACfrrC,EAAmB3D,EAC7B,IAED1D,EAASq4B,QAAQz4B,EAAAs0B,EAAA02J,gCAjChB,CAkCJ,CAED,SAASl5K,IACLlR,OAAOP,KAAKoH,GAAoB+F,SAAQ,SAAA1J,GACpC2D,EAAmB3D,GAAKgvC,OAC3B,IAEDrrC,EAAqB,CAAC,CACzB,CAiBD,OALAyJ,EAAW,CACP4hC,MANJ,WACI1yC,EAASo2B,IAAI7kB,EAAOm4H,iBAAkB94H,EAAQE,GAC9C9Q,EAASo2B,IAAI7kB,EAAO8xJ,yBAA0B3xJ,EAAyBZ,EAC1E,GAPG9Q,EAAS81B,GAAGvkB,EAAOm4H,iBAAkB94H,EAAQE,GAC7C9Q,EAAS81B,GAAGvkB,EAAO8xJ,yBAA0B3xJ,EAAyBZ,GAanEA,CACV,CAEDlJ,EAA4By1H,sBAAwB,8BACpD,IAAAlyG,EAAeqxG,OAAOE,aAAaiC,gBAAgB/2H,GCzEnD,SAAS8b,IAEL,IAAIhgB,EAAUsW,KAAK9V,QA0CnB,MANW,CACPk/K,uBA5BJ,SAAgCtyK,GAQ5B,OAPsBF,EAAoBlN,GAASm5H,YAAY,CAC3DsO,SAAUr6H,EAAOq6H,SACjB6M,YAAalnI,EAAOknI,YACpBsrC,iBAAkBxyK,EAAOwyK,iBACzBtpE,OAAQlpG,EAAOkpG,SAEC+zB,aACb5iH,EAA4BznB,GAASY,OAAOwM,EACtD,EAoBGq6K,oBAdJ,WACI,OAAOpiK,EAAiBrlB,GAASm5H,aACpC,EAaGuuD,yBAPJ,WACI,OAAOrvK,EAAsBrY,GAASm5H,aACzC,EASJ,CAEDn5G,EAAiB25G,sBAAwB,mBACzC,IAAMl9G,EAAUq8G,OAAOE,aAAaiC,gBAAgBj7G,GACpDvD,EAAQ65F,OAASp6G,EAAAs0B,EACjBsoG,OAAOE,aAAamC,mBAAmBn7G,EAAiB25G,sBAAuBl9G,GAC/E,IAAAkD,EAAAlD,CAAA,gBAAAzc,EAAAoN,EAAAzJ,GAAA,sBAAAsJ,EAAAjN,GAAA,OAAAiN,EAAA,mBAAA1J,QAAA,iBAAAA,OAAA85E,SAAA,SAAAr9E,GAAA,cAAAA,CAAA,WAAAA,GAAA,OAAAA,GAAA,mBAAAuD,QAAAvD,EAAA5D,cAAAmH,QAAAvD,IAAAuD,OAAAxG,UAAA,gBAAAiD,CAAA,EAAAiN,EAAAjN,EAAA,UAAA1D,EAAA0D,EAAAoN,GAAA,OAAA9Q,EAAAQ,OAAA4nI,gBAAA,SAAA1kI,EAAAoN,GAAA,OAAApN,EAAA8oD,UAAA17C,EAAApN,CAAA,EAAA1D,EAAA0D,EAAAoN,EAAA,UAAAlR,EAAA8D,EAAAoN,GAAA,OAAAA,GAAA,WAAAH,EAAAG,IAAA,mBAAAA,EAAA,SAAApN,GAAA,YAAAA,EAAA,UAAAwxC,eAAA,oEAAAxxC,CAAA,EAAAA,GAAAoN,CAAA,UAAAS,EAAA7N,GAAA,OAAA6N,EAAA/Q,OAAA4nI,eAAA5nI,OAAAuC,eAAA,SAAAW,GAAA,OAAAA,EAAA8oD,WAAAhsD,OAAAuC,eAAAW,EAAA,EAAA6N,EAAA7N,EAAA,KCrCIkN,EAAyB,IAfvB,SAAAlN,IAAA,SAAAA,EAAAoN,GAAA,sBAAAA,GAAA,OAAAA,EAAA,UAAAu7C,UAAA,sDAAA3oD,EAAAjD,UAAAD,OAAA8D,OAAAwM,GAAAA,EAAArQ,UAAA,CAAAX,YAAA,CAAA0L,MAAA9H,EAAAo7H,UAAA,EAAAt9C,cAAA,KAAA1wE,GAAA9Q,EAAA0D,EAAAoN,EAAA,EAAAF,EAAAlN,GAAA,IAAAoN,EAAAzJ,EAAAsJ,GAAAG,EAAAF,EAAAvJ,EAAA,kCAAA45E,UAAAA,QAAAC,UAAA,YAAAD,QAAAC,UAAAmnD,KAAA,+BAAAC,MAAA,oBAAA9nB,QAAA//G,UAAAF,QAAAK,KAAAqgF,QAAAC,UAAAs/B,QAAA,6BAAA98G,GAAA,4BAAAA,EAAAiN,EAAAY,EAAAT,GAAA,GAAAzJ,EAAA,KAAArH,EAAAuR,EAAA,MAAAzR,YAAA4D,EAAAu9E,QAAAC,UAAAvwE,EAAA3O,UAAAhC,EAAA,MAAA0D,EAAAiN,EAAAyU,MAAA,KAAApjB,WAAA,OAAApC,EAAA,KAAA8D,EAAA,GACF,SAAAkN,IAAe,IAAAlN,EAAA,gBAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,2CAAAz7C,IACXlN,EAAAiN,EAAA/P,KAAA,OAEKgqL,gCAAkC,uCACvClnL,EAAKomL,wBAA0B,iCAM/BpmL,EAAK+xJ,oBAAsB,oBAVhB/xJ,CAWd,QAAAkN,CAAA,CAG4B,CAf3BvJ,EAAA,MAA+B6sB,IAgBrCpjB,EAAAojB,EAAAtjB,CAAA,gBAAAlN,EAAAoN,EAAAzJ,GAAA,iBAAAsJ,EAAAtJ,EAAA,MAAArH,EAAAqH,EAAA,MAAAzH,EAAAyH,EAAA,MAAAkK,EAAAlK,EAAA,MAAAuJ,EAAAvJ,EAAA,MAAAqK,EAAArK,EAAA,MCbA,SAASF,IAEL,IAAIzD,EACAoN,EACAzJ,EACArH,EACAmH,EACAU,EACAd,EACAgB,EAEED,EAAUkS,KAAK9V,QACf8D,GAAA,EAAWpI,EAAAs0B,GAASpsB,GAAS+0H,cASnC,SAASr1H,IACLxH,EAAwB,GACxBmH,EAAyB,GACzBU,EAA4B,GAC5BE,EAAiB,GACjBhB,EAAsC,KACtC+J,EAAmB,EACtB,CAsHD,SAAS1J,EAAkB1D,EAASoN,GAChC,IAAIzJ,GAAS,EACb3D,EAAQ4sB,MAAK,SAAC5sB,EAAMiN,GAChB,GAAIjN,IAASoN,EAET,OADAzJ,EAAQsJ,GAAA,CAGf,IACGtJ,EAAQ,GACZ3D,EAAQwnB,OAAO7jB,EAAO,EACzB,CAOD,SAASmH,EAAwB9K,GAC7B,IAAIoN,EACJ,IAAKA,EAAI,EAAGA,EAAI/I,EAAehI,OAAQ+Q,IACnC,GAAI/I,EAAe+I,GAAGu6K,WAAa3nL,EAC/B,OAAOoN,EAGf,OAAQ,CACX,CAuED,SAASsB,EAAmB1O,EAAa2D,GACrC0hB,EAAsBrlB,EAAa2D,GACnC,IAAIrH,EAAK,IAAI2Q,EAAAujB,EACbl0B,EAAGy+C,YAAc/6C,EACjB1D,EAAGwL,MAAQnE,EACXyJ,EAAiB2T,KAAKzkB,EACzB,CAeD,SAAS+oB,EAAsBrlB,EAAa2D,IAAA,EACxCkK,EAAA82J,IAAmB3kK,EAAa,aAChC6N,EAAA82J,IAAmBhhK,EAAO,UAC1ByJ,EAAiB1D,SAAQ,SAAUuD,EAAK3Q,GAChC2Q,EAAI8tC,cAAgB/6C,GAAeiN,EAAInF,QAAUnE,GACjDyJ,EAAiBoa,OAAOlrB,EAAK,EAEpC,GACJ,CA+DD,OA9BA0D,EAAW,CACPyiK,uCAvPJ,WACI,OAAOp/J,CACV,EAsPGygL,uCAvQJ,SAAgD9jL,GAC5CqD,EAAsCrD,CACzC,EAsQG+jL,yCAjQJ,WACI1gL,EAAsC,IACzC,EAgQGukL,0BA1OJ,WACI,OAAOnkL,CACV,EAyOGokL,yBAnPJ,WACI,OAAOvrL,CACV,EAkPGyuK,6BAhMJ,WACI,OAAO5mK,CACV,EA+LGy/K,iCAvLJ,SAA0C5jL,GACtCmE,EAA0B4c,KAAK/gB,EAClC,EAsLGyjL,8BA1NJ,SAAuCzjL,GACnCyD,EAAuBsd,KAAK/gB,EAC/B,EAyNGwjL,6BArOJ,SAAsCxjL,GAClC1D,EAAsBykB,KAAK/gB,EAC9B,EAoOG6jL,mCAlLJ,SAA4C7jL,GACxC0D,EAAkBS,EAA2BnE,EAChD,EAiLG2jL,gCA7MJ,SAAyC3jL,GACrC0D,EAAkBD,EAAwBzD,EAC7C,EA4MG0jL,+BAtNJ,SAAwC1jL,GACpC0D,EAAkBpH,EAAuB0D,EAC5C,EAqNG0iL,iBAvIJ,SAA0B1iL,EAAMoN,EAAUzJ,GACtC,GAAoB,iBAAT3D,GAAsBA,IAASkN,EAAAsjB,EAAAs3J,wBAA6C9nL,IAASkN,EAAAsjB,EAAAu3J,sBACxE,iBAAb36K,EACP,MAAMY,EAAAwiB,EAAAmwJ,mBAEV,IAAI1zK,EAAQnC,EAAwBsC,IACrB,IAAXH,EAEA5I,EAAe0c,KAAK,CAChB9iB,KAAM+B,EACN2nL,SAAUv6K,EACV46K,KAAMrkL,KAIVU,EAAe4I,GAAOhP,KAAO+B,EAC7BqE,EAAe4I,GAAO+6K,KAAOrkL,EAEpC,EAsHGm/K,uBA9FJ,WACIz+K,EAAiB,EACpB,EA6FGu+K,oBAhHJ,SAA6B5iL,GACzB,GAAIA,EAAU,CACV,IAAIoN,EAAQtC,EAAwB9K,IAErB,IAAXoN,GAEA/I,EAAemjB,OAAOpa,EAAO,EAEpC,MAEG/I,EAAiB,EAExB,EAqGG2+K,kBAxFJ,WACI,OAAO3+K,CACV,EAuFG6+K,mBAAAx0K,EACAy0K,sBAAA99J,EACA2qI,oBArEJ,WACI,OAAO5iJ,CACV,EAoEGg2K,6BAhDJ,WACIh2K,EAAmB,EACtB,EA+CGoyK,+BA1CJ,WACI,IAAIx/K,EAAyBsE,EAAS8S,MAAMskH,UAAUuD,mBAAmBS,oBACzEhxH,EAAmB1O,EAAuB4N,OAAQ5N,EAAuB8H,MAC5E,EAwCGu7K,6BAtCJ,SAASrjL,EAA6BoN,EAAMH,GACnCG,EAKDzJ,EAAmByJ,KAAUH,EAJ7BnQ,OAAOP,KAAKoH,GAAoB+F,SAAQ,SAAA0D,GACpCpN,EAA6BoN,EAAKH,EACrC,GAIR,EA+BGqnJ,6BA7BJ,SAAsCt0J,GAClC,IAAMoN,EAAWzJ,EAAmB3D,GAEpC,YAAO,IAAAoN,EAAyBzJ,EAAkBuhB,QAAW9X,CAChE,EA0BGmqI,UArSJ,WAEC,EAoSGvoG,MA1SJ,WACIlrC,GACH,GAlBGH,EAAqB,CACjBuhB,SAAA,GAEJphB,IA4TG9D,CACV,CAEDyD,EAAsBk2H,sBAAwB,wBAC9CvsH,EAAAojB,EAAel0B,EAAAk0B,EAAAopG,oBAAiCn2H,EAAA,gBAAAzD,EAAAoN,EAAAzJ,GAAA,iBAAAsJ,EAAAtJ,EAAA,MAAArH,EAAAqH,EAAA,MClVhD,SAASzH,EAAU8D,GAGf,IAAMoN,GADNpN,EAAMA,GAAO,CAAC,GACc+mJ,gBAc5B,SAASpjJ,EAAQ3D,GAEb,IAAM2D,EAAmB,IAAIkU,KACvB5K,EAAUjN,EAAYU,QAExBpE,EAAM,IAAIwK,eAqBd,GApBAxK,EAAI0L,KAAKhI,EAAYiI,OAAQjI,EAAYoC,KAAA,GAErC6K,EAAQ1G,eACRjK,EAAIiK,aAAe0G,EAAQ1G,cAG3B0G,EAAQu8B,OACRltC,EAAIuN,iBAAiB,QAAS,SAAWoD,EAAQu8B,OAGhDv8B,EAAQ07I,mBACT17I,EAAQ07I,iBAAmBhlJ,GAG3ByJ,GAAmBA,EAAgBw7I,sBACnCtsJ,EAAM8Q,EAAgBw7I,oBAAoBtsJ,EAAK,CAC3C8F,IAAKpC,EAAYoC,OAIrBpC,EAAYsG,QACZ,IAAK,IAAIpK,KAAU8D,EAAYsG,QAAS,CACpC,IAAIuH,EAAQ7N,EAAYsG,QAAQpK,GAC5B2R,GACAvR,EAAIuN,iBAAiB3N,EAAQ2R,EAEpC,CAGLvR,EAAI+M,gBAAkBrJ,EAAYqJ,gBAElC/M,EAAImiH,OAASz+G,EAAYy+G,OACzBniH,EAAIiL,UAAYvH,EAAYipJ,MAC5B3sJ,EAAIuM,QAAU7I,EAAY6I,QAC1BvM,EAAIq2E,WAAa3yE,EAAYgpJ,SAC7B1sJ,EAAIqM,QAAU3I,EAAY2I,QAC1BrM,EAAIyM,UAAY/I,EAAY+I,UAC5BzM,EAAI+L,QAAUrI,EAAYqI,QAE1B/L,EAAIkO,OAEJxK,EAAY0H,SAAWpL,CAC1B,CAaD,MALW,CACP02B,KAnEJ,SAAchzB,GACNoN,GAAmBA,EAAgB28I,eAAA,EACnCztJ,EAAAgH,GAActD,EAAaoN,GACtB41B,MAAK,kBAAMr/B,EAAQ3D,EAAd,IAGV2D,EAAQ3D,EAEf,EA4DGoK,MARJ,SAAepK,GACX,IAAMoN,EAAIpN,EAAQ0H,SAClB0F,EAAE7F,UAAY6F,EAAEvE,QAAUuE,EAAEulE,gBAAA,EAC5BvlE,EAAEhD,OACL,EAQJ,CAEDlO,EAAUy9H,sBAAwB,YAElC,IAAM9rH,EAAUZ,EAAAujB,EAAAyqG,gBAA6B/+H,GAC7CkR,EAAAojB,EAAA3iB,CAAA,gBAAA7N,EAAAoN,EAAAzJ,GAAA,sBAAAsJ,EAAAjN,EAAAoN,GAAA,QAAAzJ,EAAA,EAAAA,EAAAyJ,EAAA/Q,OAAAsH,IAAA,KAAAsJ,EAAAG,EAAAzJ,GAAAsJ,EAAAmvD,WAAAnvD,EAAAmvD,aAAA,EAAAnvD,EAAA6wE,cAAA,YAAA7wE,IAAAA,EAAAmuH,UAAA,GAAAt+H,OAAAmC,eAAAe,EAAAiN,EAAA9P,IAAA8P,EAAA,EAAAtJ,EAAAU,EAAA+I,EAAA,CAAA8X,QAAA,kBAAA3B,EAAA,IC5FA,IAAMjnB,EAAyC,CAC3CgqK,WAAY,CAAC,QAAS,SACtB2hB,SAAU,CAAC,WAAY,WA0O3B/rL,EAnOM,oBAAA8D,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,2CAAA3oD,EAAA,KAAA2D,EAAA,OAAAA,EAAA,EAAAxG,IAAA,4BAAA2K,MASF,SAAiC9H,GAE7B,IADA,IAAIoN,EAAS,KACJzJ,EAAI,EAAGA,EAAI3D,EAAQ3D,SAAUsH,EAAG,CACrC,IAAIsJ,EAAKjN,EAAQ2D,GACoB,qCAAjCsJ,EAAG8tC,YAAYnxC,eACa,SAA3BqD,EAAGnF,MAAM8B,eAAuD,SAA3BqD,EAAGnF,MAAM8B,gBAC/CwD,EAASH,EAChB,CACD,OAAOG,CACV,IAAAjQ,IAAA,cAAA2K,MAQD,SAAmB9H,GACf,IAAIoN,EAAS,EACTzJ,EAAO,IAAIgkB,SAAS3nB,GAGpBiN,EAAUtJ,EAAKsrC,SAAS7hC,GAS5B,OAPAA,GAAU,GAENH,EAAU,IACVG,GAAU,EAAK,GAAKzJ,EAAK8iB,UAAUrZ,IAGvCA,GAAU,EACHpN,EAAK0W,MAAMtJ,EACrB,IAAAjQ,IAAA,sBAAA2K,MAYD,SAA2BsF,EAAWzJ,GAClC,IAAIsJ,EAAWjN,EAAiBkoL,cAAcvkL,GAC9C,OAAIyJ,GAAaH,EAAShQ,eAAemQ,EAAUgZ,KAAKxc,eAC7CqD,EAASG,EAAUgZ,KAAKxc,eAE5B,IACV,IAAAzM,IAAA,qCAAA2K,MAUD,SAA0C9H,EAAQoN,GAC9C,MAAI,SAAUpN,GAGVA,EAAOqnB,KAAKmlI,OAASxsJ,EAAOqnB,KAAKmlI,OAAOhqJ,QAAQ,YAAa,IAAIA,QAAQ,OAAQ,IAE1E4K,EAAOgpH,YAAYp2H,EAAOqnB,KAAKmlI,QAAQnrI,QAE3C,IACV,IAAAlkB,IAAA,gBAAA2K,MAWD,SAAqB9H,GAEjB,GAAI,MAAAA,EACA,MAAO,GAQX,IANA,IAAIoN,EAAK,IAAIua,SAAS3nB,EAAKqhB,QAAUrhB,GAEjC2D,EAAO,CAAC,EAGRsJ,EAAa,IACH,CAEV,IACI3Q,EACAJ,EACA2R,OAAA,EACAX,EAAWD,EAEf,GAAIA,GAAcG,EAAGiU,OAAOE,WACxB,MAQJ,GAJAjlB,EAAU2Q,EADHG,EAAGqZ,UAAUxZ,GAEpBA,GAAc,EAGmB,aAA7BG,EAAGqZ,UAAUxZ,GAQjB,GAJAA,GAAc,EAIE,KADhB/Q,EAAUkR,EAAG6hC,SAAShiC,KACW,IAAZ/Q,EAArB,CAIA+Q,IAEAA,GAAc,EAGdY,EAAW,GACX,IAAIG,OAAA,EAAGvK,OAAA,EACP,IAAKuK,EAAI,EAAGA,EAAI,EAAGA,IAEfH,GAA4B,KAD5BpK,EAAM2J,EAAG6hC,SAAShiC,EAAae,GAAGhR,SAAS,KAC1BX,OAAgB,IAAMoH,EAAMA,EAIjD,IAFAwJ,GAAc,EACdY,GAAY,IACPG,EAAI,EAAGA,EAAI,EAAGA,IAEfH,GAA4B,KAD5BpK,EAAM2J,EAAG6hC,SAAShiC,EAAae,GAAGhR,SAAS,KAC1BX,OAAgB,IAAMoH,EAAMA,EAIjD,IAFAwJ,GAAc,EACdY,GAAY,IACPG,EAAI,EAAGA,EAAI,EAAGA,IAEfH,GAA4B,KAD5BpK,EAAM2J,EAAG6hC,SAAShiC,EAAae,GAAGhR,SAAS,KAC1BX,OAAgB,IAAMoH,EAAMA,EAIjD,IAFAwJ,GAAc,EACdY,GAAY,IACPG,EAAI,EAAGA,EAAI,EAAGA,IAEfH,GAA4B,KAD5BpK,EAAM2J,EAAG6hC,SAAShiC,EAAae,GAAGhR,SAAS,KAC1BX,OAAgB,IAAMoH,EAAMA,EAIjD,IAFAwJ,GAAc,EACdY,GAAY,IACPG,EAAI,EAAGA,EAAI,EAAGA,IAEfH,GAA4B,KAD5BpK,EAAM2J,EAAG6hC,SAAShiC,EAAae,GAAGhR,SAAS,KAC1BX,OAAgB,IAAMoH,EAAMA,EAEjDwJ,GAAc,EAKdA,GAAc,EAGdtJ,EANAkK,EAAWA,EAASjE,eAMHwD,EAAGiU,OAAO3K,MAAMxJ,EAAU5Q,GAC3C2Q,EAAa3Q,CA7CZ,MAFG2Q,EAAa3Q,OARb2Q,EAAa3Q,CAwDpB,CAED,OAAOqH,CACV,IAAAxG,IAAA,mCAAA2K,MAED,SAAwC9H,EAAWoN,GAC/C,IAEI,IAAKpN,GAAkC,IAArBA,EAAU3D,OACxB,OAAO,KAMX,IAHA,IAAIsH,EAAI,EACJsJ,EAAgB,KAEbtJ,EAAI3D,EAAU3D,SAAW4Q,GAAe,CAC3C,IAAM/Q,EAAO8D,EAAU2D,GAEvB,GAAIzH,GAAQA,EAAKk7J,mBAAqBl7J,EAAKk7J,kBAAkB/6J,OAAS,EAAG,CACrE,IAAMwR,EAAuB3R,EAAKk7J,kBAAkB//I,QAAO,SAACrX,GACxD,OAAOA,EAAG+6C,aAAe/6C,EAAG+6C,cAAgB3tC,CAC/C,IAED,GAAIS,GAAwBA,EAAqBxR,OAAS,EAEtD,IADA,IAAI6Q,EAAI,EACDA,EAAIW,EAAqBxR,SAAW4Q,GAAe,CAGtD,IAFA,IAAMe,EAASH,EAAqBX,GAChCzJ,EAAI,EACDA,EAAInH,EAAuCgqK,WAAWjqK,SAAW4Q,GAAe,CAGnF,IAFA,IAAI9I,EAAI,EACFd,EAAY/G,EAAuCgqK,WAAW7iK,GAC7DU,EAAI7H,EAAuC2rL,SAAS5rL,SAAW4Q,GAAe,CACjF,IAAM5I,EAAS/H,EAAuC2rL,SAAS9jL,GAC3D6J,EAAO3K,IAAc2K,EAAO3K,GAAWsjK,UAAY34J,EAAO3K,GAAWsjK,WAAatiK,GAAU2J,EAAO3K,GAAWmpJ,SAC9Gv/I,EAAgBe,EAAO3K,GAAWmpJ,QAEtCroJ,GAAK,CACR,CACDV,GAAK,CACR,CACDyJ,GAAK,CACR,CAER,CACDvJ,GAAK,CACR,CACD,OAAOsJ,CAGV,CAFC,MAAOjN,GACL,OAAO,IACV,CACJ,IAAA2D,GAAAsJ,EAhOCjN,EAgOD2D,GAAA3D,CAAA,CAhOC,GCON6N,EANI,SAAA7N,EAAYoN,EAAazJ,IAAA,SAAA3D,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAY,KAAA3oD,GACjCsW,KAAKqsB,YAAcv1B,EACnBkJ,KAAKoyD,WAAa/kE,CACrB,ECsBLuJ,EAdI,SAAAlN,EAAYoN,EAAmBzJ,EAAmBsJ,EAAuB3Q,EAAiBJ,IAAA,SAAA8D,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAA3oD,GACpGsW,KAAK8xD,cAAgB,CAAE,QACnBh7D,GAAqBA,EAAkB/Q,SACvCia,KAAKmyD,kBAAoBr7D,GAEzBzJ,GAAqBA,EAAkBtH,SACvCia,KAAKwyD,kBAAoBnlE,GAE7B2S,KAAKgyD,sBAAwBr7D,EAC7BqJ,KAAK+xD,gBAAkB/rE,EACvBga,KAAKiyD,aAAersE,CACvB,WAAA8R,EAAAhO,GAAA,OAAAgO,EAAA,mBAAAzK,QAAA,iBAAAA,OAAA85E,SAAA,SAAAr9E,GAAA,cAAAA,CAAA,WAAAA,GAAA,OAAAA,GAAA,mBAAAuD,QAAAvD,EAAA5D,cAAAmH,QAAAvD,IAAAuD,OAAAxG,UAAA,gBAAAiD,CAAA,EAAAgO,EAAAhO,EAAA,UAAAyD,EAAAzD,EAAAoN,GAAA,OAAA3J,EAAA3G,OAAA4nI,gBAAA,SAAA1kI,EAAAoN,GAAA,OAAApN,EAAA8oD,UAAA17C,EAAApN,CAAA,EAAAyD,EAAAzD,EAAAoN,EAAA,UAAAjJ,EAAAnE,EAAAoN,GAAA,OAAAA,GAAA,WAAAY,EAAAZ,IAAA,mBAAAA,EAAA,SAAApN,GAAA,YAAAA,EAAA,UAAAwxC,eAAA,oEAAAxxC,CAAA,EAAAA,GAAAoN,CAAA,UAAA/J,EAAArD,GAAA,OAAAqD,EAAAvG,OAAA4nI,eAAA5nI,OAAAuC,eAAA,SAAAW,GAAA,OAAAA,EAAA8oD,WAAAhsD,OAAAuC,eAAAW,EAAA,EAAAqD,EAAArD,EAAA,KCwDLqE,EADuB,IAnFjB,SAAArE,IAAA,SAAAA,EAAAoN,GAAA,sBAAAA,GAAA,OAAAA,EAAA,UAAAu7C,UAAA,sDAAA3oD,EAAAjD,UAAAD,OAAA8D,OAAAwM,GAAAA,EAAArQ,UAAA,CAAAX,YAAA,CAAA0L,MAAA9H,EAAAo7H,UAAA,EAAAt9C,cAAA,KAAA1wE,GAAA3J,EAAAzD,EAAAoN,EAAA,EAAA9Q,EAAA0D,GAAA,IAAAoN,EAAAzJ,EAAAsJ,GAAAG,EAAA9Q,EAAAqH,EAAA,kCAAA45E,UAAAA,QAAAC,UAAA,YAAAD,QAAAC,UAAAmnD,KAAA,+BAAAC,MAAA,oBAAA9nB,QAAA//G,UAAAF,QAAAK,KAAAqgF,QAAAC,UAAAs/B,QAAA,6BAAA98G,GAAA,4BAAAA,EAAAiN,EAAA5J,EAAA+J,GAAA,GAAAzJ,EAAA,KAAArH,EAAA+G,EAAA,MAAAjH,YAAA4D,EAAAu9E,QAAAC,UAAAvwE,EAAA3O,UAAAhC,EAAA,MAAA0D,EAAAiN,EAAAyU,MAAA,KAAApjB,WAAA,OAAA6F,EAAA,KAAAnE,EAAA,GACF,SAAA1D,IAAc,IAAA0D,EAAA,gBAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,2CAAArsD,IACV0D,EAAAiN,EAAA/P,KAAA,OAKKirL,kBAAoB,IAIzBnoL,EAAKooL,0BAA4B,IAIjCpoL,EAAKqoL,yBAA2B,IAIhCroL,EAAKsoL,0BAA4B,IAIjCtoL,EAAKuoL,yBAA2B,IAIhCvoL,EAAKwoL,iCAAmC,IAIxCxoL,EAAKyoL,yBAA2B,IAKhCzoL,EAAK0oL,6BAA+B,IAIpC1oL,EAAK2oL,0CAA4C,IAIjD3oL,EAAK4oL,sCAAwC,IAI7C5oL,EAAK6oL,sCAAwC,IAI7C7oL,EAAK8oL,mDAAqD,IAI1D9oL,EAAK+oL,oCAAsC,IAI3C/oL,EAAKgpL,+BAAiC,IAItChpL,EAAKipL,sCAAwC,IAE7CjpL,EAAKkpL,6BAA+B,wGACpClpL,EAAKmpL,4BAA8B,oDACnCnpL,EAAKopL,6BAA+B,8EACpCppL,EAAKqpL,4BAA8B,2GACnCrpL,EAAKspL,oCAAsC,qEAC3CtpL,EAAKupL,4BAA8B,6HACnCvpL,EAAKwpL,gCAAkC,wHACvCxpL,EAAKypL,6CAA+C,kCACpDzpL,EAAK0pL,yCAA2C,wCAChD1pL,EAAK2pL,yCAA2C,qDAChD3pL,EAAK4pL,sDAAwD,wCAC7D5pL,EAAK6pL,uCAAyC,oCAC9C7pL,EAAK8pL,kCAAoC,oCACzC9pL,EAAK+pL,yCAA2C,0BA9EtC/pL,CA+Eb,QAAA1D,CAAA,CAGsB,CAnFrBqH,EAAA,MAAyB6sB,IAAApsB,EAAAT,EAAA,MCiD/BW,EA5CI,SAAAtE,EAAYoN,EAAKzJ,EAAQsJ,EAAc3Q,EAASJ,EAAiB2R,EAAaX,EAAWc,IAAA,SAAAhO,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAM,KAAA3oD,GAK3FsW,KAAKlU,IAAMgL,EAKXkJ,KAAKrO,OAAStE,EAKd2S,KAAK/P,aAAe0G,EAKpBqJ,KAAKhQ,QAAUhK,EAKfga,KAAKjN,gBAAkBnN,EAKvBoa,KAAK8zD,YAAcv8D,EAKnByI,KAAKszD,UAAY18D,EAKjBoJ,KAAKlQ,KAAO4H,CACf,ECtBLlK,EAnBI,SAAA9D,EAAYoN,EAAKzJ,EAASsJ,IAAA,SAAAjN,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAM,KAAA3oD,GAK5BsW,KAAKlU,IAAMgL,EAKXkJ,KAAKhQ,QAAU3C,EAKf2S,KAAKlQ,KAAO6G,CACf,EAAAvJ,EAAAC,EAAA,MAAAmH,EAAAnH,EAAA,KAAA+K,EAAA/K,EAAA,MAAA0hB,EAAA1hB,EAAA,eAAAyS,EAAApW,GAAA,OAAAoW,EAAA,mBAAA7S,QAAA,iBAAAA,OAAA85E,SAAA,SAAAr9E,GAAA,cAAAA,CAAA,WAAAA,GAAA,OAAAA,GAAA,mBAAAuD,QAAAvD,EAAA5D,cAAAmH,QAAAvD,IAAAuD,OAAAxG,UAAA,gBAAAiD,CAAA,EAAAoW,EAAApW,EAAA,CCSL,SAAS8O,EAAqB9O,GAG1B,IAYIoN,EACAzJ,EACAsJ,EACA3Q,EACA0R,EACAvK,EACAU,EACAd,EACAgiB,EACAvW,EACAE,EAtBE7S,GADN6D,EAASA,GAAU,CAAC,GACmBgqL,wBACnCj3K,EAAkB/S,EAAOiqL,gBACvBl0K,EAAW/V,EAAOynI,SAClB/xH,EAAS1V,EAAOs2G,OAChBpgG,EAAQlW,EAAO4V,MACfsD,EAASlZ,EAAOoxJ,OAChBj7I,EAAYnW,EAAOgnJ,UACrB/wI,EAAiB,GACfgD,EAAYjZ,EAAOmgL,UACnB9nK,EAAWrY,EAAOo5G,SAClB9hG,EAAwBtX,EAAOsgK,sBA0BrC,SAAS7tJ,IACL,KAAKsD,GAAaA,EAAS9Y,eAAe,OAAUd,GAA4BA,EAAwBc,eAAe,gDACnH,MAAM,IAAIuQ,MAAM,8BAEvB,CAmED,SAAS+J,EAAoCvX,EAAaoN,GAEjD/J,GAAsBgiB,EAKlBhiB,GACLwH,IAUR,SAAiC7K,EAAaoN,GAC1C,IAAKiY,EAA8B,CAC/BA,GAAA,EACA,IAmBIpY,EAnBE3Q,EAAsB,GAG5B0D,EAAcA,EAAYirC,MAAK,SAAC79B,EAAKzJ,GAGjC,OAFcqK,GAAeA,EAAYZ,EAAI8/D,GAAGg9G,eAAiBl8K,EAAYZ,EAAI8/D,GAAGg9G,cAAch/F,UAAY,EAAKl9E,EAAYZ,EAAI8/D,GAAGg9G,cAAch/F,SAAWlrF,EAAY3D,SAC7J2R,GAAeA,EAAYrK,EAAIupE,GAAGg9G,eAAiBl8K,EAAYrK,EAAIupE,GAAGg9G,cAAch/F,UAAY,EAAKl9E,EAAYrK,EAAIupE,GAAGg9G,cAAch/F,SAAWlrF,EAAY3D,OAE9K,IAGD,IAAK,IAAIH,EAAI,EAAGA,EAAI8D,EAAY3D,OAAQH,IAAK,CACzC,IAAM2R,EAAyB4Z,EAA2BznB,EAAY9D,IACtEI,EAAoBykB,KAAK,CACrBmsD,GAAIltE,EAAY9D,GAAGgxE,GACnBi9G,QAAS,CAACt8K,GACVu8K,SAAUpqL,EAAY9D,GAAGkuL,UAEhC,CAIDr3K,EAAgBs3K,uBAAuB/tL,GAClC0mC,MAAK,SAAChjC,GAEH,IAAIoN,GADJH,EAAkBjN,EAAMoG,MACmBkkL,MAAQr9K,EAAgBq9K,KAAKC,qBAAuBt9K,EAAgBq9K,KAAKC,qBAAuBt9K,EAAgBg6D,UAAUijH,aAErK,OADAvmL,EAAOmS,KAAK,oDAAsD1I,EAAuB,+BAClF2F,EAAgBy3K,gBAAgBv9K,EAC1C,IACA+1B,MAAK,SAAChjC,GAIH,GAHAqD,EAAoBrD,EACpBqlB,GAAA,EAEKtS,EAAL,CAIAgD,EAAS4e,QAAQjf,EAAO4iJ,oBAAqB,CAAElyJ,KAAM6G,IAGrD,IAAMG,EAAWgM,EAAyB/V,GACtC+J,GAAYA,EAASq9K,mBAAqBr9K,EAASq9K,kBAAkBpuL,OAAS,GAC9E0W,EAAgB23D,qBAAqBxxD,EAAOk9G,YAAYhpH,EAASq9K,mBAAmBppK,QAGxFxW,GAVC,CAWJ,IAxBLo4B,OAyBW,SAACjjC,GACJqD,EAAoB,KACpBgiB,GAAA,EACKjY,GACD2I,EAAS4e,QAAQjf,EAAO4iJ,oBAAqB,CACzClyJ,KAAM,KACNoF,MAAO,IAAIpH,EAAAosB,EAAYnsB,EAAA0kL,oCAAsD1kL,EAAAwlL,uCAA0D,kCAAoC7pL,EAAMwL,QAG5L,GACR,CACJ,CA5DD,CAfgCxL,EAAaoN,EAO5C,CA0ED,SAASvC,IAGL,IADA,IAAI7K,EACKoN,EAAI,EAAGA,EAAIH,EAA2B5Q,OAAQ+Q,IACnD,IAAKpN,EAAQ,EAAGA,EAAQiN,EAA2BG,GAAG/Q,OAAQ2D,IAC1D,GAAIqD,IAAsB4J,EAA2BG,GAAGpN,GAAOktE,GAAI,CAE/D5pE,EADgB2J,EAA2BG,GAAGpN,IAE9C,KACH,CAGTiN,EAA6B,EAChC,CAOD,SAAS3J,EAAwBtD,GAE7B,GAAI7D,EAAwBuuL,WAAWrnL,IAG/BrD,EAAcoqL,UAAYpqL,EAAcoqL,SAASntL,eAAe,cAAyE,IAAzDH,OAAOP,KAAKyD,EAAcoqL,SAASO,WAAWtuL,OAAc,CAC5I,IAAM+Q,EAAW,CAAEwZ,KAAM9pB,OAAOP,KAAKyD,EAAcoqL,SAASO,YAC5D3qL,EAAcqmD,UAAW,IAAIukI,aAAcz0D,OAAOn/F,KAAKC,UAAU7pB,GACpE,CAIDpN,EAAc4pE,UAEdzwD,EAAenZ,GAIiB,OAA3BA,EAAcqmD,UAEnB71B,EAAiBxwB,EAExB,CAWD,SAASmZ,EAAenZ,GACpByS,IACAM,EAAgB83K,eAAe7qL,EAClC,CAYD,SAASwwB,EAAiBxwB,GACtB,IAAMoN,EAAgBlR,EAAA4uL,oBAAqCznL,EAAmBrD,EAAgBA,EAAcqmD,SAAW,MAEvH,GAAIj5C,EAAe,CAGf,GA8ER,SAA2BpN,GAEvB,IAAKA,EACD,OAAO,EAGX,IAEI,IADA,IAAMoN,EAAW2F,EAAgBg4K,cACxBpnL,EAAI,EAAGA,EAAIyJ,EAAS/Q,OAAQsH,IACjC,GAAIyJ,EAASzJ,GAAGqnL,aAAehrL,EAC3B,OAAO,EAGf,OAAO,CAGV,CAFC,MAAOA,GACL,OAAO,CACV,CACJ,CAjBD,CA9E8BA,EAAconB,OAChC,OAIJ,GAAItN,EAAqB1M,GACrB,OAGJ,IACIpN,EAAcqmD,SAAWj5C,EACzB2F,EAAgBk4K,iBAAiBjrL,EAMpC,CALC,MAAOA,GACL+V,EAAS4e,QAAQjf,EAAO6iJ,oBAAqB,CACzCnyJ,KAAM,KACNoF,MAAO,IAAIpH,EAAAosB,EAAYnsB,EAAA2kL,+BAAiD3kL,EAAAylL,kCAAqD9pL,EAAMkM,UAE1I,CACJ,MAAUlM,GAAiBA,EAAcqmD,SACtCtzC,EAAgBk4K,iBAAiBjrL,GAEjC+V,EAAS4e,QAAQjf,EAAO6iJ,oBAAqB,CACzCnyJ,KAAM,KACNoF,MAAO,IAAIpH,EAAAosB,EAAYnsB,EAAA2kL,+BAAiD3kL,EAAAylL,kCAAqD,2BAA6BzmL,EAAoBA,EAAkB6mL,aAAe,MAAQ,sFAGlO,CAQD,SAAS9wK,EAAyBpZ,GAC9B,GAAIA,EAAW,CACX,IAAMoN,EAAkBpN,EAAUkqL,aAElC,GAAIl8K,EACA,OAAQZ,KAAmBY,EAAeA,EAAYZ,GAAmB,IAEhF,CACD,OAAO,IACV,CA4DD,SAAS0M,EAAqB9Z,GAE1B,IAAKA,EACD,OAAO,EAGX,IAEI,IADA,IAAMoN,EAAkB2F,EAAgBm4K,iBAC/Bj+K,EAAI,EAAGA,EAAIG,EAAgB/Q,OAAQ4Q,IACxC,GAAI9Q,EAAwBgvL,eAAenrL,EAAeoN,EAAgBH,IAEtE,OADAtJ,EAAOiS,MAAM,8DAKrB,OAAO,CAGV,CAFC,MAAO5V,GACL,OAAO,CACV,CACJ,CA8DD,SAASkE,EAAgBlE,GACrByS,IACIzS,GACA+S,EAAgBgtJ,gBAAgB//J,GAChC+V,EAASqc,GAAG1c,EAAO01K,SAAU5qK,EAAYpT,IACtB,OAAZpN,IACP+S,EAAgBgtJ,gBAAgB//J,GAChC+V,EAAS2c,IAAIhd,EAAO01K,SAAU5qK,EAAYpT,GAEjD,CA+FD,SAASqa,EAA2BznB,GAChC,IAAMoN,EAAWpN,EAAcoqL,SACzBzmL,EAAoB,GACpBsJ,EAAoB,GACpB/Q,EAAmBkR,GAAYA,EAASu7D,iBAAmBv7D,EAASu7D,gBAAgBtsE,OAAS,EAAK+Q,EAASu7D,gBAAkBxkE,EAC7H6J,EAAmBZ,GAAYA,EAAS27D,iBAAmB37D,EAAS27D,gBAAgB1sE,OAAS,EAAK+Q,EAAS27D,gBAAkB5kE,EAC7HV,EAAgBzD,EAAcwoE,YAC9BnlE,EAAyB+J,GAAYA,EAASk7D,sBAAyBl7D,EAASk7D,sBAAwB,WACxGjkE,EAAmB+I,GAAYA,EAASi7D,gBAAmBj7D,EAASi7D,gBAAqC,cAAlB5kE,EAAiC,WAAa,WAU3I,OARAnH,EAAaoN,SAAQ,SAAC1J,GACdA,EAAM/B,OAASkY,EAAU0Y,MACzBlrB,EAAkBod,KAAK,IAAIlT,EAAgB7N,EAAMulB,MAAOrpB,IACjD8D,EAAM/B,OAASkY,EAAUs1D,OAChCx+D,EAAkB8T,KAAK,IAAIlT,EAAgB7N,EAAMulB,MAAOvX,GAE/D,IAEM,IAAId,EACPvJ,EAAmBsJ,EAAmB5J,EACtCgB,EACA,CAACZ,GACR,CAOD,SAASuc,EAAoBhgB,GACrBA,EAAEwL,MACFuK,EAAS4e,QAAQjf,EAAO8iJ,qBAAsB,CAAEpyJ,KAAM,KAAMoF,MAAOxL,EAAEwL,QAErE7H,EAAOiS,MAAM,qBAAuB5V,EAAE4H,OAE7C,CAOD,SAAS6U,EAAczc,GACnB2D,EAAOiS,MAAM,qBAGb,IAAMxI,EAAapN,EAAEoG,KACrB2P,EAAS4e,QAAQjf,EAAO21K,YAAa,CAAEjlL,KAAMgH,IAC7C,IAAMH,EAAeG,EAAWg9D,YAAeh9D,EAAWg9D,YAAc,kBAClEv8D,EAAUT,EAAWlB,QACrBgB,EAAeE,EAAWk+K,aAC1Bt9K,EAAWoL,EAAyB/V,GACpCI,EAA6BtH,EAAwBovL,8BAA8BloL,EAAmB2K,EAAUf,GAChH9I,EAAY,CAAEmnL,aAAcp+K,EAAck9D,YAAan9D,GAG7D,GAAKY,GAAkC,IAAvBA,EAAQ0T,WAAxB,CAMA,IAAK9d,EAGD,OAFAE,EAAOiS,MAAM,qEAAuE5V,EAAEoG,KAAKgkE,YAAc,oBAAsBl9D,EAAas+K,qBAC5I7rK,EAAiCxb,GAKrC,GAAIhI,EAAwBuuL,WAAWrnL,GAAoB,CACvD,IAAMqL,EAAYvS,EAAwBsvL,8BAA8BpoL,EAAmB2K,EAAUH,GACrG,GAAIa,GAAaA,EAAUg9K,UAAYh9K,EAAUg9K,SAASrvL,OAAS,EAI/D,OAHAsH,EAAOiS,MAAM,yDACb+J,EAAiCxb,QACjC4O,EAAgB42D,iBAAiBz8D,EAAcwB,EAGtD,EAuBL,SAA8B1O,EAAYoN,EAAmBzJ,GACzD,IAAMsJ,EAAejN,EAAWsrL,aAC1Bz9K,EAAe7N,EAAWoqE,YAAepqE,EAAWoqE,YAAc,kBAClEl9D,EAAY,CAAEo+K,aAAcr+K,EAAcm9D,YAAav8D,GACvDG,EAAkB3K,EAAoBA,EAAkB6mL,aAAe,KAGzEzmL,EAgNR,SAA8BzD,EAAUoN,EAAazJ,EAAcsJ,EAAYY,GAC3E,IAAIX,EAAM,KACJc,EAAUf,EAAWf,QAG3B,GAAIlM,GAAYA,EAAS2rL,UAAW,CAChC,IAAMloL,EAAYzD,EAAS2rL,UACF,iBAAdloL,GAAwC,KAAdA,EACjCyJ,EAAMzJ,EACsB,WAArB2S,EAAO3S,IAA0BA,EAAUxG,eAAemQ,KACjEF,EAAMzJ,EAAU2J,GAEvB,MAGI,GAAIpN,GAAYA,EAAS4rL,OAA4B,KAAnB5rL,EAAS4rL,MAC5C1+K,EAAMlN,EAAS4rL,WASf,KAHA1+K,EAAMhR,EAAA2vL,iCAAkDvvL,EAAc+G,EAAkByoL,gBAG3E3vL,EAAwBuuL,WAAWrnL,GAAoB,CAChE,IAAMc,EAAWjI,EAAA6vL,YAA6BpoL,EAAa0iD,WAC3Dn5C,EAAM7J,EAAkB2oL,gCAAgC7nL,MAIpD+I,EAAMD,EAAW2+K,MAExB,CAKL,OAFM/9K,EAAkBo+K,wBAAwB/+K,EAAKc,EAASZ,EAGjE,CAvCD,CAhNmCzJ,EAAUkK,EAAaZ,EAAcjN,EAAYoN,GAGhF,GAAK3J,EAAL,CAMA,IAAMU,EAAa,CAAC,EAChBuK,GAAA,EACA/K,GACAoc,EAAe5b,EAAYR,EAASuoL,oBAExC,IAAM7mK,EAAUrlB,EAAWkM,QAE3B6T,EAAe5b,EADYd,EAAkB8oL,6BAA6B9mK,IAG1EvoB,OAAOP,KAAK4H,GAAYuF,SAAQ,SAAC1J,GACzB,kBAAoBA,EAAI4J,gBACxB8E,GAAA,EAEP,IAGG/K,GAA+C,kBAA5BA,EAAS0F,kBAC5BqF,EAAkB/K,EAAS0F,iBAG/B,IAAMyF,EAAS,SAAU9O,GACrB,GAAK+S,EAIL,GAAI/S,EAAI4H,QAAU,KAAO5H,EAAI4H,QAAU,IAAK,CACxC,IAAMjE,EAAkBmH,EAAA0lB,EAAAunJ,iBAAuB/3K,EAAIyH,sBAAwBzH,EAAIyH,wBAA0B,MACrGnL,EAAkB,IAAIwH,EAAgB9D,EAAIwI,YAAa7E,EAAiB3D,EAAI0H,UAEhF6Y,EAD+BjJ,EAAsBswK,4BACftrL,GACjC0mC,MAAK,WACF,IAAMr/B,EAAiByJ,EAAkBg/K,kBAAkB9vL,EAAgB8J,KAAM4H,EAAiBH,GAC3E,OAAnBlK,GACAgc,EAAiCzS,GACjC6F,EAAgB42D,iBAAiB18D,EAActJ,IAE/C0c,EAAargB,EAAKkN,EAAWc,EAAiBH,EAAaT,EAElE,GACR,MACGiT,EAAargB,EAAKkN,EAAWc,EAAiBH,EAAaT,EAElE,EAEK4B,EAAU,SAAUhP,GACtB2f,EAAiCzS,EAAW,IAAI9I,EAAAosB,EAAYnsB,EAAA4kL,sCACxD5kL,EAAA0lL,yCAA4D/7K,EAAkB,oCAC9EhO,EAAI6H,WAAa,MAAQ7H,EAAI4H,OAAS,oBAAsB5H,EAAIuI,YACvE,EAEKwN,EAAU,SAAU/V,GACtB2f,EAAiCzS,EAAW,IAAI9I,EAAAosB,EAAYnsB,EAAA4kL,sCACxD5kL,EAAA0lL,yCAA4D/7K,EAAkB,kCAC9EhO,EAAI6H,WAAa,MAAQ7H,EAAI4H,OAAS,oBAAsB5H,EAAIuI,YACvE,EAEKmN,EAAarS,EAAkBgpL,6BAA6BhnK,GAC5DnP,EAAY9I,EAAkBk/K,cAAcz+K,GAC5CqL,EAAe9L,EAAkBm/K,gBAAgBv+K,EAAiBH,GAClEsI,EAAUxS,IAAa2xB,MAAM3xB,EAAS6oL,aAAe7oL,EAAS6oL,YA5uB7B,IA6uBjCv2K,EAAYhJ,EAAau+K,gBAAkB,KAE7CvyK,EAAiB,IAAI3U,EAAeb,EAAKyS,EAAWgD,EAAc/U,EAAYuK,EAAiBb,EAAaoI,EAAWP,GACrHjD,EAAiB6iB,MAAMjd,EAASjB,MAAMskH,UAAUwG,cAAcx+H,EAAAwS,EAAA8rH,UAlvBrC,EAkvB6D3pH,EAASjB,MAAMskH,UAAUwG,cAAcx+H,EAAAwS,EAAA8rH,SAEnIzhH,EAD8BjJ,EAAsBuwK,2BACf5uK,GAChC+pB,MAAK,WACF9mB,EAAkBjD,EAAgBxG,EAAe0D,EAASrH,EAAQE,EAAS+G,EAC9E,GAvEJ,MAFG4J,EAAiCzS,EAAW,IAAI9I,EAAAosB,EAAYnsB,EAAAykL,mDAAqEzkL,EAAAulL,uDA0ExI,CArFD,CApByBx8K,EAAY3J,EAA4BuK,EArB5D,MAFG2R,EAAiCxb,EAAW,IAAIC,EAAAosB,EAAYnsB,EAAAskL,0CAA4DtkL,EAAAolL,8CAwB/H,CAQD,SAAS9pK,EAAiC3f,EAAMoN,GAC5C2I,EAAS4e,QAAQjf,EAAO2iJ,yBAA0B,CAAEjyJ,KAAMpG,EAAMwL,MAAO4B,GAC1E,CA0GD,SAAS8O,EAAkBlc,EAASoN,EAAcH,EAAS3Q,EAAQJ,EAAS2R,GACxE,IAAMX,EAAM,IAAIpG,eAEhB,GAAIuR,EAASjB,MAAMskH,UAAUzrD,MAAQ53D,EAASjB,MAAMskH,UAAUzrD,KAAKhQ,SAC9C5nD,EAASjB,MAAMskH,UAAUzrD,KAAKn6C,OAC9BpnB,EAAA8hB,EAAAqzG,gBAA2B,CACxC,IAAM71H,EAAaiL,EAAU64I,kBAAkB,CAC3C1vJ,IAAKpC,EAAQoC,IACbnE,KAAMyF,EAAAwS,EAAA8rH,UAGNh0H,IACAhO,EAAQoC,IAAM0I,EAAA0lB,EAAA4jI,gCAAsCp0J,EAAQoC,IAAK,CAAC4L,IAEzE,CASL,IAAK,IAAMvK,KANXyJ,EAAIlF,KAAKhI,EAAQiI,OAAQjI,EAAQoC,KAAA,GACjC8K,EAAI3G,aAAevG,EAAQuG,aAC3B2G,EAAI7D,gBAAkBrJ,EAAQqJ,gBAC1B4D,EAAU,IACVC,EAAI7E,QAAU4E,GAEAjN,EAAQsG,QACtB4G,EAAIrD,iBAAiBpG,EAAKzD,EAAQsG,QAAQ7C,IAG9C,GAAI4U,EAASjB,MAAMskH,UAAUzrD,MAAQ53D,EAASjB,MAAMskH,UAAUzrD,KAAKhQ,SAC9C5nD,EAASjB,MAAMskH,UAAUzrD,KAAKn6C,OAC9BpnB,EAAA8hB,EAAA6jI,iBAA4B,CACzC,IAAMlwJ,EAAc8U,EAAUi5I,oBAAoB,CAC9C9vJ,IAAKpC,EAAQoC,IACbnE,KAAMyF,EAAAwS,EAAA8rH,UAGV,GAAI79H,EACA,IAAK,IAAMd,KAAUc,EAAa,CAC9B,IAAIE,EAAQF,EAAYd,GACpBgB,GACA6I,EAAIrD,iBAAiBxG,EAAQgB,EAEpC,CAER,CAGL,IAAMD,EAAgB,WAElBgJ,IACA,IAAMzJ,EAAiB2xB,MAAMjd,EAASjB,MAAMskH,UAAU8F,eAAe99H,EAAAwS,EAAA8rH,UApzBnC,IAozB2D3pH,EAASjB,MAAMskH,UAAU8F,eAAe99H,EAAAwS,EAAA8rH,SACrIhzH,EAA6BtG,YAAW,WACpCwT,EAAkBlc,EAASoN,EAAcH,EAAS3Q,EAAQJ,EAAS2R,EACtE,GAAElK,EACN,EAEDuJ,EAAIuxG,OAAS,WACT3vG,EAAoB,KAChBwH,KAAK1O,QAAU,KAAO0O,KAAK1O,QAAU,KAAOwF,GAAgB,EAC5D9Q,EAAOga,OAEP3S,EAAO8I,KAAK,2BAA6B6J,KAAK1O,OAAS,sCAAwCwF,GAC/FhJ,IAEP,EAED8I,EAAInE,UAAYmE,EAAIrE,QAAU,WAC1BiG,EAAoB,KAChB1B,GAAgB,EAChBS,EAAQyI,OAER3S,EAAO8I,KAAK,4EAA8EW,GAC1FhJ,IAEP,EAED8I,EAAIvE,QAAU,WACVzM,EAAQoa,KACX,EAGDP,EAAS4e,QAAQjf,EAAO+2K,wBAAyB,CAC7CrqL,IAAKpC,EAAQoC,IACbkE,QAAStG,EAAQsG,QACjB+lC,QAASrsC,EAAQoG,KACjBwjE,UAAW5pE,EAAQ4pE,YAGvB96D,EAAoB5B,EACpBA,EAAI1C,KAAKxK,EAAQoG,KACpB,CAMD,SAASka,IACDxR,IACAA,EAAkBvH,UAAYuH,EAAkBjG,QAAUiG,EAAkB6jE,gBAAA,EAC5E7jE,EAAkB1E,QAClB0E,EAAoB,MAGpBE,IACA8wB,aAAa9wB,GACbA,EAA6B,KAEpC,CA2DD,SAAS+Q,EAAe/f,EAAYoN,GAChC,GAAIA,EACA,IAAK,IAAMzJ,KAAOyJ,EACdpN,EAAW2D,GAAOyJ,EAAQzJ,EAGrC,CAWD,SAAS0c,EAAargB,EAAKoN,EAAWzJ,EAAiBsJ,EAAa3Q,GAChE,IAAIJ,EAAW,OACX2R,EAAO,KAEP7N,EAAI0H,WACJxL,EAAWI,EAAkBowL,iBAAiB1sL,EAAI0H,SAAU/D,EAAiBsJ,GAC7EY,EAAO,CACH8+K,eAAgB3sL,EAAI0H,UAAY,KAChCklL,aAAc5sL,EAAI4H,QAAU,KAC5BD,aAAc3H,EAAI6H,YAAc,OAIxC8X,EAAiCvS,EAAW,IAAIhJ,EAAAosB,EAAYnsB,EAAA4kL,sCACxD5kL,EAAA0lL,yCAA4DpmL,EAAkB,qCAC9E3D,EAAI6H,WAAa,MAAQ7H,EAAI4H,OAAS,oBAAsB5H,EAAIuI,WAAa,kBAAoBrM,EACjG2R,GAEP,CASD,SAAS0S,EAAcvgB,EAASoN,GAC5B,OAAKpN,EACEA,EAAQktB,QAAO,SAACltB,EAAM2D,GACzB,OAAO3D,EAAKgjC,MAAK,WACb,OAAOr/B,EAAKyJ,EACf,GACJ,GAAE7L,QAAQyE,WALUzE,QAAQyE,SAMhC,CAQD,SAASwa,EAAWxgB,EAAOoN,GACvB,IAAKiL,EAASjB,MAAMskH,UAAUyB,WAAWE,wBAAyB,CAI9D,GAHA15H,EAAOiS,MAAM,kBAGkB,SAA3B5V,EAAM7C,IAAIwpE,aAEV,YADAhjE,EAAO8I,KAAK,wEAA4EzM,EAAM7C,IAAIwpE,cAItG,GAA4B,IAAxBrqE,EAAaD,SACbsH,EAAO8I,KAAK,4EACZW,OAAA,IAAeA,EAAwB,EAAIA,EAAQ,GAn/BzB,GAw/BtB,YAHA6I,EAAe8K,KAAKrY,YAAW,WAC3B8X,EAAWxgB,EAAOoN,EACrB,GAt/BqB,MA6/B9B,IAAIS,EAAa7N,EAAM7C,IAAIkpD,SAM3B,GALI8E,YAAYsiB,OAAO5/D,KACnBA,EAAaA,EAAWwT,QAIxBhe,EAAmB,CACnB,IAAM6J,EAAgBhR,EAAA4uL,oBAAqCznL,EAAmBwK,GAC9E,GAAIX,GAEI4M,EAAqB5M,GACrB,MAGX,CAEDvJ,EAAOiS,MAAM,iBAAkB4L,OAAOC,aAAaC,MAAM,KAAM,IAAI/K,WAAW9I,KAE9E,IAAM1J,EAAchI,EAAwB0wL,sCAAsCh/K,EAAYG,EAAavK,GAC3G,GAA2B,IAAvBU,EAAY9H,OAEZ,YADAsH,EAAOiS,MAAM,4FAz5BzB,SAAkC5V,GAC9BiN,EAA2B8T,KAAK/gB,GAChCuX,EAAoCvX,GAAA,EACvC,CAHD,CA65BiCmE,EAC5B,CACJ,CAyCD,OArBAiJ,EAAW,CACPqqJ,mBAn+BJ,SAA4Bz3J,GAKxB,IAAKA,EACD,MAAM,IAAIwN,MAAM,0CAGpBiF,IAEAnW,EAAaykB,KAAK/gB,EACrB,EAw9BG2nJ,oBA5tBJ,WACIrrJ,EAAe,EAClB,EA2tBGo7J,4BAl9BJ,WACI,GAAKp7J,GAAwC,IAAxBA,EAAaD,OAAlC,CAIA,IAAI2D,EAAsB,GAC1B1D,EAAaoN,SAAQ,SAAC0D,GAClB,IAAMzJ,EAAYxH,EAAwB2wL,4CAA4C1/K,EAAMgqJ,kBAAmBppJ,EAAavK,GAExHE,EAAUtH,OAAS,IACgB,IAA/B2D,EAAoB3D,SACpB2D,EAAsB2D,GAG1BsJ,EAA2B8T,KAAKpd,GAEvC,IAEG3D,GAAuBA,EAAoB3D,OAAS,GACpDkb,EAAoCvX,GAAA,EAhBvC,CAkBJ,EA87BGirL,iBAAAz6J,EACAq6J,eAAA1xK,EACA4zK,iBAvoBJ,SAA0B/sL,GACtByS,IACAM,EAAgBg6K,iBAAiB/sL,EACpC,EAqoBGgtL,gBAxnBJ,SAAyBhtL,GACrByS,IACAM,EAAgBi6K,gBAAgBhtL,EACnC,EAsnBG0qE,qBAzmBJ,SAA8B1qE,GAC1ByS,IACAM,EAAgB23D,qBAAqB1qE,EACxC,EAumBG+/J,gBAAA77J,EACA+oL,eAzkBJ,SAAwBjtL,GACpByD,EAAczD,CACjB,EAwkBGktL,mBA9jBJ,SAA4BltL,GACxBmE,EAAkBnE,CACrB,EA6jBGggK,kBAjjBJ,SAA2BhgK,GACvBgO,EAAchO,EACd7D,EAAwB6jK,kBAAkBhgK,EAC7C,EA+iBG8sL,4CAptBJ,SAAqD9sL,GAEjD,OADAyS,IACOtW,EAAwB2wL,4CAA4C9sL,EAAKgO,EAAavK,EAChG,EAktBG0pL,cA5BJ,WACI,OAAOhxL,EAA0BA,EAAwBgxL,gBAAkB,EAC9E,EA2BGC,cArBJ,SAAuBptL,GACf7D,GACAA,EAAwBixL,cAAcptL,EAE7C,EAkBGggL,KA1iBJ,WACI1/J,IACIvN,GACAA,EAAgBitK,MAEvB,EAsiBGhxI,MA1hBJ,WACIj5B,EAAS2c,IAAIhd,EAAO23K,qBAAsB5wK,EAAerP,GACzD2I,EAAS2c,IAAIhd,EAAO43K,4BAA6BttK,EAAqB5S,GAEtEqF,IAEA6N,IAEApc,EAAgB,MAEhBb,EAAoB,KACpBgiB,GAAA,EAEItS,IACAA,EAAgBi8B,QAChBj8B,EAAkB,MAGtBkD,EAAevM,SAAQ,SAAA1J,GAAY,OAAI8/B,aAAa9/B,EAAjB,IACnCiW,EAAiB,GAEjB3Z,EAAe,GACf2Q,EAA6B,EAChC,GAxgBGtJ,EAASuS,EAAMsjH,UAAUpsH,GACzBH,EAA6B,GAC7B3Q,EAAe,GACfmH,EAAc,YACdU,EAAkB,GAClB2K,EAAoB,KACpBE,EAA6B,KAC7B+G,EAASqc,GAAG1c,EAAO23K,qBAAsB5wK,EAAerP,GACxD2I,EAASqc,GAAG1c,EAAO43K,4BAA6BttK,EAAqB5S,GAugClEA,CACV,CAED0B,EAAqB6qH,sBAAwB,uBAC7C,IAAA3qH,EAAeqW,EAAAmL,EAAAyqG,gBAA6BnsH,GCjkC5C3S,EANI,SAAA6D,EAAYoN,EAAOzJ,IAAA,SAAA3D,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAK,KAAA3oD,GACpBsW,KAAKi3K,MAAQngL,EACbkJ,KAAKnZ,IAAMwG,CACd,WAAAoP,EAAA/S,EAAAoN,GAAA,QAAAzJ,EAAA,EAAAA,EAAAyJ,EAAA/Q,OAAAsH,IAAA,KAAAsJ,EAAAG,EAAAzJ,GAAAsJ,EAAAmvD,WAAAnvD,EAAAmvD,aAAA,EAAAnvD,EAAA6wE,cAAA,YAAA7wE,IAAAA,EAAAmuH,UAAA,GAAAt+H,OAAAmC,eAAAe,EAAAiN,EAAA9P,IAAA8P,EAAA,MCyCL8I,EAjDM,WAQF,SAAA/V,EAAYoN,EAAUzJ,GAClB,GAAI,SAAJ3D,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,qCAAI,CADoB,KAAA3oD,GACpB2D,GAAiB,eAATA,GAAkC,cAATA,EACjC,MAAM,IAAI6J,MAAM,8EACpB8I,KAAKo1K,SAAWt+K,EAChBkJ,KAAKrY,KAAO0F,CACf,KAAAA,EAAA,OAAAA,EAAA,EAAAxG,IAAA,QAAA2K,MAOD,WACI,IAAI9H,EACAoN,EAAUkJ,KAAKo1K,SAASrvL,OACxBsH,EAAM,CAACpH,KAAM,IAEjB,IAAKyD,EAAI,EAAGA,EAAIoN,EAASpN,IAAK,CAC1B,IAAIiN,EAAM,CACNugL,IAAK,MACLC,IAAK,SACLC,IAAKp3K,KAAKo1K,SAAS1rL,GAAGutL,MACtBjqL,EAAGgT,KAAKo1K,SAAS1rL,GAAG7C,KAExBwG,EAAIpH,KAAKwkB,KAAK9T,EACjB,CACGqJ,KAAKrY,OACL0F,EAAI1F,KAAOqY,KAAKrY,MAEpB,IAAI3B,EAAY06B,KAAKC,UAAUtzB,GACzBzH,EAAMI,EAAUD,OAGlBwR,EAAM,IAAIs9C,YAAYjvD,GACtBgR,EAAQ,IAAIyJ,WAAW9I,GAC3B,IAAK7N,EAAI,EAAGA,EAAI9D,EAAK8D,IACjBkN,EAAMlN,GAAK1D,EAAUwjB,WAAW9f,GACpC,OAAO6N,CACV,MAAAkF,EAjCA/S,EAiCAjD,UAAA4G,GAAA3D,CAAA,CA9CC,YAAA0V,EAAA1V,EAAAoN,GAAA,QAAAzJ,EAAA,EAAAA,EAAAyJ,EAAA/Q,OAAAsH,IAAA,KAAAsJ,EAAAG,EAAAzJ,GAAAsJ,EAAAmvD,WAAAnvD,EAAAmvD,aAAA,EAAAnvD,EAAA6wE,cAAA,YAAA7wE,IAAAA,EAAAmuH,UAAA,GAAAt+H,OAAAmC,eAAAe,EAAAiN,EAAA9P,IAAA8P,EAAA,MCkBNiJ,EADgB,IAjBV,WAYF,SAAAlW,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAe,KAAA3oD,GACXsW,KAAKgqC,MACR,KAAA38C,EAAA,OAAAA,EAAA,EAAAxG,IAAA,OAAA2K,MAZD,WACIwO,KAAKq3K,wBAA0B,kBAC/Br3K,KAAKs3K,wBAA0B,qBAC/Bt3K,KAAKu3K,yBAA2B,0BAChCv3K,KAAKw3K,wCAA0C,yCAC/Cx3K,KAAKy3K,8BAAgC,OACrCz3K,KAAK03K,gCAAkC,SACvC13K,KAAK23K,8BAAgC,MACxC,MAAAv4K,EAIA1V,EAJAjD,UAAA4G,GAAA3D,CAAA,CAOe,ICjBdkZ,EAAO,uCACP/C,EAAeD,EAAAy3K,wBACf13K,EAAc,YAAciD,EAElC,SAASD,EAAkBjZ,GAGvB,IACMoN,GAFNpN,EAASA,GAAU,CAAC,GAEEoxJ,OA8FtB,MAZW,CACPhrI,KAAAlN,EACA4yK,YAAA71K,EACAi0K,aAAA/zK,EACA+3K,YArDJ,SAAqBluL,EAAI2D,GACrB,IACI,IAAIsJ,EAAW/Q,EAAAiyL,mCAAoDnuL,EAAIoN,GAEvE,IAAKH,GAAYtJ,EAAuB,CACpC,IACMrH,EAAO,CAAEsqB,KAAM,CAUjC,SAA8C5mB,GAC1C,IACI,IAAIoN,EAAMpN,EAAewC,QAAQ,KAAM,IAIvC,OAHA4K,EAAM/F,KAAK+F,EAAI8iB,MAAM,UAAUrK,KAAI,SAAC7lB,GAChC,OAAOwhB,OAAOC,aAAajL,SAASxW,EAAG,IAC1C,IAAEuO,KAAK,MACG/L,QAAQ,KAAM,IACpBA,QAAQ,MAAO,KACfA,QAAQ,MAAO,IAGvB,CAFC,MAAOxC,GACL,OAAO,IACV,CACJ,CAZD,CAXwE2D,EAAsB,uBAElFsJ,GAAW,IAAI29K,aAAcz0D,OAAOn/F,KAAKC,UAAU36B,GACtD,CAED,OAAO2Q,CAGV,CAFC,MAAOjN,GACL,OAAO,IACV,CACJ,EAwCGmsL,6BAxBJ,WAEI,MAAO,CACH,eAAgB,mBAEvB,EAoBGE,6BAlBJ,SAAsCrsL,GAClC,OAAOg3B,KAAKC,UAAUD,KAAK/F,MAAMzP,OAAOC,aAAaC,MAAM,KAAM,IAAI/K,WAAW3W,KACnF,EAiBGgsL,gCAfJ,WACI,OAAO,IACV,EAcGoC,WAZJ,WACI,OAAO,IACV,EAWGC,+BA/EJ,SAAwCruL,EAAgBoN,GACpD,IAAIzJ,EAAc,KAClB,GAAI3D,EAAgB,CAKhB,IAFA,IAAMiN,EAAU+pB,KAAK/F,MAAMzP,OAAOC,aAAaC,MAAM,KAAM,IAAI/K,WAAWvJ,KACpE9Q,EAAW,GACRJ,EAAI,EAAGA,EAAI+Q,EAAQ2Z,KAAKvqB,OAAQH,IAAK,CAC1C,IAAM2R,EAAaZ,EAAQ2Z,KAAK1qB,GAC1BgR,EAAYlN,EAAe2qL,WAAa3qL,EAAe2qL,UAAU1tL,eAAe4Q,GAAe7N,EAAe2qL,UAAU98K,GAAc,KAC5I,IAAKX,EACD,MAAM,IAAIM,MAAM,wBAA0BK,EAAa,mBAG3DvR,EAASykB,KAAK,IAAI5kB,EAAQ0R,EAAYX,GACzC,CACDvJ,EAAc,IAAIoS,EAAezZ,EACpC,CACD,OAAOqH,CACV,EAgEJ,CAEDsV,EAAkB0gH,sBAAwB,oBAC1C,IAAAthH,EAAeygH,OAAOE,aAAaY,oBAAoB3gH,GC1GjD3B,EAAO,uCACP7E,EAAeyD,EAAAy3K,wBACfp2K,EAAc,YAAcD,EAElC,SAASzM,EAAqB7K,GAC1B,IAAIoN,EACEzJ,EAAS3D,EAAOoxJ,OAChBnkJ,EAASjN,EAAO4V,MAAM4jH,UAAUpsH,GAkEtC,MAZW,CACPgZ,KAAM9O,EACNw0K,YAAav0K,EACb2yK,aAAcz3K,EACdy7K,YAxBJ,SAAqBluL,GACjB,OAAO9D,EAAAiyL,mCAAoDnuL,EAAI2D,EAClE,EAuBGwoL,6BArBJ,WACI,OAAO,IACV,EAoBGE,6BAlBJ,SAAsCrsL,GAClC,OAAO,IAAI2W,WAAW3W,EACzB,EAiBGgsL,gCAfJ,WACI,OAAO,IACV,EAcGoC,WAZJ,WACI,OAAO,IACV,EAWGC,+BApDJ,SAAwCruL,EAAgBoN,GACpD,IAAIzJ,EAAc,KAClB,GAAI3D,EAAgB,CAKhB,IAFA,IAAM1D,EAAU06B,KAAK/F,MAAMzP,OAAOC,aAAaC,MAAM,KAAM,IAAI/K,WAAWvJ,KACpElR,EAAW,GACR2R,EAAI,EAAGA,EAAIvR,EAAQsqB,KAAKvqB,OAAQwR,IAAK,CAC1C,IAAMX,EAAa5Q,EAAQsqB,KAAK/Y,GAC1BG,EAAYhO,EAAe2qL,WAAa3qL,EAAe2qL,UAAU1tL,eAAeiQ,GAAelN,EAAe2qL,UAAUz9K,GAAc,KAC5I,IAAKc,EACD,MAAM,IAAIR,MAAM,wBAA0BN,EAAa,mBAG3DhR,EAAS6kB,KAAK,IAAI5kB,EAAQ+Q,EAAYc,GACzC,CACDrK,EAAc,IAAIoS,EAAe7Z,GAEjC+Q,EAAOR,KAAK,4JACf,CACD,OAAO9I,CACV,EAmCJ,CAEDkH,EAAqB8uH,sBAAwB,uBAC7C,IAAAr2H,EAAew1H,OAAOE,aAAaY,oBAAoB/uH,GCxEjDsO,EAAO,uCACPqX,EAAeta,EAAA03K,wBACfx0K,EAAc,YAAcD,EAElC,SAASW,EAAkB9Z,GAGvB,IACMoN,GAFNpN,EAASA,GAAU,CAAC,GAEEoxJ,OAiCtB,MAXW,CACPhrI,KAAAjN,EACA2yK,YAAA1yK,EACA8wK,aAAA15J,EACA09J,YAxBJ,SAAqBluL,GACjB,OAAO9D,EAAAiyL,mCAAoDnuL,EAAIoN,EAClE,EAuBG++K,6BArBJ,WACI,OAAO,IACV,EAoBGE,6BAlBJ,SAAsCrsL,GAClC,OAAO,IAAI2W,WAAW3W,EACzB,EAiBGgsL,gCAfJ,WACI,OAAO,IACV,EAcGoC,WAZJ,WACI,OAAO,IACV,EAcJ,CAEDt0K,EAAkB6/G,sBAAwB,oBAC1C,IAAAz1H,EAAe40H,OAAOE,aAAaY,oBAAoB9/G,GC9CjD2N,EAAO,uCACPzH,EAAe9J,EAAA23K,yBACfpxK,EAAc,YAAcgL,EAGlC,SAAS9H,EAAmB3f,GAGxB,IACIoN,EAAgB,SACdzJ,GAHN3D,EAASA,GAAU,CAAC,GAGEoxJ,OAChBnkJ,EAAWjN,EAAOo5G,SAExB,SAAS98G,IACL,IAAKqH,IAAWA,EAAO1G,eAAe,iBAAmB0G,EAAO1G,eAAe,eAC3E,MAAM,IAAIuQ,MAAM,8BAEvB,CAsPD,MAZW,CACP4Y,KAAAqB,EACAqkK,YAAArvK,EACAytK,aAAAlqK,EACAkuK,YA1HJ,SAAqBluL,GASjB,IAMIoN,EACAH,EACAY,EACAX,EACAc,EAVEvK,EAAc,IAAIkT,WAAW,CAAC,IAAM,IAAM,IAAM,IAAM,EAAM,EAAM,EAAM,IACxExS,EAAoB,IAAIwS,WAAW,CAAC,IAAM,EAAM,IAAM,IAAM,IAAM,GAAM,GAAM,IAAM,IAAM,IAAM,IAAM,GAAM,IAAM,IAAM,GAAM,MAEhItT,EAAa,EACbgB,EAA6B,KASjC,GADA/H,KACK0D,EACD,OAAO,KAGX,GAAI,SAAUA,EACV,OAAO9D,EAAAiyL,mCAAoDnuL,EAAQ2D,GAGvE,GAAI,QAAS3D,EACTqE,EAA6BV,EAAOyyH,YAAYp2H,EAAOsuL,IAAI9hC,YAE1D,MAAI,aAAcxsJ,GAInB,OAAO,KAHPqE,EAA6BV,EAAOyyH,YAAYp2H,EAAOuuL,SAAS/hC,OAInE,CAyBD,OAvBAp/I,EAAU/I,EAA2BhI,OACrC4Q,EAAW,EAAMxJ,EAAYpH,OAAS8H,EAAkB9H,OAAS,EAAM+Q,EAEvES,EAAgB,IAAIs9C,YAAYl+C,GAEhCC,EAAU,IAAIyJ,WAAW9I,IACzBG,EAAW,IAAI2Z,SAAS9Z,IAEf+Z,UAAUvkB,EAAY4J,GAC/B5J,GAAc,EAEd6J,EAAQ2M,IAAIpW,EAAaJ,GACzBA,GAAcI,EAAYpH,OAE1B6Q,EAAQ2M,IAAI1V,EAAmBd,GAC/BA,GAAcc,EAAkB9H,OAEhC2R,EAAS4Z,UAAUvkB,EAAY+J,GAC/B/J,GAAc,EAEd6J,EAAQ2M,IAAIxV,EAA4BhB,GACxCA,GAAc+J,EAEPF,EAAQmU,MAClB,EA2DG8qK,6BA7OJ,SAAsCnsL,GAClC,IAAI2D,EACArH,EACEJ,EAAU,CAAC,EACX2R,EAAS,IAAI8T,UAEnB,GAAI1U,GAAYA,EAASmK,MAAMskH,UAAUyB,WAAWG,8BAE1B,WAAlBlwH,GAA8BpN,GAAWA,EAAQuhB,WAAa,GAAM,EAEpE,OADArlB,EAAQ,gBAAkB,0BACnBA,EAIf,IAAMgR,EAA8B,WAAlBE,EAA8B,IAAIgU,YAAYphB,GAAW,IAAI2W,WAAW3W,GAE1F2D,EAAM6d,OAAOC,aAAaC,MAAM,KAAMxU,GAKtC,IAFA,IAAMc,GAFN1R,EAASuR,EAAO+T,gBAAgBje,EAAK,oBAEPke,qBAAqB,QAC7Cpe,EAAkBnH,EAAOulB,qBAAqB,SAC3C1d,EAAI,EAAGA,EAAI6J,EAAe3R,OAAQ8H,IACvCjI,EAAQ8R,EAAe7J,GAAG2d,WAAW,GAAGC,WAAate,EAAgBU,GAAG2d,WAAW,GAAGC,UAc1F,OATI7lB,EAAQe,eAAe,aACvBf,EAAQ,gBAAkBA,EAAQsyL,eAC3BtyL,EAAQsyL,SAIdtyL,EAAQe,eAAe,kBACxBf,EAAQ,gBAAkB,2BAEvBA,CACV,EAyMGmwL,6BAvMJ,SAAsCrsL,GAClC,IAAI9D,EAAiB,KACf2R,EAAS,IAAI8T,UAEnB,GAAI1U,GAAYA,EAASmK,MAAMskH,UAAUyB,WAAWG,8BAE1B,WAAlBlwH,GAA8BpN,GAAWA,EAAQuhB,WAAa,GAAM,EACpE,OAAOvhB,EAIf,IAAMkN,EAA8B,WAAlBE,EAA8B,IAAIgU,YAAYphB,GAAW,IAAI2W,WAAW3W,GAE1F1D,IACA,IAAM0R,EAAMwT,OAAOC,aAAaC,MAAM,KAAMxU,GACtCzJ,EAASoK,EAAO+T,gBAAgB5T,EAAK,mBAE3C,IAAIvK,EAAOoe,qBAAqB,uBAAuB,GASnD,OAAO7hB,EARP,IAAMmE,EAAYV,EAAOoe,qBAAqB,aAAa,GAAGC,WAAW,GAAGC,UAWhF,OAVQ5d,IACAjI,EAAiByH,EAAO6f,OAAOrf,IAShCjI,CACV,EA0KG8vL,gCAxKJ,SAAyChsL,GACrC,GAAIA,EAMA,IALA,IAAMoN,EAAO,IAAIua,SAAS3nB,GACpB2D,EAAayJ,EAAKwrH,UAAU,GAAG,GACjC3rH,EAAS,EACP3Q,EAAS,IAAIqlB,UAEVzlB,EAAI,EAAGA,EAAIyH,EAAYzH,IAAK,CAEjC,IAAM2R,EAAaT,EAAKwrH,UAAU3rH,GAAA,GAClCA,GAAU,EACV,IAAMC,EAAeE,EAAKwrH,UAAU3rH,GAAA,GAEpC,GADAA,GAAU,EACS,IAAfY,EAAJ,CAKA,IAAMG,EAAahO,EAAS0W,MAAMzJ,EAAQA,EAASC,GAC7CzJ,EAAS+d,OAAOC,aAAaC,MAAM,KAAM,IAAIN,YAAYpT,IACzD7J,EAAS7H,EAAOslB,gBAAgBne,EAAQ,mBAG9C,GAAIU,EAAO0d,qBAAqB,UAAU,GAAI,CAC1C,IAAMxe,EAAQc,EAAO0d,qBAAqB,UAAU,GAAGC,WAAW,GAAGC,UACrE,GAAI1e,EACA,OAAOA,CAEd,CAGD,GAAIc,EAAO0d,qBAAqB,WAAW,GAAI,CAC3C,IAAMxd,EAASF,EAAO0d,qBAAqB,WAAW,GAAGC,WAAW,GAAGC,UACvE,GAAI1d,EACA,OAAOA,CAEd,CApBA,MAFG4I,GAAUC,CAuBjB,CAGL,OAAO,IACV,EAgIGkhL,WA1CJ,SAAoBpuL,GAChB,IAAIoN,EACAH,EACA/Q,EACA2R,EAGJ,GADAvR,KACK0D,EAAU,OAAO,KAItB,IADAoN,EAAa,GACRS,EAAI,EAAGA,EAAI7N,EAAS3D,SAAUwR,EAC/BT,EAAW2T,KAAK/gB,EAAS8f,WAAWjS,IACpCT,EAAW2T,KAAK,GAapB,IAXA3T,EAAaoU,OAAOC,aAAaC,MAAM,KAAMtU,GAG7CA,EAAazJ,EAAOwyH,OAAO/oH,GAI3BH,EA5OU,yMA4OUzK,QAAQ,eAAgB4K,GAG5ClR,EAAe,GACV2R,EAAI,EAAGA,EAAIZ,EAAQ5Q,SAAUwR,EAC9B3R,EAAa6kB,KAAK9T,EAAQ6S,WAAWjS,IACrC3R,EAAa6kB,KAAK,GAGtB,OAAO,IAAIpK,WAAWza,GAAcmlB,MACvC,EAWGotK,0BArDJ,SAAmCzuL,GAC/B,GAAe,UAAXA,GAAiC,WAAXA,EACtB,MAAM,IAAIwN,MAAM,8DAEpBJ,EAAgBpN,CACnB,EAoDJ,CAED2f,EAAmBg6G,sBAAwB,qBAC3C,IAAAz9G,EAAe48G,OAAOE,aAAaY,oBAAoBj6G,GC3QvD,SAASW,EAAStgB,GAGd,IAAMoN,GADNpN,EAASA,GAAU,CAAC,GACEoxJ,OAEhBztJ,EAAa,CAAC,EAyDpB,OAxDAA,EAAWuS,EAAA03K,yBAA+C,CACtDrnL,aAAc,OACd6lL,kBAAmB,SAAUpsL,GACzB,OAAOoN,EAAOgpH,YAAYp2H,EAAS0uL,QACtC,EACDhC,iBAAkB,SAAU1sL,GACxB,OAAOA,CACV,GAEL2D,EAAWuS,EAAA23K,0BAAgD,CACvDtnL,aAAc,cACd6lL,kBAAmB,SAAUpsL,GACzB,OAAOA,CACV,EACD0sL,iBAAkB,SAAU1sL,GACxB,OAAOwhB,OAAOC,aAAaC,MAAM,KAAM,IAAI/K,WAAW3W,GACzD,GAgCM,CACPisL,wBAtBJ,SAAiCjsL,GAC7B,OAAOA,CACV,EAqBGssL,cAnBJ,WACI,MAAO,MACV,EAkBGC,gBAhBJ,SAAyBvsL,GACrB,OAAO2D,EAAW3D,GAAcuG,YACnC,EAeG6lL,kBAbJ,SAA2BpsL,EAAgBiN,GAEvC,OApBJ,WACI,IAAKG,IAAWA,EAAOnQ,eAAe,eAClC,MAAM,IAAIuQ,MAAM,8BAEvB,CAJD,GAoBW7J,EAAWsJ,GAAcm/K,kBAAkBpsL,EACrD,EAWG0sL,iBATJ,SAA0B1sL,EAAgBoN,GACtC,OAAOzJ,EAAWyJ,GAAcs/K,iBAAiB1sL,EACpD,EAWJ,CAEDsgB,EAASq5G,sBAAwB,WACjC,IAAA55G,EAAe+4G,OAAOE,aAAaY,oBAAoBt5G,GC7DvD,SAASD,IAEL,IAEMrgB,EAAO,4CAEb,SAASoN,EAAapN,GAClB,IAAMoN,EAAgBoU,OAAOC,aAAaC,MAAM,KAAM,IAAI/K,WAAW3W,IAErE,OADsB48D,mBAAmB88C,OAAOtsG,GAEnD,CAED,SAASzJ,EAAoBA,GACzB,GAAIX,OAAO2e,UAAW,CAClB,IAAM1U,EAAiBG,EAAazJ,GAE9BrH,GADS,IAAI0G,OAAO2e,WACJC,gBAAgB3U,EAAgB,YAChD/Q,EAAWI,EAASA,EAAOkrK,uBAAuBxnK,EAAM,YAAY,GAAK,KACzE6N,EAAO3R,EAAWA,EAASsrK,uBAAuBxnK,EAAM,QAAQ,GAAK,KAG3E,GAFc6N,GAAOA,EAAK25J,uBAAuBxnK,EAAM,SAAS,GAG5D,OAAO,IAEd,CACD,OAAO2D,CACV,CAED,SAASsJ,EAAmBtJ,GACxB,IAAIsJ,EAAc,GACd3Q,EAAa,GACbJ,EAAU,GACV2R,GAAW,EACXX,GAAS,EAEb,GAAIlK,OAAO2e,UAAW,CAClB,IAAM3T,EAAiBZ,EAAazJ,GAE9BF,GADS,IAAIT,OAAO2e,WACJC,gBAAgB5T,EAAgB,YAChD7J,EAAWV,EAASA,EAAO+jK,uBAAuBxnK,EAAM,YAAY,GAAK,KACzEqD,EAAOc,EAAWA,EAASqjK,uBAAuBxnK,EAAM,QAAQ,GAAK,KACrEqE,EAAQhB,EAAOA,EAAKmkK,uBAAuBxnK,EAAM,SAAS,GAAK,KAC/DoE,EAASC,EAAQA,EAAMwd,qBAAqB,UAAU,GAAK,KAC3Dvd,EAAYF,EAASA,EAAOyd,qBAAqB,aAAa,GAAK,KACrE/d,EAAO,KAEX,GAAc,OAAVO,EACA,OAAO2J,EAIXf,GADAnJ,EAAOO,EAAMwd,qBAAqB,eAAe,GAAGo+D,YAC/Bn8E,EAAKie,UAAY,KAEpB,OAAdzd,IAEAhI,GADAwH,EAAOQ,EAAUud,qBAAqB,cAAc,IAChC/d,EAAKm8E,WAAWl+D,UAAY,KAGhDlU,GADA3R,GADA4H,EAAOQ,EAAUud,qBAAqB,WAAW,IAChC/d,EAAKm8E,WAAWl+D,UAAY,MACzB7lB,EAAQkS,YAAY,KAAO,GAAK,EACpDlB,EAAQhR,EAAUA,EAAQuM,QAAQ,MAAQ,EAC1CvM,EAAUA,EAAUA,EAAQiS,UAAUN,EAASX,GAAS,GAE/D,CAED,IAAIxJ,EAAc,SAAH9D,OAAYtD,EAAZ,YAAAsD,OAAiCqN,GAKhD,OAJI/Q,IACAwH,GAAe,cAAJ9D,OAAkB1D,IAG1BwH,CACV,CA8BD,MARW,CACPuoL,wBArBJ,SAAiCjsL,GAC7B,OAAOA,CACV,EAoBGssL,cAlBJ,WACI,MAAO,MACV,EAiBGC,gBAfJ,WACI,MAAO,aACV,EAcGH,kBAZJ,SAA2BpsL,GACvB,OAAO2D,EAAoBzG,KAAKoZ,KAAMtW,EACzC,EAWG0sL,iBATJ,SAA0B1sL,GACtB,OAAOiN,EAAmB/P,KAAKoZ,KAAMtW,EACxC,EAWJ,CAEDqgB,EAAUs5G,sBAAwB,YAClC,IAAAp5G,EAAe8E,EAAAmL,EAAAopG,oBAAiCv5G,GCnHhD,SAASG,IAgCL,MARW,CACPyrK,wBArBJ,SAAiCjsL,GAC7B,OAAOA,CACV,EAoBGssL,cAlBJ,WACI,MAAO,MACV,EAiBGC,gBAfJ,WACI,MAAO,aACV,EAcGH,kBAZJ,SAA2BpsL,GACvB,OAAOA,CACV,EAWG0sL,iBATJ,SAA0B1sL,GACtB,OAAOwhB,OAAOC,aAAaC,MAAM,KAAM,IAAI/K,WAAW3W,GACzD,EAWJ,CAEDwgB,EAASm5G,sBAAwB,WACjC,IAAAl5G,EAAeq4G,OAAOE,aAAaY,oBAAoBp5G,GC3BvD,SAASiQ,KA2CL,MARW,CACPw7J,wBAhCJ,SAAiCjsL,GAC7B,OAAOA,CACV,EA+BGssL,cA7BJ,WACI,MAAO,MACV,EA4BGC,gBA1BJ,WACI,MAAO,MACV,EAyBGH,kBAvBJ,SAA2BpsL,GACvB,IAAKA,EAAe/C,eAAe,QAC/B,OAAO,KAGX,IADA,IAAImQ,EAAW,GACNzJ,EAAI,EAAGA,EAAI3D,EAAezD,KAAKF,OAAQsH,IAAK,CACjD,IAAIsJ,EAAUjN,EAAezD,KAAKoH,GAC9BrH,EAAQ2Q,EAAQygL,IAAIlrL,QAAQ,KAAM,IAClCtG,EAAM+Q,EAAQ3J,EAAEd,QAAQ,KAAM,IAElC4K,EAAS2T,KAAK,IAAI5kB,EAAQG,EAAOJ,GACpC,CACD,OAAO,IAAI6Z,EAAe3I,EAC7B,EAWGs/K,iBATJ,SAA0B1sL,GACtB,OAAOwhB,OAAOC,aAAaC,MAAM,KAAM,IAAI/K,WAAW3W,GACzD,EAWJ,CAEDywB,GAASkpG,sBAAwB,WACjC,IAAAjpG,GAAeooG,OAAOE,aAAaY,oBAAoBnpG,IC5CvD,SAAS9P,KAEL,IAEI3gB,EACAoN,EACAzJ,EACAsJ,EACA3Q,EACAuR,EACAX,EACAc,EATAvK,EAAU6S,KAAK9V,QAwTnB,SAAS2D,EAAyBnE,EAAcoN,GAC5C,OAAKA,GACGpN,KAAgBoN,EAAeA,EAAYpN,GAD1B,IAE5B,CAED,SAASqD,EAAcrD,EAAUoN,GAE7B,OAAIpN,GAAYA,EAAS4pE,UACd5pE,EAAS4pE,UACTx8D,GAAMA,EAAGw8D,UACTx8D,EAAGw8D,UAEP,IACV,CAED,SAASvlE,EAAgBrE,EAAUoN,GAC/B,OAAQpN,GAAYA,EAASwoE,YAAexoE,EAASwoE,YAAcp7D,CACtE,CAiBD,OAfApN,EAAW,CACPqqI,WAhTJ,WAGI,IAAIrqI,EAFJiN,EAAa,GAKbjN,EAAYkc,EAAmBzY,GAAS01H,YAAY,CAACi4B,OAAQ90J,EAAQ88G,SAAUvrG,IAC/EZ,EAAW8T,KAAK/gB,GAGhBA,EAAYkE,EAAkBT,GAAS01H,YAAY,CAACi4B,OAAQ90J,IAC5D2Q,EAAW8T,KAAK/gB,GAGhBA,EAAYqY,EAAkB5U,GAAS01H,YAAY,CAACi4B,OAAQ90J,IAC5D2Q,EAAW8T,KAAK/gB,GAChBkN,EAAoBlN,EAGpBA,EAAYsD,EAAqBG,GAAS01H,YAAY,CAACi4B,OAAQ90J,EAAQsZ,MAAOxI,IAC9EH,EAAW8T,KAAK/gB,GAChBgO,EAAuBhO,CAC1B,EA2RGggK,kBAtCJ,SAA2BhgK,GASvB,IARA,IAAkCoN,EAC1BzJ,EAOCrH,EAAI,EAAGA,EAAI2Q,EAAW5Q,OAAQC,IAAK,CACxC,IAAIJ,EAAY+Q,EAAW3Q,GACvBJ,EAAUe,eAAe,SACzBf,EAAUokD,MAXgBlzC,EAWOlR,EAAUguL,aAV3CvmL,OAAA,EAAAA,EAAW,KACX3D,IACA2D,EAAYyJ,KAAmBpN,EAAqBA,EAAkBoN,GAAmB,MAEtFzJ,GAQV,CACJ,EAwBG+mL,WA7NJ,SAAoB1qL,GAChB,OAAQA,IAAckN,GAAqBlN,IAAcgO,CAC5D,EA4NGm9K,eAhNJ,SAAwBnrL,EAAWoN,GAC/B,GAAIpN,EAAUuhB,aAAenU,EAAUmU,WAAY,CAI/C,IAHA,IAAI5d,EAAQ,IAAIgT,WAAW3W,GACvBiN,EAAQ,IAAI0J,WAAWvJ,GAElB9Q,EAAI,EAAGA,EAAIqH,EAAMtH,OAAQC,IAC9B,GAAIqH,EAAMrH,KAAO2Q,EAAM3Q,GACnB,OAAO,EAGf,OAAO,CACV,CACD,OAAO,CACV,EAoMG6wL,cAlRJ,WACI,OAAOlgL,CACV,EAiRGmgL,cAtQJ,SAAuBptL,GACnBiN,EAAajN,CAChB,EAqQG2uL,2BAxPJ,SAAoC3uL,GAChC,IAAK,IAAIoN,EAAI,EAAGA,EAAIH,EAAW5Q,OAAQ+Q,IACnC,GAAIH,EAAWG,GAAG88K,eAAiBlqL,EAC/B,OAAOiN,EAAWG,GAG1B,OAAO,IACV,EAkPG0/K,4CApLJ,SAAqD9sL,EAAKoN,EAAazJ,GACnE,IAAIrH,EAAIuR,EAAIX,EAAOc,EACfvK,EAAc,GAElB,GAAIzD,EAAK,CACL,IAAMoE,EAAwBlI,EAAA0yL,0BAA2C5uL,GACzE,IAAKkN,EAAQ,EAAGA,EAAQD,EAAW5Q,SAAU6Q,EAAO,CAIhD,IAAM5I,EAAWH,GAHjB0J,EAAKZ,EAAWC,IAG6Bg9K,aAAc98K,GAE3D,IAAKY,EAAQ,EAAGA,EAAQhO,EAAI3D,SAAU2R,EAElC,IADA1R,EAAK0D,EAAIgO,IACF+sC,YAAYnxC,gBAAkBiE,EAAGi+K,YAAa,CAEjD,IAAIhoL,EAAW+J,EAAGqgL,YAAY5xL,EAAI8H,GAElCX,EAAYsd,KAAK,CACbmsD,GAAIjgE,EAAWC,GACfka,MAAO9qB,EAAG8qB,MACVi/B,SAAUviD,EACVsmL,SAAU9lL,EACVuqL,QAAShhL,EAAGugL,WAAW9pL,EAAWA,EAASuqL,QAAU,MACrDjlH,UAAWvmE,EAAciB,EAAUhI,GACnCksE,YAAankE,EAAgBC,EAAUX,IAE9C,CAER,CACJ,CACD,OAAOF,CACV,EAqJGopL,sCAnIJ,SAA+C7sL,EAAUoN,EAAazJ,GAKlE,IAJA,IAEIrH,EAFAuR,EAAc,GACdX,EAAOhR,EAAAgsL,cAA+BloL,GAGjCgO,EAAQ,EAAGA,EAAQf,EAAW5Q,SAAU2R,EAAO,CAKpD,IAAMvK,EAAWU,GAJjB7H,EAAK2Q,EAAWe,IACKk8K,aAGsC98K,GAEvD9Q,EAAG8pB,QAAQlZ,GACXW,EAAYkT,KAAK,CACbmsD,GAAI5wE,EACJ+pD,SAAUn5C,EAAK5Q,EAAG8pB,MAClBgkK,SAAU3mL,EACVorL,QAASvyL,EAAG8xL,WAAW3qL,EAAWA,EAASorL,QAAU,MACrDjlH,UAAWvmE,EAAcI,GACzB+kE,YAAankE,EAAgBZ,EAAUE,IAGlD,CACD,OAAOkK,CACV,EA4GG09K,8BAzFJ,SAAuCvrL,EAAWoN,EAAUzJ,GAIxD,GAAoB,oBAAhBA,GAAqD,8BAAhBA,EACrC,OAAO,KAGX,IAAIsJ,EAAoB,KAWxB,OAVIG,GAAYA,EAASnQ,eAAe,YACpCgQ,EAAoB8S,EAAStc,GAAS01H,YAAY,CAACi4B,OAAQ90J,IACpD0D,EAAUkqL,eAAiBh0K,EAAA03K,wBAClC3gL,EAAoBwT,EAAShd,GAAS01H,cAC/Bn5H,EAAUkqL,eAAiBh0K,EAAA23K,yBAClC5gL,EAAoBsT,EAAU9c,GAAS01H,cAChCn5H,EAAUkqL,eAAiBh0K,EAAAy3K,0BAClC1gL,EAAoByjB,GAASjtB,GAAS01H,eAGnClsH,CACV,EAsEGw+K,8BAxDJ,SAAuCzrL,EAAmBoN,EAAUH,GAChE,IACI,OAAOjN,EAAkBquL,+BAA+BjhL,EAAUH,EAIrE,CAHC,MAAOjN,GAEL,OADA2D,EAAO6H,MAAM,oDACN,IACV,CACJ,EAkDG+rI,UA5UJ,SAAmBtqI,GACVA,IAEDA,EAAO2I,QACPxI,EAAQH,EAAO2I,MACfjS,EAASyJ,EAAMosH,UAAUx5H,IAGzBiN,EAAOmkJ,SACP90J,EAAS2Q,EAAOmkJ,QAGjBnkJ,EAAOmsG,WACNvrG,EAAWZ,EAAOmsG,UAEzB,GAgUMp5G,CACV,CAED2gB,GAAwBg5G,sBAAwB,0BAChD,IAAAhpG,GAAemoG,OAAOE,aAAaY,oBAAoBj5G,IAAA,SAAAD,GAAA1gB,GAAA,OAAA0gB,GAAA,mBAAAnd,QAAA,iBAAAA,OAAA85E,SAAA,SAAAr9E,GAAA,cAAAA,CAAA,WAAAA,GAAA,OAAAA,GAAA,mBAAAuD,QAAAvD,EAAA5D,cAAAmH,QAAAvD,IAAAuD,OAAAxG,UAAA,gBAAAiD,CAAA,EAAA0gB,GAAA1gB,EAAA,UAAA4gB,GAAA5gB,EAAAoN,GAAA,OAAAwT,GAAA9jB,OAAA4nI,gBAAA,SAAA1kI,EAAAoN,GAAA,OAAApN,EAAA8oD,UAAA17C,EAAApN,CAAA,EAAA4gB,GAAA5gB,EAAAoN,EAAA,UAAA6T,GAAAjhB,EAAAoN,GAAA,OAAAA,GAAA,WAAAsT,GAAAtT,IAAA,mBAAAA,EAAA,SAAApN,GAAA,YAAAA,EAAA,UAAAwxC,eAAA,oEAAAxxC,CAAA,EAAAA,GAAAoN,CAAA,UAAA4T,GAAAhhB,GAAA,OAAAghB,GAAAlkB,OAAA4nI,eAAA5nI,OAAAuC,eAAA,SAAAW,GAAA,OAAAA,EAAA8oD,WAAAhsD,OAAAuC,eAAAW,EAAA,EAAAghB,GAAAhhB,EAAA,KCrNvDkiB,GADuB,IArJjB,SAAAliB,IAAA,SAAAA,EAAAoN,GAAA,sBAAAA,GAAA,OAAAA,EAAA,UAAAu7C,UAAA,sDAAA3oD,EAAAjD,UAAAD,OAAA8D,OAAAwM,GAAAA,EAAArQ,UAAA,CAAAX,YAAA,CAAA0L,MAAA9H,EAAAo7H,UAAA,EAAAt9C,cAAA,KAAA1wE,GAAAwT,GAAA5gB,EAAAoN,EAAA,EAAA9Q,EAAA0D,GAAA,IAAAoN,EAAAzJ,EAAAsJ,GAAAG,EAAA9Q,EAAAqH,EAAA,kCAAA45E,UAAAA,QAAAC,UAAA,YAAAD,QAAAC,UAAAmnD,KAAA,+BAAAC,MAAA,oBAAA9nB,QAAA//G,UAAAF,QAAAK,KAAAqgF,QAAAC,UAAAs/B,QAAA,6BAAA98G,GAAA,4BAAAA,EAAAiN,EAAA+T,GAAA5T,GAAA,GAAAzJ,EAAA,KAAArH,EAAA0kB,GAAA,MAAA5kB,YAAA4D,EAAAu9E,QAAAC,UAAAvwE,EAAA3O,UAAAhC,EAAA,MAAA0D,EAAAiN,EAAAyU,MAAA,KAAApjB,WAAA,OAAA2iB,GAAA,KAAAjhB,EAAA,GAMF,SAAA1D,IAAc,IAAA0D,EAAA,gBAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,2CAAArsD,IACV0D,EAAAiN,EAAA/P,KAAA,OAQKmwL,qBAAuB,qBAM5BrtL,EAAKstL,4BAA8B,2BAWnCttL,EAAK8uL,UAAY,kBAMjB9uL,EAAKm4J,UAAY,kBAOjBn4J,EAAKqrL,YAAc,oBAOnBrrL,EAAK+uL,mBAAqB,0BAO1B/uL,EAAKu4J,oBAAsB,2BAO3Bv4J,EAAKgvL,oBAAsB,2BAO3BhvL,EAAKw4J,qBAAuB,4BAO5Bx4J,EAAKivL,2BAA6B,iCAOlCjvL,EAAKs4J,oBAAsB,2BAO3Bt4J,EAAKq4J,yBAA2B,gCAMhCr4J,EAAKysL,wBAA0B,+BAM/BzsL,EAAKorL,SAAW,UAMhBprL,EAAK8/J,mBAAqB,2BAM1B9/J,EAAK0/J,qBAAuB,6BAO5B1/J,EAAKo4J,2BAA6B,2BAOlCp4J,EAAKkvL,kBAAoB,6BAOzBlvL,EAAKmvL,uBAAyB,uBAM9BnvL,EAAKw/J,oBAAsB,2BA3IjBx/J,CA4Ib,QAAA1D,CAAA,CAGsB,CArJrBqH,EAAA,MAAyB6sB,ICW/BrP,GANI,SAAAnhB,EAAYoN,EAAUzJ,IAAA,SAAA3D,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAA3oD,GAChCsW,KAAK+vC,SAAWj5C,EAChBkJ,KAAKqwD,aAAehjE,CACvB,ECSL0e,GARI,SAAAriB,EAAYoN,EAAczJ,EAASsJ,EAAY3Q,IAAA,SAAA0D,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAa,KAAA3oD,GACxDsW,KAAKg1K,aAAel+K,EACpBkJ,KAAKpK,QAAUvI,EACf2S,KAAK84K,WAAaniL,EAClBqJ,KAAK8zD,YAAc9tE,GAA4B,iBAClD,ECELgmB,GANI,SAAAtiB,EAAYoN,EAAWzJ,IAAA,SAAA3D,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAiB,KAAA3oD,GACpCsW,KAAK2wD,UAAY75D,EACjBkJ,KAAK+4K,gBAAkB1rL,CAC1B,ECDCye,GAAyB,CAAC,EAKhC,SAASG,GAA0BviB,GAE/BA,EAASA,GAAU,CAAC,EACpB,IAKIoN,EACAzJ,EACAsJ,EACA3Q,EACAJ,EACA2R,EACAX,EACAc,EAZEvK,EAAU6S,KAAK9V,QACf2D,EAAWnE,EAAOynI,SAClBpkI,EAASrD,EAAOs2G,OAChBhyG,EAAQtE,EAAO4V,MA4FrB,SAAS9R,EAAgC9D,EAAkBoN,EAAKzJ,EAASsJ,GAGrE,QAAI,IAAAnL,UAAUof,6BACuC,mBAA1Cpf,UAAUof,4BAA4C,CAC7D,IAAM5kB,EAAM,mCAGZ,OAFA6H,EAASwwB,QAAQtxB,EAAO4rL,2BAA4B,CAAEzjL,MAAOlP,SAC7D2Q,EAAO,CAAEzB,MAAOlP,GAEnB,CAID,IAAMJ,EAA+B8D,EAAiBoN,GAAKg9K,UAAYpqL,EAAiBoN,GAAKg9K,SAASkF,qBAAuBtvL,EAAiBoN,GAAKg9K,SAASkF,qBAAuB,KAC7KzhL,EAAU7N,EAAiBoN,GAAK+8K,QAChCj9K,EAAmBlN,EAAiBoN,GAAK8/D,GAC3Cl/D,EAAed,EAAiBg9K,cAAA,SAkCNlqL,EAAsBoN,GACpD,OAAO,IAAI7L,SAAQ,SAACoC,EAASsJ,GACzBvJ,EAA6B1D,EAAsBoN,EAAS,EAAGzJ,EAASsJ,EAC3E,GACJ,EAtCuC,CAGP/Q,IAA8DkmB,GAAuBpU,GAAgBoU,GAAuBpU,GAAgB,CAACA,IAG3HH,GAC1Cm1B,MAAK,SAAChjC,GACH,IAAMoN,EAAkE,mBAA1CpN,EAAqBuvL,iBAC/CvvL,EAAqBuvL,mBAAqB,KACxCtiL,EAAkB,IAAIqV,GAAgBpV,EAAkBE,GAE9DH,EAAgBq9K,KAAOtqL,EACvBmE,EAASwwB,QAAQtxB,EAAO4rL,2BAA4B,CAAE7oL,KAAM6G,IAC5DtJ,EAAQ,CAAEyC,KAAM6G,GACnB,IATLg2B,OAUW,SAAC3mC,GACJ,GAAI8Q,EAAM,EAAIpN,EAAiB3D,OAC3ByH,EAAgC9D,EAAkBoN,EAAM,EAAGzJ,EAASsJ,OACjE,CACH,IAAM/Q,EAAe,6BACrBiI,EAASwwB,QAAQtxB,EAAO4rL,2BAA4B,CAAEzjL,MAAOtP,EAAeI,EAAE4P,UAC9Ee,EAAO,CAAEzB,MAAOtP,EAAeI,EAAE4P,SACpC,CACJ,GACR,CAwBD,SAASxI,EAA6B1D,EAAsBoN,EAASH,EAAK3Q,EAASJ,GAC/E,IAAM2R,EAAe7N,EAAqBiN,GAE1CtJ,EAAOiS,MAAP,kDAAAhW,OAA+DiO,IAE/D/L,UAAUof,4BAA4BrT,EAAcT,GAC/C41B,MAAK,SAAChjC,GACHA,EAAqBuqL,qBAAuB18K,EAC5CvR,EAAQ0D,EACX,IAJLijC,OAKW,SAACt/B,GACAsJ,EAAM,EAAIjN,EAAqB3D,OAC/BqH,EAA6B1D,EAAsBoN,EAASH,EAAM,EAAG3Q,EAASJ,GAE9EA,EAAOyH,EAEd,GACR,CA4KD,SAASmH,EAAyB9K,GAC9B,IAAKA,IAAiBA,EAAawvL,QAC/B,OAAOjuL,QAAQyE,QAEnB,IAAMoH,EAAUpN,EAAawvL,QAO7B,OAJApiL,EAAQxG,oBAAoB,oBAAqB5G,GACjDoN,EAAQxG,oBAAoB,UAAW5G,GAGhCoN,EAAQ+9D,OAClB,CAoBD,SAASz8D,EAAc1O,GAEnB,IAAK,IAAIoN,EAAI,EAAGA,EAAIS,EAASxR,OAAQ+Q,IACjC,GAAIS,EAAST,KAAOpN,EAAO,CACvB6N,EAAS2Z,OAAOpa,EAAG,GACnB,KACH,CAER,CAED,SAASiY,EAAerlB,GAEpB,IAAIoN,EAAQzJ,EAkBZ,OAjBI3D,GAAQA,EAAK3D,OAAS,IAClB2D,EAAK,KACkB,iBAAZA,EAAK,GACZoN,EAASpN,EAAK,GAEd2D,EAAQ3D,EAAK,IAIjBA,EAAK,KACkB,iBAAZA,EAAK,GACZoN,EAASpN,EAAK,GAEd2D,EAAQ3D,EAAK,KAIlB,CACH4H,OAAQwF,EACRga,MAAOzjB,EAEd,CAID,SAASyS,EAAmBpW,EAASoN,GACjC,IAAMH,EAAQ,CACVuiL,QAASxvL,EACTonB,MAAOha,EAAOga,MACdi/B,SAAUj5C,EAAOi5C,SACjBujB,UAAWx8D,EAAOw8D,UAClBpB,YAAap7D,EAAOo7D,YAKpBinH,YAAa,SAAUzvL,GACnB,OAAQA,EAAM/B,MACV,IAAK,oBACDkG,EAASwwB,QAAQtxB,EAAOm1J,qBAAsB,CAAEpyJ,KAAMkQ,OACtDtW,EAAMskF,OAAO9Z,YAAY9gE,SAAQ,WAC7B,IAAI1J,EAAYqlB,EAAe/mB,WAEtB,YADD0B,EAAU4H,OAEVzD,EAASwwB,QAAQtxB,EAAOiqL,4BAA6B,CAAE9hL,MAAO,IAAIpH,EAAAosB,EAAYnsB,EAAAwkL,sCAAwDxkL,EAAAslL,4CAGtIxlL,EAASwwB,QAAQtxB,EAAOiqL,4BAA6BttL,EAGhE,IACD,MAEJ,IAAK,UACD,IAAIoN,EAAU+9C,YAAYsiB,OAAOztE,EAAMkM,SAAWlM,EAAMkM,QAAQmV,OAASrhB,EAAMkM,QAC/E/H,EAASwwB,QAAQtxB,EAAOgqL,qBAAsB,CAAEjnL,KAAM,IAAIic,GAAW/L,KAAMlJ,OAAA,EAAoBpN,EAAMoqE,eAGhH,EAED4gH,SAAU,WACN,OAAO10K,KAAK8Q,KACf,EAEDokK,aAAc,WACV,OAAOxrL,EAAQ4pE,SAClB,EAED8lH,eAAgB,WACZ,OAAOp5K,KAAKkyD,WACf,EAEDmnH,kBAAmB,WACf,OAAO3vL,EAAQ4vL,UAClB,EAEDC,eAAgB,WACZ,OAAO7vL,EAAQwqE,WAClB,EAEDslH,UAAW,WACP,IAAI1iL,GAAA,EAOJ,OANApN,EAAQwqE,YAAY9gE,SAAQ,WAEC,WADT2b,EAAe/mB,WACjBsJ,SACVwF,GAAA,EAEP,IACMA,CACV,GAiBL,OAbApN,EAAQgK,iBAAiB,oBAAqBiD,GAC9CjN,EAAQgK,iBAAiB,UAAWiD,GAGpCjN,EAAQ+vL,OAAO/sJ,MAAK,WAChBt0B,EAAczB,GACdtJ,EAAOiS,MAAM,qCAAuC3I,EAAMu+K,gBAC1DrnL,EAASwwB,QAAQtxB,EAAO0rL,mBAAoB,CAAE3oL,KAAM6G,EAAMu+K,gBAC7D,IAGD39K,EAASkT,KAAK9T,GAEPA,CACV,CAoBD,OAlBAG,EAAW,CACP89K,eArbJ,WAEI,IADA,IAAMlrL,EAAS,GACNoN,EAAI,EAAGA,EAAIS,EAASxR,OAAQ+Q,IAC7BS,EAAST,GAAGi5C,UACZrmD,EAAO+gB,KAAKlT,EAAST,GAAGi5C,UAGhC,OAAOrmD,CACV,EA8aG+qL,YA5aJ,WACI,OAAOl9K,CACV,EA2aGw8K,uBAzaJ,SAAgCrqL,GAC5B,OAAO,IAAIuB,SAAQ,SAAC6L,EAASzJ,GACzBG,EAAgC9D,EAAkB,EAAGoN,EAASzJ,EACjE,GACJ,EAsaG6mL,gBAnUJ,SAAyBxqL,GACrB,OAAO,IAAIuB,SAAQ,SAAC6L,EAASzJ,GACzB3D,EAAgBsqL,KAAKnhH,kBAChBnmC,MAAK,SAAC51B,GAGH,OAFAH,EAAYjN,EAAgBinE,UAC5B/qE,EAAYkR,EACR9Q,EACOA,EAAa2tE,aAAa/tE,GAE1BqF,QAAQyE,SAEtB,IACAg9B,MAAK,WACF51B,EAAQH,EACX,IAZLg2B,OAaW,WACHt/B,EAAO,CAAE6H,MAAO,gCAAkCxL,EAAgBinE,UAAUijH,aAAe,yCAC9F,GACR,GACJ,EAiTGnqB,gBA/SJ,SAAyB//J,GACjB1D,IAAiB0D,IAIjB1D,IACAA,EAAasK,oBAAoB,YAAasG,GAC1C5Q,EAAa2tE,cACb3tE,EAAa2tE,aAAa,QAIlC3tE,EAAe0D,KAIX1D,EAAa0N,iBAAiB,YAAakD,GACvC5Q,EAAa2tE,cAAgB/tE,GAC7BI,EAAa2tE,aAAa/tE,IAGrC,EA2RGwuE,qBAzRJ,SAA8B1qE,GAC1B,IAAKiN,IAAc/Q,EACf,MAAM,IAAIsR,MAAM,uEAEpBtR,EAAUwuE,qBAAqB1qE,GAAmBgjC,MAAK,WACnDr/B,EAAOmS,KAAK,yDACZ3R,EAASwwB,QAAQtxB,EAAO+0J,2BAC3B,IAHDn1H,OAGS,SAAUjjC,GACfmE,EAASwwB,QAAQtxB,EAAO+0J,2BAA4B,CAAE5sJ,MAAO,IAAIpH,EAAAosB,EAAYnsB,EAAAukL,sCAAwDvkL,EAAAqlL,yCAA4D1pL,EAAM7B,OAC1M,GACJ,EAgRG8sL,iBA1QJ,SAA0BjrL,GACtB,IAAKiN,IAAc/Q,EACf,MAAM,IAAIsR,MAAM,gEAGpB,IAAMJ,EAAUlR,EAAUmtE,cAAcrpE,EAAOwoE,aACzClsE,EAAe8Z,EAAmBhJ,EAASpN,GAI3C6N,EAAWZ,EAAUi9K,eAAiBh0K,EAAAy3K,0BAAgD3tL,EAAOqmD,UAAarmD,EAAOoqL,UAAYpqL,EAAOoqL,SAASO,WAAcz0K,EAAA83K,gCAAsD93K,EAAA63K,8BAEvN3gL,EAAQ88D,gBAAgBr8D,EAAU7N,EAAOqmD,UAAUrjB,MAAK,WACpDr/B,EAAOiS,MAAM,sCAAwCtZ,EAAakvL,gBAClErnL,EAASwwB,QAAQtxB,EAAOk1J,oBAAqB,CAAEnyJ,KAAM9J,GACxD,IAHD2mC,OAGS,SAAUjjC,GACf0O,EAAcpS,GACd6H,EAASwwB,QAAQtxB,EAAOk1J,oBAAqB,CACzCnyJ,KAAM,KACNoF,MAAO,IAAIpH,EAAAosB,EAAYnsB,EAAA2kL,+BAAiD3kL,EAAAylL,kCAAqD,mCAAqC9pL,EAAM7B,OAE/K,GACJ,EAqPGwrE,iBAnPJ,SAA0B3pE,EAAcoN,GACpC,IAAMzJ,EAAU3D,EAAawvL,QAGzBxhL,EAAwB08K,WAAWz9K,KACnCG,EAAUA,EAAQ4iL,SAEtBrsL,EAAQ89B,OAAOr0B,GACV41B,MAAK,WACF7+B,EAASwwB,QAAQtxB,EAAOm8J,oBAC3B,IAHLv8H,OAIW,SAAU71B,GACbjJ,EAASwwB,QAAQtxB,EAAO80J,UAAW,CAAE3sJ,MAAO,IAAIpH,EAAAosB,EAAYnsB,EAAA8jL,kBAAoC,mCAAqC/6K,EAAMjP,KAAM6B,IACpJ,GACR,EAsOG6qL,eApOJ,SAAwB7qL,GACpB,IAAKiN,IAAc/Q,EACf,MAAM,IAAIsR,MAAM,8DAMpB,IAHA,IAAMJ,EAAYpN,EAAO4pE,UAGhBttE,EAAI,EAAGA,EAAIuR,EAASxR,OAAQC,IACjC,GAAI8Q,IAAcS,EAASvR,GAAGstE,UAE1B,YADAjmE,EAAO8I,KAAK,6DAKpB,IAAMS,EAAUhR,EAAUmtE,cAAcrpE,EAAOwoE,aACzCx6D,EAAeoI,EAAmBlJ,EAASlN,GAGjDkN,EAAQ8lB,KAAK5lB,GAAW41B,MAAK,SAAUhjC,GAC/BA,GACA2D,EAAOiS,MAAM,qCAAuC5H,EAAaw9K,gBACjErnL,EAASwwB,QAAQtxB,EAAOk1J,oBAAqB,CAAEnyJ,KAAM4H,MAErDU,EAAcV,GACd7J,EAASwwB,QAAQtxB,EAAOk1J,oBAAqB,CACzCnyJ,KAAM,KACNoF,MAAO,IAAIpH,EAAAosB,EAAYnsB,EAAA2kL,+BAAiD3kL,EAAAylL,kCAAqD,+CAAiD18K,EAAY,OAGrM,IAXD61B,OAWS,SAAUjjC,GACf0O,EAAcV,GACd7J,EAASwwB,QAAQtxB,EAAOk1J,oBAAqB,CACzCnyJ,KAAM,KACNoF,MAAO,IAAIpH,EAAAosB,EAAYnsB,EAAA2kL,+BAAiD3kL,EAAAylL,kCAAqD,2BAA6B18K,EAAY,MAAQpN,EAAM7B,OAE3L,GACJ,EAgMG4uL,iBA9LJ,SAA0B/sL,GACNA,EAAawvL,QAErBv6H,SAASjyB,MAAK,WAClBr/B,EAAOiS,MAAM,sCAAwC5V,EAAawrL,gBAClErnL,EAASwwB,QAAQtxB,EAAO2rL,oBAAqB,CAAE5oL,KAAMpG,EAAawrL,gBACrE,IAAE,SAAUp+K,GACTjJ,EAASwwB,QAAQtxB,EAAO2rL,oBAAqB,CACzC5oL,KAAM,KACNoF,MAAO,2BAA6BxL,EAAawrL,eAAiB,MAAQp+K,EAAMjP,MAGvF,GACJ,EAkLG6uL,gBAhLJ,SAAyBhtL,GAErB8K,EAAyB9K,GAAzBijC,OAA6C,SAAU71B,GACnDsB,EAAc1O,GACdmE,EAASwwB,QAAQtxB,EAAO0rL,mBAAoB,CACxC3oL,KAAM,KACNoF,MAAO,0BAA4BxL,EAAawrL,eAAiB,KAAOp+K,EAAMjP,MAErF,GACJ,EAwKG6hL,KA5cJ,WAGI,IADA,IAAIhgL,EACKoN,EAAI,EAAGA,EAAIS,EAASxR,OAAQ+Q,KACjCpN,EAAU6N,EAAST,IACN0iL,cACThlL,EAAyB9K,GACzB0O,EAAc1O,GAGzB,EAmcGgvC,MA5eJ,WACI,IACIhvC,EADEoN,EAAcS,EAASxR,OAGT,IAAhB+Q,EAAmB,WAenB,IAbA,IAAMzJ,EAAO,SAAU3D,GACnB0O,EAAc1O,GACU,IAApB6N,EAASxR,SACLC,GACAA,EAAasK,oBAAoB,YAAasG,GAC9C5Q,EAAa2tE,aAAa,MAAMjnC,MAAK,WACjC7+B,EAASwwB,QAAQtxB,EAAO6rL,kBAC3B,KAED/qL,EAASwwB,QAAQtxB,EAAO6rL,mBAGnC,EACQjiL,EAAI,EAAGA,EAAIG,EAAaH,KAE7B,SAAWG,GACPtC,EAAyB9K,GACzB2D,EAAKyJ,EAFT,EADApN,EAAU6N,EAASZ,GAhBJ,IAuBnB9I,EAASwwB,QAAQtxB,EAAO6rL,kBAE/B,GAtCGvrL,EAASW,EAAMk1H,UAAUpsH,GACzBH,EAAY,KACZ3Q,EAAe,KACfJ,EAAY,KACZ2R,EAAW,GACXG,EAA0B2iB,GAAwBltB,GAAS01H,cAC3DjsH,EA0VO,CACHuiL,YAAa,SAAUzvL,GACnB,GACS,cADDA,EAAM/B,MAEF+B,EAAMqmD,SAAU,CAChB,IAAIj5C,EAAW+9C,YAAYsiB,OAAOztE,EAAMqmD,UAAYrmD,EAAMqmD,SAAShlC,OAASrhB,EAAMqmD,SAClFliD,EAASwwB,QAAQtxB,EAAO+nL,SAAU,CAAEjuL,IAAK,IAAIgkB,GAAQ/T,EAAUpN,EAAM2mE,eACxE,CAGZ,GAgJFv5D,CACV,CAjhBDgV,GAAuBlM,EAAA23K,0BAAgD,CAAC33K,EAAA23K,yBAA8C33K,EAAA43K,yCACtH1rK,GAAuBlM,EAAA03K,yBAA+C,CAAC13K,EAAA03K,yBACvExrK,GAAuBlM,EAAAy3K,yBAA+C,CAACz3K,EAAAy3K,yBAihBvEprK,GAA0Bo3G,sBAAwB,4BAClD,IAAAx3G,GAAe22G,OAAOE,aAAaiC,gBAAgB14G,ICphBnD,SAASI,GAAyB3iB,GAE9BA,EAASA,GAAU,CAAC,EACpB,IAMIoN,EACAzJ,EACAsJ,EACA3Q,EACAJ,EACA2R,EACAG,EACAvK,EACAU,EAdEd,EAAUiT,KAAK9V,QACf8D,EAAWtE,EAAOynI,SAClB3jI,EAAS9D,EAAOs2G,OAChB5yG,EAAQ1D,EAAO4V,MACf9K,EAAM9K,EAAOiwL,IAuBnB,SAASvhL,IACL,IACI,IAAK,IAAI1O,EAAI,EAAGA,EAAIgO,EAAS3R,OAAQ2D,IACjCqlB,EAAgBrX,EAAShO,IAEzBiN,GACAA,EAAarG,oBAAoBkE,EAAIolL,QAASzsL,GAElDa,EAASqwB,QAAQ7wB,EAAOorL,kBAG3B,CAFC,MAAOlvL,GACLsE,EAASqwB,QAAQ7wB,EAAOorL,kBAAmB,CAAE1jL,MAAO,qDAAuDxL,EAAMkM,SACpH,CACJ,CA2KD,SAASmZ,EAAgBrlB,GACrB,IAAMoN,EAAUpN,EAAawvL,QAG7BpiL,EAAQxG,oBAAoBkE,EAAIU,MAAOxL,GACvCoN,EAAQxG,oBAAoBkE,EAAIoB,QAASlM,GACzCoN,EAAQxG,oBAAoBkE,EAAIqlL,MAAOnwL,GACvCoN,EAAQxG,oBAAoBkE,EAAIqgE,MAAOnrE,GAGvC,IAAK,IAAI2D,EAAI,EAAGA,EAAIqK,EAAS3R,OAAQsH,IACjC,GAAIqK,EAASrK,KAAO3D,EAAc,CAC9BgO,EAASwZ,OAAO7jB,EAAG,GACnB,KACH,CAILyJ,EAAQtC,EAAIslL,UACf,CAgCD,SAASh6K,IACL,IAAIpW,EAAiB,KACfoN,EAAY,WACdH,EAAarG,oBAAoB,iBAAkB5G,GACnDiN,EAAanC,EAAIm/D,cAAc/tE,GAC/BoI,EAASqwB,QAAQ7wB,EAAOqrL,uBAC3B,EACGliL,EAAa1E,YAAc,EAC3B6E,KAEApN,EAAiBoN,EAAUlN,KAAKoW,MAChCrJ,EAAajD,iBAAiB,iBAAkBhK,GAGvD,CAwED,OAlBAoN,EAAW,CACP89K,eAjSJ,WAEI,IADA,IAAMlrL,EAAS,GACNoN,EAAI,EAAGA,EAAIY,EAAS3R,OAAQ+Q,IACjCpN,EAAO+gB,KAAK/S,EAASZ,GAAGi5C,UAE5B,OAAOrmD,CACV,EA4RG+qL,YA1RJ,WACI,OAAO/8K,CACV,EAyRGq8K,uBAvRJ,SAAgCrqL,GAC5B,OAAO,IAAIuB,SAAQ,SAAC6L,EAASzJ,GAIzB,IADA,IAAIsJ,GAAA,EACK3Q,EAAQ,EAAGA,EAAQ0D,EAAiB3D,OAAQC,IAQjD,IAPA,IAAMJ,EAAe8D,EAAiB1D,GAAO4wE,GAAGg9G,aAC1Cr8K,EAAU7N,EAAiB1D,GAAO6tL,QACpCn8K,EAAiB,KACjBvK,EAAiB,KAIZJ,EAAY,EAAGA,EAAYwK,EAAQxR,OAAQgH,IAAa,CAC7D,IAAMgB,EAASwJ,EAAQxK,GAAWolE,kBAC5BrkE,EAASyJ,EAAQxK,GAAWylE,kBAGlC,GAAIzkE,GAA4B,IAAlBA,EAAOhI,OAAc,CAC/B2R,EAAiB,GACjB,IAAK,IAAItK,EAAW,EAAGA,EAAWW,EAAOhI,OAAQqH,IACzCV,OAAO8H,EAAIulL,WAAWvjK,gBAAgB5wB,EAAcmI,EAAOX,GAAUi/B,cACrE30B,EAAe+S,KAAK1c,EAAOX,GAGtC,CAGD,GAAIU,GAA4B,IAAlBA,EAAO/H,OAAc,CAC/BoH,EAAiB,GACjB,IAAK,IAAIiL,EAAW,EAAGA,EAAWtK,EAAO/H,OAAQqS,IACzC1L,OAAO8H,EAAIulL,WAAWvjK,gBAAgB5wB,EAAckI,EAAOsK,GAAUi0B,cACrEl/B,EAAesd,KAAK3c,EAAOsK,GAGtC,CAID,MAAMV,IAAmBvK,GACpBuK,GAA4C,IAA1BA,EAAe3R,QACjCoH,GAA4C,IAA1BA,EAAepH,QAFtC,CAOA4Q,GAAA,EACA,IAAMoY,EAAW,IAAInY,EAAuBc,EAAgBvK,GACtD2S,EAAKjS,EAAwBwqL,2BAA2BzyL,GACxD4S,EAAkB,IAAIwT,GAAgBlM,EAAIiP,GAChD/gB,EAASqwB,QAAQ7wB,EAAOmrL,2BAA4B,CAAE7oL,KAAM0I,IAC5D1B,EAAQ,CAAEhH,KAAM0I,IAChB,KATC,CAUJ,CAEL,IAAK7B,EAAO,CACR,IAAM+B,EAAe,qFACrB1K,EAASqwB,QAAQ7wB,EAAOmrL,2BAA4B,CAAEzjL,MAAOwD,IAC7DrL,EAAO,CAAE6H,MAAOwD,GACnB,CACJ,GACJ,EA2NGw7K,gBAzNJ,SAAyBxqL,GACrB,OAAO,IAAIuB,SAAQ,SAAC6L,EAASzJ,GACzB,IACIzH,EAAY8D,EAASknE,UAAY,IAAIlkE,OAAO8H,EAAIulL,WAAWrwL,EAASinE,UAAUijH,cAC9E5tL,EAAY0D,EAASinE,UACrBp5D,EAAkB7N,EACdiN,GACAmJ,IAEJhJ,EAAQ9Q,EAGX,CAFC,MAAO0D,GACL2D,EAAO,CAAE6H,MAAO,gCAAkClP,EAAU4tL,aAAe,yCAC9E,CACJ,GACJ,EA4MGnqB,gBA1MJ,SAAyB//J,GACjBiN,IAAiBjN,IAIjBiN,GACAA,EAAarG,oBAAoBkE,EAAIolL,QAASzsL,IAGlDwJ,EAAejN,KAIXiN,EAAajD,iBAAiBc,EAAIolL,QAASzsL,GACvCvH,GACAka,KAGX,EAyLG60K,iBAvLJ,SAA0BjrL,GACtB,IAAK1D,IAAcJ,IAAc2R,EAC7B,MAAM,IAAIL,MAAM,gEAOpB,IAAIJ,EAAe,KAUnB,GARIS,EAAgBwhL,gBAAgBvmH,mBAAqBj7D,EAAgBwhL,gBAAgBvmH,kBAAkBzsE,OAAS,IAChH+Q,EAAeS,EAAgBwhL,gBAAgBvmH,kBAAkB,IAGhD,OAAjB17D,GAAyBS,EAAgBwhL,gBAAgB5mH,mBAAqB56D,EAAgBwhL,gBAAgB5mH,kBAAkBpsE,OAAS,IACzI+Q,EAAeS,EAAgBwhL,gBAAgB5mH,kBAAkB,IAGhD,OAAjBr7D,EACA,MAAM,IAAII,MAAM,sDAGpB,IAAMP,EAAcG,EAAau1B,YAC3Bz1B,EAAUhR,EAAUmtE,cAAcp8D,EAAa,IAAI0J,WAAW3W,EAAOqmD,UAAWrmD,EAAO6uL,QAAU,IAAIl4K,WAAW3W,EAAO6uL,SAAW,MAClIprL,EAsGV,SAA4BzD,EAAYoN,GACpC,MAAO,CAEHoiL,QAASxvL,EACTonB,MAAOha,EAAOga,MACdi/B,SAAUj5C,EAAOi5C,SAEjB2kI,SAAU,WACN,OAAO10K,KAAK8Q,KACf,EAEDokK,aAAc,WACV,OAAOl1K,KAAKk5K,QAAQ5lH,SACvB,EAED+lH,kBAAmB,WACf,OAAOh8I,GACV,EAED+7I,eAAgB,WACZ,MAAO,WACV,EAKDD,YAAa,SAAUzvL,GACnB,OAAQA,EAAM/B,MACV,KAAK6M,EAAIU,MAELlH,EAASqwB,QAAQ7wB,EAAOq0J,UAAW,CAAE3sJ,MAAO,IAAIpH,EAAAosB,EAAYnsB,EAAA8jL,kBAD7C,WAC2F7xK,QAC1G,MACJ,KAAKxL,EAAIoB,QACL,IAAIkB,EAAU+9C,YAAYsiB,OAAOztE,EAAMkM,SAAWlM,EAAMkM,QAAQmV,OAASrhB,EAAMkM,QAC/E5H,EAASqwB,QAAQ7wB,EAAOupL,qBAAsB,CAAEjnL,KAAM,IAAIic,GAAW/L,KAAMlJ,EAASpN,EAAMswL,kBAC1F,MACJ,KAAKxlL,EAAIqlL,MACLxsL,EAAOiS,MAAM,mBACbtR,EAASqwB,QAAQ7wB,EAAOgrL,WACxB,MAEJ,KAAKhkL,EAAIqgE,MACLxnE,EAAOiS,MAAM,qCAAuCU,KAAKk1K,gBACzDlnL,EAASqwB,QAAQ7wB,EAAOirL,mBAAoB,CAAE3oL,KAAMkQ,KAAKk1K,iBAGpE,EAER,CAhDD,CAtG4Ct+K,EAASlN,GAGjDkN,EAAQlD,iBAAiBc,EAAIU,MAAO/H,GACpCyJ,EAAQlD,iBAAiBc,EAAIoB,QAASzI,GACtCyJ,EAAQlD,iBAAiBc,EAAIqlL,MAAO1sL,GACpCyJ,EAAQlD,iBAAiBc,EAAIqgE,MAAO1nE,GAGpCuK,EAAS+S,KAAKtd,GACdE,EAAOiS,MAAM,sCAAwCnS,EAAa+nL,gBAClElnL,EAASqwB,QAAQ7wB,EAAOy0J,oBAAqB,CAAEnyJ,KAAM3C,GACxD,EAmJGkmE,iBAjJJ,SAA0B3pE,EAAcoN,GACpC,IAAMzJ,EAAU3D,EAAawvL,QAExBrrL,EAAwBumL,WAAWpuL,GAKpCqH,EAAQ89B,OAAO,IAAI9qB,WAAWvJ,EAAQ4iL,UAHtCrsL,EAAQ89B,OAAO,IAAI9qB,WAAWvJ,IAKlC9I,EAASqwB,QAAQ7wB,EAAO07J,oBAC3B,EAuIGwtB,gBAAA3nK,EACAqlD,qBA3GJ,WACC,EA2GGmgH,eAzGJ,WACC,EAyGGkC,iBAvGJ,WACC,EAuGG/M,KAAMtxK,EACNsgC,MAAAtgC,GArUA/K,EAASD,EAAM81H,UAAUpsH,GACzBH,EAAe,KACf3Q,EAAY,KACZJ,EAAY,KACZ2R,EAAkB,KAClBG,EAAW,GACX7J,EAA0BwsB,GAAwBttB,GAAS81H,cAC3D11H,EA0NO,CACHgsL,YAAa,SAAUzvL,GACnB,GAAQA,EAAM/B,OAEL6M,EAAIolL,SACDlwL,EAAMqmD,SAAU,CAChB,IAAMj5C,EAAW+9C,YAAYsiB,OAAOztE,EAAMqmD,UAAYrmD,EAAMqmD,SAAShlC,OAASrhB,EAAMqmD,SACpF/hD,EAASqwB,QAAQ7wB,EAAOsnL,SAAU,CAAEjuL,IAAK,IAAIgkB,GAAQ/T,EAAU,SAClE,CAGZ,GA8FFA,CACV,CAEDuV,GAAyBg3G,sBAAwB,2BACjD,IAAAl3G,GAAeq2G,OAAOE,aAAaiC,gBAAgBt4G,ICnWnD,SAASE,GAAoB7iB,GAEzBA,EAASA,GAAU,CAAC,EACpB,IAOIoN,EACAzJ,EACAsJ,EACA3Q,EACAJ,EAQA2R,EAIAG,EAMAvK,EAKAU,EAlCEd,EAAUiT,KAAK9V,QACf8D,EAAWtE,EAAOynI,SAClB3jI,EAAS9D,EAAOs2G,OAChB5yG,EAAQ1D,EAAO4V,MACf9K,EAAM9K,EAAOiwL,IACbvhL,EAAa1O,EAAOq+I,WAyC1B,SAASh5H,IACDpY,GACA+B,IAEJ,IAAK,IAAIhP,EAAI,EAAGA,EAAIgO,EAAS3R,OAAQ2D,IACjCoW,EAAgBpI,EAAShO,IAE7BsE,EAASqwB,QAAQ7wB,EAAOorL,kBAC3B,CAqKD,SAAS94K,EAAgBpW,GAErB,IACIiN,EAAanC,EAAIylL,kBAAkBj0L,EAAU4tL,aAAclqL,EAAa4pE,UAM3E,CALC,MAAOx8D,GACL9I,EAASqwB,QAAQ7wB,EAAOirL,mBAAoB,CACxC3oL,KAAM,KACNoF,MAAO,0BAA4BxL,EAAa4pE,UAAY,KAAOx8D,EAAMlB,SAEhF,CACJ,CAqID,SAAS4C,EAAgB9O,EAAcoN,GACnC,GAAKA,GAAcpN,EAEZ,CAEH,IADA,IAAM2D,EAAM3D,EAAa3D,OAChB4Q,EAAI,EAAGA,EAAItJ,EAAKsJ,IACrB,GAAIjN,EAAaiN,GAAG28D,WAAax8D,EAC7B,OAAOpN,EAAaiN,GAG5B,OAAO,IACV,CATG,OAAO,IAUd,CAED,SAAS+B,IACL/B,EAAarG,oBAAoBkE,EAAI0lL,SAAUrsL,GAC/C8I,EAAarG,oBAAoBkE,EAAIolL,QAAS/rL,GAC9C8I,EAAarG,oBAAoBkE,EAAI2lL,WAAYtsL,GACjD8I,EAAarG,oBAAoBkE,EAAI4lL,SAAUvsL,EAClD,CAoBD,OAlBAiJ,EAAW,CACP89K,eAxUJ,WAEI,IADA,IAAMlrL,EAAS,GACNoN,EAAI,EAAGA,EAAIS,EAAgBxR,OAAQ+Q,IACxCpN,EAAO+gB,KAAKlT,EAAgBT,GAAGi5C,UAEnC,IAAK,IAAI1iD,EAAI,EAAGA,EAAIqK,EAAS3R,OAAQsH,IACjC3D,EAAO+gB,KAAK/S,EAASrK,GAAG0iD,UAE5B,OAAOrmD,CACV,EAgUG+qL,YA9TJ,WACI,OAAO/8K,EAASpO,OAAOiO,EAC1B,EA6TGw8K,uBA3TJ,SAAgCrqL,GAC5B,OAAO,IAAIuB,SAAQ,SAAC6L,EAASzJ,GACzB,IAAIrH,EAAK2Q,EACJ3Q,IACDA,EAAK2F,SAASC,cAAc,UAMhC,IADA,IAAI2L,GAAA,EACKG,EAAQ,EAAGA,EAAQhO,EAAiB3D,OAAQ2R,IAQjD,IAPA,IAAMvK,EAAezD,EAAiBgO,GAAOk/D,GAAGg9G,aAC1C/lL,EAAUnE,EAAiBgO,GAAOm8K,QAEpC9mL,EAAiB,KAIZgB,EAAY,EAAGA,EAAYF,EAAQ9H,OAAQgI,IAAa,CAE7D,IAAMD,EAASD,EAAQE,GAAWykE,kBAElC,GAAI1kE,GAA4B,IAAlBA,EAAO/H,OAAc,CAC/BgH,EAAiB,GACjB,IAAK,IAAIK,EAAW,EAAGA,EAAWU,EAAO/H,OAAQqH,IACsB,KAA/DpH,EAAGq0L,YAAYvsL,EAAOV,GAAUi/B,YAAal/B,IAC7CJ,EAAe0d,KAAK3c,EAAOV,GAGtC,CAID,GAAyBL,KAEpBA,GAA4C,IAA1BA,EAAehH,QAFtC,CAOAwR,GAAA,EACA,IAAM/C,EAAW,IAAIoC,EA5BJ,KA4B2C7J,GACtDqL,EAAKxS,EAAwByyL,2BAA2BlrL,GACxD4hB,EAAkB,IAAI/C,GAAgB5T,EAAI5D,GAChDxG,EAASqwB,QAAQ7wB,EAAOmrL,2BAA4B,CAAE7oL,KAAMif,IAC5DjY,EAAQ,CAAEhH,KAAMif,IAChB,KATC,CAUJ,CAEL,IAAKxX,EAAO,CACR,IAAMuI,EAAe,qFACrB9R,EAASqwB,QAAQ7wB,EAAOmrL,2BAA4B,CAAEzjL,MAAO4K,IAC7DzS,EAAO,CAAE6H,MAAO4K,GACnB,CACJ,GAEJ,EAoQGo0K,gBAlQJ,SAAyBxqL,GAErB,OADA1D,EAAY0D,EAAgBinE,UACrB1lE,QAAQyE,QAAQ1J,EAC1B,EAgQGyjK,gBA9PJ,SAAyB//J,GACrB,GAAIiN,IAAiBjN,EAArB,CAKA,GAAIiN,EAAc,CACd+B,IAGA,IAAK,IAAI5B,EAAI,EAAGA,EAAIY,EAAS3R,OAAQ+Q,IACjCgJ,EAAgBpI,EAASZ,IAE7BY,EAAW,EACd,EAEDf,EAAejN,KAIXiN,EAAajD,iBAAiBc,EAAI0lL,SAAUrsL,GAC5C8I,EAAajD,iBAAiBc,EAAIolL,QAAS/rL,GAC3C8I,EAAajD,iBAAiBc,EAAI2lL,WAAYtsL,GAC9C8I,EAAajD,iBAAiBc,EAAI4lL,SAAUvsL,GAC5CG,EAASqwB,QAAQ7wB,EAAOqrL,wBArB3B,CAuBJ,EAqOGlE,iBAnOJ,SAA0BjrL,GACtB,IAAK1D,EACD,MAAM,IAAIkR,MAAM,gEAIpB,GAAI/J,GAA2C,IAApBuK,EAAS3R,OAAc,CAC9C,IAAM+Q,EAAa,CACfw8D,UAAW,KACXxiD,MAAOpnB,EAAOonB,MACdi/B,SAAUrmD,EAAOqmD,SAEjB2kI,SAAU,WACN,OAAO10K,KAAK8Q,KACf,EAEDokK,aAAc,WACV,OAAOl1K,KAAKszD,SACf,EAED+lH,kBAAmB,WACf,OAAOh8I,GACV,EAED+7I,eAAgB,WACZ,MAAO,WACV,GAOL,OALA7hL,EAAgBkT,KAAK3T,GAGrBH,EAAanC,EAAI8lL,oBAAoBt0L,EAAU4tL,aAAc,IAAIvzK,WAAW3W,EAAOqmD,WAE5Ej5C,CAEV,CACG,MAAM,IAAII,MAAM,iCAGvB,EA6LGm8D,iBA3LJ,SAA0B3pE,EAAcoN,GACpC,IAAMzJ,EAAY3D,EAAa4pE,UAC/B,GAAK1tE,EAAwBwuL,WAAWpuL,GAMpC,IAAK,IAAIuR,EAAI,EAAGA,EAAIT,EAAQs+K,SAASrvL,OAAQwR,IACzCZ,EAAanC,EAAI+lL,QAAQv0L,EAAU4tL,aAC/B98K,EAAQs+K,SAAS79K,GAAG1Q,IAAKiQ,EAAQs+K,SAAS79K,GAAG0/K,MAAO5pL,QAN5DsJ,EAAanC,EAAI+lL,QAAQv0L,EAAU4tL,aAC/B,IAAIvzK,WAAWvJ,GAAU,IAAIuJ,WAAW3W,EAAaqmD,UAAW1iD,GAQxEW,EAASqwB,QAAQ7wB,EAAO07J,oBAC3B,EA8KGwtB,gBAAA52K,EACAs0D,qBAjKJ,WACC,EAiKGmgH,eA/JJ,WACC,EA+JGkC,iBA7JJ,WACC,EA6JG/M,KAAM36J,EACN2pB,MAAA3pB,GAvWA1hB,EAASD,EAAM81H,UAAUpsH,GACzBH,EAAe,KACf3Q,EAAY,KACZuR,EAAkB,GAClBG,EAAW,GACX9R,EAA0By0B,GAAwBttB,GAAS81H,cAC3Dh1H,EAsMO,CACHsrL,YAAa,SAAUzvL,GACnB,IAAIoN,EAAe,KACnB,OAAQpN,EAAM/B,MACV,KAAK6M,EAAIolL,QACL,IAAIjjL,EAAWk+C,YAAYsiB,OAAOztE,EAAMqmD,UAAYrmD,EAAMqmD,SAAShlC,OAASrhB,EAAMqmD,SAClF/hD,EAASqwB,QAAQ7wB,EAAOsnL,SAAU,CAAEjuL,IAAK,IAAIgkB,GAAQlU,EAAU,UAC/D,MAEJ,KAAKnC,EAAI0lL,SAML,IALApjL,EAAe0B,EAAgBd,EAAUhO,EAAM4pE,cAE3Cx8D,EAAe0B,EAAgBjB,EAAiB7N,EAAM4pE,YAGtDx8D,EAAc,CACd,IAAI9Q,EAAO+H,EAAA8jL,kBACPjsL,EAAM,GACV,OAAQ8D,EAAM8wL,UAAU37J,MACpB,KAAK,EACD74B,EAAO+H,EAAA+jL,0BACPlsL,GAAO,0BAA4BmI,EAAA6kL,6BACnC,MACJ,KAAK,EACD5sL,EAAO+H,EAAAgkL,yBACPnsL,GAAO,yBAA2BmI,EAAA8kL,4BAClC,MACJ,KAAK,EACD7sL,EAAO+H,EAAAikL,0BACPpsL,GAAO,0BAA4BmI,EAAA+kL,6BACnC,MACJ,KAAK,EACD9sL,EAAO+H,EAAAkkL,yBACPrsL,GAAO,yBAA2BmI,EAAAglL,4BAClC,MACJ,KAAK,EACD/sL,EAAO+H,EAAAmkL,iCACPtsL,GAAO,iCAAmCmI,EAAAilL,oCAC1C,MACJ,KAAK,EACDhtL,EAAO+H,EAAAokL,yBACPvsL,GAAO,yBAA2BmI,EAAAklL,4BAG1CrtL,GAAO,mBAAqB8D,EAAM+wL,WAElCzsL,EAASqwB,QAAQ7wB,EAAOq0J,UAAW,CAAE3sJ,MAAO,IAAIpH,EAAAosB,EAAYl0B,EAAMJ,EAAKkR,IAC1E,MACGzJ,EAAO6H,MAAM,wCAEjB,MAEJ,KAAKV,EAAI4lL,UACLtjL,EAAe0B,EAAgBd,EAAUhO,EAAM4pE,cAE3Cx8D,EAAe0B,EAAgBjB,EAAiB7N,EAAM4pE,YAGtDx8D,GACAzJ,EAAOiS,MAAM,mBACbtR,EAASqwB,QAAQ7wB,EAAOgrL,UAAW,CAAE1oL,KAAMgH,KAE3CzJ,EAAOiS,MAAM,wCAEjB,MAEJ,KAAK9K,EAAI2lL,WA4BL,IAzBAhtL,EAA2C,OAApBzD,EAAM4pE,gBAAA,IAAwB5pE,EAAM4pE,aAKvDx8D,EAAe0B,EAAgBd,EAAUhO,EAAM4pE,aAC1B/7D,EAAgBxR,OAAS,IAI1C+Q,EAAeS,EAAgB0Y,QAC/BvY,EAAS+S,KAAK3T,GACdA,EAAaw8D,UAAY5pE,EAAM4pE,UAE/BtlE,EAASqwB,QAAQ7wB,EAAOy0J,oBAAqB,CAAEnyJ,KAAMgH,KAElDS,EAAgBxR,OAAS,IAChC+Q,EAAeS,EAAgB0Y,QAC/BvY,EAAS+S,KAAK3T,GAEiB,IAA3BS,EAAgBxR,QAChBqS,EAAWlD,MAAM,IAAIpH,EAAAosB,EAAYnsB,EAAAqkL,6BAA+CrkL,EAAAmlL,mCAIpFp8K,EAAc,CACd,IAAIF,EAAUi+C,YAAYsiB,OAAOztE,EAAMkM,SAAWlM,EAAMkM,QAAQmV,OAASrhB,EAAMkM,QAK/EkB,EAAa4jL,WAAa9jL,EAC1B5I,EAASqwB,QAAQ7wB,EAAOupL,qBAAsB,CAAEjnL,KAAM,IAAIic,GAAWjV,EAAcF,EAASlN,EAAMovL,aAErG,MACGzrL,EAAO8I,KAAK,0CAI3B,GAoDFW,CACV,CAEDyV,GAAoB82G,sBAAwB,sBAC5C,IAAAj3G,GAAeo2G,OAAOE,aAAaiC,gBAAgBp4G,ICja7CL,GAA2B,CAE7B,CAEIouK,mBAAoB,qBACpBC,OAAQ,SACRN,iBAAkB,mBAGlBL,QAAS,UACTM,SAAU,WACVE,SAAU,WACVD,WAAY,cAGhB,CAEIG,mBAAoB,2BACpBC,OAAQ,eACRN,iBAAkB,yBAGlBL,QAAS,gBACTM,SAAU,iBACVE,SAAU,iBACVD,WAAY,qBAIdzsK,GAAgC,CAGlC,CAEIimD,aAAc,eAEdomH,UAAW,YAEXD,QAAS,QAGTF,QAAS,UACT1kL,MAAO,WACPU,QAAS,aACTikL,MAAO,WACPhlH,MAAO,YAGX,CAEIlB,aAAc,iBAEdomH,UAAW,cAEXD,QAAS,QAETF,QAAS,YACT1kL,MAAO,aACPU,QAAS,eACTikL,MAAO,aACPhlH,MAAO,eAIf,SAASpoD,KACL,IAAI/iB,EACEoN,EAAUkJ,KAAK9V,QA2ErB,SAASmD,EAAQ3D,EAAcoN,GAC3B,IAAK,IAAIzJ,EAAI,EAAGA,EAAIyJ,EAAK/Q,OAAQsH,IAAK,CAClC,IAAMsJ,EAAMG,EAAKzJ,GAGjB,GAAsD,mBAA3C3D,EAAaiN,EAAInQ,OAAOP,KAAK0Q,GAAK,KAI7C,OAAOA,CACV,CAED,OAAO,IACV,CAMD,OAJAjN,EAAW,CACPkgL,uBAjFJ,SAAgCjzK,GAC5B,IAAI3Q,EAAa,KAEXJ,EAA0By0B,GAAwBvjB,GAAS+rH,cACjEj9H,EAAwBq7I,UAAU,CAAE3hI,MAAO3I,EAAO2I,MAAOw7I,OAAQnkJ,EAAOmkJ,OAAQh4C,SAAUnsG,EAAOmsG,WACjGl9G,EAAwBmuI,aAExB,IAAIx8H,EAoBR,SAA6BZ,GACzB,IAAM3Q,EAAQ2Q,EAAO2I,MACf1Z,EAASI,EAAMk9H,UAAUx5H,GACzB6N,EAAWZ,EAAOw6H,SAClBv6H,EAAaD,EAAOoxI,WACpBrwI,EAAef,EAAOwqI,WAAaxqI,EAAOwqI,WAAWzC,aAAe,KAE1E,OAAMhnI,QAAA,IAAgBA,EAAaijL,aAC7BjjL,QAAA,IAAgBA,EAAak5D,UAOxBvjE,EAAQqK,EAAcgW,KAC7B9nB,EAAO4Z,KAAK,+DACL2M,GAAyBrV,GAASxM,OAAO,CAC5CgV,MAAOtZ,EACPmrI,SAAU55H,EACVyoG,OAAQrpG,EAAOqpG,OACf25E,IAAKtsL,EAAQqK,EAAcgW,OAExBrgB,EAAQqK,EAAcwU,KAC7BtmB,EAAO4Z,KAAK,0DACL4M,GAAoBtV,GAASxM,OAAO,CACvCgV,MAAOtZ,EACPmrI,SAAU55H,EACVwwI,WAAYnxI,EACZopG,OAAQrpG,EAAOqpG,OACf25E,IAAKtsL,EAAQqK,EAAcwU,QAG/BtmB,EAAOuQ,KAAK,4GACL,OAzBPvQ,EAAO4Z,KAAK,gEACLqM,GAA0B/U,GAASxM,OAAO,CAC7CgV,MAAOtZ,EACPmrI,SAAU55H,EACVyoG,OAAQrpG,EAAOqpG,SAuB1B,CApCD,CApB8CrpG,GAiB1C,OAfK3Q,GAAcuR,IACfvR,EAAa0S,EAAqB5B,GAASxM,OAAO,CAC9CqpL,gBAAiBp8K,EACjBm8K,wBAAyB9tL,EACzBurI,SAAUx6H,EAAOw6H,SACjB7xH,MAAO3I,EAAO2I,MACd0gG,OAAQrpG,EAAOqpG,OACf86C,OAAQnkJ,EAAOmkJ,OACfpK,UAAW/5I,EAAO+5I,UAClBm5B,UAAWlzK,EAAOkzK,UAClB7f,sBAAuBrzJ,EAAOqzJ,sBAC9BlnD,SAAUnsG,EAAOmsG,WAErBnsG,EAAOsvH,aAAa20D,4BAAA,IAEjB50L,CACV,EA4DJ,CAEDymB,GAAW42G,sBAAwB,aACnC,IAAM32G,GAAU81G,OAAOE,aAAaiC,gBAAgBl4G,IACpDC,GAAQszF,OAASp0F,GACjBc,GAAQkhH,OAAS7/H,EACjBy0H,OAAOE,aAAamC,mBAAmBp4G,GAAW42G,sBAAuB32G,IACzE,IAAAO,GAAAP,EAAA,gBAAAhjB,EAAAoN,EAAAzJ,GAAA,iBAAAsJ,EAAAtJ,EAAA,MC5KMrH,EAAW,CACb60L,QAAS,GACTC,OAAQ,EACRC,KAAM,GAGV,SAASn1L,EAAc8D,EAAGoN,EAAGzJ,GAEzB,IACIsJ,EACA/Q,EAyBJ,OAVA+Q,OAAA,IAAWjN,GA1BG,EA0B4BA,EAC1C9D,EAZA,SAAqB8D,GACjB,IAAIoN,EAAM9Q,EAAS60L,QAMnB,OAHInxL,IAAM1D,EAAS60L,SAAWnxL,IAAM1D,EAAS80L,QAAUpxL,IAAM1D,EAAS+0L,OAClEjkL,EAAMpN,GAEHoN,CACV,CARD,CAYuBzJ,GAGZ,CACP01G,QAASpsG,EACTioB,YAAA,IAJM9nB,EAAmB,KAAOA,EAKhC89E,SAAUhvF,EAIjB,CAEDA,EAAcy9H,sBAAwB,gBACtC,IAAM9rH,EAAUZ,EAAAujB,EAAAyqG,gBAA6B/+H,GAC7C2R,EAAQq+J,WAzCU,EA0ClBr+J,EAAQyjL,SAAWh1L,EACnB2Q,EAAAujB,EAAA2qG,mBAAgCj/H,EAAcy9H,sBAAuB9rH,GAErET,EAAAojB,EAAA3iB,CAAA,gBAAA7N,EAAAoN,EAAAzJ,GAAA,iBAAAsJ,EAAAtJ,EAAA,MAAArH,EAAAqH,EAAA,MAAAzH,EAAAyH,EAAA,MAAAkK,EAAAlK,EAAA,KAAAuJ,EAAAvJ,EAAA,MAAAqK,EAAArK,EAAA,MAAAF,EAAAE,EAAA,MAAAQ,EAAAR,EAAA,MAAAN,EAAAM,EAAA,MAAAU,EAAAV,EAAA,MAAAS,EAAAT,EAAA,MCpCMW,EAAuB,qBACvBR,EAAyB,uBAG/B,SAASJ,EAAmB1D,GAExBA,EAASA,GAAU,CAAC,EACpB,IAQIoN,EACAzJ,EATEN,EAAUiT,KAAK9V,QAEfkD,EAAmB1D,EAAO4gJ,iBAC1B91I,EAAwB9K,EAAOsgK,sBAC/B5xJ,EAAc1O,EAAOs0I,YACrBjvH,EAAWrlB,EAAOo5G,SA2FxB,SAAShjG,EAAoBpW,GACzB,OAAOA,EAAQqX,QAAO,SAAArX,GAAE,OAAIA,EAAGq5G,QAAUh1G,EAAAmsB,EAAA07I,SAAjB,GAC3B,CAOD,SAASp9J,EAAoB9O,GACzB,IAEIoN,EACAzJ,EACAsJ,EACA3Q,EACAJ,EANE2R,EAAS,CAAC,EACZX,EAAe,KAOnB,GAAuB,IAAnBlN,EAAQ3D,OAAZ,CAQA,IAJAwR,EAAOxJ,EAAAmsB,EAAA8gK,SAAAF,QAAiC,CAAE/3E,QAASh1G,EAAAmsB,EAAA07I,UAAyBh3I,OAAQ,MACpFrnB,EAAOxJ,EAAAmsB,EAAA8gK,SAAAD,MAA+B,CAAEh4E,QAASh1G,EAAAmsB,EAAA07I,UAAyBh3I,OAAQ,MAClFrnB,EAAOxJ,EAAAmsB,EAAA8gK,SAAAH,SAAkC,CAAE93E,QAASh1G,EAAAmsB,EAAA07I,UAAyBh3I,OAAQ,MAEhF9nB,EAAI,EAAGzJ,EAAM3D,EAAQ3D,OAAQ+Q,EAAIzJ,EAAKyJ,GAAK,GAC5CH,EAAMjN,EAAQoN,IACNisG,UAAYh1G,EAAAmsB,EAAA07I,YAEZr+J,EAAOZ,EAAIi+E,UAAUmuB,UAAYh1G,EAAAmsB,EAAA07I,WAA2Br+J,EAAOZ,EAAIi+E,UAAUmuB,QAAUpsG,EAAIosG,WAC/FxrG,EAAOZ,EAAIi+E,UAAUmuB,QAAUpsG,EAAIosG,QACnCxrG,EAAOZ,EAAIi+E,UAAUh2D,OAASjoB,EAAIioB,QAAU,MAsBxD,OAjBIrnB,EAAOxJ,EAAAmsB,EAAA8gK,SAAAD,MAA6Bh4E,UAAYh1G,EAAAmsB,EAAA07I,YAChDh/J,EAAeW,EAAOxJ,EAAAmsB,EAAA8gK,SAAAD,OAGtBxjL,EAAOxJ,EAAAmsB,EAAA8gK,SAAAH,SAAgC93E,UAAYh1G,EAAAmsB,EAAA07I,YACnDh/J,EAAeW,EAAOxJ,EAAAmsB,EAAA8gK,SAAAH,UAGtBtjL,EAAOxJ,EAAAmsB,EAAA8gK,SAAAF,QAA+B/3E,UAAYh1G,EAAAmsB,EAAA07I,YAClDh/J,EAAeW,EAAOxJ,EAAAmsB,EAAA8gK,SAAAF,SAGtBlkL,IACA5Q,EAAU4Q,EAAamsG,QACvBn9G,EAASgR,EAAagoB,SAAA,EAGnB7wB,EAAAmsB,GAAcntB,GAASzC,OAAOtE,EAASJ,EAlC7C,CAmCJ,CA6CD,MATW,CACPmuI,WAjLJ,WACIj9H,EAAqB,GACrBzJ,EAAuB,GAEnB0hB,EAASjO,MAAMskH,UAAUyG,IAAIe,qBAGzB79G,EAASjO,MAAMskH,UAAUyG,IAAIG,cAAgBl+H,EAAAosB,EAAAk+I,iBAC7CthK,EAAmB2T,MAAA,EACftd,EAAA+sB,GAAQntB,GAASzC,OAAO,CACpB0zI,YAAa5lI,EACb0qG,SAAU/zF,KAKbA,EAASjO,MAAMskH,UAAUyG,IAAIG,cAAgBl+H,EAAAosB,EAAAm+I,kBAClDvhK,EAAmB2T,MAAA,EACf5c,EAAAqsB,GAASntB,GAASzC,OAAO,CACrB0zI,YAAa5lI,MAMrBtB,EAAmB2T,MAAA,EACf/S,EAAAwiB,GAASntB,GAASzC,OAAO,CACrB0zI,YAAa5lI,EACbkyI,iBAAkBl9I,EAClB01G,SAAU/zF,KAIlBjY,EAAmB2T,MAAA,EACf9T,EAAAujB,GAAentB,GAASzC,OAAO,CAC3B0zI,YAAa5lI,KAIjB2W,EAASjO,MAAMskH,UAAUyG,IAAIK,mBAAmBC,wBAChDr1H,EAAmB2T,MAAA,EACfzkB,EAAAk0B,GAAuBntB,GAASzC,OAAO,CACnC0zI,YAAa5lI,EACb0qG,SAAA/zF,KAKRA,EAASjO,MAAMskH,UAAUyG,IAAIK,mBAAmBE,mBAChDt1H,EAAmB2T,MAAA,EACf7T,EAAAsjB,GAAkBntB,GAASzC,UAI/BykB,EAASjO,MAAMskH,UAAUyG,IAAIK,mBAAmBG,mBAChDv1H,EAAmB2T,MAAA,EACflT,EAAA2iB,GAAkBntB,GAASzC,UAI/BykB,EAASjO,MAAMskH,UAAUyG,IAAIK,mBAAmBI,qBAChDj/H,EAAqBod,MAAA,EACjB7kB,EAAAs0B,GAAoBntB,GAASzC,OAAO,CAChC0zI,YAAa5lI,EACbkyI,iBAAkBl9I,EAClB01G,SAAU/zF,OAQVva,EAAsBk4K,oBAC9Bt5K,SAAQ,SAAU1J,GACtBA,EAAK/B,OAASqG,GACd8I,EAAmB2T,KAAK/gB,EAAKgoL,KAAK3kL,GAASzC,UAG3CZ,EAAK/B,OAAS6F,GACdH,EAAqBod,KAAK/gB,EAAKgoL,KAAK3kL,GAASzC,SAEpD,GACJ,EA+FGouC,MAhBJ,WACI,CAAC5hC,EAAoBzJ,GAAsB+F,SAAQ,SAAA1J,GAC3CA,GAASA,EAAM3D,QACf2D,EAAM0J,SAAQ,SAAA1J,GAAI,OAAIA,EAAKgvC,OAAShvC,EAAKgvC,OAAvB,GAEzB,IACD5hC,EAAqB,GACrBzJ,EAAuB,EAC1B,EASG4qK,cArCJ,SAAuBvuK,GAKnB,OAFmB8O,EADCsH,EADOhJ,EAAmByY,KAAI,SAAAzY,GAAI,OAAIA,EAAKmkL,YAAYvxL,EAArB,UAIjCqE,EAAAmsB,GAAcntB,GAASzC,QAC/C,EAgCG4wL,oBAAA1iL,EACA6+J,sBA/BJ,SAA+B3tK,EAAcoN,GACzC,IAEMH,EAAgB6B,EADFsH,EADQzS,EAAqBkiB,KAAI,SAAAliB,GAAI,OAAIA,EAAK8tL,cAAczxL,EAAcoN,EAArC,MAQzD,OAJIH,IACAA,EAAcioB,OAAO6yH,cAAA,GAGlB96I,IAAA,EAAiB5I,EAAAmsB,GAAcntB,GAASzC,QAClD,EAsBG8wL,sBAVJ,WACI,OAAOtkL,CACV,EAYJ,CAED1J,EAAmBi2H,sBAAwB,qBAC3C,IAAM7uH,EAAUzH,EAAAmtB,EAAAyqG,gBAA6Bv3H,GAC7CoH,EAAQi9K,qBAAuBzjL,EAC/BwG,EAAQg9K,uBAAyBhkL,EACjCT,EAAAmtB,EAAA2pG,uBAAoCz2H,EAAmBi2H,sBAAuB7uH,GAE9EsC,EAAAojB,EAAA1lB,CAAA,gBAAA9K,EAAAoN,EAAAzJ,GAAA,iBAAAsJ,EAAAtJ,EAAA,MAAArH,EAAAqH,EAAA,MAAAzH,EAAAyH,EAAA,MC5NA,SAASkK,EAAoB7N,GAEzBA,EAASA,GAAU,CAAC,EAEpB,IAKIoN,EACAzJ,EACArH,EACA4Q,EACAc,EATEvK,EAAU6S,KAAK9V,QACf2D,EAAmBnE,EAAO4gJ,iBAC1Bv9I,EAAcrD,EAAOs0I,YACrBjwI,EAAWrE,EAAOo5G,SAwGxB,SAASh1G,IACL9H,EAAe,CAAC,EAChB4Q,EAAc,CAAC,EACfc,EAAkB,EACrB,CASD,OAPAZ,EAAW,CACPqkL,cAxFJ,SAAuBzxL,GACnB,IAAMoN,GAAA,EAAgBH,EAAAujB,GAAc/sB,GAAS7C,OAAOqM,EAAAujB,EAAA07I,UAAyB,CAAC/tK,KAAM0P,EAAoB8rH,wBAExG,KAAK35H,GAAiBA,EAAa/C,eAAe,iBAAoB+C,EAAa/C,eAAe,iBAAoB+C,EAAa/C,eAAe,sBAC7I+C,EAAa/C,eAAe,0BAA6B+C,EAAa/C,eAAe,qBACtF,OAAOmQ,EAGX,IAlB4BlR,EAAMkI,EAkB5BE,EAAYtE,EAAamoJ,eACzBrkJ,EAAY9D,EAAa2rK,eACzBjoK,EAAa1D,EAAamqI,gBAC1Br/H,EAAWpH,EAAaA,EAAWuU,GAAK,KACxCvJ,EAAM1O,EAAa6rK,oBAEzB,IAAKv2I,MAAM5mB,EAAI2N,OAAQ,CAxBKngB,EAyBD4H,EAzBOM,EAyBIsK,EAAI2N,MAxB1C/f,EAAaJ,GAAQI,EAAaJ,IAAS,CAAC,EAC5CI,EAAaJ,GAAMkI,GAAM9H,EAAaJ,GAAMkI,IAAO,CAAC,EAyBhD,IAAMihB,EAAmBlhB,EAAiBo9I,sBAE1C,GADoBl+I,EAAY49I,sBAAsBn9I,GACnCuhB,EACf,OAAOjY,EAGX,IAAMgJ,EAAe9Z,EAAawH,GAAW4K,EAAI2N,OACjD,GAAqB,OAAjBjG,GAA+C,OAAtB1H,EAAI+kJ,eAA0BvmJ,EAAYjQ,eAAemZ,EAAa6B,IAC/F,OAAO7K,EAkBX,QAAI,IAdAgJ,EAAau7K,gBACb3jL,EAAgBlK,GAAa,GAC7BsS,EAAau7K,cAAgBjjL,EAAI+kJ,cAAc37I,UAC/C1B,EAAaw9H,gBAAkBllI,EAAIsJ,SACnC5B,EAAaq+I,WAAa/lJ,EAAI+lJ,WAC9Br+I,EAAa6B,GAAKvJ,EAAI2N,OAE1BjG,EAAao+I,YAAc9lJ,EAAI8lJ,YAC/Bp+I,EAAa+5E,aAAc,IAAIt4E,MAAOC,UAAY1B,EAAau7K,cAE3Dv7K,EAAao+I,YAAc,GAAKp+I,EAAa+5E,YAAc,GA5CvE,SAA0CnwF,EAAMoN,GAC5CY,EAAgBhO,GAAQgO,EAAgBhO,IAAS,GACjDgO,EAAgBhO,GAAM+gB,KAAK3T,EAC9B,CAHD,CA6C6CtJ,EAAW8K,KAAKwU,MAAiC,EAA3BhN,EAAao+I,YAAkBp+I,EAAa+5E,cAGnGniF,EAAgBlK,GAAWzH,QAAUgI,EAAS+S,MAAMskH,UAAUyG,IAAIU,mBAAmBD,oBAAoBI,oBACzG5sH,EAAa+5E,YAAc9rF,EAAS+S,MAAMskH,UAAUyG,IAAIU,mBAAmBD,oBAAoBE,oBAC/F1sH,EAAao+I,YAAcp+I,EAAaq+I,WAAY,CAEpD,IAAM3lJ,EAAoBd,EAAgBlK,GAAWopB,QAAO,SAACltB,EAAGoN,GAAJ,OAAUpN,EAAIoN,CAAd,GAAiB,GAI7E,GAHAgJ,EAAaw7K,wBAA0BhjL,KAAKwU,MAAMtU,EAAoBd,EAAgBlK,GAAWzH,QACjG+Z,EAAay7K,0BAAuD,EAA1Bz7K,EAAaq+I,WAAiBr+I,EAAaw7K,wBAA2B,KAAMxxJ,QAAQ,GAE1HhqB,EAAay7K,wBAA0Bz7K,EAAaw9H,gBAAkBvvI,EAAS+S,MAAMskH,UAAUyG,IAAIU,mBAAmBD,oBAAoBG,mBAAsE,IAAjD/iI,EAAasnJ,wBAAwBjuC,QACpM,OAAOjsG,EACJ,IAAKF,EAAYjQ,eAAemZ,EAAa6B,IAAK,CAErD,IAAMjJ,EAAgBhP,EAAa+rK,mBAC7B5vK,EAAiBia,EAAaq+I,WAAar+I,EAAao+I,YACxDzhJ,EAAc/D,EAAconJ,eAAe9xJ,GAC3CyR,EAAU/G,EAAci3I,qBAAqB3hJ,EAAW8R,EAAaw7K,wBAA0BvtL,EAAS+S,MAAMskH,UAAUyG,IAAIc,sBAAuBn4H,GACnJ4K,EAAa1G,EAAc62I,sBAAsB/hJ,EAAWgH,GAC5DoL,OAAA,IAAcR,EAA4B9G,KAAKgN,IAAIlG,EAAYK,GAAWA,EAG5E5Z,EAF4Bia,EAAaq+I,WAAa1hJ,EAAYmD,GAAYmY,QAAUtb,EAAY/D,EAAc0vI,cAAc56I,EAAWgH,IAAWujB,UAGtJjhB,EAAcisG,QAAUnjG,EACxB9I,EAAc8nB,OAAOwlI,WAAatkJ,EAAaw7K,wBAC/CxkL,EAAc8nB,OAAO48J,WAAa17K,EAAa6B,GAC/C7K,EAAc8nB,OAAO8yJ,KAAO1xK,KAAK8iH,eACjClsH,EAAYkJ,EAAa6B,IAAM7B,EAC/BzS,EAAOiS,MAAM,IAAM9R,EAAY,YAAYsS,EAAa6B,GAAG,kDAAmD/B,EAAY,0BAA2BE,EAAaw7K,gCAC3Jt1L,EAAawH,GAAWsS,EAAa6B,IAEnD,CACJ,MAAU7B,EAAao+I,cAAgBp+I,EAAaq+I,mBAC1Cn4J,EAAawH,GAAWsS,EAAa6B,GAEnD,CAED,OAAO7K,CACV,EAUG4hC,MAAO5qC,GAvGPT,GAAA,EAASzH,EAAAs0B,GAAM/sB,GAAS01H,cAAcK,UAAUpsH,GAChDhJ,IA2GGgJ,CACV,CAEDS,EAAoB8rH,sBAAwB,sBAC5CvsH,EAAAojB,EAAel0B,EAAAk0B,EAAAyqG,gBAA6BptH,EAAA,gBAAA7N,EAAAoN,EAAAzJ,GAAA,iBAAAsJ,EAAAtJ,EAAA,MAAArH,EAAAqH,EAAA,MAAAzH,EAAAyH,EAAA,MAAAkK,EAAAlK,EAAA,MAAAuJ,EAAAvJ,EAAA,MAAAqK,EAAArK,EAAA,MAAAF,EAAAE,EAAA,MAAAQ,EAAAR,EAAA,MAAAN,EAAAM,EAAA,MC/GtCU,EAAmB,GAOzB,SAASD,EAASpE,GAEdA,EAASA,GAAU,CAAC,EACpB,IAMIoN,EACAzJ,EACAzH,EAREkI,EAAUkS,KAAK9V,QAEf8D,EAActE,EAAOs0I,YACrBxwI,EAAmB9D,EAAO4gJ,iBAC1Bl9I,GAAA,EAAWwJ,EAAAsjB,GAASpsB,GAAS+0H,cAyBnC,SAASruH,EAAwB9K,EAAkBoN,EAAUzJ,GACzD,IAAMsJ,EAAsBtJ,EAAUupB,QAAO,SAACltB,EAAcoN,EAAGH,GAAlB,OAA8BG,EAAIzJ,EAAU3D,GAAgBiN,EAASjN,CAArE,GAAoF,GAEjI,GAA4B,IAAxBiN,EAEA,OAAO,KAGX,IAAM3Q,EAAasS,KAAKgN,IAAI5b,EAAkBqE,EA9CX,EA8CmE+I,EAAS/Q,QAOzGH,GAAMyH,EAAUsJ,GAAuB,IAAM3Q,EAAa+H,EAAmB,GAInF,MAAO,CAAE0tL,GAAI71L,EAAI81L,GAHN3tL,EAAmBnI,EAIjC,CA8BD,SAASwS,EAAqB1O,GAC1BA,EAAUiyL,kBAAoB,EAC9BjyL,EAAUkyL,yBAA2Bv+I,IACrC3zC,EAAUmyL,2BAAA,EACVnyL,EAAUoyL,iBAAmBz+I,IAC7B3zC,EAAUqyL,qBAAuB1+I,IACjC3zC,EAAUsyL,yBAA2B3+I,IACrC3zC,EAAUuyL,wBAA0B5+I,GACvC,CAGD,SAAStuB,EAA+BrlB,EAAWoN,GAC/C,IAAMzJ,EAAmBG,EAAiBy9I,sBAC1C,GAAIvhJ,EAAUg+H,mBAAqBr6H,EAAkB,CACjD,IAAMsJ,EAASnC,EAAwBnH,EAAkB3D,EAAUwyL,SAAUxyL,EAAUyyL,WACvF,GAAIxlL,EAAO+kL,KAAOhyL,EAAUgyL,IAAM/kL,EAAO8kL,KAAO/xL,EAAU+xL,GAAI,CAK1D,IAAMz1L,EAAcgI,EAAY28I,sBAAsB7zI,GAClDlR,EAAuBI,EAAc0D,EAAUiyL,kBAEnD/1L,GAAwBmI,EACxBnI,GAAwB+Q,EAAO+kL,GAAKhyL,EAAUgyL,GAC9C91L,GAAwBmI,EAExBrE,EAAUg+H,iBAAmBr6H,EAC7B3D,EAAUgyL,GAAK/kL,EAAO+kL,GACtBhyL,EAAU+xL,GAAK9kL,EAAO8kL,GACtB/xL,EAAUiyL,kBAAoBrjL,KAAKgN,IAAI,EAAG1f,EAAuBI,EACpE,CACJ,CACJ,CA8BD,SAAS8Z,EAAyBpW,EAAWoN,GACzC,OAAOpN,EAAUgyL,IAAMhyL,EAAUyyL,UAAUrlL,GAAWpN,EAAU+xL,GACnE,CAGD,SAASjjL,EAAyB9O,EAAWoN,GAKzC,IAJA,IAAMzJ,EAAW3D,EAAUwyL,SAASplL,GAC9BH,EAAWjN,EAAUyyL,UAAUrlL,GAEjC9Q,EAAM,EACDJ,EAAIkR,EAAU,EAAGlR,GAAK,IAAKA,EAEhC,GAAI8D,EAAUyyL,UAAUv2L,GAAK8D,EAAUyyL,UAAUrlL,GAAU,CACvD,IAAMS,EAAW7N,EAAUwyL,SAASt2L,GAC9BgR,EAAWlN,EAAUyyL,UAAUv2L,GAE/B8R,EAAQhO,EAAUgyL,IAAMhyL,EAAU+xL,IAAMpuL,EAAWuJ,EAAWW,EAAWZ,IAAatJ,EAAWkK,IACvGvR,EAAMsS,KAAKgN,IAAItf,EAAK0R,EACvB,CAEL,OAAO1R,CACV,CAqCD,SAAS0S,EAAchP,GAEnB,IAEMoN,EAFYpN,EAAEu6H,YAEYl3H,EAAAmtB,EAAA3B,MAAkB,CAACxrB,EAAAmtB,EAAA3B,OAAmB3yB,EACtE,IAAK,IAAMyH,KAAayJ,EAChBlR,EAAce,eAAe0G,IA1NnB,IA0NiCzH,EAAcyH,GAAWguC,QACpEz1C,EAAcyH,GAAWsuL,kBAAoB,EAGxD,CAED,SAAS91L,IAGL,IAAK,IAAM6D,KAAa9D,EACpB,GAAIA,EAAce,eAAe+C,GAAY,CACzC,IAAMoN,EAAYlR,EAAc8D,GAvOjB,IAwOXoN,EAAUukC,QACVvkC,EAAUukC,MAxOH,EAyOPjjC,EAAqBtB,GAE5B,CAER,CAED,SAAS2F,EAAsB/S,GAC3B,GAAIA,GAAKA,EAAEq9I,OAASr9I,EAAEq9I,MAAMhU,UAAW,CACnC,IAAMj8H,EAAYlR,EAAc8D,EAAEq9I,MAAMhU,UAAUprI,MAClD,GAAImP,GAnPe,IAmPFA,EAAUukC,MAAkC,CACzD,IAAMhuC,EAAQ3D,EAAEq9I,MAAMzkI,MAClB0c,MAAMloB,EAAU8kL,2BAA6BvuL,EAAQyJ,EAAU8kL,0BAC/D9kL,EAAU8kL,yBAA2BvuL,EACrCyJ,EAAU+kL,2BAAA,GAEV/kL,EAAU+kL,2BAAA,EAGd/kL,EAAUglL,iBAAmBzuL,EAC7ByJ,EAAUilL,qBAAuBryL,EAAEq9I,MAAMrlI,SACzC5K,EAAUslL,YAAc1yL,EAAEq9I,MAAMhkC,QAEhC3jG,EAAgBtI,EAAWpN,EAAEq9I,MAAMhU,UAAUprI,KAChD,CACJ,CACJ,CAED,SAAS8X,EAAc/V,GACnB,GAAIA,GAAKA,EAAE4/J,SAAW3yJ,EAAAujB,EAAAs9I,cAAiC9tK,EAAE8H,OAAS9H,EAAE8H,MAAM7J,OAAS4P,EAAAqI,EAAAyrH,oBAAkC3hI,EAAE8H,MAAM6N,OAAS3V,EAAE8H,MAAM6N,MAAMtZ,OAAQ,CACxJ,IAAM+Q,EAAYlR,EAAc8D,EAAEu6H,WAC9BntH,GAxQe,IAwQFA,EAAUukC,QACvBvkC,EAAUklL,yBAA2BtyL,EAAE8H,MAAMulK,SAASv1J,UACtD1K,EAAUmlL,wBAA0BvyL,EAAE8H,MAAMwlK,SAASx1J,UAErDpC,EAAgBtI,EAAWpN,EAAEu6H,WAEpC,CACJ,CAaD,SAAS7kH,EAAgB1V,EAAWoN,GAChC,IAAKkoB,MAAMt1B,EAAUoyL,oBAAsB98J,MAAMt1B,EAAUsyL,4BAA8Bh9J,MAAMt1B,EAAUiyL,mBAAoB,CAIzH,GAHAjyL,EAAUiyL,mBArRW,KAwRhB38J,MAAMt1B,EAAUuyL,yBAA0B,CAC3C,IACM5uL,EADcW,EAAY28I,sBAAsB7zI,GACL,MAASpN,EAAUuyL,wBAA0BvyL,EAAUsyL,0BAClGrlL,EAAmCmJ,EAAyBpW,EAAWA,EAAU0yL,aACjFp2L,EAAuBsS,KAAKgN,IAAI,EAAG3O,EAAmCtJ,GAC5E3D,EAAUiyL,kBAAoBrjL,KAAK+M,IAAIrf,EAAsB0D,EAAUiyL,kBAC1E,CAIGjyL,EAAUmyL,4BAA8B78J,MAAMt1B,EAAUqyL,wBAExDryL,EAAUiyL,mBAAqBjyL,EAAUqyL,sBAG7CryL,EAAUoyL,iBAAmBz+I,IAC7B3zC,EAAUsyL,yBAA2B3+I,GACxC,CACJ,CAED,SAASz9B,EAAyBlW,GAE9B,GAAIA,EAAG,CACH,IAAMoN,EAAYlR,EAAc8D,EAAEu6H,WAC9BntH,GAzTe,IAyTFA,EAAUukC,QACvBvkC,EAAUulL,WAAa3yL,EAAE6hJ,WAEhC,CACJ,CAED,SAAS3oI,EAA2BlZ,GAChC,GAAIA,EAAG,CACH,IAAMoN,EAAYlR,EAAc8D,EAAEu6H,WAClC,GAAIntH,GAlUe,IAkUFA,EAAUukC,MAAkC,CAEzD,IACIhuC,EADEsJ,EAAc3I,EAAY28I,sBAAsBjhJ,EAAEu6H,WAIpD52H,EAFAyJ,EAAUulL,WAAa,EAEI7jL,EAAyB1B,EAAWA,EAAUulL,YAE9CtuL,EAE/B,IAAM/H,EAAuBsS,KAAKgN,IAAI,EAAGjY,EAA2BsJ,GACpEG,EAAU6kL,kBAAoBrjL,KAAK+M,IAAIvO,EAAU6kL,kBAAmB31L,EACvE,CACJ,CACJ,CAoID,SAAS6Z,IACLja,EAAgB,CAAC,CACpB,CAoBD,OANAkR,EAAW,CACPmkL,YAnJJ,SAAqBvxL,GACjB,IAAMoN,GAAA,EAAgB9Q,EAAAk0B,GAAcpsB,GAASxD,SAE7C,KAAKZ,GAAiBA,EAAa/C,eAAe,iBAAoB+C,EAAa/C,eAAe,iBAC7F+C,EAAa/C,eAAe,0BAA6B+C,EAAa/C,eAAe,kBACrF+C,EAAa/C,eAAe,qBAAwB+C,EAAa/C,eAAe,0BACjF,OAAOmQ,EAEX,IAAMH,EAAYjN,EAAamoJ,eACzBt6I,EAAY7N,EAAa2rK,eACzBz+J,EAAqBlN,EAAaonJ,wBAClCp5I,EAAahO,EAAamqI,gBAC1B1mI,EAAgBzD,EAAa+rK,mBAC7B5nK,EAAoBV,EAAcqiJ,uBAClCziJ,EAAW2K,EAAaA,EAAWiK,GAAK,KACxC5T,EAAY2J,GAAcA,EAAWspI,cAAgBtpI,EAAWspI,aAAa5B,UAC7EhyI,EAAwB1D,EAAaurK,wBAG3C,GAFAn+J,EAAc8nB,OAAS9nB,EAAc8nB,QAAU,CAAC,GAE3CxxB,EACD,OAAO0J,EAGXF,EAAmBg1I,mBAAmB,GAEtC,IAAMlzI,EA3OV,SAAsBhP,GAClB,IAAMoN,EAAYpN,EAAa2rK,eAC3BhoK,EAAYzH,EAAckR,GAO9B,OANKzJ,EAnIkB,IAsIZA,EAAUguC,OACjBtsB,EAA+B1hB,EAAWyJ,IAH1CzJ,EAnER,SAA6B3D,GACzB,IAAMoN,EAAe,CAAC,EAEhBzJ,EADY3D,EAAamoJ,eACJqJ,YAAY3rI,KAAI,SAAA7lB,GAAC,OAAIA,EAAE0oI,SAAN,IACxCz7H,EAhCR,SAA+BjN,GAC3B,OAAOA,EAAS6lB,KAAI,SAAA7lB,GAAC,OAAI4O,KAAKiH,IAAI7V,EAAb,GAExB,CAHD,CAgC0C2D,GACtCsJ,EAAYA,EAAU4Y,KAAI,SAAA7lB,GAAC,OAAIA,EAAIiN,EAAU,GAAK,CAAvB,IAC3B,IAAM3Q,EAAmBwH,EAAiBy9I,sBACpCrlJ,EAAS4O,EAAwBxO,EAAkBqH,EAAUsJ,GAkBnE,OAhBK/Q,GAIDkR,EAAaukC,MA7EE,EA+EfvkC,EAAaolL,SAAW7uL,EACxByJ,EAAaqlL,UAAYxlL,EACzBG,EAAa4wH,iBAAmB1hI,EAChC8Q,EAAa4kL,GAAK91L,EAAO81L,GACzB5kL,EAAa2kL,GAAK71L,EAAO61L,GAEzB3kL,EAAaslL,YAAc,EAC3BhkL,EAAqBtB,IAXrBA,EAAaukC,MA5EM,EA0FhBvkC,CACV,CA1BD,CAmEwCpN,GAChC9D,EAAckR,GAAazJ,GAIxBA,CACV,CAVD,CA2OmC3D,GAE/B,GA7WuB,IA6WnBgP,EAAU2iC,MAEV,OAAOvkC,EAGX,IAIIjR,EAJE4W,EAAczO,EAAY28I,sBAAsBpzI,GAChDkI,EAAa5R,EAAkB4hJ,qBAAqBl4I,EAAWxJ,GAC/DqR,EAAiBvR,EAAkBstJ,yBAAyB5jJ,EAAWxJ,GACvE6R,EAAU/R,EAAkBupK,kBAAkB7/J,GAOpD,GAJAT,EAAc8nB,OAAOyc,MAAQ3iC,EAAU2iC,MACvCvkC,EAAc8nB,OAAOwlI,WAAa3kJ,EAClC3I,EAAc8nB,OAAO0mD,QAAU1lE,EAE3Bof,MAAMvf,GAEN,OAAO3I,EAGX,OAAQ4B,EAAU2iC,OACd,KAjYe,EAkYXx1C,EAAUsH,EAAcwiJ,qBAAqBh5I,EAAWyI,EAAgBrS,EAAU6S,GAElF9I,EAAcisG,QAAUl9G,EACxBiR,EAAc8nB,OAAOwlI,WAAahlJ,EAElC1G,EAAUijL,kBAAoBrjL,KAAKgN,IAAI,EAAG9M,EAAyBE,EAAW7S,GAAW4W,GACzF/D,EAAU0jL,YAAcv2L,GAEnBm5B,MAAMtmB,EAAUqjL,uBAAyBt/K,GAAe/D,EAAUqjL,uBACnErjL,EAAU2iC,MA1YJ,GA6YV,MAEJ,KA/Yc,GA+LtB,SAAiC3xC,EAAWoN,GACxC,IAAMzJ,EAAQkU,KAAK6H,MAEnB,GAAK4V,MAAMt1B,EAAUuyL,0BAId,IAAKj9J,MAAMt1B,EAAU4yL,gBAAiB,CAEzC,IAAM3lL,EAAQ,MAAStJ,EAAQ3D,EAAU4yL,gBACzC5yL,EAAUiyL,mBAAqBrjL,KAAKgN,IAAI,EAAG3O,EAC9C,MAR8C,CAE3C,IAAM3Q,EAAQ,MAASqH,EAAQ3D,EAAUuyL,yBACzCvyL,EAAUiyL,mBAAqBrjL,KAAKgN,IAAI,EAAGtf,EAC9C,CAMD0D,EAAU4yL,eAAiBjvL,EAC3B3D,EAAUoyL,iBAAmBz+I,IAC7B3zC,EAAUsyL,yBAA2B3+I,IACrC3zC,EAAUuyL,wBAA0B5+I,IAEpCtuB,EAA+BrlB,EAAWoN,EAC7C,CAnBD,CAuNoC4B,EAAWnB,GAEnC1R,EA7QZ,SAAmC6D,EAAWoN,GAI1C,IAHA,IAAMzJ,EAAe3D,EAAUwyL,SAASn2L,OACpC4Q,EAAU0mC,IACVr3C,EAAQq3C,IACHz3C,EAAI,EAAGA,EAAIyH,IAAgBzH,EAAG,CACnC,IAAI2R,GAAK7N,EAAUgyL,IAAMhyL,EAAUyyL,UAAUv2L,GAAK8D,EAAU+xL,IAAM3kL,GAAepN,EAAUwyL,SAASt2L,IAChGo5B,MAAMh5B,IAAUuR,GAAKvR,KACrBA,EAAQuR,EACRZ,EAAU/Q,EAEjB,CACD,OAAO+Q,CACV,CAZD,CA6QgD+B,EAAW+D,EAAc/D,EAAUijL,mBAIvE,IAAM/4K,EAAuBzV,EAAcwiJ,qBAAqBh5I,EAAWyI,EAAgBrS,EAAU6S,GACjG/Z,EAAU6S,EAAU0jL,aAAev2L,EAAU+c,IAI7C/c,EAAUyS,KAAKgN,IAAI1C,EAAsBlK,EAAU0jL,cAKvD,IAAIv8K,EAASvH,KAAKgN,IAAI,EAAG7I,EAAc/D,EAAUijL,kBAAoB77K,EAAyBpH,EAAW7S,IAGrGga,GAAUnH,EAAUijL,mBACpBjjL,EAAUijL,mBAAqB97K,EAC/BA,EAAS,IAETA,GAAUnH,EAAUijL,kBACpBjjL,EAAUijL,kBAAoB,EAE1B91L,EAAUsH,EAAcu9I,sBAAsBnzI,EAAWxK,GAEzD6J,EAAmBg1I,mBAAmB,IAAO/rI,GAE7CA,EAAS,GAIjB/I,EAAcisG,QAAUl9G,EACxBiR,EAAc8nB,OAAOwlI,WAAa3kJ,EAClC3I,EAAc8nB,OAAO0mD,QAAU1lE,EAC/B9I,EAAc8nB,OAAOgqH,YAAcnsI,EACnC3F,EAAc8nB,OAAO+8J,kBAAoBjjL,EAAUijL,kBACnD7kL,EAAc8nB,OAAO6nG,MAAQ5mH,EAE7BnH,EAAU0jL,YAAcv2L,EAGxB,MAEJ,QACIwH,EAAOiS,MAAM,uCAEbxI,EAAcisG,QAAU51G,EAAcwiJ,qBAAqBh5I,EAAWyI,EAAgBrS,EAAU6S,GAChG9I,EAAc8nB,OAAOyc,MAAQ3iC,EAAU2iC,MACvCvkC,EAAc8nB,OAAOwlI,WAAahlJ,EAClCtI,EAAc8nB,OAAO0mD,QAAU1lE,EAC/BlH,EAAU2iC,MA5cC,EA6cXjjC,EAAqBM,GAG7B,OAAO5B,CACV,EAoBG4hC,MAdJ,WACI74B,IAEAzS,EAASgvB,IAAIvuB,EAAAqsB,EAAAylH,aAAgCjnI,EAAe5B,GAC5D1J,EAASgvB,IAAIvuB,EAAAqsB,EAAA+lH,iBAAoCp6I,EAAmBiR,GACpE1J,EAASgvB,IAAIvuB,EAAAqsB,EAAA8uI,aAAgCvpJ,EAAe3I,GAC5D1J,EAASgvB,IAAIvuB,EAAAqsB,EAAA+uI,yBAA4CrpJ,EAA0B9I,GACnF1J,EAASgvB,IAAIvuB,EAAAqsB,EAAAgpH,2BAA8CtgI,EAA4B9L,GAEvF1J,EAASgvB,IAAI1kB,EAAAwiB,EAAAy1G,sBAA8BlzH,EAAuB3F,EACrE,GAzcGzJ,GAAA,EAASF,EAAA+sB,GAAMpsB,GAAS+0H,cAAcK,UAAUpsH,GAChD+I,IAEAzS,EAAS0uB,GAAGjuB,EAAAqsB,EAAAylH,aAAgCjnI,EAAe5B,GAC3D1J,EAAS0uB,GAAGjuB,EAAAqsB,EAAA+lH,iBAAoCp6I,EAAmBiR,GACnE1J,EAAS0uB,GAAGjuB,EAAAqsB,EAAA8uI,aAAgCvpJ,EAAe3I,GAC3D1J,EAAS0uB,GAAGjuB,EAAAqsB,EAAA+uI,yBAA4CrpJ,EAA0B9I,GAClF1J,EAAS0uB,GAAGjuB,EAAAqsB,EAAAgpH,2BAA8CtgI,EAA4B9L,GAEtF1J,EAAS0uB,GAAGpkB,EAAAwiB,EAAAy1G,sBAA8BlzH,EAAuB3F,GAwc9DA,CACV,CAEDhJ,EAASu1H,sBAAwB,WACjCvsH,EAAAojB,EAAet0B,EAAAs0B,EAAAyqG,gBAA6B72H,EAAA,eAAApE,EAAAoN,EAAAzJ,GAAA,iBAAAsJ,EAAAtJ,EAAA,MAAArH,EAAAqH,EAAA,MAAAzH,EAAAyH,EAAA,MCzhB5C,SAASkK,IAEL,IACI7N,EACAoN,EAFEzJ,EAAU2S,KAAK9V,QAyDrB,OANAR,EAAW,CACPuxL,YAzCJ,SAAqBvxL,GACjB,IAAMiN,GAAA,EAAgB3Q,EAAAk0B,GAAc7sB,GAAS/C,SAE7C,IAAKZ,IAAiBA,EAAa/C,eAAe,2BAC9C,OAAOgQ,EAGX,IAAM/Q,EAAuB8D,EAAa4rK,0BACpC/9J,EAAW7N,EAAamqI,gBAAgBlyH,GAE9C,GAAI/b,EAAsB,CACtB,IAAMgR,EAAMhR,EAAqBywK,gBAAgB9+J,GAEjD,IAAKX,GAAsB,IAAfA,EAAI7Q,OACZ,OAAO4Q,EAQX,IALA,IAAIe,EAAgB,EAChBvK,EAAc,EACdU,EAAW7H,EAAAk0B,EAAA07I,UAGN7oK,EAAI,EAAGA,EAAI6J,EAAI7Q,OAAQgH,IAC5B,GAAI6J,EAAI7J,KACJ2K,EAAgBd,EAAI7J,GAAG0iE,oBACvBtiE,EAAcyJ,EAAI7J,GAAGyiE,kBA/BZ,KAiC6B93D,EAAgBvK,EAlCpC,KAkC6E,CAC3FU,EAAWd,EAAI,EACf+J,EAAOwI,MAAM,UAAYzR,EAAW,oBAAsB6J,EAAgB,kBAAoBvK,GAC9F,KACH,CAGT,OAAO,EAAAnH,EAAAk0B,GAAc7sB,GAAS/C,OAAOuD,EAAU,CAAEuxK,cAAe1nK,GACnE,CAED,OAAOf,CACV,GAzCGG,GAAA,EAASlR,EAAAs0B,GAAM7sB,GAASw1H,cAAcK,UAAUx5H,GAiD7CA,CACV,CAED6N,EAAkB8rH,sBAAwB,oBAC1CvsH,EAAAojB,EAAevjB,EAAAujB,EAAAyqG,gBAA6BptH,EAAA,gBAAA7N,EAAAoN,EAAAzJ,GAAA,iBAAAsJ,EAAAtJ,EAAA,MAAArH,EAAAqH,EAAA,MAAAzH,EAAAyH,EAAA,MAAAkK,EAAAlK,EAAA,MAAAuJ,EAAAvJ,EAAA,MAAAqK,EAAArK,EAAA,MAAAF,EAAAE,EAAA,MAAAQ,EAAAR,EAAA,MC5B5C,SAASN,EAAuBrD,GAE5BA,EAASA,GAAU,CAAC,EACpB,IAOIoN,EACAzJ,EACAzH,EANEmH,EAAUiT,KAAK9V,QACf6D,GAAA,EAAW4I,EAAAujB,GAASntB,GAAS81H,cAC7B/0H,EAAcpE,EAAOs0I,YAiF3B,SAAShwI,KACLpI,EAAkB,CAAC,GACH8R,EAAAwiB,EAAAi7C,OAAmB,CAAEonH,YAvFZ,GAwFzB32L,EAAgB8R,EAAAwiB,EAAA3B,OAAmB,CAAEgkK,YAxFZ,EAyF5B,CAED,SAAS/uL,IACLQ,GACH,CAED,SAASZ,EAAiB1D,GACjBs1B,MAAMt1B,EAAEm2B,YAAen2B,EAAEu6H,YAAcvsH,EAAAwiB,EAAA3B,OAAmB7uB,EAAEu6H,YAAcvsH,EAAAwiB,EAAAi7C,OACvEvvE,EAAgB8D,EAAEu6H,WAAWs4D,YAAc,GAC3C32L,EAAgB8D,EAAEu6H,WAAWs4D,aAGxC,CAeD,OAPAzlL,EAAW,CACPmkL,YA7EJ,SAAqBvxL,GACjB,IAAMoN,GAAA,EAAgBF,EAAAsjB,GAAcntB,GAASzC,SAE7C,IAAKZ,IAAiBA,EAAa/C,eAAe,gBAC9C,OAAOmQ,GApBf,WACI,IAAKhJ,IAAgBA,EAAYnH,eAAe,2BAA6BmH,EAAYnH,eAAe,yBACpG,MAAM,IAAIuQ,MAAMQ,EAAAwiB,EAAA+iH,qBAEvB,CAJD,GAyBI,IAAMtmI,EAAYjN,EAAa2rK,eACzBrvK,EAAqB8H,EAAYqzK,sBAAsBxqK,GAEvDY,EADqB7N,EAAasnJ,wBACInG,iBACtCh9I,EAAanE,EAAamqI,gBAC1B9lI,EAAWF,EAAaA,EAAW8T,GAAK,KACxC3T,EAAqBtE,EAAaonJ,wBAClCtjJ,EAAYK,GAAcA,EAAWmzI,cAAgBnzI,EAAWmzI,aAAa5B,UAMnF,GA0BJ,SAAsB11I,EAAmBoN,GACrC,OAAQpN,GAAqB9D,EAAgBkR,GAAWylL,YAAc,CACzE,CAFD,CA/B+BvuL,EAAmBm+I,wBAID3K,2BACT7qI,KAAeY,EAC/C,OAAOT,EAGX,GAAI9Q,GAAsBA,EAAmBq1C,QAAUluC,EAAA+sB,EAAAylH,aACnDtyI,EAAOiS,MAAM,IAAM3I,EAAY,yCAC/BG,EAAcisG,QAAU,EACxBjsG,EAAc8nB,OAAS,8CACpB,CACH,IAAMxxB,EAAY1D,EAAamoJ,eACzBr9I,EAAgB9K,EAAa+rK,mBAC7Br9J,EAAoB5D,EAAcg7I,uBAElCzgI,EAAcjhB,EAAY68I,sBAAsBh0I,GAChDmJ,EAAa1H,EAAkBq3I,qBAAqB94I,EAAWnJ,GAC/DgL,EAAUJ,EAAkBg/J,kBAAkBzgK,GAC9C+B,EAAUoH,GAAciP,EAAcxX,GAxEV,GA0ElCT,EAAcisG,QAAUvuG,EAAcm7I,qBAAqBviJ,EAAWsL,EAAS3K,EAAUyK,GACzF1B,EAAc8nB,OAAS,2EAC1B,CAED,OAAO9nB,CAEV,EAgCG4hC,MARJ,WACI1qC,IACAD,EAASquB,IAAIvuB,EAAAqsB,EAAA+lH,iBAAoCzyI,EAAoBsJ,GACrE/I,EAASquB,IAAIp2B,EAAAk0B,EAAAw0G,4BAAoCthI,EAAkB0J,EACtE,GAhGGzJ,GAAA,EAASkK,EAAA2iB,GAAMntB,GAAS81H,cAAcK,UAAUpsH,GAChD9I,IACAD,EAAS+tB,GAAGjuB,EAAAqsB,EAAA+lH,iBAAoCzyI,EAAoBsJ,GACpE/I,EAAS+tB,GAAG91B,EAAAk0B,EAAAw0G,4BAAoCthI,EAAkB0J,GAsG/DA,CACV,CAED/J,EAAuBs2H,sBAAwB,yBAC/CvsH,EAAAojB,EAAet0B,EAAAs0B,EAAAyqG,gBAA6B53H,EAAA,gBAAArD,EAAAoN,EAAAzJ,GAAA,iBAAAsJ,EAAAtJ,EAAA,MAAArH,EAAAqH,EAAA,MAAAzH,EAAAyH,EAAA,MAAAkK,EAAAlK,EAAA,MAAAuJ,EAAAvJ,EAAA,MAAAqK,EAAArK,EAAA,MAAAF,EAAAE,EAAA,MAAAQ,EAAAR,EAAA,MCpH5C,SAASN,EAAQrD,GACbA,EAASA,GAAU,CAAC,EACpB,IAKIoN,EACAzJ,EACAzH,EACAmH,EAREgB,EAAUiS,KAAK9V,QAEf4D,EAAcpE,EAAOs0I,YACrBhwI,GAAA,EAAW4I,EAAAsjB,GAASnsB,GAAS80H,cAoEnC,SAASr1H,EAAqB9D,GAC1BA,EAASiyL,kBAAoB,EAC7BjyL,EAASkyL,yBAA2Bv+I,IACpC3zC,EAASmyL,2BAAA,EACTnyL,EAASoyL,iBAAmBz+I,IAC5B3zC,EAASqyL,qBAAuB1+I,IAChC3zC,EAASsyL,yBAA2B3+I,IACpC3zC,EAASuyL,wBAA0B5+I,IACnC3zC,EAAS8yL,eAAiB,EAC7B,CAyBD,SAASpvL,IACL,IAAK,IAAM1D,KAAa2D,EACpB,GAAIA,EAAa1G,eAAe+C,GAAY,CACxC,IAAMoN,EAAWzJ,EAAa3D,GAnHhB,IAoHVoN,EAASukC,QACTvkC,EAASukC,MApHH,EAqHN7tC,EAAqBsJ,GAE5B,CAER,CAOD,SAAStC,EAAuB9K,GAC5B,GAAIA,GAAKA,EAAEq9I,OAASr9I,EAAEq9I,MAAMhU,UAAW,CACnC,IAAMj8H,EAAWzJ,EAAa3D,EAAEq9I,MAAMhU,UAAUprI,MAC1CgP,EAAgB/Q,EAAiB8D,EAAEq9I,MAAMhU,UAAUprI,MAEzD,GAAImP,GAtIc,IAsIFA,EAASukC,MAAiC,CACtD,IAAMr1C,EAAQ0D,EAAEq9I,MAAMzkI,MAClB0c,MAAMloB,EAAS8kL,2BAA6B51L,EAAQ8Q,EAAS8kL,0BAC7D9kL,EAAS8kL,yBAA2B51L,EACpC8Q,EAAS+kL,2BAAA,GAET/kL,EAAS+kL,2BAAA,EAGb/kL,EAASglL,iBAAmB91L,EAC5B8Q,EAASilL,qBAAuBryL,EAAEq9I,MAAMrlI,SACxC5K,EAASslL,YAAc1yL,EAAEq9I,MAAMhkC,QAE/Bh0F,EAAiBjY,EAAUH,EAC9B,CACJ,CACJ,CAOD,SAASyB,EAAe1O,GACpB,GAAIA,GAAKA,EAAE4/J,SAAW3yJ,EAAAujB,EAAAs9I,cAAiC9tK,EAAE8H,OAAS9H,EAAE8H,MAAM7J,OAAS4P,EAAAqI,EAAAyrH,oBAAkC3hI,EAAE8H,MAAM6N,OAAS3V,EAAE8H,MAAM6N,MAAMtZ,OAAQ,CACxJ,IAAM+Q,EAAWzJ,EAAa3D,EAAEu6H,WAC1Bj+H,EAAgBJ,EAAiB8D,EAAEu6H,WAErCntH,GAlKc,IAkKFA,EAASukC,QACrBvkC,EAASklL,yBAA2BtyL,EAAE8H,MAAMulK,SAASv1J,UACrD1K,EAASmlL,wBAA0BvyL,EAAE8H,MAAMwlK,SAASx1J,UACpDuN,EAAiBjY,EAAU9Q,GAElC,CACJ,CAQD,SAAS+oB,EAAiBrlB,EAAUoN,GAC3BkoB,MAAMt1B,EAASoyL,mBAAsB98J,MAAMt1B,EAASsyL,4BACrDllL,EAAc2lL,wBAA0B,KAAQ/yL,EAASsyL,yBACzDllL,EAAc4lL,0BAA4B,KAAQhzL,EAASuyL,wBAC3DvyL,EAASoyL,iBAAmBz+I,IAC5B3zC,EAASsyL,yBAA2B3+I,IAE3C,CAOD,SAASv9B,EAA0BpW,GAE/B,GAAIA,GAAKA,EAAEu6H,UAAW,CAClB,IAAMntH,EAAWzJ,EAAa3D,EAAEu6H,WAC5BntH,GAlMc,IAkMFA,EAASukC,QACrBvkC,EAASulL,WAAa3yL,EAAE6hJ,WAE/B,CACJ,CAUD,SAAS/yI,EAAmB9O,EAAMoN,GAC9B,GAAIpN,EAAK3D,SAAW+Q,EAAK/Q,OACrB,OAAQ,EAGZ,IADA,IAAIsH,EAAS,EACJsJ,EAAI,EAAGA,EAAIjN,EAAK3D,OAAQ4Q,IAC7BtJ,GAAkB3D,EAAKiN,GAAKG,EAAKH,GAErC,OAAOtJ,CACV,CAwND,SAASqL,IACLrL,EAAe,CAAC,EAChBzH,EAAmB,CAAC,CACvB,CAmBD,OANAkR,EAAW,CACPmkL,YA7LJ,SAAqBvxL,GACjB,IAoBIoN,EApBEH,GAAA,EAAgB3Q,EAAAk0B,GAAcnsB,GAASzD,SAEvCsM,EAAK0B,KAAK+U,IADA,EACa,KACvB3V,EAAQY,KAAKgN,IAAIhN,KAAK+U,IAFZ,EAEyB,GAAIzW,EAAK0B,KAAK+yB,KAFvC,IAGVl+B,EAAYzD,EAAamoJ,eACzB7jJ,EAAYtE,EAAa2rK,eACzBjoK,EAAWD,EAAU+tJ,YAAY3rI,KAAI,SAAA7lB,GAAC,OAAIA,EAAE0oI,SAAN,IACtC59H,EAAepH,EAASrH,OACxBqS,EAAqB1O,EAAaonJ,wBAClC/hI,EAAarlB,EAAamqI,gBAC1B/zH,EAAgBpW,EAAa+rK,mBAC7B/8J,EAAoBoH,EAAc0vI,uBAClC3pJ,EAAYkpB,GAAcA,EAAWiyH,cAAgBjyH,EAAWiyH,aAAa5B,UAC7E3iI,EAAY/S,EAAawrK,YACzBz1J,EAAc3R,EAAY68I,sBAAsB38I,GAAA,GAChDoR,EAAiB1G,EAAkByiJ,yBAAyBntJ,EAAWnI,GACvE+Z,EAAalH,EAAkB+2I,qBAAqBzhJ,EAAWnI,GAE/D+c,EAAUlK,EAAkB0+J,kBAAkBppK,GAGhD6R,EAFenW,EAAagsK,gBAEKz2B,kBAErC,KAAKv1I,GAAiBA,EAAa/C,eAAe,iBAAoB+C,EAAa/C,eAAe,iBAC7F+C,EAAa/C,eAAe,0BAA6B+C,EAAa/C,eAAe,kBACrF+C,EAAa/C,eAAe,qBAAwB+C,EAAa/C,eAAe,cACjF,OAAOgQ,EAKX,GAFAA,EAAcioB,OAASjoB,EAAcioB,QAAU,CAAC,GAE1CniB,GAAezO,IAAcH,EAAAqsB,EAAA3B,MAC/B,OAAO5hB,EAGXyB,EAAmBwzI,mBAAmB,GAEtC,IAAMjsI,EA3MV,SAAsBjW,GAClB,IAAMoN,EAAYpN,EAAa2rK,eAC3B1+J,EAAWtJ,EAAayJ,GAO5B,OALKH,IACDA,EAjER,SAA6BjN,GACzB,IAAMoN,EAAe,CAAC,EAChBzJ,EAAY3D,EAAamoJ,eACzBl7I,EAAWtJ,EAAU6tJ,YAAY3rI,KAAI,SAAC7lB,GACxC,OAAOA,EAAE0oI,UAAY,GACxB,IASD,OAPAt7H,EAAaukC,MA1CK,EA2ClBvkC,EAAaolL,SAAWvlL,EACxBG,EAAaslL,YAAc,EAa/B,SAAkC1yL,GAEzBA,GAAcA,EAAU/B,OAG7B/B,EAAiB8D,EAAU/B,MAAQ,CAAC,EACpC/B,EAAiB8D,EAAU/B,MAAMiY,EAAI,GACrCha,EAAiB8D,EAAU/B,MAAMg1L,OAAS,GAC1C/2L,EAAiB8D,EAAU/B,MAAMsiB,EAAI,EACrCrkB,EAAiB8D,EAAU/B,MAAM80L,wBAA0B,EAC3D72L,EAAiB8D,EAAU/B,MAAM+0L,0BAA4B,EAC7D92L,EAAiB8D,EAAU/B,MAAMi1L,SAAW,IAC/C,CAZD,CAX6BvvL,GACzBG,EAAqBsJ,GAEdA,CACV,CAfD,CAiEuCpN,GAC/B2D,EAAayJ,GAAaH,GAGvBA,CACV,CAVD,CA2MkCjN,GAE9B,GA7SsB,IA6SlBiW,EAAS07B,MAET,OAAO1kC,EAGX,IAAMgM,EAAe/c,EAAiBoI,GAEtC,IAAK2U,EACD,OAAOhM,EAOX,GAJAA,EAAcioB,OAAOyc,MAAQ17B,EAAS07B,MACtC1kC,EAAcioB,OAAOwlI,WAAaxkJ,EAClCjJ,EAAcioB,OAAO0mD,QAAU1iE,EAE3Boc,MAAMpf,GAEN,OAAOjJ,EAGX,OAAQgJ,EAAS07B,OACb,KAjUc,EAuUV,GALAvkC,EAAUgJ,EAAc6vI,qBAAqBxiJ,EAAWiS,EAAgB2P,EAAWpN,GAAIiB,GACvFjM,EAAcosG,QAAUjsG,EACxBH,EAAcioB,OAAOwlI,WAAahlJ,EAClCO,EAASy8K,YAActlL,GAElBkoB,MAAMrf,EAASo8K,uBAAyBt8K,GAAekD,EAAai6K,SAAU,CAC/Ej9K,EAAS07B,MAvUJ,EAwUL14B,EAAasH,EAAIrT,EAEjB,IAAK,IAAImL,EAAI,EAAGA,EAAIvN,IAAgBuN,EAC5BA,IAAMpC,EAASy8K,YACfz5K,EAAag6K,OAAO56K,GAAK,EAEzBY,EAAag6K,OAAO56K,GAAK,CAGpC,CAED,MACJ,KApVa,EAqVT,IAAIf,EAAQ,GAGR7E,EAAwBrO,EAAYuzK,sBAAsBrzK,GAAWqR,MAAMuX,QAAO,SAACltB,EAAGoN,GAAJ,OAAUpN,EAAIoN,EAAE/I,CAAhB,GAAmB,GACnGkT,EAAgBnT,EAAYuzK,sBAAsBrzK,GAAWqR,MAAMuX,QAAO,SAACltB,EAAGoN,GAAJ,OAAUpN,EAAIoN,EAAEjR,EAAE,EAAlB,GAAsB,GAClG0O,EAAiB+D,KAAKwU,MAAO,EAAI7L,EAAiB9E,GAClDnP,EAAqBc,EAAYuzK,sBAAsBrzK,GAQ3D,GANIuG,EAAiB,IACjBA,EAAiB,GAKjBvH,EAAmBlB,MAAQ6T,EAAS68K,gBACpCxvL,EAAmBrF,OAAS4P,EAAAqI,EAAA0rH,kBAE5Bx0H,EAAU6I,EAASy8K,gBAEhB,CAMH,IAJA,IAAIv5K,EAAIlD,EAASo8K,qBACb7hK,EAAO,EAGFpX,EAAI,EAAGA,EAAItO,IAAgBsO,EAChC1V,EAAS0V,GAAK1V,EAAS0V,GAAK,IACxBjD,EAAsBzS,EAAS0V,GAAKvO,IACpC2lB,GAAQ,GAGZvX,EAAa/C,EAAEkD,GAAKH,EAAag6K,OAAO75K,GAAKoX,GAAQrX,GAAK,EAAInL,MAAYiL,EAAasH,EAAIrT,IAAOiJ,EAAsBzS,EAAS0V,GAAKvO,IAI1IoO,EAAa/C,EAxJ7B,SAA6BlW,GAIzB,IAHA,IAAMoN,EAAIpN,EAAI3D,OACVsH,GAAA,EACAsJ,EAAO,GACF3Q,EAAK,EAAGA,EAAK8Q,IAAK9Q,EACvB2Q,EAAK3Q,GAAM0D,EAAI1D,GAQnB,IANA,IAAIJ,EAAI8D,EAAIirC,MAAK,SAAUjrC,EAAGoN,GAC1B,OAAOA,EAAIpN,CACd,IACG6N,EAAS,EACTX,EAAO,EACPc,EAAI,GACCvK,EAAK,EAAGA,EAAK2J,EAAI,IAAK3J,EAG3B,IADAyJ,IADAW,GAAkB3R,EAAEuH,IACH,IAAMA,EAAK,KAChBvH,EAAEuH,EAAK,GAAI,CACnBE,GAAA,EACA,KACH,CAEAA,IACDuJ,GAAQW,EAAS3R,EAAEkR,EAAI,GAAK,GAAKA,GAErC,IAAK,IAAIjJ,EAAK,EAAGA,EAAKiJ,IAAKjJ,EACvB6J,EAAE7J,GAAMyK,KAAKgN,IAAI3O,EAAK9I,GAAM+I,EAAM,GAEtC,OAAOc,CACV,CA5BD,CAwJqDiL,EAAa/C,GAElD,IAAK,IAAI4D,EAAI,EAAGA,EAAIhP,IAAgBgP,EAChCxC,EAAMwC,GAAKb,EAAa/C,EAAE4D,GAAKb,EAAag6K,OAAOn5K,GACnDb,EAAag6K,OAAOn5K,GAAKb,EAAa/C,EAAE4D,GAI5Cb,EAAasH,EAAI3R,KAAKgN,IAAI,EAAG3C,EAAasH,EAAIpH,EAAIA,EAAIhD,IAAwBrH,EAAmBpL,EAAUuV,EAAag6K,QAAUnkL,EAAmBpL,EAAU4T,IAAUzM,IAIzK,IADA,IAAI3G,EAAO,GACFujB,EAAI,EAAGA,EAAI3c,IAAgB2c,EAChCvjB,EAAKujB,GAAK7Y,KAAKC,IAAInL,EAAS+jB,GAAK3Y,EAAmBmK,EAAa/C,EAAGxS,KAIxE0J,EAAUlJ,EAAKuE,QAAQmG,KAAK+M,IAAL+F,MAAA9S,KAAY1K,KAGrB+R,EAASy8K,aACfhvL,EAASuS,EAASy8K,YAAc,IAAM7nL,IACtCuC,EAAU6I,EAASy8K,YAAc,GAKrChvL,EAAS0J,IAAYvC,IACrBoO,EAAasH,EA/Hf,EA+H2B3R,KAAKgN,IAAI1O,EAAI+L,EAAasH,IAEvDtK,EAAS68K,eAAiBxvL,EAAmBlB,GAChD,CACD6K,EAAcosG,QAAUjsG,EACxBH,EAAcioB,OAAOwlI,WAAaxkJ,EAClCjJ,EAAcioB,OAAO0mD,QAAU1iE,EAC/BjM,EAAcioB,OAAOgqH,YAAcnpI,EACnCE,EAASy8K,YAAczlL,EAAcosG,QACrC,MACJ,QAEIh2G,EAAOuS,MAAM,sCACb3I,EAAcosG,QAAUjjG,EAAc6vI,qBAAqBxiJ,EAAWiS,EAAgB2P,EAAWpN,GAAIiB,GACrGjM,EAAcioB,OAAOyc,MAAQ17B,EAAS07B,MACtC1kC,EAAcioB,OAAOwlI,WAAahlJ,EAClCzI,EAAcioB,OAAO0mD,QAAU1iE,EAC/BjD,EAAS07B,MAtaC,EAuaV7tC,EAAqBmS,GAE7B,OAAOhJ,CACV,EAwBG+hC,MAVJ,WACIhgC,IACA1K,EAASouB,IAAI1kB,EAAAwiB,EAAA+lH,iBAAyB7yI,EAAoB0J,GAC1D9I,EAASouB,IAAI1kB,EAAAwiB,EAAAy1G,sBAA8Bn7H,EAAwBsC,GACnE9I,EAASouB,IAAI1kB,EAAAwiB,EAAA8uI,aAAqB5wJ,EAAgBtB,GAClD9I,EAASouB,IAAI1kB,EAAAwiB,EAAA+uI,yBAAiCnpJ,EAA2BhJ,EAC5E,GA1aG/J,GAAA,EAASI,EAAA+sB,GAAMnsB,GAAS80H,cAAcK,UAAUpsH,GAChD4B,IAEA1K,EAAS8tB,GAAGpkB,EAAAwiB,EAAA+lH,iBAAyB7yI,EAAoB0J,GACzD9I,EAAS8tB,GAAGpkB,EAAAwiB,EAAAy1G,sBAA8Bn7H,EAAwBsC,GAClE9I,EAAS8tB,GAAGpkB,EAAAwiB,EAAA8uI,aAAqB5wJ,EAAgBtB,GACjD9I,EAAS8tB,GAAGpkB,EAAAwiB,EAAA+uI,yBAAiCnpJ,EAA2BhJ,GA4arEA,CACV,CAED/J,EAAQs2H,sBAAwB,UAChCvsH,EAAAojB,EAAet0B,EAAAs0B,EAAAyqG,gBAA6B53H,EAAA,gBAAArD,EAAAoN,EAAAzJ,GAAA,iBAAAsJ,EAAAtJ,EAAA,MAAArH,EAAAqH,EAAA,MAAAzH,EAAAyH,EAAA,MChf5C,SAASkK,IAEL,IAEI7N,EACAoN,EAHEzJ,EAAU2S,KAAK9V,QAgDrB,OANAR,EAAW,CACPuxL,YA3BJ,SAAqBvxL,GAQjB,IAPA,IAAMiN,EAAuBjN,EAAeA,EAAa8rK,mBAAqB,KACxExvK,EAAiB2Q,EAAuBA,EAAqBy/J,oBAAsB,GACrF7+J,EAAQ,EACRX,EAAU,EACVc,EAAW,EACTvK,GAAA,EAAgBvH,EAAAs0B,GAAc7sB,GAAS/C,SAEpCuD,EAAI,EAAGA,EAAI7H,EAAeD,OAAQ8H,IACvC,QAAI,IAAA7H,EAAe6H,KACf0J,GAASvR,EAAe6H,GAAGkoK,MAC3Bn/J,GAAW5Q,EAAe6H,GAAGioK,QAC7Bp+J,GAAY1R,EAAe6H,GAAGmoK,SAE1Bz+J,EAAQX,GApBJ,GAoB+BW,EAAQX,EAxBxC,MAwB+D,CAClEzJ,EAAc41G,QAAWl1G,EAAI,GAAK7H,EAAe6H,GAAGkoK,MAAQ,EAAKloK,EAAI,EAAIA,EACzEV,EAAcyxB,OAAS,CAAC7Y,MAAO5Y,EAAc41G,QAASgzD,MAAOx+J,EAAOu+J,QAASl/J,EAASo/J,SAAUt+J,GAChGZ,EAAOwI,MAAM,8BAAgCnS,EAAc41G,QAAU,cAAgBxrG,EAAQX,GAAW,WAAaW,GACrH,KACH,CAIT,OAAOpK,CACV,GA3BG2J,GAAA,EAAS9Q,EAAAk0B,GAAM7sB,GAASw1H,cAAcK,UAAUx5H,GAmC7CA,CACV,CAGD6N,EAAkB8rH,sBAAwB,oBAC1CvsH,EAAAojB,EAAevjB,EAAAujB,EAAAyqG,gBAA6BptH,EAAA,gBAAA7N,EAAAoN,EAAAzJ,GAAA,iBAAAsJ,EAAAtJ,EAAA,MAAArH,EAAAqH,EAAA,MAAAzH,EAAAyH,EAAA,MAAAkK,EAAAlK,EAAA,MCzB5C,SAASuJ,EAAelN,GAEpBA,EAASA,GAAU,CAAC,EACpB,IAAMoN,EAAUkJ,KAAK9V,QACfmD,EAAc3D,EAAOs0I,YA8D3B,MAPW,CACPi9C,YA3CJ,SAAqBvxL,GACjB,IAAMiN,GAAA,EAAgB3Q,EAAAk0B,GAAcpjB,GAASxM,SAE7C,KAAKZ,GAAiBA,EAAa/C,eAAe,iBAAoB+C,EAAa/C,eAAe,iBAAoB+C,EAAa/C,eAAe,0BAC7I+C,EAAa/C,eAAe,qBAAwB+C,EAAa/C,eAAe,0BACjF,OAAOgQ,GAXf,WACI,IAAKtJ,IAAgBA,EAAY1G,eAAe,yBAC5C,MAAM,IAAIuQ,MAAMtR,EAAAs0B,EAAA+iH,qBAEvB,CAJD,GAgBI,IAAMrmI,EAAYlN,EAAamoJ,eACzBn6I,EAAYhO,EAAa2rK,eACzBloK,EAAqBE,EAAY8zK,sBAAsBzpK,GACvD7J,EAAqBnE,EAAaonJ,wBAClC/jJ,EAAgBrD,EAAa+rK,mBAC7B1nK,EAAarE,EAAamqI,gBAC1B/lI,EAAWC,EAAaA,EAAW4T,GAAK,KACxC3T,EAAYD,GAAcA,EAAWizI,aAAejzI,EAAWizI,aAAa5B,UAAY,KACxF5xI,EAAoBT,EAAcyiJ,uBAClCpiJ,EAAaI,EAAkB2tJ,yBAAyBzjJ,EAAW1J,GACnEwG,EAAUhH,EAAkB4pK,kBAAkB1/J,GAC9CU,EAAwB1O,EAAaurK,wBAE3C,OAAIj2I,MAAM5xB,KAAgBD,GAAsBiL,GAI5CrL,EAAc2kJ,uBAAuB5jJ,EAAU4J,KAAeH,EAAA2iB,EAAAy3H,eAC1DxkJ,EAAmBkuC,QAAU9jC,EAAA2iB,EAAA2uH,eAAkC76I,KAC/D2I,EAAcosG,QAAUh2G,EAAc4iJ,qBAAqB/4I,EAAWxJ,EAAYU,EAAU0G,GAC5F3G,EAAmB+9I,mBAAmB,GACtCj1I,EAAcioB,OAAS,CAACwlI,WAAYh3J,EAAYk4E,QAAS9wE,IAPtDmC,CAYd,EAQG+hC,MANJ,WAEC,EAUJ,CAED9hC,EAAeysH,sBAAwB,iBACvCvsH,EAAAojB,EAAevjB,EAAAujB,EAAAyqG,gBAA6B/tH,EAAA,gBAAAlN,EAAAoN,EAAAzJ,GAAA,iBAAAsJ,EAAAtJ,EAAA,MAAArH,EAAAqH,EAAA,MC1D5C,SAASzH,IACL,IAEI8D,EACAoN,EACAzJ,EACAsJ,EACA/Q,EACA2R,EACAX,EACAc,EACAvK,EAVEU,EAAUmS,KAAK9V,QA+BrB,SAAS6C,IACLM,EAAoB,KACpBsJ,EAA6B,EAC7B/Q,EAA6B,IAC7B2R,EAAa,EACbX,EAAU,KACVc,EAAgB,KAChBvK,EA1CK,0BA2CR,CAOD,SAASY,IACL,IAAIrE,EAAgB,EAEpB,GAAI2D,EACA,IAAK,IAAIyJ,EAAI,EAAGA,EAAIzJ,EAAkBtH,OAAQ+Q,IAAK,CAC/C,IAAIH,EAAStJ,EAAkByJ,GAC3BH,EAAO0kC,MAAM+oH,WAAa16J,IAC1BA,EAAgBiN,EAAO0kC,MAAM+oH,WAEpC,CAGL,OAAO16J,CACV,CAsBD,SAASoE,EAAapE,EAAGoN,EAAGzJ,GACxB,IAAIsJ,EAAMjN,EACL6lB,KAAI,SAAC7lB,EAAGiN,GAAJ,OAAWtJ,EAAEsJ,GAAM2B,KAAK+U,IAAI3jB,EAAIoN,EAAEH,GAAI,EAAtC,IACJigB,QAAO,SAACltB,EAAKoN,GAAN,OAAcpN,EAAMoN,CAApB,IAGZ,OAFYH,EAAM,GAAM,EAAI,GAEd2B,KAAK+yB,KAAK/yB,KAAKC,IAAI5B,GACpC,CASD,SAAS3I,EAAmBtE,EAAGoN,GAI3B,OAAOhJ,EAHM,CAACpE,EAAE2xC,MAAM+oH,WAAY16J,EAAE2xC,MAAMiqC,QAAS57E,EAAE2xC,MAAMwhJ,SAAUnzL,EAAE2xC,MAAFwuE,QACxD,CAAC/yG,EAAEukC,MAAM+oH,WAAYttJ,EAAEukC,MAAMiqC,QAASxuE,EAAEukC,MAAMwhJ,SAAU/lL,EAAEukC,MAAFwuE,QAEjC,CAAC,EAAG,EAAG,EAAG,GACjD,CASD,SAASr8G,EAAe9D,EAAcoN,EAAazJ,GAC/C,IAAK,IAAIsJ,EAAI,EAAGA,EAAIG,EAAY/Q,OAAQ4Q,IAAK,CACzC,IAAI3Q,EAAY8Q,EAAYH,GAEtB/Q,EAAiBoI,EAAmBhI,EAAW0D,GAErD0D,EAAmBpH,EAAWqH,EADViL,KAAK+qB,KAAK,EAAI/qB,KAAK+U,IAAIznB,EAAgB,IAAM,EAAI0S,KAAK+U,IAF9D,GAEyE,KAExF,CACJ,CASD,SAASjgB,EAAmB1D,EAAQoN,EAAGzJ,GACnC,IAAIsJ,EAAQjN,EAAO2xC,MACfr1C,EAAI,CAAC,IAAM,IAAM,IAAM,KAE3B2Q,EAAMytJ,WAAaztJ,EAAMytJ,YAActtJ,EAAE,GAAKH,EAAMytJ,YAAcp+J,EAAE,GAAKqH,EACzEsJ,EAAM2uE,QAAU3uE,EAAM2uE,SAAWxuE,EAAE,GAAKH,EAAM2uE,SAAWt/E,EAAE,GAAKqH,EAChEsJ,EAAMkmL,SAAWlmL,EAAMkmL,UAAY/lL,EAAE,GAAKH,EAAMkmL,UAAY72L,EAAE,GAAKqH,EACnEsJ,EAAKkzG,OAAUlzG,EAAKkzG,QAAW/yG,EAAE,GAAKH,EAAKkzG,QAAW7jH,EAAE,GAAKqH,CAChE,CA+UD,OANA3D,EAAW,CACPozL,eApSJ,SAAwBpzL,EAAW1D,EAAY6H,EAASd,EAAYiB,EAAcZ,EAAqBoH,GAEnG,IAAI4D,EAAiBvK,EACjBkhB,EAAgBhiB,EAChB+S,EAAoB9Z,EAEpBwS,EA+JR,SAA+B9O,GAC3B,IAAK2D,EAAmB,CACpBA,EAAoB,GACpB,IAAMyJ,EAAcpN,EAAUwxJ,YAC1Bl1J,EAAgB,GACpBuR,EAAaT,EAAY,GAAGs7H,UAE5Bt7H,EAAY1D,SAAQ,SAAA1J,GAChB1D,EAAcykB,KAAK/gB,EAAQ0oI,WACvB1oI,EAAQ0oI,UAAY76H,IACpBA,EAAa7N,EAAQ0oI,UAE5B,IA3RCjlI,EA4RyCnH,EA5R3BupB,KAAI,SAAC7lB,GAAD,OAAQ4O,KAAK+U,IAAI3jB,EAAG,EAApB,IAAyBktB,QAAO,SAACltB,EAAKoN,GAAN,OAAcpN,EAAMoN,CAApB,IA4RpDH,EA1RG2B,KAAK+yB,KAAKl+B,GA4Rb,IAAK,IAAIvH,EAAI,EAAGA,EAAIkR,EAAY/Q,OAAQH,IAAK,CACzC,IAAIgR,EAAS,CACTooJ,aAAcp5J,EACdmyB,QAASjhB,EAAYlR,GAAGwsI,UACxB/2F,MAAO,CAEH+oH,WAAYttJ,EAAYlR,GAAGwsI,UAAYz7H,EACvC2uE,QAAS,EACTu3G,SAAU,EACVhzE,OAAQ,IAGhBx8G,EAAkBod,KAAK7T,EAC1B,CAEDc,EAkCR,SAA0ChO,GACtC,IAAIoN,EAAU,GACVzJ,EAxBR,SAAwB3D,GAGpB,IAFA,IAAIoN,EAAY,GAEPzJ,EAAI,EAAGA,EAAI3D,EAAM2D,IAAK,CAC3B,IAAIsJ,EAAO,CACP2B,KAAKyhE,SAAWhsE,IAChBuK,KAAKyhE,SACLzhE,KAAKyhE,SACLzhE,KAAKyhE,UAETjjE,EAAU2T,KAAK9T,EAClB,CAED,OAAOG,CACV,CAdD,CAwBuCwB,KAAK+U,IAAI3jB,EAAY3D,OAAQ,IAChE+Q,EAAQ2T,KAAKpd,EAAc,IAG3B,IAFA,IAAIsJ,EAAkB,CAAC,EAAG,EAAG,EAAG,GAEvB3Q,EAAI,EAAGA,EAAI0D,EAAY3D,OAAQC,IAAK,CAGzC,IAFA,IAAIJ,EAAY,KACZ2R,EAAc,KACTX,EAAI,EAAGA,EAAIvJ,EAActH,OAAQ6Q,IAAK,CAG3C,IAFA,IAAIc,EAAerK,EAAcuJ,GAC7BzJ,EAAc,KACTU,EAAI,EAAGA,EAAIiJ,EAAQ/Q,OAAQ8H,IAAK,CACrC,IAAId,EAAWe,EAAa4J,EAAcZ,EAAQjJ,GAAI8I,IAClC,OAAhBxJ,GAAwBJ,EAAWI,KACnCA,EAAcJ,EAErB,EACmB,OAAhBwK,GAAwBpK,EAAcoK,KACtC3R,EAAY8R,EACZH,EAAcpK,EAErB,CACD2J,EAAQ2T,KAAK7kB,EAChB,CAKD,IAFA,IAAIoI,EAAc,KACdR,EAAoB,KACfJ,EAAI,EAAGA,EAAI0J,EAAQ/Q,OAAQqH,IAAK,CAErC,IADA,IAAIoH,EAAW,EACN4D,EAAI,EAAGA,EAAItB,EAAQ/Q,OAAQqS,IAC5BhL,IAAMgL,IACV5D,GAAY1G,EAAagJ,EAAQ1J,GAAI0J,EAAQsB,GAAIzB,KAEjC,OAAhB3I,GAAwBwG,EAAWxG,KACnCA,EAAcwG,EACdhH,EAAoBJ,EAE3B,CAGD,IAAI2hB,EAAgB,GAGpB,IAFAA,EAActE,KAAK3T,EAAQtJ,IAC3BsJ,EAAQoa,OAAO1jB,EAAmB,GAC3BsJ,EAAQ/Q,OAAS,GAAG,CAGvB,IAFA,IAAI+Z,EAAc,KACdtH,EAAW,KACNE,EAAI,EAAGA,EAAI5B,EAAQ/Q,OAAQ2S,IAAK,CACrC,IAAI7S,EAAWiI,EAAaihB,EAAc,GAAIjY,EAAQ4B,GAAI/B,IACtC,OAAhBmJ,GAAwBja,EAAWia,KACnCA,EAAcja,EACd2S,EAAWE,EAElB,CACDqW,EAActE,KAAK3T,EAAQ0B,IAC3B1B,EAAQoa,OAAO1Y,EAAU,EAC5B,CAED,OAAOuW,CACV,CA5DD,CAlCyD1hB,EACpD,CA/SL,IACUF,EAgTN,OAAOE,CACV,CAlCD,CA/J4C3D,GAEpCgP,EAAuB1S,EAAa2Q,EAEpC+B,EAAuB,IACvBA,EAAuB3K,KAG3BF,GAAoBjI,EAQpBkR,EAAOwI,MAAP,oCAAAhW,OAAiDoP,EAAjD,aAAApP,OAAiFuE,EAAjF,gBAAAvE,OAAuGyD,EAAvG,yBAAAzD,OAAyI8D,EAAzI,kBAAA9D,OAA6K0E,IAE7K,IAAInI,EAAgB2S,EAAYpL,GAC5BqP,EAAgB5W,EAAckyB,QAAUvjB,EAAuBuoL,qBAAwBj9K,EACvFL,EAAWnH,KAAKgN,IAAI,EAAI7I,EAAesS,GAG3C,GAAIA,EAAgBtS,EAAejI,EAAuBwoL,eAEtD,OADAlmL,EAAOwI,MAAP,8BAAAhW,OAA2CzD,EAAckyB,QAAzD,kBAAAzuB,OAAiFmT,EAAjF,mBAAAnT,OAA+GylB,EAA/G,cAAAzlB,OAAyImW,IA3DjJ,SAA6B/V,EAAeoN,GACxC,IAAIH,EAAqB,EACrB3Q,EAAS0D,EAEb,GAAI2D,EACA,IAAK,IAAIzH,EAAI,EAAGA,EAAIyH,EAAkBtH,OAAQH,IAAK,CAC/C,IAAI2R,EAAIlK,EAAkBzH,GACtB2R,EAAEwgB,QAAUruB,EAAcquB,SAAWxgB,EAAEwgB,QAAUphB,GAAsBG,EAAoBS,EAAEwgB,UAE7FphB,EAAqBY,EAAEwgB,QACvB/xB,EAASuR,EAEhB,CAGL,OAAOvR,CACV,CAhBD,CA4DmCH,EAAeia,GAAmBk/I,aAGjE,OAAQ7xJ,GACJ,IAvNA,0BA6RJyJ,EAAU,CALa,GACH,GACD,GACA,IAlEX,MACJ,IAzNA,2BAoSR,SAAgClN,GAC5BkN,EAgCJ,SAA2BlN,GAIvB,IAHA,IAAI2D,EAAI,GACJsJ,EAAa2B,KAAK+yB,KAAM,EAAI3hC,GAEvB1D,EAAI,EAAGA,EApCgC,EAoCfA,IAC7BqH,EAAEod,KAAKnS,KAAKyhE,SAAWpjE,GAK3B,OAFAC,EAAUvJ,CAGb,CAXD,CAhCgC3D,EAAY3D,OAC3C,CAFD,CA1EmCyS,GACvB,MAIJ,SAoFR,SAAiC9O,EAAwBoN,EAAazJ,EAAgBsJ,EAAe3Q,EAAUJ,EAAmB2R,GACzHX,IACDA,EAAUc,EAAcA,EAAc3R,OAAS,IAGnD,IAAIoH,EAAezD,EAAuBuzL,iBAAiBnmL,EAAazJ,EAAgBsJ,EAAe3Q,EAAUJ,EAAmB2R,GAC/G,OAAjBpK,IAA2C,IAAlBA,IACzByJ,EAAUzJ,EAEjB,CATD,CAnFoCqH,EAAwBgE,EAAaJ,EAAgB2W,EAAetP,EAAUK,EAAmB9R,GAQjI,IAJA,IAAIoR,EAAc,KACdQ,EAAW,KACXgD,EAAe,KAEV/C,EAAI,EAAGA,EAAIrH,EAAYzS,OAAQ8Z,IAAK,CACzC,IAAIF,EAAYnH,EAAYqH,GACxB8C,EAAiBhD,EAAU07B,MAC3Bt5B,EAAU,CAACY,EAAeyhJ,WAC1BzhJ,EAAe2iE,QACf3iE,EAAek6K,SACfl6K,EAAcknG,QAEd7oG,EAAkBpK,EAAQwJ,QAC1BjE,EAAa3H,EAAuB0oL,yBAAyBv9K,EAAUoY,QAAShJ,EAAejP,GAC/FmB,EAAc9E,EAAa3H,EAAuBwoL,eAClD/7K,GACAnK,EAAOwI,MAAP,6BAAAhW,OAA0CqW,EAAUoY,QAApD,kBAAAzuB,OAA4EmT,EAA5E,mBAAAnT,OAA0GylB,EAA1G,gBAAAzlB,OAAsI6S,KAGtIwD,EAAUoY,QAAU/xB,EAhDJ,KAgDoCib,IAChDtB,EAAUoY,UAAYxgB,IAEtByJ,EAAgB,GAAK,KAK7B,IAAIzM,EAAWzG,EAAaiU,EAAS,CAACrJ,EA5DpB,EACM,EACP,GA0D8FsI,IAC3F,OAAhB5B,GAAwB7K,EAAW6K,KACnCA,EAAc7K,EACdqL,EAAWD,EAAUq/I,aACrBp8I,EAAejD,EAEtB,CAID,IAAI3S,EAAgBsL,KAAKC,IAAI1S,EAAckyB,QAAUnV,EAAamV,SAAWphB,EAM7E,OALAnJ,EAAe3H,EAAe2S,EAAa,CAACE,EAAsB7K,EAAS4R,EAAUzS,IAGrFQ,EAAeoV,EAAcpK,EAAa,CAACE,EA1ErB,EACM,EAyEyE1L,IAE9F4S,CACV,EAwMG84B,MA5bJ,WACI3rC,GACH,GATG+J,GAAA,EAAS9Q,EAAAk0B,GAAMrsB,GAASg1H,cAAcK,UAAUx5H,GAChDqD,IAscGrD,CACV,CAED9D,EAAsBy9H,sBAAwB,wBAC9CvsH,EAAAojB,EAAevjB,EAAAujB,EAAAyqG,gBAA6B/+H,EAAA,gBAAA8D,EAAAoN,EAAAzJ,GAAA,iBAAAsJ,EAAAtJ,EAAA,MAAArH,EAAAqH,EAAA,MCne5C,SAASzH,IAEL,IAAI8D,EACAoN,EACAzJ,EACAsJ,EACA/Q,EAMJ,SAAS2R,IACLT,EAAsB,KACtBzJ,EAAkB,KAClBsJ,EAAiB,KACjB/Q,EAAiB,IACpB,CAUD,SAASgR,EAAelN,EAAcoN,EAAkBzJ,EAAgBsJ,GAWpE,IAAI/Q,EAAU,IAAII,EAAAk0B,EAgClB,OA/BAt0B,EAAQ+B,KAAO+B,EAOX9D,EAAQu3L,QAAQC,cAHftmL,GAC+B,EAOpClR,EAAQu3L,QAAQE,qBAAuB,EAOnCz3L,EAAQu3L,QAAQG,gBAHfjwL,GACiC,IAMtCzH,EAAQu3L,QAAQI,eAAiB,GACjC33L,EAAQu3L,QAAQI,eAAe9yK,KAAK,CAAE89G,UAAW,IAAKi1D,QAA2B,IAAjB7mL,IAChE/Q,EAAQu3L,QAAQI,eAAe9yK,KAAK,CAAE89G,UAAW,IAAWi1D,QAA2B,GAAjBnwL,IAIjEzH,EAAQu3L,QAAQM,qBADhB9mL,GAAuD,IAGrD/Q,CACV,CAQD,SAAS8R,EAAqBhO,EAASoN,EAAczJ,EAASsJ,EAAe3Q,GAEzEA,EAAQ03L,aAAgB13L,EAAQm3L,QAAQC,cAAgB1zL,EAGpD1D,EAAQ23L,cACR33L,EAAQ43L,mBAAsB53L,EAAQm3L,QAAQE,qBAAuB/kL,KAAKC,IAAI7O,EAAU1D,EAAQ23L,cAEpG33L,EAAQ23L,YAAcj0L,EAGtB1D,EAAQ63L,cAAiB73L,EAAQm3L,QAAQG,gBAAkBxmL,EAG3D,IAAK,IAAIlR,EAAI,EAAGA,EAAII,EAAQm3L,QAAQI,eAAex3L,OAAQH,IAAK,CAC5D,IAAI2R,EAAevR,EAAQm3L,QAAQI,eAAe33L,GAClD,GAAIyH,GAAWkK,EAAagxH,UAAW,CACnCviI,EAAQ83L,aAAgBvmL,EAAaimL,QAAUnwL,EAC/C,KACH,CACJ,CAGDrH,EAAQ+3L,mBAAsB/3L,EAAQm3L,QAAQM,qBAAuBnlL,KAAKC,IAAI,EAAI5B,GAGlF3Q,EAAQg4L,SAAWh4L,EAAQ03L,YAAc13L,EAAQ43L,kBAAoB53L,EAAQ63L,aAAe73L,EAAQ83L,YAAc93L,EAAQ+3L,iBAC7H,CAuCD,OAVAr0L,EAAW,CACPu0L,mBArHJ,SAA4Bv0L,EAAW1D,EAAWuR,GAE9CT,EAAsBF,EAAe,UAAWlN,EAAW1D,EAAWuR,GACtElK,EAAkB3D,EAClBiN,EAAiB3Q,EACjBJ,EAAiB2R,CACpB,EAgHG2mL,kBAhEJ,SAA2Bx0L,EAAgB2D,EAAqBsJ,EAAgB3Q,GACxE8Q,GACAY,EAAqBhO,EAAgB2D,EAAqBsJ,EAAgB3Q,EAAsB8Q,EAEvG,EA6DGqnL,iBA7BJ,WACI,OAAOrnL,CACV,EA4BGsnL,sBAxBJ,SAA+B10L,EAAgBoN,EAAqB9Q,EAAgBuR,GAChF,IAAIpK,EAAmB,KAMvB,OAJIE,GAAmBsJ,GAAkB/Q,IACrCuH,EAAmByJ,EAAe,UAAWvJ,EAAiBsJ,EAAgB/Q,IAG9EuH,GACAuK,EAAqBhO,EAAgBoN,EAAqB9Q,EAAgBuR,EAAsBpK,GACzFA,EAAiB6wL,UAGjB,CAEd,EAWGtlJ,MATJ,WACInhC,GACH,GA5HGA,IAwIG7N,CACV,CAED9D,EAAiBy9H,sBAAwB,mBACzCvsH,EAAAojB,EAAevjB,EAAAujB,EAAAyqG,gBAA6B/+H,EAAA,gBAAA8D,EAAAoN,EAAAzJ,GAAA,iBAAAsJ,EAAAtJ,EAAA,MAAArH,EAAAqH,EAAA,MAAAzH,EAAAyH,EAAA,MAAAkK,EAAAlK,EAAA,MAAAuJ,EAAAvJ,EAAA,MAAAqK,EAAArK,EAAA,MAAAF,EAAAE,EAAA,MAAAQ,EAAAR,EAAA,MC3I5C,SAASN,EAASrD,GAId,IAGIoN,EACAzJ,EACArH,EACA+G,EANAgB,GAFJrE,EAASA,GAAU,CAAC,GAEKs0I,YACrBlwI,EAAUkS,KAAK9V,QA4HnB,OAPAmD,EAAW,CACP4tL,YAzGJ,SAAqBvxL,GACjB,IACI,IAAI2D,GAAA,EAAgBuJ,EAAAsjB,GAAcpsB,GAASxD,SACvCqM,EAAYjN,EAAamoJ,eAAelqJ,KACxC/B,EAAgB8D,EAAa+rK,mBAC3Bl+J,EAAa7N,EAAamqI,gBAC5B7lI,EAAiBpI,EAAcwiJ,cAAczxI,EAAWY,EAAWoK,IACjEnU,EAAY9D,EAAamoJ,eACzBzkJ,EAAgBW,EAAYozK,sBAAsBxqK,GAClDnC,EAAqB9K,EAAaonJ,wBAClC14I,EAAqBrK,EAAY48I,sBAAsBh0I,GAAA,GACvDoY,EAAYxX,GAAcA,EAAWypI,aAAezpI,EAAWypI,aAAa5B,UAAY,KACxFt/H,EAAqBtL,EAAmB23I,wBAC1C3zI,EAAUsH,EAAmBwiI,wBAEjC,IAAK54I,EAAayrK,cAAiBx+J,IAAc9I,EAAAqsB,EAAA3B,MAC7C,OAAOlrB,EAGNmL,IACDA,EAAU,GAGd,IAAME,EAAeoH,EAAmBm/H,kBAElCp5I,EADoBD,EAAc4pJ,uBACH2L,yBAAyBxkJ,EAAWoY,GAGzE,GAFAjY,EAAOwI,MAAP,cAAAhW,OAA2BgP,KAAKwU,MAAMjnB,GAAtC,UAEIm5B,MAAMn5B,KAAgBuH,EACtB,OAAOC,EAGX,GAAIzH,EAAc8rJ,uBAAuBn6I,EAAWoK,GAAIhL,KAAee,EAAAwiB,EAAAy3H,aACnE,OAAOtkJ,EAQX,IAJA,IAAIoP,EAAcjP,EAAU0tJ,YACxBz7I,EAAkB/V,EAAasnJ,wBAAwBnG,iBACvDzrI,EAAiB3C,EAAY,GAAG21H,UAAY,IAC5CxyH,EAAiBnD,EAAYA,EAAY1W,OAAS,GAAGqsI,UAAY,IAC5DxvH,EAAI,EAAGA,EAAInG,EAAY1W,OAAQ6c,IAAK,CACzC,IAAI/C,EAAIpD,EAAYmG,GAAGwvH,UAAY,IAC/BvyH,EAAID,EACJA,EAAiBC,EACZA,EAAIT,IACTA,EAAiBS,EAExB,CAGD,IACIF,EADiBlD,EAAYzO,GAAgBokI,UACP,IACtCzvH,EAAc5U,EAAYszK,sBAAsB1qK,GAAA,GAChDoL,GAA4BY,EAAYm0J,UAAUt1J,UAAYmB,EAAYo0J,SAASv1J,WAAa,IAChGR,EAAsBe,EAA2BtC,EAAkBsC,EAA2BtC,EAAkB,EACpH1S,EAAakxL,mBAAmBx+K,EAAiBG,EAAgBR,GACjErS,EAAamxL,kBAAkBv+K,EAAoBqB,EAAqBxI,EAASE,GAKjF,IAAIyD,GAAA,EAAyBhP,EAAA+sB,GAAmBpsB,GAASxD,OAAO,CAC5D44B,cApFW,IAqFXm7J,UApFO,GAqFP/gD,gBAAA79H,EACA6+K,aAAAvxL,IAgBJ,OAVAM,EAAc01G,QAAU/8G,EAAmB82L,eAAetvL,EAAwB,IAAb3H,EAAmB2S,EAASJ,EAAoBM,EAAc1K,EAAgBmO,GACnJ9O,EAAcuxB,OAAS,CAAEwlI,WAAYv+J,EAAYy/E,QAAS9sE,GAC1DnL,EAAcunF,SAAWh+E,EAAAsjB,EAAA8gK,SAAAF,OAEzBtmL,EAAmBo3I,mBAAmB,GAElCv+I,EAAc01G,UAAY/0G,GAC1B8I,EAAOwI,MAAM,qBAAuB3I,EAAY,iCAAkCtJ,EAAc01G,QAAS,qBAAsBzqG,KAAKwU,MAAMjnB,GAAa,QAGpJwH,CAGV,CAFC,MAAO3D,GACL,MAAMA,CACT,CACJ,EAoBGgvC,MANJ,WAPI1yC,EAAmB0yC,QACnB3rC,EAAa2rC,OAQhB,GA3GG5hC,GAAA,EAASH,EAAAujB,GAAMpsB,GAAS+0H,cAAcK,UAAU71H,GAChDrH,GAAA,EAAqBJ,EAAAs0B,GAAsBpsB,GAASxD,SACpDyC,GAAA,EAAewK,EAAA2iB,GAAiBpsB,GAASxD,SAkHtC+C,CACV,CAEDN,EAASs2H,sBAAwB,WACjCvsH,EAAAojB,EAAel0B,EAAAk0B,EAAAyqG,gBAA6B53H,EAAA,gBAAArD,EAAAoN,EAAAzJ,GAAA,iBAAAsJ,EAAAtJ,EAAA,MC/I5C,SAASrH,EAAmB0D,GACxB,IAIIoN,EAGAzJ,EACAsJ,EAsHsB3Q,EA9HtBJ,EAAgB8D,EAAOw5B,cACvB3rB,EAAY7N,EAAO20L,UACnBznL,EAAkBlN,EAAO4zI,gBACzB5lI,EAAehO,EAAO40L,aAkK1B,SAASnxL,IACL,OAAOyJ,CACV,CAoBD,SAAS/I,EAAcnE,EAAeoN,GAClC,IAAMzJ,EAAkBF,IAOxB,OALI2J,EAAezJ,EACF3D,EAAgB2D,EAEhB3D,EAAgB2D,EAAkByJ,CAGtD,CAYD,OAVAA,EAAW,CACPkmL,aA1CJ,WACI,OAAOzlL,CACV,EAyCGwlL,mBAAA5vL,EACA+vL,yBAzBJ,SAAkCxzL,EAAmBoN,EAAezJ,GAEhE,OAAOQ,EAAciJ,EADDpN,EAAoBkN,EAAmBvJ,EAE9D,EAuBGkxL,cAAA1wL,EACAovL,iBAnKJ,SAA0BvzL,EAASoN,EAAgB9Q,EAAemH,EAAiBJ,EAAmBgB,GAClG,IAAID,EAAS,KACTE,EAAgB,KAChBR,EAAgB,KAChBJ,EAAekL,KAAKC,IAAIzB,EAAiBH,GAqD7C,OAlDAjN,EAAQ0J,SAAQ,SAAC1J,GAKb2D,EAAc+F,SAAQ,SAAC/F,GAMHA,EAAa,GAD7B,IAAIsJ,EAEStJ,EAAa,GAFtBF,EAGQE,EAAa,GAIrBmH,GAHQnH,EAAa,GAGL3D,EAAOquB,QAAUnhB,EAAmB7J,GACpDqL,EAAavK,EAAc7H,EAAewO,GAQ1Cua,GALsB,IAAtB5hB,EACK,GAEC,EAAIA,GALCmL,KAAKgN,IAAI,KAAU9Q,EAAe4D,GAc7C0H,GALuB,IAAvBnJ,EACK,GAEC,EAAIA,GAEajN,EAAO2xC,MAAMiqC,QAEpC9sE,EAAWd,EAAa0mL,sBAAsB10L,EAAOquB,QAAShJ,EAAkBjP,EAAiB/R,IACrF,OAAXD,GAAmB0K,EAAW1K,IAyB/C,SAA2BpE,EAAaoN,EAAYzJ,GAIhD,QAAI3D,EAAc9D,EAAgByH,IAI3ByJ,GAAcS,CACxB,CATD,CAzB4ET,EAAgBsB,EAAYhL,KACxFU,EAAS0K,EACTxK,EAAgBX,EAChBG,EAAgB9D,EAAOquB,QAE9B,GACJ,IAGqB,OAAlB/pB,GAA4C,OAAlBR,IAC1BQ,GAAiB,GAGrB2I,EAAkBG,EACX9I,CACV,GAzEGX,EA2Ge,SAAX3D,EAAqBoN,EAAMzJ,EAAQsJ,GAEnC,GAAIA,IAAYtJ,EACZ,OAAOyJ,EAIX,IADA,IAAIlR,EAAMkR,EAAK/Q,OACNwR,EAAI,EAAGA,EAAI3R,EAAK2R,IAGrB,IAFA,IAAIX,EAAWE,EAAKmZ,QAEXvY,EAAI,EAAGA,EAAI1R,EAAKD,OAAQ2R,IAC7BZ,EAAK2T,KAAK7T,EAAStN,OAAOtD,EAAK0R,KAIvC,OAAOhO,EAASoN,EAAMzJ,EAAQsJ,EAAU,EAC3C,CAhBc,EANO3Q,EAvGV,CAAC,GAAK,GAAK,GAAK,GAAK,IAyGjBupB,KAAI,SAAU7lB,GAC1B,MAAO,CAACA,EACX,IA1GiB,EA8HY,GA5H9BiN,EAAkB,EAsLfG,CACV,CAED9Q,EAAmBq9H,sBAAwB,qBAC3CvsH,EAAAojB,EAAevjB,EAAAujB,EAAAyqG,gBAA6B3+H,EAAA,gBAAA0D,EAAAoN,GAAA,aC7L5CA,EAAAojB,EA3BI,SAAAxwB,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAA3oD,GAEVsW,KAAKrY,KAAO,KAGZqY,KAAK29K,YAAc,KAGnB39K,KAAKm9K,QAAU,CAAC,EAChBn9K,KAAKm9K,QAAQC,cAAgB,KAC7Bp9K,KAAKm9K,QAAQE,qBAAuB,KACpCr9K,KAAKm9K,QAAQG,gBAAkB,KAC/Bt9K,KAAKm9K,QAAQI,eAAiB,KAC9Bv9K,KAAKm9K,QAAQM,qBAAuB,KAGpCz9K,KAAK09K,YAAc,EACnB19K,KAAK49K,kBAAoB,EACzB59K,KAAK69K,aAAe,EACpB79K,KAAK89K,YAAc,EACnB99K,KAAK+9K,kBAAoB,EAGzB/9K,KAAKg+K,SAAW,CACnB,iBAAAt0L,EAAAoN,EAAAzJ,GAAA,aAAAA,EAAAU,EAAA+I,EAAA,CAAAqa,EAAA,kBAAArjB,CAAA,QAAA6I,EAAAtJ,EAAA,MAAArH,EAAAqH,EAAA,MAAAzH,EAAAyH,EAAA,MAAAkK,EAAAlK,EAAA,MAAAuJ,EAAAvJ,EAAA,MAAAqK,EAAArK,EAAA,MAAAF,EAAAE,EAAA,MAAAQ,EAAAR,EAAA,MAAAN,EAAAM,EAAA,MAAAU,EAAAV,EAAA,MCpBQS,EAA4B,CAAC,mCACtC,+CAEJ,SAASE,EAAgBtE,GACrB,IAYIoN,EACAzJ,EACAzH,EACAoI,EACAR,EACAJ,EACAoH,EACA4D,EAnBE2W,EAAU/O,KAAK9V,QACf4V,EAAUpW,EAAOmzG,QACjBrkG,EAAoB9O,EAAO8nI,kBAC3B94H,EAAahP,EAAO2nI,WACpBxrI,EAAoB6D,EAAO6nI,kBAC3B90H,EAAQ/S,EAAO4V,MACfG,EAAW/V,EAAOynI,SAClB/xH,EAAS1V,EAAOs2G,OAChBpgG,EAAgBlW,EAAO+yI,cAEvB75H,GAAA,EAAWhM,EAAAsjB,GAASnL,GAAS8zG,cA2EnC,SAAShjH,EAAanW,EAAgBoN,GAClC,IAAMH,EAAQ,IAAIY,EAAA2iB,EAClBvjB,EAAMgL,GAAKjY,EAAeiY,GAC1BhL,EAAMohB,QAAUruB,EAAe0oI,UAC/Bz7H,EAAM5H,MAAQrF,EAAeqF,MAC7B4H,EAAM3H,OAAStF,EAAesF,OAC9B2H,EAAM4oJ,SAAW,EACjB5oJ,EAAM6oJ,UAAY,EAEd91J,EAAe8uJ,qBACf9uJ,EAAe8uJ,oBAAoBplJ,SAAQ,SAAC1J,GACxC,GAAIoE,EAA0BqE,QAAQzI,EAAE+6C,cAAgB,GAAK/6C,EAAE8H,MAAO,CAClE,IAAMsF,EAAOpN,EAAE8H,MAAMuG,MAAM,KACP,IAAhBjB,EAAK/Q,QAAiBi5B,MAAMloB,EAAK,KAAQkoB,MAAMloB,EAAK,MACpDH,EAAM4oJ,SAAWr/I,SAASpJ,EAAK,GAAI,IACnCH,EAAM6oJ,UAAYt/I,SAASpJ,EAAK,GAAI,IAE3C,CACJ,IAGDA,EACA1J,EAAmB0vI,kBAAkBpzI,GAChCgjC,MAAK,SAAC51B,IAmBnB,SAAmCpN,EAAOoN,EAAgBzJ,GACtD,IAAIsJ,EAAQ,GACN3Q,EA8CV,SAA4B0D,EAAMoN,GAC9B,IAGIzJ,EACAsJ,EACA3Q,EACAJ,EANE2R,EAAW,GACbX,EAAQ,EAOZ,IAAKvJ,EAAI,EAAGsJ,EAAMjN,EAAKizI,SAAS52I,OAAQsH,EAAIsJ,EAAKtJ,IAC7CrH,EAAI0D,EAAKizI,SAAStvI,IAElBzH,GAAA,EAAM8R,EAAA+lI,IACF53I,EACAia,EAAQ8hI,eACR9qI,EACA9Q,EAAE65B,UACF75B,EAAE0b,SACF1b,EAAEqoB,UACFroB,EAAEk7B,MACFl7B,EAAEwsI,WACF57H,MAGAW,EAASkT,KAAK7kB,GACdA,EAAM,KACNgR,KAGR,OAAOW,CACV,CA9BD,CA9CwClK,EAAMyJ,GAC1CA,EAAe6lI,SAAW32I,EAC1B0D,EAAM4zI,gBAAkBxmI,EAAe6lI,SAAS,GAAGj7H,SAEnDhY,EAAMi2J,cAAgB,SAAUj2J,EAAM2D,GAElC,IAAIrH,EAAS,KACb2Q,EAAM2f,MAAK,SAAAxf,GACP,GAAIA,EAAGwL,OAAS5Y,GAAQoN,EAAG0L,IAAM9Y,EAE7B,OADA1D,EAAS8Q,EAAGhL,KAAA,CAGnB,IACG9F,EACAqH,EAASrH,GAET8Q,EAAe6lI,SAASrmH,MAAK,SAACtwB,GAC1B,GAAIA,EAAG0sI,gBAAkBhpI,GAAQ1D,EAAG0sI,eAAiB1sI,EAAG0b,SAAWhY,EAAM,CACrE,IAAM9D,EAAU4S,EAAkB9I,QAAQoH,EAAeK,MAqBzD,OApBA3C,EAAOkoB,KAAK,CACR/qB,OAAQ,MACR7F,IAAKlG,EAAQkG,IACb1B,QAAS,CACL8oC,MAAOltC,EAAGwsI,WACVviI,aAAc,eAElBk4G,OAAQ,SAAUz+G,GACd,IAAIoN,EAAOsB,EAAU0qK,eAAep5K,EAAEskF,OAAO58E,UACzCxL,EAAO,IAAIwuD,KAAK,CAAC1qD,EAAEskF,OAAO58E,SAASgP,MAAMtJ,EAAKisK,WAAW,GAAG3yJ,OAAQtZ,EAAKisK,WAAW,GAAG3yJ,OAAStZ,EAAKisK,WAAW,GAAGv2J,OAAQ,CAAE7kB,KAAM,eACnI4P,EAAW7K,OAAOolB,IAAIuiC,gBAAgBzuD,GAC1C+Q,EAAM8T,KAAK,CACPnI,MAAOtc,EAAG0sI,eACVlwH,IAAKxc,EAAG0sI,eAAiB1sI,EAAG0b,SAC5B5V,IAAKyL,IAELlK,GACAA,EAASkK,EAChB,MAGR,CACJ,GAER,CACJ,CA9CD,CAlB0CZ,EAAOjN,EAAgBoN,EACpD,KAGLH,EAAMymI,YAAc1zI,EAAe0zI,YACnCzmI,EAAM2mI,gBAAkB5zI,EAAe4zI,gBACvC3mI,EAAM0X,UAAY3kB,EAAe2kB,UACjC1X,EAAMipJ,YA2Fd,SAA0Bl2J,GACtB,IAAMoN,EAAc8L,EAAS6uH,WAAW/nI,EAAew3B,OACnDte,EAASlT,QAAQhG,EAAew3B,MAAO1oB,EAAkB9I,QAAQhG,EAAeyN,MAAMrL,KAAOpC,EAAew3B,MAEhH,OAAKpqB,GAAA,EAIEY,EAAAs4F,IAAqBl5F,EAAapN,EAAeiY,IAH7C,EAId,CATD,CA3F6CjY,IAGrCiN,EAAM4oJ,SAAW,GAAK5oJ,EAAM6oJ,UAAY,IAExC7oJ,EAAM8oJ,aAAe9oJ,EAAM5H,MAAQ4H,EAAM4oJ,SACzC5oJ,EAAM+oJ,cAAgB/oJ,EAAM3H,OAAS2H,EAAM6oJ,UAC3CnyJ,EAAOod,KAAK9T,GAEnB,CAoID,SAASgJ,IACLtS,EAAS,GACTW,GAAqB,EACrBR,EAAY,IACf,CAcD,OAZAsJ,EAAW,CACPqoJ,UA9CJ,WACI,OAAO9xJ,CACV,EA6CG6xJ,UAnNJ,WACI,GAAKxmJ,GAAeoH,IAKpBtS,EAAYsS,EAAQ0oJ,oBAAoB9vJ,EAAY/B,EAAAujB,EAAA07H,QACpD,CAIA,IAAMlsJ,EAASoW,EAAQwvI,qBAAqB9hJ,GAExC9D,GAAUA,EAAO3D,OAAS,GAC1B2D,EAAO0J,SAAQ,SAAC1J,IACPA,EAAIwpI,kBAAoBltI,EAAAk0B,EAAAi6G,kBAAkCzqI,EAAI4zI,gBAAkB,GAAK5zI,EAAIw3B,OAC1Fx3B,EAAIwpI,kBAAoBltI,EAAAk0B,EAAAo6G,mBACxBz0H,EAAanW,GAEbA,EAAIwpI,kBAAoBltI,EAAAk0B,EAAAy6G,cACxB90H,EAAanW,GAAA,EAEpB,IAGD2D,EAAOtH,OAAS,GAEhBsH,EAAOsnC,MAAK,SAACjrC,EAAGoN,GAAJ,OAAUpN,EAAEquB,QAAUjhB,EAAEihB,OAAxB,GAlBf,CAoBJ,EAuLG2gB,MAAA/4B,EACAs/I,gBAlCJ,SAAyBv1J,GAChB2D,GAA4B,IAAlBA,EAAOtH,SAIlB2D,GAAS2D,EAAOtH,SAChB2D,EAAQ2D,EAAOtH,OAAS,GAE5BiI,EAAoBtE,EACvB,EA0BG21J,gBA1CJ,WACI,OAAIrxJ,EAAoB,EACb,KAEJX,EAAOW,EACjB,EAsCG6xJ,qBA/CJ,WACI,OAAO7xJ,CACV,EA8CGsxJ,2BA1BJ,SAAoC51J,GAGhC,IAFA,IAAIoN,EACEH,EAASmJ,EAAQwvI,qBAAqB9hJ,GACnCxH,EAAI,EAAGA,EAAI2Q,EAAO5Q,OAAQC,IAC/B,GAAIqH,EAAOW,GAAmB2T,KAAOhL,EAAO3Q,GAAG2b,GAAI,CAC/C7K,EAAeH,EAAO3Q,GACtB,KACH,CAGL,OAAOJ,EAAYguI,yBAAyBpmI,EAAWsJ,EAAcpN,EACxE,GAzOGiW,IACAnL,GAAA,EAAS3G,EAAAqsB,GAAUnL,GAASzkB,OAAO,CAAC,GACpC8N,GAAA,EAAYjL,EAAA+sB,GAAUnL,GAAS8zG,cAE/Bz1H,GAAA,EAAqBW,EAAAmsB,GAAmBnL,GAASzkB,OAAO,CACpD01G,OAAA5gG,EACA+xH,SAAA1xH,EACA4xH,WAAA34H,EACA64H,kBAAA1rI,EACA42I,cAAA78H,EACAo+H,YAAat0I,EAAOs0I,YACpBtB,sBAAuBhzI,EAAOgzI,sBAC9B/0I,KAAMgP,EAAAujB,EAAA07H,SAGVhwJ,GAAA,EAAcmH,EAAAmtB,GAAYnL,GAASzkB,OAAO,CACtC+mI,WAAA34H,EACA/Q,KAAMgP,EAAAujB,EAAA07H,MACNrkB,kBAAA1rI,EACAyrI,mBAAAlkI,EACAokI,kBAAAh5H,EACA8G,MAAA7C,EACA00H,SAAA1xH,EACAugG,OAAA5gG,EACAq9H,cAAA78H,EACAwxH,SAAAxuH,KAIQmxH,aAAWj0H,GAAUA,EAAQ8hI,gBAgOtC9qI,CACV,CAED9I,EAAgBq1H,sBAAwB,kBACxCvsH,EAAAojB,EAAet0B,EAAAs0B,EAAAyqG,gBAA6B32H,EAAA,gBAAAtE,EAAAoN,EAAAzJ,GAAA,iBAAAsJ,EAAAtJ,EAAA,MAAArH,EAAAqH,EAAA,MAAAzH,EAAAyH,EAAA,MAAAkK,EAAAlK,EAAA,MAAAuJ,EAAAvJ,EAAA,MC9R5C,SAASqK,IAEL,IAAIhO,EACAoN,EACAzJ,EAAU2S,KAAK9V,QAWnB,SAAStE,EAAM8D,GACX,IAAKA,EAAM,OAAO,cAEdA,EAAK80L,YACL90L,EAAK80L,UAAY,GAGrB,IAAI1nL,EAAaS,EAAA+rK,YAAqB55K,GAClCiN,GAAA,EAAc3Q,EAAAk0B,GAAQ7sB,GAAS/C,SAInC,OAFAqM,EAAY8nL,QAAQ3nL,GAEbH,CACV,CAmJD,SAASe,EAAYhO,EAAMoN,GACvB,OAAOpN,EAAKoN,EAAS,KAAO,EACvBpN,EAAKoN,EAAS,IAAM,IAAO,EAC3BpN,EAAKoN,EAAS,IAAM,KAAQ,EAC5BpN,EAAKoN,IAAW,KAAQ,CAChC,CAED,SAAS3J,EAAgBzD,EAAMoN,GAC3B,OAAOoU,OAAOC,aAAazhB,EAAKoN,MAC5BoU,OAAOC,aAAazhB,EAAKoN,MACzBoU,OAAOC,aAAazhB,EAAKoN,MACzBoU,OAAOC,aAAazhB,EAAKoN,GAChC,CAqFD,OAXAA,EAAW,CACP6jB,MAAA/0B,EACAytJ,2BAhOJ,SAAoC3pJ,EAAOoN,EAAQzJ,GAM/C,QAAI,IALAA,IACAA,EAAS,IAIRyJ,GAAUzJ,EAAS,GAAKyJ,EAAOmU,WAChC,OAAO,IAAIrU,EAAAsjB,EAAiB,GAAG,GAMnC,IAHA,IACIvjB,EADE3Q,EAAQ8Q,aAAkB+9C,YAAe,IAAIx0C,WAAWvJ,GAAUA,EAEpElR,EAAsB,EACnByH,EAASrH,EAAKilB,YAAY,CAC7B,IAAM1T,EAAUG,EAAY1R,EAAMqH,GAC5BQ,EAAUV,EAAgBnH,EAAMqH,EAAS,GAE/C,GAAgB,IAAZkK,EACA,MAGAlK,EAASkK,GAAWvR,EAAKilB,aACrBvhB,EAAMyI,QAAQtE,IAAY,EAC1B8I,EAAU,IAAIC,EAAAsjB,EAAiB7sB,GAAA,EAAckK,GAE7C3R,EAAsByH,EAASkK,GAIvClK,GAAUkK,CACb,CAED,OAAKZ,GACM,IAAIC,EAAAsjB,EAAiBt0B,GAAA,EAInC,EA4LGiqJ,0BAhGJ,SAAmCnmJ,GAC/B,IAAIoN,EAAUlR,EAAM8D,GAChB2D,EAAUyJ,EAAUA,EAAQw5I,OAAO,eAEvC,OAAOjjJ,EAAUA,EAAQghB,UAAYgvB,GACxC,EA4FGylI,eA3LJ,SAAwBp5K,GACpB,IAAKA,GAAwB,IAAlBA,EAAGuhB,WACV,MAAO,CAAC83J,WAAY,GAAIY,mBAAoBtmI,IAAKqhJ,cAAerhJ,IAAKymI,aAAczmI,KAEvF,IAMIvmC,EAEAzJ,EACAsJ,EACA3Q,EACAuR,EACAX,EACAc,EAAGvK,EAAGU,EAAGd,EAAGgB,EAAGD,EACfE,EACAR,EACAJ,EACAoH,EAjBA4D,EAAUxS,EAAM8D,GAEhBqlB,EAAY3W,EAAQ03I,SAAS,QAE7BhwI,EAAY1H,EAAQ03I,SAAS,QAejC1iJ,EAAegL,EAAQ03I,SAAS,QAAQ/pJ,OACxCyH,EAAqBsS,EAAUA,EAAU/Z,OAAS,GAAG44L,gBACrDtxL,EAAc,EAEdkK,EAAa,GACb,IAAIiB,GAAa,EACbE,GAAkB,EACtB,IAAK3L,EAAI,EAAGA,EAAIgiB,EAAUhpB,OAAQgH,IAAK,CACnC,IAAIlH,EAAUkpB,EAAUhiB,GAEpB0P,EAAY5W,EAAQ+4L,cAAc,QACtC,IAAKzxL,EAAI,EAAGA,EAAIsP,EAAU1W,OAAQoH,IAAK,CACnC,IAAIsS,EAAUhD,EAAUtP,GAEpBiS,EAAUK,EAAQo/K,YAAY,QAE9Bj/K,EAAUH,EAAQo/K,YAAY,QAClC74L,EAAY4Z,EAAQk/K,oBAEpB,IAAIl8K,EAAYnD,EAAQm/K,cAAc,QAElC/+K,EAAYJ,EAAQm/K,cAAc,QACtC,IAAK/wL,EAAI,EAAGA,EAAI+U,EAAU7c,OAAQ8H,IAAK,CACnC,IAAI8R,EAAUiD,EAAU/U,GAIxB,IAHAR,EAAcsS,EAAQo/K,aACtB/wL,GAAcoR,EAAQ4/K,kBAAoB,IAAMr/K,EAAQs/K,aAAe,GAElEvnL,EAAI,EAAGA,EAAIrK,EAAaqK,IAAK,CAE9BZ,OAAA,KADAF,EAAS+I,EAAQ2P,QAAQ5X,IACAwnL,gBAAiCtoL,EAAOsoL,gBAAkB9/K,EAAQ+/K,wBAC3FxoL,OAAA,IAAcC,EAAOwoL,YAA6BxoL,EAAOwoL,YAAchgL,EAAQigL,oBAE/E,IAAI18K,EAAa,CACb++B,IAAO17C,EACPmnD,IAAQnnD,QAAA,IAHmB4Q,EAAO0oL,+BAAgD1oL,EAAO0oL,+BAAiC,GAI1H59K,SAAY5K,EACZsZ,OAAUvqB,EAAQuqB,OAASpiB,EAC3Bwe,KAAQ7V,EACRqsK,SAAY,CAACrsK,IAEjB,GAAIkJ,EACA,IAAK9R,EAAI,EAAGA,EAAI8R,EAAU9Z,OAAQgI,IAAK,CACnC,IAAIgU,EAAUlC,EAAU9R,GAKxB,GAJIyK,EAAauJ,EAAQw9K,YAAc,GAAM7nL,EAAIgB,IAC7CF,IACAE,GAAkBqJ,EAAQw1D,QAAQ/+D,GAAWgnL,cAE7C9nL,GAAKgB,EAAgB,CACrBiK,EAAWqgK,SAAW,GACtB,IAAIhiK,EAAQe,EAAQw1D,QAAQ/+D,GAC5B,IAAK1K,EAAI,EAAGA,EAAIkT,EAAMy+K,gBAAiB3xL,IACnC6U,EAAWqgK,SAASv4J,KAAKzJ,EAAM0+K,WAAW5xL,GAAG6xL,eAEpD,CACJ,CAELpoL,EAAWkT,KAAK9H,GAChB3U,GAAc2I,EACd3Q,GAAa8Q,CAChB,CACJ,CACDtC,EAAgBxO,EAAY4Z,EAAQk/K,mBACvC,CACJ,CACD,MAAO,CAAC/b,WAAYxrK,EAAYosK,mBAAoBn2K,EAAoBkxL,cAAelqL,EAAesvK,aAAc12K,EACvH,EAoGGgtK,cA7EJ,SAAuBtjK,GACnB,IAAIzJ,EAAY,KAIVsJ,EAAU/Q,EAAMkR,GAEtB,IAAKH,EACD,OAAOtJ,EAGX,IAAMrH,EAAO2Q,EAAQ25I,OAAO,QACtB/4I,EAAOZ,EAAQ25I,OAAO,QAY5B,OAVA5mJ,EAAO4V,MAAM,iCAET/H,GAAQA,EAAK8iK,aAGbhtK,GAFQrH,EAAOA,EAAKoqB,OAAS7Y,EAAK6Y,QAEd,KADd7Y,EAAK6Y,OAAS7Y,EAAKiV,KAAO,GAGhC9iB,EAAO4V,MAAM,qCAAuCjS,IAGjDA,CACV,EAqDGuyL,aA5CJ,SAAsBl2L,EAAOoN,EAAQzJ,GAKjC,QAAI,IAJAA,IACAA,EAAS,IAGRyJ,GAAUzJ,EAAS,GAAKyJ,EAAOmU,WAChC,OAAO,IAAIrU,EAAAsjB,EAAiB,GAAG,GAMnC,IAHA,IACIvjB,EADE3Q,EAAQ8Q,aAAkB+9C,YAAe,IAAIx0C,WAAWvJ,GAAUA,EAEpElR,EAAsB,EACnByH,EAASrH,EAAKilB,YAAY,CAC7B,IAAM1T,EAAUG,EAAY1R,EAAMqH,GAC5BQ,EAAUV,EAAgBnH,EAAMqH,EAAS,GAE/C,GAAgB,IAAZkK,EACA,MAGAlK,EAASkK,GAAWvR,EAAKilB,aACrBvhB,EAAMyI,QAAQtE,IAAY,EAC1B8I,EAAU,IAAIC,EAAAsjB,EAAiB7sB,GAAA,EAAckK,EAAS1J,GAEtDjI,EAAsByH,EAASkK,GAIvClK,GAAUkK,CACb,CAED,OAAKZ,GACM,IAAIC,EAAAsjB,EAAiBt0B,GAAA,EAInC,GA5PG8D,GAAA,EAASiN,EAAAujB,GAAM7sB,GAASw1H,cAAcK,UAAUpsH,GAyQ7CA,CACV,CACDY,EAAU2rH,sBAAwB,YAClCvsH,EAAAojB,EAAet0B,EAAAs0B,EAAAopG,oBAAiC5rH,EAAA,gBAAAhO,EAAAoN,EAAAzJ,GAAA,aAAAA,EAAAU,EAAA+I,EAAA,CAAAgM,EAAA,kBAAAlM,CAAA,QAAAD,EAAAtJ,EAAA,MAAArH,EAAAqH,EAAA,MAAAzH,EAAAyH,EAAA,MCvR1CkK,EAA0B,CAC5B,CACI0X,MAAS,OACT4wK,iBAAoB,CAAC,SAEzB,CACI5wK,MAAS,OACT4wK,iBAAoB,CAAC,UAItB,SAASjpL,IACZ,IAAIlN,EAAyB,uBAAwBgD,OACjDoK,EAAa,sBAAuBpK,OACpCW,EAAkB,gBAAiBX,OAEvC,OAAQhD,GAAyBoN,GAAazJ,CACjD,CAED,SAASqK,IAEL,IAAIhO,EACAoN,EACAzJ,EAuLJ,OAZA3D,EAAW,CACPu3I,UAtKJ,SAAmBv3I,GACVA,GAIDA,EAAOo5G,WACPhsG,EAAWpN,EAAOo5G,SAEzB,EA+JGmnE,oBAAArzK,EACAmqJ,uBAxJJ,WACI,OAAO1zJ,CACV,EAuJGgnK,cAvIJ,SAAuB3qK,EAAQ2D,GAE3B,OAAIA,IAASzH,EAAAs0B,EAAA3B,OAAmBlrB,IAASzH,EAAAs0B,EAAAi7C,MAC9BlqE,QAAQyE,SAAA,GAiBvB,SAAqChG,EAAQ2D,GAEzC,OAAOyJ,EAASgK,MAAMskH,UAAUa,aAAaE,yBAA2B36H,UAAUylC,mBAAqBzlC,UAAUylC,kBAAkBxE,eAAkB/iC,EAAOulB,OAAS5hB,IAASzH,EAAAs0B,EAAA3B,OAAqBlrB,IAASzH,EAAAs0B,EAAAi7C,OAAmBzrE,EAAOulB,OAASvlB,EAAOqF,OAASrF,EAAOsF,QAAUtF,EAAOquB,SAAWruB,EAAOwiC,UAC5S,CAHD,CAdoCxiC,EAAQ2D,GA6D5C,SAA0C3D,EAAQoN,GAC9C,OAAO,IAAI7L,SAAQ,SAACoC,GAEhB,GAAK3D,GAAWA,EAAOulB,MAAvB,CAKA,IAAMtY,EAAgB,CAClBhP,KAAM,gBAGVgP,EAAcG,GAAQ,CAAC,EACvBH,EAAcG,GAAMu1B,YAAc3iC,EAAOulB,MACzCtY,EAAcG,GAAM/H,MAAQrF,EAAOqF,MACnC4H,EAAcG,GAAM9H,OAAStF,EAAOsF,OACpC2H,EAAcG,GAAMihB,QAAU7X,SAASxW,EAAOquB,SAC9CphB,EAAcG,GAAMo1B,UAAY1rB,WAAW9W,EAAOwiC,WAElD1gC,UAAUylC,kBAAkBxE,aAAa91B,GACpC+1B,MAAK,SAAChjC,GACH2D,EAAQ3D,EAAO+hC,UAClB,IAHLkB,OAIW,WACHt/B,GAAA,EACH,GAnBJ,MAFGA,GAAA,EAsBP,GACJ,CA3BD,CA5DgD3D,EAAQ2D,GAwBxD,SAA4B3D,GACxB,OAAO,IAAIuB,SAAQ,SAAC6L,GAChB,GAAKpN,GAAWA,EAAOulB,MAAvB,CAKA,IAAI5hB,EAAQ3D,EAAOulB,MACfvlB,EAAOqF,OAASrF,EAAOsF,SACvB3B,GAAS,WAAa3D,EAAOqF,MAAQ,aAAerF,EAAOsF,OAAS,KAIpE,uBAAwBtC,QAAU6lB,mBAAmBiE,gBAAgBnpB,IAG9D,gBAAiBX,QAAU4lB,YAAYkE,gBAAgBnpB,IAGvD,sBAAuBX,QAAU8lB,kBAAkBgE,gBAAgBnpB,GAL1EyJ,GAAA,GAUJA,GAAA,EAnBC,MAFGA,GAAA,EAsBP,GAEJ,CA3BD,CArB8BpN,EAC7B,EA6HGkxL,2BAlJJ,SAAoClxL,GAChC2D,EAA0B3D,CAC7B,EAiJG8qK,0BApCJ,SAAmC9qK,GAC/B,IACI,OAA+D,IAAvD1D,EAAAmrB,EAAAhf,QAAkCzI,EAAG+6C,cAAyB7+C,EAAAs0B,EAAA0tJ,2BAAuCl+K,EAAG+6C,WAGnH,CAFC,MAAO/6C,GACL,OAAO,CACV,CACJ,EA+BGk4J,6BAvBJ,SAAsCl4J,EAAQoN,GAI1C,IAHA,IAEIzJ,EAFEsJ,EAAYjN,EAAOqO,MAAM,KAAK,GAC9B/R,EAA+C,IAA9B8Q,EAAO3E,QAAQwE,GAE7B/Q,EAAI,EAAGA,EAAI2R,EAAwBxR,OAAQH,IAChD,GAAI2R,EAAwB3R,GAAGqpB,QAAUtY,EAAW,CAChDtJ,EAAmBkK,EAAwB3R,GAC3C,KACH,CAEL,OAAIyH,EACOrH,GAAkBqH,EAAiBwyL,iBAAiBvpK,MAAK,SAAC5sB,GAAD,OAAyD,IAApCoN,EAAO3E,QAAQzI,EAApC,IAE7D1D,CACV,GAtKGqH,GAAA,EAoLG3D,CACV,CAEDgO,EAAa2rH,sBAAwB,eACrCvsH,EAAAojB,EAAevjB,EAAAujB,EAAAopG,oBAAiC5rH,EAAA,gBAAAhO,EAAAoN,EAAAzJ,GAAA,iBAAAsJ,EAAAtJ,EAAA,MAAArH,EAAAqH,EAAA,MCnNhD,SAASzH,IAmHL,MAAO,CACHk6L,qBAnHuB,GAoHvB/5L,OAnHS,EAoHTsgF,IAlHJ,SAAa38E,EAAOoN,GAChB,IAAIzJ,EAEJ,IAAKA,EAAI,EAAIA,EAAI2S,KAAK8/K,qBAAqB/5L,QAAY2D,EAAQsW,KAAK8/K,qBAAqBzyL,GAAGiV,MAAQjV,KAIpG,IAFA2S,KAAK8/K,qBAAqB5uK,OAAO7jB,EAAG,EAAG,CAAEiV,MAAO5Y,EAAO8Y,IAAK1L,IAEvDzJ,EAAI,EAAGA,EAAI2S,KAAK8/K,qBAAqB/5L,OAAS,EAAGsH,IAC9C2S,KAAK+/K,YAAY1yL,EAAGA,EAAI,IACxBA,IAGR2S,KAAKja,OAASia,KAAK8/K,qBAAqB/5L,MAC3C,EAsGGy7D,MApGJ,WACIxhD,KAAK8/K,qBAAuB,GAC5B9/K,KAAKja,OAAS,CACjB,EAkGG44D,OAhGJ,SAAgBj1D,EAAOoN,GACnB,IAAK,IAAIzJ,EAAI,EAAGA,EAAI2S,KAAK8/K,qBAAqB/5L,OAAQsH,IAClD,GAAI3D,GAASsW,KAAK8/K,qBAAqBzyL,GAAGiV,OAASxL,GAAOkJ,KAAK8/K,qBAAqBzyL,GAAGmV,IASnFxC,KAAK8/K,qBAAqB5uK,OAAO7jB,EAAG,GACpCA,QAEG,IAAI3D,EAAQsW,KAAK8/K,qBAAqBzyL,GAAGiV,OAASxL,EAAMkJ,KAAK8/K,qBAAqBzyL,GAAGmV,IAAK,CAG7FxC,KAAK8/K,qBAAqB5uK,OAAO7jB,EAAI,EAAG,EAAG,CAAEiV,MAAOxL,EAAK0L,IAAKxC,KAAK8/K,qBAAqBzyL,GAAGmV,MAC3FxC,KAAK8/K,qBAAqBzyL,GAAGmV,IAAM9Y,EACnC,KACH,CAAUA,EAAQsW,KAAK8/K,qBAAqBzyL,GAAGiV,OAAS5Y,EAAQsW,KAAK8/K,qBAAqBzyL,GAAGmV,IAM1FxC,KAAK8/K,qBAAqBzyL,GAAGmV,IAAM9Y,EAC5BoN,EAAMkJ,KAAK8/K,qBAAqBzyL,GAAGiV,OAASxL,EAAMkJ,KAAK8/K,qBAAqBzyL,GAAGmV,MAMtFxC,KAAK8/K,qBAAqBzyL,GAAGiV,MAAQxL,EACxC,CAGLkJ,KAAKja,OAASia,KAAK8/K,qBAAqB/5L,MAC3C,EA2DGg6L,YAzDJ,SAAqBr2L,EAAaoN,GAC9B,IAAIzJ,EAAS2S,KAAK8/K,qBAAqBp2L,GACnCiN,EAASqJ,KAAK8/K,qBAAqBhpL,GAEvC,OAAIzJ,EAAOiV,OAAS3L,EAAO2L,OAAS3L,EAAO2L,OAASjV,EAAOmV,KAAOnV,EAAOmV,KAAO7L,EAAO6L,KAGnFnV,EAAOmV,IAAM7L,EAAO6L,IACpBxC,KAAK8/K,qBAAqB5uK,OAAOpa,EAAa,OAGvCH,EAAO2L,OAASjV,EAAOiV,OAASjV,EAAOiV,OAAS3L,EAAO6L,KAAO7L,EAAO6L,KAAOnV,EAAOmV,KAG1FnV,EAAOiV,MAAQ3L,EAAO2L,MACtBtC,KAAK8/K,qBAAqB5uK,OAAOpa,EAAa,OAEvCH,EAAO2L,OAASjV,EAAOiV,OAASjV,EAAOiV,OAAS3L,EAAO6L,KAAOnV,EAAOmV,KAAO7L,EAAO6L,KAG1FxC,KAAK8/K,qBAAqB5uK,OAAOxnB,EAAa,OAEvC2D,EAAOiV,OAAS3L,EAAO2L,OAAS3L,EAAO2L,OAASjV,EAAOmV,KAAO7L,EAAO6L,KAAOnV,EAAOmV,MAG1FxC,KAAK8/K,qBAAqB5uK,OAAOpa,EAAa,MAIrD,EA6BGwL,MA3BJ,SAAe5Y,GAGX,SAFA1D,EAAA4pJ,IAAalmJ,GAETA,GAASsW,KAAK8/K,qBAAqB/5L,QAAU2D,EAAQ,EAC9C2zC,IAGJr9B,KAAK8/K,qBAAqBp2L,GAAO4Y,KAC3C,EAoBGE,IAlBJ,SAAa9Y,GAGT,SAFA1D,EAAA4pJ,IAAalmJ,GAETA,GAASsW,KAAK8/K,qBAAqB/5L,QAAU2D,EAAQ,EAC9C2zC,IAGJr9B,KAAK8/K,qBAAqBp2L,GAAO8Y,GAC3C,EAYJ,CAED5c,EAAiBy9H,sBAAwB,mBACzCvsH,EAAAojB,EAAevjB,EAAAujB,EAAAyqG,gBAA6B/+H,EAAA,aAAA8D,EAAAoN,EAAAzJ,GAAA,iBAAAsJ,EAAAtJ,EAAA,MCxH5C,SAASrH,IAEL,IAAI0D,EAEEoN,EAAc,yBACdzJ,EAAe,gBACfsJ,EAAgB,eAChB3Q,EAAc,wCAadJ,EAAoB,SAAC8D,EAAKoN,GAC5B,IACI,OAAO,IAAIpK,OAAOolB,IAAIpoB,EAAKoN,GAASpQ,UAGvC,CAFC,MAAOoQ,GACL,OAAOpN,CACV,CACJ,EAeK6N,EAAkB,SAAC7N,EAAKoN,GAC1B,IAAIzJ,EAAmBuJ,EAEvB,IAAKE,EACD,OAAOpN,EAGX,IAAKmE,EAAWnE,GACZ,OAAOA,EAGPqD,EAAerD,KACf2D,EAAmBqK,GAGnB3J,EAAiBrE,KACjB2D,EAAmBF,GAGvB,IAAMwJ,EAAOtJ,EAAiByJ,GACxB9Q,EAC+B,MAAjC2Q,EAAKlK,OAAOkK,EAAK5Q,OAAS,IACR,MAAlB2D,EAAI+C,OAAO,GACP,IAAM,GAEd,MAAO,CAACkK,EAAMjN,GAAKuO,KAAKjS,EAC3B,EAoBD,SAAS4Q,EAAalN,GAClB,IAAMoN,EAAapN,EAAIyI,QAAQ,KACzB9E,EAAiB3D,EAAIoO,YAAY,KAEvC,OAAoB,IAAhBhB,EAEIzJ,IAAmByJ,EAAa,EACzBpN,IAGe,IAAtBA,EAAIyI,QAAQ,OACZzI,EAAMA,EAAImO,UAAU,EAAGnO,EAAIyI,QAAQ,OAGhCzI,EAAImO,UAAU,EAAGxK,EAAiB,IAGtC,EACV,CAUD,SAASqK,EAAYhO,GACjB,IAAMoN,EAAUpN,EAAIkwB,MAAM5zB,GAE1B,OAAI8Q,EACOA,EAAQ,GAGZ,EACV,CAsBD,SAAS3J,EAAYzD,GACjB,IAAM2D,EAAU3D,EAAIkwB,MAAM9iB,GAE1B,OAAIzJ,EACOA,EAAQ,GAGZ,EACV,CASD,SAASQ,EAAWnE,GAChB,OAAQoN,EAAYvL,KAAK7B,EAC5B,CASD,SAASqD,EAAerD,GACpB,OAAOmE,EAAWnE,IAA0B,MAAlBA,EAAI+C,OAAO,EACxC,CASD,SAASsB,EAAiBrE,GACtB,OAA6B,IAAtBA,EAAIyI,QAAQ,KACtB,CAoDD,OAzKA,WACI,IACc,IAAIzF,OAAOolB,IAAI,IAAK,YAC9BpoB,EAAkB9D,CAKrB,CAJC,MAAO8D,GAER,CALD,QAMIA,EAAkBA,GAAmB6N,CACxC,CACJ,CATD,GA4JiB,CACb08J,aAAcr9J,EACdopL,YAAatoL,EACbuoL,YAAa9yL,EACbskI,WAAY5jI,EACZk6K,eAAgBh7K,EAChBmzL,iBAAkBnyL,EAClB+jK,UApCJ,SAAmBpoK,GACf,OAAO2D,EAAa9B,KAAK7B,EAC5B,EAmCGy2L,QA1BJ,SAAiBz2L,GACb,OAAOiN,EAAcpL,KAAK7B,EAC7B,EAyBG02L,eArGJ,SAAwB12L,GAEpB,MADe,+BAA+B+N,KAAK/N,GACnC,GAAGmO,UAAU,EAChC,EAmGGnI,QAhBJ,SAAiBoH,EAAKzJ,GAClB,OAAO3D,EAAgBoN,EAAKzJ,EAC/B,EAkBJ,CAEDrH,EAAgBq9H,sBAAwB,kBACxCvsH,EAAAojB,EAAevjB,EAAAujB,EAAAopG,oBAAiCt9H,EAAA,gBAAA0D,EAAAoN,EAAAzJ,GAAA,iBAAAsJ,EAAAtJ,EAAA,MAAArH,EAAAqH,EAAA,MCzPhD,SAASzH,IAEL,IACI8D,EAkBJ,SAASoN,EAASA,GACd,IAAIH,EAAQ,GAEZ,IAAKG,IAASpN,GAAmD,mBAA3BA,EAAc22L,SAChD,OAAO1pL,EAMX,IAHA,IACI3Q,EADAJ,EAAU8D,EAAc22L,SAASvpL,GAG5BS,EAAI,EAAGX,EAAKhR,EAAQG,OAAQwR,EAAIX,EAAIW,KACzCvR,EAAMqH,EAAoBzH,EAAQ2R,MAG9BZ,EAAM8T,KAAKzkB,GAInB,OAAO2Q,CACV,CAuBD,SAAStJ,EAAoB3D,GACzB,IAAKA,EAAS,OAAO,KAErB,IAAIoN,EAAM,IAAIH,EAAAujB,EAAOxwB,GAMrB,OAJIA,EAAQ/C,eAAe,iBACvBmQ,EAAIujK,YAAc3wK,EAAQ42L,aAGvBxpL,CACV,CASD,MAPW,CACPw5I,OAlEJ,SAAgBx5I,GACZ,OAAKA,GAASpN,GAAkBA,EAAc65K,OAAyC,IAA/B75K,EAAc65K,MAAMx9K,QAAgD,mBAAxB2D,EAAc0zE,MAE3G/vE,EAAoB3D,EAAc0zE,MAAMtmE,IAFgG,IAGlJ,EA+DGg5I,SAAUh5I,EACV2nL,QAhCJ,SAAiB3nL,GACbpN,EAAgBoN,CACnB,EA+BG4jK,WAzBJ,WACI,IAAKhxK,IAAkBA,EAAc65K,QAAU75K,EAAc65K,MAAMx9K,OAAQ,OAAO,KAElF,IACIsH,EAAQyJ,EADDpN,EAAc65K,MAAM75K,EAAc65K,MAAMx9K,OAAS,GAAG4B,MAG/D,OAAO0F,EAAMtH,OAAS,EAAIsH,EAAMA,EAAMtH,OAAS,GAAK,IACvD,EAsBJ,CACDH,EAAQy9H,sBAAwB,UAChCvsH,EAAAojB,EAAel0B,EAAAk0B,EAAAyqG,gBAA6B/+H,EAAA,gBAAA8D,EAAAoN,EAAAzJ,GAAA,aAAAA,EAAAU,EAAA+I,EAAA,CAAA9J,EAAA,kBAAAhH,CAAA,QAAA2Q,EAAAtJ,EAAA,MCtFrC,SAASrH,EAAc0D,EAAaoN,GACvC,IAAMzJ,EAAU,CACZvB,IAAKpC,EAAYoC,IACjB6F,OAAQjI,EAAYiI,OACpB3B,QAASxJ,OAAO4/E,OAAO,CAAC,EAAG18E,EAAYsG,SACvCktE,YAAaxzE,EAAYqJ,gBAAkB,iBAC3CmgC,MAAOxpC,EAAYU,QAAQ8oC,OAG/B,OAAOjoC,QAAQyE,QAAQoH,EAAgB28I,cAAcpmJ,IAChDq/B,MAAK,kBACFlmC,OAAO4/E,OAAO18E,EAAa2D,EAAS,CAAE0F,gBAAyC,YAAxB1F,EAAQ6vE,aAD7D,GAGb,CAED,SAASt3E,IAmBL,MANW,CACP6tJ,cAAe,KACfoK,iBAXJ,SAA0Bn0J,GACtB,OAAOA,CACV,EAUG4oJ,oBAPJ,SAA6B5oJ,EAA7BoN,GACI,OAD2CA,EAAPhL,IAC7BpC,CACV,EASJ,CAED9D,EAAgBy9H,sBAAwB,kBACxCvsH,EAAAojB,EAAevjB,EAAAujB,EAAAopG,oBAAiC19H,EAAA,gBAAA8D,EAAAoN,EAAAzJ,GAAA,aAAAA,EAAAU,EAAA+I,EAAA,CAAAu3J,GAAA,kBAAAzoK,CAAA,EAAAgqJ,GAAA,kBAAAr4I,CAAA,QAAAZ,EAAAtJ,EAAA,eAAArH,EAAA0D,GAAA,OAAA1D,EAAA,mBAAAiH,QAAA,iBAAAA,OAAA85E,SAAA,SAAAr9E,GAAA,cAAAA,CAAA,WAAAA,GAAA,OAAAA,GAAA,mBAAAuD,QAAAvD,EAAA5D,cAAAmH,QAAAvD,IAAAuD,OAAAxG,UAAA,gBAAAiD,CAAA,EAAA1D,EAAA0D,EAAA,CCvCzC,SAAS9D,EAAmB8D,EAAWoN,GAC1C,GAAI9Q,EAAO0D,KAAcoN,EACrB,MAAMH,EAAAujB,EAAAmwJ,kBAEb,CAEM,SAAS9yK,EAAa7N,GAGzB,GAF4B,OAAdA,GAAuBs1B,MAAMt1B,IAAeA,EAAY,GAAM,EAGxE,MAAMiN,EAAAujB,EAAAmwJ,mBAA+B,+BAE5C,iBAAA3gL,EAAAoN,EAAAzJ,GAAA,iBAAAsJ,EAAAtJ,EAAA,MAAArH,EAAAqH,EAAA,GCFD,SAASzH,IAEL,IACI8D,EACAoN,EAAa,GACXzJ,EAAU2S,KAAK9V,QA4BrB,SAASyM,EAAatJ,EAAcsJ,EAAK3Q,GACrC,IAAIJ,EA3BR,SAAkByH,GACd,IAAIsJ,EACJ,IAAKA,EAAI,EAAGA,EAAIG,EAAW/Q,OAAQ4Q,IAE/B,GADYG,EAAWH,GAAG4pL,MAChBh1L,KAAK8B,GACX,OAAOyJ,EAAWH,GAAGhN,MAG7B,OAAOD,CACV,CATD,CA2ByB1D,GAAW2Q,GAChC,OAAO/Q,GAA0C,mBAAzBA,EAAMyH,GAAgCzH,EAAMyH,GAAcsJ,EAAK3Q,GAAW0D,EAAgB2D,GAAcsJ,EAAK3Q,EACxI,CAmID,OApJI0D,GAAA,EAAkB1D,EAAAk0B,GAAgB7sB,GAASw1H,cAsIpC,CACP29D,iBA7HJ,SAA0B92L,EAAO2D,GAC7ByJ,EAAW2T,KAAK,CAAC81K,MAAO72L,EAAOC,MAAO0D,GACzC,EA4HG4mK,aA9GJ,SAAsBvqK,GAClB,OAAOiN,EAAa,eAAgBjN,EACvC,EA6GGs2L,YAnGJ,SAAqBt2L,GACjB,OAAOiN,EAAa,cAAejN,EACtC,EAkGGu2L,YA7EJ,SAAqBv2L,GACjB,OAAOiN,EAAa,cAAejN,EACtC,EA4EG+nI,WAnEJ,SAAoB/nI,GAChB,OAAOiN,EAAa,aAAcjN,EACrC,EAkEGq+K,eAzDJ,SAAwBr+K,GACpB,OAAOiN,EAAa,iBAAkBjN,EACzC,EAwDGw2L,iBA/CJ,SAA0Bx2L,GACtB,OAAOiN,EAAa,mBAAoBjN,EAC3C,EA8CGooK,UApCJ,SAAmBpoK,GACf,OAAOiN,EAAa,YAAajN,EACpC,EAmCGy2L,QA1BJ,SAAiBz2L,GACb,OAAOiN,EAAa,UAAWjN,EAClC,EAyBG02L,eA9FJ,SAAwB12L,GACpB,OAAOiN,EAAa,iBAAkBjN,EACzC,EA6FGgG,QAhBJ,SAAiBhG,EAAKoN,GAClB,OAAOH,EAAa,UAAWjN,EAAKoN,EACvC,EAkBJ,CAEDlR,EAASy9H,sBAAwB,WACjC,IAAM9rH,EAAUZ,EAAAujB,EAAAopG,oBAAiC19H,GACjDkR,EAAAojB,EAAA3iB,CAAA,gBAAA7N,EAAAoN,GAAA,aC5KAA,EAAAojB,EAPI,SAAAxwB,EAAYoN,EAAMzJ,EAASsJ,IAAA,SAAAjN,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAM,KAAA3oD,GAC7BsW,KAAK6e,KAAO/nB,GAAQ,KACpBkJ,KAAKpK,QAAUvI,GAAW,KAC1B2S,KAAKlQ,KAAO6G,GAAQ,IACvB,iBAAAjN,EAAAoN,EAAAzJ,GAAA,iBAAAsJ,EAAAtJ,EAAA,eAAArH,EAAA0D,EAAAoN,GAAA,QAAAzJ,EAAA,EAAAA,EAAAyJ,EAAA/Q,OAAAsH,IAAA,KAAAsJ,EAAAG,EAAAzJ,GAAAsJ,EAAAmvD,WAAAnvD,EAAAmvD,aAAA,EAAAnvD,EAAA6wE,cAAA,YAAA7wE,IAAAA,EAAAmuH,UAAA,GAAAt+H,OAAAmC,eAAAe,EAAAiN,EAAA9P,IAAA8P,EAAA,MCFC/Q,EAAA,WACF,SAAA8D,EAAYoN,IAAA,SAAApN,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAK,KAAA3oD,GACbsW,KAAK6nB,OAASn+B,EAAgBg6I,gBAC9B1jI,KAAK6f,UAAYwd,IACjBr9B,KAAK0yH,eAAiBr1F,IACtBr9B,KAAKikH,UAAY,KACjBjkH,KAAK+yH,UAAY,KACjB/yH,KAAKrY,KAAO,KACZqY,KAAK0B,SAAW27B,IAChBr9B,KAAKqO,UAAYgvB,IACjBr9B,KAAKkzB,MAAQ,KACblzB,KAAKlU,IAAMgL,GAAO,KAClBkJ,KAAK0xH,gBAAkB,KACvB1xH,KAAKqyI,iBAAmB,KACxBryI,KAAKm9I,cAAgB,KACrBn9I,KAAKk9I,eAAiB,KACtBl9I,KAAK+iG,QAAU1lE,IACfr9B,KAAK+F,MAAQs3B,IACbr9B,KAAK2yH,sBAAwB,KAC7B3yH,KAAK4yH,oBAAsB,KAC3B5yH,KAAK8yH,cAAgB,KACrB9yH,KAAKk+I,YAAc7gH,IACnBr9B,KAAKm+I,WAAa9gH,IAClBr9B,KAAK6uI,iBAAmBxxG,IACxBr9B,KAAK/P,aAAe,cACpB+P,KAAKizH,iBAAmB,IAC3B,KAAA5lI,EAAA,OAAAA,EAAA,EAAAxG,IAAA,0BAAA2K,MAED,WACI,OAAQwO,KAAKrY,MAAQqY,KAAKrY,OAASgP,EAAAiJ,EAAA0rH,iBACtC,IAAAzkI,IAAA,UAAA2K,MAED,SAAQ9H,GACJsW,KAAKrY,KAAO+B,GAAQA,EAAKsgD,KAAOrzC,EAAAiJ,EAAA0rH,kBAAgC30H,EAAAiJ,EAAAyrH,mBAChErrH,KAAKlU,IAAMpC,GAAQA,EAAKoC,IAAMpC,EAAKoC,IAAM,KACzCkU,KAAKkzB,MAAQxpC,GAAQA,EAAKwpC,MAAQxpC,EAAKwpC,MAAM5wB,MAAQ,IAAM5Y,EAAKwpC,MAAM1wB,IAAM,KAC5ExC,KAAKikH,UAAYv6H,GAAQA,EAAKu6H,UAAYv6H,EAAKu6H,UAAY,IAC9D,MAAAj+H,EAXA0D,EAWAjD,UAAA4G,GAAA3D,CAAA,CArCC,GAwCN9D,EAAgB89I,gBAAkB,WAClC99I,EAAgBg9I,gBAAkB,WAElC9rI,EAAAojB,EAAAt0B,CAAA,gBAAA8D,EAAAoN,GAAA,sBAAAzJ,EAAA3D,EAAAoN,GAAA,QAAAzJ,EAAA,EAAAA,EAAAyJ,EAAA/Q,OAAAsH,IAAA,KAAAsJ,EAAAG,EAAAzJ,GAAAsJ,EAAAmvD,WAAAnvD,EAAAmvD,aAAA,EAAAnvD,EAAA6wE,cAAA,YAAA7wE,IAAAA,EAAAmuH,UAAA,GAAAt+H,OAAAmC,eAAAe,EAAAiN,EAAA9P,IAAA8P,EAAA,MC9CMA,EAAA,WACF,SAAAjN,EAAYoN,GAKR,GAAI,SAAJpN,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,qCAAI,CALa,KAAA3oD,GACjBsW,KAAKoQ,OAAStZ,EAAQ2pL,QACtBzgL,KAAKrY,KAAOmP,EAAQnP,KACpBqY,KAAKwM,KAAO1V,EAAQ0V,KACpBxM,KAAKujK,MAAQ,GACTzsK,EAAQysK,MACR,IAAK,IAAIl2K,EAAI,EAAGA,EAAIyJ,EAAQysK,MAAMx9K,OAAQsH,IACtC2S,KAAKujK,MAAM94J,KAAK,IAAI/gB,EAAOoN,EAAQysK,MAAMl2K,KAKjD,OAFA2S,KAAKq6J,YAAA,EAEGvjK,EAAQnP,MACZ,IAAK,OAKD,GAJAqY,KAAKqO,UAAYvX,EAAQuX,UACzBrO,KAAKuwI,2BAA6Bz5I,EAAQy5I,2BAC1CvwI,KAAKw6J,aAAe1jK,EAAQ0jK,aAC5Bx6J,KAAKuO,WAAazX,EAAQyX,WACtBzX,EAAQyX,WAAY,CACpBvO,KAAKuO,WAAa,GAClB,IAAK,IAAI5X,EAAI,EAAGA,EAAIG,EAAQyX,WAAWxoB,OAAQ4Q,IAAK,CAChD,IAAI3Q,EAAY,CACZs0K,eAAgBxjK,EAAQyX,WAAW5X,GAAG2jK,eACtCC,gBAAiBzjK,EAAQyX,WAAW5X,GAAG4jK,gBACvCE,oBAAqB3jK,EAAQyX,WAAW5X,GAAG8jK,qBAE/Cz6J,KAAKuO,WAAW9D,KAAKzkB,EACxB,CACJ,CACD,MACJ,IAAK,OACDga,KAAK2B,GAAK7K,EAAQ6K,GAClB3B,KAAKrK,QAA8B,IAApBmB,EAAQnB,QAAgB,EAAI,EAC3CqK,KAAKxO,MAAQsF,EAAQtF,MACrBwO,KAAKqO,UAAYvX,EAAQuX,UACzBrO,KAAKi+J,cAAgBnnK,EAAQmnK,cAC7Bj+J,KAAKk+J,wBAA8C,IAApBpnK,EAAQnB,QAAgBmB,EAAQ4pL,kBAAoB5pL,EAAQonK,wBAC3Fl+J,KAAKm+J,eAAiBrnK,EAAQqnK,eAC9Bn+J,KAAKo+J,aAAetnK,EAAQsnK,aAC5B,MACJ,IAAK,OACDp+J,KAAKqO,UAAYvX,EAAQuX,UACzB,MACJ,IAAK,OACDrO,KAAK2+K,gBAAkB7nL,EAAQ6nL,gBAC/B,MACJ,IAAK,OACD3+K,KAAKu/K,YAAczoL,EAAQyoL,YAC3Bv/K,KAAKu3D,QAAUzgE,EAAQygE,QACvB,MACJ,IAAK,OACDv3D,KAAKg/K,iBAAmBloL,EAAQkoL,iBAChCh/K,KAAK2gL,yBAA2B7pL,EAAQ6pL,yBACxC3gL,KAAKm/K,wBAA0BroL,EAAQqoL,wBACvCn/K,KAAKq/K,oBAAsBvoL,EAAQuoL,oBACnCr/K,KAAK4gL,qBAAuB9pL,EAAQ8pL,qBACpC5gL,KAAK1Z,MAAQwQ,EAAQxQ,MACrB,MACJ,IAAK,OACD0Z,KAAKrK,QAAUmB,EAAQnB,QACvBqK,KAAK8+K,oBAAsBhoL,EAAQgoL,oBACnC9+K,KAAK1Z,MAAQwQ,EAAQxQ,MACrB,MACJ,IAAK,OAMD,GALA0Z,KAAK++K,aAAejoL,EAAQioL,aAC5B/+K,KAAK6gL,mBAAqB/pL,EAAQ+pL,mBAClC7gL,KAAKi/K,YAAcnoL,EAAQmoL,YAC3Bj/K,KAAK1Z,MAAQwQ,EAAQxQ,MACrB0Z,KAAKsP,QAAUxY,EAAQwY,QACnBxY,EAAQwY,QAAS,CACjBtP,KAAKsP,QAAU,GACf,IAAK,IAAI1pB,EAAI,EAAG2R,EAAKT,EAAQwY,QAAQvpB,OAAQH,EAAI2R,EAAI3R,IAAK,CACtD,IAAIgR,EAAS,CACTwoL,YAAatoL,EAAQwY,QAAQ1pB,GAAGw5L,YAChCF,gBAAiBpoL,EAAQwY,QAAQ1pB,GAAGs5L,gBACpCI,+BAAgCxoL,EAAQwY,QAAQ1pB,GAAG05L,gCAEvDt/K,KAAKsP,QAAQ7E,KAAK7T,EACrB,CACJ,CACD,MACJ,IAAK,OACDoJ,KAAKrK,QAAUmB,EAAQnB,QACvBqK,KAAK8gL,mBAAqBhqL,EAAQgqL,mBAClC9gL,KAAK+vI,kBAAoBj5I,EAAQi5I,kBACjC/vI,KAAKgwI,mBAAqBl5I,EAAQk5I,mBAClChwI,KAAKmwI,WAAar5I,EAAQq5I,WAC1BnwI,KAAK1Z,MAAQwQ,EAAQxQ,MAGhC,KAAAqQ,EAAA,OAAAA,EAAA,EAAA9P,IAAA,cAAA2K,MAED,SAAY9H,GACR,IAAK,IAAIoN,EAAI,EAAGA,EAAIkJ,KAAKujK,MAAMx9K,OAAQ+Q,IACnC,GAAIkJ,KAAKujK,MAAMzsK,GAAGnP,OAAS+B,EACvB,OAAOsW,KAAKujK,MAAMzsK,EAG7B,IAAAjQ,IAAA,gBAAA2K,MAED,SAAc9H,GAEV,IADA,IAAIoN,EAAQ,GACHzJ,EAAI,EAAGA,EAAI2S,KAAKujK,MAAMx9K,OAAQsH,IAC/B2S,KAAKujK,MAAMl2K,GAAG1F,OAAS+B,GACvBoN,EAAM2T,KAAKzK,KAAKujK,MAAMl2K,IAG9B,OAAOyJ,CACV,MAAAzJ,EAlBA3D,EAkBAjD,UAAAkQ,GAAAjN,CAAA,CA7GC,GAiHNoN,EAAAojB,EAAAvjB,CAAA,gBAAAjN,EAAAoN,GAAA,aCzGAA,EAAAojB,EAPI,SAAAxwB,EAAYoN,EAAqBzJ,EAAOsJ,IAAA,SAAAjN,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAM,KAAA3oD,GAC1CsW,KAAKuzI,oBAAsBz8I,EAC3BkJ,KAAKszI,MAAQjmJ,EACb2S,KAAKwM,KAAO7V,CACf,iBAAAjN,EAAAoN,GAAA,aCYLA,EAAAojB,EAhBI,SAAAxwB,KAAA,SAAAA,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,sCAAc,KAAA3oD,GACVsW,KAAK+X,QAAU,EACf/X,KAAKjR,MAAQ,EACbiR,KAAKhR,OAAS,EACdgR,KAAKu/I,SAAW,EAChBv/I,KAAKw/I,UAAY,EACjBx/I,KAAKy/I,aAAe,EACpBz/I,KAAK0/I,cAAgB,EACrB1/I,KAAKo9H,YAAc,EACnBp9H,KAAKs9H,gBAAkB,EACvBt9H,KAAKqO,UAAY,EACjBrO,KAAK4/I,YAAc,GACnB5/I,KAAK2B,GAAK,EACb,iBAAAjY,EAAAoN,EAAAzJ,GAAA,sBAAAsJ,EAAAjN,EAAAoN,GAAA,KAAApN,aAAAoN,GAAA,UAAAu7C,UAAA,qCAAAhlD,EAAAU,EAAA+I,EAAA,CAAA6L,EAAA,kBAAA/c,CAAA,EAAAga,EAAA,kBAAA5Z,CAAA,QCZCA,EAIF,SAAA0D,IAAciN,EAAA,KAAAjN,GAKVsW,KAAKigK,MAAQ,KAabjgK,KAAKrY,KAAO,KAKZqY,KAAKlU,IAAM,KAKXkU,KAAKggK,UAAY,KAKjBhgK,KAAKkzB,MAAQ,KAKblzB,KAAK+2J,SAAW,KAKhB/2J,KAAK82J,UAAY,KAKjB92J,KAAKkgK,aAAe,KAKpBlgK,KAAKugK,SAAW,KAKhBvgK,KAAKX,MAAQ,GAKbW,KAAKytH,KAAO,KAMZztH,KAAKmgK,QAAU,KAKfngK,KAAKg3J,SAAW,KAKhBh3J,KAAKogK,eAAiB,KAKtBpgK,KAAKqgK,SAAW,KAKhBrgK,KAAKsgK,iBAAmB,KAKxBtgK,KAAKmkJ,iBAAmB,KAIxBnkJ,KAAKi3J,gBAAkB,IAC1B,EAOCrxK,EAIF,SAAA8D,IAAciN,EAAA,KAAAjN,GAKVsW,KAAKpJ,EAAI,KAKToJ,KAAKjS,EAAI,KAKTiS,KAAKna,EAAI,EACZ,EAGLG,EAAYi4J,IAAM,MAClBj4J,EAAY4/J,KAAO,OACnB5/J,EAAYmlI,SAAW,MACvBnlI,EAAYolI,qBAAuB,iBACnCplI,EAAYslI,kBAAoB,wBAChCtlI,EAAYwlI,mBAAqB,eACjCxlI,EAAYqlI,mBAAqB,eACjCrlI,EAAYulI,iCAAmC,4BAC/CvlI,EAAYylI,+BAAiC,sBAC7CzlI,EAAY+6L,mBAAqB,eACjC/6L,EAAY0lI,QAAU,UACtB1lI,EAAYg+J,sBAAwB,kBACpCh+J,EAAY2lI,WAAa,uBAAAjiI,EAAAoN,GAAA,aC3FzB,SAASzJ,EAAQ3D,EAAOoN,GACtB,OAEA,SAAezJ,EAAMrH,GASnB,IARA,IAIIJ,EACA2R,EACAX,EANAc,EAAOf,EAAKtJ,EAAM,OAClBF,EAAQwJ,EAAe,MAAV3Q,EAAiB,IAAMA,EAAQ,SAC5C6H,EAAU,GACVd,GAAc,IAKTA,EAAaI,EAAMpH,QAI1B,GAHAH,EAAQuH,EAAMJ,GAAYuG,cAGrBwD,GAAoB,MAAVlR,EAAf,CAKA,IAHA2R,GAAa,EACbX,EAAO,KAEEW,EAAYG,EAAK3R,QACxB,GAAI2D,EAAMgO,EAAKH,GAAWjE,cAAe1N,GAAQ,CAE/C,IAAKkR,EAAQ,OAAOY,EAAKH,GACzB1J,EAAQ4c,KAAK/S,EAAKH,GACpB,MACEX,EAAK6T,KAAK/S,EAAKH,IAInBG,EAAOd,CAfuB,CAoBhC,OAAOE,EAASjJ,OAAA,CAClB,CACF,CAGA,SAAS8I,EAAKjN,EAAQoN,GACpB,IAAIzJ,EAAQ3D,GAA4B,iBAAXA,EAAsB,CAACA,GAAUA,EAE9D,IAAK2D,GAA0B,iBAAVA,KAAwB,WAAYA,GACvD,MAAM,IAAI6J,MACR,WAAaJ,EAAO,KAAOzJ,EAAQ,gCAIvC,OAAOA,CACT,CAxIAyJ,EAAQkqL,YAAc3zL,GAMtB,SAAe3D,EAAKoN,GAClB,MAAiB,MAAVA,GAAiBpN,IAAQoN,GAASpN,EAAIyI,QAAQ2E,EAAQ,MAAQ,CACvE,OAPAA,EAAQm1J,eAAiB5+J,GAYzB,SAAkB3D,EAAKoN,GAErB,IAAIzJ,EAAO3D,EAAIqO,MAAM,KACjBpB,EAAQG,EAAMiB,MAAM,KACpB/R,EAAY,EACZJ,EAAa,EAGjB,GAA0B,MAAtB+Q,EAAM/Q,IAAuByH,EAAKrH,KAAe2Q,EAAM/Q,GACzD,OAAO,EAOT,IAJAI,IACAJ,IAGOA,EAAa+Q,EAAM5Q,QAExB,GAA0B,MAAtB4Q,EAAM/Q,GAAV,CAMA,IAAKyH,EAAKrH,GAAY,OAAO,EAG7B,GAAIqH,EAAKrH,KAAe2Q,EAAM/Q,GAA9B,CAOA,GAA+B,IAA3ByH,EAAKrH,GAAWD,OAAc,OAAO,EAGzCC,GANA,MAHEA,IACAJ,GARF,MAFEA,IAsBJ,OAAO,CACT,OArDAkR,EAAQmqL,OAAS5zL,GA0DjB,SAAgB3D,EAAKoN,GAKnB,IAJA,IACIzJ,EADAsJ,EAAQG,IAIC,CACX,GAAc,MAAVH,GAAiBjN,IAAQiN,EAAO,OAAO,EAI3C,IAFAtJ,EAAQsJ,EAAMmB,YAAY,MAEd,EAAG,OAAO,EAEU,MAA5BnB,EAAMlK,OAAOY,EAAQ,KAAYA,GAAS,GAE9CsJ,EAAQA,EAAMyJ,MAAM,EAAG/S,EACzB,CACF,mBAAA3D,EAAAoN,EAAAzJ,GAAA,aC/EA3D,EAAOhE,QAAU2H,EAAjB,qBAAA3D,EAAAoN,EAAAzJ,GAAA,aCAA,IAAIsJ,EAAQtJ,EAAQ,MAChBrH,EAAQqH,EAAQ,MAChBzH,EAAUyH,EAAQ,MAClBkK,EAASlK,EAAQ,MACjBuJ,EAAWvJ,EAAQ,MACnBqK,EAAOrK,EAAQ,MAEnB3D,EAAOhE,QAcP,SAAmBgE,EAAOoN,GACxB,IAKIzJ,EALAQ,EAAWiJ,GAAW,CAAC,EAEvB1J,EAASuJ,EAAMgkB,MAAMzP,OAAOxhB,GAAS,IAAI4J,cAAezF,GACxD2G,EAAMmC,EAAMgqB,UAAUvzB,GACtBgL,GAAS,EAGb,IAAK5D,EACH,OAAOA,EAIT,OAAS4D,EAAQxS,EAAQG,QACnBC,EAAMimK,eAAez3J,EAAK5O,EAAQwS,GAAOkR,MAAMvjB,SACjDgI,EAAQX,EAAQxH,EAAQwS,GAAOkR,KAAM1jB,EAAQwS,GAAOklE,IACpD9oE,EAAMmC,EAAMgqB,UAAUvzB,IAO1B,IAFAgL,GAAS,IAEAA,EAAQb,EAAOxR,QAClB+H,EAAOV,EAAQmK,EAAOa,GAAOkR,KAAKo4G,MAAOnqH,EAAOa,GAAOkR,KAAK9X,QAC9DxD,EAAIZ,EAAQmK,EAAOa,GAAOklE,GAAGokD,MAAOnqH,EAAOa,GAAOklE,GAAG9rE,OAQzD,IAHAgD,EAAMmC,EAAMgqB,UAAUn6B,OAAO4/E,OAAO,CAAC,EAAGh5E,EAAQL,IAChDqL,GAAS,IAEAA,EAAQxB,EAAS7Q,QACpByO,IAAQoC,EAASwB,KACnBrK,EACEX,EACAwJ,EAASwB,GACTxB,EAASwB,GAAOL,MAAM,KAAKqI,MAAM,GAAI,GAAGnI,KAAK,MAE/CzD,EAAMmC,EAAMgqB,UAAUn6B,OAAO4/E,OAAO,CAAC,EAAGh5E,EAAQL,KASpD,GAJAK,EAAO8zL,WAAWvsJ,KAAKnnC,GAInBK,EAASszL,QACX,IAAK9zL,KAAOqK,EACNvK,EAAIvG,KAAK8Q,EAAKrK,GAAMD,EAAOC,KAC7BQ,EAASszL,QACP,cACE9zL,EACA,KACAD,EAAOC,GACP,uBACAqK,EAAKrK,GAAKD,EAAOC,IAAM4K,KAAK,QAC5B,IACF,KACA,GAmBR,OAXI7K,EAAOg0L,SACTh0L,EAAOg0L,OACLh0L,EAAOg0L,OAAO30L,OAAO,GAAGmF,cAAgBxE,EAAOg0L,OAAOhhL,MAAM,IAK5DhT,EAAO85D,SACT95D,EAAO85D,OAAS95D,EAAO85D,OAAOt1D,eAGzB+E,EAAMgqB,UAAUvzB,EACzB,EA7FA,IAAID,EAAM,CAAC,EAAExG,eAETkH,EAAW,IAAIwzL,KAAKC,SAEpBv0L,EAAmB,CACrBw0L,SAAU,GACVL,WAAY,GACZM,WAAY,GACZC,UAAW,KACXC,QAAS,MAsFX,SAAS3zL,EAAQrE,EAAQoN,EAAMzJ,GAC7B,IAGIrH,EAHAJ,EAAO+Q,EAAMgkB,MAAM7jB,GACnBS,EAAQZ,EAAMgkB,MAAMttB,GACpBuJ,EAAU,GAId,IAAK5Q,KAAOJ,EACNA,EAAKI,IAAQJ,EAAKI,GAAKD,QAAU+H,EAAOpE,EAAQ1D,EAAKJ,EAAKI,KAC5D4Q,EAAQ6T,KAAKzkB,GAKjB,IAAKA,KAAOuR,EAIRA,EAAMvR,IACNuR,EAAMvR,GAAKD,SACV6Q,EAAQzE,QAAQnM,IAAQ,IAAM0D,EAAO1D,KAAS0D,EAAO1D,GAAKD,SAE3DiI,EAAItE,EAAQ1D,EAAKuR,EAAMvR,GAG7B,CAEA,SAAS8H,EAAOpE,EAAQoN,EAAKzJ,GAC3B,IACIsJ,EACA3Q,EACAJ,EACA2R,EAJAX,GAAA,EASJ,GAAIvJ,EAAO,CAIT,GAFArH,EADA2Q,EAAUjN,EAAOoN,GAGbH,GAA8B,iBAAZA,EAIpB,IAHA3Q,EAAS,GACTJ,GAAS,IAEAA,EAAQ+Q,EAAQ5Q,QACvBwR,EAAOZ,EAAQ/Q,GAEXyH,EAAM8E,QAAQoF,GAAQ,EACxBvR,EAAOykB,KAAKlT,GAEZX,GAAA,OAGKD,IAAYtJ,IACrBrH,EAAS,KACT4Q,GAAA,GAGFlN,EAAOoN,GAAO9Q,CAChB,CAEA,OAAO4Q,CACT,CAEA,SAAS5I,EAAItE,EAAQoN,EAAKzJ,GACxB,IACIsJ,EACA3Q,EACAJ,EAHA2R,EAAU7N,EAAOoN,GAKrB,GAAIS,GAA8B,iBAAZA,EAIpB,IAHAZ,EAAO,GAAGrN,OAAO+D,GACjBrH,GAAS,IAEAA,EAAQ2Q,EAAK5Q,QACpBH,EAAO+Q,EAAK3Q,GAIRuR,EAAQpF,QAAQvM,GAAQ,GAC1B2R,EAAQkT,KAAK7kB,QAIjB8D,EAAOoN,GAAOzJ,CAElB,CAEA,SAASG,EAAiB9D,EAAMoN,GAC9B,OAAOjJ,EAAS1F,QAAQuB,EAAKi4L,UAAW7qL,EAAM6qL,UAChD,iBAAAj4L,EAAAoN,EAAAzJ,GAAA,aCnMAyJ,EAAQ6jB,MAAQttB,EAAhB,MACAyJ,EAAQ6pB,UAAYtzB,EAApB,qBAAA3D,EAAAoN,EAAAzJ,GAAA,aCDA,IAAIsJ,EAAetJ,EAAQ,MACvBrH,EAAeqH,EAAQ,MACvBzH,EAAUyH,EAAQ,KAClBkK,EAAUlK,EAAQ,KAClBuJ,EAASvJ,EAAQ,MAErB3D,EAAOhE,QAMP,SAASgE,EAAMoN,EAAKzJ,GAClB,IAKIF,EACAU,EACAd,EAPAgB,EAAWV,GAAW,CAAC,EACvBS,EA2OG,CACLqpD,SAAU,KACVyqI,wBAAyB,GACzBR,OAAQ,KACRl6H,OAAQ,KACRq6H,SAAU,GACVL,WAAY,GACZM,WAAY,GACZC,UAAW,KACXC,QAAS,MAnPP1zL,EAASkd,OAAOpU,GAChBtJ,EAAQQ,EAAOsF,cACflG,EAAQ,EAMZ,GAAW,MAAP0J,EACF,MAAM,IAAII,MAAM,yBAA2BJ,EAAM,KAKnD,GAAIY,EAAI9Q,KAAKgQ,EAAQpJ,GACnB,OAA2B,MAAtBO,EAAS8zL,WAAqB9zL,EAAS8zL,YAAcjrL,EAAOpJ,GACxD9D,EAAMkN,EAAOpJ,KAGtBM,GAAmC,IAA5ByJ,EAAQpF,QAAQ3E,GAAgB,YAAc,WAAaQ,EAE3DF,GAIT,KAAO9H,EAAawH,EAAMgc,WAAWpc,KAAWA,EAAQ,GAAGA,IAG3D,GAAIA,EAAQ,GAAoBA,EAAQ,EAAqB,CAS3D,GAFAU,EAAOqpD,SAAWnpD,EAAOoS,MAAM,EAAGhT,GAE9BA,EAAQ,EAGV,IAFAS,EAAS,EAGqB,KAA5BL,EAAMgc,WAAWpc,IACjBpH,EAAawH,EAAMgc,WAAWpc,EAAQ,KACtCpH,EAAawH,EAAMgc,WAAWpc,EAAQ,KACtCpH,EAAawH,EAAMgc,WAAWpc,EAAQ,MACrCpH,EAAawH,EAAMgc,WAAWpc,EAAQ,KACvC,CACA,GAAIS,EAAS,EACX,OAAO2G,EACLpH,EACA,EACA,kEAKJU,EAAO8zL,wBAAwBn3K,KAAKzc,EAAOoS,MAAMhT,EAAQ,EAAGA,EAAQ,IACpEA,GAAS,EACTS,GACF,CAyCF,IAnC8B,KAA5BL,EAAMgc,WAAWpc,IACjBpH,EAAawH,EAAMgc,WAAWpc,EAAQ,KACtCpH,EAAawH,EAAMgc,WAAWpc,EAAQ,KACtCpH,EAAawH,EAAMgc,WAAWpc,EAAQ,KACtCpH,EAAawH,EAAMgc,WAAWpc,EAAQ,MACrCpH,EAAawH,EAAMgc,WAAWpc,EAAQ,MAEvCU,EAAOszL,OAASpzL,EAAOoS,MAAMhT,EAAQ,EAAGA,EAAQ,GAChDA,GAAS,GAGqB,KAA5BI,EAAMgc,WAAWpc,KAIjBpH,EAAawH,EAAMgc,WAAWpc,EAAQ,KACtCpH,EAAawH,EAAMgc,WAAWpc,EAAQ,MACrCpH,EAAawH,EAAMgc,WAAWpc,EAAQ,KAEvCU,EAAOo5D,OAASl5D,EAAOoS,MAAMhT,EAAQ,EAAGA,EAAQ,GAChDA,GAAS,GAKTxH,EAAQ4H,EAAMgc,WAAWpc,EAAQ,KACjCxH,EAAQ4H,EAAMgc,WAAWpc,EAAQ,KACjCxH,EAAQ4H,EAAMgc,WAAWpc,EAAQ,MAChCxH,EAAQ4H,EAAMgc,WAAWpc,EAAQ,MAElCU,EAAOo5D,OAASl5D,EAAOoS,MAAMhT,EAAQ,EAAGA,EAAQ,GAChDA,GAAS,IAIsB,KAA5BI,EAAMgc,WAAWpc,IAAyB,CAG/C,IAFAL,EAASI,EAAQC,EAAQ,EAElBuJ,EAAanJ,EAAMgc,WAAWzc,KAAU,CAC7C,GAAIA,EAASI,EAAQ,EACnB,OAAOqH,EACLzH,EACA,EACA,mDAIJA,GACF,CAEA,KAEEA,EAASI,EAAQ,GAEhBJ,EAASI,EAAQ,GAChBvH,EAAQ4H,EAAMgc,WAAWrc,KAO3B,MALAW,EAAOyzL,SAAS92K,KAAKzc,EAAOoS,MAAMjT,EAAOJ,IACzCK,EAAQL,CAMZ,CAGA,KAAmC,KAA5BS,EAAMgc,WAAWpc,IAGY,MAAhCI,EAAMgc,WAAWpc,EAAQ,IACxBuJ,EAAanJ,EAAMgc,WAAWpc,EAAQ,KACP,KAAhCI,EAAMgc,WAAWpc,EAAQ,IACxBuJ,EAAanJ,EAAMgc,WAAWpc,EAAQ,KANM,CAc/C,IAHAL,EAASK,EAAQ,EACjBS,EAAS,EAGsB,KAA7BL,EAAMgc,WAAWzc,IACjB4J,EAAanJ,EAAMgc,WAAWzc,EAAS,KACvC4J,EAAanJ,EAAMgc,WAAWzc,EAAS,KAMvC,IAHAA,GADAI,EAAQJ,EAAS,GACA,EACjBc,IAEO8I,EAAanJ,EAAMgc,WAAWzc,KAAU,CAC7C,GAAIA,EAASI,EAAQ,EACnB,OAAOqH,EACLzH,EACA,EACA,qDAIJA,GACF,CAGF,IAAKc,EACH,OAAO2G,EACLzH,EACA,EACA,0EAIJe,EAAOozL,WAAWz2K,KAAK,CACrBk3K,UAAW3zL,EAAOvB,OAAOW,EAAQ,GACjC8zL,WAAYlzL,EAAOoS,MAAMhT,EAAQ,EAAGL,GAAQgL,MAAM,OAGpD3K,EAAQL,CACV,CACF,MAGEK,EAAQ,EAIV,GACa,IAAVA,GAA2C,MAA5BI,EAAMgc,WAAWpc,IACJ,KAA5BI,EAAMgc,WAAWpc,IACgB,MAAhCI,EAAMgc,WAAWpc,EAAQ,GAI3B,IAFAL,EAASK,EAAQA,EAAQA,EAAQ,EAAI,EAGN,KAA7BI,EAAMgc,WAAWzc,IACjB4J,EAAanJ,EAAMgc,WAAWzc,EAAS,KACvC,CAGA,IAFAA,EAASI,EAAQC,EAAQ,EAElBuJ,EAAanJ,EAAMgc,WAAWzc,KAAU,CAC7C,GAAIA,EAASI,EAAQ,EACnB,OAAOqH,EACLzH,EACA,EACA,4DAIJA,GACF,CAEAe,EAAO0zL,WAAW/2K,KAAKzc,EAAOoS,MAAMhT,EAAQ,EAAGL,IAC/CK,EAAQL,CACV,CAGF,OAAIK,IAAUY,EAAOjI,OACZyO,EAAKpH,EAAO,EAAG,uCAGjBU,EAEP,SAAS0G,EAAK9K,EAAQoN,EAAMzJ,GAE1B,OADIU,EAASozL,SAASpzL,EAASozL,QAAQ9zL,EAAQyJ,EAAMpN,GAC9CqE,EAAS+zL,UAAYh0L,EAMvB,CACLqpD,SAAU,KACVyqI,wBAAyB,GACzBR,OAAQ,KACRl6H,OAAQ,KACRq6H,SAAU,GACVL,WAAY,GACZM,WAAY,GACZC,UAAW,KACXC,QAAS,KAdX,CACF,EA7OA,IAAIhqL,EAAM,CAAC,EAAE/Q,cAAA,gBAAA+C,GAAA,aCRbA,EAAOhE,QAGP,SAAmBgE,GACjB,IAEIoN,EACAzJ,EACAsJ,EAJA3Q,EAAS0D,GAAU,CAAC,EACpB9D,EAAS,GAKb,GAAII,EAAOy7L,WAAaz7L,EAAO07L,QAC7B,OAAO17L,EAAOy7L,WAAaz7L,EAAO07L,QAGpC,GAAI17L,EAAOmxD,SAYT,IAXAvxD,EAASA,EAAO0D,OACdtD,EAAOmxD,SACPnxD,EAAO47L,yBAA2B,GAClC57L,EAAOo7L,QAAU,GACjBp7L,EAAOkhE,QAAU,GACjBlhE,EAAOu7L,UAAY,IAGrBzqL,EAAS9Q,EAAOk7L,YAAc,GAC9B7zL,GAAS,IAEAA,EAAQyJ,EAAO/Q,SACtB4Q,EAAQG,EAAOzJ,IAELs0L,WAAahrL,EAAMuqL,YAAcvqL,EAAMuqL,WAAWn7L,SAC1DH,EAASA,EAAO0D,OAAOqN,EAAMgrL,UAAWhrL,EAAMuqL,aASpD,OAJIl7L,EAAOw7L,YAAcx7L,EAAOw7L,WAAWz7L,SACzCH,EAASA,EAAO0D,OAAO,IAAKtD,EAAOw7L,aAG9B57L,EAAOqS,KAAK,IACrB,iBAAAvO,EAAAoN,EAAAzJ,GAAA,aChCA,IAAIsJ,EAAStJ,EAAQ,MACjBrH,EAAUqH,EAAQ,MAClBzH,EACiB,mBAAXqH,QAAkD,mBAAlBA,OAAYC,IAChDD,OAAYC,IAAE,8BACd,KAEN4J,EAAQirL,OAASrqL,EACjBZ,EAAQkrL,WA2TR,SAAqBt4L,GAInB,OAHKA,GAAUA,IACbA,EAAS,GAEJgO,EAAOuqL,OAAOv4L,EACvB,EA/TAoN,EAAQorL,kBAAoB,GAE5B,IAAI3qL,EAAe,WAwDnB,SAASX,EAAclN,GACrB,GAAIA,EAAS6N,EACX,MAAM,IAAI6Z,WAAW,cAAgB1nB,EAAS,kCAGhD,IAAIoN,EAAM,IAAIuJ,WAAW3W,GAEzB,OADAlD,OAAO4nI,eAAet3H,EAAKY,EAAOjR,WAC3BqQ,CACT,CAYA,SAASY,EAAQhO,EAAKoN,EAAkBzJ,GAEtC,GAAmB,iBAAR3D,EAAkB,CAC3B,GAAgC,iBAArBoN,EACT,MAAM,IAAIu7C,UACR,sEAGJ,OAAOtlD,EAAYrD,EACrB,CACA,OAAOyD,EAAKzD,EAAKoN,EAAkBzJ,EACrC,CAIA,SAASF,EAAMzD,EAAOoN,EAAkBzJ,GACtC,GAAqB,iBAAV3D,EACT,OAuHJ,SAAqBA,EAAQoN,GAK3B,GAJwB,iBAAbA,GAAsC,KAAbA,IAClCA,EAAW,SAGRY,EAAOyqL,WAAWrrL,GACrB,MAAM,IAAIu7C,UAAU,qBAAuBv7C,GAG7C,IAAIzJ,EAAwC,EAA/BG,EAAW9D,EAAQoN,GAC5BH,EAAMC,EAAavJ,GAEnBrH,EAAS2Q,EAAIyrL,MAAM14L,EAAQoN,GAS/B,OAPI9Q,IAAWqH,IAIbsJ,EAAMA,EAAIyJ,MAAM,EAAGpa,IAGd2Q,CACT,CAtBA,CAvHsBjN,EAAOoN,GAG3B,GAAI+9C,YAAYsiB,OAAOztE,GACrB,OAoJJ,SAAwBA,GACtB,GAAI8Z,EAAW9Z,EAAW2W,YAAa,CACrC,IAAIvJ,EAAO,IAAIuJ,WAAW3W,GAC1B,OAAOoE,EAAgBgJ,EAAKiU,OAAQjU,EAAKkU,WAAYlU,EAAKmU,WAC5D,CACA,OAAOld,EAAcrE,EACvB,CANA,CApJyBA,GAGvB,GAAa,MAATA,EACF,MAAM,IAAI2oD,UACR,yHACiD3oD,GAIrD,GAAI8Z,EAAW9Z,EAAOmrD,cACjBnrD,GAAS8Z,EAAW9Z,EAAMqhB,OAAQ8pC,aACrC,OAAO/mD,EAAgBpE,EAAOoN,EAAkBzJ,GAGlD,GAAiC,oBAAtBg1L,oBACN7+K,EAAW9Z,EAAO24L,oBAClB34L,GAAS8Z,EAAW9Z,EAAMqhB,OAAQs3K,oBACrC,OAAOv0L,EAAgBpE,EAAOoN,EAAkBzJ,GAGlD,GAAqB,iBAAV3D,EACT,MAAM,IAAI2oD,UACR,yEAIJ,IAAI17C,EAAUjN,EAAMnD,SAAWmD,EAAMnD,UACrC,GAAe,MAAXoQ,GAAmBA,IAAYjN,EACjC,OAAOgO,EAAO4R,KAAK3S,EAASG,EAAkBzJ,GAGhD,IAAIrH,EAoJN,SAAqB0D,GACnB,GAAIgO,EAAOwlG,SAASxzG,GAAM,CACxB,IAAIoN,EAA4B,EAAtB9I,EAAQtE,EAAI3D,QAClBsH,EAAMuJ,EAAaE,GAEvB,OAAmB,IAAfzJ,EAAItH,QAIR2D,EAAI42D,KAAKjzD,EAAK,EAAG,EAAGyJ,GAHXzJ,CAKX,CAEA,gBAAI3D,EAAI3D,OACoB,iBAAf2D,EAAI3D,QAAuB6H,EAAYlE,EAAI3D,QAC7C6Q,EAAa,GAEf7I,EAAcrE,GAGN,WAAbA,EAAI/B,MAAqBzB,MAAMC,QAAQuD,EAAIoG,MACtC/B,EAAcrE,EAAIoG,WAAA,CAE7B,CAvBA,CApJqBpG,GACnB,GAAI1D,EAAG,OAAOA,EAEd,GAAsB,oBAAXiH,QAAgD,MAAtBA,OAAOq1L,aACH,mBAA9B54L,EAAMuD,OAAOq1L,aACtB,OAAO5qL,EAAO4R,KACZ5f,EAAMuD,OAAOq1L,aAAa,UAAWxrL,EAAkBzJ,GAI3D,MAAM,IAAIglD,UACR,yHACiD3oD,EAErD,CAmBA,SAASmE,EAAYnE,GACnB,GAAoB,iBAATA,EACT,MAAM,IAAI2oD,UAAU,0CACf,GAAI3oD,EAAO,EAChB,MAAM,IAAI0nB,WAAW,cAAgB1nB,EAAO,iCAEhD,CA0BA,SAASqD,EAAarD,GAEpB,OADAmE,EAAWnE,GACJkN,EAAalN,EAAO,EAAI,EAAoB,EAAhBsE,EAAQtE,GAC7C,CAuCA,SAASqE,EAAerE,GAGtB,IAFA,IAAIoN,EAASpN,EAAM3D,OAAS,EAAI,EAA4B,EAAxBiI,EAAQtE,EAAM3D,QAC9CsH,EAAMuJ,EAAaE,GACdH,EAAI,EAAGA,EAAIG,EAAQH,GAAK,EAC/BtJ,EAAIsJ,GAAgB,IAAXjN,EAAMiN,GAEjB,OAAOtJ,CACT,CAUA,SAASS,EAAiBpE,EAAOoN,EAAYzJ,GAC3C,GAAIyJ,EAAa,GAAKpN,EAAMuhB,WAAanU,EACvC,MAAM,IAAIsa,WAAW,wCAGvB,GAAI1nB,EAAMuhB,WAAanU,GAAczJ,GAAU,GAC7C,MAAM,IAAI+jB,WAAW,wCAGvB,IAAIza,EAYJ,OAVEA,OAAA,IADEG,QAAA,IAA4BzJ,EACxB,IAAIgT,WAAW3W,QAAA,IACZ2D,EACH,IAAIgT,WAAW3W,EAAOoN,GAEtB,IAAIuJ,WAAW3W,EAAOoN,EAAYzJ,GAI1C7G,OAAO4nI,eAAez3H,EAAKe,EAAOjR,WAE3BkQ,CACT,CA2BA,SAAS3I,EAAStE,GAGhB,GAAIA,GAAU6N,EACZ,MAAM,IAAI6Z,WAAW,0DACa7Z,EAAa7Q,SAAS,IAAM,UAEhE,OAAgB,EAATgD,CACT,CAqGA,SAAS8D,EAAY9D,EAAQoN,GAC3B,GAAIY,EAAOwlG,SAASxzG,GAClB,OAAOA,EAAO3D,OAEhB,GAAI8uD,YAAYsiB,OAAOztE,IAAW8Z,EAAW9Z,EAAQmrD,aACnD,OAAOnrD,EAAOuhB,WAEhB,GAAsB,iBAAXvhB,EACT,MAAM,IAAI2oD,UACR,kGAC0B3oD,GAI9B,IAAI2D,EAAM3D,EAAO3D,OACb4Q,EAAa3O,UAAUjC,OAAS,IAAK,IAAAiC,UAAU,GACnD,IAAK2O,GAAqB,IAARtJ,EAAW,OAAO,EAIpC,IADA,IAAIrH,GAAA,IAEF,OAAQ8Q,GACN,IAAK,QACL,IAAK,SACL,IAAK,SACH,OAAOzJ,EACT,IAAK,OACL,IAAK,QACH,OAAOwV,EAAYnZ,GAAQ3D,OAC7B,IAAK,OACL,IAAK,QACL,IAAK,UACL,IAAK,WACH,OAAa,EAANsH,EACT,IAAK,MACH,OAAOA,IAAQ,EACjB,IAAK,SACH,OAAO6sB,EAAcxwB,GAAQ3D,OAC/B,QACE,GAAIC,EACF,OAAO2Q,GAAa,EAAIkM,EAAYnZ,GAAQ3D,OAE9C+Q,GAAY,GAAKA,GAAUxD,cAC3BtN,GAAA,EAGR,CAGA,SAASoH,EAAc1D,EAAUoN,EAAOzJ,GACtC,IAAIsJ,GAAA,EAcJ,aALIG,GAAuBA,EAAQ,KACjCA,EAAQ,GAINA,EAAQkJ,KAAKja,OACf,MAAO,GAOT,aAJIsH,GAAqBA,EAAM2S,KAAKja,UAClCsH,EAAM2S,KAAKja,QAGTsH,GAAO,EACT,MAAO,GAOT,IAHAA,KAAS,KACTyJ,KAAW,GAGT,MAAO,GAKT,IAFKpN,IAAUA,EAAW,UAGxB,OAAQA,GACN,IAAK,MACH,OAAOiW,EAASK,KAAMlJ,EAAOzJ,GAE/B,IAAK,OACL,IAAK,QACH,OAAO+R,EAAUY,KAAMlJ,EAAOzJ,GAEhC,IAAK,QACH,OAAOuV,EAAW5C,KAAMlJ,EAAOzJ,GAEjC,IAAK,SACL,IAAK,SACH,OAAOwS,EAAYG,KAAMlJ,EAAOzJ,GAElC,IAAK,SACH,OAAOoS,EAAYO,KAAMlJ,EAAOzJ,GAElC,IAAK,OACL,IAAK,QACL,IAAK,UACL,IAAK,WACH,OAAOsV,EAAa3C,KAAMlJ,EAAOzJ,GAEnC,QACE,GAAIsJ,EAAa,MAAM,IAAI07C,UAAU,qBAAuB3oD,GAC5DA,GAAYA,EAAW,IAAI4J,cAC3BqD,GAAA,EAGR,CAUA,SAASnC,EAAM9K,EAAGoN,EAAGzJ,GACnB,IAAIsJ,EAAIjN,EAAEoN,GACVpN,EAAEoN,GAAKpN,EAAE2D,GACT3D,EAAE2D,GAAKsJ,CACT,CA2IA,SAASyB,EAAsB1O,EAAQoN,EAAKzJ,EAAYsJ,EAAU3Q,GAEhE,GAAsB,IAAlB0D,EAAO3D,OAAc,OAAQ,EAmBjC,GAhB0B,iBAAfsH,GACTsJ,EAAWtJ,EACXA,EAAa,GACJA,EAAa,WACtBA,EAAa,WACJA,GAAc,aACvBA,GAAc,YAGZO,EADJP,GAAcA,KAGZA,EAAarH,EAAM,EAAK0D,EAAO3D,OAAS,GAItCsH,EAAa,IAAGA,EAAa3D,EAAO3D,OAASsH,GAC7CA,GAAc3D,EAAO3D,OAAQ,CAC/B,GAAIC,EAAK,OAAQ,EACZqH,EAAa3D,EAAO3D,OAAS,CACpC,MAAO,GAAIsH,EAAa,EAAG,CACzB,IAAIrH,EACC,OAAQ,EADJqH,EAAa,CAExB,CAQA,GALmB,iBAARyJ,IACTA,EAAMY,EAAO4R,KAAKxS,EAAKH,IAIrBe,EAAOwlG,SAASpmG,GAElB,OAAmB,IAAfA,EAAI/Q,QACE,EAEHgpB,EAAarlB,EAAQoN,EAAKzJ,EAAYsJ,EAAU3Q,GAClD,GAAmB,iBAAR8Q,EAEhB,OADAA,GAAY,IACgC,mBAAjCuJ,WAAW5Z,UAAU0L,QAC1BnM,EACKqa,WAAW5Z,UAAU0L,QAAQvL,KAAK8C,EAAQoN,EAAKzJ,GAE/CgT,WAAW5Z,UAAUqR,YAAYlR,KAAK8C,EAAQoN,EAAKzJ,GAGvD0hB,EAAarlB,EAAQ,CAACoN,GAAMzJ,EAAYsJ,EAAU3Q,GAG3D,MAAM,IAAIqsD,UAAU,uCACtB,CAEA,SAAStjC,EAAcrlB,EAAKoN,EAAKzJ,EAAYsJ,EAAU3Q,GACrD,IA0BIJ,EA1BA2R,EAAY,EACZX,EAAYlN,EAAI3D,OAChB2R,EAAYZ,EAAI/Q,OAEpB,QAAI,IAAA4Q,IAEe,UADjBA,EAAWuU,OAAOvU,GAAUrD,gBACY,UAAbqD,GACV,YAAbA,GAAuC,aAAbA,GAAyB,CACrD,GAAIjN,EAAI3D,OAAS,GAAK+Q,EAAI/Q,OAAS,EACjC,OAAQ,EAEVwR,EAAY,EACZX,GAAa,EACbc,GAAa,EACbrK,GAAc,CAChB,CAGF,SAASF,EAAMzD,EAAKoN,GAClB,OAAkB,IAAdS,EACK7N,EAAIoN,GAEJpN,EAAI64L,aAAazrL,EAAIS,EAEhC,CAGA,GAAIvR,EAAK,CACP,IAAI6H,GAAc,EAClB,IAAKjI,EAAIyH,EAAYzH,EAAIgR,EAAWhR,IAClC,GAAIuH,EAAKzD,EAAK9D,KAAOuH,EAAK2J,GAAqB,IAAhBjJ,EAAoB,EAAIjI,EAAIiI,IAEzD,IADoB,IAAhBA,IAAmBA,EAAajI,GAChCA,EAAIiI,EAAa,IAAM6J,EAAW,OAAO7J,EAAa0J,OAEtC,IAAhB1J,IAAmBjI,GAAKA,EAAIiI,GAChCA,GAAc,CAGpB,MAEE,IADIR,EAAaqK,EAAYd,IAAWvJ,EAAauJ,EAAYc,GAC5D9R,EAAIyH,EAAYzH,GAAK,EAAGA,IAAK,CAEhC,IADA,IAAImH,GAAA,EACKgB,EAAI,EAAGA,EAAI2J,EAAW3J,IAC7B,GAAIZ,EAAKzD,EAAK9D,EAAImI,KAAOZ,EAAK2J,EAAK/I,GAAI,CACrChB,GAAA,EACA,KACF,CAEF,GAAIA,EAAO,OAAOnH,CACpB,CAGF,OAAQ,CACV,CAcA,SAASka,EAAUpW,EAAKoN,EAAQzJ,EAAQsJ,GACtCtJ,EAAS6K,OAAO7K,IAAW,EAC3B,IAAIrH,EAAY0D,EAAI3D,OAASsH,EACxBsJ,GAGHA,EAASuB,OAAOvB,IACH3Q,IACX2Q,EAAS3Q,GAJX2Q,EAAS3Q,EAQX,IAAIJ,EAASkR,EAAO/Q,OAEhB4Q,EAAS/Q,EAAS,IACpB+Q,EAAS/Q,EAAS,GAEpB,IAAK,IAAI2R,EAAI,EAAGA,EAAIZ,IAAUY,EAAG,CAC/B,IAAIX,EAASsJ,SAASpJ,EAAOgjH,OAAW,EAAJviH,EAAO,GAAI,IAC/C,GAAI3J,EAAYgJ,GAAS,OAAOW,EAChC7N,EAAI2D,EAASkK,GAAKX,CACpB,CACA,OAAOW,CACT,CAEA,SAASiB,EAAW9O,EAAKoN,EAAQzJ,EAAQsJ,GACvC,OAAOmM,EAAWD,EAAY/L,EAAQpN,EAAI3D,OAASsH,GAAS3D,EAAK2D,EAAQsJ,EAC3E,CAEA,SAAS+B,EAAYhP,EAAKoN,EAAQzJ,EAAQsJ,GACxC,OAAOmM,EAk4BT,SAAuBpZ,GAErB,IADA,IAAIoN,EAAY,GACPzJ,EAAI,EAAGA,EAAI3D,EAAI3D,SAAUsH,EAEhCyJ,EAAU2T,KAAyB,IAApB/gB,EAAI8f,WAAWnc,IAEhC,OAAOyJ,CACT,CAPA,CAl4BiCA,GAASpN,EAAK2D,EAAQsJ,EACvD,CAEA,SAAS9Q,EAAa6D,EAAKoN,EAAQzJ,EAAQsJ,GACzC,OAAOmM,EAAWoX,EAAcpjB,GAASpN,EAAK2D,EAAQsJ,EACxD,CAEA,SAAS8F,EAAW/S,EAAKoN,EAAQzJ,EAAQsJ,GACvC,OAAOmM,EAm4BT,SAAyBpZ,EAAKoN,GAG5B,IAFA,IAAIzJ,EAAGsJ,EAAI3Q,EACPJ,EAAY,GACP2R,EAAI,EAAGA,EAAI7N,EAAI3D,WACjB+Q,GAAS,GAAK,KADaS,EAIhCZ,GADAtJ,EAAI3D,EAAI8f,WAAWjS,KACT,EACVvR,EAAKqH,EAAI,IACTzH,EAAU6kB,KAAKzkB,GACfJ,EAAU6kB,KAAK9T,GAGjB,OAAO/Q,CACT,CAdA,CAn4BmCkR,EAAQpN,EAAI3D,OAASsH,GAAS3D,EAAK2D,EAAQsJ,EAC9E,CA8EA,SAAS8I,EAAa/V,EAAKoN,EAAOzJ,GAChC,OAAc,IAAVyJ,GAAezJ,IAAQ3D,EAAI3D,OACtB4Q,EAAO6rL,cAAc94L,GAErBiN,EAAO6rL,cAAc94L,EAAI0W,MAAMtJ,EAAOzJ,GAEjD,CAEA,SAAS+R,EAAW1V,EAAKoN,EAAOzJ,GAC9BA,EAAMiL,KAAK+M,IAAI3b,EAAI3D,OAAQsH,GAI3B,IAHA,IAAIsJ,EAAM,GAEN3Q,EAAI8Q,EACD9Q,EAAIqH,GAAK,CACd,IAWMzH,EAAY2R,EAAWX,EAAYc,EAXrCvK,EAAYzD,EAAI1D,GAChB6H,EAAY,KACZd,EAAoBI,EAAY,IAChC,EACCA,EAAY,IACT,EACCA,EAAY,IACT,EACA,EAEZ,GAAInH,EAAI+G,GAAoBM,EAG1B,OAAQN,GACN,KAAK,EACCI,EAAY,MACdU,EAAYV,GAEd,MACF,KAAK,EAEyB,MAAV,KADlBvH,EAAa8D,EAAI1D,EAAI,OAEnB0R,GAA6B,GAAZvK,IAAqB,EAAoB,GAAbvH,GACzB,MAClBiI,EAAY6J,GAGhB,MACF,KAAK,EACH9R,EAAa8D,EAAI1D,EAAI,GACrBuR,EAAY7N,EAAI1D,EAAI,GACQ,MAAV,IAAbJ,IAAsD,MAAV,IAAZ2R,KACnCG,GAA6B,GAAZvK,IAAoB,IAAoB,GAAbvH,IAAsB,EAAmB,GAAZ2R,GACrD,OAAUG,EAAgB,OAAUA,EAAgB,SACtE7J,EAAY6J,GAGhB,MACF,KAAK,EACH9R,EAAa8D,EAAI1D,EAAI,GACrBuR,EAAY7N,EAAI1D,EAAI,GACpB4Q,EAAalN,EAAI1D,EAAI,GACO,MAAV,IAAbJ,IAAsD,MAAV,IAAZ2R,IAAsD,MAAV,IAAbX,KAClEc,GAA6B,GAAZvK,IAAoB,IAAqB,GAAbvH,IAAsB,IAAmB,GAAZ2R,IAAqB,EAAoB,GAAbX,GAClF,OAAUc,EAAgB,UAC5C7J,EAAY6J,GAMJ,OAAd7J,GAGFA,EAAY,MACZd,EAAmB,GACVc,EAAY,QAErBA,GAAa,MACb8I,EAAI8T,KAAK5c,IAAc,GAAK,KAAQ,OACpCA,EAAY,MAAqB,KAAZA,GAGvB8I,EAAI8T,KAAK5c,GACT7H,GAAK+G,CACP,CAEA,OAQF,SAAgCrD,GAC9B,IAAIoN,EAAMpN,EAAW3D,OACrB,GAAI+Q,GAAO8I,EACT,OAAOsL,OAAOC,aAAaC,MAAMF,OAAQxhB,GAM3C,IAFA,IAAI2D,EAAM,GACNsJ,EAAI,EACDA,EAAIG,GACTzJ,GAAO6d,OAAOC,aAAaC,MACzBF,OACAxhB,EAAW0W,MAAMzJ,EAAGA,GAAKiJ,IAG7B,OAAOvS,CACT,CAhBA,CAR+BsJ,EAC/B,CA3+BAG,EAAQ2rL,WAAalrL,EAgBrBG,EAAOgrL,oBAUP,WAEE,IACE,IAAIh5L,EAAM,IAAI2W,WAAW,GACrBvJ,EAAQ,CAAE6rL,IAAK,WAAc,OAAO,EAAG,GAG3C,OAFAn8L,OAAO4nI,eAAet3H,EAAOuJ,WAAW5Z,WACxCD,OAAO4nI,eAAe1kI,EAAKoN,GACN,KAAdpN,EAAIi5L,KAGb,CAFE,MAAOj5L,GACP,OAAO,CACT,CACF,CAXA,GARKgO,EAAOgrL,qBAA0C,oBAAZxsL,SACb,mBAAlBA,QAAQhB,OACjBgB,QAAQhB,MACN,iJAkBJ1O,OAAOmC,eAAe+O,EAAOjR,UAAW,SAAU,CAChDq/D,YAAA,EACAhlD,IAAK,WACH,GAAKpJ,EAAOwlG,SAASl9F,MACrB,OAAOA,KAAK+K,MACd,IAGFvkB,OAAOmC,eAAe+O,EAAOjR,UAAW,SAAU,CAChDq/D,YAAA,EACAhlD,IAAK,WACH,GAAKpJ,EAAOwlG,SAASl9F,MACrB,OAAOA,KAAKgL,UACd,IAoCFtT,EAAOkrL,SAAW,KAgElBlrL,EAAO4R,KAAO,SAAU5f,EAAOoN,EAAkBzJ,GAC/C,OAAOF,EAAKzD,EAAOoN,EAAkBzJ,EACvC,EAIA7G,OAAO4nI,eAAe12H,EAAOjR,UAAW4Z,WAAW5Z,WACnDD,OAAO4nI,eAAe12H,EAAQ2I,YA8B9B3I,EAAOuqL,MAAQ,SAAUv4L,EAAMoN,EAAMzJ,GACnC,OArBF,SAAgB3D,EAAMoN,EAAMzJ,GAE1B,OADAQ,EAAWnE,GACPA,GAAQ,EACHkN,EAAalN,QAAA,IAElBoN,EAIyB,iBAAbzJ,EACVuJ,EAAalN,GAAMm5L,KAAK/rL,EAAMzJ,GAC9BuJ,EAAalN,GAAMm5L,KAAK/rL,GAEvBF,EAAalN,EACtB,CAdA,CAqBeA,EAAMoN,EAAMzJ,EAC3B,EAUAqK,EAAOorL,YAAc,SAAUp5L,GAC7B,OAAOqD,EAAYrD,EACrB,EAIAgO,EAAOqrL,gBAAkB,SAAUr5L,GACjC,OAAOqD,EAAYrD,EACrB,EA6GAgO,EAAOwlG,SAAW,SAAmBxzG,GACnC,OAAY,MAALA,IAAA,IAAaA,EAAEs5L,WACpBt5L,IAAMgO,EAAOjR,SACjB,EAEAiR,EAAOvP,QAAU,SAAkBuB,EAAGoN,GAGpC,GAFI0M,EAAW9Z,EAAG2W,cAAa3W,EAAIgO,EAAO4R,KAAK5f,EAAGA,EAAE0mB,OAAQ1mB,EAAEuhB,aAC1DzH,EAAW1M,EAAGuJ,cAAavJ,EAAIY,EAAO4R,KAAKxS,EAAGA,EAAEsZ,OAAQtZ,EAAEmU,cACzDvT,EAAOwlG,SAASxzG,KAAOgO,EAAOwlG,SAASpmG,GAC1C,MAAM,IAAIu7C,UACR,yEAIJ,GAAI3oD,IAAMoN,EAAG,OAAO,EAKpB,IAHA,IAAIzJ,EAAI3D,EAAE3D,OACN4Q,EAAIG,EAAE/Q,OAEDC,EAAI,EAAGJ,EAAM0S,KAAK+M,IAAIhY,EAAGsJ,GAAI3Q,EAAIJ,IAAOI,EAC/C,GAAI0D,EAAE1D,KAAO8Q,EAAE9Q,GAAI,CACjBqH,EAAI3D,EAAE1D,GACN2Q,EAAIG,EAAE9Q,GACN,KACF,CAGF,OAAIqH,EAAIsJ,GAAW,EACfA,EAAItJ,EAAU,EACX,CACT,EAEAqK,EAAOyqL,WAAa,SAAqBz4L,GACvC,OAAQwhB,OAAOxhB,GAAU4J,eACvB,IAAK,MACL,IAAK,OACL,IAAK,QACL,IAAK,QACL,IAAK,SACL,IAAK,SACL,IAAK,SACL,IAAK,OACL,IAAK,QACL,IAAK,UACL,IAAK,WACH,OAAO,EACT,QACE,OAAO,EAEb,EAEAoE,EAAOpO,OAAS,SAAiBI,EAAMoN,GACrC,IAAK5Q,MAAMC,QAAQuD,GACjB,MAAM,IAAI2oD,UAAU,+CAGtB,GAAoB,IAAhB3oD,EAAK3D,OACP,OAAO2R,EAAOuqL,MAAM,GAGtB,IAAI50L,EACJ,QAAI,IAAAyJ,EAEF,IADAA,EAAS,EACJzJ,EAAI,EAAGA,EAAI3D,EAAK3D,SAAUsH,EAC7ByJ,GAAUpN,EAAK2D,GAAGtH,OAItB,IAAI4Q,EAASe,EAAOorL,YAAYhsL,GAC5B9Q,EAAM,EACV,IAAKqH,EAAI,EAAGA,EAAI3D,EAAK3D,SAAUsH,EAAG,CAChC,IAAIzH,EAAM8D,EAAK2D,GACf,GAAImW,EAAW5d,EAAKya,YACdra,EAAMJ,EAAIG,OAAS4Q,EAAO5Q,OAC5B2R,EAAO4R,KAAK1jB,GAAK06D,KAAK3pD,EAAQ3Q,GAE9Bqa,WAAW5Z,UAAU8c,IAAI3c,KACvB+P,EACA/Q,EACAI,OAGC,KAAK0R,EAAOwlG,SAASt3G,GAC1B,MAAM,IAAIysD,UAAU,+CAEpBzsD,EAAI06D,KAAK3pD,EAAQ3Q,EACnB,CACAA,GAAOJ,EAAIG,MACb,CACA,OAAO4Q,CACT,EAiDAe,EAAOuT,WAAazd,EA8EpBkK,EAAOjR,UAAUu8L,WAAA,EAQjBtrL,EAAOjR,UAAUw8L,OAAS,WACxB,IAAIv5L,EAAMsW,KAAKja,OACf,GAAI2D,EAAM,GAAM,EACd,MAAM,IAAI0nB,WAAW,6CAEvB,IAAK,IAAIta,EAAI,EAAGA,EAAIpN,EAAKoN,GAAK,EAC5BtC,EAAKwL,KAAMlJ,EAAGA,EAAI,GAEpB,OAAOkJ,IACT,EAEAtI,EAAOjR,UAAUy8L,OAAS,WACxB,IAAIx5L,EAAMsW,KAAKja,OACf,GAAI2D,EAAM,GAAM,EACd,MAAM,IAAI0nB,WAAW,6CAEvB,IAAK,IAAIta,EAAI,EAAGA,EAAIpN,EAAKoN,GAAK,EAC5BtC,EAAKwL,KAAMlJ,EAAGA,EAAI,GAClBtC,EAAKwL,KAAMlJ,EAAI,EAAGA,EAAI,GAExB,OAAOkJ,IACT,EAEAtI,EAAOjR,UAAU08L,OAAS,WACxB,IAAIz5L,EAAMsW,KAAKja,OACf,GAAI2D,EAAM,GAAM,EACd,MAAM,IAAI0nB,WAAW,6CAEvB,IAAK,IAAIta,EAAI,EAAGA,EAAIpN,EAAKoN,GAAK,EAC5BtC,EAAKwL,KAAMlJ,EAAGA,EAAI,GAClBtC,EAAKwL,KAAMlJ,EAAI,EAAGA,EAAI,GACtBtC,EAAKwL,KAAMlJ,EAAI,EAAGA,EAAI,GACtBtC,EAAKwL,KAAMlJ,EAAI,EAAGA,EAAI,GAExB,OAAOkJ,IACT,EAEAtI,EAAOjR,UAAUC,SAAW,WAC1B,IAAIgD,EAASsW,KAAKja,OAClB,OAAe,IAAX2D,EAAqB,GACA,IAArB1B,UAAUjC,OAAqBqZ,EAAUY,KAAM,EAAGtW,GAC/C0D,EAAage,MAAMpL,KAAMhY,UAClC,EAEA0P,EAAOjR,UAAU28L,eAAiB1rL,EAAOjR,UAAUC,SAEnDgR,EAAOjR,UAAU45D,OAAS,SAAiB32D,GACzC,IAAKgO,EAAOwlG,SAASxzG,GAAI,MAAM,IAAI2oD,UAAU,6BAC7C,OAAIryC,OAAStW,GACsB,IAA5BgO,EAAOvP,QAAQ6X,KAAMtW,EAC9B,EAEAgO,EAAOjR,UAAU48L,QAAU,WACzB,IAAI35L,EAAM,GACN2D,EAAMyJ,EAAQorL,kBAGlB,OAFAx4L,EAAMsW,KAAKtZ,SAAS,MAAO,EAAG2G,GAAKnB,QAAQ,UAAW,OAAO6K,OACzDiJ,KAAKja,OAASsH,IAAK3D,GAAO,SACvB,WAAaA,EAAM,GAC5B,EACI9D,IACF8R,EAAOjR,UAAUb,GAAuB8R,EAAOjR,UAAU48L,SAG3D3rL,EAAOjR,UAAU0B,QAAU,SAAkBuB,EAAQoN,EAAOzJ,EAAKsJ,EAAW3Q,GAI1E,GAHIwd,EAAW9Z,EAAQ2W,cACrB3W,EAASgO,EAAO4R,KAAK5f,EAAQA,EAAO0mB,OAAQ1mB,EAAOuhB,cAEhDvT,EAAOwlG,SAASxzG,GACnB,MAAM,IAAI2oD,UACR,wFAC2B3oD,GAiB/B,QAAI,IAbAoN,IACFA,EAAQ,YAENzJ,IACFA,EAAM3D,EAASA,EAAO3D,OAAS,YAE7B4Q,IACFA,EAAY,YAEV3Q,IACFA,EAAUga,KAAKja,QAGb+Q,EAAQ,GAAKzJ,EAAM3D,EAAO3D,QAAU4Q,EAAY,GAAK3Q,EAAUga,KAAKja,OACtE,MAAM,IAAIqrB,WAAW,sBAGvB,GAAIza,GAAa3Q,GAAW8Q,GAASzJ,EACnC,OAAO,EAET,GAAIsJ,GAAa3Q,EACf,OAAQ,EAEV,GAAI8Q,GAASzJ,EACX,OAAO,EAQT,GAAI2S,OAAStW,EAAQ,OAAO,EAS5B,IAPA,IAAI9D,GAJJI,KAAa,IADb2Q,KAAe,GAMXY,GAPJlK,KAAS,IADTyJ,KAAW,GASPF,EAAM0B,KAAK+M,IAAIzf,EAAG2R,GAElBpK,EAAW6S,KAAKI,MAAMzJ,EAAW3Q,GACjC6H,EAAanE,EAAO0W,MAAMtJ,EAAOzJ,GAE5BN,EAAI,EAAGA,EAAI6J,IAAO7J,EACzB,GAAII,EAASJ,KAAOc,EAAWd,GAAI,CACjCnH,EAAIuH,EAASJ,GACbwK,EAAI1J,EAAWd,GACf,KACF,CAGF,OAAInH,EAAI2R,GAAW,EACfA,EAAI3R,EAAU,EACX,CACT,EA2HA8R,EAAOjR,UAAUsmB,SAAW,SAAmBrjB,EAAKoN,EAAYzJ,GAC9D,OAAoD,IAA7C2S,KAAK7N,QAAQzI,EAAKoN,EAAYzJ,EACvC,EAEAqK,EAAOjR,UAAU0L,QAAU,SAAkBzI,EAAKoN,EAAYzJ,GAC5D,OAAO+K,EAAqB4H,KAAMtW,EAAKoN,EAAYzJ,GAAA,EACrD,EAEAqK,EAAOjR,UAAUqR,YAAc,SAAsBpO,EAAKoN,EAAYzJ,GACpE,OAAO+K,EAAqB4H,KAAMtW,EAAKoN,EAAYzJ,GAAA,EACrD,EA2CAqK,EAAOjR,UAAU27L,MAAQ,SAAgB14L,EAAQoN,EAAQzJ,EAAQsJ,GAE/D,QAAI,IAAAG,EACFH,EAAW,OACXtJ,EAAS2S,KAAKja,OACd+Q,EAAS,OAEJ,QAAI,IAAAzJ,GAA0C,iBAAXyJ,EACxCH,EAAWG,EACXzJ,EAAS2S,KAAKja,OACd+Q,EAAS,MAEJ,KAAIqB,SAASrB,GAUlB,MAAM,IAAII,MACR,2EAVFJ,KAAoB,EAChBqB,SAAS9K,IACXA,KAAoB,WAChBsJ,IAAwBA,EAAW,UAEvCA,EAAWtJ,EACXA,OAAA,EAMJ,CAEA,IAAIrH,EAAYga,KAAKja,OAAS+Q,EAG9B,SAAK,IAFDzJ,GAAwBA,EAASrH,KAAWqH,EAASrH,GAEpD0D,EAAO3D,OAAS,IAAMsH,EAAS,GAAKyJ,EAAS,IAAOA,EAASkJ,KAAKja,OACrE,MAAM,IAAIqrB,WAAW,0CAGlBza,IAAUA,EAAW,QAG1B,IADA,IAAI/Q,GAAA,IAEF,OAAQ+Q,GACN,IAAK,MACH,OAAOmJ,EAASE,KAAMtW,EAAQoN,EAAQzJ,GAExC,IAAK,OACL,IAAK,QACH,OAAOmL,EAAUwH,KAAMtW,EAAQoN,EAAQzJ,GAEzC,IAAK,QACL,IAAK,SACL,IAAK,SACH,OAAOqL,EAAWsH,KAAMtW,EAAQoN,EAAQzJ,GAE1C,IAAK,SAEH,OAAOxH,EAAYma,KAAMtW,EAAQoN,EAAQzJ,GAE3C,IAAK,OACL,IAAK,QACL,IAAK,UACL,IAAK,WACH,OAAOoP,EAAUuD,KAAMtW,EAAQoN,EAAQzJ,GAEzC,QACE,GAAIzH,EAAa,MAAM,IAAIysD,UAAU,qBAAuB17C,GAC5DA,GAAY,GAAKA,GAAUrD,cAC3B1N,GAAA,EAGR,EAEA8R,EAAOjR,UAAU++E,OAAS,WACxB,MAAO,CACL79E,KAAM,SACNmI,KAAM5J,MAAMO,UAAU2Z,MAAMxZ,KAAKoZ,KAAKsjL,MAAQtjL,KAAM,GAExD,EAyFA,IAAIJ,EAAuB,KAoB3B,SAASgD,EAAYlZ,EAAKoN,EAAOzJ,GAC/B,IAAIsJ,EAAM,GACVtJ,EAAMiL,KAAK+M,IAAI3b,EAAI3D,OAAQsH,GAE3B,IAAK,IAAIrH,EAAI8Q,EAAO9Q,EAAIqH,IAAOrH,EAC7B2Q,GAAOuU,OAAOC,aAAsB,IAATzhB,EAAI1D,IAEjC,OAAO2Q,CACT,CAEA,SAASkJ,EAAanW,EAAKoN,EAAOzJ,GAChC,IAAIsJ,EAAM,GACVtJ,EAAMiL,KAAK+M,IAAI3b,EAAI3D,OAAQsH,GAE3B,IAAK,IAAIrH,EAAI8Q,EAAO9Q,EAAIqH,IAAOrH,EAC7B2Q,GAAOuU,OAAOC,aAAazhB,EAAI1D,IAEjC,OAAO2Q,CACT,CAEA,SAASgJ,EAAUjW,EAAKoN,EAAOzJ,GAC7B,IAAIsJ,EAAMjN,EAAI3D,SAET+Q,GAASA,EAAQ,KAAGA,EAAQ,KAC5BzJ,GAAOA,EAAM,GAAKA,EAAMsJ,KAAKtJ,EAAMsJ,GAGxC,IADA,IAAI3Q,EAAM,GACDJ,EAAIkR,EAAOlR,EAAIyH,IAAOzH,EAC7BI,GAAOmrB,EAAoBznB,EAAI9D,IAEjC,OAAOI,CACT,CAEA,SAAS2c,EAAcjZ,EAAKoN,EAAOzJ,GAIjC,IAHA,IAAIsJ,EAAQjN,EAAI0W,MAAMtJ,EAAOzJ,GACzBrH,EAAM,GAEDJ,EAAI,EAAGA,EAAI+Q,EAAM5Q,OAAS,EAAGH,GAAK,EACzCI,GAAOklB,OAAOC,aAAaxU,EAAM/Q,GAAqB,IAAf+Q,EAAM/Q,EAAI,IAEnD,OAAOI,CACT,CAiCA,SAAS+b,EAAarY,EAAQoN,EAAKzJ,GACjC,GAAK3D,EAAS,GAAO,GAAKA,EAAS,EAAG,MAAM,IAAI0nB,WAAW,sBAC3D,GAAI1nB,EAASoN,EAAMzJ,EAAQ,MAAM,IAAI+jB,WAAW,wCAClD,CAmLA,SAASpQ,EAAUtX,EAAKoN,EAAOzJ,EAAQsJ,EAAK3Q,EAAKJ,GAC/C,IAAK8R,EAAOwlG,SAASxzG,GAAM,MAAM,IAAI2oD,UAAU,+CAC/C,GAAIv7C,EAAQ9Q,GAAO8Q,EAAQlR,EAAK,MAAM,IAAIwrB,WAAW,qCACrD,GAAI/jB,EAASsJ,EAAMjN,EAAI3D,OAAQ,MAAM,IAAIqrB,WAAW,qBACtD,CA+LA,SAASjV,EAAczS,EAAKoN,EAAOzJ,EAAQsJ,EAAK3Q,EAAKJ,GACnD,GAAIyH,EAASsJ,EAAMjN,EAAI3D,OAAQ,MAAM,IAAIqrB,WAAW,sBACpD,GAAI/jB,EAAS,EAAG,MAAM,IAAI+jB,WAAW,qBACvC,CAEA,SAASnQ,EAAYvX,EAAKoN,EAAOzJ,EAAQsJ,EAAc/Q,GAOrD,OANAkR,GAASA,EACTzJ,KAAoB,EACfzH,GACHuW,EAAazS,EAAK,EAAO2D,EAAQ,GAEnCrH,EAAQo8L,MAAM14L,EAAKoN,EAAOzJ,EAAQsJ,EAAc,GAAI,GAC7CtJ,EAAS,CAClB,CAUA,SAASkH,EAAa7K,EAAKoN,EAAOzJ,EAAQsJ,EAAc/Q,GAOtD,OANAkR,GAASA,EACTzJ,KAAoB,EACfzH,GACHuW,EAAazS,EAAK,EAAO2D,EAAQ,GAEnCrH,EAAQo8L,MAAM14L,EAAKoN,EAAOzJ,EAAQsJ,EAAc,GAAI,GAC7CtJ,EAAS,CAClB,CAvbAqK,EAAOjR,UAAU2Z,MAAQ,SAAgB1W,EAAOoN,GAC9C,IAAIzJ,EAAM2S,KAAKja,QACf2D,IAAUA,GAGE,GACVA,GAAS2D,GACG,IAAG3D,EAAQ,GACdA,EAAQ2D,IACjB3D,EAAQ2D,IANVyJ,OAAA,IAAMA,EAAoBzJ,IAAQyJ,GASxB,GACRA,GAAOzJ,GACG,IAAGyJ,EAAM,GACVA,EAAMzJ,IACfyJ,EAAMzJ,GAGJyJ,EAAMpN,IAAOoN,EAAMpN,GAEvB,IAAIiN,EAASqJ,KAAK2L,SAASjiB,EAAOoN,GAIlC,OAFAtQ,OAAO4nI,eAAez3H,EAAQe,EAAOjR,WAE9BkQ,CACT,EAUAe,EAAOjR,UAAU88L,WACjB7rL,EAAOjR,UAAU+8L,WAAa,SAAqB95L,EAAQoN,EAAYzJ,GACrE3D,KAAoB,EACpBoN,KAA4B,EACvBzJ,GAAU0U,EAAYrY,EAAQoN,EAAYkJ,KAAKja,QAKpD,IAHA,IAAI4Q,EAAMqJ,KAAKtW,GACX1D,EAAM,EACNJ,EAAI,IACCA,EAAIkR,IAAe9Q,GAAO,MACjC2Q,GAAOqJ,KAAKtW,EAAS9D,GAAKI,EAG5B,OAAO2Q,CACT,EAEAe,EAAOjR,UAAUg9L,WACjB/rL,EAAOjR,UAAUi9L,WAAa,SAAqBh6L,EAAQoN,EAAYzJ,GACrE3D,KAAoB,EACpBoN,KAA4B,EACvBzJ,GACH0U,EAAYrY,EAAQoN,EAAYkJ,KAAKja,QAKvC,IAFA,IAAI4Q,EAAMqJ,KAAKtW,IAAWoN,GACtB9Q,EAAM,EACH8Q,EAAa,IAAM9Q,GAAO,MAC/B2Q,GAAOqJ,KAAKtW,IAAWoN,GAAc9Q,EAGvC,OAAO2Q,CACT,EAEAe,EAAOjR,UAAUk9L,UACjBjsL,EAAOjR,UAAUm9L,UAAY,SAAoBl6L,EAAQoN,GAGvD,OAFApN,KAAoB,EACfoN,GAAUiL,EAAYrY,EAAQ,EAAGsW,KAAKja,QACpCia,KAAKtW,EACd,EAEAgO,EAAOjR,UAAUo9L,aACjBnsL,EAAOjR,UAAUq9L,aAAe,SAAuBp6L,EAAQoN,GAG7D,OAFApN,KAAoB,EACfoN,GAAUiL,EAAYrY,EAAQ,EAAGsW,KAAKja,QACpCia,KAAKtW,GAAWsW,KAAKtW,EAAS,IAAM,CAC7C,EAEAgO,EAAOjR,UAAUs9L,aACjBrsL,EAAOjR,UAAU87L,aAAe,SAAuB74L,EAAQoN,GAG7D,OAFApN,KAAoB,EACfoN,GAAUiL,EAAYrY,EAAQ,EAAGsW,KAAKja,QACnCia,KAAKtW,IAAW,EAAKsW,KAAKtW,EAAS,EAC7C,EAEAgO,EAAOjR,UAAUu9L,aACjBtsL,EAAOjR,UAAUw9L,aAAe,SAAuBv6L,EAAQoN,GAI7D,OAHApN,KAAoB,EACfoN,GAAUiL,EAAYrY,EAAQ,EAAGsW,KAAKja,SAElCia,KAAKtW,GACTsW,KAAKtW,EAAS,IAAM,EACpBsW,KAAKtW,EAAS,IAAM,IACD,SAAnBsW,KAAKtW,EAAS,EACrB,EAEAgO,EAAOjR,UAAUy9L,aACjBxsL,EAAOjR,UAAU09L,aAAe,SAAuBz6L,EAAQoN,GAI7D,OAHApN,KAAoB,EACfoN,GAAUiL,EAAYrY,EAAQ,EAAGsW,KAAKja,QAEpB,SAAfia,KAAKtW,IACTsW,KAAKtW,EAAS,IAAM,GACrBsW,KAAKtW,EAAS,IAAM,EACrBsW,KAAKtW,EAAS,GAClB,EAEAgO,EAAOjR,UAAU29L,UAAY,SAAoB16L,EAAQoN,EAAYzJ,GACnE3D,KAAoB,EACpBoN,KAA4B,EACvBzJ,GAAU0U,EAAYrY,EAAQoN,EAAYkJ,KAAKja,QAKpD,IAHA,IAAI4Q,EAAMqJ,KAAKtW,GACX1D,EAAM,EACNJ,EAAI,IACCA,EAAIkR,IAAe9Q,GAAO,MACjC2Q,GAAOqJ,KAAKtW,EAAS9D,GAAKI,EAM5B,OAFI2Q,IAFJ3Q,GAAO,OAES2Q,GAAO2B,KAAK+U,IAAI,EAAG,EAAIvW,IAEhCH,CACT,EAEAe,EAAOjR,UAAU49L,UAAY,SAAoB36L,EAAQoN,EAAYzJ,GACnE3D,KAAoB,EACpBoN,KAA4B,EACvBzJ,GAAU0U,EAAYrY,EAAQoN,EAAYkJ,KAAKja,QAKpD,IAHA,IAAI4Q,EAAIG,EACJ9Q,EAAM,EACNJ,EAAMoa,KAAKtW,IAAWiN,GACnBA,EAAI,IAAM3Q,GAAO,MACtBJ,GAAOoa,KAAKtW,IAAWiN,GAAK3Q,EAM9B,OAFIJ,IAFJI,GAAO,OAESJ,GAAO0S,KAAK+U,IAAI,EAAG,EAAIvW,IAEhClR,CACT,EAEA8R,EAAOjR,UAAU69L,SAAW,SAAmB56L,EAAQoN,GAGrD,OAFApN,KAAoB,EACfoN,GAAUiL,EAAYrY,EAAQ,EAAGsW,KAAKja,QACtB,IAAfia,KAAKtW,IAC0B,GAA5B,IAAOsW,KAAKtW,GAAU,GADKsW,KAAKtW,EAE3C,EAEAgO,EAAOjR,UAAU89L,YAAc,SAAsB76L,EAAQoN,GAC3DpN,KAAoB,EACfoN,GAAUiL,EAAYrY,EAAQ,EAAGsW,KAAKja,QAC3C,IAAIsH,EAAM2S,KAAKtW,GAAWsW,KAAKtW,EAAS,IAAM,EAC9C,OAAc,MAAN2D,EAAsB,WAANA,EAAmBA,CAC7C,EAEAqK,EAAOjR,UAAU+9L,YAAc,SAAsB96L,EAAQoN,GAC3DpN,KAAoB,EACfoN,GAAUiL,EAAYrY,EAAQ,EAAGsW,KAAKja,QAC3C,IAAIsH,EAAM2S,KAAKtW,EAAS,GAAMsW,KAAKtW,IAAW,EAC9C,OAAc,MAAN2D,EAAsB,WAANA,EAAmBA,CAC7C,EAEAqK,EAAOjR,UAAUg+L,YAAc,SAAsB/6L,EAAQoN,GAI3D,OAHApN,KAAoB,EACfoN,GAAUiL,EAAYrY,EAAQ,EAAGsW,KAAKja,QAEnCia,KAAKtW,GACVsW,KAAKtW,EAAS,IAAM,EACpBsW,KAAKtW,EAAS,IAAM,GACpBsW,KAAKtW,EAAS,IAAM,EACzB,EAEAgO,EAAOjR,UAAUi+L,YAAc,SAAsBh7L,EAAQoN,GAI3D,OAHApN,KAAoB,EACfoN,GAAUiL,EAAYrY,EAAQ,EAAGsW,KAAKja,QAEnCia,KAAKtW,IAAW,GACrBsW,KAAKtW,EAAS,IAAM,GACpBsW,KAAKtW,EAAS,IAAM,EACpBsW,KAAKtW,EAAS,EACnB,EAEAgO,EAAOjR,UAAUk+L,YAAc,SAAsBj7L,EAAQoN,GAG3D,OAFApN,KAAoB,EACfoN,GAAUiL,EAAYrY,EAAQ,EAAGsW,KAAKja,QACpCC,EAAQiN,KAAK+M,KAAMtW,GAAA,EAAc,GAAI,EAC9C,EAEAgO,EAAOjR,UAAUm+L,YAAc,SAAsBl7L,EAAQoN,GAG3D,OAFApN,KAAoB,EACfoN,GAAUiL,EAAYrY,EAAQ,EAAGsW,KAAKja,QACpCC,EAAQiN,KAAK+M,KAAMtW,GAAA,EAAe,GAAI,EAC/C,EAEAgO,EAAOjR,UAAUo+L,aAAe,SAAuBn7L,EAAQoN,GAG7D,OAFApN,KAAoB,EACfoN,GAAUiL,EAAYrY,EAAQ,EAAGsW,KAAKja,QACpCC,EAAQiN,KAAK+M,KAAMtW,GAAA,EAAc,GAAI,EAC9C,EAEAgO,EAAOjR,UAAUq+L,aAAe,SAAuBp7L,EAAQoN,GAG7D,OAFApN,KAAoB,EACfoN,GAAUiL,EAAYrY,EAAQ,EAAGsW,KAAKja,QACpCC,EAAQiN,KAAK+M,KAAMtW,GAAA,EAAe,GAAI,EAC/C,EAQAgO,EAAOjR,UAAUs+L,YACjBrtL,EAAOjR,UAAUu+L,YAAc,SAAsBt7L,EAAOoN,EAAQzJ,EAAYsJ,GAC9EjN,GAASA,EACToN,KAAoB,EACpBzJ,KAA4B,EACvBsJ,GAEHqK,EAAShB,KAAMtW,EAAOoN,EAAQzJ,EADfiL,KAAK+U,IAAI,EAAG,EAAIhgB,GAAc,EACO,GAGtD,IAAIrH,EAAM,EACNJ,EAAI,EAER,IADAoa,KAAKlJ,GAAkB,IAARpN,IACN9D,EAAIyH,IAAerH,GAAO,MACjCga,KAAKlJ,EAASlR,GAAM8D,EAAQ1D,EAAO,IAGrC,OAAO8Q,EAASzJ,CAClB,EAEAqK,EAAOjR,UAAUw+L,YACjBvtL,EAAOjR,UAAUy+L,YAAc,SAAsBx7L,EAAOoN,EAAQzJ,EAAYsJ,GAC9EjN,GAASA,EACToN,KAAoB,EACpBzJ,KAA4B,EACvBsJ,GAEHqK,EAAShB,KAAMtW,EAAOoN,EAAQzJ,EADfiL,KAAK+U,IAAI,EAAG,EAAIhgB,GAAc,EACO,GAGtD,IAAIrH,EAAIqH,EAAa,EACjBzH,EAAM,EAEV,IADAoa,KAAKlJ,EAAS9Q,GAAa,IAAR0D,IACV1D,GAAK,IAAMJ,GAAO,MACzBoa,KAAKlJ,EAAS9Q,GAAM0D,EAAQ9D,EAAO,IAGrC,OAAOkR,EAASzJ,CAClB,EAEAqK,EAAOjR,UAAU0+L,WACjBztL,EAAOjR,UAAU2+L,WAAa,SAAqB17L,EAAOoN,EAAQzJ,GAKhE,OAJA3D,GAASA,EACToN,KAAoB,EACfzJ,GAAU2T,EAAShB,KAAMtW,EAAOoN,EAAQ,EAAG,IAAM,GACtDkJ,KAAKlJ,GAAmB,IAARpN,EACToN,EAAS,CAClB,EAEAY,EAAOjR,UAAU4+L,cACjB3tL,EAAOjR,UAAU6+L,cAAgB,SAAwB57L,EAAOoN,EAAQzJ,GAMtE,OALA3D,GAASA,EACToN,KAAoB,EACfzJ,GAAU2T,EAAShB,KAAMtW,EAAOoN,EAAQ,EAAG,MAAQ,GACxDkJ,KAAKlJ,GAAmB,IAARpN,EAChBsW,KAAKlJ,EAAS,GAAMpN,IAAU,EACvBoN,EAAS,CAClB,EAEAY,EAAOjR,UAAU8+L,cACjB7tL,EAAOjR,UAAU++L,cAAgB,SAAwB97L,EAAOoN,EAAQzJ,GAMtE,OALA3D,GAASA,EACToN,KAAoB,EACfzJ,GAAU2T,EAAShB,KAAMtW,EAAOoN,EAAQ,EAAG,MAAQ,GACxDkJ,KAAKlJ,GAAWpN,IAAU,EAC1BsW,KAAKlJ,EAAS,GAAc,IAARpN,EACboN,EAAS,CAClB,EAEAY,EAAOjR,UAAUg/L,cACjB/tL,EAAOjR,UAAUi/L,cAAgB,SAAwBh8L,EAAOoN,EAAQzJ,GAQtE,OAPA3D,GAASA,EACToN,KAAoB,EACfzJ,GAAU2T,EAAShB,KAAMtW,EAAOoN,EAAQ,EAAG,WAAY,GAC5DkJ,KAAKlJ,EAAS,GAAMpN,IAAU,GAC9BsW,KAAKlJ,EAAS,GAAMpN,IAAU,GAC9BsW,KAAKlJ,EAAS,GAAMpN,IAAU,EAC9BsW,KAAKlJ,GAAmB,IAARpN,EACToN,EAAS,CAClB,EAEAY,EAAOjR,UAAUk/L,cACjBjuL,EAAOjR,UAAUm/L,cAAgB,SAAwBl8L,EAAOoN,EAAQzJ,GAQtE,OAPA3D,GAASA,EACToN,KAAoB,EACfzJ,GAAU2T,EAAShB,KAAMtW,EAAOoN,EAAQ,EAAG,WAAY,GAC5DkJ,KAAKlJ,GAAWpN,IAAU,GAC1BsW,KAAKlJ,EAAS,GAAMpN,IAAU,GAC9BsW,KAAKlJ,EAAS,GAAMpN,IAAU,EAC9BsW,KAAKlJ,EAAS,GAAc,IAARpN,EACboN,EAAS,CAClB,EAEAY,EAAOjR,UAAUo/L,WAAa,SAAqBn8L,EAAOoN,EAAQzJ,EAAYsJ,GAG5E,GAFAjN,GAASA,EACToN,KAAoB,GACfH,EAAU,CACb,IAAI3Q,EAAQsS,KAAK+U,IAAI,EAAI,EAAIhgB,EAAc,GAE3C2T,EAAShB,KAAMtW,EAAOoN,EAAQzJ,EAAYrH,EAAQ,GAAIA,EACxD,CAEA,IAAIJ,EAAI,EACJ2R,EAAM,EACNX,EAAM,EAEV,IADAoJ,KAAKlJ,GAAkB,IAARpN,IACN9D,EAAIyH,IAAekK,GAAO,MAC7B7N,EAAQ,GAAa,IAARkN,GAAsC,IAAzBoJ,KAAKlJ,EAASlR,EAAI,KAC9CgR,EAAM,GAERoJ,KAAKlJ,EAASlR,IAAO8D,EAAQ6N,EAAQ,GAAKX,EAAM,IAGlD,OAAOE,EAASzJ,CAClB,EAEAqK,EAAOjR,UAAUq/L,WAAa,SAAqBp8L,EAAOoN,EAAQzJ,EAAYsJ,GAG5E,GAFAjN,GAASA,EACToN,KAAoB,GACfH,EAAU,CACb,IAAI3Q,EAAQsS,KAAK+U,IAAI,EAAI,EAAIhgB,EAAc,GAE3C2T,EAAShB,KAAMtW,EAAOoN,EAAQzJ,EAAYrH,EAAQ,GAAIA,EACxD,CAEA,IAAIJ,EAAIyH,EAAa,EACjBkK,EAAM,EACNX,EAAM,EAEV,IADAoJ,KAAKlJ,EAASlR,GAAa,IAAR8D,IACV9D,GAAK,IAAM2R,GAAO,MACrB7N,EAAQ,GAAa,IAARkN,GAAsC,IAAzBoJ,KAAKlJ,EAASlR,EAAI,KAC9CgR,EAAM,GAERoJ,KAAKlJ,EAASlR,IAAO8D,EAAQ6N,EAAQ,GAAKX,EAAM,IAGlD,OAAOE,EAASzJ,CAClB,EAEAqK,EAAOjR,UAAUs/L,UAAY,SAAoBr8L,EAAOoN,EAAQzJ,GAM9D,OALA3D,GAASA,EACToN,KAAoB,EACfzJ,GAAU2T,EAAShB,KAAMtW,EAAOoN,EAAQ,EAAG,KAAO,KACnDpN,EAAQ,IAAGA,EAAQ,IAAOA,EAAQ,GACtCsW,KAAKlJ,GAAmB,IAARpN,EACToN,EAAS,CAClB,EAEAY,EAAOjR,UAAUu/L,aAAe,SAAuBt8L,EAAOoN,EAAQzJ,GAMpE,OALA3D,GAASA,EACToN,KAAoB,EACfzJ,GAAU2T,EAAShB,KAAMtW,EAAOoN,EAAQ,EAAG,OAAS,OACzDkJ,KAAKlJ,GAAmB,IAARpN,EAChBsW,KAAKlJ,EAAS,GAAMpN,IAAU,EACvBoN,EAAS,CAClB,EAEAY,EAAOjR,UAAUw/L,aAAe,SAAuBv8L,EAAOoN,EAAQzJ,GAMpE,OALA3D,GAASA,EACToN,KAAoB,EACfzJ,GAAU2T,EAAShB,KAAMtW,EAAOoN,EAAQ,EAAG,OAAS,OACzDkJ,KAAKlJ,GAAWpN,IAAU,EAC1BsW,KAAKlJ,EAAS,GAAc,IAARpN,EACboN,EAAS,CAClB,EAEAY,EAAOjR,UAAUy/L,aAAe,SAAuBx8L,EAAOoN,EAAQzJ,GAQpE,OAPA3D,GAASA,EACToN,KAAoB,EACfzJ,GAAU2T,EAAShB,KAAMtW,EAAOoN,EAAQ,EAAG,YAAa,YAC7DkJ,KAAKlJ,GAAmB,IAARpN,EAChBsW,KAAKlJ,EAAS,GAAMpN,IAAU,EAC9BsW,KAAKlJ,EAAS,GAAMpN,IAAU,GAC9BsW,KAAKlJ,EAAS,GAAMpN,IAAU,GACvBoN,EAAS,CAClB,EAEAY,EAAOjR,UAAU0/L,aAAe,SAAuBz8L,EAAOoN,EAAQzJ,GASpE,OARA3D,GAASA,EACToN,KAAoB,EACfzJ,GAAU2T,EAAShB,KAAMtW,EAAOoN,EAAQ,EAAG,YAAa,YACzDpN,EAAQ,IAAGA,EAAQ,WAAaA,EAAQ,GAC5CsW,KAAKlJ,GAAWpN,IAAU,GAC1BsW,KAAKlJ,EAAS,GAAMpN,IAAU,GAC9BsW,KAAKlJ,EAAS,GAAMpN,IAAU,EAC9BsW,KAAKlJ,EAAS,GAAc,IAARpN,EACboN,EAAS,CAClB,EAiBAY,EAAOjR,UAAU2/L,aAAe,SAAuB18L,EAAOoN,EAAQzJ,GACpE,OAAO4T,EAAWjB,KAAMtW,EAAOoN,GAAA,EAAczJ,EAC/C,EAEAqK,EAAOjR,UAAU4/L,aAAe,SAAuB38L,EAAOoN,EAAQzJ,GACpE,OAAO4T,EAAWjB,KAAMtW,EAAOoN,GAAA,EAAezJ,EAChD,EAYAqK,EAAOjR,UAAU6/L,cAAgB,SAAwB58L,EAAOoN,EAAQzJ,GACtE,OAAOkH,EAAYyL,KAAMtW,EAAOoN,GAAA,EAAczJ,EAChD,EAEAqK,EAAOjR,UAAU8/L,cAAgB,SAAwB78L,EAAOoN,EAAQzJ,GACtE,OAAOkH,EAAYyL,KAAMtW,EAAOoN,GAAA,EAAezJ,EACjD,EAGAqK,EAAOjR,UAAU65D,KAAO,SAAe52D,EAAQoN,EAAazJ,EAAOsJ,GACjE,IAAKe,EAAOwlG,SAASxzG,GAAS,MAAM,IAAI2oD,UAAU,+BAQlD,GAPKhlD,IAAOA,EAAQ,GACfsJ,GAAe,IAARA,IAAWA,EAAMqJ,KAAKja,QAC9B+Q,GAAepN,EAAO3D,SAAQ+Q,EAAcpN,EAAO3D,QAClD+Q,IAAaA,EAAc,GAC5BH,EAAM,GAAKA,EAAMtJ,IAAOsJ,EAAMtJ,GAG9BsJ,IAAQtJ,EAAO,OAAO,EAC1B,GAAsB,IAAlB3D,EAAO3D,QAAgC,IAAhBia,KAAKja,OAAc,OAAO,EAGrD,GAAI+Q,EAAc,EAChB,MAAM,IAAIsa,WAAW,6BAEvB,GAAI/jB,EAAQ,GAAKA,GAAS2S,KAAKja,OAAQ,MAAM,IAAIqrB,WAAW,sBAC5D,GAAIza,EAAM,EAAG,MAAM,IAAIya,WAAW,2BAG9Bza,EAAMqJ,KAAKja,SAAQ4Q,EAAMqJ,KAAKja,QAC9B2D,EAAO3D,OAAS+Q,EAAcH,EAAMtJ,IACtCsJ,EAAMjN,EAAO3D,OAAS+Q,EAAczJ,GAGtC,IAAIrH,EAAM2Q,EAAMtJ,EAahB,OAXI2S,OAAStW,GAAqD,mBAApC2W,WAAW5Z,UAAU+/L,WAEjDxmL,KAAKwmL,WAAW1vL,EAAazJ,EAAOsJ,GAEpC0J,WAAW5Z,UAAU8c,IAAI3c,KACvB8C,EACAsW,KAAK2L,SAASte,EAAOsJ,GACrBG,GAIG9Q,CACT,EAMA0R,EAAOjR,UAAUo8L,KAAO,SAAen5L,EAAKoN,EAAOzJ,EAAKsJ,GAEtD,GAAmB,iBAARjN,EAAkB,CAS3B,GARqB,iBAAVoN,GACTH,EAAWG,EACXA,EAAQ,EACRzJ,EAAM2S,KAAKja,QACa,iBAARsH,IAChBsJ,EAAWtJ,EACXA,EAAM2S,KAAKja,aAAA,IAET4Q,GAA8C,iBAAbA,EACnC,MAAM,IAAI07C,UAAU,6BAEtB,GAAwB,iBAAb17C,IAA0Be,EAAOyqL,WAAWxrL,GACrD,MAAM,IAAI07C,UAAU,qBAAuB17C,GAE7C,GAAmB,IAAfjN,EAAI3D,OAAc,CACpB,IAAIC,EAAO0D,EAAI8f,WAAW,IACR,SAAb7S,GAAuB3Q,EAAO,KAClB,WAAb2Q,KAEFjN,EAAM1D,EAEV,CACF,KAA0B,iBAAR0D,EAChBA,GAAY,IACY,kBAARA,IAChBA,EAAMwO,OAAOxO,IAIf,GAAIoN,EAAQ,GAAKkJ,KAAKja,OAAS+Q,GAASkJ,KAAKja,OAASsH,EACpD,MAAM,IAAI+jB,WAAW,sBAGvB,GAAI/jB,GAAOyJ,EACT,OAAOkJ,KAQT,IAAIpa,EACJ,GANAkR,KAAkB,EAClBzJ,OAAA,IAAMA,EAAoB2S,KAAKja,OAASsH,IAAQ,EAE3C3D,IAAKA,EAAM,GAGG,iBAARA,EACT,IAAK9D,EAAIkR,EAAOlR,EAAIyH,IAAOzH,EACzBoa,KAAKpa,GAAK8D,MAEP,CACL,IAAI6N,EAAQG,EAAOwlG,SAASxzG,GACxBA,EACAgO,EAAO4R,KAAK5f,EAAKiN,GACjBC,EAAMW,EAAMxR,OAChB,GAAY,IAAR6Q,EACF,MAAM,IAAIy7C,UAAU,cAAgB3oD,EAClC,qCAEJ,IAAK9D,EAAI,EAAGA,EAAIyH,EAAMyJ,IAASlR,EAC7Boa,KAAKpa,EAAIkR,GAASS,EAAM3R,EAAIgR,EAEhC,CAEA,OAAOoJ,IACT,EAKA,IAAIhT,EAAoB,oBAgBxB,SAAS6V,EAAanZ,EAAQoN,GAE5B,IAAIzJ,EADJyJ,EAAQA,GAAS,IAMjB,IAJA,IAAIH,EAASjN,EAAO3D,OAChBC,EAAgB,KAChBJ,EAAQ,GAEH2R,EAAI,EAAGA,EAAIZ,IAAUY,EAAG,CAI/B,IAHAlK,EAAY3D,EAAO8f,WAAWjS,IAGd,OAAUlK,EAAY,MAAQ,CAE5C,IAAKrH,EAAe,CAElB,GAAIqH,EAAY,MAAQ,EAEjByJ,GAAS,IAAM,GAAGlR,EAAM6kB,KAAK,IAAM,IAAM,KAC9C,QACF,CAAO,GAAIlT,EAAI,IAAMZ,EAAQ,EAEtBG,GAAS,IAAM,GAAGlR,EAAM6kB,KAAK,IAAM,IAAM,KAC9C,QACF,CAGAzkB,EAAgBqH,EAEhB,QACF,CAGA,GAAIA,EAAY,MAAQ,EACjByJ,GAAS,IAAM,GAAGlR,EAAM6kB,KAAK,IAAM,IAAM,KAC9CzkB,EAAgBqH,EAChB,QACF,CAGAA,EAAkE,OAArDrH,EAAgB,OAAU,GAAKqH,EAAY,MAC1D,MAAWrH,IAEJ8Q,GAAS,IAAM,GAAGlR,EAAM6kB,KAAK,IAAM,IAAM,KAMhD,GAHAzkB,EAAgB,KAGZqH,EAAY,IAAM,CACpB,IAAKyJ,GAAS,GAAK,EAAG,MACtBlR,EAAM6kB,KAAKpd,EACb,MAAO,GAAIA,EAAY,KAAO,CAC5B,IAAKyJ,GAAS,GAAK,EAAG,MACtBlR,EAAM6kB,KACJpd,GAAa,EAAM,IACP,GAAZA,EAAmB,IAEvB,MAAO,GAAIA,EAAY,MAAS,CAC9B,IAAKyJ,GAAS,GAAK,EAAG,MACtBlR,EAAM6kB,KACJpd,GAAa,GAAM,IACnBA,GAAa,EAAM,GAAO,IACd,GAAZA,EAAmB,IAEvB,KAAO,MAAIA,EAAY,SASrB,MAAM,IAAI6J,MAAM,sBARhB,IAAKJ,GAAS,GAAK,EAAG,MACtBlR,EAAM6kB,KACJpd,GAAa,GAAO,IACpBA,GAAa,GAAM,GAAO,IAC1BA,GAAa,EAAM,GAAO,IACd,GAAZA,EAAmB,IAIvB,CACF,CAEA,OAAOzH,CACT,CA2BA,SAASs0B,EAAexwB,GACtB,OAAOiN,EAAO8vL,YAxHhB,SAAsB/8L,GAMpB,IAFAA,GAFAA,EAAMA,EAAIqO,MAAM,KAAK,IAEXhB,OAAO7K,QAAQc,EAAmB,KAEpCjH,OAAS,EAAG,MAAO,GAE3B,KAAO2D,EAAI3D,OAAS,GAAM,GACxB2D,GAAY,IAEd,OAAOA,CACT,CAZA,CAwHwCA,GACxC,CAEA,SAASoZ,EAAYpZ,EAAKoN,EAAKzJ,EAAQsJ,GACrC,IAAK,IAAI3Q,EAAI,EAAGA,EAAI2Q,KACb3Q,EAAIqH,GAAUyJ,EAAI/Q,QAAYC,GAAK0D,EAAI3D,UADhBC,EAE5B8Q,EAAI9Q,EAAIqH,GAAU3D,EAAI1D,GAExB,OAAOA,CACT,CAKA,SAASwd,EAAY9Z,EAAKoN,GACxB,OAAOpN,aAAeoN,GACZ,MAAPpN,GAAkC,MAAnBA,EAAI5D,aAA+C,MAAxB4D,EAAI5D,YAAY+B,MACzD6B,EAAI5D,YAAY+B,OAASiP,EAAKjP,IACpC,CACA,SAAS+F,EAAalE,GAEpB,OAAOA,GAAQA,CACjB,CAIA,IAAIynB,EAAsB,WAGxB,IAFA,IAAIznB,EAAW,mBACXoN,EAAQ,IAAI5Q,MAAM,KACbmH,EAAI,EAAGA,EAAI,KAAMA,EAExB,IADA,IAAIsJ,EAAU,GAAJtJ,EACDrH,EAAI,EAAGA,EAAI,KAAMA,EACxB8Q,EAAMH,EAAM3Q,GAAK0D,EAAS2D,GAAK3D,EAAS1D,GAG5C,OAAO8Q,CACR,CAVyB,kBAAApN,EAAAoN,GAAA,aC5wD1BA,EAAQmU,WAuCR,SAAqBvhB,GACnB,IAAIoN,EAAOY,EAAQhO,GACf2D,EAAWyJ,EAAK,GAChBH,EAAkBG,EAAK,GAC3B,OAAuC,GAA9BzJ,EAAWsJ,GAAuB,EAAKA,CAClD,EA3CAG,EAAQ2vL,YAiDR,SAAsB/8L,GACpB,IAAIoN,EAcAzJ,EAbAzH,EAAO8R,EAAQhO,GACf6N,EAAW3R,EAAK,GAChBgR,EAAkBhR,EAAK,GAEvBuH,EAAM,IAAInH,EAVhB,SAAsB0D,EAAKoN,EAAUzJ,GACnC,OAAuC,GAA9ByJ,EAAWzJ,GAAuB,EAAKA,CAClD,CAFA,CAUgC,EAAKkK,EAAUX,IAEzC/I,EAAU,EAGVd,EAAM6J,EAAkB,EACxBW,EAAW,EACXA,EAGJ,IAAKlK,EAAI,EAAGA,EAAIN,EAAKM,GAAK,EACxByJ,EACGH,EAAUjN,EAAI8f,WAAWnc,KAAO,GAChCsJ,EAAUjN,EAAI8f,WAAWnc,EAAI,KAAO,GACpCsJ,EAAUjN,EAAI8f,WAAWnc,EAAI,KAAO,EACrCsJ,EAAUjN,EAAI8f,WAAWnc,EAAI,IAC/BF,EAAIU,KAAciJ,GAAO,GAAM,IAC/B3J,EAAIU,KAAciJ,GAAO,EAAK,IAC9B3J,EAAIU,KAAmB,IAANiJ,EAmBnB,OAhBwB,IAApBF,IACFE,EACGH,EAAUjN,EAAI8f,WAAWnc,KAAO,EAChCsJ,EAAUjN,EAAI8f,WAAWnc,EAAI,KAAO,EACvCF,EAAIU,KAAmB,IAANiJ,GAGK,IAApBF,IACFE,EACGH,EAAUjN,EAAI8f,WAAWnc,KAAO,GAChCsJ,EAAUjN,EAAI8f,WAAWnc,EAAI,KAAO,EACpCsJ,EAAUjN,EAAI8f,WAAWnc,EAAI,KAAO,EACvCF,EAAIU,KAAciJ,GAAO,EAAK,IAC9B3J,EAAIU,KAAmB,IAANiJ,GAGZ3J,CACT,EA5FA2J,EAAQ0rL,cAkHR,SAAwB94L,GAQtB,IAPA,IAAIoN,EACAH,EAAMjN,EAAM3D,OACZC,EAAa2Q,EAAM,EACnB/Q,EAAQ,GACR2R,EAAiB,MAGZX,EAAI,EAAGc,EAAOf,EAAM3Q,EAAY4Q,EAAIc,EAAMd,GAAKW,EACtD3R,EAAM6kB,KAAKtd,EAAYzD,EAAOkN,EAAIA,EAAIW,EAAkBG,EAAOA,EAAQd,EAAIW,IAqB7E,OAjBmB,IAAfvR,GACF8Q,EAAMpN,EAAMiN,EAAM,GAClB/Q,EAAM6kB,KACJpd,EAAOyJ,GAAO,GACdzJ,EAAQyJ,GAAO,EAAK,IACpB,OAEsB,IAAf9Q,IACT8Q,GAAOpN,EAAMiN,EAAM,IAAM,GAAKjN,EAAMiN,EAAM,GAC1C/Q,EAAM6kB,KACJpd,EAAOyJ,GAAO,IACdzJ,EAAQyJ,GAAO,EAAK,IACpBzJ,EAAQyJ,GAAO,EAAK,IACpB,MAIGlR,EAAMqS,KAAK,GACpB,EA1IA,IALA,IAAI5K,EAAS,GACTsJ,EAAY,GACZ3Q,EAA4B,oBAAfqa,WAA6BA,WAAana,MAEvDN,EAAO,mEACF2R,EAAI,EAAGX,EAAMhR,EAAKG,OAAQwR,EAAIX,IAAOW,EAC5ClK,EAAOkK,GAAK3R,EAAK2R,GACjBZ,EAAU/Q,EAAK4jB,WAAWjS,IAAMA,EAQlC,SAASG,EAAShO,GAChB,IAAIoN,EAAMpN,EAAI3D,OAEd,GAAI+Q,EAAM,EAAI,EACZ,MAAM,IAAII,MAAM,kDAKlB,IAAI7J,EAAW3D,EAAIyI,QAAQ,KAO3B,OANkB,IAAd9E,IAAiBA,EAAWyJ,GAMzB,CAACzJ,EAJcA,IAAayJ,EAC/B,EACA,EAAKzJ,EAAW,EAGtB,CAmEA,SAASF,EAAazD,EAAOoN,EAAOH,GAGlC,IAFA,IAAI3Q,EARoBJ,EASpB2R,EAAS,GACJX,EAAIE,EAAOF,EAAID,EAAKC,GAAK,EAChC5Q,GACI0D,EAAMkN,IAAM,GAAM,WAClBlN,EAAMkN,EAAI,IAAM,EAAK,QACP,IAAflN,EAAMkN,EAAI,IACbW,EAAOkT,KAdFpd,GADiBzH,EAeMI,IAdT,GAAK,IACxBqH,EAAOzH,GAAO,GAAK,IACnByH,EAAOzH,GAAO,EAAI,IAClByH,EAAa,GAANzH,IAaT,OAAO2R,EAAOU,KAAK,GACrB,CAlGAtB,EAAU,IAAI6S,WAAW,IAAM,GAC/B7S,EAAU,IAAI6S,WAAW,IAAM,kBAAA9f,EAAAoN,GClB/BA,EAAQ7D,KAAO,SAAUvJ,EAAQoN,EAAQzJ,EAAMsJ,EAAM3Q,GACnD,IAAIJ,EAAG2R,EACHX,EAAiB,EAAT5Q,EAAc2Q,EAAO,EAC7Be,GAAQ,GAAKd,GAAQ,EACrBzJ,EAAQuK,GAAQ,EAChB7J,GAAS,EACTd,EAAIM,EAAQrH,EAAS,EAAK,EAC1B+H,EAAIV,GAAQ,EAAI,EAChBS,EAAIpE,EAAOoN,EAAS/J,GAOxB,IALAA,GAAKgB,EAELnI,EAAIkI,GAAM,IAAOD,GAAU,EAC3BC,KAAQD,EACRA,GAAS+I,EACF/I,EAAQ,EAAGjI,EAAS,IAAJA,EAAW8D,EAAOoN,EAAS/J,GAAIA,GAAKgB,EAAGF,GAAS,GAKvE,IAHA0J,EAAI3R,GAAM,IAAOiI,GAAU,EAC3BjI,KAAQiI,EACRA,GAAS8I,EACF9I,EAAQ,EAAG0J,EAAS,IAAJA,EAAW7N,EAAOoN,EAAS/J,GAAIA,GAAKgB,EAAGF,GAAS,GAEvE,GAAU,IAANjI,EACFA,EAAI,EAAIuH,MACH,IAAIvH,IAAM8R,EACf,OAAOH,EAAI8lC,IAAsB,KAAdvvC,GAAK,EAAI,GAE5ByJ,GAAQe,KAAK+U,IAAI,EAAG1W,GACpB/Q,GAAQuH,CACV,CACA,OAAQW,GAAK,EAAI,GAAKyJ,EAAIe,KAAK+U,IAAI,EAAGznB,EAAI+Q,EAC5C,EAEAG,EAAQsrL,MAAQ,SAAU14L,EAAQoN,EAAOzJ,EAAQsJ,EAAM3Q,EAAMJ,GAC3D,IAAI2R,EAAGX,EAAGc,EACNvK,EAAiB,EAATvH,EAAcI,EAAO,EAC7B6H,GAAQ,GAAKV,GAAQ,EACrBJ,EAAQc,GAAQ,EAChBE,EAAe,KAAT/H,EAAcsS,KAAK+U,IAAI,GAAI,IAAM/U,KAAK+U,IAAI,GAAI,IAAM,EAC1Dvf,EAAI6I,EAAO,EAAK/Q,EAAS,EACzBoI,EAAI2I,EAAO,GAAK,EAChBnJ,EAAIsJ,EAAQ,GAAgB,IAAVA,GAAe,EAAIA,EAAQ,EAAK,EAAI,EAmC1D,IAjCAA,EAAQwB,KAAKC,IAAIzB,GAEbkoB,MAAMloB,IAAUA,IAAU,KAC5BF,EAAIooB,MAAMloB,GAAS,EAAI,EACvBS,EAAI1J,IAEJ0J,EAAIe,KAAK2Q,MAAM3Q,KAAKiH,IAAIzI,GAASwB,KAAK25E,KAClCn7E,GAASY,EAAIY,KAAK+U,IAAI,GAAI9V,IAAM,IAClCA,IACAG,GAAK,IAGLZ,GADES,EAAIxK,GAAS,EACNgB,EAAK2J,EAEL3J,EAAKuK,KAAK+U,IAAI,EAAG,EAAItgB,IAEpB2K,GAAK,IACfH,IACAG,GAAK,GAGHH,EAAIxK,GAASc,GACf+I,EAAI,EACJW,EAAI1J,GACK0J,EAAIxK,GAAS,GACtB6J,GAAME,EAAQY,EAAK,GAAKY,KAAK+U,IAAI,EAAGrnB,GACpCuR,GAAQxK,IAER6J,EAAIE,EAAQwB,KAAK+U,IAAI,EAAGtgB,EAAQ,GAAKuL,KAAK+U,IAAI,EAAGrnB,GACjDuR,EAAI,IAIDvR,GAAQ,EAAG0D,EAAO2D,EAASS,GAAS,IAAJ8I,EAAU9I,GAAKE,EAAG4I,GAAK,IAAK5Q,GAAQ,GAI3E,IAFAuR,EAAKA,GAAKvR,EAAQ4Q,EAClBzJ,GAAQnH,EACDmH,EAAO,EAAGzD,EAAO2D,EAASS,GAAS,IAAJyJ,EAAUzJ,GAAKE,EAAGuJ,GAAK,IAAKpK,GAAQ,GAE1EzD,EAAO2D,EAASS,EAAIE,IAAU,IAAJR,CAC5B,iBAAA9D,EAAAoN,GCnFA,IAAIzJ,EAAW,CAEfi2K,YAAuB,SAAS55K,GAC9B,OAAO,IAAIiN,EAAQjN,GAAaixB,OAClC,EAEA+rK,gBAA2B,SAASh9L,EAAMoN,GACpB,iBAATpN,GAAuC,mBAAXoN,IAGvC9Q,EAAOS,UAAUkgM,eAAej9L,GAAQoN,EAC1C,EAEA8vL,WAAsB,WACpB,OAAO,IAAIjwL,CACb,EAGAkwL,UAAqB,SAASn9L,EAAMoN,EAAQzJ,GAC1C,IAAIsJ,EAAS3Q,EAAOsE,OAAOZ,GAI3B,OAHIoN,GACFA,EAAOgjD,OAAOnjD,EAAQtJ,GAEjBsJ,CACT,EAGAmwL,cAAyB,SAASp9L,EAAMoN,EAAQH,GAC9C,IAAI3Q,EAASqH,EAASw5L,UAAUn9L,EAAMoN,EAAQH,GAG9C,OAFA3Q,EAAO2P,QAAU,EACjB3P,EAAOM,MAAQ,EACRN,CACT,EAEAi9K,MAAiB,CAAC,GAClB51K,EAAS41K,MAAMC,iBAAmB,SAASx5K,EAAUoN,GACnD,IAAIzJ,EAAkByJ,GAAY,QAClC,GAA2B,oBAAhBkW,YACT,OAAO,IAAIA,YAAY3f,GAAiB6f,OAAOxjB,GAEjD,IAAIiN,EAAI,GACJ3Q,EAAI,EAER,GAAwB,UAApBqH,EAKF,KAAOrH,EAAI0D,EAASuhB,YAAY,CAC9B,IAAIrlB,EAAI8D,EAASivC,SAAS3yC,KACtBJ,EAAI,MAEGA,EAAI,KAEbA,GAAS,GAAJA,IAAa,EAClBA,GAA+B,GAAzB8D,EAASivC,SAAS3yC,MACfJ,EAAI,KAEbA,GAAS,GAAJA,IAAY,GACjBA,IAA+B,GAAzB8D,EAASivC,SAAS3yC,OAAgB,EACxCJ,GAA+B,GAAzB8D,EAASivC,SAAS3yC,OAGxBJ,GAAS,EAAJA,IAAY,GACjBA,IAA+B,GAAzB8D,EAASivC,SAAS3yC,OAAgB,GACxCJ,IAA+B,GAAzB8D,EAASivC,SAAS3yC,OAAgB,EACxCJ,GAA+B,GAAzB8D,EAASivC,SAAS3yC,OAE1B2Q,EAAE8T,KAAKS,OAAOC,aAAavlB,GAC7B,MAEA,KAAOI,EAAI0D,EAASuhB,YAClBtU,EAAE8T,KAAKS,OAAOC,aAAazhB,EAASivC,SAAS3yC,OAGjD,OAAO2Q,EAAEsB,KAAK,GAChB,EAEA5K,EAAS41K,MAAM8jB,gBAAkB,SAASr9L,GAExC,IAAIoN,EAAGzJ,EACP,GAA2B,oBAAhBinL,YACTx9K,GAAI,IAAIw9K,aAAcz0D,OAAOn2H,QAG7B,IADAoN,EAAI,GACCzJ,EAAI,EAAGA,EAAI3D,EAAO3D,SAAUsH,EAAG,CAClC,IAAIsJ,EAAIjN,EAAO8f,WAAWnc,GACtBsJ,EAAI,IACNG,EAAE2T,KAAK9T,GACEA,EAAI,MACbG,EAAE2T,KAAK,IAAQ9T,GAAK,GACpBG,EAAE2T,KAAK,IAAQ,GAAK9T,IACXA,EAAI,OACbG,EAAE2T,KAAK,IAAQ9T,GAAK,IACpBG,EAAE2T,KAAK,IAAQ,GAAM9T,GAAK,GAC1BG,EAAE2T,KAAK,IAAQ,GAAK9T,KAEpBG,EAAE2T,KAAK,IAAQ9T,GAAK,IACpBG,EAAE2T,KAAK,IAAQ,GAAM9T,GAAK,IAC1BG,EAAE2T,KAAK,IAAQ,GAAM9T,GAAK,GAC1BG,EAAE2T,KAAK,IAAQ,GAAK9T,GAExB,CAEF,OAAOG,CACT,EAOAzJ,EAAS41K,MAAM+jB,UAAY,SAASt9L,EAAQoN,EAAKzJ,GAM/C,GALAyJ,EAAI2pL,QAAU/2L,EAAOu9L,QAAQ72K,OAC7BtZ,EAAIowL,MAASx9L,EAAOw9L,MAAQx9L,EAAOw9L,MAAQx9L,EAC3CoN,EAAIqwL,KAAOz9L,EAAOy9L,KAClBrwL,EAAIswL,QAAU19L,GAED,IAAT2D,EAMJ,GAAI,MAAAA,EAAJ,CAKA,IACIsJ,EADA3Q,GAAS,EAGb,GAAmB,iBAARqH,EACTrH,EAAQqH,MACH,CACL,GAAmB,iBAARA,EACTsJ,EAAOtJ,MACF,IAAmB,iBAARA,IAAoBA,EAAI1F,KAIxC,YADA+B,EAAO65K,MAAM94J,KAAK3T,GAFlBH,EAAOtJ,EAAI1F,IAIb,CAEA,IAAK,IAAI/B,EAAI,EAAGA,EAAI8D,EAAO65K,MAAMx9K,OAAQH,IACvC,GAAI+Q,IAASjN,EAAO65K,MAAM39K,GAAG+B,KAAM,CACjC3B,EAAQJ,EAAI,EACZ,KACF,CAEJ,CACA8D,EAAO65K,MAAMryJ,OAAOlrB,EAAO,EAAG8Q,EAxB9B,MAFEpN,EAAO65K,MAAM94J,KAAK3T,EA2BtB,EAGEA,EAAQwsK,YAAkBj2K,EAASi2K,YACnCxsK,EAAQ4vL,gBAAkBr5L,EAASq5L,gBACnC5vL,EAAQ8vL,WAAkBv5L,EAASu5L,WACnC9vL,EAAQ+vL,UAAkBx5L,EAASw5L,UACnC/vL,EAAQgwL,cAAkBz5L,EAASy5L,cACnChwL,EAAQmsK,MAAkB51K,EAAS41K,MAGrC51K,EAASg6L,OAAS,SAAS39L,GACzBsW,KAAKoQ,YAAA,IAAiB1mB,EAA+B,EAAIA,CAC3D,EAEA,IAAIiN,EAAU,SAASjN,GACrBsW,KAAKinL,QAAU,IAAI55L,EAASg6L,OAC5BrnL,KAAKujK,MAAQ,GACT75K,IACFsW,KAAKmnL,KAAO,IAAI91K,SAAS3nB,GAE7B,EAEAiN,EAAQlQ,UAAU22E,MAAQ,SAAS1zE,GACjC,IAAIoN,EAASkJ,KAAKqgL,SAAS32L,GAAA,GAC3B,OAAQoN,EAAO/Q,OAAS+Q,EAAO,GAAK,IACtC,EAEAH,EAAQlQ,UAAU45L,SAAW,SAAS32L,EAAMoN,GAC1C,IAAIzJ,EAAS,GAEb,OADAsJ,EAAQ2wL,OAAO1gM,KAAKoZ,KAAMtW,EAAM2D,EAAQyJ,GACjCzJ,CACT,EAEAsJ,EAAQlQ,UAAUk0B,MAAQ,WAGxB,IAFA3a,KAAKinL,QAAQ72K,OAAS,EACtBpQ,KAAKujK,MAAQ,GACNvjK,KAAKinL,QAAQ72K,OAASpQ,KAAKmnL,KAAKl8K,YAAY,CACjD,IAAIvhB,EAAM1D,EAAO20B,MAAM3a,MAGvB,QAAI,IAAOtW,EAAI/B,KAAsB,MAErCqY,KAAKujK,MAAM94J,KAAK/gB,EAClB,CACA,OAAOsW,IACT,EAEArJ,EAAQ2wL,OAAS,SAAS59L,EAAMoN,EAAQzJ,GAEtC,IAAK,IAAIrH,KADLga,KAAKrY,MAAQqY,KAAKrY,MAAQ+B,GAAMoN,EAAO2T,KAAKzK,MAChCA,KAAKujK,MAAO,CAC1B,GAAIzsK,EAAO/Q,QAAUsH,EAAa,OAClCsJ,EAAQ2wL,OAAO1gM,KAAKoZ,KAAKujK,MAAMv9K,GAAM0D,EAAMoN,EAAQzJ,EACrD,CACF,EAEAsJ,EAAQlQ,UAAU27L,MAAQ,WAExB,IACI14L,EADAoN,EAAS,EAGb,IAAKpN,EAAI,EAAGA,EAAIsW,KAAKujK,MAAMx9K,OAAQ2D,IACjCoN,GAAUkJ,KAAKujK,MAAM75K,GAAG69L,WAAA,GAG1B,IAAIl6L,EAAQ,IAAIgT,WAAWvJ,GAK3B,IAJAkJ,KAAKwnL,MAAQ,IAAIn2K,SAAShkB,EAAM0d,QAChC/K,KAAK6P,MAAQxiB,EACb2S,KAAKinL,QAAQ72K,OAAS,EAEjB1mB,EAAI,EAAGA,EAAIsW,KAAKujK,MAAMx9K,OAAQ2D,IACjCsW,KAAKujK,MAAM75K,GAAG04L,QAGhB,OAAO/0L,EAAM0d,MACf,EAEApU,EAAQlQ,UAAUqzD,OAAS,SAASpwD,EAAKoN,GACvCzJ,EAAS41K,MAAM+jB,UAAUhnL,KAAMtW,EAAKoN,EACtC,EACA,IAAI9Q,EAAS,WACXga,KAAKinL,QAAU,IAAI55L,EAASg6L,MAC9B,EAEArhM,EAAO20B,MAAQ,SAASjxB,GACtB,IAAIoN,EAAS,IAAI9Q,EAOjB,OANA8Q,EAAO2pL,QAAU/2L,EAAOu9L,QAAQ72K,OAChCtZ,EAAOowL,MAASx9L,EAAOw9L,MAAQx9L,EAAOw9L,MAAQx9L,EAC9CoN,EAAOqwL,KAAOz9L,EAAOy9L,KACrBrwL,EAAOswL,QAAU19L,EACjBoN,EAAO2wL,YACP/9L,EAAOu9L,QAAQ72K,OAAStZ,EAAOqwL,KAAKn8K,WAAalU,EAAOqwL,KAAKl8K,WACtDnU,CACT,EAEA9Q,EAAOsE,OAAS,SAASZ,GACvB,IAAIoN,EAAS,IAAI9Q,EAGjB,OAFA8Q,EAAOnP,KAAO+B,EACdoN,EAAOysK,MAAQ,GACRzsK,CACT,EAEA9Q,EAAOS,UAAUihM,eAAiB,CAAC,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,QAE3L1hM,EAAOS,UAAUkgM,eAAiB,CAAC,EAKnC3gM,EAAOS,UAAUkhM,WAAa,SAAUj+L,EAAMoN,EAAMzJ,GAC9C2S,KAAK4nL,SACP5nL,KAAKtW,GAAQsW,KAAK6nL,WAAW/wL,EAAMzJ,GAGnC2S,KAAK8nL,YAAYhxL,EAAMzJ,EAAM2S,KAAKtW,GAEtC,EAEA1D,EAAOS,UAAUshM,gBAAkB,SAAUr+L,EAAMoN,EAAQzJ,EAAMsJ,GAC/D,IAAI3Q,EACJ,GAAIga,KAAK4nL,SAEP,IADA5nL,KAAKtW,GAAQ,GACR1D,EAAI,EAAGA,EAAI8Q,EAAQ9Q,IACtBga,KAAKtW,GAAM1D,GAAKga,KAAK6nL,WAAWx6L,EAAMsJ,QAIxC,IAAK3Q,EAAI,EAAGA,EAAIga,KAAKtW,GAAM3D,OAAQC,IACjCga,KAAK8nL,YAAYz6L,EAAMsJ,EAAMqJ,KAAKtW,GAAM1D,GAG9C,EAEAA,EAAOS,UAAUuhM,aAAe,WAC9BhoL,KAAK2nL,WAAW,UAAW,OAAQ,GACnC3nL,KAAK2nL,WAAW,QAAS,OAAQ,GACnC,EAEA3hM,EAAOS,UAAUwhM,aAAe,SAASv+L,EAAMoN,EAAQzJ,GACrD,IAAIsJ,EACJ,GAAIqJ,KAAK4nL,SAEP,IADA5nL,KAAKtW,GAAQ,GACRiN,EAAI,EAAGA,EAAIG,EAAQH,IACtBqJ,KAAKtW,GAAM+gB,KAAK,CAAC,GACjBpd,EAAGzG,KAAKoZ,KAAMA,KAAKtW,GAAMiN,SAI3B,IAAKA,EAAI,EAAGA,EAAIG,EAAQH,IACtBtJ,EAAGzG,KAAKoZ,KAAMA,KAAKtW,GAAMiN,GAG/B,EAEA3Q,EAAOS,UAAUyhM,gBAAkB,SAASx+L,EAAOoN,EAAMzJ,EAAQsJ,GAC/D,IAAI3Q,EACJ,GAAIga,KAAK4nL,SAEP,IADAl+L,EAAMoN,GAAQ,GACT9Q,EAAI,EAAGA,EAAIqH,EAAQrH,IACtB0D,EAAMoN,GAAM2T,KAAK,CAAC,GAClB9T,EAAG/P,KAAKoZ,KAAMtW,EAAMoN,GAAM9Q,SAI5B,IAAKA,EAAI,EAAGA,EAAIqH,EAAQrH,IACtB2Q,EAAG/P,KAAKoZ,KAAMtW,EAAMoN,GAAM9Q,GAGhC,EAEAA,EAAOS,UAAU0hM,gBAAkB,SAAUz+L,EAAOoN,EAAMzJ,EAAMsJ,GAC1DqJ,KAAK4nL,SACPl+L,EAAMoN,GAAQkJ,KAAK6nL,WAAWx6L,EAAMsJ,GAGpCqJ,KAAK8nL,YAAYz6L,EAAMsJ,EAAMjN,EAAMoN,GAEvC,EAEA9Q,EAAOS,UAAU2hM,cAAgB,SAAS1+L,EAAMoN,GAC9C,IAAIzJ,EACJ,GAAI2S,KAAK4nL,SAEP,IADA5nL,KAAKtW,GAAQ,GACR2D,EAAI,EAAGA,EAAIyJ,EAAQzJ,IACtB2S,KAAKtW,GAAM+gB,KAAKzkB,EAAO20B,MAAM3a,YAI/B,IAAK3S,EAAI,EAAGA,EAAIyJ,EAAQzJ,IAClB2S,KAAKwnL,MACPxnL,KAAKtW,GAAM2D,GAAG+0L,QAEdpiL,KAAKwM,MAAQxM,KAAKtW,GAAM2D,GAAGk6L,WAInC,EAKAvhM,EAAOS,UAAUohM,WAAa,SAASn+L,EAAMoN,GAC3C,OAAQpN,GACN,IAAK,OACH,OAAOsW,KAAKqoL,UAAUvxL,GACxB,IAAK,MACH,OAAOkJ,KAAKsoL,SAASxxL,GACvB,IAAK,WACH,OAAOkJ,KAAKuoL,cAAczxL,GAC5B,IAAK,SACH,OAAkB,IAAVA,EAAekJ,KAAKwoL,wBAA0BxoL,KAAKyoL,YAAY3xL,GACzE,IAAK,OACH,OAAOkJ,KAAK0oL,UAAU5xL,GACxB,IAAK,OACH,OAAOkJ,KAAK2oL,kBACd,QACE,OAAQ,EAEd,EAEA3iM,EAAOS,UAAU6hM,SAAW,SAAS5+L,GACnC,IAAIoN,EAAS,KACTzJ,EAAS2S,KAAKinL,QAAQ72K,OAASpQ,KAAKmnL,KAAKn8K,WAC7C,OAAOthB,GACP,KAAK,EACHoN,EAASkJ,KAAKmnL,KAAKyB,QAAQv7L,GAC3B,MACF,KAAK,GACHyJ,EAASkJ,KAAKmnL,KAAK0B,SAASx7L,GAC5B,MACF,KAAK,GACHyJ,EAASkJ,KAAKmnL,KAAK2B,SAASz7L,GAC5B,MACF,KAAK,GAGH,IAAIsJ,EAAKqJ,KAAKmnL,KAAK2B,SAASz7L,GACxBrH,EAAKga,KAAKmnL,KAAK2B,SAASz7L,EAAS,GACrCyJ,EAAUH,EAAK2B,KAAK+U,IAAI,EAAE,IAAOrnB,EAInC,OADAga,KAAKinL,QAAQ72K,QAAW1mB,GAAQ,EACzBoN,CACT,EAEA9Q,EAAOS,UAAU4hM,UAAY,SAAS3+L,GACpC,IAEIoN,EAAIzJ,EAFJsJ,EAAS,KACT3Q,EAASga,KAAKinL,QAAQ72K,OAASpQ,KAAKmnL,KAAKn8K,WAE7C,OAAOthB,GACP,KAAK,EACHiN,EAASqJ,KAAKmnL,KAAKxuJ,SAAS3yC,GAC5B,MACF,KAAK,GACH2Q,EAASqJ,KAAKmnL,KAAK7kE,UAAUt8H,GAC7B,MACF,KAAK,GAGH2Q,IAFAG,EAAKkJ,KAAKmnL,KAAK7kE,UAAUt8H,KAET,IADhBqH,EAAK2S,KAAKmnL,KAAKxuJ,SAAS3yC,EAAS,IAEjC,MACF,KAAK,GACH2Q,EAASqJ,KAAKmnL,KAAKh3K,UAAUnqB,GAC7B,MACF,KAAK,GAGH8Q,EAAKkJ,KAAKmnL,KAAKh3K,UAAUnqB,GACzBqH,EAAK2S,KAAKmnL,KAAKh3K,UAAUnqB,EAAS,GAClC2Q,EAAUG,EAAKwB,KAAK+U,IAAI,EAAE,IAAOhgB,EAInC,OADA2S,KAAKinL,QAAQ72K,QAAW1mB,GAAQ,EACzBiN,CACT,EAEA3Q,EAAOS,UAAUgiM,YAAc,SAAS/+L,GAEtC,IADA,IAAIoN,EAAM,GACDzJ,EAAI,EAAGA,EAAI3D,EAAQ2D,IAAK,CAC/B,IAAIsJ,EAAOqJ,KAAKqoL,UAAU,GAC1BvxL,GAAOoU,OAAOC,aAAaxU,EAC7B,CACA,OAAOG,CACT,EAEA9Q,EAAOS,UAAU8hM,cAAgB,SAAS7+L,GAGxC,OAFUsW,KAAKqoL,UAAU3+L,EAAO,GACrBsW,KAAKqoL,UAAU3+L,EAAO,GACZ4O,KAAK+U,IAAI,EAAG3jB,EAAO,EAC1C,EAEA1D,EAAOS,UAAU+hM,sBAAwB,WAEvC,IADA,IAAI9+L,EAAM,GACHsW,KAAKinL,QAAQ72K,OAASpQ,KAAKygL,QAAUzgL,KAAKmnL,KAAKl8K,YAAY,CAChE,IAAInU,EAAOkJ,KAAKqoL,UAAU,GAC1B,GAAa,IAATvxL,EAAY,MAChBpN,GAAOwhB,OAAOC,aAAarU,EAC7B,CACA,OAAOpN,CACT,EAEA1D,EAAOS,UAAUiiM,UAAY,SAASh/L,GACpC,IAAIoN,EAAUpN,EAAO,EAAKA,EAAQsW,KAAKmnL,KAAKl8K,YAAcjL,KAAKinL,QAAQ72K,OAASpQ,KAAKygL,SACrF,GAAI3pL,EAAS,EAAG,CACd,IAAIzJ,EAAO,IAAIgT,WAAWL,KAAKmnL,KAAKp8K,OAAQ/K,KAAKinL,QAAQ72K,OAAQtZ,GAGjE,OADAkJ,KAAKinL,QAAQ72K,QAAUtZ,EAChBzJ,CACT,CAEE,OAAO,IAEX,EAEArH,EAAOS,UAAUkiM,gBAAkB,WACjC,IAAIj/L,EAASsW,KAAKmnL,KAAKl8K,YAAcjL,KAAKinL,QAAQ72K,OAASpQ,KAAKygL,SAC5D3pL,EAAO,KAMX,OALIpN,EAAS,IACXoN,EAAO,IAAIua,SAASrR,KAAKmnL,KAAKp8K,OAAQ/K,KAAKinL,QAAQ72K,OAAQ1mB,GAC3DsW,KAAKinL,QAAQ72K,QAAU1mB,GAGlBoN,EAAOzJ,EAAS41K,MAAMC,iBAAiBpsK,GAAQA,CACxD,EAEA9Q,EAAOS,UAAUghM,UAAY,WAK3B,GAJAznL,KAAK4nL,UAAA,EACL5nL,KAAKinL,QAAQ72K,OAASpQ,KAAKygL,QAGvBzgL,KAAKygL,QAAU,EAAIzgL,KAAKmnL,KAAKp8K,OAAOE,WACtCjL,KAAKknL,MAAM5G,aAAA,MADb,CAWA,OANAtgL,KAAK2nL,WAAW,OAAQ,OAAQ,IAChC3nL,KAAK2nL,WAAW,OAAQ,SAAU,GAEhB,IAAd3nL,KAAKwM,MAAmBxM,KAAK2nL,WAAW,YAAa,OAAQ,IAC/C,SAAd3nL,KAAKrY,MAAmBqY,KAAK+nL,gBAAgB,WAAY,GAAI,OAAQ,GAElE/nL,KAAKwM,MACZ,KAAK,EAEHxM,KAAKmnL,KAAO,IAAI91K,SAASrR,KAAKmnL,KAAKp8K,OAAQ/K,KAAKygL,SAChD,MACF,KAAK,EACCzgL,KAAKygL,QAAUzgL,KAAKwM,KAAOxM,KAAKmnL,KAAKp8K,OAAOE,YAC9CjL,KAAKsgL,aAAA,EACLtgL,KAAKknL,MAAM5G,aAAA,GAEXtgL,KAAKmnL,KAAO,IAAI91K,SAASrR,KAAKmnL,KAAKp8K,OAAQ/K,KAAKygL,QAASzgL,KAAK+oL,WAEhE,MACF,QACM/oL,KAAKygL,QAAUzgL,KAAKwM,KAAOxM,KAAKmnL,KAAKp8K,OAAOE,YAC9CjL,KAAKsgL,aAAA,EACLtgL,KAAKknL,MAAM5G,aAAA,GAEXtgL,KAAKmnL,KAAO,IAAI91K,SAASrR,KAAKmnL,KAAKp8K,OAAQ/K,KAAKygL,QAASzgL,KAAKwM,MAK7DxM,KAAKsgL,cACJtgL,KAAK2mL,eAAe3mL,KAAKrY,OAC3BqY,KAAK2mL,eAAe3mL,KAAKrY,MAAMf,KAAKoZ,OAEU,IAA5CA,KAAK0nL,eAAev1L,QAAQ6N,KAAKrY,MACnCqY,KAAKgpL,qBAGLhpL,KAAKipL,MAAQjpL,KAAK0oL,YAvCtB,CA0CF,EAEA1iM,EAAOS,UAAUyiM,cAAgB,WAC/BlpL,KAAKrK,QAAUqK,KAAKqoL,UAAU,GAC9BroL,KAAK1Z,MAAQ0Z,KAAKqoL,UAAU,GAC9B,EAEAriM,EAAOS,UAAUuiM,mBAAqB,WAEpC,IADAhpL,KAAKujK,MAAQ,GACNvjK,KAAKinL,QAAQ72K,OAASpQ,KAAKmnL,KAAKn8K,WAAahL,KAAKmnL,KAAKl8K,YAC5DjL,KAAKujK,MAAM94J,KAAKzkB,EAAO20B,MAAM3a,MAEjC,EAKAha,EAAOS,UAAUqzD,OAAS,SAASpwD,EAAKoN,GACtCzJ,EAAS41K,MAAM+jB,UAAUhnL,KAAMtW,EAAKoN,EACtC,EAEA9Q,EAAOS,UAAU8gM,UAAY,WAe3B,GAdAvnL,KAAK4nL,UAAA,EACL5nL,KAAKwnL,MAAQ,KAEbxnL,KAAKwM,KAAO,EACZxM,KAAK2nL,WAAW,OAAQ,OAAQ,IAChC3nL,KAAK2nL,WAAW,OAAQ,SAAU,GAEhB,IAAd3nL,KAAKwM,MAAmBxM,KAAK2nL,WAAW,YAAa,OAAQ,IAC/C,SAAd3nL,KAAKrY,MAAmBqY,KAAK+nL,gBAAgB,WAAY,GAAI,OAAQ,GAErE/nL,KAAK2mL,eAAe3mL,KAAKrY,OAC3BqY,KAAK2mL,eAAe3mL,KAAKrY,MAAMf,KAAKoZ,OAGU,IAA5CA,KAAK0nL,eAAev1L,QAAQ6N,KAAKrY,MACnC,IAAK,IAAI+B,EAAI,EAAGA,EAAIsW,KAAKujK,MAAMx9K,OAAQ2D,IACrCsW,KAAKwM,MAAQxM,KAAKujK,MAAM75K,GAAG69L,YAQ/B,OAJIvnL,KAAKipL,OACPjpL,KAAKmpL,WAAWnpL,KAAKipL,OAGhBjpL,KAAKwM,IACd,EAEAxmB,EAAOS,UAAU27L,MAAQ,WAIvB,OAHApiL,KAAK4nL,UAAA,EACL5nL,KAAKinL,QAAQ72K,OAASpQ,KAAKonL,QAAQH,QAAQ72K,OAEpCpQ,KAAKwM,MACZ,KAAK,EACHxM,KAAKwnL,MAAQ,IAAIn2K,SAASrR,KAAKonL,QAAQI,MAAMz8K,OAAQ/K,KAAKinL,QAAQ72K,OAASpQ,KAAK8e,OAAO0oK,MAAMv8K,WAAajL,KAAKinL,QAAQ72K,QACvH,MACF,KAAK,EACDpQ,KAAKwnL,MAAQ,IAAIn2K,SAASrR,KAAKonL,QAAQI,MAAMz8K,OAAQ/K,KAAKinL,QAAQ72K,OAAQpQ,KAAK+oL,WACjF,MACF,QACI/oL,KAAKwnL,MAAQ,IAAIn2K,SAASrR,KAAKonL,QAAQI,MAAMz8K,OAAQ/K,KAAKinL,QAAQ72K,OAAQpQ,KAAKwM,MAanF,GAVAxM,KAAK2nL,WAAW,OAAQ,OAAQ,IAChC3nL,KAAK2nL,WAAW,OAAQ,SAAU,GAEhB,IAAd3nL,KAAKwM,MAAmBxM,KAAK2nL,WAAW,YAAa,OAAQ,IAC/C,SAAd3nL,KAAKrY,MAAmBqY,KAAK+nL,gBAAgB,WAAY,GAAI,OAAQ,GAErE/nL,KAAK2mL,eAAe3mL,KAAKrY,OAC3BqY,KAAK2mL,eAAe3mL,KAAKrY,MAAMf,KAAKoZ,OAGU,IAA5CA,KAAK0nL,eAAev1L,QAAQ6N,KAAKrY,MACnC,IAAK,IAAI+B,EAAI,EAAGA,EAAIsW,KAAKujK,MAAMx9K,OAAQ2D,IACrCsW,KAAKujK,MAAM75K,GAAG04L,QAUlB,OANIpiL,KAAKipL,OACPjpL,KAAKmpL,WAAWnpL,KAAKipL,OAGvBjpL,KAAKonL,QAAQH,QAAQ72K,QAAUpQ,KAAKwM,KAE7BxM,KAAKwM,IACd,EAEAxmB,EAAOS,UAAU2iM,UAAY,SAAS1/L,EAAMoN,GAC1C,GAAIkJ,KAAKwnL,MAAO,CACd,IAAIn6L,EAAS2S,KAAKinL,QAAQ72K,OAASpQ,KAAKwnL,MAAMx8K,WAC9C,OAAOthB,GACP,KAAK,EACHsW,KAAKwnL,MAAM6B,QAAQh8L,EAAQyJ,GAC3B,MACF,KAAK,GACHkJ,KAAKwnL,MAAM8B,SAASj8L,EAAQyJ,GAC5B,MACF,KAAK,GACHkJ,KAAKwnL,MAAM+B,SAASl8L,EAAQyJ,GAC5B,MACF,KAAK,GAGH,IAAIH,EAAK2B,KAAK2Q,MAAMnS,EAAQwB,KAAK+U,IAAI,EAAE,KACnCrnB,EAAK8Q,EAASH,EAAK2B,KAAK+U,IAAI,EAAE,IAClCrN,KAAKwnL,MAAMl2K,UAAUjkB,EAAQsJ,GAC7BqJ,KAAKwnL,MAAMl2K,UAAUjkB,EAAS,EAAGrH,GAGnCga,KAAKinL,QAAQ72K,QAAW1mB,GAAQ,CAClC,MACEsW,KAAKwM,MAAS9iB,GAAQ,CAE1B,EAEA1D,EAAOS,UAAU+iM,WAAa,SAAS9/L,EAAMoN,GAE3C,GAAIkJ,KAAKwnL,MAAO,CACd,IACIn6L,EAAIsJ,EADJ3Q,EAASga,KAAKinL,QAAQ72K,OAASpQ,KAAKwnL,MAAMx8K,WAE9C,OAAOthB,GACP,KAAK,EACHsW,KAAKwnL,MAAMiC,SAASzjM,EAAQ8Q,GAC5B,MACF,KAAK,GACHkJ,KAAKwnL,MAAMkC,UAAU1jM,EAAQ8Q,GAC7B,MACF,KAAK,GACHzJ,GAAc,SAARyJ,IAAqB,EAC3BH,EAAc,IAARG,EACNkJ,KAAKwnL,MAAMkC,UAAU1jM,EAAQqH,GAC7B2S,KAAKwnL,MAAMiC,SAASzjM,EAAS,EAAG2Q,GAChC,MACF,KAAK,GACHqJ,KAAKwnL,MAAMl2K,UAAUtrB,EAAQ8Q,GAC7B,MACF,KAAK,GAIHH,EAAKG,GADLzJ,EAAKiL,KAAK2Q,MAAMnS,EAAQwB,KAAK+U,IAAI,EAAE,MAChB/U,KAAK+U,IAAI,EAAE,IAC9BrN,KAAKwnL,MAAMl2K,UAAUtrB,EAAQqH,GAC7B2S,KAAKwnL,MAAMl2K,UAAUtrB,EAAS,EAAG2Q,GAGnCqJ,KAAKinL,QAAQ72K,QAAW1mB,GAAQ,CAClC,MACEsW,KAAKwM,MAAS9iB,GAAQ,CAE1B,EAEA1D,EAAOS,UAAUkjM,aAAe,SAASjgM,EAAMoN,GAC7C,IAAK,IAAIzJ,EAAI,EAAGA,EAAI3D,EAAM2D,IACxB2S,KAAKwpL,WAAW,EAAG1yL,EAAI0S,WAAWnc,GAEtC,EAEArH,EAAOS,UAAUmjM,uBAAyB,SAASlgM,GACjD,GAAmB,IAAfA,EAAI3D,OAAR,CAGA,IAAK,IAAI+Q,EAAI,EAAGA,EAAIpN,EAAI3D,OAAQ+Q,IAC9BkJ,KAAKwpL,WAAW,EAAG9/L,EAAI8f,WAAW1S,IAEpCkJ,KAAKwpL,WAAW,EAAG,EAJnB,CAKF,EAEAxjM,EAAOS,UAAUojM,eAAiB,SAASngM,EAAMoN,GAC/C,IAAIzJ,EAAMiL,KAAK2Q,MAAMnS,GACjBH,GAAQG,EAAQzJ,GAAOiL,KAAK+U,IAAI,EAAG3jB,EAAO,GAC9CsW,KAAKwpL,WAAW9/L,EAAO,EAAG2D,GAC1B2S,KAAKwpL,WAAW9/L,EAAO,EAAGiN,EAC5B,EAEA3Q,EAAOS,UAAU0iM,WAAa,SAASz/L,GAGrC,GAAIA,EACF,GAAIsW,KAAKwnL,MAAO,CAEd,GAAI99L,aAAgBxD,MAAO,CAEzB,IADA,IAAI4Q,EAASkJ,KAAKinL,QAAQ72K,OAASpQ,KAAKwnL,MAAMx8K,WACrC3d,EAAI,EAAGA,EAAI3D,EAAK3D,OAAQsH,IAC/B2S,KAAKwnL,MAAM6B,QAAQvyL,EAASzJ,EAAG3D,EAAK2D,IAEtC2S,KAAKinL,QAAQ72K,QAAU1mB,EAAK3D,MAC9B,CAEI2D,aAAgB2W,aAClBL,KAAKknL,MAAMr3K,MAAMtM,IAAI7Z,EAAMsW,KAAKinL,QAAQ72K,QACxCpQ,KAAKinL,QAAQ72K,QAAU1mB,EAAK3D,OAGhC,MAEEia,KAAKwM,MAAQ9iB,EAAK3D,MAGxB,EAEAC,EAAOS,UAAUqjM,iBAAmB,SAASpgM,GAC3C,IAAIoN,EAAIzJ,EAAS41K,MAAM8jB,gBAAgBr9L,GACvC,GAAIsW,KAAKwnL,MAEP,IADA,IAAI7wL,EAAW,IAAI0a,SAASrR,KAAKwnL,MAAMz8K,OAAQ/K,KAAKinL,QAAQ72K,OAAQtZ,EAAE/Q,QAC7DC,EAAI,EAAGA,EAAI8Q,EAAE/Q,OAAQC,IAC5B2Q,EAAS8yL,SAASzjM,EAAG8Q,EAAE9Q,SAGzBga,KAAKwM,MAAQ1V,EAAE/Q,MAEnB,EAEAC,EAAOS,UAAUqhM,YAAc,SAASp+L,EAAMoN,EAAMzJ,GAClD,OAAQ3D,GACR,IAAK,OACHsW,KAAKwpL,WAAW1yL,EAAMzJ,GACtB,MACF,IAAK,MACH2S,KAAKopL,UAAUtyL,EAAMzJ,GACrB,MACF,IAAK,WACH2S,KAAK6pL,eAAe/yL,EAAMzJ,GAC1B,MACF,IAAK,UACY,GAATyJ,EACFkJ,KAAK4pL,uBAAuBv8L,GAE5B2S,KAAK2pL,aAAa7yL,EAAMzJ,GAE1B,MACJ,IAAK,OACH2S,KAAKmpL,WAAW97L,GAChB,MACF,IAAK,OACH2S,KAAK8pL,iBAAiBz8L,GAK1B,EAGArH,EAAOS,UAAUkgM,eAAqBnyK,KACtCxuB,EAAOS,UAAUkgM,eAAqBlyK,KACtCzuB,EAAOS,UAAUkgM,eAAqBjyK,KACtC1uB,EAAOS,UAAUkgM,eAAqBhyK,KACtC3uB,EAAOS,UAAUkgM,eAAqBtxK,KACtCrvB,EAAOS,UAAUkgM,eAAqBvxK,KACtCpvB,EAAOS,UAAUkgM,eAAqBxxK,KAAI,WAExCnV,KAAK+nL,gBAAgB,YAAa,EAAM,OAAQ,GAChD/nL,KAAK2nL,WAAW,uBAAwB,OAAQ,IAEhD3nL,KAAK2nL,WAAW,eAAwB,OAAY,IACpD3nL,KAAK2nL,WAAW,YAAwB,OAAY,IACpD3nL,KAAK+nL,gBAAgB,eAAgB,EAAG,OAAY,IACpD/nL,KAAK2nL,WAAW,QAAwB,OAAY,IACpD3nL,KAAK2nL,WAAW,SAAwB,OAAY,IACpD3nL,KAAK2nL,WAAW,kBAAwB,WAAY,IACpD3nL,KAAK2nL,WAAW,iBAAwB,WAAY,IACpD3nL,KAAK2nL,WAAW,YAAwB,OAAY,IACpD3nL,KAAK2nL,WAAW,cAAwB,OAAY,IACpD3nL,KAAK+nL,gBAAgB,iBAAkB,GAAG,OAAW,GACrD/nL,KAAK2nL,WAAW,QAAwB,OAAY,IACpD3nL,KAAK2nL,WAAW,eAAwB,MAAY,IAEpD3nL,KAAK2nL,WAAW,SAAU,QAAS,EACrC,EAGA3hM,EAAOS,UAAUkgM,eAAqBoD,KAAI,WACxC/pL,KAAKgoL,eACLhoL,KAAK2nL,WAAW,cAAe,OAAQ,IACvC3nL,KAAKioL,aAAa,UAAWjoL,KAAKu/K,aAAa,SAAS71L,GACtDsW,KAAKmoL,gBAAgBz+L,EAAO,eAAgB,OAAQ,IACpDsW,KAAKmoL,gBAAgBz+L,EAAO,gBAAmC,IAAjBsW,KAAKrK,QAAiB,MAAQ,OAAQ,GACtF,GACF,EAGA3P,EAAOS,UAAUkgM,eAAqBt8I,KAAI,WACxCrqC,KAAKgoL,eACLhoL,KAAK2nL,WAAW,cAAe,OAAQ,IACvC3nL,KAAKooL,cAAc,UAAWpoL,KAAKu/K,YACrC,EAGAv5L,EAAOS,UAAUkgM,eAAqBqD,KAAI,WACxChqL,KAAKgoL,eACLhoL,KAAK2nL,WAAW,cAAe,OAAQ,IACvC3nL,KAAKioL,aAAa,UAAWjoL,KAAKu/K,aAAa,SAAS71L,GACtDsW,KAAKmoL,gBAAgBz+L,EAAO,mBAAwB,OAA0B,IAAjBsW,KAAKrK,QAAiB,GAAK,IACxFqK,KAAKmoL,gBAAgBz+L,EAAO,aAAwB,MAA0B,IAAjBsW,KAAKrK,QAAiB,GAAK,IACxFqK,KAAKmoL,gBAAgBz+L,EAAO,qBAAwB,MAAQ,IAC5DsW,KAAKmoL,gBAAgBz+L,EAAO,sBAAwB,MAAQ,GAC9D,GACF,EAGA1D,EAAOS,UAAUkgM,eAAqBsD,KAAI,WACxCjqL,KAAKgoL,eACe,GAAhBhoL,KAAKrK,SACPqK,KAAK2nL,WAAW,YAA4B,OAAU,IACtD3nL,KAAK2nL,WAAW,oBAA4B,OAAU,IACtD3nL,KAAK2nL,WAAW,iBAA4B,OAAU,IACtD3nL,KAAK2nL,WAAW,KAA4B,OAAU,IACtD3nL,KAAK2nL,WAAW,gBAA4B,UAAW,GACvD3nL,KAAK2nL,WAAW,QAA4B,UAAW,KAEvD3nL,KAAK2nL,WAAW,gBAA4B,UAAW,GACvD3nL,KAAK2nL,WAAW,QAA4B,UAAW,GACvD3nL,KAAK2nL,WAAW,YAA4B,OAAU,IACtD3nL,KAAK2nL,WAAW,0BAA4B,OAAU,IACtD3nL,KAAK2nL,WAAW,iBAA4B,OAAU,IACtD3nL,KAAK2nL,WAAW,KAA4B,OAAU,KAExD3nL,KAAK2nL,WAAW,eAA4B,QAAW,EACzD,EAEA3hM,EAAOS,UAAUkgM,eAAqBuD,KAAIlkM,EAAOS,UAAUkgM,eAAqBpiK,KAAI,WAClFvkB,KAAK2nL,WAAW,OAAQ,QAAS,EACnC,EAGA3hM,EAAOS,UAAUkgM,eAAqBwD,KAAI,WACxCnqL,KAAK2nL,WAAW,cAAe,OAAQ,GACzC,EAEA3hM,EAAOS,UAAUkgM,eAAqBp8I,KACtCvkD,EAAOS,UAAUkgM,eAAqByD,KAAI,WACxCpqL,KAAK2nL,WAAW,cAAe,SAAU,GACzC3nL,KAAK2nL,WAAW,gBAAiB,OAAQ,IACzC,IAAIj+L,GAAsB,EACtBsW,KAAK4nL,WACPl+L,GAAsBsW,KAAKmnL,KAAKl8K,YAAcjL,KAAKinL,QAAQ72K,OAASpQ,KAAKmnL,KAAKn8K,aAAe,GAE/FhL,KAAK+nL,gBAAgB,oBAAqBr+L,EAAoB,SAAU,EAC1E,EAGA1D,EAAOS,UAAUkgM,eAAqBn8I,KAAI,WACxCxqC,KAAKgoL,eACLhoL,KAAK2nL,WAAW,cAAoB,OAAU,IAC9C3nL,KAAK2nL,WAAW,eAAoB,SAAU,GAC9C3nL,KAAK+nL,gBAAgB,WAAY,EAAG,OAAQ,IAC5C/nL,KAAK2nL,WAAW,OAAoB,UAAW,EACjD,EAGA3hM,EAAOS,UAAUkgM,eAAqBl8I,KAAI,WACxCzqC,KAAK2nL,WAAW,OAAQ,QAAS,EACnC,EAGA3hM,EAAOS,UAAUkgM,eAAqBj8I,KAAI,WACxC1qC,KAAKgoL,eACLhoL,KAAK2nL,WAAW,gBAAsB,OAAyB,GAAhB3nL,KAAKrK,QAAgB,GAAK,IACzEqK,KAAK2nL,WAAW,oBAAsB,OAAyB,GAAhB3nL,KAAKrK,QAAgB,GAAK,IACzEqK,KAAK2nL,WAAW,YAAsB,OAAQ,IAC9C3nL,KAAK2nL,WAAW,WAAsB,OAAyB,GAAhB3nL,KAAKrK,QAAgB,GAAK,IACpEqK,KAAK4nL,UAAqC,iBAAlB5nL,KAAKm3C,WAEhCn3C,KAAKm3C,SAAan3C,KAAKm3C,SAAS3tC,WAAW,GAAK,IAAS,GACvCxJ,KAAKm3C,SAAS3tC,WAAW,GAAK,IAAS,EACvCxJ,KAAKm3C,SAAS3tC,WAAW,GAAK,IAElDxJ,KAAK2nL,WAAW,WAAsB,OAAQ,IAC1C3nL,KAAK4nL,WACP5nL,KAAKm3C,SAAWjsC,OAAOC,aAA8C,IAA/BnL,KAAKm3C,UAAY,GAAM,IACO,IAA9Bn3C,KAAKm3C,UAAY,EAAK,IACC,IAAR,GAAhBn3C,KAAKm3C,YAE5Cn3C,KAAK2nL,WAAW,cAAsB,OAAQ,GAChD,EAGA3hM,EAAOS,UAAUkgM,eAAqB0D,KAAI,WACxCrqL,KAAKgoL,eACLhoL,KAAK2nL,WAAW,oBAAqB,OAAyB,GAAhB3nL,KAAKrK,QAAgB,GAAK,GAC1E,EAGA3P,EAAOS,UAAUkgM,eAAqB/7I,KAAI,WACxC5qC,KAAKgoL,eACLhoL,KAAK2nL,WAAW,kBAAmB,OAAQ,GAC7C,EAGA3hM,EAAOS,UAAUkgM,eAAqB2D,KAAI,WACxCtqL,KAAKgoL,eACLhoL,KAAK2nL,WAAW,YAAa,OAAQ,GACvC,EAIA3hM,EAAOS,UAAUkgM,eAAqB9yK,KAAI7tB,EAAOS,UAAUkgM,eAAqB1zK,KAAI,WAElFjT,KAAK+nL,gBAAgB,YAAa,EAAM,OAAQ,GAChD/nL,KAAK2nL,WAAW,uBAAwB,OAAQ,IAEhD3nL,KAAK+nL,gBAAgB,YAAa,EAAM,OAAQ,IAChD/nL,KAAK2nL,WAAW,eAAwB,OAAQ,IAChD3nL,KAAK2nL,WAAW,aAAwB,OAAQ,IAChD3nL,KAAK2nL,WAAW,cAAwB,OAAQ,IAChD3nL,KAAK2nL,WAAW,YAAwB,OAAQ,IAChD3nL,KAAK2nL,WAAW,aAAwB,WAAY,IAEpD3nL,KAAK2nL,WAAW,OAAwB,QAAS,EACnD,EAGA3hM,EAAOS,UAAUkgM,eAAqBz7I,KAAI,WACxClrC,KAAKgoL,eACLhoL,KAAK2nL,WAAW,gBAAsB,OAA6B,GAAhB3nL,KAAKrK,QAAgB,GAAK,IAC7EqK,KAAK2nL,WAAW,oBAAsB,OAA6B,GAAhB3nL,KAAKrK,QAAgB,GAAK,IAC7EqK,KAAK2nL,WAAW,YAAsB,OAAY,IAClD3nL,KAAK2nL,WAAW,WAAsB,OAA6B,GAAhB3nL,KAAKrK,QAAgB,GAAK,IAC7EqK,KAAK2nL,WAAW,OAAsB,WAAY,IAClD3nL,KAAK2nL,WAAW,SAAsB,WAAY,IAClD3nL,KAAK2nL,WAAW,YAAsB,OAAS,IAC/C3nL,KAAK+nL,gBAAgB,YAAa,EAAI,OAAY,IAClD/nL,KAAK+nL,gBAAgB,SAAU,EAAO,WAAY,IAClD/nL,KAAK+nL,gBAAgB,cAAe,EAAE,OAAU,IAChD/nL,KAAK2nL,WAAW,gBAAsB,OAAY,GACpD,EAGA3hM,EAAOS,UAAUkgM,eAAqB4D,KAAI,WACxCvqL,KAAK2nL,WAAW,WAAY,OAC9B,EAGA3hM,EAAOS,UAAUkgM,eAAqB6D,KAAI,WACxCxqL,KAAKgoL,eACLhoL,KAAK2nL,WAAW,qBAAsB,OAAQ,IAC9C3nL,KAAK2nL,WAAW,oBAAqB,OAAQ,IAC7C3nL,KAAK2nL,WAAW,qBAAsB,OAAQ,IAC9C3nL,KAAK2nL,WAAW,aAAc,OAAyB,GAAhB3nL,KAAKrK,QAAgB,GAAK,GACnE,EAGA3P,EAAOS,UAAUkgM,eAAqB51K,KAAI,WACxC/Q,KAAKgoL,eAELhoL,KAAK+nL,gBAAgB,WAAY,GAAI,OAAQ,GAC7C/nL,KAAK2nL,WAAW,WAAY,OAAQ,IACpC3nL,KAAK+nL,gBAAgB,OAAQ/nL,KAAKyqL,SAAU,OAAQ,EACtD,EAEAzkM,EAAOS,UAAUkgM,eAAqB+D,KAAI,WACtC1qL,KAAKgoL,eAELhoL,KAAK2nL,WAAW,cAAe,OAAQ,IACvC3nL,KAAK2nL,WAAW,iBAAkB,OAAQ,IAEzB,EAAb3nL,KAAK1Z,OACL0Z,KAAK2nL,WAAW,aAAc,UAAW,EAEjD,EAEA3hM,EAAOS,UAAUkgM,eAAqBv7I,KAAI,WACxCprC,KAAKgoL,eAEL,IAAIt+L,GAAgB,EAChBsW,KAAK4nL,WACPl+L,EAAgBsW,KAAKmnL,KAAKl8K,YAAcjL,KAAKinL,QAAQ72K,OAASpQ,KAAKmnL,KAAKn8K,aAG1EhL,KAAK+nL,gBAAgB,0BAA2Br+L,EAAc,OAAQ,EACxE,EAGA1D,EAAOS,UAAUkgM,eAAqBgE,KAAI,WACxC3qL,KAAKgoL,eACLhoL,KAAK2nL,WAAW,eAAgB,OAAQ,IACxC3nL,KAAK2nL,WAAW,YAAa,OAAQ,IACrC3nL,KAAK2nL,WAAW,6BAA8B,OAAyB,GAAhB3nL,KAAKrK,QAAgB,GAAK,IACjFqK,KAAK2nL,WAAW,eAAgB,OAAyB,GAAhB3nL,KAAKrK,QAAgB,GAAK,IACnEqK,KAAK2nL,WAAW,WAAY,OAAQ,IACpC3nL,KAAK2nL,WAAW,kBAAmB,OAAQ,IAC3C3nL,KAAKioL,aAAa,aAAcjoL,KAAK4qL,iBAAiB,SAASlhM,GACxDsW,KAAK4nL,WACRl+L,EAAM+6J,WAAsC,EAAxB/6J,EAAM4wK,iBAAiC,GAC3D5wK,EAAM+6J,WAAsC,WAAxB/6J,EAAM6wK,gBAC1B7wK,EAAMmhM,KAAgC,EAAxBnhM,EAAMohM,kBAAiC,GACrDphM,EAAMmhM,MAAgC,EAAxBnhM,EAAMqhM,WAAiC,GACrDrhM,EAAMmhM,KAAgC,UAAxBnhM,EAAMshM,gBAEtBhrL,KAAKmoL,gBAAgBz+L,EAAO,YAAa,OAAQ,IACjDsW,KAAKmoL,gBAAgBz+L,EAAO,sBAAuB,OAAQ,IAC3DsW,KAAKmoL,gBAAgBz+L,EAAO,MAAO,OAAQ,IACvCsW,KAAK4nL,WACPl+L,EAAM4wK,eAAkB5wK,EAAM+6J,WAAa,GAAM,EACjD/6J,EAAM6wK,gBAAoC,WAAlB7wK,EAAM+6J,UAC9B/6J,EAAMohM,gBAAoBphM,EAAMmhM,KAAO,GAAM,EAC7CnhM,EAAMqhM,SAAYrhM,EAAMmhM,KAAO,GAAM,EACrCnhM,EAAMshM,eAA+B,UAAbthM,EAAMmhM,IAElC,GACF,EAGA7kM,EAAOS,UAAUkgM,eAAqBx6I,KAAI,WACxCnsC,KAAKgoL,eACLhoL,KAAK2nL,WAAW,UAAY,OAAQ,IACpC3nL,KAAK2nL,WAAW,WAAY,OAAQ,GACtC,EAGA3hM,EAAOS,UAAUkgM,eAAqBsE,KAAI,WACxCjrL,KAAKgoL,eACLhoL,KAAK2nL,WAAW,mBAAoB,OAAQ,IAC5C3nL,KAAKioL,aAAa,cAAejoL,KAAKkrL,kBAAkB,SAASxhM,GAC/DsW,KAAKmoL,gBAAgBz+L,EAAY,eAAgB,OAAQ,IACzDsW,KAAKkoL,gBAAgBx+L,EAAY,SAAUA,EAAWyhM,cAAc,SAASzhM,GAC3EsW,KAAKmoL,gBAAgBz+L,EAAO,QAAS,OAAQ,GAC7CsW,KAAKmoL,gBAAgBz+L,EAAO,aAAc,OAAQ,GACpD,GACF,GACF,EAGA1D,EAAOS,UAAUkgM,eAAqBn7I,KAAI,WACxCxrC,KAAKgoL,eACLhoL,KAAK2nL,WAAW,cAAe,OAAQ,IACvC3nL,KAAKooL,cAAc,UAAWpoL,KAAKu/K,YACrC,EAGAv5L,EAAOS,UAAUkgM,eAAqByE,KAAI,WACtCprL,KAAK2nL,WAAW,WAAY,OAChC,EAGA3hM,EAAOS,UAAUkgM,eAAqBj7I,KAAI,WACxC1rC,KAAKgoL,eACLhoL,KAAK2nL,WAAW,cAAe,OAAQ,IACvC3nL,KAAKioL,aAAa,UAAWjoL,KAAKu/K,aAAa,SAAS71L,GACtDsW,KAAKmoL,gBAAgBz+L,EAAO,eAAgB,OAAQ,IACpDsW,KAAKmoL,gBAAgBz+L,EAAO,eAAgB,OAAQ,GACtD,GACF,EAGA1D,EAAOS,UAAUkgM,eAAqB0E,KAAI,WACxCrrL,KAAKgoL,eACLhoL,KAAK2nL,WAAW,cAAe,OAAQ,IACvC3nL,KAAKioL,aAAa,UAAWjoL,KAAKu/K,aAAa,SAAS71L,GACtDsW,KAAKmoL,gBAAgBz+L,EAAO,eAAgB,OAAQ,IACpDsW,KAAKmoL,gBAAgBz+L,EAAO,kBAAmB,OAAQ,IACvDsW,KAAKkoL,gBAAgBx+L,EAAO,aAAcA,EAAM+1L,iBAAiB,SAAS/1L,GACxEsW,KAAKmoL,gBAAgBz+L,EAAW,iBAAkB,OAA0B,IAAjBsW,KAAKrK,QAAiB,GAAK,IACtFqK,KAAKmoL,gBAAgBz+L,EAAW,qBAAsB,OAAQ,GAC9DsW,KAAKmoL,gBAAgBz+L,EAAW,cAAe,OAAQ,GACvDsW,KAAKmoL,gBAAgBz+L,EAAW,4BAA6B,OAAQ,GACvE,GACF,GACF,EAGA1D,EAAOS,UAAUkgM,eAAqB2E,KAAI,WACtCtrL,KAAKgoL,eAELhoL,KAAK2nL,WAAW,sBAAuB,OAAQ,IAC/C3nL,KAAK2nL,WAAW,kBAAmB,OAAQ,GAC3C3nL,KAAK+nL,gBAAgB,cAAe,GAAO,OAAQ,EACtD,EAGD/hM,EAAOS,UAAUkgM,eAAqBh7I,KAAI,WACxC3rC,KAAKgoL,eACLhoL,KAAK2nL,WAAW,sBAAuB,OAAyB,GAAhB3nL,KAAKrK,QAAgB,GAAK,GAC5E,EAGA3P,EAAOS,UAAUkgM,eAAqB/6I,KAAI,WACxC5rC,KAAKgoL,eACLhoL,KAAK2nL,WAAW,WAAY,OAAQ,IACnB,EAAb3nL,KAAK1Z,OAAc0Z,KAAK2nL,WAAW,mBAA6B,OAAQ,IAC3D,EAAb3nL,KAAK1Z,OAAc0Z,KAAK2nL,WAAW,4BAA6B,OAAQ,IAC3D,EAAb3nL,KAAK1Z,OAAc0Z,KAAK2nL,WAAW,0BAA6B,OAAQ,IAC3D,GAAb3nL,KAAK1Z,OAAc0Z,KAAK2nL,WAAW,sBAA6B,OAAQ,IAC3D,GAAb3nL,KAAK1Z,OAAc0Z,KAAK2nL,WAAW,uBAA6B,OAAQ,GAC9E,EAGA3hM,EAAOS,UAAUkgM,eAAqB4E,KAAI,WACxCvrL,KAAKgoL,eACLhoL,KAAK2nL,WAAW,WAAY,OAAQ,IAC/B3nL,KAAK4nL,WACR5nL,KAAKwrL,SAAW,EAChBxrL,KAAKwrL,WAA6C,GAAhCxrL,KAAKyrL,0BAA0C,EACjEzrL,KAAKwrL,WAA6C,GAAhCxrL,KAAK0rL,0BAA0C,EACjE1rL,KAAKwrL,UAA+C,EAAlCxrL,KAAK2rL,2BAEzB3rL,KAAK2nL,WAAW,WAAY,OAAQ,IAChC3nL,KAAK4nL,WACP5nL,KAAKyrL,yBAA2C,GAAhBzrL,KAAKwrL,WAA0B,EAC/DxrL,KAAK0rL,yBAA2C,GAAhB1rL,KAAKwrL,WAA0B,EAC/DxrL,KAAK2rL,0BAA6C,EAAhB3rL,KAAKwrL,UAEzCxrL,KAAK2nL,WAAW,kBAAmB,OAAQ,IAC3C3nL,KAAKioL,aAAa,UAAWjoL,KAAK4rL,iBAAiB,SAASliM,GAC1DsW,KAAKmoL,gBAAgBz+L,EAAO,OAAQ,OAA0B,IAAjBsW,KAAKrK,QAAiB,GAAK,IACxEqK,KAAKmoL,gBAAgBz+L,EAAO,cAAe,OAA0B,IAAjBsW,KAAKrK,QAAiB,GAAK,IAC/EqK,KAAKmoL,gBAAgBz+L,EAAO,cAAe,OAA6C,GAApCsW,KAAKyrL,wBAA0B,IACnFzrL,KAAKmoL,gBAAgBz+L,EAAO,cAAe,OAA6C,GAApCsW,KAAK0rL,wBAA0B,IACnF1rL,KAAKmoL,gBAAgBz+L,EAAO,gBAAiB,OAA+C,GAAtCsW,KAAK2rL,0BAA4B,GACzF,GACF,EAGA3lM,EAAOS,UAAUkgM,eAAqB16I,KAAI,WACxCjsC,KAAKgoL,eACLhoL,KAAK2nL,WAAW,gBAAsB,OAA6B,GAAhB3nL,KAAKrK,QAAgB,GAAK,IAC7EqK,KAAK2nL,WAAW,oBAAsB,OAA6B,GAAhB3nL,KAAKrK,QAAgB,GAAK,IAC7EqK,KAAK2nL,WAAW,WAAsB,OAAY,IAClD3nL,KAAK2nL,WAAW,YAAsB,OAAY,IAClD3nL,KAAK2nL,WAAW,WAAsB,OAA6B,GAAhB3nL,KAAKrK,QAAgB,GAAK,IAC7EqK,KAAK+nL,gBAAgB,YAAa,EAAI,OAAY,IAClD/nL,KAAK2nL,WAAW,QAAsB,OAAY,IAClD3nL,KAAK2nL,WAAW,kBAAsB,OAAY,IAClD3nL,KAAK2nL,WAAW,SAAsB,WAAY,IAClD3nL,KAAK2nL,WAAW,YAAsB,OAAY,IAClD3nL,KAAK+nL,gBAAgB,SAAU,EAAO,WAAY,IAClD/nL,KAAK2nL,WAAW,QAAsB,WAAY,IAClD3nL,KAAK2nL,WAAW,SAAsB,WAAY,GACpD,EAGA3hM,EAAOS,UAAUkgM,eAAqB36I,KAAI,WACxChsC,KAAKgoL,eACLhoL,KAAK2nL,WAAW,WAAoC,OAAQ,IAC5D3nL,KAAK2nL,WAAW,mCAAoC,OAAQ,IAC5D3nL,KAAK2nL,WAAW,0BAAoC,OAAQ,IAC5D3nL,KAAK2nL,WAAW,sBAAoC,OAAQ,IAC5D3nL,KAAK2nL,WAAW,uBAAoC,OAAQ,GAC9D,EAKA3hM,EAAOS,UAAUkgM,eAAqB56I,KAAI,WACxC/rC,KAAKgoL,eACLhoL,KAAK2nL,WAAW,eAAgB,OAAQ,IACvB,EAAb3nL,KAAK1Z,OAAa0Z,KAAK2nL,WAAW,cAAe,MAAO,IAC3C,EAAb3nL,KAAK1Z,OAAa0Z,KAAK2nL,WAAW,qBAAsB,OAAQ,IACpE3nL,KAAKioL,aAAa,UAAWjoL,KAAK++K,cAAc,SAASr1L,GACtC,IAAbsW,KAAK1Z,OAAe0Z,KAAKmoL,gBAAgBz+L,EAAQ,kBAAmB,OAAQ,IAC/D,IAAbsW,KAAK1Z,OAAe0Z,KAAKmoL,gBAAgBz+L,EAAQ,cAAe,OAAQ,IAC3D,KAAbsW,KAAK1Z,OAAe0Z,KAAKmoL,gBAAgBz+L,EAAQ,eAAgB,OAAQ,IAC5D,KAAbsW,KAAK1Z,OAAe0Z,KAAKmoL,gBAAgBz+L,EAAQ,iCAAoD,IAAjBsW,KAAKrK,QAAiB,MAAQ,OAAS,GACjI,GACF,EAGA3P,EAAOS,UAAUkgM,eAAe,QAAU3gM,EAAOS,UAAUkgM,eAAe,QAAU,WAClF3mL,KAAKgoL,eACa,SAAdhoL,KAAKrY,MACPqY,KAAK2nL,WAAW,OAAQ,UAAW,GAErC3nL,KAAK2nL,WAAW,WAAY,UAAW,EACzC,EAGA3hM,EAAOS,UAAUkgM,eAAqBkF,KAAI,WACxC7rL,KAAK2nL,WAAW,eAAgB,OAClC,EAGA3hM,EAAOS,UAAUkgM,eAAqBz6I,KAAI,WACxClsC,KAAKgoL,eACLhoL,KAAK2nL,WAAW,eAAgB,OAAQ,IACxC3nL,KAAK+nL,gBAAgB,UAAW,EAAG,OAAQ,GAC7C,EAGA/hM,EAAOS,UAAUkgM,eAAqBmF,KAAI,WACxC9rL,KAAK2nL,WAAW,SAAU,OAC5B,EAGA3hM,EAAOS,UAAUkgM,eAAqBoF,KAAI,WAE1C,iBAAAriM,EAAAoN,EAAAzJ,GAAA,aC3rCA3D,EAAOhE,QAAU2H,EAAA,MAAA2+L,UAAA,gBAAAtiM,EAAAoN,EAAAzJ,GCM+C3D,EAAOhE,QAG/D,WAAe,aAOvB,SAASgE,EAAWA,GAClB,MAAoB,mBAANA,CAChB,CAIA,IASIoN,EARA5Q,MAAMC,QACGD,MAAMC,QAEN,SAAUuD,GACnB,MAA6C,mBAAtClD,OAAOC,UAAUC,SAASE,KAAK8C,EACxC,EAKEiN,EAAM,EACN3Q,OAAA,EACAJ,OAAA,EAEA2R,EAAO,SAAc7N,EAAUoN,GACjChJ,EAAM6I,GAAOjN,EACboE,EAAM6I,EAAM,GAAKG,EAEL,KADZH,GAAO,KAKD/Q,EACFA,EAAkBoI,GAElB+gB,IAGN,EAUInY,EAAkC,oBAAXlK,OAAyBA,YAAA,EAChDgL,EAAgBd,GAAiB,CAAC,EAClCzJ,EAA0BuK,EAAcu0L,kBAAoBv0L,EAAcw0L,uBAC1Er+L,EAAyB,oBAAT6R,MAA2C,oBAAZo9F,SAAyD,qBAA9B,CAAC,EAAEp2G,SAASE,KAAKk2G,SAG3F/vG,EAAwC,oBAAtBo/L,mBAA8D,oBAAlBC,eAA2D,oBAAnBC,eA0C1G,SAASt+L,IAGP,IAAIrE,EAAmB0I,WACvB,OAAO,WACL,OAAO1I,EAAiBsE,EAAO,EACjC,CACF,CAEA,IAAIF,EAAQ,IAAI5H,MAAM,KACtB,SAAS8H,IACP,IAAK,IAAItE,EAAI,EAAGA,EAAIiN,EAAKjN,GAAK,GAAG,EAChBoE,EAAMpE,IACXoE,EAAMpE,EAAI,IAIpBoE,EAAMpE,QAAA,EACNoE,EAAMpE,EAAI,QAAK,EAGjBiN,EAAM,CACR,CAYA,IAzCMnJ,EAZAJ,EACAoH,EACA4D,EAmDF2W,OAAA,EAcJ,SAASjP,EAAKpW,EAAeoN,GAC3B,IAAIzJ,EAAS2S,KAETrJ,EAAQ,IAAIqJ,KAAKla,YAAYD,QAAA,IAE7B8Q,EAAM+B,IACRyD,EAAYxF,GAGd,IAAI3Q,EAASqH,EAAO4sC,OAGpB,GAAIj0C,EAAQ,CACV,IAAIJ,EAAWoC,UAAUhC,EAAS,GAClCuR,GAAK,WACH,OAAOwK,EAAe/b,EAAQ2Q,EAAO/Q,EAAUyH,EAAO6wH,QACxD,GACF,MACEv+G,EAAUtS,EAAQsJ,EAAOjN,EAAeoN,GAG1C,OAAOH,CACT,CAiCA,SAAS6B,EAAU9O,GAIjB,GAAIA,GAA4B,iBAAXA,GAAuBA,EAAO5D,cAFjCka,KAGhB,OAAOtW,EAGT,IAAIoN,EAAU,IANIkJ,KAMYna,GAE9B,OADAuZ,EAAQtI,EAASpN,GACVoN,CACT,CA7EEiY,EADElhB,EAxEK,WACL,OAAOivG,QAAQwvF,SAASt+L,EAC1B,EAwESb,GAzDLC,EAAa,EACboH,EAAW,IAAIrH,EAAwBa,GACvCoK,EAAOzM,SAASymG,eAAe,IACnC59F,EAASinH,QAAQrjH,EAAM,CAAEm0L,eAAA,IAElB,WACLn0L,EAAKtI,KAAO1C,IAAeA,EAAa,CAC1C,GAoDSL,IA/CLS,EAAU,IAAI6+L,gBACVG,MAAMC,UAAYz+L,EACnB,WACL,OAAOR,EAAQk/L,MAAMt5I,YAAY,EACnC,YA6CSx8C,EAlBX,WACE,IACE,IAAIlN,EAAQsoD,SAAS,cAATA,GAA0BjrD,QAAQ,SAE9C,YAAO,KADPf,EAAY0D,EAAMijM,WAAajjM,EAAMkjM,cAvD9B,WACL5mM,EAAUgI,EACZ,EAGKD,GAsDP,CAFE,MAAOrE,GACP,OAAOqE,GACT,CACF,CARA,GAqBkBA,IAuElB,IAAI2K,EAAaJ,KAAKyhE,SAASrzE,SAAS,IAAImR,UAAU,GAEtD,SAAShS,IAAQ,CAEjB,IAAI4W,OAAA,EA+DJ,SAASgD,EAAoB3I,EAASzJ,EAAesJ,GAC/CtJ,EAAcvH,cAAgBgR,EAAQhR,aAAe6Q,IAAYmJ,GAAQzS,EAAcvH,YAAY4J,UAAY8I,EAfrH,SAA2B9O,EAASoN,GAhDpB,IAiDVA,EAASmjC,OACXr3B,EAAQlZ,EAASoN,EAASonH,SAjDf,IAkDFpnH,EAASmjC,OAClBp6B,EAAOnW,EAASoN,EAASonH,SAEzBv+G,EAAU7I,OAAA,GAAqB,SAAUA,GACvC,OAAOsI,EAAQ1V,EAASoN,EAC1B,IAAG,SAAUA,GACX,OAAO+I,EAAOnW,EAASoN,EACzB,GAEJ,CAZA,CAgBsBA,EAASzJ,QAAA,IAEvBsJ,EACFiM,EAAQ9L,EAASzJ,GACR3D,EAAWiN,GAjD1B,SAA+BjN,EAASoN,EAAUzJ,GAChDkK,GAAK,SAAU7N,GACb,IAAIiN,GAAA,EACA3Q,EAXR,SAAiB0D,EAASoN,EAAOzJ,EAAoBsJ,GACnD,IACEjN,EAAQ9C,KAAKkQ,EAAOzJ,EAAoBsJ,EAG1C,CAFE,MAAOjN,GACP,OAAOA,CACT,CACF,CANA,CAWwB2D,EAASyJ,GAAU,SAAUzJ,GAC3CsJ,IAGJA,GAAA,EACIG,IAAazJ,EACf+R,EAAQ1V,EAAS2D,GAEjBuV,EAAQlZ,EAAS2D,GAErB,IAAG,SAAUyJ,GACPH,IAGJA,GAAA,EAEAkJ,EAAOnW,EAASoN,GAClB,GAAiBpN,EAAQmjM,SAEpBl2L,GAAU3Q,IACb2Q,GAAA,EACAkJ,EAAOnW,EAAS1D,GAEpB,GAAG0D,EACL,CA3BA,CAkD4BoN,EAASzJ,EAAesJ,GAE9CiM,EAAQ9L,EAASzJ,EAGvB,CAEA,SAAS+R,EAAQ1V,EAASoN,GACxB,GAAIpN,IAAYoN,EACd+I,EAAOnW,EA1EF,IAAI2oD,UAAU,kDA2Ed,GAzSHrsD,SADoB2Q,EA0SIG,GAxSf,OAANH,GAAwB,WAAT3Q,GAA8B,aAATA,EAkTzC4c,EAAQlZ,EAASoN,OAViB,CAClC,IAAIzJ,OAAA,EACJ,IACEA,EAAUyJ,EAAM41B,IAIlB,CAHE,MAAO51B,GAEP,YADA+I,EAAOnW,EAASoN,EAElB,CACA2I,EAAoB/V,EAASoN,EAAOzJ,EACtC,CAnTF,IAA0BsJ,EACpB3Q,CAqTN,CAEA,SAAS4Z,EAAiBlW,GACpBA,EAAQojM,UACVpjM,EAAQojM,SAASpjM,EAAQw0H,SAG3Bv7G,EAAQjZ,EACV,CAEA,SAASkZ,EAAQlZ,EAASoN,GACpBpN,EAAQuwC,SAAWx9B,IAIvB/S,EAAQw0H,QAAUpnH,EAClBpN,EAAQuwC,OA3GM,EA6GsB,IAAhCvwC,EAAQqjM,aAAahnM,QACvBwR,EAAKoL,EAASjZ,GAElB,CAEA,SAASmW,EAAOnW,EAASoN,GACnBpN,EAAQuwC,SAAWx9B,IAGvB/S,EAAQuwC,OArHK,EAsHbvwC,EAAQw0H,QAAUpnH,EAElBS,EAAKqI,EAAkBlW,GACzB,CAEA,SAASiW,EAAUjW,EAAQoN,EAAOzJ,EAAesJ,GAC/C,IAAI3Q,EAAe0D,EAAOqjM,aACtBnnM,EAASI,EAAaD,OAG1B2D,EAAOojM,SAAW,KAElB9mM,EAAaJ,GAAUkR,EACvB9Q,EAAaJ,EApIC,GAoIqByH,EACnCrH,EAAaJ,EApIA,GAoIqB+Q,EAEnB,IAAX/Q,GAAgB8D,EAAOuwC,QACzB1iC,EAAKoL,EAASjZ,EAElB,CAEA,SAASiZ,EAAQjZ,GACf,IAAIoN,EAAcpN,EAAQqjM,aACtB1/L,EAAU3D,EAAQuwC,OAEtB,GAA2B,IAAvBnjC,EAAY/Q,OAAhB,CAQA,IAJA,IAAI4Q,OAAA,EACA3Q,OAAA,EACAJ,EAAS8D,EAAQw0H,QAEZ3mH,EAAI,EAAGA,EAAIT,EAAY/Q,OAAQwR,GAAK,EAC3CZ,EAAQG,EAAYS,GACpBvR,EAAW8Q,EAAYS,EAAIlK,GAEvBsJ,EACFoL,EAAe1U,EAASsJ,EAAO3Q,EAAUJ,GAEzCI,EAASJ,GAIb8D,EAAQqjM,aAAahnM,OAAS,CAjB9B,CAkBF,CAEA,SAASgc,EAAejL,EAASzJ,EAASsJ,EAAU3Q,GAClD,IAAIJ,EAAc8D,EAAWiN,GACzBY,OAAA,EACAX,OAAA,EACAc,GAAA,EAEJ,GAAI9R,EAAa,CACf,IACE2R,EAAQZ,EAAS3Q,EAInB,CAHE,MAAO0D,GACPgO,GAAA,EACAd,EAAQlN,CACV,CAEA,GAAI2D,IAAYkK,EAEd,YADAsI,EAAOxS,EA7KJ,IAAIglD,UAAU,wDAgLrB,MACE96C,EAAQvR,EAGNqH,EAAQ4sC,SAAWx9B,IAEZ7W,GAAe8R,EACxB0H,EAAQ/R,EAASkK,IAAA,IACRG,EACTmI,EAAOxS,EAASuJ,GAjMJ,IAkMHE,EACT8L,EAAQvV,EAASkK,GAlMN,IAmMFT,GACT+I,EAAOxS,EAASkK,GAEpB,CAcA,IAAIyJ,EAAK,EAKT,SAAS7E,EAAYzS,GACnBA,EAAQgP,GAAcsI,IACtBtX,EAAQuwC,YAAA,EACRvwC,EAAQw0H,aAAA,EACRx0H,EAAQqjM,aAAe,EACzB,CAMA,IAAI9rL,EAAa,WACf,SAASvX,EAAWA,EAAa2D,GAC/B2S,KAAKgtL,qBAAuBtjM,EAC5BsW,KAAK8mI,QAAU,IAAIp9I,EAAY7D,GAE1Bma,KAAK8mI,QAAQpuI,IAChByD,EAAY6D,KAAK8mI,SAGfhwI,EAAQzJ,IACV2S,KAAKja,OAASsH,EAAMtH,OACpBia,KAAKitL,WAAa5/L,EAAMtH,OAExBia,KAAKk+G,QAAU,IAAIh4H,MAAM8Z,KAAKja,QAEV,IAAhBia,KAAKja,OACP6c,EAAQ5C,KAAK8mI,QAAS9mI,KAAKk+G,UAE3Bl+G,KAAKja,OAASia,KAAKja,QAAU,EAC7Bia,KAAKktL,WAAW7/L,GACQ,IAApB2S,KAAKitL,YACPrqL,EAAQ5C,KAAK8mI,QAAS9mI,KAAKk+G,WAI/Br+G,EAAOG,KAAK8mI,QA5BT,IAAI5vI,MAAM,2CA8BjB,CA4EA,OA1EAxN,EAAWjD,UAAUymM,WAAa,SAAoBxjM,GACpD,IAAK,IAAIoN,EAAI,EAAGkJ,KAAKi6B,SAAWx9B,GAAW3F,EAAIpN,EAAM3D,OAAQ+Q,IAC3DkJ,KAAKmtL,WAAWzjM,EAAMoN,GAAIA,EAE9B,EAEApN,EAAWjD,UAAU0mM,WAAa,SAAoBzjM,EAAOoN,GAC3D,IAAIzJ,EAAI2S,KAAKgtL,qBACTr2L,EAAatJ,EAAEqC,QAGnB,GAAIiH,IAAe6B,EAAW,CAC5B,IAAIxS,OAAA,EACAJ,OAAA,EACA2R,GAAA,EACJ,IACEvR,EAAQ0D,EAAMgjC,IAIhB,CAHE,MAAOhjC,GACP6N,GAAA,EACA3R,EAAQ8D,CACV,CAEA,GAAI1D,IAAU8Z,GAAQpW,EAAMuwC,SAAWx9B,EACrCuD,KAAKotL,WAAW1jM,EAAMuwC,OAAQnjC,EAAGpN,EAAMw0H,cAClC,GAAqB,mBAAVl4H,EAChBga,KAAKitL,aACLjtL,KAAKk+G,QAAQpnH,GAAKpN,OACb,GAAI2D,IAAMkH,EAAW,CAC1B,IAAIqC,EAAU,IAAIvJ,EAAExH,GAChB0R,EACFsI,EAAOjJ,EAAShR,GAEhB6Z,EAAoB7I,EAASlN,EAAO1D,GAEtCga,KAAKqtL,cAAcz2L,EAASE,EAC9B,MACEkJ,KAAKqtL,cAAc,IAAIhgM,GAAE,SAAUyJ,GACjC,OAAOA,EAAWpN,EACpB,IAAIoN,EAER,MACEkJ,KAAKqtL,cAAc12L,EAAWjN,GAAQoN,EAE1C,EAEApN,EAAWjD,UAAU2mM,WAAa,SAAoB1jM,EAAOoN,EAAGzJ,GAC9D,IAAIsJ,EAAUqJ,KAAK8mI,QAGfnwI,EAAQsjC,SAAWx9B,IACrBuD,KAAKitL,aAnTI,IAqTLvjM,EACFmW,EAAOlJ,EAAStJ,GAEhB2S,KAAKk+G,QAAQpnH,GAAKzJ,GAIE,IAApB2S,KAAKitL,YACPrqL,EAAQjM,EAASqJ,KAAKk+G,QAE1B,EAEAx0H,EAAWjD,UAAU4mM,cAAgB,SAAuB3jM,EAASoN,GACnE,IAAIzJ,EAAa2S,KAEjBL,EAAUjW,OAAA,GAAoB,SAAUA,GACtC,OAAO2D,EAAW+/L,WAtUR,EAsU8Bt2L,EAAGpN,EAC7C,IAAG,SAAUA,GACX,OAAO2D,EAAW+/L,WAvUT,EAuU8Bt2L,EAAGpN,EAC5C,GACF,EAEOA,CACT,CAxGiB,GA0Yb6K,EAAY,WACd,SAASuC,EAAQpN,GACfsW,KAAKtH,GA1ZAsI,IA2ZLhB,KAAKk+G,QAAUl+G,KAAKi6B,YAAA,EACpBj6B,KAAK+sL,aAAe,GAEhBlnM,IAAS6D,IACS,mBAAbA,GAvHb,WACE,MAAM,IAAI2oD,UAAU,qFACtB,CAFA,GAwHMryC,gBAAgBlJ,EA9atB,SAA2BpN,EAASoN,GAClC,IACEA,GAAS,SAAwBA,GAC/BsI,EAAQ1V,EAASoN,EACnB,IAAG,SAAuBA,GACxB+I,EAAOnW,EAASoN,EAClB,GAGF,CAFE,MAAOA,GACP+I,EAAOnW,EAASoN,EAClB,CACF,CAVA,CA8akDkJ,KAAMtW,GApHxD,WACE,MAAM,IAAI2oD,UAAU,wHACtB,CAFA,GAsHE,CA2PA,OA/DAv7C,EAAQrQ,UAAUkmC,MAAQ,SAAgBjjC,GACxC,OAAOsW,KAAK0sB,KAAK,KAAMhjC,EACzB,EA0CAoN,EAAQrQ,UAAU6mM,QAAU,SAAkBx2L,GAC5C,IAAIzJ,EAAU2S,KACVrJ,EAActJ,EAAQvH,YAE1B,OAAI4D,EAAWoN,GACNzJ,EAAQq/B,MAAK,SAAUhjC,GAC5B,OAAOiN,EAAYjH,QAAQoH,KAAY41B,MAAK,WAC1C,OAAOhjC,CACT,GACF,IAAG,SAAUA,GACX,OAAOiN,EAAYjH,QAAQoH,KAAY41B,MAAK,WAC1C,MAAMhjC,CACR,GACF,IAGK2D,EAAQq/B,KAAK51B,EAAUA,EAChC,EAEOA,CACT,CAtQgB,GAuThB,OA/CAvC,EAAU9N,UAAUimC,KAAO5sB,EAC3BvL,EAAUxJ,IA1fV,SAAarB,GACX,OAAO,IAAIuX,EAAWjB,KAAMtW,GAASo9I,OACvC,EAyfAvyI,EAAUg5L,KAtbV,SAAc7jM,GAEZ,IAAI2D,EAAc2S,KAElB,OAAKlJ,EAAQpN,GAKJ,IAAI2D,GAAY,SAAUyJ,EAASH,GAExC,IADA,IAAI3Q,EAAS0D,EAAQ3D,OACZH,EAAI,EAAGA,EAAII,EAAQJ,IAC1ByH,EAAYqC,QAAQhG,EAAQ9D,IAAI8mC,KAAK51B,EAASH,EAElD,IATO,IAAItJ,GAAY,SAAU3D,EAAGoN,GAClC,OAAOA,EAAO,IAAIu7C,UAAU,mCAC9B,GASJ,EAuaA99C,EAAU7E,QAAU8I,EACpBjE,EAAU5E,OApYV,SAAkBjG,GAEhB,IACIoN,EAAU,IADIkJ,KACYna,GAE9B,OADAga,EAAO/I,EAASpN,GACToN,CACT,EA+XAvC,EAAUi5L,cA7iCV,SAAsB9jM,GACpB9D,EAAoB8D,CACtB,EA4iCA6K,EAAUk5L,SA1iCV,SAAiB/jM,GACf6N,EAAO7N,CACT,EAyiCA6K,EAAUm5L,MAAQn2L,EAqClBhD,EAAUy3L,SAlCV,WACE,IAAItiM,OAAA,EAEJ,QAAI,IAAO2D,EAAAS,EACTpE,EAAQ2D,EAAAS,OACH,GAAoB,oBAAT4R,KAChBhW,EAAQgW,UAER,IACEhW,EAAQsoD,SAAS,cAATA,EAGV,CAFE,MAAOtoD,GACP,MAAM,IAAIwN,MAAM,2EAClB,CAGF,IAAIJ,EAAIpN,EAAMuB,QAEd,GAAI6L,EAAG,CACL,IAAIH,EAAkB,KACtB,IACEA,EAAkBnQ,OAAOC,UAAUC,SAASE,KAAKkQ,EAAEpH,UAGrD,CAFE,MAAOhG,GAET,CAEA,GAAwB,qBAApBiN,IAA2CG,EAAE62L,KAC/C,MAEJ,CAEAjkM,EAAMuB,QAAUsJ,CAClB,EAIAA,EAAUtJ,QAAUsJ,EAEbA,CAEN,CAroCO,EAHyE,gBAAA7K,GAAA,aCcjF,IAOIoN,EAPAzJ,EAAuB,iBAAZ45E,QAAuBA,QAAU,KAC5CtwE,EAAetJ,GAAwB,mBAAZA,EAAE+d,MAC7B/d,EAAE+d,MACF,SAAsB1hB,EAAQoN,EAAUzJ,GACxC,OAAO2kD,SAASvrD,UAAU2kB,MAAMxkB,KAAK8C,EAAQoN,EAAUzJ,EACzD,EAIAyJ,EADEzJ,GAA0B,mBAAdA,EAAEugM,QACCvgM,EAAEugM,QACVpnM,OAAOqC,sBACC,SAAwBa,GACvC,OAAOlD,OAAOoC,oBAAoBc,GAC/BJ,OAAO9C,OAAOqC,sBAAsBa,GACzC,EAEiB,SAAwBA,GACvC,OAAOlD,OAAOoC,oBAAoBc,EACpC,EAOF,IAAI1D,EAAckS,OAAO8mB,OAAS,SAAqBt1B,GACrD,OAAOA,GAAUA,CACnB,EAEA,SAAS9D,IACPA,EAAaokD,KAAKpjD,KAAKoZ,KACzB,CACAtW,EAAOhE,QAAUE,EACjB8D,EAAOhE,QAAQ0sD,KAwYf,SAAc1oD,EAASoN,GACrB,OAAO,IAAI7L,SAAQ,SAAUoC,EAASsJ,GACpC,SAAS3Q,EAAcqH,GACrB3D,EAAQkpD,eAAe97C,EAAMlR,GAC7B+Q,EAAOtJ,EACT,CAEA,SAASzH,IAC+B,mBAA3B8D,EAAQkpD,gBACjBlpD,EAAQkpD,eAAe,QAAS5sD,GAElCqH,EAAQ,GAAG+S,MAAMxZ,KAAKoB,WACxB,CAEAwF,EAA+B9D,EAASoN,EAAMlR,EAAU,CAAEwsD,MAAA,IAC7C,UAATt7C,GAMR,SAAuCpN,EAASoN,GACpB,mBAAfpN,EAAQoyB,IACjBtuB,EAA+B9D,EAAS,QAASoN,EAPO,CAAEs7C,MAAA,GAS9D,CAJA,CALoC1oD,EAAS1D,EAE3C,GACF,EAxZAJ,EAAaotD,aAAeptD,EAE5BA,EAAaa,UAAU6rD,aAAA,EACvB1sD,EAAaa,UAAU8rD,aAAe,EACtC3sD,EAAaa,UAAUonM,mBAAA,EAIvB,IAAIt2L,EAAsB,GAE1B,SAASX,EAAclN,GACrB,GAAwB,mBAAbA,EACT,MAAM,IAAI2oD,UAAU,0EAA4E3oD,EAEpG,CAoCA,SAASgO,EAAiBhO,GACxB,gBAAIA,EAAKmkM,cACAjoM,EAAakoM,oBACfpkM,EAAKmkM,aACd,CAkDA,SAAS1gM,EAAazD,EAAQoN,EAAMzJ,EAAUsJ,GAC5C,IAAI3Q,EACAJ,EACA2R,EA1HsBpK,EAgJ1B,GApBAyJ,EAAcvJ,QAAA,KAEdzH,EAAS8D,EAAO4oD,UAEd1sD,EAAS8D,EAAO4oD,QAAU9rD,OAAO8D,OAAO,MACxCZ,EAAO6oD,aAAe,aAIlB3sD,EAAOmoM,cACTrkM,EAAO+4C,KAAK,cAAe3rC,EACfzJ,EAASwxD,SAAWxxD,EAASwxD,SAAWxxD,GAIpDzH,EAAS8D,EAAO4oD,SAElB/6C,EAAW3R,EAAOkR,SAAA,IAGhBS,EAEFA,EAAW3R,EAAOkR,GAAQzJ,IACxB3D,EAAO6oD,kBAeT,GAbwB,mBAAbh7C,EAETA,EAAW3R,EAAOkR,GAChBH,EAAU,CAACtJ,EAAUkK,GAAY,CAACA,EAAUlK,GAErCsJ,EACTY,EAASsiB,QAAQxsB,GAEjBkK,EAASkT,KAAKpd,IAIhBrH,EAAI0R,EAAiBhO,IACb,GAAK6N,EAASxR,OAASC,IAAMuR,EAASy2L,OAAQ,CACpDz2L,EAASy2L,QAAA,EAGT,IAAIngM,EAAI,IAAIqJ,MAAM,+CACEK,EAASxR,OAAS,IAAMmlB,OAAOpU,GADjC,qEAIlBjJ,EAAEhG,KAAO,8BACTgG,EAAEogM,QAAUvkM,EACZmE,EAAElG,KAAOmP,EACTjJ,EAAEuwH,MAAQ7mH,EAASxR,OA7KGoH,EA8KHU,EA7KnBqI,SAAWA,QAAQC,MAAMD,QAAQC,KAAKhJ,EA8KxC,CAGF,OAAOzD,CACT,CAaA,SAASmE,IACP,IAAKmS,KAAKkuL,MAGR,OAFAluL,KAAKguE,OAAOp7B,eAAe5yC,KAAKrY,KAAMqY,KAAKmuL,QAC3CnuL,KAAKkuL,OAAA,EACoB,IAArBlmM,UAAUjC,OACLia,KAAK6+C,SAASj4D,KAAKoZ,KAAKguE,QAC1BhuE,KAAK6+C,SAASzzC,MAAMpL,KAAKguE,OAAQhmF,UAE5C,CAEA,SAAS+E,EAAUrD,EAAQoN,EAAMzJ,GAC/B,IAAIsJ,EAAQ,CAAEu3L,OAAA,EAAcC,YAAA,EAAmBngH,OAAQtkF,EAAQ/B,KAAMmP,EAAM+nD,SAAUxxD,GACjFrH,EAAU6H,EAAYjE,KAAK+M,GAG/B,OAFA3Q,EAAQ64D,SAAWxxD,EACnBsJ,EAAMw3L,OAASnoM,EACRA,CACT,CAyHA,SAAS+H,EAAWrE,EAAQoN,EAAMzJ,GAChC,IAAIsJ,EAASjN,EAAO4oD,QAEpB,QAAI,IAAA37C,EACF,MAAO,GAET,IAAI3Q,EAAa2Q,EAAOG,GACxB,gBAAI9Q,EACK,GAEiB,mBAAfA,EACFqH,EAAS,CAACrH,EAAW64D,UAAY74D,GAAc,CAACA,GAElDqH,EAsDT,SAAyB3D,GAEvB,IADA,IAAIoN,EAAM,IAAI5Q,MAAMwD,EAAI3D,QACfsH,EAAI,EAAGA,EAAIyJ,EAAI/Q,SAAUsH,EAChCyJ,EAAIzJ,GAAK3D,EAAI2D,GAAGwxD,UAAYn1D,EAAI2D,GAElC,OAAOyJ,CACT,CANA,CArDoB9Q,GAAcgI,EAAWhI,EAAYA,EAAWD,OACpE,CAmBA,SAAS+H,EAAcpE,GACrB,IAAIoN,EAASkJ,KAAKsyC,QAElB,QAAI,IAAAx7C,EAAsB,CACxB,IAAIzJ,EAAayJ,EAAOpN,GAExB,GAA0B,mBAAf2D,EACT,OAAO,EACF,QAAI,IAAAA,EACT,OAAOA,EAAWtH,MAEtB,CAEA,OAAO,CACT,CAMA,SAASiI,EAAWtE,EAAKoN,GAEvB,IADA,IAAIzJ,EAAO,IAAInH,MAAM4Q,GACZH,EAAI,EAAGA,EAAIG,IAAKH,EACvBtJ,EAAKsJ,GAAKjN,EAAIiN,GAChB,OAAOtJ,CACT,CA2CA,SAASG,EAA+B9D,EAASoN,EAAMzJ,EAAUsJ,GAC/D,GAA0B,mBAAfjN,EAAQoyB,GACbnlB,EAAMy7C,KACR1oD,EAAQ0oD,KAAKt7C,EAAMzJ,GAEnB3D,EAAQoyB,GAAGhlB,EAAMzJ,OAEd,IAAwC,mBAA7B3D,EAAQgK,iBAYxB,MAAM,IAAI2+C,UAAU,6EAA+E3oD,GATnGA,EAAQgK,iBAAiBoD,GAAM,SAAS9Q,EAAaJ,GAG/C+Q,EAAMy7C,MACR1oD,EAAQ4G,oBAAoBwG,EAAM9Q,GAEpCqH,EAASzH,EACX,GAGF,CACF,CAraAY,OAAOmC,eAAe/C,EAAc,sBAAuB,CACzDkgE,YAAA,EACAhlD,IAAK,WACH,OAAOvJ,CACT,EACAgM,IAAK,SAAS7Z,GACZ,GAAmB,iBAARA,GAAoBA,EAAM,GAAK1D,EAAY0D,GACpD,MAAM,IAAI0nB,WAAW,kGAAoG1nB,EAAM,KAEjI6N,EAAsB7N,CACxB,IAGF9D,EAAaokD,KAAO,oBAEdhqC,KAAKsyC,SACLtyC,KAAKsyC,UAAY9rD,OAAOuC,eAAeiX,MAAMsyC,UAC/CtyC,KAAKsyC,QAAU9rD,OAAO8D,OAAO,MAC7B0V,KAAKuyC,aAAe,GAGtBvyC,KAAK6tL,cAAgB7tL,KAAK6tL,oBAAA,CAC5B,EAIAjoM,EAAaa,UAAU2nM,gBAAkB,SAAyB1kM,GAChE,GAAiB,iBAANA,GAAkBA,EAAI,GAAK1D,EAAY0D,GAChD,MAAM,IAAI0nB,WAAW,gFAAkF1nB,EAAI,KAG7G,OADAsW,KAAK6tL,cAAgBnkM,EACdsW,IACT,EAQApa,EAAaa,UAAU4nM,gBAAkB,WACvC,OAAO32L,EAAiBsI,KAC1B,EAEApa,EAAaa,UAAUg8C,KAAO,SAAc/4C,GAE1C,IADA,IAAIoN,EAAO,GACFzJ,EAAI,EAAGA,EAAIrF,UAAUjC,OAAQsH,IAAKyJ,EAAK2T,KAAKziB,UAAUqF,IAC/D,IAAIrH,EAAoB,UAAT0D,EAEX9D,EAASoa,KAAKsyC,QAClB,QAAI,IAAA1sD,EACFI,EAAWA,QAAA,IAAWJ,EAAOsP,WAC1B,IAAKlP,EACR,OAAO,EAGT,GAAIA,EAAS,CACX,IAAIuR,EAGJ,GAFIT,EAAK/Q,OAAS,IAChBwR,EAAKT,EAAK,IACRS,aAAcL,MAGhB,MAAMK,EAGR,IAAIX,EAAM,IAAIM,MAAM,oBAAsBK,EAAK,KAAOA,EAAG3B,QAAU,IAAM,KAEzE,MADAgB,EAAI1M,QAAUqN,EACRX,CACR,CAEA,IAAIc,EAAU9R,EAAO8D,GAErB,QAAI,IAAAgO,EACF,OAAO,EAET,GAAuB,mBAAZA,EACTf,EAAae,EAASsI,KAAMlJ,OAE5B,KAAI3J,EAAMuK,EAAQ3R,OACd8H,EAAYG,EAAW0J,EAASvK,GACpC,IAASE,EAAI,EAAGA,EAAIF,IAAOE,EACzBsJ,EAAa9I,EAAUR,GAAI2S,KAAMlJ,EAHX,CAM1B,OAAO,CACT,EAgEAlR,EAAaa,UAAUqsD,YAAc,SAAqBppD,EAAMoN,GAC9D,OAAO3J,EAAa6S,KAAMtW,EAAMoN,GAAA,EAClC,EAEAlR,EAAaa,UAAUq1B,GAAKl2B,EAAaa,UAAUqsD,YAEnDltD,EAAaa,UAAU6nM,gBACnB,SAAyB5kM,EAAMoN,GAC7B,OAAO3J,EAAa6S,KAAMtW,EAAMoN,GAAA,EAClC,EAoBJlR,EAAaa,UAAU2rD,KAAO,SAAc1oD,EAAMoN,GAGhD,OAFAF,EAAcE,GACdkJ,KAAK8b,GAAGpyB,EAAMqD,EAAUiT,KAAMtW,EAAMoN,IAC7BkJ,IACT,EAEApa,EAAaa,UAAU8nM,oBACnB,SAA6B7kM,EAAMoN,GAGjC,OAFAF,EAAcE,GACdkJ,KAAKsuL,gBAAgB5kM,EAAMqD,EAAUiT,KAAMtW,EAAMoN,IAC1CkJ,IACT,EAGJpa,EAAaa,UAAUmsD,eACnB,SAAwBlpD,EAAMoN,GAC5B,IAAIzJ,EAAMsJ,EAAQ3Q,EAAUJ,EAAG2R,EAK/B,GAHAX,EAAcE,QAAA,KAEdH,EAASqJ,KAAKsyC,SAEZ,OAAOtyC,KAGT,QAAI,KADJ3S,EAAOsJ,EAAOjN,IAEZ,OAAOsW,KAET,GAAI3S,IAASyJ,GAAYzJ,EAAKwxD,WAAa/nD,EACb,KAAtBkJ,KAAKuyC,aACTvyC,KAAKsyC,QAAU9rD,OAAO8D,OAAO,cAEtBqM,EAAOjN,GACViN,EAAOi8C,gBACT5yC,KAAKyiC,KAAK,iBAAkB/4C,EAAM2D,EAAKwxD,UAAY/nD,SAElD,GAAoB,mBAATzJ,EAAqB,CAGrC,IAFArH,GAAY,EAEPJ,EAAIyH,EAAKtH,OAAS,EAAGH,GAAK,EAAGA,IAChC,GAAIyH,EAAKzH,KAAOkR,GAAYzJ,EAAKzH,GAAGi5D,WAAa/nD,EAAU,CACzDS,EAAmBlK,EAAKzH,GAAGi5D,SAC3B74D,EAAWJ,EACX,KACF,CAGF,GAAII,EAAW,EACb,OAAOga,KAEQ,IAAbha,EACFqH,EAAK4iB,QAiIf,SAAmBvmB,EAAMoN,GACvB,KAAOA,EAAQ,EAAIpN,EAAK3D,OAAQ+Q,IAC9BpN,EAAKoN,GAASpN,EAAKoN,EAAQ,GAC7BpN,EAAK4wB,KACP,CAJA,CA/HoBjtB,EAAMrH,GAGE,IAAhBqH,EAAKtH,SACP4Q,EAAOjN,GAAQ2D,EAAK,aAElBsJ,EAAOi8C,gBACT5yC,KAAKyiC,KAAK,iBAAkB/4C,EAAM6N,GAAoBT,EAC1D,CAEA,OAAOkJ,IACT,EAEJpa,EAAaa,UAAU21B,IAAMx2B,EAAaa,UAAUmsD,eAEpDhtD,EAAaa,UAAUosD,mBACnB,SAA4BnpD,GAC1B,IAAIoN,EAAWzJ,EAAQsJ,EAGvB,QAAI,KADJtJ,EAAS2S,KAAKsyC,SAEZ,OAAOtyC,KAGT,QAAI,IAAA3S,EAAOulD,eAUT,OATyB,IAArB5qD,UAAUjC,QACZia,KAAKsyC,QAAU9rD,OAAO8D,OAAO,MAC7B0V,KAAKuyC,aAAe,YACXllD,EAAO3D,KACY,KAAtBsW,KAAKuyC,aACTvyC,KAAKsyC,QAAU9rD,OAAO8D,OAAO,aAEtB+C,EAAO3D,IAEXsW,KAIT,GAAyB,IAArBhY,UAAUjC,OAAc,CAC1B,IACIC,EADAJ,EAAOY,OAAOP,KAAKoH,GAEvB,IAAKsJ,EAAI,EAAGA,EAAI/Q,EAAKG,SAAU4Q,EAEjB,oBADZ3Q,EAAMJ,EAAK+Q,KAEXqJ,KAAK6yC,mBAAmB7sD,GAK1B,OAHAga,KAAK6yC,mBAAmB,kBACxB7yC,KAAKsyC,QAAU9rD,OAAO8D,OAAO,MAC7B0V,KAAKuyC,aAAe,EACbvyC,IACT,CAIA,GAAyB,mBAFzBlJ,EAAYzJ,EAAO3D,IAGjBsW,KAAK4yC,eAAelpD,EAAMoN,QACrB,QAAI,IAAAA,EAET,IAAKH,EAAIG,EAAU/Q,OAAS,EAAG4Q,GAAK,EAAGA,IACrCqJ,KAAK4yC,eAAelpD,EAAMoN,EAAUH,IAIxC,OAAOqJ,IACT,EAmBJpa,EAAaa,UAAUisD,UAAY,SAAmBhpD,GACpD,OAAOqE,EAAWiS,KAAMtW,GAAA,EAC1B,EAEA9D,EAAaa,UAAU+nM,aAAe,SAAsB9kM,GAC1D,OAAOqE,EAAWiS,KAAMtW,GAAA,EAC1B,EAEA9D,EAAa+sD,cAAgB,SAASjpD,EAASoN,GAC7C,MAAqC,mBAA1BpN,EAAQipD,cACVjpD,EAAQipD,cAAc77C,GAEtBhJ,EAAclH,KAAK8C,EAASoN,EAEvC,EAEAlR,EAAaa,UAAUksD,cAAgB7kD,EAiBvClI,EAAaa,UAAUgsD,WAAa,WAClC,OAAOzyC,KAAKuyC,aAAe,EAAIz7C,EAAekJ,KAAKsyC,SAAW,EAChE,iBAAA5oD,GAAA,aCvaA,IAAIoN,EAAU5Q,MAAMC,QAChBkH,EAAU7G,OAAOP,KACjB0Q,EAAUnQ,OAAOC,UAAUE,eAE/B+C,EAAOhE,QAAU,SAASgE,EAAM1D,EAAGJ,GACjC,GAAII,IAAMJ,EAAG,OAAO,EAEpB,GAAII,GAAKJ,GAAiB,iBAALI,GAA6B,iBAALJ,EAAe,CAC1D,IAEI2R,EACAX,EACAc,EAJAvK,EAAO2J,EAAQ9Q,GACf6H,EAAOiJ,EAAQlR,GAKnB,GAAIuH,GAAQU,EAAM,CAEhB,IADA+I,EAAS5Q,EAAED,SACGH,EAAEG,OAAQ,OAAO,EAC/B,IAAKwR,EAAIX,EAAgB,GAARW,KACf,IAAK7N,EAAM1D,EAAEuR,GAAI3R,EAAE2R,IAAK,OAAO,EACjC,OAAO,CACT,CAEA,GAAIpK,GAAQU,EAAM,OAAO,EAEzB,IAAId,EAAQ/G,aAAaub,KACrBxT,EAAQnI,aAAa2b,KACzB,GAAIxU,GAASgB,EAAO,OAAO,EAC3B,GAAIhB,GAASgB,EAAO,OAAO/H,EAAEwb,WAAa5b,EAAE4b,UAE5C,IAAI1T,EAAU9H,aAAaI,OACvB4H,EAAUpI,aAAaQ,OAC3B,GAAI0H,GAAWE,EAAS,OAAO,EAC/B,GAAIF,GAAWE,EAAS,OAAOhI,EAAEU,YAAcd,EAAEc,WAEjD,IAAI8G,EAAOH,EAAQrH,GAGnB,IAFA4Q,EAASpJ,EAAKzH,UAECsH,EAAQzH,GAAGG,OACxB,OAAO,EAET,IAAKwR,EAAIX,EAAgB,GAARW,KACf,IAAKZ,EAAQ/P,KAAKhB,EAAG4H,EAAK+J,IAAK,OAAO,EAExC,IAAKA,EAAIX,EAAgB,GAARW,KAEf,IAAK7N,EAAM1D,EADX0R,EAAMlK,EAAK+J,IACQ3R,EAAE8R,IAAO,OAAO,EAGrC,OAAO,CACT,CAEA,OAAO1R,GAAIA,GAAKJ,GAAIA,CACtB,iBAAA8D,EAAAoN,EAAAzJ,ICvBA,SAAW3D,EAASoN,EAAKzJ,EAAWsJ,EAAY3Q,GAinB5C,SAASJ,EAAoB8D,GAEzB,GAAO,aAAcA,EAMrB,IAJA,IAAIoN,GAAU,eAAgBpN,EAAUA,EAAQ+kM,WAAW93L,EAAW+3L,OAAOC,KAAKC,OAAS,MAEvFvhM,EAAoC,SAAjB3D,EAAQy2B,OAAgC,cAAZrpB,GAAuC,kBAAZA,GAA2C,kBAAZA,GAEpG9Q,EAAI0D,EAAQ27K,SAASt/K,OAAS,EAAGC,GAAK,EAAGA,KAE1CqH,GAAqB,eAAgB3D,EAAQ27K,SAASr/K,IAAM2Q,EAAW+3L,OAAOC,KAAKC,SAASllM,EAAQ27K,SAASr/K,GAAGyoM,WAQhH7oM,EAAoB8D,EAAQ27K,SAASr/K,WAJ9B0D,EAAQ27K,SAASr/K,EAUpC,CAEA,SAASuR,EAAc7N,EAAKoN,EAASzJ,EAAcsJ,GAI/C,IAAI3Q,EAAU2Q,GAAmC,QAAzBA,EAAOk4L,cAI3BjpM,EAAiB,EAEjB+Q,IAQI/Q,EANAI,GAAWqH,EAMMA,EAAamV,IAKb7L,EAAOm4L,OAQhCh4L,EAAQg4L,MAAQh4L,EAAQi4L,eAAiBj4L,EAAQi4L,eAAiBnpM,EAAiBA,EAKnF,IAAIgR,EAAeE,EAAQg4L,MAEvBp3L,EAAI,KAER,GAAI,SAAUZ,EAEV,IAAK,IAAI3J,EAAQ,EAAGA,EAAQ2J,EAAQk4L,KAAKjpM,OAAQoH,IAE7CoK,EAAc7N,EAAKoN,EAAQk4L,KAAK7hM,GAAQuK,EAAGZ,GAIvCF,EAF0B,QAA1BE,EAAQ+3L,cAEO/3L,EAAQk4L,KAAK7hM,GAAOqV,IAIpBlK,KAAKgN,IAAI1O,EAAcE,EAAQk4L,KAAK7hM,GAAOqV,KAI9D9K,EAAIZ,EAAQk4L,KAAK7hM,GAMzB,GAAM,aAAc2J,GAkBb,GAAI,aAAcA,EAErB,IAAK,IAAIjJ,EAAY,EAAGA,EAAYiJ,EAAQuuK,SAASt/K,OAAQ8H,IAEzD0J,EAAc7N,EAAKoN,EAAQuuK,SAASx3K,GAAY6J,EAAGZ,GAI/CF,EAF0B,QAA1BE,EAAQ+3L,cAEO/3L,EAAQuuK,SAASx3K,GAAW2U,IAI5BlK,KAAKgN,IAAI1O,EAAcE,EAAQuuK,SAASx3K,GAAW2U,KAItE9K,EAAIZ,EAAQuuK,SAASx3K,QA1BrB+I,EAJA5Q,EAIe8Q,EAAQg4L,MAMR52L,OAAO2oB,kBA6BD,OAAzB/pB,EAAQm4L,cAAkD,OAAzBn4L,EAAQo4L,aAEzCp4L,EAAQ0L,IAAMlK,KAAK+M,IAAIvO,EAAQg4L,MAAQh4L,EAAQo4L,aAActpM,EAAiBkR,EAAQm4L,cAEtD,OAAzBn4L,EAAQm4L,cAAkD,OAAzBn4L,EAAQo4L,aAEhDp4L,EAAQ0L,IAAM1L,EAAQg4L,MAAQh4L,EAAQo4L,aAEN,OAAzBp4L,EAAQm4L,cAAkD,OAAzBn4L,EAAQo4L,aAEhDp4L,EAAQ0L,IAAM5c,EAAiBkR,EAAQm4L,aAIvCn4L,EAAQ0L,IAAM5L,SAGXE,EAAQi4L,sBACRj4L,EAAQo4L,oBACRp4L,EAAQm4L,aAEfvlM,EAAIylM,eAAer4L,EAEvB,CAEA,SAASF,EAAelN,GACpBsW,KAAK09E,KAAOh0F,CAChB,CAEA,SAASgO,IACLsI,KAAKggG,OAAS,GACdhgG,KAAKioG,KAAO,IAAI96G,EAChB6S,KAAKgzB,KAAO,IAChB,CAkIA,SAAS7lC,IACL6S,KAAKovL,QAAU,IAAIvhM,EACnBmS,KAAKqvL,OAAS,IAAIvhM,CACtB,CAMA,SAASD,IACLmS,KAAKwjK,OAAS,CAAC,EACfxjK,KAAKsvL,SAAW,CAAC,CACrB,CAMA,SAASviM,IACLiT,KAAK2B,GAAK,KACV3B,KAAKyuL,WAAa,KAClBzuL,KAAKuvL,UAAY,IACrB,CAYA,SAASxhM,IACLiS,KAAKyuL,WAAa,IACtB,CA0BA,SAAS3gM,IACLkS,KAAKwvL,QAAU,CAAC,CACpB,CAMA,SAASxhM,EAAMtE,EAAKoN,GAChBtJ,EAAe5G,KAAKoZ,KAAM,SAC1BA,KAAKy8C,IAAM/yD,EACXsW,KAAKrY,KAAOmP,CAChB,CA4BA,SAAStJ,EAAe9D,GACpBsW,KAAKmgB,KAAOz2B,CAChB,CAEA,SAAS0D,EAAkB1D,GACvBsW,KAAK2B,GAAKjY,CACd,CAMA,SAAS8K,EAAc9K,GACnBsW,KAAKyvL,SAAW/lM,CACpB,CAMA,SAAS0O,EAAc1O,GACnBsW,KAAKyuL,WAAa/kM,CACtB,CAYA,SAASqlB,EAAgBrlB,GACrBsW,KAAKgvL,KAAOtlM,CAChB,CAMA,SAASoW,EAAiBpW,GACtBsW,KAAKqlK,SAAW37K,CACpB,CAMA,SAAS8O,EAAa9O,EAAgBoN,EAAczJ,GAChD2S,KAAK+uL,eAAiBrlM,EACtBsW,KAAKivL,aAAen4L,EACpBkJ,KAAKkvL,aAAe7hM,CACxB,CAkBA,SAASqL,IACLlL,EAAe5G,KAAKoZ,KAAM,OAC9B,CAiBA,SAASna,IACL2H,EAAe5G,KAAKoZ,KAAM,MAC9B,CAgBA,SAASvD,IACLjP,EAAe5G,KAAKoZ,KAAM,IAC9B,CAgBA,SAASP,IACLjS,EAAe5G,KAAKoZ,KAAM,OAC9B,CAiBA,SAASZ,IACL5R,EAAe5G,KAAKoZ,KAAM,OAC9B,CAcA,SAASJ,IACLpS,EAAe5G,KAAKoZ,KAAM,KAC9B,CAcA,SAAS4C,IACT,CAsCA,SAAS/C,IACT,CAmCA,SAASF,EAAgBjW,GACrB,OAAOA,GAAQ,WAAYA,EAAKsmK,YAAatmK,EAAKsmK,WAAW,UAAUx+J,OAAgB,IAC3F,CA4BA,SAASmR,EAAoBjZ,GAEzB,OAAOA,GAAQ,UAAWA,EAAKsmK,WAAatmK,EAAKsmK,WAAWljF,MAAMt7E,MAAMuG,MAAM,KAAO,EAEzF,CAEA,SAASgK,EAAiBrY,EAAMoN,GAE5B,IAAIzJ,EAAI,CAAC,EAET,GAAa,OAAT3D,EAEA,IAAK,IAAI1D,KAAK0D,EAAKsmK,WAAY,CAE3B,IAAIpqK,EAAQ8D,EAAKsmK,WAAWhqK,GAAGyqB,IAAM,IAAM/mB,EAAKsmK,WAAWhqK,GAAG0pM,MAE1Dn4L,EAAKZ,EAAWg5L,QAAQ/pM,GAE5B,QAAI,IAAA2R,EAAkB,CAElB,IAAIX,EAAMW,EAAGojB,MAAMjxB,EAAKsmK,WAAWhqK,GAAGwL,OAE1B,OAARoF,GAEAvJ,EAAEzH,GAASgR,EAIPW,IAAOZ,EAAW+3L,OAAOziH,QACzBppE,EAAc/L,EAAc,gFAKhCojB,EAAYpjB,EAAc,kCAAoClR,EAAQ,WAAU8D,EAAKsmK,WAAWhqK,GAAGwL,MAI3G,CAEJ,CAIJ,OAAOnE,CACX,CAEA,SAAS2T,EAActX,EAAMoN,EAAIzJ,GAC7B,IAAK,IAAIsJ,KAAKjN,EAAKsmK,WAEf,GAAItmK,EAAKsmK,WAAWr5J,GAAG8Z,MAAQ3Z,GACvBpN,EAAKsmK,WAAWr5J,GAAG+4L,QAAUriM,EAEjC,OAAO3D,EAAKsmK,WAAWr5J,GAAGnF,MAIlC,OAAO,IACX,CA+MA,SAAS2K,EAAoBzS,EAAUoN,EAAoBzJ,GAEvD,IAQIsJ,EACA3Q,EAAI,KAmDR,OAlDwC,QAAnC2Q,EARiB,qBAQGc,KAAKpK,IAEC,OAAvByJ,IAEA9Q,EAAIwa,WAAW7J,EAAE,IAAMG,GAGe,QAAlCH,EAdS,qBAcUc,KAAKpK,IAEf,OAAb3D,IAEA1D,EAAIwa,WAAW7J,EAAE,IAAMjN,GAGa,QAAhCiN,EApBO,sBAoBUc,KAAKpK,IAE9BrH,EAAIwa,WAAW7J,EAAE,IAAM,IAEgB,QAA/BA,EAvBM,qBAuBUc,KAAKpK,IAE7BrH,EAAIwa,WAAW7J,EAAE,IAEsB,QAA/BA,EA1BM,qBA0BUc,KAAKpK,IAE7BrH,EAAuB,KAAnBwa,WAAW7J,EAAE,IAEsB,QAA/BA,EA7BM,qBA6BUc,KAAKpK,IAE7BrH,EAAuB,GAAnBwa,WAAW7J,EAAE,IAEiC,QAA1CA,EAxCiB,qCAwCUc,KAAKpK,IAExCrH,EAAqB,KAAjBka,SAASvJ,EAAE,IACU,GAAjBuJ,SAASvJ,EAAE,IACX6J,WAAW7J,EAAE,IAE2B,QAAxCA,EA7Ce,qCA6CUc,KAAKpK,KAIX,OAAvByJ,IAEA9Q,EAAqB,KAAjBka,SAASvJ,EAAE,IACU,GAAjBuJ,SAASvJ,EAAE,IACXuJ,SAASvJ,EAAE,KACD,OAATA,EAAE,GAAc,EAAIuJ,SAASvJ,EAAE,IAAMG,IAK/C9Q,CACX,CA4DA,SAASib,EAAmBvX,EAASoN,EAAOzJ,GAExC,KAAOyJ,EAAMy4L,UAAUxpM,OAAS,GAAG,CAE/B,IAAI4Q,EAAOG,EAAMy4L,UAAUj1K,MAErB3jB,KAAQjN,EAAQ85K,QAKtBviK,EAAmBvX,EAASA,EAAQ85K,OAAO7sK,GAAOtJ,GAElDL,EAAwBtD,EAAQ85K,OAAO7sK,GAAM83L,WAAY33L,EAAM23L,aAN3Dv0K,EAAY7sB,EAAc,mCAQlC,CAEJ,CAEA,SAASkH,EAAsB7K,EAASoN,EAAWzJ,EAAYsJ,GAE3D,IAAK,IAAI3Q,EAAI8Q,EAAU/Q,OAAS,EAAGC,GAAK,EAAGA,IAAK,CAE5C,IAAIJ,EAAOkR,EAAU9Q,GAEfJ,KAAQ8D,EAAQ85K,OAKtBx2K,EAAwBtD,EAAQ85K,OAAO59K,GAAM6oM,WAAYphM,GAJrD6sB,EAAYvjB,EAAc,mCAMlC,CAEJ,CAEA,SAAS3J,EAAwBtD,EAAaoN,GAE1C,IAAK,IAAIzJ,KAAS3D,EAERA,EAAY/C,eAAe0G,KAE7BA,KAASyJ,IAGbA,EAAYzJ,GAAS3D,EAAY2D,IAIzC,CAiBA,SAASwV,EAAcnZ,EAAcoN,GAEjC,GAAIpN,GAAgBA,EAAayM,MAAQzM,EAAayM,KAAKW,GACvD,MAAMA,CAEd,CAEA,SAASojB,EAAYxwB,EAAcoN,GAE/B,GAAIpN,GAAgBA,EAAawL,OAASxL,EAAawL,MAAM4B,GACzD,MAAMA,CAEd,CAEA,SAASgM,EAAYpZ,EAAcoN,GAK/B,MAHIpN,GAAgBA,EAAai1B,OAC7Bj1B,EAAai1B,MAAM7nB,GAEjBA,CAEV,CAYA,SAAS0M,EAAQ9Z,EAAKoN,GAMlB,IAJA,IAEIzJ,EAFAsJ,EAAM,EACN3Q,EAAM0D,EAAI3D,OAAS,EAGhB4Q,GAAO3Q,GAAK,CAIf,IAAIJ,EAAS8D,EAFb2D,EAAMiL,KAAK2Q,OAAOtS,EAAM3Q,GAAO,IAI/B,GAAIJ,EAASkR,EAETH,EAAMtJ,EAAM,MAET,MAAIzH,EAASkR,GAMhB,MAAO,CAACw8I,OAAA,EAAavtI,MAAO1Y,GAJ5BrH,EAAMqH,EAAM,CAMhB,CAEJ,CAEA,MAAO,CAACimJ,OAAA,EAAcvtI,MAAOpP,EACjC,CAhvDAjN,EAAQ49K,QAAU,SAAU59K,EAAW1D,EAAcwH,GACjD,IAAIJ,EAAI0J,EAAIinG,QAAA,EAAa,CAAC6xF,OAAA,IACtBp7L,EAAS,GACT4D,EAAe,GACf2W,EAAgB,GAChBjP,EAAiB,EACjBtH,EAAM,KAEVpL,EAAEyiM,WAAa,SAAUnmM,GAGrB,GAAI8K,EAAO,aAAcoO,EAIJ,OAAbpK,EAAIyvG,MAAsC,OAArBzvG,EAAIyvG,KAAKmnF,SAC9B76L,EAAsBiE,EAAIyvG,KAAKmnF,QAAS56L,EAAO,GAAG+6L,UAAW/6L,EAAO,GAAGi6L,WAAYzoM,UAGhFwO,EAAO,GAAG+6L,eAEd,GAAI/6L,EAAO,aAAc3G,EAI5B,IAAK,IAAIiJ,KAAOtC,EAAO,GAAGgvK,OAEhBhvK,EAAO,GAAGgvK,OAAO78K,eAAemQ,IAEtCmK,EAAmBzM,EAAO,GAAIA,EAAO,GAAGgvK,OAAO1sK,GAAM9Q,QAItD,GAAIwO,EAAO,aAAciI,GAAKjI,EAAO,aAAciL,EAAM,CAI5D,GAAIjL,EAAO,GAAG6wK,SAASt/K,OAAS,EAAG,CAE/B,IAEI4Q,EAFA/Q,EAAK,CAAC4O,EAAO,GAAG6wK,SAAS,IAI7B,IAAK1uK,EAAI,EAAGA,EAAInC,EAAO,GAAG6wK,SAASt/K,OAAQ4Q,IAEnCnC,EAAO,GAAG6wK,SAAS1uK,aAAcyI,GAC7BxZ,EAAGA,EAAGG,OAAS,aAAcqZ,EAEjCxZ,EAAGA,EAAGG,OAAS,GAAG0nB,MAAQjZ,EAAO,GAAG6wK,SAAS1uK,GAAG8W,KAIhD7nB,EAAG6kB,KAAKjW,EAAO,GAAG6wK,SAAS1uK,IAMnCnC,EAAO,GAAG6wK,SAAWz/K,CAEzB,CAII4O,EAAO,aAAciL,GACa,IAA9BjL,EAAO,GAAG6wK,SAASt/K,QACnByO,EAAO,GAAG6wK,SAAS,aAAcjmK,IAErC5K,EAAO,GAAGiZ,KAAOjZ,EAAO,GAAG6wK,SAAS,GAAG53J,YAChCjZ,EAAO,GAAG6wK,SAIzB,MAAW7wK,EAAO,aAAcoC,IAExBpC,EAAO,GAAGkpF,KAAKjtE,MAAQpjB,EAAUyiM,OACJ,aAAzBt7L,EAAO,GAAGkpF,KAAKgyG,MAInB5vL,IAEOA,EAAiB,GACpBtS,GACA,eAAgBA,GAIpBA,EAAgB25K,cAUxBp4J,EAAckB,QAId7X,EAAa6X,QAIbzb,EAAOyb,OACX,EAEA7iB,EAAE2iM,OAAS,SAAUrmM,GAEjB,QAAI,IAAA8K,EAAO,SAIJ,GAAIA,EAAO,aAAciL,GAAQjL,EAAO,aAAciI,EAAG,CAI5D,GAAIjI,EAAO,aAAciL,EAAM,CAE3B,IAAI3I,EAAOtC,EAAO,GAAGi6L,WAAW93L,EAAW+3L,OAAOC,KAAKC,OAEvD,GAAa,cAAT93L,GAAiC,kBAATA,GAAqC,kBAATA,EAEpD,MAIR,CAIA,IAAIzJ,EAAI,IAAI+R,EAEZ/R,EAAE2iM,aAAax3L,EAAKhE,EAAO,GAAI9K,EAAK0O,EAAa,GAAI2W,EAAc,GAAI/oB,GAEvEwO,EAAO,GAAG6wK,SAAS56J,KAAKpd,EAE5B,MAAWmH,EAAO,aAAcoC,GACxBkJ,EAAiB,GACjBtS,GACA,WAAYA,GAIhBA,EAAgB45K,OAAO19K,EAI/B,EAGA0D,EAAE6iM,UAAY,SAAUvmM,GAIpB,IAAIoN,EAAWpN,EAAKsmK,WAAW,aAE3Bl5J,EAEAiY,EAAc8K,QAAQ/iB,EAAStF,OAIF,IAAzBud,EAAchpB,OAEdgpB,EAAc8K,QAAQ,WAItB9K,EAAc8K,QAAQ9K,EAAc,IAS5C,IAAInpB,EAAU8D,EAAKsmK,WAAW,YAuB9B,GArBIpqK,EAEAwS,EAAayhB,QAAQj0B,EAAQ4L,OAID,IAAxB4G,EAAarS,OAEbqS,EAAayhB,QAAQ,IAIrBzhB,EAAayhB,QAAQzhB,EAAa,IAStC1O,EAAK+mB,MAAQpjB,EAAUyiM,MAEvB,GAAmB,OAAfpmM,EAAKgmM,MAEO,OAARl3L,GAEAsK,EAAY9c,EAAc,yBAA2Bga,KAAKonD,KAAO,IAAMpnD,KAAKkjG,OAAS,MAIzF1qG,EAAM,IAAId,GAENw4L,aAAaxmM,EAAM0O,EAAa,GAAIpS,GAExCwO,EAAOqlB,QAAQrhB,QAEZ,GAAmB,SAAf9O,EAAKgmM,MAENl7L,EAAO,aAAckD,GACvBoL,EAAY9c,EAAc,4CAA8Cga,KAAKonD,KAAO,IAAMpnD,KAAKkjG,OAAS,KAG5G1uG,EAAOqlB,QAAQrhB,EAAIyvG,WAEhB,GAAmB,YAAfv+G,EAAKgmM,MAENl7L,EAAO,aAAcrH,GACvB2V,EAAY9c,EAAc,iDAAmDga,KAAKonD,KAAO,IAAMpnD,KAAKkjG,OAAS,KAGjH1uG,EAAOqlB,QAAQrhB,EAAIyvG,KAAKmnF,cAErB,GAAmB,UAAf1lM,EAAKgmM,MAAmB,CAE/B,IAAIn4L,EAEA/C,EAAO,aAAc3G,IAErB0J,EAAI,IAAIxK,GAENmjM,aAAaxmM,EAAM1D,GAIhBuR,EAAEoK,GAMHnJ,EAAIyvG,KAAKmnF,QAAQ5rB,OAAOjsK,EAAEoK,IAAMpK,EAJhC2iB,EAAYl0B,EAAc,yCAQ9BwO,EAAOqlB,QAAQtiB,IAER/C,EAAO,aAAcoO,IAO5BrL,EAAI,IAAIxK,GAENmjM,aAAaxmM,EAAM1D,GAErBgH,EAAwBuK,EAAEk3L,WAAYj6L,EAAO,GAAGi6L,YAEhDj6L,EAAOqlB,QAAQtiB,IAIfuL,EAAY9c,EAAc,8DAAgEga,KAAKonD,KAAO,IAAMpnD,KAAKkjG,OAAS,IAIlI,MAAQ,GAAmB,YAAfx5G,EAAKgmM,MAAqB,CAElC,IAAItiM,EAEJ,GAAIoH,EAAO,aAAc3G,EAAS,CAM9B,IAAK,IAAIuR,KAJThS,EAAM,IAAIW,GAENmiM,aAAaxmM,EAAM1D,GAERoH,EAAIqhM,WAETrhM,EAAIqhM,WAAW9nM,eAAeyY,KAEpC5G,EAAIyvG,KAAKmnF,QAAQE,SAASlwL,GAAMhS,EAAIqhM,WAAWrvL,IAInD5K,EAAOqlB,QAAQzsB,EAEnB,MAEI0V,EAAY9c,EAAc,oDAAsDga,KAAKonD,KAAO,IAAMpnD,KAAKkjG,OAAS,IAIxH,MAAO,GAAmB,WAAfx5G,EAAKgmM,MAENl7L,EAAO,aAAcrH,GAEvB2V,EAAY9c,EAAc,+CAAiDga,KAAKonD,KAAO,IAAMpnD,KAAKkjG,OAAS,KAI/G1uG,EAAOqlB,QAAQrhB,EAAIyvG,KAAKonF,aAErB,GAAmB,WAAf3lM,EAAKgmM,MAAoB,CAE1Bl7L,EAAO,aAAc1G,GACvBgV,EAAY9c,EAAc,iDAAmDga,KAAKonD,KAAO,IAAMpnD,KAAKkjG,OAAS,KAGjH,IAAIvjG,EAAI,IAAIiD,EAEZjD,EAAEuwL,aAAa13L,EAAK9O,EAAM0O,EAAa,GAAIpS,IAEtC2Z,EAAEgC,IAAMhC,EAAEgC,MAAMnJ,EAAIyvG,KAAKonF,OAAOG,QAEjCt1K,EAAYl0B,EAAc,sDAAwDga,KAAKonD,KAAO,IAAMpnD,KAAKkjG,OAAS,KAIlH1qG,EAAIyvG,KAAKonF,OAAOG,QAAQ7vL,EAAEgC,IAAMhC,EAIpCnL,EAAOqlB,QAAQla,EAEnB,MAAO,GAAmB,SAAfjW,EAAKgmM,MAAkB,CAExBl7L,EAAO,aAAckD,GAEvBoL,EAAY9c,EAAc,2CAA6Cga,KAAKonD,KAAO,IAAMpnD,KAAKkjG,OAAS,KAI1F,OAAb1qG,EAAIw6B,MAEJlwB,EAAY9c,EAAc,4BAA8Bga,KAAKonD,KAAO,IAAMpnD,KAAKkjG,OAAS,KAI5F,IAAIvgG,EAAI,IAAIjK,EAEZiK,EAAEutL,aAAa13L,EAAK9O,EAAM0O,EAAa,GAAIpS,GAE3CwS,EAAIw6B,KAAOrwB,EAEXnO,EAAOqlB,QAAQlX,EAEnB,MAAO,GAAmB,QAAfjZ,EAAKgmM,MAAiB,CAEvBl7L,EAAO,aAAc3O,GAAO2O,EAAO,aAAckE,GAEnDoK,EAAY9c,EAAc,qDAAuDga,KAAKonD,KAAO,IAAMpnD,KAAKkjG,OAAS,KAIrH,IAAInhG,EAAI,IAAIlc,EAEZkc,EAAEmuL,aAAa13L,EAAKhE,EAAO,GAAI9K,EAAM0O,EAAa,GAAIpS,GAItD,IAAIgb,EAAKe,EAAE0sL,WAAW93L,EAAW+3L,OAAO78E,gBAAgB+8E,OAEpD5tL,IACAe,EAAEsjK,SAAS56J,KAAK,IAAIzc,EAAMgT,WACnBe,EAAE0sL,WAAW93L,EAAW+3L,OAAO78E,gBAAgB+8E,QAG1Dp6L,EAAO,GAAG6wK,SAAS56J,KAAK1I,GAExBvN,EAAOqlB,QAAQ9X,EAEnB,MAAO,GAAmB,UAAfrY,EAAKgmM,MAAmB,CAEzBl7L,EAAO,aAAc3O,GAEvBid,EAAY9c,EAAc,6CAA+Cga,KAAKonD,KAAO,IAAMpnD,KAAKkjG,OAAS,KAI7G,IAAI/mG,EAAM,IAAInO,EAEdmO,EAAI+zL,aAAa13L,EAAKhE,EAAO,GAAI9K,EAAM0O,EAAa,GAAIpS,GAExDwO,EAAO,GAAG6wK,SAAS56J,KAAKtO,GAExB3H,EAAOqlB,QAAQ1d,EAEnB,MAAO,GAAmB,MAAfzS,EAAKgmM,MAAe,CAErBl7L,EAAO,aAAc3O,GAEvBid,EAAY9c,EAAc,yCAA2Cga,KAAKonD,KAAO,IAAMpnD,KAAKkjG,OAAS,KAIzG,IAAIjiG,EAAI,IAAIxE,EAEZwE,EAAEivL,aAAa13L,EAAKhE,EAAO,GAAI9K,EAAM0O,EAAa,GAAIpS,GAEtDwO,EAAO,GAAG6wK,SAAS56J,KAAKxJ,GAExBzM,EAAOqlB,QAAQ5Y,EAEnB,MAAO,GAAmB,SAAfvX,EAAKgmM,MAAkB,CAExBl7L,EAAO,aAAciL,GAAQjL,EAAO,aAAciI,GAEpDqG,EAAY9c,EAAc,oDAAsDga,KAAKonD,KAAO,IAAMpnD,KAAKkjG,OAAS,KAIpH,IAAI3uG,EAAK,IAAIkL,EAEblL,EAAG27L,aAAa13L,EAAKhE,EAAO,GAAI9K,EAAM0O,EAAa,GAAI2W,EAAc,GAAI/oB,GAEzEwO,EAAO,GAAG6wK,SAAS56J,KAAKlW,GAExBC,EAAOqlB,QAAQtlB,EAEnB,MAAO,GAAmB,OAAf7K,EAAKgmM,MAAgB,CAEtBl7L,EAAO,aAAciL,GAAQjL,EAAO,aAAciI,GAEpDqG,EAAY9c,EAAc,kDAAoDga,KAAKonD,KAAO,IAAMpnD,KAAKkjG,OAAS,KAIlH,IAAIrgG,EAAK,IAAIjD,EAEbiD,EAAGqtL,aAAa13L,EAAKhE,EAAO,GAAI9K,EAAM0O,EAAa,GAAIpS,GAEvDwO,EAAO,GAAG6wK,SAAS56J,KAAK5H,GAExBrO,EAAOqlB,QAAQhX,EAEnB,MAAO,GAAmB,QAAfnZ,EAAKgmM,MAAiB,CAEvBl7L,EAAO,aAAciL,GACnBjL,EAAO,aAAciI,GACrBjI,EAAO,aAAc3O,GACrB2O,EAAO,aAAckE,GACrBlE,EAAO,aAAcoO,GACrBpO,EAAO,aAAcoL,GAEzBkD,EAAY9c,EAAc,mEAAqEga,KAAKonD,KAAO,IAAMpnD,KAAKkjG,OAAS,KAInI,IAAI1/F,EAAK,IAAI3D,EAEb2D,EAAG0sL,aAAa13L,EAAKhE,EAAO,GAAI9K,EAAM1D,GAEtCwO,EAAO,GAAGw6L,KAAKvkL,KAAKjH,GAEpBhP,EAAOqlB,QAAQrW,EAEnB,MAIIhP,EAAOqlB,QAAQ,IAAIjjB,EAAelN,SAOtC8K,EAAOqlB,QAAQ,IAAIjjB,EAAelN,IAMtC,GAAI8K,EAAO,aAAcoC,EAErB,GAAIlN,EAAK+mB,MAAQpjB,EAAUyiM,OACJ,aAAfpmM,EAAKgmM,MAIT5vL,SAEG,GACCA,EAAiB,GACjBtS,GACA,cAAeA,EACb,CAIN,IAAII,EAAQ,GAEZ,IAAK,IAAIujB,KAAKznB,EAAKsmK,WACfpiK,EAAMlE,EAAKsmK,WAAW7+I,GAAGV,IAAM,IAAM/mB,EAAKsmK,WAAW7+I,GAAGu+K,OAChD,CACIj/K,IAAK/mB,EAAKsmK,WAAW7+I,GAAGV,IACxBi/K,MAAOhmM,EAAKsmK,WAAW7+I,GAAGu+K,MAC1Bl+L,MAAO9H,EAAKsmK,WAAW7+I,GAAG3f,OAI1ChE,EAAgB05K,UAAUx9K,EAAK+mB,IAAK/mB,EAAKgmM,MAAO9hM,EAEpD,CAIR,EAIAR,EAAEg1L,MAAM14L,GAAWmrE,eAIZr8D,EAAIyvG,KAAKmnF,QAAQ5rB,OAIxB,IAAI7jK,GAAA,EAIJ,IAAK,IAAIgD,KAAKnK,EAAIyvG,KAAKonF,OAAOG,QAE1B,GAAIh3L,EAAIyvG,KAAKonF,OAAOG,QAAQ7oM,eAAegc,GAAI,CAC3ChD,GAAA,EACA,KACJ,CAIJ,IAAKA,EAAY,CAIb,IAAIoC,EAAKa,EAAOnc,UAAU0pM,oBAAoB33L,EAAI0gB,MAElD1gB,EAAIyvG,KAAKonF,OAAOG,QAAQztL,EAAGJ,IAAMI,CAErC,CAIA,IAAK,IAAIf,KAAYxI,EAAIyvG,KAAKonF,OAAOG,QAE3Bh3L,EAAIyvG,KAAKonF,OAAOG,QAAQ7oM,eAAeqa,IAE7CzJ,EAAciB,EAAKA,EAAIyvG,KAAKonF,OAAOG,QAAQxuL,GAAW,KAAM,MAgBhE,OAVIxI,EAAIw6B,MACJz7B,EAAciB,EAAKA,EAAIw6B,KAAM,KAAM,MAKnCx6B,EAAIw6B,MACJptC,EAAoB4S,EAAIw6B,MAGrBx6B,CACX,EAwKAd,EAAGjR,UAAUypM,aAAe,SAAUxmM,EAAMoN,EAASH,GAIjD,IAAI/Q,EAymBR,SAA+B8D,EAAMoN,GAEjC,IAAIH,EAAKqK,EAActX,EAAM2D,EAAU+iM,OAAQ,kBAI3CpqM,EAAI,GACJJ,EAAI,GAER,GAAW,OAAP+Q,EAAa,CAEb,IAEIY,EAFqB,cAEEE,KAAKd,GAEtB,OAANY,GAEA3R,EAAIsa,SAAS3I,EAAE,IAEfvR,EAAIka,SAAS3I,EAAE,KAIfsL,EAAc/L,EAAc,+DAIpC,CAEA,MAAO,CAAC8I,EAAKha,EAAGoI,EAAKhI,EAEzB,CA/BA,CAzmBmC0D,EAAMiN,GAErCqJ,KAAKqwL,WAAa,CACVriM,EAAK,IAAIhI,EAAUsqM,eAAe,EAAG,EAAE1qM,EAAGoI,GAC1C4R,EAAK,IAAI5Z,EAAUsqM,eAAe,EAAE1qM,EAAGga,EAAG,IAKlD,IAAIrI,EAkoBR,SAAiC7N,EAAMoN,GAMnC,IAQIH,EARA3Q,EAAWgb,EAActX,EAAM2D,EAAU+iM,OAAQ,aAIjDxqM,EAAM,GAMO,OAAbI,IAMU,QAFV2Q,EAFoB,QAEFc,KAAKzR,IAInBJ,EAAMsa,SAASvJ,EAAE,IAIjBkM,EAAc/L,EAAc,iEAOpC,IAAIS,EAAWyJ,EAActX,EAAM2D,EAAU+iM,OAAQ,uBAIjDx5L,EAAM,EAEO,OAAbW,IAMU,QAFVZ,EAFyB,cAEFc,KAAKF,IAIxBX,EAAMsJ,SAASvJ,EAAE,IAAMuJ,SAASvJ,EAAE,IAIlCkM,EAAc/L,EAAc,4EAKpC,IAAIY,EAAOd,EAAMhR,EAIbuH,EAAK,EAELU,EAASmT,EAActX,EAAM2D,EAAU+iM,OAAQ,YAwBnD,OAtBe,OAAXviM,EAEiB,OAAb7H,IACAmH,EAAKuK,GAQC,QAFVf,EAFmB,QAEFc,KAAK5J,IAIlBV,EAAK+S,SAASvJ,EAAE,IAIhBkM,EAAc/L,EAAc,+DAK7B,CAACy5L,mBAAoB74L,EAAMmxD,SAAU17D,EAEhD,CA1FA,CAloBuCzD,EAAMiN,GAEzCqJ,KAAKuwL,mBAAqBh5L,EAAKg5L,mBAE/BvwL,KAAK6oD,SAAWtxD,EAAKsxD,SAIrB7oD,KAAKiqE,YAwiBT,SAA4BvgF,EAAMoN,GAE9B,IAAIH,EAAKqK,EAActX,EAAM2D,EAAUmjM,QAAS,eAErC,OAAP75L,IAEAA,EAAKqK,EAActX,EAAM2D,EAAU+iM,OAAQ,uBAI/C,IAAIpqM,EAAO,KAEX,GAAW,OAAP2Q,EAAa,CAEb,IAEI/Q,EAFkB,gBAEE6R,KAAKd,GAE7B,GAAU,OAAN/Q,EAAY,CAEZ,IAAI2R,EAAI2I,SAASta,EAAE,IAEfgR,EAAIsJ,SAASta,EAAE,IAET,IAAN2R,GAAiB,IAANX,EAEX5Q,EAAOuR,EAAIX,EAIXsjB,EAAYpjB,EAAc,wCAGlC,MAEIojB,EAAYpjB,EAAc,6CAGlC,CAEA,OAAO9Q,CAEX,CA1CA,CAxiB0C0D,EAAMiN,GAI5C,IAAIC,EAAOoK,EAActX,EAAM2D,EAAU+iM,OAAQ,YAEpC,OAATx5L,GAA0B,UAATA,GAEjBkM,EAAYnM,EAAc,yBAM9B,IAAIe,EAwsBR,SAAuBhO,EAAMoN,GAEzB,IAAIH,EAAOqK,EAActX,EAAM2D,EAAUojM,OAAQ,UAEjD,GAAa,OAAT95L,EACA,OAAO,KAEX,IAAI/Q,EAAI+Q,EAAKoB,MAAM,KAEnB,GAAiB,IAAbnS,EAAEG,OAIF,OAFA8c,EAAc/L,EAAc,+BAErB,KAGX,IAAIS,EAAIvR,EAAU0qM,YAAY9qM,EAAE,IAE5BgR,EAAI5Q,EAAU0qM,YAAY9qM,EAAE,IAEhC,OAAKgR,GAAMW,EAOJ,CAACvJ,EAAK4I,EAAGgJ,EAAKrI,IALjBsL,EAAc/L,EAAc,sCAErB,KAKf,CA7BA,CAxsB0BpN,EAAMiN,GAElB,OAANe,EAEAsI,KAAK2wL,SAAW,CACZ3iM,EAAK,KACL4R,EAAK,OAKQ,OAAblI,EAAE1J,EAAE80C,MAA8B,OAAbprC,EAAEkI,EAAEkjC,MACzBhgC,EAAYnM,EAAc,wCAG9BqJ,KAAK2wL,SAAW,CACZ3iM,EAAK,IAAIhI,EAAUsqM,eAAe,EAAG,EAAI54L,EAAE1J,EAAEwD,OAC7CoO,EAAK,IAAI5Z,EAAUsqM,eAAe,EAAI54L,EAAEkI,EAAEpO,MAAO,KAQzDwO,KAAK4wL,WAAa,CACV5iM,EAAK,IAAIhI,EAAUsqM,eAAe,EAAG,GACrC1wL,EAAK,IAAI5Z,EAAUsqM,eAAe,EAAG,IAM7CtwL,KAAKkZ,KAAOpiB,CAEhB,EAGAY,EAAGjR,UAAU0oM,eAAiB,SAAUzlM,GAIpC,KAAIA,EAAK8Y,KAAO9Y,EAAKolM,OAArB,CAKA,IAAIh4L,EAAM0M,EAAQxD,KAAKggG,OAAQt2G,EAAKolM,OAQpC,GANKh4L,EAAIw8I,OACLtzI,KAAKggG,OAAO9uF,OAAOpa,EAAIiP,MAAO,EAAGrc,EAAKolM,OAKtCplM,EAAK8Y,MAAQtK,OAAO2oB,kBAAmB,CAEvC,IAAIxzB,EAAMmW,EAAQxD,KAAKggG,OAAQt2G,EAAK8Y,KAE/BnV,EAAIimJ,OACLtzI,KAAKggG,OAAO9uF,OAAO7jB,EAAI0Y,MAAO,EAAGrc,EAAK8Y,IAG9C,CApBU,CAsBd,EASA9K,EAAGjR,UAAUoqM,kBAAoB,WAE7B,MAAO,CAAC7wL,KAAKggG,OAAO,GAAIhgG,KAAKggG,OAAOhgG,KAAKggG,OAAOj6G,OAAS,GAC7D,EAOA2R,EAAGjR,UAAUihL,mBAAqB,WAE9B,OAAO1nK,KAAKggG,MAChB,EA8BAjzG,EAAMtG,UAAUypM,aAAe,SAAUxmM,EAAMoN,GAC3CkJ,KAAK2B,GAAKhC,EAAgBjW,GAC1BsW,KAAKyuL,WAAa1sL,EAAiBrY,EAAMoN,GACzCkJ,KAAKuvL,UAAY5sL,EAAoBjZ,EACzC,EAUAqE,EAAQtH,UAAUypM,aAAe,SAAUxmM,EAAMoN,GAI7C,IAAK,IAAIH,KAFTqJ,KAAKyuL,WAAa,CAAC,EAEL/kM,EAAKsmK,WAEf,GAAItmK,EAAKsmK,WAAWr5J,GAAG8Z,MAAQpjB,EAAUyjM,SACrCpnM,EAAKsmK,WAAWr5J,GAAG8Z,MAAQpjB,EAAU0jM,WACrCrnM,EAAKsmK,WAAWr5J,GAAG8Z,MAAQpjB,EAAUojM,OAAQ,CAE7C,IAAIzqM,EAAQ0D,EAAKsmK,WAAWr5J,GAAG8Z,IAAM,IAAM/mB,EAAKsmK,WAAWr5J,GAAG+4L,MAE9D1vL,KAAKyuL,WAAWzoM,GAAS0D,EAAKsmK,WAAWr5J,GAAGnF,KAEhD,CAGR,EAqBAxD,EAAMvH,UAAUypM,aAAe,SAAUxmM,EAAKoN,EAAQzJ,EAAMsJ,EAAS3Q,GACjEga,KAAKy8C,IAAM,QAASpvD,EAAK2iK,WAAa3iK,EAAK2iK,WAAWvzG,IAAIjrD,MAAQ,KAE5DwO,KAAKy8C,KACPviC,EAAYl0B,EAAc,+BAG9Bga,KAAKrY,KAAO,SAAU0F,EAAK2iK,WAAa3iK,EAAK2iK,WAAWroK,KAAK6J,MAAQ,KAE/DwO,KAAKrY,MACPuyB,EAAYl0B,EAAc,gCAG9BoS,EAAc3R,UAAUypM,aAAatpM,KAAKoZ,KAAMtW,EAAKoN,EAAQzJ,EAAMrH,GACnEwS,EAAa/R,UAAUypM,aAAatpM,KAAKoZ,KAAMtW,EAAKoN,EAAQzJ,EAAMrH,GAClE+oB,EAAgBtoB,UAAUypM,aAAatpM,KAAKoZ,KAAMtW,EAAKoN,EAAQzJ,EAAMrH,GACrEwO,EAAc/N,UAAUypM,aAAatpM,KAAKoZ,KAAMtW,EAAKoN,EAAQzJ,EAAMrH,GAEnEga,KAAKkZ,KAAOviB,CAChB,EAeAvJ,EAAkB3G,UAAUypM,aAAe,SAAUxmM,EAAKoN,EAAQzJ,EAAMsJ,GACpEqJ,KAAK2B,GAAKhC,EAAgBtS,EAC9B,EAMAmH,EAAc/N,UAAUypM,aAAe,SAAUxmM,EAAKoN,EAAQzJ,EAAMsJ,GAChEqJ,KAAKyvL,SAgPT,SAA4B/lM,GACxB,OAAOA,GAAQ,WAAYA,EAAKsmK,WAAatmK,EAAKsmK,WAAW9oG,OAAO11D,MAAQ,EAChF,CAFA,CAhPuCnE,EACvC,EAMA+K,EAAc3R,UAAUypM,aAAe,SAAUxmM,EAAKoN,EAAQzJ,EAAMsJ,GAEhEqJ,KAAKyuL,WAAa1sL,EAAiB1U,EAAMsJ,GAExB,OAAbjN,EAAIu+G,MAAsC,OAArBv+G,EAAIu+G,KAAKmnF,SAC9B76L,EAAsB7K,EAAIu+G,KAAKmnF,QAASzsL,EAAoBtV,GAAO2S,KAAKyuL,WAAY93L,EAG5F,EAMAoY,EAAgBtoB,UAAUypM,aAAe,SAAUxmM,EAAKoN,EAAQzJ,EAAMsJ,GAClEqJ,KAAKgvL,KAAO,EAChB,EAMAlvL,EAAiBrZ,UAAUypM,aAAe,SAAUxmM,EAAKoN,EAAQzJ,EAAMsJ,GACnEqJ,KAAKqlK,SAAW,EACpB,EAQA7sK,EAAa/R,UAAUypM,aAAe,SAAUxmM,EAAKoN,EAAQzJ,EAAMsJ,GAC/D,IAAI3Q,EA4iBR,SAAuB0D,EAAKoN,EAAQzJ,EAAMsJ,GAItC,IAAI3Q,EAAiB,KAEjBqH,GAAQ,UAAWA,EAAK2iK,YAID,QAFvBhqK,EAAiBmW,EAAoBzS,EAAIm/D,SAAUn/D,EAAI6mM,mBAAoBljM,EAAK2iK,WAAW8+B,MAAMt9L,SAI7FqR,EAAclM,EAAc,yBAA2BtJ,EAAK2iK,WAAW8+B,MAAMt9L,MAAQ,cAQ7F,IAAI5L,EAAe,KAEfyH,GAAQ,QAASA,EAAK2iK,YAID,QAFrBpqK,EAAeuW,EAAoBzS,EAAIm/D,SAAUn/D,EAAI6mM,mBAAoBljM,EAAK2iK,WAAWghC,IAAIx/L,SAIzFqR,EAAclM,EAAc,uBAAyBtJ,EAAK2iK,WAAWghC,IAAIx/L,MAAQ,eAQzF,IAAI+F,EAAe,KAcnB,OAZIlK,GAAQ,QAASA,EAAK2iK,YAID,QAFrBz4J,EAAe4E,EAAoBzS,EAAIm/D,SAAUn/D,EAAI6mM,mBAAoBljM,EAAK2iK,WAAWxtJ,IAAIhR,SAIzFqR,EAAclM,EAAc,kCAM7B,CAACo4L,eAAgB/oM,EACpBipM,aAAc13L,EACd23L,aAActpM,EAEtB,CAtDA,CA5iB0B8D,EAAK,EAAQ2D,EAAMsJ,GACzCqJ,KAAK+uL,eAAiB/oM,EAAE+oM,eACxB/uL,KAAKivL,aAAejpM,EAAEipM,aACtBjvL,KAAKkvL,aAAelpM,EAAEkpM,aAEtBlvL,KAAK6uL,cAuMT,SAAiCnlM,EAAMoN,GAEnC,IAAIzJ,EAAK3D,GAAQ,kBAAmBA,EAAKsmK,WAAatmK,EAAKsmK,WAAW6+B,cAAcr9L,MAAQ,KAE5F,OAAMnE,GAAc,QAAPA,EAIK,QAAPA,EAEA,OAIP6sB,EAAYpjB,EAAc,mDAEnB,OAVA,KAcf,CApBA,CAvMiDzJ,EAAMsJ,EACvD,EAcA+B,EAAKjS,UAAUypM,aAAe,SAAUxmM,EAAKoN,EAAMzJ,EAASsJ,GACxDyB,EAAc3R,UAAUypM,aAAatpM,KAAKoZ,KAAMtW,EAAK,KAAMoN,EAAMH,GACjE6B,EAAa/R,UAAUypM,aAAatpM,KAAKoZ,KAAMtW,EAAK,KAAMoN,EAAMH,GAChEoY,EAAgBtoB,UAAUypM,aAAatpM,KAAKoZ,KAAMtW,EAAK,KAAMoN,EAAMH,GACnEnC,EAAc/N,UAAUypM,aAAatpM,KAAKoZ,KAAMtW,EAAK,KAAMoN,EAAMH,GACjEmJ,EAAiBrZ,UAAUypM,aAAatpM,KAAKoZ,KAAMtW,EAAK,KAAMoN,EAAMH,GAEpEqJ,KAAKkZ,KAAO7rB,CAChB,EAUAxH,EAAIY,UAAUypM,aAAe,SAAUxmM,EAAKoN,EAAQzJ,EAAMsJ,EAAS3Q,GAC/DoS,EAAc3R,UAAUypM,aAAatpM,KAAKoZ,KAAMtW,EAAKoN,EAAQzJ,EAAMrH,GACnEwS,EAAa/R,UAAUypM,aAAatpM,KAAKoZ,KAAMtW,EAAKoN,EAAQzJ,EAAMrH,GAClE+oB,EAAgBtoB,UAAUypM,aAAatpM,KAAKoZ,KAAMtW,EAAKoN,EAAQzJ,EAAMrH,GACrEwO,EAAc/N,UAAUypM,aAAatpM,KAAKoZ,KAAMtW,EAAKoN,EAAQzJ,EAAMrH,GACnE8Z,EAAiBrZ,UAAUypM,aAAatpM,KAAKoZ,KAAMtW,EAAKoN,EAAQzJ,EAAMrH,GAEtEga,KAAKkZ,KAAOviB,CAChB,EAUA8F,EAAEhW,UAAUypM,aAAe,SAAUxmM,EAAKoN,EAAQzJ,EAAMsJ,EAAS3Q,GAC7DoS,EAAc3R,UAAUypM,aAAatpM,KAAKoZ,KAAMtW,EAAKoN,EAAQzJ,EAAMrH,GACnEwS,EAAa/R,UAAUypM,aAAatpM,KAAKoZ,KAAMtW,EAAKoN,EAAQzJ,EAAMrH,GAClE+oB,EAAgBtoB,UAAUypM,aAAatpM,KAAKoZ,KAAMtW,EAAKoN,EAAQzJ,EAAMrH,GACrEwO,EAAc/N,UAAUypM,aAAatpM,KAAKoZ,KAAMtW,EAAKoN,EAAQzJ,EAAMrH,GACnE8Z,EAAiBrZ,UAAUypM,aAAatpM,KAAKoZ,KAAMtW,EAAKoN,EAAQzJ,EAAMrH,GAEtEga,KAAKkZ,KAAOviB,CAChB,EAUA8I,EAAKhZ,UAAUypM,aAAe,SAAUxmM,EAAKoN,EAAQzJ,EAAMsJ,EAAS3Q,EAAUJ,GAC1EwS,EAAc3R,UAAUypM,aAAatpM,KAAKoZ,KAAMtW,EAAKoN,EAAQzJ,EAAMzH,GACnE4S,EAAa/R,UAAUypM,aAAatpM,KAAKoZ,KAAMtW,EAAKoN,EAAQzJ,EAAMzH,GAClEmpB,EAAgBtoB,UAAUypM,aAAatpM,KAAKoZ,KAAMtW,EAAKoN,EAAQzJ,EAAMzH,GACrE4O,EAAc/N,UAAUypM,aAAatpM,KAAKoZ,KAAMtW,EAAKoN,EAAQzJ,EAAMzH,GACnEka,EAAiBrZ,UAAUypM,aAAatpM,KAAKoZ,KAAMtW,EAAKoN,EAAQzJ,EAAMzH,GAEtEoa,KAAKixL,MAAQjrM,EACbga,KAAKkZ,KAAOviB,CAChB,EAUAyI,EAAc3Y,UAAUupM,aAAe,SAAUtmM,EAAKoN,EAAQzJ,EAAMsJ,EAAS3Q,EAAUJ,GACnF4S,EAAa/R,UAAUypM,aAAatpM,KAAKoZ,KAAMtW,EAAKoN,EAAQ,KAAMlR,GAElEoa,KAAKyN,KAAOpgB,EACZ2S,KAAKixL,MAAQjrM,EACbga,KAAKkZ,KAAOviB,CAChB,EAUAiJ,EAAGnZ,UAAUypM,aAAe,SAAUxmM,EAAKoN,EAAQzJ,EAAMsJ,EAAS3Q,GAC9DwO,EAAc/N,UAAUypM,aAAatpM,KAAKoZ,KAAMtW,EAAKoN,EAAQzJ,EAAMrH,GACnEwS,EAAa/R,UAAUypM,aAAatpM,KAAKoZ,KAAMtW,EAAKoN,EAAQzJ,EAAMrH,GAElEga,KAAKkZ,KAAOviB,CAChB,EAUAiM,EAAOnc,UAAU0pM,oBAAsB,SAAUzmM,GAC7C,IAAIoN,EAAI,IAAI8L,EASZ,OAPAxV,EAAkBxG,KAAKkQ,EAAG,IAC1BsB,EAAcxR,KAAKkQ,EAAG,CAAC,GACvBiY,EAAgBnoB,KAAKkQ,EAAG,IACxB0B,EAAa5R,KAAKkQ,EAAG,EAAGoB,OAAO2oB,kBAAmB,MAElD7gB,KAAKkZ,KAAOxvB,EAELoN,CACX,EAEA8L,EAAOnc,UAAUypM,aAAe,SAAUxmM,EAAKoN,EAAMzJ,EAASsJ,GAC1DvJ,EAAkB3G,UAAUypM,aAAatpM,KAAKoZ,KAAMtW,EAAK,KAAMoN,EAAMH,GACrE6B,EAAa/R,UAAUypM,aAAatpM,KAAKoZ,KAAMtW,EAAK,KAAMoN,EAAMH,GAChEoY,EAAgBtoB,UAAUypM,aAAatpM,KAAKoZ,KAAMtW,EAAK,KAAMoN,EAAMH,GAInEqJ,KAAKyuL,WAAa1sL,EAAiBjL,EAAMH,GAIzCqJ,KAAKuvL,UAAY5sL,EAAoB7L,GAIrCkJ,KAAKkZ,KAAO7rB,CAChB,EAUAwS,EAAIpZ,UAAUypM,aAAe,SAAUxmM,EAAKoN,EAAQzJ,EAAMsJ,GAEtD6B,EAAa/R,UAAUypM,aAAatpM,KAAKoZ,KAAMtW,EAAKoN,EAAQzJ,EAAMsJ,GAElE,IAAI3Q,EAAS+b,EAAiB1U,EAAMsJ,GAKpC,IAAK,IAAI/Q,KAHToa,KAAK4uL,MAAQ,KACb5uL,KAAKxO,MAAQ,KAEKxL,EAEd,GAAMA,EAAOW,eAAef,GAA5B,CAEA,GAAIoa,KAAK4uL,MAAO,CAEZ10K,EAAYvjB,EAAc,wCAC1B,KAEJ,CAEAqJ,KAAK4uL,MAAQhpM,EACboa,KAAKxO,MAAQxL,EAAOJ,EAVwB,CAcpD,CA6iBH,CA/xDD,CA+xDwDkR,EACjC,oBAARo6L,IAAsB7jM,EAAQ,MAAS6jM,IACzB,oBAAdC,UAA4B9jM,EAAQ,KAAa8jM,UAClC,oBAAfC,WAA6B/jM,EAAQ,MAAc+jM,WACrC,oBAAdC,UAA4BhkM,EAAQ,MAAagkM,UAAA,eAAA3nM,EAAAoN,EAAAzJ,GCpyDhE,IAAIsJ,EAAmB,WAAWpL,KAAKC,UAAUC,YAGjD,SAAW/B,EAAUoN,EAAWzJ,GA2H5B,SAASrH,EAAe0D,EAASoN,EAAY/J,EAAae,GAEtD,IAAIE,EAEJ,GAAyB,WAArBjB,EAAYozB,MAEZnyB,EAAIrC,SAASC,cAAc,QACzBkhF,MAAMl+E,SAAW,gBAEhB,GAAyB,SAArB7B,EAAYozB,KAEnBnyB,EAAIrC,SAASC,cAAc,YAExB,GAAyB,QAArBmB,EAAYozB,KAEnBnyB,EAAIrC,SAASC,cAAc,YAExB,GAAyB,UAArBmB,EAAYozB,MAInB,GAFAnyB,EAAIrC,SAASC,cAAc,OAEC,OAAxBlC,EAAQ4nM,aAA4C,OAApBvkM,EAAY0vD,IAAc,CAE1D,IAAIjoD,EAAM9K,EAAQ4nM,YAAYvkM,EAAY0vD,IAAKzuD,GAE3CwG,IACAxG,EAAEyuD,IAAMjoD,GAEZxG,EAAEgB,OAAStF,EAAQ6nM,QACnBvjM,EAAEe,MAAQrF,EAAQ8nM,OAEtB,OAEG,GAAyB,MAArBzkM,EAAYozB,KAEnBnyB,EAAIrC,SAASC,cAAc,UAExB,GAAyB,SAArBmB,EAAYozB,KAEnB,GAA6D,cAAzDpzB,EAAY0hM,WAAWphM,EAAWqhM,OAAOC,KAAKC,OAE9C5gM,EAAIrC,SAASC,cAAc,QAE3BlC,EAAQilM,MAAA,OAEL,GAA6D,SAAzD5hM,EAAY0hM,WAAWphM,EAAWqhM,OAAOC,KAAKC,OAErD5gM,EAAIrC,SAASC,cAAc,aAExB,GAA6D,SAAzDmB,EAAY0hM,WAAWphM,EAAWqhM,OAAOC,KAAKC,OAErD5gM,EAAIrC,SAASC,cAAc,WAGxB,GAA6D,kBAAzDmB,EAAY0hM,WAAWphM,EAAWqhM,OAAOC,KAAKC,OAErD5gM,EAAIrC,SAASC,cAAc,YAGxB,GAA6D,kBAAzDmB,EAAY0hM,WAAWphM,EAAWqhM,OAAOC,KAAKC,OAErD5gM,EAAIrC,SAASC,cAAc,WAGxB,IAA6D,cAAzDmB,EAAY0hM,WAAWphM,EAAWqhM,OAAOC,KAAKC,OAIrD,OAIA5gM,EAAIrC,SAASC,cAAc,OAE/B,KAI4B,OAArBmB,EAAYozB,OAEnBnyB,EAAIrC,SAASC,cAAc,OAI/B,GAAKoC,EAAL,CA6BA,GAnBIjB,EAAYmsB,OAEa,WAArBnsB,EAAYozB,MAAqBpzB,EAAYmsB,OAASprB,EAAWorB,OACjElrB,EAAEkrB,KAAOnsB,EAAYmsB,OAO7BpiB,EAAW4lD,YAAY1uD,GAKvBA,EAAE8+E,MAAM2kH,OAAS,IAIQ,WAArB1kM,EAAYozB,KAAmB,CAE/B,IAAIrgB,EAAO/S,EAAY0hM,WAAWphM,EAAWqhM,OAAOgD,YAAY9C,OAEnD,SAAT9uL,GAA4B,OAATA,GAEnBpW,EAAQioM,IAAM,KACdjoM,EAAQkoM,IAAM,MAEE,SAAT9xL,GAA4B,OAATA,GAE1BpW,EAAQioM,IAAM,KACdjoM,EAAQkoM,IAAM,MAEE,SAAT9xL,GAEPpW,EAAQioM,IAAM,KACdjoM,EAAQkoM,IAAM,MAEE,SAAT9xL,GAA4B,OAATA,IAE1BpW,EAAQioM,IAAM,KACdjoM,EAAQkoM,IAAM,KAItB,MAAO,GAAyB,MAArB7kM,EAAYozB,MAAgC,OAAhBz2B,EAAQkoM,IAAc,CAEzD,IAAIp5L,EAAOzL,EAAY0hM,WAAWphM,EAAWqhM,OAAOmD,UAAUjD,OAE9DllM,EAAQioM,IAAe,QAATn5L,EAAiB,KAAO,IAE1C,CAIA,IAAK,IAAIE,EAAI,EAAGA,EAAI3K,EAAiBhI,OAAQ2S,IAAK,CAE9C,IAAI7S,EAAKkI,EAAiB2K,GAEtB+D,EAAO1P,EAAY0hM,WAAW5oM,EAAG+oM,YAAA,IAEjCnyL,GAAiC,OAAX5W,EAAG0pB,KAEzB1pB,EAAG0pB,IAAI7lB,EAASsE,EAAGjB,EAAa0P,EAIxC,CAEA,IAAIgD,EAASzR,EAIToR,EAAKrS,EAAY0hM,WAAWphM,EAAWqhM,OAAOnsB,YAAYqsB,OAE9D,GAAIxvL,IAASA,EAAG0yL,SAAW,CAEvB,IAAIlyL,EAAUR,EAAG2yL,aAAaroM,EAAQkW,EAAGlW,EAAQsE,GAGjD,GAAI4R,EAAU,EAAG,CAIb,IAAIgD,EAAatK,KAAK0zB,KAAKpsB,GAAW,KAElB,OAAhBlW,EAAQkoM,KAERnyL,EAAOqtE,MAAMklH,YAAcpvL,EAC3BnD,EAAOqtE,MAAMmlH,aAAervL,IAI5BnD,EAAOqtE,MAAMolH,WAAatvL,EAC1BnD,EAAOqtE,MAAMqlH,cAAgBvvL,GAIjClZ,EAAQ0oM,GAAKhzL,CACjB,CACJ,CAIA,IAAIS,EAAM9S,EAAY0hM,WAAWphM,EAAWqhM,OAAO2D,cAAczD,OAEjE,GAAI/uL,GAAe,SAARA,EAAgB,CAIvB,IAAIF,EAAIhU,SAASC,cAAc,QAE/B+T,EAAEmtE,MAAMunB,QAAU,eAElB10F,EAAEmtE,MAAMzjB,UAAYxpD,EAEpB7R,EAAE0uD,YAAY/8C,GAEdF,EAASE,EAETjW,EAAQ4oM,IAAMzyL,CAElB,CAIA,IAAI8C,EAAK5V,EAAY0hM,WAAWphM,EAAWqhM,OAAO6D,YAAY3D,OAc9D,GAZIjsL,GAAgB,SAAVA,EAAG,KACTjZ,EAAQ6oM,YAAc5vL,GAMtB5V,EAAY0hM,WAAWphM,EAAWqhM,OAAO8D,YAAY5D,SACrDllM,EAAQ+oM,KAAA,GAIa,SAArB1lM,EAAYozB,MAAmBpzB,EAAY0gB,KAAM,CAEjD,IAAI1L,EAAKhV,EAAY0hM,WAAWphM,EAAWqhM,OAAOgE,aAAa9D,OAQ/D,GANI7sL,GAAmB,SAAbA,EAAG+qE,QAETpjF,EAAQgpM,cAAA,GAIRrlM,EAAWqhM,OAAOiE,YAAY/D,SAAS7hM,EAAY0hM,YACiB,QAAhE1hM,EAAY0hM,WAAWphM,EAAWqhM,OAAOiE,YAAY/D,OAGzD5gM,EAAEu7D,YAAcx8D,EAAY0gB,KAC5Bzf,EAAE4kM,aAAe7lM,EAEbgV,GAEAlU,EAAkBnE,EAASsE,EAAG,EAAa+T,QAU/C,IAFA,IAAIf,EAAO,GAEF7E,EAAI,EAAGA,EAAIpP,EAAY0gB,KAAK1nB,OAAQoW,IAAK,CAE9C6E,GAAQjU,EAAY0gB,KAAKhhB,OAAO0P,GAEhC,IAAI8E,EAAKlU,EAAY0gB,KAAKjE,WAAWrN,GAErC,GAAI8E,EAAK,OAAUA,EAAK,OAAU9E,IAAMpP,EAAY0gB,KAAK1nB,OAAS,EAAG,CAIjE,IAAIwO,EAAO5I,SAASC,cAAc,QAElC2I,EAAKg1D,YAAcvoD,EAIfe,GAEAlU,EAAkBnE,EAAS6K,EAAM,EAAawN,GAIlD/T,EAAE0uD,YAAYnoD,GAEdyM,EAAO,GAGPzM,EAAKq+L,aAAe7lM,CACxB,CAEJ,CAGR,CAIA,GAAI,aAAcA,EAEd,IAAK,IAAIC,EAAI,EAAGA,EAAID,EAAYs4K,SAASt/K,OAAQiH,IAE7ChH,EAAe0D,EAAS+V,EAAQ1S,EAAYs4K,SAASr4K,GAAID,GAQjE,IAAI8V,EAAW,GAMf,GAAyB,MAArB9V,EAAYozB,OAEZhzB,EAAkBzD,EAAS+V,EAAQoD,EAAU,MAIzCnZ,EAAQ6oM,cA2ZpB,SAA0B7oM,EAAUoN,GAEhC,IAAK,IAAIzJ,EAAI,EAAGA,EAAI3D,EAAS3D,OAAQsH,IAAK,CAEtC,IAOIsJ,EACA3Q,EARAJ,EAAO+F,SAASC,cAAc,QAE9B2L,EAAK5L,SAASC,cAAc,QAChC2L,EAAGgyD,YAAc,SAEjB3jE,EAAK82D,YAAYnlD,GAKjB,IAuBQX,EAvBJc,EAAKZ,EAAQy7L,YAAY,GAAGR,aAAaj7L,EAAQ8I,EAAG9I,EAAQ9I,GAAK,KAEtC,SAA3B8I,EAAQy7L,YAAY,IAA6C,YAA3Bz7L,EAAQy7L,YAAY,IAAuC,GAAnB7oM,EAAS3D,SAEvF4Q,EAAMhL,SAASC,cAAc,QACzBkhF,MAAM1/E,GAAqBI,EAAoB,QAAU,QAC7DmJ,EAAI4yD,YAAc,SAClB5yD,EAAIm2E,MAAMwnC,SAAW58G,GAErB1R,EAAM2F,SAASC,cAAc,QACzBkhF,MAAM1/E,GAAqBI,EAAoB,SAAW,OAC9DxH,EAAIujE,YAAc,SAClBvjE,EAAI8mF,MAAMwnC,SAAW58G,EAErB9R,EAAK82D,YAAY/lD,GACjB/Q,EAAK82D,YAAY12D,MAIjB2Q,EAAMhL,SAASC,cAAc,QACzB29D,YAAc,SAClB5yD,EAAIm2E,MAAMwnC,SAAW58G,EAMjBd,EAF2B,UAA3BE,EAAQy7L,YAAY,IAA8C,YAA3Bz7L,EAAQy7L,YAAY,IAAoBllM,EAAI,EAE7EG,EAAoB,QAA4B,OAAhBsJ,EAAQ86L,KAAgC,OAAhB96L,EAAQ86L,IAAgB,QAAU,OAI1FpkM,EAAoB,SAA6B,OAAhBsJ,EAAQ86L,KAAgC,OAAhB96L,EAAQ86L,IAAgB,OAAS,QAIpGj7L,EAAIm2E,MAAM1/E,GAAqBwJ,EAE/BhR,EAAK82D,YAAY/lD,IAQrB,IAFA,IAAIxJ,EAAM,KAEDU,EAAI,EAAGA,EAAInE,EAAS2D,GAAGwlM,IAAI9sM,OAAQ8H,IAExC,GAAqC,SAAjCnE,EAAS2D,GAAGwlM,IAAIhlM,GAAGihK,UAAsB,CAEzC3hK,EAAMzD,EAAS2D,GAAGwlM,IAAIhlM,GAItB,IAAK,IAAId,EAAI,EAAGA,EAAII,EAAI2/E,MAAM/mF,OAAQgH,IAElCnH,EAAKknF,MAAMC,YAAY5/E,EAAI2/E,MAAMgmH,KAAK/lM,GAAII,EAAI2/E,MAAMy6B,iBAAiBp6G,EAAI2/E,MAAMgmH,KAAK/lM,KAIxF,KACJ,EAMJI,EAAMA,GAAOzD,EAAS2D,GAAGukK,SAAS,GAAGl0E,MAEjC8pB,cAAcnU,aAAaztG,EAAMuH,EAEzC,CAEJ,CAtFA,CAzZ6B0V,EAAUnZ,GAE3BA,EAAQ6oM,YAAc,OAMtB7oM,EAAQilM,MAAQjlM,EAAQ6oM,eAmWpC,SAA2B7oM,EAAUoN,GAEjC,IAAK,IAAIzJ,EAAI,EAAGA,EAAI3D,EAAS3D,OAAQsH,IAEjC,IAAK,IAAIsJ,EAAI,EAAGA,EAAIjN,EAAS2D,GAAGwlM,IAAI9sM,OAAQ4Q,IAAK,CAO7C,IAAI3Q,EAHA0D,EAAS2D,GAAGwlM,IAAIl8L,GAAGm2E,MAAM1/E,KASzBpH,EAJAwH,EAIa,IAANH,EAAW,SAAW,QAEN,OAAhByJ,EAAQ86L,KAOK,OAAhB96L,EAAQ86L,IALC,IAANvkM,EAAW,OAAS,QAWV,IAANA,EAAW,QAAU,OAMpC3D,EAAS2D,GAAGwlM,IAAIl8L,GAAGm2E,MAAM1/E,GAAqBpH,EAElD,CAIR,CA5CA,CAjW8B6c,EAAUnZ,GAE5BA,EAAQilM,KAAO,MAMfjlM,EAAQgpM,eA8SpB,SAAkChpM,EAAUoN,GAIxC,IAAK,IAAIzJ,EAAI,EAAGA,EAAI3D,EAAS3D,OAAQsH,IAEjC,IAAK,IAAIsJ,EAAI,EAAGA,EAAIjN,EAAS2D,GAAG+sB,GAAGr0B,OAAQ4Q,IAAK,CAQ5C,IAAI3Q,EAJA0D,EAAS2D,GAAG+sB,GAAGzjB,GAAGm2E,MAAM10E,IAC+B,SAAvD1O,EAAS2D,GAAG+sB,GAAGzjB,GAAGm2E,MAAM10E,KAOxBpS,EAFgB,OAAhB8Q,EAAQ86L,IAEK,IAANvkM,EAAW,YAAc,aAKZ,OAAhByJ,EAAQ86L,IAEK,IAANvkM,EAAW,cAAgB,aAIrB,IAANA,EAAW,aAAe,cAMzC3D,EAAS2D,GAAG+sB,GAAGzjB,GAAGm2E,MAAM10E,GAA6BpS,EAEzD,CAIR,CAzCA,CA5SqC6c,EAAUnZ,GAEnCA,EAAQgpM,aAAe,MAMvBhpM,EAAQ4oM,MAgRpB,SAA4B5oM,GAIxB,IAAK,IAAIoN,EAAI,EAAGA,EAAIpN,EAAS3D,OAAS,EAAG+Q,IAAK,CAE1C,IAAIzJ,EAAI3D,EAASoN,GAAG86J,SAAS7rK,OAE7B,GAAU,IAANsH,IAAA,IAAW3D,EAASoN,GAAGqwB,GAAc,CACrC,IAAIxwB,EAAKhL,SAASC,cAAc,MAE5B5F,EAAW0D,EAASoN,GAAG86J,SAASvkK,EAAI,GAAGqwF,KAE3C13F,EAASwhH,cAAcnU,aAAa18F,EAAI3Q,EAAS23F,YACrD,CAEJ,CAEJ,CAlBA,CA9Q+B96E,GAEnBnZ,EAAQ4oM,IAAM,MAMd5oM,EAAQ0oM,KAqLpB,SAA0B1oM,EAAUoN,EAAIzJ,GAEpC,GAAiB,OAAb3D,EAEJ,IAAK,IAAI1D,EAAI,EAAGA,EAAI0D,EAAS3D,OAAQC,IAAK,CAEtC,IAAIJ,EAAI8D,EAAS1D,GAAG4rK,SAAS7rK,OAEzBwR,EAAce,KAAK0zB,KAAKl1B,GAAM,KAE9BF,EAAc,IAAM0B,KAAK0zB,KAAKl1B,GAAM,KAExC,GAAU,IAANlR,EAAS,CAET,IAAI8R,EAAKhO,EAAS1D,GAAG4rK,SAASloK,EAAS1D,GAAG+sM,YAEtC5lM,EAAKzD,EAAS1D,GAAG4rK,SAASloK,EAAS1D,GAAGgtM,UAE1C,GAAIt7L,IAAOvK,EAAI,CAGX,IAAIU,EAAsB6J,EAAGgmF,KAAKtvB,wBAElC,GAAiC,GAA7BvgE,EAAoBkB,OAA4C,GAA9BlB,EAAoBmB,OAGtD,QAIR,CAGoB,OAAhB3B,EAAQskM,KAERj6L,EAAGgmF,KAAK5Q,MAAMmmH,WAAar8L,EAC3Bc,EAAGgmF,KAAK5Q,MAAMklH,YAAcz6L,GAEL,OAAhBlK,EAAQskM,KAEfj6L,EAAGgmF,KAAK5Q,MAAMmlH,aAAe16L,EAC7BG,EAAGgmF,KAAK5Q,MAAMulC,YAAcz7G,GAEL,OAAhBvJ,EAAQskM,MAEfj6L,EAAGgmF,KAAK5Q,MAAMolH,WAAa36L,EAC3BG,EAAGgmF,KAAK5Q,MAAMomH,UAAYt8L,GAKV,OAAhBvJ,EAAQskM,KAKHh7L,IACDxJ,EAAGuwF,KAAK5Q,MAAMulC,YAAcz7G,GAEhCzJ,EAAGuwF,KAAK5Q,MAAMmlH,aAAe16L,GAEN,OAAhBlK,EAAQskM,KAEfxkM,EAAGuwF,KAAK5Q,MAAMklH,YAAcz6L,EACvBZ,IACDxJ,EAAGuwF,KAAK5Q,MAAMmmH,WAAar8L,IAGR,OAAhBvJ,EAAQskM,MAEfxkM,EAAGuwF,KAAK5Q,MAAMqlH,cAAgB56L,EAC9BpK,EAAGuwF,KAAK5Q,MAAMqmH,aAAev8L,EAIrC,CAEJ,CAEJ,CA/EA,CAnL6BiM,EAAUnZ,EAAQ0oM,GAAGL,aAAaroM,EAAQkW,EAAGlW,EAAQsE,GAAItE,GAE1EA,EAAQ0oM,GAAK,MAgEzB,SAAoB1oM,EAAUoN,GAE1B,IAAK,IAAIzJ,EAAI,EAAGA,EAAI3D,EAAS3D,OAAQsH,IAIjC,IAFA,IAAIsJ,EAAOjN,EAAS2D,GAEXrH,EAAI,EAAGA,EAAI2Q,EAAKi7J,SAAS7rK,QAAS,CAEvC,IAAI6Q,EAAWD,EAAKi7J,SAAS5rK,EAAI,GAC7B0R,EAAOf,EAAKi7J,SAAS5rK,GAErBuR,EAAUX,EAAS8mF,KAAMhmF,EAAKgmF,KAAM5mF,GAGpCH,EAAKi7J,SAAS1gJ,OAAOlrB,EAAG,GAKxBA,GAIR,CAOJ,IAHA,IAAImH,EAAUU,EACVd,EAAwB,GAEnBgB,EAAI,EAAGA,EAAIrE,EAAS3D,OAAQgI,IAEjC,IAAK,IAAID,EAAK,EAAGA,EAAKpE,EAASqE,GAAG6jK,SAAS7rK,OAAQ+H,KAG/CD,EAA0BjI,EAD1BuH,EAAWzD,EAASqE,GAAG6jK,SAAS9jK,GAAI4vF,KACqB3wF,GAAA,MAIrDI,EAAS2/E,MAAMn+E,gBAAkBd,GAM7C,IAAK,IAAIG,EAAK,EAAGA,EAAKjB,EAAsBhH,OAAQiI,IAEhDjB,EAAsBiB,GAAI8+E,MAAMn+E,gBAAkB,EAG1D,CAlDA,CA5DmBkU,EAAUnZ,GAIjBA,EAAQ+oM,KAAK,CAEb,IAAIv4K,EAAYxiB,EAAW+H,EAAO2uD,wBAAyB1kE,IA6bvE,SAA0BA,EAAUoN,EAAYzJ,EAAWsJ,GAKvD,IAFA,IAAI/Q,EAAI0S,KAAK86L,KAAK/lM,EAAYyJ,GAErBS,EAAI,EAAGA,GAAK7N,EAAS3D,OAAQwR,IAAK,CAIvC,IAAIX,EAgBAc,EACAvK,EAAEU,EAGN,GAhBI+I,EAFM,IAANW,EAEWe,KAAKwU,MAAMhW,GAEfS,IAAM7N,EAAS3D,OAEXuS,KAAKwU,MAAMzf,GAIXiL,KAAKwU,OAAOpjB,EAAS6N,EAAI,GAAG87L,MAAQ3pM,EAAS6N,GAAG+7L,QAAU,GAQrE/7L,EAAI,GAEA7N,EAAS6N,EAAE,GAEX,IAAKpK,EAAI,EAAGA,EAAIzD,EAAS6N,EAAI,GAAGq6J,SAAS7rK,OAAQoH,IAG7CuK,EAAU9R,GAAGgR,GADb/I,EAASnE,EAAS6N,EAAI,GAAGq6J,SAASzkK,IACHkmM,OAAS,KAEpB,OAAhB18L,EAAQi7L,IAER/jM,EAAS6vF,KAAK5Q,MAAMmlH,aAAev6L,EAEZ,OAAhBf,EAAQi7L,IAEf/jM,EAAS6vF,KAAK5Q,MAAMklH,YAAct6L,EAEX,OAAhBf,EAAQi7L,MAEf/jM,EAAS6vF,KAAK5Q,MAAMqlH,cAAgBz6L,GAWpD,GAAIH,EAAI7N,EAAS3D,OAEb,IAAKoH,EAAI,EAAGA,EAAIzD,EAAS6N,GAAGq6J,SAAS7rK,OAAQoH,IAGzCuK,EAAU9R,IADViI,EAAWnE,EAAS6N,GAAGq6J,SAASzkK,IACRmmM,OAAS18L,GAAY,KAEzB,OAAhBD,EAAQi7L,IAER/jM,EAAS6vF,KAAK5Q,MAAMklH,YAAct6L,EAEX,OAAhBf,EAAQi7L,IAEf/jM,EAAS6vF,KAAK5Q,MAAMmlH,aAAev6L,EAEZ,OAAhBf,EAAQi7L,MAEf/jM,EAAS6vF,KAAK5Q,MAAMolH,WAAax6L,EAOjD,CAEJ,CArFA,CA3b6BmL,EAAUqX,EAAUo5K,OAAQp5K,EAAUm5K,MAAO3pM,GAE9DA,EAAQ+oM,IAAM,IAElB,CAOJ,GAAyB,WAArB1lM,EAAYozB,MAGS,OAAhBz2B,EAAQkoM,KACLloM,EAAQogI,cACR/8H,EAAYs4K,SAASt/K,OAAS,GACmC,UAAjEgH,EAAY0hM,WAAWphM,EAAWqhM,OAAO6E,aAAa3E,OAAoB,CAG9EzhM,EAAkBzD,EAAS+V,EAAQoD,EAAU,MAI7C,IAEIC,EAAK,IAAIlM,EAFgB,KAAnB7J,EAAY4U,GAAY,IAAM5U,EAAY4U,GAEpBkB,GAIhC,GAFAnZ,EAAQ8pM,gBAAgB1wL,EAAGnB,IAAMmB,EAE7BpZ,EAAQ+pM,kBACJ3wL,EAAGnB,MAAMjY,EAAQ+pM,kBACjB/pM,EAAQ+pM,iBAAiB3wL,EAAGnB,IAAI+xL,MAAM3tM,OAAS,GAC/C+c,EAAG4wL,MAAM3tM,OAAS,GAClB+c,EAAG4wL,MAAM5wL,EAAG4wL,MAAM3tM,OAAS,GAAG0nB,OAC9B/jB,EAAQ+pM,iBAAiB3wL,EAAGnB,IAAI+xL,MAAMhqM,EAAQ+pM,iBAAiB3wL,EAAGnB,IAAI+xL,MAAM3tM,OAAS,GAAG0nB,KAAM,CAElG,IAAIjK,EAAYxV,EAAE2lM,kBAEd/lM,EAAIkV,EAAG4wL,MAAM5wL,EAAG4wL,MAAM3tM,OAAS,GAAGstM,MAAQvwL,EAAG4wL,MAAM5wL,EAAG4wL,MAAM3tM,OAAS,GAAGutM,OAE5E9vL,EAAUspE,MAAMze,OAAS,IAAMzgE,EAAI,KACnC4V,EAAUspE,MAAM2I,WAAa,iBAC7BjyE,EAAUspE,MAAMl+E,SAAW,WAC3B4U,EAAUspE,MAAM8mH,UAAY,eAAiBhmM,EAAI,KAErD,CAEJ,CAlVJ,MAJImhB,EAAYrlB,EAAQmqM,aAAc,sCAAwC9mM,EAAYozB,KAwV9F,CAsDA,SAASv6B,EAAqB8D,EAASoN,EAAczJ,GAEjD,OAAI3D,EAAQojF,MAAMn+E,iBAEVtB,IAAeyJ,EAAaiW,SAASrjB,IAErCoN,EAAa2T,KAAK/gB,GAGfA,EAAQojF,MAAMn+E,iBAIkB,SAAnCjF,EAAQ89G,cAAcl+C,UACa,SAAnC5/D,EAAQ89G,cAAcl+C,UACa,QAAnC5/D,EAAQ89G,cAAcl+C,UACa,QAAnC5/D,EAAQ89G,cAAcl+C,UACa,OAAnC5/D,EAAQ89G,cAAcl+C,SAEf1jE,EAAqB8D,EAAQ89G,cAAe1wG,GAAA,QAAc,CAO7E,CAEA,SAASS,EAAU7N,EAAOoN,EAAQzJ,GAE9B,GAAsB,SAAlB3D,EAAMugG,SACa,SAAnBnzF,EAAOmzF,SACPvgG,EAAMkpM,eAAiB97L,EAAO87L,aAAc,CACxC,IAAMlpM,EAAMkpM,aAGR,OADA7jL,EAAY1hB,EAAQwmM,aAAc,uFAItCnqM,EAAM6/D,aAAezyD,EAAOyyD,YAE5B,IAAK,IAAI5yD,EAAI,EAAGA,EAAIG,EAAOg2E,MAAM/mF,OAAQ4Q,IAAK,CAE1C,IAAI3Q,EAAY8Q,EAAOg2E,MAAMn2E,IACzB3Q,EAAUmM,QAAQ,WAAa,GAC/BnM,EAAUmM,QAAQ,YAAc,GAChCnM,EAAUmM,QAAQ,WAAa,KAE/BzI,EAAMojF,MAAM9mF,GAAa8Q,EAAOg2E,MAAM9mF,GAG9C,CAIA,OAFA8Q,EAAO0wG,cAAcxoD,YAAYloD,IAAA,CAGrC,CAEJ,OAAO,CACX,CA+WA,SAASF,EAAclN,EAAIoN,GAEvBkJ,KAAK2B,GAAKjY,EAEVsW,KAAK0zL,MAAQ58L,CAEjB,CAEA,SAASY,EAAWhO,EAAMoN,GAEtB,IAAIzJ,EAAQ,CAACimM,OAAQ,KAAMD,MAAO,KAAM/wL,MAAO,KAAME,IAAK,MAkC1D,MAhCoB,OAAhB1L,EAAQ86L,KAERvkM,EAAMimM,OAAS5pM,EAAKmF,IACpBxB,EAAMgmM,MAAQ3pM,EAAK2kE,OAEC,OAAhBv3D,EAAQ66L,KAERtkM,EAAMiV,MAAQ5Y,EAAKoF,KACnBzB,EAAMmV,IAAM9Y,EAAK++D,QAIjBp7D,EAAMiV,MAAQ5Y,EAAK++D,MACnBp7D,EAAMmV,IAAM9Y,EAAKoF,OAGE,OAAhBgI,EAAQ86L,KAEfvkM,EAAMimM,OAAS5pM,EAAKoF,KACpBzB,EAAMgmM,MAAQ3pM,EAAK++D,MACnBp7D,EAAMiV,MAAQ5Y,EAAKmF,IACnBxB,EAAMmV,IAAM9Y,EAAK2kE,QAEM,OAAhBv3D,EAAQ86L,MAEfvkM,EAAMimM,OAAS5pM,EAAK++D,MACpBp7D,EAAMgmM,MAAQ3pM,EAAKoF,KACnBzB,EAAMiV,MAAQ5Y,EAAKmF,IACnBxB,EAAMmV,IAAM9Y,EAAK2kE,QAIdhhE,CAEX,CAEA,SAASF,EAAkBzD,EAASoN,EAASzJ,EAAOsJ,GAEhD,GAA0B,OAAtBG,EAAQg4J,WAA4C,QAAtBh4J,EAAQg4J,UAA1C,CAQA,IAqHgB9oK,EAASJ,EAAQ2R,EAASX,EArHtC/I,EAAaiJ,EAAQg2E,MAAMn+E,iBAAmBgI,EAElD,GAAkC,IAA9BG,EAAQg9L,kBAER,GAA0B,SAAtBh9L,EAAQg4J,WAA8C,OAAtBh4J,EAAQg4J,UAAoB,CAE5D,IAEI/hK,EAAQ2K,EAFJZ,EAAQs3D,wBAEU1kE,GAE1B,GAAqB,IAAjB2D,EAAMtH,SA2GFC,EA1Ga+G,EAAMumM,OA0GV1tM,EA1GkBmH,EAAMsmM,MA0GhB97L,EA1GuBlK,EAAMA,EAAMtH,OAAS,GAAGutM,OA4GvE1tM,GAFiCgR,EA1G8CvJ,EAAMA,EAAMtH,OAAS,GAAGstM,QA4GlFrtM,EAAUuR,GAAeX,GAAUhR,GAAY2R,GAAWvR,GA5FzE,CAGH,IAAI+H,EAAUuK,KAAK86L,KAAKrmM,EAAMsmM,MAAQtmM,EAAMumM,QAGxCxlM,EAAUwK,KAAK86L,KAAKrmM,EAAMyV,IAAMzV,EAAMuV,OAItCvU,GAAWhB,EAAMumM,OAASjmM,EAAMA,EAAMtH,OAAS,GAAGutM,QAAU,IAC5DjmM,EAAMA,EAAMtH,OAAS,GAAGutM,OAASvmM,EAAMumM,QAGvCvlM,GAAWhB,EAAMsmM,MAAQhmM,EAAMA,EAAMtH,OAAS,GAAGstM,OAAS,IAC1DhmM,EAAMA,EAAMtH,OAAS,GAAGstM,MAAQtmM,EAAMsmM,OAGtCvlM,GAAWf,EAAMuV,MAAQjV,EAAMA,EAAMtH,OAAS,GAAGuc,OAAS,IAC1DjV,EAAMA,EAAMtH,OAAS,GAAGuc,MAAQvV,EAAMuV,MACtCjV,EAAMA,EAAMtH,OAAS,GAAGgtM,WAAa1lM,EAAMA,EAAMtH,OAAS,GAAG6rK,SAAS7rK,QAGtE+H,GAAWf,EAAMyV,IAAMnV,EAAMA,EAAMtH,OAAS,GAAGyc,KAAO,IACtDnV,EAAMA,EAAMtH,OAAS,GAAGyc,IAAMzV,EAAMyV,IACpCnV,EAAMA,EAAMtH,OAAS,GAAGitM,SAAW3lM,EAAMA,EAAMtH,OAAS,GAAG6rK,SAAS7rK,OAG5E,MA1CIsH,EAAMod,KAAK,CACP6oL,OAAQvmM,EAAMumM,OACdD,MAAOtmM,EAAMsmM,MACb/wL,MAAOvV,EAAMuV,MACbE,IAAKzV,EAAMyV,IACXuwL,WAAY,EACZC,SAAU,EACVphC,SAAU,GACVihC,IAAK,GACLz4K,GAAI,GACJ3M,KAAM,GACN0Z,IAAA,IAiCR95B,EAAMA,EAAMtH,OAAS,GAAG0nB,MAAQ3W,EAAQyyD,YAExCl8D,EAAMA,EAAMtH,OAAS,GAAG6rK,SAASnnJ,KACzB,CACIizE,KAAM5mF,EACNi9L,QAASlmM,EACTylM,OAAQvmM,EAAMumM,OACdD,MAAOtmM,EAAMsmM,OAI7B,KAAiC,OAAtBv8L,EAAQg4J,WAAuC,IAAjBzhK,EAAMtH,SAE3CsH,EAAMA,EAAMtH,OAAS,GAAGohC,IAAA,QAQ5B,IAFA,IAAIn5B,EAAQ8I,EAAQ6yE,WAEb37E,GAECA,EAAM87E,WAAakqH,KAAKC,eAExB9mM,EAAkBzD,EAASsE,EAAOX,EAAOQ,GAEjB,SAApBG,EAAM8gK,WAA4C,QAApB9gK,EAAM8gK,UAIhCzhK,EAAMtH,OAAS,GAEfsH,EAAMA,EAAMtH,OAAS,GAAG8sM,IAAIpoL,KAAKzc,GAIV,SAApBA,EAAM8gK,WACT9gK,EAAM8+E,MAAMt4E,IAC4B,SAAxCxG,EAAM8+E,MAAMt4E,IAIZnH,EAAMtH,OAAS,GAEfsH,EAAMA,EAAMtH,OAAS,GAAGq0B,GAAG3P,KAAKzc,IAS5CA,EAAQA,EAAM2vF,WAjHtB,CAqHJ,CAQA,SAAS9vF,EAAkBnE,EAASoN,EAAazJ,EAAasJ,GAuBtD,IAAI3Q,EAnBW,SAAf2Q,EAAKm2E,QAMiB,SAAfn2E,EAAKm2E,MAEZh2E,EAAYg2E,MAAMt4E,GAA0B,SAI5CsC,EAAYg2E,MAAMt4E,GAA2BmC,EAAKm2E,MAAQ,IAAMn2E,EAAKu9L,QAKnD,WAAlBv9L,EAAK/H,UAA2C,UAAlB+H,EAAK/H,YAM/B5I,EAFgB,OAAhB0D,EAAQkoM,IAEiB,WAAlBj7L,EAAK/H,SAAyB,YAAc,aAK/B,OAAhBlF,EAAQkoM,IAEiB,WAAlBj7L,EAAK/H,SAAyB,cAAgB,aAI5B,WAAlB+H,EAAK/H,SAAyB,aAAe,cAM5DkI,EAAYg2E,MAAM10E,GAA6BpS,GAEvD,CAEA,SAAS+G,EAAyBrD,EAAOoN,GACrCkJ,KAAK4uL,MAAQllM,EACbsW,KAAKuP,IAAMzY,CACf,CAxsCApN,EAASjB,OAAS,SAAUiB,EACpBoN,EACAzJ,EACAsJ,EACA/Q,EACA2R,EACAX,EACAc,EACAvK,GAKJ,IAAIU,EAAS8I,GAAWG,EAAQ6wG,aAC5B56G,EAAQnH,GAAUkR,EAAQ+wG,YAE9B,GAAwB,OAApBn+G,EAAIugF,YAAsB,CAE1B,IAAIl8E,EAASF,EAASnE,EAAIugF,YAEtBl8E,EAAShB,EAETc,EAASyK,KAAKwU,MAAM/f,EAAQrD,EAAIugF,aAIhCl9E,EAAQgB,CAIhB,CAEA,IAAID,EAAgBnC,SAASC,cAAc,OAE3CkC,EAAcg/E,MAAMl+E,SAAW,WAC/Bd,EAAcg/E,MAAM/9E,MAAQhC,EAAQ,KACpCe,EAAcg/E,MAAM99E,OAASnB,EAAS,KACtCC,EAAcg/E,MAAM2kH,OAAS,OAC7B3jM,EAAcg/E,MAAMj+E,IAAM,EAC1Bf,EAAcg/E,MAAMze,OAAS,EAC7BvgE,EAAcg/E,MAAMh+E,KAAO,EAC3BhB,EAAcg/E,MAAMrkB,MAAQ,EAC5B36D,EAAcg/E,MAAMb,OAAS,EAE7B,IAAIj+E,EAAU,CACVA,EAAGH,EACH+R,EAAG7S,EACHwkM,QAAS,KACTC,QAAS,KACTF,YAAajkM,EACbw8H,sBAAuBtyH,IAAA,EACvBwtK,IAAKr7K,EACLmqM,aAAcj9L,EACd68L,iBAAkB/7L,EAClBoyH,aAAc38H,IAAA,EACdqmM,gBAAiB,CAAC,EAClBf,IAAK,KACLL,GAAI,KACJE,IAAK,KACLX,IAAK,KACLC,IAAK,KACLjD,KAAM,KACN+D,aAAc,KACdH,YAAa,MAKjB,GAFAz7L,EAAQ4lD,YAAY5uD,GAEhB,aAAcpE,EAEd,IAAK,IAAI8D,EAAI,EAAGA,EAAI9D,EAAI27K,SAASt/K,OAAQyH,IAErCxH,EAAegI,EAASF,EAAepE,EAAI27K,SAAS73K,GAAI9D,GAMhE,OAAOsE,EAAQwlM,eAEnB,EAmpDA,IAzhBA,IAAIzlM,EAAmB,CAEnB,IAAIhB,EACI,qDACA,SAAUrD,EAASoN,EAAazJ,EAAasJ,GAGzB,IAAZA,EAAK,KAGTG,EAAYg2E,MAAMn+E,gBAAkB,QAC5BgI,EAAK,GAAGjQ,WAAa,IACrBiQ,EAAK,GAAGjQ,WAAa,IACrBiQ,EAAK,GAAGjQ,WAAa,KACpBiQ,EAAK,GAAK,KAAKjQ,WAChB,IACZ,IAER,IAAIqG,EACI,2CACA,SAAUrD,EAASoN,EAAazJ,EAAasJ,GACzCG,EAAYg2E,MAAMzqB,MAAQ,QAClB1rD,EAAK,GAAGjQ,WAAa,IACrBiQ,EAAK,GAAGjQ,WAAa,IACrBiQ,EAAK,GAAGjQ,WAAa,KACpBiQ,EAAK,GAAK,KAAKjQ,WAChB,GACZ,IAER,IAAIqG,EACI,+CACA,SAAUrD,EAASoN,EAAazJ,EAAasJ,GAEzCG,EAAYg2E,MAAM+kH,UAAYl7L,CAElC,IAER,IAAI5J,EACI,6CACA,SAAUrD,EAASoN,EAAazJ,EAAasJ,GAAO,IAE5D,IAAI5J,EACI,kDACA,SAAUrD,EAASoN,EAAazJ,EAAasJ,GAMzCG,EAAYg2E,MAAMunB,QAAU,OAC5Bv9F,EAAYg2E,MAAMqnH,cAAgB,SAGrB,WAATx9L,EAEAG,EAAYg2E,MAAMsnH,eAAiB,aAEnB,WAATz9L,EAEPG,EAAYg2E,MAAMsnH,eAAiB,SAEnB,UAATz9L,IAEPG,EAAYg2E,MAAMsnH,eAAiB,WAG3C,IAER,IAAIrnM,EACI,4CACA,SAAUrD,EAASoN,EAAazJ,EAAasJ,GAGzCjN,EAAQ6nM,QAAU56L,EAAK3I,EAAE+jM,aAAaroM,EAAQkW,EAAGlW,EAAQsE,GACzDtE,EAAQ8nM,QAAU76L,EAAKiJ,EAAEmyL,aAAaroM,EAAQkW,EAAGlW,EAAQsE,GAOzD,IAAIhI,EAAS,EACTJ,EAAS,EAET2R,EAAIlK,EAAYohM,WAAW,6CAE1Bl3L,IAMDvR,EAASuR,EAAE,GAAGw6L,aAAaroM,EAAQkW,EAAGlW,EAAQsE,GAAKuJ,EAAE,GAAGw6L,aAAaroM,EAAQkW,EAAGlW,EAAQsE,GACxFpI,EAAS2R,EAAE,GAAGw6L,aAAaroM,EAAQkW,EAAGlW,EAAQsE,GAAKuJ,EAAE,GAAGw6L,aAAaroM,EAAQkW,EAAGlW,EAAQsE,IAI5F8I,EAAYg2E,MAAM99E,OAAUtF,EAAQ6nM,QAAUvrM,EAAU,KACxD8Q,EAAYg2E,MAAM/9E,MAASrF,EAAQ8nM,QAAU5rM,EAAU,IAE3D,IAER,IAAImH,EACI,gDACA,SAAUrD,EAASoN,EAAazJ,EAAasJ,GAMzC,IAJA,IAAI3Q,EAAO,GAIFJ,EAAI,EAAGA,EAAI+Q,EAAK5Q,OAAQH,IAC7B+Q,EAAK/Q,GAAK+Q,EAAK/Q,GAAGmR,OAEF,mBAAZJ,EAAK/Q,IAELI,EAAKykB,KAAK,eACVzkB,EAAKykB,KAAK,qBACVzkB,EAAKykB,KAAK,WACVzkB,EAAKykB,KAAK,cAES,0BAAZ9T,EAAK/Q,IAEZI,EAAKykB,KAAK,SACVzkB,EAAKykB,KAAK,aACVzkB,EAAKykB,KAAK,qBACVzkB,EAAKykB,KAAK,eAES,cAAZ9T,EAAK/Q,GAEZI,EAAKykB,KAAK,aAES,cAAZ9T,EAAK/Q,GAEZI,EAAKykB,KAAK,cAES,UAAZ9T,EAAK/Q,GAEZI,EAAKykB,KAAK,SAES,uBAAZ9T,EAAK/Q,IAEZI,EAAKykB,KAAK,YACVzkB,EAAKykB,KAAK,cAES,sBAAZ9T,EAAK/Q,GAEZI,EAAKykB,KAAK,SAIVzkB,EAAKykB,KAAK9T,EAAK/Q,IAOvB,GAAII,EAAKD,OAAS,EAAG,CAIjB,IAFA,IAAIwR,EAAO,CAACvR,EAAK,IAER4Q,EAAK,EAAGA,EAAK5Q,EAAKD,OAAQ6Q,KAEE,GAA7BW,EAAOpF,QAAQnM,EAAK4Q,KAEpBW,EAAOkT,KAAKzkB,EAAK4Q,IAKzB5Q,EAAOuR,CACX,CAEAT,EAAYg2E,MAAMk7F,WAAahiL,EAAKiS,KAAK,IAC7C,IAGR,IAAIlL,EACI,2CACA,SAAUrD,EAASoN,EAAazJ,EAAasJ,GAIzC,GAAa,IAATA,EAAJ,CAGA,IAAI3Q,GAAgB,GAAR2Q,EAIQ,OAAhBjN,EAAQkoM,IAER96L,EAAYg2E,MAAM8mH,UAAY,SAAW5tM,EAAQ,OAIjD8Q,EAAYg2E,MAAM8mH,UAAY,SAAW5tM,EAAQ,MAZ3C,CAgBd,IAGR,IAAI+G,EACI,8CACA,SAAUrD,EAASoN,EAAazJ,EAAasJ,GACzCG,EAAYg2E,MAAMwnC,SAAW39G,EAAKo7L,aAAaroM,EAAQkW,EAAGlW,EAAQsE,GAAK,IAC3E,IAGR,IAAIjB,EACI,+CACA,SAAUrD,EAASoN,EAAazJ,EAAasJ,GACzCG,EAAYg2E,MAAMunH,UAAY19L,CAClC,IAER,IAAI5J,EACI,gDACA,SAAUrD,EAASoN,EAAazJ,EAAasJ,GACzCG,EAAYg2E,MAAMrB,WAAa90E,CACnC,IAER,IAAI5J,EACI,gDACA,SAAUrD,EAASoN,EAAazJ,EAAasJ,GAGrCG,EAAYg2E,MAAMnB,WAFT,WAATh1E,EAE+B,SAIAA,EAAKo7L,aAAaroM,EAAQkW,EAAGlW,EAAQsE,GAAK,IAEjF,IAER,IAAIjB,EACI,6CACA,SAAUrD,EAASoN,EAAazJ,EAAasJ,GACzCG,EAAYg2E,MAAMlB,QAAUj1E,CAChC,IAER,IAAI5J,EACI,4CACA,SAAUrD,EAASoN,EAAazJ,EAAasJ,GACzCG,EAAYg2E,MAAMj+E,IAAM8H,EAAK3I,EAAE+jM,aAAaroM,EAAQkW,EAAGlW,EAAQsE,GAAK,KACpE8I,EAAYg2E,MAAMh+E,KAAO6H,EAAKiJ,EAAEmyL,aAAaroM,EAAQkW,EAAGlW,EAAQsE,GAAK,IACzE,IAER,IAAIjB,EACI,8CACA,SAAUrD,EAASoN,EAAazJ,EAAasJ,GACzCG,EAAYg2E,MAAMyY,SAAW5uF,CACjC,IAER,IAAI5J,EACI,6CACA,SAAUrD,EAASoN,EAAazJ,EAAasJ,GAMzC,IAAI3Q,EAAO,GAEXA,EAAK,GAAK2Q,EAAK,GAAGo7L,aAAaroM,EAAQkW,EAAGlW,EAAQsE,GAAK,KACvDhI,EAAK,GAAK2Q,EAAK,GAAGo7L,aAAaroM,EAAQkW,EAAGlW,EAAQsE,GAAK,KACvDhI,EAAK,GAAK2Q,EAAK,GAAGo7L,aAAaroM,EAAQkW,EAAGlW,EAAQsE,GAAK,KACvDhI,EAAK,GAAK2Q,EAAK,GAAGo7L,aAAaroM,EAAQkW,EAAGlW,EAAQsE,GAAK,KAEvD8I,EAAYg2E,MAAMynC,QAAUvuH,EAAKiS,KAAK,IAC1C,IAER,IAAIlL,EACI,8CACA,SAAUrD,EAASoN,EAAazJ,EAAasJ,GACzCG,EAAYg2E,MAAMj+E,IAAM8H,EAAK3I,EAAE+jM,aAAaroM,EAAQkW,EAAGlW,EAAQsE,GAAK,KACpE8I,EAAYg2E,MAAMh+E,KAAO6H,EAAKiJ,EAAEmyL,aAAaroM,EAAQkW,EAAGlW,EAAQsE,GAAK,IACzE,IAER,IAAIjB,EACI,+CACA,SAAUrD,EAASoN,EAAazJ,EAAasJ,GACzCG,EAAYg2E,MAAMwnH,UAAqB,gBAAT39L,EAAyB,eAAiB,QAC5E,IAER,IAAI5J,EACI,kDACA,SAAUrD,EAASoN,EAAazJ,EAAasJ,GAMrC,IAAI3Q,EAFK,WAAT2Q,GAA8B,UAATA,IAQjB3Q,EAJAwH,EAIMmJ,EAEiB,OAAhBjN,EAAQkoM,KAOK,OAAhBloM,EAAQkoM,IALI,WAATj7L,EAAqB,OAAS,QAWjB,WAATA,EAAqB,QAAU,OAQ9CG,EAAY0wG,cAAc16B,MAAM1/E,GAAqBpH,EAE7D,IAER,IAAI+G,EACI,mDACA,MAER,IAAIA,EACI,+CACA,SAAUrD,EAASoN,EAAazJ,EAAasJ,GAEzC,IAAI3Q,EAMAA,EAFS,UAAT2Q,EAEsB,OAAhBjN,EAAQioM,IAAgB,QAAU,OAExB,QAATh7L,EAEe,OAAhBjN,EAAQioM,IAAgB,OAAS,QAIlCh7L,EAITG,EAAYg2E,MAAMzjB,UAAYrjE,CAElC,IAER,IAAI+G,EACI,oDACA,SAAUrD,EAASoN,EAAazJ,EAAasJ,GACzCG,EAAYg2E,MAAMynH,eAAiB59L,EAAKsB,KAAK,KAAK/L,QAAQ,cAAe,eAC7E,IAER,IAAIa,EACI,iDACA,SAAUrD,EAASoN,EAAazJ,EAAasJ,GAG7C,IAER,IAAI5J,EACI,gDACA,SAAUrD,EAASoN,EAAaH,EAAa3Q,GAEzC,IAAIJ,EAAO+Q,EAAY83L,WAAWphM,EAAWqhM,OAAO8F,YAAY5F,OAEhE,GAAa,SAAT5oM,GAA4B,SAATJ,EAEnBkR,EAAYg2E,MAAM2nH,WAAa,OAE5B,CAEH,IAAIl9L,EAAI,GAER,GAAa,SAAT3R,EAAiB,CAIjB,IAAIgR,EAAW,QACKhR,EAAKy8D,MAAM,GAAG37D,WAAa,IAC3Bd,EAAKy8D,MAAM,GAAG37D,WAAa,IAC3Bd,EAAKy8D,MAAM,GAAG37D,WAAa,KAC1Bd,EAAKy8D,MAAM,GAAK,KAAK37D,WACtB,IAEpB6Q,EAAEkT,KAAO,eAAiB7T,GAC1BW,EAAEkT,KAAO,gBAAkB7T,GAC3BW,EAAEkT,KAAO,gBAAkB7T,GAC3BW,EAAEkT,KAAO,iBAAmB7T,EAEhC,CAIA,GAAa,SAAT5Q,EAEA,IAAK,IAAI0R,EAAI,EAAGA,EAAI1R,EAAKD,OAAQ2R,IAG7BH,EAAEkT,KAAKzkB,EAAK0R,GAAGg9L,MAAM3C,aAAaroM,EAAQkW,EAAGlW,EAAQsE,GAAK,MAClDhI,EAAK0R,GAAGi9L,MAAM5C,aAAaroM,EAAQkW,EAAGlW,EAAQsE,GAAK,MACnDhI,EAAK0R,GAAGk9L,SAAS7C,aAAaroM,EAAQkW,EAAGlW,EAAQsE,GAFlD,WAIChI,EAAK0R,GAAG2qD,MAAM,GAAG37D,WAAa,IAC9BV,EAAK0R,GAAG2qD,MAAM,GAAG37D,WAAa,IAC9BV,EAAK0R,GAAG2qD,MAAM,GAAG37D,WAAa,KAC7BV,EAAK0R,GAAG2qD,MAAM,GAAK,KAAK37D,WACzB,KAOhBoQ,EAAYg2E,MAAM2nH,WAAal9L,EAAEU,KAAK,IAE1C,CACJ,IAER,IAAIlL,EACI,iDACA,SAAUrD,EAASoN,EAAazJ,EAAasJ,GAEzCG,EAAYg2E,MAAM+nH,mBAAqBl+L,CAE3C,IAER,IAAI5J,EACI,kDACA,SAAUrD,EAASoN,EAAazJ,EAAasJ,GAI7C,IAER,IAAI5J,EACI,iDACA,SAAUrD,EAASoN,EAAazJ,EAAasJ,GAEzC,IAAI3Q,EAGAA,EADS,iBAAT2Q,EACK,gBAEAA,EAGTG,EAAYg2E,MAAMgoH,YAAc9uM,CACpC,IAER,IAAI+G,EACI,gDACA,SAAUrD,EAASoN,EAAazJ,EAAasJ,GACzCG,EAAYg2E,MAAMioH,WAAap+L,CACnC,IAER,IAAI5J,EACI,gDACA,SAAUrD,EAASoN,EAAazJ,EAAasJ,GAE5B,SAATA,EAE0B,aAAtBtJ,EAAY4jM,MACZn6L,EAAYg2E,MAAMkoH,WAAa,WAE/Bl+L,EAAYg2E,MAAMkoH,WAAa,SAKT,aAAtB3nM,EAAY4jM,MAEZn6L,EAAYg2E,MAAMkoH,WAAa,MAG/Bl+L,EAAYg2E,MAAMkoH,WAAa,QAK3C,IAER,IAAIjoM,EACI,iDACA,SAAUrD,EAASoN,EAAazJ,EAAasJ,GAI5B,SAATA,GAA4B,OAATA,GAIH,SAATA,GAA4B,OAATA,EAF1BG,EAAYg2E,MAAM4kH,YAAc,gBAMhB,SAAT/6L,EAEPG,EAAYg2E,MAAM4kH,YAAc,cAEhB,SAAT/6L,GAA4B,OAATA,IAE1BG,EAAYg2E,MAAM4kH,YAAc,cAIxC,IAER,IAAI3kM,EACI,4CACA,SAAUrD,EAASoN,EAAazJ,EAAasJ,GACzCG,EAAYg2E,MAAMb,OAASt1E,CAC/B,IAER,IAAI5J,EACI,iEACA,SAAUrD,EAASoN,EAAazJ,EAAasJ,GAErCjN,EAAQmgI,wBAAA,IAAyBlzH,IACjCG,EAAYg2E,MAAMioH,WAAa,SAGvC,KAIRjnM,EAAmB,CAAC,EAEfE,EAAI,EAAGA,EAAID,EAAiBhI,OAAQiI,IAEzCF,EAAiBC,EAAiBC,GAAG4gM,OAAS7gM,EAAiBC,GAKnE,IAAIR,EAAoB,uBAAwBd,OAAO46G,iBAAiB37G,SAASwyF,iBAE7E/wF,EAAoBI,EAAoB,qBAAuB,eAE/DgH,EAAyB,4BAA6B9H,OAAO46G,iBAAiB37G,SAASwyF,iBAAmB,0BAA4B,oBAEtI/lF,EAA4B,+BAAgC1L,OAAO46G,iBAAiB37G,SAASwyF,iBAAmB,6BAA+B,uBAInJ,SAASpvE,EAAYrlB,EAAcoN,GAE/B,GAAIpN,GAAgBA,EAAawL,OAASxL,EAAawL,MAAM4B,GACzD,MAAMA,CAEd,CAEH,CApyDD,CAoyDyDA,EAC5B,oBAAdq6L,UAA4B9jM,EAAQ,KAAa8jM,UAClC,oBAAfC,WAA6B/jM,EAAQ,MAAc+jM,WACrC,oBAAdC,UAA4BhkM,EAAQ,MAAagkM,UAAA,gBAAA3nM,EAAAoN,EAAAzJ,ICxyDhE,SAAW3D,EAASoN,EAAWzJ,EAAYsJ,GAavCjN,EAAQi+K,YAAc,SAAUj+K,EAAIoN,EAAQH,GAMxC,IAWI3Q,EAXAuR,EAAM,IAAIG,EAAIhO,GAIdkN,EAAU,CAId,EAIIzJ,EAAgB,CAAC,EAGjBU,EAAwBnE,EAAGu+G,KAAKmnF,QAAQE,SAASjiM,EAAWqhM,OAAOuG,eAAerG,OAClF7hM,EAAyBrD,EAAGu+G,KAAKmnF,QAAQE,SAASjiM,EAAWqhM,OAAO//L,gBAAgBigM,OACxF,IAAK,IAAI7gM,KAAgBrE,EAAGu+G,KAAKonF,OAAOG,QAEpC,GAAI9lM,EAAGu+G,KAAKonF,OAAOG,QAAQ7oM,eAAeoH,GAAe,CACrD,IAAID,EAASpE,EAAGu+G,KAAKonF,OAAOG,QAAQzhM,GAChCC,EAAiBF,EAAO2gM,WAAWphM,EAAWqhM,OAAOuG,eAAerG,QAAU/gM,EAC9EL,EAAkBM,EAAO2gM,WAAWphM,EAAWqhM,OAAO//L,gBAAgBigM,QAAU7hM,EACpFI,EAAcW,EAAO6T,KACG,WAAnB3T,QAAA,IAA+BA,SAAA,IAChCR,KACEsJ,EAAShJ,EAAOghM,OAASh4L,GAAUhJ,EAAO0U,IAEpD,CAmDJ,IAAK,IAAIpV,KA9CL1D,EAAGspC,MAAQtpC,EAAGspC,KAAKy8J,WACnBtiM,EAAczD,EAAGspC,KAAKy8J,WAAA,GAkCtBzpM,EADY,OAAZ0D,EAAGspC,KA9BP,SAAStpC,EAAOoN,EAAQzJ,GAKpB,GAAIA,EAAQg4K,SAAU,CAClB,IAAI1uK,EAAQ,CAAC,EACb,IAAK,IAAI3Q,KAAQqH,EACTA,EAAQ1G,eAAeX,KACvB2Q,EAAM3Q,GAAQqH,EAAQrH,IAe9B,OAZA2Q,EAAM0uK,SAAW,GAEjBh4K,EAAQg4K,SAAStkK,QAbrB,SAAsBrX,GAClB,QAASoN,EAASpN,EAAQolM,OAASh4L,GAAUpN,EAAQ8Y,IACzD,IAW0CpP,SAAQ,SAAU/F,GACpD,IAAIrH,EAAkB0D,EAAOoN,EAAQzJ,GACjCrH,EAAgBypM,WAChBtiM,EAAcnH,EAAgBypM,WAAA,GAGV,OAApBzpM,GACA2Q,EAAM0uK,SAAS56J,KAAKzkB,EAE5B,IACO2Q,CACX,CACI,OAAOtJ,CAEf,CA5BA,CA+BkByJ,EAAQpN,EAAGspC,MAElB,cAIP7lC,EAAc,MACdA,EAAc,KAAM,GAIHA,EACjB,GAAIA,EAAcC,GAAW,CAGzB,IAAIoH,EAAI5O,EAAyB8D,EAAIoN,EAAQpN,EAAGu+G,KAAKonF,OAAOG,QAAQpiM,GAAWpH,EAAM,KAAM,GAAI0D,EAAGu+G,KAAKonF,OAAOG,QAAQpiM,GAAWuJ,EAAcC,GAErI,OAANpC,GAIA+C,EAAI8tK,SAAS56J,KAAKjW,EAAE0qF,QAE5B,CAGJ,OAAO3nF,CACX,EAIA,IAAIvR,EAAiB,CACjBqH,EAAWqhM,OAAOrsI,MAAMusI,MACxBvhM,EAAWqhM,OAAOiE,YAAY/D,MAC9BvhM,EAAWqhM,OAAO6F,eAAe3F,MACjCvhM,EAAWqhM,OAAOgE,aAAa9D,MAC/BvhM,EAAWqhM,OAAO8F,YAAY5F,MAC9BvhM,EAAWqhM,OAAO+F,WAAW7F,OAGjC,SAAShpM,EAAyB8D,EAAKoN,EAAQY,EAAQ3K,EAAMgB,EAAQD,EAAqBE,EAAMR,EAAcJ,GAI1G,GAAI0J,EAAS9I,EAAK8gM,OAASh4L,GAAU9I,EAAKwU,IACtC,OAAO,KAQX,IAAIhO,EAAuB,aAAcxG,GAA0B,KAAlBA,EAAKyhM,SAAkBzhM,EAAKyhM,SAAW3hM,EAWxF,GAAe,OAAXC,GACAyG,IAAyBkD,EAAOiK,OAEzB,aAAc3T,IAChB,aAAcA,GAAiC,IAAzBA,EAAKq3K,SAASt/K,QACZ,KAAzByO,GAGJ,OAAO,KAIX,IAAI4D,EAAc,IAAIjL,EAAkBa,GAIxC,GAAI,SAAUA,EACV,IAAK,IAAI+gB,EAAI,EAAGA,EAAI/gB,EAAKghM,KAAKjpM,OAAQgpB,IAE9BjY,EAAS9I,EAAKghM,KAAKjgL,GAAG+/K,OAASh4L,GAAU9I,EAAKghM,KAAKjgL,GAAGvM,MAG1DpK,EAAYq2L,WAAWzgM,EAAKghM,KAAKjgL,GAAG6/K,OAAS5gM,EAAKghM,KAAKjgL,GAAGvd,OAUlE,IAAIsO,EAAY,CAAC,EAEjB,IAAK,IAAItH,KAASJ,EAAYq2L,WAE1B,GAAMr2L,EAAYq2L,WAAW9nM,eAAe6R,KAE5CsH,EAAUtH,IAAA,EAOe,WAArBJ,EAAY+nB,MACZ3nB,IAAUnL,EAAWqhM,OAAOgD,YAAY9C,SACtCvhM,EAAWqhM,OAAOmD,UAAUjD,SAASx2L,EAAYq2L,aAAa,CAEhE,IAAI/1L,EAAKN,EAAYq2L,WAAWj2L,GAErB,SAAPE,GAAwB,OAAPA,EAEjBN,EAAYq2L,WAAWphM,EAAWqhM,OAAOmD,UAAUjD,OAAS,MAE9C,SAAPl2L,GAAwB,OAAPA,IAExBN,EAAYq2L,WAAWphM,EAAWqhM,OAAOmD,UAAUjD,OAAS,MAIpE,CAKJ,GAAe,OAAX7gM,EAEA,IAAK,IAAIlI,EAAI,EAAGA,EAAIwH,EAAWtC,IAAIhF,OAAQF,IAAK,CAE5C,IAAI4W,EAAKpP,EAAWtC,IAAIlF,GAIxB,GAAI4W,EAAGmyL,QAAUvhM,EAAWqhM,OAAO6F,eAAe3F,MAAO,CAIrD,IAAInvL,EAAK1R,EAAO0gM,WAAWhyL,EAAGmyL,OAC1BxvL,EAAKhH,EAAYq2L,WAAWhyL,EAAGmyL,OAC/BhvL,EAAO,YAEPR,EAEAQ,EAAOH,GAEwB,IAAxBL,EAAGjN,QAAQ,WAEkB,IAA/BiN,EAAGjN,QAAQ,iBACiB,IAA7BsN,EAAGtN,QAAQ,eACkB,IAA7BiN,EAAGjN,QAAQ,eAEXyN,EAAK6K,KAAK,eAIwB,IAAjCrL,EAAGjN,QAAQ,mBACmB,IAA/BsN,EAAGtN,QAAQ,iBACoB,IAA/BiN,EAAGjN,QAAQ,iBAEXyN,EAAK6K,KAAK,iBAIqB,IAA9BrL,EAAGjN,QAAQ,gBACgB,IAA5BsN,EAAGtN,QAAQ,cACiB,IAA5BiN,EAAGjN,QAAQ,cAEXyN,EAAK6K,KAAK,aAMd7K,EAAK6K,KAAK,QAIdrS,EAAYq2L,WAAWhyL,EAAGmyL,OAAShvL,CAEvC,MAAO,GAAInD,EAAGmyL,QAAUvhM,EAAWqhM,OAAOp6E,SAASs6E,OAC7CnyL,EAAGmyL,SAASx2L,EAAYq2L,YACL,SAArBr2L,EAAY+nB,MAC6C,kBAAzD/nB,EAAYq2L,WAAWphM,EAAWqhM,OAAOC,KAAKC,OAU3C,GAAInyL,EAAGmyL,QAAUvhM,EAAWqhM,OAAOp6E,SAASs6E,OAC7CnyL,EAAGmyL,SAASx2L,EAAYq2L,YACL,SAArBr2L,EAAY+nB,MAC6C,SAAzD/nB,EAAYq2L,WAAWphM,EAAWqhM,OAAOC,KAAKC,OAiBvCnyL,EAAGy4L,SACTz4L,EAAGmyL,SAAS7gM,EAAO0gM,cAClBhyL,EAAGmyL,SAASx2L,EAAYq2L,cAE1Br2L,EAAYq2L,WAAWhyL,EAAGmyL,OAAS7gM,EAAO0gM,WAAWhyL,EAAGmyL,YArBS,CAIjE,IAAIhsL,EAAY7U,EAAO0gM,WAAWphM,EAAWqhM,OAAOp6E,SAASs6E,OAEL,kBAApD7gM,EAAO0gM,WAAWphM,EAAWqhM,OAAOC,KAAKC,OAEzCx2L,EAAYq2L,WAAWhyL,EAAGmyL,OAAShsL,EAInCxK,EAAYq2L,WAAWhyL,EAAGmyL,OAAS,IAAIj4L,EAAU25L,eAC7C,GAAM1tL,EAAUuyL,GAChB,GAAMvyL,EAAU6mF,GAG5B,KA9B8E,CAI1E,IAAI5pF,EAAU9R,EAAO0gM,WAAWphM,EAAWqhM,OAAOp6E,SAASs6E,OAE3Dx2L,EAAYq2L,WAAWhyL,EAAGmyL,OAAS,IAAIj4L,EAAU25L,eAC7C,GAAMzwL,EAAQs1L,GACd,GAAMt1L,EAAQ4pF,GAEtB,CA4BJ,CAMJ,IAAK,IAAI9pF,EAAI,EAAGA,EAAItS,EAAWtC,IAAIhF,OAAQ4Z,IAAK,CAE5C,IAAIgD,EAAMtV,EAAWtC,IAAI4U,GAIzB,KAAIgD,EAAIisL,SAASx2L,EAAYq2L,eAIzB9rL,EAAIisL,QAAUvhM,EAAWqhM,OAAO9/L,SAASggM,OACzCvhM,EAAWqhM,OAAOz2H,OAAO22H,SAASx2L,EAAYq2L,YAK9C9rL,EAAIisL,QAAUvhM,EAAWqhM,OAAOz2H,OAAO22H,OACvCvhM,EAAWqhM,OAAO9/L,SAASggM,SAASx2L,EAAYq2L,YADpD,CAMA,IAAI1sL,EAAKrY,EAAIu+G,KAAKmnF,QAAQE,SAAS3sL,EAAIisL,QAAUjsL,EAAIyyL,QAErD,GAAW,OAAPrzL,IAQqB,WAArB3J,EAAY+nB,OAAA,IAAsBxd,EAAIuyL,SAA4B,OAAPnzL,GAAc,CAEzE,IAAIf,EAAM2B,EAAIgY,MAAM5Y,GAER,OAARf,GAEA5I,EAAYq2L,WAAW9rL,EAAIisL,OAAS5tL,EAIpClB,EAAU6C,EAAIisL,QAAA,GAId/gM,EAAYL,EAAc,8BAAgCmV,EAAIisL,MAAQ,iBAAmBx2L,EAAY+nB,KAI7G,CAhCY,CAkChB,CAKA,IAAK,IAAIhkB,EAAI,EAAGA,EAAI9O,EAAWtC,IAAIhF,OAAQoW,IAAK,CAE5C,IAAI8E,EAAK5T,EAAWtC,IAAIoR,GAExB,GAAM8E,EAAG2tL,SAAS9uL,GAEC,OAAfmB,EAAGo0L,QAAkB,CAErB,IAAI9gM,EAAS0M,EAAGo0L,QAEZ3rM,EACAqE,EACAqK,EACAA,EAAYq2L,WAAWxtL,EAAG2tL,OAC1BxhM,GAGW,OAAXmH,EAEA6D,EAAYq2L,WAAWxtL,EAAG2tL,OAASr6L,GAKnC6D,EAAYq2L,WAAWxtL,EAAG2tL,OAAS3tL,EAAGo0L,QAElC3rM,EACAqE,EACAqK,EACA6I,EAAG0Z,MAAM1Z,EAAGm0L,SACZhoM,GAGJS,EAAYL,EAAc,UAAYyT,EAAG2tL,MAAQ,iBAAmBx2L,EAAY+nB,KAAO,wBAE/F,CAEJ,CAIA,GAAgE,SAA5D/nB,EAAYq2L,WAAWphM,EAAWqhM,OAAOr6F,QAAQu6F,OACjD,OAAO,KAIX,IAAI5hM,EAAW,KAEA,OAAXe,EAQIf,EAJS,OAATD,EAIW,GAMA,CAACA,GAIT,aAAciB,IAErBhB,EAAWgB,EAAKq3K,UAIpB,IAAK,IAAIxiK,EAAI,EAAgB,OAAb7V,GAAqB6V,EAAI7V,EAASjH,OAAQ8c,IAAK,CAE3D,IAAIqX,EAAIt0B,EAAyB8D,EAAKoN,EAAQY,EAAQ3K,EAAMqL,EAAa5D,EAAsBxH,EAAS6V,GAAIrV,EAAcJ,GAOhH,OAAN8sB,GAEA9hB,EAAYitK,SAAS56J,KAAKyP,EAAEglE,QAIpC,CAIA,IAAK,IAAIp8E,KAAU1K,EAAYq2L,WAC3B,GAAKr2L,EAAYq2L,WAAW9nM,eAAemc,GAA3C,CAIA,IAAIU,GAAA,EAKJ,GAAyB,SAArBpL,EAAY+nB,KAAiB,CAE7B,IAAIvyB,EAAMwK,EAAYq2L,WAAWphM,EAAWqhM,OAAOC,KAAKC,QAExDprL,GAAe,cAAR5V,GAA+B,kBAARA,GAAmC,kBAARA,KACjB,IAApC5H,EAAemM,QAAQ2Q,MAIvBU,EAAa,cAAR5V,GACDkV,IAAWzV,EAAWqhM,OAAO4F,UAAU1F,OAIzCprL,IAEFA,IAAkB,kBAAR5V,GAAmC,SAARA,IACjCkV,IAAWzV,EAAWqhM,OAAO4G,aAAa1G,MAItD,CAIA,IAAMprL,EAAI,CAEN,IAAI2N,EAAK9jB,EAAWsiM,QAAQ7sL,GAExB,YAAaqO,IAEb3N,GAA+C,IAA1C2N,EAAGokL,QAAQpjM,QAAQiG,EAAY+nB,MAI5C,CAGI3c,UACOpL,EAAYq2L,WAAW3rL,EAhD0B,CAuDhE,IAAI4G,EAAOtR,EAAYq2L,WAAWphM,EAAWqhM,OAAOC,KAAKC,OAEzD,GAAyB,MAArBx2L,EAAY+nB,MACU,SAArB/nB,EAAY+nB,OAA6B,kBAATzW,GAAqC,SAATA,GAC3D,CAEF,IAAIvD,EAAQ,GAEZ5O,EAAkBa,EAAa+N,GAkCvC,SAAsBzc,GAclB,IAFA,IAAIoN,EAEKzJ,EAAI,EAAGA,EAAI3D,EAAM3D,QAItB,GAAqB,QAFrB+Q,EAAUpN,EAAM2D,IAEJ8yB,MAAmC,aAAlBrpB,EAAQm6L,MAArC,CAKA,IAAIt6L,EAAeG,EAAQ2W,KAAKvhB,QAAQ,cAAe,KAEnD,OAAOX,KAAKoL,KAEF,IAANtJ,GAxBqB,QADTrH,EAyBc0D,EAAM2D,EAAI,IAxBxB8yB,MAAiB,aAAa50B,KAAKvF,EAAaynB,SAyB5D9W,EAAeA,EAAakB,UAAU,IAK9Cf,EAAQ2W,KAAO9W,EAEa,IAAxBA,EAAa5Q,OACb2D,EAAMwnB,OAAO7jB,EAAG,GAEhBA,GAjBJ,MAFIA,IAjBR,IAAwBrH,EAIAJ,EAuCxB,IAAKyH,EAAI,EAAGA,EAAI3D,EAAM3D,OAAQsH,IAIL,QAFrByJ,EAAUpN,EAAM2D,IAEJ8yB,MAAmC,aAAlBrpB,EAAQm6L,MAKjC,OAAO1lM,KAAKuL,EAAQ2W,QAEhBpgB,IAAO3D,EAAM3D,OAAS,GAjDD,QADTH,EAkD+B8D,EAAM2D,EAAI,IAjDzC8yB,MAAyC,aAAvBv6B,EAAaqrM,OAAwB,UAAU1lM,KAAK3F,EAAa6nB,SAkD/F3W,EAAQ2W,KAAO3W,EAAQ2W,KAAKrN,MAAM,GAAI,IAP1C/S,GAcZ,CAhEA,CAhCqB8Y,GAEbvP,EAAgBwB,EAEpB,CAWA,MAA0B,QAArBA,EAAY+nB,MAAkB9yB,EAAWqhM,OAAO78E,gBAAgB+8E,SAASx2L,EAAYq2L,YACjE,OAArBr2L,EAAY+nB,MACS,UAArB/nB,EAAY+nB,MACX,aAAc/nB,GAAeA,EAAYitK,SAASt/K,OAAS,GACtC,SAArBqS,EAAY+nB,MAAwC,OAArB/nB,EAAYqV,MACtB,WAArBrV,EAAY+nB,MAC0D,WAAnE/nB,EAAYq2L,WAAWphM,EAAWqhM,OAAOuG,eAAerG,OAErD,CACH4G,UAAWhhM,EACX0qF,QAAS9mF,GAIV,IACX,CAoEA,SAASb,EAAkB7N,EAASoN,GAEhC,GAAO,aAAcpN,EAIrB,IAAK,IAAIiN,EAAI,EAAGA,EAAIjN,EAAQ27K,SAASt/K,OAAQ4Q,IAAK,CAE9C,IAAI3Q,EAAQ0D,EAAQ27K,SAAS1uK,GACzB/Q,EAAOI,EAAMyoM,WAAWphM,EAAWqhM,OAAOC,KAAKC,QAEhC,SAAf5oM,EAAMm6B,MAA6B,kBAATv6B,GAAqC,SAATA,KAM/C,aAAcI,EAErBuR,EAAkBvR,EAAO8Q,IAEF,SAAf9Q,EAAMm6B,MAAyC,IAAtBn6B,EAAMynB,KAAK1nB,QAAgC,OAAfC,EAAMm6B,OAInErpB,EAAM2T,KAAKzkB,GAInB,CAEJ,CAEA,SAAS4Q,EAAgBlN,GAErB,GAAqB,OAAjBA,EAAQy2B,KAER,OAAO,EAEJ,GAAI,SAAUz2B,EAEjB,OAAgC,IAAxBA,EAAQ+jB,KAAK1nB,OAElB,GAAI,aAAc2D,EAAS,CAI9B,IAFA,IAAIoN,EAAIpN,EAAQ27K,SAASt/K,OAElB+Q,KAECF,EAAgBlN,EAAQ27K,SAASvuK,KACjCpN,EAAQ27K,SAASn0J,OAAOpa,EAAG,GAKnC,OAAmC,IAA5BpN,EAAQ27K,SAASt/K,MAE5B,CACJ,CAEA,SAAS2R,EAAIhO,GACTsW,KAAKqlK,SAAW,GAChBrlK,KAAKiqE,YAAcvgF,EAAGugF,YACtBjqE,KAAKkZ,KAAOxvB,EAAGwvB,IACnB,CAEA,SAAS/rB,EAAkBzD,GAmBvB,IAAK,IAAIoN,KAfTkJ,KAAKmgB,KAAOz2B,EAAOy2B,MAAQ,SAI3BngB,KAAKkZ,KAAOxvB,EAAOwvB,KAIfxvB,EAAOiY,KACP3B,KAAK2B,GAAKjY,EAAOiY,IAIrB3B,KAAKyuL,WAAa,CAAC,EAED/kM,EAAO+kM,WAEf/kM,EAAO+kM,WAAW9nM,eAAemQ,KAEvCkJ,KAAKyuL,WAAW33L,GACZpN,EAAO+kM,WAAW33L,IAKtB,QAASpN,IAETsW,KAAKy8C,IAAM/yD,EAAO+yD,KAIjB,SAAU/yD,IAEXsW,KAAKrY,KAAO+B,EAAO/B,MAOnB,SAAU+B,EAEVsW,KAAKyN,KAAO/jB,EAAO+jB,MAEE,WAAdzN,KAAKmgB,MAAqB,aAAcz2B,KAE/CsW,KAAKqlK,SAAW,IAGhB,UAAW37K,IAEXsW,KAAKixL,MAAQvnM,EAAOunM,MAE5B,CAsBA,SAASpjM,EAAYnE,EAAcoN,GAE/B,GAAIpN,GAAgBA,EAAawL,OAASxL,EAAawL,MAAM4B,GACzD,MAAMA,CAEd,CAYH,CAxxBD,CAwxBwDA,EAC/B,oBAAdq6L,UAA4B9jM,EAAQ,KAAa8jM,UAClC,oBAAfC,WAA6B/jM,EAAQ,MAAc+jM,WACrC,oBAAdC,UAA4BhkM,EAAQ,MAAagkM,UAAA,gBAAA3nM,EAAAoN,EAAAzJ,GCjyB5DyJ,EAAQ6wK,YAAct6K,EAAtB,MAAAs6K,YACA7wK,EAAQwwK,QAAUj6K,EAAlB,MAAAi6K,QACAxwK,EAAQmuK,WAAa53K,EAArB,KAAA5E,MAAA,eAAAiB,EAAAoN,ICGA,SAAWpN,GAEPA,EAAUomM,MAAQ,4BAClBpmM,EAAU+mM,OAAS,oCACnB/mM,EAAU0mM,OAAS,sCACnB1mM,EAAU+rM,OAAS,uCACnB/rM,EAAUonM,QAAU,kDACpBpnM,EAAU8mM,QAAU,oDACpB9mM,EAAUgsM,SAAW,uDACrBhsM,EAAUqnM,UAAY,kBAEzB,CAXD,CAW0Dj6L,EAAA,gBAAApN,EAAAoN,EAAAzJ,ICX1D,SAAW3D,EAAYoN,EAAWzJ,GAE9B,SAASsJ,EAA2BjN,EAAIoN,EAAMzJ,EAAcsJ,EAAW3Q,EAAWJ,EAAc2R,EAAWX,GACvGoJ,KAAKnY,KAAOiP,EACZkJ,KAAK4vD,GAAKlmE,EACVsW,KAAK4uL,MAAQllM,EAAK,IAAMoN,EACxBkJ,KAAKk1L,QAAUlvM,EACfga,KAAK21L,WAAa/vM,EAClBoa,KAAKo1L,QAAU/nM,EACf2S,KAAKu1L,QAAU5+L,EACfqJ,KAAK2a,MAAQpjB,EACbyI,KAAKq1L,QAAUz+L,CACnB,CAsoCA,IAAK,IAAI5Q,KApoCT0D,EAAWqB,IAAM,CAEb,IAAI4L,EACAG,EAAU25L,OACV,kBACA,cACA,CAAC,OAAQ,MAAO,IAAK,SAAU,YAC/B,EAEApjM,EAAUuoM,WACV,MAEJ,IAAIj/L,EACAG,EAAU25L,OACV,QACA,QACA,CAAC,YACD,EAEApjM,EAAUuoM,WACV,MAEJ,IAAIj/L,EACAG,EAAU25L,OACV,YACA,MACA,CAAC,IAAK,YACN,GAEA,SAAU/mM,GACN,OAAOA,CACX,GACA,MAEJ,IAAIiN,EACAG,EAAU25L,OACV,UACA,OACA,CAAC,OAAQ,MAAO,IAAK,SAAU,YAC/B,GAEA,SAAU/mM,GACN,OAAOA,CACX,GACA,MAEJ,IAAIiN,EACAG,EAAU25L,OACV,eACA,SACA,CAAC,cACD,GAEA,SAAU/mM,GACN,OAAOA,CACX,GACA,MAEJ,IAAIiN,EACAG,EAAU25L,OACV,SACA,OACA,CAAC,KAAM,cACP,GAEA,SAAU/mM,GAEN,GAAY,SAARA,EAEA,OAAOA,EAIP,IAAIoN,EAAIpN,EAAIqO,MAAM,KAClB,GAAiB,IAAbjB,EAAE/Q,OACF,OAAO,KACX,IAAI4Q,EAAItJ,EAAUqjM,YAAY55L,EAAE,IAC5B9Q,EAAIqH,EAAUqjM,YAAY55L,EAAE,IAChC,OAAK9Q,GAAM2Q,EAEJ,CAAC3I,EAAKhI,EAAG4Z,EAAKjJ,GADV,IAInB,IACA,SAAUjN,EAAKoN,EAAQH,EAAS3Q,EAAMJ,GAElC,IAAI2R,EACAX,EAEJ,GAAa,SAAT5Q,EAEAuR,EAAI,IAAIlK,EAAUijM,eAAe,EAAG,QAcpC,GAAU,QAVV/4L,EAAIlK,EAAUwoM,iBACV7vM,EAAKgI,EAAEwD,MACPxL,EAAKgI,EAAE80C,KACP,KACAp5C,EAAIknM,WAAW5iM,EACf,KACAtE,EAAIinM,SAAS3iM,IAMb,OAAO,KAKf,GAAa,SAAThI,EAEA4Q,EAAI,IAAIvJ,EAAUijM,eAAe,EAAG,QAapC,GAAU,QATV15L,EAAIvJ,EAAUwoM,iBACV7vM,EAAK4Z,EAAEpO,MACPxL,EAAK4Z,EAAEkjC,KACP,KACAp5C,EAAIknM,WAAWhxL,EACf,KACAlW,EAAIinM,SAAS/wL,IAKb,OAAO,KAMf,MAAO,CAAC5R,EAAKuJ,EAAGqI,EAAKhJ,EACzB,IAEJ,IAAID,EACAG,EAAU25L,OACV,aACA,UACA,CAAC,OAAQ,SACT,GAEA,SAAU/mM,GAIN,IAHA,IAAIoN,EAAMpN,EAAIqO,MAAM,KAChB1K,EAAO,GAEFsJ,EAAI,EAAGA,EAAIG,EAAI/Q,OAAQ4Q,IAC5BG,EAAIH,GAAKG,EAAIH,GAAGI,OAES,MAArBD,EAAIH,GAAGlK,OAAO,IAAmC,MAArBqK,EAAIH,GAAGlK,OAAO,IAE3B,YAAXqK,EAAIH,GAIJtJ,EAAKod,KAAK,kBAUdpd,EAAKod,KAAK3T,EAAIH,IAMtB,OAAOtJ,CACX,GACA,MAEJ,IAAIsJ,EACAG,EAAU25L,OACV,QACA,KACA,CAAC,SACD,EAEApjM,EAAUqjM,aACV,SAAUhnM,EAAKoN,EAAQzJ,EAASsJ,GAI5B,MAAkB,MAAdA,EAAKmsC,KAME,KAJFxqC,KAAKC,IAAI5B,EAAKnF,OAAS,IAA8B,IAAxB8G,KAAK86L,KAAKz8L,EAAKnF,OAAemF,EAAKnF,KAS7E,IAEJ,IAAImF,EACAG,EAAU25L,OACV,WACA,KACA,CAAC,OAAQ,SACT,EAEApjM,EAAUqjM,aACV,SAAU55L,EAAKH,EAAQ3Q,EAASJ,EAAM2R,GAalC,OATKlK,EAAUwoM,iBACXjwM,EAAK4L,MACL5L,EAAKk9C,KACM,OAAXnsC,EAAkBA,EAAO83L,WAAW/kM,EAAWglM,OAAOp6E,SAASs6E,OAAS93L,EAAIu5L,WAAWriM,EAC5E,OAAX2I,EAAkBA,EAAO83L,WAAW/kM,EAAWglM,OAAOp6E,SAASs6E,OAAS93L,EAAIu5L,WAAWriM,EACvF8I,EAAIu5L,WAAWriM,EACf8I,EAAI65L,SAAS3iM,EAIrB,IAEJ,IAAI2I,EACAG,EAAU25L,OACV,YACA,SACA,CAAC,OAAQ,SACT,GAEA,SAAU/mM,GAGN,OAAOA,CACX,GACA,MAEJ,IAAIiN,EACAG,EAAU25L,OACV,aACA,SACA,CAAC,OAAQ,SACT,GAEA,SAAU/mM,GAGN,OAAOA,CACX,GACA,MAEJ,IAAIiN,EACAG,EAAU25L,OACV,aACA,SACA,CAAC,SACD,GAEA,SAAU/mM,GACN,MAAY,WAARA,EACOA,EAEA2D,EAAUqjM,YAAYhnM,EAErC,IACA,SAAUoN,EAAKH,EAAQ3Q,EAASJ,EAAM2R,GAElC,IAAIX,EAEJ,GAAa,WAAThR,EAIAgR,EAAKhR,OAaL,GAAW,QATXgR,EAAKvJ,EAAUwoM,iBACXjwM,EAAK4L,MACL5L,EAAKk9C,KACL98C,EAAQyoM,WAAW/kM,EAAWglM,OAAOp6E,SAASs6E,OAC9C5oM,EAAQyoM,WAAW/kM,EAAWglM,OAAOp6E,SAASs6E,OAC9C93L,EAAIu5L,WAAWriM,EACf8I,EAAI65L,SAAS3iM,IAKb,OAAO,KAQf,OAAO4I,CACX,IAEJ,IAAID,EACAG,EAAU25L,OACV,UACA,EACA,CAAC,cACD,EAEAjwL,WACA,MAEJ,IAAI7J,EACAG,EAAU25L,OACV,SACA,OACA,CAAC,cACD,GAEA,SAAU/mM,GAEN,GAAY,SAARA,EAEA,OAAOA,EAIP,IAAIoN,EAAIpN,EAAIqO,MAAM,KAClB,GAAiB,IAAbjB,EAAE/Q,OACF,OAAO,KACX,IAAI4Q,EAAItJ,EAAUqjM,YAAY55L,EAAE,IAC5B9Q,EAAIqH,EAAUqjM,YAAY55L,EAAE,IAChC,OAAK9Q,GAAM2Q,EAEJ,CAAC3I,EAAKhI,EAAG4Z,EAAKjJ,GADV,IAInB,IACA,SAAUjN,EAAKoN,EAAQH,EAAS3Q,EAAMJ,GAElC,IAAI2R,EACAX,EAEJ,GAAa,SAAT5Q,EAEAuR,EAAI,IAAIlK,EAAUijM,eAAe,EAAE,QAanC,GAAU,QATV/4L,EAAIlK,EAAUwoM,iBACV7vM,EAAKgI,EAAEwD,MACPxL,EAAKgI,EAAE80C,KACP,KACAp5C,EAAIknM,WAAW5iM,EACf,KACAtE,EAAIinM,SAAS3iM,IAKb,OAAO,KAMf,GAAa,SAAThI,EAEA4Q,EAAI,IAAIvJ,EAAUijM,eAAe,EAAE,QAanC,GAAU,QATV15L,EAAIvJ,EAAUwoM,iBACV7vM,EAAK4Z,EAAEpO,MACPxL,EAAK4Z,EAAEkjC,KACP,KACAp5C,EAAIknM,WAAWhxL,EACf,KACAlW,EAAIinM,SAAS/wL,IAKb,OAAO,KAMf,MAAO,CAAC5R,EAAKuJ,EAAGqI,EAAKhJ,EACzB,IAEJ,IAAID,EACAG,EAAU25L,OACV,WACA,SACA,CAAC,cACD,GAEA,SAAU/mM,GACN,OAAOA,CACX,GACA,MAEJ,IAAIiN,EACAG,EAAU25L,OACV,UACA,MACA,CAAC,cACD,GAEA,SAAU/mM,GAEN,IAAIoN,EAAIpN,EAAIqO,MAAM,KAClB,GAAIjB,EAAE/Q,OAAS,EACX,OAAO,KAEX,IADA,IAAI4Q,EAAI,GACC3Q,EAAI,EAAGA,EAAI8Q,EAAE/Q,OAAQC,IAAK,CAE/B,IAAIJ,EAAIyH,EAAUqjM,YAAY55L,EAAE9Q,IAChC,IAAKJ,EACD,OAAO,KACX+Q,EAAE8T,KAAK7kB,EACX,CAEA,OAAO+Q,CACX,IACA,SAAUG,EAAKH,EAAQ3Q,EAASJ,EAAM2R,GAElC,IAAIX,EAUJ,GAAoB,IAAhBhR,EAAKG,OAEL6Q,EAAU,CAAChR,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAIA,EAAK,SAExC,GAAoB,IAAhBA,EAAKG,OAEZ6Q,EAAU,CAAChR,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAIA,EAAK,SAExC,GAAoB,IAAhBA,EAAKG,OAEZ6Q,EAAU,CAAChR,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAIA,EAAK,QAExC,IAAoB,IAAhBA,EAAKG,OAMZ,OAAO,KAJP6Q,EAAU,CAAChR,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAM/C,CAUA,IAAI8R,EAAM1R,EAAQyoM,WAAW/kM,EAAWglM,OAAOgD,YAAY9C,OAE3D,GAAY,SAARl3L,GAA0B,OAARA,EAElBd,EAAU,CAACA,EAAQ,GAAIA,EAAQ,GAAIA,EAAQ,GAAIA,EAAQ,SAEpD,GAAY,SAARc,GAA0B,OAARA,EAEzBd,EAAU,CAACA,EAAQ,GAAIA,EAAQ,GAAIA,EAAQ,GAAIA,EAAQ,SAEpD,GAAY,SAARc,EAEPd,EAAU,CAACA,EAAQ,GAAIA,EAAQ,GAAIA,EAAQ,GAAIA,EAAQ,QAEpD,IAAY,SAARc,GAA0B,OAARA,EAMzB,OAAO,KAJPd,EAAU,CAACA,EAAQ,GAAIA,EAAQ,GAAIA,EAAQ,GAAIA,EAAQ,GAM3D,CAIA,IAFA,IAAIzJ,EAAM,GAEDU,EAAI,EAAIA,EAAI+I,EAAQ7Q,OAAQ8H,IAEjC,GAAyB,IAArB+I,EAAQ/I,GAAG2D,MAEXrE,EAAIU,GAAK,IAAIR,EAAUijM,eAAe,EAAE,QAaxC,GATAnjM,EAAIU,GAAKR,EAAUwoM,iBACfj/L,EAAQ/I,GAAG2D,MACXoF,EAAQ/I,GAAGi1C,KACX98C,EAAQyoM,WAAW/kM,EAAWglM,OAAOp6E,SAASs6E,OACxC,IAAN/gM,GAAiB,IAANA,EAAU7H,EAAQyoM,WAAW/kM,EAAWglM,OAAOoH,OAAOlH,OAAO5gM,EAAIhI,EAAQyoM,WAAW/kM,EAAWglM,OAAOoH,OAAOlH,OAAOhvL,EACzH,IAAN/R,GAAiB,IAANA,EAAUiJ,EAAIu5L,WAAWriM,EAAI8I,EAAIu5L,WAAWzwL,EACjD,IAAN/R,GAAiB,IAANA,EAAUiJ,EAAI65L,SAAS3iM,EAAG8I,EAAI65L,SAAS/wL,GAGvC,OAAXzS,EAAIU,GAAa,OAAO,KAMpC,OAAOV,CACX,IAEJ,IAAIwJ,EACAG,EAAU25L,OACV,WACA,WACA,CAAC,cACD,GAEA,SAAU/mM,GAEN,OAAO2D,EAAU0oM,cAAcrsM,EAEnC,IACA,SAAUoN,EAAKH,EAAQ3Q,EAASJ,GAC5B,IAAI2R,EACAX,EAcJ,OAAU,QAZVW,EAAIlK,EAAUwoM,iBACVjwM,EAAKmpB,EAAEqB,OAAO5e,MACd5L,EAAKmpB,EAAEqB,OAAO0yB,KACd,KACA,IAAIz1C,EAAUijM,gBACRtqM,EAAQyoM,WAAW/kM,EAAWglM,OAAOoH,OAAOlH,OAAO5gM,EAAEmnM,GACvDr+L,EAAI85L,WAAW5iM,EAAEy7F,GAAKzjG,EAAQyoM,WAAW/kM,EAAWglM,OAAOoH,OAAOlH,OAAO5gM,EAAEy7F,IAE/E,KACA3yF,EAAI65L,SAAS3iM,IAGM,MAGH,WAAhBpI,EAAKmpB,EAAE0U,OAEPlsB,EAAI,IAAIlK,EAAUijM,gBACZ/4L,EAAE49L,GAAKnvM,EAAQyoM,WAAW/kM,EAAWglM,OAAOoH,OAAOlH,OAAO5gM,EAAEmnM,GAC9Dr+L,EAAI85L,WAAW5iM,EAAEy7F,GAAKlyF,EAAEkyF,GAAKzjG,EAAQyoM,WAAW/kM,EAAWglM,OAAOoH,OAAOlH,OAAO5gM,EAAEy7F,KAK1F7yF,EAAIvJ,EAAUwoM,iBACVjwM,EAAKoI,EAAEoiB,OAAO5e,MACd5L,EAAKoI,EAAEoiB,OAAO0yB,KACd,KACA,IAAIz1C,EAAUijM,eACVx5L,EAAI85L,WAAWhxL,EAAEu1L,GAAKnvM,EAAQyoM,WAAW/kM,EAAWglM,OAAOoH,OAAOlH,OAAOhvL,EAAEu1L,IACzEnvM,EAAQyoM,WAAW/kM,EAAWglM,OAAOoH,OAAOlH,OAAOhvL,EAAE6pF,IAE3D,KACA3yF,EAAI65L,SAAS/wL,GAGP,OAANrI,EAAmB,MAEH,UAAhB3R,EAAKoI,EAAEy1B,OAEP7sB,EAAI,IAAIvJ,EAAUijM,eACdx5L,EAAI85L,WAAWhxL,EAAEu1L,GAAKv+L,EAAEu+L,GAAKnvM,EAAQyoM,WAAW/kM,EAAWglM,OAAOoH,OAAOlH,OAAOhvL,EAAEu1L,IAChFv+L,EAAE6yF,GAAKzjG,EAAQyoM,WAAW/kM,EAAWglM,OAAOoH,OAAOlH,OAAOhvL,EAAE6pF,KAK/D,CAACz7F,EAAKuJ,EAAGqI,EAAKhJ,IACzB,IAEJ,IAAID,EACAG,EAAU25L,OACV,OACA,OACA,CAAC,YACD,GAEA,SAAU/mM,GACN,OAAOA,CACX,GACA,MAEJ,IAAIiN,EACAG,EAAU25L,OACV,YACA,SACA,CAAC,YACD,GAEA,SAAU/mM,GAEN,MAAe,WAARA,GAA4B,gBAARA,EAChB,KAGJA,CACX,GACA,MAEJ,IAAIiN,EACAG,EAAU25L,OACV,eACA,UACA,CAAC,YACD,GAEA,SAAU/mM,GACN,OAAOA,CACX,GACA,MAEJ,IAAIiN,EACAG,EAAU25L,OACV,cACA,OACA,CAAC,SACD,GAEA,SAAU/mM,GACN,IAAIoN,EAAIpN,EAAIqO,MAAM,KAEdpB,EAAI,CAAC,KAAM,MAEf,GAAiB,IAAbG,EAAE/Q,QAAgB+Q,EAAE/Q,OAAS,EAC7B,OAAO,KAEX,GAAa,SAAT+Q,EAAE,IACO,SAATA,EAAE,IACO,UAATA,EAAE,IACO,WAATA,EAAE,IACO,YAATA,EAAE,GAMF,OAAO,KAIX,GARIH,EAAE,GAAKG,EAAE,GAQI,IAAbA,EAAE/Q,QAAyB,SAAT+Q,EAAE,GAAe,CAEnC,IAAI9Q,EAAIqH,EAAUqjM,YAAY55L,EAAE,IAEhC,IAAI9Q,EAMA,OAAO,KAJP2Q,EAAE,GAAK3Q,CAQf,CAGA,OAAO2Q,CACX,IACA,SAAUG,EAAKH,EAAQ3Q,EAASJ,EAAM2R,GAElC,MAAgB,SAAZ3R,EAAK,GAEEA,EAyBA,QAjBPgR,EAFY,OAAZhR,EAAK,GAEA,IAAIyH,EAAUijM,eAC+C,GAA1DtqM,EAAQyoM,WAAW/kM,EAAWglM,OAAOp6E,SAASs6E,OAAOuG,GACK,GAA1DnvM,EAAQyoM,WAAW/kM,EAAWglM,OAAOp6E,SAASs6E,OAAOnlG,IAKxDp8F,EAAUwoM,iBAAiBjwM,EAAK,GAAG4L,MACpC5L,EAAK,GAAGk9C,KACR98C,EAAQyoM,WAAW/kM,EAAWglM,OAAOp6E,SAASs6E,OAC9C5oM,EAAQyoM,WAAW/kM,EAAWglM,OAAOp6E,SAASs6E,OAC9C93L,EAAIu5L,WAAWriM,EACf8I,EAAI65L,SAAS3iM,IAKG,KAEjB,CAACpI,EAAK,GAAIgR,GAvBjB,IAAIA,CAwBR,IAEJ,IAAID,EACAG,EAAU25L,OACV,iBACA,SACA,CAAC,cACD,GAEA,SAAU/mM,GACN,OAAOA,CACX,GACA,MAEJ,IAAIiN,EACAG,EAAU25L,OACV,YACA,QACA,CAAC,SACD,GAEA,SAAU/mM,GACN,OAAOA,CACX,IACA,SAAUA,EAAKoN,EAAQzJ,EAASsJ,EAAM3Q,GAGlC,MAAa,SAAT2Q,EAEO,QAES,UAATA,EAEA,MAIAA,CAGf,IAEJ,IAAIA,EACAG,EAAU25L,OACV,cACA,OACA,CAAC,YACD,GAEA,SAAU/mM,GACN,MAAY,SAARA,GAA0B,QAARA,EAEXA,EAGJ,IACX,GACA,MAEJ,IAAIiN,EACAG,EAAU25L,OACV,iBACA,OACA,CAAC,YACD,GAEA,SAAU/mM,GACN,OAAOA,EAAIqO,MAAM,IACrB,GACA,MAEJ,IAAIpB,EACAG,EAAU25L,OACV,eACA,OACA,CAAC,YACD,GAEA,SAAU/mM,GAKN,IAJA,IAAIoN,EAAIpN,EAAIqO,MAAM,KAEdpB,EAAO,CAACm2E,MAAO,KAAMonH,OAAQ,KAAM7xI,MAAO,KAAMzzD,SAAU,MAErD5I,EAAI,EAAGA,EAAI8Q,EAAE/Q,OAAQC,IAE1B,GAAa,SAAT8Q,EAAE9Q,IAA0B,SAAT8Q,EAAE9Q,GAErB2Q,EAAKm2E,MAAQh2E,EAAE9Q,QAEZ,GAAa,WAAT8Q,EAAE9Q,IACA,SAAT8Q,EAAE9Q,GAEF2Q,EAAKm2E,MAAQh2E,EAAE9Q,QAEZ,GAAa,WAAT8Q,EAAE9Q,IACA,QAAT8Q,EAAE9Q,IACO,WAAT8Q,EAAE9Q,GAEF2Q,EAAKu9L,OAASp9L,EAAE9Q,QAEb,GAAa,YAAT8Q,EAAE9Q,GAET2Q,EAAK0rD,MAAQvrD,EAAE9Q,QAEZ,GAAa,YAAT8Q,EAAE9Q,IAA6B,WAAT8Q,EAAE9Q,IAA4B,UAAT8Q,EAAE9Q,GAEpD2Q,EAAK/H,SAAWkI,EAAE9Q,QAMlB,GAFA2Q,EAAK0rD,MAAQh1D,EAAUuoM,WAAW9+L,EAAE9Q,IAEjB,OAAf2Q,EAAK0rD,MACL,OAAO,KAmBnB,OAdkB,MAAd1rD,EAAKm2E,OAAgC,MAAfn2E,EAAKu9L,OAE3Bv9L,EAAKm2E,MAAQ,QAIbn2E,EAAKu9L,OAASv9L,EAAKu9L,QAAU,SAC7Bv9L,EAAKm2E,MAAQn2E,EAAKm2E,OAAS,UAI/Bn2E,EAAK/H,SAAW+H,EAAK/H,UAAY,UACjC+H,EAAK0rD,MAAQ1rD,EAAK0rD,OAAS,UAEpB1rD,CACX,GACA,MAEJ,IAAIA,EACAG,EAAU25L,OACV,cACA,OACA,CAAC,YACD,GAEA,SAAU/mM,GAON,GAAY,SAARA,EAEA,OAAOA,EAIP,IAAIoN,EAAI,CAAC,EACLH,EAAIjN,EAAIqO,MAAM,KAClB,GAAiB,IAAbpB,EAAE5Q,QAAgB4Q,EAAE5Q,OAAS,EAC7B,OAAO,KACX,IAAIC,EAAIqH,EAAUuoM,WAAWj/L,EAAE,IAO/B,GALAG,EAAEurD,MAAQr8D,EAEA,OAANA,GACA2Q,EAAEsZ,QAEW,IAAbtZ,EAAE5Q,OACF,OAAO,KAEX,IAAIH,EAAIyH,EAAUqjM,YAAY/5L,EAAE,IAEhC,OAAK/Q,GAGLkR,EAAEk/L,UAAYpwM,EAEPkR,GAJI,IAOnB,IACA,SAAUA,EAAKH,EAAQ3Q,EAASJ,EAAM2R,GAOlC,GAAa,SAAT3R,EACA,OAAOA,EAEX,IAAIgR,EAAO,CAAC,EAqBZ,OAnBmB,OAAfhR,EAAKy8D,MAELzrD,EAAKyrD,MAAQr8D,EAAQyoM,WAAW/kM,EAAWglM,OAAOrsI,MAAMusI,OAIxDh4L,EAAKyrD,MAAQz8D,EAAKy8D,MAItBzrD,EAAKo/L,UAAY3oM,EAAUwoM,iBACvBjwM,EAAKowM,UAAUxkM,MACf5L,EAAKowM,UAAUlzJ,KACf98C,EAAQyoM,WAAW/kM,EAAWglM,OAAOp6E,SAASs6E,OAC9C5oM,EAAQyoM,WAAW/kM,EAAWglM,OAAOp6E,SAASs6E,OAC9C93L,EAAIu5L,WAAWriM,EACf8I,EAAI65L,SAAS3iM,GAGM,OAAnB4I,EAAKo/L,UACE,KAEJp/L,CACX,IAEJ,IAAID,EACAG,EAAU25L,OACV,aACA,OACA,CAAC,YACD,EAEApjM,EAAU4oM,iBACV,SAAUn/L,EAAKH,EAAQ3Q,EAASJ,GAO5B,GAAa,SAATA,EACA,OAAOA,EAIX,IAFA,IAAI2R,EAAI,GAECX,EAAI,EAAGA,EAAIhR,EAAKG,OAAQ6Q,IAAK,CAElC,IAAIc,EAAS,CAAC,EAWd,GATAA,EAAOg9L,MAAQrnM,EAAUwoM,iBACrBjwM,EAAKgR,GAAG,GAAGpF,MACX5L,EAAKgR,GAAG,GAAGksC,KACX,KACA98C,EAAQyoM,WAAW/kM,EAAWglM,OAAOp6E,SAASs6E,OAC9C,KACA93L,EAAI65L,SAAS/wL,GAGI,OAAjBlI,EAAOg9L,MACP,OAAO,KAWX,GATAh9L,EAAOi9L,MAAQtnM,EAAUwoM,iBACrBjwM,EAAKgR,GAAG,GAAGpF,MACX5L,EAAKgR,GAAG,GAAGksC,KACX,KACA98C,EAAQyoM,WAAW/kM,EAAWglM,OAAOp6E,SAASs6E,OAC9C,KACA93L,EAAI65L,SAAS3iM,GAGI,OAAjB0J,EAAOi9L,MACP,OAAO,KAEX,GAAmB,OAAf/uM,EAAKgR,GAAG,GAERc,EAAOk9L,SAAW,OAalB,GATAl9L,EAAOk9L,SAAWvnM,EAAUwoM,iBACxBjwM,EAAKgR,GAAG,GAAGpF,MACX5L,EAAKgR,GAAG,GAAGksC,KACX,KACA98C,EAAQyoM,WAAW/kM,EAAWglM,OAAOp6E,SAASs6E,OAC9C,KACA93L,EAAI65L,SAAS3iM,GAGO,OAApB0J,EAAOk9L,SACP,OAAO,KAII,OAAfhvM,EAAKgR,GAAG,GAERc,EAAO2qD,MAAQr8D,EAAQyoM,WAAW/kM,EAAWglM,OAAOrsI,MAAMusI,OAI1Dl3L,EAAO2qD,MAAQz8D,EAAKgR,GAAG,GAI3BW,EAAEkT,KAAK/S,EAEX,CAEA,OAAOH,CACX,IAEJ,IAAIZ,EACAG,EAAU25L,OACV,cACA,SACA,CAAC,OAAQ,SACT,GAEA,SAAU/mM,GACN,OAAOA,CACX,GACA,MAEJ,IAAIiN,EACAG,EAAU25L,OACV,aACA,UACA,CAAC,OAAQ,MAAO,IAAK,SAAU,YAC/B,GAEA,SAAU/mM,GACN,OAAOA,CACX,GACA,MAEJ,IAAIiN,EACAG,EAAU25L,OACV,aACA,OACA,CAAC,YACD,GAEA,SAAU/mM,GACN,OAAOA,CACX,GACA,MAEJ,IAAIiN,EACAG,EAAU25L,OACV,cACA,OACA,CAAC,cACD,GAEA,SAAU/mM,GACN,OAAOA,CACX,GACA,MAEJ,IAAIiN,EACAG,EAAU25L,OACV,SACA,OACA,CAAC,cACD,GAEA,SAAU/mM,GAEN,IAAIoN,EAgBJ,MAdY,SAARpN,EAEAoN,EAAOpN,GAIPoN,EAAOoJ,SAASxW,GAEZs1B,MAAMloB,KACNA,EAAO,OAKRA,CACX,GACA,MAEJ,IAAIH,EACAG,EAAUi6L,UACV,cACA,KACA,CAAC,SACD,EAEA1jM,EAAUqjM,aACV,SAAUhnM,EAAKoN,EAAQH,EAAS3Q,EAAMJ,GAElC,OAAOyH,EAAUwoM,iBAAiB7vM,EAAKwL,MAAOxL,EAAK88C,KAAM,KAAM,KAAMp5C,EAAI2mM,WAAWzwL,EAAG,KAE3F,IAEJ,IAAIjJ,EACAG,EAAUi6L,UACV,gBACA,OACA,CAAC,SACD,GAEA,SAAUrnM,GACN,OAAOA,CACX,GACA,MAEJ,IAAIiN,EACAG,EAAU4+L,SACV,kBACA,KACA,CAAC,WACD,GAEA,SAAUhsM,GACN,OAAOA,CACX,GACA,MAEJ,IAAIiN,EACAG,EAAUg6L,QACV,gBACA,QACA,CAAC,OAAQ,MAAO,IAAK,SAAU,YAC/B,GAEA,SAAUpnM,GACN,MAAe,SAARA,CACX,GACA,MAEJ,IAAIiN,EACAG,EAAUg6L,QACV,cACA,QACA,CAAC,SACD,GAEA,SAAUpnM,GACN,MAAe,SAARA,CACX,GACA,OAMRA,EAAWimM,QAAU,CAAC,EACRjmM,EAAWqB,IAErBrB,EAAWimM,QAAQjmM,EAAWqB,IAAI/E,GAAG4oM,OAASllM,EAAWqB,IAAI/E,GAIjE,IAAK,IAAIJ,KADT8D,EAAWglM,OAAS,CAAC,EACPhlM,EAAWqB,IAErBrB,EAAWglM,OAAOhlM,EAAWqB,IAAInF,GAAGiC,MAAQ6B,EAAWqB,IAAInF,EAIlE,CA9pCD,CA8pC2DkR,EAClC,oBAAdq6L,UAA4B9jM,EAAQ,KAAa8jM,UACnC,oBAAdE,UAA4BhkM,EAAQ,MAAagkM,UAAA,gBAAA3nM,EAAAoN,IChqC5D,SAAWpN,GAyBP,IAAIoN,EAAe,qEACfzJ,EAAe,6CACfsJ,EAAgB,uDAChB3Q,EAAc,CACdkwM,YAAa,CAAC,EAAG,EAAG,EAAG,GACvBC,MAAO,CAAC,EAAG,EAAG,EAAG,KACjBC,OAAQ,CAAC,IAAK,IAAK,IAAK,KACxBC,KAAM,CAAC,IAAK,IAAK,IAAK,KACtBC,MAAO,CAAC,IAAK,IAAK,IAAK,KACvBC,OAAQ,CAAC,IAAK,EAAG,EAAG,KACpBC,IAAK,CAAC,IAAK,EAAG,EAAG,KACjBC,OAAQ,CAAC,IAAK,EAAG,IAAK,KACtBC,QAAS,CAAC,IAAK,EAAG,IAAK,KACvBC,QAAS,CAAC,IAAK,EAAG,IAAK,KACvBC,MAAO,CAAC,EAAG,IAAK,EAAG,KACnBC,KAAM,CAAC,EAAG,IAAK,EAAG,KAClBC,MAAO,CAAC,IAAK,IAAK,EAAG,KACrBC,OAAQ,CAAC,IAAK,IAAK,EAAG,KACtBC,KAAM,CAAC,EAAG,EAAG,IAAK,KAClBC,KAAM,CAAC,EAAG,EAAG,IAAK,KAClBC,KAAM,CAAC,EAAG,IAAK,IAAK,KACpBC,KAAM,CAAC,EAAG,IAAK,IAAK,KACpBC,KAAM,CAAC,EAAG,IAAK,IAAK,MAGxB1tM,EAAUksM,WAAa,SAAUlsM,GAE7B,IAAI9D,EAEA2R,EAAI,KAEJX,EAAK5Q,EAAY0D,EAAI4J,eA6BzB,YAAO,IA3BHsD,EAEAW,EAAIX,EAEoC,QAAhChR,EAAIkR,EAAaW,KAAK/N,IAE9B6N,EAAI,CAAC2I,SAASta,EAAE,GAAI,IAChBsa,SAASta,EAAE,GAAI,IACfsa,SAASta,EAAE,GAAI,aACdA,EAAE,GAAmBsa,SAASta,EAAE,GAAI,IAAM,KAEP,QAAhCA,EAAIyH,EAAaoK,KAAK/N,IAE9B6N,EAAI,CAAC2I,SAASta,EAAE,IACZsa,SAASta,EAAE,IACXsa,SAASta,EAAE,IACX,KAEqC,QAAjCA,EAAI+Q,EAAcc,KAAK/N,MAE/B6N,EAAI,CAAC2I,SAASta,EAAE,IACZsa,SAASta,EAAE,IACXsa,SAASta,EAAE,IACXsa,SAASta,EAAE,MAIZ2R,CACX,EAEA,IAAI3R,EAAY,+CAEhB8D,EAAUgnM,YAAc,SAAUhnM,GAE9B,IAAIoN,EAEAzJ,EAAI,KAOR,OALkC,QAA7ByJ,EAAIlR,EAAU6R,KAAK/N,MAEpB2D,EAAI,CAACmE,MAAOgP,WAAW1J,EAAE,IAAKgsC,KAAMhsC,EAAE,KAGnCzJ,CACX,EAEA3D,EAAUusM,gBAAkB,SAAUn/L,GAMlC,IAJA,IAAIzJ,EAAUyJ,EAAI8iB,MAAM,2BAEpBjjB,EAAI,GAEC3Q,EAAI,EAAGA,EAAIqH,EAAQtH,OAAQC,IAAK,CAErC,IAAIJ,EAASyH,EAAQrH,GAAG+R,MAAM,KAE9B,GAAsB,IAAlBnS,EAAOG,QAA8B,SAAdH,EAAO,GAE9B,MAAO,OAEJ,GAAIA,EAAOG,OAAS,GAAKH,EAAOG,OAAS,EAAG,CAE/C,IAAIwR,EAAa,CAAC,KAAM,KAAM,KAAM,MAIhCX,EAAIlN,EAAUgnM,YAAY9qM,EAAOqqB,SAErC,GAAU,OAANrZ,EACA,OAAO,KAQX,GANAW,EAAW,GAAKX,EAMN,QAFVA,EAAIlN,EAAUgnM,YAAY9qM,EAAOqqB,UAG7B,OAAO,KAMX,GAJA1Y,EAAW,GAAKX,EAIM,IAAlBhR,EAAOG,OAAc,CACrB4Q,EAAE8T,KAAKlT,GACP,QACJ,CAYA,GARU,QAFVX,EAAIlN,EAAUgnM,YAAY9qM,EAAO,OAI7B2R,EAAW,GAAKX,EAEhBhR,EAAOqqB,SAIW,IAAlBrqB,EAAOG,OAAc,CACrB4Q,EAAE8T,KAAKlT,GACP,QACJ,CAEA,IAAIG,EAAIhO,EAAUksM,WAAWhwM,EAAO,IAEpC,GAAU,OAAN8R,EACA,OAAO,KAEXH,EAAW,GAAKG,EAEhBf,EAAE8T,KAAKlT,EACX,CAEJ,CAEA,OAAOZ,CACX,EAGAjN,EAAUqsM,cAAgB,SAAUj/L,GAIhC,IAAIzJ,EAAIyJ,EAAIiB,MAAM,KAEdpB,EAAY,SAAUjN,GAEtB,MAAe,WAARA,GACS,SAARA,GACQ,QAARA,GACQ,WAARA,GACQ,UAARA,CAEZ,EAEA,GAAI2D,EAAEtH,OAAS,EAEX,OAAO,KAMX,IAAK,IAAIC,EAAI,EAAIA,EAAIqH,EAAEtH,OAAQC,IAE3B,IAAK2Q,EAAUtJ,EAAErH,IAAK,CAElB,IAAIJ,EAAI8D,EAAUgnM,YAAYrjM,EAAErH,IAEhC,GAAU,OAANJ,EACA,OAAO,KAEXyH,EAAErH,GAAKJ,CACX,CAaJ,IAPA,IAAI2R,EAAM,CACNvJ,EAAG,CAACy1B,KAAM,OAAQrT,OAAQ,CAAC5e,MAAO,GAAIsxC,KAAM,MAC5C/zB,EAAG,CAAC0U,KAAM,MAAOrT,OAAQ,CAAC5e,MAAO,GAAIsxC,KAAM,OAKtClsC,EAAI,EAAGA,EAAIvJ,EAAEtH,QAAU,CAI5B,IAAI2R,EAAOrK,EAAEuJ,KAEb,GAAID,EAAUe,GAAO,CAIjB,IAAIvK,EAAS,CAACqE,MAAO,EAAGsxC,KAAM,KAIb,IAAbz1C,EAAEtH,QAAgB6Q,EAAIvJ,EAAEtH,SAAY4Q,EAAUtJ,EAAEuJ,MAIhDzJ,EAASE,EAAEuJ,MAMF,UAATc,GAEAH,EAAIvJ,EAAEy1B,KAAO/rB,EAEbH,EAAIvJ,EAAEoiB,OAASjjB,GAEC,WAATuK,GAEPH,EAAIwX,EAAE0U,KAAO/rB,EAGbH,EAAIwX,EAAEqB,OAASjjB,GAGC,SAATuK,EAEPH,EAAIvJ,EAAEoiB,OAASjjB,EAGC,QAATuK,IAEPH,EAAIwX,EAAEqB,OAASjjB,EAKvB,KAAO,IAAiB,IAAbE,EAAEtH,QAA6B,IAAbsH,EAAEtH,OAsB3B,OAAO,KAlBG,IAAN6Q,EAIAW,EAAIvJ,EAAEoiB,OAAS1Y,EAMfH,EAAIwX,EAAEqB,OAAS1Y,CAUvB,CAEJ,CAEA,OAAOH,CACX,EAGA7N,EAAU4mM,eAAiB,SAAU5mM,EAAIoN,GACrCkJ,KAAKm1L,GAAKzrM,EACVsW,KAAKypF,GAAK3yF,CACd,EAEApN,EAAU4mM,eAAe7pM,UAAUsrM,aAAe,SAAUroM,EAAOoN,GAC/D,OAAOpN,EAAQsW,KAAKm1L,GAAKr+L,EAASkJ,KAAKypF,EAC3C,EAEA//F,EAAU4mM,eAAe7pM,UAAUqrM,OAAS,WACxC,OAAmB,IAAZ9xL,KAAKm1L,IAAwB,IAAZn1L,KAAKypF,EACjC,EAcA//F,EAAUmsM,iBAAmB,SAAS/+L,EAAWzJ,EAAYsJ,EAAU3Q,EAAeJ,EAAY2R,GAE9F,MAAmB,MAAflK,GAAsBrH,EAEf,IAAI0D,EAAU4mM,eACbtqM,EAAcmvM,GAAKr+L,EAAY,IAC/B9Q,EAAcyjG,GAAK3yF,EAAY,KAGjB,OAAfzJ,GAAuBsJ,EAEvB,IAAIjN,EAAU4mM,eACb35L,EAASw+L,GAAKr+L,EACdH,EAAS8yF,GAAK3yF,GAGA,MAAfzJ,GAAsBzH,EAEtB,IAAI8D,EAAU4mM,eACbx5L,EAAYlR,EAAWuvM,GACvBr+L,EAAYlR,EAAW6jG,IAGT,OAAfp8F,GAAuBkK,EAEvB,IAAI7N,EAAU4mM,eACbx5L,EAAYS,EAAS49L,GACrBr+L,EAAYS,EAASkyF,IAGP,OAAfp8F,EAEA,IAAI3D,EAAU4mM,eACb,EACAx5L,EAAY,KAGE,OAAfzJ,EAEA,IAAI3D,EAAU4mM,eACbx5L,EAAY,IACZ,GAKD,IAIf,CAIH,CAlYD,CAkY0DA,EAAA,gBAAApN,GAAA,aC/Z1DA,EAAOhE,QAIP,SAAsBgE,GACpB,IAAIoN,EAA4B,iBAAdpN,EAAyBA,EAAU8f,WAAW,GAAK9f,EAErE,OACGoN,GAAQ,IAAMA,GAAQ,KACtBA,GAAQ,IAAMA,GAAQ,EAE3B,iBAAApN,EAAAoN,EAAAzJ,GAAA,aCXA,IAAIsJ,EAAetJ,EAAQ,MACvBrH,EAAUqH,EAAQ,KAEtB3D,EAAOhE,QAIP,SAAwBgE,GACtB,OAAOiN,EAAajN,IAAc1D,EAAQ0D,EAC5C,gBAAAA,GAAA,aCTAA,EAAOhE,QAIP,SAAiBgE,GACf,IAAIoN,EAA4B,iBAAdpN,EAAyBA,EAAU8f,WAAW,GAAK9f,EAErE,OAAOoN,GAAQ,IAAMA,GAAQ,EAC/B,iBAAApN,GAAA,aCgBA,SAASoN,EAAWpN,GAClB,GAAoB,iBAATA,EACT,MAAM,IAAI2oD,UAAU,mCAAqC3xB,KAAKC,UAAUj3B,GAE5E,CAGA,SAAS2D,EAAqB3D,EAAMoN,GAMlC,IALA,IAIIzJ,EAJAsJ,EAAM,GACN3Q,EAAoB,EACpBJ,GAAa,EACb2R,EAAO,EAEFX,EAAI,EAAGA,GAAKlN,EAAK3D,SAAU6Q,EAAG,CACrC,GAAIA,EAAIlN,EAAK3D,OACXsH,EAAO3D,EAAK8f,WAAW5S,OACpB,IAAa,KAATvJ,EACP,MAEAA,EAAO,EAAQ,CACjB,GAAa,KAATA,EAAmB,CACrB,GAAIzH,IAAcgR,EAAI,GAAc,IAATW,QAEpB,GAAI3R,IAAcgR,EAAI,GAAc,IAATW,EAAY,CAC5C,GAAIZ,EAAI5Q,OAAS,GAA2B,IAAtBC,GAA8D,KAAnC2Q,EAAI6S,WAAW7S,EAAI5Q,OAAS,IAAsD,KAAnC4Q,EAAI6S,WAAW7S,EAAI5Q,OAAS,GAC1H,GAAI4Q,EAAI5Q,OAAS,EAAG,CAClB,IAAI2R,EAAiBf,EAAImB,YAAY,KACrC,GAAIJ,IAAmBf,EAAI5Q,OAAS,EAAG,EACb,IAApB2R,GACFf,EAAM,GACN3Q,EAAoB,GAGpBA,GADA2Q,EAAMA,EAAIyJ,MAAM,EAAG1I,IACK3R,OAAS,EAAI4Q,EAAImB,YAAY,KAEvDlS,EAAYgR,EACZW,EAAO,EACP,QACF,CACF,MAAO,GAAmB,IAAfZ,EAAI5Q,QAA+B,IAAf4Q,EAAI5Q,OAAc,CAC/C4Q,EAAM,GACN3Q,EAAoB,EACpBJ,EAAYgR,EACZW,EAAO,EACP,QACF,CAEET,IACEH,EAAI5Q,OAAS,EACf4Q,GAAO,MAEPA,EAAM,KACR3Q,EAAoB,EAExB,MACM2Q,EAAI5Q,OAAS,EACf4Q,GAAO,IAAMjN,EAAK0W,MAAMxa,EAAY,EAAGgR,GAEvCD,EAAMjN,EAAK0W,MAAMxa,EAAY,EAAGgR,GAClC5Q,EAAoB4Q,EAAIhR,EAAY,EAEtCA,EAAYgR,EACZW,EAAO,CACT,MAAoB,KAATlK,IAA+B,IAAVkK,IAC5BA,EAEFA,GAAQ,CAEZ,CACA,OAAOZ,CACT,CAcA,IAAIA,EAAQ,CAEVjH,QAAS,WAKP,IAJA,IAEIhG,EAFAiN,EAAe,GACf3Q,GAAA,EAGKJ,EAAIoC,UAAUjC,OAAS,EAAGH,IAAM,IAAMI,EAAkBJ,IAAK,CACpE,IAAI2R,EACA3R,GAAK,EACP2R,EAAOvP,UAAUpC,SAAA,IAEb8D,IACFA,EAAMozG,QAAQu6F,OAChB9/L,EAAO7N,GAGToN,EAAWS,GAGS,IAAhBA,EAAKxR,SAIT4Q,EAAeY,EAAO,IAAMZ,EAC5B3Q,EAA0C,KAAvBuR,EAAKiS,WAAW,GACrC,CAQA,OAFA7S,EAAetJ,EAAqBsJ,GAAe3Q,GAE/CA,EACE2Q,EAAa5Q,OAAS,EACjB,IAAM4Q,EAEN,IACAA,EAAa5Q,OAAS,EACxB4Q,EAEA,GAEX,EAEAkrL,UAAW,SAAmBn4L,GAG5B,GAFAoN,EAAWpN,GAES,IAAhBA,EAAK3D,OAAc,MAAO,IAE9B,IAAI4Q,EAAoC,KAAvBjN,EAAK8f,WAAW,GAC7BxjB,EAAyD,KAArC0D,EAAK8f,WAAW9f,EAAK3D,OAAS,GAQtD,OAHoB,KAFpB2D,EAAO2D,EAAqB3D,GAAOiN,IAE1B5Q,QAAiB4Q,IAAYjN,EAAO,KACzCA,EAAK3D,OAAS,GAAKC,IAAmB0D,GAAQ,KAE9CiN,EAAmB,IAAMjN,EACtBA,CACT,EAEA4tM,WAAY,SAAoB5tM,GAE9B,OADAoN,EAAWpN,GACJA,EAAK3D,OAAS,GAA4B,KAAvB2D,EAAK8f,WAAW,EAC5C,EAEAvR,KAAM,WACJ,GAAyB,IAArBjQ,UAAUjC,OACZ,MAAO,IAET,IADA,IAAI2D,EACK2D,EAAI,EAAGA,EAAIrF,UAAUjC,SAAUsH,EAAG,CACzC,IAAIrH,EAAMgC,UAAUqF,GACpByJ,EAAW9Q,GACPA,EAAID,OAAS,aACX2D,EACFA,EAAS1D,EAET0D,GAAU,IAAM1D,EAEtB,CACA,gBAAI0D,EACK,IACFiN,EAAMkrL,UAAUn4L,EACzB,EAEAukI,SAAU,SAAkBvkI,EAAM2D,GAIhC,GAHAyJ,EAAWpN,GACXoN,EAAWzJ,GAEP3D,IAAS2D,EAAI,MAAO,GAKxB,IAHA3D,EAAOiN,EAAMjH,QAAQhG,OACrB2D,EAAKsJ,EAAMjH,QAAQrC,IAEF,MAAO,GAIxB,IADA,IAAIrH,EAAY,EACTA,EAAY0D,EAAK3D,QACa,KAA/B2D,EAAK8f,WAAWxjB,KADYA,GASlC,IALA,IAAIJ,EAAU8D,EAAK3D,OACfwR,EAAU3R,EAAUI,EAGpB4Q,EAAU,EACPA,EAAUvJ,EAAGtH,QACa,KAA3BsH,EAAGmc,WAAW5S,KADUA,GAW9B,IAPA,IACIc,EADQrK,EAAGtH,OACK6Q,EAGhBzJ,EAASoK,EAAUG,EAAQH,EAAUG,EACrC7J,GAAiB,EACjBd,EAAI,EACDA,GAAKI,IAAUJ,EAAG,CACvB,GAAIA,IAAMI,EAAQ,CAChB,GAAIuK,EAAQvK,EAAQ,CAClB,GAAmC,KAA/BE,EAAGmc,WAAW5S,EAAU7J,GAG1B,OAAOM,EAAG+S,MAAMxJ,EAAU7J,EAAI,GACzB,GAAU,IAANA,EAGT,OAAOM,EAAG+S,MAAMxJ,EAAU7J,EAE9B,MAAWwK,EAAUpK,IACoB,KAAnCzD,EAAK8f,WAAWxjB,EAAY+G,GAG9Bc,EAAgBd,EACD,IAANA,IAGTc,EAAgB,IAGpB,KACF,CACA,IAAIE,EAAWrE,EAAK8f,WAAWxjB,EAAY+G,GAE3C,GAAIgB,IADSV,EAAGmc,WAAW5S,EAAU7J,GAEnC,MACoB,KAAbgB,IACPF,EAAgBd,EACpB,CAEA,IAAIe,EAAM,GAGV,IAAKf,EAAI/G,EAAY6H,EAAgB,EAAGd,GAAKnH,IAAWmH,EAClDA,IAAMnH,GAAkC,KAAvB8D,EAAK8f,WAAWzc,KAChB,IAAfe,EAAI/H,OACN+H,GAAO,KAEPA,GAAO,OAMb,OAAIA,EAAI/H,OAAS,EACR+H,EAAMT,EAAG+S,MAAMxJ,EAAU/I,IAEhC+I,GAAW/I,EACoB,KAA3BR,EAAGmc,WAAW5S,MACdA,EACGvJ,EAAG+S,MAAMxJ,GAEpB,EAEA2gM,UAAW,SAAmB7tM,GAC5B,OAAOA,CACT,EAEA8tM,QAAS,SAAiB9tM,GAExB,GADAoN,EAAWpN,GACS,IAAhBA,EAAK3D,OAAc,MAAO,IAK9B,IAJA,IAAIsH,EAAO3D,EAAK8f,WAAW,GACvB7S,EAAmB,KAATtJ,EACVrH,GAAO,EACPJ,GAAA,EACK2R,EAAI7N,EAAK3D,OAAS,EAAGwR,GAAK,IAAKA,EAEtC,GAAa,MADblK,EAAO3D,EAAK8f,WAAWjS,KAEnB,IAAK3R,EAAc,CACjBI,EAAMuR,EACN,KACF,OAGF3R,GAAA,EAIJ,OAAa,IAATI,EAAmB2Q,EAAU,IAAM,IACnCA,GAAmB,IAAR3Q,EAAkB,KAC1B0D,EAAK0W,MAAM,EAAGpa,EACvB,EAEAyxM,SAAU,SAAkB/tM,EAAM2D,GAChC,QAAI,IAAAA,GAAoC,iBAARA,EAAkB,MAAM,IAAIglD,UAAU,mCACtEv7C,EAAWpN,GAEX,IAGIiN,EAHA3Q,EAAQ,EACRJ,GAAO,EACP2R,GAAA,EAGJ,QAAI,IAAAlK,GAAqBA,EAAItH,OAAS,GAAKsH,EAAItH,QAAU2D,EAAK3D,OAAQ,CACpE,GAAIsH,EAAItH,SAAW2D,EAAK3D,QAAUsH,IAAQ3D,EAAM,MAAO,GACvD,IAAIkN,EAASvJ,EAAItH,OAAS,EACtB2R,GAAoB,EACxB,IAAKf,EAAIjN,EAAK3D,OAAS,EAAG4Q,GAAK,IAAKA,EAAG,CACrC,IAAIxJ,EAAOzD,EAAK8f,WAAW7S,GAC3B,GAAa,KAATxJ,GAGA,IAAKoK,EAAc,CACjBvR,EAAQ2Q,EAAI,EACZ,KACF,OAEwB,IAAtBe,IAGFH,GAAA,EACAG,EAAmBf,EAAI,GAErBC,GAAU,IAERzJ,IAASE,EAAImc,WAAW5S,IACR,KAAZA,IAGJhR,EAAM+Q,IAKRC,GAAU,EACVhR,EAAM8R,GAId,CAGA,OADI1R,IAAUJ,EAAKA,EAAM8R,GAAmC,IAAT9R,IAAYA,EAAM8D,EAAK3D,QACnE2D,EAAK0W,MAAMpa,EAAOJ,EAC3B,CACE,IAAK+Q,EAAIjN,EAAK3D,OAAS,EAAG4Q,GAAK,IAAKA,EAClC,GAA2B,KAAvBjN,EAAK8f,WAAW7S,IAGhB,IAAKY,EAAc,CACjBvR,EAAQ2Q,EAAI,EACZ,KACF,OACkB,IAAT/Q,IAGX2R,GAAA,EACA3R,EAAM+Q,EAAI,GAId,OAAa,IAAT/Q,EAAmB,GAChB8D,EAAK0W,MAAMpa,EAAOJ,EAE7B,EAEA8xM,QAAS,SAAiBhuM,GACxBoN,EAAWpN,GAQX,IAPA,IAAI2D,GAAY,EACZsJ,EAAY,EACZ3Q,GAAO,EACPJ,GAAA,EAGA2R,EAAc,EACTX,EAAIlN,EAAK3D,OAAS,EAAG6Q,GAAK,IAAKA,EAAG,CACzC,IAAIc,EAAOhO,EAAK8f,WAAW5S,GAC3B,GAAa,KAATc,GASS,IAAT1R,IAGFJ,GAAA,EACAI,EAAM4Q,EAAI,GAEC,KAATc,GAEkB,IAAdrK,EACFA,EAAWuJ,EACY,IAAhBW,IACPA,EAAc,IACK,IAAdlK,IAGTkK,GAAe,QArBb,IAAK3R,EAAc,CACjB+Q,EAAYC,EAAI,EAChB,KACF,CAoBN,CAEA,OAAkB,IAAdvJ,IAA4B,IAATrH,GAEH,IAAhBuR,GAEgB,IAAhBA,GAAqBlK,IAAarH,EAAM,GAAKqH,IAAasJ,EAAY,EACjE,GAEFjN,EAAK0W,MAAM/S,EAAUrH,EAC9B,EAEAmyH,OAAQ,SAAgBzuH,GACtB,GAAmB,OAAfA,GAA6C,iBAAfA,EAChC,MAAM,IAAI2oD,UAAU,0EAA4E3oD,GAElG,OAvVJ,SAAiBA,EAAKoN,GACpB,IAAIzJ,EAAMyJ,EAAW6gM,KAAO7gM,EAAW8gM,KACnCjhM,EAAOG,EAAWo2E,OAASp2E,EAAWjP,MAAQ,KAAOiP,EAAW+gM,KAAO,IAC3E,OAAKxqM,EAGDA,IAAQyJ,EAAW8gM,KACdvqM,EAAMsJ,EAERtJ,EA8UU,IA9UEsJ,EALVA,CAMX,CAVA,CAuVmB,EAAKjN,EACtB,EAEAixB,MAAO,SAAejxB,GACpBoN,EAAWpN,GAEX,IAAI2D,EAAM,CAAEuqM,KAAM,GAAID,IAAK,GAAIzqH,KAAM,GAAI2qH,IAAK,GAAIhwM,KAAM,IACxD,GAAoB,IAAhB6B,EAAK3D,OAAc,OAAOsH,EAC9B,IAEIsJ,EAFA3Q,EAAO0D,EAAK8f,WAAW,GACvB5jB,EAAsB,KAATI,EAEbJ,GACFyH,EAAIuqM,KAAO,IACXjhM,EAAQ,GAERA,EAAQ,EAaV,IAXA,IAAIY,GAAY,EACZX,EAAY,EACZc,GAAO,EACPvK,GAAA,EACAU,EAAInE,EAAK3D,OAAS,EAIlBgH,EAAc,EAGXc,GAAK8I,IAAS9I,EAEnB,GAAa,MADb7H,EAAO0D,EAAK8f,WAAW3b,KAUV,IAAT6J,IAGFvK,GAAA,EACAuK,EAAM7J,EAAI,GAEC,KAAT7H,GAEkB,IAAduR,EAAiBA,EAAW1J,EAA2B,IAAhBd,IAAmBA,EAAc,IACrD,IAAdwK,IAGXxK,GAAe,QAlBb,IAAKI,EAAc,CACjByJ,EAAY/I,EAAI,EAChB,KACF,CAwCN,OArBkB,IAAd0J,IAA4B,IAATG,GAEP,IAAhB3K,GAEgB,IAAhBA,GAAqBwK,IAAaG,EAAM,GAAKH,IAAaX,EAAY,GACvD,IAATc,IACiCrK,EAAI6/E,KAAO7/E,EAAIxF,KAAhC,IAAd+O,GAAmBhR,EAAkC8D,EAAK0W,MAAM,EAAG1I,GAAgChO,EAAK0W,MAAMxJ,EAAWc,KAG7G,IAAdd,GAAmBhR,GACrByH,EAAIxF,KAAO6B,EAAK0W,MAAM,EAAG7I,GACzBlK,EAAI6/E,KAAOxjF,EAAK0W,MAAM,EAAG1I,KAEzBrK,EAAIxF,KAAO6B,EAAK0W,MAAMxJ,EAAWW,GACjClK,EAAI6/E,KAAOxjF,EAAK0W,MAAMxJ,EAAWc,IAEnCrK,EAAIwqM,IAAMnuM,EAAK0W,MAAM7I,EAAUG,IAG7Bd,EAAY,EAAGvJ,EAAIsqM,IAAMjuM,EAAK0W,MAAM,EAAGxJ,EAAY,GAAYhR,IAAYyH,EAAIsqM,IAAM,KAElFtqM,CACT,EAEAyqM,IAAK,IACLC,UAAW,IACXC,MAAO,KACPC,MAAO,MAGTthM,EAAMshM,MAAQthM,EAEdjN,EAAOhE,QAAUiR,CAAA,gBAAAjN,EAAAoN,EAAAzJ,GC/gBjB,IAAIsJ,EAAStJ,EAAQ,MACjBrH,EAAS2Q,EAAOorL,OAGpB,SAASn8L,EAAW8D,EAAKoN,GACvB,IAAK,IAAIzJ,KAAO3D,EACdoN,EAAIzJ,GAAO3D,EAAI2D,EAEnB,CASA,SAASkK,EAAY7N,EAAKoN,EAAkBzJ,GAC1C,OAAOrH,EAAO0D,EAAKoN,EAAkBzJ,EACvC,CAVIrH,EAAOsjB,MAAQtjB,EAAOi8L,OAASj8L,EAAO88L,aAAe98L,EAAO+8L,gBAC9Dr5L,EAAOhE,QAAUiR,GAGjB/Q,EAAU+Q,EAAQG,GAClBA,EAAQirL,OAASxqL,GAQnB3R,EAAUI,EAAQuR,GAElBA,EAAW+R,KAAO,SAAU5f,EAAKoN,EAAkBzJ,GACjD,GAAmB,iBAAR3D,EACT,MAAM,IAAI2oD,UAAU,iCAEtB,OAAOrsD,EAAO0D,EAAKoN,EAAkBzJ,EACvC,EAEAkK,EAAW0qL,MAAQ,SAAUv4L,EAAMoN,EAAMzJ,GACvC,GAAoB,iBAAT3D,EACT,MAAM,IAAI2oD,UAAU,6BAEtB,IAAI17C,EAAM3Q,EAAO0D,GAUjB,YAAO,IATHoN,EACsB,iBAAbzJ,EACTsJ,EAAIksL,KAAK/rL,EAAMzJ,GAEfsJ,EAAIksL,KAAK/rL,GAGXH,EAAIksL,KAAK,GAEJlsL,CACT,EAEAY,EAAWurL,YAAc,SAAUp5L,GACjC,GAAoB,iBAATA,EACT,MAAM,IAAI2oD,UAAU,6BAEtB,OAAOrsD,EAAO0D,EAChB,EAEA6N,EAAWwrL,gBAAkB,SAAUr5L,GACrC,GAAoB,iBAATA,EACT,MAAM,IAAI2oD,UAAU,6BAEtB,OAAO17C,EAAOqrL,WAAWt4L,EAC3B,iBAAAA,EAAAoN,EAAAzJ,IC7DC,SAAW3D,GACVA,EAAIq0G,OAAS,SAAUr0G,EAAQoN,GAAO,OAAO,IAAI9Q,EAAU0D,EAAQoN,EAAK,EACxEpN,EAAIwuM,UAAYlyM,EAChB0D,EAAIyuM,UAAY5gM,EAChB7N,EAAI0uM,aAuKJ,SAAuB1uM,EAAQoN,GAC7B,OAAO,IAAIS,EAAU7N,EAAQoN,EAC/B,EA9JApN,EAAI2uM,kBAAoB,MAExB,IA+IIvhM,EA/IAH,EAAU,CACZ,UAAW,WAAY,WAAY,UAAW,UAC9C,eAAgB,eAAgB,SAAU,aAC1C,cAAe,QAAS,UAwB1B,SAAS3Q,EAAW8Q,EAAQzJ,GAC1B,KAAM2S,gBAAgBha,GACpB,OAAO,IAAIA,EAAU8Q,EAAQzJ,GAG/B,IAAIzH,EAASoa,MAqFf,SAAuBtW,GACrB,IAAK,IAAIoN,EAAI,EAAGzJ,EAAIsJ,EAAQ5Q,OAAQ+Q,EAAIzJ,EAAGyJ,IACzCpN,EAAOiN,EAAQG,IAAM,EAEzB,CAJA,CApFelR,GACbA,EAAOgI,EAAIhI,EAAOiI,EAAI,GACtBjI,EAAO0yM,oBAAsB5uM,EAAI2uM,kBACjCzyM,EAAOkQ,IAAMzI,GAAO,CAAC,EACrBzH,EAAOkQ,IAAIyiM,UAAY3yM,EAAOkQ,IAAIyiM,WAAa3yM,EAAOkQ,IAAI0iM,cAC1D5yM,EAAO6yM,UAAY7yM,EAAOkQ,IAAIyiM,UAAY,cAAgB,cAC1D3yM,EAAO8yM,KAAO,GACd9yM,EAAO6zL,OAAS7zL,EAAO+yM,WAAa/yM,EAAOgzM,SAAA,EAC3ChzM,EAAOuhF,IAAMvhF,EAAOsP,MAAQ,KAC5BtP,EAAOizM,SAAW/hM,EAClBlR,EAAOkzM,YAAchiM,IAAUlR,EAAOkQ,IAAIgjM,UAC1ClzM,EAAOy1C,MAAQ57B,EAAEs5L,MACjBnzM,EAAOozM,eAAiBpzM,EAAOkQ,IAAIkjM,eACnCpzM,EAAOqzM,SAAWrzM,EAAOozM,eAAiBxyM,OAAO8D,OAAOZ,EAAIwvM,cAAgB1yM,OAAO8D,OAAOZ,EAAIuvM,UAC9FrzM,EAAOuzM,WAAa,GAKhBvzM,EAAOkQ,IAAI85L,QACbhqM,EAAOgqE,GAAKppE,OAAO8D,OAAO0D,IAI5BpI,EAAOwzM,eAAA,IAAgBxzM,EAAOkQ,IAAIlH,SAC9BhJ,EAAOwzM,gBACTxzM,EAAOgJ,SAAWhJ,EAAOwhE,KAAOxhE,EAAOs9G,OAAS,GAElDtjG,EAAKha,EAAQ,UACf,CAxDA8D,EAAIw9J,OAAS,CACX,OACA,wBACA,kBACA,UACA,UACA,eACA,YACA,UACA,WACA,YACA,QACA,aACA,QACA,MACA,QACA,SACA,gBACA,kBAwCG1gK,OAAO8D,SACV9D,OAAO8D,OAAS,SAAUZ,GACxB,SAASoN,IAAM,CAGf,OAFAA,EAAErQ,UAAYiD,EACH,IAAIoN,CAEjB,GAGGtQ,OAAOP,OACVO,OAAOP,KAAO,SAAUyD,GACtB,IAAIoN,EAAI,GACR,IAAK,IAAIzJ,KAAK3D,EAAOA,EAAE/C,eAAe0G,IAAIyJ,EAAE2T,KAAKpd,GACjD,OAAOyJ,CACT,GAyDF9Q,EAAUS,UAAY,CACpB+b,IAAK,WAAcT,EAAI/B,KAAM,EAC7BoiL,MA0zBF,SAAgBtrL,GACd,IAAIzJ,EAAS2S,KACb,GAAIA,KAAK9K,MACP,MAAM8K,KAAK9K,MAEb,GAAI7H,EAAOosL,OACT,OAAO92K,EAAMtV,EACX,wDAEJ,GAAc,OAAVyJ,EACF,OAAOiL,EAAI1U,GAEQ,iBAAVyJ,IACTA,EAAQA,EAAMpQ,YAIhB,IAFA,IAAIV,EAAI,EACJJ,EAAI,GAENA,EAAI4d,EAAO1M,EAAO9Q,KAClBqH,EAAOQ,EAAIjI,EACNA,GAYL,OATIyH,EAAO+rM,gBACT/rM,EAAOuB,WACG,OAANhJ,GACFyH,EAAO+5D,OACP/5D,EAAO61G,OAAS,GAEhB71G,EAAO61G,UAGH71G,EAAOguC,OACb,KAAK57B,EAAEs5L,MAEL,GADA1rM,EAAOguC,MAAQ57B,EAAE45L,iBACP,WAANzzM,EACF,SAEFkd,EAAgBzV,EAAQzH,GACxB,SAEF,KAAK6Z,EAAE45L,iBACLv2L,EAAgBzV,EAAQzH,GACxB,SAEF,KAAK6Z,EAAE4gH,KACL,GAAIhzH,EAAOurM,UAAYvrM,EAAOsrM,WAAY,CAExC,IADA,IAAIphM,EAASvR,EAAI,EACVJ,GAAW,MAANA,GAAmB,MAANA,IACvBA,EAAI4d,EAAO1M,EAAO9Q,OACTqH,EAAO+rM,gBACd/rM,EAAOuB,WACG,OAANhJ,GACFyH,EAAO+5D,OACP/5D,EAAO61G,OAAS,GAEhB71G,EAAO61G,UAIb71G,EAAOisM,UAAYxiM,EAAMe,UAAUN,EAAQvR,EAAI,EACjD,CACU,MAANJ,GAAeyH,EAAOurM,SAAWvrM,EAAOsrM,aAAetrM,EAAOwrM,SAI5DrgM,EAAI5B,EAAYhR,IAAQyH,EAAOurM,UAAWvrM,EAAOsrM,YACnD33L,EAAW3T,EAAQ,mCAEX,MAANzH,EACFyH,EAAOguC,MAAQ57B,EAAE85L,YAEjBlsM,EAAOisM,UAAY1zM,IATrByH,EAAOguC,MAAQ57B,EAAE+5L,UACjBnsM,EAAOosM,iBAAmBpsM,EAAOuB,UAWnC,SAEF,KAAK6Q,EAAEi6L,OAEK,MAAN9zM,EACFyH,EAAOguC,MAAQ57B,EAAEk6L,cAEjBtsM,EAAO+zL,QAAUx7L,EAEnB,SAEF,KAAK6Z,EAAEk6L,cACK,MAAN/zM,EACFyH,EAAOguC,MAAQ57B,EAAEm6L,WAEjBvsM,EAAO+zL,QAAU,IAAMx7L,EACvByH,EAAOguC,MAAQ57B,EAAEi6L,QAEnB,SAEF,KAAKj6L,EAAE+5L,UAEL,GAAU,MAAN5zM,EACFyH,EAAOguC,MAAQ57B,EAAEo6L,UACjBxsM,EAAOysM,SAAW,QACb,GAAIh6L,EAAGlJ,EAAYhR,SAEnB,GAAIka,EAAGtS,EAAW5H,GACvByH,EAAOguC,MAAQ57B,EAAEs6L,SACjB1sM,EAAO48F,QAAUrkG,OACZ,GAAU,MAANA,EACTyH,EAAOguC,MAAQ57B,EAAEm6L,UACjBvsM,EAAO48F,QAAU,QACZ,GAAU,MAANrkG,EACTyH,EAAOguC,MAAQ57B,EAAEu6L,UACjB3sM,EAAO4sM,aAAe5sM,EAAO6sM,aAAe,OACvC,CAGL,GAFAl5L,EAAW3T,EAAQ,eAEfA,EAAOosM,iBAAmB,EAAIpsM,EAAOuB,SAAU,CACjD,IAAI8I,EAAMrK,EAAOuB,SAAWvB,EAAOosM,iBACnC7zM,EAAI,IAAIM,MAAMwR,GAAKO,KAAK,KAAOrS,CACjC,CACAyH,EAAOisM,UAAY,IAAM1zM,EACzByH,EAAOguC,MAAQ57B,EAAE4gH,IACnB,CACA,SAEF,KAAK5gH,EAAEo6L,UA5zBD,aA6zBCxsM,EAAOysM,SAAWl0M,GAAGgM,eACxBgR,EAASvV,EAAQ,eACjBA,EAAOguC,MAAQ57B,EAAE06L,MACjB9sM,EAAOysM,SAAW,GAClBzsM,EAAO+sM,MAAQ,IACN/sM,EAAOysM,SAAWl0M,IAAM,MACjCyH,EAAOguC,MAAQ57B,EAAE46L,QACjBhtM,EAAOitM,QAAU,GACjBjtM,EAAOysM,SAAW,IAp0Bd,aAq0BMzsM,EAAOysM,SAAWl0M,GAAGgM,eAC/BvE,EAAOguC,MAAQ57B,EAAE86L,SACbltM,EAAOmtM,SAAWntM,EAAOurM,UAC3B53L,EAAW3T,EACT,+CAEJA,EAAOmtM,QAAU,GACjBntM,EAAOysM,SAAW,IACH,MAANl0M,GACTgd,EAASvV,EAAQ,oBAAqBA,EAAOysM,UAC7CzsM,EAAOysM,SAAW,GAClBzsM,EAAOguC,MAAQ57B,EAAE4gH,MACRvgH,EAAGjS,EAAOjI,IACnByH,EAAOguC,MAAQ57B,EAAEg7L,iBACjBptM,EAAOysM,UAAYl0M,GAEnByH,EAAOysM,UAAYl0M,EAErB,SAEF,KAAK6Z,EAAEg7L,iBACD70M,IAAMyH,EAAOO,IACfP,EAAOguC,MAAQ57B,EAAEo6L,UACjBxsM,EAAOO,EAAI,IAEbP,EAAOysM,UAAYl0M,EACnB,SAEF,KAAK6Z,EAAE86L,QACK,MAAN30M,GACFyH,EAAOguC,MAAQ57B,EAAE4gH,KACjBz9G,EAASvV,EAAQ,YAAaA,EAAOmtM,SACrCntM,EAAOmtM,SAAA,IAEPntM,EAAOmtM,SAAW50M,EACR,MAANA,EACFyH,EAAOguC,MAAQ57B,EAAEi7L,YACR56L,EAAGjS,EAAOjI,KACnByH,EAAOguC,MAAQ57B,EAAEk7L,eACjBttM,EAAOO,EAAIhI,IAGf,SAEF,KAAK6Z,EAAEk7L,eACLttM,EAAOmtM,SAAW50M,EACdA,IAAMyH,EAAOO,IACfP,EAAOO,EAAI,GACXP,EAAOguC,MAAQ57B,EAAE86L,SAEnB,SAEF,KAAK96L,EAAEi7L,YACLrtM,EAAOmtM,SAAW50M,EACR,MAANA,EACFyH,EAAOguC,MAAQ57B,EAAE86L,QACRz6L,EAAGjS,EAAOjI,KACnByH,EAAOguC,MAAQ57B,EAAEm7L,mBACjBvtM,EAAOO,EAAIhI,GAEb,SAEF,KAAK6Z,EAAEm7L,mBACLvtM,EAAOmtM,SAAW50M,EACdA,IAAMyH,EAAOO,IACfP,EAAOguC,MAAQ57B,EAAEi7L,YACjBrtM,EAAOO,EAAI,IAEb,SAEF,KAAK6R,EAAE46L,QACK,MAANz0M,EACFyH,EAAOguC,MAAQ57B,EAAEo7L,eAEjBxtM,EAAOitM,SAAW10M,EAEpB,SAEF,KAAK6Z,EAAEo7L,eACK,MAANj1M,GACFyH,EAAOguC,MAAQ57B,EAAEq7L,cACjBztM,EAAOitM,QAAU36L,EAAStS,EAAOyI,IAAKzI,EAAOitM,SACzCjtM,EAAOitM,SACT13L,EAASvV,EAAQ,YAAaA,EAAOitM,SAEvCjtM,EAAOitM,QAAU,KAEjBjtM,EAAOitM,SAAW,IAAM10M,EACxByH,EAAOguC,MAAQ57B,EAAE46L,SAEnB,SAEF,KAAK56L,EAAEq7L,cACK,MAANl1M,GACFob,EAAW3T,EAAQ,qBAGnBA,EAAOitM,SAAW,KAAO10M,EACzByH,EAAOguC,MAAQ57B,EAAE46L,SAEjBhtM,EAAOguC,MAAQ57B,EAAE4gH,KAEnB,SAEF,KAAK5gH,EAAE06L,MACK,MAANv0M,EACFyH,EAAOguC,MAAQ57B,EAAEs7L,aAEjB1tM,EAAO+sM,OAASx0M,EAElB,SAEF,KAAK6Z,EAAEs7L,aACK,MAANn1M,EACFyH,EAAOguC,MAAQ57B,EAAEu7L,gBAEjB3tM,EAAO+sM,OAAS,IAAMx0M,EACtByH,EAAOguC,MAAQ57B,EAAE06L,OAEnB,SAEF,KAAK16L,EAAEu7L,eACK,MAANp1M,GACEyH,EAAO+sM,OACTx3L,EAASvV,EAAQ,UAAWA,EAAO+sM,OAErCx3L,EAASvV,EAAQ,gBACjBA,EAAO+sM,MAAQ,GACf/sM,EAAOguC,MAAQ57B,EAAE4gH,MACF,MAANz6H,EACTyH,EAAO+sM,OAAS,KAEhB/sM,EAAO+sM,OAAS,KAAOx0M,EACvByH,EAAOguC,MAAQ57B,EAAE06L,OAEnB,SAEF,KAAK16L,EAAEu6L,UACK,MAANp0M,EACFyH,EAAOguC,MAAQ57B,EAAEw7L,iBACRn7L,EAAGlJ,EAAYhR,GACxByH,EAAOguC,MAAQ57B,EAAEy7L,eAEjB7tM,EAAO4sM,cAAgBr0M,EAEzB,SAEF,KAAK6Z,EAAEy7L,eACL,IAAK7tM,EAAO6sM,cAAgBp6L,EAAGlJ,EAAYhR,GACzC,SACe,MAANA,EACTyH,EAAOguC,MAAQ57B,EAAEw7L,iBAEjB5tM,EAAO6sM,cAAgBt0M,EAEzB,SAEF,KAAK6Z,EAAEw7L,iBACK,MAANr1M,GACFgd,EAASvV,EAAQ,0BAA2B,CAC1CxF,KAAMwF,EAAO4sM,aACbjnK,KAAM3lC,EAAO6sM,eAEf7sM,EAAO4sM,aAAe5sM,EAAO6sM,aAAe,GAC5C7sM,EAAOguC,MAAQ57B,EAAE4gH,OAEjBhzH,EAAO6sM,cAAgB,IAAMt0M,EAC7ByH,EAAOguC,MAAQ57B,EAAEy7L,gBAEnB,SAEF,KAAKz7L,EAAEs6L,SACDj6L,EAAG1S,EAAUxH,GACfyH,EAAO48F,SAAWrkG,GAElBuW,EAAO9O,GACG,MAANzH,EACFoH,EAAQK,GACO,MAANzH,EACTyH,EAAOguC,MAAQ57B,EAAE07L,gBAEb3iM,EAAI5B,EAAYhR,IAClBob,EAAW3T,EAAQ,iCAErBA,EAAOguC,MAAQ57B,EAAE27L,SAGrB,SAEF,KAAK37L,EAAE07L,eACK,MAANv1M,GACFoH,EAAQK,GAAA,GACRwV,EAASxV,KAET2T,EAAW3T,EAAQ,kDACnBA,EAAOguC,MAAQ57B,EAAE27L,QAEnB,SAEF,KAAK37L,EAAE27L,OAEL,GAAIt7L,EAAGlJ,EAAYhR,GACjB,SACe,MAANA,EACToH,EAAQK,GACO,MAANzH,EACTyH,EAAOguC,MAAQ57B,EAAE07L,eACRr7L,EAAGtS,EAAW5H,IACvByH,EAAOguM,WAAaz1M,EACpByH,EAAOiuM,YAAc,GACrBjuM,EAAOguC,MAAQ57B,EAAE87L,aAEjBv6L,EAAW3T,EAAQ,0BAErB,SAEF,KAAKoS,EAAE87L,YACK,MAAN31M,EACFyH,EAAOguC,MAAQ57B,EAAE+7L,aACF,MAAN51M,GACTob,EAAW3T,EAAQ,2BACnBA,EAAOiuM,YAAcjuM,EAAOguM,WAC5B9mM,EAAOlH,GACPL,EAAQK,IACCyS,EAAGlJ,EAAYhR,GACxByH,EAAOguC,MAAQ57B,EAAEg8L,sBACR37L,EAAG1S,EAAUxH,GACtByH,EAAOguM,YAAcz1M,EAErBob,EAAW3T,EAAQ,0BAErB,SAEF,KAAKoS,EAAEg8L,sBACL,GAAU,MAAN71M,EACFyH,EAAOguC,MAAQ57B,EAAE+7L,iBACZ,IAAI17L,EAAGlJ,EAAYhR,GACxB,SAEAob,EAAW3T,EAAQ,2BACnBA,EAAO85E,IAAI6oF,WAAW3iK,EAAOguM,YAAc,GAC3ChuM,EAAOiuM,YAAc,GACrB14L,EAASvV,EAAQ,cAAe,CAC9BxF,KAAMwF,EAAOguM,WACb7pM,MAAO,KAETnE,EAAOguM,WAAa,GACV,MAANz1M,EACFoH,EAAQK,GACCyS,EAAGtS,EAAW5H,IACvByH,EAAOguM,WAAaz1M,EACpByH,EAAOguC,MAAQ57B,EAAE87L,cAEjBv6L,EAAW3T,EAAQ,0BACnBA,EAAOguC,MAAQ57B,EAAE27L,OAErB,CACA,SAEF,KAAK37L,EAAE+7L,aACL,GAAI17L,EAAGlJ,EAAYhR,GACjB,SACSka,EAAGjS,EAAOjI,IACnByH,EAAOO,EAAIhI,EACXyH,EAAOguC,MAAQ57B,EAAEi8L,sBAEjB16L,EAAW3T,EAAQ,4BACnBA,EAAOguC,MAAQ57B,EAAEk8L,sBACjBtuM,EAAOiuM,YAAc11M,GAEvB,SAEF,KAAK6Z,EAAEi8L,oBACL,GAAI91M,IAAMyH,EAAOO,EAAG,CACR,MAANhI,EACFyH,EAAOguC,MAAQ57B,EAAEm8L,sBAEjBvuM,EAAOiuM,aAAe11M,EAExB,QACF,CACA2O,EAAOlH,GACPA,EAAOO,EAAI,GACXP,EAAOguC,MAAQ57B,EAAEo8L,oBACjB,SAEF,KAAKp8L,EAAEo8L,oBACD/7L,EAAGlJ,EAAYhR,GACjByH,EAAOguC,MAAQ57B,EAAE27L,OACF,MAANx1M,EACToH,EAAQK,GACO,MAANzH,EACTyH,EAAOguC,MAAQ57B,EAAE07L,eACRr7L,EAAGtS,EAAW5H,IACvBob,EAAW3T,EAAQ,oCACnBA,EAAOguM,WAAaz1M,EACpByH,EAAOiuM,YAAc,GACrBjuM,EAAOguC,MAAQ57B,EAAE87L,aAEjBv6L,EAAW3T,EAAQ,0BAErB,SAEF,KAAKoS,EAAEk8L,sBACL,GAAInjM,EAAIzL,EAAWnH,GAAI,CACX,MAANA,EACFyH,EAAOguC,MAAQ57B,EAAEq8L,sBAEjBzuM,EAAOiuM,aAAe11M,EAExB,QACF,CACA2O,EAAOlH,GACG,MAANzH,EACFoH,EAAQK,GAERA,EAAOguC,MAAQ57B,EAAE27L,OAEnB,SAEF,KAAK37L,EAAEm6L,UACL,GAAKvsM,EAAO48F,QAaK,MAANrkG,EACTid,EAASxV,GACAyS,EAAG1S,EAAUxH,GACtByH,EAAO48F,SAAWrkG,EACTyH,EAAO+zL,QAChB/zL,EAAO+zL,QAAU,KAAO/zL,EAAO48F,QAC/B58F,EAAO48F,QAAU,GACjB58F,EAAOguC,MAAQ57B,EAAEi6L,SAEblhM,EAAI5B,EAAYhR,IAClBob,EAAW3T,EAAQ,kCAErBA,EAAOguC,MAAQ57B,EAAEs8L,yBAzBE,CACnB,GAAIj8L,EAAGlJ,EAAYhR,GACjB,SACS4S,EAAIhL,EAAW5H,GACpByH,EAAO+zL,QACT/zL,EAAO+zL,QAAU,KAAOx7L,EACxByH,EAAOguC,MAAQ57B,EAAEi6L,QAEjB14L,EAAW3T,EAAQ,mCAGrBA,EAAO48F,QAAUrkG,CAErB,CAcA,SAEF,KAAK6Z,EAAEs8L,oBACL,GAAIj8L,EAAGlJ,EAAYhR,GACjB,SAEQ,MAANA,EACFid,EAASxV,GAET2T,EAAW3T,EAAQ,qCAErB,SAEF,KAAKoS,EAAE85L,YACP,KAAK95L,EAAEm8L,sBACP,KAAKn8L,EAAEq8L,sBACL,IAAI3uM,EACAY,EACJ,OAAQV,EAAOguC,OACb,KAAK57B,EAAE85L,YACLpsM,EAAcsS,EAAE4gH,KAChBtyH,EAAS,WACT,MAEF,KAAK0R,EAAEm8L,sBACLzuM,EAAcsS,EAAEi8L,oBAChB3tM,EAAS,cACT,MAEF,KAAK0R,EAAEq8L,sBACL3uM,EAAcsS,EAAEk8L,sBAChB5tM,EAAS,cAIH,MAANnI,GACFyH,EAAOU,IAAWmsB,EAAY7sB,GAC9BA,EAAO2uM,OAAS,GAChB3uM,EAAOguC,MAAQluC,GACN2S,EAAGzS,EAAO2uM,OAAOj2M,OAASqS,EAAa5D,EAAa5O,GAC7DyH,EAAO2uM,QAAUp2M,GAEjBob,EAAW3T,EAAQ,oCACnBA,EAAOU,IAAW,IAAMV,EAAO2uM,OAASp2M,EACxCyH,EAAO2uM,OAAS,GAChB3uM,EAAOguC,MAAQluC,GAGjB,SAEF,QACE,MAAM,IAAI+J,MAAM7J,EAAQ,kBAAoBA,EAAOguC,OAOzD,OAHIhuC,EAAOuB,UAAYvB,EAAOirM,qBA14ChC,SAA4BxhM,GAG1B,IAFA,IAAIzJ,EAAaiL,KAAKgN,IAAI5b,EAAI2uM,kBAAmB,IAC7CryM,EAAY,EACPJ,EAAI,EAAG2R,EAAIZ,EAAQ5Q,OAAQH,EAAI2R,EAAG3R,IAAK,CAC9C,IAAIgR,EAAME,EAAOH,EAAQ/Q,IAAIG,OAC7B,GAAI6Q,EAAMvJ,EAKR,OAAQsJ,EAAQ/Q,IACd,IAAK,WACHia,EAAU/I,GACV,MAEF,IAAK,QACH8L,EAAS9L,EAAQ,UAAWA,EAAOsjM,OACnCtjM,EAAOsjM,MAAQ,GACf,MAEF,IAAK,SACHx3L,EAAS9L,EAAQ,WAAYA,EAAOsqL,QACpCtqL,EAAOsqL,OAAS,GAChB,MAEF,QACEz+K,EAAM7L,EAAQ,+BAAiCH,EAAQ/Q,IAG7DI,EAAYsS,KAAKgN,IAAItf,EAAW4Q,EAClC,CAEA,IAAIc,EAAIhO,EAAI2uM,kBAAoBryM,EAChC8Q,EAAOwhM,oBAAsB5gM,EAAIZ,EAAOlI,QAC1C,CAlCA,CA24CsBvB,GAEbA,CACT,EAr1CE4uM,OAAQ,WAAiC,OAAnBj8L,KAAK9K,MAAQ,KAAa8K,IAAK,EACrD60D,MAAO,WAAc,OAAO70D,KAAKoiL,MAAM,KAAM,EAC7C3pJ,MAAO,WAjBT,IAAuB/uC,EACrBmW,EADqBnW,EAiBasW,MAfb,KAAjBtW,EAAO0wM,QACTx3L,EAASlZ,EAAQ,UAAWA,EAAO0wM,OACnC1wM,EAAO0wM,MAAQ,IAEK,KAAlB1wM,EAAO03L,SACTx+K,EAASlZ,EAAQ,WAAYA,EAAO03L,QACpC13L,EAAO03L,OAAS,GASsB,GAI1C,IACEtqL,EAASzJ,EAAA,KAAA6uM,MAGX,CAFE,MAAOxyM,GACPoN,EAAS,WAAa,CACxB,CAEA,IAAIlR,EAAc8D,EAAIw9J,OAAOnmJ,QAAO,SAAUrX,GAC5C,MAAc,UAAPA,GAAyB,QAAPA,CAC3B,IAMA,SAAS6N,EAAW7N,EAAQ2D,GAC1B,KAAM2S,gBAAgBzI,GACpB,OAAO,IAAIA,EAAU7N,EAAQ2D,GAG/ByJ,EAAOsU,MAAMpL,MAEbA,KAAKm8L,QAAU,IAAIn2M,EAAU0D,EAAQ2D,GACrC2S,KAAK8kH,UAAA,EACL9kH,KAAKo8L,UAAA,EAEL,IAAIzlM,EAAKqJ,KAETA,KAAKm8L,QAAQxpD,MAAQ,WACnBh8I,EAAG8rC,KAAK,MACV,EAEAziC,KAAKm8L,QAAQ5pM,QAAU,SAAU7I,GAC/BiN,EAAG8rC,KAAK,QAAS/4C,GAIjBiN,EAAGwlM,QAAQjnM,MAAQ,IACrB,EAEA8K,KAAKq8L,SAAW,KAEhBz2M,EAAYwN,SAAQ,SAAU1J,GAC5BlD,OAAOmC,eAAegO,EAAI,KAAOjN,EAAI,CACnCoX,IAAK,WACH,OAAOnK,EAAGwlM,QAAQ,KAAOzyM,EAC3B,EACA6Z,IAAK,SAAUzM,GACb,IAAKA,EAGH,OAFAH,EAAGk8C,mBAAmBnpD,GACtBiN,EAAGwlM,QAAQ,KAAOzyM,GAAMoN,EACjBA,EAETH,EAAGmlB,GAAGpyB,EAAIoN,EACZ,EACAgvD,YAAA,EACA0hB,cAAA,GAEJ,GACF,CAEAjwE,EAAU9Q,UAAYD,OAAO8D,OAAOwM,EAAOrQ,UAAW,CACpDX,YAAa,CACX0L,MAAO+F,KAIXA,EAAU9Q,UAAU27L,MAAQ,SAAU14L,GACpC,GAAsB,mBAAXq4L,QACkB,mBAApBA,OAAO7kF,UACd6kF,OAAO7kF,SAASxzG,GAAO,CACvB,IAAKsW,KAAKq8L,SAAU,CAClB,IAAIvlM,EAAKzJ,EAAA,MAAAuJ,EACToJ,KAAKq8L,SAAW,IAAIvlM,EAAG,OACzB,CACApN,EAAOsW,KAAKq8L,SAASja,MAAM14L,EAC7B,CAIA,OAFAsW,KAAKm8L,QAAQ/Z,MAAM14L,EAAKhD,YACxBsZ,KAAKyiC,KAAK,OAAQ/4C,IAAA,CAEpB,EAEA6N,EAAU9Q,UAAU+b,IAAM,SAAU9Y,GAKlC,OAJIA,GAASA,EAAM3D,QACjBia,KAAKoiL,MAAM14L,GAEbsW,KAAKm8L,QAAQ35L,OAAA,CAEf,EAEAjL,EAAU9Q,UAAUq1B,GAAK,SAAUpyB,EAAI2D,GACrC,IAAIsJ,EAAKqJ,KAST,OARKrJ,EAAGwlM,QAAQ,KAAOzyM,KAAoC,IAA7B9D,EAAYuM,QAAQzI,KAChDiN,EAAGwlM,QAAQ,KAAOzyM,GAAM,WACtB,IAAIoN,EAA4B,IAArB9O,UAAUjC,OAAe,CAACiC,UAAU,IAAM9B,MAAMklB,MAAM,KAAMpjB,WACvE8O,EAAKoa,OAAO,EAAG,EAAGxnB,GAClBiN,EAAG8rC,KAAKr3B,MAAMzU,EAAIG,EACpB,GAGKA,EAAOrQ,UAAUq1B,GAAGl1B,KAAK+P,EAAIjN,EAAI2D,EAC1C,EAGA,IAAIuJ,EAAa,UAIbc,EAAS,aACTvK,EAAS,uDAGTU,EAAQ,MACRd,EAAY6J,EAAa,IAGzB7I,EAAgB,uCAChBD,EAAkB,gCAClBE,EAAS,CAAEsuM,IAAKvuM,EAAe6hM,MAAO9hM,GAG1C8I,EAAamY,EAAUnY,GACvBc,EAASqX,EAAUrX,GACnBvK,EAAS4hB,EAAU5hB,GAQnB,IAAIK,EAAY,4JAEZJ,EAAW,iMAEXoH,EAAc,6JACd4D,EAAa,kMAKjB,SAAS2W,EAAWrlB,GAClB,OAAOA,EAAIqO,MAAM,IAAI6e,QAAO,SAAUltB,EAAGoN,GAEvC,OADApN,EAAEoN,IAAA,EACKpN,CACT,GAAG,CAAC,EACN,CAMA,SAASoW,EAAIpW,EAAWoN,GACtB,OALF,SAAmBpN,GACjB,MAA6C,oBAAtClD,OAAOC,UAAUC,SAASE,KAAK8C,EACxC,CAFA,CAKkBA,KAAeoN,EAAE8iB,MAAMlwB,GAAaA,EAAUoN,EAChE,CAEA,SAAS0B,EAAK9O,EAAWoN,GACvB,OAAQgJ,EAAGpW,EAAWoN,EACxB,CApBAjJ,EAAQkhB,EAAUlhB,GAClBd,EAAYgiB,EAAUhiB,GAqBtB,IAorCQ2L,EACA7S,EACA4W,EAtrCJgD,EAAI,EAsTR,IAAK,IAAIL,KArTT1V,EAAI6yM,MAAQ,CACVxD,MAAOt5L,IACP45L,iBAAkB55L,IAClB4gH,KAAM5gH,IACN85L,YAAa95L,IACb+5L,UAAW/5L,IACXo6L,UAAWp6L,IACXg7L,iBAAkBh7L,IAClB86L,QAAS96L,IACTk7L,eAAgBl7L,IAChBi7L,YAAaj7L,IACbm7L,mBAAoBn7L,IACpB+8L,iBAAkB/8L,IAClB46L,QAAS56L,IACTo7L,eAAgBp7L,IAChBq7L,cAAer7L,IACf06L,MAAO16L,IACPs7L,aAAct7L,IACdu7L,eAAgBv7L,IAChBu6L,UAAWv6L,IACXy7L,eAAgBz7L,IAChBw7L,iBAAkBx7L,IAClBs6L,SAAUt6L,IACV07L,eAAgB17L,IAChB27L,OAAQ37L,IACR87L,YAAa97L,IACbg8L,sBAAuBh8L,IACvB+7L,aAAc/7L,IACdi8L,oBAAqBj8L,IACrBo8L,oBAAqBp8L,IACrBk8L,sBAAuBl8L,IACvBm8L,sBAAuBn8L,IACvBq8L,sBAAuBr8L,IACvBm6L,UAAWn6L,IACXs8L,oBAAqBt8L,IACrBi6L,OAAQj6L,IACRk6L,cAAel6L,KAGjB/V,EAAIwvM,aAAe,CACjBuD,IAAO,IACP5lL,GAAM,IACNpE,GAAM,IACNiqL,KAAQ,IACRC,KAAQ,KAGVjzM,EAAIuvM,SAAW,CACbwD,IAAO,IACP5lL,GAAM,IACNpE,GAAM,IACNiqL,KAAQ,IACRC,KAAQ,IACRC,MAAS,IACTC,OAAU,IACVC,MAAS,IACTC,OAAU,IACVC,MAAS,IACTC,OAAU,IACVC,KAAQ,IACRC,OAAU,IACVC,IAAO,IACPC,OAAU,IACVC,MAAS,IACTC,OAAU,IACVC,KAAQ,IACRC,OAAU,IACVC,MAAS,IACTC,OAAU,IACVC,KAAQ,IACRC,OAAU,IACVC,OAAU,IACVC,MAAS,IACTC,OAAU,IACVC,OAAU,IACVC,OAAU,IACVC,KAAQ,IACRC,MAAS,IACTC,OAAU,IACVC,MAAS,IACTC,OAAU,IACVC,KAAQ,IACRC,OAAU,IACVC,OAAU,IACVC,MAAS,IACTC,MAAS,IACTC,OAAU,IACVC,MAAS,IACTC,OAAU,IACVC,KAAQ,IACRC,OAAU,IACVC,OAAU,IACVC,MAAS,IACTC,OAAU,IACVC,IAAO,IACPC,KAAQ,IACRC,OAAU,IACVC,MAAS,IACTC,OAAU,IACVC,KAAQ,IACRC,OAAU,IACVC,OAAU,IACVC,MAAS,IACTC,OAAU,IACVC,OAAU,IACVC,OAAU,IACVC,KAAQ,IACRC,MAAS,IACTC,MAAS,IACTC,OAAU,IACVC,MAAS,IACTC,OAAU,IACVC,KAAQ,IACRC,OAAU,IACVC,KAAQ,IACRngJ,KAAQ,IACRogJ,IAAO,IACPC,KAAQ,IACRC,MAAS,IACTC,KAAQ,IACRC,MAAS,IACTC,OAAU,IACVC,IAAO,IACPC,OAAU,IACVC,KAAQ,IACRC,IAAO,IACPC,KAAQ,IACRC,MAAS,IACTC,IAAO,IACPC,IAAO,IACPC,KAAQ,IACRC,IAAO,IACPC,OAAU,IACVC,KAAQ,IACRC,KAAQ,IACRC,KAAQ,IACRC,MAAS,IACTC,MAAS,IACTC,KAAQ,IACRC,OAAU,IACVC,MAAS,IACTC,KAAQ,IACRC,MAAS,IACTC,OAAU,IACVC,OAAU,IACVC,OAAU,IACVC,OAAU,IACV7oF,MAAS,IACT8oF,OAAU,IACVC,MAAS,IACTC,MAAS,IACTC,OAAU,IACVC,OAAU,IACVC,KAAQ,IACRC,KAAQ,IACRC,KAAQ,IACRC,MAAS,IACTC,MAAS,IACTC,KAAQ,IACRC,MAAS,IACTC,MAAS,IACTC,QAAW,IACXC,KAAQ,IACRC,IAAO,IACPC,MAAS,IACTC,KAAQ,IACRC,MAAS,IACTC,OAAU,IACVC,GAAM,IACNC,GAAM,IACN3gK,GAAM,IACN4gK,QAAW,IACX1jK,GAAM,IACN2jK,IAAO,IACPC,MAAS,IACTC,IAAO,IACPC,QAAW,IACXC,IAAO,IACPC,IAAO,IACPC,IAAO,IACPC,MAAS,IACTC,MAAS,IACTC,KAAQ,IACRC,MAAS,IACTC,MAAS,IACTC,QAAW,IACXC,KAAQ,IACRC,IAAO,IACPC,MAAS,IACTC,KAAQ,IACRC,MAAS,IACTC,OAAU,IACVC,GAAM,IACNC,GAAM,IACNvrK,GAAM,IACNwrK,QAAW,IACXxuK,GAAM,IACNyuK,IAAO,IACPC,OAAU,IACVC,MAAS,IACTC,IAAO,IACPC,QAAW,IACXC,IAAO,IACPC,IAAO,IACPC,IAAO,IACPC,MAAS,IACTC,SAAY,IACZC,MAAS,IACTC,IAAO,IACPC,KAAQ,KACRC,KAAQ,KACRC,OAAU,KACVC,KAAQ,KACRC,IAAO,KACPC,IAAO,KACPC,IAAO,KACPC,MAAS,KACTC,MAAS,KACTC,MAAS,KACTC,MAAS,KACTC,MAAS,KACTC,MAAS,KACTC,MAAS,KACTC,MAAS,KACTC,OAAU,KACVC,OAAU,KACVC,KAAQ,KACRC,OAAU,KACVC,OAAU,KACVC,MAAS,KACTC,MAAS,KACTC,OAAU,KACVC,OAAU,KACVC,MAAS,KACTC,MAAS,KACTC,KAAQ,KACRn7C,MAAS,KACTo7C,OAAU,KACVC,KAAQ,KACRC,MAAS,KACTC,QAAW,KACXC,KAAQ,KACRC,KAAQ,KACRC,KAAQ,KACRC,KAAQ,KACRC,KAAQ,KACRC,MAAS,KACTC,KAAQ,KACRC,KAAQ,KACRC,KAAQ,KACRC,KAAQ,KACRC,KAAQ,KACRC,OAAU,KACV5rL,KAAQ,KACR6rL,MAAS,KACTC,MAAS,KACTC,MAAS,KACTC,KAAQ,KACRC,MAAS,KACTr0K,GAAM,KACNs0K,KAAQ,KACRC,IAAO,KACPC,MAAS,KACTC,OAAU,KACVC,MAAS,KACTC,KAAQ,KACRC,MAAS,KACTC,IAAO,KACPC,IAAO,KACPrlL,GAAM,KACNslL,IAAO,KACPC,IAAO,KACPC,IAAO,KACPC,OAAU,KACVC,IAAO,KACPC,KAAQ,KACRC,MAAS,KACT5/L,GAAM,KACN6/L,MAAS,KACTr/L,GAAM,KACNoB,GAAM,KACNk+L,IAAO,KACPC,IAAO,KACPC,KAAQ,KACRC,KAAQ,KACRC,KAAQ,KACRC,MAAS,KACTC,OAAU,KACVC,KAAQ,KACRC,KAAQ,KACRC,MAAS,KACTC,MAAS,KACTC,OAAU,KACVC,OAAU,KACV7xL,KAAQ,KACR8xL,KAAQ,KACRC,IAAO,KACPC,OAAU,KACVC,MAAS,KACTC,OAAU,KACVC,MAAS,MAGX7kN,OAAOP,KAAKyD,EAAIuvM,UAAU7lM,SAAQ,SAAU0D,GAC1C,IAAIzJ,EAAI3D,EAAIuvM,SAASniM,GACjBH,EAAiB,iBAANtJ,EAAiB6d,OAAOC,aAAa9d,GAAKA,EACzD3D,EAAIuvM,SAASniM,GAAOH,CACtB,IAEcjN,EAAI6yM,MAChB7yM,EAAI6yM,MAAM7yM,EAAI6yM,MAAMn9L,IAAMA,EAM5B,SAASQ,EAAMlW,EAAQoN,EAAOzJ,GAC5B3D,EAAOoN,IAAUpN,EAAOoN,GAAOzJ,EACjC,CAEA,SAASuV,EAAUlZ,EAAQoN,EAAUzJ,GAC/B3D,EAAO4vM,UAAUz5L,EAAUnW,GAC/BkW,EAAKlW,EAAQoN,EAAUzJ,EACzB,CAEA,SAASwS,EAAWnW,GAClBA,EAAO4vM,SAAW35L,EAASjW,EAAOoM,IAAKpM,EAAO4vM,UAC1C5vM,EAAO4vM,UAAU15L,EAAKlW,EAAQ,SAAUA,EAAO4vM,UACnD5vM,EAAO4vM,SAAW,EACpB,CAEA,SAAS35L,EAAUjW,EAAKoN,GAGtB,OAFIpN,EAAIqN,OAAMD,EAAOA,EAAKC,QACtBrN,EAAIm4L,YAAW/qL,EAAOA,EAAK5K,QAAQ,OAAQ,MACxC4K,CACT,CAEA,SAAS6L,EAAOjZ,EAAQoN,GAUtB,OATA+I,EAAUnW,GACNA,EAAO0vM,gBACTtiM,GAAM,WAAapN,EAAO09D,KACxB,aAAe19D,EAAOw5G,OACtB,WAAax5G,EAAOmE,GAExBiJ,EAAK,IAAII,MAAMJ,GACfpN,EAAOwL,MAAQ4B,EACf8I,EAAKlW,EAAQ,UAAWoN,GACjBpN,CACT,CAEA,SAASqY,EAAKrY,GAYZ,OAXIA,EAAOkvM,UAAYlvM,EAAOivM,YAAY33L,EAAWtX,EAAQ,qBACxDA,EAAO2xC,QAAU57B,EAAEs5L,OACrBrvM,EAAO2xC,QAAU57B,EAAE45L,kBACnB3vM,EAAO2xC,QAAU57B,EAAE4gH,MACpB19G,EAAMjZ,EAAQ,kBAEhBmW,EAAUnW,GACVA,EAAOmE,EAAI,GACXnE,EAAO+vL,QAAA,EACP75K,EAAKlW,EAAQ,SACb1D,EAAUY,KAAK8C,EAAQA,EAAOmvM,OAAQnvM,EAAOoM,KACtCpM,CACT,CAEA,SAASsX,EAAYtX,EAAQoN,GAC3B,GAAsB,iBAAXpN,KAAyBA,aAAkB1D,GACpD,MAAM,IAAIkR,MAAM,0BAEdxN,EAAOmvM,QACTl2L,EAAMjZ,EAAQoN,EAElB,CAEA,SAASqF,EAAQzS,GACVA,EAAOmvM,SAAQnvM,EAAOugG,QAAUvgG,EAAOugG,QAAQvgG,EAAO+uM,cAC3D,IAAI3hM,EAASpN,EAAOgvM,KAAKhvM,EAAOgvM,KAAK3yM,OAAS,IAAM2D,EAChD2D,EAAM3D,EAAOy9E,IAAM,CAAEt/E,KAAM6B,EAAOugG,QAAS+lE,WAAY,CAAC,GAGxDtmK,EAAOoM,IAAI85L,QACbviM,EAAIuiE,GAAK94D,EAAO84D,IAElBlmE,EAAOyvM,WAAWpzM,OAAS,EAC3B6c,EAASlZ,EAAQ,iBAAkB2D,EACrC,CAEA,SAAS4T,EAAOvX,EAAMoN,GACpB,IACIzJ,EADI3D,EAAKyI,QAAQ,KACF,EAAI,CAAE,GAAIzI,GAASA,EAAKqO,MAAM,KAC7CpB,EAAStJ,EAAS,GAClBrH,EAAQqH,EAAS,GAQrB,OALIyJ,GAAsB,UAATpN,IACfiN,EAAS,QACT3Q,EAAQ,IAGH,CAAEoqK,OAAQz5J,EAAQ+4L,MAAO1pM,EAClC,CAEA,SAASuO,EAAQ7K,GAKf,GAJKA,EAAOmvM,SACVnvM,EAAO2xM,WAAa3xM,EAAO2xM,WAAW3xM,EAAO+uM,eAGO,IAAlD/uM,EAAOyvM,WAAWhnM,QAAQzI,EAAO2xM,aACnC3xM,EAAOy9E,IAAI6oF,WAAWrpK,eAAe+C,EAAO2xM,YAC5C3xM,EAAO2xM,WAAa3xM,EAAO4xM,YAAc,OAF3C,CAMA,GAAI5xM,EAAOoM,IAAI85L,MAAO,CACpB,IAAI94L,EAAKmK,EAAMvX,EAAO2xM,YAAA,GAClBhuM,EAASyJ,EAAGs5J,OACZz5J,EAAQG,EAAG44L,MAEf,GAAe,UAAXriM,EAEF,GAAc,QAAVsJ,GAAmBjN,EAAO4xM,cAAgBvtM,EAC5CiT,EAAWtX,EACT,gCAAkCqE,EAAlC,aACarE,EAAO4xM,kBACjB,GAAc,UAAV3kM,GAAqBjN,EAAO4xM,cAAgBxtM,EACrDkT,EAAWtX,EACT,kCAAoCoE,EAApC,aACapE,EAAO4xM,iBACjB,CACL,IAAIt1M,EAAM0D,EAAOy9E,IACbvhF,EAAS8D,EAAOgvM,KAAKhvM,EAAOgvM,KAAK3yM,OAAS,IAAM2D,EAChD1D,EAAI4pE,KAAOhqE,EAAOgqE,KACpB5pE,EAAI4pE,GAAKppE,OAAO8D,OAAO1E,EAAOgqE,KAEhC5pE,EAAI4pE,GAAGj5D,GAASjN,EAAO4xM,WACzB,CAMF5xM,EAAOyvM,WAAW1uL,KAAK,CAAC/gB,EAAO2xM,WAAY3xM,EAAO4xM,aACpD,MAEE5xM,EAAOy9E,IAAI6oF,WAAWtmK,EAAO2xM,YAAc3xM,EAAO4xM,YAClD14L,EAASlZ,EAAQ,cAAe,CAC9B7B,KAAM6B,EAAO2xM,WACb7pM,MAAO9H,EAAO4xM,cAIlB5xM,EAAO2xM,WAAa3xM,EAAO4xM,YAAc,EAxCzC,CAyCF,CAEA,SAAStuM,EAAStD,EAAQoN,GACxB,GAAIpN,EAAOoM,IAAI85L,MAAO,CAEpB,IAAIviM,EAAM3D,EAAOy9E,IAGbxwE,EAAKsK,EAAMvX,EAAOugG,SACtB58F,EAAI+iK,OAASz5J,EAAGy5J,OAChB/iK,EAAIqiM,MAAQ/4L,EAAG+4L,MACfriM,EAAIojB,IAAMpjB,EAAIuiE,GAAGj5D,EAAGy5J,SAAW,GAE3B/iK,EAAI+iK,SAAW/iK,EAAIojB,MACrBzP,EAAWtX,EAAQ,6BACjBg3B,KAAKC,UAAUj3B,EAAOugG,UACxB58F,EAAIojB,IAAM9Z,EAAGy5J,QAGf,IAAIpqK,EAAS0D,EAAOgvM,KAAKhvM,EAAOgvM,KAAK3yM,OAAS,IAAM2D,EAChD2D,EAAIuiE,IAAM5pE,EAAO4pE,KAAOviE,EAAIuiE,IAC9BppE,OAAOP,KAAKoH,EAAIuiE,IAAIx8D,SAAQ,SAAU0D,GACpC8L,EAASlZ,EAAQ,kBAAmB,CAClC0mK,OAAQt5J,EACR2Z,IAAKpjB,EAAIuiE,GAAG94D,IAEhB,IAMF,IAAK,IAAIlR,EAAI,EAAG2R,EAAI7N,EAAOyvM,WAAWpzM,OAAQH,EAAI2R,EAAG3R,IAAK,CACxD,IAAIgR,EAAKlN,EAAOyvM,WAAWvzM,GACvB8R,EAAOd,EAAG,GACVzJ,EAAQyJ,EAAG,GACX/I,EAAWoT,EAAMvJ,GAAA,GACjB3K,EAASc,EAASuiK,OAClBriK,EAAQF,EAAS6hM,MACjB5hM,EAAiB,KAAXf,EAAgB,GAAMM,EAAIuiE,GAAG7iE,IAAW,GAC9CiB,EAAI,CACNnG,KAAM6P,EACNlG,MAAOrE,EACPijK,OAAQrjK,EACR2iM,MAAO3hM,EACP0iB,IAAK3iB,GAKHf,GAAqB,UAAXA,IAAuBe,IACnCkT,EAAWtX,EAAQ,6BACjBg3B,KAAKC,UAAU5zB,IACjBiB,EAAEyiB,IAAM1jB,GAEVrD,EAAOy9E,IAAI6oF,WAAWt4J,GAAQ1J,EAC9B4U,EAASlZ,EAAQ,cAAesE,EAClC,CACAtE,EAAOyvM,WAAWpzM,OAAS,CAC7B,CAEA2D,EAAOy9E,IAAImkI,gBAAkBx0M,EAG7BpN,EAAOkvM,SAAA,EACPlvM,EAAOgvM,KAAKjuL,KAAK/gB,EAAOy9E,KACxBvkE,EAASlZ,EAAQ,YAAaA,EAAOy9E,KAChCrwE,IAEEpN,EAAOovM,UAA6C,WAAjCpvM,EAAOugG,QAAQ32F,cAGrC5J,EAAO2xC,MAAQ57B,EAAE4gH,KAFjB32H,EAAO2xC,MAAQ57B,EAAEi6L,OAInBhwM,EAAOy9E,IAAM,KACbz9E,EAAOugG,QAAU,IAEnBvgG,EAAO2xM,WAAa3xM,EAAO4xM,YAAc,GACzC5xM,EAAOyvM,WAAWpzM,OAAS,CAC7B,CAEA,SAAS8c,EAAUnZ,GACjB,IAAKA,EAAOugG,QAIV,OAHAjpF,EAAWtX,EAAQ,0BACnBA,EAAO4vM,UAAY,WACnB5vM,EAAO2xC,MAAQ57B,EAAE4gH,MAInB,GAAI32H,EAAO03L,OAAQ,CACjB,GAAuB,WAAnB13L,EAAOugG,QAIT,OAHAvgG,EAAO03L,QAAU,KAAO13L,EAAOugG,QAAU,IACzCvgG,EAAOugG,QAAU,QACjBvgG,EAAO2xC,MAAQ57B,EAAEi6L,QAGnB92L,EAASlZ,EAAQ,WAAYA,EAAO03L,QACpC13L,EAAO03L,OAAS,EAClB,CAIA,IAAItqL,EAAIpN,EAAOgvM,KAAK3yM,OAChBsH,EAAU3D,EAAOugG,QAChBvgG,EAAOmvM,SACVxrM,EAAUA,EAAQ3D,EAAO+uM,cAG3B,IADA,IAAI9hM,EAAUtJ,EACPyJ,KACOpN,EAAOgvM,KAAK5hM,GACdjP,OAAS8O,GAEjBqK,EAAWtX,EAAQ,wBAOvB,GAAIoN,EAAI,EAIN,OAHAkK,EAAWtX,EAAQ,0BAA4BA,EAAOugG,SACtDvgG,EAAO4vM,UAAY,KAAO5vM,EAAOugG,QAAU,SAC3CvgG,EAAO2xC,MAAQ57B,EAAE4gH,MAGnB32H,EAAOugG,QAAU58F,EAEjB,IADA,IAAIrH,EAAI0D,EAAOgvM,KAAK3yM,OACbC,KAAM8Q,GAAG,CACd,IAAIlR,EAAM8D,EAAOy9E,IAAMz9E,EAAOgvM,KAAKp+K,MACnC5wB,EAAOugG,QAAUvgG,EAAOy9E,IAAIt/E,KAC5B+a,EAASlZ,EAAQ,aAAcA,EAAOugG,SAEtC,IAAI1yF,EAAI,CAAC,EACT,IAAK,IAAIX,KAAKhR,EAAIgqE,GAChBr4D,EAAEX,GAAKhR,EAAIgqE,GAAGh5D,GAGhB,IAAIc,EAAShO,EAAOgvM,KAAKhvM,EAAOgvM,KAAK3yM,OAAS,IAAM2D,EAChDA,EAAOoM,IAAI85L,OAAShqM,EAAIgqE,KAAOl4D,EAAOk4D,IAExCppE,OAAOP,KAAKL,EAAIgqE,IAAIx8D,SAAQ,SAAU0D,GACpC,IAAIzJ,EAAIzH,EAAIgqE,GAAG94D,GACf8L,EAASlZ,EAAQ,mBAAoB,CAAE0mK,OAAQt5J,EAAG2Z,IAAKpjB,GACzD,GAEJ,CACU,IAANyJ,IAASpN,EAAOivM,YAAA,GACpBjvM,EAAOugG,QAAUvgG,EAAO4xM,YAAc5xM,EAAO2xM,WAAa,GAC1D3xM,EAAOyvM,WAAWpzM,OAAS,EAC3B2D,EAAO2xC,MAAQ57B,EAAE4gH,IACnB,CAEA,SAASnmG,EAAaxwB,GACpB,IAEIoN,EAFAzJ,EAAS3D,EAAOsyM,OAChBrlM,EAAWtJ,EAAOiG,cAElBtN,EAAS,GAEb,OAAI0D,EAAOuvM,SAAS5rM,GACX3D,EAAOuvM,SAAS5rM,GAErB3D,EAAOuvM,SAAStiM,GACXjN,EAAOuvM,SAAStiM,IAGA,OADzBtJ,EAASsJ,GACElK,OAAO,KACS,MAArBY,EAAOZ,OAAO,IAChBY,EAASA,EAAO+S,MAAM,GAEtBpa,GADA8Q,EAAMoJ,SAAS7S,EAAQ,KACV3G,SAAS,MAEtB2G,EAASA,EAAO+S,MAAM,GAEtBpa,GADA8Q,EAAMoJ,SAAS7S,EAAQ,KACV3G,SAAS,MAG1B2G,EAASA,EAAOnB,QAAQ,MAAO,IAC3BlG,EAAOsN,gBAAkBjG,GAC3B2T,EAAWtX,EAAQ,4BACZ,IAAMA,EAAOsyM,OAAS,KAGxB9wL,OAAOqgM,cAAcz0M,GAC9B,CAEA,SAASgM,EAAiBpZ,EAAQoN,GACtB,MAANA,GACFpN,EAAO2xC,MAAQ57B,EAAE+5L,UACjB9vM,EAAO+vM,iBAAmB/vM,EAAOkF,UACxB4J,EAAI5B,EAAYE,KAGzBkK,EAAWtX,EAAQ,oCACnBA,EAAO4vM,SAAWxiM,EAClBpN,EAAO2xC,MAAQ57B,EAAE4gH,KAErB,CAEA,SAAS78G,EAAQ9Z,EAAOoN,GACtB,IAAIzJ,EAAS,GAIb,OAHIyJ,EAAIpN,EAAM3D,SACZsH,EAAS3D,EAAM+C,OAAOqK,IAEjBzJ,CACT,CAtVAoS,EAAI/V,EAAI6yM,MAu3BHrxL,OAAOqgM,gBAEJ7yM,EAAqBwS,OAAOC,aAC5BtlB,EAAQyS,KAAK2Q,MACbxM,EAAgB,WAClB,IAEI/S,EACAoN,EAHAzJ,EAAW,MACXsJ,EAAY,GAGZ3Q,GAAS,EACTJ,EAASoC,UAAUjC,OACvB,IAAKH,EACH,MAAO,GAGT,IADA,IAAI2R,EAAS,KACJvR,EAAQJ,GAAQ,CACvB,IAAIgR,EAAYsB,OAAOlQ,UAAUhC,IACjC,IACGmS,SAASvB,IACVA,EAAY,GACZA,EAAY,SACZ/Q,EAAM+Q,KAAeA,EAErB,MAAMwa,WAAW,uBAAyBxa,GAExCA,GAAa,MACfD,EAAU8T,KAAK7T,IAIflN,EAAoC,QADpCkN,GAAa,QACiB,IAC9BE,EAAgBF,EAAY,KAAS,MACrCD,EAAU8T,KAAK/gB,EAAeoN,KAE5B9Q,EAAQ,IAAMJ,GAAU+Q,EAAU5Q,OAASsH,KAC7CkK,GAAUmB,EAAmB0S,MAAM,KAAMzU,GACzCA,EAAU5Q,OAAS,EAEvB,CACA,OAAOwR,CACT,EACI/Q,OAAOmC,eACTnC,OAAOmC,eAAeuiB,OAAQ,gBAAiB,CAC7C1Z,MAAOiL,EACP+qE,cAAA,EACAs9C,UAAA,IAGF55G,OAAOqgM,cAAgB9uM,EAI9B,CAviDA,CAuiDmD3F,EAAA,eAAApN,EAAAoN,EAAAzJ,GClhDpD3D,EAAOhE,QAAUM,EAEjB,IAAI2Q,EAAKtJ,EAAA,MAAA2lD,aAoBT,SAAShtD,IACP2Q,EAAG/P,KAAKoZ,KACV,CArBe3S,EAAQ,KAARA,CAENrH,EAAQ2Q,GACjB3Q,EAAOwlN,SAAWn+M,EAAQ,MAC1BrH,EAAOylN,SAAWp+M,EAAQ,MAC1BrH,EAAO0lN,OAASr+M,EAAQ,MACxBrH,EAAO2lN,UAAYt+M,EAAQ,MAC3BrH,EAAO4lN,YAAcv+M,EAAQ,MAC7BrH,EAAO6lN,SAAWx+M,EAAQ,MAC1BrH,EAAO8lN,SAAWz+M,EAAQ,MAG1BrH,EAAOk2M,OAASl2M,EAWhBA,EAAOS,UAAUslN,KAAO,SAASriN,EAAMoN,GACrC,IAAIzJ,EAAS2S,KAEb,SAASha,EAAO8Q,GACVpN,EAAKo7H,WAAA,IACOp7H,EAAK04L,MAAMtrL,IAAUzJ,EAAO8gH,OACxC9gH,EAAO8gH,OAGb,CAIA,SAASvoH,IACHyH,EAAO+uM,UAAY/uM,EAAO4uM,QAC5B5uM,EAAO4uM,QAEX,CANA5uM,EAAOyuB,GAAG,OAAQ91B,GAQlB0D,EAAKoyB,GAAG,QAASl2B,GAIZ8D,EAAKsiN,UAAcl1M,IAAA,IAAWA,EAAQ0L,MACzCnV,EAAOyuB,GAAG,MAAOllB,GACjBvJ,EAAOyuB,GAAG,QAASpkB,IAGrB,IAAIH,GAAA,EACJ,SAASX,IACHW,IACJA,GAAA,EAEA7N,EAAK8Y,MACP,CAGA,SAAS9K,IACHH,IACJA,GAAA,EAE4B,mBAAjB7N,EAAK+yB,SAAwB/yB,EAAK+yB,UAC/C,CAGA,SAAStvB,EAAQzD,GAEf,GADAmE,IACwC,IAApC8I,EAAGg8C,cAAc3yC,KAAM,SACzB,MAAMtW,CAEV,CAMA,SAASmE,IACPR,EAAOulD,eAAe,OAAQ5sD,GAC9B0D,EAAKkpD,eAAe,QAAShtD,GAE7ByH,EAAOulD,eAAe,MAAOh8C,GAC7BvJ,EAAOulD,eAAe,QAASl7C,GAE/BrK,EAAOulD,eAAe,QAASzlD,GAC/BzD,EAAKkpD,eAAe,QAASzlD,GAE7BE,EAAOulD,eAAe,MAAO/kD,GAC7BR,EAAOulD,eAAe,QAAS/kD,GAE/BnE,EAAKkpD,eAAe,QAAS/kD,EAC/B,CAUA,OA5BAR,EAAOyuB,GAAG,QAAS3uB,GACnBzD,EAAKoyB,GAAG,QAAS3uB,GAmBjBE,EAAOyuB,GAAG,MAAOjuB,GACjBR,EAAOyuB,GAAG,QAASjuB,GAEnBnE,EAAKoyB,GAAG,QAASjuB,GAEjBnE,EAAK+4C,KAAK,OAAQp1C,GAGX3D,CACT,iBAAAA,GChI6B,mBAAlBlD,OAAO8D,OAEhBZ,EAAOhE,QAAU,SAAkBgE,EAAMoN,GACnCA,IACFpN,EAAKuiN,OAASn1M,EACdpN,EAAKjD,UAAYD,OAAO8D,OAAOwM,EAAUrQ,UAAW,CAClDX,YAAa,CACX0L,MAAO9H,EACPo8D,YAAA,EACAg/D,UAAA,EACAt9C,cAAA,KAIR,EAGA99E,EAAOhE,QAAU,SAAkBgE,EAAMoN,GACvC,GAAIA,EAAW,CACbpN,EAAKuiN,OAASn1M,EACd,IAAIzJ,EAAW,WAAa,EAC5BA,EAAS5G,UAAYqQ,EAAUrQ,UAC/BiD,EAAKjD,UAAY,IAAI4G,EACrB3D,EAAKjD,UAAUX,YAAc4D,CAC/B,CACF,iBAAAA,GAAA,aCrBF,IAAIoN,EAAQ,CAAC,EAEb,SAASzJ,EAAgB3D,EAAM2D,EAASsJ,GACjCA,IACHA,EAAOO,OAWT,IAAIlR,EAEJ,SAAU0D,GAnBZ,IAAwBoN,EAAUH,EAsB9B,SAAS3Q,EAAU8Q,EAAMH,EAAM3Q,GAC7B,OAAO0D,EAAM9C,KAAKoZ,KAdtB,SAAoBtW,EAAMoN,EAAMH,GAC9B,MAAuB,iBAAZtJ,EACFA,EAEAA,EAAQ3D,EAAMoN,EAAMH,EAE/B,CANA,CAcuCG,EAAMH,EAAM3Q,KAAUga,IAC3D,CAEA,OA1B8BrJ,EAoBJjN,GApBNoN,EAoBL9Q,GApBsCS,UAAYD,OAAO8D,OAAOqM,EAAWlQ,WAAYqQ,EAASrQ,UAAUX,YAAcgR,EAAUA,EAAS07C,UAAY77C,EA0B/J3Q,CACT,CARA,CAQE2Q,GAEF3Q,EAAUS,UAAUoB,KAAO8O,EAAK9O,KAChC7B,EAAUS,UAAUo4B,KAAOn1B,EAC3BoN,EAAMpN,GAAQ1D,CAChB,CAGA,SAAS2Q,EAAMjN,EAAUoN,GACvB,GAAI5Q,MAAMC,QAAQuD,GAAW,CAC3B,IAAI2D,EAAM3D,EAAS3D,OAKnB,OAJA2D,EAAWA,EAAS6lB,KAAI,SAAU7lB,GAChC,OAAOwhB,OAAOxhB,EAChB,IAEI2D,EAAM,EACD,UAAU/D,OAAOwN,EAAO,KAAKxN,OAAOI,EAAS0W,MAAM,EAAG/S,EAAM,GAAG4K,KAAK,MAAO,SAAWvO,EAAS2D,EAAM,GAC3F,IAARA,EACF,UAAU/D,OAAOwN,EAAO,KAAKxN,OAAOI,EAAS,GAAI,QAAQJ,OAAOI,EAAS,IAEzE,MAAMJ,OAAOwN,EAAO,KAAKxN,OAAOI,EAAS,GAEpD,CACE,MAAO,MAAMJ,OAAOwN,EAAO,KAAKxN,OAAO4hB,OAAOxhB,GAElD,CA6BA2D,EAAgB,yBAAyB,SAAU3D,EAAMoN,GACvD,MAAO,cAAgBA,EAAQ,4BAA8BpN,EAAO,GACtE,GAAG2oD,WACHhlD,EAAgB,wBAAwB,SAAU3D,EAAMoN,EAAUzJ,GAEhE,IAAIrH,EA/BmBJ,EAwCnB2R,EA1BYX,EAAac,EA4B7B,GATwB,iBAAbZ,IAjCYlR,EAiCkC,OAAVkR,EAhCpCgjH,OAAyB,EAAUl0H,EAAOG,UAAYH,IAiC/DI,EAAa,cACb8Q,EAAWA,EAAS5K,QAAQ,QAAS,KAErClG,EAAa,UAhCjB,SAAkB0D,EAAKoN,EAAQzJ,GAK7B,gBAJIA,GAA0BA,EAAW3D,EAAI3D,UAC3CsH,EAAW3D,EAAI3D,QAGV2D,EAAImO,UAAUxK,EAAWyJ,EAAO/Q,OAAQsH,KAAcyJ,CAC/D,CANA,CAqCepN,EAAM,aAEjB6N,EAAM,OAAOjO,OAAOI,EAAM,KAAKJ,OAAOtD,EAAY,KAAKsD,OAAOqN,EAAMG,EAAU,aACzE,CACL,IAAI3J,GA/Be,iBAAVuK,IACTA,EAAQ,GAGNA,EA2BwB,GAhCZd,EAgCMlN,GA3BU3D,SAGS,IAAhC6Q,EAAIzE,QAwBe,IAxBCuF,GAwBmB,WAAb,YACjCH,EAAM,QAASjO,OAAOI,EAAM,MAAOJ,OAAO6D,EAAM,KAAK7D,OAAOtD,EAAY,KAAKsD,OAAOqN,EAAMG,EAAU,QACtG,CAGA,OADAS,EAAO,mBAAmBjO,cAAc+D,EAE1C,GAAGglD,WACHhlD,EAAgB,4BAA6B,2BAC7CA,EAAgB,8BAA8B,SAAU3D,GACtD,MAAO,OAASA,EAAO,4BACzB,IACA2D,EAAgB,6BAA8B,mBAC9CA,EAAgB,wBAAwB,SAAU3D,GAChD,MAAO,eAAiBA,EAAO,+BACjC,IACA2D,EAAgB,wBAAyB,kCACzCA,EAAgB,yBAA0B,6BAC1CA,EAAgB,6BAA8B,mBAC9CA,EAAgB,yBAA0B,sCAAuCglD,WACjFhlD,EAAgB,wBAAwB,SAAU3D,GAChD,MAAO,qBAAuBA,CAChC,GAAG2oD,WACHhlD,EAAgB,qCAAsC,oCACtD3D,EAAOhE,QAAQkI,EAAQkJ,CAAA,gBAAApN,EAAAoN,EAAAzJ,GAAA,aCnGvB,IAAIsJ,EAAanQ,OAAOP,MAAQ,SAAUyD,GACxC,IAAIoN,EAAO,GAEX,IAAK,IAAIzJ,KAAO3D,EACdoN,EAAK2T,KAAKpd,GAGZ,OAAOyJ,CACT,EAIApN,EAAOhE,QAAUyH,EAEjB,IAAInH,EAAWqH,EAAQ,MAEnBzH,EAAWyH,EAAQ,MAEvBA,EAAQ,KAARA,CAAoBF,EAAQnH,GAM1B,IAFA,IAAIuR,EAAOZ,EAAW/Q,EAASa,WAEtBmQ,EAAI,EAAGA,EAAIW,EAAKxR,OAAQ6Q,IAAK,CACpC,IAAIc,EAASH,EAAKX,GACbzJ,EAAO1G,UAAUiR,KAASvK,EAAO1G,UAAUiR,GAAU9R,EAASa,UAAUiR,GAC/E,CAGF,SAASvK,EAAOzD,GACd,KAAMsW,gBAAgB7S,GAAS,OAAO,IAAIA,EAAOzD,GACjD1D,EAASY,KAAKoZ,KAAMtW,GACpB9D,EAASgB,KAAKoZ,KAAMtW,GACpBsW,KAAKksM,eAAA,EAEDxiN,KAAA,IACEA,EAAQ0yM,WAAoBp8L,KAAKo8L,UAAA,IAAW,IAC5C1yM,EAAQo7H,WAAoB9kH,KAAK8kH,UAAA,IAAW,IAE5Cp7H,EAAQwiN,gBACVlsM,KAAKksM,eAAA,EACLlsM,KAAKoyC,KAAK,MAAOvkD,IAGvB,CA8BA,SAASA,IAEHmS,KAAKmsM,eAAetwK,OAGxBihE,QAAQwvF,SAASv/L,EAASiT,KAC5B,CAEA,SAASjT,EAAQrD,GACfA,EAAK8Y,KACP,CAtCAhc,OAAOmC,eAAewE,EAAO1G,UAAW,wBAAyB,CAI/Dq/D,YAAA,EACAhlD,IAAK,WACH,OAAOd,KAAKmsM,eAAex2K,aAC7B,IAEFnvC,OAAOmC,eAAewE,EAAO1G,UAAW,iBAAkB,CAIxDq/D,YAAA,EACAhlD,IAAK,WACH,OAAOd,KAAKmsM,gBAAkBnsM,KAAKmsM,eAAejlE,WACpD,IAEF1gJ,OAAOmC,eAAewE,EAAO1G,UAAW,iBAAkB,CAIxDq/D,YAAA,EACAhlD,IAAK,WACH,OAAOd,KAAKmsM,eAAepmN,MAC7B,IAeFS,OAAOmC,eAAewE,EAAO1G,UAAW,YAAa,CAInDq/D,YAAA,EACAhlD,IAAK,WACH,gBAAId,KAAKosM,qBAAA,IAAgCpsM,KAAKmsM,gBAIvCnsM,KAAKosM,eAAeC,WAAarsM,KAAKmsM,eAAeE,SAC9D,EACA9oM,IAAK,SAAa7Z,QAAA,IAGZsW,KAAKosM,qBAAA,IAAgCpsM,KAAKmsM,iBAM9CnsM,KAAKosM,eAAeC,UAAY3iN,EAChCsW,KAAKmsM,eAAeE,UAAY3iN,EAClC,mBAAAA,EAAAoN,EAAAzJ,GAAA,aChHF3D,EAAOhE,QAAUM,EAEjB,IAAI2Q,EAAYtJ,EAAQ,MAIxB,SAASrH,EAAY0D,GACnB,KAAMsW,gBAAgBha,GAAc,OAAO,IAAIA,EAAY0D,GAC3DiN,EAAU/P,KAAKoZ,KAAMtW,EACvB,CALA2D,EAAQ,KAARA,CAAoBrH,EAAa2Q,GAOjC3Q,EAAYS,UAAU6lN,WAAa,SAAU5iN,EAAOoN,EAAUzJ,GAC5DA,EAAG,KAAM3D,EACX,iBAAAA,EAAAoN,EAAAzJ,GAAA,aCbA,IAAIsJ,EAHJjN,EAAOhE,QAAU+W,EAMjBA,EAAS8vM,cAAgB1mN,EAGhBwH,EAAA,MAAA2lD,aAAT,IA8BIhtD,EA5BAJ,EAAkB,SAAyB8D,EAASoN,GACtD,OAAOpN,EAAQgpD,UAAU57C,GAAM/Q,MACjC,EAMIwR,EAASlK,EAAQ,MAIjBuJ,EAASvJ,EAAA,MAAA00L,OAETrqL,EAAgBrK,EAAAS,EAAOuS,YAAc,WAAa,EAYlDlT,EAAYE,EAAQ,KAKtBrH,EADEmH,GAAaA,EAAUq/M,SACjBr/M,EAAUq/M,SAAS,UAEnB,WAAkB,EAK5B,IAcI3+M,EACAd,EACAgB,EAhBAD,EAAaT,EAAQ,MAErBW,EAAcX,EAAQ,MAGtBG,EADWH,EAAQ,MACSo/M,iBAE5Br/M,EAAiBC,EAAA,MAAAO,EACjB4G,EAAuBpH,EAAes/M,qBACtCt0M,EAA4BhL,EAAeu/M,0BAC3C59L,EAA6B3hB,EAAew/M,2BAC5C9sM,EAAqC1S,EAAey/M,mCAOxDx/M,EAAQ,KAARA,CAAoBoP,EAAUlF,GAE9B,IAAIiB,EAAiBxK,EAAY8+M,eAC7Bp0M,EAAe,CAAC,QAAS,QAAS,UAAW,QAAS,UAa1D,SAAS7S,EAAc6D,EAASoN,EAAQ9Q,GACtC2Q,EAASA,GAAUtJ,EAAQ,MAC3B3D,EAAUA,GAAW,CAAC,EAME,kBAAb1D,IAAwBA,EAAW8Q,aAAkBH,GAGhEqJ,KAAK+sM,aAAerjN,EAAQqjN,WACxB/mN,IAAUga,KAAK+sM,WAAa/sM,KAAK+sM,cAAgBrjN,EAAQsjN,oBAG7DhtM,KAAK21B,cAAgBnoC,EAAiBwS,KAAMtW,EAAS,wBAAyB1D,GAI9Ega,KAAK+K,OAAS,IAAIjd,EAClBkS,KAAKja,OAAS,EACdia,KAAKitM,MAAQ,KACbjtM,KAAKktM,WAAa,EAClBltM,KAAKmtM,QAAU,KACfntM,KAAK67B,OAAA,EACL77B,KAAKotM,YAAA,EACLptM,KAAKqtM,SAAA,EAKLrtM,KAAKstM,MAAA,EAGLttM,KAAKutM,cAAA,EACLvtM,KAAKwtM,iBAAA,EACLxtM,KAAKytM,mBAAA,EACLztM,KAAK0tM,iBAAA,EACL1tM,KAAK8tB,QAAA,EAEL9tB,KAAK2tM,WAAA,IAAYjkN,EAAQikN,UAEzB3tM,KAAK4tM,cAAgBlkN,EAAQkkN,YAE7B5tM,KAAKqsM,WAAA,EAILrsM,KAAK6tM,gBAAkBnkN,EAAQmkN,iBAAmB,OAElD7tM,KAAK8tM,WAAa,EAElB9tM,KAAK+tM,aAAA,EACL/tM,KAAKynD,QAAU,KACfznD,KAAKqjG,SAAW,KAEZ35G,EAAQ25G,WACLx1G,IAAeA,EAAgBR,EAAA,MAAAuJ,GACpCoJ,KAAKynD,QAAU,IAAI55D,EAAcnE,EAAQ25G,UACzCrjG,KAAKqjG,SAAW35G,EAAQ25G,SAE5B,CAEA,SAAS5mG,EAAS/S,GAEhB,GADAiN,EAASA,GAAUtJ,EAAQ,QACrB2S,gBAAgBvD,GAAW,OAAO,IAAIA,EAAS/S,GAGrD,IAAIoN,EAAWkJ,gBAAgBrJ,EAC/BqJ,KAAKosM,eAAiB,IAAIvmN,EAAc6D,EAASsW,KAAMlJ,GAEvDkJ,KAAKo8L,UAAA,EAED1yM,IAC0B,mBAAjBA,EAAQuJ,OAAqB+M,KAAKguM,MAAQtkN,EAAQuJ,MAC9B,mBAApBvJ,EAAQ+yB,UAAwBzc,KAAKiuM,SAAWvkN,EAAQ+yB,UAGrEllB,EAAO3Q,KAAKoZ,KACd,CAgEA,SAASP,EAAiB/V,EAAQoN,EAAOzJ,EAAUsJ,EAAY/Q,GAC7DI,EAAM,mBAAoB8Q,GAC1B,IAMMS,EANFpK,EAAQzD,EAAO0iN,eAEnB,GAAc,OAAVt1M,EACF3J,EAAMkgN,SAAA,EAyOV,SAAoB3jN,EAAQoN,GAE1B,GADA9Q,EAAM,eACF8Q,EAAM+kC,MAAV,CAEA,GAAI/kC,EAAM2wD,QAAS,CACjB,IAAIp6D,EAAQyJ,EAAM2wD,QAAQjlD,MAEtBnV,GAASA,EAAMtH,SACjB+Q,EAAMiU,OAAON,KAAKpd,GAClByJ,EAAM/Q,QAAU+Q,EAAMi2M,WAAa,EAAI1/M,EAAMtH,OAEjD,CAEA+Q,EAAM+kC,OAAA,EAEF/kC,EAAMw2M,KAIRztM,EAAanW,IAGboN,EAAMy2M,cAAA,EAEDz2M,EAAM02M,kBACT12M,EAAM02M,iBAAA,EACN7tM,EAAcjW,IAxBK,CA2BzB,CA7BA,CAxOeA,EAAQyD,QAKnB,GAFKvH,IAAgB2R,EAmDzB,SAAsB7N,EAAOoN,GAC3B,IAAIzJ,EAhQiBsJ,EAsQrB,OAtQqBA,EAkQFG,EAjQZF,EAAOsmG,SAASvmG,IAAQA,aAAee,GAiQA,iBAAVZ,QAAA,IAAsBA,GAAwBpN,EAAMqjN,aACtF1/M,EAAK,IAAImH,EAAqB,QAAS,CAAC,SAAU,SAAU,cAAesC,IAGtEzJ,CACT,CARA,CAnD2CF,EAAO2J,IAE1CS,EACFiB,EAAe9O,EAAQ6N,QAClB,GAAIpK,EAAM4/M,YAAcj2M,GAASA,EAAM/Q,OAAS,EAKrD,GAJqB,iBAAV+Q,GAAuB3J,EAAM4/M,YAAcvmN,OAAOuC,eAAe+N,KAAWF,EAAOnQ,YAC5FqQ,EAtNR,SAA6BpN,GAC3B,OAAOkN,EAAO0S,KAAK5f,EACrB,CAFA,CAsNoCoN,IAG1BH,EACExJ,EAAMigN,WAAY50M,EAAe9O,EAAQ,IAAIoW,GAA2CV,EAAS1V,EAAQyD,EAAO2J,GAAA,QAC/G,GAAI3J,EAAM0uC,MACfrjC,EAAe9O,EAAQ,IAAI0O,OACtB,IAAIjL,EAAMk/M,UACf,OAAO,EAEPl/M,EAAMkgN,SAAA,EAEFlgN,EAAMs6D,UAAYp6D,GACpByJ,EAAQ3J,EAAMs6D,QAAQ26H,MAAMtrL,GACxB3J,EAAM4/M,YAA+B,IAAjBj2M,EAAM/Q,OAAcqZ,EAAS1V,EAAQyD,EAAO2J,GAAA,GAAmB6L,EAAcjZ,EAAQyD,IAE7GiS,EAAS1V,EAAQyD,EAAO2J,GAAA,EAE5B,MACUH,IACVxJ,EAAMkgN,SAAA,EACN1qM,EAAcjZ,EAAQyD,IAO1B,OAAQA,EAAM0uC,QAAU1uC,EAAMpH,OAASoH,EAAMwoC,eAAkC,IAAjBxoC,EAAMpH,OACtE,CAEA,SAASqZ,EAAS1V,EAAQoN,EAAOzJ,EAAOsJ,GAClCG,EAAMq2M,SAA4B,IAAjBr2M,EAAM/Q,SAAiB+Q,EAAMw2M,MAChDx2M,EAAMg3M,WAAa,EACnBpkN,EAAO+4C,KAAK,OAAQp1C,KAGpByJ,EAAM/Q,QAAU+Q,EAAMi2M,WAAa,EAAI1/M,EAAMtH,OACzC4Q,EAAYG,EAAMiU,OAAO8O,QAAQxsB,GAAYyJ,EAAMiU,OAAON,KAAKpd,GAC/DyJ,EAAMy2M,cAAc1tM,EAAanW,IAGvCiZ,EAAcjZ,EAAQoN,EACxB,CAxHAtQ,OAAOmC,eAAe8T,EAAShW,UAAW,YAAa,CAIrDq/D,YAAA,EACAhlD,IAAK,WACH,gBAAId,KAAKosM,gBAIFpsM,KAAKosM,eAAeC,SAC7B,EACA9oM,IAAK,SAAa7Z,GAGXsW,KAAKosM,iBAMVpsM,KAAKosM,eAAeC,UAAY3iN,EAClC,IAEF+S,EAAShW,UAAUg2B,QAAUzuB,EAAYyuB,QACzChgB,EAAShW,UAAUynN,WAAalgN,EAAYmgN,UAE5C1xM,EAAShW,UAAUwnN,SAAW,SAAUvkN,EAAKoN,GAC3CA,EAAGpN,EACL,EAMA+S,EAAShW,UAAUgkB,KAAO,SAAU/gB,EAAOoN,GACzC,IACIzJ,EADAsJ,EAAQqJ,KAAKosM,eAkBjB,OAfKz1M,EAAMo2M,WAYT1/M,GAAA,EAXqB,iBAAV3D,KACToN,EAAWA,GAAYH,EAAMk3M,mBAEZl3M,EAAM0sG,WACrB35G,EAAQkN,EAAO0S,KAAK5f,EAAOoN,GAC3BA,EAAW,IAGbzJ,GAAA,GAMGoS,EAAiBO,KAAMtW,EAAOoN,GAAA,EAAiBzJ,EACxD,EAGAoP,EAAShW,UAAUozB,QAAU,SAAUnwB,GACrC,OAAO+V,EAAiBO,KAAMtW,EAAO,MAAM,KAC7C,EAwEA+S,EAAShW,UAAUq4I,SAAW,WAC5B,OAAO,IAAA9+H,KAAKosM,eAAee,OAC7B,EAGA1wM,EAAShW,UAAU2nN,YAAc,SAAU1kN,GACpCmE,IAAeA,EAAgBR,EAAA,MAAAuJ,GACpC,IAAIE,EAAU,IAAIjJ,EAAcnE,GAChCsW,KAAKosM,eAAe3kJ,QAAU3wD,EAE9BkJ,KAAKosM,eAAe/oG,SAAWrjG,KAAKosM,eAAe3kJ,QAAQ47C,SAK3D,IAHA,IAAI1sG,EAAIqJ,KAAKosM,eAAerhM,OAAOk9F,KAC/BjiH,EAAU,GAED,OAAN2Q,GACL3Q,GAAW8Q,EAAQsrL,MAAMzrL,EAAE7G,MAC3B6G,EAAIA,EAAEowF,KAOR,OAJA/mF,KAAKosM,eAAerhM,OAAOy2C,QAEX,KAAZx7D,GAAgBga,KAAKosM,eAAerhM,OAAON,KAAKzkB,GACpDga,KAAKosM,eAAermN,OAASC,EAAQD,OAC9Bia,IACT,EAGA,IAAIJ,EAAU,WAuBd,SAASgD,EAAclZ,EAAGoN,GACxB,OAAIpN,GAAK,GAAsB,IAAjBoN,EAAM/Q,QAAgB+Q,EAAM+kC,MAAc,EACpD/kC,EAAMi2M,WAAmB,EAEzBrjN,GAAMA,EAEJoN,EAAMq2M,SAAWr2M,EAAM/Q,OAAe+Q,EAAMiU,OAAOk9F,KAAKn4G,KAAK/J,OAAmB+Q,EAAM/Q,QAIxF2D,EAAIoN,EAAM6+B,gBAAe7+B,EAAM6+B,cA/BrC,SAAiCjsC,GAgB/B,OAfIA,GAAKkW,EAEPlW,EAAIkW,GAIJlW,IACAA,GAAKA,IAAM,EACXA,GAAKA,IAAM,EACXA,GAAKA,IAAM,EACXA,GAAKA,IAAM,EACXA,GAAKA,IAAM,GACXA,KAGKA,CACT,CAjBA,CA+B6EA,IACvEA,GAAKoN,EAAM/Q,OAAe2D,EAEzBoN,EAAM+kC,MAKJ/kC,EAAM/Q,QAJX+Q,EAAMy2M,cAAA,EACC,GAIX,CAoIA,SAAS1tM,EAAanW,GACpB,IAAIoN,EAAQpN,EAAO0iN,eACnBpmN,EAAM,eAAgB8Q,EAAMy2M,aAAcz2M,EAAM02M,iBAChD12M,EAAMy2M,cAAA,EAEDz2M,EAAM02M,kBACTxnN,EAAM,eAAgB8Q,EAAMq2M,SAC5Br2M,EAAM02M,iBAAA,EACN1wG,QAAQwvF,SAAS3sL,EAAejW,GAEpC,CAEA,SAASiW,EAAcjW,GACrB,IAAIoN,EAAQpN,EAAO0iN,eACnBpmN,EAAM,gBAAiB8Q,EAAMu1M,UAAWv1M,EAAM/Q,OAAQ+Q,EAAM+kC,OAEvD/kC,EAAMu1M,YAAcv1M,EAAM/Q,SAAU+Q,EAAM+kC,QAC7CnyC,EAAO+4C,KAAK,YACZ3rC,EAAM02M,iBAAA,GASR12M,EAAMy2M,cAAgBz2M,EAAMq2M,UAAYr2M,EAAM+kC,OAAS/kC,EAAM/Q,QAAU+Q,EAAM6+B,cAC7EphC,EAAK7K,EACP,CAQA,SAASiZ,EAAcjZ,EAAQoN,GACxBA,EAAMi3M,cACTj3M,EAAMi3M,aAAA,EACNjxG,QAAQwvF,SAASvqL,EAAgBrY,EAAQoN,GAE7C,CAEA,SAASiL,EAAerY,EAAQoN,GAwB9B,MAAQA,EAAMu2M,UAAYv2M,EAAM+kC,QAAU/kC,EAAM/Q,OAAS+Q,EAAM6+B,eAAiB7+B,EAAMq2M,SAA4B,IAAjBr2M,EAAM/Q,SAAe,CACpH,IAAIsH,EAAMyJ,EAAM/Q,OAGhB,GAFAC,EAAM,wBACN0D,EAAOuJ,KAAK,GACR5F,IAAQyJ,EAAM/Q,OAChB,KACJ,CAEA+Q,EAAMi3M,aAAA,CACR,CA4QA,SAAS/sM,EAAwBtX,GAC/B,IAAIoN,EAAQpN,EAAK0iN,eACjBt1M,EAAM22M,kBAAoB/jN,EAAKipD,cAAc,YAAc,EAEvD77C,EAAM42M,kBAAoB52M,EAAMg3B,OAGlCh3B,EAAMq2M,SAAA,EACGzjN,EAAKipD,cAAc,QAAU,GACtCjpD,EAAKuyM,QAET,CAEA,SAAS9/L,EAAiBzS,GACxB1D,EAAM,4BACN0D,EAAKuJ,KAAK,EACZ,CA2BA,SAASgO,EAAQvX,EAAQoN,GACvB9Q,EAAM,SAAU8Q,EAAMu2M,SAEjBv2M,EAAMu2M,SACT3jN,EAAOuJ,KAAK,GAGd6D,EAAM42M,iBAAA,EACNhkN,EAAO+4C,KAAK,UACZluC,EAAK7K,GACDoN,EAAMq2M,UAAYr2M,EAAMu2M,SAAS3jN,EAAOuJ,KAAK,EACnD,CAeA,SAASsB,EAAK7K,GACZ,IAAIoN,EAAQpN,EAAO0iN,eAGnB,IAFApmN,EAAM,OAAQ8Q,EAAMq2M,SAEbr2M,EAAMq2M,SAA6B,OAAlBzjN,EAAOuJ,SAGjC,CAyHA,SAASjG,EAAStD,EAAGoN,GAEnB,OAAqB,IAAjBA,EAAM/Q,OAAqB,MAE3B+Q,EAAMi2M,WAAY1/M,EAAMyJ,EAAMiU,OAAOkF,SAAkBvmB,GAAKA,GAAKoN,EAAM/Q,QAEtDsH,EAAfyJ,EAAM2wD,QAAe3wD,EAAMiU,OAAO9S,KAAK,IAAqC,IAAxBnB,EAAMiU,OAAOhlB,OAAoB+Q,EAAMiU,OAAOxI,QAAmBzL,EAAMiU,OAAOzhB,OAAOwN,EAAM/Q,QACnJ+Q,EAAMiU,OAAOy2C,SAGbn0D,EAAMyJ,EAAMiU,OAAOsjM,QAAQ3kN,EAAGoN,EAAM2wD,SAE/Bp6D,GATP,IAAIA,CAUN,CAEA,SAASwV,EAAYnZ,GACnB,IAAIoN,EAAQpN,EAAO0iN,eACnBpmN,EAAM,cAAe8Q,EAAMs2M,YAEtBt2M,EAAMs2M,aACTt2M,EAAM+kC,OAAA,EACNihE,QAAQwvF,SAASpyK,EAAepjB,EAAOpN,GAE3C,CAEA,SAASwwB,EAAcxwB,EAAOoN,GAG5B,GAFA9Q,EAAM,gBAAiB0D,EAAM0jN,WAAY1jN,EAAM3D,SAE1C2D,EAAM0jN,YAA+B,IAAjB1jN,EAAM3D,SAC7B2D,EAAM0jN,YAAA,EACNt2M,EAAOslM,UAAA,EACPtlM,EAAO2rC,KAAK,OAER/4C,EAAMkkN,aAAa,CAGrB,IAAIvgN,EAASyJ,EAAOq1M,iBAEf9+M,GAAUA,EAAOugN,aAAevgN,EAAOw+M,WAC1C/0M,EAAO2lB,SAEX,CAEJ,CAYA,SAAS3Z,EAAQpZ,EAAIoN,GACnB,IAAK,IAAIzJ,EAAI,EAAGsJ,EAAIjN,EAAG3D,OAAQsH,EAAIsJ,EAAGtJ,IACpC,GAAI3D,EAAG2D,KAAOyJ,EAAG,OAAOzJ,EAG1B,OAAQ,CACV,CA5tBAoP,EAAShW,UAAUwM,KAAO,SAAUvJ,GAClC1D,EAAM,OAAQ0D,GACdA,EAAIwW,SAASxW,EAAG,IAChB,IAAIoN,EAAQkJ,KAAKosM,eACb/+M,EAAQ3D,EAKZ,GAJU,IAANA,IAASoN,EAAM02M,iBAAA,GAIT,IAAN9jN,GAAWoN,EAAMy2M,gBAA0C,IAAxBz2M,EAAM6+B,cAAsB7+B,EAAM/Q,QAAU+Q,EAAM6+B,cAAgB7+B,EAAM/Q,OAAS,IAAM+Q,EAAM+kC,OAGlI,OAFA71C,EAAM,qBAAsB8Q,EAAM/Q,OAAQ+Q,EAAM+kC,OAC3B,IAAjB/kC,EAAM/Q,QAAgB+Q,EAAM+kC,MAAOh5B,EAAY7C,MAAWH,EAAaG,MACpE,KAKT,GAAU,KAFVtW,EAAIkZ,EAAclZ,EAAGoN,KAENA,EAAM+kC,MAEnB,OADqB,IAAjB/kC,EAAM/Q,QAAc8c,EAAY7C,MAC7B,KAyBT,IA4BIrJ,EA5BA/Q,EAASkR,EAAMy2M,aAgDnB,OA/CAvnN,EAAM,gBAAiBJ,IAEF,IAAjBkR,EAAM/Q,QAAgB+Q,EAAM/Q,OAAS2D,EAAIoN,EAAM6+B,gBAEjD3vC,EAAM,6BADNJ,GAAA,GAMEkR,EAAM+kC,OAAS/kC,EAAMu2M,QAEvBrnN,EAAM,mBADNJ,GAAA,GAESA,IACTI,EAAM,WACN8Q,EAAMu2M,SAAA,EACNv2M,EAAMw2M,MAAA,EAEe,IAAjBx2M,EAAM/Q,SAAc+Q,EAAMy2M,cAAA,GAE9BvtM,KAAKguM,MAAMl3M,EAAM6+B,eAEjB7+B,EAAMw2M,MAAA,EAGDx2M,EAAMu2M,UAAS3jN,EAAIkZ,EAAcvV,EAAOyJ,KAMnC,QAFDH,EAAPjN,EAAI,EAASsD,EAAStD,EAAGoN,GAAkB,OAG7CA,EAAMy2M,aAAez2M,EAAM/Q,QAAU+Q,EAAM6+B,cAC3CjsC,EAAI,IAEJoN,EAAM/Q,QAAU2D,EAChBoN,EAAMg3M,WAAa,GAGA,IAAjBh3M,EAAM/Q,SAGH+Q,EAAM+kC,QAAO/kC,EAAMy2M,cAAA,GAEpBlgN,IAAU3D,GAAKoN,EAAM+kC,OAAOh5B,EAAY7C,OAGlC,OAARrJ,GAAcqJ,KAAKyiC,KAAK,OAAQ9rC,GAC7BA,CACT,EAuHA8F,EAAShW,UAAUunN,MAAQ,SAAUtkN,GACnC8O,EAAewH,KAAM,IAAI+O,EAA2B,WACtD,EAEAtS,EAAShW,UAAUslN,KAAO,SAAUriN,EAAMoN,GACxC,IAAIzJ,EAAM2S,KACNrJ,EAAQqJ,KAAKosM,eAEjB,OAAQz1M,EAAMu2M,YACZ,KAAK,EACHv2M,EAAMs2M,MAAQvjN,EACd,MAEF,KAAK,EACHiN,EAAMs2M,MAAQ,CAACt2M,EAAMs2M,MAAOvjN,GAC5B,MAEF,QACEiN,EAAMs2M,MAAMxiM,KAAK/gB,GAIrBiN,EAAMu2M,YAAc,EACpBlnN,EAAM,wBAAyB2Q,EAAMu2M,WAAYp2M,GACjD,IACIS,EADUT,IAAA,IAAYA,EAAS0L,KAAkB9Y,IAASozG,QAAQwxG,QAAU5kN,IAASozG,QAAQyxG,OACrEvgN,EAAR4I,EAepB,SAASA,IACP5Q,EAAM,SACN0D,EAAK8Y,KACP,CAjBI7L,EAAMy2M,WAAYtwG,QAAQwvF,SAAS/0L,GAAYlK,EAAI+kD,KAAK,MAAO76C,GACnE7N,EAAKoyB,GAAG,UAER,SAAShlB,EAASlR,EAAU2R,GAC1BvR,EAAM,YAEFJ,IAAayH,GACXkK,IAAA,IAAcA,EAAWi3M,aAC3Bj3M,EAAWi3M,YAAA,EAoBfxoN,EAAM,WAEN0D,EAAKkpD,eAAe,QAAS7kD,GAC7BrE,EAAKkpD,eAAe,SAAU9kD,GAC9BpE,EAAKkpD,eAAe,QAASl7C,GAC7BhO,EAAKkpD,eAAe,QAAS7lD,GAC7BrD,EAAKkpD,eAAe,SAAU97C,GAC9BzJ,EAAIulD,eAAe,MAAOh8C,GAC1BvJ,EAAIulD,eAAe,MAAO5kD,GAC1BX,EAAIulD,eAAe,OAAQ/kD,GAC3BV,GAAA,GAMIwJ,EAAMm3M,YAAgBpkN,EAAKyiN,iBAAkBziN,EAAKyiN,eAAesC,WAAY/2M,IAhCnF,IAWA,IAAIA,EAwFN,SAAqBhO,GACnB,OAAO,WACL,IAAIoN,EAAQpN,EAAI0iN,eAChBpmN,EAAM,cAAe8Q,EAAMg3M,YACvBh3M,EAAMg3M,YAAYh3M,EAAMg3M,aAEH,IAArBh3M,EAAMg3M,YAAoBloN,EAAgB8D,EAAK,UACjDoN,EAAMq2M,SAAA,EACN54M,EAAK7K,GAET,CACF,CAXA,CAxF4B2D,GAC1B3D,EAAKoyB,GAAG,QAASpkB,GACjB,IAAIvK,GAAA,EAwBJ,SAASU,EAAOiJ,GACd9Q,EAAM,UACN,IAAIJ,EAAM8D,EAAK04L,MAAMtrL,GACrB9Q,EAAM,aAAcJ,IAAA,IAEhBA,KAKwB,IAArB+Q,EAAMu2M,YAAoBv2M,EAAMs2M,QAAUvjN,GAAQiN,EAAMu2M,WAAa,IAAqC,IAAhCpqM,EAAQnM,EAAMs2M,MAAOvjN,MAAkByD,IACpHnH,EAAM,8BAA+B2Q,EAAMm3M,YAC3Cn3M,EAAMm3M,cAGRzgN,EAAI8gH,QAER,CAIA,SAASphH,EAAQ+J,GACf9Q,EAAM,UAAW8Q,GACjB9I,IACAtE,EAAKkpD,eAAe,QAAS7lD,GACU,IAAnCnH,EAAgB8D,EAAM,UAAgB8O,EAAe9O,EAAMoN,EACjE,CAKA,SAAS/I,IACPrE,EAAKkpD,eAAe,SAAU9kD,GAC9BE,GACF,CAIA,SAASF,IACP9H,EAAM,YACN0D,EAAKkpD,eAAe,QAAS7kD,GAC7BC,GACF,CAIA,SAASA,IACPhI,EAAM,UACNqH,EAAIqhN,OAAOhlN,EACb,CAUA,OA7DA2D,EAAIyuB,GAAG,OAAQjuB,GAtkBjB,SAAyBnE,EAASoN,EAAOzJ,GAGvC,GAAuC,mBAA5B3D,EAAQ4kM,gBAAgC,OAAO5kM,EAAQ4kM,gBAAgBx3L,EAAOzJ,GAKpF3D,EAAQ4oD,SAAY5oD,EAAQ4oD,QAAQx7C,GAAuC5Q,MAAMC,QAAQuD,EAAQ4oD,QAAQx7C,IAASpN,EAAQ4oD,QAAQx7C,GAAO+iB,QAAQxsB,GAAS3D,EAAQ4oD,QAAQx7C,GAAS,CAACzJ,EAAI3D,EAAQ4oD,QAAQx7C,IAA5JpN,EAAQoyB,GAAGhlB,EAAOzJ,EACrE,CATA,CAqmBkB3D,EAAM,QAASqD,GAO/BrD,EAAK0oD,KAAK,QAASrkD,GAQnBrE,EAAK0oD,KAAK,SAAUtkD,GAQpBpE,EAAK+4C,KAAK,OAAQp1C,GAEbsJ,EAAMw2M,UACTnnN,EAAM,eACNqH,EAAI4uM,UAGCvyM,CACT,EAeA+S,EAAShW,UAAUioN,OAAS,SAAUhlN,GACpC,IAAIoN,EAAQkJ,KAAKosM,eACb/+M,EAAa,CACfmhN,YAAA,GAGF,GAAyB,IAArB13M,EAAMo2M,WAAkB,OAAOltM,KAEnC,GAAyB,IAArBlJ,EAAMo2M,WAER,OAAIxjN,GAAQA,IAASoN,EAAMm2M,QACtBvjN,IAAMA,EAAOoN,EAAMm2M,OAExBn2M,EAAMm2M,MAAQ,KACdn2M,EAAMo2M,WAAa,EACnBp2M,EAAMq2M,SAAA,EACFzjN,GAAMA,EAAK+4C,KAAK,SAAUziC,KAAM3S,IANK2S,KAW3C,IAAKtW,EAAM,CAET,IAAIiN,EAAQG,EAAMm2M,MACdjnN,EAAM8Q,EAAMo2M,WAChBp2M,EAAMm2M,MAAQ,KACdn2M,EAAMo2M,WAAa,EACnBp2M,EAAMq2M,SAAA,EAEN,IAAK,IAAIvnN,EAAI,EAAGA,EAAII,EAAKJ,IACvB+Q,EAAM/Q,GAAG68C,KAAK,SAAUziC,KAAM,CAC5BwuM,YAAA,IAIJ,OAAOxuM,IACT,CAGA,IAAIzI,EAAQuL,EAAQhM,EAAMm2M,MAAOvjN,GACjC,OAAe,IAAX6N,IACJT,EAAMm2M,MAAM/7L,OAAO3Z,EAAO,GAC1BT,EAAMo2M,YAAc,EACK,IAArBp2M,EAAMo2M,aAAkBp2M,EAAMm2M,MAAQn2M,EAAMm2M,MAAM,IACtDvjN,EAAK+4C,KAAK,SAAUziC,KAAM3S,IAJD2S,IAM3B,EAIAvD,EAAShW,UAAUq1B,GAAK,SAAUpyB,EAAIoN,GACpC,IAAIzJ,EAAMkK,EAAO9Q,UAAUq1B,GAAGl1B,KAAKoZ,KAAMtW,EAAIoN,GACzCH,EAAQqJ,KAAKosM,eAuBjB,MArBW,SAAP1iN,GAGFiN,EAAM82M,kBAAoBztM,KAAK2yC,cAAc,YAAc,OAEvDh8C,EAAMw2M,SAAmBntM,KAAKi8L,UAClB,aAAPvyM,IACJiN,EAAMy2M,YAAez2M,EAAM82M,oBAC9B92M,EAAM82M,kBAAoB92M,EAAM42M,cAAA,EAChC52M,EAAMw2M,SAAA,EACNx2M,EAAM62M,iBAAA,EACNxnN,EAAM,cAAe2Q,EAAM5Q,OAAQ4Q,EAAM02M,SAErC12M,EAAM5Q,OACR8Z,EAAaG,MACHrJ,EAAM02M,SAChBvwG,QAAQwvF,SAASnwL,EAAkB6D,QAKlC3S,CACT,EAEAoP,EAAShW,UAAUqsD,YAAcr2C,EAAShW,UAAUq1B,GAEpDrf,EAAShW,UAAUmsD,eAAiB,SAAUlpD,EAAIoN,GAChD,IAAIzJ,EAAMkK,EAAO9Q,UAAUmsD,eAAehsD,KAAKoZ,KAAMtW,EAAIoN,GAYzD,MAVW,aAAPpN,GAOFozG,QAAQwvF,SAAStrL,EAAyBhB,MAGrC3S,CACT,EAEAoP,EAAShW,UAAUosD,mBAAqB,SAAUnpD,GAChD,IAAIoN,EAAMS,EAAO9Q,UAAUosD,mBAAmBznC,MAAMpL,KAAMhY,WAY1D,MAVW,aAAP0B,QAAA,IAAqBA,GAOvBozG,QAAQwvF,SAAStrL,EAAyBhB,MAGrClJ,CACT,EAsBA2F,EAAShW,UAAUw1M,OAAS,WAC1B,IAAIvyM,EAAQsW,KAAKosM,eAYjB,OAVK1iN,EAAMyjN,UACTnnN,EAAM,UAIN0D,EAAMyjN,SAAWzjN,EAAM+jN,kBAQ3B,SAAgB/jN,EAAQoN,GACjBA,EAAM42M,kBACT52M,EAAM42M,iBAAA,EACN5wG,QAAQwvF,SAASrrL,EAASvX,EAAQoN,GAEtC,CALA,CAPWkJ,KAAMtW,IAGfA,EAAMokC,QAAA,EACC9tB,IACT,EAsBAvD,EAAShW,UAAU0nH,MAAQ,WAUzB,OATAnoH,EAAM,wBAAyBga,KAAKosM,eAAee,UAAA,IAE/CntM,KAAKosM,eAAee,UACtBnnN,EAAM,SACNga,KAAKosM,eAAee,SAAA,EACpBntM,KAAKyiC,KAAK,UAGZziC,KAAKosM,eAAet+K,QAAA,EACb9tB,IACT,EAcAvD,EAAShW,UAAUkoN,KAAO,SAAUjlN,GAClC,IAAIoN,EAAQkJ,KAER3S,EAAQ2S,KAAKosM,eACbz1M,GAAA,EA0BJ,IAAK,IAAI/Q,KAzBT8D,EAAOoyB,GAAG,OAAO,WAGf,GAFA91B,EAAM,eAEFqH,EAAMo6D,UAAYp6D,EAAMwuC,MAAO,CACjC,IAAInyC,EAAQ2D,EAAMo6D,QAAQjlD,MACtB9Y,GAASA,EAAM3D,QAAQ+Q,EAAM2T,KAAK/gB,EACxC,CAEAoN,EAAM2T,KAAK,KACb,IACA/gB,EAAOoyB,GAAG,QAAQ,SAAUl2B,GAC1BI,EAAM,gBACFqH,EAAMo6D,UAAS7hE,EAAQyH,EAAMo6D,QAAQ26H,MAAMx8L,IAE3CyH,EAAM0/M,YAAc,MAACnnN,IAAyDyH,EAAM0/M,YAAgBnnN,GAAUA,EAAMG,UAE9G+Q,EAAM2T,KAAK7kB,KAGnB+Q,GAAA,EACAjN,EAAOykH,SAEX,IAGczkH,OAAA,IACRsW,KAAKpa,IAAyC,mBAAd8D,EAAO9D,KACzCoa,KAAKpa,GAAK,SAAoBkR,GAC5B,OAAO,WACL,OAAOpN,EAAOoN,GAAQsU,MAAM1hB,EAAQ1B,UACtC,CACF,CAJU,CAIRpC,IAKN,IAAK,IAAI2R,EAAI,EAAGA,EAAImB,EAAa3S,OAAQwR,IACvC7N,EAAOoyB,GAAGpjB,EAAanB,GAAIyI,KAAKyiC,KAAK74C,KAAKoW,KAAMtH,EAAanB,KAc/D,OATAyI,KAAKguM,MAAQ,SAAUl3M,GACrB9Q,EAAM,gBAAiB8Q,GAEnBH,IACFA,GAAA,EACAjN,EAAOuyM,SAEX,EAEOj8L,IACT,EAEsB,mBAAX/S,SACTwP,EAAShW,UAAUwG,OAAO2hN,eAAiB,WAKzC,YAAO,IAJH7hN,IACFA,EAAoCM,EAAQ,OAGvCN,EAAkCiT,KAC3C,GAGFxZ,OAAOmC,eAAe8T,EAAShW,UAAW,wBAAyB,CAIjEq/D,YAAA,EACAhlD,IAAK,WACH,OAAOd,KAAKosM,eAAez2K,aAC7B,IAEFnvC,OAAOmC,eAAe8T,EAAShW,UAAW,iBAAkB,CAI1Dq/D,YAAA,EACAhlD,IAAK,WACH,OAAOd,KAAKosM,gBAAkBpsM,KAAKosM,eAAerhM,MACpD,IAEFvkB,OAAOmC,eAAe8T,EAAShW,UAAW,kBAAmB,CAI3Dq/D,YAAA,EACAhlD,IAAK,WACH,OAAOd,KAAKosM,eAAee,OAC7B,EACA5pM,IAAK,SAAa7Z,GACZsW,KAAKosM,iBACPpsM,KAAKosM,eAAee,QAAUzjN,EAElC,IAGF+S,EAASoyM,UAAY7hN,EACrBxG,OAAOmC,eAAe8T,EAAShW,UAAW,iBAAkB,CAI1Dq/D,YAAA,EACAhlD,IAAK,WACH,OAAOd,KAAKosM,eAAermN,MAC7B,IAmDoB,mBAAXkH,SACTwP,EAAS6M,KAAO,SAAU5f,EAAUoN,GAKlC,YAAO,IAJH/I,IACFA,EAAOV,EAAQ,OAGVU,EAAK0O,EAAU/S,EAAUoN,EAClC,kBAAApN,EAAAoN,EAAAzJ,GAAA,aC3hCF3D,EAAOhE,QAAUmI,EAEjB,IAAI8I,EAAiBtJ,EAAA,MAAAO,EACjB5H,EAA6B2Q,EAAei2M,2BAC5ChnN,EAAwB+Q,EAAem4M,sBACvCv3M,EAAqCZ,EAAeo4M,mCACpDn4M,EAA8BD,EAAeq4M,4BAE7Ct3M,EAASrK,EAAQ,MAIrB,SAASF,EAAezD,EAAIoN,GAC1B,IAAIzJ,EAAK2S,KAAKivM,gBACd5hN,EAAG6hN,cAAA,EACH,IAAIv4M,EAAKtJ,EAAG8hN,QAEZ,GAAW,OAAPx4M,EACF,OAAOqJ,KAAKyiC,KAAK,QAAS,IAAI78C,GAGhCyH,EAAG+hN,WAAa,KAChB/hN,EAAG8hN,QAAU,KACD,MAARr4M,GACFkJ,KAAKyK,KAAK3T,GACZH,EAAGjN,GACH,IAAI1D,EAAKga,KAAKosM,eACdpmN,EAAGqnN,SAAA,GAECrnN,EAAGunN,cAAgBvnN,EAAGD,OAASC,EAAG2vC,gBACpC31B,KAAKguM,MAAMhoN,EAAG2vC,cAElB,CAEA,SAAS9nC,EAAUnE,GACjB,KAAMsW,gBAAgBnS,GAAY,OAAO,IAAIA,EAAUnE,GACvDgO,EAAO9Q,KAAKoZ,KAAMtW,GAClBsW,KAAKivM,gBAAkB,CACrBI,eAAgBliN,EAAevD,KAAKoW,MACpCsvM,eAAA,EACAJ,cAAA,EACAC,QAAS,KACTC,WAAY,KACZG,cAAe,MAGjBvvM,KAAKosM,eAAemB,cAAA,EAIpBvtM,KAAKosM,eAAekB,MAAA,EAEhB5jN,IAC+B,mBAAtBA,EAAQkqM,YAA0B5zL,KAAKssM,WAAa5iN,EAAQkqM,WAC1C,mBAAlBlqM,EAAQ+uC,QAAsBz4B,KAAKwvM,OAAS9lN,EAAQ+uC,QAIjEz4B,KAAK8b,GAAG,YAAa/uB,EACvB,CAEA,SAASA,IACP,IAAIrD,EAAQsW,KAEe,mBAAhBA,KAAKwvM,QAA0BxvM,KAAKosM,eAAeC,UAK5Dt+M,EAAKiS,KAAM,KAAM,MAJjBA,KAAKwvM,QAAO,SAAU14M,EAAIzJ,GACxBU,EAAKrE,EAAOoN,EAAIzJ,EAClB,GAIJ,CAwDA,SAASU,EAAKrE,EAAQoN,EAAIzJ,GACxB,GAAIyJ,EAAI,OAAOpN,EAAO+4C,KAAK,QAAS3rC,GAMpC,GALY,MAARzJ,GACF3D,EAAO+gB,KAAKpd,GAIV3D,EAAOyiN,eAAepmN,OAAQ,MAAM,IAAI6Q,EAC5C,GAAIlN,EAAOulN,gBAAgBC,aAAc,MAAM,IAAI33M,EACnD,OAAO7N,EAAO+gB,KAAK,KACrB,CA/HApd,EAAQ,KAARA,CAAoBQ,EAAW6J,GA+D/B7J,EAAUpH,UAAUgkB,KAAO,SAAU/gB,EAAOoN,GAE1C,OADAkJ,KAAKivM,gBAAgBK,eAAA,EACd53M,EAAOjR,UAAUgkB,KAAK7jB,KAAKoZ,KAAMtW,EAAOoN,EACjD,EAYAjJ,EAAUpH,UAAU6lN,WAAa,SAAU5iN,EAAOoN,EAAUzJ,GAC1DA,EAAG,IAAIrH,EAA2B,gBACpC,EAEA6H,EAAUpH,UAAUgpN,OAAS,SAAU/lN,EAAOoN,EAAUzJ,GACtD,IAAIsJ,EAAKqJ,KAAKivM,gBAKd,GAJAt4M,EAAGw4M,QAAU9hN,EACbsJ,EAAGy4M,WAAa1lN,EAChBiN,EAAG44M,cAAgBz4M,GAEdH,EAAGu4M,aAAc,CACpB,IAAIlpN,EAAKga,KAAKosM,gBACVz1M,EAAG24M,eAAiBtpN,EAAGunN,cAAgBvnN,EAAGD,OAASC,EAAG2vC,gBAAe31B,KAAKguM,MAAMhoN,EAAG2vC,cACzF,CACF,EAKA9nC,EAAUpH,UAAUunN,MAAQ,SAAUtkN,GACpC,IAAIoN,EAAKkJ,KAAKivM,gBAEQ,OAAlBn4M,EAAGs4M,YAAwBt4M,EAAGo4M,aAOhCp4M,EAAGw4M,eAAA,GANHx4M,EAAGo4M,cAAA,EAEHlvM,KAAKssM,WAAWx1M,EAAGs4M,WAAYt4M,EAAGy4M,cAAez4M,EAAGu4M,gBAMxD,EAEAxhN,EAAUpH,UAAUwnN,SAAW,SAAUvkN,EAAKoN,GAC5CY,EAAOjR,UAAUwnN,SAASrnN,KAAKoZ,KAAMtW,GAAK,SAAUA,GAClDoN,EAAGpN,EACL,GACF,iBAAAA,EAAAoN,EAAAzJ,GAAA,aCvJA,SAASsJ,EAAcjN,GACrB,IAAIoN,EAAQkJ,KAEZA,KAAK+mF,KAAO,KACZ/mF,KAAK8+I,MAAQ,KAEb9+I,KAAK0vM,OAAS,YAimBhB,SAAwBhmN,EAASoN,GAC/B,IAAIH,EAAQjN,EAAQo1J,MAGpB,IAFAp1J,EAAQo1J,MAAQ,KAETnoJ,GAAO,CACZ,IAAI3Q,EAAK2Q,EAAMyyF,SACftyF,EAAM64M,YACN3pN,OAvmBAkN,GAwmBAyD,EAAQA,EAAMowF,IAChB,CAGAjwF,EAAM84M,mBAAmB7oH,KAAOr9F,CAClC,CAbA,CAhmBmBoN,EAAOpN,EACxB,CACF,CAMA,IAAI1D,EA3BJ0D,EAAOhE,QAAU+W,EA8BjBA,EAASozM,cAAgBhqN,EAGzB,IAyJID,EAzJA2R,EAAe,CACjBu4M,UAAWziN,EAAQ,OAMjBuJ,EAASvJ,EAAQ,MAIjBqK,EAASrK,EAAA,MAAA00L,OAET50L,EAAgBE,EAAAS,EAAOuS,YAAc,WAAa,EAUlDxS,EAAcR,EAAQ,MAGtBN,EADWM,EAAQ,MACSo/M,iBAE5B1+M,EAAiBV,EAAA,MAAAO,EACjBE,EAAuBC,EAAe2+M,qBACtC1+M,EAA6BD,EAAe6+M,2BAC5Cp/M,EAAwBO,EAAe+gN,sBACvC1hN,EAAyBW,EAAegiN,uBACxCv7M,EAAuBzG,EAAeiiN,qBACtC53M,EAAyBrK,EAAekiN,uBACxClhM,EAA6BhhB,EAAemiN,2BAC5CpwM,EAAuB/R,EAAeoiN,qBAEtC33M,EAAiB3K,EAAYi/M,eAIjC,SAASp0M,IAAO,CAEhB,SAAS7S,EAAc6D,EAASoN,EAAQlR,GACtCI,EAASA,GAAUqH,EAAQ,MAC3B3D,EAAUA,GAAW,CAAC,EAME,kBAAb9D,IAAwBA,EAAWkR,aAAkB9Q,GAGhEga,KAAK+sM,aAAerjN,EAAQqjN,WACxBnnN,IAAUoa,KAAK+sM,WAAa/sM,KAAK+sM,cAAgBrjN,EAAQ0mN,oBAI7DpwM,KAAK21B,cAAgB5oC,EAAiBiT,KAAMtW,EAAS,wBAAyB9D,GAE9Eoa,KAAKqwM,aAAA,EAELrwM,KAAKyuM,WAAA,EAELzuM,KAAKy9C,QAAA,EAELz9C,KAAK67B,OAAA,EAEL77B,KAAK6rM,UAAA,EAEL7rM,KAAKqsM,WAAA,EAIL,IAAI90M,GAAA,IAAW7N,EAAQ4mN,cACvBtwM,KAAKswM,eAAiB/4M,EAItByI,KAAK6tM,gBAAkBnkN,EAAQmkN,iBAAmB,OAIlD7tM,KAAKja,OAAS,EAEdia,KAAKuwM,SAAA,EAELvwM,KAAKwwM,OAAS,EAKdxwM,KAAKstM,MAAA,EAILttM,KAAKywM,kBAAA,EAELzwM,KAAK0wM,QAAU,SAAUhnN,IA6R3B,SAAiBA,EAAQoN,GACvB,IAAIzJ,EAAQ3D,EAAOyiN,eACfx1M,EAAOtJ,EAAMigN,KACbtnN,EAAKqH,EAAM8hN,QACf,GAAkB,mBAAPnpN,EAAmB,MAAM,IAAIwH,EAExC,GAbF,SAA4B9D,GAC1BA,EAAM6mN,SAAA,EACN7mN,EAAMylN,QAAU,KAChBzlN,EAAM3D,QAAU2D,EAAMinN,SACtBjnN,EAAMinN,SAAW,CACnB,CALA,CAYqBtjN,GACfyJ,GArCN,SAAsBpN,EAAQoN,EAAOzJ,EAAMsJ,EAAI3Q,KAC3C8Q,EAAM64M,UAEJtiN,GAGFyvG,QAAQwvF,SAAStmM,EAAI2Q,GAGrBmmG,QAAQwvF,SAAS3sL,EAAajW,EAAQoN,GACtCpN,EAAOyiN,eAAeyE,cAAA,EACtBp4M,EAAe9O,EAAQiN,KAIvB3Q,EAAG2Q,GACHjN,EAAOyiN,eAAeyE,cAAA,EACtBp4M,EAAe9O,EAAQiN,GAGvBgJ,EAAYjW,EAAQoN,GAExB,CAtBA,CAqCuBpN,EAAQ2D,EAAOsJ,EAAMG,EAAI9Q,OAAS,CAErD,IAAIJ,EAAWgd,EAAWvV,IAAU3D,EAAO2iN,UAEtCzmN,GAAayH,EAAMmjN,QAAWnjN,EAAMojN,mBAAoBpjN,EAAMwjN,iBACjEjxM,EAAYlW,EAAQ2D,GAGlBsJ,EACFmmG,QAAQwvF,SAASltL,EAAY1V,EAAQ2D,EAAOzH,EAAUI,GAEtDoZ,EAAW1V,EAAQ2D,EAAOzH,EAAUI,EAExC,CACF,CApBA,CA5RY8Q,EAAQpN,EAClB,EAGAsW,KAAKmvM,QAAU,KAEfnvM,KAAK2wM,SAAW,EAChB3wM,KAAK6wM,gBAAkB,KACvB7wM,KAAK8wM,oBAAsB,KAG3B9wM,KAAK2vM,UAAY,EAGjB3vM,KAAK+wM,aAAA,EAEL/wM,KAAK4wM,cAAA,EAEL5wM,KAAK2tM,WAAA,IAAYjkN,EAAQikN,UAEzB3tM,KAAK4tM,cAAgBlkN,EAAQkkN,YAE7B5tM,KAAKgxM,qBAAuB,EAG5BhxM,KAAK4vM,mBAAqB,IAAIj5M,EAAcqJ,KAC9C,CA2CA,SAASvD,EAAS/S,GAUhB,IAAIoN,EAAWkJ,gBATfha,EAASA,GAAUqH,EAAQ,OAU3B,IAAKyJ,IAAalR,EAAgBgB,KAAK6V,EAAUuD,MAAO,OAAO,IAAIvD,EAAS/S,GAC5EsW,KAAKmsM,eAAiB,IAAItmN,EAAc6D,EAASsW,KAAMlJ,GAEvDkJ,KAAK8kH,UAAA,EAEDp7H,IAC2B,mBAAlBA,EAAQ04L,QAAsBpiL,KAAKyvM,OAAS/lN,EAAQ04L,OACjC,mBAAnB14L,EAAQunN,SAAuBjxM,KAAKkxM,QAAUxnN,EAAQunN,QAClC,mBAApBvnN,EAAQ+yB,UAAwBzc,KAAKiuM,SAAWvkN,EAAQ+yB,SACtC,mBAAlB/yB,EAAQynN,QAAsBnxM,KAAKoxM,OAAS1nN,EAAQynN,QAGjEv6M,EAAOhQ,KAAKoZ,KACd,CAuJA,SAASP,EAAQ/V,EAAQoN,EAAOzJ,EAAQsJ,EAAK3Q,EAAOJ,EAAU2R,GAC5DT,EAAM65M,SAAWh6M,EACjBG,EAAMq4M,QAAU53M,EAChBT,EAAMy5M,SAAA,EACNz5M,EAAMw2M,MAAA,EACFx2M,EAAMu1M,UAAWv1M,EAAM45M,QAAQ,IAAIl8M,EAAqB,UAAmBnH,EAAQ3D,EAAOwnN,QAAQlrN,EAAO8Q,EAAM45M,SAAchnN,EAAO+lN,OAAOzpN,EAAOJ,EAAUkR,EAAM45M,SACtK55M,EAAMw2M,MAAA,CACR,CAuDA,SAASluM,EAAW1V,EAAQoN,EAAOzJ,EAAUsJ,GACtCtJ,GASP,SAAsB3D,EAAQoN,GACP,IAAjBA,EAAM/Q,QAAgB+Q,EAAM23M,YAC9B33M,EAAM23M,WAAA,EACN/kN,EAAO+4C,KAAK,SAEhB,CALA,CAT8B/4C,EAAQoN,GACpCA,EAAM64M,YACNh5M,IACAgJ,EAAYjW,EAAQoN,EACtB,CAaA,SAAS8I,EAAYlW,EAAQoN,GAC3BA,EAAM25M,kBAAA,EACN,IAAIpjN,EAAQyJ,EAAM+5M,gBAElB,GAAInnN,EAAOwnN,SAAW7jN,GAASA,EAAM05F,KAAM,CAEzC,IAAI/gG,EAAI8Q,EAAMk6M,qBACVprN,EAAS,IAAIM,MAAMF,GACnBuR,EAAST,EAAM84M,mBACnBr4M,EAAOunJ,MAAQzxJ,EAIf,IAHA,IAAIuJ,EAAQ,EACRc,GAAA,EAEGrK,GACLzH,EAAOgR,GAASvJ,EACXA,EAAMgkN,QAAO35M,GAAA,GAClBrK,EAAQA,EAAM05F,KACdnwF,GAAS,EAGXhR,EAAO0rN,WAAa55M,EACpB+H,EAAQ/V,EAAQoN,GAAA,EAAaA,EAAM/Q,OAAQH,EAAQ,GAAI2R,EAAOm4M,QAG9D54M,EAAM64M,YACN74M,EAAMg6M,oBAAsB,KAExBv5M,EAAOwvF,MACTjwF,EAAM84M,mBAAqBr4M,EAAOwvF,KAClCxvF,EAAOwvF,KAAO,MAEdjwF,EAAM84M,mBAAqB,IAAIj5M,EAAcG,GAG/CA,EAAMk6M,qBAAuB,CAC/B,KAAO,CAEL,KAAO3jN,GAAO,CACZ,IAAIF,EAAQE,EAAM05I,MACdl5I,EAAWR,EAAMg2G,SACjBt2G,EAAKM,EAAM+7F,SASf,GAPA3pF,EAAQ/V,EAAQoN,GAAA,EADNA,EAAMi2M,WAAa,EAAI5/M,EAAMpH,OACJoH,EAAOU,EAAUd,GACpDM,EAAQA,EAAM05F,KACdjwF,EAAMk6M,uBAKFl6M,EAAMy5M,QACR,KAEJ,CAEc,OAAVljN,IAAgByJ,EAAMg6M,oBAAsB,KAClD,CAEAh6M,EAAM+5M,gBAAkBxjN,EACxByJ,EAAM25M,kBAAA,CACR,CA0CA,SAAS7tM,EAAWlZ,GAClB,OAAOA,EAAM+zD,QAA2B,IAAjB/zD,EAAM3D,QAA0C,OAA1B2D,EAAMmnN,kBAA6BnnN,EAAMmiN,WAAaniN,EAAM6mN,OAC3G,CAEA,SAAS1wM,EAAUnW,EAAQoN,GACzBpN,EAAO0nN,QAAO,SAAU/jN,GACtByJ,EAAM64M,YAEFtiN,GACFmL,EAAe9O,EAAQ2D,GAGzByJ,EAAMi6M,aAAA,EACNrnN,EAAO+4C,KAAK,aACZ9iC,EAAYjW,EAAQoN,EACtB,GACF,CAeA,SAAS6I,EAAYjW,EAAQoN,GAC3B,IAAIzJ,EAAOuV,EAAW9L,GAEtB,GAAIzJ,IAhBN,SAAmB3D,EAAQoN,GACpBA,EAAMi6M,aAAgBj6M,EAAMu5M,cACF,mBAAlB3mN,EAAO0nN,QAA0Bt6M,EAAMu1M,WAKhDv1M,EAAMi6M,aAAA,EACNrnN,EAAO+4C,KAAK,eALZ3rC,EAAM64M,YACN74M,EAAMu5M,aAAA,EACNvzG,QAAQwvF,SAASzsL,EAAWnW,EAAQoN,IAM1C,CAXA,CAiBcpN,EAAQoN,GAEM,IAApBA,EAAM64M,YACR74M,EAAM+0M,UAAA,EACNniN,EAAO+4C,KAAK,UAER3rC,EAAM82M,cAAa,CAGrB,IAAIj3M,EAASjN,EAAO0iN,iBAEfz1M,GAAUA,EAAOi3M,aAAej3M,EAAOy2M,aAC1C1jN,EAAO+yB,SAEX,CAIJ,OAAOpvB,CACT,CA5hBAA,EAAQ,KAARA,CAAoBoP,EAAU7F,GAyF9B/Q,EAAcY,UAAUygJ,UAAY,WAIlC,IAHA,IAAIx9I,EAAUsW,KAAK6wM,gBACf/5M,EAAM,GAEHpN,GACLoN,EAAI2T,KAAK/gB,GACTA,EAAUA,EAAQq9F,KAGpB,OAAOjwF,CACT,EAEA,WACE,IACEtQ,OAAOmC,eAAe9C,EAAcY,UAAW,SAAU,CACvDqa,IAAKvJ,EAAau4M,WAAU,WAC1B,OAAO9vM,KAAKknI,WACd,GAAG,6EAAmF,YAE7E,CAAX,MAAOx9I,GAAI,CACd,CARD,GAcsB,mBAAXuD,QAAyBA,OAAOskN,aAAiE,mBAA3Cv/J,SAASvrD,UAAUwG,OAAOskN,cACzF3rN,EAAkBosD,SAASvrD,UAAUwG,OAAOskN,aAC5C/qN,OAAOmC,eAAe8T,EAAUxP,OAAOskN,YAAa,CAClD//M,MAAO,SAAe9H,GACpB,QAAI9D,EAAgBgB,KAAKoZ,KAAMtW,IAC3BsW,OAASvD,GACN/S,GAAUA,EAAOyiN,0BAA0BtmN,CACpD,KAGFD,EAAkB,SAAyB8D,GACzC,OAAOA,aAAkBsW,IAC3B,EA8BFvD,EAAShW,UAAUslN,KAAO,WACxBvzM,EAAewH,KAAM,IAAI5S,EAC3B,EA8BAqP,EAAShW,UAAU27L,MAAQ,SAAU14L,EAAOoN,EAAUzJ,GACpD,IAnNqBsJ,EAmNjB3Q,EAAQga,KAAKmsM,eACbvmN,GAAA,EAEA2R,GAASvR,EAAM+mN,aAtNEp2M,EAsN0BjN,EArNxCgO,EAAOwlG,SAASvmG,IAAQA,aAAexJ,GAsO9C,OAfIoK,IAAUG,EAAOwlG,SAASxzG,KAC5BA,EA7NJ,SAA6BA,GAC3B,OAAOgO,EAAO4R,KAAK5f,EACrB,CAFA,CA6NgCA,IAGN,mBAAboN,IACTzJ,EAAKyJ,EACLA,EAAW,MAGTS,EAAOT,EAAW,SAAmBA,IAAUA,EAAW9Q,EAAM6nN,iBAClD,mBAAPxgN,IAAmBA,EAAKqL,GAC/B1S,EAAMy3D,OA7CZ,SAAuB/zD,EAAQoN,GAC7B,IAAIzJ,EAAK,IAAI0hB,EAEbvW,EAAe9O,EAAQ2D,GACvByvG,QAAQwvF,SAASx1L,EAAIzJ,EACvB,CALA,CA6CkC2S,KAAM3S,IAAakK,GAnCrD,SAAoB7N,EAAQoN,EAAOzJ,EAAOsJ,GACxC,IAAI3Q,EAQJ,OANc,OAAVqH,EACFrH,EAAK,IAAIoS,EACiB,iBAAV/K,GAAuByJ,EAAMi2M,aAC7C/mN,EAAK,IAAI8H,EAAqB,QAAS,CAAC,SAAU,UAAWT,KAG3DrH,IACFwS,EAAe9O,EAAQ1D,GACvB82G,QAAQwvF,SAAS31L,EAAI3Q,IAAA,EAKzB,CAhBA,CAmCyEga,KAAMha,EAAO0D,EAAO2D,MACzFrH,EAAM2pN,YACN/pN,EAwDJ,SAAuB8D,EAAQoN,EAAOzJ,EAAOsJ,EAAO3Q,EAAUJ,GAC5D,IAAKyH,EAAO,CACV,IAAIkK,EAtBR,SAAqB7N,EAAOoN,EAAOzJ,GAKjC,OAJK3D,EAAMqjN,aAAA,IAAcrjN,EAAM4mN,eAA4C,iBAAVx5M,IAC/DA,EAAQY,EAAO4R,KAAKxS,EAAOzJ,IAGtByJ,CACT,CANA,CAsB+BA,EAAOH,EAAO3Q,GAErC2Q,IAAUY,IACZlK,GAAA,EACArH,EAAW,SACX2Q,EAAQY,EAEZ,CAEA,IAAIX,EAAME,EAAMi2M,WAAa,EAAIp2M,EAAM5Q,OACvC+Q,EAAM/Q,QAAU6Q,EAChB,IAAIzJ,EAAM2J,EAAM/Q,OAAS+Q,EAAM6+B,cAI/B,GAFKxoC,IAAK2J,EAAM23M,WAAA,GAEZ33M,EAAMy5M,SAAWz5M,EAAM05M,OAAQ,CACjC,IAAI3iN,EAAOiJ,EAAMg6M,oBACjBh6M,EAAMg6M,oBAAsB,CAC1B/pE,MAAOpwI,EACP0sG,SAAUr9G,EACVqrN,MAAOhkN,EACP+7F,SAAUxjG,EACVmhG,KAAM,MAGJl5F,EACFA,EAAKk5F,KAAOjwF,EAAMg6M,oBAElBh6M,EAAM+5M,gBAAkB/5M,EAAMg6M,oBAGhCh6M,EAAMk6M,sBAAwB,CAChC,MACEvxM,EAAQ/V,EAAQoN,GAAA,EAAcF,EAAKD,EAAO3Q,EAAUJ,GAGtD,OAAOuH,CACT,CAvCA,CAxDwB6S,KAAMha,EAAOuR,EAAO7N,EAAOoN,EAAUzJ,IAEpDzH,CACT,EAEA6W,EAAShW,UAAU+qN,KAAO,WACxBxxM,KAAKmsM,eAAeqE,QACtB,EAEA/zM,EAAShW,UAAUgrN,OAAS,WAC1B,IAAI/nN,EAAQsW,KAAKmsM,eAEbziN,EAAM8mN,SACR9mN,EAAM8mN,SACD9mN,EAAM6mN,SAAY7mN,EAAM8mN,QAAW9mN,EAAM+mN,mBAAoB/mN,EAAMmnN,iBAAiBjxM,EAAYI,KAAMtW,GAE/G,EAEA+S,EAAShW,UAAUirN,mBAAqB,SAA4BhoN,GAGlE,GADwB,iBAAbA,IAAuBA,EAAWA,EAAS4J,iBAChD,CAAC,MAAO,OAAQ,QAAS,QAAS,SAAU,SAAU,OAAQ,QAAS,UAAW,WAAY,OAAOnB,SAASzI,EAAW,IAAI4J,gBAAkB,GAAI,MAAM,IAAIwM,EAAqBpW,GAExL,OADAsW,KAAKmsM,eAAe0B,gBAAkBnkN,EAC/BsW,IACT,EAEAxZ,OAAOmC,eAAe8T,EAAShW,UAAW,iBAAkB,CAI1Dq/D,YAAA,EACAhlD,IAAK,WACH,OAAOd,KAAKmsM,gBAAkBnsM,KAAKmsM,eAAejlE,WACpD,IAWF1gJ,OAAOmC,eAAe8T,EAAShW,UAAW,wBAAyB,CAIjEq/D,YAAA,EACAhlD,IAAK,WACH,OAAOd,KAAKmsM,eAAex2K,aAC7B,IA2LFl5B,EAAShW,UAAUgpN,OAAS,SAAU/lN,EAAOoN,EAAUzJ,GACrDA,EAAG,IAAIW,EAA2B,YACpC,EAEAyO,EAAShW,UAAUyqN,QAAU,KAE7Bz0M,EAAShW,UAAU+b,IAAM,SAAU9Y,EAAOoN,EAAUzJ,GAClD,IAAIsJ,EAAQqJ,KAAKmsM,eAoBjB,MAlBqB,mBAAVziN,GACT2D,EAAK3D,EACLA,EAAQ,KACRoN,EAAW,MACkB,mBAAbA,IAChBzJ,EAAKyJ,EACLA,EAAW,MAGT,MAAApN,GAAuCsW,KAAKoiL,MAAM14L,EAAOoN,GAEzDH,EAAM65M,SACR75M,EAAM65M,OAAS,EACfxwM,KAAKyxM,UAIF96M,EAAM8mD,QAsEb,SAAqB/zD,EAAQoN,EAAOzJ,GAClCyJ,EAAM2mD,QAAA,EACN99C,EAAYjW,EAAQoN,GAEhBzJ,IACEyJ,EAAM+0M,SAAU/uG,QAAQwvF,SAASj/L,GAAS3D,EAAO0oD,KAAK,SAAU/kD,IAGtEyJ,EAAM+kC,OAAA,EACNnyC,EAAOo7H,UAAA,CACT,CAVA,CAtEiC9kH,KAAMrJ,EAAOtJ,GACrC2S,IACT,EAEAxZ,OAAOmC,eAAe8T,EAAShW,UAAW,iBAAkB,CAI1Dq/D,YAAA,EACAhlD,IAAK,WACH,OAAOd,KAAKmsM,eAAepmN,MAC7B,IAsFFS,OAAOmC,eAAe8T,EAAShW,UAAW,YAAa,CAIrDq/D,YAAA,EACAhlD,IAAK,WACH,gBAAId,KAAKmsM,gBAIFnsM,KAAKmsM,eAAeE,SAC7B,EACA9oM,IAAK,SAAa7Z,GAGXsW,KAAKmsM,iBAMVnsM,KAAKmsM,eAAeE,UAAY3iN,EAClC,IAEF+S,EAAShW,UAAUg2B,QAAU5uB,EAAY4uB,QACzChgB,EAAShW,UAAUynN,WAAargN,EAAYsgN,UAE5C1xM,EAAShW,UAAUwnN,SAAW,SAAUvkN,EAAKoN,GAC3CA,EAAGpN,EACL,iBAAAA,EAAAoN,EAAAzJ,GAAA,aCtrBA,IAAIsJ,EAEJ,SAAS3Q,EAAgB0D,EAAKoN,EAAKzJ,GAAiK,OAApJyJ,KAAOpN,EAAOlD,OAAOmC,eAAee,EAAKoN,EAAK,CAAEtF,MAAOnE,EAAOy4D,YAAA,EAAkB0hB,cAAA,EAAoBs9C,UAAA,IAA4Bp7H,EAAIoN,GAAOzJ,EAAgB3D,CAAK,CAEhN,IAAI9D,EAAWyH,EAAQ,MAEnBkK,EAAetK,OAAO,eACtB2J,EAAc3J,OAAO,cACrByK,EAASzK,OAAO,SAChBE,EAASF,OAAO,SAChBY,EAAeZ,OAAO,eACtBF,EAAiBE,OAAO,iBACxBc,EAAUd,OAAO,UAErB,SAASa,EAAiBpE,EAAOoN,GAC/B,MAAO,CACLtF,MAAO9H,EACPwG,KAAM4G,EAEV,CAEA,SAAS9I,EAAetE,GACtB,IAAIoN,EAAUpN,EAAK6N,GAEnB,GAAgB,OAAZT,EAAkB,CACpB,IAAIzJ,EAAO3D,EAAKqE,GAASkF,OAIZ,OAAT5F,IACF3D,EAAKmE,GAAgB,KACrBnE,EAAK6N,GAAgB,KACrB7N,EAAKkN,GAAe,KACpBE,EAAQhJ,EAAiBT,GAAA,IAE7B,CACF,CAEA,SAASG,EAAW9D,GAGlBozG,QAAQwvF,SAASt+L,EAAgBtE,EACnC,CAeA,IAAI0D,EAAyB5G,OAAOuC,gBAAe,WAAa,IAC5DyL,EAAuChO,OAAO4nI,gBA4D/CpoI,EA5D+D2Q,EAAwB,CACpF,UAAAoxD,GACF,OAAO/nD,KAAKjS,EACd,EAEAg5F,KAAM,WACJ,IAAIr9F,EAAQsW,KAIRlJ,EAAQkJ,KAAKtI,GAEjB,GAAc,OAAVZ,EACF,OAAO7L,QAAQ0E,OAAOmH,GAGxB,GAAIkJ,KAAK7S,GACP,OAAOlC,QAAQyE,QAAQ5B,OAAA,GAAiB,IAG1C,GAAIkS,KAAKjS,GAASs+M,UAKhB,OAAO,IAAIphN,SAAQ,SAAU6L,EAASzJ,GACpCyvG,QAAQwvF,UAAS,WACX5iM,EAAMgO,GACRrK,EAAO3D,EAAMgO,IAEbZ,EAAQhJ,OAAA,GAAiB,GAE7B,GACF,IAOF,IACIT,EADAsJ,EAAcqJ,KAAKnS,GAGvB,GAAI8I,EACFtJ,EAAU,IAAIpC,QA1DpB,SAAqBvB,EAAaoN,GAChC,OAAO,SAAUzJ,EAASsJ,GACxBjN,EAAYgjC,MAAK,WACX51B,EAAK3J,GACPE,EAAQS,OAAA,GAAiB,IAI3BgJ,EAAK/J,GAAgBM,EAASsJ,EAChC,GAAGA,EACL,CACF,CAXA,CA0DwCA,EAAaqJ,WAC1C,CAGL,IAAIha,EAAOga,KAAKjS,GAASkF,OAEzB,GAAa,OAATjN,EACF,OAAOiF,QAAQyE,QAAQ5B,EAAiB9H,GAAA,IAG1CqH,EAAU,IAAIpC,QAAQ+U,KAAKjT,GAC7B,CAGA,OADAiT,KAAKnS,GAAgBR,EACdA,CACT,GACwCJ,OAAO2hN,eAAe,WAC9D,OAAO5uM,IACT,IAAIha,EAAgB2Q,EAAuB,UAAU,WACnD,IAAIjN,EAASsW,KAKb,OAAO,IAAI/U,SAAQ,SAAU6L,EAASzJ,GACpC3D,EAAOqE,GAAS0uB,QAAQ,MAAM,SAAU/yB,GAClCA,EACF2D,EAAO3D,GAIToN,EAAQhJ,OAAA,GAAiB,GAC3B,GACF,GACF,IAAI6I,GAAwBvJ,GAoE5B1D,EAAOhE,QAlEiC,SAA2CgE,GACjF,IAAIoN,EAEAzJ,EAAW7G,OAAO8D,OAAOkK,GAA4DxO,EAArB8Q,EAAiB,CAAC,EAAmC/I,EAAS,CAChIyD,MAAO9H,EACPo7H,UAAA,IACE9+H,EAAgB8Q,EAAgBS,EAAc,CAChD/F,MAAO,KACPszH,UAAA,IACE9+H,EAAgB8Q,EAAgBF,EAAa,CAC/CpF,MAAO,KACPszH,UAAA,IACE9+H,EAAgB8Q,EAAgBY,EAAQ,CAC1ClG,MAAO,KACPszH,UAAA,IACE9+H,EAAgB8Q,EAAgB3J,EAAQ,CAC1CqE,MAAO9H,EAAO0iN,eAAegB,WAC7BtoF,UAAA,IACE9+H,EAAgB8Q,EAAgB/J,EAAgB,CAClDyE,MAAO,SAAe9H,EAASoN,GAC7B,IAAIH,EAAOtJ,EAASU,GAASkF,OAEzB0D,GACFtJ,EAASQ,GAAgB,KACzBR,EAASkK,GAAgB,KACzBlK,EAASuJ,GAAe,KACxBlN,EAAQoE,EAAiB6I,GAAA,MAEzBtJ,EAASkK,GAAgB7N,EACzB2D,EAASuJ,GAAeE,EAE5B,EACAguH,UAAA,IACEhuH,IA8BJ,OA7BAzJ,EAASQ,GAAgB,KACzBjI,EAAS8D,GAAQ,SAAUA,GACzB,GAAIA,GAAoB,+BAAbA,EAAIm1B,KAAuC,CACpD,IAAI/nB,EAASzJ,EAASuJ,GAWtB,OARe,OAAXE,IACFzJ,EAASQ,GAAgB,KACzBR,EAASkK,GAAgB,KACzBlK,EAASuJ,GAAe,KACxBE,EAAOpN,SAGT2D,EAASqK,GAAUhO,EAErB,CAEA,IAAIiN,EAAUtJ,EAASkK,GAEP,OAAZZ,IACFtJ,EAASQ,GAAgB,KACzBR,EAASkK,GAAgB,KACzBlK,EAASuJ,GAAe,KACxBD,EAAQ7I,OAAA,GAAiB,KAG3BT,EAASF,IAAA,CACX,IACAzD,EAAOoyB,GAAG,WAAYtuB,EAAW5D,KAAK,KAAMyD,IACrCA,CACT,iBAAA3D,EAAAoN,EAAAzJ,GAAA,aC1MA,SAASsJ,EAAQjN,EAAQoN,GAAkB,IAAIzJ,EAAO7G,OAAOP,KAAKyD,GAAS,GAAIlD,OAAOqC,sBAAuB,CAAE,IAAI8N,EAAUnQ,OAAOqC,sBAAsBa,GAAaoN,IAAgBH,EAAUA,EAAQoK,QAAO,SAAUjK,GAAO,OAAOtQ,OAAOsC,yBAAyBY,EAAQoN,GAAKgvD,UAAY,KAAIz4D,EAAKod,KAAKW,MAAM/d,EAAMsJ,EAAU,CAAE,OAAOtJ,CAAM,CAIpV,SAASrH,EAAgB0D,EAAKoN,EAAKzJ,GAAiK,OAApJyJ,KAAOpN,EAAOlD,OAAOmC,eAAee,EAAKoN,EAAK,CAAEtF,MAAOnE,EAAOy4D,YAAA,EAAkB0hB,cAAA,EAAoBs9C,UAAA,IAA4Bp7H,EAAIoN,GAAOzJ,EAAgB3D,CAAK,CAIhN,SAAS9D,EAAkB8D,EAAQoN,GAAS,IAAK,IAAIzJ,EAAI,EAAGA,EAAIyJ,EAAM/Q,OAAQsH,IAAK,CAAE,IAAIsJ,EAAaG,EAAMzJ,GAAIsJ,EAAWmvD,WAAanvD,EAAWmvD,aAAA,EAAqBnvD,EAAW6wE,cAAA,EAAyB,UAAW7wE,IAAYA,EAAWmuH,UAAA,GAAiBt+H,OAAOmC,eAAee,EAAQiN,EAAW9P,IAAK8P,EAAa,CAAE,CAI5T,IACIY,EADWlK,EAAQ,MACD00L,OAGlBnrL,EADYvJ,EAAQ,MACAg2L,QAEpB3rL,EAASd,GAAWA,EAAQ+6M,QAAU,UAM1CjoN,EAAOhE,QAEP,WACE,SAASgE,KArBX,SAAyBA,EAAUoN,GAAe,KAAMpN,aAAoBoN,GAAgB,MAAM,IAAIu7C,UAAU,oCAAwC,CAAxJ,CAsBoBryC,KAAMtW,GAEtBsW,KAAKioG,KAAO,KACZjoG,KAAKuxF,KAAO,KACZvxF,KAAKja,OAAS,CAChB,CAvBF,IAAmCsH,EAoMjC,OApMiCA,EAyBR,CAAC,CACxBxG,IAAK,OACL2K,MAAO,SAAc9H,GACnB,IAAIoN,EAAQ,CACVhH,KAAMpG,EACNq9F,KAAM,MAEJ/mF,KAAKja,OAAS,EAAGia,KAAKuxF,KAAKxK,KAAOjwF,EAAWkJ,KAAKioG,KAAOnxG,EAC7DkJ,KAAKuxF,KAAOz6F,IACVkJ,KAAKja,MACT,GACC,CACDc,IAAK,UACL2K,MAAO,SAAiB9H,GACtB,IAAIoN,EAAQ,CACVhH,KAAMpG,EACNq9F,KAAM/mF,KAAKioG,MAEO,IAAhBjoG,KAAKja,SAAcia,KAAKuxF,KAAOz6F,GACnCkJ,KAAKioG,KAAOnxG,IACVkJ,KAAKja,MACT,GACC,CACDc,IAAK,QACL2K,MAAO,WACL,GAAoB,IAAhBwO,KAAKja,OAAT,CACA,IAAI2D,EAAMsW,KAAKioG,KAAKn4G,KAGpB,OAFoB,IAAhBkQ,KAAKja,OAAcia,KAAKioG,KAAOjoG,KAAKuxF,KAAO,KAAUvxF,KAAKioG,KAAOjoG,KAAKioG,KAAKlhB,OAC7E/mF,KAAKja,OACA2D,CAJsB,CAK/B,GACC,CACD7C,IAAK,QACL2K,MAAO,WACLwO,KAAKioG,KAAOjoG,KAAKuxF,KAAO,KACxBvxF,KAAKja,OAAS,CAChB,GACC,CACDc,IAAK,OACL2K,MAAO,SAAc9H,GACnB,GAAoB,IAAhBsW,KAAKja,OAAc,MAAO,GAI9B,IAHA,IAAI+Q,EAAIkJ,KAAKioG,KACT56G,EAAM,GAAKyJ,EAAEhH,KAEVgH,EAAIA,EAAEiwF,MACX15F,GAAO3D,EAAIoN,EAAEhH,KAGf,OAAOzC,CACT,GACC,CACDxG,IAAK,SACL2K,MAAO,SAAgB9H,GACrB,GAAoB,IAAhBsW,KAAKja,OAAc,OAAOwR,EAAO0qL,MAAM,GAK3C,IAJA,IArEcnrL,EAAKzJ,EAAQsJ,EAqEvB3Q,EAAMuR,EAAOurL,YAAYp5L,IAAM,GAC/B9D,EAAIoa,KAAKioG,KACTrxG,EAAI,EAEDhR,GAzEOkR,EA0EDlR,EAAEkK,KA1EIzC,EA0EErH,EA1EM2Q,EA0EDC,EAzE9BW,EAAO9Q,UAAU65D,KAAK15D,KAAKkQ,EAAKzJ,EAAQsJ,GA0ElCC,GAAKhR,EAAEkK,KAAK/J,OACZH,EAAIA,EAAEmhG,KAGR,OAAO/gG,CACT,GAEC,CACDa,IAAK,UACL2K,MAAO,SAAiB9H,EAAGoN,GACzB,IAAIzJ,EAcJ,OAZI3D,EAAIsW,KAAKioG,KAAKn4G,KAAK/J,QAErBsH,EAAM2S,KAAKioG,KAAKn4G,KAAKsQ,MAAM,EAAG1W,GAC9BsW,KAAKioG,KAAKn4G,KAAOkQ,KAAKioG,KAAKn4G,KAAKsQ,MAAM1W,IAGtC2D,EAFS3D,IAAMsW,KAAKioG,KAAKn4G,KAAK/J,OAExBia,KAAKiQ,QAGLnZ,EAAakJ,KAAK4xM,WAAWloN,GAAKsW,KAAK6xM,WAAWnoN,GAGnD2D,CACT,GACC,CACDxG,IAAK,QACL2K,MAAO,WACL,OAAOwO,KAAKioG,KAAKn4G,IACnB,GAEC,CACDjJ,IAAK,aACL2K,MAAO,SAAoB9H,GACzB,IAAIoN,EAAIkJ,KAAKioG,KACT56G,EAAI,EACJsJ,EAAMG,EAAEhH,KAGZ,IAFApG,GAAKiN,EAAI5Q,OAEF+Q,EAAIA,EAAEiwF,MAAM,CACjB,IAAI/gG,EAAM8Q,EAAEhH,KACRlK,EAAK8D,EAAI1D,EAAID,OAASC,EAAID,OAAS2D,EAIvC,GAHI9D,IAAOI,EAAID,OAAQ4Q,GAAO3Q,EAAS2Q,GAAO3Q,EAAIoa,MAAM,EAAG1W,GAGjD,IAFVA,GAAK9D,GAEQ,CACPA,IAAOI,EAAID,UACXsH,EACEyJ,EAAEiwF,KAAM/mF,KAAKioG,KAAOnxG,EAAEiwF,KAAU/mF,KAAKioG,KAAOjoG,KAAKuxF,KAAO,OAE5DvxF,KAAKioG,KAAOnxG,EACZA,EAAEhH,KAAO9J,EAAIoa,MAAMxa,IAGrB,KACF,GAEEyH,CACJ,CAGA,OADA2S,KAAKja,QAAUsH,EACRsJ,CACT,GAEC,CACD9P,IAAK,aACL2K,MAAO,SAAoB9H,GACzB,IAAIoN,EAAMS,EAAOurL,YAAYp5L,GACzB2D,EAAI2S,KAAKioG,KACTtxG,EAAI,EAIR,IAHAtJ,EAAEyC,KAAKwwD,KAAKxpD,GACZpN,GAAK2D,EAAEyC,KAAK/J,OAELsH,EAAIA,EAAE05F,MAAM,CACjB,IAAI/gG,EAAMqH,EAAEyC,KACRlK,EAAK8D,EAAI1D,EAAID,OAASC,EAAID,OAAS2D,EAIvC,GAHA1D,EAAIs6D,KAAKxpD,EAAKA,EAAI/Q,OAAS2D,EAAG,EAAG9D,GAGvB,IAFV8D,GAAK9D,GAEQ,CACPA,IAAOI,EAAID,UACX4Q,EACEtJ,EAAE05F,KAAM/mF,KAAKioG,KAAO56G,EAAE05F,KAAU/mF,KAAKioG,KAAOjoG,KAAKuxF,KAAO,OAE5DvxF,KAAKioG,KAAO56G,EACZA,EAAEyC,KAAO9J,EAAIoa,MAAMxa,IAGrB,KACF,GAEE+Q,CACJ,CAGA,OADAqJ,KAAKja,QAAU4Q,EACRG,CACT,GAEC,CACDjQ,IAAK6Q,EACLlG,MAAO,SAAe9H,EAAGoN,GACvB,OAAOF,EAAQoJ,KAnMrB,SAAuBtW,GAAU,IAAK,IAAIoN,EAAI,EAAGA,EAAI9O,UAAUjC,OAAQ+Q,IAAK,CAAE,IAAIzJ,EAAyB,MAAhBrF,UAAU8O,GAAa9O,UAAU8O,GAAK,CAAC,EAAOA,EAAI,EAAKH,EAAQnQ,OAAO6G,IAAA,GAAe+F,SAAQ,SAAU0D,GAAO9Q,EAAgB0D,EAAQoN,EAAKzJ,EAAOyJ,GAAO,IAAetQ,OAAOmvJ,0BAA6BnvJ,OAAOu/E,iBAAiBr8E,EAAQlD,OAAOmvJ,0BAA0BtoJ,IAAmBsJ,EAAQnQ,OAAO6G,IAAS+F,SAAQ,SAAU0D,GAAOtQ,OAAOmC,eAAee,EAAQoN,EAAKtQ,OAAOsC,yBAAyBuE,EAAQyJ,GAAO,GAAM,CAAE,OAAOpN,CAAQ,CAArhB,CAmMyC,CAAC,EAAGoN,EAAS,CAE9Cg7M,MAAO,EAEPC,eAAA,IAEJ,IAjM8D1kN,GAAYzH,EAyB/D8D,EAzB6FjD,UAAW4G,GAoM9G3D,CACT,CArLA,kBAAAA,GAAA,aC2BA,SAASoN,EAAoBpN,EAAMoN,GACjCH,EAAYjN,EAAMoN,GAClBzJ,EAAY3D,EACd,CAEA,SAAS2D,EAAY3D,GACfA,EAAKyiN,iBAAmBziN,EAAKyiN,eAAewB,WAC5CjkN,EAAK0iN,iBAAmB1iN,EAAK0iN,eAAeuB,WAChDjkN,EAAK+4C,KAAK,QACZ,CAqBA,SAAS9rC,EAAYjN,EAAMoN,GACzBpN,EAAK+4C,KAAK,QAAS3rC,EACrB,CAaApN,EAAOhE,QAAU,CACf+2B,QAnGF,SAAiB/yB,EAAK1D,GACpB,IAAIJ,EAAQoa,KAERzI,EAAoByI,KAAKosM,gBAAkBpsM,KAAKosM,eAAeC,UAC/Dz1M,EAAoBoJ,KAAKmsM,gBAAkBnsM,KAAKmsM,eAAeE,UAEnE,OAAI90M,GAAqBX,GACnB5Q,EACFA,EAAG0D,GACMA,IACJsW,KAAKmsM,eAEEnsM,KAAKmsM,eAAeyE,eAC9B5wM,KAAKmsM,eAAeyE,cAAA,EACpB9zG,QAAQwvF,SAAS31L,EAAaqJ,KAAMtW,IAHpCozG,QAAQwvF,SAAS31L,EAAaqJ,KAAMtW,IAOjCsW,OAKLA,KAAKosM,iBACPpsM,KAAKosM,eAAeC,WAAA,GAIlBrsM,KAAKmsM,iBACPnsM,KAAKmsM,eAAeE,WAAA,GAGtBrsM,KAAKiuM,SAASvkN,GAAO,MAAM,SAAUA,IAC9B1D,GAAM0D,EACJ9D,EAAMumN,eAECvmN,EAAMumN,eAAeyE,aAI/B9zG,QAAQwvF,SAASj/L,EAAazH,IAH9BA,EAAMumN,eAAeyE,cAAA,EACrB9zG,QAAQwvF,SAASx1L,EAAqBlR,EAAO8D,IAH7CozG,QAAQwvF,SAASx1L,EAAqBlR,EAAO8D,GAOtC1D,GACT82G,QAAQwvF,SAASj/L,EAAazH,GAC9BI,EAAG0D,IAEHozG,QAAQwvF,SAASj/L,EAAazH,EAElC,IAEOoa,KACT,EAiDEmuM,UApCF,WACMnuM,KAAKosM,iBACPpsM,KAAKosM,eAAeC,WAAA,EACpBrsM,KAAKosM,eAAeiB,SAAA,EACpBrtM,KAAKosM,eAAevwK,OAAA,EACpB77B,KAAKosM,eAAegB,YAAA,GAGlBptM,KAAKmsM,iBACPnsM,KAAKmsM,eAAeE,WAAA,EACpBrsM,KAAKmsM,eAAetwK,OAAA,EACpB77B,KAAKmsM,eAAe1uJ,QAAA,EACpBz9C,KAAKmsM,eAAekE,aAAA,EACpBrwM,KAAKmsM,eAAe4E,aAAA,EACpB/wM,KAAKmsM,eAAeN,UAAA,EACpB7rM,KAAKmsM,eAAeyE,cAAA,EAExB,EAoBE9D,eAdF,SAAwBpjN,EAAQoN,GAM9B,IAAIzJ,EAAS3D,EAAO0iN,eAChBz1M,EAASjN,EAAOyiN,eAChB9+M,GAAUA,EAAOugN,aAAej3M,GAAUA,EAAOi3M,YAAalkN,EAAO+yB,QAAQ3lB,GAAUpN,EAAO+4C,KAAK,QAAS3rC,EAClH,kBAAApN,EAAAoN,EAAAzJ,GAAA,aC9FA,IAAIsJ,EAA6BtJ,EAAA,MAAAO,EAAAokN,2BAgBjC,SAAShsN,IAAQ,CAmFjB0D,EAAOhE,QA7EP,SAASgE,EAAIoN,EAAQzJ,EAAMzH,GACzB,GAAoB,mBAATyH,EAAqB,OAAO3D,EAAIoN,EAAQ,KAAMzJ,GACpDA,IAAMA,EAAO,CAAC,GACnBzH,EAvBF,SAAc8D,GACZ,IAAIoN,GAAA,EACJ,OAAO,WACL,IAAIA,EAAJ,CACAA,GAAA,EAEA,IAAK,IAAIzJ,EAAOrF,UAAUjC,OAAQ4Q,EAAO,IAAIzQ,MAAMmH,GAAOrH,EAAO,EAAGA,EAAOqH,EAAMrH,IAC/E2Q,EAAK3Q,GAAQgC,UAAUhC,GAGzB0D,EAAS0hB,MAAMpL,KAAMrJ,EAPH,CAQpB,CACF,CAZA,CAuBkB/Q,GAAYI,GAC5B,IAAIuR,EAAWlK,EAAK+uM,WAAA,IAAY/uM,EAAK+uM,UAAsBtlM,EAAOslM,SAC9DxlM,EAAWvJ,EAAKy3H,WAAA,IAAYz3H,EAAKy3H,UAAsBhuH,EAAOguH,SAE9DptH,EAAiB,WACdZ,EAAOguH,UAAUj3H,GACxB,EAEIV,EAAgB2J,EAAOq1M,gBAAkBr1M,EAAOq1M,eAAeN,SAE/Dh+M,EAAW,WACb+I,GAAA,EACAzJ,GAAA,EACKoK,GAAU3R,EAASgB,KAAKkQ,EAC/B,EAEI/J,EAAgB+J,EAAOs1M,gBAAkBt1M,EAAOs1M,eAAegB,WAE/Dr/M,EAAQ,WACVwJ,GAAA,EACAxK,GAAA,EACK6J,GAAUhR,EAASgB,KAAKkQ,EAC/B,EAEIhJ,EAAU,SAAiBpE,GAC7B9D,EAASgB,KAAKkQ,EAAQpN,EACxB,EAEIsE,EAAU,WACZ,IAAItE,EAEJ,OAAI6N,IAAaxK,GACV+J,EAAOs1M,gBAAmBt1M,EAAOs1M,eAAevwK,QAAOnyC,EAAM,IAAIiN,GAC/D/Q,EAASgB,KAAKkQ,EAAQpN,IAG3BkN,IAAazJ,GACV2J,EAAOq1M,gBAAmBr1M,EAAOq1M,eAAetwK,QAAOnyC,EAAM,IAAIiN,GAC/D/Q,EAASgB,KAAKkQ,EAAQpN,SAAA,CAEjC,EAEI8D,EAAY,WACdsJ,EAAOm7M,IAAIn2L,GAAG,SAAUjuB,EAC1B,EAgBA,OAnEF,SAAmBnE,GACjB,OAAOA,EAAOwoN,WAAqC,mBAAjBxoN,EAAOoK,KAC3C,CAFA,CAqDgBgD,IACZA,EAAOglB,GAAG,WAAYjuB,GACtBiJ,EAAOglB,GAAG,QAAS9tB,GACf8I,EAAOm7M,IAAKzkN,IAAiBsJ,EAAOglB,GAAG,UAAWtuB,IAC7CoJ,IAAaE,EAAOq1M,iBAE7Br1M,EAAOglB,GAAG,MAAOpkB,GACjBZ,EAAOglB,GAAG,QAASpkB,IAGrBZ,EAAOglB,GAAG,MAAO/tB,GACjB+I,EAAOglB,GAAG,SAAUjuB,IAAA,IAChBR,EAAK6H,OAAiB4B,EAAOglB,GAAG,QAAShuB,GAC7CgJ,EAAOglB,GAAG,QAAS9tB,GACZ,WACL8I,EAAO87C,eAAe,WAAY/kD,GAClCiJ,EAAO87C,eAAe,QAAS5kD,GAC/B8I,EAAO87C,eAAe,UAAWplD,GAC7BsJ,EAAOm7M,KAAKn7M,EAAOm7M,IAAIr/J,eAAe,SAAU/kD,GACpDiJ,EAAO87C,eAAe,MAAOl7C,GAC7BZ,EAAO87C,eAAe,QAASl7C,GAC/BZ,EAAO87C,eAAe,SAAU/kD,GAChCiJ,EAAO87C,eAAe,MAAO7kD,GAC7B+I,EAAO87C,eAAe,QAAS9kD,GAC/BgJ,EAAO87C,eAAe,QAAS5kD,EACjC,CACF,iBAAAtE,GCrGAA,EAAOhE,QAAU,WACf,MAAM,IAAIwR,MAAM,gDAClB,iBAAAxN,EAAAoN,EAAAzJ,GAAA,aCEA,IAAIsJ,EAWA3Q,EAAiBqH,EAAA,MAAAO,EACjBhI,EAAmBI,EAAemsN,iBAClC56M,EAAuBvR,EAAegqN,qBAE1C,SAASp5M,EAAKlN,GAEZ,GAAIA,EAAK,MAAMA,CACjB,CAMA,SAASgO,EAAUhO,EAAQoN,EAAS9Q,EAASJ,GAC3CA,EAvBF,SAAc8D,GACZ,IAAIoN,GAAA,EACJ,OAAO,WACDA,IACJA,GAAA,EACApN,EAAS0hB,WAAA,EAAcpjB,WACzB,CACF,CAPA,CAuBkBpC,GAChB,IAAIgR,GAAA,EACJlN,EAAOoyB,GAAG,SAAS,WACjBllB,GAAA,CACF,aACID,IAAmBA,EAAMtJ,EAAQ,OACrCsJ,EAAIjN,EAAQ,CACV0yM,SAAUtlM,EACVguH,SAAU9+H,IACT,SAAU0D,GACX,GAAIA,EAAK,OAAO9D,EAAS8D,GACzBkN,GAAA,EACAhR,GACF,IACA,IAAI8R,GAAA,EACJ,OAAO,SAAUZ,GACf,IAAIF,IACAc,EAGJ,OAFAA,GAAA,EAvBJ,SAAmBhO,GACjB,OAAOA,EAAOwoN,WAAqC,mBAAjBxoN,EAAOoK,KAC3C,CAFA,CAyBkBpK,GAAgBA,EAAOoK,QACP,mBAAnBpK,EAAO+yB,QAA+B/yB,EAAO+yB,eACxD72B,EAASkR,GAAO,IAAIS,EAAqB,QAC3C,CACF,CAEA,SAASpK,EAAKzD,GACZA,GACF,CAEA,SAASmE,EAAKnE,EAAMoN,GAClB,OAAOpN,EAAKqiN,KAAKj1M,EACnB,CAEA,SAAS/J,EAAYrD,GACnB,OAAKA,EAAQ3D,OAC8B,mBAAhC2D,EAAQA,EAAQ3D,OAAS,GAA0B6Q,EACvDlN,EAAQ4wB,MAFa1jB,CAG9B,CA6BAlN,EAAOhE,QA3BP,WACE,IAAK,IAAIgE,EAAO1B,UAAUjC,OAAQ+Q,EAAU,IAAI5Q,MAAMwD,GAAO2D,EAAO,EAAGA,EAAO3D,EAAM2D,IAClFyJ,EAAQzJ,GAAQrF,UAAUqF,GAG5B,IAOIsJ,EAPA3Q,EAAW+G,EAAY+J,GAG3B,GAFI5Q,MAAMC,QAAQ2Q,EAAQ,MAAKA,EAAUA,EAAQ,IAE7CA,EAAQ/Q,OAAS,EACnB,MAAM,IAAIH,EAAiB,WAI7B,IAAI2R,EAAWT,EAAQyY,KAAI,SAAU7lB,EAAQ2D,GAC3C,IAAIzH,EAAUyH,EAAIyJ,EAAQ/Q,OAAS,EAEnC,OAAO2R,EAAUhO,EAAQ9D,EADXyH,EAAI,GACyB,SAAU3D,GAC9CiN,IAAOA,EAAQjN,GAChBA,GAAK6N,EAASnE,QAAQjG,GACtBvH,IACJ2R,EAASnE,QAAQjG,GACjBnH,EAAS2Q,GACX,GACF,IACA,OAAOG,EAAQ8f,OAAO/oB,EACxB,iBAAAnE,EAAAoN,EAAAzJ,GAAA,aC5FA,IAAIsJ,EAAwBtJ,EAAA,MAAAO,EAAAwkN,sBAsB5B1oN,EAAOhE,QAAU,CACf+mN,iBAjBF,SAA0B/iN,EAAOoN,EAASzJ,EAAWrH,GACnD,IAAIJ,EALN,SAA2B8D,EAASoN,EAAUzJ,GAC5C,OAAgC,MAAzB3D,EAAQisC,cAAwBjsC,EAAQisC,cAAgB7+B,EAAWpN,EAAQ2D,GAAa,IACjG,CAFA,CAK8ByJ,EAAS9Q,EAAUqH,GAE/C,GAAW,MAAPzH,EAAa,CACf,IAAMuS,SAASvS,IAAQ0S,KAAK2Q,MAAMrjB,KAASA,GAAQA,EAAM,EAEvD,MAAM,IAAI+Q,EADC3Q,EAAWqH,EAAY,gBACIzH,GAGxC,OAAO0S,KAAK2Q,MAAMrjB,EACpB,CAGA,OAAO8D,EAAMqjN,WAAa,GAAK,KACjC,kBAAArjN,EAAAoN,EAAAzJ,GCtBA3D,EAAOhE,QAAU2H,EAAjB,MAAA2lD,YAAA,gBAAAtpD,EAAAoN,EAAAzJ,GAAA,aCyBA,IAAIsJ,EAAStJ,EAAA,MAAA00L,OAGT/7L,EAAa2Q,EAAOwrL,YAAc,SAAUz4L,GAE9C,QADAA,EAAW,GAAKA,IACIA,EAAS4J,eAC3B,IAAK,MAAM,IAAK,OAAO,IAAK,QAAQ,IAAK,QAAQ,IAAK,SAAS,IAAK,SAAS,IAAK,OAAO,IAAK,QAAQ,IAAK,UAAU,IAAK,WAAW,IAAK,MACxI,OAAO,EACT,QACE,OAAO,EAEb,EA0CA,SAAS1N,EAAc8D,GAErB,IAAIoN,EACJ,OAFAkJ,KAAKqjG,SAXP,SAA2B35G,GACzB,IAAIoN,EA/BN,SAA4BpN,GAC1B,IAAKA,EAAK,MAAO,OAEjB,IADA,IAAIoN,IAEF,OAAQpN,GACN,IAAK,OACL,IAAK,QACH,MAAO,OACT,IAAK,OACL,IAAK,QACL,IAAK,UACL,IAAK,WACH,MAAO,UACT,IAAK,SACL,IAAK,SACH,MAAO,SACT,IAAK,SACL,IAAK,QACL,IAAK,MACH,OAAOA,EACT,QACE,GAAIoN,EAAS,OACbpN,GAAO,GAAKA,GAAK4J,cACjBwD,GAAA,EAGR,CA1BA,CA+BgCpN,GAC9B,GAAoB,iBAAToN,IAAsBH,EAAOwrL,aAAen8L,IAAeA,EAAW0D,IAAO,MAAM,IAAIwN,MAAM,qBAAuBxN,GAC/H,OAAOoN,GAAQpN,CACjB,CAJA,CAWoCA,GAE1BsW,KAAKqjG,UACX,IAAK,UACHrjG,KAAKyN,KAAO/V,EACZsI,KAAKwC,IAAMrV,EACX2J,EAAK,EACL,MACF,IAAK,OACHkJ,KAAKqyM,SAAWz7M,EAChBE,EAAK,EACL,MACF,IAAK,SACHkJ,KAAKyN,KAAO5f,EACZmS,KAAKwC,IAAMzV,EACX+J,EAAK,EACL,MACF,QAGE,OAFAkJ,KAAKoiL,MAAQr0L,OACbiS,KAAKwC,IAAM1U,GAGfkS,KAAKsyM,SAAW,EAChBtyM,KAAKuyM,UAAY,EACjBvyM,KAAKwyM,SAAW77M,EAAOmsL,YAAYhsL,EACrC,CAmCA,SAASS,EAAc7N,GACrB,OAAIA,GAAQ,IAAa,EAAWA,GAAQ,GAAM,EAAa,EAAWA,GAAQ,GAAM,GAAa,EAAWA,GAAQ,GAAM,GAAa,EACpIA,GAAQ,GAAM,GAAQ,GAAK,CACpC,CA0DA,SAASkN,EAAalN,GACpB,IAAIoN,EAAIkJ,KAAKuyM,UAAYvyM,KAAKsyM,SAC1BjlN,EAtBN,SAA6B3D,EAAMoN,GACjC,GAAwB,MAAV,IAATA,EAAI,IAEP,OADApN,EAAK4oN,SAAW,EACT,SAET,GAAI5oN,EAAK4oN,SAAW,GAAKx7M,EAAI/Q,OAAS,EAAG,CACvC,GAAwB,MAAV,IAAT+Q,EAAI,IAEP,OADApN,EAAK4oN,SAAW,EACT,SAET,GAAI5oN,EAAK4oN,SAAW,GAAKx7M,EAAI/Q,OAAS,GACZ,MAAV,IAAT+Q,EAAI,IAEP,OADApN,EAAK4oN,SAAW,EACT,QAGb,CACF,CAjBA,CAsB8BtyM,KAAMtW,GAClC,gBAAI2D,EAAwBA,EACxB2S,KAAKsyM,UAAY5oN,EAAI3D,QACvB2D,EAAI42D,KAAKtgD,KAAKwyM,SAAU17M,EAAG,EAAGkJ,KAAKsyM,UAC5BtyM,KAAKwyM,SAAS9rN,SAASsZ,KAAKqjG,SAAU,EAAGrjG,KAAKuyM,aAEvD7oN,EAAI42D,KAAKtgD,KAAKwyM,SAAU17M,EAAG,EAAGpN,EAAI3D,aAClCia,KAAKsyM,UAAY5oN,EAAI3D,QACvB,CA0BA,SAAS2R,EAAUhO,EAAKoN,GACtB,IAAKpN,EAAI3D,OAAS+Q,GAAK,GAAM,EAAG,CAC9B,IAAIzJ,EAAI3D,EAAIhD,SAAS,UAAWoQ,GAChC,GAAIzJ,EAAG,CACL,IAAIsJ,EAAItJ,EAAEmc,WAAWnc,EAAEtH,OAAS,GAChC,GAAI4Q,GAAK,OAAUA,GAAK,MAKtB,OAJAqJ,KAAKsyM,SAAW,EAChBtyM,KAAKuyM,UAAY,EACjBvyM,KAAKwyM,SAAS,GAAK9oN,EAAIA,EAAI3D,OAAS,GACpCia,KAAKwyM,SAAS,GAAK9oN,EAAIA,EAAI3D,OAAS,GAC7BsH,EAAE+S,MAAM,GAAI,EAEvB,CACA,OAAO/S,CACT,CAIA,OAHA2S,KAAKsyM,SAAW,EAChBtyM,KAAKuyM,UAAY,EACjBvyM,KAAKwyM,SAAS,GAAK9oN,EAAIA,EAAI3D,OAAS,GAC7B2D,EAAIhD,SAAS,UAAWoQ,EAAGpN,EAAI3D,OAAS,EACjD,CAIA,SAASoH,EAASzD,GAChB,IAAIoN,EAAIpN,GAAOA,EAAI3D,OAASia,KAAKoiL,MAAM14L,GAAO,GAC9C,GAAIsW,KAAKsyM,SAAU,CACjB,IAAIjlN,EAAM2S,KAAKuyM,UAAYvyM,KAAKsyM,SAChC,OAAOx7M,EAAIkJ,KAAKwyM,SAAS9rN,SAAS,UAAW,EAAG2G,EAClD,CACA,OAAOyJ,CACT,CAEA,SAASjJ,EAAWnE,EAAKoN,GACvB,IAAIzJ,GAAK3D,EAAI3D,OAAS+Q,GAAK,EAC3B,OAAU,IAANzJ,EAAgB3D,EAAIhD,SAAS,SAAUoQ,IAC3CkJ,KAAKsyM,SAAW,EAAIjlN,EACpB2S,KAAKuyM,UAAY,EACP,IAANllN,EACF2S,KAAKwyM,SAAS,GAAK9oN,EAAIA,EAAI3D,OAAS,IAEpCia,KAAKwyM,SAAS,GAAK9oN,EAAIA,EAAI3D,OAAS,GACpCia,KAAKwyM,SAAS,GAAK9oN,EAAIA,EAAI3D,OAAS,IAE/B2D,EAAIhD,SAAS,SAAUoQ,EAAGpN,EAAI3D,OAASsH,GAChD,CAEA,SAASN,EAAUrD,GACjB,IAAIoN,EAAIpN,GAAOA,EAAI3D,OAASia,KAAKoiL,MAAM14L,GAAO,GAC9C,OAAIsW,KAAKsyM,SAAiBx7M,EAAIkJ,KAAKwyM,SAAS9rN,SAAS,SAAU,EAAG,EAAIsZ,KAAKsyM,UACpEx7M,CACT,CAGA,SAAS/I,EAAYrE,GACnB,OAAOA,EAAIhD,SAASsZ,KAAKqjG,SAC3B,CAEA,SAASv1G,EAAUpE,GACjB,OAAOA,GAAOA,EAAI3D,OAASia,KAAKoiL,MAAM14L,GAAO,EAC/C,CA1NAoN,EAAQF,EAAgBhR,EA6BxBA,EAAca,UAAU27L,MAAQ,SAAU14L,GACxC,GAAmB,IAAfA,EAAI3D,OAAc,MAAO,GAC7B,IAAI+Q,EACAzJ,EACJ,GAAI2S,KAAKsyM,SAAU,CAEjB,QAAI,KADJx7M,EAAIkJ,KAAKqyM,SAAS3oN,IACG,MAAO,GAC5B2D,EAAI2S,KAAKsyM,SACTtyM,KAAKsyM,SAAW,CAClB,MACEjlN,EAAI,EAEN,OAAIA,EAAI3D,EAAI3D,OAAe+Q,EAAIA,EAAIkJ,KAAKyN,KAAK/jB,EAAK2D,GAAK2S,KAAKyN,KAAK/jB,EAAK2D,GAC/DyJ,GAAK,EACd,EAEAlR,EAAca,UAAU+b,IAwGxB,SAAiB9Y,GACf,IAAIoN,EAAIpN,GAAOA,EAAI3D,OAASia,KAAKoiL,MAAM14L,GAAO,GAC9C,OAAIsW,KAAKsyM,SAAiBx7M,EAAI,SACvBA,CACT,EAzGAlR,EAAca,UAAUgnB,KA0FxB,SAAkB/jB,EAAKoN,GACrB,IAAIzJ,EArEN,SAA6B3D,EAAMoN,EAAKzJ,GACtC,IAAIsJ,EAAIG,EAAI/Q,OAAS,EACrB,GAAI4Q,EAAItJ,EAAG,OAAO,EAClB,IAAIrH,EAAKuR,EAAcT,EAAIH,IAC3B,OAAI3Q,GAAM,GACJA,EAAK,IAAG0D,EAAK4oN,SAAWtsN,EAAK,GAC1BA,KAEH2Q,EAAItJ,IAAa,IAARrH,EAAkB,GACjCA,EAAKuR,EAAcT,EAAIH,MACb,GACJ3Q,EAAK,IAAG0D,EAAK4oN,SAAWtsN,EAAK,GAC1BA,KAEH2Q,EAAItJ,IAAa,IAARrH,EAAkB,GACjCA,EAAKuR,EAAcT,EAAIH,MACb,GACJ3Q,EAAK,IACI,IAAPA,EAAUA,EAAK,EAAO0D,EAAK4oN,SAAWtsN,EAAK,GAE1CA,GAEF,CACT,CAvBA,CAqEkCga,KAAMtW,EAAKoN,GAC3C,IAAKkJ,KAAKsyM,SAAU,OAAO5oN,EAAIhD,SAAS,OAAQoQ,GAChDkJ,KAAKuyM,UAAYllN,EACjB,IAAIsJ,EAAMjN,EAAI3D,QAAUsH,EAAQ2S,KAAKsyM,UAErC,OADA5oN,EAAI42D,KAAKtgD,KAAKwyM,SAAU,EAAG77M,GACpBjN,EAAIhD,SAAS,OAAQoQ,EAAGH,EACjC,EA9FA/Q,EAAca,UAAU4rN,SAAW,SAAU3oN,GAC3C,GAAIsW,KAAKsyM,UAAY5oN,EAAI3D,OAEvB,OADA2D,EAAI42D,KAAKtgD,KAAKwyM,SAAUxyM,KAAKuyM,UAAYvyM,KAAKsyM,SAAU,EAAGtyM,KAAKsyM,UACzDtyM,KAAKwyM,SAAS9rN,SAASsZ,KAAKqjG,SAAU,EAAGrjG,KAAKuyM,WAEvD7oN,EAAI42D,KAAKtgD,KAAKwyM,SAAUxyM,KAAKuyM,UAAYvyM,KAAKsyM,SAAU,EAAG5oN,EAAI3D,QAC/Dia,KAAKsyM,UAAY5oN,EAAI3D,MACvB,iBAAA2D,EAAAoN,EAAAzJ,GCvIA,IAAAsJ,GAUA,SAAW3Q,EAAQJ,GAEf,aAOA,IAGI2R,EAAc,WACdX,EAAc,YACdc,EAAc,SACdvK,EAAc,SACdU,EAAc,QACdd,EAAc,QACdgB,EAAc,OACdD,EAAc,OACdE,EAAc,SACdR,EAAc,UACdJ,EAAc,eACdoH,EAAc,UACd4D,EAAc,SACd2W,EAAc,SACdjP,EAAc,UACdtH,EAAc,WACdE,EAAc,WAGd7S,EAAU,SACV4W,EAAU,QACVgD,EAAU,OACVL,EAAa,aACbQ,EAAU,UACVgD,EAAU,SAEV/C,EAAU,UACVF,EAAU,SACVgD,EAAU,SACVZ,EAAU,KACVf,EAAY,YACZ7E,EAAY,WACZ8E,EAAU,QACV1M,EAAU,UACVvH,EAAU,QACV6V,EAAU,OACVqX,EAAU,SACVpX,EAAU,QACVU,EAAc,WACd5V,EAAc,cACdujB,EAAU,SAiBVzH,EAAY,SAAUhgB,GAElB,IADA,IAAIoN,EAAQ,CAAC,EACJzJ,EAAE,EAAGA,EAAE3D,EAAI3D,OAAQsH,IACxByJ,EAAMpN,EAAI2D,GAAGuE,eAAiBlI,EAAI2D,GAEtC,OAAOyJ,CACX,EACAqP,EAAM,SAAUzc,EAAMoN,GAClB,cAAcpN,IAASyD,IAAuD,IAA5Ckc,EAASvS,GAAM3E,QAAQkX,EAAS3f,GACtE,EACA2f,EAAW,SAAU3f,GACjB,OAAOA,EAAI4J,aACf,EAIAsS,EAAO,SAAUlc,EAAKoN,GAClB,UAAUpN,IAAUyD,EAEhB,OADAzD,EAAMA,EAAIwC,QAAQ,SA7EZ,WA8EO4K,IAAUF,EAAalN,EAAMA,EAAImO,UAAU,EA3DhD,IA6DpB,EAMImS,EAAY,SAAUtgB,EAAIoN,GAKtB,IAHA,IAAWzJ,EAAGsJ,EAAG3Q,EAAG4Q,EAAGzJ,EAASU,EAA5Bd,EAAI,EAGDA,EAAI+J,EAAO/Q,SAAWoH,GAAS,CAElC,IAAIY,EAAQ+I,EAAO/J,GACfe,EAAQgJ,EAAO/J,EAAI,GAIvB,IAHAM,EAAIsJ,EAAI,EAGDtJ,EAAIU,EAAMhI,SAAWoH,GAEnBY,EAAMV,IAGX,GAFAF,EAAUY,EAAMV,KAAKoK,KAAK/N,GAGtB,IAAK1D,EAAI,EAAGA,EAAI8H,EAAM/H,OAAQC,IAC1B6H,EAAQV,IAAUwJ,UAClBC,EAAI9I,EAAM9H,MAEO0R,GAAYd,EAAE7Q,OAAS,EACnB,IAAb6Q,EAAE7Q,cACS6Q,EAAE,IAAMW,EAEfyI,KAAKpJ,EAAE,IAAMA,EAAE,GAAGhQ,KAAKoZ,KAAMnS,GAG7BmS,KAAKpJ,EAAE,IAAMA,EAAE,GAEC,IAAbA,EAAE7Q,cAEE6Q,EAAE,KAAOW,GAAeX,EAAE,GAAGa,MAAQb,EAAE,GAAGrL,KAKjDyU,KAAKpJ,EAAE,IAAM/I,EAAQA,EAAM3B,QAAQ0K,EAAE,GAAIA,EAAE,IAAMhR,EAHjDoa,KAAKpJ,EAAE,IAAM/I,EAAQ+I,EAAE,GAAGhQ,KAAKoZ,KAAMnS,EAAO+I,EAAE,IAAMhR,EAKpC,IAAbgR,EAAE7Q,SACLia,KAAKpJ,EAAE,IAAM/I,EAAQ+I,EAAE,GAAGhQ,KAAKoZ,KAAMnS,EAAM3B,QAAQ0K,EAAE,GAAIA,EAAE,KAAOhR,GAG1Eoa,KAAKpJ,GAAK/I,GAAgBjI,EAK1CmH,GAAK,CACT,CACJ,EAEA0c,EAAY,SAAU/f,EAAKoN,GAEvB,IAAK,IAAIzJ,KAAKyJ,EAEV,UAAWA,EAAIzJ,KAAOqK,GAAYZ,EAAIzJ,GAAGtH,OAAS,GAC9C,IAAK,IAAI4Q,EAAI,EAAGA,EAAIG,EAAIzJ,GAAGtH,OAAQ4Q,IAC/B,GAAIwP,EAAIrP,EAAIzJ,GAAGsJ,GAAIjN,GACf,MAjJN,MAiJc2D,EAAiBzH,EAAYyH,OAG1C,GAAI8Y,EAAIrP,EAAIzJ,GAAI3D,GACnB,MArJE,MAqJM2D,EAAiBzH,EAAYyH,EAG7C,OAAO3D,CACf,EAiBIqgB,EAAoB,CAChB0oM,GAAc,OACd,UAAc,SACd,SAAc,QACd,IAAc,SACdC,GAAc,CAAC,SAAU,UACzBC,MAAc,SACd,EAAc,SACd,EAAc,SACd,IAAc,SACd,GAAc,CAAC,SAAU,WACzBC,GAAc,OAOlB3oM,EAAU,CAEVsgJ,QAAU,CAAC,CAEP,gCACG,CAAC/8J,EAAS,CAACO,EAAM,WAAY,CAChC,+BACG,CAACP,EAAS,CAACO,EAAM,SAAU,CAG9B,4BACA,mDACA,2CACG,CAACA,EAAMP,GAAU,CACpB,yBACG,CAACA,EAAS,CAACO,EAAMkT,EAAM,UAAW,CACrC,qBACG,CAACzT,EAAS,CAACO,EAAMkT,IAAS,CAG7B,0DACG,CAACzT,EAAS,CAACO,EAAM,UAAW,CAC/B,uBACA,8DAEA,uDACA,2BAGA,+LAEA,kCACA,uBACG,CAACA,EAAMP,GAAU,CACpB,qDACG,CAACA,EAAS,CAACO,EAAM,KAAK6R,IAAW,CACpC,+BACA,+BACA,8BACG,CAACpS,EAAS,CAACO,EAAM,WAAY,CAChC,yBACG,CAACP,EAAS,CAACO,EAAM,cAAe,CACnC,+CACG,CAACP,EAAS,CAACO,EAAM,OAAQ,CAC5B,oCACG,CAACP,EAAS,CAACO,EAAM,WAAY,CAChC,yBACG,CAACP,EAAS,CAACO,EAAM,gBAAgB6R,IAAW,CAC/C,2BACG,CAAC,CAAC7R,EAAM,OAAQ,aAAa6R,GAAUpS,GAAU,CACpD,uBACG,CAACA,EAAS,CAACO,EAAM8R,EAAQ,WAAY,CACxC,qBACG,CAACrS,EAAS,CAACO,EAAMkT,EAAM,WAAY,CACtC,0BACG,CAACzT,EAAS,CAACO,EAAM,YAAa,CACjC,sBACG,CAACP,EAAS,CAACO,EAAM,YAAa,CACjC,qBACG,CAACP,EAAS,CAACO,EAAMkT,EAAM,WAAY,CACtC,2BACG,CAACzT,EAAS,CAACO,EAAM,QAAQ6R,IAAW,CACvC,sBACG,CAACpS,EAAS,CAACO,EAAM8R,IAAW,CAC/B,iCACG,CAAC,CAAC9R,EAAM,OAAS6R,IAAW,CAC/B,oDACG,CAAC,CAAC7R,EAAM,OAAQ,MAAQ6R,GAAUpS,GAAU,CAC/C,8BACG,CAACA,EAAS,CAACO,EAAMwG,EAAU,cAAe,CAC7C,+BACG,CAAC,CAACxG,EAAM,KAAM,KAAMP,GAAU,CACjC,0BACG,CAACA,EAAS,CAACO,EAAM,mBAAoB,CACxC,4BACG,CAAC,CAACA,EAAM,gBAAiBP,GAAU,CACtC,gCACA,iDACA,8CACG,CAACO,EAAMP,GAAU,CACpB,eACA,sBACG,CAACO,GAAO,CAGX,+DACG,CAAC,CAACA,EAAMyV,GAAWhW,GAAU,CAChC,uBACA,uCACA,kCACA,4BACA,4BACA,6BACA,iDACG,CAACO,EAAMP,GAAU,CACpB,gCACG,CAACA,EAAS,CAACO,EAAM,QAAS,CAC7B,8CACG,CAACP,EAAS,CAACO,EAAM,WAAY,CAEhC,oCACG,CAACP,EAAS,CAACO,EAAM6U,EAAO,cAAe,CAE1C,+BACG,CAAC,CAAC7U,EAAM6U,EAAO,YAAapV,GAAU,CAEzC,2DACG,CAACA,EAAS,CAACO,EAAM,WAAW6R,IAAW,CAE1C,+DACG,CAAC7R,EAAMP,GAAU,CAEpB,gDACG,CAACA,EAAS,CAACO,EAAM,kBAAmB,CACvC,sDACG,CAACP,EAASO,GAAO,CACpB,gDACG,CAACA,EAAM,CAACP,EAASic,EAjJT,CACX,MAAU,KACV,IAAU,KACV,IAAU,KACV,MAAU,OACV,QAAU,OACV,QAAU,OACV,QAAU,OACV,IAAU,OAyIqC,CAE/C,8BACG,CAAC1b,EAAMP,GAAU,CAGpB,wCACG,CAAC,CAACO,EAAM,YAAaP,GAAU,CAClC,uCACG,CAACA,EAAS,CAACO,EAAM8R,EAAQ,aAAc,CAC1C,6BACA,cACA,mGAEA,+FAEA,wBACA,2CAGA,wHAEA,uBACA,sBACG,CAAC9R,EAAMP,GAAU,CAEpB,wBACG,CAACO,EAAM,CAACP,EAAS,eAAgB,MAGxCqlN,IAAM,CAAC,CAEH,iDACG,CAAC,CAACzlN,EAAc,UAAW,CAE9B,gBACG,CAAC,CAACA,EAAcic,IAAY,CAE/B,0BACG,CAAC,CAACjc,EAAc,SAAU,CAE7B,oCACG,CAAC,CAACA,EAAc,UAAW,CAE9B,mCACG,CAAC,CAACA,EAAc,UAAW,CAG9B,8BACG,CAAC,CAACA,EAAc,QAAS,CAE5B,0CACG,CAAC,CAACA,EAAc,OAtWT,GAsWwBic,IAAY,CAE9C,kBACG,CAAC,CAACjc,EAAc,UAAW,CAE9B,2HAEG,CAAC,CAACA,EAAcic,KAGvBypM,OAAS,CAAC,CAON,mFACG,CAAC/lN,EAAO,CAACiB,EAAQuG,GAAU,CAACzG,EAAMihB,IAAU,CAC/C,yDACA,uBACA,iBACG,CAAChiB,EAAO,CAACiB,EAAQuG,GAAU,CAACzG,EAAMsK,IAAU,CAG/C,4CACG,CAACrL,EAAO,CAACiB,EAAQyO,GAAQ,CAAC3O,EAAMsK,IAAU,CAC7C,6BACA,oCACA,kCACG,CAACrL,EAAO,CAACiB,EAAQyO,GAAQ,CAAC3O,EAAMihB,IAAU,CAC7C,iBACG,CAAChiB,EAAO,CAACiB,EAAQyO,IAAS,CAG7B,iCACG,CAAC1P,EAAO,CAACiB,EAAQhB,GAAQ,CAACc,EAAMsK,IAAU,CAG7C,+DACG,CAACrL,EAAO,CAACiB,EAAQ2U,GAAS,CAAC7U,EAAMihB,IAAU,CAC9C,kCACA,sEACG,CAAChiB,EAAO,CAACiB,EAAQ2U,GAAS,CAAC7U,EAAMsK,IAAU,CAG9C,kDACA,yBACA,uCACA,iDACA,4DACA,yGACG,CAAC,CAACrL,EAAO,KAAM,KAAM,CAACiB,EAAQksB,GAAS,CAACpsB,EAAMsK,IAAU,CAC3D,+CACA,8CACE,CAAC,CAACrL,EAAO,KAAM,KAAM,CAACiB,EAAQksB,GAAS,CAACpsB,EAAMihB,IAAU,CAG1D,sBACA,mEACG,CAAChiB,EAAO,CAACiB,EAAQ,QAAS,CAACF,EAAMsK,IAAU,CAG9C,yBACA,oCACG,CAACrL,EAAO,CAACiB,EAAQ,QAAS,CAACF,EAAMsK,IAAU,CAG9C,mCACG,CAACrL,EAAO,CAACiB,EAAQ,UAAW,CAACF,EAAMsK,IAAU,CAGhD,iFACA,4BACA,sDACG,CAACrL,EAAO,CAACiB,EAAQmO,GAAW,CAACrO,EAAMsK,IAAU,CAChD,qCACG,CAACrL,EAAO,CAACiB,EAAQmO,GAAW,CAACrO,EAAMihB,IAAU,CAGhD,iEACG,CAAChiB,EAAO,CAACiB,EAAQ+T,GAAK,CAACjU,EAAMihB,IAAU,CAC1C,sDACA,oDACA,wBACG,CAAChiB,EAAO,CAACiB,EAAQ+T,GAAK,CAACjU,EAAMsK,IAAU,CAG1C,oBACA,qEACG,CAACrL,EAAO,CAACiB,EAAQ,UAAW,CAACF,EAAMihB,IAAU,CAGhD,qCACA,0BACG,CAAC,CAAChiB,EAAO,KAAM,KAAM,CAACiB,EAAQ,SAAU,CAACF,EAAMsK,IAAU,CAG5D,gBACG,CAACrL,EAAO,CAACiB,EAAQ2R,GAAS,CAAC7R,EAAMihB,IAAU,CAC9C,6CACG,CAAChiB,EAAO,CAACiB,EAAQ2R,GAAS,CAAC7R,EAAMsK,IAAU,CAG9C,0GACG,CAACrL,EAAO,CAACiB,EAAQ6U,GAAO,CAAC/U,EAAMsK,IAAU,CAC5C,oBACA,iCACG,CAAC,CAACrL,EAAO,iBAAkB,CAACiB,EAAQ6U,GAAO,CAAC/U,EAAMihB,IAAU,CAG/D,sCACA,0CACG,CAAChiB,EAAO,CAACiB,EAAQ,WAAY,CAACF,EAAMsK,IAAU,CAGjD,eACA,uCACA,gCACG,CAACrL,EAAO,CAACiB,EAAQnI,GAAS,CAACiI,EAAMihB,IAAU,CAC9C,iDACG,CAAC,CAAChiB,EAAO,QAAS,iBAAkB,CAACiB,EAAQnI,GAAS,CAACiI,EAAMsK,IAAU,CAG1E,gCACG,CAACrL,EAAOiB,EAAQ,CAACF,EAAMihB,IAAU,CACpC,gCACA,kBACG,CAAChiB,EAAO,CAACiB,EAAQoR,GAAa,CAACtR,EAAMsK,IAAU,CAGlD,qFACG,CAACrL,EAAO,CAACiB,EAAQyR,GAAO,CAAC3R,EAAMihB,IAAU,CAC5C,iDACG,CAAChiB,EAAO,CAACiB,EAAQyR,GAAO,CAAC3R,EAAMsK,IAAU,CAG5C,cACG,CAACrL,EAAO,CAACiB,EAAQ,OAAQ,CAACF,EAAMihB,IAAU,CAC7C,2CAGA,oCACA,iFACG,CAAC/gB,EAAQ,CAACjB,EAAO,KAAM,KAAM,CAACe,EAAMsK,IAAU,CAGjD,uCACG,CAACrL,EAAO,CAACiB,EAAQ,QAAS,CAACF,EAAMihB,IAAU,CAG9C,8BACA,qBACG,CAAChiB,EAAO,CAACiB,EAAQ,SAAU,CAACF,EAAMsK,IAAU,CAG/C,kDACG,CAACrL,EAAO,CAACiB,EAAQ,WAAY,CAACF,EAAMsK,IAAU,CAGjD,gHAEA,mBACA,iBACA,8BACA,0BACA,WACA,yBACG,CAACpK,EAAQjB,EAAO,CAACe,EAAMsK,IAAU,CAEpC,2BACA,wBACA,uCACA,uBACA,4BACA,iCACA,kCACA,8BACA,gCACA,mCACG,CAACpK,EAAQjB,EAAO,CAACe,EAAMihB,IAAU,CAEpC,kBACG,CAAChiB,EAAO,CAACiB,EAAQgT,GAAY,CAAClT,EAAMihB,IAAU,CACjD,qCACG,CAAChiB,EAAO,CAACiB,EAAQ,aAAc,CAACF,EAAMsK,IAAU,CACnD,aACG,CAACrL,EAAO,CAACiB,EAAQ,QAAS,CAACF,EAAMsK,IAAU,CAC9C,gBACG,CAACrL,EAAO,CAACiB,EAAQ,WAAY,CAACF,EAAMsK,IAAU,CACjD,iBACG,CAACrL,EAAO,CAACiB,EAAQ,OAAQ,CAACF,EAAMihB,IAAU,CAC7C,0BACG,CAAChiB,EAAO,CAACiB,EAAQ,QAAS,CAACF,EAAMihB,IAAU,CAC9C,wBACG,CAAChiB,EAAO,CAACiB,EAAQ,WAAY,CAACF,EAAMihB,IAAU,CACjD,+CACG,CAAChiB,EAAO,CAACiB,EAAQ,kBAAmB,CAACF,EAAMihB,IAAU,CACxD,qBACG,CAAChiB,EAAO,CAACiB,EAAQ,YAAa,CAACF,EAAMihB,IAAU,CAClD,cACG,CAAChiB,EAAO,CAACiB,EAAQ,OAAQ,CAACF,EAAMihB,IAAU,CAC7C,mBACG,CAAChiB,EAAO,CAACiB,EAAQ,OAAQ,CAACF,EAAMsK,IAAU,CAC7C,wBACG,CAACrL,EAAO,CAACiB,EAAQ,SAAU,CAACF,EAAMsK,IAAU,CAC/C,mBACG,CAACrL,EAAO,CAACiB,EAAQ,SAAU,CAACF,EAAMihB,IAAU,CAC/C,wBACG,CAAChiB,EAAO,CAACiB,EAAQ,QAAS,CAACF,EAAMihB,IAAU,CAC9C,mBACA,sCACG,CAAC,CAAC/gB,EAAQ,gBAAiBjB,EAAO,CAACe,EAAMihB,IAAU,CACtD,sBACG,CAAChiB,EAAO,CAACiB,EAAQ,YAAa,CAACF,EAAMihB,IAAU,CAClD,8BACG,CAAChiB,EAAO,CAACiB,EAAQ,YAAa,CAACF,EAAMihB,IAAU,CAClD,oDACG,CAAC,CAAC/gB,EAAQ,SAAUjB,EAAO,CAACe,EAAMsK,IAAU,CAC/C,2BACG,CAAC,CAACpK,EAAQ,SAAUjB,EAAO,CAACe,EAAMsK,IAAU,CAC/C,cACG,CAACrL,EAAO,CAACiB,EAAQ,aAAc,CAACF,EAAMsK,IAAU,CACnD,uCACG,CAACrL,EAAO,CAACiB,EAAQ,WAAY,CAACF,EAAMihB,IAAU,CACjD,wBACG,CAAChiB,EAAO,CAACiB,EAAQ,aAAc,CAACF,EAAMihB,IAAU,CACnD,kBACG,CAAChiB,EAAO,CAACiB,EAAQ,SAAU,CAACF,EAAMihB,IAAU,CAC/C,qBACG,CAAChiB,EAAO,CAACiB,EAAQ,UAAW,CAACF,EAAMihB,IAAU,CAChD,mBACG,CAAC/gB,EAAQjB,EAAO,CAACe,EAAMsK,IAAU,CACpC,sBACG,CAAC,CAACrL,EAAO,MAAO,KAAM,CAACiB,EAAQgT,GAAY,CAAClT,EAAMsK,IAAU,CAC/D,yDACG,CAACrL,EAAO,CAACiB,EAAQ8U,GAAQ,CAAChV,EAAMihB,IAAU,CAC7C,yCACG,CAAChiB,EAAO,CAACiB,EAAQ8U,GAAQ,CAAChV,EAAMsK,IAAU,CAM7C,wBACG,CAACpK,EAAQ,CAACF,EAAMgS,IAAW,CAC9B,uBACG,CAAC,CAAC/S,EAAO,IAAK,WAAY,CAACiB,EAAQuG,GAAU,CAACzG,EAAMgS,IAAW,CAClE,8DACG,CAAC,CAAC9R,EAAQ+T,GAAK,CAACjU,EAAMgS,IAAW,CACpC,gBACG,CAAC9R,EAAQ,CAACjB,EAAO0P,EAAM,OAAQ,CAAC3O,EAAMgS,IAAW,CACpD,UACG,CAAC,CAAC/S,EAAO6V,EAAO,QAAS,CAAC5U,EAAQ2R,GAAS,CAAC7R,EAAMgS,IAAW,CAChE,6BACG,CAAC/S,EAAO,CAACiB,EAAQnI,GAAS,CAACiI,EAAMgS,IAAW,CAC/C,uBACA,uBACG,CAAC/S,EAAO,CAACiB,EAAQhB,GAAQ,CAACc,EAAMgS,IAAU,CAC7C,4BACG,CAAC/S,EAAO,CAACiB,EAAQ6U,GAAO,CAAC/U,EAAMgS,IAAW,CAC7C,qBACG,CAAC/S,EAAO,CAACiB,EAAQksB,GAAS,CAACpsB,EAAMgS,IAAW,CAC/C,6BACG,CAAC9R,EAAQjB,EAAO,CAACe,EAAMgS,IAAW,CACrC,0CACA,6DACG,CAAC,CAAC9R,EAAQ4X,GAAO,CAAC7Y,EAAO6Y,GAAO,CAAC9X,EAAMgS,IAAW,CACrD,mDACG,CAAC,CAAChS,EAAMgS,IAAW,CAMtB,UACA,8BACG,CAAC9R,EAAQjB,EAAO,CAACe,EAAM0G,IAAW,CACrC,0BACG,CAACzH,EAAO,CAACiB,EAAQ,UAAW,CAACF,EAAM0G,IAAW,CACjD,mCACG,CAACzH,EAAO,CAACiB,EAAQ6U,GAAO,CAAC/U,EAAM0G,IAAW,CAC7C,sCACG,CAACzH,EAAO,CAACiB,EAAQgT,GAAY,CAAClT,EAAM0G,IAAW,CAMlD,kBACG,CAACxG,EAAQjB,EAAO,CAACe,EAAM0K,IAAY,CACtC,wCACG,CAACzL,EAAO,CAACiB,EAAQyO,GAAQ,CAAC3O,EAAM0K,IAAY,CAC/C,wBACG,CAACzL,EAAO,CAACiB,EAAQ2R,GAAS,CAAC7R,EAAM0K,IAAY,CAChD,6BACG,CAACzL,EAAO,CAACiB,EAAQ8U,GAAQ,CAAChV,EAAM0K,IAAY,CAC/C,sBACG,CAACzL,EAAO,CAACiB,EAAQwV,GAAW,CAAC1V,EAAM0K,IAAY,CAMlD,wCACG,CAACxK,EAAQ,CAACF,EAAM4K,IAAY,CAC/B,cACG,CAAC3L,EAAO,CAACiB,EAAQnI,GAAS,CAACiI,EAAM4K,IAAY,CAMhD,kEACG,CAAC3L,EAAO,CAACe,EAAMsK,IAAU,CAC5B,+DACG,CAACrL,EAAO,CAACe,EAAMihB,IAAU,CAC5B,gDACG,CAAC,CAACjhB,EAAMihB,IAAU,CACrB,kEACG,CAAC,CAACjhB,EAAMsK,IAAU,CACrB,kCACG,CAACrL,EAAO,CAACiB,EAAQ,aAGxB+kN,OAAS,CAAC,CAEN,8BACG,CAACvlN,EAAS,CAACO,EAAM,aAAe,CAEnC,6CACG,CAACP,EAAS,CAACO,EAAM,UAAW,CAE/B,uBACA,sEACA,0BACA,yCACA,8BACA,eACG,CAACA,EAAMP,GAAU,CAEpB,iCACG,CAACA,EAASO,IAGjBinE,GAAK,CAAC,CAGF,mCACG,CAACjnE,EAAMP,GAAU,CACpB,yDACG,CAACO,EAAM,CAACP,EAASic,EAAWM,IAAqB,CACpD,0BACA,2CACA,wCACG,CAAC,CAACvc,EAASic,EAAWM,GAAoB,CAAChc,EAAM,YAAa,CAGjE,sDACA,4CACA,wBACG,CAAC,CAACP,EAAS,KAAM,KAAM,CAACO,EAAM,QAAS,CAC1C,0BACA,yCACG,CAAC,CAACA,EAAMojB,GAAS,CAAC3jB,EAAS,KAAM,MAAO,CAG3C,kDACG,CAACA,EAASO,GAAO,CACpB,+EACA,8BACA,+BACA,kBACG,CAACA,EAAMP,GAAU,CACpB,cACG,CAACA,EAAS,CAACO,EAAMqR,IAAc,CAClC,6DACG,CAAC5R,EAAS,CAACO,EAAM,YAAa,CACjC,mFACG,CAACP,EAAS,CAACO,EAAM8R,EAAQ,QAAS,CACrC,kBACA,wCACG,CAACrS,EAAS,CAACO,EAAM,UAAW,CAC/B,wCACG,CAACP,EAAS,CAACO,EAAM,YAAa,CAGjC,qBACG,CAACP,EAAS,CAACO,EAAM6U,EAAO,SAAU,CACrC,oCACG,CAAC,CAAC7U,EAAMH,GAAcJ,GAAS,CAGlC,qBACA,iBACA,2BAGA,mDACA,2BAGA,wCACA,yBACA,4BACA,8SAEA,2BACA,oBACA,6EACA,kBACG,CAACO,EAAMP,GAAU,CACpB,yBACG,CAAC,CAACO,EAAM,WAAYP,GAAU,CACjC,sCACA,kCACA,mEACA,sBACG,CAACO,EAAMP,KAQd0c,EAAW,SAAUxgB,EAAIoN,GAOzB,UALWpN,IAAOgO,IACdZ,EAAapN,EACbA,EAAK9D,KAGHoa,gBAAgBkK,GAClB,OAAO,IAAIA,EAASxgB,EAAIoN,GAAYk8M,YAGxC,IAAI3lN,SAAqBrH,IAAW4Q,GAAc5Q,EAAOwF,UAAaxF,EAAOwF,UAAY5F,EACrF+Q,EAAMjN,IAAQ2D,GAAcA,EAAW5B,UAAa4B,EAAW5B,UA5xBrD,IA6xBV+I,EAASnH,GAAcA,EAAW4lN,cAAiB5lN,EAAW4lN,cAAgBrtN,EAC9Eka,EAAUhJ,EA9uBL,SAAUpN,EAASoN,GACxB,IAAIzJ,EAAgB,CAAC,EACrB,IAAK,IAAIsJ,KAAKjN,EACNoN,EAAWH,IAAMG,EAAWH,GAAG5Q,OAAS,GAAM,EAC9CsH,EAAcsJ,GAAKG,EAAWH,GAAGrN,OAAOI,EAAQiN,IAEhDtJ,EAAcsJ,GAAKjN,EAAQiN,GAGnC,OAAOtJ,CACX,CAVS,CA8uByB4c,EAASnT,GAAcmT,EACrDzR,EAAanL,GAAcA,EAAW5B,WAAakL,EAyEvD,OAvEAqJ,KAAKkzM,WAAa,WACd,IA1tBiBxpN,EA0tBboN,EAAW,CAAC,EAShB,OARAA,EAAS/I,GAAQnI,EACjBkR,EAAStJ,GAAW5H,EACpBokB,EAAUpjB,KAAKkQ,EAAUH,EAAKmJ,EAAQyqJ,SACtCzzJ,EAASjJ,UA9tBQnE,EA8tBUoN,EAAStJ,MA7tBTL,EAAWzD,EAAQwC,QAAQ,WAzE5C,IAyE+D6L,MAAM,KAAK,GAAKnS,EA+tBrF4S,GAAcnL,GAAcA,EAAW8lN,cAAgB9lN,EAAW8lN,MAAMC,SAAW77M,IACnFT,EAAS/I,GAAQ,SAEd+I,CACX,EACAkJ,KAAKqzM,OAAS,WACV,IAAI3pN,EAAO,CAAC,EAGZ,OAFAA,EAAK0D,GAAgBxH,EACrBokB,EAAUpjB,KAAK8C,EAAMiN,EAAKmJ,EAAQ+yM,KAC3BnpN,CACX,EACAsW,KAAKszM,UAAY,WACb,IAAI5pN,EAAU,CAAC,EAaf,OAZAA,EAAQsE,GAAUpI,EAClB8D,EAAQqD,GAASnH,EACjB8D,EAAQoE,GAAQlI,EAChBokB,EAAUpjB,KAAK8C,EAASiN,EAAKmJ,EAAQgzM,QACjCt6M,IAAe9O,EAAQoE,IAAS0G,GAASA,EAAM++M,SAC/C7pN,EAAQoE,GAAQsK,GAGhBI,GAAgC,aAAlB9O,EAAQqD,IAAyBM,UAAqBA,EAAWmmN,aAAe58M,GAAcvJ,EAAWm7G,gBAAkBn7G,EAAWm7G,eAAiB,IACrK9+G,EAAQqD,GAAS,OACjBrD,EAAQoE,GAAQihB,GAEbrlB,CACX,EACAsW,KAAKyzM,UAAY,WACb,IAAI/pN,EAAU,CAAC,EAIf,OAHAA,EAAQqE,GAAQnI,EAChB8D,EAAQ8D,GAAW5H,EACnBokB,EAAUpjB,KAAK8C,EAASiN,EAAKmJ,EAAQizM,QAC9BrpN,CACX,EACAsW,KAAK0zM,MAAQ,WACT,IAAIhqN,EAAM,CAAC,EASX,OARAA,EAAIqE,GAAQnI,EACZ8D,EAAI8D,GAAW5H,EACfokB,EAAUpjB,KAAK8C,EAAKiN,EAAKmJ,EAAQk1D,IAC7Bx8D,IAAe9O,EAAIqE,IAASyG,GAA2B,WAAlBA,EAAMm/M,WAC3CjqN,EAAIqE,GAAQyG,EAAMm/M,SACGznN,QAAQ,aAAc0B,GACtB1B,QAAQ,SAAUilB,IAEpCznB,CACX,EACAsW,KAAKgzM,UAAY,WACb,MAAO,CACH7zJ,GAAUn/C,KAAK4zM,QACfrpD,QAAUvqJ,KAAKkzM,aACfH,OAAU/yM,KAAKyzM,YACfz+I,GAAUh1D,KAAK0zM,QACfZ,OAAU9yM,KAAKszM,YACfT,IAAU7yM,KAAKqzM,SAEvB,EACArzM,KAAK4zM,MAAQ,WACT,OAAOj9M,CACX,EACAqJ,KAAK6zM,MAAQ,SAAUnqN,GAEnB,OADAiN,SAAcjN,IAAOyD,GAAYzD,EAAG3D,OAj1BxB,IAi1BkD6f,EAAKlc,EAj1BvD,KAi1B4EA,EACjFsW,IACX,EACAA,KAAK6zM,MAAMl9M,GACJqJ,IACX,EAEAkK,EAASvf,QA52BS,SA62BlBuf,EAAS4pM,QAAWpqM,EAAU,CAAC3b,EAAMP,EAASK,IAC9Cqc,EAAS6pM,IAAMrqM,EAAU,CAACtc,IAC1B8c,EAAS8pM,OAAStqM,EAAU,CAAC3c,EAAOiB,EAAQF,EAAM0G,EAAS4D,EAAQ0H,EAASiP,EAAQvW,EAAUE,IAC9FwR,EAAS+pM,OAAS/pM,EAASgqM,GAAKxqM,EAAU,CAAC3b,EAAMP,WAOvCsJ,IAAcF,GAEgBlN,EAAOhE,UACvCoR,EAAUpN,EAAOhE,QAAUwkB,GAE/BpT,EAAQo3H,SAAWhkH,GAGiB7c,EAAA8mN,MAChCx9M,EAAA,WACI,OAAOuT,CACV,EAAAtjB,KAAAkQ,EAAAzJ,EAAAyJ,EAAApN,MAAA9D,IAAA8D,EAAAhE,QAAAiR,UACa3Q,IAAW4Q,IAEzB5Q,EAAOkoI,SAAWhkH,GAS1B,IAAIC,SAAWnkB,IAAW4Q,IAAe5Q,EAAOouN,QAAUpuN,EAAOquN,OACjE,GAAIlqM,IAAMA,EAAEg1C,GAAI,CACZ,IAAIhlC,GAAS,IAAIjQ,EACjBC,EAAEg1C,GAAKhlC,GAAO64L,YACd7oM,EAAEg1C,GAAGr+C,IAAM,WACP,OAAOqZ,GAAOy5L,OAClB,EACAzpM,EAAEg1C,GAAG57C,IAAM,SAAU7Z,GACjBywB,GAAO05L,MAAMnqN,GACb,IAAIoN,EAASqjB,GAAO64L,YACpB,IAAK,IAAI3lN,KAAQyJ,EACbqT,EAAEg1C,GAAG9xD,GAAQyJ,EAAOzJ,EAE5B,CACJ,CAEH,CAv6BD,CAu6BqB,iBAAXX,OAAsBA,OAASsT,KAAA,gBAAAtW,EAAAoN,EAAAzJ,GCz3BzC,SAASsJ,EAAQjN,GAEf,IACE,IAAK2D,EAAAS,EAAOsrH,aAAc,OAAO,CAGnC,CAFE,MAAO1vH,GACP,OAAO,CACT,CACA,IAAIoN,EAAMzJ,EAAAS,EAAOsrH,aAAa1vH,GAC9B,OAAI,MAAQoN,GACyB,SAA9BoU,OAAOpU,GAAKxD,aACrB,CA7DA5J,EAAOhE,QAoBP,SAAoBgE,EAAIoN,GACtB,GAAIH,EAAO,iBACT,OAAOjN,EAGT,IAAI2D,GAAA,EAeJ,OAdA,WACE,IAAKA,EAAQ,CACX,GAAIsJ,EAAO,oBACT,MAAM,IAAIO,MAAMJ,GACPH,EAAO,oBAChBT,QAAQmJ,MAAMvI,GAEdZ,QAAQC,KAAKW,GAEfzJ,GAAA,CACF,CACA,OAAO3D,EAAG0hB,MAAMpL,KAAMhY,UACxB,CAGF,oDAAA0B,GAAA,aAAAA,EAAAhE,QAAAg7B,KAAA/F,MAAA,gyFAAAjxB,GAAA,aAAAA,EAAAhE,QAAAg7B,KAAA/F,MAAA,g+xBAAAjxB,GAAA,aAAAA,EAAAhE,QAAAg7B,KAAA/F,MAAA,yuBAAAjxB,GAAA,aAAAA,EAAAhE,QAAAg7B,KAAA/F,MAAA,+nVAAAjxB,GAAA,aAAAA,EAAAhE,QAAAg7B,KAAA/F,MAAA,+bAAAjxB,GAAA,aAAAA,EAAAhE,QAAAg7B,KAAA/F,MAAA,2GC7CI7jB,EAA2B,CAAC,EAGhC,SAASzJ,EAAoBsJ,GAE5B,IAAI3Q,EAAe8Q,EAAyBH,GAC5C,QAAI,IAAA3Q,EACH,OAAOA,EAAaN,QAGrB,IAAIE,EAASkR,EAAyBH,GAAY,CAGjDjR,QAAS,CAAC,GAOX,OAHAgE,EAAoBiN,GAAU/P,KAAKhB,EAAOF,QAASE,EAAQA,EAAOF,QAAS2H,GAGpEzH,EAAOF,OACf,CCtBA2H,EAAoB8mN,KAAO,CAAC,ECC5B9mN,EAAoBA,EAAI,SAAS3D,GAChC,IAAIoN,EAASpN,GAAUA,EAAOo9G,WAC7B,WAAa,OAAOp9G,EAAgBklB,OAAG,EACvC,WAAa,OAAOllB,CAAQ,EAE7B,OADA2D,EAAoBU,EAAE+I,EAAQ,CAAElR,EAAGkR,IAC5BA,CACR,ECNAzJ,EAAoBU,EAAI,SAASrE,EAASoN,GACzC,IAAI,IAAIH,KAAOG,EACXzJ,EAAoBkK,EAAET,EAAYH,KAAStJ,EAAoBkK,EAAE7N,EAASiN,IAC5EnQ,OAAOmC,eAAee,EAASiN,EAAK,CAAEmvD,YAAA,EAAkBhlD,IAAKhK,EAAWH,IAG3E,ECPAtJ,EAAoBS,EAAI,WACvB,GAA0B,iBAAf+wG,WAAyB,OAAOA,WAC3C,IACC,OAAO7+F,MAAQ,IAAIgyC,SAAS,cAAb,EAGhB,CAFE,MAAOtoD,GACR,GAAsB,iBAAXgD,OAAqB,OAAOA,MACxC,CACA,CAPuB,GCAxBW,EAAoBkK,EAAI,SAAS7N,EAAKoN,GAAQ,OAAOtQ,OAAOC,UAAUE,eAAeC,KAAK8C,EAAKoN,EAAO,MAAAH,EAAA,kCAAAtJ,EAAAU,EAAA4I,EAAA,CAAAiY,QAAA,kBAAA/gB,CAAA,IAAAR,EAAA,UCqGlG3D,EAAAoN,EAAAzJ,EAAA,MAAArH,EAAAqH,EAAA,MAAAzH,EAAAyH,EAAA,MAAAkK,EAAAlK,EAAA,MADAuJ,EAlGJ,WAKI,IAEIlN,EAFEoN,EAAsB,uBAc5B,SAASzJ,EAAOA,EAAOsJ,EAAQ3Q,GAC3B,IAAKqH,IAAW,WAAY9B,KAAK8B,EAAMi8D,UAAW,OAAO,KAEzD,GAAIj8D,EAAMinN,eAAgB,OAAOjnN,EAAMinN,eAEvC,IAAI1uN,EACAgR,EAAWvJ,EAAMsU,IAAMtU,EAAMxF,MAAQ,gBAKzC,KAHA8O,EAASA,GAAU,GAAGyJ,MAAMxZ,KAAKyG,EAAM0xD,iBAAiB,WAAWh+C,QAAO,SAAUrX,GAChF,OAAOA,EAAE/B,MAAQmP,CACpB,IAAE,KACYzJ,EAAMovD,KACjB9lD,EAAShL,SAASC,cAAc,WACzB6wD,IAAMpvD,EAAMovD,SAChB,IAAK9lD,IAAWtJ,EAAMovD,IACzB,OAAO,KAgBX,OAbAz2D,EAAUA,GAAW,CAAC,GACtBJ,GAAA,EAAS2R,EAAA2iB,GAAYl0B,GAASsE,UACvBypI,WAAW1mI,EAAOsJ,EAAO8lD,IAAKpvD,EAAMo0G,UAEtC/3G,IACDA,EAAS9D,EAAO0lL,WAAWpoD,aAE/Bx5H,EAAO4V,MAAM,aAAe1I,EAAU,yCAA2CD,EAAO8lD,KAIxFpvD,EAAMinN,eAAiB1uN,EAEhBA,CACV,CAiCD,SAAS+Q,EAAUjN,GACf,MAAK,WAAY6B,KAAK7B,EAAG4/D,UACd5/D,EAEAiN,EAAUjN,EAAGykF,WAE3B,CAED,MAAO,CACH7jF,OAAQ+C,EACRknN,UA9BJ,SAAmB7qN,EAAU1D,GACzB,IAAIJ,EAAW,GACf8D,EAAWA,GAAY,uBAGvB,IADA,IAAI6N,GADJvR,EAAQA,GAAS2F,UACEozD,iBAAiBr1D,GAC3BkN,EAAI,EAAGA,EAAIW,EAAOxR,OAAQ6Q,IAAK,CACpC,IAAIc,EAASrK,EAAOkK,EAAOX,GAAI,MAC/BhR,EAAS6kB,KAAK/S,EACjB,CAGD,IADA,IAAIvK,EAAUnH,EAAM+4D,iBAAiB,gBAAkBjoD,EAAsB,MACpEjJ,EAAI,EAAGA,EAAIV,EAAQpH,OAAQ8H,IAAK,CACrC,IACId,EAASM,EADDsJ,EAAUxJ,EAAQU,IACH,MAC3BjI,EAAS6kB,KAAK1d,EACjB,CAED,OAAOnH,CACV,EAcJ,CAhGD,KAiHwC,oBAAX8G,QAA0BA,QAAUA,OAAO81H,QAAU91H,OAAO81H,OAAOgyF,iBAEtD,oBAAX9nN,QAA0BA,QAAUA,OAAOgH,mBACnC,aAA/BhH,OAAOf,SAASsG,WACZvF,OAAO81H,OACP5rH,EAAS29M,YAGT7qN,EAAegD,OAAOsiC,aAflC,WACQtiC,OAAO81H,SACP91H,OAAO0iC,cAAc1lC,GACrBkN,EAAS29M,YAEhB,GAUkE,KAG3D7nN,OAAOgH,iBAAiB,QAvBhC,SAAShK,IACLgD,OAAO4D,oBAAoB,OAAQ5G,GACnCkN,EAAS29M,WACZ,KAwBD,IAAA78M,EAAAd,EAAAzJ,EAAAE,EAAA,MC3FAm1H,OAAOmnD,WAAa/jL,EAAAgpB,QACpB4zG,OAAO2mD,iBAAmBnjL,EAAA4oB,QAC1B4zG,OAAOiyF,mBAAqB/8M,EAC5B8qH,OAAOG,MAAQx1H,EAAA+sB,EACfsoG,OAAOynD,oBAAsBnzK,EAAAgM,EAE7B,IAAAjV,EAAA20H,MAAA,CF7CsG,GE6CtG7rH,EAAAiY,OAAA,ClSnCO,gCmSRP,IAAIxhB,EAAIrG,EAAQ,MAEdrB,EAAQm2G,WAAazuG,EAAEyuG,WACvBn2G,EAAQw2G,YAAc9uG,EAAE8uG,yCCH1B,IAAIvyG,EAAQ5C,EAAQ,MAChB2tN,EAAgB3tN,EAAQ,MACxB2D,EAAW3D,EAAQ,MACnB61G,EAAW71G,EAAQ,MACnByD,EAAgBzD,EAAQ,MAK5B,SAAS4tN,EAA6BllN,GAKpC,GAJIA,EAAOU,aACTV,EAAOU,YAAYykN,mBAGjBnlN,EAAOY,QAAUZ,EAAOY,OAAO2D,QACjC,MAAM,IAAIxJ,CAEd,CAQA/E,EAAOC,QAAU,SAAyB+J,GA8BxC,OA7BAklN,EAA6BllN,GAG7BA,EAAOO,QAAUP,EAAOO,SAAW,CAAC,EAGpCP,EAAOK,KAAO4kN,EAAc9tN,KAC1B6I,EACAA,EAAOK,KACPL,EAAOO,QACPP,EAAOutG,kBAITvtG,EAAOO,QAAUrG,EAAMg1G,MACrBlvG,EAAOO,QAAQ0uG,QAAU,CAAC,EAC1BjvG,EAAOO,QAAQP,EAAOkC,SAAW,CAAC,EAClClC,EAAOO,SAGTrG,EAAMyJ,QACJ,CAAC,SAAU,MAAO,OAAQ,OAAQ,MAAO,QAAS,WAClD,SAA2BzB,UAClBlC,EAAOO,QAAQ2B,EACxB,KAGYlC,EAAOotG,SAAWD,EAASC,SAE1BptG,GAAQi9B,MAAK,SAA6Bt7B,GAWvD,OAVAujN,EAA6BllN,GAG7B2B,EAAStB,KAAO4kN,EAAc9tN,KAC5B6I,EACA2B,EAAStB,KACTsB,EAASpB,QACTP,EAAOyuG,mBAGF9sG,CACT,IAAG,SAA4BwtB,GAe7B,OAdKl0B,EAASk0B,KACZ+1L,EAA6BllN,GAGzBmvB,GAAUA,EAAOxtB,WACnBwtB,EAAOxtB,SAAStB,KAAO4kN,EAAc9tN,KACnC6I,EACAmvB,EAAOxtB,SAAStB,KAChB8uB,EAAOxtB,SAASpB,QAChBP,EAAOyuG,qBAKNjzG,QAAQ0E,OAAOivB,EACxB,GACF,+BCnFEn5B,EAAOC,QAAU,EAAjBD,iCCMW,IAAII,EAAE,oBAAoBoH,QAAQA,OAAOC,IAAIW,EAAEhI,EAAEoH,OAAOC,IAAI,iBAAiB,MAAMa,EAAElI,EAAEoH,OAAOC,IAAI,gBAAgB,MAAMxD,EAAE7D,EAAEoH,OAAOC,IAAI,kBAAkB,MAAMH,EAAElH,EAAEoH,OAAOC,IAAI,qBAAqB,MAAMY,EAAEjI,EAAEoH,OAAOC,IAAI,kBAAkB,MAAMc,EAAEnI,EAAEoH,OAAOC,IAAI,kBAAkB,MAAMF,EAAEnH,EAAEoH,OAAOC,IAAI,iBAAiB,MAAMC,EAAEtH,EAAEoH,OAAOC,IAAI,oBAAoB,MAAME,EAAEvH,EAAEoH,OAAOC,IAAI,yBAAyB,MAAMG,EAAExH,EAAEoH,OAAOC,IAAI,qBAAqB,MAAMM,EAAE3H,EAAEoH,OAAOC,IAAI,kBAAkB,MAAMU,EAAE/H,EACpfoH,OAAOC,IAAI,uBAAuB,MAAMyJ,EAAE9Q,EAAEoH,OAAOC,IAAI,cAAc,MAAM4J,EAAEjR,EAAEoH,OAAOC,IAAI,cAAc,MAAM6hB,EAAElpB,EAAEoH,OAAOC,IAAI,eAAe,MAAM0S,EAAE/Z,EAAEoH,OAAOC,IAAI,qBAAqB,MAAMqH,EAAE1O,EAAEoH,OAAOC,IAAI,mBAAmB,MAAMsH,EAAE3O,EAAEoH,OAAOC,IAAI,eAAe,MAClQ,SAAS8c,EAAEpkB,GAAG,GAAG,kBAAkBA,GAAG,OAAOA,EAAE,CAAC,IAAI8R,EAAE9R,EAAEqI,SAAS,OAAOyJ,GAAG,KAAK7J,EAAE,OAAOjI,EAAEA,EAAE+B,MAAQ,KAAKwF,EAAE,KAAKC,EAAE,KAAK1D,EAAE,KAAKoE,EAAE,KAAKf,EAAE,KAAKS,EAAE,OAAO5H,EAAE,QAAQ,OAAOA,EAAEA,GAAGA,EAAEqI,UAAY,KAAKjB,EAAE,KAAKK,EAAE,KAAKyJ,EAAE,KAAKH,EAAE,KAAK3I,EAAE,OAAOpI,EAAE,QAAQ,OAAO8R,GAAG,KAAK3J,EAAE,OAAO2J,EAAE,CAAC,CAAC,SAAS+E,EAAE7W,GAAG,OAAOokB,EAAEpkB,KAAKwH,CAAC,CAAC1H,EAAQmvN,UAAU1nN,EAAEzH,EAAQovN,eAAe1nN,EAAE1H,EAAQqvN,gBAAgB/nN,EAAEtH,EAAQsvN,gBAAgBhnN,EAAEtI,EAAQyhH,QAAQt5G,EAAEnI,EAAQ8C,WAAW6E,EAAE3H,EAAQ2I,SAAS3E,EAAEhE,EAAQuvN,KAAKn+M,EAAEpR,EAAQgD,KAAKiO,EAAEjR,EAAQwvN,OAAOnnN,EAChfrI,EAAQ84H,SAAS1wH,EAAEpI,EAAQg5H,WAAW3xH,EAAErH,EAAQi5H,SAASnxH,EAAE9H,EAAQyvN,YAAY,SAASvvN,GAAG,OAAO6W,EAAE7W,IAAIokB,EAAEpkB,KAAKuH,CAAC,EAAEzH,EAAQ0vN,iBAAiB34M,EAAE/W,EAAQ2vN,kBAAkB,SAASzvN,GAAG,OAAOokB,EAAEpkB,KAAKoH,CAAC,EAAEtH,EAAQ4vN,kBAAkB,SAAS1vN,GAAG,OAAOokB,EAAEpkB,KAAKoI,CAAC,EAAEtI,EAAQ6vN,UAAU,SAAS3vN,GAAG,MAAM,kBAAkBA,GAAG,OAAOA,GAAGA,EAAEqI,WAAWJ,CAAC,EAAEnI,EAAQ8vN,aAAa,SAAS5vN,GAAG,OAAOokB,EAAEpkB,KAAKyH,CAAC,EAAE3H,EAAQ+vN,WAAW,SAAS7vN,GAAG,OAAOokB,EAAEpkB,KAAK8D,CAAC,EAAEhE,EAAQgwN,OAAO,SAAS9vN,GAAG,OAAOokB,EAAEpkB,KAAKkR,CAAC,EAC1dpR,EAAQ6C,OAAO,SAAS3C,GAAG,OAAOokB,EAAEpkB,KAAK+Q,CAAC,EAAEjR,EAAQiwN,SAAS,SAAS/vN,GAAG,OAAOokB,EAAEpkB,KAAKmI,CAAC,EAAErI,EAAQkwN,WAAW,SAAShwN,GAAG,OAAOokB,EAAEpkB,KAAKkI,CAAC,EAAEpI,EAAQmwN,aAAa,SAASjwN,GAAG,OAAOokB,EAAEpkB,KAAKmH,CAAC,EAAErH,EAAQowN,WAAW,SAASlwN,GAAG,OAAOokB,EAAEpkB,KAAK4H,CAAC,EAC1O9H,EAAQqwN,mBAAmB,SAASnwN,GAAG,MAAM,kBAAkBA,GAAG,oBAAoBA,GAAGA,IAAI8D,GAAG9D,IAAIwH,GAAGxH,IAAIkI,GAAGlI,IAAImH,GAAGnH,IAAI4H,GAAG5H,IAAIgI,GAAG,kBAAkBhI,GAAG,OAAOA,IAAIA,EAAEqI,WAAW6I,GAAGlR,EAAEqI,WAAW0I,GAAG/Q,EAAEqI,WAAWD,GAAGpI,EAAEqI,WAAWjB,GAAGpH,EAAEqI,WAAWZ,GAAGzH,EAAEqI,WAAW2R,GAAGha,EAAEqI,WAAWsG,GAAG3O,EAAEqI,WAAWuG,GAAG5O,EAAEqI,WAAW8gB,EAAE,EAAErpB,EAAQswN,OAAOhsM,+BCZnU,IAOuBssC,EAPnB1sD,EAAO7C,EAAQ,MAIfL,EAAWF,OAAOC,UAAUC,SAG5Bw6G,GAAmB5qD,EAMpB9vD,OAAO8D,OAAO,MAJR,SAASkL,GACd,IAAIygN,EAAMvvN,EAASE,KAAK4O,GACxB,OAAO8gD,EAAM2/J,KAAS3/J,EAAM2/J,GAAOA,EAAI71M,MAAM,GAAI,GAAG9M,cACtD,GAGF,SAAS4iN,EAAWvuN,GAElB,OADAA,EAAOA,EAAK2L,cACL,SAAkBkC,GACvB,OAAO0rG,EAAO1rG,KAAW7N,CAC3B,CACF,CAQA,SAASxB,EAAQkN,GACf,OAAOnN,MAAMC,QAAQkN,EACvB,CAQA,SAASG,EAAYH,GACnB,MAAsB,qBAARA,CAChB,CAoBA,IAAI4pG,EAAgBi5G,EAAW,eA6C/B,SAASx4G,EAASrqG,GAChB,OAAe,OAARA,GAA+B,kBAARA,CAChC,CAQA,SAAS8iN,EAAc9iN,GACrB,GAAoB,WAAhB6tG,EAAO7tG,GACT,OAAO,EAGT,IAAI5M,EAAYD,OAAOuC,eAAesK,GACtC,OAAqB,OAAd5M,GAAsBA,IAAcD,OAAOC,SACpD,CASA,IAAI2vN,EAASF,EAAW,QASpB94G,EAAS84G,EAAW,QASpB74G,EAAS64G,EAAW,QASpB14G,EAAa04G,EAAW,YAQ5B,SAASG,EAAWhjN,GAClB,MAA8B,sBAAvB3M,EAASE,KAAKyM,EACvB,CAiCA,IAAIkqG,EAAoB24G,EAAW,mBAmDnC,SAAS9iN,EAAQ+yE,EAAKv+B,GAEpB,GAAY,OAARu+B,GAA+B,qBAARA,EAU3B,GALmB,kBAARA,IAETA,EAAM,CAACA,IAGLhgF,EAAQggF,GAEV,IAAK,IAAIngF,EAAI,EAAGmH,EAAIg5E,EAAIpgF,OAAQC,EAAImH,EAAGnH,IACrC4hD,EAAGhhD,KAAK,KAAMu/E,EAAIngF,GAAIA,EAAGmgF,QAI3B,IAAK,IAAIt/E,KAAOs/E,EACV3/E,OAAOC,UAAUE,eAAeC,KAAKu/E,EAAKt/E,IAC5C+gD,EAAGhhD,KAAK,KAAMu/E,EAAIt/E,GAAMA,EAAKs/E,EAIrC,CAwJA,IAA6BmwI,EAAzBC,GAAyBD,EAKJ,qBAAfj2M,YAA8B7Z,OAAOuC,eAAesX,YAHrD,SAAS7K,GACd,OAAO8gN,GAAc9gN,aAAiB8gN,CACxC,GAGF7wN,EAAOC,QAAU,CACfS,QAASA,EACT82G,cAAeA,EACfC,SAvYF,SAAkB7pG,GAChB,OAAe,OAARA,IAAiBG,EAAYH,IAA4B,OAApBA,EAAIvN,cAAyB0N,EAAYH,EAAIvN,cAChD,oBAA7BuN,EAAIvN,YAAYo3G,UAA2B7pG,EAAIvN,YAAYo3G,SAAS7pG,EAClF,EAqYE9C,WA9PF,SAAoBiF,GAClB,IAAIghN,EAAU,oBACd,OAAOhhN,IACgB,oBAAbqoG,UAA2BroG,aAAiBqoG,UACpDn3G,EAASE,KAAK4O,KAAWghN,GACxBH,EAAW7gN,EAAM9O,WAAa8O,EAAM9O,aAAe8vN,EAExD,EAwPEl5G,kBApXF,SAA2BjqG,GAOzB,MAL4B,qBAAhBwhD,aAAiCA,YAAYsiB,OAC9CtiB,YAAYsiB,OAAO9jE,GAElBA,GAASA,EAAI0X,QAAYkyF,EAAc5pG,EAAI0X,OAGzD,EA6WEje,SArWF,SAAkBuG,GAChB,MAAsB,kBAARA,CAChB,EAoWEojN,SA5VF,SAAkBpjN,GAChB,MAAsB,kBAARA,CAChB,EA2VEqqG,SAAUA,EACVy4G,cAAeA,EACf3iN,YAAaA,EACb4iN,OAAQA,EACRh5G,OAAQA,EACRC,OAAQA,EACRg5G,WAAYA,EACZl5G,SAnRF,SAAkB9pG,GAChB,OAAOqqG,EAASrqG,IAAQgjN,EAAWhjN,EAAI04M,KACzC,EAkRExuG,kBAAmBA,EACnBnyG,qBAjOF,WACE,OAAyB,qBAAdI,WAAoD,gBAAtBA,UAAUkrN,SACY,iBAAtBlrN,UAAUkrN,SACY,OAAtBlrN,UAAUkrN,WAI/B,qBAAXhqN,QACa,qBAAbf,SAEX,EAwNEyH,QAASA,EACTurG,MA/JF,SAASA,IACP,IAAIloG,EAAS,CAAC,EACd,SAASkgN,EAAYtjN,EAAKxM,GACpBsvN,EAAc1/M,EAAO5P,KAASsvN,EAAc9iN,GAC9CoD,EAAO5P,GAAO83G,EAAMloG,EAAO5P,GAAMwM,GACxB8iN,EAAc9iN,GACvBoD,EAAO5P,GAAO83G,EAAM,CAAC,EAAGtrG,GACflN,EAAQkN,GACjBoD,EAAO5P,GAAOwM,EAAI+M,QAElB3J,EAAO5P,GAAOwM,CAElB,CAEA,IAAK,IAAIrN,EAAI,EAAGmH,EAAInF,UAAUjC,OAAQC,EAAImH,EAAGnH,IAC3CoN,EAAQpL,UAAUhC,GAAI2wN,GAExB,OAAOlgN,CACT,EA8IEpM,OApIF,SAAgBzE,EAAGC,EAAG+wN,GAQpB,OAPAxjN,EAAQvN,GAAG,SAAqBwN,EAAKxM,GAEjCjB,EAAEiB,GADA+vN,GAA0B,oBAARvjN,EACXzJ,EAAKyJ,EAAKujN,GAEVvjN,CAEb,IACOzN,CACT,EA4HEmR,KAxPF,SAAck/M,GACZ,OAAOA,EAAIl/M,KAAOk/M,EAAIl/M,OAASk/M,EAAI/pN,QAAQ,aAAc,GAC3D,EAuPE2qN,SArHF,SAAkBC,GAIhB,OAH8B,QAA1BA,EAAQttM,WAAW,KACrBstM,EAAUA,EAAQ12M,MAAM,IAEnB02M,CACT,EAiHEvxI,SAvGF,SAAkBz/E,EAAaixN,EAAkB7oN,EAAO43E,GACtDhgF,EAAYW,UAAYD,OAAO8D,OAAOysN,EAAiBtwN,UAAWq/E,GAClEhgF,EAAYW,UAAUX,YAAcA,EACpCoI,GAAS1H,OAAO4/E,OAAOtgF,EAAYW,UAAWyH,EAChD,EAoGEg4E,aA1FF,SAAsB8wI,EAAWC,EAASl2M,GACxC,IAAI7S,EACAlI,EACAujN,EACA2N,EAAS,CAAC,EAEdD,EAAUA,GAAW,CAAC,EAEtB,EAAG,CAGD,IADAjxN,GADAkI,EAAQ1H,OAAOoC,oBAAoBouN,IACzBjxN,OACHC,KAAM,GAENkxN,EADL3N,EAAOr7M,EAAMlI,MAEXixN,EAAQ1N,GAAQyN,EAAUzN,GAC1B2N,EAAO3N,IAAQ,GAGnByN,EAAYxwN,OAAOuC,eAAeiuN,EACpC,OAASA,KAAej2M,GAAUA,EAAOi2M,EAAWC,KAAaD,IAAcxwN,OAAOC,WAEtF,OAAOwwN,CACT,EAqEE/1G,OAAQA,EACRg1G,WAAYA,EACZiB,SA9DF,SAAkBlB,EAAKmB,EAAcxoN,GACnCqnN,EAAM/qM,OAAO+qM,SACI/iN,IAAbtE,GAA0BA,EAAWqnN,EAAIlwN,UAC3C6I,EAAWqnN,EAAIlwN,QAEjB6I,GAAYwoN,EAAarxN,OACzB,IAAI8a,EAAYo1M,EAAI9jN,QAAQilN,EAAcxoN,GAC1C,OAAsB,IAAfiS,GAAoBA,IAAcjS,CAC3C,EAuDEyvH,QA/CF,SAAiB7oH,GACf,IAAKA,EAAO,OAAO,KACnB,IAAIxP,EAAIwP,EAAMzP,OACd,GAAIyN,EAAYxN,GAAI,OAAO,KAE3B,IADA,IAAIqxN,EAAM,IAAInxN,MAAMF,GACbA,KAAM,GACXqxN,EAAIrxN,GAAKwP,EAAMxP,GAEjB,OAAOqxN,CACT,EAuCEd,aAAcA,EACd/4G,WAAYA,aCldd,IAAI85G,EAAoC,qBAAZnwG,QACxBowG,EAAwB,oBAAR/gJ,IAChBghJ,EAAwB,oBAAR/gJ,IAChBghJ,EAAwC,oBAAhB5iK,eAAgCA,YAAYsiB,OAIxE,SAASxxE,EAAMC,EAAGC,GAEhB,GAAID,IAAMC,EAAG,OAAO,EAEpB,GAAID,GAAKC,GAAiB,iBAALD,GAA6B,iBAALC,EAAe,CAC1D,GAAID,EAAEE,cAAgBD,EAAEC,YAAa,OAAO,EAE5C,IAAIC,EAAQC,EAAGC,EA6BXyrB,EA5BJ,GAAIxrB,MAAMC,QAAQP,GAAI,CAEpB,IADAG,EAASH,EAAEG,SACGF,EAAEE,OAAQ,OAAO,EAC/B,IAAKC,EAAID,EAAgB,IAARC,KACf,IAAKL,EAAMC,EAAEI,GAAIH,EAAEG,IAAK,OAAO,EACjC,OAAO,CACT,CAuBA,GAAIuxN,GAAW3xN,aAAa4wE,KAAS3wE,aAAa2wE,IAAM,CACtD,GAAI5wE,EAAE4mB,OAAS3mB,EAAE2mB,KAAM,OAAO,EAE9B,IADAkF,EAAK9rB,EAAE2xE,YACEvxE,EAAI0rB,EAAGq1E,QAAQ72F,UACjBrK,EAAEmsB,IAAIhsB,EAAEwL,MAAM,IAAK,OAAO,EAEjC,IADAkgB,EAAK9rB,EAAE2xE,YACEvxE,EAAI0rB,EAAGq1E,QAAQ72F,UACjBvK,EAAMK,EAAEwL,MAAM,GAAI3L,EAAEib,IAAI9a,EAAEwL,MAAM,KAAM,OAAO,EACpD,OAAO,CACT,CAEA,GAAIgmN,GAAW5xN,aAAa6wE,KAAS5wE,aAAa4wE,IAAM,CACtD,GAAI7wE,EAAE4mB,OAAS3mB,EAAE2mB,KAAM,OAAO,EAE9B,IADAkF,EAAK9rB,EAAE2xE,YACEvxE,EAAI0rB,EAAGq1E,QAAQ72F,UACjBrK,EAAEmsB,IAAIhsB,EAAEwL,MAAM,IAAK,OAAO,EACjC,OAAO,CACT,CAGA,GAAIimN,GAAkB5iK,YAAYsiB,OAAOvxE,IAAMivD,YAAYsiB,OAAOtxE,GAAI,CAEpE,IADAE,EAASH,EAAEG,SACGF,EAAEE,OAAQ,OAAO,EAC/B,IAAKC,EAAID,EAAgB,IAARC,KACf,GAAIJ,EAAEI,KAAOH,EAAEG,GAAI,OAAO,EAC5B,OAAO,CACT,CAEA,GAAIJ,EAAEE,cAAgBM,OAAQ,OAAOR,EAAES,SAAWR,EAAEQ,QAAUT,EAAEU,QAAUT,EAAES,MAK5E,GAAIV,EAAEW,UAAYC,OAAOC,UAAUF,SAAgC,oBAAdX,EAAEW,SAA+C,oBAAdV,EAAEU,QAAwB,OAAOX,EAAEW,YAAcV,EAAEU,UAC3I,GAAIX,EAAEc,WAAaF,OAAOC,UAAUC,UAAkC,oBAAfd,EAAEc,UAAiD,oBAAfb,EAAEa,SAAyB,OAAOd,EAAEc,aAAeb,EAAEa,WAKhJ,IADAX,GADAE,EAAOO,OAAOP,KAAKL,IACLG,UACCS,OAAOP,KAAKJ,GAAGE,OAAQ,OAAO,EAE7C,IAAKC,EAAID,EAAgB,IAARC,KACf,IAAKQ,OAAOC,UAAUE,eAAeC,KAAKf,EAAGI,EAAKD,IAAK,OAAO,EAKhE,GAAIsxN,GAAkB1xN,aAAauhH,QAAS,OAAO,EAGnD,IAAKnhH,EAAID,EAAgB,IAARC,KACf,IAAiB,WAAZC,EAAKD,IAA+B,QAAZC,EAAKD,IAA4B,QAAZC,EAAKD,KAAiBJ,EAAEqI,YAarEtI,EAAMC,EAAEK,EAAKD,IAAKH,EAAEI,EAAKD,KAAM,OAAO,EAK7C,OAAO,CACT,CAEA,OAAOJ,IAAMA,GAAKC,IAAMA,CAC1B,CAGAJ,EAAOC,QAAU,SAAiBE,EAAGC,GACnC,IACE,OAAOF,EAAMC,EAAGC,EAClB,CAAE,MAAOqP,GACP,IAAMA,EAAMU,SAAW,IAAIgkB,MAAM,oBAO/B,OADA1jB,QAAQC,KAAK,mDACN,EAGT,MAAMjB,CACR,CACF,+BCxIA,IAAIvL,EAAQ5C,EAAQ,MAUpBtB,EAAOC,QAAU,SAAqBgyN,EAASC,GAE7CA,EAAUA,GAAW,CAAC,EACtB,IAAIloN,EAAS,CAAC,EAEd,SAASmoN,EAAe5pI,EAAQ3nF,GAC9B,OAAIsD,EAAMwsN,cAAcnoI,IAAWrkF,EAAMwsN,cAAc9vN,GAC9CsD,EAAMg1G,MAAM3wB,EAAQ3nF,GAClBsD,EAAMwsN,cAAc9vN,GACtBsD,EAAMg1G,MAAM,CAAC,EAAGt4G,GACdsD,EAAMxD,QAAQE,GAChBA,EAAO+Z,QAET/Z,CACT,CAGA,SAASwxN,EAAoBtO,GAC3B,OAAK5/M,EAAM6J,YAAYmkN,EAAQpO,IAEnB5/M,EAAM6J,YAAYkkN,EAAQnO,SAA/B,EACEqO,OAAe1kN,EAAWwkN,EAAQnO,IAFlCqO,EAAeF,EAAQnO,GAAOoO,EAAQpO,GAIjD,CAGA,SAASuO,EAAiBvO,GACxB,IAAK5/M,EAAM6J,YAAYmkN,EAAQpO,IAC7B,OAAOqO,OAAe1kN,EAAWykN,EAAQpO,GAE7C,CAGA,SAASwO,EAAiBxO,GACxB,OAAK5/M,EAAM6J,YAAYmkN,EAAQpO,IAEnB5/M,EAAM6J,YAAYkkN,EAAQnO,SAA/B,EACEqO,OAAe1kN,EAAWwkN,EAAQnO,IAFlCqO,OAAe1kN,EAAWykN,EAAQpO,GAI7C,CAGA,SAASyO,EAAgBzO,GACvB,OAAIA,KAAQoO,EACHC,EAAeF,EAAQnO,GAAOoO,EAAQpO,IACpCA,KAAQmO,EACVE,OAAe1kN,EAAWwkN,EAAQnO,SADpC,CAGT,CAEA,IAAI0O,EAAW,CACb,IAAOH,EACP,OAAUA,EACV,KAAQA,EACR,QAAWC,EACX,iBAAoBA,EACpB,kBAAqBA,EACrB,iBAAoBA,EACpB,QAAWA,EACX,eAAkBA,EAClB,gBAAmBA,EACnB,QAAWA,EACX,aAAgBA,EAChB,eAAkBA,EAClB,eAAkBA,EAClB,iBAAoBA,EACpB,mBAAsBA,EACtB,WAAcA,EACd,iBAAoBA,EACpB,cAAiBA,EACjB,eAAkBA,EAClB,UAAaA,EACb,UAAaA,EACb,WAAcA,EACd,YAAeA,EACf,WAAcA,EACd,iBAAoBA,EACpB,eAAkBC,GASpB,OANAruN,EAAMyJ,QAAQ5M,OAAOP,KAAKyxN,GAASpuN,OAAO9C,OAAOP,KAAK0xN,KAAW,SAA4BpO,GAC3F,IAAI5qG,EAAQs5G,EAAS1O,IAASsO,EAC1BK,EAAcv5G,EAAM4qG,GACvB5/M,EAAM6J,YAAY0kN,IAAgBv5G,IAAUq5G,IAAqBvoN,EAAO85M,GAAQ2O,EACnF,IAEOzoN,CACT,+BCjGA,IAAI9F,EAAQ5C,EAAQ,MAEpB,SAASoxN,IACPn4M,KAAKo4M,SAAW,EAClB,CAUAD,EAAmB1xN,UAAU4xN,IAAM,SAAaC,EAAWC,EAAUliN,GAOnE,OANA2J,KAAKo4M,SAAS3tM,KAAK,CACjB6tM,UAAWA,EACXC,SAAUA,EACVC,cAAaniN,GAAUA,EAAQmiN,YAC/BC,QAASpiN,EAAUA,EAAQoiN,QAAU,OAEhCz4M,KAAKo4M,SAASryN,OAAS,CAChC,EAOAoyN,EAAmB1xN,UAAUiyN,MAAQ,SAAe/2M,GAC9C3B,KAAKo4M,SAASz2M,KAChB3B,KAAKo4M,SAASz2M,GAAM,KAExB,EAUAw2M,EAAmB1xN,UAAU2M,QAAU,SAAiBw0C,GACtDj+C,EAAMyJ,QAAQ4M,KAAKo4M,UAAU,SAAwBpqN,GACzC,OAANA,GACF45C,EAAG55C,EAEP,GACF,EAEAvI,EAAOC,QAAUyyN,+BCnDjB,IAAIxuN,EAAQ5C,EAAQ,MAEpB,SAAS84H,EAAOxsH,GACd,OAAOxC,mBAAmBwC,GACxBnH,QAAQ,QAAS,KACjBA,QAAQ,OAAQ,KAChBA,QAAQ,QAAS,KACjBA,QAAQ,OAAQ,KAChBA,QAAQ,QAAS,KACjBA,QAAQ,QAAS,IACrB,CASAzG,EAAOC,QAAU,SAAkBoG,EAAK+F,EAAQC,GAE9C,IAAKD,EACH,OAAO/F,EAGT,IAAI6sN,EACJ,GAAI7mN,EACF6mN,EAAmB7mN,EAAiBD,QAC/B,GAAIlI,EAAM4zG,kBAAkB1rG,GACjC8mN,EAAmB9mN,EAAOnL,eACrB,CACL,IAAIkyN,EAAQ,GAEZjvN,EAAMyJ,QAAQvB,GAAQ,SAAmBwB,EAAKxM,GAChC,OAARwM,GAA+B,qBAARA,IAIvB1J,EAAMxD,QAAQkN,GAChBxM,GAAY,KAEZwM,EAAM,CAACA,GAGT1J,EAAMyJ,QAAQC,GAAK,SAAoB0b,GACjCplB,EAAMysN,OAAOrnM,GACfA,EAAIA,EAAEgiJ,cACGpnK,EAAM+zG,SAAS3uF,KACxBA,EAAI2R,KAAKC,UAAU5R,IAErB6pM,EAAMnuM,KAAKo1G,EAAOh5H,GAAO,IAAMg5H,EAAO9wG,GACxC,IACF,IAEA4pM,EAAmBC,EAAM3gN,KAAK,IAChC,CAEA,GAAI0gN,EAAkB,CACpB,IAAIE,EAAgB/sN,EAAIqG,QAAQ,MACT,IAAnB0mN,IACF/sN,EAAMA,EAAIsU,MAAM,EAAGy4M,IAGrB/sN,KAA8B,IAAtBA,EAAIqG,QAAQ,KAAc,IAAM,KAAOwmN,CACjD,CAEA,OAAO7sN,CACT,iHCrEA,MAAAsuH,KAAArzH,EAAA,mCACAyzH,EAAAzzH,EAAA,kmDA8DO,IAAMkD,EAAgC,CAC3Co4D,MAAO,UACPi6D,OAAQ,CAAC,GAAK,GACdE,MAAO,CAAC,EAAK,GACbE,KAAM,EAAE,GAAK,GACbN,gBAAiB,IACjBQ,cAAe,EAAE,EAAK,0BAoBlBk8F,EAAAA,WAQJ,SAAAA,EAAmBr7F,GAAyD,IAA9BhuH,EAA8BzH,UAAAjC,OAAA,QAAAmN,IAAAlL,UAAA,GAAAA,UAAA,GAAJ,CAAC,+FAAG+wN,CAAA,KAAAD,GAAAE,EAAA,sBAAAA,EAAA,sBAAAA,EAAA,qCAAAA,EAAA,qBAE1Eh5M,KAAKk7G,aAAazrH,GAGlB,IAAAwpN,EAA+Cj5M,KAAKvQ,OAA5C6sH,EAAR28F,EAAQ38F,OAAQI,EAAhBu8F,EAAgBv8F,KAAMF,EAAtBy8F,EAAsBz8F,MAAOI,EAA7Bq8F,EAA6Br8F,cAE7B58G,KAAKnO,OAAS,CACZ0C,GAAG,EAAAimH,EAAAzgD,QAAO,EAAG0jD,EAAOG,aACpBppH,GAAG,EAAAgmH,EAAAzgD,SAAQ0jD,EAAOI,aAAc,GAChCq7F,UAAU,EAAA1+F,EAAAzgD,QAAO,EAAG,KACpBuiD,OAAQ9B,EAAAzgD,OAAA3uD,WAAA,EAAA2vG,EAAUuB,IAClBE,MAAOhC,EAAAzgD,OAAA3uD,WAAA,EAAA2vG,EAAUyB,IACjBE,KAAMlC,EAAAzgD,OAAA3uD,WAAA,EAAA2vG,EAAU2B,IAChBE,cAAepC,EAAAzgD,OAAA3uD,WAAA,EAAA2vG,EAAU6B,IACzBu8F,UAAW3+F,EAAAzgD,OAAA3uD,WAAA,EAAA2vG,EAAU2B,IACrB08F,SAAU5+F,EAAAzgD,OAAA3uD,WAAA,EAAA2vG,EAAUyB,IACpB68F,kBAAmB7+F,EAAAzgD,OAAA3uD,WAAA,EAAA2vG,EAAU6B,KAG/B58G,KAAKs5M,sBAAwB,CAC9B,kDAED,WACMt5M,KAAKvQ,OAAOstH,QAAU/8G,KAAKvQ,OAAOstH,OAAOh3H,OAAS,EACpDia,KAAKysJ,OAAQ,EAAAjyC,EAAA++F,eAAcv5M,KAAKvQ,OAAOstH,QAEvC/8G,KAAKysJ,WAAQv5J,CAEhB,6BAED,SAAoBzD,GAClB,IAAM+pN,EAAiBx5M,KAAKvQ,OAC5BuQ,KAAKvQ,OAALosH,EAAAA,EAAA,GAAmB5xH,GAAkBwF,GACrCuQ,KAAKvQ,OAAO2sH,iBAAkB,EAAA5B,EAAAzgD,QAAO/5D,KAAKvQ,OAAO2sH,gBAA+C,IAA9Bp8G,KAAKvQ,OAAO2sH,iBAG1Ep8G,KAAKnO,UAAW,EAAAuoH,EAAA,SAAQp6G,KAAKvQ,OAAO6sH,OAApB,OAA4Bk9F,QAA5B,IAA4BA,OAA5B,EAA4BA,EAAgBl9F,UAC9Dt8G,KAAKnO,OAAOyqH,OAAS9B,EAAAzgD,OAAA3uD,WAAA,EAAA2vG,EAAU/6G,KAAKvQ,OAAO6sH,WAGxC,EAAAlC,EAAA,SAAQp6G,KAAKvQ,OAAOstH,OAApB,OAA4By8F,QAA5B,IAA4BA,OAA5B,EAA4BA,EAAgBz8F,SAC/C/8G,KAAKy5M,aAER,mCAED,WACEz5M,KAAKnO,OAAOsnN,UAAY3+F,EAAAzgD,OAAA3uD,WAAA,EAAA2vG,EAAU/6G,KAAKvQ,OAAO+sH,QAC9Cx8G,KAAKnO,OAAOunN,SAAW5+F,EAAAzgD,OAAA3uD,WAAA,EAAA2vG,EAAU/6G,KAAKvQ,OAAOitH,OACzC18G,KAAKysJ,QACPzsJ,KAAKnO,OAAOwnN,kBAAoB7+F,EAAAzgD,OAAA3uD,WAAA,EAAA2vG,EAAU/6G,KAAKvQ,OAAOmtH,gBAEzD,uBAED,SAAca,GAAmD,IAAxBD,EAAwBx1H,UAAAjC,OAAA,QAAAmN,IAAAlL,UAAA,GAAAA,UAAA,GAAT,EACtD0xN,EAAuG15M,KAAKnO,OAApG0C,EAARmlN,EAAQnlN,EAAGC,EAAXklN,EAAWllN,EAAG0kN,EAAdQ,EAAcR,SAAUt8F,EAAxB88F,EAAwB98F,cAAey8F,EAAvCK,EAAuCL,kBAAmB38F,EAA1Dg9F,EAA0Dh9F,KAAMF,EAAhEk9F,EAAgEl9F,MAAO48F,EAAvEM,EAAuEN,SAAUD,EAAjFO,EAAiFP,UAAW78F,EAA5Fo9F,EAA4Fp9F,OAG5Ft8G,KAAKnO,OAAO0C,GAAKA,EAAImoH,EAAOc,IAAiBC,EAAOG,YAAuB,EAATtB,GAC9Dt8G,KAAKnO,OAAO0C,EAAIkpH,EAAOG,YAActB,IAAQt8G,KAAKnO,OAAO0C,GAAK+nH,GAClEt8G,KAAKnO,OAAO2C,GAAKA,EAAIgoH,EAAQgB,IAAiBC,EAAOI,aAAwB,EAATvB,GAChEt8G,KAAKnO,OAAO2C,EAAIipH,EAAOI,aAAevB,IAAQt8G,KAAKnO,OAAO2C,GAAK8nH,GAG/Dt8G,KAAKysJ,QACPzsJ,KAAKnO,OAAOqnN,UAAYA,EAAWt8F,GAAiB,KAItD58G,KAAKnO,OAAO2qH,OAAQ,EAAAhC,EAAAm/F,MAAKn9F,EAAO28F,EAAW,KAC3Cn5M,KAAKnO,OAAO6qH,MAAO,EAAAlC,EAAAm/F,MAAKj9F,EAAM08F,EAAU,KACxCp5M,KAAKnO,OAAO+qH,eAAgB,EAAApC,EAAAm/F,MAAK/8F,EAAey8F,EAAmB,KAE/Dr5M,KAAKs5M,wBAA0Bt5M,KAAKvQ,OAAO2sH,kBAC7Cp8G,KAAK45M,qBACL55M,KAAKs5M,sBAAwB,EAEhC,wCAED,SAAgC7sD,EAA0BjgJ,GAAiC,IAAAqtM,EACzF,GAAIptD,aAAiBqtD,kBAAoBrtD,EAAMpqJ,QAAS,OAAOoqJ,EAC/D,IAAIstD,EAAQjB,EAAUkB,kBAAkBl5M,IAAI2rJ,GAO5C,GALKstD,IACHA,EAAQ,CAAC,EACTjB,EAAUkB,kBAAkBz2M,IAAIkpJ,EAAOstD,MAGnCvtM,KAAQutM,GAAQ,KAAAE,EACdx8F,EAAS9xH,SAASC,cAAc,UACtC6xH,EAAO1uH,MAAQyd,EACfixG,EAAOzuH,OAASwd,EAChB,QAAAytM,EAAAx8F,EAAOrV,WAAW,aAAlB,IAAA6xG,GAAAA,EAAyB5xG,UAAUokD,EAAO,EAAG,EAAGjgJ,EAAMA,GACtDutM,EAAMvtM,GAAQixG,CACf,CAED,eAAAo8F,EAAOE,EAAMvtM,UAAb,IAAAqtM,EAAAA,EAAsBptD,CACvB,qBAED,SAAYhmD,GACV,GAAIzmG,KAAKysJ,MAAO,CAGdhmD,EAAIiX,aAAa,EAAG,EAAG,EAAG,EAAG19G,KAAKnO,OAAO0C,EAAGyL,KAAKnO,OAAO2C,GAExD,IAAM8nH,EAAShkH,KAAK0zB,KAAKhsB,KAAKnO,OAAOyqH,QACrC7V,EAAIyzG,OAAQl6M,KAAKnO,OAAOqnN,SAAW5gN,KAAK29G,GAAM,KAC9CxP,EAAI4B,UACFroG,KAAKm6M,wBAAwBn6M,KAAKysJ,MAAOnwC,IACxChkH,KAAK0zB,KAAKswF,EAAS,IACnBhkH,KAAK0zB,KAAKswF,EAAS,GACpBA,EACAA,EAIH,MACC7V,EAAI2zG,YACJ3zG,EAAI4zG,IAAIr6M,KAAKnO,OAAO0C,EAAGyL,KAAKnO,OAAO2C,EAAGwL,KAAKnO,OAAOyqH,OAAQ,EAAG,EAAIhkH,KAAK29G,IACtExP,EAAI6zG,UAAYt6M,KAAKvQ,OAAO4yD,MAC5BokD,EAAI8zG,YACJ9zG,EAAIo8E,MAEP,uFAnIGi2B,KAAAA,EAAAA,oBACuB,IAAItqH,eAqIlBsqH,qCC7NfrzN,EAAOC,QAAU,SAAckiD,EAAIgvK,GACjC,OAAO,WAEL,IADA,IAAI4D,EAAO,IAAIt0N,MAAM8B,UAAUjC,QACtBC,EAAI,EAAGA,EAAIw0N,EAAKz0N,OAAQC,IAC/Bw0N,EAAKx0N,GAAKgC,UAAUhC,GAEtB,OAAO4hD,EAAGx8B,MAAMwrM,EAAS4D,EAC3B,CACF,6BCDa,SAASztN,EAAEnH,EAAEC,GAAG,IAAIgI,EAAEjI,EAAEG,OAAOH,EAAE6kB,KAAK5kB,GAAGD,EAAE,KAAK,EAAEiI,GAAG,CAAC,IAAIE,EAAEF,EAAE,IAAI,EAAEnE,EAAE9D,EAAEmI,GAAG,KAAG,EAAED,EAAEpE,EAAE7D,IAA0B,MAAMD,EAA7BA,EAAEmI,GAAGlI,EAAED,EAAEiI,GAAGnE,EAAEmE,EAAEE,CAAc,CAAC,CAAC,SAASC,EAAEpI,GAAG,OAAO,IAAIA,EAAEG,OAAO,KAAKH,EAAE,EAAE,CAAC,SAASoH,EAAEpH,GAAG,GAAG,IAAIA,EAAEG,OAAO,OAAO,KAAK,IAAIF,EAAED,EAAE,GAAGiI,EAAEjI,EAAE00B,MAAM,GAAGzsB,IAAIhI,EAAE,CAACD,EAAE,GAAGiI,EAAEjI,EAAE,IAAI,IAAImI,EAAE,EAAErE,EAAE9D,EAAEG,OAAO6Z,EAAElW,IAAI,EAAEqE,EAAE6R,GAAG,CAAC,IAAIxS,EAAE,GAAGW,EAAE,GAAG,EAAE8R,EAAEja,EAAEwH,GAAGC,EAAED,EAAE,EAAEmH,EAAE3O,EAAEyH,GAAG,GAAG,EAAES,EAAE+R,EAAEhS,GAAGR,EAAE3D,GAAG,EAAEoE,EAAEyG,EAAEsL,IAAIja,EAAEmI,GAAGwG,EAAE3O,EAAEyH,GAAGQ,EAAEE,EAAEV,IAAIzH,EAAEmI,GAAG8R,EAAEja,EAAEwH,GAAGS,EAAEE,EAAEX,OAAQ,MAAGC,EAAE3D,GAAG,EAAEoE,EAAEyG,EAAE1G,IAA0B,MAAMjI,EAA7BA,EAAEmI,GAAGwG,EAAE3O,EAAEyH,GAAGQ,EAAEE,EAAEV,CAAc,EAAC,CAAC,OAAOxH,CAAC,CAC3c,SAASiI,EAAElI,EAAEC,GAAG,IAAIgI,EAAEjI,EAAE60N,UAAU50N,EAAE40N,UAAU,OAAO,IAAI5sN,EAAEA,EAAEjI,EAAE+b,GAAG9b,EAAE8b,EAAE,CAAC,GAAG,kBAAkBmc,aAAa,oBAAoBA,YAAY1U,IAAI,CAAC,IAAIjc,EAAE2wB,YAAYp4B,EAAQorF,aAAa,WAAW,OAAO3jF,EAAEic,KAAK,CAAC,KAAK,CAAC,IAAI5b,EAAE+T,KAAK3T,EAAEJ,EAAE4b,MAAM1jB,EAAQorF,aAAa,WAAW,OAAOtjF,EAAE4b,MAAMxb,CAAC,CAAC,CAAC,IAAI+I,EAAE,GAAGG,EAAE,GAAGY,EAAE,EAAEqX,EAAE,KAAKva,EAAE,EAAEwV,GAAE,EAAGvN,GAAE,EAAGqG,GAAE,EAAGnD,EAAE,oBAAoBvN,WAAWA,WAAW,KAAKgG,EAAE,oBAAoBoxB,aAAaA,aAAa,KAAKvoB,EAAE,qBAAqBy5M,aAAaA,aAAa,KACnT,SAASl3M,EAAE5d,GAAG,IAAI,IAAIC,EAAEmI,EAAE8I,GAAG,OAAOjR,GAAG,CAAC,GAAG,OAAOA,EAAEujG,SAASp8F,EAAE8J,OAAQ,MAAGjR,EAAEg6B,WAAWj6B,GAAgD,MAA9CoH,EAAE8J,GAAGjR,EAAE40N,UAAU50N,EAAE80N,eAAe5tN,EAAE4J,EAAE9Q,EAAa,CAACA,EAAEmI,EAAE8I,EAAE,CAAC,CAAC,SAASqP,EAAEvgB,GAAa,GAAVkd,GAAE,EAAGU,EAAE5d,IAAO6W,EAAE,GAAG,OAAOzO,EAAE2I,GAAG8F,GAAE,EAAGgD,EAAEyK,OAAO,CAAC,IAAIrkB,EAAEmI,EAAE8I,GAAG,OAAOjR,GAAG+f,EAAEO,EAAEtgB,EAAEg6B,UAAUj6B,EAAE,CAAC,CACra,SAASskB,EAAEtkB,EAAEC,GAAG4W,GAAE,EAAGqG,IAAIA,GAAE,EAAG1K,EAAE+D,GAAGA,GAAG,GAAG6N,GAAE,EAAG,IAAInc,EAAE2G,EAAE,IAAS,IAALgP,EAAE3d,GAAOkpB,EAAE/gB,EAAE2I,GAAG,OAAOoY,MAAMA,EAAE4rM,eAAe90N,IAAID,IAAImc,MAAM,CAAC,IAAIhU,EAAEghB,EAAEq6E,SAAS,GAAG,oBAAoBr7F,EAAE,CAACghB,EAAEq6E,SAAS,KAAK50F,EAAEua,EAAE6rM,cAAc,IAAIlxN,EAAEqE,EAAEghB,EAAE4rM,gBAAgB90N,GAAGA,EAAEH,EAAQorF,eAAe,oBAAoBpnF,EAAEqlB,EAAEq6E,SAAS1/F,EAAEqlB,IAAI/gB,EAAE2I,IAAI3J,EAAE2J,GAAG6M,EAAE3d,EAAE,MAAMmH,EAAE2J,GAAGoY,EAAE/gB,EAAE2I,EAAE,CAAC,GAAG,OAAOoY,EAAE,IAAInP,GAAE,MAAO,CAAC,IAAIxS,EAAEY,EAAE8I,GAAG,OAAO1J,GAAGwY,EAAEO,EAAE/Y,EAAEyyB,UAAUh6B,GAAG+Z,GAAE,CAAE,CAAC,OAAOA,CAAC,CAAC,QAAQmP,EAAE,KAAKva,EAAE3G,EAAEmc,GAAE,CAAE,CAAC,CAD1a,qBAAqBxe,gBAAW,IAASA,UAAU69H,iBAAY,IAAS79H,UAAU69H,WAAWwxF,gBAAgBrvN,UAAU69H,WAAWwxF,eAAejxN,KAAK4B,UAAU69H,YAC2Q,IACzP3wH,EAD6PkK,GAAE,EAAGD,EAAE,KAAKxG,GAAG,EAAE6E,EAAE,EAAEiJ,GAAG,EACvc,SAASlI,IAAI,QAAOrc,EAAQorF,eAAe7mE,EAAEjJ,EAAO,CAAC,SAAS5B,IAAI,GAAG,OAAOuD,EAAE,CAAC,IAAI/c,EAAEF,EAAQorF,eAAe7mE,EAAErkB,EAAE,IAAIC,GAAE,EAAG,IAAIA,EAAE8c,GAAE,EAAG/c,EAAE,CAAC,QAAQC,EAAE6S,KAAKkK,GAAE,EAAGD,EAAE,KAAK,CAAC,MAAMC,GAAE,CAAE,CAAO,GAAG,oBAAoB3B,EAAEvI,EAAE,WAAWuI,EAAE7B,EAAE,OAAO,GAAG,qBAAqBitL,eAAe,CAAC,IAAI7zL,EAAE,IAAI6zL,eAAexpL,EAAErK,EAAEk0L,MAAMl0L,EAAEg0L,MAAMC,UAAUrtL,EAAE1G,EAAE,WAAWmK,EAAEuwC,YAAY,KAAK,CAAC,MAAM16C,EAAE,WAAWiH,EAAEP,EAAE,EAAE,EAAE,SAASK,EAAE7Z,GAAG+c,EAAE/c,EAAEgd,IAAIA,GAAE,EAAGlK,IAAI,CAAC,SAASkN,EAAEhgB,EAAEC,GAAGsW,EAAEwD,GAAE,WAAW/Z,EAAEF,EAAQorF,eAAe,GAAEjrF,EAAE,CAC5dH,EAAQgsF,sBAAsB,EAAEhsF,EAAQwrF,2BAA2B,EAAExrF,EAAQ8rF,qBAAqB,EAAE9rF,EAAQ4rF,wBAAwB,EAAE5rF,EAAQo1N,mBAAmB,KAAKp1N,EAAQ0rF,8BAA8B,EAAE1rF,EAAQgrF,wBAAwB,SAAS9qF,GAAGA,EAAEwjG,SAAS,IAAI,EAAE1jG,EAAQq1N,2BAA2B,WAAWt+M,GAAGuN,IAAIvN,GAAE,EAAGgD,EAAEyK,GAAG,EAC1UxkB,EAAQs1N,wBAAwB,SAASp1N,GAAG,EAAEA,GAAG,IAAIA,EAAEsQ,QAAQhB,MAAM,mHAAmH8L,EAAE,EAAEpb,EAAE0S,KAAK2Q,MAAM,IAAIrjB,GAAG,CAAC,EAAEF,EAAQsrF,iCAAiC,WAAW,OAAOx8E,CAAC,EAAE9O,EAAQu1N,8BAA8B,WAAW,OAAOjtN,EAAE2I,EAAE,EAAEjR,EAAQw1N,cAAc,SAASt1N,GAAG,OAAO4O,GAAG,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI3O,EAAE,EAAE,MAAM,QAAQA,EAAE2O,EAAE,IAAI3G,EAAE2G,EAAEA,EAAE3O,EAAE,IAAI,OAAOD,GAAG,CAAC,QAAQ4O,EAAE3G,CAAC,CAAC,EAAEnI,EAAQy1N,wBAAwB,WAAW,EAC9fz1N,EAAQmrF,sBAAsB,WAAW,EAAEnrF,EAAQ01N,yBAAyB,SAASx1N,EAAEC,GAAG,OAAOD,GAAG,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQA,EAAE,EAAE,IAAIiI,EAAE2G,EAAEA,EAAE5O,EAAE,IAAI,OAAOC,GAAG,CAAC,QAAQ2O,EAAE3G,CAAC,CAAC,EAChMnI,EAAQ8qF,0BAA0B,SAAS5qF,EAAEC,EAAEgI,GAAG,IAAIE,EAAErI,EAAQorF,eAA8F,OAA/E,kBAAkBjjF,GAAG,OAAOA,EAAaA,EAAE,kBAAZA,EAAEA,EAAE44H,QAA6B,EAAE54H,EAAEE,EAAEF,EAAEE,EAAGF,EAAEE,EAASnI,GAAG,KAAK,EAAE,IAAI8D,GAAG,EAAE,MAAM,KAAK,EAAEA,EAAE,IAAI,MAAM,KAAK,EAAEA,EAAE,WAAW,MAAM,KAAK,EAAEA,EAAE,IAAI,MAAM,QAAQA,EAAE,IAAmN,OAAzM9D,EAAE,CAAC+b,GAAGjK,IAAI0xF,SAASvjG,EAAE+0N,cAAch1N,EAAEi6B,UAAUhyB,EAAE8sN,eAAvDjxN,EAAEmE,EAAEnE,EAAoE+wN,WAAW,GAAG5sN,EAAEE,GAAGnI,EAAE60N,UAAU5sN,EAAEd,EAAE+J,EAAElR,GAAG,OAAOoI,EAAE2I,IAAI/Q,IAAIoI,EAAE8I,KAAKgM,GAAG1K,EAAE+D,GAAGA,GAAG,GAAG2G,GAAE,EAAG8C,EAAEO,EAAEtY,EAAEE,MAAMnI,EAAE60N,UAAU/wN,EAAEqD,EAAE4J,EAAE/Q,GAAG6W,GAAGuN,IAAIvN,GAAE,EAAGgD,EAAEyK,KAAYtkB,CAAC,EACneF,EAAQirF,qBAAqB5uE,EAAErc,EAAQ21N,sBAAsB,SAASz1N,GAAG,IAAIC,EAAE2O,EAAE,OAAO,WAAW,IAAI3G,EAAE2G,EAAEA,EAAE3O,EAAE,IAAI,OAAOD,EAAEwlB,MAAMpL,KAAKhY,UAAU,CAAC,QAAQwM,EAAE3G,CAAC,CAAC,CAAC,+BChB/J,IAAIlE,EAAQ5C,EAAQ,MAqEpBtB,EAAOC,QA5DP,SAAoBygF,EAAKm1I,GAEvBA,EAAWA,GAAY,IAAIz9G,SAE3B,IAAIh4B,EAAQ,GAEZ,SAAS01I,EAAa/pN,GACpB,OAAc,OAAVA,EAAuB,GAEvB7H,EAAMysN,OAAO5kN,GACRA,EAAMu/J,cAGXpnK,EAAMszG,cAAczrG,IAAU7H,EAAM4sN,aAAa/kN,GAC5B,oBAAT4iD,KAAsB,IAAIA,KAAK,CAAC5iD,IAAUuwL,OAAOz4K,KAAK9X,GAG/DA,CACT,CAuCA,OArCA,SAASuvG,EAAMjxG,EAAM0rN,GACnB,GAAI7xN,EAAMwsN,cAAcrmN,IAASnG,EAAMxD,QAAQ2J,GAAO,CACpD,IAA6B,IAAzB+1E,EAAM1zE,QAAQrC,GAChB,MAAMoH,MAAM,kCAAoCskN,GAGlD31I,EAAMp7D,KAAK3a,GAEXnG,EAAMyJ,QAAQtD,GAAM,SAAc0B,EAAO3K,GACvC,IAAI8C,EAAM6J,YAAYhC,GAAtB,CACA,IACI6lN,EADAoE,EAAUD,EAAYA,EAAY,IAAM30N,EAAMA,EAGlD,GAAI2K,IAAUgqN,GAA8B,kBAAVhqN,EAChC,GAAI7H,EAAMwtN,SAAStwN,EAAK,MAEtB2K,EAAQkvB,KAAKC,UAAUnvB,QAClB,GAAI7H,EAAMwtN,SAAStwN,EAAK,QAAUwwN,EAAM1tN,EAAM00H,QAAQ7sH,IAK3D,YAHA6lN,EAAIjkN,SAAQ,SAASqlG,IAClB9uG,EAAM6J,YAAYilG,IAAO6iH,EAASxhK,OAAO2hK,EAASF,EAAa9iH,GAClE,IAKJsI,EAAMvvG,EAAOiqN,EAjBuB,CAkBtC,IAEA51I,EAAMvrD,KACR,MACEghM,EAASxhK,OAAO0hK,EAAWD,EAAazrN,GAE5C,CAEAixG,CAAM56B,GAECm1I,CACT,iCC7DiBz1N,EAAE,MAAMgI,EAAE,MAAME,EAAE,MAAMrE,EAAE,MAAMqD,EAAE,MAAMe,EAAE,MAAME,EAAE,MAAMhB,EAAE,MAAMG,EAAE,MAAMC,EAAE,MAAMC,EAAE,MAAMG,EAAE,MAAMI,EAAE,MAAM+I,EAAE,MAAMe,EAAE,MAAMqX,EAAE,MAAMnP,EAAE,MACnJ,GAAG,oBAAoB3S,QAAQA,OAAOC,IAAI,CAAC,IAAIqH,EAAEtH,OAAOC,IAAIrH,EAAE0O,EAAE,iBAAiB1G,EAAE0G,EAAE,gBAAgBxG,EAAEwG,EAAE,kBAAkB7K,EAAE6K,EAAE,qBAAqBxH,EAAEwH,EAAE,kBAAkBzG,EAAEyG,EAAE,kBAAkBvG,EAAEuG,EAAE,iBAAiBvH,EAAEuH,EAAE,qBAAqBpH,EAAEoH,EAAE,kBAAkBnH,EAAEmH,EAAE,uBAAuBlH,EAAEkH,EAAE,cAAc/G,EAAE+G,EAAE,cAAc3G,EAAE2G,EAAE,eAAeoC,EAAEpC,EAAE,sBAAsBmD,EAAEnD,EAAE,qBAAqBwa,EAAExa,EAAE,0BAA0BqL,EAAErL,EAAE,sBAAsB,CACjc,SAASC,EAAE5O,GAAG,GAAG,kBAAkBA,GAAG,OAAOA,EAAE,CAAC,IAAIkR,EAAElR,EAAEqI,SAAS,OAAO6I,GAAG,KAAKjR,EAAE,OAAOD,EAAEA,EAAE+B,MAAQ,KAAKoG,EAAE,KAAKhB,EAAE,KAAKrD,EAAE,KAAKyD,EAAE,KAAKC,EAAE,OAAOxH,EAAE,QAAQ,OAAOA,EAAEA,GAAGA,EAAEqI,UAAY,KAAKD,EAAE,KAAKhB,EAAE,KAAKQ,EAAE,KAAKH,EAAE,KAAKS,EAAE,OAAOlI,EAAE,QAAQ,OAAOkR,GAAG,KAAKjJ,EAAE,OAAOiJ,EAAE,CAAC,CACxJpR,EAAQ2vN,kBAAkB,SAASzvN,GAAG,OAAO4O,EAAE5O,KAAKoI,CAAC,wFCmBxJ,SAAiBkxF,GACtB,OAAKA,EAEE,CACLlwF,OAAQkwF,EAAQ2+B,aAChB9uH,MAAOmwF,EAAQ0+B,aAJI,CAAE5uH,OAAQ,EAAGD,MAAO,EAM1C,SAfM,SAAcuT,EAAeE,EAAak5M,GAC/C,OAAQ,EAAIA,GAAUp5M,EAAQo5M,EAASl5M,CACxC,WAlBM,SAAgB6C,EAAaC,GAClC,IAAMq2M,EAAerjN,KAAKyhE,UAAYz0D,EAAMD,EAAM,GAAKA,EAEvD,OAAKnN,OAAOg/D,UAAU7xD,IAASnN,OAAOg/D,UAAU5xD,GAGvChN,KAAK2Q,MAAM0yM,GAFXA,CAIV,kBA+BM,SAA0BC,GAC/B,IAAM71M,EAAQzN,KAAK2Q,MAAM3Q,KAAKyhE,SAAW6hJ,EAAM71N,QAC/C,OAAO61N,EAAM71M,EACd,+BC9CD,IAAIlb,EAAa9D,EAAQ,MASzB,SAASyD,EAAcoL,GAErB/K,EAAWjE,KAAKoZ,KAAiB,MAAXpK,EAAkB,WAAaA,EAAS/K,EAAWgxN,cACzE77M,KAAKnY,KAAO,eACd,CAZYd,EAAQ,MAcdw+E,SAAS/6E,EAAeK,EAAY,CACxCixN,YAAY,IAGdr2N,EAAOC,QAAU8E,+BCnBjB,IAAIuxN,EAAgBh1N,EAAQ,MACxBi1N,EAAcj1N,EAAQ,MAW1BtB,EAAOC,QAAU,SAAuB8I,EAASytN,GAC/C,OAAIztN,IAAYutN,EAAcE,GACrBD,EAAYxtN,EAASytN,GAEvBA,CACT,+BCjBA,IAAIzxN,EAAgBzD,EAAQ,MAQ5B,SAAS0D,EAAYyxN,GACnB,GAAwB,oBAAbA,EACT,MAAM,IAAI7pK,UAAU,gCAGtB,IAAI8pK,EAEJn8M,KAAK8mI,QAAU,IAAI77I,SAAQ,SAAyByE,GAClDysN,EAAiBzsN,CACnB,IAEA,IAAI0sN,EAAQp8M,KAGZA,KAAK8mI,QAAQp6G,MAAK,SAAS74B,GACzB,GAAKuoN,EAAMC,WAAX,CAEA,IAAIr2N,EACAmH,EAAIivN,EAAMC,WAAWt2N,OAEzB,IAAKC,EAAI,EAAGA,EAAImH,EAAGnH,IACjBo2N,EAAMC,WAAWr2N,GAAG6N,GAEtBuoN,EAAMC,WAAa,IARU,CAS/B,IAGAr8M,KAAK8mI,QAAQp6G,KAAO,SAAS4vL,GAC3B,IAAIC,EAEAz1E,EAAU,IAAI77I,SAAQ,SAASyE,GACjC0sN,EAAMroN,UAAUrE,GAChB6sN,EAAW7sN,CACb,IAAGg9B,KAAK4vL,GAMR,OAJAx1E,EAAQjzI,OAAS,WACfuoN,EAAMhsN,YAAYmsN,EACpB,EAEOz1E,CACT,EAEAo1E,GAAS,SAAgBtmN,GACnBwmN,EAAMx9L,SAKVw9L,EAAMx9L,OAAS,IAAIp0B,EAAcoL,GACjCumN,EAAeC,EAAMx9L,QACvB,GACF,CAKAn0B,EAAYhE,UAAUmuN,iBAAmB,WACvC,GAAI50M,KAAK4e,OACP,MAAM5e,KAAK4e,MAEf,EAMAn0B,EAAYhE,UAAUsN,UAAY,SAAmB8qD,GAC/C7+C,KAAK4e,OACPigC,EAAS7+C,KAAK4e,QAIZ5e,KAAKq8M,WACPr8M,KAAKq8M,WAAW5xM,KAAKo0C,GAErB7+C,KAAKq8M,WAAa,CAACx9J,EAEvB,EAMAp0D,EAAYhE,UAAU2J,YAAc,SAAqByuD,GACvD,GAAK7+C,KAAKq8M,WAAV,CAGA,IAAIt2M,EAAQ/F,KAAKq8M,WAAWlqN,QAAQ0sD,IACrB,IAAX94C,GACF/F,KAAKq8M,WAAWnrM,OAAOnL,EAAO,EAHhC,CAKF,EAMAtb,EAAYpE,OAAS,WACnB,IAAIwN,EAIJ,MAAO,CACLuoN,MAJU,IAAI3xN,GAAY,SAAkBoD,GAC5CgG,EAAShG,CACX,IAGEgG,OAAQA,EAEZ,EAEApO,EAAOC,QAAU+E,yBCpHjBhF,EAAOC,QAAU,SAAkB8L,GACjC,SAAUA,IAASA,EAAMsqN,WAC3B,+BCFA,IAAInyN,EAAQ5C,EAAQ,MAEpBtB,EAAOC,QACLiE,EAAMyB,uBAIK,CACLg3L,MAAO,SAAev6L,EAAM2J,EAAOgrN,EAASrlN,EAAMslN,EAAQC,GACxD,IAAIC,EAAS,GACbA,EAAOlyM,KAAK5iB,EAAO,IAAMgJ,mBAAmBW,IAExC7H,EAAM8sN,SAAS+F,IACjBG,EAAOlyM,KAAK,WAAa,IAAIlJ,KAAKi7M,GAASI,eAGzCjzN,EAAMmD,SAASqK,IACjBwlN,EAAOlyM,KAAK,QAAUtT,GAGpBxN,EAAMmD,SAAS2vN,IACjBE,EAAOlyM,KAAK,UAAYgyM,IAGX,IAAXC,GACFC,EAAOlyM,KAAK,UAGd9e,SAASgxN,OAASA,EAAO1kN,KAAK,KAChC,EAEAhF,KAAM,SAAcpL,GAClB,IAAI+xB,EAAQjuB,SAASgxN,OAAO/iM,MAAM,IAAIxzB,OAAO,aAAeyB,EAAO,cACnE,OAAQ+xB,EAAQ0sC,mBAAmB1sC,EAAM,IAAM,IACjD,EAEA+kC,OAAQ,SAAgB92D,GACtBmY,KAAKoiL,MAAMv6L,EAAM,GAAI0Z,KAAK6H,MAAQ,MACpC,GAMK,CACLg5K,MAAO,WAAkB,EACzBnvL,KAAM,WAAkB,OAAO,IAAM,EACrC0rD,OAAQ,WAAmB,iCC/CnC,SAASk+J,IAEP,GAC4C,qBAAnCvhH,gCAC4C,oBAA5CA,+BAA+BuhH,SAcxC,IAEEvhH,+BAA+BuhH,SAASA,EAC1C,CAAE,MAAOprN,GAGPyE,QAAQhB,MAAMzD,EAChB,CACF,CAKEorN,GACAp3N,EAAOC,QAAU,EAAjBD,6BCZFA,EAAOC,QAAU,SAAgB0jG,GAC/B,OAAO,SAAciuH,GACnB,OAAOjuH,EAASh+E,MAAM,KAAMisM,EAC9B,CACF,+BCvBE5xN,EAAOC,QAAU,EAAjBD,mCCDF,IAAIkE,EAAQ5C,EAAQ,MAQpBtB,EAAOC,QAAU,SAAsBqwC,GACrC,OAAOpsC,EAAM+zG,SAAS3nE,KAAsC,IAAzBA,EAAQ5qC,YAC7C,+BCTE1F,EAAOC,QAAU,EAAjBD,mCCDF,IAAIkE,EAAQ5C,EAAQ,MAChBoI,EAAWpI,EAAQ,MACnBoxN,EAAqBpxN,EAAQ,MAC7B+1N,EAAkB/1N,EAAQ,MAC1B+C,EAAc/C,EAAQ,MACtBqI,EAAgBrI,EAAQ,MACxB2O,EAAY3O,EAAQ,MAEpBwO,EAAaG,EAAUH,WAM3B,SAAS1L,EAAMU,GACbyV,KAAK48F,SAAWryG,EAChByV,KAAK+8M,aAAe,CAClB3yN,QAAS,IAAI+tN,EACb/mN,SAAU,IAAI+mN,EAElB,CAOAtuN,EAAMpD,UAAU2D,QAAU,SAAiB4yN,EAAavtN,GAG3B,kBAAhButN,GACTvtN,EAASA,GAAU,CAAC,GACb3D,IAAMkxN,EAEbvtN,EAASutN,GAAe,CAAC,GAG3BvtN,EAAS3F,EAAYkW,KAAK48F,SAAUntG,IAGzBkC,OACTlC,EAAOkC,OAASlC,EAAOkC,OAAO2B,cACrB0M,KAAK48F,SAASjrG,OACvBlC,EAAOkC,OAASqO,KAAK48F,SAASjrG,OAAO2B,cAErC7D,EAAOkC,OAAS,MAGlB,IAAIgB,EAAelD,EAAOkD,kBAELO,IAAjBP,GACF+C,EAAUU,cAAczD,EAAc,CACpCwrG,kBAAmB5oG,EAAW5C,aAAa4C,EAAW0nN,SACtD7+G,kBAAmB7oG,EAAW5C,aAAa4C,EAAW0nN,SACtDrqN,oBAAqB2C,EAAW5C,aAAa4C,EAAW0nN,WACvD,GAIL,IAAIC,EAA0B,GAC1BC,GAAiC,EACrCn9M,KAAK+8M,aAAa3yN,QAAQgJ,SAAQ,SAAoCgqN,GACjC,oBAAxBA,EAAY3E,UAA0D,IAAhC2E,EAAY3E,QAAQhpN,KAIrE0tN,EAAiCA,GAAkCC,EAAY5E,YAE/E0E,EAAwBrjM,QAAQujM,EAAY9E,UAAW8E,EAAY7E,UACrE,IAEA,IAKIzxE,EALAu2E,EAA2B,GAO/B,GANAr9M,KAAK+8M,aAAa3rN,SAASgC,SAAQ,SAAkCgqN,GACnEC,EAAyB5yM,KAAK2yM,EAAY9E,UAAW8E,EAAY7E,SACnE,KAIK4E,EAAgC,CACnC,IAAIG,EAAQ,CAACR,OAAiB5pN,GAM9B,IAJAhN,MAAMO,UAAUozB,QAAQzO,MAAMkyM,EAAOJ,GACrCI,EAAQA,EAAMh0N,OAAO+zN,GAErBv2E,EAAU77I,QAAQyE,QAAQD,GACnB6tN,EAAMv3N,QACX+gJ,EAAUA,EAAQp6G,KAAK4wL,EAAMrtM,QAASqtM,EAAMrtM,SAG9C,OAAO62H,CACT,CAIA,IADA,IAAIy2E,EAAY9tN,EACTytN,EAAwBn3N,QAAQ,CACrC,IAAIy3N,EAAcN,EAAwBjtM,QACtCwtM,EAAaP,EAAwBjtM,QACzC,IACEstM,EAAYC,EAAYD,EAC1B,CAAE,MAAOroN,GACPuoN,EAAWvoN,GACX,KACF,CACF,CAEA,IACE4xI,EAAUg2E,EAAgBS,EAC5B,CAAE,MAAOroN,GACP,OAAOjK,QAAQ0E,OAAOuF,EACxB,CAEA,KAAOmoN,EAAyBt3N,QAC9B+gJ,EAAUA,EAAQp6G,KAAK2wL,EAAyBptM,QAASotM,EAAyBptM,SAGpF,OAAO62H,CACT,EAEAj9I,EAAMpD,UAAUi3N,OAAS,SAAgBjuN,GACvCA,EAAS3F,EAAYkW,KAAK48F,SAAUntG,GACpC,IAAIuB,EAAW5B,EAAcK,EAAOjB,QAASiB,EAAO3D,KACpD,OAAOqD,EAAS6B,EAAUvB,EAAOoC,OAAQpC,EAAOqC,iBAClD,EAGAnI,EAAMyJ,QAAQ,CAAC,SAAU,MAAO,OAAQ,YAAY,SAA6BzB,GAE/E9H,EAAMpD,UAAUkL,GAAU,SAAS7F,EAAK2D,GACtC,OAAOuQ,KAAK5V,QAAQN,EAAY2F,GAAU,CAAC,EAAG,CAC5CkC,OAAQA,EACR7F,IAAKA,EACLgE,MAAOL,GAAU,CAAC,GAAGK,OAEzB,CACF,IAEAnG,EAAMyJ,QAAQ,CAAC,OAAQ,MAAO,UAAU,SAA+BzB,GAGrE,SAASgsN,EAAmBC,GAC1B,OAAO,SAAoB9xN,EAAKgE,EAAML,GACpC,OAAOuQ,KAAK5V,QAAQN,EAAY2F,GAAU,CAAC,EAAG,CAC5CkC,OAAQA,EACR3B,QAAS4tN,EAAS,CAChB,eAAgB,uBACd,CAAC,EACL9xN,IAAKA,EACLgE,KAAMA,IAEV,CACF,CAEAjG,EAAMpD,UAAUkL,GAAUgsN,IAE1B9zN,EAAMpD,UAAUkL,EAAS,QAAUgsN,GAAmB,EACxD,IAEAl4N,EAAOC,QAAUmE,yBC7JjBpE,EAAOC,QAAU,CACfy4G,mBAAmB,EACnBC,mBAAmB,EACnBxrG,qBAAqB,gCCFrBnN,EAAOC,QAAU,EAAjBD,mCCQF,IAAI2O,EAAQrN,EAAQ,MAClBoO,EAAOpO,EAAQ,MAIjB,IAAIsN,EAAW,oBAAsB7N,OAAO8N,GAAK9N,OAAO8N,GAHxD,SAAYC,EAAGC,GACb,OAAQD,IAAMC,IAAM,IAAMD,GAAK,EAAIA,IAAM,EAAIC,IAAQD,IAAMA,GAAKC,IAAMA,CACxE,EAEEc,EAAuBH,EAAKG,qBAC5B43F,EAAS94F,EAAM84F,OACfx4F,EAAYN,EAAMM,UAClBs4F,EAAU54F,EAAM44F,QAChBp4F,EAAgBR,EAAMQ,cACxBlP,EAAQm4N,iCAAmC,SACzC9pN,EACAiB,EACA8oN,EACAn0G,EACAo0G,GAEA,IAAIC,EAAU9wH,EAAO,MACrB,GAAI,OAAS8wH,EAAQ5vN,QAAS,CAC5B,IAAI0G,EAAO,CAAEmpN,UAAU,EAAIzsN,MAAO,MAClCwsN,EAAQ5vN,QAAU0G,CACpB,MAAOA,EAAOkpN,EAAQ5vN,QACtB4vN,EAAUhxH,GACR,WACE,SAASkxH,EAAiBC,GACxB,IAAKC,EAAS,CAIZ,GAHAA,GAAU,EACVC,EAAmBF,EACnBA,EAAex0G,EAASw0G,QACpB,IAAWJ,GAAWjpN,EAAKmpN,SAAU,CACvC,IAAIK,EAAmBxpN,EAAKtD,MAC5B,GAAIusN,EAAQO,EAAkBH,GAC5B,OAAQI,EAAoBD,CAChC,CACA,OAAQC,EAAoBJ,CAC9B,CAEA,GADAG,EAAmBC,EACflqN,EAASgqN,EAAkBF,GAAe,OAAOG,EACrD,IAAIE,EAAgB70G,EAASw0G,GAC7B,YAAI,IAAWJ,GAAWA,EAAQO,EAAkBE,IAC1CH,EAAmBF,EAAeG,IAC5CD,EAAmBF,EACXI,EAAoBC,EAC9B,CACA,IACEH,EACAE,EAFEH,GAAU,EAGZK,OACE,IAAWX,EAAoB,KAAOA,EAC1C,MAAO,CACL,WACE,OAAOI,EAAiBlpN,IAC1B,EACA,OAASypN,OACL,EACA,WACE,OAAOP,EAAiBO,IAC1B,EAER,GACA,CAACzpN,EAAa8oN,EAAmBn0G,EAAUo0G,IAE7C,IAAIvsN,EAAQ8D,EAAqBvB,EAAWiqN,EAAQ,GAAIA,EAAQ,IAShE,OARAtpN,GACE,WACEI,EAAKmpN,UAAW,EAChBnpN,EAAKtD,MAAQA,CACf,GACA,CAACA,IAEHoD,EAAcpD,GACPA,CACT,ICnFIktN,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqB1rN,IAAjB2rN,EACH,OAAOA,EAAan5N,QAGrB,IAAID,EAASi5N,EAAyBE,GAAY,CACjDj9M,GAAIi9M,EACJ58M,QAAQ,EACRtc,QAAS,CAAC,GAUX,OANAo5N,EAAoBF,GAAUn5N,EAAQA,EAAOC,QAASi5N,GAGtDl5N,EAAOuc,QAAS,EAGTvc,EAAOC,OACf,CAGAi5N,EAAoBvxN,EAAI0xN,EC3BxBH,EAAoBtxN,EAAK5H,IACxB,IAAIs5N,EAASt5N,GAAUA,EAAOqhH,WAC7B,IAAOrhH,EAAiB,QACxB,IAAM,EAEP,OADAk5N,EAAoB5wN,EAAEgxN,EAAQ,CAAEn5N,EAAGm5N,IAC5BA,CAAM,QCNd,IACIC,EADAC,EAAWz4N,OAAOuC,eAAkBo9E,GAAS3/E,OAAOuC,eAAeo9E,GAASA,GAASA,EAAa,UAQtGw4I,EAAoB7nN,EAAI,SAAStF,EAAOguB,GAEvC,GADU,EAAPA,IAAUhuB,EAAQwO,KAAKxO,IAChB,EAAPguB,EAAU,OAAOhuB,EACpB,GAAoB,kBAAVA,GAAsBA,EAAO,CACtC,GAAW,EAAPguB,GAAahuB,EAAMs1G,WAAY,OAAOt1G,EAC1C,GAAW,GAAPguB,GAAoC,oBAAfhuB,EAAMk7B,KAAqB,OAAOl7B,CAC5D,CACA,IAAIo+D,EAAKppE,OAAO8D,OAAO,MACvBq0N,EAAoBhoN,EAAEi5D,GACtB,IAAIg+C,EAAM,CAAC,EACXoxG,EAAiBA,GAAkB,CAAC,KAAMC,EAAS,CAAC,GAAIA,EAAS,IAAKA,EAASA,IAC/E,IAAI,IAAI7wN,EAAiB,EAAPoxB,GAAYhuB,EAAyB,iBAAXpD,KAAyB4wN,EAAe7sN,QAAQ/D,GAAUA,EAAU6wN,EAAS7wN,GACxH5H,OAAOoC,oBAAoBwF,GAASgF,SAASvM,GAAS+mH,EAAI/mH,GAAO,IAAO2K,EAAM3K,KAI/E,OAFA+mH,EAAa,QAAI,IAAM,EACvB+wG,EAAoB5wN,EAAE6hE,EAAIg+C,GACnBh+C,CACR,MCxBA+uJ,EAAoB5wN,EAAI,CAACrI,EAASw5N,KACjC,IAAI,IAAIr4N,KAAOq4N,EACXP,EAAoBpnN,EAAE2nN,EAAYr4N,KAAS83N,EAAoBpnN,EAAE7R,EAASmB,IAC5EL,OAAOmC,eAAejD,EAASmB,EAAK,CAAEi/D,YAAY,EAAMhlD,IAAKo+M,EAAWr4N,IAE1E,ECND83N,EAAoB5xN,EAAI,CAAC,EAGzB4xN,EAAoBj1N,EAAKy1N,GACjBl0N,QAAQF,IAAIvE,OAAOP,KAAK04N,EAAoB5xN,GAAG6pB,QAAO,CAAC5rB,EAAUnE,KACvE83N,EAAoB5xN,EAAElG,GAAKs4N,EAASn0N,GAC7BA,IACL,KCNJ2zN,EAAoBjnN,EAAKynN,GAEjB,aAAeA,EAAf,qBCFRR,EAAoBS,SAAYD,IAEf,ECHjBR,EAAoB7wN,EAAI,WACvB,GAA0B,kBAAf+wG,WAAyB,OAAOA,WAC3C,IACC,OAAO7+F,MAAQ,IAAIgyC,SAAS,cAAb,EAChB,CAAE,MAAOtoD,GACR,GAAsB,kBAAXgD,OAAqB,OAAOA,MACxC,CACA,CAPuB,GCAxBiyN,EAAoBpnN,EAAI,CAAC4uE,EAAKojI,IAAU/iN,OAAOC,UAAUE,eAAeC,KAAKu/E,EAAKojI,SCAlF,IAAI8V,EAAa,CAAC,EACdC,EAAoB,YAExBX,EAAoBxxN,EAAI,CAACrB,EAAKoE,EAAMrJ,EAAKs4N,KACxC,GAAGE,EAAWvzN,GAAQuzN,EAAWvzN,GAAK2e,KAAKva,OAA3C,CACA,IAAIkxL,EAAQm+B,EACZ,QAAWrsN,IAARrM,EAEF,IADA,IAAI24N,EAAU7zN,SAAS4f,qBAAqB,UACpCvlB,EAAI,EAAGA,EAAIw5N,EAAQz5N,OAAQC,IAAK,CACvC,IAAI4Q,EAAI4oN,EAAQx5N,GAChB,GAAG4Q,EAAE8U,aAAa,QAAU5f,GAAO8K,EAAE8U,aAAa,iBAAmB4zM,EAAoBz4N,EAAK,CAAEu6L,EAASxqL,EAAG,KAAO,CACpH,CAEGwqL,IACHm+B,GAAa,GACbn+B,EAASz1L,SAASC,cAAc,WAEzB6zN,QAAU,QACjBr+B,EAAOrvL,QAAU,IACb4sN,EAAoBe,IACvBt+B,EAAOp1L,aAAa,QAAS2yN,EAAoBe,IAElDt+B,EAAOp1L,aAAa,eAAgBszN,EAAoBz4N,GAExDu6L,EAAO3kI,IAAM3wD,GAEduzN,EAAWvzN,GAAO,CAACoE,GACnB,IAAIyvN,EAAmB,CAACC,EAAMx/K,KAE7BghJ,EAAO7uL,QAAU6uL,EAAOj5E,OAAS,KACjC3+E,aAAaz3B,GACb,IAAI8tN,EAAUR,EAAWvzN,GAIzB,UAHOuzN,EAAWvzN,GAClBs1L,EAAOjzG,YAAcizG,EAAOjzG,WAAWnvB,YAAYoiI,GACnDy+B,GAAWA,EAAQzsN,SAASw0C,GAAQA,EAAGxH,KACpCw/K,EAAM,OAAOA,EAAKx/K,EAAM,EAExBruC,EAAUK,WAAWutN,EAAiB/1N,KAAK,UAAMsJ,EAAW,CAAEvL,KAAM,UAAWqmF,OAAQozG,IAAW,MACtGA,EAAO7uL,QAAUotN,EAAiB/1N,KAAK,KAAMw3L,EAAO7uL,SACpD6uL,EAAOj5E,OAASw3G,EAAiB/1N,KAAK,KAAMw3L,EAAOj5E,QACnDo3G,GAAc5zN,SAASs8G,KAAKvrD,YAAY0kI,EApCkB,CAoCX,MCvChDu9B,EAAoBhoN,EAAKjR,IACH,qBAAXuH,QAA0BA,OAAO6yN,aAC1Ct5N,OAAOmC,eAAejD,EAASuH,OAAO6yN,YAAa,CAAEtuN,MAAO,WAE7DhL,OAAOmC,eAAejD,EAAS,aAAc,CAAE8L,OAAO,GAAO,ECL9DmtN,EAAoBoB,IAAOt6N,IAC1BA,EAAOu6N,MAAQ,GACVv6N,EAAOujF,WAAUvjF,EAAOujF,SAAW,IACjCvjF,GCHRk5N,EAAoBnxN,EAAI,UCKxB,IAAIyyN,EAAkB,CACrB,IAAK,GAGNtB,EAAoB5xN,EAAE2c,EAAI,CAACy1M,EAASn0N,KAElC,IAAIk1N,EAAqBvB,EAAoBpnN,EAAE0oN,EAAiBd,GAAWc,EAAgBd,QAAWjsN,EACtG,GAA0B,IAAvBgtN,EAGF,GAAGA,EACFl1N,EAASyf,KAAKy1M,EAAmB,QAC3B,CAGL,IAAIp5E,EAAU,IAAI77I,SAAQ,CAACyE,EAASC,IAAYuwN,EAAqBD,EAAgBd,GAAW,CAACzvN,EAASC,KAC1G3E,EAASyf,KAAKy1M,EAAmB,GAAKp5E,GAGtC,IAAIh7I,EAAM6yN,EAAoBnxN,EAAImxN,EAAoBjnN,EAAEynN,GAEpDjqN,EAAQ,IAAIgC,MAgBhBynN,EAAoBxxN,EAAErB,GAfFs0C,IACnB,GAAGu+K,EAAoBpnN,EAAE0oN,EAAiBd,KAEf,KAD1Be,EAAqBD,EAAgBd,MACRc,EAAgBd,QAAWjsN,GACrDgtN,GAAoB,CACtB,IAAIC,EAAY//K,IAAyB,SAAfA,EAAMz4C,KAAkB,UAAYy4C,EAAMz4C,MAChEy4N,EAAUhgL,GAASA,EAAM4tC,QAAU5tC,EAAM4tC,OAAOvxB,IACpDvnD,EAAMU,QAAU,iBAAmBupN,EAAU,cAAgBgB,EAAY,KAAOC,EAAU,IAC1FlrN,EAAMrN,KAAO,iBACbqN,EAAMvN,KAAOw4N,EACbjrN,EAAM9K,QAAUg2N,EAChBF,EAAmB,GAAGhrN,EACvB,CACD,GAEwC,SAAWiqN,EAASA,EAE/D,CACD,EAcF,IAAIkB,EAAuB,CAACC,EAA4BxwN,KACvD,IAKI8uN,EAAUO,EALVoB,EAAWzwN,EAAK,GAChB0wN,EAAc1wN,EAAK,GACnB2wN,EAAU3wN,EAAK,GAGI9J,EAAI,EAC3B,GAAGu6N,EAASjqM,MAAM3U,GAAgC,IAAxBs+M,EAAgBt+M,KAAa,CACtD,IAAIi9M,KAAY4B,EACZ7B,EAAoBpnN,EAAEipN,EAAa5B,KACrCD,EAAoBvxN,EAAEwxN,GAAY4B,EAAY5B,IAGhD,GAAG6B,EAAsBA,EAAQ9B,EAClC,CAEA,IADG2B,GAA4BA,EAA2BxwN,GACrD9J,EAAIu6N,EAASx6N,OAAQC,IACzBm5N,EAAUoB,EAASv6N,GAChB24N,EAAoBpnN,EAAE0oN,EAAiBd,IAAYc,EAAgBd,IACrEc,EAAgBd,GAAS,KAE1Bc,EAAgBd,GAAW,CAC5B,EAIGuB,EAAqBhhN,KAA2B,qBAAIA,KAA2B,sBAAK,GACxFghN,EAAmBttN,QAAQitN,EAAqBz2N,KAAK,KAAM,IAC3D82N,EAAmBj2M,KAAO41M,EAAqBz2N,KAAK,KAAM82N,EAAmBj2M,KAAK7gB,KAAK82N,+BChF3EC,EAAAA,sQAAAA,EAAAA,IAAAA,EAsBX,KAdC,UAOAA,EAAA,YAMAA,EAAA,kBAsKF,MAAMC,EAAoB,WAySV,SAAAC,EAAUrvN,EAAYoE,GACpC,IAAc,IAAVpE,GAA6B,OAAVA,GAAmC,qBAAVA,EAC9C,MAAM,IAAI0F,MAAMtB,EAEpB,CAEgB,SAAAurL,EAAQ2/B,EAAWlrN,GACjC,IAAKkrN,EAAM,CAEc,qBAAZ5qN,SAAyBA,QAAQC,KAAKP,GAEjD,IAME,MAAM,IAAIsB,MAAMtB,EAEjB,CAAC,MAAOlM,GAAI,CACd,CACH,CASA,SAASq3N,EAAgBp0N,EAAoBoZ,GAC3C,MAAO,CACLi7M,IAAKr0N,EAAS0uC,MACdx0C,IAAK8F,EAAS9F,IACdovK,IAAKlwJ,EAET,CAKM,SAAUk7M,EACd7yN,EACAkvE,EACAjiC,EACAx0C,GAcA,YAfA,IAAAw0C,IAAAA,EAAa,MAGD6lL,EAAA,CACV10N,SAA6B,kBAAZ4B,EAAuBA,EAAUA,EAAQ5B,SAC1DJ,OAAQ,GACRC,KAAM,IACY,kBAAPixE,EAAkB6jJ,EAAU7jJ,GAAMA,EAAE,CAC/CjiC,QAKAx0C,IAAMy2E,GAAOA,EAAgBz2E,KAAQA,GAjChCyR,KAAKyhE,SAASrzE,SAAS,IAAIozH,OAAO,EAAG,IAoC9C,CAKgB,SAAAsnG,EAAUnlG,GAIV,IAJW,SACzBzvH,EAAW,IAAG,OACdJ,EAAS,GAAE,KACXC,EAAO,IACO4vH,EAKd,OAJI7vH,GAAqB,MAAXA,IACZI,GAAiC,MAArBJ,EAAOK,OAAO,GAAaL,EAAS,IAAMA,GACpDC,GAAiB,MAATA,IACVG,GAA+B,MAAnBH,EAAKI,OAAO,GAAaJ,EAAO,IAAMA,GAC7CG,CACT,CAKM,SAAU20N,EAAUhqN,GACxB,IAAIkqN,EAA4B,CAAC,EAEjC,GAAIlqN,EAAM,CACR,IAAImqN,EAAYnqN,EAAKhF,QAAQ,KACzBmvN,GAAa,IACfD,EAAWh1N,KAAO8K,EAAK2iH,OAAOwnG,GAC9BnqN,EAAOA,EAAK2iH,OAAO,EAAGwnG,IAGxB,IAAIC,EAAcpqN,EAAKhF,QAAQ,KAC3BovN,GAAe,IACjBF,EAAWj1N,OAAS+K,EAAK2iH,OAAOynG,GAChCpqN,EAAOA,EAAK2iH,OAAO,EAAGynG,IAGpBpqN,IACFkqN,EAAW70N,SAAW2K,EAEzB,CAED,OAAOkqN,CACT,CASA,SAASG,EACPznE,EACA0nE,EACAC,EACArrN,QAAA,IAAAA,IAAAA,EAA6B,CAAC,GAE9B,IAAI,OAAE3J,EAASf,SAAS2yF,YAAY,SAAEqjI,GAAW,GAAUtrN,EACvDurN,EAAgBl1N,EAAOm1N,QACvBh6L,EAAS84L,EAAOmB,IAChBjjK,EAA4B,KAE5B94C,EAAQg8M,IASZ,SAASA,IAEP,OADYH,EAAcvmL,OAAS,CAAE46H,IAAK,OAC7BA,GACf,CAEA,SAAS+rD,IACPn6L,EAAS84L,EAAOmB,IAChB,IAAIG,EAAYF,IACZpd,EAAqB,MAAbsd,EAAoB,KAAOA,EAAYl8M,EACnDA,EAAQk8M,EACJpjK,GACFA,EAAS,CAAEh3B,SAAQl7B,SAAUk1N,EAAQl1N,SAAUg4M,SAEnD,CA+CA,SAASud,EAAU5kJ,GAIjB,IAAI4P,EACyB,SAA3BxgF,EAAOC,SAASsrE,OACZvrE,EAAOC,SAASsrE,OAChBvrE,EAAOC,SAASZ,KAElBA,EAAqB,kBAAPuxE,EAAkBA,EAAK8jJ,EAAW9jJ,GASpD,OALAvxE,EAAOA,EAAKG,QAAQ,KAAM,OAC1B20N,EACE3zI,EACsE,sEAAAnhF,GAEjE,IAAI+lB,IAAI/lB,EAAMmhF,EACvB,CApFa,MAATnnE,IACFA,EAAQ,EACR67M,EAAcO,aAAYjB,EAAM,GAAAU,EAAcvmL,MAAO,CAAA46H,IAAKlwJ,IAAS,KAoFrE,IAAI87M,EAAmB,CACrB,UAAIh6L,GACF,OAAOA,GAET,YAAIl7B,GACF,OAAOotJ,EAAYrtJ,EAAQk1N,IAE7BQ,MAAAA,CAAOx6K,GACL,GAAIiX,EACF,MAAM,IAAI3nD,MAAM,8CAKlB,OAHAxK,EAAOgH,iBAAiBktN,EAAmBoB,GAC3CnjK,EAAWjX,EAEJ,KACLl7C,EAAO4D,oBAAoBswN,EAAmBoB,GAC9CnjK,EAAW,IAAI,GAGnB4iK,WAAWnkJ,GACFmkJ,EAAW/0N,EAAQ4wE,GAE5B4kJ,YACAG,cAAAA,CAAe/kJ,GAEb,IAAIxxE,EAAMo2N,EAAU5kJ,GACpB,MAAO,CACL9wE,SAAUV,EAAIU,SACdJ,OAAQN,EAAIM,OACZC,KAAMP,EAAIO,OAGdoe,KAlGF,SAAc6yD,EAAQjiC,GACpBxT,EAAS84L,EAAO2B,KAChB,IAAI31N,EAAWs0N,EAAeY,EAAQl1N,SAAU2wE,EAAIjiC,GAChDqmL,GAAkBA,EAAiB/0N,EAAU2wE,GAEjDv3D,EAAQg8M,IAAa,EACrB,IAAIQ,EAAexB,EAAgBp0N,EAAUoZ,GACzCja,EAAM+1N,EAAQJ,WAAW90N,GAG7B,IACEi1N,EAAcY,UAAUD,EAAc,GAAIz2N,GAC1C,MAAOoJ,GAKP,GAAIA,aAAiBujD,cAA+B,mBAAfvjD,EAAMrN,KACzC,MAAMqN,EAIRxI,EAAOC,SAASy5E,OAAOt6E,EACxB,CAEG61N,GAAY9iK,GACdA,EAAS,CAAEh3B,SAAQl7B,SAAUk1N,EAAQl1N,SAAUg4M,MAAO,GAE1D,EAuEEz4M,QArEF,SAAiBoxE,EAAQjiC,GACvBxT,EAAS84L,EAAO8B,QAChB,IAAI91N,EAAWs0N,EAAeY,EAAQl1N,SAAU2wE,EAAIjiC,GAChDqmL,GAAkBA,EAAiB/0N,EAAU2wE,GAEjDv3D,EAAQg8M,IACR,IAAIQ,EAAexB,EAAgBp0N,EAAUoZ,GACzCja,EAAM+1N,EAAQJ,WAAW90N,GAC7Bi1N,EAAcO,aAAaI,EAAc,GAAIz2N,GAEzC61N,GAAY9iK,GACdA,EAAS,CAAEh3B,SAAQl7B,SAAUk1N,EAAQl1N,SAAUg4M,MAAO,GAE1D,EAyDE1gI,GAAG52E,GACMu0N,EAAc39I,GAAG52E,IAI5B,OAAOw0N,CACT,CC7tBA,IAAYa,EAAAA,KAAAA,IAAAA,EAKX,KAJC,YACAA,EAAA,oBACAA,EAAA,oBACAA,EAAA,cA4RgC,IAAIjsJ,IAAuB,CAC3D,OACA,gBACA,OACA,KACA,QACA,aAoNI,SAAUksJ,EAGdC,EACAC,EACAprB,GAEA,YAFQ,IAARA,IAAAA,EAAW,KAEJqrB,EAAgBF,EAAQC,EAAaprB,GAAU,EACxD,CAEM,SAAUqrB,EAGdF,EACAC,EACAprB,EACAsrB,GAEA,IAGIv2N,EAAWw2N,GAFU,kBAAhBH,EAA2B1B,EAAU0B,GAAeA,GAEvBr2N,UAAY,IAAKirM,GAEvD,GAAgB,MAAZjrM,EACF,OAAO,KAGT,IAAIy2N,EAAWC,EAAcN,IAmM/B,SAA2BK,GACzBA,EAAStuL,MAAK,CAAC/uC,EAAGC,IAChBD,EAAE8qC,QAAU7qC,EAAE6qC,MACV7qC,EAAE6qC,MAAQ9qC,EAAE8qC,MAyCpB,SAAwB9qC,EAAaC,GACnC,IAAIs9N,EACFv9N,EAAEG,SAAWF,EAAEE,QAAUH,EAAEwa,MAAM,GAAI,GAAGqqG,OAAM,CAACp9G,EAAGrH,IAAMqH,IAAMxH,EAAEG,KAElE,OAAOm9N,EAKHv9N,EAAEA,EAAEG,OAAS,GAAKF,EAAEA,EAAEE,OAAS,GAG/B,CACN,CArDQq9N,CACEx9N,EAAEy9N,WAAW9zM,KAAKk+D,GAASA,EAAK61I,gBAChCz9N,EAAEw9N,WAAW9zM,KAAKk+D,GAASA,EAAK61I,kBAG1C,CA3MEC,CAAkBN,GAElB,IAAInyL,EAAU,KACd,IAAK,IAAI9qC,EAAI,EAAc,MAAX8qC,GAAmB9qC,EAAIi9N,EAASl9N,SAAUC,EAAG,CAO3D,IAAIw9N,EAAUC,EAAWj3N,GACzBskC,EAAU4yL,EACRT,EAASj9N,GACTw9N,EACAT,EAEH,CAED,OAAOjyL,CACT,CAyCA,SAASoyL,EAGPN,EACAK,EACAU,EACAC,QAF2C,IAA3CX,IAAAA,EAA2C,SAC3C,IAAAU,IAAAA,EAA4C,SAClC,IAAVC,IAAAA,EAAa,IAEb,IAAIC,EAAeA,CACjBC,EACA/9M,EACAg+M,KAEA,IAAIt2I,EAAmC,CACrCs2I,kBACmB7wN,IAAjB6wN,EAA6BD,EAAM3sN,MAAQ,GAAK4sN,EAClDC,eAAuC,IAAxBF,EAAME,cACrBV,cAAev9M,EACf+9M,SAGEr2I,EAAKs2I,aAAax7L,WAAW,OAC/Bs4L,EACEpzI,EAAKs2I,aAAax7L,WAAWq7L,GAC7B,wBAAwBn2I,EAAKs2I,aAA7B,wBACMH,EADN,4GAKFn2I,EAAKs2I,aAAet2I,EAAKs2I,aAAa3jN,MAAMwjN,EAAW79N,SAGzD,IAAIoR,EAAO8sN,EAAU,CAACL,EAAYn2I,EAAKs2I,eACnCV,EAAaM,EAAYr6N,OAAOmkF,GAKhCq2I,EAAM96I,UAAY86I,EAAM96I,SAASjjF,OAAS,IAC5C86N,GAGkB,IAAhBiD,EAAM/9M,MACN,4FACuC5O,EAAI,MAE7C+rN,EAAcY,EAAM96I,SAAUi6I,EAAUI,EAAYlsN,KAKpC,MAAd2sN,EAAM3sN,MAAiB2sN,EAAM/9M,QAIjCk9M,EAASx4M,KAAK,CACZtT,OACAu5B,MAAOwzL,EAAa/sN,EAAM2sN,EAAM/9M,OAChCs9M,cACA,EAaJ,OAXAT,EAAOxvN,SAAQ,CAAC0wN,EAAO/9M,KAAS,IAAAo+M,EAE9B,GAAmB,KAAfL,EAAM3sN,MAA0B,OAAXgtN,EAACL,EAAM3sN,OAANgtN,EAAYp3M,SAAS,KAG7C,IAAK,IAAIq3M,KAAYC,EAAwBP,EAAM3sN,MACjD0sN,EAAaC,EAAO/9M,EAAOq+M,QAH7BP,EAAaC,EAAO/9M,EAKrB,IAGIk9M,CACT,CAgBA,SAASoB,EAAwBltN,GAC/B,IAAIwlI,EAAWxlI,EAAKY,MAAM,KAC1B,GAAwB,IAApB4kI,EAAS52I,OAAc,MAAO,GAElC,IAAKwc,KAAU+hN,GAAQ3nF,EAGnB4nF,EAAahiN,EAAM40M,SAAS,KAE5Br8C,EAAWv4J,EAAMrW,QAAQ,MAAO,IAEpC,GAAoB,IAAhBo4N,EAAKv+N,OAGP,OAAOw+N,EAAa,CAACzpD,EAAU,IAAM,CAACA,GAGxC,IAAI0pD,EAAeH,EAAwBC,EAAKrsN,KAAK,MAEjDxB,EAAmB,GAqBvB,OAZAA,EAAOgU,QACF+5M,EAAaj1M,KAAKk1M,GACP,KAAZA,EAAiB3pD,EAAW,CAACA,EAAU2pD,GAASxsN,KAAK,QAKrDssN,GACF9tN,EAAOgU,QAAQ+5M,GAIV/tN,EAAO8Y,KAAK60M,GACjBjtN,EAAKoxB,WAAW,MAAqB,KAAb67L,EAAkB,IAAMA,GAEpD,CAaA,MAAMM,EAAU,YACVC,EAAsB,EACtBC,EAAkB,EAClBC,EAAoB,EACpBC,EAAqB,GACrBC,GAAgB,EAChBC,EAAWpuN,GAAoB,MAANA,EAE/B,SAASstN,EAAa/sN,EAAc4O,GAClC,IAAI42H,EAAWxlI,EAAKY,MAAM,KACtBktN,EAAetoF,EAAS52I,OAS5B,OARI42I,EAASrmH,KAAK0uM,KAChBC,GAAgBF,GAGdh/M,IACFk/M,GAAgBL,GAGXjoF,EACJ57H,QAAQnK,IAAOouN,EAAQpuN,KACvBggB,QACC,CAAC8Z,EAAOw0L,IACNx0L,GACCg0L,EAAQn5N,KAAK25N,GACVP,EACY,KAAZO,EACAL,EACAC,IACNG,EAEN,CAiBA,SAASvB,EAIPyB,EACA34N,EACAu2N,QAAY,IAAZA,IAAAA,GAAe,GAEf,IAAI,WAAEM,GAAe8B,EAEjBC,EAAgB,CAAC,EACjBC,EAAkB,IAClBv0L,EAA2D,GAC/D,IAAK,IAAI9qC,EAAI,EAAGA,EAAIq9N,EAAWt9N,SAAUC,EAAG,CAC1C,IAAIynF,EAAO41I,EAAWr9N,GAClBwc,EAAMxc,IAAMq9N,EAAWt9N,OAAS,EAChCu/N,EACkB,MAApBD,EACI74N,EACAA,EAAS4T,MAAMilN,EAAgBt/N,SAAW,IAC5C6zB,EAAQ2rM,EACV,CAAEpuN,KAAMs2E,EAAKs2I,aAAcC,cAAev2I,EAAKu2I,cAAexhN,OAC9D8iN,GAGExB,EAAQr2I,EAAKq2I,MAkBjB,IAfGlqM,GACDpX,GACAugN,IACCM,EAAWA,EAAWt9N,OAAS,GAAG+9N,MAAM/9M,QAEzC6T,EAAQ2rM,EACN,CACEpuN,KAAMs2E,EAAKs2I,aACXC,cAAev2I,EAAKu2I,cACpBxhN,KAAK,GAEP8iN,KAIC1rM,EACH,OAAO,KAGTpzB,OAAO4/E,OAAOg/I,EAAexrM,EAAM/nB,QAEnCi/B,EAAQrmB,KAAK,CAEX5Y,OAAQuzN,EACR54N,SAAUy3N,EAAU,CAACoB,EAAiBzrM,EAAMptB,WAC5Cg5N,aAAcC,EACZxB,EAAU,CAACoB,EAAiBzrM,EAAM4rM,gBAEpC1B,UAGyB,MAAvBlqM,EAAM4rM,eACRH,EAAkBpB,EAAU,CAACoB,EAAiBzrM,EAAM4rM,eAEvD,CAED,OAAO10L,CACT,CAiHgB,SAAAy0L,EAId/O,EACAhqN,GAEuB,kBAAZgqN,IACTA,EAAU,CAAEr/M,KAAMq/M,EAASwN,eAAe,EAAOxhN,KAAK,IAGxD,IAAKkjN,EAASC,GA4ChB,SACExuN,EACA6sN,EACAxhN,QADa,IAAbwhN,IAAAA,GAAgB,QACb,IAAHxhN,IAAAA,GAAM,GAEN2+K,EACW,MAAThqL,IAAiBA,EAAKggN,SAAS,MAAQhgN,EAAKggN,SAAS,MACrD,eAAehgN,EAAf,oCACMA,EAAKjL,QAAQ,MAAO,MAD1B,qIAGsCiL,EAAKjL,QAAQ,MAAO,MAAK,MAGjE,IAAI2F,EAA8B,GAC9B+zN,EACF,IACAzuN,EACGjL,QAAQ,UAAW,IACnBA,QAAQ,OAAQ,KAChBA,QAAQ,qBAAsB,QAC9BA,QACC,qBACA,CAAC4T,EAAW+lN,EAAmBtB,KAC7B1yN,EAAO4Y,KAAK,CAAEo7M,YAAWtB,WAA0B,MAAdA,IAC9BA,EAAa,eAAiB,gBAIzCptN,EAAKggN,SAAS,MAChBtlN,EAAO4Y,KAAK,CAAEo7M,UAAW,MACzBD,GACW,MAATzuN,GAAyB,OAATA,EACZ,QACA,qBACGqL,EAETojN,GAAgB,QACE,KAATzuN,GAAwB,MAATA,IAQxByuN,GAAgB,iBAKlB,IAAIF,EAAU,IAAIt/N,OAAOw/N,EAAc5B,OAAgB9wN,EAAY,KAEnE,MAAO,CAACwyN,EAAS7zN,EACnB,CAjGkCi0N,CAC9BtP,EAAQr/M,KACRq/M,EAAQwN,cACRxN,EAAQh0M,KAGNoX,EAAQptB,EAASotB,MAAM8rM,GAC3B,IAAK9rM,EAAO,OAAO,KAEnB,IAAIyrM,EAAkBzrM,EAAM,GACxB4rM,EAAeH,EAAgBn5N,QAAQ,UAAW,MAClD65N,EAAgBnsM,EAAMxZ,MAAM,GAuBhC,MAAO,CACLvO,OAvBmB8zN,EAAe/uM,QAClC,CAAC8oG,EAAIzD,EAA6Bl2G,KAAS,IAApC,UAAE8/M,EAAS,WAAEtB,GAAYtoG,EAG9B,GAAkB,MAAd4pG,EAAmB,CACrB,IAAIG,EAAaD,EAAchgN,IAAU,GACzCy/M,EAAeH,EACZjlN,MAAM,EAAGilN,EAAgBt/N,OAASigO,EAAWjgO,QAC7CmG,QAAQ,UAAW,KACvB,CAED,MAAMsF,EAAQu0N,EAAchgN,GAM5B,OAJE25G,EAAKmmG,GADHtB,IAAe/yN,OACC0B,GAEC1B,GAAS,IAAItF,QAAQ,OAAQ,KAE3CwzH,CAAI,GAEb,CAAC,GAKDlzH,SAAU64N,EACVG,eACAhP,UAEJ,CA2DM,SAAUiN,EAAWjyN,GACzB,IACE,OAAOA,EACJuG,MAAM,KACNwX,KAAKR,GAAMu3C,mBAAmBv3C,GAAG7iB,QAAQ,MAAO,SAChD+L,KAAK,KACR,MAAO/C,GAQP,OAPAisL,GACE,EACA,iBAAiB3vL,EAAjB,oHAEe0D,EAAK,MAGf1D,CACR,CACH,CAKgB,SAAAwxN,EACdx2N,EACAirM,GAEA,GAAiB,MAAbA,EAAkB,OAAOjrM,EAE7B,IAAKA,EAAS8G,cAAci1B,WAAWkvK,EAASnkM,eAC9C,OAAO,KAKT,IAAI2yN,EAAaxuB,EAAS0f,SAAS,KAC/B1f,EAAS1xM,OAAS,EAClB0xM,EAAS1xM,OACTmgO,EAAW15N,EAASC,OAAOw5N,GAC/B,OAAIC,GAAyB,MAAbA,EAEP,KAGF15N,EAAS4T,MAAM6lN,IAAe,GACvC,CA2CA,SAASE,EACPjlI,EACAwgC,EACA0kG,EACAjvN,GAEA,MACE,qBAAqB+pF,EAArB,2CACQwgC,EAAK,YAAahhG,KAAKC,UAC7BxpB,GAFF,yCAIQivN,EAJR,2HAOJ,CAyBM,SAAUC,EAEdv1L,GACA,OAAOA,EAAQ/vB,QACb,CAAC6Y,EAAO7T,IACI,IAAVA,GAAgB6T,EAAMkqM,MAAM3sN,MAAQyiB,EAAMkqM,MAAM3sN,KAAKpR,OAAS,GAEpE,CAIgB,SAAAugO,EAEdx1L,EAAcy1L,GACd,IAAIC,EAAcH,EAA2Bv1L,GAK7C,OAAIy1L,EACKC,EAAYj3M,KAAI,CAACqK,EAAOq8I,IAC7BA,IAAQuwD,EAAYzgO,OAAS,EAAI6zB,EAAMptB,SAAWotB,EAAM4rM,eAIrDgB,EAAYj3M,KAAKqK,GAAUA,EAAM4rM,cAC1C,CAKM,SAAUiB,EACdC,EACAC,EACAC,EACAC,GAEA,IAAIvpJ,OAFU,IAAdupJ,IAAAA,GAAiB,GAGI,kBAAVH,EACTppJ,EAAK6jJ,EAAUuF,IAEfppJ,EAAE4jJ,EAAQ,GAAAwF,GAEV7F,GACGvjJ,EAAG9wE,WAAa8wE,EAAG9wE,SAASugB,SAAS,KACtCo5M,EAAoB,IAAK,WAAY,SAAU7oJ,IAEjDujJ,GACGvjJ,EAAG9wE,WAAa8wE,EAAG9wE,SAASugB,SAAS,KACtCo5M,EAAoB,IAAK,WAAY,OAAQ7oJ,IAE/CujJ,GACGvjJ,EAAGlxE,SAAWkxE,EAAGlxE,OAAO2gB,SAAS,KAClCo5M,EAAoB,IAAK,SAAU,OAAQ7oJ,KAI/C,IAGIh0D,EAHAw9M,EAAwB,KAAVJ,GAAgC,KAAhBppJ,EAAG9wE,SACjCu6N,EAAaD,EAAc,IAAMxpJ,EAAG9wE,SAaxC,GAAkB,MAAdu6N,EACFz9M,EAAOs9M,MACF,CACL,IAAII,EAAqBL,EAAe5gO,OAAS,EAMjD,IAAK8gO,GAAkBE,EAAWx+L,WAAW,MAAO,CAClD,IAAI0+L,EAAaF,EAAWhvN,MAAM,KAElC,KAAyB,OAAlBkvN,EAAW,IAChBA,EAAWh3M,QACX+2M,GAAsB,EAGxB1pJ,EAAG9wE,SAAWy6N,EAAWhvN,KAAK,IAC/B,CAEDqR,EAAO09M,GAAsB,EAAIL,EAAeK,GAAsB,GACvE,CAED,IAAI7vN,WAzKsBmmE,EAAQ4pJ,QAAY,IAAZA,IAAAA,EAAe,KACjD,IACE16N,SAAUu6N,EAAU,OACpB36N,EAAS,GAAE,KACXC,EAAO,IACS,kBAAPixE,EAAkB6jJ,EAAU7jJ,GAAMA,EAEzC9wE,EAAWu6N,EACXA,EAAWx+L,WAAW,KACpBw+L,EAWR,SAAyBhD,EAAsBmD,GAC7C,IAAIvqF,EAAWuqF,EAAah7N,QAAQ,OAAQ,IAAI6L,MAAM,KAYtD,OAXuBgsN,EAAahsN,MAAM,KAEzB3E,SAAS8xN,IACR,OAAZA,EAEEvoF,EAAS52I,OAAS,GAAG42I,EAASriH,MACb,MAAZ4qM,GACTvoF,EAASlyH,KAAKy6M,EACf,IAGIvoF,EAAS52I,OAAS,EAAI42I,EAAS1kI,KAAK,KAAO,GACpD,CAxBQkvN,CAAgBJ,EAAYG,GAC9BA,EAEJ,MAAO,CACL16N,WACAJ,OAAQg7N,EAAgBh7N,GACxBC,KAAMg7N,EAAch7N,GAExB,CAuJai7N,CAAYhqJ,EAAIh0D,GAGvBi+M,EACFR,GAA6B,MAAfA,GAAsBA,EAAW5P,SAAS,KAEtDqQ,GACDV,GAA8B,MAAfC,IAAuBH,EAAiBzP,SAAS,KAQnE,OANGhgN,EAAK3K,SAAS2qN,SAAS,OACvBoQ,IAA4BC,IAE7BrwN,EAAK3K,UAAY,KAGZ2K,CACT,OAiBa8sN,EAAajE,GACxBA,EAAM/nN,KAAK,KAAK/L,QAAQ,SAAU,KAKvBu5N,EAAqBj5N,GAChCA,EAASN,QAAQ,OAAQ,IAAIA,QAAQ,OAAQ,KAKlCk7N,EAAmBh7N,GAC7BA,GAAqB,MAAXA,EAEPA,EAAOm8B,WAAW,KAClBn8B,EACA,IAAMA,EAHN,GAQOi7N,EAAiBh7N,GAC3BA,GAAiB,MAATA,EAAoBA,EAAKk8B,WAAW,KAAOl8B,EAAO,IAAMA,EAAzC,GAwDgB6K,MAySpC,SAAUuwN,EAAqBvyN,GACnC,OACW,MAATA,GACwB,kBAAjBA,EAAM5D,QACe,kBAArB4D,EAAM3D,YACa,mBAAnB2D,EAAMwyN,UACb,SAAUxyN,CAEd,CCpgCA,MAAMyyN,EAAgD,CACpD,OACA,MACA,QACA,UAMIC,GAJuB,IAAInxJ,IAC/BkxJ,GAG2C,CAC3C,SACGA,IAEuB,IAAIlxJ,IAAgBmxJ,GAEpB,IAAInxJ,IAAI,CAAC,IAAK,IAAK,IAAK,IAAK,MACf,IAAIA,IAAI,CAAC,IAAK,MA2qFlBxpE,OAAO,gPCjyGtC,MAAM46N,EACXzzN,EAAAA,cAAoD,MAK/C,MAAM0zN,EAAyB1zN,EAAAA,cAEpC,MA8CK,MAAM2zN,EAAoB3zN,EAAAA,cAC/B,MAYK,MAAM4zN,EAAkB5zN,EAAAA,cAC7B,YAaW6zN,EAAe7zN,EAAAA,cAAwC,CAClE8zN,OAAQ,KACRp3L,QAAS,GACTq3L,aAAa,IAOR,MAAMC,EAAoBh0N,EAAAA,cAAyB,MCjFnD,SAASi0N,IACd,OAA4C,MAArCj0N,EAAAA,WAAiB4zN,EAC1B,CAYO,SAASM,IAQd,OANED,KADFE,GAAU,GAOHn0N,EAAAA,WAAiB4zN,GAAiBr7N,QAC3C,CAkDA,SAAS67N,EACPlgJ,GAEel0E,EAAAA,WAAiB2zN,GAAmBhsE,QAKjD3nJ,EAAAA,gBAAsBk0E,EAE1B,CAQO,SAASmgJ,KACd,IAAI,YAAEN,GAAgB/zN,EAAAA,WAAiB6zN,GAGvC,OAAOE,EA24BT,WACE,IAAI,OAAEO,GAAWC,GAAqBC,GAAeC,mBACjDlnN,EAAKmnN,GAAkBC,GAAoBF,mBAE3CG,EAAY50N,EAAAA,QAAa,GAsB7B,OArBAo0N,GAA0B,KACxBQ,EAAU56N,SAAU,CAAI,IAGOgG,EAAAA,aAC/B,SAACkpE,EAAiBjnE,QAAwB,IAAxBA,IAAAA,EAA2B,CAAC,GAKvC2yN,EAAU56N,UAEG,kBAAPkvE,EACTorJ,EAAOO,SAAS3rJ,GAEhBorJ,EAAOO,SAAS3rJ,EAAE4jJ,EAAA,CAAIgI,YAAavnN,GAAOtL,IAE9C,GACA,CAACqyN,EAAQ/mN,GAIb,CAt6BuBwnN,GAGvB,WAEId,KADFE,GAAU,GAOV,IAAIa,EAAoBh1N,EAAAA,WAAiByzN,IACrC,SAAEpwB,EAAQ,OAAE4xB,EAAM,UAAE79N,GAAc4I,EAAAA,WAAiB2zN,IACnD,QAAEj3L,GAAY18B,EAAAA,WAAiB6zN,IAC7Bz7N,SAAUo6N,GAAqB0B,IAEjCgB,EAAqB5oM,KAAKC,UAC5B4oM,EAAoBz4L,EAASu4L,EAAO9C,uBAGlCyC,EAAY50N,EAAAA,QAAa,GAqD7B,OApDAo0N,GAA0B,KACxBQ,EAAU56N,SAAU,CAAI,IAGOgG,EAAAA,aAC/B,SAACkpE,EAAiBjnE,GAKhB,QALwC,IAAxBA,IAAAA,EAA2B,CAAC,IAKvC2yN,EAAU56N,QAAS,OAExB,GAAkB,kBAAPkvE,EAET,YADA9xE,EAAUy4E,GAAG3G,GAIf,IAAInmE,EAAOsvN,EACTnpJ,EACA58C,KAAK/F,MAAM2uM,GACX1C,EACqB,SAArBvwN,EAAQ43H,UASe,MAArBm7F,GAA0C,MAAb3xB,IAC/BtgM,EAAK3K,SACe,MAAlB2K,EAAK3K,SACDirM,EACAwsB,EAAU,CAACxsB,EAAUtgM,EAAK3K,aAG/B6J,EAAQnK,QAAUV,EAAUU,QAAUV,EAAUif,MACjDtT,EACAd,EAAQglC,MACRhlC,EAEJ,GACA,CACEohM,EACAjsM,EACA89N,EACA1C,EACAwC,GAKN,CA1E6CI,EAC7C,CA2HO,SAASC,GACdnsJ,EAAMosJ,GAEA,IADN,SAAEz7F,QAA8C,IAAAy7F,EAAG,CAAC,EAACA,GAEjD,OAAEL,GAAWj1N,EAAAA,WAAiB2zN,IAC9B,QAAEj3L,GAAY18B,EAAAA,WAAiB6zN,IAC7Bz7N,SAAUo6N,GAAqB0B,IACjCgB,EAAqB5oM,KAAKC,UAC5B4oM,EAAoBz4L,EAASu4L,EAAO9C,uBAGtC,OAAOnyN,EAAAA,SACL,IACEqyN,EACEnpJ,EACA58C,KAAK/F,MAAM2uM,GACX1C,EACa,SAAb34F,IAEJ,CAAC3wD,EAAIgsJ,EAAoB1C,EAAkB34F,GAE/C,CAkBO,SAAS07F,GACd/G,EACAC,EACA+G,EACAP,GAGEhB,KADFE,GAAU,GAOV,IAAI,UAAE/8N,EAAWuwJ,OAAQ8tE,GAAaz1N,EAAAA,WAAiB2zN,IACjDj3L,QAASg5L,GAAkB11N,EAAAA,WAAiB6zN,GAC9C8B,EAAaD,EAAcA,EAAc/jO,OAAS,GAClDikO,EAAeD,EAAaA,EAAWl4N,OAAS,CAAC,EAEjDo4N,GADiBF,GAAaA,EAAWv9N,SACpBu9N,EAAaA,EAAWvE,aAAe,KAC9CuE,GAAcA,EAAWjG,MAqC3C,IAEIn3N,EAFAu9N,EAAsB5B,IAG1B,GAAIzF,EAAa,KAAAsH,EACf,IAAIC,EACqB,kBAAhBvH,EAA2B1B,EAAU0B,GAAeA,EAGpC,MAAvBoH,IAC4B,OADFE,EACxBC,EAAkB59N,eAAQ,EAA1B29N,EAA4B5hM,WAAW0hM,KAF3C1B,GAAU,GASV57N,EAAWy9N,CACb,MACEz9N,EAAWu9N,EAGb,IAAI19N,EAAWG,EAASH,UAAY,IAEhC84N,EAAoB94N,EACxB,GAA2B,MAAvBy9N,EAA4B,CAe9B,IAAII,EAAiBJ,EAAmB/9N,QAAQ,MAAO,IAAI6L,MAAM,KAEjEutN,EAAoB,IADL94N,EAASN,QAAQ,MAAO,IAAI6L,MAAM,KACdqI,MAAMiqN,EAAetkO,QAAQkS,KAAK,IACvE,CAEA,IAAI64B,GACD+4L,GACDD,GACAA,EAAgB94L,SAChB84L,EAAgB94L,QAAQ/qC,OAAS,EAC5B6jO,EAAgB94L,QACjB6xL,EAAYC,EAAQ,CAAEp2N,SAAU84N,IAmBtC,IAAIgF,EAAkBC,GACpBz5L,GACEA,EAAQvhB,KAAKqK,GACXpzB,OAAO4/E,OAAO,CAAC,EAAGxsD,EAAO,CACvB/nB,OAAQrL,OAAO4/E,OAAO,CAAC,EAAG4jJ,EAAcpwM,EAAM/nB,QAC9CrF,SAAUy3N,EAAU,CAClBgG,EAEAz+N,EAAU62N,eACN72N,EAAU62N,eAAezoM,EAAMptB,UAAUA,SACzCotB,EAAMptB,WAEZg5N,aACyB,MAAvB5rM,EAAM4rM,aACFyE,EACAhG,EAAU,CACRgG,EAEAz+N,EAAU62N,eACN72N,EAAU62N,eAAezoM,EAAM4rM,cAAch5N,SAC7CotB,EAAM4rM,mBAIxBsE,EACAF,EACAP,GAMF,OAAIxG,GAAeyH,EAEfl2N,EAAAA,cAAC4zN,EAAgB/oG,SAAQ,CACvBztH,MAAO,CACL7E,SAAQu0N,EAAA,CACN10N,SAAU,IACVJ,OAAQ,GACRC,KAAM,GACNgvC,MAAO,KACPx0C,IAAK,WACF8F,GAEL69N,eAAgB7J,EAAemB,MAGhCwI,GAKAA,CACT,CAEA,SAASG,KACP,IAAIv1N,EA0cC,WAAkC,IAAAw1N,EACvC,IAAIx1N,EAAQd,EAAAA,WAAiBg0N,GACzB/sL,EAAQsvL,GAAmB5B,GAAoB6B,eAC/CC,EAAU/B,GAAkBC,GAAoB6B,eAIpD,QAAc13N,IAAVgC,EACF,OAAOA,EAIT,OAAO,OAAPw1N,EAAOrvL,EAAMuyF,aAAN,EAAA88F,EAAeG,EACxB,CAvdcC,GACRl1N,EAAU6xN,EAAqBvyN,GAC5BA,EAAM5D,OAAU,IAAA4D,EAAM3D,WACzB2D,aAAiBgC,MACjBhC,EAAMU,QACN8qB,KAAKC,UAAUzrB,GACf2wE,EAAQ3wE,aAAiBgC,MAAQhC,EAAM2wE,MAAQ,KAC/CklJ,EAAY,yBACZC,EAAY,CAAEz2G,QAAS,SAAU5lH,gBAAiBo8N,GAsBtD,OACE32N,EAAAA,cAAAA,EAAAA,SAAA,KACEA,EAAAA,cAAI,2CACJA,EAAAA,cAAA,MAAI04E,MAAO,CAAEunH,UAAW,WAAaz+L,GACpCiwE,EAAQzxE,EAAAA,cAAA,OAAK04E,MAAOk+I,GAAYnlJ,GAAe,KAvBtC,KA2BhB,CAEA,MAAMolJ,GAAsB72N,EAAAA,cAACq2N,GAAqB,MAgB3C,MAAMS,WAA4B92N,EAAAA,UAIvCtO,WAAAA,CAAYoI,GACVoxG,MAAMpxG,GACN8R,KAAKq7B,MAAQ,CACX1uC,SAAUuB,EAAMvB,SAChBw+N,aAAcj9N,EAAMi9N,aACpBj2N,MAAOhH,EAAMgH,MAEjB,CAEA,+BAAO3N,CAAyB2N,GAC9B,MAAO,CAAEA,MAAOA,EAClB,CAEA,+BAAO1N,CACL0G,EACAmtC,GAUA,OACEA,EAAM1uC,WAAauB,EAAMvB,UACD,SAAvB0uC,EAAM8vL,cAAkD,SAAvBj9N,EAAMi9N,aAEjC,CACLj2N,MAAOhH,EAAMgH,MACbvI,SAAUuB,EAAMvB,SAChBw+N,aAAcj9N,EAAMi9N,cAQjB,CACLj2N,WAAuBhC,IAAhBhF,EAAMgH,MAAsBhH,EAAMgH,MAAQmmC,EAAMnmC,MACvDvI,SAAU0uC,EAAM1uC,SAChBw+N,aAAcj9N,EAAMi9N,cAAgB9vL,EAAM8vL,aAE9C,CAEA18H,iBAAAA,CAAkBv5F,EAAYk2N,GAC5Bl1N,QAAQhB,MACN,wDACAA,EACAk2N,EAEJ,CAEA3iO,MAAAA,GACE,YAA4ByK,IAArB8M,KAAKq7B,MAAMnmC,MAChBd,EAAAA,cAAC6zN,EAAahpG,SAAQ,CAACztH,MAAOwO,KAAK9R,MAAMm9N,cACvCj3N,EAAAA,cAACg0N,EAAkBnpG,SAAQ,CACzBztH,MAAOwO,KAAKq7B,MAAMnmC,MAClB8zE,SAAUhpE,KAAK9R,MAAM5F,aAIzB0X,KAAK9R,MAAM86E,QAEf,EASF,SAASsiJ,GAAarvG,GAAwD,IAAvD,aAAEovG,EAAY,MAAEzxM,EAAK,SAAEovD,GAA8BizC,EACtEmtG,EAAoBh1N,EAAAA,WAAiByzN,GAazC,OAREuB,GACAA,EAAkBrtE,QAClBqtE,EAAkBmC,gBACjB3xM,EAAMkqM,MAAM0H,cAAgB5xM,EAAMkqM,MAAM2H,iBAEzCrC,EAAkBmC,cAAcG,2BAA6B9xM,EAAMkqM,MAAMniN,IAIzEvN,EAAAA,cAAC6zN,EAAahpG,SAAQ,CAACztH,MAAO65N,GAC3BriJ,EAGP,CAEO,SAASuhJ,GACdz5L,EACAg5L,EACAF,EACAP,GAC2B,IAAAsC,EAC3B,QAJ2B,IAA3B7B,IAAAA,EAA8B,SACc,IAA5CF,IAAAA,EAA+C,WACX,IAApCP,IAAAA,EAAuC,MAExB,MAAXv4L,EAAiB,KAAA86L,EACnB,IAAKhC,EACH,OAAO,KAGT,GAAIA,EAAgBh8F,OAGlB98F,EAAU84L,EAAgB94L,YACrB,MACL,OAAA86L,EAAAvC,IAAAuC,EAAQC,qBACiB,IAAzB/B,EAAc/jO,SACb6jO,EAAgB5wJ,aACjB4wJ,EAAgB94L,QAAQ/qC,OAAS,GAUjC,OAAO,KAFP+qC,EAAU84L,EAAgB94L,OAG5B,CACF,CAEA,IAAIw5L,EAAkBx5L,EAGlB88F,EAAS,OAAH+9F,EAAG/B,QAAA,EAAA+B,EAAiB/9F,OAC9B,GAAc,MAAVA,EAAgB,CAClB,IAAIk+F,EAAaxB,EAAgBllE,WAC9Bh4J,GAAMA,EAAE02N,MAAMniN,SAA+BzO,KAAnB,MAAN06H,OAAM,EAANA,EAASxgI,EAAE02N,MAAMniN,OAGtCmqN,GAAc,GADhBvD,GAAU,GAMV+B,EAAkBA,EAAgBlqN,MAChC,EACA9H,KAAK+M,IAAIilN,EAAgBvkO,OAAQ+lO,EAAa,GAElD,CAIA,IAAIC,GAAiB,EACjBC,GAAiB,EACrB,GAAIpC,GAAmBP,GAAUA,EAAOwC,oBACtC,IAAK,IAAI7lO,EAAI,EAAGA,EAAIskO,EAAgBvkO,OAAQC,IAAK,CAC/C,IAAI4zB,EAAQ0wM,EAAgBtkO,GAM5B,IAJI4zB,EAAMkqM,MAAMmI,iBAAmBryM,EAAMkqM,MAAMoI,0BAC7CF,EAAgBhmO,GAGd4zB,EAAMkqM,MAAMniN,GAAI,CAClB,IAAI,WAAEwqN,EAAU,OAAEv+F,GAAWg8F,EACzBwC,EACFxyM,EAAMkqM,MAAM//M,aACmB7Q,IAA/Bi5N,EAAWvyM,EAAMkqM,MAAMniN,OACrBisH,QAAqC16H,IAA3B06H,EAAOh0G,EAAMkqM,MAAMniN,KACjC,GAAIiY,EAAMkqM,MAAMrkG,MAAQ2sG,EAAkB,CAIxCL,GAAiB,EAEfzB,EADE0B,GAAiB,EACD1B,EAAgBlqN,MAAM,EAAG4rN,EAAgB,GAEzC,CAAC1B,EAAgB,IAErC,KACF,CACF,CACF,CAGF,OAAOA,EAAgB+B,aAAY,CAACnE,EAAQtuM,EAAO7T,KAEjD,IAAI7Q,EACAo3N,GAA8B,EAC9Bd,EAAuC,KACvCU,EAAiD,KA0VzD,IAAqBrlO,EAzVb+iO,IACF10N,EAAQ04H,GAAUh0G,EAAMkqM,MAAMniN,GAAKisH,EAAOh0G,EAAMkqM,MAAMniN,SAAMzO,EAC5Ds4N,EAAe5xM,EAAMkqM,MAAM0H,cAAgBP,GAEvCc,IACEC,EAAgB,GAAe,IAAVjmN,GAoVZlf,EAlVT,kBACA,GAkVI0lO,GAAc1lO,KAC1B0lO,GAAc1lO,IAAO,GAhVfylO,GAA8B,EAC9BJ,EAAyB,MAChBF,IAAkBjmN,IAC3BumN,GAA8B,EAC9BJ,EAAyBtyM,EAAMkqM,MAAMoI,wBAA0B,QAKrE,IAAIp7L,EAAUg5L,EAAcxgO,OAAOghO,EAAgBlqN,MAAM,EAAG2F,EAAQ,IAChEymN,EAAcA,KAChB,IAAIxjJ,EAkBJ,OAhBEA,EADE9zE,EACSs2N,EACFc,EACEJ,EACFtyM,EAAMkqM,MAAMvlG,UAOVnqH,EAAAA,cAACwlB,EAAMkqM,MAAMvlG,UAAS,MACxB3kG,EAAMkqM,MAAM5kI,QACVtlE,EAAMkqM,MAAM5kI,QAEZgpI,EAGX9zN,EAAAA,cAACk3N,GAAa,CACZ1xM,MAAOA,EACPyxM,aAAc,CACZnD,SACAp3L,UACAq3L,YAAgC,MAAnByB,GAEf5gJ,SAAUA,GACV,EAMN,OAAO4gJ,IACJhwM,EAAMkqM,MAAM2H,eAAiB7xM,EAAMkqM,MAAM0H,cAA0B,IAAVzlN,GAC1D3R,EAAAA,cAAC82N,GAAmB,CAClBv+N,SAAUi9N,EAAgBj9N,SAC1Bw+N,aAAcvB,EAAgBuB,aAC9B7iO,UAAWkjO,EACXt2N,MAAOA,EACP8zE,SAAUwjJ,IACVnB,aAAc,CAAEnD,OAAQ,KAAMp3L,UAASq3L,aAAa,KAGtDqE,GACD,GACA,KACL,CAAC,IAEI5D,GAAc,SAAdA,GAAc,OAAdA,EAAc,wBAAdA,EAAc,gCAAdA,EAAc,gCAAdA,CAAc,EAAdA,IAAc,IAMdG,GAAmB,SAAnBA,GAAmB,OAAnBA,EAAmB,wBAAnBA,EAAmB,8BAAnBA,EAAmB,8BAAnBA,EAAmB,8BAAnBA,EAAmB,8BAAnBA,EAAmB,wCAAnBA,EAAmB,wBAAnBA,EAAmB,gCAAnBA,EAAmB,gCAAnBA,EAAmB,wBAAnBA,CAAmB,EAAnBA,IAAmB,IAmBxB,SAASJ,GAAqB8D,GAC5B,IAAIhmH,EAAMryG,EAAAA,WAAiByzN,GAE3B,OADUphH,GAAV8hH,GAAU,GACH9hH,CACT,CAEA,SAASkkH,GAAmB8B,GAC1B,IAAIpxL,EAAQjnC,EAAAA,WAAiB0zN,GAE7B,OADUzsL,GAAVktL,GAAU,GACHltL,CACT,CASA,SAASytL,GAAkB2D,GACzB,IAAI3I,EARN,WACE,IAAIA,EAAQ1vN,EAAAA,WAAiB6zN,GAE7B,OADUnE,GAAVyE,GAAU,GACHzE,CACT,CAIc4I,GACRC,EAAY7I,EAAMhzL,QAAQgzL,EAAMhzL,QAAQ/qC,OAAS,GAKrD,OAHE4mO,EAAU7I,MAAMniN,IADlB4mN,GAAU,GAIHoE,EAAU7I,MAAMniN,EACzB,CA4NA,MAAM4qN,GAAyC,CAAC,EC7kCzC,SAASK,GACdC,EACAC,GAEI,MAAAD,GAAAA,EAAcE,wBASuB75N,KAA3B,MAAZ25N,OAAY,EAAZA,EAActG,yBACZuG,GAAiBA,EAAavG,sBAS9BuG,IACEA,EAAaE,kBAQbF,EAAaG,uBAQbH,EAAajB,oBAQbiB,EAAaI,+BAQrB,CCY4B94N,EAAsB,gBAgT3C,SAAS+4N,GAAMC,GACpB7E,GAAU,EAKZ,CAqBO,SAAS8E,GAAMC,GAQqB,IAPzC71B,SAAU81B,EAAe,IAAG,SAC5BvkJ,EAAW,KACXr8E,SAAU6gO,EAAY,eACtBhD,EAAiB7J,EAAemB,IAAG,UACnCt2N,EACAuwJ,OAAQ0xE,GAAa,EAAK,OAC1BpE,GACYiE,EAETjF,KADHE,GAAU,GAQV,IAAI9wB,EAAW81B,EAAarhO,QAAQ,OAAQ,KACxCwhO,EAAoBt5N,EAAAA,SACtB,KAAM,CACJqjM,WACAjsM,YACAuwJ,OAAQ0xE,EACRpE,OAAMnI,EAAA,CACJqF,sBAAsB,GACnB8C,MAGP,CAAC5xB,EAAU4xB,EAAQ79N,EAAWiiO,IAGJ,kBAAjBD,IACTA,EAAerM,EAAUqM,IAG3B,IAAI,SACFhhO,EAAW,IAAG,OACdJ,EAAS,GAAE,KACXC,EAAO,GAAE,MACTgvC,EAAQ,KAAI,IACZx0C,EAAM,WACJ2mO,EAEAG,EAAkBv5N,EAAAA,SAAc,KAClC,IAAIw5N,EAAmB5K,EAAcx2N,EAAUirM,GAE/C,OAAwB,MAApBm2B,EACK,KAGF,CACLjhO,SAAU,CACRH,SAAUohO,EACVxhO,SACAC,OACAgvC,QACAx0C,OAEF2jO,iBACD,GACA,CAAC/yB,EAAUjrM,EAAUJ,EAAQC,EAAMgvC,EAAOx0C,EAAK2jO,IASlD,OAAuB,MAAnBmD,EACK,KAIPv5N,EAAAA,cAAC2zN,EAAkB9oG,SAAQ,CAACztH,MAAOk8N,GACjCt5N,EAAAA,cAAC4zN,EAAgB/oG,SAAQ,CAACj2C,SAAUA,EAAUx3E,MAAOm8N,IAG3D,CAaO,SAASE,GAAMC,GAGqB,IAHpB,SACrB9kJ,EAAQ,SACRr8E,GACYmhO,EACZ,OF1KOnE,GE0KUoE,GAAyB/kJ,GAAWr8E,EACvD,CAuC4B,IAAI1B,SAAQ,SAEPmJ,EAAAA,UAkH1B,SAAS25N,GACd/kJ,EACA46I,QAAoB,IAApBA,IAAAA,EAAuB,IAEvB,IAAIhB,EAAwB,GA6D5B,OA3DAxuN,EAAAA,SAAehB,QAAQ41E,GAAU,CAACkW,EAASn5E,KACzC,IAAK3R,EAAAA,eAAqB8qF,GAGxB,OAGF,IAAI8uI,EAAW,IAAIpK,EAAY79M,GAE/B,GAAIm5E,EAAQv3F,OAASyM,EAAAA,SAMnB,YAJAwuN,EAAOn4M,KAAKW,MACVw3M,EACAmL,GAAyB7uI,EAAQhxF,MAAM86E,SAAUglJ,IAMnD9uI,EAAQv3F,OAASwlO,IADnB5E,GAAU,GAQPrpI,EAAQhxF,MAAM6X,OAAUm5E,EAAQhxF,MAAM86E,UADzCu/I,GAAU,GAKV,IAAIzE,EAAqB,CACvBniN,GAAIu9E,EAAQhxF,MAAMyT,IAAMqsN,EAAS/1N,KAAK,KACtC+rN,cAAe9kI,EAAQhxF,MAAM81N,cAC7B9kI,QAASA,EAAQhxF,MAAMgxF,QACvBq/B,UAAWr/B,EAAQhxF,MAAMqwH,UACzBx4G,MAAOm5E,EAAQhxF,MAAM6X,MACrB5O,KAAM+nF,EAAQhxF,MAAMiJ,KACpB4M,OAAQm7E,EAAQhxF,MAAM6V,OACtB8jB,OAAQq3D,EAAQhxF,MAAM25B,OACtB2jM,aAActsI,EAAQhxF,MAAMs9N,aAC5BC,cAAevsI,EAAQhxF,MAAMu9N,cAC7BwC,iBACiC,MAA/B/uI,EAAQhxF,MAAMu9N,eACgB,MAA9BvsI,EAAQhxF,MAAMs9N,aAChB0C,iBAAkBhvI,EAAQhxF,MAAMggO,iBAChCC,OAAQjvI,EAAQhxF,MAAMigO,OACtB1uG,KAAMvgC,EAAQhxF,MAAMuxH,MAGlBvgC,EAAQhxF,MAAM86E,WAChB86I,EAAM96I,SAAW+kJ,GACf7uI,EAAQhxF,MAAM86E,SACdglJ,IAIJpL,EAAOn4M,KAAKq5M,EAAM,IAGblB,CACT,CCvqBA,IAAIwL,GAA0B,WAE5B,SAASA,EAAW/3N,GAClB,IAAIg4N,EAAQruN,KAEZA,KAAKsuN,WAAa,SAAUnnJ,GAC1B,IAAImsH,EAIAA,EAFsB,IAAtB+6B,EAAM31B,KAAK3yM,OACTsoO,EAAME,eACCF,EAAME,eAAe5wI,YACrB0wI,EAAM18G,QACN08G,EAAMvqL,UAAU6lC,WAEhB0kJ,EAAM/6B,OAGR+6B,EAAM31B,KAAK21B,EAAM31B,KAAK3yM,OAAS,GAAG43F,YAG7C0wI,EAAMvqL,UAAUuvD,aAAalsB,EAAKmsH,GAElC+6B,EAAM31B,KAAKjuL,KAAK08D,EAClB,EAEAnnE,KAAKwuN,cAA8Bt7N,IAAnBmD,EAAQo4N,QAAwCp4N,EAAQo4N,OACxEzuN,KAAK04L,KAAO,GACZ14L,KAAK0uN,IAAM,EACX1uN,KAAK2uN,MAAQt4N,EAAQs4N,MAErB3uN,KAAKnZ,IAAMwP,EAAQxP,IACnBmZ,KAAK8jC,UAAYztC,EAAQytC,UACzB9jC,KAAK2xG,QAAUt7G,EAAQs7G,QACvB3xG,KAAKuuN,eAAiBl4N,EAAQk4N,eAC9BvuN,KAAKszL,OAAS,IAChB,CAEA,IAAIs7B,EAASR,EAAW3nO,UA0CxB,OAxCAmoO,EAAO3yH,QAAU,SAAiB4yH,GAChCA,EAAMz7N,QAAQ4M,KAAKsuN,WACrB,EAEAM,EAAOE,OAAS,SAAgBp9C,GAI1B1xK,KAAK0uN,KAAO1uN,KAAKwuN,SAAW,KAAQ,KAAO,GAC7CxuN,KAAKsuN,WA7DX,SAA4Bj4N,GAC1B,IAAI8wE,EAAMx7E,SAASC,cAAc,SASjC,OARAu7E,EAAIn7E,aAAa,eAAgBqK,EAAQxP,UAEnBqM,IAAlBmD,EAAQs4N,OACVxnJ,EAAIn7E,aAAa,QAASqK,EAAQs4N,OAGpCxnJ,EAAIzqB,YAAY/wD,SAASymG,eAAe,KACxCjrB,EAAIn7E,aAAa,SAAU,IACpBm7E,CACT,CAkDsB4nJ,CAAmB/uN,OAGrC,IAAImnE,EAAMnnE,KAAK04L,KAAK14L,KAAK04L,KAAK3yM,OAAS,GAEvC,GAAIia,KAAKwuN,SAAU,CACjB,IAAIxoD,EAtFV,SAAqB7+F,GACnB,GAAIA,EAAI6+F,MACN,OAAO7+F,EAAI6+F,MAMb,IAAK,IAAIhgL,EAAI,EAAGA,EAAI2F,SAASqjO,YAAYjpO,OAAQC,IAC/C,GAAI2F,SAASqjO,YAAYhpO,GAAGipO,YAAc9nJ,EACxC,OAAOx7E,SAASqjO,YAAYhpO,EAOlC,CAqEkBkpO,CAAY/nJ,GAExB,IAGE6+F,EAAMC,WAAWyL,EAAM1L,EAAMmpD,SAASppO,OACxC,CAAE,MAAO2D,GACT,CACF,MACEy9E,EAAIzqB,YAAY/wD,SAASymG,eAAes/E,IAG1C1xK,KAAK0uN,KACP,EAEAE,EAAOn2L,MAAQ,WACbz4B,KAAK04L,KAAKtlM,SAAQ,SAAU+zE,GAC1B,IAAIioJ,EAEJ,OAA6C,OAArCA,EAAkBjoJ,EAAIgH,iBAAsB,EAASihJ,EAAgBpwK,YAAYmoB,EAC3F,IACAnnE,KAAK04L,KAAO,GACZ14L,KAAK0uN,IAAM,CACb,EAEON,CACT,CAhF8B,GCrDnB71N,GAAMD,KAAKC,IAMX+Q,GAAO4B,OAAOC,aAMdi7D,GAAS5/E,OAAO4/E,OAepB,SAASrvE,GAAMvF,GACrB,OAAOA,EAAMuF,MACd,CAiBO,SAAS7K,GAASsF,EAAOglN,EAAS6Y,GACxC,OAAO79N,EAAMtF,QAAQsqN,EAAS6Y,EAC/B,CAOO,SAASC,GAAS99N,EAAOpF,GAC/B,OAAOoF,EAAMW,QAAQ/F,EACtB,CAOO,SAASmjO,GAAQ/9N,EAAOuU,GAC9B,OAAiC,EAA1BvU,EAAMgY,WAAWzD,EACzB,CAQO,SAAS+zG,GAAQtoH,EAAOs9L,EAAOtsL,GACrC,OAAOhR,EAAM4O,MAAM0uL,EAAOtsL,EAC3B,CAMO,SAASgtN,GAAQh+N,GACvB,OAAOA,EAAMzL,MACd,CAMO,SAAS0pO,GAAQj+N,GACvB,OAAOA,EAAMzL,MACd,CAOO,SAAS+zD,GAAQtoD,EAAOk+N,GAC9B,OAAOA,EAAMjlN,KAAKjZ,GAAQA,CAC3B,CCvGO,IAAI41D,GAAO,EACP87C,GAAS,EACTn9G,GAAS,EACT6I,GAAW,EACX+gO,GAAY,EACZC,GAAa,GAWjB,SAASlyI,GAAMlsF,EAAOomM,EAAM94K,EAAQn3B,EAAMuG,EAAO86E,EAAUjjF,GACjE,MAAO,CAACyL,MAAOA,EAAOomM,KAAMA,EAAM94K,OAAQA,EAAQn3B,KAAMA,EAAMuG,MAAOA,EAAO86E,SAAUA,EAAU5hB,KAAMA,GAAM87C,OAAQA,GAAQn9G,OAAQA,EAAQ8pF,OAAQ,GACrJ,CAOO,SAASvvB,GAAMs3I,EAAM1pM,GAC3B,OAAOk4E,GAAOsX,GAAK,GAAI,KAAM,KAAM,GAAI,KAAM,KAAM,GAAIk6G,EAAM,CAAC7xM,QAAS6xM,EAAK7xM,QAASmI,EACtF,CAwBO,SAAS64F,KAMf,OALA4oI,GAAY/gO,GAAW7I,GAASwpO,GAAOK,GAAYhhO,MAAc,EAE7Ds0G,KAAwB,KAAdysH,KACbzsH,GAAS,EAAG97C,MAENuoK,EACR,CAKO,SAASE,KACf,OAAON,GAAOK,GAAYhhO,GAC3B,CAKO,SAASkhO,KACf,OAAOlhO,EACR,CAOO,SAASwR,GAAO0uL,EAAOtsL,GAC7B,OAAOs3G,GAAO81G,GAAY9gC,EAAOtsL,EAClC,CAMO,SAAS45M,GAAOz0N,GACtB,OAAQA,GAEP,KAAK,EAAG,KAAK,EAAG,KAAK,GAAI,KAAK,GAAI,KAAK,GACtC,OAAO,EAER,KAAK,GAAI,KAAK,GAAI,KAAK,GAAI,KAAK,GAAI,KAAK,GAAI,KAAK,GAAI,KAAK,IAE3D,KAAK,GAAI,KAAK,IAAK,KAAK,IACvB,OAAO,EAER,KAAK,GACJ,OAAO,EAER,KAAK,GAAI,KAAK,GAAI,KAAK,GAAI,KAAK,GAC/B,OAAO,EAER,KAAK,GAAI,KAAK,GACb,OAAO,EAGT,OAAO,CACR,CAMO,SAASs6L,GAAOzwL,GACtB,OAAO41D,GAAO87C,GAAS,EAAGn9G,GAASypO,GAAOI,GAAap+N,GAAQ5C,GAAW,EAAG,EAC9E,CAMO,SAASmhO,GAASv+N,GACxB,OAAOo+N,GAAa,GAAIp+N,CACzB,CAMO,SAASw+N,GAASroO,GACxB,OAAOoP,GAAKqJ,GAAMxR,GAAW,EAAGmpM,GAAmB,KAATpwM,EAAcA,EAAO,EAAa,KAATA,EAAcA,EAAO,EAAIA,IAC7F,CAcO,SAAS0wE,GAAY1wE,GAC3B,MAAOgoO,GAAYE,OACdF,GAAY,IACf5oI,KAIF,OAAOq1H,GAAMz0N,GAAQ,GAAKy0N,GAAMuT,IAAa,EAAI,GAAK,GACvD,CAwBO,SAASM,GAAUlqN,EAAOq4G,GAChC,OAASA,GAASr3B,QAEb4oI,GAAY,IAAMA,GAAY,KAAQA,GAAY,IAAMA,GAAY,IAAQA,GAAY,IAAMA,GAAY,MAG/G,OAAOvvN,GAAM2F,EAAO+pN,MAAW1xG,EAAQ,GAAe,IAAVyxG,MAA0B,IAAV9oI,MAC7D,CAMO,SAASgxG,GAAWpwM,GAC1B,KAAOo/F,aACE4oI,IAEP,KAAKhoO,EACJ,OAAOiH,GAER,KAAK,GAAI,KAAK,GACA,KAATjH,GAAwB,KAATA,GAClBowM,GAAU43B,IACX,MAED,KAAK,GACS,KAAThoO,GACHowM,GAAUpwM,GACX,MAED,KAAK,GACJo/F,KAIH,OAAOn4F,EACR,CAOO,SAASshO,GAAWvoO,EAAMoe,GAChC,KAAOghF,MAEFp/F,EAAOgoO,KAAc,KAGhBhoO,EAAOgoO,KAAc,IAAsB,KAAXE,QAG1C,MAAO,KAAOzvN,GAAM2F,EAAOnX,GAAW,GAAK,IAAM0a,GAAc,KAAT3hB,EAAcA,EAAOo/F,KAC5E,CAMO,SAASopI,GAAYpqN,GAC3B,MAAQq2M,GAAMyT,OACb9oI,KAED,OAAO3mF,GAAM2F,EAAOnX,GACrB,CCrPO,IAAIwhO,GAAK,OACLC,GAAM,QACNC,GAAS,WAETj2B,GAAU,OACVk2B,GAAU,OACVC,GAAc,OAUdC,GAAY,aCRhB,SAASC,GAAW1nJ,EAAUogB,GAIpC,IAHA,IAAIunI,EAAS,GACT5qO,EAAS0pO,GAAOzmJ,GAEXhjF,EAAI,EAAGA,EAAID,EAAQC,IAC3B2qO,GAAUvnI,EAASpgB,EAAShjF,GAAIA,EAAGgjF,EAAUogB,IAAa,GAE3D,OAAOunI,CACR,CASO,SAAShwM,GAAWu+D,EAASn5E,EAAOijE,EAAUogB,GACpD,OAAQlK,EAAQv3F,MACf,IDPiB,SCOL,GAAIu3F,EAAQlW,SAASjjF,OAAQ,MACzC,IDlBkB,UCkBL,KAAKyqO,GAAa,OAAOtxI,EAAQrP,OAASqP,EAAQrP,QAAUqP,EAAQ1tF,MACjF,KAAK6oM,GAAS,MAAO,GACrB,KAAKo2B,GAAW,OAAOvxI,EAAQrP,OAASqP,EAAQ1tF,MAAQ,IAAMk/N,GAAUxxI,EAAQlW,SAAUogB,GAAY,IACtG,KAAKmnI,GAASrxI,EAAQ1tF,MAAQ0tF,EAAQhxF,MAAM+J,KAAK,KAGlD,OAAOu3N,GAAOxmJ,EAAW0nJ,GAAUxxI,EAAQlW,SAAUogB,IAAalK,EAAQrP,OAASqP,EAAQ1tF,MAAQ,IAAMw3E,EAAW,IAAM,EAC3H,CC3BO,SAAS4nJ,GAASp/N,GACxB,OAAOu+N,GAAQp1M,GAAM,GAAI,KAAM,KAAM,KAAM,CAAC,IAAKnpB,EAAQywL,GAAMzwL,GAAQ,EAAG,CAAC,GAAIA,GAChF,CAcO,SAASmpB,GAAOnpB,EAAOomM,EAAM94K,EAAQ4yJ,EAAMm/C,EAAOC,EAAUC,EAAQC,EAAQC,GAiBlF,IAhBA,IAAIlrN,EAAQ,EACRqK,EAAS,EACTrqB,EAASgrO,EACTG,EAAS,EACTC,EAAW,EACXC,EAAW,EACXC,EAAW,EACXC,EAAW,EACXC,EAAY,EACZ5B,EAAY,EACZhoO,EAAO,GACPuG,EAAQ2iO,EACR7nJ,EAAW8nJ,EACXrsE,EAAYitB,EACZk+C,EAAajoO,EAEV2pO,UACEF,EAAWzB,EAAWA,EAAY5oI,MAEzC,KAAK,GACJ,GAAgB,KAAZqqI,GAAqD,IAAlC7B,GAAOK,EAAY7pO,EAAS,GAAU,EACkB,GAA1EupO,GAAQM,GAAc1jO,GAAQ8jO,GAAQL,GAAY,IAAK,OAAQ,SAClE4B,GAAa,GACd,KACD,CAED,KAAK,GAAI,KAAK,GAAI,KAAK,GACtB3B,GAAcI,GAAQL,GACtB,MAED,KAAK,EAAG,KAAK,GAAI,KAAK,GAAI,KAAK,GAC9BC,GAAcv3J,GAAW+4J,GACzB,MAED,KAAK,GACJxB,GAAcK,GAASH,KAAU,EAAG,GACpC,SAED,KAAK,GACJ,OAAQD,MACP,KAAK,GAAI,KAAK,GACb/1K,GAAOwgJ,GAAQ41B,GAAUnpI,KAAQ+oI,MAAUl4B,EAAM94K,GAASmyM,GAC1D,MACD,QACCrB,GAAc,IAEhB,MAED,KAAK,IAAMyB,EACVL,EAAOjrN,KAAWypN,GAAOI,GAAc2B,EAExC,KAAK,IAAMF,EAAU,KAAK,GAAI,KAAK,EAClC,OAAQ1B,GAEP,KAAK,EAAG,KAAK,IAAK2B,EAAW,EAE7B,KAAK,GAAKlhN,GAA0B,GAAdmhN,IAAiB3B,EAAa1jO,GAAQ0jO,EAAY,MAAO,KAC1EuB,EAAW,GAAM3B,GAAOI,GAAc7pO,GACzC+zD,GAAOq3K,EAAW,GAAKK,GAAY5B,EAAa,IAAKl+C,EAAM5yJ,EAAQ/4B,EAAS,GAAKyrO,GAAYtlO,GAAQ0jO,EAAY,IAAK,IAAM,IAAKl+C,EAAM5yJ,EAAQ/4B,EAAS,GAAIkrO,GAC7J,MAED,KAAK,GAAIrB,GAAc,IAEvB,QAGC,GAFA91K,GAAO2qG,EAAYgtE,GAAQ7B,EAAYh4B,EAAM94K,EAAQ/Y,EAAOqK,EAAQygN,EAAOG,EAAQrpO,EAAMuG,EAAQ,GAAI86E,EAAW,GAAIjjF,GAAS+qO,GAE3G,MAAdnB,EACH,GAAe,IAAXv/M,EACHuK,GAAMi1M,EAAYh4B,EAAMnzC,EAAWA,EAAWv2J,EAAO4iO,EAAU/qO,EAAQirO,EAAQhoJ,QAE/E,OAAmB,KAAXkoJ,GAA2C,MAA1B3B,GAAOK,EAAY,GAAa,IAAMsB,GAE9D,KAAK,IAAK,KAAK,IAAK,KAAK,IAAK,KAAK,IAClCv2M,GAAMnpB,EAAOizJ,EAAWA,EAAWitB,GAAQ53H,GAAO23K,GAAQjgO,EAAOizJ,EAAWA,EAAW,EAAG,EAAGosE,EAAOG,EAAQrpO,EAAMkpO,EAAO3iO,EAAQ,GAAInI,GAASijF,GAAW6nJ,EAAO7nJ,EAAUjjF,EAAQirO,EAAQt/C,EAAOxjL,EAAQ86E,GACzM,MACD,QACCruD,GAAMi1M,EAAYnrE,EAAWA,EAAWA,EAAW,CAAC,IAAKz7E,EAAU,EAAGgoJ,EAAQhoJ,IAIpFjjE,EAAQqK,EAAS+gN,EAAW,EAAGE,EAAWE,EAAY,EAAG5pO,EAAOioO,EAAa,GAAI7pO,EAASgrO,EAC1F,MAED,KAAK,GACJhrO,EAAS,EAAIypO,GAAOI,GAAauB,EAAWC,EAC7C,QACC,GAAIC,EAAW,EACd,GAAiB,KAAb1B,IACD0B,OACE,GAAiB,KAAb1B,GAAkC,GAAd0B,KAA6B,MHxE9D1B,GAAY/gO,GAAW,EAAI2gO,GAAOK,KAAchhO,IAAY,EAExDs0G,KAAwB,KAAdysH,KACbzsH,GAAS,EAAG97C,MAENuoK,IGoEF,SAEF,OAAQC,GAActmN,GAAKqmN,GAAYA,EAAY0B,GAElD,KAAK,GACJE,EAAYnhN,EAAS,EAAI,GAAKw/M,GAAc,MAAO,GACnD,MAED,KAAK,GACJoB,EAAOjrN,MAAYypN,GAAOI,GAAc,GAAK2B,EAAWA,EAAY,EACpE,MAED,KAAK,GAEW,KAAX1B,OACHD,GAAcI,GAAQjpI,OAEvBmqI,EAASrB,KAAQz/M,EAASrqB,EAASypO,GAAO7nO,EAAOioO,GAAcO,GAAWL,OAAWH,IACrF,MAED,KAAK,GACa,KAAbyB,GAAyC,GAAtB5B,GAAOI,KAC7ByB,EAAW,IAIjB,OAAOP,CACR,CAgBO,SAASW,GAASjgO,EAAOomM,EAAM94K,EAAQ/Y,EAAOqK,EAAQygN,EAAOG,EAAQrpO,EAAMuG,EAAO86E,EAAUjjF,GAKlG,IAJA,IAAI2rO,EAAOthN,EAAS,EAChBshK,EAAkB,IAAXthK,EAAeygN,EAAQ,CAAC,IAC/BrkN,EAAOijN,GAAO/9C,GAET1rL,EAAI,EAAG0jB,EAAI,EAAG1c,EAAI,EAAGhH,EAAI+f,IAAS/f,EAC1C,IAAK,IAAIuO,EAAI,EAAGC,EAAIslH,GAAOtoH,EAAOkgO,EAAO,EAAGA,EAAOn5N,GAAImR,EAAIsnN,EAAOhrO,KAAMgkB,EAAIxY,EAAO+C,EAAIiY,IAAQjY,GAC1FyV,EAAIjT,GAAK2S,EAAI,EAAIgoK,EAAKn9K,GAAK,IAAMC,EAAItI,GAAQsI,EAAG,OAAQk9K,EAAKn9K,QAChErG,EAAMlB,KAAOgd,GAEhB,OAAO0zE,GAAKlsF,EAAOomM,EAAM94K,EAAmB,IAAX1O,EAAemgN,GAAU5oO,EAAMuG,EAAO86E,EAAUjjF,EAClF,CAQO,SAASu0M,GAAS9oM,EAAOomM,EAAM94K,GACrC,OAAO4+D,GAAKlsF,EAAOomM,EAAM94K,EAAQu7K,GAAS/wL,GH/InCqmN,IG+IiD71G,GAAOtoH,EAAO,GAAI,GAAI,EAC/E,CASO,SAASggO,GAAahgO,EAAOomM,EAAM94K,EAAQ/4B,GACjD,OAAO23F,GAAKlsF,EAAOomM,EAAM94K,EAAQ0xM,GAAa12G,GAAOtoH,EAAO,EAAGzL,GAAS+zH,GAAOtoH,EAAOzL,EAAS,GAAI,GAAIA,EACxG,CCzLA,IAAI4rO,GAA8B,SAAqC7iC,EAAOkiC,EAAQjrN,GAIpF,IAHA,IAAIqrN,EAAW,EACXzB,EAAY,EAGdyB,EAAWzB,EACXA,EAAYE,KAEK,KAAbuB,GAAiC,KAAdzB,IACrBqB,EAAOjrN,GAAS,IAGdq2M,GAAMuT,IAIV5oI,KAGF,OAAO3mF,GAAM0uL,EAAOlgM,GACtB,EA6CIgjO,GAAW,SAAkBpgO,EAAOw/N,GACtC,OAAOjB,GA5CK,SAAiBljO,EAAQmkO,GAErC,IAAIjrN,GAAS,EACT4pN,EAAY,GAEhB,GACE,OAAQvT,GAAMuT,IACZ,KAAK,EAEe,KAAdA,GAA+B,KAAXE,OAKtBmB,EAAOjrN,GAAS,GAGlBlZ,EAAOkZ,IAAU4rN,GAA4B/iO,GAAW,EAAGoiO,EAAQjrN,GACnE,MAEF,KAAK,EACHlZ,EAAOkZ,IAAUiqN,GAAQL,GACzB,MAEF,KAAK,EAEH,GAAkB,KAAdA,EAAkB,CAEpB9iO,IAASkZ,GAAoB,KAAX8pN,KAAgB,MAAQ,GAC1CmB,EAAOjrN,GAASlZ,EAAOkZ,GAAOhgB,OAC9B,KACF,CAIF,QACE8G,EAAOkZ,IAAUuD,GAAKqmN,UAEnBA,EAAY5oI,MAErB,OAAOl6F,CACT,CAGiBglO,CAAQ5vC,GAAMzwL,GAAQw/N,GACvC,EAGIc,GAA+B,IAAItjI,QACnCujI,GAAS,SAAgB7yI,GAC3B,GAAqB,SAAjBA,EAAQv3F,MAAoBu3F,EAAQpgE,UAExCogE,EAAQn5F,OAAS,GAFjB,CAUA,IAJA,IAAIyL,EAAQ0tF,EAAQ1tF,MAChBstB,EAASogE,EAAQpgE,OACjBkzM,EAAiB9yI,EAAQgkB,SAAWpkF,EAAOokF,QAAUhkB,EAAQ93B,OAAStoC,EAAOsoC,KAE1D,SAAhBtoC,EAAOn3B,MAEZ,KADAm3B,EAASA,EAAOA,QACH,OAIf,IAA6B,IAAzBogE,EAAQhxF,MAAMnI,QAAwC,KAAxByL,EAAMgY,WAAW,IAE/CsoN,GAAchxN,IAAIge,MAMlBkzM,EAAJ,CAIAF,GAAcvuN,IAAI27E,GAAS,GAK3B,IAJA,IAAI8xI,EAAS,GACTH,EAAQe,GAASpgO,EAAOw/N,GACxBiB,EAAcnzM,EAAO5wB,MAEhBlI,EAAI,EAAGgH,EAAI,EAAGhH,EAAI6qO,EAAM9qO,OAAQC,IACvC,IAAK,IAAI0jB,EAAI,EAAGA,EAAIuoN,EAAYlsO,OAAQ2jB,IAAK1c,IAC3CkyF,EAAQhxF,MAAMlB,GAAKgkO,EAAOhrO,GAAK6qO,EAAM7qO,GAAGkG,QAAQ,OAAQ+lO,EAAYvoN,IAAMuoN,EAAYvoN,GAAK,IAAMmnN,EAAM7qO,EAT3G,CAtBA,CAkCF,EACIksO,GAAc,SAAqBhzI,GACrC,GAAqB,SAAjBA,EAAQv3F,KAAiB,CAC3B,IAAI6J,EAAQ0tF,EAAQ1tF,MAGI,MAAxBA,EAAMgY,WAAW,IACO,KAAxBhY,EAAMgY,WAAW,KAEf01E,EAAgB,OAAI,GACpBA,EAAQ1tF,MAAQ,GAEpB,CACF,EAIA,SAAS4+J,GAAO5+J,EAAOzL,GACrB,OL9GK,SAAeyL,EAAOzL,GAC5B,OAA0B,GAAnBwpO,GAAO/9N,EAAO,MAAiBzL,GAAU,EAAKwpO,GAAO/9N,EAAO,KAAO,EAAK+9N,GAAO/9N,EAAO,KAAO,EAAK+9N,GAAO/9N,EAAO,KAAO,EAAK+9N,GAAO/9N,EAAO,GAAK,CACvJ,CK4GUnF,CAAKmF,EAAOzL,IAElB,KAAK,KACH,OAAOuqO,GAAS,SAAW9+N,EAAQA,EAGrC,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KAEL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KAEL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KAEL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACH,OAAO8+N,GAAS9+N,EAAQA,EAG1B,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACH,OAAO8+N,GAAS9+N,EAAQ6+N,GAAM7+N,EAAQ4+N,GAAK5+N,EAAQA,EAGrD,KAAK,KACL,KAAK,KACH,OAAO8+N,GAAS9+N,EAAQ4+N,GAAK5+N,EAAQA,EAGvC,KAAK,KACH,OAAO8+N,GAAS9+N,EAAQ4+N,GAAK,QAAU5+N,EAAQA,EAGjD,KAAK,KACH,OAAO8+N,GAAS9+N,EAAQtF,GAAQsF,EAAO,iBAAkB8+N,GAAS,WAAaF,GAAK,aAAe5+N,EAGrG,KAAK,KACH,OAAO8+N,GAAS9+N,EAAQ4+N,GAAK,aAAelkO,GAAQsF,EAAO,cAAe,IAAMA,EAGlF,KAAK,KACH,OAAO8+N,GAAS9+N,EAAQ4+N,GAAK,iBAAmBlkO,GAAQsF,EAAO,4BAA6B,IAAMA,EAGpG,KAAK,KACH,OAAO8+N,GAAS9+N,EAAQ4+N,GAAKlkO,GAAQsF,EAAO,SAAU,YAAcA,EAGtE,KAAK,KACH,OAAO8+N,GAAS9+N,EAAQ4+N,GAAKlkO,GAAQsF,EAAO,QAAS,kBAAoBA,EAG3E,KAAK,KACH,OAAO8+N,GAAS,OAASpkO,GAAQsF,EAAO,QAAS,IAAM8+N,GAAS9+N,EAAQ4+N,GAAKlkO,GAAQsF,EAAO,OAAQ,YAAcA,EAGpH,KAAK,KACH,OAAO8+N,GAASpkO,GAAQsF,EAAO,qBAAsB,KAAO8+N,GAAS,MAAQ9+N,EAG/E,KAAK,KACH,OAAOtF,GAAQA,GAAQA,GAAQsF,EAAO,eAAgB8+N,GAAS,MAAO,cAAeA,GAAS,MAAO9+N,EAAO,IAAMA,EAGpH,KAAK,KACL,KAAK,KACH,OAAOtF,GAAQsF,EAAO,oBAAqB8+N,aAG7C,KAAK,KACH,OAAOpkO,GAAQA,GAAQsF,EAAO,oBAAqB8+N,GAAS,cAAgBF,GAAK,gBAAiB,aAAc,WAAaE,GAAS9+N,EAAQA,EAGhJ,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACH,OAAOtF,GAAQsF,EAAO,kBAAmB8+N,GAAS,QAAU9+N,EAG9D,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KAEH,GAAIg+N,GAAOh+N,GAAS,EAAIzL,EAAS,EAAG,OAAQwpO,GAAO/9N,EAAOzL,EAAS,IAEjE,KAAK,IAEH,GAAkC,KAA9BwpO,GAAO/9N,EAAOzL,EAAS,GAAW,MAGxC,KAAK,IACH,OAAOmG,GAAQsF,EAAO,mBAAoB,KAAO8+N,GAAP,UAAiCD,IAAoC,KAA7Bd,GAAO/9N,EAAOzL,EAAS,GAAY,KAAO,UAAYyL,EAG1I,KAAK,IACH,OAAQ89N,GAAQ99N,EAAO,WAAa4+J,GAAOlkK,GAAQsF,EAAO,UAAW,kBAAmBzL,GAAUyL,EAAQA,EAE9G,MAGF,KAAK,KAEH,GAAkC,MAA9B+9N,GAAO/9N,EAAOzL,EAAS,GAAY,MAGzC,KAAK,KACH,OAAQwpO,GAAO/9N,EAAOg+N,GAAOh+N,GAAS,IAAM89N,GAAQ99N,EAAO,eAAiB,MAE1E,KAAK,IACH,OAAOtF,GAAQsF,EAAO,IAAK,IAAM8+N,IAAU9+N,EAG7C,KAAK,IACH,OAAOtF,GAAQsF,EAAO,wBAAyB,KAAO8+N,IAAgC,KAAtBf,GAAO/9N,EAAO,IAAa,UAAY,IAAxD,UAA+E8+N,GAA/E,SAAwGF,GAAK,WAAa5+N,EAG7K,MAGF,KAAK,KACH,OAAQ+9N,GAAO/9N,EAAOzL,EAAS,KAE7B,KAAK,IACH,OAAOuqO,GAAS9+N,EAAQ4+N,GAAKlkO,GAAQsF,EAAO,qBAAsB,MAAQA,EAG5E,KAAK,IACH,OAAO8+N,GAAS9+N,EAAQ4+N,GAAKlkO,GAAQsF,EAAO,qBAAsB,SAAWA,EAG/E,KAAK,GACH,OAAO8+N,GAAS9+N,EAAQ4+N,GAAKlkO,GAAQsF,EAAO,qBAAsB,MAAQA,EAG9E,OAAO8+N,GAAS9+N,EAAQ4+N,GAAK5+N,EAAQA,EAGzC,OAAOA,CACT,CAEA,IAqCI2gO,GAAuB,CArCZ,SAAkBjzI,EAASn5E,EAAOijE,EAAUogB,GACzD,GAAIlK,EAAQn5F,QAAU,IAAQm5F,EAAgB,OAAG,OAAQA,EAAQv3F,MAC/D,KAAK6oO,GACHtxI,EAAgB,OAAIkxE,GAAOlxE,EAAQ1tF,MAAO0tF,EAAQn5F,QAClD,MAEF,KAAK0qO,GACH,OAAOC,GAAU,CAACpwK,GAAK4+B,EAAS,CAC9B1tF,MAAOtF,GAAQgzF,EAAQ1tF,MAAO,IAAK,IAAM8+N,OACtClnI,GAEP,KAAKmnI,GACH,GAAIrxI,EAAQn5F,OAAQ,OL7MnB,SAAkB2pO,EAAOtmI,GAC/B,OAAOsmI,EAAMngN,IAAI65E,GAAUnxF,KAAK,GACjC,CK2MiCm6N,CAAQlzI,EAAQhxF,OAAO,SAAUsD,GAC1D,OLtRD,SAAgBA,EAAOglN,GAC7B,OAAQhlN,EAAQglN,EAAQ/+M,KAAKjG,IAAUA,EAAM,GAAKA,CACnD,CKoRgBooB,CAAMpoB,EAAO,0BAEnB,IAAK,aACL,IAAK,cACH,OAAOk/N,GAAU,CAACpwK,GAAK4+B,EAAS,CAC9BhxF,MAAO,CAAChC,GAAQsF,EAAO,cAAe,gBACnC43F,GAGP,IAAK,gBACH,OAAOsnI,GAAU,CAACpwK,GAAK4+B,EAAS,CAC9BhxF,MAAO,CAAChC,GAAQsF,EAAO,aAAc,IAAM8+N,GAAS,eAClDhwK,GAAK4+B,EAAS,CAChBhxF,MAAO,CAAChC,GAAQsF,EAAO,aAAc,eACnC8uD,GAAK4+B,EAAS,CAChBhxF,MAAO,CAAChC,GAAQsF,EAAO,aAAc4+N,GAAK,gBACvChnI,GAGT,MAAO,EACT,IAEN,GAIIipI,GAAc,SAAqBh8N,GACrC,IAAIxP,EAAMwP,EAAQxP,IAElB,GAAY,QAARA,EAAe,CACjB,IAAIyrO,EAAY3mO,SAASozD,iBAAiB,qCAK1C74D,MAAMO,UAAU2M,QAAQxM,KAAK0rO,GAAW,SAAU50I,IASL,IAFhBA,EAAKhyE,aAAa,gBAEpBvZ,QAAQ,OAIjCxG,SAASs8G,KAAKvrD,YAAYghC,GAC1BA,EAAK1xF,aAAa,SAAU,IAC9B,GACF,CAEA,IAGI83C,EAkBAyuL,EArBAC,EAAgBn8N,EAAQm8N,eAAiBL,GAEzCM,EAAW,CAAC,EAEZC,EAAiB,GAGnB5uL,EAAYztC,EAAQytC,WAAan4C,SAASs8G,KAC1C/hH,MAAMO,UAAU2M,QAAQxM,KAExB+E,SAASozD,iBAAiB,wBAA2Bl4D,EAAM,QAAS,SAAU62F,GAG5E,IAFA,IAAIi1I,EAASj1I,EAAKhyE,aAAa,gBAAgB3T,MAAM,KAE5C/R,EAAI,EAAGA,EAAI2sO,EAAO5sO,OAAQC,IACjCysO,EAASE,EAAO3sO,KAAM,EAGxB0sO,EAAejoN,KAAKizE,EACtB,IAKF,IAGMk1I,EClXmBxpI,EDmXnBypI,EAAoB,CAAClyM,ICnXFyoE,EDmXuB,SAAUsoF,GACtDkhD,EAAa9D,OAAOp9C,EACtB,ECpXI,SAAUxyF,GACXA,EAAQ04G,OACR14G,EAAUA,EAAQrP,SACrBuZ,EAASlK,EACZ,IDiXO4zI,ECvYD,SAAqBC,GAC3B,IAAIhtO,EAAS0pO,GAAOsD,GAEpB,OAAO,SAAU7zI,EAASn5E,EAAOijE,EAAUogB,GAG1C,IAFA,IAAIunI,EAAS,GAEJ3qO,EAAI,EAAGA,EAAID,EAAQC,IAC3B2qO,GAAUoC,EAAW/sO,GAAGk5F,EAASn5E,EAAOijE,EAAUogB,IAAa,GAEhE,OAAOunI,CACR,CACD,CD4XqBqC,CAPM,CAACjB,GAAQG,IAOe5oO,OAAOkpO,EAAeK,IAMrEN,EAAU,SAAgB5oH,EAAUspH,EAAYjtD,EAAOktD,GACrDN,EAAe5sD,EAJR0qD,GAAUE,GAMVjnH,EAAWA,EAAW,IAAMspH,EAAWzvD,OAAS,IAAMyvD,EAAWzvD,QANtCsvD,GAQ9BI,IACF58K,EAAMm8K,SAASQ,EAAWprO,OAAQ,EAEtC,EAGF,IAAIyuD,EAAQ,CACVzvD,IAAKA,EACLm/K,MAAO,IAAIooD,GAAW,CACpBvnO,IAAKA,EACLi9C,UAAWA,EACX6qL,MAAOt4N,EAAQs4N,MACfF,OAAQp4N,EAAQo4N,OAChB98G,QAASt7G,EAAQs7G,QACjB48G,eAAgBl4N,EAAQk4N,iBAE1BI,MAAOt4N,EAAQs4N,MACf8D,SAAUA,EACVU,WAAY,CAAC,EACbrE,OAAQyD,GAGV,OADAj8K,EAAM0vH,MAAM/pE,QAAQy2H,GACbp8K,CACT,EEnbA,SAAS,KACP,OAAO,GAAW9vD,OAAO4/E,OAAS5/E,OAAO4/E,OAAOx8E,OAAS,SAAUyD,GACjE,IAAK,IAAI3D,EAAI,EAAGA,EAAI1B,UAAUjC,OAAQ2D,IAAK,CACzC,IAAIoN,EAAI9O,UAAU0B,GAClB,IAAK,IAAIiN,KAAKG,GAAG,CAAG,GAAEnQ,eAAeC,KAAKkQ,EAAGH,KAAOtJ,EAAEsJ,GAAKG,EAAEH,GAC/D,CACA,OAAOtJ,CACT,EAAG,GAAS+d,MAAM,KAAMpjB,UAC1B,CCRA,IAAIorO,GAAc,SAAqBr6D,GACrC,IAAIziH,EAAQ,IAAIk4C,QAChB,OAAO,SAAU6kI,GACf,GAAI/8K,EAAMtkC,IAAIqhN,GAGZ,OAAO/8K,EAAMx1C,IAAIuyN,GAGnB,IAAIC,EAAMv6D,EAAKs6D,GAEf,OADA/8K,EAAM/yC,IAAI8vN,EAAKC,GACRA,CACT,CACF,ECXA,SAASC,GAAoBJ,EAAYK,EAAkBC,GACzD,IAAIC,EAAe,GAQnB,OAPAD,EAAW17N,MAAM,KAAK3E,SAAQ,SAAU+4G,QACRj5G,IAA1BigO,EAAWhnH,GACbqnH,EAAiB/oN,KAAK0oN,EAAWhnH,GAAa,KACrCA,IACTunH,GAAgBvnH,EAAY,IAEhC,IACOunH,CACT,CACA,IAAIC,GAAiB,SAAwBr9K,EAAO28K,EAAYW,GAC9D,IAAIznH,EAAY71D,EAAMzvD,IAAM,IAAMosO,EAAWprO,MAO5B,IAAhB+rO,QAIwD1gO,IAAhCojD,EAAM68K,WAAWhnH,KACxC71D,EAAM68K,WAAWhnH,GAAa8mH,EAAWzvD,OAE7C,EACIqwD,GAAe,SAAsBv9K,EAAO28K,EAAYW,GAC1DD,GAAer9K,EAAO28K,EAAYW,GAClC,IAAIznH,EAAY71D,EAAMzvD,IAAM,IAAMosO,EAAWprO,KAE7C,QAAwCqL,IAApCojD,EAAMm8K,SAASQ,EAAWprO,MAAqB,CACjD,IAAIuG,EAAU6kO,EAEd,GACE38K,EAAMw4K,OAAOmE,IAAe7kO,EAAU,IAAM+9G,EAAY,GAAI/9G,EAASkoD,EAAM0vH,OAAO,GAElF53K,EAAUA,EAAQ24F,gBACC7zF,IAAZ9E,EACX,CACF,EC1CA,IAAI0lO,GAAe,CACjB9pJ,wBAAyB,EACzBC,YAAa,EACbC,kBAAmB,EACnBC,iBAAkB,EAClBC,iBAAkB,EAClBC,QAAS,EACTC,aAAc,EACdC,gBAAiB,EACjBC,YAAa,EACbC,QAAS,EACTC,KAAM,EACNC,SAAU,EACVC,aAAc,EACdC,WAAY,EACZC,aAAc,EACdC,UAAW,EACXE,QAAS,EACTC,WAAY,EACZC,YAAa,EACbC,aAAc,EACdC,WAAY,EACZC,cAAe,EACfC,eAAgB,EAChBC,gBAAiB,EACjBuoJ,UAAW,EACXC,cAAe,EACfC,aAAc,EACdC,iBAAkB,EAClBzoJ,WAAY,EACZE,WAAY,EACZC,QAAS,EACTC,MAAO,EACPC,QAAS,EACTq3B,MAAO,EACPp3B,QAAS,EACTC,OAAQ,EACRC,OAAQ,EACRC,KAAM,EACNioJ,gBAAiB,EAEjBhoJ,YAAa,EACbC,aAAc,EACdC,YAAa,EACbC,gBAAiB,EACjBC,iBAAkB,EAClBC,iBAAkB,EAClBC,cAAe,EACfC,YAAa,GChDf,SAAS0nJ,GAAQxsL,GACf,IAAI0O,EAAQ9vD,OAAO8D,OAAO,MAC1B,OAAO,SAAU+oO,GAEf,YADmBngO,IAAfojD,EAAM+8K,KAAoB/8K,EAAM+8K,GAAOzrL,EAAGyrL,IACvC/8K,EAAM+8K,EACf,CACF,CCFA,IAEIgB,GAAiB,aACjBC,GAAiB,8BAEjBC,GAAmB,SAA0BpD,GAC/C,OAAkC,KAA3BA,EAAS3nN,WAAW,EAC7B,EAEIgrN,GAAqB,SAA4BhjO,GACnD,OAAgB,MAATA,GAAkC,mBAAVA,CACjC,EAEIijO,GAAkCL,IAAQ,SAAUM,GACtD,OAAOH,GAAiBG,GAAaA,EAAYA,EAAUxoO,QAAQmoO,GAAgB,OAAO/gO,aAC5F,IAEIqhO,GAAoB,SAA2B9tO,EAAK2K,GACtD,OAAQ3K,GACN,IAAK,YACL,IAAK,gBAED,GAAqB,kBAAV2K,EACT,OAAOA,EAAMtF,QAAQooO,IAAgB,SAAU16M,EAAOg7M,EAAIC,GAMxD,OALArgH,GAAS,CACP3sH,KAAM+sO,EACNpxD,OAAQqxD,EACR9tI,KAAMytB,IAEDogH,CACT,IAKR,OAAsB,IAAlBE,GAASjuO,IAAe0tO,GAAiB1tO,IAAyB,kBAAV2K,GAAgC,IAAVA,EAI3EA,EAHEA,EAAQ,IAInB,EAIA,SAASujO,GAAoBC,EAAa7B,EAAY8B,GACpD,GAAqB,MAAjBA,EACF,MAAO,GAGT,IAAIC,EAAoBD,EAExB,QAA2C/hO,IAAvCgiO,EAAkBC,iBAEpB,OAAOD,EAGT,cAAeD,GACb,IAAK,UAED,MAAO,GAGX,IAAK,SAED,IAAIG,EAAYH,EAEhB,GAAuB,IAAnBG,EAAUC,KAMZ,OALA7gH,GAAS,CACP3sH,KAAMutO,EAAUvtO,KAChB27K,OAAQ4xD,EAAU5xD,OAClBz8E,KAAMytB,IAED4gH,EAAUvtO,KAGnB,IAAIytO,EAAmBL,EAEvB,QAAgC/hO,IAA5BoiO,EAAiB9xD,OAAsB,CACzC,IAAIz8E,EAAOuuI,EAAiBvuI,KAE5B,QAAa7zF,IAAT6zF,EAGF,UAAgB7zF,IAAT6zF,GACLytB,GAAS,CACP3sH,KAAMk/F,EAAKl/F,KACX27K,OAAQz8E,EAAKy8E,OACbz8E,KAAMytB,IAERztB,EAAOA,EAAKA,KAKhB,OADauuI,EAAiB9xD,OAAS,GAEzC,CAEA,OA2BR,SAAgCwxD,EAAa7B,EAAYhtJ,GACvD,IAAIovJ,EAAS,GAEb,GAAIrvO,MAAMC,QAAQggF,GAChB,IAAK,IAAIngF,EAAI,EAAGA,EAAImgF,EAAIpgF,OAAQC,IAC9BuvO,GAAUR,GAAoBC,EAAa7B,EAAYhtJ,EAAIngF,IAAM,SAGnE,IAAK,IAAIa,KAAOs/E,EAAK,CACnB,IAAI30E,EAAQ20E,EAAIt/E,GAEhB,GAAqB,kBAAV2K,EAAoB,CAC7B,IAAIgkO,EAAWhkO,EAEG,MAAd2hO,QAA+CjgO,IAAzBigO,EAAWqC,GACnCD,GAAU1uO,EAAM,IAAMssO,EAAWqC,GAAY,IACpChB,GAAmBgB,KAC5BD,GAAUd,GAAiB5tO,GAAO,IAAM8tO,GAAkB9tO,EAAK2uO,GAAY,IAE/E,MAKE,IAAItvO,MAAMC,QAAQqL,IAA8B,kBAAbA,EAAM,IAAkC,MAAd2hO,QAA+CjgO,IAAzBigO,EAAW3hO,EAAM,IAM7F,CACL,IAAIikO,EAAeV,GAAoBC,EAAa7B,EAAY3hO,GAEhE,OAAQ3K,GACN,IAAK,YACL,IAAK,gBAED0uO,GAAUd,GAAiB5tO,GAAO,IAAM4uO,EAAe,IACvD,MAGJ,QAGIF,GAAU1uO,EAAM,IAAM4uO,EAAe,IAG7C,MAtBE,IAAK,IAAI77L,EAAK,EAAGA,EAAKpoC,EAAMzL,OAAQ6zC,IAC9B46L,GAAmBhjO,EAAMooC,MAC3B27L,GAAUd,GAAiB5tO,GAAO,IAAM8tO,GAAkB9tO,EAAK2K,EAAMooC,IAAO,IAsBtF,CAGF,OAAO27L,CACT,CAhFeG,CAAuBV,EAAa7B,EAAY8B,GAG3D,IAAK,WAED,QAAoB/hO,IAAhB8hO,EAA2B,CAC7B,IAAIW,EAAiBnhH,GACjB/9G,EAASw+N,EAAcD,GAE3B,OADAxgH,GAASmhH,EACFZ,GAAoBC,EAAa7B,EAAY18N,EACtD,EAON,IAAI++N,EAAWP,EAEf,GAAkB,MAAd9B,EACF,OAAOqC,EAGT,IAAII,EAASzC,EAAWqC,GACxB,YAAkBtiO,IAAX0iO,EAAuBA,EAASJ,CACzC,CAyDA,IAGIhhH,GAHAqhH,GAAe,+BAInB,SAASC,GAAgBtb,EAAM2Y,EAAY6B,GACzC,GAAoB,IAAhBxa,EAAKz0N,QAAmC,kBAAZy0N,EAAK,IAA+B,OAAZA,EAAK,SAAkCtnN,IAAnBsnN,EAAK,GAAGh3C,OAClF,OAAOg3C,EAAK,GAGd,IAAIub,GAAa,EACbvyD,EAAS,GACbhvD,QAASthH,EACT,IAAI8iO,EAAUxb,EAAK,GAEJ,MAAXwb,QAAmC9iO,IAAhB8iO,EAAQ5lH,KAC7B2lH,GAAa,EACbvyD,GAAUuxD,GAAoBC,EAAa7B,EAAY6C,IAIvDxyD,GAF2BwyD,EAEI,GAIjC,IAAK,IAAIhwO,EAAI,EAAGA,EAAIw0N,EAAKz0N,OAAQC,IAAK,CAGpC,GAFAw9K,GAAUuxD,GAAoBC,EAAa7B,EAAY3Y,EAAKx0N,IAExD+vO,EAGFvyD,GAFyBwyD,EAEIhwO,EAEjC,CAGA6vO,GAAah1N,UAAY,EAIzB,IAHA,IACI+Y,EADAq8M,EAAiB,GAG0B,QAAvCr8M,EAAQi8M,GAAap+N,KAAK+rK,KAChCyyD,GAAkB,IAAMr8M,EAAM,GAGhC,IAAI/xB,EC/NN,SAAiBouN,GAYf,IANA,IAEIjpN,EAFAgB,EAAI,EAGJhI,EAAI,EACJikC,EAAMgsL,EAAIlwN,OAEPkkC,GAAO,IAAKjkC,EAAGikC,GAAO,EAE3Bj9B,EAEe,YAAV,OAHLA,EAAwB,IAApBipN,EAAIzsM,WAAWxjB,IAAmC,IAAtBiwN,EAAIzsM,aAAaxjB,KAAc,GAA2B,IAAtBiwN,EAAIzsM,aAAaxjB,KAAc,IAA4B,IAAtBiwN,EAAIzsM,aAAaxjB,KAAc,MAG9F,OAAZgH,IAAM,KAAgB,IAIpDgB,EAEe,YAAV,OALLhB,GAEAA,IAAM,MAGoC,OAAZA,IAAM,KAAgB,IAErC,YAAV,MAAJgB,IAAyC,OAAZA,IAAM,KAAgB,IAItD,OAAQi8B,GACN,KAAK,EACHj8B,IAA8B,IAAxBioN,EAAIzsM,WAAWxjB,EAAI,KAAc,GAEzC,KAAK,EACHgI,IAA8B,IAAxBioN,EAAIzsM,WAAWxjB,EAAI,KAAc,EAEzC,KAAK,EAEHgI,EAEe,YAAV,OAHLA,GAAyB,IAApBioN,EAAIzsM,WAAWxjB,MAGsB,OAAZgI,IAAM,KAAgB,IASxD,SAHAA,EAEe,YAAV,OAHLA,GAAKA,IAAM,MAG+B,OAAZA,IAAM,KAAgB,KACvCA,IAAM,MAAQ,GAAGtH,SAAS,GACzC,CD8KawvO,CAAW1yD,GAAUyyD,EAEhC,MAAO,CACLpuO,KAAMA,EACN27K,OAAQA,EACRz8E,KAAMytB,GAEV,CEvOA,IAIIznB,KAAqB34F,EAA+B,oBAAIA,EAA+B,mBACvF+hO,GAA2CppI,IAL5B,SAAsBziG,GACvC,OAAOA,GACT,EAII8rO,GAAuCrpI,IAAsB34F,EAAAA,gBCI7DiiO,GAAqCjiO,EAAAA,cAMlB,qBAAhBkiO,YAA6CjE,GAAY,CAC9DxrO,IAAK,QACF,MAOD0vO,IALgBF,GAAoBp3G,SAKjB,SAA0B85C,GAC/C,OAAoBx5C,EAAAA,EAAAA,aAAW,SAAUrxH,EAAOT,GAE9C,IAAI6oD,GAAQu2C,EAAAA,EAAAA,YAAWwpI,IACvB,OAAOt9D,EAAK7qK,EAAOooD,EAAO7oD,EAC5B,GACF,GAEI+oO,GAA8BpiO,EAAAA,cAAoB,CAAC,GAgBnDqiO,GAAsCrD,IAAY,SAAUsD,GAC9D,OAAOtD,IAAY,SAAU/xH,GAC3B,OAZW,SAAkBq1H,EAAYr1H,GAC3C,MAAqB,oBAAVA,EACSA,EAAMq1H,GAKnBxV,GAAS,CAAC,EAAGwV,EAAYr1H,EAClC,CAIWs1H,CAASD,EAAYr1H,EAC9B,GACF,IACIu1H,GAAgB,SAAuB1oO,GACzC,IAAImzG,EAAQjtG,EAAAA,WAAiBoiO,IAM7B,OAJItoO,EAAMmzG,QAAUA,IAClBA,EAAQo1H,GAAqBp1H,EAArBo1H,CAA4BvoO,EAAMmzG,QAGxBjtG,EAAAA,cAAoBoiO,GAAav3G,SAAU,CAC7DztH,MAAO6vG,GACNnzG,EAAM86E,SACX,EAcA,IAAI6tJ,GAAS,CAAC,EAAElwO,eAEZmwO,GAAe,qCAgBfC,GAAY,SAAmB96G,GACjC,IAAI3lE,EAAQ2lE,EAAK3lE,MACb28K,EAAah3G,EAAKg3G,WAClBW,EAAc33G,EAAK23G,YAMvB,OALAD,GAAer9K,EAAO28K,EAAYW,GAClCuC,IAAyC,WACvC,OAAOtC,GAAav9K,EAAO28K,EAAYW,EACzC,IAEO,IACT,EA6CIoD,GA3CyBT,IAAiB,SAAUroO,EAAOooD,EAAO7oD,GACpE,IAAIwpO,EAAU/oO,EAAMgpO,IAIG,kBAAZD,QAAsD/jO,IAA9BojD,EAAM68K,WAAW8D,KAClDA,EAAU3gL,EAAM68K,WAAW8D,IAG7B,IAAIE,EAAmBjpO,EAAM4oO,IACzBtD,EAAmB,CAACyD,GACpB9qH,EAAY,GAEe,kBAApBj+G,EAAMi+G,UACfA,EAAYonH,GAAoBj9K,EAAM68K,WAAYK,EAAkBtlO,EAAMi+G,WAC9C,MAAnBj+G,EAAMi+G,YACfA,EAAYj+G,EAAMi+G,UAAY,KAGhC,IAAI8mH,EAAa6C,GAAgBtC,OAAkBtgO,EAAWkB,EAAAA,WAAiBoiO,KAE/ErqH,GAAa71D,EAAMzvD,IAAM,IAAMosO,EAAWprO,KAC1C,IAAIuvO,EAAW,CAAC,EAEhB,IAAK,IAAIvwH,KAAS34G,EACZ2oO,GAAOjwO,KAAKsH,EAAO24G,IAAoB,QAAVA,GAAmBA,IAAUiwH,KAC5DM,EAASvwH,GAAS34G,EAAM24G,IAU5B,OANAuwH,EAASjrH,UAAYA,EAEjB1+G,IACF2pO,EAAS3pO,IAAMA,GAGG2G,EAAAA,cAAoBA,EAAAA,SAAgB,KAAmBA,EAAAA,cAAoB2iO,GAAW,CACxGzgL,MAAOA,EACP28K,WAAYA,EACZW,YAAyC,kBAArBuD,IACL/iO,EAAAA,cAAoB+iO,EAAkBC,GACzD,yBC3II9oO,GAAM,SAAa3G,EAAMuG,GAE3B,IAAIssN,EAAOxyN,UAEX,GAAa,MAATkG,IAAkB2oO,GAAOjwO,KAAKsH,EAAO,OACvC,OAAOkG,EAAAA,cAAoBgX,WAAMlY,EAAWsnN,GAG9C,IAAI6c,EAAa7c,EAAKz0N,OAClBuxO,EAAwB,IAAIpxO,MAAMmxO,GACtCC,EAAsB,GAAKC,GAC3BD,EAAsB,GD4DC,SAA4B3vO,EAAMuG,GAEzD,IAAIkpO,EAAW,CAAC,EAEhB,IAAK,IAAIzwH,KAAQz4G,EACX2oO,GAAOjwO,KAAKsH,EAAOy4G,KACrBywH,EAASzwH,GAAQz4G,EAAMy4G,IAM3B,OAFAywH,EAASN,IAAgBnvO,EAElByvO,CACT,CCzE6BI,CAAmB7vO,EAAMuG,GAEpD,IAAK,IAAIlI,EAAI,EAAGA,EAAIqxO,EAAYrxO,IAC9BsxO,EAAsBtxO,GAAKw0N,EAAKx0N,GAGlC,OAAOoO,EAAAA,cAAoBgX,MAAM,KAAMksN,EACzC,GAEA,SAAWG,GACT,IAAIC,EAEiBA,IAAQA,EAAMD,EAAKC,MAAQD,EAAKC,IAAM,CAAC,GAC7D,CAJD,CAIGppO,KAAQA,GAAM,CAAC,IAKlB,IAAIqpO,GAAwBpB,IAAiB,SAAUroO,EAAOooD,GAE5D,IACI28K,EAAa6C,GAAgB,CADpB5nO,EAAMs1K,aACwBtwK,EAAWkB,EAAAA,WAAiBoiO,KAMnEoB,EAAWxjO,EAAAA,SAqDf,OApDAgiO,IAAqC,WACnC,IAAIvvO,EAAMyvD,EAAMzvD,IAAM,UAElBm/K,EAAQ,IAAI1vH,EAAM0vH,MAAMlgL,YAAY,CACtCe,IAAKA,EACL8nO,MAAOr4K,EAAM0vH,MAAM2oD,MACnB7qL,UAAWwS,EAAM0vH,MAAMliI,UACvB2qL,OAAQn4K,EAAM0vH,MAAMwoD,WAElBqJ,GAAc,EACdn6I,EAAO/xF,SAASmzD,cAAc,uBAA0Bj4D,EAAM,IAAMosO,EAAWprO,KAAO,MAc1F,OAZIyuD,EAAM0vH,MAAM0yB,KAAK3yM,SACnBigL,EAAMstB,OAASh9I,EAAM0vH,MAAM0yB,KAAK,IAGrB,OAATh7G,IACFm6I,GAAc,EAEdn6I,EAAK1xF,aAAa,eAAgBnF,GAClCm/K,EAAM/pE,QAAQ,CAACve,KAGjBk6I,EAASxpO,QAAU,CAAC43K,EAAO6xD,GACpB,WACL7xD,EAAMvtI,OACR,CACF,GAAG,CAAC6d,IACJ8/K,IAAqC,WACnC,IAAI0B,EAAkBF,EAASxpO,QAC3B43K,EAAQ8xD,EAAgB,GAG5B,GAFkBA,EAAgB,GAGhCA,EAAgB,IAAK,MADvB,CAUA,QALwB5kO,IAApB+/N,EAAWlsI,MAEb8sI,GAAav9K,EAAO28K,EAAWlsI,MAAM,GAGnCi/E,EAAM0yB,KAAK3yM,OAAQ,CAErB,IAAIm5F,EAAU8mF,EAAM0yB,KAAK1yB,EAAM0yB,KAAK3yM,OAAS,GAAGgyO,mBAChD/xD,EAAMstB,OAASp0G,EACf8mF,EAAMvtI,OACR,CAEA6d,EAAMw4K,OAAO,GAAImE,EAAYjtD,GAAO,EAdpC,CAeF,GAAG,CAAC1vH,EAAO28K,EAAWprO,OACf,IACT,IAEA,SAASqvO,KACP,IAAK,IAAIxwH,EAAO1+G,UAAUjC,OAAQy0N,EAAO,IAAIt0N,MAAMwgH,GAAOC,EAAO,EAAGA,EAAOD,EAAMC,IAC/E6zG,EAAK7zG,GAAQ3+G,UAAU2+G,GAGzB,OAAOmvH,GAAgBtb,EACzB,CAEA,SAAS4a,KACP,IAAI4C,EAAad,GAAI9rN,WAAM,EAAQpjB,WAC/BH,EAAO,aAAemwO,EAAWnwO,KACrC,MAAO,CACLA,KAAMA,EACN27K,OAAQ,cAAgB37K,EAAO,IAAMmwO,EAAWx0D,OAAS,IACzD6xD,KAAM,EACN3uO,SAAU,WACR,MAAO,QAAUsZ,KAAKnY,KAAO,IAAMmY,KAAKwjK,OAAS,OACnD,EAEJ,CC7HY,MAACy0D,GAAiB,CAC5BC,KAAM,CACJ,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAEF7hC,KAAM,CACJ,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAEFG,IAAK,CACH,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAEF2hC,KAAM,CACJ,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAEFC,MAAO,CACL,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAEFC,OAAQ,CACN,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAEFC,OAAQ,CACN,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAEFrhC,KAAM,CACJ,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAEFG,KAAM,CACJ,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAEFF,KAAM,CACJ,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAEFN,MAAO,CACL,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAEFC,KAAM,CACJ,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAEFE,OAAQ,CACN,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAEFwhC,OAAQ,CACN,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,YCvKJ,IAAIC,GAAYhyO,OAAOmC,eACnB8vO,GAAsBjyO,OAAOqC,sBAC7B6vO,GAAelyO,OAAOC,UAAUE,eAChCgyO,GAAenyO,OAAOC,UAAUmyO,qBAChCC,GAAkBA,CAAC1yJ,EAAKt/E,EAAK2K,IAAU3K,KAAOs/E,EAAMqyJ,GAAUryJ,EAAKt/E,EAAK,CAAEi/D,YAAY,EAAM0hB,cAAc,EAAMs9C,UAAU,EAAMtzH,UAAW20E,EAAIt/E,GAAO2K,EACtJsnO,GAAiBA,CAAClzO,EAAGC,KACvB,IAAK,IAAI0jN,KAAQ1jN,IAAMA,EAAI,IACrB6yO,GAAa9xO,KAAKf,EAAG0jN,IACvBsvB,GAAgBjzO,EAAG2jN,EAAM1jN,EAAE0jN,IAC/B,GAAIkvB,GACF,IAAK,IAAIlvB,KAAQkvB,GAAoB5yO,GAC/B8yO,GAAa/xO,KAAKf,EAAG0jN,IACvBsvB,GAAgBjzO,EAAG2jN,EAAM1jN,EAAE0jN,IAEjC,OAAO3jN,CAAC,ECdH,SAASmzO,GAAa13H,GAC3B,OAAQ23H,GAC4B,kBAAvB33H,EAAM03H,aACR13H,EAAM03H,aAER13H,EAAM03H,aAAaC,GAAe33H,EAAM23H,YAEnD,CCNO,SAASC,GAAW53H,GACzB,MAAM63H,EAAkBH,GAAa13H,GACrC,OAAO,SAACh/C,EAAO82K,GAA2D,IAApDC,IAAepxO,UAAAjC,OAAA,QAAAmN,IAAAlL,UAAA,KAAAA,UAAA,GAASqxO,IAAgBrxO,UAAAjC,OAAA,QAAAmN,IAAAlL,UAAA,KAAAA,UAAA,GAC5D,GAAqB,kBAAVq6D,GAAsBA,EAAMt1C,SAAS,KAAM,CACpD,MAAOusN,EAAeC,GAAkBl3K,EAAMtqD,MAAM,KAC9CyhO,EAAgBt5N,SAASq5N,EAAgB,IAC/C,GAAID,KAAiBj4H,EAAMo4H,QAAUD,GAAiB,GAAKA,EAAgB,GACzE,OAAOn4H,EAAMo4H,OAAOH,GAAgC,kBAAVH,GAAuBE,EAA2BG,EAARL,EAE5F,CACI,MAAMO,EAA0B,kBAAVP,EAAqBA,EAAQD,IACnD,OAAO72K,KAASg/C,EAAMo4H,OAASp4H,EAAMo4H,OAAOp3K,GAAOq3K,GAAUN,EAAkB/3H,EAAMo4H,OAAOp4H,EAAMs4H,cAAcD,GAAUr3K,CAC9H,CACA,CCdO,SAASu3K,GAAsBH,GACpC,IAAII,EAAQ,GACZ,IAAK,IAAI7zO,EAAI,EAAGA,EAAIyzO,EAAO1zO,OAAS,EAAGC,GAAK,EAC1C6zO,GAAS,GAAGJ,EAAOzzO,MAAMA,GAAKyzO,EAAO1zO,OAAS,GAAK,SAErD,MAAO,GAAG0zO,EAAO,UAAUI,IAAQJ,EAAOA,EAAO1zO,OAAS,SAC5D,CCGO,SAAS+zO,GAASz4H,GACvB,MAAM04H,EAAgBd,GAAW53H,GAC3B63H,EAAkBH,GAAa13H,GACrC,OAAQtrE,IACN,MAAMmhL,EAAS,CACb5tM,MAAkB,MAAXysB,OAAkB,EAASA,EAAQzsB,OAAS+3F,EAAM24H,gBAAgB1wN,KACzEg0D,IAAgB,MAAXvnC,OAAkB,EAASA,EAAQunC,KAAO+jC,EAAM24H,gBAAgB18J,GACrEmkI,KAAiB,MAAX1rK,OAAkB,EAASA,EAAQ0rK,MAAQpgG,EAAM24H,gBAAgBv4B,KAEzE,MAAO,mBAAmByV,EAAOzV,WAAWs4B,EAAc7iB,EAAO5tM,KAAM4vN,KAAmB,UAAca,EAAc7iB,EAAO55I,GAAI47J,KAAmB,UAAc,CAEtK,CCpBO,SAAS1sN,GAAKte,GACnB,GAA0B,kBAAfA,EAAMse,KACf,OAAOte,EAAMse,KAEf,MAAMytN,EAAe/rO,EAAM6rN,MAAM7rN,EAAMse,MACvC,YAAwB,IAAjBytN,EAA0BA,EAAe/rO,EAAMse,MAAQte,EAAM6rN,MAAM7jI,EAC5E,CC0BO,SAASgkJ,GAAO73K,GACrB,MAhCmB,0BACD92D,KA+BH82D,GA7BjB,SAAmBA,GACjB,IAAI83K,EAAY93K,EAAMn2D,QAAQ,IAAK,IACnC,GAAyB,IAArBiuO,EAAUp0O,OAAc,CAC1B,MAAMq0O,EAAeD,EAAUpiO,MAAM,IACrCoiO,EAAY,CACVC,EAAa,GACbA,EAAa,GACbA,EAAa,GACbA,EAAa,GACbA,EAAa,GACbA,EAAa,IACbniO,KAAK,GACX,CACE,MAAMpL,EAASqT,SAASi6N,EAAW,IAInC,MAAO,CACLxjO,EAJQ9J,GAAU,GAAK,IAKvBiB,EAJQjB,GAAU,EAAI,IAKtBhH,EAJiB,IAATgH,EAKRjH,EAAG,EAEP,CAOWy0O,CAAUh4K,GAEfA,EAAM95B,WAAW,OARvB,SAAyB85B,GACvB,MAAO1rD,EAAG7I,EAAGjI,EAAGD,GAAKy8D,EAAMn2D,QAAQ,YAAa,IAAI6L,MAAM,KAAKwX,IAAIrX,QACnE,MAAO,CAAEvB,IAAG7I,IAAGjI,IAAGD,EAAGA,GAAK,EAC5B,CAMW00O,CAAgBj4K,GAElB,CACL1rD,EAAG,EACH7I,EAAG,EACHjI,EAAG,EACHD,EAAG,EAEP,CC5CO,SAAS20O,GAAKl4K,EAAOmiJ,GAC1B,GAAqB,kBAAVniJ,GAAsBmiJ,EAAQ,GAAKA,EAAQ,EACpD,MAAO,mBAET,MAAM7tM,EAAEA,EAAC,EAAE7I,EAACjI,EAAEA,GAAMq0O,GAAO73K,GAC3B,MAAO,QAAQ1rD,MAAM7I,MAAMjI,MAAM2+M,IACnC,CCSY,MAAC5lG,GAAM,CACjB47H,WCjBK,SAAoBn5H,GACzB,MAAO,MAAS2mE,WAAY3mE,EAAM2mE,YAAc,cAClD,EDgBEixD,WAAU,GACVwB,YRHK,SAAqBp5H,GAC1B,OAAQsI,IAAQ,CACd+wH,wBAAyB,cACzB,CAAC/wH,GAAY,WAAYmvH,GAAe,GAAwB,WAApBz3H,EAAMs5H,WAA8C,SAApBt5H,EAAMs5H,UAAuBt5H,EAAMu5H,gBAAgBp3D,OAAOniE,GAASA,EAAMu5H,gBAAgBC,YAAYx5H,IACjL,CAACsI,EAAWA,EAASz9G,QAAQ,SAAU,8BAAgC,+BAAgC4sO,GAAe,GAAwB,SAApBz3H,EAAMs5H,WAA4C,UAApBt5H,EAAMs5H,UAAwBt5H,EAAMu5H,gBAAgBC,YAAYx5H,GAAS,OAErO,EQFEy5H,eJjBK,SAAwBr5B,GAAgB,QAAA/6F,EAAA1+G,UAAAjC,OAAR0zO,EAAM,IAAAvzO,MAAAwgH,EAAA,EAAAA,EAAA,KAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAN8yH,EAAM9yH,EAAA,GAAA3+G,UAAA2+G,GAC3C,MAAO,mBAAmB86F,SAAWm4B,GAAsBH,KAC7D,EIgBEsB,eJfK,WAAmC,QAAAn0H,EAAA5+G,UAAAjC,OAAR0zO,EAAM,IAAAvzO,MAAA0gH,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAN4yH,EAAM5yH,GAAA7+G,UAAA6+G,GACtC,MAAO,2BAA2B+yH,GAAsBH,KAC1D,EIcEuB,YElBK,SAAqB35H,GAC1B,OAAQ45H,GAAe,sBAAsBzuN,GAAK,CAAEA,KAAMyuN,EAAYlhB,MAAO14G,EAAM65H,cAAiB,MACtG,EFiBEC,WEtBK,SAAoB95H,GACzB,OAAQ45H,GAAe,sBAAsBzuN,GAAK,CAAEA,KAAMyuN,EAAYlhB,MAAO14G,EAAM65H,kBACrF,EFqBEX,KAAI,GACJ/tN,KAAI,GACJ4uN,MG1BK,WAA2B,IAAZhrN,EAAMpoB,UAAAjC,OAAA,QAAAmN,IAAAlL,UAAA,GAAAA,UAAA,GAAG,EAC7B,MAAO,CACL4G,SAAU,WACVC,IAAKuhB,EACLq4C,MAAOr4C,EACPthB,KAAMshB,EACNi+C,OAAQj+C,EAEZ,EHmBEirN,OI1BK,SAAgBh5K,EAAOmiJ,GAC5B,MAAM,EAAE7tM,EAAC,EAAE7I,EAAC,EAAEjI,EAACD,EAAEA,GAAMs0O,GAAO73K,GACxBt1D,EAAI,EAAIy3M,EACR0zB,EAAQ5qJ,GAAUh1E,KAAKwU,MAAMwgE,EAAQvgF,GAC3C,MAAO,QAAQmrO,EAAKvhO,OAAOuhO,EAAKpqO,OAAOoqO,EAAKryO,OAAOD,IACrD,EJsBE01O,QK3BK,SAAiBj5K,EAAOmiJ,GAC7B,MAAM,EAAE7tM,EAAC,EAAE7I,EAAC,EAAEjI,EAAC,EAAED,GAAMs0O,GAAO73K,GACxBk5K,EAASjuJ,GAAUh1E,KAAKwU,MAAMwgE,GAAS,IAAMA,GAASk3H,GAC5D,MAAO,QAAQ+2B,EAAM5kO,OAAO4kO,EAAMztO,OAAOytO,EAAM11O,OAAOD,IACxD,ELwBE02H,OM7BK,SAAgBjb,GACrB,OAAQ70F,IACN,GAAoB,kBAATA,EACT,OAAOA,EAET,MAAMgvN,EAA+C,kBAAxBn6H,EAAMm6H,cAA6Bn6H,EAAMm6H,cAAgBn6H,EAAMib,OAAOjb,EAAMm6H,gBAAkBn6H,EAAMm6H,cACjI,OAAOn6H,EAAMib,OAAO9vG,IAASA,GAAQgvN,CAAa,CAEtD,ENsBEC,QOhBK,SAAiBp6H,GACtB,MAAM04H,EAAgBd,GAAW53H,GAC3B63H,EAAkBH,GAAa13H,GAC/Bq6H,EAAc5B,GAASz4H,GAC7B,OAAO4a,IAAwE,IAArEw/G,QAASE,EAAQ,MAAEt5K,EAAOy3K,SAAU8B,EAAS,gBAAExC,GAAiBn9G,EACxE,MAAM4/G,EAfV,SAA2Bx5K,EAAOg/C,GAChC,GAAqB,kBAAVh/C,GAAsBA,EAAMt1C,SAAS,KAAM,CACpD,MAAO+uN,EAAevC,GAAkBl3K,EAAMtqD,MAAM,KAC9CyhO,EAAgBt5N,SAASq5N,EAAgB,IAC/C,GAAIuC,KAAiBz6H,EAAMo4H,QAAUD,GAAiB,GAAKA,EAAgB,GACzE,MAAO,CAAEuC,iBAAiB,EAAMl1O,IAAKi1O,EAAe3C,MAAOK,EAEjE,CACE,MAAO,CAAEuC,iBAAiB,EAC5B,CAMsBC,CAAkB35K,EAAOg/C,GAC3C,OAAQs6H,GACN,IAAK,QACH,MAAO,CACLM,OAAQ,cACRh8K,WAAYs6K,GAAKR,EAAc13K,EAA6B,SAAtBg/C,EAAM23H,YAAyB,EAAI,EAAGI,GAAiB,GAA8B,SAAtB/3H,EAAM23H,YAAyB,GAAM,GAC1I32K,MAAiB,SAAVA,EAAyC,SAAtBg/C,EAAM23H,YAAyB33H,EAAMo4H,OAAOvB,KAAK,GAAK72H,EAAMo4H,OAAOvB,KAAK,GAAK6B,EAAc13K,EAA6B,SAAtBg/C,EAAM23H,YAAyB,EAAIE,EAAgB,UAC/K3mH,MAAOgoH,GAAKR,EAAc13K,EAA6B,SAAtBg/C,EAAM23H,YAAyB,EAAI,EAAGI,GAAiB,GAA8B,SAAtB/3H,EAAM23H,YAAyB,IAAO,MAG1I,IAAK,SACH,MAAO,CACLiD,OAAQ,cACRh8K,WAAY,cACZoC,MAAiB,SAAVA,EAAyC,SAAtBg/C,EAAM23H,YAAyB33H,EAAMo4H,OAAOvB,KAAK,GAAK72H,EAAMo4H,OAAOvB,KAAK,GAAK6B,EAAc13K,EAA6B,SAAtBg/C,EAAM23H,YAAyB,EAAIE,EAAgB,UAC/K3mH,MAAOgoH,GAAKR,EAAc13K,EAA6B,SAAtBg/C,EAAM23H,YAAyB,EAAI,EAAGI,GAAiB,GAA8B,SAAtB/3H,EAAM23H,YAAyB,GAAM,IAGzI,IAAK,UACH,MAAO,CACLiD,OAAQlC,EAAc13K,EAA6B,SAAtBg/C,EAAM23H,YAAyB,EAAIE,EAAgB,UAChFj5K,WAAY,cACZoC,MAAO03K,EAAc13K,EAA6B,SAAtBg/C,EAAM23H,YAAyB,EAAIE,EAAgB,UAC/E3mH,MAA6B,SAAtBlR,EAAM23H,YAAyBuB,GAAKR,EAAc13K,EAAO,EAAG+2K,GAAiB,GAAQ,KAAQmB,GAAKR,EAAc13K,EAAO,EAAG+2K,GAAiB,GAAQ,MAG9J,IAAK,UACH,MAAO,CACL6C,OAA8B,SAAtB56H,EAAM23H,YAAyB33H,EAAMo4H,OAAOvB,KAAK,GAAK72H,EAAMo4H,OAAOpjC,KAAK,GAChFp2I,WAAkC,SAAtBohD,EAAM23H,YAAyB33H,EAAMo4H,OAAOvB,KAAK,GAAK72H,EAAMi1F,MACxEj0I,MAA6B,SAAtBg/C,EAAM23H,YAAyB33H,EAAMi1F,MAAQj1F,EAAM80F,MAC1D5jF,MAA6B,SAAtBlR,EAAM23H,YAAyB33H,EAAMo4H,OAAOvB,KAAK,GAAK72H,EAAMo4H,OAAOpjC,KAAK,IAGnF,IAAK,QACH,MAAO,CACL4lC,OAAQ,cACRh8K,WAAYohD,EAAMi1F,MAClBj0I,MAAO03K,EAAc13K,EAAO62K,KAC5B3mH,MAAO,MAGX,IAAK,cACH,MAAO,CACL0pH,OAAQ,cACR55K,MAAiB,SAAVA,EAAyC,SAAtBg/C,EAAM23H,YAAyB33H,EAAMo4H,OAAOvB,KAAK,GAAK72H,EAAMo4H,OAAOvB,KAAK,GAAK6B,EAAc13K,EAA6B,SAAtBg/C,EAAM23H,YAAyB,EAAIE,EAAgB,UAC/Kj5K,WAAY,cACZsyD,MAAO,MAGX,IAAK,WACH,MAAO,CACLtyD,WAAYy7K,EAAYE,GACxBv5K,MAAOg/C,EAAMi1F,MACb2lC,OAAQ,cACR1pH,MAAO,MAGX,QAAS,CACP,MAAM2pH,EAAgBhD,IAChBQ,EAASmC,EAAUE,gBAAkBF,EAAU1C,MAAQ+C,EACvDC,EAASN,EAAUE,gBAAkBF,EAAUh1O,IAAMw7D,EAC3D,MAAO,CACL45K,OAAQ,cACRh8K,WAAY85K,EAAcoC,EAAQzC,EAAQN,GAC1C/2K,MAAOg/C,EAAMi1F,MACb/jF,MAAOwnH,EAAcoC,EAAmB,IAAXzC,EAAe,EAAIA,EAAS,GAEnE,EACA,CAEA,EP3DEX,aAAY,GACZxmH,MQhCK,SAAe6pH,GACpB,MAAO,CACL,wBAAyB,CACvB,UAAWA,GAEb,uBAAwB,CACtB,WAAYA,GAGlB,ERwBEtC,SAAQ,GACRH,aSjCK,SAAsBt4H,GAC3B,OAAQ23H,IACN,MAAMG,EAAQJ,GAAa13H,EAAb03H,CAAoBC,GAClC,OAAO33H,EAAMo4H,OAAOp4H,EAAMs4H,cAAcR,EAAM,CAElD,ET6BEkD,kBUnCK,SAA2Bh7H,GAChC,MAAO,MACLi7H,WAAY,OACZj6K,MAA6B,SAAtBg/C,EAAM23H,YAAyB33H,EAAMo4H,OAAOvB,KAAK,GAAK72H,EAAMo4H,OAAOpjC,KAAK,IAEnF,GCLA,IAAImiC,GAAYhyO,OAAOmC,eACnB4zO,GAAa/1O,OAAOu/E,iBACpBy2J,GAAoBh2O,OAAOmvJ,0BAC3B8iF,GAAsBjyO,OAAOqC,sBAC7B6vO,GAAelyO,OAAOC,UAAUE,eAChCgyO,GAAenyO,OAAOC,UAAUmyO,qBAChCC,GAAkBA,CAAC1yJ,EAAKt/E,EAAK2K,IAAU3K,KAAOs/E,EAAMqyJ,GAAUryJ,EAAKt/E,EAAK,CAAEi/D,YAAY,EAAM0hB,cAAc,EAAMs9C,UAAU,EAAMtzH,UAAW20E,EAAIt/E,GAAO2K,EAcnJ,SAASirO,GAAgBC,GAC9B,MAHkBC,EAAC/2O,EAAGC,IAAM02O,GAAW32O,EAAG42O,GAAkB32O,IAGrD82O,CAdY7D,EAAClzO,EAAGC,KACvB,IAAK,IAAI0jN,KAAQ1jN,IAAMA,EAAI,IACrB6yO,GAAa9xO,KAAKf,EAAG0jN,IACvBsvB,GAAgBjzO,EAAG2jN,EAAM1jN,EAAE0jN,IAC/B,GAAIkvB,GACF,IAAK,IAAIlvB,KAAQkvB,GAAoB5yO,GAC/B8yO,GAAa/xO,KAAKf,EAAG0jN,IACvBsvB,GAAgBjzO,EAAG2jN,EAAM1jN,EAAE0jN,IAEjC,OAAO3jN,CAAC,EAKakzO,CAAe,GAAI4D,GAAY,CAClD90L,GAAI,CACF4yL,WAAY57H,GAAI47H,WAAWkC,GAC3BzD,WAAYr6H,GAAIq6H,WAAWyD,GAC3BjC,YAAa77H,GAAI67H,YAAYiC,GAC7BvB,WAAYv8H,GAAIu8H,WAAWuB,GAC3B1B,YAAap8H,GAAIo8H,YAAY0B,GAC7B3B,eAAgBn8H,GAAIm8H,eACpBD,eAAgBl8H,GAAIk8H,eACpBhB,SAAUl7H,GAAIk7H,SAAS4C,GACvBnC,KAAM37H,GAAI27H,KACV/tN,KAAMoyF,GAAIpyF,KACV4uN,MAAOx8H,GAAIw8H,MACXE,QAAS18H,GAAI08H,QACbD,OAAQz8H,GAAIy8H,OACZtC,aAAcn6H,GAAIm6H,aAAa2D,GAC/BpgH,OAAQ1d,GAAI0d,OAAOogH,GACnBjB,QAAS78H,GAAI68H,QAAQiB,GACrBnqH,MAAO3T,GAAI2T,MACXonH,aAAc/6H,GAAI+6H,aAAa+C,GAC/BL,kBAAmBz9H,GAAIy9H,kBAAkBK,KAG/C,CC1C8Bl2O,OAAOP,KAAKgyO,IAA9B,MA4FC2E,GAAgBH,GA1FC,CAC5B9kC,IAAK,MACLohC,aAAc,CACZwC,MAAO,EACPrD,KAAM,GAERyC,UAAW,OACX52N,OAAQ,OACR84N,WAAY,eACZ7D,YAAa,QACb1iC,MAAO,OACPH,MAAO,OACPqlC,cAAe,KACfsB,yBAA0B,OAC1BrD,OAAQxB,GACRtsJ,WAAY,KACZq8F,WAAY,uHACZ+0D,oBAAqB,iGACrBpD,aAAc,OACdqD,sBAAsB,EACtBC,WAAY,UACZjD,gBAAiB,CACf1wN,KAAM,SACNg0D,GAAI,OACJmkI,IAAK,IAEPy7B,QAAS,CACP5lK,GAAI,8DACJ6lK,GAAI,8GACJjnJ,GAAI,gHACJgO,GAAI,gHACJk5I,GAAI,iHAENC,UAAW,CACT/lK,GAAI,GACJ6lK,GAAI,GACJjnJ,GAAI,GACJgO,GAAI,GACJk5I,GAAI,IAEN9gH,OAAQ,CACNhlD,GAAI,EACJ6lK,GAAI,EACJjnJ,GAAI,EACJgO,GAAI,GACJk5I,GAAI,IAENE,QAAS,CACPhmK,GAAI,GACJ6lK,GAAI,GACJjnJ,GAAI,GACJgO,GAAI,GACJk5I,GAAI,IAENlC,YAAa,CACX5jK,GAAI,IACJ6lK,GAAI,IACJjnJ,GAAI,IACJgO,GAAI,KACJk5I,GAAI,MAENG,SAAU,CACRv1D,WAAY,uHACZv8F,WAAY,IACZsuI,MAAO,CACLyjB,GAAI,CAAElpH,SAAU,GAAI3oC,WAAY,IAAKF,gBAAY,GACjDgyJ,GAAI,CAAEnpH,SAAU,GAAI3oC,WAAY,KAAMF,gBAAY,GAClDiyJ,GAAI,CAAEppH,SAAU,GAAI3oC,WAAY,IAAKF,gBAAY,GACjDkyJ,GAAI,CAAErpH,SAAU,GAAI3oC,WAAY,KAAMF,gBAAY,GAClDmyJ,GAAI,CAAEtpH,SAAU,GAAI3oC,WAAY,IAAKF,gBAAY,GACjDoyJ,GAAI,CAAEvpH,SAAU,GAAI3oC,WAAY,IAAKF,gBAAY,KAGrDw2C,MAAO,GACP67G,WAAY,GACZC,aAAc,CAAEnqC,UAAW,mBAC3BoqC,YAAa,KACbC,kBAAc,EACdrD,gBAAiB,CACfp3D,OAASniE,IAAK,CACZ68H,cAAe,EACfC,QAAS,aAAa98H,EAAMo4H,OAAOp4H,EAAMs4H,cAAoC,SAAtBt4H,EAAM23H,YAAyB,EAAI,OAE5F6B,YAAaA,KAAA,CAASsD,QAAS,SAC/BC,YAAc/8H,IAAK,CACjB88H,QAAS,OACTE,YAAah9H,EAAMo4H,OAAOp4H,EAAMs4H,cAA4C,kBAAvBt4H,EAAM03H,aAA4B13H,EAAM03H,aAAa13H,EAAM23H,aAAe33H,EAAM03H,mBC1F3I,IAAIP,GAAYhyO,OAAOmC,eACnB4zO,GAAa/1O,OAAOu/E,iBACpBy2J,GAAoBh2O,OAAOmvJ,0BAC3B8iF,GAAsBjyO,OAAOqC,sBAC7B6vO,GAAelyO,OAAOC,UAAUE,eAChCgyO,GAAenyO,OAAOC,UAAUmyO,qBAChCC,GAAkBA,CAAC1yJ,EAAKt/E,EAAK2K,IAAU3K,KAAOs/E,EAAMqyJ,GAAUryJ,EAAKt/E,EAAK,CAAEi/D,YAAY,EAAM0hB,cAAc,EAAMs9C,UAAU,EAAMtzH,UAAW20E,EAAIt/E,GAAO2K,EACtJsnO,GAAiBA,CAAClzO,EAAGC,KACvB,IAAK,IAAI0jN,KAAQ1jN,IAAMA,EAAI,IACrB6yO,GAAa9xO,KAAKf,EAAG0jN,IACvBsvB,GAAgBjzO,EAAG2jN,EAAM1jN,EAAE0jN,IAC/B,GAAIkvB,GACF,IAAK,IAAIlvB,KAAQkvB,GAAoB5yO,GAC/B8yO,GAAa/xO,KAAKf,EAAG0jN,IACvBsvB,GAAgBjzO,EAAG2jN,EAAM1jN,EAAE0jN,IAEjC,OAAO3jN,CAAC,EAEN+2O,GAAgBA,CAAC/2O,EAAGC,IAAM02O,GAAW32O,EAAG42O,GAAkB32O,IAGvD,SAASy4O,GAAYriH,GAAY,IAAX,MAAE5a,GAAO4a,EACpC,OAAuB7nH,EAAAA,cAAoBujO,GAAQ,CACjDn0D,OAAQ,CACN,yBAA0B,CACxB+6D,UAAW,cAEbp9H,KAAM,CACJ63H,YAAmC,SAAtB33H,EAAM23H,YAAyB,OAAS,SAEvDhmM,KAAM2pM,GAAc7D,GAAe,GAAIz3H,EAAMz5D,GAAG4yL,cAAe,CAC7D7rO,gBAAuC,SAAtB0yG,EAAM23H,YAAyB33H,EAAMo4H,OAAOvB,KAAK,GAAK72H,EAAMi1F,MAC7Ej0I,MAA6B,SAAtBg/C,EAAM23H,YAAyB33H,EAAMo4H,OAAOvB,KAAK,GAAK72H,EAAM80F,MACnExqH,WAAY01B,EAAM11B,WAClB2oC,SAAUjT,EAAMg8H,UAAUnnJ,GAC1BsoJ,oBAAqB,cACrBC,oBAAqB,gBAI7B,CCtCA,SAASC,GAAoBC,EAAW5kB,EAAOlyN,GAC7CrB,OAAOP,KAAK8zN,GAAO3mN,SAASoZ,IAC1BmyN,EAAU,aAAa92O,KAAQ2kB,KAAiC,kBAAhButM,EAAMvtM,GAAqB,GAAGutM,EAAMvtM,OAAYutM,EAAMvtM,EAAK,GAE/G,CACO,SAASoyN,GAAmB3iH,GAAY,IAAX,MAAE5a,GAAO4a,EAC3C,MAAM0iH,EAAY,CAChB,wBAAyBt9H,EAAMi1F,MAC/B,wBAAyBj1F,EAAM80F,MAC/B,uCAAwC90F,EAAMy7H,yBAC9C,wBAAyB,GAAGz7H,EAAM11B,aAClC,wBAAyB01B,EAAM2mE,WAC/B,kCAAmC3mE,EAAM07H,oBACzC,iCAAkC17H,EAAMk8H,SAASv1D,WACjD,gCAAiC,GAAG3mE,EAAMk8H,SAAS9xJ,cAErDizJ,GAAoBC,EAAWt9H,EAAM67H,QAAS,UAC9CwB,GAAoBC,EAAWt9H,EAAMg8H,UAAW,aAChDqB,GAAoBC,EAAWt9H,EAAMib,OAAQ,UAC7CoiH,GAAoBC,EAAWt9H,EAAMi8H,QAAS,WAC9C92O,OAAOP,KAAKo7G,EAAMo4H,QAAQrmO,SAASivD,IACjCg/C,EAAMo4H,OAAOp3K,GAAOjvD,SAAQ,CAAC+lO,EAAOpzN,KAClC44N,EAAU,mBAAmBt8K,KAASt8C,KAAWozN,CAAK,GACtD,IAEJ,MAAMoE,EAAWl8H,EAAMk8H,SAASxjB,MAKhC,OAJAvzN,OAAOP,KAAKs3O,GAAUnqO,SAASyrO,IAC7BF,EAAU,aAAaE,eAAuB,GAAGtB,EAASsB,GAASvqH,aACnEqqH,EAAU,aAAaE,iBAAyB,GAAGtB,EAASsB,GAASlzJ,YAAY,IAE5Dv3E,EAAAA,cAAoBujO,GAAQ,CACjDn0D,OAAQ,CACN,QAASm7D,IAGf,CCrCA,IAAInG,GAAYhyO,OAAOmC,eACnB4zO,GAAa/1O,OAAOu/E,iBACpBy2J,GAAoBh2O,OAAOmvJ,0BAC3B8iF,GAAsBjyO,OAAOqC,sBAC7B6vO,GAAelyO,OAAOC,UAAUE,eAChCgyO,GAAenyO,OAAOC,UAAUmyO,qBAChCC,GAAkBA,CAAC1yJ,EAAKt/E,EAAK2K,IAAU3K,KAAOs/E,EAAMqyJ,GAAUryJ,EAAKt/E,EAAK,CAAEi/D,YAAY,EAAM0hB,cAAc,EAAMs9C,UAAU,EAAMtzH,UAAW20E,EAAIt/E,GAAO2K,EACtJsnO,GAAiBA,CAAClzO,EAAGC,KACvB,IAAK,IAAI0jN,KAAQ1jN,IAAMA,EAAI,IACrB6yO,GAAa9xO,KAAKf,EAAG0jN,IACvBsvB,GAAgBjzO,EAAG2jN,EAAM1jN,EAAE0jN,IAC/B,GAAIkvB,GACF,IAAK,IAAIlvB,KAAQkvB,GAAoB5yO,GAC/B8yO,GAAa/xO,KAAKf,EAAG0jN,IACvBsvB,GAAgBjzO,EAAG2jN,EAAM1jN,EAAE0jN,IAEjC,OAAO3jN,CAAC,EAEN+2O,GAAgBA,CAAC/2O,EAAGC,IAAM02O,GAAW32O,EAAG42O,GAAkB32O,IA0BvD,SAASi5O,GAAwBC,EAAcC,GACpD,OAAOvC,GAzBF,SAAoBsC,EAAcC,GACvC,IAAKA,EACH,OAAOD,EAET,MAAMtoO,EAASjQ,OAAOP,KAAK84O,GAAcnoN,QAAO,CAACqoN,EAAKp4O,KACpD,GAAY,aAARA,GAAsBm4O,EAAczB,SAAU,CAChD,MAAMxjB,EAAQilB,EAAczB,SAASxjB,MAAQvzN,OAAOP,KAAK84O,EAAaxB,SAASxjB,OAAOnjM,QAAO,CAACsoN,EAAalxO,KACzGkxO,EAAYlxO,GAAK8qO,GAAeA,GAAe,GAAIiG,EAAaxB,SAASxjB,MAAM/rN,IAAKgxO,EAAczB,SAASxjB,MAAM/rN,IAC1GkxO,IACN,IAAMH,EAAaxB,SAASxjB,MAC/B,OAAO4iB,GAAc7D,GAAe,GAAImG,GAAM,CAC5C1B,SAAUZ,GAAc7D,GAAeA,GAAe,GAAIiG,EAAaxB,UAAWyB,EAAczB,UAAW,CACzGxjB,WAGV,CAEI,OADAklB,EAAIp4O,GAAqC,kBAAvBm4O,EAAcn4O,GAAoBiyO,GAAeA,GAAe,GAAIiG,EAAal4O,IAAOm4O,EAAcn4O,IAAsC,kBAAvBm4O,EAAcn4O,IAAmD,mBAAvBm4O,EAAcn4O,IAAoD,oBAAvBm4O,EAAcn4O,GAAsBm4O,EAAcn4O,GAAOm4O,EAAcn4O,IAAQk4O,EAAal4O,GACjTo4O,CAAG,GACT,IACH,KAAMxoO,EAAOkjO,gBAAgBljO,EAAOgjO,QAClC,MAAM,IAAIviO,MAAM,yJAElB,OAAOT,CACT,CAEyB0oO,CAAWJ,EAAcC,GAClD,CC9CO,SAASI,GAAYlxO,GAC1B,OAAO1H,OAAOP,KAAKiI,GAAO0oB,QAAO,CAACqoN,EAAKp4O,UAClB,IAAfqH,EAAMrH,KACRo4O,EAAIp4O,GAAOqH,EAAMrH,IAEZo4O,IACN,GACL,CCLA,MAAMz7D,GAAS,CACbriE,KAAM,CACJ6mE,WAAY,aACZr8F,WAAY,OACZ0zJ,eAAgB,QAElBrsM,KAAM,CACJy+J,OAAQ,GAEV,yEAA0E,CACxEp9F,QAAS,SAEXmpI,GAAI,CACFlpH,SAAU,OAEZtuF,GAAI,CACFu4M,UAAW,cACXvvO,OAAQ,EACRu2F,SAAU,WAEZ+5I,IAAK,CACHt3D,WAAY,uBACZ1zD,SAAU,OAEZ1uH,EAAG,CACDq6D,WAAY,cACZs/K,mBAAoB,WAEtB,oBAAqB,CACnBC,aAAc,GAEhB,cAAe,CACbC,aAAc,OACdlrC,eAAgB,aAElB,YAAa,CACX9oH,WAAY,UAEd,kBAAmB,CACjBu8F,WAAY,uBACZ1zD,SAAU,OAEZorH,IAAK,CACHrrC,UAAW,UAEbsrC,KAAM,CACJhxO,gBAAiB,OACjB0zD,MAAO,QAETu9K,MAAO,CACLtrH,SAAU,OAEZ,WAAY,CACVA,SAAU,MACV3oC,WAAY,EACZ/8E,SAAU,WACVixO,cAAe,YAEjBz1B,IAAK,CACHv7M,IAAK,UAEPs7M,IAAK,CACH97I,OAAQ,WAEV,eAAgB,CACdgmC,QAAS,gBAEX,wBAAyB,CACvBA,QAAS,OACTrlG,OAAQ,GAEVq+E,IAAK,CACHyyJ,YAAa,OACbD,cAAe,UAEjB,iBAAkB,CAChBt6I,SAAU,UAEZ,4CAA6C,CAC3CyiF,WAAY,aACZ1zD,SAAU,OACV3oC,WAAY,OACZ8lH,OAAQ,GAEV,gBAAiB,CACflsG,SAAU,WAEZ,iBAAkB,CAChBw6I,cAAe,QAEjB,sCAAuC,CACrCC,iBAAkB,UAEpB,6HAA8H,CAC5HF,YAAa,OACbvrH,QAAS,GAEX,iHAAkH,CAChH4pH,QAAS,yBAEX8B,OAAQ,CACN1B,UAAW,aACXl8K,MAAO,UACPgyC,QAAS,QACT6rI,SAAU,OACV3rH,QAAS,EACTygF,WAAY,UAEdtiD,SAAU,CACRr+C,QAAS,eACTwrI,cAAe,YAEjBM,SAAU,CACR56I,SAAU,QAEZ,gCAAiC,CAC/Bg5I,UAAW,aACXhqH,QAAS,GAEX,qFAAsF,CACpFvlH,OAAQ,QAEV,gBAAiB,CACfoxO,WAAY,QAEd,wFAAyF,CACvFA,WAAY,QAEd,+BAAgC,CAC9BA,WAAY,SACZC,KAAM,WAER,gBAAiB,CACfhsI,QAAS,SAEXisI,QAAS,CACPjsI,QAAS,aAEXopB,OAAQ,CACNppB,QAAS,gBAEX0L,SAAU,CACR1L,QAAS,QAEX,WAAY,CACVA,QAAS,SAGN,SAASksI,KACd,OAAuBnsO,EAAAA,cAAoBujO,GAAQ,CACjDn0D,OAAAA,IAEJ,CC1JA,IAAIg1D,GAAYhyO,OAAOmC,eACnB8vO,GAAsBjyO,OAAOqC,sBAC7B6vO,GAAelyO,OAAOC,UAAUE,eAChCgyO,GAAenyO,OAAOC,UAAUmyO,qBAChCC,GAAkBA,CAAC1yJ,EAAKt/E,EAAK2K,IAAU3K,KAAOs/E,EAAMqyJ,GAAUryJ,EAAKt/E,EAAK,CAAEi/D,YAAY,EAAM0hB,cAAc,EAAMs9C,UAAU,EAAMtzH,UAAW20E,EAAIt/E,GAAO2K,EACtJsnO,GAAiBA,CAAClzO,EAAGC,KACvB,IAAK,IAAI0jN,KAAQ1jN,IAAMA,EAAI,IACrB6yO,GAAa9xO,KAAKf,EAAG0jN,IACvBsvB,GAAgBjzO,EAAG2jN,EAAM1jN,EAAE0jN,IAC/B,GAAIkvB,GACF,IAAK,IAAIlvB,KAAQkvB,GAAoB5yO,GAC/B8yO,GAAa/xO,KAAKf,EAAG0jN,IACvBsvB,GAAgBjzO,EAAG2jN,EAAM1jN,EAAE0jN,IAEjC,OAAO3jN,CAAC,EAUV,MAAM46O,IAAyB1hH,EAAAA,EAAAA,eAAc,CAC3Czd,MAAOu7H,KAEF,SAAS6D,KACd,IAAI35K,EACJ,OAAqD,OAA5CA,GAAK+lC,EAAAA,EAAAA,YAAW2zI,UAAmC,EAAS15K,EAAGu6C,QAAUu7H,EACpF,CAeO,SAAS8D,KACd,IAAI55K,EACJ,OAAoD,OAA5CA,GAAK+lC,EAAAA,EAAAA,YAAW2zI,UAAmC,EAAS15K,EAAG65K,YACzE,CACO,SAASC,GAAyBt4O,EAAWlB,EAAc8G,GAChE,IAAI44D,EACJ,MAAMu6C,EAAQo/H,KACRI,EAA4D,OAArC/5K,EAAKu6C,EAAMy8H,WAAWx1O,SAAsB,EAASw+D,EAAG1/D,aAC/E05O,EAA8C,oBAAxBD,EAAqCA,EAAoBx/H,GAASw/H,EAC9F,OAAO/H,GAAeA,GAAeA,GAAe,GAAI1xO,GAAe05O,GAAe1B,GAAYlxO,GACpG,CACO,SAAS6yO,GAAe9kH,GAQ5B,IAR6B,MAC9B5a,EAAK,aACLs/H,EAAY,iBACZK,GAAmB,EAAK,iBACxBC,GAAmB,EAAK,iBACxBC,GAAmB,EAAK,QACxBhsC,GAAU,EAAK,SACflsH,GACDizC,EACC,MAAMxV,GAAM5Z,EAAAA,EAAAA,YAAW2zI,IACjBW,EAAcrC,GAAwBlC,GAAe1nC,EAAU4jC,GAAeA,GAAe,GAAIryH,EAAIpF,OAAQA,GAASA,GAC5H,OAAuBjtG,EAAAA,cAAoBwiO,GAAe,CACxDv1H,MAAO8/H,GACU/sO,EAAAA,cAAoBosO,GAAuBvhH,SAAU,CACtEztH,MAAO,CAAE6vG,MAAO8/H,EAAaR,iBAC5BK,GAAoC5sO,EAAAA,cAAoBmsO,GAAc,MAAOU,GAAoC7sO,EAAAA,cAAoBkqO,GAAc,CACpJj9H,MAAO8/H,IACLD,GAAoC9sO,EAAAA,cAAoBwqO,GAAqB,CAC/Ev9H,MAAO8/H,IAC+B,oBAA7BA,EAAYlD,cAA+C7pO,EAAAA,cAAoBujO,GAAQ,CAChGn0D,OAAQ29D,EAAYlD,aAAakD,KAC/Bn4J,GACN,CC9EA,SAASo4J,GAAMC,GACd,IAAIr0O,EAAGwH,EAAGyhN,EAAI,GAEd,GAAmB,kBAARorB,GAAmC,kBAARA,EACrCprB,GAAOorB,OACD,GAAmB,kBAARA,EACjB,GAAIn7O,MAAMC,QAAQk7O,GACjB,IAAKr0O,EAAE,EAAGA,EAAIq0O,EAAIt7O,OAAQiH,IACrBq0O,EAAIr0O,KACHwH,EAAI4sO,GAAMC,EAAIr0O,OACjBipN,IAAQA,GAAO,KACfA,GAAOzhN,QAKV,IAAKxH,KAAKq0O,EACLA,EAAIr0O,KACPipN,IAAQA,GAAO,KACfA,GAAOjpN,GAMX,OAAOipN,CACR,CAEe,SAAS,KAEvB,IADA,IAASqrB,EAAK/sO,EAAVvO,EAAE,EAAWiwN,EAAI,GACdjwN,EAAIgC,UAAUjC,SAChBu7O,EAAMt5O,UAAUhC,QACfuO,EAAI6sO,GAAME,MACbrrB,IAAQA,GAAO,KACfA,GAAO1hN,GAIV,OAAO0hN,CACR,CDwCA8qB,GAAgB15O,YAAc,gCE9ElB,MAACk6O,GAA6BlP,GAAY,CAAExrO,IAAK,UAAW8qH,SAAS,ICDjF,IAAI6mH,GAAYhyO,OAAOmC,eACnB8vO,GAAsBjyO,OAAOqC,sBAC7B6vO,GAAelyO,OAAOC,UAAUE,eAChCgyO,GAAenyO,OAAOC,UAAUmyO,qBAChCC,GAAkBA,CAAC1yJ,EAAKt/E,EAAK2K,IAAU3K,KAAOs/E,EAAMqyJ,GAAUryJ,EAAKt/E,EAAK,CAAEi/D,YAAY,EAAM0hB,cAAc,EAAMs9C,UAAU,EAAMtzH,UAAW20E,EAAIt/E,GAAO2K,EAiB1J,MAAMgwO,GAAkB,MACxB,SAASC,GAAOjnB,GACd,IAAI/sN,EACJ,GAAoB,IAAhB+sN,EAAKz0N,OACP,MAAO,CAAEy0N,OAAM/sN,OAEjB,MAAO4lO,GAAO7Y,EACd,KAAM6Y,aAAe7sO,QACnB,MAAO,CAAEg0N,OAAM/sN,OAEjB,KAAM+zO,MAAmBnO,GACvB,MAAO,CAAE7Y,OAAM/sN,OAEjBA,EAAM4lO,EAAImO,IACV,MAAME,EA9Ba5I,EAAClzO,EAAGC,KACvB,IAAK,IAAI0jN,KAAQ1jN,IAAMA,EAAI,IACrB6yO,GAAa9xO,KAAKf,EAAG0jN,IACvBsvB,GAAgBjzO,EAAG2jN,EAAM1jN,EAAE0jN,IAC/B,GAAIkvB,GACF,IAAK,IAAIlvB,KAAQkvB,GAAoB5yO,GAC/B8yO,GAAa/xO,KAAKf,EAAG0jN,IACvBsvB,GAAgBjzO,EAAG2jN,EAAM1jN,EAAE0jN,IAEjC,OAAO3jN,CAAC,EAqBQkzO,CAAe,GAAIzF,GAEnC,cADOqO,EAAQF,IACR,CAAEhnB,KAAM,CAACknB,GAAUj0O,MAC5B,CACY,MAAGk0O,WAAAA,IAoBN,CAAEA,WAXT,SAAqB9vO,GACnB,MAAM,MAAEykD,GAAUzkD,EACZqlO,EAAM,WAAe,QAAAxwH,EAAA1+G,UAAAjC,OAAXy9K,EAAM,IAAAt9K,MAAAwgH,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAN68D,EAAM78D,GAAA3+G,UAAA2+G,GACpB,MAAM,IAAEl5G,EAAG,KAAE+sN,GAASinB,GAAOj+D,GACvByvD,EAAa6C,GAAgBtb,EAAMlkK,EAAM68K,YAE/C,OADAU,GAAav9K,EAAO28K,GAAY,GACzB,GAAG38K,EAAMzvD,OAAOosO,EAAWprO,YAAe,IAAR4F,EAAiB,GAAK,IAAIA,KACzE,EAEI,MAAO,CAAEypO,MAAK0K,GADH,mBAAAh7H,EAAA5+G,UAAAjC,OAAIy0N,EAAI,IAAAt0N,MAAA0gH,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAJ2zG,EAAI3zG,GAAA7+G,UAAA6+G,GAAA,OAhBrB,SAAessH,EAAY+D,EAAK/qH,GAC9B,MAAMqnH,EAAmB,GACnBE,EAAeH,GAAoBJ,EAAYK,EAAkBrnH,GACvE,OAAIqnH,EAAiBztO,OAAS,EACrBomH,EAEFunH,EAAewD,EAAI1D,EAC9B,CAS4B70H,CAAMroD,EAAM68K,WAAY+D,EAAK2K,GAAKrnB,GAAM,EAEpE,GAGO,SAASsnB,KACd,MAAMxrL,EC3DQoqL,MACEa,GD2DhB,OE9DK,SAA2B35L,EAAI8kD,GACpC,MAAMj/F,GAAMy/F,EAAAA,EAAAA,UAOZ,QANKz/F,EAAIW,SAAWs+F,EAAK3mG,SAAW0H,EAAIW,QAAQ2zO,SAASh8O,QAAU0H,EAAIW,QAAQ2zO,SAASxyN,KAAI,CAACR,EAAG/oB,IAAM+oB,IAAM29E,EAAK1mG,KAAImM,SAAQ,IAAU,KACrI1E,EAAIW,QAAU,CACZ2gB,EAAG64B,IACHm6L,SAAU,IAAIr1I,KAGXj/F,EAAIW,QAAQ2gB,CACrB,CFqDSizN,EAAkB,IAAML,GAAW,CAAErrL,WAAU,CAACA,GACzD,CGhEO,SAAS2rL,GAAehmH,GAO5B,IAP6B,GAC9B2lH,EAAE,QACFM,EAAO,QACPh4O,EAAO,WACPupO,EAAU,KACV5rO,EAAI,MACJyuD,GACD2lE,EACC,MAAMkmH,EAAoBj4O,EAAQ0sB,QAAO,CAACqoN,EAAKnsC,KAC7CtsM,OAAOP,KAAK6sM,EAAK2gC,YAAYrgO,SAASvM,IACZ,kBAAbo4O,EAAIp4O,GACbo4O,EAAIp4O,GAAO,GAAGisM,EAAK2gC,WAAW5sO,KAE9Bo4O,EAAIp4O,GAAO,GAAGo4O,EAAIp4O,MAAQisM,EAAK2gC,WAAW5sO,IAClD,IAEWo4O,IACN,IACH,OAAOz4O,OAAOP,KAAKi8O,GAAStrN,QAAO,CAACqoN,EAAK9yH,KACvC8yH,EAAI9yH,GAAay1H,EAAGM,EAAQ/1H,GAAYg2H,EAAkBh2H,GAA0B,MAAdsnH,GAAsBA,EAAWtnH,GAAYjmH,MAAMC,QAAQ0B,GAAQA,EAAKkZ,OAAOylG,SAASj3F,KAAKyN,GAAS,IAAa,MAATs5B,OAAgB,EAASA,EAAMzvD,MAAQ,aAAam2B,KAAQmvF,MAAal0G,KAAK,KAAOpQ,EAAO,IAAa,MAATyuD,OAAgB,EAASA,EAAMzvD,MAAQ,aAAagB,KAAQskH,IAAc,MACnV8yH,IACN,GACL,CCtBA,IAAIzG,GAAYhyO,OAAOmC,eACnB8vO,GAAsBjyO,OAAOqC,sBAC7B6vO,GAAelyO,OAAOC,UAAUE,eAChCgyO,GAAenyO,OAAOC,UAAUmyO,qBAChCC,GAAkBA,CAAC1yJ,EAAKt/E,EAAK2K,IAAU3K,KAAOs/E,EAAMqyJ,GAAUryJ,EAAKt/E,EAAK,CAAEi/D,YAAY,EAAM0hB,cAAc,EAAMs9C,UAAU,EAAMtzH,UAAW20E,EAAIt/E,GAAO2K,EACtJsnO,GAAiBA,CAAClzO,EAAGC,KACvB,IAAK,IAAI0jN,KAAQ1jN,IAAMA,EAAI,IACrB6yO,GAAa9xO,KAAKf,EAAG0jN,IACvBsvB,GAAgBjzO,EAAG2jN,EAAM1jN,EAAE0jN,IAC/B,GAAIkvB,GACF,IAAK,IAAIlvB,KAAQkvB,GAAoB5yO,GAC/B8yO,GAAa/xO,KAAKf,EAAG0jN,IACvBsvB,GAAgBjzO,EAAG2jN,EAAM1jN,EAAE0jN,IAEjC,OAAO3jN,CAAC,EASV,SAAS05H,GAAU8iH,GACjB,MAAO,iBAAiBA,GAAW,IACrC,CACA,SAASC,GAAU7+D,EAAQniE,EAAOxvG,GAChC,MAAMywO,EAAiBC,GAA2C,oBAAlBA,EAA+BA,EAAclhI,EAAOxvG,GAAU,IAAM0wO,GAAiB,GACrI,OAAIr8O,MAAMC,QAAQq9K,GACTA,EAAOj0J,KAAKujL,GAASwvC,EAAcxvC,EAAKtvB,UAAS5sJ,QAAO,CAACqoN,EAAKnsC,KACnEtsM,OAAOP,KAAK6sM,GAAM1/L,SAASvM,IACpBo4O,EAAIp4O,GAGPo4O,EAAIp4O,GAAOiyO,GAAeA,GAAe,GAAImG,EAAIp4O,IAAOisM,EAAKjsM,IAF7Do4O,EAAIp4O,GAAOiyO,GAAe,GAAIhmC,EAAKjsM,GAG7C,IAEao4O,IACN,IAEEqD,EAAc9+D,EACvB,CACO,SAASg/D,GAAal1J,GAC3B,MAAMm1J,EAAgC,oBAAVn1J,EAAuBA,EAAQ,IAAMA,EA0BjE,OAzBA,SAAmBz7E,EAAQwE,GACzB,MAAMgrG,EAAQo/H,KACRv2O,EPfH,SAAkC5B,GACvC,MAAM+4G,EAAQo/H,KACR4B,EAAax6O,IACjB,IAAIi/D,EAAI47K,EACR,MAAO,CACLl/D,QAA0C,OAAhC18G,EAAKu6C,EAAMy8H,WAAWj2O,SAAiB,EAASi/D,EAAG08G,SAAW,GACxEiwD,YAA8C,OAAhCiP,EAAKrhI,EAAMy8H,WAAWj2O,SAAiB,EAAS66O,EAAGjP,aAAe,GACjF,EAEH,OAAIvtO,MAAMC,QAAQmC,GACTA,EAAUinB,IAAI8yN,GAEhB,CAACA,EAAU/5O,GACpB,COEoBq6O,CAAoC,MAAXtsO,OAAkB,EAASA,EAAQxO,MACtEyuD,EAAQoqL,MACR,IAAExJ,EAAG,GAAE0K,GAAOE,KACdc,EAAYH,EAAaphI,EAAOxvG,EAAQytH,IACxCujH,EAAkBR,GAAqB,MAAXhsO,OAAkB,EAASA,EAAQmtK,OAAQniE,EAAOxvG,GAC9EixO,EAAiBT,GAAUn4O,EAASm3G,EAAOxvG,GAC3CqwO,EAAU17O,OAAOu8O,YAAYv8O,OAAOP,KAAK28O,GAAWrzN,KAAK1oB,GAEtD,CAACA,EADa+6O,EAAG,CAAE,CAAC1K,EAAI0L,EAAU/7O,OAAqB,MAAXwP,OAAkB,EAASA,EAAQ2sO,WAAa9L,EAAI4L,EAAej8O,IAAOqwO,EAAI2L,EAAgBh8O,SAGnJ,MAAO,CACLq7O,QAASD,GAAgB,CACvBL,KACAM,UACAh4O,UACAupO,WAAuB,MAAXp9N,OAAkB,EAASA,EAAQo9N,WAC/C5rO,KAAiB,MAAXwO,OAAkB,EAASA,EAAQxO,KACzCyuD,UAEFsrL,KACAvgI,QAEN,CAEA,UCrEemhI,IAAa,CAACnhI,EAAK4a,KAAA,IAAE,MAAEgnH,EAAK,KAAEz2N,EAAI,MAAEutM,GAAO99F,EAAA,MAAM,CAC9D27E,KAAM,CACJ5F,YAAa3wF,EAAMi8H,QAAQpnJ,GAC3B+7G,aAAc5wF,EAAMi8H,QAAQpnJ,GAC5BgqJ,SAAU+C,EAAQ,OAAS5hI,EAAMz5D,GAAGp7B,KAAK,CAAEA,OAAMutM,UACjD9mB,WAAY,OACZ5gF,YAAa,QAEhB,ICTD,IAAIomH,GAAsBjyO,OAAOqC,sBAC7B6vO,GAAelyO,OAAOC,UAAUE,eAChCgyO,GAAenyO,OAAOC,UAAUmyO,qBAc7B,SAASsK,GAAoBC,GAClC,MAAMr8K,EAAKq8K,GAAQ,EACjB/1O,EAAC,GACDg2O,EAAE,GACFC,EAAE,GACFtsN,EAAE,GACFuyD,EAAE,GACF8vB,EAAE,GACF9yE,EAAE,EACF94B,EAAC,GACD81O,EAAE,GACFC,EAAE,GACFvsN,EAAE,GACF+yD,EAAE,GACFwvB,EAAE,GACFhzE,EAAE,GACFg9D,EAAE,EACF11F,EAAC,QACD+9E,EAAO,GACPoU,EAAE,GACFwjJ,EAAE,GACFC,EAAE,IACFC,EAAG,GACHlrL,EAAE,GACFwwC,EAAE,GACF26I,EAAE,GACFnyN,EAAE,GACFsmE,EAAE,EACFl4E,EAAC,IACDgkO,EAAG,IACHC,EAAG71O,EACHA,EAAC,IACD81O,EAAG,IACHC,EAAG,KACHC,EAAI,IACJC,EAAG,IACHC,EAAG,IACHC,EAAG,IACHpjL,EAAG,IACHlyD,EAAG,KACHC,EAAI,OACJu/D,EAAM,MACN5F,EAAK,MACL27K,EAAK,QACL/vI,GACEvtC,EAAIw9J,EA1DM+f,EAACh+O,EAAQi+O,KACvB,IAAIt2J,EAAS,GACb,IAAK,IAAIu7H,KAAQljN,EACXqyO,GAAa9xO,KAAKP,EAAQkjN,IAAS+6B,EAAQnyO,QAAQo3M,GAAQ,IAC7Dv7H,EAAOu7H,GAAQljN,EAAOkjN,IAC1B,GAAc,MAAVljN,GAAkBoyO,GACpB,IAAK,IAAIlvB,KAAQkvB,GAAoBpyO,GAC/Bi+O,EAAQnyO,QAAQo3M,GAAQ,GAAKovB,GAAa/xO,KAAKP,EAAQkjN,KACzDv7H,EAAOu7H,GAAQljN,EAAOkjN,IAE5B,OAAOv7H,CAAM,EAgDEq2J,CAAUv9K,EAAI,CAC3B,IACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,UACA,KACA,KACA,KACA,MACA,KACA,KACA,KACA,KACA,KACA,IACA,MACA,MACA,IACA,MACA,MACA,OACA,MACA,MACA,MACA,MACA,MACA,OACA,SACA,QACA,QACA,YA+CF,MAAO,CAAEy9K,aA7CYnF,GAAY,CAC/BhyO,IACAg2O,KACAC,KACAtsN,KACAuyD,KACA8vB,KACA9yE,KACA94B,IACA81O,KACAC,KACAvsN,KACA+yD,KACAwvB,KACAhzE,KACAg9D,KACA11F,IACA+9E,UACAoU,KACAwjJ,KACAC,KACAC,MACAlrL,KACAwwC,KACA26I,KA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","sources":["../node_modules/fast-deep-equal/index.js","../node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js","../node_modules/react/jsx-runtime.js","../node_modules/axios/lib/axios.js","../node_modules/axios/lib/helpers/isURLSameOrigin.js","../node_modules/axios/index.js","../node_modules/react/cjs/react-jsx-runtime.production.min.js","../node_modules/axios/lib/helpers/combineURLs.js","../node_modules/react-snowfall/src/config.ts","../node_modules/axios/lib/adapters/xhr.js","../node_modules/react-is/index.js","../node_modules/axios/lib/helpers/normalizeHeaderName.js","../node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js","../node_modules/axios/lib/helpers/validator.js","../node_modules/hls.js/dist/node_modules/url-toolkit/src/url-toolkit.js","../node_modules/hls.js/dist/src/polyfills/number.ts","../node_modules/hls.js/dist/src/events.ts","../node_modules/hls.js/dist/src/errors.ts","../node_modules/hls.js/dist/src/utils/logger.ts","../node_modules/hls.js/dist/src/utils/attr-list.ts","../node_modules/hls.js/dist/src/loader/date-range.ts","../node_modules/hls.js/dist/src/loader/load-stats.ts","../node_modules/hls.js/dist/src/loader/fragment.ts","../node_modules/hls.js/dist/src/loader/level-details.ts","../node_modules/hls.js/dist/src/utils/numeric-encoding-utils.ts","../node_modules/hls.js/dist/src/utils/keysystem-util.ts","../node_modules/hls.js/dist/src/utils/global.ts","../node_modules/hls.js/dist/src/utils/mediakeys-helper.ts","../node_modules/hls.js/dist/src/utils/typed-array.ts","../node_modules/hls.js/dist/src/demux/id3.ts","../node_modules/hls.js/dist/src/utils/hex.ts","../node_modules/hls.js/dist/src/utils/mp4-tools.ts","../node_modules/hls.js/dist/src/loader/level-key.ts","../node_modules/hls.js/dist/src/utils/variable-substitution.ts","../node_modules/hls.js/dist/src/utils/mediasource-helper.ts","../node_modules/hls.js/dist/src/utils/codecs.ts","../node_modules/hls.js/dist/src/loader/m3u8-parser.ts","../node_modules/hls.js/dist/src/types/loader.ts","../node_modules/hls.js/dist/src/loader/playlist-loader.ts","../node_modules/hls.js/dist/src/utils/texttrack-utils.ts","../node_modules/hls.js/dist/src/types/demuxer.ts","../node_modules/hls.js/dist/src/controller/id3-track-controller.ts","../node_modules/hls.js/dist/src/controller/latency-controller.ts","../node_modules/hls.js/dist/src/types/level.ts","../node_modules/hls.js/dist/src/utils/level-helper.ts","../node_modules/hls.js/dist/src/utils/error-helper.ts","../node_modules/hls.js/dist/src/utils/binary-search.ts","../node_modules/hls.js/dist/src/controller/fragment-finders.ts","../node_modules/hls.js/dist/src/controller/error-controller.ts","../node_modules/hls.js/dist/src/controller/base-playlist-controller.ts","../node_modules/hls.js/dist/src/utils/ewma.ts","../node_modules/hls.js/dist/src/utils/ewma-bandwidth-estimator.ts","../node_modules/hls.js/dist/src/utils/mediacapabilities-helper.ts","../node_modules/hls.js/dist/src/utils/rendition-helper.ts","../node_modules/hls.js/dist/src/controller/abr-controller.ts","../node_modules/hls.js/dist/src/utils/hdr.ts","../node_modules/hls.js/dist/src/task-loop.ts","../node_modules/hls.js/dist/src/controller/fragment-tracker.ts","../node_modules/hls.js/dist/src/utils/buffer-helper.ts","../node_modules/hls.js/dist/src/types/transmuxer.ts","../node_modules/hls.js/dist/src/utils/discontinuities.ts","../node_modules/hls.js/dist/src/loader/fragment-loader.ts","../node_modules/hls.js/dist/src/crypt/aes-crypto.ts","../node_modules/hls.js/dist/src/crypt/fast-aes-key.ts","../node_modules/hls.js/dist/src/crypt/aes-decryptor.ts","../node_modules/hls.js/dist/src/crypt/decrypter.ts","../node_modules/hls.js/dist/src/controller/base-stream-controller.ts","../node_modules/hls.js/dist/src/utils/time-ranges.ts","../node_modules/hls.js/dist/src/demux/chunk-cache.ts","../node_modules/hls.js/dist/src/demux/dummy-demuxed-track.ts","../node_modules/hls.js/dist/src/demux/audio/base-audio-demuxer.ts","../node_modules/hls.js/dist/src/demux/audio/adts.ts","../node_modules/hls.js/dist/src/demux/audio/mpegaudio.ts","../node_modules/hls.js/dist/src/demux/audio/aacdemuxer.ts","../node_modules/hls.js/dist/src/demux/mp4demuxer.ts","../node_modules/hls.js/dist/src/demux/audio/dolby.ts","../node_modules/hls.js/dist/src/demux/audio/ac3-demuxer.ts","../node_modules/hls.js/dist/src/demux/video/base-video-parser.ts","../node_modules/hls.js/dist/src/demux/video/exp-golomb.ts","../node_modules/hls.js/dist/src/demux/video/avc-video-parser.ts","../node_modules/hls.js/dist/src/demux/sample-aes.ts","../node_modules/hls.js/dist/src/demux/tsdemuxer.ts","../node_modules/hls.js/dist/src/demux/audio/mp3demuxer.ts","../node_modules/hls.js/dist/src/remux/aac-helper.ts","../node_modules/hls.js/dist/src/remux/mp4-generator.ts","../node_modules/hls.js/dist/src/utils/timescale-conversion.ts","../node_modules/hls.js/dist/src/remux/mp4-remuxer.ts","../node_modules/hls.js/dist/src/demux/transmuxer.ts","../node_modules/hls.js/dist/src/remux/passthrough-remuxer.ts","../node_modules/hls.js/dist/node_modules/eventemitter3/index.js","../node_modules/hls.js/dist/src/demux/transmuxer-worker.ts","../node_modules/hls.js/dist/src/demux/transmuxer-interface.ts","../node_modules/hls.js/dist/src/demux/inject-worker.ts","../node_modules/hls.js/dist/src/controller/audio-stream-controller.ts","../node_modules/hls.js/dist/src/utils/media-option-attributes.ts","../node_modules/hls.js/dist/src/controller/audio-track-controller.ts","../node_modules/hls.js/dist/src/controller/subtitle-stream-controller.ts","../node_modules/hls.js/dist/src/controller/subtitle-track-controller.ts","../node_modules/hls.js/dist/src/controller/buffer-operation-queue.ts","../node_modules/hls.js/dist/src/controller/buffer-controller.ts","../node_modules/hls.js/dist/src/utils/cea-608-parser.ts","../node_modules/hls.js/dist/src/utils/output-filter.ts","../node_modules/hls.js/dist/src/utils/vttcue.ts","../node_modules/hls.js/dist/src/utils/vttparser.ts","../node_modules/hls.js/dist/src/utils/webvtt-parser.ts","../node_modules/hls.js/dist/src/utils/imsc1-ttml-parser.ts","../node_modules/hls.js/dist/src/controller/timeline-controller.ts","../node_modules/hls.js/dist/src/controller/cap-level-controller.ts","../node_modules/hls.js/dist/src/controller/fps-controller.ts","../node_modules/hls.js/dist/src/controller/eme-controller.ts","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cta/CmObjectType.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cta/CmStreamingFormat.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/CmcdHeaderField.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/CmcdHeaderMap.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/SfItem.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/SfToken.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/utils/BARE_ITEM.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/utils/STRING_REGEX.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/serialize/serializeError.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/utils/throwError.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/serialize/serializeInteger.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/utils/isInvalidInt.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/utils/INTEGER.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/utils/roundToEven.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/serialize/serializeDecimal.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/utils/DECIMAL.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/serialize/serializeToken.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cta/utils/symbolToStr.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/utils/TOKEN.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/serialize/serializeBareItem.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/serialize/serializeString.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/utils/STRING.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/serialize/serializeBoolean.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/utils/BOOLEAN.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/serialize/serializeDate.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/serialize/serializeByteSequence.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/utils/BYTES.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/utils/base64encode.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/serialize/serializeKey.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/utils/KEY.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/serialize/serializeParams.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/serialize/serializeItem.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cta/utils/isTokenField.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/CmcdFormatters.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/utils/urlToRelativePath.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/encodeCmcd.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/encodeSfDict.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/serialize/serializeDict.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/utils/DICT.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/structuredfield/serialize/serializeInnerList.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/utils/processCmcd.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cta/utils/isValid.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/CMCD_PARAM.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/appendCmcdQuery.js","../node_modules/hls.js/dist/src/controller/cmcd-controller.ts","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/utils/uuid.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/appendCmcdHeaders.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/toCmcdHeaders.js","../node_modules/hls.js/dist/node_modules/@svta/common-media-library/dist/cmcd/toCmcdQuery.js","../node_modules/hls.js/dist/src/controller/content-steering-controller.ts","../node_modules/hls.js/dist/src/utils/xhr-loader.ts","../node_modules/hls.js/dist/src/utils/fetch-loader.ts","../node_modules/hls.js/dist/src/controller/level-controller.ts","../node_modules/hls.js/dist/src/utils/cues.ts","../node_modules/hls.js/dist/src/config.ts","../node_modules/hls.js/dist/src/loader/key-loader.ts","../node_modules/hls.js/dist/src/is-supported.ts","../node_modules/hls.js/dist/src/controller/gap-controller.ts","../node_modules/hls.js/dist/src/controller/stream-controller.ts","../node_modules/hls.js/dist/src/hls.ts","../node_modules/axios/lib/core/AxiosError.js","../node_modules/react-redux/node_modules/react-is/index.js","../node_modules/react-dom/cjs/react-dom.production.min.js","../node_modules/axios/lib/helpers/isAbsoluteURL.js","../node_modules/axios/lib/defaults/index.js","../node_modules/axios/lib/core/transformData.js","../node_modules/axios/lib/helpers/null.js","../node_modules/artplayer/dist/artplayer.js","../node_modules/axios/lib/helpers/parseHeaders.js","../node_modules/axios/lib/env/data.js","../node_modules/axios/lib/core/settle.js","../node_modules/react-snowfall/src/hooks.ts","../node_modules/axios/lib/helpers/parseProtocol.js","../node_modules/react-snowfall/src/Snowfall.tsx","../node_modules/react/cjs/react.production.min.js","../dashjs/webpack/universalModuleDefinition","../dashjs/externals/base64.js","../dashjs/externals/cea608-parser.js","../dashjs/index_mediaplayerOnly.js","../dashjs/src/core/Debug.js","../dashjs/src/core/EventBus.js","../dashjs/src/core/FactoryMaker.js","../dashjs/src/core/Settings.js","../dashjs/src/core/Utils.js","../dashjs/src/core/Version.js","../dashjs/src/core/errors/ErrorsBase.js","../dashjs/src/core/events/CoreEvents.js","../dashjs/src/core/events/Events.js","../dashjs/src/core/events/EventsBase.js","../dashjs/src/dash/DashHandler.js","../dashjs/src/dash/constants/DashConstants.js","../dashjs/src/dash/controllers/SegmentsController.js","../dashjs/src/dash/utils/ListSegmentsGetter.js","../dashjs/src/dash/utils/SegmentBaseGetter.js","../dashjs/src/dash/utils/SegmentsUtils.js","../dashjs/src/dash/utils/TemplateSegmentsGetter.js","../dashjs/src/dash/utils/TimelineSegmentsGetter.js","../dashjs/src/dash/vo/Segment.js","../dashjs/src/dash/vo/UTCTiming.js","../dashjs/src/streaming/controllers/PlaybackController.js","../dashjs/src/streaming/models/FragmentModel.js","../dashjs/src/core/errors/Errors.js","../dashjs/src/streaming/SourceBufferSink.js","../dashjs/src/streaming/PreBufferSink.js","../dashjs/src/streaming/utils/InitCache.js","../dashjs/src/streaming/controllers/BufferController.js","../dashjs/src/streaming/text/NotFragmentedTextBufferController.js","../dashjs/src/streaming/controllers/ScheduleController.js","../dashjs/src/dash/controllers/RepresentationController.js","../dashjs/src/streaming/vo/metrics/PlayList.js","../dashjs/src/streaming/utils/TimeUtils.js","../dashjs/src/streaming/StreamProcessor.js","../dashjs/src/streaming/vo/DataChunk.js","../dashjs/src/streaming/net/FetchLoader.js","../dashjs/src/dash/vo/Representation.js","../dashjs/src/dash/vo/AdaptationSet.js","../dashjs/src/dash/vo/Period.js","../dashjs/src/dash/vo/Mpd.js","../dashjs/src/dash/vo/Event.js","../dashjs/src/dash/vo/BaseURL.js","../dashjs/src/dash/vo/EventStream.js","../dashjs/src/dash/vo/ProducerReferenceTime.js","../dashjs/src/dash/vo/ContentSteering.js","../dashjs/src/dash/vo/DescriptorType.js","../dashjs/src/streaming/utils/ObjectUtils.js","../dashjs/src/dash/vo/MpdLocation.js","../dashjs/src/dash/vo/PatchLocation.js","../dashjs/src/dash/models/DashManifestModel.js","../dashjs/src/streaming/models/CmcdModel.js","../dashjs/src/streaming/models/CmsdModel.js","../dashjs/src/streaming/models/LowLatencyThroughputModel.js","../dashjs/src/streaming/net/HTTPLoader.js","../dashjs/src/streaming/net/SchemeLoaderFactory.js","../dashjs/src/streaming/net/URLLoader.js","../dashjs/src/streaming/vo/HeadRequest.js","../dashjs/src/streaming/FragmentLoader.js","../dashjs/src/streaming/utils/SegmentResponseModifier.js","../dashjs/src/streaming/controllers/FragmentController.js","../dashjs/src/streaming/vo/Thumbnail.js","../dashjs/src/streaming/vo/BitrateInfo.js","../dashjs/src/streaming/thumbnail/ThumbnailController.js","../dashjs/src/streaming/controllers/BlacklistController.js","../dashjs/src/streaming/Stream.js","../dashjs/src/dash/vo/ContentSteeringRequest.js","../dashjs/src/dash/vo/ContentSteeringResponse.js","../dashjs/src/dash/controllers/ContentSteeringController.js","../dashjs/src/streaming/utils/LocationSelector.js","../dashjs/src/streaming/ManifestUpdater.js","../dashjs/src/streaming/controllers/TimeSyncController.js","../dashjs/src/streaming/controllers/MediaSourceController.js","../dashjs/src/streaming/controllers/EventController.js","../dashjs/src/streaming/constants/ConformanceViolationConstants.js","../dashjs/src/streaming/controllers/StreamController.js","../dashjs/src/streaming/controllers/GapController.js","../dashjs/src/streaming/controllers/CatchupController.js","../dashjs/src/dash/controllers/ServiceDescriptionController.js","../dashjs/src/streaming/controllers/MediaController.js","../dashjs/src/streaming/models/BaseURLTreeModel.js","../dashjs/src/streaming/utils/baseUrlResolution/DVBSelector.js","../dashjs/src/streaming/utils/baseUrlResolution/BasicSelector.js","../dashjs/src/streaming/utils/baseUrlResolution/ContentSteeringSelector.js","../dashjs/src/streaming/utils/BaseURLSelector.js","../dashjs/src/streaming/controllers/BaseURLController.js","../dashjs/src/streaming/vo/TextRequest.js","../dashjs/src/streaming/XlinkLoader.js","../dashjs/externals/xml2json.js","../dashjs/src/streaming/controllers/XlinkController.js","../dashjs/src/dash/parser/objectiron.js","../dashjs/src/dash/parser/matchers/BaseMatcher.js","../dashjs/src/dash/parser/matchers/StringMatcher.js","../dashjs/src/dash/parser/matchers/DurationMatcher.js","../dashjs/src/dash/parser/matchers/DateTimeMatcher.js","../dashjs/src/dash/parser/matchers/NumericMatcher.js","../dashjs/src/dash/parser/matchers/LangMatcher.js","../dashjs/src/dash/parser/maps/CommonProperty.js","../dashjs/src/dash/parser/maps/MapNode.js","../dashjs/src/dash/parser/maps/RepresentationBaseValuesMap.js","../dashjs/src/dash/parser/maps/SegmentValuesMap.js","../dashjs/src/dash/parser/DashParser.js","../dashjs/src/streaming/ManifestLoader.js","../dashjs/src/streaming/utils/ErrorHandler.js","../dashjs/src/streaming/utils/CapabilitiesFilter.js","../dashjs/src/streaming/vo/URIFragmentData.js","../dashjs/src/streaming/models/URIFragmentModel.js","../dashjs/src/streaming/models/ManifestModel.js","../dashjs/src/streaming/models/MediaPlayerModel.js","../dashjs/src/streaming/rules/RulesContext.js","../dashjs/src/streaming/rules/SwitchRequestHistory.js","../dashjs/src/streaming/rules/DroppedFramesHistory.js","../dashjs/src/streaming/rules/ThroughputHistory.js","../dashjs/src/streaming/controllers/AbrController.js","../dashjs/src/streaming/models/VideoModel.js","../dashjs/src/streaming/utils/DOMStorage.js","../dashjs/src/dash/SegmentBaseLoader.js","../dashjs/src/streaming/utils/EBMLParser.js","../dashjs/src/dash/WebmSegmentBaseLoader.js","../dashjs/src/dash/controllers/SegmentBaseController.js","../dashjs/src/dash/vo/RepresentationInfo.js","../dashjs/src/dash/vo/MediaInfo.js","../dashjs/src/dash/vo/StreamInfo.js","../dashjs/src/dash/vo/ManifestInfo.js","../dashjs/src/dash/vo/SimpleXPath.js","../dashjs/src/dash/vo/PatchOperation.js","../dashjs/src/dash/models/PatchManifestModel.js","../dashjs/src/dash/DashAdapter.js","../dashjs/src/dash/utils/Round10.js","../dashjs/src/streaming/vo/MetricsList.js","../dashjs/src/streaming/vo/metrics/RepresentationSwitch.js","../dashjs/src/streaming/vo/metrics/BufferLevel.js","../dashjs/src/streaming/vo/metrics/BufferState.js","../dashjs/src/streaming/vo/metrics/DVRInfo.js","../dashjs/src/streaming/vo/metrics/DroppedFrames.js","../dashjs/src/streaming/vo/metrics/ManifestUpdate.js","../dashjs/src/streaming/vo/metrics/SchedulingInfo.js","../dashjs/src/streaming/vo/metrics/RequestsQueue.js","../dashjs/src/streaming/models/MetricsModel.js","../dashjs/src/dash/DashMetrics.js","../dashjs/src/dash/utils/TimelineConverter.js","../dashjs/src/streaming/vo/TextTrackInfo.js","../dashjs/src/streaming/text/EmbeddedTextHtmlRender.js","../dashjs/src/streaming/text/TextSourceBuffer.js","../dashjs/src/streaming/text/TextTracks.js","../dashjs/src/streaming/utils/VTTParser.js","../dashjs/src/streaming/utils/VttCustomRenderingParser.js","../dashjs/src/streaming/utils/TTMLParser.js","../dashjs/src/streaming/text/DVBFonts.js","../dashjs/src/streaming/text/TextController.js","../dashjs/src/streaming/MediaPlayer.js","../dashjs/src/streaming/MediaPlayerEvents.js","../dashjs/src/streaming/constants/Constants.js","../dashjs/src/streaming/constants/MetricsConstants.js","../dashjs/src/streaming/metrics/vo/DVBErrors.js","../dashjs/src/streaming/metrics/utils/DVBErrorsTranslator.js","../dashjs/src/streaming/metrics/controllers/RangeController.js","../dashjs/src/streaming/metrics/utils/MetricSerialiser.js","../dashjs/src/streaming/metrics/utils/RNG.js","../dashjs/src/streaming/metrics/reporting/reporters/DVBReporting.js","../dashjs/src/streaming/metrics/reporting/ReportingFactory.js","../dashjs/src/streaming/metrics/controllers/ReportingController.js","../dashjs/src/streaming/metrics/utils/HandlerHelpers.js","../dashjs/src/streaming/metrics/metrics/handlers/BufferLevelHandler.js","../dashjs/src/streaming/metrics/metrics/handlers/DVBErrorsHandler.js","../dashjs/src/streaming/metrics/metrics/handlers/HttpListHandler.js","../dashjs/src/streaming/metrics/metrics/handlers/GenericMetricHandler.js","../dashjs/src/streaming/metrics/metrics/MetricsHandlerFactory.js","../dashjs/src/streaming/metrics/controllers/MetricsHandlersController.js","../dashjs/src/streaming/metrics/controllers/MetricsController.js","../dashjs/src/streaming/metrics/vo/Metrics.js","../dashjs/src/streaming/metrics/vo/Range.js","../dashjs/src/streaming/metrics/vo/Reporting.js","../dashjs/src/streaming/metrics/utils/ManifestParsing.js","../dashjs/src/streaming/metrics/controllers/MetricsCollectionController.js","../dashjs/src/streaming/metrics/MetricsReporting.js","../dashjs/src/streaming/metrics/MetricsReportingEvents.js","../dashjs/src/streaming/models/CustomParametersModel.js","../dashjs/src/streaming/net/XHRLoader.js","../dashjs/src/streaming/protection/CommonEncryption.js","../dashjs/src/streaming/protection/vo/MediaCapability.js","../dashjs/src/streaming/protection/vo/KeySystemConfiguration.js","../dashjs/src/streaming/protection/errors/ProtectionErrors.js","../dashjs/src/streaming/protection/vo/LicenseRequest.js","../dashjs/src/streaming/protection/vo/LicenseResponse.js","../dashjs/src/streaming/protection/controllers/ProtectionController.js","../dashjs/src/streaming/protection/vo/KeyPair.js","../dashjs/src/streaming/protection/vo/ClearKeyKeySet.js","../dashjs/src/streaming/constants/ProtectionConstants.js","../dashjs/src/streaming/protection/drm/KeySystemClearKey.js","../dashjs/src/streaming/protection/drm/KeySystemW3CClearKey.js","../dashjs/src/streaming/protection/drm/KeySystemWidevine.js","../dashjs/src/streaming/protection/drm/KeySystemPlayReady.js","../dashjs/src/streaming/protection/servers/DRMToday.js","../dashjs/src/streaming/protection/servers/PlayReady.js","../dashjs/src/streaming/protection/servers/Widevine.js","../dashjs/src/streaming/protection/servers/ClearKey.js","../dashjs/src/streaming/protection/controllers/ProtectionKeyController.js","../dashjs/src/streaming/protection/ProtectionEvents.js","../dashjs/src/streaming/protection/vo/NeedKey.js","../dashjs/src/streaming/protection/vo/KeyMessage.js","../dashjs/src/streaming/protection/vo/KeySystemAccess.js","../dashjs/src/streaming/protection/models/ProtectionModel_21Jan2015.js","../dashjs/src/streaming/protection/models/ProtectionModel_3Feb2014.js","../dashjs/src/streaming/protection/models/ProtectionModel_01b.js","../dashjs/src/streaming/protection/Protection.js","../dashjs/src/streaming/rules/SwitchRequest.js","../dashjs/src/streaming/rules/abr/ABRRulesCollection.js","../dashjs/src/streaming/rules/abr/AbandonRequestsRule.js","../dashjs/src/streaming/rules/abr/BolaRule.js","../dashjs/src/streaming/rules/abr/DroppedFramesRule.js","../dashjs/src/streaming/rules/abr/InsufficientBufferRule.js","../dashjs/src/streaming/rules/abr/L2ARule.js","../dashjs/src/streaming/rules/abr/SwitchHistoryRule.js","../dashjs/src/streaming/rules/abr/ThroughputRule.js","../dashjs/src/streaming/rules/abr/lolp/LearningAbrController.js","../dashjs/src/streaming/rules/abr/lolp/LoLpQoEEvaluator.js","../dashjs/src/streaming/rules/abr/lolp/LoLpRule.js","../dashjs/src/streaming/rules/abr/lolp/LoLpWeightSelector.js","../dashjs/src/streaming/rules/abr/lolp/QoeInfo.js","../dashjs/src/streaming/thumbnail/ThumbnailTracks.js","../dashjs/src/streaming/utils/BoxParser.js","../dashjs/src/streaming/utils/Capabilities.js","../dashjs/src/streaming/utils/CustomTimeRanges.js","../dashjs/src/streaming/utils/DefaultURLUtils.js","../dashjs/src/streaming/utils/IsoFile.js","../dashjs/src/streaming/utils/RequestModifier.js","../dashjs/src/streaming/utils/SupervisorTools.js","../dashjs/src/streaming/utils/URLUtils.js","../dashjs/src/streaming/vo/DashJSError.js","../dashjs/src/streaming/vo/FragmentRequest.js","../dashjs/src/streaming/vo/IsoBox.js","../dashjs/src/streaming/vo/IsoBoxSearchInfo.js","../dashjs/src/streaming/vo/ThumbnailTrackInfo.js","../dashjs/src/streaming/vo/metrics/HTTPRequest.js","../dashjs/node_modules/bcp-47-match/index.js","../dashjs/node_modules/bcp-47-normalize/index.js","../dashjs/node_modules/bcp-47-normalize/lib/index.js","../dashjs/node_modules/bcp-47/index.js","../dashjs/node_modules/bcp-47/lib/parse.js","../dashjs/node_modules/bcp-47/lib/stringify.js","../dashjs/node_modules/buffer/index.js","../dashjs/node_modules/buffer/node_modules/base64-js/index.js","../dashjs/node_modules/buffer/node_modules/ieee754/index.js","../dashjs/node_modules/codem-isoboxer/dist/iso_boxer.js","../dashjs/node_modules/es6-promise/auto.js","../dashjs/node_modules/es6-promise/dist/es6-promise.js","../dashjs/node_modules/events/events.js","../dashjs/node_modules/fast-deep-equal/index.js","../dashjs/node_modules/imsc/src/main/js/doc.js","../dashjs/node_modules/imsc/src/main/js/html.js","../dashjs/node_modules/imsc/src/main/js/isd.js","../dashjs/node_modules/imsc/src/main/js/main.js","../dashjs/node_modules/imsc/src/main/js/names.js","../dashjs/node_modules/imsc/src/main/js/styles.js","../dashjs/node_modules/imsc/src/main/js/utils.js","../dashjs/node_modules/is-alphabetical/index.js","../dashjs/node_modules/is-alphanumerical/index.js","../dashjs/node_modules/is-decimal/index.js","../dashjs/node_modules/path-browserify/index.js","../dashjs/node_modules/safe-buffer/index.js","../dashjs/node_modules/sax/lib/sax.js","../dashjs/node_modules/stream-browserify/index.js","../dashjs/node_modules/stream-browserify/node_modules/inherits/inherits_browser.js","../dashjs/node_modules/stream-browserify/node_modules/readable-stream/errors-browser.js","../dashjs/node_modules/stream-browserify/node_modules/readable-stream/lib/_stream_duplex.js","../dashjs/node_modules/stream-browserify/node_modules/readable-stream/lib/_stream_passthrough.js","../dashjs/node_modules/stream-browserify/node_modules/readable-stream/lib/_stream_readable.js","../dashjs/node_modules/stream-browserify/node_modules/readable-stream/lib/_stream_transform.js","../dashjs/node_modules/stream-browserify/node_modules/readable-stream/lib/_stream_writable.js","../dashjs/node_modules/stream-browserify/node_modules/readable-stream/lib/internal/streams/async_iterator.js","../dashjs/node_modules/stream-browserify/node_modules/readable-stream/lib/internal/streams/buffer_list.js","../dashjs/node_modules/stream-browserify/node_modules/readable-stream/lib/internal/streams/destroy.js","../dashjs/node_modules/stream-browserify/node_modules/readable-stream/lib/internal/streams/end-of-stream.js","../dashjs/node_modules/stream-browserify/node_modules/readable-stream/lib/internal/streams/from-browser.js","../dashjs/node_modules/stream-browserify/node_modules/readable-stream/lib/internal/streams/pipeline.js","../dashjs/node_modules/stream-browserify/node_modules/readable-stream/lib/internal/streams/state.js","../dashjs/node_modules/stream-browserify/node_modules/readable-stream/lib/internal/streams/stream-browser.js","../dashjs/node_modules/string_decoder/lib/string_decoder.js","../dashjs/node_modules/ua-parser-js/src/ua-parser.js","../dashjs/node_modules/util-deprecate/browser.js","../dashjs/webpack/bootstrap","../dashjs/webpack/runtime/amd options","../dashjs/webpack/runtime/compat get default export","../dashjs/webpack/runtime/define property getters","../dashjs/webpack/runtime/global","../dashjs/webpack/runtime/hasOwnProperty shorthand","../dashjs/src/streaming/MediaPlayerFactory.js","../dashjs/index.js","../node_modules/react-dom/client.js","../node_modules/axios/lib/core/dispatchRequest.js","../node_modules/react/index.js","../node_modules/react-is/cjs/react-is.production.min.js","../node_modules/axios/lib/utils.js","../node_modules/react-fast-compare/index.js","../node_modules/axios/lib/core/mergeConfig.js","../node_modules/axios/lib/core/InterceptorManager.js","../node_modules/axios/lib/helpers/buildURL.js","../node_modules/react-snowfall/src/Snowflake.ts","../node_modules/axios/lib/helpers/bind.js","../node_modules/scheduler/cjs/scheduler.production.min.js","../node_modules/axios/lib/helpers/toFormData.js","../node_modules/react-redux/node_modules/react-is/cjs/react-is.production.min.js","../node_modules/react-snowfall/src/utils.ts","../node_modules/axios/lib/cancel/CanceledError.js","../node_modules/axios/lib/core/buildFullPath.js","../node_modules/axios/lib/cancel/CancelToken.js","../node_modules/axios/lib/cancel/isCancel.js","../node_modules/axios/lib/helpers/cookies.js","../node_modules/react-dom/index.js","../node_modules/axios/lib/helpers/spread.js","../node_modules/use-sync-external-store/shim/with-selector.js","../node_modules/axios/lib/helpers/isAxiosError.js","../node_modules/scheduler/index.js","../node_modules/axios/lib/core/Axios.js","../node_modules/axios/lib/defaults/transitional.js","../node_modules/use-sync-external-store/shim/index.js","../node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.js","../webpack/bootstrap","../webpack/runtime/compat get default export","../webpack/runtime/create fake namespace object","../webpack/runtime/define property getters","../webpack/runtime/ensure chunk","../webpack/runtime/get javascript chunk filename","../webpack/runtime/get mini-css chunk filename","../webpack/runtime/global","../webpack/runtime/hasOwnProperty shorthand","../webpack/runtime/load script","../webpack/runtime/make namespace object","../webpack/runtime/node module decorator","../webpack/runtime/publicPath","../webpack/runtime/jsonp chunk loading","../node_modules/@remix-run/router/history.ts","../node_modules/@remix-run/router/utils.ts","../node_modules/@remix-run/router/router.ts","../node_modules/react-router/lib/context.ts","../node_modules/react-router/lib/hooks.tsx","../node_modules/react-router/lib/deprecations.ts","../node_modules/react-router/lib/components.tsx","../node_modules/@emotion/sheet/dist/emotion-sheet.esm.js","../node_modules/stylis/src/Utility.js","../node_modules/stylis/src/Tokenizer.js","../node_modules/stylis/src/Enum.js","../node_modules/stylis/src/Serializer.js","../node_modules/stylis/src/Parser.js","../node_modules/@emotion/cache/dist/emotion-cache.browser.esm.js","../node_modules/stylis/src/Middleware.js","../node_modules/@babel/runtime/helpers/esm/extends.js","../node_modules/@emotion/weak-memoize/dist/emotion-weak-memoize.esm.js","../node_modules/@emotion/utils/dist/emotion-utils.browser.esm.js","../node_modules/@emotion/unitless/dist/emotion-unitless.esm.js","../node_modules/@emotion/memoize/dist/emotion-memoize.esm.js","../node_modules/@emotion/serialize/dist/emotion-serialize.esm.js","../node_modules/@emotion/hash/dist/emotion-hash.esm.js","../node_modules/@emotion/use-insertion-effect-with-fallbacks/dist/emotion-use-insertion-effect-with-fallbacks.browser.esm.js","../node_modules/@emotion/react/dist/emotion-element-f0de968e.browser.esm.js","../node_modules/@emotion/react/dist/emotion-react.browser.esm.js","../node_modules/@mantine/styles/src/theme/default-colors.ts","../node_modules/@mantine/styles/src/theme/functions/fns/focus-styles/focus-styles.ts","../node_modules/@mantine/styles/src/theme/functions/fns/primary-shade/primary-shade.ts","../node_modules/@mantine/styles/src/theme/functions/fns/theme-color/theme-color.ts","../node_modules/@mantine/styles/src/theme/functions/fns/gradient/get-gradient-color-stops/get-gradient-color-stops.ts","../node_modules/@mantine/styles/src/theme/functions/fns/gradient/gradient.ts","../node_modules/@mantine/styles/src/theme/functions/fns/size/size.ts","../node_modules/@mantine/styles/src/theme/utils/to-rgba/to-rgba.ts","../node_modules/@mantine/styles/src/theme/functions/fns/rgba/rgba.ts","../node_modules/@mantine/styles/src/theme/functions/fns/index.ts","../node_modules/@mantine/styles/src/theme/functions/fns/font-styles/font-styles.ts","../node_modules/@mantine/styles/src/theme/functions/fns/breakpoints/breakpoints.ts","../node_modules/@mantine/styles/src/theme/functions/fns/cover/cover.ts","../node_modules/@mantine/styles/src/theme/functions/fns/darken/darken.ts","../node_modules/@mantine/styles/src/theme/functions/fns/lighten/lighten.ts","../node_modules/@mantine/styles/src/theme/functions/fns/radius/radius.ts","../node_modules/@mantine/styles/src/theme/functions/fns/variant/variant.ts","../node_modules/@mantine/styles/src/theme/functions/fns/hover/hover.ts","../node_modules/@mantine/styles/src/theme/functions/fns/primary-color/primary-color.ts","../node_modules/@mantine/styles/src/theme/functions/fns/placeholder-styles/placeholder-styles.ts","../node_modules/@mantine/styles/src/theme/functions/attach-functions.ts","../node_modules/@mantine/styles/src/theme/default-theme.ts","../node_modules/@mantine/styles/src/theme/GlobalStyles.tsx","../node_modules/@mantine/styles/src/theme/MantineCssVariables.tsx","../node_modules/@mantine/styles/src/theme/utils/merge-theme/merge-theme.ts","../node_modules/@mantine/styles/src/theme/utils/filter-props/filter-props.ts","../node_modules/@mantine/styles/src/theme/NormalizeCSS.tsx","../node_modules/@mantine/styles/src/theme/MantineProvider.tsx","../node_modules/clsx/dist/clsx.m.js","../node_modules/@mantine/styles/src/tss/default-emotion-cache.ts","../node_modules/@mantine/styles/src/tss/use-css.tsx","../node_modules/@mantine/styles/src/tss/use-emotion-cache.ts","../node_modules/@mantine/styles/src/tss/utils/use-guaranteed-memo/use-guaranteed-memo.ts","../node_modules/@mantine/styles/src/tss/utils/merge-class-names/merge-class-names.ts","../node_modules/@mantine/styles/src/tss/create-styles.ts","../node_modules/@mantine/core/src/Container/Container.styles.ts","../node_modules/@mantine/core/src/Box/style-system-props/extract-system-styles/extract-system-styles.ts","../node_modules/@mantine/core/src/Box/style-system-props/get-responsive-value/get-responsive-value.ts","../node_modules/@mantine/core/src/Box/style-system-props/value-getters/get-spacing-value.ts","../node_modules/@mantine/core/src/Box/style-system-props/value-getters/value-getters.ts","../node_modules/@mantine/core/src/Box/style-system-props/value-getters/get-color-value.ts","../node_modules/@mantine/core/src/Box/style-system-props/value-getters/get-default-value.ts","../node_modules/@mantine/core/src/Box/style-system-props/value-getters/get-font-size-value.ts","../node_modules/@mantine/core/src/Box/style-system-props/system-props/system-props.ts","../node_modules/@mantine/core/src/Box/style-system-props/get-system-styles/get-system-styles.ts","../node_modules/@mantine/core/src/Box/use-sx/use-sx.ts","../node_modules/@mantine/core/src/Box/Box.tsx","../node_modules/@mantine/core/src/Container/Container.tsx","../node_modules/@mantine/core/src/Paper/Paper.styles.ts","../node_modules/@mantine/core/src/Paper/Paper.tsx","../node_modules/@mantine/hooks/src/use-isomorphic-effect/use-isomorphic-effect.ts","../node_modules/@mantine/hooks/src/use-id/use-id.ts","../node_modules/@mantine/hooks/src/use-focus-trap/tabbable.ts","../node_modules/@mantine/hooks/src/use-focus-trap/scope-tab.ts","../node_modules/@mantine/hooks/src/use-focus-trap/use-focus-trap.ts","../node_modules/@mantine/hooks/src/use-focus-trap/create-aria-hider.ts","../node_modules/@mantine/hooks/src/use-scroll-lock/utils/get-lock-styles.ts","../node_modules/@mantine/hooks/src/use-scroll-lock/utils/get-scroll-width.ts","../node_modules/@mantine/hooks/src/use-scroll-lock/use-scroll-lock.ts","../node_modules/@mantine/hooks/src/use-scroll-lock/utils/make-style-tag.ts","../node_modules/@mantine/hooks/src/use-scroll-lock/utils/inject-style-tag.ts","../node_modules/@mantine/hooks/src/use-scroll-lock/utils/insert-style-tag.ts","../node_modules/@mantine/hooks/src/use-did-update/use-did-update.ts","../node_modules/@mantine/hooks/src/use-focus-return/use-focus-return.ts","../node_modules/@mantine/styles/src/theme/utils/get-default-z-index/get-default-z-index.ts","../node_modules/@mantine/core/src/Drawer/Drawer.styles.ts","../node_modules/@mantine/core/src/Portal/Portal.tsx","../node_modules/@mantine/core/src/Portal/OptionalPortal.tsx","../node_modules/@mantine/core/src/Transition/transitions.ts","../node_modules/@mantine/core/src/Transition/get-transition-styles/get-transition-styles.ts","../node_modules/@mantine/hooks/src/use-media-query/use-media-query.ts","../node_modules/@mantine/hooks/src/use-reduced-motion/use-reduced-motion.ts","../node_modules/@mantine/core/src/Transition/use-transition.ts","../node_modules/@mantine/core/src/Transition/GroupedTransition.tsx","../node_modules/@mantine/core/src/Text/Text.styles.ts","../node_modules/@mantine/core/src/Text/Text.tsx","../node_modules/@mantine/core/src/ActionIcon/ActionIcon.styles.ts","../node_modules/@mantine/core/src/Loader/loaders/Bars.tsx","../node_modules/@mantine/core/src/Loader/loaders/Oval.tsx","../node_modules/@mantine/core/src/Loader/loaders/Dots.tsx","../node_modules/@mantine/core/src/Loader/Loader.tsx","../node_modules/@mantine/core/src/UnstyledButton/UnstyledButton.styles.ts","../node_modules/@mantine/core/src/UnstyledButton/UnstyledButton.tsx","../node_modules/@mantine/core/src/ActionIcon/ActionIcon.tsx","../node_modules/@mantine/core/src/CloseButton/CloseIcon.tsx","../node_modules/@mantine/core/src/CloseButton/CloseButton.tsx","../node_modules/@mantine/utils/src/pack-sx/pack-sx.ts","../node_modules/@mantine/core/src/Overlay/Overlay.styles.ts","../node_modules/@mantine/core/src/Overlay/Overlay.tsx","../node_modules/@mantine/core/src/Drawer/Drawer.tsx","../node_modules/@mantine/core/src/Group/Group.styles.ts","../node_modules/@mantine/core/src/Group/Group.tsx","../node_modules/@mantine/core/src/Group/filter-falsy-children/filter-falsy-children.ts","../node_modules/@mantine/core/src/Anchor/Anchor.styles.ts","../node_modules/@mantine/core/src/Anchor/Anchor.tsx","../node_modules/react-router-dom/dom.ts","../node_modules/react-router-dom/index.tsx","constants/cssConstants.js","../node_modules/@tabler/icons-react/src/defaultAttributes.ts","../node_modules/@tabler/icons-react/src/createReactComponent.ts","../node_modules/@tabler/icons-react/src/icons/IconArrowsShuffle.ts","../node_modules/zustand/esm/vanilla.mjs","../node_modules/zustand/esm/index.mjs","store/LanguageToggleStore.js","../node_modules/zustand/esm/react/shallow.mjs","constants/genricConstants.js","layouts/SideBarMenuLayout.js","../node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","../node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","../node_modules/@babel/runtime/helpers/esm/typeof.js","../node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","../node_modules/@babel/runtime/helpers/esm/toPrimitive.js","../node_modules/@babel/runtime/helpers/esm/defineProperty.js","../node_modules/@babel/runtime/helpers/esm/objectSpread2.js","../node_modules/redux/es/redux.js","../node_modules/react-redux/es/components/Context.js","../node_modules/react-redux/es/utils/batch.js","../node_modules/react-redux/es/utils/Subscription.js","../node_modules/react-redux/es/utils/useIsomorphicLayoutEffect.js","../node_modules/react-redux/es/components/Provider.js","../node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","../node_modules/react-redux/es/components/connectAdvanced.js","../node_modules/react-redux/es/utils/shallowEqual.js","../node_modules/react-redux/es/connect/wrapMapToProps.js","../node_modules/react-redux/es/connect/mapDispatchToProps.js","../node_modules/react-redux/es/utils/bindActionCreators.js","../node_modules/react-redux/es/connect/mapStateToProps.js","../node_modules/react-redux/es/connect/mergeProps.js","../node_modules/react-redux/es/connect/selectorFactory.js","../node_modules/react-redux/es/connect/connect.js","../node_modules/react-redux/es/hooks/useSelector.js","../node_modules/use-memo-one/dist/use-memo-one.esm.js","../node_modules/react-redux/es/index.js","../node_modules/tiny-invariant/dist/esm/tiny-invariant.js","../node_modules/css-box-model/dist/css-box-model.esm.js","../node_modules/memoize-one/dist/memoize-one.esm.js","../node_modules/raf-schd/dist/raf-schd.esm.js","../node_modules/react-beautiful-dnd/dist/react-beautiful-dnd.esm.js","custom/AnimeData.js","../node_modules/@tabler/icons-react/src/icons/IconMenu2.ts","layouts/WatchListEditLayout.js","components/SideBarComponent.js","../node_modules/@tabler/icons-react/src/icons/IconChevronRight.ts","../node_modules/@mantine/core/src/Accordion/ChevronIcon.tsx","../node_modules/@mantine/hooks/src/utils/clamp/clamp.ts","../node_modules/embla-carousel/src/components/utils.ts","../node_modules/embla-carousel/src/components/Alignment.ts","../node_modules/embla-carousel/src/components/Limit.ts","../node_modules/embla-carousel/src/components/Counter.ts","../node_modules/embla-carousel/src/components/EventStore.ts","../node_modules/embla-carousel/src/components/Vector1d.ts","../node_modules/embla-carousel/src/components/DragHandler.ts","../node_modules/embla-carousel/src/components/ScrollBody.ts","../node_modules/embla-carousel/src/components/ScrollBounds.ts","../node_modules/embla-carousel/src/components/ScrollContain.ts","../node_modules/embla-carousel/src/components/ScrollLooper.ts","../node_modules/embla-carousel/src/components/ScrollProgress.ts","../node_modules/embla-carousel/src/components/ScrollTarget.ts","../node_modules/embla-carousel/src/components/Translate.ts","../node_modules/embla-carousel/src/components/SlideLooper.ts","../node_modules/embla-carousel/src/components/SlidesInView.ts","../node_modules/embla-carousel/src/components/SlidesToScroll.ts","../node_modules/embla-carousel/src/components/Engine.ts","../node_modules/embla-carousel/src/components/Direction.ts","../node_modules/embla-carousel/src/components/Axis.ts","../node_modules/embla-carousel/src/components/PercentOfView.ts","../node_modules/embla-carousel/src/components/SlideSizes.ts","../node_modules/embla-carousel/src/components/ScrollSnaps.ts","../node_modules/embla-carousel/src/components/ScrollLimit.ts","../node_modules/embla-carousel/src/components/Animation.ts","../node_modules/embla-carousel/src/components/ScrollTo.ts","../node_modules/embla-carousel/src/components/DragTracker.ts","../node_modules/embla-carousel/src/components/Options.ts","../node_modules/embla-carousel/src/components/OptionsHandler.ts","../node_modules/embla-carousel/src/components/index.ts","../node_modules/embla-carousel/src/components/PluginsHandler.ts","../node_modules/embla-carousel/src/components/EventHandler.ts","../node_modules/embla-carousel-react/src/components/utils.ts","../node_modules/embla-carousel-react/src/components/index.ts","../node_modules/@mantine/utils/src/create-safe-context/create-safe-context.tsx","../node_modules/@mantine/carousel/src/Carousel.errors.ts","../node_modules/@mantine/carousel/src/Carousel.context.ts","../node_modules/@mantine/core/src/SimpleGrid/get-sorted-breakpoints/get-sorted-breakpoints.ts","../node_modules/@mantine/carousel/src/Carousel.styles.ts","../node_modules/@mantine/carousel/src/CarouselSlide/CarouselSlide.styles.ts","../node_modules/@mantine/carousel/src/CarouselSlide/CarouselSlide.tsx","../node_modules/@mantine/carousel/src/get-chevron-rotation.ts","../node_modules/@mantine/carousel/src/Carousel.tsx","../node_modules/@mantine/core/src/Image/ImageIcon.tsx","../node_modules/@mantine/core/src/Image/Image.styles.ts","../node_modules/@mantine/core/src/Image/Image.tsx","../node_modules/@mantine/core/src/Button/ButtonGroup/ButtonGroup.styles.ts","../node_modules/@mantine/core/src/Button/ButtonGroup/ButtonGroup.tsx","../node_modules/@mantine/core/src/Input/Input.styles.ts","../node_modules/@mantine/core/src/Button/Button.styles.ts","../node_modules/@mantine/core/src/Button/Button.tsx","../node_modules/@tabler/icons-react/src/icons/IconStar.ts","../node_modules/@tabler/icons-react/src/icons/IconCalendarTime.ts","../node_modules/@tabler/icons-react/src/icons/IconPlayerPlay.ts","assets/images/topten.svg","layouts/HeaderSliderLayout.js","../node_modules/@mantine/core/src/Transition/Transition.tsx","../node_modules/@mantine/utils/src/is-element/is-element.ts","../node_modules/@mantine/hooks/src/use-merged-ref/use-merged-ref.ts","../node_modules/@mantine/hooks/src/utils/assign-ref/assign-ref.ts","../node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs","../node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs","../node_modules/@floating-ui/core/dist/floating-ui.core.mjs","../node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs","../node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.esm.js","../node_modules/@floating-ui/react/dist/floating-ui.react.esm.js","../node_modules/@mantine/core/src/Tooltip/TooltipGroup/TooltipGroup.context.ts","../node_modules/@mantine/core/src/Tooltip/TooltipGroup/TooltipGroup.tsx","../node_modules/@mantine/core/src/Tooltip/Tooltip.styles.ts","../node_modules/@mantine/core/src/Tooltip/Tooltip.errors.ts","../node_modules/@mantine/core/src/Tooltip/TooltipFloating/TooltipFloating.tsx","../node_modules/@mantine/core/src/Tooltip/TooltipFloating/use-floating-tooltip.ts","../node_modules/@mantine/core/src/Floating/use-floating-auto-update.ts","../node_modules/@mantine/core/src/Tooltip/use-tooltip.ts","../node_modules/@mantine/core/src/Floating/get-floating-position/get-floating-position.ts","../node_modules/@mantine/core/src/Floating/FloatingArrow/get-arrow-position-styles.ts","../node_modules/@mantine/core/src/Floating/FloatingArrow/FloatingArrow.tsx","../node_modules/@mantine/core/src/Tooltip/Tooltip.tsx","../node_modules/@tabler/icons-react/src/icons/IconTrash.ts","../node_modules/@tabler/icons-react/src/icons/IconPlus.ts","../node_modules/@mantine/utils/src/create-use-external-events/create-use-external-events.ts","../node_modules/@mantine/modals/src/events.ts","../node_modules/@mantine/notifications/src/events.ts","../node_modules/@tabler/icons-react/src/icons/IconCheck.ts","custom/Notification.js","../node_modules/pocketbase/src/ClientResponseError.ts","../node_modules/pocketbase/src/stores/utils/cookie.ts","../node_modules/pocketbase/src/stores/utils/jwt.ts","../node_modules/pocketbase/src/stores/BaseAuthStore.ts","../node_modules/pocketbase/src/stores/LocalAuthStore.ts","../node_modules/pocketbase/src/services/utils/BaseService.ts","../node_modules/pocketbase/src/services/SettingsService.ts","../node_modules/pocketbase/src/services/utils/CrudService.ts","../node_modules/pocketbase/src/services/utils/legacy.ts","../node_modules/pocketbase/src/services/utils/refresh.ts","../node_modules/pocketbase/src/services/AdminService.ts","../node_modules/pocketbase/src/services/utils/options.ts","../node_modules/pocketbase/src/services/RealtimeService.ts","../node_modules/pocketbase/src/services/RecordService.ts","../node_modules/pocketbase/src/services/CollectionService.ts","../node_modules/pocketbase/src/services/LogService.ts","../node_modules/pocketbase/src/services/HealthService.ts","../node_modules/pocketbase/src/services/FileService.ts","../node_modules/pocketbase/src/services/BackupService.ts","../node_modules/pocketbase/src/Client.ts","custom/User.js","custom/Auth.js","graphql/graphqlQueryExec.js","graphql/graphqlQueries.js","custom/Notifications.js","custom/WatchList.js","store/WatchListStore.js","../node_modules/@mantine/core/src/Title/Title.styles.ts","../node_modules/@mantine/core/src/Title/Title.tsx","../node_modules/@tabler/icons-react/src/icons/IconAlertTriangle.ts","custom/CloudSync.js","layouts/AnimeSectionLayout.js","../node_modules/@mantine/hooks/src/use-disclosure/use-disclosure.ts","partials/ScheduleDateSliderPartial.js","layouts/AnimeDetailsEpisodeListLayout.js","components/SliderComponent.js","components/AnimeSectionComponent.js","../node_modules/@tabler/icons-react/src/icons/IconChevronLeft.ts","custom/DateTime.js","../node_modules/@tabler/icons-react/src/icons/IconDeviceTv.ts","partials/ScheduleForSelectedDatePartial.js","layouts/ScheduleSectionLayout.js","partials/ScheduleTimerPartial.js","components/ScheduleComponent.js","../node_modules/@tabler/icons-react/src/icons/IconVolumeOff.ts","../node_modules/@tabler/icons-react/src/icons/IconVolume.ts","custom/VideoBackground.js","layouts/HeaderVideoLayout.js","../node_modules/@mantine/hooks/src/use-window-event/use-window-event.ts","../node_modules/@mantine/core/src/Modal/Modal.styles.ts","../node_modules/@mantine/core/src/Modal/Modal.tsx","../node_modules/@mantine/core/src/Progress/Progress.styles.ts","../node_modules/@mantine/core/src/Progress/Progress.tsx","components/AnimeCloudSyncComponent.js","screens/HomeScreen.js","../node_modules/@mantine/core/src/Skeleton/Skeleton.styles.ts","../node_modules/@mantine/core/src/Skeleton/Skeleton.tsx","hooks/useWindowDimensions.js","partials/AnimeSectionLoaderPartial.js","components/AnimeDetailsEpisodeListComponent.js","../node_modules/@mantine/core/src/Space/Space.tsx","../node_modules/@tabler/icons-react/src/icons/IconX.ts","partials/AnimeDetailsNextEpisodePartial.js","components/AnimeDetailsOverviewComponent.js","../node_modules/@mantine/core/src/Table/Table.styles.ts","../node_modules/@mantine/core/src/Table/Table.tsx","components/TableComponent.js","components/AnimeMalForumComponent.js","components/AnimeRelationComponent.js","components/AnimeRecommendationComponent.js","components/AnimeDetailsSubDubComponent.js","screens/AnimeDetailsScreen.js","../node_modules/@mantine/core/src/Divider/Divider.styles.ts","../node_modules/@mantine/core/src/Divider/Divider.tsx","player/plugins/assests/image.svg","player/plugins/HlsQuality.js","player/plugins/DashQuality.js","player/VideoPlayer.js","../node_modules/@tabler/icons-react/src/icons/IconPlayerTrackPrev.ts","../node_modules/@tabler/icons-react/src/icons/IconPlayerTrackNext.ts","../node_modules/@tabler/icons-react/src/icons/IconDownload.ts","../node_modules/@tabler/icons-react/src/icons/IconSettings.ts","partials/VideoScreenEpisodeDisplayPartial.js","../node_modules/@mantine/core/src/AspectRatio/AspectRatio.styles.ts","../node_modules/@mantine/core/src/AspectRatio/AspectRatio.tsx","partials/VideoScreenIframePartial.js","custom/PlayerSettings.js","../node_modules/react-country-flag/src/index.tsx","partials/VideoScreenServerSelectorPartial.js","components/VideoPlayerComponent.js","player/PlayerHelper.js","custom/UserDefinedProxy.js","screens/VideoPlayerScreen.js","../node_modules/@mantine/hooks/src/use-uncontrolled/use-uncontrolled.ts","../node_modules/@mantine/hooks/src/utils/range/range.ts","../node_modules/@mantine/hooks/src/use-pagination/use-pagination.ts","../node_modules/@mantine/core/src/Pagination/icons/DotsIcon.tsx","../node_modules/@mantine/core/src/Pagination/icons/NextIcon.tsx","../node_modules/@mantine/core/src/Pagination/icons/PrevIcon.tsx","../node_modules/@mantine/core/src/Pagination/icons/FirstIcon.tsx","../node_modules/@mantine/core/src/Pagination/icons/LastIcon.tsx","../node_modules/@mantine/core/src/Pagination/DefaultItem/DefaultItem.tsx","../node_modules/@mantine/core/src/Pagination/Pagination.styles.ts","../node_modules/@mantine/core/src/Pagination/Pagination.tsx","screens/GenericScreen.js","screens/DmcaScreen.js","screens/PrivacyPolicyScreen.js","../node_modules/@mantine/core/src/Alert/Alert.styles.ts","../node_modules/@mantine/core/src/Alert/Alert.tsx","../node_modules/@mantine/core/src/Input/use-input-props.ts","../node_modules/@mantine/core/src/Input/InputLabel/InputLabel.styles.ts","../node_modules/@mantine/core/src/Input/InputLabel/InputLabel.tsx","../node_modules/@mantine/core/src/Input/InputError/InputError.styles.ts","../node_modules/@mantine/core/src/Input/InputError/InputError.tsx","../node_modules/@mantine/core/src/Input/InputDescription/InputDescription.styles.ts","../node_modules/@mantine/core/src/Input/InputDescription/InputDescription.tsx","../node_modules/@mantine/core/src/Input/InputWrapper.context.ts","../node_modules/@mantine/core/src/Input/InputWrapper/get-input-offsets.ts","../node_modules/@mantine/core/src/Input/InputWrapper/InputWrapper.styles.ts","../node_modules/@mantine/core/src/Input/InputWrapper/InputWrapper.tsx","../node_modules/@mantine/core/src/Input/InputPlaceholder/InputPlaceholder.tsx","../node_modules/@mantine/core/src/Input/Input.tsx","../node_modules/@mantine/core/src/TextInput/TextInput.tsx","../node_modules/use-isomorphic-layout-effect/dist/use-isomorphic-layout-effect.browser.esm.js","../node_modules/use-composed-ref/dist/use-composed-ref.esm.js","../node_modules/react-textarea-autosize/dist/react-textarea-autosize.browser.esm.js","../node_modules/use-latest/dist/use-latest.esm.js","../node_modules/@mantine/core/src/Textarea/Textarea.styles.ts","../node_modules/@mantine/core/src/Textarea/Textarea.tsx","../node_modules/@tabler/icons-react/src/icons/IconCircleX.ts","layouts/BugReportLayout.js","../node_modules/@mantine/form/src/filter-errors/filter-errors.ts","../node_modules/@mantine/form/src/clear-list-state/clear-list-state.ts","../node_modules/@mantine/form/src/validate/should-validate-on-change.ts","../node_modules/klona/dist/index.mjs","../node_modules/@mantine/form/src/paths/get-splitted-path.ts","../node_modules/@mantine/form/src/paths/set-path.ts","../node_modules/@mantine/form/src/paths/get-path.ts","../node_modules/@mantine/form/src/validate/validate-values.ts","../node_modules/@mantine/form/src/validate/validate-field-value.ts","../node_modules/@mantine/form/src/get-status/get-status.ts","../node_modules/@mantine/form/src/use-form.ts","../node_modules/@mantine/form/src/paths/reorder-path.ts","../node_modules/@mantine/form/src/paths/remove-path.ts","../node_modules/@mantine/form/src/paths/insert-path.ts","../node_modules/@mantine/form/src/get-input-on-change/get-input-on-change.ts","../node_modules/@mantine/core/src/LoadingOverlay/LoadingOverlay.styles.ts","../node_modules/@mantine/core/src/LoadingOverlay/LoadingOverlay.tsx","../node_modules/@mantine/core/src/Checkbox/CheckboxGroup.context.ts","../node_modules/@mantine/core/src/Stack/Stack.styles.ts","../node_modules/@mantine/core/src/Stack/Stack.tsx","../node_modules/@mantine/core/src/Checkbox/CheckboxGroup/InputsGroup.tsx","../node_modules/@mantine/core/src/Checkbox/CheckboxGroup/CheckboxGroup.tsx","../node_modules/@mantine/core/src/Checkbox/CheckboxIcon.tsx","../node_modules/@mantine/core/src/Checkbox/Checkbox.styles.ts","../node_modules/@mantine/core/src/InlineInput/InlineInput.styles.ts","../node_modules/@mantine/core/src/InlineInput/InlineInput.tsx","../node_modules/@mantine/core/src/Checkbox/Checkbox.tsx","screens/ContactScreen.js","../node_modules/@mantine/core/src/Flex/flex-props.ts","../node_modules/@mantine/core/src/Flex/Flex.tsx","../node_modules/@mantine/hooks/src/use-scroll-into-view/utils/ease-in-out-quad.ts","../node_modules/@mantine/hooks/src/use-scroll-into-view/use-scroll-into-view.ts","../node_modules/@mantine/hooks/src/use-scroll-into-view/utils/get-scroll-start.ts","../node_modules/@mantine/hooks/src/use-scroll-into-view/utils/get-relative-position.ts","../node_modules/@mantine/hooks/src/use-scroll-into-view/utils/set-scroll-param.ts","../node_modules/@mantine/utils/src/group-options/group-options.ts","../node_modules/@radix-ui/react-compose-refs/dist/packages/react/compose-refs/src/composeRefs.tsx","../node_modules/@radix-ui/react-slot/dist/packages/react/slot/src/Slot.tsx","../node_modules/@radix-ui/react-primitive/dist/packages/react/primitive/src/Primitive.tsx","../node_modules/@radix-ui/react-use-layout-effect/dist/packages/react/use-layout-effect/src/useLayoutEffect.tsx","../node_modules/@radix-ui/react-presence/dist/packages/react/presence/src/Presence.tsx","../node_modules/@radix-ui/react-presence/dist/packages/react/presence/src/useStateMachine.tsx","../node_modules/@radix-ui/react-context/dist/packages/react/context/src/createContext.tsx","../node_modules/@radix-ui/react-use-callback-ref/dist/packages/react/use-callback-ref/src/useCallbackRef.tsx","../node_modules/@radix-ui/react-direction/dist/packages/react/direction/src/Direction.tsx","../node_modules/@radix-ui/primitive/dist/packages/core/primitive/src/primitive.tsx","../node_modules/@radix-ui/react-scroll-area/dist/packages/react/scroll-area/src/ScrollArea.tsx","../node_modules/@radix-ui/react-scroll-area/dist/packages/react/scroll-area/src/useStateMachine.ts","../node_modules/@radix-ui/number/dist/packages/core/number/src/number.ts","../node_modules/@mantine/core/src/ScrollArea/ScrollArea.styles.ts","../node_modules/@mantine/core/src/ScrollArea/ScrollArea.tsx","../node_modules/@mantine/core/src/Select/SelectScrollArea/SelectScrollArea.tsx","../node_modules/@mantine/core/src/Select/DefaultItem/DefaultItem.tsx","../node_modules/@mantine/core/src/Select/SelectRightSection/ChevronIcon.tsx","../node_modules/@mantine/core/src/Select/SelectRightSection/SelectRightSection.tsx","../node_modules/@mantine/core/src/Select/SelectRightSection/get-select-right-section-props.tsx","../node_modules/@mantine/hooks/src/utils/random-id/random-id.ts","../node_modules/@mantine/core/src/Select/SelectItems/SelectItems.styles.ts","../node_modules/@mantine/core/src/Select/SelectItems/SelectItems.tsx","../node_modules/@mantine/core/src/Select/SelectPopover/SelectPopover.styles.ts","../node_modules/@mantine/hooks/src/use-click-outside/use-click-outside.ts","../node_modules/@mantine/core/src/Popover/use-popover.ts","../node_modules/@mantine/core/src/Popover/Popover.errors.ts","../node_modules/@mantine/core/src/Popover/Popover.context.ts","../node_modules/@mantine/core/src/Popover/PopoverTarget/PopoverTarget.tsx","../node_modules/@mantine/utils/src/noop/noop.ts","../node_modules/@mantine/utils/src/close-on-escape/close-on-escape.ts","../node_modules/@mantine/core/src/Popover/PopoverDropdown/PopoverDropdown.styles.ts","../node_modules/@mantine/core/src/FocusTrap/FocusTrap.tsx","../node_modules/@mantine/core/src/Popover/PopoverDropdown/PopoverDropdown.tsx","../node_modules/@mantine/core/src/Popover/Popover.tsx","../node_modules/@mantine/core/src/Select/SelectPopover/SelectPopover.tsx","../node_modules/@mantine/core/src/Select/Select.styles.ts","../node_modules/@mantine/core/src/Select/Select.tsx","../node_modules/@mantine/core/src/Select/filter-data/filter-data.ts","../node_modules/@mantine/hooks/src/use-move/use-move.ts","../node_modules/@mantine/core/src/Slider/utils/get-position/get-position.ts","../node_modules/@mantine/core/src/Slider/utils/get-change-value/get-change-value.ts","../node_modules/@mantine/core/src/Slider/SliderRoot/SliderRoot.styles.ts","../node_modules/@mantine/core/src/Slider/Thumb/Thumb.styles.ts","../node_modules/@mantine/core/src/Slider/Thumb/Thumb.tsx","../node_modules/@mantine/core/src/Slider/Marks/is-mark-filled.ts","../node_modules/@mantine/core/src/Slider/Marks/Marks.styles.ts","../node_modules/@mantine/core/src/Slider/Marks/Marks.tsx","../node_modules/@mantine/core/src/Slider/Track/Track.styles.ts","../node_modules/@mantine/core/src/Slider/Track/Track.tsx","../node_modules/@mantine/core/src/Slider/SliderRoot/SliderRoot.tsx","../node_modules/@mantine/core/src/Slider/RangeSlider/RangeSlider.tsx","../node_modules/@mantine/core/src/Slider/utils/get-client-position/get-client-position.ts","../node_modules/@mantine/core/src/MultiSelect/DefaultValue/DefaultValue.styles.ts","../node_modules/@mantine/core/src/MultiSelect/DefaultValue/DefaultValue.tsx","../node_modules/@mantine/core/src/MultiSelect/MultiSelect.styles.ts","../node_modules/@mantine/core/src/MultiSelect/MultiSelect.tsx","../node_modules/@mantine/core/src/MultiSelect/filter-data/filter-data.ts","../node_modules/@tabler/icons-react/src/icons/IconSortDescending.ts","screens/AnimeSearchScreen.js","../node_modules/@mantine/core/src/PasswordInput/PasswordInput.styles.ts","../node_modules/@mantine/core/src/PasswordInput/PasswordInput.tsx","../node_modules/@mantine/core/src/PasswordInput/PasswordToggleIcon.tsx","layouts/SignInLayout.js","../node_modules/@mantine/core/src/List/List.context.ts","../node_modules/@mantine/core/src/List/ListItem/ListItem.styles.ts","../node_modules/@mantine/core/src/List/ListItem/ListItem.tsx","../node_modules/@mantine/core/src/List/List.styles.ts","../node_modules/@mantine/core/src/List/List.tsx","layouts/SignUpLayout.js","../node_modules/@tabler/icons-react/src/icons/IconBrandDiscord.ts","../node_modules/@tabler/icons-react/src/icons/IconBrandFacebook.ts","partials/JoinUsPartial.js","partials/HeaderLogoPartial.js","screens/AuthScreen.js","layouts/PasswordResetLayout.js","../node_modules/@mantine/styles/src/tss/Global.tsx","../node_modules/@mantine/core/src/AppShell/AppShell.context.ts","../node_modules/@mantine/core/src/AppShell/HorizontalSection/get-sorted-breakpoints/get-sorted-breakpoints.ts","../node_modules/@mantine/core/src/AppShell/VerticalSection/VerticalSection.styles.ts","../node_modules/@mantine/core/src/AppShell/VerticalSection/VerticalSection.tsx","../node_modules/@mantine/core/src/AppShell/Header/Header.tsx","../node_modules/@mantine/core/src/Burger/Burger.styles.ts","../node_modules/@mantine/core/src/Burger/Burger.tsx","../node_modules/@mantine/utils/src/find-element-ancestor/find-element-ancestor.ts","../node_modules/@mantine/core/src/Menu/Menu.errors.ts","../node_modules/@mantine/core/src/Menu/Menu.context.ts","../node_modules/@mantine/core/src/Menu/MenuDivider/MenuDivider.styles.ts","../node_modules/@mantine/core/src/Menu/MenuDivider/MenuDivider.tsx","../node_modules/@mantine/utils/src/create-event-handler/create-event-handler.ts","../node_modules/@mantine/core/src/Menu/MenuDropdown/MenuDropdown.tsx","../node_modules/@mantine/utils/src/create-scoped-keydown-handler/create-scoped-keydown-handler.ts","../node_modules/@mantine/core/src/Menu/MenuItem/MenuItem.styles.ts","../node_modules/@mantine/core/src/Menu/MenuItem/MenuItem.tsx","../node_modules/@mantine/core/src/Menu/MenuLabel/MenuLabel.styles.ts","../node_modules/@mantine/core/src/Menu/MenuLabel/MenuLabel.tsx","../node_modules/@mantine/core/src/Menu/MenuTarget/MenuTarget.tsx","../node_modules/@mantine/core/src/Menu/Menu.styles.ts","../node_modules/@mantine/core/src/Menu/Menu.tsx","../node_modules/@mantine/utils/src/use-hovered/use-hovered.ts","../node_modules/@mantine/core/src/Floating/use-delayed-hover.ts","../node_modules/@mantine/utils/src/get-context-item-index/get-context-item-index.ts","../node_modules/@mantine/core/src/Avatar/AvatarPlaceholderIcon.tsx","../node_modules/@mantine/core/src/Avatar/AvatarGroup/AvatarGroup.context.tsx","../node_modules/@mantine/core/src/Avatar/AvatarGroup/AvatarGroup.styles.ts","../node_modules/@mantine/core/src/Avatar/AvatarGroup/AvatarGroup.tsx","../node_modules/@mantine/core/src/Avatar/Avatar.styles.ts","../node_modules/@mantine/core/src/Avatar/Avatar.tsx","../node_modules/@tabler/icons-react/src/icons/IconSearch.ts","../node_modules/@tabler/icons-react/src/icons/IconCalendarEvent.ts","../node_modules/@tabler/icons-react/src/icons/IconMessageCircle.ts","../node_modules/@mantine/core/src/Indicator/Indicator.styles.ts","../node_modules/@mantine/hooks/src/use-previous/use-previous.ts","../node_modules/@mantine/core/src/Indicator/Machine/MachineNumber.styles.ts","../node_modules/@mantine/core/src/Indicator/Machine/MachineNumber.tsx","../node_modules/@mantine/core/src/Indicator/Machine/Machine.styles.ts","../node_modules/@mantine/core/src/Indicator/Machine/Machine.tsx","../node_modules/@mantine/core/src/Indicator/Indicator.tsx","../node_modules/@mantine/core/src/Card/Card.context.ts","../node_modules/@mantine/core/src/Card/CardSection/CardSection.styles.ts","../node_modules/@mantine/core/src/Card/CardSection/CardSection.tsx","../node_modules/@mantine/core/src/Card/Card.styles.ts","../node_modules/@mantine/core/src/Card/Card.tsx","../node_modules/@tabler/icons-react/src/icons/IconBell.ts","../node_modules/@tabler/icons-react/src/icons/IconChecks.ts","../node_modules/@tabler/icons-react/src/icons/IconPoint.ts","../node_modules/@tabler/icons-react/src/icons/IconEyeCheck.ts","components/NotificationComponent.js","components/HomeHeaderComponent.js","components/GenericHeaderComponent.js","components/HomeFooterComponent.js","components/GenericFooterComponent.js","../node_modules/@mantine/core/src/AppShell/AppShell.styles.ts","../node_modules/@mantine/core/src/AppShell/AppShell.tsx","../node_modules/@mantine/core/src/AppShell/HorizontalSection/HorizontalSection.styles.ts","../node_modules/@mantine/core/src/AppShell/HorizontalSection/HorizontalSection.tsx","../node_modules/@mantine/core/src/AppShell/HorizontalSection/Section/Section.tsx","../node_modules/@mantine/core/src/AppShell/Navbar/Navbar.tsx","../node_modules/@mantine/core/src/MediaQuery/MediaQuery.styles.ts","../node_modules/@mantine/core/src/MediaQuery/MediaQuery.tsx","../node_modules/@tabler/icons-react/src/icons/IconUserScan.ts","../node_modules/@tabler/icons-react/src/icons/IconLogout.ts","components/DashboardNavbarComponent.js","partials/InformationPikachuPartial.js","layouts/DashboardNotificationLayout.js","../node_modules/@mantine/core/src/Switch/SwitchGroup.context.ts","../node_modules/@mantine/core/src/Switch/SwitchGroup/SwitchGroup.tsx","../node_modules/@mantine/core/src/Switch/Switch.styles.ts","../node_modules/@mantine/core/src/Switch/Switch.tsx","partials/DashboardMalImportPartial.js","../node_modules/@mantine/core/src/Radio/RadioIcon.tsx","../node_modules/@mantine/core/src/Radio/RadioGroup.context.ts","../node_modules/@mantine/core/src/Radio/RadioGroup/RadioGroup.tsx","../node_modules/@mantine/core/src/Radio/Radio.styles.ts","../node_modules/@mantine/core/src/Radio/Radio.tsx","partials/DashboardMalExportPartial.js","layouts/DashboardMalLayout.js","../node_modules/@tabler/icons-react/src/icons/IconDotsVertical.ts","partials/DashboardAnimeCardActionPartial.js","layouts/DashboardWatchlistLayout.js","../node_modules/@mantine/hooks/src/use-resize-observer/use-resize-observer.ts","../node_modules/@mantine/core/src/SegmentedControl/SegmentedControl.styles.ts","../node_modules/@mantine/core/src/SegmentedControl/SegmentedControl.tsx","../node_modules/@tabler/icons-react/src/icons/IconUnlink.ts","layouts/DashboardOtherSettingsLayout.js","../node_modules/@tabler/icons-react/src/icons/IconUserCheck.ts","../node_modules/@tabler/icons-react/src/icons/IconPencil.ts","../node_modules/@tabler/icons-react/src/icons/IconRosetteDiscountCheckFilled.ts","../node_modules/@tabler/icons-react/src/icons/IconAt.ts","../node_modules/@tabler/icons-react/src/icons/IconKeyFilled.ts","../node_modules/@tabler/icons-react/src/icons/IconPassword.ts","layouts/DashboardProfileLayout.js","components/DashboardBodyComponent.js","../node_modules/@tabler/icons-react/src/icons/IconUserCircle.ts","../node_modules/@tabler/icons-react/src/icons/IconBellRinging.ts","../node_modules/@tabler/icons-react/src/icons/IconListDetails.ts","../node_modules/@tabler/icons-react/src/icons/IconKey.ts","../node_modules/@tabler/icons-react/src/icons/IconDatabaseImport.ts","screens/DashboardScreen.js","screens/SearchScreen.js","../node_modules/@mantine/hooks/src/use-debounced-state/use-debounced-state.ts","../node_modules/@mantine/core/src/Badge/Badge.styles.ts","../node_modules/@mantine/core/src/Badge/Badge.tsx","screens/PageNotFoundScreen.js","screens/UserProfileScreen.js","App.js","custom/Path.js","custom/ResetData.js","reportWebVitals.js","../node_modules/react-transition-group/esm/config.js","../node_modules/react-transition-group/esm/TransitionGroupContext.js","../node_modules/react-transition-group/esm/Transition.js","../node_modules/react-transition-group/esm/utils/ChildMapping.js","../node_modules/react-transition-group/esm/TransitionGroup.js","../node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","../node_modules/@mantine/hooks/src/use-force-update/use-force-update.ts","../node_modules/@mantine/notifications/src/Notifications.context.ts","../node_modules/@mantine/notifications/src/NotificationsProvider/get-position-styles/get-position-styles.ts","../node_modules/@mantine/notifications/src/NotificationsProvider/get-notification-state-styles/get-notification-state-styles.ts","../node_modules/@mantine/core/src/Notification/Notification.styles.ts","../node_modules/@mantine/core/src/Notification/Notification.tsx","../node_modules/@mantine/notifications/src/NotificationContainer/get-auto-close/get-auto-close.ts","../node_modules/@mantine/notifications/src/NotificationContainer/NotificationContainer.tsx","../node_modules/@mantine/notifications/src/NotificationsProvider/NotificationsProvider.styles.ts","../node_modules/@mantine/notifications/src/NotificationsProvider/use-notifications-state/use-notifications-state.ts","../node_modules/@mantine/hooks/src/use-queue/use-queue.ts","../node_modules/@mantine/notifications/src/NotificationsProvider/NotificationsProvider.tsx","../node_modules/@mantine/modals/src/context.ts","../node_modules/@mantine/modals/src/ConfirmModal.tsx","../node_modules/@mantine/modals/src/use-modals/use-modals.ts","../node_modules/@mantine/modals/src/reducer.ts","../node_modules/@mantine/modals/src/ModalsProvider.tsx","index.js"],"sourcesContent":["'use strict';\n\n// do not edit .js files directly - edit src/index.jst\n\n\n\nmodule.exports = function equal(a, b) {\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) return false;\n\n var length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (!equal(a[i], b[i])) return false;\n return true;\n }\n\n\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0;)\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n for (i = length; i-- !== 0;) {\n var key = keys[i];\n\n if (!equal(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n // true if both NaN, false otherwise\n return a!==a && b!==b;\n};\n","'use strict';\n\nvar reactIs = require('react-is');\n\n/**\n * Copyright 2015, Yahoo! Inc.\n * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.\n */\nvar REACT_STATICS = {\n childContextTypes: true,\n contextType: true,\n contextTypes: true,\n defaultProps: true,\n displayName: true,\n getDefaultProps: true,\n getDerivedStateFromError: true,\n getDerivedStateFromProps: true,\n mixins: true,\n propTypes: true,\n type: true\n};\nvar KNOWN_STATICS = {\n name: true,\n length: true,\n prototype: true,\n caller: true,\n callee: true,\n arguments: true,\n arity: true\n};\nvar FORWARD_REF_STATICS = {\n '$$typeof': true,\n render: true,\n defaultProps: true,\n displayName: true,\n propTypes: true\n};\nvar MEMO_STATICS = {\n '$$typeof': true,\n compare: true,\n defaultProps: true,\n displayName: true,\n propTypes: true,\n type: true\n};\nvar TYPE_STATICS = {};\nTYPE_STATICS[reactIs.ForwardRef] = FORWARD_REF_STATICS;\nTYPE_STATICS[reactIs.Memo] = MEMO_STATICS;\n\nfunction getStatics(component) {\n // React v16.11 and below\n if (reactIs.isMemo(component)) {\n return MEMO_STATICS;\n } // React v16.12 and above\n\n\n return TYPE_STATICS[component['$$typeof']] || REACT_STATICS;\n}\n\nvar defineProperty = Object.defineProperty;\nvar getOwnPropertyNames = Object.getOwnPropertyNames;\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar getPrototypeOf = Object.getPrototypeOf;\nvar objectPrototype = Object.prototype;\nfunction hoistNonReactStatics(targetComponent, sourceComponent, blacklist) {\n if (typeof sourceComponent !== 'string') {\n // don't hoist over string (html) components\n if (objectPrototype) {\n var inheritedComponent = getPrototypeOf(sourceComponent);\n\n if (inheritedComponent && inheritedComponent !== objectPrototype) {\n hoistNonReactStatics(targetComponent, inheritedComponent, blacklist);\n }\n }\n\n var keys = getOwnPropertyNames(sourceComponent);\n\n if (getOwnPropertySymbols) {\n keys = keys.concat(getOwnPropertySymbols(sourceComponent));\n }\n\n var targetStatics = getStatics(targetComponent);\n var sourceStatics = getStatics(sourceComponent);\n\n for (var i = 0; i < keys.length; ++i) {\n var key = keys[i];\n\n if (!KNOWN_STATICS[key] && !(blacklist && blacklist[key]) && !(sourceStatics && sourceStatics[key]) && !(targetStatics && targetStatics[key])) {\n var descriptor = getOwnPropertyDescriptor(sourceComponent, key);\n\n try {\n // Avoid failures from read-only properties\n defineProperty(targetComponent, key, descriptor);\n } catch (e) {}\n }\n }\n }\n\n return targetComponent;\n}\n\nmodule.exports = hoistNonReactStatics;\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\nvar utils = require('./utils');\nvar bind = require('./helpers/bind');\nvar Axios = require('./core/Axios');\nvar mergeConfig = require('./core/mergeConfig');\nvar defaults = require('./defaults');\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n * @return {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n var context = new Axios(defaultConfig);\n var instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context);\n\n // Copy context to instance\n utils.extend(instance, context);\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nvar axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = require('./cancel/CanceledError');\naxios.CancelToken = require('./cancel/CancelToken');\naxios.isCancel = require('./cancel/isCancel');\naxios.VERSION = require('./env/data').version;\naxios.toFormData = require('./helpers/toFormData');\n\n// Expose AxiosError class\naxios.AxiosError = require('../lib/core/AxiosError');\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\naxios.spread = require('./helpers/spread');\n\n// Expose isAxiosError\naxios.isAxiosError = require('./helpers/isAxiosError');\n\nmodule.exports = axios;\n\n// Allow use of default import syntax in TypeScript\nmodule.exports.default = axios;\n","'use strict';\n\nvar utils = require('./../utils');\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs have full support of the APIs needed to test\n // whether the request URL is of the same origin as current location.\n (function standardBrowserEnv() {\n var msie = /(msie|trident)/i.test(navigator.userAgent);\n var urlParsingNode = document.createElement('a');\n var originURL;\n\n /**\n * Parse a URL to discover it's components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n var href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n urlParsingNode.pathname :\n '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n return (parsed.protocol === originURL.protocol &&\n parsed.host === originURL.host);\n };\n })() :\n\n // Non standard browser envs (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n })()\n);\n","module.exports = require('./lib/axios');","/**\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/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n * @returns {string} The combined URL\n */\nmodule.exports = function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/+$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n};\n","export const snowfallBaseStyle: React.CSSProperties = {\r\n pointerEvents: 'none',\r\n backgroundColor: 'transparent',\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n width: '100%',\r\n height: '100%',\r\n}\r\n\r\n// Target of 60 frames per second\r\nexport const targetFrameTime = 1000 / 60\r\n","'use strict';\n\nvar utils = require('./../utils');\nvar settle = require('./../core/settle');\nvar cookies = require('./../helpers/cookies');\nvar buildURL = require('./../helpers/buildURL');\nvar buildFullPath = require('../core/buildFullPath');\nvar parseHeaders = require('./../helpers/parseHeaders');\nvar isURLSameOrigin = require('./../helpers/isURLSameOrigin');\nvar transitionalDefaults = require('../defaults/transitional');\nvar AxiosError = require('../core/AxiosError');\nvar CanceledError = require('../cancel/CanceledError');\nvar parseProtocol = require('../helpers/parseProtocol');\n\nmodule.exports = function xhrAdapter(config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n var requestData = config.data;\n var requestHeaders = config.headers;\n var responseType = config.responseType;\n var onCanceled;\n function done() {\n if (config.cancelToken) {\n config.cancelToken.unsubscribe(onCanceled);\n }\n\n if (config.signal) {\n config.signal.removeEventListener('abort', onCanceled);\n }\n }\n\n if (utils.isFormData(requestData) && utils.isStandardBrowserEnv()) {\n delete requestHeaders['Content-Type']; // Let the browser set it\n }\n\n var request = new XMLHttpRequest();\n\n // HTTP basic authentication\n if (config.auth) {\n var username = config.auth.username || '';\n var password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';\n requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);\n }\n\n var fullPath = buildFullPath(config.baseURL, config.url);\n\n request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);\n\n // Set the request timeout in MS\n request.timeout = config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;\n var responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n var response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config: config,\n request: request\n };\n\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n var timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';\n var transitional = config.transitional || transitionalDefaults;\n if (config.timeoutErrorMessage) {\n timeoutErrorMessage = config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n request));\n\n // Clean up request\n request = null;\n };\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n if (utils.isStandardBrowserEnv()) {\n // Add xsrf header\n var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ?\n cookies.read(config.xsrfCookieName) :\n undefined;\n\n if (xsrfValue) {\n requestHeaders[config.xsrfHeaderName] = xsrfValue;\n }\n }\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders, function setRequestHeader(val, key) {\n if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {\n // Remove Content-Type if data is undefined\n delete requestHeaders[key];\n } else {\n // Otherwise add header to the request\n request.setRequestHeader(key, val);\n }\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(config.withCredentials)) {\n request.withCredentials = !!config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = config.responseType;\n }\n\n // Handle progress if needed\n if (typeof config.onDownloadProgress === 'function') {\n request.addEventListener('progress', config.onDownloadProgress);\n }\n\n // Not all browsers support upload events\n if (typeof config.onUploadProgress === 'function' && request.upload) {\n request.upload.addEventListener('progress', config.onUploadProgress);\n }\n\n if (config.cancelToken || config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = function(cancel) {\n if (!request) {\n return;\n }\n reject(!cancel || (cancel && cancel.type) ? new CanceledError() : cancel);\n request.abort();\n request = null;\n };\n\n config.cancelToken && config.cancelToken.subscribe(onCanceled);\n if (config.signal) {\n config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n if (!requestData) {\n requestData = null;\n }\n\n var protocol = parseProtocol(fullPath);\n\n if (protocol && [ 'http', 'https', 'file' ].indexOf(protocol) === -1) {\n reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n\n\n // Send the request\n request.send(requestData);\n });\n};\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-is.production.min.js');\n} else {\n module.exports = require('./cjs/react-is.development.js');\n}\n","'use strict';\n\nvar utils = require('../utils');\n\nmodule.exports = function normalizeHeaderName(headers, normalizedName) {\n utils.forEach(headers, function processHeader(value, name) {\n if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {\n headers[normalizedName] = value;\n delete headers[name];\n }\n });\n};\n","/**\n * @license React\n * use-sync-external-store-shim.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and 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\n\"use strict\";\nvar React = require(\"react\");\nfunction is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n}\nvar objectIs = \"function\" === typeof Object.is ? Object.is : is,\n useState = React.useState,\n useEffect = React.useEffect,\n useLayoutEffect = React.useLayoutEffect,\n useDebugValue = React.useDebugValue;\nfunction useSyncExternalStore$2(subscribe, getSnapshot) {\n var value = getSnapshot(),\n _useState = useState({ inst: { value: value, getSnapshot: getSnapshot } }),\n inst = _useState[0].inst,\n forceUpdate = _useState[1];\n useLayoutEffect(\n function () {\n inst.value = value;\n inst.getSnapshot = getSnapshot;\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n },\n [subscribe, value, getSnapshot]\n );\n useEffect(\n function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n return subscribe(function () {\n checkIfSnapshotChanged(inst) && forceUpdate({ inst: inst });\n });\n },\n [subscribe]\n );\n useDebugValue(value);\n return value;\n}\nfunction checkIfSnapshotChanged(inst) {\n var latestGetSnapshot = inst.getSnapshot;\n inst = inst.value;\n try {\n var nextValue = latestGetSnapshot();\n return !objectIs(inst, nextValue);\n } catch (error) {\n return !0;\n }\n}\nfunction useSyncExternalStore$1(subscribe, getSnapshot) {\n return getSnapshot();\n}\nvar shim =\n \"undefined\" === typeof window ||\n \"undefined\" === typeof window.document ||\n \"undefined\" === typeof window.document.createElement\n ? useSyncExternalStore$1\n : useSyncExternalStore$2;\nexports.useSyncExternalStore =\n void 0 !== React.useSyncExternalStore ? React.useSyncExternalStore : shim;\n","'use strict';\n\nvar VERSION = require('../env/data').version;\nvar AxiosError = require('../core/AxiosError');\n\nvar validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach(function(type, i) {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nvar deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return function(value, opt, opts) {\n if (validator === false) {\n throw new AxiosError(\n formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n AxiosError.ERR_DEPRECATED\n );\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\n/**\n * Assert object's properties type\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\n }\n var keys = Object.keys(options);\n var i = keys.length;\n while (i-- > 0) {\n var opt = keys[i];\n var validator = schema[opt];\n if (validator) {\n var value = options[opt];\n var result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n }\n }\n}\n\nmodule.exports = {\n assertOptions: assertOptions,\n validators: validators\n};\n","// see https://tools.ietf.org/html/rfc1808\n\n(function (root) {\n var URL_REGEX =\n /^(?=((?:[a-zA-Z0-9+\\-.]+:)?))\\1(?=((?:\\/\\/[^\\/?#]*)?))\\2(?=((?:(?:[^?#\\/]*\\/)*[^;?#\\/]*)?))\\3((?:;[^?#]*)?)(\\?[^#]*)?(#[^]*)?$/;\n var FIRST_SEGMENT_REGEX = /^(?=([^\\/?#]*))\\1([^]*)$/;\n var SLASH_DOT_REGEX = /(?:\\/|^)\\.(?=\\/)/g;\n var SLASH_DOT_DOT_REGEX = /(?:\\/|^)\\.\\.\\/(?!\\.\\.\\/)[^\\/]*(?=\\/)/g;\n\n var URLToolkit = {\n // If opts.alwaysNormalize is true then the path will always be normalized even when it starts with / or //\n // E.g\n // With opts.alwaysNormalize = false (default, spec compliant)\n // http://a.com/b/cd + /e/f/../g => http://a.com/e/f/../g\n // With opts.alwaysNormalize = true (not spec compliant)\n // http://a.com/b/cd + /e/f/../g => http://a.com/e/g\n buildAbsoluteURL: function (baseURL, relativeURL, opts) {\n opts = opts || {};\n // remove any remaining space and CRLF\n baseURL = baseURL.trim();\n relativeURL = relativeURL.trim();\n if (!relativeURL) {\n // 2a) If the embedded URL is entirely empty, it inherits the\n // entire base URL (i.e., is set equal to the base URL)\n // and we are done.\n if (!opts.alwaysNormalize) {\n return baseURL;\n }\n var basePartsForNormalise = URLToolkit.parseURL(baseURL);\n if (!basePartsForNormalise) {\n throw new Error('Error trying to parse base URL.');\n }\n basePartsForNormalise.path = URLToolkit.normalizePath(\n basePartsForNormalise.path\n );\n return URLToolkit.buildURLFromParts(basePartsForNormalise);\n }\n var relativeParts = URLToolkit.parseURL(relativeURL);\n if (!relativeParts) {\n throw new Error('Error trying to parse relative URL.');\n }\n if (relativeParts.scheme) {\n // 2b) If the embedded URL starts with a scheme name, it is\n // interpreted as an absolute URL and we are done.\n if (!opts.alwaysNormalize) {\n return relativeURL;\n }\n relativeParts.path = URLToolkit.normalizePath(relativeParts.path);\n return URLToolkit.buildURLFromParts(relativeParts);\n }\n var baseParts = URLToolkit.parseURL(baseURL);\n if (!baseParts) {\n throw new Error('Error trying to parse base URL.');\n }\n if (!baseParts.netLoc && baseParts.path && baseParts.path[0] !== '/') {\n // If netLoc missing and path doesn't start with '/', assume everthing before the first '/' is the netLoc\n // This causes 'example.com/a' to be handled as '//example.com/a' instead of '/example.com/a'\n var pathParts = FIRST_SEGMENT_REGEX.exec(baseParts.path);\n baseParts.netLoc = pathParts[1];\n baseParts.path = pathParts[2];\n }\n if (baseParts.netLoc && !baseParts.path) {\n baseParts.path = '/';\n }\n var builtParts = {\n // 2c) Otherwise, the embedded URL inherits the scheme of\n // the base URL.\n scheme: baseParts.scheme,\n netLoc: relativeParts.netLoc,\n path: null,\n params: relativeParts.params,\n query: relativeParts.query,\n fragment: relativeParts.fragment,\n };\n if (!relativeParts.netLoc) {\n // 3) If the embedded URL's is non-empty, we skip to\n // Step 7. Otherwise, the embedded URL inherits the \n // (if any) of the base URL.\n builtParts.netLoc = baseParts.netLoc;\n // 4) If the embedded URL path is preceded by a slash \"/\", the\n // path is not relative and we skip to Step 7.\n if (relativeParts.path[0] !== '/') {\n if (!relativeParts.path) {\n // 5) If the embedded URL path is empty (and not preceded by a\n // slash), then the embedded URL inherits the base URL path\n builtParts.path = baseParts.path;\n // 5a) if the embedded URL's is non-empty, we skip to\n // step 7; otherwise, it inherits the of the base\n // URL (if any) and\n if (!relativeParts.params) {\n builtParts.params = baseParts.params;\n // 5b) if the embedded URL's is non-empty, we skip to\n // step 7; otherwise, it inherits the of the base\n // URL (if any) and we skip to step 7.\n if (!relativeParts.query) {\n builtParts.query = baseParts.query;\n }\n }\n } else {\n // 6) The last segment of the base URL's path (anything\n // following the rightmost slash \"/\", or the entire path if no\n // slash is present) is removed and the embedded URL's path is\n // appended in its place.\n var baseURLPath = baseParts.path;\n var newPath =\n baseURLPath.substring(0, baseURLPath.lastIndexOf('/') + 1) +\n relativeParts.path;\n builtParts.path = URLToolkit.normalizePath(newPath);\n }\n }\n }\n if (builtParts.path === null) {\n builtParts.path = opts.alwaysNormalize\n ? URLToolkit.normalizePath(relativeParts.path)\n : relativeParts.path;\n }\n return URLToolkit.buildURLFromParts(builtParts);\n },\n parseURL: function (url) {\n var parts = URL_REGEX.exec(url);\n if (!parts) {\n return null;\n }\n return {\n scheme: parts[1] || '',\n netLoc: parts[2] || '',\n path: parts[3] || '',\n params: parts[4] || '',\n query: parts[5] || '',\n fragment: parts[6] || '',\n };\n },\n normalizePath: function (path) {\n // The following operations are\n // then applied, in order, to the new path:\n // 6a) All occurrences of \"./\", where \".\" is a complete path\n // segment, are removed.\n // 6b) If the path ends with \".\" as a complete path segment,\n // that \".\" is removed.\n path = path.split('').reverse().join('').replace(SLASH_DOT_REGEX, '');\n // 6c) All occurrences of \"/../\", where is a\n // complete path segment not equal to \"..\", are removed.\n // Removal of these path segments is performed iteratively,\n // removing the leftmost matching pattern on each iteration,\n // until no matching pattern remains.\n // 6d) If the path ends with \"/..\", where is a\n // complete path segment not equal to \"..\", that\n // \"/..\" is removed.\n while (\n path.length !== (path = path.replace(SLASH_DOT_DOT_REGEX, '')).length\n ) {}\n return path.split('').reverse().join('');\n },\n buildURLFromParts: function (parts) {\n return (\n parts.scheme +\n parts.netLoc +\n parts.path +\n parts.params +\n parts.query +\n parts.fragment\n );\n },\n };\n\n if (typeof exports === 'object' && typeof module === 'object')\n module.exports = URLToolkit;\n else if (typeof define === 'function' && define.amd)\n define([], function () {\n return URLToolkit;\n });\n else if (typeof exports === 'object') exports['URLToolkit'] = URLToolkit;\n else root['URLToolkit'] = URLToolkit;\n})(this);\n","// https://caniuse.com/mdn-javascript_builtins_number_isfinite\nexport const isFiniteNumber =\n Number.isFinite ||\n function (value) {\n return typeof value === 'number' && isFinite(value);\n };\n\n// https://caniuse.com/mdn-javascript_builtins_number_issafeinteger\nexport const isSafeInteger =\n Number.isSafeInteger ||\n function (value) {\n return typeof value === 'number' && Math.abs(value) <= MAX_SAFE_INTEGER;\n };\n\nexport const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;\n","import {\n ManifestLoadedData,\n ManifestLoadingData,\n MediaAttachedData,\n MediaAttachingData,\n LevelLoadingData,\n LevelLoadedData,\n ManifestParsedData,\n LevelUpdatedData,\n LevelsUpdatedData,\n FragParsingUserdataData,\n FragDecryptedData,\n FragLoadedData,\n InitPTSFoundData,\n CuesParsedData,\n SubtitleFragProcessedData,\n NonNativeTextTracksData,\n FragLoadingData,\n AudioTrackLoadedData,\n SubtitleTrackLoadedData,\n ErrorData,\n AudioTrackSwitchingData,\n AudioTrackSwitchedData,\n KeyLoadedData,\n KeyLoadingData,\n SubtitleTrackSwitchData,\n SubtitleTracksUpdatedData,\n LevelSwitchedData,\n FragChangedData,\n BufferAppendingData,\n BufferCodecsData,\n FragParsingMetadataData,\n FragParsingInitSegmentData,\n FragBufferedData,\n BufferFlushingData,\n BufferEOSData,\n LevelSwitchingData,\n MaxAutoLevelUpdatedData,\n FPSDropLevelCappingData,\n FPSDropData,\n BufferCreatedData,\n BufferAppendedData,\n LevelPTSUpdatedData,\n FragParsedData,\n AudioTracksUpdatedData,\n FragLoadEmergencyAbortedData,\n BackBufferData,\n LiveBackBufferData,\n TrackLoadingData,\n BufferFlushedData,\n SteeringManifestLoadedData,\n} from './types/events';\n\nexport enum Events {\n // Fired before MediaSource is attaching to media element\n MEDIA_ATTACHING = 'hlsMediaAttaching',\n // Fired when MediaSource has been successfully attached to media element\n MEDIA_ATTACHED = 'hlsMediaAttached',\n // Fired before detaching MediaSource from media element\n MEDIA_DETACHING = 'hlsMediaDetaching',\n // Fired when MediaSource has been detached from media element\n MEDIA_DETACHED = 'hlsMediaDetached',\n // Fired when the buffer is going to be reset\n BUFFER_RESET = 'hlsBufferReset',\n // Fired when we know about the codecs that we need buffers for to push into - data: {tracks : { container, codec, levelCodec, initSegment, metadata }}\n BUFFER_CODECS = 'hlsBufferCodecs',\n // fired when sourcebuffers have been created - data: { tracks : tracks }\n BUFFER_CREATED = 'hlsBufferCreated',\n // fired when we append a segment to the buffer - data: { segment: segment object }\n BUFFER_APPENDING = 'hlsBufferAppending',\n // fired when we are done with appending a media segment to the buffer - data : { parent : segment parent that triggered BUFFER_APPENDING, pending : nb of segments waiting for appending for this segment parent}\n BUFFER_APPENDED = 'hlsBufferAppended',\n // fired when the stream is finished and we want to notify the media buffer that there will be no more data - data: { }\n BUFFER_EOS = 'hlsBufferEos',\n // fired when the media buffer should be flushed - data { startOffset, endOffset }\n BUFFER_FLUSHING = 'hlsBufferFlushing',\n // fired when the media buffer has been flushed - data: { }\n BUFFER_FLUSHED = 'hlsBufferFlushed',\n // fired to signal that a manifest loading starts - data: { url : manifestURL}\n MANIFEST_LOADING = 'hlsManifestLoading',\n // fired after manifest has been loaded - data: { levels : [available quality levels], audioTracks : [ available audio tracks ], url : manifestURL, stats : LoaderStats }\n MANIFEST_LOADED = 'hlsManifestLoaded',\n // fired after manifest has been parsed - data: { levels : [available quality levels], firstLevel : index of first quality level appearing in Manifest}\n MANIFEST_PARSED = 'hlsManifestParsed',\n // fired when a level switch is requested - data: { level : id of new level }\n LEVEL_SWITCHING = 'hlsLevelSwitching',\n // fired when a level switch is effective - data: { level : id of new level }\n LEVEL_SWITCHED = 'hlsLevelSwitched',\n // fired when a level playlist loading starts - data: { url : level URL, level : id of level being loaded}\n LEVEL_LOADING = 'hlsLevelLoading',\n // fired when a level playlist loading finishes - data: { details : levelDetails object, level : id of loaded level, stats : LoaderStats }\n LEVEL_LOADED = 'hlsLevelLoaded',\n // fired when a level's details have been updated based on previous details, after it has been loaded - data: { details : levelDetails object, level : id of updated level }\n LEVEL_UPDATED = 'hlsLevelUpdated',\n // fired when a level's PTS information has been updated after parsing a fragment - data: { details : levelDetails object, level : id of updated level, drift: PTS drift observed when parsing last fragment }\n LEVEL_PTS_UPDATED = 'hlsLevelPtsUpdated',\n // fired to notify that levels have changed after removing a level - data: { levels : [available quality levels] }\n LEVELS_UPDATED = 'hlsLevelsUpdated',\n // fired to notify that audio track lists has been updated - data: { audioTracks : audioTracks }\n AUDIO_TRACKS_UPDATED = 'hlsAudioTracksUpdated',\n // fired when an audio track switching is requested - data: { id : audio track id }\n AUDIO_TRACK_SWITCHING = 'hlsAudioTrackSwitching',\n // fired when an audio track switch actually occurs - data: { id : audio track id }\n AUDIO_TRACK_SWITCHED = 'hlsAudioTrackSwitched',\n // fired when an audio track loading starts - data: { url : audio track URL, id : audio track id }\n AUDIO_TRACK_LOADING = 'hlsAudioTrackLoading',\n // fired when an audio track loading finishes - data: { details : levelDetails object, id : audio track id, stats : LoaderStats }\n AUDIO_TRACK_LOADED = 'hlsAudioTrackLoaded',\n // fired to notify that subtitle track lists has been updated - data: { subtitleTracks : subtitleTracks }\n SUBTITLE_TRACKS_UPDATED = 'hlsSubtitleTracksUpdated',\n // fired to notify that subtitle tracks were cleared as a result of stopping the media\n SUBTITLE_TRACKS_CLEARED = 'hlsSubtitleTracksCleared',\n // fired when an subtitle track switch occurs - data: { id : subtitle track id }\n SUBTITLE_TRACK_SWITCH = 'hlsSubtitleTrackSwitch',\n // fired when a subtitle track loading starts - data: { url : subtitle track URL, id : subtitle track id }\n SUBTITLE_TRACK_LOADING = 'hlsSubtitleTrackLoading',\n // fired when a subtitle track loading finishes - data: { details : levelDetails object, id : subtitle track id, stats : LoaderStats }\n SUBTITLE_TRACK_LOADED = 'hlsSubtitleTrackLoaded',\n // fired when a subtitle fragment has been processed - data: { success : boolean, frag : the processed frag }\n SUBTITLE_FRAG_PROCESSED = 'hlsSubtitleFragProcessed',\n // fired when a set of VTTCues to be managed externally has been parsed - data: { type: string, track: string, cues: [ VTTCue ] }\n CUES_PARSED = 'hlsCuesParsed',\n // fired when a text track to be managed externally is found - data: { tracks: [ { label: string, kind: string, default: boolean } ] }\n NON_NATIVE_TEXT_TRACKS_FOUND = 'hlsNonNativeTextTracksFound',\n // fired when the first timestamp is found - data: { id : demuxer id, initPTS: initPTS, timescale: timescale, frag : fragment object }\n INIT_PTS_FOUND = 'hlsInitPtsFound',\n // fired when a fragment loading starts - data: { frag : fragment object }\n FRAG_LOADING = 'hlsFragLoading',\n // fired when a fragment loading is progressing - data: { frag : fragment object, { trequest, tfirst, loaded } }\n // FRAG_LOAD_PROGRESS = 'hlsFragLoadProgress',\n // Identifier for fragment load aborting for emergency switch down - data: { frag : fragment object }\n FRAG_LOAD_EMERGENCY_ABORTED = 'hlsFragLoadEmergencyAborted',\n // fired when a fragment loading is completed - data: { frag : fragment object, payload : fragment payload, stats : LoaderStats }\n FRAG_LOADED = 'hlsFragLoaded',\n // fired when a fragment has finished decrypting - data: { id : demuxer id, frag: fragment object, payload : fragment payload, stats : { tstart, tdecrypt } }\n FRAG_DECRYPTED = 'hlsFragDecrypted',\n // fired when Init Segment has been extracted from fragment - data: { id : demuxer id, frag: fragment object, moov : moov MP4 box, codecs : codecs found while parsing fragment }\n FRAG_PARSING_INIT_SEGMENT = 'hlsFragParsingInitSegment',\n // fired when parsing sei text is completed - data: { id : demuxer id, frag: fragment object, samples : [ sei samples pes ] }\n FRAG_PARSING_USERDATA = 'hlsFragParsingUserdata',\n // fired when parsing id3 is completed - data: { id : demuxer id, frag: fragment object, samples : [ id3 samples pes ] }\n FRAG_PARSING_METADATA = 'hlsFragParsingMetadata',\n // fired when data have been extracted from fragment - data: { id : demuxer id, frag: fragment object, data1 : moof MP4 box or TS fragments, data2 : mdat MP4 box or null}\n // FRAG_PARSING_DATA = 'hlsFragParsingData',\n // fired when fragment parsing is completed - data: { id : demuxer id, frag: fragment object }\n FRAG_PARSED = 'hlsFragParsed',\n // fired when fragment remuxed MP4 boxes have all been appended into SourceBuffer - data: { id : demuxer id, frag : fragment object, stats : LoaderStats }\n FRAG_BUFFERED = 'hlsFragBuffered',\n // fired when fragment matching with current media position is changing - data : { id : demuxer id, frag : fragment object }\n FRAG_CHANGED = 'hlsFragChanged',\n // Identifier for a FPS drop event - data: { currentDropped, currentDecoded, totalDroppedFrames }\n FPS_DROP = 'hlsFpsDrop',\n // triggered when FPS drop triggers auto level capping - data: { level, droppedLevel }\n FPS_DROP_LEVEL_CAPPING = 'hlsFpsDropLevelCapping',\n // triggered when maxAutoLevel changes - data { autoLevelCapping, levels, maxAutoLevel, minAutoLevel, maxHdcpLevel }\n MAX_AUTO_LEVEL_UPDATED = 'hlsMaxAutoLevelUpdated',\n // Identifier for an error event - data: { type : error type, details : error details, fatal : if true, hls.js cannot/will not try to recover, if false, hls.js will try to recover,other error specific data }\n ERROR = 'hlsError',\n // fired when hls.js instance starts destroying. Different from MEDIA_DETACHED as one could want to detach and reattach a media to the instance of hls.js to handle mid-rolls for example - data: { }\n DESTROYING = 'hlsDestroying',\n // fired when a decrypt key loading starts - data: { frag : fragment object }\n KEY_LOADING = 'hlsKeyLoading',\n // fired when a decrypt key loading is completed - data: { frag : fragment object, keyInfo : KeyLoaderInfo }\n KEY_LOADED = 'hlsKeyLoaded',\n // deprecated; please use BACK_BUFFER_REACHED - data : { bufferEnd: number }\n LIVE_BACK_BUFFER_REACHED = 'hlsLiveBackBufferReached',\n // fired when the back buffer is reached as defined by the backBufferLength config option - data : { bufferEnd: number }\n BACK_BUFFER_REACHED = 'hlsBackBufferReached',\n // fired after steering manifest has been loaded - data: { steeringManifest: SteeringManifest object, url: steering manifest URL }\n STEERING_MANIFEST_LOADED = 'hlsSteeringManifestLoaded',\n}\n\n/**\n * Defines each Event type and payload by Event name. Used in {@link hls.js#HlsEventEmitter} to strongly type the event listener API.\n */\nexport interface HlsListeners {\n [Events.MEDIA_ATTACHING]: (\n event: Events.MEDIA_ATTACHING,\n data: MediaAttachingData,\n ) => void;\n [Events.MEDIA_ATTACHED]: (\n event: Events.MEDIA_ATTACHED,\n data: MediaAttachedData,\n ) => void;\n [Events.MEDIA_DETACHING]: (event: Events.MEDIA_DETACHING) => void;\n [Events.MEDIA_DETACHED]: (event: Events.MEDIA_DETACHED) => void;\n [Events.BUFFER_RESET]: (event: Events.BUFFER_RESET) => void;\n [Events.BUFFER_CODECS]: (\n event: Events.BUFFER_CODECS,\n data: BufferCodecsData,\n ) => void;\n [Events.BUFFER_CREATED]: (\n event: Events.BUFFER_CREATED,\n data: BufferCreatedData,\n ) => void;\n [Events.BUFFER_APPENDING]: (\n event: Events.BUFFER_APPENDING,\n data: BufferAppendingData,\n ) => void;\n [Events.BUFFER_APPENDED]: (\n event: Events.BUFFER_APPENDED,\n data: BufferAppendedData,\n ) => void;\n [Events.BUFFER_EOS]: (event: Events.BUFFER_EOS, data: BufferEOSData) => void;\n [Events.BUFFER_FLUSHING]: (\n event: Events.BUFFER_FLUSHING,\n data: BufferFlushingData,\n ) => void;\n [Events.BUFFER_FLUSHED]: (\n event: Events.BUFFER_FLUSHED,\n data: BufferFlushedData,\n ) => void;\n [Events.MANIFEST_LOADING]: (\n event: Events.MANIFEST_LOADING,\n data: ManifestLoadingData,\n ) => void;\n [Events.MANIFEST_LOADED]: (\n event: Events.MANIFEST_LOADED,\n data: ManifestLoadedData,\n ) => void;\n [Events.MANIFEST_PARSED]: (\n event: Events.MANIFEST_PARSED,\n data: ManifestParsedData,\n ) => void;\n [Events.LEVEL_SWITCHING]: (\n event: Events.LEVEL_SWITCHING,\n data: LevelSwitchingData,\n ) => void;\n [Events.LEVEL_SWITCHED]: (\n event: Events.LEVEL_SWITCHED,\n data: LevelSwitchedData,\n ) => void;\n [Events.LEVEL_LOADING]: (\n event: Events.LEVEL_LOADING,\n data: LevelLoadingData,\n ) => void;\n [Events.LEVEL_LOADED]: (\n event: Events.LEVEL_LOADED,\n data: LevelLoadedData,\n ) => void;\n [Events.LEVEL_UPDATED]: (\n event: Events.LEVEL_UPDATED,\n data: LevelUpdatedData,\n ) => void;\n [Events.LEVEL_PTS_UPDATED]: (\n event: Events.LEVEL_PTS_UPDATED,\n data: LevelPTSUpdatedData,\n ) => void;\n [Events.LEVELS_UPDATED]: (\n event: Events.LEVELS_UPDATED,\n data: LevelsUpdatedData,\n ) => void;\n [Events.AUDIO_TRACKS_UPDATED]: (\n event: Events.AUDIO_TRACKS_UPDATED,\n data: AudioTracksUpdatedData,\n ) => void;\n [Events.AUDIO_TRACK_SWITCHING]: (\n event: Events.AUDIO_TRACK_SWITCHING,\n data: AudioTrackSwitchingData,\n ) => void;\n [Events.AUDIO_TRACK_SWITCHED]: (\n event: Events.AUDIO_TRACK_SWITCHED,\n data: AudioTrackSwitchedData,\n ) => void;\n [Events.AUDIO_TRACK_LOADING]: (\n event: Events.AUDIO_TRACK_LOADING,\n data: TrackLoadingData,\n ) => void;\n [Events.AUDIO_TRACK_LOADED]: (\n event: Events.AUDIO_TRACK_LOADED,\n data: AudioTrackLoadedData,\n ) => void;\n [Events.SUBTITLE_TRACKS_UPDATED]: (\n event: Events.SUBTITLE_TRACKS_UPDATED,\n data: SubtitleTracksUpdatedData,\n ) => void;\n [Events.SUBTITLE_TRACKS_CLEARED]: (\n event: Events.SUBTITLE_TRACKS_CLEARED,\n ) => void;\n [Events.SUBTITLE_TRACK_SWITCH]: (\n event: Events.SUBTITLE_TRACK_SWITCH,\n data: SubtitleTrackSwitchData,\n ) => void;\n [Events.SUBTITLE_TRACK_LOADING]: (\n event: Events.SUBTITLE_TRACK_LOADING,\n data: TrackLoadingData,\n ) => void;\n [Events.SUBTITLE_TRACK_LOADED]: (\n event: Events.SUBTITLE_TRACK_LOADED,\n data: SubtitleTrackLoadedData,\n ) => void;\n [Events.SUBTITLE_FRAG_PROCESSED]: (\n event: Events.SUBTITLE_FRAG_PROCESSED,\n data: SubtitleFragProcessedData,\n ) => void;\n [Events.CUES_PARSED]: (\n event: Events.CUES_PARSED,\n data: CuesParsedData,\n ) => void;\n [Events.NON_NATIVE_TEXT_TRACKS_FOUND]: (\n event: Events.NON_NATIVE_TEXT_TRACKS_FOUND,\n data: NonNativeTextTracksData,\n ) => void;\n [Events.INIT_PTS_FOUND]: (\n event: Events.INIT_PTS_FOUND,\n data: InitPTSFoundData,\n ) => void;\n [Events.FRAG_LOADING]: (\n event: Events.FRAG_LOADING,\n data: FragLoadingData,\n ) => void;\n // [Events.FRAG_LOAD_PROGRESS]: TodoEventType\n [Events.FRAG_LOAD_EMERGENCY_ABORTED]: (\n event: Events.FRAG_LOAD_EMERGENCY_ABORTED,\n data: FragLoadEmergencyAbortedData,\n ) => void;\n [Events.FRAG_LOADED]: (\n event: Events.FRAG_LOADED,\n data: FragLoadedData,\n ) => void;\n [Events.FRAG_DECRYPTED]: (\n event: Events.FRAG_DECRYPTED,\n data: FragDecryptedData,\n ) => void;\n [Events.FRAG_PARSING_INIT_SEGMENT]: (\n event: Events.FRAG_PARSING_INIT_SEGMENT,\n data: FragParsingInitSegmentData,\n ) => void;\n [Events.FRAG_PARSING_USERDATA]: (\n event: Events.FRAG_PARSING_USERDATA,\n data: FragParsingUserdataData,\n ) => void;\n [Events.FRAG_PARSING_METADATA]: (\n event: Events.FRAG_PARSING_METADATA,\n data: FragParsingMetadataData,\n ) => void;\n // [Events.FRAG_PARSING_DATA]: TodoEventType\n [Events.FRAG_PARSED]: (\n event: Events.FRAG_PARSED,\n data: FragParsedData,\n ) => void;\n [Events.FRAG_BUFFERED]: (\n event: Events.FRAG_BUFFERED,\n data: FragBufferedData,\n ) => void;\n [Events.FRAG_CHANGED]: (\n event: Events.FRAG_CHANGED,\n data: FragChangedData,\n ) => void;\n [Events.FPS_DROP]: (event: Events.FPS_DROP, data: FPSDropData) => void;\n [Events.FPS_DROP_LEVEL_CAPPING]: (\n event: Events.FPS_DROP_LEVEL_CAPPING,\n data: FPSDropLevelCappingData,\n ) => void;\n [Events.MAX_AUTO_LEVEL_UPDATED]: (\n event: Events.MAX_AUTO_LEVEL_UPDATED,\n data: MaxAutoLevelUpdatedData,\n ) => void;\n [Events.ERROR]: (event: Events.ERROR, data: ErrorData) => void;\n [Events.DESTROYING]: (event: Events.DESTROYING) => void;\n [Events.KEY_LOADING]: (\n event: Events.KEY_LOADING,\n data: KeyLoadingData,\n ) => void;\n [Events.KEY_LOADED]: (event: Events.KEY_LOADED, data: KeyLoadedData) => void;\n [Events.LIVE_BACK_BUFFER_REACHED]: (\n event: Events.LIVE_BACK_BUFFER_REACHED,\n data: LiveBackBufferData,\n ) => void;\n [Events.BACK_BUFFER_REACHED]: (\n event: Events.BACK_BUFFER_REACHED,\n data: BackBufferData,\n ) => void;\n [Events.STEERING_MANIFEST_LOADED]: (\n event: Events.STEERING_MANIFEST_LOADED,\n data: SteeringManifestLoadedData,\n ) => void;\n}\nexport interface HlsEventEmitter {\n on(\n event: E,\n listener: HlsListeners[E],\n context?: Context,\n ): void;\n once(\n event: E,\n listener: HlsListeners[E],\n context?: Context,\n ): void;\n\n removeAllListeners(event?: E): void;\n off(\n event: E,\n listener?: HlsListeners[E],\n context?: Context,\n once?: boolean,\n ): void;\n\n listeners(event: E): HlsListeners[E][];\n emit(\n event: E,\n name: E,\n eventObject: Parameters[1],\n ): boolean;\n listenerCount(event: E): number;\n}\n","export enum ErrorTypes {\n // Identifier for a network error (loading error / timeout ...)\n NETWORK_ERROR = 'networkError',\n // Identifier for a media Error (video/parsing/mediasource error)\n MEDIA_ERROR = 'mediaError',\n // EME (encrypted media extensions) errors\n KEY_SYSTEM_ERROR = 'keySystemError',\n // Identifier for a mux Error (demuxing/remuxing)\n MUX_ERROR = 'muxError',\n // Identifier for all other errors\n OTHER_ERROR = 'otherError',\n}\n\nexport enum ErrorDetails {\n KEY_SYSTEM_NO_KEYS = 'keySystemNoKeys',\n KEY_SYSTEM_NO_ACCESS = 'keySystemNoAccess',\n KEY_SYSTEM_NO_SESSION = 'keySystemNoSession',\n KEY_SYSTEM_NO_CONFIGURED_LICENSE = 'keySystemNoConfiguredLicense',\n KEY_SYSTEM_LICENSE_REQUEST_FAILED = 'keySystemLicenseRequestFailed',\n KEY_SYSTEM_SERVER_CERTIFICATE_REQUEST_FAILED = 'keySystemServerCertificateRequestFailed',\n KEY_SYSTEM_SERVER_CERTIFICATE_UPDATE_FAILED = 'keySystemServerCertificateUpdateFailed',\n KEY_SYSTEM_SESSION_UPDATE_FAILED = 'keySystemSessionUpdateFailed',\n KEY_SYSTEM_STATUS_OUTPUT_RESTRICTED = 'keySystemStatusOutputRestricted',\n KEY_SYSTEM_STATUS_INTERNAL_ERROR = 'keySystemStatusInternalError',\n // Identifier for a manifest load error - data: { url : faulty URL, response : { code: error code, text: error text }}\n MANIFEST_LOAD_ERROR = 'manifestLoadError',\n // Identifier for a manifest load timeout - data: { url : faulty URL, response : { code: error code, text: error text }}\n MANIFEST_LOAD_TIMEOUT = 'manifestLoadTimeOut',\n // Identifier for a manifest parsing error - data: { url : faulty URL, reason : error reason}\n MANIFEST_PARSING_ERROR = 'manifestParsingError',\n // Identifier for a manifest with only incompatible codecs error - data: { url : faulty URL, reason : error reason}\n MANIFEST_INCOMPATIBLE_CODECS_ERROR = 'manifestIncompatibleCodecsError',\n // Identifier for a level which contains no fragments - data: { url: faulty URL, reason: \"no fragments found in level\", level: index of the bad level }\n LEVEL_EMPTY_ERROR = 'levelEmptyError',\n // Identifier for a level load error - data: { url : faulty URL, response : { code: error code, text: error text }}\n LEVEL_LOAD_ERROR = 'levelLoadError',\n // Identifier for a level load timeout - data: { url : faulty URL, response : { code: error code, text: error text }}\n LEVEL_LOAD_TIMEOUT = 'levelLoadTimeOut',\n // Identifier for a level parse error - data: { url : faulty URL, error: Error, reason: error message }\n LEVEL_PARSING_ERROR = 'levelParsingError',\n // Identifier for a level switch error - data: { level : faulty level Id, event : error description}\n LEVEL_SWITCH_ERROR = 'levelSwitchError',\n // Identifier for an audio track load error - data: { url : faulty URL, response : { code: error code, text: error text }}\n AUDIO_TRACK_LOAD_ERROR = 'audioTrackLoadError',\n // Identifier for an audio track load timeout - data: { url : faulty URL, response : { code: error code, text: error text }}\n AUDIO_TRACK_LOAD_TIMEOUT = 'audioTrackLoadTimeOut',\n // Identifier for a subtitle track load error - data: { url : faulty URL, response : { code: error code, text: error text }}\n SUBTITLE_LOAD_ERROR = 'subtitleTrackLoadError',\n // Identifier for a subtitle track load timeout - data: { url : faulty URL, response : { code: error code, text: error text }}\n SUBTITLE_TRACK_LOAD_TIMEOUT = 'subtitleTrackLoadTimeOut',\n // Identifier for fragment load error - data: { frag : fragment object, response : { code: error code, text: error text }}\n FRAG_LOAD_ERROR = 'fragLoadError',\n // Identifier for fragment load timeout error - data: { frag : fragment object}\n FRAG_LOAD_TIMEOUT = 'fragLoadTimeOut',\n // Identifier for a fragment decryption error event - data: {id : demuxer Id,frag: fragment object, reason : parsing error description }\n FRAG_DECRYPT_ERROR = 'fragDecryptError',\n // Identifier for a fragment parsing error event - data: { id : demuxer Id, reason : parsing error description }\n // will be renamed DEMUX_PARSING_ERROR and switched to MUX_ERROR in the next major release\n FRAG_PARSING_ERROR = 'fragParsingError',\n // Identifier for a fragment or part load skipped because of a GAP tag or attribute\n FRAG_GAP = 'fragGap',\n // Identifier for a remux alloc error event - data: { id : demuxer Id, frag : fragment object, bytes : nb of bytes on which allocation failed , reason : error text }\n REMUX_ALLOC_ERROR = 'remuxAllocError',\n // Identifier for decrypt key load error - data: { frag : fragment object, response : { code: error code, text: error text }}\n KEY_LOAD_ERROR = 'keyLoadError',\n // Identifier for decrypt key load timeout error - data: { frag : fragment object}\n KEY_LOAD_TIMEOUT = 'keyLoadTimeOut',\n // Triggered when an exception occurs while adding a sourceBuffer to MediaSource - data : { error : exception , mimeType : mimeType }\n BUFFER_ADD_CODEC_ERROR = 'bufferAddCodecError',\n // Triggered when source buffer(s) could not be created using level (manifest CODECS attribute), parsed media, or best guess codec(s) - data: { reason : error reason }\n BUFFER_INCOMPATIBLE_CODECS_ERROR = 'bufferIncompatibleCodecsError',\n // Identifier for a buffer append error - data: append error description\n BUFFER_APPEND_ERROR = 'bufferAppendError',\n // Identifier for a buffer appending error event - data: appending error description\n BUFFER_APPENDING_ERROR = 'bufferAppendingError',\n // Identifier for a buffer stalled error event\n BUFFER_STALLED_ERROR = 'bufferStalledError',\n // Identifier for a buffer full event\n BUFFER_FULL_ERROR = 'bufferFullError',\n // Identifier for a buffer seek over hole event\n BUFFER_SEEK_OVER_HOLE = 'bufferSeekOverHole',\n // Identifier for a buffer nudge on stall (playback is stuck although currentTime is in a buffered area)\n BUFFER_NUDGE_ON_STALL = 'bufferNudgeOnStall',\n // Identifier for an internal exception happening inside hls.js while handling an event\n INTERNAL_EXCEPTION = 'internalException',\n // Identifier for an internal call to abort a loader\n INTERNAL_ABORTED = 'aborted',\n // Uncategorized error\n UNKNOWN = 'unknown',\n}\n","export interface ILogFunction {\n (message?: any, ...optionalParams: any[]): void;\n}\n\nexport interface ILogger {\n trace: ILogFunction;\n debug: ILogFunction;\n log: ILogFunction;\n warn: ILogFunction;\n info: ILogFunction;\n error: ILogFunction;\n}\n\nconst noop: ILogFunction = function () {};\n\nconst fakeLogger: ILogger = {\n trace: noop,\n debug: noop,\n log: noop,\n warn: noop,\n info: noop,\n error: noop,\n};\n\nlet exportedLogger: ILogger = fakeLogger;\n\n// let lastCallTime;\n// function formatMsgWithTimeInfo(type, msg) {\n// const now = Date.now();\n// const diff = lastCallTime ? '+' + (now - lastCallTime) : '0';\n// lastCallTime = now;\n// msg = (new Date(now)).toISOString() + ' | [' + type + '] > ' + msg + ' ( ' + diff + ' ms )';\n// return msg;\n// }\n\nfunction consolePrintFn(type: string): ILogFunction {\n const func: ILogFunction = self.console[type];\n if (func) {\n return func.bind(self.console, `[${type}] >`);\n }\n return noop;\n}\n\nfunction exportLoggerFunctions(\n debugConfig: boolean | ILogger,\n ...functions: string[]\n): void {\n functions.forEach(function (type) {\n exportedLogger[type] = debugConfig[type]\n ? debugConfig[type].bind(debugConfig)\n : consolePrintFn(type);\n });\n}\n\nexport function enableLogs(debugConfig: boolean | ILogger, id: string): void {\n // check that console is available\n if (\n (typeof console === 'object' && debugConfig === true) ||\n typeof debugConfig === 'object'\n ) {\n exportLoggerFunctions(\n debugConfig,\n // Remove out from list here to hard-disable a log-level\n // 'trace',\n 'debug',\n 'log',\n 'info',\n 'warn',\n 'error',\n );\n // Some browsers don't allow to use bind on console object anyway\n // fallback to default if needed\n try {\n exportedLogger.log(\n `Debug logs enabled for \"${id}\" in hls.js version ${__VERSION__}`,\n );\n } catch (e) {\n exportedLogger = fakeLogger;\n }\n } else {\n exportedLogger = fakeLogger;\n }\n}\n\nexport const logger: ILogger = exportedLogger;\n","const DECIMAL_RESOLUTION_REGEX = /^(\\d+)x(\\d+)$/;\nconst ATTR_LIST_REGEX = /(.+?)=(\".*?\"|.*?)(?:,|$)/g;\n\n// adapted from https://github.com/kanongil/node-m3u8parse/blob/master/attrlist.js\nexport class AttrList {\n [key: string]: any;\n\n constructor(attrs: string | Record) {\n if (typeof attrs === 'string') {\n attrs = AttrList.parseAttrList(attrs);\n }\n Object.assign(this, attrs);\n }\n\n get clientAttrs(): string[] {\n return Object.keys(this).filter((attr) => attr.substring(0, 2) === 'X-');\n }\n\n decimalInteger(attrName: string): number {\n const intValue = parseInt(this[attrName], 10);\n if (intValue > Number.MAX_SAFE_INTEGER) {\n return Infinity;\n }\n\n return intValue;\n }\n\n hexadecimalInteger(attrName: string) {\n if (this[attrName]) {\n let stringValue = (this[attrName] || '0x').slice(2);\n stringValue = (stringValue.length & 1 ? '0' : '') + stringValue;\n\n const value = new Uint8Array(stringValue.length / 2);\n for (let i = 0; i < stringValue.length / 2; i++) {\n value[i] = parseInt(stringValue.slice(i * 2, i * 2 + 2), 16);\n }\n\n return value;\n } else {\n return null;\n }\n }\n\n hexadecimalIntegerAsNumber(attrName: string): number {\n const intValue = parseInt(this[attrName], 16);\n if (intValue > Number.MAX_SAFE_INTEGER) {\n return Infinity;\n }\n\n return intValue;\n }\n\n decimalFloatingPoint(attrName: string): number {\n return parseFloat(this[attrName]);\n }\n\n optionalFloat(attrName: string, defaultValue: number): number {\n const value = this[attrName];\n return value ? parseFloat(value) : defaultValue;\n }\n\n enumeratedString(attrName: string): string | undefined {\n return this[attrName];\n }\n\n bool(attrName: string): boolean {\n return this[attrName] === 'YES';\n }\n\n decimalResolution(attrName: string):\n | {\n width: number;\n height: number;\n }\n | undefined {\n const res = DECIMAL_RESOLUTION_REGEX.exec(this[attrName]);\n if (res === null) {\n return undefined;\n }\n\n return {\n width: parseInt(res[1], 10),\n height: parseInt(res[2], 10),\n };\n }\n\n static parseAttrList(input: string): Record {\n let match;\n const attrs = {};\n const quote = '\"';\n ATTR_LIST_REGEX.lastIndex = 0;\n while ((match = ATTR_LIST_REGEX.exec(input)) !== null) {\n let value = match[2];\n\n if (\n value.indexOf(quote) === 0 &&\n value.lastIndexOf(quote) === value.length - 1\n ) {\n value = value.slice(1, -1);\n }\n const name = match[1].trim();\n attrs[name] = value;\n }\n return attrs;\n }\n}\n","import { AttrList } from '../utils/attr-list';\nimport { logger } from '../utils/logger';\n\n// Avoid exporting const enum so that these values can be inlined\nconst enum DateRangeAttribute {\n ID = 'ID',\n CLASS = 'CLASS',\n START_DATE = 'START-DATE',\n DURATION = 'DURATION',\n END_DATE = 'END-DATE',\n END_ON_NEXT = 'END-ON-NEXT',\n PLANNED_DURATION = 'PLANNED-DURATION',\n SCTE35_OUT = 'SCTE35-OUT',\n SCTE35_IN = 'SCTE35-IN',\n}\n\nexport function isDateRangeCueAttribute(attrName: string): boolean {\n return (\n attrName !== DateRangeAttribute.ID &&\n attrName !== DateRangeAttribute.CLASS &&\n attrName !== DateRangeAttribute.START_DATE &&\n attrName !== DateRangeAttribute.DURATION &&\n attrName !== DateRangeAttribute.END_DATE &&\n attrName !== DateRangeAttribute.END_ON_NEXT\n );\n}\n\nexport function isSCTE35Attribute(attrName: string): boolean {\n return (\n attrName === DateRangeAttribute.SCTE35_OUT ||\n attrName === DateRangeAttribute.SCTE35_IN\n );\n}\n\nexport class DateRange {\n public attr: AttrList;\n private _startDate: Date;\n private _endDate?: Date;\n private _badValueForSameId?: string;\n\n constructor(dateRangeAttr: AttrList, dateRangeWithSameId?: DateRange) {\n if (dateRangeWithSameId) {\n const previousAttr = dateRangeWithSameId.attr;\n for (const key in previousAttr) {\n if (\n Object.prototype.hasOwnProperty.call(dateRangeAttr, key) &&\n dateRangeAttr[key] !== previousAttr[key]\n ) {\n logger.warn(\n `DATERANGE tag attribute: \"${key}\" does not match for tags with ID: \"${dateRangeAttr.ID}\"`,\n );\n this._badValueForSameId = key;\n break;\n }\n }\n // Merge DateRange tags with the same ID\n dateRangeAttr = Object.assign(\n new AttrList({}),\n previousAttr,\n dateRangeAttr,\n );\n }\n this.attr = dateRangeAttr;\n this._startDate = new Date(dateRangeAttr[DateRangeAttribute.START_DATE]);\n if (DateRangeAttribute.END_DATE in this.attr) {\n const endDate = new Date(this.attr[DateRangeAttribute.END_DATE]);\n if (Number.isFinite(endDate.getTime())) {\n this._endDate = endDate;\n }\n }\n }\n\n get id(): string {\n return this.attr.ID;\n }\n\n get class(): string {\n return this.attr.CLASS;\n }\n\n get startDate(): Date {\n return this._startDate;\n }\n\n get endDate(): Date | null {\n if (this._endDate) {\n return this._endDate;\n }\n const duration = this.duration;\n if (duration !== null) {\n return new Date(this._startDate.getTime() + duration * 1000);\n }\n return null;\n }\n\n get duration(): number | null {\n if (DateRangeAttribute.DURATION in this.attr) {\n const duration = this.attr.decimalFloatingPoint(\n DateRangeAttribute.DURATION,\n );\n if (Number.isFinite(duration)) {\n return duration;\n }\n } else if (this._endDate) {\n return (this._endDate.getTime() - this._startDate.getTime()) / 1000;\n }\n return null;\n }\n\n get plannedDuration(): number | null {\n if (DateRangeAttribute.PLANNED_DURATION in this.attr) {\n return this.attr.decimalFloatingPoint(\n DateRangeAttribute.PLANNED_DURATION,\n );\n }\n return null;\n }\n\n get endOnNext(): boolean {\n return this.attr.bool(DateRangeAttribute.END_ON_NEXT);\n }\n\n get isValid(): boolean {\n return (\n !!this.id &&\n !this._badValueForSameId &&\n Number.isFinite(this.startDate.getTime()) &&\n (this.duration === null || this.duration >= 0) &&\n (!this.endOnNext || !!this.class)\n );\n }\n}\n","import type {\n HlsPerformanceTiming,\n HlsProgressivePerformanceTiming,\n LoaderStats,\n} from '../types/loader';\n\nexport class LoadStats implements LoaderStats {\n aborted: boolean = false;\n loaded: number = 0;\n retry: number = 0;\n total: number = 0;\n chunkCount: number = 0;\n bwEstimate: number = 0;\n loading: HlsProgressivePerformanceTiming = { start: 0, first: 0, end: 0 };\n parsing: HlsPerformanceTiming = { start: 0, end: 0 };\n buffering: HlsProgressivePerformanceTiming = { start: 0, first: 0, end: 0 };\n}\n","import { buildAbsoluteURL } from 'url-toolkit';\nimport { LevelKey } from './level-key';\nimport { LoadStats } from './load-stats';\nimport { AttrList } from '../utils/attr-list';\nimport type {\n FragmentLoaderContext,\n KeyLoaderContext,\n Loader,\n PlaylistLevelType,\n} from '../types/loader';\nimport type { KeySystemFormats } from '../utils/mediakeys-helper';\n\nexport const enum ElementaryStreamTypes {\n AUDIO = 'audio',\n VIDEO = 'video',\n AUDIOVIDEO = 'audiovideo',\n}\n\nexport interface ElementaryStreamInfo {\n startPTS: number;\n endPTS: number;\n startDTS: number;\n endDTS: number;\n partial?: boolean;\n}\n\nexport type ElementaryStreams = Record<\n ElementaryStreamTypes,\n ElementaryStreamInfo | null\n>;\n\nexport class BaseSegment {\n private _byteRange: [number, number] | null = null;\n private _url: string | null = null;\n\n // baseurl is the URL to the playlist\n public readonly baseurl: string;\n // relurl is the portion of the URL that comes from inside the playlist.\n public relurl?: string;\n // Holds the types of data this fragment supports\n public elementaryStreams: ElementaryStreams = {\n [ElementaryStreamTypes.AUDIO]: null,\n [ElementaryStreamTypes.VIDEO]: null,\n [ElementaryStreamTypes.AUDIOVIDEO]: null,\n };\n\n constructor(baseurl: string) {\n this.baseurl = baseurl;\n }\n\n // setByteRange converts a EXT-X-BYTERANGE attribute into a two element array\n setByteRange(value: string, previous?: BaseSegment) {\n const params = value.split('@', 2);\n let start: number;\n if (params.length === 1) {\n start = previous?.byteRangeEndOffset || 0;\n } else {\n start = parseInt(params[1]);\n }\n this._byteRange = [start, parseInt(params[0]) + start];\n }\n\n get byteRange(): [number, number] | [] {\n if (!this._byteRange) {\n return [];\n }\n\n return this._byteRange;\n }\n\n get byteRangeStartOffset(): number | undefined {\n return this.byteRange[0];\n }\n\n get byteRangeEndOffset(): number | undefined {\n return this.byteRange[1];\n }\n\n get url(): string {\n if (!this._url && this.baseurl && this.relurl) {\n this._url = buildAbsoluteURL(this.baseurl, this.relurl, {\n alwaysNormalize: true,\n });\n }\n return this._url || '';\n }\n\n set url(value: string) {\n this._url = value;\n }\n}\n\n/**\n * Object representing parsed data from an HLS Segment. Found in {@link hls.js#LevelDetails.fragments}.\n */\nexport class Fragment extends BaseSegment {\n private _decryptdata: LevelKey | null = null;\n\n public rawProgramDateTime: string | null = null;\n public programDateTime: number | null = null;\n public tagList: Array = [];\n\n // EXTINF has to be present for a m3u8 to be considered valid\n public duration: number = 0;\n // sn notates the sequence number for a segment, and if set to a string can be 'initSegment'\n public sn: number | 'initSegment' = 0;\n // levelkeys are the EXT-X-KEY tags that apply to this segment for decryption\n // core difference from the private field _decryptdata is the lack of the initialized IV\n // _decryptdata will set the IV for this segment based on the segment number in the fragment\n public levelkeys?: { [key: string]: LevelKey };\n // A string representing the fragment type\n public readonly type: PlaylistLevelType;\n // A reference to the loader. Set while the fragment is loading, and removed afterwards. Used to abort fragment loading\n public loader: Loader | null = null;\n // A reference to the key loader. Set while the key is loading, and removed afterwards. Used to abort key loading\n public keyLoader: Loader | null = null;\n // The level/track index to which the fragment belongs\n public level: number = -1;\n // The continuity counter of the fragment\n public cc: number = 0;\n // The starting Presentation Time Stamp (PTS) of the fragment. Set after transmux complete.\n public startPTS?: number;\n // The ending Presentation Time Stamp (PTS) of the fragment. Set after transmux complete.\n public endPTS?: number;\n // The starting Decode Time Stamp (DTS) of the fragment. Set after transmux complete.\n public startDTS!: number;\n // The ending Decode Time Stamp (DTS) of the fragment. Set after transmux complete.\n public endDTS!: number;\n // The start time of the fragment, as listed in the manifest. Updated after transmux complete.\n public start: number = 0;\n // Set by `updateFragPTSDTS` in level-helper\n public deltaPTS?: number;\n // The maximum starting Presentation Time Stamp (audio/video PTS) of the fragment. Set after transmux complete.\n public maxStartPTS?: number;\n // The minimum ending Presentation Time Stamp (audio/video PTS) of the fragment. Set after transmux complete.\n public minEndPTS?: number;\n // Load/parse timing information\n public stats: LoadStats = new LoadStats();\n // Init Segment bytes (unset for media segments)\n public data?: Uint8Array;\n // A flag indicating whether the segment was downloaded in order to test bitrate, and was not buffered\n public bitrateTest: boolean = false;\n // #EXTINF segment title\n public title: string | null = null;\n // The Media Initialization Section for this segment\n public initSegment: Fragment | null = null;\n // Fragment is the last fragment in the media playlist\n public endList?: boolean;\n // Fragment is marked by an EXT-X-GAP tag indicating that it does not contain media data and should not be loaded\n public gap?: boolean;\n // Deprecated\n public urlId: number = 0;\n\n constructor(type: PlaylistLevelType, baseurl: string) {\n super(baseurl);\n this.type = type;\n }\n\n get decryptdata(): LevelKey | null {\n const { levelkeys } = this;\n if (!levelkeys && !this._decryptdata) {\n return null;\n }\n\n if (!this._decryptdata && this.levelkeys && !this.levelkeys.NONE) {\n const key = this.levelkeys.identity;\n if (key) {\n this._decryptdata = key.getDecryptData(this.sn);\n } else {\n const keyFormats = Object.keys(this.levelkeys);\n if (keyFormats.length === 1) {\n return (this._decryptdata = this.levelkeys[\n keyFormats[0]\n ].getDecryptData(this.sn));\n } else {\n // Multiple keys. key-loader to call Fragment.setKeyFormat based on selected key-system.\n }\n }\n }\n\n return this._decryptdata;\n }\n\n get end(): number {\n return this.start + this.duration;\n }\n\n get endProgramDateTime() {\n if (this.programDateTime === null) {\n return null;\n }\n\n if (!Number.isFinite(this.programDateTime)) {\n return null;\n }\n\n const duration = !Number.isFinite(this.duration) ? 0 : this.duration;\n\n return this.programDateTime + duration * 1000;\n }\n\n get encrypted() {\n // At the m3u8-parser level we need to add support for manifest signalled keyformats\n // when we want the fragment to start reporting that it is encrypted.\n // Currently, keyFormat will only be set for identity keys\n if (this._decryptdata?.encrypted) {\n return true;\n } else if (this.levelkeys) {\n const keyFormats = Object.keys(this.levelkeys);\n const len = keyFormats.length;\n if (len > 1 || (len === 1 && this.levelkeys[keyFormats[0]].encrypted)) {\n return true;\n }\n }\n\n return false;\n }\n\n setKeyFormat(keyFormat: KeySystemFormats) {\n if (this.levelkeys) {\n const key = this.levelkeys[keyFormat];\n if (key && !this._decryptdata) {\n this._decryptdata = key.getDecryptData(this.sn);\n }\n }\n }\n\n abortRequests(): void {\n this.loader?.abort();\n this.keyLoader?.abort();\n }\n\n setElementaryStreamInfo(\n type: ElementaryStreamTypes,\n startPTS: number,\n endPTS: number,\n startDTS: number,\n endDTS: number,\n partial: boolean = false,\n ) {\n const { elementaryStreams } = this;\n const info = elementaryStreams[type];\n if (!info) {\n elementaryStreams[type] = {\n startPTS,\n endPTS,\n startDTS,\n endDTS,\n partial,\n };\n return;\n }\n\n info.startPTS = Math.min(info.startPTS, startPTS);\n info.endPTS = Math.max(info.endPTS, endPTS);\n info.startDTS = Math.min(info.startDTS, startDTS);\n info.endDTS = Math.max(info.endDTS, endDTS);\n }\n\n clearElementaryStreamInfo() {\n const { elementaryStreams } = this;\n elementaryStreams[ElementaryStreamTypes.AUDIO] = null;\n elementaryStreams[ElementaryStreamTypes.VIDEO] = null;\n elementaryStreams[ElementaryStreamTypes.AUDIOVIDEO] = null;\n }\n}\n\n/**\n * Object representing parsed data from an HLS Partial Segment. Found in {@link hls.js#LevelDetails.partList}.\n */\nexport class Part extends BaseSegment {\n public readonly fragOffset: number = 0;\n public readonly duration: number = 0;\n public readonly gap: boolean = false;\n public readonly independent: boolean = false;\n public readonly relurl: string;\n public readonly fragment: Fragment;\n public readonly index: number;\n public stats: LoadStats = new LoadStats();\n\n constructor(\n partAttrs: AttrList,\n frag: Fragment,\n baseurl: string,\n index: number,\n previous?: Part,\n ) {\n super(baseurl);\n this.duration = partAttrs.decimalFloatingPoint('DURATION');\n this.gap = partAttrs.bool('GAP');\n this.independent = partAttrs.bool('INDEPENDENT');\n this.relurl = partAttrs.enumeratedString('URI') as string;\n this.fragment = frag;\n this.index = index;\n const byteRange = partAttrs.enumeratedString('BYTERANGE');\n if (byteRange) {\n this.setByteRange(byteRange, previous);\n }\n if (previous) {\n this.fragOffset = previous.fragOffset + previous.duration;\n }\n }\n\n get start(): number {\n return this.fragment.start + this.fragOffset;\n }\n\n get end(): number {\n return this.start + this.duration;\n }\n\n get loaded(): boolean {\n const { elementaryStreams } = this;\n return !!(\n elementaryStreams.audio ||\n elementaryStreams.video ||\n elementaryStreams.audiovideo\n );\n }\n}\n","import { Part } from './fragment';\nimport type { Fragment } from './fragment';\nimport type { AttrList } from '../utils/attr-list';\nimport type { DateRange } from './date-range';\nimport type { VariableMap } from '../types/level';\n\nconst DEFAULT_TARGET_DURATION = 10;\n\n/**\n * Object representing parsed data from an HLS Media Playlist. Found in {@link hls.js#Level.details}.\n */\nexport class LevelDetails {\n public PTSKnown: boolean = false;\n public alignedSliding: boolean = false;\n public averagetargetduration?: number;\n public endCC: number = 0;\n public endSN: number = 0;\n public fragments: Fragment[];\n public fragmentHint?: Fragment;\n public partList: Part[] | null = null;\n public dateRanges: Record;\n public live: boolean = true;\n public ageHeader: number = 0;\n public advancedDateTime?: number;\n public updated: boolean = true;\n public advanced: boolean = true;\n public availabilityDelay?: number; // Manifest reload synchronization\n public misses: number = 0;\n public startCC: number = 0;\n public startSN: number = 0;\n public startTimeOffset: number | null = null;\n public targetduration: number = 0;\n public totalduration: number = 0;\n public type: string | null = null;\n public url: string;\n public m3u8: string = '';\n public version: number | null = null;\n public canBlockReload: boolean = false;\n public canSkipUntil: number = 0;\n public canSkipDateRanges: boolean = false;\n public skippedSegments: number = 0;\n public recentlyRemovedDateranges?: string[];\n public partHoldBack: number = 0;\n public holdBack: number = 0;\n public partTarget: number = 0;\n public preloadHint?: AttrList;\n public renditionReports?: AttrList[];\n public tuneInGoal: number = 0;\n public deltaUpdateFailed?: boolean;\n public driftStartTime: number = 0;\n public driftEndTime: number = 0;\n public driftStart: number = 0;\n public driftEnd: number = 0;\n public encryptedFragments: Fragment[];\n public playlistParsingError: Error | null = null;\n public variableList: VariableMap | null = null;\n public hasVariableRefs = false;\n\n constructor(baseUrl: string) {\n this.fragments = [];\n this.encryptedFragments = [];\n this.dateRanges = {};\n this.url = baseUrl;\n }\n\n reloaded(previous: LevelDetails | undefined) {\n if (!previous) {\n this.advanced = true;\n this.updated = true;\n return;\n }\n const partSnDiff = this.lastPartSn - previous.lastPartSn;\n const partIndexDiff = this.lastPartIndex - previous.lastPartIndex;\n this.updated =\n this.endSN !== previous.endSN ||\n !!partIndexDiff ||\n !!partSnDiff ||\n !this.live;\n this.advanced =\n this.endSN > previous.endSN ||\n partSnDiff > 0 ||\n (partSnDiff === 0 && partIndexDiff > 0);\n if (this.updated || this.advanced) {\n this.misses = Math.floor(previous.misses * 0.6);\n } else {\n this.misses = previous.misses + 1;\n }\n this.availabilityDelay = previous.availabilityDelay;\n }\n\n get hasProgramDateTime(): boolean {\n if (this.fragments.length) {\n return Number.isFinite(\n this.fragments[this.fragments.length - 1].programDateTime as number,\n );\n }\n return false;\n }\n\n get levelTargetDuration(): number {\n return (\n this.averagetargetduration ||\n this.targetduration ||\n DEFAULT_TARGET_DURATION\n );\n }\n\n get drift(): number {\n const runTime = this.driftEndTime - this.driftStartTime;\n if (runTime > 0) {\n const runDuration = this.driftEnd - this.driftStart;\n return (runDuration * 1000) / runTime;\n }\n return 1;\n }\n\n get edge(): number {\n return this.partEnd || this.fragmentEnd;\n }\n\n get partEnd(): number {\n if (this.partList?.length) {\n return this.partList[this.partList.length - 1].end;\n }\n return this.fragmentEnd;\n }\n\n get fragmentEnd(): number {\n if (this.fragments?.length) {\n return this.fragments[this.fragments.length - 1].end;\n }\n return 0;\n }\n\n get age(): number {\n if (this.advancedDateTime) {\n return Math.max(Date.now() - this.advancedDateTime, 0) / 1000;\n }\n return 0;\n }\n\n get lastPartIndex(): number {\n if (this.partList?.length) {\n return this.partList[this.partList.length - 1].index;\n }\n return -1;\n }\n\n get lastPartSn(): number {\n if (this.partList?.length) {\n return this.partList[this.partList.length - 1].fragment.sn as number;\n }\n return this.endSN;\n }\n}\n","export function base64ToBase64Url(base64encodedStr: string): string {\n return base64encodedStr\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n}\n\nexport function strToBase64Encode(str: string): string {\n return btoa(str);\n}\n\nexport function base64DecodeToStr(str: string): string {\n return atob(str);\n}\n\nexport function base64Encode(input: Uint8Array): string {\n return btoa(String.fromCharCode(...input));\n}\n\nexport function base64UrlEncode(input: Uint8Array): string {\n return base64ToBase64Url(base64Encode(input));\n}\n\nexport function base64Decode(base64encodedStr: string): Uint8Array {\n return Uint8Array.from(atob(base64encodedStr), (c) => c.charCodeAt(0));\n}\n","import { base64Decode } from './numeric-encoding-utils';\n\nfunction getKeyIdBytes(str: string): Uint8Array {\n const keyIdbytes = strToUtf8array(str).subarray(0, 16);\n const paddedkeyIdbytes = new Uint8Array(16);\n paddedkeyIdbytes.set(keyIdbytes, 16 - keyIdbytes.length);\n return paddedkeyIdbytes;\n}\n\nexport function changeEndianness(keyId: Uint8Array) {\n const swap = function (array: Uint8Array, from: number, to: number) {\n const cur = array[from];\n array[from] = array[to];\n array[to] = cur;\n };\n\n swap(keyId, 0, 3);\n swap(keyId, 1, 2);\n swap(keyId, 4, 5);\n swap(keyId, 6, 7);\n}\n\nexport function convertDataUriToArrayBytes(uri: string): Uint8Array | null {\n // data:[\n const colonsplit = uri.split(':');\n let keydata: Uint8Array | null = null;\n if (colonsplit[0] === 'data' && colonsplit.length === 2) {\n const semicolonsplit = colonsplit[1].split(';');\n const commasplit = semicolonsplit[semicolonsplit.length - 1].split(',');\n if (commasplit.length === 2) {\n const isbase64 = commasplit[0] === 'base64';\n const data = commasplit[1];\n if (isbase64) {\n semicolonsplit.splice(-1, 1); // remove from processing\n keydata = base64Decode(data);\n } else {\n keydata = getKeyIdBytes(data);\n }\n }\n }\n return keydata;\n}\n\nexport function strToUtf8array(str: string): Uint8Array {\n return Uint8Array.from(unescape(encodeURIComponent(str)), (c) =>\n c.charCodeAt(0),\n );\n}\n","/** returns `undefined` is `self` is missing, e.g. in node */\nexport const optionalSelf = typeof self !== 'undefined' ? self : undefined;\n","import { optionalSelf } from './global';\nimport { changeEndianness } from './keysystem-util';\nimport { base64Decode } from './numeric-encoding-utils';\nimport type { DRMSystemOptions, EMEControllerConfig } from '../config';\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Navigator/requestMediaKeySystemAccess\n */\nexport const enum KeySystems {\n CLEARKEY = 'org.w3.clearkey',\n FAIRPLAY = 'com.apple.fps',\n PLAYREADY = 'com.microsoft.playready',\n WIDEVINE = 'com.widevine.alpha',\n}\n\n// Playlist #EXT-X-KEY KEYFORMAT values\nexport const enum KeySystemFormats {\n CLEARKEY = 'org.w3.clearkey',\n FAIRPLAY = 'com.apple.streamingkeydelivery',\n PLAYREADY = 'com.microsoft.playready',\n WIDEVINE = 'urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed',\n}\n\nexport function keySystemFormatToKeySystemDomain(\n format: KeySystemFormats,\n): KeySystems | undefined {\n switch (format) {\n case KeySystemFormats.FAIRPLAY:\n return KeySystems.FAIRPLAY;\n case KeySystemFormats.PLAYREADY:\n return KeySystems.PLAYREADY;\n case KeySystemFormats.WIDEVINE:\n return KeySystems.WIDEVINE;\n case KeySystemFormats.CLEARKEY:\n return KeySystems.CLEARKEY;\n }\n}\n\n// System IDs for which we can extract a key ID from \"encrypted\" event PSSH\nexport const enum KeySystemIds {\n CENC = '1077efecc0b24d02ace33c1e52e2fb4b',\n CLEARKEY = 'e2719d58a985b3c9781ab030af78d30e',\n FAIRPLAY = '94ce86fb07ff4f43adb893d2fa968ca2',\n PLAYREADY = '9a04f07998404286ab92e65be0885f95',\n WIDEVINE = 'edef8ba979d64acea3c827dcd51d21ed',\n}\n\nexport function keySystemIdToKeySystemDomain(\n systemId: KeySystemIds,\n): KeySystems | undefined {\n if (systemId === KeySystemIds.WIDEVINE) {\n return KeySystems.WIDEVINE;\n } else if (systemId === KeySystemIds.PLAYREADY) {\n return KeySystems.PLAYREADY;\n } else if (\n systemId === KeySystemIds.CENC ||\n systemId === KeySystemIds.CLEARKEY\n ) {\n return KeySystems.CLEARKEY;\n }\n}\n\nexport function keySystemDomainToKeySystemFormat(\n keySystem: KeySystems,\n): KeySystemFormats | undefined {\n switch (keySystem) {\n case KeySystems.FAIRPLAY:\n return KeySystemFormats.FAIRPLAY;\n case KeySystems.PLAYREADY:\n return KeySystemFormats.PLAYREADY;\n case KeySystems.WIDEVINE:\n return KeySystemFormats.WIDEVINE;\n case KeySystems.CLEARKEY:\n return KeySystemFormats.CLEARKEY;\n }\n}\n\nexport function getKeySystemsForConfig(\n config: EMEControllerConfig,\n): KeySystems[] {\n const { drmSystems, widevineLicenseUrl } = config;\n const keySystemsToAttempt: KeySystems[] = drmSystems\n ? [\n KeySystems.FAIRPLAY,\n KeySystems.WIDEVINE,\n KeySystems.PLAYREADY,\n KeySystems.CLEARKEY,\n ].filter((keySystem) => !!drmSystems[keySystem])\n : [];\n if (!keySystemsToAttempt[KeySystems.WIDEVINE] && widevineLicenseUrl) {\n keySystemsToAttempt.push(KeySystems.WIDEVINE);\n }\n return keySystemsToAttempt;\n}\n\nexport type MediaKeyFunc = (\n keySystem: KeySystems,\n supportedConfigurations: MediaKeySystemConfiguration[],\n) => Promise;\n\nexport const requestMediaKeySystemAccess = (function (): MediaKeyFunc | null {\n if (optionalSelf?.navigator?.requestMediaKeySystemAccess) {\n return self.navigator.requestMediaKeySystemAccess.bind(self.navigator);\n } else {\n return null;\n }\n})();\n\n/**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/MediaKeySystemConfiguration\n */\nexport function getSupportedMediaKeySystemConfigurations(\n keySystem: KeySystems,\n audioCodecs: string[],\n videoCodecs: string[],\n drmSystemOptions: DRMSystemOptions,\n): MediaKeySystemConfiguration[] {\n let initDataTypes: string[];\n switch (keySystem) {\n case KeySystems.FAIRPLAY:\n initDataTypes = ['cenc', 'sinf'];\n break;\n case KeySystems.WIDEVINE:\n case KeySystems.PLAYREADY:\n initDataTypes = ['cenc'];\n break;\n case KeySystems.CLEARKEY:\n initDataTypes = ['cenc', 'keyids'];\n break;\n default:\n throw new Error(`Unknown key-system: ${keySystem}`);\n }\n return createMediaKeySystemConfigurations(\n initDataTypes,\n audioCodecs,\n videoCodecs,\n drmSystemOptions,\n );\n}\n\nfunction createMediaKeySystemConfigurations(\n initDataTypes: string[],\n audioCodecs: string[],\n videoCodecs: string[],\n drmSystemOptions: DRMSystemOptions,\n): MediaKeySystemConfiguration[] {\n const baseConfig: MediaKeySystemConfiguration = {\n initDataTypes: initDataTypes,\n persistentState: drmSystemOptions.persistentState || 'optional',\n distinctiveIdentifier: drmSystemOptions.distinctiveIdentifier || 'optional',\n sessionTypes: drmSystemOptions.sessionTypes || [\n drmSystemOptions.sessionType || 'temporary',\n ],\n audioCapabilities: audioCodecs.map((codec) => ({\n contentType: `audio/mp4; codecs=\"${codec}\"`,\n robustness: drmSystemOptions.audioRobustness || '',\n encryptionScheme: drmSystemOptions.audioEncryptionScheme || null,\n })),\n videoCapabilities: videoCodecs.map((codec) => ({\n contentType: `video/mp4; codecs=\"${codec}\"`,\n robustness: drmSystemOptions.videoRobustness || '',\n encryptionScheme: drmSystemOptions.videoEncryptionScheme || null,\n })),\n };\n\n return [baseConfig];\n}\n\nexport function parsePlayReadyWRM(keyBytes: Uint8Array): Uint8Array | null {\n const keyBytesUtf16 = new Uint16Array(\n keyBytes.buffer,\n keyBytes.byteOffset,\n keyBytes.byteLength / 2,\n );\n const keyByteStr = String.fromCharCode.apply(null, Array.from(keyBytesUtf16));\n\n // Parse Playready WRMHeader XML\n const xmlKeyBytes = keyByteStr.substring(\n keyByteStr.indexOf('<'),\n keyByteStr.length,\n );\n const parser = new DOMParser();\n const xmlDoc = parser.parseFromString(xmlKeyBytes, 'text/xml');\n const keyData = xmlDoc.getElementsByTagName('KID')[0];\n if (keyData) {\n const keyId = keyData.childNodes[0]\n ? keyData.childNodes[0].nodeValue\n : keyData.getAttribute('VALUE');\n if (keyId) {\n const keyIdArray = base64Decode(keyId).subarray(0, 16);\n // KID value in PRO is a base64-encoded little endian GUID interpretation of UUID\n // KID value in ‘tenc’ is a big endian UUID GUID interpretation of UUID\n changeEndianness(keyIdArray);\n return keyIdArray;\n }\n }\n return null;\n}\n","export function sliceUint8(\n array: Uint8Array,\n start?: number,\n end?: number,\n): Uint8Array {\n // @ts-expect-error This polyfills IE11 usage of Uint8Array slice.\n // It always exists in the TypeScript definition so fails, but it fails at runtime on IE11.\n return Uint8Array.prototype.slice\n ? array.slice(start, end)\n : new Uint8Array(Array.prototype.slice.call(array, start, end));\n}\n","type RawFrame = { type: string; size: number; data: Uint8Array };\n\n// breaking up those two types in order to clarify what is happening in the decoding path.\ntype DecodedFrame = { key: string; data: T; info?: any };\nexport type Frame = DecodedFrame;\n\n/**\n * Returns true if an ID3 header can be found at offset in data\n * @param data - The data to search\n * @param offset - The offset at which to start searching\n */\nexport const isHeader = (data: Uint8Array, offset: number): boolean => {\n /*\n * http://id3.org/id3v2.3.0\n * [0] = 'I'\n * [1] = 'D'\n * [2] = '3'\n * [3,4] = {Version}\n * [5] = {Flags}\n * [6-9] = {ID3 Size}\n *\n * An ID3v2 tag can be detected with the following pattern:\n * $49 44 33 yy yy xx zz zz zz zz\n * Where yy is less than $FF, xx is the 'flags' byte and zz is less than $80\n */\n if (offset + 10 <= data.length) {\n // look for 'ID3' identifier\n if (\n data[offset] === 0x49 &&\n data[offset + 1] === 0x44 &&\n data[offset + 2] === 0x33\n ) {\n // check version is within range\n if (data[offset + 3] < 0xff && data[offset + 4] < 0xff) {\n // check size is within range\n if (\n data[offset + 6] < 0x80 &&\n data[offset + 7] < 0x80 &&\n data[offset + 8] < 0x80 &&\n data[offset + 9] < 0x80\n ) {\n return true;\n }\n }\n }\n }\n\n return false;\n};\n\n/**\n * Returns true if an ID3 footer can be found at offset in data\n * @param data - The data to search\n * @param offset - The offset at which to start searching\n */\nexport const isFooter = (data: Uint8Array, offset: number): boolean => {\n /*\n * The footer is a copy of the header, but with a different identifier\n */\n if (offset + 10 <= data.length) {\n // look for '3DI' identifier\n if (\n data[offset] === 0x33 &&\n data[offset + 1] === 0x44 &&\n data[offset + 2] === 0x49\n ) {\n // check version is within range\n if (data[offset + 3] < 0xff && data[offset + 4] < 0xff) {\n // check size is within range\n if (\n data[offset + 6] < 0x80 &&\n data[offset + 7] < 0x80 &&\n data[offset + 8] < 0x80 &&\n data[offset + 9] < 0x80\n ) {\n return true;\n }\n }\n }\n }\n\n return false;\n};\n\n/**\n * Returns any adjacent ID3 tags found in data starting at offset, as one block of data\n * @param data - The data to search in\n * @param offset - The offset at which to start searching\n * @returns the block of data containing any ID3 tags found\n * or *undefined* if no header is found at the starting offset\n */\nexport const getID3Data = (\n data: Uint8Array,\n offset: number,\n): Uint8Array | undefined => {\n const front = offset;\n let length = 0;\n\n while (isHeader(data, offset)) {\n // ID3 header is 10 bytes\n length += 10;\n\n const size = readSize(data, offset + 6);\n length += size;\n\n if (isFooter(data, offset + 10)) {\n // ID3 footer is 10 bytes\n length += 10;\n }\n\n offset += length;\n }\n\n if (length > 0) {\n return data.subarray(front, front + length);\n }\n\n return undefined;\n};\n\nconst readSize = (data: Uint8Array, offset: number): number => {\n let size = 0;\n size = (data[offset] & 0x7f) << 21;\n size |= (data[offset + 1] & 0x7f) << 14;\n size |= (data[offset + 2] & 0x7f) << 7;\n size |= data[offset + 3] & 0x7f;\n return size;\n};\n\nexport const canParse = (data: Uint8Array, offset: number): boolean => {\n return (\n isHeader(data, offset) &&\n readSize(data, offset + 6) + 10 <= data.length - offset\n );\n};\n\n/**\n * Searches for the Elementary Stream timestamp found in the ID3 data chunk\n * @param data - Block of data containing one or more ID3 tags\n */\nexport const getTimeStamp = (data: Uint8Array): number | undefined => {\n const frames: Frame[] = getID3Frames(data);\n\n for (let i = 0; i < frames.length; i++) {\n const frame = frames[i];\n\n if (isTimeStampFrame(frame)) {\n return readTimeStamp(frame as DecodedFrame);\n }\n }\n\n return undefined;\n};\n\n/**\n * Returns true if the ID3 frame is an Elementary Stream timestamp frame\n */\nexport const isTimeStampFrame = (frame: Frame): boolean => {\n return (\n frame &&\n frame.key === 'PRIV' &&\n frame.info === 'com.apple.streaming.transportStreamTimestamp'\n );\n};\n\nconst getFrameData = (data: Uint8Array): RawFrame => {\n /*\n Frame ID $xx xx xx xx (four characters)\n Size $xx xx xx xx\n Flags $xx xx\n */\n const type: string = String.fromCharCode(data[0], data[1], data[2], data[3]);\n const size: number = readSize(data, 4);\n\n // skip frame id, size, and flags\n const offset = 10;\n\n return { type, size, data: data.subarray(offset, offset + size) };\n};\n\n/**\n * Returns an array of ID3 frames found in all the ID3 tags in the id3Data\n * @param id3Data - The ID3 data containing one or more ID3 tags\n */\nexport const getID3Frames = (id3Data: Uint8Array): Frame[] => {\n let offset = 0;\n const frames: Frame[] = [];\n\n while (isHeader(id3Data, offset)) {\n const size = readSize(id3Data, offset + 6);\n // skip past ID3 header\n offset += 10;\n const end = offset + size;\n // loop through frames in the ID3 tag\n while (offset + 8 < end) {\n const frameData: RawFrame = getFrameData(id3Data.subarray(offset));\n const frame: Frame | undefined = decodeFrame(frameData);\n if (frame) {\n frames.push(frame);\n }\n\n // skip frame header and frame data\n offset += frameData.size + 10;\n }\n\n if (isFooter(id3Data, offset)) {\n offset += 10;\n }\n }\n\n return frames;\n};\n\nexport const decodeFrame = (frame: RawFrame): Frame | undefined => {\n if (frame.type === 'PRIV') {\n return decodePrivFrame(frame);\n } else if (frame.type[0] === 'W') {\n return decodeURLFrame(frame);\n }\n\n return decodeTextFrame(frame);\n};\n\nconst decodePrivFrame = (\n frame: RawFrame,\n): DecodedFrame | undefined => {\n /*\n Format: \\0\n */\n if (frame.size < 2) {\n return undefined;\n }\n\n const owner = utf8ArrayToStr(frame.data, true);\n const privateData = new Uint8Array(frame.data.subarray(owner.length + 1));\n\n return { key: frame.type, info: owner, data: privateData.buffer };\n};\n\nconst decodeTextFrame = (frame: RawFrame): DecodedFrame | undefined => {\n if (frame.size < 2) {\n return undefined;\n }\n\n if (frame.type === 'TXXX') {\n /*\n Format:\n [0] = {Text Encoding}\n [1-?] = {Description}\\0{Value}\n */\n let index = 1;\n const description = utf8ArrayToStr(frame.data.subarray(index), true);\n\n index += description.length + 1;\n const value = utf8ArrayToStr(frame.data.subarray(index));\n\n return { key: frame.type, info: description, data: value };\n }\n /*\n Format:\n [0] = {Text Encoding}\n [1-?] = {Value}\n */\n const text = utf8ArrayToStr(frame.data.subarray(1));\n return { key: frame.type, data: text };\n};\n\nconst decodeURLFrame = (frame: RawFrame): DecodedFrame | undefined => {\n if (frame.type === 'WXXX') {\n /*\n Format:\n [0] = {Text Encoding}\n [1-?] = {Description}\\0{URL}\n */\n if (frame.size < 2) {\n return undefined;\n }\n\n let index = 1;\n const description: string = utf8ArrayToStr(\n frame.data.subarray(index),\n true,\n );\n\n index += description.length + 1;\n const value: string = utf8ArrayToStr(frame.data.subarray(index));\n\n return { key: frame.type, info: description, data: value };\n }\n /*\n Format:\n [0-?] = {URL}\n */\n const url: string = utf8ArrayToStr(frame.data);\n return { key: frame.type, data: url };\n};\n\nconst readTimeStamp = (\n timeStampFrame: DecodedFrame,\n): number | undefined => {\n if (timeStampFrame.data.byteLength === 8) {\n const data = new Uint8Array(timeStampFrame.data);\n // timestamp is 33 bit expressed as a big-endian eight-octet number,\n // with the upper 31 bits set to zero.\n const pts33Bit = data[3] & 0x1;\n let timestamp =\n (data[4] << 23) + (data[5] << 15) + (data[6] << 7) + data[7];\n timestamp /= 45;\n\n if (pts33Bit) {\n timestamp += 47721858.84;\n } // 2^32 / 90\n\n return Math.round(timestamp);\n }\n\n return undefined;\n};\n\n// http://stackoverflow.com/questions/8936984/uint8array-to-string-in-javascript/22373197\n// http://www.onicos.com/staff/iz/amuse/javascript/expert/utf.txt\n/* utf.js - UTF-8 <=> UTF-16 convertion\n *\n * Copyright (C) 1999 Masanao Izumo \n * Version: 1.0\n * LastModified: Dec 25 1999\n * This library is free. You can redistribute it and/or modify it.\n */\nexport const utf8ArrayToStr = (\n array: Uint8Array,\n exitOnNull: boolean = false,\n): string => {\n const decoder = getTextDecoder();\n if (decoder) {\n const decoded = decoder.decode(array);\n\n if (exitOnNull) {\n // grab up to the first null\n const idx = decoded.indexOf('\\0');\n return idx !== -1 ? decoded.substring(0, idx) : decoded;\n }\n\n // remove any null characters\n return decoded.replace(/\\0/g, '');\n }\n\n const len = array.length;\n let c;\n let char2;\n let char3;\n let out = '';\n let i = 0;\n while (i < len) {\n c = array[i++];\n if (c === 0x00 && exitOnNull) {\n return out;\n } else if (c === 0x00 || c === 0x03) {\n // If the character is 3 (END_OF_TEXT) or 0 (NULL) then skip it\n continue;\n }\n switch (c >> 4) {\n case 0:\n case 1:\n case 2:\n case 3:\n case 4:\n case 5:\n case 6:\n case 7:\n // 0xxxxxxx\n out += String.fromCharCode(c);\n break;\n case 12:\n case 13:\n // 110x xxxx 10xx xxxx\n char2 = array[i++];\n out += String.fromCharCode(((c & 0x1f) << 6) | (char2 & 0x3f));\n break;\n case 14:\n // 1110 xxxx 10xx xxxx 10xx xxxx\n char2 = array[i++];\n char3 = array[i++];\n out += String.fromCharCode(\n ((c & 0x0f) << 12) | ((char2 & 0x3f) << 6) | ((char3 & 0x3f) << 0),\n );\n break;\n default:\n }\n }\n return out;\n};\n\nexport const testables = {\n decodeTextFrame: decodeTextFrame,\n};\n\nlet decoder: TextDecoder;\n\nfunction getTextDecoder() {\n // On Play Station 4, TextDecoder is defined but partially implemented.\n // Manual decoding option is preferable\n if (navigator.userAgent.includes('PlayStation 4')) {\n return;\n }\n\n if (!decoder && typeof self.TextDecoder !== 'undefined') {\n decoder = new self.TextDecoder('utf-8');\n }\n\n return decoder;\n}\n","/**\n * hex dump helper class\n */\n\nconst Hex = {\n hexDump: function (array: Uint8Array) {\n let str = '';\n for (let i = 0; i < array.length; i++) {\n let h = array[i].toString(16);\n if (h.length < 2) {\n h = '0' + h;\n }\n\n str += h;\n }\n return str;\n },\n};\n\nexport default Hex;\n","import { ElementaryStreamTypes } from '../loader/fragment';\nimport { sliceUint8 } from './typed-array';\nimport { utf8ArrayToStr } from '../demux/id3';\nimport { logger } from '../utils/logger';\nimport Hex from './hex';\nimport type { KeySystemIds } from './mediakeys-helper';\nimport type { PassthroughTrack, UserdataSample } from '../types/demuxer';\nimport type { DecryptData } from '../loader/level-key';\n\nconst UINT32_MAX = Math.pow(2, 32) - 1;\nconst push = [].push;\n\n// We are using fixed track IDs for driving the MP4 remuxer\n// instead of following the TS PIDs.\n// There is no reason not to do this and some browsers/SourceBuffer-demuxers\n// may not like if there are TrackID \"switches\"\n// See https://github.com/video-dev/hls.js/issues/1331\n// Here we are mapping our internal track types to constant MP4 track IDs\n// With MSE currently one can only have one track of each, and we are muxing\n// whatever video/audio rendition in them.\nexport const RemuxerTrackIdConfig = {\n video: 1,\n audio: 2,\n id3: 3,\n text: 4,\n};\n\nexport function bin2str(data: Uint8Array): string {\n return String.fromCharCode.apply(null, data);\n}\n\nexport function readUint16(buffer: Uint8Array, offset: number): number {\n const val = (buffer[offset] << 8) | buffer[offset + 1];\n return val < 0 ? 65536 + val : val;\n}\n\nexport function readUint32(buffer: Uint8Array, offset: number): number {\n const val = readSint32(buffer, offset);\n return val < 0 ? 4294967296 + val : val;\n}\n\nexport function readUint64(buffer: Uint8Array, offset: number) {\n let result = readUint32(buffer, offset);\n result *= Math.pow(2, 32);\n result += readUint32(buffer, offset + 4);\n return result;\n}\n\nexport function readSint32(buffer: Uint8Array, offset: number): number {\n return (\n (buffer[offset] << 24) |\n (buffer[offset + 1] << 16) |\n (buffer[offset + 2] << 8) |\n buffer[offset + 3]\n );\n}\n\nexport function writeUint32(buffer: Uint8Array, offset: number, value: number) {\n buffer[offset] = value >> 24;\n buffer[offset + 1] = (value >> 16) & 0xff;\n buffer[offset + 2] = (value >> 8) & 0xff;\n buffer[offset + 3] = value & 0xff;\n}\n\n// Find \"moof\" box\nexport function hasMoofData(data: Uint8Array): boolean {\n const end = data.byteLength;\n for (let i = 0; i < end; ) {\n const size = readUint32(data, i);\n if (\n size > 8 &&\n data[i + 4] === 0x6d &&\n data[i + 5] === 0x6f &&\n data[i + 6] === 0x6f &&\n data[i + 7] === 0x66\n ) {\n return true;\n }\n i = size > 1 ? i + size : end;\n }\n return false;\n}\n\n// Find the data for a box specified by its path\nexport function findBox(data: Uint8Array, path: string[]): Uint8Array[] {\n const results = [] as Uint8Array[];\n if (!path.length) {\n // short-circuit the search for empty paths\n return results;\n }\n const end = data.byteLength;\n\n for (let i = 0; i < end; ) {\n const size = readUint32(data, i);\n const type = bin2str(data.subarray(i + 4, i + 8));\n const endbox = size > 1 ? i + size : end;\n if (type === path[0]) {\n if (path.length === 1) {\n // this is the end of the path and we've found the box we were\n // looking for\n results.push(data.subarray(i + 8, endbox));\n } else {\n // recursively search for the next box along the path\n const subresults = findBox(data.subarray(i + 8, endbox), path.slice(1));\n if (subresults.length) {\n push.apply(results, subresults);\n }\n }\n }\n i = endbox;\n }\n\n // we've finished searching all of data\n return results;\n}\n\ntype SidxInfo = {\n earliestPresentationTime: number;\n timescale: number;\n version: number;\n referencesCount: number;\n references: any[];\n};\n\nexport function parseSegmentIndex(sidx: Uint8Array): SidxInfo | null {\n const references: any[] = [];\n\n const version = sidx[0];\n\n // set initial offset, we skip the reference ID (not needed)\n let index = 8;\n\n const timescale = readUint32(sidx, index);\n index += 4;\n\n let earliestPresentationTime = 0;\n let firstOffset = 0;\n\n if (version === 0) {\n earliestPresentationTime = readUint32(sidx, index);\n firstOffset = readUint32(sidx, index + 4);\n index += 8;\n } else {\n earliestPresentationTime = readUint64(sidx, index);\n firstOffset = readUint64(sidx, index + 8);\n index += 16;\n }\n\n // skip reserved\n index += 2;\n\n let startByte = sidx.length + firstOffset;\n\n const referencesCount = readUint16(sidx, index);\n index += 2;\n\n for (let i = 0; i < referencesCount; i++) {\n let referenceIndex = index;\n\n const referenceInfo = readUint32(sidx, referenceIndex);\n referenceIndex += 4;\n\n const referenceSize = referenceInfo & 0x7fffffff;\n const referenceType = (referenceInfo & 0x80000000) >>> 31;\n\n if (referenceType === 1) {\n logger.warn('SIDX has hierarchical references (not supported)');\n return null;\n }\n\n const subsegmentDuration = readUint32(sidx, referenceIndex);\n referenceIndex += 4;\n\n references.push({\n referenceSize,\n subsegmentDuration, // unscaled\n info: {\n duration: subsegmentDuration / timescale,\n start: startByte,\n end: startByte + referenceSize - 1,\n },\n });\n\n startByte += referenceSize;\n\n // Skipping 1 bit for |startsWithSap|, 3 bits for |sapType|, and 28 bits\n // for |sapDelta|.\n referenceIndex += 4;\n\n // skip to next ref\n index = referenceIndex;\n }\n\n return {\n earliestPresentationTime,\n timescale,\n version,\n referencesCount,\n references,\n };\n}\n\n/**\n * Parses an MP4 initialization segment and extracts stream type and\n * timescale values for any declared tracks. Timescale values indicate the\n * number of clock ticks per second to assume for time-based values\n * elsewhere in the MP4.\n *\n * To determine the start time of an MP4, you need two pieces of\n * information: the timescale unit and the earliest base media decode\n * time. Multiple timescales can be specified within an MP4 but the\n * base media decode time is always expressed in the timescale from\n * the media header box for the track:\n * ```\n * moov > trak > mdia > mdhd.timescale\n * moov > trak > mdia > hdlr\n * ```\n * @param initSegment the bytes of the init segment\n * @returns a hash of track type to timescale values or null if\n * the init segment is malformed.\n */\n\nexport interface InitDataTrack {\n timescale: number;\n id: number;\n codec: string;\n}\n\ntype HdlrType = ElementaryStreamTypes.AUDIO | ElementaryStreamTypes.VIDEO;\n\nexport interface InitData extends Array {\n [index: number]:\n | {\n timescale: number;\n type: HdlrType;\n default?: {\n duration: number;\n flags: number;\n };\n }\n | undefined;\n audio?: InitDataTrack;\n video?: InitDataTrack;\n caption?: InitDataTrack;\n}\n\nexport function parseInitSegment(initSegment: Uint8Array): InitData {\n const result: InitData = [];\n const traks = findBox(initSegment, ['moov', 'trak']);\n for (let i = 0; i < traks.length; i++) {\n const trak = traks[i];\n const tkhd = findBox(trak, ['tkhd'])[0];\n if (tkhd) {\n let version = tkhd[0];\n const trackId = readUint32(tkhd, version === 0 ? 12 : 20);\n const mdhd = findBox(trak, ['mdia', 'mdhd'])[0];\n if (mdhd) {\n version = mdhd[0];\n const timescale = readUint32(mdhd, version === 0 ? 12 : 20);\n const hdlr = findBox(trak, ['mdia', 'hdlr'])[0];\n if (hdlr) {\n const hdlrType = bin2str(hdlr.subarray(8, 12));\n const type: HdlrType | undefined = {\n soun: ElementaryStreamTypes.AUDIO as const,\n vide: ElementaryStreamTypes.VIDEO as const,\n }[hdlrType];\n if (type) {\n // Parse codec details\n const stsd = findBox(trak, ['mdia', 'minf', 'stbl', 'stsd'])[0];\n const stsdData = parseStsd(stsd);\n result[trackId] = { timescale, type };\n result[type] = { timescale, id: trackId, ...stsdData };\n }\n }\n }\n }\n }\n\n const trex = findBox(initSegment, ['moov', 'mvex', 'trex']);\n trex.forEach((trex) => {\n const trackId = readUint32(trex, 4);\n const track = result[trackId];\n if (track) {\n track.default = {\n duration: readUint32(trex, 12),\n flags: readUint32(trex, 20),\n };\n }\n });\n\n return result;\n}\n\nfunction parseStsd(stsd: Uint8Array): { codec: string; encrypted: boolean } {\n const sampleEntries = stsd.subarray(8);\n const sampleEntriesEnd = sampleEntries.subarray(8 + 78);\n const fourCC = bin2str(sampleEntries.subarray(4, 8));\n let codec = fourCC;\n const encrypted = fourCC === 'enca' || fourCC === 'encv';\n if (encrypted) {\n const encBox = findBox(sampleEntries, [fourCC])[0];\n const encBoxChildren = encBox.subarray(fourCC === 'enca' ? 28 : 78);\n const sinfs = findBox(encBoxChildren, ['sinf']);\n sinfs.forEach((sinf) => {\n const schm = findBox(sinf, ['schm'])[0];\n if (schm) {\n const scheme = bin2str(schm.subarray(4, 8));\n if (scheme === 'cbcs' || scheme === 'cenc') {\n const frma = findBox(sinf, ['frma'])[0];\n if (frma) {\n // for encrypted content codec fourCC will be in frma\n codec = bin2str(frma);\n }\n }\n }\n });\n }\n switch (codec) {\n case 'avc1':\n case 'avc2':\n case 'avc3':\n case 'avc4': {\n // extract profile + compatibility + level out of avcC box\n const avcCBox = findBox(sampleEntriesEnd, ['avcC'])[0];\n codec += '.' + toHex(avcCBox[1]) + toHex(avcCBox[2]) + toHex(avcCBox[3]);\n break;\n }\n case 'mp4a': {\n const codecBox = findBox(sampleEntries, [fourCC])[0];\n const esdsBox = findBox(codecBox.subarray(28), ['esds'])[0];\n if (esdsBox && esdsBox.length > 12) {\n let i = 4;\n // ES Descriptor tag\n if (esdsBox[i++] !== 0x03) {\n break;\n }\n i = skipBERInteger(esdsBox, i);\n i += 2; // skip es_id;\n const flags = esdsBox[i++];\n if (flags & 0x80) {\n i += 2; // skip dependency es_id\n }\n if (flags & 0x40) {\n i += esdsBox[i++]; // skip URL\n }\n // Decoder config descriptor\n if (esdsBox[i++] !== 0x04) {\n break;\n }\n i = skipBERInteger(esdsBox, i);\n const objectType = esdsBox[i++];\n if (objectType === 0x40) {\n codec += '.' + toHex(objectType);\n } else {\n break;\n }\n i += 12;\n // Decoder specific info\n if (esdsBox[i++] !== 0x05) {\n break;\n }\n i = skipBERInteger(esdsBox, i);\n const firstByte = esdsBox[i++];\n let audioObjectType = (firstByte & 0xf8) >> 3;\n if (audioObjectType === 31) {\n audioObjectType +=\n 1 + ((firstByte & 0x7) << 3) + ((esdsBox[i] & 0xe0) >> 5);\n }\n codec += '.' + audioObjectType;\n }\n break;\n }\n case 'hvc1':\n case 'hev1': {\n const hvcCBox = findBox(sampleEntriesEnd, ['hvcC'])[0];\n const profileByte = hvcCBox[1];\n const profileSpace = ['', 'A', 'B', 'C'][profileByte >> 6];\n const generalProfileIdc = profileByte & 0x1f;\n const profileCompat = readUint32(hvcCBox, 2);\n const tierFlag = (profileByte & 0x20) >> 5 ? 'H' : 'L';\n const levelIDC = hvcCBox[12];\n const constraintIndicator = hvcCBox.subarray(6, 12);\n codec += '.' + profileSpace + generalProfileIdc;\n codec += '.' + profileCompat.toString(16).toUpperCase();\n codec += '.' + tierFlag + levelIDC;\n let constraintString = '';\n for (let i = constraintIndicator.length; i--; ) {\n const byte = constraintIndicator[i];\n if (byte || constraintString) {\n const encodedByte = byte.toString(16).toUpperCase();\n constraintString = '.' + encodedByte + constraintString;\n }\n }\n codec += constraintString;\n break;\n }\n case 'dvh1':\n case 'dvhe': {\n const dvcCBox = findBox(sampleEntriesEnd, ['dvcC'])[0];\n const profile = (dvcCBox[2] >> 1) & 0x7f;\n const level = ((dvcCBox[2] << 5) & 0x20) | ((dvcCBox[3] >> 3) & 0x1f);\n codec += '.' + addLeadingZero(profile) + '.' + addLeadingZero(level);\n break;\n }\n case 'vp09': {\n const vpcCBox = findBox(sampleEntriesEnd, ['vpcC'])[0];\n const profile = vpcCBox[4];\n const level = vpcCBox[5];\n const bitDepth = (vpcCBox[6] >> 4) & 0x0f;\n codec +=\n '.' +\n addLeadingZero(profile) +\n '.' +\n addLeadingZero(level) +\n '.' +\n addLeadingZero(bitDepth);\n break;\n }\n case 'av01': {\n const av1CBox = findBox(sampleEntriesEnd, ['av1C'])[0];\n const profile = av1CBox[1] >>> 5;\n const level = av1CBox[1] & 0x1f;\n const tierFlag = av1CBox[2] >>> 7 ? 'H' : 'M';\n const highBitDepth = (av1CBox[2] & 0x40) >> 6;\n const twelveBit = (av1CBox[2] & 0x20) >> 5;\n const bitDepth =\n profile === 2 && highBitDepth\n ? twelveBit\n ? 12\n : 10\n : highBitDepth\n ? 10\n : 8;\n const monochrome = (av1CBox[2] & 0x10) >> 4;\n const chromaSubsamplingX = (av1CBox[2] & 0x08) >> 3;\n const chromaSubsamplingY = (av1CBox[2] & 0x04) >> 2;\n const chromaSamplePosition = av1CBox[2] & 0x03;\n // TODO: parse color_description_present_flag\n // default it to BT.709/limited range for now\n // more info https://aomediacodec.github.io/av1-isobmff/#av1codecconfigurationbox-syntax\n const colorPrimaries = 1;\n const transferCharacteristics = 1;\n const matrixCoefficients = 1;\n const videoFullRangeFlag = 0;\n codec +=\n '.' +\n profile +\n '.' +\n addLeadingZero(level) +\n tierFlag +\n '.' +\n addLeadingZero(bitDepth) +\n '.' +\n monochrome +\n '.' +\n chromaSubsamplingX +\n chromaSubsamplingY +\n chromaSamplePosition +\n '.' +\n addLeadingZero(colorPrimaries) +\n '.' +\n addLeadingZero(transferCharacteristics) +\n '.' +\n addLeadingZero(matrixCoefficients) +\n '.' +\n videoFullRangeFlag;\n break;\n }\n case 'ac-3':\n case 'ec-3':\n case 'alac':\n case 'fLaC':\n case 'Opus':\n default:\n break;\n }\n return { codec, encrypted };\n}\n\nfunction skipBERInteger(bytes: Uint8Array, i: number): number {\n const limit = i + 5;\n while (bytes[i++] & 0x80 && i < limit) {}\n return i;\n}\n\nfunction toHex(x: number): string {\n return ('0' + x.toString(16).toUpperCase()).slice(-2);\n}\n\nfunction addLeadingZero(num: number): string {\n return (num < 10 ? '0' : '') + num;\n}\n\nexport function patchEncyptionData(\n initSegment: Uint8Array | undefined,\n decryptdata: DecryptData | null,\n): Uint8Array | undefined {\n if (!initSegment || !decryptdata) {\n return initSegment;\n }\n const keyId = decryptdata.keyId;\n if (keyId && decryptdata.isCommonEncryption) {\n const traks = findBox(initSegment, ['moov', 'trak']);\n traks.forEach((trak) => {\n const stsd = findBox(trak, ['mdia', 'minf', 'stbl', 'stsd'])[0];\n\n // skip the sample entry count\n const sampleEntries = stsd.subarray(8);\n let encBoxes = findBox(sampleEntries, ['enca']);\n const isAudio = encBoxes.length > 0;\n if (!isAudio) {\n encBoxes = findBox(sampleEntries, ['encv']);\n }\n encBoxes.forEach((enc) => {\n const encBoxChildren = isAudio ? enc.subarray(28) : enc.subarray(78);\n const sinfBoxes = findBox(encBoxChildren, ['sinf']);\n sinfBoxes.forEach((sinf) => {\n const tenc = parseSinf(sinf);\n if (tenc) {\n // Look for default key id (keyID offset is always 8 within the tenc box):\n const tencKeyId = tenc.subarray(8, 24);\n if (!tencKeyId.some((b) => b !== 0)) {\n logger.log(\n `[eme] Patching keyId in 'enc${\n isAudio ? 'a' : 'v'\n }>sinf>>tenc' box: ${Hex.hexDump(tencKeyId)} -> ${Hex.hexDump(\n keyId,\n )}`,\n );\n tenc.set(keyId, 8);\n }\n }\n });\n });\n });\n }\n\n return initSegment;\n}\n\nexport function parseSinf(sinf: Uint8Array): Uint8Array | null {\n const schm = findBox(sinf, ['schm'])[0];\n if (schm) {\n const scheme = bin2str(schm.subarray(4, 8));\n if (scheme === 'cbcs' || scheme === 'cenc') {\n return findBox(sinf, ['schi', 'tenc'])[0];\n }\n }\n return null;\n}\n\n/**\n * Determine the base media decode start time, in seconds, for an MP4\n * fragment. If multiple fragments are specified, the earliest time is\n * returned.\n *\n * The base media decode time can be parsed from track fragment\n * metadata:\n * ```\n * moof > traf > tfdt.baseMediaDecodeTime\n * ```\n * It requires the timescale value from the mdhd to interpret.\n *\n * @param initData - a hash of track type to timescale values\n * @param fmp4 - the bytes of the mp4 fragment\n * @returns the earliest base media decode start time for the\n * fragment, in seconds\n */\nexport function getStartDTS(\n initData: InitData,\n fmp4: Uint8Array,\n): number | null {\n // we need info from two children of each track fragment box\n return findBox(fmp4, ['moof', 'traf']).reduce(\n (result: number | null, traf) => {\n const tfdt = findBox(traf, ['tfdt'])[0];\n const version = tfdt[0];\n const start = findBox(traf, ['tfhd']).reduce(\n (result: number | null, tfhd) => {\n // get the track id from the tfhd\n const id = readUint32(tfhd, 4);\n const track = initData[id];\n if (track) {\n let baseTime = readUint32(tfdt, 4);\n if (version === 1) {\n // If value is too large, assume signed 64-bit. Negative track fragment decode times are invalid, but they exist in the wild.\n // This prevents large values from being used for initPTS, which can cause playlist sync issues.\n // https://github.com/video-dev/hls.js/issues/5303\n if (baseTime === UINT32_MAX) {\n logger.warn(\n `[mp4-demuxer]: Ignoring assumed invalid signed 64-bit track fragment decode time`,\n );\n return result;\n }\n baseTime *= UINT32_MAX + 1;\n baseTime += readUint32(tfdt, 8);\n }\n // assume a 90kHz clock if no timescale was specified\n const scale = track.timescale || 90e3;\n // convert base time to seconds\n const startTime = baseTime / scale;\n if (\n Number.isFinite(startTime) &&\n (result === null || startTime < result)\n ) {\n return startTime;\n }\n }\n return result;\n },\n null,\n );\n if (\n start !== null &&\n Number.isFinite(start) &&\n (result === null || start < result)\n ) {\n return start;\n }\n return result;\n },\n null,\n );\n}\n\n/*\n For Reference:\n aligned(8) class TrackFragmentHeaderBox\n extends FullBox(‘tfhd’, 0, tf_flags){\n unsigned int(32) track_ID;\n // all the following are optional fields\n unsigned int(64) base_data_offset;\n unsigned int(32) sample_description_index;\n unsigned int(32) default_sample_duration;\n unsigned int(32) default_sample_size;\n unsigned int(32) default_sample_flags\n }\n */\nexport function getDuration(data: Uint8Array, initData: InitData) {\n let rawDuration = 0;\n let videoDuration = 0;\n let audioDuration = 0;\n const trafs = findBox(data, ['moof', 'traf']);\n for (let i = 0; i < trafs.length; i++) {\n const traf = trafs[i];\n // There is only one tfhd & trun per traf\n // This is true for CMAF style content, and we should perhaps check the ftyp\n // and only look for a single trun then, but for ISOBMFF we should check\n // for multiple track runs.\n const tfhd = findBox(traf, ['tfhd'])[0];\n // get the track id from the tfhd\n const id = readUint32(tfhd, 4);\n const track = initData[id];\n if (!track) {\n continue;\n }\n const trackDefault = track.default;\n const tfhdFlags = readUint32(tfhd, 0) | trackDefault?.flags!;\n let sampleDuration: number | undefined = trackDefault?.duration;\n if (tfhdFlags & 0x000008) {\n // 0x000008 indicates the presence of the default_sample_duration field\n if (tfhdFlags & 0x000002) {\n // 0x000002 indicates the presence of the sample_description_index field, which precedes default_sample_duration\n // If present, the default_sample_duration exists at byte offset 12\n sampleDuration = readUint32(tfhd, 12);\n } else {\n // Otherwise, the duration is at byte offset 8\n sampleDuration = readUint32(tfhd, 8);\n }\n }\n // assume a 90kHz clock if no timescale was specified\n const timescale = track.timescale || 90e3;\n const truns = findBox(traf, ['trun']);\n for (let j = 0; j < truns.length; j++) {\n rawDuration = computeRawDurationFromSamples(truns[j]);\n if (!rawDuration && sampleDuration) {\n const sampleCount = readUint32(truns[j], 4);\n rawDuration = sampleDuration * sampleCount;\n }\n if (track.type === ElementaryStreamTypes.VIDEO) {\n videoDuration += rawDuration / timescale;\n } else if (track.type === ElementaryStreamTypes.AUDIO) {\n audioDuration += rawDuration / timescale;\n }\n }\n }\n if (videoDuration === 0 && audioDuration === 0) {\n // If duration samples are not available in the traf use sidx subsegment_duration\n let sidxMinStart = Infinity;\n let sidxMaxEnd = 0;\n let sidxDuration = 0;\n const sidxs = findBox(data, ['sidx']);\n for (let i = 0; i < sidxs.length; i++) {\n const sidx = parseSegmentIndex(sidxs[i]);\n if (sidx?.references) {\n sidxMinStart = Math.min(\n sidxMinStart,\n sidx.earliestPresentationTime / sidx.timescale,\n );\n const subSegmentDuration = sidx.references.reduce(\n (dur, ref) => dur + ref.info.duration || 0,\n 0,\n );\n sidxMaxEnd = Math.max(\n sidxMaxEnd,\n subSegmentDuration + sidx.earliestPresentationTime / sidx.timescale,\n );\n sidxDuration = sidxMaxEnd - sidxMinStart;\n }\n }\n if (sidxDuration && Number.isFinite(sidxDuration)) {\n return sidxDuration;\n }\n }\n if (videoDuration) {\n return videoDuration;\n }\n return audioDuration;\n}\n\n/*\n For Reference:\n aligned(8) class TrackRunBox\n extends FullBox(‘trun’, version, tr_flags) {\n unsigned int(32) sample_count;\n // the following are optional fields\n signed int(32) data_offset;\n unsigned int(32) first_sample_flags;\n // all fields in the following array are optional\n {\n unsigned int(32) sample_duration;\n unsigned int(32) sample_size;\n unsigned int(32) sample_flags\n if (version == 0)\n { unsigned int(32)\n else\n { signed int(32)\n }[ sample_count ]\n }\n */\nexport function computeRawDurationFromSamples(trun): number {\n const flags = readUint32(trun, 0);\n // Flags are at offset 0, non-optional sample_count is at offset 4. Therefore we start 8 bytes in.\n // Each field is an int32, which is 4 bytes\n let offset = 8;\n // data-offset-present flag\n if (flags & 0x000001) {\n offset += 4;\n }\n // first-sample-flags-present flag\n if (flags & 0x000004) {\n offset += 4;\n }\n\n let duration = 0;\n const sampleCount = readUint32(trun, 4);\n for (let i = 0; i < sampleCount; i++) {\n // sample-duration-present flag\n if (flags & 0x000100) {\n const sampleDuration = readUint32(trun, offset);\n duration += sampleDuration;\n offset += 4;\n }\n // sample-size-present flag\n if (flags & 0x000200) {\n offset += 4;\n }\n // sample-flags-present flag\n if (flags & 0x000400) {\n offset += 4;\n }\n // sample-composition-time-offsets-present flag\n if (flags & 0x000800) {\n offset += 4;\n }\n }\n return duration;\n}\n\nexport function offsetStartDTS(\n initData: InitData,\n fmp4: Uint8Array,\n timeOffset: number,\n) {\n findBox(fmp4, ['moof', 'traf']).forEach((traf) => {\n findBox(traf, ['tfhd']).forEach((tfhd) => {\n // get the track id from the tfhd\n const id = readUint32(tfhd, 4);\n const track = initData[id];\n if (!track) {\n return;\n }\n // assume a 90kHz clock if no timescale was specified\n const timescale = track.timescale || 90e3;\n // get the base media decode time from the tfdt\n findBox(traf, ['tfdt']).forEach((tfdt) => {\n const version = tfdt[0];\n const offset = timeOffset * timescale;\n if (offset) {\n let baseMediaDecodeTime = readUint32(tfdt, 4);\n if (version === 0) {\n baseMediaDecodeTime -= offset;\n baseMediaDecodeTime = Math.max(baseMediaDecodeTime, 0);\n writeUint32(tfdt, 4, baseMediaDecodeTime);\n } else {\n baseMediaDecodeTime *= Math.pow(2, 32);\n baseMediaDecodeTime += readUint32(tfdt, 8);\n baseMediaDecodeTime -= offset;\n baseMediaDecodeTime = Math.max(baseMediaDecodeTime, 0);\n const upper = Math.floor(baseMediaDecodeTime / (UINT32_MAX + 1));\n const lower = Math.floor(baseMediaDecodeTime % (UINT32_MAX + 1));\n writeUint32(tfdt, 4, upper);\n writeUint32(tfdt, 8, lower);\n }\n }\n });\n });\n });\n}\n\n// TODO: Check if the last moof+mdat pair is part of the valid range\nexport function segmentValidRange(data: Uint8Array): SegmentedRange {\n const segmentedRange: SegmentedRange = {\n valid: null,\n remainder: null,\n };\n\n const moofs = findBox(data, ['moof']);\n if (moofs.length < 2) {\n segmentedRange.remainder = data;\n return segmentedRange;\n }\n const last = moofs[moofs.length - 1];\n // Offset by 8 bytes; findBox offsets the start by as much\n segmentedRange.valid = sliceUint8(data, 0, last.byteOffset - 8);\n segmentedRange.remainder = sliceUint8(data, last.byteOffset - 8);\n return segmentedRange;\n}\n\nexport interface SegmentedRange {\n valid: Uint8Array | null;\n remainder: Uint8Array | null;\n}\n\nexport function appendUint8Array(\n data1: Uint8Array,\n data2: Uint8Array,\n): Uint8Array {\n const temp = new Uint8Array(data1.length + data2.length);\n temp.set(data1);\n temp.set(data2, data1.length);\n\n return temp;\n}\n\nexport interface IEmsgParsingData {\n schemeIdUri: string;\n value: string;\n timeScale: number;\n presentationTimeDelta?: number;\n presentationTime?: number;\n eventDuration: number;\n id: number;\n payload: Uint8Array;\n}\n\nexport function parseSamples(\n timeOffset: number,\n track: PassthroughTrack,\n): UserdataSample[] {\n const seiSamples = [] as UserdataSample[];\n const videoData = track.samples;\n const timescale = track.timescale;\n const trackId = track.id;\n let isHEVCFlavor = false;\n\n const moofs = findBox(videoData, ['moof']);\n moofs.map((moof) => {\n const moofOffset = moof.byteOffset - 8;\n const trafs = findBox(moof, ['traf']);\n trafs.map((traf) => {\n // get the base media decode time from the tfdt\n const baseTime = findBox(traf, ['tfdt']).map((tfdt) => {\n const version = tfdt[0];\n let result = readUint32(tfdt, 4);\n if (version === 1) {\n result *= Math.pow(2, 32);\n result += readUint32(tfdt, 8);\n }\n return result / timescale;\n })[0];\n\n if (baseTime !== undefined) {\n timeOffset = baseTime;\n }\n\n return findBox(traf, ['tfhd']).map((tfhd) => {\n const id = readUint32(tfhd, 4);\n const tfhdFlags = readUint32(tfhd, 0) & 0xffffff;\n const baseDataOffsetPresent = (tfhdFlags & 0x000001) !== 0;\n const sampleDescriptionIndexPresent = (tfhdFlags & 0x000002) !== 0;\n const defaultSampleDurationPresent = (tfhdFlags & 0x000008) !== 0;\n let defaultSampleDuration = 0;\n const defaultSampleSizePresent = (tfhdFlags & 0x000010) !== 0;\n let defaultSampleSize = 0;\n const defaultSampleFlagsPresent = (tfhdFlags & 0x000020) !== 0;\n let tfhdOffset = 8;\n\n if (id === trackId) {\n if (baseDataOffsetPresent) {\n tfhdOffset += 8;\n }\n if (sampleDescriptionIndexPresent) {\n tfhdOffset += 4;\n }\n if (defaultSampleDurationPresent) {\n defaultSampleDuration = readUint32(tfhd, tfhdOffset);\n tfhdOffset += 4;\n }\n if (defaultSampleSizePresent) {\n defaultSampleSize = readUint32(tfhd, tfhdOffset);\n tfhdOffset += 4;\n }\n if (defaultSampleFlagsPresent) {\n tfhdOffset += 4;\n }\n if (track.type === 'video') {\n isHEVCFlavor = isHEVC(track.codec);\n }\n\n findBox(traf, ['trun']).map((trun) => {\n const version = trun[0];\n const flags = readUint32(trun, 0) & 0xffffff;\n const dataOffsetPresent = (flags & 0x000001) !== 0;\n let dataOffset = 0;\n const firstSampleFlagsPresent = (flags & 0x000004) !== 0;\n const sampleDurationPresent = (flags & 0x000100) !== 0;\n let sampleDuration = 0;\n const sampleSizePresent = (flags & 0x000200) !== 0;\n let sampleSize = 0;\n const sampleFlagsPresent = (flags & 0x000400) !== 0;\n const sampleCompositionOffsetsPresent = (flags & 0x000800) !== 0;\n let compositionOffset = 0;\n const sampleCount = readUint32(trun, 4);\n let trunOffset = 8; // past version, flags, and sample count\n\n if (dataOffsetPresent) {\n dataOffset = readUint32(trun, trunOffset);\n trunOffset += 4;\n }\n if (firstSampleFlagsPresent) {\n trunOffset += 4;\n }\n\n let sampleOffset = dataOffset + moofOffset;\n\n for (let ix = 0; ix < sampleCount; ix++) {\n if (sampleDurationPresent) {\n sampleDuration = readUint32(trun, trunOffset);\n trunOffset += 4;\n } else {\n sampleDuration = defaultSampleDuration;\n }\n if (sampleSizePresent) {\n sampleSize = readUint32(trun, trunOffset);\n trunOffset += 4;\n } else {\n sampleSize = defaultSampleSize;\n }\n if (sampleFlagsPresent) {\n trunOffset += 4;\n }\n if (sampleCompositionOffsetsPresent) {\n if (version === 0) {\n compositionOffset = readUint32(trun, trunOffset);\n } else {\n compositionOffset = readSint32(trun, trunOffset);\n }\n trunOffset += 4;\n }\n if (track.type === ElementaryStreamTypes.VIDEO) {\n let naluTotalSize = 0;\n while (naluTotalSize < sampleSize) {\n const naluSize = readUint32(videoData, sampleOffset);\n sampleOffset += 4;\n if (isSEIMessage(isHEVCFlavor, videoData[sampleOffset])) {\n const data = videoData.subarray(\n sampleOffset,\n sampleOffset + naluSize,\n );\n parseSEIMessageFromNALu(\n data,\n isHEVCFlavor ? 2 : 1,\n timeOffset + compositionOffset / timescale,\n seiSamples,\n );\n }\n sampleOffset += naluSize;\n naluTotalSize += naluSize + 4;\n }\n }\n\n timeOffset += sampleDuration / timescale;\n }\n });\n }\n });\n });\n });\n return seiSamples;\n}\n\nfunction isHEVC(codec: string) {\n if (!codec) {\n return false;\n }\n const delimit = codec.indexOf('.');\n const baseCodec = delimit < 0 ? codec : codec.substring(0, delimit);\n return (\n baseCodec === 'hvc1' ||\n baseCodec === 'hev1' ||\n // Dolby Vision\n baseCodec === 'dvh1' ||\n baseCodec === 'dvhe'\n );\n}\n\nfunction isSEIMessage(isHEVCFlavor: boolean, naluHeader: number) {\n if (isHEVCFlavor) {\n const naluType = (naluHeader >> 1) & 0x3f;\n return naluType === 39 || naluType === 40;\n } else {\n const naluType = naluHeader & 0x1f;\n return naluType === 6;\n }\n}\n\nexport function parseSEIMessageFromNALu(\n unescapedData: Uint8Array,\n headerSize: number,\n pts: number,\n samples: UserdataSample[],\n) {\n const data = discardEPB(unescapedData);\n let seiPtr = 0;\n // skip nal header\n seiPtr += headerSize;\n let payloadType = 0;\n let payloadSize = 0;\n let b = 0;\n\n while (seiPtr < data.length) {\n payloadType = 0;\n do {\n if (seiPtr >= data.length) {\n break;\n }\n b = data[seiPtr++];\n payloadType += b;\n } while (b === 0xff);\n\n // Parse payload size.\n payloadSize = 0;\n do {\n if (seiPtr >= data.length) {\n break;\n }\n b = data[seiPtr++];\n payloadSize += b;\n } while (b === 0xff);\n\n const leftOver = data.length - seiPtr;\n // Create a variable to process the payload\n let payPtr = seiPtr;\n\n // Increment the seiPtr to the end of the payload\n if (payloadSize < leftOver) {\n seiPtr += payloadSize;\n } else if (payloadSize > leftOver) {\n // Some type of corruption has happened?\n logger.error(\n `Malformed SEI payload. ${payloadSize} is too small, only ${leftOver} bytes left to parse.`,\n );\n // We might be able to parse some data, but let's be safe and ignore it.\n break;\n }\n\n if (payloadType === 4) {\n const countryCode = data[payPtr++];\n if (countryCode === 181) {\n const providerCode = readUint16(data, payPtr);\n payPtr += 2;\n\n if (providerCode === 49) {\n const userStructure = readUint32(data, payPtr);\n payPtr += 4;\n\n if (userStructure === 0x47413934) {\n const userDataType = data[payPtr++];\n\n // Raw CEA-608 bytes wrapped in CEA-708 packet\n if (userDataType === 3) {\n const firstByte = data[payPtr++];\n const totalCCs = 0x1f & firstByte;\n const enabled = 0x40 & firstByte;\n const totalBytes = enabled ? 2 + totalCCs * 3 : 0;\n const byteArray = new Uint8Array(totalBytes);\n if (enabled) {\n byteArray[0] = firstByte;\n for (let i = 1; i < totalBytes; i++) {\n byteArray[i] = data[payPtr++];\n }\n }\n\n samples.push({\n type: userDataType,\n payloadType,\n pts,\n bytes: byteArray,\n });\n }\n }\n }\n }\n } else if (payloadType === 5) {\n if (payloadSize > 16) {\n const uuidStrArray: Array = [];\n for (let i = 0; i < 16; i++) {\n const b = data[payPtr++].toString(16);\n uuidStrArray.push(b.length == 1 ? '0' + b : b);\n\n if (i === 3 || i === 5 || i === 7 || i === 9) {\n uuidStrArray.push('-');\n }\n }\n const length = payloadSize - 16;\n const userDataBytes = new Uint8Array(length);\n for (let i = 0; i < length; i++) {\n userDataBytes[i] = data[payPtr++];\n }\n\n samples.push({\n payloadType,\n pts,\n uuid: uuidStrArray.join(''),\n userData: utf8ArrayToStr(userDataBytes),\n userDataBytes,\n });\n }\n }\n }\n}\n\n/**\n * remove Emulation Prevention bytes from a RBSP\n */\nexport function discardEPB(data: Uint8Array): Uint8Array {\n const length = data.byteLength;\n const EPBPositions = [] as Array;\n let i = 1;\n\n // Find all `Emulation Prevention Bytes`\n while (i < length - 2) {\n if (data[i] === 0 && data[i + 1] === 0 && data[i + 2] === 0x03) {\n EPBPositions.push(i + 2);\n i += 2;\n } else {\n i++;\n }\n }\n\n // If no Emulation Prevention Bytes were found just return the original\n // array\n if (EPBPositions.length === 0) {\n return data;\n }\n\n // Create a new array to hold the NAL unit data\n const newLength = length - EPBPositions.length;\n const newData = new Uint8Array(newLength);\n let sourceIndex = 0;\n\n for (i = 0; i < newLength; sourceIndex++, i++) {\n if (sourceIndex === EPBPositions[0]) {\n // Skip this byte\n sourceIndex++;\n // Remove this position index\n EPBPositions.shift();\n }\n newData[i] = data[sourceIndex];\n }\n return newData;\n}\n\nexport function parseEmsg(data: Uint8Array): IEmsgParsingData {\n const version = data[0];\n let schemeIdUri: string = '';\n let value: string = '';\n let timeScale: number = 0;\n let presentationTimeDelta: number = 0;\n let presentationTime: number = 0;\n let eventDuration: number = 0;\n let id: number = 0;\n let offset: number = 0;\n\n if (version === 0) {\n while (bin2str(data.subarray(offset, offset + 1)) !== '\\0') {\n schemeIdUri += bin2str(data.subarray(offset, offset + 1));\n offset += 1;\n }\n\n schemeIdUri += bin2str(data.subarray(offset, offset + 1));\n offset += 1;\n\n while (bin2str(data.subarray(offset, offset + 1)) !== '\\0') {\n value += bin2str(data.subarray(offset, offset + 1));\n offset += 1;\n }\n\n value += bin2str(data.subarray(offset, offset + 1));\n offset += 1;\n\n timeScale = readUint32(data, 12);\n presentationTimeDelta = readUint32(data, 16);\n eventDuration = readUint32(data, 20);\n id = readUint32(data, 24);\n offset = 28;\n } else if (version === 1) {\n offset += 4;\n timeScale = readUint32(data, offset);\n offset += 4;\n const leftPresentationTime = readUint32(data, offset);\n offset += 4;\n const rightPresentationTime = readUint32(data, offset);\n offset += 4;\n presentationTime = 2 ** 32 * leftPresentationTime + rightPresentationTime;\n if (!Number.isSafeInteger(presentationTime)) {\n presentationTime = Number.MAX_SAFE_INTEGER;\n logger.warn(\n 'Presentation time exceeds safe integer limit and wrapped to max safe integer in parsing emsg box',\n );\n }\n\n eventDuration = readUint32(data, offset);\n offset += 4;\n id = readUint32(data, offset);\n offset += 4;\n\n while (bin2str(data.subarray(offset, offset + 1)) !== '\\0') {\n schemeIdUri += bin2str(data.subarray(offset, offset + 1));\n offset += 1;\n }\n\n schemeIdUri += bin2str(data.subarray(offset, offset + 1));\n offset += 1;\n\n while (bin2str(data.subarray(offset, offset + 1)) !== '\\0') {\n value += bin2str(data.subarray(offset, offset + 1));\n offset += 1;\n }\n\n value += bin2str(data.subarray(offset, offset + 1));\n offset += 1;\n }\n const payload = data.subarray(offset, data.byteLength);\n\n return {\n schemeIdUri,\n value,\n timeScale,\n presentationTime,\n presentationTimeDelta,\n eventDuration,\n id,\n payload,\n };\n}\n\nexport function mp4Box(type: ArrayLike, ...payload: Uint8Array[]) {\n const len = payload.length;\n let size = 8;\n let i = len;\n while (i--) {\n size += payload[i].byteLength;\n }\n const result = new Uint8Array(size);\n result[0] = (size >> 24) & 0xff;\n result[1] = (size >> 16) & 0xff;\n result[2] = (size >> 8) & 0xff;\n result[3] = size & 0xff;\n result.set(type, 4);\n for (i = 0, size = 8; i < len; i++) {\n result.set(payload[i], size);\n size += payload[i].byteLength;\n }\n return result;\n}\n\nexport function mp4pssh(\n systemId: Uint8Array,\n keyids: Array | null,\n data: Uint8Array,\n) {\n if (systemId.byteLength !== 16) {\n throw new RangeError('Invalid system id');\n }\n let version;\n let kids;\n if (keyids) {\n version = 1;\n kids = new Uint8Array(keyids.length * 16);\n for (let ix = 0; ix < keyids.length; ix++) {\n const k = keyids[ix]; // uint8array\n if (k.byteLength !== 16) {\n throw new RangeError('Invalid key');\n }\n kids.set(k, ix * 16);\n }\n } else {\n version = 0;\n kids = new Uint8Array();\n }\n let kidCount;\n if (version > 0) {\n kidCount = new Uint8Array(4);\n if (keyids!.length > 0) {\n new DataView(kidCount.buffer).setUint32(0, keyids!.length, false);\n }\n } else {\n kidCount = new Uint8Array();\n }\n const dataSize = new Uint8Array(4);\n if (data && data.byteLength > 0) {\n new DataView(dataSize.buffer).setUint32(0, data.byteLength, false);\n }\n return mp4Box(\n [112, 115, 115, 104],\n new Uint8Array([\n version,\n 0x00,\n 0x00,\n 0x00, // Flags\n ]),\n systemId, // 16 bytes\n kidCount,\n kids,\n dataSize,\n data || new Uint8Array(),\n );\n}\n\nexport type PsshData = {\n version: 0 | 1;\n systemId: KeySystemIds;\n kids: null | Uint8Array[];\n data: null | Uint8Array;\n offset: number;\n size: number;\n};\n\nexport type PsshInvalidResult = {\n systemId?: undefined;\n offset: number;\n size: number;\n};\n\nexport function parseMultiPssh(\n initData: ArrayBuffer,\n): (PsshData | PsshInvalidResult)[] {\n const results: (PsshData | PsshInvalidResult)[] = [];\n if (initData instanceof ArrayBuffer) {\n const length = initData.byteLength;\n let offset = 0;\n while (offset + 32 < length) {\n const view = new DataView(initData, offset);\n const pssh = parsePssh(view);\n results.push(pssh);\n offset += pssh.size;\n }\n }\n return results;\n}\n\nfunction parsePssh(view: DataView): PsshData | PsshInvalidResult {\n const size = view.getUint32(0);\n const offset = view.byteOffset;\n const length = view.byteLength;\n if (length < size) {\n return {\n offset,\n size: length,\n };\n }\n const type = view.getUint32(4);\n if (type !== 0x70737368) {\n return { offset, size };\n }\n const version = view.getUint32(8) >>> 24;\n if (version !== 0 && version !== 1) {\n return { offset, size };\n }\n const buffer = view.buffer;\n const systemId = Hex.hexDump(\n new Uint8Array(buffer, offset + 12, 16),\n ) as KeySystemIds;\n const dataSizeOrKidCount = view.getUint32(28);\n let kids: null | Uint8Array[] = null;\n let data: null | Uint8Array = null;\n if (version === 0) {\n if (size - 32 < dataSizeOrKidCount || dataSizeOrKidCount < 22) {\n return { offset, size };\n }\n data = new Uint8Array(buffer, offset + 32, dataSizeOrKidCount);\n } else if (version === 1) {\n if (\n !dataSizeOrKidCount ||\n length < offset + 32 + dataSizeOrKidCount * 16 + 16\n ) {\n return { offset, size };\n }\n kids = [];\n for (let i = 0; i < dataSizeOrKidCount; i++) {\n kids.push(new Uint8Array(buffer, offset + 32 + i * 16, 16));\n }\n }\n return {\n version,\n systemId,\n kids,\n data,\n offset,\n size,\n };\n}\n","import {\n changeEndianness,\n convertDataUriToArrayBytes,\n} from '../utils/keysystem-util';\nimport { KeySystemFormats, parsePlayReadyWRM } from '../utils/mediakeys-helper';\nimport { mp4pssh } from '../utils/mp4-tools';\nimport { logger } from '../utils/logger';\nimport { base64Decode } from '../utils/numeric-encoding-utils';\n\nlet keyUriToKeyIdMap: { [uri: string]: Uint8Array } = {};\n\nexport interface DecryptData {\n uri: string;\n method: string;\n keyFormat: string;\n keyFormatVersions: number[];\n iv: Uint8Array | null;\n key: Uint8Array | null;\n keyId: Uint8Array | null;\n pssh: Uint8Array | null;\n encrypted: boolean;\n isCommonEncryption: boolean;\n}\n\nexport class LevelKey implements DecryptData {\n public readonly uri: string;\n public readonly method: string;\n public readonly keyFormat: string;\n public readonly keyFormatVersions: number[];\n public readonly encrypted: boolean;\n public readonly isCommonEncryption: boolean;\n public iv: Uint8Array | null = null;\n public key: Uint8Array | null = null;\n public keyId: Uint8Array | null = null;\n public pssh: Uint8Array | null = null;\n\n static clearKeyUriToKeyIdMap() {\n keyUriToKeyIdMap = {};\n }\n\n constructor(\n method: string,\n uri: string,\n format: string,\n formatversions: number[] = [1],\n iv: Uint8Array | null = null,\n ) {\n this.method = method;\n this.uri = uri;\n this.keyFormat = format;\n this.keyFormatVersions = formatversions;\n this.iv = iv;\n this.encrypted = method ? method !== 'NONE' : false;\n this.isCommonEncryption = this.encrypted && method !== 'AES-128';\n }\n\n public isSupported(): boolean {\n // If it's Segment encryption or No encryption, just select that key system\n if (this.method) {\n if (this.method === 'AES-128' || this.method === 'NONE') {\n return true;\n }\n if (this.keyFormat === 'identity') {\n // Maintain support for clear SAMPLE-AES with MPEG-3 TS\n return this.method === 'SAMPLE-AES';\n } else if (__USE_EME_DRM__) {\n switch (this.keyFormat) {\n case KeySystemFormats.FAIRPLAY:\n case KeySystemFormats.WIDEVINE:\n case KeySystemFormats.PLAYREADY:\n case KeySystemFormats.CLEARKEY:\n return (\n [\n 'ISO-23001-7',\n 'SAMPLE-AES',\n 'SAMPLE-AES-CENC',\n 'SAMPLE-AES-CTR',\n ].indexOf(this.method) !== -1\n );\n }\n }\n }\n return false;\n }\n\n public getDecryptData(sn: number | 'initSegment'): LevelKey | null {\n if (!this.encrypted || !this.uri) {\n return null;\n }\n\n if (this.method === 'AES-128' && this.uri && !this.iv) {\n if (typeof sn !== 'number') {\n // We are fetching decryption data for a initialization segment\n // If the segment was encrypted with AES-128\n // It must have an IV defined. We cannot substitute the Segment Number in.\n if (this.method === 'AES-128' && !this.iv) {\n logger.warn(\n `missing IV for initialization segment with method=\"${this.method}\" - compliance issue`,\n );\n }\n // Explicitly set sn to resulting value from implicit conversions 'initSegment' values for IV generation.\n sn = 0;\n }\n const iv = createInitializationVector(sn);\n const decryptdata = new LevelKey(\n this.method,\n this.uri,\n 'identity',\n this.keyFormatVersions,\n iv,\n );\n return decryptdata;\n }\n\n if (!__USE_EME_DRM__) {\n return this;\n }\n\n // Initialize keyId if possible\n const keyBytes = convertDataUriToArrayBytes(this.uri);\n if (keyBytes) {\n switch (this.keyFormat) {\n case KeySystemFormats.WIDEVINE:\n // Setting `pssh` on this LevelKey/DecryptData allows HLS.js to generate a session using\n // the playlist-key before the \"encrypted\" event. (Comment out to only use \"encrypted\" path.)\n this.pssh = keyBytes;\n // In case of widevine keyID is embedded in PSSH box. Read Key ID.\n if (keyBytes.length >= 22) {\n this.keyId = keyBytes.subarray(\n keyBytes.length - 22,\n keyBytes.length - 6,\n );\n }\n break;\n case KeySystemFormats.PLAYREADY: {\n const PlayReadyKeySystemUUID = new Uint8Array([\n 0x9a, 0x04, 0xf0, 0x79, 0x98, 0x40, 0x42, 0x86, 0xab, 0x92, 0xe6,\n 0x5b, 0xe0, 0x88, 0x5f, 0x95,\n ]);\n\n // Setting `pssh` on this LevelKey/DecryptData allows HLS.js to generate a session using\n // the playlist-key before the \"encrypted\" event. (Comment out to only use \"encrypted\" path.)\n this.pssh = mp4pssh(PlayReadyKeySystemUUID, null, keyBytes);\n\n this.keyId = parsePlayReadyWRM(keyBytes);\n\n break;\n }\n default: {\n let keydata = keyBytes.subarray(0, 16);\n if (keydata.length !== 16) {\n const padded = new Uint8Array(16);\n padded.set(keydata, 16 - keydata.length);\n keydata = padded;\n }\n this.keyId = keydata;\n break;\n }\n }\n }\n\n // Default behavior: assign a new keyId for each uri\n if (!this.keyId || this.keyId.byteLength !== 16) {\n let keyId = keyUriToKeyIdMap[this.uri];\n if (!keyId) {\n const val =\n Object.keys(keyUriToKeyIdMap).length % Number.MAX_SAFE_INTEGER;\n keyId = new Uint8Array(16);\n const dv = new DataView(keyId.buffer, 12, 4); // Just set the last 4 bytes\n dv.setUint32(0, val);\n keyUriToKeyIdMap[this.uri] = keyId;\n }\n this.keyId = keyId;\n }\n\n return this;\n }\n}\n\nfunction createInitializationVector(segmentNumber: number): Uint8Array {\n const uint8View = new Uint8Array(16);\n for (let i = 12; i < 16; i++) {\n uint8View[i] = (segmentNumber >> (8 * (15 - i))) & 0xff;\n }\n return uint8View;\n}\n","import type { AttrList } from './attr-list';\nimport type { ParsedMultivariantPlaylist } from '../loader/m3u8-parser';\nimport type { LevelDetails } from '../loader/level-details';\nimport type { VariableMap } from '../types/level';\n\nconst VARIABLE_REPLACEMENT_REGEX = /\\{\\$([a-zA-Z0-9-_]+)\\}/g;\n\nexport function hasVariableReferences(str: string): boolean {\n return VARIABLE_REPLACEMENT_REGEX.test(str);\n}\n\nexport function substituteVariablesInAttributes(\n parsed: Pick<\n ParsedMultivariantPlaylist | LevelDetails,\n 'variableList' | 'hasVariableRefs' | 'playlistParsingError'\n >,\n attr: AttrList,\n attributeNames: string[],\n) {\n if (parsed.variableList !== null || parsed.hasVariableRefs) {\n for (let i = attributeNames.length; i--; ) {\n const name = attributeNames[i];\n const value = attr[name];\n if (value) {\n attr[name] = substituteVariables(parsed, value);\n }\n }\n }\n}\n\nexport function substituteVariables(\n parsed: Pick<\n ParsedMultivariantPlaylist | LevelDetails,\n 'variableList' | 'hasVariableRefs' | 'playlistParsingError'\n >,\n value: string,\n): string {\n if (parsed.variableList !== null || parsed.hasVariableRefs) {\n const variableList = parsed.variableList;\n return value.replace(\n VARIABLE_REPLACEMENT_REGEX,\n (variableReference: string) => {\n const variableName = variableReference.substring(\n 2,\n variableReference.length - 1,\n );\n const variableValue = variableList?.[variableName];\n if (variableValue === undefined) {\n parsed.playlistParsingError ||= new Error(\n `Missing preceding EXT-X-DEFINE tag for Variable Reference: \"${variableName}\"`,\n );\n return variableReference;\n }\n return variableValue;\n },\n );\n }\n return value;\n}\n\nexport function addVariableDefinition(\n parsed: Pick<\n ParsedMultivariantPlaylist | LevelDetails,\n 'variableList' | 'playlistParsingError'\n >,\n attr: AttrList,\n parentUrl: string,\n) {\n let variableList = parsed.variableList;\n if (!variableList) {\n parsed.variableList = variableList = {};\n }\n let NAME: string;\n let VALUE;\n if ('QUERYPARAM' in attr) {\n NAME = attr.QUERYPARAM;\n try {\n const searchParams = new self.URL(parentUrl).searchParams;\n if (searchParams.has(NAME)) {\n VALUE = searchParams.get(NAME);\n } else {\n throw new Error(\n `\"${NAME}\" does not match any query parameter in URI: \"${parentUrl}\"`,\n );\n }\n } catch (error) {\n parsed.playlistParsingError ||= new Error(\n `EXT-X-DEFINE QUERYPARAM: ${error.message}`,\n );\n }\n } else {\n NAME = attr.NAME;\n VALUE = attr.VALUE;\n }\n if (NAME in variableList) {\n parsed.playlistParsingError ||= new Error(\n `EXT-X-DEFINE duplicate Variable Name declarations: \"${NAME}\"`,\n );\n } else {\n variableList[NAME] = VALUE || '';\n }\n}\n\nexport function importVariableDefinition(\n parsed: Pick<\n ParsedMultivariantPlaylist | LevelDetails,\n 'variableList' | 'playlistParsingError'\n >,\n attr: AttrList,\n sourceVariableList: VariableMap | null,\n) {\n const IMPORT = attr.IMPORT;\n if (sourceVariableList && IMPORT in sourceVariableList) {\n let variableList = parsed.variableList;\n if (!variableList) {\n parsed.variableList = variableList = {};\n }\n variableList[IMPORT] = sourceVariableList[IMPORT];\n } else {\n parsed.playlistParsingError ||= new Error(\n `EXT-X-DEFINE IMPORT attribute not found in Multivariant Playlist: \"${IMPORT}\"`,\n );\n }\n}\n","/**\n * MediaSource helper\n */\n\nexport function getMediaSource(\n preferManagedMediaSource = true,\n): typeof MediaSource | undefined {\n if (typeof self === 'undefined') return undefined;\n const mms =\n (preferManagedMediaSource || !self.MediaSource) &&\n ((self as any).ManagedMediaSource as undefined | typeof MediaSource);\n return (\n mms ||\n self.MediaSource ||\n ((self as any).WebKitMediaSource as typeof MediaSource)\n );\n}\n\nexport function isManagedMediaSource(source: typeof MediaSource | undefined) {\n return (\n typeof self !== 'undefined' && source === (self as any).ManagedMediaSource\n );\n}\n","import { getMediaSource } from './mediasource-helper';\n\n// from http://mp4ra.org/codecs.html\n// values indicate codec selection preference (lower is higher priority)\nconst sampleEntryCodesISO = {\n audio: {\n a3ds: 1,\n 'ac-3': 0.95,\n 'ac-4': 1,\n alac: 0.9,\n alaw: 1,\n dra1: 1,\n 'dts+': 1,\n 'dts-': 1,\n dtsc: 1,\n dtse: 1,\n dtsh: 1,\n 'ec-3': 0.9,\n enca: 1,\n fLaC: 0.9, // MP4-RA listed codec entry for FLAC\n flac: 0.9, // legacy browser codec name for FLAC\n FLAC: 0.9, // some manifests may list \"FLAC\" with Apple's tools\n g719: 1,\n g726: 1,\n m4ae: 1,\n mha1: 1,\n mha2: 1,\n mhm1: 1,\n mhm2: 1,\n mlpa: 1,\n mp4a: 1,\n 'raw ': 1,\n Opus: 1,\n opus: 1, // browsers expect this to be lowercase despite MP4RA says 'Opus'\n samr: 1,\n sawb: 1,\n sawp: 1,\n sevc: 1,\n sqcp: 1,\n ssmv: 1,\n twos: 1,\n ulaw: 1,\n },\n video: {\n avc1: 1,\n avc2: 1,\n avc3: 1,\n avc4: 1,\n avcp: 1,\n av01: 0.8,\n drac: 1,\n dva1: 1,\n dvav: 1,\n dvh1: 0.7,\n dvhe: 0.7,\n encv: 1,\n hev1: 0.75,\n hvc1: 0.75,\n mjp2: 1,\n mp4v: 1,\n mvc1: 1,\n mvc2: 1,\n mvc3: 1,\n mvc4: 1,\n resv: 1,\n rv60: 1,\n s263: 1,\n svc1: 1,\n svc2: 1,\n 'vc-1': 1,\n vp08: 1,\n vp09: 0.9,\n },\n text: {\n stpp: 1,\n wvtt: 1,\n },\n} as const;\n\nexport type CodecType = 'audio' | 'video';\n\nexport function isCodecType(codec: string, type: CodecType): boolean {\n const typeCodes = sampleEntryCodesISO[type];\n return !!typeCodes && !!typeCodes[codec.slice(0, 4)];\n}\n\nexport function areCodecsMediaSourceSupported(\n codecs: string,\n type: CodecType,\n preferManagedMediaSource = true,\n): boolean {\n return !codecs\n .split(',')\n .some(\n (codec) =>\n !isCodecMediaSourceSupported(codec, type, preferManagedMediaSource),\n );\n}\n\nfunction isCodecMediaSourceSupported(\n codec: string,\n type: CodecType,\n preferManagedMediaSource = true,\n): boolean {\n const MediaSource = getMediaSource(preferManagedMediaSource);\n return MediaSource?.isTypeSupported(mimeTypeForCodec(codec, type)) ?? false;\n}\n\nexport function mimeTypeForCodec(codec: string, type: CodecType): string {\n return `${type}/mp4;codecs=\"${codec}\"`;\n}\n\nexport function videoCodecPreferenceValue(\n videoCodec: string | undefined,\n): number {\n if (videoCodec) {\n const fourCC = videoCodec.substring(0, 4);\n return sampleEntryCodesISO.video[fourCC];\n }\n return 2;\n}\n\nexport function codecsSetSelectionPreferenceValue(codecSet: string): number {\n return codecSet.split(',').reduce((num, fourCC) => {\n const preferenceValue = sampleEntryCodesISO.video[fourCC];\n if (preferenceValue) {\n return (preferenceValue * 2 + num) / (num ? 3 : 2);\n }\n return (sampleEntryCodesISO.audio[fourCC] + num) / (num ? 2 : 1);\n }, 0);\n}\n\ninterface CodecNameCache {\n flac?: string;\n opus?: string;\n}\n\nconst CODEC_COMPATIBLE_NAMES: CodecNameCache = {};\n\ntype LowerCaseCodecType = 'flac' | 'opus';\n\nfunction getCodecCompatibleNameLower(\n lowerCaseCodec: LowerCaseCodecType,\n preferManagedMediaSource = true,\n): string {\n if (CODEC_COMPATIBLE_NAMES[lowerCaseCodec]) {\n return CODEC_COMPATIBLE_NAMES[lowerCaseCodec]!;\n }\n\n // Idealy fLaC and Opus would be first (spec-compliant) but\n // some browsers will report that fLaC is supported then fail.\n // see: https://bugs.chromium.org/p/chromium/issues/detail?id=1422728\n const codecsToCheck = {\n flac: ['flac', 'fLaC', 'FLAC'],\n opus: ['opus', 'Opus'],\n }[lowerCaseCodec];\n\n for (let i = 0; i < codecsToCheck.length; i++) {\n if (\n isCodecMediaSourceSupported(\n codecsToCheck[i],\n 'audio',\n preferManagedMediaSource,\n )\n ) {\n CODEC_COMPATIBLE_NAMES[lowerCaseCodec] = codecsToCheck[i];\n return codecsToCheck[i];\n }\n }\n\n return lowerCaseCodec;\n}\n\nconst AUDIO_CODEC_REGEXP = /flac|opus/i;\nexport function getCodecCompatibleName(\n codec: string,\n preferManagedMediaSource = true,\n): string {\n return codec.replace(AUDIO_CODEC_REGEXP, (m) =>\n getCodecCompatibleNameLower(\n m.toLowerCase() as LowerCaseCodecType,\n preferManagedMediaSource,\n ),\n );\n}\n\nexport function pickMostCompleteCodecName(\n parsedCodec: string,\n levelCodec: string | undefined,\n): string | undefined {\n // Parsing of mp4a codecs strings in mp4-tools from media is incomplete as of d8c6c7a\n // so use level codec is parsed codec is unavailable or incomplete\n if (parsedCodec && parsedCodec !== 'mp4a') {\n return parsedCodec;\n }\n return levelCodec ? levelCodec.split(',')[0] : levelCodec;\n}\n\nexport function convertAVC1ToAVCOTI(codec: string) {\n // Convert avc1 codec string from RFC-4281 to RFC-6381 for MediaSource.isTypeSupported\n // Examples: avc1.66.30 to avc1.42001e and avc1.77.30,avc1.66.30 to avc1.4d001e,avc1.42001e.\n const codecs = codec.split(',');\n for (let i = 0; i < codecs.length; i++) {\n const avcdata = codecs[i].split('.');\n if (avcdata.length > 2) {\n let result = avcdata.shift() + '.';\n result += parseInt(avcdata.shift() as string).toString(16);\n result += (\n '000' + parseInt(avcdata.shift() as string).toString(16)\n ).slice(-4);\n codecs[i] = result;\n }\n }\n return codecs.join(',');\n}\n","import { buildAbsoluteURL } from 'url-toolkit';\nimport { DateRange } from './date-range';\nimport { Fragment, Part } from './fragment';\nimport { LevelDetails } from './level-details';\nimport { LevelKey } from './level-key';\nimport { AttrList } from '../utils/attr-list';\nimport { logger } from '../utils/logger';\nimport {\n addVariableDefinition,\n hasVariableReferences,\n importVariableDefinition,\n substituteVariables,\n substituteVariablesInAttributes,\n} from '../utils/variable-substitution';\nimport { isCodecType } from '../utils/codecs';\nimport type { CodecType } from '../utils/codecs';\nimport type { MediaPlaylist, MediaAttributes } from '../types/media-playlist';\nimport type { PlaylistLevelType } from '../types/loader';\nimport type { LevelAttributes, LevelParsed, VariableMap } from '../types/level';\nimport type { ContentSteeringOptions } from '../types/events';\n\ntype M3U8ParserFragments = Array;\n\nexport type ParsedMultivariantPlaylist = {\n contentSteering: ContentSteeringOptions | null;\n levels: LevelParsed[];\n playlistParsingError: Error | null;\n sessionData: Record | null;\n sessionKeys: LevelKey[] | null;\n startTimeOffset: number | null;\n variableList: VariableMap | null;\n hasVariableRefs: boolean;\n};\n\ntype ParsedMultivariantMediaOptions = {\n AUDIO?: MediaPlaylist[];\n SUBTITLES?: MediaPlaylist[];\n 'CLOSED-CAPTIONS'?: MediaPlaylist[];\n};\n\nconst MASTER_PLAYLIST_REGEX =\n /#EXT-X-STREAM-INF:([^\\r\\n]*)(?:[\\r\\n](?:#[^\\r\\n]*)?)*([^\\r\\n]+)|#EXT-X-(SESSION-DATA|SESSION-KEY|DEFINE|CONTENT-STEERING|START):([^\\r\\n]*)[\\r\\n]+/g;\nconst MASTER_PLAYLIST_MEDIA_REGEX = /#EXT-X-MEDIA:(.*)/g;\n\nconst IS_MEDIA_PLAYLIST = /^#EXT(?:INF|-X-TARGETDURATION):/m; // Handle empty Media Playlist (first EXTINF not signaled, but TARGETDURATION present)\n\nconst LEVEL_PLAYLIST_REGEX_FAST = new RegExp(\n [\n /#EXTINF:\\s*(\\d*(?:\\.\\d+)?)(?:,(.*)\\s+)?/.source, // duration (#EXTINF:,), group 1 => duration, group 2 => title\n /(?!#) *(\\S[^\\r\\n]*)/.source, // segment URI, group 3 => the URI (note newline is not eaten)\n /#EXT-X-BYTERANGE:*(.+)/.source, // next segment's byterange, group 4 => range spec (x@y)\n /#EXT-X-PROGRAM-DATE-TIME:(.+)/.source, // next segment's program date/time group 5 => the datetime spec\n /#.*/.source, // All other non-segment oriented tags will match with all groups empty\n ].join('|'),\n 'g',\n);\n\nconst LEVEL_PLAYLIST_REGEX_SLOW = new RegExp(\n [\n /#(EXTM3U)/.source,\n /#EXT-X-(DATERANGE|DEFINE|KEY|MAP|PART|PART-INF|PLAYLIST-TYPE|PRELOAD-HINT|RENDITION-REPORT|SERVER-CONTROL|SKIP|START):(.+)/\n .source,\n /#EXT-X-(BITRATE|DISCONTINUITY-SEQUENCE|MEDIA-SEQUENCE|TARGETDURATION|VERSION): *(\\d+)/\n .source,\n /#EXT-X-(DISCONTINUITY|ENDLIST|GAP|INDEPENDENT-SEGMENTS)/.source,\n /(#)([^:]*):(.*)/.source,\n /(#)(.*)(?:.*)\\r?\\n?/.source,\n ].join('|'),\n);\n\nexport default class M3U8Parser {\n static findGroup(\n groups: (\n | { id?: string; audioCodec?: string }\n | { id?: string; textCodec?: string }\n )[],\n mediaGroupId: string,\n ):\n | { id?: string; audioCodec?: string }\n | { id?: string; textCodec?: string }\n | undefined {\n for (let i = 0; i < groups.length; i++) {\n const group = groups[i];\n if (group.id === mediaGroupId) {\n return group;\n }\n }\n }\n\n static resolve(url, baseUrl) {\n return buildAbsoluteURL(baseUrl, url, { alwaysNormalize: true });\n }\n\n static isMediaPlaylist(str: string): boolean {\n return IS_MEDIA_PLAYLIST.test(str);\n }\n\n static parseMasterPlaylist(\n string: string,\n baseurl: string,\n ): ParsedMultivariantPlaylist {\n const hasVariableRefs = __USE_VARIABLE_SUBSTITUTION__\n ? hasVariableReferences(string)\n : false;\n const parsed: ParsedMultivariantPlaylist = {\n contentSteering: null,\n levels: [],\n playlistParsingError: null,\n sessionData: null,\n sessionKeys: null,\n startTimeOffset: null,\n variableList: null,\n hasVariableRefs,\n };\n const levelsWithKnownCodecs: LevelParsed[] = [];\n\n MASTER_PLAYLIST_REGEX.lastIndex = 0;\n\n let result: RegExpExecArray | null;\n while ((result = MASTER_PLAYLIST_REGEX.exec(string)) != null) {\n if (result[1]) {\n // '#EXT-X-STREAM-INF' is found, parse level tag in group 1\n const attrs = new AttrList(result[1]) as LevelAttributes;\n if (__USE_VARIABLE_SUBSTITUTION__) {\n substituteVariablesInAttributes(parsed, attrs, [\n 'CODECS',\n 'SUPPLEMENTAL-CODECS',\n 'ALLOWED-CPC',\n 'PATHWAY-ID',\n 'STABLE-VARIANT-ID',\n 'AUDIO',\n 'VIDEO',\n 'SUBTITLES',\n 'CLOSED-CAPTIONS',\n 'NAME',\n ]);\n }\n const uri = __USE_VARIABLE_SUBSTITUTION__\n ? substituteVariables(parsed, result[2])\n : result[2];\n const level: LevelParsed = {\n attrs,\n bitrate:\n attrs.decimalInteger('BANDWIDTH') ||\n attrs.decimalInteger('AVERAGE-BANDWIDTH'),\n name: attrs.NAME,\n url: M3U8Parser.resolve(uri, baseurl),\n };\n\n const resolution = attrs.decimalResolution('RESOLUTION');\n if (resolution) {\n level.width = resolution.width;\n level.height = resolution.height;\n }\n\n setCodecs(attrs.CODECS, level);\n\n if (!level.unknownCodecs?.length) {\n levelsWithKnownCodecs.push(level);\n }\n\n parsed.levels.push(level);\n } else if (result[3]) {\n const tag = result[3];\n const attributes = result[4];\n switch (tag) {\n case 'SESSION-DATA': {\n // #EXT-X-SESSION-DATA\n const sessionAttrs = new AttrList(attributes);\n if (__USE_VARIABLE_SUBSTITUTION__) {\n substituteVariablesInAttributes(parsed, sessionAttrs, [\n 'DATA-ID',\n 'LANGUAGE',\n 'VALUE',\n 'URI',\n ]);\n }\n const dataId = sessionAttrs['DATA-ID'];\n if (dataId) {\n if (parsed.sessionData === null) {\n parsed.sessionData = {};\n }\n parsed.sessionData[dataId] = sessionAttrs;\n }\n break;\n }\n case 'SESSION-KEY': {\n // #EXT-X-SESSION-KEY\n const sessionKey = parseKey(attributes, baseurl, parsed);\n if (sessionKey.encrypted && sessionKey.isSupported()) {\n if (parsed.sessionKeys === null) {\n parsed.sessionKeys = [];\n }\n parsed.sessionKeys.push(sessionKey);\n } else {\n logger.warn(\n `[Keys] Ignoring invalid EXT-X-SESSION-KEY tag: \"${attributes}\"`,\n );\n }\n break;\n }\n case 'DEFINE': {\n // #EXT-X-DEFINE\n if (__USE_VARIABLE_SUBSTITUTION__) {\n const variableAttributes = new AttrList(attributes);\n substituteVariablesInAttributes(parsed, variableAttributes, [\n 'NAME',\n 'VALUE',\n 'QUERYPARAM',\n ]);\n addVariableDefinition(parsed, variableAttributes, baseurl);\n }\n break;\n }\n case 'CONTENT-STEERING': {\n // #EXT-X-CONTENT-STEERING\n const contentSteeringAttributes = new AttrList(attributes);\n if (__USE_VARIABLE_SUBSTITUTION__) {\n substituteVariablesInAttributes(\n parsed,\n contentSteeringAttributes,\n ['SERVER-URI', 'PATHWAY-ID'],\n );\n }\n parsed.contentSteering = {\n uri: M3U8Parser.resolve(\n contentSteeringAttributes['SERVER-URI'],\n baseurl,\n ),\n pathwayId: contentSteeringAttributes['PATHWAY-ID'] || '.',\n };\n break;\n }\n case 'START': {\n // #EXT-X-START\n parsed.startTimeOffset = parseStartTimeOffset(attributes);\n break;\n }\n default:\n break;\n }\n }\n }\n // Filter out levels with unknown codecs if it does not remove all levels\n const stripUnknownCodecLevels =\n levelsWithKnownCodecs.length > 0 &&\n levelsWithKnownCodecs.length < parsed.levels.length;\n\n parsed.levels = stripUnknownCodecLevels\n ? levelsWithKnownCodecs\n : parsed.levels;\n if (parsed.levels.length === 0) {\n parsed.playlistParsingError = new Error('no levels found in manifest');\n }\n\n return parsed;\n }\n\n static parseMasterPlaylistMedia(\n string: string,\n baseurl: string,\n parsed: ParsedMultivariantPlaylist,\n ): ParsedMultivariantMediaOptions {\n let result: RegExpExecArray | null;\n const results: ParsedMultivariantMediaOptions = {};\n const levels = parsed.levels;\n const groupsByType = {\n AUDIO: levels.map((level: LevelParsed) => ({\n id: level.attrs.AUDIO,\n audioCodec: level.audioCodec,\n })),\n SUBTITLES: levels.map((level: LevelParsed) => ({\n id: level.attrs.SUBTITLES,\n textCodec: level.textCodec,\n })),\n 'CLOSED-CAPTIONS': [],\n };\n let id = 0;\n MASTER_PLAYLIST_MEDIA_REGEX.lastIndex = 0;\n while ((result = MASTER_PLAYLIST_MEDIA_REGEX.exec(string)) !== null) {\n const attrs = new AttrList(result[1]) as MediaAttributes;\n const type = attrs.TYPE;\n if (type) {\n const groups: (typeof groupsByType)[keyof typeof groupsByType] =\n groupsByType[type];\n const medias: MediaPlaylist[] = results[type] || [];\n results[type] = medias;\n if (__USE_VARIABLE_SUBSTITUTION__) {\n substituteVariablesInAttributes(parsed, attrs, [\n 'URI',\n 'GROUP-ID',\n 'LANGUAGE',\n 'ASSOC-LANGUAGE',\n 'STABLE-RENDITION-ID',\n 'NAME',\n 'INSTREAM-ID',\n 'CHARACTERISTICS',\n 'CHANNELS',\n ]);\n }\n const lang = attrs.LANGUAGE;\n const assocLang = attrs['ASSOC-LANGUAGE'];\n const channels = attrs.CHANNELS;\n const characteristics = attrs.CHARACTERISTICS;\n const instreamId = attrs['INSTREAM-ID'];\n const media: MediaPlaylist = {\n attrs,\n bitrate: 0,\n id: id++,\n groupId: attrs['GROUP-ID'] || '',\n name: attrs.NAME || lang || '',\n type,\n default: attrs.bool('DEFAULT'),\n autoselect: attrs.bool('AUTOSELECT'),\n forced: attrs.bool('FORCED'),\n lang,\n url: attrs.URI ? M3U8Parser.resolve(attrs.URI, baseurl) : '',\n };\n if (assocLang) {\n media.assocLang = assocLang;\n }\n if (channels) {\n media.channels = channels;\n }\n if (characteristics) {\n media.characteristics = characteristics;\n }\n if (instreamId) {\n media.instreamId = instreamId;\n }\n\n if (groups?.length) {\n // If there are audio or text groups signalled in the manifest, let's look for a matching codec string for this track\n // If we don't find the track signalled, lets use the first audio groups codec we have\n // Acting as a best guess\n const groupCodec =\n M3U8Parser.findGroup(groups, media.groupId as string) || groups[0];\n assignCodec(media, groupCodec, 'audioCodec');\n assignCodec(media, groupCodec, 'textCodec');\n }\n\n medias.push(media);\n }\n }\n return results;\n }\n\n static parseLevelPlaylist(\n string: string,\n baseurl: string,\n id: number,\n type: PlaylistLevelType,\n levelUrlId: number,\n multivariantVariableList: VariableMap | null,\n ): LevelDetails {\n const level = new LevelDetails(baseurl);\n const fragments: M3U8ParserFragments = level.fragments;\n // The most recent init segment seen (applies to all subsequent segments)\n let currentInitSegment: Fragment | null = null;\n let currentSN = 0;\n let currentPart = 0;\n let totalduration = 0;\n let discontinuityCounter = 0;\n let prevFrag: Fragment | null = null;\n let frag: Fragment = new Fragment(type, baseurl);\n let result: RegExpExecArray | RegExpMatchArray | null;\n let i: number;\n let levelkeys: { [key: string]: LevelKey } | undefined;\n let firstPdtIndex = -1;\n let createNextFrag = false;\n let nextByteRange: string | null = null;\n\n LEVEL_PLAYLIST_REGEX_FAST.lastIndex = 0;\n level.m3u8 = string;\n level.hasVariableRefs = __USE_VARIABLE_SUBSTITUTION__\n ? hasVariableReferences(string)\n : false;\n\n while ((result = LEVEL_PLAYLIST_REGEX_FAST.exec(string)) !== null) {\n if (createNextFrag) {\n createNextFrag = false;\n frag = new Fragment(type, baseurl);\n // setup the next fragment for part loading\n frag.start = totalduration;\n frag.sn = currentSN;\n frag.cc = discontinuityCounter;\n frag.level = id;\n if (currentInitSegment) {\n frag.initSegment = currentInitSegment;\n frag.rawProgramDateTime = currentInitSegment.rawProgramDateTime;\n currentInitSegment.rawProgramDateTime = null;\n if (nextByteRange) {\n frag.setByteRange(nextByteRange);\n nextByteRange = null;\n }\n }\n }\n\n const duration = result[1];\n if (duration) {\n // INF\n frag.duration = parseFloat(duration);\n // avoid sliced strings https://github.com/video-dev/hls.js/issues/939\n const title = (' ' + result[2]).slice(1);\n frag.title = title || null;\n frag.tagList.push(title ? ['INF', duration, title] : ['INF', duration]);\n } else if (result[3]) {\n // url\n if (Number.isFinite(frag.duration)) {\n frag.start = totalduration;\n if (levelkeys) {\n setFragLevelKeys(frag, levelkeys, level);\n }\n frag.sn = currentSN;\n frag.level = id;\n frag.cc = discontinuityCounter;\n fragments.push(frag);\n // avoid sliced strings https://github.com/video-dev/hls.js/issues/939\n const uri = (' ' + result[3]).slice(1);\n frag.relurl = __USE_VARIABLE_SUBSTITUTION__\n ? substituteVariables(level, uri)\n : uri;\n assignProgramDateTime(frag, prevFrag);\n prevFrag = frag;\n totalduration += frag.duration;\n currentSN++;\n currentPart = 0;\n createNextFrag = true;\n }\n } else if (result[4]) {\n // X-BYTERANGE\n const data = (' ' + result[4]).slice(1);\n if (prevFrag) {\n frag.setByteRange(data, prevFrag);\n } else {\n frag.setByteRange(data);\n }\n } else if (result[5]) {\n // PROGRAM-DATE-TIME\n // avoid sliced strings https://github.com/video-dev/hls.js/issues/939\n frag.rawProgramDateTime = (' ' + result[5]).slice(1);\n frag.tagList.push(['PROGRAM-DATE-TIME', frag.rawProgramDateTime]);\n if (firstPdtIndex === -1) {\n firstPdtIndex = fragments.length;\n }\n } else {\n result = result[0].match(LEVEL_PLAYLIST_REGEX_SLOW);\n if (!result) {\n logger.warn('No matches on slow regex match for level playlist!');\n continue;\n }\n for (i = 1; i < result.length; i++) {\n if (typeof result[i] !== 'undefined') {\n break;\n }\n }\n\n // avoid sliced strings https://github.com/video-dev/hls.js/issues/939\n const tag = (' ' + result[i]).slice(1);\n const value1 = (' ' + result[i + 1]).slice(1);\n const value2 = result[i + 2] ? (' ' + result[i + 2]).slice(1) : '';\n\n switch (tag) {\n case 'PLAYLIST-TYPE':\n level.type = value1.toUpperCase();\n break;\n case 'MEDIA-SEQUENCE':\n currentSN = level.startSN = parseInt(value1);\n break;\n case 'SKIP': {\n const skipAttrs = new AttrList(value1);\n if (__USE_VARIABLE_SUBSTITUTION__) {\n substituteVariablesInAttributes(level, skipAttrs, [\n 'RECENTLY-REMOVED-DATERANGES',\n ]);\n }\n const skippedSegments =\n skipAttrs.decimalInteger('SKIPPED-SEGMENTS');\n if (Number.isFinite(skippedSegments)) {\n level.skippedSegments = skippedSegments;\n // This will result in fragments[] containing undefined values, which we will fill in with `mergeDetails`\n for (let i = skippedSegments; i--; ) {\n fragments.unshift(null);\n }\n currentSN += skippedSegments;\n }\n const recentlyRemovedDateranges = skipAttrs.enumeratedString(\n 'RECENTLY-REMOVED-DATERANGES',\n );\n if (recentlyRemovedDateranges) {\n level.recentlyRemovedDateranges =\n recentlyRemovedDateranges.split('\\t');\n }\n break;\n }\n case 'TARGETDURATION':\n level.targetduration = Math.max(parseInt(value1), 1);\n break;\n case 'VERSION':\n level.version = parseInt(value1);\n break;\n case 'INDEPENDENT-SEGMENTS':\n case 'EXTM3U':\n break;\n case 'ENDLIST':\n level.live = false;\n break;\n case '#':\n if (value1 || value2) {\n frag.tagList.push(value2 ? [value1, value2] : [value1]);\n }\n break;\n case 'DISCONTINUITY':\n discontinuityCounter++;\n frag.tagList.push(['DIS']);\n break;\n case 'GAP':\n frag.gap = true;\n frag.tagList.push([tag]);\n break;\n case 'BITRATE':\n frag.tagList.push([tag, value1]);\n break;\n case 'DATERANGE': {\n const dateRangeAttr = new AttrList(value1);\n if (__USE_VARIABLE_SUBSTITUTION__) {\n substituteVariablesInAttributes(level, dateRangeAttr, [\n 'ID',\n 'CLASS',\n 'START-DATE',\n 'END-DATE',\n 'SCTE35-CMD',\n 'SCTE35-OUT',\n 'SCTE35-IN',\n ]);\n substituteVariablesInAttributes(\n level,\n dateRangeAttr,\n dateRangeAttr.clientAttrs,\n );\n }\n const dateRange = new DateRange(\n dateRangeAttr,\n level.dateRanges[dateRangeAttr.ID],\n );\n if (dateRange.isValid || level.skippedSegments) {\n level.dateRanges[dateRange.id] = dateRange;\n } else {\n logger.warn(`Ignoring invalid DATERANGE tag: \"${value1}\"`);\n }\n // Add to fragment tag list for backwards compatibility (< v1.2.0)\n frag.tagList.push(['EXT-X-DATERANGE', value1]);\n break;\n }\n case 'DEFINE': {\n if (__USE_VARIABLE_SUBSTITUTION__) {\n const variableAttributes = new AttrList(value1);\n substituteVariablesInAttributes(level, variableAttributes, [\n 'NAME',\n 'VALUE',\n 'IMPORT',\n 'QUERYPARAM',\n ]);\n if ('IMPORT' in variableAttributes) {\n importVariableDefinition(\n level,\n variableAttributes,\n multivariantVariableList,\n );\n } else {\n addVariableDefinition(level, variableAttributes, baseurl);\n }\n }\n break;\n }\n\n case 'DISCONTINUITY-SEQUENCE':\n discontinuityCounter = parseInt(value1);\n break;\n case 'KEY': {\n const levelKey = parseKey(value1, baseurl, level);\n if (levelKey.isSupported()) {\n if (levelKey.method === 'NONE') {\n levelkeys = undefined;\n break;\n }\n if (!levelkeys) {\n levelkeys = {};\n }\n if (levelkeys[levelKey.keyFormat]) {\n levelkeys = Object.assign({}, levelkeys);\n }\n levelkeys[levelKey.keyFormat] = levelKey;\n } else {\n logger.warn(`[Keys] Ignoring invalid EXT-X-KEY tag: \"${value1}\"`);\n }\n break;\n }\n case 'START':\n level.startTimeOffset = parseStartTimeOffset(value1);\n break;\n case 'MAP': {\n const mapAttrs = new AttrList(value1);\n if (__USE_VARIABLE_SUBSTITUTION__) {\n substituteVariablesInAttributes(level, mapAttrs, [\n 'BYTERANGE',\n 'URI',\n ]);\n }\n if (frag.duration) {\n // Initial segment tag is after segment duration tag.\n // #EXTINF: 6.0\n // #EXT-X-MAP:URI=\"init.mp4\n const init = new Fragment(type, baseurl);\n setInitSegment(init, mapAttrs, id, levelkeys);\n currentInitSegment = init;\n frag.initSegment = currentInitSegment;\n if (\n currentInitSegment.rawProgramDateTime &&\n !frag.rawProgramDateTime\n ) {\n frag.rawProgramDateTime = currentInitSegment.rawProgramDateTime;\n }\n } else {\n // Initial segment tag is before segment duration tag\n // Handle case where EXT-X-MAP is declared after EXT-X-BYTERANGE\n const end = frag.byteRangeEndOffset;\n if (end) {\n const start = frag.byteRangeStartOffset as number;\n nextByteRange = `${end - start}@${start}`;\n } else {\n nextByteRange = null;\n }\n setInitSegment(frag, mapAttrs, id, levelkeys);\n currentInitSegment = frag;\n createNextFrag = true;\n }\n break;\n }\n case 'SERVER-CONTROL': {\n const serverControlAttrs = new AttrList(value1);\n level.canBlockReload = serverControlAttrs.bool('CAN-BLOCK-RELOAD');\n level.canSkipUntil = serverControlAttrs.optionalFloat(\n 'CAN-SKIP-UNTIL',\n 0,\n );\n level.canSkipDateRanges =\n level.canSkipUntil > 0 &&\n serverControlAttrs.bool('CAN-SKIP-DATERANGES');\n level.partHoldBack = serverControlAttrs.optionalFloat(\n 'PART-HOLD-BACK',\n 0,\n );\n level.holdBack = serverControlAttrs.optionalFloat('HOLD-BACK', 0);\n break;\n }\n case 'PART-INF': {\n const partInfAttrs = new AttrList(value1);\n level.partTarget = partInfAttrs.decimalFloatingPoint('PART-TARGET');\n break;\n }\n case 'PART': {\n let partList = level.partList;\n if (!partList) {\n partList = level.partList = [];\n }\n const previousFragmentPart =\n currentPart > 0 ? partList[partList.length - 1] : undefined;\n const index = currentPart++;\n const partAttrs = new AttrList(value1);\n if (__USE_VARIABLE_SUBSTITUTION__) {\n substituteVariablesInAttributes(level, partAttrs, [\n 'BYTERANGE',\n 'URI',\n ]);\n }\n const part = new Part(\n partAttrs,\n frag,\n baseurl,\n index,\n previousFragmentPart,\n );\n partList.push(part);\n frag.duration += part.duration;\n break;\n }\n case 'PRELOAD-HINT': {\n const preloadHintAttrs = new AttrList(value1);\n if (__USE_VARIABLE_SUBSTITUTION__) {\n substituteVariablesInAttributes(level, preloadHintAttrs, ['URI']);\n }\n level.preloadHint = preloadHintAttrs;\n break;\n }\n case 'RENDITION-REPORT': {\n const renditionReportAttrs = new AttrList(value1);\n if (__USE_VARIABLE_SUBSTITUTION__) {\n substituteVariablesInAttributes(level, renditionReportAttrs, [\n 'URI',\n ]);\n }\n level.renditionReports = level.renditionReports || [];\n level.renditionReports.push(renditionReportAttrs);\n break;\n }\n default:\n logger.warn(`line parsed but not handled: ${result}`);\n break;\n }\n }\n }\n if (prevFrag && !prevFrag.relurl) {\n fragments.pop();\n totalduration -= prevFrag.duration;\n if (level.partList) {\n level.fragmentHint = prevFrag;\n }\n } else if (level.partList) {\n assignProgramDateTime(frag, prevFrag);\n frag.cc = discontinuityCounter;\n level.fragmentHint = frag;\n if (levelkeys) {\n setFragLevelKeys(frag, levelkeys, level);\n }\n }\n const fragmentLength = fragments.length;\n const firstFragment = fragments[0];\n const lastFragment = fragments[fragmentLength - 1];\n totalduration += level.skippedSegments * level.targetduration;\n if (totalduration > 0 && fragmentLength && lastFragment) {\n level.averagetargetduration = totalduration / fragmentLength;\n const lastSn = lastFragment.sn;\n level.endSN = lastSn !== 'initSegment' ? lastSn : 0;\n if (!level.live) {\n lastFragment.endList = true;\n }\n if (firstFragment) {\n level.startCC = firstFragment.cc;\n }\n } else {\n level.endSN = 0;\n level.startCC = 0;\n }\n if (level.fragmentHint) {\n totalduration += level.fragmentHint.duration;\n }\n level.totalduration = totalduration;\n level.endCC = discontinuityCounter;\n\n /**\n * Backfill any missing PDT values\n * \"If the first EXT-X-PROGRAM-DATE-TIME tag in a Playlist appears after\n * one or more Media Segment URIs, the client SHOULD extrapolate\n * backward from that tag (using EXTINF durations and/or media\n * timestamps) to associate dates with those segments.\"\n * We have already extrapolated forward, but all fragments up to the first instance of PDT do not have their PDTs\n * computed.\n */\n if (firstPdtIndex > 0) {\n backfillProgramDateTimes(fragments, firstPdtIndex);\n }\n\n return level;\n }\n}\n\nfunction parseKey(\n keyTagAttributes: string,\n baseurl: string,\n parsed: ParsedMultivariantPlaylist | LevelDetails,\n): LevelKey {\n // https://tools.ietf.org/html/rfc8216#section-4.3.2.4\n const keyAttrs = new AttrList(keyTagAttributes);\n if (__USE_VARIABLE_SUBSTITUTION__) {\n substituteVariablesInAttributes(parsed, keyAttrs, [\n 'KEYFORMAT',\n 'KEYFORMATVERSIONS',\n 'URI',\n 'IV',\n 'URI',\n ]);\n }\n const decryptmethod = keyAttrs.METHOD ?? '';\n const decrypturi = keyAttrs.URI;\n const decryptiv = keyAttrs.hexadecimalInteger('IV');\n const decryptkeyformatversions = keyAttrs.KEYFORMATVERSIONS;\n // From RFC: This attribute is OPTIONAL; its absence indicates an implicit value of \"identity\".\n const decryptkeyformat = keyAttrs.KEYFORMAT ?? 'identity';\n\n if (decrypturi && keyAttrs.IV && !decryptiv) {\n logger.error(`Invalid IV: ${keyAttrs.IV}`);\n }\n // If decrypturi is a URI with a scheme, then baseurl will be ignored\n // No uri is allowed when METHOD is NONE\n const resolvedUri = decrypturi ? M3U8Parser.resolve(decrypturi, baseurl) : '';\n const keyFormatVersions = (\n decryptkeyformatversions ? decryptkeyformatversions : '1'\n )\n .split('/')\n .map(Number)\n .filter(Number.isFinite);\n\n return new LevelKey(\n decryptmethod,\n resolvedUri,\n decryptkeyformat,\n keyFormatVersions,\n decryptiv,\n );\n}\n\nfunction parseStartTimeOffset(startAttributes: string): number | null {\n const startAttrs = new AttrList(startAttributes);\n const startTimeOffset = startAttrs.decimalFloatingPoint('TIME-OFFSET');\n if (Number.isFinite(startTimeOffset)) {\n return startTimeOffset;\n }\n return null;\n}\n\nfunction setCodecs(\n codecsAttributeValue: string | undefined,\n level: LevelParsed,\n) {\n let codecs = (codecsAttributeValue || '').split(/[ ,]+/).filter((c) => c);\n ['video', 'audio', 'text'].forEach((type: CodecType) => {\n const filtered = codecs.filter((codec) => isCodecType(codec, type));\n if (filtered.length) {\n // Comma separated list of all codecs for type\n level[`${type}Codec`] = filtered.join(',');\n // Remove known codecs so that only unknownCodecs are left after iterating through each type\n codecs = codecs.filter((codec) => filtered.indexOf(codec) === -1);\n }\n });\n level.unknownCodecs = codecs;\n}\n\nfunction assignCodec(\n media: MediaPlaylist,\n groupItem: { audioCodec?: string; textCodec?: string },\n codecProperty: 'audioCodec' | 'textCodec',\n) {\n const codecValue = groupItem[codecProperty];\n if (codecValue) {\n media[codecProperty] = codecValue;\n }\n}\n\nfunction backfillProgramDateTimes(\n fragments: M3U8ParserFragments,\n firstPdtIndex: number,\n) {\n let fragPrev = fragments[firstPdtIndex] as Fragment;\n for (let i = firstPdtIndex; i--; ) {\n const frag = fragments[i];\n // Exit on delta-playlist skipped segments\n if (!frag) {\n return;\n }\n frag.programDateTime =\n (fragPrev.programDateTime as number) - frag.duration * 1000;\n fragPrev = frag;\n }\n}\n\nfunction assignProgramDateTime(frag, prevFrag) {\n if (frag.rawProgramDateTime) {\n frag.programDateTime = Date.parse(frag.rawProgramDateTime);\n } else if (prevFrag?.programDateTime) {\n frag.programDateTime = prevFrag.endProgramDateTime;\n }\n\n if (!Number.isFinite(frag.programDateTime)) {\n frag.programDateTime = null;\n frag.rawProgramDateTime = null;\n }\n}\n\nfunction setInitSegment(\n frag: Fragment,\n mapAttrs: AttrList,\n id: number,\n levelkeys: { [key: string]: LevelKey } | undefined,\n) {\n frag.relurl = mapAttrs.URI;\n if (mapAttrs.BYTERANGE) {\n frag.setByteRange(mapAttrs.BYTERANGE);\n }\n frag.level = id;\n frag.sn = 'initSegment';\n if (levelkeys) {\n frag.levelkeys = levelkeys;\n }\n frag.initSegment = null;\n}\n\nfunction setFragLevelKeys(\n frag: Fragment,\n levelkeys: { [key: string]: LevelKey },\n level: LevelDetails,\n) {\n frag.levelkeys = levelkeys;\n const { encryptedFragments } = level;\n if (\n (!encryptedFragments.length ||\n encryptedFragments[encryptedFragments.length - 1].levelkeys !==\n levelkeys) &&\n Object.keys(levelkeys).some(\n (format) => levelkeys![format].isCommonEncryption,\n )\n ) {\n encryptedFragments.push(frag);\n }\n}\n","import type { LoaderConfig } from '../config';\nimport type { Fragment } from '../loader/fragment';\nimport type { Part } from '../loader/fragment';\nimport type { KeyLoaderInfo } from '../loader/key-loader';\nimport type { LevelDetails } from '../loader/level-details';\nimport type { HlsUrlParameters } from './level';\n\nexport interface LoaderContext {\n // target URL\n url: string;\n // loader response type (arraybuffer or default response type for playlist)\n responseType: string;\n // headers\n headers?: Record<string, string>;\n // start byte range offset\n rangeStart?: number;\n // end byte range offset\n rangeEnd?: number;\n // true if onProgress should report partial chunk of loaded content\n progressData?: boolean;\n}\n\nexport interface FragmentLoaderContext extends LoaderContext {\n frag: Fragment;\n part: Part | null;\n resetIV?: boolean;\n}\n\nexport interface KeyLoaderContext extends LoaderContext {\n keyInfo: KeyLoaderInfo;\n frag: Fragment;\n}\n\nexport interface LoaderConfiguration {\n // LoaderConfig policy that overrides required settings\n loadPolicy: LoaderConfig;\n /**\n * @deprecated use LoaderConfig timeoutRetry and errorRetry maxNumRetry\n */\n // Max number of load retries\n maxRetry: number;\n /**\n * @deprecated use LoaderConfig maxTimeToFirstByteMs and maxLoadTimeMs\n */\n // Timeout after which `onTimeOut` callback will be triggered\n // when loading has not finished after that delay\n timeout: number;\n /**\n * @deprecated use LoaderConfig timeoutRetry and errorRetry retryDelayMs\n */\n // Delay between an I/O error and following connection retry (ms).\n // This to avoid spamming the server\n retryDelay: number;\n /**\n * @deprecated use LoaderConfig timeoutRetry and errorRetry maxRetryDelayMs\n */\n // max connection retry delay (ms)\n maxRetryDelay: number;\n // When streaming progressively, this is the minimum chunk size required to emit a PROGRESS event\n highWaterMark?: number;\n}\n\nexport interface LoaderResponse {\n url: string;\n data?: string | ArrayBuffer | Object;\n // Errors can include HTTP status code and error message\n // Successful responses should include status code 200\n code?: number;\n text?: string;\n}\n\nexport interface LoaderStats {\n aborted: boolean;\n loaded: number;\n retry: number;\n total: number;\n chunkCount: number;\n bwEstimate: number;\n loading: HlsProgressivePerformanceTiming;\n parsing: HlsPerformanceTiming;\n buffering: HlsProgressivePerformanceTiming;\n}\n\nexport interface HlsPerformanceTiming {\n start: number;\n end: number;\n}\n\nexport interface HlsChunkPerformanceTiming extends HlsPerformanceTiming {\n executeStart: number;\n executeEnd: number;\n}\n\nexport interface HlsProgressivePerformanceTiming extends HlsPerformanceTiming {\n first: number;\n}\n\nexport type LoaderOnSuccess<T extends LoaderContext> = (\n response: LoaderResponse,\n stats: LoaderStats,\n context: T,\n networkDetails: any,\n) => void;\n\nexport type LoaderOnProgress<T extends LoaderContext> = (\n stats: LoaderStats,\n context: T,\n data: string | ArrayBuffer,\n networkDetails: any,\n) => void;\n\nexport type LoaderOnError<T extends LoaderContext> = (\n error: {\n // error status code\n code: number;\n // error description\n text: string;\n },\n context: T,\n networkDetails: any,\n stats: LoaderStats,\n) => void;\n\nexport type LoaderOnTimeout<T extends LoaderContext> = (\n stats: LoaderStats,\n context: T,\n networkDetails: any,\n) => void;\n\nexport type LoaderOnAbort<T extends LoaderContext> = (\n stats: LoaderStats,\n context: T,\n networkDetails: any,\n) => void;\n\nexport interface LoaderCallbacks<T extends LoaderContext> {\n onSuccess: LoaderOnSuccess<T>;\n onError: LoaderOnError<T>;\n onTimeout: LoaderOnTimeout<T>;\n onAbort?: LoaderOnAbort<T>;\n onProgress?: LoaderOnProgress<T>;\n}\n\nexport interface Loader<T extends LoaderContext> {\n destroy(): void;\n abort(): void;\n load(\n context: T,\n config: LoaderConfiguration,\n callbacks: LoaderCallbacks<T>,\n ): void;\n /**\n * `getCacheAge()` is called by hls.js to get the duration that a given object\n * has been sitting in a cache proxy when playing live. If implemented,\n * this should return a value in seconds.\n *\n * For HTTP based loaders, this should return the contents of the \"age\" header.\n *\n * @returns time object being lodaded\n */\n getCacheAge?: () => number | null;\n getResponseHeader?: (name: string) => string | null;\n context: T | null;\n stats: LoaderStats;\n}\n\nexport const enum PlaylistContextType {\n MANIFEST = 'manifest',\n LEVEL = 'level',\n AUDIO_TRACK = 'audioTrack',\n SUBTITLE_TRACK = 'subtitleTrack',\n}\n\nexport const enum PlaylistLevelType {\n MAIN = 'main',\n AUDIO = 'audio',\n SUBTITLE = 'subtitle',\n}\n\nexport interface PlaylistLoaderContext extends LoaderContext {\n type: PlaylistContextType;\n // the level index to load\n level: number | null;\n // level or track id from LevelLoadingData / TrackLoadingData\n id: number | null;\n // Media Playlist Group ID\n groupId?: string;\n // Content Steering Pathway ID (or undefined for default Pathway \".\")\n pathwayId?: string;\n // internal representation of a parsed m3u8 level playlist\n levelDetails?: LevelDetails;\n // Blocking playlist request delivery directives (or null id none were added to playlist url\n deliveryDirectives: HlsUrlParameters | null;\n}\n","/**\n * PlaylistLoader - delegate for media manifest/playlist loading tasks. Takes care of parsing media to internal data-models.\n *\n * Once loaded, dispatches events with parsed data-models of manifest/levels/audio/subtitle tracks.\n *\n * Uses loader(s) set in config to do actual internal loading of resource tasks.\n */\n\nimport { Events } from '../events';\nimport { ErrorDetails, ErrorTypes } from '../errors';\nimport { logger } from '../utils/logger';\nimport M3U8Parser from './m3u8-parser';\nimport type { LevelParsed, VariableMap } from '../types/level';\nimport type {\n Loader,\n LoaderCallbacks,\n LoaderConfiguration,\n LoaderContext,\n LoaderResponse,\n LoaderStats,\n PlaylistLoaderContext,\n} from '../types/loader';\nimport { PlaylistContextType, PlaylistLevelType } from '../types/loader';\nimport { LevelDetails } from './level-details';\nimport { AttrList } from '../utils/attr-list';\nimport type Hls from '../hls';\nimport type {\n ErrorData,\n LevelLoadingData,\n ManifestLoadingData,\n TrackLoadingData,\n} from '../types/events';\nimport type { NetworkComponentAPI } from '../types/component-api';\nimport type { MediaAttributes } from '../types/media-playlist';\nimport type { LoaderConfig, RetryConfig } from '../config';\n\nfunction mapContextToLevelType(\n context: PlaylistLoaderContext,\n): PlaylistLevelType {\n const { type } = context;\n\n switch (type) {\n case PlaylistContextType.AUDIO_TRACK:\n return PlaylistLevelType.AUDIO;\n case PlaylistContextType.SUBTITLE_TRACK:\n return PlaylistLevelType.SUBTITLE;\n default:\n return PlaylistLevelType.MAIN;\n }\n}\n\nfunction getResponseUrl(\n response: LoaderResponse,\n context: PlaylistLoaderContext,\n): string {\n let url = response.url;\n // responseURL not supported on some browsers (it is used to detect URL redirection)\n // data-uri mode also not supported (but no need to detect redirection)\n if (url === undefined || url.indexOf('data:') === 0) {\n // fallback to initial URL\n url = context.url;\n }\n return url;\n}\n\nclass PlaylistLoader implements NetworkComponentAPI {\n private readonly hls: Hls;\n private readonly loaders: {\n [key: string]: Loader<LoaderContext>;\n } = Object.create(null);\n private variableList: VariableMap | null = null;\n\n constructor(hls: Hls) {\n this.hls = hls;\n this.registerListeners();\n }\n\n public startLoad(startPosition: number): void {}\n\n public stopLoad(): void {\n this.destroyInternalLoaders();\n }\n\n private registerListeners() {\n const { hls } = this;\n hls.on(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n hls.on(Events.LEVEL_LOADING, this.onLevelLoading, this);\n hls.on(Events.AUDIO_TRACK_LOADING, this.onAudioTrackLoading, this);\n hls.on(Events.SUBTITLE_TRACK_LOADING, this.onSubtitleTrackLoading, this);\n }\n\n private unregisterListeners() {\n const { hls } = this;\n hls.off(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n hls.off(Events.LEVEL_LOADING, this.onLevelLoading, this);\n hls.off(Events.AUDIO_TRACK_LOADING, this.onAudioTrackLoading, this);\n hls.off(Events.SUBTITLE_TRACK_LOADING, this.onSubtitleTrackLoading, this);\n }\n\n /**\n * Returns defaults or configured loader-type overloads (pLoader and loader config params)\n */\n private createInternalLoader(\n context: PlaylistLoaderContext,\n ): Loader<LoaderContext> {\n const config = this.hls.config;\n const PLoader = config.pLoader;\n const Loader = config.loader;\n const InternalLoader = PLoader || Loader;\n const loader = new InternalLoader(config) as Loader<PlaylistLoaderContext>;\n\n this.loaders[context.type] = loader;\n return loader;\n }\n\n private getInternalLoader(\n context: PlaylistLoaderContext,\n ): Loader<LoaderContext> | undefined {\n return this.loaders[context.type];\n }\n\n private resetInternalLoader(contextType): void {\n if (this.loaders[contextType]) {\n delete this.loaders[contextType];\n }\n }\n\n /**\n * Call `destroy` on all internal loader instances mapped (one per context type)\n */\n private destroyInternalLoaders(): void {\n for (const contextType in this.loaders) {\n const loader = this.loaders[contextType];\n if (loader) {\n loader.destroy();\n }\n\n this.resetInternalLoader(contextType);\n }\n }\n\n public destroy(): void {\n this.variableList = null;\n this.unregisterListeners();\n this.destroyInternalLoaders();\n }\n\n private onManifestLoading(\n event: Events.MANIFEST_LOADING,\n data: ManifestLoadingData,\n ) {\n const { url } = data;\n this.variableList = null;\n this.load({\n id: null,\n level: 0,\n responseType: 'text',\n type: PlaylistContextType.MANIFEST,\n url,\n deliveryDirectives: null,\n });\n }\n\n private onLevelLoading(event: Events.LEVEL_LOADING, data: LevelLoadingData) {\n const { id, level, pathwayId, url, deliveryDirectives } = data;\n this.load({\n id,\n level,\n pathwayId,\n responseType: 'text',\n type: PlaylistContextType.LEVEL,\n url,\n deliveryDirectives,\n });\n }\n\n private onAudioTrackLoading(\n event: Events.AUDIO_TRACK_LOADING,\n data: TrackLoadingData,\n ) {\n const { id, groupId, url, deliveryDirectives } = data;\n this.load({\n id,\n groupId,\n level: null,\n responseType: 'text',\n type: PlaylistContextType.AUDIO_TRACK,\n url,\n deliveryDirectives,\n });\n }\n\n private onSubtitleTrackLoading(\n event: Events.SUBTITLE_TRACK_LOADING,\n data: TrackLoadingData,\n ) {\n const { id, groupId, url, deliveryDirectives } = data;\n this.load({\n id,\n groupId,\n level: null,\n responseType: 'text',\n type: PlaylistContextType.SUBTITLE_TRACK,\n url,\n deliveryDirectives,\n });\n }\n\n private load(context: PlaylistLoaderContext): void {\n const config = this.hls.config;\n\n // logger.debug(`[playlist-loader]: Loading playlist of type ${context.type}, level: ${context.level}, id: ${context.id}`);\n\n // Check if a loader for this context already exists\n let loader = this.getInternalLoader(context);\n if (loader) {\n const loaderContext = loader.context as PlaylistLoaderContext;\n if (\n loaderContext &&\n loaderContext.url === context.url &&\n loaderContext.level === context.level\n ) {\n // same URL can't overlap\n logger.trace('[playlist-loader]: playlist request ongoing');\n return;\n }\n logger.log(\n `[playlist-loader]: aborting previous loader for type: ${context.type}`,\n );\n loader.abort();\n }\n\n // apply different configs for retries depending on\n // context (manifest, level, audio/subs playlist)\n let loadPolicy: LoaderConfig;\n if (context.type === PlaylistContextType.MANIFEST) {\n loadPolicy = config.manifestLoadPolicy.default;\n } else {\n loadPolicy = Object.assign({}, config.playlistLoadPolicy.default, {\n timeoutRetry: null,\n errorRetry: null,\n });\n }\n loader = this.createInternalLoader(context);\n\n // Override level/track timeout for LL-HLS requests\n // (the default of 10000ms is counter productive to blocking playlist reload requests)\n if (Number.isFinite(context.deliveryDirectives?.part)) {\n let levelDetails: LevelDetails | undefined;\n if (\n context.type === PlaylistContextType.LEVEL &&\n context.level !== null\n ) {\n levelDetails = this.hls.levels[context.level].details;\n } else if (\n context.type === PlaylistContextType.AUDIO_TRACK &&\n context.id !== null\n ) {\n levelDetails = this.hls.audioTracks[context.id].details;\n } else if (\n context.type === PlaylistContextType.SUBTITLE_TRACK &&\n context.id !== null\n ) {\n levelDetails = this.hls.subtitleTracks[context.id].details;\n }\n if (levelDetails) {\n const partTarget = levelDetails.partTarget;\n const targetDuration = levelDetails.targetduration;\n if (partTarget && targetDuration) {\n const maxLowLatencyPlaylistRefresh =\n Math.max(partTarget * 3, targetDuration * 0.8) * 1000;\n loadPolicy = Object.assign({}, loadPolicy, {\n maxTimeToFirstByteMs: Math.min(\n maxLowLatencyPlaylistRefresh,\n loadPolicy.maxTimeToFirstByteMs,\n ),\n maxLoadTimeMs: Math.min(\n maxLowLatencyPlaylistRefresh,\n loadPolicy.maxTimeToFirstByteMs,\n ),\n });\n }\n }\n }\n\n const legacyRetryCompatibility: RetryConfig | Record<string, void> =\n loadPolicy.errorRetry || loadPolicy.timeoutRetry || {};\n const loaderConfig: LoaderConfiguration = {\n loadPolicy,\n timeout: loadPolicy.maxLoadTimeMs,\n maxRetry: legacyRetryCompatibility.maxNumRetry || 0,\n retryDelay: legacyRetryCompatibility.retryDelayMs || 0,\n maxRetryDelay: legacyRetryCompatibility.maxRetryDelayMs || 0,\n };\n\n const loaderCallbacks: LoaderCallbacks<PlaylistLoaderContext> = {\n onSuccess: (response, stats, context, networkDetails) => {\n const loader = this.getInternalLoader(context) as\n | Loader<PlaylistLoaderContext>\n | undefined;\n this.resetInternalLoader(context.type);\n\n const string = response.data as string;\n\n // Validate if it is an M3U8 at all\n if (string.indexOf('#EXTM3U') !== 0) {\n this.handleManifestParsingError(\n response,\n context,\n new Error('no EXTM3U delimiter'),\n networkDetails || null,\n stats,\n );\n return;\n }\n\n stats.parsing.start = performance.now();\n if (M3U8Parser.isMediaPlaylist(string)) {\n this.handleTrackOrLevelPlaylist(\n response,\n stats,\n context,\n networkDetails || null,\n loader,\n );\n } else {\n this.handleMasterPlaylist(response, stats, context, networkDetails);\n }\n },\n onError: (response, context, networkDetails, stats) => {\n this.handleNetworkError(\n context,\n networkDetails,\n false,\n response,\n stats,\n );\n },\n onTimeout: (stats, context, networkDetails) => {\n this.handleNetworkError(\n context,\n networkDetails,\n true,\n undefined,\n stats,\n );\n },\n };\n\n // logger.debug(`[playlist-loader]: Calling internal loader delegate for URL: ${context.url}`);\n\n loader.load(context, loaderConfig, loaderCallbacks);\n }\n\n private handleMasterPlaylist(\n response: LoaderResponse,\n stats: LoaderStats,\n context: PlaylistLoaderContext,\n networkDetails: any,\n ): void {\n const hls = this.hls;\n const string = response.data as string;\n\n const url = getResponseUrl(response, context);\n\n const parsedResult = M3U8Parser.parseMasterPlaylist(string, url);\n\n if (parsedResult.playlistParsingError) {\n this.handleManifestParsingError(\n response,\n context,\n parsedResult.playlistParsingError,\n networkDetails,\n stats,\n );\n return;\n }\n\n const {\n contentSteering,\n levels,\n sessionData,\n sessionKeys,\n startTimeOffset,\n variableList,\n } = parsedResult;\n\n this.variableList = variableList;\n\n const {\n AUDIO: audioTracks = [],\n SUBTITLES: subtitles,\n 'CLOSED-CAPTIONS': captions,\n } = M3U8Parser.parseMasterPlaylistMedia(string, url, parsedResult);\n\n if (audioTracks.length) {\n // check if we have found an audio track embedded in main playlist (audio track without URI attribute)\n const embeddedAudioFound: boolean = audioTracks.some(\n (audioTrack) => !audioTrack.url,\n );\n\n // if no embedded audio track defined, but audio codec signaled in quality level,\n // we need to signal this main audio track this could happen with playlists with\n // alt audio rendition in which quality levels (main)\n // contains both audio+video. but with mixed audio track not signaled\n if (\n !embeddedAudioFound &&\n levels[0].audioCodec &&\n !levels[0].attrs.AUDIO\n ) {\n logger.log(\n '[playlist-loader]: audio codec signaled in quality level, but no embedded audio track signaled, create one',\n );\n audioTracks.unshift({\n type: 'main',\n name: 'main',\n groupId: 'main',\n default: false,\n autoselect: false,\n forced: false,\n id: -1,\n attrs: new AttrList({}) as MediaAttributes,\n bitrate: 0,\n url: '',\n });\n }\n }\n\n hls.trigger(Events.MANIFEST_LOADED, {\n levels,\n audioTracks,\n subtitles,\n captions,\n contentSteering,\n url,\n stats,\n networkDetails,\n sessionData,\n sessionKeys,\n startTimeOffset,\n variableList,\n });\n }\n\n private handleTrackOrLevelPlaylist(\n response: LoaderResponse,\n stats: LoaderStats,\n context: PlaylistLoaderContext,\n networkDetails: any,\n loader: Loader<PlaylistLoaderContext> | undefined,\n ): void {\n const hls = this.hls;\n const { id, level, type } = context;\n\n const url = getResponseUrl(response, context);\n const levelUrlId = 0;\n const levelId = Number.isFinite(level as number)\n ? (level as number)\n : Number.isFinite(id as number)\n ? (id as number)\n : 0;\n const levelType = mapContextToLevelType(context);\n const levelDetails: LevelDetails = M3U8Parser.parseLevelPlaylist(\n response.data as string,\n url,\n levelId,\n levelType,\n levelUrlId,\n this.variableList,\n );\n\n // We have done our first request (Manifest-type) and receive\n // not a master playlist but a chunk-list (track/level)\n // We fire the manifest-loaded event anyway with the parsed level-details\n // by creating a single-level structure for it.\n if (type === PlaylistContextType.MANIFEST) {\n const singleLevel: LevelParsed = {\n attrs: new AttrList({}),\n bitrate: 0,\n details: levelDetails,\n name: '',\n url,\n };\n\n hls.trigger(Events.MANIFEST_LOADED, {\n levels: [singleLevel],\n audioTracks: [],\n url,\n stats,\n networkDetails,\n sessionData: null,\n sessionKeys: null,\n contentSteering: null,\n startTimeOffset: null,\n variableList: null,\n });\n }\n\n // save parsing time\n stats.parsing.end = performance.now();\n\n // extend the context with the new levelDetails property\n context.levelDetails = levelDetails;\n\n this.handlePlaylistLoaded(\n levelDetails,\n response,\n stats,\n context,\n networkDetails,\n loader,\n );\n }\n\n private handleManifestParsingError(\n response: LoaderResponse,\n context: PlaylistLoaderContext,\n error: Error,\n networkDetails: any,\n stats: LoaderStats,\n ): void {\n this.hls.trigger(Events.ERROR, {\n type: ErrorTypes.NETWORK_ERROR,\n details: ErrorDetails.MANIFEST_PARSING_ERROR,\n fatal: context.type === PlaylistContextType.MANIFEST,\n url: response.url,\n err: error,\n error,\n reason: error.message,\n response,\n context,\n networkDetails,\n stats,\n });\n }\n\n private handleNetworkError(\n context: PlaylistLoaderContext,\n networkDetails: any,\n timeout = false,\n response: { code: number; text: string } | undefined,\n stats: LoaderStats,\n ): void {\n let message = `A network ${\n timeout\n ? 'timeout'\n : 'error' + (response ? ' (status ' + response.code + ')' : '')\n } occurred while loading ${context.type}`;\n if (context.type === PlaylistContextType.LEVEL) {\n message += `: ${context.level} id: ${context.id}`;\n } else if (\n context.type === PlaylistContextType.AUDIO_TRACK ||\n context.type === PlaylistContextType.SUBTITLE_TRACK\n ) {\n message += ` id: ${context.id} group-id: \"${context.groupId}\"`;\n }\n const error = new Error(message);\n logger.warn(`[playlist-loader]: ${message}`);\n let details = ErrorDetails.UNKNOWN;\n let fatal = false;\n\n const loader = this.getInternalLoader(context);\n\n switch (context.type) {\n case PlaylistContextType.MANIFEST:\n details = timeout\n ? ErrorDetails.MANIFEST_LOAD_TIMEOUT\n : ErrorDetails.MANIFEST_LOAD_ERROR;\n fatal = true;\n break;\n case PlaylistContextType.LEVEL:\n details = timeout\n ? ErrorDetails.LEVEL_LOAD_TIMEOUT\n : ErrorDetails.LEVEL_LOAD_ERROR;\n fatal = false;\n break;\n case PlaylistContextType.AUDIO_TRACK:\n details = timeout\n ? ErrorDetails.AUDIO_TRACK_LOAD_TIMEOUT\n : ErrorDetails.AUDIO_TRACK_LOAD_ERROR;\n fatal = false;\n break;\n case PlaylistContextType.SUBTITLE_TRACK:\n details = timeout\n ? ErrorDetails.SUBTITLE_TRACK_LOAD_TIMEOUT\n : ErrorDetails.SUBTITLE_LOAD_ERROR;\n fatal = false;\n break;\n }\n\n if (loader) {\n this.resetInternalLoader(context.type);\n }\n\n const errorData: ErrorData = {\n type: ErrorTypes.NETWORK_ERROR,\n details,\n fatal,\n url: context.url,\n loader,\n context,\n error,\n networkDetails,\n stats,\n };\n\n if (response) {\n const url = networkDetails?.url || context.url;\n errorData.response = { url, data: undefined as any, ...response };\n }\n\n this.hls.trigger(Events.ERROR, errorData);\n }\n\n private handlePlaylistLoaded(\n levelDetails: LevelDetails,\n response: LoaderResponse,\n stats: LoaderStats,\n context: PlaylistLoaderContext,\n networkDetails: any,\n loader: Loader<PlaylistLoaderContext> | undefined,\n ): void {\n const hls = this.hls;\n const { type, level, id, groupId, deliveryDirectives } = context;\n const url = getResponseUrl(response, context);\n const parent = mapContextToLevelType(context);\n const levelIndex =\n typeof context.level === 'number' && parent === PlaylistLevelType.MAIN\n ? (level as number)\n : undefined;\n if (!levelDetails.fragments.length) {\n const error = new Error('No Segments found in Playlist');\n hls.trigger(Events.ERROR, {\n type: ErrorTypes.NETWORK_ERROR,\n details: ErrorDetails.LEVEL_EMPTY_ERROR,\n fatal: false,\n url,\n error,\n reason: error.message,\n response,\n context,\n level: levelIndex,\n parent,\n networkDetails,\n stats,\n });\n return;\n }\n if (!levelDetails.targetduration) {\n levelDetails.playlistParsingError = new Error('Missing Target Duration');\n }\n const error = levelDetails.playlistParsingError;\n if (error) {\n hls.trigger(Events.ERROR, {\n type: ErrorTypes.NETWORK_ERROR,\n details: ErrorDetails.LEVEL_PARSING_ERROR,\n fatal: false,\n url,\n error,\n reason: error.message,\n response,\n context,\n level: levelIndex,\n parent,\n networkDetails,\n stats,\n });\n return;\n }\n\n if (levelDetails.live && loader) {\n if (loader.getCacheAge) {\n levelDetails.ageHeader = loader.getCacheAge() || 0;\n }\n if (!loader.getCacheAge || isNaN(levelDetails.ageHeader)) {\n levelDetails.ageHeader = 0;\n }\n }\n\n switch (type) {\n case PlaylistContextType.MANIFEST:\n case PlaylistContextType.LEVEL:\n hls.trigger(Events.LEVEL_LOADED, {\n details: levelDetails,\n level: levelIndex || 0,\n id: id || 0,\n stats,\n networkDetails,\n deliveryDirectives,\n });\n break;\n case PlaylistContextType.AUDIO_TRACK:\n hls.trigger(Events.AUDIO_TRACK_LOADED, {\n details: levelDetails,\n id: id || 0,\n groupId: groupId || '',\n stats,\n networkDetails,\n deliveryDirectives,\n });\n break;\n case PlaylistContextType.SUBTITLE_TRACK:\n hls.trigger(Events.SUBTITLE_TRACK_LOADED, {\n details: levelDetails,\n id: id || 0,\n groupId: groupId || '',\n stats,\n networkDetails,\n deliveryDirectives,\n });\n break;\n }\n }\n}\n\nexport default PlaylistLoader;\n","import { logger } from './logger';\n\nexport function sendAddTrackEvent(track: TextTrack, videoEl: HTMLMediaElement) {\n let event: Event;\n try {\n event = new Event('addtrack');\n } catch (err) {\n // for IE11\n event = document.createEvent('Event');\n event.initEvent('addtrack', false, false);\n }\n (event as any).track = track;\n videoEl.dispatchEvent(event);\n}\n\nexport function addCueToTrack(track: TextTrack, cue: VTTCue) {\n // Sometimes there are cue overlaps on segmented vtts so the same\n // cue can appear more than once in different vtt files.\n // This avoid showing duplicated cues with same timecode and text.\n const mode = track.mode;\n if (mode === 'disabled') {\n track.mode = 'hidden';\n }\n if (track.cues && !track.cues.getCueById(cue.id)) {\n try {\n track.addCue(cue);\n if (!track.cues.getCueById(cue.id)) {\n throw new Error(`addCue is failed for: ${cue}`);\n }\n } catch (err) {\n logger.debug(`[texttrack-utils]: ${err}`);\n try {\n const textTrackCue = new (self.TextTrackCue as any)(\n cue.startTime,\n cue.endTime,\n cue.text,\n );\n textTrackCue.id = cue.id;\n track.addCue(textTrackCue);\n } catch (err2) {\n logger.debug(\n `[texttrack-utils]: Legacy TextTrackCue fallback failed: ${err2}`,\n );\n }\n }\n }\n if (mode === 'disabled') {\n track.mode = mode;\n }\n}\n\nexport function clearCurrentCues(track: TextTrack) {\n // When track.mode is disabled, track.cues will be null.\n // To guarantee the removal of cues, we need to temporarily\n // change the mode to hidden\n const mode = track.mode;\n if (mode === 'disabled') {\n track.mode = 'hidden';\n }\n if (track.cues) {\n for (let i = track.cues.length; i--; ) {\n track.removeCue(track.cues[i]);\n }\n }\n if (mode === 'disabled') {\n track.mode = mode;\n }\n}\n\nexport function removeCuesInRange(\n track: TextTrack,\n start: number,\n end: number,\n predicate?: (cue: TextTrackCue) => boolean,\n) {\n const mode = track.mode;\n if (mode === 'disabled') {\n track.mode = 'hidden';\n }\n\n if (track.cues && track.cues.length > 0) {\n const cues = getCuesInRange(track.cues, start, end);\n for (let i = 0; i < cues.length; i++) {\n if (!predicate || predicate(cues[i])) {\n track.removeCue(cues[i]);\n }\n }\n }\n if (mode === 'disabled') {\n track.mode = mode;\n }\n}\n\n// Find first cue starting after given time.\n// Modified version of binary search O(log(n)).\nfunction getFirstCueIndexAfterTime(\n cues: TextTrackCueList | TextTrackCue[],\n time: number,\n): number {\n // If first cue starts after time, start there\n if (time < cues[0].startTime) {\n return 0;\n }\n // If the last cue ends before time there is no overlap\n const len = cues.length - 1;\n if (time > cues[len].endTime) {\n return -1;\n }\n\n let left = 0;\n let right = len;\n\n while (left <= right) {\n const mid = Math.floor((right + left) / 2);\n\n if (time < cues[mid].startTime) {\n right = mid - 1;\n } else if (time > cues[mid].startTime && left < len) {\n left = mid + 1;\n } else {\n // If it's not lower or higher, it must be equal.\n return mid;\n }\n }\n // At this point, left and right have swapped.\n // No direct match was found, left or right element must be the closest. Check which one has the smallest diff.\n return cues[left].startTime - time < time - cues[right].startTime\n ? left\n : right;\n}\n\nexport function getCuesInRange(\n cues: TextTrackCueList | TextTrackCue[],\n start: number,\n end: number,\n): TextTrackCue[] {\n const cuesFound: TextTrackCue[] = [];\n const firstCueInRange = getFirstCueIndexAfterTime(cues, start);\n if (firstCueInRange > -1) {\n for (let i = firstCueInRange, len = cues.length; i < len; i++) {\n const cue = cues[i];\n if (cue.startTime >= start && cue.endTime <= end) {\n cuesFound.push(cue);\n } else if (cue.startTime > end) {\n return cuesFound;\n }\n }\n }\n return cuesFound;\n}\n\nexport function filterSubtitleTracks(\n textTrackList: TextTrackList,\n): TextTrack[] {\n const tracks: TextTrack[] = [];\n for (let i = 0; i < textTrackList.length; i++) {\n const track = textTrackList[i];\n // Edge adds a track without a label; we don't want to use it\n if (\n (track.kind === 'subtitles' || track.kind === 'captions') &&\n track.label\n ) {\n tracks.push(textTrackList[i]);\n }\n }\n return tracks;\n}\n","import type { RationalTimestamp } from '../utils/timescale-conversion';\n\nexport interface Demuxer {\n demux(\n data: Uint8Array,\n timeOffset: number,\n isSampleAes?: boolean,\n flush?: boolean,\n ): DemuxerResult;\n demuxSampleAes(\n data: Uint8Array,\n keyData: KeyData,\n timeOffset: number,\n ): Promise<DemuxerResult>;\n flush(timeOffset?: number): DemuxerResult | Promise<DemuxerResult>;\n destroy(): void;\n resetInitSegment(\n initSegment: Uint8Array | undefined,\n audioCodec: string | undefined,\n videoCodec: string | undefined,\n trackDuration: number,\n );\n resetTimeStamp(defaultInitPTS?: RationalTimestamp | null): void;\n resetContiguity(): void;\n}\n\nexport interface DemuxerResult {\n audioTrack: DemuxedAudioTrack;\n videoTrack: DemuxedVideoTrackBase;\n id3Track: DemuxedMetadataTrack;\n textTrack: DemuxedUserdataTrack;\n}\n\nexport interface DemuxedTrack {\n type: string;\n id: number;\n pid: number;\n inputTimeScale: number;\n sequenceNumber: number;\n samples:\n | AudioSample[]\n | VideoSample[]\n | MetadataSample[]\n | UserdataSample[]\n | Uint8Array;\n timescale?: number;\n container?: string;\n dropped: number;\n duration?: number;\n pesData?: ElementaryStreamData | null;\n codec?: string;\n}\n\nexport interface PassthroughTrack extends DemuxedTrack {\n sampleDuration: number;\n samples: Uint8Array;\n timescale: number;\n duration: number;\n codec: string;\n}\nexport interface DemuxedAudioTrack extends DemuxedTrack {\n config?: number[] | Uint8Array;\n samplerate?: number;\n segmentCodec?: string;\n channelCount?: number;\n manifestCodec?: string;\n samples: AudioSample[];\n}\n\nexport interface DemuxedVideoTrackBase extends DemuxedTrack {\n width?: number;\n height?: number;\n pixelRatio?: [number, number];\n audFound?: boolean;\n pps?: Uint8Array[];\n sps?: Uint8Array[];\n naluState?: number;\n segmentCodec?: string;\n manifestCodec?: string;\n samples: VideoSample[] | Uint8Array;\n}\n\nexport interface DemuxedVideoTrack extends DemuxedVideoTrackBase {\n samples: VideoSample[];\n}\n\nexport interface DemuxedMetadataTrack extends DemuxedTrack {\n samples: MetadataSample[];\n}\n\nexport interface DemuxedUserdataTrack extends DemuxedTrack {\n samples: UserdataSample[];\n}\n\nexport const enum MetadataSchema {\n audioId3 = 'org.id3',\n dateRange = 'com.apple.quicktime.HLS',\n emsg = 'https://aomedia.org/emsg/ID3',\n}\nexport interface MetadataSample {\n pts: number;\n dts: number;\n duration: number;\n len?: number;\n data: Uint8Array;\n type: MetadataSchema;\n}\n\nexport interface UserdataSample {\n pts: number;\n bytes?: Uint8Array;\n type?: number;\n payloadType?: number;\n uuid?: string;\n userData?: string;\n userDataBytes?: Uint8Array;\n}\n\nexport interface VideoSample {\n dts: number;\n pts: number;\n key: boolean;\n frame: boolean;\n units: VideoSampleUnit[];\n debug: string;\n length: number;\n}\n\nexport interface VideoSampleUnit {\n data: Uint8Array;\n type: number;\n state?: number;\n}\n\nexport type AudioSample = {\n unit: Uint8Array;\n pts: number;\n};\n\nexport type AudioFrame = {\n sample: AudioSample;\n length: number;\n missing: number;\n};\n\nexport interface ElementaryStreamData {\n data: Uint8Array[];\n size: number;\n}\n\nexport interface KeyData {\n method: string;\n key: Uint8Array;\n iv: Uint8Array;\n}\n","import { Events } from '../events';\nimport {\n sendAddTrackEvent,\n clearCurrentCues,\n removeCuesInRange,\n} from '../utils/texttrack-utils';\nimport * as ID3 from '../demux/id3';\nimport {\n DateRange,\n isDateRangeCueAttribute,\n isSCTE35Attribute,\n} from '../loader/date-range';\nimport { MetadataSchema } from '../types/demuxer';\nimport type {\n BufferFlushingData,\n FragParsingMetadataData,\n LevelUpdatedData,\n MediaAttachedData,\n} from '../types/events';\nimport type { ComponentAPI } from '../types/component-api';\nimport type Hls from '../hls';\n\ndeclare global {\n interface Window {\n WebKitDataCue: VTTCue | void;\n }\n}\n\nconst MIN_CUE_DURATION = 0.25;\n\nfunction getCueClass(): typeof VTTCue | typeof TextTrackCue | undefined {\n if (typeof self === 'undefined') return undefined;\n return self.VTTCue || self.TextTrackCue;\n}\n\nfunction createCueWithDataFields(\n Cue: typeof VTTCue | typeof TextTrackCue,\n startTime: number,\n endTime: number,\n data: Object,\n type?: string,\n): VTTCue | TextTrackCue | undefined {\n let cue = new Cue(startTime, endTime, '');\n try {\n (cue as any).value = data;\n if (type) {\n (cue as any).type = type;\n }\n } catch (e) {\n cue = new Cue(\n startTime,\n endTime,\n JSON.stringify(type ? { type, ...data } : data),\n );\n }\n return cue;\n}\n\n// VTTCue latest draft allows an infinite duration, fallback\n// to MAX_VALUE if necessary\nconst MAX_CUE_ENDTIME = (() => {\n const Cue = getCueClass();\n try {\n Cue && new Cue(0, Number.POSITIVE_INFINITY, '');\n } catch (e) {\n return Number.MAX_VALUE;\n }\n return Number.POSITIVE_INFINITY;\n})();\n\nfunction dateRangeDateToTimelineSeconds(date: Date, offset: number): number {\n return date.getTime() / 1000 - offset;\n}\n\nfunction hexToArrayBuffer(str): ArrayBuffer {\n return Uint8Array.from(\n str\n .replace(/^0x/, '')\n .replace(/([\\da-fA-F]{2}) ?/g, '0x$1 ')\n .replace(/ +$/, '')\n .split(' '),\n ).buffer;\n}\nclass ID3TrackController implements ComponentAPI {\n private hls: Hls;\n private id3Track: TextTrack | null = null;\n private media: HTMLMediaElement | null = null;\n private dateRangeCuesAppended: Record<\n string,\n {\n cues: Record<string, VTTCue | TextTrackCue>;\n dateRange: DateRange;\n durationKnown: boolean;\n }\n > = {};\n\n constructor(hls) {\n this.hls = hls;\n this._registerListeners();\n }\n\n destroy() {\n this._unregisterListeners();\n this.id3Track = null;\n this.media = null;\n this.dateRangeCuesAppended = {};\n // @ts-ignore\n this.hls = null;\n }\n\n private _registerListeners() {\n const { hls } = this;\n hls.on(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n hls.on(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n hls.on(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n hls.on(Events.FRAG_PARSING_METADATA, this.onFragParsingMetadata, this);\n hls.on(Events.BUFFER_FLUSHING, this.onBufferFlushing, this);\n hls.on(Events.LEVEL_UPDATED, this.onLevelUpdated, this);\n }\n\n private _unregisterListeners() {\n const { hls } = this;\n hls.off(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n hls.off(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n hls.off(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n hls.off(Events.FRAG_PARSING_METADATA, this.onFragParsingMetadata, this);\n hls.off(Events.BUFFER_FLUSHING, this.onBufferFlushing, this);\n hls.off(Events.LEVEL_UPDATED, this.onLevelUpdated, this);\n }\n\n // Add ID3 metatadata text track.\n protected onMediaAttached(\n event: Events.MEDIA_ATTACHED,\n data: MediaAttachedData,\n ): void {\n this.media = data.media;\n }\n\n protected onMediaDetaching(): void {\n if (!this.id3Track) {\n return;\n }\n clearCurrentCues(this.id3Track);\n this.id3Track = null;\n this.media = null;\n this.dateRangeCuesAppended = {};\n }\n\n private onManifestLoading() {\n this.dateRangeCuesAppended = {};\n }\n\n createTrack(media: HTMLMediaElement): TextTrack {\n const track = this.getID3Track(media.textTracks) as TextTrack;\n track.mode = 'hidden';\n return track;\n }\n\n getID3Track(textTracks: TextTrackList): TextTrack | void {\n if (!this.media) {\n return;\n }\n for (let i = 0; i < textTracks.length; i++) {\n const textTrack: TextTrack = textTracks[i];\n if (textTrack.kind === 'metadata' && textTrack.label === 'id3') {\n // send 'addtrack' when reusing the textTrack for metadata,\n // same as what we do for captions\n sendAddTrackEvent(textTrack, this.media);\n\n return textTrack;\n }\n }\n return this.media.addTextTrack('metadata', 'id3');\n }\n\n onFragParsingMetadata(\n event: Events.FRAG_PARSING_METADATA,\n data: FragParsingMetadataData,\n ) {\n if (!this.media) {\n return;\n }\n\n const {\n hls: {\n config: { enableEmsgMetadataCues, enableID3MetadataCues },\n },\n } = this;\n if (!enableEmsgMetadataCues && !enableID3MetadataCues) {\n return;\n }\n\n const { samples } = data;\n\n // create track dynamically\n if (!this.id3Track) {\n this.id3Track = this.createTrack(this.media);\n }\n\n const Cue = getCueClass();\n if (!Cue) {\n return;\n }\n\n for (let i = 0; i < samples.length; i++) {\n const type = samples[i].type;\n if (\n (type === MetadataSchema.emsg && !enableEmsgMetadataCues) ||\n !enableID3MetadataCues\n ) {\n continue;\n }\n\n const frames = ID3.getID3Frames(samples[i].data);\n if (frames) {\n const startTime = samples[i].pts;\n let endTime: number = startTime + samples[i].duration;\n\n if (endTime > MAX_CUE_ENDTIME) {\n endTime = MAX_CUE_ENDTIME;\n }\n\n const timeDiff = endTime - startTime;\n if (timeDiff <= 0) {\n endTime = startTime + MIN_CUE_DURATION;\n }\n\n for (let j = 0; j < frames.length; j++) {\n const frame = frames[j];\n // Safari doesn't put the timestamp frame in the TextTrack\n if (!ID3.isTimeStampFrame(frame)) {\n // add a bounds to any unbounded cues\n this.updateId3CueEnds(startTime, type);\n const cue = createCueWithDataFields(\n Cue,\n startTime,\n endTime,\n frame,\n type,\n );\n if (cue) {\n this.id3Track.addCue(cue);\n }\n }\n }\n }\n }\n }\n\n updateId3CueEnds(startTime: number, type: MetadataSchema) {\n const cues = this.id3Track?.cues;\n if (cues) {\n for (let i = cues.length; i--; ) {\n const cue = cues[i] as any;\n if (\n cue.type === type &&\n cue.startTime < startTime &&\n cue.endTime === MAX_CUE_ENDTIME\n ) {\n cue.endTime = startTime;\n }\n }\n }\n }\n\n onBufferFlushing(\n event: Events.BUFFER_FLUSHING,\n { startOffset, endOffset, type }: BufferFlushingData,\n ) {\n const { id3Track, hls } = this;\n if (!hls) {\n return;\n }\n\n const {\n config: { enableEmsgMetadataCues, enableID3MetadataCues },\n } = hls;\n if (id3Track && (enableEmsgMetadataCues || enableID3MetadataCues)) {\n let predicate;\n\n if (type === 'audio') {\n predicate = (cue) =>\n (cue as any).type === MetadataSchema.audioId3 &&\n enableID3MetadataCues;\n } else if (type === 'video') {\n predicate = (cue) =>\n (cue as any).type === MetadataSchema.emsg && enableEmsgMetadataCues;\n } else {\n predicate = (cue) =>\n ((cue as any).type === MetadataSchema.audioId3 &&\n enableID3MetadataCues) ||\n ((cue as any).type === MetadataSchema.emsg && enableEmsgMetadataCues);\n }\n removeCuesInRange(id3Track, startOffset, endOffset, predicate);\n }\n }\n\n onLevelUpdated(event: Events.LEVEL_UPDATED, { details }: LevelUpdatedData) {\n if (\n !this.media ||\n !details.hasProgramDateTime ||\n !this.hls.config.enableDateRangeMetadataCues\n ) {\n return;\n }\n const { dateRangeCuesAppended, id3Track } = this;\n const { dateRanges } = details;\n const ids = Object.keys(dateRanges);\n // Remove cues from track not found in details.dateRanges\n if (id3Track) {\n const idsToRemove = Object.keys(dateRangeCuesAppended).filter(\n (id) => !ids.includes(id),\n );\n for (let i = idsToRemove.length; i--; ) {\n const id = idsToRemove[i];\n Object.keys(dateRangeCuesAppended[id].cues).forEach((key) => {\n id3Track.removeCue(dateRangeCuesAppended[id].cues[key]);\n });\n delete dateRangeCuesAppended[id];\n }\n }\n // Exit if the playlist does not have Date Ranges or does not have Program Date Time\n const lastFragment = details.fragments[details.fragments.length - 1];\n if (ids.length === 0 || !Number.isFinite(lastFragment?.programDateTime)) {\n return;\n }\n\n if (!this.id3Track) {\n this.id3Track = this.createTrack(this.media);\n }\n\n const dateTimeOffset =\n (lastFragment.programDateTime as number) / 1000 - lastFragment.start;\n const Cue = getCueClass();\n\n for (let i = 0; i < ids.length; i++) {\n const id = ids[i];\n const dateRange = dateRanges[id];\n const startTime = dateRangeDateToTimelineSeconds(\n dateRange.startDate,\n dateTimeOffset,\n );\n\n // Process DateRanges to determine end-time (known DURATION, END-DATE, or END-ON-NEXT)\n const appendedDateRangeCues = dateRangeCuesAppended[id];\n const cues = appendedDateRangeCues?.cues || {};\n let durationKnown = appendedDateRangeCues?.durationKnown || false;\n let endTime = MAX_CUE_ENDTIME;\n const endDate = dateRange.endDate;\n if (endDate) {\n endTime = dateRangeDateToTimelineSeconds(endDate, dateTimeOffset);\n durationKnown = true;\n } else if (dateRange.endOnNext && !durationKnown) {\n const nextDateRangeWithSameClass = ids.reduce(\n (candidateDateRange: DateRange | null, id) => {\n if (id !== dateRange.id) {\n const otherDateRange = dateRanges[id];\n if (\n otherDateRange.class === dateRange.class &&\n otherDateRange.startDate > dateRange.startDate &&\n (!candidateDateRange ||\n dateRange.startDate < candidateDateRange.startDate)\n ) {\n return otherDateRange;\n }\n }\n return candidateDateRange;\n },\n null,\n );\n if (nextDateRangeWithSameClass) {\n endTime = dateRangeDateToTimelineSeconds(\n nextDateRangeWithSameClass.startDate,\n dateTimeOffset,\n );\n durationKnown = true;\n }\n }\n\n // Create TextTrack Cues for each MetadataGroup Item (select DateRange attribute)\n // This is to emulate Safari HLS playback handling of DateRange tags\n const attributes = Object.keys(dateRange.attr);\n for (let j = 0; j < attributes.length; j++) {\n const key = attributes[j];\n if (!isDateRangeCueAttribute(key)) {\n continue;\n }\n const cue = cues[key];\n if (cue) {\n if (durationKnown && !appendedDateRangeCues.durationKnown) {\n cue.endTime = endTime;\n }\n } else if (Cue) {\n let data = dateRange.attr[key];\n if (isSCTE35Attribute(key)) {\n data = hexToArrayBuffer(data);\n }\n const cue = createCueWithDataFields(\n Cue,\n startTime,\n endTime,\n { key, data },\n MetadataSchema.dateRange,\n );\n if (cue) {\n cue.id = id;\n this.id3Track.addCue(cue);\n cues[key] = cue;\n }\n }\n }\n\n // Keep track of processed DateRanges by ID for updating cues with new DateRange tag attributes\n dateRangeCuesAppended[id] = {\n cues,\n dateRange,\n durationKnown,\n };\n }\n }\n}\n\nexport default ID3TrackController;\n","import { LevelDetails } from '../loader/level-details';\nimport { ErrorDetails } from '../errors';\nimport { Events } from '../events';\nimport type {\n ErrorData,\n LevelUpdatedData,\n MediaAttachingData,\n} from '../types/events';\nimport { logger } from '../utils/logger';\nimport type { ComponentAPI } from '../types/component-api';\nimport type Hls from '../hls';\nimport type { HlsConfig } from '../config';\n\nexport default class LatencyController implements ComponentAPI {\n private hls: Hls;\n private readonly config: HlsConfig;\n private media: HTMLMediaElement | null = null;\n private levelDetails: LevelDetails | null = null;\n private currentTime: number = 0;\n private stallCount: number = 0;\n private _latency: number | null = null;\n private timeupdateHandler = () => this.timeupdate();\n\n constructor(hls: Hls) {\n this.hls = hls;\n this.config = hls.config;\n this.registerListeners();\n }\n\n get latency(): number {\n return this._latency || 0;\n }\n\n get maxLatency(): number {\n const { config, levelDetails } = this;\n if (config.liveMaxLatencyDuration !== undefined) {\n return config.liveMaxLatencyDuration;\n }\n return levelDetails\n ? config.liveMaxLatencyDurationCount * levelDetails.targetduration\n : 0;\n }\n\n get targetLatency(): number | null {\n const { levelDetails } = this;\n if (levelDetails === null) {\n return null;\n }\n const { holdBack, partHoldBack, targetduration } = levelDetails;\n const { liveSyncDuration, liveSyncDurationCount, lowLatencyMode } =\n this.config;\n const userConfig = this.hls.userConfig;\n let targetLatency = lowLatencyMode ? partHoldBack || holdBack : holdBack;\n if (\n userConfig.liveSyncDuration ||\n userConfig.liveSyncDurationCount ||\n targetLatency === 0\n ) {\n targetLatency =\n liveSyncDuration !== undefined\n ? liveSyncDuration\n : liveSyncDurationCount * targetduration;\n }\n const maxLiveSyncOnStallIncrease = targetduration;\n const liveSyncOnStallIncrease = 1.0;\n return (\n targetLatency +\n Math.min(\n this.stallCount * liveSyncOnStallIncrease,\n maxLiveSyncOnStallIncrease,\n )\n );\n }\n\n get liveSyncPosition(): number | null {\n const liveEdge = this.estimateLiveEdge();\n const targetLatency = this.targetLatency;\n const levelDetails = this.levelDetails;\n if (liveEdge === null || targetLatency === null || levelDetails === null) {\n return null;\n }\n const edge = levelDetails.edge;\n const syncPosition = liveEdge - targetLatency - this.edgeStalled;\n const min = edge - levelDetails.totalduration;\n const max =\n edge -\n ((this.config.lowLatencyMode && levelDetails.partTarget) ||\n levelDetails.targetduration);\n return Math.min(Math.max(min, syncPosition), max);\n }\n\n get drift(): number {\n const { levelDetails } = this;\n if (levelDetails === null) {\n return 1;\n }\n return levelDetails.drift;\n }\n\n get edgeStalled(): number {\n const { levelDetails } = this;\n if (levelDetails === null) {\n return 0;\n }\n const maxLevelUpdateAge =\n ((this.config.lowLatencyMode && levelDetails.partTarget) ||\n levelDetails.targetduration) * 3;\n return Math.max(levelDetails.age - maxLevelUpdateAge, 0);\n }\n\n private get forwardBufferLength(): number {\n const { media, levelDetails } = this;\n if (!media || !levelDetails) {\n return 0;\n }\n const bufferedRanges = media.buffered.length;\n return (\n (bufferedRanges\n ? media.buffered.end(bufferedRanges - 1)\n : levelDetails.edge) - this.currentTime\n );\n }\n\n public destroy(): void {\n this.unregisterListeners();\n this.onMediaDetaching();\n this.levelDetails = null;\n // @ts-ignore\n this.hls = this.timeupdateHandler = null;\n }\n\n private registerListeners() {\n this.hls.on(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n this.hls.on(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n this.hls.on(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n this.hls.on(Events.LEVEL_UPDATED, this.onLevelUpdated, this);\n this.hls.on(Events.ERROR, this.onError, this);\n }\n\n private unregisterListeners() {\n this.hls.off(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n this.hls.off(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n this.hls.off(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n this.hls.off(Events.LEVEL_UPDATED, this.onLevelUpdated, this);\n this.hls.off(Events.ERROR, this.onError, this);\n }\n\n private onMediaAttached(\n event: Events.MEDIA_ATTACHED,\n data: MediaAttachingData,\n ) {\n this.media = data.media;\n this.media.addEventListener('timeupdate', this.timeupdateHandler);\n }\n\n private onMediaDetaching() {\n if (this.media) {\n this.media.removeEventListener('timeupdate', this.timeupdateHandler);\n this.media = null;\n }\n }\n\n private onManifestLoading() {\n this.levelDetails = null;\n this._latency = null;\n this.stallCount = 0;\n }\n\n private onLevelUpdated(\n event: Events.LEVEL_UPDATED,\n { details }: LevelUpdatedData,\n ) {\n this.levelDetails = details;\n if (details.advanced) {\n this.timeupdate();\n }\n if (!details.live && this.media) {\n this.media.removeEventListener('timeupdate', this.timeupdateHandler);\n }\n }\n\n private onError(event: Events.ERROR, data: ErrorData) {\n if (data.details !== ErrorDetails.BUFFER_STALLED_ERROR) {\n return;\n }\n this.stallCount++;\n if (this.levelDetails?.live) {\n logger.warn(\n '[playback-rate-controller]: Stall detected, adjusting target latency',\n );\n }\n }\n\n private timeupdate() {\n const { media, levelDetails } = this;\n if (!media || !levelDetails) {\n return;\n }\n this.currentTime = media.currentTime;\n\n const latency = this.computeLatency();\n if (latency === null) {\n return;\n }\n this._latency = latency;\n\n // Adapt playbackRate to meet target latency in low-latency mode\n const { lowLatencyMode, maxLiveSyncPlaybackRate } = this.config;\n if (\n !lowLatencyMode ||\n maxLiveSyncPlaybackRate === 1 ||\n !levelDetails.live\n ) {\n return;\n }\n const targetLatency = this.targetLatency;\n if (targetLatency === null) {\n return;\n }\n const distanceFromTarget = latency - targetLatency;\n // Only adjust playbackRate when within one target duration of targetLatency\n // and more than one second from under-buffering.\n // Playback further than one target duration from target can be considered DVR playback.\n const liveMinLatencyDuration = Math.min(\n this.maxLatency,\n targetLatency + levelDetails.targetduration,\n );\n const inLiveRange = distanceFromTarget < liveMinLatencyDuration;\n\n if (\n inLiveRange &&\n distanceFromTarget > 0.05 &&\n this.forwardBufferLength > 1\n ) {\n const max = Math.min(2, Math.max(1.0, maxLiveSyncPlaybackRate));\n const rate =\n Math.round(\n (2 / (1 + Math.exp(-0.75 * distanceFromTarget - this.edgeStalled))) *\n 20,\n ) / 20;\n media.playbackRate = Math.min(max, Math.max(1, rate));\n } else if (media.playbackRate !== 1 && media.playbackRate !== 0) {\n media.playbackRate = 1;\n }\n }\n\n private estimateLiveEdge(): number | null {\n const { levelDetails } = this;\n if (levelDetails === null) {\n return null;\n }\n return levelDetails.edge + levelDetails.age;\n }\n\n private computeLatency(): number | null {\n const liveEdge = this.estimateLiveEdge();\n if (liveEdge === null) {\n return null;\n }\n return liveEdge - this.currentTime;\n }\n}\n","import type { MediaPlaylist } from './media-playlist';\nimport type { LevelDetails } from '../loader/level-details';\nimport type { AttrList } from '../utils/attr-list';\nimport type { MediaDecodingInfo } from '../utils/mediacapabilities-helper';\n\nexport interface LevelParsed {\n attrs: LevelAttributes;\n audioCodec?: string;\n bitrate: number;\n details?: LevelDetails;\n height?: number;\n id?: number;\n name: string;\n textCodec?: string;\n unknownCodecs?: string[];\n url: string;\n videoCodec?: string;\n width?: number;\n}\n\nexport interface LevelAttributes extends AttrList {\n 'ALLOWED-CPC'?: string;\n AUDIO?: string;\n 'AVERAGE-BANDWIDTH'?: string;\n BANDWIDTH?: string;\n 'CLOSED-CAPTIONS'?: string;\n CODECS?: string;\n 'FRAME-RATE'?: string;\n 'HDCP-LEVEL'?: 'TYPE-0' | 'TYPE-1' | 'NONE';\n 'PATHWAY-ID'?: string;\n RESOLUTION?: string;\n SCORE?: string;\n 'STABLE-VARIANT-ID'?: string;\n SUBTITLES?: string;\n 'SUPPLEMENTAL-CODECS'?: string;\n VIDEO?: string;\n 'VIDEO-RANGE'?: VideoRange;\n}\n\nexport const HdcpLevels = ['NONE', 'TYPE-0', 'TYPE-1', null] as const;\nexport type HdcpLevel = (typeof HdcpLevels)[number];\n\nexport function isHdcpLevel(value: any): value is HdcpLevel {\n return HdcpLevels.indexOf(value) > -1;\n}\n\nexport const VideoRangeValues = ['SDR', 'PQ', 'HLG'] as const;\nexport type VideoRange = (typeof VideoRangeValues)[number];\n\nexport function isVideoRange(value: any): value is VideoRange {\n return !!value && VideoRangeValues.indexOf(value) > -1;\n}\n\nexport type VariableMap = Record<string, string>;\n\nexport const enum HlsSkip {\n No = '',\n Yes = 'YES',\n v2 = 'v2',\n}\n\nexport function getSkipValue(details: LevelDetails): HlsSkip {\n const { canSkipUntil, canSkipDateRanges, age } = details;\n // A Client SHOULD NOT request a Playlist Delta Update unless it already\n // has a version of the Playlist that is no older than one-half of the Skip Boundary.\n // @see: https://datatracker.ietf.org/doc/html/draft-pantos-hls-rfc8216bis#section-6.3.7\n const playlistRecentEnough = age < canSkipUntil / 2;\n if (canSkipUntil && playlistRecentEnough) {\n if (canSkipDateRanges) {\n return HlsSkip.v2;\n }\n return HlsSkip.Yes;\n }\n return HlsSkip.No;\n}\n\nexport class HlsUrlParameters {\n msn?: number;\n part?: number;\n skip?: HlsSkip;\n\n constructor(msn?: number, part?: number, skip?: HlsSkip) {\n this.msn = msn;\n this.part = part;\n this.skip = skip;\n }\n\n addDirectives(uri: string): string | never {\n const url: URL = new self.URL(uri);\n if (this.msn !== undefined) {\n url.searchParams.set('_HLS_msn', this.msn.toString());\n }\n if (this.part !== undefined) {\n url.searchParams.set('_HLS_part', this.part.toString());\n }\n if (this.skip) {\n url.searchParams.set('_HLS_skip', this.skip);\n }\n return url.href;\n }\n}\n\nexport class Level {\n public readonly _attrs: LevelAttributes[];\n public readonly audioCodec: string | undefined;\n public readonly bitrate: number;\n public readonly codecSet: string;\n public readonly url: string[];\n public readonly frameRate: number;\n public readonly height: number;\n public readonly id: number;\n public readonly name: string;\n public readonly videoCodec: string | undefined;\n public readonly width: number;\n public details?: LevelDetails;\n public fragmentError: number = 0;\n public loadError: number = 0;\n public loaded?: { bytes: number; duration: number };\n public realBitrate: number = 0;\n public supportedPromise?: Promise<MediaDecodingInfo>;\n public supportedResult?: MediaDecodingInfo;\n private _avgBitrate: number = 0;\n private _audioGroups?: (string | undefined)[];\n private _subtitleGroups?: (string | undefined)[];\n // Deprecated (retained for backwards compatibility)\n private readonly _urlId: number = 0;\n\n constructor(data: LevelParsed | MediaPlaylist) {\n this.url = [data.url];\n this._attrs = [data.attrs];\n this.bitrate = data.bitrate;\n if (data.details) {\n this.details = data.details;\n }\n this.id = data.id || 0;\n this.name = data.name;\n this.width = data.width || 0;\n this.height = data.height || 0;\n this.frameRate = data.attrs.optionalFloat('FRAME-RATE', 0);\n this._avgBitrate = data.attrs.decimalInteger('AVERAGE-BANDWIDTH');\n this.audioCodec = data.audioCodec;\n this.videoCodec = data.videoCodec;\n this.codecSet = [data.videoCodec, data.audioCodec]\n .filter((c) => !!c)\n .map((s: string) => s.substring(0, 4))\n .join(',');\n this.addGroupId('audio', data.attrs.AUDIO);\n this.addGroupId('text', data.attrs.SUBTITLES);\n }\n\n get maxBitrate(): number {\n return Math.max(this.realBitrate, this.bitrate);\n }\n\n get averageBitrate(): number {\n return this._avgBitrate || this.realBitrate || this.bitrate;\n }\n\n get attrs(): LevelAttributes {\n return this._attrs[0];\n }\n\n get codecs(): string {\n return this.attrs.CODECS || '';\n }\n\n get pathwayId(): string {\n return this.attrs['PATHWAY-ID'] || '.';\n }\n\n get videoRange(): VideoRange {\n return this.attrs['VIDEO-RANGE'] || 'SDR';\n }\n\n get score(): number {\n return this.attrs.optionalFloat('SCORE', 0);\n }\n\n get uri(): string {\n return this.url[0] || '';\n }\n\n hasAudioGroup(groupId: string | undefined): boolean {\n return hasGroup(this._audioGroups, groupId);\n }\n\n hasSubtitleGroup(groupId: string | undefined): boolean {\n return hasGroup(this._subtitleGroups, groupId);\n }\n\n get audioGroups(): (string | undefined)[] | undefined {\n return this._audioGroups;\n }\n\n get subtitleGroups(): (string | undefined)[] | undefined {\n return this._subtitleGroups;\n }\n\n addGroupId(type: string, groupId: string | undefined) {\n if (!groupId) {\n return;\n }\n if (type === 'audio') {\n let audioGroups = this._audioGroups;\n if (!audioGroups) {\n audioGroups = this._audioGroups = [];\n }\n if (audioGroups.indexOf(groupId) === -1) {\n audioGroups.push(groupId);\n }\n } else if (type === 'text') {\n let subtitleGroups = this._subtitleGroups;\n if (!subtitleGroups) {\n subtitleGroups = this._subtitleGroups = [];\n }\n if (subtitleGroups.indexOf(groupId) === -1) {\n subtitleGroups.push(groupId);\n }\n }\n }\n\n // Deprecated methods (retained for backwards compatibility)\n get urlId(): number {\n return 0;\n }\n\n set urlId(value: number) {}\n\n get audioGroupIds(): (string | undefined)[] | undefined {\n return this.audioGroups ? [this.audioGroupId] : undefined;\n }\n\n get textGroupIds(): (string | undefined)[] | undefined {\n return this.subtitleGroups ? [this.textGroupId] : undefined;\n }\n\n get audioGroupId(): string | undefined {\n return this.audioGroups?.[0];\n }\n\n get textGroupId(): string | undefined {\n return this.subtitleGroups?.[0];\n }\n\n addFallback() {}\n}\n\nfunction hasGroup(\n groups: (string | undefined)[] | undefined,\n groupId: string | undefined,\n): boolean {\n if (!groupId || !groups) {\n return false;\n }\n return groups.indexOf(groupId) !== -1;\n}\n","/**\n * Provides methods dealing with playlist sliding and drift\n */\n\nimport { logger } from './logger';\nimport { Fragment, Part } from '../loader/fragment';\nimport { LevelDetails } from '../loader/level-details';\nimport type { Level } from '../types/level';\nimport { DateRange } from '../loader/date-range';\n\ntype FragmentIntersection = (\n oldFrag: Fragment,\n newFrag: Fragment,\n newFragIndex: number,\n newFragments: Fragment[],\n) => void;\ntype PartIntersection = (oldPart: Part, newPart: Part) => void;\n\nexport function updatePTS(\n fragments: Fragment[],\n fromIdx: number,\n toIdx: number,\n): void {\n const fragFrom = fragments[fromIdx];\n const fragTo = fragments[toIdx];\n updateFromToPTS(fragFrom, fragTo);\n}\n\nfunction updateFromToPTS(fragFrom: Fragment, fragTo: Fragment) {\n const fragToPTS = fragTo.startPTS as number;\n // if we know startPTS[toIdx]\n if (Number.isFinite(fragToPTS)) {\n // update fragment duration.\n // it helps to fix drifts between playlist reported duration and fragment real duration\n let duration: number = 0;\n let frag: Fragment;\n if (fragTo.sn > fragFrom.sn) {\n duration = fragToPTS - fragFrom.start;\n frag = fragFrom;\n } else {\n duration = fragFrom.start - fragToPTS;\n frag = fragTo;\n }\n if (frag.duration !== duration) {\n frag.duration = duration;\n }\n // we dont know startPTS[toIdx]\n } else if (fragTo.sn > fragFrom.sn) {\n const contiguous = fragFrom.cc === fragTo.cc;\n // TODO: With part-loading end/durations we need to confirm the whole fragment is loaded before using (or setting) minEndPTS\n if (contiguous && fragFrom.minEndPTS) {\n fragTo.start = fragFrom.start + (fragFrom.minEndPTS - fragFrom.start);\n } else {\n fragTo.start = fragFrom.start + fragFrom.duration;\n }\n } else {\n fragTo.start = Math.max(fragFrom.start - fragTo.duration, 0);\n }\n}\n\nexport function updateFragPTSDTS(\n details: LevelDetails | undefined,\n frag: Fragment,\n startPTS: number,\n endPTS: number,\n startDTS: number,\n endDTS: number,\n): number {\n const parsedMediaDuration = endPTS - startPTS;\n if (parsedMediaDuration <= 0) {\n logger.warn('Fragment should have a positive duration', frag);\n endPTS = startPTS + frag.duration;\n endDTS = startDTS + frag.duration;\n }\n let maxStartPTS = startPTS;\n let minEndPTS = endPTS;\n const fragStartPts = frag.startPTS as number;\n const fragEndPts = frag.endPTS as number;\n if (Number.isFinite(fragStartPts)) {\n // delta PTS between audio and video\n const deltaPTS = Math.abs(fragStartPts - startPTS);\n if (!Number.isFinite(frag.deltaPTS as number)) {\n frag.deltaPTS = deltaPTS;\n } else {\n frag.deltaPTS = Math.max(deltaPTS, frag.deltaPTS as number);\n }\n\n maxStartPTS = Math.max(startPTS, fragStartPts);\n startPTS = Math.min(startPTS, fragStartPts);\n startDTS = Math.min(startDTS, frag.startDTS);\n\n minEndPTS = Math.min(endPTS, fragEndPts);\n endPTS = Math.max(endPTS, fragEndPts);\n endDTS = Math.max(endDTS, frag.endDTS);\n }\n\n const drift = startPTS - frag.start;\n if (frag.start !== 0) {\n frag.start = startPTS;\n }\n frag.duration = endPTS - frag.start;\n frag.startPTS = startPTS;\n frag.maxStartPTS = maxStartPTS;\n frag.startDTS = startDTS;\n frag.endPTS = endPTS;\n frag.minEndPTS = minEndPTS;\n frag.endDTS = endDTS;\n\n const sn = frag.sn as number; // 'initSegment'\n // exit if sn out of range\n if (!details || sn < details.startSN || sn > details.endSN) {\n return 0;\n }\n let i: number;\n const fragIdx = sn - details.startSN;\n const fragments = details.fragments;\n // update frag reference in fragments array\n // rationale is that fragments array might not contain this frag object.\n // this will happen if playlist has been refreshed between frag loading and call to updateFragPTSDTS()\n // if we don't update frag, we won't be able to propagate PTS info on the playlist\n // resulting in invalid sliding computation\n fragments[fragIdx] = frag;\n // adjust fragment PTS/duration from seqnum-1 to frag 0\n for (i = fragIdx; i > 0; i--) {\n updateFromToPTS(fragments[i], fragments[i - 1]);\n }\n\n // adjust fragment PTS/duration from seqnum to last frag\n for (i = fragIdx; i < fragments.length - 1; i++) {\n updateFromToPTS(fragments[i], fragments[i + 1]);\n }\n if (details.fragmentHint) {\n updateFromToPTS(fragments[fragments.length - 1], details.fragmentHint);\n }\n\n details.PTSKnown = details.alignedSliding = true;\n return drift;\n}\n\nexport function mergeDetails(\n oldDetails: LevelDetails,\n newDetails: LevelDetails,\n): void {\n // Track the last initSegment processed. Initialize it to the last one on the timeline.\n let currentInitSegment: Fragment | null = null;\n const oldFragments = oldDetails.fragments;\n for (let i = oldFragments.length - 1; i >= 0; i--) {\n const oldInit = oldFragments[i].initSegment;\n if (oldInit) {\n currentInitSegment = oldInit;\n break;\n }\n }\n\n if (oldDetails.fragmentHint) {\n // prevent PTS and duration from being adjusted on the next hint\n delete oldDetails.fragmentHint.endPTS;\n }\n // check if old/new playlists have fragments in common\n // loop through overlapping SN and update startPTS, cc, and duration if any found\n let PTSFrag: Fragment | undefined;\n mapFragmentIntersection(\n oldDetails,\n newDetails,\n (oldFrag, newFrag, newFragIndex, newFragments) => {\n if (newDetails.skippedSegments) {\n if (newFrag.cc !== oldFrag.cc) {\n const ccOffset = oldFrag.cc - newFrag.cc;\n for (let i = newFragIndex; i < newFragments.length; i++) {\n newFragments[i].cc += ccOffset;\n }\n }\n }\n if (\n Number.isFinite(oldFrag.startPTS) &&\n Number.isFinite(oldFrag.endPTS)\n ) {\n newFrag.start = newFrag.startPTS = oldFrag.startPTS as number;\n newFrag.startDTS = oldFrag.startDTS;\n newFrag.maxStartPTS = oldFrag.maxStartPTS;\n\n newFrag.endPTS = oldFrag.endPTS;\n newFrag.endDTS = oldFrag.endDTS;\n newFrag.minEndPTS = oldFrag.minEndPTS;\n newFrag.duration =\n (oldFrag.endPTS as number) - (oldFrag.startPTS as number);\n\n if (newFrag.duration) {\n PTSFrag = newFrag;\n }\n\n // PTS is known when any segment has startPTS and endPTS\n newDetails.PTSKnown = newDetails.alignedSliding = true;\n }\n newFrag.elementaryStreams = oldFrag.elementaryStreams;\n newFrag.loader = oldFrag.loader;\n newFrag.stats = oldFrag.stats;\n if (oldFrag.initSegment) {\n newFrag.initSegment = oldFrag.initSegment;\n currentInitSegment = oldFrag.initSegment;\n }\n },\n );\n\n const newFragments = newDetails.fragments;\n if (currentInitSegment) {\n const fragmentsToCheck = newDetails.fragmentHint\n ? newFragments.concat(newDetails.fragmentHint)\n : newFragments;\n fragmentsToCheck.forEach((frag) => {\n if (\n frag &&\n (!frag.initSegment ||\n frag.initSegment.relurl === currentInitSegment?.relurl)\n ) {\n frag.initSegment = currentInitSegment;\n }\n });\n }\n\n if (newDetails.skippedSegments) {\n newDetails.deltaUpdateFailed = newFragments.some((frag) => !frag);\n if (newDetails.deltaUpdateFailed) {\n logger.warn(\n '[level-helper] Previous playlist missing segments skipped in delta playlist',\n );\n for (let i = newDetails.skippedSegments; i--; ) {\n newFragments.shift();\n }\n newDetails.startSN = newFragments[0].sn as number;\n } else {\n if (newDetails.canSkipDateRanges) {\n newDetails.dateRanges = mergeDateRanges(\n oldDetails.dateRanges,\n newDetails.dateRanges,\n newDetails.recentlyRemovedDateranges,\n );\n }\n }\n newDetails.startCC = newDetails.fragments[0].cc;\n newDetails.endCC = newFragments[newFragments.length - 1].cc;\n }\n\n // Merge parts\n mapPartIntersection(\n oldDetails.partList,\n newDetails.partList,\n (oldPart: Part, newPart: Part) => {\n newPart.elementaryStreams = oldPart.elementaryStreams;\n newPart.stats = oldPart.stats;\n },\n );\n\n // if at least one fragment contains PTS info, recompute PTS information for all fragments\n if (PTSFrag) {\n updateFragPTSDTS(\n newDetails,\n PTSFrag,\n PTSFrag.startPTS as number,\n PTSFrag.endPTS as number,\n PTSFrag.startDTS as number,\n PTSFrag.endDTS as number,\n );\n } else {\n // ensure that delta is within oldFragments range\n // also adjust sliding in case delta is 0 (we could have old=[50-60] and new=old=[50-61])\n // in that case we also need to adjust start offset of all fragments\n adjustSliding(oldDetails, newDetails);\n }\n\n if (newFragments.length) {\n newDetails.totalduration = newDetails.edge - newFragments[0].start;\n }\n\n newDetails.driftStartTime = oldDetails.driftStartTime;\n newDetails.driftStart = oldDetails.driftStart;\n const advancedDateTime = newDetails.advancedDateTime;\n if (newDetails.advanced && advancedDateTime) {\n const edge = newDetails.edge;\n if (!newDetails.driftStart) {\n newDetails.driftStartTime = advancedDateTime;\n newDetails.driftStart = edge;\n }\n newDetails.driftEndTime = advancedDateTime;\n newDetails.driftEnd = edge;\n } else {\n newDetails.driftEndTime = oldDetails.driftEndTime;\n newDetails.driftEnd = oldDetails.driftEnd;\n newDetails.advancedDateTime = oldDetails.advancedDateTime;\n }\n}\n\nfunction mergeDateRanges(\n oldDateRanges: Record<string, DateRange>,\n deltaDateRanges: Record<string, DateRange>,\n recentlyRemovedDateranges: string[] | undefined,\n): Record<string, DateRange> {\n const dateRanges = Object.assign({}, oldDateRanges);\n if (recentlyRemovedDateranges) {\n recentlyRemovedDateranges.forEach((id) => {\n delete dateRanges[id];\n });\n }\n Object.keys(deltaDateRanges).forEach((id) => {\n const dateRange = new DateRange(deltaDateRanges[id].attr, dateRanges[id]);\n if (dateRange.isValid) {\n dateRanges[id] = dateRange;\n } else {\n logger.warn(\n `Ignoring invalid Playlist Delta Update DATERANGE tag: \"${JSON.stringify(\n deltaDateRanges[id].attr,\n )}\"`,\n );\n }\n });\n return dateRanges;\n}\n\nexport function mapPartIntersection(\n oldParts: Part[] | null,\n newParts: Part[] | null,\n intersectionFn: PartIntersection,\n) {\n if (oldParts && newParts) {\n let delta = 0;\n for (let i = 0, len = oldParts.length; i <= len; i++) {\n const oldPart = oldParts[i];\n const newPart = newParts[i + delta];\n if (\n oldPart &&\n newPart &&\n oldPart.index === newPart.index &&\n oldPart.fragment.sn === newPart.fragment.sn\n ) {\n intersectionFn(oldPart, newPart);\n } else {\n delta--;\n }\n }\n }\n}\n\nexport function mapFragmentIntersection(\n oldDetails: LevelDetails,\n newDetails: LevelDetails,\n intersectionFn: FragmentIntersection,\n): void {\n const skippedSegments = newDetails.skippedSegments;\n const start =\n Math.max(oldDetails.startSN, newDetails.startSN) - newDetails.startSN;\n const end =\n (oldDetails.fragmentHint ? 1 : 0) +\n (skippedSegments\n ? newDetails.endSN\n : Math.min(oldDetails.endSN, newDetails.endSN)) -\n newDetails.startSN;\n const delta = newDetails.startSN - oldDetails.startSN;\n const newFrags = newDetails.fragmentHint\n ? newDetails.fragments.concat(newDetails.fragmentHint)\n : newDetails.fragments;\n const oldFrags = oldDetails.fragmentHint\n ? oldDetails.fragments.concat(oldDetails.fragmentHint)\n : oldDetails.fragments;\n\n for (let i = start; i <= end; i++) {\n const oldFrag = oldFrags[delta + i];\n let newFrag = newFrags[i];\n if (skippedSegments && !newFrag && i < skippedSegments) {\n // Fill in skipped segments in delta playlist\n newFrag = newDetails.fragments[i] = oldFrag;\n }\n if (oldFrag && newFrag) {\n intersectionFn(oldFrag, newFrag, i, newFrags);\n }\n }\n}\n\nexport function adjustSliding(\n oldDetails: LevelDetails,\n newDetails: LevelDetails,\n): void {\n const delta =\n newDetails.startSN + newDetails.skippedSegments - oldDetails.startSN;\n const oldFragments = oldDetails.fragments;\n if (delta < 0 || delta >= oldFragments.length) {\n return;\n }\n addSliding(newDetails, oldFragments[delta].start);\n}\n\nexport function addSliding(details: LevelDetails, start: number) {\n if (start) {\n const fragments = details.fragments;\n for (let i = details.skippedSegments; i < fragments.length; i++) {\n fragments[i].start += start;\n }\n if (details.fragmentHint) {\n details.fragmentHint.start += start;\n }\n }\n}\n\nexport function computeReloadInterval(\n newDetails: LevelDetails,\n distanceToLiveEdgeMs: number = Infinity,\n): number {\n let reloadInterval = 1000 * newDetails.targetduration;\n\n if (newDetails.updated) {\n // Use last segment duration when shorter than target duration and near live edge\n const fragments = newDetails.fragments;\n const liveEdgeMaxTargetDurations = 4;\n if (\n fragments.length &&\n reloadInterval * liveEdgeMaxTargetDurations > distanceToLiveEdgeMs\n ) {\n const lastSegmentDuration =\n fragments[fragments.length - 1].duration * 1000;\n if (lastSegmentDuration < reloadInterval) {\n reloadInterval = lastSegmentDuration;\n }\n }\n } else {\n // estimate = 'miss half average';\n // follow HLS Spec, If the client reloads a Playlist file and finds that it has not\n // changed then it MUST wait for a period of one-half the target\n // duration before retrying.\n reloadInterval /= 2;\n }\n\n return Math.round(reloadInterval);\n}\n\nexport function getFragmentWithSN(\n level: Level,\n sn: number,\n fragCurrent: Fragment | null,\n): Fragment | null {\n if (!level?.details) {\n return null;\n }\n const levelDetails = level.details;\n let fragment: Fragment | undefined =\n levelDetails.fragments[sn - levelDetails.startSN];\n if (fragment) {\n return fragment;\n }\n fragment = levelDetails.fragmentHint;\n if (fragment && fragment.sn === sn) {\n return fragment;\n }\n if (sn < levelDetails.startSN && fragCurrent && fragCurrent.sn === sn) {\n return fragCurrent;\n }\n return null;\n}\n\nexport function getPartWith(\n level: Level,\n sn: number,\n partIndex: number,\n): Part | null {\n if (!level?.details) {\n return null;\n }\n return findPart(level.details?.partList, sn, partIndex);\n}\n\nexport function findPart(\n partList: Part[] | null | undefined,\n sn: number,\n partIndex: number,\n): Part | null {\n if (partList) {\n for (let i = partList.length; i--; ) {\n const part = partList[i];\n if (part.index === partIndex && part.fragment.sn === sn) {\n return part;\n }\n }\n }\n return null;\n}\n\nexport function reassignFragmentLevelIndexes(levels: Level[]) {\n levels.forEach((level, index) => {\n const { details } = level;\n if (details?.fragments) {\n details.fragments.forEach((fragment) => {\n fragment.level = index;\n });\n }\n });\n}\n","import { ErrorDetails } from '../errors';\nimport type { LoadPolicy, LoaderConfig, RetryConfig } from '../config';\nimport type { ErrorData } from '../types/events';\nimport type { LoaderResponse } from '../types/loader';\n\nexport function isTimeoutError(error: ErrorData): boolean {\n switch (error.details) {\n case ErrorDetails.FRAG_LOAD_TIMEOUT:\n case ErrorDetails.KEY_LOAD_TIMEOUT:\n case ErrorDetails.LEVEL_LOAD_TIMEOUT:\n case ErrorDetails.MANIFEST_LOAD_TIMEOUT:\n return true;\n }\n return false;\n}\n\nexport function getRetryConfig(\n loadPolicy: LoadPolicy,\n error: ErrorData,\n): RetryConfig | null {\n const isTimeout = isTimeoutError(error);\n return loadPolicy.default[`${isTimeout ? 'timeout' : 'error'}Retry`];\n}\n\nexport function getRetryDelay(\n retryConfig: RetryConfig,\n retryCount: number,\n): number {\n // exponential backoff capped to max retry delay\n const backoffFactor =\n retryConfig.backoff === 'linear' ? 1 : Math.pow(2, retryCount);\n return Math.min(\n backoffFactor * retryConfig.retryDelayMs,\n retryConfig.maxRetryDelayMs,\n );\n}\n\nexport function getLoaderConfigWithoutReties(\n loderConfig: LoaderConfig,\n): LoaderConfig {\n return {\n ...loderConfig,\n ...{\n errorRetry: null,\n timeoutRetry: null,\n },\n };\n}\n\nexport function shouldRetry(\n retryConfig: RetryConfig | null | undefined,\n retryCount: number,\n isTimeout: boolean,\n loaderResponse?: LoaderResponse | undefined,\n): retryConfig is RetryConfig & boolean {\n if (!retryConfig) {\n return false;\n }\n const httpStatus = loaderResponse?.code;\n const retry =\n retryCount < retryConfig.maxNumRetry &&\n (retryForHttpStatus(httpStatus) || !!isTimeout);\n return retryConfig.shouldRetry\n ? retryConfig.shouldRetry(\n retryConfig,\n retryCount,\n isTimeout,\n loaderResponse,\n retry,\n )\n : retry;\n}\n\nexport function retryForHttpStatus(httpStatus: number | undefined) {\n // Do not retry on status 4xx, status 0 (CORS error), or undefined (decrypt/gap/parse error)\n return (\n (httpStatus === 0 && navigator.onLine === false) ||\n (!!httpStatus && (httpStatus < 400 || httpStatus > 499))\n );\n}\n","type BinarySearchComparison<T> = (candidate: T) => -1 | 0 | 1;\n\nconst BinarySearch = {\n /**\n * Searches for an item in an array which matches a certain condition.\n * This requires the condition to only match one item in the array,\n * and for the array to be ordered.\n *\n * @param list The array to search.\n * @param comparisonFn\n * Called and provided a candidate item as the first argument.\n * Should return:\n * > -1 if the item should be located at a lower index than the provided item.\n * > 1 if the item should be located at a higher index than the provided item.\n * > 0 if the item is the item you're looking for.\n *\n * @returns the object if found, otherwise returns null\n */\n search: function <T>(\n list: T[],\n comparisonFn: BinarySearchComparison<T>,\n ): T | null {\n let minIndex: number = 0;\n let maxIndex: number = list.length - 1;\n let currentIndex: number | null = null;\n let currentElement: T | null = null;\n\n while (minIndex <= maxIndex) {\n currentIndex = ((minIndex + maxIndex) / 2) | 0;\n currentElement = list[currentIndex];\n\n const comparisonResult = comparisonFn(currentElement);\n if (comparisonResult > 0) {\n minIndex = currentIndex + 1;\n } else if (comparisonResult < 0) {\n maxIndex = currentIndex - 1;\n } else {\n return currentElement;\n }\n }\n\n return null;\n },\n};\n\nexport default BinarySearch;\n","import BinarySearch from '../utils/binary-search';\nimport { Fragment } from '../loader/fragment';\n\n/**\n * Returns first fragment whose endPdt value exceeds the given PDT, or null.\n * @param fragments - The array of candidate fragments\n * @param PDTValue - The PDT value which must be exceeded\n * @param maxFragLookUpTolerance - The amount of time that a fragment's start/end can be within in order to be considered contiguous\n */\nexport function findFragmentByPDT(\n fragments: Array<Fragment>,\n PDTValue: number | null,\n maxFragLookUpTolerance: number,\n): Fragment | null {\n if (\n PDTValue === null ||\n !Array.isArray(fragments) ||\n !fragments.length ||\n !Number.isFinite(PDTValue)\n ) {\n return null;\n }\n\n // if less than start\n const startPDT = fragments[0].programDateTime;\n if (PDTValue < (startPDT || 0)) {\n return null;\n }\n\n const endPDT = fragments[fragments.length - 1].endProgramDateTime;\n if (PDTValue >= (endPDT || 0)) {\n return null;\n }\n\n maxFragLookUpTolerance = maxFragLookUpTolerance || 0;\n for (let seg = 0; seg < fragments.length; ++seg) {\n const frag = fragments[seg];\n if (pdtWithinToleranceTest(PDTValue, maxFragLookUpTolerance, frag)) {\n return frag;\n }\n }\n\n return null;\n}\n\n/**\n * Finds a fragment based on the SN of the previous fragment; or based on the needs of the current buffer.\n * This method compensates for small buffer gaps by applying a tolerance to the start of any candidate fragment, thus\n * breaking any traps which would cause the same fragment to be continuously selected within a small range.\n * @param fragPrevious - The last frag successfully appended\n * @param fragments - The array of candidate fragments\n * @param bufferEnd - The end of the contiguous buffered range the playhead is currently within\n * @param maxFragLookUpTolerance - The amount of time that a fragment's start/end can be within in order to be considered contiguous\n * @returns a matching fragment or null\n */\nexport function findFragmentByPTS(\n fragPrevious: Fragment | null,\n fragments: Array<Fragment>,\n bufferEnd: number = 0,\n maxFragLookUpTolerance: number = 0,\n nextFragLookupTolerance: number = 0.005,\n): Fragment | null {\n let fragNext: Fragment | null = null;\n if (fragPrevious) {\n fragNext =\n fragments[\n (fragPrevious.sn as number) - (fragments[0].sn as number) + 1\n ] || null;\n // check for buffer-end rounding error\n const bufferEdgeError = fragPrevious.endDTS - bufferEnd;\n if (bufferEdgeError > 0 && bufferEdgeError < 0.0000015) {\n bufferEnd += 0.0000015;\n }\n } else if (bufferEnd === 0 && fragments[0].start === 0) {\n fragNext = fragments[0];\n }\n // Prefer the next fragment if it's within tolerance\n if (\n fragNext &&\n (((!fragPrevious || fragPrevious.level === fragNext.level) &&\n fragmentWithinToleranceTest(\n bufferEnd,\n maxFragLookUpTolerance,\n fragNext,\n ) === 0) ||\n fragmentWithinFastStartSwitch(\n fragNext,\n fragPrevious,\n Math.min(nextFragLookupTolerance, maxFragLookUpTolerance),\n ))\n ) {\n return fragNext;\n }\n // We might be seeking past the tolerance so find the best match\n const foundFragment = BinarySearch.search(\n fragments,\n fragmentWithinToleranceTest.bind(null, bufferEnd, maxFragLookUpTolerance),\n );\n if (foundFragment && (foundFragment !== fragPrevious || !fragNext)) {\n return foundFragment;\n }\n // If no match was found return the next fragment after fragPrevious, or null\n return fragNext;\n}\n\nfunction fragmentWithinFastStartSwitch(\n fragNext: Fragment,\n fragPrevious: Fragment | null,\n nextFragLookupTolerance: number,\n): boolean {\n if (\n fragPrevious &&\n fragPrevious.start === 0 &&\n fragPrevious.level < fragNext.level &&\n (fragPrevious.endPTS || 0) > 0\n ) {\n const firstDuration = fragPrevious.tagList.reduce((duration, tag) => {\n if (tag[0] === 'INF') {\n duration += parseFloat(tag[1]);\n }\n return duration;\n }, nextFragLookupTolerance);\n return fragNext.start <= firstDuration;\n }\n return false;\n}\n\n/**\n * The test function used by the findFragmentBySn's BinarySearch to look for the best match to the current buffer conditions.\n * @param candidate - The fragment to test\n * @param bufferEnd - The end of the current buffered range the playhead is currently within\n * @param maxFragLookUpTolerance - The amount of time that a fragment's start can be within in order to be considered contiguous\n * @returns 0 if it matches, 1 if too low, -1 if too high\n */\nexport function fragmentWithinToleranceTest(\n bufferEnd = 0,\n maxFragLookUpTolerance = 0,\n candidate: Fragment,\n) {\n // eagerly accept an accurate match (no tolerance)\n if (\n candidate.start <= bufferEnd &&\n candidate.start + candidate.duration > bufferEnd\n ) {\n return 0;\n }\n // offset should be within fragment boundary - config.maxFragLookUpTolerance\n // this is to cope with situations like\n // bufferEnd = 9.991\n // frag[Ø] : [0,10]\n // frag[1] : [10,20]\n // bufferEnd is within frag[0] range ... although what we are expecting is to return frag[1] here\n // frag start frag start+duration\n // |-----------------------------|\n // <---> <--->\n // ...--------><-----------------------------><---------....\n // previous frag matching fragment next frag\n // return -1 return 0 return 1\n // logger.log(`level/sn/start/end/bufEnd:${level}/${candidate.sn}/${candidate.start}/${(candidate.start+candidate.duration)}/${bufferEnd}`);\n // Set the lookup tolerance to be small enough to detect the current segment - ensures we don't skip over very small segments\n const candidateLookupTolerance = Math.min(\n maxFragLookUpTolerance,\n candidate.duration + (candidate.deltaPTS ? candidate.deltaPTS : 0),\n );\n if (\n candidate.start + candidate.duration - candidateLookupTolerance <=\n bufferEnd\n ) {\n return 1;\n } else if (\n candidate.start - candidateLookupTolerance > bufferEnd &&\n candidate.start\n ) {\n // if maxFragLookUpTolerance will have negative value then don't return -1 for first element\n return -1;\n }\n\n return 0;\n}\n\n/**\n * The test function used by the findFragmentByPdt's BinarySearch to look for the best match to the current buffer conditions.\n * This function tests the candidate's program date time values, as represented in Unix time\n * @param candidate - The fragment to test\n * @param pdtBufferEnd - The Unix time representing the end of the current buffered range\n * @param maxFragLookUpTolerance - The amount of time that a fragment's start can be within in order to be considered contiguous\n * @returns true if contiguous, false otherwise\n */\nexport function pdtWithinToleranceTest(\n pdtBufferEnd: number,\n maxFragLookUpTolerance: number,\n candidate: Fragment,\n): boolean {\n const candidateLookupTolerance =\n Math.min(\n maxFragLookUpTolerance,\n candidate.duration + (candidate.deltaPTS ? candidate.deltaPTS : 0),\n ) * 1000;\n\n // endProgramDateTime can be null, default to zero\n const endProgramDateTime = candidate.endProgramDateTime || 0;\n return endProgramDateTime - candidateLookupTolerance > pdtBufferEnd;\n}\n\nexport function findFragWithCC(\n fragments: Fragment[],\n cc: number,\n): Fragment | null {\n return BinarySearch.search(fragments, (candidate) => {\n if (candidate.cc < cc) {\n return 1;\n } else if (candidate.cc > cc) {\n return -1;\n } else {\n return 0;\n }\n });\n}\n","import { Events } from '../events';\nimport { ErrorDetails, ErrorTypes } from '../errors';\nimport { PlaylistContextType, PlaylistLevelType } from '../types/loader';\nimport {\n getRetryConfig,\n isTimeoutError,\n shouldRetry,\n} from '../utils/error-helper';\nimport { findFragmentByPTS } from './fragment-finders';\nimport { HdcpLevel, HdcpLevels } from '../types/level';\nimport { logger } from '../utils/logger';\nimport type Hls from '../hls';\nimport type { RetryConfig } from '../config';\nimport type { NetworkComponentAPI } from '../types/component-api';\nimport type { ErrorData } from '../types/events';\nimport type { Fragment } from '../loader/fragment';\nimport type { LevelDetails } from '../loader/level-details';\n\nexport const enum NetworkErrorAction {\n DoNothing = 0,\n SendEndCallback = 1, // Reserved for future use\n SendAlternateToPenaltyBox = 2,\n RemoveAlternatePermanently = 3, // Reserved for future use\n InsertDiscontinuity = 4, // Reserved for future use\n RetryRequest = 5,\n}\n\nexport const enum ErrorActionFlags {\n None = 0,\n MoveAllAlternatesMatchingHost = 1,\n MoveAllAlternatesMatchingHDCP = 1 << 1,\n SwitchToSDR = 1 << 2, // Reserved for future use\n}\n\nexport type IErrorAction = {\n action: NetworkErrorAction;\n flags: ErrorActionFlags;\n retryCount?: number;\n retryConfig?: RetryConfig;\n hdcpLevel?: HdcpLevel;\n nextAutoLevel?: number;\n resolved?: boolean;\n};\n\ntype PenalizedRendition = {\n lastErrorPerfMs: number;\n errors: ErrorData[];\n details?: LevelDetails;\n};\n\ntype PenalizedRenditions = { [key: number]: PenalizedRendition };\n\nexport default class ErrorController implements NetworkComponentAPI {\n private readonly hls: Hls;\n private playlistError: number = 0;\n private penalizedRenditions: PenalizedRenditions = {};\n private log: (msg: any) => void;\n private warn: (msg: any) => void;\n private error: (msg: any) => void;\n\n constructor(hls: Hls) {\n this.hls = hls;\n this.log = logger.log.bind(logger, `[info]:`);\n this.warn = logger.warn.bind(logger, `[warning]:`);\n this.error = logger.error.bind(logger, `[error]:`);\n this.registerListeners();\n }\n\n private registerListeners() {\n const hls = this.hls;\n hls.on(Events.ERROR, this.onError, this);\n hls.on(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n hls.on(Events.LEVEL_UPDATED, this.onLevelUpdated, this);\n }\n\n private unregisterListeners() {\n const hls = this.hls;\n if (!hls) {\n return;\n }\n hls.off(Events.ERROR, this.onError, this);\n hls.off(Events.ERROR, this.onErrorOut, this);\n hls.off(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n hls.off(Events.LEVEL_UPDATED, this.onLevelUpdated, this);\n }\n\n destroy() {\n this.unregisterListeners();\n // @ts-ignore\n this.hls = null;\n this.penalizedRenditions = {};\n }\n\n startLoad(startPosition: number): void {}\n\n stopLoad(): void {\n this.playlistError = 0;\n }\n\n private getVariantLevelIndex(frag: Fragment | undefined): number {\n return frag?.type === PlaylistLevelType.MAIN\n ? frag.level\n : this.hls.loadLevel;\n }\n\n private onManifestLoading() {\n this.playlistError = 0;\n this.penalizedRenditions = {};\n }\n\n private onLevelUpdated() {\n this.playlistError = 0;\n }\n\n private onError(event: Events.ERROR, data: ErrorData) {\n if (data.fatal) {\n return;\n }\n const hls = this.hls;\n const context = data.context;\n\n switch (data.details) {\n case ErrorDetails.FRAG_LOAD_ERROR:\n case ErrorDetails.FRAG_LOAD_TIMEOUT:\n case ErrorDetails.KEY_LOAD_ERROR:\n case ErrorDetails.KEY_LOAD_TIMEOUT:\n data.errorAction = this.getFragRetryOrSwitchAction(data);\n return;\n case ErrorDetails.FRAG_PARSING_ERROR:\n // ignore empty segment errors marked as gap\n if (data.frag?.gap) {\n data.errorAction = {\n action: NetworkErrorAction.DoNothing,\n flags: ErrorActionFlags.None,\n };\n return;\n }\n // falls through\n case ErrorDetails.FRAG_GAP:\n case ErrorDetails.FRAG_DECRYPT_ERROR: {\n // Switch level if possible, otherwise allow retry count to reach max error retries\n data.errorAction = this.getFragRetryOrSwitchAction(data);\n data.errorAction.action = NetworkErrorAction.SendAlternateToPenaltyBox;\n return;\n }\n case ErrorDetails.LEVEL_EMPTY_ERROR:\n case ErrorDetails.LEVEL_PARSING_ERROR:\n {\n // Only retry when empty and live\n const levelIndex =\n data.parent === PlaylistLevelType.MAIN\n ? (data.level as number)\n : hls.loadLevel;\n if (\n data.details === ErrorDetails.LEVEL_EMPTY_ERROR &&\n !!data.context?.levelDetails?.live\n ) {\n data.errorAction = this.getPlaylistRetryOrSwitchAction(\n data,\n levelIndex,\n );\n } else {\n // Escalate to fatal if not retrying or switching\n data.levelRetry = false;\n data.errorAction = this.getLevelSwitchAction(data, levelIndex);\n }\n }\n return;\n case ErrorDetails.LEVEL_LOAD_ERROR:\n case ErrorDetails.LEVEL_LOAD_TIMEOUT:\n if (typeof context?.level === 'number') {\n data.errorAction = this.getPlaylistRetryOrSwitchAction(\n data,\n context.level,\n );\n }\n return;\n case ErrorDetails.AUDIO_TRACK_LOAD_ERROR:\n case ErrorDetails.AUDIO_TRACK_LOAD_TIMEOUT:\n case ErrorDetails.SUBTITLE_LOAD_ERROR:\n case ErrorDetails.SUBTITLE_TRACK_LOAD_TIMEOUT:\n if (context) {\n const level = hls.levels[hls.loadLevel];\n if (\n level &&\n ((context.type === PlaylistContextType.AUDIO_TRACK &&\n level.hasAudioGroup(context.groupId)) ||\n (context.type === PlaylistContextType.SUBTITLE_TRACK &&\n level.hasSubtitleGroup(context.groupId)))\n ) {\n // Perform Pathway switch or Redundant failover if possible for fastest recovery\n // otherwise allow playlist retry count to reach max error retries\n data.errorAction = this.getPlaylistRetryOrSwitchAction(\n data,\n hls.loadLevel,\n );\n data.errorAction.action =\n NetworkErrorAction.SendAlternateToPenaltyBox;\n data.errorAction.flags =\n ErrorActionFlags.MoveAllAlternatesMatchingHost;\n return;\n }\n }\n return;\n case ErrorDetails.KEY_SYSTEM_STATUS_OUTPUT_RESTRICTED:\n {\n const level = hls.levels[hls.loadLevel];\n const restrictedHdcpLevel = level?.attrs['HDCP-LEVEL'];\n if (restrictedHdcpLevel) {\n data.errorAction = {\n action: NetworkErrorAction.SendAlternateToPenaltyBox,\n flags: ErrorActionFlags.MoveAllAlternatesMatchingHDCP,\n hdcpLevel: restrictedHdcpLevel,\n };\n } else {\n this.keySystemError(data);\n }\n }\n return;\n case ErrorDetails.BUFFER_ADD_CODEC_ERROR:\n case ErrorDetails.REMUX_ALLOC_ERROR:\n case ErrorDetails.BUFFER_APPEND_ERROR:\n data.errorAction = this.getLevelSwitchAction(\n data,\n data.level ?? hls.loadLevel,\n );\n return;\n case ErrorDetails.INTERNAL_EXCEPTION:\n case ErrorDetails.BUFFER_APPENDING_ERROR:\n case ErrorDetails.BUFFER_FULL_ERROR:\n case ErrorDetails.LEVEL_SWITCH_ERROR:\n case ErrorDetails.BUFFER_STALLED_ERROR:\n case ErrorDetails.BUFFER_SEEK_OVER_HOLE:\n case ErrorDetails.BUFFER_NUDGE_ON_STALL:\n data.errorAction = {\n action: NetworkErrorAction.DoNothing,\n flags: ErrorActionFlags.None,\n };\n return;\n }\n\n if (data.type === ErrorTypes.KEY_SYSTEM_ERROR) {\n this.keySystemError(data);\n }\n }\n\n private keySystemError(data: ErrorData) {\n const levelIndex = this.getVariantLevelIndex(data.frag);\n // Do not retry level. Escalate to fatal if switching levels fails.\n data.levelRetry = false;\n data.errorAction = this.getLevelSwitchAction(data, levelIndex);\n }\n\n private getPlaylistRetryOrSwitchAction(\n data: ErrorData,\n levelIndex: number | null | undefined,\n ): IErrorAction {\n const hls = this.hls;\n const retryConfig = getRetryConfig(hls.config.playlistLoadPolicy, data);\n const retryCount = this.playlistError++;\n const retry = shouldRetry(\n retryConfig,\n retryCount,\n isTimeoutError(data),\n data.response,\n );\n if (retry) {\n return {\n action: NetworkErrorAction.RetryRequest,\n flags: ErrorActionFlags.None,\n retryConfig,\n retryCount,\n };\n }\n const errorAction = this.getLevelSwitchAction(data, levelIndex);\n if (retryConfig) {\n errorAction.retryConfig = retryConfig;\n errorAction.retryCount = retryCount;\n }\n return errorAction;\n }\n\n private getFragRetryOrSwitchAction(data: ErrorData): IErrorAction {\n const hls = this.hls;\n // Share fragment error count accross media options (main, audio, subs)\n // This allows for level based rendition switching when media option assets fail\n const variantLevelIndex = this.getVariantLevelIndex(data.frag);\n const level = hls.levels[variantLevelIndex];\n const { fragLoadPolicy, keyLoadPolicy } = hls.config;\n const retryConfig = getRetryConfig(\n data.details.startsWith('key') ? keyLoadPolicy : fragLoadPolicy,\n data,\n );\n const fragmentErrors = hls.levels.reduce(\n (acc, level) => acc + level.fragmentError,\n 0,\n );\n // Switch levels when out of retried or level index out of bounds\n if (level) {\n if (data.details !== ErrorDetails.FRAG_GAP) {\n level.fragmentError++;\n }\n const retry = shouldRetry(\n retryConfig,\n fragmentErrors,\n isTimeoutError(data),\n data.response,\n );\n if (retry) {\n return {\n action: NetworkErrorAction.RetryRequest,\n flags: ErrorActionFlags.None,\n retryConfig,\n retryCount: fragmentErrors,\n };\n }\n }\n // Reach max retry count, or Missing level reference\n // Switch to valid index\n const errorAction = this.getLevelSwitchAction(data, variantLevelIndex);\n // Add retry details to allow skipping of FRAG_PARSING_ERROR\n if (retryConfig) {\n errorAction.retryConfig = retryConfig;\n errorAction.retryCount = fragmentErrors;\n }\n return errorAction;\n }\n\n private getLevelSwitchAction(\n data: ErrorData,\n levelIndex: number | null | undefined,\n ): IErrorAction {\n const hls = this.hls;\n if (levelIndex === null || levelIndex === undefined) {\n levelIndex = hls.loadLevel;\n }\n const level = this.hls.levels[levelIndex];\n if (level) {\n const errorDetails = data.details;\n level.loadError++;\n if (errorDetails === ErrorDetails.BUFFER_APPEND_ERROR) {\n level.fragmentError++;\n }\n // Search for next level to retry\n let nextLevel = -1;\n const { levels, loadLevel, minAutoLevel, maxAutoLevel } = hls;\n if (!hls.autoLevelEnabled) {\n hls.loadLevel = -1;\n }\n const fragErrorType = data.frag?.type;\n // Find alternate audio codec if available on audio codec error\n const isAudioCodecError =\n (fragErrorType === PlaylistLevelType.AUDIO &&\n errorDetails === ErrorDetails.FRAG_PARSING_ERROR) ||\n (data.sourceBufferName === 'audio' &&\n (errorDetails === ErrorDetails.BUFFER_ADD_CODEC_ERROR ||\n errorDetails === ErrorDetails.BUFFER_APPEND_ERROR));\n const findAudioCodecAlternate =\n isAudioCodecError &&\n levels.some(({ audioCodec }) => level.audioCodec !== audioCodec);\n // Find alternate video codec if available on video codec error\n const isVideoCodecError =\n data.sourceBufferName === 'video' &&\n (errorDetails === ErrorDetails.BUFFER_ADD_CODEC_ERROR ||\n errorDetails === ErrorDetails.BUFFER_APPEND_ERROR);\n const findVideoCodecAlternate =\n isVideoCodecError &&\n levels.some(\n ({ codecSet, audioCodec }) =>\n level.codecSet !== codecSet && level.audioCodec === audioCodec,\n );\n const { type: playlistErrorType, groupId: playlistErrorGroupId } =\n data.context ?? {};\n for (let i = levels.length; i--; ) {\n const candidate = (i + loadLevel) % levels.length;\n if (\n candidate !== loadLevel &&\n candidate >= minAutoLevel &&\n candidate <= maxAutoLevel &&\n levels[candidate].loadError === 0\n ) {\n const levelCandidate = levels[candidate];\n // Skip level switch if GAP tag is found in next level at same position\n if (\n errorDetails === ErrorDetails.FRAG_GAP &&\n fragErrorType === PlaylistLevelType.MAIN &&\n data.frag\n ) {\n const levelDetails = levels[candidate].details;\n if (levelDetails) {\n const fragCandidate = findFragmentByPTS(\n data.frag,\n levelDetails.fragments,\n data.frag.start,\n );\n if (fragCandidate?.gap) {\n continue;\n }\n }\n } else if (\n (playlistErrorType === PlaylistContextType.AUDIO_TRACK &&\n levelCandidate.hasAudioGroup(playlistErrorGroupId)) ||\n (playlistErrorType === PlaylistContextType.SUBTITLE_TRACK &&\n levelCandidate.hasSubtitleGroup(playlistErrorGroupId))\n ) {\n // For audio/subs playlist errors find another group ID or fallthrough to redundant fail-over\n continue;\n } else if (\n (fragErrorType === PlaylistLevelType.AUDIO &&\n level.audioGroups?.some((groupId) =>\n levelCandidate.hasAudioGroup(groupId),\n )) ||\n (fragErrorType === PlaylistLevelType.SUBTITLE &&\n level.subtitleGroups?.some((groupId) =>\n levelCandidate.hasSubtitleGroup(groupId),\n )) ||\n (findAudioCodecAlternate &&\n level.audioCodec === levelCandidate.audioCodec) ||\n (!findAudioCodecAlternate &&\n level.audioCodec !== levelCandidate.audioCodec) ||\n (findVideoCodecAlternate &&\n level.codecSet === levelCandidate.codecSet)\n ) {\n // For video/audio/subs frag errors find another group ID or fallthrough to redundant fail-over\n continue;\n }\n nextLevel = candidate;\n break;\n }\n }\n if (nextLevel > -1 && hls.loadLevel !== nextLevel) {\n data.levelRetry = true;\n this.playlistError = 0;\n return {\n action: NetworkErrorAction.SendAlternateToPenaltyBox,\n flags: ErrorActionFlags.None,\n nextAutoLevel: nextLevel,\n };\n }\n }\n // No levels to switch / Manual level selection / Level not found\n // Resolve with Pathway switch, Redundant fail-over, or stay on lowest Level\n return {\n action: NetworkErrorAction.SendAlternateToPenaltyBox,\n flags: ErrorActionFlags.MoveAllAlternatesMatchingHost,\n };\n }\n\n public onErrorOut(event: Events.ERROR, data: ErrorData) {\n switch (data.errorAction?.action) {\n case NetworkErrorAction.DoNothing:\n break;\n case NetworkErrorAction.SendAlternateToPenaltyBox:\n this.sendAlternateToPenaltyBox(data);\n if (\n !data.errorAction.resolved &&\n data.details !== ErrorDetails.FRAG_GAP\n ) {\n data.fatal = true;\n } else if (/MediaSource readyState: ended/.test(data.error.message)) {\n this.warn(\n `MediaSource ended after \"${data.sourceBufferName}\" sourceBuffer append error. Attempting to recover from media error.`,\n );\n this.hls.recoverMediaError();\n }\n break;\n case NetworkErrorAction.RetryRequest:\n // handled by stream and playlist/level controllers\n break;\n }\n\n if (data.fatal) {\n this.hls.stopLoad();\n return;\n }\n }\n\n private sendAlternateToPenaltyBox(data: ErrorData) {\n const hls = this.hls;\n const errorAction = data.errorAction;\n if (!errorAction) {\n return;\n }\n const { flags, hdcpLevel, nextAutoLevel } = errorAction;\n\n switch (flags) {\n case ErrorActionFlags.None:\n this.switchLevel(data, nextAutoLevel);\n break;\n case ErrorActionFlags.MoveAllAlternatesMatchingHDCP:\n if (hdcpLevel) {\n hls.maxHdcpLevel = HdcpLevels[HdcpLevels.indexOf(hdcpLevel) - 1];\n errorAction.resolved = true;\n }\n this.warn(\n `Restricting playback to HDCP-LEVEL of \"${hls.maxHdcpLevel}\" or lower`,\n );\n break;\n }\n // If not resolved by previous actions try to switch to next level\n if (!errorAction.resolved) {\n this.switchLevel(data, nextAutoLevel);\n }\n }\n\n private switchLevel(data: ErrorData, levelIndex: number | undefined) {\n if (levelIndex !== undefined && data.errorAction) {\n this.warn(`switching to level ${levelIndex} after ${data.details}`);\n this.hls.nextAutoLevel = levelIndex;\n data.errorAction.resolved = true;\n // Stream controller is responsible for this but won't switch on false start\n this.hls.nextLoadLevel = this.hls.nextAutoLevel;\n }\n }\n}\n","import type Hls from '../hls';\nimport type { NetworkComponentAPI } from '../types/component-api';\nimport { getSkipValue, HlsSkip, HlsUrlParameters, Level } from '../types/level';\nimport { computeReloadInterval, mergeDetails } from '../utils/level-helper';\nimport { ErrorData } from '../types/events';\nimport { getRetryDelay, isTimeoutError } from '../utils/error-helper';\nimport { NetworkErrorAction } from './error-controller';\nimport { logger } from '../utils/logger';\nimport type { LevelDetails } from '../loader/level-details';\nimport type { MediaPlaylist } from '../types/media-playlist';\nimport type {\n AudioTrackLoadedData,\n LevelLoadedData,\n TrackLoadedData,\n} from '../types/events';\n\nexport default class BasePlaylistController implements NetworkComponentAPI {\n protected hls: Hls;\n protected timer: number = -1;\n protected requestScheduled: number = -1;\n protected canLoad: boolean = false;\n protected log: (msg: any) => void;\n protected warn: (msg: any) => void;\n\n constructor(hls: Hls, logPrefix: string) {\n this.log = logger.log.bind(logger, `${logPrefix}:`);\n this.warn = logger.warn.bind(logger, `${logPrefix}:`);\n this.hls = hls;\n }\n\n public destroy(): void {\n this.clearTimer();\n // @ts-ignore\n this.hls = this.log = this.warn = null;\n }\n\n protected clearTimer(): void {\n if (this.timer !== -1) {\n self.clearTimeout(this.timer);\n this.timer = -1;\n }\n }\n\n public startLoad(): void {\n this.canLoad = true;\n this.requestScheduled = -1;\n this.loadPlaylist();\n }\n\n public stopLoad(): void {\n this.canLoad = false;\n this.clearTimer();\n }\n\n protected switchParams(\n playlistUri: string,\n previous: LevelDetails | undefined,\n current: LevelDetails | undefined,\n ): HlsUrlParameters | undefined {\n const renditionReports = previous?.renditionReports;\n if (renditionReports) {\n let foundIndex = -1;\n for (let i = 0; i < renditionReports.length; i++) {\n const attr = renditionReports[i];\n let uri: string;\n try {\n uri = new self.URL(attr.URI, previous.url).href;\n } catch (error) {\n logger.warn(\n `Could not construct new URL for Rendition Report: ${error}`,\n );\n uri = attr.URI || '';\n }\n // Use exact match. Otherwise, the last partial match, if any, will be used\n // (Playlist URI includes a query string that the Rendition Report does not)\n if (uri === playlistUri) {\n foundIndex = i;\n break;\n } else if (uri === playlistUri.substring(0, uri.length)) {\n foundIndex = i;\n }\n }\n if (foundIndex !== -1) {\n const attr = renditionReports[foundIndex];\n const msn = parseInt(attr['LAST-MSN']) || previous?.lastPartSn;\n let part = parseInt(attr['LAST-PART']) || previous?.lastPartIndex;\n if (this.hls.config.lowLatencyMode) {\n const currentGoal = Math.min(\n previous.age - previous.partTarget,\n previous.targetduration,\n );\n if (part >= 0 && currentGoal > previous.partTarget) {\n part += 1;\n }\n }\n const skip = current && getSkipValue(current);\n return new HlsUrlParameters(msn, part >= 0 ? part : undefined, skip);\n }\n }\n }\n\n protected loadPlaylist(hlsUrlParameters?: HlsUrlParameters): void {\n if (this.requestScheduled === -1) {\n this.requestScheduled = self.performance.now();\n }\n // Loading is handled by the subclasses\n }\n\n protected shouldLoadPlaylist(\n playlist: Level | MediaPlaylist | null | undefined,\n ): boolean {\n return (\n this.canLoad &&\n !!playlist &&\n !!playlist.url &&\n (!playlist.details || playlist.details.live)\n );\n }\n\n protected shouldReloadPlaylist(\n playlist: Level | MediaPlaylist | null | undefined,\n ): boolean {\n return (\n this.timer === -1 &&\n this.requestScheduled === -1 &&\n this.shouldLoadPlaylist(playlist)\n );\n }\n\n protected playlistLoaded(\n index: number,\n data: LevelLoadedData | AudioTrackLoadedData | TrackLoadedData,\n previousDetails?: LevelDetails,\n ) {\n const { details, stats } = data;\n\n // Set last updated date-time\n const now = self.performance.now();\n const elapsed = stats.loading.first\n ? Math.max(0, now - stats.loading.first)\n : 0;\n details.advancedDateTime = Date.now() - elapsed;\n\n // if current playlist is a live playlist, arm a timer to reload it\n if (details.live || previousDetails?.live) {\n details.reloaded(previousDetails);\n if (previousDetails) {\n this.log(\n `live playlist ${index} ${\n details.advanced\n ? 'REFRESHED ' + details.lastPartSn + '-' + details.lastPartIndex\n : details.updated\n ? 'UPDATED'\n : 'MISSED'\n }`,\n );\n }\n // Merge live playlists to adjust fragment starts and fill in delta playlist skipped segments\n if (previousDetails && details.fragments.length > 0) {\n mergeDetails(previousDetails, details);\n }\n if (!this.canLoad || !details.live) {\n return;\n }\n let deliveryDirectives: HlsUrlParameters | undefined;\n let msn: number | undefined = undefined;\n let part: number | undefined = undefined;\n if (details.canBlockReload && details.endSN && details.advanced) {\n // Load level with LL-HLS delivery directives\n const lowLatencyMode = this.hls.config.lowLatencyMode;\n const lastPartSn = details.lastPartSn;\n const endSn = details.endSN;\n const lastPartIndex = details.lastPartIndex;\n const hasParts = lastPartIndex !== -1;\n const lastPart = lastPartSn === endSn;\n // When low latency mode is disabled, we'll skip part requests once the last part index is found\n const nextSnStartIndex = lowLatencyMode ? 0 : lastPartIndex;\n if (hasParts) {\n msn = lastPart ? endSn + 1 : lastPartSn;\n part = lastPart ? nextSnStartIndex : lastPartIndex + 1;\n } else {\n msn = endSn + 1;\n }\n // Low-Latency CDN Tune-in: \"age\" header and time since load indicates we're behind by more than one part\n // Update directives to obtain the Playlist that has the estimated additional duration of media\n const lastAdvanced = details.age;\n const cdnAge = lastAdvanced + details.ageHeader;\n let currentGoal = Math.min(\n cdnAge - details.partTarget,\n details.targetduration * 1.5,\n );\n if (currentGoal > 0) {\n if (previousDetails && currentGoal > previousDetails.tuneInGoal) {\n // If we attempted to get the next or latest playlist update, but currentGoal increased,\n // then we either can't catchup, or the \"age\" header cannot be trusted.\n this.warn(\n `CDN Tune-in goal increased from: ${previousDetails.tuneInGoal} to: ${currentGoal} with playlist age: ${details.age}`,\n );\n currentGoal = 0;\n } else {\n const segments = Math.floor(currentGoal / details.targetduration);\n msn += segments;\n if (part !== undefined) {\n const parts = Math.round(\n (currentGoal % details.targetduration) / details.partTarget,\n );\n part += parts;\n }\n this.log(\n `CDN Tune-in age: ${\n details.ageHeader\n }s last advanced ${lastAdvanced.toFixed(\n 2,\n )}s goal: ${currentGoal} skip sn ${segments} to part ${part}`,\n );\n }\n details.tuneInGoal = currentGoal;\n }\n deliveryDirectives = this.getDeliveryDirectives(\n details,\n data.deliveryDirectives,\n msn,\n part,\n );\n if (lowLatencyMode || !lastPart) {\n this.loadPlaylist(deliveryDirectives);\n return;\n }\n } else if (details.canBlockReload || details.canSkipUntil) {\n deliveryDirectives = this.getDeliveryDirectives(\n details,\n data.deliveryDirectives,\n msn,\n part,\n );\n }\n const bufferInfo = this.hls.mainForwardBufferInfo;\n const position = bufferInfo ? bufferInfo.end - bufferInfo.len : 0;\n const distanceToLiveEdgeMs = (details.edge - position) * 1000;\n const reloadInterval = computeReloadInterval(\n details,\n distanceToLiveEdgeMs,\n );\n if (details.updated && now > this.requestScheduled + reloadInterval) {\n this.requestScheduled = stats.loading.start;\n }\n\n if (msn !== undefined && details.canBlockReload) {\n this.requestScheduled =\n stats.loading.first +\n reloadInterval -\n (details.partTarget * 1000 || 1000);\n } else if (\n this.requestScheduled === -1 ||\n this.requestScheduled + reloadInterval < now\n ) {\n this.requestScheduled = now;\n } else if (this.requestScheduled - now <= 0) {\n this.requestScheduled += reloadInterval;\n }\n let estimatedTimeUntilUpdate = this.requestScheduled - now;\n estimatedTimeUntilUpdate = Math.max(0, estimatedTimeUntilUpdate);\n this.log(\n `reload live playlist ${index} in ${Math.round(\n estimatedTimeUntilUpdate,\n )} ms`,\n );\n // this.log(\n // `live reload ${details.updated ? 'REFRESHED' : 'MISSED'}\n // reload in ${estimatedTimeUntilUpdate / 1000}\n // round trip ${(stats.loading.end - stats.loading.start) / 1000}\n // diff ${\n // (reloadInterval -\n // (estimatedTimeUntilUpdate +\n // stats.loading.end -\n // stats.loading.start)) /\n // 1000\n // }\n // reload interval ${reloadInterval / 1000}\n // target duration ${details.targetduration}\n // distance to edge ${distanceToLiveEdgeMs / 1000}`\n // );\n\n this.timer = self.setTimeout(\n () => this.loadPlaylist(deliveryDirectives),\n estimatedTimeUntilUpdate,\n );\n } else {\n this.clearTimer();\n }\n }\n\n private getDeliveryDirectives(\n details: LevelDetails,\n previousDeliveryDirectives: HlsUrlParameters | null,\n msn?: number,\n part?: number,\n ): HlsUrlParameters {\n let skip = getSkipValue(details);\n if (previousDeliveryDirectives?.skip && details.deltaUpdateFailed) {\n msn = previousDeliveryDirectives.msn;\n part = previousDeliveryDirectives.part;\n skip = HlsSkip.No;\n }\n return new HlsUrlParameters(msn, part, skip);\n }\n\n protected checkRetry(errorEvent: ErrorData): boolean {\n const errorDetails = errorEvent.details;\n const isTimeout = isTimeoutError(errorEvent);\n const errorAction = errorEvent.errorAction;\n const { action, retryCount = 0, retryConfig } = errorAction || {};\n const retry =\n !!errorAction &&\n !!retryConfig &&\n (action === NetworkErrorAction.RetryRequest ||\n (!errorAction.resolved &&\n action === NetworkErrorAction.SendAlternateToPenaltyBox));\n if (retry) {\n this.requestScheduled = -1;\n if (retryCount >= retryConfig.maxNumRetry) {\n return false;\n }\n if (isTimeout && errorEvent.context?.deliveryDirectives) {\n // The LL-HLS request already timed out so retry immediately\n this.warn(\n `Retrying playlist loading ${retryCount + 1}/${\n retryConfig.maxNumRetry\n } after \"${errorDetails}\" without delivery-directives`,\n );\n this.loadPlaylist();\n } else {\n const delay = getRetryDelay(retryConfig, retryCount);\n // Schedule level/track reload\n this.timer = self.setTimeout(() => this.loadPlaylist(), delay);\n this.warn(\n `Retrying playlist loading ${retryCount + 1}/${\n retryConfig.maxNumRetry\n } after \"${errorDetails}\" in ${delay}ms`,\n );\n }\n // `levelRetry = true` used to inform other controllers that a retry is happening\n errorEvent.levelRetry = true;\n errorAction.resolved = true;\n }\n return retry;\n }\n}\n","/*\n * compute an Exponential Weighted moving average\n * - https://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average\n * - heavily inspired from shaka-player\n */\n\nclass EWMA {\n public readonly halfLife: number;\n private alpha_: number;\n private estimate_: number;\n private totalWeight_: number;\n\n // About half of the estimated value will be from the last |halfLife| samples by weight.\n constructor(halfLife: number, estimate: number = 0, weight: number = 0) {\n this.halfLife = halfLife;\n // Larger values of alpha expire historical data more slowly.\n this.alpha_ = halfLife ? Math.exp(Math.log(0.5) / halfLife) : 0;\n this.estimate_ = estimate;\n this.totalWeight_ = weight;\n }\n\n sample(weight: number, value: number) {\n const adjAlpha = Math.pow(this.alpha_, weight);\n this.estimate_ = value * (1 - adjAlpha) + adjAlpha * this.estimate_;\n this.totalWeight_ += weight;\n }\n\n getTotalWeight(): number {\n return this.totalWeight_;\n }\n\n getEstimate(): number {\n if (this.alpha_) {\n const zeroFactor = 1 - Math.pow(this.alpha_, this.totalWeight_);\n if (zeroFactor) {\n return this.estimate_ / zeroFactor;\n }\n }\n return this.estimate_;\n }\n}\n\nexport default EWMA;\n","/*\n * EWMA Bandwidth Estimator\n * - heavily inspired from shaka-player\n * Tracks bandwidth samples and estimates available bandwidth.\n * Based on the minimum of two exponentially-weighted moving averages with\n * different half-lives.\n */\n\nimport EWMA from '../utils/ewma';\n\nclass EwmaBandWidthEstimator {\n private defaultEstimate_: number;\n private minWeight_: number;\n private minDelayMs_: number;\n private slow_: EWMA;\n private fast_: EWMA;\n private defaultTTFB_: number;\n private ttfb_: EWMA;\n\n constructor(\n slow: number,\n fast: number,\n defaultEstimate: number,\n defaultTTFB: number = 100,\n ) {\n this.defaultEstimate_ = defaultEstimate;\n this.minWeight_ = 0.001;\n this.minDelayMs_ = 50;\n this.slow_ = new EWMA(slow);\n this.fast_ = new EWMA(fast);\n this.defaultTTFB_ = defaultTTFB;\n this.ttfb_ = new EWMA(slow);\n }\n\n update(slow: number, fast: number) {\n const { slow_, fast_, ttfb_ } = this;\n if (slow_.halfLife !== slow) {\n this.slow_ = new EWMA(slow, slow_.getEstimate(), slow_.getTotalWeight());\n }\n if (fast_.halfLife !== fast) {\n this.fast_ = new EWMA(fast, fast_.getEstimate(), fast_.getTotalWeight());\n }\n if (ttfb_.halfLife !== slow) {\n this.ttfb_ = new EWMA(slow, ttfb_.getEstimate(), ttfb_.getTotalWeight());\n }\n }\n\n sample(durationMs: number, numBytes: number) {\n durationMs = Math.max(durationMs, this.minDelayMs_);\n const numBits = 8 * numBytes;\n // weight is duration in seconds\n const durationS = durationMs / 1000;\n // value is bandwidth in bits/s\n const bandwidthInBps = numBits / durationS;\n this.fast_.sample(durationS, bandwidthInBps);\n this.slow_.sample(durationS, bandwidthInBps);\n }\n\n sampleTTFB(ttfb: number) {\n // weight is frequency curve applied to TTFB in seconds\n // (longer times have less weight with expected input under 1 second)\n const seconds = ttfb / 1000;\n const weight = Math.sqrt(2) * Math.exp(-Math.pow(seconds, 2) / 2);\n this.ttfb_.sample(weight, Math.max(ttfb, 5));\n }\n\n canEstimate(): boolean {\n return this.fast_.getTotalWeight() >= this.minWeight_;\n }\n\n getEstimate(): number {\n if (this.canEstimate()) {\n // console.log('slow estimate:'+ Math.round(this.slow_.getEstimate()));\n // console.log('fast estimate:'+ Math.round(this.fast_.getEstimate()));\n // Take the minimum of these two estimates. This should have the effect of\n // adapting down quickly, but up more slowly.\n return Math.min(this.fast_.getEstimate(), this.slow_.getEstimate());\n } else {\n return this.defaultEstimate_;\n }\n }\n\n getEstimateTTFB(): number {\n if (this.ttfb_.getTotalWeight() >= this.minWeight_) {\n return this.ttfb_.getEstimate();\n } else {\n return this.defaultTTFB_;\n }\n }\n\n destroy() {}\n}\nexport default EwmaBandWidthEstimator;\n","import { mimeTypeForCodec } from './codecs';\nimport type { Level, VideoRange } from '../types/level';\nimport type { AudioSelectionOption } from '../types/media-playlist';\nimport type { AudioTracksByGroup } from './rendition-helper';\n\nexport type MediaDecodingInfo = {\n supported: boolean;\n configurations: readonly MediaDecodingConfiguration[];\n decodingInfoResults: readonly MediaCapabilitiesDecodingInfo[];\n error?: Error;\n};\n\ntype BaseVideoConfiguration = Omit<VideoConfiguration, 'contentType'>;\n\nexport const SUPPORTED_INFO_DEFAULT: MediaDecodingInfo = {\n supported: true,\n configurations: [] as MediaDecodingConfiguration[],\n decodingInfoResults: [\n {\n supported: true,\n powerEfficient: true,\n smooth: true,\n },\n ],\n} as const;\n\nexport const SUPPORTED_INFO_CACHE: Record<\n string,\n Promise<MediaCapabilitiesDecodingInfo>\n> = {};\n\nexport function requiresMediaCapabilitiesDecodingInfo(\n level: Level,\n audioTracksByGroup: AudioTracksByGroup,\n currentVideoRange: VideoRange | undefined,\n currentFrameRate: number,\n currentBw: number,\n audioPreference: AudioSelectionOption | undefined,\n): boolean {\n // Only test support when configuration is exceeds minimum options\n const audioGroups = level.audioCodec ? level.audioGroups : null;\n const audioCodecPreference = audioPreference?.audioCodec;\n const channelsPreference = audioPreference?.channels;\n const maxChannels = channelsPreference\n ? parseInt(channelsPreference)\n : audioCodecPreference\n ? Infinity\n : 2;\n let audioChannels: Record<string, number> | null = null;\n if (audioGroups?.length) {\n try {\n if (audioGroups.length === 1 && audioGroups[0]) {\n audioChannels = audioTracksByGroup.groups[audioGroups[0]].channels;\n } else {\n audioChannels = audioGroups.reduce(\n (acc, groupId) => {\n if (groupId) {\n const audioTrackGroup = audioTracksByGroup.groups[groupId];\n if (!audioTrackGroup) {\n throw new Error(`Audio track group ${groupId} not found`);\n }\n // Sum all channel key values\n Object.keys(audioTrackGroup.channels).forEach((key) => {\n acc[key] = (acc[key] || 0) + audioTrackGroup.channels[key];\n });\n }\n return acc;\n },\n { 2: 0 },\n );\n }\n } catch (error) {\n return true;\n }\n }\n return (\n (level.videoCodec !== undefined &&\n ((level.width > 1920 && level.height > 1088) ||\n (level.height > 1920 && level.width > 1088) ||\n level.frameRate > Math.max(currentFrameRate, 30) ||\n (level.videoRange !== 'SDR' &&\n level.videoRange !== currentVideoRange) ||\n level.bitrate > Math.max(currentBw, 8e6))) ||\n (!!audioChannels &&\n Number.isFinite(maxChannels) &&\n Object.keys(audioChannels).some(\n (channels) => parseInt(channels) > maxChannels,\n ))\n );\n}\n\nexport function getMediaDecodingInfoPromise(\n level: Level,\n audioTracksByGroup: AudioTracksByGroup,\n mediaCapabilities: MediaCapabilities | undefined,\n): Promise<MediaDecodingInfo> {\n const videoCodecs = level.videoCodec;\n const audioCodecs = level.audioCodec;\n if (!videoCodecs || !audioCodecs || !mediaCapabilities) {\n return Promise.resolve(SUPPORTED_INFO_DEFAULT);\n }\n\n const baseVideoConfiguration: BaseVideoConfiguration = {\n width: level.width,\n height: level.height,\n bitrate: Math.ceil(Math.max(level.bitrate * 0.9, level.averageBitrate)),\n // Assume a framerate of 30fps since MediaCapabilities will not accept Level default of 0.\n framerate: level.frameRate || 30,\n };\n\n const videoRange = level.videoRange;\n if (videoRange !== 'SDR') {\n baseVideoConfiguration.transferFunction =\n videoRange.toLowerCase() as TransferFunction;\n }\n\n const configurations: MediaDecodingConfiguration[] = videoCodecs\n .split(',')\n .map((videoCodec) => ({\n type: 'media-source',\n video: {\n ...baseVideoConfiguration,\n contentType: mimeTypeForCodec(videoCodec, 'video'),\n },\n }));\n\n if (audioCodecs && level.audioGroups) {\n level.audioGroups.forEach((audioGroupId) => {\n if (!audioGroupId) {\n return;\n }\n audioTracksByGroup.groups[audioGroupId]?.tracks.forEach((audioTrack) => {\n if (audioTrack.groupId === audioGroupId) {\n const channels = audioTrack.channels || '';\n const channelsNumber = parseFloat(channels);\n if (Number.isFinite(channelsNumber) && channelsNumber > 2) {\n configurations.push.apply(\n configurations,\n audioCodecs.split(',').map((audioCodec) => ({\n type: 'media-source',\n audio: {\n contentType: mimeTypeForCodec(audioCodec, 'audio'),\n channels: '' + channelsNumber,\n // spatialRendering:\n // audioCodec === 'ec-3' && channels.indexOf('JOC'),\n },\n })),\n );\n }\n }\n });\n });\n }\n\n return Promise.all(\n configurations.map((configuration) => {\n // Cache MediaCapabilities promises\n const decodingInfoKey = getMediaDecodingInfoKey(configuration);\n return (\n SUPPORTED_INFO_CACHE[decodingInfoKey] ||\n (SUPPORTED_INFO_CACHE[decodingInfoKey] =\n mediaCapabilities.decodingInfo(configuration))\n );\n }),\n )\n .then((decodingInfoResults) => ({\n supported: !decodingInfoResults.some((info) => !info.supported),\n configurations,\n decodingInfoResults,\n }))\n .catch((error) => ({\n supported: false,\n configurations,\n decodingInfoResults: [] as MediaCapabilitiesDecodingInfo[],\n error,\n }));\n}\n\nfunction getMediaDecodingInfoKey(config: MediaDecodingConfiguration): string {\n const { audio, video } = config;\n const mediaConfig = video || audio;\n if (mediaConfig) {\n const codec = mediaConfig.contentType.split('\"')[1];\n if (video) {\n return `r${video.height}x${video.width}f${Math.ceil(video.framerate)}${\n video.transferFunction || 'sd'\n }_${codec}_${Math.ceil(video.bitrate / 1e5)}`;\n }\n if (audio) {\n return `c${audio.channels}${audio.spatialRendering ? 's' : 'n'}_${codec}`;\n }\n }\n return '';\n}\n","import { codecsSetSelectionPreferenceValue } from './codecs';\nimport { getVideoSelectionOptions } from './hdr';\nimport { logger } from './logger';\nimport type { Level, VideoRange } from '../types/level';\nimport type {\n AudioSelectionOption,\n MediaPlaylist,\n SubtitleSelectionOption,\n VideoSelectionOption,\n} from '../types/media-playlist';\n\nexport type CodecSetTier = {\n minBitrate: number;\n minHeight: number;\n minFramerate: number;\n maxScore: number;\n videoRanges: Record<string, number>;\n channels: Record<string, number>;\n hasDefaultAudio: boolean;\n fragmentError: number;\n};\n\ntype AudioTrackGroup = {\n tracks: MediaPlaylist[];\n channels: Record<string, number>;\n hasDefault: boolean;\n hasAutoSelect: boolean;\n};\ntype StartParameters = {\n codecSet: string | undefined;\n videoRanges: Array<VideoRange>;\n preferHDR: boolean;\n minFramerate: number;\n minBitrate: number;\n};\n\nexport function getStartCodecTier(\n codecTiers: Record<string, CodecSetTier>,\n currentVideoRange: VideoRange | undefined,\n currentBw: number,\n audioPreference: AudioSelectionOption | undefined,\n videoPreference: VideoSelectionOption | undefined,\n): StartParameters {\n const codecSets = Object.keys(codecTiers);\n const channelsPreference = audioPreference?.channels;\n const audioCodecPreference = audioPreference?.audioCodec;\n const preferStereo = channelsPreference && parseInt(channelsPreference) === 2;\n // Use first level set to determine stereo, and minimum resolution and framerate\n let hasStereo = true;\n let hasCurrentVideoRange = false;\n let minHeight = Infinity;\n let minFramerate = Infinity;\n let minBitrate = Infinity;\n let selectedScore = 0;\n let videoRanges: Array<VideoRange> = [];\n\n const { preferHDR, allowedVideoRanges } = getVideoSelectionOptions(\n currentVideoRange,\n videoPreference,\n );\n\n for (let i = codecSets.length; i--; ) {\n const tier = codecTiers[codecSets[i]];\n hasStereo = tier.channels[2] > 0;\n minHeight = Math.min(minHeight, tier.minHeight);\n minFramerate = Math.min(minFramerate, tier.minFramerate);\n minBitrate = Math.min(minBitrate, tier.minBitrate);\n const matchingVideoRanges = allowedVideoRanges.filter(\n (range) => tier.videoRanges[range] > 0,\n );\n if (matchingVideoRanges.length > 0) {\n hasCurrentVideoRange = true;\n videoRanges = matchingVideoRanges;\n }\n }\n minHeight = Number.isFinite(minHeight) ? minHeight : 0;\n minFramerate = Number.isFinite(minFramerate) ? minFramerate : 0;\n const maxHeight = Math.max(1080, minHeight);\n const maxFramerate = Math.max(30, minFramerate);\n minBitrate = Number.isFinite(minBitrate) ? minBitrate : currentBw;\n currentBw = Math.max(minBitrate, currentBw);\n // If there are no variants with matching preference, set currentVideoRange to undefined\n if (!hasCurrentVideoRange) {\n currentVideoRange = undefined;\n videoRanges = [];\n }\n const codecSet = codecSets.reduce(\n (selected: string | undefined, candidate: string) => {\n // Remove candiates which do not meet bitrate, default audio, stereo or channels preference, 1080p or lower, 30fps or lower, or SDR/HDR selection if present\n const candidateTier = codecTiers[candidate];\n if (candidate === selected) {\n return selected;\n }\n if (candidateTier.minBitrate > currentBw) {\n logStartCodecCandidateIgnored(\n candidate,\n `min bitrate of ${candidateTier.minBitrate} > current estimate of ${currentBw}`,\n );\n return selected;\n }\n if (!candidateTier.hasDefaultAudio) {\n logStartCodecCandidateIgnored(\n candidate,\n `no renditions with default or auto-select sound found`,\n );\n return selected;\n }\n if (\n audioCodecPreference &&\n candidate.indexOf(audioCodecPreference.substring(0, 4)) % 5 !== 0\n ) {\n logStartCodecCandidateIgnored(\n candidate,\n `audio codec preference \"${audioCodecPreference}\" not found`,\n );\n return selected;\n }\n if (channelsPreference && !preferStereo) {\n if (!candidateTier.channels[channelsPreference]) {\n logStartCodecCandidateIgnored(\n candidate,\n `no renditions with ${channelsPreference} channel sound found (channels options: ${Object.keys(\n candidateTier.channels,\n )})`,\n );\n return selected;\n }\n } else if (\n (!audioCodecPreference || preferStereo) &&\n hasStereo &&\n candidateTier.channels['2'] === 0\n ) {\n logStartCodecCandidateIgnored(\n candidate,\n `no renditions with stereo sound found`,\n );\n return selected;\n }\n if (candidateTier.minHeight > maxHeight) {\n logStartCodecCandidateIgnored(\n candidate,\n `min resolution of ${candidateTier.minHeight} > maximum of ${maxHeight}`,\n );\n return selected;\n }\n if (candidateTier.minFramerate > maxFramerate) {\n logStartCodecCandidateIgnored(\n candidate,\n `min framerate of ${candidateTier.minFramerate} > maximum of ${maxFramerate}`,\n );\n return selected;\n }\n if (!videoRanges.some((range) => candidateTier.videoRanges[range] > 0)) {\n logStartCodecCandidateIgnored(\n candidate,\n `no variants with VIDEO-RANGE of ${JSON.stringify(\n videoRanges,\n )} found`,\n );\n return selected;\n }\n if (candidateTier.maxScore < selectedScore) {\n logStartCodecCandidateIgnored(\n candidate,\n `max score of ${candidateTier.maxScore} < selected max of ${selectedScore}`,\n );\n return selected;\n }\n // Remove candiates with less preferred codecs or more errors\n if (\n selected &&\n (codecsSetSelectionPreferenceValue(candidate) >=\n codecsSetSelectionPreferenceValue(selected) ||\n candidateTier.fragmentError > codecTiers[selected].fragmentError)\n ) {\n return selected;\n }\n selectedScore = candidateTier.maxScore;\n return candidate;\n },\n undefined,\n );\n return {\n codecSet,\n videoRanges,\n preferHDR,\n minFramerate,\n minBitrate,\n };\n}\n\nfunction logStartCodecCandidateIgnored(codeSet: string, reason: string) {\n logger.log(\n `[abr] start candidates with \"${codeSet}\" ignored because ${reason}`,\n );\n}\n\nexport type AudioTracksByGroup = {\n hasDefaultAudio: boolean;\n hasAutoSelectAudio: boolean;\n groups: Record<string, AudioTrackGroup>;\n};\n\nexport function getAudioTracksByGroup(allAudioTracks: MediaPlaylist[]) {\n return allAudioTracks.reduce(\n (audioTracksByGroup: AudioTracksByGroup, track) => {\n let trackGroup = audioTracksByGroup.groups[track.groupId];\n if (!trackGroup) {\n trackGroup = audioTracksByGroup.groups[track.groupId] = {\n tracks: [],\n channels: { 2: 0 },\n hasDefault: false,\n hasAutoSelect: false,\n };\n }\n trackGroup.tracks.push(track);\n const channelsKey = track.channels || '2';\n trackGroup.channels[channelsKey] =\n (trackGroup.channels[channelsKey] || 0) + 1;\n trackGroup.hasDefault = trackGroup.hasDefault || track.default;\n trackGroup.hasAutoSelect = trackGroup.hasAutoSelect || track.autoselect;\n if (trackGroup.hasDefault) {\n audioTracksByGroup.hasDefaultAudio = true;\n }\n if (trackGroup.hasAutoSelect) {\n audioTracksByGroup.hasAutoSelectAudio = true;\n }\n return audioTracksByGroup;\n },\n {\n hasDefaultAudio: false,\n hasAutoSelectAudio: false,\n groups: {},\n },\n );\n}\n\nexport function getCodecTiers(\n levels: Level[],\n audioTracksByGroup: AudioTracksByGroup,\n minAutoLevel: number,\n maxAutoLevel: number,\n): Record<string, CodecSetTier> {\n return levels\n .slice(minAutoLevel, maxAutoLevel + 1)\n .reduce((tiers: Record<string, CodecSetTier>, level) => {\n if (!level.codecSet) {\n return tiers;\n }\n const audioGroups = level.audioGroups;\n let tier = tiers[level.codecSet];\n if (!tier) {\n tiers[level.codecSet] = tier = {\n minBitrate: Infinity,\n minHeight: Infinity,\n minFramerate: Infinity,\n maxScore: 0,\n videoRanges: { SDR: 0 },\n channels: { '2': 0 },\n hasDefaultAudio: !audioGroups,\n fragmentError: 0,\n };\n }\n tier.minBitrate = Math.min(tier.minBitrate, level.bitrate);\n const lesserWidthOrHeight = Math.min(level.height, level.width);\n tier.minHeight = Math.min(tier.minHeight, lesserWidthOrHeight);\n tier.minFramerate = Math.min(tier.minFramerate, level.frameRate);\n tier.maxScore = Math.max(tier.maxScore, level.score);\n tier.fragmentError += level.fragmentError;\n tier.videoRanges[level.videoRange] =\n (tier.videoRanges[level.videoRange] || 0) + 1;\n if (__USE_ALT_AUDIO__ && audioGroups) {\n audioGroups.forEach((audioGroupId) => {\n if (!audioGroupId) {\n return;\n }\n const audioGroup = audioTracksByGroup.groups[audioGroupId];\n if (!audioGroup) {\n return;\n }\n // Default audio is any group with DEFAULT=YES, or if missing then any group with AUTOSELECT=YES, or all variants\n tier.hasDefaultAudio =\n tier.hasDefaultAudio || audioTracksByGroup.hasDefaultAudio\n ? audioGroup.hasDefault\n : audioGroup.hasAutoSelect ||\n (!audioTracksByGroup.hasDefaultAudio &&\n !audioTracksByGroup.hasAutoSelectAudio);\n Object.keys(audioGroup.channels).forEach((channels) => {\n tier.channels[channels] =\n (tier.channels[channels] || 0) + audioGroup.channels[channels];\n });\n });\n }\n return tiers;\n }, {});\n}\n\nexport function findMatchingOption(\n option: MediaPlaylist | AudioSelectionOption | SubtitleSelectionOption,\n tracks: MediaPlaylist[],\n matchPredicate?: (\n option: MediaPlaylist | AudioSelectionOption | SubtitleSelectionOption,\n track: MediaPlaylist,\n ) => boolean,\n): number {\n if ('attrs' in option) {\n const index = tracks.indexOf(option);\n if (index !== -1) {\n return index;\n }\n }\n for (let i = 0; i < tracks.length; i++) {\n const track = tracks[i];\n if (matchesOption(option, track, matchPredicate)) {\n return i;\n }\n }\n return -1;\n}\n\nexport function matchesOption(\n option: MediaPlaylist | AudioSelectionOption | SubtitleSelectionOption,\n track: MediaPlaylist,\n matchPredicate?: (\n option: MediaPlaylist | AudioSelectionOption | SubtitleSelectionOption,\n track: MediaPlaylist,\n ) => boolean,\n): boolean {\n const { groupId, name, lang, assocLang, default: isDefault } = option;\n const forced = (option as SubtitleSelectionOption).forced;\n return (\n (groupId === undefined || track.groupId === groupId) &&\n (name === undefined || track.name === name) &&\n (lang === undefined || track.lang === lang) &&\n (lang === undefined || track.assocLang === assocLang) &&\n (isDefault === undefined || track.default === isDefault) &&\n (forced === undefined || track.forced === forced) &&\n (!('characteristics' in option) ||\n characteristicsMatch(\n option.characteristics || '',\n track.characteristics,\n )) &&\n (matchPredicate === undefined || matchPredicate(option, track))\n );\n}\n\nfunction characteristicsMatch(\n characteristicsA: string,\n characteristicsB: string = '',\n): boolean {\n const arrA = characteristicsA.split(',');\n const arrB = characteristicsB.split(',');\n // Expects each item to be unique:\n return (\n arrA.length === arrB.length && !arrA.some((el) => arrB.indexOf(el) === -1)\n );\n}\n\nexport function audioMatchPredicate(\n option: MediaPlaylist | AudioSelectionOption,\n track: MediaPlaylist,\n) {\n const { audioCodec, channels } = option;\n return (\n (audioCodec === undefined ||\n (track.audioCodec || '').substring(0, 4) ===\n audioCodec.substring(0, 4)) &&\n (channels === undefined || channels === (track.channels || '2'))\n );\n}\n\nexport function findClosestLevelWithAudioGroup(\n option: MediaPlaylist | AudioSelectionOption,\n levels: Level[],\n allAudioTracks: MediaPlaylist[],\n searchIndex: number,\n matchPredicate: (\n option: MediaPlaylist | AudioSelectionOption,\n track: MediaPlaylist,\n ) => boolean,\n): number {\n const currentLevel = levels[searchIndex];\n // Are there variants with same URI as current level?\n // If so, find a match that does not require any level URI change\n const variants = levels.reduce(\n (variantMap: { [uri: string]: number[] }, level, index) => {\n const uri = level.uri;\n const renditions = variantMap[uri] || (variantMap[uri] = []);\n renditions.push(index);\n return variantMap;\n },\n {},\n );\n const renditions = variants[currentLevel.uri];\n if (renditions.length > 1) {\n searchIndex = Math.max.apply(Math, renditions);\n }\n // Find best match\n const currentVideoRange = currentLevel.videoRange;\n const currentFrameRate = currentLevel.frameRate;\n const currentVideoCodec = currentLevel.codecSet.substring(0, 4);\n const matchingVideo = searchDownAndUpList(\n levels,\n searchIndex,\n (level: Level) => {\n if (\n level.videoRange !== currentVideoRange ||\n level.frameRate !== currentFrameRate ||\n level.codecSet.substring(0, 4) !== currentVideoCodec\n ) {\n return false;\n }\n const audioGroups = level.audioGroups;\n const tracks = allAudioTracks.filter(\n (track): boolean =>\n !audioGroups || audioGroups.indexOf(track.groupId) !== -1,\n );\n return findMatchingOption(option, tracks, matchPredicate) > -1;\n },\n );\n if (matchingVideo > -1) {\n return matchingVideo;\n }\n return searchDownAndUpList(levels, searchIndex, (level: Level) => {\n const audioGroups = level.audioGroups;\n const tracks = allAudioTracks.filter(\n (track): boolean =>\n !audioGroups || audioGroups.indexOf(track.groupId) !== -1,\n );\n return findMatchingOption(option, tracks, matchPredicate) > -1;\n });\n}\n\nfunction searchDownAndUpList(\n arr: any[],\n searchIndex: number,\n predicate: (item: any) => boolean,\n): number {\n for (let i = searchIndex; i > -1; i--) {\n if (predicate(arr[i])) {\n return i;\n }\n }\n for (let i = searchIndex + 1; i < arr.length; i++) {\n if (predicate(arr[i])) {\n return i;\n }\n }\n return -1;\n}\n","import EwmaBandWidthEstimator from '../utils/ewma-bandwidth-estimator';\nimport { Events } from '../events';\nimport { ErrorDetails } from '../errors';\nimport { PlaylistLevelType } from '../types/loader';\nimport { logger } from '../utils/logger';\nimport {\n SUPPORTED_INFO_DEFAULT,\n getMediaDecodingInfoPromise,\n requiresMediaCapabilitiesDecodingInfo,\n} from '../utils/mediacapabilities-helper';\nimport {\n getAudioTracksByGroup,\n getCodecTiers,\n getStartCodecTier,\n type AudioTracksByGroup,\n type CodecSetTier,\n} from '../utils/rendition-helper';\nimport type { Fragment } from '../loader/fragment';\nimport type { Part } from '../loader/fragment';\nimport type { Level, VideoRange } from '../types/level';\nimport type { LoaderStats } from '../types/loader';\nimport type Hls from '../hls';\nimport type {\n FragLoadingData,\n FragLoadedData,\n FragBufferedData,\n LevelLoadedData,\n LevelSwitchingData,\n ManifestLoadingData,\n ErrorData,\n} from '../types/events';\nimport type { AbrComponentAPI } from '../types/component-api';\n\nclass AbrController implements AbrComponentAPI {\n protected hls: Hls;\n private lastLevelLoadSec: number = 0;\n private lastLoadedFragLevel: number = -1;\n private firstSelection: number = -1;\n private _nextAutoLevel: number = -1;\n private nextAutoLevelKey: string = '';\n private audioTracksByGroup: AudioTracksByGroup | null = null;\n private codecTiers: Record<string, CodecSetTier> | null = null;\n private timer: number = -1;\n private fragCurrent: Fragment | null = null;\n private partCurrent: Part | null = null;\n private bitrateTestDelay: number = 0;\n\n public bwEstimator: EwmaBandWidthEstimator;\n\n constructor(hls: Hls) {\n this.hls = hls;\n this.bwEstimator = this.initEstimator();\n this.registerListeners();\n }\n\n public resetEstimator(abrEwmaDefaultEstimate?: number) {\n if (abrEwmaDefaultEstimate) {\n logger.log(`setting initial bwe to ${abrEwmaDefaultEstimate}`);\n this.hls.config.abrEwmaDefaultEstimate = abrEwmaDefaultEstimate;\n }\n this.firstSelection = -1;\n this.bwEstimator = this.initEstimator();\n }\n\n private initEstimator(): EwmaBandWidthEstimator {\n const config = this.hls.config;\n return new EwmaBandWidthEstimator(\n config.abrEwmaSlowVoD,\n config.abrEwmaFastVoD,\n config.abrEwmaDefaultEstimate,\n );\n }\n\n protected registerListeners() {\n const { hls } = this;\n hls.on(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n hls.on(Events.FRAG_LOADING, this.onFragLoading, this);\n hls.on(Events.FRAG_LOADED, this.onFragLoaded, this);\n hls.on(Events.FRAG_BUFFERED, this.onFragBuffered, this);\n hls.on(Events.LEVEL_SWITCHING, this.onLevelSwitching, this);\n hls.on(Events.LEVEL_LOADED, this.onLevelLoaded, this);\n hls.on(Events.LEVELS_UPDATED, this.onLevelsUpdated, this);\n hls.on(Events.MAX_AUTO_LEVEL_UPDATED, this.onMaxAutoLevelUpdated, this);\n hls.on(Events.ERROR, this.onError, this);\n }\n\n protected unregisterListeners() {\n const { hls } = this;\n if (!hls) {\n return;\n }\n hls.off(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n hls.off(Events.FRAG_LOADING, this.onFragLoading, this);\n hls.off(Events.FRAG_LOADED, this.onFragLoaded, this);\n hls.off(Events.FRAG_BUFFERED, this.onFragBuffered, this);\n hls.off(Events.LEVEL_SWITCHING, this.onLevelSwitching, this);\n hls.off(Events.LEVEL_LOADED, this.onLevelLoaded, this);\n hls.off(Events.LEVELS_UPDATED, this.onLevelsUpdated, this);\n hls.off(Events.MAX_AUTO_LEVEL_UPDATED, this.onMaxAutoLevelUpdated, this);\n hls.off(Events.ERROR, this.onError, this);\n }\n\n public destroy() {\n this.unregisterListeners();\n this.clearTimer();\n // @ts-ignore\n this.hls = this._abandonRulesCheck = null;\n this.fragCurrent = this.partCurrent = null;\n }\n\n protected onManifestLoading(\n event: Events.MANIFEST_LOADING,\n data: ManifestLoadingData,\n ) {\n this.lastLoadedFragLevel = -1;\n this.firstSelection = -1;\n this.lastLevelLoadSec = 0;\n this.fragCurrent = this.partCurrent = null;\n this.onLevelsUpdated();\n this.clearTimer();\n }\n\n private onLevelsUpdated() {\n if (this.lastLoadedFragLevel > -1 && this.fragCurrent) {\n this.lastLoadedFragLevel = this.fragCurrent.level;\n }\n this._nextAutoLevel = -1;\n this.onMaxAutoLevelUpdated();\n this.codecTiers = null;\n this.audioTracksByGroup = null;\n }\n\n private onMaxAutoLevelUpdated() {\n this.firstSelection = -1;\n this.nextAutoLevelKey = '';\n }\n\n protected onFragLoading(event: Events.FRAG_LOADING, data: FragLoadingData) {\n const frag = data.frag;\n if (this.ignoreFragment(frag)) {\n return;\n }\n if (!frag.bitrateTest) {\n this.fragCurrent = frag;\n this.partCurrent = data.part ?? null;\n }\n this.clearTimer();\n this.timer = self.setInterval(this._abandonRulesCheck, 100);\n }\n\n protected onLevelSwitching(\n event: Events.LEVEL_SWITCHING,\n data: LevelSwitchingData,\n ): void {\n this.clearTimer();\n }\n\n protected onError(event: Events.ERROR, data: ErrorData) {\n if (data.fatal) {\n return;\n }\n switch (data.details) {\n case ErrorDetails.BUFFER_ADD_CODEC_ERROR:\n case ErrorDetails.BUFFER_APPEND_ERROR:\n // Reset last loaded level so that a new selection can be made after calling recoverMediaError\n this.lastLoadedFragLevel = -1;\n this.firstSelection = -1;\n break;\n case ErrorDetails.FRAG_LOAD_TIMEOUT: {\n const frag = data.frag;\n const { fragCurrent, partCurrent: part } = this;\n if (\n frag &&\n fragCurrent &&\n frag.sn === fragCurrent.sn &&\n frag.level === fragCurrent.level\n ) {\n const now = performance.now();\n const stats: LoaderStats = part ? part.stats : frag.stats;\n const timeLoading = now - stats.loading.start;\n const ttfb = stats.loading.first\n ? stats.loading.first - stats.loading.start\n : -1;\n const loadedFirstByte = stats.loaded && ttfb > -1;\n if (loadedFirstByte) {\n const ttfbEstimate = this.bwEstimator.getEstimateTTFB();\n this.bwEstimator.sample(\n timeLoading - Math.min(ttfbEstimate, ttfb),\n stats.loaded,\n );\n } else {\n this.bwEstimator.sampleTTFB(timeLoading);\n }\n }\n break;\n }\n }\n }\n\n private getTimeToLoadFrag(\n timeToFirstByteSec: number,\n bandwidth: number,\n fragSizeBits: number,\n isSwitch: boolean,\n ): number {\n const fragLoadSec = timeToFirstByteSec + fragSizeBits / bandwidth;\n const playlistLoadSec = isSwitch ? this.lastLevelLoadSec : 0;\n return fragLoadSec + playlistLoadSec;\n }\n\n protected onLevelLoaded(event: Events.LEVEL_LOADED, data: LevelLoadedData) {\n const config = this.hls.config;\n const { loading } = data.stats;\n const timeLoadingMs = loading.end - loading.start;\n if (Number.isFinite(timeLoadingMs)) {\n this.lastLevelLoadSec = timeLoadingMs / 1000;\n }\n if (data.details.live) {\n this.bwEstimator.update(config.abrEwmaSlowLive, config.abrEwmaFastLive);\n } else {\n this.bwEstimator.update(config.abrEwmaSlowVoD, config.abrEwmaFastVoD);\n }\n }\n\n /*\n This method monitors the download rate of the current fragment, and will downswitch if that fragment will not load\n quickly enough to prevent underbuffering\n */\n private _abandonRulesCheck = () => {\n const { fragCurrent: frag, partCurrent: part, hls } = this;\n const { autoLevelEnabled, media } = hls;\n if (!frag || !media) {\n return;\n }\n\n const now = performance.now();\n const stats: LoaderStats = part ? part.stats : frag.stats;\n const duration = part ? part.duration : frag.duration;\n const timeLoading = now - stats.loading.start;\n const minAutoLevel = hls.minAutoLevel;\n // If frag loading is aborted, complete, or from lowest level, stop timer and return\n if (\n stats.aborted ||\n (stats.loaded && stats.loaded === stats.total) ||\n frag.level <= minAutoLevel\n ) {\n this.clearTimer();\n // reset forced auto level value so that next level will be selected\n this._nextAutoLevel = -1;\n return;\n }\n\n // This check only runs if we're in ABR mode and actually playing\n if (\n !autoLevelEnabled ||\n media.paused ||\n !media.playbackRate ||\n !media.readyState\n ) {\n return;\n }\n\n const bufferInfo = hls.mainForwardBufferInfo;\n if (bufferInfo === null) {\n return;\n }\n\n const ttfbEstimate = this.bwEstimator.getEstimateTTFB();\n const playbackRate = Math.abs(media.playbackRate);\n // To maintain stable adaptive playback, only begin monitoring frag loading after half or more of its playback duration has passed\n if (\n timeLoading <=\n Math.max(ttfbEstimate, 1000 * (duration / (playbackRate * 2)))\n ) {\n return;\n }\n\n // bufferStarvationDelay is an estimate of the amount time (in seconds) it will take to exhaust the buffer\n const bufferStarvationDelay = bufferInfo.len / playbackRate;\n const ttfb = stats.loading.first\n ? stats.loading.first - stats.loading.start\n : -1;\n const loadedFirstByte = stats.loaded && ttfb > -1;\n const bwEstimate: number = this.getBwEstimate();\n const levels = hls.levels;\n const level = levels[frag.level];\n const expectedLen =\n stats.total ||\n Math.max(stats.loaded, Math.round((duration * level.averageBitrate) / 8));\n let timeStreaming = loadedFirstByte ? timeLoading - ttfb : timeLoading;\n if (timeStreaming < 1 && loadedFirstByte) {\n timeStreaming = Math.min(timeLoading, (stats.loaded * 8) / bwEstimate);\n }\n const loadRate = loadedFirstByte\n ? (stats.loaded * 1000) / timeStreaming\n : 0;\n // fragLoadDelay is an estimate of the time (in seconds) it will take to buffer the remainder of the fragment\n const fragLoadedDelay = loadRate\n ? (expectedLen - stats.loaded) / loadRate\n : (expectedLen * 8) / bwEstimate + ttfbEstimate / 1000;\n // Only downswitch if the time to finish loading the current fragment is greater than the amount of buffer left\n if (fragLoadedDelay <= bufferStarvationDelay) {\n return;\n }\n\n const bwe = loadRate ? loadRate * 8 : bwEstimate;\n let fragLevelNextLoadedDelay: number = Number.POSITIVE_INFINITY;\n let nextLoadLevel: number;\n // Iterate through lower level and try to find the largest one that avoids rebuffering\n for (\n nextLoadLevel = frag.level - 1;\n nextLoadLevel > minAutoLevel;\n nextLoadLevel--\n ) {\n // compute time to load next fragment at lower level\n // 8 = bits per byte (bps/Bps)\n const levelNextBitrate = levels[nextLoadLevel].maxBitrate;\n fragLevelNextLoadedDelay = this.getTimeToLoadFrag(\n ttfbEstimate / 1000,\n bwe,\n duration * levelNextBitrate,\n !levels[nextLoadLevel].details,\n );\n if (fragLevelNextLoadedDelay < bufferStarvationDelay) {\n break;\n }\n }\n // Only emergency switch down if it takes less time to load a new fragment at lowest level instead of continuing\n // to load the current one\n if (fragLevelNextLoadedDelay >= fragLoadedDelay) {\n return;\n }\n\n // if estimated load time of new segment is completely unreasonable, ignore and do not emergency switch down\n if (fragLevelNextLoadedDelay > duration * 10) {\n return;\n }\n hls.nextLoadLevel = hls.nextAutoLevel = nextLoadLevel;\n if (loadedFirstByte) {\n // If there has been loading progress, sample bandwidth using loading time offset by minimum TTFB time\n this.bwEstimator.sample(\n timeLoading - Math.min(ttfbEstimate, ttfb),\n stats.loaded,\n );\n } else {\n // If there has been no loading progress, sample TTFB\n this.bwEstimator.sampleTTFB(timeLoading);\n }\n const nextLoadLevelBitrate = levels[nextLoadLevel].maxBitrate;\n if (\n this.getBwEstimate() * this.hls.config.abrBandWidthUpFactor >\n nextLoadLevelBitrate\n ) {\n this.resetEstimator(nextLoadLevelBitrate);\n }\n\n this.clearTimer();\n logger.warn(`[abr] Fragment ${frag.sn}${\n part ? ' part ' + part.index : ''\n } of level ${frag.level} is loading too slowly;\n Time to underbuffer: ${bufferStarvationDelay.toFixed(3)} s\n Estimated load time for current fragment: ${fragLoadedDelay.toFixed(3)} s\n Estimated load time for down switch fragment: ${fragLevelNextLoadedDelay.toFixed(\n 3,\n )} s\n TTFB estimate: ${ttfb | 0} ms\n Current BW estimate: ${\n Number.isFinite(bwEstimate) ? bwEstimate | 0 : 'Unknown'\n } bps\n New BW estimate: ${this.getBwEstimate() | 0} bps\n Switching to level ${nextLoadLevel} @ ${nextLoadLevelBitrate | 0} bps`);\n hls.trigger(Events.FRAG_LOAD_EMERGENCY_ABORTED, { frag, part, stats });\n };\n\n protected onFragLoaded(\n event: Events.FRAG_LOADED,\n { frag, part }: FragLoadedData,\n ) {\n const stats = part ? part.stats : frag.stats;\n if (frag.type === PlaylistLevelType.MAIN) {\n this.bwEstimator.sampleTTFB(stats.loading.first - stats.loading.start);\n }\n if (this.ignoreFragment(frag)) {\n return;\n }\n // stop monitoring bw once frag loaded\n this.clearTimer();\n // reset forced auto level value so that next level will be selected\n if (frag.level === this._nextAutoLevel) {\n this._nextAutoLevel = -1;\n }\n this.firstSelection = -1;\n\n // compute level average bitrate\n if (this.hls.config.abrMaxWithRealBitrate) {\n const duration = part ? part.duration : frag.duration;\n const level = this.hls.levels[frag.level];\n const loadedBytes =\n (level.loaded ? level.loaded.bytes : 0) + stats.loaded;\n const loadedDuration =\n (level.loaded ? level.loaded.duration : 0) + duration;\n level.loaded = { bytes: loadedBytes, duration: loadedDuration };\n level.realBitrate = Math.round((8 * loadedBytes) / loadedDuration);\n }\n if (frag.bitrateTest) {\n const fragBufferedData: FragBufferedData = {\n stats,\n frag,\n part,\n id: frag.type,\n };\n this.onFragBuffered(Events.FRAG_BUFFERED, fragBufferedData);\n frag.bitrateTest = false;\n } else {\n // store level id after successful fragment load for playback\n this.lastLoadedFragLevel = frag.level;\n }\n }\n\n protected onFragBuffered(\n event: Events.FRAG_BUFFERED,\n data: FragBufferedData,\n ) {\n const { frag, part } = data;\n const stats = part?.stats.loaded ? part.stats : frag.stats;\n\n if (stats.aborted) {\n return;\n }\n if (this.ignoreFragment(frag)) {\n return;\n }\n // Use the difference between parsing and request instead of buffering and request to compute fragLoadingProcessing;\n // rationale is that buffer appending only happens once media is attached. This can happen when config.startFragPrefetch\n // is used. If we used buffering in that case, our BW estimate sample will be very large.\n const processingMs =\n stats.parsing.end -\n stats.loading.start -\n Math.min(\n stats.loading.first - stats.loading.start,\n this.bwEstimator.getEstimateTTFB(),\n );\n this.bwEstimator.sample(processingMs, stats.loaded);\n stats.bwEstimate = this.getBwEstimate();\n if (frag.bitrateTest) {\n this.bitrateTestDelay = processingMs / 1000;\n } else {\n this.bitrateTestDelay = 0;\n }\n }\n\n private ignoreFragment(frag: Fragment): boolean {\n // Only count non-alt-audio frags which were actually buffered in our BW calculations\n return frag.type !== PlaylistLevelType.MAIN || frag.sn === 'initSegment';\n }\n\n public clearTimer() {\n if (this.timer > -1) {\n self.clearInterval(this.timer);\n this.timer = -1;\n }\n }\n\n public get firstAutoLevel(): number {\n const { maxAutoLevel, minAutoLevel } = this.hls;\n const bwEstimate = this.getBwEstimate();\n const maxStartDelay = this.hls.config.maxStarvationDelay;\n const abrAutoLevel = this.findBestLevel(\n bwEstimate,\n minAutoLevel,\n maxAutoLevel,\n 0,\n maxStartDelay,\n 1,\n 1,\n );\n if (abrAutoLevel > -1) {\n return abrAutoLevel;\n }\n const firstLevel = this.hls.firstLevel;\n const clamped = Math.min(Math.max(firstLevel, minAutoLevel), maxAutoLevel);\n logger.warn(\n `[abr] Could not find best starting auto level. Defaulting to first in playlist ${firstLevel} clamped to ${clamped}`,\n );\n return clamped;\n }\n\n public get forcedAutoLevel(): number {\n if (this.nextAutoLevelKey) {\n return -1;\n }\n return this._nextAutoLevel;\n }\n\n // return next auto level\n public get nextAutoLevel(): number {\n const forcedAutoLevel = this.forcedAutoLevel;\n const bwEstimator = this.bwEstimator;\n const useEstimate = bwEstimator.canEstimate();\n const loadedFirstFrag = this.lastLoadedFragLevel > -1;\n // in case next auto level has been forced, and bw not available or not reliable, return forced value\n if (\n forcedAutoLevel !== -1 &&\n (!useEstimate ||\n !loadedFirstFrag ||\n this.nextAutoLevelKey === this.getAutoLevelKey())\n ) {\n return forcedAutoLevel;\n }\n\n // compute next level using ABR logic\n const nextABRAutoLevel =\n useEstimate && loadedFirstFrag\n ? this.getNextABRAutoLevel()\n : this.firstAutoLevel;\n\n // use forced auto level while it hasn't errored more than ABR selection\n if (forcedAutoLevel !== -1) {\n const levels = this.hls.levels;\n if (\n levels.length > Math.max(forcedAutoLevel, nextABRAutoLevel) &&\n levels[forcedAutoLevel].loadError <= levels[nextABRAutoLevel].loadError\n ) {\n return forcedAutoLevel;\n }\n }\n\n // save result until state has changed\n this._nextAutoLevel = nextABRAutoLevel;\n this.nextAutoLevelKey = this.getAutoLevelKey();\n\n return nextABRAutoLevel;\n }\n\n private getAutoLevelKey(): string {\n return `${this.getBwEstimate()}_${this.getStarvationDelay().toFixed(2)}`;\n }\n\n private getNextABRAutoLevel(): number {\n const { fragCurrent, partCurrent, hls } = this;\n const { maxAutoLevel, config, minAutoLevel } = hls;\n const currentFragDuration = partCurrent\n ? partCurrent.duration\n : fragCurrent\n ? fragCurrent.duration\n : 0;\n const avgbw = this.getBwEstimate();\n // bufferStarvationDelay is the wall-clock time left until the playback buffer is exhausted.\n const bufferStarvationDelay = this.getStarvationDelay();\n\n let bwFactor = config.abrBandWidthFactor;\n let bwUpFactor = config.abrBandWidthUpFactor;\n\n // First, look to see if we can find a level matching with our avg bandwidth AND that could also guarantee no rebuffering at all\n if (bufferStarvationDelay) {\n const bestLevel = this.findBestLevel(\n avgbw,\n minAutoLevel,\n maxAutoLevel,\n bufferStarvationDelay,\n 0,\n bwFactor,\n bwUpFactor,\n );\n if (bestLevel >= 0) {\n return bestLevel;\n }\n }\n // not possible to get rid of rebuffering... try to find level that will guarantee less than maxStarvationDelay of rebuffering\n let maxStarvationDelay = currentFragDuration\n ? Math.min(currentFragDuration, config.maxStarvationDelay)\n : config.maxStarvationDelay;\n\n if (!bufferStarvationDelay) {\n // in case buffer is empty, let's check if previous fragment was loaded to perform a bitrate test\n const bitrateTestDelay = this.bitrateTestDelay;\n if (bitrateTestDelay) {\n // if it is the case, then we need to adjust our max starvation delay using maxLoadingDelay config value\n // max video loading delay used in automatic start level selection :\n // in that mode ABR controller will ensure that video loading time (ie the time to fetch the first fragment at lowest quality level +\n // the time to fetch the fragment at the appropriate quality level is less than ```maxLoadingDelay``` )\n // cap maxLoadingDelay and ensure it is not bigger 'than bitrate test' frag duration\n const maxLoadingDelay = currentFragDuration\n ? Math.min(currentFragDuration, config.maxLoadingDelay)\n : config.maxLoadingDelay;\n maxStarvationDelay = maxLoadingDelay - bitrateTestDelay;\n logger.info(\n `[abr] bitrate test took ${Math.round(\n 1000 * bitrateTestDelay,\n )}ms, set first fragment max fetchDuration to ${Math.round(\n 1000 * maxStarvationDelay,\n )} ms`,\n );\n // don't use conservative factor on bitrate test\n bwFactor = bwUpFactor = 1;\n }\n }\n const bestLevel = this.findBestLevel(\n avgbw,\n minAutoLevel,\n maxAutoLevel,\n bufferStarvationDelay,\n maxStarvationDelay,\n bwFactor,\n bwUpFactor,\n );\n logger.info(\n `[abr] ${\n bufferStarvationDelay ? 'rebuffering expected' : 'buffer is empty'\n }, optimal quality level ${bestLevel}`,\n );\n if (bestLevel > -1) {\n return bestLevel;\n }\n // If no matching level found, see if min auto level would be a better option\n const minLevel = hls.levels[minAutoLevel];\n const autoLevel = hls.levels[hls.loadLevel];\n if (minLevel?.bitrate < autoLevel?.bitrate) {\n return minAutoLevel;\n }\n // or if bitrate is not lower, continue to use loadLevel\n return hls.loadLevel;\n }\n\n private getStarvationDelay(): number {\n const hls = this.hls;\n const media = hls.media;\n if (!media) {\n return Infinity;\n }\n // playbackRate is the absolute value of the playback rate; if media.playbackRate is 0, we use 1 to load as\n // if we're playing back at the normal rate.\n const playbackRate =\n media && media.playbackRate !== 0 ? Math.abs(media.playbackRate) : 1.0;\n const bufferInfo = hls.mainForwardBufferInfo;\n return (bufferInfo ? bufferInfo.len : 0) / playbackRate;\n }\n\n private getBwEstimate(): number {\n return this.bwEstimator.canEstimate()\n ? this.bwEstimator.getEstimate()\n : this.hls.config.abrEwmaDefaultEstimate;\n }\n\n private findBestLevel(\n currentBw: number,\n minAutoLevel: number,\n maxAutoLevel: number,\n bufferStarvationDelay: number,\n maxStarvationDelay: number,\n bwFactor: number,\n bwUpFactor: number,\n ): number {\n const maxFetchDuration: number = bufferStarvationDelay + maxStarvationDelay;\n const lastLoadedFragLevel = this.lastLoadedFragLevel;\n const selectionBaseLevel =\n lastLoadedFragLevel === -1 ? this.hls.firstLevel : lastLoadedFragLevel;\n const { fragCurrent, partCurrent } = this;\n const { levels, allAudioTracks, loadLevel, config } = this.hls;\n if (levels.length === 1) {\n return 0;\n }\n const level: Level | undefined = levels[selectionBaseLevel];\n const live = !!level?.details?.live;\n const firstSelection = loadLevel === -1 || lastLoadedFragLevel === -1;\n let currentCodecSet: string | undefined;\n let currentVideoRange: VideoRange | undefined = 'SDR';\n let currentFrameRate = level?.frameRate || 0;\n\n const { audioPreference, videoPreference } = config;\n const audioTracksByGroup =\n this.audioTracksByGroup ||\n (this.audioTracksByGroup = getAudioTracksByGroup(allAudioTracks));\n if (firstSelection) {\n if (this.firstSelection !== -1) {\n return this.firstSelection;\n }\n const codecTiers =\n this.codecTiers ||\n (this.codecTiers = getCodecTiers(\n levels,\n audioTracksByGroup,\n minAutoLevel,\n maxAutoLevel,\n ));\n const startTier = getStartCodecTier(\n codecTiers,\n currentVideoRange,\n currentBw,\n audioPreference,\n videoPreference,\n );\n const { codecSet, videoRanges, minFramerate, minBitrate, preferHDR } =\n startTier;\n currentCodecSet = codecSet;\n currentVideoRange = preferHDR\n ? videoRanges[videoRanges.length - 1]\n : videoRanges[0];\n currentFrameRate = minFramerate;\n currentBw = Math.max(currentBw, minBitrate);\n logger.log(`[abr] picked start tier ${JSON.stringify(startTier)}`);\n } else {\n currentCodecSet = level?.codecSet;\n currentVideoRange = level?.videoRange;\n }\n\n const currentFragDuration = partCurrent\n ? partCurrent.duration\n : fragCurrent\n ? fragCurrent.duration\n : 0;\n\n const ttfbEstimateSec = this.bwEstimator.getEstimateTTFB() / 1000;\n const levelsSkipped: number[] = [];\n for (let i = maxAutoLevel; i >= minAutoLevel; i--) {\n const levelInfo = levels[i];\n const upSwitch = i > selectionBaseLevel;\n if (!levelInfo) {\n continue;\n }\n if (\n __USE_MEDIA_CAPABILITIES__ &&\n config.useMediaCapabilities &&\n !levelInfo.supportedResult &&\n !levelInfo.supportedPromise\n ) {\n const mediaCapabilities = navigator.mediaCapabilities as\n | MediaCapabilities\n | undefined;\n if (\n typeof mediaCapabilities?.decodingInfo === 'function' &&\n requiresMediaCapabilitiesDecodingInfo(\n levelInfo,\n audioTracksByGroup,\n currentVideoRange,\n currentFrameRate,\n currentBw,\n audioPreference,\n )\n ) {\n levelInfo.supportedPromise = getMediaDecodingInfoPromise(\n levelInfo,\n audioTracksByGroup,\n mediaCapabilities,\n );\n levelInfo.supportedPromise.then((decodingInfo) => {\n if (!this.hls) {\n return;\n }\n levelInfo.supportedResult = decodingInfo;\n const levels = this.hls.levels;\n const index = levels.indexOf(levelInfo);\n if (decodingInfo.error) {\n logger.warn(\n `[abr] MediaCapabilities decodingInfo error: \"${\n decodingInfo.error\n }\" for level ${index} ${JSON.stringify(decodingInfo)}`,\n );\n } else if (!decodingInfo.supported) {\n logger.warn(\n `[abr] Unsupported MediaCapabilities decodingInfo result for level ${index} ${JSON.stringify(\n decodingInfo,\n )}`,\n );\n if (index > -1 && levels.length > 1) {\n logger.log(`[abr] Removing unsupported level ${index}`);\n this.hls.removeLevel(index);\n }\n }\n });\n } else {\n levelInfo.supportedResult = SUPPORTED_INFO_DEFAULT;\n }\n }\n\n // skip candidates which change codec-family or video-range,\n // and which decrease or increase frame-rate for up and down-switch respectfully\n if (\n (currentCodecSet && levelInfo.codecSet !== currentCodecSet) ||\n (currentVideoRange && levelInfo.videoRange !== currentVideoRange) ||\n (upSwitch && currentFrameRate > levelInfo.frameRate) ||\n (!upSwitch &&\n currentFrameRate > 0 &&\n currentFrameRate < levelInfo.frameRate) ||\n (levelInfo.supportedResult &&\n !levelInfo.supportedResult.decodingInfoResults?.[0].smooth)\n ) {\n levelsSkipped.push(i);\n continue;\n }\n\n const levelDetails = levelInfo.details;\n const avgDuration =\n (partCurrent\n ? levelDetails?.partTarget\n : levelDetails?.averagetargetduration) || currentFragDuration;\n\n let adjustedbw: number;\n // follow algorithm captured from stagefright :\n // https://android.googlesource.com/platform/frameworks/av/+/master/media/libstagefright/httplive/LiveSession.cpp\n // Pick the highest bandwidth stream below or equal to estimated bandwidth.\n // consider only 80% of the available bandwidth, but if we are switching up,\n // be even more conservative (70%) to avoid overestimating and immediately\n // switching back.\n if (!upSwitch) {\n adjustedbw = bwFactor * currentBw;\n } else {\n adjustedbw = bwUpFactor * currentBw;\n }\n\n // Use average bitrate when starvation delay (buffer length) is gt or eq two segment durations and rebuffering is not expected (maxStarvationDelay > 0)\n const bitrate: number =\n currentFragDuration &&\n bufferStarvationDelay >= currentFragDuration * 2 &&\n maxStarvationDelay === 0\n ? levels[i].averageBitrate\n : levels[i].maxBitrate;\n const fetchDuration: number = this.getTimeToLoadFrag(\n ttfbEstimateSec,\n adjustedbw,\n bitrate * avgDuration,\n levelDetails === undefined,\n );\n\n const canSwitchWithinTolerance =\n // if adjusted bw is greater than level bitrate AND\n adjustedbw >= bitrate &&\n // no level change, or new level has no error history\n (i === lastLoadedFragLevel ||\n (levelInfo.loadError === 0 && levelInfo.fragmentError === 0)) &&\n // fragment fetchDuration unknown OR live stream OR fragment fetchDuration less than max allowed fetch duration, then this level matches\n // we don't account for max Fetch Duration for live streams, this is to avoid switching down when near the edge of live sliding window ...\n // special case to support startLevel = -1 (bitrateTest) on live streams : in that case we should not exit loop so that findBestLevel will return -1\n (fetchDuration <= ttfbEstimateSec ||\n !Number.isFinite(fetchDuration) ||\n (live && !this.bitrateTestDelay) ||\n fetchDuration < maxFetchDuration);\n if (canSwitchWithinTolerance) {\n const forcedAutoLevel = this.forcedAutoLevel;\n if (\n i !== loadLevel &&\n (forcedAutoLevel === -1 || forcedAutoLevel !== loadLevel)\n ) {\n if (levelsSkipped.length) {\n logger.trace(\n `[abr] Skipped level(s) ${levelsSkipped.join(\n ',',\n )} of ${maxAutoLevel} max with CODECS and VIDEO-RANGE:\"${\n levels[levelsSkipped[0]].codecs\n }\" ${levels[levelsSkipped[0]].videoRange}; not compatible with \"${\n level.codecs\n }\" ${currentVideoRange}`,\n );\n }\n logger.info(\n `[abr] switch candidate:${selectionBaseLevel}->${i} adjustedbw(${Math.round(\n adjustedbw,\n )})-bitrate=${Math.round(\n adjustedbw - bitrate,\n )} ttfb:${ttfbEstimateSec.toFixed(\n 1,\n )} avgDuration:${avgDuration.toFixed(\n 1,\n )} maxFetchDuration:${maxFetchDuration.toFixed(\n 1,\n )} fetchDuration:${fetchDuration.toFixed(\n 1,\n )} firstSelection:${firstSelection} codecSet:${currentCodecSet} videoRange:${currentVideoRange} hls.loadLevel:${loadLevel}`,\n );\n }\n if (firstSelection) {\n this.firstSelection = i;\n }\n // as we are looping from highest to lowest, this will return the best achievable quality level\n return i;\n }\n }\n // not enough time budget even with quality level 0 ... rebuffering might happen\n return -1;\n }\n\n public set nextAutoLevel(nextLevel: number) {\n const { maxAutoLevel, minAutoLevel } = this.hls;\n const value = Math.min(Math.max(nextLevel, minAutoLevel), maxAutoLevel);\n if (this._nextAutoLevel !== value) {\n this.nextAutoLevelKey = '';\n this._nextAutoLevel = value;\n }\n }\n}\n\nexport default AbrController;\n","import { type VideoRange, VideoRangeValues } from '../types/level';\nimport type { VideoSelectionOption } from '../types/media-playlist';\n\n/**\n * @returns Whether we can detect and validate HDR capability within the window context\n */\nexport function isHdrSupported() {\n if (typeof matchMedia === 'function') {\n const mediaQueryList = matchMedia('(dynamic-range: high)');\n const badQuery = matchMedia('bad query');\n if (mediaQueryList.media !== badQuery.media) {\n return mediaQueryList.matches === true;\n }\n }\n return false;\n}\n\n/**\n * Sanitizes inputs to return the active video selection options for HDR/SDR.\n * When both inputs are null:\n *\n * `{ preferHDR: false, allowedVideoRanges: [] }`\n *\n * When `currentVideoRange` non-null, maintain the active range:\n *\n * `{ preferHDR: currentVideoRange !== 'SDR', allowedVideoRanges: [currentVideoRange] }`\n *\n * When VideoSelectionOption non-null:\n *\n * - Allow all video ranges if `allowedVideoRanges` unspecified.\n * - If `preferHDR` is non-null use the value to filter `allowedVideoRanges`.\n * - Else check window for HDR support and set `preferHDR` to the result.\n *\n * @param currentVideoRange\n * @param videoPreference\n */\nexport function getVideoSelectionOptions(\n currentVideoRange: VideoRange | undefined,\n videoPreference: VideoSelectionOption | undefined,\n) {\n let preferHDR = false;\n let allowedVideoRanges: Array<VideoRange> = [];\n\n if (currentVideoRange) {\n preferHDR = currentVideoRange !== 'SDR';\n allowedVideoRanges = [currentVideoRange];\n }\n\n if (videoPreference) {\n allowedVideoRanges =\n videoPreference.allowedVideoRanges || VideoRangeValues.slice(0);\n preferHDR =\n videoPreference.preferHDR !== undefined\n ? videoPreference.preferHDR\n : isHdrSupported();\n\n if (preferHDR) {\n allowedVideoRanges = allowedVideoRanges.filter(\n (range: VideoRange) => range !== 'SDR',\n );\n } else {\n allowedVideoRanges = ['SDR'];\n }\n }\n\n return {\n preferHDR,\n allowedVideoRanges,\n };\n}\n","/**\n * @ignore\n * Sub-class specialization of EventHandler base class.\n *\n * TaskLoop allows to schedule a task function being called (optionnaly repeatedly) on the main loop,\n * scheduled asynchroneously, avoiding recursive calls in the same tick.\n *\n * The task itself is implemented in `doTick`. It can be requested and called for single execution\n * using the `tick` method.\n *\n * It will be assured that the task execution method (`tick`) only gets called once per main loop \"tick\",\n * no matter how often it gets requested for execution. Execution in further ticks will be scheduled accordingly.\n *\n * If further execution requests have already been scheduled on the next tick, it can be checked with `hasNextTick`,\n * and cancelled with `clearNextTick`.\n *\n * The task can be scheduled as an interval repeatedly with a period as parameter (see `setInterval`, `clearInterval`).\n *\n * Sub-classes need to implement the `doTick` method which will effectively have the task execution routine.\n *\n * Further explanations:\n *\n * The baseclass has a `tick` method that will schedule the doTick call. It may be called synchroneously\n * only for a stack-depth of one. On re-entrant calls, sub-sequent calls are scheduled for next main loop ticks.\n *\n * When the task execution (`tick` method) is called in re-entrant way this is detected and\n * we are limiting the task execution per call stack to exactly one, but scheduling/post-poning further\n * task processing on the next main loop iteration (also known as \"next tick\" in the Node/JS runtime lingo).\n */\nexport default class TaskLoop {\n private readonly _boundTick: () => void;\n private _tickTimer: number | null = null;\n private _tickInterval: number | null = null;\n private _tickCallCount = 0;\n\n constructor() {\n this._boundTick = this.tick.bind(this);\n }\n\n public destroy() {\n this.onHandlerDestroying();\n this.onHandlerDestroyed();\n }\n\n protected onHandlerDestroying() {\n // clear all timers before unregistering from event bus\n this.clearNextTick();\n this.clearInterval();\n }\n\n protected onHandlerDestroyed() {}\n\n public hasInterval(): boolean {\n return !!this._tickInterval;\n }\n\n public hasNextTick(): boolean {\n return !!this._tickTimer;\n }\n\n /**\n * @param millis - Interval time (ms)\n * @eturns True when interval has been scheduled, false when already scheduled (no effect)\n */\n public setInterval(millis: number): boolean {\n if (!this._tickInterval) {\n this._tickCallCount = 0;\n this._tickInterval = self.setInterval(this._boundTick, millis);\n return true;\n }\n return false;\n }\n\n /**\n * @returns True when interval was cleared, false when none was set (no effect)\n */\n public clearInterval(): boolean {\n if (this._tickInterval) {\n self.clearInterval(this._tickInterval);\n this._tickInterval = null;\n return true;\n }\n return false;\n }\n\n /**\n * @returns True when timeout was cleared, false when none was set (no effect)\n */\n public clearNextTick(): boolean {\n if (this._tickTimer) {\n self.clearTimeout(this._tickTimer);\n this._tickTimer = null;\n return true;\n }\n return false;\n }\n\n /**\n * Will call the subclass doTick implementation in this main loop tick\n * or in the next one (via setTimeout(,0)) in case it has already been called\n * in this tick (in case this is a re-entrant call).\n */\n public tick(): void {\n this._tickCallCount++;\n if (this._tickCallCount === 1) {\n this.doTick();\n // re-entrant call to tick from previous doTick call stack\n // -> schedule a call on the next main loop iteration to process this task processing request\n if (this._tickCallCount > 1) {\n // make sure only one timer exists at any time at max\n this.tickImmediate();\n }\n this._tickCallCount = 0;\n }\n }\n\n public tickImmediate(): void {\n this.clearNextTick();\n this._tickTimer = self.setTimeout(this._boundTick, 0);\n }\n\n /**\n * For subclass to implement task logic\n * @abstract\n */\n protected doTick(): void {}\n}\n","import { Events } from '../events';\nimport { Fragment, Part } from '../loader/fragment';\nimport { PlaylistLevelType } from '../types/loader';\nimport type { SourceBufferName } from '../types/buffer';\nimport type {\n FragmentBufferedRange,\n FragmentEntity,\n FragmentTimeRange,\n} from '../types/fragment-tracker';\nimport type { ComponentAPI } from '../types/component-api';\nimport type {\n BufferAppendedData,\n FragBufferedData,\n FragLoadedData,\n} from '../types/events';\nimport type Hls from '../hls';\n\nexport const enum FragmentState {\n NOT_LOADED = 'NOT_LOADED',\n APPENDING = 'APPENDING',\n PARTIAL = 'PARTIAL',\n OK = 'OK',\n}\n\nexport class FragmentTracker implements ComponentAPI {\n private activePartLists: { [key in PlaylistLevelType]?: Part[] } =\n Object.create(null);\n private endListFragments: { [key in PlaylistLevelType]?: FragmentEntity } =\n Object.create(null);\n private fragments: Partial<Record<string, FragmentEntity>> =\n Object.create(null);\n private timeRanges:\n | {\n [key in SourceBufferName]?: TimeRanges;\n }\n | null = Object.create(null);\n\n private bufferPadding: number = 0.2;\n private hls: Hls;\n private hasGaps: boolean = false;\n\n constructor(hls: Hls) {\n this.hls = hls;\n\n this._registerListeners();\n }\n\n private _registerListeners() {\n const { hls } = this;\n hls.on(Events.BUFFER_APPENDED, this.onBufferAppended, this);\n hls.on(Events.FRAG_BUFFERED, this.onFragBuffered, this);\n hls.on(Events.FRAG_LOADED, this.onFragLoaded, this);\n }\n\n private _unregisterListeners() {\n const { hls } = this;\n hls.off(Events.BUFFER_APPENDED, this.onBufferAppended, this);\n hls.off(Events.FRAG_BUFFERED, this.onFragBuffered, this);\n hls.off(Events.FRAG_LOADED, this.onFragLoaded, this);\n }\n\n public destroy() {\n this._unregisterListeners();\n // @ts-ignore\n this.fragments =\n // @ts-ignore\n this.activePartLists =\n // @ts-ignore\n this.endListFragments =\n this.timeRanges =\n null;\n }\n\n /**\n * Return a Fragment or Part with an appended range that matches the position and levelType\n * Otherwise, return null\n */\n public getAppendedFrag(\n position: number,\n levelType: PlaylistLevelType,\n ): Fragment | Part | null {\n const activeParts = this.activePartLists[levelType];\n if (activeParts) {\n for (let i = activeParts.length; i--; ) {\n const activePart = activeParts[i];\n if (!activePart) {\n break;\n }\n const appendedPTS = activePart.end;\n if (\n activePart.start <= position &&\n appendedPTS !== null &&\n position <= appendedPTS\n ) {\n return activePart;\n }\n }\n }\n return this.getBufferedFrag(position, levelType);\n }\n\n /**\n * Return a buffered Fragment that matches the position and levelType.\n * A buffered Fragment is one whose loading, parsing and appending is done (completed or \"partial\" meaning aborted).\n * If not found any Fragment, return null\n */\n public getBufferedFrag(\n position: number,\n levelType: PlaylistLevelType,\n ): Fragment | null {\n const { fragments } = this;\n const keys = Object.keys(fragments);\n for (let i = keys.length; i--; ) {\n const fragmentEntity = fragments[keys[i]];\n if (fragmentEntity?.body.type === levelType && fragmentEntity.buffered) {\n const frag = fragmentEntity.body;\n if (frag.start <= position && position <= frag.end) {\n return frag;\n }\n }\n }\n return null;\n }\n\n /**\n * Partial fragments effected by coded frame eviction will be removed\n * The browser will unload parts of the buffer to free up memory for new buffer data\n * Fragments will need to be reloaded when the buffer is freed up, removing partial fragments will allow them to reload(since there might be parts that are still playable)\n */\n public detectEvictedFragments(\n elementaryStream: SourceBufferName,\n timeRange: TimeRanges,\n playlistType: PlaylistLevelType,\n appendedPart?: Part | null,\n ) {\n if (this.timeRanges) {\n this.timeRanges[elementaryStream] = timeRange;\n }\n // Check if any flagged fragments have been unloaded\n // excluding anything newer than appendedPartSn\n const appendedPartSn = (appendedPart?.fragment.sn || -1) as number;\n Object.keys(this.fragments).forEach((key) => {\n const fragmentEntity = this.fragments[key];\n if (!fragmentEntity) {\n return;\n }\n if (appendedPartSn >= (fragmentEntity.body.sn as number)) {\n return;\n }\n if (!fragmentEntity.buffered && !fragmentEntity.loaded) {\n if (fragmentEntity.body.type === playlistType) {\n this.removeFragment(fragmentEntity.body);\n }\n return;\n }\n const esData = fragmentEntity.range[elementaryStream];\n if (!esData) {\n return;\n }\n esData.time.some((time: FragmentTimeRange) => {\n const isNotBuffered = !this.isTimeBuffered(\n time.startPTS,\n time.endPTS,\n timeRange,\n );\n if (isNotBuffered) {\n // Unregister partial fragment as it needs to load again to be reused\n this.removeFragment(fragmentEntity.body);\n }\n return isNotBuffered;\n });\n });\n }\n\n /**\n * Checks if the fragment passed in is loaded in the buffer properly\n * Partially loaded fragments will be registered as a partial fragment\n */\n public detectPartialFragments(data: FragBufferedData) {\n const timeRanges = this.timeRanges;\n const { frag, part } = data;\n if (!timeRanges || frag.sn === 'initSegment') {\n return;\n }\n\n const fragKey = getFragmentKey(frag);\n const fragmentEntity = this.fragments[fragKey];\n if (!fragmentEntity || (fragmentEntity.buffered && frag.gap)) {\n return;\n }\n const isFragHint = !frag.relurl;\n Object.keys(timeRanges).forEach((elementaryStream: SourceBufferName) => {\n const streamInfo = frag.elementaryStreams[elementaryStream];\n if (!streamInfo) {\n return;\n }\n const timeRange = timeRanges[elementaryStream] as TimeRanges;\n const partial = isFragHint || streamInfo.partial === true;\n fragmentEntity.range[elementaryStream] = this.getBufferedTimes(\n frag,\n part,\n partial,\n timeRange,\n );\n });\n fragmentEntity.loaded = null;\n if (Object.keys(fragmentEntity.range).length) {\n fragmentEntity.buffered = true;\n const endList = (fragmentEntity.body.endList =\n frag.endList || fragmentEntity.body.endList);\n if (endList) {\n this.endListFragments[fragmentEntity.body.type] = fragmentEntity;\n }\n if (!isPartial(fragmentEntity)) {\n // Remove older fragment parts from lookup after frag is tracked as buffered\n this.removeParts((frag.sn as number) - 1, frag.type);\n }\n } else {\n // remove fragment if nothing was appended\n this.removeFragment(fragmentEntity.body);\n }\n }\n\n private removeParts(snToKeep: number, levelType: PlaylistLevelType) {\n const activeParts = this.activePartLists[levelType];\n if (!activeParts) {\n return;\n }\n this.activePartLists[levelType] = activeParts.filter(\n (part) => (part.fragment.sn as number) >= snToKeep,\n );\n }\n\n public fragBuffered(frag: Fragment, force?: true) {\n const fragKey = getFragmentKey(frag);\n let fragmentEntity = this.fragments[fragKey];\n if (!fragmentEntity && force) {\n fragmentEntity = this.fragments[fragKey] = {\n body: frag,\n appendedPTS: null,\n loaded: null,\n buffered: false,\n range: Object.create(null),\n };\n if (frag.gap) {\n this.hasGaps = true;\n }\n }\n if (fragmentEntity) {\n fragmentEntity.loaded = null;\n fragmentEntity.buffered = true;\n }\n }\n\n private getBufferedTimes(\n fragment: Fragment,\n part: Part | null,\n partial: boolean,\n timeRange: TimeRanges,\n ): FragmentBufferedRange {\n const buffered: FragmentBufferedRange = {\n time: [],\n partial,\n };\n const startPTS = fragment.start;\n const endPTS = fragment.end;\n const minEndPTS = fragment.minEndPTS || endPTS;\n const maxStartPTS = fragment.maxStartPTS || startPTS;\n for (let i = 0; i < timeRange.length; i++) {\n const startTime = timeRange.start(i) - this.bufferPadding;\n const endTime = timeRange.end(i) + this.bufferPadding;\n if (maxStartPTS >= startTime && minEndPTS <= endTime) {\n // Fragment is entirely contained in buffer\n // No need to check the other timeRange times since it's completely playable\n buffered.time.push({\n startPTS: Math.max(startPTS, timeRange.start(i)),\n endPTS: Math.min(endPTS, timeRange.end(i)),\n });\n break;\n } else if (startPTS < endTime && endPTS > startTime) {\n const start = Math.max(startPTS, timeRange.start(i));\n const end = Math.min(endPTS, timeRange.end(i));\n if (end > start) {\n buffered.partial = true;\n // Check for intersection with buffer\n // Get playable sections of the fragment\n buffered.time.push({\n startPTS: start,\n endPTS: end,\n });\n }\n } else if (endPTS <= startTime) {\n // No need to check the rest of the timeRange as it is in order\n break;\n }\n }\n return buffered;\n }\n\n /**\n * Gets the partial fragment for a certain time\n */\n public getPartialFragment(time: number): Fragment | null {\n let bestFragment: Fragment | null = null;\n let timePadding: number;\n let startTime: number;\n let endTime: number;\n let bestOverlap: number = 0;\n const { bufferPadding, fragments } = this;\n Object.keys(fragments).forEach((key) => {\n const fragmentEntity = fragments[key];\n if (!fragmentEntity) {\n return;\n }\n if (isPartial(fragmentEntity)) {\n startTime = fragmentEntity.body.start - bufferPadding;\n endTime = fragmentEntity.body.end + bufferPadding;\n if (time >= startTime && time <= endTime) {\n // Use the fragment that has the most padding from start and end time\n timePadding = Math.min(time - startTime, endTime - time);\n if (bestOverlap <= timePadding) {\n bestFragment = fragmentEntity.body;\n bestOverlap = timePadding;\n }\n }\n }\n });\n return bestFragment;\n }\n\n public isEndListAppended(type: PlaylistLevelType): boolean {\n const lastFragmentEntity = this.endListFragments[type];\n return (\n lastFragmentEntity !== undefined &&\n (lastFragmentEntity.buffered || isPartial(lastFragmentEntity))\n );\n }\n\n public getState(fragment: Fragment): FragmentState {\n const fragKey = getFragmentKey(fragment);\n const fragmentEntity = this.fragments[fragKey];\n\n if (fragmentEntity) {\n if (!fragmentEntity.buffered) {\n return FragmentState.APPENDING;\n } else if (isPartial(fragmentEntity)) {\n return FragmentState.PARTIAL;\n } else {\n return FragmentState.OK;\n }\n }\n\n return FragmentState.NOT_LOADED;\n }\n\n private isTimeBuffered(\n startPTS: number,\n endPTS: number,\n timeRange: TimeRanges,\n ): boolean {\n let startTime;\n let endTime;\n for (let i = 0; i < timeRange.length; i++) {\n startTime = timeRange.start(i) - this.bufferPadding;\n endTime = timeRange.end(i) + this.bufferPadding;\n if (startPTS >= startTime && endPTS <= endTime) {\n return true;\n }\n\n if (endPTS <= startTime) {\n // No need to check the rest of the timeRange as it is in order\n return false;\n }\n }\n\n return false;\n }\n\n private onFragLoaded(event: Events.FRAG_LOADED, data: FragLoadedData) {\n const { frag, part } = data;\n // don't track initsegment (for which sn is not a number)\n // don't track frags used for bitrateTest, they're irrelevant.\n if (frag.sn === 'initSegment' || frag.bitrateTest) {\n return;\n }\n\n // Fragment entity `loaded` FragLoadedData is null when loading parts\n const loaded = part ? null : data;\n\n const fragKey = getFragmentKey(frag);\n this.fragments[fragKey] = {\n body: frag,\n appendedPTS: null,\n loaded,\n buffered: false,\n range: Object.create(null),\n };\n }\n\n private onBufferAppended(\n event: Events.BUFFER_APPENDED,\n data: BufferAppendedData,\n ) {\n const { frag, part, timeRanges } = data;\n if (frag.sn === 'initSegment') {\n return;\n }\n const playlistType = frag.type;\n if (part) {\n let activeParts = this.activePartLists[playlistType];\n if (!activeParts) {\n this.activePartLists[playlistType] = activeParts = [];\n }\n activeParts.push(part);\n }\n // Store the latest timeRanges loaded in the buffer\n this.timeRanges = timeRanges;\n Object.keys(timeRanges).forEach((elementaryStream: SourceBufferName) => {\n const timeRange = timeRanges[elementaryStream] as TimeRanges;\n this.detectEvictedFragments(\n elementaryStream,\n timeRange,\n playlistType,\n part,\n );\n });\n }\n\n private onFragBuffered(event: Events.FRAG_BUFFERED, data: FragBufferedData) {\n this.detectPartialFragments(data);\n }\n\n private hasFragment(fragment: Fragment): boolean {\n const fragKey = getFragmentKey(fragment);\n return !!this.fragments[fragKey];\n }\n\n public hasParts(type: PlaylistLevelType): boolean {\n return !!this.activePartLists[type]?.length;\n }\n\n public removeFragmentsInRange(\n start: number,\n end: number,\n playlistType: PlaylistLevelType,\n withGapOnly?: boolean,\n unbufferedOnly?: boolean,\n ) {\n if (withGapOnly && !this.hasGaps) {\n return;\n }\n Object.keys(this.fragments).forEach((key) => {\n const fragmentEntity = this.fragments[key];\n if (!fragmentEntity) {\n return;\n }\n const frag = fragmentEntity.body;\n if (frag.type !== playlistType || (withGapOnly && !frag.gap)) {\n return;\n }\n if (\n frag.start < end &&\n frag.end > start &&\n (fragmentEntity.buffered || unbufferedOnly)\n ) {\n this.removeFragment(frag);\n }\n });\n }\n\n public removeFragment(fragment: Fragment) {\n const fragKey = getFragmentKey(fragment);\n fragment.stats.loaded = 0;\n fragment.clearElementaryStreamInfo();\n const activeParts = this.activePartLists[fragment.type];\n if (activeParts) {\n const snToRemove = fragment.sn;\n this.activePartLists[fragment.type] = activeParts.filter(\n (part) => part.fragment.sn !== snToRemove,\n );\n }\n delete this.fragments[fragKey];\n if (fragment.endList) {\n delete this.endListFragments[fragment.type];\n }\n }\n\n public removeAllFragments() {\n this.fragments = Object.create(null);\n this.endListFragments = Object.create(null);\n this.activePartLists = Object.create(null);\n this.hasGaps = false;\n }\n}\n\nfunction isPartial(fragmentEntity: FragmentEntity): boolean {\n return (\n fragmentEntity.buffered &&\n (fragmentEntity.body.gap ||\n fragmentEntity.range.video?.partial ||\n fragmentEntity.range.audio?.partial ||\n fragmentEntity.range.audiovideo?.partial)\n );\n}\n\nfunction getFragmentKey(fragment: Fragment): string {\n return `${fragment.type}_${fragment.level}_${fragment.sn}`;\n}\n","/**\n * Provides methods dealing with buffer length retrieval for example.\n *\n * In general, a helper around HTML5 MediaElement TimeRanges gathered from `buffered` property.\n *\n * Also @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/buffered\n */\n\nimport { logger } from './logger';\n\ntype BufferTimeRange = {\n start: number;\n end: number;\n};\n\nexport type Bufferable = {\n buffered: TimeRanges;\n};\n\nexport type BufferInfo = {\n len: number;\n start: number;\n end: number;\n nextStart?: number;\n};\n\nconst noopBuffered: TimeRanges = {\n length: 0,\n start: () => 0,\n end: () => 0,\n};\n\nexport class BufferHelper {\n /**\n * Return true if `media`'s buffered include `position`\n */\n static isBuffered(media: Bufferable, position: number): boolean {\n try {\n if (media) {\n const buffered = BufferHelper.getBuffered(media);\n for (let i = 0; i < buffered.length; i++) {\n if (position >= buffered.start(i) && position <= buffered.end(i)) {\n return true;\n }\n }\n }\n } catch (error) {\n // this is to catch\n // InvalidStateError: Failed to read the 'buffered' property from 'SourceBuffer':\n // This SourceBuffer has been removed from the parent media source\n }\n return false;\n }\n\n static bufferInfo(\n media: Bufferable | null,\n pos: number,\n maxHoleDuration: number,\n ): BufferInfo {\n try {\n if (media) {\n const vbuffered = BufferHelper.getBuffered(media);\n const buffered: BufferTimeRange[] = [];\n let i: number;\n for (i = 0; i < vbuffered.length; i++) {\n buffered.push({ start: vbuffered.start(i), end: vbuffered.end(i) });\n }\n\n return this.bufferedInfo(buffered, pos, maxHoleDuration);\n }\n } catch (error) {\n // this is to catch\n // InvalidStateError: Failed to read the 'buffered' property from 'SourceBuffer':\n // This SourceBuffer has been removed from the parent media source\n }\n return { len: 0, start: pos, end: pos, nextStart: undefined };\n }\n\n static bufferedInfo(\n buffered: BufferTimeRange[],\n pos: number,\n maxHoleDuration: number,\n ): {\n len: number;\n start: number;\n end: number;\n nextStart?: number;\n } {\n pos = Math.max(0, pos);\n // sort on buffer.start/smaller end (IE does not always return sorted buffered range)\n buffered.sort(function (a, b) {\n const diff = a.start - b.start;\n if (diff) {\n return diff;\n } else {\n return b.end - a.end;\n }\n });\n\n let buffered2: BufferTimeRange[] = [];\n if (maxHoleDuration) {\n // there might be some small holes between buffer time range\n // consider that holes smaller than maxHoleDuration are irrelevant and build another\n // buffer time range representations that discards those holes\n for (let i = 0; i < buffered.length; i++) {\n const buf2len = buffered2.length;\n if (buf2len) {\n const buf2end = buffered2[buf2len - 1].end;\n // if small hole (value between 0 or maxHoleDuration ) or overlapping (negative)\n if (buffered[i].start - buf2end < maxHoleDuration) {\n // merge overlapping time ranges\n // update lastRange.end only if smaller than item.end\n // e.g. [ 1, 15] with [ 2,8] => [ 1,15] (no need to modify lastRange.end)\n // whereas [ 1, 8] with [ 2,15] => [ 1,15] ( lastRange should switch from [1,8] to [1,15])\n if (buffered[i].end > buf2end) {\n buffered2[buf2len - 1].end = buffered[i].end;\n }\n } else {\n // big hole\n buffered2.push(buffered[i]);\n }\n } else {\n // first value\n buffered2.push(buffered[i]);\n }\n }\n } else {\n buffered2 = buffered;\n }\n\n let bufferLen = 0;\n\n // bufferStartNext can possibly be undefined based on the conditional logic below\n let bufferStartNext: number | undefined;\n\n // bufferStart and bufferEnd are buffer boundaries around current video position\n let bufferStart: number = pos;\n let bufferEnd: number = pos;\n for (let i = 0; i < buffered2.length; i++) {\n const start = buffered2[i].start;\n const end = buffered2[i].end;\n // logger.log('buf start/end:' + buffered.start(i) + '/' + buffered.end(i));\n if (pos + maxHoleDuration >= start && pos < end) {\n // play position is inside this buffer TimeRange, retrieve end of buffer position and buffer length\n bufferStart = start;\n bufferEnd = end;\n bufferLen = bufferEnd - pos;\n } else if (pos + maxHoleDuration < start) {\n bufferStartNext = start;\n break;\n }\n }\n return {\n len: bufferLen,\n start: bufferStart || 0,\n end: bufferEnd || 0,\n nextStart: bufferStartNext,\n };\n }\n\n /**\n * Safe method to get buffered property.\n * SourceBuffer.buffered may throw if SourceBuffer is removed from it's MediaSource\n */\n static getBuffered(media: Bufferable): TimeRanges {\n try {\n return media.buffered;\n } catch (e) {\n logger.log('failed to get media.buffered', e);\n return noopBuffered;\n }\n }\n}\n","import type { RemuxerResult } from './remuxer';\nimport type { HlsChunkPerformanceTiming } from './loader';\nimport type { SourceBufferName } from './buffer';\n\nexport interface TransmuxerResult {\n remuxResult: RemuxerResult;\n chunkMeta: ChunkMetadata;\n}\n\nexport class ChunkMetadata {\n public readonly level: number;\n public readonly sn: number;\n public readonly part: number;\n public readonly id: number;\n public readonly size: number;\n public readonly partial: boolean;\n public readonly transmuxing: HlsChunkPerformanceTiming =\n getNewPerformanceTiming();\n public readonly buffering: {\n [key in SourceBufferName]: HlsChunkPerformanceTiming;\n } = {\n audio: getNewPerformanceTiming(),\n video: getNewPerformanceTiming(),\n audiovideo: getNewPerformanceTiming(),\n };\n\n constructor(\n level: number,\n sn: number,\n id: number,\n size = 0,\n part = -1,\n partial = false,\n ) {\n this.level = level;\n this.sn = sn;\n this.id = id;\n this.size = size;\n this.part = part;\n this.partial = partial;\n }\n}\n\nfunction getNewPerformanceTiming(): HlsChunkPerformanceTiming {\n return { start: 0, executeStart: 0, executeEnd: 0, end: 0 };\n}\n","import { logger } from './logger';\nimport { adjustSliding } from './level-helper';\n\nimport type { Fragment } from '../loader/fragment';\nimport type { LevelDetails } from '../loader/level-details';\n\nexport function findFirstFragWithCC(\n fragments: Fragment[],\n cc: number,\n): Fragment | null {\n for (let i = 0, len = fragments.length; i < len; i++) {\n if (fragments[i]?.cc === cc) {\n return fragments[i];\n }\n }\n return null;\n}\n\nexport function shouldAlignOnDiscontinuities(\n lastFrag: Fragment | null,\n switchDetails: LevelDetails | undefined,\n details: LevelDetails,\n): switchDetails is LevelDetails & boolean {\n if (switchDetails) {\n if (\n details.endCC > details.startCC ||\n (lastFrag && lastFrag.cc < details.startCC)\n ) {\n return true;\n }\n }\n return false;\n}\n\n// Find the first frag in the previous level which matches the CC of the first frag of the new level\nexport function findDiscontinuousReferenceFrag(\n prevDetails: LevelDetails,\n curDetails: LevelDetails,\n) {\n const prevFrags = prevDetails.fragments;\n const curFrags = curDetails.fragments;\n\n if (!curFrags.length || !prevFrags.length) {\n logger.log('No fragments to align');\n return;\n }\n\n const prevStartFrag = findFirstFragWithCC(prevFrags, curFrags[0].cc);\n\n if (!prevStartFrag || (prevStartFrag && !prevStartFrag.startPTS)) {\n logger.log('No frag in previous level to align on');\n return;\n }\n\n return prevStartFrag;\n}\n\nfunction adjustFragmentStart(frag: Fragment, sliding: number) {\n if (frag) {\n const start = frag.start + sliding;\n frag.start = frag.startPTS = start;\n frag.endPTS = start + frag.duration;\n }\n}\n\nexport function adjustSlidingStart(sliding: number, details: LevelDetails) {\n // Update segments\n const fragments = details.fragments;\n for (let i = 0, len = fragments.length; i < len; i++) {\n adjustFragmentStart(fragments[i], sliding);\n }\n // Update LL-HLS parts at the end of the playlist\n if (details.fragmentHint) {\n adjustFragmentStart(details.fragmentHint, sliding);\n }\n details.alignedSliding = true;\n}\n\n/**\n * Using the parameters of the last level, this function computes PTS' of the new fragments so that they form a\n * contiguous stream with the last fragments.\n * The PTS of a fragment lets Hls.js know where it fits into a stream - by knowing every PTS, we know which fragment to\n * download at any given time. PTS is normally computed when the fragment is demuxed, so taking this step saves us time\n * and an extra download.\n * @param lastFrag\n * @param lastLevel\n * @param details\n */\nexport function alignStream(\n lastFrag: Fragment | null,\n switchDetails: LevelDetails | undefined,\n details: LevelDetails,\n) {\n if (!switchDetails) {\n return;\n }\n alignDiscontinuities(lastFrag, details, switchDetails);\n if (!details.alignedSliding && switchDetails) {\n // If the PTS wasn't figured out via discontinuity sequence that means there was no CC increase within the level.\n // Aligning via Program Date Time should therefore be reliable, since PDT should be the same within the same\n // discontinuity sequence.\n alignMediaPlaylistByPDT(details, switchDetails);\n }\n if (!details.alignedSliding && switchDetails && !details.skippedSegments) {\n // Try to align on sn so that we pick a better start fragment.\n // Do not perform this on playlists with delta updates as this is only to align levels on switch\n // and adjustSliding only adjusts fragments after skippedSegments.\n adjustSliding(switchDetails, details);\n }\n}\n\n/**\n * Computes the PTS if a new level's fragments using the PTS of a fragment in the last level which shares the same\n * discontinuity sequence.\n * @param lastFrag - The last Fragment which shares the same discontinuity sequence\n * @param lastLevel - The details of the last loaded level\n * @param details - The details of the new level\n */\nfunction alignDiscontinuities(\n lastFrag: Fragment | null,\n details: LevelDetails,\n switchDetails: LevelDetails | undefined,\n) {\n if (shouldAlignOnDiscontinuities(lastFrag, switchDetails, details)) {\n const referenceFrag = findDiscontinuousReferenceFrag(\n switchDetails,\n details,\n );\n if (referenceFrag && Number.isFinite(referenceFrag.start)) {\n logger.log(\n `Adjusting PTS using last level due to CC increase within current level ${details.url}`,\n );\n adjustSlidingStart(referenceFrag.start, details);\n }\n }\n}\n\n/**\n * Ensures appropriate time-alignment between renditions based on PDT.\n * This function assumes the timelines represented in `refDetails` are accurate, including the PDTs\n * for the last discontinuity sequence number shared by both playlists when present,\n * and uses the \"wallclock\"/PDT timeline as a cross-reference to `details`, adjusting the presentation\n * times/timelines of `details` accordingly.\n * Given the asynchronous nature of fetches and initial loads of live `main` and audio/subtitle tracks,\n * the primary purpose of this function is to ensure the \"local timelines\" of audio/subtitle tracks\n * are aligned to the main/video timeline, using PDT as the cross-reference/\"anchor\" that should\n * be consistent across playlists, per the HLS spec.\n * @param details - The details of the rendition you'd like to time-align (e.g. an audio rendition).\n * @param refDetails - The details of the reference rendition with start and PDT times for alignment.\n */\nexport function alignMediaPlaylistByPDT(\n details: LevelDetails,\n refDetails: LevelDetails,\n) {\n if (!details.hasProgramDateTime || !refDetails.hasProgramDateTime) {\n return;\n }\n\n const fragments = details.fragments;\n const refFragments = refDetails.fragments;\n if (!fragments.length || !refFragments.length) {\n return;\n }\n\n // Calculate a delta to apply to all fragments according to the delta in PDT times and start times\n // of a fragment in the reference details, and a fragment in the target details of the same discontinuity.\n // If a fragment of the same discontinuity was not found use the middle fragment of both.\n let refFrag: Fragment | null | undefined;\n let frag: Fragment | null | undefined;\n const targetCC = Math.min(refDetails.endCC, details.endCC);\n if (refDetails.startCC < targetCC && details.startCC < targetCC) {\n refFrag = findFirstFragWithCC(refFragments, targetCC);\n frag = findFirstFragWithCC(fragments, targetCC);\n }\n if (!refFrag || !frag) {\n refFrag = refFragments[Math.floor(refFragments.length / 2)];\n frag =\n findFirstFragWithCC(fragments, refFrag.cc) ||\n fragments[Math.floor(fragments.length / 2)];\n }\n const refPDT = refFrag.programDateTime;\n const targetPDT = frag.programDateTime;\n if (!refPDT || !targetPDT) {\n return;\n }\n\n const delta = (targetPDT - refPDT) / 1000 - (frag.start - refFrag.start);\n adjustSlidingStart(delta, details);\n}\n","import { ErrorTypes, ErrorDetails } from '../errors';\nimport { Fragment } from './fragment';\nimport {\n Loader,\n LoaderConfiguration,\n FragmentLoaderContext,\n} from '../types/loader';\nimport { getLoaderConfigWithoutReties } from '../utils/error-helper';\nimport type { HlsConfig } from '../config';\nimport type { BaseSegment, Part } from './fragment';\nimport type {\n ErrorData,\n FragLoadedData,\n PartsLoadedData,\n} from '../types/events';\n\nconst MIN_CHUNK_SIZE = Math.pow(2, 17); // 128kb\n\nexport default class FragmentLoader {\n private readonly config: HlsConfig;\n private loader: Loader<FragmentLoaderContext> | null = null;\n private partLoadTimeout: number = -1;\n\n constructor(config: HlsConfig) {\n this.config = config;\n }\n\n destroy() {\n if (this.loader) {\n this.loader.destroy();\n this.loader = null;\n }\n }\n\n abort() {\n if (this.loader) {\n // Abort the loader for current fragment. Only one may load at any given time\n this.loader.abort();\n }\n }\n\n load(\n frag: Fragment,\n onProgress?: FragmentLoadProgressCallback,\n ): Promise<FragLoadedData> {\n const url = frag.url;\n if (!url) {\n return Promise.reject(\n new LoadError({\n type: ErrorTypes.NETWORK_ERROR,\n details: ErrorDetails.FRAG_LOAD_ERROR,\n fatal: false,\n frag,\n error: new Error(\n `Fragment does not have a ${url ? 'part list' : 'url'}`,\n ),\n networkDetails: null,\n }),\n );\n }\n this.abort();\n\n const config = this.config;\n const FragmentILoader = config.fLoader;\n const DefaultILoader = config.loader;\n\n return new Promise((resolve, reject) => {\n if (this.loader) {\n this.loader.destroy();\n }\n if (frag.gap) {\n if (frag.tagList.some((tags) => tags[0] === 'GAP')) {\n reject(createGapLoadError(frag));\n return;\n } else {\n // Reset temporary treatment as GAP tag\n frag.gap = false;\n }\n }\n const loader =\n (this.loader =\n frag.loader =\n FragmentILoader\n ? new FragmentILoader(config)\n : (new DefaultILoader(config) as Loader<FragmentLoaderContext>));\n const loaderContext = createLoaderContext(frag);\n const loadPolicy = getLoaderConfigWithoutReties(\n config.fragLoadPolicy.default,\n );\n const loaderConfig: LoaderConfiguration = {\n loadPolicy,\n timeout: loadPolicy.maxLoadTimeMs,\n maxRetry: 0,\n retryDelay: 0,\n maxRetryDelay: 0,\n highWaterMark: frag.sn === 'initSegment' ? Infinity : MIN_CHUNK_SIZE,\n };\n // Assign frag stats to the loader's stats reference\n frag.stats = loader.stats;\n loader.load(loaderContext, loaderConfig, {\n onSuccess: (response, stats, context, networkDetails) => {\n this.resetLoader(frag, loader);\n let payload = response.data as ArrayBuffer;\n if (context.resetIV && frag.decryptdata) {\n frag.decryptdata.iv = new Uint8Array(payload.slice(0, 16));\n payload = payload.slice(16);\n }\n resolve({\n frag,\n part: null,\n payload,\n networkDetails,\n });\n },\n onError: (response, context, networkDetails, stats) => {\n this.resetLoader(frag, loader);\n reject(\n new LoadError({\n type: ErrorTypes.NETWORK_ERROR,\n details: ErrorDetails.FRAG_LOAD_ERROR,\n fatal: false,\n frag,\n response: { url, data: undefined, ...response },\n error: new Error(`HTTP Error ${response.code} ${response.text}`),\n networkDetails,\n stats,\n }),\n );\n },\n onAbort: (stats, context, networkDetails) => {\n this.resetLoader(frag, loader);\n reject(\n new LoadError({\n type: ErrorTypes.NETWORK_ERROR,\n details: ErrorDetails.INTERNAL_ABORTED,\n fatal: false,\n frag,\n error: new Error('Aborted'),\n networkDetails,\n stats,\n }),\n );\n },\n onTimeout: (stats, context, networkDetails) => {\n this.resetLoader(frag, loader);\n reject(\n new LoadError({\n type: ErrorTypes.NETWORK_ERROR,\n details: ErrorDetails.FRAG_LOAD_TIMEOUT,\n fatal: false,\n frag,\n error: new Error(`Timeout after ${loaderConfig.timeout}ms`),\n networkDetails,\n stats,\n }),\n );\n },\n onProgress: (stats, context, data, networkDetails) => {\n if (onProgress) {\n onProgress({\n frag,\n part: null,\n payload: data as ArrayBuffer,\n networkDetails,\n });\n }\n },\n });\n });\n }\n\n public loadPart(\n frag: Fragment,\n part: Part,\n onProgress: FragmentLoadProgressCallback,\n ): Promise<FragLoadedData> {\n this.abort();\n\n const config = this.config;\n const FragmentILoader = config.fLoader;\n const DefaultILoader = config.loader;\n\n return new Promise((resolve, reject) => {\n if (this.loader) {\n this.loader.destroy();\n }\n if (frag.gap || part.gap) {\n reject(createGapLoadError(frag, part));\n return;\n }\n const loader =\n (this.loader =\n frag.loader =\n FragmentILoader\n ? new FragmentILoader(config)\n : (new DefaultILoader(config) as Loader<FragmentLoaderContext>));\n const loaderContext = createLoaderContext(frag, part);\n // Should we define another load policy for parts?\n const loadPolicy = getLoaderConfigWithoutReties(\n config.fragLoadPolicy.default,\n );\n const loaderConfig: LoaderConfiguration = {\n loadPolicy,\n timeout: loadPolicy.maxLoadTimeMs,\n maxRetry: 0,\n retryDelay: 0,\n maxRetryDelay: 0,\n highWaterMark: MIN_CHUNK_SIZE,\n };\n // Assign part stats to the loader's stats reference\n part.stats = loader.stats;\n loader.load(loaderContext, loaderConfig, {\n onSuccess: (response, stats, context, networkDetails) => {\n this.resetLoader(frag, loader);\n this.updateStatsFromPart(frag, part);\n const partLoadedData: FragLoadedData = {\n frag,\n part,\n payload: response.data as ArrayBuffer,\n networkDetails,\n };\n onProgress(partLoadedData);\n resolve(partLoadedData);\n },\n onError: (response, context, networkDetails, stats) => {\n this.resetLoader(frag, loader);\n reject(\n new LoadError({\n type: ErrorTypes.NETWORK_ERROR,\n details: ErrorDetails.FRAG_LOAD_ERROR,\n fatal: false,\n frag,\n part,\n response: {\n url: loaderContext.url,\n data: undefined,\n ...response,\n },\n error: new Error(`HTTP Error ${response.code} ${response.text}`),\n networkDetails,\n stats,\n }),\n );\n },\n onAbort: (stats, context, networkDetails) => {\n frag.stats.aborted = part.stats.aborted;\n this.resetLoader(frag, loader);\n reject(\n new LoadError({\n type: ErrorTypes.NETWORK_ERROR,\n details: ErrorDetails.INTERNAL_ABORTED,\n fatal: false,\n frag,\n part,\n error: new Error('Aborted'),\n networkDetails,\n stats,\n }),\n );\n },\n onTimeout: (stats, context, networkDetails) => {\n this.resetLoader(frag, loader);\n reject(\n new LoadError({\n type: ErrorTypes.NETWORK_ERROR,\n details: ErrorDetails.FRAG_LOAD_TIMEOUT,\n fatal: false,\n frag,\n part,\n error: new Error(`Timeout after ${loaderConfig.timeout}ms`),\n networkDetails,\n stats,\n }),\n );\n },\n });\n });\n }\n\n private updateStatsFromPart(frag: Fragment, part: Part) {\n const fragStats = frag.stats;\n const partStats = part.stats;\n const partTotal = partStats.total;\n fragStats.loaded += partStats.loaded;\n if (partTotal) {\n const estTotalParts = Math.round(frag.duration / part.duration);\n const estLoadedParts = Math.min(\n Math.round(fragStats.loaded / partTotal),\n estTotalParts,\n );\n const estRemainingParts = estTotalParts - estLoadedParts;\n const estRemainingBytes =\n estRemainingParts * Math.round(fragStats.loaded / estLoadedParts);\n fragStats.total = fragStats.loaded + estRemainingBytes;\n } else {\n fragStats.total = Math.max(fragStats.loaded, fragStats.total);\n }\n const fragLoading = fragStats.loading;\n const partLoading = partStats.loading;\n if (fragLoading.start) {\n // add to fragment loader latency\n fragLoading.first += partLoading.first - partLoading.start;\n } else {\n fragLoading.start = partLoading.start;\n fragLoading.first = partLoading.first;\n }\n fragLoading.end = partLoading.end;\n }\n\n private resetLoader(frag: Fragment, loader: Loader<FragmentLoaderContext>) {\n frag.loader = null;\n if (this.loader === loader) {\n self.clearTimeout(this.partLoadTimeout);\n this.loader = null;\n }\n loader.destroy();\n }\n}\n\nfunction createLoaderContext(\n frag: Fragment,\n part: Part | null = null,\n): FragmentLoaderContext {\n const segment: BaseSegment = part || frag;\n const loaderContext: FragmentLoaderContext = {\n frag,\n part,\n responseType: 'arraybuffer',\n url: segment.url,\n headers: {},\n rangeStart: 0,\n rangeEnd: 0,\n };\n const start = segment.byteRangeStartOffset as number;\n const end = segment.byteRangeEndOffset as number;\n if (Number.isFinite(start) && Number.isFinite(end)) {\n let byteRangeStart = start;\n let byteRangeEnd = end;\n if (frag.sn === 'initSegment' && frag.decryptdata?.method === 'AES-128') {\n // MAP segment encrypted with method 'AES-128', when served with HTTP Range,\n // has the unencrypted size specified in the range.\n // Ref: https://tools.ietf.org/html/draft-pantos-hls-rfc8216bis-08#section-6.3.6\n const fragmentLen = end - start;\n if (fragmentLen % 16) {\n byteRangeEnd = end + (16 - (fragmentLen % 16));\n }\n if (start !== 0) {\n loaderContext.resetIV = true;\n byteRangeStart = start - 16;\n }\n }\n loaderContext.rangeStart = byteRangeStart;\n loaderContext.rangeEnd = byteRangeEnd;\n }\n return loaderContext;\n}\n\nfunction createGapLoadError(frag: Fragment, part?: Part): LoadError {\n const error = new Error(`GAP ${frag.gap ? 'tag' : 'attribute'} found`);\n const errorData: FragLoadFailResult = {\n type: ErrorTypes.MEDIA_ERROR,\n details: ErrorDetails.FRAG_GAP,\n fatal: false,\n frag,\n error,\n networkDetails: null,\n };\n if (part) {\n errorData.part = part;\n }\n (part ? part : frag).stats.aborted = true;\n return new LoadError(errorData);\n}\n\nexport class LoadError extends Error {\n public readonly data: FragLoadFailResult;\n constructor(data: FragLoadFailResult) {\n super(data.error.message);\n this.data = data;\n }\n}\n\nexport interface FragLoadFailResult extends ErrorData {\n frag: Fragment;\n part?: Part;\n response?: {\n data: any;\n // error status code\n code: number;\n // error description\n text: string;\n url: string;\n };\n networkDetails: any;\n}\n\nexport type FragmentLoadProgressCallback = (\n result: FragLoadedData | PartsLoadedData,\n) => void;\n","export default class AESCrypto {\n private subtle: SubtleCrypto;\n private aesIV: Uint8Array;\n\n constructor(subtle: SubtleCrypto, iv: Uint8Array) {\n this.subtle = subtle;\n this.aesIV = iv;\n }\n\n decrypt(data: ArrayBuffer, key: CryptoKey) {\n return this.subtle.decrypt({ name: 'AES-CBC', iv: this.aesIV }, key, data);\n }\n}\n","export default class FastAESKey {\n private subtle: SubtleCrypto;\n private key: ArrayBuffer;\n\n constructor(subtle: SubtleCrypto, key: ArrayBuffer) {\n this.subtle = subtle;\n this.key = key;\n }\n\n expandKey() {\n return this.subtle.importKey('raw', this.key, { name: 'AES-CBC' }, false, [\n 'encrypt',\n 'decrypt',\n ]);\n }\n}\n","import { sliceUint8 } from '../utils/typed-array';\n\n// PKCS7\nexport function removePadding(array: Uint8Array): Uint8Array {\n const outputBytes = array.byteLength;\n const paddingBytes =\n outputBytes && new DataView(array.buffer).getUint8(outputBytes - 1);\n if (paddingBytes) {\n return sliceUint8(array, 0, outputBytes - paddingBytes);\n }\n return array;\n}\n\nexport default class AESDecryptor {\n private rcon: Array<number> = [\n 0x0, 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36,\n ];\n private subMix: Array<Uint32Array> = [\n new Uint32Array(256),\n new Uint32Array(256),\n new Uint32Array(256),\n new Uint32Array(256),\n ];\n private invSubMix: Array<Uint32Array> = [\n new Uint32Array(256),\n new Uint32Array(256),\n new Uint32Array(256),\n new Uint32Array(256),\n ];\n private sBox: Uint32Array = new Uint32Array(256);\n private invSBox: Uint32Array = new Uint32Array(256);\n private key: Uint32Array = new Uint32Array(0);\n\n private ksRows: number = 0;\n private keySize: number = 0;\n private keySchedule!: Uint32Array;\n private invKeySchedule!: Uint32Array;\n\n constructor() {\n this.initTable();\n }\n\n // Using view.getUint32() also swaps the byte order.\n uint8ArrayToUint32Array_(arrayBuffer) {\n const view = new DataView(arrayBuffer);\n const newArray = new Uint32Array(4);\n for (let i = 0; i < 4; i++) {\n newArray[i] = view.getUint32(i * 4);\n }\n\n return newArray;\n }\n\n initTable() {\n const sBox = this.sBox;\n const invSBox = this.invSBox;\n const subMix = this.subMix;\n const subMix0 = subMix[0];\n const subMix1 = subMix[1];\n const subMix2 = subMix[2];\n const subMix3 = subMix[3];\n const invSubMix = this.invSubMix;\n const invSubMix0 = invSubMix[0];\n const invSubMix1 = invSubMix[1];\n const invSubMix2 = invSubMix[2];\n const invSubMix3 = invSubMix[3];\n\n const d = new Uint32Array(256);\n let x = 0;\n let xi = 0;\n let i = 0;\n for (i = 0; i < 256; i++) {\n if (i < 128) {\n d[i] = i << 1;\n } else {\n d[i] = (i << 1) ^ 0x11b;\n }\n }\n\n for (i = 0; i < 256; i++) {\n let sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);\n sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;\n sBox[x] = sx;\n invSBox[sx] = x;\n\n // Compute multiplication\n const x2 = d[x];\n const x4 = d[x2];\n const x8 = d[x4];\n\n // Compute sub/invSub bytes, mix columns tables\n let t = (d[sx] * 0x101) ^ (sx * 0x1010100);\n subMix0[x] = (t << 24) | (t >>> 8);\n subMix1[x] = (t << 16) | (t >>> 16);\n subMix2[x] = (t << 8) | (t >>> 24);\n subMix3[x] = t;\n\n // Compute inv sub bytes, inv mix columns tables\n t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);\n invSubMix0[sx] = (t << 24) | (t >>> 8);\n invSubMix1[sx] = (t << 16) | (t >>> 16);\n invSubMix2[sx] = (t << 8) | (t >>> 24);\n invSubMix3[sx] = t;\n\n // Compute next counter\n if (!x) {\n x = xi = 1;\n } else {\n x = x2 ^ d[d[d[x8 ^ x2]]];\n xi ^= d[d[xi]];\n }\n }\n }\n\n expandKey(keyBuffer: ArrayBuffer) {\n // convert keyBuffer to Uint32Array\n const key = this.uint8ArrayToUint32Array_(keyBuffer);\n let sameKey = true;\n let offset = 0;\n\n while (offset < key.length && sameKey) {\n sameKey = key[offset] === this.key[offset];\n offset++;\n }\n\n if (sameKey) {\n return;\n }\n\n this.key = key;\n const keySize = (this.keySize = key.length);\n\n if (keySize !== 4 && keySize !== 6 && keySize !== 8) {\n throw new Error('Invalid aes key size=' + keySize);\n }\n\n const ksRows = (this.ksRows = (keySize + 6 + 1) * 4);\n let ksRow;\n let invKsRow;\n\n const keySchedule = (this.keySchedule = new Uint32Array(ksRows));\n const invKeySchedule = (this.invKeySchedule = new Uint32Array(ksRows));\n const sbox = this.sBox;\n const rcon = this.rcon;\n\n const invSubMix = this.invSubMix;\n const invSubMix0 = invSubMix[0];\n const invSubMix1 = invSubMix[1];\n const invSubMix2 = invSubMix[2];\n const invSubMix3 = invSubMix[3];\n\n let prev;\n let t;\n\n for (ksRow = 0; ksRow < ksRows; ksRow++) {\n if (ksRow < keySize) {\n prev = keySchedule[ksRow] = key[ksRow];\n continue;\n }\n t = prev;\n\n if (ksRow % keySize === 0) {\n // Rot word\n t = (t << 8) | (t >>> 24);\n\n // Sub word\n t =\n (sbox[t >>> 24] << 24) |\n (sbox[(t >>> 16) & 0xff] << 16) |\n (sbox[(t >>> 8) & 0xff] << 8) |\n sbox[t & 0xff];\n\n // Mix Rcon\n t ^= rcon[(ksRow / keySize) | 0] << 24;\n } else if (keySize > 6 && ksRow % keySize === 4) {\n // Sub word\n t =\n (sbox[t >>> 24] << 24) |\n (sbox[(t >>> 16) & 0xff] << 16) |\n (sbox[(t >>> 8) & 0xff] << 8) |\n sbox[t & 0xff];\n }\n\n keySchedule[ksRow] = prev = (keySchedule[ksRow - keySize] ^ t) >>> 0;\n }\n\n for (invKsRow = 0; invKsRow < ksRows; invKsRow++) {\n ksRow = ksRows - invKsRow;\n if (invKsRow & 3) {\n t = keySchedule[ksRow];\n } else {\n t = keySchedule[ksRow - 4];\n }\n\n if (invKsRow < 4 || ksRow <= 4) {\n invKeySchedule[invKsRow] = t;\n } else {\n invKeySchedule[invKsRow] =\n invSubMix0[sbox[t >>> 24]] ^\n invSubMix1[sbox[(t >>> 16) & 0xff]] ^\n invSubMix2[sbox[(t >>> 8) & 0xff]] ^\n invSubMix3[sbox[t & 0xff]];\n }\n\n invKeySchedule[invKsRow] = invKeySchedule[invKsRow] >>> 0;\n }\n }\n\n // Adding this as a method greatly improves performance.\n networkToHostOrderSwap(word) {\n return (\n (word << 24) |\n ((word & 0xff00) << 8) |\n ((word & 0xff0000) >> 8) |\n (word >>> 24)\n );\n }\n\n decrypt(inputArrayBuffer: ArrayBuffer, offset: number, aesIV: ArrayBuffer) {\n const nRounds = this.keySize + 6;\n const invKeySchedule = this.invKeySchedule;\n const invSBOX = this.invSBox;\n\n const invSubMix = this.invSubMix;\n const invSubMix0 = invSubMix[0];\n const invSubMix1 = invSubMix[1];\n const invSubMix2 = invSubMix[2];\n const invSubMix3 = invSubMix[3];\n\n const initVector = this.uint8ArrayToUint32Array_(aesIV);\n let initVector0 = initVector[0];\n let initVector1 = initVector[1];\n let initVector2 = initVector[2];\n let initVector3 = initVector[3];\n\n const inputInt32 = new Int32Array(inputArrayBuffer);\n const outputInt32 = new Int32Array(inputInt32.length);\n\n let t0, t1, t2, t3;\n let s0, s1, s2, s3;\n let inputWords0, inputWords1, inputWords2, inputWords3;\n\n let ksRow, i;\n const swapWord = this.networkToHostOrderSwap;\n\n while (offset < inputInt32.length) {\n inputWords0 = swapWord(inputInt32[offset]);\n inputWords1 = swapWord(inputInt32[offset + 1]);\n inputWords2 = swapWord(inputInt32[offset + 2]);\n inputWords3 = swapWord(inputInt32[offset + 3]);\n\n s0 = inputWords0 ^ invKeySchedule[0];\n s1 = inputWords3 ^ invKeySchedule[1];\n s2 = inputWords2 ^ invKeySchedule[2];\n s3 = inputWords1 ^ invKeySchedule[3];\n\n ksRow = 4;\n\n // Iterate through the rounds of decryption\n for (i = 1; i < nRounds; i++) {\n t0 =\n invSubMix0[s0 >>> 24] ^\n invSubMix1[(s1 >> 16) & 0xff] ^\n invSubMix2[(s2 >> 8) & 0xff] ^\n invSubMix3[s3 & 0xff] ^\n invKeySchedule[ksRow];\n t1 =\n invSubMix0[s1 >>> 24] ^\n invSubMix1[(s2 >> 16) & 0xff] ^\n invSubMix2[(s3 >> 8) & 0xff] ^\n invSubMix3[s0 & 0xff] ^\n invKeySchedule[ksRow + 1];\n t2 =\n invSubMix0[s2 >>> 24] ^\n invSubMix1[(s3 >> 16) & 0xff] ^\n invSubMix2[(s0 >> 8) & 0xff] ^\n invSubMix3[s1 & 0xff] ^\n invKeySchedule[ksRow + 2];\n t3 =\n invSubMix0[s3 >>> 24] ^\n invSubMix1[(s0 >> 16) & 0xff] ^\n invSubMix2[(s1 >> 8) & 0xff] ^\n invSubMix3[s2 & 0xff] ^\n invKeySchedule[ksRow + 3];\n // Update state\n s0 = t0;\n s1 = t1;\n s2 = t2;\n s3 = t3;\n\n ksRow = ksRow + 4;\n }\n\n // Shift rows, sub bytes, add round key\n t0 =\n (invSBOX[s0 >>> 24] << 24) ^\n (invSBOX[(s1 >> 16) & 0xff] << 16) ^\n (invSBOX[(s2 >> 8) & 0xff] << 8) ^\n invSBOX[s3 & 0xff] ^\n invKeySchedule[ksRow];\n t1 =\n (invSBOX[s1 >>> 24] << 24) ^\n (invSBOX[(s2 >> 16) & 0xff] << 16) ^\n (invSBOX[(s3 >> 8) & 0xff] << 8) ^\n invSBOX[s0 & 0xff] ^\n invKeySchedule[ksRow + 1];\n t2 =\n (invSBOX[s2 >>> 24] << 24) ^\n (invSBOX[(s3 >> 16) & 0xff] << 16) ^\n (invSBOX[(s0 >> 8) & 0xff] << 8) ^\n invSBOX[s1 & 0xff] ^\n invKeySchedule[ksRow + 2];\n t3 =\n (invSBOX[s3 >>> 24] << 24) ^\n (invSBOX[(s0 >> 16) & 0xff] << 16) ^\n (invSBOX[(s1 >> 8) & 0xff] << 8) ^\n invSBOX[s2 & 0xff] ^\n invKeySchedule[ksRow + 3];\n\n // Write\n outputInt32[offset] = swapWord(t0 ^ initVector0);\n outputInt32[offset + 1] = swapWord(t3 ^ initVector1);\n outputInt32[offset + 2] = swapWord(t2 ^ initVector2);\n outputInt32[offset + 3] = swapWord(t1 ^ initVector3);\n\n // reset initVector to last 4 unsigned int\n initVector0 = inputWords0;\n initVector1 = inputWords1;\n initVector2 = inputWords2;\n initVector3 = inputWords3;\n\n offset = offset + 4;\n }\n\n return outputInt32.buffer;\n }\n}\n","import AESCrypto from './aes-crypto';\nimport FastAESKey from './fast-aes-key';\nimport AESDecryptor, { removePadding } from './aes-decryptor';\nimport { logger } from '../utils/logger';\nimport { appendUint8Array } from '../utils/mp4-tools';\nimport { sliceUint8 } from '../utils/typed-array';\nimport type { HlsConfig } from '../config';\n\nconst CHUNK_SIZE = 16; // 16 bytes, 128 bits\n\nexport default class Decrypter {\n private logEnabled: boolean = true;\n private removePKCS7Padding: boolean;\n private subtle: SubtleCrypto | null = null;\n private softwareDecrypter: AESDecryptor | null = null;\n private key: ArrayBuffer | null = null;\n private fastAesKey: FastAESKey | null = null;\n private remainderData: Uint8Array | null = null;\n private currentIV: ArrayBuffer | null = null;\n private currentResult: ArrayBuffer | null = null;\n private useSoftware: boolean;\n\n constructor(config: HlsConfig, { removePKCS7Padding = true } = {}) {\n this.useSoftware = config.enableSoftwareAES;\n this.removePKCS7Padding = removePKCS7Padding;\n // built in decryptor expects PKCS7 padding\n if (removePKCS7Padding) {\n try {\n const browserCrypto = self.crypto;\n if (browserCrypto) {\n this.subtle =\n browserCrypto.subtle ||\n ((browserCrypto as any).webkitSubtle as SubtleCrypto);\n }\n } catch (e) {\n /* no-op */\n }\n }\n\n this.useSoftware = !this.subtle;\n }\n\n destroy() {\n this.subtle = null;\n this.softwareDecrypter = null;\n this.key = null;\n this.fastAesKey = null;\n this.remainderData = null;\n this.currentIV = null;\n this.currentResult = null;\n }\n\n public isSync() {\n return this.useSoftware;\n }\n\n public flush(): Uint8Array | null {\n const { currentResult, remainderData } = this;\n if (!currentResult || remainderData) {\n this.reset();\n return null;\n }\n const data = new Uint8Array(currentResult);\n this.reset();\n if (this.removePKCS7Padding) {\n return removePadding(data);\n }\n return data;\n }\n\n public reset() {\n this.currentResult = null;\n this.currentIV = null;\n this.remainderData = null;\n if (this.softwareDecrypter) {\n this.softwareDecrypter = null;\n }\n }\n\n public decrypt(\n data: Uint8Array | ArrayBuffer,\n key: ArrayBuffer,\n iv: ArrayBuffer,\n ): Promise<ArrayBuffer> {\n if (this.useSoftware) {\n return new Promise((resolve, reject) => {\n this.softwareDecrypt(new Uint8Array(data), key, iv);\n const decryptResult = this.flush();\n if (decryptResult) {\n resolve(decryptResult.buffer);\n } else {\n reject(new Error('[softwareDecrypt] Failed to decrypt data'));\n }\n });\n }\n return this.webCryptoDecrypt(new Uint8Array(data), key, iv);\n }\n\n // Software decryption is progressive. Progressive decryption may not return a result on each call. Any cached\n // data is handled in the flush() call\n public softwareDecrypt(\n data: Uint8Array,\n key: ArrayBuffer,\n iv: ArrayBuffer,\n ): ArrayBuffer | null {\n const { currentIV, currentResult, remainderData } = this;\n this.logOnce('JS AES decrypt');\n // The output is staggered during progressive parsing - the current result is cached, and emitted on the next call\n // This is done in order to strip PKCS7 padding, which is found at the end of each segment. We only know we've reached\n // the end on flush(), but by that time we have already received all bytes for the segment.\n // Progressive decryption does not work with WebCrypto\n\n if (remainderData) {\n data = appendUint8Array(remainderData, data);\n this.remainderData = null;\n }\n\n // Byte length must be a multiple of 16 (AES-128 = 128 bit blocks = 16 bytes)\n const currentChunk = this.getValidChunk(data);\n if (!currentChunk.length) {\n return null;\n }\n\n if (currentIV) {\n iv = currentIV;\n }\n\n let softwareDecrypter = this.softwareDecrypter;\n if (!softwareDecrypter) {\n softwareDecrypter = this.softwareDecrypter = new AESDecryptor();\n }\n softwareDecrypter.expandKey(key);\n\n const result = currentResult;\n\n this.currentResult = softwareDecrypter.decrypt(currentChunk.buffer, 0, iv);\n this.currentIV = sliceUint8(currentChunk, -16).buffer;\n\n if (!result) {\n return null;\n }\n return result;\n }\n\n public webCryptoDecrypt(\n data: Uint8Array,\n key: ArrayBuffer,\n iv: ArrayBuffer,\n ): Promise<ArrayBuffer> {\n if (this.key !== key || !this.fastAesKey) {\n if (!this.subtle) {\n return Promise.resolve(this.onWebCryptoError(data, key, iv));\n }\n this.key = key;\n this.fastAesKey = new FastAESKey(this.subtle, key);\n }\n return this.fastAesKey\n .expandKey()\n .then((aesKey) => {\n // decrypt using web crypto\n if (!this.subtle) {\n return Promise.reject(new Error('web crypto not initialized'));\n }\n this.logOnce('WebCrypto AES decrypt');\n const crypto = new AESCrypto(this.subtle, new Uint8Array(iv));\n return crypto.decrypt(data.buffer, aesKey);\n })\n .catch((err) => {\n logger.warn(\n `[decrypter]: WebCrypto Error, disable WebCrypto API, ${err.name}: ${err.message}`,\n );\n\n return this.onWebCryptoError(data, key, iv);\n });\n }\n\n private onWebCryptoError(\n data: Uint8Array,\n key: ArrayBuffer,\n iv: ArrayBuffer,\n ): ArrayBuffer | never {\n this.useSoftware = true;\n this.logEnabled = true;\n this.softwareDecrypt(data, key, iv);\n const decryptResult = this.flush();\n if (decryptResult) {\n return decryptResult.buffer;\n }\n throw new Error('WebCrypto and softwareDecrypt: failed to decrypt data');\n }\n\n private getValidChunk(data: Uint8Array): Uint8Array {\n let currentChunk = data;\n const splitPoint = data.length - (data.length % CHUNK_SIZE);\n if (splitPoint !== data.length) {\n currentChunk = sliceUint8(data, 0, splitPoint);\n this.remainderData = sliceUint8(data, splitPoint);\n }\n return currentChunk;\n }\n\n private logOnce(msg: string) {\n if (!this.logEnabled) {\n return;\n }\n logger.log(`[decrypter]: ${msg}`);\n this.logEnabled = false;\n }\n}\n","import TaskLoop from '../task-loop';\nimport { FragmentState } from './fragment-tracker';\nimport { Bufferable, BufferHelper, BufferInfo } from '../utils/buffer-helper';\nimport { logger } from '../utils/logger';\nimport { Events } from '../events';\nimport { ErrorDetails, ErrorTypes } from '../errors';\nimport { ChunkMetadata } from '../types/transmuxer';\nimport { appendUint8Array } from '../utils/mp4-tools';\nimport { alignStream } from '../utils/discontinuities';\nimport {\n findFragmentByPDT,\n findFragmentByPTS,\n findFragWithCC,\n} from './fragment-finders';\nimport {\n findPart,\n getFragmentWithSN,\n getPartWith,\n updateFragPTSDTS,\n} from '../utils/level-helper';\nimport TransmuxerInterface from '../demux/transmuxer-interface';\nimport { Fragment, Part } from '../loader/fragment';\nimport FragmentLoader, {\n FragmentLoadProgressCallback,\n LoadError,\n} from '../loader/fragment-loader';\nimport KeyLoader from '../loader/key-loader';\nimport { LevelDetails } from '../loader/level-details';\nimport Decrypter from '../crypt/decrypter';\nimport TimeRanges from '../utils/time-ranges';\nimport { PlaylistLevelType } from '../types/loader';\nimport { getRetryDelay } from '../utils/error-helper';\nimport { NetworkErrorAction } from './error-controller';\nimport type {\n BufferAppendingData,\n ErrorData,\n FragLoadedData,\n PartsLoadedData,\n KeyLoadedData,\n MediaAttachedData,\n BufferFlushingData,\n ManifestLoadedData,\n} from '../types/events';\nimport type { FragmentTracker } from './fragment-tracker';\nimport type { Level } from '../types/level';\nimport type { RemuxedTrack } from '../types/remuxer';\nimport type Hls from '../hls';\nimport type { HlsConfig } from '../config';\nimport type { NetworkComponentAPI } from '../types/component-api';\nimport type { SourceBufferName } from '../types/buffer';\nimport type { RationalTimestamp } from '../utils/timescale-conversion';\n\ntype ResolveFragLoaded = (FragLoadedEndData) => void;\ntype RejectFragLoaded = (LoadError) => void;\n\nexport const State = {\n STOPPED: 'STOPPED',\n IDLE: 'IDLE',\n KEY_LOADING: 'KEY_LOADING',\n FRAG_LOADING: 'FRAG_LOADING',\n FRAG_LOADING_WAITING_RETRY: 'FRAG_LOADING_WAITING_RETRY',\n WAITING_TRACK: 'WAITING_TRACK',\n PARSING: 'PARSING',\n PARSED: 'PARSED',\n ENDED: 'ENDED',\n ERROR: 'ERROR',\n WAITING_INIT_PTS: 'WAITING_INIT_PTS',\n WAITING_LEVEL: 'WAITING_LEVEL',\n};\n\nexport default class BaseStreamController\n extends TaskLoop\n implements NetworkComponentAPI\n{\n protected hls: Hls;\n\n protected fragPrevious: Fragment | null = null;\n protected fragCurrent: Fragment | null = null;\n protected fragmentTracker: FragmentTracker;\n protected transmuxer: TransmuxerInterface | null = null;\n protected _state: string = State.STOPPED;\n protected playlistType: PlaylistLevelType;\n protected media: HTMLMediaElement | null = null;\n protected mediaBuffer: Bufferable | null = null;\n protected config: HlsConfig;\n protected bitrateTest: boolean = false;\n protected lastCurrentTime: number = 0;\n protected nextLoadPosition: number = 0;\n protected startPosition: number = 0;\n protected startTimeOffset: number | null = null;\n protected loadedmetadata: boolean = false;\n protected retryDate: number = 0;\n protected levels: Array<Level> | null = null;\n protected fragmentLoader: FragmentLoader;\n protected keyLoader: KeyLoader;\n protected levelLastLoaded: Level | null = null;\n protected startFragRequested: boolean = false;\n protected decrypter: Decrypter;\n protected initPTS: RationalTimestamp[] = [];\n protected buffering: boolean = true;\n protected onvseeking: EventListener | null = null;\n protected onvended: EventListener | null = null;\n\n private readonly logPrefix: string = '';\n protected log: (msg: any) => void;\n protected warn: (msg: any) => void;\n\n constructor(\n hls: Hls,\n fragmentTracker: FragmentTracker,\n keyLoader: KeyLoader,\n logPrefix: string,\n playlistType: PlaylistLevelType,\n ) {\n super();\n this.playlistType = playlistType;\n this.logPrefix = logPrefix;\n this.log = logger.log.bind(logger, `${logPrefix}:`);\n this.warn = logger.warn.bind(logger, `${logPrefix}:`);\n this.hls = hls;\n this.fragmentLoader = new FragmentLoader(hls.config);\n this.keyLoader = keyLoader;\n this.fragmentTracker = fragmentTracker;\n this.config = hls.config;\n this.decrypter = new Decrypter(hls.config);\n hls.on(Events.MANIFEST_LOADED, this.onManifestLoaded, this);\n }\n\n protected doTick() {\n this.onTickEnd();\n }\n\n protected onTickEnd() {}\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n public startLoad(startPosition: number): void {}\n\n public stopLoad() {\n this.fragmentLoader.abort();\n this.keyLoader.abort(this.playlistType);\n const frag = this.fragCurrent;\n if (frag?.loader) {\n frag.abortRequests();\n this.fragmentTracker.removeFragment(frag);\n }\n this.resetTransmuxer();\n this.fragCurrent = null;\n this.fragPrevious = null;\n this.clearInterval();\n this.clearNextTick();\n this.state = State.STOPPED;\n }\n\n public pauseBuffering() {\n this.buffering = false;\n }\n\n public resumeBuffering() {\n this.buffering = true;\n }\n\n protected _streamEnded(\n bufferInfo: BufferInfo,\n levelDetails: LevelDetails,\n ): boolean {\n // If playlist is live, there is another buffered range after the current range, nothing buffered, media is detached,\n // of nothing loading/loaded return false\n if (\n levelDetails.live ||\n bufferInfo.nextStart ||\n !bufferInfo.end ||\n !this.media\n ) {\n return false;\n }\n const partList = levelDetails.partList;\n // Since the last part isn't guaranteed to correspond to the last playlist segment for Low-Latency HLS,\n // check instead if the last part is buffered.\n if (partList?.length) {\n const lastPart = partList[partList.length - 1];\n\n // Checking the midpoint of the part for potential margin of error and related issues.\n // NOTE: Technically I believe parts could yield content that is < the computed duration (including potential a duration of 0)\n // and still be spec-compliant, so there may still be edge cases here. Likewise, there could be issues in end of stream\n // part mismatches for independent audio and video playlists/segments.\n const lastPartBuffered = BufferHelper.isBuffered(\n this.media,\n lastPart.start + lastPart.duration / 2,\n );\n return lastPartBuffered;\n }\n\n const playlistType =\n levelDetails.fragments[levelDetails.fragments.length - 1].type;\n return this.fragmentTracker.isEndListAppended(playlistType);\n }\n\n protected getLevelDetails(): LevelDetails | undefined {\n if (this.levels && this.levelLastLoaded !== null) {\n return this.levelLastLoaded?.details;\n }\n }\n\n protected onMediaAttached(\n event: Events.MEDIA_ATTACHED,\n data: MediaAttachedData,\n ) {\n const media = (this.media = this.mediaBuffer = data.media);\n this.onvseeking = this.onMediaSeeking.bind(this) as EventListener;\n this.onvended = this.onMediaEnded.bind(this) as EventListener;\n media.addEventListener('seeking', this.onvseeking);\n media.addEventListener('ended', this.onvended);\n const config = this.config;\n if (this.levels && config.autoStartLoad && this.state === State.STOPPED) {\n this.startLoad(config.startPosition);\n }\n }\n\n protected onMediaDetaching() {\n const media = this.media;\n if (media?.ended) {\n this.log('MSE detaching and video ended, reset startPosition');\n this.startPosition = this.lastCurrentTime = 0;\n }\n\n // remove video listeners\n if (media && this.onvseeking && this.onvended) {\n media.removeEventListener('seeking', this.onvseeking);\n media.removeEventListener('ended', this.onvended);\n this.onvseeking = this.onvended = null;\n }\n if (this.keyLoader) {\n this.keyLoader.detach();\n }\n this.media = this.mediaBuffer = null;\n this.loadedmetadata = false;\n this.fragmentTracker.removeAllFragments();\n this.stopLoad();\n }\n\n protected onMediaSeeking() {\n const { config, fragCurrent, media, mediaBuffer, state } = this;\n const currentTime: number = media ? media.currentTime : 0;\n const bufferInfo = BufferHelper.bufferInfo(\n mediaBuffer ? mediaBuffer : media,\n currentTime,\n config.maxBufferHole,\n );\n\n this.log(\n `media seeking to ${\n Number.isFinite(currentTime) ? currentTime.toFixed(3) : currentTime\n }, state: ${state}`,\n );\n\n if (this.state === State.ENDED) {\n this.resetLoadingState();\n } else if (fragCurrent) {\n // Seeking while frag load is in progress\n const tolerance = config.maxFragLookUpTolerance;\n const fragStartOffset = fragCurrent.start - tolerance;\n const fragEndOffset =\n fragCurrent.start + fragCurrent.duration + tolerance;\n // if seeking out of buffered range or into new one\n if (\n !bufferInfo.len ||\n fragEndOffset < bufferInfo.start ||\n fragStartOffset > bufferInfo.end\n ) {\n const pastFragment = currentTime > fragEndOffset;\n // if the seek position is outside the current fragment range\n if (currentTime < fragStartOffset || pastFragment) {\n if (pastFragment && fragCurrent.loader) {\n this.log(\n 'seeking outside of buffer while fragment load in progress, cancel fragment load',\n );\n fragCurrent.abortRequests();\n this.resetLoadingState();\n }\n this.fragPrevious = null;\n }\n }\n }\n\n if (media) {\n // Remove gap fragments\n this.fragmentTracker.removeFragmentsInRange(\n currentTime,\n Infinity,\n this.playlistType,\n true,\n );\n\n this.lastCurrentTime = currentTime;\n }\n\n // in case seeking occurs although no media buffered, adjust startPosition and nextLoadPosition to seek target\n if (!this.loadedmetadata && !bufferInfo.len) {\n this.nextLoadPosition = this.startPosition = currentTime;\n }\n\n // Async tick to speed up processing\n this.tickImmediate();\n }\n\n protected onMediaEnded() {\n // reset startPosition and lastCurrentTime to restart playback @ stream beginning\n this.startPosition = this.lastCurrentTime = 0;\n }\n\n protected onManifestLoaded(\n event: Events.MANIFEST_LOADED,\n data: ManifestLoadedData,\n ): void {\n this.startTimeOffset = data.startTimeOffset;\n this.initPTS = [];\n }\n\n protected onHandlerDestroying() {\n this.hls.off(Events.MANIFEST_LOADED, this.onManifestLoaded, this);\n this.stopLoad();\n super.onHandlerDestroying();\n // @ts-ignore\n this.hls = null;\n }\n\n protected onHandlerDestroyed() {\n this.state = State.STOPPED;\n if (this.fragmentLoader) {\n this.fragmentLoader.destroy();\n }\n if (this.keyLoader) {\n this.keyLoader.destroy();\n }\n if (this.decrypter) {\n this.decrypter.destroy();\n }\n\n this.hls =\n this.log =\n this.warn =\n this.decrypter =\n this.keyLoader =\n this.fragmentLoader =\n this.fragmentTracker =\n null as any;\n super.onHandlerDestroyed();\n }\n\n protected loadFragment(\n frag: Fragment,\n level: Level,\n targetBufferTime: number,\n ) {\n this._loadFragForPlayback(frag, level, targetBufferTime);\n }\n\n private _loadFragForPlayback(\n frag: Fragment,\n level: Level,\n targetBufferTime: number,\n ) {\n const progressCallback: FragmentLoadProgressCallback = (\n data: FragLoadedData,\n ) => {\n if (this.fragContextChanged(frag)) {\n this.warn(\n `Fragment ${frag.sn}${\n data.part ? ' p: ' + data.part.index : ''\n } of level ${frag.level} was dropped during download.`,\n );\n this.fragmentTracker.removeFragment(frag);\n return;\n }\n frag.stats.chunkCount++;\n this._handleFragmentLoadProgress(data);\n };\n\n this._doFragLoad(frag, level, targetBufferTime, progressCallback)\n .then((data) => {\n if (!data) {\n // if we're here we probably needed to backtrack or are waiting for more parts\n return;\n }\n const state = this.state;\n if (this.fragContextChanged(frag)) {\n if (\n state === State.FRAG_LOADING ||\n (!this.fragCurrent && state === State.PARSING)\n ) {\n this.fragmentTracker.removeFragment(frag);\n this.state = State.IDLE;\n }\n return;\n }\n\n if ('payload' in data) {\n this.log(`Loaded fragment ${frag.sn} of level ${frag.level}`);\n this.hls.trigger(Events.FRAG_LOADED, data);\n }\n\n // Pass through the whole payload; controllers not implementing progressive loading receive data from this callback\n this._handleFragmentLoadComplete(data);\n })\n .catch((reason) => {\n if (this.state === State.STOPPED || this.state === State.ERROR) {\n return;\n }\n this.warn(`Frag error: ${reason?.message || reason}`);\n this.resetFragmentLoading(frag);\n });\n }\n\n protected clearTrackerIfNeeded(frag: Fragment) {\n const { fragmentTracker } = this;\n const fragState = fragmentTracker.getState(frag);\n if (fragState === FragmentState.APPENDING) {\n // Lower the max buffer length and try again\n const playlistType = frag.type as PlaylistLevelType;\n const bufferedInfo = this.getFwdBufferInfo(\n this.mediaBuffer,\n playlistType,\n );\n const minForwardBufferLength = Math.max(\n frag.duration,\n bufferedInfo ? bufferedInfo.len : this.config.maxBufferLength,\n );\n // If backtracking, always remove from the tracker without reducing max buffer length\n const backtrackFragment = (this as any).backtrackFragment as\n | Fragment\n | undefined;\n const backtracked = backtrackFragment\n ? (frag.sn as number) - (backtrackFragment.sn as number)\n : 0;\n if (\n backtracked === 1 ||\n this.reduceMaxBufferLength(minForwardBufferLength, frag.duration)\n ) {\n fragmentTracker.removeFragment(frag);\n }\n } else if (this.mediaBuffer?.buffered.length === 0) {\n // Stop gap for bad tracker / buffer flush behavior\n fragmentTracker.removeAllFragments();\n } else if (fragmentTracker.hasParts(frag.type)) {\n // In low latency mode, remove fragments for which only some parts were buffered\n fragmentTracker.detectPartialFragments({\n frag,\n part: null,\n stats: frag.stats,\n id: frag.type,\n });\n if (fragmentTracker.getState(frag) === FragmentState.PARTIAL) {\n fragmentTracker.removeFragment(frag);\n }\n }\n }\n\n protected checkLiveUpdate(details: LevelDetails) {\n if (details.updated && !details.live) {\n // Live stream ended, update fragment tracker\n const lastFragment = details.fragments[details.fragments.length - 1];\n this.fragmentTracker.detectPartialFragments({\n frag: lastFragment,\n part: null,\n stats: lastFragment.stats,\n id: lastFragment.type,\n });\n }\n if (!details.fragments[0]) {\n details.deltaUpdateFailed = true;\n }\n }\n\n protected flushMainBuffer(\n startOffset: number,\n endOffset: number,\n type: SourceBufferName | null = null,\n ) {\n if (!(startOffset - endOffset)) {\n return;\n }\n // When alternate audio is playing, the audio-stream-controller is responsible for the audio buffer. Otherwise,\n // passing a null type flushes both buffers\n const flushScope: BufferFlushingData = { startOffset, endOffset, type };\n this.hls.trigger(Events.BUFFER_FLUSHING, flushScope);\n }\n\n protected _loadInitSegment(frag: Fragment, level: Level) {\n this._doFragLoad(frag, level)\n .then((data) => {\n if (!data || this.fragContextChanged(frag) || !this.levels) {\n throw new Error('init load aborted');\n }\n\n return data;\n })\n .then((data: FragLoadedData) => {\n const { hls } = this;\n const { payload } = data;\n const decryptData = frag.decryptdata;\n\n // check to see if the payload needs to be decrypted\n if (\n payload &&\n payload.byteLength > 0 &&\n decryptData?.key &&\n decryptData.iv &&\n decryptData.method === 'AES-128'\n ) {\n const startTime = self.performance.now();\n // decrypt init segment data\n return this.decrypter\n .decrypt(\n new Uint8Array(payload),\n decryptData.key.buffer,\n decryptData.iv.buffer,\n )\n .catch((err) => {\n hls.trigger(Events.ERROR, {\n type: ErrorTypes.MEDIA_ERROR,\n details: ErrorDetails.FRAG_DECRYPT_ERROR,\n fatal: false,\n error: err,\n reason: err.message,\n frag,\n });\n throw err;\n })\n .then((decryptedData) => {\n const endTime = self.performance.now();\n hls.trigger(Events.FRAG_DECRYPTED, {\n frag,\n payload: decryptedData,\n stats: {\n tstart: startTime,\n tdecrypt: endTime,\n },\n });\n data.payload = decryptedData;\n return this.completeInitSegmentLoad(data);\n });\n }\n return this.completeInitSegmentLoad(data);\n })\n .catch((reason) => {\n if (this.state === State.STOPPED || this.state === State.ERROR) {\n return;\n }\n this.warn(reason);\n this.resetFragmentLoading(frag);\n });\n }\n\n private completeInitSegmentLoad(data: FragLoadedData) {\n const { levels } = this;\n if (!levels) {\n throw new Error('init load aborted, missing levels');\n }\n const stats = data.frag.stats;\n this.state = State.IDLE;\n data.frag.data = new Uint8Array(data.payload);\n stats.parsing.start = stats.buffering.start = self.performance.now();\n stats.parsing.end = stats.buffering.end = self.performance.now();\n this.tick();\n }\n\n protected fragContextChanged(frag: Fragment | null) {\n const { fragCurrent } = this;\n return (\n !frag ||\n !fragCurrent ||\n frag.sn !== fragCurrent.sn ||\n frag.level !== fragCurrent.level\n );\n }\n\n protected fragBufferedComplete(frag: Fragment, part: Part | null) {\n const media = this.mediaBuffer ? this.mediaBuffer : this.media;\n this.log(\n `Buffered ${frag.type} sn: ${frag.sn}${\n part ? ' part: ' + part.index : ''\n } of ${\n this.playlistType === PlaylistLevelType.MAIN ? 'level' : 'track'\n } ${frag.level} (frag:[${(frag.startPTS ?? NaN).toFixed(3)}-${(\n frag.endPTS ?? NaN\n ).toFixed(3)}] > buffer:${\n media\n ? TimeRanges.toString(BufferHelper.getBuffered(media))\n : '(detached)'\n })`,\n );\n if (frag.sn !== 'initSegment') {\n if (frag.type !== PlaylistLevelType.SUBTITLE) {\n const el = frag.elementaryStreams;\n if (!Object.keys(el).some((type) => !!el[type])) {\n // empty segment\n this.state = State.IDLE;\n return;\n }\n }\n const level = this.levels?.[frag.level];\n if (level?.fragmentError) {\n this.log(\n `Resetting level fragment error count of ${level.fragmentError} on frag buffered`,\n );\n level.fragmentError = 0;\n }\n }\n this.state = State.IDLE;\n if (!media) {\n return;\n }\n if (\n !this.loadedmetadata &&\n frag.type == PlaylistLevelType.MAIN &&\n media.buffered.length &&\n this.fragCurrent?.sn === this.fragPrevious?.sn\n ) {\n this.loadedmetadata = true;\n this.seekToStartPos();\n }\n this.tick();\n }\n\n protected seekToStartPos() {}\n\n protected _handleFragmentLoadComplete(fragLoadedEndData: PartsLoadedData) {\n const { transmuxer } = this;\n if (!transmuxer) {\n return;\n }\n const { frag, part, partsLoaded } = fragLoadedEndData;\n // If we did not load parts, or loaded all parts, we have complete (not partial) fragment data\n const complete =\n !partsLoaded ||\n partsLoaded.length === 0 ||\n partsLoaded.some((fragLoaded) => !fragLoaded);\n const chunkMeta = new ChunkMetadata(\n frag.level,\n frag.sn as number,\n frag.stats.chunkCount + 1,\n 0,\n part ? part.index : -1,\n !complete,\n );\n transmuxer.flush(chunkMeta);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n protected _handleFragmentLoadProgress(\n frag: PartsLoadedData | FragLoadedData,\n ) {}\n\n protected _doFragLoad(\n frag: Fragment,\n level: Level,\n targetBufferTime: number | null = null,\n progressCallback?: FragmentLoadProgressCallback,\n ): Promise<PartsLoadedData | FragLoadedData | null> {\n const details = level?.details;\n if (!this.levels || !details) {\n throw new Error(\n `frag load aborted, missing level${details ? '' : ' detail'}s`,\n );\n }\n\n let keyLoadingPromise: Promise<KeyLoadedData | void> | null = null;\n if (frag.encrypted && !frag.decryptdata?.key) {\n this.log(\n `Loading key for ${frag.sn} of [${details.startSN}-${details.endSN}], ${\n this.logPrefix === '[stream-controller]' ? 'level' : 'track'\n } ${frag.level}`,\n );\n this.state = State.KEY_LOADING;\n this.fragCurrent = frag;\n keyLoadingPromise = this.keyLoader.load(frag).then((keyLoadedData) => {\n if (!this.fragContextChanged(keyLoadedData.frag)) {\n this.hls.trigger(Events.KEY_LOADED, keyLoadedData);\n if (this.state === State.KEY_LOADING) {\n this.state = State.IDLE;\n }\n return keyLoadedData;\n }\n });\n this.hls.trigger(Events.KEY_LOADING, { frag });\n if (this.fragCurrent === null) {\n keyLoadingPromise = Promise.reject(\n new Error(`frag load aborted, context changed in KEY_LOADING`),\n );\n }\n } else if (!frag.encrypted && details.encryptedFragments.length) {\n this.keyLoader.loadClear(frag, details.encryptedFragments);\n }\n\n targetBufferTime = Math.max(frag.start, targetBufferTime || 0);\n if (this.config.lowLatencyMode && frag.sn !== 'initSegment') {\n const partList = details.partList;\n if (partList && progressCallback) {\n if (targetBufferTime > frag.end && details.fragmentHint) {\n frag = details.fragmentHint;\n }\n const partIndex = this.getNextPart(partList, frag, targetBufferTime);\n if (partIndex > -1) {\n const part = partList[partIndex];\n this.log(\n `Loading part sn: ${frag.sn} p: ${part.index} cc: ${\n frag.cc\n } of playlist [${details.startSN}-${\n details.endSN\n }] parts [0-${partIndex}-${partList.length - 1}] ${\n this.logPrefix === '[stream-controller]' ? 'level' : 'track'\n }: ${frag.level}, target: ${parseFloat(\n targetBufferTime.toFixed(3),\n )}`,\n );\n this.nextLoadPosition = part.start + part.duration;\n this.state = State.FRAG_LOADING;\n let result: Promise<PartsLoadedData | FragLoadedData | null>;\n if (keyLoadingPromise) {\n result = keyLoadingPromise\n .then((keyLoadedData) => {\n if (\n !keyLoadedData ||\n this.fragContextChanged(keyLoadedData.frag)\n ) {\n return null;\n }\n return this.doFragPartsLoad(\n frag,\n part,\n level,\n progressCallback,\n );\n })\n .catch((error) => this.handleFragLoadError(error));\n } else {\n result = this.doFragPartsLoad(\n frag,\n part,\n level,\n progressCallback,\n ).catch((error: LoadError) => this.handleFragLoadError(error));\n }\n this.hls.trigger(Events.FRAG_LOADING, {\n frag,\n part,\n targetBufferTime,\n });\n if (this.fragCurrent === null) {\n return Promise.reject(\n new Error(\n `frag load aborted, context changed in FRAG_LOADING parts`,\n ),\n );\n }\n return result;\n } else if (\n !frag.url ||\n this.loadedEndOfParts(partList, targetBufferTime)\n ) {\n // Fragment hint has no parts\n return Promise.resolve(null);\n }\n }\n }\n\n this.log(\n `Loading fragment ${frag.sn} cc: ${frag.cc} ${\n details ? 'of [' + details.startSN + '-' + details.endSN + '] ' : ''\n }${this.logPrefix === '[stream-controller]' ? 'level' : 'track'}: ${\n frag.level\n }, target: ${parseFloat(targetBufferTime.toFixed(3))}`,\n );\n // Don't update nextLoadPosition for fragments which are not buffered\n if (Number.isFinite(frag.sn as number) && !this.bitrateTest) {\n this.nextLoadPosition = frag.start + frag.duration;\n }\n this.state = State.FRAG_LOADING;\n\n // Load key before streaming fragment data\n const dataOnProgress = this.config.progressive;\n let result: Promise<PartsLoadedData | FragLoadedData | null>;\n if (dataOnProgress && keyLoadingPromise) {\n result = keyLoadingPromise\n .then((keyLoadedData) => {\n if (!keyLoadedData || this.fragContextChanged(keyLoadedData?.frag)) {\n return null;\n }\n return this.fragmentLoader.load(frag, progressCallback);\n })\n .catch((error) => this.handleFragLoadError(error));\n } else {\n // load unencrypted fragment data with progress event,\n // or handle fragment result after key and fragment are finished loading\n result = Promise.all([\n this.fragmentLoader.load(\n frag,\n dataOnProgress ? progressCallback : undefined,\n ),\n keyLoadingPromise,\n ])\n .then(([fragLoadedData]) => {\n if (!dataOnProgress && fragLoadedData && progressCallback) {\n progressCallback(fragLoadedData);\n }\n return fragLoadedData;\n })\n .catch((error) => this.handleFragLoadError(error));\n }\n this.hls.trigger(Events.FRAG_LOADING, { frag, targetBufferTime });\n if (this.fragCurrent === null) {\n return Promise.reject(\n new Error(`frag load aborted, context changed in FRAG_LOADING`),\n );\n }\n return result;\n }\n\n private doFragPartsLoad(\n frag: Fragment,\n fromPart: Part,\n level: Level,\n progressCallback: FragmentLoadProgressCallback,\n ): Promise<PartsLoadedData | null> {\n return new Promise(\n (resolve: ResolveFragLoaded, reject: RejectFragLoaded) => {\n const partsLoaded: FragLoadedData[] = [];\n const initialPartList = level.details?.partList;\n const loadPart = (part: Part) => {\n this.fragmentLoader\n .loadPart(frag, part, progressCallback)\n .then((partLoadedData: FragLoadedData) => {\n partsLoaded[part.index] = partLoadedData;\n const loadedPart = partLoadedData.part as Part;\n this.hls.trigger(Events.FRAG_LOADED, partLoadedData);\n const nextPart =\n getPartWith(level, frag.sn as number, part.index + 1) ||\n findPart(initialPartList, frag.sn as number, part.index + 1);\n if (nextPart) {\n loadPart(nextPart);\n } else {\n return resolve({\n frag,\n part: loadedPart,\n partsLoaded,\n });\n }\n })\n .catch(reject);\n };\n loadPart(fromPart);\n },\n );\n }\n\n private handleFragLoadError(error: LoadError | Error) {\n if ('data' in error) {\n const data = error.data;\n if (error.data && data.details === ErrorDetails.INTERNAL_ABORTED) {\n this.handleFragLoadAborted(data.frag, data.part);\n } else {\n this.hls.trigger(Events.ERROR, data as ErrorData);\n }\n } else {\n this.hls.trigger(Events.ERROR, {\n type: ErrorTypes.OTHER_ERROR,\n details: ErrorDetails.INTERNAL_EXCEPTION,\n err: error,\n error,\n fatal: true,\n });\n }\n return null;\n }\n\n protected _handleTransmuxerFlush(chunkMeta: ChunkMetadata) {\n const context = this.getCurrentContext(chunkMeta);\n if (!context || this.state !== State.PARSING) {\n if (\n !this.fragCurrent &&\n this.state !== State.STOPPED &&\n this.state !== State.ERROR\n ) {\n this.state = State.IDLE;\n }\n return;\n }\n const { frag, part, level } = context;\n const now = self.performance.now();\n frag.stats.parsing.end = now;\n if (part) {\n part.stats.parsing.end = now;\n }\n this.updateLevelTiming(frag, part, level, chunkMeta.partial);\n }\n\n protected getCurrentContext(\n chunkMeta: ChunkMetadata,\n ): { frag: Fragment; part: Part | null; level: Level } | null {\n const { levels, fragCurrent } = this;\n const { level: levelIndex, sn, part: partIndex } = chunkMeta;\n if (!levels?.[levelIndex]) {\n this.warn(\n `Levels object was unset while buffering fragment ${sn} of level ${levelIndex}. The current chunk will not be buffered.`,\n );\n return null;\n }\n const level = levels[levelIndex];\n const part = partIndex > -1 ? getPartWith(level, sn, partIndex) : null;\n const frag = part\n ? part.fragment\n : getFragmentWithSN(level, sn, fragCurrent);\n if (!frag) {\n return null;\n }\n if (fragCurrent && fragCurrent !== frag) {\n frag.stats = fragCurrent.stats;\n }\n return { frag, part, level };\n }\n\n protected bufferFragmentData(\n data: RemuxedTrack,\n frag: Fragment,\n part: Part | null,\n chunkMeta: ChunkMetadata,\n noBacktracking?: boolean,\n ) {\n if (!data || this.state !== State.PARSING) {\n return;\n }\n\n const { data1, data2 } = data;\n let buffer = data1;\n if (data1 && data2) {\n // Combine the moof + mdat so that we buffer with a single append\n buffer = appendUint8Array(data1, data2);\n }\n\n if (!buffer?.length) {\n return;\n }\n\n const segment: BufferAppendingData = {\n type: data.type,\n frag,\n part,\n chunkMeta,\n parent: frag.type,\n data: buffer,\n };\n this.hls.trigger(Events.BUFFER_APPENDING, segment);\n\n if (data.dropped && data.independent && !part) {\n if (noBacktracking) {\n return;\n }\n // Clear buffer so that we reload previous segments sequentially if required\n this.flushBufferGap(frag);\n }\n }\n\n protected flushBufferGap(frag: Fragment) {\n const media = this.media;\n if (!media) {\n return;\n }\n // If currentTime is not buffered, clear the back buffer so that we can backtrack as much as needed\n if (!BufferHelper.isBuffered(media, media.currentTime)) {\n this.flushMainBuffer(0, frag.start);\n return;\n }\n // Remove back-buffer without interrupting playback to allow back tracking\n const currentTime = media.currentTime;\n const bufferInfo = BufferHelper.bufferInfo(media, currentTime, 0);\n const fragDuration = frag.duration;\n const segmentFraction = Math.min(\n this.config.maxFragLookUpTolerance * 2,\n fragDuration * 0.25,\n );\n const start = Math.max(\n Math.min(frag.start - segmentFraction, bufferInfo.end - segmentFraction),\n currentTime + segmentFraction,\n );\n if (frag.start - start > segmentFraction) {\n this.flushMainBuffer(start, frag.start);\n }\n }\n\n protected getFwdBufferInfo(\n bufferable: Bufferable | null,\n type: PlaylistLevelType,\n ): BufferInfo | null {\n const pos = this.getLoadPosition();\n if (!Number.isFinite(pos)) {\n return null;\n }\n return this.getFwdBufferInfoAtPos(bufferable, pos, type);\n }\n\n protected getFwdBufferInfoAtPos(\n bufferable: Bufferable | null,\n pos: number,\n type: PlaylistLevelType,\n ): BufferInfo | null {\n const {\n config: { maxBufferHole },\n } = this;\n const bufferInfo = BufferHelper.bufferInfo(bufferable, pos, maxBufferHole);\n // Workaround flaw in getting forward buffer when maxBufferHole is smaller than gap at current pos\n if (bufferInfo.len === 0 && bufferInfo.nextStart !== undefined) {\n const bufferedFragAtPos = this.fragmentTracker.getBufferedFrag(pos, type);\n if (bufferedFragAtPos && bufferInfo.nextStart < bufferedFragAtPos.end) {\n return BufferHelper.bufferInfo(\n bufferable,\n pos,\n Math.max(bufferInfo.nextStart, maxBufferHole),\n );\n }\n }\n return bufferInfo;\n }\n\n protected getMaxBufferLength(levelBitrate?: number): number {\n const { config } = this;\n let maxBufLen;\n if (levelBitrate) {\n maxBufLen = Math.max(\n (8 * config.maxBufferSize) / levelBitrate,\n config.maxBufferLength,\n );\n } else {\n maxBufLen = config.maxBufferLength;\n }\n return Math.min(maxBufLen, config.maxMaxBufferLength);\n }\n\n protected reduceMaxBufferLength(threshold: number, fragDuration: number) {\n const config = this.config;\n const minLength = Math.max(\n Math.min(threshold - fragDuration, config.maxBufferLength),\n fragDuration,\n );\n const reducedLength = Math.max(\n threshold - fragDuration * 3,\n config.maxMaxBufferLength / 2,\n minLength,\n );\n if (reducedLength >= minLength) {\n // reduce max buffer length as it might be too high. we do this to avoid loop flushing ...\n config.maxMaxBufferLength = reducedLength;\n this.warn(`Reduce max buffer length to ${reducedLength}s`);\n return true;\n }\n return false;\n }\n\n protected getAppendedFrag(\n position: number,\n playlistType: PlaylistLevelType = PlaylistLevelType.MAIN,\n ): Fragment | null {\n const fragOrPart = this.fragmentTracker.getAppendedFrag(\n position,\n PlaylistLevelType.MAIN,\n );\n if (fragOrPart && 'fragment' in fragOrPart) {\n return fragOrPart.fragment;\n }\n return fragOrPart;\n }\n\n protected getNextFragment(\n pos: number,\n levelDetails: LevelDetails,\n ): Fragment | null {\n const fragments = levelDetails.fragments;\n const fragLen = fragments.length;\n\n if (!fragLen) {\n return null;\n }\n\n // find fragment index, contiguous with end of buffer position\n const { config } = this;\n const start = fragments[0].start;\n let frag;\n\n if (levelDetails.live) {\n const initialLiveManifestSize = config.initialLiveManifestSize;\n if (fragLen < initialLiveManifestSize) {\n this.warn(\n `Not enough fragments to start playback (have: ${fragLen}, need: ${initialLiveManifestSize})`,\n );\n return null;\n }\n // The real fragment start times for a live stream are only known after the PTS range for that level is known.\n // In order to discover the range, we load the best matching fragment for that level and demux it.\n // Do not load using live logic if the starting frag is requested - we want to use getFragmentAtPosition() so that\n // we get the fragment matching that start time\n if (\n (!levelDetails.PTSKnown &&\n !this.startFragRequested &&\n this.startPosition === -1) ||\n pos < start\n ) {\n frag = this.getInitialLiveFragment(levelDetails, fragments);\n this.startPosition = this.nextLoadPosition = frag\n ? this.hls.liveSyncPosition || frag.start\n : pos;\n }\n } else if (pos <= start) {\n // VoD playlist: if loadPosition before start of playlist, load first fragment\n frag = fragments[0];\n }\n\n // If we haven't run into any special cases already, just load the fragment most closely matching the requested position\n if (!frag) {\n const end = config.lowLatencyMode\n ? levelDetails.partEnd\n : levelDetails.fragmentEnd;\n frag = this.getFragmentAtPosition(pos, end, levelDetails);\n }\n\n return this.mapToInitFragWhenRequired(frag);\n }\n\n protected isLoopLoading(frag: Fragment, targetBufferTime: number): boolean {\n const trackerState = this.fragmentTracker.getState(frag);\n return (\n (trackerState === FragmentState.OK ||\n (trackerState === FragmentState.PARTIAL && !!frag.gap)) &&\n this.nextLoadPosition > targetBufferTime\n );\n }\n\n protected getNextFragmentLoopLoading(\n frag: Fragment,\n levelDetails: LevelDetails,\n bufferInfo: BufferInfo,\n playlistType: PlaylistLevelType,\n maxBufLen: number,\n ): Fragment | null {\n const gapStart = frag.gap;\n const nextFragment = this.getNextFragment(\n this.nextLoadPosition,\n levelDetails,\n );\n if (nextFragment === null) {\n return nextFragment;\n }\n frag = nextFragment;\n if (gapStart && frag && !frag.gap && bufferInfo.nextStart) {\n // Media buffered after GAP tags should not make the next buffer timerange exceed forward buffer length\n const nextbufferInfo = this.getFwdBufferInfoAtPos(\n this.mediaBuffer ? this.mediaBuffer : this.media,\n bufferInfo.nextStart,\n playlistType,\n );\n if (\n nextbufferInfo !== null &&\n bufferInfo.len + nextbufferInfo.len >= maxBufLen\n ) {\n // Returning here might result in not finding an audio and video candiate to skip to\n this.log(\n `buffer full after gaps in \"${playlistType}\" playlist starting at sn: ${frag.sn}`,\n );\n return null;\n }\n }\n return frag;\n }\n\n mapToInitFragWhenRequired(frag: Fragment | null): typeof frag {\n // If an initSegment is present, it must be buffered first\n if (frag?.initSegment && !frag?.initSegment.data && !this.bitrateTest) {\n return frag.initSegment;\n }\n\n return frag;\n }\n\n getNextPart(\n partList: Part[],\n frag: Fragment,\n targetBufferTime: number,\n ): number {\n let nextPart = -1;\n let contiguous = false;\n let independentAttrOmitted = true;\n for (let i = 0, len = partList.length; i < len; i++) {\n const part = partList[i];\n independentAttrOmitted = independentAttrOmitted && !part.independent;\n if (nextPart > -1 && targetBufferTime < part.start) {\n break;\n }\n const loaded = part.loaded;\n if (loaded) {\n nextPart = -1;\n } else if (\n (contiguous || part.independent || independentAttrOmitted) &&\n part.fragment === frag\n ) {\n nextPart = i;\n }\n contiguous = loaded;\n }\n return nextPart;\n }\n\n private loadedEndOfParts(\n partList: Part[],\n targetBufferTime: number,\n ): boolean {\n const lastPart = partList[partList.length - 1];\n return lastPart && targetBufferTime > lastPart.start && lastPart.loaded;\n }\n\n /*\n This method is used find the best matching first fragment for a live playlist. This fragment is used to calculate the\n \"sliding\" of the playlist, which is its offset from the start of playback. After sliding we can compute the real\n start and end times for each fragment in the playlist (after which this method will not need to be called).\n */\n protected getInitialLiveFragment(\n levelDetails: LevelDetails,\n fragments: Array<Fragment>,\n ): Fragment | null {\n const fragPrevious = this.fragPrevious;\n let frag: Fragment | null = null;\n if (fragPrevious) {\n if (levelDetails.hasProgramDateTime) {\n // Prefer using PDT, because it can be accurate enough to choose the correct fragment without knowing the level sliding\n this.log(\n `Live playlist, switching playlist, load frag with same PDT: ${fragPrevious.programDateTime}`,\n );\n frag = findFragmentByPDT(\n fragments,\n fragPrevious.endProgramDateTime,\n this.config.maxFragLookUpTolerance,\n );\n }\n if (!frag) {\n // SN does not need to be accurate between renditions, but depending on the packaging it may be so.\n const targetSN = (fragPrevious.sn as number) + 1;\n if (\n targetSN >= levelDetails.startSN &&\n targetSN <= levelDetails.endSN\n ) {\n const fragNext = fragments[targetSN - levelDetails.startSN];\n // Ensure that we're staying within the continuity range, since PTS resets upon a new range\n if (fragPrevious.cc === fragNext.cc) {\n frag = fragNext;\n this.log(\n `Live playlist, switching playlist, load frag with next SN: ${\n frag!.sn\n }`,\n );\n }\n }\n // It's important to stay within the continuity range if available; otherwise the fragments in the playlist\n // will have the wrong start times\n if (!frag) {\n frag = findFragWithCC(fragments, fragPrevious.cc);\n if (frag) {\n this.log(\n `Live playlist, switching playlist, load frag with same CC: ${frag.sn}`,\n );\n }\n }\n }\n } else {\n // Find a new start fragment when fragPrevious is null\n const liveStart = this.hls.liveSyncPosition;\n if (liveStart !== null) {\n frag = this.getFragmentAtPosition(\n liveStart,\n this.bitrateTest ? levelDetails.fragmentEnd : levelDetails.edge,\n levelDetails,\n );\n }\n }\n\n return frag;\n }\n\n /*\n This method finds the best matching fragment given the provided position.\n */\n protected getFragmentAtPosition(\n bufferEnd: number,\n end: number,\n levelDetails: LevelDetails,\n ): Fragment | null {\n const { config } = this;\n let { fragPrevious } = this;\n let { fragments, endSN } = levelDetails;\n const { fragmentHint } = levelDetails;\n const { maxFragLookUpTolerance } = config;\n const partList = levelDetails.partList;\n\n const loadingParts = !!(\n config.lowLatencyMode &&\n partList?.length &&\n fragmentHint\n );\n if (loadingParts && fragmentHint && !this.bitrateTest) {\n // Include incomplete fragment with parts at end\n fragments = fragments.concat(fragmentHint);\n endSN = fragmentHint.sn as number;\n }\n\n let frag;\n if (bufferEnd < end) {\n const lookupTolerance =\n bufferEnd > end - maxFragLookUpTolerance ? 0 : maxFragLookUpTolerance;\n // Remove the tolerance if it would put the bufferEnd past the actual end of stream\n // Uses buffer and sequence number to calculate switch segment (required if using EXT-X-DISCONTINUITY-SEQUENCE)\n frag = findFragmentByPTS(\n fragPrevious,\n fragments,\n bufferEnd,\n lookupTolerance,\n );\n } else {\n // reach end of playlist\n frag = fragments[fragments.length - 1];\n }\n\n if (frag) {\n const curSNIdx = frag.sn - levelDetails.startSN;\n // Move fragPrevious forward to support forcing the next fragment to load\n // when the buffer catches up to a previously buffered range.\n const fragState = this.fragmentTracker.getState(frag);\n if (\n fragState === FragmentState.OK ||\n (fragState === FragmentState.PARTIAL && frag.gap)\n ) {\n fragPrevious = frag;\n }\n if (\n fragPrevious &&\n frag.sn === fragPrevious.sn &&\n (!loadingParts || partList[0].fragment.sn > frag.sn)\n ) {\n // Force the next fragment to load if the previous one was already selected. This can occasionally happen with\n // non-uniform fragment durations\n const sameLevel = fragPrevious && frag.level === fragPrevious.level;\n if (sameLevel) {\n const nextFrag = fragments[curSNIdx + 1];\n if (\n frag.sn < endSN &&\n this.fragmentTracker.getState(nextFrag) !== FragmentState.OK\n ) {\n frag = nextFrag;\n } else {\n frag = null;\n }\n }\n }\n }\n return frag;\n }\n\n protected synchronizeToLiveEdge(levelDetails: LevelDetails) {\n const { config, media } = this;\n if (!media) {\n return;\n }\n const liveSyncPosition = this.hls.liveSyncPosition;\n const currentTime = media.currentTime;\n const start = levelDetails.fragments[0].start;\n const end = levelDetails.edge;\n const withinSlidingWindow =\n currentTime >= start - config.maxFragLookUpTolerance &&\n currentTime <= end;\n // Continue if we can seek forward to sync position or if current time is outside of sliding window\n if (\n liveSyncPosition !== null &&\n media.duration > liveSyncPosition &&\n (currentTime < liveSyncPosition || !withinSlidingWindow)\n ) {\n // Continue if buffer is starving or if current time is behind max latency\n const maxLatency =\n config.liveMaxLatencyDuration !== undefined\n ? config.liveMaxLatencyDuration\n : config.liveMaxLatencyDurationCount * levelDetails.targetduration;\n if (\n (!withinSlidingWindow && media.readyState < 4) ||\n currentTime < end - maxLatency\n ) {\n if (!this.loadedmetadata) {\n this.nextLoadPosition = liveSyncPosition;\n }\n // Only seek if ready and there is not a significant forward buffer available for playback\n if (media.readyState) {\n this.warn(\n `Playback: ${currentTime.toFixed(\n 3,\n )} is located too far from the end of live sliding playlist: ${end}, reset currentTime to : ${liveSyncPosition.toFixed(\n 3,\n )}`,\n );\n media.currentTime = liveSyncPosition;\n }\n }\n }\n }\n\n protected alignPlaylists(\n details: LevelDetails,\n previousDetails: LevelDetails | undefined,\n switchDetails: LevelDetails | undefined,\n ): number {\n // FIXME: If not for `shouldAlignOnDiscontinuities` requiring fragPrevious.cc,\n // this could all go in level-helper mergeDetails()\n const length = details.fragments.length;\n if (!length) {\n this.warn(`No fragments in live playlist`);\n return 0;\n }\n const slidingStart = details.fragments[0].start;\n const firstLevelLoad = !previousDetails;\n const aligned = details.alignedSliding && Number.isFinite(slidingStart);\n if (firstLevelLoad || (!aligned && !slidingStart)) {\n const { fragPrevious } = this;\n alignStream(fragPrevious, switchDetails, details);\n const alignedSlidingStart = details.fragments[0].start;\n this.log(\n `Live playlist sliding: ${alignedSlidingStart.toFixed(2)} start-sn: ${\n previousDetails ? previousDetails.startSN : 'na'\n }->${details.startSN} prev-sn: ${\n fragPrevious ? fragPrevious.sn : 'na'\n } fragments: ${length}`,\n );\n return alignedSlidingStart;\n }\n return slidingStart;\n }\n\n protected waitForCdnTuneIn(details: LevelDetails) {\n // Wait for Low-Latency CDN Tune-in to get an updated playlist\n const advancePartLimit = 3;\n return (\n details.live &&\n details.canBlockReload &&\n details.partTarget &&\n details.tuneInGoal >\n Math.max(details.partHoldBack, details.partTarget * advancePartLimit)\n );\n }\n\n protected setStartPosition(details: LevelDetails, sliding: number) {\n // compute start position if set to -1. use it straight away if value is defined\n let startPosition = this.startPosition;\n if (startPosition < sliding) {\n startPosition = -1;\n }\n if (startPosition === -1 || this.lastCurrentTime === -1) {\n // Use Playlist EXT-X-START:TIME-OFFSET when set\n // Prioritize Multivariant Playlist offset so that main, audio, and subtitle stream-controller start times match\n const offsetInMultivariantPlaylist = this.startTimeOffset !== null;\n const startTimeOffset = offsetInMultivariantPlaylist\n ? this.startTimeOffset\n : details.startTimeOffset;\n if (startTimeOffset !== null && Number.isFinite(startTimeOffset)) {\n startPosition = sliding + startTimeOffset;\n if (startTimeOffset < 0) {\n startPosition += details.totalduration;\n }\n startPosition = Math.min(\n Math.max(sliding, startPosition),\n sliding + details.totalduration,\n );\n this.log(\n `Start time offset ${startTimeOffset} found in ${\n offsetInMultivariantPlaylist ? 'multivariant' : 'media'\n } playlist, adjust startPosition to ${startPosition}`,\n );\n this.startPosition = startPosition;\n } else if (details.live) {\n // Leave this.startPosition at -1, so that we can use `getInitialLiveFragment` logic when startPosition has\n // not been specified via the config or an as an argument to startLoad (#3736).\n startPosition = this.hls.liveSyncPosition || sliding;\n } else {\n this.startPosition = startPosition = 0;\n }\n this.lastCurrentTime = startPosition;\n }\n this.nextLoadPosition = startPosition;\n }\n\n protected getLoadPosition(): number {\n const { media } = this;\n // if we have not yet loaded any fragment, start loading from start position\n let pos = 0;\n if (this.loadedmetadata && media) {\n pos = media.currentTime;\n } else if (this.nextLoadPosition) {\n pos = this.nextLoadPosition;\n }\n\n return pos;\n }\n\n private handleFragLoadAborted(frag: Fragment, part: Part | undefined) {\n if (this.transmuxer && frag.sn !== 'initSegment' && frag.stats.aborted) {\n this.warn(\n `Fragment ${frag.sn}${part ? ' part ' + part.index : ''} of level ${\n frag.level\n } was aborted`,\n );\n this.resetFragmentLoading(frag);\n }\n }\n\n protected resetFragmentLoading(frag: Fragment) {\n if (\n !this.fragCurrent ||\n (!this.fragContextChanged(frag) &&\n this.state !== State.FRAG_LOADING_WAITING_RETRY)\n ) {\n this.state = State.IDLE;\n }\n }\n\n protected onFragmentOrKeyLoadError(\n filterType: PlaylistLevelType,\n data: ErrorData,\n ) {\n if (data.chunkMeta && !data.frag) {\n const context = this.getCurrentContext(data.chunkMeta);\n if (context) {\n data.frag = context.frag;\n }\n }\n const frag = data.frag;\n // Handle frag error related to caller's filterType\n if (!frag || frag.type !== filterType || !this.levels) {\n return;\n }\n if (this.fragContextChanged(frag)) {\n this.warn(\n `Frag load error must match current frag to retry ${frag.url} > ${this.fragCurrent?.url}`,\n );\n return;\n }\n const gapTagEncountered = data.details === ErrorDetails.FRAG_GAP;\n if (gapTagEncountered) {\n this.fragmentTracker.fragBuffered(frag, true);\n }\n // keep retrying until the limit will be reached\n const errorAction = data.errorAction;\n const { action, retryCount = 0, retryConfig } = errorAction || {};\n if (\n errorAction &&\n action === NetworkErrorAction.RetryRequest &&\n retryConfig\n ) {\n this.resetStartWhenNotLoaded(this.levelLastLoaded);\n const delay = getRetryDelay(retryConfig, retryCount);\n this.warn(\n `Fragment ${frag.sn} of ${filterType} ${frag.level} errored with ${\n data.details\n }, retrying loading ${retryCount + 1}/${\n retryConfig.maxNumRetry\n } in ${delay}ms`,\n );\n errorAction.resolved = true;\n this.retryDate = self.performance.now() + delay;\n this.state = State.FRAG_LOADING_WAITING_RETRY;\n } else if (retryConfig && errorAction) {\n this.resetFragmentErrors(filterType);\n if (retryCount < retryConfig.maxNumRetry) {\n // Network retry is skipped when level switch is preferred\n if (\n !gapTagEncountered &&\n action !== NetworkErrorAction.RemoveAlternatePermanently\n ) {\n errorAction.resolved = true;\n }\n } else {\n logger.warn(\n `${data.details} reached or exceeded max retry (${retryCount})`,\n );\n return;\n }\n } else if (\n errorAction?.action === NetworkErrorAction.SendAlternateToPenaltyBox\n ) {\n this.state = State.WAITING_LEVEL;\n } else {\n this.state = State.ERROR;\n }\n // Perform next async tick sooner to speed up error action resolution\n this.tickImmediate();\n }\n\n protected reduceLengthAndFlushBuffer(data: ErrorData): boolean {\n // if in appending state\n if (this.state === State.PARSING || this.state === State.PARSED) {\n const frag = data.frag;\n const playlistType = data.parent as PlaylistLevelType;\n const bufferedInfo = this.getFwdBufferInfo(\n this.mediaBuffer,\n playlistType,\n );\n // 0.5 : tolerance needed as some browsers stalls playback before reaching buffered end\n // reduce max buf len if current position is buffered\n const buffered = bufferedInfo && bufferedInfo.len > 0.5;\n if (buffered) {\n this.reduceMaxBufferLength(bufferedInfo.len, frag?.duration || 10);\n }\n const flushBuffer = !buffered;\n if (flushBuffer) {\n // current position is not buffered, but browser is still complaining about buffer full error\n // this happens on IE/Edge, refer to https://github.com/video-dev/hls.js/pull/708\n // in that case flush the whole audio buffer to recover\n this.warn(\n `Buffer full error while media.currentTime is not buffered, flush ${playlistType} buffer`,\n );\n }\n if (frag) {\n this.fragmentTracker.removeFragment(frag);\n this.nextLoadPosition = frag.start;\n }\n this.resetLoadingState();\n return flushBuffer;\n }\n return false;\n }\n\n protected resetFragmentErrors(filterType: PlaylistLevelType) {\n if (filterType === PlaylistLevelType.AUDIO) {\n // Reset current fragment since audio track audio is essential and may not have a fail-over track\n this.fragCurrent = null;\n }\n // Fragment errors that result in a level switch or redundant fail-over\n // should reset the stream controller state to idle\n if (!this.loadedmetadata) {\n this.startFragRequested = false;\n }\n if (this.state !== State.STOPPED) {\n this.state = State.IDLE;\n }\n }\n\n protected afterBufferFlushed(\n media: Bufferable,\n bufferType: SourceBufferName,\n playlistType: PlaylistLevelType,\n ) {\n if (!media) {\n return;\n }\n // After successful buffer flushing, filter flushed fragments from bufferedFrags use mediaBuffered instead of media\n // (so that we will check against video.buffered ranges in case of alt audio track)\n const bufferedTimeRanges = BufferHelper.getBuffered(media);\n this.fragmentTracker.detectEvictedFragments(\n bufferType,\n bufferedTimeRanges,\n playlistType,\n );\n if (this.state === State.ENDED) {\n this.resetLoadingState();\n }\n }\n\n protected resetLoadingState() {\n this.log('Reset loading state');\n this.fragCurrent = null;\n this.fragPrevious = null;\n this.state = State.IDLE;\n }\n\n protected resetStartWhenNotLoaded(level: Level | null): void {\n // if loadedmetadata is not set, it means that first frag request failed\n // in that case, reset startFragRequested flag\n if (!this.loadedmetadata) {\n this.startFragRequested = false;\n const details = level ? level.details : null;\n if (details?.live) {\n // Update the start position and return to IDLE to recover live start\n this.startPosition = -1;\n this.setStartPosition(details, 0);\n this.resetLoadingState();\n } else {\n this.nextLoadPosition = this.startPosition;\n }\n }\n }\n\n protected resetWhenMissingContext(chunkMeta: ChunkMetadata) {\n this.warn(\n `The loading context changed while buffering fragment ${chunkMeta.sn} of level ${chunkMeta.level}. This chunk will not be buffered.`,\n );\n this.removeUnbufferedFrags();\n this.resetStartWhenNotLoaded(this.levelLastLoaded);\n this.resetLoadingState();\n }\n\n protected removeUnbufferedFrags(start: number = 0) {\n this.fragmentTracker.removeFragmentsInRange(\n start,\n Infinity,\n this.playlistType,\n false,\n true,\n );\n }\n\n private updateLevelTiming(\n frag: Fragment,\n part: Part | null,\n level: Level,\n partial: boolean,\n ) {\n const details = level.details as LevelDetails;\n if (!details) {\n this.warn('level.details undefined');\n return;\n }\n const parsed = Object.keys(frag.elementaryStreams).reduce(\n (result, type) => {\n const info = frag.elementaryStreams[type];\n if (info) {\n const parsedDuration = info.endPTS - info.startPTS;\n if (parsedDuration <= 0) {\n // Destroy the transmuxer after it's next time offset failed to advance because duration was <= 0.\n // The new transmuxer will be configured with a time offset matching the next fragment start,\n // preventing the timeline from shifting.\n this.warn(\n `Could not parse fragment ${frag.sn} ${type} duration reliably (${parsedDuration})`,\n );\n return result || false;\n }\n const drift = partial\n ? 0\n : updateFragPTSDTS(\n details,\n frag,\n info.startPTS,\n info.endPTS,\n info.startDTS,\n info.endDTS,\n );\n this.hls.trigger(Events.LEVEL_PTS_UPDATED, {\n details,\n level,\n drift,\n type,\n frag,\n start: info.startPTS,\n end: info.endPTS,\n });\n return true;\n }\n return result;\n },\n false,\n );\n if (!parsed && this.transmuxer?.error === null) {\n const error = new Error(\n `Found no media in fragment ${frag.sn} of level ${frag.level} resetting transmuxer to fallback to playlist timing`,\n );\n if (level.fragmentError === 0) {\n // Mark and track the odd empty segment as a gap to avoid reloading\n level.fragmentError++;\n frag.gap = true;\n this.fragmentTracker.removeFragment(frag);\n this.fragmentTracker.fragBuffered(frag, true);\n }\n this.warn(error.message);\n this.hls.trigger(Events.ERROR, {\n type: ErrorTypes.MEDIA_ERROR,\n details: ErrorDetails.FRAG_PARSING_ERROR,\n fatal: false,\n error,\n frag,\n reason: `Found no media in msn ${frag.sn} of level \"${level.url}\"`,\n });\n if (!this.hls) {\n return;\n }\n this.resetTransmuxer();\n // For this error fallthrough. Marking parsed will allow advancing to next fragment.\n }\n this.state = State.PARSED;\n this.hls.trigger(Events.FRAG_PARSED, { frag, part });\n }\n\n protected resetTransmuxer() {\n if (this.transmuxer) {\n this.transmuxer.destroy();\n this.transmuxer = null;\n }\n }\n\n protected recoverWorkerError(data: ErrorData) {\n if (data.event === 'demuxerWorker') {\n this.fragmentTracker.removeAllFragments();\n this.resetTransmuxer();\n this.resetStartWhenNotLoaded(this.levelLastLoaded);\n this.resetLoadingState();\n }\n }\n\n set state(nextState) {\n const previousState = this._state;\n if (previousState !== nextState) {\n this._state = nextState;\n this.log(`${previousState}->${nextState}`);\n }\n }\n\n get state() {\n return this._state;\n }\n}\n","/**\n * TimeRanges to string helper\n */\n\nconst TimeRanges = {\n toString: function (r: TimeRanges) {\n let log = '';\n const len = r.length;\n for (let i = 0; i < len; i++) {\n log += `[${r.start(i).toFixed(3)}-${r.end(i).toFixed(3)}]`;\n }\n\n return log;\n },\n};\n\nexport default TimeRanges;\n","export default class ChunkCache {\n private chunks: Array<Uint8Array> = [];\n public dataLength: number = 0;\n\n push(chunk: Uint8Array) {\n this.chunks.push(chunk);\n this.dataLength += chunk.length;\n }\n\n flush(): Uint8Array {\n const { chunks, dataLength } = this;\n let result;\n if (!chunks.length) {\n return new Uint8Array(0);\n } else if (chunks.length === 1) {\n result = chunks[0];\n } else {\n result = concatUint8Arrays(chunks, dataLength);\n }\n this.reset();\n return result;\n }\n\n reset() {\n this.chunks.length = 0;\n this.dataLength = 0;\n }\n}\n\nfunction concatUint8Arrays(\n chunks: Array<Uint8Array>,\n dataLength: number,\n): Uint8Array {\n const result = new Uint8Array(dataLength);\n let offset = 0;\n for (let i = 0; i < chunks.length; i++) {\n const chunk = chunks[i];\n result.set(chunk, offset);\n offset += chunk.length;\n }\n return result;\n}\n","import type { DemuxedTrack } from '../types/demuxer';\n\nexport function dummyTrack(type = '', inputTimeScale = 90000): DemuxedTrack {\n return {\n type,\n id: -1,\n pid: -1,\n inputTimeScale,\n sequenceNumber: -1,\n samples: [],\n dropped: 0,\n };\n}\n","import * as ID3 from '../id3';\nimport {\n DemuxerResult,\n Demuxer,\n DemuxedAudioTrack,\n AudioFrame,\n DemuxedMetadataTrack,\n DemuxedVideoTrackBase,\n DemuxedUserdataTrack,\n KeyData,\n MetadataSchema,\n} from '../../types/demuxer';\nimport { dummyTrack } from '../dummy-demuxed-track';\nimport { appendUint8Array } from '../../utils/mp4-tools';\nimport { sliceUint8 } from '../../utils/typed-array';\nimport { RationalTimestamp } from '../../utils/timescale-conversion';\n\nclass BaseAudioDemuxer implements Demuxer {\n protected _audioTrack!: DemuxedAudioTrack;\n protected _id3Track!: DemuxedMetadataTrack;\n protected frameIndex: number = 0;\n protected cachedData: Uint8Array | null = null;\n protected basePTS: number | null = null;\n protected initPTS: RationalTimestamp | null = null;\n protected lastPTS: number | null = null;\n\n resetInitSegment(\n initSegment: Uint8Array | undefined,\n audioCodec: string | undefined,\n videoCodec: string | undefined,\n trackDuration: number,\n ) {\n this._id3Track = {\n type: 'id3',\n id: 3,\n pid: -1,\n inputTimeScale: 90000,\n sequenceNumber: 0,\n samples: [],\n dropped: 0,\n };\n }\n\n resetTimeStamp(deaultTimestamp: RationalTimestamp | null) {\n this.initPTS = deaultTimestamp;\n this.resetContiguity();\n }\n\n resetContiguity(): void {\n this.basePTS = null;\n this.lastPTS = null;\n this.frameIndex = 0;\n }\n\n canParse(data: Uint8Array, offset: number): boolean {\n return false;\n }\n\n appendFrame(\n track: DemuxedAudioTrack,\n data: Uint8Array,\n offset: number,\n ): AudioFrame | void {}\n\n // feed incoming data to the front of the parsing pipeline\n demux(data: Uint8Array, timeOffset: number): DemuxerResult {\n if (this.cachedData) {\n data = appendUint8Array(this.cachedData, data);\n this.cachedData = null;\n }\n\n let id3Data: Uint8Array | undefined = ID3.getID3Data(data, 0);\n let offset = id3Data ? id3Data.length : 0;\n let lastDataIndex;\n const track = this._audioTrack;\n const id3Track = this._id3Track;\n const timestamp = id3Data ? ID3.getTimeStamp(id3Data) : undefined;\n const length = data.length;\n\n if (\n this.basePTS === null ||\n (this.frameIndex === 0 && Number.isFinite(timestamp))\n ) {\n this.basePTS = initPTSFn(timestamp, timeOffset, this.initPTS);\n this.lastPTS = this.basePTS;\n }\n\n if (this.lastPTS === null) {\n this.lastPTS = this.basePTS;\n }\n\n // more expressive than alternative: id3Data?.length\n if (id3Data && id3Data.length > 0) {\n id3Track.samples.push({\n pts: this.lastPTS,\n dts: this.lastPTS,\n data: id3Data,\n type: MetadataSchema.audioId3,\n duration: Number.POSITIVE_INFINITY,\n });\n }\n\n while (offset < length) {\n if (this.canParse(data, offset)) {\n const frame = this.appendFrame(track, data, offset);\n if (frame) {\n this.frameIndex++;\n this.lastPTS = frame.sample.pts;\n offset += frame.length;\n lastDataIndex = offset;\n } else {\n offset = length;\n }\n } else if (ID3.canParse(data, offset)) {\n // after a ID3.canParse, a call to ID3.getID3Data *should* always returns some data\n id3Data = ID3.getID3Data(data, offset)!;\n id3Track.samples.push({\n pts: this.lastPTS,\n dts: this.lastPTS,\n data: id3Data,\n type: MetadataSchema.audioId3,\n duration: Number.POSITIVE_INFINITY,\n });\n offset += id3Data.length;\n lastDataIndex = offset;\n } else {\n offset++;\n }\n if (offset === length && lastDataIndex !== length) {\n const partialData = sliceUint8(data, lastDataIndex);\n if (this.cachedData) {\n this.cachedData = appendUint8Array(this.cachedData, partialData);\n } else {\n this.cachedData = partialData;\n }\n }\n }\n\n return {\n audioTrack: track,\n videoTrack: dummyTrack() as DemuxedVideoTrackBase,\n id3Track,\n textTrack: dummyTrack() as DemuxedUserdataTrack,\n };\n }\n\n demuxSampleAes(\n data: Uint8Array,\n keyData: KeyData,\n timeOffset: number,\n ): Promise<DemuxerResult> {\n return Promise.reject(\n new Error(\n `[${this}] This demuxer does not support Sample-AES decryption`,\n ),\n );\n }\n\n flush(timeOffset: number): DemuxerResult {\n // Parse cache in case of remaining frames.\n const cachedData = this.cachedData;\n if (cachedData) {\n this.cachedData = null;\n this.demux(cachedData, 0);\n }\n\n return {\n audioTrack: this._audioTrack,\n videoTrack: dummyTrack() as DemuxedVideoTrackBase,\n id3Track: this._id3Track,\n textTrack: dummyTrack() as DemuxedUserdataTrack,\n };\n }\n\n destroy() {}\n}\n\n/**\n * Initialize PTS\n * <p>\n * use timestamp unless it is undefined, NaN or Infinity\n * </p>\n */\nexport const initPTSFn = (\n timestamp: number | undefined,\n timeOffset: number,\n initPTS: RationalTimestamp | null,\n): number => {\n if (Number.isFinite(timestamp as number)) {\n return timestamp! * 90;\n }\n const init90kHz = initPTS\n ? (initPTS.baseTime * 90000) / initPTS.timescale\n : 0;\n return timeOffset * 90000 + init90kHz;\n};\nexport default BaseAudioDemuxer;\n","/**\n * ADTS parser helper\n * @link https://wiki.multimedia.cx/index.php?title=ADTS\n */\nimport { logger } from '../../utils/logger';\nimport { ErrorTypes, ErrorDetails } from '../../errors';\nimport type { HlsEventEmitter } from '../../events';\nimport { Events } from '../../events';\nimport type {\n DemuxedAudioTrack,\n AudioFrame,\n AudioSample,\n} from '../../types/demuxer';\n\ntype AudioConfig = {\n config: number[];\n samplerate: number;\n channelCount: number;\n codec: string;\n manifestCodec: string;\n};\n\ntype FrameHeader = {\n headerLength: number;\n frameLength: number;\n};\n\nexport function getAudioConfig(\n observer: HlsEventEmitter,\n data: Uint8Array,\n offset: number,\n audioCodec: string,\n): AudioConfig | void {\n let adtsObjectType: number;\n let adtsExtensionSamplingIndex: number;\n let adtsChannelConfig: number;\n let config: number[];\n const userAgent = navigator.userAgent.toLowerCase();\n const manifestCodec = audioCodec;\n const adtsSamplingRates = [\n 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025,\n 8000, 7350,\n ];\n // byte 2\n adtsObjectType = ((data[offset + 2] & 0xc0) >>> 6) + 1;\n const adtsSamplingIndex = (data[offset + 2] & 0x3c) >>> 2;\n if (adtsSamplingIndex > adtsSamplingRates.length - 1) {\n const error = new Error(`invalid ADTS sampling index:${adtsSamplingIndex}`);\n observer.emit(Events.ERROR, Events.ERROR, {\n type: ErrorTypes.MEDIA_ERROR,\n details: ErrorDetails.FRAG_PARSING_ERROR,\n fatal: true,\n error,\n reason: error.message,\n });\n return;\n }\n adtsChannelConfig = (data[offset + 2] & 0x01) << 2;\n // byte 3\n adtsChannelConfig |= (data[offset + 3] & 0xc0) >>> 6;\n logger.log(\n `manifest codec:${audioCodec}, ADTS type:${adtsObjectType}, samplingIndex:${adtsSamplingIndex}`,\n );\n // firefox: freq less than 24kHz = AAC SBR (HE-AAC)\n if (/firefox/i.test(userAgent)) {\n if (adtsSamplingIndex >= 6) {\n adtsObjectType = 5;\n config = new Array(4);\n // HE-AAC uses SBR (Spectral Band Replication) , high frequencies are constructed from low frequencies\n // there is a factor 2 between frame sample rate and output sample rate\n // multiply frequency by 2 (see table below, equivalent to substract 3)\n adtsExtensionSamplingIndex = adtsSamplingIndex - 3;\n } else {\n adtsObjectType = 2;\n config = new Array(2);\n adtsExtensionSamplingIndex = adtsSamplingIndex;\n }\n // Android : always use AAC\n } else if (userAgent.indexOf('android') !== -1) {\n adtsObjectType = 2;\n config = new Array(2);\n adtsExtensionSamplingIndex = adtsSamplingIndex;\n } else {\n /* for other browsers (Chrome/Vivaldi/Opera ...)\n always force audio type to be HE-AAC SBR, as some browsers do not support audio codec switch properly (like Chrome ...)\n */\n adtsObjectType = 5;\n config = new Array(4);\n // if (manifest codec is HE-AAC or HE-AACv2) OR (manifest codec not specified AND frequency less than 24kHz)\n if (\n (audioCodec &&\n (audioCodec.indexOf('mp4a.40.29') !== -1 ||\n audioCodec.indexOf('mp4a.40.5') !== -1)) ||\n (!audioCodec && adtsSamplingIndex >= 6)\n ) {\n // HE-AAC uses SBR (Spectral Band Replication) , high frequencies are constructed from low frequencies\n // there is a factor 2 between frame sample rate and output sample rate\n // multiply frequency by 2 (see table below, equivalent to substract 3)\n adtsExtensionSamplingIndex = adtsSamplingIndex - 3;\n } else {\n // if (manifest codec is AAC) AND (frequency less than 24kHz AND nb channel is 1) OR (manifest codec not specified and mono audio)\n // Chrome fails to play back with low frequency AAC LC mono when initialized with HE-AAC. This is not a problem with stereo.\n if (\n (audioCodec &&\n audioCodec.indexOf('mp4a.40.2') !== -1 &&\n ((adtsSamplingIndex >= 6 && adtsChannelConfig === 1) ||\n /vivaldi/i.test(userAgent))) ||\n (!audioCodec && adtsChannelConfig === 1)\n ) {\n adtsObjectType = 2;\n config = new Array(2);\n }\n adtsExtensionSamplingIndex = adtsSamplingIndex;\n }\n }\n /* refer to http://wiki.multimedia.cx/index.php?title=MPEG-4_Audio#Audio_Specific_Config\n ISO 14496-3 (AAC).pdf - Table 1.13 — Syntax of AudioSpecificConfig()\n Audio Profile / Audio Object Type\n 0: Null\n 1: AAC Main\n 2: AAC LC (Low Complexity)\n 3: AAC SSR (Scalable Sample Rate)\n 4: AAC LTP (Long Term Prediction)\n 5: SBR (Spectral Band Replication)\n 6: AAC Scalable\n sampling freq\n 0: 96000 Hz\n 1: 88200 Hz\n 2: 64000 Hz\n 3: 48000 Hz\n 4: 44100 Hz\n 5: 32000 Hz\n 6: 24000 Hz\n 7: 22050 Hz\n 8: 16000 Hz\n 9: 12000 Hz\n 10: 11025 Hz\n 11: 8000 Hz\n 12: 7350 Hz\n 13: Reserved\n 14: Reserved\n 15: frequency is written explictly\n Channel Configurations\n These are the channel configurations:\n 0: Defined in AOT Specifc Config\n 1: 1 channel: front-center\n 2: 2 channels: front-left, front-right\n */\n // audioObjectType = profile => profile, the MPEG-4 Audio Object Type minus 1\n config[0] = adtsObjectType << 3;\n // samplingFrequencyIndex\n config[0] |= (adtsSamplingIndex & 0x0e) >> 1;\n config[1] |= (adtsSamplingIndex & 0x01) << 7;\n // channelConfiguration\n config[1] |= adtsChannelConfig << 3;\n if (adtsObjectType === 5) {\n // adtsExtensionSamplingIndex\n config[1] |= (adtsExtensionSamplingIndex & 0x0e) >> 1;\n config[2] = (adtsExtensionSamplingIndex & 0x01) << 7;\n // adtsObjectType (force to 2, chrome is checking that object type is less than 5 ???\n // https://chromium.googlesource.com/chromium/src.git/+/master/media/formats/mp4/aac.cc\n config[2] |= 2 << 2;\n config[3] = 0;\n }\n return {\n config,\n samplerate: adtsSamplingRates[adtsSamplingIndex],\n channelCount: adtsChannelConfig,\n codec: 'mp4a.40.' + adtsObjectType,\n manifestCodec,\n };\n}\n\nexport function isHeaderPattern(data: Uint8Array, offset: number): boolean {\n return data[offset] === 0xff && (data[offset + 1] & 0xf6) === 0xf0;\n}\n\nexport function getHeaderLength(data: Uint8Array, offset: number): number {\n return data[offset + 1] & 0x01 ? 7 : 9;\n}\n\nexport function getFullFrameLength(data: Uint8Array, offset: number): number {\n return (\n ((data[offset + 3] & 0x03) << 11) |\n (data[offset + 4] << 3) |\n ((data[offset + 5] & 0xe0) >>> 5)\n );\n}\n\nexport function canGetFrameLength(data: Uint8Array, offset: number): boolean {\n return offset + 5 < data.length;\n}\n\nexport function isHeader(data: Uint8Array, offset: number): boolean {\n // Look for ADTS header | 1111 1111 | 1111 X00X | where X can be either 0 or 1\n // Layer bits (position 14 and 15) in header should be always 0 for ADTS\n // More info https://wiki.multimedia.cx/index.php?title=ADTS\n return offset + 1 < data.length && isHeaderPattern(data, offset);\n}\n\nexport function canParse(data: Uint8Array, offset: number): boolean {\n return (\n canGetFrameLength(data, offset) &&\n isHeaderPattern(data, offset) &&\n getFullFrameLength(data, offset) <= data.length - offset\n );\n}\n\nexport function probe(data: Uint8Array, offset: number): boolean {\n // same as isHeader but we also check that ADTS frame follows last ADTS frame\n // or end of data is reached\n if (isHeader(data, offset)) {\n // ADTS header Length\n const headerLength = getHeaderLength(data, offset);\n if (offset + headerLength >= data.length) {\n return false;\n }\n // ADTS frame Length\n const frameLength = getFullFrameLength(data, offset);\n if (frameLength <= headerLength) {\n return false;\n }\n\n const newOffset = offset + frameLength;\n return newOffset === data.length || isHeader(data, newOffset);\n }\n return false;\n}\n\nexport function initTrackConfig(\n track: DemuxedAudioTrack,\n observer: HlsEventEmitter,\n data: Uint8Array,\n offset: number,\n audioCodec: string,\n) {\n if (!track.samplerate) {\n const config = getAudioConfig(observer, data, offset, audioCodec);\n if (!config) {\n return;\n }\n track.config = config.config;\n track.samplerate = config.samplerate;\n track.channelCount = config.channelCount;\n track.codec = config.codec;\n track.manifestCodec = config.manifestCodec;\n logger.log(\n `parsed codec:${track.codec}, rate:${config.samplerate}, channels:${config.channelCount}`,\n );\n }\n}\n\nexport function getFrameDuration(samplerate: number): number {\n return (1024 * 90000) / samplerate;\n}\n\nexport function parseFrameHeader(\n data: Uint8Array,\n offset: number,\n): FrameHeader | void {\n // The protection skip bit tells us if we have 2 bytes of CRC data at the end of the ADTS header\n const headerLength = getHeaderLength(data, offset);\n if (offset + headerLength <= data.length) {\n // retrieve frame size\n const frameLength = getFullFrameLength(data, offset) - headerLength;\n if (frameLength > 0) {\n // logger.log(`AAC frame, offset/length/total/pts:${offset+headerLength}/${frameLength}/${data.byteLength}`);\n return { headerLength, frameLength };\n }\n }\n}\n\nexport function appendFrame(\n track: DemuxedAudioTrack,\n data: Uint8Array,\n offset: number,\n pts: number,\n frameIndex: number,\n): AudioFrame {\n const frameDuration = getFrameDuration(track.samplerate as number);\n const stamp = pts + frameIndex * frameDuration;\n const header = parseFrameHeader(data, offset);\n let unit: Uint8Array;\n if (header) {\n const { frameLength, headerLength } = header;\n const length = headerLength + frameLength;\n const missing = Math.max(0, offset + length - data.length);\n // logger.log(`AAC frame ${frameIndex}, pts:${stamp} length@offset/total: ${frameLength}@${offset+headerLength}/${data.byteLength} missing: ${missing}`);\n if (missing) {\n unit = new Uint8Array(length - headerLength);\n unit.set(data.subarray(offset + headerLength, data.length), 0);\n } else {\n unit = data.subarray(offset + headerLength, offset + length);\n }\n\n const sample: AudioSample = {\n unit,\n pts: stamp,\n };\n if (!missing) {\n track.samples.push(sample as AudioSample);\n }\n\n return { sample, length, missing };\n }\n // overflow incomplete header\n const length = data.length - offset;\n unit = new Uint8Array(length);\n unit.set(data.subarray(offset, data.length), 0);\n const sample: AudioSample = {\n unit,\n pts: stamp,\n };\n return { sample, length, missing: -1 };\n}\n","/**\n * MPEG parser helper\n */\nimport { DemuxedAudioTrack } from '../../types/demuxer';\n\nlet chromeVersion: number | null = null;\n\nconst BitratesMap = [\n 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 32, 48, 56,\n 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 32, 40, 48, 56, 64, 80,\n 96, 112, 128, 160, 192, 224, 256, 320, 32, 48, 56, 64, 80, 96, 112, 128, 144,\n 160, 176, 192, 224, 256, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144,\n 160,\n];\n\nconst SamplingRateMap = [\n 44100, 48000, 32000, 22050, 24000, 16000, 11025, 12000, 8000,\n];\n\nconst SamplesCoefficients = [\n // MPEG 2.5\n [\n 0, // Reserved\n 72, // Layer3\n 144, // Layer2\n 12, // Layer1\n ],\n // Reserved\n [\n 0, // Reserved\n 0, // Layer3\n 0, // Layer2\n 0, // Layer1\n ],\n // MPEG 2\n [\n 0, // Reserved\n 72, // Layer3\n 144, // Layer2\n 12, // Layer1\n ],\n // MPEG 1\n [\n 0, // Reserved\n 144, // Layer3\n 144, // Layer2\n 12, // Layer1\n ],\n];\n\nconst BytesInSlot = [\n 0, // Reserved\n 1, // Layer3\n 1, // Layer2\n 4, // Layer1\n];\n\nexport function appendFrame(\n track: DemuxedAudioTrack,\n data: Uint8Array,\n offset: number,\n pts: number,\n frameIndex: number,\n) {\n // Using http://www.datavoyage.com/mpgscript/mpeghdr.htm as a reference\n if (offset + 24 > data.length) {\n return;\n }\n\n const header = parseHeader(data, offset);\n if (header && offset + header.frameLength <= data.length) {\n const frameDuration = (header.samplesPerFrame * 90000) / header.sampleRate;\n const stamp = pts + frameIndex * frameDuration;\n const sample = {\n unit: data.subarray(offset, offset + header.frameLength),\n pts: stamp,\n dts: stamp,\n };\n\n track.config = [];\n track.channelCount = header.channelCount;\n track.samplerate = header.sampleRate;\n track.samples.push(sample);\n\n return { sample, length: header.frameLength, missing: 0 };\n }\n}\n\nexport function parseHeader(data: Uint8Array, offset: number) {\n const mpegVersion = (data[offset + 1] >> 3) & 3;\n const mpegLayer = (data[offset + 1] >> 1) & 3;\n const bitRateIndex = (data[offset + 2] >> 4) & 15;\n const sampleRateIndex = (data[offset + 2] >> 2) & 3;\n if (\n mpegVersion !== 1 &&\n bitRateIndex !== 0 &&\n bitRateIndex !== 15 &&\n sampleRateIndex !== 3\n ) {\n const paddingBit = (data[offset + 2] >> 1) & 1;\n const channelMode = data[offset + 3] >> 6;\n const columnInBitrates =\n mpegVersion === 3 ? 3 - mpegLayer : mpegLayer === 3 ? 3 : 4;\n const bitRate =\n BitratesMap[columnInBitrates * 14 + bitRateIndex - 1] * 1000;\n const columnInSampleRates =\n mpegVersion === 3 ? 0 : mpegVersion === 2 ? 1 : 2;\n const sampleRate =\n SamplingRateMap[columnInSampleRates * 3 + sampleRateIndex];\n const channelCount = channelMode === 3 ? 1 : 2; // If bits of channel mode are `11` then it is a single channel (Mono)\n const sampleCoefficient = SamplesCoefficients[mpegVersion][mpegLayer];\n const bytesInSlot = BytesInSlot[mpegLayer];\n const samplesPerFrame = sampleCoefficient * 8 * bytesInSlot;\n const frameLength =\n Math.floor((sampleCoefficient * bitRate) / sampleRate + paddingBit) *\n bytesInSlot;\n\n if (chromeVersion === null) {\n const userAgent = navigator.userAgent || '';\n const result = userAgent.match(/Chrome\\/(\\d+)/i);\n chromeVersion = result ? parseInt(result[1]) : 0;\n }\n const needChromeFix = !!chromeVersion && chromeVersion <= 87;\n\n if (\n needChromeFix &&\n mpegLayer === 2 &&\n bitRate >= 224000 &&\n channelMode === 0\n ) {\n // Work around bug in Chromium by setting channelMode to dual-channel (01) instead of stereo (00)\n data[offset + 3] = data[offset + 3] | 0x80;\n }\n\n return { sampleRate, channelCount, frameLength, samplesPerFrame };\n }\n}\n\nexport function isHeaderPattern(data: Uint8Array, offset: number): boolean {\n return (\n data[offset] === 0xff &&\n (data[offset + 1] & 0xe0) === 0xe0 &&\n (data[offset + 1] & 0x06) !== 0x00\n );\n}\n\nexport function isHeader(data: Uint8Array, offset: number): boolean {\n // Look for MPEG header | 1111 1111 | 111X XYZX | where X can be either 0 or 1 and Y or Z should be 1\n // Layer bits (position 14 and 15) in header should be always different from 0 (Layer I or Layer II or Layer III)\n // More info http://www.mp3-tech.org/programmer/frame_header.html\n return offset + 1 < data.length && isHeaderPattern(data, offset);\n}\n\nexport function canParse(data: Uint8Array, offset: number): boolean {\n const headerSize = 4;\n\n return isHeaderPattern(data, offset) && headerSize <= data.length - offset;\n}\n\nexport function probe(data: Uint8Array, offset: number): boolean {\n // same as isHeader but we also check that MPEG frame follows last MPEG frame\n // or end of data is reached\n if (offset + 1 < data.length && isHeaderPattern(data, offset)) {\n // MPEG header Length\n const headerLength = 4;\n // MPEG frame Length\n const header = parseHeader(data, offset);\n let frameLength = headerLength;\n if (header?.frameLength) {\n frameLength = header.frameLength;\n }\n\n const newOffset = offset + frameLength;\n return newOffset === data.length || isHeader(data, newOffset);\n }\n return false;\n}\n","/**\n * AAC demuxer\n */\nimport BaseAudioDemuxer from './base-audio-demuxer';\nimport * as ADTS from './adts';\nimport * as MpegAudio from './mpegaudio';\nimport { logger } from '../../utils/logger';\nimport * as ID3 from '../id3';\nimport type { HlsEventEmitter } from '../../events';\nimport type { HlsConfig } from '../../config';\n\nclass AACDemuxer extends BaseAudioDemuxer {\n private readonly observer: HlsEventEmitter;\n private readonly config: HlsConfig;\n\n constructor(observer, config) {\n super();\n this.observer = observer;\n this.config = config;\n }\n\n resetInitSegment(\n initSegment: Uint8Array | undefined,\n audioCodec: string | undefined,\n videoCodec: string | undefined,\n trackDuration: number,\n ) {\n super.resetInitSegment(initSegment, audioCodec, videoCodec, trackDuration);\n this._audioTrack = {\n container: 'audio/adts',\n type: 'audio',\n id: 2,\n pid: -1,\n sequenceNumber: 0,\n segmentCodec: 'aac',\n samples: [],\n manifestCodec: audioCodec,\n duration: trackDuration,\n inputTimeScale: 90000,\n dropped: 0,\n };\n }\n\n // Source for probe info - https://wiki.multimedia.cx/index.php?title=ADTS\n static probe(data: Uint8Array | undefined): boolean {\n if (!data) {\n return false;\n }\n\n // Check for the ADTS sync word\n // Look for ADTS header | 1111 1111 | 1111 X00X | where X can be either 0 or 1\n // Layer bits (position 14 and 15) in header should be always 0 for ADTS\n // More info https://wiki.multimedia.cx/index.php?title=ADTS\n const id3Data = ID3.getID3Data(data, 0);\n let offset = id3Data?.length || 0;\n\n if (MpegAudio.probe(data, offset)) {\n return false;\n }\n\n for (let length = data.length; offset < length; offset++) {\n if (ADTS.probe(data, offset)) {\n logger.log('ADTS sync word found !');\n return true;\n }\n }\n return false;\n }\n\n canParse(data, offset) {\n return ADTS.canParse(data, offset);\n }\n\n appendFrame(track, data, offset) {\n ADTS.initTrackConfig(\n track,\n this.observer,\n data,\n offset,\n track.manifestCodec,\n );\n const frame = ADTS.appendFrame(\n track,\n data,\n offset,\n this.basePTS as number,\n this.frameIndex,\n );\n if (frame && frame.missing === 0) {\n return frame;\n }\n }\n}\n\nexport default AACDemuxer;\n","/**\n * MP4 demuxer\n */\nimport {\n Demuxer,\n DemuxerResult,\n PassthroughTrack,\n DemuxedAudioTrack,\n DemuxedUserdataTrack,\n DemuxedMetadataTrack,\n KeyData,\n MetadataSchema,\n} from '../types/demuxer';\nimport {\n findBox,\n segmentValidRange,\n appendUint8Array,\n parseEmsg,\n parseSamples,\n parseInitSegment,\n RemuxerTrackIdConfig,\n hasMoofData,\n} from '../utils/mp4-tools';\nimport { dummyTrack } from './dummy-demuxed-track';\nimport type { HlsEventEmitter } from '../events';\nimport type { HlsConfig } from '../config';\n\nconst emsgSchemePattern = /\\/emsg[-/]ID3/i;\n\nclass MP4Demuxer implements Demuxer {\n private remainderData: Uint8Array | null = null;\n private timeOffset: number = 0;\n private config: HlsConfig;\n private videoTrack?: PassthroughTrack;\n private audioTrack?: DemuxedAudioTrack;\n private id3Track?: DemuxedMetadataTrack;\n private txtTrack?: DemuxedUserdataTrack;\n\n constructor(observer: HlsEventEmitter, config: HlsConfig) {\n this.config = config;\n }\n\n public resetTimeStamp() {}\n\n public resetInitSegment(\n initSegment: Uint8Array | undefined,\n audioCodec: string | undefined,\n videoCodec: string | undefined,\n trackDuration: number,\n ) {\n const videoTrack = (this.videoTrack = dummyTrack(\n 'video',\n 1,\n ) as PassthroughTrack);\n const audioTrack = (this.audioTrack = dummyTrack(\n 'audio',\n 1,\n ) as DemuxedAudioTrack);\n const captionTrack = (this.txtTrack = dummyTrack(\n 'text',\n 1,\n ) as DemuxedUserdataTrack);\n\n this.id3Track = dummyTrack('id3', 1) as DemuxedMetadataTrack;\n this.timeOffset = 0;\n\n if (!initSegment?.byteLength) {\n return;\n }\n const initData = parseInitSegment(initSegment);\n\n if (initData.video) {\n const { id, timescale, codec } = initData.video;\n videoTrack.id = id;\n videoTrack.timescale = captionTrack.timescale = timescale;\n videoTrack.codec = codec;\n }\n\n if (initData.audio) {\n const { id, timescale, codec } = initData.audio;\n audioTrack.id = id;\n audioTrack.timescale = timescale;\n audioTrack.codec = codec;\n }\n\n captionTrack.id = RemuxerTrackIdConfig.text;\n videoTrack.sampleDuration = 0;\n videoTrack.duration = audioTrack.duration = trackDuration;\n }\n\n public resetContiguity(): void {\n this.remainderData = null;\n }\n\n static probe(data: Uint8Array) {\n return hasMoofData(data);\n }\n\n public demux(data: Uint8Array, timeOffset: number): DemuxerResult {\n this.timeOffset = timeOffset;\n // Load all data into the avc track. The CMAF remuxer will look for the data in the samples object; the rest of the fields do not matter\n let videoSamples = data;\n const videoTrack = this.videoTrack as PassthroughTrack;\n const textTrack = this.txtTrack as DemuxedUserdataTrack;\n if (this.config.progressive) {\n // Split the bytestream into two ranges: one encompassing all data up until the start of the last moof, and everything else.\n // This is done to guarantee that we're sending valid data to MSE - when demuxing progressively, we have no guarantee\n // that the fetch loader gives us flush moof+mdat pairs. If we push jagged data to MSE, it will throw an exception.\n if (this.remainderData) {\n videoSamples = appendUint8Array(this.remainderData, data);\n }\n const segmentedData = segmentValidRange(videoSamples);\n this.remainderData = segmentedData.remainder;\n videoTrack.samples = segmentedData.valid || new Uint8Array();\n } else {\n videoTrack.samples = videoSamples;\n }\n\n const id3Track = this.extractID3Track(videoTrack, timeOffset);\n textTrack.samples = parseSamples(timeOffset, videoTrack);\n\n return {\n videoTrack,\n audioTrack: this.audioTrack as DemuxedAudioTrack,\n id3Track,\n textTrack: this.txtTrack as DemuxedUserdataTrack,\n };\n }\n\n public flush() {\n const timeOffset = this.timeOffset;\n const videoTrack = this.videoTrack as PassthroughTrack;\n const textTrack = this.txtTrack as DemuxedUserdataTrack;\n videoTrack.samples = this.remainderData || new Uint8Array();\n this.remainderData = null;\n\n const id3Track = this.extractID3Track(videoTrack, this.timeOffset);\n textTrack.samples = parseSamples(timeOffset, videoTrack);\n\n return {\n videoTrack,\n audioTrack: dummyTrack() as DemuxedAudioTrack,\n id3Track,\n textTrack: dummyTrack() as DemuxedUserdataTrack,\n };\n }\n\n private extractID3Track(\n videoTrack: PassthroughTrack,\n timeOffset: number,\n ): DemuxedMetadataTrack {\n const id3Track = this.id3Track as DemuxedMetadataTrack;\n if (videoTrack.samples.length) {\n const emsgs = findBox(videoTrack.samples, ['emsg']);\n if (emsgs) {\n emsgs.forEach((data: Uint8Array) => {\n const emsgInfo = parseEmsg(data);\n if (emsgSchemePattern.test(emsgInfo.schemeIdUri)) {\n const pts = Number.isFinite(emsgInfo.presentationTime)\n ? emsgInfo.presentationTime! / emsgInfo.timeScale\n : timeOffset +\n emsgInfo.presentationTimeDelta! / emsgInfo.timeScale;\n let duration =\n emsgInfo.eventDuration === 0xffffffff\n ? Number.POSITIVE_INFINITY\n : emsgInfo.eventDuration / emsgInfo.timeScale;\n // Safari takes anything <= 0.001 seconds and maps it to Infinity\n if (duration <= 0.001) {\n duration = Number.POSITIVE_INFINITY;\n }\n const payload = emsgInfo.payload;\n id3Track.samples.push({\n data: payload,\n len: payload.byteLength,\n dts: pts,\n pts: pts,\n type: MetadataSchema.emsg,\n duration: duration,\n });\n }\n });\n }\n }\n return id3Track;\n }\n\n demuxSampleAes(\n data: Uint8Array,\n keyData: KeyData,\n timeOffset: number,\n ): Promise<DemuxerResult> {\n return Promise.reject(\n new Error('The MP4 demuxer does not support SAMPLE-AES decryption'),\n );\n }\n\n destroy() {}\n}\n\nexport default MP4Demuxer;\n","export const getAudioBSID = (data: Uint8Array, offset: number): number => {\n // check the bsid to confirm ac-3 | ec-3\n let bsid = 0;\n let numBits = 5;\n offset += numBits;\n const temp = new Uint32Array(1); // unsigned 32 bit for temporary storage\n const mask = new Uint32Array(1); // unsigned 32 bit mask value\n const byte = new Uint8Array(1); // unsigned 8 bit for temporary storage\n while (numBits > 0) {\n byte[0] = data[offset];\n // read remaining bits, upto 8 bits at a time\n const bits = Math.min(numBits, 8);\n const shift = 8 - bits;\n mask[0] = (0xff000000 >>> (24 + shift)) << shift;\n temp[0] = (byte[0] & mask[0]) >> shift;\n bsid = !bsid ? temp[0] : (bsid << bits) | temp[0];\n offset += 1;\n numBits -= bits;\n }\n return bsid;\n};\n","import BaseAudioDemuxer from './base-audio-demuxer';\nimport { getID3Data, getTimeStamp } from '../id3';\nimport { getAudioBSID } from './dolby';\nimport type { HlsEventEmitter } from '../../events';\nimport type { AudioFrame, DemuxedAudioTrack } from '../../types/demuxer';\n\nexport class AC3Demuxer extends BaseAudioDemuxer {\n private readonly observer: HlsEventEmitter;\n\n constructor(observer) {\n super();\n this.observer = observer;\n }\n\n resetInitSegment(\n initSegment: Uint8Array | undefined,\n audioCodec: string | undefined,\n videoCodec: string | undefined,\n trackDuration: number,\n ) {\n super.resetInitSegment(initSegment, audioCodec, videoCodec, trackDuration);\n this._audioTrack = {\n container: 'audio/ac-3',\n type: 'audio',\n id: 2,\n pid: -1,\n sequenceNumber: 0,\n segmentCodec: 'ac3',\n samples: [],\n manifestCodec: audioCodec,\n duration: trackDuration,\n inputTimeScale: 90000,\n dropped: 0,\n };\n }\n\n canParse(data: Uint8Array, offset: number): boolean {\n return offset + 64 < data.length;\n }\n\n appendFrame(\n track: DemuxedAudioTrack,\n data: Uint8Array,\n offset: number,\n ): AudioFrame | void {\n const frameLength = appendFrame(\n track,\n data,\n offset,\n this.basePTS as number,\n this.frameIndex,\n );\n if (frameLength !== -1) {\n const sample = track.samples[track.samples.length - 1];\n return { sample, length: frameLength, missing: 0 };\n }\n }\n\n static probe(data: Uint8Array | undefined): boolean {\n if (!data) {\n return false;\n }\n\n const id3Data = getID3Data(data, 0);\n if (!id3Data) {\n return false;\n }\n\n // look for the ac-3 sync bytes\n const offset = id3Data.length;\n if (\n data[offset] === 0x0b &&\n data[offset + 1] === 0x77 &&\n getTimeStamp(id3Data) !== undefined &&\n // check the bsid to confirm ac-3\n getAudioBSID(data, offset) < 16\n ) {\n return true;\n }\n return false;\n }\n}\n\nexport function appendFrame(\n track: DemuxedAudioTrack,\n data: Uint8Array,\n start: number,\n pts: number,\n frameIndex: number,\n): number {\n if (start + 8 > data.length) {\n return -1; // not enough bytes left\n }\n\n if (data[start] !== 0x0b || data[start + 1] !== 0x77) {\n return -1; // invalid magic\n }\n\n // get sample rate\n const samplingRateCode = data[start + 4] >> 6;\n if (samplingRateCode >= 3) {\n return -1; // invalid sampling rate\n }\n\n const samplingRateMap = [48000, 44100, 32000];\n const sampleRate = samplingRateMap[samplingRateCode];\n\n // get frame size\n const frameSizeCode = data[start + 4] & 0x3f;\n const frameSizeMap = [\n 64, 69, 96, 64, 70, 96, 80, 87, 120, 80, 88, 120, 96, 104, 144, 96, 105,\n 144, 112, 121, 168, 112, 122, 168, 128, 139, 192, 128, 140, 192, 160, 174,\n 240, 160, 175, 240, 192, 208, 288, 192, 209, 288, 224, 243, 336, 224, 244,\n 336, 256, 278, 384, 256, 279, 384, 320, 348, 480, 320, 349, 480, 384, 417,\n 576, 384, 418, 576, 448, 487, 672, 448, 488, 672, 512, 557, 768, 512, 558,\n 768, 640, 696, 960, 640, 697, 960, 768, 835, 1152, 768, 836, 1152, 896, 975,\n 1344, 896, 976, 1344, 1024, 1114, 1536, 1024, 1115, 1536, 1152, 1253, 1728,\n 1152, 1254, 1728, 1280, 1393, 1920, 1280, 1394, 1920,\n ];\n\n const frameLength = frameSizeMap[frameSizeCode * 3 + samplingRateCode] * 2;\n if (start + frameLength > data.length) {\n return -1;\n }\n\n // get channel count\n const channelMode = data[start + 6] >> 5;\n let skipCount = 0;\n if (channelMode === 2) {\n skipCount += 2;\n } else {\n if (channelMode & 1 && channelMode !== 1) {\n skipCount += 2;\n }\n if (channelMode & 4) {\n skipCount += 2;\n }\n }\n\n const lfeon =\n (((data[start + 6] << 8) | data[start + 7]) >> (12 - skipCount)) & 1;\n\n const channelsMap = [2, 1, 2, 3, 3, 4, 4, 5];\n const channelCount = channelsMap[channelMode] + lfeon;\n\n // build dac3 box\n const bsid = data[start + 5] >> 3;\n const bsmod = data[start + 5] & 7;\n\n const config = new Uint8Array([\n (samplingRateCode << 6) | (bsid << 1) | (bsmod >> 2),\n ((bsmod & 3) << 6) |\n (channelMode << 3) |\n (lfeon << 2) |\n (frameSizeCode >> 4),\n (frameSizeCode << 4) & 0xe0,\n ]);\n\n const frameDuration = (1536 / sampleRate) * 90000;\n const stamp = pts + frameIndex * frameDuration;\n const unit = data.subarray(start, start + frameLength);\n\n track.config = config;\n track.channelCount = channelCount;\n track.samplerate = sampleRate;\n track.samples.push({ unit, pts: stamp });\n\n return frameLength;\n}\n","import type { ParsedVideoSample } from '../tsdemuxer';\nimport {\n DemuxedVideoTrack,\n VideoSample,\n VideoSampleUnit,\n} from '../../types/demuxer';\nimport { logger } from '../../utils/logger';\n\nclass BaseVideoParser {\n protected VideoSample: ParsedVideoSample | null = null;\n\n protected createVideoSample(\n key: boolean,\n pts: number | undefined,\n dts: number | undefined,\n debug: string,\n ): ParsedVideoSample {\n return {\n key,\n frame: false,\n pts,\n dts,\n units: [],\n debug,\n length: 0,\n };\n }\n\n protected getLastNalUnit(\n samples: VideoSample[],\n ): VideoSampleUnit | undefined {\n let VideoSample = this.VideoSample;\n let lastUnit: VideoSampleUnit | undefined;\n // try to fallback to previous sample if current one is empty\n if (!VideoSample || VideoSample.units.length === 0) {\n VideoSample = samples[samples.length - 1];\n }\n if (VideoSample?.units) {\n const units = VideoSample.units;\n lastUnit = units[units.length - 1];\n }\n return lastUnit;\n }\n\n protected pushAccessUnit(\n VideoSample: ParsedVideoSample,\n videoTrack: DemuxedVideoTrack,\n ) {\n if (VideoSample.units.length && VideoSample.frame) {\n // if sample does not have PTS/DTS, patch with last sample PTS/DTS\n if (VideoSample.pts === undefined) {\n const samples = videoTrack.samples;\n const nbSamples = samples.length;\n if (nbSamples) {\n const lastSample = samples[nbSamples - 1];\n VideoSample.pts = lastSample.pts;\n VideoSample.dts = lastSample.dts;\n } else {\n // dropping samples, no timestamp found\n videoTrack.dropped++;\n return;\n }\n }\n videoTrack.samples.push(VideoSample as VideoSample);\n }\n if (VideoSample.debug.length) {\n logger.log(\n VideoSample.pts + '/' + VideoSample.dts + ':' + VideoSample.debug,\n );\n }\n }\n}\n\nexport default BaseVideoParser;\n","/**\n * Parser for exponential Golomb codes, a variable-bitwidth number encoding scheme used by h264.\n */\n\nimport { logger } from '../../utils/logger';\n\nclass ExpGolomb {\n private data: Uint8Array;\n public bytesAvailable: number;\n private word: number;\n private bitsAvailable: number;\n\n constructor(data: Uint8Array) {\n this.data = data;\n // the number of bytes left to examine in this.data\n this.bytesAvailable = data.byteLength;\n // the current word being examined\n this.word = 0; // :uint\n // the number of bits left to examine in the current word\n this.bitsAvailable = 0; // :uint\n }\n\n // ():void\n loadWord(): void {\n const data = this.data;\n const bytesAvailable = this.bytesAvailable;\n const position = data.byteLength - bytesAvailable;\n const workingBytes = new Uint8Array(4);\n const availableBytes = Math.min(4, bytesAvailable);\n if (availableBytes === 0) {\n throw new Error('no bytes available');\n }\n\n workingBytes.set(data.subarray(position, position + availableBytes));\n this.word = new DataView(workingBytes.buffer).getUint32(0);\n // track the amount of this.data that has been processed\n this.bitsAvailable = availableBytes * 8;\n this.bytesAvailable -= availableBytes;\n }\n\n // (count:int):void\n skipBits(count: number): void {\n let skipBytes; // :int\n count = Math.min(count, this.bytesAvailable * 8 + this.bitsAvailable);\n if (this.bitsAvailable > count) {\n this.word <<= count;\n this.bitsAvailable -= count;\n } else {\n count -= this.bitsAvailable;\n skipBytes = count >> 3;\n count -= skipBytes << 3;\n this.bytesAvailable -= skipBytes;\n this.loadWord();\n this.word <<= count;\n this.bitsAvailable -= count;\n }\n }\n\n // (size:int):uint\n readBits(size: number): number {\n let bits = Math.min(this.bitsAvailable, size); // :uint\n const valu = this.word >>> (32 - bits); // :uint\n if (size > 32) {\n logger.error('Cannot read more than 32 bits at a time');\n }\n\n this.bitsAvailable -= bits;\n if (this.bitsAvailable > 0) {\n this.word <<= bits;\n } else if (this.bytesAvailable > 0) {\n this.loadWord();\n } else {\n throw new Error('no bits available');\n }\n\n bits = size - bits;\n if (bits > 0 && this.bitsAvailable) {\n return (valu << bits) | this.readBits(bits);\n } else {\n return valu;\n }\n }\n\n // ():uint\n skipLZ(): number {\n let leadingZeroCount; // :uint\n for (\n leadingZeroCount = 0;\n leadingZeroCount < this.bitsAvailable;\n ++leadingZeroCount\n ) {\n if ((this.word & (0x80000000 >>> leadingZeroCount)) !== 0) {\n // the first bit of working word is 1\n this.word <<= leadingZeroCount;\n this.bitsAvailable -= leadingZeroCount;\n return leadingZeroCount;\n }\n }\n // we exhausted word and still have not found a 1\n this.loadWord();\n return leadingZeroCount + this.skipLZ();\n }\n\n // ():void\n skipUEG(): void {\n this.skipBits(1 + this.skipLZ());\n }\n\n // ():void\n skipEG(): void {\n this.skipBits(1 + this.skipLZ());\n }\n\n // ():uint\n readUEG(): number {\n const clz = this.skipLZ(); // :uint\n return this.readBits(clz + 1) - 1;\n }\n\n // ():int\n readEG(): number {\n const valu = this.readUEG(); // :int\n if (0x01 & valu) {\n // the number is odd if the low order bit is set\n return (1 + valu) >>> 1; // add 1 to make it even, and divide by 2\n } else {\n return -1 * (valu >>> 1); // divide by two then make it negative\n }\n }\n\n // Some convenience functions\n // :Boolean\n readBoolean(): boolean {\n return this.readBits(1) === 1;\n }\n\n // ():int\n readUByte(): number {\n return this.readBits(8);\n }\n\n // ():int\n readUShort(): number {\n return this.readBits(16);\n }\n\n // ():int\n readUInt(): number {\n return this.readBits(32);\n }\n\n /**\n * Advance the ExpGolomb decoder past a scaling list. The scaling\n * list is optionally transmitted as part of a sequence parameter\n * set and is not relevant to transmuxing.\n * @param count the number of entries in this scaling list\n * @see Recommendation ITU-T H.264, Section 7.3.2.1.1.1\n */\n skipScalingList(count: number): void {\n let lastScale = 8;\n let nextScale = 8;\n let deltaScale;\n for (let j = 0; j < count; j++) {\n if (nextScale !== 0) {\n deltaScale = this.readEG();\n nextScale = (lastScale + deltaScale + 256) % 256;\n }\n lastScale = nextScale === 0 ? lastScale : nextScale;\n }\n }\n\n /**\n * Read a sequence parameter set and return some interesting video\n * properties. A sequence parameter set is the H264 metadata that\n * describes the properties of upcoming video frames.\n * @returns an object with configuration parsed from the\n * sequence parameter set, including the dimensions of the\n * associated video frames.\n */\n readSPS(): {\n width: number;\n height: number;\n pixelRatio: [number, number];\n } {\n let frameCropLeftOffset = 0;\n let frameCropRightOffset = 0;\n let frameCropTopOffset = 0;\n let frameCropBottomOffset = 0;\n let numRefFramesInPicOrderCntCycle;\n let scalingListCount;\n let i;\n const readUByte = this.readUByte.bind(this);\n const readBits = this.readBits.bind(this);\n const readUEG = this.readUEG.bind(this);\n const readBoolean = this.readBoolean.bind(this);\n const skipBits = this.skipBits.bind(this);\n const skipEG = this.skipEG.bind(this);\n const skipUEG = this.skipUEG.bind(this);\n const skipScalingList = this.skipScalingList.bind(this);\n\n readUByte();\n const profileIdc = readUByte(); // profile_idc\n readBits(5); // profileCompat constraint_set[0-4]_flag, u(5)\n skipBits(3); // reserved_zero_3bits u(3),\n readUByte(); // level_idc u(8)\n skipUEG(); // seq_parameter_set_id\n // some profiles have more optional data we don't need\n if (\n profileIdc === 100 ||\n profileIdc === 110 ||\n profileIdc === 122 ||\n profileIdc === 244 ||\n profileIdc === 44 ||\n profileIdc === 83 ||\n profileIdc === 86 ||\n profileIdc === 118 ||\n profileIdc === 128\n ) {\n const chromaFormatIdc = readUEG();\n if (chromaFormatIdc === 3) {\n skipBits(1);\n } // separate_colour_plane_flag\n\n skipUEG(); // bit_depth_luma_minus8\n skipUEG(); // bit_depth_chroma_minus8\n skipBits(1); // qpprime_y_zero_transform_bypass_flag\n if (readBoolean()) {\n // seq_scaling_matrix_present_flag\n scalingListCount = chromaFormatIdc !== 3 ? 8 : 12;\n for (i = 0; i < scalingListCount; i++) {\n if (readBoolean()) {\n // seq_scaling_list_present_flag[ i ]\n if (i < 6) {\n skipScalingList(16);\n } else {\n skipScalingList(64);\n }\n }\n }\n }\n }\n skipUEG(); // log2_max_frame_num_minus4\n const picOrderCntType = readUEG();\n if (picOrderCntType === 0) {\n readUEG(); // log2_max_pic_order_cnt_lsb_minus4\n } else if (picOrderCntType === 1) {\n skipBits(1); // delta_pic_order_always_zero_flag\n skipEG(); // offset_for_non_ref_pic\n skipEG(); // offset_for_top_to_bottom_field\n numRefFramesInPicOrderCntCycle = readUEG();\n for (i = 0; i < numRefFramesInPicOrderCntCycle; i++) {\n skipEG();\n } // offset_for_ref_frame[ i ]\n }\n skipUEG(); // max_num_ref_frames\n skipBits(1); // gaps_in_frame_num_value_allowed_flag\n const picWidthInMbsMinus1 = readUEG();\n const picHeightInMapUnitsMinus1 = readUEG();\n const frameMbsOnlyFlag = readBits(1);\n if (frameMbsOnlyFlag === 0) {\n skipBits(1);\n } // mb_adaptive_frame_field_flag\n\n skipBits(1); // direct_8x8_inference_flag\n if (readBoolean()) {\n // frame_cropping_flag\n frameCropLeftOffset = readUEG();\n frameCropRightOffset = readUEG();\n frameCropTopOffset = readUEG();\n frameCropBottomOffset = readUEG();\n }\n let pixelRatio: [number, number] = [1, 1];\n if (readBoolean()) {\n // vui_parameters_present_flag\n if (readBoolean()) {\n // aspect_ratio_info_present_flag\n const aspectRatioIdc = readUByte();\n switch (aspectRatioIdc) {\n case 1:\n pixelRatio = [1, 1];\n break;\n case 2:\n pixelRatio = [12, 11];\n break;\n case 3:\n pixelRatio = [10, 11];\n break;\n case 4:\n pixelRatio = [16, 11];\n break;\n case 5:\n pixelRatio = [40, 33];\n break;\n case 6:\n pixelRatio = [24, 11];\n break;\n case 7:\n pixelRatio = [20, 11];\n break;\n case 8:\n pixelRatio = [32, 11];\n break;\n case 9:\n pixelRatio = [80, 33];\n break;\n case 10:\n pixelRatio = [18, 11];\n break;\n case 11:\n pixelRatio = [15, 11];\n break;\n case 12:\n pixelRatio = [64, 33];\n break;\n case 13:\n pixelRatio = [160, 99];\n break;\n case 14:\n pixelRatio = [4, 3];\n break;\n case 15:\n pixelRatio = [3, 2];\n break;\n case 16:\n pixelRatio = [2, 1];\n break;\n case 255: {\n pixelRatio = [\n (readUByte() << 8) | readUByte(),\n (readUByte() << 8) | readUByte(),\n ];\n break;\n }\n }\n }\n }\n return {\n width: Math.ceil(\n (picWidthInMbsMinus1 + 1) * 16 -\n frameCropLeftOffset * 2 -\n frameCropRightOffset * 2,\n ),\n height:\n (2 - frameMbsOnlyFlag) * (picHeightInMapUnitsMinus1 + 1) * 16 -\n (frameMbsOnlyFlag ? 2 : 4) *\n (frameCropTopOffset + frameCropBottomOffset),\n pixelRatio: pixelRatio,\n };\n }\n\n readSliceType() {\n // skip NALu type\n this.readUByte();\n // discard first_mb_in_slice\n this.readUEG();\n // return slice_type\n return this.readUEG();\n }\n}\n\nexport default ExpGolomb;\n","import BaseVideoParser from './base-video-parser';\nimport {\n DemuxedVideoTrack,\n DemuxedUserdataTrack,\n VideoSampleUnit,\n} from '../../types/demuxer';\nimport {\n appendUint8Array,\n parseSEIMessageFromNALu,\n} from '../../utils/mp4-tools';\nimport ExpGolomb from './exp-golomb';\nimport type { PES } from '../tsdemuxer';\n\nclass AvcVideoParser extends BaseVideoParser {\n public parseAVCPES(\n track: DemuxedVideoTrack,\n textTrack: DemuxedUserdataTrack,\n pes: PES,\n last: boolean,\n duration: number,\n ) {\n const units = this.parseAVCNALu(track, pes.data);\n const debug = false;\n let VideoSample = this.VideoSample;\n let push: boolean;\n let spsfound = false;\n // free pes.data to save up some memory\n (pes as any).data = null;\n\n // if new NAL units found and last sample still there, let's push ...\n // this helps parsing streams with missing AUD (only do this if AUD never found)\n if (VideoSample && units.length && !track.audFound) {\n this.pushAccessUnit(VideoSample, track);\n VideoSample = this.VideoSample = this.createVideoSample(\n false,\n pes.pts,\n pes.dts,\n '',\n );\n }\n\n units.forEach((unit) => {\n switch (unit.type) {\n // NDR\n case 1: {\n let iskey = false;\n push = true;\n const data = unit.data;\n // only check slice type to detect KF in case SPS found in same packet (any keyframe is preceded by SPS ...)\n if (spsfound && data.length > 4) {\n // retrieve slice type by parsing beginning of NAL unit (follow H264 spec, slice_header definition) to detect keyframe embedded in NDR\n const sliceType = new ExpGolomb(data).readSliceType();\n // 2 : I slice, 4 : SI slice, 7 : I slice, 9: SI slice\n // SI slice : A slice that is coded using intra prediction only and using quantisation of the prediction samples.\n // An SI slice can be coded such that its decoded samples can be constructed identically to an SP slice.\n // I slice: A slice that is not an SI slice that is decoded using intra prediction only.\n // if (sliceType === 2 || sliceType === 7) {\n if (\n sliceType === 2 ||\n sliceType === 4 ||\n sliceType === 7 ||\n sliceType === 9\n ) {\n iskey = true;\n }\n }\n\n if (iskey) {\n // if we have non-keyframe data already, that cannot belong to the same frame as a keyframe, so force a push\n if (VideoSample?.frame && !VideoSample.key) {\n this.pushAccessUnit(VideoSample, track);\n VideoSample = this.VideoSample = null;\n }\n }\n\n if (!VideoSample) {\n VideoSample = this.VideoSample = this.createVideoSample(\n true,\n pes.pts,\n pes.dts,\n '',\n );\n }\n\n if (debug) {\n VideoSample.debug += 'NDR ';\n }\n\n VideoSample.frame = true;\n VideoSample.key = iskey;\n\n break;\n // IDR\n }\n case 5:\n push = true;\n // handle PES not starting with AUD\n // if we have frame data already, that cannot belong to the same frame, so force a push\n if (VideoSample?.frame && !VideoSample.key) {\n this.pushAccessUnit(VideoSample, track);\n VideoSample = this.VideoSample = null;\n }\n if (!VideoSample) {\n VideoSample = this.VideoSample = this.createVideoSample(\n true,\n pes.pts,\n pes.dts,\n '',\n );\n }\n\n if (debug) {\n VideoSample.debug += 'IDR ';\n }\n\n VideoSample.key = true;\n VideoSample.frame = true;\n break;\n // SEI\n case 6: {\n push = true;\n if (debug && VideoSample) {\n VideoSample.debug += 'SEI ';\n }\n parseSEIMessageFromNALu(\n unit.data,\n 1,\n pes.pts as number,\n textTrack.samples,\n );\n break;\n // SPS\n }\n case 7: {\n push = true;\n spsfound = true;\n if (debug && VideoSample) {\n VideoSample.debug += 'SPS ';\n }\n const sps = unit.data;\n const expGolombDecoder = new ExpGolomb(sps);\n const config = expGolombDecoder.readSPS();\n\n if (\n !track.sps ||\n track.width !== config.width ||\n track.height !== config.height ||\n track.pixelRatio?.[0] !== config.pixelRatio[0] ||\n track.pixelRatio?.[1] !== config.pixelRatio[1]\n ) {\n track.width = config.width;\n track.height = config.height;\n track.pixelRatio = config.pixelRatio;\n track.sps = [sps];\n track.duration = duration;\n const codecarray = sps.subarray(1, 4);\n let codecstring = 'avc1.';\n for (let i = 0; i < 3; i++) {\n let h = codecarray[i].toString(16);\n if (h.length < 2) {\n h = '0' + h;\n }\n\n codecstring += h;\n }\n track.codec = codecstring;\n }\n\n break;\n }\n // PPS\n case 8:\n push = true;\n if (debug && VideoSample) {\n VideoSample.debug += 'PPS ';\n }\n\n track.pps = [unit.data];\n\n break;\n // AUD\n case 9:\n push = true;\n track.audFound = true;\n if (VideoSample) {\n this.pushAccessUnit(VideoSample, track);\n }\n\n VideoSample = this.VideoSample = this.createVideoSample(\n false,\n pes.pts,\n pes.dts,\n debug ? 'AUD ' : '',\n );\n break;\n // Filler Data\n case 12:\n push = true;\n break;\n default:\n push = false;\n if (VideoSample) {\n VideoSample.debug += 'unknown NAL ' + unit.type + ' ';\n }\n\n break;\n }\n if (VideoSample && push) {\n const units = VideoSample.units;\n units.push(unit);\n }\n });\n // if last PES packet, push samples\n if (last && VideoSample) {\n this.pushAccessUnit(VideoSample, track);\n this.VideoSample = null;\n }\n }\n\n private parseAVCNALu(\n track: DemuxedVideoTrack,\n array: Uint8Array,\n ): Array<{\n data: Uint8Array;\n type: number;\n state?: number;\n }> {\n const len = array.byteLength;\n let state = track.naluState || 0;\n const lastState = state;\n const units: VideoSampleUnit[] = [];\n let i = 0;\n let value: number;\n let overflow: number;\n let unitType: number;\n let lastUnitStart = -1;\n let lastUnitType: number = 0;\n // logger.log('PES:' + Hex.hexDump(array));\n\n if (state === -1) {\n // special use case where we found 3 or 4-byte start codes exactly at the end of previous PES packet\n lastUnitStart = 0;\n // NALu type is value read from offset 0\n lastUnitType = array[0] & 0x1f;\n state = 0;\n i = 1;\n }\n\n while (i < len) {\n value = array[i++];\n // optimization. state 0 and 1 are the predominant case. let's handle them outside of the switch/case\n if (!state) {\n state = value ? 0 : 1;\n continue;\n }\n if (state === 1) {\n state = value ? 0 : 2;\n continue;\n }\n // here we have state either equal to 2 or 3\n if (!value) {\n state = 3;\n } else if (value === 1) {\n overflow = i - state - 1;\n if (lastUnitStart >= 0) {\n const unit: VideoSampleUnit = {\n data: array.subarray(lastUnitStart, overflow),\n type: lastUnitType,\n };\n // logger.log('pushing NALU, type/size:' + unit.type + '/' + unit.data.byteLength);\n units.push(unit);\n } else {\n // lastUnitStart is undefined => this is the first start code found in this PES packet\n // first check if start code delimiter is overlapping between 2 PES packets,\n // ie it started in last packet (lastState not zero)\n // and ended at the beginning of this PES packet (i <= 4 - lastState)\n const lastUnit = this.getLastNalUnit(track.samples);\n if (lastUnit) {\n if (lastState && i <= 4 - lastState) {\n // start delimiter overlapping between PES packets\n // strip start delimiter bytes from the end of last NAL unit\n // check if lastUnit had a state different from zero\n if (lastUnit.state) {\n // strip last bytes\n lastUnit.data = lastUnit.data.subarray(\n 0,\n lastUnit.data.byteLength - lastState,\n );\n }\n }\n // If NAL units are not starting right at the beginning of the PES packet, push preceding data into previous NAL unit.\n\n if (overflow > 0) {\n // logger.log('first NALU found with overflow:' + overflow);\n lastUnit.data = appendUint8Array(\n lastUnit.data,\n array.subarray(0, overflow),\n );\n lastUnit.state = 0;\n }\n }\n }\n // check if we can read unit type\n if (i < len) {\n unitType = array[i] & 0x1f;\n // logger.log('find NALU @ offset:' + i + ',type:' + unitType);\n lastUnitStart = i;\n lastUnitType = unitType;\n state = 0;\n } else {\n // not enough byte to read unit type. let's read it on next PES parsing\n state = -1;\n }\n } else {\n state = 0;\n }\n }\n if (lastUnitStart >= 0 && state >= 0) {\n const unit: VideoSampleUnit = {\n data: array.subarray(lastUnitStart, len),\n type: lastUnitType,\n state: state,\n };\n units.push(unit);\n // logger.log('pushing NALU, type/size/state:' + unit.type + '/' + unit.data.byteLength + '/' + state);\n }\n // no NALu found\n if (units.length === 0) {\n // append pes.data to previous NAL unit\n const lastUnit = this.getLastNalUnit(track.samples);\n if (lastUnit) {\n lastUnit.data = appendUint8Array(lastUnit.data, array);\n }\n }\n track.naluState = state;\n return units;\n }\n}\n\nexport default AvcVideoParser;\n","/**\n * SAMPLE-AES decrypter\n */\n\nimport { HlsConfig } from '../config';\nimport Decrypter from '../crypt/decrypter';\nimport { HlsEventEmitter } from '../events';\nimport type {\n AudioSample,\n VideoSample,\n VideoSampleUnit,\n DemuxedVideoTrackBase,\n KeyData,\n} from '../types/demuxer';\nimport { discardEPB } from '../utils/mp4-tools';\n\nclass SampleAesDecrypter {\n private keyData: KeyData;\n private decrypter: Decrypter;\n\n constructor(observer: HlsEventEmitter, config: HlsConfig, keyData: KeyData) {\n this.keyData = keyData;\n this.decrypter = new Decrypter(config, {\n removePKCS7Padding: false,\n });\n }\n\n decryptBuffer(encryptedData: Uint8Array | ArrayBuffer): Promise<ArrayBuffer> {\n return this.decrypter.decrypt(\n encryptedData,\n this.keyData.key.buffer,\n this.keyData.iv.buffer,\n );\n }\n\n // AAC - encrypt all full 16 bytes blocks starting from offset 16\n private decryptAacSample(\n samples: AudioSample[],\n sampleIndex: number,\n callback: () => void,\n ) {\n const curUnit = samples[sampleIndex].unit;\n if (curUnit.length <= 16) {\n // No encrypted portion in this sample (first 16 bytes is not\n // encrypted, see https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/HLS_Sample_Encryption/Encryption/Encryption.html),\n return;\n }\n const encryptedData = curUnit.subarray(\n 16,\n curUnit.length - (curUnit.length % 16),\n );\n const encryptedBuffer = encryptedData.buffer.slice(\n encryptedData.byteOffset,\n encryptedData.byteOffset + encryptedData.length,\n );\n\n this.decryptBuffer(encryptedBuffer).then((decryptedBuffer: ArrayBuffer) => {\n const decryptedData = new Uint8Array(decryptedBuffer);\n curUnit.set(decryptedData, 16);\n\n if (!this.decrypter.isSync()) {\n this.decryptAacSamples(samples, sampleIndex + 1, callback);\n }\n });\n }\n\n decryptAacSamples(\n samples: AudioSample[],\n sampleIndex: number,\n callback: () => void,\n ) {\n for (; ; sampleIndex++) {\n if (sampleIndex >= samples.length) {\n callback();\n return;\n }\n\n if (samples[sampleIndex].unit.length < 32) {\n continue;\n }\n\n this.decryptAacSample(samples, sampleIndex, callback);\n\n if (!this.decrypter.isSync()) {\n return;\n }\n }\n }\n\n // AVC - encrypt one 16 bytes block out of ten, starting from offset 32\n getAvcEncryptedData(decodedData: Uint8Array) {\n const encryptedDataLen =\n Math.floor((decodedData.length - 48) / 160) * 16 + 16;\n const encryptedData = new Int8Array(encryptedDataLen);\n let outputPos = 0;\n for (\n let inputPos = 32;\n inputPos < decodedData.length - 16;\n inputPos += 160, outputPos += 16\n ) {\n encryptedData.set(\n decodedData.subarray(inputPos, inputPos + 16),\n outputPos,\n );\n }\n\n return encryptedData;\n }\n\n getAvcDecryptedUnit(\n decodedData: Uint8Array,\n decryptedData: ArrayLike<number> | ArrayBuffer | SharedArrayBuffer,\n ) {\n const uint8DecryptedData = new Uint8Array(decryptedData);\n let inputPos = 0;\n for (\n let outputPos = 32;\n outputPos < decodedData.length - 16;\n outputPos += 160, inputPos += 16\n ) {\n decodedData.set(\n uint8DecryptedData.subarray(inputPos, inputPos + 16),\n outputPos,\n );\n }\n\n return decodedData;\n }\n\n decryptAvcSample(\n samples: VideoSample[],\n sampleIndex: number,\n unitIndex: number,\n callback: () => void,\n curUnit: VideoSampleUnit,\n ) {\n const decodedData = discardEPB(curUnit.data);\n const encryptedData = this.getAvcEncryptedData(decodedData);\n\n this.decryptBuffer(encryptedData.buffer).then(\n (decryptedBuffer: ArrayBuffer) => {\n curUnit.data = this.getAvcDecryptedUnit(decodedData, decryptedBuffer);\n\n if (!this.decrypter.isSync()) {\n this.decryptAvcSamples(samples, sampleIndex, unitIndex + 1, callback);\n }\n },\n );\n }\n\n decryptAvcSamples(\n samples: DemuxedVideoTrackBase['samples'],\n sampleIndex: number,\n unitIndex: number,\n callback: () => void,\n ) {\n if (samples instanceof Uint8Array) {\n throw new Error('Cannot decrypt samples of type Uint8Array');\n }\n\n for (; ; sampleIndex++, unitIndex = 0) {\n if (sampleIndex >= samples.length) {\n callback();\n return;\n }\n\n const curUnits = samples[sampleIndex].units;\n for (; ; unitIndex++) {\n if (unitIndex >= curUnits.length) {\n break;\n }\n\n const curUnit = curUnits[unitIndex];\n if (\n curUnit.data.length <= 48 ||\n (curUnit.type !== 1 && curUnit.type !== 5)\n ) {\n continue;\n }\n\n this.decryptAvcSample(\n samples,\n sampleIndex,\n unitIndex,\n callback,\n curUnit,\n );\n\n if (!this.decrypter.isSync()) {\n return;\n }\n }\n }\n }\n}\n\nexport default SampleAesDecrypter;\n","/**\n * highly optimized TS demuxer:\n * parse PAT, PMT\n * extract PES packet from audio and video PIDs\n * extract AVC/H264 NAL units and AAC/ADTS samples from PES packet\n * trigger the remuxer upon parsing completion\n * it also tries to workaround as best as it can audio codec switch (HE-AAC to AAC and vice versa), without having to restart the MediaSource.\n * it also controls the remuxing process :\n * upon discontinuity or level switch detection, it will also notifies the remuxer so that it can reset its state.\n */\n\nimport * as ADTS from './audio/adts';\nimport * as MpegAudio from './audio/mpegaudio';\nimport * as AC3 from './audio/ac3-demuxer';\nimport AvcVideoParser from './video/avc-video-parser';\nimport SampleAesDecrypter from './sample-aes';\nimport { Events } from '../events';\nimport { appendUint8Array, RemuxerTrackIdConfig } from '../utils/mp4-tools';\nimport { logger } from '../utils/logger';\nimport { ErrorTypes, ErrorDetails } from '../errors';\nimport type { HlsConfig } from '../config';\nimport type { HlsEventEmitter } from '../events';\nimport {\n DemuxedVideoTrack,\n DemuxedAudioTrack,\n DemuxedTrack,\n Demuxer,\n DemuxerResult,\n VideoSample,\n DemuxedMetadataTrack,\n DemuxedUserdataTrack,\n ElementaryStreamData,\n KeyData,\n MetadataSchema,\n} from '../types/demuxer';\nimport { AudioFrame } from '../types/demuxer';\n\nexport type ParsedTimestamp = {\n pts?: number;\n dts?: number;\n};\n\nexport type PES = ParsedTimestamp & {\n data: Uint8Array;\n len: number;\n};\n\nexport type ParsedVideoSample = ParsedTimestamp &\n Omit<VideoSample, 'pts' | 'dts'>;\n\nexport interface TypeSupported {\n mpeg: boolean;\n mp3: boolean;\n ac3: boolean;\n}\n\nconst PACKET_LENGTH = 188;\n\nclass TSDemuxer implements Demuxer {\n private readonly observer: HlsEventEmitter;\n private readonly config: HlsConfig;\n private typeSupported: TypeSupported;\n\n private sampleAes: SampleAesDecrypter | null = null;\n private pmtParsed: boolean = false;\n private audioCodec?: string;\n private videoCodec?: string;\n private _duration: number = 0;\n private _pmtId: number = -1;\n\n private _videoTrack?: DemuxedVideoTrack;\n private _audioTrack?: DemuxedAudioTrack;\n private _id3Track?: DemuxedMetadataTrack;\n private _txtTrack?: DemuxedUserdataTrack;\n private aacOverFlow: AudioFrame | null = null;\n private remainderData: Uint8Array | null = null;\n private videoParser: AvcVideoParser;\n\n constructor(\n observer: HlsEventEmitter,\n config: HlsConfig,\n typeSupported: TypeSupported,\n ) {\n this.observer = observer;\n this.config = config;\n this.typeSupported = typeSupported;\n this.videoParser = new AvcVideoParser();\n }\n\n static probe(data: Uint8Array) {\n const syncOffset = TSDemuxer.syncOffset(data);\n if (syncOffset > 0) {\n logger.warn(\n `MPEG2-TS detected but first sync word found @ offset ${syncOffset}`,\n );\n }\n return syncOffset !== -1;\n }\n\n static syncOffset(data: Uint8Array): number {\n const length = data.length;\n let scanwindow = Math.min(PACKET_LENGTH * 5, length - PACKET_LENGTH) + 1;\n let i = 0;\n while (i < scanwindow) {\n // a TS init segment should contain at least 2 TS packets: PAT and PMT, each starting with 0x47\n let foundPat = false;\n let packetStart = -1;\n let tsPackets = 0;\n for (let j = i; j < length; j += PACKET_LENGTH) {\n if (\n data[j] === 0x47 &&\n (length - j === PACKET_LENGTH || data[j + PACKET_LENGTH] === 0x47)\n ) {\n tsPackets++;\n if (packetStart === -1) {\n packetStart = j;\n // First sync word found at offset, increase scan length (#5251)\n if (packetStart !== 0) {\n scanwindow =\n Math.min(\n packetStart + PACKET_LENGTH * 99,\n data.length - PACKET_LENGTH,\n ) + 1;\n }\n }\n if (!foundPat) {\n foundPat = parsePID(data, j) === 0;\n }\n // Sync word found at 0 with 3 packets, or found at offset least 2 packets up to scanwindow (#5501)\n if (\n foundPat &&\n tsPackets > 1 &&\n ((packetStart === 0 && tsPackets > 2) ||\n j + PACKET_LENGTH > scanwindow)\n ) {\n return packetStart;\n }\n } else if (tsPackets) {\n // Exit if sync word found, but does not contain contiguous packets\n return -1;\n } else {\n break;\n }\n }\n i++;\n }\n return -1;\n }\n\n /**\n * Creates a track model internal to demuxer used to drive remuxing input\n */\n static createTrack(\n type: 'audio' | 'video' | 'id3' | 'text',\n duration?: number,\n ): DemuxedTrack {\n return {\n container:\n type === 'video' || type === 'audio' ? 'video/mp2t' : undefined,\n type,\n id: RemuxerTrackIdConfig[type],\n pid: -1,\n inputTimeScale: 90000,\n sequenceNumber: 0,\n samples: [],\n dropped: 0,\n duration: type === 'audio' ? duration : undefined,\n };\n }\n\n /**\n * Initializes a new init segment on the demuxer/remuxer interface. Needed for discontinuities/track-switches (or at stream start)\n * Resets all internal track instances of the demuxer.\n */\n public resetInitSegment(\n initSegment: Uint8Array | undefined,\n audioCodec: string,\n videoCodec: string,\n trackDuration: number,\n ) {\n this.pmtParsed = false;\n this._pmtId = -1;\n\n this._videoTrack = TSDemuxer.createTrack('video') as DemuxedVideoTrack;\n this._audioTrack = TSDemuxer.createTrack(\n 'audio',\n trackDuration,\n ) as DemuxedAudioTrack;\n this._id3Track = TSDemuxer.createTrack('id3') as DemuxedMetadataTrack;\n this._txtTrack = TSDemuxer.createTrack('text') as DemuxedUserdataTrack;\n this._audioTrack.segmentCodec = 'aac';\n\n // flush any partial content\n this.aacOverFlow = null;\n this.remainderData = null;\n this.audioCodec = audioCodec;\n this.videoCodec = videoCodec;\n this._duration = trackDuration;\n }\n\n public resetTimeStamp() {}\n\n public resetContiguity(): void {\n const { _audioTrack, _videoTrack, _id3Track } = this;\n if (_audioTrack) {\n _audioTrack.pesData = null;\n }\n if (_videoTrack) {\n _videoTrack.pesData = null;\n }\n if (_id3Track) {\n _id3Track.pesData = null;\n }\n this.aacOverFlow = null;\n this.remainderData = null;\n }\n\n public demux(\n data: Uint8Array,\n timeOffset: number,\n isSampleAes = false,\n flush = false,\n ): DemuxerResult {\n if (!isSampleAes) {\n this.sampleAes = null;\n }\n\n let pes: PES | null;\n\n const videoTrack = this._videoTrack as DemuxedVideoTrack;\n const audioTrack = this._audioTrack as DemuxedAudioTrack;\n const id3Track = this._id3Track as DemuxedMetadataTrack;\n const textTrack = this._txtTrack as DemuxedUserdataTrack;\n\n let videoPid = videoTrack.pid;\n let videoData = videoTrack.pesData;\n let audioPid = audioTrack.pid;\n let id3Pid = id3Track.pid;\n let audioData = audioTrack.pesData;\n let id3Data = id3Track.pesData;\n let unknownPID: number | null = null;\n let pmtParsed = this.pmtParsed;\n let pmtId = this._pmtId;\n\n let len = data.length;\n if (this.remainderData) {\n data = appendUint8Array(this.remainderData, data);\n len = data.length;\n this.remainderData = null;\n }\n\n if (len < PACKET_LENGTH && !flush) {\n this.remainderData = data;\n return {\n audioTrack,\n videoTrack,\n id3Track,\n textTrack,\n };\n }\n\n const syncOffset = Math.max(0, TSDemuxer.syncOffset(data));\n len -= (len - syncOffset) % PACKET_LENGTH;\n if (len < data.byteLength && !flush) {\n this.remainderData = new Uint8Array(\n data.buffer,\n len,\n data.buffer.byteLength - len,\n );\n }\n\n // loop through TS packets\n let tsPacketErrors = 0;\n for (let start = syncOffset; start < len; start += PACKET_LENGTH) {\n if (data[start] === 0x47) {\n const stt = !!(data[start + 1] & 0x40);\n const pid = parsePID(data, start);\n const atf = (data[start + 3] & 0x30) >> 4;\n\n // if an adaption field is present, its length is specified by the fifth byte of the TS packet header.\n let offset: number;\n if (atf > 1) {\n offset = start + 5 + data[start + 4];\n // continue if there is only adaptation field\n if (offset === start + PACKET_LENGTH) {\n continue;\n }\n } else {\n offset = start + 4;\n }\n switch (pid) {\n case videoPid:\n if (stt) {\n if (videoData && (pes = parsePES(videoData))) {\n this.videoParser.parseAVCPES(\n videoTrack,\n textTrack,\n pes,\n false,\n this._duration,\n );\n }\n\n videoData = { data: [], size: 0 };\n }\n if (videoData) {\n videoData.data.push(data.subarray(offset, start + PACKET_LENGTH));\n videoData.size += start + PACKET_LENGTH - offset;\n }\n break;\n case audioPid:\n if (stt) {\n if (audioData && (pes = parsePES(audioData))) {\n switch (audioTrack.segmentCodec) {\n case 'aac':\n this.parseAACPES(audioTrack, pes);\n break;\n case 'mp3':\n this.parseMPEGPES(audioTrack, pes);\n break;\n case 'ac3':\n if (__USE_M2TS_ADVANCED_CODECS__) {\n this.parseAC3PES(audioTrack, pes);\n }\n break;\n }\n }\n audioData = { data: [], size: 0 };\n }\n if (audioData) {\n audioData.data.push(data.subarray(offset, start + PACKET_LENGTH));\n audioData.size += start + PACKET_LENGTH - offset;\n }\n break;\n case id3Pid:\n if (stt) {\n if (id3Data && (pes = parsePES(id3Data))) {\n this.parseID3PES(id3Track, pes);\n }\n\n id3Data = { data: [], size: 0 };\n }\n if (id3Data) {\n id3Data.data.push(data.subarray(offset, start + PACKET_LENGTH));\n id3Data.size += start + PACKET_LENGTH - offset;\n }\n break;\n case 0:\n if (stt) {\n offset += data[offset] + 1;\n }\n\n pmtId = this._pmtId = parsePAT(data, offset);\n // logger.log('PMT PID:' + this._pmtId);\n break;\n case pmtId: {\n if (stt) {\n offset += data[offset] + 1;\n }\n\n const parsedPIDs = parsePMT(\n data,\n offset,\n this.typeSupported,\n isSampleAes,\n this.observer,\n );\n\n // only update track id if track PID found while parsing PMT\n // this is to avoid resetting the PID to -1 in case\n // track PID transiently disappears from the stream\n // this could happen in case of transient missing audio samples for example\n // NOTE this is only the PID of the track as found in TS,\n // but we are not using this for MP4 track IDs.\n videoPid = parsedPIDs.videoPid;\n if (videoPid > 0) {\n videoTrack.pid = videoPid;\n videoTrack.segmentCodec = parsedPIDs.segmentVideoCodec;\n }\n\n audioPid = parsedPIDs.audioPid;\n if (audioPid > 0) {\n audioTrack.pid = audioPid;\n audioTrack.segmentCodec = parsedPIDs.segmentAudioCodec;\n }\n id3Pid = parsedPIDs.id3Pid;\n if (id3Pid > 0) {\n id3Track.pid = id3Pid;\n }\n\n if (unknownPID !== null && !pmtParsed) {\n logger.warn(\n `MPEG-TS PMT found at ${start} after unknown PID '${unknownPID}'. Backtracking to sync byte @${syncOffset} to parse all TS packets.`,\n );\n unknownPID = null;\n // we set it to -188, the += 188 in the for loop will reset start to 0\n start = syncOffset - 188;\n }\n pmtParsed = this.pmtParsed = true;\n break;\n }\n case 0x11:\n case 0x1fff:\n break;\n default:\n unknownPID = pid;\n break;\n }\n } else {\n tsPacketErrors++;\n }\n }\n\n if (tsPacketErrors > 0) {\n emitParsingError(\n this.observer,\n new Error(\n `Found ${tsPacketErrors} TS packet/s that do not start with 0x47`,\n ),\n );\n }\n\n videoTrack.pesData = videoData;\n audioTrack.pesData = audioData;\n id3Track.pesData = id3Data;\n\n const demuxResult: DemuxerResult = {\n audioTrack,\n videoTrack,\n id3Track,\n textTrack,\n };\n\n if (flush) {\n this.extractRemainingSamples(demuxResult);\n }\n\n return demuxResult;\n }\n\n public flush(): DemuxerResult | Promise<DemuxerResult> {\n const { remainderData } = this;\n this.remainderData = null;\n let result: DemuxerResult;\n if (remainderData) {\n result = this.demux(remainderData, -1, false, true);\n } else {\n result = {\n videoTrack: this._videoTrack as DemuxedVideoTrack,\n audioTrack: this._audioTrack as DemuxedAudioTrack,\n id3Track: this._id3Track as DemuxedMetadataTrack,\n textTrack: this._txtTrack as DemuxedUserdataTrack,\n };\n }\n this.extractRemainingSamples(result);\n if (this.sampleAes) {\n return this.decrypt(result, this.sampleAes);\n }\n return result;\n }\n\n private extractRemainingSamples(demuxResult: DemuxerResult) {\n const { audioTrack, videoTrack, id3Track, textTrack } = demuxResult;\n const videoData = videoTrack.pesData;\n const audioData = audioTrack.pesData;\n const id3Data = id3Track.pesData;\n // try to parse last PES packets\n let pes: PES | null;\n if (videoData && (pes = parsePES(videoData))) {\n this.videoParser.parseAVCPES(\n videoTrack as DemuxedVideoTrack,\n textTrack as DemuxedUserdataTrack,\n pes,\n true,\n this._duration,\n );\n videoTrack.pesData = null;\n } else {\n // either avcData null or PES truncated, keep it for next frag parsing\n videoTrack.pesData = videoData;\n }\n\n if (audioData && (pes = parsePES(audioData))) {\n switch (audioTrack.segmentCodec) {\n case 'aac':\n this.parseAACPES(audioTrack, pes);\n break;\n case 'mp3':\n this.parseMPEGPES(audioTrack, pes);\n break;\n case 'ac3':\n if (__USE_M2TS_ADVANCED_CODECS__) {\n this.parseAC3PES(audioTrack, pes);\n }\n break;\n }\n audioTrack.pesData = null;\n } else {\n if (audioData?.size) {\n logger.log(\n 'last AAC PES packet truncated,might overlap between fragments',\n );\n }\n\n // either audioData null or PES truncated, keep it for next frag parsing\n audioTrack.pesData = audioData;\n }\n\n if (id3Data && (pes = parsePES(id3Data))) {\n this.parseID3PES(id3Track, pes);\n id3Track.pesData = null;\n } else {\n // either id3Data null or PES truncated, keep it for next frag parsing\n id3Track.pesData = id3Data;\n }\n }\n\n public demuxSampleAes(\n data: Uint8Array,\n keyData: KeyData,\n timeOffset: number,\n ): Promise<DemuxerResult> {\n const demuxResult = this.demux(\n data,\n timeOffset,\n true,\n !this.config.progressive,\n );\n const sampleAes = (this.sampleAes = new SampleAesDecrypter(\n this.observer,\n this.config,\n keyData,\n ));\n return this.decrypt(demuxResult, sampleAes);\n }\n\n private decrypt(\n demuxResult: DemuxerResult,\n sampleAes: SampleAesDecrypter,\n ): Promise<DemuxerResult> {\n return new Promise((resolve) => {\n const { audioTrack, videoTrack } = demuxResult;\n if (audioTrack.samples && audioTrack.segmentCodec === 'aac') {\n sampleAes.decryptAacSamples(audioTrack.samples, 0, () => {\n if (videoTrack.samples) {\n sampleAes.decryptAvcSamples(videoTrack.samples, 0, 0, () => {\n resolve(demuxResult);\n });\n } else {\n resolve(demuxResult);\n }\n });\n } else if (videoTrack.samples) {\n sampleAes.decryptAvcSamples(videoTrack.samples, 0, 0, () => {\n resolve(demuxResult);\n });\n }\n });\n }\n\n public destroy() {\n this._duration = 0;\n }\n\n private parseAACPES(track: DemuxedAudioTrack, pes: PES) {\n let startOffset = 0;\n const aacOverFlow = this.aacOverFlow;\n let data = pes.data;\n if (aacOverFlow) {\n this.aacOverFlow = null;\n const frameMissingBytes = aacOverFlow.missing;\n const sampleLength = aacOverFlow.sample.unit.byteLength;\n // logger.log(`AAC: append overflowing ${sampleLength} bytes to beginning of new PES`);\n if (frameMissingBytes === -1) {\n data = appendUint8Array(aacOverFlow.sample.unit, data);\n } else {\n const frameOverflowBytes = sampleLength - frameMissingBytes;\n aacOverFlow.sample.unit.set(\n data.subarray(0, frameMissingBytes),\n frameOverflowBytes,\n );\n track.samples.push(aacOverFlow.sample);\n startOffset = aacOverFlow.missing;\n }\n }\n // look for ADTS header (0xFFFx)\n let offset: number;\n let len: number;\n for (offset = startOffset, len = data.length; offset < len - 1; offset++) {\n if (ADTS.isHeader(data, offset)) {\n break;\n }\n }\n // if ADTS header does not start straight from the beginning of the PES payload, raise an error\n if (offset !== startOffset) {\n let reason: string;\n const recoverable = offset < len - 1;\n if (recoverable) {\n reason = `AAC PES did not start with ADTS header,offset:${offset}`;\n } else {\n reason = 'No ADTS header found in AAC PES';\n }\n emitParsingError(this.observer, new Error(reason), recoverable);\n if (!recoverable) {\n return;\n }\n }\n\n ADTS.initTrackConfig(\n track,\n this.observer,\n data,\n offset,\n this.audioCodec as string,\n );\n\n let pts: number;\n if (pes.pts !== undefined) {\n pts = pes.pts;\n } else if (aacOverFlow) {\n // if last AAC frame is overflowing, we should ensure timestamps are contiguous:\n // first sample PTS should be equal to last sample PTS + frameDuration\n const frameDuration = ADTS.getFrameDuration(track.samplerate as number);\n pts = aacOverFlow.sample.pts + frameDuration;\n } else {\n logger.warn('[tsdemuxer]: AAC PES unknown PTS');\n return;\n }\n\n // scan for aac samples\n let frameIndex = 0;\n let frame;\n while (offset < len) {\n frame = ADTS.appendFrame(track, data, offset, pts, frameIndex);\n offset += frame.length;\n if (!frame.missing) {\n frameIndex++;\n for (; offset < len - 1; offset++) {\n if (ADTS.isHeader(data, offset)) {\n break;\n }\n }\n } else {\n this.aacOverFlow = frame;\n break;\n }\n }\n }\n\n private parseMPEGPES(track: DemuxedAudioTrack, pes: PES) {\n const data = pes.data;\n const length = data.length;\n let frameIndex = 0;\n let offset = 0;\n const pts = pes.pts;\n if (pts === undefined) {\n logger.warn('[tsdemuxer]: MPEG PES unknown PTS');\n return;\n }\n\n while (offset < length) {\n if (MpegAudio.isHeader(data, offset)) {\n const frame = MpegAudio.appendFrame(\n track,\n data,\n offset,\n pts,\n frameIndex,\n );\n if (frame) {\n offset += frame.length;\n frameIndex++;\n } else {\n // logger.log('Unable to parse Mpeg audio frame');\n break;\n }\n } else {\n // nothing found, keep looking\n offset++;\n }\n }\n }\n\n private parseAC3PES(track: DemuxedAudioTrack, pes: PES) {\n if (__USE_M2TS_ADVANCED_CODECS__) {\n const data = pes.data;\n const pts = pes.pts;\n if (pts === undefined) {\n logger.warn('[tsdemuxer]: AC3 PES unknown PTS');\n return;\n }\n const length = data.length;\n let frameIndex = 0;\n let offset = 0;\n let parsed;\n\n while (\n offset < length &&\n (parsed = AC3.appendFrame(track, data, offset, pts, frameIndex++)) > 0\n ) {\n offset += parsed;\n }\n }\n }\n\n private parseID3PES(id3Track: DemuxedMetadataTrack, pes: PES) {\n if (pes.pts === undefined) {\n logger.warn('[tsdemuxer]: ID3 PES unknown PTS');\n return;\n }\n const id3Sample = Object.assign({}, pes as Required<PES>, {\n type: this._videoTrack ? MetadataSchema.emsg : MetadataSchema.audioId3,\n duration: Number.POSITIVE_INFINITY,\n });\n id3Track.samples.push(id3Sample);\n }\n}\n\nfunction parsePID(data: Uint8Array, offset: number): number {\n // pid is a 13-bit field starting at the last bit of TS[1]\n return ((data[offset + 1] & 0x1f) << 8) + data[offset + 2];\n}\n\nfunction parsePAT(data: Uint8Array, offset: number): number {\n // skip the PSI header and parse the first PMT entry\n return ((data[offset + 10] & 0x1f) << 8) | data[offset + 11];\n}\n\nfunction parsePMT(\n data: Uint8Array,\n offset: number,\n typeSupported: TypeSupported,\n isSampleAes: boolean,\n observer: HlsEventEmitter,\n) {\n const result = {\n audioPid: -1,\n videoPid: -1,\n id3Pid: -1,\n segmentVideoCodec: 'avc',\n segmentAudioCodec: 'aac',\n };\n const sectionLength = ((data[offset + 1] & 0x0f) << 8) | data[offset + 2];\n const tableEnd = offset + 3 + sectionLength - 4;\n // to determine where the table is, we have to figure out how\n // long the program info descriptors are\n const programInfoLength =\n ((data[offset + 10] & 0x0f) << 8) | data[offset + 11];\n // advance the offset to the first entry in the mapping table\n offset += 12 + programInfoLength;\n while (offset < tableEnd) {\n const pid = parsePID(data, offset);\n const esInfoLength = ((data[offset + 3] & 0x0f) << 8) | data[offset + 4];\n switch (data[offset]) {\n case 0xcf: // SAMPLE-AES AAC\n if (!isSampleAes) {\n logEncryptedSamplesFoundInUnencryptedStream('ADTS AAC');\n break;\n }\n /* falls through */\n case 0x0f: // ISO/IEC 13818-7 ADTS AAC (MPEG-2 lower bit-rate audio)\n // logger.log('AAC PID:' + pid);\n if (result.audioPid === -1) {\n result.audioPid = pid;\n }\n\n break;\n\n // Packetized metadata (ID3)\n case 0x15:\n // logger.log('ID3 PID:' + pid);\n if (result.id3Pid === -1) {\n result.id3Pid = pid;\n }\n\n break;\n\n case 0xdb: // SAMPLE-AES AVC\n if (!isSampleAes) {\n logEncryptedSamplesFoundInUnencryptedStream('H.264');\n break;\n }\n /* falls through */\n case 0x1b: // ITU-T Rec. H.264 and ISO/IEC 14496-10 (lower bit-rate video)\n // logger.log('AVC PID:' + pid);\n if (result.videoPid === -1) {\n result.videoPid = pid;\n result.segmentVideoCodec = 'avc';\n }\n\n break;\n\n // ISO/IEC 11172-3 (MPEG-1 audio)\n // or ISO/IEC 13818-3 (MPEG-2 halved sample rate audio)\n case 0x03:\n case 0x04:\n // logger.log('MPEG PID:' + pid);\n if (!typeSupported.mpeg && !typeSupported.mp3) {\n logger.log('MPEG audio found, not supported in this browser');\n } else if (result.audioPid === -1) {\n result.audioPid = pid;\n result.segmentAudioCodec = 'mp3';\n }\n break;\n\n case 0xc1: // SAMPLE-AES AC3\n if (!isSampleAes) {\n logEncryptedSamplesFoundInUnencryptedStream('AC-3');\n break;\n }\n /* falls through */\n case 0x81:\n if (__USE_M2TS_ADVANCED_CODECS__) {\n if (!typeSupported.ac3) {\n logger.log('AC-3 audio found, not supported in this browser');\n } else if (result.audioPid === -1) {\n result.audioPid = pid;\n result.segmentAudioCodec = 'ac3';\n }\n } else {\n logger.warn('AC-3 in M2TS support not included in build');\n }\n break;\n\n case 0x06:\n // stream_type 6 can mean a lot of different things in case of DVB.\n // We need to look at the descriptors. Right now, we're only interested\n // in AC-3 audio, so we do the descriptor parsing only when we don't have\n // an audio PID yet.\n if (result.audioPid === -1 && esInfoLength > 0) {\n let parsePos = offset + 5;\n let remaining = esInfoLength;\n\n while (remaining > 2) {\n const descriptorId = data[parsePos];\n\n switch (descriptorId) {\n case 0x6a: // DVB Descriptor for AC-3\n if (__USE_M2TS_ADVANCED_CODECS__) {\n if (typeSupported.ac3 !== true) {\n logger.log(\n 'AC-3 audio found, not supported in this browser for now',\n );\n } else {\n result.audioPid = pid;\n result.segmentAudioCodec = 'ac3';\n }\n } else {\n logger.warn('AC-3 in M2TS support not included in build');\n }\n break;\n }\n\n const descriptorLen = data[parsePos + 1] + 2;\n parsePos += descriptorLen;\n remaining -= descriptorLen;\n }\n }\n break;\n\n case 0xc2: // SAMPLE-AES EC3\n /* falls through */\n case 0x87:\n emitParsingError(observer, new Error('Unsupported EC-3 in M2TS found'));\n return result;\n\n case 0x24:\n emitParsingError(observer, new Error('Unsupported HEVC in M2TS found'));\n return result;\n\n default:\n // logger.log('unknown stream type:' + data[offset]);\n break;\n }\n // move to the next table entry\n // skip past the elementary stream descriptors, if present\n offset += esInfoLength + 5;\n }\n return result;\n}\n\nfunction emitParsingError(\n observer: HlsEventEmitter,\n error: Error,\n levelRetry?: boolean,\n) {\n logger.warn(`parsing error: ${error.message}`);\n observer.emit(Events.ERROR, Events.ERROR, {\n type: ErrorTypes.MEDIA_ERROR,\n details: ErrorDetails.FRAG_PARSING_ERROR,\n fatal: false,\n levelRetry,\n error,\n reason: error.message,\n });\n}\n\nfunction logEncryptedSamplesFoundInUnencryptedStream(type: string) {\n logger.log(`${type} with AES-128-CBC encryption found in unencrypted stream`);\n}\n\nfunction parsePES(stream: ElementaryStreamData): PES | null {\n let i = 0;\n let frag: Uint8Array;\n let pesLen: number;\n let pesHdrLen: number;\n let pesPts: number | undefined;\n let pesDts: number | undefined;\n const data = stream.data;\n // safety check\n if (!stream || stream.size === 0) {\n return null;\n }\n\n // we might need up to 19 bytes to read PES header\n // if first chunk of data is less than 19 bytes, let's merge it with following ones until we get 19 bytes\n // usually only one merge is needed (and this is rare ...)\n while (data[0].length < 19 && data.length > 1) {\n data[0] = appendUint8Array(data[0], data[1]);\n data.splice(1, 1);\n }\n // retrieve PTS/DTS from first fragment\n frag = data[0];\n const pesPrefix = (frag[0] << 16) + (frag[1] << 8) + frag[2];\n if (pesPrefix === 1) {\n pesLen = (frag[4] << 8) + frag[5];\n // if PES parsed length is not zero and greater than total received length, stop parsing. PES might be truncated\n // minus 6 : PES header size\n if (pesLen && pesLen > stream.size - 6) {\n return null;\n }\n\n const pesFlags = frag[7];\n if (pesFlags & 0xc0) {\n /* PES header described here : http://dvd.sourceforge.net/dvdinfo/pes-hdr.html\n as PTS / DTS is 33 bit we cannot use bitwise operator in JS,\n as Bitwise operators treat their operands as a sequence of 32 bits */\n pesPts =\n (frag[9] & 0x0e) * 536870912 + // 1 << 29\n (frag[10] & 0xff) * 4194304 + // 1 << 22\n (frag[11] & 0xfe) * 16384 + // 1 << 14\n (frag[12] & 0xff) * 128 + // 1 << 7\n (frag[13] & 0xfe) / 2;\n\n if (pesFlags & 0x40) {\n pesDts =\n (frag[14] & 0x0e) * 536870912 + // 1 << 29\n (frag[15] & 0xff) * 4194304 + // 1 << 22\n (frag[16] & 0xfe) * 16384 + // 1 << 14\n (frag[17] & 0xff) * 128 + // 1 << 7\n (frag[18] & 0xfe) / 2;\n\n if (pesPts - pesDts > 60 * 90000) {\n logger.warn(\n `${Math.round(\n (pesPts - pesDts) / 90000,\n )}s delta between PTS and DTS, align them`,\n );\n pesPts = pesDts;\n }\n } else {\n pesDts = pesPts;\n }\n }\n pesHdrLen = frag[8];\n // 9 bytes : 6 bytes for PES header + 3 bytes for PES extension\n let payloadStartOffset = pesHdrLen + 9;\n if (stream.size <= payloadStartOffset) {\n return null;\n }\n stream.size -= payloadStartOffset;\n // reassemble PES packet\n const pesData = new Uint8Array(stream.size);\n for (let j = 0, dataLen = data.length; j < dataLen; j++) {\n frag = data[j];\n let len = frag.byteLength;\n if (payloadStartOffset) {\n if (payloadStartOffset > len) {\n // trim full frag if PES header bigger than frag\n payloadStartOffset -= len;\n continue;\n } else {\n // trim partial frag if PES header smaller than frag\n frag = frag.subarray(payloadStartOffset);\n len -= payloadStartOffset;\n payloadStartOffset = 0;\n }\n }\n pesData.set(frag, i);\n i += len;\n }\n if (pesLen) {\n // payload size : remove PES header + PES extension\n pesLen -= pesHdrLen + 3;\n }\n return { data: pesData, pts: pesPts, dts: pesDts, len: pesLen };\n }\n return null;\n}\n\nexport default TSDemuxer;\n","/**\n * MP3 demuxer\n */\nimport BaseAudioDemuxer from './base-audio-demuxer';\nimport { getID3Data, getTimeStamp } from '../id3';\nimport { getAudioBSID } from './dolby';\nimport { logger } from '../../utils/logger';\nimport * as MpegAudio from './mpegaudio';\n\nclass MP3Demuxer extends BaseAudioDemuxer {\n resetInitSegment(\n initSegment: Uint8Array | undefined,\n audioCodec: string | undefined,\n videoCodec: string | undefined,\n trackDuration: number,\n ) {\n super.resetInitSegment(initSegment, audioCodec, videoCodec, trackDuration);\n this._audioTrack = {\n container: 'audio/mpeg',\n type: 'audio',\n id: 2,\n pid: -1,\n sequenceNumber: 0,\n segmentCodec: 'mp3',\n samples: [],\n manifestCodec: audioCodec,\n duration: trackDuration,\n inputTimeScale: 90000,\n dropped: 0,\n };\n }\n\n static probe(data: Uint8Array | undefined): boolean {\n if (!data) {\n return false;\n }\n\n // check if data contains ID3 timestamp and MPEG sync word\n // Look for MPEG header | 1111 1111 | 111X XYZX | where X can be either 0 or 1 and Y or Z should be 1\n // Layer bits (position 14 and 15) in header should be always different from 0 (Layer I or Layer II or Layer III)\n // More info http://www.mp3-tech.org/programmer/frame_header.html\n const id3Data = getID3Data(data, 0);\n let offset = id3Data?.length || 0;\n\n // Check for ac-3|ec-3 sync bytes and return false if present\n if (\n id3Data &&\n data[offset] === 0x0b &&\n data[offset + 1] === 0x77 &&\n getTimeStamp(id3Data) !== undefined &&\n // check the bsid to confirm ac-3 or ec-3 (not mp3)\n getAudioBSID(data, offset) <= 16\n ) {\n return false;\n }\n\n for (let length = data.length; offset < length; offset++) {\n if (MpegAudio.probe(data, offset)) {\n logger.log('MPEG Audio sync word found !');\n return true;\n }\n }\n return false;\n }\n\n canParse(data, offset) {\n return MpegAudio.canParse(data, offset);\n }\n\n appendFrame(track, data, offset) {\n if (this.basePTS === null) {\n return;\n }\n return MpegAudio.appendFrame(\n track,\n data,\n offset,\n this.basePTS,\n this.frameIndex,\n );\n }\n}\n\nexport default MP3Demuxer;\n","/**\n * AAC helper\n */\n\nclass AAC {\n static getSilentFrame(\n codec?: string,\n channelCount?: number,\n ): Uint8Array | undefined {\n switch (codec) {\n case 'mp4a.40.2':\n if (channelCount === 1) {\n return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x23, 0x80]);\n } else if (channelCount === 2) {\n return new Uint8Array([\n 0x21, 0x00, 0x49, 0x90, 0x02, 0x19, 0x00, 0x23, 0x80,\n ]);\n } else if (channelCount === 3) {\n return new Uint8Array([\n 0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,\n 0x00, 0x8e,\n ]);\n } else if (channelCount === 4) {\n return new Uint8Array([\n 0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,\n 0x00, 0x80, 0x2c, 0x80, 0x08, 0x02, 0x38,\n ]);\n } else if (channelCount === 5) {\n return new Uint8Array([\n 0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,\n 0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x38,\n ]);\n } else if (channelCount === 6) {\n return new Uint8Array([\n 0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64,\n 0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x00, 0xb2,\n 0x00, 0x20, 0x08, 0xe0,\n ]);\n }\n\n break;\n // handle HE-AAC below (mp4a.40.5 / mp4a.40.29)\n default:\n if (channelCount === 1) {\n // ffmpeg -y -f lavfi -i \"aevalsrc=0:d=0.05\" -c:a libfdk_aac -profile:a aac_he -b:a 4k output.aac && hexdump -v -e '16/1 \"0x%x,\" \"\\n\"' -v output.aac\n return new Uint8Array([\n 0x1, 0x40, 0x22, 0x80, 0xa3, 0x4e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0,\n 0x0, 0x1c, 0x6, 0xf1, 0xc1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5e,\n ]);\n } else if (channelCount === 2) {\n // ffmpeg -y -f lavfi -i \"aevalsrc=0|0:d=0.05\" -c:a libfdk_aac -profile:a aac_he_v2 -b:a 4k output.aac && hexdump -v -e '16/1 \"0x%x,\" \"\\n\"' -v output.aac\n return new Uint8Array([\n 0x1, 0x40, 0x22, 0x80, 0xa3, 0x5e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0,\n 0x0, 0x0, 0x95, 0x0, 0x6, 0xf1, 0xa1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5e,\n ]);\n } else if (channelCount === 3) {\n // ffmpeg -y -f lavfi -i \"aevalsrc=0|0|0:d=0.05\" -c:a libfdk_aac -profile:a aac_he_v2 -b:a 4k output.aac && hexdump -v -e '16/1 \"0x%x,\" \"\\n\"' -v output.aac\n return new Uint8Array([\n 0x1, 0x40, 0x22, 0x80, 0xa3, 0x5e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0,\n 0x0, 0x0, 0x95, 0x0, 0x6, 0xf1, 0xa1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a,\n 0x5a, 0x5e,\n ]);\n }\n break;\n }\n return undefined;\n }\n}\n\nexport default AAC;\n","/**\n * Generate MP4 Box\n */\n\nimport { appendUint8Array } from '../utils/mp4-tools';\n\ntype HdlrTypes = {\n video: Uint8Array;\n audio: Uint8Array;\n};\n\nconst UINT32_MAX = Math.pow(2, 32) - 1;\n\nclass MP4 {\n public static types: Record<string, number[]>;\n private static HDLR_TYPES: HdlrTypes;\n private static STTS: Uint8Array;\n private static STSC: Uint8Array;\n private static STCO: Uint8Array;\n private static STSZ: Uint8Array;\n private static VMHD: Uint8Array;\n private static SMHD: Uint8Array;\n private static STSD: Uint8Array;\n private static FTYP: Uint8Array;\n private static DINF: Uint8Array;\n\n static init() {\n MP4.types = {\n avc1: [], // codingname\n avcC: [],\n btrt: [],\n dinf: [],\n dref: [],\n esds: [],\n ftyp: [],\n hdlr: [],\n mdat: [],\n mdhd: [],\n mdia: [],\n mfhd: [],\n minf: [],\n moof: [],\n moov: [],\n mp4a: [],\n '.mp3': [],\n dac3: [],\n 'ac-3': [],\n mvex: [],\n mvhd: [],\n pasp: [],\n sdtp: [],\n stbl: [],\n stco: [],\n stsc: [],\n stsd: [],\n stsz: [],\n stts: [],\n tfdt: [],\n tfhd: [],\n traf: [],\n trak: [],\n trun: [],\n trex: [],\n tkhd: [],\n vmhd: [],\n smhd: [],\n };\n\n let i: string;\n for (i in MP4.types) {\n if (MP4.types.hasOwnProperty(i)) {\n MP4.types[i] = [\n i.charCodeAt(0),\n i.charCodeAt(1),\n i.charCodeAt(2),\n i.charCodeAt(3),\n ];\n }\n }\n\n const videoHdlr = new Uint8Array([\n 0x00, // version 0\n 0x00,\n 0x00,\n 0x00, // flags\n 0x00,\n 0x00,\n 0x00,\n 0x00, // pre_defined\n 0x76,\n 0x69,\n 0x64,\n 0x65, // handler_type: 'vide'\n 0x00,\n 0x00,\n 0x00,\n 0x00, // reserved\n 0x00,\n 0x00,\n 0x00,\n 0x00, // reserved\n 0x00,\n 0x00,\n 0x00,\n 0x00, // reserved\n 0x56,\n 0x69,\n 0x64,\n 0x65,\n 0x6f,\n 0x48,\n 0x61,\n 0x6e,\n 0x64,\n 0x6c,\n 0x65,\n 0x72,\n 0x00, // name: 'VideoHandler'\n ]);\n\n const audioHdlr = new Uint8Array([\n 0x00, // version 0\n 0x00,\n 0x00,\n 0x00, // flags\n 0x00,\n 0x00,\n 0x00,\n 0x00, // pre_defined\n 0x73,\n 0x6f,\n 0x75,\n 0x6e, // handler_type: 'soun'\n 0x00,\n 0x00,\n 0x00,\n 0x00, // reserved\n 0x00,\n 0x00,\n 0x00,\n 0x00, // reserved\n 0x00,\n 0x00,\n 0x00,\n 0x00, // reserved\n 0x53,\n 0x6f,\n 0x75,\n 0x6e,\n 0x64,\n 0x48,\n 0x61,\n 0x6e,\n 0x64,\n 0x6c,\n 0x65,\n 0x72,\n 0x00, // name: 'SoundHandler'\n ]);\n\n MP4.HDLR_TYPES = {\n video: videoHdlr,\n audio: audioHdlr,\n };\n\n const dref = new Uint8Array([\n 0x00, // version 0\n 0x00,\n 0x00,\n 0x00, // flags\n 0x00,\n 0x00,\n 0x00,\n 0x01, // entry_count\n 0x00,\n 0x00,\n 0x00,\n 0x0c, // entry_size\n 0x75,\n 0x72,\n 0x6c,\n 0x20, // 'url' type\n 0x00, // version 0\n 0x00,\n 0x00,\n 0x01, // entry_flags\n ]);\n\n const stco = new Uint8Array([\n 0x00, // version\n 0x00,\n 0x00,\n 0x00, // flags\n 0x00,\n 0x00,\n 0x00,\n 0x00, // entry_count\n ]);\n\n MP4.STTS = MP4.STSC = MP4.STCO = stco;\n\n MP4.STSZ = new Uint8Array([\n 0x00, // version\n 0x00,\n 0x00,\n 0x00, // flags\n 0x00,\n 0x00,\n 0x00,\n 0x00, // sample_size\n 0x00,\n 0x00,\n 0x00,\n 0x00, // sample_count\n ]);\n MP4.VMHD = new Uint8Array([\n 0x00, // version\n 0x00,\n 0x00,\n 0x01, // flags\n 0x00,\n 0x00, // graphicsmode\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00, // opcolor\n ]);\n MP4.SMHD = new Uint8Array([\n 0x00, // version\n 0x00,\n 0x00,\n 0x00, // flags\n 0x00,\n 0x00, // balance\n 0x00,\n 0x00, // reserved\n ]);\n\n MP4.STSD = new Uint8Array([\n 0x00, // version 0\n 0x00,\n 0x00,\n 0x00, // flags\n 0x00,\n 0x00,\n 0x00,\n 0x01,\n ]); // entry_count\n\n const majorBrand = new Uint8Array([105, 115, 111, 109]); // isom\n const avc1Brand = new Uint8Array([97, 118, 99, 49]); // avc1\n const minorVersion = new Uint8Array([0, 0, 0, 1]);\n\n MP4.FTYP = MP4.box(\n MP4.types.ftyp,\n majorBrand,\n minorVersion,\n majorBrand,\n avc1Brand,\n );\n MP4.DINF = MP4.box(MP4.types.dinf, MP4.box(MP4.types.dref, dref));\n }\n\n static box(type, ...payload: Uint8Array[]) {\n let size = 8;\n let i = payload.length;\n const len = i;\n // calculate the total size we need to allocate\n while (i--) {\n size += payload[i].byteLength;\n }\n\n const result = new Uint8Array(size);\n result[0] = (size >> 24) & 0xff;\n result[1] = (size >> 16) & 0xff;\n result[2] = (size >> 8) & 0xff;\n result[3] = size & 0xff;\n result.set(type, 4);\n // copy the payload into the result\n for (i = 0, size = 8; i < len; i++) {\n // copy payload[i] array @ offset size\n result.set(payload[i], size);\n size += payload[i].byteLength;\n }\n return result;\n }\n\n static hdlr(type) {\n return MP4.box(MP4.types.hdlr, MP4.HDLR_TYPES[type]);\n }\n\n static mdat(data) {\n return MP4.box(MP4.types.mdat, data);\n }\n\n static mdhd(timescale, duration) {\n duration *= timescale;\n const upperWordDuration = Math.floor(duration / (UINT32_MAX + 1));\n const lowerWordDuration = Math.floor(duration % (UINT32_MAX + 1));\n return MP4.box(\n MP4.types.mdhd,\n new Uint8Array([\n 0x01, // version 1\n 0x00,\n 0x00,\n 0x00, // flags\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x02, // creation_time\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x03, // modification_time\n (timescale >> 24) & 0xff,\n (timescale >> 16) & 0xff,\n (timescale >> 8) & 0xff,\n timescale & 0xff, // timescale\n upperWordDuration >> 24,\n (upperWordDuration >> 16) & 0xff,\n (upperWordDuration >> 8) & 0xff,\n upperWordDuration & 0xff,\n lowerWordDuration >> 24,\n (lowerWordDuration >> 16) & 0xff,\n (lowerWordDuration >> 8) & 0xff,\n lowerWordDuration & 0xff,\n 0x55,\n 0xc4, // 'und' language (undetermined)\n 0x00,\n 0x00,\n ]),\n );\n }\n\n static mdia(track) {\n return MP4.box(\n MP4.types.mdia,\n MP4.mdhd(track.timescale, track.duration),\n MP4.hdlr(track.type),\n MP4.minf(track),\n );\n }\n\n static mfhd(sequenceNumber) {\n return MP4.box(\n MP4.types.mfhd,\n new Uint8Array([\n 0x00,\n 0x00,\n 0x00,\n 0x00, // flags\n sequenceNumber >> 24,\n (sequenceNumber >> 16) & 0xff,\n (sequenceNumber >> 8) & 0xff,\n sequenceNumber & 0xff, // sequence_number\n ]),\n );\n }\n\n static minf(track) {\n if (track.type === 'audio') {\n return MP4.box(\n MP4.types.minf,\n MP4.box(MP4.types.smhd, MP4.SMHD),\n MP4.DINF,\n MP4.stbl(track),\n );\n } else {\n return MP4.box(\n MP4.types.minf,\n MP4.box(MP4.types.vmhd, MP4.VMHD),\n MP4.DINF,\n MP4.stbl(track),\n );\n }\n }\n\n static moof(sn, baseMediaDecodeTime, track) {\n return MP4.box(\n MP4.types.moof,\n MP4.mfhd(sn),\n MP4.traf(track, baseMediaDecodeTime),\n );\n }\n\n static moov(tracks) {\n let i = tracks.length;\n const boxes: Uint8Array[] = [];\n\n while (i--) {\n boxes[i] = MP4.trak(tracks[i]);\n }\n\n return MP4.box.apply(\n null,\n [MP4.types.moov, MP4.mvhd(tracks[0].timescale, tracks[0].duration)]\n .concat(boxes)\n .concat(MP4.mvex(tracks)),\n );\n }\n\n static mvex(tracks) {\n let i = tracks.length;\n const boxes: Uint8Array[] = [];\n\n while (i--) {\n boxes[i] = MP4.trex(tracks[i]);\n }\n\n return MP4.box.apply(null, [MP4.types.mvex, ...boxes]);\n }\n\n static mvhd(timescale, duration) {\n duration *= timescale;\n const upperWordDuration = Math.floor(duration / (UINT32_MAX + 1));\n const lowerWordDuration = Math.floor(duration % (UINT32_MAX + 1));\n const bytes = new Uint8Array([\n 0x01, // version 1\n 0x00,\n 0x00,\n 0x00, // flags\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x02, // creation_time\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x03, // modification_time\n (timescale >> 24) & 0xff,\n (timescale >> 16) & 0xff,\n (timescale >> 8) & 0xff,\n timescale & 0xff, // timescale\n upperWordDuration >> 24,\n (upperWordDuration >> 16) & 0xff,\n (upperWordDuration >> 8) & 0xff,\n upperWordDuration & 0xff,\n lowerWordDuration >> 24,\n (lowerWordDuration >> 16) & 0xff,\n (lowerWordDuration >> 8) & 0xff,\n lowerWordDuration & 0xff,\n 0x00,\n 0x01,\n 0x00,\n 0x00, // 1.0 rate\n 0x01,\n 0x00, // 1.0 volume\n 0x00,\n 0x00, // reserved\n 0x00,\n 0x00,\n 0x00,\n 0x00, // reserved\n 0x00,\n 0x00,\n 0x00,\n 0x00, // reserved\n 0x00,\n 0x01,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x01,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x40,\n 0x00,\n 0x00,\n 0x00, // transformation: unity matrix\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00, // pre_defined\n 0xff,\n 0xff,\n 0xff,\n 0xff, // next_track_ID\n ]);\n return MP4.box(MP4.types.mvhd, bytes);\n }\n\n static sdtp(track) {\n const samples = track.samples || [];\n const bytes = new Uint8Array(4 + samples.length);\n let i;\n let flags;\n // leave the full box header (4 bytes) all zero\n // write the sample table\n for (i = 0; i < samples.length; i++) {\n flags = samples[i].flags;\n bytes[i + 4] =\n (flags.dependsOn << 4) |\n (flags.isDependedOn << 2) |\n flags.hasRedundancy;\n }\n\n return MP4.box(MP4.types.sdtp, bytes);\n }\n\n static stbl(track) {\n return MP4.box(\n MP4.types.stbl,\n MP4.stsd(track),\n MP4.box(MP4.types.stts, MP4.STTS),\n MP4.box(MP4.types.stsc, MP4.STSC),\n MP4.box(MP4.types.stsz, MP4.STSZ),\n MP4.box(MP4.types.stco, MP4.STCO),\n );\n }\n\n static avc1(track) {\n let sps: number[] = [];\n let pps: number[] = [];\n let i;\n let data;\n let len;\n // assemble the SPSs\n\n for (i = 0; i < track.sps.length; i++) {\n data = track.sps[i];\n len = data.byteLength;\n sps.push((len >>> 8) & 0xff);\n sps.push(len & 0xff);\n\n // SPS\n sps = sps.concat(Array.prototype.slice.call(data));\n }\n\n // assemble the PPSs\n for (i = 0; i < track.pps.length; i++) {\n data = track.pps[i];\n len = data.byteLength;\n pps.push((len >>> 8) & 0xff);\n pps.push(len & 0xff);\n\n pps = pps.concat(Array.prototype.slice.call(data));\n }\n\n const avcc = MP4.box(\n MP4.types.avcC,\n new Uint8Array(\n [\n 0x01, // version\n sps[3], // profile\n sps[4], // profile compat\n sps[5], // level\n 0xfc | 3, // lengthSizeMinusOne, hard-coded to 4 bytes\n 0xe0 | track.sps.length, // 3bit reserved (111) + numOfSequenceParameterSets\n ]\n .concat(sps)\n .concat([\n track.pps.length, // numOfPictureParameterSets\n ])\n .concat(pps),\n ),\n ); // \"PPS\"\n const width = track.width;\n const height = track.height;\n const hSpacing = track.pixelRatio[0];\n const vSpacing = track.pixelRatio[1];\n\n return MP4.box(\n MP4.types.avc1,\n new Uint8Array([\n 0x00,\n 0x00,\n 0x00, // reserved\n 0x00,\n 0x00,\n 0x00, // reserved\n 0x00,\n 0x01, // data_reference_index\n 0x00,\n 0x00, // pre_defined\n 0x00,\n 0x00, // reserved\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00, // pre_defined\n (width >> 8) & 0xff,\n width & 0xff, // width\n (height >> 8) & 0xff,\n height & 0xff, // height\n 0x00,\n 0x48,\n 0x00,\n 0x00, // horizresolution\n 0x00,\n 0x48,\n 0x00,\n 0x00, // vertresolution\n 0x00,\n 0x00,\n 0x00,\n 0x00, // reserved\n 0x00,\n 0x01, // frame_count\n 0x12,\n 0x64,\n 0x61,\n 0x69,\n 0x6c, // dailymotion/hls.js\n 0x79,\n 0x6d,\n 0x6f,\n 0x74,\n 0x69,\n 0x6f,\n 0x6e,\n 0x2f,\n 0x68,\n 0x6c,\n 0x73,\n 0x2e,\n 0x6a,\n 0x73,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00, // compressorname\n 0x00,\n 0x18, // depth = 24\n 0x11,\n 0x11,\n ]), // pre_defined = -1\n avcc,\n MP4.box(\n MP4.types.btrt,\n new Uint8Array([\n 0x00,\n 0x1c,\n 0x9c,\n 0x80, // bufferSizeDB\n 0x00,\n 0x2d,\n 0xc6,\n 0xc0, // maxBitrate\n 0x00,\n 0x2d,\n 0xc6,\n 0xc0,\n ]),\n ), // avgBitrate\n MP4.box(\n MP4.types.pasp,\n new Uint8Array([\n hSpacing >> 24, // hSpacing\n (hSpacing >> 16) & 0xff,\n (hSpacing >> 8) & 0xff,\n hSpacing & 0xff,\n vSpacing >> 24, // vSpacing\n (vSpacing >> 16) & 0xff,\n (vSpacing >> 8) & 0xff,\n vSpacing & 0xff,\n ]),\n ),\n );\n }\n\n static esds(track) {\n const configlen = track.config.length;\n return new Uint8Array(\n [\n 0x00, // version 0\n 0x00,\n 0x00,\n 0x00, // flags\n\n 0x03, // descriptor_type\n 0x17 + configlen, // length\n 0x00,\n 0x01, // es_id\n 0x00, // stream_priority\n\n 0x04, // descriptor_type\n 0x0f + configlen, // length\n 0x40, // codec : mpeg4_audio\n 0x15, // stream_type\n 0x00,\n 0x00,\n 0x00, // buffer_size\n 0x00,\n 0x00,\n 0x00,\n 0x00, // maxBitrate\n 0x00,\n 0x00,\n 0x00,\n 0x00, // avgBitrate\n\n 0x05, // descriptor_type\n ]\n .concat([configlen])\n .concat(track.config)\n .concat([0x06, 0x01, 0x02]),\n ); // GASpecificConfig)); // length + audio config descriptor\n }\n\n static audioStsd(track) {\n const samplerate = track.samplerate;\n return new Uint8Array([\n 0x00,\n 0x00,\n 0x00, // reserved\n 0x00,\n 0x00,\n 0x00, // reserved\n 0x00,\n 0x01, // data_reference_index\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00, // reserved\n 0x00,\n track.channelCount, // channelcount\n 0x00,\n 0x10, // sampleSize:16bits\n 0x00,\n 0x00,\n 0x00,\n 0x00, // reserved2\n (samplerate >> 8) & 0xff,\n samplerate & 0xff, //\n 0x00,\n 0x00,\n ]);\n }\n\n static mp4a(track) {\n return MP4.box(\n MP4.types.mp4a,\n MP4.audioStsd(track),\n MP4.box(MP4.types.esds, MP4.esds(track)),\n );\n }\n\n static mp3(track) {\n return MP4.box(MP4.types['.mp3'], MP4.audioStsd(track));\n }\n\n static ac3(track) {\n return MP4.box(\n MP4.types['ac-3'],\n MP4.audioStsd(track),\n MP4.box(MP4.types.dac3, track.config),\n );\n }\n\n static stsd(track) {\n if (track.type === 'audio') {\n if (track.segmentCodec === 'mp3' && track.codec === 'mp3') {\n return MP4.box(MP4.types.stsd, MP4.STSD, MP4.mp3(track));\n }\n if (track.segmentCodec === 'ac3') {\n return MP4.box(MP4.types.stsd, MP4.STSD, MP4.ac3(track));\n }\n return MP4.box(MP4.types.stsd, MP4.STSD, MP4.mp4a(track));\n } else {\n return MP4.box(MP4.types.stsd, MP4.STSD, MP4.avc1(track));\n }\n }\n\n static tkhd(track) {\n const id = track.id;\n const duration = track.duration * track.timescale;\n const width = track.width;\n const height = track.height;\n const upperWordDuration = Math.floor(duration / (UINT32_MAX + 1));\n const lowerWordDuration = Math.floor(duration % (UINT32_MAX + 1));\n return MP4.box(\n MP4.types.tkhd,\n new Uint8Array([\n 0x01, // version 1\n 0x00,\n 0x00,\n 0x07, // flags\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x02, // creation_time\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x03, // modification_time\n (id >> 24) & 0xff,\n (id >> 16) & 0xff,\n (id >> 8) & 0xff,\n id & 0xff, // track_ID\n 0x00,\n 0x00,\n 0x00,\n 0x00, // reserved\n upperWordDuration >> 24,\n (upperWordDuration >> 16) & 0xff,\n (upperWordDuration >> 8) & 0xff,\n upperWordDuration & 0xff,\n lowerWordDuration >> 24,\n (lowerWordDuration >> 16) & 0xff,\n (lowerWordDuration >> 8) & 0xff,\n lowerWordDuration & 0xff,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00, // reserved\n 0x00,\n 0x00, // layer\n 0x00,\n 0x00, // alternate_group\n 0x00,\n 0x00, // non-audio track volume\n 0x00,\n 0x00, // reserved\n 0x00,\n 0x01,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x01,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x40,\n 0x00,\n 0x00,\n 0x00, // transformation: unity matrix\n (width >> 8) & 0xff,\n width & 0xff,\n 0x00,\n 0x00, // width\n (height >> 8) & 0xff,\n height & 0xff,\n 0x00,\n 0x00, // height\n ]),\n );\n }\n\n static traf(track, baseMediaDecodeTime) {\n const sampleDependencyTable = MP4.sdtp(track);\n const id = track.id;\n const upperWordBaseMediaDecodeTime = Math.floor(\n baseMediaDecodeTime / (UINT32_MAX + 1),\n );\n const lowerWordBaseMediaDecodeTime = Math.floor(\n baseMediaDecodeTime % (UINT32_MAX + 1),\n );\n return MP4.box(\n MP4.types.traf,\n MP4.box(\n MP4.types.tfhd,\n new Uint8Array([\n 0x00, // version 0\n 0x00,\n 0x00,\n 0x00, // flags\n id >> 24,\n (id >> 16) & 0xff,\n (id >> 8) & 0xff,\n id & 0xff, // track_ID\n ]),\n ),\n MP4.box(\n MP4.types.tfdt,\n new Uint8Array([\n 0x01, // version 1\n 0x00,\n 0x00,\n 0x00, // flags\n upperWordBaseMediaDecodeTime >> 24,\n (upperWordBaseMediaDecodeTime >> 16) & 0xff,\n (upperWordBaseMediaDecodeTime >> 8) & 0xff,\n upperWordBaseMediaDecodeTime & 0xff,\n lowerWordBaseMediaDecodeTime >> 24,\n (lowerWordBaseMediaDecodeTime >> 16) & 0xff,\n (lowerWordBaseMediaDecodeTime >> 8) & 0xff,\n lowerWordBaseMediaDecodeTime & 0xff,\n ]),\n ),\n MP4.trun(\n track,\n sampleDependencyTable.length +\n 16 + // tfhd\n 20 + // tfdt\n 8 + // traf header\n 16 + // mfhd\n 8 + // moof header\n 8,\n ), // mdat header\n sampleDependencyTable,\n );\n }\n\n /**\n * Generate a track box.\n * @param track a track definition\n */\n static trak(track) {\n track.duration = track.duration || 0xffffffff;\n return MP4.box(MP4.types.trak, MP4.tkhd(track), MP4.mdia(track));\n }\n\n static trex(track) {\n const id = track.id;\n return MP4.box(\n MP4.types.trex,\n new Uint8Array([\n 0x00, // version 0\n 0x00,\n 0x00,\n 0x00, // flags\n id >> 24,\n (id >> 16) & 0xff,\n (id >> 8) & 0xff,\n id & 0xff, // track_ID\n 0x00,\n 0x00,\n 0x00,\n 0x01, // default_sample_description_index\n 0x00,\n 0x00,\n 0x00,\n 0x00, // default_sample_duration\n 0x00,\n 0x00,\n 0x00,\n 0x00, // default_sample_size\n 0x00,\n 0x01,\n 0x00,\n 0x01, // default_sample_flags\n ]),\n );\n }\n\n static trun(track, offset) {\n const samples = track.samples || [];\n const len = samples.length;\n const arraylen = 12 + 16 * len;\n const array = new Uint8Array(arraylen);\n let i;\n let sample;\n let duration;\n let size;\n let flags;\n let cts;\n offset += 8 + arraylen;\n array.set(\n [\n track.type === 'video' ? 0x01 : 0x00, // version 1 for video with signed-int sample_composition_time_offset\n 0x00,\n 0x0f,\n 0x01, // flags\n (len >>> 24) & 0xff,\n (len >>> 16) & 0xff,\n (len >>> 8) & 0xff,\n len & 0xff, // sample_count\n (offset >>> 24) & 0xff,\n (offset >>> 16) & 0xff,\n (offset >>> 8) & 0xff,\n offset & 0xff, // data_offset\n ],\n 0,\n );\n for (i = 0; i < len; i++) {\n sample = samples[i];\n duration = sample.duration;\n size = sample.size;\n flags = sample.flags;\n cts = sample.cts;\n array.set(\n [\n (duration >>> 24) & 0xff,\n (duration >>> 16) & 0xff,\n (duration >>> 8) & 0xff,\n duration & 0xff, // sample_duration\n (size >>> 24) & 0xff,\n (size >>> 16) & 0xff,\n (size >>> 8) & 0xff,\n size & 0xff, // sample_size\n (flags.isLeading << 2) | flags.dependsOn,\n (flags.isDependedOn << 6) |\n (flags.hasRedundancy << 4) |\n (flags.paddingValue << 1) |\n flags.isNonSync,\n flags.degradPrio & (0xf0 << 8),\n flags.degradPrio & 0x0f, // sample_flags\n (cts >>> 24) & 0xff,\n (cts >>> 16) & 0xff,\n (cts >>> 8) & 0xff,\n cts & 0xff, // sample_composition_time_offset\n ],\n 12 + 16 * i,\n );\n }\n return MP4.box(MP4.types.trun, array);\n }\n\n static initSegment(tracks) {\n if (!MP4.types) {\n MP4.init();\n }\n\n const movie = MP4.moov(tracks);\n const result = appendUint8Array(MP4.FTYP, movie);\n return result;\n }\n}\n\nexport default MP4;\n","const MPEG_TS_CLOCK_FREQ_HZ = 90000;\n\nexport type RationalTimestamp = {\n baseTime: number; // ticks\n timescale: number; // ticks per second\n};\n\nexport function toTimescaleFromBase(\n baseTime: number,\n destScale: number,\n srcBase: number = 1,\n round: boolean = false,\n): number {\n const result = baseTime * destScale * srcBase; // equivalent to `(value * scale) / (1 / base)`\n return round ? Math.round(result) : result;\n}\n\nexport function toTimescaleFromScale(\n baseTime: number,\n destScale: number,\n srcScale: number = 1,\n round: boolean = false,\n): number {\n return toTimescaleFromBase(baseTime, destScale, 1 / srcScale, round);\n}\n\nexport function toMsFromMpegTsClock(\n baseTime: number,\n round: boolean = false,\n): number {\n return toTimescaleFromBase(baseTime, 1000, 1 / MPEG_TS_CLOCK_FREQ_HZ, round);\n}\n\nexport function toMpegTsClockFromTimescale(\n baseTime: number,\n srcScale: number = 1,\n): number {\n return toTimescaleFromBase(baseTime, MPEG_TS_CLOCK_FREQ_HZ, 1 / srcScale);\n}\n","import AAC from './aac-helper';\nimport MP4 from './mp4-generator';\nimport type { HlsEventEmitter } from '../events';\nimport { Events } from '../events';\nimport { ErrorTypes, ErrorDetails } from '../errors';\nimport { logger } from '../utils/logger';\nimport {\n InitSegmentData,\n Remuxer,\n RemuxerResult,\n RemuxedMetadata,\n RemuxedTrack,\n RemuxedUserdata,\n} from '../types/remuxer';\nimport { PlaylistLevelType } from '../types/loader';\nimport {\n RationalTimestamp,\n toMsFromMpegTsClock,\n} from '../utils/timescale-conversion';\nimport type {\n AudioSample,\n VideoSample,\n DemuxedAudioTrack,\n DemuxedVideoTrack,\n DemuxedMetadataTrack,\n DemuxedUserdataTrack,\n} from '../types/demuxer';\nimport type { TrackSet } from '../types/track';\nimport type { SourceBufferName } from '../types/buffer';\nimport type { Fragment } from '../loader/fragment';\nimport type { HlsConfig } from '../config';\n\nconst MAX_SILENT_FRAME_DURATION = 10 * 1000; // 10 seconds\nconst AAC_SAMPLES_PER_FRAME = 1024;\nconst MPEG_AUDIO_SAMPLE_PER_FRAME = 1152;\nconst AC3_SAMPLES_PER_FRAME = 1536;\n\nlet chromeVersion: number | null = null;\nlet safariWebkitVersion: number | null = null;\n\nexport default class MP4Remuxer implements Remuxer {\n private observer: HlsEventEmitter;\n private config: HlsConfig;\n private typeSupported: any;\n private ISGenerated: boolean = false;\n private _initPTS: RationalTimestamp | null = null;\n private _initDTS: RationalTimestamp | null = null;\n private nextAvcDts: number | null = null;\n private nextAudioPts: number | null = null;\n private videoSampleDuration: number | null = null;\n private isAudioContiguous: boolean = false;\n private isVideoContiguous: boolean = false;\n private videoTrackConfig?: {\n width?: number;\n height?: number;\n pixelRatio?: [number, number];\n };\n\n constructor(\n observer: HlsEventEmitter,\n config: HlsConfig,\n typeSupported,\n vendor = '',\n ) {\n this.observer = observer;\n this.config = config;\n this.typeSupported = typeSupported;\n this.ISGenerated = false;\n\n if (chromeVersion === null) {\n const userAgent = navigator.userAgent || '';\n const result = userAgent.match(/Chrome\\/(\\d+)/i);\n chromeVersion = result ? parseInt(result[1]) : 0;\n }\n if (safariWebkitVersion === null) {\n const result = navigator.userAgent.match(/Safari\\/(\\d+)/i);\n safariWebkitVersion = result ? parseInt(result[1]) : 0;\n }\n }\n\n destroy() {\n // @ts-ignore\n this.config = this.videoTrackConfig = this._initPTS = this._initDTS = null;\n }\n\n resetTimeStamp(defaultTimeStamp: RationalTimestamp | null) {\n logger.log('[mp4-remuxer]: initPTS & initDTS reset');\n this._initPTS = this._initDTS = defaultTimeStamp;\n }\n\n resetNextTimestamp() {\n logger.log('[mp4-remuxer]: reset next timestamp');\n this.isVideoContiguous = false;\n this.isAudioContiguous = false;\n }\n\n resetInitSegment() {\n logger.log('[mp4-remuxer]: ISGenerated flag reset');\n this.ISGenerated = false;\n this.videoTrackConfig = undefined;\n }\n\n getVideoStartPts(videoSamples: VideoSample[]) {\n // Get the minimum PTS value relative to the first sample's PTS, normalized for 33-bit wrapping\n let rolloverDetected = false;\n const firstPts = videoSamples[0].pts;\n const startPTS = videoSamples.reduce((minPTS, sample) => {\n let pts = sample.pts;\n let delta = pts - minPTS;\n if (delta < -4294967296) {\n // 2^32, see PTSNormalize for reasoning, but we're hitting a rollover here, and we don't want that to impact the timeOffset calculation\n rolloverDetected = true;\n pts = normalizePts(pts, firstPts);\n delta = pts - minPTS;\n }\n if (delta > 0) {\n return minPTS;\n }\n return pts;\n }, firstPts);\n if (rolloverDetected) {\n logger.debug('PTS rollover detected');\n }\n return startPTS;\n }\n\n remux(\n audioTrack: DemuxedAudioTrack,\n videoTrack: DemuxedVideoTrack,\n id3Track: DemuxedMetadataTrack,\n textTrack: DemuxedUserdataTrack,\n timeOffset: number,\n accurateTimeOffset: boolean,\n flush: boolean,\n playlistType: PlaylistLevelType,\n ): RemuxerResult {\n let video: RemuxedTrack | undefined;\n let audio: RemuxedTrack | undefined;\n let initSegment: InitSegmentData | undefined;\n let text: RemuxedUserdata | undefined;\n let id3: RemuxedMetadata | undefined;\n let independent: boolean | undefined;\n let audioTimeOffset = timeOffset;\n let videoTimeOffset = timeOffset;\n\n // If we're remuxing audio and video progressively, wait until we've received enough samples for each track before proceeding.\n // This is done to synchronize the audio and video streams. We know if the current segment will have samples if the \"pid\"\n // parameter is greater than -1. The pid is set when the PMT is parsed, which contains the tracks list.\n // However, if the initSegment has already been generated, or we've reached the end of a segment (flush),\n // then we can remux one track without waiting for the other.\n const hasAudio = audioTrack.pid > -1;\n const hasVideo = videoTrack.pid > -1;\n const length = videoTrack.samples.length;\n const enoughAudioSamples = audioTrack.samples.length > 0;\n const enoughVideoSamples = (flush && length > 0) || length > 1;\n const canRemuxAvc =\n ((!hasAudio || enoughAudioSamples) &&\n (!hasVideo || enoughVideoSamples)) ||\n this.ISGenerated ||\n flush;\n\n if (canRemuxAvc) {\n if (this.ISGenerated) {\n const config = this.videoTrackConfig;\n if (\n config &&\n (videoTrack.width !== config.width ||\n videoTrack.height !== config.height ||\n videoTrack.pixelRatio?.[0] !== config.pixelRatio?.[0] ||\n videoTrack.pixelRatio?.[1] !== config.pixelRatio?.[1])\n ) {\n this.resetInitSegment();\n }\n } else {\n initSegment = this.generateIS(\n audioTrack,\n videoTrack,\n timeOffset,\n accurateTimeOffset,\n );\n }\n\n const isVideoContiguous = this.isVideoContiguous;\n let firstKeyFrameIndex = -1;\n let firstKeyFramePTS;\n\n if (enoughVideoSamples) {\n firstKeyFrameIndex = findKeyframeIndex(videoTrack.samples);\n if (!isVideoContiguous && this.config.forceKeyFrameOnDiscontinuity) {\n independent = true;\n if (firstKeyFrameIndex > 0) {\n logger.warn(\n `[mp4-remuxer]: Dropped ${firstKeyFrameIndex} out of ${length} video samples due to a missing keyframe`,\n );\n const startPTS = this.getVideoStartPts(videoTrack.samples);\n videoTrack.samples = videoTrack.samples.slice(firstKeyFrameIndex);\n videoTrack.dropped += firstKeyFrameIndex;\n videoTimeOffset +=\n (videoTrack.samples[0].pts - startPTS) /\n videoTrack.inputTimeScale;\n firstKeyFramePTS = videoTimeOffset;\n } else if (firstKeyFrameIndex === -1) {\n logger.warn(\n `[mp4-remuxer]: No keyframe found out of ${length} video samples`,\n );\n independent = false;\n }\n }\n }\n\n if (this.ISGenerated) {\n if (enoughAudioSamples && enoughVideoSamples) {\n // timeOffset is expected to be the offset of the first timestamp of this fragment (first DTS)\n // if first audio DTS is not aligned with first video DTS then we need to take that into account\n // when providing timeOffset to remuxAudio / remuxVideo. if we don't do that, there might be a permanent / small\n // drift between audio and video streams\n const startPTS = this.getVideoStartPts(videoTrack.samples);\n const tsDelta =\n normalizePts(audioTrack.samples[0].pts, startPTS) - startPTS;\n const audiovideoTimestampDelta = tsDelta / videoTrack.inputTimeScale;\n audioTimeOffset += Math.max(0, audiovideoTimestampDelta);\n videoTimeOffset += Math.max(0, -audiovideoTimestampDelta);\n }\n\n // Purposefully remuxing audio before video, so that remuxVideo can use nextAudioPts, which is calculated in remuxAudio.\n if (enoughAudioSamples) {\n // if initSegment was generated without audio samples, regenerate it again\n if (!audioTrack.samplerate) {\n logger.warn(\n '[mp4-remuxer]: regenerate InitSegment as audio detected',\n );\n initSegment = this.generateIS(\n audioTrack,\n videoTrack,\n timeOffset,\n accurateTimeOffset,\n );\n }\n audio = this.remuxAudio(\n audioTrack,\n audioTimeOffset,\n this.isAudioContiguous,\n accurateTimeOffset,\n hasVideo ||\n enoughVideoSamples ||\n playlistType === PlaylistLevelType.AUDIO\n ? videoTimeOffset\n : undefined,\n );\n if (enoughVideoSamples) {\n const audioTrackLength = audio ? audio.endPTS - audio.startPTS : 0;\n // if initSegment was generated without video samples, regenerate it again\n if (!videoTrack.inputTimeScale) {\n logger.warn(\n '[mp4-remuxer]: regenerate InitSegment as video detected',\n );\n initSegment = this.generateIS(\n audioTrack,\n videoTrack,\n timeOffset,\n accurateTimeOffset,\n );\n }\n video = this.remuxVideo(\n videoTrack,\n videoTimeOffset,\n isVideoContiguous,\n audioTrackLength,\n );\n }\n } else if (enoughVideoSamples) {\n video = this.remuxVideo(\n videoTrack,\n videoTimeOffset,\n isVideoContiguous,\n 0,\n );\n }\n if (video) {\n video.firstKeyFrame = firstKeyFrameIndex;\n video.independent = firstKeyFrameIndex !== -1;\n video.firstKeyFramePTS = firstKeyFramePTS;\n }\n }\n }\n\n // Allow ID3 and text to remux, even if more audio/video samples are required\n if (this.ISGenerated && this._initPTS && this._initDTS) {\n if (id3Track.samples.length) {\n id3 = flushTextTrackMetadataCueSamples(\n id3Track,\n timeOffset,\n this._initPTS,\n this._initDTS,\n );\n }\n\n if (textTrack.samples.length) {\n text = flushTextTrackUserdataCueSamples(\n textTrack,\n timeOffset,\n this._initPTS,\n );\n }\n }\n\n return {\n audio,\n video,\n initSegment,\n independent,\n text,\n id3,\n };\n }\n\n generateIS(\n audioTrack: DemuxedAudioTrack,\n videoTrack: DemuxedVideoTrack,\n timeOffset: number,\n accurateTimeOffset: boolean,\n ): InitSegmentData | undefined {\n const audioSamples = audioTrack.samples;\n const videoSamples = videoTrack.samples;\n const typeSupported = this.typeSupported;\n const tracks: TrackSet = {};\n const _initPTS = this._initPTS;\n let computePTSDTS = !_initPTS || accurateTimeOffset;\n let container = 'audio/mp4';\n let initPTS: number | undefined;\n let initDTS: number | undefined;\n let timescale: number | undefined;\n\n if (computePTSDTS) {\n initPTS = initDTS = Infinity;\n }\n\n if (audioTrack.config && audioSamples.length) {\n // let's use audio sampling rate as MP4 time scale.\n // rationale is that there is a integer nb of audio frames per audio sample (1024 for AAC)\n // using audio sampling rate here helps having an integer MP4 frame duration\n // this avoids potential rounding issue and AV sync issue\n audioTrack.timescale = audioTrack.samplerate;\n switch (audioTrack.segmentCodec) {\n case 'mp3':\n if (typeSupported.mpeg) {\n // Chrome and Safari\n container = 'audio/mpeg';\n audioTrack.codec = '';\n } else if (typeSupported.mp3) {\n // Firefox\n audioTrack.codec = 'mp3';\n }\n break;\n\n case 'ac3':\n audioTrack.codec = 'ac-3';\n break;\n }\n tracks.audio = {\n id: 'audio',\n container: container,\n codec: audioTrack.codec,\n initSegment:\n audioTrack.segmentCodec === 'mp3' && typeSupported.mpeg\n ? new Uint8Array(0)\n : MP4.initSegment([audioTrack]),\n metadata: {\n channelCount: audioTrack.channelCount,\n },\n };\n if (computePTSDTS) {\n timescale = audioTrack.inputTimeScale;\n if (!_initPTS || timescale !== _initPTS.timescale) {\n // remember first PTS of this demuxing context. for audio, PTS = DTS\n initPTS = initDTS =\n audioSamples[0].pts - Math.round(timescale * timeOffset);\n } else {\n computePTSDTS = false;\n }\n }\n }\n\n if (videoTrack.sps && videoTrack.pps && videoSamples.length) {\n // let's use input time scale as MP4 video timescale\n // we use input time scale straight away to avoid rounding issues on frame duration / cts computation\n videoTrack.timescale = videoTrack.inputTimeScale;\n tracks.video = {\n id: 'main',\n container: 'video/mp4',\n codec: videoTrack.codec,\n initSegment: MP4.initSegment([videoTrack]),\n metadata: {\n width: videoTrack.width,\n height: videoTrack.height,\n },\n };\n if (computePTSDTS) {\n timescale = videoTrack.inputTimeScale;\n if (!_initPTS || timescale !== _initPTS.timescale) {\n const startPTS = this.getVideoStartPts(videoSamples);\n const startOffset = Math.round(timescale * timeOffset);\n initDTS = Math.min(\n initDTS as number,\n normalizePts(videoSamples[0].dts, startPTS) - startOffset,\n );\n initPTS = Math.min(initPTS as number, startPTS - startOffset);\n } else {\n computePTSDTS = false;\n }\n }\n this.videoTrackConfig = {\n width: videoTrack.width,\n height: videoTrack.height,\n pixelRatio: videoTrack.pixelRatio,\n };\n }\n\n if (Object.keys(tracks).length) {\n this.ISGenerated = true;\n if (computePTSDTS) {\n this._initPTS = {\n baseTime: initPTS as number,\n timescale: timescale as number,\n };\n this._initDTS = {\n baseTime: initDTS as number,\n timescale: timescale as number,\n };\n } else {\n initPTS = timescale = undefined;\n }\n\n return {\n tracks,\n initPTS,\n timescale,\n };\n }\n }\n\n remuxVideo(\n track: DemuxedVideoTrack,\n timeOffset: number,\n contiguous: boolean,\n audioTrackLength: number,\n ): RemuxedTrack | undefined {\n const timeScale: number = track.inputTimeScale;\n const inputSamples: Array<VideoSample> = track.samples;\n const outputSamples: Array<Mp4Sample> = [];\n const nbSamples = inputSamples.length;\n const initPTS = this._initPTS as RationalTimestamp;\n let nextAvcDts = this.nextAvcDts;\n let offset = 8;\n let mp4SampleDuration = this.videoSampleDuration;\n let firstDTS;\n let lastDTS;\n let minPTS: number = Number.POSITIVE_INFINITY;\n let maxPTS: number = Number.NEGATIVE_INFINITY;\n let sortSamples = false;\n\n // if parsed fragment is contiguous with last one, let's use last DTS value as reference\n if (!contiguous || nextAvcDts === null) {\n const pts = timeOffset * timeScale;\n const cts =\n inputSamples[0].pts -\n normalizePts(inputSamples[0].dts, inputSamples[0].pts);\n if (\n chromeVersion &&\n nextAvcDts !== null &&\n Math.abs(pts - cts - nextAvcDts) < 15000\n ) {\n // treat as contigous to adjust samples that would otherwise produce video buffer gaps in Chrome\n contiguous = true;\n } else {\n // if not contiguous, let's use target timeOffset\n nextAvcDts = pts - cts;\n }\n }\n\n // PTS is coded on 33bits, and can loop from -2^32 to 2^32\n // PTSNormalize will make PTS/DTS value monotonic, we use last known DTS value as reference value\n const initTime = (initPTS.baseTime * timeScale) / initPTS.timescale;\n for (let i = 0; i < nbSamples; i++) {\n const sample = inputSamples[i];\n sample.pts = normalizePts(sample.pts - initTime, nextAvcDts);\n sample.dts = normalizePts(sample.dts - initTime, nextAvcDts);\n if (sample.dts < inputSamples[i > 0 ? i - 1 : i].dts) {\n sortSamples = true;\n }\n }\n\n // sort video samples by DTS then PTS then demux id order\n if (sortSamples) {\n inputSamples.sort(function (a, b) {\n const deltadts = a.dts - b.dts;\n const deltapts = a.pts - b.pts;\n return deltadts || deltapts;\n });\n }\n\n // Get first/last DTS\n firstDTS = inputSamples[0].dts;\n lastDTS = inputSamples[inputSamples.length - 1].dts;\n\n // Sample duration (as expected by trun MP4 boxes), should be the delta between sample DTS\n // set this constant duration as being the avg delta between consecutive DTS.\n const inputDuration = lastDTS - firstDTS;\n const averageSampleDuration = inputDuration\n ? Math.round(inputDuration / (nbSamples - 1))\n : mp4SampleDuration || track.inputTimeScale / 30;\n\n // if fragment are contiguous, detect hole/overlapping between fragments\n if (contiguous) {\n // check timestamp continuity across consecutive fragments (this is to remove inter-fragment gap/hole)\n const delta = firstDTS - nextAvcDts;\n const foundHole = delta > averageSampleDuration;\n const foundOverlap = delta < -1;\n if (foundHole || foundOverlap) {\n if (foundHole) {\n logger.warn(\n `AVC: ${toMsFromMpegTsClock(\n delta,\n true,\n )} ms (${delta}dts) hole between fragments detected at ${timeOffset.toFixed(\n 3,\n )}`,\n );\n } else {\n logger.warn(\n `AVC: ${toMsFromMpegTsClock(\n -delta,\n true,\n )} ms (${delta}dts) overlapping between fragments detected at ${timeOffset.toFixed(\n 3,\n )}`,\n );\n }\n if (\n !foundOverlap ||\n nextAvcDts >= inputSamples[0].pts ||\n chromeVersion\n ) {\n firstDTS = nextAvcDts;\n const firstPTS = inputSamples[0].pts - delta;\n if (foundHole) {\n inputSamples[0].dts = firstDTS;\n inputSamples[0].pts = firstPTS;\n } else {\n for (let i = 0; i < inputSamples.length; i++) {\n if (inputSamples[i].dts > firstPTS) {\n break;\n }\n inputSamples[i].dts -= delta;\n inputSamples[i].pts -= delta;\n }\n }\n logger.log(\n `Video: Initial PTS/DTS adjusted: ${toMsFromMpegTsClock(\n firstPTS,\n true,\n )}/${toMsFromMpegTsClock(\n firstDTS,\n true,\n )}, delta: ${toMsFromMpegTsClock(delta, true)} ms`,\n );\n }\n }\n }\n\n firstDTS = Math.max(0, firstDTS);\n\n let nbNalu = 0;\n let naluLen = 0;\n let dtsStep = firstDTS;\n for (let i = 0; i < nbSamples; i++) {\n // compute total/avc sample length and nb of NAL units\n const sample = inputSamples[i];\n const units = sample.units;\n const nbUnits = units.length;\n let sampleLen = 0;\n for (let j = 0; j < nbUnits; j++) {\n sampleLen += units[j].data.length;\n }\n\n naluLen += sampleLen;\n nbNalu += nbUnits;\n sample.length = sampleLen;\n\n // ensure sample monotonic DTS\n if (sample.dts < dtsStep) {\n sample.dts = dtsStep;\n dtsStep += (averageSampleDuration / 4) | 0 || 1;\n } else {\n dtsStep = sample.dts;\n }\n\n minPTS = Math.min(sample.pts, minPTS);\n maxPTS = Math.max(sample.pts, maxPTS);\n }\n lastDTS = inputSamples[nbSamples - 1].dts;\n\n /* concatenate the video data and construct the mdat in place\n (need 8 more bytes to fill length and mpdat type) */\n const mdatSize = naluLen + 4 * nbNalu + 8;\n let mdat;\n try {\n mdat = new Uint8Array(mdatSize);\n } catch (err) {\n this.observer.emit(Events.ERROR, Events.ERROR, {\n type: ErrorTypes.MUX_ERROR,\n details: ErrorDetails.REMUX_ALLOC_ERROR,\n fatal: false,\n error: err,\n bytes: mdatSize,\n reason: `fail allocating video mdat ${mdatSize}`,\n });\n return;\n }\n const view = new DataView(mdat.buffer);\n view.setUint32(0, mdatSize);\n mdat.set(MP4.types.mdat, 4);\n\n let stretchedLastFrame = false;\n let minDtsDelta = Number.POSITIVE_INFINITY;\n let minPtsDelta = Number.POSITIVE_INFINITY;\n let maxDtsDelta = Number.NEGATIVE_INFINITY;\n let maxPtsDelta = Number.NEGATIVE_INFINITY;\n for (let i = 0; i < nbSamples; i++) {\n const VideoSample = inputSamples[i];\n const VideoSampleUnits = VideoSample.units;\n let mp4SampleLength = 0;\n // convert NALU bitstream to MP4 format (prepend NALU with size field)\n for (let j = 0, nbUnits = VideoSampleUnits.length; j < nbUnits; j++) {\n const unit = VideoSampleUnits[j];\n const unitData = unit.data;\n const unitDataLen = unit.data.byteLength;\n view.setUint32(offset, unitDataLen);\n offset += 4;\n mdat.set(unitData, offset);\n offset += unitDataLen;\n mp4SampleLength += 4 + unitDataLen;\n }\n\n // expected sample duration is the Decoding Timestamp diff of consecutive samples\n let ptsDelta;\n if (i < nbSamples - 1) {\n mp4SampleDuration = inputSamples[i + 1].dts - VideoSample.dts;\n ptsDelta = inputSamples[i + 1].pts - VideoSample.pts;\n } else {\n const config = this.config;\n const lastFrameDuration =\n i > 0\n ? VideoSample.dts - inputSamples[i - 1].dts\n : averageSampleDuration;\n ptsDelta =\n i > 0\n ? VideoSample.pts - inputSamples[i - 1].pts\n : averageSampleDuration;\n if (config.stretchShortVideoTrack && this.nextAudioPts !== null) {\n // In some cases, a segment's audio track duration may exceed the video track duration.\n // Since we've already remuxed audio, and we know how long the audio track is, we look to\n // see if the delta to the next segment is longer than maxBufferHole.\n // If so, playback would potentially get stuck, so we artificially inflate\n // the duration of the last frame to minimize any potential gap between segments.\n const gapTolerance = Math.floor(config.maxBufferHole * timeScale);\n const deltaToFrameEnd =\n (audioTrackLength\n ? minPTS + audioTrackLength * timeScale\n : this.nextAudioPts) - VideoSample.pts;\n if (deltaToFrameEnd > gapTolerance) {\n // We subtract lastFrameDuration from deltaToFrameEnd to try to prevent any video\n // frame overlap. maxBufferHole should be >> lastFrameDuration anyway.\n mp4SampleDuration = deltaToFrameEnd - lastFrameDuration;\n if (mp4SampleDuration < 0) {\n mp4SampleDuration = lastFrameDuration;\n } else {\n stretchedLastFrame = true;\n }\n logger.log(\n `[mp4-remuxer]: It is approximately ${\n deltaToFrameEnd / 90\n } ms to the next segment; using duration ${\n mp4SampleDuration / 90\n } ms for the last video frame.`,\n );\n } else {\n mp4SampleDuration = lastFrameDuration;\n }\n } else {\n mp4SampleDuration = lastFrameDuration;\n }\n }\n const compositionTimeOffset = Math.round(\n VideoSample.pts - VideoSample.dts,\n );\n minDtsDelta = Math.min(minDtsDelta, mp4SampleDuration);\n maxDtsDelta = Math.max(maxDtsDelta, mp4SampleDuration);\n minPtsDelta = Math.min(minPtsDelta, ptsDelta);\n maxPtsDelta = Math.max(maxPtsDelta, ptsDelta);\n\n outputSamples.push(\n new Mp4Sample(\n VideoSample.key,\n mp4SampleDuration,\n mp4SampleLength,\n compositionTimeOffset,\n ),\n );\n }\n\n if (outputSamples.length) {\n if (chromeVersion) {\n if (chromeVersion < 70) {\n // Chrome workaround, mark first sample as being a Random Access Point (keyframe) to avoid sourcebuffer append issue\n // https://code.google.com/p/chromium/issues/detail?id=229412\n const flags = outputSamples[0].flags;\n flags.dependsOn = 2;\n flags.isNonSync = 0;\n }\n } else if (safariWebkitVersion) {\n // Fix for \"CNN special report, with CC\" in test-streams (Safari browser only)\n // Ignore DTS when frame durations are irregular. Safari MSE does not handle this leading to gaps.\n if (\n maxPtsDelta - minPtsDelta < maxDtsDelta - minDtsDelta &&\n averageSampleDuration / maxDtsDelta < 0.025 &&\n outputSamples[0].cts === 0\n ) {\n logger.warn(\n 'Found irregular gaps in sample duration. Using PTS instead of DTS to determine MP4 sample duration.',\n );\n let dts = firstDTS;\n for (let i = 0, len = outputSamples.length; i < len; i++) {\n const nextDts = dts + outputSamples[i].duration;\n const pts = dts + outputSamples[i].cts;\n if (i < len - 1) {\n const nextPts = nextDts + outputSamples[i + 1].cts;\n outputSamples[i].duration = nextPts - pts;\n } else {\n outputSamples[i].duration = i\n ? outputSamples[i - 1].duration\n : averageSampleDuration;\n }\n outputSamples[i].cts = 0;\n dts = nextDts;\n }\n }\n }\n }\n // next AVC sample DTS should be equal to last sample DTS + last sample duration (in PES timescale)\n mp4SampleDuration =\n stretchedLastFrame || !mp4SampleDuration\n ? averageSampleDuration\n : mp4SampleDuration;\n this.nextAvcDts = nextAvcDts = lastDTS + mp4SampleDuration;\n this.videoSampleDuration = mp4SampleDuration;\n this.isVideoContiguous = true;\n const moof = MP4.moof(\n track.sequenceNumber++,\n firstDTS,\n Object.assign({}, track, {\n samples: outputSamples,\n }),\n );\n const type: SourceBufferName = 'video';\n const data = {\n data1: moof,\n data2: mdat,\n startPTS: minPTS / timeScale,\n endPTS: (maxPTS + mp4SampleDuration) / timeScale,\n startDTS: firstDTS / timeScale,\n endDTS: (nextAvcDts as number) / timeScale,\n type,\n hasAudio: false,\n hasVideo: true,\n nb: outputSamples.length,\n dropped: track.dropped,\n };\n track.samples = [];\n track.dropped = 0;\n return data;\n }\n\n getSamplesPerFrame(track: DemuxedAudioTrack) {\n switch (track.segmentCodec) {\n case 'mp3':\n return MPEG_AUDIO_SAMPLE_PER_FRAME;\n case 'ac3':\n return AC3_SAMPLES_PER_FRAME;\n default:\n return AAC_SAMPLES_PER_FRAME;\n }\n }\n\n remuxAudio(\n track: DemuxedAudioTrack,\n timeOffset: number,\n contiguous: boolean,\n accurateTimeOffset: boolean,\n videoTimeOffset?: number,\n ): RemuxedTrack | undefined {\n const inputTimeScale: number = track.inputTimeScale;\n const mp4timeScale: number = track.samplerate\n ? track.samplerate\n : inputTimeScale;\n const scaleFactor: number = inputTimeScale / mp4timeScale;\n const mp4SampleDuration: number = this.getSamplesPerFrame(track);\n const inputSampleDuration: number = mp4SampleDuration * scaleFactor;\n const initPTS = this._initPTS as RationalTimestamp;\n const rawMPEG: boolean =\n track.segmentCodec === 'mp3' && this.typeSupported.mpeg;\n const outputSamples: Array<Mp4Sample> = [];\n const alignedWithVideo = videoTimeOffset !== undefined;\n\n let inputSamples: Array<AudioSample> = track.samples;\n let offset: number = rawMPEG ? 0 : 8;\n let nextAudioPts: number = this.nextAudioPts || -1;\n\n // window.audioSamples ? window.audioSamples.push(inputSamples.map(s => s.pts)) : (window.audioSamples = [inputSamples.map(s => s.pts)]);\n\n // for audio samples, also consider consecutive fragments as being contiguous (even if a level switch occurs),\n // for sake of clarity:\n // consecutive fragments are frags with\n // - less than 100ms gaps between new time offset (if accurate) and next expected PTS OR\n // - less than 20 audio frames distance\n // contiguous fragments are consecutive fragments from same quality level (same level, new SN = old SN + 1)\n // this helps ensuring audio continuity\n // and this also avoids audio glitches/cut when switching quality, or reporting wrong duration on first audio frame\n const timeOffsetMpegTS = timeOffset * inputTimeScale;\n const initTime = (initPTS.baseTime * inputTimeScale) / initPTS.timescale;\n this.isAudioContiguous = contiguous =\n contiguous ||\n ((inputSamples.length &&\n nextAudioPts > 0 &&\n ((accurateTimeOffset &&\n Math.abs(timeOffsetMpegTS - nextAudioPts) < 9000) ||\n Math.abs(\n normalizePts(inputSamples[0].pts - initTime, timeOffsetMpegTS) -\n nextAudioPts,\n ) <\n 20 * inputSampleDuration)) as boolean);\n\n // compute normalized PTS\n inputSamples.forEach(function (sample) {\n sample.pts = normalizePts(sample.pts - initTime, timeOffsetMpegTS);\n });\n\n if (!contiguous || nextAudioPts < 0) {\n // filter out sample with negative PTS that are not playable anyway\n // if we don't remove these negative samples, they will shift all audio samples forward.\n // leading to audio overlap between current / next fragment\n inputSamples = inputSamples.filter((sample) => sample.pts >= 0);\n\n // in case all samples have negative PTS, and have been filtered out, return now\n if (!inputSamples.length) {\n return;\n }\n\n if (videoTimeOffset === 0) {\n // Set the start to 0 to match video so that start gaps larger than inputSampleDuration are filled with silence\n nextAudioPts = 0;\n } else if (accurateTimeOffset && !alignedWithVideo) {\n // When not seeking, not live, and LevelDetails.PTSKnown, use fragment start as predicted next audio PTS\n nextAudioPts = Math.max(0, timeOffsetMpegTS);\n } else {\n // if frags are not contiguous and if we cant trust time offset, let's use first sample PTS as next audio PTS\n nextAudioPts = inputSamples[0].pts;\n }\n }\n\n // If the audio track is missing samples, the frames seem to get \"left-shifted\" within the\n // resulting mp4 segment, causing sync issues and leaving gaps at the end of the audio segment.\n // In an effort to prevent this from happening, we inject frames here where there are gaps.\n // When possible, we inject a silent frame; when that's not possible, we duplicate the last\n // frame.\n\n if (track.segmentCodec === 'aac') {\n const maxAudioFramesDrift = this.config.maxAudioFramesDrift;\n for (let i = 0, nextPts = nextAudioPts; i < inputSamples.length; i++) {\n // First, let's see how far off this frame is from where we expect it to be\n const sample = inputSamples[i];\n const pts = sample.pts;\n const delta = pts - nextPts;\n const duration = Math.abs((1000 * delta) / inputTimeScale);\n\n // When remuxing with video, if we're overlapping by more than a duration, drop this sample to stay in sync\n if (\n delta <= -maxAudioFramesDrift * inputSampleDuration &&\n alignedWithVideo\n ) {\n if (i === 0) {\n logger.warn(\n `Audio frame @ ${(pts / inputTimeScale).toFixed(\n 3,\n )}s overlaps nextAudioPts by ${Math.round(\n (1000 * delta) / inputTimeScale,\n )} ms.`,\n );\n this.nextAudioPts = nextAudioPts = nextPts = pts;\n }\n } // eslint-disable-line brace-style\n\n // Insert missing frames if:\n // 1: We're more than maxAudioFramesDrift frame away\n // 2: Not more than MAX_SILENT_FRAME_DURATION away\n // 3: currentTime (aka nextPtsNorm) is not 0\n // 4: remuxing with video (videoTimeOffset !== undefined)\n else if (\n delta >= maxAudioFramesDrift * inputSampleDuration &&\n duration < MAX_SILENT_FRAME_DURATION &&\n alignedWithVideo\n ) {\n let missing = Math.round(delta / inputSampleDuration);\n // Adjust nextPts so that silent samples are aligned with media pts. This will prevent media samples from\n // later being shifted if nextPts is based on timeOffset and delta is not a multiple of inputSampleDuration.\n nextPts = pts - missing * inputSampleDuration;\n if (nextPts < 0) {\n missing--;\n nextPts += inputSampleDuration;\n }\n if (i === 0) {\n this.nextAudioPts = nextAudioPts = nextPts;\n }\n logger.warn(\n `[mp4-remuxer]: Injecting ${missing} audio frame @ ${(\n nextPts / inputTimeScale\n ).toFixed(3)}s due to ${Math.round(\n (1000 * delta) / inputTimeScale,\n )} ms gap.`,\n );\n for (let j = 0; j < missing; j++) {\n const newStamp = Math.max(nextPts as number, 0);\n let fillFrame = AAC.getSilentFrame(\n track.manifestCodec || track.codec,\n track.channelCount,\n );\n if (!fillFrame) {\n logger.log(\n '[mp4-remuxer]: Unable to get silent frame for given audio codec; duplicating last frame instead.',\n );\n fillFrame = sample.unit.subarray();\n }\n inputSamples.splice(i, 0, {\n unit: fillFrame,\n pts: newStamp,\n });\n nextPts += inputSampleDuration;\n i++;\n }\n }\n sample.pts = nextPts;\n nextPts += inputSampleDuration;\n }\n }\n let firstPTS: number | null = null;\n let lastPTS: number | null = null;\n let mdat: any;\n let mdatSize: number = 0;\n let sampleLength: number = inputSamples.length;\n while (sampleLength--) {\n mdatSize += inputSamples[sampleLength].unit.byteLength;\n }\n for (let j = 0, nbSamples = inputSamples.length; j < nbSamples; j++) {\n const audioSample = inputSamples[j];\n const unit = audioSample.unit;\n let pts = audioSample.pts;\n if (lastPTS !== null) {\n // If we have more than one sample, set the duration of the sample to the \"real\" duration; the PTS diff with\n // the previous sample\n const prevSample = outputSamples[j - 1];\n prevSample.duration = Math.round((pts - lastPTS) / scaleFactor);\n } else {\n if (contiguous && track.segmentCodec === 'aac') {\n // set PTS/DTS to expected PTS/DTS\n pts = nextAudioPts;\n }\n // remember first PTS of our audioSamples\n firstPTS = pts;\n if (mdatSize > 0) {\n /* concatenate the audio data and construct the mdat in place\n (need 8 more bytes to fill length and mdat type) */\n mdatSize += offset;\n try {\n mdat = new Uint8Array(mdatSize);\n } catch (err) {\n this.observer.emit(Events.ERROR, Events.ERROR, {\n type: ErrorTypes.MUX_ERROR,\n details: ErrorDetails.REMUX_ALLOC_ERROR,\n fatal: false,\n error: err,\n bytes: mdatSize,\n reason: `fail allocating audio mdat ${mdatSize}`,\n });\n return;\n }\n if (!rawMPEG) {\n const view = new DataView(mdat.buffer);\n view.setUint32(0, mdatSize);\n mdat.set(MP4.types.mdat, 4);\n }\n } else {\n // no audio samples\n return;\n }\n }\n mdat.set(unit, offset);\n const unitLen = unit.byteLength;\n offset += unitLen;\n // Default the sample's duration to the computed mp4SampleDuration, which will either be 1024 for AAC or 1152 for MPEG\n // In the case that we have 1 sample, this will be the duration. If we have more than one sample, the duration\n // becomes the PTS diff with the previous sample\n outputSamples.push(new Mp4Sample(true, mp4SampleDuration, unitLen, 0));\n lastPTS = pts;\n }\n\n // We could end up with no audio samples if all input samples were overlapping with the previously remuxed ones\n const nbSamples = outputSamples.length;\n if (!nbSamples) {\n return;\n }\n\n // The next audio sample PTS should be equal to last sample PTS + duration\n const lastSample = outputSamples[outputSamples.length - 1];\n this.nextAudioPts = nextAudioPts =\n lastPTS! + scaleFactor * lastSample.duration;\n\n // Set the track samples from inputSamples to outputSamples before remuxing\n const moof = rawMPEG\n ? new Uint8Array(0)\n : MP4.moof(\n track.sequenceNumber++,\n firstPTS! / scaleFactor,\n Object.assign({}, track, { samples: outputSamples }),\n );\n\n // Clear the track samples. This also clears the samples array in the demuxer, since the reference is shared\n track.samples = [];\n const start = firstPTS! / inputTimeScale;\n const end = nextAudioPts / inputTimeScale;\n const type: SourceBufferName = 'audio';\n const audioData = {\n data1: moof,\n data2: mdat,\n startPTS: start,\n endPTS: end,\n startDTS: start,\n endDTS: end,\n type,\n hasAudio: true,\n hasVideo: false,\n nb: nbSamples,\n };\n\n this.isAudioContiguous = true;\n return audioData;\n }\n\n remuxEmptyAudio(\n track: DemuxedAudioTrack,\n timeOffset: number,\n contiguous: boolean,\n videoData: Fragment,\n ): RemuxedTrack | undefined {\n const inputTimeScale: number = track.inputTimeScale;\n const mp4timeScale: number = track.samplerate\n ? track.samplerate\n : inputTimeScale;\n const scaleFactor: number = inputTimeScale / mp4timeScale;\n const nextAudioPts: number | null = this.nextAudioPts;\n // sync with video's timestamp\n const initDTS = this._initDTS as RationalTimestamp;\n const init90kHz = (initDTS.baseTime * 90000) / initDTS.timescale;\n const startDTS: number =\n (nextAudioPts !== null\n ? nextAudioPts\n : videoData.startDTS * inputTimeScale) + init90kHz;\n const endDTS: number = videoData.endDTS * inputTimeScale + init90kHz;\n // one sample's duration value\n const frameDuration: number = scaleFactor * AAC_SAMPLES_PER_FRAME;\n // samples count of this segment's duration\n const nbSamples: number = Math.ceil((endDTS - startDTS) / frameDuration);\n // silent frame\n const silentFrame: Uint8Array | undefined = AAC.getSilentFrame(\n track.manifestCodec || track.codec,\n track.channelCount,\n );\n\n logger.warn('[mp4-remuxer]: remux empty Audio');\n // Can't remux if we can't generate a silent frame...\n if (!silentFrame) {\n logger.trace(\n '[mp4-remuxer]: Unable to remuxEmptyAudio since we were unable to get a silent frame for given audio codec',\n );\n return;\n }\n\n const samples: Array<any> = [];\n for (let i = 0; i < nbSamples; i++) {\n const stamp = startDTS + i * frameDuration;\n samples.push({ unit: silentFrame, pts: stamp, dts: stamp });\n }\n track.samples = samples;\n\n return this.remuxAudio(track, timeOffset, contiguous, false);\n }\n}\n\nexport function normalizePts(value: number, reference: number | null): number {\n let offset;\n if (reference === null) {\n return value;\n }\n\n if (reference < value) {\n // - 2^33\n offset = -8589934592;\n } else {\n // + 2^33\n offset = 8589934592;\n }\n /* PTS is 33bit (from 0 to 2^33 -1)\n if diff between value and reference is bigger than half of the amplitude (2^32) then it means that\n PTS looping occured. fill the gap */\n while (Math.abs(value - reference) > 4294967296) {\n value += offset;\n }\n\n return value;\n}\n\nfunction findKeyframeIndex(samples: Array<VideoSample>): number {\n for (let i = 0; i < samples.length; i++) {\n if (samples[i].key) {\n return i;\n }\n }\n return -1;\n}\n\nexport function flushTextTrackMetadataCueSamples(\n track: DemuxedMetadataTrack,\n timeOffset: number,\n initPTS: RationalTimestamp,\n initDTS: RationalTimestamp,\n): RemuxedMetadata | undefined {\n const length = track.samples.length;\n if (!length) {\n return;\n }\n const inputTimeScale = track.inputTimeScale;\n for (let index = 0; index < length; index++) {\n const sample = track.samples[index];\n // setting id3 pts, dts to relative time\n // using this._initPTS and this._initDTS to calculate relative time\n sample.pts =\n normalizePts(\n sample.pts - (initPTS.baseTime * inputTimeScale) / initPTS.timescale,\n timeOffset * inputTimeScale,\n ) / inputTimeScale;\n sample.dts =\n normalizePts(\n sample.dts - (initDTS.baseTime * inputTimeScale) / initDTS.timescale,\n timeOffset * inputTimeScale,\n ) / inputTimeScale;\n }\n const samples = track.samples;\n track.samples = [];\n return {\n samples,\n };\n}\n\nexport function flushTextTrackUserdataCueSamples(\n track: DemuxedUserdataTrack,\n timeOffset: number,\n initPTS: RationalTimestamp,\n): RemuxedUserdata | undefined {\n const length = track.samples.length;\n if (!length) {\n return;\n }\n\n const inputTimeScale = track.inputTimeScale;\n for (let index = 0; index < length; index++) {\n const sample = track.samples[index];\n // setting text pts, dts to relative time\n // using this._initPTS and this._initDTS to calculate relative time\n sample.pts =\n normalizePts(\n sample.pts - (initPTS.baseTime * inputTimeScale) / initPTS.timescale,\n timeOffset * inputTimeScale,\n ) / inputTimeScale;\n }\n track.samples.sort((a, b) => a.pts - b.pts);\n const samples = track.samples;\n track.samples = [];\n return {\n samples,\n };\n}\n\ntype Mp4SampleFlags = {\n isLeading: 0;\n isDependedOn: 0;\n hasRedundancy: 0;\n degradPrio: 0;\n dependsOn: 1 | 2;\n isNonSync: 0 | 1;\n};\n\nclass Mp4Sample {\n public size: number;\n public duration: number;\n public cts: number;\n public flags: Mp4SampleFlags;\n\n constructor(\n isKeyframe: boolean,\n duration: number,\n size: number,\n cts: number,\n ) {\n this.duration = duration;\n this.size = size;\n this.cts = cts;\n this.flags = {\n isLeading: 0,\n isDependedOn: 0,\n hasRedundancy: 0,\n degradPrio: 0,\n dependsOn: isKeyframe ? 2 : 1,\n isNonSync: isKeyframe ? 0 : 1,\n };\n }\n}\n","import type { HlsEventEmitter } from '../events';\nimport { Events } from '../events';\nimport { ErrorTypes, ErrorDetails } from '../errors';\nimport Decrypter from '../crypt/decrypter';\nimport AACDemuxer from './audio/aacdemuxer';\nimport MP4Demuxer from '../demux/mp4demuxer';\nimport TSDemuxer, { TypeSupported } from '../demux/tsdemuxer';\nimport MP3Demuxer from './audio/mp3demuxer';\nimport { AC3Demuxer } from './audio/ac3-demuxer';\nimport MP4Remuxer from '../remux/mp4-remuxer';\nimport PassThroughRemuxer from '../remux/passthrough-remuxer';\nimport { logger } from '../utils/logger';\nimport type { Demuxer, DemuxerResult, KeyData } from '../types/demuxer';\nimport type { Remuxer } from '../types/remuxer';\nimport type { TransmuxerResult, ChunkMetadata } from '../types/transmuxer';\nimport type { HlsConfig } from '../config';\nimport type { DecryptData } from '../loader/level-key';\nimport type { PlaylistLevelType } from '../types/loader';\nimport type { RationalTimestamp } from '../utils/timescale-conversion';\nimport { optionalSelf } from '../utils/global';\n\nlet now;\n// performance.now() not available on WebWorker, at least on Safari Desktop\ntry {\n now = self.performance.now.bind(self.performance);\n} catch (err) {\n logger.debug('Unable to use Performance API on this environment');\n now = optionalSelf?.Date.now;\n}\n\ntype MuxConfig =\n | { demux: typeof MP4Demuxer; remux: typeof PassThroughRemuxer }\n | { demux: typeof TSDemuxer; remux: typeof MP4Remuxer }\n | { demux: typeof AC3Demuxer; remux: typeof MP4Remuxer }\n | { demux: typeof AACDemuxer; remux: typeof MP4Remuxer }\n | { demux: typeof MP3Demuxer; remux: typeof MP4Remuxer };\n\nconst muxConfig: MuxConfig[] = [\n { demux: MP4Demuxer, remux: PassThroughRemuxer },\n { demux: TSDemuxer, remux: MP4Remuxer },\n { demux: AACDemuxer, remux: MP4Remuxer },\n { demux: MP3Demuxer, remux: MP4Remuxer },\n];\n\nif (__USE_M2TS_ADVANCED_CODECS__) {\n muxConfig.splice(2, 0, { demux: AC3Demuxer, remux: MP4Remuxer });\n}\n\nexport default class Transmuxer {\n public async: boolean = false;\n private observer: HlsEventEmitter;\n private typeSupported: TypeSupported;\n private config: HlsConfig;\n private vendor: string;\n private id: PlaylistLevelType;\n private demuxer?: Demuxer;\n private remuxer?: Remuxer;\n private decrypter?: Decrypter;\n private probe!: Function;\n private decryptionPromise: Promise<TransmuxerResult> | null = null;\n private transmuxConfig!: TransmuxConfig;\n private currentTransmuxState!: TransmuxState;\n\n constructor(\n observer: HlsEventEmitter,\n typeSupported: TypeSupported,\n config: HlsConfig,\n vendor: string,\n id: PlaylistLevelType,\n ) {\n this.observer = observer;\n this.typeSupported = typeSupported;\n this.config = config;\n this.vendor = vendor;\n this.id = id;\n }\n\n configure(transmuxConfig: TransmuxConfig) {\n this.transmuxConfig = transmuxConfig;\n if (this.decrypter) {\n this.decrypter.reset();\n }\n }\n\n push(\n data: ArrayBuffer,\n decryptdata: DecryptData | null,\n chunkMeta: ChunkMetadata,\n state?: TransmuxState,\n ): TransmuxerResult | Promise<TransmuxerResult> {\n const stats = chunkMeta.transmuxing;\n stats.executeStart = now();\n\n let uintData: Uint8Array = new Uint8Array(data);\n const { currentTransmuxState, transmuxConfig } = this;\n if (state) {\n this.currentTransmuxState = state;\n }\n\n const {\n contiguous,\n discontinuity,\n trackSwitch,\n accurateTimeOffset,\n timeOffset,\n initSegmentChange,\n } = state || currentTransmuxState;\n const {\n audioCodec,\n videoCodec,\n defaultInitPts,\n duration,\n initSegmentData,\n } = transmuxConfig;\n\n const keyData = getEncryptionType(uintData, decryptdata);\n if (keyData && keyData.method === 'AES-128') {\n const decrypter = this.getDecrypter();\n // Software decryption is synchronous; webCrypto is not\n if (decrypter.isSync()) {\n // Software decryption is progressive. Progressive decryption may not return a result on each call. Any cached\n // data is handled in the flush() call\n let decryptedData = decrypter.softwareDecrypt(\n uintData,\n keyData.key.buffer,\n keyData.iv.buffer,\n );\n // For Low-Latency HLS Parts, decrypt in place, since part parsing is expected on push progress\n const loadingParts = chunkMeta.part > -1;\n if (loadingParts) {\n decryptedData = decrypter.flush();\n }\n if (!decryptedData) {\n stats.executeEnd = now();\n return emptyResult(chunkMeta);\n }\n uintData = new Uint8Array(decryptedData);\n } else {\n this.decryptionPromise = decrypter\n .webCryptoDecrypt(uintData, keyData.key.buffer, keyData.iv.buffer)\n .then((decryptedData): TransmuxerResult => {\n // Calling push here is important; if flush() is called while this is still resolving, this ensures that\n // the decrypted data has been transmuxed\n const result = this.push(\n decryptedData,\n null,\n chunkMeta,\n ) as TransmuxerResult;\n this.decryptionPromise = null;\n return result;\n });\n return this.decryptionPromise!;\n }\n }\n\n const resetMuxers = this.needsProbing(discontinuity, trackSwitch);\n if (resetMuxers) {\n const error = this.configureTransmuxer(uintData);\n if (error) {\n logger.warn(`[transmuxer] ${error.message}`);\n this.observer.emit(Events.ERROR, Events.ERROR, {\n type: ErrorTypes.MEDIA_ERROR,\n details: ErrorDetails.FRAG_PARSING_ERROR,\n fatal: false,\n error,\n reason: error.message,\n });\n stats.executeEnd = now();\n return emptyResult(chunkMeta);\n }\n }\n\n if (discontinuity || trackSwitch || initSegmentChange || resetMuxers) {\n this.resetInitSegment(\n initSegmentData,\n audioCodec,\n videoCodec,\n duration,\n decryptdata,\n );\n }\n\n if (discontinuity || initSegmentChange || resetMuxers) {\n this.resetInitialTimestamp(defaultInitPts);\n }\n\n if (!contiguous) {\n this.resetContiguity();\n }\n\n const result = this.transmux(\n uintData,\n keyData,\n timeOffset,\n accurateTimeOffset,\n chunkMeta,\n );\n const currentState = this.currentTransmuxState;\n\n currentState.contiguous = true;\n currentState.discontinuity = false;\n currentState.trackSwitch = false;\n\n stats.executeEnd = now();\n return result;\n }\n\n // Due to data caching, flush calls can produce more than one TransmuxerResult (hence the Array type)\n flush(\n chunkMeta: ChunkMetadata,\n ): TransmuxerResult[] | Promise<TransmuxerResult[]> {\n const stats = chunkMeta.transmuxing;\n stats.executeStart = now();\n\n const { decrypter, currentTransmuxState, decryptionPromise } = this;\n\n if (decryptionPromise) {\n // Upon resolution, the decryption promise calls push() and returns its TransmuxerResult up the stack. Therefore\n // only flushing is required for async decryption\n return decryptionPromise.then(() => {\n return this.flush(chunkMeta);\n });\n }\n\n const transmuxResults: TransmuxerResult[] = [];\n const { timeOffset } = currentTransmuxState;\n if (decrypter) {\n // The decrypter may have data cached, which needs to be demuxed. In this case we'll have two TransmuxResults\n // This happens in the case that we receive only 1 push call for a segment (either for non-progressive downloads,\n // or for progressive downloads with small segments)\n const decryptedData = decrypter.flush();\n if (decryptedData) {\n // Push always returns a TransmuxerResult if decryptdata is null\n transmuxResults.push(\n this.push(decryptedData, null, chunkMeta) as TransmuxerResult,\n );\n }\n }\n\n const { demuxer, remuxer } = this;\n if (!demuxer || !remuxer) {\n // If probing failed, then Hls.js has been given content its not able to handle\n stats.executeEnd = now();\n return [emptyResult(chunkMeta)];\n }\n\n const demuxResultOrPromise = demuxer.flush(timeOffset);\n if (isPromise(demuxResultOrPromise)) {\n // Decrypt final SAMPLE-AES samples\n return demuxResultOrPromise.then((demuxResult) => {\n this.flushRemux(transmuxResults, demuxResult, chunkMeta);\n return transmuxResults;\n });\n }\n\n this.flushRemux(transmuxResults, demuxResultOrPromise, chunkMeta);\n return transmuxResults;\n }\n\n private flushRemux(\n transmuxResults: TransmuxerResult[],\n demuxResult: DemuxerResult,\n chunkMeta: ChunkMetadata,\n ) {\n const { audioTrack, videoTrack, id3Track, textTrack } = demuxResult;\n const { accurateTimeOffset, timeOffset } = this.currentTransmuxState;\n logger.log(\n `[transmuxer.ts]: Flushed fragment ${chunkMeta.sn}${\n chunkMeta.part > -1 ? ' p: ' + chunkMeta.part : ''\n } of level ${chunkMeta.level}`,\n );\n const remuxResult = this.remuxer!.remux(\n audioTrack,\n videoTrack,\n id3Track,\n textTrack,\n timeOffset,\n accurateTimeOffset,\n true,\n this.id,\n );\n transmuxResults.push({\n remuxResult,\n chunkMeta,\n });\n\n chunkMeta.transmuxing.executeEnd = now();\n }\n\n resetInitialTimestamp(defaultInitPts: RationalTimestamp | null) {\n const { demuxer, remuxer } = this;\n if (!demuxer || !remuxer) {\n return;\n }\n demuxer.resetTimeStamp(defaultInitPts);\n remuxer.resetTimeStamp(defaultInitPts);\n }\n\n resetContiguity() {\n const { demuxer, remuxer } = this;\n if (!demuxer || !remuxer) {\n return;\n }\n demuxer.resetContiguity();\n remuxer.resetNextTimestamp();\n }\n\n resetInitSegment(\n initSegmentData: Uint8Array | undefined,\n audioCodec: string | undefined,\n videoCodec: string | undefined,\n trackDuration: number,\n decryptdata: DecryptData | null,\n ) {\n const { demuxer, remuxer } = this;\n if (!demuxer || !remuxer) {\n return;\n }\n demuxer.resetInitSegment(\n initSegmentData,\n audioCodec,\n videoCodec,\n trackDuration,\n );\n remuxer.resetInitSegment(\n initSegmentData,\n audioCodec,\n videoCodec,\n decryptdata,\n );\n }\n\n destroy(): void {\n if (this.demuxer) {\n this.demuxer.destroy();\n this.demuxer = undefined;\n }\n if (this.remuxer) {\n this.remuxer.destroy();\n this.remuxer = undefined;\n }\n }\n\n private transmux(\n data: Uint8Array,\n keyData: KeyData | null,\n timeOffset: number,\n accurateTimeOffset: boolean,\n chunkMeta: ChunkMetadata,\n ): TransmuxerResult | Promise<TransmuxerResult> {\n let result: TransmuxerResult | Promise<TransmuxerResult>;\n if (keyData && keyData.method === 'SAMPLE-AES') {\n result = this.transmuxSampleAes(\n data,\n keyData,\n timeOffset,\n accurateTimeOffset,\n chunkMeta,\n );\n } else {\n result = this.transmuxUnencrypted(\n data,\n timeOffset,\n accurateTimeOffset,\n chunkMeta,\n );\n }\n return result;\n }\n\n private transmuxUnencrypted(\n data: Uint8Array,\n timeOffset: number,\n accurateTimeOffset: boolean,\n chunkMeta: ChunkMetadata,\n ): TransmuxerResult {\n const { audioTrack, videoTrack, id3Track, textTrack } = (\n this.demuxer as Demuxer\n ).demux(data, timeOffset, false, !this.config.progressive);\n const remuxResult = this.remuxer!.remux(\n audioTrack,\n videoTrack,\n id3Track,\n textTrack,\n timeOffset,\n accurateTimeOffset,\n false,\n this.id,\n );\n return {\n remuxResult,\n chunkMeta,\n };\n }\n\n private transmuxSampleAes(\n data: Uint8Array,\n decryptData: KeyData,\n timeOffset: number,\n accurateTimeOffset: boolean,\n chunkMeta: ChunkMetadata,\n ): Promise<TransmuxerResult> {\n return (this.demuxer as Demuxer)\n .demuxSampleAes(data, decryptData, timeOffset)\n .then((demuxResult) => {\n const remuxResult = this.remuxer!.remux(\n demuxResult.audioTrack,\n demuxResult.videoTrack,\n demuxResult.id3Track,\n demuxResult.textTrack,\n timeOffset,\n accurateTimeOffset,\n false,\n this.id,\n );\n return {\n remuxResult,\n chunkMeta,\n };\n });\n }\n\n private configureTransmuxer(data: Uint8Array): void | Error {\n const { config, observer, typeSupported, vendor } = this;\n // probe for content type\n let mux;\n for (let i = 0, len = muxConfig.length; i < len; i++) {\n if (muxConfig[i].demux?.probe(data)) {\n mux = muxConfig[i];\n break;\n }\n }\n if (!mux) {\n return new Error('Failed to find demuxer by probing fragment data');\n }\n // so let's check that current remuxer and demuxer are still valid\n const demuxer = this.demuxer;\n const remuxer = this.remuxer;\n const Remuxer: MuxConfig['remux'] = mux.remux;\n const Demuxer: MuxConfig['demux'] = mux.demux;\n if (!remuxer || !(remuxer instanceof Remuxer)) {\n this.remuxer = new Remuxer(observer, config, typeSupported, vendor);\n }\n if (!demuxer || !(demuxer instanceof Demuxer)) {\n this.demuxer = new Demuxer(observer, config, typeSupported);\n this.probe = Demuxer.probe;\n }\n }\n\n private needsProbing(discontinuity: boolean, trackSwitch: boolean): boolean {\n // in case of continuity change, or track switch\n // we might switch from content type (AAC container to TS container, or TS to fmp4 for example)\n return !this.demuxer || !this.remuxer || discontinuity || trackSwitch;\n }\n\n private getDecrypter(): Decrypter {\n let decrypter = this.decrypter;\n if (!decrypter) {\n decrypter = this.decrypter = new Decrypter(this.config);\n }\n return decrypter;\n }\n}\n\nfunction getEncryptionType(\n data: Uint8Array,\n decryptData: DecryptData | null,\n): KeyData | null {\n let encryptionType: KeyData | null = null;\n if (\n data.byteLength > 0 &&\n decryptData?.key != null &&\n decryptData.iv !== null &&\n decryptData.method != null\n ) {\n encryptionType = decryptData as KeyData;\n }\n return encryptionType;\n}\n\nconst emptyResult = (chunkMeta): TransmuxerResult => ({\n remuxResult: {},\n chunkMeta,\n});\n\nexport function isPromise<T>(p: Promise<T> | any): p is Promise<T> {\n return 'then' in p && p.then instanceof Function;\n}\n\nexport class TransmuxConfig {\n public audioCodec?: string;\n public videoCodec?: string;\n public initSegmentData?: Uint8Array;\n public duration: number;\n public defaultInitPts: RationalTimestamp | null;\n\n constructor(\n audioCodec: string | undefined,\n videoCodec: string | undefined,\n initSegmentData: Uint8Array | undefined,\n duration: number,\n defaultInitPts?: RationalTimestamp,\n ) {\n this.audioCodec = audioCodec;\n this.videoCodec = videoCodec;\n this.initSegmentData = initSegmentData;\n this.duration = duration;\n this.defaultInitPts = defaultInitPts || null;\n }\n}\n\nexport class TransmuxState {\n public discontinuity: boolean;\n public contiguous: boolean;\n public accurateTimeOffset: boolean;\n public trackSwitch: boolean;\n public timeOffset: number;\n public initSegmentChange: boolean;\n\n constructor(\n discontinuity: boolean,\n contiguous: boolean,\n accurateTimeOffset: boolean,\n trackSwitch: boolean,\n timeOffset: number,\n initSegmentChange: boolean,\n ) {\n this.discontinuity = discontinuity;\n this.contiguous = contiguous;\n this.accurateTimeOffset = accurateTimeOffset;\n this.trackSwitch = trackSwitch;\n this.timeOffset = timeOffset;\n this.initSegmentChange = initSegmentChange;\n }\n}\n","import {\n flushTextTrackMetadataCueSamples,\n flushTextTrackUserdataCueSamples,\n} from './mp4-remuxer';\nimport {\n InitData,\n InitDataTrack,\n patchEncyptionData,\n} from '../utils/mp4-tools';\nimport {\n getDuration,\n getStartDTS,\n offsetStartDTS,\n parseInitSegment,\n} from '../utils/mp4-tools';\nimport { ElementaryStreamTypes } from '../loader/fragment';\nimport { logger } from '../utils/logger';\nimport { getCodecCompatibleName } from '../utils/codecs';\nimport type { TrackSet } from '../types/track';\nimport type {\n InitSegmentData,\n RemuxedTrack,\n Remuxer,\n RemuxerResult,\n} from '../types/remuxer';\nimport type {\n DemuxedAudioTrack,\n DemuxedMetadataTrack,\n DemuxedUserdataTrack,\n PassthroughTrack,\n} from '../types/demuxer';\nimport type { DecryptData } from '../loader/level-key';\nimport type { RationalTimestamp } from '../utils/timescale-conversion';\n\nclass PassThroughRemuxer implements Remuxer {\n private emitInitSegment: boolean = false;\n private audioCodec?: string;\n private videoCodec?: string;\n private initData?: InitData;\n private initPTS: RationalTimestamp | null = null;\n private initTracks?: TrackSet;\n private lastEndTime: number | null = null;\n\n public destroy() {}\n\n public resetTimeStamp(defaultInitPTS: RationalTimestamp | null) {\n this.initPTS = defaultInitPTS;\n this.lastEndTime = null;\n }\n\n public resetNextTimestamp() {\n this.lastEndTime = null;\n }\n\n public resetInitSegment(\n initSegment: Uint8Array | undefined,\n audioCodec: string | undefined,\n videoCodec: string | undefined,\n decryptdata: DecryptData | null,\n ) {\n this.audioCodec = audioCodec;\n this.videoCodec = videoCodec;\n this.generateInitSegment(patchEncyptionData(initSegment, decryptdata));\n this.emitInitSegment = true;\n }\n\n private generateInitSegment(initSegment: Uint8Array | undefined): void {\n let { audioCodec, videoCodec } = this;\n if (!initSegment?.byteLength) {\n this.initTracks = undefined;\n this.initData = undefined;\n return;\n }\n const initData = (this.initData = parseInitSegment(initSegment));\n\n // Get codec from initSegment or fallback to default\n if (initData.audio) {\n audioCodec = getParsedTrackCodec(\n initData.audio,\n ElementaryStreamTypes.AUDIO,\n );\n }\n\n if (initData.video) {\n videoCodec = getParsedTrackCodec(\n initData.video,\n ElementaryStreamTypes.VIDEO,\n );\n }\n\n const tracks: TrackSet = {};\n if (initData.audio && initData.video) {\n tracks.audiovideo = {\n container: 'video/mp4',\n codec: audioCodec + ',' + videoCodec,\n initSegment,\n id: 'main',\n };\n } else if (initData.audio) {\n tracks.audio = {\n container: 'audio/mp4',\n codec: audioCodec,\n initSegment,\n id: 'audio',\n };\n } else if (initData.video) {\n tracks.video = {\n container: 'video/mp4',\n codec: videoCodec,\n initSegment,\n id: 'main',\n };\n } else {\n logger.warn(\n '[passthrough-remuxer.ts]: initSegment does not contain moov or trak boxes.',\n );\n }\n this.initTracks = tracks;\n }\n\n public remux(\n audioTrack: DemuxedAudioTrack,\n videoTrack: PassthroughTrack,\n id3Track: DemuxedMetadataTrack,\n textTrack: DemuxedUserdataTrack,\n timeOffset: number,\n accurateTimeOffset: boolean,\n ): RemuxerResult {\n let { initPTS, lastEndTime } = this;\n const result: RemuxerResult = {\n audio: undefined,\n video: undefined,\n text: textTrack,\n id3: id3Track,\n initSegment: undefined,\n };\n\n // If we haven't yet set a lastEndDTS, or it was reset, set it to the provided timeOffset. We want to use the\n // lastEndDTS over timeOffset whenever possible; during progressive playback, the media source will not update\n // the media duration (which is what timeOffset is provided as) before we need to process the next chunk.\n if (!Number.isFinite(lastEndTime!)) {\n lastEndTime = this.lastEndTime = timeOffset || 0;\n }\n\n // The binary segment data is added to the videoTrack in the mp4demuxer. We don't check to see if the data is only\n // audio or video (or both); adding it to video was an arbitrary choice.\n const data = videoTrack.samples;\n if (!data?.length) {\n return result;\n }\n\n const initSegment: InitSegmentData = {\n initPTS: undefined,\n timescale: 1,\n };\n let initData = this.initData;\n if (!initData?.length) {\n this.generateInitSegment(data);\n initData = this.initData;\n }\n if (!initData?.length) {\n // We can't remux if the initSegment could not be generated\n logger.warn('[passthrough-remuxer.ts]: Failed to generate initSegment.');\n return result;\n }\n if (this.emitInitSegment) {\n initSegment.tracks = this.initTracks as TrackSet;\n this.emitInitSegment = false;\n }\n\n const duration = getDuration(data, initData);\n const startDTS = getStartDTS(initData, data);\n const decodeTime = startDTS === null ? timeOffset : startDTS;\n if (\n isInvalidInitPts(initPTS, decodeTime, timeOffset, duration) ||\n (initSegment.timescale !== initPTS.timescale && accurateTimeOffset)\n ) {\n initSegment.initPTS = decodeTime - timeOffset;\n if (initPTS && initPTS.timescale === 1) {\n logger.warn(\n `Adjusting initPTS by ${initSegment.initPTS - initPTS.baseTime}`,\n );\n }\n this.initPTS = initPTS = {\n baseTime: initSegment.initPTS,\n timescale: 1,\n };\n }\n\n const startTime = audioTrack\n ? decodeTime - initPTS.baseTime / initPTS.timescale\n : (lastEndTime as number);\n const endTime = startTime + duration;\n offsetStartDTS(initData, data, initPTS.baseTime / initPTS.timescale);\n\n if (duration > 0) {\n this.lastEndTime = endTime;\n } else {\n logger.warn('Duration parsed from mp4 should be greater than zero');\n this.resetNextTimestamp();\n }\n\n const hasAudio = !!initData.audio;\n const hasVideo = !!initData.video;\n\n let type: any = '';\n if (hasAudio) {\n type += 'audio';\n }\n\n if (hasVideo) {\n type += 'video';\n }\n\n const track: RemuxedTrack = {\n data1: data,\n startPTS: startTime,\n startDTS: startTime,\n endPTS: endTime,\n endDTS: endTime,\n type,\n hasAudio,\n hasVideo,\n nb: 1,\n dropped: 0,\n };\n\n result.audio = track.type === 'audio' ? track : undefined;\n result.video = track.type !== 'audio' ? track : undefined;\n result.initSegment = initSegment;\n result.id3 = flushTextTrackMetadataCueSamples(\n id3Track,\n timeOffset,\n initPTS,\n initPTS,\n );\n\n if (textTrack.samples.length) {\n result.text = flushTextTrackUserdataCueSamples(\n textTrack,\n timeOffset,\n initPTS,\n );\n }\n\n return result;\n }\n}\n\nfunction isInvalidInitPts(\n initPTS: RationalTimestamp | null,\n startDTS: number,\n timeOffset: number,\n duration: number,\n): initPTS is null {\n if (initPTS === null) {\n return true;\n }\n // InitPTS is invalid when distance from program would be more than segment duration or a minimum of one second\n const minDuration = Math.max(duration, 1);\n const startTime = startDTS - initPTS.baseTime / initPTS.timescale;\n return Math.abs(startTime - timeOffset) > minDuration;\n}\n\nfunction getParsedTrackCodec(\n track: InitDataTrack,\n type: ElementaryStreamTypes.AUDIO | ElementaryStreamTypes.VIDEO,\n): string {\n const parsedCodec = track?.codec;\n if (parsedCodec && parsedCodec.length > 4) {\n return parsedCodec;\n }\n if (type === ElementaryStreamTypes.AUDIO) {\n if (\n parsedCodec === 'ec-3' ||\n parsedCodec === 'ac-3' ||\n parsedCodec === 'alac'\n ) {\n return parsedCodec;\n }\n if (parsedCodec === 'fLaC' || parsedCodec === 'Opus') {\n // Opting not to get `preferManagedMediaSource` from player config for isSupported() check for simplicity\n const preferManagedMediaSource = false;\n return getCodecCompatibleName(parsedCodec, preferManagedMediaSource);\n }\n const result = 'mp4a.40.5';\n logger.info(\n `Parsed audio codec \"${parsedCodec}\" or audio object type not handled. Using \"${result}\"`,\n );\n return result;\n }\n // Provide defaults based on codec type\n // This allows for some playback of some fmp4 playlists without CODECS defined in manifest\n logger.warn(`Unhandled video codec \"${parsedCodec}\"`);\n if (parsedCodec === 'hvc1' || parsedCodec === 'hev1') {\n return 'hvc1.1.6.L120.90';\n }\n if (parsedCodec === 'av01') {\n return 'av01.0.04M.08';\n }\n return 'avc1.42e01e';\n}\nexport default PassThroughRemuxer;\n","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","import Transmuxer, { isPromise } from '../demux/transmuxer';\nimport { Events } from '../events';\nimport { ILogFunction, enableLogs, logger } from '../utils/logger';\nimport { EventEmitter } from 'eventemitter3';\nimport { ErrorDetails, ErrorTypes } from '../errors';\nimport type { RemuxedTrack, RemuxerResult } from '../types/remuxer';\nimport type { TransmuxerResult, ChunkMetadata } from '../types/transmuxer';\n\nif (typeof __IN_WORKER__ !== 'undefined' && __IN_WORKER__) {\n startWorker(self);\n}\n\nfunction startWorker(self) {\n const observer = new EventEmitter();\n const forwardMessage = (ev, data) => {\n self.postMessage({ event: ev, data: data });\n };\n\n // forward events to main thread\n observer.on(Events.FRAG_DECRYPTED, forwardMessage);\n observer.on(Events.ERROR, forwardMessage);\n\n // forward logger events to main thread\n const forwardWorkerLogs = () => {\n for (const logFn in logger) {\n const func: ILogFunction = (message?) => {\n forwardMessage('workerLog', {\n logType: logFn,\n message,\n });\n };\n\n logger[logFn] = func;\n }\n };\n\n self.addEventListener('message', (ev) => {\n const data = ev.data;\n switch (data.cmd) {\n case 'init': {\n const config = JSON.parse(data.config);\n self.transmuxer = new Transmuxer(\n observer,\n data.typeSupported,\n config,\n '',\n data.id,\n );\n enableLogs(config.debug, data.id);\n forwardWorkerLogs();\n forwardMessage('init', null);\n break;\n }\n case 'configure': {\n self.transmuxer.configure(data.config);\n break;\n }\n case 'demux': {\n const transmuxResult: TransmuxerResult | Promise<TransmuxerResult> =\n self.transmuxer.push(\n data.data,\n data.decryptdata,\n data.chunkMeta,\n data.state,\n );\n if (isPromise(transmuxResult)) {\n self.transmuxer.async = true;\n transmuxResult\n .then((data) => {\n emitTransmuxComplete(self, data);\n })\n .catch((error) => {\n forwardMessage(Events.ERROR, {\n type: ErrorTypes.MEDIA_ERROR,\n details: ErrorDetails.FRAG_PARSING_ERROR,\n chunkMeta: data.chunkMeta,\n fatal: false,\n error,\n err: error,\n reason: `transmuxer-worker push error`,\n });\n });\n } else {\n self.transmuxer.async = false;\n emitTransmuxComplete(self, transmuxResult);\n }\n break;\n }\n case 'flush': {\n const id = data.chunkMeta;\n let transmuxResult = self.transmuxer.flush(id);\n const asyncFlush = isPromise(transmuxResult);\n if (asyncFlush || self.transmuxer.async) {\n if (!isPromise(transmuxResult)) {\n transmuxResult = Promise.resolve(transmuxResult);\n }\n transmuxResult\n .then((results: Array<TransmuxerResult>) => {\n handleFlushResult(self, results as Array<TransmuxerResult>, id);\n })\n .catch((error) => {\n forwardMessage(Events.ERROR, {\n type: ErrorTypes.MEDIA_ERROR,\n details: ErrorDetails.FRAG_PARSING_ERROR,\n chunkMeta: data.chunkMeta,\n fatal: false,\n error,\n err: error,\n reason: `transmuxer-worker flush error`,\n });\n });\n } else {\n handleFlushResult(\n self,\n transmuxResult as Array<TransmuxerResult>,\n id,\n );\n }\n break;\n }\n default:\n break;\n }\n });\n}\n\nfunction emitTransmuxComplete(\n self: any,\n transmuxResult: TransmuxerResult,\n): boolean {\n if (isEmptyResult(transmuxResult.remuxResult)) {\n return false;\n }\n const transferable: Array<ArrayBuffer> = [];\n const { audio, video } = transmuxResult.remuxResult;\n if (audio) {\n addToTransferable(transferable, audio);\n }\n if (video) {\n addToTransferable(transferable, video);\n }\n self.postMessage(\n { event: 'transmuxComplete', data: transmuxResult },\n transferable,\n );\n return true;\n}\n\n// Converts data to a transferable object https://developers.google.com/web/updates/2011/12/Transferable-Objects-Lightning-Fast)\n// in order to minimize message passing overhead\nfunction addToTransferable(\n transferable: Array<ArrayBuffer>,\n track: RemuxedTrack,\n) {\n if (track.data1) {\n transferable.push(track.data1.buffer);\n }\n if (track.data2) {\n transferable.push(track.data2.buffer);\n }\n}\n\nfunction handleFlushResult(\n self: any,\n results: Array<TransmuxerResult>,\n chunkMeta: ChunkMetadata,\n) {\n const parsed = results.reduce(\n (parsed, result) => emitTransmuxComplete(self, result) || parsed,\n false,\n );\n if (!parsed) {\n // Emit at least one \"transmuxComplete\" message even if media is not found to update stream-controller state to PARSING\n self.postMessage({ event: 'transmuxComplete', data: results[0] });\n }\n self.postMessage({ event: 'flush', data: chunkMeta });\n}\n\nfunction isEmptyResult(remuxResult: RemuxerResult) {\n return (\n !remuxResult.audio &&\n !remuxResult.video &&\n !remuxResult.text &&\n !remuxResult.id3 &&\n !remuxResult.initSegment\n );\n}\n","import {\n WorkerContext,\n hasUMDWorker,\n injectWorker,\n loadWorker,\n} from './inject-worker';\nimport { Events } from '../events';\nimport Transmuxer, {\n TransmuxConfig,\n TransmuxState,\n isPromise,\n} from '../demux/transmuxer';\nimport { logger } from '../utils/logger';\nimport { ErrorTypes, ErrorDetails } from '../errors';\nimport { getMediaSource } from '../utils/mediasource-helper';\nimport { EventEmitter } from 'eventemitter3';\nimport { Fragment, Part } from '../loader/fragment';\nimport type { ChunkMetadata, TransmuxerResult } from '../types/transmuxer';\nimport type Hls from '../hls';\nimport type { HlsEventEmitter, HlsListeners } from '../events';\nimport type { PlaylistLevelType } from '../types/loader';\nimport type { TypeSupported } from './tsdemuxer';\nimport type { RationalTimestamp } from '../utils/timescale-conversion';\n\nexport default class TransmuxerInterface {\n public error: Error | null = null;\n private hls: Hls;\n private id: PlaylistLevelType;\n private observer: HlsEventEmitter;\n private frag: Fragment | null = null;\n private part: Part | null = null;\n private useWorker: boolean;\n private workerContext: WorkerContext | null = null;\n private onwmsg?: (\n event: MessageEvent<{ event: string; data?: any } | null>,\n ) => void;\n private transmuxer: Transmuxer | null = null;\n private onTransmuxComplete: (transmuxResult: TransmuxerResult) => void;\n private onFlush: (chunkMeta: ChunkMetadata) => void;\n\n constructor(\n hls: Hls,\n id: PlaylistLevelType,\n onTransmuxComplete: (transmuxResult: TransmuxerResult) => void,\n onFlush: (chunkMeta: ChunkMetadata) => void,\n ) {\n const config = hls.config;\n this.hls = hls;\n this.id = id;\n this.useWorker = !!config.enableWorker;\n this.onTransmuxComplete = onTransmuxComplete;\n this.onFlush = onFlush;\n\n const forwardMessage = (ev, data) => {\n data = data || {};\n data.frag = this.frag;\n data.id = this.id;\n if (ev === Events.ERROR) {\n this.error = data.error;\n }\n this.hls.trigger(ev, data);\n };\n\n // forward events to main thread\n this.observer = new EventEmitter() as HlsEventEmitter;\n this.observer.on(Events.FRAG_DECRYPTED, forwardMessage);\n this.observer.on(Events.ERROR, forwardMessage);\n\n const MediaSource = getMediaSource(config.preferManagedMediaSource) || {\n isTypeSupported: () => false,\n };\n const m2tsTypeSupported: TypeSupported = {\n mpeg: MediaSource.isTypeSupported('audio/mpeg'),\n mp3: MediaSource.isTypeSupported('audio/mp4; codecs=\"mp3\"'),\n ac3: __USE_M2TS_ADVANCED_CODECS__\n ? MediaSource.isTypeSupported('audio/mp4; codecs=\"ac-3\"')\n : false,\n };\n\n if (this.useWorker && typeof Worker !== 'undefined') {\n const canCreateWorker = config.workerPath || hasUMDWorker();\n if (canCreateWorker) {\n try {\n if (config.workerPath) {\n logger.log(`loading Web Worker ${config.workerPath} for \"${id}\"`);\n this.workerContext = loadWorker(config.workerPath);\n } else {\n logger.log(`injecting Web Worker for \"${id}\"`);\n this.workerContext = injectWorker();\n }\n this.onwmsg = (event) => this.onWorkerMessage(event);\n const { worker } = this.workerContext;\n worker.addEventListener('message', this.onwmsg);\n worker.onerror = (event) => {\n const error = new Error(\n `${event.message} (${event.filename}:${event.lineno})`,\n );\n config.enableWorker = false;\n logger.warn(`Error in \"${id}\" Web Worker, fallback to inline`);\n this.hls.trigger(Events.ERROR, {\n type: ErrorTypes.OTHER_ERROR,\n details: ErrorDetails.INTERNAL_EXCEPTION,\n fatal: false,\n event: 'demuxerWorker',\n error,\n });\n };\n worker.postMessage({\n cmd: 'init',\n typeSupported: m2tsTypeSupported,\n vendor: '',\n id: id,\n config: JSON.stringify(config),\n });\n } catch (err) {\n logger.warn(\n `Error setting up \"${id}\" Web Worker, fallback to inline`,\n err,\n );\n this.resetWorker();\n this.error = null;\n this.transmuxer = new Transmuxer(\n this.observer,\n m2tsTypeSupported,\n config,\n '',\n id,\n );\n }\n return;\n }\n }\n\n this.transmuxer = new Transmuxer(\n this.observer,\n m2tsTypeSupported,\n config,\n '',\n id,\n );\n }\n\n resetWorker() {\n if (this.workerContext) {\n const { worker, objectURL } = this.workerContext;\n if (objectURL) {\n // revoke the Object URL that was used to create transmuxer worker, so as not to leak it\n self.URL.revokeObjectURL(objectURL);\n }\n worker.removeEventListener('message', this.onwmsg as any);\n worker.onerror = null;\n worker.terminate();\n this.workerContext = null;\n }\n }\n\n destroy() {\n if (this.workerContext) {\n this.resetWorker();\n this.onwmsg = undefined;\n } else {\n const transmuxer = this.transmuxer;\n if (transmuxer) {\n transmuxer.destroy();\n this.transmuxer = null;\n }\n }\n const observer = this.observer;\n if (observer) {\n observer.removeAllListeners();\n }\n this.frag = null;\n // @ts-ignore\n this.observer = null;\n // @ts-ignore\n this.hls = null;\n }\n\n push(\n data: ArrayBuffer,\n initSegmentData: Uint8Array | undefined,\n audioCodec: string | undefined,\n videoCodec: string | undefined,\n frag: Fragment,\n part: Part | null,\n duration: number,\n accurateTimeOffset: boolean,\n chunkMeta: ChunkMetadata,\n defaultInitPTS?: RationalTimestamp,\n ) {\n chunkMeta.transmuxing.start = self.performance.now();\n const { transmuxer } = this;\n const timeOffset = part ? part.start : frag.start;\n // TODO: push \"clear-lead\" decrypt data for unencrypted fragments in streams with encrypted ones\n const decryptdata = frag.decryptdata;\n const lastFrag = this.frag;\n\n const discontinuity = !(lastFrag && frag.cc === lastFrag.cc);\n const trackSwitch = !(lastFrag && chunkMeta.level === lastFrag.level);\n const snDiff = lastFrag ? chunkMeta.sn - (lastFrag.sn as number) : -1;\n const partDiff = this.part ? chunkMeta.part - this.part.index : -1;\n const progressive =\n snDiff === 0 &&\n chunkMeta.id > 1 &&\n chunkMeta.id === lastFrag?.stats.chunkCount;\n const contiguous =\n !trackSwitch &&\n (snDiff === 1 ||\n (snDiff === 0 && (partDiff === 1 || (progressive && partDiff <= 0))));\n const now = self.performance.now();\n\n if (trackSwitch || snDiff || frag.stats.parsing.start === 0) {\n frag.stats.parsing.start = now;\n }\n if (part && (partDiff || !contiguous)) {\n part.stats.parsing.start = now;\n }\n const initSegmentChange = !(\n lastFrag && frag.initSegment?.url === lastFrag.initSegment?.url\n );\n const state = new TransmuxState(\n discontinuity,\n contiguous,\n accurateTimeOffset,\n trackSwitch,\n timeOffset,\n initSegmentChange,\n );\n if (!contiguous || discontinuity || initSegmentChange) {\n logger.log(`[transmuxer-interface, ${frag.type}]: Starting new transmux session for sn: ${chunkMeta.sn} p: ${chunkMeta.part} level: ${chunkMeta.level} id: ${chunkMeta.id}\n discontinuity: ${discontinuity}\n trackSwitch: ${trackSwitch}\n contiguous: ${contiguous}\n accurateTimeOffset: ${accurateTimeOffset}\n timeOffset: ${timeOffset}\n initSegmentChange: ${initSegmentChange}`);\n const config = new TransmuxConfig(\n audioCodec,\n videoCodec,\n initSegmentData,\n duration,\n defaultInitPTS,\n );\n this.configureTransmuxer(config);\n }\n\n this.frag = frag;\n this.part = part;\n\n // Frags with sn of 'initSegment' are not transmuxed\n if (this.workerContext) {\n // post fragment payload as transferable objects for ArrayBuffer (no copy)\n this.workerContext.worker.postMessage(\n {\n cmd: 'demux',\n data,\n decryptdata,\n chunkMeta,\n state,\n },\n data instanceof ArrayBuffer ? [data] : [],\n );\n } else if (transmuxer) {\n const transmuxResult = transmuxer.push(\n data,\n decryptdata,\n chunkMeta,\n state,\n );\n if (isPromise(transmuxResult)) {\n transmuxer.async = true;\n transmuxResult\n .then((data) => {\n this.handleTransmuxComplete(data);\n })\n .catch((error) => {\n this.transmuxerError(\n error,\n chunkMeta,\n 'transmuxer-interface push error',\n );\n });\n } else {\n transmuxer.async = false;\n this.handleTransmuxComplete(transmuxResult as TransmuxerResult);\n }\n }\n }\n\n flush(chunkMeta: ChunkMetadata) {\n chunkMeta.transmuxing.start = self.performance.now();\n const { transmuxer } = this;\n if (this.workerContext) {\n 1;\n this.workerContext.worker.postMessage({\n cmd: 'flush',\n chunkMeta,\n });\n } else if (transmuxer) {\n let transmuxResult = transmuxer.flush(chunkMeta);\n const asyncFlush = isPromise(transmuxResult);\n if (asyncFlush || transmuxer.async) {\n if (!isPromise(transmuxResult)) {\n transmuxResult = Promise.resolve(transmuxResult);\n }\n transmuxResult\n .then((data) => {\n this.handleFlushResult(data, chunkMeta);\n })\n .catch((error) => {\n this.transmuxerError(\n error,\n chunkMeta,\n 'transmuxer-interface flush error',\n );\n });\n } else {\n this.handleFlushResult(\n transmuxResult as Array<TransmuxerResult>,\n chunkMeta,\n );\n }\n }\n }\n\n private transmuxerError(\n error: Error,\n chunkMeta: ChunkMetadata,\n reason: string,\n ) {\n if (!this.hls) {\n return;\n }\n this.error = error;\n this.hls.trigger(Events.ERROR, {\n type: ErrorTypes.MEDIA_ERROR,\n details: ErrorDetails.FRAG_PARSING_ERROR,\n chunkMeta,\n frag: this.frag || undefined,\n fatal: false,\n error,\n err: error,\n reason,\n });\n }\n\n private handleFlushResult(\n results: Array<TransmuxerResult>,\n chunkMeta: ChunkMetadata,\n ) {\n results.forEach((result) => {\n this.handleTransmuxComplete(result);\n });\n this.onFlush(chunkMeta);\n }\n\n private onWorkerMessage(\n event: MessageEvent<{ event: string; data?: any } | null>,\n ) {\n const data = event.data;\n if (!data?.event) {\n logger.warn(\n `worker message received with no ${data ? 'event name' : 'data'}`,\n );\n return;\n }\n const hls = this.hls;\n if (!this.hls) {\n return;\n }\n switch (data.event) {\n case 'init': {\n const objectURL = this.workerContext?.objectURL;\n if (objectURL) {\n // revoke the Object URL that was used to create transmuxer worker, so as not to leak it\n self.URL.revokeObjectURL(objectURL);\n }\n break;\n }\n\n case 'transmuxComplete': {\n this.handleTransmuxComplete(data.data);\n break;\n }\n\n case 'flush': {\n this.onFlush(data.data);\n break;\n }\n\n // pass logs from the worker thread to the main logger\n case 'workerLog':\n if (logger[data.data.logType]) {\n logger[data.data.logType](data.data.message);\n }\n break;\n\n default: {\n data.data = data.data || {};\n data.data.frag = this.frag;\n data.data.id = this.id;\n hls.trigger(data.event as keyof HlsListeners, data.data);\n break;\n }\n }\n }\n\n private configureTransmuxer(config: TransmuxConfig) {\n const { transmuxer } = this;\n if (this.workerContext) {\n this.workerContext.worker.postMessage({\n cmd: 'configure',\n config,\n });\n } else if (transmuxer) {\n transmuxer.configure(config);\n }\n }\n\n private handleTransmuxComplete(result: TransmuxerResult) {\n result.chunkMeta.transmuxing.end = self.performance.now();\n this.onTransmuxComplete(result);\n }\n}\n","// ensure the worker ends up in the bundle\n// If the worker should not be included this gets aliased to empty.js\nimport './transmuxer-worker';\n\nexport function hasUMDWorker(): boolean {\n return typeof __HLS_WORKER_BUNDLE__ === 'function';\n}\n\nexport type WorkerContext = {\n worker: Worker;\n objectURL?: string;\n scriptURL?: string;\n};\n\nexport function injectWorker(): WorkerContext {\n const blob = new self.Blob(\n [\n `var exports={};var module={exports:exports};function define(f){f()};define.amd=true;(${__HLS_WORKER_BUNDLE__.toString()})(true);`,\n ],\n {\n type: 'text/javascript',\n },\n );\n const objectURL = self.URL.createObjectURL(blob);\n const worker = new self.Worker(objectURL);\n\n return {\n worker,\n objectURL,\n };\n}\n\nexport function loadWorker(path: string): WorkerContext {\n const scriptURL = new self.URL(path, self.location.href).href;\n const worker = new self.Worker(scriptURL);\n\n return {\n worker,\n scriptURL,\n };\n}\n","import BaseStreamController, { State } from './base-stream-controller';\nimport { Events } from '../events';\nimport { Bufferable, BufferHelper } from '../utils/buffer-helper';\nimport { FragmentState } from './fragment-tracker';\nimport { Level } from '../types/level';\nimport { PlaylistContextType, PlaylistLevelType } from '../types/loader';\nimport { Fragment, ElementaryStreamTypes, Part } from '../loader/fragment';\nimport ChunkCache from '../demux/chunk-cache';\nimport TransmuxerInterface from '../demux/transmuxer-interface';\nimport { ChunkMetadata } from '../types/transmuxer';\nimport { fragmentWithinToleranceTest } from './fragment-finders';\nimport { alignMediaPlaylistByPDT } from '../utils/discontinuities';\nimport { ErrorDetails } from '../errors';\nimport { audioMatchPredicate, matchesOption } from '../utils/rendition-helper';\nimport type { NetworkComponentAPI } from '../types/component-api';\nimport type Hls from '../hls';\nimport type { FragmentTracker } from './fragment-tracker';\nimport type KeyLoader from '../loader/key-loader';\nimport type { TransmuxerResult } from '../types/transmuxer';\nimport type { LevelDetails } from '../loader/level-details';\nimport type { TrackSet } from '../types/track';\nimport type {\n BufferCreatedData,\n AudioTracksUpdatedData,\n AudioTrackSwitchingData,\n LevelLoadedData,\n TrackLoadedData,\n BufferAppendingData,\n BufferFlushedData,\n InitPTSFoundData,\n FragLoadedData,\n FragParsingMetadataData,\n FragParsingUserdataData,\n FragBufferedData,\n ErrorData,\n BufferFlushingData,\n} from '../types/events';\nimport type { MediaPlaylist } from '../types/media-playlist';\n\nconst TICK_INTERVAL = 100; // how often to tick in ms\n\ntype WaitingForPTSData = {\n frag: Fragment;\n part: Part | null;\n cache: ChunkCache;\n complete: boolean;\n};\n\nclass AudioStreamController\n extends BaseStreamController\n implements NetworkComponentAPI\n{\n private videoBuffer: Bufferable | null = null;\n private videoTrackCC: number = -1;\n private waitingVideoCC: number = -1;\n private bufferedTrack: MediaPlaylist | null = null;\n private switchingTrack: MediaPlaylist | null = null;\n private trackId: number = -1;\n private waitingData: WaitingForPTSData | null = null;\n private mainDetails: LevelDetails | null = null;\n private flushing: boolean = false;\n private bufferFlushed: boolean = false;\n private cachedTrackLoadedData: TrackLoadedData | null = null;\n\n constructor(\n hls: Hls,\n fragmentTracker: FragmentTracker,\n keyLoader: KeyLoader,\n ) {\n super(\n hls,\n fragmentTracker,\n keyLoader,\n '[audio-stream-controller]',\n PlaylistLevelType.AUDIO,\n );\n this._registerListeners();\n }\n\n protected onHandlerDestroying() {\n this._unregisterListeners();\n super.onHandlerDestroying();\n this.mainDetails = null;\n this.bufferedTrack = null;\n this.switchingTrack = null;\n }\n\n private _registerListeners() {\n const { hls } = this;\n hls.on(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n hls.on(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n hls.on(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n hls.on(Events.LEVEL_LOADED, this.onLevelLoaded, this);\n hls.on(Events.AUDIO_TRACKS_UPDATED, this.onAudioTracksUpdated, this);\n hls.on(Events.AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this);\n hls.on(Events.AUDIO_TRACK_LOADED, this.onAudioTrackLoaded, this);\n hls.on(Events.ERROR, this.onError, this);\n hls.on(Events.BUFFER_RESET, this.onBufferReset, this);\n hls.on(Events.BUFFER_CREATED, this.onBufferCreated, this);\n hls.on(Events.BUFFER_FLUSHING, this.onBufferFlushing, this);\n hls.on(Events.BUFFER_FLUSHED, this.onBufferFlushed, this);\n hls.on(Events.INIT_PTS_FOUND, this.onInitPtsFound, this);\n hls.on(Events.FRAG_BUFFERED, this.onFragBuffered, this);\n }\n\n private _unregisterListeners() {\n const { hls } = this;\n hls.off(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n hls.off(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n hls.off(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n hls.off(Events.LEVEL_LOADED, this.onLevelLoaded, this);\n hls.off(Events.AUDIO_TRACKS_UPDATED, this.onAudioTracksUpdated, this);\n hls.off(Events.AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this);\n hls.off(Events.AUDIO_TRACK_LOADED, this.onAudioTrackLoaded, this);\n hls.off(Events.ERROR, this.onError, this);\n hls.off(Events.BUFFER_RESET, this.onBufferReset, this);\n hls.off(Events.BUFFER_CREATED, this.onBufferCreated, this);\n hls.off(Events.BUFFER_FLUSHING, this.onBufferFlushing, this);\n hls.off(Events.BUFFER_FLUSHED, this.onBufferFlushed, this);\n hls.off(Events.INIT_PTS_FOUND, this.onInitPtsFound, this);\n hls.off(Events.FRAG_BUFFERED, this.onFragBuffered, this);\n }\n\n // INIT_PTS_FOUND is triggered when the video track parsed in the stream-controller has a new PTS value\n onInitPtsFound(\n event: Events.INIT_PTS_FOUND,\n { frag, id, initPTS, timescale }: InitPTSFoundData,\n ) {\n // Always update the new INIT PTS\n // Can change due level switch\n if (id === 'main') {\n const cc = frag.cc;\n this.initPTS[frag.cc] = { baseTime: initPTS, timescale };\n this.log(`InitPTS for cc: ${cc} found from main: ${initPTS}`);\n this.videoTrackCC = cc;\n // If we are waiting, tick immediately to unblock audio fragment transmuxing\n if (this.state === State.WAITING_INIT_PTS) {\n this.tick();\n }\n }\n }\n\n startLoad(startPosition: number) {\n if (!this.levels) {\n this.startPosition = startPosition;\n this.state = State.STOPPED;\n return;\n }\n const lastCurrentTime = this.lastCurrentTime;\n this.stopLoad();\n this.setInterval(TICK_INTERVAL);\n if (lastCurrentTime > 0 && startPosition === -1) {\n this.log(\n `Override startPosition with lastCurrentTime @${lastCurrentTime.toFixed(\n 3,\n )}`,\n );\n startPosition = lastCurrentTime;\n this.state = State.IDLE;\n } else {\n this.loadedmetadata = false;\n this.state = State.WAITING_TRACK;\n }\n this.nextLoadPosition =\n this.startPosition =\n this.lastCurrentTime =\n startPosition;\n\n this.tick();\n }\n\n doTick() {\n switch (this.state) {\n case State.IDLE:\n this.doTickIdle();\n break;\n case State.WAITING_TRACK: {\n const { levels, trackId } = this;\n const details = levels?.[trackId]?.details;\n if (details) {\n if (this.waitForCdnTuneIn(details)) {\n break;\n }\n this.state = State.WAITING_INIT_PTS;\n }\n break;\n }\n case State.FRAG_LOADING_WAITING_RETRY: {\n const now = performance.now();\n const retryDate = this.retryDate;\n // if current time is gt than retryDate, or if media seeking let's switch to IDLE state to retry loading\n if (!retryDate || now >= retryDate || this.media?.seeking) {\n const { levels, trackId } = this;\n this.log('RetryDate reached, switch back to IDLE state');\n this.resetStartWhenNotLoaded(levels?.[trackId] || null);\n this.state = State.IDLE;\n }\n break;\n }\n case State.WAITING_INIT_PTS: {\n // Ensure we don't get stuck in the WAITING_INIT_PTS state if the waiting frag CC doesn't match any initPTS\n const waitingData = this.waitingData;\n if (waitingData) {\n const { frag, part, cache, complete } = waitingData;\n if (this.initPTS[frag.cc] !== undefined) {\n this.waitingData = null;\n this.waitingVideoCC = -1;\n this.state = State.FRAG_LOADING;\n const payload = cache.flush();\n const data: FragLoadedData = {\n frag,\n part,\n payload,\n networkDetails: null,\n };\n this._handleFragmentLoadProgress(data);\n if (complete) {\n super._handleFragmentLoadComplete(data);\n }\n } else if (this.videoTrackCC !== this.waitingVideoCC) {\n // Drop waiting fragment if videoTrackCC has changed since waitingFragment was set and initPTS was not found\n this.log(\n `Waiting fragment cc (${frag.cc}) cancelled because video is at cc ${this.videoTrackCC}`,\n );\n this.clearWaitingFragment();\n } else {\n // Drop waiting fragment if an earlier fragment is needed\n const pos = this.getLoadPosition();\n const bufferInfo = BufferHelper.bufferInfo(\n this.mediaBuffer,\n pos,\n this.config.maxBufferHole,\n );\n const waitingFragmentAtPosition = fragmentWithinToleranceTest(\n bufferInfo.end,\n this.config.maxFragLookUpTolerance,\n frag,\n );\n if (waitingFragmentAtPosition < 0) {\n this.log(\n `Waiting fragment cc (${frag.cc}) @ ${frag.start} cancelled because another fragment at ${bufferInfo.end} is needed`,\n );\n this.clearWaitingFragment();\n }\n }\n } else {\n this.state = State.IDLE;\n }\n }\n }\n\n this.onTickEnd();\n }\n\n clearWaitingFragment() {\n const waitingData = this.waitingData;\n if (waitingData) {\n this.fragmentTracker.removeFragment(waitingData.frag);\n this.waitingData = null;\n this.waitingVideoCC = -1;\n this.state = State.IDLE;\n }\n }\n\n protected resetLoadingState() {\n this.clearWaitingFragment();\n super.resetLoadingState();\n }\n\n protected onTickEnd() {\n const { media } = this;\n if (!media?.readyState) {\n // Exit early if we don't have media or if the media hasn't buffered anything yet (readyState 0)\n return;\n }\n\n this.lastCurrentTime = media.currentTime;\n }\n\n private doTickIdle() {\n const { hls, levels, media, trackId } = this;\n const config = hls.config;\n\n // 1. if buffering is suspended\n // 2. if video not attached AND\n // start fragment already requested OR start frag prefetch not enabled\n // 3. if tracks or track not loaded and selected\n // then exit loop\n // => if media not attached but start frag prefetch is enabled and start frag not requested yet, we will not exit loop\n if (\n !this.buffering ||\n (!media && (this.startFragRequested || !config.startFragPrefetch)) ||\n !levels?.[trackId]\n ) {\n return;\n }\n\n const levelInfo = levels[trackId];\n\n const trackDetails = levelInfo.details;\n if (\n !trackDetails ||\n (trackDetails.live && this.levelLastLoaded !== levelInfo) ||\n this.waitForCdnTuneIn(trackDetails)\n ) {\n this.state = State.WAITING_TRACK;\n return;\n }\n\n const bufferable = this.mediaBuffer ? this.mediaBuffer : this.media;\n if (this.bufferFlushed && bufferable) {\n this.bufferFlushed = false;\n this.afterBufferFlushed(\n bufferable,\n ElementaryStreamTypes.AUDIO,\n PlaylistLevelType.AUDIO,\n );\n }\n\n const bufferInfo = this.getFwdBufferInfo(\n bufferable,\n PlaylistLevelType.AUDIO,\n );\n if (bufferInfo === null) {\n return;\n }\n\n if (!this.switchingTrack && this._streamEnded(bufferInfo, trackDetails)) {\n hls.trigger(Events.BUFFER_EOS, { type: 'audio' });\n this.state = State.ENDED;\n return;\n }\n\n const mainBufferInfo = this.getFwdBufferInfo(\n this.videoBuffer ? this.videoBuffer : this.media,\n PlaylistLevelType.MAIN,\n );\n const bufferLen = bufferInfo.len;\n const maxBufLen = this.getMaxBufferLength(mainBufferInfo?.len);\n\n const fragments = trackDetails.fragments;\n const start = fragments[0].start;\n const loadPosition = this.getLoadPosition();\n const targetBufferTime = this.flushing ? loadPosition : bufferInfo.end;\n\n if (this.switchingTrack && media) {\n const pos = loadPosition;\n // if currentTime (pos) is less than alt audio playlist start time, it means that alt audio is ahead of currentTime\n if (trackDetails.PTSKnown && pos < start) {\n // if everything is buffered from pos to start or if audio buffer upfront, let's seek to start\n if (bufferInfo.end > start || bufferInfo.nextStart) {\n this.log(\n 'Alt audio track ahead of main track, seek to start of alt audio track',\n );\n media.currentTime = start + 0.05;\n }\n }\n }\n\n // if buffer length is less than maxBufLen, or near the end, find a fragment to load\n if (\n bufferLen >= maxBufLen &&\n !this.switchingTrack &&\n targetBufferTime < fragments[fragments.length - 1].start\n ) {\n return;\n }\n\n let frag = this.getNextFragment(targetBufferTime, trackDetails);\n let atGap = false;\n // Avoid loop loading by using nextLoadPosition set for backtracking and skipping consecutive GAP tags\n if (frag && this.isLoopLoading(frag, targetBufferTime)) {\n atGap = !!frag.gap;\n frag = this.getNextFragmentLoopLoading(\n frag,\n trackDetails,\n bufferInfo,\n PlaylistLevelType.MAIN,\n maxBufLen,\n );\n }\n if (!frag) {\n this.bufferFlushed = true;\n return;\n }\n\n // Buffer audio up to one target duration ahead of main buffer\n const atBufferSyncLimit =\n mainBufferInfo &&\n frag.start > mainBufferInfo.end + trackDetails.targetduration;\n if (\n atBufferSyncLimit ||\n // Or wait for main buffer after buffing some audio\n (!mainBufferInfo?.len && bufferInfo.len)\n ) {\n // Check fragment-tracker for main fragments since GAP segments do not show up in bufferInfo\n const mainFrag = this.getAppendedFrag(frag.start, PlaylistLevelType.MAIN);\n if (mainFrag === null) {\n return;\n }\n // Bridge gaps in main buffer\n atGap ||=\n !!mainFrag.gap || (!!atBufferSyncLimit && mainBufferInfo.len === 0);\n if (\n (atBufferSyncLimit && !atGap) ||\n (atGap && bufferInfo.nextStart && bufferInfo.nextStart < mainFrag.end)\n ) {\n return;\n }\n }\n\n this.loadFragment(frag, levelInfo, targetBufferTime);\n }\n\n protected getMaxBufferLength(mainBufferLength?: number): number {\n const maxConfigBuffer = super.getMaxBufferLength();\n if (!mainBufferLength) {\n return maxConfigBuffer;\n }\n return Math.min(\n Math.max(maxConfigBuffer, mainBufferLength),\n this.config.maxMaxBufferLength,\n );\n }\n\n onMediaDetaching() {\n this.videoBuffer = null;\n this.bufferFlushed = this.flushing = false;\n super.onMediaDetaching();\n }\n\n onAudioTracksUpdated(\n event: Events.AUDIO_TRACKS_UPDATED,\n { audioTracks }: AudioTracksUpdatedData,\n ) {\n // Reset tranxmuxer is essential for large context switches (Content Steering)\n this.resetTransmuxer();\n this.levels = audioTracks.map((mediaPlaylist) => new Level(mediaPlaylist));\n }\n\n onAudioTrackSwitching(\n event: Events.AUDIO_TRACK_SWITCHING,\n data: AudioTrackSwitchingData,\n ) {\n // if any URL found on new audio track, it is an alternate audio track\n const altAudio = !!data.url;\n this.trackId = data.id;\n const { fragCurrent } = this;\n\n if (fragCurrent) {\n fragCurrent.abortRequests();\n this.removeUnbufferedFrags(fragCurrent.start);\n }\n this.resetLoadingState();\n // destroy useless transmuxer when switching audio to main\n if (!altAudio) {\n this.resetTransmuxer();\n } else {\n // switching to audio track, start timer if not already started\n this.setInterval(TICK_INTERVAL);\n }\n\n // should we switch tracks ?\n if (altAudio) {\n this.switchingTrack = data;\n // main audio track are handled by stream-controller, just do something if switching to alt audio track\n this.state = State.IDLE;\n this.flushAudioIfNeeded(data);\n } else {\n this.switchingTrack = null;\n this.bufferedTrack = data;\n this.state = State.STOPPED;\n }\n this.tick();\n }\n\n onManifestLoading() {\n this.fragmentTracker.removeAllFragments();\n this.startPosition = this.lastCurrentTime = 0;\n this.bufferFlushed = this.flushing = false;\n this.levels =\n this.mainDetails =\n this.waitingData =\n this.bufferedTrack =\n this.cachedTrackLoadedData =\n this.switchingTrack =\n null;\n this.startFragRequested = false;\n this.trackId = this.videoTrackCC = this.waitingVideoCC = -1;\n }\n\n onLevelLoaded(event: Events.LEVEL_LOADED, data: LevelLoadedData) {\n this.mainDetails = data.details;\n if (this.cachedTrackLoadedData !== null) {\n this.hls.trigger(Events.AUDIO_TRACK_LOADED, this.cachedTrackLoadedData);\n this.cachedTrackLoadedData = null;\n }\n }\n\n onAudioTrackLoaded(event: Events.AUDIO_TRACK_LOADED, data: TrackLoadedData) {\n if (this.mainDetails == null) {\n this.cachedTrackLoadedData = data;\n return;\n }\n const { levels } = this;\n const { details: newDetails, id: trackId } = data;\n if (!levels) {\n this.warn(`Audio tracks were reset while loading level ${trackId}`);\n return;\n }\n this.log(\n `Audio track ${trackId} loaded [${newDetails.startSN},${\n newDetails.endSN\n }]${\n newDetails.lastPartSn\n ? `[part-${newDetails.lastPartSn}-${newDetails.lastPartIndex}]`\n : ''\n },duration:${newDetails.totalduration}`,\n );\n\n const track = levels[trackId];\n let sliding = 0;\n if (newDetails.live || track.details?.live) {\n this.checkLiveUpdate(newDetails);\n const mainDetails = this.mainDetails;\n if (newDetails.deltaUpdateFailed || !mainDetails) {\n return;\n }\n if (\n !track.details &&\n newDetails.hasProgramDateTime &&\n mainDetails.hasProgramDateTime\n ) {\n // Make sure our audio rendition is aligned with the \"main\" rendition, using\n // pdt as our reference times.\n alignMediaPlaylistByPDT(newDetails, mainDetails);\n sliding = newDetails.fragments[0].start;\n } else {\n sliding = this.alignPlaylists(\n newDetails,\n track.details,\n this.levelLastLoaded?.details,\n );\n }\n }\n track.details = newDetails;\n this.levelLastLoaded = track;\n\n // compute start position if we are aligned with the main playlist\n if (!this.startFragRequested && (this.mainDetails || !newDetails.live)) {\n this.setStartPosition(this.mainDetails || newDetails, sliding);\n }\n // only switch back to IDLE state if we were waiting for track to start downloading a new fragment\n if (\n this.state === State.WAITING_TRACK &&\n !this.waitForCdnTuneIn(newDetails)\n ) {\n this.state = State.IDLE;\n }\n\n // trigger handler right now\n this.tick();\n }\n\n _handleFragmentLoadProgress(data: FragLoadedData) {\n const { frag, part, payload } = data;\n const { config, trackId, levels } = this;\n if (!levels) {\n this.warn(\n `Audio tracks were reset while fragment load was in progress. Fragment ${frag.sn} of level ${frag.level} will not be buffered`,\n );\n return;\n }\n\n const track = levels[trackId] as Level;\n if (!track) {\n this.warn('Audio track is undefined on fragment load progress');\n return;\n }\n const details = track.details as LevelDetails;\n if (!details) {\n this.warn('Audio track details undefined on fragment load progress');\n this.removeUnbufferedFrags(frag.start);\n return;\n }\n const audioCodec =\n config.defaultAudioCodec || track.audioCodec || 'mp4a.40.2';\n\n let transmuxer = this.transmuxer;\n if (!transmuxer) {\n transmuxer = this.transmuxer = new TransmuxerInterface(\n this.hls,\n PlaylistLevelType.AUDIO,\n this._handleTransmuxComplete.bind(this),\n this._handleTransmuxerFlush.bind(this),\n );\n }\n\n // Check if we have video initPTS\n // If not we need to wait for it\n const initPTS = this.initPTS[frag.cc];\n const initSegmentData = frag.initSegment?.data;\n if (initPTS !== undefined) {\n // this.log(`Transmuxing ${sn} of [${details.startSN} ,${details.endSN}],track ${trackId}`);\n // time Offset is accurate if level PTS is known, or if playlist is not sliding (not live)\n const accurateTimeOffset = false; // details.PTSKnown || !details.live;\n const partIndex = part ? part.index : -1;\n const partial = partIndex !== -1;\n const chunkMeta = new ChunkMetadata(\n frag.level,\n frag.sn as number,\n frag.stats.chunkCount,\n payload.byteLength,\n partIndex,\n partial,\n );\n transmuxer.push(\n payload,\n initSegmentData,\n audioCodec,\n '',\n frag,\n part,\n details.totalduration,\n accurateTimeOffset,\n chunkMeta,\n initPTS,\n );\n } else {\n this.log(\n `Unknown video PTS for cc ${frag.cc}, waiting for video PTS before demuxing audio frag ${frag.sn} of [${details.startSN} ,${details.endSN}],track ${trackId}`,\n );\n const { cache } = (this.waitingData = this.waitingData || {\n frag,\n part,\n cache: new ChunkCache(),\n complete: false,\n });\n cache.push(new Uint8Array(payload));\n this.waitingVideoCC = this.videoTrackCC;\n this.state = State.WAITING_INIT_PTS;\n }\n }\n\n protected _handleFragmentLoadComplete(fragLoadedData: FragLoadedData) {\n if (this.waitingData) {\n this.waitingData.complete = true;\n return;\n }\n super._handleFragmentLoadComplete(fragLoadedData);\n }\n\n onBufferReset(/* event: Events.BUFFER_RESET */) {\n // reset reference to sourcebuffers\n this.mediaBuffer = this.videoBuffer = null;\n this.loadedmetadata = false;\n }\n\n onBufferCreated(event: Events.BUFFER_CREATED, data: BufferCreatedData) {\n const audioTrack = data.tracks.audio;\n if (audioTrack) {\n this.mediaBuffer = audioTrack.buffer || null;\n }\n if (data.tracks.video) {\n this.videoBuffer = data.tracks.video.buffer || null;\n }\n }\n\n onFragBuffered(event: Events.FRAG_BUFFERED, data: FragBufferedData) {\n const { frag, part } = data;\n if (frag.type !== PlaylistLevelType.AUDIO) {\n if (!this.loadedmetadata && frag.type === PlaylistLevelType.MAIN) {\n const bufferable = this.videoBuffer || this.media;\n if (bufferable) {\n const bufferedTimeRanges = BufferHelper.getBuffered(bufferable);\n if (bufferedTimeRanges.length) {\n this.loadedmetadata = true;\n }\n }\n }\n return;\n }\n if (this.fragContextChanged(frag)) {\n // If a level switch was requested while a fragment was buffering, it will emit the FRAG_BUFFERED event upon completion\n // Avoid setting state back to IDLE or concluding the audio switch; otherwise, the switched-to track will not buffer\n this.warn(\n `Fragment ${frag.sn}${part ? ' p: ' + part.index : ''} of level ${\n frag.level\n } finished buffering, but was aborted. state: ${\n this.state\n }, audioSwitch: ${\n this.switchingTrack ? this.switchingTrack.name : 'false'\n }`,\n );\n return;\n }\n if (frag.sn !== 'initSegment') {\n this.fragPrevious = frag;\n const track = this.switchingTrack;\n if (track) {\n this.bufferedTrack = track;\n this.switchingTrack = null;\n this.hls.trigger(Events.AUDIO_TRACK_SWITCHED, { ...track });\n }\n }\n this.fragBufferedComplete(frag, part);\n }\n\n private onError(event: Events.ERROR, data: ErrorData) {\n if (data.fatal) {\n this.state = State.ERROR;\n return;\n }\n switch (data.details) {\n case ErrorDetails.FRAG_GAP:\n case ErrorDetails.FRAG_PARSING_ERROR:\n case ErrorDetails.FRAG_DECRYPT_ERROR:\n case ErrorDetails.FRAG_LOAD_ERROR:\n case ErrorDetails.FRAG_LOAD_TIMEOUT:\n case ErrorDetails.KEY_LOAD_ERROR:\n case ErrorDetails.KEY_LOAD_TIMEOUT:\n this.onFragmentOrKeyLoadError(PlaylistLevelType.AUDIO, data);\n break;\n case ErrorDetails.AUDIO_TRACK_LOAD_ERROR:\n case ErrorDetails.AUDIO_TRACK_LOAD_TIMEOUT:\n case ErrorDetails.LEVEL_PARSING_ERROR:\n // in case of non fatal error while loading track, if not retrying to load track, switch back to IDLE\n if (\n !data.levelRetry &&\n this.state === State.WAITING_TRACK &&\n data.context?.type === PlaylistContextType.AUDIO_TRACK\n ) {\n this.state = State.IDLE;\n }\n break;\n case ErrorDetails.BUFFER_APPEND_ERROR:\n case ErrorDetails.BUFFER_FULL_ERROR:\n if (!data.parent || data.parent !== 'audio') {\n return;\n }\n if (data.details === ErrorDetails.BUFFER_APPEND_ERROR) {\n this.resetLoadingState();\n return;\n }\n if (this.reduceLengthAndFlushBuffer(data)) {\n this.bufferedTrack = null;\n super.flushMainBuffer(0, Number.POSITIVE_INFINITY, 'audio');\n }\n break;\n case ErrorDetails.INTERNAL_EXCEPTION:\n this.recoverWorkerError(data);\n break;\n default:\n break;\n }\n }\n\n private onBufferFlushing(\n event: Events.BUFFER_FLUSHING,\n { type }: BufferFlushingData,\n ) {\n if (type !== ElementaryStreamTypes.VIDEO) {\n this.flushing = true;\n }\n }\n\n private onBufferFlushed(\n event: Events.BUFFER_FLUSHED,\n { type }: BufferFlushedData,\n ) {\n if (type !== ElementaryStreamTypes.VIDEO) {\n this.flushing = false;\n this.bufferFlushed = true;\n if (this.state === State.ENDED) {\n this.state = State.IDLE;\n }\n const mediaBuffer = this.mediaBuffer || this.media;\n if (mediaBuffer) {\n this.afterBufferFlushed(mediaBuffer, type, PlaylistLevelType.AUDIO);\n this.tick();\n }\n }\n }\n\n private _handleTransmuxComplete(transmuxResult: TransmuxerResult) {\n const id = 'audio';\n const { hls } = this;\n const { remuxResult, chunkMeta } = transmuxResult;\n\n const context = this.getCurrentContext(chunkMeta);\n if (!context) {\n this.resetWhenMissingContext(chunkMeta);\n return;\n }\n const { frag, part, level } = context;\n const { details } = level;\n const { audio, text, id3, initSegment } = remuxResult;\n\n // Check if the current fragment has been aborted. We check this by first seeing if we're still playing the current level.\n // If we are, subsequently check if the currently loading fragment (fragCurrent) has changed.\n if (this.fragContextChanged(frag) || !details) {\n this.fragmentTracker.removeFragment(frag);\n return;\n }\n\n this.state = State.PARSING;\n if (this.switchingTrack && audio) {\n this.completeAudioSwitch(this.switchingTrack);\n }\n\n if (initSegment?.tracks) {\n const mapFragment = frag.initSegment || frag;\n this._bufferInitSegment(\n level,\n initSegment.tracks,\n mapFragment,\n chunkMeta,\n );\n hls.trigger(Events.FRAG_PARSING_INIT_SEGMENT, {\n frag: mapFragment,\n id,\n tracks: initSegment.tracks,\n });\n // Only flush audio from old audio tracks when PTS is known on new audio track\n }\n if (audio) {\n const { startPTS, endPTS, startDTS, endDTS } = audio;\n if (part) {\n part.elementaryStreams[ElementaryStreamTypes.AUDIO] = {\n startPTS,\n endPTS,\n startDTS,\n endDTS,\n };\n }\n frag.setElementaryStreamInfo(\n ElementaryStreamTypes.AUDIO,\n startPTS,\n endPTS,\n startDTS,\n endDTS,\n );\n this.bufferFragmentData(audio, frag, part, chunkMeta);\n }\n\n if (id3?.samples?.length) {\n const emittedID3: FragParsingMetadataData = Object.assign(\n {\n id,\n frag,\n details,\n },\n id3,\n );\n hls.trigger(Events.FRAG_PARSING_METADATA, emittedID3);\n }\n if (text) {\n const emittedText: FragParsingUserdataData = Object.assign(\n {\n id,\n frag,\n details,\n },\n text,\n );\n hls.trigger(Events.FRAG_PARSING_USERDATA, emittedText);\n }\n }\n\n private _bufferInitSegment(\n currentLevel: Level,\n tracks: TrackSet,\n frag: Fragment,\n chunkMeta: ChunkMetadata,\n ) {\n if (this.state !== State.PARSING) {\n return;\n }\n // delete any video track found on audio transmuxer\n if (tracks.video) {\n delete tracks.video;\n }\n\n // include levelCodec in audio and video tracks\n const track = tracks.audio;\n if (!track) {\n return;\n }\n\n track.id = 'audio';\n\n const variantAudioCodecs = currentLevel.audioCodec;\n this.log(\n `Init audio buffer, container:${track.container}, codecs[level/parsed]=[${variantAudioCodecs}/${track.codec}]`,\n );\n // SourceBuffer will use track.levelCodec if defined\n if (variantAudioCodecs && variantAudioCodecs.split(',').length === 1) {\n track.levelCodec = variantAudioCodecs;\n }\n this.hls.trigger(Events.BUFFER_CODECS, tracks);\n const initSegment = track.initSegment;\n if (initSegment?.byteLength) {\n const segment: BufferAppendingData = {\n type: 'audio',\n frag,\n part: null,\n chunkMeta,\n parent: frag.type,\n data: initSegment,\n };\n this.hls.trigger(Events.BUFFER_APPENDING, segment);\n }\n // trigger handler right now\n this.tickImmediate();\n }\n\n protected loadFragment(\n frag: Fragment,\n track: Level,\n targetBufferTime: number,\n ) {\n // only load if fragment is not loaded or if in audio switch\n const fragState = this.fragmentTracker.getState(frag);\n this.fragCurrent = frag;\n\n // we force a frag loading in audio switch as fragment tracker might not have evicted previous frags in case of quick audio switch\n if (\n this.switchingTrack ||\n fragState === FragmentState.NOT_LOADED ||\n fragState === FragmentState.PARTIAL\n ) {\n if (frag.sn === 'initSegment') {\n this._loadInitSegment(frag, track);\n } else if (track.details?.live && !this.initPTS[frag.cc]) {\n this.log(\n `Waiting for video PTS in continuity counter ${frag.cc} of live stream before loading audio fragment ${frag.sn} of level ${this.trackId}`,\n );\n this.state = State.WAITING_INIT_PTS;\n const mainDetails = this.mainDetails;\n if (\n mainDetails &&\n mainDetails.fragments[0].start !== track.details.fragments[0].start\n ) {\n alignMediaPlaylistByPDT(track.details, mainDetails);\n }\n } else {\n this.startFragRequested = true;\n super.loadFragment(frag, track, targetBufferTime);\n }\n } else {\n this.clearTrackerIfNeeded(frag);\n }\n }\n\n private flushAudioIfNeeded(switchingTrack: MediaPlaylist) {\n if (this.media && this.bufferedTrack) {\n const { name, lang, assocLang, characteristics, audioCodec, channels } =\n this.bufferedTrack;\n if (\n !matchesOption(\n { name, lang, assocLang, characteristics, audioCodec, channels },\n switchingTrack,\n audioMatchPredicate,\n )\n ) {\n this.log('Switching audio track : flushing all audio');\n super.flushMainBuffer(0, Number.POSITIVE_INFINITY, 'audio');\n this.bufferedTrack = null;\n }\n }\n }\n\n private completeAudioSwitch(switchingTrack: MediaPlaylist) {\n const { hls } = this;\n this.flushAudioIfNeeded(switchingTrack);\n this.bufferedTrack = switchingTrack;\n this.switchingTrack = null;\n hls.trigger(Events.AUDIO_TRACK_SWITCHED, { ...switchingTrack });\n }\n}\nexport default AudioStreamController;\n","import type { Level } from '../types/level';\nimport type { MediaAttributes, MediaPlaylist } from '../types/media-playlist';\n\nexport function subtitleOptionsIdentical(\n trackList1: MediaPlaylist[] | Level[],\n trackList2: MediaPlaylist[],\n): boolean {\n if (trackList1.length !== trackList2.length) {\n return false;\n }\n for (let i = 0; i < trackList1.length; i++) {\n if (\n !mediaAttributesIdentical(\n trackList1[i].attrs as MediaAttributes,\n trackList2[i].attrs,\n )\n ) {\n return false;\n }\n }\n return true;\n}\n\nexport function mediaAttributesIdentical(\n attrs1: MediaAttributes,\n attrs2: MediaAttributes,\n customAttributes?: string[],\n): boolean {\n // Media options with the same rendition ID must be bit identical\n const stableRenditionId = attrs1['STABLE-RENDITION-ID'];\n if (stableRenditionId && !customAttributes) {\n return stableRenditionId === attrs2['STABLE-RENDITION-ID'];\n }\n // When rendition ID is not present, compare attributes\n return !(\n customAttributes || [\n 'LANGUAGE',\n 'NAME',\n 'CHARACTERISTICS',\n 'AUTOSELECT',\n 'DEFAULT',\n 'FORCED',\n 'ASSOC-LANGUAGE',\n ]\n ).some(\n (subtitleAttribute) =>\n attrs1[subtitleAttribute] !== attrs2[subtitleAttribute],\n );\n}\n\nexport function subtitleTrackMatchesTextTrack(\n subtitleTrack: Pick<MediaPlaylist, 'name' | 'lang' | 'attrs'>,\n textTrack: TextTrack,\n) {\n return (\n textTrack.label.toLowerCase() === subtitleTrack.name.toLowerCase() &&\n (!textTrack.language ||\n textTrack.language.toLowerCase() ===\n (subtitleTrack.lang || '').toLowerCase())\n );\n}\n","import BasePlaylistController from './base-playlist-controller';\nimport { Events } from '../events';\nimport { ErrorTypes, ErrorDetails } from '../errors';\nimport { PlaylistContextType } from '../types/loader';\nimport { mediaAttributesIdentical } from '../utils/media-option-attributes';\nimport {\n audioMatchPredicate,\n findClosestLevelWithAudioGroup,\n findMatchingOption,\n matchesOption,\n} from '../utils/rendition-helper';\nimport type Hls from '../hls';\nimport type {\n AudioSelectionOption,\n MediaPlaylist,\n} from '../types/media-playlist';\nimport type { HlsUrlParameters } from '../types/level';\nimport type {\n ManifestParsedData,\n AudioTracksUpdatedData,\n ErrorData,\n LevelLoadingData,\n AudioTrackLoadedData,\n LevelSwitchingData,\n} from '../types/events';\n\nclass AudioTrackController extends BasePlaylistController {\n private tracks: MediaPlaylist[] = [];\n private groupIds: (string | undefined)[] | null = null;\n private tracksInGroup: MediaPlaylist[] = [];\n private trackId: number = -1;\n private currentTrack: MediaPlaylist | null = null;\n private selectDefaultTrack: boolean = true;\n\n constructor(hls: Hls) {\n super(hls, '[audio-track-controller]');\n this.registerListeners();\n }\n\n private registerListeners() {\n const { hls } = this;\n hls.on(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n hls.on(Events.MANIFEST_PARSED, this.onManifestParsed, this);\n hls.on(Events.LEVEL_LOADING, this.onLevelLoading, this);\n hls.on(Events.LEVEL_SWITCHING, this.onLevelSwitching, this);\n hls.on(Events.AUDIO_TRACK_LOADED, this.onAudioTrackLoaded, this);\n hls.on(Events.ERROR, this.onError, this);\n }\n\n private unregisterListeners() {\n const { hls } = this;\n hls.off(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n hls.off(Events.MANIFEST_PARSED, this.onManifestParsed, this);\n hls.off(Events.LEVEL_LOADING, this.onLevelLoading, this);\n hls.off(Events.LEVEL_SWITCHING, this.onLevelSwitching, this);\n hls.off(Events.AUDIO_TRACK_LOADED, this.onAudioTrackLoaded, this);\n hls.off(Events.ERROR, this.onError, this);\n }\n\n public destroy() {\n this.unregisterListeners();\n this.tracks.length = 0;\n this.tracksInGroup.length = 0;\n this.currentTrack = null;\n super.destroy();\n }\n\n protected onManifestLoading(): void {\n this.tracks = [];\n this.tracksInGroup = [];\n this.groupIds = null;\n this.currentTrack = null;\n this.trackId = -1;\n this.selectDefaultTrack = true;\n }\n\n protected onManifestParsed(\n event: Events.MANIFEST_PARSED,\n data: ManifestParsedData,\n ): void {\n this.tracks = data.audioTracks || [];\n }\n\n protected onAudioTrackLoaded(\n event: Events.AUDIO_TRACK_LOADED,\n data: AudioTrackLoadedData,\n ): void {\n const { id, groupId, details } = data;\n const trackInActiveGroup = this.tracksInGroup[id];\n\n if (!trackInActiveGroup || trackInActiveGroup.groupId !== groupId) {\n this.warn(\n `Audio track with id:${id} and group:${groupId} not found in active group ${trackInActiveGroup?.groupId}`,\n );\n return;\n }\n\n const curDetails = trackInActiveGroup.details;\n trackInActiveGroup.details = data.details;\n this.log(\n `Audio track ${id} \"${trackInActiveGroup.name}\" lang:${trackInActiveGroup.lang} group:${groupId} loaded [${details.startSN}-${details.endSN}]`,\n );\n\n if (id === this.trackId) {\n this.playlistLoaded(id, data, curDetails);\n }\n }\n\n protected onLevelLoading(\n event: Events.LEVEL_LOADING,\n data: LevelLoadingData,\n ): void {\n this.switchLevel(data.level);\n }\n\n protected onLevelSwitching(\n event: Events.LEVEL_SWITCHING,\n data: LevelSwitchingData,\n ): void {\n this.switchLevel(data.level);\n }\n\n private switchLevel(levelIndex: number) {\n const levelInfo = this.hls.levels[levelIndex];\n if (!levelInfo) {\n return;\n }\n const audioGroups = levelInfo.audioGroups || null;\n const currentGroups = this.groupIds;\n let currentTrack = this.currentTrack;\n if (\n !audioGroups ||\n currentGroups?.length !== audioGroups?.length ||\n audioGroups?.some((groupId) => currentGroups?.indexOf(groupId) === -1)\n ) {\n this.groupIds = audioGroups;\n this.trackId = -1;\n this.currentTrack = null;\n\n const audioTracks = this.tracks.filter(\n (track): boolean =>\n !audioGroups || audioGroups.indexOf(track.groupId) !== -1,\n );\n if (audioTracks.length) {\n // Disable selectDefaultTrack if there are no default tracks\n if (\n this.selectDefaultTrack &&\n !audioTracks.some((track) => track.default)\n ) {\n this.selectDefaultTrack = false;\n }\n // track.id should match hls.audioTracks index\n audioTracks.forEach((track, i) => {\n track.id = i;\n });\n } else if (!currentTrack && !this.tracksInGroup.length) {\n // Do not dispatch AUDIO_TRACKS_UPDATED when there were and are no tracks\n return;\n }\n this.tracksInGroup = audioTracks;\n\n // Find preferred track\n const audioPreference = this.hls.config.audioPreference;\n if (!currentTrack && audioPreference) {\n const groupIndex = findMatchingOption(\n audioPreference,\n audioTracks,\n audioMatchPredicate,\n );\n if (groupIndex > -1) {\n currentTrack = audioTracks[groupIndex];\n } else {\n const allIndex = findMatchingOption(audioPreference, this.tracks);\n currentTrack = this.tracks[allIndex];\n }\n }\n\n // Select initial track\n let trackId = this.findTrackId(currentTrack);\n if (trackId === -1 && currentTrack) {\n trackId = this.findTrackId(null);\n }\n\n // Dispatch events and load track if needed\n const audioTracksUpdated: AudioTracksUpdatedData = { audioTracks };\n this.log(\n `Updating audio tracks, ${\n audioTracks.length\n } track(s) found in group(s): ${audioGroups?.join(',')}`,\n );\n this.hls.trigger(Events.AUDIO_TRACKS_UPDATED, audioTracksUpdated);\n\n const selectedTrackId = this.trackId;\n if (trackId !== -1 && selectedTrackId === -1) {\n this.setAudioTrack(trackId);\n } else if (audioTracks.length && selectedTrackId === -1) {\n const error = new Error(\n `No audio track selected for current audio group-ID(s): ${this.groupIds?.join(\n ',',\n )} track count: ${audioTracks.length}`,\n );\n this.warn(error.message);\n\n this.hls.trigger(Events.ERROR, {\n type: ErrorTypes.MEDIA_ERROR,\n details: ErrorDetails.AUDIO_TRACK_LOAD_ERROR,\n fatal: true,\n error,\n });\n }\n } else if (this.shouldReloadPlaylist(currentTrack)) {\n // Retry playlist loading if no playlist is or has been loaded yet\n this.setAudioTrack(this.trackId);\n }\n }\n\n protected onError(event: Events.ERROR, data: ErrorData): void {\n if (data.fatal || !data.context) {\n return;\n }\n\n if (\n data.context.type === PlaylistContextType.AUDIO_TRACK &&\n data.context.id === this.trackId &&\n (!this.groupIds || this.groupIds.indexOf(data.context.groupId) !== -1)\n ) {\n this.requestScheduled = -1;\n this.checkRetry(data);\n }\n }\n\n get allAudioTracks(): MediaPlaylist[] {\n return this.tracks;\n }\n\n get audioTracks(): MediaPlaylist[] {\n return this.tracksInGroup;\n }\n\n get audioTrack(): number {\n return this.trackId;\n }\n\n set audioTrack(newId: number) {\n // If audio track is selected from API then don't choose from the manifest default track\n this.selectDefaultTrack = false;\n this.setAudioTrack(newId);\n }\n\n public setAudioOption(\n audioOption: MediaPlaylist | AudioSelectionOption | undefined,\n ): MediaPlaylist | null {\n const hls = this.hls;\n hls.config.audioPreference = audioOption;\n if (audioOption) {\n const allAudioTracks = this.allAudioTracks;\n this.selectDefaultTrack = false;\n if (allAudioTracks.length) {\n // First see if current option matches (no switch op)\n const currentTrack = this.currentTrack;\n if (\n currentTrack &&\n matchesOption(audioOption, currentTrack, audioMatchPredicate)\n ) {\n return currentTrack;\n }\n // Find option in available tracks (tracksInGroup)\n const groupIndex = findMatchingOption(\n audioOption,\n this.tracksInGroup,\n audioMatchPredicate,\n );\n if (groupIndex > -1) {\n const track = this.tracksInGroup[groupIndex];\n this.setAudioTrack(groupIndex);\n return track;\n } else if (currentTrack) {\n // Find option in nearest level audio group\n let searchIndex = hls.loadLevel;\n if (searchIndex === -1) {\n searchIndex = hls.firstAutoLevel;\n }\n const switchIndex = findClosestLevelWithAudioGroup(\n audioOption,\n hls.levels,\n allAudioTracks,\n searchIndex,\n audioMatchPredicate,\n );\n if (switchIndex === -1) {\n // could not find matching variant\n return null;\n }\n // and switch level to acheive the audio group switch\n hls.nextLoadLevel = switchIndex;\n }\n if (audioOption.channels || audioOption.audioCodec) {\n // Could not find a match with codec / channels predicate\n // Find a match without channels or codec\n const withoutCodecAndChannelsMatch = findMatchingOption(\n audioOption,\n allAudioTracks,\n );\n if (withoutCodecAndChannelsMatch > -1) {\n return allAudioTracks[withoutCodecAndChannelsMatch];\n }\n }\n }\n }\n return null;\n }\n\n private setAudioTrack(newId: number): void {\n const tracks = this.tracksInGroup;\n\n // check if level idx is valid\n if (newId < 0 || newId >= tracks.length) {\n this.warn(`Invalid audio track id: ${newId}`);\n return;\n }\n\n // stopping live reloading timer if any\n this.clearTimer();\n\n this.selectDefaultTrack = false;\n const lastTrack = this.currentTrack;\n const track = tracks[newId];\n const trackLoaded = track.details && !track.details.live;\n if (newId === this.trackId && track === lastTrack && trackLoaded) {\n return;\n }\n this.log(\n `Switching to audio-track ${newId} \"${track.name}\" lang:${track.lang} group:${track.groupId} channels:${track.channels}`,\n );\n this.trackId = newId;\n this.currentTrack = track;\n this.hls.trigger(Events.AUDIO_TRACK_SWITCHING, { ...track });\n // Do not reload track unless live\n if (trackLoaded) {\n return;\n }\n const hlsUrlParameters = this.switchParams(\n track.url,\n lastTrack?.details,\n track.details,\n );\n this.loadPlaylist(hlsUrlParameters);\n }\n\n private findTrackId(currentTrack: MediaPlaylist | null): number {\n const audioTracks = this.tracksInGroup;\n for (let i = 0; i < audioTracks.length; i++) {\n const track = audioTracks[i];\n if (this.selectDefaultTrack && !track.default) {\n continue;\n }\n if (\n !currentTrack ||\n matchesOption(currentTrack, track, audioMatchPredicate)\n ) {\n return i;\n }\n }\n if (currentTrack) {\n const { name, lang, assocLang, characteristics, audioCodec, channels } =\n currentTrack;\n for (let i = 0; i < audioTracks.length; i++) {\n const track = audioTracks[i];\n if (\n matchesOption(\n { name, lang, assocLang, characteristics, audioCodec, channels },\n track,\n audioMatchPredicate,\n )\n ) {\n return i;\n }\n }\n for (let i = 0; i < audioTracks.length; i++) {\n const track = audioTracks[i];\n if (\n mediaAttributesIdentical(currentTrack.attrs, track.attrs, [\n 'LANGUAGE',\n 'ASSOC-LANGUAGE',\n 'CHARACTERISTICS',\n ])\n ) {\n return i;\n }\n }\n for (let i = 0; i < audioTracks.length; i++) {\n const track = audioTracks[i];\n if (\n mediaAttributesIdentical(currentTrack.attrs, track.attrs, [\n 'LANGUAGE',\n ])\n ) {\n return i;\n }\n }\n }\n return -1;\n }\n\n protected loadPlaylist(hlsUrlParameters?: HlsUrlParameters): void {\n const audioTrack = this.currentTrack;\n if (this.shouldLoadPlaylist(audioTrack) && audioTrack) {\n super.loadPlaylist();\n const id = audioTrack.id;\n const groupId = audioTrack.groupId as string;\n let url = audioTrack.url;\n if (hlsUrlParameters) {\n try {\n url = hlsUrlParameters.addDirectives(url);\n } catch (error) {\n this.warn(\n `Could not construct new URL with HLS Delivery Directives: ${error}`,\n );\n }\n }\n // track not retrieved yet, or live playlist we need to (re)load it\n this.log(\n `loading audio-track playlist ${id} \"${audioTrack.name}\" lang:${audioTrack.lang} group:${groupId}`,\n );\n this.clearTimer();\n this.hls.trigger(Events.AUDIO_TRACK_LOADING, {\n url,\n id,\n groupId,\n deliveryDirectives: hlsUrlParameters || null,\n });\n }\n }\n}\n\nexport default AudioTrackController;\n","import { Events } from '../events';\nimport { Bufferable, BufferHelper } from '../utils/buffer-helper';\nimport { findFragmentByPTS } from './fragment-finders';\nimport { alignMediaPlaylistByPDT } from '../utils/discontinuities';\nimport { addSliding } from '../utils/level-helper';\nimport { FragmentState } from './fragment-tracker';\nimport BaseStreamController, { State } from './base-stream-controller';\nimport { PlaylistLevelType } from '../types/loader';\nimport { Level } from '../types/level';\nimport { subtitleOptionsIdentical } from '../utils/media-option-attributes';\nimport { ErrorDetails, ErrorTypes } from '../errors';\nimport type { NetworkComponentAPI } from '../types/component-api';\nimport type Hls from '../hls';\nimport type { FragmentTracker } from './fragment-tracker';\nimport type KeyLoader from '../loader/key-loader';\nimport type { LevelDetails } from '../loader/level-details';\nimport type { Fragment } from '../loader/fragment';\nimport type {\n ErrorData,\n FragLoadedData,\n SubtitleFragProcessed,\n SubtitleTracksUpdatedData,\n TrackLoadedData,\n TrackSwitchedData,\n BufferFlushingData,\n LevelLoadedData,\n FragBufferedData,\n} from '../types/events';\n\nconst TICK_INTERVAL = 500; // how often to tick in ms\n\ninterface TimeRange {\n start: number;\n end: number;\n}\n\nexport class SubtitleStreamController\n extends BaseStreamController\n implements NetworkComponentAPI\n{\n private currentTrackId: number = -1;\n private tracksBuffered: Array<TimeRange[]> = [];\n private mainDetails: LevelDetails | null = null;\n\n constructor(\n hls: Hls,\n fragmentTracker: FragmentTracker,\n keyLoader: KeyLoader,\n ) {\n super(\n hls,\n fragmentTracker,\n keyLoader,\n '[subtitle-stream-controller]',\n PlaylistLevelType.SUBTITLE,\n );\n this._registerListeners();\n }\n\n protected onHandlerDestroying() {\n this._unregisterListeners();\n super.onHandlerDestroying();\n this.mainDetails = null;\n }\n\n private _registerListeners() {\n const { hls } = this;\n hls.on(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n hls.on(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n hls.on(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n hls.on(Events.LEVEL_LOADED, this.onLevelLoaded, this);\n hls.on(Events.ERROR, this.onError, this);\n hls.on(Events.SUBTITLE_TRACKS_UPDATED, this.onSubtitleTracksUpdated, this);\n hls.on(Events.SUBTITLE_TRACK_SWITCH, this.onSubtitleTrackSwitch, this);\n hls.on(Events.SUBTITLE_TRACK_LOADED, this.onSubtitleTrackLoaded, this);\n hls.on(Events.SUBTITLE_FRAG_PROCESSED, this.onSubtitleFragProcessed, this);\n hls.on(Events.BUFFER_FLUSHING, this.onBufferFlushing, this);\n hls.on(Events.FRAG_BUFFERED, this.onFragBuffered, this);\n }\n\n private _unregisterListeners() {\n const { hls } = this;\n hls.off(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n hls.off(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n hls.off(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n hls.off(Events.LEVEL_LOADED, this.onLevelLoaded, this);\n hls.off(Events.ERROR, this.onError, this);\n hls.off(Events.SUBTITLE_TRACKS_UPDATED, this.onSubtitleTracksUpdated, this);\n hls.off(Events.SUBTITLE_TRACK_SWITCH, this.onSubtitleTrackSwitch, this);\n hls.off(Events.SUBTITLE_TRACK_LOADED, this.onSubtitleTrackLoaded, this);\n hls.off(Events.SUBTITLE_FRAG_PROCESSED, this.onSubtitleFragProcessed, this);\n hls.off(Events.BUFFER_FLUSHING, this.onBufferFlushing, this);\n hls.off(Events.FRAG_BUFFERED, this.onFragBuffered, this);\n }\n\n startLoad(startPosition: number) {\n this.stopLoad();\n this.state = State.IDLE;\n\n this.setInterval(TICK_INTERVAL);\n\n this.nextLoadPosition =\n this.startPosition =\n this.lastCurrentTime =\n startPosition;\n\n this.tick();\n }\n\n onManifestLoading() {\n this.mainDetails = null;\n this.fragmentTracker.removeAllFragments();\n }\n\n onMediaDetaching(): void {\n this.tracksBuffered = [];\n super.onMediaDetaching();\n }\n\n onLevelLoaded(event: Events.LEVEL_LOADED, data: LevelLoadedData) {\n this.mainDetails = data.details;\n }\n\n onSubtitleFragProcessed(\n event: Events.SUBTITLE_FRAG_PROCESSED,\n data: SubtitleFragProcessed,\n ) {\n const { frag, success } = data;\n this.fragPrevious = frag;\n this.state = State.IDLE;\n if (!success) {\n return;\n }\n\n const buffered = this.tracksBuffered[this.currentTrackId];\n if (!buffered) {\n return;\n }\n\n // Create/update a buffered array matching the interface used by BufferHelper.bufferedInfo\n // so we can re-use the logic used to detect how much has been buffered\n let timeRange: TimeRange | undefined;\n const fragStart = frag.start;\n for (let i = 0; i < buffered.length; i++) {\n if (fragStart >= buffered[i].start && fragStart <= buffered[i].end) {\n timeRange = buffered[i];\n break;\n }\n }\n\n const fragEnd = frag.start + frag.duration;\n if (timeRange) {\n timeRange.end = fragEnd;\n } else {\n timeRange = {\n start: fragStart,\n end: fragEnd,\n };\n buffered.push(timeRange);\n }\n this.fragmentTracker.fragBuffered(frag);\n this.fragBufferedComplete(frag, null);\n }\n\n onBufferFlushing(event: Events.BUFFER_FLUSHING, data: BufferFlushingData) {\n const { startOffset, endOffset } = data;\n if (startOffset === 0 && endOffset !== Number.POSITIVE_INFINITY) {\n const endOffsetSubtitles = endOffset - 1;\n if (endOffsetSubtitles <= 0) {\n return;\n }\n data.endOffsetSubtitles = Math.max(0, endOffsetSubtitles);\n this.tracksBuffered.forEach((buffered) => {\n for (let i = 0; i < buffered.length; ) {\n if (buffered[i].end <= endOffsetSubtitles) {\n buffered.shift();\n continue;\n } else if (buffered[i].start < endOffsetSubtitles) {\n buffered[i].start = endOffsetSubtitles;\n } else {\n break;\n }\n i++;\n }\n });\n this.fragmentTracker.removeFragmentsInRange(\n startOffset,\n endOffsetSubtitles,\n PlaylistLevelType.SUBTITLE,\n );\n }\n }\n\n onFragBuffered(event: Events.FRAG_BUFFERED, data: FragBufferedData) {\n if (!this.loadedmetadata && data.frag.type === PlaylistLevelType.MAIN) {\n if (this.media?.buffered.length) {\n this.loadedmetadata = true;\n }\n }\n }\n\n // If something goes wrong, proceed to next frag, if we were processing one.\n onError(event: Events.ERROR, data: ErrorData) {\n const frag = data.frag;\n\n if (frag?.type === PlaylistLevelType.SUBTITLE) {\n if (data.details === ErrorDetails.FRAG_GAP) {\n this.fragmentTracker.fragBuffered(frag, true);\n }\n if (this.fragCurrent) {\n this.fragCurrent.abortRequests();\n }\n if (this.state !== State.STOPPED) {\n this.state = State.IDLE;\n }\n }\n }\n\n // Got all new subtitle levels.\n onSubtitleTracksUpdated(\n event: Events.SUBTITLE_TRACKS_UPDATED,\n { subtitleTracks }: SubtitleTracksUpdatedData,\n ) {\n if (this.levels && subtitleOptionsIdentical(this.levels, subtitleTracks)) {\n this.levels = subtitleTracks.map(\n (mediaPlaylist) => new Level(mediaPlaylist),\n );\n return;\n }\n this.tracksBuffered = [];\n this.levels = subtitleTracks.map((mediaPlaylist) => {\n const level = new Level(mediaPlaylist);\n this.tracksBuffered[level.id] = [];\n return level;\n });\n this.fragmentTracker.removeFragmentsInRange(\n 0,\n Number.POSITIVE_INFINITY,\n PlaylistLevelType.SUBTITLE,\n );\n this.fragPrevious = null;\n this.mediaBuffer = null;\n }\n\n onSubtitleTrackSwitch(\n event: Events.SUBTITLE_TRACK_SWITCH,\n data: TrackSwitchedData,\n ) {\n this.currentTrackId = data.id;\n\n if (!this.levels?.length || this.currentTrackId === -1) {\n this.clearInterval();\n return;\n }\n\n // Check if track has the necessary details to load fragments\n const currentTrack = this.levels[this.currentTrackId];\n if (currentTrack?.details) {\n this.mediaBuffer = this.mediaBufferTimeRanges;\n } else {\n this.mediaBuffer = null;\n }\n if (currentTrack) {\n this.setInterval(TICK_INTERVAL);\n }\n }\n\n // Got a new set of subtitle fragments.\n onSubtitleTrackLoaded(\n event: Events.SUBTITLE_TRACK_LOADED,\n data: TrackLoadedData,\n ) {\n const { currentTrackId, levels } = this;\n const { details: newDetails, id: trackId } = data;\n if (!levels) {\n this.warn(`Subtitle tracks were reset while loading level ${trackId}`);\n return;\n }\n const track: Level = levels[trackId];\n if (trackId >= levels.length || !track) {\n return;\n }\n this.log(\n `Subtitle track ${trackId} loaded [${newDetails.startSN},${\n newDetails.endSN\n }]${\n newDetails.lastPartSn\n ? `[part-${newDetails.lastPartSn}-${newDetails.lastPartIndex}]`\n : ''\n },duration:${newDetails.totalduration}`,\n );\n this.mediaBuffer = this.mediaBufferTimeRanges;\n let sliding = 0;\n if (newDetails.live || track.details?.live) {\n const mainDetails = this.mainDetails;\n if (newDetails.deltaUpdateFailed || !mainDetails) {\n return;\n }\n const mainSlidingStartFragment = mainDetails.fragments[0];\n if (!track.details) {\n if (newDetails.hasProgramDateTime && mainDetails.hasProgramDateTime) {\n alignMediaPlaylistByPDT(newDetails, mainDetails);\n sliding = newDetails.fragments[0].start;\n } else if (mainSlidingStartFragment) {\n // line up live playlist with main so that fragments in range are loaded\n sliding = mainSlidingStartFragment.start;\n addSliding(newDetails, sliding);\n }\n } else {\n sliding = this.alignPlaylists(\n newDetails,\n track.details,\n this.levelLastLoaded?.details,\n );\n if (sliding === 0 && mainSlidingStartFragment) {\n // realign with main when there is no overlap with last refresh\n sliding = mainSlidingStartFragment.start;\n addSliding(newDetails, sliding);\n }\n }\n }\n track.details = newDetails;\n this.levelLastLoaded = track;\n\n if (trackId !== currentTrackId) {\n return;\n }\n\n if (!this.startFragRequested && (this.mainDetails || !newDetails.live)) {\n this.setStartPosition(this.mainDetails || newDetails, sliding);\n }\n\n // trigger handler right now\n this.tick();\n\n // If playlist is misaligned because of bad PDT or drift, delete details to resync with main on reload\n if (\n newDetails.live &&\n !this.fragCurrent &&\n this.media &&\n this.state === State.IDLE\n ) {\n const foundFrag = findFragmentByPTS(\n null,\n newDetails.fragments,\n this.media.currentTime,\n 0,\n );\n if (!foundFrag) {\n this.warn('Subtitle playlist not aligned with playback');\n track.details = undefined;\n }\n }\n }\n\n _handleFragmentLoadComplete(fragLoadedData: FragLoadedData) {\n const { frag, payload } = fragLoadedData;\n const decryptData = frag.decryptdata;\n const hls = this.hls;\n\n if (this.fragContextChanged(frag)) {\n return;\n }\n // check to see if the payload needs to be decrypted\n if (\n payload &&\n payload.byteLength > 0 &&\n decryptData?.key &&\n decryptData.iv &&\n decryptData.method === 'AES-128'\n ) {\n const startTime = performance.now();\n // decrypt the subtitles\n this.decrypter\n .decrypt(\n new Uint8Array(payload),\n decryptData.key.buffer,\n decryptData.iv.buffer,\n )\n .catch((err) => {\n hls.trigger(Events.ERROR, {\n type: ErrorTypes.MEDIA_ERROR,\n details: ErrorDetails.FRAG_DECRYPT_ERROR,\n fatal: false,\n error: err,\n reason: err.message,\n frag,\n });\n throw err;\n })\n .then((decryptedData) => {\n const endTime = performance.now();\n hls.trigger(Events.FRAG_DECRYPTED, {\n frag,\n payload: decryptedData,\n stats: {\n tstart: startTime,\n tdecrypt: endTime,\n },\n });\n })\n .catch((err) => {\n this.warn(`${err.name}: ${err.message}`);\n this.state = State.IDLE;\n });\n }\n }\n\n doTick() {\n if (!this.media) {\n this.state = State.IDLE;\n return;\n }\n\n if (this.state === State.IDLE) {\n const { currentTrackId, levels } = this;\n const track = levels?.[currentTrackId];\n if (!track || !levels.length || !track.details) {\n return;\n }\n const { config } = this;\n const currentTime = this.getLoadPosition();\n const bufferedInfo = BufferHelper.bufferedInfo(\n this.tracksBuffered[this.currentTrackId] || [],\n currentTime,\n config.maxBufferHole,\n );\n const { end: targetBufferTime, len: bufferLen } = bufferedInfo;\n\n const mainBufferInfo = this.getFwdBufferInfo(\n this.media,\n PlaylistLevelType.MAIN,\n );\n const trackDetails = track.details as LevelDetails;\n const maxBufLen =\n this.getMaxBufferLength(mainBufferInfo?.len) +\n trackDetails.levelTargetDuration;\n\n if (bufferLen > maxBufLen) {\n return;\n }\n const fragments = trackDetails.fragments;\n const fragLen = fragments.length;\n const end = trackDetails.edge;\n\n let foundFrag: Fragment | null = null;\n const fragPrevious = this.fragPrevious;\n if (targetBufferTime < end) {\n const tolerance = config.maxFragLookUpTolerance;\n const lookupTolerance =\n targetBufferTime > end - tolerance ? 0 : tolerance;\n foundFrag = findFragmentByPTS(\n fragPrevious,\n fragments,\n Math.max(fragments[0].start, targetBufferTime),\n lookupTolerance,\n );\n if (\n !foundFrag &&\n fragPrevious &&\n fragPrevious.start < fragments[0].start\n ) {\n foundFrag = fragments[0];\n }\n } else {\n foundFrag = fragments[fragLen - 1];\n }\n if (!foundFrag) {\n return;\n }\n foundFrag = this.mapToInitFragWhenRequired(foundFrag) as Fragment;\n if (foundFrag.sn !== 'initSegment') {\n // Load earlier fragment in same discontinuity to make up for misaligned playlists and cues that extend beyond end of segment\n const curSNIdx = foundFrag.sn - trackDetails.startSN;\n const prevFrag = fragments[curSNIdx - 1];\n if (\n prevFrag &&\n prevFrag.cc === foundFrag.cc &&\n this.fragmentTracker.getState(prevFrag) === FragmentState.NOT_LOADED\n ) {\n foundFrag = prevFrag;\n }\n }\n if (\n this.fragmentTracker.getState(foundFrag) === FragmentState.NOT_LOADED\n ) {\n // only load if fragment is not loaded\n this.loadFragment(foundFrag, track, targetBufferTime);\n }\n }\n }\n\n protected getMaxBufferLength(mainBufferLength?: number): number {\n const maxConfigBuffer = super.getMaxBufferLength();\n if (!mainBufferLength) {\n return maxConfigBuffer;\n }\n return Math.max(maxConfigBuffer, mainBufferLength);\n }\n\n protected loadFragment(\n frag: Fragment,\n level: Level,\n targetBufferTime: number,\n ) {\n this.fragCurrent = frag;\n if (frag.sn === 'initSegment') {\n this._loadInitSegment(frag, level);\n } else {\n this.startFragRequested = true;\n super.loadFragment(frag, level, targetBufferTime);\n }\n }\n\n get mediaBufferTimeRanges(): Bufferable {\n return new BufferableInstance(\n this.tracksBuffered[this.currentTrackId] || [],\n );\n }\n}\n\nclass BufferableInstance implements Bufferable {\n public readonly buffered: TimeRanges;\n\n constructor(timeranges: TimeRange[]) {\n const getRange = (\n name: 'start' | 'end',\n index: number,\n length: number,\n ): number => {\n index = index >>> 0;\n if (index > length - 1) {\n throw new DOMException(\n `Failed to execute '${name}' on 'TimeRanges': The index provided (${index}) is greater than the maximum bound (${length})`,\n );\n }\n return timeranges[index][name];\n };\n this.buffered = {\n get length() {\n return timeranges.length;\n },\n end(index: number): number {\n return getRange('end', index, timeranges.length);\n },\n start(index: number): number {\n return getRange('start', index, timeranges.length);\n },\n };\n }\n}\n","import BasePlaylistController from './base-playlist-controller';\nimport { Events } from '../events';\nimport {\n clearCurrentCues,\n filterSubtitleTracks,\n} from '../utils/texttrack-utils';\nimport { PlaylistContextType } from '../types/loader';\nimport {\n mediaAttributesIdentical,\n subtitleTrackMatchesTextTrack,\n} from '../utils/media-option-attributes';\nimport { findMatchingOption, matchesOption } from '../utils/rendition-helper';\nimport type Hls from '../hls';\nimport type {\n MediaPlaylist,\n SubtitleSelectionOption,\n} from '../types/media-playlist';\nimport type { HlsUrlParameters } from '../types/level';\nimport type {\n ErrorData,\n LevelLoadingData,\n MediaAttachedData,\n SubtitleTracksUpdatedData,\n ManifestParsedData,\n TrackLoadedData,\n LevelSwitchingData,\n} from '../types/events';\n\nclass SubtitleTrackController extends BasePlaylistController {\n private media: HTMLMediaElement | null = null;\n private tracks: MediaPlaylist[] = [];\n private groupIds: (string | undefined)[] | null = null;\n private tracksInGroup: MediaPlaylist[] = [];\n private trackId: number = -1;\n private currentTrack: MediaPlaylist | null = null;\n private selectDefaultTrack: boolean = true;\n private queuedDefaultTrack: number = -1;\n private asyncPollTrackChange: () => void = () => this.pollTrackChange(0);\n private useTextTrackPolling: boolean = false;\n private subtitlePollingInterval: number = -1;\n private _subtitleDisplay: boolean = true;\n\n constructor(hls: Hls) {\n super(hls, '[subtitle-track-controller]');\n this.registerListeners();\n }\n\n public destroy() {\n this.unregisterListeners();\n this.tracks.length = 0;\n this.tracksInGroup.length = 0;\n this.currentTrack = null;\n this.onTextTracksChanged = this.asyncPollTrackChange = null as any;\n super.destroy();\n }\n\n public get subtitleDisplay(): boolean {\n return this._subtitleDisplay;\n }\n\n public set subtitleDisplay(value: boolean) {\n this._subtitleDisplay = value;\n if (this.trackId > -1) {\n this.toggleTrackModes();\n }\n }\n\n private registerListeners() {\n const { hls } = this;\n hls.on(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n hls.on(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n hls.on(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n hls.on(Events.MANIFEST_PARSED, this.onManifestParsed, this);\n hls.on(Events.LEVEL_LOADING, this.onLevelLoading, this);\n hls.on(Events.LEVEL_SWITCHING, this.onLevelSwitching, this);\n hls.on(Events.SUBTITLE_TRACK_LOADED, this.onSubtitleTrackLoaded, this);\n hls.on(Events.ERROR, this.onError, this);\n }\n\n private unregisterListeners() {\n const { hls } = this;\n hls.off(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n hls.off(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n hls.off(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n hls.off(Events.MANIFEST_PARSED, this.onManifestParsed, this);\n hls.off(Events.LEVEL_LOADING, this.onLevelLoading, this);\n hls.off(Events.LEVEL_SWITCHING, this.onLevelSwitching, this);\n hls.off(Events.SUBTITLE_TRACK_LOADED, this.onSubtitleTrackLoaded, this);\n hls.off(Events.ERROR, this.onError, this);\n }\n\n // Listen for subtitle track change, then extract the current track ID.\n protected onMediaAttached(\n event: Events.MEDIA_ATTACHED,\n data: MediaAttachedData,\n ): void {\n this.media = data.media;\n if (!this.media) {\n return;\n }\n\n if (this.queuedDefaultTrack > -1) {\n this.subtitleTrack = this.queuedDefaultTrack;\n this.queuedDefaultTrack = -1;\n }\n\n this.useTextTrackPolling = !(\n this.media.textTracks && 'onchange' in this.media.textTracks\n );\n if (this.useTextTrackPolling) {\n this.pollTrackChange(500);\n } else {\n this.media.textTracks.addEventListener(\n 'change',\n this.asyncPollTrackChange,\n );\n }\n }\n\n private pollTrackChange(timeout: number) {\n self.clearInterval(this.subtitlePollingInterval);\n this.subtitlePollingInterval = self.setInterval(\n this.onTextTracksChanged,\n timeout,\n );\n }\n\n protected onMediaDetaching(): void {\n if (!this.media) {\n return;\n }\n\n self.clearInterval(this.subtitlePollingInterval);\n if (!this.useTextTrackPolling) {\n this.media.textTracks.removeEventListener(\n 'change',\n this.asyncPollTrackChange,\n );\n }\n\n if (this.trackId > -1) {\n this.queuedDefaultTrack = this.trackId;\n }\n\n const textTracks = filterSubtitleTracks(this.media.textTracks);\n // Clear loaded cues on media detachment from tracks\n textTracks.forEach((track) => {\n clearCurrentCues(track);\n });\n // Disable all subtitle tracks before detachment so when reattached only tracks in that content are enabled.\n this.subtitleTrack = -1;\n this.media = null;\n }\n\n protected onManifestLoading(): void {\n this.tracks = [];\n this.groupIds = null;\n this.tracksInGroup = [];\n this.trackId = -1;\n this.currentTrack = null;\n this.selectDefaultTrack = true;\n }\n\n // Fired whenever a new manifest is loaded.\n protected onManifestParsed(\n event: Events.MANIFEST_PARSED,\n data: ManifestParsedData,\n ): void {\n this.tracks = data.subtitleTracks;\n }\n\n protected onSubtitleTrackLoaded(\n event: Events.SUBTITLE_TRACK_LOADED,\n data: TrackLoadedData,\n ): void {\n const { id, groupId, details } = data;\n const trackInActiveGroup = this.tracksInGroup[id];\n\n if (!trackInActiveGroup || trackInActiveGroup.groupId !== groupId) {\n this.warn(\n `Subtitle track with id:${id} and group:${groupId} not found in active group ${trackInActiveGroup?.groupId}`,\n );\n return;\n }\n\n const curDetails = trackInActiveGroup.details;\n trackInActiveGroup.details = data.details;\n this.log(\n `Subtitle track ${id} \"${trackInActiveGroup.name}\" lang:${trackInActiveGroup.lang} group:${groupId} loaded [${details.startSN}-${details.endSN}]`,\n );\n\n if (id === this.trackId) {\n this.playlistLoaded(id, data, curDetails);\n }\n }\n\n protected onLevelLoading(\n event: Events.LEVEL_LOADING,\n data: LevelLoadingData,\n ): void {\n this.switchLevel(data.level);\n }\n\n protected onLevelSwitching(\n event: Events.LEVEL_SWITCHING,\n data: LevelSwitchingData,\n ): void {\n this.switchLevel(data.level);\n }\n\n private switchLevel(levelIndex: number) {\n const levelInfo = this.hls.levels[levelIndex];\n if (!levelInfo) {\n return;\n }\n const subtitleGroups = levelInfo.subtitleGroups || null;\n const currentGroups = this.groupIds;\n let currentTrack = this.currentTrack;\n if (\n !subtitleGroups ||\n currentGroups?.length !== subtitleGroups?.length ||\n subtitleGroups?.some((groupId) => currentGroups?.indexOf(groupId) === -1)\n ) {\n this.groupIds = subtitleGroups;\n this.trackId = -1;\n this.currentTrack = null;\n\n const subtitleTracks = this.tracks.filter(\n (track): boolean =>\n !subtitleGroups || subtitleGroups.indexOf(track.groupId) !== -1,\n );\n if (subtitleTracks.length) {\n // Disable selectDefaultTrack if there are no default tracks\n if (\n this.selectDefaultTrack &&\n !subtitleTracks.some((track) => track.default)\n ) {\n this.selectDefaultTrack = false;\n }\n // track.id should match hls.audioTracks index\n subtitleTracks.forEach((track, i) => {\n track.id = i;\n });\n } else if (!currentTrack && !this.tracksInGroup.length) {\n // Do not dispatch SUBTITLE_TRACKS_UPDATED when there were and are no tracks\n return;\n }\n this.tracksInGroup = subtitleTracks;\n\n // Find preferred track\n const subtitlePreference = this.hls.config.subtitlePreference;\n if (!currentTrack && subtitlePreference) {\n this.selectDefaultTrack = false;\n const groupIndex = findMatchingOption(\n subtitlePreference,\n subtitleTracks,\n );\n if (groupIndex > -1) {\n currentTrack = subtitleTracks[groupIndex];\n } else {\n const allIndex = findMatchingOption(subtitlePreference, this.tracks);\n currentTrack = this.tracks[allIndex];\n }\n }\n\n // Select initial track\n let trackId = this.findTrackId(currentTrack);\n if (trackId === -1 && currentTrack) {\n trackId = this.findTrackId(null);\n }\n\n // Dispatch events and load track if needed\n const subtitleTracksUpdated: SubtitleTracksUpdatedData = {\n subtitleTracks,\n };\n this.log(\n `Updating subtitle tracks, ${\n subtitleTracks.length\n } track(s) found in \"${subtitleGroups?.join(',')}\" group-id`,\n );\n this.hls.trigger(Events.SUBTITLE_TRACKS_UPDATED, subtitleTracksUpdated);\n\n if (trackId !== -1 && this.trackId === -1) {\n this.setSubtitleTrack(trackId);\n }\n } else if (this.shouldReloadPlaylist(currentTrack)) {\n // Retry playlist loading if no playlist is or has been loaded yet\n this.setSubtitleTrack(this.trackId);\n }\n }\n\n private findTrackId(currentTrack: MediaPlaylist | null): number {\n const tracks = this.tracksInGroup;\n const selectDefault = this.selectDefaultTrack;\n for (let i = 0; i < tracks.length; i++) {\n const track = tracks[i];\n if (\n (selectDefault && !track.default) ||\n (!selectDefault && !currentTrack)\n ) {\n continue;\n }\n if (!currentTrack || matchesOption(track, currentTrack)) {\n return i;\n }\n }\n if (currentTrack) {\n for (let i = 0; i < tracks.length; i++) {\n const track = tracks[i];\n if (\n mediaAttributesIdentical(currentTrack.attrs, track.attrs, [\n 'LANGUAGE',\n 'ASSOC-LANGUAGE',\n 'CHARACTERISTICS',\n ])\n ) {\n return i;\n }\n }\n for (let i = 0; i < tracks.length; i++) {\n const track = tracks[i];\n if (\n mediaAttributesIdentical(currentTrack.attrs, track.attrs, [\n 'LANGUAGE',\n ])\n ) {\n return i;\n }\n }\n }\n return -1;\n }\n\n private findTrackForTextTrack(textTrack: TextTrack | null): number {\n if (textTrack) {\n const tracks = this.tracksInGroup;\n for (let i = 0; i < tracks.length; i++) {\n const track = tracks[i];\n if (subtitleTrackMatchesTextTrack(track, textTrack)) {\n return i;\n }\n }\n }\n return -1;\n }\n\n protected onError(event: Events.ERROR, data: ErrorData): void {\n if (data.fatal || !data.context) {\n return;\n }\n\n if (\n data.context.type === PlaylistContextType.SUBTITLE_TRACK &&\n data.context.id === this.trackId &&\n (!this.groupIds || this.groupIds.indexOf(data.context.groupId) !== -1)\n ) {\n this.checkRetry(data);\n }\n }\n\n get allSubtitleTracks(): MediaPlaylist[] {\n return this.tracks;\n }\n\n /** get alternate subtitle tracks list from playlist **/\n get subtitleTracks(): MediaPlaylist[] {\n return this.tracksInGroup;\n }\n\n /** get/set index of the selected subtitle track (based on index in subtitle track lists) **/\n get subtitleTrack(): number {\n return this.trackId;\n }\n\n set subtitleTrack(newId: number) {\n this.selectDefaultTrack = false;\n this.setSubtitleTrack(newId);\n }\n\n public setSubtitleOption(\n subtitleOption: MediaPlaylist | SubtitleSelectionOption | undefined,\n ): MediaPlaylist | null {\n this.hls.config.subtitlePreference = subtitleOption;\n if (subtitleOption) {\n const allSubtitleTracks = this.allSubtitleTracks;\n this.selectDefaultTrack = false;\n if (allSubtitleTracks.length) {\n // First see if current option matches (no switch op)\n const currentTrack = this.currentTrack;\n if (currentTrack && matchesOption(subtitleOption, currentTrack)) {\n return currentTrack;\n }\n // Find option in current group\n const groupIndex = findMatchingOption(\n subtitleOption,\n this.tracksInGroup,\n );\n if (groupIndex > -1) {\n const track = this.tracksInGroup[groupIndex];\n this.setSubtitleTrack(groupIndex);\n return track;\n } else if (currentTrack) {\n // If this is not the initial selection return null\n // option should have matched one in active group\n return null;\n } else {\n // Find the option in all tracks for initial selection\n const allIndex = findMatchingOption(\n subtitleOption,\n allSubtitleTracks,\n );\n if (allIndex > -1) {\n return allSubtitleTracks[allIndex];\n }\n }\n }\n }\n return null;\n }\n\n protected loadPlaylist(hlsUrlParameters?: HlsUrlParameters): void {\n super.loadPlaylist();\n const currentTrack = this.currentTrack;\n if (this.shouldLoadPlaylist(currentTrack) && currentTrack) {\n const id = currentTrack.id;\n const groupId = currentTrack.groupId as string;\n let url = currentTrack.url;\n if (hlsUrlParameters) {\n try {\n url = hlsUrlParameters.addDirectives(url);\n } catch (error) {\n this.warn(\n `Could not construct new URL with HLS Delivery Directives: ${error}`,\n );\n }\n }\n this.log(`Loading subtitle playlist for id ${id}`);\n this.hls.trigger(Events.SUBTITLE_TRACK_LOADING, {\n url,\n id,\n groupId,\n deliveryDirectives: hlsUrlParameters || null,\n });\n }\n }\n\n /**\n * Disables the old subtitleTrack and sets current mode on the next subtitleTrack.\n * This operates on the DOM textTracks.\n * A value of -1 will disable all subtitle tracks.\n */\n private toggleTrackModes(): void {\n const { media } = this;\n if (!media) {\n return;\n }\n\n const textTracks = filterSubtitleTracks(media.textTracks);\n const currentTrack = this.currentTrack;\n let nextTrack;\n if (currentTrack) {\n nextTrack = textTracks.filter((textTrack) =>\n subtitleTrackMatchesTextTrack(currentTrack, textTrack),\n )[0];\n if (!nextTrack) {\n this.warn(\n `Unable to find subtitle TextTrack with name \"${currentTrack.name}\" and language \"${currentTrack.lang}\"`,\n );\n }\n }\n [].slice.call(textTracks).forEach((track) => {\n if (track.mode !== 'disabled' && track !== nextTrack) {\n track.mode = 'disabled';\n }\n });\n if (nextTrack) {\n const mode = this.subtitleDisplay ? 'showing' : 'hidden';\n if (nextTrack.mode !== mode) {\n nextTrack.mode = mode;\n }\n }\n }\n\n /**\n * This method is responsible for validating the subtitle index and periodically reloading if live.\n * Dispatches the SUBTITLE_TRACK_SWITCH event, which instructs the subtitle-stream-controller to load the selected track.\n */\n private setSubtitleTrack(newId: number): void {\n const tracks = this.tracksInGroup;\n\n // setting this.subtitleTrack will trigger internal logic\n // if media has not been attached yet, it will fail\n // we keep a reference to the default track id\n // and we'll set subtitleTrack when onMediaAttached is triggered\n if (!this.media) {\n this.queuedDefaultTrack = newId;\n return;\n }\n\n // exit if track id as already set or invalid\n if (newId < -1 || newId >= tracks.length || !Number.isFinite(newId)) {\n this.warn(`Invalid subtitle track id: ${newId}`);\n return;\n }\n\n // stopping live reloading timer if any\n this.clearTimer();\n\n this.selectDefaultTrack = false;\n const lastTrack = this.currentTrack;\n const track: MediaPlaylist | null = tracks[newId] || null;\n this.trackId = newId;\n this.currentTrack = track;\n this.toggleTrackModes();\n if (!track) {\n // switch to -1\n this.hls.trigger(Events.SUBTITLE_TRACK_SWITCH, { id: newId });\n return;\n }\n const trackLoaded = !!track.details && !track.details.live;\n if (newId === this.trackId && track === lastTrack && trackLoaded) {\n return;\n }\n this.log(\n `Switching to subtitle-track ${newId}` +\n (track\n ? ` \"${track.name}\" lang:${track.lang} group:${track.groupId}`\n : ''),\n );\n const { id, groupId = '', name, type, url } = track;\n this.hls.trigger(Events.SUBTITLE_TRACK_SWITCH, {\n id,\n groupId,\n name,\n type,\n url,\n });\n const hlsUrlParameters = this.switchParams(\n track.url,\n lastTrack?.details,\n track.details,\n );\n this.loadPlaylist(hlsUrlParameters);\n }\n\n private onTextTracksChanged = () => {\n if (!this.useTextTrackPolling) {\n self.clearInterval(this.subtitlePollingInterval);\n }\n // Media is undefined when switching streams via loadSource()\n if (!this.media || !this.hls.config.renderTextTracksNatively) {\n return;\n }\n\n let textTrack: TextTrack | null = null;\n const tracks = filterSubtitleTracks(this.media.textTracks);\n for (let i = 0; i < tracks.length; i++) {\n if (tracks[i].mode === 'hidden') {\n // Do not break in case there is a following track with showing.\n textTrack = tracks[i];\n } else if (tracks[i].mode === 'showing') {\n textTrack = tracks[i];\n break;\n }\n }\n\n // Find internal track index for TextTrack\n const trackId = this.findTrackForTextTrack(textTrack);\n if (this.subtitleTrack !== trackId) {\n this.setSubtitleTrack(trackId);\n }\n };\n}\n\nexport default SubtitleTrackController;\n","import { logger } from '../utils/logger';\nimport type {\n BufferOperation,\n BufferOperationQueues,\n SourceBuffers,\n SourceBufferName,\n} from '../types/buffer';\n\nexport default class BufferOperationQueue {\n private buffers: SourceBuffers;\n private queues: BufferOperationQueues = {\n video: [],\n audio: [],\n audiovideo: [],\n };\n\n constructor(sourceBufferReference: SourceBuffers) {\n this.buffers = sourceBufferReference;\n }\n\n public append(\n operation: BufferOperation,\n type: SourceBufferName,\n pending?: boolean,\n ) {\n const queue = this.queues[type];\n queue.push(operation);\n if (queue.length === 1 && !pending) {\n this.executeNext(type);\n }\n }\n\n public insertAbort(operation: BufferOperation, type: SourceBufferName) {\n const queue = this.queues[type];\n queue.unshift(operation);\n this.executeNext(type);\n }\n\n public appendBlocker(type: SourceBufferName): Promise<{}> {\n let execute;\n const promise: Promise<{}> = new Promise((resolve) => {\n execute = resolve;\n });\n const operation: BufferOperation = {\n execute,\n onStart: () => {},\n onComplete: () => {},\n onError: () => {},\n };\n\n this.append(operation, type);\n return promise;\n }\n\n public executeNext(type: SourceBufferName) {\n const queue = this.queues[type];\n if (queue.length) {\n const operation: BufferOperation = queue[0];\n try {\n // Operations are expected to result in an 'updateend' event being fired. If not, the queue will lock. Operations\n // which do not end with this event must call _onSBUpdateEnd manually\n operation.execute();\n } catch (error) {\n logger.warn(\n `[buffer-operation-queue]: Exception executing \"${type}\" SourceBuffer operation: ${error}`,\n );\n operation.onError(error);\n\n // Only shift the current operation off, otherwise the updateend handler will do this for us\n const sb = this.buffers[type];\n if (!sb?.updating) {\n this.shiftAndExecuteNext(type);\n }\n }\n }\n }\n\n public shiftAndExecuteNext(type: SourceBufferName) {\n this.queues[type].shift();\n this.executeNext(type);\n }\n\n public current(type: SourceBufferName) {\n return this.queues[type][0];\n }\n}\n","import { Events } from '../events';\nimport { logger } from '../utils/logger';\nimport { ErrorDetails, ErrorTypes } from '../errors';\nimport { BufferHelper } from '../utils/buffer-helper';\nimport {\n getCodecCompatibleName,\n pickMostCompleteCodecName,\n} from '../utils/codecs';\nimport {\n getMediaSource,\n isManagedMediaSource,\n} from '../utils/mediasource-helper';\nimport { ElementaryStreamTypes } from '../loader/fragment';\nimport type { TrackSet } from '../types/track';\nimport BufferOperationQueue from './buffer-operation-queue';\nimport {\n BufferOperation,\n SourceBuffers,\n SourceBufferName,\n SourceBufferListeners,\n} from '../types/buffer';\nimport type {\n LevelUpdatedData,\n BufferAppendingData,\n MediaAttachingData,\n ManifestParsedData,\n BufferCodecsData,\n BufferEOSData,\n BufferFlushingData,\n FragParsedData,\n FragChangedData,\n ErrorData,\n} from '../types/events';\nimport type { ComponentAPI } from '../types/component-api';\nimport type { ChunkMetadata } from '../types/transmuxer';\nimport type Hls from '../hls';\nimport type { LevelDetails } from '../loader/level-details';\nimport type { HlsConfig } from '../config';\n\nconst VIDEO_CODEC_PROFILE_REPLACE =\n /(avc[1234]|hvc1|hev1|dvh[1e]|vp09|av01)(?:\\.[^.,]+)+/;\n\ninterface BufferedChangeEvent extends Event {\n readonly addedRanges?: TimeRanges;\n readonly removedRanges?: TimeRanges;\n}\n\nexport default class BufferController implements ComponentAPI {\n // The level details used to determine duration, target-duration and live\n private details: LevelDetails | null = null;\n // cache the self generated object url to detect hijack of video tag\n private _objectUrl: string | null = null;\n // A queue of buffer operations which require the SourceBuffer to not be updating upon execution\n private operationQueue!: BufferOperationQueue;\n // References to event listeners for each SourceBuffer, so that they can be referenced for event removal\n private listeners!: SourceBufferListeners;\n\n private hls: Hls;\n\n // The number of BUFFER_CODEC events received before any sourceBuffers are created\n public bufferCodecEventsExpected: number = 0;\n\n // The total number of BUFFER_CODEC events received\n private _bufferCodecEventsTotal: number = 0;\n\n // A reference to the attached media element\n public media: HTMLMediaElement | null = null;\n\n // A reference to the active media source\n public mediaSource: MediaSource | null = null;\n\n // Last MP3 audio chunk appended\n private lastMpegAudioChunk: ChunkMetadata | null = null;\n\n private appendSource: boolean;\n\n // counters\n public appendErrors = {\n audio: 0,\n video: 0,\n audiovideo: 0,\n };\n\n public tracks: TrackSet = {};\n public pendingTracks: TrackSet = {};\n public sourceBuffer!: SourceBuffers;\n\n protected log: (msg: any) => void;\n protected warn: (msg: any, obj?: any) => void;\n protected error: (msg: any, obj?: any) => void;\n\n constructor(hls: Hls) {\n this.hls = hls;\n const logPrefix = '[buffer-controller]';\n this.appendSource = isManagedMediaSource(\n getMediaSource(hls.config.preferManagedMediaSource),\n );\n this.log = logger.log.bind(logger, logPrefix);\n this.warn = logger.warn.bind(logger, logPrefix);\n this.error = logger.error.bind(logger, logPrefix);\n this._initSourceBuffer();\n this.registerListeners();\n }\n\n public hasSourceTypes(): boolean {\n return (\n this.getSourceBufferTypes().length > 0 ||\n Object.keys(this.pendingTracks).length > 0\n );\n }\n\n public destroy() {\n this.unregisterListeners();\n this.details = null;\n this.lastMpegAudioChunk = null;\n // @ts-ignore\n this.hls = null;\n }\n\n protected registerListeners() {\n const { hls } = this;\n hls.on(Events.MEDIA_ATTACHING, this.onMediaAttaching, this);\n hls.on(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n hls.on(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n hls.on(Events.MANIFEST_PARSED, this.onManifestParsed, this);\n hls.on(Events.BUFFER_RESET, this.onBufferReset, this);\n hls.on(Events.BUFFER_APPENDING, this.onBufferAppending, this);\n hls.on(Events.BUFFER_CODECS, this.onBufferCodecs, this);\n hls.on(Events.BUFFER_EOS, this.onBufferEos, this);\n hls.on(Events.BUFFER_FLUSHING, this.onBufferFlushing, this);\n hls.on(Events.LEVEL_UPDATED, this.onLevelUpdated, this);\n hls.on(Events.FRAG_PARSED, this.onFragParsed, this);\n hls.on(Events.FRAG_CHANGED, this.onFragChanged, this);\n }\n\n protected unregisterListeners() {\n const { hls } = this;\n hls.off(Events.MEDIA_ATTACHING, this.onMediaAttaching, this);\n hls.off(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n hls.off(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n hls.off(Events.MANIFEST_PARSED, this.onManifestParsed, this);\n hls.off(Events.BUFFER_RESET, this.onBufferReset, this);\n hls.off(Events.BUFFER_APPENDING, this.onBufferAppending, this);\n hls.off(Events.BUFFER_CODECS, this.onBufferCodecs, this);\n hls.off(Events.BUFFER_EOS, this.onBufferEos, this);\n hls.off(Events.BUFFER_FLUSHING, this.onBufferFlushing, this);\n hls.off(Events.LEVEL_UPDATED, this.onLevelUpdated, this);\n hls.off(Events.FRAG_PARSED, this.onFragParsed, this);\n hls.off(Events.FRAG_CHANGED, this.onFragChanged, this);\n }\n\n private _initSourceBuffer() {\n this.sourceBuffer = {};\n this.operationQueue = new BufferOperationQueue(this.sourceBuffer);\n this.listeners = {\n audio: [],\n video: [],\n audiovideo: [],\n };\n this.appendErrors = {\n audio: 0,\n video: 0,\n audiovideo: 0,\n };\n this.lastMpegAudioChunk = null;\n }\n\n private onManifestLoading() {\n this.bufferCodecEventsExpected = this._bufferCodecEventsTotal = 0;\n this.details = null;\n }\n\n protected onManifestParsed(\n event: Events.MANIFEST_PARSED,\n data: ManifestParsedData,\n ) {\n // in case of alt audio 2 BUFFER_CODECS events will be triggered, one per stream controller\n // sourcebuffers will be created all at once when the expected nb of tracks will be reached\n // in case alt audio is not used, only one BUFFER_CODEC event will be fired from main stream controller\n // it will contain the expected nb of source buffers, no need to compute it\n let codecEvents: number = 2;\n if ((data.audio && !data.video) || !data.altAudio || !__USE_ALT_AUDIO__) {\n codecEvents = 1;\n }\n this.bufferCodecEventsExpected = this._bufferCodecEventsTotal = codecEvents;\n this.log(`${this.bufferCodecEventsExpected} bufferCodec event(s) expected`);\n }\n\n protected onMediaAttaching(\n event: Events.MEDIA_ATTACHING,\n data: MediaAttachingData,\n ) {\n const media = (this.media = data.media);\n const MediaSource = getMediaSource(this.appendSource);\n\n if (media && MediaSource) {\n const ms = (this.mediaSource = new MediaSource());\n this.log(`created media source: ${ms.constructor?.name}`);\n // MediaSource listeners are arrow functions with a lexical scope, and do not need to be bound\n ms.addEventListener('sourceopen', this._onMediaSourceOpen);\n ms.addEventListener('sourceended', this._onMediaSourceEnded);\n ms.addEventListener('sourceclose', this._onMediaSourceClose);\n if (this.appendSource) {\n ms.addEventListener('startstreaming', this._onStartStreaming);\n ms.addEventListener('endstreaming', this._onEndStreaming);\n }\n\n // cache the locally generated object url\n const objectUrl = (this._objectUrl = self.URL.createObjectURL(ms));\n // link video and media Source\n if (this.appendSource) {\n try {\n media.removeAttribute('src');\n // ManagedMediaSource will not open without disableRemotePlayback set to false or source alternatives\n const MMS = (self as any).ManagedMediaSource;\n media.disableRemotePlayback =\n media.disableRemotePlayback || (MMS && ms instanceof MMS);\n removeSourceChildren(media);\n addSource(media, objectUrl);\n media.load();\n } catch (error) {\n media.src = objectUrl;\n }\n } else {\n media.src = objectUrl;\n }\n media.addEventListener('emptied', this._onMediaEmptied);\n }\n }\n private _onEndStreaming = (event) => {\n if (!this.hls) {\n return;\n }\n this.hls.pauseBuffering();\n };\n private _onStartStreaming = (event) => {\n if (!this.hls) {\n return;\n }\n this.hls.resumeBuffering();\n };\n\n protected onMediaDetaching() {\n const { media, mediaSource, _objectUrl } = this;\n if (mediaSource) {\n this.log('media source detaching');\n if (mediaSource.readyState === 'open') {\n try {\n // endOfStream could trigger exception if any sourcebuffer is in updating state\n // we don't really care about checking sourcebuffer state here,\n // as we are anyway detaching the MediaSource\n // let's just avoid this exception to propagate\n mediaSource.endOfStream();\n } catch (err) {\n this.warn(\n `onMediaDetaching: ${err.message} while calling endOfStream`,\n );\n }\n }\n // Clean up the SourceBuffers by invoking onBufferReset\n this.onBufferReset();\n mediaSource.removeEventListener('sourceopen', this._onMediaSourceOpen);\n mediaSource.removeEventListener('sourceended', this._onMediaSourceEnded);\n mediaSource.removeEventListener('sourceclose', this._onMediaSourceClose);\n if (this.appendSource) {\n mediaSource.removeEventListener(\n 'startstreaming',\n this._onStartStreaming,\n );\n mediaSource.removeEventListener('endstreaming', this._onEndStreaming);\n }\n\n // Detach properly the MediaSource from the HTMLMediaElement as\n // suggested in https://github.com/w3c/media-source/issues/53.\n if (media) {\n media.removeEventListener('emptied', this._onMediaEmptied);\n if (_objectUrl) {\n self.URL.revokeObjectURL(_objectUrl);\n }\n\n // clean up video tag src only if it's our own url. some external libraries might\n // hijack the video tag and change its 'src' without destroying the Hls instance first\n if (this.mediaSrc === _objectUrl) {\n media.removeAttribute('src');\n if (this.appendSource) {\n removeSourceChildren(media);\n }\n media.load();\n } else {\n this.warn(\n 'media|source.src was changed by a third party - skip cleanup',\n );\n }\n }\n\n this.mediaSource = null;\n this.media = null;\n this._objectUrl = null;\n this.bufferCodecEventsExpected = this._bufferCodecEventsTotal;\n this.pendingTracks = {};\n this.tracks = {};\n }\n\n this.hls.trigger(Events.MEDIA_DETACHED, undefined);\n }\n\n protected onBufferReset() {\n this.getSourceBufferTypes().forEach((type) => {\n this.resetBuffer(type);\n });\n this._initSourceBuffer();\n this.hls.resumeBuffering();\n }\n\n private resetBuffer(type: SourceBufferName) {\n const sb = this.sourceBuffer[type];\n try {\n if (sb) {\n this.removeBufferListeners(type);\n // Synchronously remove the SB from the map before the next call in order to prevent an async function from\n // accessing it\n this.sourceBuffer[type] = undefined;\n if (this.mediaSource?.sourceBuffers.length) {\n this.mediaSource.removeSourceBuffer(sb);\n }\n }\n } catch (err) {\n this.warn(`onBufferReset ${type}`, err);\n }\n }\n\n protected onBufferCodecs(\n event: Events.BUFFER_CODECS,\n data: BufferCodecsData,\n ) {\n const sourceBufferCount = this.getSourceBufferTypes().length;\n const trackNames = Object.keys(data);\n trackNames.forEach((trackName) => {\n if (sourceBufferCount) {\n // check if SourceBuffer codec needs to change\n const track = this.tracks[trackName];\n if (track && typeof track.buffer.changeType === 'function') {\n const { id, codec, levelCodec, container, metadata } =\n data[trackName];\n const currentCodecFull = pickMostCompleteCodecName(\n track.codec,\n track.levelCodec,\n );\n const currentCodec = currentCodecFull?.replace(\n VIDEO_CODEC_PROFILE_REPLACE,\n '$1',\n );\n let trackCodec = pickMostCompleteCodecName(codec, levelCodec);\n const nextCodec = trackCodec?.replace(\n VIDEO_CODEC_PROFILE_REPLACE,\n '$1',\n );\n if (trackCodec && currentCodec !== nextCodec) {\n if (trackName.slice(0, 5) === 'audio') {\n trackCodec = getCodecCompatibleName(\n trackCodec,\n this.appendSource,\n );\n }\n const mimeType = `${container};codecs=${trackCodec}`;\n this.appendChangeType(trackName, mimeType);\n this.log(`switching codec ${currentCodecFull} to ${trackCodec}`);\n this.tracks[trackName] = {\n buffer: track.buffer,\n codec,\n container,\n levelCodec,\n metadata,\n id,\n };\n }\n }\n } else {\n // if source buffer(s) not created yet, appended buffer tracks in this.pendingTracks\n this.pendingTracks[trackName] = data[trackName];\n }\n });\n\n // if sourcebuffers already created, do nothing ...\n if (sourceBufferCount) {\n return;\n }\n\n const bufferCodecEventsExpected = Math.max(\n this.bufferCodecEventsExpected - 1,\n 0,\n );\n if (this.bufferCodecEventsExpected !== bufferCodecEventsExpected) {\n this.log(\n `${bufferCodecEventsExpected} bufferCodec event(s) expected ${trackNames.join(\n ',',\n )}`,\n );\n this.bufferCodecEventsExpected = bufferCodecEventsExpected;\n }\n if (this.mediaSource && this.mediaSource.readyState === 'open') {\n this.checkPendingTracks();\n }\n }\n\n protected appendChangeType(type, mimeType) {\n const { operationQueue } = this;\n const operation: BufferOperation = {\n execute: () => {\n const sb = this.sourceBuffer[type];\n if (sb) {\n this.log(`changing ${type} sourceBuffer type to ${mimeType}`);\n sb.changeType(mimeType);\n }\n operationQueue.shiftAndExecuteNext(type);\n },\n onStart: () => {},\n onComplete: () => {},\n onError: (error: Error) => {\n this.warn(`Failed to change ${type} SourceBuffer type`, error);\n },\n };\n\n operationQueue.append(operation, type, !!this.pendingTracks[type]);\n }\n\n protected onBufferAppending(\n event: Events.BUFFER_APPENDING,\n eventData: BufferAppendingData,\n ) {\n const { hls, operationQueue, tracks } = this;\n const { data, type, frag, part, chunkMeta } = eventData;\n const chunkStats = chunkMeta.buffering[type];\n\n const bufferAppendingStart = self.performance.now();\n chunkStats.start = bufferAppendingStart;\n const fragBuffering = frag.stats.buffering;\n const partBuffering = part ? part.stats.buffering : null;\n if (fragBuffering.start === 0) {\n fragBuffering.start = bufferAppendingStart;\n }\n if (partBuffering && partBuffering.start === 0) {\n partBuffering.start = bufferAppendingStart;\n }\n\n // TODO: Only update timestampOffset when audio/mpeg fragment or part is not contiguous with previously appended\n // Adjusting `SourceBuffer.timestampOffset` (desired point in the timeline where the next frames should be appended)\n // in Chrome browser when we detect MPEG audio container and time delta between level PTS and `SourceBuffer.timestampOffset`\n // is greater than 100ms (this is enough to handle seek for VOD or level change for LIVE videos).\n // More info here: https://github.com/video-dev/hls.js/issues/332#issuecomment-257986486\n const audioTrack = tracks.audio;\n let checkTimestampOffset = false;\n if (type === 'audio' && audioTrack?.container === 'audio/mpeg') {\n checkTimestampOffset =\n !this.lastMpegAudioChunk ||\n chunkMeta.id === 1 ||\n this.lastMpegAudioChunk.sn !== chunkMeta.sn;\n this.lastMpegAudioChunk = chunkMeta;\n }\n\n const fragStart = frag.start;\n const operation: BufferOperation = {\n execute: () => {\n chunkStats.executeStart = self.performance.now();\n if (checkTimestampOffset) {\n const sb = this.sourceBuffer[type];\n if (sb) {\n const delta = fragStart - sb.timestampOffset;\n if (Math.abs(delta) >= 0.1) {\n this.log(\n `Updating audio SourceBuffer timestampOffset to ${fragStart} (delta: ${delta}) sn: ${frag.sn})`,\n );\n sb.timestampOffset = fragStart;\n }\n }\n }\n this.appendExecutor(data, type);\n },\n onStart: () => {\n // logger.debug(`[buffer-controller]: ${type} SourceBuffer updatestart`);\n },\n onComplete: () => {\n // logger.debug(`[buffer-controller]: ${type} SourceBuffer updateend`);\n const end = self.performance.now();\n chunkStats.executeEnd = chunkStats.end = end;\n if (fragBuffering.first === 0) {\n fragBuffering.first = end;\n }\n if (partBuffering && partBuffering.first === 0) {\n partBuffering.first = end;\n }\n\n const { sourceBuffer } = this;\n const timeRanges = {};\n for (const type in sourceBuffer) {\n timeRanges[type] = BufferHelper.getBuffered(sourceBuffer[type]);\n }\n this.appendErrors[type] = 0;\n if (type === 'audio' || type === 'video') {\n this.appendErrors.audiovideo = 0;\n } else {\n this.appendErrors.audio = 0;\n this.appendErrors.video = 0;\n }\n this.hls.trigger(Events.BUFFER_APPENDED, {\n type,\n frag,\n part,\n chunkMeta,\n parent: frag.type,\n timeRanges,\n });\n },\n onError: (error: Error) => {\n // in case any error occured while appending, put back segment in segments table\n const event: ErrorData = {\n type: ErrorTypes.MEDIA_ERROR,\n parent: frag.type,\n details: ErrorDetails.BUFFER_APPEND_ERROR,\n sourceBufferName: type,\n frag,\n part,\n chunkMeta,\n error,\n err: error,\n fatal: false,\n };\n\n if ((error as DOMException).code === DOMException.QUOTA_EXCEEDED_ERR) {\n // QuotaExceededError: http://www.w3.org/TR/html5/infrastructure.html#quotaexceedederror\n // let's stop appending any segments, and report BUFFER_FULL_ERROR error\n event.details = ErrorDetails.BUFFER_FULL_ERROR;\n } else {\n const appendErrorCount = ++this.appendErrors[type];\n event.details = ErrorDetails.BUFFER_APPEND_ERROR;\n /* with UHD content, we could get loop of quota exceeded error until\n browser is able to evict some data from sourcebuffer. Retrying can help recover.\n */\n this.warn(\n `Failed ${appendErrorCount}/${hls.config.appendErrorMaxRetry} times to append segment in \"${type}\" sourceBuffer`,\n );\n if (appendErrorCount >= hls.config.appendErrorMaxRetry) {\n event.fatal = true;\n }\n }\n hls.trigger(Events.ERROR, event);\n },\n };\n operationQueue.append(operation, type, !!this.pendingTracks[type]);\n }\n\n protected onBufferFlushing(\n event: Events.BUFFER_FLUSHING,\n data: BufferFlushingData,\n ) {\n const { operationQueue } = this;\n const flushOperation = (type: SourceBufferName): BufferOperation => ({\n execute: this.removeExecutor.bind(\n this,\n type,\n data.startOffset,\n data.endOffset,\n ),\n onStart: () => {\n // logger.debug(`[buffer-controller]: Started flushing ${data.startOffset} -> ${data.endOffset} for ${type} Source Buffer`);\n },\n onComplete: () => {\n // logger.debug(`[buffer-controller]: Finished flushing ${data.startOffset} -> ${data.endOffset} for ${type} Source Buffer`);\n this.hls.trigger(Events.BUFFER_FLUSHED, { type });\n },\n onError: (error: Error) => {\n this.warn(`Failed to remove from ${type} SourceBuffer`, error);\n },\n });\n\n if (data.type) {\n operationQueue.append(flushOperation(data.type), data.type);\n } else {\n this.getSourceBufferTypes().forEach((type: SourceBufferName) => {\n operationQueue.append(flushOperation(type), type);\n });\n }\n }\n\n protected onFragParsed(event: Events.FRAG_PARSED, data: FragParsedData) {\n const { frag, part } = data;\n const buffersAppendedTo: Array<SourceBufferName> = [];\n const elementaryStreams = part\n ? part.elementaryStreams\n : frag.elementaryStreams;\n if (elementaryStreams[ElementaryStreamTypes.AUDIOVIDEO]) {\n buffersAppendedTo.push('audiovideo');\n } else {\n if (elementaryStreams[ElementaryStreamTypes.AUDIO]) {\n buffersAppendedTo.push('audio');\n }\n if (elementaryStreams[ElementaryStreamTypes.VIDEO]) {\n buffersAppendedTo.push('video');\n }\n }\n\n const onUnblocked = () => {\n const now = self.performance.now();\n frag.stats.buffering.end = now;\n if (part) {\n part.stats.buffering.end = now;\n }\n const stats = part ? part.stats : frag.stats;\n this.hls.trigger(Events.FRAG_BUFFERED, {\n frag,\n part,\n stats,\n id: frag.type,\n });\n };\n\n if (buffersAppendedTo.length === 0) {\n this.warn(\n `Fragments must have at least one ElementaryStreamType set. type: ${frag.type} level: ${frag.level} sn: ${frag.sn}`,\n );\n }\n\n this.blockBuffers(onUnblocked, buffersAppendedTo);\n }\n\n private onFragChanged(event: Events.FRAG_CHANGED, data: FragChangedData) {\n this.trimBuffers();\n }\n\n // on BUFFER_EOS mark matching sourcebuffer(s) as ended and trigger checkEos()\n // an undefined data.type will mark all buffers as EOS.\n protected onBufferEos(event: Events.BUFFER_EOS, data: BufferEOSData) {\n const ended = this.getSourceBufferTypes().reduce((acc, type) => {\n const sb = this.sourceBuffer[type];\n if (sb && (!data.type || data.type === type)) {\n sb.ending = true;\n if (!sb.ended) {\n sb.ended = true;\n this.log(`${type} sourceBuffer now EOS`);\n }\n }\n return acc && !!(!sb || sb.ended);\n }, true);\n\n if (ended) {\n this.log(`Queueing mediaSource.endOfStream()`);\n this.blockBuffers(() => {\n this.getSourceBufferTypes().forEach((type) => {\n const sb = this.sourceBuffer[type];\n if (sb) {\n sb.ending = false;\n }\n });\n const { mediaSource } = this;\n if (!mediaSource || mediaSource.readyState !== 'open') {\n if (mediaSource) {\n this.log(\n `Could not call mediaSource.endOfStream(). mediaSource.readyState: ${mediaSource.readyState}`,\n );\n }\n return;\n }\n this.log(`Calling mediaSource.endOfStream()`);\n // Allow this to throw and be caught by the enqueueing function\n mediaSource.endOfStream();\n });\n }\n }\n\n protected onLevelUpdated(\n event: Events.LEVEL_UPDATED,\n { details }: LevelUpdatedData,\n ) {\n if (!details.fragments.length) {\n return;\n }\n this.details = details;\n\n if (this.getSourceBufferTypes().length) {\n this.blockBuffers(this.updateMediaElementDuration.bind(this));\n } else {\n this.updateMediaElementDuration();\n }\n }\n\n trimBuffers() {\n const { hls, details, media } = this;\n if (!media || details === null) {\n return;\n }\n\n const sourceBufferTypes = this.getSourceBufferTypes();\n if (!sourceBufferTypes.length) {\n return;\n }\n\n const config: Readonly<HlsConfig> = hls.config;\n const currentTime = media.currentTime;\n const targetDuration = details.levelTargetDuration;\n\n // Support for deprecated liveBackBufferLength\n const backBufferLength =\n details.live && config.liveBackBufferLength !== null\n ? config.liveBackBufferLength\n : config.backBufferLength;\n\n if (Number.isFinite(backBufferLength) && backBufferLength > 0) {\n const maxBackBufferLength = Math.max(backBufferLength, targetDuration);\n const targetBackBufferPosition =\n Math.floor(currentTime / targetDuration) * targetDuration -\n maxBackBufferLength;\n\n this.flushBackBuffer(\n currentTime,\n targetDuration,\n targetBackBufferPosition,\n );\n }\n\n if (\n Number.isFinite(config.frontBufferFlushThreshold) &&\n config.frontBufferFlushThreshold > 0\n ) {\n const frontBufferLength = Math.max(\n config.maxBufferLength,\n config.frontBufferFlushThreshold,\n );\n\n const maxFrontBufferLength = Math.max(frontBufferLength, targetDuration);\n const targetFrontBufferPosition =\n Math.floor(currentTime / targetDuration) * targetDuration +\n maxFrontBufferLength;\n\n this.flushFrontBuffer(\n currentTime,\n targetDuration,\n targetFrontBufferPosition,\n );\n }\n }\n\n flushBackBuffer(\n currentTime: number,\n targetDuration: number,\n targetBackBufferPosition: number,\n ) {\n const { details, sourceBuffer } = this;\n const sourceBufferTypes = this.getSourceBufferTypes();\n\n sourceBufferTypes.forEach((type: SourceBufferName) => {\n const sb = sourceBuffer[type];\n if (sb) {\n const buffered = BufferHelper.getBuffered(sb);\n // when target buffer start exceeds actual buffer start\n if (\n buffered.length > 0 &&\n targetBackBufferPosition > buffered.start(0)\n ) {\n this.hls.trigger(Events.BACK_BUFFER_REACHED, {\n bufferEnd: targetBackBufferPosition,\n });\n\n // Support for deprecated event:\n if (details?.live) {\n this.hls.trigger(Events.LIVE_BACK_BUFFER_REACHED, {\n bufferEnd: targetBackBufferPosition,\n });\n } else if (\n sb.ended &&\n buffered.end(buffered.length - 1) - currentTime < targetDuration * 2\n ) {\n this.log(\n `Cannot flush ${type} back buffer while SourceBuffer is in ended state`,\n );\n return;\n }\n\n this.hls.trigger(Events.BUFFER_FLUSHING, {\n startOffset: 0,\n endOffset: targetBackBufferPosition,\n type,\n });\n }\n }\n });\n }\n\n flushFrontBuffer(\n currentTime: number,\n targetDuration: number,\n targetFrontBufferPosition: number,\n ) {\n const { sourceBuffer } = this;\n const sourceBufferTypes = this.getSourceBufferTypes();\n\n sourceBufferTypes.forEach((type: SourceBufferName) => {\n const sb = sourceBuffer[type];\n if (sb) {\n const buffered = BufferHelper.getBuffered(sb);\n const numBufferedRanges = buffered.length;\n // The buffer is either empty or contiguous\n if (numBufferedRanges < 2) {\n return;\n }\n const bufferStart = buffered.start(numBufferedRanges - 1);\n const bufferEnd = buffered.end(numBufferedRanges - 1);\n // No flush if we can tolerate the current buffer length or the current buffer range we would flush is contiguous with current position\n if (\n targetFrontBufferPosition > bufferStart ||\n (currentTime >= bufferStart && currentTime <= bufferEnd)\n ) {\n return;\n } else if (sb.ended && currentTime - bufferEnd < 2 * targetDuration) {\n this.log(\n `Cannot flush ${type} front buffer while SourceBuffer is in ended state`,\n );\n return;\n }\n\n this.hls.trigger(Events.BUFFER_FLUSHING, {\n startOffset: bufferStart,\n endOffset: Infinity,\n type,\n });\n }\n });\n }\n\n /**\n * Update Media Source duration to current level duration or override to Infinity if configuration parameter\n * 'liveDurationInfinity` is set to `true`\n * More details: https://github.com/video-dev/hls.js/issues/355\n */\n private updateMediaElementDuration() {\n if (\n !this.details ||\n !this.media ||\n !this.mediaSource ||\n this.mediaSource.readyState !== 'open'\n ) {\n return;\n }\n const { details, hls, media, mediaSource } = this;\n const levelDuration = details.fragments[0].start + details.totalduration;\n const mediaDuration = media.duration;\n const msDuration = Number.isFinite(mediaSource.duration)\n ? mediaSource.duration\n : 0;\n\n if (details.live && hls.config.liveDurationInfinity) {\n // Override duration to Infinity\n mediaSource.duration = Infinity;\n this.updateSeekableRange(details);\n } else if (\n (levelDuration > msDuration && levelDuration > mediaDuration) ||\n !Number.isFinite(mediaDuration)\n ) {\n // levelDuration was the last value we set.\n // not using mediaSource.duration as the browser may tweak this value\n // only update Media Source duration if its value increase, this is to avoid\n // flushing already buffered portion when switching between quality level\n this.log(`Updating Media Source duration to ${levelDuration.toFixed(3)}`);\n mediaSource.duration = levelDuration;\n }\n }\n\n updateSeekableRange(levelDetails) {\n const mediaSource = this.mediaSource;\n const fragments = levelDetails.fragments;\n const len = fragments.length;\n if (len && levelDetails.live && mediaSource?.setLiveSeekableRange) {\n const start = Math.max(0, fragments[0].start);\n const end = Math.max(start, start + levelDetails.totalduration);\n this.log(\n `Media Source duration is set to ${mediaSource.duration}. Setting seekable range to ${start}-${end}.`,\n );\n mediaSource.setLiveSeekableRange(start, end);\n }\n }\n\n protected checkPendingTracks() {\n const { bufferCodecEventsExpected, operationQueue, pendingTracks } = this;\n\n // Check if we've received all of the expected bufferCodec events. When none remain, create all the sourceBuffers at once.\n // This is important because the MSE spec allows implementations to throw QuotaExceededErrors if creating new sourceBuffers after\n // data has been appended to existing ones.\n // 2 tracks is the max (one for audio, one for video). If we've reach this max go ahead and create the buffers.\n const pendingTracksCount = Object.keys(pendingTracks).length;\n if (\n pendingTracksCount &&\n (!bufferCodecEventsExpected ||\n pendingTracksCount === 2 ||\n 'audiovideo' in pendingTracks)\n ) {\n // ok, let's create them now !\n this.createSourceBuffers(pendingTracks);\n this.pendingTracks = {};\n // append any pending segments now !\n const buffers = this.getSourceBufferTypes();\n if (buffers.length) {\n this.hls.trigger(Events.BUFFER_CREATED, { tracks: this.tracks });\n buffers.forEach((type: SourceBufferName) => {\n operationQueue.executeNext(type);\n });\n } else {\n const error = new Error(\n 'could not create source buffer for media codec(s)',\n );\n this.hls.trigger(Events.ERROR, {\n type: ErrorTypes.MEDIA_ERROR,\n details: ErrorDetails.BUFFER_INCOMPATIBLE_CODECS_ERROR,\n fatal: true,\n error,\n reason: error.message,\n });\n }\n }\n }\n\n protected createSourceBuffers(tracks: TrackSet) {\n const { sourceBuffer, mediaSource } = this;\n if (!mediaSource) {\n throw Error('createSourceBuffers called when mediaSource was null');\n }\n for (const trackName in tracks) {\n if (!sourceBuffer[trackName]) {\n const track = tracks[trackName as keyof TrackSet];\n if (!track) {\n throw Error(\n `source buffer exists for track ${trackName}, however track does not`,\n );\n }\n // use levelCodec as first priority unless it contains multiple comma-separated codec values\n let codec =\n track.levelCodec?.indexOf(',') === -1\n ? track.levelCodec\n : track.codec;\n if (codec) {\n if (trackName.slice(0, 5) === 'audio') {\n codec = getCodecCompatibleName(codec, this.appendSource);\n }\n }\n const mimeType = `${track.container};codecs=${codec}`;\n this.log(`creating sourceBuffer(${mimeType})`);\n try {\n const sb = (sourceBuffer[trackName] =\n mediaSource.addSourceBuffer(mimeType));\n const sbName = trackName as SourceBufferName;\n this.addBufferListener(sbName, 'updatestart', this._onSBUpdateStart);\n this.addBufferListener(sbName, 'updateend', this._onSBUpdateEnd);\n this.addBufferListener(sbName, 'error', this._onSBUpdateError);\n // ManagedSourceBuffer bufferedchange event\n if (this.appendSource) {\n this.addBufferListener(\n sbName,\n 'bufferedchange',\n (type: SourceBufferName, event: BufferedChangeEvent) => {\n // If media was ejected check for a change. Added ranges are redundant with changes on 'updateend' event.\n const removedRanges = event.removedRanges;\n if (removedRanges?.length) {\n this.hls.trigger(Events.BUFFER_FLUSHED, {\n type: trackName as SourceBufferName,\n });\n }\n },\n );\n }\n\n this.tracks[trackName] = {\n buffer: sb,\n codec: codec,\n container: track.container,\n levelCodec: track.levelCodec,\n metadata: track.metadata,\n id: track.id,\n };\n } catch (err) {\n this.error(`error while trying to add sourceBuffer: ${err.message}`);\n this.hls.trigger(Events.ERROR, {\n type: ErrorTypes.MEDIA_ERROR,\n details: ErrorDetails.BUFFER_ADD_CODEC_ERROR,\n fatal: false,\n error: err,\n sourceBufferName: trackName as SourceBufferName,\n mimeType: mimeType,\n });\n }\n }\n }\n }\n\n // Keep as arrow functions so that we can directly reference these functions directly as event listeners\n private _onMediaSourceOpen = () => {\n const { media, mediaSource } = this;\n this.log('Media source opened');\n if (media) {\n media.removeEventListener('emptied', this._onMediaEmptied);\n this.updateMediaElementDuration();\n this.hls.trigger(Events.MEDIA_ATTACHED, {\n media,\n mediaSource: mediaSource as MediaSource,\n });\n }\n\n if (mediaSource) {\n // once received, don't listen anymore to sourceopen event\n mediaSource.removeEventListener('sourceopen', this._onMediaSourceOpen);\n }\n this.checkPendingTracks();\n };\n\n private _onMediaSourceClose = () => {\n this.log('Media source closed');\n };\n\n private _onMediaSourceEnded = () => {\n this.log('Media source ended');\n };\n\n private _onMediaEmptied = () => {\n const { mediaSrc, _objectUrl } = this;\n if (mediaSrc !== _objectUrl) {\n logger.error(\n `Media element src was set while attaching MediaSource (${_objectUrl} > ${mediaSrc})`,\n );\n }\n };\n\n private get mediaSrc(): string | undefined {\n const media = this.media?.querySelector?.('source') || this.media;\n return media?.src;\n }\n\n private _onSBUpdateStart(type: SourceBufferName) {\n const { operationQueue } = this;\n const operation = operationQueue.current(type);\n operation.onStart();\n }\n\n private _onSBUpdateEnd(type: SourceBufferName) {\n if (this.mediaSource?.readyState === 'closed') {\n this.resetBuffer(type);\n return;\n }\n const { operationQueue } = this;\n const operation = operationQueue.current(type);\n operation.onComplete();\n operationQueue.shiftAndExecuteNext(type);\n }\n\n private _onSBUpdateError(type: SourceBufferName, event: Event) {\n const error = new Error(\n `${type} SourceBuffer error. MediaSource readyState: ${this.mediaSource?.readyState}`,\n );\n this.error(`${error}`, event);\n // according to http://www.w3.org/TR/media-source/#sourcebuffer-append-error\n // SourceBuffer errors are not necessarily fatal; if so, the HTMLMediaElement will fire an error event\n this.hls.trigger(Events.ERROR, {\n type: ErrorTypes.MEDIA_ERROR,\n details: ErrorDetails.BUFFER_APPENDING_ERROR,\n sourceBufferName: type,\n error,\n fatal: false,\n });\n // updateend is always fired after error, so we'll allow that to shift the current operation off of the queue\n const operation = this.operationQueue.current(type);\n if (operation) {\n operation.onError(error);\n }\n }\n\n // This method must result in an updateend event; if remove is not called, _onSBUpdateEnd must be called manually\n private removeExecutor(\n type: SourceBufferName,\n startOffset: number,\n endOffset: number,\n ) {\n const { media, mediaSource, operationQueue, sourceBuffer } = this;\n const sb = sourceBuffer[type];\n if (!media || !mediaSource || !sb) {\n this.warn(\n `Attempting to remove from the ${type} SourceBuffer, but it does not exist`,\n );\n operationQueue.shiftAndExecuteNext(type);\n return;\n }\n const mediaDuration = Number.isFinite(media.duration)\n ? media.duration\n : Infinity;\n const msDuration = Number.isFinite(mediaSource.duration)\n ? mediaSource.duration\n : Infinity;\n const removeStart = Math.max(0, startOffset);\n const removeEnd = Math.min(endOffset, mediaDuration, msDuration);\n if (removeEnd > removeStart && (!sb.ending || sb.ended)) {\n sb.ended = false;\n this.log(\n `Removing [${removeStart},${removeEnd}] from the ${type} SourceBuffer`,\n );\n sb.remove(removeStart, removeEnd);\n } else {\n // Cycle the queue\n operationQueue.shiftAndExecuteNext(type);\n }\n }\n\n // This method must result in an updateend event; if append is not called, _onSBUpdateEnd must be called manually\n private appendExecutor(data: Uint8Array, type: SourceBufferName) {\n const sb = this.sourceBuffer[type];\n if (!sb) {\n if (!this.pendingTracks[type]) {\n throw new Error(\n `Attempting to append to the ${type} SourceBuffer, but it does not exist`,\n );\n }\n return;\n }\n\n sb.ended = false;\n sb.appendBuffer(data);\n }\n\n // Enqueues an operation to each SourceBuffer queue which, upon execution, resolves a promise. When all promises\n // resolve, the onUnblocked function is executed. Functions calling this method do not need to unblock the queue\n // upon completion, since we already do it here\n private blockBuffers(\n onUnblocked: () => void,\n buffers: Array<SourceBufferName> = this.getSourceBufferTypes(),\n ) {\n if (!buffers.length) {\n this.log('Blocking operation requested, but no SourceBuffers exist');\n Promise.resolve().then(onUnblocked);\n return;\n }\n const { operationQueue } = this;\n\n // logger.debug(`[buffer-controller]: Blocking ${buffers} SourceBuffer`);\n const blockingOperations = buffers.map((type) =>\n operationQueue.appendBlocker(type as SourceBufferName),\n );\n Promise.all(blockingOperations).then(() => {\n // logger.debug(`[buffer-controller]: Blocking operation resolved; unblocking ${buffers} SourceBuffer`);\n onUnblocked();\n buffers.forEach((type) => {\n const sb = this.sourceBuffer[type];\n // Only cycle the queue if the SB is not updating. There's a bug in Chrome which sets the SB updating flag to\n // true when changing the MediaSource duration (https://bugs.chromium.org/p/chromium/issues/detail?id=959359&can=2&q=mediasource%20duration)\n // While this is a workaround, it's probably useful to have around\n if (!sb?.updating) {\n operationQueue.shiftAndExecuteNext(type);\n }\n });\n });\n }\n\n private getSourceBufferTypes(): Array<SourceBufferName> {\n return Object.keys(this.sourceBuffer) as Array<SourceBufferName>;\n }\n\n private addBufferListener(\n type: SourceBufferName,\n event: string,\n fn: Function,\n ) {\n const buffer = this.sourceBuffer[type];\n if (!buffer) {\n return;\n }\n const listener = fn.bind(this, type);\n this.listeners[type].push({ event, listener });\n buffer.addEventListener(event, listener);\n }\n\n private removeBufferListeners(type: SourceBufferName) {\n const buffer = this.sourceBuffer[type];\n if (!buffer) {\n return;\n }\n this.listeners[type].forEach((l) => {\n buffer.removeEventListener(l.event, l.listener);\n });\n }\n}\n\nfunction removeSourceChildren(node: HTMLElement) {\n const sourceChildren = node.querySelectorAll('source');\n [].slice.call(sourceChildren).forEach((source) => {\n node.removeChild(source);\n });\n}\n\nfunction addSource(media: HTMLMediaElement, url: string) {\n const source = self.document.createElement('source');\n source.type = 'video/mp4';\n source.src = url;\n media.appendChild(source);\n}\n","import OutputFilter from './output-filter';\nimport { logger } from '../utils/logger';\n\n/**\n *\n * This code was ported from the dash.js project at:\n * https://github.com/Dash-Industry-Forum/dash.js/blob/development/externals/cea608-parser.js\n * https://github.com/Dash-Industry-Forum/dash.js/commit/8269b26a761e0853bb21d78780ed945144ecdd4d#diff-71bc295a2d6b6b7093a1d3290d53a4b2\n *\n * The original copyright appears below:\n *\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2015-2016, DASH Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * 2. Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * Exceptions from regular ASCII. CodePoints are mapped to UTF-16 codes\n */\n\nconst specialCea608CharsCodes = {\n 0x2a: 0xe1, // lowercase a, acute accent\n 0x5c: 0xe9, // lowercase e, acute accent\n 0x5e: 0xed, // lowercase i, acute accent\n 0x5f: 0xf3, // lowercase o, acute accent\n 0x60: 0xfa, // lowercase u, acute accent\n 0x7b: 0xe7, // lowercase c with cedilla\n 0x7c: 0xf7, // division symbol\n 0x7d: 0xd1, // uppercase N tilde\n 0x7e: 0xf1, // lowercase n tilde\n 0x7f: 0x2588, // Full block\n // THIS BLOCK INCLUDES THE 16 EXTENDED (TWO-BYTE) LINE 21 CHARACTERS\n // THAT COME FROM HI BYTE=0x11 AND LOW BETWEEN 0x30 AND 0x3F\n // THIS MEANS THAT \\x50 MUST BE ADDED TO THE VALUES\n 0x80: 0xae, // Registered symbol (R)\n 0x81: 0xb0, // degree sign\n 0x82: 0xbd, // 1/2 symbol\n 0x83: 0xbf, // Inverted (open) question mark\n 0x84: 0x2122, // Trademark symbol (TM)\n 0x85: 0xa2, // Cents symbol\n 0x86: 0xa3, // Pounds sterling\n 0x87: 0x266a, // Music 8'th note\n 0x88: 0xe0, // lowercase a, grave accent\n 0x89: 0x20, // transparent space (regular)\n 0x8a: 0xe8, // lowercase e, grave accent\n 0x8b: 0xe2, // lowercase a, circumflex accent\n 0x8c: 0xea, // lowercase e, circumflex accent\n 0x8d: 0xee, // lowercase i, circumflex accent\n 0x8e: 0xf4, // lowercase o, circumflex accent\n 0x8f: 0xfb, // lowercase u, circumflex accent\n // THIS BLOCK INCLUDES THE 32 EXTENDED (TWO-BYTE) LINE 21 CHARACTERS\n // THAT COME FROM HI BYTE=0x12 AND LOW BETWEEN 0x20 AND 0x3F\n 0x90: 0xc1, // capital letter A with acute\n 0x91: 0xc9, // capital letter E with acute\n 0x92: 0xd3, // capital letter O with acute\n 0x93: 0xda, // capital letter U with acute\n 0x94: 0xdc, // capital letter U with diaresis\n 0x95: 0xfc, // lowercase letter U with diaeresis\n 0x96: 0x2018, // opening single quote\n 0x97: 0xa1, // inverted exclamation mark\n 0x98: 0x2a, // asterisk\n 0x99: 0x2019, // closing single quote\n 0x9a: 0x2501, // box drawings heavy horizontal\n 0x9b: 0xa9, // copyright sign\n 0x9c: 0x2120, // Service mark\n 0x9d: 0x2022, // (round) bullet\n 0x9e: 0x201c, // Left double quotation mark\n 0x9f: 0x201d, // Right double quotation mark\n 0xa0: 0xc0, // uppercase A, grave accent\n 0xa1: 0xc2, // uppercase A, circumflex\n 0xa2: 0xc7, // uppercase C with cedilla\n 0xa3: 0xc8, // uppercase E, grave accent\n 0xa4: 0xca, // uppercase E, circumflex\n 0xa5: 0xcb, // capital letter E with diaresis\n 0xa6: 0xeb, // lowercase letter e with diaresis\n 0xa7: 0xce, // uppercase I, circumflex\n 0xa8: 0xcf, // uppercase I, with diaresis\n 0xa9: 0xef, // lowercase i, with diaresis\n 0xaa: 0xd4, // uppercase O, circumflex\n 0xab: 0xd9, // uppercase U, grave accent\n 0xac: 0xf9, // lowercase u, grave accent\n 0xad: 0xdb, // uppercase U, circumflex\n 0xae: 0xab, // left-pointing double angle quotation mark\n 0xaf: 0xbb, // right-pointing double angle quotation mark\n // THIS BLOCK INCLUDES THE 32 EXTENDED (TWO-BYTE) LINE 21 CHARACTERS\n // THAT COME FROM HI BYTE=0x13 AND LOW BETWEEN 0x20 AND 0x3F\n 0xb0: 0xc3, // Uppercase A, tilde\n 0xb1: 0xe3, // Lowercase a, tilde\n 0xb2: 0xcd, // Uppercase I, acute accent\n 0xb3: 0xcc, // Uppercase I, grave accent\n 0xb4: 0xec, // Lowercase i, grave accent\n 0xb5: 0xd2, // Uppercase O, grave accent\n 0xb6: 0xf2, // Lowercase o, grave accent\n 0xb7: 0xd5, // Uppercase O, tilde\n 0xb8: 0xf5, // Lowercase o, tilde\n 0xb9: 0x7b, // Open curly brace\n 0xba: 0x7d, // Closing curly brace\n 0xbb: 0x5c, // Backslash\n 0xbc: 0x5e, // Caret\n 0xbd: 0x5f, // Underscore\n 0xbe: 0x7c, // Pipe (vertical line)\n 0xbf: 0x223c, // Tilde operator\n 0xc0: 0xc4, // Uppercase A, umlaut\n 0xc1: 0xe4, // Lowercase A, umlaut\n 0xc2: 0xd6, // Uppercase O, umlaut\n 0xc3: 0xf6, // Lowercase o, umlaut\n 0xc4: 0xdf, // Esszett (sharp S)\n 0xc5: 0xa5, // Yen symbol\n 0xc6: 0xa4, // Generic currency sign\n 0xc7: 0x2503, // Box drawings heavy vertical\n 0xc8: 0xc5, // Uppercase A, ring\n 0xc9: 0xe5, // Lowercase A, ring\n 0xca: 0xd8, // Uppercase O, stroke\n 0xcb: 0xf8, // Lowercase o, strok\n 0xcc: 0x250f, // Box drawings heavy down and right\n 0xcd: 0x2513, // Box drawings heavy down and left\n 0xce: 0x2517, // Box drawings heavy up and right\n 0xcf: 0x251b, // Box drawings heavy up and left\n};\n\n/**\n * Utils\n */\nconst getCharForByte = (byte: number) =>\n String.fromCharCode(specialCea608CharsCodes[byte] || byte);\n\nconst NR_ROWS = 15;\nconst NR_COLS = 100;\n// Tables to look up row from PAC data\nconst rowsLowCh1 = {\n 0x11: 1,\n 0x12: 3,\n 0x15: 5,\n 0x16: 7,\n 0x17: 9,\n 0x10: 11,\n 0x13: 12,\n 0x14: 14,\n};\nconst rowsHighCh1 = {\n 0x11: 2,\n 0x12: 4,\n 0x15: 6,\n 0x16: 8,\n 0x17: 10,\n 0x13: 13,\n 0x14: 15,\n};\nconst rowsLowCh2 = {\n 0x19: 1,\n 0x1a: 3,\n 0x1d: 5,\n 0x1e: 7,\n 0x1f: 9,\n 0x18: 11,\n 0x1b: 12,\n 0x1c: 14,\n};\nconst rowsHighCh2 = {\n 0x19: 2,\n 0x1a: 4,\n 0x1d: 6,\n 0x1e: 8,\n 0x1f: 10,\n 0x1b: 13,\n 0x1c: 15,\n};\n\nconst backgroundColors = [\n 'white',\n 'green',\n 'blue',\n 'cyan',\n 'red',\n 'yellow',\n 'magenta',\n 'black',\n 'transparent',\n];\n\nconst enum VerboseLevel {\n ERROR = 0,\n TEXT = 1,\n WARNING = 2,\n INFO = 2,\n DEBUG = 3,\n DATA = 3,\n}\n\nclass CaptionsLogger {\n public time: number | null = null;\n public verboseLevel: VerboseLevel = VerboseLevel.ERROR;\n\n log(severity: VerboseLevel, msg: string | (() => string)): void {\n if (this.verboseLevel >= severity) {\n const m: string = typeof msg === 'function' ? msg() : msg;\n logger.log(`${this.time} [${severity}] ${m}`);\n }\n }\n}\n\nconst numArrayToHexArray = function (numArray: number[]): string[] {\n const hexArray: string[] = [];\n for (let j = 0; j < numArray.length; j++) {\n hexArray.push(numArray[j].toString(16));\n }\n\n return hexArray;\n};\n\ntype PenStyles = {\n foreground: string | null;\n underline: boolean;\n italics: boolean;\n background: string;\n flash: boolean;\n};\n\nclass PenState {\n public foreground: string = 'white';\n public underline: boolean = false;\n public italics: boolean = false;\n public background: string = 'black';\n public flash: boolean = false;\n\n reset() {\n this.foreground = 'white';\n this.underline = false;\n this.italics = false;\n this.background = 'black';\n this.flash = false;\n }\n\n setStyles(styles: Partial<PenStyles>) {\n const attribs = [\n 'foreground',\n 'underline',\n 'italics',\n 'background',\n 'flash',\n ];\n for (let i = 0; i < attribs.length; i++) {\n const style = attribs[i];\n if (styles.hasOwnProperty(style)) {\n this[style] = styles[style];\n }\n }\n }\n\n isDefault() {\n return (\n this.foreground === 'white' &&\n !this.underline &&\n !this.italics &&\n this.background === 'black' &&\n !this.flash\n );\n }\n\n equals(other: PenState) {\n return (\n this.foreground === other.foreground &&\n this.underline === other.underline &&\n this.italics === other.italics &&\n this.background === other.background &&\n this.flash === other.flash\n );\n }\n\n copy(newPenState: PenState) {\n this.foreground = newPenState.foreground;\n this.underline = newPenState.underline;\n this.italics = newPenState.italics;\n this.background = newPenState.background;\n this.flash = newPenState.flash;\n }\n\n toString(): string {\n return (\n 'color=' +\n this.foreground +\n ', underline=' +\n this.underline +\n ', italics=' +\n this.italics +\n ', background=' +\n this.background +\n ', flash=' +\n this.flash\n );\n }\n}\n\n/**\n * Unicode character with styling and background.\n * @constructor\n */\nclass StyledUnicodeChar {\n uchar: string = ' ';\n penState: PenState = new PenState();\n\n reset() {\n this.uchar = ' ';\n this.penState.reset();\n }\n\n setChar(uchar: string, newPenState: PenState) {\n this.uchar = uchar;\n this.penState.copy(newPenState);\n }\n\n setPenState(newPenState: PenState) {\n this.penState.copy(newPenState);\n }\n\n equals(other: StyledUnicodeChar) {\n return this.uchar === other.uchar && this.penState.equals(other.penState);\n }\n\n copy(newChar: StyledUnicodeChar) {\n this.uchar = newChar.uchar;\n this.penState.copy(newChar.penState);\n }\n\n isEmpty(): boolean {\n return this.uchar === ' ' && this.penState.isDefault();\n }\n}\n\n/**\n * CEA-608 row consisting of NR_COLS instances of StyledUnicodeChar.\n * @constructor\n */\nexport class Row {\n public chars: StyledUnicodeChar[] = [];\n public pos: number = 0;\n public currPenState: PenState = new PenState();\n public cueStartTime: number | null = null;\n private logger: CaptionsLogger;\n\n constructor(logger: CaptionsLogger) {\n for (let i = 0; i < NR_COLS; i++) {\n this.chars.push(new StyledUnicodeChar());\n }\n this.logger = logger;\n }\n\n equals(other: Row) {\n for (let i = 0; i < NR_COLS; i++) {\n if (!this.chars[i].equals(other.chars[i])) {\n return false;\n }\n }\n return true;\n }\n\n copy(other: Row) {\n for (let i = 0; i < NR_COLS; i++) {\n this.chars[i].copy(other.chars[i]);\n }\n }\n\n isEmpty(): boolean {\n let empty = true;\n for (let i = 0; i < NR_COLS; i++) {\n if (!this.chars[i].isEmpty()) {\n empty = false;\n break;\n }\n }\n return empty;\n }\n\n /**\n * Set the cursor to a valid column.\n */\n setCursor(absPos: number) {\n if (this.pos !== absPos) {\n this.pos = absPos;\n }\n\n if (this.pos < 0) {\n this.logger.log(\n VerboseLevel.DEBUG,\n 'Negative cursor position ' + this.pos,\n );\n this.pos = 0;\n } else if (this.pos > NR_COLS) {\n this.logger.log(\n VerboseLevel.DEBUG,\n 'Too large cursor position ' + this.pos,\n );\n this.pos = NR_COLS;\n }\n }\n\n /**\n * Move the cursor relative to current position.\n */\n moveCursor(relPos: number) {\n const newPos = this.pos + relPos;\n if (relPos > 1) {\n for (let i = this.pos + 1; i < newPos + 1; i++) {\n this.chars[i].setPenState(this.currPenState);\n }\n }\n this.setCursor(newPos);\n }\n\n /**\n * Backspace, move one step back and clear character.\n */\n backSpace() {\n this.moveCursor(-1);\n this.chars[this.pos].setChar(' ', this.currPenState);\n }\n\n insertChar(byte: number) {\n if (byte >= 0x90) {\n // Extended char\n this.backSpace();\n }\n const char = getCharForByte(byte);\n if (this.pos >= NR_COLS) {\n this.logger.log(\n VerboseLevel.ERROR,\n () =>\n 'Cannot insert ' +\n byte.toString(16) +\n ' (' +\n char +\n ') at position ' +\n this.pos +\n '. Skipping it!',\n );\n return;\n }\n this.chars[this.pos].setChar(char, this.currPenState);\n this.moveCursor(1);\n }\n\n clearFromPos(startPos: number) {\n let i: number;\n for (i = startPos; i < NR_COLS; i++) {\n this.chars[i].reset();\n }\n }\n\n clear() {\n this.clearFromPos(0);\n this.pos = 0;\n this.currPenState.reset();\n }\n\n clearToEndOfRow() {\n this.clearFromPos(this.pos);\n }\n\n getTextString() {\n const chars: string[] = [];\n let empty = true;\n for (let i = 0; i < NR_COLS; i++) {\n const char = this.chars[i].uchar;\n if (char !== ' ') {\n empty = false;\n }\n\n chars.push(char);\n }\n if (empty) {\n return '';\n } else {\n return chars.join('');\n }\n }\n\n setPenStyles(styles: Partial<PenStyles>) {\n this.currPenState.setStyles(styles);\n const currChar = this.chars[this.pos];\n currChar.setPenState(this.currPenState);\n }\n}\n\n/**\n * Keep a CEA-608 screen of 32x15 styled characters\n * @constructor\n */\nexport class CaptionScreen {\n rows: Row[] = [];\n currRow: number = NR_ROWS - 1;\n nrRollUpRows: number | null = null;\n lastOutputScreen: CaptionScreen | null = null;\n logger: CaptionsLogger;\n\n constructor(logger: CaptionsLogger) {\n for (let i = 0; i < NR_ROWS; i++) {\n this.rows.push(new Row(logger));\n }\n this.logger = logger;\n }\n\n reset() {\n for (let i = 0; i < NR_ROWS; i++) {\n this.rows[i].clear();\n }\n this.currRow = NR_ROWS - 1;\n }\n\n equals(other: CaptionScreen): boolean {\n let equal = true;\n for (let i = 0; i < NR_ROWS; i++) {\n if (!this.rows[i].equals(other.rows[i])) {\n equal = false;\n break;\n }\n }\n return equal;\n }\n\n copy(other: CaptionScreen) {\n for (let i = 0; i < NR_ROWS; i++) {\n this.rows[i].copy(other.rows[i]);\n }\n }\n\n isEmpty(): boolean {\n let empty = true;\n for (let i = 0; i < NR_ROWS; i++) {\n if (!this.rows[i].isEmpty()) {\n empty = false;\n break;\n }\n }\n return empty;\n }\n\n backSpace() {\n const row = this.rows[this.currRow];\n row.backSpace();\n }\n\n clearToEndOfRow() {\n const row = this.rows[this.currRow];\n row.clearToEndOfRow();\n }\n\n /**\n * Insert a character (without styling) in the current row.\n */\n insertChar(char: number) {\n const row = this.rows[this.currRow];\n row.insertChar(char);\n }\n\n setPen(styles: Partial<PenStyles>) {\n const row = this.rows[this.currRow];\n row.setPenStyles(styles);\n }\n\n moveCursor(relPos: number) {\n const row = this.rows[this.currRow];\n row.moveCursor(relPos);\n }\n\n setCursor(absPos: number) {\n this.logger.log(VerboseLevel.INFO, 'setCursor: ' + absPos);\n const row = this.rows[this.currRow];\n row.setCursor(absPos);\n }\n\n setPAC(pacData: PACData) {\n this.logger.log(\n VerboseLevel.INFO,\n () => 'pacData = ' + JSON.stringify(pacData),\n );\n let newRow = pacData.row - 1;\n if (this.nrRollUpRows && newRow < this.nrRollUpRows - 1) {\n newRow = this.nrRollUpRows - 1;\n }\n\n // Make sure this only affects Roll-up Captions by checking this.nrRollUpRows\n if (this.nrRollUpRows && this.currRow !== newRow) {\n // clear all rows first\n for (let i = 0; i < NR_ROWS; i++) {\n this.rows[i].clear();\n }\n\n // Copy this.nrRollUpRows rows from lastOutputScreen and place it in the newRow location\n // topRowIndex - the start of rows to copy (inclusive index)\n const topRowIndex = this.currRow + 1 - this.nrRollUpRows;\n // We only copy if the last position was already shown.\n // We use the cueStartTime value to check this.\n const lastOutputScreen = this.lastOutputScreen;\n if (lastOutputScreen) {\n const prevLineTime = lastOutputScreen.rows[topRowIndex].cueStartTime;\n const time = this.logger.time;\n if (prevLineTime !== null && time !== null && prevLineTime < time) {\n for (let i = 0; i < this.nrRollUpRows; i++) {\n this.rows[newRow - this.nrRollUpRows + i + 1].copy(\n lastOutputScreen.rows[topRowIndex + i],\n );\n }\n }\n }\n }\n\n this.currRow = newRow;\n const row = this.rows[this.currRow];\n if (pacData.indent !== null) {\n const indent = pacData.indent;\n const prevPos = Math.max(indent - 1, 0);\n row.setCursor(pacData.indent);\n pacData.color = row.chars[prevPos].penState.foreground;\n }\n const styles: PenStyles = {\n foreground: pacData.color,\n underline: pacData.underline,\n italics: pacData.italics,\n background: 'black',\n flash: false,\n };\n this.setPen(styles);\n }\n\n /**\n * Set background/extra foreground, but first do back_space, and then insert space (backwards compatibility).\n */\n setBkgData(bkgData: Partial<PenStyles>) {\n this.logger.log(\n VerboseLevel.INFO,\n () => 'bkgData = ' + JSON.stringify(bkgData),\n );\n this.backSpace();\n this.setPen(bkgData);\n this.insertChar(0x20); // Space\n }\n\n setRollUpRows(nrRows: number | null) {\n this.nrRollUpRows = nrRows;\n }\n\n rollUp() {\n if (this.nrRollUpRows === null) {\n this.logger.log(\n VerboseLevel.DEBUG,\n 'roll_up but nrRollUpRows not set yet',\n );\n return; // Not properly setup\n }\n this.logger.log(VerboseLevel.TEXT, () => this.getDisplayText());\n const topRowIndex = this.currRow + 1 - this.nrRollUpRows;\n const topRow = this.rows.splice(topRowIndex, 1)[0];\n topRow.clear();\n this.rows.splice(this.currRow, 0, topRow);\n this.logger.log(VerboseLevel.INFO, 'Rolling up');\n // this.logger.log(VerboseLevel.TEXT, this.get_display_text())\n }\n\n /**\n * Get all non-empty rows with as unicode text.\n */\n getDisplayText(asOneRow?: boolean) {\n asOneRow = asOneRow || false;\n const displayText: string[] = [];\n let text = '';\n let rowNr = -1;\n for (let i = 0; i < NR_ROWS; i++) {\n const rowText = this.rows[i].getTextString();\n if (rowText) {\n rowNr = i + 1;\n if (asOneRow) {\n displayText.push('Row ' + rowNr + \": '\" + rowText + \"'\");\n } else {\n displayText.push(rowText.trim());\n }\n }\n }\n if (displayText.length > 0) {\n if (asOneRow) {\n text = '[' + displayText.join(' | ') + ']';\n } else {\n text = displayText.join('\\n');\n }\n }\n return text;\n }\n\n getTextAndFormat() {\n return this.rows;\n }\n}\n\n// var modes = ['MODE_ROLL-UP', 'MODE_POP-ON', 'MODE_PAINT-ON', 'MODE_TEXT'];\n\ntype CaptionModes =\n | 'MODE_ROLL-UP'\n | 'MODE_POP-ON'\n | 'MODE_PAINT-ON'\n | 'MODE_TEXT'\n | null;\n\nclass Cea608Channel {\n chNr: number;\n outputFilter: OutputFilter;\n mode: CaptionModes;\n verbose: number;\n displayedMemory: CaptionScreen;\n nonDisplayedMemory: CaptionScreen;\n lastOutputScreen: CaptionScreen;\n currRollUpRow: Row;\n writeScreen: CaptionScreen;\n cueStartTime: number | null;\n logger: CaptionsLogger;\n\n constructor(\n channelNumber: number,\n outputFilter: OutputFilter,\n logger: CaptionsLogger,\n ) {\n this.chNr = channelNumber;\n this.outputFilter = outputFilter;\n this.mode = null;\n this.verbose = 0;\n this.displayedMemory = new CaptionScreen(logger);\n this.nonDisplayedMemory = new CaptionScreen(logger);\n this.lastOutputScreen = new CaptionScreen(logger);\n this.currRollUpRow = this.displayedMemory.rows[NR_ROWS - 1];\n this.writeScreen = this.displayedMemory;\n this.mode = null;\n this.cueStartTime = null; // Keeps track of where a cue started.\n this.logger = logger;\n }\n\n reset() {\n this.mode = null;\n this.displayedMemory.reset();\n this.nonDisplayedMemory.reset();\n this.lastOutputScreen.reset();\n this.outputFilter.reset();\n this.currRollUpRow = this.displayedMemory.rows[NR_ROWS - 1];\n this.writeScreen = this.displayedMemory;\n this.mode = null;\n this.cueStartTime = null;\n }\n\n getHandler(): OutputFilter {\n return this.outputFilter;\n }\n\n setHandler(newHandler: OutputFilter) {\n this.outputFilter = newHandler;\n }\n\n setPAC(pacData: PACData) {\n this.writeScreen.setPAC(pacData);\n }\n\n setBkgData(bkgData: Partial<PenStyles>) {\n this.writeScreen.setBkgData(bkgData);\n }\n\n setMode(newMode: CaptionModes) {\n if (newMode === this.mode) {\n return;\n }\n\n this.mode = newMode;\n this.logger.log(VerboseLevel.INFO, () => 'MODE=' + newMode);\n if (this.mode === 'MODE_POP-ON') {\n this.writeScreen = this.nonDisplayedMemory;\n } else {\n this.writeScreen = this.displayedMemory;\n this.writeScreen.reset();\n }\n if (this.mode !== 'MODE_ROLL-UP') {\n this.displayedMemory.nrRollUpRows = null;\n this.nonDisplayedMemory.nrRollUpRows = null;\n }\n this.mode = newMode;\n }\n\n insertChars(chars: number[]) {\n for (let i = 0; i < chars.length; i++) {\n this.writeScreen.insertChar(chars[i]);\n }\n\n const screen =\n this.writeScreen === this.displayedMemory ? 'DISP' : 'NON_DISP';\n this.logger.log(\n VerboseLevel.INFO,\n () => screen + ': ' + this.writeScreen.getDisplayText(true),\n );\n if (this.mode === 'MODE_PAINT-ON' || this.mode === 'MODE_ROLL-UP') {\n this.logger.log(\n VerboseLevel.TEXT,\n () => 'DISPLAYED: ' + this.displayedMemory.getDisplayText(true),\n );\n this.outputDataUpdate();\n }\n }\n\n ccRCL() {\n // Resume Caption Loading (switch mode to Pop On)\n this.logger.log(VerboseLevel.INFO, 'RCL - Resume Caption Loading');\n this.setMode('MODE_POP-ON');\n }\n\n ccBS() {\n // BackSpace\n this.logger.log(VerboseLevel.INFO, 'BS - BackSpace');\n if (this.mode === 'MODE_TEXT') {\n return;\n }\n\n this.writeScreen.backSpace();\n if (this.writeScreen === this.displayedMemory) {\n this.outputDataUpdate();\n }\n }\n\n ccAOF() {\n // Reserved (formerly Alarm Off)\n }\n\n ccAON() {\n // Reserved (formerly Alarm On)\n }\n\n ccDER() {\n // Delete to End of Row\n this.logger.log(VerboseLevel.INFO, 'DER- Delete to End of Row');\n this.writeScreen.clearToEndOfRow();\n this.outputDataUpdate();\n }\n\n ccRU(nrRows: number | null) {\n // Roll-Up Captions-2,3,or 4 Rows\n this.logger.log(VerboseLevel.INFO, 'RU(' + nrRows + ') - Roll Up');\n this.writeScreen = this.displayedMemory;\n this.setMode('MODE_ROLL-UP');\n this.writeScreen.setRollUpRows(nrRows);\n }\n\n ccFON() {\n // Flash On\n this.logger.log(VerboseLevel.INFO, 'FON - Flash On');\n this.writeScreen.setPen({ flash: true });\n }\n\n ccRDC() {\n // Resume Direct Captioning (switch mode to PaintOn)\n this.logger.log(VerboseLevel.INFO, 'RDC - Resume Direct Captioning');\n this.setMode('MODE_PAINT-ON');\n }\n\n ccTR() {\n // Text Restart in text mode (not supported, however)\n this.logger.log(VerboseLevel.INFO, 'TR');\n this.setMode('MODE_TEXT');\n }\n\n ccRTD() {\n // Resume Text Display in Text mode (not supported, however)\n this.logger.log(VerboseLevel.INFO, 'RTD');\n this.setMode('MODE_TEXT');\n }\n\n ccEDM() {\n // Erase Displayed Memory\n this.logger.log(VerboseLevel.INFO, 'EDM - Erase Displayed Memory');\n this.displayedMemory.reset();\n this.outputDataUpdate(true);\n }\n\n ccCR() {\n // Carriage Return\n this.logger.log(VerboseLevel.INFO, 'CR - Carriage Return');\n this.writeScreen.rollUp();\n this.outputDataUpdate(true);\n }\n\n ccENM() {\n // Erase Non-Displayed Memory\n this.logger.log(VerboseLevel.INFO, 'ENM - Erase Non-displayed Memory');\n this.nonDisplayedMemory.reset();\n }\n\n ccEOC() {\n // End of Caption (Flip Memories)\n this.logger.log(VerboseLevel.INFO, 'EOC - End Of Caption');\n if (this.mode === 'MODE_POP-ON') {\n const tmp = this.displayedMemory;\n this.displayedMemory = this.nonDisplayedMemory;\n this.nonDisplayedMemory = tmp;\n this.writeScreen = this.nonDisplayedMemory;\n this.logger.log(\n VerboseLevel.TEXT,\n () => 'DISP: ' + this.displayedMemory.getDisplayText(),\n );\n }\n this.outputDataUpdate(true);\n }\n\n ccTO(nrCols: number) {\n // Tab Offset 1,2, or 3 columns\n this.logger.log(VerboseLevel.INFO, 'TO(' + nrCols + ') - Tab Offset');\n this.writeScreen.moveCursor(nrCols);\n }\n\n ccMIDROW(secondByte: number) {\n // Parse MIDROW command\n const styles: Partial<PenStyles> = { flash: false };\n styles.underline = secondByte % 2 === 1;\n styles.italics = secondByte >= 0x2e;\n if (!styles.italics) {\n const colorIndex = Math.floor(secondByte / 2) - 0x10;\n const colors = [\n 'white',\n 'green',\n 'blue',\n 'cyan',\n 'red',\n 'yellow',\n 'magenta',\n ];\n styles.foreground = colors[colorIndex];\n } else {\n styles.foreground = 'white';\n }\n this.logger.log(VerboseLevel.INFO, 'MIDROW: ' + JSON.stringify(styles));\n this.writeScreen.setPen(styles);\n }\n\n outputDataUpdate(dispatch: boolean = false) {\n const time = this.logger.time;\n if (time === null) {\n return;\n }\n\n if (this.outputFilter) {\n if (this.cueStartTime === null && !this.displayedMemory.isEmpty()) {\n // Start of a new cue\n this.cueStartTime = time;\n } else {\n if (!this.displayedMemory.equals(this.lastOutputScreen)) {\n this.outputFilter.newCue(\n this.cueStartTime!,\n time,\n this.lastOutputScreen,\n );\n if (dispatch && this.outputFilter.dispatchCue) {\n this.outputFilter.dispatchCue();\n }\n\n this.cueStartTime = this.displayedMemory.isEmpty() ? null : time;\n }\n }\n this.lastOutputScreen.copy(this.displayedMemory);\n }\n }\n\n cueSplitAtTime(t: number) {\n if (this.outputFilter) {\n if (!this.displayedMemory.isEmpty()) {\n if (this.outputFilter.newCue) {\n this.outputFilter.newCue(this.cueStartTime!, t, this.displayedMemory);\n }\n\n this.cueStartTime = t;\n }\n }\n }\n}\n\ninterface PACData {\n row: number;\n indent: number | null;\n color: string | null;\n underline: boolean;\n italics: boolean;\n}\n\ntype SupportedField = 1 | 3;\n\ntype Channels = 0 | 1 | 2; // Will be 1 or 2 when parsing captions\n\ntype CmdHistory = {\n a: number | null;\n b: number | null;\n};\n\nclass Cea608Parser {\n channels: Array<Cea608Channel | null>;\n currentChannel: Channels = 0;\n cmdHistory: CmdHistory = createCmdHistory();\n logger: CaptionsLogger;\n\n constructor(field: SupportedField, out1: OutputFilter, out2: OutputFilter) {\n const logger = (this.logger = new CaptionsLogger());\n this.channels = [\n null,\n new Cea608Channel(field, out1, logger),\n new Cea608Channel(field + 1, out2, logger),\n ];\n }\n\n getHandler(channel: number) {\n return (this.channels[channel] as Cea608Channel).getHandler();\n }\n\n setHandler(channel: number, newHandler: OutputFilter) {\n (this.channels[channel] as Cea608Channel).setHandler(newHandler);\n }\n\n /**\n * Add data for time t in forms of list of bytes (unsigned ints). The bytes are treated as pairs.\n */\n addData(time: number | null, byteList: number[]) {\n this.logger.time = time;\n for (let i = 0; i < byteList.length; i += 2) {\n const a = byteList[i] & 0x7f;\n const b = byteList[i + 1] & 0x7f;\n let cmdFound: boolean = false;\n let charsFound: number[] | null = null;\n\n if (a === 0 && b === 0) {\n continue;\n } else {\n this.logger.log(\n VerboseLevel.DATA,\n () =>\n '[' +\n numArrayToHexArray([byteList[i], byteList[i + 1]]) +\n '] -> (' +\n numArrayToHexArray([a, b]) +\n ')',\n );\n }\n\n const cmdHistory = this.cmdHistory;\n const isControlCode = a >= 0x10 && a <= 0x1f;\n if (isControlCode) {\n // Skip redundant control codes\n if (hasCmdRepeated(a, b, cmdHistory)) {\n setLastCmd(null, null, cmdHistory);\n this.logger.log(\n VerboseLevel.DEBUG,\n () =>\n 'Repeated command (' +\n numArrayToHexArray([a, b]) +\n ') is dropped',\n );\n continue;\n }\n setLastCmd(a, b, this.cmdHistory);\n\n cmdFound = this.parseCmd(a, b);\n\n if (!cmdFound) {\n cmdFound = this.parseMidrow(a, b);\n }\n\n if (!cmdFound) {\n cmdFound = this.parsePAC(a, b);\n }\n\n if (!cmdFound) {\n cmdFound = this.parseBackgroundAttributes(a, b);\n }\n } else {\n setLastCmd(null, null, cmdHistory);\n }\n if (!cmdFound) {\n charsFound = this.parseChars(a, b);\n if (charsFound) {\n const currChNr = this.currentChannel;\n if (currChNr && currChNr > 0) {\n const channel = this.channels[currChNr] as Cea608Channel;\n channel.insertChars(charsFound);\n } else {\n this.logger.log(\n VerboseLevel.WARNING,\n 'No channel found yet. TEXT-MODE?',\n );\n }\n }\n }\n if (!cmdFound && !charsFound) {\n this.logger.log(\n VerboseLevel.WARNING,\n () =>\n \"Couldn't parse cleaned data \" +\n numArrayToHexArray([a, b]) +\n ' orig: ' +\n numArrayToHexArray([byteList[i], byteList[i + 1]]),\n );\n }\n }\n }\n\n /**\n * Parse Command.\n * @returns True if a command was found\n */\n parseCmd(a: number, b: number): boolean {\n const cond1 =\n (a === 0x14 || a === 0x1c || a === 0x15 || a === 0x1d) &&\n b >= 0x20 &&\n b <= 0x2f;\n const cond2 = (a === 0x17 || a === 0x1f) && b >= 0x21 && b <= 0x23;\n if (!(cond1 || cond2)) {\n return false;\n }\n\n const chNr = a === 0x14 || a === 0x15 || a === 0x17 ? 1 : 2;\n const channel = this.channels[chNr] as Cea608Channel;\n\n if (a === 0x14 || a === 0x15 || a === 0x1c || a === 0x1d) {\n if (b === 0x20) {\n channel.ccRCL();\n } else if (b === 0x21) {\n channel.ccBS();\n } else if (b === 0x22) {\n channel.ccAOF();\n } else if (b === 0x23) {\n channel.ccAON();\n } else if (b === 0x24) {\n channel.ccDER();\n } else if (b === 0x25) {\n channel.ccRU(2);\n } else if (b === 0x26) {\n channel.ccRU(3);\n } else if (b === 0x27) {\n channel.ccRU(4);\n } else if (b === 0x28) {\n channel.ccFON();\n } else if (b === 0x29) {\n channel.ccRDC();\n } else if (b === 0x2a) {\n channel.ccTR();\n } else if (b === 0x2b) {\n channel.ccRTD();\n } else if (b === 0x2c) {\n channel.ccEDM();\n } else if (b === 0x2d) {\n channel.ccCR();\n } else if (b === 0x2e) {\n channel.ccENM();\n } else if (b === 0x2f) {\n channel.ccEOC();\n }\n } else {\n // a == 0x17 || a == 0x1F\n channel.ccTO(b - 0x20);\n }\n this.currentChannel = chNr;\n return true;\n }\n\n /**\n * Parse midrow styling command\n */\n parseMidrow(a: number, b: number): boolean {\n let chNr: number = 0;\n\n if ((a === 0x11 || a === 0x19) && b >= 0x20 && b <= 0x2f) {\n if (a === 0x11) {\n chNr = 1;\n } else {\n chNr = 2;\n }\n\n if (chNr !== this.currentChannel) {\n this.logger.log(\n VerboseLevel.ERROR,\n 'Mismatch channel in midrow parsing',\n );\n return false;\n }\n const channel = this.channels[chNr];\n if (!channel) {\n return false;\n }\n channel.ccMIDROW(b);\n this.logger.log(\n VerboseLevel.DEBUG,\n () => 'MIDROW (' + numArrayToHexArray([a, b]) + ')',\n );\n return true;\n }\n return false;\n }\n\n /**\n * Parse Preable Access Codes (Table 53).\n * @returns {Boolean} Tells if PAC found\n */\n parsePAC(a: number, b: number): boolean {\n let row: number;\n\n const case1 =\n ((a >= 0x11 && a <= 0x17) || (a >= 0x19 && a <= 0x1f)) &&\n b >= 0x40 &&\n b <= 0x7f;\n const case2 = (a === 0x10 || a === 0x18) && b >= 0x40 && b <= 0x5f;\n if (!(case1 || case2)) {\n return false;\n }\n\n const chNr: Channels = a <= 0x17 ? 1 : 2;\n\n if (b >= 0x40 && b <= 0x5f) {\n row = chNr === 1 ? rowsLowCh1[a] : rowsLowCh2[a];\n } else {\n // 0x60 <= b <= 0x7F\n row = chNr === 1 ? rowsHighCh1[a] : rowsHighCh2[a];\n }\n const channel = this.channels[chNr];\n if (!channel) {\n return false;\n }\n channel.setPAC(this.interpretPAC(row, b));\n this.currentChannel = chNr;\n return true;\n }\n\n /**\n * Interpret the second byte of the pac, and return the information.\n * @returns pacData with style parameters\n */\n interpretPAC(row: number, byte: number): PACData {\n let pacIndex;\n const pacData: PACData = {\n color: null,\n italics: false,\n indent: null,\n underline: false,\n row: row,\n };\n\n if (byte > 0x5f) {\n pacIndex = byte - 0x60;\n } else {\n pacIndex = byte - 0x40;\n }\n\n pacData.underline = (pacIndex & 1) === 1;\n if (pacIndex <= 0xd) {\n pacData.color = [\n 'white',\n 'green',\n 'blue',\n 'cyan',\n 'red',\n 'yellow',\n 'magenta',\n 'white',\n ][Math.floor(pacIndex / 2)];\n } else if (pacIndex <= 0xf) {\n pacData.italics = true;\n pacData.color = 'white';\n } else {\n pacData.indent = Math.floor((pacIndex - 0x10) / 2) * 4;\n }\n return pacData; // Note that row has zero offset. The spec uses 1.\n }\n\n /**\n * Parse characters.\n * @returns An array with 1 to 2 codes corresponding to chars, if found. null otherwise.\n */\n parseChars(a: number, b: number): number[] | null {\n let channelNr: Channels;\n let charCodes: number[] | null = null;\n let charCode1: number | null = null;\n\n if (a >= 0x19) {\n channelNr = 2;\n charCode1 = a - 8;\n } else {\n channelNr = 1;\n charCode1 = a;\n }\n if (charCode1 >= 0x11 && charCode1 <= 0x13) {\n // Special character\n let oneCode;\n if (charCode1 === 0x11) {\n oneCode = b + 0x50;\n } else if (charCode1 === 0x12) {\n oneCode = b + 0x70;\n } else {\n oneCode = b + 0x90;\n }\n\n this.logger.log(\n VerboseLevel.INFO,\n () =>\n \"Special char '\" +\n getCharForByte(oneCode) +\n \"' in channel \" +\n channelNr,\n );\n charCodes = [oneCode];\n } else if (a >= 0x20 && a <= 0x7f) {\n charCodes = b === 0 ? [a] : [a, b];\n }\n if (charCodes) {\n this.logger.log(\n VerboseLevel.DEBUG,\n () =>\n 'Char codes = ' +\n numArrayToHexArray(charCodes as number[]).join(','),\n );\n }\n return charCodes;\n }\n\n /**\n * Parse extended background attributes as well as new foreground color black.\n * @returns True if background attributes are found\n */\n parseBackgroundAttributes(a: number, b: number): boolean {\n const case1 = (a === 0x10 || a === 0x18) && b >= 0x20 && b <= 0x2f;\n const case2 = (a === 0x17 || a === 0x1f) && b >= 0x2d && b <= 0x2f;\n if (!(case1 || case2)) {\n return false;\n }\n let index: number;\n const bkgData: Partial<PenStyles> = {};\n if (a === 0x10 || a === 0x18) {\n index = Math.floor((b - 0x20) / 2);\n bkgData.background = backgroundColors[index];\n if (b % 2 === 1) {\n bkgData.background = bkgData.background + '_semi';\n }\n } else if (b === 0x2d) {\n bkgData.background = 'transparent';\n } else {\n bkgData.foreground = 'black';\n if (b === 0x2f) {\n bkgData.underline = true;\n }\n }\n const chNr: Channels = a <= 0x17 ? 1 : 2;\n const channel: Cea608Channel = this.channels[chNr] as Cea608Channel;\n channel.setBkgData(bkgData);\n return true;\n }\n\n /**\n * Reset state of parser and its channels.\n */\n reset() {\n for (let i = 0; i < Object.keys(this.channels).length; i++) {\n const channel = this.channels[i];\n if (channel) {\n channel.reset();\n }\n }\n setLastCmd(null, null, this.cmdHistory);\n }\n\n /**\n * Trigger the generation of a cue, and the start of a new one if displayScreens are not empty.\n */\n cueSplitAtTime(t: number) {\n for (let i = 0; i < this.channels.length; i++) {\n const channel = this.channels[i];\n if (channel) {\n channel.cueSplitAtTime(t);\n }\n }\n }\n}\n\nfunction setLastCmd(\n a: number | null,\n b: number | null,\n cmdHistory: CmdHistory,\n) {\n cmdHistory.a = a;\n cmdHistory.b = b;\n}\n\nfunction hasCmdRepeated(a: number, b: number, cmdHistory: CmdHistory) {\n return cmdHistory.a === a && cmdHistory.b === b;\n}\n\nfunction createCmdHistory(): CmdHistory {\n return {\n a: null,\n b: null,\n };\n}\n\nexport default Cea608Parser;\n","import type { TimelineController } from '../controller/timeline-controller';\nimport type { CaptionScreen } from './cea-608-parser';\n\nexport default class OutputFilter {\n private timelineController: TimelineController;\n private cueRanges: Array<[number, number]> = [];\n private trackName: string;\n private startTime: number | null = null;\n private endTime: number | null = null;\n private screen: CaptionScreen | null = null;\n\n constructor(timelineController: TimelineController, trackName: string) {\n this.timelineController = timelineController;\n this.trackName = trackName;\n }\n\n dispatchCue() {\n if (this.startTime === null) {\n return;\n }\n\n this.timelineController.addCues(\n this.trackName,\n this.startTime,\n this.endTime as number,\n this.screen as CaptionScreen,\n this.cueRanges,\n );\n this.startTime = null;\n }\n\n newCue(startTime: number, endTime: number, screen: CaptionScreen) {\n if (this.startTime === null || this.startTime > startTime) {\n this.startTime = startTime;\n }\n\n this.endTime = endTime;\n this.screen = screen;\n this.timelineController.createCaptionsTrack(this.trackName);\n }\n\n reset() {\n this.cueRanges = [];\n this.startTime = null;\n }\n}\n","/**\n * Copyright 2013 vtt.js Contributors\n *\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { optionalSelf } from './global';\n\ndeclare interface VTTCuePolyfill extends VTTCue {\n new (...args): VTTCuePolyfill;\n hasBeenReset: boolean;\n displayState: void;\n}\n\nexport default (function () {\n if (optionalSelf?.VTTCue) {\n return self.VTTCue;\n }\n\n const AllowedDirections = ['', 'lr', 'rl'] as const;\n type Direction = (typeof AllowedDirections)[number];\n\n const AllowedAlignments = [\n 'start',\n 'middle',\n 'end',\n 'left',\n 'right',\n ] as const;\n type Alignment = (typeof AllowedAlignments)[number];\n\n function isAllowedValue<T, A>(allowed: T, value: string): A | false {\n if (typeof value !== 'string') {\n return false;\n }\n // necessary for assuring the generic conforms to the Array interface\n if (!Array.isArray(allowed)) {\n return false;\n }\n // reset the type so that the next narrowing works well\n const lcValue = value.toLowerCase() as any;\n // use the allow list to narrow the type to a specific subset of strings\n if (~allowed.indexOf(lcValue)) {\n return lcValue;\n }\n\n return false;\n }\n\n function findDirectionSetting(value: string) {\n return isAllowedValue<typeof AllowedDirections, Direction>(\n AllowedDirections,\n value,\n );\n }\n\n function findAlignSetting(value: string) {\n return isAllowedValue<typeof AllowedAlignments, Alignment>(\n AllowedAlignments,\n value,\n );\n }\n\n function extend(obj: Record<string, any>, ...rest: Record<string, any>[]) {\n let i = 1;\n for (; i < arguments.length; i++) {\n const cobj = arguments[i];\n for (const p in cobj) {\n obj[p] = cobj[p];\n }\n }\n\n return obj;\n }\n\n function VTTCue(startTime: number, endTime: number, text: string) {\n const cue = this as VTTCuePolyfill;\n const baseObj = { enumerable: true };\n /**\n * Shim implementation specific properties. These properties are not in\n * the spec.\n */\n\n // Lets us know when the VTTCue's data has changed in such a way that we need\n // to recompute its display state. This lets us compute its display state\n // lazily.\n cue.hasBeenReset = false;\n\n /**\n * VTTCue and TextTrackCue properties\n * http://dev.w3.org/html5/webvtt/#vttcue-interface\n */\n\n let _id = '';\n let _pauseOnExit = false;\n let _startTime = startTime;\n let _endTime = endTime;\n let _text = text;\n let _region = null;\n let _vertical: Direction = '';\n let _snapToLines = true;\n let _line: number | 'auto' = 'auto';\n let _lineAlign: Alignment = 'start';\n let _position = 50;\n let _positionAlign: Alignment = 'middle';\n let _size = 50;\n let _align: Alignment = 'middle';\n\n Object.defineProperty(\n cue,\n 'id',\n extend({}, baseObj, {\n get: function () {\n return _id;\n },\n set: function (value: string) {\n _id = '' + value;\n },\n }),\n );\n\n Object.defineProperty(\n cue,\n 'pauseOnExit',\n extend({}, baseObj, {\n get: function () {\n return _pauseOnExit;\n },\n set: function (value: boolean) {\n _pauseOnExit = !!value;\n },\n }),\n );\n\n Object.defineProperty(\n cue,\n 'startTime',\n extend({}, baseObj, {\n get: function () {\n return _startTime;\n },\n set: function (value: number) {\n if (typeof value !== 'number') {\n throw new TypeError('Start time must be set to a number.');\n }\n\n _startTime = value;\n this.hasBeenReset = true;\n },\n }),\n );\n\n Object.defineProperty(\n cue,\n 'endTime',\n extend({}, baseObj, {\n get: function () {\n return _endTime;\n },\n set: function (value: number) {\n if (typeof value !== 'number') {\n throw new TypeError('End time must be set to a number.');\n }\n\n _endTime = value;\n this.hasBeenReset = true;\n },\n }),\n );\n\n Object.defineProperty(\n cue,\n 'text',\n extend({}, baseObj, {\n get: function () {\n return _text;\n },\n set: function (value: string) {\n _text = '' + value;\n this.hasBeenReset = true;\n },\n }),\n );\n\n // todo: implement VTTRegion polyfill?\n Object.defineProperty(\n cue,\n 'region',\n extend({}, baseObj, {\n get: function () {\n return _region;\n },\n set: function (value: any) {\n _region = value;\n this.hasBeenReset = true;\n },\n }),\n );\n\n Object.defineProperty(\n cue,\n 'vertical',\n extend({}, baseObj, {\n get: function () {\n return _vertical;\n },\n set: function (value: string) {\n const setting = findDirectionSetting(value);\n // Have to check for false because the setting an be an empty string.\n if (setting === false) {\n throw new SyntaxError(\n 'An invalid or illegal string was specified.',\n );\n }\n\n _vertical = setting;\n this.hasBeenReset = true;\n },\n }),\n );\n\n Object.defineProperty(\n cue,\n 'snapToLines',\n extend({}, baseObj, {\n get: function () {\n return _snapToLines;\n },\n set: function (value: boolean) {\n _snapToLines = !!value;\n this.hasBeenReset = true;\n },\n }),\n );\n\n Object.defineProperty(\n cue,\n 'line',\n extend({}, baseObj, {\n get: function () {\n return _line;\n },\n set: function (value: number | 'auto') {\n if (typeof value !== 'number' && value !== 'auto') {\n throw new SyntaxError(\n 'An invalid number or illegal string was specified.',\n );\n }\n\n _line = value;\n this.hasBeenReset = true;\n },\n }),\n );\n\n Object.defineProperty(\n cue,\n 'lineAlign',\n extend({}, baseObj, {\n get: function () {\n return _lineAlign;\n },\n set: function (value: string) {\n const setting = findAlignSetting(value);\n if (!setting) {\n throw new SyntaxError(\n 'An invalid or illegal string was specified.',\n );\n }\n\n _lineAlign = setting;\n this.hasBeenReset = true;\n },\n }),\n );\n\n Object.defineProperty(\n cue,\n 'position',\n extend({}, baseObj, {\n get: function () {\n return _position;\n },\n set: function (value: number) {\n if (value < 0 || value > 100) {\n throw new Error('Position must be between 0 and 100.');\n }\n\n _position = value;\n this.hasBeenReset = true;\n },\n }),\n );\n\n Object.defineProperty(\n cue,\n 'positionAlign',\n extend({}, baseObj, {\n get: function () {\n return _positionAlign;\n },\n set: function (value: string) {\n const setting = findAlignSetting(value);\n if (!setting) {\n throw new SyntaxError(\n 'An invalid or illegal string was specified.',\n );\n }\n\n _positionAlign = setting;\n this.hasBeenReset = true;\n },\n }),\n );\n\n Object.defineProperty(\n cue,\n 'size',\n extend({}, baseObj, {\n get: function () {\n return _size;\n },\n set: function (value: number) {\n if (value < 0 || value > 100) {\n throw new Error('Size must be between 0 and 100.');\n }\n\n _size = value;\n this.hasBeenReset = true;\n },\n }),\n );\n\n Object.defineProperty(\n cue,\n 'align',\n extend({}, baseObj, {\n get: function () {\n return _align;\n },\n set: function (value: string) {\n const setting = findAlignSetting(value);\n if (!setting) {\n throw new SyntaxError(\n 'An invalid or illegal string was specified.',\n );\n }\n\n _align = setting;\n this.hasBeenReset = true;\n },\n }),\n );\n\n /**\n * Other <track> spec defined properties\n */\n\n // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#text-track-cue-display-state\n cue.displayState = undefined;\n }\n\n /**\n * VTTCue methods\n */\n\n VTTCue.prototype.getCueAsHTML = function () {\n // Assume WebVTT.convertCueToDOMTree is on the global.\n const WebVTT = (self as any).WebVTT;\n return WebVTT.convertCueToDOMTree(self, this.text);\n };\n // this is a polyfill hack\n return VTTCue as any as VTTCuePolyfill;\n})();\n","/*\n * Source: https://github.com/mozilla/vtt.js/blob/master/dist/vtt.js\n */\n\nimport VTTCue from './vttcue';\n\nclass StringDecoder {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n decode(data: string | any, options?: Object): string | never {\n if (!data) {\n return '';\n }\n\n if (typeof data !== 'string') {\n throw new Error('Error - expected string data.');\n }\n\n return decodeURIComponent(encodeURIComponent(data));\n }\n}\n\n// Try to parse input as a time stamp.\nexport function parseTimeStamp(input: string) {\n function computeSeconds(h, m, s, f) {\n return (h | 0) * 3600 + (m | 0) * 60 + (s | 0) + parseFloat(f || 0);\n }\n\n const m = input.match(/^(?:(\\d+):)?(\\d{2}):(\\d{2})(\\.\\d+)?/);\n if (!m) {\n return null;\n }\n\n if (parseFloat(m[2]) > 59) {\n // Timestamp takes the form of [hours]:[minutes].[milliseconds]\n // First position is hours as it's over 59.\n return computeSeconds(m[2], m[3], 0, m[4]);\n }\n // Timestamp takes the form of [hours (optional)]:[minutes]:[seconds].[milliseconds]\n return computeSeconds(m[1], m[2], m[3], m[4]);\n}\n\n// A settings object holds key/value pairs and will ignore anything but the first\n// assignment to a specific key.\nclass Settings {\n private readonly values: { [key: string]: any } = Object.create(null);\n\n // Only accept the first assignment to any key.\n set(k: string, v: any) {\n if (!this.get(k) && v !== '') {\n this.values[k] = v;\n }\n }\n // Return the value for a key, or a default value.\n // If 'defaultKey' is passed then 'dflt' is assumed to be an object with\n // a number of possible default values as properties where 'defaultKey' is\n // the key of the property that will be chosen; otherwise it's assumed to be\n // a single value.\n get(k: string, dflt?: any, defaultKey?: string): any {\n if (defaultKey) {\n return this.has(k) ? this.values[k] : dflt[defaultKey];\n }\n\n return this.has(k) ? this.values[k] : dflt;\n }\n // Check whether we have a value for a key.\n has(k: string): boolean {\n return k in this.values;\n }\n // Accept a setting if its one of the given alternatives.\n alt(k: string, v: any, a: any[]) {\n for (let n = 0; n < a.length; ++n) {\n if (v === a[n]) {\n this.set(k, v);\n break;\n }\n }\n }\n // Accept a setting if its a valid (signed) integer.\n integer(k: string, v: any) {\n if (/^-?\\d+$/.test(v)) {\n // integer\n this.set(k, parseInt(v, 10));\n }\n }\n // Accept a setting if its a valid percentage.\n percent(k: string, v: any): boolean {\n if (/^([\\d]{1,3})(\\.[\\d]*)?%$/.test(v)) {\n const percent = parseFloat(v);\n if (percent >= 0 && percent <= 100) {\n this.set(k, percent);\n return true;\n }\n }\n return false;\n }\n}\n\n// Helper function to parse input into groups separated by 'groupDelim', and\n// interpret each group as a key/value pair separated by 'keyValueDelim'.\nfunction parseOptions(\n input: string,\n callback: (k: string, v: any) => void,\n keyValueDelim: RegExp,\n groupDelim?: RegExp,\n) {\n const groups = groupDelim ? input.split(groupDelim) : [input];\n for (const i in groups) {\n if (typeof groups[i] !== 'string') {\n continue;\n }\n\n const kv = groups[i].split(keyValueDelim);\n if (kv.length !== 2) {\n continue;\n }\n\n const k = kv[0];\n const v = kv[1];\n callback(k, v);\n }\n}\n\nconst defaults = new VTTCue(0, 0, '');\n// 'middle' was changed to 'center' in the spec: https://github.com/w3c/webvtt/pull/244\n// Safari doesn't yet support this change, but FF and Chrome do.\nconst center = (defaults.align as string) === 'middle' ? 'middle' : 'center';\n\nfunction parseCue(input: string, cue: VTTCue, regionList: Region[]) {\n // Remember the original input if we need to throw an error.\n const oInput = input;\n // 4.1 WebVTT timestamp\n function consumeTimeStamp(): number | never {\n const ts = parseTimeStamp(input);\n if (ts === null) {\n throw new Error('Malformed timestamp: ' + oInput);\n }\n\n // Remove time stamp from input.\n input = input.replace(/^[^\\sa-zA-Z-]+/, '');\n return ts;\n }\n\n // 4.4.2 WebVTT cue settings\n function consumeCueSettings(input: string, cue: VTTCue) {\n const settings = new Settings();\n\n parseOptions(\n input,\n function (k, v) {\n let vals;\n switch (k) {\n case 'region':\n // Find the last region we parsed with the same region id.\n for (let i = regionList.length - 1; i >= 0; i--) {\n if (regionList[i].id === v) {\n settings.set(k, regionList[i].region);\n break;\n }\n }\n break;\n case 'vertical':\n settings.alt(k, v, ['rl', 'lr']);\n break;\n case 'line':\n vals = v.split(',');\n settings.integer(k, vals[0]);\n if (settings.percent(k, vals[0])) {\n settings.set('snapToLines', false);\n }\n\n settings.alt(k, vals[0], ['auto']);\n if (vals.length === 2) {\n settings.alt('lineAlign', vals[1], ['start', center, 'end']);\n }\n\n break;\n case 'position':\n vals = v.split(',');\n settings.percent(k, vals[0]);\n if (vals.length === 2) {\n settings.alt('positionAlign', vals[1], [\n 'start',\n center,\n 'end',\n 'line-left',\n 'line-right',\n 'auto',\n ]);\n }\n\n break;\n case 'size':\n settings.percent(k, v);\n break;\n case 'align':\n settings.alt(k, v, ['start', center, 'end', 'left', 'right']);\n break;\n }\n },\n /:/,\n /\\s/,\n );\n\n // Apply default values for any missing fields.\n cue.region = settings.get('region', null);\n cue.vertical = settings.get('vertical', '');\n let line = settings.get('line', 'auto');\n if (line === 'auto' && defaults.line === -1) {\n // set numeric line number for Safari\n line = -1;\n }\n cue.line = line;\n cue.lineAlign = settings.get('lineAlign', 'start');\n cue.snapToLines = settings.get('snapToLines', true);\n cue.size = settings.get('size', 100);\n cue.align = settings.get('align', center);\n let position = settings.get('position', 'auto');\n if (position === 'auto' && defaults.position === 50) {\n // set numeric position for Safari\n position =\n cue.align === 'start' || cue.align === 'left'\n ? 0\n : cue.align === 'end' || cue.align === 'right'\n ? 100\n : 50;\n }\n cue.position = position;\n }\n\n function skipWhitespace() {\n input = input.replace(/^\\s+/, '');\n }\n\n // 4.1 WebVTT cue timings.\n skipWhitespace();\n cue.startTime = consumeTimeStamp(); // (1) collect cue start time\n skipWhitespace();\n if (input.slice(0, 3) !== '-->') {\n // (3) next characters must match '-->'\n throw new Error(\n \"Malformed time stamp (time stamps must be separated by '-->'): \" +\n oInput,\n );\n }\n input = input.slice(3);\n skipWhitespace();\n cue.endTime = consumeTimeStamp(); // (5) collect cue end time\n\n // 4.1 WebVTT cue settings list.\n skipWhitespace();\n consumeCueSettings(input, cue);\n}\n\nexport function fixLineBreaks(input: string): string {\n return input.replace(/<br(?: \\/)?>/gi, '\\n');\n}\n\ntype Region = {\n id: string;\n region: any;\n};\n\nexport class VTTParser {\n private state:\n | 'INITIAL'\n | 'HEADER'\n | 'ID'\n | 'CUE'\n | 'CUETEXT'\n | 'NOTE'\n | 'BADWEBVTT'\n | 'BADCUE' = 'INITIAL';\n private buffer: string = '';\n private decoder: StringDecoder = new StringDecoder();\n private regionList: Region[] = [];\n private cue: VTTCue | null = null;\n public oncue?: (cue: VTTCue) => void;\n public onparsingerror?: (error: Error) => void;\n public onflush?: () => void;\n\n parse(data?: string): VTTParser {\n const _this = this;\n\n // If there is no data then we won't decode it, but will just try to parse\n // whatever is in buffer already. This may occur in circumstances, for\n // example when flush() is called.\n if (data) {\n // Try to decode the data that we received.\n _this.buffer += _this.decoder.decode(data, { stream: true });\n }\n\n function collectNextLine(): string {\n let buffer: string = _this.buffer;\n let pos = 0;\n\n buffer = fixLineBreaks(buffer);\n\n while (\n pos < buffer.length &&\n buffer[pos] !== '\\r' &&\n buffer[pos] !== '\\n'\n ) {\n ++pos;\n }\n\n const line: string = buffer.slice(0, pos);\n // Advance the buffer early in case we fail below.\n if (buffer[pos] === '\\r') {\n ++pos;\n }\n\n if (buffer[pos] === '\\n') {\n ++pos;\n }\n\n _this.buffer = buffer.slice(pos);\n return line;\n }\n\n // 3.2 WebVTT metadata header syntax\n function parseHeader(input) {\n parseOptions(\n input,\n function (k, v) {\n // switch (k) {\n // case 'region':\n // 3.3 WebVTT region metadata header syntax\n // console.log('parse region', v);\n // parseRegion(v);\n // break;\n // }\n },\n /:/,\n );\n }\n\n // 5.1 WebVTT file parsing.\n try {\n let line: string = '';\n if (_this.state === 'INITIAL') {\n // We can't start parsing until we have the first line.\n if (!/\\r\\n|\\n/.test(_this.buffer)) {\n return this;\n }\n\n line = collectNextLine();\n // strip of UTF-8 BOM if any\n // https://en.wikipedia.org/wiki/Byte_order_mark#UTF-8\n const m = line.match(/^()?WEBVTT([ \\t].*)?$/);\n if (!m?.[0]) {\n throw new Error('Malformed WebVTT signature.');\n }\n\n _this.state = 'HEADER';\n }\n\n let alreadyCollectedLine = false;\n while (_this.buffer) {\n // We can't parse a line until we have the full line.\n if (!/\\r\\n|\\n/.test(_this.buffer)) {\n return this;\n }\n\n if (!alreadyCollectedLine) {\n line = collectNextLine();\n } else {\n alreadyCollectedLine = false;\n }\n\n switch (_this.state) {\n case 'HEADER':\n // 13-18 - Allow a header (metadata) under the WEBVTT line.\n if (/:/.test(line)) {\n parseHeader(line);\n } else if (!line) {\n // An empty line terminates the header and starts the body (cues).\n _this.state = 'ID';\n }\n continue;\n case 'NOTE':\n // Ignore NOTE blocks.\n if (!line) {\n _this.state = 'ID';\n }\n\n continue;\n case 'ID':\n // Check for the start of NOTE blocks.\n if (/^NOTE($|[ \\t])/.test(line)) {\n _this.state = 'NOTE';\n break;\n }\n // 19-29 - Allow any number of line terminators, then initialize new cue values.\n if (!line) {\n continue;\n }\n\n _this.cue = new VTTCue(0, 0, '');\n _this.state = 'CUE';\n // 30-39 - Check if self line contains an optional identifier or timing data.\n if (line.indexOf('-->') === -1) {\n _this.cue.id = line;\n continue;\n }\n // Process line as start of a cue.\n /* falls through */\n case 'CUE':\n // 40 - Collect cue timings and settings.\n if (!_this.cue) {\n _this.state = 'BADCUE';\n continue;\n }\n try {\n parseCue(line, _this.cue, _this.regionList);\n } catch (e) {\n // In case of an error ignore rest of the cue.\n _this.cue = null;\n _this.state = 'BADCUE';\n continue;\n }\n _this.state = 'CUETEXT';\n continue;\n case 'CUETEXT':\n {\n const hasSubstring = line.indexOf('-->') !== -1;\n // 34 - If we have an empty line then report the cue.\n // 35 - If we have the special substring '-->' then report the cue,\n // but do not collect the line as we need to process the current\n // one as a new cue.\n if (!line || (hasSubstring && (alreadyCollectedLine = true))) {\n // We are done parsing self cue.\n if (_this.oncue && _this.cue) {\n _this.oncue(_this.cue);\n }\n\n _this.cue = null;\n _this.state = 'ID';\n continue;\n }\n if (_this.cue === null) {\n continue;\n }\n\n if (_this.cue.text) {\n _this.cue.text += '\\n';\n }\n _this.cue.text += line;\n }\n continue;\n case 'BADCUE':\n // 54-62 - Collect and discard the remaining cue.\n if (!line) {\n _this.state = 'ID';\n }\n }\n }\n } catch (e) {\n // If we are currently parsing a cue, report what we have.\n if (_this.state === 'CUETEXT' && _this.cue && _this.oncue) {\n _this.oncue(_this.cue);\n }\n\n _this.cue = null;\n // Enter BADWEBVTT state if header was not parsed correctly otherwise\n // another exception occurred so enter BADCUE state.\n _this.state = _this.state === 'INITIAL' ? 'BADWEBVTT' : 'BADCUE';\n }\n return this;\n }\n\n flush(): VTTParser {\n const _this = this;\n try {\n // Finish decoding the stream.\n // _this.buffer += _this.decoder.decode();\n // Synthesize the end of the current cue or region.\n if (_this.cue || _this.state === 'HEADER') {\n _this.buffer += '\\n\\n';\n _this.parse();\n }\n // If we've flushed, parsed, and we're still on the INITIAL state then\n // that means we don't have enough of the stream to parse the first\n // line.\n if (_this.state === 'INITIAL' || _this.state === 'BADWEBVTT') {\n throw new Error('Malformed WebVTT signature.');\n }\n } catch (e) {\n if (_this.onparsingerror) {\n _this.onparsingerror(e);\n }\n }\n if (_this.onflush) {\n _this.onflush();\n }\n\n return this;\n }\n}\n","import { VTTParser } from './vttparser';\nimport { utf8ArrayToStr } from '../demux/id3';\nimport {\n RationalTimestamp,\n toMpegTsClockFromTimescale,\n} from './timescale-conversion';\nimport { normalizePts } from '../remux/mp4-remuxer';\nimport type { VTTCCs } from '../types/vtt';\n\nconst LINEBREAKS = /\\r\\n|\\n\\r|\\n|\\r/g;\n\n// String.prototype.startsWith is not supported in IE11\nconst startsWith = function (\n inputString: string,\n searchString: string,\n position: number = 0,\n) {\n return (\n inputString.slice(position, position + searchString.length) === searchString\n );\n};\n\nconst cueString2millis = function (timeString: string) {\n let ts = parseInt(timeString.slice(-3));\n const secs = parseInt(timeString.slice(-6, -4));\n const mins = parseInt(timeString.slice(-9, -7));\n const hours =\n timeString.length > 9\n ? parseInt(timeString.substring(0, timeString.indexOf(':')))\n : 0;\n\n if (\n !Number.isFinite(ts) ||\n !Number.isFinite(secs) ||\n !Number.isFinite(mins) ||\n !Number.isFinite(hours)\n ) {\n throw Error(`Malformed X-TIMESTAMP-MAP: Local:${timeString}`);\n }\n\n ts += 1000 * secs;\n ts += 60 * 1000 * mins;\n ts += 60 * 60 * 1000 * hours;\n\n return ts;\n};\n\n// From https://github.com/darkskyapp/string-hash\nconst hash = function (text: string) {\n let hash = 5381;\n let i = text.length;\n while (i) {\n hash = (hash * 33) ^ text.charCodeAt(--i);\n }\n\n return (hash >>> 0).toString();\n};\n\n// Create a unique hash id for a cue based on start/end times and text.\n// This helps timeline-controller to avoid showing repeated captions.\nexport function generateCueId(\n startTime: number,\n endTime: number,\n text: string,\n) {\n return hash(startTime.toString()) + hash(endTime.toString()) + hash(text);\n}\n\nconst calculateOffset = function (vttCCs: VTTCCs, cc, presentationTime) {\n let currCC = vttCCs[cc];\n let prevCC = vttCCs[currCC.prevCC];\n\n // This is the first discontinuity or cues have been processed since the last discontinuity\n // Offset = current discontinuity time\n if (!prevCC || (!prevCC.new && currCC.new)) {\n vttCCs.ccOffset = vttCCs.presentationOffset = currCC.start;\n currCC.new = false;\n return;\n }\n\n // There have been discontinuities since cues were last parsed.\n // Offset = time elapsed\n while (prevCC?.new) {\n vttCCs.ccOffset += currCC.start - prevCC.start;\n currCC.new = false;\n currCC = prevCC;\n prevCC = vttCCs[currCC.prevCC];\n }\n\n vttCCs.presentationOffset = presentationTime;\n};\n\nexport function parseWebVTT(\n vttByteArray: ArrayBuffer,\n initPTS: RationalTimestamp | undefined,\n vttCCs: VTTCCs,\n cc: number,\n timeOffset: number,\n callBack: (cues: VTTCue[]) => void,\n errorCallBack: (error: Error) => void,\n) {\n const parser = new VTTParser();\n // Convert byteArray into string, replacing any somewhat exotic linefeeds with \"\\n\", then split on that character.\n // Uint8Array.prototype.reduce is not implemented in IE11\n const vttLines = utf8ArrayToStr(new Uint8Array(vttByteArray))\n .trim()\n .replace(LINEBREAKS, '\\n')\n .split('\\n');\n const cues: VTTCue[] = [];\n const init90kHz = initPTS\n ? toMpegTsClockFromTimescale(initPTS.baseTime, initPTS.timescale)\n : 0;\n let cueTime = '00:00.000';\n let timestampMapMPEGTS = 0;\n let timestampMapLOCAL = 0;\n let parsingError: Error;\n let inHeader = true;\n\n parser.oncue = function (cue: VTTCue) {\n // Adjust cue timing; clamp cues to start no earlier than - and drop cues that don't end after - 0 on timeline.\n const currCC = vttCCs[cc];\n let cueOffset = vttCCs.ccOffset;\n\n // Calculate subtitle PTS offset\n const webVttMpegTsMapOffset = (timestampMapMPEGTS - init90kHz) / 90000;\n\n // Update offsets for new discontinuities\n if (currCC?.new) {\n if (timestampMapLOCAL !== undefined) {\n // When local time is provided, offset = discontinuity start time - local time\n cueOffset = vttCCs.ccOffset = currCC.start;\n } else {\n calculateOffset(vttCCs, cc, webVttMpegTsMapOffset);\n }\n }\n if (webVttMpegTsMapOffset) {\n if (!initPTS) {\n parsingError = new Error('Missing initPTS for VTT MPEGTS');\n return;\n }\n // If we have MPEGTS, offset = presentation time + discontinuity offset\n cueOffset = webVttMpegTsMapOffset - vttCCs.presentationOffset;\n }\n\n const duration = cue.endTime - cue.startTime;\n const startTime =\n normalizePts(\n (cue.startTime + cueOffset - timestampMapLOCAL) * 90000,\n timeOffset * 90000,\n ) / 90000;\n cue.startTime = Math.max(startTime, 0);\n cue.endTime = Math.max(startTime + duration, 0);\n\n //trim trailing webvtt block whitespaces\n const text = cue.text.trim();\n\n // Fix encoding of special characters\n cue.text = decodeURIComponent(encodeURIComponent(text));\n\n // If the cue was not assigned an id from the VTT file (line above the content), create one.\n if (!cue.id) {\n cue.id = generateCueId(cue.startTime, cue.endTime, text);\n }\n\n if (cue.endTime > 0) {\n cues.push(cue);\n }\n };\n\n parser.onparsingerror = function (error: Error) {\n parsingError = error;\n };\n\n parser.onflush = function () {\n if (parsingError) {\n errorCallBack(parsingError);\n return;\n }\n callBack(cues);\n };\n\n // Go through contents line by line.\n vttLines.forEach((line) => {\n if (inHeader) {\n // Look for X-TIMESTAMP-MAP in header.\n if (startsWith(line, 'X-TIMESTAMP-MAP=')) {\n // Once found, no more are allowed anyway, so stop searching.\n inHeader = false;\n // Extract LOCAL and MPEGTS.\n line\n .slice(16)\n .split(',')\n .forEach((timestamp) => {\n if (startsWith(timestamp, 'LOCAL:')) {\n cueTime = timestamp.slice(6);\n } else if (startsWith(timestamp, 'MPEGTS:')) {\n timestampMapMPEGTS = parseInt(timestamp.slice(7));\n }\n });\n try {\n // Convert cue time to seconds\n timestampMapLOCAL = cueString2millis(cueTime) / 1000;\n } catch (error) {\n parsingError = error;\n }\n // Return without parsing X-TIMESTAMP-MAP line.\n return;\n } else if (line === '') {\n inHeader = false;\n }\n }\n // Parse line by default.\n parser.parse(line + '\\n');\n });\n\n parser.flush();\n}\n","import { findBox } from './mp4-tools';\nimport { parseTimeStamp } from './vttparser';\nimport VTTCue from './vttcue';\nimport { utf8ArrayToStr } from '../demux/id3';\nimport {\n RationalTimestamp,\n toTimescaleFromScale,\n} from './timescale-conversion';\nimport { generateCueId } from './webvtt-parser';\n\nexport const IMSC1_CODEC = 'stpp.ttml.im1t';\n\n// Time format: h:m:s:frames(.subframes)\nconst HMSF_REGEX = /^(\\d{2,}):(\\d{2}):(\\d{2}):(\\d{2})\\.?(\\d+)?$/;\n\n// Time format: hours, minutes, seconds, milliseconds, frames, ticks\nconst TIME_UNIT_REGEX = /^(\\d*(?:\\.\\d*)?)(h|m|s|ms|f|t)$/;\n\nconst textAlignToLineAlign: Partial<Record<string, LineAlignSetting>> = {\n left: 'start',\n center: 'center',\n right: 'end',\n start: 'start',\n end: 'end',\n};\n\nexport function parseIMSC1(\n payload: ArrayBuffer,\n initPTS: RationalTimestamp,\n callBack: (cues: Array<VTTCue>) => any,\n errorCallBack: (error: Error) => any,\n) {\n const results = findBox(new Uint8Array(payload), ['mdat']);\n if (results.length === 0) {\n errorCallBack(new Error('Could not parse IMSC1 mdat'));\n return;\n }\n\n const ttmlList = results.map((mdat) => utf8ArrayToStr(mdat));\n\n const syncTime = toTimescaleFromScale(initPTS.baseTime, 1, initPTS.timescale);\n\n try {\n ttmlList.forEach((ttml) => callBack(parseTTML(ttml, syncTime)));\n } catch (error) {\n errorCallBack(error);\n }\n}\n\nfunction parseTTML(ttml: string, syncTime: number): Array<VTTCue> {\n const parser = new DOMParser();\n const xmlDoc = parser.parseFromString(ttml, 'text/xml');\n const tt = xmlDoc.getElementsByTagName('tt')[0];\n if (!tt) {\n throw new Error('Invalid ttml');\n }\n const defaultRateInfo = {\n frameRate: 30,\n subFrameRate: 1,\n frameRateMultiplier: 0,\n tickRate: 0,\n };\n const rateInfo: Object = Object.keys(defaultRateInfo).reduce(\n (result, key) => {\n result[key] = tt.getAttribute(`ttp:${key}`) || defaultRateInfo[key];\n return result;\n },\n {},\n );\n\n const trim = tt.getAttribute('xml:space') !== 'preserve';\n\n const styleElements = collectionToDictionary(\n getElementCollection(tt, 'styling', 'style'),\n );\n const regionElements = collectionToDictionary(\n getElementCollection(tt, 'layout', 'region'),\n );\n const cueElements = getElementCollection(tt, 'body', '[begin]');\n\n return [].map\n .call(cueElements, (cueElement) => {\n const cueText = getTextContent(cueElement, trim);\n\n if (!cueText || !cueElement.hasAttribute('begin')) {\n return null;\n }\n const startTime = parseTtmlTime(\n cueElement.getAttribute('begin'),\n rateInfo,\n );\n const duration = parseTtmlTime(cueElement.getAttribute('dur'), rateInfo);\n let endTime = parseTtmlTime(cueElement.getAttribute('end'), rateInfo);\n if (startTime === null) {\n throw timestampParsingError(cueElement);\n }\n if (endTime === null) {\n if (duration === null) {\n throw timestampParsingError(cueElement);\n }\n endTime = startTime + duration;\n }\n const cue = new VTTCue(startTime - syncTime, endTime - syncTime, cueText);\n cue.id = generateCueId(cue.startTime, cue.endTime, cue.text);\n\n const region = regionElements[cueElement.getAttribute('region')];\n const style = styleElements[cueElement.getAttribute('style')];\n\n // Apply styles to cue\n const styles = getTtmlStyles(region, style, styleElements);\n const { textAlign } = styles;\n if (textAlign) {\n // cue.positionAlign not settable in FF~2016\n const lineAlign = textAlignToLineAlign[textAlign];\n if (lineAlign) {\n cue.lineAlign = lineAlign;\n }\n cue.align = textAlign as AlignSetting;\n }\n Object.assign(cue, styles);\n\n return cue;\n })\n .filter((cue) => cue !== null);\n}\n\nfunction getElementCollection(\n fromElement,\n parentName,\n childName,\n): Array<HTMLElement> {\n const parent = fromElement.getElementsByTagName(parentName)[0];\n if (parent) {\n return [].slice.call(parent.querySelectorAll(childName));\n }\n return [];\n}\n\nfunction collectionToDictionary(elementsWithId: Array<HTMLElement>): {\n [id: string]: HTMLElement;\n} {\n return elementsWithId.reduce((dict, element: HTMLElement) => {\n const id = element.getAttribute('xml:id');\n if (id) {\n dict[id] = element;\n }\n return dict;\n }, {});\n}\n\nfunction getTextContent(element, trim): string {\n return [].slice.call(element.childNodes).reduce((str, node, i) => {\n if (node.nodeName === 'br' && i) {\n return str + '\\n';\n }\n if (node.childNodes?.length) {\n return getTextContent(node, trim);\n } else if (trim) {\n return str + node.textContent.trim().replace(/\\s+/g, ' ');\n }\n return str + node.textContent;\n }, '');\n}\n\nfunction getTtmlStyles(\n region,\n style,\n styleElements,\n): { [style: string]: string } {\n const ttsNs = 'http://www.w3.org/ns/ttml#styling';\n let regionStyle = null;\n const styleAttributes = [\n 'displayAlign',\n 'textAlign',\n 'color',\n 'backgroundColor',\n 'fontSize',\n 'fontFamily',\n // 'fontWeight',\n // 'lineHeight',\n // 'wrapOption',\n // 'fontStyle',\n // 'direction',\n // 'writingMode'\n ];\n\n const regionStyleName = region?.hasAttribute('style')\n ? region.getAttribute('style')\n : null;\n\n if (regionStyleName && styleElements.hasOwnProperty(regionStyleName)) {\n regionStyle = styleElements[regionStyleName];\n }\n\n return styleAttributes.reduce((styles, name) => {\n const value =\n getAttributeNS(style, ttsNs, name) ||\n getAttributeNS(region, ttsNs, name) ||\n getAttributeNS(regionStyle, ttsNs, name);\n if (value) {\n styles[name] = value;\n }\n return styles;\n }, {});\n}\n\nfunction getAttributeNS(element, ns, name): string | null {\n if (!element) {\n return null;\n }\n return element.hasAttributeNS(ns, name)\n ? element.getAttributeNS(ns, name)\n : null;\n}\n\nfunction timestampParsingError(node) {\n return new Error(`Could not parse ttml timestamp ${node}`);\n}\n\nfunction parseTtmlTime(timeAttributeValue, rateInfo): number | null {\n if (!timeAttributeValue) {\n return null;\n }\n let seconds: number | null = parseTimeStamp(timeAttributeValue);\n if (seconds === null) {\n if (HMSF_REGEX.test(timeAttributeValue)) {\n seconds = parseHoursMinutesSecondsFrames(timeAttributeValue, rateInfo);\n } else if (TIME_UNIT_REGEX.test(timeAttributeValue)) {\n seconds = parseTimeUnits(timeAttributeValue, rateInfo);\n }\n }\n return seconds;\n}\n\nfunction parseHoursMinutesSecondsFrames(timeAttributeValue, rateInfo): number {\n const m = HMSF_REGEX.exec(timeAttributeValue) as Array<any>;\n const frames = (m[4] | 0) + (m[5] | 0) / rateInfo.subFrameRate;\n return (\n (m[1] | 0) * 3600 +\n (m[2] | 0) * 60 +\n (m[3] | 0) +\n frames / rateInfo.frameRate\n );\n}\n\nfunction parseTimeUnits(timeAttributeValue, rateInfo): number {\n const m = TIME_UNIT_REGEX.exec(timeAttributeValue) as Array<any>;\n const value = Number(m[1]);\n const unit = m[2];\n switch (unit) {\n case 'h':\n return value * 3600;\n case 'm':\n return value * 60;\n case 'ms':\n return value * 1000;\n case 'f':\n return value / rateInfo.frameRate;\n case 't':\n return value / rateInfo.tickRate;\n }\n return value;\n}\n","import { Events } from '../events';\nimport Cea608Parser, { CaptionScreen } from '../utils/cea-608-parser';\nimport OutputFilter from '../utils/output-filter';\nimport { parseWebVTT } from '../utils/webvtt-parser';\nimport {\n sendAddTrackEvent,\n clearCurrentCues,\n addCueToTrack,\n removeCuesInRange,\n filterSubtitleTracks,\n} from '../utils/texttrack-utils';\nimport {\n subtitleOptionsIdentical,\n subtitleTrackMatchesTextTrack,\n} from '../utils/media-option-attributes';\nimport { parseIMSC1, IMSC1_CODEC } from '../utils/imsc1-ttml-parser';\nimport { appendUint8Array } from '../utils/mp4-tools';\nimport { PlaylistLevelType } from '../types/loader';\nimport { Fragment } from '../loader/fragment';\nimport type {\n FragParsingUserdataData,\n FragLoadedData,\n FragDecryptedData,\n MediaAttachingData,\n ManifestLoadedData,\n InitPTSFoundData,\n SubtitleTracksUpdatedData,\n BufferFlushingData,\n FragLoadingData,\n} from '../types/events';\nimport { logger } from '../utils/logger';\nimport type Hls from '../hls';\nimport type { ComponentAPI } from '../types/component-api';\nimport type { HlsConfig } from '../config';\nimport type { CuesInterface } from '../utils/cues';\nimport type { MediaPlaylist } from '../types/media-playlist';\nimport type { VTTCCs } from '../types/vtt';\nimport type { RationalTimestamp } from '../utils/timescale-conversion';\n\ntype TrackProperties = {\n label: string;\n languageCode: string;\n media?: MediaPlaylist;\n};\n\ntype NonNativeCaptionsTrack = {\n _id?: string;\n label: string;\n kind: string;\n default: boolean;\n closedCaptions?: MediaPlaylist;\n subtitleTrack?: MediaPlaylist;\n};\n\nexport class TimelineController implements ComponentAPI {\n private hls: Hls;\n private media: HTMLMediaElement | null = null;\n private config: HlsConfig;\n private enabled: boolean = true;\n private Cues: CuesInterface;\n private textTracks: Array<TextTrack> = [];\n private tracks: Array<MediaPlaylist> = [];\n private initPTS: RationalTimestamp[] = [];\n private unparsedVttFrags: Array<FragLoadedData | FragDecryptedData> = [];\n private captionsTracks: Record<string, TextTrack> = {};\n private nonNativeCaptionsTracks: Record<string, NonNativeCaptionsTrack> = {};\n private cea608Parser1?: Cea608Parser;\n private cea608Parser2?: Cea608Parser;\n private lastCc: number = -1; // Last video (CEA-608) fragment CC\n private lastSn: number = -1; // Last video (CEA-608) fragment MSN\n private lastPartIndex: number = -1; // Last video (CEA-608) fragment Part Index\n private prevCC: number = -1; // Last subtitle fragment CC\n private vttCCs: VTTCCs = newVTTCCs();\n private captionsProperties: {\n textTrack1: TrackProperties;\n textTrack2: TrackProperties;\n textTrack3: TrackProperties;\n textTrack4: TrackProperties;\n };\n\n constructor(hls: Hls) {\n this.hls = hls;\n this.config = hls.config;\n this.Cues = hls.config.cueHandler;\n\n this.captionsProperties = {\n textTrack1: {\n label: this.config.captionsTextTrack1Label,\n languageCode: this.config.captionsTextTrack1LanguageCode,\n },\n textTrack2: {\n label: this.config.captionsTextTrack2Label,\n languageCode: this.config.captionsTextTrack2LanguageCode,\n },\n textTrack3: {\n label: this.config.captionsTextTrack3Label,\n languageCode: this.config.captionsTextTrack3LanguageCode,\n },\n textTrack4: {\n label: this.config.captionsTextTrack4Label,\n languageCode: this.config.captionsTextTrack4LanguageCode,\n },\n };\n\n hls.on(Events.MEDIA_ATTACHING, this.onMediaAttaching, this);\n hls.on(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n hls.on(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n hls.on(Events.MANIFEST_LOADED, this.onManifestLoaded, this);\n hls.on(Events.SUBTITLE_TRACKS_UPDATED, this.onSubtitleTracksUpdated, this);\n hls.on(Events.FRAG_LOADING, this.onFragLoading, this);\n hls.on(Events.FRAG_LOADED, this.onFragLoaded, this);\n hls.on(Events.FRAG_PARSING_USERDATA, this.onFragParsingUserdata, this);\n hls.on(Events.FRAG_DECRYPTED, this.onFragDecrypted, this);\n hls.on(Events.INIT_PTS_FOUND, this.onInitPtsFound, this);\n hls.on(Events.SUBTITLE_TRACKS_CLEARED, this.onSubtitleTracksCleared, this);\n hls.on(Events.BUFFER_FLUSHING, this.onBufferFlushing, this);\n }\n\n public destroy(): void {\n const { hls } = this;\n hls.off(Events.MEDIA_ATTACHING, this.onMediaAttaching, this);\n hls.off(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n hls.off(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n hls.off(Events.MANIFEST_LOADED, this.onManifestLoaded, this);\n hls.off(Events.SUBTITLE_TRACKS_UPDATED, this.onSubtitleTracksUpdated, this);\n hls.off(Events.FRAG_LOADING, this.onFragLoading, this);\n hls.off(Events.FRAG_LOADED, this.onFragLoaded, this);\n hls.off(Events.FRAG_PARSING_USERDATA, this.onFragParsingUserdata, this);\n hls.off(Events.FRAG_DECRYPTED, this.onFragDecrypted, this);\n hls.off(Events.INIT_PTS_FOUND, this.onInitPtsFound, this);\n hls.off(Events.SUBTITLE_TRACKS_CLEARED, this.onSubtitleTracksCleared, this);\n hls.off(Events.BUFFER_FLUSHING, this.onBufferFlushing, this);\n // @ts-ignore\n this.hls = this.config = null;\n this.cea608Parser1 = this.cea608Parser2 = undefined;\n }\n\n private initCea608Parsers() {\n if (\n this.config.enableCEA708Captions &&\n (!this.cea608Parser1 || !this.cea608Parser2)\n ) {\n const channel1 = new OutputFilter(this, 'textTrack1');\n const channel2 = new OutputFilter(this, 'textTrack2');\n const channel3 = new OutputFilter(this, 'textTrack3');\n const channel4 = new OutputFilter(this, 'textTrack4');\n this.cea608Parser1 = new Cea608Parser(1, channel1, channel2);\n this.cea608Parser2 = new Cea608Parser(3, channel3, channel4);\n }\n }\n\n public addCues(\n trackName: string,\n startTime: number,\n endTime: number,\n screen: CaptionScreen,\n cueRanges: Array<[number, number]>,\n ) {\n // skip cues which overlap more than 50% with previously parsed time ranges\n let merged = false;\n for (let i = cueRanges.length; i--; ) {\n const cueRange = cueRanges[i];\n const overlap = intersection(\n cueRange[0],\n cueRange[1],\n startTime,\n endTime,\n );\n if (overlap >= 0) {\n cueRange[0] = Math.min(cueRange[0], startTime);\n cueRange[1] = Math.max(cueRange[1], endTime);\n merged = true;\n if (overlap / (endTime - startTime) > 0.5) {\n return;\n }\n }\n }\n if (!merged) {\n cueRanges.push([startTime, endTime]);\n }\n\n if (this.config.renderTextTracksNatively) {\n const track = this.captionsTracks[trackName];\n this.Cues.newCue(track, startTime, endTime, screen);\n } else {\n const cues = this.Cues.newCue(null, startTime, endTime, screen);\n this.hls.trigger(Events.CUES_PARSED, {\n type: 'captions',\n cues,\n track: trackName,\n });\n }\n }\n\n // Triggered when an initial PTS is found; used for synchronisation of WebVTT.\n private onInitPtsFound(\n event: Events.INIT_PTS_FOUND,\n { frag, id, initPTS, timescale }: InitPTSFoundData,\n ) {\n const { unparsedVttFrags } = this;\n if (id === 'main') {\n this.initPTS[frag.cc] = { baseTime: initPTS, timescale };\n }\n\n // Due to asynchronous processing, initial PTS may arrive later than the first VTT fragments are loaded.\n // Parse any unparsed fragments upon receiving the initial PTS.\n if (unparsedVttFrags.length) {\n this.unparsedVttFrags = [];\n unparsedVttFrags.forEach((frag) => {\n this.onFragLoaded(Events.FRAG_LOADED, frag as FragLoadedData);\n });\n }\n }\n\n private getExistingTrack(label: string, language: string): TextTrack | null {\n const { media } = this;\n if (media) {\n for (let i = 0; i < media.textTracks.length; i++) {\n const textTrack = media.textTracks[i];\n if (\n canReuseVttTextTrack(textTrack, {\n name: label,\n lang: language,\n attrs: {} as any,\n })\n ) {\n return textTrack;\n }\n }\n }\n return null;\n }\n\n public createCaptionsTrack(trackName: string) {\n if (this.config.renderTextTracksNatively) {\n this.createNativeTrack(trackName);\n } else {\n this.createNonNativeTrack(trackName);\n }\n }\n\n private createNativeTrack(trackName: string) {\n if (this.captionsTracks[trackName]) {\n return;\n }\n const { captionsProperties, captionsTracks, media } = this;\n const { label, languageCode } = captionsProperties[trackName];\n // Enable reuse of existing text track.\n const existingTrack = this.getExistingTrack(label, languageCode);\n if (!existingTrack) {\n const textTrack = this.createTextTrack('captions', label, languageCode);\n if (textTrack) {\n // Set a special property on the track so we know it's managed by Hls.js\n textTrack[trackName] = true;\n captionsTracks[trackName] = textTrack;\n }\n } else {\n captionsTracks[trackName] = existingTrack;\n clearCurrentCues(captionsTracks[trackName]);\n sendAddTrackEvent(captionsTracks[trackName], media as HTMLMediaElement);\n }\n }\n\n private createNonNativeTrack(trackName: string) {\n if (this.nonNativeCaptionsTracks[trackName]) {\n return;\n }\n // Create a list of a single track for the provider to consume\n const trackProperties: TrackProperties = this.captionsProperties[trackName];\n if (!trackProperties) {\n return;\n }\n const label = trackProperties.label as string;\n const track = {\n _id: trackName,\n label,\n kind: 'captions',\n default: trackProperties.media ? !!trackProperties.media.default : false,\n closedCaptions: trackProperties.media,\n };\n this.nonNativeCaptionsTracks[trackName] = track;\n this.hls.trigger(Events.NON_NATIVE_TEXT_TRACKS_FOUND, { tracks: [track] });\n }\n\n private createTextTrack(\n kind: TextTrackKind,\n label: string,\n lang?: string,\n ): TextTrack | undefined {\n const media = this.media;\n if (!media) {\n return;\n }\n return media.addTextTrack(kind, label, lang);\n }\n\n private onMediaAttaching(\n event: Events.MEDIA_ATTACHING,\n data: MediaAttachingData,\n ) {\n this.media = data.media;\n this._cleanTracks();\n }\n\n private onMediaDetaching() {\n const { captionsTracks } = this;\n Object.keys(captionsTracks).forEach((trackName) => {\n clearCurrentCues(captionsTracks[trackName]);\n delete captionsTracks[trackName];\n });\n this.nonNativeCaptionsTracks = {};\n }\n\n private onManifestLoading() {\n // Detect discontinuity in video fragment (CEA-608) parsing\n this.lastCc = -1;\n this.lastSn = -1;\n this.lastPartIndex = -1;\n // Detect discontinuity in subtitle manifests\n this.prevCC = -1;\n this.vttCCs = newVTTCCs();\n // Reset tracks\n this._cleanTracks();\n this.tracks = [];\n this.captionsTracks = {};\n this.nonNativeCaptionsTracks = {};\n this.textTracks = [];\n this.unparsedVttFrags = [];\n this.initPTS = [];\n if (this.cea608Parser1 && this.cea608Parser2) {\n this.cea608Parser1.reset();\n this.cea608Parser2.reset();\n }\n }\n\n private _cleanTracks() {\n // clear outdated subtitles\n const { media } = this;\n if (!media) {\n return;\n }\n const textTracks = media.textTracks;\n if (textTracks) {\n for (let i = 0; i < textTracks.length; i++) {\n clearCurrentCues(textTracks[i]);\n }\n }\n }\n\n private onSubtitleTracksUpdated(\n event: Events.SUBTITLE_TRACKS_UPDATED,\n data: SubtitleTracksUpdatedData,\n ) {\n const tracks: Array<MediaPlaylist> = data.subtitleTracks || [];\n const hasIMSC1 = tracks.some((track) => track.textCodec === IMSC1_CODEC);\n if (this.config.enableWebVTT || (hasIMSC1 && this.config.enableIMSC1)) {\n const listIsIdentical = subtitleOptionsIdentical(this.tracks, tracks);\n if (listIsIdentical) {\n this.tracks = tracks;\n return;\n }\n this.textTracks = [];\n this.tracks = tracks;\n\n if (this.config.renderTextTracksNatively) {\n const media = this.media;\n const inUseTracks: (TextTrack | null)[] | null = media\n ? filterSubtitleTracks(media.textTracks)\n : null;\n\n this.tracks.forEach((track, index) => {\n // Reuse tracks with the same label and lang, but do not reuse 608/708 tracks\n let textTrack: TextTrack | undefined;\n if (inUseTracks) {\n let inUseTrack: TextTrack | null = null;\n for (let i = 0; i < inUseTracks.length; i++) {\n if (\n inUseTracks[i] &&\n canReuseVttTextTrack(inUseTracks[i], track)\n ) {\n inUseTrack = inUseTracks[i];\n inUseTracks[i] = null;\n break;\n }\n }\n if (inUseTrack) {\n textTrack = inUseTrack;\n }\n }\n if (textTrack) {\n clearCurrentCues(textTrack);\n } else {\n const textTrackKind = captionsOrSubtitlesFromCharacteristics(track);\n textTrack = this.createTextTrack(\n textTrackKind,\n track.name,\n track.lang,\n );\n if (textTrack) {\n textTrack.mode = 'disabled';\n }\n }\n if (textTrack) {\n this.textTracks.push(textTrack);\n }\n });\n // Warn when video element has captions or subtitle TextTracks carried over from another source\n if (inUseTracks?.length) {\n const unusedTextTracks = inUseTracks\n .filter((t) => t !== null)\n .map((t) => (t as TextTrack).label);\n if (unusedTextTracks.length) {\n logger.warn(\n `Media element contains unused subtitle tracks: ${unusedTextTracks.join(\n ', ',\n )}. Replace media element for each source to clear TextTracks and captions menu.`,\n );\n }\n }\n } else if (this.tracks.length) {\n // Create a list of tracks for the provider to consume\n const tracksList = this.tracks.map((track) => {\n return {\n label: track.name,\n kind: track.type.toLowerCase(),\n default: track.default,\n subtitleTrack: track,\n };\n });\n this.hls.trigger(Events.NON_NATIVE_TEXT_TRACKS_FOUND, {\n tracks: tracksList,\n });\n }\n }\n }\n\n private onManifestLoaded(\n event: Events.MANIFEST_LOADED,\n data: ManifestLoadedData,\n ) {\n if (this.config.enableCEA708Captions && data.captions) {\n data.captions.forEach((captionsTrack) => {\n const instreamIdMatch = /(?:CC|SERVICE)([1-4])/.exec(\n captionsTrack.instreamId as string,\n );\n if (!instreamIdMatch) {\n return;\n }\n const trackName = `textTrack${instreamIdMatch[1]}`;\n const trackProperties: TrackProperties =\n this.captionsProperties[trackName];\n if (!trackProperties) {\n return;\n }\n trackProperties.label = captionsTrack.name;\n if (captionsTrack.lang) {\n // optional attribute\n trackProperties.languageCode = captionsTrack.lang;\n }\n trackProperties.media = captionsTrack;\n });\n }\n }\n\n private closedCaptionsForLevel(frag: Fragment): string | undefined {\n const level = this.hls.levels[frag.level];\n return level?.attrs['CLOSED-CAPTIONS'];\n }\n\n private onFragLoading(event: Events.FRAG_LOADING, data: FragLoadingData) {\n // if this frag isn't contiguous, clear the parser so cues with bad start/end times aren't added to the textTrack\n if (this.enabled && data.frag.type === PlaylistLevelType.MAIN) {\n const { cea608Parser1, cea608Parser2, lastSn } = this;\n const { cc, sn } = data.frag;\n const partIndex = data.part?.index ?? -1;\n if (cea608Parser1 && cea608Parser2) {\n if (\n sn !== lastSn + 1 ||\n (sn === lastSn && partIndex !== this.lastPartIndex + 1) ||\n cc !== this.lastCc\n ) {\n cea608Parser1.reset();\n cea608Parser2.reset();\n }\n }\n this.lastCc = cc as number;\n this.lastSn = sn as number;\n this.lastPartIndex = partIndex;\n }\n }\n\n private onFragLoaded(\n event: Events.FRAG_LOADED,\n data: FragDecryptedData | FragLoadedData,\n ) {\n const { frag, payload } = data;\n if (frag.type === PlaylistLevelType.SUBTITLE) {\n // If fragment is subtitle type, parse as WebVTT.\n if (payload.byteLength) {\n const decryptData = frag.decryptdata;\n // fragment after decryption has a stats object\n const decrypted = 'stats' in data;\n // If the subtitles are not encrypted, parse VTTs now. Otherwise, we need to wait.\n if (decryptData == null || !decryptData.encrypted || decrypted) {\n const trackPlaylistMedia = this.tracks[frag.level];\n const vttCCs = this.vttCCs;\n if (!vttCCs[frag.cc]) {\n vttCCs[frag.cc] = {\n start: frag.start,\n prevCC: this.prevCC,\n new: true,\n };\n this.prevCC = frag.cc;\n }\n if (\n trackPlaylistMedia &&\n trackPlaylistMedia.textCodec === IMSC1_CODEC\n ) {\n this._parseIMSC1(frag, payload);\n } else {\n this._parseVTTs(data);\n }\n }\n } else {\n // In case there is no payload, finish unsuccessfully.\n this.hls.trigger(Events.SUBTITLE_FRAG_PROCESSED, {\n success: false,\n frag,\n error: new Error('Empty subtitle payload'),\n });\n }\n }\n }\n\n private _parseIMSC1(frag: Fragment, payload: ArrayBuffer) {\n const hls = this.hls;\n parseIMSC1(\n payload,\n this.initPTS[frag.cc],\n (cues) => {\n this._appendCues(cues, frag.level);\n hls.trigger(Events.SUBTITLE_FRAG_PROCESSED, {\n success: true,\n frag: frag,\n });\n },\n (error) => {\n logger.log(`Failed to parse IMSC1: ${error}`);\n hls.trigger(Events.SUBTITLE_FRAG_PROCESSED, {\n success: false,\n frag: frag,\n error,\n });\n },\n );\n }\n\n private _parseVTTs(data: FragDecryptedData | FragLoadedData) {\n const { frag, payload } = data;\n // We need an initial synchronisation PTS. Store fragments as long as none has arrived\n const { initPTS, unparsedVttFrags } = this;\n const maxAvCC = initPTS.length - 1;\n if (!initPTS[frag.cc] && maxAvCC === -1) {\n unparsedVttFrags.push(data);\n return;\n }\n\n const hls = this.hls;\n // Parse the WebVTT file contents.\n const payloadWebVTT = frag.initSegment?.data\n ? appendUint8Array(frag.initSegment.data, new Uint8Array(payload))\n : payload;\n parseWebVTT(\n payloadWebVTT,\n this.initPTS[frag.cc],\n this.vttCCs,\n frag.cc,\n frag.start,\n (cues) => {\n this._appendCues(cues, frag.level);\n hls.trigger(Events.SUBTITLE_FRAG_PROCESSED, {\n success: true,\n frag: frag,\n });\n },\n (error) => {\n const missingInitPTS =\n error.message === 'Missing initPTS for VTT MPEGTS';\n if (missingInitPTS) {\n unparsedVttFrags.push(data);\n } else {\n this._fallbackToIMSC1(frag, payload);\n }\n // Something went wrong while parsing. Trigger event with success false.\n logger.log(`Failed to parse VTT cue: ${error}`);\n if (missingInitPTS && maxAvCC > frag.cc) {\n return;\n }\n hls.trigger(Events.SUBTITLE_FRAG_PROCESSED, {\n success: false,\n frag: frag,\n error,\n });\n },\n );\n }\n\n private _fallbackToIMSC1(frag: Fragment, payload: ArrayBuffer) {\n // If textCodec is unknown, try parsing as IMSC1. Set textCodec based on the result\n const trackPlaylistMedia = this.tracks[frag.level];\n if (!trackPlaylistMedia.textCodec) {\n parseIMSC1(\n payload,\n this.initPTS[frag.cc],\n () => {\n trackPlaylistMedia.textCodec = IMSC1_CODEC;\n this._parseIMSC1(frag, payload);\n },\n () => {\n trackPlaylistMedia.textCodec = 'wvtt';\n },\n );\n }\n }\n\n private _appendCues(cues: VTTCue[], fragLevel: number) {\n const hls = this.hls;\n if (this.config.renderTextTracksNatively) {\n const textTrack = this.textTracks[fragLevel];\n // WebVTTParser.parse is an async method and if the currently selected text track mode is set to \"disabled\"\n // before parsing is done then don't try to access currentTrack.cues.getCueById as cues will be null\n // and trying to access getCueById method of cues will throw an exception\n // Because we check if the mode is disabled, we can force check `cues` below. They can't be null.\n if (!textTrack || textTrack.mode === 'disabled') {\n return;\n }\n cues.forEach((cue) => addCueToTrack(textTrack, cue));\n } else {\n const currentTrack = this.tracks[fragLevel];\n if (!currentTrack) {\n return;\n }\n const track = currentTrack.default ? 'default' : 'subtitles' + fragLevel;\n hls.trigger(Events.CUES_PARSED, { type: 'subtitles', cues, track });\n }\n }\n\n private onFragDecrypted(\n event: Events.FRAG_DECRYPTED,\n data: FragDecryptedData,\n ) {\n const { frag } = data;\n if (frag.type === PlaylistLevelType.SUBTITLE) {\n this.onFragLoaded(Events.FRAG_LOADED, data as unknown as FragLoadedData);\n }\n }\n\n private onSubtitleTracksCleared() {\n this.tracks = [];\n this.captionsTracks = {};\n }\n\n private onFragParsingUserdata(\n event: Events.FRAG_PARSING_USERDATA,\n data: FragParsingUserdataData,\n ) {\n this.initCea608Parsers();\n const { cea608Parser1, cea608Parser2 } = this;\n if (!this.enabled || !cea608Parser1 || !cea608Parser2) {\n return;\n }\n const { frag, samples } = data;\n if (\n frag.type === PlaylistLevelType.MAIN &&\n this.closedCaptionsForLevel(frag) === 'NONE'\n ) {\n return;\n }\n // If the event contains captions (found in the bytes property), push all bytes into the parser immediately\n // It will create the proper timestamps based on the PTS value\n for (let i = 0; i < samples.length; i++) {\n const ccBytes = samples[i].bytes;\n if (ccBytes) {\n const ccdatas = this.extractCea608Data(ccBytes);\n cea608Parser1.addData(samples[i].pts, ccdatas[0]);\n cea608Parser2.addData(samples[i].pts, ccdatas[1]);\n }\n }\n }\n\n onBufferFlushing(\n event: Events.BUFFER_FLUSHING,\n { startOffset, endOffset, endOffsetSubtitles, type }: BufferFlushingData,\n ) {\n const { media } = this;\n if (!media || media.currentTime < endOffset) {\n return;\n }\n // Clear 608 caption cues from the captions TextTracks when the video back buffer is flushed\n // Forward cues are never removed because we can loose streamed 608 content from recent fragments\n if (!type || type === 'video') {\n const { captionsTracks } = this;\n Object.keys(captionsTracks).forEach((trackName) =>\n removeCuesInRange(captionsTracks[trackName], startOffset, endOffset),\n );\n }\n if (this.config.renderTextTracksNatively) {\n // Clear VTT/IMSC1 subtitle cues from the subtitle TextTracks when the back buffer is flushed\n if (startOffset === 0 && endOffsetSubtitles !== undefined) {\n const { textTracks } = this;\n Object.keys(textTracks).forEach((trackName) =>\n removeCuesInRange(\n textTracks[trackName],\n startOffset,\n endOffsetSubtitles,\n ),\n );\n }\n }\n }\n\n private extractCea608Data(byteArray: Uint8Array): number[][] {\n const actualCCBytes: number[][] = [[], []];\n const count = byteArray[0] & 0x1f;\n let position = 2;\n\n for (let j = 0; j < count; j++) {\n const tmpByte = byteArray[position++];\n const ccbyte1 = 0x7f & byteArray[position++];\n const ccbyte2 = 0x7f & byteArray[position++];\n if (ccbyte1 === 0 && ccbyte2 === 0) {\n continue;\n }\n const ccValid = (0x04 & tmpByte) !== 0; // Support all four channels\n if (ccValid) {\n const ccType = 0x03 & tmpByte;\n if (\n 0x00 /* CEA608 field1*/ === ccType ||\n 0x01 /* CEA608 field2*/ === ccType\n ) {\n // Exclude CEA708 CC data.\n actualCCBytes[ccType].push(ccbyte1);\n actualCCBytes[ccType].push(ccbyte2);\n }\n }\n }\n return actualCCBytes;\n }\n}\n\nfunction captionsOrSubtitlesFromCharacteristics(\n track: Pick<MediaPlaylist, 'name' | 'lang' | 'attrs' | 'characteristics'>,\n): TextTrackKind {\n if (track.characteristics) {\n if (\n /transcribes-spoken-dialog/gi.test(track.characteristics) &&\n /describes-music-and-sound/gi.test(track.characteristics)\n ) {\n return 'captions';\n }\n }\n\n return 'subtitles';\n}\n\nfunction canReuseVttTextTrack(\n inUseTrack: TextTrack | null,\n manifestTrack: Pick<\n MediaPlaylist,\n 'name' | 'lang' | 'attrs' | 'characteristics'\n >,\n): boolean {\n return (\n !!inUseTrack &&\n inUseTrack.kind === captionsOrSubtitlesFromCharacteristics(manifestTrack) &&\n subtitleTrackMatchesTextTrack(manifestTrack, inUseTrack)\n );\n}\n\nfunction intersection(x1: number, x2: number, y1: number, y2: number): number {\n return Math.min(x2, y2) - Math.max(x1, y1);\n}\n\nfunction newVTTCCs(): VTTCCs {\n return {\n ccOffset: 0,\n presentationOffset: 0,\n 0: {\n start: 0,\n prevCC: -1,\n new: true,\n },\n };\n}\n","/*\n * cap stream level to media size dimension controller\n */\n\nimport { Events } from '../events';\nimport type { Level } from '../types/level';\nimport type {\n ManifestParsedData,\n BufferCodecsData,\n MediaAttachingData,\n FPSDropLevelCappingData,\n LevelsUpdatedData,\n} from '../types/events';\nimport StreamController from './stream-controller';\nimport { logger } from '../utils/logger';\nimport type { ComponentAPI } from '../types/component-api';\nimport type Hls from '../hls';\n\ntype RestrictedLevel = { width: number; height: number; bitrate: number };\nclass CapLevelController implements ComponentAPI {\n private hls: Hls;\n private autoLevelCapping: number;\n private firstLevel: number;\n private media: HTMLVideoElement | null;\n private restrictedLevels: RestrictedLevel[];\n private timer: number | undefined;\n private clientRect: { width: number; height: number } | null;\n private streamController?: StreamController;\n\n constructor(hls: Hls) {\n this.hls = hls;\n this.autoLevelCapping = Number.POSITIVE_INFINITY;\n this.firstLevel = -1;\n this.media = null;\n this.restrictedLevels = [];\n this.timer = undefined;\n this.clientRect = null;\n\n this.registerListeners();\n }\n\n public setStreamController(streamController: StreamController) {\n this.streamController = streamController;\n }\n\n public destroy() {\n if (this.hls) {\n this.unregisterListener();\n }\n if (this.timer) {\n this.stopCapping();\n }\n this.media = null;\n this.clientRect = null;\n // @ts-ignore\n this.hls = this.streamController = null;\n }\n\n protected registerListeners() {\n const { hls } = this;\n hls.on(Events.FPS_DROP_LEVEL_CAPPING, this.onFpsDropLevelCapping, this);\n hls.on(Events.MEDIA_ATTACHING, this.onMediaAttaching, this);\n hls.on(Events.MANIFEST_PARSED, this.onManifestParsed, this);\n hls.on(Events.LEVELS_UPDATED, this.onLevelsUpdated, this);\n hls.on(Events.BUFFER_CODECS, this.onBufferCodecs, this);\n hls.on(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n }\n\n protected unregisterListener() {\n const { hls } = this;\n hls.off(Events.FPS_DROP_LEVEL_CAPPING, this.onFpsDropLevelCapping, this);\n hls.off(Events.MEDIA_ATTACHING, this.onMediaAttaching, this);\n hls.off(Events.MANIFEST_PARSED, this.onManifestParsed, this);\n hls.off(Events.LEVELS_UPDATED, this.onLevelsUpdated, this);\n hls.off(Events.BUFFER_CODECS, this.onBufferCodecs, this);\n hls.off(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n }\n\n protected onFpsDropLevelCapping(\n event: Events.FPS_DROP_LEVEL_CAPPING,\n data: FPSDropLevelCappingData,\n ) {\n // Don't add a restricted level more than once\n const level = this.hls.levels[data.droppedLevel];\n if (this.isLevelAllowed(level)) {\n this.restrictedLevels.push({\n bitrate: level.bitrate,\n height: level.height,\n width: level.width,\n });\n }\n }\n\n protected onMediaAttaching(\n event: Events.MEDIA_ATTACHING,\n data: MediaAttachingData,\n ) {\n this.media = data.media instanceof HTMLVideoElement ? data.media : null;\n this.clientRect = null;\n if (this.timer && this.hls.levels.length) {\n this.detectPlayerSize();\n }\n }\n\n protected onManifestParsed(\n event: Events.MANIFEST_PARSED,\n data: ManifestParsedData,\n ) {\n const hls = this.hls;\n this.restrictedLevels = [];\n this.firstLevel = data.firstLevel;\n if (hls.config.capLevelToPlayerSize && data.video) {\n // Start capping immediately if the manifest has signaled video codecs\n this.startCapping();\n }\n }\n\n private onLevelsUpdated(\n event: Events.LEVELS_UPDATED,\n data: LevelsUpdatedData,\n ) {\n if (this.timer && Number.isFinite(this.autoLevelCapping)) {\n this.detectPlayerSize();\n }\n }\n\n // Only activate capping when playing a video stream; otherwise, multi-bitrate audio-only streams will be restricted\n // to the first level\n protected onBufferCodecs(\n event: Events.BUFFER_CODECS,\n data: BufferCodecsData,\n ) {\n const hls = this.hls;\n if (hls.config.capLevelToPlayerSize && data.video) {\n // If the manifest did not signal a video codec capping has been deferred until we're certain video is present\n this.startCapping();\n }\n }\n\n protected onMediaDetaching() {\n this.stopCapping();\n }\n\n detectPlayerSize() {\n if (this.media) {\n if (this.mediaHeight <= 0 || this.mediaWidth <= 0) {\n this.clientRect = null;\n return;\n }\n const levels = this.hls.levels;\n if (levels.length) {\n const hls = this.hls;\n const maxLevel = this.getMaxLevel(levels.length - 1);\n if (maxLevel !== this.autoLevelCapping) {\n logger.log(\n `Setting autoLevelCapping to ${maxLevel}: ${levels[maxLevel].height}p@${levels[maxLevel].bitrate} for media ${this.mediaWidth}x${this.mediaHeight}`,\n );\n }\n hls.autoLevelCapping = maxLevel;\n if (\n hls.autoLevelCapping > this.autoLevelCapping &&\n this.streamController\n ) {\n // if auto level capping has a higher value for the previous one, flush the buffer using nextLevelSwitch\n // usually happen when the user go to the fullscreen mode.\n this.streamController.nextLevelSwitch();\n }\n this.autoLevelCapping = hls.autoLevelCapping;\n }\n }\n }\n\n /*\n * returns level should be the one with the dimensions equal or greater than the media (player) dimensions (so the video will be downscaled)\n */\n getMaxLevel(capLevelIndex: number): number {\n const levels = this.hls.levels;\n if (!levels.length) {\n return -1;\n }\n\n const validLevels = levels.filter(\n (level, index) => this.isLevelAllowed(level) && index <= capLevelIndex,\n );\n\n this.clientRect = null;\n return CapLevelController.getMaxLevelByMediaSize(\n validLevels,\n this.mediaWidth,\n this.mediaHeight,\n );\n }\n\n startCapping() {\n if (this.timer) {\n // Don't reset capping if started twice; this can happen if the manifest signals a video codec\n return;\n }\n this.autoLevelCapping = Number.POSITIVE_INFINITY;\n self.clearInterval(this.timer);\n this.timer = self.setInterval(this.detectPlayerSize.bind(this), 1000);\n this.detectPlayerSize();\n }\n\n stopCapping() {\n this.restrictedLevels = [];\n this.firstLevel = -1;\n this.autoLevelCapping = Number.POSITIVE_INFINITY;\n if (this.timer) {\n self.clearInterval(this.timer);\n this.timer = undefined;\n }\n }\n\n getDimensions(): { width: number; height: number } {\n if (this.clientRect) {\n return this.clientRect;\n }\n const media = this.media;\n const boundsRect = {\n width: 0,\n height: 0,\n };\n\n if (media) {\n const clientRect = media.getBoundingClientRect();\n boundsRect.width = clientRect.width;\n boundsRect.height = clientRect.height;\n if (!boundsRect.width && !boundsRect.height) {\n // When the media element has no width or height (equivalent to not being in the DOM),\n // then use its width and height attributes (media.width, media.height)\n boundsRect.width =\n clientRect.right - clientRect.left || media.width || 0;\n boundsRect.height =\n clientRect.bottom - clientRect.top || media.height || 0;\n }\n }\n this.clientRect = boundsRect;\n return boundsRect;\n }\n\n get mediaWidth(): number {\n return this.getDimensions().width * this.contentScaleFactor;\n }\n\n get mediaHeight(): number {\n return this.getDimensions().height * this.contentScaleFactor;\n }\n\n get contentScaleFactor(): number {\n let pixelRatio = 1;\n if (!this.hls.config.ignoreDevicePixelRatio) {\n try {\n pixelRatio = self.devicePixelRatio;\n } catch (e) {\n /* no-op */\n }\n }\n\n return pixelRatio;\n }\n\n private isLevelAllowed(level: Level): boolean {\n const restrictedLevels = this.restrictedLevels;\n return !restrictedLevels.some((restrictedLevel) => {\n return (\n level.bitrate === restrictedLevel.bitrate &&\n level.width === restrictedLevel.width &&\n level.height === restrictedLevel.height\n );\n });\n }\n\n static getMaxLevelByMediaSize(\n levels: Array<Level>,\n width: number,\n height: number,\n ): number {\n if (!levels?.length) {\n return -1;\n }\n\n // Levels can have the same dimensions but differing bandwidths - since levels are ordered, we can look to the next\n // to determine whether we've chosen the greatest bandwidth for the media's dimensions\n const atGreatestBandwidth = (\n curLevel: Level,\n nextLevel: Level | undefined,\n ) => {\n if (!nextLevel) {\n return true;\n }\n\n return (\n curLevel.width !== nextLevel.width ||\n curLevel.height !== nextLevel.height\n );\n };\n\n // If we run through the loop without breaking, the media's dimensions are greater than every level, so default to\n // the max level\n let maxLevelIndex = levels.length - 1;\n // Prevent changes in aspect-ratio from causing capping to toggle back and forth\n const squareSize = Math.max(width, height);\n for (let i = 0; i < levels.length; i += 1) {\n const level = levels[i];\n if (\n (level.width >= squareSize || level.height >= squareSize) &&\n atGreatestBandwidth(level, levels[i + 1])\n ) {\n maxLevelIndex = i;\n break;\n }\n }\n\n return maxLevelIndex;\n }\n}\n\nexport default CapLevelController;\n","import { Events } from '../events';\nimport { logger } from '../utils/logger';\nimport type { ComponentAPI } from '../types/component-api';\nimport type Hls from '../hls';\nimport type { MediaAttachingData } from '../types/events';\nimport StreamController from './stream-controller';\n\nclass FPSController implements ComponentAPI {\n private hls: Hls;\n private isVideoPlaybackQualityAvailable: boolean = false;\n private timer?: number;\n private media: HTMLVideoElement | null = null;\n private lastTime: any;\n private lastDroppedFrames: number = 0;\n private lastDecodedFrames: number = 0;\n // stream controller must be provided as a dependency!\n private streamController!: StreamController;\n\n constructor(hls: Hls) {\n this.hls = hls;\n\n this.registerListeners();\n }\n\n public setStreamController(streamController: StreamController) {\n this.streamController = streamController;\n }\n\n protected registerListeners() {\n this.hls.on(Events.MEDIA_ATTACHING, this.onMediaAttaching, this);\n }\n\n protected unregisterListeners() {\n this.hls.off(Events.MEDIA_ATTACHING, this.onMediaAttaching, this);\n }\n\n destroy() {\n if (this.timer) {\n clearInterval(this.timer);\n }\n\n this.unregisterListeners();\n this.isVideoPlaybackQualityAvailable = false;\n this.media = null;\n }\n\n protected onMediaAttaching(\n event: Events.MEDIA_ATTACHING,\n data: MediaAttachingData,\n ) {\n const config = this.hls.config;\n if (config.capLevelOnFPSDrop) {\n const media =\n data.media instanceof self.HTMLVideoElement ? data.media : null;\n this.media = media;\n if (media && typeof media.getVideoPlaybackQuality === 'function') {\n this.isVideoPlaybackQualityAvailable = true;\n }\n\n self.clearInterval(this.timer);\n this.timer = self.setInterval(\n this.checkFPSInterval.bind(this),\n config.fpsDroppedMonitoringPeriod,\n );\n }\n }\n\n checkFPS(\n video: HTMLVideoElement,\n decodedFrames: number,\n droppedFrames: number,\n ) {\n const currentTime = performance.now();\n if (decodedFrames) {\n if (this.lastTime) {\n const currentPeriod = currentTime - this.lastTime;\n const currentDropped = droppedFrames - this.lastDroppedFrames;\n const currentDecoded = decodedFrames - this.lastDecodedFrames;\n const droppedFPS = (1000 * currentDropped) / currentPeriod;\n const hls = this.hls;\n hls.trigger(Events.FPS_DROP, {\n currentDropped: currentDropped,\n currentDecoded: currentDecoded,\n totalDroppedFrames: droppedFrames,\n });\n if (droppedFPS > 0) {\n // logger.log('checkFPS : droppedFPS/decodedFPS:' + droppedFPS/(1000 * currentDecoded / currentPeriod));\n if (\n currentDropped >\n hls.config.fpsDroppedMonitoringThreshold * currentDecoded\n ) {\n let currentLevel = hls.currentLevel;\n logger.warn(\n 'drop FPS ratio greater than max allowed value for currentLevel: ' +\n currentLevel,\n );\n if (\n currentLevel > 0 &&\n (hls.autoLevelCapping === -1 ||\n hls.autoLevelCapping >= currentLevel)\n ) {\n currentLevel = currentLevel - 1;\n hls.trigger(Events.FPS_DROP_LEVEL_CAPPING, {\n level: currentLevel,\n droppedLevel: hls.currentLevel,\n });\n hls.autoLevelCapping = currentLevel;\n this.streamController.nextLevelSwitch();\n }\n }\n }\n }\n this.lastTime = currentTime;\n this.lastDroppedFrames = droppedFrames;\n this.lastDecodedFrames = decodedFrames;\n }\n }\n\n checkFPSInterval() {\n const video = this.media;\n if (video) {\n if (this.isVideoPlaybackQualityAvailable) {\n const videoPlaybackQuality = video.getVideoPlaybackQuality();\n this.checkFPS(\n video,\n videoPlaybackQuality.totalVideoFrames,\n videoPlaybackQuality.droppedVideoFrames,\n );\n } else {\n // HTMLVideoElement doesn't include the webkit types\n this.checkFPS(\n video,\n (video as any).webkitDecodedFrameCount as number,\n (video as any).webkitDroppedFrameCount as number,\n );\n }\n }\n }\n}\n\nexport default FPSController;\n","/**\n * @author Stephan Hesse <disparat@gmail.com> | <tchakabam@gmail.com>\n *\n * DRM support for Hls.js\n */\nimport { Events } from '../events';\nimport { ErrorTypes, ErrorDetails } from '../errors';\nimport { logger } from '../utils/logger';\nimport {\n getKeySystemsForConfig,\n getSupportedMediaKeySystemConfigurations,\n keySystemFormatToKeySystemDomain,\n keySystemIdToKeySystemDomain,\n KeySystems,\n keySystemDomainToKeySystemFormat as keySystemToKeySystemFormat,\n parsePlayReadyWRM,\n requestMediaKeySystemAccess,\n} from '../utils/mediakeys-helper';\nimport { strToUtf8array } from '../utils/keysystem-util';\nimport { base64Decode } from '../utils/numeric-encoding-utils';\nimport { DecryptData, LevelKey } from '../loader/level-key';\nimport Hex from '../utils/hex';\nimport {\n bin2str,\n parseMultiPssh,\n parseSinf,\n PsshData,\n PsshInvalidResult,\n} from '../utils/mp4-tools';\nimport { EventEmitter } from 'eventemitter3';\nimport type Hls from '../hls';\nimport type { ComponentAPI } from '../types/component-api';\nimport type {\n MediaAttachedData,\n KeyLoadedData,\n ErrorData,\n ManifestLoadedData,\n} from '../types/events';\nimport type { EMEControllerConfig, HlsConfig, LoadPolicy } from '../config';\nimport type { Fragment } from '../loader/fragment';\nimport type {\n Loader,\n LoaderCallbacks,\n LoaderConfiguration,\n LoaderContext,\n} from '../types/loader';\nimport type { KeySystemFormats } from '../utils/mediakeys-helper';\n\nconst LOGGER_PREFIX = '[eme]';\n\ninterface KeySystemAccessPromises {\n keySystemAccess: Promise<MediaKeySystemAccess>;\n mediaKeys?: Promise<MediaKeys>;\n certificate?: Promise<BufferSource | void>;\n}\n\nexport interface MediaKeySessionContext {\n keySystem: KeySystems;\n mediaKeys: MediaKeys;\n decryptdata: LevelKey;\n mediaKeysSession: MediaKeySession;\n keyStatus: MediaKeyStatus;\n licenseXhr?: XMLHttpRequest;\n _onmessage?: (this: MediaKeySession, ev: MediaKeyMessageEvent) => any;\n _onkeystatuseschange?: (this: MediaKeySession, ev: Event) => any;\n}\n\n/**\n * Controller to deal with encrypted media extensions (EME)\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Encrypted_Media_Extensions_API\n *\n * @class\n * @constructor\n */\nclass EMEController implements ComponentAPI {\n public static CDMCleanupPromise: Promise<void> | void;\n\n private readonly hls: Hls;\n private readonly config: EMEControllerConfig & {\n loader: { new (confg: HlsConfig): Loader<LoaderContext> };\n certLoadPolicy: LoadPolicy;\n keyLoadPolicy: LoadPolicy;\n };\n private media: HTMLMediaElement | null = null;\n private keyFormatPromise: Promise<KeySystemFormats> | null = null;\n private keySystemAccessPromises: {\n [keysystem: string]: KeySystemAccessPromises;\n } = {};\n private _requestLicenseFailureCount: number = 0;\n private mediaKeySessions: MediaKeySessionContext[] = [];\n private keyIdToKeySessionPromise: {\n [keyId: string]: Promise<MediaKeySessionContext>;\n } = {};\n private setMediaKeysQueue: Promise<void>[] = EMEController.CDMCleanupPromise\n ? [EMEController.CDMCleanupPromise]\n : [];\n\n private debug: (msg: any) => void = logger.debug.bind(logger, LOGGER_PREFIX);\n private log: (msg: any) => void = logger.log.bind(logger, LOGGER_PREFIX);\n private warn: (msg: any) => void = logger.warn.bind(logger, LOGGER_PREFIX);\n private error: (msg: any) => void = logger.error.bind(logger, LOGGER_PREFIX);\n\n constructor(hls: Hls) {\n this.hls = hls;\n this.config = hls.config;\n this.registerListeners();\n }\n\n public destroy() {\n this.unregisterListeners();\n this.onMediaDetached();\n // Remove any references that could be held in config options or callbacks\n const config = this.config;\n config.requestMediaKeySystemAccessFunc = null;\n config.licenseXhrSetup = config.licenseResponseCallback = undefined;\n config.drmSystems = config.drmSystemOptions = {};\n // @ts-ignore\n this.hls = this.config = this.keyIdToKeySessionPromise = null;\n // @ts-ignore\n this.onMediaEncrypted = this.onWaitingForKey = null;\n }\n\n private registerListeners() {\n this.hls.on(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n this.hls.on(Events.MEDIA_DETACHED, this.onMediaDetached, this);\n this.hls.on(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n this.hls.on(Events.MANIFEST_LOADED, this.onManifestLoaded, this);\n }\n\n private unregisterListeners() {\n this.hls.off(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n this.hls.off(Events.MEDIA_DETACHED, this.onMediaDetached, this);\n this.hls.off(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n this.hls.off(Events.MANIFEST_LOADED, this.onManifestLoaded, this);\n }\n\n private getLicenseServerUrl(keySystem: KeySystems): string | undefined {\n const { drmSystems, widevineLicenseUrl } = this.config;\n const keySystemConfiguration = drmSystems[keySystem];\n\n if (keySystemConfiguration) {\n return keySystemConfiguration.licenseUrl;\n }\n\n // For backward compatibility\n if (keySystem === KeySystems.WIDEVINE && widevineLicenseUrl) {\n return widevineLicenseUrl;\n }\n }\n\n private getLicenseServerUrlOrThrow(keySystem: KeySystems): string | never {\n const url = this.getLicenseServerUrl(keySystem);\n if (url === undefined) {\n throw new Error(\n `no license server URL configured for key-system \"${keySystem}\"`,\n );\n }\n return url;\n }\n\n private getServerCertificateUrl(keySystem: KeySystems): string | void {\n const { drmSystems } = this.config;\n const keySystemConfiguration = drmSystems[keySystem];\n\n if (keySystemConfiguration) {\n return keySystemConfiguration.serverCertificateUrl;\n } else {\n this.log(`No Server Certificate in config.drmSystems[\"${keySystem}\"]`);\n }\n }\n\n private attemptKeySystemAccess(\n keySystemsToAttempt: KeySystems[],\n ): Promise<{ keySystem: KeySystems; mediaKeys: MediaKeys }> {\n const levels = this.hls.levels;\n const uniqueCodec = (value: string | undefined, i, a): value is string =>\n !!value && a.indexOf(value) === i;\n const audioCodecs = levels\n .map((level) => level.audioCodec)\n .filter(uniqueCodec);\n const videoCodecs = levels\n .map((level) => level.videoCodec)\n .filter(uniqueCodec);\n if (audioCodecs.length + videoCodecs.length === 0) {\n videoCodecs.push('avc1.42e01e');\n }\n\n return new Promise(\n (\n resolve: (result: {\n keySystem: KeySystems;\n mediaKeys: MediaKeys;\n }) => void,\n reject: (Error) => void,\n ) => {\n const attempt = (keySystems) => {\n const keySystem = keySystems.shift();\n this.getMediaKeysPromise(keySystem, audioCodecs, videoCodecs)\n .then((mediaKeys) => resolve({ keySystem, mediaKeys }))\n .catch((error) => {\n if (keySystems.length) {\n attempt(keySystems);\n } else if (error instanceof EMEKeyError) {\n reject(error);\n } else {\n reject(\n new EMEKeyError(\n {\n type: ErrorTypes.KEY_SYSTEM_ERROR,\n details: ErrorDetails.KEY_SYSTEM_NO_ACCESS,\n error,\n fatal: true,\n },\n error.message,\n ),\n );\n }\n });\n };\n attempt(keySystemsToAttempt);\n },\n );\n }\n\n private requestMediaKeySystemAccess(\n keySystem: KeySystems,\n supportedConfigurations: MediaKeySystemConfiguration[],\n ): Promise<MediaKeySystemAccess> {\n const { requestMediaKeySystemAccessFunc } = this.config;\n if (!(typeof requestMediaKeySystemAccessFunc === 'function')) {\n let errMessage = `Configured requestMediaKeySystemAccess is not a function ${requestMediaKeySystemAccessFunc}`;\n if (\n requestMediaKeySystemAccess === null &&\n self.location.protocol === 'http:'\n ) {\n errMessage = `navigator.requestMediaKeySystemAccess is not available over insecure protocol ${location.protocol}`;\n }\n return Promise.reject(new Error(errMessage));\n }\n\n return requestMediaKeySystemAccessFunc(keySystem, supportedConfigurations);\n }\n\n private getMediaKeysPromise(\n keySystem: KeySystems,\n audioCodecs: string[],\n videoCodecs: string[],\n ): Promise<MediaKeys> {\n // This can throw, but is caught in event handler callpath\n const mediaKeySystemConfigs = getSupportedMediaKeySystemConfigurations(\n keySystem,\n audioCodecs,\n videoCodecs,\n this.config.drmSystemOptions,\n );\n const keySystemAccessPromises: KeySystemAccessPromises =\n this.keySystemAccessPromises[keySystem];\n let keySystemAccess = keySystemAccessPromises?.keySystemAccess;\n if (!keySystemAccess) {\n this.log(\n `Requesting encrypted media \"${keySystem}\" key-system access with config: ${JSON.stringify(\n mediaKeySystemConfigs,\n )}`,\n );\n keySystemAccess = this.requestMediaKeySystemAccess(\n keySystem,\n mediaKeySystemConfigs,\n );\n const keySystemAccessPromises: KeySystemAccessPromises =\n (this.keySystemAccessPromises[keySystem] = {\n keySystemAccess,\n });\n keySystemAccess.catch((error) => {\n this.log(\n `Failed to obtain access to key-system \"${keySystem}\": ${error}`,\n );\n });\n return keySystemAccess.then((mediaKeySystemAccess) => {\n this.log(\n `Access for key-system \"${mediaKeySystemAccess.keySystem}\" obtained`,\n );\n\n const certificateRequest = this.fetchServerCertificate(keySystem);\n\n this.log(`Create media-keys for \"${keySystem}\"`);\n keySystemAccessPromises.mediaKeys = mediaKeySystemAccess\n .createMediaKeys()\n .then((mediaKeys) => {\n this.log(`Media-keys created for \"${keySystem}\"`);\n return certificateRequest.then((certificate) => {\n if (certificate) {\n return this.setMediaKeysServerCertificate(\n mediaKeys,\n keySystem,\n certificate,\n );\n }\n return mediaKeys;\n });\n });\n\n keySystemAccessPromises.mediaKeys.catch((error) => {\n this.error(\n `Failed to create media-keys for \"${keySystem}\"}: ${error}`,\n );\n });\n\n return keySystemAccessPromises.mediaKeys;\n });\n }\n return keySystemAccess.then(() => keySystemAccessPromises.mediaKeys!);\n }\n\n private createMediaKeySessionContext({\n decryptdata,\n keySystem,\n mediaKeys,\n }: {\n decryptdata: LevelKey;\n keySystem: KeySystems;\n mediaKeys: MediaKeys;\n }): MediaKeySessionContext {\n this.log(\n `Creating key-system session \"${keySystem}\" keyId: ${Hex.hexDump(\n decryptdata.keyId! || [],\n )}`,\n );\n\n const mediaKeysSession = mediaKeys.createSession();\n\n const mediaKeySessionContext: MediaKeySessionContext = {\n decryptdata,\n keySystem,\n mediaKeys,\n mediaKeysSession,\n keyStatus: 'status-pending',\n };\n\n this.mediaKeySessions.push(mediaKeySessionContext);\n\n return mediaKeySessionContext;\n }\n\n private renewKeySession(mediaKeySessionContext: MediaKeySessionContext) {\n const decryptdata = mediaKeySessionContext.decryptdata;\n if (decryptdata.pssh) {\n const keySessionContext = this.createMediaKeySessionContext(\n mediaKeySessionContext,\n );\n const keyId = this.getKeyIdString(decryptdata);\n const scheme = 'cenc';\n this.keyIdToKeySessionPromise[keyId] =\n this.generateRequestWithPreferredKeySession(\n keySessionContext,\n scheme,\n decryptdata.pssh,\n 'expired',\n );\n } else {\n this.warn(`Could not renew expired session. Missing pssh initData.`);\n }\n this.removeSession(mediaKeySessionContext);\n }\n\n private getKeyIdString(decryptdata: DecryptData | undefined): string | never {\n if (!decryptdata) {\n throw new Error('Could not read keyId of undefined decryptdata');\n }\n if (decryptdata.keyId === null) {\n throw new Error('keyId is null');\n }\n return Hex.hexDump(decryptdata.keyId);\n }\n\n private updateKeySession(\n mediaKeySessionContext: MediaKeySessionContext,\n data: Uint8Array,\n ): Promise<void> {\n const keySession = mediaKeySessionContext.mediaKeysSession;\n this.log(\n `Updating key-session \"${keySession.sessionId}\" for keyID ${Hex.hexDump(\n mediaKeySessionContext.decryptdata?.keyId! || [],\n )}\n } (data length: ${data ? data.byteLength : data})`,\n );\n return keySession.update(data);\n }\n\n public selectKeySystemFormat(frag: Fragment): Promise<KeySystemFormats> {\n const keyFormats = Object.keys(frag.levelkeys || {}) as KeySystemFormats[];\n if (!this.keyFormatPromise) {\n this.log(\n `Selecting key-system from fragment (sn: ${frag.sn} ${frag.type}: ${\n frag.level\n }) key formats ${keyFormats.join(', ')}`,\n );\n this.keyFormatPromise = this.getKeyFormatPromise(keyFormats);\n }\n return this.keyFormatPromise;\n }\n\n private getKeyFormatPromise(\n keyFormats: KeySystemFormats[],\n ): Promise<KeySystemFormats> {\n return new Promise((resolve, reject) => {\n const keySystemsInConfig = getKeySystemsForConfig(this.config);\n const keySystemsToAttempt = keyFormats\n .map(keySystemFormatToKeySystemDomain)\n .filter(\n (value) => !!value && keySystemsInConfig.indexOf(value) !== -1,\n ) as any as KeySystems[];\n return this.getKeySystemSelectionPromise(keySystemsToAttempt)\n .then(({ keySystem }) => {\n const keySystemFormat = keySystemToKeySystemFormat(keySystem);\n if (keySystemFormat) {\n resolve(keySystemFormat);\n } else {\n reject(\n new Error(`Unable to find format for key-system \"${keySystem}\"`),\n );\n }\n })\n .catch(reject);\n });\n }\n\n public loadKey(data: KeyLoadedData): Promise<MediaKeySessionContext> {\n const decryptdata = data.keyInfo.decryptdata;\n\n const keyId = this.getKeyIdString(decryptdata);\n const keyDetails = `(keyId: ${keyId} format: \"${decryptdata.keyFormat}\" method: ${decryptdata.method} uri: ${decryptdata.uri})`;\n\n this.log(`Starting session for key ${keyDetails}`);\n\n let keySessionContextPromise = this.keyIdToKeySessionPromise[keyId];\n if (!keySessionContextPromise) {\n keySessionContextPromise = this.keyIdToKeySessionPromise[keyId] =\n this.getKeySystemForKeyPromise(decryptdata).then(\n ({ keySystem, mediaKeys }) => {\n this.throwIfDestroyed();\n this.log(\n `Handle encrypted media sn: ${data.frag.sn} ${data.frag.type}: ${data.frag.level} using key ${keyDetails}`,\n );\n\n return this.attemptSetMediaKeys(keySystem, mediaKeys).then(() => {\n this.throwIfDestroyed();\n const keySessionContext = this.createMediaKeySessionContext({\n keySystem,\n mediaKeys,\n decryptdata,\n });\n const scheme = 'cenc';\n return this.generateRequestWithPreferredKeySession(\n keySessionContext,\n scheme,\n decryptdata.pssh,\n 'playlist-key',\n );\n });\n },\n );\n\n keySessionContextPromise.catch((error) => this.handleError(error));\n }\n\n return keySessionContextPromise;\n }\n\n private throwIfDestroyed(message = 'Invalid state'): void | never {\n if (!this.hls) {\n throw new Error('invalid state');\n }\n }\n\n private handleError(error: EMEKeyError | Error) {\n if (!this.hls) {\n return;\n }\n this.error(error.message);\n if (error instanceof EMEKeyError) {\n this.hls.trigger(Events.ERROR, error.data);\n } else {\n this.hls.trigger(Events.ERROR, {\n type: ErrorTypes.KEY_SYSTEM_ERROR,\n details: ErrorDetails.KEY_SYSTEM_NO_KEYS,\n error,\n fatal: true,\n });\n }\n }\n\n private getKeySystemForKeyPromise(\n decryptdata: LevelKey,\n ): Promise<{ keySystem: KeySystems; mediaKeys: MediaKeys }> {\n const keyId = this.getKeyIdString(decryptdata);\n const mediaKeySessionContext = this.keyIdToKeySessionPromise[keyId];\n if (!mediaKeySessionContext) {\n const keySystem = keySystemFormatToKeySystemDomain(\n decryptdata.keyFormat as KeySystemFormats,\n );\n const keySystemsToAttempt = keySystem\n ? [keySystem]\n : getKeySystemsForConfig(this.config);\n return this.attemptKeySystemAccess(keySystemsToAttempt);\n }\n return mediaKeySessionContext;\n }\n\n private getKeySystemSelectionPromise(\n keySystemsToAttempt: KeySystems[],\n ): Promise<{ keySystem: KeySystems; mediaKeys: MediaKeys }> | never {\n if (!keySystemsToAttempt.length) {\n keySystemsToAttempt = getKeySystemsForConfig(this.config);\n }\n if (keySystemsToAttempt.length === 0) {\n throw new EMEKeyError(\n {\n type: ErrorTypes.KEY_SYSTEM_ERROR,\n details: ErrorDetails.KEY_SYSTEM_NO_CONFIGURED_LICENSE,\n fatal: true,\n },\n `Missing key-system license configuration options ${JSON.stringify({\n drmSystems: this.config.drmSystems,\n })}`,\n );\n }\n return this.attemptKeySystemAccess(keySystemsToAttempt);\n }\n\n private onMediaEncrypted = (event: MediaEncryptedEvent) => {\n const { initDataType, initData } = event;\n const logMessage = `\"${event.type}\" event: init data type: \"${initDataType}\"`;\n this.debug(logMessage);\n\n // Ignore event when initData is null\n if (initData === null) {\n return;\n }\n\n if (!this.keyFormatPromise) {\n let keySystems = Object.keys(\n this.keySystemAccessPromises,\n ) as KeySystems[];\n if (!keySystems.length) {\n keySystems = getKeySystemsForConfig(this.config);\n }\n const keyFormats = keySystems\n .map(keySystemToKeySystemFormat)\n .filter((k) => !!k) as KeySystemFormats[];\n this.keyFormatPromise = this.getKeyFormatPromise(keyFormats);\n }\n\n this.keyFormatPromise.then((keySystemFormat) => {\n const keySystem = keySystemFormatToKeySystemDomain(keySystemFormat);\n\n let keyId: Uint8Array | null | undefined;\n let keySystemDomain: KeySystems | undefined;\n\n if (initDataType === 'sinf') {\n if (keySystem !== KeySystems.FAIRPLAY) {\n this.warn(\n `Ignoring unexpected \"${event.type}\" event with init data type: \"${initDataType}\" for selected key-system ${keySystem}`,\n );\n return;\n }\n // Match sinf keyId to playlist skd://keyId=\n const json = bin2str(new Uint8Array(initData));\n try {\n const sinf = base64Decode(JSON.parse(json).sinf);\n const tenc = parseSinf(sinf);\n if (!tenc) {\n throw new Error(\n `'schm' box missing or not cbcs/cenc with schi > tenc`,\n );\n }\n keyId = tenc.subarray(8, 24);\n keySystemDomain = KeySystems.FAIRPLAY;\n } catch (error) {\n this.warn(`${logMessage} Failed to parse sinf: ${error}`);\n return;\n }\n } else {\n if (\n keySystem !== KeySystems.WIDEVINE &&\n keySystem !== KeySystems.PLAYREADY\n ) {\n this.warn(\n `Ignoring unexpected \"${event.type}\" event with init data type: \"${initDataType}\" for selected key-system ${keySystem}`,\n );\n return;\n }\n // Support Widevine/PlayReady clear-lead key-session creation (otherwise depend on playlist keys)\n const psshResults = parseMultiPssh(initData);\n\n const psshInfos = psshResults.filter(\n (pssh): pssh is PsshData =>\n !!pssh.systemId &&\n keySystemIdToKeySystemDomain(pssh.systemId) === keySystem,\n );\n\n if (psshInfos.length > 1) {\n this.warn(\n `${logMessage} Using first of ${psshInfos.length} pssh found for selected key-system ${keySystem}`,\n );\n }\n\n const psshInfo = psshInfos[0];\n\n if (!psshInfo) {\n if (\n psshResults.length === 0 ||\n psshResults.some(\n (pssh): pssh is PsshInvalidResult => !pssh.systemId,\n )\n ) {\n this.warn(`${logMessage} contains incomplete or invalid pssh data`);\n } else {\n this.log(\n `ignoring ${logMessage} for ${(psshResults as PsshData[])\n .map((pssh) => keySystemIdToKeySystemDomain(pssh.systemId))\n .join(',')} pssh data in favor of playlist keys`,\n );\n }\n return;\n }\n\n keySystemDomain = keySystemIdToKeySystemDomain(psshInfo.systemId);\n if (psshInfo.version === 0 && psshInfo.data) {\n if (keySystemDomain === KeySystems.WIDEVINE) {\n const offset = psshInfo.data.length - 22;\n keyId = psshInfo.data.subarray(offset, offset + 16);\n } else if (keySystemDomain === KeySystems.PLAYREADY) {\n keyId = parsePlayReadyWRM(psshInfo.data);\n }\n }\n }\n\n if (!keySystemDomain || !keyId) {\n this.log(`Unable to handle ${logMessage} with key-system ${keySystem}`);\n return;\n }\n\n const keyIdHex = Hex.hexDump(keyId);\n const { keyIdToKeySessionPromise, mediaKeySessions } = this;\n\n let keySessionContextPromise = keyIdToKeySessionPromise[keyIdHex];\n for (let i = 0; i < mediaKeySessions.length; i++) {\n // Match playlist key\n const keyContext = mediaKeySessions[i];\n const decryptdata = keyContext.decryptdata;\n if (!decryptdata.keyId) {\n continue;\n }\n const oldKeyIdHex = Hex.hexDump(decryptdata.keyId);\n if (\n keyIdHex === oldKeyIdHex ||\n decryptdata.uri.replace(/-/g, '').indexOf(keyIdHex) !== -1\n ) {\n keySessionContextPromise = keyIdToKeySessionPromise[oldKeyIdHex];\n if (decryptdata.pssh) {\n break;\n }\n delete keyIdToKeySessionPromise[oldKeyIdHex];\n decryptdata.pssh = new Uint8Array(initData);\n decryptdata.keyId = keyId;\n keySessionContextPromise = keyIdToKeySessionPromise[keyIdHex] =\n keySessionContextPromise.then(() => {\n return this.generateRequestWithPreferredKeySession(\n keyContext,\n initDataType,\n initData,\n 'encrypted-event-key-match',\n );\n });\n keySessionContextPromise.catch((error) => this.handleError(error));\n break;\n }\n }\n\n if (!keySessionContextPromise) {\n if (keySystemDomain !== keySystem) {\n this.log(\n `Ignoring \"${logMessage}\" with ${keySystemDomain} init data for selected key-system ${keySystem}`,\n );\n return;\n }\n // \"Clear-lead\" (misc key not encountered in playlist)\n keySessionContextPromise = keyIdToKeySessionPromise[keyIdHex] =\n this.getKeySystemSelectionPromise([keySystemDomain]).then(\n ({ keySystem, mediaKeys }) => {\n this.throwIfDestroyed();\n\n const decryptdata = new LevelKey(\n 'ISO-23001-7',\n keyIdHex,\n keySystemToKeySystemFormat(keySystem) ?? '',\n );\n decryptdata.pssh = new Uint8Array(initData);\n decryptdata.keyId = keyId as Uint8Array;\n return this.attemptSetMediaKeys(keySystem, mediaKeys).then(() => {\n this.throwIfDestroyed();\n const keySessionContext = this.createMediaKeySessionContext({\n decryptdata,\n keySystem,\n mediaKeys,\n });\n return this.generateRequestWithPreferredKeySession(\n keySessionContext,\n initDataType,\n initData,\n 'encrypted-event-no-match',\n );\n });\n },\n );\n\n keySessionContextPromise.catch((error) => this.handleError(error));\n }\n });\n };\n\n private onWaitingForKey = (event: Event) => {\n this.log(`\"${event.type}\" event`);\n };\n\n private attemptSetMediaKeys(\n keySystem: KeySystems,\n mediaKeys: MediaKeys,\n ): Promise<void> {\n const queue = this.setMediaKeysQueue.slice();\n\n this.log(`Setting media-keys for \"${keySystem}\"`);\n // Only one setMediaKeys() can run at one time, and multiple setMediaKeys() operations\n // can be queued for execution for multiple key sessions.\n const setMediaKeysPromise = Promise.all(queue).then(() => {\n if (!this.media) {\n throw new Error(\n 'Attempted to set mediaKeys without media element attached',\n );\n }\n return this.media.setMediaKeys(mediaKeys);\n });\n this.setMediaKeysQueue.push(setMediaKeysPromise);\n return setMediaKeysPromise.then(() => {\n this.log(`Media-keys set for \"${keySystem}\"`);\n queue.push(setMediaKeysPromise!);\n this.setMediaKeysQueue = this.setMediaKeysQueue.filter(\n (p) => queue.indexOf(p) === -1,\n );\n });\n }\n\n private generateRequestWithPreferredKeySession(\n context: MediaKeySessionContext,\n initDataType: string,\n initData: ArrayBuffer | null,\n reason:\n | 'playlist-key'\n | 'encrypted-event-key-match'\n | 'encrypted-event-no-match'\n | 'expired',\n ): Promise<MediaKeySessionContext> | never {\n const generateRequestFilter =\n this.config.drmSystems?.[context.keySystem]?.generateRequest;\n if (generateRequestFilter) {\n try {\n const mappedInitData: ReturnType<typeof generateRequestFilter> =\n generateRequestFilter.call(this.hls, initDataType, initData, context);\n if (!mappedInitData) {\n throw new Error(\n 'Invalid response from configured generateRequest filter',\n );\n }\n initDataType = mappedInitData.initDataType;\n initData = context.decryptdata.pssh = mappedInitData.initData\n ? new Uint8Array(mappedInitData.initData)\n : null;\n } catch (error) {\n this.warn(error.message);\n if (this.hls?.config.debug) {\n throw error;\n }\n }\n }\n\n if (initData === null) {\n this.log(`Skipping key-session request for \"${reason}\" (no initData)`);\n return Promise.resolve(context);\n }\n\n const keyId = this.getKeyIdString(context.decryptdata);\n this.log(\n `Generating key-session request for \"${reason}\": ${keyId} (init data type: ${initDataType} length: ${\n initData ? initData.byteLength : null\n })`,\n );\n\n const licenseStatus = new EventEmitter();\n\n const onmessage = (context._onmessage = (event: MediaKeyMessageEvent) => {\n const keySession = context.mediaKeysSession;\n if (!keySession) {\n licenseStatus.emit('error', new Error('invalid state'));\n return;\n }\n const { messageType, message } = event;\n this.log(\n `\"${messageType}\" message event for session \"${keySession.sessionId}\" message size: ${message.byteLength}`,\n );\n if (\n messageType === 'license-request' ||\n messageType === 'license-renewal'\n ) {\n this.renewLicense(context, message).catch((error) => {\n this.handleError(error);\n licenseStatus.emit('error', error);\n });\n } else if (messageType === 'license-release') {\n if (context.keySystem === KeySystems.FAIRPLAY) {\n this.updateKeySession(context, strToUtf8array('acknowledged'));\n this.removeSession(context);\n }\n } else {\n this.warn(`unhandled media key message type \"${messageType}\"`);\n }\n });\n\n const onkeystatuseschange = (context._onkeystatuseschange = (\n event: Event,\n ) => {\n const keySession = context.mediaKeysSession;\n if (!keySession) {\n licenseStatus.emit('error', new Error('invalid state'));\n return;\n }\n this.onKeyStatusChange(context);\n const keyStatus = context.keyStatus;\n licenseStatus.emit('keyStatus', keyStatus);\n if (keyStatus === 'expired') {\n this.warn(`${context.keySystem} expired for key ${keyId}`);\n this.renewKeySession(context);\n }\n });\n\n context.mediaKeysSession.addEventListener('message', onmessage);\n context.mediaKeysSession.addEventListener(\n 'keystatuseschange',\n onkeystatuseschange,\n );\n\n const keyUsablePromise = new Promise(\n (resolve: (value?: void) => void, reject) => {\n licenseStatus.on('error', reject);\n\n licenseStatus.on('keyStatus', (keyStatus) => {\n if (keyStatus.startsWith('usable')) {\n resolve();\n } else if (keyStatus === 'output-restricted') {\n reject(\n new EMEKeyError(\n {\n type: ErrorTypes.KEY_SYSTEM_ERROR,\n details: ErrorDetails.KEY_SYSTEM_STATUS_OUTPUT_RESTRICTED,\n fatal: false,\n },\n 'HDCP level output restricted',\n ),\n );\n } else if (keyStatus === 'internal-error') {\n reject(\n new EMEKeyError(\n {\n type: ErrorTypes.KEY_SYSTEM_ERROR,\n details: ErrorDetails.KEY_SYSTEM_STATUS_INTERNAL_ERROR,\n fatal: true,\n },\n `key status changed to \"${keyStatus}\"`,\n ),\n );\n } else if (keyStatus === 'expired') {\n reject(new Error('key expired while generating request'));\n } else {\n this.warn(`unhandled key status change \"${keyStatus}\"`);\n }\n });\n },\n );\n\n return context.mediaKeysSession\n .generateRequest(initDataType, initData)\n .then(() => {\n this.log(\n `Request generated for key-session \"${context.mediaKeysSession?.sessionId}\" keyId: ${keyId}`,\n );\n })\n .catch((error) => {\n throw new EMEKeyError(\n {\n type: ErrorTypes.KEY_SYSTEM_ERROR,\n details: ErrorDetails.KEY_SYSTEM_NO_SESSION,\n error,\n fatal: false,\n },\n `Error generating key-session request: ${error}`,\n );\n })\n .then(() => keyUsablePromise)\n .catch((error) => {\n licenseStatus.removeAllListeners();\n this.removeSession(context);\n throw error;\n })\n .then(() => {\n licenseStatus.removeAllListeners();\n return context;\n });\n }\n\n private onKeyStatusChange(mediaKeySessionContext: MediaKeySessionContext) {\n mediaKeySessionContext.mediaKeysSession.keyStatuses.forEach(\n (status: MediaKeyStatus, keyId: BufferSource) => {\n this.log(\n `key status change \"${status}\" for keyStatuses keyId: ${Hex.hexDump(\n 'buffer' in keyId\n ? new Uint8Array(keyId.buffer, keyId.byteOffset, keyId.byteLength)\n : new Uint8Array(keyId),\n )} session keyId: ${Hex.hexDump(\n new Uint8Array(mediaKeySessionContext.decryptdata.keyId || []),\n )} uri: ${mediaKeySessionContext.decryptdata.uri}`,\n );\n mediaKeySessionContext.keyStatus = status;\n },\n );\n }\n\n private fetchServerCertificate(\n keySystem: KeySystems,\n ): Promise<BufferSource | void> {\n const config = this.config;\n const Loader = config.loader;\n const certLoader = new Loader(config as HlsConfig) as Loader<LoaderContext>;\n const url = this.getServerCertificateUrl(keySystem);\n if (!url) {\n return Promise.resolve();\n }\n this.log(`Fetching server certificate for \"${keySystem}\"`);\n return new Promise((resolve, reject) => {\n const loaderContext: LoaderContext = {\n responseType: 'arraybuffer',\n url,\n };\n const loadPolicy = config.certLoadPolicy.default;\n const loaderConfig: LoaderConfiguration = {\n loadPolicy,\n timeout: loadPolicy.maxLoadTimeMs,\n maxRetry: 0,\n retryDelay: 0,\n maxRetryDelay: 0,\n };\n const loaderCallbacks: LoaderCallbacks<LoaderContext> = {\n onSuccess: (response, stats, context, networkDetails) => {\n resolve(response.data as ArrayBuffer);\n },\n onError: (response, contex, networkDetails, stats) => {\n reject(\n new EMEKeyError(\n {\n type: ErrorTypes.KEY_SYSTEM_ERROR,\n details:\n ErrorDetails.KEY_SYSTEM_SERVER_CERTIFICATE_REQUEST_FAILED,\n fatal: true,\n networkDetails,\n response: {\n url: loaderContext.url,\n data: undefined,\n ...response,\n },\n },\n `\"${keySystem}\" certificate request failed (${url}). Status: ${response.code} (${response.text})`,\n ),\n );\n },\n onTimeout: (stats, context, networkDetails) => {\n reject(\n new EMEKeyError(\n {\n type: ErrorTypes.KEY_SYSTEM_ERROR,\n details:\n ErrorDetails.KEY_SYSTEM_SERVER_CERTIFICATE_REQUEST_FAILED,\n fatal: true,\n networkDetails,\n response: {\n url: loaderContext.url,\n data: undefined,\n },\n },\n `\"${keySystem}\" certificate request timed out (${url})`,\n ),\n );\n },\n onAbort: (stats, context, networkDetails) => {\n reject(new Error('aborted'));\n },\n };\n certLoader.load(loaderContext, loaderConfig, loaderCallbacks);\n });\n }\n\n private setMediaKeysServerCertificate(\n mediaKeys: MediaKeys,\n keySystem: KeySystems,\n cert: BufferSource,\n ): Promise<MediaKeys> {\n return new Promise((resolve, reject) => {\n mediaKeys\n .setServerCertificate(cert)\n .then((success) => {\n this.log(\n `setServerCertificate ${\n success ? 'success' : 'not supported by CDM'\n } (${cert?.byteLength}) on \"${keySystem}\"`,\n );\n resolve(mediaKeys);\n })\n .catch((error) => {\n reject(\n new EMEKeyError(\n {\n type: ErrorTypes.KEY_SYSTEM_ERROR,\n details:\n ErrorDetails.KEY_SYSTEM_SERVER_CERTIFICATE_UPDATE_FAILED,\n error,\n fatal: true,\n },\n error.message,\n ),\n );\n });\n });\n }\n\n private renewLicense(\n context: MediaKeySessionContext,\n keyMessage: ArrayBuffer,\n ): Promise<void> {\n return this.requestLicense(context, new Uint8Array(keyMessage)).then(\n (data: ArrayBuffer) => {\n return this.updateKeySession(context, new Uint8Array(data)).catch(\n (error) => {\n throw new EMEKeyError(\n {\n type: ErrorTypes.KEY_SYSTEM_ERROR,\n details: ErrorDetails.KEY_SYSTEM_SESSION_UPDATE_FAILED,\n error,\n fatal: true,\n },\n error.message,\n );\n },\n );\n },\n );\n }\n\n private unpackPlayReadyKeyMessage(\n xhr: XMLHttpRequest,\n licenseChallenge: Uint8Array,\n ): Uint8Array {\n // On Edge, the raw license message is UTF-16-encoded XML. We need\n // to unpack the Challenge element (base64-encoded string containing the\n // actual license request) and any HttpHeader elements (sent as request\n // headers).\n // For PlayReady CDMs, we need to dig the Challenge out of the XML.\n const xmlString = String.fromCharCode.apply(\n null,\n new Uint16Array(licenseChallenge.buffer),\n );\n if (!xmlString.includes('PlayReadyKeyMessage')) {\n // This does not appear to be a wrapped message as on Edge. Some\n // clients do not need this unwrapping, so we will assume this is one of\n // them. Note that \"xml\" at this point probably looks like random\n // garbage, since we interpreted UTF-8 as UTF-16.\n xhr.setRequestHeader('Content-Type', 'text/xml; charset=utf-8');\n return licenseChallenge;\n }\n const keyMessageXml = new DOMParser().parseFromString(\n xmlString,\n 'application/xml',\n );\n // Set request headers.\n const headers = keyMessageXml.querySelectorAll('HttpHeader');\n if (headers.length > 0) {\n let header: Element;\n for (let i = 0, len = headers.length; i < len; i++) {\n header = headers[i];\n const name = header.querySelector('name')?.textContent;\n const value = header.querySelector('value')?.textContent;\n if (name && value) {\n xhr.setRequestHeader(name, value);\n }\n }\n }\n const challengeElement = keyMessageXml.querySelector('Challenge');\n const challengeText = challengeElement?.textContent;\n if (!challengeText) {\n throw new Error(`Cannot find <Challenge> in key message`);\n }\n return strToUtf8array(atob(challengeText));\n }\n\n private setupLicenseXHR(\n xhr: XMLHttpRequest,\n url: string,\n keysListItem: MediaKeySessionContext,\n licenseChallenge: Uint8Array,\n ): Promise<{ xhr: XMLHttpRequest; licenseChallenge: Uint8Array }> {\n const licenseXhrSetup = this.config.licenseXhrSetup;\n\n if (!licenseXhrSetup) {\n xhr.open('POST', url, true);\n\n return Promise.resolve({ xhr, licenseChallenge });\n }\n\n return Promise.resolve()\n .then(() => {\n if (!keysListItem.decryptdata) {\n throw new Error('Key removed');\n }\n return licenseXhrSetup.call(\n this.hls,\n xhr,\n url,\n keysListItem,\n licenseChallenge,\n );\n })\n .catch((error: Error) => {\n if (!keysListItem.decryptdata) {\n // Key session removed. Cancel license request.\n throw error;\n }\n // let's try to open before running setup\n xhr.open('POST', url, true);\n\n return licenseXhrSetup.call(\n this.hls,\n xhr,\n url,\n keysListItem,\n licenseChallenge,\n );\n })\n .then((licenseXhrSetupResult) => {\n // if licenseXhrSetup did not yet call open, let's do it now\n if (!xhr.readyState) {\n xhr.open('POST', url, true);\n }\n const finalLicenseChallenge = licenseXhrSetupResult\n ? licenseXhrSetupResult\n : licenseChallenge;\n return { xhr, licenseChallenge: finalLicenseChallenge };\n });\n }\n\n private requestLicense(\n keySessionContext: MediaKeySessionContext,\n licenseChallenge: Uint8Array,\n ): Promise<ArrayBuffer> {\n const keyLoadPolicy = this.config.keyLoadPolicy.default;\n return new Promise((resolve, reject) => {\n const url = this.getLicenseServerUrlOrThrow(keySessionContext.keySystem);\n this.log(`Sending license request to URL: ${url}`);\n const xhr = new XMLHttpRequest();\n xhr.responseType = 'arraybuffer';\n xhr.onreadystatechange = () => {\n if (!this.hls || !keySessionContext.mediaKeysSession) {\n return reject(new Error('invalid state'));\n }\n if (xhr.readyState === 4) {\n if (xhr.status === 200) {\n this._requestLicenseFailureCount = 0;\n let data = xhr.response;\n this.log(\n `License received ${\n data instanceof ArrayBuffer ? data.byteLength : data\n }`,\n );\n const licenseResponseCallback = this.config.licenseResponseCallback;\n if (licenseResponseCallback) {\n try {\n data = licenseResponseCallback.call(\n this.hls,\n xhr,\n url,\n keySessionContext,\n );\n } catch (error) {\n this.error(error);\n }\n }\n resolve(data);\n } else {\n const retryConfig = keyLoadPolicy.errorRetry;\n const maxNumRetry = retryConfig ? retryConfig.maxNumRetry : 0;\n this._requestLicenseFailureCount++;\n if (\n this._requestLicenseFailureCount > maxNumRetry ||\n (xhr.status >= 400 && xhr.status < 500)\n ) {\n reject(\n new EMEKeyError(\n {\n type: ErrorTypes.KEY_SYSTEM_ERROR,\n details: ErrorDetails.KEY_SYSTEM_LICENSE_REQUEST_FAILED,\n fatal: true,\n networkDetails: xhr,\n response: {\n url,\n data: undefined as any,\n code: xhr.status,\n text: xhr.statusText,\n },\n },\n `License Request XHR failed (${url}). Status: ${xhr.status} (${xhr.statusText})`,\n ),\n );\n } else {\n const attemptsLeft =\n maxNumRetry - this._requestLicenseFailureCount + 1;\n this.warn(\n `Retrying license request, ${attemptsLeft} attempts left`,\n );\n this.requestLicense(keySessionContext, licenseChallenge).then(\n resolve,\n reject,\n );\n }\n }\n }\n };\n if (\n keySessionContext.licenseXhr &&\n keySessionContext.licenseXhr.readyState !== XMLHttpRequest.DONE\n ) {\n keySessionContext.licenseXhr.abort();\n }\n keySessionContext.licenseXhr = xhr;\n\n this.setupLicenseXHR(xhr, url, keySessionContext, licenseChallenge).then(\n ({ xhr, licenseChallenge }) => {\n if (keySessionContext.keySystem == KeySystems.PLAYREADY) {\n licenseChallenge = this.unpackPlayReadyKeyMessage(\n xhr,\n licenseChallenge,\n );\n }\n xhr.send(licenseChallenge);\n },\n );\n });\n }\n\n private onMediaAttached(\n event: Events.MEDIA_ATTACHED,\n data: MediaAttachedData,\n ) {\n if (!this.config.emeEnabled) {\n return;\n }\n\n const media = data.media;\n\n // keep reference of media\n this.media = media;\n\n media.removeEventListener('encrypted', this.onMediaEncrypted);\n media.removeEventListener('waitingforkey', this.onWaitingForKey);\n media.addEventListener('encrypted', this.onMediaEncrypted);\n media.addEventListener('waitingforkey', this.onWaitingForKey);\n }\n\n private onMediaDetached() {\n const media = this.media;\n const mediaKeysList = this.mediaKeySessions;\n if (media) {\n media.removeEventListener('encrypted', this.onMediaEncrypted);\n media.removeEventListener('waitingforkey', this.onWaitingForKey);\n this.media = null;\n }\n\n this._requestLicenseFailureCount = 0;\n this.setMediaKeysQueue = [];\n this.mediaKeySessions = [];\n this.keyIdToKeySessionPromise = {};\n LevelKey.clearKeyUriToKeyIdMap();\n\n // Close all sessions and remove media keys from the video element.\n const keySessionCount = mediaKeysList.length;\n EMEController.CDMCleanupPromise = Promise.all(\n mediaKeysList\n .map((mediaKeySessionContext) =>\n this.removeSession(mediaKeySessionContext),\n )\n .concat(\n media?.setMediaKeys(null).catch((error) => {\n this.log(`Could not clear media keys: ${error}`);\n }),\n ),\n )\n .then(() => {\n if (keySessionCount) {\n this.log('finished closing key sessions and clearing media keys');\n mediaKeysList.length = 0;\n }\n })\n .catch((error) => {\n this.log(`Could not close sessions and clear media keys: ${error}`);\n });\n }\n\n private onManifestLoading() {\n this.keyFormatPromise = null;\n }\n\n private onManifestLoaded(\n event: Events.MANIFEST_LOADED,\n { sessionKeys }: ManifestLoadedData,\n ) {\n if (!sessionKeys || !this.config.emeEnabled) {\n return;\n }\n if (!this.keyFormatPromise) {\n const keyFormats: KeySystemFormats[] = sessionKeys.reduce(\n (formats: KeySystemFormats[], sessionKey: LevelKey) => {\n if (\n formats.indexOf(sessionKey.keyFormat as KeySystemFormats) === -1\n ) {\n formats.push(sessionKey.keyFormat as KeySystemFormats);\n }\n return formats;\n },\n [],\n );\n this.log(\n `Selecting key-system from session-keys ${keyFormats.join(', ')}`,\n );\n this.keyFormatPromise = this.getKeyFormatPromise(keyFormats);\n }\n }\n\n private removeSession(\n mediaKeySessionContext: MediaKeySessionContext,\n ): Promise<void> | void {\n const { mediaKeysSession, licenseXhr } = mediaKeySessionContext;\n if (mediaKeysSession) {\n this.log(\n `Remove licenses and keys and close session ${mediaKeysSession.sessionId}`,\n );\n if (mediaKeySessionContext._onmessage) {\n mediaKeysSession.removeEventListener(\n 'message',\n mediaKeySessionContext._onmessage,\n );\n mediaKeySessionContext._onmessage = undefined;\n }\n if (mediaKeySessionContext._onkeystatuseschange) {\n mediaKeysSession.removeEventListener(\n 'keystatuseschange',\n mediaKeySessionContext._onkeystatuseschange,\n );\n mediaKeySessionContext._onkeystatuseschange = undefined;\n }\n\n if (licenseXhr && licenseXhr.readyState !== XMLHttpRequest.DONE) {\n licenseXhr.abort();\n }\n mediaKeySessionContext.mediaKeysSession =\n mediaKeySessionContext.decryptdata =\n mediaKeySessionContext.licenseXhr =\n undefined!;\n const index = this.mediaKeySessions.indexOf(mediaKeySessionContext);\n if (index > -1) {\n this.mediaKeySessions.splice(index, 1);\n }\n return mediaKeysSession\n .remove()\n .catch((error) => {\n this.log(`Could not remove session: ${error}`);\n })\n .then(() => {\n return mediaKeysSession.close();\n })\n .catch((error) => {\n this.log(`Could not close session: ${error}`);\n });\n }\n }\n}\n\nclass EMEKeyError extends Error {\n public readonly data: ErrorData;\n constructor(\n data: Omit<ErrorData, 'error'> & { error?: Error },\n message: string,\n ) {\n super(message);\n data.error ||= new Error(message);\n this.data = data as ErrorData;\n data.err = data.error;\n }\n}\n\nexport default EMEController;\n","/**\n * Common Media Object Type\n *\n * @group CMCD\n * @group CMSD\n *\n * @beta\n */\nexport var CmObjectType;\n(function (CmObjectType) {\n /**\n * text file, such as a manifest or playlist\n */\n CmObjectType[\"MANIFEST\"] = \"m\";\n /**\n * audio only\n */\n CmObjectType[\"AUDIO\"] = \"a\";\n /**\n * video only\n */\n CmObjectType[\"VIDEO\"] = \"v\";\n /**\n * muxed audio and video\n */\n CmObjectType[\"MUXED\"] = \"av\";\n /**\n * init segment\n */\n CmObjectType[\"INIT\"] = \"i\";\n /**\n * caption or subtitle\n */\n CmObjectType[\"CAPTION\"] = \"c\";\n /**\n * ISOBMFF timed text track\n */\n CmObjectType[\"TIMED_TEXT\"] = \"tt\";\n /**\n * cryptographic key, license or certificate.\n */\n CmObjectType[\"KEY\"] = \"k\";\n /**\n * other\n */\n CmObjectType[\"OTHER\"] = \"o\";\n})(CmObjectType || (CmObjectType = {}));\n//# sourceMappingURL=CmObjectType.js.map","/**\n * Common Media Streaming Format\n *\n * @group CMCD\n * @group CMSD\n *\n * @beta\n */\nexport var CmStreamingFormat;\n(function (CmStreamingFormat) {\n /**\n * MPEG DASH\n */\n CmStreamingFormat[\"DASH\"] = \"d\";\n /**\n * HTTP Live Streaming (HLS)\n */\n CmStreamingFormat[\"HLS\"] = \"h\";\n /**\n * Smooth Streaming\n */\n CmStreamingFormat[\"SMOOTH\"] = \"s\";\n /**\n * Other\n */\n CmStreamingFormat[\"OTHER\"] = \"o\";\n})(CmStreamingFormat || (CmStreamingFormat = {}));\n//# sourceMappingURL=CmStreamingFormat.js.map","/**\n * CMCD header fields.\n *\n * @group CMCD\n *\n * @beta\n */\nexport var CmcdHeaderField;\n(function (CmcdHeaderField) {\n /**\n * keys whose values vary with the object being requested.\n */\n CmcdHeaderField[\"OBJECT\"] = \"CMCD-Object\";\n /**\n * keys whose values vary with each request.\n */\n CmcdHeaderField[\"REQUEST\"] = \"CMCD-Request\";\n /**\n * keys whose values are expected to be invariant over the life of the session.\n */\n CmcdHeaderField[\"SESSION\"] = \"CMCD-Session\";\n /**\n * keys whose values do not vary with every request or object.\n */\n CmcdHeaderField[\"STATUS\"] = \"CMCD-Status\";\n})(CmcdHeaderField || (CmcdHeaderField = {}));\n//# sourceMappingURL=CmcdHeaderField.js.map","import { CmcdHeaderField } from './CmcdHeaderField.js';\n/**\n * The map of CMCD header fields to official CMCD keys.\n *\n * @internal\n *\n * @group CMCD\n */\nexport const CmcdHeaderMap = {\n [CmcdHeaderField.OBJECT]: ['br', 'd', 'ot', 'tb'],\n [CmcdHeaderField.REQUEST]: ['bl', 'dl', 'mtp', 'nor', 'nrr', 'su'],\n [CmcdHeaderField.SESSION]: ['cid', 'pr', 'sf', 'sid', 'st', 'v'],\n [CmcdHeaderField.STATUS]: ['bs', 'rtp'],\n};\n//# sourceMappingURL=CmcdHeaderMap.js.map","/**\n * Structured Field Item\n *\n * @group Structured Field\n *\n * @beta\n */\nexport class SfItem {\n value;\n params;\n constructor(value, params) {\n if (Array.isArray(value)) {\n value = value.map((v) => (v instanceof SfItem) ? v : new SfItem(v));\n }\n this.value = value;\n this.params = params;\n }\n}\n//# sourceMappingURL=SfItem.js.map","/**\n * A class to represent structured field tokens when `Symbol` is not available.\n *\n * @group Structured Field\n *\n * @beta\n */\nexport class SfToken {\n description;\n constructor(description) {\n this.description = description;\n }\n}\n//# sourceMappingURL=SfToken.js.map","export const BARE_ITEM = 'Bare Item';\n//# sourceMappingURL=BARE_ITEM.js.map","export const STRING_REGEX = /[\\x00-\\x1f\\x7f]+/; // eslint-disable-line no-control-regex\n//# sourceMappingURL=STRING_REGEX.js.map","import { throwError } from '../utils/throwError.js';\nexport function serializeError(src, type, cause) {\n return throwError('serialize', src, type, cause);\n}\n//# sourceMappingURL=serializeError.js.map","function format(value) {\n if (Array.isArray(value)) {\n return JSON.stringify(value);\n }\n if (value instanceof Map) {\n return 'Map{}';\n }\n if (value instanceof Set) {\n return 'Set{}';\n }\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n return String(value);\n}\nexport function throwError(action, src, type, cause) {\n return new Error(`failed to ${action} \"${format(src)}\" as ${type}`, { cause });\n}\n//# sourceMappingURL=throwError.js.map","import { INTEGER } from '../utils/INTEGER.js';\nimport { isInvalidInt } from '../utils/isInvalidInt.js';\nimport { serializeError } from './serializeError.js';\n// 4.1.4. Serializing an Integer\n//\n// Given an Integer as input_integer, return an ASCII string suitable\n// for use in a HTTP field value.\n//\n// 1. If input_integer is not an integer in the range of\n// -999,999,999,999,999 to 999,999,999,999,999 inclusive, fail\n// serialization.\n//\n// 2. Let output be an empty string.\n//\n// 3. If input_integer is less than (but not equal to) 0, append \"-\" to\n// output.\n//\n// 4. Append input_integer's numeric value represented in base 10 using\n// only decimal digits to output.\n//\n// 5. Return output.\nexport function serializeInteger(value) {\n if (isInvalidInt(value)) {\n throw serializeError(value, INTEGER);\n }\n return value.toString();\n}\n//# sourceMappingURL=serializeInteger.js.map","export function isInvalidInt(value) {\n return value < -999999999999999 || 999999999999999 < value;\n}\n//# sourceMappingURL=isInvalidInt.js.map","export const INTEGER = 'Integer';\n//# sourceMappingURL=INTEGER.js.map","/**\n * This implements the rounding procedure described in step 2 of the \"Serializing a Decimal\" specification.\n * This rounding style is known as \"even rounding\", \"banker's rounding\", or \"commercial rounding\".\n *\n * @param value - The value to round\n * @param precision - The number of decimal places to round to\n * @returns The rounded value\n *\n * @group Utils\n *\n * @beta\n */\nexport function roundToEven(value, precision) {\n if (value < 0) {\n return -roundToEven(-value, precision);\n }\n const decimalShift = Math.pow(10, precision);\n const isEquidistant = Math.abs(((value * decimalShift) % 1) - 0.5) < Number.EPSILON;\n if (isEquidistant) {\n // If the tail of the decimal place is 'equidistant' we round to the nearest even value\n const flooredValue = Math.floor(value * decimalShift);\n return (flooredValue % 2 === 0 ? flooredValue : flooredValue + 1) / decimalShift;\n }\n else {\n // Otherwise, proceed as normal\n return Math.round(value * decimalShift) / decimalShift;\n }\n}\n//# sourceMappingURL=roundToEven.js.map","import { roundToEven } from '../../utils/roundToEven.js';\nimport { DECIMAL } from '../utils/DECIMAL.js';\nimport { serializeError } from './serializeError.js';\n// 4.1.5. Serializing a Decimal\n//\n// Given a decimal number as input_decimal, return an ASCII string\n// suitable for use in a HTTP field value.\n//\n// 1. If input_decimal is not a decimal number, fail serialization.\n//\n// 2. If input_decimal has more than three significant digits to the\n// right of the decimal point, round it to three decimal places,\n// rounding the final digit to the nearest value, or to the even\n// value if it is equidistant.\n//\n// 3. If input_decimal has more than 12 significant digits to the left\n// of the decimal point after rounding, fail serialization.\n//\n// 4. Let output be an empty string.\n//\n// 5. If input_decimal is less than (but not equal to) 0, append \"-\"\n// to output.\n//\n// 6. Append input_decimal's integer component represented in base 10\n// (using only decimal digits) to output; if it is zero, append\n// \"0\".\n//\n// 7. Append \".\" to output.\n//\n// 8. If input_decimal's fractional component is zero, append \"0\" to\n// output.\n//\n// 9. Otherwise, append the significant digits of input_decimal's\n// fractional component represented in base 10 (using only decimal\n// digits) to output.\n//\n// 10. Return output.\nexport function serializeDecimal(value) {\n const roundedValue = roundToEven(value, 3); // round to 3 decimal places\n if (Math.floor(Math.abs(roundedValue)).toString().length > 12) {\n throw serializeError(value, DECIMAL);\n }\n const stringValue = roundedValue.toString();\n return stringValue.includes('.') ? stringValue : `${stringValue}.0`;\n}\n//# sourceMappingURL=serializeDecimal.js.map","export const DECIMAL = 'Decimal';\n//# sourceMappingURL=DECIMAL.js.map","import { symbolToStr } from '../../cta/utils/symbolToStr.js';\nimport { TOKEN } from '../utils/TOKEN.js';\nimport { serializeError } from './serializeError.js';\nexport function serializeToken(token) {\n const value = symbolToStr(token);\n if (/^([a-zA-Z*])([!#$%&'*+\\-.^_`|~\\w:/]*)$/.test(value) === false) {\n throw serializeError(value, TOKEN);\n }\n return value;\n}\n//# sourceMappingURL=serializeToken.js.map","export function symbolToStr(symbol) {\n return symbol.description || symbol.toString().slice(7, -1);\n}\n//# sourceMappingURL=symbolToStr.js.map","export const TOKEN = 'Token';\n//# sourceMappingURL=TOKEN.js.map","import { SfToken } from '../SfToken.js';\nimport { BARE_ITEM } from '../utils/BARE_ITEM.js';\nimport { serializeBoolean } from './serializeBoolean.js';\nimport { serializeByteSequence } from './serializeByteSequence.js';\nimport { serializeDate } from './serializeDate.js';\nimport { serializeDecimal } from './serializeDecimal.js';\nimport { serializeError } from './serializeError.js';\nimport { serializeInteger } from './serializeInteger.js';\nimport { serializeString } from './serializeString.js';\nimport { serializeToken } from './serializeToken.js';\n// 4.1.3.1. Serializing a Bare Item\n//\n// Given an Item as input_item, return an ASCII string suitable for use\n// in a HTTP field value.\n//\n// 1. If input_item is an Integer, return the result of running\n// Serializing an Integer (Section 4.1.4) with input_item.\n//\n// 2. If input_item is a Decimal, return the result of running\n// Serializing a Decimal (Section 4.1.5) with input_item.\n//\n// 3. If input_item is a String, return the result of running\n// Serializing a String (Section 4.1.6) with input_item.\n//\n// 4. If input_item is a Token, return the result of running\n// Serializing a Token (Section 4.1.7) with input_item.\n//\n// 5. If input_item is a Boolean, return the result of running\n// Serializing a Boolean (Section 4.1.9) with input_item.\n//\n// 6. If input_item is a Byte Sequence, return the result of running\n// Serializing a Byte Sequence (Section 4.1.8) with input_item.\n//\n// 7. If input_item is a Date, return the result of running Serializing\n// a Date (Section 4.1.10) with input_item.\n//\n// 8. Otherwise, fail serialization.\nexport function serializeBareItem(value) {\n switch (typeof value) {\n case 'number':\n if (!Number.isFinite(value)) {\n throw serializeError(value, BARE_ITEM);\n }\n if (Number.isInteger(value)) {\n return serializeInteger(value);\n }\n return serializeDecimal(value);\n case 'string':\n return serializeString(value);\n case 'symbol':\n return serializeToken(value);\n case 'boolean':\n return serializeBoolean(value);\n case 'object':\n if (value instanceof Date) {\n return serializeDate(value);\n }\n if (value instanceof Uint8Array) {\n return serializeByteSequence(value);\n }\n if (value instanceof SfToken) {\n return serializeToken(value);\n }\n default:\n // fail\n throw serializeError(value, BARE_ITEM);\n }\n}\n//# sourceMappingURL=serializeBareItem.js.map","import { STRING } from '../utils/STRING.js';\nimport { STRING_REGEX } from '../utils/STRING_REGEX.js';\nimport { serializeError } from './serializeError.js';\n// 4.1.6. Serializing a String\n//\n// Given a String as input_string, return an ASCII string suitable for\n// use in a HTTP field value.\n//\n// 1. Convert input_string into a sequence of ASCII characters; if\n// conversion fails, fail serialization.\n//\n// 2. If input_string contains characters in the range %x00-1f or %x7f\n// (i.e., not in VCHAR or SP), fail serialization.\n//\n// 3. Let output be the string DQUOTE.\n//\n// 4. For each character char in input_string:\n//\n// 1. If char is \"\\\" or DQUOTE:\n//\n// 1. Append \"\\\" to output.\n//\n// 2. Append char to output.\n//\n// 5. Append DQUOTE to output.\n//\n// 6. Return output.\nexport function serializeString(value) {\n if (STRING_REGEX.test(value)) {\n throw serializeError(value, STRING);\n }\n return `\"${value.replace(/\\\\/g, `\\\\\\\\`).replace(/\"/g, `\\\\\"`)}\"`;\n}\n//# sourceMappingURL=serializeString.js.map","export const STRING = 'String';\n//# sourceMappingURL=STRING.js.map","import { BOOLEAN } from '../utils/BOOLEAN.js';\nimport { serializeError } from './serializeError.js';\n// 4.1.9. Serializing a Boolean\n//\n// Given a Boolean as input_boolean, return an ASCII string suitable for\n// use in a HTTP field value.\n//\n// 1. If input_boolean is not a boolean, fail serialization.\n//\n// 2. Let output be an empty string.\n//\n// 3. Append \"?\" to output.\n//\n// 4. If input_boolean is true, append \"1\" to output.\n//\n// 5. If input_boolean is false, append \"0\" to output.\n//\n// 6. Return output.\nexport function serializeBoolean(value) {\n if (typeof value !== 'boolean') {\n throw serializeError(value, BOOLEAN);\n }\n return value ? '?1' : '?0';\n}\n//# sourceMappingURL=serializeBoolean.js.map","export const BOOLEAN = 'Boolean';\n//# sourceMappingURL=BOOLEAN.js.map","import { serializeInteger } from './serializeInteger.js';\n// 4.1.10. Serializing a Date\n//\n// Given a Date as input_integer, return an ASCII string suitable for\n// use in an HTTP field value.\n// 1. Let output be \"@\".\n// 2. Append to output the result of running Serializing an Integer\n// with input_date (Section 4.1.4).\n// 3. Return output.\nexport function serializeDate(value) {\n return `@${serializeInteger(value.getTime() / 1000)}`;\n}\n//# sourceMappingURL=serializeDate.js.map","import { base64encode } from '../../utils/base64encode.js';\nimport { BYTES } from '../utils/BYTES.js';\nimport { serializeError } from './serializeError.js';\n// 4.1.8. Serializing a Byte Sequence\n//\n// Given a Byte Sequence as input_bytes, return an ASCII string suitable\n// for use in a HTTP field value.\n//\n// 1. If input_bytes is not a sequence of bytes, fail serialization.\n//\n// 2. Let output be an empty string.\n//\n// 3. Append \":\" to output.\n//\n// 4. Append the result of base64-encoding input_bytes as per\n// [RFC4648], Section 4, taking account of the requirements below.\n//\n// 5. Append \":\" to output.\n//\n// 6. Return output.\n//\n// The encoded data is required to be padded with \"=\", as per [RFC4648],\n// Section 3.2.\n//\n// Likewise, encoded data SHOULD have pad bits set to zero, as per\n// [RFC4648], Section 3.5, unless it is not possible to do so due to\n// implementation constraints.\nexport function serializeByteSequence(value) {\n if (ArrayBuffer.isView(value) === false) {\n throw serializeError(value, BYTES);\n }\n return `:${base64encode(value)}:`;\n}\n//# sourceMappingURL=serializeByteSequence.js.map","export const BYTES = 'Byte Sequence';\n//# sourceMappingURL=BYTES.js.map","/**\n * Encodes binary data to base64\n *\n * @param binary - The binary data to encode\n * @returns The base64 encoded string\n *\n * @group Utils\n *\n * @beta\n */\nexport function base64encode(binary) {\n return btoa(String.fromCharCode(...binary));\n}\n//# sourceMappingURL=base64encode.js.map","import { KEY } from '../utils/KEY.js';\nimport { serializeError } from './serializeError.js';\n// 4.1.1.3. Serializing a Key\n//\n// Given a key as input_key, return an ASCII string suitable for use in\n// a HTTP field value.\n//\n// 1. Convert input_key into a sequence of ASCII characters; if\n// conversion fails, fail serialization.\n//\n// 2. If input_key contains characters not in lcalpha, DIGIT, \"_\", \"-\",\n// \".\", or \"*\" fail serialization.\n//\n// 3. If the first character of input_key is not lcalpha or \"*\", fail\n// serialization.\n//\n// 4. Let output be an empty string.\n//\n// 5. Append input_key to output.\n//\n// 6. Return output.\nexport function serializeKey(value) {\n if (/^[a-z*][a-z0-9\\-_.*]*$/.test(value) === false) {\n throw serializeError(value, KEY);\n }\n return value;\n}\n//# sourceMappingURL=serializeKey.js.map","export const KEY = 'Key';\n//# sourceMappingURL=KEY.js.map","import { serializeBareItem } from './serializeBareItem.js';\nimport { serializeKey } from './serializeKey.js';\n// 4.1.1.2. Serializing Parameters\n//\n// Given an ordered Dictionary as input_parameters (each member having a\n// param_name and a param_value), return an ASCII string suitable for\n// use in a HTTP field value.\n//\n// 1. Let output be an empty string.\n//\n// 2. For each param_name with a value of param_value in\n// input_parameters:\n//\n// 1. Append \";\" to output.\n//\n// 2. Append the result of running Serializing a Key\n// (Section 4.1.1.3) with param_name to output.\n//\n// 3. If param_value is not Boolean true:\n//\n// 1. Append \"=\" to output.\n//\n// 2. Append the result of running Serializing a bare Item\n// (Section 4.1.3.1) with param_value to output.\n//\n// 3. Return output.\nexport function serializeParams(params) {\n if (params == null) {\n return '';\n }\n return Object.entries(params)\n .map(([key, value]) => {\n if (value === true) {\n return `;${serializeKey(key)}`; // omit true\n }\n return `;${serializeKey(key)}=${serializeBareItem(value)}`;\n })\n .join('');\n}\n//# sourceMappingURL=serializeParams.js.map","import { SfItem } from '../SfItem.js';\nimport { serializeBareItem } from './serializeBareItem.js';\nimport { serializeParams } from './serializeParams.js';\n// 4.1.3. Serializing an Item\n//\n// Given an Item as bare_item and Parameters as item_parameters, return\n// an ASCII string suitable for use in a HTTP field value.\n//\n// 1. Let output be an empty string.\n//\n// 2. Append the result of running Serializing a Bare Item\n// Section 4.1.3.1 with bare_item to output.\n//\n// 3. Append the result of running Serializing Parameters\n// Section 4.1.1.2 with item_parameters to output.\n//\n// 4. Return output.\nexport function serializeItem(value) {\n if (value instanceof SfItem) {\n return `${serializeBareItem(value.value)}${serializeParams(value.params)}`;\n }\n else {\n return serializeBareItem(value);\n }\n}\n//# sourceMappingURL=serializeItem.js.map","/**\n * Checks if the given key is a token field.\n *\n * @param key - The key to check.\n *\n * @returns `true` if the key is a token field.\n *\n * @internal\n *\n * @group CMCD\n */\nexport const isTokenField = (key) => key === 'ot' || key === 'sf' || key === 'st';\n//# sourceMappingURL=isTokenField.js.map","import { urlToRelativePath } from '../utils.js';\nconst toRounded = (value) => Math.round(value);\nconst toUrlSafe = (value, options) => {\n if (options?.baseUrl) {\n value = urlToRelativePath(value, options.baseUrl);\n }\n return encodeURIComponent(value);\n};\nconst toHundred = (value) => toRounded(value / 100) * 100;\n/**\n * The default formatters for CMCD values.\n *\n * @group CMCD\n *\n * @beta\n */\nexport const CmcdFormatters = {\n /**\n * Bitrate (kbps) rounded integer\n */\n br: toRounded,\n /**\n * Duration (milliseconds) rounded integer\n */\n d: toRounded,\n /**\n * Buffer Length (milliseconds) rounded nearest 100ms\n */\n bl: toHundred,\n /**\n * Deadline (milliseconds) rounded nearest 100ms\n */\n dl: toHundred,\n /**\n * Measured Throughput (kbps) rounded nearest 100kbps\n */\n mtp: toHundred,\n /**\n * Next Object Request URL encoded\n */\n nor: toUrlSafe,\n /**\n * Requested maximum throughput (kbps) rounded nearest 100kbps\n */\n rtp: toHundred,\n /**\n * Top Bitrate (kbps) rounded integer\n */\n tb: toRounded,\n};\n//# sourceMappingURL=CmcdFormatters.js.map","/**\n * Constructs a relative path from a URL.\n *\n * @param url - The destination URL\n * @param base - The base URL\n * @returns The relative path\n *\n * @group Utils\n *\n * @beta\n */\nexport function urlToRelativePath(url, base) {\n const to = new URL(url);\n const from = new URL(base);\n if (to.origin !== from.origin) {\n return url;\n }\n const toPath = to.pathname.split('/').slice(1);\n const fromPath = from.pathname.split('/').slice(1, -1);\n // remove common parents\n while (toPath[0] === fromPath[0]) {\n toPath.shift();\n fromPath.shift();\n }\n // add back paths\n while (fromPath.length) {\n fromPath.shift();\n toPath.unshift('..');\n }\n return toPath.join('/');\n}\n//# sourceMappingURL=urlToRelativePath.js.map","import { encodeSfDict } from '../structuredfield.js';\nimport { processCmcd } from './utils/processCmcd.js';\n/**\n * Encode a CMCD object to a string.\n *\n * @param cmcd - The CMCD object to encode.\n * @param options - Options for encoding.\n *\n * @returns The encoded CMCD string.\n *\n * @group CMCD\n *\n * @beta\n */\nexport function encodeCmcd(cmcd, options = {}) {\n if (!cmcd) {\n return '';\n }\n return encodeSfDict(processCmcd(cmcd, options), Object.assign({ whitespace: false }, options));\n}\n//# sourceMappingURL=encodeCmcd.js.map","import { serializeDict } from './serialize/serializeDict.js';\n/**\n * Encode an object into a structured field dictionary\n *\n * @param input - The structured field dictionary to encode\n * @returns The structured field string\n *\n * @group Structured Field\n *\n * @beta\n */\nexport function encodeSfDict(value, options) {\n return serializeDict(value, options);\n}\n//# sourceMappingURL=encodeSfDict.js.map","import { SfItem } from '../SfItem.js';\nimport { DICT } from '../utils/DICT.js';\nimport { serializeError } from './serializeError.js';\nimport { serializeInnerList } from './serializeInnerList.js';\nimport { serializeItem } from './serializeItem.js';\nimport { serializeKey } from './serializeKey.js';\nimport { serializeParams } from './serializeParams.js';\n// 4.1.2. Serializing a Dictionary\n//\n// Given an ordered Dictionary as input_dictionary (each member having a\n// member_name and a tuple value of (member_value, parameters)), return\n// an ASCII string suitable for use in a HTTP field value.\n//\n// 1. Let output be an empty string.\n//\n// 2. For each member_name with a value of (member_value, parameters)\n// in input_dictionary:\n//\n// 1. Append the result of running Serializing a Key\n// (Section 4.1.1.3) with member's member_name to output.\n//\n// 2. If member_value is Boolean true:\n//\n// 1. Append the result of running Serializing Parameters\n// (Section 4.1.1.2) with parameters to output.\n//\n// 3. Otherwise:\n//\n// 1. Append \"=\" to output.\n//\n// 2. If member_value is an array, append the result of running\n// Serializing an Inner List (Section 4.1.1.1) with\n// (member_value, parameters) to output.\n//\n// 3. Otherwise, append the result of running Serializing an\n// Item (Section 4.1.3) with (member_value, parameters) to\n// output.\n//\n// 4. If more members remain in input_dictionary:\n//\n// 1. Append \",\" to output.\n//\n// 2. Append a single SP to output.\n//\n// 3. Return output.\nexport function serializeDict(dict, options = { whitespace: true }) {\n if (typeof dict !== 'object') {\n throw serializeError(dict, DICT);\n }\n const entries = dict instanceof Map ? dict.entries() : Object.entries(dict);\n const optionalWhiteSpace = options?.whitespace ? ' ' : '';\n return Array.from(entries)\n .map(([key, item]) => {\n if (item instanceof SfItem === false) {\n item = new SfItem(item);\n }\n let output = serializeKey(key);\n if (item.value === true) {\n output += serializeParams(item.params);\n }\n else {\n output += '=';\n if (Array.isArray(item.value)) {\n output += serializeInnerList(item);\n }\n else {\n output += serializeItem(item);\n }\n }\n return output;\n })\n .join(`,${optionalWhiteSpace}`);\n}\n//# sourceMappingURL=serializeDict.js.map","export const DICT = 'Dict';\n//# sourceMappingURL=DICT.js.map","import { serializeItem } from './serializeItem.js';\nimport { serializeParams } from './serializeParams.js';\n// 4.1.1.1. Serializing an Inner List\n//\n// Given an array of (member_value, parameters) tuples as inner_list,\n// and parameters as list_parameters, return an ASCII string suitable\n// for use in a HTTP field value.\n//\n// 1. Let output be the string \"(\".\n//\n// 2. For each (member_value, parameters) of inner_list:\n//\n// 1. Append the result of running Serializing an Item\n// (Section 4.1.3) with (member_value, parameters) to output.\n//\n// 2. If more values remain in inner_list, append a single SP to\n// output.\n//\n// 3. Append \")\" to output.\n//\n// 4. Append the result of running Serializing Parameters\n// (Section 4.1.1.2) with list_parameters to output.\n//\n// 5. Return output.\nexport function serializeInnerList(value) {\n return `(${value.value.map(serializeItem).join(' ')})${serializeParams(value.params)}`;\n}\n//# sourceMappingURL=serializeInnerList.js.map","import { isTokenField } from '../../cta/utils/isTokenField.js';\nimport { isValid } from '../../cta/utils/isValid.js';\nimport { SfToken } from '../../structuredfield/SfToken.js';\nimport { CmcdFormatters } from '../CmcdFormatters.js';\n/**\n * Internal CMCD processing function.\n *\n * @param obj - The CMCD object to process.\n * @param map - The mapping function to use.\n * @param options - Options for encoding.\n *\n * @internal\n *\n * @group CMCD\n */\nexport function processCmcd(obj, options) {\n const results = {};\n if (obj == null || typeof obj !== 'object') {\n return results;\n }\n const keys = Object.keys(obj).sort();\n const formatters = Object.assign({}, CmcdFormatters, options?.formatters);\n const filter = options?.filter;\n keys.forEach(key => {\n if (filter?.(key)) {\n return;\n }\n let value = obj[key];\n const formatter = formatters[key];\n if (formatter) {\n value = formatter(value, options);\n }\n // Version should only be reported if not equal to 1.\n if (key === 'v' && value === 1) {\n return;\n }\n // Playback rate should only be sent if not equal to 1.\n if (key == 'pr' && value === 1) {\n return;\n }\n // ignore invalid values\n if (!isValid(value)) {\n return;\n }\n if (isTokenField(key) && typeof value === 'string') {\n value = new SfToken(value);\n }\n results[key] = value;\n });\n return results;\n}\n//# sourceMappingURL=processCmcd.js.map","export const isValid = (value) => {\n if (typeof value === 'number') {\n return Number.isFinite(value);\n }\n return value != null && value !== '' && value !== false;\n};\n//# sourceMappingURL=isValid.js.map","/**\n * CMCD parameter name.\n *\n * @group CMCD\n *\n * @beta\n */\nexport const CMCD_PARAM = 'CMCD';\n//# sourceMappingURL=CMCD_PARAM.js.map","import { toCmcdQuery } from './toCmcdQuery.js';\nconst REGEX = /CMCD=[^&#]+/;\n/**\n * Append CMCD query args to a URL.\n *\n * @param url - The URL to append to.\n * @param cmcd - The CMCD object to append.\n * @param options - Options for encoding the CMCD object.\n *\n * @returns The URL with the CMCD query args appended.\n *\n * @group CMCD\n *\n * @beta\n */\nexport function appendCmcdQuery(url, cmcd, options) {\n // TODO: Replace with URLSearchParams once we drop Safari < 10.1 & Chrome < 49 support.\n // https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams\n const query = toCmcdQuery(cmcd, options);\n if (!query) {\n return url;\n }\n if (REGEX.test(url)) {\n return url.replace(REGEX, query);\n }\n const separator = url.includes('?') ? '&' : '?';\n return `${url}${separator}${query}`;\n}\n//# sourceMappingURL=appendCmcdQuery.js.map","import { Events } from '../events';\nimport Hls from '../hls';\nimport { Cmcd } from '@svta/common-media-library/cmcd/Cmcd';\nimport { CmcdObjectType } from '@svta/common-media-library/cmcd/CmcdObjectType';\nimport { CmcdStreamingFormat } from '@svta/common-media-library/cmcd/CmcdStreamingFormat';\nimport { appendCmcdHeaders } from '@svta/common-media-library/cmcd/appendCmcdHeaders';\nimport { appendCmcdQuery } from '@svta/common-media-library/cmcd/appendCmcdQuery';\nimport { uuid } from '@svta/common-media-library/utils/uuid';\nimport { BufferHelper } from '../utils/buffer-helper';\nimport { logger } from '../utils/logger';\nimport type { ComponentAPI } from '../types/component-api';\nimport type { Fragment } from '../loader/fragment';\nimport type { BufferCreatedData, MediaAttachedData } from '../types/events';\nimport type {\n FragmentLoaderContext,\n Loader,\n LoaderCallbacks,\n LoaderConfiguration,\n LoaderContext,\n PlaylistLoaderContext,\n} from '../types/loader';\nimport type {\n FragmentLoaderConstructor,\n HlsConfig,\n PlaylistLoaderConstructor,\n} from '../config';\n\n/**\n * Controller to deal with Common Media Client Data (CMCD)\n * @see https://cdn.cta.tech/cta/media/media/resources/standards/pdfs/cta-5004-final.pdf\n */\nexport default class CMCDController implements ComponentAPI {\n private hls: Hls;\n private config: HlsConfig;\n private media?: HTMLMediaElement;\n private sid?: string;\n private cid?: string;\n private useHeaders: boolean = false;\n private includeKeys?: string[];\n private initialized: boolean = false;\n private starved: boolean = false;\n private buffering: boolean = true;\n private audioBuffer?: SourceBuffer; // eslint-disable-line no-restricted-globals\n private videoBuffer?: SourceBuffer; // eslint-disable-line no-restricted-globals\n\n constructor(hls: Hls) {\n this.hls = hls;\n const config = (this.config = hls.config);\n const { cmcd } = config;\n\n if (cmcd != null) {\n config.pLoader = this.createPlaylistLoader();\n config.fLoader = this.createFragmentLoader();\n\n this.sid = cmcd.sessionId || uuid();\n this.cid = cmcd.contentId;\n this.useHeaders = cmcd.useHeaders === true;\n this.includeKeys = cmcd.includeKeys;\n this.registerListeners();\n }\n }\n\n private registerListeners() {\n const hls = this.hls;\n hls.on(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n hls.on(Events.MEDIA_DETACHED, this.onMediaDetached, this);\n hls.on(Events.BUFFER_CREATED, this.onBufferCreated, this);\n }\n\n private unregisterListeners() {\n const hls = this.hls;\n hls.off(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n hls.off(Events.MEDIA_DETACHED, this.onMediaDetached, this);\n hls.off(Events.BUFFER_CREATED, this.onBufferCreated, this);\n }\n\n destroy() {\n this.unregisterListeners();\n this.onMediaDetached();\n\n // @ts-ignore\n this.hls = this.config = this.audioBuffer = this.videoBuffer = null;\n // @ts-ignore\n this.onWaiting = this.onPlaying = null;\n }\n\n private onMediaAttached(\n event: Events.MEDIA_ATTACHED,\n data: MediaAttachedData,\n ) {\n this.media = data.media;\n this.media.addEventListener('waiting', this.onWaiting);\n this.media.addEventListener('playing', this.onPlaying);\n }\n\n private onMediaDetached() {\n if (!this.media) {\n return;\n }\n\n this.media.removeEventListener('waiting', this.onWaiting);\n this.media.removeEventListener('playing', this.onPlaying);\n\n // @ts-ignore\n this.media = null;\n }\n\n private onBufferCreated(\n event: Events.BUFFER_CREATED,\n data: BufferCreatedData,\n ) {\n this.audioBuffer = data.tracks.audio?.buffer;\n this.videoBuffer = data.tracks.video?.buffer;\n }\n\n private onWaiting = () => {\n if (this.initialized) {\n this.starved = true;\n }\n\n this.buffering = true;\n };\n\n private onPlaying = () => {\n if (!this.initialized) {\n this.initialized = true;\n }\n\n this.buffering = false;\n };\n\n /**\n * Create baseline CMCD data\n */\n private createData(): Cmcd {\n return {\n v: 1,\n sf: CmcdStreamingFormat.HLS,\n sid: this.sid,\n cid: this.cid,\n pr: this.media?.playbackRate,\n mtp: this.hls.bandwidthEstimate / 1000,\n };\n }\n\n /**\n * Apply CMCD data to a request.\n */\n private apply(context: LoaderContext, data: Cmcd = {}) {\n // apply baseline data\n Object.assign(data, this.createData());\n\n const isVideo =\n data.ot === CmcdObjectType.INIT ||\n data.ot === CmcdObjectType.VIDEO ||\n data.ot === CmcdObjectType.MUXED;\n\n if (this.starved && isVideo) {\n data.bs = true;\n data.su = true;\n this.starved = false;\n }\n\n if (data.su == null) {\n data.su = this.buffering;\n }\n\n // TODO: Implement rtp, nrr, nor, dl\n\n const { includeKeys } = this;\n if (includeKeys) {\n data = Object.keys(data).reduce((acc, key) => {\n includeKeys.includes(key) && (acc[key] = data[key]);\n return acc;\n }, {});\n }\n\n if (this.useHeaders) {\n if (!context.headers) {\n context.headers = {};\n }\n\n appendCmcdHeaders(context.headers, data);\n } else {\n context.url = appendCmcdQuery(context.url, data);\n }\n }\n\n /**\n * Apply CMCD data to a manifest request.\n */\n private applyPlaylistData = (context: PlaylistLoaderContext) => {\n try {\n this.apply(context, {\n ot: CmcdObjectType.MANIFEST,\n su: !this.initialized,\n });\n } catch (error) {\n logger.warn('Could not generate manifest CMCD data.', error);\n }\n };\n\n /**\n * Apply CMCD data to a segment request\n */\n private applyFragmentData = (context: FragmentLoaderContext) => {\n try {\n const fragment = context.frag;\n const level = this.hls.levels[fragment.level];\n const ot = this.getObjectType(fragment);\n const data: Cmcd = {\n d: fragment.duration * 1000,\n ot,\n };\n\n if (\n ot === CmcdObjectType.VIDEO ||\n ot === CmcdObjectType.AUDIO ||\n ot == CmcdObjectType.MUXED\n ) {\n data.br = level.bitrate / 1000;\n data.tb = this.getTopBandwidth(ot) / 1000;\n data.bl = this.getBufferLength(ot);\n }\n\n this.apply(context, data);\n } catch (error) {\n logger.warn('Could not generate segment CMCD data.', error);\n }\n };\n\n /**\n * The CMCD object type.\n */\n private getObjectType(fragment: Fragment): CmcdObjectType | undefined {\n const { type } = fragment;\n\n if (type === 'subtitle') {\n return CmcdObjectType.TIMED_TEXT;\n }\n\n if (fragment.sn === 'initSegment') {\n return CmcdObjectType.INIT;\n }\n\n if (type === 'audio') {\n return CmcdObjectType.AUDIO;\n }\n\n if (type === 'main') {\n if (!this.hls.audioTracks.length) {\n return CmcdObjectType.MUXED;\n }\n\n return CmcdObjectType.VIDEO;\n }\n\n return undefined;\n }\n\n /**\n * Get the highest bitrate.\n */\n private getTopBandwidth(type: CmcdObjectType) {\n let bitrate: number = 0;\n let levels;\n const hls = this.hls;\n\n if (type === CmcdObjectType.AUDIO) {\n levels = hls.audioTracks;\n } else {\n const max = hls.maxAutoLevel;\n const len = max > -1 ? max + 1 : hls.levels.length;\n levels = hls.levels.slice(0, len);\n }\n\n for (const level of levels) {\n if (level.bitrate > bitrate) {\n bitrate = level.bitrate;\n }\n }\n\n return bitrate > 0 ? bitrate : NaN;\n }\n\n /**\n * Get the buffer length for a media type in milliseconds\n */\n private getBufferLength(type: CmcdObjectType) {\n const media = this.hls.media;\n const buffer =\n type === CmcdObjectType.AUDIO ? this.audioBuffer : this.videoBuffer;\n\n if (!buffer || !media) {\n return NaN;\n }\n\n const info = BufferHelper.bufferInfo(\n buffer,\n media.currentTime,\n this.config.maxBufferHole,\n );\n\n return info.len * 1000;\n }\n\n /**\n * Create a playlist loader\n */\n private createPlaylistLoader(): PlaylistLoaderConstructor | undefined {\n const { pLoader } = this.config;\n const apply = this.applyPlaylistData;\n const Ctor = pLoader || (this.config.loader as PlaylistLoaderConstructor);\n\n return class CmcdPlaylistLoader {\n private loader: Loader<PlaylistLoaderContext>;\n\n constructor(config: HlsConfig) {\n this.loader = new Ctor(config);\n }\n\n get stats() {\n return this.loader.stats;\n }\n\n get context() {\n return this.loader.context;\n }\n\n destroy() {\n this.loader.destroy();\n }\n\n abort() {\n this.loader.abort();\n }\n\n load(\n context: PlaylistLoaderContext,\n config: LoaderConfiguration,\n callbacks: LoaderCallbacks<PlaylistLoaderContext>,\n ) {\n apply(context);\n this.loader.load(context, config, callbacks);\n }\n };\n }\n\n /**\n * Create a playlist loader\n */\n private createFragmentLoader(): FragmentLoaderConstructor | undefined {\n const { fLoader } = this.config;\n const apply = this.applyFragmentData;\n const Ctor = fLoader || (this.config.loader as FragmentLoaderConstructor);\n\n return class CmcdFragmentLoader {\n private loader: Loader<FragmentLoaderContext>;\n\n constructor(config: HlsConfig) {\n this.loader = new Ctor(config);\n }\n\n get stats() {\n return this.loader.stats;\n }\n\n get context() {\n return this.loader.context;\n }\n\n destroy() {\n this.loader.destroy();\n }\n\n abort() {\n this.loader.abort();\n }\n\n load(\n context: FragmentLoaderContext,\n config: LoaderConfiguration,\n callbacks: LoaderCallbacks<FragmentLoaderContext>,\n ) {\n apply(context);\n this.loader.load(context, config, callbacks);\n }\n };\n }\n}\n","/**\n * Generate a random v4 UUID\n *\n * @returns A random v4 UUID\n *\n * @group Utils\n *\n * @beta\n */\nexport function uuid() {\n try {\n return crypto.randomUUID();\n }\n catch (error) {\n try {\n const url = URL.createObjectURL(new Blob());\n const uuid = url.toString();\n URL.revokeObjectURL(url);\n return uuid.slice(uuid.lastIndexOf('/') + 1);\n }\n catch (error) {\n let dt = new Date().getTime();\n const uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (dt + Math.random() * 16) % 16 | 0;\n dt = Math.floor(dt / 16);\n return (c == 'x' ? r : (r & 0x3 | 0x8)).toString(16);\n });\n return uuid;\n }\n }\n}\n//# sourceMappingURL=uuid.js.map","import { toCmcdHeaders } from './toCmcdHeaders.js';\n/**\n * Append CMCD query args to a header object.\n *\n * @param headers - The headers to append to.\n * @param cmcd - The CMCD object to append.\n * @param customHeaderMap - A map of custom CMCD keys to header fields.\n *\n * @returns The headers with the CMCD header shards appended.\n *\n * @group CMCD\n *\n * @beta\n */\nexport function appendCmcdHeaders(headers, cmcd, options) {\n return Object.assign(headers, toCmcdHeaders(cmcd, options));\n}\n//# sourceMappingURL=appendCmcdHeaders.js.map","import { CmcdHeaderField } from './CmcdHeaderField.js';\nimport { CmcdHeaderMap } from './CmcdHeaderMap.js';\nimport { encodeCmcd } from './encodeCmcd.js';\n/**\n * Convert a CMCD data object to request headers\n *\n * @param cmcd - The CMCD data object to convert.\n * @param options - Options for encoding the CMCD object.\n *\n * @returns The CMCD header shards.\n *\n * @group CMCD\n *\n * @beta\n */\nexport function toCmcdHeaders(cmcd, options = {}) {\n if (!cmcd) {\n return {};\n }\n const entries = Object.entries(cmcd);\n const headerMap = Object.entries(CmcdHeaderMap)\n .concat(Object.entries(options?.customHeaderMap || {}));\n const shards = entries.reduce((acc, entry) => {\n const [key, value] = entry;\n const field = headerMap.find(entry => entry[1].includes(key))?.[0] || CmcdHeaderField.REQUEST;\n acc[field] ??= {};\n acc[field][key] = value;\n return acc;\n }, {});\n return Object.entries(shards)\n .reduce((acc, [field, value]) => {\n acc[field] = encodeCmcd(value, options);\n return acc;\n }, {});\n}\n//# sourceMappingURL=toCmcdHeaders.js.map","import { CMCD_PARAM } from './CMCD_PARAM.js';\nimport { encodeCmcd } from './encodeCmcd.js';\n/**\n * Convert a CMCD data object to a query arg.\n *\n * @param cmcd - The CMCD object to convert.\n * @param options - Options for encoding the CMCD object.\n *\n * @returns The CMCD query arg.\n *\n * @group CMCD\n *\n * @beta\n */\nexport function toCmcdQuery(cmcd, options = {}) {\n if (!cmcd) {\n return '';\n }\n const params = encodeCmcd(cmcd, options);\n return `${CMCD_PARAM}=${encodeURIComponent(params)}`;\n}\n//# sourceMappingURL=toCmcdQuery.js.map","import { Events } from '../events';\nimport { Level } from '../types/level';\nimport { reassignFragmentLevelIndexes } from '../utils/level-helper';\nimport { AttrList } from '../utils/attr-list';\nimport { ErrorActionFlags, NetworkErrorAction } from './error-controller';\nimport { logger } from '../utils/logger';\nimport {\n PlaylistContextType,\n type Loader,\n type LoaderCallbacks,\n type LoaderConfiguration,\n type LoaderContext,\n type LoaderResponse,\n type LoaderStats,\n} from '../types/loader';\nimport type Hls from '../hls';\nimport type { NetworkComponentAPI } from '../types/component-api';\nimport type {\n SteeringManifestLoadedData,\n ErrorData,\n ManifestLoadedData,\n ManifestParsedData,\n} from '../types/events';\nimport type { RetryConfig } from '../config';\n\nimport type { MediaAttributes, MediaPlaylist } from '../types/media-playlist';\n\nexport type SteeringManifest = {\n VERSION: 1;\n TTL: number;\n 'RELOAD-URI'?: string;\n 'PATHWAY-PRIORITY': string[];\n 'PATHWAY-CLONES'?: PathwayClone[];\n};\n\nexport type PathwayClone = {\n 'BASE-ID': string;\n ID: string;\n 'URI-REPLACEMENT': UriReplacement;\n};\n\nexport type UriReplacement = {\n HOST?: string;\n PARAMS?: { [queryParameter: string]: string };\n 'PER-VARIANT-URIS'?: { [stableVariantId: string]: string };\n 'PER-RENDITION-URIS'?: { [stableRenditionId: string]: string };\n};\n\nconst PATHWAY_PENALTY_DURATION_MS = 300000;\n\nexport default class ContentSteeringController implements NetworkComponentAPI {\n private readonly hls: Hls;\n private log: (msg: any) => void;\n private loader: Loader<LoaderContext> | null = null;\n private uri: string | null = null;\n private pathwayId: string = '.';\n private pathwayPriority: string[] | null = null;\n private timeToLoad: number = 300;\n private reloadTimer: number = -1;\n private updated: number = 0;\n private started: boolean = false;\n private enabled: boolean = true;\n private levels: Level[] | null = null;\n private audioTracks: MediaPlaylist[] | null = null;\n private subtitleTracks: MediaPlaylist[] | null = null;\n private penalizedPathways: { [pathwayId: string]: number } = {};\n\n constructor(hls: Hls) {\n this.hls = hls;\n this.log = logger.log.bind(logger, `[content-steering]:`);\n this.registerListeners();\n }\n\n private registerListeners() {\n const hls = this.hls;\n hls.on(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n hls.on(Events.MANIFEST_LOADED, this.onManifestLoaded, this);\n hls.on(Events.MANIFEST_PARSED, this.onManifestParsed, this);\n hls.on(Events.ERROR, this.onError, this);\n }\n\n private unregisterListeners() {\n const hls = this.hls;\n if (!hls) {\n return;\n }\n hls.off(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n hls.off(Events.MANIFEST_LOADED, this.onManifestLoaded, this);\n hls.off(Events.MANIFEST_PARSED, this.onManifestParsed, this);\n hls.off(Events.ERROR, this.onError, this);\n }\n\n startLoad() {\n this.started = true;\n this.clearTimeout();\n if (this.enabled && this.uri) {\n if (this.updated) {\n const ttl = this.timeToLoad * 1000 - (performance.now() - this.updated);\n if (ttl > 0) {\n this.scheduleRefresh(this.uri, ttl);\n return;\n }\n }\n this.loadSteeringManifest(this.uri);\n }\n }\n\n stopLoad() {\n this.started = false;\n if (this.loader) {\n this.loader.destroy();\n this.loader = null;\n }\n this.clearTimeout();\n }\n\n clearTimeout() {\n if (this.reloadTimer !== -1) {\n self.clearTimeout(this.reloadTimer);\n this.reloadTimer = -1;\n }\n }\n\n destroy() {\n this.unregisterListeners();\n this.stopLoad();\n // @ts-ignore\n this.hls = null;\n this.levels = this.audioTracks = this.subtitleTracks = null;\n }\n\n removeLevel(levelToRemove: Level) {\n const levels = this.levels;\n if (levels) {\n this.levels = levels.filter((level) => level !== levelToRemove);\n }\n }\n\n private onManifestLoading() {\n this.stopLoad();\n this.enabled = true;\n this.timeToLoad = 300;\n this.updated = 0;\n this.uri = null;\n this.pathwayId = '.';\n this.levels = this.audioTracks = this.subtitleTracks = null;\n }\n\n private onManifestLoaded(\n event: Events.MANIFEST_LOADED,\n data: ManifestLoadedData,\n ) {\n const { contentSteering } = data;\n if (contentSteering === null) {\n return;\n }\n this.pathwayId = contentSteering.pathwayId;\n this.uri = contentSteering.uri;\n if (this.started) {\n this.startLoad();\n }\n }\n\n private onManifestParsed(\n event: Events.MANIFEST_PARSED,\n data: ManifestParsedData,\n ) {\n this.audioTracks = data.audioTracks;\n this.subtitleTracks = data.subtitleTracks;\n }\n\n private onError(event: Events.ERROR, data: ErrorData) {\n const { errorAction } = data;\n if (\n errorAction?.action === NetworkErrorAction.SendAlternateToPenaltyBox &&\n errorAction.flags === ErrorActionFlags.MoveAllAlternatesMatchingHost\n ) {\n const levels = this.levels;\n let pathwayPriority = this.pathwayPriority;\n let errorPathway = this.pathwayId;\n if (data.context) {\n const { groupId, pathwayId, type } = data.context;\n if (groupId && levels) {\n errorPathway = this.getPathwayForGroupId(groupId, type, errorPathway);\n } else if (pathwayId) {\n errorPathway = pathwayId;\n }\n }\n if (!(errorPathway in this.penalizedPathways)) {\n this.penalizedPathways[errorPathway] = performance.now();\n }\n if (!pathwayPriority && levels) {\n // If PATHWAY-PRIORITY was not provided, list pathways for error handling\n pathwayPriority = levels.reduce((pathways, level) => {\n if (pathways.indexOf(level.pathwayId) === -1) {\n pathways.push(level.pathwayId);\n }\n return pathways;\n }, [] as string[]);\n }\n if (pathwayPriority && pathwayPriority.length > 1) {\n this.updatePathwayPriority(pathwayPriority);\n errorAction.resolved = this.pathwayId !== errorPathway;\n }\n if (!errorAction.resolved) {\n logger.warn(\n `Could not resolve ${data.details} (\"${\n data.error.message\n }\") with content-steering for Pathway: ${errorPathway} levels: ${\n levels ? levels.length : levels\n } priorities: ${JSON.stringify(\n pathwayPriority,\n )} penalized: ${JSON.stringify(this.penalizedPathways)}`,\n );\n }\n }\n }\n\n public filterParsedLevels(levels: Level[]): Level[] {\n // Filter levels to only include those that are in the initial pathway\n this.levels = levels;\n let pathwayLevels = this.getLevelsForPathway(this.pathwayId);\n if (pathwayLevels.length === 0) {\n const pathwayId = levels[0].pathwayId;\n this.log(\n `No levels found in Pathway ${this.pathwayId}. Setting initial Pathway to \"${pathwayId}\"`,\n );\n pathwayLevels = this.getLevelsForPathway(pathwayId);\n this.pathwayId = pathwayId;\n }\n if (pathwayLevels.length !== levels.length) {\n this.log(\n `Found ${pathwayLevels.length}/${levels.length} levels in Pathway \"${this.pathwayId}\"`,\n );\n }\n return pathwayLevels;\n }\n\n private getLevelsForPathway(pathwayId: string): Level[] {\n if (this.levels === null) {\n return [];\n }\n return this.levels.filter((level) => pathwayId === level.pathwayId);\n }\n\n private updatePathwayPriority(pathwayPriority: string[]) {\n this.pathwayPriority = pathwayPriority;\n let levels: Level[] | undefined;\n\n // Evaluate if we should remove the pathway from the penalized list\n const penalizedPathways = this.penalizedPathways;\n const now = performance.now();\n Object.keys(penalizedPathways).forEach((pathwayId) => {\n if (now - penalizedPathways[pathwayId] > PATHWAY_PENALTY_DURATION_MS) {\n delete penalizedPathways[pathwayId];\n }\n });\n for (let i = 0; i < pathwayPriority.length; i++) {\n const pathwayId = pathwayPriority[i];\n if (pathwayId in penalizedPathways) {\n continue;\n }\n if (pathwayId === this.pathwayId) {\n return;\n }\n const selectedIndex = this.hls.nextLoadLevel;\n const selectedLevel: Level = this.hls.levels[selectedIndex];\n levels = this.getLevelsForPathway(pathwayId);\n if (levels.length > 0) {\n this.log(`Setting Pathway to \"${pathwayId}\"`);\n this.pathwayId = pathwayId;\n reassignFragmentLevelIndexes(levels);\n this.hls.trigger(Events.LEVELS_UPDATED, { levels });\n // Set LevelController's level to trigger LEVEL_SWITCHING which loads playlist if needed\n const levelAfterChange = this.hls.levels[selectedIndex];\n if (selectedLevel && levelAfterChange && this.levels) {\n if (\n levelAfterChange.attrs['STABLE-VARIANT-ID'] !==\n selectedLevel.attrs['STABLE-VARIANT-ID'] &&\n levelAfterChange.bitrate !== selectedLevel.bitrate\n ) {\n this.log(\n `Unstable Pathways change from bitrate ${selectedLevel.bitrate} to ${levelAfterChange.bitrate}`,\n );\n }\n this.hls.nextLoadLevel = selectedIndex;\n }\n break;\n }\n }\n }\n\n private getPathwayForGroupId(\n groupId: string,\n type: PlaylistContextType,\n defaultPathway: string,\n ): string {\n const levels = this.getLevelsForPathway(defaultPathway).concat(\n this.levels || [],\n );\n for (let i = 0; i < levels.length; i++) {\n if (\n (type === PlaylistContextType.AUDIO_TRACK &&\n levels[i].hasAudioGroup(groupId)) ||\n (type === PlaylistContextType.SUBTITLE_TRACK &&\n levels[i].hasSubtitleGroup(groupId))\n ) {\n return levels[i].pathwayId;\n }\n }\n return defaultPathway;\n }\n\n private clonePathways(pathwayClones: PathwayClone[]) {\n const levels = this.levels;\n if (!levels) {\n return;\n }\n const audioGroupCloneMap: Record<string, string> = {};\n const subtitleGroupCloneMap: Record<string, string> = {};\n pathwayClones.forEach((pathwayClone) => {\n const {\n ID: cloneId,\n 'BASE-ID': baseId,\n 'URI-REPLACEMENT': uriReplacement,\n } = pathwayClone;\n if (levels.some((level) => level.pathwayId === cloneId)) {\n return;\n }\n const clonedVariants = this.getLevelsForPathway(baseId).map(\n (baseLevel) => {\n const attributes = new AttrList(baseLevel.attrs);\n attributes['PATHWAY-ID'] = cloneId;\n const clonedAudioGroupId: string | undefined =\n attributes.AUDIO && `${attributes.AUDIO}_clone_${cloneId}`;\n const clonedSubtitleGroupId: string | undefined =\n attributes.SUBTITLES && `${attributes.SUBTITLES}_clone_${cloneId}`;\n if (clonedAudioGroupId) {\n audioGroupCloneMap[attributes.AUDIO] = clonedAudioGroupId;\n attributes.AUDIO = clonedAudioGroupId;\n }\n if (clonedSubtitleGroupId) {\n subtitleGroupCloneMap[attributes.SUBTITLES] = clonedSubtitleGroupId;\n attributes.SUBTITLES = clonedSubtitleGroupId;\n }\n const url = performUriReplacement(\n baseLevel.uri,\n attributes['STABLE-VARIANT-ID'],\n 'PER-VARIANT-URIS',\n uriReplacement,\n );\n const clonedLevel = new Level({\n attrs: attributes,\n audioCodec: baseLevel.audioCodec,\n bitrate: baseLevel.bitrate,\n height: baseLevel.height,\n name: baseLevel.name,\n url,\n videoCodec: baseLevel.videoCodec,\n width: baseLevel.width,\n });\n if (baseLevel.audioGroups) {\n for (let i = 1; i < baseLevel.audioGroups.length; i++) {\n clonedLevel.addGroupId(\n 'audio',\n `${baseLevel.audioGroups[i]}_clone_${cloneId}`,\n );\n }\n }\n if (baseLevel.subtitleGroups) {\n for (let i = 1; i < baseLevel.subtitleGroups.length; i++) {\n clonedLevel.addGroupId(\n 'text',\n `${baseLevel.subtitleGroups[i]}_clone_${cloneId}`,\n );\n }\n }\n return clonedLevel;\n },\n );\n levels.push(...clonedVariants);\n cloneRenditionGroups(\n this.audioTracks,\n audioGroupCloneMap,\n uriReplacement,\n cloneId,\n );\n cloneRenditionGroups(\n this.subtitleTracks,\n subtitleGroupCloneMap,\n uriReplacement,\n cloneId,\n );\n });\n }\n\n private loadSteeringManifest(uri: string) {\n const config = this.hls.config;\n const Loader = config.loader;\n if (this.loader) {\n this.loader.destroy();\n }\n this.loader = new Loader(config) as Loader<LoaderContext>;\n\n let url: URL;\n try {\n url = new self.URL(uri);\n } catch (error) {\n this.enabled = false;\n this.log(`Failed to parse Steering Manifest URI: ${uri}`);\n return;\n }\n if (url.protocol !== 'data:') {\n const throughput =\n (this.hls.bandwidthEstimate || config.abrEwmaDefaultEstimate) | 0;\n url.searchParams.set('_HLS_pathway', this.pathwayId);\n url.searchParams.set('_HLS_throughput', '' + throughput);\n }\n const context: LoaderContext = {\n responseType: 'json',\n url: url.href,\n };\n\n const loadPolicy = config.steeringManifestLoadPolicy.default;\n const legacyRetryCompatibility: RetryConfig | Record<string, void> =\n loadPolicy.errorRetry || loadPolicy.timeoutRetry || {};\n const loaderConfig: LoaderConfiguration = {\n loadPolicy,\n timeout: loadPolicy.maxLoadTimeMs,\n maxRetry: legacyRetryCompatibility.maxNumRetry || 0,\n retryDelay: legacyRetryCompatibility.retryDelayMs || 0,\n maxRetryDelay: legacyRetryCompatibility.maxRetryDelayMs || 0,\n };\n\n const callbacks: LoaderCallbacks<LoaderContext> = {\n onSuccess: (\n response: LoaderResponse,\n stats: LoaderStats,\n context: LoaderContext,\n networkDetails: any,\n ) => {\n this.log(`Loaded steering manifest: \"${url}\"`);\n const steeringData = response.data as SteeringManifest;\n if (steeringData.VERSION !== 1) {\n this.log(`Steering VERSION ${steeringData.VERSION} not supported!`);\n return;\n }\n this.updated = performance.now();\n this.timeToLoad = steeringData.TTL;\n const {\n 'RELOAD-URI': reloadUri,\n 'PATHWAY-CLONES': pathwayClones,\n 'PATHWAY-PRIORITY': pathwayPriority,\n } = steeringData;\n if (reloadUri) {\n try {\n this.uri = new self.URL(reloadUri, url).href;\n } catch (error) {\n this.enabled = false;\n this.log(\n `Failed to parse Steering Manifest RELOAD-URI: ${reloadUri}`,\n );\n return;\n }\n }\n this.scheduleRefresh(this.uri || context.url);\n if (pathwayClones) {\n this.clonePathways(pathwayClones);\n }\n\n const loadedSteeringData: SteeringManifestLoadedData = {\n steeringManifest: steeringData,\n url: url.toString(),\n };\n this.hls.trigger(Events.STEERING_MANIFEST_LOADED, loadedSteeringData);\n\n if (pathwayPriority) {\n this.updatePathwayPriority(pathwayPriority);\n }\n },\n\n onError: (\n error: { code: number; text: string },\n context: LoaderContext,\n networkDetails: any,\n stats: LoaderStats,\n ) => {\n this.log(\n `Error loading steering manifest: ${error.code} ${error.text} (${context.url})`,\n );\n this.stopLoad();\n if (error.code === 410) {\n this.enabled = false;\n this.log(`Steering manifest ${context.url} no longer available`);\n return;\n }\n let ttl = this.timeToLoad * 1000;\n if (error.code === 429) {\n const loader = this.loader;\n if (typeof loader?.getResponseHeader === 'function') {\n const retryAfter = loader.getResponseHeader('Retry-After');\n if (retryAfter) {\n ttl = parseFloat(retryAfter) * 1000;\n }\n }\n this.log(`Steering manifest ${context.url} rate limited`);\n return;\n }\n this.scheduleRefresh(this.uri || context.url, ttl);\n },\n\n onTimeout: (\n stats: LoaderStats,\n context: LoaderContext,\n networkDetails: any,\n ) => {\n this.log(`Timeout loading steering manifest (${context.url})`);\n this.scheduleRefresh(this.uri || context.url);\n },\n };\n\n this.log(`Requesting steering manifest: ${url}`);\n this.loader.load(context, loaderConfig, callbacks);\n }\n\n private scheduleRefresh(uri: string, ttlMs: number = this.timeToLoad * 1000) {\n this.clearTimeout();\n this.reloadTimer = self.setTimeout(() => {\n const media = this.hls?.media;\n if (media && !media.ended) {\n this.loadSteeringManifest(uri);\n return;\n }\n this.scheduleRefresh(uri, this.timeToLoad * 1000);\n }, ttlMs);\n }\n}\n\nfunction cloneRenditionGroups(\n tracks: MediaPlaylist[] | null,\n groupCloneMap: Record<string, string>,\n uriReplacement: UriReplacement,\n cloneId: string,\n) {\n if (!tracks) {\n return;\n }\n Object.keys(groupCloneMap).forEach((audioGroupId) => {\n const clonedTracks = tracks\n .filter((track) => track.groupId === audioGroupId)\n .map((track) => {\n const clonedTrack = Object.assign({}, track);\n clonedTrack.details = undefined;\n clonedTrack.attrs = new AttrList(clonedTrack.attrs) as MediaAttributes;\n clonedTrack.url = clonedTrack.attrs.URI = performUriReplacement(\n track.url,\n track.attrs['STABLE-RENDITION-ID'],\n 'PER-RENDITION-URIS',\n uriReplacement,\n );\n clonedTrack.groupId = clonedTrack.attrs['GROUP-ID'] =\n groupCloneMap[audioGroupId];\n clonedTrack.attrs['PATHWAY-ID'] = cloneId;\n return clonedTrack;\n });\n tracks.push(...clonedTracks);\n });\n}\n\nfunction performUriReplacement(\n uri: string,\n stableId: string | undefined,\n perOptionKey: 'PER-VARIANT-URIS' | 'PER-RENDITION-URIS',\n uriReplacement: UriReplacement,\n): string {\n const {\n HOST: host,\n PARAMS: params,\n [perOptionKey]: perOptionUris,\n } = uriReplacement;\n let perVariantUri;\n if (stableId) {\n perVariantUri = perOptionUris?.[stableId];\n if (perVariantUri) {\n uri = perVariantUri;\n }\n }\n const url = new self.URL(uri);\n if (host && !perVariantUri) {\n url.host = host;\n }\n if (params) {\n Object.keys(params)\n .sort()\n .forEach((key) => {\n if (key) {\n url.searchParams.set(key, params[key]);\n }\n });\n }\n return url.href;\n}\n","import { logger } from '../utils/logger';\nimport type {\n LoaderCallbacks,\n LoaderContext,\n LoaderStats,\n Loader,\n LoaderConfiguration,\n LoaderResponse,\n} from '../types/loader';\nimport { LoadStats } from '../loader/load-stats';\nimport { type HlsConfig, RetryConfig } from '../config';\nimport { getRetryDelay, shouldRetry } from './error-helper';\n\nconst AGE_HEADER_LINE_REGEX = /^age:\\s*[\\d.]+\\s*$/im;\n\nclass XhrLoader implements Loader<LoaderContext> {\n private xhrSetup:\n | ((xhr: XMLHttpRequest, url: string) => Promise<void> | void)\n | null;\n private requestTimeout?: number;\n private retryTimeout?: number;\n private retryDelay: number;\n private config: LoaderConfiguration | null = null;\n private callbacks: LoaderCallbacks<LoaderContext> | null = null;\n public context: LoaderContext | null = null;\n\n private loader: XMLHttpRequest | null = null;\n public stats: LoaderStats;\n\n constructor(config: HlsConfig) {\n this.xhrSetup = config ? config.xhrSetup || null : null;\n this.stats = new LoadStats();\n this.retryDelay = 0;\n }\n\n destroy() {\n this.callbacks = null;\n this.abortInternal();\n this.loader = null;\n this.config = null;\n this.context = null;\n this.xhrSetup = null;\n }\n\n abortInternal() {\n const loader = this.loader;\n self.clearTimeout(this.requestTimeout);\n self.clearTimeout(this.retryTimeout);\n if (loader) {\n loader.onreadystatechange = null;\n loader.onprogress = null;\n if (loader.readyState !== 4) {\n this.stats.aborted = true;\n loader.abort();\n }\n }\n }\n\n abort() {\n this.abortInternal();\n if (this.callbacks?.onAbort) {\n this.callbacks.onAbort(\n this.stats,\n this.context as LoaderContext,\n this.loader,\n );\n }\n }\n\n load(\n context: LoaderContext,\n config: LoaderConfiguration,\n callbacks: LoaderCallbacks<LoaderContext>,\n ) {\n if (this.stats.loading.start) {\n throw new Error('Loader can only be used once.');\n }\n this.stats.loading.start = self.performance.now();\n this.context = context;\n this.config = config;\n this.callbacks = callbacks;\n this.loadInternal();\n }\n\n loadInternal() {\n const { config, context } = this;\n if (!config || !context) {\n return;\n }\n const xhr = (this.loader = new self.XMLHttpRequest());\n\n const stats = this.stats;\n stats.loading.first = 0;\n stats.loaded = 0;\n stats.aborted = false;\n const xhrSetup = this.xhrSetup;\n\n if (xhrSetup) {\n Promise.resolve()\n .then(() => {\n if (this.loader !== xhr || this.stats.aborted) return;\n return xhrSetup(xhr, context.url);\n })\n .catch((error: Error) => {\n if (this.loader !== xhr || this.stats.aborted) return;\n xhr.open('GET', context.url, true);\n return xhrSetup(xhr, context.url);\n })\n .then(() => {\n if (this.loader !== xhr || this.stats.aborted) return;\n this.openAndSendXhr(xhr, context, config);\n })\n .catch((error: Error) => {\n // IE11 throws an exception on xhr.open if attempting to access an HTTP resource over HTTPS\n this.callbacks!.onError(\n { code: xhr.status, text: error.message },\n context,\n xhr,\n stats,\n );\n return;\n });\n } else {\n this.openAndSendXhr(xhr, context, config);\n }\n }\n\n openAndSendXhr(\n xhr: XMLHttpRequest,\n context: LoaderContext,\n config: LoaderConfiguration,\n ) {\n if (!xhr.readyState) {\n xhr.open('GET', context.url, true);\n }\n\n const headers = context.headers;\n const { maxTimeToFirstByteMs, maxLoadTimeMs } = config.loadPolicy;\n if (headers) {\n for (const header in headers) {\n xhr.setRequestHeader(header, headers[header]);\n }\n }\n\n if (context.rangeEnd) {\n xhr.setRequestHeader(\n 'Range',\n 'bytes=' + context.rangeStart + '-' + (context.rangeEnd - 1),\n );\n }\n\n xhr.onreadystatechange = this.readystatechange.bind(this);\n xhr.onprogress = this.loadprogress.bind(this);\n xhr.responseType = context.responseType as XMLHttpRequestResponseType;\n // setup timeout before we perform request\n self.clearTimeout(this.requestTimeout);\n config.timeout =\n maxTimeToFirstByteMs && Number.isFinite(maxTimeToFirstByteMs)\n ? maxTimeToFirstByteMs\n : maxLoadTimeMs;\n this.requestTimeout = self.setTimeout(\n this.loadtimeout.bind(this),\n config.timeout,\n );\n xhr.send();\n }\n\n readystatechange() {\n const { context, loader: xhr, stats } = this;\n if (!context || !xhr) {\n return;\n }\n const readyState = xhr.readyState;\n const config = this.config as LoaderConfiguration;\n\n // don't proceed if xhr has been aborted\n if (stats.aborted) {\n return;\n }\n\n // >= HEADERS_RECEIVED\n if (readyState >= 2) {\n if (stats.loading.first === 0) {\n stats.loading.first = Math.max(\n self.performance.now(),\n stats.loading.start,\n );\n // readyState >= 2 AND readyState !==4 (readyState = HEADERS_RECEIVED || LOADING) rearm timeout as xhr not finished yet\n if (config.timeout !== config.loadPolicy.maxLoadTimeMs) {\n self.clearTimeout(this.requestTimeout);\n config.timeout = config.loadPolicy.maxLoadTimeMs;\n this.requestTimeout = self.setTimeout(\n this.loadtimeout.bind(this),\n config.loadPolicy.maxLoadTimeMs -\n (stats.loading.first - stats.loading.start),\n );\n }\n }\n\n if (readyState === 4) {\n self.clearTimeout(this.requestTimeout);\n xhr.onreadystatechange = null;\n xhr.onprogress = null;\n const status = xhr.status;\n // http status between 200 to 299 are all successful\n const useResponseText =\n xhr.responseType === 'text' ? xhr.responseText : null;\n if (status >= 200 && status < 300) {\n const data = useResponseText ?? xhr.response;\n if (data != null) {\n stats.loading.end = Math.max(\n self.performance.now(),\n stats.loading.first,\n );\n const len =\n xhr.responseType === 'arraybuffer'\n ? data.byteLength\n : data.length;\n stats.loaded = stats.total = len;\n stats.bwEstimate =\n (stats.total * 8000) / (stats.loading.end - stats.loading.first);\n if (!this.callbacks) {\n return;\n }\n const onProgress = this.callbacks.onProgress;\n if (onProgress) {\n onProgress(stats, context, data, xhr);\n }\n if (!this.callbacks) {\n return;\n }\n const response: LoaderResponse = {\n url: xhr.responseURL,\n data: data,\n code: status,\n };\n\n this.callbacks.onSuccess(response, stats, context, xhr);\n return;\n }\n }\n\n // Handle bad status or nullish response\n const retryConfig = config.loadPolicy.errorRetry;\n const retryCount = stats.retry;\n // if max nb of retries reached or if http status between 400 and 499 (such error cannot be recovered, retrying is useless), return error\n const response: LoaderResponse = {\n url: context.url,\n data: undefined,\n code: status,\n };\n if (shouldRetry(retryConfig, retryCount, false, response)) {\n this.retry(retryConfig);\n } else {\n logger.error(`${status} while loading ${context.url}`);\n this.callbacks!.onError(\n { code: status, text: xhr.statusText },\n context,\n xhr,\n stats,\n );\n }\n }\n }\n }\n\n loadtimeout() {\n if (!this.config) return;\n const retryConfig = this.config.loadPolicy.timeoutRetry;\n const retryCount = this.stats.retry;\n if (shouldRetry(retryConfig, retryCount, true)) {\n this.retry(retryConfig);\n } else {\n logger.warn(`timeout while loading ${this.context?.url}`);\n const callbacks = this.callbacks;\n if (callbacks) {\n this.abortInternal();\n callbacks.onTimeout(\n this.stats,\n this.context as LoaderContext,\n this.loader,\n );\n }\n }\n }\n\n retry(retryConfig: RetryConfig) {\n const { context, stats } = this;\n this.retryDelay = getRetryDelay(retryConfig, stats.retry);\n stats.retry++;\n logger.warn(\n `${\n status ? 'HTTP Status ' + status : 'Timeout'\n } while loading ${context?.url}, retrying ${stats.retry}/${\n retryConfig.maxNumRetry\n } in ${this.retryDelay}ms`,\n );\n // abort and reset internal state\n this.abortInternal();\n this.loader = null;\n // schedule retry\n self.clearTimeout(this.retryTimeout);\n this.retryTimeout = self.setTimeout(\n this.loadInternal.bind(this),\n this.retryDelay,\n );\n }\n\n loadprogress(event: ProgressEvent) {\n const stats = this.stats;\n\n stats.loaded = event.loaded;\n if (event.lengthComputable) {\n stats.total = event.total;\n }\n }\n\n getCacheAge(): number | null {\n let result: number | null = null;\n if (\n this.loader &&\n AGE_HEADER_LINE_REGEX.test(this.loader.getAllResponseHeaders())\n ) {\n const ageHeader = this.loader.getResponseHeader('age');\n result = ageHeader ? parseFloat(ageHeader) : null;\n }\n return result;\n }\n\n getResponseHeader(name: string): string | null {\n if (\n this.loader &&\n new RegExp(`^${name}:\\\\s*[\\\\d.]+\\\\s*$`, 'im').test(\n this.loader.getAllResponseHeaders(),\n )\n ) {\n return this.loader.getResponseHeader(name);\n }\n return null;\n }\n}\n\nexport default XhrLoader;\n","import {\n LoaderCallbacks,\n LoaderContext,\n Loader,\n LoaderStats,\n LoaderConfiguration,\n LoaderOnProgress,\n LoaderResponse,\n} from '../types/loader';\nimport { LoadStats } from '../loader/load-stats';\nimport ChunkCache from '../demux/chunk-cache';\n\nexport function fetchSupported() {\n if (\n // @ts-ignore\n self.fetch &&\n self.AbortController &&\n self.ReadableStream &&\n self.Request\n ) {\n try {\n new self.ReadableStream({}); // eslint-disable-line no-new\n return true;\n } catch (e) {\n /* noop */\n }\n }\n return false;\n}\n\nconst BYTERANGE = /(\\d+)-(\\d+)\\/(\\d+)/;\n\nclass FetchLoader implements Loader<LoaderContext> {\n private fetchSetup: Function;\n private requestTimeout?: number;\n private request: Request | null = null;\n private response: Response | null = null;\n private controller: AbortController;\n public context: LoaderContext | null = null;\n private config: LoaderConfiguration | null = null;\n private callbacks: LoaderCallbacks<LoaderContext> | null = null;\n public stats: LoaderStats;\n private loader: Response | null = null;\n\n constructor(config /* HlsConfig */) {\n this.fetchSetup = config.fetchSetup || getRequest;\n this.controller = new self.AbortController();\n this.stats = new LoadStats();\n }\n\n destroy(): void {\n this.loader =\n this.callbacks =\n this.context =\n this.config =\n this.request =\n null;\n this.abortInternal();\n this.response = null;\n // @ts-ignore\n this.fetchSetup = this.controller = this.stats = null;\n }\n\n abortInternal(): void {\n if (this.controller && !this.stats.loading.end) {\n this.stats.aborted = true;\n this.controller.abort();\n }\n }\n\n abort(): void {\n this.abortInternal();\n if (this.callbacks?.onAbort) {\n this.callbacks.onAbort(\n this.stats,\n this.context as LoaderContext,\n this.response,\n );\n }\n }\n\n load(\n context: LoaderContext,\n config: LoaderConfiguration,\n callbacks: LoaderCallbacks<LoaderContext>,\n ): void {\n const stats = this.stats;\n if (stats.loading.start) {\n throw new Error('Loader can only be used once.');\n }\n stats.loading.start = self.performance.now();\n\n const initParams = getRequestParameters(context, this.controller.signal);\n const onProgress: LoaderOnProgress<LoaderContext> | undefined =\n callbacks.onProgress;\n const isArrayBuffer = context.responseType === 'arraybuffer';\n const LENGTH = isArrayBuffer ? 'byteLength' : 'length';\n const { maxTimeToFirstByteMs, maxLoadTimeMs } = config.loadPolicy;\n\n this.context = context;\n this.config = config;\n this.callbacks = callbacks;\n this.request = this.fetchSetup(context, initParams);\n self.clearTimeout(this.requestTimeout);\n config.timeout =\n maxTimeToFirstByteMs && Number.isFinite(maxTimeToFirstByteMs)\n ? maxTimeToFirstByteMs\n : maxLoadTimeMs;\n this.requestTimeout = self.setTimeout(() => {\n this.abortInternal();\n callbacks.onTimeout(stats, context, this.response);\n }, config.timeout);\n\n self\n .fetch(this.request as Request)\n .then((response: Response): Promise<string | ArrayBuffer> => {\n this.response = this.loader = response;\n\n const first = Math.max(self.performance.now(), stats.loading.start);\n\n self.clearTimeout(this.requestTimeout);\n config.timeout = maxLoadTimeMs;\n this.requestTimeout = self.setTimeout(\n () => {\n this.abortInternal();\n callbacks.onTimeout(stats, context, this.response);\n },\n maxLoadTimeMs - (first - stats.loading.start),\n );\n\n if (!response.ok) {\n const { status, statusText } = response;\n throw new FetchError(\n statusText || 'fetch, bad network response',\n status,\n response,\n );\n }\n stats.loading.first = first;\n\n stats.total = getContentLength(response.headers) || stats.total;\n\n if (onProgress && Number.isFinite(config.highWaterMark)) {\n return this.loadProgressively(\n response,\n stats,\n context,\n config.highWaterMark,\n onProgress,\n );\n }\n\n if (isArrayBuffer) {\n return response.arrayBuffer();\n }\n if (context.responseType === 'json') {\n return response.json();\n }\n return response.text();\n })\n .then((responseData: string | ArrayBuffer) => {\n const response = this.response;\n if (!response) {\n throw new Error('loader destroyed');\n }\n self.clearTimeout(this.requestTimeout);\n stats.loading.end = Math.max(\n self.performance.now(),\n stats.loading.first,\n );\n const total = responseData[LENGTH];\n if (total) {\n stats.loaded = stats.total = total;\n }\n\n const loaderResponse: LoaderResponse = {\n url: response.url,\n data: responseData,\n code: response.status,\n };\n\n if (onProgress && !Number.isFinite(config.highWaterMark)) {\n onProgress(stats, context, responseData, response);\n }\n\n callbacks.onSuccess(loaderResponse, stats, context, response);\n })\n .catch((error) => {\n self.clearTimeout(this.requestTimeout);\n if (stats.aborted) {\n return;\n }\n // CORS errors result in an undefined code. Set it to 0 here to align with XHR's behavior\n // when destroying, 'error' itself can be undefined\n const code: number = !error ? 0 : error.code || 0;\n const text: string = !error ? null : error.message;\n callbacks.onError(\n { code, text },\n context,\n error ? error.details : null,\n stats,\n );\n });\n }\n\n getCacheAge(): number | null {\n let result: number | null = null;\n if (this.response) {\n const ageHeader = this.response.headers.get('age');\n result = ageHeader ? parseFloat(ageHeader) : null;\n }\n return result;\n }\n\n getResponseHeader(name: string): string | null {\n return this.response ? this.response.headers.get(name) : null;\n }\n\n private loadProgressively(\n response: Response,\n stats: LoaderStats,\n context: LoaderContext,\n highWaterMark: number = 0,\n onProgress: LoaderOnProgress<LoaderContext>,\n ): Promise<ArrayBuffer> {\n const chunkCache = new ChunkCache();\n const reader = (response.body as ReadableStream).getReader();\n\n const pump = (): Promise<ArrayBuffer> => {\n return reader\n .read()\n .then((data) => {\n if (data.done) {\n if (chunkCache.dataLength) {\n onProgress(stats, context, chunkCache.flush(), response);\n }\n\n return Promise.resolve(new ArrayBuffer(0));\n }\n const chunk: Uint8Array = data.value;\n const len = chunk.length;\n stats.loaded += len;\n if (len < highWaterMark || chunkCache.dataLength) {\n // The current chunk is too small to to be emitted or the cache already has data\n // Push it to the cache\n chunkCache.push(chunk);\n if (chunkCache.dataLength >= highWaterMark) {\n // flush in order to join the typed arrays\n onProgress(stats, context, chunkCache.flush(), response);\n }\n } else {\n // If there's nothing cached already, and the chache is large enough\n // just emit the progress event\n onProgress(stats, context, chunk, response);\n }\n return pump();\n })\n .catch(() => {\n /* aborted */\n return Promise.reject();\n });\n };\n\n return pump();\n }\n}\n\nfunction getRequestParameters(context: LoaderContext, signal): any {\n const initParams: any = {\n method: 'GET',\n mode: 'cors',\n credentials: 'same-origin',\n signal,\n headers: new self.Headers(Object.assign({}, context.headers)),\n };\n\n if (context.rangeEnd) {\n initParams.headers.set(\n 'Range',\n 'bytes=' + context.rangeStart + '-' + String(context.rangeEnd - 1),\n );\n }\n\n return initParams;\n}\n\nfunction getByteRangeLength(byteRangeHeader: string): number | undefined {\n const result = BYTERANGE.exec(byteRangeHeader);\n if (result) {\n return parseInt(result[2]) - parseInt(result[1]) + 1;\n }\n}\n\nfunction getContentLength(headers: Headers): number | undefined {\n const contentRange = headers.get('Content-Range');\n if (contentRange) {\n const byteRangeLength = getByteRangeLength(contentRange);\n if (Number.isFinite(byteRangeLength)) {\n return byteRangeLength;\n }\n }\n const contentLength = headers.get('Content-Length');\n if (contentLength) {\n return parseInt(contentLength);\n }\n}\n\nfunction getRequest(context: LoaderContext, initParams: any): Request {\n return new self.Request(context.url, initParams);\n}\n\nclass FetchError extends Error {\n public code: number;\n public details: any;\n constructor(message: string, code: number, details: any) {\n super(message);\n this.code = code;\n this.details = details;\n }\n}\n\nexport default FetchLoader;\n","import {\n ManifestLoadedData,\n ManifestParsedData,\n LevelLoadedData,\n ErrorData,\n LevelSwitchingData,\n LevelsUpdatedData,\n ManifestLoadingData,\n FragBufferedData,\n} from '../types/events';\nimport { Level, VideoRangeValues, isVideoRange } from '../types/level';\nimport { Events } from '../events';\nimport { ErrorTypes, ErrorDetails } from '../errors';\nimport {\n areCodecsMediaSourceSupported,\n codecsSetSelectionPreferenceValue,\n convertAVC1ToAVCOTI,\n getCodecCompatibleName,\n videoCodecPreferenceValue,\n} from '../utils/codecs';\nimport BasePlaylistController from './base-playlist-controller';\nimport { PlaylistContextType, PlaylistLevelType } from '../types/loader';\nimport ContentSteeringController from './content-steering-controller';\nimport { reassignFragmentLevelIndexes } from '../utils/level-helper';\nimport { hlsDefaultConfig } from '../config';\nimport type Hls from '../hls';\nimport type { HlsUrlParameters, LevelParsed } from '../types/level';\nimport type { MediaPlaylist } from '../types/media-playlist';\n\nlet chromeOrFirefox: boolean;\n\nexport default class LevelController extends BasePlaylistController {\n private _levels: Level[] = [];\n private _firstLevel: number = -1;\n private _maxAutoLevel: number = -1;\n private _startLevel?: number;\n private currentLevel: Level | null = null;\n private currentLevelIndex: number = -1;\n private manualLevelIndex: number = -1;\n private steering: ContentSteeringController | null;\n\n public onParsedComplete!: Function;\n\n constructor(\n hls: Hls,\n contentSteeringController: ContentSteeringController | null,\n ) {\n super(hls, '[level-controller]');\n this.steering = contentSteeringController;\n this._registerListeners();\n }\n\n private _registerListeners() {\n const { hls } = this;\n hls.on(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n hls.on(Events.MANIFEST_LOADED, this.onManifestLoaded, this);\n hls.on(Events.LEVEL_LOADED, this.onLevelLoaded, this);\n hls.on(Events.LEVELS_UPDATED, this.onLevelsUpdated, this);\n hls.on(Events.FRAG_BUFFERED, this.onFragBuffered, this);\n hls.on(Events.ERROR, this.onError, this);\n }\n\n private _unregisterListeners() {\n const { hls } = this;\n hls.off(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n hls.off(Events.MANIFEST_LOADED, this.onManifestLoaded, this);\n hls.off(Events.LEVEL_LOADED, this.onLevelLoaded, this);\n hls.off(Events.LEVELS_UPDATED, this.onLevelsUpdated, this);\n hls.off(Events.FRAG_BUFFERED, this.onFragBuffered, this);\n hls.off(Events.ERROR, this.onError, this);\n }\n\n public destroy() {\n this._unregisterListeners();\n this.steering = null;\n this.resetLevels();\n super.destroy();\n }\n\n public stopLoad(): void {\n const levels = this._levels;\n\n // clean up live level details to force reload them, and reset load errors\n levels.forEach((level) => {\n level.loadError = 0;\n level.fragmentError = 0;\n });\n\n super.stopLoad();\n }\n\n private resetLevels() {\n this._startLevel = undefined;\n this.manualLevelIndex = -1;\n this.currentLevelIndex = -1;\n this.currentLevel = null;\n this._levels = [];\n this._maxAutoLevel = -1;\n }\n\n private onManifestLoading(\n event: Events.MANIFEST_LOADING,\n data: ManifestLoadingData,\n ) {\n this.resetLevels();\n }\n\n protected onManifestLoaded(\n event: Events.MANIFEST_LOADED,\n data: ManifestLoadedData,\n ) {\n const preferManagedMediaSource = this.hls.config.preferManagedMediaSource;\n const levels: Level[] = [];\n const redundantSet: { [key: string]: Level } = {};\n const generatePathwaySet: { [key: string]: number } = {};\n let resolutionFound = false;\n let videoCodecFound = false;\n let audioCodecFound = false;\n\n data.levels.forEach((levelParsed: LevelParsed) => {\n const attributes = levelParsed.attrs;\n\n // erase audio codec info if browser does not support mp4a.40.34.\n // demuxer will autodetect codec and fallback to mpeg/audio\n let { audioCodec, videoCodec } = levelParsed;\n if (audioCodec?.indexOf('mp4a.40.34') !== -1) {\n chromeOrFirefox ||= /chrome|firefox/i.test(navigator.userAgent);\n if (chromeOrFirefox) {\n levelParsed.audioCodec = audioCodec = undefined;\n }\n }\n\n if (audioCodec) {\n levelParsed.audioCodec = audioCodec = getCodecCompatibleName(\n audioCodec,\n preferManagedMediaSource,\n );\n }\n\n if (videoCodec?.indexOf('avc1') === 0) {\n videoCodec = levelParsed.videoCodec = convertAVC1ToAVCOTI(videoCodec);\n }\n\n // only keep levels with supported audio/video codecs\n const { width, height, unknownCodecs } = levelParsed;\n resolutionFound ||= !!(width && height);\n videoCodecFound ||= !!videoCodec;\n audioCodecFound ||= !!audioCodec;\n if (\n unknownCodecs?.length ||\n (audioCodec &&\n !areCodecsMediaSourceSupported(\n audioCodec,\n 'audio',\n preferManagedMediaSource,\n )) ||\n (videoCodec &&\n !areCodecsMediaSourceSupported(\n videoCodec,\n 'video',\n preferManagedMediaSource,\n ))\n ) {\n return;\n }\n\n const {\n CODECS,\n 'FRAME-RATE': FRAMERATE,\n 'HDCP-LEVEL': HDCP,\n 'PATHWAY-ID': PATHWAY,\n RESOLUTION,\n 'VIDEO-RANGE': VIDEO_RANGE,\n } = attributes;\n const contentSteeringPrefix = `${PATHWAY || '.'}-`;\n const levelKey = `${contentSteeringPrefix}${levelParsed.bitrate}-${RESOLUTION}-${FRAMERATE}-${CODECS}-${VIDEO_RANGE}-${HDCP}`;\n\n if (!redundantSet[levelKey]) {\n const level = new Level(levelParsed);\n redundantSet[levelKey] = level;\n generatePathwaySet[levelKey] = 1;\n levels.push(level);\n } else if (\n redundantSet[levelKey].uri !== levelParsed.url &&\n !levelParsed.attrs['PATHWAY-ID']\n ) {\n // Assign Pathway IDs to Redundant Streams (default Pathways is \".\". Redundant Streams \"..\", \"...\", and so on.)\n // Content Steering controller to handles Pathway fallback on error\n const pathwayCount = (generatePathwaySet[levelKey] += 1);\n levelParsed.attrs['PATHWAY-ID'] = new Array(pathwayCount + 1).join('.');\n const level = new Level(levelParsed);\n redundantSet[levelKey] = level;\n levels.push(level);\n } else {\n redundantSet[levelKey].addGroupId('audio', attributes.AUDIO);\n redundantSet[levelKey].addGroupId('text', attributes.SUBTITLES);\n }\n });\n\n this.filterAndSortMediaOptions(\n levels,\n data,\n resolutionFound,\n videoCodecFound,\n audioCodecFound,\n );\n }\n\n private filterAndSortMediaOptions(\n filteredLevels: Level[],\n data: ManifestLoadedData,\n resolutionFound: boolean,\n videoCodecFound: boolean,\n audioCodecFound: boolean,\n ) {\n let audioTracks: MediaPlaylist[] = [];\n let subtitleTracks: MediaPlaylist[] = [];\n let levels = filteredLevels;\n\n // remove audio-only and invalid video-range levels if we also have levels with video codecs or RESOLUTION signalled\n if ((resolutionFound || videoCodecFound) && audioCodecFound) {\n levels = levels.filter(\n ({ videoCodec, videoRange, width, height }) =>\n (!!videoCodec || !!(width && height)) && isVideoRange(videoRange),\n );\n }\n\n if (levels.length === 0) {\n // Dispatch error after MANIFEST_LOADED is done propagating\n Promise.resolve().then(() => {\n if (this.hls) {\n if (data.levels.length) {\n this.warn(\n `One or more CODECS in variant not supported: ${JSON.stringify(\n data.levels[0].attrs,\n )}`,\n );\n }\n const error = new Error(\n 'no level with compatible codecs found in manifest',\n );\n this.hls.trigger(Events.ERROR, {\n type: ErrorTypes.MEDIA_ERROR,\n details: ErrorDetails.MANIFEST_INCOMPATIBLE_CODECS_ERROR,\n fatal: true,\n url: data.url,\n error,\n reason: error.message,\n });\n }\n });\n return;\n }\n\n if (data.audioTracks) {\n const { preferManagedMediaSource } = this.hls.config;\n audioTracks = data.audioTracks.filter(\n (track) =>\n !track.audioCodec ||\n areCodecsMediaSourceSupported(\n track.audioCodec,\n 'audio',\n preferManagedMediaSource,\n ),\n );\n // Assign ids after filtering as array indices by group-id\n assignTrackIdsByGroup(audioTracks);\n }\n\n if (data.subtitles) {\n subtitleTracks = data.subtitles;\n assignTrackIdsByGroup(subtitleTracks);\n }\n // start bitrate is the first bitrate of the manifest\n const unsortedLevels = levels.slice(0);\n // sort levels from lowest to highest\n levels.sort((a, b) => {\n if (a.attrs['HDCP-LEVEL'] !== b.attrs['HDCP-LEVEL']) {\n return (a.attrs['HDCP-LEVEL'] || '') > (b.attrs['HDCP-LEVEL'] || '')\n ? 1\n : -1;\n }\n // sort on height before bitrate for cap-level-controller\n if (resolutionFound && a.height !== b.height) {\n return a.height - b.height;\n }\n if (a.frameRate !== b.frameRate) {\n return a.frameRate - b.frameRate;\n }\n if (a.videoRange !== b.videoRange) {\n return (\n VideoRangeValues.indexOf(a.videoRange) -\n VideoRangeValues.indexOf(b.videoRange)\n );\n }\n if (a.videoCodec !== b.videoCodec) {\n const valueA = videoCodecPreferenceValue(a.videoCodec);\n const valueB = videoCodecPreferenceValue(b.videoCodec);\n if (valueA !== valueB) {\n return valueB - valueA;\n }\n }\n if (a.uri === b.uri && a.codecSet !== b.codecSet) {\n const valueA = codecsSetSelectionPreferenceValue(a.codecSet);\n const valueB = codecsSetSelectionPreferenceValue(b.codecSet);\n if (valueA !== valueB) {\n return valueB - valueA;\n }\n }\n if (a.averageBitrate !== b.averageBitrate) {\n return a.averageBitrate - b.averageBitrate;\n }\n return 0;\n });\n\n let firstLevelInPlaylist = unsortedLevels[0];\n if (this.steering) {\n levels = this.steering.filterParsedLevels(levels);\n if (levels.length !== unsortedLevels.length) {\n for (let i = 0; i < unsortedLevels.length; i++) {\n if (unsortedLevels[i].pathwayId === levels[0].pathwayId) {\n firstLevelInPlaylist = unsortedLevels[i];\n break;\n }\n }\n }\n }\n\n this._levels = levels;\n\n // find index of first level in sorted levels\n for (let i = 0; i < levels.length; i++) {\n if (levels[i] === firstLevelInPlaylist) {\n this._firstLevel = i;\n const firstLevelBitrate = firstLevelInPlaylist.bitrate;\n const bandwidthEstimate = this.hls.bandwidthEstimate;\n this.log(\n `manifest loaded, ${levels.length} level(s) found, first bitrate: ${firstLevelBitrate}`,\n );\n // Update default bwe to first variant bitrate as long it has not been configured or set\n if (this.hls.userConfig?.abrEwmaDefaultEstimate === undefined) {\n const startingBwEstimate = Math.min(\n firstLevelBitrate,\n this.hls.config.abrEwmaDefaultEstimateMax,\n );\n if (\n startingBwEstimate > bandwidthEstimate &&\n bandwidthEstimate === hlsDefaultConfig.abrEwmaDefaultEstimate\n ) {\n this.hls.bandwidthEstimate = startingBwEstimate;\n }\n }\n break;\n }\n }\n\n // Audio is only alternate if manifest include a URI along with the audio group tag,\n // and this is not an audio-only stream where levels contain audio-only\n const audioOnly = audioCodecFound && !videoCodecFound;\n const edata: ManifestParsedData = {\n levels,\n audioTracks,\n subtitleTracks,\n sessionData: data.sessionData,\n sessionKeys: data.sessionKeys,\n firstLevel: this._firstLevel,\n stats: data.stats,\n audio: audioCodecFound,\n video: videoCodecFound,\n altAudio: !audioOnly && audioTracks.some((t) => !!t.url),\n };\n this.hls.trigger(Events.MANIFEST_PARSED, edata);\n\n // Initiate loading after all controllers have received MANIFEST_PARSED\n if (this.hls.config.autoStartLoad || this.hls.forceStartLoad) {\n this.hls.startLoad(this.hls.config.startPosition);\n }\n }\n\n get levels(): Level[] | null {\n if (this._levels.length === 0) {\n return null;\n }\n return this._levels;\n }\n\n get level(): number {\n return this.currentLevelIndex;\n }\n\n set level(newLevel: number) {\n const levels = this._levels;\n if (levels.length === 0) {\n return;\n }\n // check if level idx is valid\n if (newLevel < 0 || newLevel >= levels.length) {\n // invalid level id given, trigger error\n const error = new Error('invalid level idx');\n const fatal = newLevel < 0;\n this.hls.trigger(Events.ERROR, {\n type: ErrorTypes.OTHER_ERROR,\n details: ErrorDetails.LEVEL_SWITCH_ERROR,\n level: newLevel,\n fatal,\n error,\n reason: error.message,\n });\n if (fatal) {\n return;\n }\n newLevel = Math.min(newLevel, levels.length - 1);\n }\n\n const lastLevelIndex = this.currentLevelIndex;\n const lastLevel = this.currentLevel;\n const lastPathwayId = lastLevel ? lastLevel.attrs['PATHWAY-ID'] : undefined;\n const level = levels[newLevel];\n const pathwayId = level.attrs['PATHWAY-ID'];\n this.currentLevelIndex = newLevel;\n this.currentLevel = level;\n\n if (\n lastLevelIndex === newLevel &&\n level.details &&\n lastLevel &&\n lastPathwayId === pathwayId\n ) {\n return;\n }\n\n this.log(\n `Switching to level ${newLevel} (${\n level.height ? level.height + 'p ' : ''\n }${level.videoRange ? level.videoRange + ' ' : ''}${\n level.codecSet ? level.codecSet + ' ' : ''\n }@${level.bitrate})${\n pathwayId ? ' with Pathway ' + pathwayId : ''\n } from level ${lastLevelIndex}${\n lastPathwayId ? ' with Pathway ' + lastPathwayId : ''\n }`,\n );\n\n const levelSwitchingData: LevelSwitchingData = {\n level: newLevel,\n attrs: level.attrs,\n details: level.details,\n bitrate: level.bitrate,\n averageBitrate: level.averageBitrate,\n maxBitrate: level.maxBitrate,\n realBitrate: level.realBitrate,\n width: level.width,\n height: level.height,\n codecSet: level.codecSet,\n audioCodec: level.audioCodec,\n videoCodec: level.videoCodec,\n audioGroups: level.audioGroups,\n subtitleGroups: level.subtitleGroups,\n loaded: level.loaded,\n loadError: level.loadError,\n fragmentError: level.fragmentError,\n name: level.name,\n id: level.id,\n uri: level.uri,\n url: level.url,\n urlId: 0,\n audioGroupIds: level.audioGroupIds,\n textGroupIds: level.textGroupIds,\n };\n\n this.hls.trigger(Events.LEVEL_SWITCHING, levelSwitchingData);\n // check if we need to load playlist for this level\n const levelDetails = level.details;\n if (!levelDetails || levelDetails.live) {\n // level not retrieved yet, or live playlist we need to (re)load it\n const hlsUrlParameters = this.switchParams(\n level.uri,\n lastLevel?.details,\n levelDetails,\n );\n this.loadPlaylist(hlsUrlParameters);\n }\n }\n\n get manualLevel(): number {\n return this.manualLevelIndex;\n }\n\n set manualLevel(newLevel) {\n this.manualLevelIndex = newLevel;\n if (this._startLevel === undefined) {\n this._startLevel = newLevel;\n }\n\n if (newLevel !== -1) {\n this.level = newLevel;\n }\n }\n\n get firstLevel(): number {\n return this._firstLevel;\n }\n\n set firstLevel(newLevel) {\n this._firstLevel = newLevel;\n }\n\n get startLevel(): number {\n // Setting hls.startLevel (this._startLevel) overrides config.startLevel\n if (this._startLevel === undefined) {\n const configStartLevel = this.hls.config.startLevel;\n if (configStartLevel !== undefined) {\n return configStartLevel;\n }\n return this.hls.firstAutoLevel;\n }\n return this._startLevel;\n }\n\n set startLevel(newLevel: number) {\n this._startLevel = newLevel;\n }\n\n protected onError(event: Events.ERROR, data: ErrorData) {\n if (data.fatal || !data.context) {\n return;\n }\n\n if (\n data.context.type === PlaylistContextType.LEVEL &&\n data.context.level === this.level\n ) {\n this.checkRetry(data);\n }\n }\n\n // reset errors on the successful load of a fragment\n protected onFragBuffered(\n event: Events.FRAG_BUFFERED,\n { frag }: FragBufferedData,\n ) {\n if (frag !== undefined && frag.type === PlaylistLevelType.MAIN) {\n const el = frag.elementaryStreams;\n if (!Object.keys(el).some((type) => !!el[type])) {\n return;\n }\n const level = this._levels[frag.level];\n if (level?.loadError) {\n this.log(\n `Resetting level error count of ${level.loadError} on frag buffered`,\n );\n level.loadError = 0;\n }\n }\n }\n\n protected onLevelLoaded(event: Events.LEVEL_LOADED, data: LevelLoadedData) {\n const { level, details } = data;\n const curLevel = this._levels[level];\n\n if (!curLevel) {\n this.warn(`Invalid level index ${level}`);\n if (data.deliveryDirectives?.skip) {\n details.deltaUpdateFailed = true;\n }\n return;\n }\n\n // only process level loaded events matching with expected level\n if (level === this.currentLevelIndex) {\n // reset level load error counter on successful level loaded only if there is no issues with fragments\n if (curLevel.fragmentError === 0) {\n curLevel.loadError = 0;\n }\n this.playlistLoaded(level, data, curLevel.details);\n } else if (data.deliveryDirectives?.skip) {\n // received a delta playlist update that cannot be merged\n details.deltaUpdateFailed = true;\n }\n }\n\n protected loadPlaylist(hlsUrlParameters?: HlsUrlParameters) {\n super.loadPlaylist();\n const currentLevelIndex = this.currentLevelIndex;\n const currentLevel = this.currentLevel;\n\n if (currentLevel && this.shouldLoadPlaylist(currentLevel)) {\n let url = currentLevel.uri;\n if (hlsUrlParameters) {\n try {\n url = hlsUrlParameters.addDirectives(url);\n } catch (error) {\n this.warn(\n `Could not construct new URL with HLS Delivery Directives: ${error}`,\n );\n }\n }\n\n const pathwayId = currentLevel.attrs['PATHWAY-ID'];\n this.log(\n `Loading level index ${currentLevelIndex}${\n hlsUrlParameters?.msn !== undefined\n ? ' at sn ' +\n hlsUrlParameters.msn +\n ' part ' +\n hlsUrlParameters.part\n : ''\n } with${pathwayId ? ' Pathway ' + pathwayId : ''} ${url}`,\n );\n\n // console.log('Current audio track group ID:', this.hls.audioTracks[this.hls.audioTrack].groupId);\n // console.log('New video quality level audio group id:', levelObject.attrs.AUDIO, level);\n this.clearTimer();\n this.hls.trigger(Events.LEVEL_LOADING, {\n url,\n level: currentLevelIndex,\n pathwayId: currentLevel.attrs['PATHWAY-ID'],\n id: 0, // Deprecated Level urlId\n deliveryDirectives: hlsUrlParameters || null,\n });\n }\n }\n\n get nextLoadLevel() {\n if (this.manualLevelIndex !== -1) {\n return this.manualLevelIndex;\n } else {\n return this.hls.nextAutoLevel;\n }\n }\n\n set nextLoadLevel(nextLevel) {\n this.level = nextLevel;\n if (this.manualLevelIndex === -1) {\n this.hls.nextAutoLevel = nextLevel;\n }\n }\n\n removeLevel(levelIndex: number) {\n const levels = this._levels.filter((level, index) => {\n if (index !== levelIndex) {\n return true;\n }\n if (this.steering) {\n this.steering.removeLevel(level);\n }\n if (level === this.currentLevel) {\n this.currentLevel = null;\n this.currentLevelIndex = -1;\n if (level.details) {\n level.details.fragments.forEach((f) => (f.level = -1));\n }\n }\n return false;\n });\n reassignFragmentLevelIndexes(levels);\n this._levels = levels;\n if (this.currentLevelIndex > -1 && this.currentLevel?.details) {\n this.currentLevelIndex = this.currentLevel.details.fragments[0].level;\n }\n this.hls.trigger(Events.LEVELS_UPDATED, { levels });\n }\n\n private onLevelsUpdated(\n event: Events.LEVELS_UPDATED,\n { levels }: LevelsUpdatedData,\n ) {\n this._levels = levels;\n }\n\n public checkMaxAutoUpdated() {\n const { autoLevelCapping, maxAutoLevel, maxHdcpLevel } = this.hls;\n if (this._maxAutoLevel !== maxAutoLevel) {\n this._maxAutoLevel = maxAutoLevel;\n this.hls.trigger(Events.MAX_AUTO_LEVEL_UPDATED, {\n autoLevelCapping,\n levels: this.levels,\n maxAutoLevel,\n minAutoLevel: this.hls.minAutoLevel,\n maxHdcpLevel,\n });\n }\n }\n}\n\nfunction assignTrackIdsByGroup(tracks: MediaPlaylist[]): void {\n const groups = {};\n tracks.forEach((track) => {\n const groupId = track.groupId || '';\n track.id = groups[groupId] = groups[groupId] || 0;\n groups[groupId]++;\n });\n}\n","import { fixLineBreaks } from './vttparser';\nimport type { CaptionScreen, Row } from './cea-608-parser';\nimport { generateCueId } from './webvtt-parser';\nimport { addCueToTrack } from './texttrack-utils';\n\nconst WHITESPACE_CHAR = /\\s/;\n\nexport interface CuesInterface {\n newCue(\n track: TextTrack | null,\n startTime: number,\n endTime: number,\n captionScreen: CaptionScreen,\n ): VTTCue[];\n}\n\nconst Cues: CuesInterface = {\n newCue(\n track: TextTrack | null,\n startTime: number,\n endTime: number,\n captionScreen: CaptionScreen,\n ): VTTCue[] {\n const result: VTTCue[] = [];\n let row: Row;\n // the type data states this is VTTCue, but it can potentially be a TextTrackCue on old browsers\n let cue: VTTCue;\n let indenting: boolean;\n let indent: number;\n let text: string;\n const Cue = (self.VTTCue || self.TextTrackCue) as any;\n\n for (let r = 0; r < captionScreen.rows.length; r++) {\n row = captionScreen.rows[r];\n indenting = true;\n indent = 0;\n text = '';\n\n if (!row.isEmpty()) {\n for (let c = 0; c < row.chars.length; c++) {\n if (WHITESPACE_CHAR.test(row.chars[c].uchar) && indenting) {\n indent++;\n } else {\n text += row.chars[c].uchar;\n indenting = false;\n }\n }\n // To be used for cleaning-up orphaned roll-up captions\n row.cueStartTime = startTime;\n\n // Give a slight bump to the endTime if it's equal to startTime to avoid a SyntaxError in IE\n if (startTime === endTime) {\n endTime += 0.0001;\n }\n\n if (indent >= 16) {\n indent--;\n } else {\n indent++;\n }\n\n const cueText = fixLineBreaks(text.trim());\n const id = generateCueId(startTime, endTime, cueText);\n\n // If this cue already exists in the track do not push it\n if (!track?.cues?.getCueById(id)) {\n cue = new Cue(startTime, endTime, cueText);\n cue.id = id;\n cue.line = r + 1;\n cue.align = 'left';\n // Clamp the position between 10 and 80 percent (CEA-608 PAC indent code)\n // https://dvcs.w3.org/hg/text-tracks/raw-file/default/608toVTT/608toVTT.html#positioning-in-cea-608\n // Firefox throws an exception and captions break with out of bounds 0-100 values\n cue.position = 10 + Math.min(80, Math.floor((indent * 8) / 32) * 10);\n result.push(cue);\n }\n }\n }\n if (track && result.length) {\n // Sort bottom cues in reverse order so that they render in line order when overlapping in Chrome\n result.sort((cueA, cueB) => {\n if (cueA.line === 'auto' || cueB.line === 'auto') {\n return 0;\n }\n if (cueA.line > 8 && cueB.line > 8) {\n return cueB.line - cueA.line;\n }\n return cueA.line - cueB.line;\n });\n result.forEach((cue) => addCueToTrack(track, cue));\n }\n return result;\n },\n};\n\nexport default Cues;\n","import AbrController from './controller/abr-controller';\nimport AudioStreamController from './controller/audio-stream-controller';\nimport AudioTrackController from './controller/audio-track-controller';\nimport { SubtitleStreamController } from './controller/subtitle-stream-controller';\nimport SubtitleTrackController from './controller/subtitle-track-controller';\nimport BufferController from './controller/buffer-controller';\nimport { TimelineController } from './controller/timeline-controller';\nimport CapLevelController from './controller/cap-level-controller';\nimport FPSController from './controller/fps-controller';\nimport EMEController, {\n MediaKeySessionContext,\n} from './controller/eme-controller';\nimport CMCDController from './controller/cmcd-controller';\nimport ContentSteeringController from './controller/content-steering-controller';\nimport ErrorController from './controller/error-controller';\nimport XhrLoader from './utils/xhr-loader';\nimport FetchLoader, { fetchSupported } from './utils/fetch-loader';\nimport Cues from './utils/cues';\nimport { requestMediaKeySystemAccess } from './utils/mediakeys-helper';\nimport { ILogger, logger } from './utils/logger';\n\nimport type Hls from './hls';\nimport type { CuesInterface } from './utils/cues';\nimport type { MediaKeyFunc, KeySystems } from './utils/mediakeys-helper';\nimport type {\n FragmentLoaderContext,\n Loader,\n LoaderContext,\n LoaderResponse,\n PlaylistLoaderContext,\n} from './types/loader';\nimport type {\n AudioSelectionOption,\n SubtitleSelectionOption,\n VideoSelectionOption,\n} from './types/media-playlist';\n\nexport type ABRControllerConfig = {\n abrEwmaFastLive: number;\n abrEwmaSlowLive: number;\n abrEwmaFastVoD: number;\n abrEwmaSlowVoD: number;\n /**\n * Default bandwidth estimate in bits/s prior to collecting fragment bandwidth samples\n */\n abrEwmaDefaultEstimate: number;\n abrEwmaDefaultEstimateMax: number;\n abrBandWidthFactor: number;\n abrBandWidthUpFactor: number;\n abrMaxWithRealBitrate: boolean;\n maxStarvationDelay: number;\n maxLoadingDelay: number;\n};\n\nexport type BufferControllerConfig = {\n appendErrorMaxRetry: number;\n backBufferLength: number;\n frontBufferFlushThreshold: number;\n liveDurationInfinity: boolean;\n /**\n * @deprecated use backBufferLength\n */\n liveBackBufferLength: number | null;\n};\n\nexport type CapLevelControllerConfig = {\n capLevelToPlayerSize: boolean;\n};\n\nexport type CMCDControllerConfig = {\n sessionId?: string;\n contentId?: string;\n useHeaders?: boolean;\n includeKeys?: string[];\n};\n\nexport type DRMSystemOptions = {\n audioRobustness?: string;\n videoRobustness?: string;\n audioEncryptionScheme?: string | null;\n videoEncryptionScheme?: string | null;\n persistentState?: MediaKeysRequirement;\n distinctiveIdentifier?: MediaKeysRequirement;\n sessionTypes?: string[];\n sessionType?: string;\n};\n\nexport type DRMSystemConfiguration = {\n licenseUrl: string;\n serverCertificateUrl?: string;\n generateRequest?: (\n this: Hls,\n initDataType: string,\n initData: ArrayBuffer | null,\n keyContext: MediaKeySessionContext,\n ) =>\n | { initDataType: string; initData: ArrayBuffer | null }\n | undefined\n | never;\n};\n\nexport type DRMSystemsConfiguration = Partial<\n Record<KeySystems, DRMSystemConfiguration>\n>;\n\nexport type EMEControllerConfig = {\n licenseXhrSetup?: (\n this: Hls,\n xhr: XMLHttpRequest,\n url: string,\n keyContext: MediaKeySessionContext,\n licenseChallenge: Uint8Array,\n ) => void | Uint8Array | Promise<Uint8Array | void>;\n licenseResponseCallback?: (\n this: Hls,\n xhr: XMLHttpRequest,\n url: string,\n keyContext: MediaKeySessionContext,\n ) => ArrayBuffer;\n emeEnabled: boolean;\n widevineLicenseUrl?: string;\n drmSystems: DRMSystemsConfiguration;\n drmSystemOptions: DRMSystemOptions;\n requestMediaKeySystemAccessFunc: MediaKeyFunc | null;\n};\n\nexport interface FragmentLoaderConstructor {\n new (confg: HlsConfig): Loader<FragmentLoaderContext>;\n}\n\n/**\n * @deprecated use fragLoadPolicy.default\n */\nexport type FragmentLoaderConfig = {\n fragLoadingTimeOut: number;\n fragLoadingMaxRetry: number;\n fragLoadingRetryDelay: number;\n fragLoadingMaxRetryTimeout: number;\n};\n\nexport type FPSControllerConfig = {\n capLevelOnFPSDrop: boolean;\n fpsDroppedMonitoringPeriod: number;\n fpsDroppedMonitoringThreshold: number;\n};\n\nexport type LevelControllerConfig = {\n startLevel?: number;\n};\n\nexport type MP4RemuxerConfig = {\n stretchShortVideoTrack: boolean;\n maxAudioFramesDrift: number;\n};\n\nexport interface PlaylistLoaderConstructor {\n new (confg: HlsConfig): Loader<PlaylistLoaderContext>;\n}\n\n/**\n * @deprecated use manifestLoadPolicy.default and playlistLoadPolicy.default\n */\nexport type PlaylistLoaderConfig = {\n manifestLoadingTimeOut: number;\n manifestLoadingMaxRetry: number;\n manifestLoadingRetryDelay: number;\n manifestLoadingMaxRetryTimeout: number;\n\n levelLoadingTimeOut: number;\n levelLoadingMaxRetry: number;\n levelLoadingRetryDelay: number;\n levelLoadingMaxRetryTimeout: number;\n};\n\nexport type HlsLoadPolicies = {\n fragLoadPolicy: LoadPolicy;\n keyLoadPolicy: LoadPolicy;\n certLoadPolicy: LoadPolicy;\n playlistLoadPolicy: LoadPolicy;\n manifestLoadPolicy: LoadPolicy;\n steeringManifestLoadPolicy: LoadPolicy;\n};\n\nexport type LoadPolicy = {\n default: LoaderConfig;\n};\n\nexport type LoaderConfig = {\n maxTimeToFirstByteMs: number; // Max time to first byte\n maxLoadTimeMs: number; // Max time for load completion\n timeoutRetry: RetryConfig | null;\n errorRetry: RetryConfig | null;\n};\n\nexport type RetryConfig = {\n maxNumRetry: number; // Maximum number of retries\n retryDelayMs: number; // Retry delay = 2^retryCount * retryDelayMs (exponential) or retryCount * retryDelayMs (linear)\n maxRetryDelayMs: number; // Maximum delay between retries\n backoff?: 'exponential' | 'linear'; // used to determine retry backoff duration (see retryDelayMs)\n shouldRetry?: (\n retryConfig: RetryConfig | null | undefined,\n retryCount: number,\n isTimeout: boolean,\n loaderResponse: LoaderResponse | undefined,\n retry: boolean,\n ) => boolean;\n};\n\nexport type StreamControllerConfig = {\n autoStartLoad: boolean;\n startPosition: number;\n defaultAudioCodec?: string;\n initialLiveManifestSize: number;\n maxBufferLength: number;\n maxBufferSize: number;\n maxBufferHole: number;\n highBufferWatchdogPeriod: number;\n nudgeOffset: number;\n nudgeMaxRetry: number;\n maxFragLookUpTolerance: number;\n maxMaxBufferLength: number;\n startFragPrefetch: boolean;\n testBandwidth: boolean;\n};\n\nexport type SelectionPreferences = {\n videoPreference?: VideoSelectionOption;\n audioPreference?: AudioSelectionOption;\n subtitlePreference?: SubtitleSelectionOption;\n};\n\nexport type LatencyControllerConfig = {\n liveSyncDurationCount: number;\n liveMaxLatencyDurationCount: number;\n liveSyncDuration?: number;\n liveMaxLatencyDuration?: number;\n maxLiveSyncPlaybackRate: number;\n};\n\nexport type MetadataControllerConfig = {\n enableDateRangeMetadataCues: boolean;\n enableEmsgMetadataCues: boolean;\n enableID3MetadataCues: boolean;\n};\n\nexport type TimelineControllerConfig = {\n cueHandler: CuesInterface;\n enableWebVTT: boolean;\n enableIMSC1: boolean;\n enableCEA708Captions: boolean;\n captionsTextTrack1Label: string;\n captionsTextTrack1LanguageCode: string;\n captionsTextTrack2Label: string;\n captionsTextTrack2LanguageCode: string;\n captionsTextTrack3Label: string;\n captionsTextTrack3LanguageCode: string;\n captionsTextTrack4Label: string;\n captionsTextTrack4LanguageCode: string;\n renderTextTracksNatively: boolean;\n};\n\nexport type TSDemuxerConfig = {\n forceKeyFrameOnDiscontinuity: boolean;\n};\n\nexport type HlsConfig = {\n debug: boolean | ILogger;\n enableWorker: boolean;\n workerPath: null | string;\n enableSoftwareAES: boolean;\n minAutoBitrate: number;\n ignoreDevicePixelRatio: boolean;\n preferManagedMediaSource: boolean;\n loader: { new (confg: HlsConfig): Loader<LoaderContext> };\n fLoader?: FragmentLoaderConstructor;\n pLoader?: PlaylistLoaderConstructor;\n fetchSetup?: (context: LoaderContext, initParams: any) => Request;\n xhrSetup?: (xhr: XMLHttpRequest, url: string) => Promise<void> | void;\n\n // Alt Audio\n audioStreamController?: typeof AudioStreamController;\n audioTrackController?: typeof AudioTrackController;\n // Subtitle\n subtitleStreamController?: typeof SubtitleStreamController;\n subtitleTrackController?: typeof SubtitleTrackController;\n timelineController?: typeof TimelineController;\n // EME\n emeController?: typeof EMEController;\n // CMCD\n cmcd?: CMCDControllerConfig;\n cmcdController?: typeof CMCDController;\n // Content Steering\n contentSteeringController?: typeof ContentSteeringController;\n\n // MediaCapabilies API for level, track, and switch filtering\n useMediaCapabilities: boolean;\n\n abrController: typeof AbrController;\n bufferController: typeof BufferController;\n capLevelController: typeof CapLevelController;\n errorController: typeof ErrorController;\n fpsController: typeof FPSController;\n progressive: boolean;\n lowLatencyMode: boolean;\n} & ABRControllerConfig &\n BufferControllerConfig &\n CapLevelControllerConfig &\n EMEControllerConfig &\n FPSControllerConfig &\n LevelControllerConfig &\n MP4RemuxerConfig &\n StreamControllerConfig &\n SelectionPreferences &\n LatencyControllerConfig &\n MetadataControllerConfig &\n TimelineControllerConfig &\n TSDemuxerConfig &\n HlsLoadPolicies &\n FragmentLoaderConfig &\n PlaylistLoaderConfig;\n\nconst defaultLoadPolicy: LoaderConfig = {\n maxTimeToFirstByteMs: 8000,\n maxLoadTimeMs: 20000,\n timeoutRetry: null,\n errorRetry: null,\n};\n\n/**\n * @ignore\n * If possible, keep hlsDefaultConfig shallow\n * It is cloned whenever a new Hls instance is created, by keeping the config\n * shallow the properties are cloned, and we don't end up manipulating the default\n */\nexport const hlsDefaultConfig: HlsConfig = {\n autoStartLoad: true, // used by stream-controller\n startPosition: -1, // used by stream-controller\n defaultAudioCodec: undefined, // used by stream-controller\n debug: false, // used by logger\n capLevelOnFPSDrop: false, // used by fps-controller\n capLevelToPlayerSize: false, // used by cap-level-controller\n ignoreDevicePixelRatio: false, // used by cap-level-controller\n preferManagedMediaSource: true,\n initialLiveManifestSize: 1, // used by stream-controller\n maxBufferLength: 30, // used by stream-controller\n backBufferLength: Infinity, // used by buffer-controller\n frontBufferFlushThreshold: Infinity,\n maxBufferSize: 60 * 1000 * 1000, // used by stream-controller\n maxBufferHole: 0.1, // used by stream-controller\n highBufferWatchdogPeriod: 2, // used by stream-controller\n nudgeOffset: 0.1, // used by stream-controller\n nudgeMaxRetry: 3, // used by stream-controller\n maxFragLookUpTolerance: 0.25, // used by stream-controller\n liveSyncDurationCount: 3, // used by latency-controller\n liveMaxLatencyDurationCount: Infinity, // used by latency-controller\n liveSyncDuration: undefined, // used by latency-controller\n liveMaxLatencyDuration: undefined, // used by latency-controller\n maxLiveSyncPlaybackRate: 1, // used by latency-controller\n liveDurationInfinity: false, // used by buffer-controller\n /**\n * @deprecated use backBufferLength\n */\n liveBackBufferLength: null, // used by buffer-controller\n maxMaxBufferLength: 600, // used by stream-controller\n enableWorker: true, // used by transmuxer\n workerPath: null, // used by transmuxer\n enableSoftwareAES: true, // used by decrypter\n startLevel: undefined, // used by level-controller\n startFragPrefetch: false, // used by stream-controller\n fpsDroppedMonitoringPeriod: 5000, // used by fps-controller\n fpsDroppedMonitoringThreshold: 0.2, // used by fps-controller\n appendErrorMaxRetry: 3, // used by buffer-controller\n loader: XhrLoader,\n // loader: FetchLoader,\n fLoader: undefined, // used by fragment-loader\n pLoader: undefined, // used by playlist-loader\n xhrSetup: undefined, // used by xhr-loader\n licenseXhrSetup: undefined, // used by eme-controller\n licenseResponseCallback: undefined, // used by eme-controller\n abrController: AbrController,\n bufferController: BufferController,\n capLevelController: CapLevelController,\n errorController: ErrorController,\n fpsController: FPSController,\n stretchShortVideoTrack: false, // used by mp4-remuxer\n maxAudioFramesDrift: 1, // used by mp4-remuxer\n forceKeyFrameOnDiscontinuity: true, // used by ts-demuxer\n abrEwmaFastLive: 3, // used by abr-controller\n abrEwmaSlowLive: 9, // used by abr-controller\n abrEwmaFastVoD: 3, // used by abr-controller\n abrEwmaSlowVoD: 9, // used by abr-controller\n abrEwmaDefaultEstimate: 5e5, // 500 kbps // used by abr-controller\n abrEwmaDefaultEstimateMax: 5e6, // 5 mbps\n abrBandWidthFactor: 0.95, // used by abr-controller\n abrBandWidthUpFactor: 0.7, // used by abr-controller\n abrMaxWithRealBitrate: false, // used by abr-controller\n maxStarvationDelay: 4, // used by abr-controller\n maxLoadingDelay: 4, // used by abr-controller\n minAutoBitrate: 0, // used by hls\n emeEnabled: false, // used by eme-controller\n widevineLicenseUrl: undefined, // used by eme-controller\n drmSystems: {}, // used by eme-controller\n drmSystemOptions: {}, // used by eme-controller\n requestMediaKeySystemAccessFunc: __USE_EME_DRM__\n ? requestMediaKeySystemAccess\n : null, // used by eme-controller\n testBandwidth: true,\n progressive: false,\n lowLatencyMode: true,\n cmcd: undefined,\n enableDateRangeMetadataCues: true,\n enableEmsgMetadataCues: true,\n enableID3MetadataCues: true,\n useMediaCapabilities: __USE_MEDIA_CAPABILITIES__,\n\n certLoadPolicy: {\n default: defaultLoadPolicy,\n },\n keyLoadPolicy: {\n default: {\n maxTimeToFirstByteMs: 8000,\n maxLoadTimeMs: 20000,\n timeoutRetry: {\n maxNumRetry: 1,\n retryDelayMs: 1000,\n maxRetryDelayMs: 20000,\n backoff: 'linear',\n },\n errorRetry: {\n maxNumRetry: 8,\n retryDelayMs: 1000,\n maxRetryDelayMs: 20000,\n backoff: 'linear',\n },\n },\n },\n manifestLoadPolicy: {\n default: {\n maxTimeToFirstByteMs: Infinity,\n maxLoadTimeMs: 20000,\n timeoutRetry: {\n maxNumRetry: 2,\n retryDelayMs: 0,\n maxRetryDelayMs: 0,\n },\n errorRetry: {\n maxNumRetry: 1,\n retryDelayMs: 1000,\n maxRetryDelayMs: 8000,\n },\n },\n },\n playlistLoadPolicy: {\n default: {\n maxTimeToFirstByteMs: 10000,\n maxLoadTimeMs: 20000,\n timeoutRetry: {\n maxNumRetry: 2,\n retryDelayMs: 0,\n maxRetryDelayMs: 0,\n },\n errorRetry: {\n maxNumRetry: 2,\n retryDelayMs: 1000,\n maxRetryDelayMs: 8000,\n },\n },\n },\n fragLoadPolicy: {\n default: {\n maxTimeToFirstByteMs: 10000,\n maxLoadTimeMs: 120000,\n timeoutRetry: {\n maxNumRetry: 4,\n retryDelayMs: 0,\n maxRetryDelayMs: 0,\n },\n errorRetry: {\n maxNumRetry: 6,\n retryDelayMs: 1000,\n maxRetryDelayMs: 8000,\n },\n },\n },\n steeringManifestLoadPolicy: {\n default: __USE_CONTENT_STEERING__\n ? {\n maxTimeToFirstByteMs: 10000,\n maxLoadTimeMs: 20000,\n timeoutRetry: {\n maxNumRetry: 2,\n retryDelayMs: 0,\n maxRetryDelayMs: 0,\n },\n errorRetry: {\n maxNumRetry: 1,\n retryDelayMs: 1000,\n maxRetryDelayMs: 8000,\n },\n }\n : defaultLoadPolicy,\n },\n\n // These default settings are deprecated in favor of the above policies\n // and are maintained for backwards compatibility\n manifestLoadingTimeOut: 10000,\n manifestLoadingMaxRetry: 1,\n manifestLoadingRetryDelay: 1000,\n manifestLoadingMaxRetryTimeout: 64000,\n levelLoadingTimeOut: 10000,\n levelLoadingMaxRetry: 4,\n levelLoadingRetryDelay: 1000,\n levelLoadingMaxRetryTimeout: 64000,\n fragLoadingTimeOut: 20000,\n fragLoadingMaxRetry: 6,\n fragLoadingRetryDelay: 1000,\n fragLoadingMaxRetryTimeout: 64000,\n\n // Dynamic Modules\n ...timelineConfig(),\n subtitleStreamController: __USE_SUBTITLES__\n ? SubtitleStreamController\n : undefined,\n subtitleTrackController: __USE_SUBTITLES__\n ? SubtitleTrackController\n : undefined,\n timelineController: __USE_SUBTITLES__ ? TimelineController : undefined,\n audioStreamController: __USE_ALT_AUDIO__ ? AudioStreamController : undefined,\n audioTrackController: __USE_ALT_AUDIO__ ? AudioTrackController : undefined,\n emeController: __USE_EME_DRM__ ? EMEController : undefined,\n cmcdController: __USE_CMCD__ ? CMCDController : undefined,\n contentSteeringController: __USE_CONTENT_STEERING__\n ? ContentSteeringController\n : undefined,\n};\n\nfunction timelineConfig(): TimelineControllerConfig {\n return {\n cueHandler: Cues, // used by timeline-controller\n enableWebVTT: __USE_SUBTITLES__, // used by timeline-controller\n enableIMSC1: __USE_SUBTITLES__, // used by timeline-controller\n enableCEA708Captions: __USE_SUBTITLES__, // used by timeline-controller\n captionsTextTrack1Label: 'English', // used by timeline-controller\n captionsTextTrack1LanguageCode: 'en', // used by timeline-controller\n captionsTextTrack2Label: 'Spanish', // used by timeline-controller\n captionsTextTrack2LanguageCode: 'es', // used by timeline-controller\n captionsTextTrack3Label: 'Unknown CC', // used by timeline-controller\n captionsTextTrack3LanguageCode: '', // used by timeline-controller\n captionsTextTrack4Label: 'Unknown CC', // used by timeline-controller\n captionsTextTrack4LanguageCode: '', // used by timeline-controller\n renderTextTracksNatively: true,\n };\n}\n\n/**\n * @ignore\n */\nexport function mergeConfig(\n defaultConfig: HlsConfig,\n userConfig: Partial<HlsConfig>,\n): HlsConfig {\n if (\n (userConfig.liveSyncDurationCount ||\n userConfig.liveMaxLatencyDurationCount) &&\n (userConfig.liveSyncDuration || userConfig.liveMaxLatencyDuration)\n ) {\n throw new Error(\n \"Illegal hls.js config: don't mix up liveSyncDurationCount/liveMaxLatencyDurationCount and liveSyncDuration/liveMaxLatencyDuration\",\n );\n }\n\n if (\n userConfig.liveMaxLatencyDurationCount !== undefined &&\n (userConfig.liveSyncDurationCount === undefined ||\n userConfig.liveMaxLatencyDurationCount <=\n userConfig.liveSyncDurationCount)\n ) {\n throw new Error(\n 'Illegal hls.js config: \"liveMaxLatencyDurationCount\" must be greater than \"liveSyncDurationCount\"',\n );\n }\n\n if (\n userConfig.liveMaxLatencyDuration !== undefined &&\n (userConfig.liveSyncDuration === undefined ||\n userConfig.liveMaxLatencyDuration <= userConfig.liveSyncDuration)\n ) {\n throw new Error(\n 'Illegal hls.js config: \"liveMaxLatencyDuration\" must be greater than \"liveSyncDuration\"',\n );\n }\n\n const defaultsCopy = deepCpy(defaultConfig);\n\n // Backwards compatibility with deprecated config values\n const deprecatedSettingTypes = ['manifest', 'level', 'frag'];\n const deprecatedSettings = [\n 'TimeOut',\n 'MaxRetry',\n 'RetryDelay',\n 'MaxRetryTimeout',\n ];\n deprecatedSettingTypes.forEach((type) => {\n const policyName = `${type === 'level' ? 'playlist' : type}LoadPolicy`;\n const policyNotSet = userConfig[policyName] === undefined;\n const report: string[] = [];\n deprecatedSettings.forEach((setting) => {\n const deprecatedSetting = `${type}Loading${setting}`;\n const value = userConfig[deprecatedSetting];\n if (value !== undefined && policyNotSet) {\n report.push(deprecatedSetting);\n const settings: LoaderConfig = defaultsCopy[policyName].default;\n userConfig[policyName] = { default: settings };\n switch (setting) {\n case 'TimeOut':\n settings.maxLoadTimeMs = value;\n settings.maxTimeToFirstByteMs = value;\n break;\n case 'MaxRetry':\n settings.errorRetry!.maxNumRetry = value;\n settings.timeoutRetry!.maxNumRetry = value;\n break;\n case 'RetryDelay':\n settings.errorRetry!.retryDelayMs = value;\n settings.timeoutRetry!.retryDelayMs = value;\n break;\n case 'MaxRetryTimeout':\n settings.errorRetry!.maxRetryDelayMs = value;\n settings.timeoutRetry!.maxRetryDelayMs = value;\n break;\n }\n }\n });\n if (report.length) {\n logger.warn(\n `hls.js config: \"${report.join(\n '\", \"',\n )}\" setting(s) are deprecated, use \"${policyName}\": ${JSON.stringify(\n userConfig[policyName],\n )}`,\n );\n }\n });\n\n return {\n ...defaultsCopy,\n ...userConfig,\n };\n}\n\nfunction deepCpy(obj: any): any {\n if (obj && typeof obj === 'object') {\n if (Array.isArray(obj)) {\n return obj.map(deepCpy);\n }\n return Object.keys(obj).reduce((result, key) => {\n result[key] = deepCpy(obj[key]);\n return result;\n }, {});\n }\n return obj;\n}\n\n/**\n * @ignore\n */\nexport function enableStreamingMode(config) {\n const currentLoader = config.loader;\n if (currentLoader !== FetchLoader && currentLoader !== XhrLoader) {\n // If a developer has configured their own loader, respect that choice\n logger.log(\n '[config]: Custom loader detected, cannot enable progressive streaming',\n );\n config.progressive = false;\n } else {\n const canStreamProgressively = fetchSupported();\n if (canStreamProgressively) {\n config.loader = FetchLoader;\n config.progressive = true;\n config.enableSoftwareAES = true;\n logger.log('[config]: Progressive streaming enabled, using FetchLoader');\n }\n }\n}\n","import { ErrorTypes, ErrorDetails } from '../errors';\nimport {\n LoaderStats,\n LoaderResponse,\n LoaderConfiguration,\n LoaderCallbacks,\n Loader,\n KeyLoaderContext,\n PlaylistLevelType,\n} from '../types/loader';\nimport { LoadError } from './fragment-loader';\nimport type { HlsConfig } from '../config';\nimport type { Fragment } from '../loader/fragment';\nimport type { ComponentAPI } from '../types/component-api';\nimport type { KeyLoadedData } from '../types/events';\nimport type { LevelKey } from './level-key';\nimport type EMEController from '../controller/eme-controller';\nimport type { MediaKeySessionContext } from '../controller/eme-controller';\nimport type { KeySystemFormats } from '../utils/mediakeys-helper';\n\nexport interface KeyLoaderInfo {\n decryptdata: LevelKey;\n keyLoadPromise: Promise<KeyLoadedData> | null;\n loader: Loader<KeyLoaderContext> | null;\n mediaKeySessionContext: MediaKeySessionContext | null;\n}\nexport default class KeyLoader implements ComponentAPI {\n private readonly config: HlsConfig;\n public keyUriToKeyInfo: { [keyuri: string]: KeyLoaderInfo } = {};\n public emeController: EMEController | null = null;\n\n constructor(config: HlsConfig) {\n this.config = config;\n }\n\n abort(type?: PlaylistLevelType) {\n for (const uri in this.keyUriToKeyInfo) {\n const loader = this.keyUriToKeyInfo[uri].loader;\n if (loader) {\n if (type && type !== loader.context?.frag.type) {\n return;\n }\n loader.abort();\n }\n }\n }\n\n detach() {\n for (const uri in this.keyUriToKeyInfo) {\n const keyInfo = this.keyUriToKeyInfo[uri];\n // Remove cached EME keys on detach\n if (\n keyInfo.mediaKeySessionContext ||\n keyInfo.decryptdata.isCommonEncryption\n ) {\n delete this.keyUriToKeyInfo[uri];\n }\n }\n }\n\n destroy() {\n this.detach();\n for (const uri in this.keyUriToKeyInfo) {\n const loader = this.keyUriToKeyInfo[uri].loader;\n if (loader) {\n loader.destroy();\n }\n }\n this.keyUriToKeyInfo = {};\n }\n\n createKeyLoadError(\n frag: Fragment,\n details: ErrorDetails = ErrorDetails.KEY_LOAD_ERROR,\n error: Error,\n networkDetails?: any,\n response?: { url: string; data: undefined; code: number; text: string },\n ): LoadError {\n return new LoadError({\n type: ErrorTypes.NETWORK_ERROR,\n details,\n fatal: false,\n frag,\n response,\n error,\n networkDetails,\n });\n }\n\n loadClear(\n loadingFrag: Fragment,\n encryptedFragments: Fragment[],\n ): void | Promise<void> {\n if (this.emeController && this.config.emeEnabled) {\n // access key-system with nearest key on start (loaidng frag is unencrypted)\n const { sn, cc } = loadingFrag;\n for (let i = 0; i < encryptedFragments.length; i++) {\n const frag = encryptedFragments[i];\n if (\n cc <= frag.cc &&\n (sn === 'initSegment' || frag.sn === 'initSegment' || sn < frag.sn)\n ) {\n this.emeController\n .selectKeySystemFormat(frag)\n .then((keySystemFormat) => {\n frag.setKeyFormat(keySystemFormat);\n });\n break;\n }\n }\n }\n }\n\n load(frag: Fragment): Promise<KeyLoadedData> {\n if (\n !frag.decryptdata &&\n frag.encrypted &&\n this.emeController &&\n this.config.emeEnabled\n ) {\n // Multiple keys, but none selected, resolve in eme-controller\n return this.emeController\n .selectKeySystemFormat(frag)\n .then((keySystemFormat) => {\n return this.loadInternal(frag, keySystemFormat);\n });\n }\n\n return this.loadInternal(frag);\n }\n\n loadInternal(\n frag: Fragment,\n keySystemFormat?: KeySystemFormats,\n ): Promise<KeyLoadedData> {\n if (keySystemFormat) {\n frag.setKeyFormat(keySystemFormat);\n }\n const decryptdata = frag.decryptdata;\n if (!decryptdata) {\n const error = new Error(\n keySystemFormat\n ? `Expected frag.decryptdata to be defined after setting format ${keySystemFormat}`\n : 'Missing decryption data on fragment in onKeyLoading',\n );\n return Promise.reject(\n this.createKeyLoadError(frag, ErrorDetails.KEY_LOAD_ERROR, error),\n );\n }\n const uri = decryptdata.uri;\n if (!uri) {\n return Promise.reject(\n this.createKeyLoadError(\n frag,\n ErrorDetails.KEY_LOAD_ERROR,\n new Error(`Invalid key URI: \"${uri}\"`),\n ),\n );\n }\n let keyInfo = this.keyUriToKeyInfo[uri];\n\n if (keyInfo?.decryptdata.key) {\n decryptdata.key = keyInfo.decryptdata.key;\n return Promise.resolve({ frag, keyInfo });\n }\n // Return key load promise as long as it does not have a mediakey session with an unusable key status\n if (keyInfo?.keyLoadPromise) {\n switch (keyInfo.mediaKeySessionContext?.keyStatus) {\n case undefined:\n case 'status-pending':\n case 'usable':\n case 'usable-in-future':\n return keyInfo.keyLoadPromise.then((keyLoadedData) => {\n // Return the correct fragment with updated decryptdata key and loaded keyInfo\n decryptdata.key = keyLoadedData.keyInfo.decryptdata.key;\n return { frag, keyInfo };\n });\n }\n // If we have a key session and status and it is not pending or usable, continue\n // This will go back to the eme-controller for expired keys to get a new keyLoadPromise\n }\n\n // Load the key or return the loading promise\n keyInfo = this.keyUriToKeyInfo[uri] = {\n decryptdata,\n keyLoadPromise: null,\n loader: null,\n mediaKeySessionContext: null,\n };\n\n switch (decryptdata.method) {\n case 'ISO-23001-7':\n case 'SAMPLE-AES':\n case 'SAMPLE-AES-CENC':\n case 'SAMPLE-AES-CTR':\n if (decryptdata.keyFormat === 'identity') {\n // loadKeyHTTP handles http(s) and data URLs\n return this.loadKeyHTTP(keyInfo, frag);\n }\n return this.loadKeyEME(keyInfo, frag);\n case 'AES-128':\n return this.loadKeyHTTP(keyInfo, frag);\n default:\n return Promise.reject(\n this.createKeyLoadError(\n frag,\n ErrorDetails.KEY_LOAD_ERROR,\n new Error(\n `Key supplied with unsupported METHOD: \"${decryptdata.method}\"`,\n ),\n ),\n );\n }\n }\n\n loadKeyEME(keyInfo: KeyLoaderInfo, frag: Fragment): Promise<KeyLoadedData> {\n const keyLoadedData: KeyLoadedData = { frag, keyInfo };\n if (this.emeController && this.config.emeEnabled) {\n const keySessionContextPromise =\n this.emeController.loadKey(keyLoadedData);\n if (keySessionContextPromise) {\n return (keyInfo.keyLoadPromise = keySessionContextPromise.then(\n (keySessionContext) => {\n keyInfo.mediaKeySessionContext = keySessionContext;\n return keyLoadedData;\n },\n )).catch((error) => {\n // Remove promise for license renewal or retry\n keyInfo.keyLoadPromise = null;\n throw error;\n });\n }\n }\n return Promise.resolve(keyLoadedData);\n }\n\n loadKeyHTTP(keyInfo: KeyLoaderInfo, frag: Fragment): Promise<KeyLoadedData> {\n const config = this.config;\n const Loader = config.loader;\n const keyLoader = new Loader(config) as Loader<KeyLoaderContext>;\n frag.keyLoader = keyInfo.loader = keyLoader;\n\n return (keyInfo.keyLoadPromise = new Promise((resolve, reject) => {\n const loaderContext: KeyLoaderContext = {\n keyInfo,\n frag,\n responseType: 'arraybuffer',\n url: keyInfo.decryptdata.uri,\n };\n\n // maxRetry is 0 so that instead of retrying the same key on the same variant multiple times,\n // key-loader will trigger an error and rely on stream-controller to handle retry logic.\n // this will also align retry logic with fragment-loader\n const loadPolicy = config.keyLoadPolicy.default;\n const loaderConfig: LoaderConfiguration = {\n loadPolicy,\n timeout: loadPolicy.maxLoadTimeMs,\n maxRetry: 0,\n retryDelay: 0,\n maxRetryDelay: 0,\n };\n\n const loaderCallbacks: LoaderCallbacks<KeyLoaderContext> = {\n onSuccess: (\n response: LoaderResponse,\n stats: LoaderStats,\n context: KeyLoaderContext,\n networkDetails: any,\n ) => {\n const { frag, keyInfo, url: uri } = context;\n if (!frag.decryptdata || keyInfo !== this.keyUriToKeyInfo[uri]) {\n return reject(\n this.createKeyLoadError(\n frag,\n ErrorDetails.KEY_LOAD_ERROR,\n new Error('after key load, decryptdata unset or changed'),\n networkDetails,\n ),\n );\n }\n\n keyInfo.decryptdata.key = frag.decryptdata.key = new Uint8Array(\n response.data as ArrayBuffer,\n );\n\n // detach fragment key loader on load success\n frag.keyLoader = null;\n keyInfo.loader = null;\n resolve({ frag, keyInfo });\n },\n\n onError: (\n response: { code: number; text: string },\n context: KeyLoaderContext,\n networkDetails: any,\n stats: LoaderStats,\n ) => {\n this.resetLoader(context);\n reject(\n this.createKeyLoadError(\n frag,\n ErrorDetails.KEY_LOAD_ERROR,\n new Error(\n `HTTP Error ${response.code} loading key ${response.text}`,\n ),\n networkDetails,\n { url: loaderContext.url, data: undefined, ...response },\n ),\n );\n },\n\n onTimeout: (\n stats: LoaderStats,\n context: KeyLoaderContext,\n networkDetails: any,\n ) => {\n this.resetLoader(context);\n reject(\n this.createKeyLoadError(\n frag,\n ErrorDetails.KEY_LOAD_TIMEOUT,\n new Error('key loading timed out'),\n networkDetails,\n ),\n );\n },\n\n onAbort: (\n stats: LoaderStats,\n context: KeyLoaderContext,\n networkDetails: any,\n ) => {\n this.resetLoader(context);\n reject(\n this.createKeyLoadError(\n frag,\n ErrorDetails.INTERNAL_ABORTED,\n new Error('key loading aborted'),\n networkDetails,\n ),\n );\n },\n };\n\n keyLoader.load(loaderContext, loaderConfig, loaderCallbacks);\n }));\n }\n\n private resetLoader(context: KeyLoaderContext) {\n const { frag, keyInfo, url: uri } = context;\n const loader = keyInfo.loader;\n if (frag.keyLoader === loader) {\n frag.keyLoader = null;\n keyInfo.loader = null;\n }\n delete this.keyUriToKeyInfo[uri];\n if (loader) {\n loader.destroy();\n }\n }\n}\n","import { getMediaSource } from './utils/mediasource-helper';\nimport { mimeTypeForCodec } from './utils/codecs';\nimport type { ExtendedSourceBuffer } from './types/buffer';\n\nfunction getSourceBuffer(): typeof self.SourceBuffer {\n return self.SourceBuffer || (self as any).WebKitSourceBuffer;\n}\n\nexport function isMSESupported(): boolean {\n const mediaSource = getMediaSource();\n if (!mediaSource) {\n return false;\n }\n\n // if SourceBuffer is exposed ensure its API is valid\n // Older browsers do not expose SourceBuffer globally so checking SourceBuffer.prototype is impossible\n const sourceBuffer = getSourceBuffer();\n return (\n !sourceBuffer ||\n (sourceBuffer.prototype &&\n typeof sourceBuffer.prototype.appendBuffer === 'function' &&\n typeof sourceBuffer.prototype.remove === 'function')\n );\n}\n\nexport function isSupported(): boolean {\n if (!isMSESupported()) {\n return false;\n }\n\n const mediaSource = getMediaSource();\n return (\n typeof mediaSource?.isTypeSupported === 'function' &&\n (['avc1.42E01E,mp4a.40.2', 'av01.0.01M.08', 'vp09.00.50.08'].some(\n (codecsForVideoContainer) =>\n mediaSource.isTypeSupported(\n mimeTypeForCodec(codecsForVideoContainer, 'video'),\n ),\n ) ||\n ['mp4a.40.2', 'fLaC'].some((codecForAudioContainer) =>\n mediaSource.isTypeSupported(\n mimeTypeForCodec(codecForAudioContainer, 'audio'),\n ),\n ))\n );\n}\n\nexport function changeTypeSupported(): boolean {\n const sourceBuffer = getSourceBuffer();\n return (\n typeof (sourceBuffer?.prototype as ExtendedSourceBuffer)?.changeType ===\n 'function'\n );\n}\n","import type { BufferInfo } from '../utils/buffer-helper';\nimport { BufferHelper } from '../utils/buffer-helper';\nimport { ErrorTypes, ErrorDetails } from '../errors';\nimport { PlaylistLevelType } from '../types/loader';\nimport { Events } from '../events';\nimport { logger } from '../utils/logger';\nimport type Hls from '../hls';\nimport type { HlsConfig } from '../config';\nimport type { Fragment } from '../loader/fragment';\nimport type { FragmentTracker } from './fragment-tracker';\n\nexport const STALL_MINIMUM_DURATION_MS = 250;\nexport const MAX_START_GAP_JUMP = 2.0;\nexport const SKIP_BUFFER_HOLE_STEP_SECONDS = 0.1;\nexport const SKIP_BUFFER_RANGE_START = 0.05;\n\nexport default class GapController {\n private config: HlsConfig;\n private media: HTMLMediaElement | null = null;\n private fragmentTracker: FragmentTracker;\n private hls: Hls;\n private nudgeRetry: number = 0;\n private stallReported: boolean = false;\n private stalled: number | null = null;\n private moved: boolean = false;\n private seeking: boolean = false;\n\n constructor(config, media, fragmentTracker, hls) {\n this.config = config;\n this.media = media;\n this.fragmentTracker = fragmentTracker;\n this.hls = hls;\n }\n\n public destroy() {\n this.media = null;\n // @ts-ignore\n this.hls = this.fragmentTracker = null;\n }\n\n /**\n * Checks if the playhead is stuck within a gap, and if so, attempts to free it.\n * A gap is an unbuffered range between two buffered ranges (or the start and the first buffered range).\n *\n * @param lastCurrentTime - Previously read playhead position\n */\n public poll(lastCurrentTime: number, activeFrag: Fragment | null) {\n const { config, media, stalled } = this;\n if (media === null) {\n return;\n }\n const { currentTime, seeking } = media;\n const seeked = this.seeking && !seeking;\n const beginSeek = !this.seeking && seeking;\n\n this.seeking = seeking;\n\n // The playhead is moving, no-op\n if (currentTime !== lastCurrentTime) {\n this.moved = true;\n if (!seeking) {\n this.nudgeRetry = 0;\n }\n if (stalled !== null) {\n // The playhead is now moving, but was previously stalled\n if (this.stallReported) {\n const stalledDuration = self.performance.now() - stalled;\n logger.warn(\n `playback not stuck anymore @${currentTime}, after ${Math.round(\n stalledDuration,\n )}ms`,\n );\n this.stallReported = false;\n }\n this.stalled = null;\n }\n return;\n }\n\n // Clear stalled state when beginning or finishing seeking so that we don't report stalls coming out of a seek\n if (beginSeek || seeked) {\n this.stalled = null;\n return;\n }\n\n // The playhead should not be moving\n if (\n (media.paused && !seeking) ||\n media.ended ||\n media.playbackRate === 0 ||\n !BufferHelper.getBuffered(media).length\n ) {\n this.nudgeRetry = 0;\n return;\n }\n\n const bufferInfo = BufferHelper.bufferInfo(media, currentTime, 0);\n const nextStart = bufferInfo.nextStart || 0;\n\n if (seeking) {\n // Waiting for seeking in a buffered range to complete\n const hasEnoughBuffer = bufferInfo.len > MAX_START_GAP_JUMP;\n // Next buffered range is too far ahead to jump to while still seeking\n const noBufferGap =\n !nextStart ||\n (activeFrag && activeFrag.start <= currentTime) ||\n (nextStart - currentTime > MAX_START_GAP_JUMP &&\n !this.fragmentTracker.getPartialFragment(currentTime));\n if (hasEnoughBuffer || noBufferGap) {\n return;\n }\n // Reset moved state when seeking to a point in or before a gap\n this.moved = false;\n }\n\n // Skip start gaps if we haven't played, but the last poll detected the start of a stall\n // The addition poll gives the browser a chance to jump the gap for us\n if (!this.moved && this.stalled !== null) {\n // There is no playable buffer (seeked, waiting for buffer)\n const isBuffered = bufferInfo.len > 0;\n if (!isBuffered && !nextStart) {\n return;\n }\n // Jump start gaps within jump threshold\n const startJump =\n Math.max(nextStart, bufferInfo.start || 0) - currentTime;\n\n // When joining a live stream with audio tracks, account for live playlist window sliding by allowing\n // a larger jump over start gaps caused by the audio-stream-controller buffering a start fragment\n // that begins over 1 target duration after the video start position.\n const level = this.hls.levels\n ? this.hls.levels[this.hls.currentLevel]\n : null;\n const isLive = level?.details?.live;\n const maxStartGapJump = isLive\n ? level!.details!.targetduration * 2\n : MAX_START_GAP_JUMP;\n const partialOrGap = this.fragmentTracker.getPartialFragment(currentTime);\n if (startJump > 0 && (startJump <= maxStartGapJump || partialOrGap)) {\n if (!media.paused) {\n this._trySkipBufferHole(partialOrGap);\n }\n return;\n }\n }\n\n // Start tracking stall time\n const tnow = self.performance.now();\n if (stalled === null) {\n this.stalled = tnow;\n return;\n }\n\n const stalledDuration = tnow - stalled;\n if (!seeking && stalledDuration >= STALL_MINIMUM_DURATION_MS) {\n // Report stalling after trying to fix\n this._reportStall(bufferInfo);\n if (!this.media) {\n return;\n }\n }\n\n const bufferedWithHoles = BufferHelper.bufferInfo(\n media,\n currentTime,\n config.maxBufferHole,\n );\n this._tryFixBufferStall(bufferedWithHoles, stalledDuration);\n }\n\n /**\n * Detects and attempts to fix known buffer stalling issues.\n * @param bufferInfo - The properties of the current buffer.\n * @param stalledDurationMs - The amount of time Hls.js has been stalling for.\n * @private\n */\n private _tryFixBufferStall(\n bufferInfo: BufferInfo,\n stalledDurationMs: number,\n ) {\n const { config, fragmentTracker, media } = this;\n if (media === null) {\n return;\n }\n const currentTime = media.currentTime;\n\n const partial = fragmentTracker.getPartialFragment(currentTime);\n if (partial) {\n // Try to skip over the buffer hole caused by a partial fragment\n // This method isn't limited by the size of the gap between buffered ranges\n const targetTime = this._trySkipBufferHole(partial);\n // we return here in this case, meaning\n // the branch below only executes when we haven't seeked to a new position\n if (targetTime || !this.media) {\n return;\n }\n }\n\n // if we haven't had to skip over a buffer hole of a partial fragment\n // we may just have to \"nudge\" the playlist as the browser decoding/rendering engine\n // needs to cross some sort of threshold covering all source-buffers content\n // to start playing properly.\n if (\n (bufferInfo.len > config.maxBufferHole ||\n (bufferInfo.nextStart &&\n bufferInfo.nextStart - currentTime < config.maxBufferHole)) &&\n stalledDurationMs > config.highBufferWatchdogPeriod * 1000\n ) {\n logger.warn('Trying to nudge playhead over buffer-hole');\n // Try to nudge currentTime over a buffer hole if we've been stalling for the configured amount of seconds\n // We only try to jump the hole if it's under the configured size\n // Reset stalled so to rearm watchdog timer\n this.stalled = null;\n this._tryNudgeBuffer();\n }\n }\n\n /**\n * Triggers a BUFFER_STALLED_ERROR event, but only once per stall period.\n * @param bufferLen - The playhead distance from the end of the current buffer segment.\n * @private\n */\n private _reportStall(bufferInfo: BufferInfo) {\n const { hls, media, stallReported } = this;\n if (!stallReported && media) {\n // Report stalled error once\n this.stallReported = true;\n const error = new Error(\n `Playback stalling at @${\n media.currentTime\n } due to low buffer (${JSON.stringify(bufferInfo)})`,\n );\n logger.warn(error.message);\n hls.trigger(Events.ERROR, {\n type: ErrorTypes.MEDIA_ERROR,\n details: ErrorDetails.BUFFER_STALLED_ERROR,\n fatal: false,\n error,\n buffer: bufferInfo.len,\n });\n }\n }\n\n /**\n * Attempts to fix buffer stalls by jumping over known gaps caused by partial fragments\n * @param partial - The partial fragment found at the current time (where playback is stalling).\n * @private\n */\n private _trySkipBufferHole(partial: Fragment | null): number {\n const { config, hls, media } = this;\n if (media === null) {\n return 0;\n }\n\n // Check if currentTime is between unbuffered regions of partial fragments\n const currentTime = media.currentTime;\n const bufferInfo = BufferHelper.bufferInfo(media, currentTime, 0);\n const startTime =\n currentTime < bufferInfo.start ? bufferInfo.start : bufferInfo.nextStart;\n if (startTime) {\n const bufferStarved = bufferInfo.len <= config.maxBufferHole;\n const waiting =\n bufferInfo.len > 0 && bufferInfo.len < 1 && media.readyState < 3;\n const gapLength = startTime - currentTime;\n if (gapLength > 0 && (bufferStarved || waiting)) {\n // Only allow large gaps to be skipped if it is a start gap, or all fragments in skip range are partial\n if (gapLength > config.maxBufferHole) {\n const { fragmentTracker } = this;\n let startGap = false;\n if (currentTime === 0) {\n const startFrag = fragmentTracker.getAppendedFrag(\n 0,\n PlaylistLevelType.MAIN,\n );\n if (startFrag && startTime < startFrag.end) {\n startGap = true;\n }\n }\n if (!startGap) {\n const startProvisioned =\n partial ||\n fragmentTracker.getAppendedFrag(\n currentTime,\n PlaylistLevelType.MAIN,\n );\n if (startProvisioned) {\n let moreToLoad = false;\n let pos = startProvisioned.end;\n while (pos < startTime) {\n const provisioned = fragmentTracker.getPartialFragment(pos);\n if (provisioned) {\n pos += provisioned.duration;\n } else {\n moreToLoad = true;\n break;\n }\n }\n if (moreToLoad) {\n return 0;\n }\n }\n }\n }\n const targetTime = Math.max(\n startTime + SKIP_BUFFER_RANGE_START,\n currentTime + SKIP_BUFFER_HOLE_STEP_SECONDS,\n );\n logger.warn(\n `skipping hole, adjusting currentTime from ${currentTime} to ${targetTime}`,\n );\n this.moved = true;\n this.stalled = null;\n media.currentTime = targetTime;\n if (partial && !partial.gap) {\n const error = new Error(\n `fragment loaded with buffer holes, seeking from ${currentTime} to ${targetTime}`,\n );\n hls.trigger(Events.ERROR, {\n type: ErrorTypes.MEDIA_ERROR,\n details: ErrorDetails.BUFFER_SEEK_OVER_HOLE,\n fatal: false,\n error,\n reason: error.message,\n frag: partial,\n });\n }\n return targetTime;\n }\n }\n return 0;\n }\n\n /**\n * Attempts to fix buffer stalls by advancing the mediaElement's current time by a small amount.\n * @private\n */\n private _tryNudgeBuffer() {\n const { config, hls, media, nudgeRetry } = this;\n if (media === null) {\n return;\n }\n const currentTime = media.currentTime;\n this.nudgeRetry++;\n\n if (nudgeRetry < config.nudgeMaxRetry) {\n const targetTime = currentTime + (nudgeRetry + 1) * config.nudgeOffset;\n // playback stalled in buffered area ... let's nudge currentTime to try to overcome this\n const error = new Error(\n `Nudging 'currentTime' from ${currentTime} to ${targetTime}`,\n );\n logger.warn(error.message);\n media.currentTime = targetTime;\n hls.trigger(Events.ERROR, {\n type: ErrorTypes.MEDIA_ERROR,\n details: ErrorDetails.BUFFER_NUDGE_ON_STALL,\n error,\n fatal: false,\n });\n } else {\n const error = new Error(\n `Playhead still not moving while enough data buffered @${currentTime} after ${config.nudgeMaxRetry} nudges`,\n );\n logger.error(error.message);\n hls.trigger(Events.ERROR, {\n type: ErrorTypes.MEDIA_ERROR,\n details: ErrorDetails.BUFFER_STALLED_ERROR,\n error,\n fatal: true,\n });\n }\n }\n}\n","import BaseStreamController, { State } from './base-stream-controller';\nimport { changeTypeSupported } from '../is-supported';\nimport { Events } from '../events';\nimport { BufferHelper, BufferInfo } from '../utils/buffer-helper';\nimport { FragmentState } from './fragment-tracker';\nimport { PlaylistContextType, PlaylistLevelType } from '../types/loader';\nimport { ElementaryStreamTypes, Fragment } from '../loader/fragment';\nimport TransmuxerInterface from '../demux/transmuxer-interface';\nimport { ChunkMetadata } from '../types/transmuxer';\nimport GapController, { MAX_START_GAP_JUMP } from './gap-controller';\nimport { ErrorDetails } from '../errors';\nimport type { NetworkComponentAPI } from '../types/component-api';\nimport type Hls from '../hls';\nimport type { Level } from '../types/level';\nimport type { LevelDetails } from '../loader/level-details';\nimport type { FragmentTracker } from './fragment-tracker';\nimport type KeyLoader from '../loader/key-loader';\nimport type { TransmuxerResult } from '../types/transmuxer';\nimport type { TrackSet } from '../types/track';\nimport type { SourceBufferName } from '../types/buffer';\nimport type {\n AudioTrackSwitchedData,\n AudioTrackSwitchingData,\n BufferCreatedData,\n BufferEOSData,\n BufferFlushedData,\n ErrorData,\n FragBufferedData,\n FragLoadedData,\n FragParsingMetadataData,\n FragParsingUserdataData,\n LevelLoadedData,\n LevelLoadingData,\n LevelsUpdatedData,\n ManifestParsedData,\n MediaAttachedData,\n} from '../types/events';\n\nconst TICK_INTERVAL = 100; // how often to tick in ms\n\nexport default class StreamController\n extends BaseStreamController\n implements NetworkComponentAPI\n{\n private audioCodecSwap: boolean = false;\n private gapController: GapController | null = null;\n private level: number = -1;\n private _forceStartLoad: boolean = false;\n private altAudio: boolean = false;\n private audioOnly: boolean = false;\n private fragPlaying: Fragment | null = null;\n private onvplaying: EventListener | null = null;\n private onvseeked: EventListener | null = null;\n private fragLastKbps: number = 0;\n private couldBacktrack: boolean = false;\n private backtrackFragment: Fragment | null = null;\n private audioCodecSwitch: boolean = false;\n private videoBuffer: any | null = null;\n\n constructor(\n hls: Hls,\n fragmentTracker: FragmentTracker,\n keyLoader: KeyLoader,\n ) {\n super(\n hls,\n fragmentTracker,\n keyLoader,\n '[stream-controller]',\n PlaylistLevelType.MAIN,\n );\n this._registerListeners();\n }\n\n private _registerListeners() {\n const { hls } = this;\n hls.on(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n hls.on(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n hls.on(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n hls.on(Events.MANIFEST_PARSED, this.onManifestParsed, this);\n hls.on(Events.LEVEL_LOADING, this.onLevelLoading, this);\n hls.on(Events.LEVEL_LOADED, this.onLevelLoaded, this);\n hls.on(\n Events.FRAG_LOAD_EMERGENCY_ABORTED,\n this.onFragLoadEmergencyAborted,\n this,\n );\n hls.on(Events.ERROR, this.onError, this);\n hls.on(Events.AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this);\n hls.on(Events.AUDIO_TRACK_SWITCHED, this.onAudioTrackSwitched, this);\n hls.on(Events.BUFFER_CREATED, this.onBufferCreated, this);\n hls.on(Events.BUFFER_FLUSHED, this.onBufferFlushed, this);\n hls.on(Events.LEVELS_UPDATED, this.onLevelsUpdated, this);\n hls.on(Events.FRAG_BUFFERED, this.onFragBuffered, this);\n }\n\n protected _unregisterListeners() {\n const { hls } = this;\n hls.off(Events.MEDIA_ATTACHED, this.onMediaAttached, this);\n hls.off(Events.MEDIA_DETACHING, this.onMediaDetaching, this);\n hls.off(Events.MANIFEST_LOADING, this.onManifestLoading, this);\n hls.off(Events.MANIFEST_PARSED, this.onManifestParsed, this);\n hls.off(Events.LEVEL_LOADED, this.onLevelLoaded, this);\n hls.off(\n Events.FRAG_LOAD_EMERGENCY_ABORTED,\n this.onFragLoadEmergencyAborted,\n this,\n );\n hls.off(Events.ERROR, this.onError, this);\n hls.off(Events.AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this);\n hls.off(Events.AUDIO_TRACK_SWITCHED, this.onAudioTrackSwitched, this);\n hls.off(Events.BUFFER_CREATED, this.onBufferCreated, this);\n hls.off(Events.BUFFER_FLUSHED, this.onBufferFlushed, this);\n hls.off(Events.LEVELS_UPDATED, this.onLevelsUpdated, this);\n hls.off(Events.FRAG_BUFFERED, this.onFragBuffered, this);\n }\n\n protected onHandlerDestroying() {\n this._unregisterListeners();\n super.onHandlerDestroying();\n }\n\n public startLoad(startPosition: number): void {\n if (this.levels) {\n const { lastCurrentTime, hls } = this;\n this.stopLoad();\n this.setInterval(TICK_INTERVAL);\n this.level = -1;\n if (!this.startFragRequested) {\n // determine load level\n let startLevel = hls.startLevel;\n if (startLevel === -1) {\n if (hls.config.testBandwidth && this.levels.length > 1) {\n // -1 : guess start Level by doing a bitrate test by loading first fragment of lowest quality level\n startLevel = 0;\n this.bitrateTest = true;\n } else {\n startLevel = hls.firstAutoLevel;\n }\n }\n // set new level to playlist loader : this will trigger start level load\n // hls.nextLoadLevel remains until it is set to a new value or until a new frag is successfully loaded\n hls.nextLoadLevel = startLevel;\n this.level = hls.loadLevel;\n this.loadedmetadata = false;\n }\n // if startPosition undefined but lastCurrentTime set, set startPosition to last currentTime\n if (lastCurrentTime > 0 && startPosition === -1) {\n this.log(\n `Override startPosition with lastCurrentTime @${lastCurrentTime.toFixed(\n 3,\n )}`,\n );\n startPosition = lastCurrentTime;\n }\n this.state = State.IDLE;\n this.nextLoadPosition =\n this.startPosition =\n this.lastCurrentTime =\n startPosition;\n this.tick();\n } else {\n this._forceStartLoad = true;\n this.state = State.STOPPED;\n }\n }\n\n public stopLoad() {\n this._forceStartLoad = false;\n super.stopLoad();\n }\n\n protected doTick() {\n switch (this.state) {\n case State.WAITING_LEVEL: {\n const { levels, level } = this;\n const currentLevel = levels?.[level];\n const details = currentLevel?.details;\n if (\n details &&\n (!details.live || this.levelLastLoaded === currentLevel)\n ) {\n if (this.waitForCdnTuneIn(details)) {\n break;\n }\n this.state = State.IDLE;\n break;\n } else if (this.hls.nextLoadLevel !== this.level) {\n this.state = State.IDLE;\n break;\n }\n break;\n }\n case State.FRAG_LOADING_WAITING_RETRY:\n {\n const now = self.performance.now();\n const retryDate = this.retryDate;\n // if current time is gt than retryDate, or if media seeking let's switch to IDLE state to retry loading\n if (!retryDate || now >= retryDate || this.media?.seeking) {\n const { levels, level } = this;\n const currentLevel = levels?.[level];\n this.resetStartWhenNotLoaded(currentLevel || null);\n this.state = State.IDLE;\n }\n }\n break;\n default:\n break;\n }\n if (this.state === State.IDLE) {\n this.doTickIdle();\n }\n this.onTickEnd();\n }\n\n protected onTickEnd() {\n super.onTickEnd();\n this.checkBuffer();\n this.checkFragmentChanged();\n }\n\n private doTickIdle() {\n const { hls, levelLastLoaded, levels, media } = this;\n\n // if start level not parsed yet OR\n // if video not attached AND start fragment already requested OR start frag prefetch not enabled\n // exit loop, as we either need more info (level not parsed) or we need media to be attached to load new fragment\n if (\n levelLastLoaded === null ||\n (!media && (this.startFragRequested || !hls.config.startFragPrefetch))\n ) {\n return;\n }\n\n // If the \"main\" level is audio-only but we are loading an alternate track in the same group, do not load anything\n if (this.altAudio && this.audioOnly) {\n return;\n }\n\n const level = this.buffering ? hls.nextLoadLevel : hls.loadLevel;\n if (!levels?.[level]) {\n return;\n }\n\n const levelInfo = levels[level];\n\n // if buffer length is less than maxBufLen try to load a new fragment\n\n const bufferInfo = this.getMainFwdBufferInfo();\n if (bufferInfo === null) {\n return;\n }\n\n const lastDetails = this.getLevelDetails();\n if (lastDetails && this._streamEnded(bufferInfo, lastDetails)) {\n const data: BufferEOSData = {};\n if (this.altAudio) {\n data.type = 'video';\n }\n\n this.hls.trigger(Events.BUFFER_EOS, data);\n this.state = State.ENDED;\n return;\n }\n if (!this.buffering) {\n return;\n }\n\n // set next load level : this will trigger a playlist load if needed\n if (hls.loadLevel !== level && hls.manualLevel === -1) {\n this.log(`Adapting to level ${level} from level ${this.level}`);\n }\n this.level = hls.nextLoadLevel = level;\n\n const levelDetails = levelInfo.details;\n // if level info not retrieved yet, switch state and wait for level retrieval\n // if live playlist, ensure that new playlist has been refreshed to avoid loading/try to load\n // a useless and outdated fragment (that might even introduce load error if it is already out of the live playlist)\n if (\n !levelDetails ||\n this.state === State.WAITING_LEVEL ||\n (levelDetails.live && this.levelLastLoaded !== levelInfo)\n ) {\n this.level = level;\n this.state = State.WAITING_LEVEL;\n return;\n }\n\n const bufferLen = bufferInfo.len;\n\n // compute max Buffer Length that we could get from this load level, based on level bitrate. don't buffer more than 60 MB and more than 30s\n const maxBufLen = this.getMaxBufferLength(levelInfo.maxBitrate);\n\n // Stay idle if we are still with buffer margins\n if (bufferLen >= maxBufLen) {\n return;\n }\n\n if (\n this.backtrackFragment &&\n this.backtrackFragment.start > bufferInfo.end\n ) {\n this.backtrackFragment = null;\n }\n const targetBufferTime = this.backtrackFragment\n ? this.backtrackFragment.start\n : bufferInfo.end;\n let frag = this.getNextFragment(targetBufferTime, levelDetails);\n // Avoid backtracking by loading an earlier segment in streams with segments that do not start with a key frame (flagged by `couldBacktrack`)\n if (\n this.couldBacktrack &&\n !this.fragPrevious &&\n frag &&\n frag.sn !== 'initSegment' &&\n this.fragmentTracker.getState(frag) !== FragmentState.OK\n ) {\n const backtrackSn = (this.backtrackFragment ?? frag).sn as number;\n const fragIdx = backtrackSn - levelDetails.startSN;\n const backtrackFrag = levelDetails.fragments[fragIdx - 1];\n if (backtrackFrag && frag.cc === backtrackFrag.cc) {\n frag = backtrackFrag;\n this.fragmentTracker.removeFragment(backtrackFrag);\n }\n } else if (this.backtrackFragment && bufferInfo.len) {\n this.backtrackFragment = null;\n }\n // Avoid loop loading by using nextLoadPosition set for backtracking and skipping consecutive GAP tags\n if (frag && this.isLoopLoading(frag, targetBufferTime)) {\n const gapStart = frag.gap;\n if (!gapStart) {\n // Cleanup the fragment tracker before trying to find the next unbuffered fragment\n const type =\n this.audioOnly && !this.altAudio\n ? ElementaryStreamTypes.AUDIO\n : ElementaryStreamTypes.VIDEO;\n const mediaBuffer =\n (type === ElementaryStreamTypes.VIDEO\n ? this.videoBuffer\n : this.mediaBuffer) || this.media;\n if (mediaBuffer) {\n this.afterBufferFlushed(mediaBuffer, type, PlaylistLevelType.MAIN);\n }\n }\n frag = this.getNextFragmentLoopLoading(\n frag,\n levelDetails,\n bufferInfo,\n PlaylistLevelType.MAIN,\n maxBufLen,\n );\n }\n if (!frag) {\n return;\n }\n if (frag.initSegment && !frag.initSegment.data && !this.bitrateTest) {\n frag = frag.initSegment;\n }\n\n this.loadFragment(frag, levelInfo, targetBufferTime);\n }\n\n protected loadFragment(\n frag: Fragment,\n level: Level,\n targetBufferTime: number,\n ) {\n // Check if fragment is not loaded\n const fragState = this.fragmentTracker.getState(frag);\n this.fragCurrent = frag;\n if (\n fragState === FragmentState.NOT_LOADED ||\n fragState === FragmentState.PARTIAL\n ) {\n if (frag.sn === 'initSegment') {\n this._loadInitSegment(frag, level);\n } else if (this.bitrateTest) {\n this.log(\n `Fragment ${frag.sn} of level ${frag.level} is being downloaded to test bitrate and will not be buffered`,\n );\n this._loadBitrateTestFrag(frag, level);\n } else {\n this.startFragRequested = true;\n super.loadFragment(frag, level, targetBufferTime);\n }\n } else {\n this.clearTrackerIfNeeded(frag);\n }\n }\n\n private getBufferedFrag(position) {\n return this.fragmentTracker.getBufferedFrag(\n position,\n PlaylistLevelType.MAIN,\n );\n }\n\n private followingBufferedFrag(frag: Fragment | null) {\n if (frag) {\n // try to get range of next fragment (500ms after this range)\n return this.getBufferedFrag(frag.end + 0.5);\n }\n return null;\n }\n\n /*\n on immediate level switch :\n - pause playback if playing\n - cancel any pending load request\n - and trigger a buffer flush\n */\n public immediateLevelSwitch() {\n this.abortCurrentFrag();\n this.flushMainBuffer(0, Number.POSITIVE_INFINITY);\n }\n\n /**\n * try to switch ASAP without breaking video playback:\n * in order to ensure smooth but quick level switching,\n * we need to find the next flushable buffer range\n * we should take into account new segment fetch time\n */\n public nextLevelSwitch() {\n const { levels, media } = this;\n // ensure that media is defined and that metadata are available (to retrieve currentTime)\n if (media?.readyState) {\n let fetchdelay;\n const fragPlayingCurrent = this.getAppendedFrag(media.currentTime);\n if (fragPlayingCurrent && fragPlayingCurrent.start > 1) {\n // flush buffer preceding current fragment (flush until current fragment start offset)\n // minus 1s to avoid video freezing, that could happen if we flush keyframe of current video ...\n this.flushMainBuffer(0, fragPlayingCurrent.start - 1);\n }\n const levelDetails = this.getLevelDetails();\n if (levelDetails?.live) {\n const bufferInfo = this.getMainFwdBufferInfo();\n // Do not flush in live stream with low buffer\n if (!bufferInfo || bufferInfo.len < levelDetails.targetduration * 2) {\n return;\n }\n }\n if (!media.paused && levels) {\n // add a safety delay of 1s\n const nextLevelId = this.hls.nextLoadLevel;\n const nextLevel = levels[nextLevelId];\n const fragLastKbps = this.fragLastKbps;\n if (fragLastKbps && this.fragCurrent) {\n fetchdelay =\n (this.fragCurrent.duration * nextLevel.maxBitrate) /\n (1000 * fragLastKbps) +\n 1;\n } else {\n fetchdelay = 0;\n }\n } else {\n fetchdelay = 0;\n }\n // this.log('fetchdelay:'+fetchdelay);\n // find buffer range that will be reached once new fragment will be fetched\n const bufferedFrag = this.getBufferedFrag(media.currentTime + fetchdelay);\n if (bufferedFrag) {\n // we can flush buffer range following this one without stalling playback\n const nextBufferedFrag = this.followingBufferedFrag(bufferedFrag);\n if (nextBufferedFrag) {\n // if we are here, we can also cancel any loading/demuxing in progress, as they are useless\n this.abortCurrentFrag();\n // start flush position is in next buffered frag. Leave some padding for non-independent segments and smoother playback.\n const maxStart = nextBufferedFrag.maxStartPTS\n ? nextBufferedFrag.maxStartPTS\n : nextBufferedFrag.start;\n const fragDuration = nextBufferedFrag.duration;\n const startPts = Math.max(\n bufferedFrag.end,\n maxStart +\n Math.min(\n Math.max(\n fragDuration - this.config.maxFragLookUpTolerance,\n fragDuration * (this.couldBacktrack ? 0.5 : 0.125),\n ),\n fragDuration * (this.couldBacktrack ? 0.75 : 0.25),\n ),\n );\n this.flushMainBuffer(startPts, Number.POSITIVE_INFINITY);\n }\n }\n }\n }\n\n private abortCurrentFrag() {\n const fragCurrent = this.fragCurrent;\n this.fragCurrent = null;\n this.backtrackFragment = null;\n if (fragCurrent) {\n fragCurrent.abortRequests();\n this.fragmentTracker.removeFragment(fragCurrent);\n }\n switch (this.state) {\n case State.KEY_LOADING:\n case State.FRAG_LOADING:\n case State.FRAG_LOADING_WAITING_RETRY:\n case State.PARSING:\n case State.PARSED:\n this.state = State.IDLE;\n break;\n }\n this.nextLoadPosition = this.getLoadPosition();\n }\n\n protected flushMainBuffer(startOffset: number, endOffset: number) {\n super.flushMainBuffer(\n startOffset,\n endOffset,\n this.altAudio ? 'video' : null,\n );\n }\n\n protected onMediaAttached(\n event: Events.MEDIA_ATTACHED,\n data: MediaAttachedData,\n ) {\n super.onMediaAttached(event, data);\n const media = data.media;\n this.onvplaying = this.onMediaPlaying.bind(this);\n this.onvseeked = this.onMediaSeeked.bind(this);\n media.addEventListener('playing', this.onvplaying as EventListener);\n media.addEventListener('seeked', this.onvseeked as EventListener);\n this.gapController = new GapController(\n this.config,\n media,\n this.fragmentTracker,\n this.hls,\n );\n }\n\n protected onMediaDetaching() {\n const { media } = this;\n if (media && this.onvplaying && this.onvseeked) {\n media.removeEventListener('playing', this.onvplaying);\n media.removeEventListener('seeked', this.onvseeked);\n this.onvplaying = this.onvseeked = null;\n this.videoBuffer = null;\n }\n this.fragPlaying = null;\n if (this.gapController) {\n this.gapController.destroy();\n this.gapController = null;\n }\n super.onMediaDetaching();\n }\n\n private onMediaPlaying() {\n // tick to speed up FRAG_CHANGED triggering\n this.tick();\n }\n\n private onMediaSeeked() {\n const media = this.media;\n const currentTime = media ? media.currentTime : null;\n if (Number.isFinite(currentTime)) {\n this.log(`Media seeked to ${(currentTime as number).toFixed(3)}`);\n }\n\n // If seeked was issued before buffer was appended do not tick immediately\n const bufferInfo = this.getMainFwdBufferInfo();\n if (bufferInfo === null || bufferInfo.len === 0) {\n this.warn(\n `Main forward buffer length on \"seeked\" event ${\n bufferInfo ? bufferInfo.len : 'empty'\n })`,\n );\n return;\n }\n\n // tick to speed up FRAG_CHANGED triggering\n this.tick();\n }\n\n private onManifestLoading() {\n // reset buffer on manifest loading\n this.log('Trigger BUFFER_RESET');\n this.hls.trigger(Events.BUFFER_RESET, undefined);\n this.fragmentTracker.removeAllFragments();\n this.couldBacktrack = false;\n this.startPosition = this.lastCurrentTime = this.fragLastKbps = 0;\n this.levels =\n this.fragPlaying =\n this.backtrackFragment =\n this.levelLastLoaded =\n null;\n this.altAudio = this.audioOnly = this.startFragRequested = false;\n }\n\n private onManifestParsed(\n event: Events.MANIFEST_PARSED,\n data: ManifestParsedData,\n ) {\n // detect if we have different kind of audio codecs used amongst playlists\n let aac = false;\n let heaac = false;\n data.levels.forEach((level) => {\n const codec = level.audioCodec;\n if (codec) {\n aac = aac || codec.indexOf('mp4a.40.2') !== -1;\n heaac = heaac || codec.indexOf('mp4a.40.5') !== -1;\n }\n });\n this.audioCodecSwitch = aac && heaac && !changeTypeSupported();\n if (this.audioCodecSwitch) {\n this.log(\n 'Both AAC/HE-AAC audio found in levels; declaring level codec as HE-AAC',\n );\n }\n\n this.levels = data.levels;\n this.startFragRequested = false;\n }\n\n private onLevelLoading(event: Events.LEVEL_LOADING, data: LevelLoadingData) {\n const { levels } = this;\n if (!levels || this.state !== State.IDLE) {\n return;\n }\n const level = levels[data.level];\n if (\n !level.details ||\n (level.details.live && this.levelLastLoaded !== level) ||\n this.waitForCdnTuneIn(level.details)\n ) {\n this.state = State.WAITING_LEVEL;\n }\n }\n\n private onLevelLoaded(event: Events.LEVEL_LOADED, data: LevelLoadedData) {\n const { levels } = this;\n const newLevelId = data.level;\n const newDetails = data.details;\n const duration = newDetails.totalduration;\n\n if (!levels) {\n this.warn(`Levels were reset while loading level ${newLevelId}`);\n return;\n }\n this.log(\n `Level ${newLevelId} loaded [${newDetails.startSN},${newDetails.endSN}]${\n newDetails.lastPartSn\n ? `[part-${newDetails.lastPartSn}-${newDetails.lastPartIndex}]`\n : ''\n }, cc [${newDetails.startCC}, ${newDetails.endCC}] duration:${duration}`,\n );\n\n const curLevel = levels[newLevelId];\n const fragCurrent = this.fragCurrent;\n if (\n fragCurrent &&\n (this.state === State.FRAG_LOADING ||\n this.state === State.FRAG_LOADING_WAITING_RETRY)\n ) {\n if (fragCurrent.level !== data.level && fragCurrent.loader) {\n this.abortCurrentFrag();\n }\n }\n\n let sliding = 0;\n if (newDetails.live || curLevel.details?.live) {\n this.checkLiveUpdate(newDetails);\n if (newDetails.deltaUpdateFailed) {\n return;\n }\n sliding = this.alignPlaylists(\n newDetails,\n curLevel.details,\n this.levelLastLoaded?.details,\n );\n }\n // override level info\n curLevel.details = newDetails;\n this.levelLastLoaded = curLevel;\n\n this.hls.trigger(Events.LEVEL_UPDATED, {\n details: newDetails,\n level: newLevelId,\n });\n\n // only switch back to IDLE state if we were waiting for level to start downloading a new fragment\n if (this.state === State.WAITING_LEVEL) {\n if (this.waitForCdnTuneIn(newDetails)) {\n // Wait for Low-Latency CDN Tune-in\n return;\n }\n this.state = State.IDLE;\n }\n\n if (!this.startFragRequested) {\n this.setStartPosition(newDetails, sliding);\n } else if (newDetails.live) {\n this.synchronizeToLiveEdge(newDetails);\n }\n\n // trigger handler right now\n this.tick();\n }\n\n protected _handleFragmentLoadProgress(data: FragLoadedData) {\n const { frag, part, payload } = data;\n const { levels } = this;\n if (!levels) {\n this.warn(\n `Levels were reset while fragment load was in progress. Fragment ${frag.sn} of level ${frag.level} will not be buffered`,\n );\n return;\n }\n const currentLevel = levels[frag.level];\n const details = currentLevel.details as LevelDetails;\n if (!details) {\n this.warn(\n `Dropping fragment ${frag.sn} of level ${frag.level} after level details were reset`,\n );\n this.fragmentTracker.removeFragment(frag);\n return;\n }\n const videoCodec = currentLevel.videoCodec;\n\n // time Offset is accurate if level PTS is known, or if playlist is not sliding (not live)\n const accurateTimeOffset = details.PTSKnown || !details.live;\n const initSegmentData = frag.initSegment?.data;\n const audioCodec = this._getAudioCodec(currentLevel);\n\n // transmux the MPEG-TS data to ISO-BMFF segments\n // this.log(`Transmuxing ${frag.sn} of [${details.startSN} ,${details.endSN}],level ${frag.level}, cc ${frag.cc}`);\n const transmuxer = (this.transmuxer =\n this.transmuxer ||\n new TransmuxerInterface(\n this.hls,\n PlaylistLevelType.MAIN,\n this._handleTransmuxComplete.bind(this),\n this._handleTransmuxerFlush.bind(this),\n ));\n const partIndex = part ? part.index : -1;\n const partial = partIndex !== -1;\n const chunkMeta = new ChunkMetadata(\n frag.level,\n frag.sn as number,\n frag.stats.chunkCount,\n payload.byteLength,\n partIndex,\n partial,\n );\n const initPTS = this.initPTS[frag.cc];\n\n transmuxer.push(\n payload,\n initSegmentData,\n audioCodec,\n videoCodec,\n frag,\n part,\n details.totalduration,\n accurateTimeOffset,\n chunkMeta,\n initPTS,\n );\n }\n\n private onAudioTrackSwitching(\n event: Events.AUDIO_TRACK_SWITCHING,\n data: AudioTrackSwitchingData,\n ) {\n // if any URL found on new audio track, it is an alternate audio track\n const fromAltAudio = this.altAudio;\n const altAudio = !!data.url;\n // if we switch on main audio, ensure that main fragment scheduling is synced with media.buffered\n // don't do anything if we switch to alt audio: audio stream controller is handling it.\n // we will just have to change buffer scheduling on audioTrackSwitched\n if (!altAudio) {\n if (this.mediaBuffer !== this.media) {\n this.log(\n 'Switching on main audio, use media.buffered to schedule main fragment loading',\n );\n this.mediaBuffer = this.media;\n const fragCurrent = this.fragCurrent;\n // we need to refill audio buffer from main: cancel any frag loading to speed up audio switch\n if (fragCurrent) {\n this.log('Switching to main audio track, cancel main fragment load');\n fragCurrent.abortRequests();\n this.fragmentTracker.removeFragment(fragCurrent);\n }\n // destroy transmuxer to force init segment generation (following audio switch)\n this.resetTransmuxer();\n // switch to IDLE state to load new fragment\n this.resetLoadingState();\n } else if (this.audioOnly) {\n // Reset audio transmuxer so when switching back to main audio we're not still appending where we left off\n this.resetTransmuxer();\n }\n const hls = this.hls;\n // If switching from alt to main audio, flush all audio and trigger track switched\n if (fromAltAudio) {\n hls.trigger(Events.BUFFER_FLUSHING, {\n startOffset: 0,\n endOffset: Number.POSITIVE_INFINITY,\n type: null,\n });\n this.fragmentTracker.removeAllFragments();\n }\n hls.trigger(Events.AUDIO_TRACK_SWITCHED, data);\n }\n }\n\n private onAudioTrackSwitched(\n event: Events.AUDIO_TRACK_SWITCHED,\n data: AudioTrackSwitchedData,\n ) {\n const trackId = data.id;\n const altAudio = !!this.hls.audioTracks[trackId].url;\n if (altAudio) {\n const videoBuffer = this.videoBuffer;\n // if we switched on alternate audio, ensure that main fragment scheduling is synced with video sourcebuffer buffered\n if (videoBuffer && this.mediaBuffer !== videoBuffer) {\n this.log(\n 'Switching on alternate audio, use video.buffered to schedule main fragment loading',\n );\n this.mediaBuffer = videoBuffer;\n }\n }\n this.altAudio = altAudio;\n this.tick();\n }\n\n private onBufferCreated(\n event: Events.BUFFER_CREATED,\n data: BufferCreatedData,\n ) {\n const tracks = data.tracks;\n let mediaTrack;\n let name;\n let alternate = false;\n for (const type in tracks) {\n const track = tracks[type];\n if (track.id === 'main') {\n name = type;\n mediaTrack = track;\n // keep video source buffer reference\n if (type === 'video') {\n const videoTrack = tracks[type];\n if (videoTrack) {\n this.videoBuffer = videoTrack.buffer;\n }\n }\n } else {\n alternate = true;\n }\n }\n if (alternate && mediaTrack) {\n this.log(\n `Alternate track found, use ${name}.buffered to schedule main fragment loading`,\n );\n this.mediaBuffer = mediaTrack.buffer;\n } else {\n this.mediaBuffer = this.media;\n }\n }\n\n private onFragBuffered(event: Events.FRAG_BUFFERED, data: FragBufferedData) {\n const { frag, part } = data;\n if (frag && frag.type !== PlaylistLevelType.MAIN) {\n return;\n }\n if (this.fragContextChanged(frag)) {\n // If a level switch was requested while a fragment was buffering, it will emit the FRAG_BUFFERED event upon completion\n // Avoid setting state back to IDLE, since that will interfere with a level switch\n this.warn(\n `Fragment ${frag.sn}${part ? ' p: ' + part.index : ''} of level ${\n frag.level\n } finished buffering, but was aborted. state: ${this.state}`,\n );\n if (this.state === State.PARSED) {\n this.state = State.IDLE;\n }\n return;\n }\n const stats = part ? part.stats : frag.stats;\n this.fragLastKbps = Math.round(\n (8 * stats.total) / (stats.buffering.end - stats.loading.first),\n );\n if (frag.sn !== 'initSegment') {\n this.fragPrevious = frag;\n }\n this.fragBufferedComplete(frag, part);\n }\n\n private onError(event: Events.ERROR, data: ErrorData) {\n if (data.fatal) {\n this.state = State.ERROR;\n return;\n }\n switch (data.details) {\n case ErrorDetails.FRAG_GAP:\n case ErrorDetails.FRAG_PARSING_ERROR:\n case ErrorDetails.FRAG_DECRYPT_ERROR:\n case ErrorDetails.FRAG_LOAD_ERROR:\n case ErrorDetails.FRAG_LOAD_TIMEOUT:\n case ErrorDetails.KEY_LOAD_ERROR:\n case ErrorDetails.KEY_LOAD_TIMEOUT:\n this.onFragmentOrKeyLoadError(PlaylistLevelType.MAIN, data);\n break;\n case ErrorDetails.LEVEL_LOAD_ERROR:\n case ErrorDetails.LEVEL_LOAD_TIMEOUT:\n case ErrorDetails.LEVEL_PARSING_ERROR:\n // in case of non fatal error while loading level, if level controller is not retrying to load level, switch back to IDLE\n if (\n !data.levelRetry &&\n this.state === State.WAITING_LEVEL &&\n data.context?.type === PlaylistContextType.LEVEL\n ) {\n this.state = State.IDLE;\n }\n break;\n case ErrorDetails.BUFFER_APPEND_ERROR:\n case ErrorDetails.BUFFER_FULL_ERROR:\n if (!data.parent || data.parent !== 'main') {\n return;\n }\n if (data.details === ErrorDetails.BUFFER_APPEND_ERROR) {\n this.resetLoadingState();\n return;\n }\n if (this.reduceLengthAndFlushBuffer(data)) {\n this.flushMainBuffer(0, Number.POSITIVE_INFINITY);\n }\n break;\n case ErrorDetails.INTERNAL_EXCEPTION:\n this.recoverWorkerError(data);\n break;\n default:\n break;\n }\n }\n\n // Checks the health of the buffer and attempts to resolve playback stalls.\n private checkBuffer() {\n const { media, gapController } = this;\n if (!media || !gapController || !media.readyState) {\n // Exit early if we don't have media or if the media hasn't buffered anything yet (readyState 0)\n return;\n }\n\n if (this.loadedmetadata || !BufferHelper.getBuffered(media).length) {\n // Resolve gaps using the main buffer, whose ranges are the intersections of the A/V sourcebuffers\n const activeFrag = this.state !== State.IDLE ? this.fragCurrent : null;\n gapController.poll(this.lastCurrentTime, activeFrag);\n }\n\n this.lastCurrentTime = media.currentTime;\n }\n\n private onFragLoadEmergencyAborted() {\n this.state = State.IDLE;\n // if loadedmetadata is not set, it means that we are emergency switch down on first frag\n // in that case, reset startFragRequested flag\n if (!this.loadedmetadata) {\n this.startFragRequested = false;\n this.nextLoadPosition = this.startPosition;\n }\n this.tickImmediate();\n }\n\n private onBufferFlushed(\n event: Events.BUFFER_FLUSHED,\n { type }: BufferFlushedData,\n ) {\n if (\n type !== ElementaryStreamTypes.AUDIO ||\n (this.audioOnly && !this.altAudio)\n ) {\n const mediaBuffer =\n (type === ElementaryStreamTypes.VIDEO\n ? this.videoBuffer\n : this.mediaBuffer) || this.media;\n this.afterBufferFlushed(mediaBuffer, type, PlaylistLevelType.MAIN);\n this.tick();\n }\n }\n\n private onLevelsUpdated(\n event: Events.LEVELS_UPDATED,\n data: LevelsUpdatedData,\n ) {\n if (this.level > -1 && this.fragCurrent) {\n this.level = this.fragCurrent.level;\n }\n this.levels = data.levels;\n }\n\n public swapAudioCodec() {\n this.audioCodecSwap = !this.audioCodecSwap;\n }\n\n /**\n * Seeks to the set startPosition if not equal to the mediaElement's current time.\n */\n protected seekToStartPos() {\n const { media } = this;\n if (!media) {\n return;\n }\n const currentTime = media.currentTime;\n let startPosition = this.startPosition;\n // only adjust currentTime if different from startPosition or if startPosition not buffered\n // at that stage, there should be only one buffered range, as we reach that code after first fragment has been buffered\n if (startPosition >= 0 && currentTime < startPosition) {\n if (media.seeking) {\n this.log(\n `could not seek to ${startPosition}, already seeking at ${currentTime}`,\n );\n return;\n }\n const buffered = BufferHelper.getBuffered(media);\n const bufferStart = buffered.length ? buffered.start(0) : 0;\n const delta = bufferStart - startPosition;\n if (\n delta > 0 &&\n (delta < this.config.maxBufferHole ||\n delta < this.config.maxFragLookUpTolerance)\n ) {\n this.log(`adjusting start position by ${delta} to match buffer start`);\n startPosition += delta;\n this.startPosition = startPosition;\n }\n this.log(\n `seek to target start position ${startPosition} from current time ${currentTime}`,\n );\n media.currentTime = startPosition;\n }\n }\n\n private _getAudioCodec(currentLevel) {\n let audioCodec = this.config.defaultAudioCodec || currentLevel.audioCodec;\n if (this.audioCodecSwap && audioCodec) {\n this.log('Swapping audio codec');\n if (audioCodec.indexOf('mp4a.40.5') !== -1) {\n audioCodec = 'mp4a.40.2';\n } else {\n audioCodec = 'mp4a.40.5';\n }\n }\n\n return audioCodec;\n }\n\n private _loadBitrateTestFrag(frag: Fragment, level: Level) {\n frag.bitrateTest = true;\n this._doFragLoad(frag, level).then((data) => {\n const { hls } = this;\n if (!data || this.fragContextChanged(frag)) {\n return;\n }\n level.fragmentError = 0;\n this.state = State.IDLE;\n this.startFragRequested = false;\n this.bitrateTest = false;\n const stats = frag.stats;\n // Bitrate tests fragments are neither parsed nor buffered\n stats.parsing.start =\n stats.parsing.end =\n stats.buffering.start =\n stats.buffering.end =\n self.performance.now();\n hls.trigger(Events.FRAG_LOADED, data as FragLoadedData);\n frag.bitrateTest = false;\n });\n }\n\n private _handleTransmuxComplete(transmuxResult: TransmuxerResult) {\n const id = 'main';\n const { hls } = this;\n const { remuxResult, chunkMeta } = transmuxResult;\n\n const context = this.getCurrentContext(chunkMeta);\n if (!context) {\n this.resetWhenMissingContext(chunkMeta);\n return;\n }\n const { frag, part, level } = context;\n const { video, text, id3, initSegment } = remuxResult;\n const { details } = level;\n // The audio-stream-controller handles audio buffering if Hls.js is playing an alternate audio track\n const audio = this.altAudio ? undefined : remuxResult.audio;\n\n // Check if the current fragment has been aborted. We check this by first seeing if we're still playing the current level.\n // If we are, subsequently check if the currently loading fragment (fragCurrent) has changed.\n if (this.fragContextChanged(frag)) {\n this.fragmentTracker.removeFragment(frag);\n return;\n }\n\n this.state = State.PARSING;\n\n if (initSegment) {\n if (initSegment?.tracks) {\n const mapFragment = frag.initSegment || frag;\n this._bufferInitSegment(\n level,\n initSegment.tracks,\n mapFragment,\n chunkMeta,\n );\n hls.trigger(Events.FRAG_PARSING_INIT_SEGMENT, {\n frag: mapFragment,\n id,\n tracks: initSegment.tracks,\n });\n }\n\n // This would be nice if Number.isFinite acted as a typeguard, but it doesn't. See: https://github.com/Microsoft/TypeScript/issues/10038\n const initPTS = initSegment.initPTS as number;\n const timescale = initSegment.timescale as number;\n if (Number.isFinite(initPTS)) {\n this.initPTS[frag.cc] = { baseTime: initPTS, timescale };\n hls.trigger(Events.INIT_PTS_FOUND, { frag, id, initPTS, timescale });\n }\n }\n\n // Avoid buffering if backtracking this fragment\n if (video && details && frag.sn !== 'initSegment') {\n const prevFrag = details.fragments[frag.sn - 1 - details.startSN];\n const isFirstFragment = frag.sn === details.startSN;\n const isFirstInDiscontinuity = !prevFrag || frag.cc > prevFrag.cc;\n if (remuxResult.independent !== false) {\n const { startPTS, endPTS, startDTS, endDTS } = video;\n if (part) {\n part.elementaryStreams[video.type] = {\n startPTS,\n endPTS,\n startDTS,\n endDTS,\n };\n } else {\n if (\n video.firstKeyFrame &&\n video.independent &&\n chunkMeta.id === 1 &&\n !isFirstInDiscontinuity\n ) {\n this.couldBacktrack = true;\n }\n if (video.dropped && video.independent) {\n // Backtrack if dropped frames create a gap after currentTime\n\n const bufferInfo = this.getMainFwdBufferInfo();\n const targetBufferTime =\n (bufferInfo ? bufferInfo.end : this.getLoadPosition()) +\n this.config.maxBufferHole;\n const startTime = video.firstKeyFramePTS\n ? video.firstKeyFramePTS\n : startPTS;\n if (\n !isFirstFragment &&\n targetBufferTime < startTime - this.config.maxBufferHole &&\n !isFirstInDiscontinuity\n ) {\n this.backtrack(frag);\n return;\n } else if (isFirstInDiscontinuity) {\n // Mark segment with a gap to avoid loop loading\n frag.gap = true;\n }\n // Set video stream start to fragment start so that truncated samples do not distort the timeline, and mark it partial\n frag.setElementaryStreamInfo(\n video.type as ElementaryStreamTypes,\n frag.start,\n endPTS,\n frag.start,\n endDTS,\n true,\n );\n } else if (isFirstFragment && startPTS > MAX_START_GAP_JUMP) {\n // Mark segment with a gap to skip large start gap\n frag.gap = true;\n }\n }\n frag.setElementaryStreamInfo(\n video.type as ElementaryStreamTypes,\n startPTS,\n endPTS,\n startDTS,\n endDTS,\n );\n if (this.backtrackFragment) {\n this.backtrackFragment = frag;\n }\n this.bufferFragmentData(\n video,\n frag,\n part,\n chunkMeta,\n isFirstFragment || isFirstInDiscontinuity,\n );\n } else if (isFirstFragment || isFirstInDiscontinuity) {\n // Mark segment with a gap to avoid loop loading\n frag.gap = true;\n } else {\n this.backtrack(frag);\n return;\n }\n }\n\n if (audio) {\n const { startPTS, endPTS, startDTS, endDTS } = audio;\n if (part) {\n part.elementaryStreams[ElementaryStreamTypes.AUDIO] = {\n startPTS,\n endPTS,\n startDTS,\n endDTS,\n };\n }\n frag.setElementaryStreamInfo(\n ElementaryStreamTypes.AUDIO,\n startPTS,\n endPTS,\n startDTS,\n endDTS,\n );\n this.bufferFragmentData(audio, frag, part, chunkMeta);\n }\n\n if (details && id3?.samples?.length) {\n const emittedID3: FragParsingMetadataData = {\n id,\n frag,\n details,\n samples: id3.samples,\n };\n hls.trigger(Events.FRAG_PARSING_METADATA, emittedID3);\n }\n if (details && text) {\n const emittedText: FragParsingUserdataData = {\n id,\n frag,\n details,\n samples: text.samples,\n };\n hls.trigger(Events.FRAG_PARSING_USERDATA, emittedText);\n }\n }\n\n private _bufferInitSegment(\n currentLevel: Level,\n tracks: TrackSet,\n frag: Fragment,\n chunkMeta: ChunkMetadata,\n ) {\n if (this.state !== State.PARSING) {\n return;\n }\n\n this.audioOnly = !!tracks.audio && !tracks.video;\n\n // if audio track is expected to come from audio stream controller, discard any coming from main\n if (this.altAudio && !this.audioOnly) {\n delete tracks.audio;\n }\n // include levelCodec in audio and video tracks\n const { audio, video, audiovideo } = tracks;\n if (audio) {\n let audioCodec = currentLevel.audioCodec;\n const ua = navigator.userAgent.toLowerCase();\n if (this.audioCodecSwitch) {\n if (audioCodec) {\n if (audioCodec.indexOf('mp4a.40.5') !== -1) {\n audioCodec = 'mp4a.40.2';\n } else {\n audioCodec = 'mp4a.40.5';\n }\n }\n // In the case that AAC and HE-AAC audio codecs are signalled in manifest,\n // force HE-AAC, as it seems that most browsers prefers it.\n // don't force HE-AAC if mono stream, or in Firefox\n const audioMetadata = audio.metadata;\n if (\n audioMetadata &&\n 'channelCount' in audioMetadata &&\n (audioMetadata.channelCount || 1) !== 1 &&\n ua.indexOf('firefox') === -1\n ) {\n audioCodec = 'mp4a.40.5';\n }\n }\n // HE-AAC is broken on Android, always signal audio codec as AAC even if variant manifest states otherwise\n if (\n audioCodec &&\n audioCodec.indexOf('mp4a.40.5') !== -1 &&\n ua.indexOf('android') !== -1 &&\n audio.container !== 'audio/mpeg'\n ) {\n // Exclude mpeg audio\n audioCodec = 'mp4a.40.2';\n this.log(`Android: force audio codec to ${audioCodec}`);\n }\n if (currentLevel.audioCodec && currentLevel.audioCodec !== audioCodec) {\n this.log(\n `Swapping manifest audio codec \"${currentLevel.audioCodec}\" for \"${audioCodec}\"`,\n );\n }\n audio.levelCodec = audioCodec;\n audio.id = 'main';\n this.log(\n `Init audio buffer, container:${\n audio.container\n }, codecs[selected/level/parsed]=[${audioCodec || ''}/${\n currentLevel.audioCodec || ''\n }/${audio.codec}]`,\n );\n }\n if (video) {\n video.levelCodec = currentLevel.videoCodec;\n video.id = 'main';\n this.log(\n `Init video buffer, container:${\n video.container\n }, codecs[level/parsed]=[${currentLevel.videoCodec || ''}/${\n video.codec\n }]`,\n );\n }\n if (audiovideo) {\n this.log(\n `Init audiovideo buffer, container:${audiovideo.container}, codecs[level/parsed]=[${currentLevel.codecs}/${audiovideo.codec}]`,\n );\n }\n this.hls.trigger(Events.BUFFER_CODECS, tracks);\n // loop through tracks that are going to be provided to bufferController\n Object.keys(tracks).forEach((trackName) => {\n const track = tracks[trackName];\n const initSegment = track.initSegment;\n if (initSegment?.byteLength) {\n this.hls.trigger(Events.BUFFER_APPENDING, {\n type: trackName as SourceBufferName,\n data: initSegment,\n frag,\n part: null,\n chunkMeta,\n parent: frag.type,\n });\n }\n });\n // trigger handler right now\n this.tickImmediate();\n }\n\n public getMainFwdBufferInfo(): BufferInfo | null {\n return this.getFwdBufferInfo(\n this.mediaBuffer ? this.mediaBuffer : this.media,\n PlaylistLevelType.MAIN,\n );\n }\n\n private backtrack(frag: Fragment) {\n this.couldBacktrack = true;\n // Causes findFragments to backtrack through fragments to find the keyframe\n this.backtrackFragment = frag;\n this.resetTransmuxer();\n this.flushBufferGap(frag);\n this.fragmentTracker.removeFragment(frag);\n this.fragPrevious = null;\n this.nextLoadPosition = frag.start;\n this.state = State.IDLE;\n }\n\n private checkFragmentChanged() {\n const video = this.media;\n let fragPlayingCurrent: Fragment | null = null;\n if (video && video.readyState > 1 && video.seeking === false) {\n const currentTime = video.currentTime;\n /* if video element is in seeked state, currentTime can only increase.\n (assuming that playback rate is positive ...)\n As sometimes currentTime jumps back to zero after a\n media decode error, check this, to avoid seeking back to\n wrong position after a media decode error\n */\n\n if (BufferHelper.isBuffered(video, currentTime)) {\n fragPlayingCurrent = this.getAppendedFrag(currentTime);\n } else if (BufferHelper.isBuffered(video, currentTime + 0.1)) {\n /* ensure that FRAG_CHANGED event is triggered at startup,\n when first video frame is displayed and playback is paused.\n add a tolerance of 100ms, in case current position is not buffered,\n check if current pos+100ms is buffered and use that buffer range\n for FRAG_CHANGED event reporting */\n fragPlayingCurrent = this.getAppendedFrag(currentTime + 0.1);\n }\n if (fragPlayingCurrent) {\n this.backtrackFragment = null;\n const fragPlaying = this.fragPlaying;\n const fragCurrentLevel = fragPlayingCurrent.level;\n if (\n !fragPlaying ||\n fragPlayingCurrent.sn !== fragPlaying.sn ||\n fragPlaying.level !== fragCurrentLevel\n ) {\n this.fragPlaying = fragPlayingCurrent;\n this.hls.trigger(Events.FRAG_CHANGED, { frag: fragPlayingCurrent });\n if (!fragPlaying || fragPlaying.level !== fragCurrentLevel) {\n this.hls.trigger(Events.LEVEL_SWITCHED, {\n level: fragCurrentLevel,\n });\n }\n }\n }\n }\n }\n\n get nextLevel(): number {\n const frag = this.nextBufferedFrag;\n if (frag) {\n return frag.level;\n }\n return -1;\n }\n\n get currentFrag(): Fragment | null {\n const media = this.media;\n if (media) {\n return this.fragPlaying || this.getAppendedFrag(media.currentTime);\n }\n return null;\n }\n\n get currentProgramDateTime(): Date | null {\n const media = this.media;\n if (media) {\n const currentTime = media.currentTime;\n const frag = this.currentFrag;\n if (\n frag &&\n Number.isFinite(currentTime) &&\n Number.isFinite(frag.programDateTime)\n ) {\n const epocMs =\n (frag.programDateTime as number) + (currentTime - frag.start) * 1000;\n return new Date(epocMs);\n }\n }\n return null;\n }\n\n get currentLevel(): number {\n const frag = this.currentFrag;\n if (frag) {\n return frag.level;\n }\n return -1;\n }\n\n get nextBufferedFrag() {\n const frag = this.currentFrag;\n if (frag) {\n return this.followingBufferedFrag(frag);\n }\n return null;\n }\n\n get forceStartLoad() {\n return this._forceStartLoad;\n }\n}\n","import { buildAbsoluteURL } from 'url-toolkit';\nimport PlaylistLoader from './loader/playlist-loader';\nimport ID3TrackController from './controller/id3-track-controller';\nimport LatencyController from './controller/latency-controller';\nimport LevelController from './controller/level-controller';\nimport { FragmentTracker } from './controller/fragment-tracker';\nimport KeyLoader from './loader/key-loader';\nimport StreamController from './controller/stream-controller';\nimport { isMSESupported, isSupported } from './is-supported';\nimport { getMediaSource } from './utils/mediasource-helper';\nimport { logger, enableLogs } from './utils/logger';\nimport { enableStreamingMode, hlsDefaultConfig, mergeConfig } from './config';\nimport { EventEmitter } from 'eventemitter3';\nimport { Events } from './events';\nimport { ErrorTypes, ErrorDetails } from './errors';\nimport { isHdcpLevel, type HdcpLevel, type Level } from './types/level';\nimport type { HlsEventEmitter, HlsListeners } from './events';\nimport type AudioTrackController from './controller/audio-track-controller';\nimport type AbrController from './controller/abr-controller';\nimport type BufferController from './controller/buffer-controller';\nimport type CapLevelController from './controller/cap-level-controller';\nimport type CMCDController from './controller/cmcd-controller';\nimport type EMEController from './controller/eme-controller';\nimport type SubtitleTrackController from './controller/subtitle-track-controller';\nimport type {\n AbrComponentAPI,\n ComponentAPI,\n NetworkComponentAPI,\n} from './types/component-api';\nimport type {\n AudioSelectionOption,\n MediaPlaylist,\n SubtitleSelectionOption,\n VideoSelectionOption,\n} from './types/media-playlist';\nimport type { HlsConfig } from './config';\nimport type { BufferInfo } from './utils/buffer-helper';\nimport type AudioStreamController from './controller/audio-stream-controller';\nimport type BasePlaylistController from './controller/base-playlist-controller';\nimport type BaseStreamController from './controller/base-stream-controller';\nimport type ContentSteeringController from './controller/content-steering-controller';\nimport type ErrorController from './controller/error-controller';\nimport type FPSController from './controller/fps-controller';\n\n/**\n * The `Hls` class is the core of the HLS.js library used to instantiate player instances.\n * @public\n */\nexport default class Hls implements HlsEventEmitter {\n private static defaultConfig: HlsConfig | undefined;\n\n /**\n * The runtime configuration used by the player. At instantiation this is combination of `hls.userConfig` merged over `Hls.DefaultConfig`.\n */\n public readonly config: HlsConfig;\n\n /**\n * The configuration object provided on player instantiation.\n */\n public readonly userConfig: Partial<HlsConfig>;\n\n private coreComponents: ComponentAPI[];\n private networkControllers: NetworkComponentAPI[];\n private started: boolean = false;\n private _emitter: HlsEventEmitter = new EventEmitter();\n private _autoLevelCapping: number = -1;\n private _maxHdcpLevel: HdcpLevel = null;\n private abrController: AbrComponentAPI;\n private bufferController: BufferController;\n private capLevelController: CapLevelController;\n private latencyController: LatencyController;\n private levelController: LevelController;\n private streamController: StreamController;\n private audioTrackController: AudioTrackController;\n private subtitleTrackController: SubtitleTrackController;\n private emeController: EMEController;\n private cmcdController: CMCDController;\n private _media: HTMLMediaElement | null = null;\n private url: string | null = null;\n private triggeringException?: boolean;\n\n /**\n * Get the video-dev/hls.js package version.\n */\n static get version(): string {\n return __VERSION__;\n }\n\n /**\n * Check if the required MediaSource Extensions are available.\n */\n static isMSESupported(): boolean {\n return isMSESupported();\n }\n\n /**\n * Check if MediaSource Extensions are available and isTypeSupported checks pass for any baseline codecs.\n */\n static isSupported(): boolean {\n return isSupported();\n }\n\n /**\n * Get the MediaSource global used for MSE playback (ManagedMediaSource, MediaSource, or WebKitMediaSource).\n */\n static getMediaSource(): typeof MediaSource | undefined {\n return getMediaSource();\n }\n\n static get Events(): typeof Events {\n return Events;\n }\n\n static get ErrorTypes(): typeof ErrorTypes {\n return ErrorTypes;\n }\n\n static get ErrorDetails(): typeof ErrorDetails {\n return ErrorDetails;\n }\n\n /**\n * Get the default configuration applied to new instances.\n */\n static get DefaultConfig(): HlsConfig {\n if (!Hls.defaultConfig) {\n return hlsDefaultConfig;\n }\n\n return Hls.defaultConfig;\n }\n\n /**\n * Replace the default configuration applied to new instances.\n */\n static set DefaultConfig(defaultConfig: HlsConfig) {\n Hls.defaultConfig = defaultConfig;\n }\n\n /**\n * Creates an instance of an HLS client that can attach to exactly one `HTMLMediaElement`.\n * @param userConfig - Configuration options applied over `Hls.DefaultConfig`\n */\n constructor(userConfig: Partial<HlsConfig> = {}) {\n enableLogs(userConfig.debug || false, 'Hls instance');\n const config = (this.config = mergeConfig(Hls.DefaultConfig, userConfig));\n this.userConfig = userConfig;\n\n if (config.progressive) {\n enableStreamingMode(config);\n }\n\n // core controllers and network loaders\n const {\n abrController: ConfigAbrController,\n bufferController: ConfigBufferController,\n capLevelController: ConfigCapLevelController,\n errorController: ConfigErrorController,\n fpsController: ConfigFpsController,\n } = config;\n const errorController = new ConfigErrorController(this);\n const abrController = (this.abrController = new ConfigAbrController(this));\n const bufferController = (this.bufferController =\n new ConfigBufferController(this));\n const capLevelController = (this.capLevelController =\n new ConfigCapLevelController(this));\n\n const fpsController = new ConfigFpsController(this);\n const playListLoader = new PlaylistLoader(this);\n const id3TrackController = new ID3TrackController(this);\n\n const ConfigContentSteeringController = config.contentSteeringController;\n // ConentSteeringController is defined before LevelController to receive Multivariant Playlist events first\n const contentSteering = ConfigContentSteeringController\n ? new ConfigContentSteeringController(this)\n : null;\n const levelController = (this.levelController = new LevelController(\n this,\n contentSteering,\n ));\n // FragmentTracker must be defined before StreamController because the order of event handling is important\n const fragmentTracker = new FragmentTracker(this);\n const keyLoader = new KeyLoader(this.config);\n const streamController = (this.streamController = new StreamController(\n this,\n fragmentTracker,\n keyLoader,\n ));\n\n // Cap level controller uses streamController to flush the buffer\n capLevelController.setStreamController(streamController);\n // fpsController uses streamController to switch when frames are being dropped\n fpsController.setStreamController(streamController);\n\n const networkControllers: NetworkComponentAPI[] = [\n playListLoader,\n levelController,\n streamController,\n ];\n if (contentSteering) {\n networkControllers.splice(1, 0, contentSteering);\n }\n\n this.networkControllers = networkControllers;\n const coreComponents: ComponentAPI[] = [\n abrController,\n bufferController,\n capLevelController,\n fpsController,\n id3TrackController,\n fragmentTracker,\n ];\n\n this.audioTrackController = this.createController(\n config.audioTrackController,\n networkControllers,\n );\n const AudioStreamControllerClass = config.audioStreamController;\n if (AudioStreamControllerClass) {\n networkControllers.push(\n new AudioStreamControllerClass(this, fragmentTracker, keyLoader),\n );\n }\n // subtitleTrackController must be defined before subtitleStreamController because the order of event handling is important\n this.subtitleTrackController = this.createController(\n config.subtitleTrackController,\n networkControllers,\n );\n const SubtitleStreamControllerClass = config.subtitleStreamController;\n if (SubtitleStreamControllerClass) {\n networkControllers.push(\n new SubtitleStreamControllerClass(this, fragmentTracker, keyLoader),\n );\n }\n this.createController(config.timelineController, coreComponents);\n keyLoader.emeController = this.emeController = this.createController(\n config.emeController,\n coreComponents,\n );\n this.cmcdController = this.createController(\n config.cmcdController,\n coreComponents,\n );\n this.latencyController = this.createController(\n LatencyController,\n coreComponents,\n );\n\n this.coreComponents = coreComponents;\n\n // Error controller handles errors before and after all other controllers\n // This listener will be invoked after all other controllers error listeners\n networkControllers.push(errorController);\n const onErrorOut = errorController.onErrorOut;\n if (typeof onErrorOut === 'function') {\n this.on(Events.ERROR, onErrorOut, errorController);\n }\n }\n\n createController(ControllerClass, components) {\n if (ControllerClass) {\n const controllerInstance = new ControllerClass(this);\n if (components) {\n components.push(controllerInstance);\n }\n return controllerInstance;\n }\n return null;\n }\n\n // Delegate the EventEmitter through the public API of Hls.js\n on<E extends keyof HlsListeners, Context = undefined>(\n event: E,\n listener: HlsListeners[E],\n context: Context = this as any,\n ) {\n this._emitter.on(event, listener, context);\n }\n\n once<E extends keyof HlsListeners, Context = undefined>(\n event: E,\n listener: HlsListeners[E],\n context: Context = this as any,\n ) {\n this._emitter.once(event, listener, context);\n }\n\n removeAllListeners<E extends keyof HlsListeners>(event?: E | undefined) {\n this._emitter.removeAllListeners(event);\n }\n\n off<E extends keyof HlsListeners, Context = undefined>(\n event: E,\n listener?: HlsListeners[E] | undefined,\n context: Context = this as any,\n once?: boolean | undefined,\n ) {\n this._emitter.off(event, listener, context, once);\n }\n\n listeners<E extends keyof HlsListeners>(event: E): HlsListeners[E][] {\n return this._emitter.listeners(event);\n }\n\n emit<E extends keyof HlsListeners>(\n event: E,\n name: E,\n eventObject: Parameters<HlsListeners[E]>[1],\n ): boolean {\n return this._emitter.emit(event, name, eventObject);\n }\n\n trigger<E extends keyof HlsListeners>(\n event: E,\n eventObject: Parameters<HlsListeners[E]>[1],\n ): boolean {\n if (this.config.debug) {\n return this.emit(event, event, eventObject);\n } else {\n try {\n return this.emit(event, event, eventObject);\n } catch (error) {\n logger.error(\n 'An internal error happened while handling event ' +\n event +\n '. Error message: \"' +\n error.message +\n '\". Here is a stacktrace:',\n error,\n );\n // Prevent recursion in error event handlers that throw #5497\n if (!this.triggeringException) {\n this.triggeringException = true;\n const fatal = event === Events.ERROR;\n this.trigger(Events.ERROR, {\n type: ErrorTypes.OTHER_ERROR,\n details: ErrorDetails.INTERNAL_EXCEPTION,\n fatal,\n event,\n error,\n });\n this.triggeringException = false;\n }\n }\n }\n return false;\n }\n\n listenerCount<E extends keyof HlsListeners>(event: E): number {\n return this._emitter.listenerCount(event);\n }\n\n /**\n * Dispose of the instance\n */\n destroy() {\n logger.log('destroy');\n this.trigger(Events.DESTROYING, undefined);\n this.detachMedia();\n this.removeAllListeners();\n this._autoLevelCapping = -1;\n this.url = null;\n\n this.networkControllers.forEach((component) => component.destroy());\n this.networkControllers.length = 0;\n\n this.coreComponents.forEach((component) => component.destroy());\n this.coreComponents.length = 0;\n // Remove any references that could be held in config options or callbacks\n const config = this.config;\n config.xhrSetup = config.fetchSetup = undefined;\n // @ts-ignore\n this.userConfig = null;\n }\n\n /**\n * Attaches Hls.js to a media element\n */\n attachMedia(media: HTMLMediaElement) {\n logger.log('attachMedia');\n this._media = media;\n this.trigger(Events.MEDIA_ATTACHING, { media: media });\n }\n\n /**\n * Detach Hls.js from the media\n */\n detachMedia() {\n logger.log('detachMedia');\n this.trigger(Events.MEDIA_DETACHING, undefined);\n this._media = null;\n }\n\n /**\n * Set the source URL. Can be relative or absolute.\n */\n loadSource(url: string) {\n this.stopLoad();\n const media = this.media;\n const loadedSource = this.url;\n const loadingSource = (this.url = buildAbsoluteURL(\n self.location.href,\n url,\n {\n alwaysNormalize: true,\n },\n ));\n this._autoLevelCapping = -1;\n this._maxHdcpLevel = null;\n logger.log(`loadSource:${loadingSource}`);\n if (\n media &&\n loadedSource &&\n (loadedSource !== loadingSource || this.bufferController.hasSourceTypes())\n ) {\n this.detachMedia();\n this.attachMedia(media);\n }\n // when attaching to a source URL, trigger a playlist load\n this.trigger(Events.MANIFEST_LOADING, { url: url });\n }\n\n /**\n * Start loading data from the stream source.\n * Depending on default config, client starts loading automatically when a source is set.\n *\n * @param startPosition - Set the start position to stream from.\n * Defaults to -1 (None: starts from earliest point)\n */\n startLoad(startPosition: number = -1) {\n logger.log(`startLoad(${startPosition})`);\n this.started = true;\n this.resumeBuffering();\n for (let i = 0; i < this.networkControllers.length; i++) {\n this.networkControllers[i].startLoad(startPosition);\n if (!this.started || !this.networkControllers) {\n break;\n }\n }\n }\n\n /**\n * Stop loading of any stream data.\n */\n stopLoad() {\n logger.log('stopLoad');\n this.started = false;\n for (let i = 0; i < this.networkControllers.length; i++) {\n this.networkControllers[i].stopLoad();\n if (this.started || !this.networkControllers) {\n break;\n }\n }\n }\n\n /**\n * Resumes stream controller segment loading after `pauseBuffering` has been called.\n */\n resumeBuffering() {\n logger.log(`resume buffering`);\n this.networkControllers.forEach((controller) => {\n if (controller.resumeBuffering) {\n controller.resumeBuffering();\n }\n });\n }\n\n /**\n * Prevents stream controller from loading new segments until `resumeBuffering` is called.\n * This allows for media buffering to be paused without interupting playlist loading.\n */\n pauseBuffering() {\n logger.log(`pause buffering`);\n this.networkControllers.forEach((controller) => {\n if (controller.pauseBuffering) {\n controller.pauseBuffering();\n }\n });\n }\n\n /**\n * Swap through possible audio codecs in the stream (for example to switch from stereo to 5.1)\n */\n swapAudioCodec() {\n logger.log('swapAudioCodec');\n this.streamController.swapAudioCodec();\n }\n\n /**\n * When the media-element fails, this allows to detach and then re-attach it\n * as one call (convenience method).\n *\n * Automatic recovery of media-errors by this process is configurable.\n */\n recoverMediaError() {\n logger.log('recoverMediaError');\n const media = this._media;\n this.detachMedia();\n if (media) {\n this.attachMedia(media);\n }\n }\n\n removeLevel(levelIndex: number) {\n this.levelController.removeLevel(levelIndex);\n }\n\n /**\n * @returns an array of levels (variants) sorted by HDCP-LEVEL, RESOLUTION (height), FRAME-RATE, CODECS, VIDEO-RANGE, and BANDWIDTH\n */\n get levels(): Level[] {\n const levels = this.levelController.levels;\n return levels ? levels : [];\n }\n\n /**\n * Index of quality level (variant) currently played\n */\n get currentLevel(): number {\n return this.streamController.currentLevel;\n }\n\n /**\n * Set quality level index immediately. This will flush the current buffer to replace the quality asap. That means playback will interrupt at least shortly to re-buffer and re-sync eventually. Set to -1 for automatic level selection.\n */\n set currentLevel(newLevel: number) {\n logger.log(`set currentLevel:${newLevel}`);\n this.levelController.manualLevel = newLevel;\n this.streamController.immediateLevelSwitch();\n }\n\n /**\n * Index of next quality level loaded as scheduled by stream controller.\n */\n get nextLevel(): number {\n return this.streamController.nextLevel;\n }\n\n /**\n * Set quality level index for next loaded data.\n * This will switch the video quality asap, without interrupting playback.\n * May abort current loading of data, and flush parts of buffer (outside currently played fragment region).\n * @param newLevel - Pass -1 for automatic level selection\n */\n set nextLevel(newLevel: number) {\n logger.log(`set nextLevel:${newLevel}`);\n this.levelController.manualLevel = newLevel;\n this.streamController.nextLevelSwitch();\n }\n\n /**\n * Return the quality level of the currently or last (of none is loaded currently) segment\n */\n get loadLevel(): number {\n return this.levelController.level;\n }\n\n /**\n * Set quality level index for next loaded data in a conservative way.\n * This will switch the quality without flushing, but interrupt current loading.\n * Thus the moment when the quality switch will appear in effect will only be after the already existing buffer.\n * @param newLevel - Pass -1 for automatic level selection\n */\n set loadLevel(newLevel: number) {\n logger.log(`set loadLevel:${newLevel}`);\n this.levelController.manualLevel = newLevel;\n }\n\n /**\n * get next quality level loaded\n */\n get nextLoadLevel(): number {\n return this.levelController.nextLoadLevel;\n }\n\n /**\n * Set quality level of next loaded segment in a fully \"non-destructive\" way.\n * Same as `loadLevel` but will wait for next switch (until current loading is done).\n */\n set nextLoadLevel(level: number) {\n this.levelController.nextLoadLevel = level;\n }\n\n /**\n * Return \"first level\": like a default level, if not set,\n * falls back to index of first level referenced in manifest\n */\n get firstLevel(): number {\n return Math.max(this.levelController.firstLevel, this.minAutoLevel);\n }\n\n /**\n * Sets \"first-level\", see getter.\n */\n set firstLevel(newLevel: number) {\n logger.log(`set firstLevel:${newLevel}`);\n this.levelController.firstLevel = newLevel;\n }\n\n /**\n * Return the desired start level for the first fragment that will be loaded.\n * The default value of -1 indicates automatic start level selection.\n * Setting hls.nextAutoLevel without setting a startLevel will result in\n * the nextAutoLevel value being used for one fragment load.\n */\n get startLevel(): number {\n const startLevel = this.levelController.startLevel;\n if (startLevel === -1 && this.abrController.forcedAutoLevel > -1) {\n return this.abrController.forcedAutoLevel;\n }\n return startLevel;\n }\n\n /**\n * set start level (level of first fragment that will be played back)\n * if not overrided by user, first level appearing in manifest will be used as start level\n * if -1 : automatic start level selection, playback will start from level matching download bandwidth\n * (determined from download of first segment)\n */\n set startLevel(newLevel: number) {\n logger.log(`set startLevel:${newLevel}`);\n // if not in automatic start level detection, ensure startLevel is greater than minAutoLevel\n if (newLevel !== -1) {\n newLevel = Math.max(newLevel, this.minAutoLevel);\n }\n\n this.levelController.startLevel = newLevel;\n }\n\n /**\n * Whether level capping is enabled.\n * Default value is set via `config.capLevelToPlayerSize`.\n */\n get capLevelToPlayerSize(): boolean {\n return this.config.capLevelToPlayerSize;\n }\n\n /**\n * Enables or disables level capping. If disabled after previously enabled, `nextLevelSwitch` will be immediately called.\n */\n set capLevelToPlayerSize(shouldStartCapping: boolean) {\n const newCapLevelToPlayerSize = !!shouldStartCapping;\n\n if (newCapLevelToPlayerSize !== this.config.capLevelToPlayerSize) {\n if (newCapLevelToPlayerSize) {\n this.capLevelController.startCapping(); // If capping occurs, nextLevelSwitch will happen based on size.\n } else {\n this.capLevelController.stopCapping();\n this.autoLevelCapping = -1;\n this.streamController.nextLevelSwitch(); // Now we're uncapped, get the next level asap.\n }\n\n this.config.capLevelToPlayerSize = newCapLevelToPlayerSize;\n }\n }\n\n /**\n * Capping/max level value that should be used by automatic level selection algorithm (`ABRController`)\n */\n get autoLevelCapping(): number {\n return this._autoLevelCapping;\n }\n\n /**\n * Returns the current bandwidth estimate in bits per second, when available. Otherwise, `NaN` is returned.\n */\n get bandwidthEstimate(): number {\n const { bwEstimator } = this.abrController;\n if (!bwEstimator) {\n return NaN;\n }\n return bwEstimator.getEstimate();\n }\n\n set bandwidthEstimate(abrEwmaDefaultEstimate: number) {\n this.abrController.resetEstimator(abrEwmaDefaultEstimate);\n }\n\n /**\n * get time to first byte estimate\n * @type {number}\n */\n get ttfbEstimate(): number {\n const { bwEstimator } = this.abrController;\n if (!bwEstimator) {\n return NaN;\n }\n return bwEstimator.getEstimateTTFB();\n }\n\n /**\n * Capping/max level value that should be used by automatic level selection algorithm (`ABRController`)\n */\n set autoLevelCapping(newLevel: number) {\n if (this._autoLevelCapping !== newLevel) {\n logger.log(`set autoLevelCapping:${newLevel}`);\n this._autoLevelCapping = newLevel;\n this.levelController.checkMaxAutoUpdated();\n }\n }\n\n get maxHdcpLevel(): HdcpLevel {\n return this._maxHdcpLevel;\n }\n\n set maxHdcpLevel(value: HdcpLevel) {\n if (isHdcpLevel(value) && this._maxHdcpLevel !== value) {\n this._maxHdcpLevel = value;\n this.levelController.checkMaxAutoUpdated();\n }\n }\n\n /**\n * True when automatic level selection enabled\n */\n get autoLevelEnabled(): boolean {\n return this.levelController.manualLevel === -1;\n }\n\n /**\n * Level set manually (if any)\n */\n get manualLevel(): number {\n return this.levelController.manualLevel;\n }\n\n /**\n * min level selectable in auto mode according to config.minAutoBitrate\n */\n get minAutoLevel(): number {\n const {\n levels,\n config: { minAutoBitrate },\n } = this;\n if (!levels) return 0;\n\n const len = levels.length;\n for (let i = 0; i < len; i++) {\n if (levels[i].maxBitrate >= minAutoBitrate) {\n return i;\n }\n }\n\n return 0;\n }\n\n /**\n * max level selectable in auto mode according to autoLevelCapping\n */\n get maxAutoLevel(): number {\n const { levels, autoLevelCapping, maxHdcpLevel } = this;\n\n let maxAutoLevel;\n if (autoLevelCapping === -1 && levels?.length) {\n maxAutoLevel = levels.length - 1;\n } else {\n maxAutoLevel = autoLevelCapping;\n }\n\n if (maxHdcpLevel) {\n for (let i = maxAutoLevel; i--; ) {\n const hdcpLevel = levels[i].attrs['HDCP-LEVEL'];\n if (hdcpLevel && hdcpLevel <= maxHdcpLevel) {\n return i;\n }\n }\n }\n\n return maxAutoLevel;\n }\n\n get firstAutoLevel(): number {\n return this.abrController.firstAutoLevel;\n }\n\n /**\n * next automatically selected quality level\n */\n get nextAutoLevel(): number {\n return this.abrController.nextAutoLevel;\n }\n\n /**\n * this setter is used to force next auto level.\n * this is useful to force a switch down in auto mode:\n * in case of load error on level N, hls.js can set nextAutoLevel to N-1 for example)\n * forced value is valid for one fragment. upon successful frag loading at forced level,\n * this value will be resetted to -1 by ABR controller.\n */\n set nextAutoLevel(nextLevel: number) {\n this.abrController.nextAutoLevel = nextLevel;\n }\n\n /**\n * get the datetime value relative to media.currentTime for the active level Program Date Time if present\n */\n public get playingDate(): Date | null {\n return this.streamController.currentProgramDateTime;\n }\n\n public get mainForwardBufferInfo(): BufferInfo | null {\n return this.streamController.getMainFwdBufferInfo();\n }\n\n /**\n * Find and select the best matching audio track, making a level switch when a Group change is necessary.\n * Updates `hls.config.audioPreference`. Returns the selected track, or null when no matching track is found.\n */\n public setAudioOption(\n audioOption: MediaPlaylist | AudioSelectionOption | undefined,\n ): MediaPlaylist | null {\n return this.audioTrackController?.setAudioOption(audioOption);\n }\n /**\n * Find and select the best matching subtitle track, making a level switch when a Group change is necessary.\n * Updates `hls.config.subtitlePreference`. Returns the selected track, or null when no matching track is found.\n */\n public setSubtitleOption(\n subtitleOption: MediaPlaylist | SubtitleSelectionOption | undefined,\n ): MediaPlaylist | null {\n this.subtitleTrackController?.setSubtitleOption(subtitleOption);\n return null;\n }\n\n /**\n * Get the complete list of audio tracks across all media groups\n */\n get allAudioTracks(): Array<MediaPlaylist> {\n const audioTrackController = this.audioTrackController;\n return audioTrackController ? audioTrackController.allAudioTracks : [];\n }\n\n /**\n * Get the list of selectable audio tracks\n */\n get audioTracks(): Array<MediaPlaylist> {\n const audioTrackController = this.audioTrackController;\n return audioTrackController ? audioTrackController.audioTracks : [];\n }\n\n /**\n * index of the selected audio track (index in audio track lists)\n */\n get audioTrack(): number {\n const audioTrackController = this.audioTrackController;\n return audioTrackController ? audioTrackController.audioTrack : -1;\n }\n\n /**\n * selects an audio track, based on its index in audio track lists\n */\n set audioTrack(audioTrackId: number) {\n const audioTrackController = this.audioTrackController;\n if (audioTrackController) {\n audioTrackController.audioTrack = audioTrackId;\n }\n }\n\n /**\n * get the complete list of subtitle tracks across all media groups\n */\n get allSubtitleTracks(): Array<MediaPlaylist> {\n const subtitleTrackController = this.subtitleTrackController;\n return subtitleTrackController\n ? subtitleTrackController.allSubtitleTracks\n : [];\n }\n\n /**\n * get alternate subtitle tracks list from playlist\n */\n get subtitleTracks(): Array<MediaPlaylist> {\n const subtitleTrackController = this.subtitleTrackController;\n return subtitleTrackController\n ? subtitleTrackController.subtitleTracks\n : [];\n }\n\n /**\n * index of the selected subtitle track (index in subtitle track lists)\n */\n get subtitleTrack(): number {\n const subtitleTrackController = this.subtitleTrackController;\n return subtitleTrackController ? subtitleTrackController.subtitleTrack : -1;\n }\n\n get media() {\n return this._media;\n }\n\n /**\n * select an subtitle track, based on its index in subtitle track lists\n */\n set subtitleTrack(subtitleTrackId: number) {\n const subtitleTrackController = this.subtitleTrackController;\n if (subtitleTrackController) {\n subtitleTrackController.subtitleTrack = subtitleTrackId;\n }\n }\n\n /**\n * Whether subtitle display is enabled or not\n */\n get subtitleDisplay(): boolean {\n const subtitleTrackController = this.subtitleTrackController;\n return subtitleTrackController\n ? subtitleTrackController.subtitleDisplay\n : false;\n }\n\n /**\n * Enable/disable subtitle display rendering\n */\n set subtitleDisplay(value: boolean) {\n const subtitleTrackController = this.subtitleTrackController;\n if (subtitleTrackController) {\n subtitleTrackController.subtitleDisplay = value;\n }\n }\n\n /**\n * get mode for Low-Latency HLS loading\n */\n get lowLatencyMode(): boolean {\n return this.config.lowLatencyMode;\n }\n\n /**\n * Enable/disable Low-Latency HLS part playlist and segment loading, and start live streams at playlist PART-HOLD-BACK rather than HOLD-BACK.\n */\n set lowLatencyMode(mode: boolean) {\n this.config.lowLatencyMode = mode;\n }\n\n /**\n * Position (in seconds) of live sync point (ie edge of live position minus safety delay defined by ```hls.config.liveSyncDuration```)\n * @returns null prior to loading live Playlist\n */\n get liveSyncPosition(): number | null {\n return this.latencyController.liveSyncPosition;\n }\n\n /**\n * Estimated position (in seconds) of live edge (ie edge of live playlist plus time sync playlist advanced)\n * @returns 0 before first playlist is loaded\n */\n get latency(): number {\n return this.latencyController.latency;\n }\n\n /**\n * maximum distance from the edge before the player seeks forward to ```hls.liveSyncPosition```\n * configured using ```liveMaxLatencyDurationCount``` (multiple of target duration) or ```liveMaxLatencyDuration```\n * @returns 0 before first playlist is loaded\n */\n get maxLatency(): number {\n return this.latencyController.maxLatency;\n }\n\n /**\n * target distance from the edge as calculated by the latency controller\n */\n get targetLatency(): number | null {\n return this.latencyController.targetLatency;\n }\n\n /**\n * the rate at which the edge of the current live playlist is advancing or 1 if there is none\n */\n get drift(): number | null {\n return this.latencyController.drift;\n }\n\n /**\n * set to true when startLoad is called before MANIFEST_PARSED event\n */\n get forceStartLoad(): boolean {\n return this.streamController.forceStartLoad;\n }\n}\n\nexport type {\n AudioSelectionOption,\n SubtitleSelectionOption,\n VideoSelectionOption,\n MediaPlaylist,\n ErrorDetails,\n ErrorTypes,\n Events,\n Level,\n HlsListeners,\n HlsEventEmitter,\n HlsConfig,\n BufferInfo,\n HdcpLevel,\n AbrController,\n AudioStreamController,\n AudioTrackController,\n BasePlaylistController,\n BaseStreamController,\n BufferController,\n CapLevelController,\n CMCDController,\n ContentSteeringController,\n EMEController,\n ErrorController,\n FPSController,\n SubtitleTrackController,\n};\nexport type {\n ComponentAPI,\n AbrComponentAPI,\n NetworkComponentAPI,\n} from './types/component-api';\nexport type {\n ABRControllerConfig,\n BufferControllerConfig,\n CapLevelControllerConfig,\n CMCDControllerConfig,\n EMEControllerConfig,\n DRMSystemsConfiguration,\n DRMSystemOptions,\n FPSControllerConfig,\n FragmentLoaderConfig,\n FragmentLoaderConstructor,\n HlsLoadPolicies,\n LevelControllerConfig,\n LoaderConfig,\n LoadPolicy,\n MP4RemuxerConfig,\n PlaylistLoaderConfig,\n PlaylistLoaderConstructor,\n RetryConfig,\n SelectionPreferences,\n StreamControllerConfig,\n LatencyControllerConfig,\n MetadataControllerConfig,\n TimelineControllerConfig,\n TSDemuxerConfig,\n} from './config';\nexport type { MediaKeySessionContext } from './controller/eme-controller';\nexport type { ILogger } from './utils/logger';\nexport type {\n PathwayClone,\n SteeringManifest,\n UriReplacement,\n} from './controller/content-steering-controller';\nexport type { SubtitleStreamController } from './controller/subtitle-stream-controller';\nexport type { TimelineController } from './controller/timeline-controller';\nexport type { CuesInterface } from './utils/cues';\nexport type {\n MediaKeyFunc,\n KeySystems,\n KeySystemFormats,\n} from './utils/mediakeys-helper';\nexport type { DateRange } from './loader/date-range';\nexport type { LoadStats } from './loader/load-stats';\nexport type { LevelKey } from './loader/level-key';\nexport type { LevelDetails } from './loader/level-details';\nexport type { SourceBufferName } from './types/buffer';\nexport type {\n MetadataSample,\n MetadataSchema,\n UserdataSample,\n} from './types/demuxer';\nexport type {\n HlsSkip,\n HlsUrlParameters,\n LevelAttributes,\n LevelParsed,\n VariableMap,\n} from './types/level';\nexport type { MediaDecodingInfo } from './utils/mediacapabilities-helper';\nexport type {\n PlaylistLevelType,\n HlsChunkPerformanceTiming,\n HlsPerformanceTiming,\n HlsProgressivePerformanceTiming,\n PlaylistContextType,\n PlaylistLoaderContext,\n FragmentLoaderContext,\n Loader,\n LoaderStats,\n LoaderContext,\n LoaderResponse,\n LoaderConfiguration,\n LoaderCallbacks,\n LoaderOnProgress,\n LoaderOnAbort,\n LoaderOnError,\n LoaderOnSuccess,\n LoaderOnTimeout,\n} from './types/loader';\nexport type {\n MediaAttributes,\n MediaPlaylistType,\n MainPlaylistType,\n AudioPlaylistType,\n SubtitlePlaylistType,\n} from './types/media-playlist';\nexport type { Track, TrackSet } from './types/track';\nexport type { ChunkMetadata } from './types/transmuxer';\nexport type {\n BaseSegment,\n Fragment,\n Part,\n ElementaryStreams,\n ElementaryStreamTypes,\n ElementaryStreamInfo,\n} from './loader/fragment';\nexport type {\n TrackLoadingData,\n TrackLoadedData,\n AudioTrackLoadedData,\n AudioTracksUpdatedData,\n AudioTrackSwitchedData,\n AudioTrackSwitchingData,\n BackBufferData,\n BufferAppendedData,\n BufferAppendingData,\n BufferCodecsData,\n BufferCreatedData,\n BufferEOSData,\n BufferFlushedData,\n BufferFlushingData,\n CuesParsedData,\n ErrorData,\n FPSDropData,\n FPSDropLevelCappingData,\n FragBufferedData,\n FragChangedData,\n FragDecryptedData,\n FragLoadedData,\n FragLoadEmergencyAbortedData,\n FragLoadingData,\n FragParsedData,\n FragParsingInitSegmentData,\n FragParsingMetadataData,\n FragParsingUserdataData,\n InitPTSFoundData,\n KeyLoadedData,\n KeyLoadingData,\n LevelLoadedData,\n LevelLoadingData,\n LevelPTSUpdatedData,\n LevelsUpdatedData,\n LevelSwitchedData,\n LevelSwitchingData,\n LevelUpdatedData,\n LiveBackBufferData,\n ContentSteeringOptions,\n ManifestLoadedData,\n ManifestLoadingData,\n ManifestParsedData,\n MediaAttachedData,\n MediaAttachingData,\n NonNativeTextTrack,\n NonNativeTextTracksData,\n SteeringManifestLoadedData,\n SubtitleFragProcessedData,\n SubtitleTrackLoadedData,\n SubtitleTracksUpdatedData,\n SubtitleTrackSwitchData,\n} from './types/events';\nexport type {\n NetworkErrorAction,\n ErrorActionFlags,\n IErrorAction,\n} from './controller/error-controller';\nexport type { AttrList } from './utils/attr-list';\n","'use strict';\n\nvar utils = require('../utils');\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n Error.call(this);\n this.message = message;\n this.name = 'AxiosError';\n code && (this.code = code);\n config && (this.config = config);\n request && (this.request = request);\n response && (this.response = response);\n}\n\nutils.inherits(AxiosError, Error, {\n toJSON: function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: this.config,\n code: this.code,\n status: this.response && this.response.status ? this.response.status : null\n };\n }\n});\n\nvar prototype = AxiosError.prototype;\nvar descriptors = {};\n\n[\n 'ERR_BAD_OPTION_VALUE',\n 'ERR_BAD_OPTION',\n 'ECONNABORTED',\n 'ETIMEDOUT',\n 'ERR_NETWORK',\n 'ERR_FR_TOO_MANY_REDIRECTS',\n 'ERR_DEPRECATED',\n 'ERR_BAD_RESPONSE',\n 'ERR_BAD_REQUEST',\n 'ERR_CANCELED'\n// eslint-disable-next-line func-names\n].forEach(function(code) {\n descriptors[code] = {value: code};\n});\n\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype, 'isAxiosError', {value: true});\n\n// eslint-disable-next-line func-names\nAxiosError.from = function(error, code, config, request, response, customProps) {\n var axiosError = Object.create(prototype);\n\n utils.toFlatObject(error, axiosError, function filter(obj) {\n return obj !== Error.prototype;\n });\n\n AxiosError.call(axiosError, error.message, code, config, request, response);\n\n axiosError.name = error.name;\n\n customProps && Object.assign(axiosError, customProps);\n\n return axiosError;\n};\n\nmodule.exports = AxiosError;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-is.production.min.js');\n} else {\n module.exports = require('./cjs/react-is.development.js');\n}\n","/**\n * @license React\n * react-dom.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/*\n Modernizr 3.0.0pre (Custom Build) | MIT\n*/\n'use strict';var aa=require(\"react\"),ca=require(\"scheduler\");function p(a){for(var b=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,c=1;c<arguments.length;c++)b+=\"&args[]=\"+encodeURIComponent(arguments[c]);return\"Minified React error #\"+a+\"; visit \"+b+\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"}var da=new Set,ea={};function fa(a,b){ha(a,b);ha(a+\"Capture\",b)}\nfunction ha(a,b){ea[a]=b;for(a=0;a<b.length;a++)da.add(b[a])}\nvar ia=!(\"undefined\"===typeof window||\"undefined\"===typeof window.document||\"undefined\"===typeof window.document.createElement),ja=Object.prototype.hasOwnProperty,ka=/^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$/,la=\n{},ma={};function oa(a){if(ja.call(ma,a))return!0;if(ja.call(la,a))return!1;if(ka.test(a))return ma[a]=!0;la[a]=!0;return!1}function pa(a,b,c,d){if(null!==c&&0===c.type)return!1;switch(typeof b){case \"function\":case \"symbol\":return!0;case \"boolean\":if(d)return!1;if(null!==c)return!c.acceptsBooleans;a=a.toLowerCase().slice(0,5);return\"data-\"!==a&&\"aria-\"!==a;default:return!1}}\nfunction qa(a,b,c,d){if(null===b||\"undefined\"===typeof b||pa(a,b,c,d))return!0;if(d)return!1;if(null!==c)switch(c.type){case 3:return!b;case 4:return!1===b;case 5:return isNaN(b);case 6:return isNaN(b)||1>b}return!1}function v(a,b,c,d,e,f,g){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL=f;this.removeEmptyString=g}var z={};\n\"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style\".split(\" \").forEach(function(a){z[a]=new v(a,0,!1,a,null,!1,!1)});[[\"acceptCharset\",\"accept-charset\"],[\"className\",\"class\"],[\"htmlFor\",\"for\"],[\"httpEquiv\",\"http-equiv\"]].forEach(function(a){var b=a[0];z[b]=new v(b,1,!1,a[1],null,!1,!1)});[\"contentEditable\",\"draggable\",\"spellCheck\",\"value\"].forEach(function(a){z[a]=new v(a,2,!1,a.toLowerCase(),null,!1,!1)});\n[\"autoReverse\",\"externalResourcesRequired\",\"focusable\",\"preserveAlpha\"].forEach(function(a){z[a]=new v(a,2,!1,a,null,!1,!1)});\"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope\".split(\" \").forEach(function(a){z[a]=new v(a,3,!1,a.toLowerCase(),null,!1,!1)});\n[\"checked\",\"multiple\",\"muted\",\"selected\"].forEach(function(a){z[a]=new v(a,3,!0,a,null,!1,!1)});[\"capture\",\"download\"].forEach(function(a){z[a]=new v(a,4,!1,a,null,!1,!1)});[\"cols\",\"rows\",\"size\",\"span\"].forEach(function(a){z[a]=new v(a,6,!1,a,null,!1,!1)});[\"rowSpan\",\"start\"].forEach(function(a){z[a]=new v(a,5,!1,a.toLowerCase(),null,!1,!1)});var ra=/[\\-:]([a-z])/g;function sa(a){return a[1].toUpperCase()}\n\"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height\".split(\" \").forEach(function(a){var b=a.replace(ra,\nsa);z[b]=new v(b,1,!1,a,null,!1,!1)});\"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type\".split(\" \").forEach(function(a){var b=a.replace(ra,sa);z[b]=new v(b,1,!1,a,\"http://www.w3.org/1999/xlink\",!1,!1)});[\"xml:base\",\"xml:lang\",\"xml:space\"].forEach(function(a){var b=a.replace(ra,sa);z[b]=new v(b,1,!1,a,\"http://www.w3.org/XML/1998/namespace\",!1,!1)});[\"tabIndex\",\"crossOrigin\"].forEach(function(a){z[a]=new v(a,1,!1,a.toLowerCase(),null,!1,!1)});\nz.xlinkHref=new v(\"xlinkHref\",1,!1,\"xlink:href\",\"http://www.w3.org/1999/xlink\",!0,!1);[\"src\",\"href\",\"action\",\"formAction\"].forEach(function(a){z[a]=new v(a,1,!1,a.toLowerCase(),null,!0,!0)});\nfunction ta(a,b,c,d){var e=z.hasOwnProperty(b)?z[b]:null;if(null!==e?0!==e.type:d||!(2<b.length)||\"o\"!==b[0]&&\"O\"!==b[0]||\"n\"!==b[1]&&\"N\"!==b[1])qa(b,c,e,d)&&(c=null),d||null===e?oa(b)&&(null===c?a.removeAttribute(b):a.setAttribute(b,\"\"+c)):e.mustUseProperty?a[e.propertyName]=null===c?3===e.type?!1:\"\":c:(b=e.attributeName,d=e.attributeNamespace,null===c?a.removeAttribute(b):(e=e.type,c=3===e||4===e&&!0===c?\"\":\"\"+c,d?a.setAttributeNS(d,b,c):a.setAttribute(b,c)))}\nvar ua=aa.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,va=Symbol.for(\"react.element\"),wa=Symbol.for(\"react.portal\"),ya=Symbol.for(\"react.fragment\"),za=Symbol.for(\"react.strict_mode\"),Aa=Symbol.for(\"react.profiler\"),Ba=Symbol.for(\"react.provider\"),Ca=Symbol.for(\"react.context\"),Da=Symbol.for(\"react.forward_ref\"),Ea=Symbol.for(\"react.suspense\"),Fa=Symbol.for(\"react.suspense_list\"),Ga=Symbol.for(\"react.memo\"),Ha=Symbol.for(\"react.lazy\");Symbol.for(\"react.scope\");Symbol.for(\"react.debug_trace_mode\");\nvar Ia=Symbol.for(\"react.offscreen\");Symbol.for(\"react.legacy_hidden\");Symbol.for(\"react.cache\");Symbol.for(\"react.tracing_marker\");var Ja=Symbol.iterator;function Ka(a){if(null===a||\"object\"!==typeof a)return null;a=Ja&&a[Ja]||a[\"@@iterator\"];return\"function\"===typeof a?a:null}var A=Object.assign,La;function Ma(a){if(void 0===La)try{throw Error();}catch(c){var b=c.stack.trim().match(/\\n( *(at )?)/);La=b&&b[1]||\"\"}return\"\\n\"+La+a}var Na=!1;\nfunction Oa(a,b){if(!a||Na)return\"\";Na=!0;var c=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(b)if(b=function(){throw Error();},Object.defineProperty(b.prototype,\"props\",{set:function(){throw Error();}}),\"object\"===typeof Reflect&&Reflect.construct){try{Reflect.construct(b,[])}catch(l){var d=l}Reflect.construct(a,[],b)}else{try{b.call()}catch(l){d=l}a.call(b.prototype)}else{try{throw Error();}catch(l){d=l}a()}}catch(l){if(l&&d&&\"string\"===typeof l.stack){for(var e=l.stack.split(\"\\n\"),\nf=d.stack.split(\"\\n\"),g=e.length-1,h=f.length-1;1<=g&&0<=h&&e[g]!==f[h];)h--;for(;1<=g&&0<=h;g--,h--)if(e[g]!==f[h]){if(1!==g||1!==h){do if(g--,h--,0>h||e[g]!==f[h]){var k=\"\\n\"+e[g].replace(\" at new \",\" at \");a.displayName&&k.includes(\"<anonymous>\")&&(k=k.replace(\"<anonymous>\",a.displayName));return k}while(1<=g&&0<=h)}break}}}finally{Na=!1,Error.prepareStackTrace=c}return(a=a?a.displayName||a.name:\"\")?Ma(a):\"\"}\nfunction Pa(a){switch(a.tag){case 5:return Ma(a.type);case 16:return Ma(\"Lazy\");case 13:return Ma(\"Suspense\");case 19:return Ma(\"SuspenseList\");case 0:case 2:case 15:return a=Oa(a.type,!1),a;case 11:return a=Oa(a.type.render,!1),a;case 1:return a=Oa(a.type,!0),a;default:return\"\"}}\nfunction Qa(a){if(null==a)return null;if(\"function\"===typeof a)return a.displayName||a.name||null;if(\"string\"===typeof a)return a;switch(a){case ya:return\"Fragment\";case wa:return\"Portal\";case Aa:return\"Profiler\";case za:return\"StrictMode\";case Ea:return\"Suspense\";case Fa:return\"SuspenseList\"}if(\"object\"===typeof a)switch(a.$$typeof){case Ca:return(a.displayName||\"Context\")+\".Consumer\";case Ba:return(a._context.displayName||\"Context\")+\".Provider\";case Da:var b=a.render;a=a.displayName;a||(a=b.displayName||\nb.name||\"\",a=\"\"!==a?\"ForwardRef(\"+a+\")\":\"ForwardRef\");return a;case Ga:return b=a.displayName||null,null!==b?b:Qa(a.type)||\"Memo\";case Ha:b=a._payload;a=a._init;try{return Qa(a(b))}catch(c){}}return null}\nfunction Ra(a){var b=a.type;switch(a.tag){case 24:return\"Cache\";case 9:return(b.displayName||\"Context\")+\".Consumer\";case 10:return(b._context.displayName||\"Context\")+\".Provider\";case 18:return\"DehydratedFragment\";case 11:return a=b.render,a=a.displayName||a.name||\"\",b.displayName||(\"\"!==a?\"ForwardRef(\"+a+\")\":\"ForwardRef\");case 7:return\"Fragment\";case 5:return b;case 4:return\"Portal\";case 3:return\"Root\";case 6:return\"Text\";case 16:return Qa(b);case 8:return b===za?\"StrictMode\":\"Mode\";case 22:return\"Offscreen\";\ncase 12:return\"Profiler\";case 21:return\"Scope\";case 13:return\"Suspense\";case 19:return\"SuspenseList\";case 25:return\"TracingMarker\";case 1:case 0:case 17:case 2:case 14:case 15:if(\"function\"===typeof b)return b.displayName||b.name||null;if(\"string\"===typeof b)return b}return null}function Sa(a){switch(typeof a){case \"boolean\":case \"number\":case \"string\":case \"undefined\":return a;case \"object\":return a;default:return\"\"}}\nfunction Ta(a){var b=a.type;return(a=a.nodeName)&&\"input\"===a.toLowerCase()&&(\"checkbox\"===b||\"radio\"===b)}\nfunction Ua(a){var b=Ta(a)?\"checked\":\"value\",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=\"\"+a[b];if(!a.hasOwnProperty(b)&&\"undefined\"!==typeof c&&\"function\"===typeof c.get&&\"function\"===typeof c.set){var e=c.get,f=c.set;Object.defineProperty(a,b,{configurable:!0,get:function(){return e.call(this)},set:function(a){d=\"\"+a;f.call(this,a)}});Object.defineProperty(a,b,{enumerable:c.enumerable});return{getValue:function(){return d},setValue:function(a){d=\"\"+a},stopTracking:function(){a._valueTracker=\nnull;delete a[b]}}}}function Va(a){a._valueTracker||(a._valueTracker=Ua(a))}function Wa(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d=\"\";a&&(d=Ta(a)?a.checked?\"true\":\"false\":a.value);a=d;return a!==c?(b.setValue(a),!0):!1}function Xa(a){a=a||(\"undefined\"!==typeof document?document:void 0);if(\"undefined\"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}\nfunction Ya(a,b){var c=b.checked;return A({},b,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=c?c:a._wrapperState.initialChecked})}function Za(a,b){var c=null==b.defaultValue?\"\":b.defaultValue,d=null!=b.checked?b.checked:b.defaultChecked;c=Sa(null!=b.value?b.value:c);a._wrapperState={initialChecked:d,initialValue:c,controlled:\"checkbox\"===b.type||\"radio\"===b.type?null!=b.checked:null!=b.value}}function ab(a,b){b=b.checked;null!=b&&ta(a,\"checked\",b,!1)}\nfunction bb(a,b){ab(a,b);var c=Sa(b.value),d=b.type;if(null!=c)if(\"number\"===d){if(0===c&&\"\"===a.value||a.value!=c)a.value=\"\"+c}else a.value!==\"\"+c&&(a.value=\"\"+c);else if(\"submit\"===d||\"reset\"===d){a.removeAttribute(\"value\");return}b.hasOwnProperty(\"value\")?cb(a,b.type,c):b.hasOwnProperty(\"defaultValue\")&&cb(a,b.type,Sa(b.defaultValue));null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)}\nfunction db(a,b,c){if(b.hasOwnProperty(\"value\")||b.hasOwnProperty(\"defaultValue\")){var d=b.type;if(!(\"submit\"!==d&&\"reset\"!==d||void 0!==b.value&&null!==b.value))return;b=\"\"+a._wrapperState.initialValue;c||b===a.value||(a.value=b);a.defaultValue=b}c=a.name;\"\"!==c&&(a.name=\"\");a.defaultChecked=!!a._wrapperState.initialChecked;\"\"!==c&&(a.name=c)}\nfunction cb(a,b,c){if(\"number\"!==b||Xa(a.ownerDocument)!==a)null==c?a.defaultValue=\"\"+a._wrapperState.initialValue:a.defaultValue!==\"\"+c&&(a.defaultValue=\"\"+c)}var eb=Array.isArray;\nfunction fb(a,b,c,d){a=a.options;if(b){b={};for(var e=0;e<c.length;e++)b[\"$\"+c[e]]=!0;for(c=0;c<a.length;c++)e=b.hasOwnProperty(\"$\"+a[c].value),a[c].selected!==e&&(a[c].selected=e),e&&d&&(a[c].defaultSelected=!0)}else{c=\"\"+Sa(c);b=null;for(e=0;e<a.length;e++){if(a[e].value===c){a[e].selected=!0;d&&(a[e].defaultSelected=!0);return}null!==b||a[e].disabled||(b=a[e])}null!==b&&(b.selected=!0)}}\nfunction gb(a,b){if(null!=b.dangerouslySetInnerHTML)throw Error(p(91));return A({},b,{value:void 0,defaultValue:void 0,children:\"\"+a._wrapperState.initialValue})}function hb(a,b){var c=b.value;if(null==c){c=b.children;b=b.defaultValue;if(null!=c){if(null!=b)throw Error(p(92));if(eb(c)){if(1<c.length)throw Error(p(93));c=c[0]}b=c}null==b&&(b=\"\");c=b}a._wrapperState={initialValue:Sa(c)}}\nfunction ib(a,b){var c=Sa(b.value),d=Sa(b.defaultValue);null!=c&&(c=\"\"+c,c!==a.value&&(a.value=c),null==b.defaultValue&&a.defaultValue!==c&&(a.defaultValue=c));null!=d&&(a.defaultValue=\"\"+d)}function jb(a){var b=a.textContent;b===a._wrapperState.initialValue&&\"\"!==b&&null!==b&&(a.value=b)}function kb(a){switch(a){case \"svg\":return\"http://www.w3.org/2000/svg\";case \"math\":return\"http://www.w3.org/1998/Math/MathML\";default:return\"http://www.w3.org/1999/xhtml\"}}\nfunction lb(a,b){return null==a||\"http://www.w3.org/1999/xhtml\"===a?kb(b):\"http://www.w3.org/2000/svg\"===a&&\"foreignObject\"===b?\"http://www.w3.org/1999/xhtml\":a}\nvar mb,nb=function(a){return\"undefined\"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(b,c,d,e){MSApp.execUnsafeLocalFunction(function(){return a(b,c,d,e)})}:a}(function(a,b){if(\"http://www.w3.org/2000/svg\"!==a.namespaceURI||\"innerHTML\"in a)a.innerHTML=b;else{mb=mb||document.createElement(\"div\");mb.innerHTML=\"<svg>\"+b.valueOf().toString()+\"</svg>\";for(b=mb.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}});\nfunction ob(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b}\nvar pb={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,\nzoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},qb=[\"Webkit\",\"ms\",\"Moz\",\"O\"];Object.keys(pb).forEach(function(a){qb.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);pb[b]=pb[a]})});function rb(a,b,c){return null==b||\"boolean\"===typeof b||\"\"===b?\"\":c||\"number\"!==typeof b||0===b||pb.hasOwnProperty(a)&&pb[a]?(\"\"+b).trim():b+\"px\"}\nfunction sb(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf(\"--\"),e=rb(c,b[c],d);\"float\"===c&&(c=\"cssFloat\");d?a.setProperty(c,e):a[c]=e}}var tb=A({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});\nfunction ub(a,b){if(b){if(tb[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML))throw Error(p(137,a));if(null!=b.dangerouslySetInnerHTML){if(null!=b.children)throw Error(p(60));if(\"object\"!==typeof b.dangerouslySetInnerHTML||!(\"__html\"in b.dangerouslySetInnerHTML))throw Error(p(61));}if(null!=b.style&&\"object\"!==typeof b.style)throw Error(p(62));}}\nfunction vb(a,b){if(-1===a.indexOf(\"-\"))return\"string\"===typeof b.is;switch(a){case \"annotation-xml\":case \"color-profile\":case \"font-face\":case \"font-face-src\":case \"font-face-uri\":case \"font-face-format\":case \"font-face-name\":case \"missing-glyph\":return!1;default:return!0}}var wb=null;function xb(a){a=a.target||a.srcElement||window;a.correspondingUseElement&&(a=a.correspondingUseElement);return 3===a.nodeType?a.parentNode:a}var yb=null,zb=null,Ab=null;\nfunction Bb(a){if(a=Cb(a)){if(\"function\"!==typeof yb)throw Error(p(280));var b=a.stateNode;b&&(b=Db(b),yb(a.stateNode,a.type,b))}}function Eb(a){zb?Ab?Ab.push(a):Ab=[a]:zb=a}function Fb(){if(zb){var a=zb,b=Ab;Ab=zb=null;Bb(a);if(b)for(a=0;a<b.length;a++)Bb(b[a])}}function Gb(a,b){return a(b)}function Hb(){}var Ib=!1;function Jb(a,b,c){if(Ib)return a(b,c);Ib=!0;try{return Gb(a,b,c)}finally{if(Ib=!1,null!==zb||null!==Ab)Hb(),Fb()}}\nfunction Kb(a,b){var c=a.stateNode;if(null===c)return null;var d=Db(c);if(null===d)return null;c=d[b];a:switch(b){case \"onClick\":case \"onClickCapture\":case \"onDoubleClick\":case \"onDoubleClickCapture\":case \"onMouseDown\":case \"onMouseDownCapture\":case \"onMouseMove\":case \"onMouseMoveCapture\":case \"onMouseUp\":case \"onMouseUpCapture\":case \"onMouseEnter\":(d=!d.disabled)||(a=a.type,d=!(\"button\"===a||\"input\"===a||\"select\"===a||\"textarea\"===a));a=!d;break a;default:a=!1}if(a)return null;if(c&&\"function\"!==\ntypeof c)throw Error(p(231,b,typeof c));return c}var Lb=!1;if(ia)try{var Mb={};Object.defineProperty(Mb,\"passive\",{get:function(){Lb=!0}});window.addEventListener(\"test\",Mb,Mb);window.removeEventListener(\"test\",Mb,Mb)}catch(a){Lb=!1}function Nb(a,b,c,d,e,f,g,h,k){var l=Array.prototype.slice.call(arguments,3);try{b.apply(c,l)}catch(m){this.onError(m)}}var Ob=!1,Pb=null,Qb=!1,Rb=null,Sb={onError:function(a){Ob=!0;Pb=a}};function Tb(a,b,c,d,e,f,g,h,k){Ob=!1;Pb=null;Nb.apply(Sb,arguments)}\nfunction Ub(a,b,c,d,e,f,g,h,k){Tb.apply(this,arguments);if(Ob){if(Ob){var l=Pb;Ob=!1;Pb=null}else throw Error(p(198));Qb||(Qb=!0,Rb=l)}}function Vb(a){var b=a,c=a;if(a.alternate)for(;b.return;)b=b.return;else{a=b;do b=a,0!==(b.flags&4098)&&(c=b.return),a=b.return;while(a)}return 3===b.tag?c:null}function Wb(a){if(13===a.tag){var b=a.memoizedState;null===b&&(a=a.alternate,null!==a&&(b=a.memoizedState));if(null!==b)return b.dehydrated}return null}function Xb(a){if(Vb(a)!==a)throw Error(p(188));}\nfunction Yb(a){var b=a.alternate;if(!b){b=Vb(a);if(null===b)throw Error(p(188));return b!==a?null:a}for(var c=a,d=b;;){var e=c.return;if(null===e)break;var f=e.alternate;if(null===f){d=e.return;if(null!==d){c=d;continue}break}if(e.child===f.child){for(f=e.child;f;){if(f===c)return Xb(e),a;if(f===d)return Xb(e),b;f=f.sibling}throw Error(p(188));}if(c.return!==d.return)c=e,d=f;else{for(var g=!1,h=e.child;h;){if(h===c){g=!0;c=e;d=f;break}if(h===d){g=!0;d=e;c=f;break}h=h.sibling}if(!g){for(h=f.child;h;){if(h===\nc){g=!0;c=f;d=e;break}if(h===d){g=!0;d=f;c=e;break}h=h.sibling}if(!g)throw Error(p(189));}}if(c.alternate!==d)throw Error(p(190));}if(3!==c.tag)throw Error(p(188));return c.stateNode.current===c?a:b}function Zb(a){a=Yb(a);return null!==a?$b(a):null}function $b(a){if(5===a.tag||6===a.tag)return a;for(a=a.child;null!==a;){var b=$b(a);if(null!==b)return b;a=a.sibling}return null}\nvar ac=ca.unstable_scheduleCallback,bc=ca.unstable_cancelCallback,cc=ca.unstable_shouldYield,dc=ca.unstable_requestPaint,B=ca.unstable_now,ec=ca.unstable_getCurrentPriorityLevel,fc=ca.unstable_ImmediatePriority,gc=ca.unstable_UserBlockingPriority,hc=ca.unstable_NormalPriority,ic=ca.unstable_LowPriority,jc=ca.unstable_IdlePriority,kc=null,lc=null;function mc(a){if(lc&&\"function\"===typeof lc.onCommitFiberRoot)try{lc.onCommitFiberRoot(kc,a,void 0,128===(a.current.flags&128))}catch(b){}}\nvar oc=Math.clz32?Math.clz32:nc,pc=Math.log,qc=Math.LN2;function nc(a){a>>>=0;return 0===a?32:31-(pc(a)/qc|0)|0}var rc=64,sc=4194304;\nfunction tc(a){switch(a&-a){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return a&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return a&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;\ndefault:return a}}function uc(a,b){var c=a.pendingLanes;if(0===c)return 0;var d=0,e=a.suspendedLanes,f=a.pingedLanes,g=c&268435455;if(0!==g){var h=g&~e;0!==h?d=tc(h):(f&=g,0!==f&&(d=tc(f)))}else g=c&~e,0!==g?d=tc(g):0!==f&&(d=tc(f));if(0===d)return 0;if(0!==b&&b!==d&&0===(b&e)&&(e=d&-d,f=b&-b,e>=f||16===e&&0!==(f&4194240)))return b;0!==(d&4)&&(d|=c&16);b=a.entangledLanes;if(0!==b)for(a=a.entanglements,b&=d;0<b;)c=31-oc(b),e=1<<c,d|=a[c],b&=~e;return d}\nfunction vc(a,b){switch(a){case 1:case 2:case 4:return b+250;case 8:case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return b+5E3;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return-1;case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}\nfunction wc(a,b){for(var c=a.suspendedLanes,d=a.pingedLanes,e=a.expirationTimes,f=a.pendingLanes;0<f;){var g=31-oc(f),h=1<<g,k=e[g];if(-1===k){if(0===(h&c)||0!==(h&d))e[g]=vc(h,b)}else k<=b&&(a.expiredLanes|=h);f&=~h}}function xc(a){a=a.pendingLanes&-1073741825;return 0!==a?a:a&1073741824?1073741824:0}function yc(){var a=rc;rc<<=1;0===(rc&4194240)&&(rc=64);return a}function zc(a){for(var b=[],c=0;31>c;c++)b.push(a);return b}\nfunction Ac(a,b,c){a.pendingLanes|=b;536870912!==b&&(a.suspendedLanes=0,a.pingedLanes=0);a=a.eventTimes;b=31-oc(b);a[b]=c}function Bc(a,b){var c=a.pendingLanes&~b;a.pendingLanes=b;a.suspendedLanes=0;a.pingedLanes=0;a.expiredLanes&=b;a.mutableReadLanes&=b;a.entangledLanes&=b;b=a.entanglements;var d=a.eventTimes;for(a=a.expirationTimes;0<c;){var e=31-oc(c),f=1<<e;b[e]=0;d[e]=-1;a[e]=-1;c&=~f}}\nfunction Cc(a,b){var c=a.entangledLanes|=b;for(a=a.entanglements;c;){var d=31-oc(c),e=1<<d;e&b|a[d]&b&&(a[d]|=b);c&=~e}}var C=0;function Dc(a){a&=-a;return 1<a?4<a?0!==(a&268435455)?16:536870912:4:1}var Ec,Fc,Gc,Hc,Ic,Jc=!1,Kc=[],Lc=null,Mc=null,Nc=null,Oc=new Map,Pc=new Map,Qc=[],Rc=\"mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit\".split(\" \");\nfunction Sc(a,b){switch(a){case \"focusin\":case \"focusout\":Lc=null;break;case \"dragenter\":case \"dragleave\":Mc=null;break;case \"mouseover\":case \"mouseout\":Nc=null;break;case \"pointerover\":case \"pointerout\":Oc.delete(b.pointerId);break;case \"gotpointercapture\":case \"lostpointercapture\":Pc.delete(b.pointerId)}}\nfunction Tc(a,b,c,d,e,f){if(null===a||a.nativeEvent!==f)return a={blockedOn:b,domEventName:c,eventSystemFlags:d,nativeEvent:f,targetContainers:[e]},null!==b&&(b=Cb(b),null!==b&&Fc(b)),a;a.eventSystemFlags|=d;b=a.targetContainers;null!==e&&-1===b.indexOf(e)&&b.push(e);return a}\nfunction Uc(a,b,c,d,e){switch(b){case \"focusin\":return Lc=Tc(Lc,a,b,c,d,e),!0;case \"dragenter\":return Mc=Tc(Mc,a,b,c,d,e),!0;case \"mouseover\":return Nc=Tc(Nc,a,b,c,d,e),!0;case \"pointerover\":var f=e.pointerId;Oc.set(f,Tc(Oc.get(f)||null,a,b,c,d,e));return!0;case \"gotpointercapture\":return f=e.pointerId,Pc.set(f,Tc(Pc.get(f)||null,a,b,c,d,e)),!0}return!1}\nfunction Vc(a){var b=Wc(a.target);if(null!==b){var c=Vb(b);if(null!==c)if(b=c.tag,13===b){if(b=Wb(c),null!==b){a.blockedOn=b;Ic(a.priority,function(){Gc(c)});return}}else if(3===b&&c.stateNode.current.memoizedState.isDehydrated){a.blockedOn=3===c.tag?c.stateNode.containerInfo:null;return}}a.blockedOn=null}\nfunction Xc(a){if(null!==a.blockedOn)return!1;for(var b=a.targetContainers;0<b.length;){var c=Yc(a.domEventName,a.eventSystemFlags,b[0],a.nativeEvent);if(null===c){c=a.nativeEvent;var d=new c.constructor(c.type,c);wb=d;c.target.dispatchEvent(d);wb=null}else return b=Cb(c),null!==b&&Fc(b),a.blockedOn=c,!1;b.shift()}return!0}function Zc(a,b,c){Xc(a)&&c.delete(b)}function $c(){Jc=!1;null!==Lc&&Xc(Lc)&&(Lc=null);null!==Mc&&Xc(Mc)&&(Mc=null);null!==Nc&&Xc(Nc)&&(Nc=null);Oc.forEach(Zc);Pc.forEach(Zc)}\nfunction ad(a,b){a.blockedOn===b&&(a.blockedOn=null,Jc||(Jc=!0,ca.unstable_scheduleCallback(ca.unstable_NormalPriority,$c)))}\nfunction bd(a){function b(b){return ad(b,a)}if(0<Kc.length){ad(Kc[0],a);for(var c=1;c<Kc.length;c++){var d=Kc[c];d.blockedOn===a&&(d.blockedOn=null)}}null!==Lc&&ad(Lc,a);null!==Mc&&ad(Mc,a);null!==Nc&&ad(Nc,a);Oc.forEach(b);Pc.forEach(b);for(c=0;c<Qc.length;c++)d=Qc[c],d.blockedOn===a&&(d.blockedOn=null);for(;0<Qc.length&&(c=Qc[0],null===c.blockedOn);)Vc(c),null===c.blockedOn&&Qc.shift()}var cd=ua.ReactCurrentBatchConfig,dd=!0;\nfunction ed(a,b,c,d){var e=C,f=cd.transition;cd.transition=null;try{C=1,fd(a,b,c,d)}finally{C=e,cd.transition=f}}function gd(a,b,c,d){var e=C,f=cd.transition;cd.transition=null;try{C=4,fd(a,b,c,d)}finally{C=e,cd.transition=f}}\nfunction fd(a,b,c,d){if(dd){var e=Yc(a,b,c,d);if(null===e)hd(a,b,d,id,c),Sc(a,d);else if(Uc(e,a,b,c,d))d.stopPropagation();else if(Sc(a,d),b&4&&-1<Rc.indexOf(a)){for(;null!==e;){var f=Cb(e);null!==f&&Ec(f);f=Yc(a,b,c,d);null===f&&hd(a,b,d,id,c);if(f===e)break;e=f}null!==e&&d.stopPropagation()}else hd(a,b,d,null,c)}}var id=null;\nfunction Yc(a,b,c,d){id=null;a=xb(d);a=Wc(a);if(null!==a)if(b=Vb(a),null===b)a=null;else if(c=b.tag,13===c){a=Wb(b);if(null!==a)return a;a=null}else if(3===c){if(b.stateNode.current.memoizedState.isDehydrated)return 3===b.tag?b.stateNode.containerInfo:null;a=null}else b!==a&&(a=null);id=a;return null}\nfunction jd(a){switch(a){case \"cancel\":case \"click\":case \"close\":case \"contextmenu\":case \"copy\":case \"cut\":case \"auxclick\":case \"dblclick\":case \"dragend\":case \"dragstart\":case \"drop\":case \"focusin\":case \"focusout\":case \"input\":case \"invalid\":case \"keydown\":case \"keypress\":case \"keyup\":case \"mousedown\":case \"mouseup\":case \"paste\":case \"pause\":case \"play\":case \"pointercancel\":case \"pointerdown\":case \"pointerup\":case \"ratechange\":case \"reset\":case \"resize\":case \"seeked\":case \"submit\":case \"touchcancel\":case \"touchend\":case \"touchstart\":case \"volumechange\":case \"change\":case \"selectionchange\":case \"textInput\":case \"compositionstart\":case \"compositionend\":case \"compositionupdate\":case \"beforeblur\":case \"afterblur\":case \"beforeinput\":case \"blur\":case \"fullscreenchange\":case \"focus\":case \"hashchange\":case \"popstate\":case \"select\":case \"selectstart\":return 1;case \"drag\":case \"dragenter\":case \"dragexit\":case \"dragleave\":case \"dragover\":case \"mousemove\":case \"mouseout\":case \"mouseover\":case \"pointermove\":case \"pointerout\":case \"pointerover\":case \"scroll\":case \"toggle\":case \"touchmove\":case \"wheel\":case \"mouseenter\":case \"mouseleave\":case \"pointerenter\":case \"pointerleave\":return 4;\ncase \"message\":switch(ec()){case fc:return 1;case gc:return 4;case hc:case ic:return 16;case jc:return 536870912;default:return 16}default:return 16}}var kd=null,ld=null,md=null;function nd(){if(md)return md;var a,b=ld,c=b.length,d,e=\"value\"in kd?kd.value:kd.textContent,f=e.length;for(a=0;a<c&&b[a]===e[a];a++);var g=c-a;for(d=1;d<=g&&b[c-d]===e[f-d];d++);return md=e.slice(a,1<d?1-d:void 0)}\nfunction od(a){var b=a.keyCode;\"charCode\"in a?(a=a.charCode,0===a&&13===b&&(a=13)):a=b;10===a&&(a=13);return 32<=a||13===a?a:0}function pd(){return!0}function qd(){return!1}\nfunction rd(a){function b(b,d,e,f,g){this._reactName=b;this._targetInst=e;this.type=d;this.nativeEvent=f;this.target=g;this.currentTarget=null;for(var c in a)a.hasOwnProperty(c)&&(b=a[c],this[c]=b?b(f):f[c]);this.isDefaultPrevented=(null!=f.defaultPrevented?f.defaultPrevented:!1===f.returnValue)?pd:qd;this.isPropagationStopped=qd;return this}A(b.prototype,{preventDefault:function(){this.defaultPrevented=!0;var a=this.nativeEvent;a&&(a.preventDefault?a.preventDefault():\"unknown\"!==typeof a.returnValue&&\n(a.returnValue=!1),this.isDefaultPrevented=pd)},stopPropagation:function(){var a=this.nativeEvent;a&&(a.stopPropagation?a.stopPropagation():\"unknown\"!==typeof a.cancelBubble&&(a.cancelBubble=!0),this.isPropagationStopped=pd)},persist:function(){},isPersistent:pd});return b}\nvar sd={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(a){return a.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},td=rd(sd),ud=A({},sd,{view:0,detail:0}),vd=rd(ud),wd,xd,yd,Ad=A({},ud,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:zd,button:0,buttons:0,relatedTarget:function(a){return void 0===a.relatedTarget?a.fromElement===a.srcElement?a.toElement:a.fromElement:a.relatedTarget},movementX:function(a){if(\"movementX\"in\na)return a.movementX;a!==yd&&(yd&&\"mousemove\"===a.type?(wd=a.screenX-yd.screenX,xd=a.screenY-yd.screenY):xd=wd=0,yd=a);return wd},movementY:function(a){return\"movementY\"in a?a.movementY:xd}}),Bd=rd(Ad),Cd=A({},Ad,{dataTransfer:0}),Dd=rd(Cd),Ed=A({},ud,{relatedTarget:0}),Fd=rd(Ed),Gd=A({},sd,{animationName:0,elapsedTime:0,pseudoElement:0}),Hd=rd(Gd),Id=A({},sd,{clipboardData:function(a){return\"clipboardData\"in a?a.clipboardData:window.clipboardData}}),Jd=rd(Id),Kd=A({},sd,{data:0}),Ld=rd(Kd),Md={Esc:\"Escape\",\nSpacebar:\" \",Left:\"ArrowLeft\",Up:\"ArrowUp\",Right:\"ArrowRight\",Down:\"ArrowDown\",Del:\"Delete\",Win:\"OS\",Menu:\"ContextMenu\",Apps:\"ContextMenu\",Scroll:\"ScrollLock\",MozPrintableKey:\"Unidentified\"},Nd={8:\"Backspace\",9:\"Tab\",12:\"Clear\",13:\"Enter\",16:\"Shift\",17:\"Control\",18:\"Alt\",19:\"Pause\",20:\"CapsLock\",27:\"Escape\",32:\" \",33:\"PageUp\",34:\"PageDown\",35:\"End\",36:\"Home\",37:\"ArrowLeft\",38:\"ArrowUp\",39:\"ArrowRight\",40:\"ArrowDown\",45:\"Insert\",46:\"Delete\",112:\"F1\",113:\"F2\",114:\"F3\",115:\"F4\",116:\"F5\",117:\"F6\",118:\"F7\",\n119:\"F8\",120:\"F9\",121:\"F10\",122:\"F11\",123:\"F12\",144:\"NumLock\",145:\"ScrollLock\",224:\"Meta\"},Od={Alt:\"altKey\",Control:\"ctrlKey\",Meta:\"metaKey\",Shift:\"shiftKey\"};function Pd(a){var b=this.nativeEvent;return b.getModifierState?b.getModifierState(a):(a=Od[a])?!!b[a]:!1}function zd(){return Pd}\nvar Qd=A({},ud,{key:function(a){if(a.key){var b=Md[a.key]||a.key;if(\"Unidentified\"!==b)return b}return\"keypress\"===a.type?(a=od(a),13===a?\"Enter\":String.fromCharCode(a)):\"keydown\"===a.type||\"keyup\"===a.type?Nd[a.keyCode]||\"Unidentified\":\"\"},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:zd,charCode:function(a){return\"keypress\"===a.type?od(a):0},keyCode:function(a){return\"keydown\"===a.type||\"keyup\"===a.type?a.keyCode:0},which:function(a){return\"keypress\"===\na.type?od(a):\"keydown\"===a.type||\"keyup\"===a.type?a.keyCode:0}}),Rd=rd(Qd),Sd=A({},Ad,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0}),Td=rd(Sd),Ud=A({},ud,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:zd}),Vd=rd(Ud),Wd=A({},sd,{propertyName:0,elapsedTime:0,pseudoElement:0}),Xd=rd(Wd),Yd=A({},Ad,{deltaX:function(a){return\"deltaX\"in a?a.deltaX:\"wheelDeltaX\"in a?-a.wheelDeltaX:0},\ndeltaY:function(a){return\"deltaY\"in a?a.deltaY:\"wheelDeltaY\"in a?-a.wheelDeltaY:\"wheelDelta\"in a?-a.wheelDelta:0},deltaZ:0,deltaMode:0}),Zd=rd(Yd),$d=[9,13,27,32],ae=ia&&\"CompositionEvent\"in window,be=null;ia&&\"documentMode\"in document&&(be=document.documentMode);var ce=ia&&\"TextEvent\"in window&&!be,de=ia&&(!ae||be&&8<be&&11>=be),ee=String.fromCharCode(32),fe=!1;\nfunction ge(a,b){switch(a){case \"keyup\":return-1!==$d.indexOf(b.keyCode);case \"keydown\":return 229!==b.keyCode;case \"keypress\":case \"mousedown\":case \"focusout\":return!0;default:return!1}}function he(a){a=a.detail;return\"object\"===typeof a&&\"data\"in a?a.data:null}var ie=!1;function je(a,b){switch(a){case \"compositionend\":return he(b);case \"keypress\":if(32!==b.which)return null;fe=!0;return ee;case \"textInput\":return a=b.data,a===ee&&fe?null:a;default:return null}}\nfunction ke(a,b){if(ie)return\"compositionend\"===a||!ae&&ge(a,b)?(a=nd(),md=ld=kd=null,ie=!1,a):null;switch(a){case \"paste\":return null;case \"keypress\":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1<b.char.length)return b.char;if(b.which)return String.fromCharCode(b.which)}return null;case \"compositionend\":return de&&\"ko\"!==b.locale?null:b.data;default:return null}}\nvar le={color:!0,date:!0,datetime:!0,\"datetime-local\":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function me(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return\"input\"===b?!!le[a.type]:\"textarea\"===b?!0:!1}function ne(a,b,c,d){Eb(d);b=oe(b,\"onChange\");0<b.length&&(c=new td(\"onChange\",\"change\",null,c,d),a.push({event:c,listeners:b}))}var pe=null,qe=null;function re(a){se(a,0)}function te(a){var b=ue(a);if(Wa(b))return a}\nfunction ve(a,b){if(\"change\"===a)return b}var we=!1;if(ia){var xe;if(ia){var ye=\"oninput\"in document;if(!ye){var ze=document.createElement(\"div\");ze.setAttribute(\"oninput\",\"return;\");ye=\"function\"===typeof ze.oninput}xe=ye}else xe=!1;we=xe&&(!document.documentMode||9<document.documentMode)}function Ae(){pe&&(pe.detachEvent(\"onpropertychange\",Be),qe=pe=null)}function Be(a){if(\"value\"===a.propertyName&&te(qe)){var b=[];ne(b,qe,a,xb(a));Jb(re,b)}}\nfunction Ce(a,b,c){\"focusin\"===a?(Ae(),pe=b,qe=c,pe.attachEvent(\"onpropertychange\",Be)):\"focusout\"===a&&Ae()}function De(a){if(\"selectionchange\"===a||\"keyup\"===a||\"keydown\"===a)return te(qe)}function Ee(a,b){if(\"click\"===a)return te(b)}function Fe(a,b){if(\"input\"===a||\"change\"===a)return te(b)}function Ge(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var He=\"function\"===typeof Object.is?Object.is:Ge;\nfunction Ie(a,b){if(He(a,b))return!0;if(\"object\"!==typeof a||null===a||\"object\"!==typeof b||null===b)return!1;var c=Object.keys(a),d=Object.keys(b);if(c.length!==d.length)return!1;for(d=0;d<c.length;d++){var e=c[d];if(!ja.call(b,e)||!He(a[e],b[e]))return!1}return!0}function Je(a){for(;a&&a.firstChild;)a=a.firstChild;return a}\nfunction Ke(a,b){var c=Je(a);a=0;for(var d;c;){if(3===c.nodeType){d=a+c.textContent.length;if(a<=b&&d>=b)return{node:c,offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=Je(c)}}function Le(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?Le(a,b.parentNode):\"contains\"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}\nfunction Me(){for(var a=window,b=Xa();b instanceof a.HTMLIFrameElement;){try{var c=\"string\"===typeof b.contentWindow.location.href}catch(d){c=!1}if(c)a=b.contentWindow;else break;b=Xa(a.document)}return b}function Ne(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&(\"input\"===b&&(\"text\"===a.type||\"search\"===a.type||\"tel\"===a.type||\"url\"===a.type||\"password\"===a.type)||\"textarea\"===b||\"true\"===a.contentEditable)}\nfunction Oe(a){var b=Me(),c=a.focusedElem,d=a.selectionRange;if(b!==c&&c&&c.ownerDocument&&Le(c.ownerDocument.documentElement,c)){if(null!==d&&Ne(c))if(b=d.start,a=d.end,void 0===a&&(a=b),\"selectionStart\"in c)c.selectionStart=b,c.selectionEnd=Math.min(a,c.value.length);else if(a=(b=c.ownerDocument||document)&&b.defaultView||window,a.getSelection){a=a.getSelection();var e=c.textContent.length,f=Math.min(d.start,e);d=void 0===d.end?f:Math.min(d.end,e);!a.extend&&f>d&&(e=d,d=f,f=e);e=Ke(c,f);var g=Ke(c,\nd);e&&g&&(1!==a.rangeCount||a.anchorNode!==e.node||a.anchorOffset!==e.offset||a.focusNode!==g.node||a.focusOffset!==g.offset)&&(b=b.createRange(),b.setStart(e.node,e.offset),a.removeAllRanges(),f>d?(a.addRange(b),a.extend(g.node,g.offset)):(b.setEnd(g.node,g.offset),a.addRange(b)))}b=[];for(a=c;a=a.parentNode;)1===a.nodeType&&b.push({element:a,left:a.scrollLeft,top:a.scrollTop});\"function\"===typeof c.focus&&c.focus();for(c=0;c<b.length;c++)a=b[c],a.element.scrollLeft=a.left,a.element.scrollTop=a.top}}\nvar Pe=ia&&\"documentMode\"in document&&11>=document.documentMode,Qe=null,Re=null,Se=null,Te=!1;\nfunction Ue(a,b,c){var d=c.window===c?c.document:9===c.nodeType?c:c.ownerDocument;Te||null==Qe||Qe!==Xa(d)||(d=Qe,\"selectionStart\"in d&&Ne(d)?d={start:d.selectionStart,end:d.selectionEnd}:(d=(d.ownerDocument&&d.ownerDocument.defaultView||window).getSelection(),d={anchorNode:d.anchorNode,anchorOffset:d.anchorOffset,focusNode:d.focusNode,focusOffset:d.focusOffset}),Se&&Ie(Se,d)||(Se=d,d=oe(Re,\"onSelect\"),0<d.length&&(b=new td(\"onSelect\",\"select\",null,b,c),a.push({event:b,listeners:d}),b.target=Qe)))}\nfunction Ve(a,b){var c={};c[a.toLowerCase()]=b.toLowerCase();c[\"Webkit\"+a]=\"webkit\"+b;c[\"Moz\"+a]=\"moz\"+b;return c}var We={animationend:Ve(\"Animation\",\"AnimationEnd\"),animationiteration:Ve(\"Animation\",\"AnimationIteration\"),animationstart:Ve(\"Animation\",\"AnimationStart\"),transitionend:Ve(\"Transition\",\"TransitionEnd\")},Xe={},Ye={};\nia&&(Ye=document.createElement(\"div\").style,\"AnimationEvent\"in window||(delete We.animationend.animation,delete We.animationiteration.animation,delete We.animationstart.animation),\"TransitionEvent\"in window||delete We.transitionend.transition);function Ze(a){if(Xe[a])return Xe[a];if(!We[a])return a;var b=We[a],c;for(c in b)if(b.hasOwnProperty(c)&&c in Ye)return Xe[a]=b[c];return a}var $e=Ze(\"animationend\"),af=Ze(\"animationiteration\"),bf=Ze(\"animationstart\"),cf=Ze(\"transitionend\"),df=new Map,ef=\"abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel\".split(\" \");\nfunction ff(a,b){df.set(a,b);fa(b,[a])}for(var gf=0;gf<ef.length;gf++){var hf=ef[gf],jf=hf.toLowerCase(),kf=hf[0].toUpperCase()+hf.slice(1);ff(jf,\"on\"+kf)}ff($e,\"onAnimationEnd\");ff(af,\"onAnimationIteration\");ff(bf,\"onAnimationStart\");ff(\"dblclick\",\"onDoubleClick\");ff(\"focusin\",\"onFocus\");ff(\"focusout\",\"onBlur\");ff(cf,\"onTransitionEnd\");ha(\"onMouseEnter\",[\"mouseout\",\"mouseover\"]);ha(\"onMouseLeave\",[\"mouseout\",\"mouseover\"]);ha(\"onPointerEnter\",[\"pointerout\",\"pointerover\"]);\nha(\"onPointerLeave\",[\"pointerout\",\"pointerover\"]);fa(\"onChange\",\"change click focusin focusout input keydown keyup selectionchange\".split(\" \"));fa(\"onSelect\",\"focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange\".split(\" \"));fa(\"onBeforeInput\",[\"compositionend\",\"keypress\",\"textInput\",\"paste\"]);fa(\"onCompositionEnd\",\"compositionend focusout keydown keypress keyup mousedown\".split(\" \"));fa(\"onCompositionStart\",\"compositionstart focusout keydown keypress keyup mousedown\".split(\" \"));\nfa(\"onCompositionUpdate\",\"compositionupdate focusout keydown keypress keyup mousedown\".split(\" \"));var lf=\"abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting\".split(\" \"),mf=new Set(\"cancel close invalid load scroll toggle\".split(\" \").concat(lf));\nfunction nf(a,b,c){var d=a.type||\"unknown-event\";a.currentTarget=c;Ub(d,b,void 0,a);a.currentTarget=null}\nfunction se(a,b){b=0!==(b&4);for(var c=0;c<a.length;c++){var d=a[c],e=d.event;d=d.listeners;a:{var f=void 0;if(b)for(var g=d.length-1;0<=g;g--){var h=d[g],k=h.instance,l=h.currentTarget;h=h.listener;if(k!==f&&e.isPropagationStopped())break a;nf(e,h,l);f=k}else for(g=0;g<d.length;g++){h=d[g];k=h.instance;l=h.currentTarget;h=h.listener;if(k!==f&&e.isPropagationStopped())break a;nf(e,h,l);f=k}}}if(Qb)throw a=Rb,Qb=!1,Rb=null,a;}\nfunction D(a,b){var c=b[of];void 0===c&&(c=b[of]=new Set);var d=a+\"__bubble\";c.has(d)||(pf(b,a,2,!1),c.add(d))}function qf(a,b,c){var d=0;b&&(d|=4);pf(c,a,d,b)}var rf=\"_reactListening\"+Math.random().toString(36).slice(2);function sf(a){if(!a[rf]){a[rf]=!0;da.forEach(function(b){\"selectionchange\"!==b&&(mf.has(b)||qf(b,!1,a),qf(b,!0,a))});var b=9===a.nodeType?a:a.ownerDocument;null===b||b[rf]||(b[rf]=!0,qf(\"selectionchange\",!1,b))}}\nfunction pf(a,b,c,d){switch(jd(b)){case 1:var e=ed;break;case 4:e=gd;break;default:e=fd}c=e.bind(null,b,c,a);e=void 0;!Lb||\"touchstart\"!==b&&\"touchmove\"!==b&&\"wheel\"!==b||(e=!0);d?void 0!==e?a.addEventListener(b,c,{capture:!0,passive:e}):a.addEventListener(b,c,!0):void 0!==e?a.addEventListener(b,c,{passive:e}):a.addEventListener(b,c,!1)}\nfunction hd(a,b,c,d,e){var f=d;if(0===(b&1)&&0===(b&2)&&null!==d)a:for(;;){if(null===d)return;var g=d.tag;if(3===g||4===g){var h=d.stateNode.containerInfo;if(h===e||8===h.nodeType&&h.parentNode===e)break;if(4===g)for(g=d.return;null!==g;){var k=g.tag;if(3===k||4===k)if(k=g.stateNode.containerInfo,k===e||8===k.nodeType&&k.parentNode===e)return;g=g.return}for(;null!==h;){g=Wc(h);if(null===g)return;k=g.tag;if(5===k||6===k){d=f=g;continue a}h=h.parentNode}}d=d.return}Jb(function(){var d=f,e=xb(c),g=[];\na:{var h=df.get(a);if(void 0!==h){var k=td,n=a;switch(a){case \"keypress\":if(0===od(c))break a;case \"keydown\":case \"keyup\":k=Rd;break;case \"focusin\":n=\"focus\";k=Fd;break;case \"focusout\":n=\"blur\";k=Fd;break;case \"beforeblur\":case \"afterblur\":k=Fd;break;case \"click\":if(2===c.button)break a;case \"auxclick\":case \"dblclick\":case \"mousedown\":case \"mousemove\":case \"mouseup\":case \"mouseout\":case \"mouseover\":case \"contextmenu\":k=Bd;break;case \"drag\":case \"dragend\":case \"dragenter\":case \"dragexit\":case \"dragleave\":case \"dragover\":case \"dragstart\":case \"drop\":k=\nDd;break;case \"touchcancel\":case \"touchend\":case \"touchmove\":case \"touchstart\":k=Vd;break;case $e:case af:case bf:k=Hd;break;case cf:k=Xd;break;case \"scroll\":k=vd;break;case \"wheel\":k=Zd;break;case \"copy\":case \"cut\":case \"paste\":k=Jd;break;case \"gotpointercapture\":case \"lostpointercapture\":case \"pointercancel\":case \"pointerdown\":case \"pointermove\":case \"pointerout\":case \"pointerover\":case \"pointerup\":k=Td}var t=0!==(b&4),J=!t&&\"scroll\"===a,x=t?null!==h?h+\"Capture\":null:h;t=[];for(var w=d,u;null!==\nw;){u=w;var F=u.stateNode;5===u.tag&&null!==F&&(u=F,null!==x&&(F=Kb(w,x),null!=F&&t.push(tf(w,F,u))));if(J)break;w=w.return}0<t.length&&(h=new k(h,n,null,c,e),g.push({event:h,listeners:t}))}}if(0===(b&7)){a:{h=\"mouseover\"===a||\"pointerover\"===a;k=\"mouseout\"===a||\"pointerout\"===a;if(h&&c!==wb&&(n=c.relatedTarget||c.fromElement)&&(Wc(n)||n[uf]))break a;if(k||h){h=e.window===e?e:(h=e.ownerDocument)?h.defaultView||h.parentWindow:window;if(k){if(n=c.relatedTarget||c.toElement,k=d,n=n?Wc(n):null,null!==\nn&&(J=Vb(n),n!==J||5!==n.tag&&6!==n.tag))n=null}else k=null,n=d;if(k!==n){t=Bd;F=\"onMouseLeave\";x=\"onMouseEnter\";w=\"mouse\";if(\"pointerout\"===a||\"pointerover\"===a)t=Td,F=\"onPointerLeave\",x=\"onPointerEnter\",w=\"pointer\";J=null==k?h:ue(k);u=null==n?h:ue(n);h=new t(F,w+\"leave\",k,c,e);h.target=J;h.relatedTarget=u;F=null;Wc(e)===d&&(t=new t(x,w+\"enter\",n,c,e),t.target=u,t.relatedTarget=J,F=t);J=F;if(k&&n)b:{t=k;x=n;w=0;for(u=t;u;u=vf(u))w++;u=0;for(F=x;F;F=vf(F))u++;for(;0<w-u;)t=vf(t),w--;for(;0<u-w;)x=\nvf(x),u--;for(;w--;){if(t===x||null!==x&&t===x.alternate)break b;t=vf(t);x=vf(x)}t=null}else t=null;null!==k&&wf(g,h,k,t,!1);null!==n&&null!==J&&wf(g,J,n,t,!0)}}}a:{h=d?ue(d):window;k=h.nodeName&&h.nodeName.toLowerCase();if(\"select\"===k||\"input\"===k&&\"file\"===h.type)var na=ve;else if(me(h))if(we)na=Fe;else{na=De;var xa=Ce}else(k=h.nodeName)&&\"input\"===k.toLowerCase()&&(\"checkbox\"===h.type||\"radio\"===h.type)&&(na=Ee);if(na&&(na=na(a,d))){ne(g,na,c,e);break a}xa&&xa(a,h,d);\"focusout\"===a&&(xa=h._wrapperState)&&\nxa.controlled&&\"number\"===h.type&&cb(h,\"number\",h.value)}xa=d?ue(d):window;switch(a){case \"focusin\":if(me(xa)||\"true\"===xa.contentEditable)Qe=xa,Re=d,Se=null;break;case \"focusout\":Se=Re=Qe=null;break;case \"mousedown\":Te=!0;break;case \"contextmenu\":case \"mouseup\":case \"dragend\":Te=!1;Ue(g,c,e);break;case \"selectionchange\":if(Pe)break;case \"keydown\":case \"keyup\":Ue(g,c,e)}var $a;if(ae)b:{switch(a){case \"compositionstart\":var ba=\"onCompositionStart\";break b;case \"compositionend\":ba=\"onCompositionEnd\";\nbreak b;case \"compositionupdate\":ba=\"onCompositionUpdate\";break b}ba=void 0}else ie?ge(a,c)&&(ba=\"onCompositionEnd\"):\"keydown\"===a&&229===c.keyCode&&(ba=\"onCompositionStart\");ba&&(de&&\"ko\"!==c.locale&&(ie||\"onCompositionStart\"!==ba?\"onCompositionEnd\"===ba&&ie&&($a=nd()):(kd=e,ld=\"value\"in kd?kd.value:kd.textContent,ie=!0)),xa=oe(d,ba),0<xa.length&&(ba=new Ld(ba,a,null,c,e),g.push({event:ba,listeners:xa}),$a?ba.data=$a:($a=he(c),null!==$a&&(ba.data=$a))));if($a=ce?je(a,c):ke(a,c))d=oe(d,\"onBeforeInput\"),\n0<d.length&&(e=new Ld(\"onBeforeInput\",\"beforeinput\",null,c,e),g.push({event:e,listeners:d}),e.data=$a)}se(g,b)})}function tf(a,b,c){return{instance:a,listener:b,currentTarget:c}}function oe(a,b){for(var c=b+\"Capture\",d=[];null!==a;){var e=a,f=e.stateNode;5===e.tag&&null!==f&&(e=f,f=Kb(a,c),null!=f&&d.unshift(tf(a,f,e)),f=Kb(a,b),null!=f&&d.push(tf(a,f,e)));a=a.return}return d}function vf(a){if(null===a)return null;do a=a.return;while(a&&5!==a.tag);return a?a:null}\nfunction wf(a,b,c,d,e){for(var f=b._reactName,g=[];null!==c&&c!==d;){var h=c,k=h.alternate,l=h.stateNode;if(null!==k&&k===d)break;5===h.tag&&null!==l&&(h=l,e?(k=Kb(c,f),null!=k&&g.unshift(tf(c,k,h))):e||(k=Kb(c,f),null!=k&&g.push(tf(c,k,h))));c=c.return}0!==g.length&&a.push({event:b,listeners:g})}var xf=/\\r\\n?/g,yf=/\\u0000|\\uFFFD/g;function zf(a){return(\"string\"===typeof a?a:\"\"+a).replace(xf,\"\\n\").replace(yf,\"\")}function Af(a,b,c){b=zf(b);if(zf(a)!==b&&c)throw Error(p(425));}function Bf(){}\nvar Cf=null,Df=null;function Ef(a,b){return\"textarea\"===a||\"noscript\"===a||\"string\"===typeof b.children||\"number\"===typeof b.children||\"object\"===typeof b.dangerouslySetInnerHTML&&null!==b.dangerouslySetInnerHTML&&null!=b.dangerouslySetInnerHTML.__html}\nvar Ff=\"function\"===typeof setTimeout?setTimeout:void 0,Gf=\"function\"===typeof clearTimeout?clearTimeout:void 0,Hf=\"function\"===typeof Promise?Promise:void 0,Jf=\"function\"===typeof queueMicrotask?queueMicrotask:\"undefined\"!==typeof Hf?function(a){return Hf.resolve(null).then(a).catch(If)}:Ff;function If(a){setTimeout(function(){throw a;})}\nfunction Kf(a,b){var c=b,d=0;do{var e=c.nextSibling;a.removeChild(c);if(e&&8===e.nodeType)if(c=e.data,\"/$\"===c){if(0===d){a.removeChild(e);bd(b);return}d--}else\"$\"!==c&&\"$?\"!==c&&\"$!\"!==c||d++;c=e}while(c);bd(b)}function Lf(a){for(;null!=a;a=a.nextSibling){var b=a.nodeType;if(1===b||3===b)break;if(8===b){b=a.data;if(\"$\"===b||\"$!\"===b||\"$?\"===b)break;if(\"/$\"===b)return null}}return a}\nfunction Mf(a){a=a.previousSibling;for(var b=0;a;){if(8===a.nodeType){var c=a.data;if(\"$\"===c||\"$!\"===c||\"$?\"===c){if(0===b)return a;b--}else\"/$\"===c&&b++}a=a.previousSibling}return null}var Nf=Math.random().toString(36).slice(2),Of=\"__reactFiber$\"+Nf,Pf=\"__reactProps$\"+Nf,uf=\"__reactContainer$\"+Nf,of=\"__reactEvents$\"+Nf,Qf=\"__reactListeners$\"+Nf,Rf=\"__reactHandles$\"+Nf;\nfunction Wc(a){var b=a[Of];if(b)return b;for(var c=a.parentNode;c;){if(b=c[uf]||c[Of]){c=b.alternate;if(null!==b.child||null!==c&&null!==c.child)for(a=Mf(a);null!==a;){if(c=a[Of])return c;a=Mf(a)}return b}a=c;c=a.parentNode}return null}function Cb(a){a=a[Of]||a[uf];return!a||5!==a.tag&&6!==a.tag&&13!==a.tag&&3!==a.tag?null:a}function ue(a){if(5===a.tag||6===a.tag)return a.stateNode;throw Error(p(33));}function Db(a){return a[Pf]||null}var Sf=[],Tf=-1;function Uf(a){return{current:a}}\nfunction E(a){0>Tf||(a.current=Sf[Tf],Sf[Tf]=null,Tf--)}function G(a,b){Tf++;Sf[Tf]=a.current;a.current=b}var Vf={},H=Uf(Vf),Wf=Uf(!1),Xf=Vf;function Yf(a,b){var c=a.type.contextTypes;if(!c)return Vf;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}\nfunction Zf(a){a=a.childContextTypes;return null!==a&&void 0!==a}function $f(){E(Wf);E(H)}function ag(a,b,c){if(H.current!==Vf)throw Error(p(168));G(H,b);G(Wf,c)}function bg(a,b,c){var d=a.stateNode;b=b.childContextTypes;if(\"function\"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)if(!(e in b))throw Error(p(108,Ra(a)||\"Unknown\",e));return A({},c,d)}\nfunction cg(a){a=(a=a.stateNode)&&a.__reactInternalMemoizedMergedChildContext||Vf;Xf=H.current;G(H,a);G(Wf,Wf.current);return!0}function dg(a,b,c){var d=a.stateNode;if(!d)throw Error(p(169));c?(a=bg(a,b,Xf),d.__reactInternalMemoizedMergedChildContext=a,E(Wf),E(H),G(H,a)):E(Wf);G(Wf,c)}var eg=null,fg=!1,gg=!1;function hg(a){null===eg?eg=[a]:eg.push(a)}function ig(a){fg=!0;hg(a)}\nfunction jg(){if(!gg&&null!==eg){gg=!0;var a=0,b=C;try{var c=eg;for(C=1;a<c.length;a++){var d=c[a];do d=d(!0);while(null!==d)}eg=null;fg=!1}catch(e){throw null!==eg&&(eg=eg.slice(a+1)),ac(fc,jg),e;}finally{C=b,gg=!1}}return null}var kg=[],lg=0,mg=null,ng=0,og=[],pg=0,qg=null,rg=1,sg=\"\";function tg(a,b){kg[lg++]=ng;kg[lg++]=mg;mg=a;ng=b}\nfunction ug(a,b,c){og[pg++]=rg;og[pg++]=sg;og[pg++]=qg;qg=a;var d=rg;a=sg;var e=32-oc(d)-1;d&=~(1<<e);c+=1;var f=32-oc(b)+e;if(30<f){var g=e-e%5;f=(d&(1<<g)-1).toString(32);d>>=g;e-=g;rg=1<<32-oc(b)+e|c<<e|d;sg=f+a}else rg=1<<f|c<<e|d,sg=a}function vg(a){null!==a.return&&(tg(a,1),ug(a,1,0))}function wg(a){for(;a===mg;)mg=kg[--lg],kg[lg]=null,ng=kg[--lg],kg[lg]=null;for(;a===qg;)qg=og[--pg],og[pg]=null,sg=og[--pg],og[pg]=null,rg=og[--pg],og[pg]=null}var xg=null,yg=null,I=!1,zg=null;\nfunction Ag(a,b){var c=Bg(5,null,null,0);c.elementType=\"DELETED\";c.stateNode=b;c.return=a;b=a.deletions;null===b?(a.deletions=[c],a.flags|=16):b.push(c)}\nfunction Cg(a,b){switch(a.tag){case 5:var c=a.type;b=1!==b.nodeType||c.toLowerCase()!==b.nodeName.toLowerCase()?null:b;return null!==b?(a.stateNode=b,xg=a,yg=Lf(b.firstChild),!0):!1;case 6:return b=\"\"===a.pendingProps||3!==b.nodeType?null:b,null!==b?(a.stateNode=b,xg=a,yg=null,!0):!1;case 13:return b=8!==b.nodeType?null:b,null!==b?(c=null!==qg?{id:rg,overflow:sg}:null,a.memoizedState={dehydrated:b,treeContext:c,retryLane:1073741824},c=Bg(18,null,null,0),c.stateNode=b,c.return=a,a.child=c,xg=a,yg=\nnull,!0):!1;default:return!1}}function Dg(a){return 0!==(a.mode&1)&&0===(a.flags&128)}function Eg(a){if(I){var b=yg;if(b){var c=b;if(!Cg(a,b)){if(Dg(a))throw Error(p(418));b=Lf(c.nextSibling);var d=xg;b&&Cg(a,b)?Ag(d,c):(a.flags=a.flags&-4097|2,I=!1,xg=a)}}else{if(Dg(a))throw Error(p(418));a.flags=a.flags&-4097|2;I=!1;xg=a}}}function Fg(a){for(a=a.return;null!==a&&5!==a.tag&&3!==a.tag&&13!==a.tag;)a=a.return;xg=a}\nfunction Gg(a){if(a!==xg)return!1;if(!I)return Fg(a),I=!0,!1;var b;(b=3!==a.tag)&&!(b=5!==a.tag)&&(b=a.type,b=\"head\"!==b&&\"body\"!==b&&!Ef(a.type,a.memoizedProps));if(b&&(b=yg)){if(Dg(a))throw Hg(),Error(p(418));for(;b;)Ag(a,b),b=Lf(b.nextSibling)}Fg(a);if(13===a.tag){a=a.memoizedState;a=null!==a?a.dehydrated:null;if(!a)throw Error(p(317));a:{a=a.nextSibling;for(b=0;a;){if(8===a.nodeType){var c=a.data;if(\"/$\"===c){if(0===b){yg=Lf(a.nextSibling);break a}b--}else\"$\"!==c&&\"$!\"!==c&&\"$?\"!==c||b++}a=a.nextSibling}yg=\nnull}}else yg=xg?Lf(a.stateNode.nextSibling):null;return!0}function Hg(){for(var a=yg;a;)a=Lf(a.nextSibling)}function Ig(){yg=xg=null;I=!1}function Jg(a){null===zg?zg=[a]:zg.push(a)}var Kg=ua.ReactCurrentBatchConfig;\nfunction Lg(a,b,c){a=c.ref;if(null!==a&&\"function\"!==typeof a&&\"object\"!==typeof a){if(c._owner){c=c._owner;if(c){if(1!==c.tag)throw Error(p(309));var d=c.stateNode}if(!d)throw Error(p(147,a));var e=d,f=\"\"+a;if(null!==b&&null!==b.ref&&\"function\"===typeof b.ref&&b.ref._stringRef===f)return b.ref;b=function(a){var b=e.refs;null===a?delete b[f]:b[f]=a};b._stringRef=f;return b}if(\"string\"!==typeof a)throw Error(p(284));if(!c._owner)throw Error(p(290,a));}return a}\nfunction Mg(a,b){a=Object.prototype.toString.call(b);throw Error(p(31,\"[object Object]\"===a?\"object with keys {\"+Object.keys(b).join(\", \")+\"}\":a));}function Ng(a){var b=a._init;return b(a._payload)}\nfunction Og(a){function b(b,c){if(a){var d=b.deletions;null===d?(b.deletions=[c],b.flags|=16):d.push(c)}}function c(c,d){if(!a)return null;for(;null!==d;)b(c,d),d=d.sibling;return null}function d(a,b){for(a=new Map;null!==b;)null!==b.key?a.set(b.key,b):a.set(b.index,b),b=b.sibling;return a}function e(a,b){a=Pg(a,b);a.index=0;a.sibling=null;return a}function f(b,c,d){b.index=d;if(!a)return b.flags|=1048576,c;d=b.alternate;if(null!==d)return d=d.index,d<c?(b.flags|=2,c):d;b.flags|=2;return c}function g(b){a&&\nnull===b.alternate&&(b.flags|=2);return b}function h(a,b,c,d){if(null===b||6!==b.tag)return b=Qg(c,a.mode,d),b.return=a,b;b=e(b,c);b.return=a;return b}function k(a,b,c,d){var f=c.type;if(f===ya)return m(a,b,c.props.children,d,c.key);if(null!==b&&(b.elementType===f||\"object\"===typeof f&&null!==f&&f.$$typeof===Ha&&Ng(f)===b.type))return d=e(b,c.props),d.ref=Lg(a,b,c),d.return=a,d;d=Rg(c.type,c.key,c.props,null,a.mode,d);d.ref=Lg(a,b,c);d.return=a;return d}function l(a,b,c,d){if(null===b||4!==b.tag||\nb.stateNode.containerInfo!==c.containerInfo||b.stateNode.implementation!==c.implementation)return b=Sg(c,a.mode,d),b.return=a,b;b=e(b,c.children||[]);b.return=a;return b}function m(a,b,c,d,f){if(null===b||7!==b.tag)return b=Tg(c,a.mode,d,f),b.return=a,b;b=e(b,c);b.return=a;return b}function q(a,b,c){if(\"string\"===typeof b&&\"\"!==b||\"number\"===typeof b)return b=Qg(\"\"+b,a.mode,c),b.return=a,b;if(\"object\"===typeof b&&null!==b){switch(b.$$typeof){case va:return c=Rg(b.type,b.key,b.props,null,a.mode,c),\nc.ref=Lg(a,null,b),c.return=a,c;case wa:return b=Sg(b,a.mode,c),b.return=a,b;case Ha:var d=b._init;return q(a,d(b._payload),c)}if(eb(b)||Ka(b))return b=Tg(b,a.mode,c,null),b.return=a,b;Mg(a,b)}return null}function r(a,b,c,d){var e=null!==b?b.key:null;if(\"string\"===typeof c&&\"\"!==c||\"number\"===typeof c)return null!==e?null:h(a,b,\"\"+c,d);if(\"object\"===typeof c&&null!==c){switch(c.$$typeof){case va:return c.key===e?k(a,b,c,d):null;case wa:return c.key===e?l(a,b,c,d):null;case Ha:return e=c._init,r(a,\nb,e(c._payload),d)}if(eb(c)||Ka(c))return null!==e?null:m(a,b,c,d,null);Mg(a,c)}return null}function y(a,b,c,d,e){if(\"string\"===typeof d&&\"\"!==d||\"number\"===typeof d)return a=a.get(c)||null,h(b,a,\"\"+d,e);if(\"object\"===typeof d&&null!==d){switch(d.$$typeof){case va:return a=a.get(null===d.key?c:d.key)||null,k(b,a,d,e);case wa:return a=a.get(null===d.key?c:d.key)||null,l(b,a,d,e);case Ha:var f=d._init;return y(a,b,c,f(d._payload),e)}if(eb(d)||Ka(d))return a=a.get(c)||null,m(b,a,d,e,null);Mg(b,d)}return null}\nfunction n(e,g,h,k){for(var l=null,m=null,u=g,w=g=0,x=null;null!==u&&w<h.length;w++){u.index>w?(x=u,u=null):x=u.sibling;var n=r(e,u,h[w],k);if(null===n){null===u&&(u=x);break}a&&u&&null===n.alternate&&b(e,u);g=f(n,g,w);null===m?l=n:m.sibling=n;m=n;u=x}if(w===h.length)return c(e,u),I&&tg(e,w),l;if(null===u){for(;w<h.length;w++)u=q(e,h[w],k),null!==u&&(g=f(u,g,w),null===m?l=u:m.sibling=u,m=u);I&&tg(e,w);return l}for(u=d(e,u);w<h.length;w++)x=y(u,e,w,h[w],k),null!==x&&(a&&null!==x.alternate&&u.delete(null===\nx.key?w:x.key),g=f(x,g,w),null===m?l=x:m.sibling=x,m=x);a&&u.forEach(function(a){return b(e,a)});I&&tg(e,w);return l}function t(e,g,h,k){var l=Ka(h);if(\"function\"!==typeof l)throw Error(p(150));h=l.call(h);if(null==h)throw Error(p(151));for(var u=l=null,m=g,w=g=0,x=null,n=h.next();null!==m&&!n.done;w++,n=h.next()){m.index>w?(x=m,m=null):x=m.sibling;var t=r(e,m,n.value,k);if(null===t){null===m&&(m=x);break}a&&m&&null===t.alternate&&b(e,m);g=f(t,g,w);null===u?l=t:u.sibling=t;u=t;m=x}if(n.done)return c(e,\nm),I&&tg(e,w),l;if(null===m){for(;!n.done;w++,n=h.next())n=q(e,n.value,k),null!==n&&(g=f(n,g,w),null===u?l=n:u.sibling=n,u=n);I&&tg(e,w);return l}for(m=d(e,m);!n.done;w++,n=h.next())n=y(m,e,w,n.value,k),null!==n&&(a&&null!==n.alternate&&m.delete(null===n.key?w:n.key),g=f(n,g,w),null===u?l=n:u.sibling=n,u=n);a&&m.forEach(function(a){return b(e,a)});I&&tg(e,w);return l}function J(a,d,f,h){\"object\"===typeof f&&null!==f&&f.type===ya&&null===f.key&&(f=f.props.children);if(\"object\"===typeof f&&null!==f){switch(f.$$typeof){case va:a:{for(var k=\nf.key,l=d;null!==l;){if(l.key===k){k=f.type;if(k===ya){if(7===l.tag){c(a,l.sibling);d=e(l,f.props.children);d.return=a;a=d;break a}}else if(l.elementType===k||\"object\"===typeof k&&null!==k&&k.$$typeof===Ha&&Ng(k)===l.type){c(a,l.sibling);d=e(l,f.props);d.ref=Lg(a,l,f);d.return=a;a=d;break a}c(a,l);break}else b(a,l);l=l.sibling}f.type===ya?(d=Tg(f.props.children,a.mode,h,f.key),d.return=a,a=d):(h=Rg(f.type,f.key,f.props,null,a.mode,h),h.ref=Lg(a,d,f),h.return=a,a=h)}return g(a);case wa:a:{for(l=f.key;null!==\nd;){if(d.key===l)if(4===d.tag&&d.stateNode.containerInfo===f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[]);d.return=a;a=d;break a}else{c(a,d);break}else b(a,d);d=d.sibling}d=Sg(f,a.mode,h);d.return=a;a=d}return g(a);case Ha:return l=f._init,J(a,d,l(f._payload),h)}if(eb(f))return n(a,d,f,h);if(Ka(f))return t(a,d,f,h);Mg(a,f)}return\"string\"===typeof f&&\"\"!==f||\"number\"===typeof f?(f=\"\"+f,null!==d&&6===d.tag?(c(a,d.sibling),d=e(d,f),d.return=a,a=d):\n(c(a,d),d=Qg(f,a.mode,h),d.return=a,a=d),g(a)):c(a,d)}return J}var Ug=Og(!0),Vg=Og(!1),Wg=Uf(null),Xg=null,Yg=null,Zg=null;function $g(){Zg=Yg=Xg=null}function ah(a){var b=Wg.current;E(Wg);a._currentValue=b}function bh(a,b,c){for(;null!==a;){var d=a.alternate;(a.childLanes&b)!==b?(a.childLanes|=b,null!==d&&(d.childLanes|=b)):null!==d&&(d.childLanes&b)!==b&&(d.childLanes|=b);if(a===c)break;a=a.return}}\nfunction ch(a,b){Xg=a;Zg=Yg=null;a=a.dependencies;null!==a&&null!==a.firstContext&&(0!==(a.lanes&b)&&(dh=!0),a.firstContext=null)}function eh(a){var b=a._currentValue;if(Zg!==a)if(a={context:a,memoizedValue:b,next:null},null===Yg){if(null===Xg)throw Error(p(308));Yg=a;Xg.dependencies={lanes:0,firstContext:a}}else Yg=Yg.next=a;return b}var fh=null;function gh(a){null===fh?fh=[a]:fh.push(a)}\nfunction hh(a,b,c,d){var e=b.interleaved;null===e?(c.next=c,gh(b)):(c.next=e.next,e.next=c);b.interleaved=c;return ih(a,d)}function ih(a,b){a.lanes|=b;var c=a.alternate;null!==c&&(c.lanes|=b);c=a;for(a=a.return;null!==a;)a.childLanes|=b,c=a.alternate,null!==c&&(c.childLanes|=b),c=a,a=a.return;return 3===c.tag?c.stateNode:null}var jh=!1;function kh(a){a.updateQueue={baseState:a.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}\nfunction lh(a,b){a=a.updateQueue;b.updateQueue===a&&(b.updateQueue={baseState:a.baseState,firstBaseUpdate:a.firstBaseUpdate,lastBaseUpdate:a.lastBaseUpdate,shared:a.shared,effects:a.effects})}function mh(a,b){return{eventTime:a,lane:b,tag:0,payload:null,callback:null,next:null}}\nfunction nh(a,b,c){var d=a.updateQueue;if(null===d)return null;d=d.shared;if(0!==(K&2)){var e=d.pending;null===e?b.next=b:(b.next=e.next,e.next=b);d.pending=b;return ih(a,c)}e=d.interleaved;null===e?(b.next=b,gh(d)):(b.next=e.next,e.next=b);d.interleaved=b;return ih(a,c)}function oh(a,b,c){b=b.updateQueue;if(null!==b&&(b=b.shared,0!==(c&4194240))){var d=b.lanes;d&=a.pendingLanes;c|=d;b.lanes=c;Cc(a,c)}}\nfunction ph(a,b){var c=a.updateQueue,d=a.alternate;if(null!==d&&(d=d.updateQueue,c===d)){var e=null,f=null;c=c.firstBaseUpdate;if(null!==c){do{var g={eventTime:c.eventTime,lane:c.lane,tag:c.tag,payload:c.payload,callback:c.callback,next:null};null===f?e=f=g:f=f.next=g;c=c.next}while(null!==c);null===f?e=f=b:f=f.next=b}else e=f=b;c={baseState:d.baseState,firstBaseUpdate:e,lastBaseUpdate:f,shared:d.shared,effects:d.effects};a.updateQueue=c;return}a=c.lastBaseUpdate;null===a?c.firstBaseUpdate=b:a.next=\nb;c.lastBaseUpdate=b}\nfunction qh(a,b,c,d){var e=a.updateQueue;jh=!1;var f=e.firstBaseUpdate,g=e.lastBaseUpdate,h=e.shared.pending;if(null!==h){e.shared.pending=null;var k=h,l=k.next;k.next=null;null===g?f=l:g.next=l;g=k;var m=a.alternate;null!==m&&(m=m.updateQueue,h=m.lastBaseUpdate,h!==g&&(null===h?m.firstBaseUpdate=l:h.next=l,m.lastBaseUpdate=k))}if(null!==f){var q=e.baseState;g=0;m=l=k=null;h=f;do{var r=h.lane,y=h.eventTime;if((d&r)===r){null!==m&&(m=m.next={eventTime:y,lane:0,tag:h.tag,payload:h.payload,callback:h.callback,\nnext:null});a:{var n=a,t=h;r=b;y=c;switch(t.tag){case 1:n=t.payload;if(\"function\"===typeof n){q=n.call(y,q,r);break a}q=n;break a;case 3:n.flags=n.flags&-65537|128;case 0:n=t.payload;r=\"function\"===typeof n?n.call(y,q,r):n;if(null===r||void 0===r)break a;q=A({},q,r);break a;case 2:jh=!0}}null!==h.callback&&0!==h.lane&&(a.flags|=64,r=e.effects,null===r?e.effects=[h]:r.push(h))}else y={eventTime:y,lane:r,tag:h.tag,payload:h.payload,callback:h.callback,next:null},null===m?(l=m=y,k=q):m=m.next=y,g|=r;\nh=h.next;if(null===h)if(h=e.shared.pending,null===h)break;else r=h,h=r.next,r.next=null,e.lastBaseUpdate=r,e.shared.pending=null}while(1);null===m&&(k=q);e.baseState=k;e.firstBaseUpdate=l;e.lastBaseUpdate=m;b=e.shared.interleaved;if(null!==b){e=b;do g|=e.lane,e=e.next;while(e!==b)}else null===f&&(e.shared.lanes=0);rh|=g;a.lanes=g;a.memoizedState=q}}\nfunction sh(a,b,c){a=b.effects;b.effects=null;if(null!==a)for(b=0;b<a.length;b++){var d=a[b],e=d.callback;if(null!==e){d.callback=null;d=c;if(\"function\"!==typeof e)throw Error(p(191,e));e.call(d)}}}var th={},uh=Uf(th),vh=Uf(th),wh=Uf(th);function xh(a){if(a===th)throw Error(p(174));return a}\nfunction yh(a,b){G(wh,b);G(vh,a);G(uh,th);a=b.nodeType;switch(a){case 9:case 11:b=(b=b.documentElement)?b.namespaceURI:lb(null,\"\");break;default:a=8===a?b.parentNode:b,b=a.namespaceURI||null,a=a.tagName,b=lb(b,a)}E(uh);G(uh,b)}function zh(){E(uh);E(vh);E(wh)}function Ah(a){xh(wh.current);var b=xh(uh.current);var c=lb(b,a.type);b!==c&&(G(vh,a),G(uh,c))}function Bh(a){vh.current===a&&(E(uh),E(vh))}var L=Uf(0);\nfunction Ch(a){for(var b=a;null!==b;){if(13===b.tag){var c=b.memoizedState;if(null!==c&&(c=c.dehydrated,null===c||\"$?\"===c.data||\"$!\"===c.data))return b}else if(19===b.tag&&void 0!==b.memoizedProps.revealOrder){if(0!==(b.flags&128))return b}else if(null!==b.child){b.child.return=b;b=b.child;continue}if(b===a)break;for(;null===b.sibling;){if(null===b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}return null}var Dh=[];\nfunction Eh(){for(var a=0;a<Dh.length;a++)Dh[a]._workInProgressVersionPrimary=null;Dh.length=0}var Fh=ua.ReactCurrentDispatcher,Gh=ua.ReactCurrentBatchConfig,Hh=0,M=null,N=null,O=null,Ih=!1,Jh=!1,Kh=0,Lh=0;function P(){throw Error(p(321));}function Mh(a,b){if(null===b)return!1;for(var c=0;c<b.length&&c<a.length;c++)if(!He(a[c],b[c]))return!1;return!0}\nfunction Nh(a,b,c,d,e,f){Hh=f;M=b;b.memoizedState=null;b.updateQueue=null;b.lanes=0;Fh.current=null===a||null===a.memoizedState?Oh:Ph;a=c(d,e);if(Jh){f=0;do{Jh=!1;Kh=0;if(25<=f)throw Error(p(301));f+=1;O=N=null;b.updateQueue=null;Fh.current=Qh;a=c(d,e)}while(Jh)}Fh.current=Rh;b=null!==N&&null!==N.next;Hh=0;O=N=M=null;Ih=!1;if(b)throw Error(p(300));return a}function Sh(){var a=0!==Kh;Kh=0;return a}\nfunction Th(){var a={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};null===O?M.memoizedState=O=a:O=O.next=a;return O}function Uh(){if(null===N){var a=M.alternate;a=null!==a?a.memoizedState:null}else a=N.next;var b=null===O?M.memoizedState:O.next;if(null!==b)O=b,N=a;else{if(null===a)throw Error(p(310));N=a;a={memoizedState:N.memoizedState,baseState:N.baseState,baseQueue:N.baseQueue,queue:N.queue,next:null};null===O?M.memoizedState=O=a:O=O.next=a}return O}\nfunction Vh(a,b){return\"function\"===typeof b?b(a):b}\nfunction Wh(a){var b=Uh(),c=b.queue;if(null===c)throw Error(p(311));c.lastRenderedReducer=a;var d=N,e=d.baseQueue,f=c.pending;if(null!==f){if(null!==e){var g=e.next;e.next=f.next;f.next=g}d.baseQueue=e=f;c.pending=null}if(null!==e){f=e.next;d=d.baseState;var h=g=null,k=null,l=f;do{var m=l.lane;if((Hh&m)===m)null!==k&&(k=k.next={lane:0,action:l.action,hasEagerState:l.hasEagerState,eagerState:l.eagerState,next:null}),d=l.hasEagerState?l.eagerState:a(d,l.action);else{var q={lane:m,action:l.action,hasEagerState:l.hasEagerState,\neagerState:l.eagerState,next:null};null===k?(h=k=q,g=d):k=k.next=q;M.lanes|=m;rh|=m}l=l.next}while(null!==l&&l!==f);null===k?g=d:k.next=h;He(d,b.memoizedState)||(dh=!0);b.memoizedState=d;b.baseState=g;b.baseQueue=k;c.lastRenderedState=d}a=c.interleaved;if(null!==a){e=a;do f=e.lane,M.lanes|=f,rh|=f,e=e.next;while(e!==a)}else null===e&&(c.lanes=0);return[b.memoizedState,c.dispatch]}\nfunction Xh(a){var b=Uh(),c=b.queue;if(null===c)throw Error(p(311));c.lastRenderedReducer=a;var d=c.dispatch,e=c.pending,f=b.memoizedState;if(null!==e){c.pending=null;var g=e=e.next;do f=a(f,g.action),g=g.next;while(g!==e);He(f,b.memoizedState)||(dh=!0);b.memoizedState=f;null===b.baseQueue&&(b.baseState=f);c.lastRenderedState=f}return[f,d]}function Yh(){}\nfunction Zh(a,b){var c=M,d=Uh(),e=b(),f=!He(d.memoizedState,e);f&&(d.memoizedState=e,dh=!0);d=d.queue;$h(ai.bind(null,c,d,a),[a]);if(d.getSnapshot!==b||f||null!==O&&O.memoizedState.tag&1){c.flags|=2048;bi(9,ci.bind(null,c,d,e,b),void 0,null);if(null===Q)throw Error(p(349));0!==(Hh&30)||di(c,b,e)}return e}function di(a,b,c){a.flags|=16384;a={getSnapshot:b,value:c};b=M.updateQueue;null===b?(b={lastEffect:null,stores:null},M.updateQueue=b,b.stores=[a]):(c=b.stores,null===c?b.stores=[a]:c.push(a))}\nfunction ci(a,b,c,d){b.value=c;b.getSnapshot=d;ei(b)&&fi(a)}function ai(a,b,c){return c(function(){ei(b)&&fi(a)})}function ei(a){var b=a.getSnapshot;a=a.value;try{var c=b();return!He(a,c)}catch(d){return!0}}function fi(a){var b=ih(a,1);null!==b&&gi(b,a,1,-1)}\nfunction hi(a){var b=Th();\"function\"===typeof a&&(a=a());b.memoizedState=b.baseState=a;a={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:Vh,lastRenderedState:a};b.queue=a;a=a.dispatch=ii.bind(null,M,a);return[b.memoizedState,a]}\nfunction bi(a,b,c,d){a={tag:a,create:b,destroy:c,deps:d,next:null};b=M.updateQueue;null===b?(b={lastEffect:null,stores:null},M.updateQueue=b,b.lastEffect=a.next=a):(c=b.lastEffect,null===c?b.lastEffect=a.next=a:(d=c.next,c.next=a,a.next=d,b.lastEffect=a));return a}function ji(){return Uh().memoizedState}function ki(a,b,c,d){var e=Th();M.flags|=a;e.memoizedState=bi(1|b,c,void 0,void 0===d?null:d)}\nfunction li(a,b,c,d){var e=Uh();d=void 0===d?null:d;var f=void 0;if(null!==N){var g=N.memoizedState;f=g.destroy;if(null!==d&&Mh(d,g.deps)){e.memoizedState=bi(b,c,f,d);return}}M.flags|=a;e.memoizedState=bi(1|b,c,f,d)}function mi(a,b){return ki(8390656,8,a,b)}function $h(a,b){return li(2048,8,a,b)}function ni(a,b){return li(4,2,a,b)}function oi(a,b){return li(4,4,a,b)}\nfunction pi(a,b){if(\"function\"===typeof b)return a=a(),b(a),function(){b(null)};if(null!==b&&void 0!==b)return a=a(),b.current=a,function(){b.current=null}}function qi(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return li(4,4,pi.bind(null,b,a),c)}function ri(){}function si(a,b){var c=Uh();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&Mh(b,d[1]))return d[0];c.memoizedState=[a,b];return a}\nfunction ti(a,b){var c=Uh();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&Mh(b,d[1]))return d[0];a=a();c.memoizedState=[a,b];return a}function ui(a,b,c){if(0===(Hh&21))return a.baseState&&(a.baseState=!1,dh=!0),a.memoizedState=c;He(c,b)||(c=yc(),M.lanes|=c,rh|=c,a.baseState=!0);return b}function vi(a,b){var c=C;C=0!==c&&4>c?c:4;a(!0);var d=Gh.transition;Gh.transition={};try{a(!1),b()}finally{C=c,Gh.transition=d}}function wi(){return Uh().memoizedState}\nfunction xi(a,b,c){var d=yi(a);c={lane:d,action:c,hasEagerState:!1,eagerState:null,next:null};if(zi(a))Ai(b,c);else if(c=hh(a,b,c,d),null!==c){var e=R();gi(c,a,d,e);Bi(c,b,d)}}\nfunction ii(a,b,c){var d=yi(a),e={lane:d,action:c,hasEagerState:!1,eagerState:null,next:null};if(zi(a))Ai(b,e);else{var f=a.alternate;if(0===a.lanes&&(null===f||0===f.lanes)&&(f=b.lastRenderedReducer,null!==f))try{var g=b.lastRenderedState,h=f(g,c);e.hasEagerState=!0;e.eagerState=h;if(He(h,g)){var k=b.interleaved;null===k?(e.next=e,gh(b)):(e.next=k.next,k.next=e);b.interleaved=e;return}}catch(l){}finally{}c=hh(a,b,e,d);null!==c&&(e=R(),gi(c,a,d,e),Bi(c,b,d))}}\nfunction zi(a){var b=a.alternate;return a===M||null!==b&&b===M}function Ai(a,b){Jh=Ih=!0;var c=a.pending;null===c?b.next=b:(b.next=c.next,c.next=b);a.pending=b}function Bi(a,b,c){if(0!==(c&4194240)){var d=b.lanes;d&=a.pendingLanes;c|=d;b.lanes=c;Cc(a,c)}}\nvar Rh={readContext:eh,useCallback:P,useContext:P,useEffect:P,useImperativeHandle:P,useInsertionEffect:P,useLayoutEffect:P,useMemo:P,useReducer:P,useRef:P,useState:P,useDebugValue:P,useDeferredValue:P,useTransition:P,useMutableSource:P,useSyncExternalStore:P,useId:P,unstable_isNewReconciler:!1},Oh={readContext:eh,useCallback:function(a,b){Th().memoizedState=[a,void 0===b?null:b];return a},useContext:eh,useEffect:mi,useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return ki(4194308,\n4,pi.bind(null,b,a),c)},useLayoutEffect:function(a,b){return ki(4194308,4,a,b)},useInsertionEffect:function(a,b){return ki(4,2,a,b)},useMemo:function(a,b){var c=Th();b=void 0===b?null:b;a=a();c.memoizedState=[a,b];return a},useReducer:function(a,b,c){var d=Th();b=void 0!==c?c(b):b;d.memoizedState=d.baseState=b;a={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:a,lastRenderedState:b};d.queue=a;a=a.dispatch=xi.bind(null,M,a);return[d.memoizedState,a]},useRef:function(a){var b=\nTh();a={current:a};return b.memoizedState=a},useState:hi,useDebugValue:ri,useDeferredValue:function(a){return Th().memoizedState=a},useTransition:function(){var a=hi(!1),b=a[0];a=vi.bind(null,a[1]);Th().memoizedState=a;return[b,a]},useMutableSource:function(){},useSyncExternalStore:function(a,b,c){var d=M,e=Th();if(I){if(void 0===c)throw Error(p(407));c=c()}else{c=b();if(null===Q)throw Error(p(349));0!==(Hh&30)||di(d,b,c)}e.memoizedState=c;var f={value:c,getSnapshot:b};e.queue=f;mi(ai.bind(null,d,\nf,a),[a]);d.flags|=2048;bi(9,ci.bind(null,d,f,c,b),void 0,null);return c},useId:function(){var a=Th(),b=Q.identifierPrefix;if(I){var c=sg;var d=rg;c=(d&~(1<<32-oc(d)-1)).toString(32)+c;b=\":\"+b+\"R\"+c;c=Kh++;0<c&&(b+=\"H\"+c.toString(32));b+=\":\"}else c=Lh++,b=\":\"+b+\"r\"+c.toString(32)+\":\";return a.memoizedState=b},unstable_isNewReconciler:!1},Ph={readContext:eh,useCallback:si,useContext:eh,useEffect:$h,useImperativeHandle:qi,useInsertionEffect:ni,useLayoutEffect:oi,useMemo:ti,useReducer:Wh,useRef:ji,useState:function(){return Wh(Vh)},\nuseDebugValue:ri,useDeferredValue:function(a){var b=Uh();return ui(b,N.memoizedState,a)},useTransition:function(){var a=Wh(Vh)[0],b=Uh().memoizedState;return[a,b]},useMutableSource:Yh,useSyncExternalStore:Zh,useId:wi,unstable_isNewReconciler:!1},Qh={readContext:eh,useCallback:si,useContext:eh,useEffect:$h,useImperativeHandle:qi,useInsertionEffect:ni,useLayoutEffect:oi,useMemo:ti,useReducer:Xh,useRef:ji,useState:function(){return Xh(Vh)},useDebugValue:ri,useDeferredValue:function(a){var b=Uh();return null===\nN?b.memoizedState=a:ui(b,N.memoizedState,a)},useTransition:function(){var a=Xh(Vh)[0],b=Uh().memoizedState;return[a,b]},useMutableSource:Yh,useSyncExternalStore:Zh,useId:wi,unstable_isNewReconciler:!1};function Ci(a,b){if(a&&a.defaultProps){b=A({},b);a=a.defaultProps;for(var c in a)void 0===b[c]&&(b[c]=a[c]);return b}return b}function Di(a,b,c,d){b=a.memoizedState;c=c(d,b);c=null===c||void 0===c?b:A({},b,c);a.memoizedState=c;0===a.lanes&&(a.updateQueue.baseState=c)}\nvar Ei={isMounted:function(a){return(a=a._reactInternals)?Vb(a)===a:!1},enqueueSetState:function(a,b,c){a=a._reactInternals;var d=R(),e=yi(a),f=mh(d,e);f.payload=b;void 0!==c&&null!==c&&(f.callback=c);b=nh(a,f,e);null!==b&&(gi(b,a,e,d),oh(b,a,e))},enqueueReplaceState:function(a,b,c){a=a._reactInternals;var d=R(),e=yi(a),f=mh(d,e);f.tag=1;f.payload=b;void 0!==c&&null!==c&&(f.callback=c);b=nh(a,f,e);null!==b&&(gi(b,a,e,d),oh(b,a,e))},enqueueForceUpdate:function(a,b){a=a._reactInternals;var c=R(),d=\nyi(a),e=mh(c,d);e.tag=2;void 0!==b&&null!==b&&(e.callback=b);b=nh(a,e,d);null!==b&&(gi(b,a,d,c),oh(b,a,d))}};function Fi(a,b,c,d,e,f,g){a=a.stateNode;return\"function\"===typeof a.shouldComponentUpdate?a.shouldComponentUpdate(d,f,g):b.prototype&&b.prototype.isPureReactComponent?!Ie(c,d)||!Ie(e,f):!0}\nfunction Gi(a,b,c){var d=!1,e=Vf;var f=b.contextType;\"object\"===typeof f&&null!==f?f=eh(f):(e=Zf(b)?Xf:H.current,d=b.contextTypes,f=(d=null!==d&&void 0!==d)?Yf(a,e):Vf);b=new b(c,f);a.memoizedState=null!==b.state&&void 0!==b.state?b.state:null;b.updater=Ei;a.stateNode=b;b._reactInternals=a;d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=e,a.__reactInternalMemoizedMaskedChildContext=f);return b}\nfunction Hi(a,b,c,d){a=b.state;\"function\"===typeof b.componentWillReceiveProps&&b.componentWillReceiveProps(c,d);\"function\"===typeof b.UNSAFE_componentWillReceiveProps&&b.UNSAFE_componentWillReceiveProps(c,d);b.state!==a&&Ei.enqueueReplaceState(b,b.state,null)}\nfunction Ii(a,b,c,d){var e=a.stateNode;e.props=c;e.state=a.memoizedState;e.refs={};kh(a);var f=b.contextType;\"object\"===typeof f&&null!==f?e.context=eh(f):(f=Zf(b)?Xf:H.current,e.context=Yf(a,f));e.state=a.memoizedState;f=b.getDerivedStateFromProps;\"function\"===typeof f&&(Di(a,b,f,c),e.state=a.memoizedState);\"function\"===typeof b.getDerivedStateFromProps||\"function\"===typeof e.getSnapshotBeforeUpdate||\"function\"!==typeof e.UNSAFE_componentWillMount&&\"function\"!==typeof e.componentWillMount||(b=e.state,\n\"function\"===typeof e.componentWillMount&&e.componentWillMount(),\"function\"===typeof e.UNSAFE_componentWillMount&&e.UNSAFE_componentWillMount(),b!==e.state&&Ei.enqueueReplaceState(e,e.state,null),qh(a,c,e,d),e.state=a.memoizedState);\"function\"===typeof e.componentDidMount&&(a.flags|=4194308)}function Ji(a,b){try{var c=\"\",d=b;do c+=Pa(d),d=d.return;while(d);var e=c}catch(f){e=\"\\nError generating stack: \"+f.message+\"\\n\"+f.stack}return{value:a,source:b,stack:e,digest:null}}\nfunction Ki(a,b,c){return{value:a,source:null,stack:null!=c?c:null,digest:null!=b?b:null}}function Li(a,b){try{console.error(b.value)}catch(c){setTimeout(function(){throw c;})}}var Mi=\"function\"===typeof WeakMap?WeakMap:Map;function Ni(a,b,c){c=mh(-1,c);c.tag=3;c.payload={element:null};var d=b.value;c.callback=function(){Oi||(Oi=!0,Pi=d);Li(a,b)};return c}\nfunction Qi(a,b,c){c=mh(-1,c);c.tag=3;var d=a.type.getDerivedStateFromError;if(\"function\"===typeof d){var e=b.value;c.payload=function(){return d(e)};c.callback=function(){Li(a,b)}}var f=a.stateNode;null!==f&&\"function\"===typeof f.componentDidCatch&&(c.callback=function(){Li(a,b);\"function\"!==typeof d&&(null===Ri?Ri=new Set([this]):Ri.add(this));var c=b.stack;this.componentDidCatch(b.value,{componentStack:null!==c?c:\"\"})});return c}\nfunction Si(a,b,c){var d=a.pingCache;if(null===d){d=a.pingCache=new Mi;var e=new Set;d.set(b,e)}else e=d.get(b),void 0===e&&(e=new Set,d.set(b,e));e.has(c)||(e.add(c),a=Ti.bind(null,a,b,c),b.then(a,a))}function Ui(a){do{var b;if(b=13===a.tag)b=a.memoizedState,b=null!==b?null!==b.dehydrated?!0:!1:!0;if(b)return a;a=a.return}while(null!==a);return null}\nfunction Vi(a,b,c,d,e){if(0===(a.mode&1))return a===b?a.flags|=65536:(a.flags|=128,c.flags|=131072,c.flags&=-52805,1===c.tag&&(null===c.alternate?c.tag=17:(b=mh(-1,1),b.tag=2,nh(c,b,1))),c.lanes|=1),a;a.flags|=65536;a.lanes=e;return a}var Wi=ua.ReactCurrentOwner,dh=!1;function Xi(a,b,c,d){b.child=null===a?Vg(b,null,c,d):Ug(b,a.child,c,d)}\nfunction Yi(a,b,c,d,e){c=c.render;var f=b.ref;ch(b,e);d=Nh(a,b,c,d,f,e);c=Sh();if(null!==a&&!dh)return b.updateQueue=a.updateQueue,b.flags&=-2053,a.lanes&=~e,Zi(a,b,e);I&&c&&vg(b);b.flags|=1;Xi(a,b,d,e);return b.child}\nfunction $i(a,b,c,d,e){if(null===a){var f=c.type;if(\"function\"===typeof f&&!aj(f)&&void 0===f.defaultProps&&null===c.compare&&void 0===c.defaultProps)return b.tag=15,b.type=f,bj(a,b,f,d,e);a=Rg(c.type,null,d,b,b.mode,e);a.ref=b.ref;a.return=b;return b.child=a}f=a.child;if(0===(a.lanes&e)){var g=f.memoizedProps;c=c.compare;c=null!==c?c:Ie;if(c(g,d)&&a.ref===b.ref)return Zi(a,b,e)}b.flags|=1;a=Pg(f,d);a.ref=b.ref;a.return=b;return b.child=a}\nfunction bj(a,b,c,d,e){if(null!==a){var f=a.memoizedProps;if(Ie(f,d)&&a.ref===b.ref)if(dh=!1,b.pendingProps=d=f,0!==(a.lanes&e))0!==(a.flags&131072)&&(dh=!0);else return b.lanes=a.lanes,Zi(a,b,e)}return cj(a,b,c,d,e)}\nfunction dj(a,b,c){var d=b.pendingProps,e=d.children,f=null!==a?a.memoizedState:null;if(\"hidden\"===d.mode)if(0===(b.mode&1))b.memoizedState={baseLanes:0,cachePool:null,transitions:null},G(ej,fj),fj|=c;else{if(0===(c&1073741824))return a=null!==f?f.baseLanes|c:c,b.lanes=b.childLanes=1073741824,b.memoizedState={baseLanes:a,cachePool:null,transitions:null},b.updateQueue=null,G(ej,fj),fj|=a,null;b.memoizedState={baseLanes:0,cachePool:null,transitions:null};d=null!==f?f.baseLanes:c;G(ej,fj);fj|=d}else null!==\nf?(d=f.baseLanes|c,b.memoizedState=null):d=c,G(ej,fj),fj|=d;Xi(a,b,e,c);return b.child}function gj(a,b){var c=b.ref;if(null===a&&null!==c||null!==a&&a.ref!==c)b.flags|=512,b.flags|=2097152}function cj(a,b,c,d,e){var f=Zf(c)?Xf:H.current;f=Yf(b,f);ch(b,e);c=Nh(a,b,c,d,f,e);d=Sh();if(null!==a&&!dh)return b.updateQueue=a.updateQueue,b.flags&=-2053,a.lanes&=~e,Zi(a,b,e);I&&d&&vg(b);b.flags|=1;Xi(a,b,c,e);return b.child}\nfunction hj(a,b,c,d,e){if(Zf(c)){var f=!0;cg(b)}else f=!1;ch(b,e);if(null===b.stateNode)ij(a,b),Gi(b,c,d),Ii(b,c,d,e),d=!0;else if(null===a){var g=b.stateNode,h=b.memoizedProps;g.props=h;var k=g.context,l=c.contextType;\"object\"===typeof l&&null!==l?l=eh(l):(l=Zf(c)?Xf:H.current,l=Yf(b,l));var m=c.getDerivedStateFromProps,q=\"function\"===typeof m||\"function\"===typeof g.getSnapshotBeforeUpdate;q||\"function\"!==typeof g.UNSAFE_componentWillReceiveProps&&\"function\"!==typeof g.componentWillReceiveProps||\n(h!==d||k!==l)&&Hi(b,g,d,l);jh=!1;var r=b.memoizedState;g.state=r;qh(b,d,g,e);k=b.memoizedState;h!==d||r!==k||Wf.current||jh?(\"function\"===typeof m&&(Di(b,c,m,d),k=b.memoizedState),(h=jh||Fi(b,c,h,d,r,k,l))?(q||\"function\"!==typeof g.UNSAFE_componentWillMount&&\"function\"!==typeof g.componentWillMount||(\"function\"===typeof g.componentWillMount&&g.componentWillMount(),\"function\"===typeof g.UNSAFE_componentWillMount&&g.UNSAFE_componentWillMount()),\"function\"===typeof g.componentDidMount&&(b.flags|=4194308)):\n(\"function\"===typeof g.componentDidMount&&(b.flags|=4194308),b.memoizedProps=d,b.memoizedState=k),g.props=d,g.state=k,g.context=l,d=h):(\"function\"===typeof g.componentDidMount&&(b.flags|=4194308),d=!1)}else{g=b.stateNode;lh(a,b);h=b.memoizedProps;l=b.type===b.elementType?h:Ci(b.type,h);g.props=l;q=b.pendingProps;r=g.context;k=c.contextType;\"object\"===typeof k&&null!==k?k=eh(k):(k=Zf(c)?Xf:H.current,k=Yf(b,k));var y=c.getDerivedStateFromProps;(m=\"function\"===typeof y||\"function\"===typeof g.getSnapshotBeforeUpdate)||\n\"function\"!==typeof g.UNSAFE_componentWillReceiveProps&&\"function\"!==typeof g.componentWillReceiveProps||(h!==q||r!==k)&&Hi(b,g,d,k);jh=!1;r=b.memoizedState;g.state=r;qh(b,d,g,e);var n=b.memoizedState;h!==q||r!==n||Wf.current||jh?(\"function\"===typeof y&&(Di(b,c,y,d),n=b.memoizedState),(l=jh||Fi(b,c,l,d,r,n,k)||!1)?(m||\"function\"!==typeof g.UNSAFE_componentWillUpdate&&\"function\"!==typeof g.componentWillUpdate||(\"function\"===typeof g.componentWillUpdate&&g.componentWillUpdate(d,n,k),\"function\"===typeof g.UNSAFE_componentWillUpdate&&\ng.UNSAFE_componentWillUpdate(d,n,k)),\"function\"===typeof g.componentDidUpdate&&(b.flags|=4),\"function\"===typeof g.getSnapshotBeforeUpdate&&(b.flags|=1024)):(\"function\"!==typeof g.componentDidUpdate||h===a.memoizedProps&&r===a.memoizedState||(b.flags|=4),\"function\"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&r===a.memoizedState||(b.flags|=1024),b.memoizedProps=d,b.memoizedState=n),g.props=d,g.state=n,g.context=k,d=l):(\"function\"!==typeof g.componentDidUpdate||h===a.memoizedProps&&r===\na.memoizedState||(b.flags|=4),\"function\"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&r===a.memoizedState||(b.flags|=1024),d=!1)}return jj(a,b,c,d,f,e)}\nfunction jj(a,b,c,d,e,f){gj(a,b);var g=0!==(b.flags&128);if(!d&&!g)return e&&dg(b,c,!1),Zi(a,b,f);d=b.stateNode;Wi.current=b;var h=g&&\"function\"!==typeof c.getDerivedStateFromError?null:d.render();b.flags|=1;null!==a&&g?(b.child=Ug(b,a.child,null,f),b.child=Ug(b,null,h,f)):Xi(a,b,h,f);b.memoizedState=d.state;e&&dg(b,c,!0);return b.child}function kj(a){var b=a.stateNode;b.pendingContext?ag(a,b.pendingContext,b.pendingContext!==b.context):b.context&&ag(a,b.context,!1);yh(a,b.containerInfo)}\nfunction lj(a,b,c,d,e){Ig();Jg(e);b.flags|=256;Xi(a,b,c,d);return b.child}var mj={dehydrated:null,treeContext:null,retryLane:0};function nj(a){return{baseLanes:a,cachePool:null,transitions:null}}\nfunction oj(a,b,c){var d=b.pendingProps,e=L.current,f=!1,g=0!==(b.flags&128),h;(h=g)||(h=null!==a&&null===a.memoizedState?!1:0!==(e&2));if(h)f=!0,b.flags&=-129;else if(null===a||null!==a.memoizedState)e|=1;G(L,e&1);if(null===a){Eg(b);a=b.memoizedState;if(null!==a&&(a=a.dehydrated,null!==a))return 0===(b.mode&1)?b.lanes=1:\"$!\"===a.data?b.lanes=8:b.lanes=1073741824,null;g=d.children;a=d.fallback;return f?(d=b.mode,f=b.child,g={mode:\"hidden\",children:g},0===(d&1)&&null!==f?(f.childLanes=0,f.pendingProps=\ng):f=pj(g,d,0,null),a=Tg(a,d,c,null),f.return=b,a.return=b,f.sibling=a,b.child=f,b.child.memoizedState=nj(c),b.memoizedState=mj,a):qj(b,g)}e=a.memoizedState;if(null!==e&&(h=e.dehydrated,null!==h))return rj(a,b,g,d,h,e,c);if(f){f=d.fallback;g=b.mode;e=a.child;h=e.sibling;var k={mode:\"hidden\",children:d.children};0===(g&1)&&b.child!==e?(d=b.child,d.childLanes=0,d.pendingProps=k,b.deletions=null):(d=Pg(e,k),d.subtreeFlags=e.subtreeFlags&14680064);null!==h?f=Pg(h,f):(f=Tg(f,g,c,null),f.flags|=2);f.return=\nb;d.return=b;d.sibling=f;b.child=d;d=f;f=b.child;g=a.child.memoizedState;g=null===g?nj(c):{baseLanes:g.baseLanes|c,cachePool:null,transitions:g.transitions};f.memoizedState=g;f.childLanes=a.childLanes&~c;b.memoizedState=mj;return d}f=a.child;a=f.sibling;d=Pg(f,{mode:\"visible\",children:d.children});0===(b.mode&1)&&(d.lanes=c);d.return=b;d.sibling=null;null!==a&&(c=b.deletions,null===c?(b.deletions=[a],b.flags|=16):c.push(a));b.child=d;b.memoizedState=null;return d}\nfunction qj(a,b){b=pj({mode:\"visible\",children:b},a.mode,0,null);b.return=a;return a.child=b}function sj(a,b,c,d){null!==d&&Jg(d);Ug(b,a.child,null,c);a=qj(b,b.pendingProps.children);a.flags|=2;b.memoizedState=null;return a}\nfunction rj(a,b,c,d,e,f,g){if(c){if(b.flags&256)return b.flags&=-257,d=Ki(Error(p(422))),sj(a,b,g,d);if(null!==b.memoizedState)return b.child=a.child,b.flags|=128,null;f=d.fallback;e=b.mode;d=pj({mode:\"visible\",children:d.children},e,0,null);f=Tg(f,e,g,null);f.flags|=2;d.return=b;f.return=b;d.sibling=f;b.child=d;0!==(b.mode&1)&&Ug(b,a.child,null,g);b.child.memoizedState=nj(g);b.memoizedState=mj;return f}if(0===(b.mode&1))return sj(a,b,g,null);if(\"$!\"===e.data){d=e.nextSibling&&e.nextSibling.dataset;\nif(d)var h=d.dgst;d=h;f=Error(p(419));d=Ki(f,d,void 0);return sj(a,b,g,d)}h=0!==(g&a.childLanes);if(dh||h){d=Q;if(null!==d){switch(g&-g){case 4:e=2;break;case 16:e=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:e=32;break;case 536870912:e=268435456;break;default:e=0}e=0!==(e&(d.suspendedLanes|g))?0:e;\n0!==e&&e!==f.retryLane&&(f.retryLane=e,ih(a,e),gi(d,a,e,-1))}tj();d=Ki(Error(p(421)));return sj(a,b,g,d)}if(\"$?\"===e.data)return b.flags|=128,b.child=a.child,b=uj.bind(null,a),e._reactRetry=b,null;a=f.treeContext;yg=Lf(e.nextSibling);xg=b;I=!0;zg=null;null!==a&&(og[pg++]=rg,og[pg++]=sg,og[pg++]=qg,rg=a.id,sg=a.overflow,qg=b);b=qj(b,d.children);b.flags|=4096;return b}function vj(a,b,c){a.lanes|=b;var d=a.alternate;null!==d&&(d.lanes|=b);bh(a.return,b,c)}\nfunction wj(a,b,c,d,e){var f=a.memoizedState;null===f?a.memoizedState={isBackwards:b,rendering:null,renderingStartTime:0,last:d,tail:c,tailMode:e}:(f.isBackwards=b,f.rendering=null,f.renderingStartTime=0,f.last=d,f.tail=c,f.tailMode=e)}\nfunction xj(a,b,c){var d=b.pendingProps,e=d.revealOrder,f=d.tail;Xi(a,b,d.children,c);d=L.current;if(0!==(d&2))d=d&1|2,b.flags|=128;else{if(null!==a&&0!==(a.flags&128))a:for(a=b.child;null!==a;){if(13===a.tag)null!==a.memoizedState&&vj(a,c,b);else if(19===a.tag)vj(a,c,b);else if(null!==a.child){a.child.return=a;a=a.child;continue}if(a===b)break a;for(;null===a.sibling;){if(null===a.return||a.return===b)break a;a=a.return}a.sibling.return=a.return;a=a.sibling}d&=1}G(L,d);if(0===(b.mode&1))b.memoizedState=\nnull;else switch(e){case \"forwards\":c=b.child;for(e=null;null!==c;)a=c.alternate,null!==a&&null===Ch(a)&&(e=c),c=c.sibling;c=e;null===c?(e=b.child,b.child=null):(e=c.sibling,c.sibling=null);wj(b,!1,e,c,f);break;case \"backwards\":c=null;e=b.child;for(b.child=null;null!==e;){a=e.alternate;if(null!==a&&null===Ch(a)){b.child=e;break}a=e.sibling;e.sibling=c;c=e;e=a}wj(b,!0,c,null,f);break;case \"together\":wj(b,!1,null,null,void 0);break;default:b.memoizedState=null}return b.child}\nfunction ij(a,b){0===(b.mode&1)&&null!==a&&(a.alternate=null,b.alternate=null,b.flags|=2)}function Zi(a,b,c){null!==a&&(b.dependencies=a.dependencies);rh|=b.lanes;if(0===(c&b.childLanes))return null;if(null!==a&&b.child!==a.child)throw Error(p(153));if(null!==b.child){a=b.child;c=Pg(a,a.pendingProps);b.child=c;for(c.return=b;null!==a.sibling;)a=a.sibling,c=c.sibling=Pg(a,a.pendingProps),c.return=b;c.sibling=null}return b.child}\nfunction yj(a,b,c){switch(b.tag){case 3:kj(b);Ig();break;case 5:Ah(b);break;case 1:Zf(b.type)&&cg(b);break;case 4:yh(b,b.stateNode.containerInfo);break;case 10:var d=b.type._context,e=b.memoizedProps.value;G(Wg,d._currentValue);d._currentValue=e;break;case 13:d=b.memoizedState;if(null!==d){if(null!==d.dehydrated)return G(L,L.current&1),b.flags|=128,null;if(0!==(c&b.child.childLanes))return oj(a,b,c);G(L,L.current&1);a=Zi(a,b,c);return null!==a?a.sibling:null}G(L,L.current&1);break;case 19:d=0!==(c&\nb.childLanes);if(0!==(a.flags&128)){if(d)return xj(a,b,c);b.flags|=128}e=b.memoizedState;null!==e&&(e.rendering=null,e.tail=null,e.lastEffect=null);G(L,L.current);if(d)break;else return null;case 22:case 23:return b.lanes=0,dj(a,b,c)}return Zi(a,b,c)}var zj,Aj,Bj,Cj;\nzj=function(a,b){for(var c=b.child;null!==c;){if(5===c.tag||6===c.tag)a.appendChild(c.stateNode);else if(4!==c.tag&&null!==c.child){c.child.return=c;c=c.child;continue}if(c===b)break;for(;null===c.sibling;){if(null===c.return||c.return===b)return;c=c.return}c.sibling.return=c.return;c=c.sibling}};Aj=function(){};\nBj=function(a,b,c,d){var e=a.memoizedProps;if(e!==d){a=b.stateNode;xh(uh.current);var f=null;switch(c){case \"input\":e=Ya(a,e);d=Ya(a,d);f=[];break;case \"select\":e=A({},e,{value:void 0});d=A({},d,{value:void 0});f=[];break;case \"textarea\":e=gb(a,e);d=gb(a,d);f=[];break;default:\"function\"!==typeof e.onClick&&\"function\"===typeof d.onClick&&(a.onclick=Bf)}ub(c,d);var g;c=null;for(l in e)if(!d.hasOwnProperty(l)&&e.hasOwnProperty(l)&&null!=e[l])if(\"style\"===l){var h=e[l];for(g in h)h.hasOwnProperty(g)&&\n(c||(c={}),c[g]=\"\")}else\"dangerouslySetInnerHTML\"!==l&&\"children\"!==l&&\"suppressContentEditableWarning\"!==l&&\"suppressHydrationWarning\"!==l&&\"autoFocus\"!==l&&(ea.hasOwnProperty(l)?f||(f=[]):(f=f||[]).push(l,null));for(l in d){var k=d[l];h=null!=e?e[l]:void 0;if(d.hasOwnProperty(l)&&k!==h&&(null!=k||null!=h))if(\"style\"===l)if(h){for(g in h)!h.hasOwnProperty(g)||k&&k.hasOwnProperty(g)||(c||(c={}),c[g]=\"\");for(g in k)k.hasOwnProperty(g)&&h[g]!==k[g]&&(c||(c={}),c[g]=k[g])}else c||(f||(f=[]),f.push(l,\nc)),c=k;else\"dangerouslySetInnerHTML\"===l?(k=k?k.__html:void 0,h=h?h.__html:void 0,null!=k&&h!==k&&(f=f||[]).push(l,k)):\"children\"===l?\"string\"!==typeof k&&\"number\"!==typeof k||(f=f||[]).push(l,\"\"+k):\"suppressContentEditableWarning\"!==l&&\"suppressHydrationWarning\"!==l&&(ea.hasOwnProperty(l)?(null!=k&&\"onScroll\"===l&&D(\"scroll\",a),f||h===k||(f=[])):(f=f||[]).push(l,k))}c&&(f=f||[]).push(\"style\",c);var l=f;if(b.updateQueue=l)b.flags|=4}};Cj=function(a,b,c,d){c!==d&&(b.flags|=4)};\nfunction Dj(a,b){if(!I)switch(a.tailMode){case \"hidden\":b=a.tail;for(var c=null;null!==b;)null!==b.alternate&&(c=b),b=b.sibling;null===c?a.tail=null:c.sibling=null;break;case \"collapsed\":c=a.tail;for(var d=null;null!==c;)null!==c.alternate&&(d=c),c=c.sibling;null===d?b||null===a.tail?a.tail=null:a.tail.sibling=null:d.sibling=null}}\nfunction S(a){var b=null!==a.alternate&&a.alternate.child===a.child,c=0,d=0;if(b)for(var e=a.child;null!==e;)c|=e.lanes|e.childLanes,d|=e.subtreeFlags&14680064,d|=e.flags&14680064,e.return=a,e=e.sibling;else for(e=a.child;null!==e;)c|=e.lanes|e.childLanes,d|=e.subtreeFlags,d|=e.flags,e.return=a,e=e.sibling;a.subtreeFlags|=d;a.childLanes=c;return b}\nfunction Ej(a,b,c){var d=b.pendingProps;wg(b);switch(b.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return S(b),null;case 1:return Zf(b.type)&&$f(),S(b),null;case 3:d=b.stateNode;zh();E(Wf);E(H);Eh();d.pendingContext&&(d.context=d.pendingContext,d.pendingContext=null);if(null===a||null===a.child)Gg(b)?b.flags|=4:null===a||a.memoizedState.isDehydrated&&0===(b.flags&256)||(b.flags|=1024,null!==zg&&(Fj(zg),zg=null));Aj(a,b);S(b);return null;case 5:Bh(b);var e=xh(wh.current);\nc=b.type;if(null!==a&&null!=b.stateNode)Bj(a,b,c,d,e),a.ref!==b.ref&&(b.flags|=512,b.flags|=2097152);else{if(!d){if(null===b.stateNode)throw Error(p(166));S(b);return null}a=xh(uh.current);if(Gg(b)){d=b.stateNode;c=b.type;var f=b.memoizedProps;d[Of]=b;d[Pf]=f;a=0!==(b.mode&1);switch(c){case \"dialog\":D(\"cancel\",d);D(\"close\",d);break;case \"iframe\":case \"object\":case \"embed\":D(\"load\",d);break;case \"video\":case \"audio\":for(e=0;e<lf.length;e++)D(lf[e],d);break;case \"source\":D(\"error\",d);break;case \"img\":case \"image\":case \"link\":D(\"error\",\nd);D(\"load\",d);break;case \"details\":D(\"toggle\",d);break;case \"input\":Za(d,f);D(\"invalid\",d);break;case \"select\":d._wrapperState={wasMultiple:!!f.multiple};D(\"invalid\",d);break;case \"textarea\":hb(d,f),D(\"invalid\",d)}ub(c,f);e=null;for(var g in f)if(f.hasOwnProperty(g)){var h=f[g];\"children\"===g?\"string\"===typeof h?d.textContent!==h&&(!0!==f.suppressHydrationWarning&&Af(d.textContent,h,a),e=[\"children\",h]):\"number\"===typeof h&&d.textContent!==\"\"+h&&(!0!==f.suppressHydrationWarning&&Af(d.textContent,\nh,a),e=[\"children\",\"\"+h]):ea.hasOwnProperty(g)&&null!=h&&\"onScroll\"===g&&D(\"scroll\",d)}switch(c){case \"input\":Va(d);db(d,f,!0);break;case \"textarea\":Va(d);jb(d);break;case \"select\":case \"option\":break;default:\"function\"===typeof f.onClick&&(d.onclick=Bf)}d=e;b.updateQueue=d;null!==d&&(b.flags|=4)}else{g=9===e.nodeType?e:e.ownerDocument;\"http://www.w3.org/1999/xhtml\"===a&&(a=kb(c));\"http://www.w3.org/1999/xhtml\"===a?\"script\"===c?(a=g.createElement(\"div\"),a.innerHTML=\"<script>\\x3c/script>\",a=a.removeChild(a.firstChild)):\n\"string\"===typeof d.is?a=g.createElement(c,{is:d.is}):(a=g.createElement(c),\"select\"===c&&(g=a,d.multiple?g.multiple=!0:d.size&&(g.size=d.size))):a=g.createElementNS(a,c);a[Of]=b;a[Pf]=d;zj(a,b,!1,!1);b.stateNode=a;a:{g=vb(c,d);switch(c){case \"dialog\":D(\"cancel\",a);D(\"close\",a);e=d;break;case \"iframe\":case \"object\":case \"embed\":D(\"load\",a);e=d;break;case \"video\":case \"audio\":for(e=0;e<lf.length;e++)D(lf[e],a);e=d;break;case \"source\":D(\"error\",a);e=d;break;case \"img\":case \"image\":case \"link\":D(\"error\",\na);D(\"load\",a);e=d;break;case \"details\":D(\"toggle\",a);e=d;break;case \"input\":Za(a,d);e=Ya(a,d);D(\"invalid\",a);break;case \"option\":e=d;break;case \"select\":a._wrapperState={wasMultiple:!!d.multiple};e=A({},d,{value:void 0});D(\"invalid\",a);break;case \"textarea\":hb(a,d);e=gb(a,d);D(\"invalid\",a);break;default:e=d}ub(c,e);h=e;for(f in h)if(h.hasOwnProperty(f)){var k=h[f];\"style\"===f?sb(a,k):\"dangerouslySetInnerHTML\"===f?(k=k?k.__html:void 0,null!=k&&nb(a,k)):\"children\"===f?\"string\"===typeof k?(\"textarea\"!==\nc||\"\"!==k)&&ob(a,k):\"number\"===typeof k&&ob(a,\"\"+k):\"suppressContentEditableWarning\"!==f&&\"suppressHydrationWarning\"!==f&&\"autoFocus\"!==f&&(ea.hasOwnProperty(f)?null!=k&&\"onScroll\"===f&&D(\"scroll\",a):null!=k&&ta(a,f,k,g))}switch(c){case \"input\":Va(a);db(a,d,!1);break;case \"textarea\":Va(a);jb(a);break;case \"option\":null!=d.value&&a.setAttribute(\"value\",\"\"+Sa(d.value));break;case \"select\":a.multiple=!!d.multiple;f=d.value;null!=f?fb(a,!!d.multiple,f,!1):null!=d.defaultValue&&fb(a,!!d.multiple,d.defaultValue,\n!0);break;default:\"function\"===typeof e.onClick&&(a.onclick=Bf)}switch(c){case \"button\":case \"input\":case \"select\":case \"textarea\":d=!!d.autoFocus;break a;case \"img\":d=!0;break a;default:d=!1}}d&&(b.flags|=4)}null!==b.ref&&(b.flags|=512,b.flags|=2097152)}S(b);return null;case 6:if(a&&null!=b.stateNode)Cj(a,b,a.memoizedProps,d);else{if(\"string\"!==typeof d&&null===b.stateNode)throw Error(p(166));c=xh(wh.current);xh(uh.current);if(Gg(b)){d=b.stateNode;c=b.memoizedProps;d[Of]=b;if(f=d.nodeValue!==c)if(a=\nxg,null!==a)switch(a.tag){case 3:Af(d.nodeValue,c,0!==(a.mode&1));break;case 5:!0!==a.memoizedProps.suppressHydrationWarning&&Af(d.nodeValue,c,0!==(a.mode&1))}f&&(b.flags|=4)}else d=(9===c.nodeType?c:c.ownerDocument).createTextNode(d),d[Of]=b,b.stateNode=d}S(b);return null;case 13:E(L);d=b.memoizedState;if(null===a||null!==a.memoizedState&&null!==a.memoizedState.dehydrated){if(I&&null!==yg&&0!==(b.mode&1)&&0===(b.flags&128))Hg(),Ig(),b.flags|=98560,f=!1;else if(f=Gg(b),null!==d&&null!==d.dehydrated){if(null===\na){if(!f)throw Error(p(318));f=b.memoizedState;f=null!==f?f.dehydrated:null;if(!f)throw Error(p(317));f[Of]=b}else Ig(),0===(b.flags&128)&&(b.memoizedState=null),b.flags|=4;S(b);f=!1}else null!==zg&&(Fj(zg),zg=null),f=!0;if(!f)return b.flags&65536?b:null}if(0!==(b.flags&128))return b.lanes=c,b;d=null!==d;d!==(null!==a&&null!==a.memoizedState)&&d&&(b.child.flags|=8192,0!==(b.mode&1)&&(null===a||0!==(L.current&1)?0===T&&(T=3):tj()));null!==b.updateQueue&&(b.flags|=4);S(b);return null;case 4:return zh(),\nAj(a,b),null===a&&sf(b.stateNode.containerInfo),S(b),null;case 10:return ah(b.type._context),S(b),null;case 17:return Zf(b.type)&&$f(),S(b),null;case 19:E(L);f=b.memoizedState;if(null===f)return S(b),null;d=0!==(b.flags&128);g=f.rendering;if(null===g)if(d)Dj(f,!1);else{if(0!==T||null!==a&&0!==(a.flags&128))for(a=b.child;null!==a;){g=Ch(a);if(null!==g){b.flags|=128;Dj(f,!1);d=g.updateQueue;null!==d&&(b.updateQueue=d,b.flags|=4);b.subtreeFlags=0;d=c;for(c=b.child;null!==c;)f=c,a=d,f.flags&=14680066,\ng=f.alternate,null===g?(f.childLanes=0,f.lanes=a,f.child=null,f.subtreeFlags=0,f.memoizedProps=null,f.memoizedState=null,f.updateQueue=null,f.dependencies=null,f.stateNode=null):(f.childLanes=g.childLanes,f.lanes=g.lanes,f.child=g.child,f.subtreeFlags=0,f.deletions=null,f.memoizedProps=g.memoizedProps,f.memoizedState=g.memoizedState,f.updateQueue=g.updateQueue,f.type=g.type,a=g.dependencies,f.dependencies=null===a?null:{lanes:a.lanes,firstContext:a.firstContext}),c=c.sibling;G(L,L.current&1|2);return b.child}a=\na.sibling}null!==f.tail&&B()>Gj&&(b.flags|=128,d=!0,Dj(f,!1),b.lanes=4194304)}else{if(!d)if(a=Ch(g),null!==a){if(b.flags|=128,d=!0,c=a.updateQueue,null!==c&&(b.updateQueue=c,b.flags|=4),Dj(f,!0),null===f.tail&&\"hidden\"===f.tailMode&&!g.alternate&&!I)return S(b),null}else 2*B()-f.renderingStartTime>Gj&&1073741824!==c&&(b.flags|=128,d=!0,Dj(f,!1),b.lanes=4194304);f.isBackwards?(g.sibling=b.child,b.child=g):(c=f.last,null!==c?c.sibling=g:b.child=g,f.last=g)}if(null!==f.tail)return b=f.tail,f.rendering=\nb,f.tail=b.sibling,f.renderingStartTime=B(),b.sibling=null,c=L.current,G(L,d?c&1|2:c&1),b;S(b);return null;case 22:case 23:return Hj(),d=null!==b.memoizedState,null!==a&&null!==a.memoizedState!==d&&(b.flags|=8192),d&&0!==(b.mode&1)?0!==(fj&1073741824)&&(S(b),b.subtreeFlags&6&&(b.flags|=8192)):S(b),null;case 24:return null;case 25:return null}throw Error(p(156,b.tag));}\nfunction Ij(a,b){wg(b);switch(b.tag){case 1:return Zf(b.type)&&$f(),a=b.flags,a&65536?(b.flags=a&-65537|128,b):null;case 3:return zh(),E(Wf),E(H),Eh(),a=b.flags,0!==(a&65536)&&0===(a&128)?(b.flags=a&-65537|128,b):null;case 5:return Bh(b),null;case 13:E(L);a=b.memoizedState;if(null!==a&&null!==a.dehydrated){if(null===b.alternate)throw Error(p(340));Ig()}a=b.flags;return a&65536?(b.flags=a&-65537|128,b):null;case 19:return E(L),null;case 4:return zh(),null;case 10:return ah(b.type._context),null;case 22:case 23:return Hj(),\nnull;case 24:return null;default:return null}}var Jj=!1,U=!1,Kj=\"function\"===typeof WeakSet?WeakSet:Set,V=null;function Lj(a,b){var c=a.ref;if(null!==c)if(\"function\"===typeof c)try{c(null)}catch(d){W(a,b,d)}else c.current=null}function Mj(a,b,c){try{c()}catch(d){W(a,b,d)}}var Nj=!1;\nfunction Oj(a,b){Cf=dd;a=Me();if(Ne(a)){if(\"selectionStart\"in a)var c={start:a.selectionStart,end:a.selectionEnd};else a:{c=(c=a.ownerDocument)&&c.defaultView||window;var d=c.getSelection&&c.getSelection();if(d&&0!==d.rangeCount){c=d.anchorNode;var e=d.anchorOffset,f=d.focusNode;d=d.focusOffset;try{c.nodeType,f.nodeType}catch(F){c=null;break a}var g=0,h=-1,k=-1,l=0,m=0,q=a,r=null;b:for(;;){for(var y;;){q!==c||0!==e&&3!==q.nodeType||(h=g+e);q!==f||0!==d&&3!==q.nodeType||(k=g+d);3===q.nodeType&&(g+=\nq.nodeValue.length);if(null===(y=q.firstChild))break;r=q;q=y}for(;;){if(q===a)break b;r===c&&++l===e&&(h=g);r===f&&++m===d&&(k=g);if(null!==(y=q.nextSibling))break;q=r;r=q.parentNode}q=y}c=-1===h||-1===k?null:{start:h,end:k}}else c=null}c=c||{start:0,end:0}}else c=null;Df={focusedElem:a,selectionRange:c};dd=!1;for(V=b;null!==V;)if(b=V,a=b.child,0!==(b.subtreeFlags&1028)&&null!==a)a.return=b,V=a;else for(;null!==V;){b=V;try{var n=b.alternate;if(0!==(b.flags&1024))switch(b.tag){case 0:case 11:case 15:break;\ncase 1:if(null!==n){var t=n.memoizedProps,J=n.memoizedState,x=b.stateNode,w=x.getSnapshotBeforeUpdate(b.elementType===b.type?t:Ci(b.type,t),J);x.__reactInternalSnapshotBeforeUpdate=w}break;case 3:var u=b.stateNode.containerInfo;1===u.nodeType?u.textContent=\"\":9===u.nodeType&&u.documentElement&&u.removeChild(u.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(p(163));}}catch(F){W(b,b.return,F)}a=b.sibling;if(null!==a){a.return=b.return;V=a;break}V=b.return}n=Nj;Nj=!1;return n}\nfunction Pj(a,b,c){var d=b.updateQueue;d=null!==d?d.lastEffect:null;if(null!==d){var e=d=d.next;do{if((e.tag&a)===a){var f=e.destroy;e.destroy=void 0;void 0!==f&&Mj(b,c,f)}e=e.next}while(e!==d)}}function Qj(a,b){b=b.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){var c=b=b.next;do{if((c.tag&a)===a){var d=c.create;c.destroy=d()}c=c.next}while(c!==b)}}function Rj(a){var b=a.ref;if(null!==b){var c=a.stateNode;switch(a.tag){case 5:a=c;break;default:a=c}\"function\"===typeof b?b(a):b.current=a}}\nfunction Sj(a){var b=a.alternate;null!==b&&(a.alternate=null,Sj(b));a.child=null;a.deletions=null;a.sibling=null;5===a.tag&&(b=a.stateNode,null!==b&&(delete b[Of],delete b[Pf],delete b[of],delete b[Qf],delete b[Rf]));a.stateNode=null;a.return=null;a.dependencies=null;a.memoizedProps=null;a.memoizedState=null;a.pendingProps=null;a.stateNode=null;a.updateQueue=null}function Tj(a){return 5===a.tag||3===a.tag||4===a.tag}\nfunction Uj(a){a:for(;;){for(;null===a.sibling;){if(null===a.return||Tj(a.return))return null;a=a.return}a.sibling.return=a.return;for(a=a.sibling;5!==a.tag&&6!==a.tag&&18!==a.tag;){if(a.flags&2)continue a;if(null===a.child||4===a.tag)continue a;else a.child.return=a,a=a.child}if(!(a.flags&2))return a.stateNode}}\nfunction Vj(a,b,c){var d=a.tag;if(5===d||6===d)a=a.stateNode,b?8===c.nodeType?c.parentNode.insertBefore(a,b):c.insertBefore(a,b):(8===c.nodeType?(b=c.parentNode,b.insertBefore(a,c)):(b=c,b.appendChild(a)),c=c._reactRootContainer,null!==c&&void 0!==c||null!==b.onclick||(b.onclick=Bf));else if(4!==d&&(a=a.child,null!==a))for(Vj(a,b,c),a=a.sibling;null!==a;)Vj(a,b,c),a=a.sibling}\nfunction Wj(a,b,c){var d=a.tag;if(5===d||6===d)a=a.stateNode,b?c.insertBefore(a,b):c.appendChild(a);else if(4!==d&&(a=a.child,null!==a))for(Wj(a,b,c),a=a.sibling;null!==a;)Wj(a,b,c),a=a.sibling}var X=null,Xj=!1;function Yj(a,b,c){for(c=c.child;null!==c;)Zj(a,b,c),c=c.sibling}\nfunction Zj(a,b,c){if(lc&&\"function\"===typeof lc.onCommitFiberUnmount)try{lc.onCommitFiberUnmount(kc,c)}catch(h){}switch(c.tag){case 5:U||Lj(c,b);case 6:var d=X,e=Xj;X=null;Yj(a,b,c);X=d;Xj=e;null!==X&&(Xj?(a=X,c=c.stateNode,8===a.nodeType?a.parentNode.removeChild(c):a.removeChild(c)):X.removeChild(c.stateNode));break;case 18:null!==X&&(Xj?(a=X,c=c.stateNode,8===a.nodeType?Kf(a.parentNode,c):1===a.nodeType&&Kf(a,c),bd(a)):Kf(X,c.stateNode));break;case 4:d=X;e=Xj;X=c.stateNode.containerInfo;Xj=!0;\nYj(a,b,c);X=d;Xj=e;break;case 0:case 11:case 14:case 15:if(!U&&(d=c.updateQueue,null!==d&&(d=d.lastEffect,null!==d))){e=d=d.next;do{var f=e,g=f.destroy;f=f.tag;void 0!==g&&(0!==(f&2)?Mj(c,b,g):0!==(f&4)&&Mj(c,b,g));e=e.next}while(e!==d)}Yj(a,b,c);break;case 1:if(!U&&(Lj(c,b),d=c.stateNode,\"function\"===typeof d.componentWillUnmount))try{d.props=c.memoizedProps,d.state=c.memoizedState,d.componentWillUnmount()}catch(h){W(c,b,h)}Yj(a,b,c);break;case 21:Yj(a,b,c);break;case 22:c.mode&1?(U=(d=U)||null!==\nc.memoizedState,Yj(a,b,c),U=d):Yj(a,b,c);break;default:Yj(a,b,c)}}function ak(a){var b=a.updateQueue;if(null!==b){a.updateQueue=null;var c=a.stateNode;null===c&&(c=a.stateNode=new Kj);b.forEach(function(b){var d=bk.bind(null,a,b);c.has(b)||(c.add(b),b.then(d,d))})}}\nfunction ck(a,b){var c=b.deletions;if(null!==c)for(var d=0;d<c.length;d++){var e=c[d];try{var f=a,g=b,h=g;a:for(;null!==h;){switch(h.tag){case 5:X=h.stateNode;Xj=!1;break a;case 3:X=h.stateNode.containerInfo;Xj=!0;break a;case 4:X=h.stateNode.containerInfo;Xj=!0;break a}h=h.return}if(null===X)throw Error(p(160));Zj(f,g,e);X=null;Xj=!1;var k=e.alternate;null!==k&&(k.return=null);e.return=null}catch(l){W(e,b,l)}}if(b.subtreeFlags&12854)for(b=b.child;null!==b;)dk(b,a),b=b.sibling}\nfunction dk(a,b){var c=a.alternate,d=a.flags;switch(a.tag){case 0:case 11:case 14:case 15:ck(b,a);ek(a);if(d&4){try{Pj(3,a,a.return),Qj(3,a)}catch(t){W(a,a.return,t)}try{Pj(5,a,a.return)}catch(t){W(a,a.return,t)}}break;case 1:ck(b,a);ek(a);d&512&&null!==c&&Lj(c,c.return);break;case 5:ck(b,a);ek(a);d&512&&null!==c&&Lj(c,c.return);if(a.flags&32){var e=a.stateNode;try{ob(e,\"\")}catch(t){W(a,a.return,t)}}if(d&4&&(e=a.stateNode,null!=e)){var f=a.memoizedProps,g=null!==c?c.memoizedProps:f,h=a.type,k=a.updateQueue;\na.updateQueue=null;if(null!==k)try{\"input\"===h&&\"radio\"===f.type&&null!=f.name&&ab(e,f);vb(h,g);var l=vb(h,f);for(g=0;g<k.length;g+=2){var m=k[g],q=k[g+1];\"style\"===m?sb(e,q):\"dangerouslySetInnerHTML\"===m?nb(e,q):\"children\"===m?ob(e,q):ta(e,m,q,l)}switch(h){case \"input\":bb(e,f);break;case \"textarea\":ib(e,f);break;case \"select\":var r=e._wrapperState.wasMultiple;e._wrapperState.wasMultiple=!!f.multiple;var y=f.value;null!=y?fb(e,!!f.multiple,y,!1):r!==!!f.multiple&&(null!=f.defaultValue?fb(e,!!f.multiple,\nf.defaultValue,!0):fb(e,!!f.multiple,f.multiple?[]:\"\",!1))}e[Pf]=f}catch(t){W(a,a.return,t)}}break;case 6:ck(b,a);ek(a);if(d&4){if(null===a.stateNode)throw Error(p(162));e=a.stateNode;f=a.memoizedProps;try{e.nodeValue=f}catch(t){W(a,a.return,t)}}break;case 3:ck(b,a);ek(a);if(d&4&&null!==c&&c.memoizedState.isDehydrated)try{bd(b.containerInfo)}catch(t){W(a,a.return,t)}break;case 4:ck(b,a);ek(a);break;case 13:ck(b,a);ek(a);e=a.child;e.flags&8192&&(f=null!==e.memoizedState,e.stateNode.isHidden=f,!f||\nnull!==e.alternate&&null!==e.alternate.memoizedState||(fk=B()));d&4&&ak(a);break;case 22:m=null!==c&&null!==c.memoizedState;a.mode&1?(U=(l=U)||m,ck(b,a),U=l):ck(b,a);ek(a);if(d&8192){l=null!==a.memoizedState;if((a.stateNode.isHidden=l)&&!m&&0!==(a.mode&1))for(V=a,m=a.child;null!==m;){for(q=V=m;null!==V;){r=V;y=r.child;switch(r.tag){case 0:case 11:case 14:case 15:Pj(4,r,r.return);break;case 1:Lj(r,r.return);var n=r.stateNode;if(\"function\"===typeof n.componentWillUnmount){d=r;c=r.return;try{b=d,n.props=\nb.memoizedProps,n.state=b.memoizedState,n.componentWillUnmount()}catch(t){W(d,c,t)}}break;case 5:Lj(r,r.return);break;case 22:if(null!==r.memoizedState){gk(q);continue}}null!==y?(y.return=r,V=y):gk(q)}m=m.sibling}a:for(m=null,q=a;;){if(5===q.tag){if(null===m){m=q;try{e=q.stateNode,l?(f=e.style,\"function\"===typeof f.setProperty?f.setProperty(\"display\",\"none\",\"important\"):f.display=\"none\"):(h=q.stateNode,k=q.memoizedProps.style,g=void 0!==k&&null!==k&&k.hasOwnProperty(\"display\")?k.display:null,h.style.display=\nrb(\"display\",g))}catch(t){W(a,a.return,t)}}}else if(6===q.tag){if(null===m)try{q.stateNode.nodeValue=l?\"\":q.memoizedProps}catch(t){W(a,a.return,t)}}else if((22!==q.tag&&23!==q.tag||null===q.memoizedState||q===a)&&null!==q.child){q.child.return=q;q=q.child;continue}if(q===a)break a;for(;null===q.sibling;){if(null===q.return||q.return===a)break a;m===q&&(m=null);q=q.return}m===q&&(m=null);q.sibling.return=q.return;q=q.sibling}}break;case 19:ck(b,a);ek(a);d&4&&ak(a);break;case 21:break;default:ck(b,\na),ek(a)}}function ek(a){var b=a.flags;if(b&2){try{a:{for(var c=a.return;null!==c;){if(Tj(c)){var d=c;break a}c=c.return}throw Error(p(160));}switch(d.tag){case 5:var e=d.stateNode;d.flags&32&&(ob(e,\"\"),d.flags&=-33);var f=Uj(a);Wj(a,f,e);break;case 3:case 4:var g=d.stateNode.containerInfo,h=Uj(a);Vj(a,h,g);break;default:throw Error(p(161));}}catch(k){W(a,a.return,k)}a.flags&=-3}b&4096&&(a.flags&=-4097)}function hk(a,b,c){V=a;ik(a,b,c)}\nfunction ik(a,b,c){for(var d=0!==(a.mode&1);null!==V;){var e=V,f=e.child;if(22===e.tag&&d){var g=null!==e.memoizedState||Jj;if(!g){var h=e.alternate,k=null!==h&&null!==h.memoizedState||U;h=Jj;var l=U;Jj=g;if((U=k)&&!l)for(V=e;null!==V;)g=V,k=g.child,22===g.tag&&null!==g.memoizedState?jk(e):null!==k?(k.return=g,V=k):jk(e);for(;null!==f;)V=f,ik(f,b,c),f=f.sibling;V=e;Jj=h;U=l}kk(a,b,c)}else 0!==(e.subtreeFlags&8772)&&null!==f?(f.return=e,V=f):kk(a,b,c)}}\nfunction kk(a){for(;null!==V;){var b=V;if(0!==(b.flags&8772)){var c=b.alternate;try{if(0!==(b.flags&8772))switch(b.tag){case 0:case 11:case 15:U||Qj(5,b);break;case 1:var d=b.stateNode;if(b.flags&4&&!U)if(null===c)d.componentDidMount();else{var e=b.elementType===b.type?c.memoizedProps:Ci(b.type,c.memoizedProps);d.componentDidUpdate(e,c.memoizedState,d.__reactInternalSnapshotBeforeUpdate)}var f=b.updateQueue;null!==f&&sh(b,f,d);break;case 3:var g=b.updateQueue;if(null!==g){c=null;if(null!==b.child)switch(b.child.tag){case 5:c=\nb.child.stateNode;break;case 1:c=b.child.stateNode}sh(b,g,c)}break;case 5:var h=b.stateNode;if(null===c&&b.flags&4){c=h;var k=b.memoizedProps;switch(b.type){case \"button\":case \"input\":case \"select\":case \"textarea\":k.autoFocus&&c.focus();break;case \"img\":k.src&&(c.src=k.src)}}break;case 6:break;case 4:break;case 12:break;case 13:if(null===b.memoizedState){var l=b.alternate;if(null!==l){var m=l.memoizedState;if(null!==m){var q=m.dehydrated;null!==q&&bd(q)}}}break;case 19:case 17:case 21:case 22:case 23:case 25:break;\ndefault:throw Error(p(163));}U||b.flags&512&&Rj(b)}catch(r){W(b,b.return,r)}}if(b===a){V=null;break}c=b.sibling;if(null!==c){c.return=b.return;V=c;break}V=b.return}}function gk(a){for(;null!==V;){var b=V;if(b===a){V=null;break}var c=b.sibling;if(null!==c){c.return=b.return;V=c;break}V=b.return}}\nfunction jk(a){for(;null!==V;){var b=V;try{switch(b.tag){case 0:case 11:case 15:var c=b.return;try{Qj(4,b)}catch(k){W(b,c,k)}break;case 1:var d=b.stateNode;if(\"function\"===typeof d.componentDidMount){var e=b.return;try{d.componentDidMount()}catch(k){W(b,e,k)}}var f=b.return;try{Rj(b)}catch(k){W(b,f,k)}break;case 5:var g=b.return;try{Rj(b)}catch(k){W(b,g,k)}}}catch(k){W(b,b.return,k)}if(b===a){V=null;break}var h=b.sibling;if(null!==h){h.return=b.return;V=h;break}V=b.return}}\nvar lk=Math.ceil,mk=ua.ReactCurrentDispatcher,nk=ua.ReactCurrentOwner,ok=ua.ReactCurrentBatchConfig,K=0,Q=null,Y=null,Z=0,fj=0,ej=Uf(0),T=0,pk=null,rh=0,qk=0,rk=0,sk=null,tk=null,fk=0,Gj=Infinity,uk=null,Oi=!1,Pi=null,Ri=null,vk=!1,wk=null,xk=0,yk=0,zk=null,Ak=-1,Bk=0;function R(){return 0!==(K&6)?B():-1!==Ak?Ak:Ak=B()}\nfunction yi(a){if(0===(a.mode&1))return 1;if(0!==(K&2)&&0!==Z)return Z&-Z;if(null!==Kg.transition)return 0===Bk&&(Bk=yc()),Bk;a=C;if(0!==a)return a;a=window.event;a=void 0===a?16:jd(a.type);return a}function gi(a,b,c,d){if(50<yk)throw yk=0,zk=null,Error(p(185));Ac(a,c,d);if(0===(K&2)||a!==Q)a===Q&&(0===(K&2)&&(qk|=c),4===T&&Ck(a,Z)),Dk(a,d),1===c&&0===K&&0===(b.mode&1)&&(Gj=B()+500,fg&&jg())}\nfunction Dk(a,b){var c=a.callbackNode;wc(a,b);var d=uc(a,a===Q?Z:0);if(0===d)null!==c&&bc(c),a.callbackNode=null,a.callbackPriority=0;else if(b=d&-d,a.callbackPriority!==b){null!=c&&bc(c);if(1===b)0===a.tag?ig(Ek.bind(null,a)):hg(Ek.bind(null,a)),Jf(function(){0===(K&6)&&jg()}),c=null;else{switch(Dc(d)){case 1:c=fc;break;case 4:c=gc;break;case 16:c=hc;break;case 536870912:c=jc;break;default:c=hc}c=Fk(c,Gk.bind(null,a))}a.callbackPriority=b;a.callbackNode=c}}\nfunction Gk(a,b){Ak=-1;Bk=0;if(0!==(K&6))throw Error(p(327));var c=a.callbackNode;if(Hk()&&a.callbackNode!==c)return null;var d=uc(a,a===Q?Z:0);if(0===d)return null;if(0!==(d&30)||0!==(d&a.expiredLanes)||b)b=Ik(a,d);else{b=d;var e=K;K|=2;var f=Jk();if(Q!==a||Z!==b)uk=null,Gj=B()+500,Kk(a,b);do try{Lk();break}catch(h){Mk(a,h)}while(1);$g();mk.current=f;K=e;null!==Y?b=0:(Q=null,Z=0,b=T)}if(0!==b){2===b&&(e=xc(a),0!==e&&(d=e,b=Nk(a,e)));if(1===b)throw c=pk,Kk(a,0),Ck(a,d),Dk(a,B()),c;if(6===b)Ck(a,d);\nelse{e=a.current.alternate;if(0===(d&30)&&!Ok(e)&&(b=Ik(a,d),2===b&&(f=xc(a),0!==f&&(d=f,b=Nk(a,f))),1===b))throw c=pk,Kk(a,0),Ck(a,d),Dk(a,B()),c;a.finishedWork=e;a.finishedLanes=d;switch(b){case 0:case 1:throw Error(p(345));case 2:Pk(a,tk,uk);break;case 3:Ck(a,d);if((d&130023424)===d&&(b=fk+500-B(),10<b)){if(0!==uc(a,0))break;e=a.suspendedLanes;if((e&d)!==d){R();a.pingedLanes|=a.suspendedLanes&e;break}a.timeoutHandle=Ff(Pk.bind(null,a,tk,uk),b);break}Pk(a,tk,uk);break;case 4:Ck(a,d);if((d&4194240)===\nd)break;b=a.eventTimes;for(e=-1;0<d;){var g=31-oc(d);f=1<<g;g=b[g];g>e&&(e=g);d&=~f}d=e;d=B()-d;d=(120>d?120:480>d?480:1080>d?1080:1920>d?1920:3E3>d?3E3:4320>d?4320:1960*lk(d/1960))-d;if(10<d){a.timeoutHandle=Ff(Pk.bind(null,a,tk,uk),d);break}Pk(a,tk,uk);break;case 5:Pk(a,tk,uk);break;default:throw Error(p(329));}}}Dk(a,B());return a.callbackNode===c?Gk.bind(null,a):null}\nfunction Nk(a,b){var c=sk;a.current.memoizedState.isDehydrated&&(Kk(a,b).flags|=256);a=Ik(a,b);2!==a&&(b=tk,tk=c,null!==b&&Fj(b));return a}function Fj(a){null===tk?tk=a:tk.push.apply(tk,a)}\nfunction Ok(a){for(var b=a;;){if(b.flags&16384){var c=b.updateQueue;if(null!==c&&(c=c.stores,null!==c))for(var d=0;d<c.length;d++){var e=c[d],f=e.getSnapshot;e=e.value;try{if(!He(f(),e))return!1}catch(g){return!1}}}c=b.child;if(b.subtreeFlags&16384&&null!==c)c.return=b,b=c;else{if(b===a)break;for(;null===b.sibling;){if(null===b.return||b.return===a)return!0;b=b.return}b.sibling.return=b.return;b=b.sibling}}return!0}\nfunction Ck(a,b){b&=~rk;b&=~qk;a.suspendedLanes|=b;a.pingedLanes&=~b;for(a=a.expirationTimes;0<b;){var c=31-oc(b),d=1<<c;a[c]=-1;b&=~d}}function Ek(a){if(0!==(K&6))throw Error(p(327));Hk();var b=uc(a,0);if(0===(b&1))return Dk(a,B()),null;var c=Ik(a,b);if(0!==a.tag&&2===c){var d=xc(a);0!==d&&(b=d,c=Nk(a,d))}if(1===c)throw c=pk,Kk(a,0),Ck(a,b),Dk(a,B()),c;if(6===c)throw Error(p(345));a.finishedWork=a.current.alternate;a.finishedLanes=b;Pk(a,tk,uk);Dk(a,B());return null}\nfunction Qk(a,b){var c=K;K|=1;try{return a(b)}finally{K=c,0===K&&(Gj=B()+500,fg&&jg())}}function Rk(a){null!==wk&&0===wk.tag&&0===(K&6)&&Hk();var b=K;K|=1;var c=ok.transition,d=C;try{if(ok.transition=null,C=1,a)return a()}finally{C=d,ok.transition=c,K=b,0===(K&6)&&jg()}}function Hj(){fj=ej.current;E(ej)}\nfunction Kk(a,b){a.finishedWork=null;a.finishedLanes=0;var c=a.timeoutHandle;-1!==c&&(a.timeoutHandle=-1,Gf(c));if(null!==Y)for(c=Y.return;null!==c;){var d=c;wg(d);switch(d.tag){case 1:d=d.type.childContextTypes;null!==d&&void 0!==d&&$f();break;case 3:zh();E(Wf);E(H);Eh();break;case 5:Bh(d);break;case 4:zh();break;case 13:E(L);break;case 19:E(L);break;case 10:ah(d.type._context);break;case 22:case 23:Hj()}c=c.return}Q=a;Y=a=Pg(a.current,null);Z=fj=b;T=0;pk=null;rk=qk=rh=0;tk=sk=null;if(null!==fh){for(b=\n0;b<fh.length;b++)if(c=fh[b],d=c.interleaved,null!==d){c.interleaved=null;var e=d.next,f=c.pending;if(null!==f){var g=f.next;f.next=e;d.next=g}c.pending=d}fh=null}return a}\nfunction Mk(a,b){do{var c=Y;try{$g();Fh.current=Rh;if(Ih){for(var d=M.memoizedState;null!==d;){var e=d.queue;null!==e&&(e.pending=null);d=d.next}Ih=!1}Hh=0;O=N=M=null;Jh=!1;Kh=0;nk.current=null;if(null===c||null===c.return){T=1;pk=b;Y=null;break}a:{var f=a,g=c.return,h=c,k=b;b=Z;h.flags|=32768;if(null!==k&&\"object\"===typeof k&&\"function\"===typeof k.then){var l=k,m=h,q=m.tag;if(0===(m.mode&1)&&(0===q||11===q||15===q)){var r=m.alternate;r?(m.updateQueue=r.updateQueue,m.memoizedState=r.memoizedState,\nm.lanes=r.lanes):(m.updateQueue=null,m.memoizedState=null)}var y=Ui(g);if(null!==y){y.flags&=-257;Vi(y,g,h,f,b);y.mode&1&&Si(f,l,b);b=y;k=l;var n=b.updateQueue;if(null===n){var t=new Set;t.add(k);b.updateQueue=t}else n.add(k);break a}else{if(0===(b&1)){Si(f,l,b);tj();break a}k=Error(p(426))}}else if(I&&h.mode&1){var J=Ui(g);if(null!==J){0===(J.flags&65536)&&(J.flags|=256);Vi(J,g,h,f,b);Jg(Ji(k,h));break a}}f=k=Ji(k,h);4!==T&&(T=2);null===sk?sk=[f]:sk.push(f);f=g;do{switch(f.tag){case 3:f.flags|=65536;\nb&=-b;f.lanes|=b;var x=Ni(f,k,b);ph(f,x);break a;case 1:h=k;var w=f.type,u=f.stateNode;if(0===(f.flags&128)&&(\"function\"===typeof w.getDerivedStateFromError||null!==u&&\"function\"===typeof u.componentDidCatch&&(null===Ri||!Ri.has(u)))){f.flags|=65536;b&=-b;f.lanes|=b;var F=Qi(f,h,b);ph(f,F);break a}}f=f.return}while(null!==f)}Sk(c)}catch(na){b=na;Y===c&&null!==c&&(Y=c=c.return);continue}break}while(1)}function Jk(){var a=mk.current;mk.current=Rh;return null===a?Rh:a}\nfunction tj(){if(0===T||3===T||2===T)T=4;null===Q||0===(rh&268435455)&&0===(qk&268435455)||Ck(Q,Z)}function Ik(a,b){var c=K;K|=2;var d=Jk();if(Q!==a||Z!==b)uk=null,Kk(a,b);do try{Tk();break}catch(e){Mk(a,e)}while(1);$g();K=c;mk.current=d;if(null!==Y)throw Error(p(261));Q=null;Z=0;return T}function Tk(){for(;null!==Y;)Uk(Y)}function Lk(){for(;null!==Y&&!cc();)Uk(Y)}function Uk(a){var b=Vk(a.alternate,a,fj);a.memoizedProps=a.pendingProps;null===b?Sk(a):Y=b;nk.current=null}\nfunction Sk(a){var b=a;do{var c=b.alternate;a=b.return;if(0===(b.flags&32768)){if(c=Ej(c,b,fj),null!==c){Y=c;return}}else{c=Ij(c,b);if(null!==c){c.flags&=32767;Y=c;return}if(null!==a)a.flags|=32768,a.subtreeFlags=0,a.deletions=null;else{T=6;Y=null;return}}b=b.sibling;if(null!==b){Y=b;return}Y=b=a}while(null!==b);0===T&&(T=5)}function Pk(a,b,c){var d=C,e=ok.transition;try{ok.transition=null,C=1,Wk(a,b,c,d)}finally{ok.transition=e,C=d}return null}\nfunction Wk(a,b,c,d){do Hk();while(null!==wk);if(0!==(K&6))throw Error(p(327));c=a.finishedWork;var e=a.finishedLanes;if(null===c)return null;a.finishedWork=null;a.finishedLanes=0;if(c===a.current)throw Error(p(177));a.callbackNode=null;a.callbackPriority=0;var f=c.lanes|c.childLanes;Bc(a,f);a===Q&&(Y=Q=null,Z=0);0===(c.subtreeFlags&2064)&&0===(c.flags&2064)||vk||(vk=!0,Fk(hc,function(){Hk();return null}));f=0!==(c.flags&15990);if(0!==(c.subtreeFlags&15990)||f){f=ok.transition;ok.transition=null;\nvar g=C;C=1;var h=K;K|=4;nk.current=null;Oj(a,c);dk(c,a);Oe(Df);dd=!!Cf;Df=Cf=null;a.current=c;hk(c,a,e);dc();K=h;C=g;ok.transition=f}else a.current=c;vk&&(vk=!1,wk=a,xk=e);f=a.pendingLanes;0===f&&(Ri=null);mc(c.stateNode,d);Dk(a,B());if(null!==b)for(d=a.onRecoverableError,c=0;c<b.length;c++)e=b[c],d(e.value,{componentStack:e.stack,digest:e.digest});if(Oi)throw Oi=!1,a=Pi,Pi=null,a;0!==(xk&1)&&0!==a.tag&&Hk();f=a.pendingLanes;0!==(f&1)?a===zk?yk++:(yk=0,zk=a):yk=0;jg();return null}\nfunction Hk(){if(null!==wk){var a=Dc(xk),b=ok.transition,c=C;try{ok.transition=null;C=16>a?16:a;if(null===wk)var d=!1;else{a=wk;wk=null;xk=0;if(0!==(K&6))throw Error(p(331));var e=K;K|=4;for(V=a.current;null!==V;){var f=V,g=f.child;if(0!==(V.flags&16)){var h=f.deletions;if(null!==h){for(var k=0;k<h.length;k++){var l=h[k];for(V=l;null!==V;){var m=V;switch(m.tag){case 0:case 11:case 15:Pj(8,m,f)}var q=m.child;if(null!==q)q.return=m,V=q;else for(;null!==V;){m=V;var r=m.sibling,y=m.return;Sj(m);if(m===\nl){V=null;break}if(null!==r){r.return=y;V=r;break}V=y}}}var n=f.alternate;if(null!==n){var t=n.child;if(null!==t){n.child=null;do{var J=t.sibling;t.sibling=null;t=J}while(null!==t)}}V=f}}if(0!==(f.subtreeFlags&2064)&&null!==g)g.return=f,V=g;else b:for(;null!==V;){f=V;if(0!==(f.flags&2048))switch(f.tag){case 0:case 11:case 15:Pj(9,f,f.return)}var x=f.sibling;if(null!==x){x.return=f.return;V=x;break b}V=f.return}}var w=a.current;for(V=w;null!==V;){g=V;var u=g.child;if(0!==(g.subtreeFlags&2064)&&null!==\nu)u.return=g,V=u;else b:for(g=w;null!==V;){h=V;if(0!==(h.flags&2048))try{switch(h.tag){case 0:case 11:case 15:Qj(9,h)}}catch(na){W(h,h.return,na)}if(h===g){V=null;break b}var F=h.sibling;if(null!==F){F.return=h.return;V=F;break b}V=h.return}}K=e;jg();if(lc&&\"function\"===typeof lc.onPostCommitFiberRoot)try{lc.onPostCommitFiberRoot(kc,a)}catch(na){}d=!0}return d}finally{C=c,ok.transition=b}}return!1}function Xk(a,b,c){b=Ji(c,b);b=Ni(a,b,1);a=nh(a,b,1);b=R();null!==a&&(Ac(a,1,b),Dk(a,b))}\nfunction W(a,b,c){if(3===a.tag)Xk(a,a,c);else for(;null!==b;){if(3===b.tag){Xk(b,a,c);break}else if(1===b.tag){var d=b.stateNode;if(\"function\"===typeof b.type.getDerivedStateFromError||\"function\"===typeof d.componentDidCatch&&(null===Ri||!Ri.has(d))){a=Ji(c,a);a=Qi(b,a,1);b=nh(b,a,1);a=R();null!==b&&(Ac(b,1,a),Dk(b,a));break}}b=b.return}}\nfunction Ti(a,b,c){var d=a.pingCache;null!==d&&d.delete(b);b=R();a.pingedLanes|=a.suspendedLanes&c;Q===a&&(Z&c)===c&&(4===T||3===T&&(Z&130023424)===Z&&500>B()-fk?Kk(a,0):rk|=c);Dk(a,b)}function Yk(a,b){0===b&&(0===(a.mode&1)?b=1:(b=sc,sc<<=1,0===(sc&130023424)&&(sc=4194304)));var c=R();a=ih(a,b);null!==a&&(Ac(a,b,c),Dk(a,c))}function uj(a){var b=a.memoizedState,c=0;null!==b&&(c=b.retryLane);Yk(a,c)}\nfunction bk(a,b){var c=0;switch(a.tag){case 13:var d=a.stateNode;var e=a.memoizedState;null!==e&&(c=e.retryLane);break;case 19:d=a.stateNode;break;default:throw Error(p(314));}null!==d&&d.delete(b);Yk(a,c)}var Vk;\nVk=function(a,b,c){if(null!==a)if(a.memoizedProps!==b.pendingProps||Wf.current)dh=!0;else{if(0===(a.lanes&c)&&0===(b.flags&128))return dh=!1,yj(a,b,c);dh=0!==(a.flags&131072)?!0:!1}else dh=!1,I&&0!==(b.flags&1048576)&&ug(b,ng,b.index);b.lanes=0;switch(b.tag){case 2:var d=b.type;ij(a,b);a=b.pendingProps;var e=Yf(b,H.current);ch(b,c);e=Nh(null,b,d,a,e,c);var f=Sh();b.flags|=1;\"object\"===typeof e&&null!==e&&\"function\"===typeof e.render&&void 0===e.$$typeof?(b.tag=1,b.memoizedState=null,b.updateQueue=\nnull,Zf(d)?(f=!0,cg(b)):f=!1,b.memoizedState=null!==e.state&&void 0!==e.state?e.state:null,kh(b),e.updater=Ei,b.stateNode=e,e._reactInternals=b,Ii(b,d,a,c),b=jj(null,b,d,!0,f,c)):(b.tag=0,I&&f&&vg(b),Xi(null,b,e,c),b=b.child);return b;case 16:d=b.elementType;a:{ij(a,b);a=b.pendingProps;e=d._init;d=e(d._payload);b.type=d;e=b.tag=Zk(d);a=Ci(d,a);switch(e){case 0:b=cj(null,b,d,a,c);break a;case 1:b=hj(null,b,d,a,c);break a;case 11:b=Yi(null,b,d,a,c);break a;case 14:b=$i(null,b,d,Ci(d.type,a),c);break a}throw Error(p(306,\nd,\"\"));}return b;case 0:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),cj(a,b,d,e,c);case 1:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),hj(a,b,d,e,c);case 3:a:{kj(b);if(null===a)throw Error(p(387));d=b.pendingProps;f=b.memoizedState;e=f.element;lh(a,b);qh(b,d,null,c);var g=b.memoizedState;d=g.element;if(f.isDehydrated)if(f={element:d,isDehydrated:!1,cache:g.cache,pendingSuspenseBoundaries:g.pendingSuspenseBoundaries,transitions:g.transitions},b.updateQueue.baseState=\nf,b.memoizedState=f,b.flags&256){e=Ji(Error(p(423)),b);b=lj(a,b,d,c,e);break a}else if(d!==e){e=Ji(Error(p(424)),b);b=lj(a,b,d,c,e);break a}else for(yg=Lf(b.stateNode.containerInfo.firstChild),xg=b,I=!0,zg=null,c=Vg(b,null,d,c),b.child=c;c;)c.flags=c.flags&-3|4096,c=c.sibling;else{Ig();if(d===e){b=Zi(a,b,c);break a}Xi(a,b,d,c)}b=b.child}return b;case 5:return Ah(b),null===a&&Eg(b),d=b.type,e=b.pendingProps,f=null!==a?a.memoizedProps:null,g=e.children,Ef(d,e)?g=null:null!==f&&Ef(d,f)&&(b.flags|=32),\ngj(a,b),Xi(a,b,g,c),b.child;case 6:return null===a&&Eg(b),null;case 13:return oj(a,b,c);case 4:return yh(b,b.stateNode.containerInfo),d=b.pendingProps,null===a?b.child=Ug(b,null,d,c):Xi(a,b,d,c),b.child;case 11:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),Yi(a,b,d,e,c);case 7:return Xi(a,b,b.pendingProps,c),b.child;case 8:return Xi(a,b,b.pendingProps.children,c),b.child;case 12:return Xi(a,b,b.pendingProps.children,c),b.child;case 10:a:{d=b.type._context;e=b.pendingProps;f=b.memoizedProps;\ng=e.value;G(Wg,d._currentValue);d._currentValue=g;if(null!==f)if(He(f.value,g)){if(f.children===e.children&&!Wf.current){b=Zi(a,b,c);break a}}else for(f=b.child,null!==f&&(f.return=b);null!==f;){var h=f.dependencies;if(null!==h){g=f.child;for(var k=h.firstContext;null!==k;){if(k.context===d){if(1===f.tag){k=mh(-1,c&-c);k.tag=2;var l=f.updateQueue;if(null!==l){l=l.shared;var m=l.pending;null===m?k.next=k:(k.next=m.next,m.next=k);l.pending=k}}f.lanes|=c;k=f.alternate;null!==k&&(k.lanes|=c);bh(f.return,\nc,b);h.lanes|=c;break}k=k.next}}else if(10===f.tag)g=f.type===b.type?null:f.child;else if(18===f.tag){g=f.return;if(null===g)throw Error(p(341));g.lanes|=c;h=g.alternate;null!==h&&(h.lanes|=c);bh(g,c,b);g=f.sibling}else g=f.child;if(null!==g)g.return=f;else for(g=f;null!==g;){if(g===b){g=null;break}f=g.sibling;if(null!==f){f.return=g.return;g=f;break}g=g.return}f=g}Xi(a,b,e.children,c);b=b.child}return b;case 9:return e=b.type,d=b.pendingProps.children,ch(b,c),e=eh(e),d=d(e),b.flags|=1,Xi(a,b,d,c),\nb.child;case 14:return d=b.type,e=Ci(d,b.pendingProps),e=Ci(d.type,e),$i(a,b,d,e,c);case 15:return bj(a,b,b.type,b.pendingProps,c);case 17:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),ij(a,b),b.tag=1,Zf(d)?(a=!0,cg(b)):a=!1,ch(b,c),Gi(b,d,e),Ii(b,d,e,c),jj(null,b,d,!0,a,c);case 19:return xj(a,b,c);case 22:return dj(a,b,c)}throw Error(p(156,b.tag));};function Fk(a,b){return ac(a,b)}\nfunction $k(a,b,c,d){this.tag=a;this.key=c;this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null;this.index=0;this.ref=null;this.pendingProps=b;this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null;this.mode=d;this.subtreeFlags=this.flags=0;this.deletions=null;this.childLanes=this.lanes=0;this.alternate=null}function Bg(a,b,c,d){return new $k(a,b,c,d)}function aj(a){a=a.prototype;return!(!a||!a.isReactComponent)}\nfunction Zk(a){if(\"function\"===typeof a)return aj(a)?1:0;if(void 0!==a&&null!==a){a=a.$$typeof;if(a===Da)return 11;if(a===Ga)return 14}return 2}\nfunction Pg(a,b){var c=a.alternate;null===c?(c=Bg(a.tag,b,a.key,a.mode),c.elementType=a.elementType,c.type=a.type,c.stateNode=a.stateNode,c.alternate=a,a.alternate=c):(c.pendingProps=b,c.type=a.type,c.flags=0,c.subtreeFlags=0,c.deletions=null);c.flags=a.flags&14680064;c.childLanes=a.childLanes;c.lanes=a.lanes;c.child=a.child;c.memoizedProps=a.memoizedProps;c.memoizedState=a.memoizedState;c.updateQueue=a.updateQueue;b=a.dependencies;c.dependencies=null===b?null:{lanes:b.lanes,firstContext:b.firstContext};\nc.sibling=a.sibling;c.index=a.index;c.ref=a.ref;return c}\nfunction Rg(a,b,c,d,e,f){var g=2;d=a;if(\"function\"===typeof a)aj(a)&&(g=1);else if(\"string\"===typeof a)g=5;else a:switch(a){case ya:return Tg(c.children,e,f,b);case za:g=8;e|=8;break;case Aa:return a=Bg(12,c,b,e|2),a.elementType=Aa,a.lanes=f,a;case Ea:return a=Bg(13,c,b,e),a.elementType=Ea,a.lanes=f,a;case Fa:return a=Bg(19,c,b,e),a.elementType=Fa,a.lanes=f,a;case Ia:return pj(c,e,f,b);default:if(\"object\"===typeof a&&null!==a)switch(a.$$typeof){case Ba:g=10;break a;case Ca:g=9;break a;case Da:g=11;\nbreak a;case Ga:g=14;break a;case Ha:g=16;d=null;break a}throw Error(p(130,null==a?a:typeof a,\"\"));}b=Bg(g,c,b,e);b.elementType=a;b.type=d;b.lanes=f;return b}function Tg(a,b,c,d){a=Bg(7,a,d,b);a.lanes=c;return a}function pj(a,b,c,d){a=Bg(22,a,d,b);a.elementType=Ia;a.lanes=c;a.stateNode={isHidden:!1};return a}function Qg(a,b,c){a=Bg(6,a,null,b);a.lanes=c;return a}\nfunction Sg(a,b,c){b=Bg(4,null!==a.children?a.children:[],a.key,b);b.lanes=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b}\nfunction al(a,b,c,d,e){this.tag=b;this.containerInfo=a;this.finishedWork=this.pingCache=this.current=this.pendingChildren=null;this.timeoutHandle=-1;this.callbackNode=this.pendingContext=this.context=null;this.callbackPriority=0;this.eventTimes=zc(0);this.expirationTimes=zc(-1);this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0;this.entanglements=zc(0);this.identifierPrefix=d;this.onRecoverableError=e;this.mutableSourceEagerHydrationData=\nnull}function bl(a,b,c,d,e,f,g,h,k){a=new al(a,b,c,h,k);1===b?(b=1,!0===f&&(b|=8)):b=0;f=Bg(3,null,null,b);a.current=f;f.stateNode=a;f.memoizedState={element:d,isDehydrated:c,cache:null,transitions:null,pendingSuspenseBoundaries:null};kh(f);return a}function cl(a,b,c){var d=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:wa,key:null==d?null:\"\"+d,children:a,containerInfo:b,implementation:c}}\nfunction dl(a){if(!a)return Vf;a=a._reactInternals;a:{if(Vb(a)!==a||1!==a.tag)throw Error(p(170));var b=a;do{switch(b.tag){case 3:b=b.stateNode.context;break a;case 1:if(Zf(b.type)){b=b.stateNode.__reactInternalMemoizedMergedChildContext;break a}}b=b.return}while(null!==b);throw Error(p(171));}if(1===a.tag){var c=a.type;if(Zf(c))return bg(a,c,b)}return b}\nfunction el(a,b,c,d,e,f,g,h,k){a=bl(c,d,!0,a,e,f,g,h,k);a.context=dl(null);c=a.current;d=R();e=yi(c);f=mh(d,e);f.callback=void 0!==b&&null!==b?b:null;nh(c,f,e);a.current.lanes=e;Ac(a,e,d);Dk(a,d);return a}function fl(a,b,c,d){var e=b.current,f=R(),g=yi(e);c=dl(c);null===b.context?b.context=c:b.pendingContext=c;b=mh(f,g);b.payload={element:a};d=void 0===d?null:d;null!==d&&(b.callback=d);a=nh(e,b,g);null!==a&&(gi(a,e,g,f),oh(a,e,g));return g}\nfunction gl(a){a=a.current;if(!a.child)return null;switch(a.child.tag){case 5:return a.child.stateNode;default:return a.child.stateNode}}function hl(a,b){a=a.memoizedState;if(null!==a&&null!==a.dehydrated){var c=a.retryLane;a.retryLane=0!==c&&c<b?c:b}}function il(a,b){hl(a,b);(a=a.alternate)&&hl(a,b)}function jl(){return null}var kl=\"function\"===typeof reportError?reportError:function(a){console.error(a)};function ll(a){this._internalRoot=a}\nml.prototype.render=ll.prototype.render=function(a){var b=this._internalRoot;if(null===b)throw Error(p(409));fl(a,b,null,null)};ml.prototype.unmount=ll.prototype.unmount=function(){var a=this._internalRoot;if(null!==a){this._internalRoot=null;var b=a.containerInfo;Rk(function(){fl(null,a,null,null)});b[uf]=null}};function ml(a){this._internalRoot=a}\nml.prototype.unstable_scheduleHydration=function(a){if(a){var b=Hc();a={blockedOn:null,target:a,priority:b};for(var c=0;c<Qc.length&&0!==b&&b<Qc[c].priority;c++);Qc.splice(c,0,a);0===c&&Vc(a)}};function nl(a){return!(!a||1!==a.nodeType&&9!==a.nodeType&&11!==a.nodeType)}function ol(a){return!(!a||1!==a.nodeType&&9!==a.nodeType&&11!==a.nodeType&&(8!==a.nodeType||\" react-mount-point-unstable \"!==a.nodeValue))}function pl(){}\nfunction ql(a,b,c,d,e){if(e){if(\"function\"===typeof d){var f=d;d=function(){var a=gl(g);f.call(a)}}var g=el(b,d,a,0,null,!1,!1,\"\",pl);a._reactRootContainer=g;a[uf]=g.current;sf(8===a.nodeType?a.parentNode:a);Rk();return g}for(;e=a.lastChild;)a.removeChild(e);if(\"function\"===typeof d){var h=d;d=function(){var a=gl(k);h.call(a)}}var k=bl(a,0,!1,null,null,!1,!1,\"\",pl);a._reactRootContainer=k;a[uf]=k.current;sf(8===a.nodeType?a.parentNode:a);Rk(function(){fl(b,k,c,d)});return k}\nfunction rl(a,b,c,d,e){var f=c._reactRootContainer;if(f){var g=f;if(\"function\"===typeof e){var h=e;e=function(){var a=gl(g);h.call(a)}}fl(b,g,a,e)}else g=ql(c,b,a,e,d);return gl(g)}Ec=function(a){switch(a.tag){case 3:var b=a.stateNode;if(b.current.memoizedState.isDehydrated){var c=tc(b.pendingLanes);0!==c&&(Cc(b,c|1),Dk(b,B()),0===(K&6)&&(Gj=B()+500,jg()))}break;case 13:Rk(function(){var b=ih(a,1);if(null!==b){var c=R();gi(b,a,1,c)}}),il(a,1)}};\nFc=function(a){if(13===a.tag){var b=ih(a,134217728);if(null!==b){var c=R();gi(b,a,134217728,c)}il(a,134217728)}};Gc=function(a){if(13===a.tag){var b=yi(a),c=ih(a,b);if(null!==c){var d=R();gi(c,a,b,d)}il(a,b)}};Hc=function(){return C};Ic=function(a,b){var c=C;try{return C=a,b()}finally{C=c}};\nyb=function(a,b,c){switch(b){case \"input\":bb(a,c);b=c.name;if(\"radio\"===c.type&&null!=b){for(c=a;c.parentNode;)c=c.parentNode;c=c.querySelectorAll(\"input[name=\"+JSON.stringify(\"\"+b)+'][type=\"radio\"]');for(b=0;b<c.length;b++){var d=c[b];if(d!==a&&d.form===a.form){var e=Db(d);if(!e)throw Error(p(90));Wa(d);bb(d,e)}}}break;case \"textarea\":ib(a,c);break;case \"select\":b=c.value,null!=b&&fb(a,!!c.multiple,b,!1)}};Gb=Qk;Hb=Rk;\nvar sl={usingClientEntryPoint:!1,Events:[Cb,ue,Db,Eb,Fb,Qk]},tl={findFiberByHostInstance:Wc,bundleType:0,version:\"18.3.1\",rendererPackageName:\"react-dom\"};\nvar ul={bundleType:tl.bundleType,version:tl.version,rendererPackageName:tl.rendererPackageName,rendererConfig:tl.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:ua.ReactCurrentDispatcher,findHostInstanceByFiber:function(a){a=Zb(a);return null===a?null:a.stateNode},findFiberByHostInstance:tl.findFiberByHostInstance||\njl,findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:\"18.3.1-next-f1338f8080-20240426\"};if(\"undefined\"!==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var vl=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!vl.isDisabled&&vl.supportsFiber)try{kc=vl.inject(ul),lc=vl}catch(a){}}exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=sl;\nexports.createPortal=function(a,b){var c=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!nl(b))throw Error(p(200));return cl(a,b,null,c)};exports.createRoot=function(a,b){if(!nl(a))throw Error(p(299));var c=!1,d=\"\",e=kl;null!==b&&void 0!==b&&(!0===b.unstable_strictMode&&(c=!0),void 0!==b.identifierPrefix&&(d=b.identifierPrefix),void 0!==b.onRecoverableError&&(e=b.onRecoverableError));b=bl(a,1,!1,null,null,c,!1,d,e);a[uf]=b.current;sf(8===a.nodeType?a.parentNode:a);return new ll(b)};\nexports.findDOMNode=function(a){if(null==a)return null;if(1===a.nodeType)return a;var b=a._reactInternals;if(void 0===b){if(\"function\"===typeof a.render)throw Error(p(188));a=Object.keys(a).join(\",\");throw Error(p(268,a));}a=Zb(b);a=null===a?null:a.stateNode;return a};exports.flushSync=function(a){return Rk(a)};exports.hydrate=function(a,b,c){if(!ol(b))throw Error(p(200));return rl(null,a,b,!0,c)};\nexports.hydrateRoot=function(a,b,c){if(!nl(a))throw Error(p(405));var d=null!=c&&c.hydratedSources||null,e=!1,f=\"\",g=kl;null!==c&&void 0!==c&&(!0===c.unstable_strictMode&&(e=!0),void 0!==c.identifierPrefix&&(f=c.identifierPrefix),void 0!==c.onRecoverableError&&(g=c.onRecoverableError));b=el(b,null,a,1,null!=c?c:null,e,!1,f,g);a[uf]=b.current;sf(a);if(d)for(a=0;a<d.length;a++)c=d[a],e=c._getVersion,e=e(c._source),null==b.mutableSourceEagerHydrationData?b.mutableSourceEagerHydrationData=[c,e]:b.mutableSourceEagerHydrationData.push(c,\ne);return new ml(b)};exports.render=function(a,b,c){if(!ol(b))throw Error(p(200));return rl(null,a,b,!1,c)};exports.unmountComponentAtNode=function(a){if(!ol(a))throw Error(p(40));return a._reactRootContainer?(Rk(function(){rl(null,null,a,!1,function(){a._reactRootContainer=null;a[uf]=null})}),!0):!1};exports.unstable_batchedUpdates=Qk;\nexports.unstable_renderSubtreeIntoContainer=function(a,b,c,d){if(!ol(c))throw Error(p(200));if(null==a||void 0===a._reactInternals)throw Error(p(38));return rl(a,b,c,!1,d)};exports.version=\"18.3.1-next-f1338f8080-20240426\";\n","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nmodule.exports = function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n};\n","'use strict';\n\nvar utils = require('../utils');\nvar normalizeHeaderName = require('../helpers/normalizeHeaderName');\nvar AxiosError = require('../core/AxiosError');\nvar transitionalDefaults = require('./transitional');\nvar toFormData = require('../helpers/toFormData');\n\nvar DEFAULT_CONTENT_TYPE = {\n 'Content-Type': 'application/x-www-form-urlencoded'\n};\n\nfunction setContentTypeIfUnset(headers, value) {\n if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {\n headers['Content-Type'] = value;\n }\n}\n\nfunction getDefaultAdapter() {\n var adapter;\n if (typeof XMLHttpRequest !== 'undefined') {\n // For browsers use XHR adapter\n adapter = require('../adapters/xhr');\n } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') {\n // For node use HTTP adapter\n adapter = require('../adapters/http');\n }\n return adapter;\n}\n\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nvar defaults = {\n\n transitional: transitionalDefaults,\n\n adapter: getDefaultAdapter(),\n\n transformRequest: [function transformRequest(data, headers) {\n normalizeHeaderName(headers, 'Accept');\n normalizeHeaderName(headers, 'Content-Type');\n\n if (utils.isFormData(data) ||\n utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');\n return data.toString();\n }\n\n var isObjectPayload = utils.isObject(data);\n var contentType = headers && headers['Content-Type'];\n\n var isFileList;\n\n if ((isFileList = utils.isFileList(data)) || (isObjectPayload && contentType === 'multipart/form-data')) {\n var _FormData = this.env && this.env.FormData;\n return toFormData(isFileList ? {'files[]': data} : data, _FormData && new _FormData());\n } else if (isObjectPayload || contentType === 'application/json') {\n setContentTypeIfUnset(headers, 'application/json');\n return stringifySafely(data);\n }\n\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n var transitional = this.transitional || defaults.transitional;\n var silentJSONParsing = transitional && transitional.silentJSONParsing;\n var forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n var strictJSONParsing = !silentJSONParsing && this.responseType === 'json';\n\n if (strictJSONParsing || (forcedJSONParsing && utils.isString(data) && data.length)) {\n try {\n return JSON.parse(data);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n env: {\n FormData: require('./env/FormData')\n },\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*'\n }\n }\n};\n\nutils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {\n defaults.headers[method] = {};\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);\n});\n\nmodule.exports = defaults;\n","'use strict';\n\nvar utils = require('./../utils');\nvar defaults = require('../defaults');\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Object|String} data The data to be transformed\n * @param {Array} headers The headers for the request or response\n * @param {Array|Function} fns A single function or Array of functions\n * @returns {*} The resulting transformed data\n */\nmodule.exports = function transformData(data, headers, fns) {\n var context = this || defaults;\n /*eslint no-param-reassign:0*/\n utils.forEach(fns, function transform(fn) {\n data = fn.call(context, data, headers);\n });\n\n return data;\n};\n","// eslint-disable-next-line strict\nmodule.exports = null;\n","\n/*!\n * artplayer.js v5.2.2\n * Github: https://github.com/zhw2590582/ArtPlayer\n * (c) 2017-2025 Harvey Zack\n * Released under the MIT License.\n */\n!function(e,t,r,a,o){var i=\"undefined\"!=typeof globalThis?globalThis:\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:{},n=\"function\"==typeof i[a]&&i[a],s=n.cache||{},l=\"undefined\"!=typeof module&&\"function\"==typeof module.require&&module.require.bind(module);function c(t,r){if(!s[t]){if(!e[t]){var o=\"function\"==typeof i[a]&&i[a];if(!r&&o)return o(t,!0);if(n)return n(t,!0);if(l&&\"string\"==typeof t)return l(t);var p=Error(\"Cannot find module '\"+t+\"'\");throw p.code=\"MODULE_NOT_FOUND\",p}d.resolve=function(r){var a=e[t][1][r];return null!=a?a:r},d.cache={};var u=s[t]=new c.Module(t);e[t][0].call(u.exports,d,u,u.exports,this)}return s[t].exports;function d(e){var t=d.resolve(e);return!1===t?{}:c(t)}}c.isParcelRequire=!0,c.Module=function(e){this.id=e,this.bundle=c,this.exports={}},c.modules=e,c.cache=s,c.parent=n,c.register=function(t,r){e[t]=[function(e,t){t.exports=r},{}]},Object.defineProperty(c,\"root\",{get:function(){return i[a]}}),i[a]=c;for(var p=0;p<t.length;p++)c(t[p]);if(r){var u=c(r);\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=u:\"function\"==typeof define&&define.amd&&define(function(){return u})}}({\"5lTcX\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r);var o=e(\"bundle-text:./style/index.less\"),i=a.interopDefault(o),n=e(\"option-validator\"),s=a.interopDefault(n),l=e(\"./utils/emitter\"),c=a.interopDefault(l),p=e(\"./utils\"),u=e(\"./scheme\"),d=a.interopDefault(u),f=e(\"./config\"),h=a.interopDefault(f),m=e(\"./template\"),g=a.interopDefault(m),v=e(\"./i18n\"),y=a.interopDefault(v),b=e(\"./player\"),x=a.interopDefault(b),w=e(\"./control\"),j=a.interopDefault(w),k=e(\"./contextmenu\"),C=a.interopDefault(k),S=e(\"./info\"),I=a.interopDefault(S),T=e(\"./subtitle\"),$=a.interopDefault(T),E=e(\"./events\"),M=a.interopDefault(E),F=e(\"./hotkey\"),H=a.interopDefault(F),D=e(\"./layer\"),z=a.interopDefault(D),A=e(\"./loading\"),R=a.interopDefault(A),O=e(\"./notice\"),L=a.interopDefault(O),Y=e(\"./mask\"),P=a.interopDefault(Y),V=e(\"./icons\"),q=a.interopDefault(V),_=e(\"./setting\"),N=a.interopDefault(_),B=e(\"./storage\"),W=a.interopDefault(B),U=e(\"./plugins\"),K=a.interopDefault(U);let Z=0,X=[];class G extends c.default{constructor(e,t){super(),this.id=++Z;let r=p.mergeDeep(G.option,e);if(r.container=e.container,this.option=(0,s.default)(r,d.default),this.isLock=!1,this.isReady=!1,this.isFocus=!1,this.isInput=!1,this.isRotate=!1,this.isDestroy=!1,this.template=new g.default(this),this.events=new M.default(this),this.storage=new W.default(this),this.icons=new q.default(this),this.i18n=new y.default(this),this.notice=new L.default(this),this.player=new x.default(this),this.layers=new z.default(this),this.controls=new j.default(this),this.contextmenu=new C.default(this),this.subtitle=new $.default(this),this.info=new I.default(this),this.loading=new R.default(this),this.hotkey=new H.default(this),this.mask=new P.default(this),this.setting=new N.default(this),this.plugins=new K.default(this),\"function\"==typeof t&&this.on(\"ready\",()=>t.call(this,this)),G.DEBUG){let e=e=>console.log(`[ART.${this.id}] -> ${e}`);e(\"Version@\"+G.version),e(\"Env@\"+G.env),e(\"Build@\"+G.build);for(let t=0;t<h.default.events.length;t++)this.on(\"video:\"+h.default.events[t],t=>e(\"Event@\"+t.type))}X.push(this)}static get instances(){return X}static get version(){return\"5.2.2\"}static get env(){return\"production\"}static get build(){return\"2025-01-19 17:32:44\"}static get config(){return h.default}static get utils(){return p}static get scheme(){return d.default}static get Emitter(){return c.default}static get validator(){return s.default}static get kindOf(){return s.default.kindOf}static get html(){return g.default.html}static get option(){return{id:\"\",container:\"#artplayer\",url:\"\",poster:\"\",type:\"\",theme:\"#f00\",volume:.7,isLive:!1,muted:!1,autoplay:!1,autoSize:!1,autoMini:!1,loop:!1,flip:!1,playbackRate:!1,aspectRatio:!1,screenshot:!1,setting:!1,hotkey:!0,pip:!1,mutex:!0,backdrop:!0,fullscreen:!1,fullscreenWeb:!1,subtitleOffset:!1,miniProgressBar:!1,useSSR:!1,playsInline:!0,lock:!1,fastForward:!1,autoPlayback:!1,autoOrientation:!1,airplay:!1,proxy:void 0,layers:[],contextmenu:[],controls:[],settings:[],quality:[],highlight:[],plugins:[],thumbnails:{url:\"\",number:60,column:10,width:0,height:0,scale:1},subtitle:{url:\"\",type:\"\",style:{},name:\"\",escape:!0,encoding:\"utf-8\",onVttLoad:e=>e},moreVideoAttr:{controls:!1,preload:p.isSafari?\"auto\":\"metadata\"},i18n:{},icons:{},cssVar:{},customType:{},lang:navigator?.language.toLowerCase()}}get proxy(){return this.events.proxy}get query(){return this.template.query}get video(){return this.template.$video}destroy(e=!0){this.events.destroy(),this.template.destroy(e),X.splice(X.indexOf(this),1),this.isDestroy=!0,this.emit(\"destroy\")}}r.default=G,G.STYLE=i.default,G.DEBUG=!1,G.CONTEXTMENU=!0,G.NOTICE_TIME=2e3,G.SETTING_WIDTH=250,G.SETTING_ITEM_WIDTH=200,G.SETTING_ITEM_HEIGHT=35,G.RESIZE_TIME=200,G.SCROLL_TIME=200,G.SCROLL_GAP=50,G.AUTO_PLAYBACK_MAX=10,G.AUTO_PLAYBACK_MIN=5,G.AUTO_PLAYBACK_TIMEOUT=3e3,G.RECONNECT_TIME_MAX=5,G.RECONNECT_SLEEP_TIME=1e3,G.CONTROL_HIDE_TIME=3e3,G.DBCLICK_TIME=300,G.DBCLICK_FULLSCREEN=!0,G.MOBILE_DBCLICK_PLAY=!0,G.MOBILE_CLICK_PLAY=!1,G.AUTO_ORIENTATION_TIME=200,G.INFO_LOOP_TIME=1e3,G.FAST_FORWARD_VALUE=3,G.FAST_FORWARD_TIME=1e3,G.TOUCH_MOVE_RATIO=.5,G.VOLUME_STEP=.1,G.SEEK_STEP=5,G.PLAYBACK_RATE=[.5,.75,1,1.25,1.5,2],G.ASPECT_RATIO=[\"default\",\"4:3\",\"16:9\"],G.FLIP=[\"normal\",\"horizontal\",\"vertical\"],G.FULLSCREEN_WEB_IN_BODY=!1,G.LOG_VERSION=!0,G.USE_RAF=!1,p.isBrowser&&(window.Artplayer=G,p.setStyleText(\"artplayer-style\",i.default),setTimeout(()=>{G.LOG_VERSION&&console.log(`%c ArtPlayer %c ${G.version} %c https://artplayer.org`,\"color: #fff; background: #5f5f5f\",\"color: #fff; background: #4bc729\",\"\")},100))},{\"bundle-text:./style/index.less\":\"0016T\",\"option-validator\":\"bAWi2\",\"./utils/emitter\":\"66mFZ\",\"./utils\":\"71aH7\",\"./scheme\":\"AKEiO\",\"./config\":\"lyjeQ\",\"./template\":\"X13Zf\",\"./i18n\":\"3jKkj\",\"./player\":\"a90nx\",\"./control\":\"8Z0Uf\",\"./contextmenu\":\"2KYsr\",\"./info\":\"02ajl\",\"./subtitle\":\"eSWto\",\"./events\":\"jo4S1\",\"./hotkey\":\"6NoFy\",\"./layer\":\"6G6hZ\",\"./loading\":\"3dsEe\",\"./notice\":\"dWGTw\",\"./mask\":\"5POkG\",\"./icons\":\"6OeNg\",\"./setting\":\"3eYNH\",\"./storage\":\"2aaJe\",\"./plugins\":\"8MTUM\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"0016T\":[function(e,t,r){t.exports='.art-video-player{--art-theme:red;--art-font-color:#fff;--art-background-color:#000;--art-text-shadow-color:#00000080;--art-transition-duration:.2s;--art-padding:10px;--art-border-radius:3px;--art-progress-height:6px;--art-progress-color:#ffffff40;--art-hover-color:#ffffff40;--art-loaded-color:#ffffff40;--art-state-size:80px;--art-state-opacity:.8;--art-bottom-height:100px;--art-bottom-offset:20px;--art-bottom-gap:5px;--art-highlight-width:8px;--art-highlight-color:#ffffff80;--art-control-height:46px;--art-control-opacity:.75;--art-control-icon-size:36px;--art-control-icon-scale:1.1;--art-volume-height:120px;--art-volume-handle-size:14px;--art-lock-size:36px;--art-indicator-scale:0;--art-indicator-size:16px;--art-fullscreen-web-index:9999;--art-settings-icon-size:24px;--art-settings-max-height:300px;--art-selector-max-height:300px;--art-contextmenus-min-width:250px;--art-subtitle-font-size:20px;--art-subtitle-gap:5px;--art-subtitle-bottom:15px;--art-subtitle-border:#000;--art-widget-background:#000000d9;--art-tip-background:#000000b3;--art-scrollbar-size:4px;--art-scrollbar-background:#ffffff40;--art-scrollbar-background-hover:#ffffff80;--art-mini-progress-height:2px}.art-bg-cover{background-position:50%;background-repeat:no-repeat;background-size:cover}.art-bottom-gradient{background-image:linear-gradient(#0000,#0006,#000);background-position:bottom;background-repeat:repeat-x}.art-backdrop-filter{backdrop-filter:saturate(180%)blur(20px);background-color:#000000bf!important}.art-truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.art-video-player{zoom:1;text-align:left;user-select:none;box-sizing:border-box;color:var(--art-font-color);background-color:var(--art-background-color);text-shadow:0 0 2px var(--art-text-shadow-color);-webkit-tap-highlight-color:#0000;-ms-touch-action:manipulation;touch-action:manipulation;-ms-high-contrast-adjust:none;direction:ltr;outline:0;width:100%;height:100%;margin:0 auto;padding:0;font-family:PingFang SC,Helvetica Neue,Microsoft YaHei,Roboto,Arial,sans-serif;font-size:14px;line-height:1.3;position:relative}.art-video-player *,.art-video-player :before,.art-video-player :after{box-sizing:border-box}.art-video-player ::-webkit-scrollbar{width:var(--art-scrollbar-size);height:var(--art-scrollbar-size)}.art-video-player ::-webkit-scrollbar-thumb{background-color:var(--art-scrollbar-background)}.art-video-player ::-webkit-scrollbar-thumb:hover{background-color:var(--art-scrollbar-background-hover)}.art-video-player img{vertical-align:top;max-width:100%}.art-video-player svg{fill:var(--art-font-color)}.art-video-player a{color:var(--art-font-color);text-decoration:none}.art-icon{justify-content:center;align-items:center;line-height:1;display:flex}.art-video-player.art-backdrop .art-contextmenus,.art-video-player.art-backdrop .art-info,.art-video-player.art-backdrop .art-settings,.art-video-player.art-backdrop .art-layer-auto-playback,.art-video-player.art-backdrop .art-selector-list,.art-video-player.art-backdrop .art-volume-inner{backdrop-filter:saturate(180%)blur(20px);background-color:#000000bf!important}.art-video{z-index:10;cursor:pointer;width:100%;height:100%;position:absolute;inset:0}.art-poster{z-index:11;pointer-events:none;background-position:50%;background-repeat:no-repeat;background-size:cover;width:100%;height:100%;position:absolute;inset:0}.art-video-player .art-subtitle{z-index:20;text-align:center;pointer-events:none;justify-content:center;align-items:center;gap:var(--art-subtitle-gap);bottom:var(--art-subtitle-bottom);font-size:var(--art-subtitle-font-size);transition:bottom var(--art-transition-duration)ease;text-shadow:var(--art-subtitle-border)1px 0 1px,var(--art-subtitle-border)0 1px 1px,var(--art-subtitle-border)-1px 0 1px,var(--art-subtitle-border)0 -1px 1px,var(--art-subtitle-border)1px 1px 1px,var(--art-subtitle-border)-1px -1px 1px,var(--art-subtitle-border)1px -1px 1px,var(--art-subtitle-border)-1px 1px 1px;flex-direction:column;width:100%;padding:0 5%;display:none;position:absolute}.art-video-player.art-subtitle-show .art-subtitle{display:flex}.art-video-player.art-control-show .art-subtitle{bottom:calc(var(--art-control-height) + var(--art-subtitle-bottom))}.art-danmuku{z-index:30;pointer-events:none;width:100%;height:100%;position:absolute;inset:0;overflow:hidden}.art-video-player .art-layers{z-index:40;pointer-events:none;width:100%;height:100%;display:none;position:absolute;inset:0}.art-video-player .art-layers .art-layer{pointer-events:auto}.art-video-player.art-layer-show .art-layers{display:flex}.art-video-player .art-mask{z-index:50;pointer-events:none;justify-content:center;align-items:center;width:100%;height:100%;display:flex;position:absolute;inset:0}.art-video-player .art-mask .art-state{opacity:0;width:var(--art-state-size);height:var(--art-state-size);transition:all var(--art-transition-duration)ease;justify-content:center;align-items:center;display:flex;transform:scale(2)}.art-video-player.art-mask-show .art-state{cursor:pointer;pointer-events:auto;opacity:var(--art-state-opacity);transform:scale(1)}.art-video-player.art-loading-show .art-state{display:none}.art-video-player .art-loading{z-index:70;pointer-events:none;justify-content:center;align-items:center;width:100%;height:100%;display:none;position:absolute;inset:0}.art-video-player.art-loading-show .art-loading{display:flex}.art-video-player .art-bottom{z-index:60;opacity:0;pointer-events:none;padding:0 var(--art-padding);transition:all var(--art-transition-duration)ease;background-size:100% var(--art-bottom-height);background-image:linear-gradient(#0000,#0006,#000);background-position:bottom;background-repeat:repeat-x;flex-direction:column;justify-content:flex-end;width:100%;height:100%;display:flex;position:absolute;inset:0;overflow:hidden}.art-video-player .art-bottom .art-controls,.art-video-player .art-bottom .art-progress{transform:translateY(var(--art-bottom-offset));transition:transform var(--art-transition-duration)ease}.art-video-player.art-control-show .art-bottom,.art-video-player.art-hover .art-bottom{opacity:1}.art-video-player.art-control-show .art-bottom .art-controls,.art-video-player.art-hover .art-bottom .art-controls,.art-video-player.art-control-show .art-bottom .art-progress,.art-video-player.art-hover .art-bottom .art-progress{transform:translateY(0)}.art-bottom .art-progress{z-index:0;pointer-events:auto;padding-bottom:var(--art-bottom-gap);position:relative}.art-bottom .art-progress .art-control-progress{cursor:pointer;height:var(--art-progress-height);justify-content:center;align-items:center;display:flex;position:relative}.art-bottom .art-progress .art-control-progress .art-control-progress-inner{transition:height var(--art-transition-duration)ease;background-color:var(--art-progress-color);align-items:center;width:100%;height:50%;display:flex;position:relative}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-hover{z-index:0;background-color:var(--art-hover-color);width:0%;height:100%;position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-loaded{z-index:10;background-color:var(--art-loaded-color);width:0%;height:100%;position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-played{z-index:20;background-color:var(--art-theme);width:0%;height:100%;position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-highlight{z-index:30;pointer-events:none;width:100%;height:100%;position:absolute;inset:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-highlight span{z-index:0;pointer-events:auto;transform:translateX(calc(var(--art-highlight-width)/-2));background-color:var(--art-highlight-color);width:100%;height:100%;position:absolute;inset:0 auto 0 0;width:var(--art-highlight-width)!important}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator{z-index:40;width:var(--art-indicator-size);height:var(--art-indicator-size);transform:scale(var(--art-indicator-scale));margin-left:calc(var(--art-indicator-size)/-2);transition:transform var(--art-transition-duration)ease;border-radius:50%;justify-content:center;align-items:center;display:flex;position:absolute;left:0}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator .art-icon{pointer-events:none;width:100%;height:100%}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator:hover{transform:scale(1.2)!important}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator:active{transform:scale(1)!important}.art-bottom .art-progress .art-control-progress .art-control-progress-inner .art-progress-tip{z-index:50;border-radius:var(--art-border-radius);white-space:nowrap;background-color:var(--art-tip-background);padding:3px 5px;font-size:12px;line-height:1;display:none;position:absolute;top:-25px;left:0}.art-bottom .art-progress .art-control-progress:hover .art-control-progress-inner{height:100%}.art-bottom .art-progress .art-control-thumbnails{bottom:calc(var(--art-bottom-gap) + 10px);border-radius:var(--art-border-radius);pointer-events:none;background-color:var(--art-widget-background);display:none;position:absolute;left:0;box-shadow:0 1px 3px #0003,0 1px 2px -1px #0003}.art-bottom:hover .art-progress .art-control-progress .art-control-progress-inner .art-progress-indicator{transform:scale(1)}.art-controls{z-index:10;pointer-events:auto;height:var(--art-control-height);justify-content:space-between;align-items:center;display:flex;position:relative}.art-controls .art-controls-left,.art-controls .art-controls-right{height:100%;display:flex}.art-controls .art-controls-center{flex:1;justify-content:center;align-items:center;height:100%;padding:0 10px;display:none}.art-controls .art-controls-right{justify-content:flex-end}.art-controls .art-control{cursor:pointer;white-space:nowrap;opacity:var(--art-control-opacity);min-height:var(--art-control-height);min-width:var(--art-control-height);transition:opacity var(--art-transition-duration)ease;flex-shrink:0;justify-content:center;align-items:center;display:flex}.art-controls .art-control .art-icon{height:var(--art-control-icon-size);width:var(--art-control-icon-size);transform:scale(var(--art-control-icon-scale));transition:transform var(--art-transition-duration)ease}.art-controls .art-control .art-icon:active{transform:scale(calc(var(--art-control-icon-scale)*.8))}.art-controls .art-control:hover{opacity:1}.art-control-volume{position:relative}.art-control-volume .art-volume-panel{text-align:center;cursor:default;opacity:0;pointer-events:none;left:0;right:0;bottom:var(--art-control-height);width:var(--art-control-height);height:var(--art-volume-height);transition:all var(--art-transition-duration)ease;justify-content:center;align-items:center;padding:0 5px;font-size:12px;display:flex;position:absolute;transform:translateY(10px)}.art-control-volume .art-volume-panel .art-volume-inner{border-radius:var(--art-border-radius);background-color:var(--art-widget-background);flex-direction:column;align-items:center;gap:10px;width:100%;height:100%;padding:10px 0 12px;display:flex}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider{cursor:pointer;flex:1;justify-content:center;width:100%;display:flex;position:relative}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-handle{border-radius:var(--art-border-radius);background-color:#ffffff40;justify-content:center;width:2px;display:flex;position:relative;overflow:hidden}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-handle .art-volume-loaded{z-index:0;background-color:var(--art-theme);width:100%;height:100%;position:absolute;inset:0}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider .art-volume-indicator{width:var(--art-volume-handle-size);height:var(--art-volume-handle-size);margin-top:calc(var(--art-volume-handle-size)/-2);background-color:var(--art-theme);transition:transform var(--art-transition-duration)ease;border-radius:100%;flex-shrink:0;position:absolute;transform:scale(1)}.art-control-volume .art-volume-panel .art-volume-inner .art-volume-slider:active .art-volume-indicator{transform:scale(.9)}.art-control-volume:hover .art-volume-panel{opacity:1;pointer-events:auto;transform:translateY(0)}.art-video-player .art-notice{z-index:80;padding:var(--art-padding);pointer-events:none;width:100%;height:auto;display:none;position:absolute;inset:0 0 auto}.art-video-player .art-notice .art-notice-inner{border-radius:var(--art-border-radius);background-color:var(--art-tip-background);padding:5px;line-height:1;display:inline-flex}.art-video-player.art-notice-show .art-notice{display:flex}.art-video-player .art-contextmenus{z-index:120;border-radius:var(--art-border-radius);background-color:var(--art-widget-background);min-width:var(--art-contextmenus-min-width);flex-direction:column;padding:5px 0;font-size:12px;display:none;position:absolute}.art-video-player .art-contextmenus .art-contextmenu{cursor:pointer;border-bottom:1px solid #ffffff1a;padding:10px 15px;display:flex}.art-video-player .art-contextmenus .art-contextmenu span{padding:0 8px}.art-video-player .art-contextmenus .art-contextmenu span:hover,.art-video-player .art-contextmenus .art-contextmenu span.art-current{color:var(--art-theme)}.art-video-player .art-contextmenus .art-contextmenu:hover{background-color:#ffffff1a}.art-video-player .art-contextmenus .art-contextmenu:last-child{border-bottom:none}.art-video-player.art-contextmenu-show .art-contextmenus{display:flex}.art-video-player .art-settings{z-index:90;border-radius:var(--art-border-radius);max-height:var(--art-settings-max-height);left:auto;right:var(--art-padding);bottom:var(--art-control-height);transition:all var(--art-transition-duration)ease;background-color:var(--art-widget-background);flex-direction:column;display:none;position:absolute;overflow:hidden auto}.art-video-player .art-settings .art-setting-panel{flex-direction:column;display:none}.art-video-player .art-settings .art-setting-panel.art-current{display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item{cursor:pointer;transition:background-color var(--art-transition-duration)ease;justify-content:space-between;align-items:center;padding:0 5px;display:flex;overflow:hidden}.art-video-player .art-settings .art-setting-panel .art-setting-item:hover{background-color:#ffffff1a}.art-video-player .art-settings .art-setting-panel .art-setting-item.art-current{color:var(--art-theme)}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-icon-check{visibility:hidden;height:15px}.art-video-player .art-settings .art-setting-panel .art-setting-item.art-current .art-icon-check{visibility:visible}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-left{flex-shrink:0;justify-content:center;align-items:center;gap:5px;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-left .art-setting-item-left-icon{height:var(--art-settings-icon-size);width:var(--art-settings-icon-size);justify-content:center;align-items:center;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right{justify-content:center;align-items:center;gap:5px;font-size:12px;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-item-right-tooltip{white-space:nowrap;color:#ffffff80}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-item-right-icon{justify-content:center;align-items:center;min-width:32px;height:24px;display:flex}.art-video-player .art-settings .art-setting-panel .art-setting-item .art-setting-item-right .art-setting-range{appearance:none;background-color:#fff3;outline:none;width:80px;height:3px}.art-video-player .art-settings .art-setting-panel .art-setting-item-back{border-bottom:1px solid #ffffff1a}.art-video-player.art-setting-show .art-settings{display:flex}.art-video-player .art-info{left:var(--art-padding);top:var(--art-padding);z-index:100;border-radius:var(--art-border-radius);background-color:var(--art-widget-background);padding:10px;font-size:12px;display:none;position:absolute}.art-video-player .art-info .art-info-panel{flex-direction:column;gap:5px;display:flex}.art-video-player .art-info .art-info-panel .art-info-item{align-items:center;gap:5px;display:flex}.art-video-player .art-info .art-info-panel .art-info-item .art-info-title{text-align:right;width:100px}.art-video-player .art-info .art-info-panel .art-info-item .art-info-content{text-overflow:ellipsis;white-space:nowrap;user-select:all;width:250px;overflow:hidden}.art-video-player .art-info .art-info-close{cursor:pointer;position:absolute;top:5px;right:5px}.art-video-player.art-info-show .art-info{display:flex}.art-hide-cursor *{cursor:none!important}.art-video-player[data-aspect-ratio]{overflow:hidden}.art-video-player[data-aspect-ratio] .art-video{object-fit:fill;box-sizing:content-box}.art-fullscreen{--art-progress-height:8px;--art-indicator-size:20px;--art-control-height:60px;--art-control-icon-scale:1.3}.art-fullscreen-web{--art-progress-height:8px;--art-indicator-size:20px;--art-control-height:60px;--art-control-icon-scale:1.3;z-index:var(--art-fullscreen-web-index);width:100%;height:100%;position:fixed;inset:0}.art-mini-popup{z-index:9999;border-radius:var(--art-border-radius);cursor:move;user-select:none;background:#000;width:320px;height:180px;transition:opacity .2s;position:fixed;overflow:hidden;box-shadow:0 0 5px #00000080}.art-mini-popup svg{fill:#fff}.art-mini-popup .art-video{pointer-events:none}.art-mini-popup .art-mini-close{z-index:20;cursor:pointer;opacity:0;transition:opacity .2s;position:absolute;top:10px;right:10px}.art-mini-popup .art-mini-state{z-index:30;pointer-events:none;opacity:0;background-color:#00000040;justify-content:center;align-items:center;width:100%;height:100%;transition:opacity .2s;display:flex;position:absolute;inset:0}.art-mini-popup .art-mini-state .art-icon{opacity:.75;cursor:pointer;pointer-events:auto;transition:transform .2s;transform:scale(3)}.art-mini-popup .art-mini-state .art-icon:active{transform:scale(2.5)}.art-mini-popup.art-mini-droging{opacity:.9}.art-mini-popup:hover .art-mini-close,.art-mini-popup:hover .art-mini-state{opacity:1}.art-video-player[data-flip=horizontal] .art-video{transform:scaleX(-1)}.art-video-player[data-flip=vertical] .art-video{transform:scaleY(-1)}.art-video-player .art-layer-lock{height:var(--art-lock-size);width:var(--art-lock-size);top:50%;left:var(--art-padding);background-color:var(--art-tip-background);border-radius:50%;justify-content:center;align-items:center;display:none;position:absolute;transform:translateY(-50%)}.art-video-player .art-layer-auto-playback{border-radius:var(--art-border-radius);left:var(--art-padding);bottom:calc(var(--art-control-height) + var(--art-bottom-gap) + 10px);background-color:var(--art-widget-background);align-items:center;gap:10px;padding:10px;line-height:1;display:none;position:absolute}.art-video-player .art-layer-auto-playback .art-auto-playback-close{cursor:pointer;justify-content:center;align-items:center;display:flex}.art-video-player .art-layer-auto-playback .art-auto-playback-close svg{fill:var(--art-theme);width:15px;height:15px}.art-video-player .art-layer-auto-playback .art-auto-playback-jump{color:var(--art-theme);cursor:pointer}.art-video-player.art-lock .art-subtitle{bottom:var(--art-subtitle-bottom)!important}.art-video-player.art-mini-progress-bar .art-bottom,.art-video-player.art-lock .art-bottom{opacity:1;background-image:none;padding:0}.art-video-player.art-mini-progress-bar .art-bottom .art-controls,.art-video-player.art-lock .art-bottom .art-controls,.art-video-player.art-mini-progress-bar .art-bottom .art-progress,.art-video-player.art-lock .art-bottom .art-progress{transform:translateY(calc(var(--art-control-height) + var(--art-bottom-gap) + var(--art-progress-height)/4))}.art-video-player.art-mini-progress-bar .art-bottom .art-progress-indicator,.art-video-player.art-lock .art-bottom .art-progress-indicator{display:none!important}.art-video-player.art-control-show .art-layer-lock{display:flex}.art-control-selector{justify-content:center;display:flex;position:relative}.art-control-selector .art-selector-list{text-align:center;border-radius:var(--art-border-radius);opacity:0;pointer-events:none;bottom:var(--art-control-height);max-height:var(--art-selector-max-height);background-color:var(--art-widget-background);transition:all var(--art-transition-duration)ease;flex-direction:column;align-items:center;display:flex;position:absolute;overflow:hidden auto;transform:translateY(10px)}.art-control-selector .art-selector-list .art-selector-item{flex-shrink:0;justify-content:center;align-items:center;width:100%;padding:10px 15px;line-height:1;display:flex}.art-control-selector .art-selector-list .art-selector-item:hover{background-color:#ffffff1a}.art-control-selector .art-selector-list .art-selector-item:hover,.art-control-selector .art-selector-list .art-selector-item.art-current{color:var(--art-theme)}.art-control-selector:hover .art-selector-list{opacity:1;pointer-events:auto;transform:translateY(0)}[class*=hint--]{font-style:normal;display:inline-block;position:relative}[class*=hint--]:before,[class*=hint--]:after{visibility:hidden;opacity:0;z-index:1000000;pointer-events:none;transition:all .3s;position:absolute;transform:translate(0,0)}[class*=hint--]:hover:before,[class*=hint--]:hover:after{visibility:visible;opacity:1;transition-delay:.1s}[class*=hint--]:before{content:\"\";z-index:1000001;background:0 0;border:6px solid #0000;position:absolute}[class*=hint--]:after{color:#fff;white-space:nowrap;background:#000;padding:8px 10px;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:12px;line-height:12px}[class*=hint--][aria-label]:after{content:attr(aria-label)}[class*=hint--][data-hint]:after{content:attr(data-hint)}[aria-label=\"\"]:before,[aria-label=\"\"]:after,[data-hint=\"\"]:before,[data-hint=\"\"]:after{display:none!important}.hint--top-left:before,.hint--top-right:before,.hint--top:before{border-top-color:#000}.hint--bottom-left:before,.hint--bottom-right:before,.hint--bottom:before{border-bottom-color:#000}.hint--left:before{border-left-color:#000}.hint--right:before{border-right-color:#000}.hint--top:before{margin-bottom:-11px}.hint--top:before,.hint--top:after{bottom:100%;left:50%}.hint--top:before{left:calc(50% - 6px)}.hint--top:after{transform:translate(-50%)}.hint--top:hover:before{transform:translateY(-8px)}.hint--top:hover:after{transform:translate(-50%)translateY(-8px)}.hint--bottom:before{margin-top:-11px}.hint--bottom:before,.hint--bottom:after{top:100%;left:50%}.hint--bottom:before{left:calc(50% - 6px)}.hint--bottom:after{transform:translate(-50%)}.hint--bottom:hover:before{transform:translateY(8px)}.hint--bottom:hover:after{transform:translate(-50%)translateY(8px)}.hint--right:before{margin-bottom:-6px;margin-left:-11px}.hint--right:after{margin-bottom:-14px}.hint--right:before,.hint--right:after{bottom:50%;left:100%}.hint--right:hover:before,.hint--right:hover:after{transform:translate(8px)}.hint--left:before{margin-bottom:-6px;margin-right:-11px}.hint--left:after{margin-bottom:-14px}.hint--left:before,.hint--left:after{bottom:50%;right:100%}.hint--left:hover:before,.hint--left:hover:after{transform:translate(-8px)}.hint--top-left:before{margin-bottom:-11px}.hint--top-left:before,.hint--top-left:after{bottom:100%;left:50%}.hint--top-left:before{left:calc(50% - 6px)}.hint--top-left:after{margin-left:12px;transform:translate(-100%)}.hint--top-left:hover:before{transform:translateY(-8px)}.hint--top-left:hover:after{transform:translate(-100%)translateY(-8px)}.hint--top-right:before{margin-bottom:-11px}.hint--top-right:before,.hint--top-right:after{bottom:100%;left:50%}.hint--top-right:before{left:calc(50% - 6px)}.hint--top-right:after{margin-left:-12px;transform:translate(0)}.hint--top-right:hover:before,.hint--top-right:hover:after{transform:translateY(-8px)}.hint--bottom-left:before{margin-top:-11px}.hint--bottom-left:before,.hint--bottom-left:after{top:100%;left:50%}.hint--bottom-left:before{left:calc(50% - 6px)}.hint--bottom-left:after{margin-left:12px;transform:translate(-100%)}.hint--bottom-left:hover:before{transform:translateY(8px)}.hint--bottom-left:hover:after{transform:translate(-100%)translateY(8px)}.hint--bottom-right:before{margin-top:-11px}.hint--bottom-right:before,.hint--bottom-right:after{top:100%;left:50%}.hint--bottom-right:before{left:calc(50% - 6px)}.hint--bottom-right:after{margin-left:-12px;transform:translate(0)}.hint--bottom-right:hover:before,.hint--bottom-right:hover:after{transform:translateY(8px)}.hint--small:after,.hint--medium:after,.hint--large:after{white-space:normal;word-wrap:break-word;line-height:1.4em}.hint--small:after{width:80px}.hint--medium:after{width:150px}.hint--large:after{width:300px}[class*=hint--]:after{text-shadow:0 -1px #000;box-shadow:4px 4px 8px #0000004d}.hint--error:after{text-shadow:0 -1px #592726;background-color:#b34e4d}.hint--error.hint--top-left:before,.hint--error.hint--top-right:before,.hint--error.hint--top:before{border-top-color:#b34e4d}.hint--error.hint--bottom-left:before,.hint--error.hint--bottom-right:before,.hint--error.hint--bottom:before{border-bottom-color:#b34e4d}.hint--error.hint--left:before{border-left-color:#b34e4d}.hint--error.hint--right:before{border-right-color:#b34e4d}.hint--warning:after{text-shadow:0 -1px #6c5328;background-color:#c09854}.hint--warning.hint--top-left:before,.hint--warning.hint--top-right:before,.hint--warning.hint--top:before{border-top-color:#c09854}.hint--warning.hint--bottom-left:before,.hint--warning.hint--bottom-right:before,.hint--warning.hint--bottom:before{border-bottom-color:#c09854}.hint--warning.hint--left:before{border-left-color:#c09854}.hint--warning.hint--right:before{border-right-color:#c09854}.hint--info:after{text-shadow:0 -1px #1a3c4d;background-color:#3986ac}.hint--info.hint--top-left:before,.hint--info.hint--top-right:before,.hint--info.hint--top:before{border-top-color:#3986ac}.hint--info.hint--bottom-left:before,.hint--info.hint--bottom-right:before,.hint--info.hint--bottom:before{border-bottom-color:#3986ac}.hint--info.hint--left:before{border-left-color:#3986ac}.hint--info.hint--right:before{border-right-color:#3986ac}.hint--success:after{text-shadow:0 -1px #1a321a;background-color:#458746}.hint--success.hint--top-left:before,.hint--success.hint--top-right:before,.hint--success.hint--top:before{border-top-color:#458746}.hint--success.hint--bottom-left:before,.hint--success.hint--bottom-right:before,.hint--success.hint--bottom:before{border-bottom-color:#458746}.hint--success.hint--left:before{border-left-color:#458746}.hint--success.hint--right:before{border-right-color:#458746}.hint--always:after,.hint--always:before{opacity:1;visibility:visible}.hint--always.hint--top:before{transform:translateY(-8px)}.hint--always.hint--top:after{transform:translate(-50%)translateY(-8px)}.hint--always.hint--top-left:before{transform:translateY(-8px)}.hint--always.hint--top-left:after{transform:translate(-100%)translateY(-8px)}.hint--always.hint--top-right:before,.hint--always.hint--top-right:after{transform:translateY(-8px)}.hint--always.hint--bottom:before{transform:translateY(8px)}.hint--always.hint--bottom:after{transform:translate(-50%)translateY(8px)}.hint--always.hint--bottom-left:before{transform:translateY(8px)}.hint--always.hint--bottom-left:after{transform:translate(-100%)translateY(8px)}.hint--always.hint--bottom-right:before,.hint--always.hint--bottom-right:after{transform:translateY(8px)}.hint--always.hint--left:before,.hint--always.hint--left:after{transform:translate(-8px)}.hint--always.hint--right:before,.hint--always.hint--right:after{transform:translate(8px)}.hint--rounded:after{border-radius:4px}.hint--no-animate:before,.hint--no-animate:after{transition-duration:0s}.hint--bounce:before,.hint--bounce:after{-webkit-transition:opacity .3s,visibility .3s,-webkit-transform .3s cubic-bezier(.71,1.7,.77,1.24);-moz-transition:opacity .3s,visibility .3s,-moz-transform .3s cubic-bezier(.71,1.7,.77,1.24);transition:opacity .3s,visibility .3s,transform .3s cubic-bezier(.71,1.7,.77,1.24)}.hint--no-shadow:before,.hint--no-shadow:after{text-shadow:initial;box-shadow:initial}.hint--no-arrow:before{display:none}.art-video-player.art-mobile{--art-bottom-gap:10px;--art-control-height:38px;--art-control-icon-scale:1;--art-state-size:60px;--art-settings-max-height:180px;--art-selector-max-height:180px;--art-indicator-scale:1;--art-control-opacity:1}.art-video-player.art-mobile .art-controls-left{margin-left:calc(var(--art-padding)/-1)}.art-video-player.art-mobile .art-controls-right{margin-right:calc(var(--art-padding)/-1)}'},{}],bAWi2:[function(e,t,r){var a;a=function(){function e(t){return(e=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(t)}var t=Object.prototype.toString,r=function(r){if(void 0===r)return\"undefined\";if(null===r)return\"null\";var o=e(r);if(\"boolean\"===o)return\"boolean\";if(\"string\"===o)return\"string\";if(\"number\"===o)return\"number\";if(\"symbol\"===o)return\"symbol\";if(\"function\"===o)return\"GeneratorFunction\"===a(r)?\"generatorfunction\":\"function\";if(Array.isArray?Array.isArray(r):r instanceof Array)return\"array\";if(r.constructor&&\"function\"==typeof r.constructor.isBuffer&&r.constructor.isBuffer(r))return\"buffer\";if(function(e){try{if(\"number\"==typeof e.length&&\"function\"==typeof e.callee)return!0}catch(e){if(-1!==e.message.indexOf(\"callee\"))return!0}return!1}(r))return\"arguments\";if(r instanceof Date||\"function\"==typeof r.toDateString&&\"function\"==typeof r.getDate&&\"function\"==typeof r.setDate)return\"date\";if(r instanceof Error||\"string\"==typeof r.message&&r.constructor&&\"number\"==typeof r.constructor.stackTraceLimit)return\"error\";if(r instanceof RegExp||\"string\"==typeof r.flags&&\"boolean\"==typeof r.ignoreCase&&\"boolean\"==typeof r.multiline&&\"boolean\"==typeof r.global)return\"regexp\";switch(a(r)){case\"Symbol\":return\"symbol\";case\"Promise\":return\"promise\";case\"WeakMap\":return\"weakmap\";case\"WeakSet\":return\"weakset\";case\"Map\":return\"map\";case\"Set\":return\"set\";case\"Int8Array\":return\"int8array\";case\"Uint8Array\":return\"uint8array\";case\"Uint8ClampedArray\":return\"uint8clampedarray\";case\"Int16Array\":return\"int16array\";case\"Uint16Array\":return\"uint16array\";case\"Int32Array\":return\"int32array\";case\"Uint32Array\":return\"uint32array\";case\"Float32Array\":return\"float32array\";case\"Float64Array\":return\"float64array\"}if(\"function\"==typeof r.throw&&\"function\"==typeof r.return&&\"function\"==typeof r.next)return\"generator\";switch(o=t.call(r)){case\"[object Object]\":return\"object\";case\"[object Map Iterator]\":return\"mapiterator\";case\"[object Set Iterator]\":return\"setiterator\";case\"[object String Iterator]\":return\"stringiterator\";case\"[object Array Iterator]\":return\"arrayiterator\"}return o.slice(8,-1).toLowerCase().replace(/\\s/g,\"\")};function a(e){return e.constructor?e.constructor.name:null}function o(e,t){var a=2<arguments.length&&void 0!==arguments[2]?arguments[2]:[\"option\"];return i(e,t,a),n(e,t,a),function(e,t,a){var s=r(t),l=r(e);if(\"object\"===s){if(\"object\"!==l)throw Error(\"[Type Error]: '\".concat(a.join(\".\"),\"' require 'object' type, but got '\").concat(l,\"'\"));Object.keys(t).forEach(function(r){var s=e[r],l=t[r],c=a.slice();c.push(r),i(s,l,c),n(s,l,c),o(s,l,c)})}if(\"array\"===s){if(\"array\"!==l)throw Error(\"[Type Error]: '\".concat(a.join(\".\"),\"' require 'array' type, but got '\").concat(l,\"'\"));e.forEach(function(r,s){var l=e[s],c=t[s]||t[0],p=a.slice();p.push(s),i(l,c,p),n(l,c,p),o(l,c,p)})}}(e,t,a),e}function i(e,t,a){if(\"string\"===r(t)){var o=r(e);if(\"?\"===t[0]&&(t=t.slice(1)+\"|undefined\"),!(-1<t.indexOf(\"|\")?t.split(\"|\").map(function(e){return e.toLowerCase().trim()}).filter(Boolean).some(function(e){return o===e}):t.toLowerCase().trim()===o))throw Error(\"[Type Error]: '\".concat(a.join(\".\"),\"' require '\").concat(t,\"' type, but got '\").concat(o,\"'\"))}}function n(e,t,a){if(\"function\"===r(t)){var o=t(e,r(e),a);if(!0!==o){var i=r(o);throw\"string\"===i?Error(o):\"error\"===i?o:Error(\"[Validator Error]: The scheme for '\".concat(a.join(\".\"),\"' validator require return true, but got '\").concat(o,\"'\"))}}}return o.kindOf=r,o},t.exports=a()},{}],\"66mFZ\":[function(e,t,r){e(\"@parcel/transformer-js/src/esmodule-helpers.js\").defineInteropFlag(r),r.default=class{on(e,t,r){let a=this.e||(this.e={});return(a[e]||(a[e]=[])).push({fn:t,ctx:r}),this}once(e,t,r){let a=this;function o(...i){a.off(e,o),t.apply(r,i)}return o._=t,this.on(e,o,r)}emit(e,...t){let r=((this.e||(this.e={}))[e]||[]).slice();for(let e=0;e<r.length;e+=1)r[e].fn.apply(r[e].ctx,t);return this}off(e,t){let r=this.e||(this.e={}),a=r[e],o=[];if(a&&t)for(let e=0,r=a.length;e<r;e+=1)a[e].fn!==t&&a[e].fn._!==t&&o.push(a[e]);return o.length?r[e]=o:delete r[e],this}}},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"9pCYc\":[function(e,t,r){r.interopDefault=function(e){return e&&e.__esModule?e:{default:e}},r.defineInteropFlag=function(e){Object.defineProperty(e,\"__esModule\",{value:!0})},r.exportAll=function(e,t){return Object.keys(e).forEach(function(r){\"default\"===r||\"__esModule\"===r||Object.prototype.hasOwnProperty.call(t,r)||Object.defineProperty(t,r,{enumerable:!0,get:function(){return e[r]}})}),t},r.export=function(e,t,r){Object.defineProperty(e,t,{enumerable:!0,get:r})}},{}],\"71aH7\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r);var o=e(\"./dom\");a.exportAll(o,r);var i=e(\"./error\");a.exportAll(i,r);var n=e(\"./subtitle\");a.exportAll(n,r);var s=e(\"./file\");a.exportAll(s,r);var l=e(\"./property\");a.exportAll(l,r);var c=e(\"./time\");a.exportAll(c,r);var p=e(\"./format\");a.exportAll(p,r);var u=e(\"./compatibility\");a.exportAll(u,r)},{\"./dom\":\"bSNiV\",\"./error\":\"hwmZz\",\"./subtitle\":\"inzwq\",\"./file\":\"6b7Ip\",\"./property\":\"5NSdr\",\"./time\":\"epmNy\",\"./format\":\"gapRl\",\"./compatibility\":\"6ZTr6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],bSNiV:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"query\",()=>i),a.export(r,\"queryAll\",()=>n),a.export(r,\"addClass\",()=>s),a.export(r,\"removeClass\",()=>l),a.export(r,\"hasClass\",()=>c),a.export(r,\"append\",()=>p),a.export(r,\"remove\",()=>u),a.export(r,\"setStyle\",()=>d),a.export(r,\"setStyles\",()=>f),a.export(r,\"getStyle\",()=>h),a.export(r,\"sublings\",()=>m),a.export(r,\"inverseClass\",()=>g),a.export(r,\"tooltip\",()=>v),a.export(r,\"isInViewport\",()=>y),a.export(r,\"includeFromEvent\",()=>b),a.export(r,\"replaceElement\",()=>x),a.export(r,\"createElement\",()=>w),a.export(r,\"getIcon\",()=>j),a.export(r,\"setStyleText\",()=>k),a.export(r,\"supportsFlex\",()=>C),a.export(r,\"getRect\",()=>S),a.export(r,\"loadImg\",()=>I);var o=e(\"./compatibility\");function i(e,t=document){return t.querySelector(e)}function n(e,t=document){return Array.from(t.querySelectorAll(e))}function s(e,t){return e.classList.add(t)}function l(e,t){return e.classList.remove(t)}function c(e,t){return e.classList.contains(t)}function p(e,t){return t instanceof Element?e.appendChild(t):e.insertAdjacentHTML(\"beforeend\",String(t)),e.lastElementChild||e.lastChild}function u(e){return e.parentNode.removeChild(e)}function d(e,t,r){return e.style[t]=r,e}function f(e,t){for(let r in t)d(e,r,t[r]);return e}function h(e,t,r=!0){let a=window.getComputedStyle(e,null).getPropertyValue(t);return r?parseFloat(a):a}function m(e){return Array.from(e.parentElement.children).filter(t=>t!==e)}function g(e,t){m(e).forEach(e=>l(e,t)),s(e,t)}function v(e,t,r=\"top\"){o.isMobile||(e.setAttribute(\"aria-label\",t),s(e,\"hint--rounded\"),s(e,`hint--${r}`))}function y(e,t=0){let r=e.getBoundingClientRect(),a=window.innerHeight||document.documentElement.clientHeight,o=window.innerWidth||document.documentElement.clientWidth,i=r.top-t<=a&&r.top+r.height+t>=0,n=r.left-t<=o+t&&r.left+r.width+t>=0;return i&&n}function b(e,t){return e.composedPath&&e.composedPath().indexOf(t)>-1}function x(e,t){return t.parentNode.replaceChild(e,t),e}function w(e){return document.createElement(e)}function j(e=\"\",t=\"\"){let r=w(\"i\");return s(r,\"art-icon\"),s(r,`art-icon-${e}`),p(r,t),r}function k(e,t){let r=document.getElementById(e);r||((r=document.createElement(\"style\")).id=e,\"loading\"===document.readyState?document.addEventListener(\"DOMContentLoaded\",()=>{document.head.appendChild(r)}):(document.head||document.documentElement).appendChild(r)),r.textContent=t}function C(){let e=document.createElement(\"div\");return e.style.display=\"flex\",\"flex\"===e.style.display}function S(e){return e.getBoundingClientRect()}function I(e,t){return new Promise((r,a)=>{let o=new Image;o.onload=function(){if(t&&1!==t){let i=document.createElement(\"canvas\"),n=i.getContext(\"2d\");i.width=o.width*t,i.height=o.height*t,n.drawImage(o,0,0,i.width,i.height),i.toBlob(t=>{let o=URL.createObjectURL(t),i=new Image;i.onload=function(){r(i)},i.onerror=function(){URL.revokeObjectURL(o),a(Error(`Image load failed: ${e}`))},i.src=o})}else r(o)},o.onerror=function(){a(Error(`Image load failed: ${e}`))},o.src=e})}},{\"./compatibility\":\"6ZTr6\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"6ZTr6\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"userAgent\",()=>o),a.export(r,\"isSafari\",()=>i),a.export(r,\"isWechat\",()=>n),a.export(r,\"isIE\",()=>s),a.export(r,\"isAndroid\",()=>l),a.export(r,\"isIOS\",()=>c),a.export(r,\"isIOS13\",()=>p),a.export(r,\"isMobile\",()=>u),a.export(r,\"isBrowser\",()=>d);let o=\"undefined\"!=typeof navigator?navigator.userAgent:\"\",i=/^((?!chrome|android).)*safari/i.test(o),n=/MicroMessenger/i.test(o),s=/MSIE|Trident/i.test(o),l=/android/i.test(o),c=/iPad|iPhone|iPod/i.test(o)&&!window.MSStream,p=c||o.includes(\"Macintosh\")&&navigator.maxTouchPoints>=1,u=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(o)||p,d=\"undefined\"!=typeof window},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],hwmZz:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"ArtPlayerError\",()=>o),a.export(r,\"errorHandle\",()=>i);class o extends Error{constructor(e,t){super(e),\"function\"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,t||this.constructor),this.name=\"ArtPlayerError\"}}function i(e,t){if(!e)throw new o(t);return e}},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],inzwq:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");function o(e){return\"WEBVTT \\r\\n\\r\\n\".concat(e.replace(/(\\d\\d:\\d\\d:\\d\\d)[,.](\\d+)/g,(e,t,r)=>{let a=r.slice(0,3);return 1===r.length&&(a=r+\"00\"),2===r.length&&(a=r+\"0\"),`${t},${a}`}).replace(/\\{\\\\([ibu])\\}/g,\"</$1>\").replace(/\\{\\\\([ibu])1\\}/g,\"<$1>\").replace(/\\{([ibu])\\}/g,\"<$1>\").replace(/\\{\\/([ibu])\\}/g,\"</$1>\").replace(/(\\d\\d:\\d\\d:\\d\\d),(\\d\\d\\d)/g,\"$1.$2\").replace(/{[\\s\\S]*?}/g,\"\").concat(\"\\r\\n\\r\\n\"))}function i(e){return URL.createObjectURL(new Blob([e],{type:\"text/vtt\"}))}function n(e){let t=RegExp(\"Dialogue:\\\\s\\\\d,(\\\\d+:\\\\d\\\\d:\\\\d\\\\d.\\\\d\\\\d),(\\\\d+:\\\\d\\\\d:\\\\d\\\\d.\\\\d\\\\d),([^,]*),([^,]*),(?:[^,]*,){4}([\\\\s\\\\S]*)$\",\"i\");function r(e=\"\"){return e.split(/[:.]/).map((e,t,r)=>{if(t===r.length-1){if(1===e.length)return`.${e}00`;if(2===e.length)return`.${e}0`}else if(1===e.length)return(0===t?\"0\":\":0\")+e;return 0===t?e:t===r.length-1?`.${e}`:`:${e}`}).join(\"\")}return\"WEBVTT\\n\\n\"+e.split(/\\r?\\n/).map(e=>{let a=e.match(t);return a?{start:r(a[1].trim()),end:r(a[2].trim()),text:a[5].replace(/{[\\s\\S]*?}/g,\"\").replace(/(\\\\N)/g,\"\\n\").trim().split(/\\r?\\n/).map(e=>e.trim()).join(\"\\n\")}:null}).filter(e=>e).map((e,t)=>e?t+1+\"\\n\"+`${e.start} --> ${e.end}`+\"\\n\"+`${e.text}`:\"\").filter(e=>e.trim()).join(\"\\n\\n\")}a.defineInteropFlag(r),a.export(r,\"srtToVtt\",()=>o),a.export(r,\"vttToBlob\",()=>i),a.export(r,\"assToVtt\",()=>n)},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"6b7Ip\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");function o(e,t){let r=document.createElement(\"a\");r.style.display=\"none\",r.href=e,r.download=t,document.body.appendChild(r),r.click(),document.body.removeChild(r)}a.defineInteropFlag(r),a.export(r,\"getExt\",()=>function e(t){return t.includes(\"?\")?e(t.split(\"?\")[0]):t.includes(\"#\")?e(t.split(\"#\")[0]):t.trim().toLowerCase().split(\".\").pop()}),a.export(r,\"download\",()=>o)},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"5NSdr\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"def\",()=>o),a.export(r,\"has\",()=>n),a.export(r,\"get\",()=>s),a.export(r,\"mergeDeep\",()=>function e(...t){let r=e=>e&&\"object\"==typeof e&&!Array.isArray(e);return t.reduce((t,a)=>(Object.keys(a).forEach(o=>{let i=t[o],n=a[o];Array.isArray(i)&&Array.isArray(n)?t[o]=i.concat(...n):r(i)&&r(n)?t[o]=e(i,n):t[o]=n}),t),{})});let o=Object.defineProperty,{hasOwnProperty:i}=Object.prototype;function n(e,t){return i.call(e,t)}function s(e,t){return Object.getOwnPropertyDescriptor(e,t)}},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],epmNy:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");function o(e=0){return new Promise(t=>setTimeout(t,e))}function i(e,t){let r;return function(...a){clearTimeout(r),r=setTimeout(()=>(r=null,e.apply(this,a)),t)}}function n(e,t){let r=!1;return function(...a){r||(e.apply(this,a),r=!0,setTimeout(function(){r=!1},t))}}a.defineInteropFlag(r),a.export(r,\"sleep\",()=>o),a.export(r,\"debounce\",()=>i),a.export(r,\"throttle\",()=>n)},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],gapRl:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");function o(e,t,r){return Math.max(Math.min(e,Math.max(t,r)),Math.min(t,r))}function i(e){return e.charAt(0).toUpperCase()+e.slice(1)}function n(e){if(!e)return\"00:00\";let t=Math.floor(e/3600),r=Math.floor((e-3600*t)/60),a=Math.floor(e-3600*t-60*r);return(t>0?[t,r,a]:[r,a]).map(e=>e<10?`0${e}`:String(e)).join(\":\")}function s(e){return e.replace(/[&<>'\"]/g,e=>({\"&\":\"&\",\"<\":\"<\",\">\":\">\",\"'\":\"'\",'\"':\""\"})[e]||e)}function l(e){let t={\"&\":\"&\",\"<\":\"<\",\">\":\">\",\"'\":\"'\",\""\":'\"'},r=RegExp(`(${Object.keys(t).join(\"|\")})`,\"g\");return e.replace(r,e=>t[e]||e)}a.defineInteropFlag(r),a.export(r,\"clamp\",()=>o),a.export(r,\"capitalize\",()=>i),a.export(r,\"secondToTime\",()=>n),a.export(r,\"escape\",()=>s),a.export(r,\"unescape\",()=>l)},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],AKEiO:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"ComponentOption\",()=>d);var o=e(\"../utils\");let i=\"array\",n=\"boolean\",s=\"string\",l=\"number\",c=\"object\",p=\"function\";function u(e,t,r){return(0,o.errorHandle)(t===s||t===l||e instanceof Element,`${r.join(\".\")} require '${s}' or 'Element' type`)}let d={html:u,disable:`?${n}`,name:`?${s}`,index:`?${l}`,style:`?${c}`,click:`?${p}`,mounted:`?${p}`,tooltip:`?${s}|${l}`,width:`?${l}`,selector:`?${i}`,onSelect:`?${p}`,switch:`?${n}`,onSwitch:`?${p}`,range:`?${i}`,onRange:`?${p}`,onChange:`?${p}`};r.default={id:s,container:u,url:s,poster:s,type:s,theme:s,lang:s,volume:l,isLive:n,muted:n,autoplay:n,autoSize:n,autoMini:n,loop:n,flip:n,playbackRate:n,aspectRatio:n,screenshot:n,setting:n,hotkey:n,pip:n,mutex:n,backdrop:n,fullscreen:n,fullscreenWeb:n,subtitleOffset:n,miniProgressBar:n,useSSR:n,playsInline:n,lock:n,fastForward:n,autoPlayback:n,autoOrientation:n,airplay:n,proxy:`?${p}`,plugins:[p],layers:[d],contextmenu:[d],settings:[d],controls:[{...d,position:(e,t,r)=>{let a=[\"top\",\"left\",\"right\"];return(0,o.errorHandle)(a.includes(e),`${r.join(\".\")} only accept ${a.toString()} as parameters`)}}],quality:[{default:`?${n}`,html:s,url:s}],highlight:[{time:l,text:s}],thumbnails:{url:s,number:l,column:l,width:l,height:l,scale:l},subtitle:{url:s,name:s,type:s,style:c,escape:n,encoding:s,onVttLoad:p},moreVideoAttr:c,i18n:c,icons:c,cssVar:c,customType:c}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],lyjeQ:[function(e,t,r){e(\"@parcel/transformer-js/src/esmodule-helpers.js\").defineInteropFlag(r),r.default={propertys:[\"audioTracks\",\"autoplay\",\"buffered\",\"controller\",\"controls\",\"crossOrigin\",\"currentSrc\",\"currentTime\",\"defaultMuted\",\"defaultPlaybackRate\",\"duration\",\"ended\",\"error\",\"loop\",\"mediaGroup\",\"muted\",\"networkState\",\"paused\",\"playbackRate\",\"played\",\"preload\",\"readyState\",\"seekable\",\"seeking\",\"src\",\"startDate\",\"textTracks\",\"videoTracks\",\"volume\"],methods:[\"addTextTrack\",\"canPlayType\",\"load\",\"play\",\"pause\"],events:[\"abort\",\"canplay\",\"canplaythrough\",\"durationchange\",\"emptied\",\"ended\",\"error\",\"loadeddata\",\"loadedmetadata\",\"loadstart\",\"pause\",\"play\",\"playing\",\"progress\",\"ratechange\",\"seeked\",\"seeking\",\"stalled\",\"suspend\",\"timeupdate\",\"volumechange\",\"waiting\"],prototypes:[\"width\",\"height\",\"videoWidth\",\"videoHeight\",\"poster\",\"webkitDecodedFrameCount\",\"webkitDroppedFrameCount\",\"playsInline\",\"webkitSupportsFullscreen\",\"webkitDisplayingFullscreen\",\"onenterpictureinpicture\",\"onleavepictureinpicture\",\"disablePictureInPicture\",\"cancelVideoFrameCallback\",\"requestVideoFrameCallback\",\"getVideoPlaybackQuality\",\"requestPictureInPicture\",\"webkitEnterFullScreen\",\"webkitEnterFullscreen\",\"webkitExitFullScreen\",\"webkitExitFullscreen\"]}},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],X13Zf:[function(e,t,r){e(\"@parcel/transformer-js/src/esmodule-helpers.js\").defineInteropFlag(r);var a=e(\"./utils\");class o{constructor(e){this.art=e;let{option:t,constructor:r}=e;t.container instanceof Element?this.$container=t.container:(this.$container=(0,a.query)(t.container),(0,a.errorHandle)(this.$container,`No container element found by ${t.container}`)),(0,a.errorHandle)((0,a.supportsFlex)(),\"The current browser does not support flex layout\");let o=this.$container.tagName.toLowerCase();(0,a.errorHandle)(\"div\"===o,`Unsupported container element type, only support 'div' but got '${o}'`),(0,a.errorHandle)(r.instances.every(e=>e.template.$container!==this.$container),\"Cannot mount multiple instances on the same dom element\"),this.query=this.query.bind(this),this.$container.dataset.artId=e.id,this.init()}static get html(){return`<div class=\"art-video-player art-subtitle-show art-layer-show art-control-show art-mask-show\"><video class=\"art-video\"><track default kind=\"metadata\" src=\"\"></track></video><div class=\"art-poster\"></div><div class=\"art-subtitle\"></div><div class=\"art-danmuku\"></div><div class=\"art-layers\"></div><div class=\"art-mask\"><div class=\"art-state\"></div></div><div class=\"art-bottom\"><div class=\"art-progress\"></div><div class=\"art-controls\"><div class=\"art-controls-left\"></div><div class=\"art-controls-center\"></div><div class=\"art-controls-right\"></div></div></div><div class=\"art-loading\"></div><div class=\"art-notice\"><div class=\"art-notice-inner\"></div></div><div class=\"art-settings\"></div><div class=\"art-info\"><div class=\"art-info-panel\"><div class=\"art-info-item\"><div class=\"art-info-title\">Player version:</div><div class=\"art-info-content\">5.2.2</div></div><div class=\"art-info-item\"><div class=\"art-info-title\">Video url:</div><div class=\"art-info-content\" data-video=\"src\"></div></div><div class=\"art-info-item\"><div class=\"art-info-title\">Video volume:</div><div class=\"art-info-content\" data-video=\"volume\"></div></div><div class=\"art-info-item\"><div class=\"art-info-title\">Video time:</div><div class=\"art-info-content\" data-video=\"currentTime\"></div></div><div class=\"art-info-item\"><div class=\"art-info-title\">Video duration:</div><div class=\"art-info-content\" data-video=\"duration\"></div></div><div class=\"art-info-item\"><div class=\"art-info-title\">Video resolution:</div><div class=\"art-info-content\"><span data-video=\"videoWidth\"></span>x<span data-video=\"videoHeight\"></span></div></div></div><div class=\"art-info-close\">[x]</div></div><div class=\"art-contextmenus\"></div></div>`}query(e){return(0,a.query)(e,this.$container)}init(){let{option:e}=this.art;if(e.useSSR||(this.$container.innerHTML=o.html),this.$player=this.query(\".art-video-player\"),this.$video=this.query(\".art-video\"),this.$track=this.query(\"track\"),this.$poster=this.query(\".art-poster\"),this.$subtitle=this.query(\".art-subtitle\"),this.$danmuku=this.query(\".art-danmuku\"),this.$bottom=this.query(\".art-bottom\"),this.$progress=this.query(\".art-progress\"),this.$controls=this.query(\".art-controls\"),this.$controlsLeft=this.query(\".art-controls-left\"),this.$controlsCenter=this.query(\".art-controls-center\"),this.$controlsRight=this.query(\".art-controls-right\"),this.$layer=this.query(\".art-layers\"),this.$loading=this.query(\".art-loading\"),this.$notice=this.query(\".art-notice\"),this.$noticeInner=this.query(\".art-notice-inner\"),this.$mask=this.query(\".art-mask\"),this.$state=this.query(\".art-state\"),this.$setting=this.query(\".art-settings\"),this.$info=this.query(\".art-info\"),this.$infoPanel=this.query(\".art-info-panel\"),this.$infoClose=this.query(\".art-info-close\"),this.$contextmenu=this.query(\".art-contextmenus\"),e.proxy){let t=e.proxy.call(this.art,this.art);(0,a.errorHandle)(t instanceof HTMLVideoElement||t instanceof HTMLCanvasElement,\"Function 'option.proxy' needs to return 'HTMLVideoElement' or 'HTMLCanvasElement'\"),(0,a.replaceElement)(t,this.$video),t.className=\"art-video\",this.$video=t}e.backdrop&&(0,a.addClass)(this.$player,\"art-backdrop\"),a.isMobile&&(0,a.addClass)(this.$player,\"art-mobile\")}destroy(e){e?this.$container.innerHTML=\"\":(0,a.addClass)(this.$player,\"art-destroy\")}}r.default=o},{\"./utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"3jKkj\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r);var o=e(\"../utils\"),i=e(\"./zh-cn\"),n=a.interopDefault(i);r.default=class{constructor(e){this.art=e,this.languages={\"zh-cn\":n.default},this.language={},this.update(e.option.i18n)}init(){let e=this.art.option.lang.toLowerCase();this.language=this.languages[e]||{}}get(e){return this.language[e]||e}update(e){this.languages=(0,o.mergeDeep)(this.languages,e),this.init()}}},{\"../utils\":\"71aH7\",\"./zh-cn\":\"5Y91w\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"5Y91w\":[function(e,t,r){e(\"@parcel/transformer-js/src/esmodule-helpers.js\").defineInteropFlag(r);let a={\"Video Info\":\"统计信息\",Close:\"关闭\",\"Video Load Failed\":\"加载失败\",Volume:\"音量\",Play:\"播放\",Pause:\"暂停\",Rate:\"速度\",Mute:\"静音\",\"Video Flip\":\"画面翻转\",Horizontal:\"水平\",Vertical:\"垂直\",Reconnect:\"重新连接\",\"Show Setting\":\"显示设置\",\"Hide Setting\":\"隐藏设置\",Screenshot:\"截图\",\"Play Speed\":\"播放速度\",\"Aspect Ratio\":\"画面比例\",Default:\"默认\",Normal:\"正常\",Open:\"打开\",\"Switch Video\":\"切换\",\"Switch Subtitle\":\"切换字幕\",Fullscreen:\"全屏\",\"Exit Fullscreen\":\"退出全屏\",\"Web Fullscreen\":\"网页全屏\",\"Exit Web Fullscreen\":\"退出网页全屏\",\"Mini Player\":\"迷你播放器\",\"PIP Mode\":\"开启画中画\",\"Exit PIP Mode\":\"退出画中画\",\"PIP Not Supported\":\"不支持画中画\",\"Fullscreen Not Supported\":\"不支持全屏\",\"Subtitle Offset\":\"字幕偏移\",\"Last Seen\":\"上次看到\",\"Jump Play\":\"跳转播放\",AirPlay:\"隔空播放\",\"AirPlay Not Available\":\"隔空播放不可用\"};r.default=a,\"undefined\"!=typeof window&&(window[\"artplayer-i18n-zh-cn\"]=a)},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],a90nx:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r);var o=e(\"./urlMix\"),i=a.interopDefault(o),n=e(\"./attrMix\"),s=a.interopDefault(n),l=e(\"./playMix\"),c=a.interopDefault(l),p=e(\"./pauseMix\"),u=a.interopDefault(p),d=e(\"./toggleMix\"),f=a.interopDefault(d),h=e(\"./seekMix\"),m=a.interopDefault(h),g=e(\"./volumeMix\"),v=a.interopDefault(g),y=e(\"./currentTimeMix\"),b=a.interopDefault(y),x=e(\"./durationMix\"),w=a.interopDefault(x),j=e(\"./switchMix\"),k=a.interopDefault(j),C=e(\"./playbackRateMix\"),S=a.interopDefault(C),I=e(\"./aspectRatioMix\"),T=a.interopDefault(I),$=e(\"./screenshotMix\"),E=a.interopDefault($),M=e(\"./fullscreenMix\"),F=a.interopDefault(M),H=e(\"./fullscreenWebMix\"),D=a.interopDefault(H),z=e(\"./pipMix\"),A=a.interopDefault(z),R=e(\"./loadedMix\"),O=a.interopDefault(R),L=e(\"./playedMix\"),Y=a.interopDefault(L),P=e(\"./playingMix\"),V=a.interopDefault(P),q=e(\"./autoSizeMix\"),_=a.interopDefault(q),N=e(\"./rectMix\"),B=a.interopDefault(N),W=e(\"./flipMix\"),U=a.interopDefault(W),K=e(\"./miniMix\"),Z=a.interopDefault(K),X=e(\"./posterMix\"),G=a.interopDefault(X),Q=e(\"./autoHeightMix\"),J=a.interopDefault(Q),ee=e(\"./cssVarMix\"),et=a.interopDefault(ee),er=e(\"./themeMix\"),ea=a.interopDefault(er),eo=e(\"./typeMix\"),ei=a.interopDefault(eo),en=e(\"./stateMix\"),es=a.interopDefault(en),el=e(\"./subtitleOffsetMix\"),ec=a.interopDefault(el),ep=e(\"./airplayMix\"),eu=a.interopDefault(ep),ed=e(\"./qualityMix\"),ef=a.interopDefault(ed),eh=e(\"./thumbnailsMix\"),em=a.interopDefault(eh),eg=e(\"./optionInit\"),ev=a.interopDefault(eg),ey=e(\"./eventInit\"),eb=a.interopDefault(ey);r.default=class{constructor(e){(0,i.default)(e),(0,s.default)(e),(0,c.default)(e),(0,u.default)(e),(0,f.default)(e),(0,m.default)(e),(0,v.default)(e),(0,b.default)(e),(0,w.default)(e),(0,k.default)(e),(0,S.default)(e),(0,T.default)(e),(0,E.default)(e),(0,F.default)(e),(0,D.default)(e),(0,A.default)(e),(0,O.default)(e),(0,Y.default)(e),(0,V.default)(e),(0,_.default)(e),(0,B.default)(e),(0,U.default)(e),(0,Z.default)(e),(0,G.default)(e),(0,J.default)(e),(0,et.default)(e),(0,ea.default)(e),(0,ei.default)(e),(0,es.default)(e),(0,ec.default)(e),(0,eu.default)(e),(0,ef.default)(e),(0,em.default)(e),(0,eb.default)(e),(0,ev.default)(e)}}},{\"./urlMix\":\"kQoac\",\"./attrMix\":\"deCma\",\"./playMix\":\"fOJuP\",\"./pauseMix\":\"fzHAy\",\"./toggleMix\":\"cBHxQ\",\"./seekMix\":\"koAPr\",\"./volumeMix\":\"6eyuR\",\"./currentTimeMix\":\"faaWv\",\"./durationMix\":\"5y91K\",\"./switchMix\":\"iceD8\",\"./playbackRateMix\":\"keKwh\",\"./aspectRatioMix\":\"jihET\",\"./screenshotMix\":\"36kPY\",\"./fullscreenMix\":\"2GYOJ\",\"./fullscreenWebMix\":\"5aYAP\",\"./pipMix\":\"7EnIB\",\"./loadedMix\":\"3N9mP\",\"./playedMix\":\"et96R\",\"./playingMix\":\"9DzzM\",\"./autoSizeMix\":\"i1LDY\",\"./rectMix\":\"IqARI\",\"./flipMix\":\"7E7Vs\",\"./miniMix\":\"gpugx\",\"./posterMix\":\"1SuFS\",\"./autoHeightMix\":\"8x4te\",\"./cssVarMix\":\"1CaTA\",\"./themeMix\":\"2FqhO\",\"./typeMix\":\"1fQQs\",\"./stateMix\":\"iBOQW\",\"./subtitleOffsetMix\":\"6vlBV\",\"./airplayMix\":\"eftqT\",\"./qualityMix\":\"5SdyX\",\"./thumbnailsMix\":\"4HcqV\",\"./optionInit\":\"fCWZK\",\"./eventInit\":\"f8Lv3\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],kQoac:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){let{option:t,template:{$video:r}}=e;(0,o.def)(e,\"url\",{get:()=>r.src,async set(a){if(a){let i=e.url,n=t.type||(0,o.getExt)(a),s=t.customType[n];n&&s?(await (0,o.sleep)(),e.loading.show=!0,s.call(e,r,a,e)):(URL.revokeObjectURL(i),r.src=a),i!==e.url&&(e.option.url=a,e.isReady&&i&&e.once(\"video:canplay\",()=>{e.emit(\"restart\",a)}))}else await (0,o.sleep)(),e.loading.show=!0}})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],deCma:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){let{template:{$video:t}}=e;(0,o.def)(e,\"attr\",{value(e,r){if(void 0===r)return t[e];t[e]=r}})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],fOJuP:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){let{i18n:t,notice:r,option:a,constructor:{instances:i},template:{$video:n}}=e;(0,o.def)(e,\"play\",{value:async function(){let o=await n.play();if(r.show=t.get(\"Play\"),e.emit(\"play\"),a.mutex)for(let t=0;t<i.length;t++){let r=i[t];r!==e&&r.pause()}return o}})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],fzHAy:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){let{template:{$video:t},i18n:r,notice:a}=e;(0,o.def)(e,\"pause\",{value(){let o=t.pause();return a.show=r.get(\"Pause\"),e.emit(\"pause\"),o}})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],cBHxQ:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){(0,o.def)(e,\"toggle\",{value:()=>e.playing?e.pause():e.play()})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],koAPr:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){let{notice:t}=e;(0,o.def)(e,\"seek\",{set(r){e.currentTime=r,e.emit(\"seek\",e.currentTime),e.duration&&(t.show=`${(0,o.secondToTime)(e.currentTime)} / ${(0,o.secondToTime)(e.duration)}`)}}),(0,o.def)(e,\"forward\",{set(t){e.seek=e.currentTime+t}}),(0,o.def)(e,\"backward\",{set(t){e.seek=e.currentTime-t}})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"6eyuR\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){let{template:{$video:t},i18n:r,notice:a,storage:i}=e;(0,o.def)(e,\"volume\",{get:()=>t.volume||0,set:e=>{t.volume=(0,o.clamp)(e,0,1),a.show=`${r.get(\"Volume\")}: ${parseInt(100*t.volume,10)}`,0!==t.volume&&i.set(\"volume\",t.volume)}}),(0,o.def)(e,\"muted\",{get:()=>t.muted,set:r=>{t.muted=r,e.emit(\"muted\",r)}})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],faaWv:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){let{$video:t}=e.template;(0,o.def)(e,\"currentTime\",{get:()=>t.currentTime||0,set:r=>{Number.isNaN(r=parseFloat(r))||(t.currentTime=(0,o.clamp)(r,0,e.duration))}})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"5y91K\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){(0,o.def)(e,\"duration\",{get:()=>{let{duration:t}=e.template.$video;return t===1/0?0:t||0}})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],iceD8:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){function t(t,r){return new Promise((a,o)=>{if(t===e.url)return;let{playing:i,aspectRatio:n,playbackRate:s}=e;e.pause(),e.url=t,e.notice.show=\"\",e.once(\"video:error\",o),e.once(\"video:loadedmetadata\",()=>{e.currentTime=r}),e.once(\"video:canplay\",async()=>{e.playbackRate=s,e.aspectRatio=n,i&&await e.play(),e.notice.show=\"\",a()})})}(0,o.def)(e,\"switchQuality\",{value:r=>t(r,e.currentTime)}),(0,o.def)(e,\"switchUrl\",{value:e=>t(e,0)}),(0,o.def)(e,\"switch\",{set:e.switchUrl})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],keKwh:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){let{template:{$video:t},i18n:r,notice:a}=e;(0,o.def)(e,\"playbackRate\",{get:()=>t.playbackRate,set(o){o?o!==t.playbackRate&&(t.playbackRate=o,a.show=`${r.get(\"Rate\")}: ${1===o?r.get(\"Normal\"):`${o}x`}`):e.playbackRate=1}})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],jihET:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){let{i18n:t,notice:r,template:{$video:a,$player:i}}=e;(0,o.def)(e,\"aspectRatio\",{get:()=>i.dataset.aspectRatio||\"default\",set(n){if(n||(n=\"default\"),\"default\"===n)(0,o.setStyle)(a,\"width\",null),(0,o.setStyle)(a,\"height\",null),(0,o.setStyle)(a,\"margin\",null),delete i.dataset.aspectRatio;else{let e=n.split(\":\").map(Number),{clientWidth:t,clientHeight:r}=i,s=e[0]/e[1];t/r>s?((0,o.setStyle)(a,\"width\",`${s*r}px`),(0,o.setStyle)(a,\"height\",\"100%\"),(0,o.setStyle)(a,\"margin\",\"0 auto\")):((0,o.setStyle)(a,\"width\",\"100%\"),(0,o.setStyle)(a,\"height\",`${t/s}px`),(0,o.setStyle)(a,\"margin\",\"auto 0\")),i.dataset.aspectRatio=n}r.show=`${t.get(\"Aspect Ratio\")}: ${\"default\"===n?t.get(\"Default\"):n}`,e.emit(\"aspectRatio\",n)}})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"36kPY\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){let{notice:t,template:{$video:r}}=e,a=(0,o.createElement)(\"canvas\");(0,o.def)(e,\"getDataURL\",{value:()=>new Promise((e,o)=>{try{a.width=r.videoWidth,a.height=r.videoHeight,a.getContext(\"2d\").drawImage(r,0,0),e(a.toDataURL(\"image/png\"))}catch(e){t.show=e,o(e)}})}),(0,o.def)(e,\"getBlobUrl\",{value:()=>new Promise((e,o)=>{try{a.width=r.videoWidth,a.height=r.videoHeight,a.getContext(\"2d\").drawImage(r,0,0),a.toBlob(t=>{e(URL.createObjectURL(t))})}catch(e){t.show=e,o(e)}})}),(0,o.def)(e,\"screenshot\",{value:async t=>{let a=await e.getDataURL(),i=t||`artplayer_${(0,o.secondToTime)(r.currentTime)}`;return(0,o.download)(a,`${i}.png`),e.emit(\"screenshot\",a),a}})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"2GYOJ\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>s);var o=e(\"../libs/screenfull\"),i=a.interopDefault(o),n=e(\"../utils\");function s(e){let{i18n:t,notice:r,template:{$video:a,$player:o}}=e,s=e=>{(0,i.default).on(\"change\",()=>{e.emit(\"fullscreen\",i.default.isFullscreen),i.default.isFullscreen?(e.state=\"fullscreen\",(0,n.addClass)(o,\"art-fullscreen\")):(0,n.removeClass)(o,\"art-fullscreen\"),e.emit(\"resize\")}),(0,i.default).on(\"error\",t=>{e.emit(\"fullscreenError\",t)}),(0,n.def)(e,\"fullscreen\",{get:()=>i.default.isFullscreen,async set(e){e?await (0,i.default).request(o):await (0,i.default).exit()}})},l=e=>{e.proxy(document,\"webkitfullscreenchange\",()=>{e.emit(\"fullscreen\",e.fullscreen),e.emit(\"resize\")}),(0,n.def)(e,\"fullscreen\",{get:()=>document.fullscreenElement===a,set(t){t?(e.state=\"fullscreen\",a.webkitEnterFullscreen()):a.webkitExitFullscreen()}})};e.once(\"video:loadedmetadata\",()=>{i.default.isEnabled?s(e):a.webkitSupportsFullscreen?l(e):(0,n.def)(e,\"fullscreen\",{get:()=>!1,set(){r.show=t.get(\"Fullscreen Not Supported\")}}),(0,n.def)(e,\"fullscreen\",(0,n.get)(e,\"fullscreen\"))})}},{\"../libs/screenfull\":\"8v40z\",\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"8v40z\":[function(e,t,r){e(\"@parcel/transformer-js/src/esmodule-helpers.js\").defineInteropFlag(r);let a=[[\"requestFullscreen\",\"exitFullscreen\",\"fullscreenElement\",\"fullscreenEnabled\",\"fullscreenchange\",\"fullscreenerror\"],[\"webkitRequestFullscreen\",\"webkitExitFullscreen\",\"webkitFullscreenElement\",\"webkitFullscreenEnabled\",\"webkitfullscreenchange\",\"webkitfullscreenerror\"],[\"webkitRequestFullScreen\",\"webkitCancelFullScreen\",\"webkitCurrentFullScreenElement\",\"webkitCancelFullScreen\",\"webkitfullscreenchange\",\"webkitfullscreenerror\"],[\"mozRequestFullScreen\",\"mozCancelFullScreen\",\"mozFullScreenElement\",\"mozFullScreenEnabled\",\"mozfullscreenchange\",\"mozfullscreenerror\"],[\"msRequestFullscreen\",\"msExitFullscreen\",\"msFullscreenElement\",\"msFullscreenEnabled\",\"MSFullscreenChange\",\"MSFullscreenError\"]],o=(()=>{if(\"undefined\"==typeof document)return!1;let e=a[0],t={};for(let r of a)if(r[1]in document){for(let[a,o]of r.entries())t[e[a]]=o;return t}return!1})(),i={change:o.fullscreenchange,error:o.fullscreenerror},n={request:(e=document.documentElement,t)=>new Promise((r,a)=>{let i=()=>{n.off(\"change\",i),r()};n.on(\"change\",i);let s=e[o.requestFullscreen](t);s instanceof Promise&&s.then(i).catch(a)}),exit:()=>new Promise((e,t)=>{if(!n.isFullscreen){e();return}let r=()=>{n.off(\"change\",r),e()};n.on(\"change\",r);let a=document[o.exitFullscreen]();a instanceof Promise&&a.then(r).catch(t)}),toggle:(e,t)=>n.isFullscreen?n.exit():n.request(e,t),onchange(e){n.on(\"change\",e)},onerror(e){n.on(\"error\",e)},on(e,t){let r=i[e];r&&document.addEventListener(r,t,!1)},off(e,t){let r=i[e];r&&document.removeEventListener(r,t,!1)},raw:o};Object.defineProperties(n,{isFullscreen:{get:()=>!!document[o.fullscreenElement]},element:{enumerable:!0,get:()=>document[o.fullscreenElement]},isEnabled:{enumerable:!0,get:()=>!!document[o.fullscreenEnabled]}}),o||(n={isEnabled:!1}),r.default=n},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"5aYAP\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){let{constructor:t,template:{$container:r,$player:a}}=e,i=\"\";(0,o.def)(e,\"fullscreenWeb\",{get:()=>(0,o.hasClass)(a,\"art-fullscreen-web\"),set(n){n?(i=a.style.cssText,t.FULLSCREEN_WEB_IN_BODY&&(0,o.append)(document.body,a),e.state=\"fullscreenWeb\",(0,o.setStyle)(a,\"width\",\"100%\"),(0,o.setStyle)(a,\"height\",\"100%\"),(0,o.addClass)(a,\"art-fullscreen-web\"),e.emit(\"fullscreenWeb\",!0)):(t.FULLSCREEN_WEB_IN_BODY&&(0,o.append)(r,a),i&&(a.style.cssText=i,i=\"\"),(0,o.removeClass)(a,\"art-fullscreen-web\"),e.emit(\"fullscreenWeb\",!1)),e.emit(\"resize\")}})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"7EnIB\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){let{i18n:t,notice:r,template:{$video:a}}=e;document.pictureInPictureEnabled?function(e){let{template:{$video:t},proxy:r,notice:a}=e;t.disablePictureInPicture=!1,(0,o.def)(e,\"pip\",{get:()=>document.pictureInPictureElement,set(r){r?(e.state=\"pip\",t.requestPictureInPicture().catch(e=>{throw a.show=e,e})):document.exitPictureInPicture().catch(e=>{throw a.show=e,e})}}),r(t,\"enterpictureinpicture\",()=>{e.emit(\"pip\",!0)}),r(t,\"leavepictureinpicture\",()=>{e.emit(\"pip\",!1)})}(e):a.webkitSupportsPresentationMode?function(e){let{$video:t}=e.template;t.webkitSetPresentationMode(\"inline\"),(0,o.def)(e,\"pip\",{get:()=>\"picture-in-picture\"===t.webkitPresentationMode,set(r){r?(e.state=\"pip\",t.webkitSetPresentationMode(\"picture-in-picture\"),e.emit(\"pip\",!0)):(t.webkitSetPresentationMode(\"inline\"),e.emit(\"pip\",!1))}})}(e):(0,o.def)(e,\"pip\",{get:()=>!1,set(){r.show=t.get(\"PIP Not Supported\")}})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"3N9mP\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){let{$video:t}=e.template;(0,o.def)(e,\"loaded\",{get:()=>e.loadedTime/t.duration}),(0,o.def)(e,\"loadedTime\",{get:()=>t.buffered.length?t.buffered.end(t.buffered.length-1):0})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],et96R:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){(0,o.def)(e,\"played\",{get:()=>e.currentTime/e.duration})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"9DzzM\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){let{$video:t}=e.template;(0,o.def)(e,\"playing\",{get:()=>\"boolean\"==typeof t.playing?t.playing:!!(t.currentTime>0&&!t.paused&&!t.ended&&t.readyState>2)})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],i1LDY:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){let{$container:t,$player:r,$video:a}=e.template;(0,o.def)(e,\"autoSize\",{value(){let{videoWidth:i,videoHeight:n}=a,{width:s,height:l}=(0,o.getRect)(t),c=i/n;s/l>c?((0,o.setStyle)(r,\"width\",`${l*c/s*100}%`),(0,o.setStyle)(r,\"height\",\"100%\")):((0,o.setStyle)(r,\"width\",\"100%\"),(0,o.setStyle)(r,\"height\",`${s/c/l*100}%`)),e.emit(\"autoSize\",{width:e.width,height:e.height})}})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],IqARI:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){(0,o.def)(e,\"rect\",{get:()=>(0,o.getRect)(e.template.$player)});let t=[\"bottom\",\"height\",\"left\",\"right\",\"top\",\"width\"];for(let r=0;r<t.length;r++){let a=t[r];(0,o.def)(e,a,{get:()=>e.rect[a]})}(0,o.def)(e,\"x\",{get:()=>e.left+window.pageXOffset}),(0,o.def)(e,\"y\",{get:()=>e.top+window.pageYOffset})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"7E7Vs\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){let{template:{$player:t},i18n:r,notice:a}=e;(0,o.def)(e,\"flip\",{get:()=>t.dataset.flip||\"normal\",set(i){i||(i=\"normal\"),\"normal\"===i?delete t.dataset.flip:t.dataset.flip=i,a.show=`${r.get(\"Video Flip\")}: ${r.get((0,o.capitalize)(i))}`,e.emit(\"flip\",i)}})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],gpugx:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){let{icons:t,proxy:r,storage:a,template:{$player:i,$video:n}}=e,s=!1,l=0,c=0;function p(){let{$mini:t}=e.template;t&&((0,o.removeClass)(i,\"art-mini\"),(0,o.setStyle)(t,\"display\",\"none\"),i.prepend(n),e.emit(\"mini\",!1))}function u(t,r){e.playing?((0,o.setStyle)(t,\"display\",\"none\"),(0,o.setStyle)(r,\"display\",\"flex\")):((0,o.setStyle)(t,\"display\",\"flex\"),(0,o.setStyle)(r,\"display\",\"none\"))}function d(){let{$mini:t}=e.template,r=(0,o.getRect)(t),i=window.innerHeight-r.height-50,n=window.innerWidth-r.width-50;a.set(\"top\",i),a.set(\"left\",n),(0,o.setStyle)(t,\"top\",`${i}px`),(0,o.setStyle)(t,\"left\",`${n}px`)}(0,o.def)(e,\"mini\",{get:()=>(0,o.hasClass)(i,\"art-mini\"),set(f){if(f){e.state=\"mini\",(0,o.addClass)(i,\"art-mini\");let f=function(){let{$mini:i}=e.template;if(i)return(0,o.append)(i,n),(0,o.setStyle)(i,\"display\",\"flex\");{let i=(0,o.createElement)(\"div\");(0,o.addClass)(i,\"art-mini-popup\"),(0,o.append)(document.body,i),e.template.$mini=i,(0,o.append)(i,n);let d=(0,o.append)(i,'<div class=\"art-mini-close\"></div>');(0,o.append)(d,t.close),r(d,\"click\",p);let f=(0,o.append)(i,'<div class=\"art-mini-state\"></div>'),h=(0,o.append)(f,t.play),m=(0,o.append)(f,t.pause);return r(h,\"click\",()=>e.play()),r(m,\"click\",()=>e.pause()),u(h,m),e.on(\"video:playing\",()=>u(h,m)),e.on(\"video:pause\",()=>u(h,m)),e.on(\"video:timeupdate\",()=>u(h,m)),r(i,\"mousedown\",e=>{s=0===e.button,l=e.pageX,c=e.pageY}),e.on(\"document:mousemove\",e=>{if(s){(0,o.addClass)(i,\"art-mini-droging\");let t=e.pageX-l,r=e.pageY-c;(0,o.setStyle)(i,\"transform\",`translate(${t}px, ${r}px)`)}}),e.on(\"document:mouseup\",()=>{if(s){s=!1,(0,o.removeClass)(i,\"art-mini-droging\");let e=(0,o.getRect)(i);a.set(\"left\",e.left),a.set(\"top\",e.top),(0,o.setStyle)(i,\"left\",`${e.left}px`),(0,o.setStyle)(i,\"top\",`${e.top}px`),(0,o.setStyle)(i,\"transform\",null)}}),i}}(),h=a.get(\"top\"),m=a.get(\"left\");h&&m?((0,o.setStyle)(f,\"top\",`${h}px`),(0,o.setStyle)(f,\"left\",`${m}px`),(0,o.isInViewport)(f)||d()):d(),e.emit(\"mini\",!0)}else p()}})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"1SuFS\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){let{template:{$poster:t}}=e;(0,o.def)(e,\"poster\",{get:()=>{try{return t.style.backgroundImage.match(/\"(.*)\"/)[1]}catch(e){return\"\"}},set(e){(0,o.setStyle)(t,\"backgroundImage\",`url(${e})`)}})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"8x4te\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){let{template:{$container:t,$video:r}}=e;(0,o.def)(e,\"autoHeight\",{value(){let{clientWidth:a}=t,{videoHeight:i,videoWidth:n}=r,s=a/n*i;(0,o.setStyle)(t,\"height\",s+\"px\"),e.emit(\"autoHeight\",s)}})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"1CaTA\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){let{$player:t}=e.template;(0,o.def)(e,\"cssVar\",{value:(e,r)=>r?t.style.setProperty(e,r):getComputedStyle(t).getPropertyValue(e)})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"2FqhO\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){(0,o.def)(e,\"theme\",{get:()=>e.cssVar(\"--art-theme\"),set(t){e.cssVar(\"--art-theme\",t)}})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"1fQQs\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){(0,o.def)(e,\"type\",{get:()=>e.option.type,set(t){e.option.type=t}})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],iBOQW:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){let t=[\"mini\",\"pip\",\"fullscreen\",\"fullscreenWeb\"];(0,o.def)(e,\"state\",{get:()=>t.find(t=>e[t])||\"standard\",set(r){for(let a=0;a<t.length;a++){let o=t[a];o!==r&&e[o]&&(e[o]=!1)}}})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"6vlBV\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){let{notice:t,i18n:r,template:a}=e;(0,o.def)(e,\"subtitleOffset\",{get:()=>a.$track?.offset||0,set(i){let{cues:n}=e.subtitle;if(!a.$track||0===n.length)return;let s=(0,o.clamp)(i,-10,10);a.$track.offset=s;for(let t=0;t<n.length;t++){let r=n[t];r.originalStartTime=r.originalStartTime??r.startTime,r.originalEndTime=r.originalEndTime??r.endTime,r.startTime=(0,o.clamp)(r.originalStartTime+s,0,e.duration),r.endTime=(0,o.clamp)(r.originalEndTime+s,0,e.duration)}e.subtitle.update(),t.show=`${r.get(\"Subtitle Offset\")}: ${i}s`,e.emit(\"subtitleOffset\",i)}})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],eftqT:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){let{i18n:t,notice:r,proxy:a,template:{$video:i}}=e,n=!0;window.WebKitPlaybackTargetAvailabilityEvent&&i.webkitShowPlaybackTargetPicker?a(i,\"webkitplaybacktargetavailabilitychanged\",e=>{switch(e.availability){case\"available\":n=!0;break;case\"not-available\":n=!1}}):n=!1,(0,o.def)(e,\"airplay\",{value(){n?(i.webkitShowPlaybackTargetPicker(),e.emit(\"airplay\")):r.show=t.get(\"AirPlay Not Available\")}})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"5SdyX\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){(0,o.def)(e,\"quality\",{set(t){let{controls:r,notice:a,i18n:o}=e,i=t.find(e=>e.default)||t[0];r.update({name:\"quality\",position:\"right\",index:10,style:{marginRight:\"10px\"},html:i?.html||\"\",selector:t,onSelect:async t=>(await e.switchQuality(t.url),a.show=`${o.get(\"Switch Video\")}: ${t.html}`,t.html)})}})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"4HcqV\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){let{events:t,option:r,template:{$progress:a,$video:i}}=e,n=null,s=null,l=!1,c=!1,p=!1;t.hover(a,()=>{p=!0},()=>{p=!1}),e.on(\"setBar\",async(t,u,d)=>{let f=e.controls?.thumbnails,{url:h,scale:m}=r.thumbnails;if(!f||!h)return;let g=\"played\"===t&&d&&o.isMobile;if(\"hover\"===t||g){if(l||(l=!0,s=await (0,o.loadImg)(h,m),c=!0),!c||!p)return;let t=a.clientWidth*u;(0,o.setStyle)(f,\"display\",\"flex\"),t>0&&t<a.clientWidth?function(t){let n=e.controls?.thumbnails;if(!n)return;let{number:l,column:c,width:p,height:u,scale:d}=r.thumbnails,f=p*d||s.naturalWidth/c,h=u*d||f/(i.videoWidth/i.videoHeight),m=Math.floor(t/(a.clientWidth/l)),g=Math.ceil(m/c)-1;(0,o.setStyle)(n,\"backgroundImage\",`url(${s.src})`),(0,o.setStyle)(n,\"height\",`${h}px`),(0,o.setStyle)(n,\"width\",`${f}px`),(0,o.setStyle)(n,\"backgroundPosition\",`-${(m%c||c-1)*f}px -${g*h}px`),t<=f/2?(0,o.setStyle)(n,\"left\",0):t>a.clientWidth-f/2?(0,o.setStyle)(n,\"left\",`${a.clientWidth-f}px`):(0,o.setStyle)(n,\"left\",`${t-f/2}px`)}(t):o.isMobile||(0,o.setStyle)(f,\"display\",\"none\"),g&&(clearTimeout(n),n=setTimeout(()=>{(0,o.setStyle)(f,\"display\",\"none\")},500))}}),(0,o.def)(e,\"thumbnails\",{get:()=>e.option.thumbnails,set(t){t.url&&!e.option.isLive&&(e.option.thumbnails=t,clearTimeout(n),n=null,s=null,l=!1,c=!1)}})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],fCWZK:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){let{option:t,storage:r,template:{$video:a,$poster:i}}=e;for(let r in t.moreVideoAttr)e.attr(r,t.moreVideoAttr[r]);t.muted&&(e.muted=t.muted),t.volume&&(a.volume=(0,o.clamp)(t.volume,0,1));let n=r.get(\"volume\");for(let r in\"number\"==typeof n&&(a.volume=(0,o.clamp)(n,0,1)),t.poster&&(0,o.setStyle)(i,\"backgroundImage\",`url(${t.poster})`),t.autoplay&&(a.autoplay=t.autoplay),t.playsInline&&(a.playsInline=!0,a[\"webkit-playsinline\"]=!0),t.theme&&(t.cssVar[\"--art-theme\"]=t.theme),t.cssVar)e.cssVar(r,t.cssVar[r]);e.url=t.url}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],f8Lv3:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>s);var o=e(\"../config\"),i=a.interopDefault(o),n=e(\"../utils\");function s(e){let{i18n:t,notice:r,option:a,constructor:o,proxy:s,template:{$player:l,$video:c,$poster:p}}=e,u=0;for(let t=0;t<i.default.events.length;t++)s(c,i.default.events[t],t=>{e.emit(`video:${t.type}`,t)});e.on(\"video:canplay\",()=>{u=0,e.loading.show=!1}),e.once(\"video:canplay\",()=>{e.loading.show=!1,e.controls.show=!0,e.mask.show=!0,e.isReady=!0,e.emit(\"ready\")}),e.on(\"video:ended\",()=>{a.loop?(e.seek=0,e.play(),e.controls.show=!1,e.mask.show=!1):(e.controls.show=!0,e.mask.show=!0)}),e.on(\"video:error\",async i=>{u<o.RECONNECT_TIME_MAX?(await (0,n.sleep)(o.RECONNECT_SLEEP_TIME),u+=1,e.url=a.url,r.show=`${t.get(\"Reconnect\")}: ${u}`,e.emit(\"error\",i,u)):(e.mask.show=!0,e.loading.show=!1,e.controls.show=!0,(0,n.addClass)(l,\"art-error\"),await (0,n.sleep)(o.RECONNECT_SLEEP_TIME),r.show=t.get(\"Video Load Failed\"))}),e.on(\"video:loadedmetadata\",()=>{e.emit(\"resize\"),n.isMobile&&(e.loading.show=!1,e.controls.show=!0,e.mask.show=!0)}),e.on(\"video:loadstart\",()=>{e.loading.show=!0,e.mask.show=!1,e.controls.show=!0}),e.on(\"video:pause\",()=>{e.controls.show=!0,e.mask.show=!0}),e.on(\"video:play\",()=>{e.mask.show=!1,(0,n.setStyle)(p,\"display\",\"none\")}),e.on(\"video:playing\",()=>{e.mask.show=!1}),e.on(\"video:progress\",()=>{e.playing&&(e.loading.show=!1)}),e.on(\"video:seeked\",()=>{e.loading.show=!1,e.mask.show=!0}),e.on(\"video:seeking\",()=>{e.loading.show=!0,e.mask.show=!1}),e.on(\"video:timeupdate\",()=>{e.mask.show=!1}),e.on(\"video:waiting\",()=>{e.loading.show=!0,e.mask.show=!1})}},{\"../config\":\"lyjeQ\",\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"8Z0Uf\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r);var o=e(\"../utils/component\"),i=a.interopDefault(o),n=e(\"./fullscreen\"),s=a.interopDefault(n),l=e(\"./fullscreenWeb\"),c=a.interopDefault(l),p=e(\"./pip\"),u=a.interopDefault(p),d=e(\"./playAndPause\"),f=a.interopDefault(d),h=e(\"./progress\"),m=a.interopDefault(h),g=e(\"./time\"),v=a.interopDefault(g),y=e(\"./volume\"),b=a.interopDefault(y),x=e(\"./setting\"),w=a.interopDefault(x),j=e(\"./screenshot\"),k=a.interopDefault(j),C=e(\"./airplay\"),S=a.interopDefault(C),I=e(\"../utils\");class T extends i.default{constructor(e){super(e),this.isHover=!1,this.name=\"control\",this.timer=Date.now();let{constructor:t}=e,{$player:r,$bottom:a}=this.art.template;e.on(\"mousemove\",()=>{I.isMobile||(this.show=!0)}),e.on(\"click\",()=>{I.isMobile?this.toggle():this.show=!0}),e.on(\"document:mousemove\",e=>{this.isHover=(0,I.includeFromEvent)(e,a)}),e.on(\"video:timeupdate\",()=>{!e.setting.show&&!this.isHover&&!e.isInput&&e.playing&&this.show&&Date.now()-this.timer>=t.CONTROL_HIDE_TIME&&(this.show=!1)}),e.on(\"control\",e=>{e?((0,I.removeClass)(r,\"art-hide-cursor\"),(0,I.addClass)(r,\"art-hover\"),this.timer=Date.now()):((0,I.addClass)(r,\"art-hide-cursor\"),(0,I.removeClass)(r,\"art-hover\"))}),this.init()}init(){let{option:e}=this.art;e.isLive||this.add((0,m.default)({name:\"progress\",position:\"top\",index:10})),this.add({name:\"thumbnails\",position:\"top\",index:20}),this.add((0,f.default)({name:\"playAndPause\",position:\"left\",index:10})),this.add((0,b.default)({name:\"volume\",position:\"left\",index:20})),e.isLive||this.add((0,v.default)({name:\"time\",position:\"left\",index:30})),e.quality.length&&(0,I.sleep)().then(()=>{this.art.quality=e.quality}),e.screenshot&&!I.isMobile&&this.add((0,k.default)({name:\"screenshot\",position:\"right\",index:20})),e.setting&&this.add((0,w.default)({name:\"setting\",position:\"right\",index:30})),e.pip&&this.add((0,u.default)({name:\"pip\",position:\"right\",index:40})),e.airplay&&window.WebKitPlaybackTargetAvailabilityEvent&&this.add((0,S.default)({name:\"airplay\",position:\"right\",index:50})),e.fullscreenWeb&&this.add((0,c.default)({name:\"fullscreenWeb\",position:\"right\",index:60})),e.fullscreen&&this.add((0,s.default)({name:\"fullscreen\",position:\"right\",index:70}));for(let t=0;t<e.controls.length;t++)this.add(e.controls[t])}add(e){let t=\"function\"==typeof e?e(this.art):e,{$progress:r,$controlsLeft:a,$controlsRight:o}=this.art.template;switch(t.position){case\"top\":this.$parent=r;break;case\"left\":this.$parent=a;break;case\"right\":this.$parent=o;break;default:(0,I.errorHandle)(!1,\"Control option.position must one of 'top', 'left', 'right'\")}super.add(t)}check(e){e.$control_value.innerHTML=e.html;for(let t=0;t<e.$control_option.length;t++){let r=e.$control_option[t];r.default=r===e,r.default&&(0,I.inverseClass)(r.$control_item,\"art-current\")}}selector(e,t,r){let{proxy:a}=this.art.events;(0,I.addClass)(t,\"art-control-selector\");let o=(0,I.createElement)(\"div\");(0,I.addClass)(o,\"art-selector-value\"),(0,I.append)(o,e.html),t.innerText=\"\",(0,I.append)(t,o);let i=(0,I.createElement)(\"div\");(0,I.addClass)(i,\"art-selector-list\"),(0,I.append)(t,i);for(let t=0;t<e.selector.length;t++){let r=e.selector[t],a=(0,I.createElement)(\"div\");(0,I.addClass)(a,\"art-selector-item\"),r.default&&(0,I.addClass)(a,\"art-current\"),a.dataset.index=t,a.dataset.value=r.value,a.innerHTML=r.html,(0,I.append)(i,a),(0,I.def)(r,\"$control_option\",{get:()=>e.selector}),(0,I.def)(r,\"$control_item\",{get:()=>a}),(0,I.def)(r,\"$control_value\",{get:()=>o})}let n=a(i,\"click\",async t=>{let r=t.composedPath()||[],a=e.selector.find(e=>e.$control_item===r.find(t=>e.$control_item===t));this.check(a),e.onSelect&&(o.innerHTML=await e.onSelect.call(this.art,a,a.$control_item,t))});r.push(n)}}r.default=T},{\"../utils/component\":\"18nVI\",\"./fullscreen\":\"c61Lj\",\"./fullscreenWeb\":\"03jeB\",\"./pip\":\"u8l8e\",\"./playAndPause\":\"ebXtb\",\"./progress\":\"bgoVP\",\"./time\":\"ikc2j\",\"./volume\":\"b8NFx\",\"./setting\":\"03o9l\",\"./screenshot\":\"4KCF5\",\"./airplay\":\"4IS2d\",\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"18nVI\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r);var o=e(\"./dom\"),i=e(\"./error\"),n=e(\"option-validator\"),s=a.interopDefault(n),l=e(\"../scheme\");r.default=class{constructor(e){this.id=0,this.art=e,this.cache=new Map,this.add=this.add.bind(this),this.remove=this.remove.bind(this),this.update=this.update.bind(this)}get show(){return(0,o.hasClass)(this.art.template.$player,`art-${this.name}-show`)}set show(e){let{$player:t}=this.art.template,r=`art-${this.name}-show`;e?(0,o.addClass)(t,r):(0,o.removeClass)(t,r),this.art.emit(this.name,e)}toggle(){this.show=!this.show}add(e){let t=\"function\"==typeof e?e(this.art):e;if(t.html=t.html||\"\",(0,s.default)(t,l.ComponentOption),!this.$parent||!this.name||t.disable)return;let r=t.name||`${this.name}${this.id}`,a=this.cache.get(r);(0,i.errorHandle)(!a,`Can't add an existing [${r}] to the [${this.name}]`),this.id+=1;let n=(0,o.createElement)(\"div\");(0,o.addClass)(n,`art-${this.name}`),(0,o.addClass)(n,`art-${this.name}-${r}`);let c=Array.from(this.$parent.children);n.dataset.index=t.index||this.id;let p=c.find(e=>Number(e.dataset.index)>=Number(n.dataset.index));p?p.insertAdjacentElement(\"beforebegin\",n):(0,o.append)(this.$parent,n),t.html&&(0,o.append)(n,t.html),t.style&&(0,o.setStyles)(n,t.style),t.tooltip&&(0,o.tooltip)(n,t.tooltip);let u=[];if(t.click){let e=this.art.events.proxy(n,\"click\",e=>{e.preventDefault(),t.click.call(this.art,this,e)});u.push(e)}return t.selector&&[\"left\",\"right\"].includes(t.position)&&this.selector(t,n,u),this[r]=n,this.cache.set(r,{$ref:n,events:u,option:t}),t.mounted&&t.mounted.call(this.art,n),n}remove(e){let t=this.cache.get(e);(0,i.errorHandle)(t,`Can't find [${e}] from the [${this.name}]`),t.option.beforeUnmount&&t.option.beforeUnmount.call(this.art,t.$ref);for(let e=0;e<t.events.length;e++)this.art.events.remove(t.events[e]);this.cache.delete(e),delete this[e],(0,o.remove)(t.$ref)}update(e){let t=this.cache.get(e.name);return t&&(e=Object.assign(t.option,e),this.remove(e.name)),this.add(e)}}},{\"./dom\":\"bSNiV\",\"./error\":\"hwmZz\",\"option-validator\":\"bAWi2\",\"../scheme\":\"AKEiO\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],c61Lj:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){return t=>({...e,tooltip:t.i18n.get(\"Fullscreen\"),mounted:e=>{let{proxy:r,icons:a,i18n:i}=t,n=(0,o.append)(e,a.fullscreenOn),s=(0,o.append)(e,a.fullscreenOff);(0,o.setStyle)(s,\"display\",\"none\"),r(e,\"click\",()=>{t.fullscreen=!t.fullscreen}),t.on(\"fullscreen\",t=>{t?((0,o.tooltip)(e,i.get(\"Exit Fullscreen\")),(0,o.setStyle)(n,\"display\",\"none\"),(0,o.setStyle)(s,\"display\",\"inline-flex\")):((0,o.tooltip)(e,i.get(\"Fullscreen\")),(0,o.setStyle)(n,\"display\",\"inline-flex\"),(0,o.setStyle)(s,\"display\",\"none\"))})}})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"03jeB\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){return t=>({...e,tooltip:t.i18n.get(\"Web Fullscreen\"),mounted:e=>{let{proxy:r,icons:a,i18n:i}=t,n=(0,o.append)(e,a.fullscreenWebOn),s=(0,o.append)(e,a.fullscreenWebOff);(0,o.setStyle)(s,\"display\",\"none\"),r(e,\"click\",()=>{t.fullscreenWeb=!t.fullscreenWeb}),t.on(\"fullscreenWeb\",t=>{t?((0,o.tooltip)(e,i.get(\"Exit Web Fullscreen\")),(0,o.setStyle)(n,\"display\",\"none\"),(0,o.setStyle)(s,\"display\",\"inline-flex\")):((0,o.tooltip)(e,i.get(\"Web Fullscreen\")),(0,o.setStyle)(n,\"display\",\"inline-flex\"),(0,o.setStyle)(s,\"display\",\"none\"))})}})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],u8l8e:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){return t=>({...e,tooltip:t.i18n.get(\"PIP Mode\"),mounted:e=>{let{proxy:r,icons:a,i18n:i}=t;(0,o.append)(e,a.pip),r(e,\"click\",()=>{t.pip=!t.pip}),t.on(\"pip\",t=>{(0,o.tooltip)(e,i.get(t?\"Exit PIP Mode\":\"PIP Mode\"))})}})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],ebXtb:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){return t=>({...e,mounted:e=>{let{proxy:r,icons:a,i18n:i}=t,n=(0,o.append)(e,a.play),s=(0,o.append)(e,a.pause);function l(){(0,o.setStyle)(n,\"display\",\"flex\"),(0,o.setStyle)(s,\"display\",\"none\")}function c(){(0,o.setStyle)(n,\"display\",\"none\"),(0,o.setStyle)(s,\"display\",\"flex\")}(0,o.tooltip)(n,i.get(\"Play\")),(0,o.tooltip)(s,i.get(\"Pause\")),r(n,\"click\",()=>{t.play()}),r(s,\"click\",()=>{t.pause()}),t.playing?c():l(),t.on(\"video:playing\",()=>{c()}),t.on(\"video:pause\",()=>{l()})}})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],bgoVP:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"getPosFromEvent\",()=>i),a.export(r,\"setCurrentTime\",()=>n),a.export(r,\"default\",()=>s);var o=e(\"../utils\");function i(e,t){let{$progress:r}=e.template,{left:a}=(0,o.getRect)(r),i=o.isMobile?t.touches[0].clientX:t.clientX,n=(0,o.clamp)(i-a,0,r.clientWidth),s=n/r.clientWidth*e.duration,l=(0,o.secondToTime)(s),c=(0,o.clamp)(n/r.clientWidth,0,1);return{second:s,time:l,width:n,percentage:c}}function n(e,t){if(e.isRotate){let r=t.touches[0].clientY/e.height,a=r*e.duration;e.emit(\"setBar\",\"played\",r,t),e.seek=a}else{let{second:r,percentage:a}=i(e,t);e.emit(\"setBar\",\"played\",a,t),e.seek=r}}function s(e){return t=>{let{icons:r,option:a,proxy:s}=t;return{...e,html:`<div class=\"art-control-progress-inner\"><div class=\"art-progress-hover\"></div><div class=\"art-progress-loaded\"></div><div class=\"art-progress-played\"></div><div class=\"art-progress-highlight\"></div><div class=\"art-progress-indicator\"></div><div class=\"art-progress-tip\"></div></div>`,mounted:e=>{let l=null,c=!1,p=(0,o.query)(\".art-progress-hover\",e),u=(0,o.query)(\".art-progress-loaded\",e),d=(0,o.query)(\".art-progress-played\",e),f=(0,o.query)(\".art-progress-highlight\",e),h=(0,o.query)(\".art-progress-indicator\",e),m=(0,o.query)(\".art-progress-tip\",e);function g(r,a){let{width:n,time:s}=a||i(t,r);m.innerText=s;let l=m.clientWidth;n<=l/2?(0,o.setStyle)(m,\"left\",0):n>e.clientWidth-l/2?(0,o.setStyle)(m,\"left\",`${e.clientWidth-l}px`):(0,o.setStyle)(m,\"left\",`${n-l/2}px`)}r.indicator?(0,o.append)(h,r.indicator):(0,o.setStyle)(h,\"backgroundColor\",\"var(--art-theme)\"),t.on(\"setBar\",function(r,a,i){let n=\"played\"===r&&i&&o.isMobile;\"loaded\"===r&&(0,o.setStyle)(u,\"width\",`${100*a}%`),\"hover\"===r&&(0,o.setStyle)(p,\"width\",`${100*a}%`),\"played\"===r&&((0,o.setStyle)(d,\"width\",`${100*a}%`),(0,o.setStyle)(h,\"left\",`${100*a}%`)),n&&((0,o.setStyle)(m,\"display\",\"flex\"),g(i,{width:e.clientWidth*a,time:(0,o.secondToTime)(a*t.duration)}),clearTimeout(l),l=setTimeout(()=>{(0,o.setStyle)(m,\"display\",\"none\")},500))}),t.on(\"video:loadedmetadata\",function(){f.innerText=\"\";for(let e=0;e<a.highlight.length;e++){let r=a.highlight[e],i=(0,o.clamp)(r.time,0,t.duration)/t.duration*100,n=`<span data-text=\"${r.text}\" data-time=\"${r.time}\" style=\"left: ${i}%\"></span>`;(0,o.append)(f,n)}}),t.on(\"video:progress\",()=>{t.emit(\"setBar\",\"loaded\",t.loaded)}),t.constructor.USE_RAF?t.on(\"raf\",()=>{t.emit(\"setBar\",\"played\",t.played)}):t.on(\"video:timeupdate\",()=>{t.emit(\"setBar\",\"played\",t.played)}),t.on(\"video:ended\",()=>{t.emit(\"setBar\",\"played\",1)}),t.emit(\"setBar\",\"loaded\",t.loaded||0),o.isMobile||(s(e,\"click\",e=>{e.target!==h&&n(t,e)}),s(e,\"mousemove\",r=>{let{percentage:a}=i(t,r);t.emit(\"setBar\",\"hover\",a,r),(0,o.setStyle)(m,\"display\",\"flex\"),(0,o.includeFromEvent)(r,f)?function(r){let{width:a}=i(t,r),{text:n}=r.target.dataset;m.innerText=n;let s=m.clientWidth;a<=s/2?(0,o.setStyle)(m,\"left\",0):a>e.clientWidth-s/2?(0,o.setStyle)(m,\"left\",`${e.clientWidth-s}px`):(0,o.setStyle)(m,\"left\",`${a-s/2}px`)}(r):g(r)}),s(e,\"mouseleave\",e=>{(0,o.setStyle)(m,\"display\",\"none\"),t.emit(\"setBar\",\"hover\",0,e)}),s(e,\"mousedown\",e=>{c=0===e.button}),t.on(\"document:mousemove\",e=>{if(c){let{second:r,percentage:a}=i(t,e);t.emit(\"setBar\",\"played\",a,e),t.seek=r}}),t.on(\"document:mouseup\",()=>{c&&(c=!1)}))}}}}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],ikc2j:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){return t=>({...e,style:o.isMobile?{fontSize:\"12px\",padding:\"0 5px\"}:{cursor:\"auto\",padding:\"0 10px\"},mounted:e=>{function r(){let r=`${(0,o.secondToTime)(t.currentTime)} / ${(0,o.secondToTime)(t.duration)}`;r!==e.innerText&&(e.innerText=r)}r();let a=[\"video:loadedmetadata\",\"video:timeupdate\",\"video:progress\"];for(let e=0;e<a.length;e++)t.on(a[e],r)}})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],b8NFx:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){return t=>({...e,mounted:e=>{let{proxy:r,icons:a}=t,i=(0,o.append)(e,a.volume),n=(0,o.append)(e,a.volumeClose),s=(0,o.append)(e,'<div class=\"art-volume-panel\"></div>'),l=(0,o.append)(s,'<div class=\"art-volume-inner\"></div>'),c=(0,o.append)(l,'<div class=\"art-volume-val\"></div>'),p=(0,o.append)(l,'<div class=\"art-volume-slider\"></div>'),u=(0,o.append)(p,'<div class=\"art-volume-handle\"></div>'),d=(0,o.append)(u,'<div class=\"art-volume-loaded\"></div>'),f=(0,o.append)(p,'<div class=\"art-volume-indicator\"></div>');function h(e){let{top:t,height:r}=(0,o.getRect)(p);return 1-(e.clientY-t)/r}function m(){if(t.muted||0===t.volume)(0,o.setStyle)(i,\"display\",\"none\"),(0,o.setStyle)(n,\"display\",\"flex\"),(0,o.setStyle)(f,\"top\",\"100%\"),(0,o.setStyle)(d,\"top\",\"100%\"),c.innerText=0;else{let e=100*t.volume;(0,o.setStyle)(i,\"display\",\"flex\"),(0,o.setStyle)(n,\"display\",\"none\"),(0,o.setStyle)(f,\"top\",`${100-e}%`),(0,o.setStyle)(d,\"top\",`${100-e}%`),c.innerText=Math.floor(e)}}if(m(),t.on(\"video:volumechange\",m),r(i,\"click\",()=>{t.muted=!0}),r(n,\"click\",()=>{t.muted=!1}),o.isMobile)(0,o.setStyle)(s,\"display\",\"none\");else{let e=!1;r(p,\"mousedown\",r=>{e=0===r.button,t.volume=h(r)}),t.on(\"document:mousemove\",r=>{e&&(t.muted=!1,t.volume=h(r))}),t.on(\"document:mouseup\",()=>{e&&(e=!1)})}}})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"03o9l\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){return t=>({...e,tooltip:t.i18n.get(\"Show Setting\"),mounted:e=>{let{proxy:r,icons:a,i18n:i}=t;(0,o.append)(e,a.setting),r(e,\"click\",()=>{t.setting.toggle(),t.setting.resize()}),t.on(\"setting\",t=>{(0,o.tooltip)(e,i.get(t?\"Hide Setting\":\"Show Setting\"))})}})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"4KCF5\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){return t=>({...e,tooltip:t.i18n.get(\"Screenshot\"),mounted:e=>{let{proxy:r,icons:a}=t;(0,o.append)(e,a.screenshot),r(e,\"click\",()=>{t.screenshot()})}})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"4IS2d\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){return t=>({...e,tooltip:t.i18n.get(\"AirPlay\"),mounted:e=>{let{proxy:r,icons:a}=t;(0,o.append)(e,a.airplay),r(e,\"click\",()=>t.airplay())}})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"2KYsr\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r);var o=e(\"../utils\"),i=e(\"../utils/component\"),n=a.interopDefault(i),s=e(\"./playbackRate\"),l=a.interopDefault(s),c=e(\"./aspectRatio\"),p=a.interopDefault(c),u=e(\"./flip\"),d=a.interopDefault(u),f=e(\"./info\"),h=a.interopDefault(f),m=e(\"./version\"),g=a.interopDefault(m),v=e(\"./close\"),y=a.interopDefault(v);class b extends n.default{constructor(e){super(e),this.name=\"contextmenu\",this.$parent=e.template.$contextmenu,o.isMobile||this.init()}init(){let{option:e,proxy:t,template:{$player:r,$contextmenu:a}}=this.art;e.playbackRate&&this.add((0,l.default)({name:\"playbackRate\",index:10})),e.aspectRatio&&this.add((0,p.default)({name:\"aspectRatio\",index:20})),e.flip&&this.add((0,d.default)({name:\"flip\",index:30})),this.add((0,h.default)({name:\"info\",index:40})),this.add((0,g.default)({name:\"version\",index:50})),this.add((0,y.default)({name:\"close\",index:60}));for(let t=0;t<e.contextmenu.length;t++)this.add(e.contextmenu[t]);t(r,\"contextmenu\",e=>{if(!this.art.constructor.CONTEXTMENU)return;e.preventDefault(),this.show=!0;let t=e.clientX,i=e.clientY,{height:n,width:s,left:l,top:c}=(0,o.getRect)(r),{height:p,width:u}=(0,o.getRect)(a),d=t-l,f=i-c;t+u>l+s&&(d=s-u),i+p>c+n&&(f=n-p),(0,o.setStyles)(a,{top:`${f}px`,left:`${d}px`})}),t(r,\"click\",e=>{(0,o.includeFromEvent)(e,a)||(this.show=!1)}),this.art.on(\"blur\",()=>{this.show=!1})}}r.default=b},{\"../utils\":\"71aH7\",\"../utils/component\":\"18nVI\",\"./playbackRate\":\"69eLi\",\"./aspectRatio\":\"lUefg\",\"./flip\":\"kysiM\",\"./info\":\"gqIgJ\",\"./version\":\"kRU7C\",\"./close\":\"jQ8Pm\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"69eLi\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){return t=>{let{i18n:r,constructor:{PLAYBACK_RATE:a}}=t,i=a.map(e=>`<span data-value=\"${e}\">${1===e?r.get(\"Normal\"):e.toFixed(1)}</span>`).join(\"\");return{...e,html:`${r.get(\"Play Speed\")}: ${i}`,click:(e,r)=>{let{value:a}=r.target.dataset;a&&(t.playbackRate=Number(a),e.show=!1)},mounted:e=>{let r=(0,o.query)('[data-value=\"1\"]',e);r&&(0,o.inverseClass)(r,\"art-current\"),t.on(\"video:ratechange\",()=>{let r=(0,o.queryAll)(\"span\",e).find(e=>Number(e.dataset.value)===t.playbackRate);r&&(0,o.inverseClass)(r,\"art-current\")})}}}}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],lUefg:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){return t=>{let{i18n:r,constructor:{ASPECT_RATIO:a}}=t,i=a.map(e=>`<span data-value=\"${e}\">${\"default\"===e?r.get(\"Default\"):e}</span>`).join(\"\");return{...e,html:`${r.get(\"Aspect Ratio\")}: ${i}`,click:(e,r)=>{let{value:a}=r.target.dataset;a&&(t.aspectRatio=a,e.show=!1)},mounted:e=>{let r=(0,o.query)('[data-value=\"default\"]',e);r&&(0,o.inverseClass)(r,\"art-current\"),t.on(\"aspectRatio\",t=>{let r=(0,o.queryAll)(\"span\",e).find(e=>e.dataset.value===t);r&&(0,o.inverseClass)(r,\"art-current\")})}}}}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],kysiM:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){return t=>{let{i18n:r,constructor:{FLIP:a}}=t,i=a.map(e=>`<span data-value=\"${e}\">${r.get((0,o.capitalize)(e))}</span>`).join(\"\");return{...e,html:`${r.get(\"Video Flip\")}: ${i}`,click:(e,r)=>{let{value:a}=r.target.dataset;a&&(t.flip=a.toLowerCase(),e.show=!1)},mounted:e=>{let r=(0,o.query)('[data-value=\"normal\"]',e);r&&(0,o.inverseClass)(r,\"art-current\"),t.on(\"flip\",t=>{let r=(0,o.queryAll)(\"span\",e).find(e=>e.dataset.value===t);r&&(0,o.inverseClass)(r,\"art-current\")})}}}}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],gqIgJ:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");function o(e){return t=>({...e,html:t.i18n.get(\"Video Info\"),click:e=>{t.info.show=!0,e.show=!1}})}a.defineInteropFlag(r),a.export(r,\"default\",()=>o)},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],kRU7C:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");function o(e){return{...e,html:'<a href=\"https://artplayer.org\" target=\"_blank\">ArtPlayer 5.2.2</a>'}}a.defineInteropFlag(r),a.export(r,\"default\",()=>o)},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],jQ8Pm:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");function o(e){return t=>({...e,html:t.i18n.get(\"Close\"),click:e=>{e.show=!1}})}a.defineInteropFlag(r),a.export(r,\"default\",()=>o)},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"02ajl\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r);var o=e(\"./utils\"),i=e(\"./utils/component\"),n=a.interopDefault(i);class s extends n.default{constructor(e){super(e),this.name=\"info\",o.isMobile||this.init()}init(){let{proxy:e,constructor:t,template:{$infoPanel:r,$infoClose:a,$video:i}}=this.art;e(a,\"click\",()=>{this.show=!1});let n=null,s=(0,o.queryAll)(\"[data-video]\",r)||[];this.art.on(\"destroy\",()=>clearTimeout(n)),function e(){for(let e=0;e<s.length;e++){let t=s[e],r=i[t.dataset.video],a=\"number\"==typeof r?r.toFixed(2):r;t.innerText!==a&&(t.innerText=a)}n=setTimeout(e,t.INFO_LOOP_TIME)}()}}r.default=s},{\"./utils\":\"71aH7\",\"./utils/component\":\"18nVI\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],eSWto:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r);var o=e(\"./utils\"),i=e(\"./utils/component\"),n=a.interopDefault(i),s=e(\"option-validator\"),l=a.interopDefault(s),c=e(\"./scheme\"),p=a.interopDefault(c);class u extends n.default{constructor(e){super(e),this.name=\"subtitle\",this.option=null,this.destroyEvent=()=>null,this.init(e.option.subtitle);let t=!1;e.on(\"video:timeupdate\",()=>{if(!this.url)return;let e=this.art.template.$video.webkitDisplayingFullscreen;\"boolean\"==typeof e&&e!==t&&(t=e,this.createTrack(e?\"subtitles\":\"metadata\",this.url))})}get url(){return this.art.template.$track.src}set url(e){this.switch(e)}get textTrack(){return this.art.template.$video?.textTracks?.[0]}get activeCues(){return this.textTrack?Array.from(this.textTrack.activeCues):[]}get cues(){return this.textTrack?Array.from(this.textTrack.cues):[]}style(e,t){let{$subtitle:r}=this.art.template;return\"object\"==typeof e?(0,o.setStyles)(r,e):(0,o.setStyle)(r,e,t)}update(){let{option:{subtitle:e},template:{$subtitle:t}}=this.art;t.innerHTML=\"\",this.activeCues.length&&(this.art.emit(\"subtitleBeforeUpdate\",this.activeCues),t.innerHTML=this.activeCues.map((t,r)=>t.text.split(/\\r?\\n/).filter(e=>e.trim()).map(t=>`<div class=\"art-subtitle-line\" data-group=\"${r}\">${e.escape?(0,o.escape)(t):t}</div>`).join(\"\")).join(\"\"),this.art.emit(\"subtitleAfterUpdate\",this.activeCues))}async switch(e,t={}){let{i18n:r,notice:a,option:o}=this.art,i={...o.subtitle,...t,url:e},n=await this.init(i);return t.name&&(a.show=`${r.get(\"Switch Subtitle\")}: ${t.name}`),n}createTrack(e,t){let{template:r,proxy:a,option:i}=this.art,{$video:n,$track:s}=r,l=(0,o.createElement)(\"track\");l.default=!0,l.kind=e,l.src=t,l.label=i.subtitle.name||\"Artplayer\",l.track.mode=\"hidden\",l.onload=()=>{this.art.emit(\"subtitleLoad\",this.cues,this.option)},this.art.events.remove(this.destroyEvent),s.onload=null,(0,o.remove)(s),(0,o.append)(n,l),r.$track=l,this.destroyEvent=a(this.textTrack,\"cuechange\",()=>this.update())}async init(e){let{notice:t,template:{$subtitle:r}}=this.art;return this.textTrack?((0,l.default)(e,p.default.subtitle),e.url)?(this.option=e,this.style(e.style),fetch(e.url).then(e=>e.arrayBuffer()).then(t=>{let r=new TextDecoder(e.encoding).decode(t);switch(e.type||(0,o.getExt)(e.url)){case\"srt\":{let t=(0,o.srtToVtt)(r),a=e.onVttLoad(t);return(0,o.vttToBlob)(a)}case\"ass\":{let t=(0,o.assToVtt)(r),a=e.onVttLoad(t);return(0,o.vttToBlob)(a)}case\"vtt\":{let t=e.onVttLoad(r);return(0,o.vttToBlob)(t)}default:return e.url}}).then(e=>(r.innerHTML=\"\",this.url===e||(URL.revokeObjectURL(this.url),this.createTrack(\"metadata\",e)),e)).catch(e=>{throw r.innerHTML=\"\",t.show=e,e})):void 0:null}}r.default=u},{\"./utils\":\"71aH7\",\"./utils/component\":\"18nVI\",\"option-validator\":\"bAWi2\",\"./scheme\":\"AKEiO\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],jo4S1:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r);var o=e(\"./clickInit\"),i=a.interopDefault(o),n=e(\"./hoverInit\"),s=a.interopDefault(n),l=e(\"./moveInit\"),c=a.interopDefault(l),p=e(\"./resizeInit\"),u=a.interopDefault(p),d=e(\"./gestureInit\"),f=a.interopDefault(d),h=e(\"./viewInit\"),m=a.interopDefault(h),g=e(\"./documentInit\"),v=a.interopDefault(g),y=e(\"./updateInit\"),b=a.interopDefault(y),x=e(\"./restoreInit\"),w=a.interopDefault(x);r.default=class{constructor(e){this.destroyEvents=[],this.proxy=this.proxy.bind(this),this.hover=this.hover.bind(this),(0,i.default)(e,this),(0,s.default)(e,this),(0,c.default)(e,this),(0,u.default)(e,this),(0,f.default)(e,this),(0,m.default)(e,this),(0,v.default)(e,this),(0,b.default)(e,this),(0,w.default)(e,this)}proxy(e,t,r,a={}){if(Array.isArray(t))return t.map(t=>this.proxy(e,t,r,a));e.addEventListener(t,r,a);let o=()=>e.removeEventListener(t,r,a);return this.destroyEvents.push(o),o}hover(e,t,r){t&&this.proxy(e,\"mouseenter\",t),r&&this.proxy(e,\"mouseleave\",r)}remove(e){let t=this.destroyEvents.indexOf(e);t>-1&&(e(),this.destroyEvents.splice(t,1))}destroy(){for(let e=0;e<this.destroyEvents.length;e++)this.destroyEvents[e]()}}},{\"./clickInit\":\"6UrCm\",\"./hoverInit\":\"4jWHi\",\"./moveInit\":\"eqaUm\",\"./resizeInit\":\"eDXPO\",\"./gestureInit\":\"95GtS\",\"./viewInit\":\"InUBx\",\"./documentInit\":\"hoLfM\",\"./updateInit\":\"cl8m3\",\"./restoreInit\":\"bK8As\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"6UrCm\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e,t){let{constructor:r,template:{$player:a,$video:i}}=e;t.proxy(document,[\"click\",\"contextmenu\"],t=>{(0,o.includeFromEvent)(t,a)?(e.isInput=\"INPUT\"===t.target.tagName,e.isFocus=!0,e.emit(\"focus\",t)):(e.isInput=!1,e.isFocus=!1,e.emit(\"blur\",t))});let n=[];t.proxy(i,\"click\",t=>{let a=Date.now();n.push(a);let{MOBILE_CLICK_PLAY:i,DBCLICK_TIME:s,MOBILE_DBCLICK_PLAY:l,DBCLICK_FULLSCREEN:c}=r,p=n.filter(e=>a-e<=s);switch(p.length){case 1:e.emit(\"click\",t),o.isMobile?!e.isLock&&i&&e.toggle():e.toggle(),n=p;break;case 2:e.emit(\"dblclick\",t),o.isMobile?!e.isLock&&l&&e.toggle():c&&(e.fullscreen=!e.fullscreen),n=[];break;default:n=[]}})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"4jWHi\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e,t){let{$player:r}=e.template;t.hover(r,t=>{(0,o.addClass)(r,\"art-hover\"),e.emit(\"hover\",!0,t)},t=>{(0,o.removeClass)(r,\"art-hover\"),e.emit(\"hover\",!1,t)})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],eqaUm:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");function o(e,t){let{$player:r}=e.template;t.proxy(r,\"mousemove\",t=>{e.emit(\"mousemove\",t)})}a.defineInteropFlag(r),a.export(r,\"default\",()=>o)},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],eDXPO:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e,t){let{option:r,constructor:a}=e;e.on(\"resize\",()=>{let{aspectRatio:t,notice:a}=e;\"standard\"===e.state&&r.autoSize&&e.autoSize(),e.aspectRatio=t,a.show=\"\"});let i=(0,o.debounce)(()=>e.emit(\"resize\"),a.RESIZE_TIME);t.proxy(window,[\"orientationchange\",\"resize\"],()=>i()),screen&&screen.orientation&&screen.orientation.onchange&&t.proxy(screen.orientation,\"change\",()=>i())}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"95GtS\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>n);var o=e(\"../utils\"),i=e(\"../control/progress\");function n(e,t){if(o.isMobile&&!e.option.isLive){let{$video:r,$progress:a}=e.template,n=null,s=!1,l=0,c=0,p=0,u=t=>{if(1===t.touches.length&&!e.isLock){n===a&&(0,i.setCurrentTime)(e,t),s=!0;let{pageX:r,pageY:o}=t.touches[0];l=r,c=o,p=e.currentTime}},d=t=>{if(1===t.touches.length&&s&&e.duration){let{pageX:a,pageY:i}=t.touches[0],s=function(e,t,r,a){var o=t-a,i=r-e,n=0;if(2>Math.abs(i)&&2>Math.abs(o))return n;var s=180*Math.atan2(o,i)/Math.PI;return s>=-45&&s<45?n=4:s>=45&&s<135?n=1:s>=-135&&s<-45?n=2:(s>=135&&s<=180||s>=-180&&s<-135)&&(n=3),n}(l,c,a,i),u=[3,4].includes(s),d=[1,2].includes(s);if(u&&!e.isRotate||d&&e.isRotate){let s=(0,o.clamp)((a-l)/e.width,-1,1),u=(0,o.clamp)((i-c)/e.height,-1,1),d=e.isRotate?u:s,f=n===r?e.constructor.TOUCH_MOVE_RATIO:1,h=(0,o.clamp)(p+e.duration*d*f,0,e.duration);e.seek=h,e.emit(\"setBar\",\"played\",(0,o.clamp)(h/e.duration,0,1),t),e.notice.show=`${(0,o.secondToTime)(h)} / ${(0,o.secondToTime)(e.duration)}`}}};t.proxy(a,\"touchstart\",e=>{n=a,u(e)}),t.proxy(r,\"touchstart\",e=>{n=r,u(e)}),t.proxy(r,\"touchmove\",d),t.proxy(a,\"touchmove\",d),t.proxy(document,\"touchend\",()=>{s&&(l=0,c=0,p=0,s=!1,n=null)})}}},{\"../utils\":\"71aH7\",\"../control/progress\":\"bgoVP\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],InUBx:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e,t){let{option:r,constructor:a,template:{$container:i}}=e,n=(0,o.throttle)(()=>{e.emit(\"view\",(0,o.isInViewport)(i,a.SCROLL_GAP))},a.SCROLL_TIME);t.proxy(window,\"scroll\",()=>n()),e.on(\"view\",t=>{r.autoMini&&(e.mini=!t)})}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],hoLfM:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");function o(e,t){t.proxy(document,\"mousemove\",t=>{e.emit(\"document:mousemove\",t)}),t.proxy(document,\"mouseup\",t=>{e.emit(\"document:mouseup\",t)})}a.defineInteropFlag(r),a.export(r,\"default\",()=>o)},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],cl8m3:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");function o(e){if(e.constructor.USE_RAF){let t=null;!function r(){e.playing&&e.emit(\"raf\"),e.isDestroy||(t=requestAnimationFrame(r))}(),e.on(\"destroy\",()=>{cancelAnimationFrame(t)})}}a.defineInteropFlag(r),a.export(r,\"default\",()=>o)},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],bK8As:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");function o(e,t){}a.defineInteropFlag(r),a.export(r,\"default\",()=>o)},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"6NoFy\":[function(e,t,r){e(\"@parcel/transformer-js/src/esmodule-helpers.js\").defineInteropFlag(r);var a=e(\"./utils\");r.default=class{constructor(e){this.art=e,this.keys={},e.option.hotkey&&!a.isMobile&&this.init()}init(){let{proxy:e,constructor:t}=this.art;this.add(\"Escape\",()=>{this.art.fullscreenWeb&&(this.art.fullscreenWeb=!1)}),this.add(\"Space\",()=>{this.art.toggle()}),this.add(\"ArrowLeft\",()=>{this.art.backward=t.SEEK_STEP}),this.add(\"ArrowUp\",()=>{this.art.volume+=t.VOLUME_STEP}),this.add(\"ArrowRight\",()=>{this.art.forward=t.SEEK_STEP}),this.add(\"ArrowDown\",()=>{this.art.volume-=t.VOLUME_STEP}),e(document,\"keydown\",e=>{if(this.art.isFocus){let t=document.activeElement.tagName.toUpperCase(),r=document.activeElement.getAttribute(\"contenteditable\");if(\"INPUT\"!==t&&\"TEXTAREA\"!==t&&\"\"!==r&&\"true\"!==r&&!e.altKey&&!e.ctrlKey&&!e.metaKey&&!e.shiftKey){let t=this.keys[e.code];if(t){e.preventDefault();for(let r=0;r<t.length;r++)t[r].call(this.art,e);this.art.emit(\"hotkey\",e)}}}this.art.emit(\"keydown\",e)})}add(e,t){return this.keys[e]?this.keys[e].push(t):this.keys[e]=[t],this}remove(e,t){if(this.keys[e]){let r=this.keys[e].indexOf(t);-1!==r&&this.keys[e].splice(r,1)}return this}}},{\"./utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"6G6hZ\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r);var o=e(\"./utils/component\"),i=a.interopDefault(o);class n extends i.default{constructor(e){super(e);let{option:t,template:{$layer:r}}=e;this.name=\"layer\",this.$parent=r;for(let e=0;e<t.layers.length;e++)this.add(t.layers[e])}}r.default=n},{\"./utils/component\":\"18nVI\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"3dsEe\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r);var o=e(\"./utils\"),i=e(\"./utils/component\"),n=a.interopDefault(i);class s extends n.default{constructor(e){super(e),this.name=\"loading\",(0,o.append)(e.template.$loading,e.icons.loading)}}r.default=s},{\"./utils\":\"71aH7\",\"./utils/component\":\"18nVI\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],dWGTw:[function(e,t,r){e(\"@parcel/transformer-js/src/esmodule-helpers.js\").defineInteropFlag(r);var a=e(\"./utils\");r.default=class{constructor(e){this.art=e,this.timer=null}set show(e){let{constructor:t,template:{$player:r,$noticeInner:o}}=this.art;e?(o.innerText=e instanceof Error?e.message.trim():e,(0,a.addClass)(r,\"art-notice-show\"),clearTimeout(this.timer),this.timer=setTimeout(()=>{o.innerText=\"\",(0,a.removeClass)(r,\"art-notice-show\")},t.NOTICE_TIME)):(0,a.removeClass)(r,\"art-notice-show\")}}},{\"./utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"5POkG\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r);var o=e(\"./utils\"),i=e(\"./utils/component\"),n=a.interopDefault(i);class s extends n.default{constructor(e){super(e),this.name=\"mask\";let{template:t,icons:r,events:a}=e,i=(0,o.append)(t.$state,r.state),n=(0,o.append)(t.$state,r.error);(0,o.setStyle)(n,\"display\",\"none\"),e.on(\"destroy\",()=>{(0,o.setStyle)(i,\"display\",\"none\"),(0,o.setStyle)(n,\"display\",null)}),a.proxy(t.$state,\"click\",()=>e.play())}}r.default=s},{\"./utils\":\"71aH7\",\"./utils/component\":\"18nVI\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"6OeNg\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r);var o=e(\"../utils\"),i=e(\"bundle-text:./loading.svg\"),n=a.interopDefault(i),s=e(\"bundle-text:./state.svg\"),l=a.interopDefault(s),c=e(\"bundle-text:./check.svg\"),p=a.interopDefault(c),u=e(\"bundle-text:./play.svg\"),d=a.interopDefault(u),f=e(\"bundle-text:./pause.svg\"),h=a.interopDefault(f),m=e(\"bundle-text:./volume.svg\"),g=a.interopDefault(m),v=e(\"bundle-text:./volume-close.svg\"),y=a.interopDefault(v),b=e(\"bundle-text:./screenshot.svg\"),x=a.interopDefault(b),w=e(\"bundle-text:./setting.svg\"),j=a.interopDefault(w),k=e(\"bundle-text:./arrow-left.svg\"),C=a.interopDefault(k),S=e(\"bundle-text:./arrow-right.svg\"),I=a.interopDefault(S),T=e(\"bundle-text:./playback-rate.svg\"),$=a.interopDefault(T),E=e(\"bundle-text:./aspect-ratio.svg\"),M=a.interopDefault(E),F=e(\"bundle-text:./config.svg\"),H=a.interopDefault(F),D=e(\"bundle-text:./pip.svg\"),z=a.interopDefault(D),A=e(\"bundle-text:./lock.svg\"),R=a.interopDefault(A),O=e(\"bundle-text:./unlock.svg\"),L=a.interopDefault(O),Y=e(\"bundle-text:./fullscreen-off.svg\"),P=a.interopDefault(Y),V=e(\"bundle-text:./fullscreen-on.svg\"),q=a.interopDefault(V),_=e(\"bundle-text:./fullscreen-web-off.svg\"),N=a.interopDefault(_),B=e(\"bundle-text:./fullscreen-web-on.svg\"),W=a.interopDefault(B),U=e(\"bundle-text:./switch-on.svg\"),K=a.interopDefault(U),Z=e(\"bundle-text:./switch-off.svg\"),X=a.interopDefault(Z),G=e(\"bundle-text:./flip.svg\"),Q=a.interopDefault(G),J=e(\"bundle-text:./error.svg\"),ee=a.interopDefault(J),et=e(\"bundle-text:./close.svg\"),er=a.interopDefault(et),ea=e(\"bundle-text:./airplay.svg\"),eo=a.interopDefault(ea);r.default=class{constructor(e){let t={loading:n.default,state:l.default,play:d.default,pause:h.default,check:p.default,volume:g.default,volumeClose:y.default,screenshot:x.default,setting:j.default,pip:z.default,arrowLeft:C.default,arrowRight:I.default,playbackRate:$.default,aspectRatio:M.default,config:H.default,lock:R.default,flip:Q.default,unlock:L.default,fullscreenOff:P.default,fullscreenOn:q.default,fullscreenWebOff:N.default,fullscreenWebOn:W.default,switchOn:K.default,switchOff:X.default,error:ee.default,close:er.default,airplay:eo.default,...e.option.icons};for(let e in t)(0,o.def)(this,e,{get:()=>(0,o.getIcon)(e,t[e])})}}},{\"../utils\":\"71aH7\",\"bundle-text:./loading.svg\":\"7tDub\",\"bundle-text:./state.svg\":\"1ElZc\",\"bundle-text:./check.svg\":\"lmgoP\",\"bundle-text:./play.svg\":\"lVWoQ\",\"bundle-text:./pause.svg\":\"5Mnax\",\"bundle-text:./volume.svg\":\"w3eIa\",\"bundle-text:./volume-close.svg\":\"rHjo1\",\"bundle-text:./screenshot.svg\":\"2KcqM\",\"bundle-text:./setting.svg\":\"8rQMV\",\"bundle-text:./arrow-left.svg\":\"kqGBE\",\"bundle-text:./arrow-right.svg\":\"aFjpC\",\"bundle-text:./playback-rate.svg\":\"lx7ZM\",\"bundle-text:./aspect-ratio.svg\":\"2sEjf\",\"bundle-text:./config.svg\":\"fQTgE\",\"bundle-text:./pip.svg\":\"2CaxO\",\"bundle-text:./lock.svg\":\"aCGnW\",\"bundle-text:./unlock.svg\":\"bTrAV\",\"bundle-text:./fullscreen-off.svg\":\"bA3p0\",\"bundle-text:./fullscreen-on.svg\":\"fTuY8\",\"bundle-text:./fullscreen-web-off.svg\":\"tvKf4\",\"bundle-text:./fullscreen-web-on.svg\":\"1F1oB\",\"bundle-text:./switch-on.svg\":\"7qNHs\",\"bundle-text:./switch-off.svg\":\"28aV8\",\"bundle-text:./flip.svg\":\"1uXI6\",\"bundle-text:./error.svg\":\"9f4dh\",\"bundle-text:./close.svg\":\"4nTtS\",\"bundle-text:./airplay.svg\":\"cDPXC\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"7tDub\":[function(e,t,r){t.exports='<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"50\" height=\"50\" viewBox=\"0 0 100 100\" preserveAspectRatio=\"xMidYMid\" class=\"uil-default\"><path fill=\"none\" class=\"bk\" d=\"M0 0h100v100H0z\"/><rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" fill=\"#fff\" transform=\"translate(0 -30)\"><animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-1s\" repeatCount=\"indefinite\"/></rect><rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" fill=\"#fff\" transform=\"rotate(30 105.98 65)\"><animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.9166666666666666s\" repeatCount=\"indefinite\"/></rect><rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" fill=\"#fff\" transform=\"rotate(60 75.98 65)\"><animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.8333333333333334s\" repeatCount=\"indefinite\"/></rect><rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" fill=\"#fff\" transform=\"rotate(90 65 65)\"><animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.75s\" repeatCount=\"indefinite\"/></rect><rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" fill=\"#fff\" transform=\"rotate(120 58.66 65)\"><animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.6666666666666666s\" repeatCount=\"indefinite\"/></rect><rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" fill=\"#fff\" transform=\"rotate(150 54.02 65)\"><animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.5833333333333334s\" repeatCount=\"indefinite\"/></rect><rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" fill=\"#fff\" transform=\"rotate(180 50 65)\"><animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.5s\" repeatCount=\"indefinite\"/></rect><rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" fill=\"#fff\" transform=\"rotate(-150 45.98 65)\"><animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.4166666666666667s\" repeatCount=\"indefinite\"/></rect><rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" fill=\"#fff\" transform=\"rotate(-120 41.34 65)\"><animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.3333333333333333s\" repeatCount=\"indefinite\"/></rect><rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" fill=\"#fff\" transform=\"rotate(-90 35 65)\"><animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.25s\" repeatCount=\"indefinite\"/></rect><rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" fill=\"#fff\" transform=\"rotate(-60 24.02 65)\"><animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.16666666666666666s\" repeatCount=\"indefinite\"/></rect><rect x=\"47\" y=\"40\" width=\"6\" height=\"20\" rx=\"5\" ry=\"5\" fill=\"#fff\" transform=\"rotate(-30 -5.98 65)\"><animate attributeName=\"opacity\" from=\"1\" to=\"0\" dur=\"1s\" begin=\"-0.08333333333333333s\" repeatCount=\"indefinite\"/></rect></svg>'},{}],\"1ElZc\":[function(e,t,r){t.exports='<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"80\" height=\"80\" viewBox=\"0 0 24 24\"><path fill=\"#fff\" d=\"M9.5 9.325v5.35q0 .575.525.875t1.025-.05l4.15-2.65q.475-.3.475-.85t-.475-.85L11.05 8.5q-.5-.35-1.025-.05t-.525.875ZM12 22q-2.075 0-3.9-.788t-3.175-2.137q-1.35-1.35-2.137-3.175T2 12q0-2.075.788-3.9t2.137-3.175q1.35-1.35 3.175-2.137T12 2q2.075 0 3.9.788t3.175 2.137q1.35 1.35 2.138 3.175T22 12q0 2.075-.788 3.9t-2.137 3.175q-1.35 1.35-3.175 2.138T12 22Z\"/></svg>'},{}],lmgoP:[function(e,t,r){t.exports='<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" style=\"width:100%;height:100%\"><path d=\"M9 16.2 4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4L9 16.2z\" fill=\"#fff\"/></svg>'},{}],lVWoQ:[function(e,t,r){t.exports='<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"22\" width=\"22\" viewBox=\"0 0 22 22\"><path d=\"M17.982 9.275 8.06 3.27A2.013 2.013 0 0 0 5 4.994v12.011a2.017 2.017 0 0 0 3.06 1.725l9.922-6.005a2.017 2.017 0 0 0 0-3.45z\"/></svg>'},{}],\"5Mnax\":[function(e,t,r){t.exports='<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"22\" width=\"22\" viewBox=\"0 0 22 22\"><path d=\"M7 3a2 2 0 0 0-2 2v12a2 2 0 1 0 4 0V5a2 2 0 0 0-2-2zm8 0a2 2 0 0 0-2 2v12a2 2 0 1 0 4 0V5a2 2 0 0 0-2-2z\"/></svg>'},{}],w3eIa:[function(e,t,r){t.exports='<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"22\" width=\"22\" viewBox=\"0 0 22 22\"><path d=\"M10.188 4.65 6 8H5a2 2 0 0 0-2 2v2a2 2 0 0 0 2 2h1l4.188 3.35a.5.5 0 0 0 .812-.39V5.04a.498.498 0 0 0-.812-.39zm4.258-.872a1 1 0 0 0-.862 1.804 6.002 6.002 0 0 1-.007 10.838 1 1 0 0 0 .86 1.806A8.001 8.001 0 0 0 19 11a8.001 8.001 0 0 0-4.554-7.222z\"/><path d=\"M15 11a3.998 3.998 0 0 0-2-3.465v6.93A3.998 3.998 0 0 0 15 11z\"/></svg>'},{}],rHjo1:[function(e,t,r){t.exports='<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"22\" width=\"22\" viewBox=\"0 0 22 22\"><path d=\"M15 11a3.998 3.998 0 0 0-2-3.465v2.636l1.865 1.865A4.02 4.02 0 0 0 15 11z\"/><path d=\"M13.583 5.583A5.998 5.998 0 0 1 17 11a6 6 0 0 1-.585 2.587l1.477 1.477a8.001 8.001 0 0 0-3.446-11.286 1 1 0 0 0-.863 1.805zm5.195 13.195-2.121-2.121-1.414-1.414-1.415-1.415L13 13l-2-2-3.889-3.889-3.889-3.889a.999.999 0 1 0-1.414 1.414L5.172 8H5a2 2 0 0 0-2 2v2a2 2 0 0 0 2 2h1l4.188 3.35a.5.5 0 0 0 .812-.39v-3.131l2.587 2.587-.01.005a1 1 0 0 0 .86 1.806c.215-.102.424-.214.627-.333l2.3 2.3a1.001 1.001 0 0 0 1.414-1.416zM11 5.04a.5.5 0 0 0-.813-.39L8.682 5.854 11 8.172V5.04z\"/></svg>'},{}],\"2KcqM\":[function(e,t,r){t.exports='<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"22\" width=\"22\" viewBox=\"0 0 50 50\"><path d=\"M19.402 6a5 5 0 0 0-4.902 4.012L14.098 12H9a5 5 0 0 0-5 5v21a5 5 0 0 0 5 5h32a5 5 0 0 0 5-5V17a5 5 0 0 0-5-5h-5.098l-.402-1.988A5 5 0 0 0 30.598 6ZM25 17c5.52 0 10 4.48 10 10s-4.48 10-10 10-10-4.48-10-10 4.48-10 10-10Zm0 2c-4.41 0-8 3.59-8 8s3.59 8 8 8 8-3.59 8-8-3.59-8-8-8Z\"/></svg>'},{}],\"8rQMV\":[function(e,t,r){t.exports='<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"22\" width=\"22\" viewBox=\"0 0 22 22\"><circle cx=\"11\" cy=\"11\" r=\"2\"/><path d=\"M19.164 8.861 17.6 8.6a6.978 6.978 0 0 0-1.186-2.099l.574-1.533a1 1 0 0 0-.436-1.217l-1.997-1.153a1.001 1.001 0 0 0-1.272.23l-1.008 1.225a7.04 7.04 0 0 0-2.55.001L8.716 2.829a1 1 0 0 0-1.272-.23L5.447 3.751a1 1 0 0 0-.436 1.217l.574 1.533A6.997 6.997 0 0 0 4.4 8.6l-1.564.261A.999.999 0 0 0 2 9.847v2.306c0 .489.353.906.836.986l1.613.269a7 7 0 0 0 1.228 2.075l-.558 1.487a1 1 0 0 0 .436 1.217l1.997 1.153c.423.244.961.147 1.272-.23l1.04-1.263a7.089 7.089 0 0 0 2.272 0l1.04 1.263a1 1 0 0 0 1.272.23l1.997-1.153a1 1 0 0 0 .436-1.217l-.557-1.487c.521-.61.94-1.31 1.228-2.075l1.613-.269a.999.999 0 0 0 .835-.986V9.847a.999.999 0 0 0-.836-.986zM11 15a4 4 0 1 1 0-8 4 4 0 0 1 0 8z\"/></svg>'},{}],kqGBE:[function(e,t,r){t.exports='<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\"><path d=\"m19.41 20.09-4.58-4.59 4.58-4.59L18 9.5l-6 6 6 6z\" fill=\"#fff\"/></svg>'},{}],aFjpC:[function(e,t,r){t.exports='<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"32\" width=\"32\" viewBox=\"0 0 32 32\"><path d=\"m12.59 20.34 4.58-4.59-4.58-4.59L14 9.75l6 6-6 6z\" fill=\"#fff\"/></svg>'},{}],lx7ZM:[function(e,t,r){t.exports='<svg height=\"24\" viewBox=\"0 0 24 24\" width=\"24\"><path d=\"M10 8v8l6-4-6-4zM6.3 5l-.6-.8C7.2 3 9 2.2 11 2l.1 1c-1.8.2-3.4.9-4.8 2zM5 6.3l-.8-.6C3 7.2 2.2 9 2 11l1 .1c.2-1.8.9-3.4 2-4.8zm0 11.4c-1.1-1.4-1.8-3.1-2-4.8L2 13c.2 2 1 3.8 2.2 5.4l.8-.7zm6.1 3.3c-1.8-.2-3.4-.9-4.8-2l-.6.8C7.2 21 9 21.8 11 22l.1-1zM22 12c0-5.2-3.9-9.4-9-10l-.1 1c4.6.5 8.1 4.3 8.1 9s-3.5 8.5-8.1 9l.1 1c5.2-.5 9-4.8 9-10z\" fill=\"#fff\" style=\"--darkreader-inline-fill:#a8a6a4\"/></svg>'},{}],\"2sEjf\":[function(e,t,r){t.exports='<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 88 88\" style=\"width:100%;height:100%;transform:translate(0,0)\"><defs><clipPath id=\"a\"><path d=\"M0 0h88v88H0z\"/></clipPath></defs><g style=\"display:block\" clip-path=\"url(\\'#a\\')\"><path fill=\"#FFF\" d=\"m12.438-12.702-2.82 2.82c-.79.79-.79 2.05 0 2.83l7.07 7.07-7.07 7.07c-.79.79-.79 2.05 0 2.83l2.82 2.83c.79.78 2.05.78 2.83 0l11.32-11.31c.78-.78.78-2.05 0-2.83l-11.32-11.31c-.78-.79-2.04-.79-2.83 0zm-24.88 0c-.74-.74-1.92-.78-2.7-.12l-.13.12-11.31 11.31a2 2 0 0 0-.12 2.7l.12.13 11.31 11.31a2 2 0 0 0 2.7.12l.13-.12 2.83-2.83c.74-.74.78-1.91.11-2.7l-.11-.13-7.07-7.07 7.07-7.07c.74-.74.78-1.91.11-2.7l-.11-.13-2.83-2.82zM28-28c4.42 0 8 3.58 8 8v40c0 4.42-3.58 8-8 8h-56c-4.42 0-8-3.58-8-8v-40c0-4.42 3.58-8 8-8h56z\" style=\"--darkreader-inline-fill:#a8a6a4\" transform=\"translate(44 44)\"/></g></svg>'},{}],fQTgE:[function(e,t,r){t.exports='<svg height=\"24\" viewBox=\"0 0 24 24\" width=\"24\"><path d=\"M15 17h6v1h-6v-1zm-4 0H3v1h8v2h1v-5h-1v2zm3-9h1V3h-1v2H3v1h11v2zm4-3v1h3V5h-3zM6 14h1V9H6v2H3v1h3v2zm4-2h11v-1H10v1z\" fill=\"#fff\" style=\"--darkreader-inline-fill:#a8a6a4\"/></svg>'},{}],\"2CaxO\":[function(e,t,r){t.exports='<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 36 36\" height=\"32\" width=\"32\"><path d=\"M25 17h-8v6h8v-6Zm4 8V10.98C29 9.88 28.1 9 27 9H9c-1.1 0-2 .88-2 1.98V25c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2Zm-2 .02H9V10.97h18v14.05Z\"/></svg>'},{}],aCGnW:[function(e,t,r){t.exports='<svg class=\"icon\" viewBox=\"0 0 1024 1024\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"><path d=\"M298.667 426.667v-85.334a213.333 213.333 0 1 1 426.666 0v85.334H768A85.333 85.333 0 0 1 853.333 512v256A85.333 85.333 0 0 1 768 853.333H256A85.333 85.333 0 0 1 170.667 768V512A85.333 85.333 0 0 1 256 426.667h42.667zM512 213.333a128 128 0 0 0-128 128v85.334h256v-85.334a128 128 0 0 0-128-128z\" fill=\"#fff\"/></svg>'},{}],bTrAV:[function(e,t,r){t.exports='<svg class=\"icon\" viewBox=\"0 0 1024 1024\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"><path d=\"m666.752 194.517-49.365 74.112A128 128 0 0 0 384 341.333l.043 85.334h384A85.333 85.333 0 0 1 853.376 512v256a85.333 85.333 0 0 1-85.333 85.333H256A85.333 85.333 0 0 1 170.667 768V512A85.333 85.333 0 0 1 256 426.667h42.667v-85.334a213.333 213.333 0 0 1 368.085-146.816z\" fill=\"#fff\"/></svg>'},{}],bA3p0:[function(e,t,r){t.exports='<svg class=\"icon\" width=\"22\" height=\"22\" viewBox=\"0 0 1024 1024\" xmlns=\"http://www.w3.org/2000/svg\"><path fill=\"#fff\" d=\"M768 298.667h170.667V384h-256V128H768v170.667zM341.333 384h-256v-85.333H256V128h85.333v256zM768 725.333V896h-85.333V640h256v85.333H768zM341.333 640v256H256V725.333H85.333V640h256z\"/></svg>'},{}],fTuY8:[function(e,t,r){t.exports='<svg class=\"icon\" width=\"22\" height=\"22\" viewBox=\"0 0 1024 1024\" xmlns=\"http://www.w3.org/2000/svg\"><path fill=\"#fff\" d=\"M625.778 256H768v142.222h113.778v-256h-256V256zM256 398.222V256h142.222V142.222h-256v256H256zm512 227.556V768H625.778v113.778h256v-256H768zM398.222 768H256V625.778H142.222v256h256V768z\"/></svg>'},{}],tvKf4:[function(e,t,r){t.exports='<svg class=\"icon\" width=\"18\" height=\"18\" viewBox=\"0 0 1152 1024\" xmlns=\"http://www.w3.org/2000/svg\"><path fill=\"#fff\" d=\"M1075.2 0H76.8A76.8 76.8 0 0 0 0 76.8v870.4a76.8 76.8 0 0 0 76.8 76.8h998.4a76.8 76.8 0 0 0 76.8-76.8V76.8A76.8 76.8 0 0 0 1075.2 0zM1024 128v768H128V128h896zM896 512a64 64 0 0 1 7.488 127.552L896 640H768v128a64 64 0 0 1-56.512 63.552L704 832a64 64 0 0 1-63.552-56.512L640 768V582.592c0-34.496 25.024-66.112 61.632-70.208l8-.384H896zm-640 0a64 64 0 0 1-7.488-127.552L256 384h128V256a64 64 0 0 1 56.512-63.552L448 192a64 64 0 0 1 63.552 56.512L512 256v185.408c0 34.432-25.024 66.112-61.632 70.144l-8 .448H256z\"/></svg>'},{}],\"1F1oB\":[function(e,t,r){t.exports='<svg class=\"icon\" width=\"18\" height=\"18\" viewBox=\"0 0 1152 1024\" xmlns=\"http://www.w3.org/2000/svg\"><path fill=\"#fff\" d=\"M1075.2 0H76.8A76.8 76.8 0 0 0 0 76.8v870.4a76.8 76.8 0 0 0 76.8 76.8h998.4a76.8 76.8 0 0 0 76.8-76.8V76.8A76.8 76.8 0 0 0 1075.2 0zM1024 128v768H128V128h896zm-576 64a64 64 0 0 1 7.488 127.552L448 320H320v128a64 64 0 0 1-56.512 63.552L256 512a64 64 0 0 1-63.552-56.512L192 448V262.592c0-34.432 25.024-66.112 61.632-70.144l8-.448H448zm256 640a64 64 0 0 1-7.488-127.552L704 704h128V576a64 64 0 0 1 56.512-63.552L896 512a64 64 0 0 1 63.552 56.512L960 576v185.408c0 34.496-25.024 66.112-61.632 70.208l-8 .384H704z\"/></svg>'},{}],\"7qNHs\":[function(e,t,r){t.exports='<svg class=\"icon\" width=\"26\" height=\"26\" viewBox=\"0 0 1664 1024\" xmlns=\"http://www.w3.org/2000/svg\"><path fill=\"#648FFC\" d=\"M1152 0H512a512 512 0 0 0 0 1024h640a512 512 0 0 0 0-1024zm0 960a448 448 0 1 1 448-448 448 448 0 0 1-448 448z\"/></svg>'},{}],\"28aV8\":[function(e,t,r){t.exports='<svg class=\"icon\" width=\"26\" height=\"26\" viewBox=\"0 0 1740 1024\" xmlns=\"http://www.w3.org/2000/svg\"><path fill=\"#fff\" d=\"M511.898 1024h670.515c282.419-.41 511.18-229.478 511.18-511.898 0-282.419-228.761-511.488-511.18-511.897H511.898C229.478.615.717 229.683.717 512.102c0 282.42 228.761 511.488 511.18 511.898zm-.564-975.36A464.589 464.589 0 1 1 48.026 513.024 463.872 463.872 0 0 1 511.334 48.435v.205z\"/></svg>'},{}],\"1uXI6\":[function(e,t,r){t.exports='<svg class=\"icon\" viewBox=\"0 0 1024 1024\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\"><path d=\"M554.667 810.667V896h-85.334v-85.333h85.334zm-384-632.662a42.667 42.667 0 0 1 34.986 18.219l203.904 291.328a42.667 42.667 0 0 1 0 48.896L205.611 827.776A42.667 42.667 0 0 1 128 803.328V220.672a42.667 42.667 0 0 1 42.667-42.667zm682.666 0a42.667 42.667 0 0 1 42.368 37.718l.299 4.949v582.656a42.667 42.667 0 0 1-74.24 28.63l-3.413-4.182-203.904-291.328a42.667 42.667 0 0 1-3.03-43.861l3.03-5.035 203.946-291.328a42.667 42.667 0 0 1 34.944-18.219zM554.667 640v85.333h-85.334V640h85.334zm-358.4-320.896V716.8L335.957 512 196.31 319.104zm358.4 150.23v85.333h-85.334v-85.334h85.334zm0-170.667V384h-85.334v-85.333h85.334zm0-170.667v85.333h-85.334V128h85.334z\" fill=\"#fff\"/></svg>'},{}],\"9f4dh\":[function(e,t,r){t.exports='<svg viewBox=\"0 0 1024 1024\" xmlns=\"http://www.w3.org/2000/svg\" width=\"50\" height=\"50\"><path d=\"M593.818 168.55 949.82 763.76c26.153 43.746 10.732 99.738-34.447 125.052-14.397 8.069-30.72 12.308-47.37 12.308H155.976c-52.224 0-94.536-40.96-94.536-91.505 0-16.097 4.383-31.928 12.718-45.875l356.004-595.19c26.173-43.724 84.009-58.654 129.208-33.341a93.082 93.082 0 0 1 34.448 33.341zM512 819.2a61.44 61.44 0 1 0 0-122.88 61.44 61.44 0 0 0 0 122.88zm0-512a72.315 72.315 0 0 0-71.762 81.306l25.723 205.721a46.408 46.408 0 0 0 92.078 0l25.723-205.742A72.315 72.315 0 0 0 512 307.2z\"/></svg>'},{}],\"4nTtS\":[function(e,t,r){t.exports='<svg class=\"icon\" viewBox=\"0 0 1024 1024\" xmlns=\"http://www.w3.org/2000/svg\" width=\"22\" height=\"22\"><path d=\"m571.733 512 268.8-268.8c17.067-17.067 17.067-42.667 0-59.733-17.066-17.067-42.666-17.067-59.733 0L512 452.267l-268.8-268.8c-17.067-17.067-42.667-17.067-59.733 0-17.067 17.066-17.067 42.666 0 59.733l268.8 268.8-268.8 268.8c-17.067 17.067-17.067 42.667 0 59.733 8.533 8.534 19.2 12.8 29.866 12.8s21.334-4.266 29.867-12.8l268.8-268.8 268.8 268.8c8.533 8.534 19.2 12.8 29.867 12.8s21.333-4.266 29.866-12.8c17.067-17.066 17.067-42.666 0-59.733L571.733 512z\"/></svg>'},{}],cDPXC:[function(e,t,r){t.exports='<svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" xmlns=\"http://www.w3.org/2000/svg\"><g fill=\"#fff\"><path d=\"M16 1H2a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h3v-2H3V3h12v8h-2v2h3a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1Z\"/><path d=\"M4 17h10l-5-6z\"/></g></svg>'},{}],\"3eYNH\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r);var o=e(\"./flip\"),i=a.interopDefault(o),n=e(\"./aspectRatio\"),s=a.interopDefault(n),l=e(\"./playbackRate\"),c=a.interopDefault(l),p=e(\"./subtitleOffset\"),u=a.interopDefault(p),d=e(\"../utils/component\"),f=a.interopDefault(d),h=e(\"../utils\");class m extends f.default{constructor(e){super(e);let{option:t,controls:r,template:{$setting:a}}=e;this.name=\"setting\",this.$parent=a,this.id=0,this.active=null,this.cache=new Map,this.option=[...this.builtin,...t.settings],t.setting&&(this.format(),this.render(),e.on(\"blur\",()=>{this.show&&(this.show=!1,this.render())}),e.on(\"focus\",e=>{let t=(0,h.includeFromEvent)(e,r.setting),a=(0,h.includeFromEvent)(e,this.$parent);!this.show||t||a||(this.show=!1,this.render())}),e.on(\"resize\",()=>this.resize()))}get builtin(){let e=[],{option:t}=this.art;return t.playbackRate&&e.push((0,c.default)(this.art)),t.aspectRatio&&e.push((0,s.default)(this.art)),t.flip&&e.push((0,i.default)(this.art)),t.subtitleOffset&&e.push((0,u.default)(this.art)),e}traverse(e,t=this.option){for(let r=0;r<t.length;r++){let a=t[r];e(a),a.selector?.length&&this.traverse.call(this,e,a.selector)}}check(e){e.$parent.tooltip=e.html,this.traverse(t=>{t.default=t===e,t.default&&t.$item&&(0,h.inverseClass)(t.$item,\"art-current\")},e.$option),this.render(e.$parents)}format(e=this.option,t,r,a=[]){for(let o=0;o<e.length;o++){let i=e[o];if(i?.name?((0,h.errorHandle)(!a.includes(i.name),`The [${i.name}] is already exist in [setting]`),a.push(i.name)):i.name=`setting-${this.id++}`,!i.$formatted){(0,h.def)(i,\"$parent\",{get:()=>t}),(0,h.def)(i,\"$parents\",{get:()=>r}),(0,h.def)(i,\"$option\",{get:()=>e});let a=[];(0,h.def)(i,\"$events\",{get:()=>a}),(0,h.def)(i,\"$formatted\",{get:()=>!0})}this.format(i.selector||[],i,e,a)}this.option=e}find(e=\"\"){let t=null;return this.traverse(r=>{r.name===e&&(t=r)}),t}resize(){let{controls:e,constructor:{SETTING_WIDTH:t,SETTING_ITEM_HEIGHT:r},template:{$player:a,$setting:o}}=this.art;if(e.setting&&this.show){let i=this.active[0]?.$parent?.width||t,{left:n,width:s}=(0,h.getRect)(e.setting),{left:l,width:c}=(0,h.getRect)(a),p=n-l+s/2-i/2,u=this.active===this.option?this.active.length*r:(this.active.length+1)*r;if((0,h.setStyle)(o,\"height\",`${u}px`),(0,h.setStyle)(o,\"width\",`${i}px`),this.art.isRotate||h.isMobile)return;p+i>c?((0,h.setStyle)(o,\"left\",null),(0,h.setStyle)(o,\"right\",null)):((0,h.setStyle)(o,\"left\",`${p}px`),(0,h.setStyle)(o,\"right\",\"auto\"))}}inactivate(e){for(let t=0;t<e.$events.length;t++)this.art.events.remove(e.$events[t]);e.$events.length=0}remove(e){let t=this.find(e);(0,h.errorHandle)(t,`Can't find [${e}] in the [setting]`);let r=t.$option.indexOf(t);t.$option.splice(r,1),this.inactivate(t),t.$item&&(0,h.remove)(t.$item),this.render()}update(e){let t=this.find(e.name);return t?(this.inactivate(t),Object.assign(t,e),this.format(),this.creatItem(t,!0),this.render(),t):this.add(e)}add(e,t=this.option){return t.push(e),this.format(),this.creatItem(e),this.render(),e}creatHeader(e){if(!this.cache.has(e.$option))return;let t=this.cache.get(e.$option),{proxy:r,icons:{arrowLeft:a},constructor:{SETTING_ITEM_HEIGHT:o}}=this.art,i=(0,h.createElement)(\"div\");(0,h.setStyle)(i,\"height\",`${o}px`),(0,h.addClass)(i,\"art-setting-item\"),(0,h.addClass)(i,\"art-setting-item-back\");let n=(0,h.append)(i,'<div class=\"art-setting-item-left\"></div>'),s=(0,h.createElement)(\"div\");(0,h.addClass)(s,\"art-setting-item-left-icon\"),(0,h.append)(s,a),(0,h.append)(n,s),(0,h.append)(n,e.$parent.html);let l=r(i,\"click\",()=>this.render(e.$parents));e.$parent.$events.push(l),(0,h.append)(t,i)}creatItem(e,t=!1){if(!this.cache.has(e.$option))return;let r=this.cache.get(e.$option),a=e.$item,o=\"selector\";(0,h.has)(e,\"switch\")&&(o=\"switch\"),(0,h.has)(e,\"range\")&&(o=\"range\");let{icons:i,proxy:n,constructor:s}=this.art,l=(0,h.createElement)(\"div\");(0,h.addClass)(l,\"art-setting-item\"),(0,h.setStyle)(l,\"height\",`${s.SETTING_ITEM_HEIGHT}px`),l.dataset.name=e.name||\"\",l.dataset.value=e.value||\"\";let c=(0,h.append)(l,'<div class=\"art-setting-item-left\"></div>'),p=(0,h.append)(l,'<div class=\"art-setting-item-right\"></div>'),u=(0,h.createElement)(\"div\");switch((0,h.addClass)(u,\"art-setting-item-left-icon\"),o){case\"switch\":case\"range\":(0,h.append)(u,e.icon||i.config);break;case\"selector\":e.selector?.length?(0,h.append)(u,e.icon||i.config):(0,h.append)(u,i.check)}(0,h.append)(c,u),(0,h.def)(e,\"$icon\",{configurable:!0,get:()=>u}),(0,h.def)(e,\"icon\",{configurable:!0,get:()=>u.innerHTML,set(e){u.innerHTML=\"\",(0,h.append)(u,e)}});let d=(0,h.createElement)(\"div\");(0,h.addClass)(d,\"art-setting-item-left-text\"),(0,h.append)(d,e.html||\"\"),(0,h.append)(c,d),(0,h.def)(e,\"$html\",{configurable:!0,get:()=>d}),(0,h.def)(e,\"html\",{configurable:!0,get:()=>d.innerHTML,set(e){d.innerHTML=\"\",(0,h.append)(d,e)}});let f=(0,h.createElement)(\"div\");switch((0,h.addClass)(f,\"art-setting-item-right-tooltip\"),(0,h.append)(f,e.tooltip||\"\"),(0,h.append)(p,f),(0,h.def)(e,\"$tooltip\",{configurable:!0,get:()=>f}),(0,h.def)(e,\"tooltip\",{configurable:!0,get:()=>f.innerHTML,set(e){f.innerHTML=\"\",(0,h.append)(f,e)}}),o){case\"switch\":{let t=(0,h.createElement)(\"div\");(0,h.addClass)(t,\"art-setting-item-right-icon\");let r=(0,h.append)(t,i.switchOn),a=(0,h.append)(t,i.switchOff);(0,h.setStyle)(e.switch?a:r,\"display\",\"none\"),(0,h.append)(p,t),(0,h.def)(e,\"$switch\",{configurable:!0,get:()=>t});let o=e.switch;(0,h.def)(e,\"switch\",{configurable:!0,get:()=>o,set(e){o=e,e?((0,h.setStyle)(a,\"display\",\"none\"),(0,h.setStyle)(r,\"display\",null)):((0,h.setStyle)(a,\"display\",null),(0,h.setStyle)(r,\"display\",\"none\"))}});break}case\"range\":{let t=(0,h.createElement)(\"div\");(0,h.addClass)(t,\"art-setting-item-right-icon\");let r=(0,h.append)(t,'<input type=\"range\">');r.value=e.range[0],r.min=e.range[1],r.max=e.range[2],r.step=e.range[3],(0,h.addClass)(r,\"art-setting-range\"),(0,h.append)(p,t),(0,h.def)(e,\"$range\",{configurable:!0,get:()=>r});let a=[...e.range];(0,h.def)(e,\"range\",{configurable:!0,get:()=>a,set(e){a=[...e],r.value=e[0],r.min=e[1],r.max=e[2],r.step=e[3]}})}break;case\"selector\":if(e.selector?.length){let e=(0,h.createElement)(\"div\");(0,h.addClass)(e,\"art-setting-item-right-icon\"),(0,h.append)(e,i.arrowRight),(0,h.append)(p,e)}}switch(o){case\"switch\":if(e.onSwitch){let t=n(l,\"click\",async t=>{e.switch=await e.onSwitch.call(this.art,e,l,t)});e.$events.push(t)}break;case\"range\":if(e.$range){if(e.onRange){let t=n(e.$range,\"change\",async t=>{e.range[0]=e.$range.valueAsNumber,e.tooltip=await e.onRange.call(this.art,e,l,t)});e.$events.push(t)}if(e.onChange){let t=n(e.$range,\"input\",async t=>{e.range[0]=e.$range.valueAsNumber,e.tooltip=await e.onChange.call(this.art,e,l,t)});e.$events.push(t)}}break;case\"selector\":{let t=n(l,\"click\",async t=>{e.selector?.length?this.render(e.selector):(this.check(e),e.$parent.onSelect&&(e.$parent.tooltip=await e.$parent.onSelect.call(this.art,e,l,t)))});e.$events.push(t),e.default&&(0,h.addClass)(l,\"art-current\")}}(0,h.def)(e,\"$item\",{configurable:!0,get:()=>l}),t?(0,h.replaceElement)(l,a):(0,h.append)(r,l),e.mounted&&setTimeout(()=>e.mounted.call(this.art,e.$item,e),0)}render(e=this.option){if(this.active=e,this.cache.has(e)){let t=this.cache.get(e);(0,h.inverseClass)(t,\"art-current\")}else{let t=(0,h.createElement)(\"div\");this.cache.set(e,t),(0,h.addClass)(t,\"art-setting-panel\"),(0,h.append)(this.$parent,t),(0,h.inverseClass)(t,\"art-current\"),e[0]?.$parent&&this.creatHeader(e[0]);for(let t=0;t<e.length;t++)this.creatItem(e[t])}this.resize()}}r.default=m},{\"./flip\":\"kONUB\",\"./aspectRatio\":\"84NBV\",\"./playbackRate\":\"aetWt\",\"./subtitleOffset\":\"fIBkO\",\"../utils/component\":\"18nVI\",\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],kONUB:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){let{i18n:t,icons:r,constructor:{SETTING_ITEM_WIDTH:a,FLIP:i}}=e;function n(e){return t.get((0,o.capitalize)(e))}function s(){let t=e.setting.find(`flip-${e.flip}`);e.setting.check(t)}return{width:a,name:\"flip\",html:t.get(\"Video Flip\"),tooltip:n(e.flip),icon:r.flip,selector:i.map(t=>({value:t,name:`flip-${t}`,default:t===e.flip,html:n(t)})),onSelect:t=>(e.flip=t.value,t.html),mounted:()=>{s(),e.on(\"flip\",()=>s())}}}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"84NBV\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");function o(e){let{i18n:t,icons:r,constructor:{SETTING_ITEM_WIDTH:a,ASPECT_RATIO:o}}=e;function i(e){return\"default\"===e?t.get(\"Default\"):e}function n(){let t=e.setting.find(`aspect-ratio-${e.aspectRatio}`);e.setting.check(t)}return{width:a,name:\"aspect-ratio\",html:t.get(\"Aspect Ratio\"),icon:r.aspectRatio,tooltip:i(e.aspectRatio),selector:o.map(t=>({value:t,name:`aspect-ratio-${t}`,default:t===e.aspectRatio,html:i(t)})),onSelect:t=>(e.aspectRatio=t.value,t.html),mounted:()=>{n(),e.on(\"aspectRatio\",()=>n())}}}a.defineInteropFlag(r),a.export(r,\"default\",()=>o)},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],aetWt:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");function o(e){let{i18n:t,icons:r,constructor:{SETTING_ITEM_WIDTH:a,PLAYBACK_RATE:o}}=e;function i(e){return 1===e?t.get(\"Normal\"):e.toFixed(1)}function n(){let t=e.setting.find(`playback-rate-${e.playbackRate}`);e.setting.check(t)}return{width:a,name:\"playback-rate\",html:t.get(\"Play Speed\"),tooltip:i(e.playbackRate),icon:r.playbackRate,selector:o.map(t=>({value:t,name:`playback-rate-${t}`,default:t===e.playbackRate,html:i(t)})),onSelect:t=>(e.playbackRate=t.value,t.html),mounted:()=>{n(),e.on(\"video:ratechange\",()=>n())}}}a.defineInteropFlag(r),a.export(r,\"default\",()=>o)},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],fIBkO:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");function o(e){let{i18n:t,icons:r,constructor:a}=e;return{width:a.SETTING_ITEM_WIDTH,name:\"subtitle-offset\",html:t.get(\"Subtitle Offset\"),icon:r.subtitle,tooltip:\"0s\",range:[0,-10,10,.1],onChange:t=>(e.subtitleOffset=t.range[0],t.range[0]+\"s\"),mounted:(t,r)=>{e.on(\"subtitleOffset\",e=>{r.$range.value=e,r.tooltip=e+\"s\"})}}}a.defineInteropFlag(r),a.export(r,\"default\",()=>o)},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"2aaJe\":[function(e,t,r){e(\"@parcel/transformer-js/src/esmodule-helpers.js\").defineInteropFlag(r),r.default=class{constructor(){this.name=\"artplayer_settings\",this.settings={}}get(e){try{let t=JSON.parse(window.localStorage.getItem(this.name))||{};return e?t[e]:t}catch(t){return e?this.settings[e]:this.settings}}set(e,t){try{let r=Object.assign({},this.get(),{[e]:t});window.localStorage.setItem(this.name,JSON.stringify(r))}catch(r){this.settings[e]=t}}del(e){try{let t=this.get();delete t[e],window.localStorage.setItem(this.name,JSON.stringify(t))}catch(t){delete this.settings[e]}}clear(){try{window.localStorage.removeItem(this.name)}catch(e){this.settings={}}}}},{\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"8MTUM\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r);var o=e(\"../utils\"),i=e(\"./miniProgressBar\"),n=a.interopDefault(i),s=e(\"./autoOrientation\"),l=a.interopDefault(s),c=e(\"./autoPlayback\"),p=a.interopDefault(c),u=e(\"./fastForward\"),d=a.interopDefault(u),f=e(\"./lock\"),h=a.interopDefault(f);r.default=class{constructor(e){this.art=e,this.id=0;let{option:t}=e;t.miniProgressBar&&!t.isLive&&this.add(n.default),t.lock&&o.isMobile&&this.add(h.default),t.autoPlayback&&!t.isLive&&this.add(p.default),t.autoOrientation&&o.isMobile&&this.add(l.default),t.fastForward&&o.isMobile&&!t.isLive&&this.add(d.default);for(let e=0;e<t.plugins.length;e++)this.add(t.plugins[e])}add(e){this.id+=1;let t=e.call(this.art,this.art);return t instanceof Promise?t.then(t=>this.next(e,t)):this.next(e,t)}next(e,t){let r=t&&t.name||e.name||`plugin${this.id}`;return(0,o.errorHandle)(!(0,o.has)(this,r),`Cannot add a plugin that already has the same name: ${r}`),(0,o.def)(this,r,{value:t}),this}}},{\"../utils\":\"71aH7\",\"./miniProgressBar\":\"87pSL\",\"./autoOrientation\":\"ePEg5\",\"./autoPlayback\":\"cVO99\",\"./fastForward\":\"hFDwt\",\"./lock\":\"1hsTH\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"87pSL\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){return e.on(\"control\",t=>{t?(0,o.removeClass)(e.template.$player,\"art-mini-progress-bar\"):(0,o.addClass)(e.template.$player,\"art-mini-progress-bar\")}),{name:\"mini-progress-bar\"}}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],ePEg5:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){let{constructor:t,template:{$player:r,$video:a}}=e;return e.on(\"fullscreenWeb\",i=>{if(i){let{videoWidth:i,videoHeight:n}=a,{clientWidth:s,clientHeight:l}=document.documentElement;(i>n&&s<l||i<n&&s>l)&&setTimeout(()=>{(0,o.setStyle)(r,\"width\",`${l}px`),(0,o.setStyle)(r,\"height\",`${s}px`),(0,o.setStyle)(r,\"transform-origin\",\"0 0\"),(0,o.setStyle)(r,\"transform\",`rotate(90deg) translate(0, -${s}px)`),(0,o.addClass)(r,\"art-auto-orientation\"),e.isRotate=!0,e.emit(\"resize\")},t.AUTO_ORIENTATION_TIME)}else(0,o.hasClass)(r,\"art-auto-orientation\")&&((0,o.removeClass)(r,\"art-auto-orientation\"),e.isRotate=!1,e.emit(\"resize\"))}),e.on(\"fullscreen\",async e=>{if(!screen?.orientation?.lock)return;let t=screen.orientation.type;if(e){let{videoWidth:e,videoHeight:i}=a,{clientWidth:n,clientHeight:s}=document.documentElement;if(e>i&&n<s||e<i&&n>s){let e=t.startsWith(\"portrait\")?\"landscape\":\"portrait\";await screen.orientation.lock(e),(0,o.addClass)(r,\"art-auto-orientation-fullscreen\")}}else(0,o.hasClass)(r,\"art-auto-orientation-fullscreen\")&&(await screen.orientation.lock(t),(0,o.removeClass)(r,\"art-auto-orientation-fullscreen\"))}),{name:\"autoOrientation\",get state(){return(0,o.hasClass)(r,\"art-auto-orientation\")}}}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],cVO99:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){let{i18n:t,icons:r,storage:a,constructor:i,proxy:n,template:{$poster:s}}=e,l=e.layers.add({name:\"auto-playback\",html:`<div class=\"art-auto-playback-close\"></div><div class=\"art-auto-playback-last\"></div><div class=\"art-auto-playback-jump\"></div>`}),c=(0,o.query)(\".art-auto-playback-last\",l),p=(0,o.query)(\".art-auto-playback-jump\",l),u=(0,o.query)(\".art-auto-playback-close\",l);(0,o.append)(u,r.close);let d=null;function f(){let r=(a.get(\"times\")||{})[e.option.id||e.option.url];clearTimeout(d),(0,o.setStyle)(l,\"display\",\"none\"),r&&r>=i.AUTO_PLAYBACK_MIN&&((0,o.setStyle)(l,\"display\",\"flex\"),c.innerText=`${t.get(\"Last Seen\")} ${(0,o.secondToTime)(r)}`,p.innerText=t.get(\"Jump Play\"),n(u,\"click\",()=>{(0,o.setStyle)(l,\"display\",\"none\")}),n(p,\"click\",()=>{e.seek=r,e.play(),(0,o.setStyle)(s,\"display\",\"none\"),(0,o.setStyle)(l,\"display\",\"none\")}),e.once(\"video:timeupdate\",()=>{d=setTimeout(()=>{(0,o.setStyle)(l,\"display\",\"none\")},i.AUTO_PLAYBACK_TIMEOUT)}))}return e.on(\"video:timeupdate\",()=>{if(e.playing){let t=a.get(\"times\")||{},r=Object.keys(t);r.length>i.AUTO_PLAYBACK_MAX&&delete t[r[0]],t[e.option.id||e.option.url]=e.currentTime,a.set(\"times\",t)}}),e.on(\"ready\",f),e.on(\"restart\",f),{name:\"auto-playback\",get times(){return a.get(\"times\")||{}},clear:()=>a.del(\"times\"),delete(e){let t=a.get(\"times\")||{};return delete t[e],a.set(\"times\",t),t}}}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],hFDwt:[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){let{constructor:t,proxy:r,template:{$player:a,$video:i}}=e,n=null,s=!1,l=1,c=()=>{clearTimeout(n),s&&(s=!1,e.playbackRate=l,(0,o.removeClass)(a,\"art-fast-forward\"))};return r(i,\"touchstart\",r=>{1===r.touches.length&&e.playing&&!e.isLock&&(n=setTimeout(()=>{s=!0,l=e.playbackRate,e.playbackRate=t.FAST_FORWARD_VALUE,(0,o.addClass)(a,\"art-fast-forward\")},t.FAST_FORWARD_TIME))}),r(document,\"touchmove\",c),r(document,\"touchend\",c),{name:\"fastForward\",get state(){return(0,o.hasClass)(a,\"art-fast-forward\")}}}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}],\"1hsTH\":[function(e,t,r){var a=e(\"@parcel/transformer-js/src/esmodule-helpers.js\");a.defineInteropFlag(r),a.export(r,\"default\",()=>i);var o=e(\"../utils\");function i(e){let{layers:t,icons:r,template:{$player:a}}=e;function i(){return(0,o.hasClass)(a,\"art-lock\")}function n(){(0,o.addClass)(a,\"art-lock\"),e.isLock=!0,e.emit(\"lock\",!0)}function s(){(0,o.removeClass)(a,\"art-lock\"),e.isLock=!1,e.emit(\"lock\",!1)}return t.add({name:\"lock\",mounted(t){let a=(0,o.append)(t,r.lock),i=(0,o.append)(t,r.unlock);(0,o.setStyle)(a,\"display\",\"none\"),e.on(\"lock\",e=>{e?((0,o.setStyle)(a,\"display\",\"inline-flex\"),(0,o.setStyle)(i,\"display\",\"none\")):((0,o.setStyle)(a,\"display\",\"none\"),(0,o.setStyle)(i,\"display\",\"inline-flex\"))})},click(){i()?s():n()}}),{name:\"lock\",get state(){return i()},set state(value){value?n():s()}}}},{\"../utils\":\"71aH7\",\"@parcel/transformer-js/src/esmodule-helpers.js\":\"9pCYc\"}]},[\"5lTcX\"],\"5lTcX\",\"parcelRequire4dc0\");","'use strict';\n\nvar utils = require('./../utils');\n\n// Headers whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nvar ignoreDuplicateOf = [\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n];\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} headers Headers needing to be parsed\n * @returns {Object} Headers parsed into an object\n */\nmodule.exports = function parseHeaders(headers) {\n var parsed = {};\n var key;\n var val;\n var i;\n\n if (!headers) { return parsed; }\n\n utils.forEach(headers.split('\\n'), function parser(line) {\n i = line.indexOf(':');\n key = utils.trim(line.substr(0, i)).toLowerCase();\n val = utils.trim(line.substr(i + 1));\n\n if (key) {\n if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {\n return;\n }\n if (key === 'set-cookie') {\n parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n }\n });\n\n return parsed;\n};\n","module.exports = {\n \"version\": \"0.27.2\"\n};","'use strict';\n\nvar AxiosError = require('./AxiosError');\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n */\nmodule.exports = function settle(resolve, reject, response) {\n var validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(new AxiosError(\n 'Request failed with status code ' + response.status,\n [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n response.config,\n response.request,\n response\n ));\n }\n};\n","import { useCallback, useLayoutEffect, useEffect, useRef, useState, useMemo } from 'react'\r\nimport isEqual from 'react-fast-compare'\r\nimport Snowflake, { SnowflakeConfig } from './Snowflake'\r\nimport { snowfallBaseStyle } from './config'\r\nimport { getSize } from './utils'\r\n\r\n/**\r\n * A utility function to create a collection of snowflakes\r\n * @param canvasRef A ref to the canvas element\r\n * @param amount The number of snowflakes\r\n * @param config The configuration for each snowflake\r\n */\r\nconst createSnowflakes = (\r\n canvasRef: React.RefObject<HTMLCanvasElement>,\r\n amount: number,\r\n config: SnowflakeConfig,\r\n): Snowflake[] => {\r\n if (!canvasRef.current) return []\r\n\r\n const snowflakes: Snowflake[] = []\r\n\r\n for (let i = 0; i < amount; i++) {\r\n snowflakes.push(new Snowflake(canvasRef.current, config))\r\n }\r\n\r\n return snowflakes\r\n}\r\n\r\n/**\r\n * A utility hook to manage creating and updating a collection of snowflakes\r\n * @param canvasRef A ref to the canvas element\r\n * @param amount The number of snowflakes\r\n * @param config The configuration for each snowflake\r\n */\r\nexport const useSnowflakes = (\r\n canvasRef: React.RefObject<HTMLCanvasElement>,\r\n amount: number,\r\n config: SnowflakeConfig,\r\n) => {\r\n const [snowflakes, setSnowflakes] = useState<Snowflake[]>([])\r\n\r\n // Handle change of amount\r\n useEffect(() => {\r\n setSnowflakes((snowflakes) => {\r\n const sizeDifference = amount - snowflakes.length\r\n\r\n if (sizeDifference > 0) {\r\n return [...snowflakes, ...createSnowflakes(canvasRef, sizeDifference, config)]\r\n }\r\n\r\n if (sizeDifference < 0) {\r\n return snowflakes.slice(0, amount)\r\n }\r\n\r\n return snowflakes\r\n })\r\n }, [amount, canvasRef, config])\r\n\r\n // Handle change of config\r\n useEffect(() => {\r\n setSnowflakes((snowflakes) =>\r\n snowflakes.map((snowflake) => {\r\n snowflake.updateConfig(config)\r\n return snowflake\r\n }),\r\n )\r\n }, [config])\r\n\r\n return snowflakes\r\n}\r\n\r\n/**\r\n * Returns the height and width of a HTML element, uses the `ResizeObserver` api if available to detect changes to the\r\n * size. Falls back to listening for resize events on the window.\r\n * @param ref A ref to the HTML element to be measured\r\n */\r\nexport const useComponentSize = (ref: React.RefObject<HTMLElement>) => {\r\n const [size, setSize] = useState(getSize(ref.current))\r\n\r\n const resizeHandler = useCallback(() => {\r\n if (ref.current) {\r\n setSize(getSize(ref.current))\r\n }\r\n }, [ref])\r\n\r\n useLayoutEffect(() => {\r\n const { ResizeObserver } = window\r\n\r\n if (!ref.current) return\r\n resizeHandler()\r\n\r\n if (typeof ResizeObserver === 'function') {\r\n const resizeObserver = new ResizeObserver(resizeHandler)\r\n resizeObserver.observe(ref.current)\r\n\r\n return () => resizeObserver.disconnect()\r\n } else {\r\n window.addEventListener('resize', resizeHandler)\r\n\r\n return () => window.removeEventListener('resize', resizeHandler)\r\n }\r\n }, [ref, resizeHandler])\r\n\r\n return size\r\n}\r\n\r\n/**\r\n * Utility hook that merges any provided styles with the default styles\r\n * @param overrides The style prop passed into the component\r\n */\r\nexport const useSnowfallStyle = (overrides?: React.CSSProperties): React.CSSProperties => {\r\n const styles = useMemo(\r\n () => ({\r\n ...snowfallBaseStyle,\r\n ...(overrides || {}),\r\n }),\r\n [overrides],\r\n )\r\n\r\n return styles\r\n}\r\n\r\n/**\r\n * Same as `React.useEffect` but uses a deep comparison on the dependency array. This should only\r\n * be used when working with non-primitive dependencies.\r\n *\r\n * @param effect Effect callback to run\r\n * @param deps Effect dependencies\r\n */\r\nexport function useDeepCompareEffect(effect: React.EffectCallback, deps: React.DependencyList) {\r\n const ref = useRef<React.DependencyList>(deps)\r\n\r\n // Only update the current dependencies if they are not deep equal\r\n if (!isEqual(deps, ref.current)) {\r\n ref.current = deps\r\n }\r\n\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n return useEffect(effect, ref.current)\r\n}\r\n\r\n/**\r\n * Utility hook to stabilize a reference to a value, the returned value will always match the input value\r\n * but (unlike an inline object) will maintain [SameValueZero](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\r\n * equality until a change is made.\r\n *\r\n * @example\r\n *\r\n * const obj = useDeepMemo({ foo: 'bar', bar: 'baz' }) // <- inline object creation\r\n * const prevValue = usePrevious(obj) // <- value from the previous render\r\n * console.log(obj === prevValue) // <- always logs true until value changes\r\n */\r\nexport function useDeepMemo<T>(value: T): T {\r\n const [state, setState] = useState(value)\r\n\r\n useDeepCompareEffect(() => setState(value), [value])\r\n\r\n return state\r\n}\r\n","'use strict';\n\nmodule.exports = function parseProtocol(url) {\n var match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || '';\n};\n","import React, { useCallback, useEffect, useRef } from 'react'\r\nimport { targetFrameTime } from './config'\r\nimport { useComponentSize, useSnowfallStyle, useSnowflakes, useDeepMemo } from './hooks'\r\nimport { SnowflakeProps, defaultConfig } from './Snowflake'\r\n\r\nexport interface SnowfallProps extends Partial<SnowflakeProps> {\r\n /**\r\n * The number of snowflakes to be rendered.\r\n *\r\n * The default value is 150.\r\n */\r\n snowflakeCount?: number\r\n /**\r\n * Any style properties that will be passed to the canvas element.\r\n */\r\n style?: React.CSSProperties\r\n}\r\n\r\nconst Snowfall = ({\r\n color = defaultConfig.color,\r\n changeFrequency = defaultConfig.changeFrequency,\r\n radius = defaultConfig.radius,\r\n speed = defaultConfig.speed,\r\n wind = defaultConfig.wind,\r\n rotationSpeed = defaultConfig.rotationSpeed,\r\n snowflakeCount = 150,\r\n images,\r\n style,\r\n}: SnowfallProps = {}): JSX.Element => {\r\n const mergedStyle = useSnowfallStyle(style)\r\n\r\n const canvasRef = useRef<HTMLCanvasElement>(null)\r\n const canvasSize = useComponentSize(canvasRef)\r\n const animationFrame = useRef(0)\r\n\r\n const lastUpdate = useRef(Date.now())\r\n const config = useDeepMemo<SnowflakeProps>({ color, changeFrequency, radius, speed, wind, rotationSpeed, images })\r\n const snowflakes = useSnowflakes(canvasRef, snowflakeCount, config)\r\n\r\n const render = useCallback(\r\n (framesPassed = 1) => {\r\n const canvas = canvasRef.current\r\n if (canvas) {\r\n // Update the positions of the snowflakes\r\n snowflakes.forEach((snowflake) => snowflake.update(canvas, framesPassed))\r\n\r\n // Render them if the canvas is available\r\n const ctx = canvas.getContext('2d')\r\n if (ctx) {\r\n ctx.setTransform(1, 0, 0, 1, 0, 0)\r\n ctx.clearRect(0, 0, canvas.offsetWidth, canvas.offsetHeight)\r\n\r\n snowflakes.forEach((snowflake) => snowflake.draw(ctx))\r\n }\r\n }\r\n },\r\n [snowflakes],\r\n )\r\n\r\n const loop = useCallback(() => {\r\n // Update based on time passed so that a slow frame rate won't slow down the snowflake\r\n const now = Date.now()\r\n const msPassed = Date.now() - lastUpdate.current\r\n lastUpdate.current = now\r\n\r\n // Frames that would have passed if running at 60 fps\r\n const framesPassed = msPassed / targetFrameTime\r\n\r\n render(framesPassed)\r\n\r\n animationFrame.current = requestAnimationFrame(loop)\r\n }, [render])\r\n\r\n useEffect(() => {\r\n loop()\r\n return () => cancelAnimationFrame(animationFrame.current)\r\n }, [loop])\r\n\r\n return (\r\n <canvas\r\n ref={canvasRef}\r\n height={canvasSize.height}\r\n width={canvasSize.width}\r\n style={mergedStyle}\r\n data-testid=\"SnowfallCanvas\"\r\n />\r\n )\r\n}\r\n\r\nexport default Snowfall\r\n","/**\n * @license React\n * react.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 l=Symbol.for(\"react.element\"),n=Symbol.for(\"react.portal\"),p=Symbol.for(\"react.fragment\"),q=Symbol.for(\"react.strict_mode\"),r=Symbol.for(\"react.profiler\"),t=Symbol.for(\"react.provider\"),u=Symbol.for(\"react.context\"),v=Symbol.for(\"react.forward_ref\"),w=Symbol.for(\"react.suspense\"),x=Symbol.for(\"react.memo\"),y=Symbol.for(\"react.lazy\"),z=Symbol.iterator;function A(a){if(null===a||\"object\"!==typeof a)return null;a=z&&a[z]||a[\"@@iterator\"];return\"function\"===typeof a?a:null}\nvar B={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},C=Object.assign,D={};function E(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B}E.prototype.isReactComponent={};\nE.prototype.setState=function(a,b){if(\"object\"!==typeof a&&\"function\"!==typeof a&&null!=a)throw Error(\"setState(...): takes an object of state variables to update or a function which returns an object of state variables.\");this.updater.enqueueSetState(this,a,b,\"setState\")};E.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,\"forceUpdate\")};function F(){}F.prototype=E.prototype;function G(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B}var H=G.prototype=new F;\nH.constructor=G;C(H,E.prototype);H.isPureReactComponent=!0;var I=Array.isArray,J=Object.prototype.hasOwnProperty,K={current:null},L={key:!0,ref:!0,__self:!0,__source:!0};\nfunction M(a,b,e){var d,c={},k=null,h=null;if(null!=b)for(d in void 0!==b.ref&&(h=b.ref),void 0!==b.key&&(k=\"\"+b.key),b)J.call(b,d)&&!L.hasOwnProperty(d)&&(c[d]=b[d]);var g=arguments.length-2;if(1===g)c.children=e;else if(1<g){for(var f=Array(g),m=0;m<g;m++)f[m]=arguments[m+2];c.children=f}if(a&&a.defaultProps)for(d in g=a.defaultProps,g)void 0===c[d]&&(c[d]=g[d]);return{$$typeof:l,type:a,key:k,ref:h,props:c,_owner:K.current}}\nfunction N(a,b){return{$$typeof:l,type:a.type,key:b,ref:a.ref,props:a.props,_owner:a._owner}}function O(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===l}function escape(a){var b={\"=\":\"=0\",\":\":\"=2\"};return\"$\"+a.replace(/[=:]/g,function(a){return b[a]})}var P=/\\/+/g;function Q(a,b){return\"object\"===typeof a&&null!==a&&null!=a.key?escape(\"\"+a.key):b.toString(36)}\nfunction R(a,b,e,d,c){var k=typeof a;if(\"undefined\"===k||\"boolean\"===k)a=null;var h=!1;if(null===a)h=!0;else switch(k){case \"string\":case \"number\":h=!0;break;case \"object\":switch(a.$$typeof){case l:case n:h=!0}}if(h)return h=a,c=c(h),a=\"\"===d?\".\"+Q(h,0):d,I(c)?(e=\"\",null!=a&&(e=a.replace(P,\"$&/\")+\"/\"),R(c,b,e,\"\",function(a){return a})):null!=c&&(O(c)&&(c=N(c,e+(!c.key||h&&h.key===c.key?\"\":(\"\"+c.key).replace(P,\"$&/\")+\"/\")+a)),b.push(c)),1;h=0;d=\"\"===d?\".\":d+\":\";if(I(a))for(var g=0;g<a.length;g++){k=\na[g];var f=d+Q(k,g);h+=R(k,b,e,f,c)}else if(f=A(a),\"function\"===typeof f)for(a=f.call(a),g=0;!(k=a.next()).done;)k=k.value,f=d+Q(k,g++),h+=R(k,b,e,f,c);else if(\"object\"===k)throw b=String(a),Error(\"Objects are not valid as a React child (found: \"+(\"[object Object]\"===b?\"object with keys {\"+Object.keys(a).join(\", \")+\"}\":b)+\"). If you meant to render a collection of children, use an array instead.\");return h}\nfunction S(a,b,e){if(null==a)return a;var d=[],c=0;R(a,d,\"\",\"\",function(a){return b.call(e,a,c++)});return d}function T(a){if(-1===a._status){var b=a._result;b=b();b.then(function(b){if(0===a._status||-1===a._status)a._status=1,a._result=b},function(b){if(0===a._status||-1===a._status)a._status=2,a._result=b});-1===a._status&&(a._status=0,a._result=b)}if(1===a._status)return a._result.default;throw a._result;}\nvar U={current:null},V={transition:null},W={ReactCurrentDispatcher:U,ReactCurrentBatchConfig:V,ReactCurrentOwner:K};function X(){throw Error(\"act(...) is not supported in production builds of React.\");}\nexports.Children={map:S,forEach:function(a,b,e){S(a,function(){b.apply(this,arguments)},e)},count:function(a){var b=0;S(a,function(){b++});return b},toArray:function(a){return S(a,function(a){return a})||[]},only:function(a){if(!O(a))throw Error(\"React.Children.only expected to receive a single React element child.\");return a}};exports.Component=E;exports.Fragment=p;exports.Profiler=r;exports.PureComponent=G;exports.StrictMode=q;exports.Suspense=w;\nexports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=W;exports.act=X;\nexports.cloneElement=function(a,b,e){if(null===a||void 0===a)throw Error(\"React.cloneElement(...): The argument must be a React element, but you passed \"+a+\".\");var d=C({},a.props),c=a.key,k=a.ref,h=a._owner;if(null!=b){void 0!==b.ref&&(k=b.ref,h=K.current);void 0!==b.key&&(c=\"\"+b.key);if(a.type&&a.type.defaultProps)var g=a.type.defaultProps;for(f in b)J.call(b,f)&&!L.hasOwnProperty(f)&&(d[f]=void 0===b[f]&&void 0!==g?g[f]:b[f])}var f=arguments.length-2;if(1===f)d.children=e;else if(1<f){g=Array(f);\nfor(var m=0;m<f;m++)g[m]=arguments[m+2];d.children=g}return{$$typeof:l,type:a.type,key:c,ref:k,props:d,_owner:h}};exports.createContext=function(a){a={$$typeof:u,_currentValue:a,_currentValue2:a,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null};a.Provider={$$typeof:t,_context:a};return a.Consumer=a};exports.createElement=M;exports.createFactory=function(a){var b=M.bind(null,a);b.type=a;return b};exports.createRef=function(){return{current:null}};\nexports.forwardRef=function(a){return{$$typeof:v,render:a}};exports.isValidElement=O;exports.lazy=function(a){return{$$typeof:y,_payload:{_status:-1,_result:a},_init:T}};exports.memo=function(a,b){return{$$typeof:x,type:a,compare:void 0===b?null:b}};exports.startTransition=function(a){var b=V.transition;V.transition={};try{a()}finally{V.transition=b}};exports.unstable_act=X;exports.useCallback=function(a,b){return U.current.useCallback(a,b)};exports.useContext=function(a){return U.current.useContext(a)};\nexports.useDebugValue=function(){};exports.useDeferredValue=function(a){return U.current.useDeferredValue(a)};exports.useEffect=function(a,b){return U.current.useEffect(a,b)};exports.useId=function(){return U.current.useId()};exports.useImperativeHandle=function(a,b,e){return U.current.useImperativeHandle(a,b,e)};exports.useInsertionEffect=function(a,b){return U.current.useInsertionEffect(a,b)};exports.useLayoutEffect=function(a,b){return U.current.useLayoutEffect(a,b)};\nexports.useMemo=function(a,b){return U.current.useMemo(a,b)};exports.useReducer=function(a,b,e){return U.current.useReducer(a,b,e)};exports.useRef=function(a){return U.current.useRef(a)};exports.useState=function(a){return U.current.useState(a)};exports.useSyncExternalStore=function(a,b,e){return U.current.useSyncExternalStore(a,b,e)};exports.useTransition=function(){return U.current.useTransition()};exports.version=\"18.3.1\";\n","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"dashjs\"] = factory();\n\telse\n\t\troot[\"dashjs\"] = factory();\n})(self, function() {\nreturn ","/* $Date: 2007-06-12 18:02:31 $ */\n\n// from: http://bannister.us/weblog/2007/06/09/simple-base64-encodedecode-javascript/\n// Handles encode/decode of ASCII and Unicode strings.\n\nvar UTF8 = {};\nUTF8.encode = function(s) {\n var u = [];\n for (var i = 0; i < s.length; ++i) {\n var c = s.charCodeAt(i);\n if (c < 0x80) {\n u.push(c);\n } else if (c < 0x800) {\n u.push(0xC0 | (c >> 6));\n u.push(0x80 | (63 & c));\n } else if (c < 0x10000) {\n u.push(0xE0 | (c >> 12));\n u.push(0x80 | (63 & (c >> 6)));\n u.push(0x80 | (63 & c));\n } else {\n u.push(0xF0 | (c >> 18));\n u.push(0x80 | (63 & (c >> 12)));\n u.push(0x80 | (63 & (c >> 6)));\n u.push(0x80 | (63 & c));\n }\n }\n return u;\n};\nUTF8.decode = function(u) {\n var a = [];\n var i = 0;\n while (i < u.length) {\n var v = u[i++];\n if (v < 0x80) {\n // no need to mask byte\n } else if (v < 0xE0) {\n v = (31 & v) << 6;\n v |= (63 & u[i++]);\n } else if (v < 0xF0) {\n v = (15 & v) << 12;\n v |= (63 & u[i++]) << 6;\n v |= (63 & u[i++]);\n } else {\n v = (7 & v) << 18;\n v |= (63 & u[i++]) << 12;\n v |= (63 & u[i++]) << 6;\n v |= (63 & u[i++]);\n }\n a.push(String.fromCharCode(v));\n }\n return a.join('');\n};\n\nvar BASE64 = {};\n(function(T){\n var encodeArray = function(u) {\n var i = 0;\n var a = [];\n var n = 0 | (u.length / 3);\n while (0 < n--) {\n var v = (u[i] << 16) + (u[i+1] << 8) + u[i+2];\n i += 3;\n a.push(T.charAt(63 & (v >> 18)));\n a.push(T.charAt(63 & (v >> 12)));\n a.push(T.charAt(63 & (v >> 6)));\n a.push(T.charAt(63 & v));\n }\n if (2 == (u.length - i)) {\n var v = (u[i] << 16) + (u[i+1] << 8);\n a.push(T.charAt(63 & (v >> 18)));\n a.push(T.charAt(63 & (v >> 12)));\n a.push(T.charAt(63 & (v >> 6)));\n a.push('=');\n } else if (1 == (u.length - i)) {\n var v = (u[i] << 16);\n a.push(T.charAt(63 & (v >> 18)));\n a.push(T.charAt(63 & (v >> 12)));\n a.push('==');\n }\n return a.join('');\n }\n var R = (function(){\n var a = [];\n for (var i=0; i<T.length; ++i) {\n a[T.charCodeAt(i)] = i;\n }\n a['='.charCodeAt(0)] = 0;\n return a;\n })();\n var decodeArray = function(s) {\n var i = 0;\n var u = [];\n var n = 0 | (s.length / 4);\n while (0 < n--) {\n var v = (R[s.charCodeAt(i)] << 18) + (R[s.charCodeAt(i+1)] << 12) + (R[s.charCodeAt(i+2)] << 6) + R[s.charCodeAt(i+3)];\n u.push(255 & (v >> 16));\n u.push(255 & (v >> 8));\n u.push(255 & v);\n i += 4;\n }\n if (u) {\n if ('=' == s.charAt(i-2)) {\n u.pop();\n u.pop();\n } else if ('=' == s.charAt(i-1)) {\n u.pop();\n }\n }\n return u;\n }\n var ASCII = {};\n ASCII.encode = function(s) {\n var u = [];\n for (var i = 0; i<s.length; ++i) {\n u.push(s.charCodeAt(i));\n }\n return u;\n };\n ASCII.decode = function(u) {\n for (var i = 0; i<s.length; ++i) {\n a[i] = String.fromCharCode(a[i]);\n }\n return a.join('');\n };\n BASE64.decodeArray = function(s) {\n var u = decodeArray(s);\n return new Uint8Array(u);\n };\n BASE64.encodeASCII = function(s) {\n var u = ASCII.encode(s);\n return encodeArray(u);\n };\n BASE64.decodeASCII = function(s) {\n var a = decodeArray(s);\n return ASCII.decode(a);\n };\n BASE64.encode = function(s) {\n var u = UTF8.encode(s);\n return encodeArray(u);\n };\n BASE64.decode = function(s) {\n var u = decodeArray(s);\n return UTF8.decode(u);\n };\n})(\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\");\n\n/*The following polyfills are not used in dash.js but have caused multiplayer integration issues.\n Therefore commenting them out.\nif (undefined === btoa) {\n var btoa = BASE64.encode;\n}\nif (undefined === atob) {\n var atob = BASE64.decode;\n}\n*/\n\nif (typeof exports !== 'undefined') {\n exports.decode = BASE64.decode;\n exports.decodeArray = BASE64.decodeArray;\n exports.encode = BASE64.encode;\n exports.encodeASCII = BASE64.encodeASCII;\n}\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2015-2016, DASH Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * 2. Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n(function(exports) {\n\n \"use strict\";\n\n /**\n * Exceptions from regular ASCII. CodePoints are mapped to UTF-16 codes\n */\n\n var specialCea608CharsCodes = {\n 0x2a : 0xe1, // lowercase a, acute accent\n 0x5c : 0xe9, // lowercase e, acute accent\n 0x5e : 0xed, // lowercase i, acute accent\n 0x5f : 0xf3, // lowercase o, acute accent\n 0x60 : 0xfa, // lowercase u, acute accent\n 0x7b : 0xe7, // lowercase c with cedilla\n 0x7c : 0xf7, // division symbol\n 0x7d : 0xd1, // uppercase N tilde\n 0x7e : 0xf1, // lowercase n tilde\n 0x7f : 0x2588, // Full block\n // THIS BLOCK INCLUDES THE 16 EXTENDED (TWO-BYTE) LINE 21 CHARACTERS\n // THAT COME FROM HI BYTE=0x11 AND LOW BETWEEN 0x30 AND 0x3F\n // THIS MEANS THAT \\x50 MUST BE ADDED TO THE VALUES\n 0x80 : 0xae, // Registered symbol (R)\n 0x81 : 0xb0, // degree sign\n 0x82 : 0xbd, // 1/2 symbol\n 0x83 : 0xbf, // Inverted (open) question mark\n 0x84 : 0x2122, // Trademark symbol (TM)\n 0x85 : 0xa2, // Cents symbol\n 0x86 : 0xa3, // Pounds sterling\n 0x87 : 0x266a, // Music 8'th note\n 0x88 : 0xe0, // lowercase a, grave accent\n 0x89 : 0x20, // transparent space (regular)\n 0x8a : 0xe8, // lowercase e, grave accent\n 0x8b : 0xe2, // lowercase a, circumflex accent\n 0x8c : 0xea, // lowercase e, circumflex accent\n 0x8d : 0xee, // lowercase i, circumflex accent\n 0x8e : 0xf4, // lowercase o, circumflex accent\n 0x8f : 0xfb, // lowercase u, circumflex accent\n // THIS BLOCK INCLUDES THE 32 EXTENDED (TWO-BYTE) LINE 21 CHARACTERS\n // THAT COME FROM HI BYTE=0x12 AND LOW BETWEEN 0x20 AND 0x3F\n 0x90 : 0xc1, // capital letter A with acute\n 0x91 : 0xc9, // capital letter E with acute\n 0x92 : 0xd3, // capital letter O with acute\n 0x93 : 0xda, // capital letter U with acute\n 0x94 : 0xdc, // capital letter U with diaresis\n 0x95 : 0xfc, // lowercase letter U with diaeresis\n 0x96 : 0x2018, // opening single quote\n 0x97 : 0xa1, // inverted exclamation mark\n 0x98 : 0x2a, // asterisk\n 0x99 : 0x2019, // closing single quote\n 0x9a : 0x2501, // box drawings heavy horizontal\n 0x9b : 0xa9, // copyright sign\n 0x9c : 0x2120, // Service mark\n 0x9d : 0x2022, // (round) bullet\n 0x9e : 0x201c, // Left double quotation mark\n 0x9f : 0x201d, // Right double quotation mark\n 0xa0 : 0xc0, // uppercase A, grave accent\n 0xa1 : 0xc2, // uppercase A, circumflex\n 0xa2 : 0xc7, // uppercase C with cedilla\n 0xa3 : 0xc8, // uppercase E, grave accent\n 0xa4 : 0xca, // uppercase E, circumflex\n 0xa5 : 0xcb, // capital letter E with diaresis\n 0xa6 : 0xeb, // lowercase letter e with diaresis\n 0xa7 : 0xce, // uppercase I, circumflex\n 0xa8 : 0xcf, // uppercase I, with diaresis\n 0xa9 : 0xef, // lowercase i, with diaresis\n 0xaa : 0xd4, // uppercase O, circumflex\n 0xab : 0xd9, // uppercase U, grave accent\n 0xac : 0xf9, // lowercase u, grave accent\n 0xad : 0xdb, // uppercase U, circumflex\n 0xae : 0xab, // left-pointing double angle quotation mark\n 0xaf : 0xbb, // right-pointing double angle quotation mark\n // THIS BLOCK INCLUDES THE 32 EXTENDED (TWO-BYTE) LINE 21 CHARACTERS\n // THAT COME FROM HI BYTE=0x13 AND LOW BETWEEN 0x20 AND 0x3F\n 0xb0 : 0xc3, // Uppercase A, tilde\n 0xb1 : 0xe3, // Lowercase a, tilde\n 0xb2 : 0xcd, // Uppercase I, acute accent\n 0xb3 : 0xcc, // Uppercase I, grave accent\n 0xb4 : 0xec, // Lowercase i, grave accent\n 0xb5 : 0xd2, // Uppercase O, grave accent\n 0xb6 : 0xf2, // Lowercase o, grave accent\n 0xb7 : 0xd5, // Uppercase O, tilde\n 0xb8 : 0xf5, // Lowercase o, tilde\n 0xb9 : 0x7b, // Open curly brace\n 0xba : 0x7d, // Closing curly brace\n 0xbb : 0x5c, // Backslash\n 0xbc : 0x5e, // Caret\n 0xbd : 0x5f, // Underscore\n 0xbe : 0x7c, // Pipe (vertical line)\n 0xbf : 0x223c, // Tilde operator\n 0xc0 : 0xc4, // Uppercase A, umlaut\n 0xc1 : 0xe4, // Lowercase A, umlaut\n 0xc2 : 0xd6, // Uppercase O, umlaut\n 0xc3 : 0xf6, // Lowercase o, umlaut\n 0xc4 : 0xdf, // Esszett (sharp S)\n 0xc5 : 0xa5, // Yen symbol\n 0xc6 : 0xa4, // Generic currency sign\n 0xc7 : 0x2503, // Box drawings heavy vertical\n 0xc8 : 0xc5, // Uppercase A, ring\n 0xc9 : 0xe5, // Lowercase A, ring\n 0xca : 0xd8, // Uppercase O, stroke\n 0xcb : 0xf8, // Lowercase o, strok\n 0xcc : 0x250f, // Box drawings heavy down and right\n 0xcd : 0x2513, // Box drawings heavy down and left\n 0xce : 0x2517, // Box drawings heavy up and right\n 0xcf : 0x251b // Box drawings heavy up and left\n };\n\n /**\n * Get Unicode Character from CEA-608 byte code\n */\n var getCharForByte = function(byte) {\n var charCode = byte;\n if (specialCea608CharsCodes.hasOwnProperty(byte)) {\n charCode = specialCea608CharsCodes[byte];\n }\n return String.fromCharCode(charCode);\n };\n\n var NR_ROWS = 15,\n NR_COLS = 32;\n // Tables to look up row from PAC data\n var rowsLowCh1 = {0x11 : 1, 0x12 : 3, 0x15 : 5, 0x16 : 7, 0x17 : 9, 0x10 : 11, 0x13 : 12, 0x14 : 14};\n var rowsHighCh1 = {0x11 : 2, 0x12 : 4, 0x15 : 6, 0x16 : 8, 0x17 : 10, 0x13 : 13, 0x14 : 15};\n var rowsLowCh2 = {0x19 : 1, 0x1A : 3, 0x1D : 5, 0x1E : 7, 0x1F : 9, 0x18 : 11, 0x1B : 12, 0x1C : 14};\n var rowsHighCh2 = {0x19 : 2, 0x1A : 4, 0x1D : 6, 0x1E : 8, 0x1F : 10, 0x1B : 13, 0x1C : 15};\n\n var backgroundColors = ['white', 'green', 'blue', 'cyan', 'red', 'yellow', 'magenta', 'black', 'transparent'];\n\n /**\n * Simple logger class to be able to write with time-stamps and filter on level.\n */\n var logger = {\n verboseFilter : {'DATA' : 3, 'DEBUG' : 3, 'INFO' : 2, 'WARNING' : 2, 'TEXT' : 1, 'ERROR' : 0},\n time : null,\n verboseLevel : 0, // Only write errors\n setTime : function(newTime) {\n this.time = newTime;\n },\n log : function(severity, msg) {\n var minLevel = this.verboseFilter[severity];\n if (this.verboseLevel >= minLevel) {\n console.log(this.time + \" [\" + severity + \"] \" + msg);\n }\n }\n };\n\n var numArrayToHexArray = function(numArray) {\n var hexArray = [];\n for (var j = 0; j < numArray.length; j++) {\n hexArray.push(numArray[j].toString(16));\n }\n return hexArray;\n };\n\n /**\n * State of CEA-608 pen or character\n * @constructor\n */\n var PenState = function(foreground, underline, italics, background, flash) {\n this.foreground = foreground || \"white\";\n this.underline = underline || false;\n this.italics = italics || false;\n this.background = background || \"black\";\n this.flash = flash || false;\n };\n\n PenState.prototype = {\n \n reset : function() {\n this.foreground = \"white\";\n this.underline = false;\n this.italics = false;\n this.background = \"black\";\n this.flash = false;\n },\n \n setStyles : function(styles) {\n var attribs = [\"foreground\", \"underline\", \"italics\", \"background\", \"flash\"];\n for (var i = 0 ; i < attribs.length; i++) {\n var style = attribs[i];\n if (styles.hasOwnProperty(style)) {\n this[style] = styles[style];\n }\n }\n },\n \n isDefault : function() {\n return (this.foreground === \"white\" && !this.underline && !this.italics && \n this.background === \"black\" && !this.flash);\n },\n\n equals : function(other) {\n return ( (this.foreground === other.foreground) && \n (this.underline === other.underline) &&\n (this.italics === other.italics) &&\n (this.background === other.background) &&\n (this.flash === other.flash) );\n },\n\n copy : function(newPenState) {\n this.foreground = newPenState.foreground;\n this.underline = newPenState.underline;\n this.italics = newPenState.italics;\n this.background = newPenState.background;\n this.flash = newPenState.flash;\n },\n \n toString: function() {\n return (\"color=\" + this.foreground + \", underline=\" + this.underline + \", italics=\" + this.italics +\n \", background=\" + this.background + \", flash=\" + this.flash);\n }\n };\n\n /**\n * Unicode character with styling and background.\n * @constructor\n */\n var StyledUnicodeChar = function(uchar, foreground, underline, italics, background, flash) {\n this.uchar = uchar || ' '; // unicode character\n this.penState = new PenState(foreground, underline,italics, background, flash);\n };\n\n StyledUnicodeChar.prototype = {\n \n reset: function() {\n this.uchar = ' ';\n this.penState.reset();\n },\n \n setChar: function(uchar, newPenState) {\n this.uchar = uchar;\n this.penState.copy(newPenState);\n },\n \n setPenState: function(newPenState) {\n this.penState.copy(newPenState);\n },\n \n equals: function(other) {\n return this.uchar === other.uchar && this.penState.equals(other.penState);\n },\n \n copy: function(newChar) {\n this.uchar = newChar.uchar;\n this.penState.copy(newChar.penState);\n },\n \n isEmpty : function() {\n return this.uchar === ' ' && this.penState.isDefault();\n }\n };\n\n /**\n * CEA-608 row consisting of NR_COLS instances of StyledUnicodeChar.\n * @constructor\n */\n var Row = function() {\n this.chars = [];\n for (var i = 0 ; i < NR_COLS ; i++) {\n this.chars.push(new StyledUnicodeChar());\n }\n this.pos = 0;\n this.currPenState = new PenState();\n };\n\n Row.prototype = {\n \n equals: function(other) {\n var equal = true;\n for (var i = 0 ; i < NR_COLS; i ++) {\n if (!this.chars[i].equals(other.chars[i])) {\n equal = false;\n break;\n }\n }\n return equal;\n },\n \n copy: function(other) {\n for (var i = 0 ; i < NR_COLS; i ++) {\n this.chars[i].copy(other.chars[i]);\n }\n },\n \n isEmpty : function() {\n var empty = true;\n for (var i = 0 ; i < NR_COLS; i ++) {\n if (!this.chars[i].isEmpty()) {\n empty = false;\n break;\n }\n }\n return empty;\n },\n\n /**\n * Set the cursor to a valid column.\n */\n setCursor : function(absPos) {\n if (this.pos !== absPos) {\n this.pos = absPos;\n }\n if (this.pos < 0) {\n logger.log(\"ERROR\", \"Negative cursor position \" + this.pos);\n this.pos = 0;\n } else if (this.pos > NR_COLS) {\n logger.log(\"ERROR\", \"Too large cursor position \" + this.pos);\n this.pos = NR_COLS;\n }\n },\n\n /** \n * Move the cursor relative to current position.\n */\n moveCursor : function(relPos) {\n var newPos = this.pos + relPos;\n if (relPos > 1) {\n for (var i = this.pos+1; i < newPos+1 ; i++) {\n this.chars[i].setPenState(this.currPenState);\n }\n }\n this.setCursor(newPos);\n },\n\n /**\n * Backspace, move one step back and clear character.\n */\n backSpace : function () {\n this.moveCursor(-1);\n this.chars[this.pos].setChar(' ', this.currPenState);\n },\n\n insertChar: function(byte) {\n if (byte >= 0x90) { //Extended char\n this.backSpace();\n }\n var char = getCharForByte(byte);\n if (this.pos >= NR_COLS) {\n logger.log(\"ERROR\", \"Cannot insert \" + byte.toString(16) + \n \" (\" + char + \") at position \" + this.pos + \". Skipping it!\");\n return;\n }\n this.chars[this.pos].setChar(char, this.currPenState);\n this.moveCursor(1);\n },\n\n clearFromPos : function(startPos) {\n var i;\n for (i = startPos ; i < NR_COLS ; i++) {\n this.chars[i].reset();\n }\n },\n\n clear : function() {\n this.clearFromPos(0);\n this.pos = 0;\n this.currPenState.reset();\n },\n\n clearToEndOfRow : function() {\n this.clearFromPos(this.pos);\n },\n\n getTextString: function() {\n var chars = [];\n var empty = true;\n for (var i = 0 ; i < NR_COLS ; i++) {\n var char = this.chars[i].uchar;\n if (char !== \" \") {\n empty = false;\n }\n chars.push(char);\n }\n if (empty) {\n return \"\";\n } else {\n return chars.join(\"\");\n }\n },\n\n setPenStyles: function(styles) {\n this.currPenState.setStyles(styles);\n var currChar = this.chars[this.pos];\n currChar.setPenState(this.currPenState);\n }\n };\n\n /**\n * Keep a CEA-608 screen of 32x15 styled characters\n * @constructor\n */\n var CaptionScreen = function() {\n\n this.rows = [];\n for (var i = 0 ; i < NR_ROWS; i++) {\n this.rows.push(new Row()); // Note that we use zero-based numbering (0-14)\n }\n this.currRow = NR_ROWS - 1;\n this.nrRollUpRows = null;\n this.reset();\n };\n\n CaptionScreen.prototype = {\n\n reset : function() {\n for (var i = 0 ; i < NR_ROWS ; i++) {\n this.rows[i].clear();\n }\n this.currRow = NR_ROWS - 1;\n },\n\n equals : function(other) {\n var equal = true;\n for (var i = 0 ; i < NR_ROWS ; i++) {\n if (!this.rows[i].equals(other.rows[i])) {\n equal = false;\n break;\n }\n }\n return equal;\n },\n\n copy : function(other) {\n for (var i = 0 ; i < NR_ROWS ; i++) {\n this.rows[i].copy(other.rows[i]);\n }\n },\n\n isEmpty : function() {\n var empty = true;\n for (var i = 0 ; i < NR_ROWS ; i++) {\n if (!this.rows[i].isEmpty()) {\n empty = false;\n break;\n }\n }\n return empty;\n },\n\n backSpace : function() {\n var row = this.rows[this.currRow]; \n row.backSpace();\n },\n\n clearToEndOfRow : function() {\n var row = this.rows[this.currRow];\n row.clearToEndOfRow();\n },\n\n /**\n * Insert a character (without styling) in the current row.\n */\n insertChar : function(char) {\n var row = this.rows[this.currRow];\n row.insertChar(char);\n },\n\n setPen : function(styles) {\n var row = this.rows[this.currRow];\n row.setPenStyles(styles);\n },\n\n moveCursor : function(relPos) {\n var row = this.rows[this.currRow];\n row.moveCursor(relPos); \n },\n\n setCursor : function(absPos) {\n logger.log(\"INFO\", \"setCursor: \" + absPos);\n var row = this.rows[this.currRow];\n row.setCursor(absPos);\n },\n\n setPAC : function(pacData) {\n logger.log(\"INFO\", \"pacData = \" + JSON.stringify(pacData));\n var newRow = pacData.row - 1;\n if (this.nrRollUpRows && newRow < this.nrRollUpRows - 1) {\n newRow = this.nrRollUpRows-1;\n }\n this.currRow = newRow;\n var row = this.rows[this.currRow];\n if (pacData.indent !== null) {\n var indent = pacData.indent;\n var prevPos = Math.max(indent-1, 0);\n row.setCursor(pacData.indent);\n pacData.color = row.chars[prevPos].penState.foreground;\n }\n var styles = {foreground : pacData.color, underline : pacData.underline, italics : pacData.italics, background : 'black', flash : false};\n this.setPen(styles);\n },\n\n /**\n * Set background/extra foreground, but first do back_space, and then insert space (backwards compatibility).\n */\n setBkgData : function(bkgData) {\n\n logger.log(\"INFO\", \"bkgData = \" + JSON.stringify(bkgData));\n this.backSpace();\n this.setPen(bkgData);\n this.insertChar(0x20); //Space\n },\n\n setRollUpRows : function(nrRows) {\n this.nrRollUpRows = nrRows;\n },\n\n rollUp : function() {\n if (this.nrRollUpRows === null) {\n logger.log(\"DEBUG\", \"roll_up but nrRollUpRows not set yet\");\n return; //Not properly setup\n }\n logger.log(\"TEXT\", this.getDisplayText());\n var topRowIndex = this.currRow + 1 - this.nrRollUpRows;\n var topRow = this.rows.splice(topRowIndex, 1)[0];\n topRow.clear();\n this.rows.splice(this.currRow, 0, topRow);\n logger.log(\"INFO\", \"Rolling up\");\n //logger.log(\"TEXT\", this.get_display_text())\n },\n\n /**\n * Get all non-empty rows with as unicode text. \n */ \n getDisplayText : function(asOneRow) {\n asOneRow = asOneRow || false;\n var displayText = [];\n var text = \"\";\n var rowNr = -1;\n for (var i = 0 ; i < NR_ROWS ; i++) {\n var rowText = this.rows[i].getTextString();\n if (rowText) {\n rowNr = i+1;\n if (asOneRow) {\n displayText.push(\"Row \" + rowNr + ': \"' + rowText + '\"');\n } else {\n displayText.push(rowText.trim());\n }\n }\n }\n if (displayText.length > 0) {\n if (asOneRow) {\n text = \"[\" + displayText.join(\" | \") + \"]\";\n } else {\n text = displayText.join(\"\\n\");\n }\n }\n return text;\n },\n\n getTextAndFormat : function() {\n return this.rows;\n }\n };\n\n /**\n * Handle a CEA-608 channel and send decoded data to outputFilter\n * @constructor\n * @param {Number} channelNumber (1 or 2)\n * @param {CueHandler} outputFilter Output from channel1 newCue(startTime, endTime, captionScreen)\n */\n var Cea608Channel = function(channelNumber, outputFilter) {\n\n this.chNr = channelNumber;\n this.outputFilter = outputFilter;\n this.mode = null;\n this.verbose = 0;\n this.displayedMemory = new CaptionScreen();\n this.nonDisplayedMemory = new CaptionScreen();\n this.lastOutputScreen = new CaptionScreen();\n this.currRollUpRow = this.displayedMemory.rows[NR_ROWS-1];\n this.writeScreen = this.displayedMemory;\n this.mode = null;\n this.cueStartTime = null; // Keeps track of where a cue started.\n };\n\n Cea608Channel.prototype = {\n \n modes : [\"MODE_ROLL-UP\", \"MODE_POP-ON\", \"MODE_PAINT-ON\", \"MODE_TEXT\"],\n \n reset : function() {\n this.mode = null;\n this.displayedMemory.reset();\n this.nonDisplayedMemory.reset();\n this.lastOutputScreen.reset();\n this.currRollUpRow = this.displayedMemory.rows[NR_ROWS-1];\n this.writeScreen = this.displayedMemory;\n this.mode = null;\n this.cueStartTime = null;\n this.lastCueEndTime = null;\n },\n\n getHandler : function() {\n return this.outputFilter;\n },\n\n setHandler : function(newHandler) {\n this.outputFilter = newHandler;\n },\n\n setPAC : function(pacData) {\n this.writeScreen.setPAC(pacData);\n },\n\n setBkgData : function(bkgData) {\n this.writeScreen.setBkgData(bkgData);\n },\n\n setMode : function(newMode) {\n if (newMode === this.mode) {\n return;\n }\n this.mode = newMode;\n logger.log(\"INFO\", \"MODE=\" + newMode);\n if (this.mode == \"MODE_POP-ON\") {\n this.writeScreen = this.nonDisplayedMemory;\n } else {\n this.writeScreen = this.displayedMemory;\n this.writeScreen.reset();\n }\n if (this.mode !== \"MODE_ROLL-UP\") {\n this.displayedMemory.nrRollUpRows = null;\n this.nonDisplayedMemory.nrRollUpRows = null;\n }\n this.mode = newMode;\n },\n\n insertChars : function(chars) {\n for (var i = 0 ; i < chars.length ; i++) {\n this.writeScreen.insertChar(chars[i]);\n }\n var screen = this.writeScreen === this.displayedMemory ? \"DISP\" : \"NON_DISP\";\n logger.log(\"INFO\", screen + \": \" + this.writeScreen.getDisplayText(true));\n if (this.mode === \"MODE_PAINT-ON\" || this.mode === \"MODE_ROLL-UP\") {\n logger.log(\"TEXT\", \"DISPLAYED: \" + this.displayedMemory.getDisplayText(true));\n this.outputDataUpdate();\n }\n },\n\n cc_RCL: function() { // Resume Caption Loading (switch mode to Pop On)\n logger.log(\"INFO\", \"RCL - Resume Caption Loading\");\n this.setMode(\"MODE_POP-ON\");\n },\n cc_BS: function() { // BackSpace\n logger.log(\"INFO\", \"BS - BackSpace\");\n if (this.mode === \"MODE_TEXT\") {\n return;\n }\n this.writeScreen.backSpace();\n if (this.writeScreen === this.displayedMemory) {\n this.outputDataUpdate();\n }\n },\n cc_AOF : function() { // Reserved (formerly Alarm Off)\n return;\n },\n cc_AON: function() { // Reserved (formerly Alarm On)\n return;\n },\n cc_DER: function() { // Delete to End of Row\n logger.log(\"INFO\", \"DER- Delete to End of Row\");\n this.writeScreen.clearToEndOfRow();\n this.outputDataUpdate();\n },\n cc_RU: function(nrRows) { //Roll-Up Captions-2,3,or 4 Rows\n logger.log(\"INFO\", \"RU(\" + nrRows +\") - Roll Up\");\n this.writeScreen = this.displayedMemory;\n this.setMode(\"MODE_ROLL-UP\");\n this.writeScreen.setRollUpRows(nrRows);\n },\n cc_FON: function() { //Flash On\n logger.log(\"INFO\", \"FON - Flash On\");\n this.writeScreen.setPen({flash : true});\n },\n cc_RDC: function() { // Resume Direct Captioning (switch mode to PaintOn)\n logger.log(\"INFO\", \"RDC - Resume Direct Captioning\");\n this.setMode(\"MODE_PAINT-ON\");\n },\n cc_TR: function() { // Text Restart in text mode (not supported, however)\n logger.log(\"INFO\", \"TR\");\n this.setMode(\"MODE_TEXT\");\n },\n cc_RTD: function() { // Resume Text Display in Text mode (not supported, however)\n logger.log(\"INFO\", \"RTD\");\n this.setMode(\"MODE_TEXT\");\n },\n cc_EDM: function() { // Erase Displayed Memory\n logger.log(\"INFO\", \"EDM - Erase Displayed Memory\");\n this.displayedMemory.reset();\n this.outputDataUpdate();\n },\n cc_CR: function() { // Carriage Return\n logger.log(\"CR - Carriage Return\");\n this.writeScreen.rollUp();\n this.outputDataUpdate();\n },\n cc_ENM: function() { //Erase Non-Displayed Memory\n logger.log(\"INFO\", \"ENM - Erase Non-displayed Memory\");\n this.nonDisplayedMemory.reset();\n },\n cc_EOC: function() { //End of Caption (Flip Memories)\n logger.log(\"INFO\", \"EOC - End Of Caption\");\n if (this.mode === \"MODE_POP-ON\") {\n var tmp = this.displayedMemory;\n this.displayedMemory = this.nonDisplayedMemory;\n this.nonDisplayedMemory = tmp;\n this.writeScreen = this.nonDisplayedMemory;\n logger.log(\"TEXT\", \"DISP: \" + this.displayedMemory.getDisplayText());\n }\n this.outputDataUpdate();\n },\n cc_TO: function(nrCols) { // Tab Offset 1,2, or 3 columns\n logger.log(\"INFO\", \"TO(\" + nrCols + \") - Tab Offset\");\n this.writeScreen.moveCursor(nrCols);\n },\n cc_MIDROW: function(secondByte) { // Parse MIDROW command\n var styles = {flash : false};\n styles.underline = secondByte % 2 === 1;\n styles.italics = secondByte >= 0x2e;\n if (!styles.italics) {\n var colorIndex = Math.floor(secondByte/2) - 0x10;\n var colors = [\"white\", \"green\", \"blue\", \"cyan\", \"red\", \"yellow\", \"magenta\"];\n styles.foreground = colors[colorIndex];\n } else {\n styles.foreground = \"white\";\n }\n logger.log(\"INFO\", \"MIDROW: \" + JSON.stringify(styles));\n this.writeScreen.setPen(styles);\n },\n\n outputDataUpdate: function() {\n var t = logger.time;\n if (t === null) {\n return;\n }\n if (this.outputFilter) {\n if (this.outputFilter.updateData) {\n this.outputFilter.updateData(t, this.displayedMemory);\n }\n if (this.cueStartTime === null && !this.displayedMemory.isEmpty()) { // Start of a new cue\n this.cueStartTime = t;\n } else {\n if (!this.displayedMemory.equals(this.lastOutputScreen)) { \n if (this.outputFilter.newCue) {\n this.outputFilter.newCue(this.cueStartTime, t, this.lastOutputScreen);\n }\n this.cueStartTime = this.displayedMemory.isEmpty() ? null : t;\n }\n }\n this.lastOutputScreen.copy(this.displayedMemory);\n }\n },\n\n cueSplitAtTime : function(t) {\n if (this.outputFilter) {\n if (!this.displayedMemory.isEmpty()) {\n if (this.outputFilter.newCue) {\n this.outputFilter.newCue(this.cueStartTime, t, this.displayedMemory);\n }\n this.cueStartTime = t;\n }\n }\n }\n };\n\n /**\n * Parse CEA-608 data and send decoded data to out1 and out2.\n * @constructor\n * @param {Number} field CEA-608 field (1 or 2)\n * @param {CueHandler} out1 Output from channel1 newCue(startTime, endTime, captionScreen)\n * @param {CueHandler} out2 Output from channel2 newCue(startTime, endTime, captionScreen)\n */\n var Cea608Parser = function(field, out1, out2) {\n this.field = field || 1;\n this.outputs = [out1, out2];\n this.channels = [new Cea608Channel(1, out1), new Cea608Channel(2, out2)];\n this.currChNr = -1; // Will be 1 or 2\n this.lastCmdA = null; // First byte of last command\n this.lastCmdB = null; // Second byte of last command\n this.bufferedData = [];\n this.startTime = null;\n this.lastTime = null;\n this.dataCounters = {'padding' : 0, 'char' : 0, 'cmd' : 0, 'other' : 0};\n };\n\n Cea608Parser.prototype = {\n \n getHandler : function(index) {\n return this.channels[index].getHandler();\n },\n \n setHandler : function(index, newHandler) {\n this.channels[index].setHandler(newHandler);\n },\n\n /**\n * Add data for time t in forms of list of bytes (unsigned ints). The bytes are treated as pairs.\n */\n addData : function(t, byteList) {\n var cmdFound, a, b, \n charsFound = false;\n \n this.lastTime = t;\n logger.setTime(t);\n\n for (var i = 0 ; i < byteList.length ; i+=2) {\n a = byteList[i] & 0x7f;\n b = byteList[i+1] & 0x7f;\n\n if (a >= 0x10 && a <= 0x1f && a === this.lastCmdA && b === this.lastCmdB) {\n this.lastCmdA = null;\n this.lastCmdB = null;\n logger.log(\"DEBUG\", \"Repeated command (\" + numArrayToHexArray([a, b]) + \") is dropped\");\n continue; // Repeated commands are dropped (once)\n }\n\n if (a === 0 && b === 0) {\n this.dataCounters.padding += 2;\n continue;\n } else {\n logger.log(\"DATA\", \"[\" + numArrayToHexArray([byteList[i], byteList[i+1]]) +\"] -> (\" + numArrayToHexArray([a, b]) + \")\");\n }\n cmdFound = this.parseCmd(a, b);\n if (!cmdFound) {\n cmdFound = this.parseMidrow(a, b);\n }\n if (!cmdFound) {\n cmdFound = this.parsePAC(a, b);\n }\n if (!cmdFound) {\n cmdFound = this.parseBackgroundAttributes(a, b);\n }\n if (!cmdFound) {\n charsFound = this.parseChars(a, b);\n if (charsFound) {\n if (this.currChNr && this.currChNr >=0) {\n var channel = this.channels[this.currChNr-1];\n channel.insertChars(charsFound);\n } else {\n logger.log(\"WARNING\", \"No channel found yet. TEXT-MODE?\");\n }\n }\n }\n if (cmdFound) {\n this.dataCounters.cmd += 2;\n } else if (charsFound) {\n this.dataCounters.char += 2;\n } else {\n this.dataCounters.other += 2;\n logger.log(\"WARNING\", \"Couldn't parse cleaned data \" + numArrayToHexArray([a, b]) +\n \" orig: \" + numArrayToHexArray([byteList[i], byteList[i+1]]));\n }\n }\n },\n\n /**\n * Parse Command.\n * @returns {Boolean} Tells if a command was found\n */\n parseCmd: function(a, b) {\n var chNr = null;\n\n var cond1 = (a === 0x14 || a === 0x15 || a === 0x1C || a === 0x1D) && (0x20 <= b && b <= 0x2F);\n var cond2 = (a === 0x17 || a === 0x1F) && (0x21 <= b && b <= 0x23);\n if (!(cond1 || cond2)) {\n return false;\n }\n \n if (a === 0x14 || a === 0x15 || a === 0x17) {\n chNr = 1;\n } else {\n chNr = 2; // (a === 0x1C || a === 0x1D || a=== 0x1f)\n }\n\n var channel = this.channels[chNr - 1];\n\n if (a === 0x14 || a === 0x15 || a === 0x1C || a === 0x1D) {\n if (b === 0x20) {\n channel.cc_RCL();\n } else if (b === 0x21) {\n channel.cc_BS();\n } else if (b === 0x22) {\n channel.cc_AOF();\n } else if (b === 0x23) {\n channel.cc_AON();\n } else if (b === 0x24) {\n channel.cc_DER();\n } else if (b === 0x25) {\n channel.cc_RU(2);\n } else if (b === 0x26) {\n channel.cc_RU(3);\n } else if (b === 0x27) {\n channel.cc_RU(4);\n } else if (b === 0x28) {\n channel.cc_FON();\n } else if (b === 0x29) {\n channel.cc_RDC();\n } else if (b === 0x2A) {\n channel.cc_TR();\n } else if (b === 0x2B) {\n channel.cc_RTD();\n } else if (b === 0x2C) {\n channel.cc_EDM();\n } else if (b === 0x2D) {\n channel.cc_CR();\n } else if (b === 0x2E) {\n channel.cc_ENM();\n } else if (b === 0x2F) {\n channel.cc_EOC();\n }\n } else { //a == 0x17 || a == 0x1F\n channel.cc_TO(b - 0x20);\n }\n this.lastCmdA = a;\n this.lastCmdB = b;\n this.currChNr = chNr;\n return true;\n },\n\n /**\n * Parse midrow styling command\n * @returns {Boolean}\n */\n parseMidrow : function(a, b) {\n var chNr = null;\n \n if ( ((a === 0x11) || (a === 0x19)) && 0x20 <= b && b <= 0x2f) {\n if (a === 0x11) {\n chNr = 1;\n } else {\n chNr = 2;\n }\n if (chNr !== this.currChNr) {\n logger.log(\"ERROR\", \"Mismatch channel in midrow parsing\");\n return false;\n }\n var channel = this.channels[chNr-1];\n // cea608 spec says midrow codes should inject a space\n channel.insertChars([0x20]);\n channel.cc_MIDROW(b);\n logger.log(\"DEBUG\", \"MIDROW (\" + numArrayToHexArray([a, b]) + \")\");\n this.lastCmdA = a;\n this.lastCmdB = b;\n return true;\n }\n return false;\n },\n /**\n * Parse Preable Access Codes (Table 53).\n * @returns {Boolean} Tells if PAC found\n */\n parsePAC : function(a, b) {\n\n var chNr = null;\n var row = null;\n \n var case1 = ((0x11 <= a && a <= 0x17) || (0x19 <= a && a <= 0x1F)) && (0x40 <= b && b <= 0x7F);\n var case2 = (a === 0x10 || a === 0x18) && (0x40 <= b && b <= 0x5F);\n if (! (case1 || case2)) {\n return false;\n }\n\n chNr = (a <= 0x17) ? 1 : 2;\n\n if (0x40 <= b && b <= 0x5F) {\n row = (chNr === 1) ? rowsLowCh1[a] : rowsLowCh2[a];\n } else { // 0x60 <= b <= 0x7F\n row = (chNr === 1) ? rowsHighCh1[a] : rowsHighCh2[a];\n }\n var pacData = this.interpretPAC(row, b);\n var channel = this.channels[chNr-1];\n channel.setPAC(pacData);\n this.lastCmdA = a;\n this.lastCmdB = b;\n this.currChNr = chNr;\n return true;\n },\n\n /**\n * Interpret the second byte of the pac, and return the information.\n * @returns {Object} pacData with style parameters.\n */\n interpretPAC : function (row, byte) {\n var pacIndex = byte;\n var pacData = {color : null, italics : false, indent : null, underline : false, row : row};\n \n if (byte > 0x5F) {\n pacIndex = byte - 0x60;\n } else {\n pacIndex = byte - 0x40;\n }\n pacData.underline = (pacIndex & 1) === 1;\n if (pacIndex <= 0xd) {\n pacData.color = ['white', 'green', 'blue', 'cyan', 'red', 'yellow', 'magenta', 'white'][Math.floor(pacIndex/2)];\n } else if (pacIndex <= 0xf) {\n pacData.italics = true;\n pacData.color = 'white';\n } else {\n pacData.indent = (Math.floor((pacIndex-0x10)/2))*4;\n }\n return pacData; // Note that row has zero offset. The spec uses 1.\n },\n\n /**\n * Parse characters.\n * @returns An array with 1 to 2 codes corresponding to chars, if found. null otherwise.\n */\n parseChars : function(a, b) {\n\n var channelNr = null,\n charCodes = null,\n charCode1 = null,\n charCode2 = null;\n\n if (a >= 0x19) {\n channelNr = 2;\n charCode1 = a - 8;\n } else {\n channelNr = 1;\n charCode1 = a;\n }\n if (0x11 <= charCode1 && charCode1 <= 0x13) {\n // Special character\n var oneCode = b;\n if (charCode1 === 0x11) {\n oneCode = b + 0x50;\n } else if (charCode1 === 0x12) {\n oneCode = b + 0x70;\n } else {\n oneCode = b + 0x90;\n }\n logger.log(\"INFO\", \"Special char '\" + getCharForByte(oneCode) + \"' in channel \" + channelNr);\n charCodes = [oneCode];\n this.lastCmdA = a;\n this.lastCmdB = b;\n } else if (0x20 <= a && a <= 0x7f) {\n charCodes = (b === 0) ? [a] : [a, b];\n this.lastCmdA = null;\n this.lastCmdB = null;\n }\n if (charCodes) {\n var hexCodes = numArrayToHexArray(charCodes);\n logger.log(\"DEBUG\", \"Char codes = \" + hexCodes.join(\",\"));\n }\n return charCodes;\n },\n \n /**\n * Parse extended background attributes as well as new foreground color black.\n * @returns{Boolean} Tells if background attributes are found\n */\n parseBackgroundAttributes : function(a, b) {\n var bkgData,\n index,\n chNr,\n channel;\n\n var case1 = (a === 0x10 || a === 0x18) && (0x20 <= b && b <= 0x2f);\n var case2 = (a === 0x17 || a === 0x1f) && (0x2d <=b && b <= 0x2f);\n if (!(case1 || case2)) {\n return false;\n }\n bkgData = {};\n if (a === 0x10 || a === 0x18) {\n index = Math.floor((b-0x20)/2);\n bkgData.background = backgroundColors[index];\n if (b % 2 === 1) {\n bkgData.background = bkgData.background + \"_semi\";\n }\n } else if (b === 0x2d) {\n bkgData.background = \"transparent\";\n } else {\n bkgData.foreground = \"black\";\n if (b === 0x2f) {\n bkgData.underline = true;\n }\n }\n chNr = (a < 0x18) ? 1 : 2;\n channel = this.channels[chNr-1];\n channel.setBkgData(bkgData);\n this.lastCmdA = a;\n this.lastCmdB = b;\n return true;\n },\n\n /**\n * Reset state of parser and its channels.\n */\n reset : function() {\n for (var i=0 ; i < this.channels.length ; i++) {\n if (this.channels[i]) {\n this.channels[i].reset();\n }\n }\n this.lastCmdA = null;\n this.lastCmdB = null;\n },\n\n /**\n * Trigger the generation of a cue, and the start of a new one if displayScreens are not empty.\n */\n cueSplitAtTime : function(t) {\n for (var i=0 ; i < this.channels.length ; i++) {\n if (this.channels[i]) {\n this.channels[i].cueSplitAtTime(t);\n }\n }\n },\n };\n\n /**\n * Find ranges corresponding to SEA CEA-608 NALUS in sizeprepended NALU array.\n * @param {raw} dataView of binary data\n * @param {startPos} start position in raw\n * @param {size} total size of data in raw to consider\n * @returns \n */\n var findCea608Nalus = function(raw, startPos, size) {\n var nalSize = 0,\n cursor = startPos,\n nalType = 0,\n cea608NaluRanges = [],\n // Check SEI data according to ANSI-SCTE 128\n isCEA608SEI = function (payloadType, payloadSize, raw, pos) {\n if (payloadType !== 4 || payloadSize < 8) {\n return null;\n }\n var countryCode = raw.getUint8(pos);\n var providerCode = raw.getUint16(pos + 1);\n var userIdentifier = raw.getUint32(pos + 3);\n var userDataTypeCode = raw.getUint8(pos + 7);\n return countryCode == 0xB5 && providerCode == 0x31 && userIdentifier == 0x47413934 && userDataTypeCode == 0x3;\n };\n while (cursor < startPos + size) {\n nalSize = raw.getUint32(cursor);\n nalType = raw.getUint8(cursor + 4) & 0x1F;\n //console.log(time + \" NAL \" + nalType);\n if (nalType === 6) {\n // SEI NAL Unit. The NAL header is the first byte\n //console.log(\"SEI NALU of size \" + nalSize + \" at time \" + time);\n var pos = cursor + 5;\n var payloadType = -1;\n while (pos < cursor + 4 + nalSize - 1) { // The last byte should be rbsp_trailing_bits\n payloadType = 0;\n var b = 0xFF;\n while (b === 0xFF) {\n b = raw.getUint8(pos);\n payloadType += b;\n pos++;\n }\n var payloadSize = 0;\n b = 0xFF;\n while (b === 0xFF) {\n b = raw.getUint8(pos);\n payloadSize += b;\n pos++;\n }\n if (isCEA608SEI(payloadType, payloadSize, raw, pos)) {\n //console.log(\"CEA608 SEI \" + time + \" \" + payloadSize);\n cea608NaluRanges.push([pos, payloadSize]);\n }\n pos += payloadSize;\n }\n }\n cursor += nalSize + 4;\n }\n return cea608NaluRanges;\n };\n \n var extractCea608DataFromRange = function(raw, cea608Range) {\n var pos = cea608Range[0];\n var fieldData = [[], []];\n\n pos += 8; // Skip the identifier up to userDataTypeCode\n var ccCount = raw.getUint8(pos) & 0x1f;\n pos += 2; // Advance 1 and skip reserved byte\n \n for (var i = 0; i < ccCount; i++) {\n var byte = raw.getUint8(pos);\n var ccValid = byte & 0x4;\n var ccType = byte & 0x3;\n pos++;\n var ccData1 = raw.getUint8(pos); // Keep parity bit\n pos++;\n var ccData2 = raw.getUint8(pos); // Keep parity bit\n pos++;\n if (ccValid && ((ccData1 & 0x7f) + (ccData2 & 0x7f) !== 0)) { //Check validity and non-empty data\n if (ccType === 0) {\n fieldData[0].push(ccData1);\n fieldData[0].push(ccData2);\n } else if (ccType === 1) {\n fieldData[1].push(ccData1);\n fieldData[1].push(ccData2);\n }\n }\n }\n return fieldData;\n };\n\n exports.logger = logger;\n exports.PenState = PenState;\n exports.CaptionScreen = CaptionScreen; \n exports.Cea608Parser = Cea608Parser;\n exports.findCea608Nalus = findCea608Nalus;\n exports.extractCea608DataFromRange = extractCea608DataFromRange;\n\n}(typeof exports === 'undefined' ? this.cea608parser = {} : exports));\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport MediaPlayer from './src/streaming/MediaPlayer';\nimport FactoryMaker from './src/core/FactoryMaker';\nimport Debug from './src/core/Debug';\nimport { getVersionString } from './src/core/Version';\n\nimport { } from 'es6-promise/auto';\n\n// Shove both of these into the global scope\nvar context = (typeof window !== 'undefined' && window) || global;\n\nvar dashjs = context.dashjs;\nif (!dashjs) {\n dashjs = context.dashjs = {};\n}\n\ndashjs.MediaPlayer = MediaPlayer;\ndashjs.FactoryMaker = FactoryMaker;\ndashjs.Debug = Debug;\ndashjs.Version = getVersionString();\n\nexport default dashjs;\nexport { MediaPlayer, FactoryMaker, Debug};\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport EventBus from './EventBus';\nimport Events from './events/Events';\nimport FactoryMaker from './FactoryMaker';\n\nconst LOG_LEVEL_NONE = 0;\nconst LOG_LEVEL_FATAL = 1;\nconst LOG_LEVEL_ERROR = 2;\nconst LOG_LEVEL_WARNING = 3;\nconst LOG_LEVEL_INFO = 4;\nconst LOG_LEVEL_DEBUG = 5;\n\n/**\n * @module Debug\n * @param {object} config\n * @ignore\n */\nfunction Debug(config) {\n\n config = config || {};\n const context = this.context;\n const eventBus = EventBus(context).getInstance();\n const settings = config.settings;\n\n const logFn = [];\n\n let instance,\n showLogTimestamp,\n showCalleeName,\n startTime;\n\n function setup() {\n showLogTimestamp = true;\n showCalleeName = true;\n startTime = new Date().getTime();\n\n if (typeof window !== 'undefined' && window.console) {\n logFn[LOG_LEVEL_FATAL] = getLogFn(window.console.error);\n logFn[LOG_LEVEL_ERROR] = getLogFn(window.console.error);\n logFn[LOG_LEVEL_WARNING] = getLogFn(window.console.warn);\n logFn[LOG_LEVEL_INFO] = getLogFn(window.console.info);\n logFn[LOG_LEVEL_DEBUG] = getLogFn(window.console.debug);\n }\n }\n\n function getLogFn(fn) {\n if (fn && fn.bind) {\n return fn.bind(window.console);\n }\n // if not define, return the default function for reporting logs\n return window.console.log.bind(window.console);\n }\n\n /**\n * Retrieves a logger which can be used to write logging information in browser console.\n * @param {object} instance Object for which the logger is created. It is used\n * to include calle object information in log messages.\n * @memberof module:Debug\n * @returns {Logger}\n * @instance\n */\n function getLogger(instance) {\n return {\n fatal: fatal.bind(instance),\n error: error.bind(instance),\n warn: warn.bind(instance),\n info: info.bind(instance),\n debug: debug.bind(instance)\n };\n }\n\n /**\n * Prepends a timestamp in milliseconds to each log message.\n * @param {boolean} value Set to true if you want to see a timestamp in each log message.\n * @default LOG_LEVEL_WARNING\n * @memberof module:Debug\n * @instance\n */\n function setLogTimestampVisible(value) {\n showLogTimestamp = value;\n }\n\n /**\n * Prepends the callee object name, and media type if available, to each log message.\n * @param {boolean} value Set to true if you want to see the callee object name and media type in each log message.\n * @default true\n * @memberof module:Debug\n * @instance\n */\n function setCalleeNameVisible(value) {\n showCalleeName = value;\n }\n\n function fatal(...params) {\n doLog(LOG_LEVEL_FATAL, this, ...params);\n }\n\n function error(...params) {\n doLog(LOG_LEVEL_ERROR, this, ...params);\n }\n\n function warn(...params) {\n doLog(LOG_LEVEL_WARNING, this, ...params);\n }\n\n function info(...params) {\n doLog(LOG_LEVEL_INFO, this, ...params);\n }\n\n function debug(...params) {\n doLog(LOG_LEVEL_DEBUG, this, ...params);\n }\n\n function doLog(level, _this, ...params) {\n let message = '';\n let logTime = null;\n\n if (showLogTimestamp) {\n logTime = new Date().getTime();\n message += '[' + (logTime - startTime) + ']';\n }\n\n if (showCalleeName && _this && _this.getClassName) {\n message += '[' + _this.getClassName() + ']';\n if (_this.getType) {\n message += '[' + _this.getType() + ']';\n }\n }\n\n if (message.length > 0) {\n message += ' ';\n }\n\n Array.apply(null, params).forEach(function (item) {\n message += item + ' ';\n });\n\n // log to console if the log level is high enough\n if (logFn[level] && settings && settings.get().debug.logLevel >= level) {\n logFn[level](message);\n }\n\n // send log event regardless of log level\n if (settings && settings.get().debug.dispatchEvent) {\n eventBus.trigger(Events.LOG, { message: message, level: level });\n }\n }\n\n instance = {\n getLogger: getLogger,\n setLogTimestampVisible: setLogTimestampVisible,\n setCalleeNameVisible: setCalleeNameVisible\n };\n\n setup();\n\n return instance;\n}\n\nDebug.__dashjs_factory_name = 'Debug';\n\nconst factory = FactoryMaker.getSingletonFactory(Debug);\nfactory.LOG_LEVEL_NONE = LOG_LEVEL_NONE;\nfactory.LOG_LEVEL_FATAL = LOG_LEVEL_FATAL;\nfactory.LOG_LEVEL_ERROR = LOG_LEVEL_ERROR;\nfactory.LOG_LEVEL_WARNING = LOG_LEVEL_WARNING;\nfactory.LOG_LEVEL_INFO = LOG_LEVEL_INFO;\nfactory.LOG_LEVEL_DEBUG = LOG_LEVEL_DEBUG;\nFactoryMaker.updateSingletonFactory(Debug.__dashjs_factory_name, factory);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport FactoryMaker from './FactoryMaker';\nimport MediaPlayerEvents from '../streaming/MediaPlayerEvents';\n\nconst EVENT_PRIORITY_LOW = 0;\nconst EVENT_PRIORITY_HIGH = 5000;\n\nfunction EventBus() {\n\n let handlers = {};\n\n function on(type, listener, scope, options = {}) {\n\n if (!type) {\n throw new Error('event type cannot be null or undefined');\n }\n if (!listener || typeof (listener) !== 'function') {\n throw new Error('listener must be a function: ' + listener);\n }\n\n let priority = options.priority || EVENT_PRIORITY_LOW;\n\n if (getHandlerIdx(type, listener, scope) >= 0) return;\n\n handlers[type] = handlers[type] || [];\n\n const handler = {\n callback: listener,\n scope,\n priority\n };\n\n if (scope && scope.getStreamId) {\n handler.streamId = scope.getStreamId();\n }\n if (scope && scope.getType) {\n handler.mediaType = scope.getType();\n }\n if (options && options.mode) {\n handler.mode = options.mode;\n }\n\n const inserted = handlers[type].some((item, idx) => {\n if (item && priority > item.priority) {\n handlers[type].splice(idx, 0, handler);\n return true;\n }\n });\n\n if (!inserted) {\n handlers[type].push(handler);\n }\n }\n\n function off(type, listener, scope) {\n if (!type || !listener || !handlers[type]) return;\n const idx = getHandlerIdx(type, listener, scope);\n if (idx < 0) return;\n handlers[type][idx] = null;\n }\n\n function trigger(type, payload = {}, filters = {}) {\n if (!type || !handlers[type]) return;\n\n payload = payload || {};\n\n if (payload.hasOwnProperty('type')) throw new Error('\\'type\\' is a reserved word for event dispatching');\n\n payload.type = type;\n\n if (filters.streamId) {\n payload.streamId = filters.streamId;\n }\n if (filters.mediaType) {\n payload.mediaType = filters.mediaType;\n }\n\n handlers[type]\n .filter((handler) => {\n if (!handler) {\n return false;\n }\n if (filters.streamId && handler.streamId && handler.streamId !== filters.streamId) {\n return false;\n }\n if (filters.mediaType && handler.mediaType && handler.mediaType !== filters.mediaType) {\n return false;\n }\n // This is used for dispatching DASH events. By default we use the onStart mode. Consequently we filter everything that has a non matching mode and the onReceive events for handlers that did not specify a mode.\n if ((filters.mode && handler.mode && handler.mode !== filters.mode) || (!handler.mode && filters.mode && filters.mode === MediaPlayerEvents.EVENT_MODE_ON_RECEIVE)) {\n return false;\n }\n return true;\n })\n .forEach(handler => handler && handler.callback.call(handler.scope, payload));\n }\n\n function getHandlerIdx(type, listener, scope) {\n\n let idx = -1;\n\n if (!handlers[type]) return idx;\n\n handlers[type].some((item, index) => {\n if (item && item.callback === listener && (!scope || scope === item.scope)) {\n idx = index;\n return true;\n }\n });\n return idx;\n }\n\n function reset() {\n handlers = {};\n }\n\n const instance = {\n on: on,\n off: off,\n trigger: trigger,\n reset: reset\n };\n\n return instance;\n}\n\nEventBus.__dashjs_factory_name = 'EventBus';\nconst factory = FactoryMaker.getSingletonFactory(EventBus);\nfactory.EVENT_PRIORITY_LOW = EVENT_PRIORITY_LOW;\nfactory.EVENT_PRIORITY_HIGH = EVENT_PRIORITY_HIGH;\nFactoryMaker.updateSingletonFactory(EventBus.__dashjs_factory_name, factory);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @module FactoryMaker\n * @ignore\n */\nconst FactoryMaker = (function () {\n\n let instance;\n let singletonContexts = [];\n const singletonFactories = {};\n const classFactories = {};\n\n function extend(name, childInstance, override, context) {\n if (!context[name] && childInstance) {\n context[name] = {\n instance: childInstance,\n override: override\n };\n }\n }\n\n /**\n * Use this method from your extended object. this.factory is injected into your object.\n * this.factory.getSingletonInstance(this.context, 'VideoModel')\n * will return the video model for use in the extended object.\n *\n * @param {Object} context - injected into extended object as this.context\n * @param {string} className - string name found in all dash.js objects\n * with name __dashjs_factory_name Will be at the bottom. Will be the same as the object's name.\n * @returns {*} Context aware instance of specified singleton name.\n * @memberof module:FactoryMaker\n * @instance\n */\n function getSingletonInstance(context, className) {\n for (const i in singletonContexts) {\n const obj = singletonContexts[i];\n if (obj.context === context && obj.name === className) {\n return obj.instance;\n }\n }\n return null;\n }\n\n /**\n * Use this method to add an singleton instance to the system. Useful for unit testing to mock objects etc.\n *\n * @param {Object} context\n * @param {string} className\n * @param {Object} instance\n * @memberof module:FactoryMaker\n * @instance\n */\n function setSingletonInstance(context, className, instance) {\n for (const i in singletonContexts) {\n const obj = singletonContexts[i];\n if (obj.context === context && obj.name === className) {\n singletonContexts[i].instance = instance;\n return;\n }\n }\n singletonContexts.push({\n name: className,\n context: context,\n instance: instance\n });\n }\n\n /**\n * Use this method to remove all singleton instances associated with a particular context.\n *\n * @param {Object} context\n * @memberof module:FactoryMaker\n * @instance\n */\n function deleteSingletonInstances(context) {\n singletonContexts = singletonContexts.filter(x => x.context !== context);\n }\n\n /*------------------------------------------------------------------------------------------*/\n\n // Factories storage Management\n\n /*------------------------------------------------------------------------------------------*/\n\n function getFactoryByName(name, factoriesArray) {\n return factoriesArray[name];\n }\n\n function updateFactory(name, factory, factoriesArray) {\n if (name in factoriesArray) {\n factoriesArray[name] = factory;\n }\n }\n\n /*------------------------------------------------------------------------------------------*/\n\n // Class Factories Management\n\n /*------------------------------------------------------------------------------------------*/\n\n function updateClassFactory(name, factory) {\n updateFactory(name, factory, classFactories);\n }\n\n function getClassFactoryByName(name) {\n return getFactoryByName(name, classFactories);\n }\n\n function getClassFactory(classConstructor) {\n let factory = getFactoryByName(classConstructor.__dashjs_factory_name, classFactories);\n\n if (!factory) {\n factory = function (context) {\n if (context === undefined) {\n context = {};\n }\n return {\n create: function () {\n return merge(classConstructor, context, arguments);\n }\n };\n };\n\n classFactories[classConstructor.__dashjs_factory_name] = factory; // store factory\n }\n return factory;\n }\n\n /*------------------------------------------------------------------------------------------*/\n\n // Singleton Factory MAangement\n\n /*------------------------------------------------------------------------------------------*/\n\n function updateSingletonFactory(name, factory) {\n updateFactory(name, factory, singletonFactories);\n }\n\n function getSingletonFactoryByName(name) {\n return getFactoryByName(name, singletonFactories);\n }\n\n function getSingletonFactory(classConstructor) {\n let factory = getFactoryByName(classConstructor.__dashjs_factory_name, singletonFactories);\n if (!factory) {\n factory = function (context) {\n let instance;\n if (context === undefined) {\n context = {};\n }\n return {\n getInstance: function () {\n // If we don't have an instance yet check for one on the context\n if (!instance) {\n instance = getSingletonInstance(context, classConstructor.__dashjs_factory_name);\n }\n // If there's no instance on the context then create one\n if (!instance) {\n instance = merge(classConstructor, context, arguments);\n singletonContexts.push({\n name: classConstructor.__dashjs_factory_name,\n context: context,\n instance: instance\n });\n }\n return instance;\n }\n };\n };\n singletonFactories[classConstructor.__dashjs_factory_name] = factory; // store factory\n }\n\n return factory;\n }\n\n function merge(classConstructor, context, args) {\n\n let classInstance;\n const className = classConstructor.__dashjs_factory_name;\n const extensionObject = context[className];\n\n if (extensionObject) {\n\n let extension = extensionObject.instance;\n\n if (extensionObject.override) { //Override public methods in parent but keep parent.\n\n classInstance = classConstructor.apply({context}, args);\n extension = extension.apply({\n context,\n factory: instance,\n parent: classInstance\n }, args);\n\n for (const prop in extension) {\n if (classInstance.hasOwnProperty(prop)) {\n classInstance[prop] = extension[prop];\n }\n }\n\n } else { //replace parent object completely with new object. Same as dijon.\n\n return extension.apply({\n context,\n factory: instance\n }, args);\n\n }\n } else {\n // Create new instance of the class\n classInstance = classConstructor.apply({context}, args);\n }\n\n // Add getClassName function to class instance prototype (used by Debug)\n classInstance.getClassName = function () {return className;};\n\n return classInstance;\n }\n\n instance = {\n extend: extend,\n getSingletonInstance: getSingletonInstance,\n setSingletonInstance: setSingletonInstance,\n deleteSingletonInstances: deleteSingletonInstances,\n getSingletonFactory: getSingletonFactory,\n getSingletonFactoryByName: getSingletonFactoryByName,\n updateSingletonFactory: updateSingletonFactory,\n getClassFactory: getClassFactory,\n getClassFactoryByName: getClassFactoryByName,\n updateClassFactory: updateClassFactory\n };\n\n return instance;\n\n}());\n\nexport default FactoryMaker;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport FactoryMaker from './FactoryMaker';\nimport Utils from './Utils.js';\nimport Debug from '../core/Debug';\nimport Constants from '../streaming/constants/Constants';\nimport {HTTPRequest} from '../streaming/vo/metrics/HTTPRequest';\nimport EventBus from './EventBus';\nimport Events from './events/Events';\n\n/** @module Settings\n * @description Define the configuration parameters of Dash.js MediaPlayer.\n * @see {@link module:Settings~PlayerSettings PlayerSettings} for further information about the supported configuration properties.\n */\n\n\n/**\n * @typedef {Object} PlayerSettings\n * @property {module:Settings~DebugSettings} [debug]\n * Debug related settings.\n * @property {module:Settings~ErrorSettings} [errors]\n * Error related settings\n * @property {module:Settings~StreamingSettings} [streaming]\n * Streaming related settings.\n * @example\n *\n * // Full settings object\n * settings = {\n * debug: {\n * logLevel: Debug.LOG_LEVEL_WARNING,\n * dispatchEvent: false\n * },\n * streaming: {\n * abandonLoadTimeout: 10000,\n * wallclockTimeUpdateInterval: 100,\n * manifestUpdateRetryInterval: 100,\n * liveUpdateTimeThresholdInMilliseconds: 0,\n * cacheInitSegments: false,\n * applyServiceDescription: true,\n * applyProducerReferenceTime: true,\n * applyContentSteering: true,\n * eventControllerRefreshDelay: 100,\n * enableManifestDurationMismatchFix: true,\n * enableManifestTimescaleMismatchFix: false,\n * parseInbandPrft: false,\n * capabilities: {\n * filterUnsupportedEssentialProperties: true,\n * useMediaCapabilitiesApi: false\n * },\n * timeShiftBuffer: {\n * calcFromSegmentTimeline: false,\n * fallbackToSegmentTimeline: true\n * },\n * metrics: {\n * maxListDepth: 100\n * },\n * delay: {\n * liveDelayFragmentCount: NaN,\n * liveDelay: NaN,\n * useSuggestedPresentationDelay: true\n * },\n * protection: {\n * keepProtectionMediaKeys: false,\n * ignoreEmeEncryptedEvent: false,\n * detectPlayreadyMessageFormat: true,\n * },\n * buffer: {\n * enableSeekDecorrelationFix: false,\n * fastSwitchEnabled: true,\n * flushBufferAtTrackSwitch: false,\n * reuseExistingSourceBuffers: true,\n * bufferPruningInterval: 10,\n * bufferToKeep: 20,\n * bufferTimeAtTopQuality: 30,\n * bufferTimeAtTopQualityLongForm: 60,\n * initialBufferLevel: NaN,\n * stableBufferTime: 12,\n * longFormContentDurationThreshold: 600,\n * stallThreshold: 0.3,\n * useAppendWindow: true,\n * setStallState: true,\n * avoidCurrentTimeRangePruning: false,\n * useChangeTypeForTrackSwitch: true,\n * mediaSourceDurationInfinity: true,\n * resetSourceBuffersForTrackSwitch: false\n * },\n * gaps: {\n * jumpGaps: true,\n * jumpLargeGaps: true,\n * smallGapLimit: 1.5,\n * threshold: 0.3,\n * enableSeekFix: true,\n * enableStallFix: false,\n * stallSeek: 0.1\n * },\n * utcSynchronization: {\n * enabled: true,\n * useManifestDateHeaderTimeSource: true,\n * backgroundAttempts: 2,\n * timeBetweenSyncAttempts: 30,\n * maximumTimeBetweenSyncAttempts: 600,\n * minimumTimeBetweenSyncAttempts: 2,\n * timeBetweenSyncAttemptsAdjustmentFactor: 2,\n * maximumAllowedDrift: 100,\n * enableBackgroundSyncAfterSegmentDownloadError: true,\n * defaultTimingSource: {\n * scheme: 'urn:mpeg:dash:utc:http-xsdate:2014',\n * value: 'http://time.akamai.com/?iso&ms'\n * }\n * },\n * scheduling: {\n * defaultTimeout: 500,\n * lowLatencyTimeout: 0,\n * scheduleWhilePaused: true\n * },\n * text: {\n * defaultEnabled: true,\n * dispatchForManualRendering: false,\n * extendSegmentedCues: true,\n * imsc: {\n * displayForcedOnlyMode: false,\n * enableRollUp: true\n * },\n * webvtt: {\n * customRenderingEnabled: false\n * }\n * },\n * liveCatchup: {\n * maxDrift: NaN,\n * playbackRate: {min: NaN, max: NaN},\n * playbackBufferMin: 0.5,\n * enabled: null,\n * mode: Constants.LIVE_CATCHUP_MODE_DEFAULT\n * },\n * lastBitrateCachingInfo: { enabled: true, ttl: 360000 },\n * lastMediaSettingsCachingInfo: { enabled: true, ttl: 360000 },\n * saveLastMediaSettingsForCurrentStreamingSession: true,\n * cacheLoadThresholds: { video: 50, audio: 5 },\n * trackSwitchMode: {\n * audio: Constants.TRACK_SWITCH_MODE_ALWAYS_REPLACE,\n * video: Constants.TRACK_SWITCH_MODE_NEVER_REPLACE\n * },\n * selectionModeForInitialTrack: Constants.TRACK_SELECTION_MODE_HIGHEST_SELECTION_PRIORITY,\n * fragmentRequestTimeout: 20000,\n * fragmentRequestProgressTimeout: -1,\n * manifestRequestTimeout: 10000,\n * retryIntervals: {\n * [HTTPRequest.MPD_TYPE]: 500,\n * [HTTPRequest.XLINK_EXPANSION_TYPE]: 500,\n * [HTTPRequest.MEDIA_SEGMENT_TYPE]: 1000,\n * [HTTPRequest.INIT_SEGMENT_TYPE]: 1000,\n * [HTTPRequest.BITSTREAM_SWITCHING_SEGMENT_TYPE]: 1000,\n * [HTTPRequest.INDEX_SEGMENT_TYPE]: 1000,\n * [HTTPRequest.MSS_FRAGMENT_INFO_SEGMENT_TYPE]: 1000,\n * [HTTPRequest.LICENSE]: 1000,\n * [HTTPRequest.OTHER_TYPE]: 1000,\n * lowLatencyReductionFactor: 10\n * },\n * retryAttempts: {\n * [HTTPRequest.MPD_TYPE]: 3,\n * [HTTPRequest.XLINK_EXPANSION_TYPE]: 1,\n * [HTTPRequest.MEDIA_SEGMENT_TYPE]: 3,\n * [HTTPRequest.INIT_SEGMENT_TYPE]: 3,\n * [HTTPRequest.BITSTREAM_SWITCHING_SEGMENT_TYPE]: 3,\n * [HTTPRequest.INDEX_SEGMENT_TYPE]: 3,\n * [HTTPRequest.MSS_FRAGMENT_INFO_SEGMENT_TYPE]: 3,\n * [HTTPRequest.LICENSE]: 3,\n * [HTTPRequest.OTHER_TYPE]: 3,\n * lowLatencyMultiplyFactor: 5\n * },\n * abr: {\n * movingAverageMethod: Constants.MOVING_AVERAGE_SLIDING_WINDOW,\n * ABRStrategy: Constants.ABR_STRATEGY_DYNAMIC,\n * additionalAbrRules: {\n * insufficientBufferRule: true,\n * switchHistoryRule: true,\n * droppedFramesRule: true,\n * abandonRequestsRule: true\n * },\n * abrRulesParameters: {\n * abandonRequestsRule: {\n * graceTimeThreshold: 500,\n * abandonMultiplier: 1.8,\n * minLengthToAverage: 5\n * }\n * },\n * bandwidthSafetyFactor: 0.9,\n * useDefaultABRRules: true,\n * useDeadTimeLatency: true,\n * limitBitrateByPortal: false,\n * usePixelRatioInLimitBitrateByPortal: false,\n * maxBitrate: { audio: -1, video: -1 },\n * minBitrate: { audio: -1, video: -1 },\n * maxRepresentationRatio: { audio: 1, video: 1 },\n * initialBitrate: { audio: -1, video: -1 },\n * initialRepresentationRatio: { audio: -1, video: -1 },\n * autoSwitchBitrate: { audio: true, video: true },\n * fetchThroughputCalculationMode: Constants.ABR_FETCH_THROUGHPUT_CALCULATION_DOWNLOADED_DATA\n * },\n * cmcd: {\n * enabled: false,\n * sid: null,\n * cid: null,\n * rtp: null,\n * rtpSafetyFactor: 5,\n * mode: Constants.CMCD_MODE_QUERY,\n * enabledKeys: ['br', 'd', 'ot', 'tb' , 'bl', 'dl', 'mtp', 'nor', 'nrr', 'su' , 'bs', 'rtp' , 'cid', 'pr', 'sf', 'sid', 'st', 'v']\n * },\n * cmsd: {\n * enabled: false,\n * abr: {\n * applyMb: false,\n * etpWeightRatio: 0\n * }\n * }\n * },\n * errors: {\n * recoverAttempts: {\n * mediaErrorDecode: 5\n * }\n * }\n * }\n */\n\n/**\n * @typedef {Object} TimeShiftBuffer\n * @property {boolean} [calcFromSegmentTimeline=false]\n * Enable calculation of the DVR window for SegmentTimeline manifests based on the entries in \\<SegmentTimeline\\>.\n * * @property {boolean} [fallbackToSegmentTimeline=true]\n * In case the MPD uses \\<SegmentTimeline\\ and no segment is found within the DVR window the DVR window is calculated based on the entries in \\<SegmentTimeline\\>.\n */\n\n/**\n * @typedef {Object} LiveDelay\n * @property {number} [liveDelayFragmentCount=NaN]\n * Changing this value will lower or increase live stream latency.\n *\n * The detected segment duration will be multiplied by this value to define a time in seconds to delay a live stream from the live edge.\n *\n * Lowering this value will lower latency but may decrease the player's ability to build a stable buffer.\n * @property {number} [liveDelay=NaN]\n * Equivalent in seconds of setLiveDelayFragmentCount.\n *\n * Lowering this value will lower latency but may decrease the player's ability to build a stable buffer.\n *\n * This value should be less than the manifest duration by a couple of segment durations to avoid playback issues.\n *\n * If set, this parameter will take precedence over setLiveDelayFragmentCount and manifest info.\n * @property {boolean} [useSuggestedPresentationDelay=true]\n * Set to true if you would like to overwrite the default live delay and honor the SuggestedPresentationDelay attribute in by the manifest.\n */\n\n/**\n * @typedef {Object} Buffer\n * @property {boolean} [enableSeekDecorrelationFix=false]\n * Enables a workaround for playback start on some devices, e.g. WebOS 4.9.\n * It is necessary because some browsers do not support setting currentTime on video element to a value that is outside of current buffer.\n *\n * If you experience unexpected seeking triggered by BufferController, you can try setting this value to false.\n\n * @property {boolean} [fastSwitchEnabled=true]\n * When enabled, after an ABR up-switch in quality, instead of requesting and appending the next fragment at the end of the current buffer range it is requested and appended closer to the current time.\n *\n * When enabled, The maximum time to render a higher quality is current time + (1.5 * fragment duration).\n *\n * Note, When ABR down-switch is detected, we appended the lower quality at the end of the buffer range to preserve the\n * higher quality media for as long as possible.\n *\n * If enabled, it should be noted there are a few cases when the client will not replace inside buffer range but rather just append at the end.\n * 1. When the buffer level is less than one fragment duration.\n * 2. The client is in an Abandonment State due to recent fragment abandonment event.\n *\n * Known issues:\n * 1. In IE11 with auto switching off, if a user switches to a quality they can not download in time the fragment may be appended in the same range as the playhead or even in the past, in IE11 it may cause a stutter or stall in playback.\n * @property {boolean} [flushBufferAtTrackSwitch=false]\n * When enabled, after a track switch and in case buffer is being replaced, the video element is flushed (seek at current playback time) once a segment of the new track is appended in buffer in order to force video decoder to play new track.\n *\n * This can be required on some devices like GoogleCast devices to make track switching functional.\n *\n * Otherwise track switching will be effective only once after previous buffered track is fully consumed.\n * @property {boolean} [reuseExistingSourceBuffers=true]\n * Enable reuse of existing MediaSource Sourcebuffers during period transition.\n * @property {number} [bufferPruningInterval=10]\n * The interval of pruning buffer in seconds.\n * @property {number} [bufferToKeep=20]\n * This value influences the buffer pruning logic.\n *\n * Allows you to modify the buffer that is kept in source buffer in seconds.\n * 0|-----------bufferToPrune-----------|-----bufferToKeep-----|currentTime|\n * @property {number} [bufferTimeAtTopQuality=30]\n * The time that the internal buffer target will be set to once playing the top quality.\n *\n * If there are multiple bitrates in your adaptation, and the media is playing at the highest bitrate, then we try to build a larger buffer at the top quality to increase stability and to maintain media quality.\n * @property {number} [bufferTimeAtTopQualityLongForm=60]\n * The time that the internal buffer target will be set to once playing the top quality for long form content.\n * @property {number} [longFormContentDurationThreshold=600]\n * The threshold which defines if the media is considered long form content.\n *\n * This will directly affect the buffer targets when playing back at the top quality.\n * @property {number} [initialBufferLevel=NaN]\n * Initial buffer level before playback starts\n * @property {number} [stableBufferTime=12]\n * The time that the internal buffer target will be set to post startup/seeks (NOT top quality).\n *\n * When the time is set higher than the default you will have to wait longer to see automatic bitrate switches but will have a larger buffer which will increase stability.\n * @property {number} [stallThreshold=0.3]\n * Stall threshold used in BufferController.js to determine whether a track should still be changed and which buffer range to prune.\n * @property {boolean} [useAppendWindow=true]\n * Specifies if the appendWindow attributes of the MSE SourceBuffers should be set according to content duration from manifest.\n * @property {boolean} [setStallState=true]\n * Specifies if we fire manual waiting events once the stall threshold is reached\n * @property {boolean} [avoidCurrentTimeRangePruning=false]\n * Avoids pruning of the buffered range that contains the current playback time.\n *\n * That buffered range is likely to have been enqueued for playback. Pruning it causes a flush and reenqueue in WPE and WebKitGTK based browsers. This stresses the video decoder and can cause stuttering on embedded platforms.\n * @property {boolean} [useChangeTypeForTrackSwitch=true]\n * If this flag is set to true then dash.js will use the MSE v.2 API call \"changeType()\" before switching to a different track.\n * Note that some platforms might not implement the changeType functio. dash.js is checking for the availability before trying to call it.\n * @property {boolean} [mediaSourceDurationInfinity=true]\n * If this flag is set to true then dash.js will allow `Infinity` to be set as the MediaSource duration otherwise the duration will be set to `Math.pow(2,32)` instead of `Infinity` to allow appending segments indefinitely.\n * Some platforms such as WebOS 4.x have issues with seeking when duration is set to `Infinity`, setting this flag to false resolve this.\n * @property {boolean} [resetSourceBuffersForTrackSwitch=false]\n * When switching to a track that is not compatible with the currently active MSE SourceBuffers, MSE will be reset. This happens when we switch codecs on a system\n * that does not properly implement \"changeType()\", such as webOS 4.0 and before.\n */\n\n/**\n * @typedef {Object} module:Settings~AudioVideoSettings\n * @property {number|boolean|string} [audio]\n * Configuration for audio media type of tracks.\n * @property {number|boolean|string} [video]\n * Configuration for video media type of tracks.\n */\n\n/**\n * @typedef {Object} DebugSettings\n * @property {number} [logLevel=dashjs.Debug.LOG_LEVEL_WARNING]\n * Sets up the log level. The levels are cumulative.\n *\n * For example, if you set the log level to dashjs.Debug.LOG_LEVEL_WARNING all warnings, errors and fatals will be logged.\n *\n * Possible values.\n *\n * - dashjs.Debug.LOG_LEVEL_NONE\n * No message is written in the browser console.\n *\n * - dashjs.Debug.LOG_LEVEL_FATAL\n * Log fatal errors.\n * An error is considered fatal when it causes playback to fail completely.\n *\n * - dashjs.Debug.LOG_LEVEL_ERROR\n * Log error messages.\n *\n * - dashjs.Debug.LOG_LEVEL_WARNING\n * Log warning messages.\n *\n * - dashjs.Debug.LOG_LEVEL_INFO\n * Log info messages.\n *\n * - dashjs.Debug.LOG_LEVEL_DEBUG\n * Log debug messages.\n * @property {boolean} [dispatchEvent=false]\n * Enable to trigger a Events.LOG event whenever log output is generated.\n *\n * Note this will be dispatched regardless of log level.\n */\n\n/**\n * @typedef {Object} module:Settings~ErrorSettings\n * @property {object} [recoverAttempts={mediaErrorDecode: 5}]\n * Defines the maximum number of recover attempts for specific media errors.\n *\n * For mediaErrorDecode the player will reset the MSE and skip the blacklisted segment that caused the decode error. The resulting gap will be handled by the GapController.\n */\n\n/**\n * @typedef {Object} CachingInfoSettings\n * @property {boolean} [enable]\n * Enable or disable the caching feature.\n * @property {number} [ttl]\n * Time to live.\n *\n * A value defined in milliseconds representing how log to cache the settings for.\n */\n\n/**\n * @typedef {Object} Gaps\n * @property {boolean} [jumpGaps=true]\n * Sets whether player should jump small gaps (discontinuities) in the buffer.\n * @property {boolean} [jumpLargeGaps=true]\n * Sets whether player should jump large gaps (discontinuities) in the buffer.\n * @property {number} [smallGapLimit=1.5]\n * Time in seconds for a gap to be considered small.\n * @property {number} [threshold=0.3]\n * Threshold at which the gap handling is executed. If currentRangeEnd - currentTime < threshold the gap jump will be triggered.\n * For live stream the jump might be delayed to keep a consistent live edge.\n * Note that the amount of buffer at which platforms automatically stall might differ.\n * @property {boolean} [enableSeekFix=true]\n * Enables the adjustment of the seek target once no valid segment request could be generated for a specific seek time. This can happen if the user seeks to a position for which there is a gap in the timeline.\n * @property {boolean} [enableStallFix=false]\n * If playback stalled in a buffered range this fix will perform a seek by the value defined in stallSeek to trigger playback again.\n * @property {number} [stallSeek=0.1]\n * Value to be used in case enableStallFix is set to true\n */\n\n/**\n * @typedef {Object} UtcSynchronizationSettings\n * @property {boolean} [enabled=true]\n * Enables or disables the UTC clock synchronization\n * @property {boolean} [useManifestDateHeaderTimeSource=true]\n * Allows you to enable the use of the Date Header, if exposed with CORS, as a timing source for live edge detection.\n *\n * The use of the date header will happen only after the other timing source that take precedence fail or are omitted as described.\n * @property {number} [backgroundAttempts=2]\n * Number of synchronization attempts to perform in the background after an initial synchronization request has been done. This is used to verify that the derived client-server offset is correct.\n *\n * The background requests are async and done in parallel to the start of the playback.\n *\n * This value is also used to perform a resync after 404 errors on segments.\n * @property {number} [timeBetweenSyncAttempts=30]\n * The time in seconds between two consecutive sync attempts.\n *\n * Note: This value is used as an initial starting value. The internal value of the TimeSyncController is adjusted during playback based on the drift between two consecutive synchronization attempts.\n *\n * Note: A sync is only performed after an MPD update. In case the @minimumUpdatePeriod is larger than this value the sync will be delayed until the next MPD update.\n * @property {number} [maximumTimeBetweenSyncAttempts=600]\n * The maximum time in seconds between two consecutive sync attempts.\n *\n * @property {number} [minimumTimeBetweenSyncAttempts=2]\n * The minimum time in seconds between two consecutive sync attempts.\n *\n * @property {number} [timeBetweenSyncAttemptsAdjustmentFactor=2]\n * The factor used to multiply or divide the timeBetweenSyncAttempts parameter after a sync. The maximumAllowedDrift defines whether this value is used as a factor or a dividend.\n *\n * @property {number} [maximumAllowedDrift=100]\n * The maximum allowed drift specified in milliseconds between two consecutive synchronization attempts.\n *\n * @property {boolean} [enableBackgroundSyncAfterSegmentDownloadError=true]\n * Enables or disables the background sync after the player ran into a segment download error.\n *\n * @property {object} [defaultTimingSource={scheme:'urn:mpeg:dash:utc:http-xsdate:2014',value: 'http://time.akamai.com/?iso&ms'}]\n * The default timing source to be used. The timing sources in the MPD take precedence over this one.\n */\n\n/**\n * @typedef {Object} Scheduling\n * @property {number} [defaultTimeout=500]\n * Default timeout between two consecutive segment scheduling attempts\n * @property {number} [lowLatencyTimeout=0]\n * Default timeout between two consecutive low-latency segment scheduling attempts\n * @property {boolean} [scheduleWhilePaused=true]\n * Set to true if you would like dash.js to keep downloading fragments in the background when the video element is paused.\n */\n\n/**\n * @typedef {Object} Text\n * @property {boolean} [defaultEnabled=true]\n * Enable/disable subtitle rendering by default.\n * @property {boolean} [dispatchForManualRendering=false]\n * Enable/disable firing of CueEnter/CueExt events. This will disable the display of subtitles and should be used when you want to have full control about rendering them.\n * @property {boolean} [extendSegmentedCues=true]\n * Enable/disable patching of segmented cues in order to merge as a single cue by extending cue end time.\n * @property {boolean} [imsc.displayForcedOnlyMode=false]\n * Enable/disable forced only mode in IMSC captions.\n * When true, only those captions where itts:forcedDisplay=\"true\" will be displayed.\n * @property {boolean} [imsc.enableRollUp=true]\n * Enable/disable rollUp style display of IMSC captions.\n * @property {object} [webvtt.customRenderingEnabled=false]\n * Enables the custom rendering for WebVTT captions. For details refer to the \"Subtitles and Captions\" sample section of dash.js.\n * Custom WebVTT rendering requires the external library vtt.js that can be found in the contrib folder.\n */\n\n/**\n * @typedef {Object} LiveCatchupSettings\n * @property {number} [maxDrift=NaN]\n * Use this method to set the maximum latency deviation allowed before dash.js to do a seeking to live position.\n *\n * In low latency mode, when the difference between the measured latency and the target one, as an absolute number, is higher than the one sets with this method, then dash.js does a seek to live edge position minus the target live delay.\n *\n * LowLatencyMaxDriftBeforeSeeking should be provided in seconds.\n *\n * If 0, then seeking operations won't be used for fixing latency deviations.\n *\n * Note: Catch-up mechanism is only applied when playing low latency live streams.\n * @property {number} [playbackRate={min: NaN, max: NaN}]\n * Use this parameter to set the minimum and maximum catch up rates, as percentages, for low latency live streams.\n *\n * In low latency mode, when measured latency is higher/lower than the target one, dash.js increases/decreases playback rate respectively up to (+/-) the percentage defined with this method until target is reached.\n *\n * Valid values for min catch up rate are in the range -0.5 to 0 (-50% to 0% playback rate decrease)\n *\n * Valid values for max catch up rate are in the range 0 to 1 (0% to 100% playback rate increase).\n *\n * Set min and max to NaN to turn off live catch up feature.\n *\n * These playback rate limits take precedence over any PlaybackRate values in ServiceDescription elements in an MPD. If only one of the min/max properties is given a value, the property without a value will not fall back to a ServiceDescription value. Its default value of NaN will be used.\n *\n * Note: Catch-up mechanism is only applied when playing low latency live streams.\n * @property {number} [playbackBufferMin=0.5]\n * Use this parameter to specify the minimum buffer which is used for LoL+ based playback rate reduction.\n *\n *\n * @property {boolean} [enabled=null]\n * Use this parameter to enable the catchup mode for non low-latency streams.\n *\n * @property {string} [mode=\"liveCatchupModeDefault\"]\n * Use this parameter to switch between different catchup modes.\n *\n * Options: \"liveCatchupModeDefault\" or \"liveCatchupModeLOLP\".\n *\n * Note: Catch-up mechanism is automatically applied when playing low latency live streams.\n */\n\n/**\n * @typedef {Object} RequestTypeSettings\n * @property {number} [MPD]\n * Manifest type of requests.\n * @property {number} [XLinkExpansion]\n * XLink expansion type of requests.\n * @property {number} [InitializationSegment]\n * Request to retrieve an initialization segment.\n * @property {number} [IndexSegment]\n * Request to retrieve an index segment (SegmentBase).\n * @property {number} [MediaSegment]\n * Request to retrieve a media segment (video/audio/image/text chunk).\n * @property {number} [BitstreamSwitchingSegment]\n * Bitrate stream switching type of request.\n * @property {number} [FragmentInfoSegment]\n * Request to retrieve a FragmentInfo segment (specific to Smooth Streaming live streams).\n * @property {number} [other]\n * Other type of request.\n * @property {number} [lowLatencyReductionFactor]\n * For low latency mode, values of type of request are divided by lowLatencyReductionFactor.\n *\n * Note: It's not type of request.\n * @property {number} [lowLatencyMultiplyFactor]\n * For low latency mode, values of type of request are multiplied by lowLatencyMultiplyFactor.\n *\n * Note: It's not type of request.\n */\n\n/**\n * @typedef {Object} Protection\n * @property {boolean} [keepProtectionMediaKeys=false]\n * Set the value for the ProtectionController and MediaKeys life cycle.\n *\n * If true, the ProtectionController and then created MediaKeys and MediaKeySessions will be preserved during the MediaPlayer lifetime.\n * @property {boolean} [ignoreEmeEncryptedEvent=false]\n * If set to true the player will ignore \"encrypted\" and \"needkey\" events thrown by the EME.\n *\n * @property {boolean} [detectPlayreadyMessageFormat=true]\n * If set to true the player will use the raw unwrapped message from the Playready CDM\n */\n\n/**\n * @typedef {Object} Capabilities\n * @property {boolean} [filterUnsupportedEssentialProperties=true]\n * Enable to filter all the AdaptationSets and Representations which contain an unsupported \\<EssentialProperty\\> element.\n * @property {boolean} [useMediaCapabilitiesApi=false]\n * Enable to use the MediaCapabilities API to check whether codecs are supported. If disabled MSE.isTypeSupported will be used instead.\n */\n\n/**\n * @typedef {Object} AbrRulesParameters\n * @property {module:Settings~AbandonRequestRuleParameters} abandonRequestRule\n * Configuration parameters for the AbandonRequestRule\n */\n\n/**\n * @typedef {Object} AbandonRequestRuleParameters\n * @property {number} [graceTimeThreshold=500]\n * Minimum elapsed time in milliseconds that the segment download has to run before the rule considers abandoning the download.\n * @property {number} [abandonMultiplier]\n * This value is multiplied with the segment duration and compared to the estimated time of the download to decide the request should be abandoned.\n * @property {number} [minLengthToAverage]\n * Minimum number of throughput samples required to consider abandoning the download of the segment.\n */\n\n/**\n * @typedef {Object} AbrSettings\n * @property {string} [movingAverageMethod=\"slidingWindow\"]\n * Sets the moving average method used for smoothing throughput estimates.\n *\n * Valid methods are \"slidingWindow\" and \"ewma\".\n *\n * The call has no effect if an invalid method is passed.\n *\n * The sliding window moving average method computes the average throughput using the last four segments downloaded.\n *\n * If the stream is live (as opposed to VOD), then only the last three segments are used.\n *\n * If wide variations in throughput are detected, the number of segments can be dynamically increased to avoid oscillations.\n *\n * The exponentially weighted moving average (EWMA) method computes the average using exponential smoothing.\n *\n * Two separate estimates are maintained, a fast one with a three-second half life and a slow one with an eight-second half life.\n *\n * The throughput estimate at any time is the minimum of the fast and slow estimates.\n *\n * This allows a fast reaction to a bandwidth drop and prevents oscillations on bandwidth spikes.\n * @property {string} [ABRStrategy=\"abrDynamic\"]\n * Returns the current ABR strategy being used: \"abrDynamic\", \"abrBola\" or \"abrThroughput\".\n * @property {object} [trackSwitchMode={video: \"neverReplace\", audio: \"alwaysReplace\"}]\n * @property {object} [additionalAbrRules={insufficientBufferRule: true,switchHistoryRule: true,droppedFramesRule: true,abandonRequestsRule: true}]\n * Enable/Disable additional ABR rules in case ABRStrategy is set to \"abrDynamic\", \"abrBola\" or \"abrThroughput\".\n * @property {module:Settings~AbrRulesParameters} abrRulesParameters Configuration options for the different ABR rules\n * @property {number} [bandwidthSafetyFactor=0.9]\n * Standard ABR throughput rules multiply the throughput by this value.\n *\n * It should be between 0 and 1, with lower values giving less rebuffering (but also lower quality).\n * @property {boolean} [useDefaultABRRules=true]\n * Should the default ABR rules be used, or the custom ones added.\n * @property {boolean} [useDeadTimeLatency=true]\n * If true, only the download portion will be considered part of the download bitrate and latency will be regarded as static.\n *\n * If false, the reciprocal of the whole transfer time will be used.\n * @property {boolean} [limitBitrateByPortal=false]\n * If true, the size of the video portal will limit the max chosen video resolution.\n * @property {boolean} [usePixelRatioInLimitBitrateByPortal=false]\n * Sets whether to take into account the device's pixel ratio when defining the portal dimensions.\n *\n * Useful on, for example, retina displays.\n * @property {module:Settings~AudioVideoSettings} [maxBitrate={audio: -1, video: -1}]\n * The maximum bitrate that the ABR algorithms will choose. This value is specified in kbps.\n *\n * Use -1 for no limit.\n * @property {module:Settings~AudioVideoSettings} [minBitrate={audio: -1, video: -1}]\n * The minimum bitrate that the ABR algorithms will choose. This value is specified in kbps.\n *\n * Use -1 for no limit.\n * @property {module:Settings~AudioVideoSettings} [maxRepresentationRatio={audio: 1, video: 1}]\n * When switching multi-bitrate content (auto or manual mode) this property specifies the maximum representation allowed, as a proportion of the size of the representation set.\n *\n * You can set or remove this cap at anytime before or during playback.\n *\n * To clear this setting you set the value to 1.\n *\n * If both this and maxAllowedBitrate are defined, maxAllowedBitrate is evaluated first, then maxAllowedRepresentation, i.e. the lowest value from executing these rules is used.\n *\n * This feature is typically used to reserve higher representations for playback only when connected over a fast connection.\n * @property {module:Settings~AudioVideoSettings} [initialBitrate={audio: -1, video: -1}]\n * Explicitly set the starting bitrate for audio or video. This value is specified in kbps.\n *\n * Use -1 to let the player decide.\n * @property {module:Settings~AudioVideoSettings} [initialRepresentationRatio={audio: -1, video: -1}]\n * Explicitly set the initial representation ratio.\n *\n * If initalBitrate is specified, this is ignored.\n * @property {module:Settings~AudioVideoSettings} [autoSwitchBitrate={audio: true, video: true}]\n * Indicates whether the player should enable ABR algorithms to switch the bitrate.\n *\n * @property {string} [fetchThroughputCalculationMode=\"abrFetchThroughputCalculationDownloadedData\"]\n * Algorithm to determine the throughput in case the Fetch API is used for low latency streaming.\n *\n * For details please check the samples section and FetchLoader.js.\n */\n\n/**\n * @typedef {Object} module:Settings~CmcdSettings\n * @property {boolean} [enable=false]\n * Enable or disable the CMCD reporting.\n * @property {string} [sid]\n * GUID identifying the current playback session.\n *\n * Should be in UUID format.\n *\n * If not specified a UUID will be automatically generated.\n * @property {string} [cid]\n * A unique string to identify the current content.\n *\n * If not specified it will be a hash of the MPD url.\n * @property {number} [rtp]\n * The requested maximum throughput that the client considers sufficient for delivery of the asset.\n *\n * If not specified this value will be dynamically calculated in the CMCDModel based on the current buffer level.\n * @property {number} [rtpSafetyFactor=5]\n * This value is used as a factor for the rtp value calculation: rtp = minBandwidth * rtpSafetyFactor\n *\n * If not specified this value defaults to 5. Note that this value is only used when no static rtp value is defined.\n * @property {number} [mode=\"query\"]\n * The method to use to attach cmcd metrics to the requests. 'query' to use query parameters, 'header' to use http headers.\n *\n * If not specified this value defaults to 'query'.\n * @property {Array.<string>} [enabledKeys]\n * This value is used to specify the desired CMCD parameters. Parameters not included in this list are not reported.\n */\n\n/**\n * @typedef {Object} module:Settings~CmsdSettings\n * @property {boolean} [enabled=false]\n * Enable or disable the CMSD response headers parsing.\n * @property {module:Settings~CmsdAbrSettings} [abr]\n * Sets additional ABR rules based on CMSD response headers.\n */\n\n/**\n * @typedef {Object} CmsdAbrSettings\n * @property {boolean} [applyMb=false]\n * Set to true if dash.js should apply CMSD maximum suggested bitrate in ABR logic.\n * @property {number} [etpWeightRatio=0]\n * Sets the weight ratio (between 0 and 1) that shall be applied on CMSD estimated throuhgput compared to measured throughput when calculating throughput.\n */\n\n/**\n * @typedef {Object} Metrics\n * @property {number} [metricsMaxListDepth=100]\n * Maximum number of metrics that are persisted per type.\n */\n\n/**\n * @typedef {Object} StreamingSettings\n * @property {number} [abandonLoadTimeout=10000]\n * A timeout value in seconds, which during the ABRController will block switch-up events.\n *\n * This will only take effect after an abandoned fragment event occurs.\n * @property {number} [wallclockTimeUpdateInterval=100]\n * How frequently the wallclockTimeUpdated internal event is triggered (in milliseconds).\n * @property {number} [manifestUpdateRetryInterval=100]\n * For live streams, set the interval-frequency in milliseconds at which dash.js will check if the current manifest is still processed before downloading the next manifest once the minimumUpdatePeriod time has.\n * @property {number} [liveUpdateTimeThresholdInMilliseconds=0]\n * For live streams, postpone syncing time updates until the threshold is passed. Increase if problems occurs during live streams on low end devices.\n * @property {boolean} [cacheInitSegments=false]\n * Enables the caching of init segments to avoid requesting the init segments before each representation switch.\n * @property {boolean} [applyServiceDescription=true]\n * Set to true if dash.js should use the parameters defined in ServiceDescription elements\n * @property {boolean} [applyProducerReferenceTime=true]\n * Set to true if dash.js should use the parameters defined in ProducerReferenceTime elements in combination with ServiceDescription elements.\n * @property {boolean} [applyContentSteering=true]\n * Set to true if dash.js should apply content steering during playback.\n * @property {number} [eventControllerRefreshDelay=100]\n * For multi-period streams, overwrite the manifest mediaPresentationDuration attribute with the sum of period durations if the manifest mediaPresentationDuration is greater than the sum of period durations\n * @property {boolean} [enableManifestDurationMismatchFix=true]\n * Overwrite the manifest segments base information timescale attributes with the timescale set in initialization segments\n * @property {boolean} [enableManifestTimescaleMismatchFix=false]\n * Defines the delay in milliseconds between two consecutive checks for events to be fired.\n * @property {boolean} [parseInbandPrft=false]\n * Set to true if dash.js should parse inband prft boxes (ProducerReferenceTime) and trigger events.\n * @property {module:Settings~Metrics} metrics Metric settings\n * @property {module:Settings~LiveDelay} delay Live Delay settings\n * @property {module:Settings~TimeShiftBuffer} timeShiftBuffer TimeShiftBuffer settings\n * @property {module:Settings~Protection} protection DRM related settings\n * @property {module:Settings~Capabilities} capabilities Capability related settings\n * @property {module:Settings~Buffer} buffer Buffer related settings\n * @property {module:Settings~Gaps} gaps Gap related settings\n * @property {module:Settings~UtcSynchronizationSettings} utcSynchronization Settings related to UTC clock synchronization\n * @property {module:Settings~Scheduling} scheduling Settings related to segment scheduling\n * @property {module:Settings~Text} text Settings related to Subtitles and captions\n * @property {module:Settings~LiveCatchupSettings} liveCatchup Settings related to live catchup.\n * @property {module:Settings~CachingInfoSettings} [lastBitrateCachingInfo={enabled: true, ttl: 360000}]\n * Set to false if you would like to disable the last known bit rate from being stored during playback and used to set the initial bit rate for subsequent playback within the expiration window.\n *\n * The default expiration is one hour, defined in milliseconds.\n *\n * If expired, the default initial bit rate (closest to 1000 kbps) will be used for that session and a new bit rate will be stored during that session.\n * @property {module:Settings~CachingInfoSettings} [lastMediaSettingsCachingInfo={enabled: true, ttl: 360000}]\n * Set to false if you would like to disable the last media settings from being stored to localStorage during playback and used to set the initial track for subsequent playback within the expiration window.\n *\n * The default expiration is one hour, defined in milliseconds.\n * @property {boolean} [saveLastMediaSettingsForCurrentStreamingSession=true]\n * Set to true if dash.js should save media settings from last selected track for incoming track selection during current streaming session.\n * @property {module:Settings~AudioVideoSettings} [cacheLoadThresholds={video: 50, audio: 5}]\n * For a given media type, the threshold which defines if the response to a fragment request is coming from browser cache or not.\n * @property {module:Settings~AudioVideoSettings} [trackSwitchMode={video: \"neverReplace\", audio: \"alwaysReplace\"}]\n * For a given media type defines if existing segments in the buffer should be overwritten once the track is switched. For instance if the user switches the audio language the existing segments in the audio buffer will be replaced when setting this value to \"alwaysReplace\".\n *\n * Possible values\n *\n * - Constants.TRACK_SWITCH_MODE_ALWAYS_REPLACE\n * Replace existing segments in the buffer\n *\n * - Constants.TRACK_SWITCH_MODE_NEVER_REPLACE\n * Do not replace existing segments in the buffer\n *\n * @property {string} [selectionModeForInitialTrack=\"highestSelectionPriority\"]\n * Sets the selection mode for the initial track. This mode defines how the initial track will be selected if no initial media settings are set. If initial media settings are set this parameter will be ignored. Available options are:\n *\n * Possible values\n *\n * - Constants.TRACK_SELECTION_MODE_HIGHEST_SELECTION_PRIORITY\n * This mode makes the player select the track with the highest selectionPriority as defined in the manifest. If not selectionPriority is given we fallback to TRACK_SELECTION_MODE_HIGHEST_BITRATE. This mode is a default mode.\n *\n * - Constants.TRACK_SELECTION_MODE_HIGHEST_BITRATE\n * This mode makes the player select the track with a highest bitrate.\n *\n * - Constants.TRACK_SELECTION_MODE_FIRST_TRACK\n * This mode makes the player select the first track found in the manifest.\n *\n * - Constants.TRACK_SELECTION_MODE_HIGHEST_EFFICIENCY\n * This mode makes the player select the track with the lowest bitrate per pixel average.\n *\n * - Constants.TRACK_SELECTION_MODE_WIDEST_RANGE\n * This mode makes the player select the track with a widest range of bitrates.\n *\n *\n * @property {number} [fragmentRequestTimeout=20000]\n * Time in milliseconds before timing out on loading a media fragment.\n *\n * @property {number} [fragmentRequestProgressTimeout=-1]\n * Time in milliseconds before timing out on loading progress of a media fragment.\n *\n * @property {number} [manifestRequestTimeout=10000]\n * Time in milliseconds before timing out on loading a manifest.\n *\n * Fragments that timeout are retried as if they failed.\n * @property {module:Settings~RequestTypeSettings} [retryIntervals]\n * Time in milliseconds of which to reload a failed file load attempt.\n *\n * For low latency mode these values are divided by lowLatencyReductionFactor.\n * @property {module:Settings~RequestTypeSettings} [retryAttempts]\n * Total number of retry attempts that will occur on a file load before it fails.\n *\n * For low latency mode these values are multiplied by lowLatencyMultiplyFactor.\n * @property {module:Settings~AbrSettings} abr\n * Adaptive Bitrate algorithm related settings.\n * @property {module:Settings~CmcdSettings} cmcd\n * Settings related to Common Media Client Data reporting.\n * @property {module:Settings~CmsdSettings} cmsd\n * Settings related to Common Media Server Data parsing.\n */\n\n\n/**\n * @class\n * @ignore\n */\nfunction Settings() {\n let instance;\n const context = this.context;\n const eventBus = EventBus(context).getInstance();\n const DISPATCH_KEY_MAP = {\n 'streaming.delay.liveDelay': Events.SETTING_UPDATED_LIVE_DELAY,\n 'streaming.delay.liveDelayFragmentCount': Events.SETTING_UPDATED_LIVE_DELAY_FRAGMENT_COUNT,\n 'streaming.liveCatchup.enabled': Events.SETTING_UPDATED_CATCHUP_ENABLED,\n 'streaming.liveCatchup.playbackRate.min': Events.SETTING_UPDATED_PLAYBACK_RATE_MIN,\n 'streaming.liveCatchup.playbackRate.max': Events.SETTING_UPDATED_PLAYBACK_RATE_MAX\n };\n\n\n /**\n * @const {PlayerSettings} defaultSettings\n * @ignore\n */\n const defaultSettings = {\n debug: {\n logLevel: Debug.LOG_LEVEL_WARNING,\n dispatchEvent: false\n },\n streaming: {\n abandonLoadTimeout: 10000,\n wallclockTimeUpdateInterval: 100,\n manifestUpdateRetryInterval: 100,\n liveUpdateTimeThresholdInMilliseconds: 0,\n cacheInitSegments: false,\n applyServiceDescription: true,\n applyProducerReferenceTime: true,\n applyContentSteering: true,\n eventControllerRefreshDelay: 100,\n enableManifestDurationMismatchFix: true,\n parseInbandPrft: false,\n enableManifestTimescaleMismatchFix: false,\n capabilities: {\n filterUnsupportedEssentialProperties: true,\n useMediaCapabilitiesApi: false\n },\n timeShiftBuffer: {\n calcFromSegmentTimeline: false,\n fallbackToSegmentTimeline: true\n },\n metrics: {\n maxListDepth: 100\n },\n delay: {\n liveDelayFragmentCount: NaN,\n liveDelay: NaN,\n useSuggestedPresentationDelay: true\n },\n protection: {\n keepProtectionMediaKeys: false,\n ignoreEmeEncryptedEvent: false,\n detectPlayreadyMessageFormat: true,\n },\n buffer: {\n enableSeekDecorrelationFix: false,\n fastSwitchEnabled: true,\n flushBufferAtTrackSwitch: false,\n reuseExistingSourceBuffers: true,\n bufferPruningInterval: 10,\n bufferToKeep: 20,\n bufferTimeAtTopQuality: 30,\n bufferTimeAtTopQualityLongForm: 60,\n initialBufferLevel: NaN,\n stableBufferTime: 12,\n longFormContentDurationThreshold: 600,\n stallThreshold: 0.3,\n useAppendWindow: true,\n setStallState: true,\n avoidCurrentTimeRangePruning: false,\n useChangeTypeForTrackSwitch: true,\n mediaSourceDurationInfinity: true,\n resetSourceBuffersForTrackSwitch: false\n },\n gaps: {\n jumpGaps: true,\n jumpLargeGaps: true,\n smallGapLimit: 1.5,\n threshold: 0.3,\n enableSeekFix: true,\n enableStallFix: false,\n stallSeek: 0.1\n },\n utcSynchronization: {\n enabled: true,\n useManifestDateHeaderTimeSource: true,\n backgroundAttempts: 2,\n timeBetweenSyncAttempts: 30,\n maximumTimeBetweenSyncAttempts: 600,\n minimumTimeBetweenSyncAttempts: 2,\n timeBetweenSyncAttemptsAdjustmentFactor: 2,\n maximumAllowedDrift: 100,\n enableBackgroundSyncAfterSegmentDownloadError: true,\n defaultTimingSource: {\n scheme: 'urn:mpeg:dash:utc:http-xsdate:2014',\n value: 'https://time.akamai.com/?iso&ms'\n }\n },\n scheduling: {\n defaultTimeout: 500,\n lowLatencyTimeout: 0,\n scheduleWhilePaused: true\n },\n text: {\n defaultEnabled: true,\n dispatchForManualRendering: false,\n extendSegmentedCues: true,\n imsc: {\n displayForcedOnlyMode: false,\n enableRollUp: true\n },\n webvtt: {\n customRenderingEnabled: false\n }\n },\n liveCatchup: {\n maxDrift: NaN,\n playbackRate: {\n min: NaN,\n max: NaN\n },\n playbackBufferMin: 0.5,\n enabled: null,\n mode: Constants.LIVE_CATCHUP_MODE_DEFAULT\n },\n lastBitrateCachingInfo: {\n enabled: true,\n ttl: 360000\n },\n lastMediaSettingsCachingInfo: {\n enabled: true,\n ttl: 360000\n },\n saveLastMediaSettingsForCurrentStreamingSession: true,\n cacheLoadThresholds: {\n video: 50,\n audio: 5\n },\n trackSwitchMode: {\n audio: Constants.TRACK_SWITCH_MODE_ALWAYS_REPLACE,\n video: Constants.TRACK_SWITCH_MODE_NEVER_REPLACE\n },\n selectionModeForInitialTrack: Constants.TRACK_SELECTION_MODE_HIGHEST_SELECTION_PRIORITY,\n fragmentRequestTimeout: 20000,\n fragmentRequestProgressTimeout: -1,\n manifestRequestTimeout: 10000,\n retryIntervals: {\n [HTTPRequest.MPD_TYPE]: 500,\n [HTTPRequest.XLINK_EXPANSION_TYPE]: 500,\n [HTTPRequest.MEDIA_SEGMENT_TYPE]: 1000,\n [HTTPRequest.INIT_SEGMENT_TYPE]: 1000,\n [HTTPRequest.BITSTREAM_SWITCHING_SEGMENT_TYPE]: 1000,\n [HTTPRequest.INDEX_SEGMENT_TYPE]: 1000,\n [HTTPRequest.MSS_FRAGMENT_INFO_SEGMENT_TYPE]: 1000,\n [HTTPRequest.LICENSE]: 1000,\n [HTTPRequest.OTHER_TYPE]: 1000,\n lowLatencyReductionFactor: 10\n },\n retryAttempts: {\n [HTTPRequest.MPD_TYPE]: 3,\n [HTTPRequest.XLINK_EXPANSION_TYPE]: 1,\n [HTTPRequest.MEDIA_SEGMENT_TYPE]: 3,\n [HTTPRequest.INIT_SEGMENT_TYPE]: 3,\n [HTTPRequest.BITSTREAM_SWITCHING_SEGMENT_TYPE]: 3,\n [HTTPRequest.INDEX_SEGMENT_TYPE]: 3,\n [HTTPRequest.MSS_FRAGMENT_INFO_SEGMENT_TYPE]: 3,\n [HTTPRequest.LICENSE]: 3,\n [HTTPRequest.OTHER_TYPE]: 3,\n lowLatencyMultiplyFactor: 5\n },\n abr: {\n movingAverageMethod: Constants.MOVING_AVERAGE_SLIDING_WINDOW,\n ABRStrategy: Constants.ABR_STRATEGY_DYNAMIC,\n additionalAbrRules: {\n insufficientBufferRule: true,\n switchHistoryRule: true,\n droppedFramesRule: true,\n abandonRequestsRule: true\n },\n abrRulesParameters: {\n abandonRequestsRule: {\n graceTimeThreshold: 500,\n abandonMultiplier: 1.8,\n minLengthToAverage: 5\n }\n },\n bandwidthSafetyFactor: 0.9,\n useDefaultABRRules: true,\n useDeadTimeLatency: true,\n limitBitrateByPortal: false,\n usePixelRatioInLimitBitrateByPortal: false,\n maxBitrate: {\n audio: -1,\n video: -1\n },\n minBitrate: {\n audio: -1,\n video: -1\n },\n maxRepresentationRatio: {\n audio: 1,\n video: 1\n },\n initialBitrate: {\n audio: -1,\n video: -1\n },\n initialRepresentationRatio: {\n audio: -1,\n video: -1\n },\n autoSwitchBitrate: {\n audio: true,\n video: true\n },\n fetchThroughputCalculationMode: Constants.ABR_FETCH_THROUGHPUT_CALCULATION_MOOF_PARSING\n },\n cmcd: {\n enabled: false,\n sid: null,\n cid: null,\n rtp: null,\n rtpSafetyFactor: 5,\n mode: Constants.CMCD_MODE_QUERY,\n enabledKeys: ['br', 'd', 'ot', 'tb', 'bl', 'dl', 'mtp', 'nor', 'nrr', 'su', 'bs', 'rtp', 'cid', 'pr', 'sf', 'sid', 'st', 'v']\n },\n cmsd: {\n enabled: false,\n abr: {\n applyMb: false,\n etpWeightRatio: 0\n }\n }\n },\n errors: {\n recoverAttempts: {\n mediaErrorDecode: 5\n }\n }\n };\n\n let settings = Utils.clone(defaultSettings);\n\n //Merge in the settings. If something exists in the new config that doesn't match the schema of the default config,\n //regard it as an error and log it.\n function mixinSettings(source, dest, path) {\n for (let n in source) {\n if (source.hasOwnProperty(n)) {\n if (dest.hasOwnProperty(n)) {\n if (typeof source[n] === 'object' && !(source[n] instanceof Array) && source[n] !== null) {\n mixinSettings(source[n], dest[n], path.slice() + n + '.');\n } else {\n dest[n] = Utils.clone(source[n]);\n if (DISPATCH_KEY_MAP[path + n]) {\n eventBus.trigger(DISPATCH_KEY_MAP[path + n]);\n }\n }\n } else {\n console.error('Settings parameter ' + path + n + ' is not supported');\n }\n }\n }\n }\n\n /**\n * Return the settings object. Don't copy/store this object, you won't get updates.\n * @func\n * @instance\n */\n function get() {\n return settings;\n }\n\n /**\n * @func\n * @instance\n * @param {object} settingsObj - This should be a partial object of the Settings.Schema type. That is, fields defined should match the path (e.g.\n * settingsObj.streaming.abr.autoSwitchBitrate.audio -> defaultSettings.streaming.abr.autoSwitchBitrate.audio). Where an element's path does\n * not match it is ignored, and a warning is logged.\n *\n * Use to change the settings object. Any new values defined will overwrite the settings and anything undefined will not change.\n * Implementers of new settings should add it in an approriate namespace to the defaultSettings object and give it a default value (that is not undefined).\n *\n */\n function update(settingsObj) {\n if (typeof settingsObj === 'object') {\n mixinSettings(settingsObj, settings, '');\n }\n }\n\n /**\n * Resets the settings object. Everything is set to its default value.\n * @func\n * @instance\n *\n */\n function reset() {\n settings = Utils.clone(defaultSettings);\n }\n\n instance = {\n get,\n update,\n reset\n };\n\n return instance;\n}\n\n\nSettings.__dashjs_factory_name = 'Settings';\nlet factory = FactoryMaker.getSingletonFactory(Settings);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n * @class\n * @ignore\n */\n\nimport path from 'path-browserify'\nimport { UAParser } from 'ua-parser-js'\n\nclass Utils {\n static mixin(dest, source, copy) {\n let s;\n let empty = {};\n if (dest) {\n for (let name in source) {\n if (source.hasOwnProperty(name)) {\n s = source[name];\n if (!(name in dest) || (dest[name] !== s && (!(name in empty) || empty[name] !== s))) {\n if (typeof dest[name] === 'object' && dest[name] !== null) {\n dest[name] = Utils.mixin(dest[name], s, copy);\n } else {\n dest[name] = copy(s);\n }\n }\n }\n }\n }\n return dest;\n }\n\n static clone(src) {\n if (!src || typeof src !== 'object') {\n return src; // anything\n }\n let r;\n if (src instanceof Array) {\n // array\n r = [];\n for (let i = 0, l = src.length; i < l; ++i) {\n if (i in src) {\n r.push(Utils.clone(src[i]));\n }\n }\n } else {\n r = {};\n }\n return Utils.mixin(r, src, Utils.clone);\n }\n\n static addAditionalQueryParameterToUrl(url, params) {\n try {\n if (!params || params.length === 0) {\n return url;\n }\n\n let modifiedUrl = new URL(url);\n\n params.forEach((param) => {\n if (param.key && param.value) {\n modifiedUrl.searchParams.set(param.key, param.value);\n }\n });\n\n return modifiedUrl.href;\n\n\n } catch (e) {\n return url;\n }\n }\n\n static parseHttpHeaders(headerStr) {\n let headers = {};\n if (!headerStr) {\n return headers;\n }\n\n // Trim headerStr to fix a MS Edge bug with xhr.getAllResponseHeaders method\n // which send a string starting with a \"\\n\" character\n let headerPairs = headerStr.trim().split('\\u000d\\u000a');\n for (let i = 0, ilen = headerPairs.length; i < ilen; i++) {\n let headerPair = headerPairs[i];\n let index = headerPair.indexOf('\\u003a\\u0020');\n if (index > 0) {\n headers[headerPair.substring(0, index)] = headerPair.substring(index + 2);\n }\n }\n return headers;\n }\n\n static generateUuid() {\n let dt = new Date().getTime();\n const uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n const r = (dt + Math.random() * 16) % 16 | 0;\n dt = Math.floor(dt / 16);\n return (c == 'x' ? r : (r & 0x3 | 0x8)).toString(16);\n });\n return uuid;\n }\n\n static generateHashCode(string) {\n let hash = 0;\n\n if (string.length === 0) {\n return hash;\n }\n\n for (let i = 0; i < string.length; i++) {\n const chr = string.charCodeAt(i);\n hash = ((hash << 5) - hash) + chr;\n hash |= 0;\n }\n return hash;\n }\n\n /**\n * Compares both urls and returns a relative url (target relative to original)\n * @param {string} originalUrl\n * @param {string} targetUrl\n * @return {string|*}\n */\n static getRelativeUrl(originalUrl, targetUrl) {\n try {\n const original = new URL(originalUrl);\n const target = new URL(targetUrl);\n\n // Unify the protocol to compare the origins\n original.protocol = target.protocol;\n if (original.origin !== target.origin) {\n return targetUrl;\n }\n\n // Use the relative path implementation of the path library. We need to cut off the actual filename in the end to get the relative path\n let relativePath = path.relative(original.pathname.substr(0, original.pathname.lastIndexOf('/')), target.pathname.substr(0, target.pathname.lastIndexOf('/')));\n\n // In case the relative path is empty (both path are equal) return the filename only. Otherwise add a slash in front of the filename\n const startIndexOffset = relativePath.length === 0 ? 1 : 0;\n relativePath += target.pathname.substr(target.pathname.lastIndexOf('/') + startIndexOffset, target.pathname.length - 1);\n\n // Build the other candidate, e.g. the 'host relative' path that starts with \"/\", and return the shortest of the two candidates.\n if (target.pathname.length < relativePath.length) {\n return target.pathname;\n }\n return relativePath;\n } catch (e) {\n return targetUrl\n }\n }\n\n static parseUserAgent(ua = null) {\n try {\n const uaString = ua === null ? typeof navigator !== 'undefined' ? navigator.userAgent.toLowerCase() : '' : '';\n\n return UAParser(uaString);\n }\n catch(e) {\n return {};\n }\n }\n\n /**\n * Checks for existence of \"http\" or \"https\" in a string\n * @param string\n * @returns {boolean}\n */\n static stringHasProtocol(string) {\n return (/(http(s?)):\\/\\//i.test(string))\n }\n}\n\nexport default Utils;\n","const VERSION = '__VERSION__';\nexport function getVersionString() {\n return VERSION;\n}\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass ErrorsBase {\n extend (errors, config) {\n if (!errors) return;\n\n let override = config ? config.override : false;\n let publicOnly = config ? config.publicOnly : false;\n\n\n for (const err in errors) {\n if (!errors.hasOwnProperty(err) || (this[err] && !override)) continue;\n if (publicOnly && errors[err].indexOf('public_') === -1) continue;\n this[err] = errors[err];\n\n }\n }\n}\n\nexport default ErrorsBase;","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport EventsBase from './EventsBase';\n\n/**\n * These are internal events that should not be needed at the player level.\n * If you find and event in here that you would like access to from MediaPlayer level\n * please add an issue at https://github.com/Dash-Industry-Forum/dash.js/issues/new\n * @class\n * @ignore\n */\nclass CoreEvents extends EventsBase {\n constructor () {\n super();\n this.ATTEMPT_BACKGROUND_SYNC = 'attemptBackgroundSync';\n this.BUFFERING_COMPLETED = 'bufferingCompleted';\n this.BUFFER_CLEARED = 'bufferCleared';\n this.BYTES_APPENDED_END_FRAGMENT = 'bytesAppendedEndFragment';\n this.BUFFER_REPLACEMENT_STARTED = 'bufferReplacementStarted';\n this.CHECK_FOR_EXISTENCE_COMPLETED = 'checkForExistenceCompleted';\n this.CMSD_STATIC_HEADER = 'cmsdStaticHeader';\n this.CURRENT_TRACK_CHANGED = 'currentTrackChanged';\n this.DATA_UPDATE_COMPLETED = 'dataUpdateCompleted';\n this.INBAND_EVENTS = 'inbandEvents';\n this.INITIAL_STREAM_SWITCH = 'initialStreamSwitch';\n this.INIT_FRAGMENT_LOADED = 'initFragmentLoaded';\n this.INIT_FRAGMENT_NEEDED = 'initFragmentNeeded';\n this.INTERNAL_MANIFEST_LOADED = 'internalManifestLoaded';\n this.ORIGINAL_MANIFEST_LOADED = 'originalManifestLoaded';\n this.LOADING_COMPLETED = 'loadingCompleted';\n this.LOADING_PROGRESS = 'loadingProgress';\n this.LOADING_DATA_PROGRESS = 'loadingDataProgress';\n this.LOADING_ABANDONED = 'loadingAborted';\n this.MANIFEST_UPDATED = 'manifestUpdated';\n this.MEDIA_FRAGMENT_LOADED = 'mediaFragmentLoaded';\n this.MEDIA_FRAGMENT_NEEDED = 'mediaFragmentNeeded';\n this.QUOTA_EXCEEDED = 'quotaExceeded';\n this.SEGMENT_LOCATION_BLACKLIST_ADD = 'segmentLocationBlacklistAdd';\n this.SEGMENT_LOCATION_BLACKLIST_CHANGED = 'segmentLocationBlacklistChanged';\n this.SERVICE_LOCATION_BASE_URL_BLACKLIST_ADD = 'serviceLocationBlacklistAdd';\n this.SERVICE_LOCATION_BASE_URL_BLACKLIST_CHANGED = 'serviceLocationBlacklistChanged';\n this.SERVICE_LOCATION_LOCATION_BLACKLIST_ADD = 'serviceLocationLocationBlacklistAdd';\n this.SERVICE_LOCATION_LOCATION_BLACKLIST_CHANGED = 'serviceLocationLocationBlacklistChanged';\n this.SET_FRAGMENTED_TEXT_AFTER_DISABLED = 'setFragmentedTextAfterDisabled';\n this.SET_NON_FRAGMENTED_TEXT = 'setNonFragmentedText';\n this.SOURCE_BUFFER_ERROR = 'sourceBufferError';\n this.STREAMS_COMPOSED = 'streamsComposed';\n this.STREAM_BUFFERING_COMPLETED = 'streamBufferingCompleted';\n this.STREAM_REQUESTING_COMPLETED = 'streamRequestingCompleted';\n this.TEXT_TRACKS_QUEUE_INITIALIZED = 'textTracksQueueInitialized';\n this.TIME_SYNCHRONIZATION_COMPLETED = 'timeSynchronizationComplete';\n this.UPDATE_TIME_SYNC_OFFSET = 'updateTimeSyncOffset';\n this.URL_RESOLUTION_FAILED = 'urlResolutionFailed';\n this.VIDEO_CHUNK_RECEIVED = 'videoChunkReceived';\n this.WALLCLOCK_TIME_UPDATED = 'wallclockTimeUpdated';\n this.XLINK_ELEMENT_LOADED = 'xlinkElementLoaded';\n this.XLINK_READY = 'xlinkReady';\n this.SEEK_TARGET = 'seekTarget';\n this.SETTING_UPDATED_LIVE_DELAY = 'settingUpdatedLiveDelay';\n this.SETTING_UPDATED_LIVE_DELAY_FRAGMENT_COUNT = 'settingUpdatedLiveDelayFragmentCount';\n this.SETTING_UPDATED_CATCHUP_ENABLED = 'settingUpdatedCatchupEnabled';\n this.SETTING_UPDATED_PLAYBACK_RATE_MIN = 'settingUpdatedPlaybackRateMin';\n this.SETTING_UPDATED_PLAYBACK_RATE_MAX = 'settingUpdatedPlaybackRateMax';\n }\n}\n\nexport default CoreEvents;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nimport CoreEvents from './CoreEvents';\nclass Events extends CoreEvents {\n}\nlet events = new Events();\nexport default events;","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass EventsBase {\n extend (events, config) {\n if (!events) return;\n\n let override = config ? config.override : false;\n let publicOnly = config ? config.publicOnly : false;\n\n\n for (const evt in events) {\n if (!events.hasOwnProperty(evt) || (this[evt] && !override)) continue;\n if (publicOnly && events[evt].indexOf('public_') === -1) continue;\n this[evt] = events[evt];\n\n }\n }\n}\n\nexport default EventsBase;","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport FragmentRequest from '../streaming/vo/FragmentRequest';\nimport {HTTPRequest} from '../streaming/vo/metrics/HTTPRequest';\nimport FactoryMaker from '../core/FactoryMaker';\nimport MediaPlayerEvents from '../streaming/MediaPlayerEvents';\nimport {\n replaceIDForTemplate,\n replaceTokenForTemplate,\n unescapeDollarsInTemplate\n} from './utils/SegmentsUtils';\nimport DashConstants from './constants/DashConstants';\n\n\nconst DEFAULT_ADJUST_SEEK_TIME_THRESHOLD = 0.5;\nconst SEGMENT_START_TIME_DELTA = 0.001;\n\nfunction DashHandler(config) {\n\n config = config || {};\n\n const eventBus = config.eventBus;\n const debug = config.debug;\n const urlUtils = config.urlUtils;\n const type = config.type;\n const streamInfo = config.streamInfo;\n const segmentsController = config.segmentsController;\n const timelineConverter = config.timelineConverter;\n const baseURLController = config.baseURLController;\n\n let instance,\n logger,\n lastSegment,\n isDynamicManifest,\n mediaHasFinished;\n\n function setup() {\n logger = debug.getLogger(instance);\n resetInitialSettings();\n\n eventBus.on(MediaPlayerEvents.DYNAMIC_TO_STATIC, _onDynamicToStatic, instance);\n }\n\n function initialize(isDynamic) {\n isDynamicManifest = isDynamic;\n mediaHasFinished = false;\n segmentsController.initialize(isDynamic);\n }\n\n function getStreamId() {\n return streamInfo.id;\n }\n\n function getType() {\n return type;\n }\n\n function getStreamInfo() {\n return streamInfo;\n }\n\n function resetInitialSettings() {\n lastSegment = null;\n }\n\n function reset() {\n resetInitialSettings();\n eventBus.off(MediaPlayerEvents.DYNAMIC_TO_STATIC, _onDynamicToStatic, instance);\n }\n\n function _setRequestUrl(request, destination, representation) {\n const baseURL = baseURLController.resolve(representation.path);\n let url,\n serviceLocation,\n queryParams = {};\n\n if (!baseURL || (destination === baseURL.url) || (!urlUtils.isRelative(destination))) {\n url = destination;\n } else {\n url = baseURL.url;\n serviceLocation = baseURL.serviceLocation;\n queryParams = baseURL.queryParams;\n\n if (destination) {\n url = urlUtils.resolve(destination, url);\n }\n }\n\n if (urlUtils.isRelative(url)) {\n return false;\n }\n\n request.url = url;\n request.serviceLocation = serviceLocation;\n request.queryParams = queryParams;\n\n return true;\n }\n\n function getInitRequest(mediaInfo, representation) {\n if (!representation) return null;\n return _generateInitRequest(mediaInfo, representation, getType());\n }\n\n function _generateInitRequest(mediaInfo, representation, mediaType) {\n const request = new FragmentRequest();\n const period = representation.adaptation.period;\n const presentationStartTime = period.start;\n\n request.mediaType = mediaType;\n request.type = HTTPRequest.INIT_SEGMENT_TYPE;\n request.range = representation.range;\n request.availabilityStartTime = timelineConverter.calcAvailabilityStartTimeFromPresentationTime(presentationStartTime, representation, isDynamicManifest);\n request.availabilityEndTime = timelineConverter.calcAvailabilityEndTimeFromPresentationTime(presentationStartTime + period.duration, representation, isDynamicManifest);\n request.quality = representation.index;\n request.mediaInfo = mediaInfo;\n request.representationId = representation.id;\n\n if (_setRequestUrl(request, representation.initialization, representation)) {\n request.url = replaceTokenForTemplate(request.url, 'Bandwidth', representation.bandwidth);\n return request;\n }\n }\n\n function _getRequestForSegment(mediaInfo, segment) {\n if (segment === null || segment === undefined) {\n return null;\n }\n\n const request = new FragmentRequest();\n const representation = segment.representation;\n const bandwidth = representation.adaptation.period.mpd.manifest.Period_asArray[representation.adaptation.period.index].AdaptationSet_asArray[representation.adaptation.index].Representation_asArray[representation.index].bandwidth;\n let url = segment.media;\n\n url = replaceTokenForTemplate(url, 'Number', segment.replacementNumber);\n url = replaceTokenForTemplate(url, 'Time', segment.replacementTime);\n url = replaceTokenForTemplate(url, 'Bandwidth', bandwidth);\n url = replaceIDForTemplate(url, representation.id);\n url = unescapeDollarsInTemplate(url);\n\n request.mediaType = getType();\n request.type = HTTPRequest.MEDIA_SEGMENT_TYPE;\n request.range = segment.mediaRange;\n request.startTime = segment.presentationStartTime;\n request.mediaStartTime = segment.mediaStartTime;\n request.duration = segment.duration;\n request.timescale = representation.timescale;\n request.availabilityStartTime = segment.availabilityStartTime;\n request.availabilityEndTime = segment.availabilityEndTime;\n request.availabilityTimeComplete = representation.availabilityTimeComplete;\n request.wallStartTime = segment.wallStartTime;\n request.quality = representation.index;\n request.index = segment.index;\n request.mediaInfo = mediaInfo;\n request.adaptationIndex = representation.adaptation.index;\n request.representationId = representation.id;\n\n if (_setRequestUrl(request, url, representation)) {\n return request;\n }\n }\n\n function isLastSegmentRequested(representation, bufferingTime) {\n if (!representation || !lastSegment) {\n return false;\n }\n\n // Either transition from dynamic to static was done or no next static segment found\n if (mediaHasFinished) {\n return true;\n }\n\n // Period is endless\n if (!isFinite(representation.adaptation.period.duration)) {\n return false;\n }\n\n // we are replacing existing stuff in the buffer for instance after a track switch\n if (lastSegment.presentationStartTime + lastSegment.duration > bufferingTime) {\n return false;\n }\n\n // Additional segment references may be added to the last period.\n // Additional periods may be added to the end of the MPD.\n // Segment references SHALL NOT be added to any period other than the last period.\n // An MPD update MAY combine adding segment references to the last period with adding of new periods. An MPD update that adds content MAY be combined with an MPD update that removes content.\n // The index of the last requested segment is higher than the number of available segments.\n // For SegmentTimeline and SegmentTemplate the index does not include the startNumber.\n // For SegmentList the index includes the startnumber which is why the numberOfSegments includes this as well\n if (representation.mediaFinishedInformation && !isNaN(representation.mediaFinishedInformation.numberOfSegments) && !isNaN(lastSegment.index) && lastSegment.index >= (representation.mediaFinishedInformation.numberOfSegments - 1)) {\n // For static manifests and Template addressing we can compare the index against the number of available segments\n if (!isDynamicManifest || representation.segmentInfoType === DashConstants.SEGMENT_TEMPLATE) {\n return true;\n }\n // For SegmentList we need to check if the next period is signaled\n else if (isDynamicManifest && representation.segmentInfoType === DashConstants.SEGMENT_LIST && representation.adaptation.period.nextPeriodId) {\n return true\n }\n }\n\n // For dynamic SegmentTimeline manifests we need to check if the next period is already signaled and the segment we fetched before is the last one that is signaled.\n // We can not simply use the index, as numberOfSegments might have decreased after an MPD update\n return !!(isDynamicManifest && representation.adaptation.period.nextPeriodId && representation.segmentInfoType === DashConstants.SEGMENT_TIMELINE && representation.mediaFinishedInformation &&\n !isNaN(representation.mediaFinishedInformation.mediaTimeOfLastSignaledSegment) && lastSegment && !isNaN(lastSegment.mediaStartTime) && !isNaN(lastSegment.duration) && lastSegment.mediaStartTime + lastSegment.duration >= (representation.mediaFinishedInformation.mediaTimeOfLastSignaledSegment - 0.05));\n }\n\n\n function getSegmentRequestForTime(mediaInfo, representation, time) {\n let request = null;\n\n if (!representation || !representation.segmentInfoType) {\n return request;\n }\n\n const segment = segmentsController.getSegmentByTime(representation, time);\n if (segment) {\n lastSegment = segment;\n logger.debug('Index for time ' + time + ' is ' + segment.index);\n request = _getRequestForSegment(mediaInfo, segment);\n }\n\n return request;\n }\n\n /**\n * This function returns the next segment request without modifying any internal variables. Any class (e.g CMCD Model) that needs information about the upcoming request should use this method.\n * @param {object} mediaInfo\n * @param {object} representation\n * @return {FragmentRequest|null}\n */\n function getNextSegmentRequestIdempotent(mediaInfo, representation) {\n let request = null;\n let indexToRequest = lastSegment ? lastSegment.index + 1 : 0;\n const segment = segmentsController.getSegmentByIndex(\n representation,\n indexToRequest,\n lastSegment ? lastSegment.mediaStartTime : -1\n );\n if (!segment) return null;\n request = _getRequestForSegment(mediaInfo, segment);\n return request;\n }\n\n /**\n * Main function to get the next segment request.\n * @param {object} mediaInfo\n * @param {object} representation\n * @return {FragmentRequest|null}\n */\n function getNextSegmentRequest(mediaInfo, representation) {\n if (!representation || !representation.segmentInfoType) {\n return null;\n }\n\n let indexToRequest = lastSegment ? lastSegment.index + 1 : 0;\n\n return _getRequest(mediaInfo, representation, indexToRequest);\n }\n\n function repeatSegmentRequest(mediaInfo, representation) {\n if (!representation || !representation.segmentInfoType) {\n return null;\n }\n\n let indexToRequest = lastSegment ? lastSegment.index : 0;\n\n return _getRequest(mediaInfo, representation, indexToRequest);\n }\n\n function _getRequest(mediaInfo, representation, indexToRequest) {\n let request = null;\n const segment = segmentsController.getSegmentByIndex(representation, indexToRequest, lastSegment ? lastSegment.mediaStartTime : -1);\n\n // No segment found\n if (!segment) {\n // Dynamic manifest there might be something available in the next iteration\n if (isDynamicManifest && !mediaHasFinished) {\n logger.debug(getType() + ' No segment found at index: ' + indexToRequest + '. Wait for next loop');\n return null;\n } else {\n mediaHasFinished = true;\n }\n } else {\n request = _getRequestForSegment(mediaInfo, segment);\n lastSegment = segment;\n }\n\n return request;\n }\n\n /**\n * This function returns a time larger than the current time for which we can generate a request.\n * This is useful in scenarios in which the user seeks into a gap in a dynamic Timeline manifest. We will not find a valid request then and need to adjust the seektime.\n * @param {number} time\n * @param {object} mediaInfo\n * @param {object} representation\n * @param {number} targetThreshold\n * @return {number}\n */\n function getValidTimeAheadOfTargetTime(time, mediaInfo, representation, targetThreshold) {\n try {\n\n if (isNaN(time) || !mediaInfo || !representation) {\n return NaN;\n }\n\n if (time < 0) {\n time = 0;\n }\n\n if (isNaN(targetThreshold)) {\n targetThreshold = DEFAULT_ADJUST_SEEK_TIME_THRESHOLD;\n }\n\n if (getSegmentRequestForTime(mediaInfo, representation, time)) {\n return time;\n }\n\n if (representation.adaptation.period.start + representation.adaptation.period.duration < time) {\n return NaN;\n }\n\n // If we have a duration look until the end of the duration, otherwise maximum 30 seconds\n const end = isFinite(representation.adaptation.period.duration) ? representation.adaptation.period.start + representation.adaptation.period.duration : time + 30;\n let currentUpperTime = Math.min(time + targetThreshold, end);\n let adjustedTime = NaN;\n let targetRequest = null;\n\n while (currentUpperTime <= end) {\n let upperRequest = null;\n\n if (currentUpperTime <= end) {\n upperRequest = getSegmentRequestForTime(mediaInfo, representation, currentUpperTime);\n }\n\n if (upperRequest) {\n adjustedTime = currentUpperTime;\n targetRequest = upperRequest;\n break;\n }\n\n currentUpperTime += targetThreshold;\n }\n\n if (targetRequest) {\n const requestEndTime = targetRequest.startTime + targetRequest.duration;\n\n // Keep the original start time in case it is covered by a segment\n if (time > targetRequest.startTime && requestEndTime - time > targetThreshold) {\n return time;\n }\n\n if (!isNaN(targetRequest.startTime) && time < targetRequest.startTime && adjustedTime > targetRequest.startTime) {\n // Apply delta to segment start time to get around rounding issues\n return targetRequest.startTime + SEGMENT_START_TIME_DELTA;\n }\n\n return Math.min(requestEndTime - targetThreshold, adjustedTime);\n }\n\n return adjustedTime;\n\n\n } catch (e) {\n return NaN;\n }\n }\n\n function getCurrentIndex() {\n return lastSegment ? lastSegment.index : -1;\n }\n\n function _onDynamicToStatic() {\n logger.debug('Dynamic stream complete');\n mediaHasFinished = true;\n }\n\n instance = {\n getCurrentIndex,\n getInitRequest,\n getNextSegmentRequest,\n getNextSegmentRequestIdempotent,\n getSegmentRequestForTime,\n getStreamId,\n getStreamInfo,\n getType,\n getValidTimeAheadOfTargetTime,\n initialize,\n isLastSegmentRequested,\n repeatSegmentRequest,\n reset,\n };\n\n setup();\n\n return instance;\n}\n\nDashHandler.__dashjs_factory_name = 'DashHandler';\nexport default FactoryMaker.getClassFactory(DashHandler);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n * Dash constants declaration\n * @class\n * @ignore\n */\nclass DashConstants {\n\n init() {\n this.BASE_URL = 'BaseURL';\n this.SEGMENT_BASE = 'SegmentBase';\n this.SEGMENT_TEMPLATE = 'SegmentTemplate';\n this.SEGMENT_LIST = 'SegmentList';\n this.SEGMENT_URL = 'SegmentURL';\n this.SEGMENT_TIMELINE = 'SegmentTimeline';\n this.SEGMENT_PROFILES = 'segmentProfiles';\n this.ADAPTATION_SET = 'AdaptationSet';\n this.REPRESENTATION = 'Representation';\n this.REPRESENTATION_INDEX = 'RepresentationIndex';\n this.SUB_REPRESENTATION = 'SubRepresentation';\n this.INITIALIZATION = 'Initialization';\n this.INITIALIZATION_MINUS = 'initialization';\n this.MPD = 'MPD';\n this.PERIOD = 'Period';\n this.ASSET_IDENTIFIER = 'AssetIdentifier';\n this.EVENT_STREAM = 'EventStream';\n this.ID = 'id';\n this.PROFILES = 'profiles';\n this.SERVICE_LOCATION = 'serviceLocation';\n this.RANGE = 'range';\n this.INDEX = 'index';\n this.MEDIA = 'media';\n this.BYTE_RANGE = 'byteRange';\n this.INDEX_RANGE = 'indexRange';\n this.MEDIA_RANGE = 'mediaRange';\n this.VALUE = 'value';\n this.CONTENT_TYPE = 'contentType';\n this.MIME_TYPE = 'mimeType';\n this.BITSTREAM_SWITCHING = 'BitstreamSwitching';\n this.BITSTREAM_SWITCHING_MINUS = 'bitstreamSwitching';\n this.CODECS = 'codecs';\n this.DEPENDENCY_ID = 'dependencyId';\n this.MEDIA_STREAM_STRUCTURE_ID = 'mediaStreamStructureId';\n this.METRICS = 'Metrics';\n this.METRICS_MINUS = 'metrics';\n this.REPORTING = 'Reporting';\n this.WIDTH = 'width';\n this.HEIGHT = 'height';\n this.SAR = 'sar';\n this.FRAMERATE = 'frameRate';\n this.AUDIO_SAMPLING_RATE = 'audioSamplingRate';\n this.MAXIMUM_SAP_PERIOD = 'maximumSAPPeriod';\n this.START_WITH_SAP = 'startWithSAP';\n this.MAX_PLAYOUT_RATE = 'maxPlayoutRate';\n this.CODING_DEPENDENCY = 'codingDependency';\n this.SCAN_TYPE = 'scanType';\n this.FRAME_PACKING = 'FramePacking';\n this.AUDIO_CHANNEL_CONFIGURATION = 'AudioChannelConfiguration';\n this.CONTENT_PROTECTION = 'ContentProtection';\n this.ESSENTIAL_PROPERTY = 'EssentialProperty';\n this.ESSENTIAL_PROPERTY_ASARRAY = 'EssentialProperty_asArray';\n this.SUPPLEMENTAL_PROPERTY = 'SupplementalProperty';\n this.SUPPLEMENTAL_PROPERTY_ASARRAY = 'SupplementalProperty_asArray';\n this.INBAND_EVENT_STREAM = 'InbandEventStream';\n this.PRODUCER_REFERENCE_TIME = 'ProducerReferenceTime';\n this.INBAND = 'inband';\n this.TYPE = 'type';\n this.ACCESSIBILITY = 'Accessibility';\n this.ROLE = 'Role';\n this.RATING = 'Rating';\n this.CONTENT_COMPONENT = 'ContentComponent';\n this.SUBSET = 'Subset';\n this.LANG = 'lang';\n this.VIEWPOINT = 'Viewpoint';\n this.VIEWPOINT_ASARRAY = 'Viewpoint_asArray';\n this.ROLE_ASARRAY = 'Role_asArray';\n this.REPRESENTATION_ASARRAY = 'Representation_asArray';\n this.PRODUCERREFERENCETIME_ASARRAY = 'ProducerReferenceTime_asArray';\n this.ACCESSIBILITY_ASARRAY = 'Accessibility_asArray';\n this.AUDIOCHANNELCONFIGURATION_ASARRAY = 'AudioChannelConfiguration_asArray';\n this.CONTENTPROTECTION_ASARRAY = 'ContentProtection_asArray';\n this.MAIN = 'main';\n this.DYNAMIC = 'dynamic';\n this.STATIC = 'static';\n this.MEDIA_PRESENTATION_DURATION = 'mediaPresentationDuration';\n this.MINIMUM_UPDATE_PERIOD = 'minimumUpdatePeriod';\n this.CODEC_PRIVATE_DATA = 'codecPrivateData';\n this.BANDWITH = 'bandwidth';\n this.SOURCE_URL = 'sourceURL';\n this.TIMESCALE = 'timescale';\n this.DURATION = 'duration';\n this.START_NUMBER = 'startNumber';\n this.PRESENTATION_TIME_OFFSET = 'presentationTimeOffset';\n this.AVAILABILITY_START_TIME = 'availabilityStartTime';\n this.AVAILABILITY_END_TIME = 'availabilityEndTime';\n this.TIMESHIFT_BUFFER_DEPTH = 'timeShiftBufferDepth';\n this.MAX_SEGMENT_DURATION = 'maxSegmentDuration';\n this.PRESENTATION_TIME = 'presentationTime';\n this.MIN_BUFFER_TIME = 'minBufferTime';\n this.MAX_SUBSEGMENT_DURATION = 'maxSubsegmentDuration';\n this.START = 'start';\n this.AVAILABILITY_TIME_OFFSET = 'availabilityTimeOffset';\n this.AVAILABILITY_TIME_COMPLETE = 'availabilityTimeComplete';\n this.CENC_DEFAULT_KID = 'cenc:default_KID';\n this.DVB_PRIORITY = 'dvb:priority';\n this.DVB_WEIGHT = 'dvb:weight';\n this.DVB_URL = 'dvb:url';\n this.DVB_MIMETYPE = 'dvb:mimeType';\n this.DVB_FONTFAMILY = 'dvb:fontFamily';\n this.SUGGESTED_PRESENTATION_DELAY = 'suggestedPresentationDelay';\n this.SERVICE_DESCRIPTION = 'ServiceDescription';\n this.SERVICE_DESCRIPTION_SCOPE = 'Scope';\n this.SERVICE_DESCRIPTION_LATENCY = 'Latency';\n this.SERVICE_DESCRIPTION_PLAYBACK_RATE = 'PlaybackRate';\n this.SERVICE_DESCRIPTION_OPERATING_QUALITY = 'OperatingQuality';\n this.SERVICE_DESCRIPTION_OPERATING_BANDWIDTH = 'OperatingBandwidth';\n this.PATCH_LOCATION = 'PatchLocation';\n this.PATCH_LOCATION_AS_ARRAY = 'PatchLocation_asArray';\n this.LOCATION = 'Location';\n this.LOCATION_AS_ARRAY = 'Location_asArray';\n this.PUBLISH_TIME = 'publishTime';\n this.ORIGINAL_PUBLISH_TIME = 'originalPublishTime';\n this.ORIGINAL_MPD_ID = 'mpdId';\n this.WALL_CLOCK_TIME = 'wallClockTime';\n this.PRESENTATION_TIME = 'presentationTime';\n this.LABEL = 'Label';\n this.GROUP_LABEL = 'GroupLabel';\n this.CONTENT_STEERING = 'ContentSteering';\n this.CONTENT_STEERING_AS_ARRAY = 'ContentSteering_asArray';\n this.DEFAULT_SERVICE_LOCATION = 'defaultServiceLocation';\n this.QUERY_BEFORE_START = 'queryBeforeStart';\n this.CLIENT_REQUIREMENT = 'clientRequirement';\n this.TTL = 'ttl';\n this.CONTENT_STEERING_RESPONSE = {\n VERSION: 'VERSION',\n TTL: 'TTL',\n RELOAD_URI: 'RELOAD-URI',\n PATHWAY_PRIORITY : 'PATHWAY-PRIORITY',\n PATHWAY_CLONES : 'PATHWAY-CLONES',\n BASE_ID: 'BASE-ID',\n ID: 'ID',\n URI_REPLACEMENT: 'URI-REPLACEMENT',\n HOST: 'HOST',\n PARAMS: 'PARAMS'\n };\n this.PRODUCER_REFERENCE_TIME_TYPE = {\n ENCODER: 'encoder',\n CAPTURED: 'captured',\n APPLICATION: 'application'\n }\n this.SEGMENT_ALIGNMENT = 'segmentAlignment';\n this.SUB_SEGMENT_ALIGNMENT = 'subsegmentAlignment'\n }\n\n constructor () {\n this.init();\n }\n}\n\nlet constants = new DashConstants();\nexport default constants;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport FactoryMaker from '../../core/FactoryMaker';\nimport TimelineSegmentsGetter from '../utils/TimelineSegmentsGetter';\nimport TemplateSegmentsGetter from '../utils/TemplateSegmentsGetter';\nimport ListSegmentsGetter from '../utils/ListSegmentsGetter';\nimport SegmentBaseGetter from '../utils/SegmentBaseGetter';\n\nfunction SegmentsController(config) {\n config = config || {};\n\n const context = this.context;\n const dashConstants = config.dashConstants;\n const type = config.type;\n const segmentBaseController = config.segmentBaseController;\n\n let instance,\n getters;\n\n function setup() {\n getters = {};\n }\n\n function initialize(isDynamic) {\n getters[dashConstants.SEGMENT_TIMELINE] = TimelineSegmentsGetter(context).create(config, isDynamic);\n getters[dashConstants.SEGMENT_TEMPLATE] = TemplateSegmentsGetter(context).create(config, isDynamic);\n getters[dashConstants.SEGMENT_LIST] = ListSegmentsGetter(context).create(config, isDynamic);\n getters[dashConstants.SEGMENT_BASE] = SegmentBaseGetter(context).create(config, isDynamic);\n }\n\n function updateInitData(voRepresentation, hasInitialization) {\n if (hasInitialization) {\n return Promise.resolve();\n }\n return segmentBaseController.getSegmentBaseInitSegment({\n representation: voRepresentation,\n mediaType: type\n });\n }\n\n function updateSegmentData(voRepresentation, hasSegments) {\n if (hasSegments) {\n return Promise.resolve();\n }\n return segmentBaseController.getSegmentList({\n mimeType: voRepresentation.mimeType,\n representation: voRepresentation,\n mediaType: type\n });\n }\n\n function getSegmentsGetter(representation) {\n return representation ? representation.segments ? getters[dashConstants.SEGMENT_BASE] : getters[representation.segmentInfoType] : null;\n }\n\n function getSegmentByIndex(representation, index, lastSegmentTime) {\n const getter = getSegmentsGetter(representation);\n return getter ? getter.getSegmentByIndex(representation, index, lastSegmentTime) : null;\n }\n\n function getSegmentByTime(representation, time) {\n const getter = getSegmentsGetter(representation);\n return getter ? getter.getSegmentByTime(representation, time) : null;\n }\n\n function getMediaFinishedInformation(representation) {\n const getter = getSegmentsGetter(representation);\n return getter ? getter.getMediaFinishedInformation(representation) : {\n numberOfSegments: 0,\n mediaTimeOfLastSignaledSegment: NaN\n };\n }\n\n instance = {\n initialize,\n updateInitData,\n updateSegmentData,\n getSegmentByIndex,\n getSegmentByTime,\n getMediaFinishedInformation\n };\n\n setup();\n\n return instance;\n}\n\nSegmentsController.__dashjs_factory_name = 'SegmentsController';\nconst factory = FactoryMaker.getClassFactory(SegmentsController);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport FactoryMaker from '../../core/FactoryMaker';\nimport Constants from '../../streaming/constants/Constants';\n\nimport {getIndexBasedSegment} from './SegmentsUtils';\n\nfunction ListSegmentsGetter(config, isDynamic) {\n\n config = config || {};\n const timelineConverter = config.timelineConverter;\n\n let instance;\n\n function checkConfig() {\n if (!timelineConverter || !timelineConverter.hasOwnProperty('calcPeriodRelativeTimeFromMpdRelativeTime')) {\n throw new Error(Constants.MISSING_CONFIG_ERROR);\n }\n }\n\n function getMediaFinishedInformation(representation) {\n const mediaFinishedInformation = { numberOfSegments: 0, mediaTimeOfLastSignaledSegment: NaN }\n\n if (!representation) {\n return mediaFinishedInformation;\n }\n\n const list = representation.adaptation.period.mpd.manifest.Period_asArray[representation.adaptation.period.index].AdaptationSet_asArray[representation.adaptation.index].Representation_asArray[representation.index].SegmentList;\n const startNumber = representation && !isNaN(representation.startNumber) ? representation.startNumber : 1;\n const offset = Math.max(startNumber - 1, 0);\n\n mediaFinishedInformation.numberOfSegments = offset + list.SegmentURL_asArray.length;\n\n return mediaFinishedInformation\n }\n\n function getSegmentByIndex(representation, index) {\n checkConfig();\n\n if (!representation) {\n return null;\n }\n\n const list = representation.adaptation.period.mpd.manifest.Period_asArray[representation.adaptation.period.index].AdaptationSet_asArray[representation.adaptation.index].Representation_asArray[representation.index].SegmentList;\n const len = list.SegmentURL_asArray.length;\n\n const startNumber = representation && !isNaN(representation.startNumber) ? representation.startNumber : 1;\n const offsetToSubtract = Math.max(startNumber - 1, 0);\n\n const relativeIndex = Math.max(index - offsetToSubtract, 0);\n\n let segment = null;\n if (relativeIndex < len) {\n const s = list.SegmentURL_asArray[relativeIndex];\n\n segment = getIndexBasedSegment(timelineConverter, isDynamic, representation, index);\n if (segment) {\n segment.replacementTime = (startNumber + index - 1) * representation.segmentDuration;\n segment.media = s.media ? s.media : '';\n segment.mediaRange = s.mediaRange;\n segment.indexRange = s.indexRange;\n }\n }\n\n return segment;\n }\n\n function getSegmentByTime(representation, requestedTime) {\n checkConfig();\n\n if (!representation) {\n return null;\n }\n\n const duration = representation.segmentDuration;\n\n if (isNaN(duration)) {\n return null;\n }\n\n const periodTime = timelineConverter.calcPeriodRelativeTimeFromMpdRelativeTime(representation, requestedTime);\n const index = Math.floor(periodTime / duration);\n\n return getSegmentByIndex(representation, index);\n }\n\n instance = {\n getSegmentByIndex,\n getSegmentByTime,\n getMediaFinishedInformation\n };\n\n return instance;\n}\n\nListSegmentsGetter.__dashjs_factory_name = 'ListSegmentsGetter';\nconst factory = FactoryMaker.getClassFactory(ListSegmentsGetter);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport FactoryMaker from '../../core/FactoryMaker';\nimport Constants from '../../streaming/constants/Constants';\n\n\nfunction SegmentBaseGetter(config) {\n\n config = config || {};\n const timelineConverter = config.timelineConverter;\n\n let instance;\n\n function checkConfig() {\n if (!timelineConverter || !timelineConverter.hasOwnProperty('calcPeriodRelativeTimeFromMpdRelativeTime')) {\n throw new Error(Constants.MISSING_CONFIG_ERROR);\n }\n }\n\n function getMediaFinishedInformation(representation) {\n const mediaFinishedInformation = { numberOfSegments: 0, mediaTimeOfLastSignaledSegment: NaN }\n\n if (!representation || !representation.segments) {\n return mediaFinishedInformation\n }\n\n mediaFinishedInformation.numberOfSegments = representation.segments.length;\n\n return mediaFinishedInformation;\n }\n\n function getSegmentByIndex(representation, index) {\n checkConfig();\n\n if (!representation) {\n return null;\n }\n\n const len = representation.segments ? representation.segments.length : -1;\n let seg;\n if (index < len) {\n seg = representation.segments[index];\n if (seg && seg.index === index) {\n return seg;\n }\n }\n\n for (let i = 0; i < len; i++) {\n seg = representation.segments[i];\n\n if (seg && seg.index === index) {\n return seg;\n }\n }\n\n return null;\n }\n\n function getSegmentByTime(representation, requestedTime) {\n checkConfig();\n\n const index = getIndexByTime(representation, requestedTime);\n\n return getSegmentByIndex(representation, index);\n }\n\n function getIndexByTime(representation, time) {\n if (!representation) {\n return -1;\n }\n\n const segments = representation.segments;\n const ln = segments ? segments.length : null;\n\n let idx = -1;\n let epsilon,\n seg,\n ft,\n fd,\n i;\n\n if (segments && ln > 0) {\n for (i = 0; i < ln; i++) {\n seg = segments[i];\n ft = seg.presentationStartTime;\n fd = seg.duration;\n\n epsilon = fd / 2;\n if ((time + epsilon) >= ft &&\n (time - epsilon) < (ft + fd)) {\n idx = seg.index;\n break;\n }\n }\n }\n\n return idx;\n }\n\n instance = {\n getSegmentByIndex,\n getSegmentByTime,\n getMediaFinishedInformation\n };\n\n return instance;\n}\n\nSegmentBaseGetter.__dashjs_factory_name = 'SegmentBaseGetter';\nconst factory = FactoryMaker.getClassFactory(SegmentBaseGetter);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport Segment from './../vo/Segment';\n\n\nfunction zeroPadToLength(numStr, minStrLength) {\n while (numStr.length < minStrLength) {\n numStr = '0' + numStr;\n }\n return numStr;\n}\n\nfunction getNumberForSegment(segment, segmentIndex) {\n return segment.representation.startNumber + segmentIndex;\n}\n\nexport function unescapeDollarsInTemplate(url) {\n return url ? url.split('$$').join('$') : url;\n}\n\nexport function replaceIDForTemplate(url, value) {\n if (!value || !url || url.indexOf('$RepresentationID$') === -1) {\n return url;\n }\n let v = value.toString();\n return url.split('$RepresentationID$').join(v);\n}\n\nexport function replaceTokenForTemplate(url, token, value) {\n const formatTag = '%0';\n\n let startPos,\n endPos,\n formatTagPos,\n specifier,\n width,\n paddedValue;\n\n const tokenLen = token.length;\n const formatTagLen = formatTag.length;\n\n if (!url) {\n return url;\n }\n\n // keep looping round until all instances of <token> have been\n // replaced. once that has happened, startPos below will be -1\n // and the completed url will be returned.\n while (true) {\n\n // check if there is a valid $<token>...$ identifier\n // if not, return the url as is.\n startPos = url.indexOf('$' + token);\n if (startPos < 0) {\n return url;\n }\n\n // the next '$' must be the end of the identifier\n // if there isn't one, return the url as is.\n endPos = url.indexOf('$', startPos + tokenLen);\n if (endPos < 0) {\n return url;\n }\n\n // now see if there is an additional format tag suffixed to\n // the identifier within the enclosing '$' characters\n formatTagPos = url.indexOf(formatTag, startPos + tokenLen);\n if (formatTagPos > startPos && formatTagPos < endPos) {\n\n specifier = url.charAt(endPos - 1);\n width = parseInt(url.substring(formatTagPos + formatTagLen, endPos - 1), 10);\n\n // support the minimum specifiers required by IEEE 1003.1\n // (d, i , o, u, x, and X) for completeness\n switch (specifier) {\n // treat all int types as uint,\n // hence deliberate fallthrough\n case 'd':\n case 'i':\n case 'u':\n paddedValue = zeroPadToLength(value.toString(), width);\n break;\n case 'x':\n paddedValue = zeroPadToLength(value.toString(16), width);\n break;\n case 'X':\n paddedValue = zeroPadToLength(value.toString(16), width).toUpperCase();\n break;\n case 'o':\n paddedValue = zeroPadToLength(value.toString(8), width);\n break;\n default:\n return url;\n }\n } else {\n paddedValue = value;\n }\n\n url = url.substring(0, startPos) + paddedValue + url.substring(endPos + 1);\n }\n}\n\nfunction getSegment(representation, duration, presentationStartTime, mediaStartTime, timelineConverter, presentationEndTime, isDynamic, index) {\n let seg = new Segment();\n\n seg.representation = representation;\n seg.duration = duration;\n seg.presentationStartTime = presentationStartTime;\n seg.mediaStartTime = mediaStartTime;\n seg.availabilityStartTime = timelineConverter.calcAvailabilityStartTimeFromPresentationTime(presentationEndTime, representation, isDynamic);\n seg.availabilityEndTime = timelineConverter.calcAvailabilityEndTimeFromPresentationTime(presentationEndTime + duration, representation, isDynamic);\n seg.wallStartTime = timelineConverter.calcWallTimeForSegment(seg, isDynamic);\n seg.replacementNumber = getNumberForSegment(seg, index);\n seg.index = index;\n\n return seg;\n}\n\nfunction isSegmentAvailable(timelineConverter, representation, segment, isDynamic) {\n const voPeriod = representation.adaptation.period;\n\n // Avoid requesting segments that overlap the period boundary\n if (isFinite(voPeriod.duration) && voPeriod.start + voPeriod.duration <= segment.presentationStartTime) {\n return false;\n }\n\n if (isDynamic) {\n\n if (representation.availabilityTimeOffset === 'INF') {\n return true;\n }\n\n // For dynamic manifests we check if the presentation start time + duration is included in the availability window\n // SAST = Period@start + seg@presentationStartTime + seg@duration\n // ASAST = SAST - ATO\n // SAET = SAST + TSBD + seg@duration\n // refTime serves as an anchor time to compare the availability time of the segments against.\n const refTime = timelineConverter.getClientReferenceTime();\n return segment.availabilityStartTime.getTime() <= refTime && (!isFinite(segment.availabilityEndTime) || segment.availabilityEndTime.getTime() >= refTime);\n }\n\n return true;\n}\n\nexport function getIndexBasedSegment(timelineConverter, isDynamic, representation, index) {\n let duration,\n presentationStartTime,\n presentationEndTime;\n\n\n duration = representation.segmentDuration;\n\n /*\n * From spec - If neither @duration attribute nor SegmentTimeline element is present, then the Representation\n * shall contain exactly one Media Segment. The MPD start time is 0 and the MPD duration is obtained\n * in the same way as for the last Media Segment in the Representation.\n */\n if (isNaN(duration)) {\n duration = representation.adaptation.period.duration;\n }\n\n presentationStartTime = parseFloat((representation.adaptation.period.start + (index * duration)).toFixed(5));\n presentationEndTime = parseFloat((presentationStartTime + duration).toFixed(5));\n\n const mediaTime = timelineConverter.calcMediaTimeFromPresentationTime(presentationStartTime, representation);\n\n const segment = getSegment(representation, duration, presentationStartTime, mediaTime,\n timelineConverter, presentationEndTime, isDynamic, index);\n\n if (!isSegmentAvailable(timelineConverter, representation, segment, isDynamic)) {\n return null;\n }\n\n return segment;\n}\n\nexport function getTimeBasedSegment(timelineConverter, isDynamic, representation, time, duration, fTimescale, url, range, index, tManifest) {\n const scaledTime = time / fTimescale;\n const scaledDuration = duration / fTimescale;\n\n let presentationStartTime,\n presentationEndTime,\n seg;\n\n presentationStartTime = timelineConverter.calcPresentationTimeFromMediaTime(scaledTime, representation);\n presentationEndTime = presentationStartTime + scaledDuration;\n\n seg = getSegment(representation, scaledDuration, presentationStartTime,\n scaledTime,\n timelineConverter, presentationEndTime, isDynamic, index);\n\n if (!isSegmentAvailable(timelineConverter, representation, seg, isDynamic)) {\n return null;\n }\n\n seg.replacementTime = tManifest ? tManifest : time;\n\n url = replaceTokenForTemplate(url, 'Number', seg.replacementNumber);\n url = replaceTokenForTemplate(url, 'Time', seg.replacementTime);\n seg.media = url;\n seg.mediaRange = range;\n\n return seg;\n}\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport FactoryMaker from '../../core/FactoryMaker';\nimport Constants from '../../streaming/constants/Constants';\n\nimport {replaceTokenForTemplate, getIndexBasedSegment} from './SegmentsUtils';\n\nfunction TemplateSegmentsGetter(config, isDynamic) {\n config = config || {};\n const timelineConverter = config.timelineConverter;\n\n let instance;\n\n function checkConfig() {\n if (!timelineConverter || !timelineConverter.hasOwnProperty('calcPeriodRelativeTimeFromMpdRelativeTime')) {\n throw new Error(Constants.MISSING_CONFIG_ERROR);\n }\n }\n\n function getMediaFinishedInformation(representation) {\n const mediaFinishedInformation = { numberOfSegments: 0, mediaTimeOfLastSignaledSegment: NaN }\n if (!representation) {\n return mediaFinishedInformation\n }\n\n const duration = representation.segmentDuration;\n if (isNaN(duration)) {\n mediaFinishedInformation.numberOfSegments = 1;\n } else {\n mediaFinishedInformation.numberOfSegments = Math.ceil(representation.adaptation.period.duration / duration);\n }\n\n return mediaFinishedInformation;\n }\n\n function getSegmentByIndex(representation, index) {\n checkConfig();\n\n if (!representation) {\n return null;\n }\n\n const template = representation.adaptation.period.mpd.manifest.Period_asArray[representation.adaptation.period.index].AdaptationSet_asArray[representation.adaptation.index].Representation_asArray[representation.index].SegmentTemplate;\n\n // This is the index without @startNumber\n index = Math.max(index, 0);\n\n const seg = getIndexBasedSegment(timelineConverter, isDynamic, representation, index);\n if (seg) {\n seg.replacementTime = Math.round((index - 1) * representation.segmentDuration * representation.timescale, 10);\n\n let url = template.media;\n url = replaceTokenForTemplate(url, 'Number', seg.replacementNumber);\n url = replaceTokenForTemplate(url, 'Time', seg.replacementTime);\n seg.media = url;\n }\n\n return seg;\n }\n\n function getSegmentByTime(representation, requestedTime) {\n checkConfig();\n\n if (!representation) {\n return null;\n }\n\n const duration = representation.segmentDuration;\n\n if (isNaN(duration)) {\n return null;\n }\n\n // Calculate the relative time for the requested time in this period\n let periodTime = timelineConverter.calcPeriodRelativeTimeFromMpdRelativeTime(representation, requestedTime);\n const index = Math.floor(periodTime / duration);\n\n return getSegmentByIndex(representation, index);\n }\n\n instance = {\n getSegmentByIndex,\n getSegmentByTime,\n getMediaFinishedInformation\n };\n\n return instance;\n}\n\nTemplateSegmentsGetter.__dashjs_factory_name = 'TemplateSegmentsGetter';\nconst factory = FactoryMaker.getClassFactory(TemplateSegmentsGetter);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport FactoryMaker from '../../core/FactoryMaker';\nimport Constants from '../../streaming/constants/Constants';\n\nimport {getTimeBasedSegment} from './SegmentsUtils';\n\nfunction TimelineSegmentsGetter(config, isDynamic) {\n\n config = config || {};\n const timelineConverter = config.timelineConverter;\n const dashMetrics = config.dashMetrics;\n\n let instance;\n\n function checkConfig() {\n if (!timelineConverter) {\n throw new Error(Constants.MISSING_CONFIG_ERROR);\n }\n }\n\n function getMediaFinishedInformation(representation) {\n if (!representation) {\n return 0;\n }\n\n const base = representation.adaptation.period.mpd.manifest.Period_asArray[representation.adaptation.period.index].AdaptationSet_asArray[representation.adaptation.index].Representation_asArray[representation.index].SegmentTemplate ||\n representation.adaptation.period.mpd.manifest.Period_asArray[representation.adaptation.period.index].AdaptationSet_asArray[representation.adaptation.index].Representation_asArray[representation.index].SegmentList;\n const timeline = base.SegmentTimeline;\n\n let time = 0;\n let scaledTime = 0;\n let availableSegments = 0;\n\n let fragments,\n frag,\n i,\n len,\n j,\n repeat,\n fTimescale;\n\n fTimescale = representation.timescale;\n fragments = timeline.S_asArray;\n\n len = fragments.length;\n\n for (i = 0; i < len; i++) {\n frag = fragments[i];\n repeat = 0;\n if (frag.hasOwnProperty('r')) {\n repeat = frag.r;\n }\n\n // For a repeated S element, t belongs only to the first segment\n if (frag.hasOwnProperty('t')) {\n time = frag.t;\n scaledTime = time / fTimescale;\n }\n\n // This is a special case: \"A negative value of the @r attribute of the S element indicates that the duration indicated in @d attribute repeats until the start of the next S element, the end of the Period or until the\n // next MPD update.\"\n if (repeat < 0) {\n const nextFrag = fragments[i + 1];\n repeat = _calculateRepeatCountForNegativeR(representation, nextFrag, frag, fTimescale, scaledTime);\n }\n\n for (j = 0; j <= repeat; j++) {\n availableSegments++;\n\n time += frag.d;\n scaledTime = time / fTimescale;\n }\n }\n\n // We need to account for the index of the segments starting at 0. We subtract 1\n return { numberOfSegments: availableSegments, mediaTimeOfLastSignaledSegment: scaledTime };\n }\n\n function iterateSegments(representation, iterFunc) {\n const base = representation.adaptation.period.mpd.manifest.Period_asArray[representation.adaptation.period.index].AdaptationSet_asArray[representation.adaptation.index].Representation_asArray[representation.index].SegmentTemplate ||\n representation.adaptation.period.mpd.manifest.Period_asArray[representation.adaptation.period.index].AdaptationSet_asArray[representation.adaptation.index].Representation_asArray[representation.index].SegmentList;\n const timeline = base.SegmentTimeline;\n const list = base.SegmentURL_asArray;\n\n let time = 0;\n let relativeIdx = -1;\n\n let fragments,\n frag,\n i,\n len,\n j,\n repeat,\n fTimescale;\n\n fTimescale = representation.timescale;\n fragments = timeline.S_asArray;\n\n let breakIterator = false;\n\n for (i = 0, len = fragments.length; i < len && !breakIterator; i++) {\n frag = fragments[i];\n repeat = 0;\n if (frag.hasOwnProperty('r')) {\n repeat = frag.r;\n }\n\n // For a repeated S element, t belongs only to the first segment\n if (frag.hasOwnProperty('t')) {\n time = frag.t;\n }\n\n // This is a special case: \"A negative value of the @r attribute of the S element indicates that the duration indicated in @d attribute repeats until the start of the next S element, the end of the Period or until the\n // next MPD update.\"\n if (repeat < 0) {\n const nextFrag = fragments[i + 1];\n repeat = _calculateRepeatCountForNegativeR(representation, nextFrag, frag, fTimescale, time / fTimescale);\n }\n\n for (j = 0; j <= repeat && !breakIterator; j++) {\n relativeIdx++;\n\n breakIterator = iterFunc(time, base, list, frag, fTimescale, relativeIdx, i);\n\n if (breakIterator) {\n representation.segmentDuration = frag.d / fTimescale;\n }\n\n time += frag.d;\n }\n }\n }\n\n function _calculateRepeatCountForNegativeR(representation, nextFrag, frag, fTimescale, scaledTime) {\n let repeatEndTime;\n\n if (nextFrag && nextFrag.hasOwnProperty('t')) {\n repeatEndTime = nextFrag.t / fTimescale;\n } else {\n try {\n let availabilityEnd = 0;\n if (!isNaN(representation.adaptation.period.start) && !isNaN(representation.adaptation.period.duration) && isFinite(representation.adaptation.period.duration)) {\n // use end of the Period\n availabilityEnd = representation.adaptation.period.start + representation.adaptation.period.duration;\n } else {\n // use DVR window\n const dvrWindow = dashMetrics.getCurrentDVRInfo();\n availabilityEnd = !isNaN(dvrWindow.end) ? dvrWindow.end : 0;\n }\n repeatEndTime = timelineConverter.calcMediaTimeFromPresentationTime(availabilityEnd, representation);\n representation.segmentDuration = frag.d / fTimescale;\n } catch (e) {\n repeatEndTime = 0;\n }\n }\n\n return Math.max(Math.ceil((repeatEndTime - scaledTime) / (frag.d / fTimescale)) - 1, 0);\n }\n\n\n function getSegmentByIndex(representation, index, lastSegmentTime) {\n checkConfig();\n\n if (!representation) {\n return null;\n }\n\n let segment = null;\n let found = false;\n\n iterateSegments(representation, function (time, base, list, frag, fTimescale, relativeIdx, i) {\n if (found || lastSegmentTime < 0) {\n let media = base.media;\n let mediaRange = frag.mediaRange;\n\n if (list) {\n media = list[i].media || '';\n mediaRange = list[i].mediaRange;\n }\n\n segment = getTimeBasedSegment(\n timelineConverter,\n isDynamic,\n representation,\n time,\n frag.d,\n fTimescale,\n media,\n mediaRange,\n relativeIdx,\n frag.tManifest);\n\n return true;\n } else if (time >= (lastSegmentTime * fTimescale) - (frag.d * 0.5)) { // same logic, if deviation is\n // 50% of segment duration, segment is found if time is greater than or equal to (startTime of previous segment - half of the previous segment duration)\n found = true;\n }\n\n return false;\n });\n\n return segment;\n }\n\n function getSegmentByTime(representation, requestedTime) {\n checkConfig();\n\n if (!representation) {\n return null;\n }\n\n if (requestedTime === undefined) {\n requestedTime = null;\n }\n\n let segment = null;\n const requiredMediaTime = timelineConverter.calcMediaTimeFromPresentationTime(requestedTime, representation);\n\n iterateSegments(representation, function (time, base, list, frag, fTimescale, relativeIdx, i) {\n // In some cases when requiredMediaTime = actual end time of the last segment\n // it is possible that this time a bit exceeds the declared end time of the last segment.\n // in this case we still need to include the last segment in the segment list.\n const scaledMediaTime = precisionRound(requiredMediaTime * fTimescale);\n if (scaledMediaTime < (time + frag.d) && scaledMediaTime >= time) {\n let media = base.media;\n let mediaRange = frag.mediaRange;\n\n if (list) {\n media = list[i].media || '';\n mediaRange = list[i].mediaRange;\n }\n\n segment = getTimeBasedSegment(\n timelineConverter,\n isDynamic,\n representation,\n time,\n frag.d,\n fTimescale,\n media,\n mediaRange,\n relativeIdx,\n frag.tManifest);\n\n return true;\n }\n\n return false;\n });\n\n return segment;\n }\n\n function precisionRound(number) {\n return parseFloat(number.toPrecision(15));\n }\n\n instance = {\n getSegmentByIndex,\n getSegmentByTime,\n getMediaFinishedInformation\n };\n\n return instance;\n}\n\nTimelineSegmentsGetter.__dashjs_factory_name = 'TimelineSegmentsGetter';\nconst factory = FactoryMaker.getClassFactory(TimelineSegmentsGetter);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass Segment {\n constructor() {\n this.indexRange = null;\n // The index of the segment in the list of segments. We start at 0\n this.index = null;\n this.mediaRange = null;\n this.media = null;\n this.duration = NaN;\n // this is the time that should be inserted into the media url\n this.replacementTime = null;\n // this is the number that should be inserted into the media url\n this.replacementNumber = NaN;\n // This is supposed to match the time encoded in the media Segment\n this.mediaStartTime = NaN;\n // When the source buffer timeOffset is set to MSETimeOffset this is the\n // time that will match the seekTarget and video.currentTime\n this.presentationStartTime = NaN;\n // Do not schedule this segment until\n this.availabilityStartTime = NaN;\n // Ignore and discard this segment after\n this.availabilityEndTime = NaN;\n // For dynamic mpd's, this is the wall clock time that the video\n // element currentTime should be presentationStartTime\n this.wallStartTime = NaN;\n this.representation = null;\n }\n}\n\nexport default Segment;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass UTCTiming {\n constructor() {\n // UTCTiming is a DescriptorType and doesn't have any additional fields\n this.schemeIdUri = '';\n this.value = '';\n }\n}\n\nexport default UTCTiming;","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport Constants from '../constants/Constants';\nimport EventBus from '../../core/EventBus';\nimport Events from '../../core/events/Events';\nimport FactoryMaker from '../../core/FactoryMaker';\nimport Debug from '../../core/Debug';\nimport MediaPlayerEvents from '../../streaming/MediaPlayerEvents';\nimport MetricsConstants from '../constants/MetricsConstants';\n\nconst LIVE_UPDATE_PLAYBACK_TIME_INTERVAL_MS = 500;\n\nfunction PlaybackController() {\n\n const context = this.context;\n const eventBus = EventBus(context).getInstance();\n\n let instance,\n logger,\n streamController,\n serviceDescriptionController,\n dashMetrics,\n adapter,\n videoModel,\n timelineConverter,\n wallclockTimeIntervalId,\n liveDelay,\n originalLiveDelay,\n streamInfo,\n isDynamic,\n playOnceInitialized,\n lastLivePlaybackTime,\n lastLiveUpdateTime,\n availabilityStartTime,\n availabilityTimeComplete,\n lowLatencyModeEnabled,\n seekTarget,\n internalSeek,\n playbackStalled,\n manifestUpdateInProgress,\n initialCatchupModeActivated,\n settings;\n\n function setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n\n reset();\n }\n\n /**\n * Reset all settings\n */\n function reset() {\n pause();\n playOnceInitialized = false;\n liveDelay = 0;\n originalLiveDelay = 0;\n availabilityStartTime = 0;\n manifestUpdateInProgress = false;\n availabilityTimeComplete = true;\n lowLatencyModeEnabled = false;\n initialCatchupModeActivated = false;\n seekTarget = NaN;\n lastLiveUpdateTime = NaN;\n\n if (videoModel) {\n eventBus.off(Events.DATA_UPDATE_COMPLETED, _onDataUpdateCompleted, instance);\n eventBus.off(Events.LOADING_PROGRESS, _onFragmentLoadProgress, instance);\n eventBus.off(Events.MANIFEST_UPDATED, _onManifestUpdated, instance);\n eventBus.off(Events.STREAMS_COMPOSED, _onStreamsComposed, instance);\n eventBus.off(MediaPlayerEvents.PLAYBACK_ENDED, _onPlaybackEnded, instance);\n eventBus.off(MediaPlayerEvents.STREAM_INITIALIZING, _onStreamInitializing, instance);\n eventBus.off(MediaPlayerEvents.REPRESENTATION_SWITCH, _onRepresentationSwitch, instance);\n eventBus.off(MediaPlayerEvents.BUFFER_LEVEL_STATE_CHANGED, _onBufferLevelStateChanged, instance);\n stopUpdatingWallclockTime();\n removeAllListeners();\n }\n\n wallclockTimeIntervalId = null;\n videoModel = null;\n streamInfo = null;\n isDynamic = null;\n }\n\n /**\n * Initializes the PlaybackController. This function is called whenever the stream is switched.\n * @param {object} sInfo\n * @param {boolean} periodSwitch\n */\n function initialize(sInfo, periodSwitch) {\n streamInfo = sInfo;\n\n if (periodSwitch !== true) {\n _initializeForFirstStream();\n }\n }\n\n /**\n * Initializes the PlaybackController when the first stream is to be played.\n * @private\n */\n function _initializeForFirstStream() {\n addAllListeners();\n isDynamic = streamInfo.manifestInfo.isDynamic;\n\n playbackStalled = false;\n internalSeek = false;\n\n eventBus.on(Events.DATA_UPDATE_COMPLETED, _onDataUpdateCompleted, instance);\n eventBus.on(Events.LOADING_PROGRESS, _onFragmentLoadProgress, instance);\n eventBus.on(Events.MANIFEST_UPDATED, _onManifestUpdated, instance);\n eventBus.on(Events.STREAMS_COMPOSED, _onStreamsComposed, instance);\n eventBus.on(MediaPlayerEvents.PLAYBACK_ENDED, _onPlaybackEnded, instance, { priority: EventBus.EVENT_PRIORITY_HIGH });\n eventBus.on(MediaPlayerEvents.STREAM_INITIALIZING, _onStreamInitializing, instance);\n eventBus.on(MediaPlayerEvents.REPRESENTATION_SWITCH, _onRepresentationSwitch, instance);\n eventBus.on(MediaPlayerEvents.BUFFER_LEVEL_STATE_CHANGED, _onBufferLevelStateChanged, instance);\n eventBus.on(MediaPlayerEvents.DYNAMIC_TO_STATIC, _onDynamicToStatic, instance);\n\n if (playOnceInitialized) {\n playOnceInitialized = false;\n play();\n }\n }\n\n /**\n * Returns stalled state\n * @return {boolean}\n */\n function getPlaybackStalled() {\n return playbackStalled\n }\n\n /**\n * Returns remaining duration of a period\n * @param {object} sInfo\n * @return {number}\n */\n function getTimeToStreamEnd(sInfo = null) {\n return parseFloat((getStreamEndTime(sInfo) - getTime()).toFixed(5));\n }\n\n /**\n * Returns end time of a period\n * @param {object} sInfo\n * @return {number}\n */\n function getStreamEndTime(sInfo) {\n const refInfo = sInfo ? sInfo : streamInfo;\n return refInfo.start + refInfo.duration;\n }\n\n /**\n * Triggers play() on the video element\n */\n function play(adjustLiveDelay = false) {\n if (streamInfo && videoModel && videoModel.getElement()) {\n if (adjustLiveDelay && isDynamic) {\n _adjustLiveDelayAfterUserInteraction(getTime());\n }\n videoModel.play();\n } else {\n playOnceInitialized = true;\n }\n }\n\n /**\n * Triggers pause() on the video element\n */\n function pause() {\n if (streamInfo && videoModel) {\n videoModel.pause();\n }\n }\n\n /**\n * Triggers a seek to the specified media time. If internal is enabled there will be now \"seeked\" event dispatched\n * @param {number} time\n * @param {boolean} stickToBuffered\n * @param {boolean} internal\n * @param {boolean} adjustLiveDelay\n */\n function seek(time, stickToBuffered = false, internal = false, adjustLiveDelay = false) {\n if (!streamInfo || !videoModel || !videoModel.getElement()) return;\n\n let currentTime = !isNaN(seekTarget) ? seekTarget : videoModel.getTime();\n if (time === currentTime) return;\n\n internalSeek = (internal === true);\n\n if (!internalSeek) {\n seekTarget = time;\n }\n logger.info('Requesting seek to time: ' + time + (internalSeek ? ' (internal)' : ''));\n\n // We adjust the current latency. If catchup is enabled we will maintain this new latency\n if (isDynamic && adjustLiveDelay) {\n _adjustLiveDelayAfterUserInteraction(time);\n }\n\n videoModel.setCurrentTime(time, stickToBuffered);\n }\n\n /**\n * Seeks back to the live edge as defined by the originally calculated live delay\n * @param {boolean} stickToBuffered\n * @param {boolean} internal\n * @param {boolean} adjustLiveDelay\n */\n function seekToOriginalLive(stickToBuffered = false, internal = false, adjustLiveDelay = false) {\n const dvrWindowEnd = _getDvrWindowEnd();\n\n if (dvrWindowEnd === 0) {\n return;\n }\n\n liveDelay = originalLiveDelay;\n const seektime = dvrWindowEnd - liveDelay;\n\n seek(seektime, stickToBuffered, internal, adjustLiveDelay);\n }\n\n /**\n * Seeks to the live edge as currently defined by liveDelay\n * @param {boolean} stickToBuffered\n * @param {boolean} internal\n * @param {boolean} adjustLiveDelay\n */\n function seekToCurrentLive(stickToBuffered = false, internal = false, adjustLiveDelay = false) {\n const dvrWindowEnd = _getDvrWindowEnd();\n\n if (dvrWindowEnd === 0) {\n return;\n }\n\n const seektime = dvrWindowEnd - liveDelay;\n\n seek(seektime, stickToBuffered, internal, adjustLiveDelay);\n }\n\n function _getDvrWindowEnd() {\n if (!streamInfo || !videoModel || !isDynamic) {\n return;\n }\n\n const type = streamController && streamController.hasVideoTrack() ? Constants.VIDEO : Constants.AUDIO;\n const dvrInfo = dashMetrics.getCurrentDVRInfo(type);\n\n return dvrInfo && dvrInfo.range ? dvrInfo.range.end : 0;\n }\n\n\n function _adjustLiveDelayAfterUserInteraction(time) {\n const now = new Date(timelineConverter.getClientReferenceTime());\n const period = adapter.getRegularPeriods()[0];\n const nowAsPresentationTime = timelineConverter.calcPresentationTimeFromWallTime(now, period);\n\n liveDelay = nowAsPresentationTime - time;\n }\n\n /**\n * Returns current time of video element\n * @return {number|null}\n */\n function getTime() {\n return streamInfo && videoModel ? videoModel.getTime() : null;\n }\n\n /**\n * Returns paused state of the video element\n * @return {boolean|null}\n */\n function isPaused() {\n return streamInfo && videoModel ? videoModel.isPaused() : null;\n }\n\n /**\n * Returns seeking state of the video element\n * @return {boolean|null}\n */\n function isSeeking() {\n return streamInfo && videoModel ? videoModel.isSeeking() : null;\n }\n\n /**\n * Returns stalled state of the video element\n * @return {boolean|null}\n */\n function isStalled() {\n return streamInfo && videoModel ? videoModel.isStalled() : null;\n }\n\n /**\n * Returns current playback rate of the video element\n * @return {number|null}\n */\n function getPlaybackRate() {\n return streamInfo && videoModel ? videoModel.getPlaybackRate() : null;\n }\n\n /**\n * Returns the played ranges of the video element\n * @return {array}\n */\n function getPlayedRanges() {\n return streamInfo && videoModel ? videoModel.getPlayedRanges() : null;\n }\n\n /**\n * Returns ended attribute of the video element\n * @return {boolean|null}\n */\n function getEnded() {\n return streamInfo && videoModel ? videoModel.getEnded() : null;\n }\n\n /**\n * Returns whether a stream is type dynamic or not\n * @return {boolean}\n */\n function getIsDynamic() {\n return isDynamic;\n }\n\n /**\n * Returns the StreamController\n * @return {object}\n */\n function getStreamController() {\n return streamController;\n }\n\n /**\n * Returns whether a manifest update is in progress\n * @return {boolean}\n */\n function getIsManifestUpdateInProgress() {\n return manifestUpdateInProgress;\n }\n\n /**\n * Returns the availabilityStartTime\n * @return {number}\n */\n function getAvailabilityStartTime() {\n return availabilityStartTime;\n }\n\n /**\n * Returns the current live delay. A seek triggered by the user adjusts this value.\n * @return {number}\n */\n function getLiveDelay() {\n return liveDelay;\n }\n\n /**\n * Returns the original live delay as calculated at playback start\n */\n function getOriginalLiveDelay() {\n return originalLiveDelay;\n }\n\n /**\n * Returns the current live latency\n * @return {number}\n */\n function getCurrentLiveLatency() {\n if (!isDynamic || isNaN(availabilityStartTime)) {\n return NaN;\n }\n let currentTime = getTime();\n if (isNaN(currentTime) || currentTime === 0) {\n return 0;\n }\n\n const now = new Date().getTime() + timelineConverter.getClientTimeOffset() * 1000;\n return Math.max(((now - availabilityStartTime - currentTime * 1000) / 1000).toFixed(3), 0);\n }\n\n /**\n * Computes the desirable delay for the live edge to avoid a risk of getting 404 when playing at the bleeding edge\n * @param {number} fragmentDuration - seconds?\n * @param {object} manifestInfo\n * @returns {number} object\n * @memberof PlaybackController#\n */\n function computeAndSetLiveDelay(fragmentDuration, manifestInfo) {\n let delay,\n ret,\n startTime;\n const MIN_BUFFER_TIME_FACTOR = 4;\n const FRAGMENT_DURATION_FACTOR = 4;\n const adjustedFragmentDuration = !isNaN(fragmentDuration) && isFinite(fragmentDuration) ? fragmentDuration : NaN;\n\n let suggestedPresentationDelay = adapter.getSuggestedPresentationDelay();\n const serviceDescriptionSettings = serviceDescriptionController.getServiceDescriptionSettings();\n\n // Live delay specified by the user\n if (!isNaN(settings.get().streaming.delay.liveDelay)) {\n delay = settings.get().streaming.delay.liveDelay;\n }\n\n // Live delay fragment count specified by the user\n else if (settings.get().streaming.delay.liveDelayFragmentCount !== null && !isNaN(settings.get().streaming.delay.liveDelayFragmentCount) && !isNaN(adjustedFragmentDuration)) {\n delay = adjustedFragmentDuration * settings.get().streaming.delay.liveDelayFragmentCount;\n }\n\n // Live delay set via ServiceDescription element\n else if (serviceDescriptionSettings && !isNaN(serviceDescriptionSettings.liveDelay) && serviceDescriptionSettings.liveDelay > 0) {\n delay = serviceDescriptionSettings.liveDelay;\n }\n // Live delay set in the manifest using @suggestedPresentation Delay\n else if (settings.get().streaming.delay.useSuggestedPresentationDelay === true && suggestedPresentationDelay !== null && !isNaN(suggestedPresentationDelay) && suggestedPresentationDelay > 0) {\n delay = suggestedPresentationDelay;\n }\n\n // We found a fragment duration, use that to calculcate live delay\n else if (!isNaN(adjustedFragmentDuration)) {\n delay = adjustedFragmentDuration * FRAGMENT_DURATION_FACTOR;\n }\n\n // Fall back to @minBufferTime to calculate the live delay\n else {\n delay = manifestInfo && !isNaN(manifestInfo.minBufferTime) ? manifestInfo.minBufferTime * MIN_BUFFER_TIME_FACTOR : streamInfo.manifestInfo.minBufferTime * MIN_BUFFER_TIME_FACTOR;\n }\n\n startTime = adapter.getAvailabilityStartTime();\n if (startTime !== null) {\n availabilityStartTime = startTime;\n }\n\n if (manifestInfo && manifestInfo.dvrWindowSize > 0) {\n // Latency can not be higher than DVR window size\n ret = Math.min(delay, manifestInfo.dvrWindowSize);\n } else {\n ret = delay;\n }\n liveDelay = ret;\n originalLiveDelay = ret;\n\n return ret;\n }\n\n function setConfig(config) {\n if (!config) return;\n\n if (config.streamController) {\n streamController = config.streamController;\n }\n if (config.serviceDescriptionController) {\n serviceDescriptionController = config.serviceDescriptionController;\n }\n if (config.dashMetrics) {\n dashMetrics = config.dashMetrics;\n }\n if (config.adapter) {\n adapter = config.adapter;\n }\n if (config.videoModel) {\n videoModel = config.videoModel;\n }\n if (config.timelineConverter) {\n timelineConverter = config.timelineConverter;\n }\n if (config.settings) {\n settings = config.settings;\n }\n }\n\n /**\n * Compare the current time of the video against the DVR window. If we are out of the DVR window we need to seek.\n * @param {object} mediaType\n */\n function updateCurrentTime(mediaType = null) {\n if (isPaused() || !isDynamic || videoModel.getReadyState() === 0 || isSeeking() || manifestUpdateInProgress) return;\n\n // Note: In some cases we filter certain media types completely (for instance due to an unsupported video codec). This happens after the first entry to the DVR metric has been added.\n // Now the DVR window for the filtered media type is not updated anymore. Consequently, always use a mediaType that is available to get a valid DVR window.\n if (!mediaType) {\n mediaType = streamController.hasVideoTrack() ? Constants.VIDEO : Constants.AUDIO;\n }\n // Compare the current time of the video element against the range defined in the DVR window.\n const currentTime = getTime();\n const actualTime = _getAdjustedPresentationTime(currentTime, mediaType);\n const timeChanged = (!isNaN(actualTime) && actualTime !== currentTime);\n if (timeChanged && !isSeeking() && (isStalled() || playbackStalled || videoModel.getReadyState() === 1)) {\n logger.debug(`UpdateCurrentTime: Seek to actual time: ${actualTime} from currentTime: ${currentTime}`);\n seek(actualTime, false, false);\n }\n }\n\n /**\n * Adjust the presentation time based on the DVR window. If we are out of the DVR window we return a corrected time\n * @param {number} currentTime\n * @param {string} mediatype\n * @return {number}\n * @private\n */\n function _getAdjustedPresentationTime(currentTime, mediatype) {\n const DVRMetrics = dashMetrics.getCurrentDVRInfo(mediatype);\n const DVRWindow = DVRMetrics ? DVRMetrics.range : null;\n let actualTime;\n\n if (!DVRWindow) {\n return NaN;\n }\n\n if (currentTime > DVRWindow.end) {\n actualTime = Math.max(DVRWindow.end - liveDelay, DVRWindow.start);\n\n } else if (currentTime > 0 && currentTime + 0.250 < DVRWindow.start && Math.abs(currentTime - DVRWindow.start) < 315360000) {\n\n // Checking currentTime plus 250ms as the 'timeupdate' is fired with a frequency between 4Hz and 66Hz\n // https://developer.mozilla.org/en-US/docs/Web/Events/timeupdate\n // http://w3c.github.io/html/single-page.html#offsets-into-the-media-resource\n // Checking also duration of the DVR makes sense. We detected temporary situations in which currentTime\n // is bad reported by the browser which causes playback to jump to start (315360000 = 1 year)\n if (lowLatencyModeEnabled) {\n actualTime = Math.max(DVRWindow.end - liveDelay, DVRWindow.start);\n } else {\n actualTime = DVRWindow.start;\n }\n } else {\n actualTime = currentTime;\n }\n\n return actualTime;\n }\n\n /**\n * Start interval handler for wallclock time update\n */\n function startUpdatingWallclockTime() {\n if (wallclockTimeIntervalId !== null) return;\n\n wallclockTimeIntervalId = setInterval(() => {\n _onWallclockTime();\n }, settings.get().streaming.wallclockTimeUpdateInterval);\n }\n\n /**\n * Stop the interval handler for the wallclock time update\n */\n function stopUpdatingWallclockTime() {\n clearInterval(wallclockTimeIntervalId);\n wallclockTimeIntervalId = null;\n }\n\n function _onDataUpdateCompleted(e) {\n const representationInfo = adapter.convertRepresentationToRepresentationInfo(e.currentRepresentation);\n const info = representationInfo ? representationInfo.mediaInfo.streamInfo : null;\n\n if (info === null || streamInfo.id !== info.id) return;\n streamInfo = info;\n }\n\n function _onCanPlay() {\n eventBus.trigger(Events.CAN_PLAY);\n }\n\n function _onCanPlayThrough() {\n eventBus.trigger(Events.CAN_PLAY_THROUGH);\n }\n\n function _onBufferLevelStateChanged(e) {\n // do not stall playback when get an event from Stream that is not active\n if (e.streamId !== streamController.getActiveStreamInfo().id) {\n return;\n }\n\n playbackStalled = e.state === MetricsConstants.BUFFER_EMPTY;\n\n if (settings.get().streaming.buffer.setStallState) {\n videoModel.setStallState(e.mediaType, e.state === MetricsConstants.BUFFER_EMPTY);\n }\n }\n\n function _onPlaybackStart() {\n logger.info('Native video element event: play');\n updateCurrentTime();\n startUpdatingWallclockTime();\n eventBus.trigger(Events.PLAYBACK_STARTED, { startTime: getTime() });\n }\n\n function _onPlaybackWaiting() {\n logger.info('Native video element event: waiting');\n eventBus.trigger(Events.PLAYBACK_WAITING, { playingTime: getTime() });\n }\n\n function _onPlaybackPlaying() {\n logger.info('Native video element event: playing');\n internalSeek = false;\n eventBus.trigger(Events.PLAYBACK_PLAYING, { playingTime: getTime() });\n }\n\n function _onPlaybackPaused() {\n logger.info('Native video element event: pause');\n eventBus.trigger(Events.PLAYBACK_PAUSED, { ended: getEnded() });\n }\n\n function _onPlaybackSeeking() {\n // Check if internal seeking to be ignored\n if (internalSeek) {\n return;\n }\n\n let seekTime = getTime();\n // On some browsers/devices, in case of live streams, setting current time on video element fails when there is no buffered data at requested time\n // Then re-set seek target time and video element will be seeked afterwhile once data is buffered (see BufferContoller)\n if (!isNaN(seekTarget) && seekTarget !== seekTime) {\n seekTime = seekTarget;\n }\n seekTarget = NaN;\n\n logger.info('Seeking to: ' + seekTime);\n startUpdatingWallclockTime();\n eventBus.trigger(Events.PLAYBACK_SEEKING, {\n seekTime: seekTime,\n streamId: streamInfo.id\n });\n }\n\n function _onPlaybackSeeked() {\n logger.info('Native video element event: seeked');\n internalSeek = false;\n eventBus.trigger(Events.PLAYBACK_SEEKED);\n }\n\n function _onPlaybackTimeUpdated() {\n if (streamInfo) {\n eventBus.trigger(Events.PLAYBACK_TIME_UPDATED, {\n timeToEnd: getTimeToStreamEnd(),\n time: getTime(),\n streamId: streamInfo.id\n });\n }\n }\n\n function _onPlaybackProgress() {\n eventBus.trigger(Events.PLAYBACK_PROGRESS, { streamId: streamInfo.id });\n }\n\n function _onPlaybackRateChanged() {\n const rate = getPlaybackRate();\n logger.info('Native video element event: ratechange: ', rate);\n eventBus.trigger(Events.PLAYBACK_RATE_CHANGED, { playbackRate: rate });\n }\n\n function _onPlaybackMetaDataLoaded() {\n logger.info('Native video element event: loadedmetadata');\n eventBus.trigger(Events.PLAYBACK_METADATA_LOADED);\n startUpdatingWallclockTime();\n }\n\n function _onPlaybackLoadedData() {\n logger.info('Native video element event: loadeddata');\n eventBus.trigger(Events.PLAYBACK_LOADED_DATA);\n }\n\n // Event to handle the native video element ended event\n function _onNativePlaybackEnded() {\n logger.info('Native video element event: ended');\n pause();\n stopUpdatingWallclockTime();\n const streamInfo = streamController ? streamController.getActiveStreamInfo() : null;\n if (!streamInfo) return;\n eventBus.trigger(Events.PLAYBACK_ENDED, { 'isLast': streamInfo.isLast });\n }\n\n function _onVolumeChanged() {\n eventBus.trigger(Events.PLAYBACK_VOLUME_CHANGED);\n }\n\n // Handle DASH PLAYBACK_ENDED event\n function _onPlaybackEnded(e) {\n if (wallclockTimeIntervalId && e.isLast) {\n // PLAYBACK_ENDED was triggered elsewhere, react.\n logger.info('onPlaybackEnded -- PLAYBACK_ENDED but native video element didn\\'t fire ended');\n const seekTime = e.seekTime ? e.seekTime : getStreamEndTime();\n videoModel.setCurrentTime(seekTime);\n pause();\n stopUpdatingWallclockTime();\n }\n }\n\n function _onPlaybackError(event) {\n const target = event.target || event.srcElement;\n eventBus.trigger(Events.PLAYBACK_ERROR, { error: target.error });\n }\n\n function _onWallclockTime() {\n eventBus.trigger(Events.WALLCLOCK_TIME_UPDATED, {\n isDynamic: isDynamic,\n time: new Date()\n });\n\n // Updates playback time for paused dynamic streams\n // (video element doesn't call timeupdate when the playback is paused)\n if (getIsDynamic()) {\n const now = Date.now();\n if (isNaN(lastLiveUpdateTime) || now > lastLiveUpdateTime + settings.get().streaming.liveUpdateTimeThresholdInMilliseconds) {\n streamController.addDVRMetric();\n if (isPaused()) {\n _updateLivePlaybackTime();\n } else {\n updateCurrentTime();\n }\n lastLiveUpdateTime = now;\n }\n }\n }\n\n function _onDynamicToStatic() {\n isDynamic = false;\n }\n\n function _updateLivePlaybackTime() {\n const now = Date.now();\n if (!lastLivePlaybackTime || now > lastLivePlaybackTime + LIVE_UPDATE_PLAYBACK_TIME_INTERVAL_MS) {\n lastLivePlaybackTime = now;\n _onPlaybackTimeUpdated();\n }\n }\n\n /**\n * Returns the combined minimum buffer level of all StreamProcessors. If a filter list is provided the types specified in the filter list are excluded.\n * @param {array} filterList StreamProcessor types to exclude\n * @return {null}\n */\n function getBufferLevel(filterList = null) {\n let bufferLevel = null;\n streamController.getActiveStreamProcessors().forEach(p => {\n if (!filterList || filterList.length === 0 || filterList.indexOf(p.getType()) === -1) {\n const bl = p.getBufferLevel();\n if (bufferLevel === null) {\n bufferLevel = bl;\n } else {\n bufferLevel = Math.min(bufferLevel, bl);\n }\n }\n });\n\n return bufferLevel;\n }\n\n /**\n * Returns the value of lowLatencyModeEnabled\n * @return {boolean} lowLatencyModeEnabled\n */\n function getLowLatencyModeEnabled() {\n return lowLatencyModeEnabled\n }\n\n\n function _onFragmentLoadProgress(e) {\n // If using fetch and stream mode is not available, readjust live latency so it is 20% higher than segment duration\n if (e.stream === false && lowLatencyModeEnabled && !isNaN(e.request.duration)) {\n const minDelay = 1.2 * e.request.duration;\n if (minDelay > liveDelay) {\n logger.warn('Browser does not support fetch API with StreamReader. Increasing live delay to be 20% higher than segment duration:', minDelay.toFixed(2));\n liveDelay = minDelay;\n originalLiveDelay = minDelay;\n }\n }\n }\n\n function onPlaybackStalled(e) {\n eventBus.trigger(Events.PLAYBACK_STALLED, { e: e });\n }\n\n function _onStreamInitializing(e) {\n _checkEnableLowLatency(e.mediaInfo);\n }\n\n /**\n * We enable low latency playback if for the current representation availabilityTimeComplete is set to false\n * @param e\n * @private\n */\n function _onRepresentationSwitch(e) {\n const activeStreamInfo = streamController.getActiveStreamInfo();\n if (!e || !activeStreamInfo || !e.currentRepresentation || !e.streamId || e.streamId !== activeStreamInfo.id || !e.mediaType || (e.mediaType !== Constants.VIDEO && e.mediaType !== Constants.AUDIO)) {\n return;\n }\n\n availabilityTimeComplete = e.currentRepresentation.availabilityTimeComplete;\n lowLatencyModeEnabled = !availabilityTimeComplete;\n\n // If we enable low latency mode for the first time we also enable the catchup mechanism. This can be deactivated again for instance if the user seeks within the DVR window. We leave deactivation up to the application but also do not activate automatically again.\n if (lowLatencyModeEnabled && !initialCatchupModeActivated) {\n initialCatchupModeActivated = true;\n }\n }\n\n function getInitialCatchupModeActivated() {\n return initialCatchupModeActivated;\n }\n\n /**\n * A new manifest has been loaded, updating is still in progress.\n * @private\n */\n function _onManifestUpdated() {\n manifestUpdateInProgress = true;\n }\n\n /**\n * Manifest update was completed\n * @private\n */\n function _onStreamsComposed() {\n manifestUpdateInProgress = false;\n }\n\n function _checkEnableLowLatency(mediaInfo) {\n if (mediaInfo && mediaInfo.supplementalProperties &&\n mediaInfo.supplementalProperties[Constants.SUPPLEMENTAL_PROPERTY_DVB_LL_SCHEME] &&\n mediaInfo.supplementalProperties[Constants.SUPPLEMENTAL_PROPERTY_DVB_LL_SCHEME].value === 'true') {\n logger.debug('Low Latency critical SupplementalProperty set: Enabling low Latency');\n lowLatencyModeEnabled = true;\n }\n }\n\n function addAllListeners() {\n videoModel.addEventListener('canplay', _onCanPlay);\n videoModel.addEventListener('canplaythrough', _onCanPlayThrough);\n videoModel.addEventListener('play', _onPlaybackStart);\n videoModel.addEventListener('waiting', _onPlaybackWaiting);\n videoModel.addEventListener('playing', _onPlaybackPlaying);\n videoModel.addEventListener('pause', _onPlaybackPaused);\n videoModel.addEventListener('error', _onPlaybackError);\n videoModel.addEventListener('seeking', _onPlaybackSeeking);\n videoModel.addEventListener('seeked', _onPlaybackSeeked);\n videoModel.addEventListener('timeupdate', _onPlaybackTimeUpdated);\n videoModel.addEventListener('progress', _onPlaybackProgress);\n videoModel.addEventListener('ratechange', _onPlaybackRateChanged);\n videoModel.addEventListener('loadedmetadata', _onPlaybackMetaDataLoaded);\n videoModel.addEventListener('loadeddata', _onPlaybackLoadedData);\n videoModel.addEventListener('stalled', onPlaybackStalled);\n videoModel.addEventListener('ended', _onNativePlaybackEnded);\n videoModel.addEventListener('volumechange', _onVolumeChanged);\n }\n\n function removeAllListeners() {\n videoModel.removeEventListener('canplay', _onCanPlay);\n videoModel.removeEventListener('canplaythrough', _onCanPlayThrough);\n videoModel.removeEventListener('play', _onPlaybackStart);\n videoModel.removeEventListener('waiting', _onPlaybackWaiting);\n videoModel.removeEventListener('playing', _onPlaybackPlaying);\n videoModel.removeEventListener('pause', _onPlaybackPaused);\n videoModel.removeEventListener('error', _onPlaybackError);\n videoModel.removeEventListener('seeking', _onPlaybackSeeking);\n videoModel.removeEventListener('seeked', _onPlaybackSeeked);\n videoModel.removeEventListener('timeupdate', _onPlaybackTimeUpdated);\n videoModel.removeEventListener('progress', _onPlaybackProgress);\n videoModel.removeEventListener('ratechange', _onPlaybackRateChanged);\n videoModel.removeEventListener('loadedmetadata', _onPlaybackMetaDataLoaded);\n videoModel.removeEventListener('loadeddata', _onPlaybackLoadedData);\n videoModel.removeEventListener('stalled', onPlaybackStalled);\n videoModel.removeEventListener('ended', _onNativePlaybackEnded);\n videoModel.removeEventListener('volumechange', _onVolumeChanged);\n }\n\n instance = {\n initialize,\n setConfig,\n getTimeToStreamEnd,\n getBufferLevel,\n getPlaybackStalled,\n getTime,\n getLowLatencyModeEnabled,\n getInitialCatchupModeActivated,\n getIsManifestUpdateInProgress,\n getPlaybackRate,\n getPlayedRanges,\n getEnded,\n getIsDynamic,\n getStreamController,\n computeAndSetLiveDelay,\n getLiveDelay,\n getOriginalLiveDelay,\n getCurrentLiveLatency,\n play,\n isPaused,\n isStalled,\n pause,\n isSeeking,\n getStreamEndTime,\n seek,\n seekToOriginalLive,\n seekToCurrentLive,\n reset,\n updateCurrentTime,\n getAvailabilityStartTime\n };\n\n setup();\n\n return instance;\n}\n\nPlaybackController.__dashjs_factory_name = 'PlaybackController';\nexport default FactoryMaker.getSingletonFactory(PlaybackController);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport FactoryMaker from '../../core/FactoryMaker';\nimport FragmentRequest from '../vo/FragmentRequest';\n\nconst FRAGMENT_MODEL_LOADING = 'loading';\nconst FRAGMENT_MODEL_EXECUTED = 'executed';\nconst FRAGMENT_MODEL_CANCELED = 'canceled';\nconst FRAGMENT_MODEL_FAILED = 'failed';\n\nfunction FragmentModel(config) {\n\n config = config || {};\n const eventBus = config.eventBus;\n const events = config.events;\n const dashMetrics = config.dashMetrics;\n const fragmentLoader = config.fragmentLoader;\n const debug = config.debug;\n const streamInfo = config.streamInfo;\n const type = config.type;\n\n let instance,\n logger,\n executedRequests,\n loadingRequests;\n\n function setup() {\n logger = debug.getLogger(instance);\n resetInitialSettings();\n eventBus.on(events.LOADING_COMPLETED, onLoadingCompleted, instance);\n eventBus.on(events.LOADING_DATA_PROGRESS, onLoadingInProgress, instance);\n eventBus.on(events.LOADING_ABANDONED, onLoadingAborted, instance);\n }\n\n function getStreamId() {\n return streamInfo.id;\n }\n\n function getType() {\n return type;\n }\n\n function isFragmentLoaded(request) {\n const isEqualComplete = function (req1, req2) {\n return ((req1.action === FragmentRequest.ACTION_COMPLETE) && (req1.action === req2.action));\n };\n\n const isEqualMedia = function (req1, req2) {\n return !isNaN(req1.index) && (req1.startTime === req2.startTime) && (req1.adaptationIndex === req2.adaptationIndex) && (req1.type === req2.type);\n };\n\n const isEqualInit = function (req1, req2) {\n return isNaN(req1.index) && isNaN(req2.index) && (req1.quality === req2.quality);\n };\n\n const check = function (requests) {\n let isLoaded = false;\n\n requests.some(req => {\n if (isEqualMedia(request, req) || isEqualInit(request, req) || isEqualComplete(request, req)) {\n isLoaded = true;\n return isLoaded;\n }\n });\n return isLoaded;\n };\n\n if (!request) {\n return false;\n }\n\n return check(executedRequests);\n }\n\n function isFragmentLoadedOrPending(request) {\n let isLoaded = false;\n let i = 0;\n let req;\n\n // First, check if the fragment has already been loaded\n isLoaded = isFragmentLoaded(request);\n\n // Then, check if the fragment is about to be loeaded\n if (!isLoaded) {\n for (i = 0; i < loadingRequests.length; i++) {\n req = loadingRequests[i];\n if ((request.url === req.url) && (request.startTime === req.startTime)) {\n isLoaded = true;\n }\n }\n }\n\n return isLoaded;\n }\n\n /**\n *\n * Gets an array of {@link FragmentRequest} objects\n *\n * @param {Object} filter The object with properties by which the method filters the requests to be returned.\n * the only mandatory property is state, which must be a value from\n * other properties should match the properties of {@link FragmentRequest}. E.g.:\n * getRequests({state: FragmentModel.FRAGMENT_MODEL_EXECUTED, quality: 0}) - returns\n * all the requests from executedRequests array where requests.quality = filter.quality\n *\n * @returns {Array}\n * @memberof FragmentModel#\n */\n function getRequests(filter) {\n const states = filter ? filter.state instanceof Array ? filter.state : [filter.state] : [];\n\n let filteredRequests = [];\n states.forEach(state => {\n const requests = getRequestsForState(state);\n filteredRequests = filteredRequests.concat(filterRequests(requests, filter));\n });\n\n return filteredRequests;\n }\n\n function getRequestThreshold(req) {\n return isNaN(req.duration) ? 0.25 : Math.min(req.duration / 8, 0.5);\n }\n\n function removeExecutedRequestsBeforeTime(time) {\n executedRequests = executedRequests.filter(req => {\n const threshold = getRequestThreshold(req);\n return isNaN(req.startTime) || (time !== undefined ? req.startTime >= time - threshold : false);\n });\n }\n\n function removeExecutedRequestsAfterTime(time) {\n executedRequests = executedRequests.filter(req => {\n return isNaN(req.startTime) || (time !== undefined ? req.startTime < time : false);\n });\n }\n\n function removeExecutedRequestsInTimeRange(start, end) {\n if (end <= start + 0.5) {\n return;\n }\n\n executedRequests = executedRequests.filter(req => {\n const threshold = getRequestThreshold(req);\n return (isNaN(req.startTime) || req.startTime >= (end - threshold)) ||\n (isNaN(req.duration) || (req.startTime + req.duration) <= (start + threshold));\n });\n }\n\n // Remove requests that are not \"represented\" by any of buffered ranges\n function syncExecutedRequestsWithBufferedRange(bufferedRanges, streamDuration) {\n if (!bufferedRanges || bufferedRanges.length === 0) {\n removeExecutedRequestsBeforeTime();\n return;\n }\n\n let start = 0;\n for (let i = 0, ln = bufferedRanges.length; i < ln; i++) {\n removeExecutedRequestsInTimeRange(start, bufferedRanges.start(i));\n start = bufferedRanges.end(i);\n }\n if (streamDuration > 0) {\n removeExecutedRequestsInTimeRange(start, streamDuration);\n }\n }\n\n function abortRequests() {\n logger.debug('abort requests');\n fragmentLoader.abort();\n loadingRequests = [];\n }\n\n function executeRequest(request) {\n switch (request.action) {\n case FragmentRequest.ACTION_DOWNLOAD:\n addSchedulingInfoMetrics(request, FRAGMENT_MODEL_LOADING);\n loadingRequests.push(request);\n loadCurrentFragment(request);\n break;\n default:\n logger.warn('Unknown request action.');\n }\n }\n\n function loadCurrentFragment(request) {\n eventBus.trigger(events.FRAGMENT_LOADING_STARTED,\n { request: request },\n { streamId: streamInfo.id, mediaType: type }\n );\n fragmentLoader.load(request);\n }\n\n function getRequestForTime(arr, time, threshold) {\n // loop through the executed requests and pick the one for which the playback interval matches the given time\n const lastIdx = arr.length - 1;\n for (let i = lastIdx; i >= 0; i--) {\n const req = arr[i];\n const start = req.startTime;\n const end = start + req.duration;\n threshold = !isNaN(threshold) ? threshold : getRequestThreshold(req);\n if ((!isNaN(start) && !isNaN(end) && ((time + threshold) >= start) && ((time - threshold) < end)) || (isNaN(start) && isNaN(time))) {\n return req;\n }\n }\n return null;\n }\n\n function filterRequests(arr, filter) {\n // for time use a specific filtration function\n if (filter.hasOwnProperty('time')) {\n return [getRequestForTime(arr, filter.time, filter.threshold)];\n }\n\n return arr.filter(request => {\n for (const prop in filter) {\n if (prop === 'state') continue;\n if (filter.hasOwnProperty(prop) && request[prop] != filter[prop]) return false;\n }\n\n return true;\n });\n }\n\n function getRequestsForState(state) {\n let requests;\n switch (state) {\n case FRAGMENT_MODEL_LOADING:\n requests = loadingRequests;\n break;\n case FRAGMENT_MODEL_EXECUTED:\n requests = executedRequests;\n break;\n default:\n requests = [];\n }\n return requests;\n }\n\n function addSchedulingInfoMetrics(request, state) {\n dashMetrics.addSchedulingInfo(request, state);\n dashMetrics.addRequestsQueue(request.mediaType, loadingRequests, executedRequests);\n }\n\n function onLoadingCompleted(e) {\n if (e.sender !== fragmentLoader) return;\n\n loadingRequests.splice(loadingRequests.indexOf(e.request), 1);\n\n if (e.response && !e.error) {\n executedRequests.push(e.request);\n }\n\n addSchedulingInfoMetrics(e.request, e.error ? FRAGMENT_MODEL_FAILED : FRAGMENT_MODEL_EXECUTED);\n\n eventBus.trigger(events.FRAGMENT_LOADING_COMPLETED,\n {\n request: e.request,\n response: e.response,\n error: e.error,\n sender: this\n },\n { streamId: streamInfo.id, mediaType: type }\n );\n }\n\n function onLoadingInProgress(e) {\n if (e.sender !== fragmentLoader) return;\n\n eventBus.trigger(events.FRAGMENT_LOADING_PROGRESS,\n {\n request: e.request,\n response: e.response,\n error: e.error,\n sender: this\n },\n { streamId: streamInfo.id, mediaType: type }\n );\n }\n\n function onLoadingAborted(e) {\n if (e.sender !== fragmentLoader) return;\n\n eventBus.trigger(events.FRAGMENT_LOADING_ABANDONED,\n { request: e.request },\n { streamId: streamInfo.id, mediaType: type }\n );\n }\n\n function resetInitialSettings() {\n executedRequests = [];\n loadingRequests = [];\n }\n\n function reset() {\n eventBus.off(events.LOADING_COMPLETED, onLoadingCompleted, this);\n eventBus.off(events.LOADING_DATA_PROGRESS, onLoadingInProgress, this);\n eventBus.off(events.LOADING_ABANDONED, onLoadingAborted, this);\n\n if (fragmentLoader) {\n fragmentLoader.reset();\n }\n resetInitialSettings();\n }\n\n function addExecutedRequest(request) {\n executedRequests.push(request);\n }\n\n instance = {\n getStreamId,\n getType,\n getRequests,\n isFragmentLoaded,\n isFragmentLoadedOrPending,\n removeExecutedRequestsBeforeTime,\n removeExecutedRequestsAfterTime,\n syncExecutedRequestsWithBufferedRange,\n abortRequests,\n executeRequest,\n reset,\n resetInitialSettings,\n addExecutedRequest\n };\n\n setup();\n return instance;\n}\n\nFragmentModel.__dashjs_factory_name = 'FragmentModel';\nconst factory = FactoryMaker.getClassFactory(FragmentModel);\nfactory.FRAGMENT_MODEL_LOADING = FRAGMENT_MODEL_LOADING;\nfactory.FRAGMENT_MODEL_EXECUTED = FRAGMENT_MODEL_EXECUTED;\nfactory.FRAGMENT_MODEL_CANCELED = FRAGMENT_MODEL_CANCELED;\nfactory.FRAGMENT_MODEL_FAILED = FRAGMENT_MODEL_FAILED;\nFactoryMaker.updateClassFactory(FragmentModel.__dashjs_factory_name, factory);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport ErrorsBase from './ErrorsBase';\n\n/**\n * Errors declaration\n * @class\n */\nclass Errors extends ErrorsBase {\n constructor() {\n super();\n\n /**\n * Error code returned when a manifest parsing error occurs\n */\n this.MANIFEST_LOADER_PARSING_FAILURE_ERROR_CODE = 10;\n\n /**\n * Error code returned when a manifest loading error occurs\n */\n this.MANIFEST_LOADER_LOADING_FAILURE_ERROR_CODE = 11;\n\n /**\n * Error code returned when a xlink loading error occurs\n */\n this.XLINK_LOADER_LOADING_FAILURE_ERROR_CODE = 12;\n\n /**\n * Error code returned when no segment ranges could be determined from the sidx box\n */\n this.SEGMENT_BASE_LOADER_ERROR_CODE = 15;\n\n /**\n * Error code returned when the time synchronization failed\n */\n this.TIME_SYNC_FAILED_ERROR_CODE = 16;\n\n /**\n * Error code returned when loading a fragment failed\n */\n this.FRAGMENT_LOADER_LOADING_FAILURE_ERROR_CODE = 17;\n\n /**\n * Error code returned when the FragmentLoader did not receive a request object\n */\n this.FRAGMENT_LOADER_NULL_REQUEST_ERROR_CODE = 18;\n\n /**\n * Error code returned when the BaseUrl resolution failed\n */\n this.URL_RESOLUTION_FAILED_GENERIC_ERROR_CODE = 19;\n\n /**\n * Error code returned when the append operation in the SourceBuffer failed\n */\n this.APPEND_ERROR_CODE = 20;\n\n /**\n * Error code returned when the remove operation in the SourceBuffer failed\n */\n this.REMOVE_ERROR_CODE = 21;\n\n /**\n * Error code returned when updating the internal objects after loading an MPD failed\n */\n this.DATA_UPDATE_FAILED_ERROR_CODE = 22;\n\n /**\n * Error code returned when MediaSource is not supported by the browser\n */\n this.CAPABILITY_MEDIASOURCE_ERROR_CODE = 23;\n\n /**\n * Error code returned when Protected contents are not supported\n */\n this.CAPABILITY_MEDIAKEYS_ERROR_CODE = 24;\n\n /**\n * Error code returned when loading the manifest failed\n */\n this.DOWNLOAD_ERROR_ID_MANIFEST_CODE = 25;\n\n /**\n * Error code returned when loading the sidx failed\n */\n this.DOWNLOAD_ERROR_ID_SIDX_CODE = 26;\n\n /**\n * Error code returned when loading the media content failed\n */\n this.DOWNLOAD_ERROR_ID_CONTENT_CODE = 27;\n\n /**\n * Error code returned when loading the init segment failed\n */\n this.DOWNLOAD_ERROR_ID_INITIALIZATION_CODE = 28;\n\n /**\n * Error code returned when loading the XLink content failed\n */\n this.DOWNLOAD_ERROR_ID_XLINK_CODE = 29;\n\n /**\n * Error code returned when parsing the MPD resulted in a logical error\n */\n this.MANIFEST_ERROR_ID_PARSE_CODE = 31;\n\n /**\n * Error code returned when no stream (period) has been detected in the manifest\n */\n this.MANIFEST_ERROR_ID_NOSTREAMS_CODE = 32;\n\n /**\n * Error code returned when something wrong has happened during parsing and appending subtitles (TTML or VTT)\n */\n this.TIMED_TEXT_ERROR_ID_PARSE_CODE = 33;\n\n /**\n * Error code returned when a 'muxed' media type has been detected in the manifest. This type is not supported\n */\n\n this.MANIFEST_ERROR_ID_MULTIPLEXED_CODE = 34;\n\n /**\n * Error code returned when a media source type is not supported\n */\n this.MEDIASOURCE_TYPE_UNSUPPORTED_CODE = 35;\n\n this.MANIFEST_LOADER_PARSING_FAILURE_ERROR_MESSAGE = 'parsing failed for ';\n this.MANIFEST_LOADER_LOADING_FAILURE_ERROR_MESSAGE = 'Failed loading manifest: ';\n this.XLINK_LOADER_LOADING_FAILURE_ERROR_MESSAGE = 'Failed loading Xlink element: ';\n this.SEGMENTS_UPDATE_FAILED_ERROR_MESSAGE = 'Segments update failed';\n this.SEGMENTS_UNAVAILABLE_ERROR_MESSAGE = 'no segments are available yet';\n this.SEGMENT_BASE_LOADER_ERROR_MESSAGE = 'error loading segment ranges from sidx';\n this.TIME_SYNC_FAILED_ERROR_MESSAGE = 'Failed to synchronize client and server time';\n this.FRAGMENT_LOADER_NULL_REQUEST_ERROR_MESSAGE = 'request is null';\n this.URL_RESOLUTION_FAILED_GENERIC_ERROR_MESSAGE = 'Failed to resolve a valid URL';\n this.APPEND_ERROR_MESSAGE = 'chunk is not defined';\n this.REMOVE_ERROR_MESSAGE = 'Removing data from the SourceBuffer';\n this.DATA_UPDATE_FAILED_ERROR_MESSAGE = 'Data update failed';\n this.CAPABILITY_MEDIASOURCE_ERROR_MESSAGE = 'mediasource is not supported';\n this.CAPABILITY_MEDIAKEYS_ERROR_MESSAGE = 'mediakeys is not supported';\n this.TIMED_TEXT_ERROR_MESSAGE_PARSE = 'parsing error :';\n this.MEDIASOURCE_TYPE_UNSUPPORTED_MESSAGE = 'Error creating source buffer of type : ';\n }\n}\n\nlet errors = new Errors();\nexport default errors;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport Debug from '../core/Debug';\nimport DashJSError from './vo/DashJSError';\nimport FactoryMaker from '../core/FactoryMaker';\nimport Errors from '../core/errors/Errors';\nimport Settings from '../core/Settings';\nimport constants from './constants/Constants';\nimport {HTTPRequest} from './vo/metrics/HTTPRequest';\nimport Events from '../core/events/Events';\n\nconst APPEND_WINDOW_START_OFFSET = 0.1;\nconst APPEND_WINDOW_END_OFFSET = 0.01;\n\n/**\n * @class SourceBufferSink\n * @ignore\n * @implements FragmentSink\n */\n\nconst CHECK_INTERVAL = 50;\n\nfunction SourceBufferSink(config) {\n const context = this.context;\n const settings = Settings(context).getInstance();\n const textController = config.textController;\n const eventBus = config.eventBus;\n\n let instance,\n type,\n logger,\n buffer,\n mediaInfo,\n intervalId;\n\n let callbacks = [];\n let appendQueue = [];\n let isAppendingInProgress = false;\n let mediaSource = config.mediaSource;\n let lastRequestAppended = null;\n\n function setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n }\n\n function initializeForStreamSwitch(mInfo, selectedRepresentation, oldSourceBufferSink) {\n mediaInfo = mInfo;\n type = mediaInfo.type;\n const codec = mediaInfo.codec;\n\n _copyPreviousSinkData(oldSourceBufferSink);\n _addEventListeners();\n\n const promises = [];\n\n promises.push(_abortBeforeAppend());\n promises.push(updateAppendWindow(mediaInfo.streamInfo));\n\n if (settings.get().streaming.buffer.useChangeTypeForTrackSwitch) {\n promises.push(changeType(codec));\n }\n\n if (selectedRepresentation && selectedRepresentation.MSETimeOffset !== undefined) {\n promises.push(updateTimestampOffset(selectedRepresentation.MSETimeOffset));\n }\n\n return Promise.all(promises);\n }\n\n function changeType(codec) {\n return new Promise((resolve) => {\n _waitForUpdateEnd(() => {\n if (buffer.changeType) {\n buffer.changeType(codec);\n }\n resolve();\n });\n });\n }\n\n function _copyPreviousSinkData(oldSourceBufferSink) {\n buffer = oldSourceBufferSink.getBuffer();\n }\n\n function initializeForFirstUse(streamInfo, mInfo, selectedRepresentation) {\n mediaInfo = mInfo;\n type = mediaInfo.type;\n const codec = mediaInfo.codec;\n try {\n // Safari claims to support anything starting 'application/mp4'.\n // it definitely doesn't understand 'application/mp4;codecs=\"stpp\"'\n // - currently no browser does, so check for it and use our own\n // implementation. The same is true for codecs=\"wvtt\".\n if (codec.match(/application\\/mp4;\\s*codecs=\"(stpp|wvtt).*\"/i)) {\n return _initializeForText(streamInfo);\n }\n\n buffer = mediaSource.addSourceBuffer(codec);\n\n _addEventListeners();\n\n const promises = [];\n\n promises.push(updateAppendWindow(mediaInfo.streamInfo));\n\n if (selectedRepresentation && selectedRepresentation.MSETimeOffset !== undefined) {\n promises.push(updateTimestampOffset(selectedRepresentation.MSETimeOffset));\n }\n\n return Promise.all(promises);\n\n } catch (e) {\n // Note that in the following, the quotes are open to allow for extra text after stpp and wvtt\n if ((mediaInfo.type == constants.TEXT && !mediaInfo.isFragmented) || (codec.indexOf('codecs=\"stpp') !== -1) || (codec.indexOf('codecs=\"vtt') !== -1) || (codec.indexOf('text/vtt') !== -1)) {\n return _initializeForText(streamInfo);\n }\n return Promise.reject(e);\n }\n }\n\n function _initializeForText(streamInfo) {\n buffer = textController.getTextSourceBuffer(streamInfo);\n return Promise.resolve();\n }\n\n function _addEventListeners() {\n // use updateend event if possible\n if (typeof buffer.addEventListener === 'function') {\n try {\n buffer.addEventListener('updateend', _updateEndHandler, false);\n buffer.addEventListener('error', _errHandler, false);\n buffer.addEventListener('abort', _errHandler, false);\n\n } catch (err) {\n // use setInterval to periodically check if updating has been completed\n intervalId = setInterval(_updateEndHandler, CHECK_INTERVAL);\n }\n } else {\n // use setInterval to periodically check if updating has been completed\n intervalId = setInterval(_updateEndHandler, CHECK_INTERVAL);\n }\n }\n\n function getType() {\n return type;\n }\n\n function _removeEventListeners() {\n try {\n if (typeof buffer.removeEventListener === 'function') {\n buffer.removeEventListener('updateend', _updateEndHandler, false);\n buffer.removeEventListener('error', _errHandler, false);\n buffer.removeEventListener('abort', _errHandler, false);\n }\n clearInterval(intervalId);\n } catch (e) {\n logger.error(e);\n }\n }\n\n function updateAppendWindow(sInfo) {\n return new Promise((resolve) => {\n\n if (!buffer || !settings.get().streaming.buffer.useAppendWindow) {\n resolve();\n return;\n }\n\n _waitForUpdateEnd(() => {\n try {\n if (!buffer) {\n resolve();\n return;\n }\n\n let appendWindowEnd = mediaSource.duration;\n let appendWindowStart = 0;\n if (sInfo && !isNaN(sInfo.start) && !isNaN(sInfo.duration) && isFinite(sInfo.duration)) {\n appendWindowEnd = sInfo.start + sInfo.duration;\n }\n if (sInfo && !isNaN(sInfo.start)) {\n appendWindowStart = sInfo.start;\n }\n if (buffer.appendWindowEnd !== appendWindowEnd || buffer.appendWindowStart !== appendWindowStart) {\n buffer.appendWindowStart = 0;\n buffer.appendWindowEnd = appendWindowEnd + APPEND_WINDOW_END_OFFSET;\n buffer.appendWindowStart = Math.max(appendWindowStart - APPEND_WINDOW_START_OFFSET, 0);\n logger.debug(`Updated append window for ${mediaInfo.type}. Set start to ${buffer.appendWindowStart} and end to ${buffer.appendWindowEnd}`);\n }\n\n resolve();\n } catch (e) {\n logger.warn(`Failed to set append window`);\n resolve();\n }\n });\n });\n }\n\n function updateTimestampOffset(MSETimeOffset) {\n return new Promise((resolve) => {\n\n if (!buffer) {\n resolve();\n return;\n }\n\n _waitForUpdateEnd(() => {\n try {\n if (buffer.timestampOffset !== MSETimeOffset && !isNaN(MSETimeOffset)) {\n buffer.timestampOffset = MSETimeOffset;\n logger.debug(`Set MSE timestamp offset to ${MSETimeOffset}`);\n }\n resolve();\n } catch (e) {\n resolve();\n }\n });\n });\n }\n\n\n function reset() {\n if (buffer) {\n try {\n callbacks = [];\n _removeEventListeners();\n isAppendingInProgress = false;\n appendQueue = [];\n if (!buffer.getClassName || buffer.getClassName() !== 'TextSourceBuffer') {\n logger.debug(`Removing sourcebuffer from media source`);\n mediaSource.removeSourceBuffer(buffer);\n }\n } catch (e) {\n\n }\n buffer = null;\n }\n lastRequestAppended = null;\n }\n\n function getBuffer() {\n return buffer;\n }\n\n function getAllBufferRanges() {\n try {\n return buffer.buffered;\n } catch (e) {\n logger.error('getAllBufferRanges exception: ' + e.message);\n return null;\n }\n }\n\n function append(chunk, request = null) {\n return new Promise((resolve, reject) => {\n if (!chunk) {\n reject({\n chunk: chunk,\n error: new DashJSError(Errors.APPEND_ERROR_CODE, Errors.APPEND_ERROR_MESSAGE)\n });\n return;\n }\n appendQueue.push({ data: chunk, promise: { resolve, reject }, request });\n _waitForUpdateEnd(_appendNextInQueue.bind(this));\n });\n }\n\n function _abortBeforeAppend() {\n return new Promise((resolve) => {\n _waitForUpdateEnd(() => {\n // Save the append window, which is reset on abort().\n const appendWindowStart = buffer.appendWindowStart;\n const appendWindowEnd = buffer.appendWindowEnd;\n\n if (buffer) {\n buffer.abort();\n buffer.appendWindowStart = appendWindowStart;\n buffer.appendWindowEnd = appendWindowEnd;\n }\n resolve();\n });\n });\n }\n\n function remove(range) {\n return new Promise((resolve, reject) => {\n const start = range.start;\n const end = range.end;\n\n // make sure that the given time range is correct. Otherwise we will get InvalidAccessError\n if (!((start >= 0) && (end > start))) {\n resolve();\n return;\n }\n\n _waitForUpdateEnd(function () {\n try {\n buffer.remove(start, end);\n // updating is in progress, we should wait for it to complete before signaling that this operation is done\n _waitForUpdateEnd(function () {\n resolve({\n from: start,\n to: end,\n unintended: false\n });\n if (range.resolve) {\n range.resolve();\n }\n });\n } catch (err) {\n reject({\n from: start,\n to: end,\n unintended: false,\n error: new DashJSError(Errors.REMOVE_ERROR_CODE, Errors.REMOVE_ERROR_MESSAGE)\n });\n if (range.reject) {\n range.reject(err);\n }\n }\n });\n });\n }\n\n function _appendNextInQueue() {\n if (isAppendingInProgress) {\n return;\n }\n\n if (appendQueue.length > 0) {\n isAppendingInProgress = true;\n const nextChunk = appendQueue[0];\n appendQueue.splice(0, 1);\n\n const afterSuccess = function () {\n isAppendingInProgress = false;\n if (appendQueue.length > 0) {\n _appendNextInQueue.call(this);\n }\n // Init segments are cached. In any other case we dont need the chunk bytes anymore and can free the memory\n if (nextChunk && nextChunk.data && nextChunk.data.segmentType && nextChunk.data.segmentType !== HTTPRequest.INIT_SEGMENT_TYPE) {\n delete nextChunk.data.bytes;\n }\n nextChunk.promise.resolve({ chunk: nextChunk.data });\n };\n\n try {\n lastRequestAppended = nextChunk.request;\n if (nextChunk.data.bytes.byteLength === 0) {\n afterSuccess.call(this);\n } else {\n if (buffer.appendBuffer) {\n buffer.appendBuffer(nextChunk.data.bytes);\n } else {\n buffer.append(nextChunk.data.bytes, nextChunk.data);\n }\n // updating is in progress, we should wait for it to complete before signaling that this operation is done\n _waitForUpdateEnd(afterSuccess.bind(this));\n }\n } catch (err) {\n logger.fatal('SourceBuffer append failed \"' + err + '\"');\n if (appendQueue.length > 0) {\n _appendNextInQueue();\n } else {\n isAppendingInProgress = false;\n }\n\n delete nextChunk.data.bytes;\n nextChunk.promise.reject({ chunk: nextChunk.data, error: new DashJSError(err.code, err.message) });\n }\n }\n }\n\n function abort() {\n return new Promise((resolve) => {\n try {\n appendQueue = [];\n if (mediaSource.readyState === 'open') {\n _waitForUpdateEnd(() => {\n try {\n if (buffer) {\n buffer.abort();\n }\n resolve();\n } catch (e) {\n resolve();\n }\n });\n } else if (buffer && buffer.setTextTrack && mediaSource.readyState === 'ended') {\n buffer.abort(); //The cues need to be removed from the TextSourceBuffer via a call to abort()\n resolve();\n } else {\n resolve();\n }\n } catch (e) {\n resolve();\n }\n });\n }\n\n function _executeCallback() {\n if (callbacks.length > 0) {\n if (!buffer.updating) {\n const cb = callbacks.shift();\n cb();\n // Try to execute next callback if still not updating\n _executeCallback();\n }\n }\n }\n\n function _updateEndHandler() {\n // if updating is still in progress do nothing and wait for the next check again.\n if (buffer.updating) {\n return;\n }\n\n // updating is completed, now we can stop checking and resolve the promise\n _executeCallback();\n }\n\n function _errHandler(e) {\n const error = e.target || {};\n _triggerEvent(Events.SOURCE_BUFFER_ERROR, { error, lastRequestAppended })\n }\n\n function _triggerEvent(eventType, data) {\n let payload = data || {};\n eventBus.trigger(eventType, payload, { streamId: mediaInfo.streamInfo.id, mediaType: type });\n }\n\n function _waitForUpdateEnd(callback) {\n callbacks.push(callback);\n\n if (!buffer.updating) {\n _executeCallback();\n }\n }\n\n instance = {\n getType,\n getAllBufferRanges,\n getBuffer,\n append,\n remove,\n abort,\n reset,\n updateTimestampOffset,\n initializeForStreamSwitch,\n initializeForFirstUse,\n updateAppendWindow,\n changeType\n };\n\n setup();\n\n return instance;\n}\n\nSourceBufferSink.__dashjs_factory_name = 'SourceBufferSink';\nconst factory = FactoryMaker.getClassFactory(SourceBufferSink);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport Debug from '../core/Debug';\nimport FactoryMaker from '../core/FactoryMaker';\n\n/**\n * This is a sink that is used to temporarily hold onto media chunks before a video element is added.\n * The discharge() function is used to get the chunks out of the PreBuffer for adding to a real SourceBuffer.\n *\n * @class PreBufferSink\n * @ignore\n * @implements FragmentSink\n */\nfunction PreBufferSink(onAppendedCallback) {\n const context = this.context;\n\n let instance,\n logger,\n outstandingInit;\n let chunks = [];\n let onAppended = onAppendedCallback;\n\n function setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n }\n\n function reset() {\n chunks = [];\n outstandingInit = null;\n onAppended = null;\n }\n\n function append(chunk) {\n if (chunk.segmentType !== 'InitializationSegment') { //Init segments are stored in the initCache.\n chunks.push(chunk);\n chunks.sort(function (a, b) {\n return a.start - b.start;\n });\n outstandingInit = null;\n } else {//We need to hold an init chunk for when a corresponding media segment is being downloaded when the discharge happens.\n outstandingInit = chunk;\n }\n\n logger.debug('PreBufferSink appended chunk s: ' + chunk.start + '; e: ' + chunk.end);\n if (onAppended) {\n onAppended({\n chunk: chunk\n });\n }\n return Promise.resolve();\n }\n\n function remove(start, end) {\n chunks = chunks.filter(a => !((isNaN(end) || a.start < end) && (isNaN(start) || a.end > start))); //The opposite of the getChunks predicate.\n return Promise.resolve();\n }\n\n //Nothing async, nothing to abort.\n function abort() {\n return Promise.resolve();\n }\n\n function getAllBufferRanges() {\n let ranges = [];\n\n for (let i = 0; i < chunks.length; i++) {\n let chunk = chunks[i];\n if (ranges.length === 0 || chunk.start > ranges[ranges.length - 1].end) {\n ranges.push({start: chunk.start, end: chunk.end});\n } else {\n ranges[ranges.length - 1].end = chunk.end;\n }\n }\n\n //Implements TimeRanges interface. So acts just like sourceBuffer.buffered.\n const timeranges = {\n start: function (n) {\n return ranges[n].start;\n },\n end: function (n) {\n return ranges[n].end;\n }\n };\n\n Object.defineProperty(timeranges, 'length', {\n get: function () {\n return ranges.length;\n }\n });\n\n return timeranges;\n }\n\n function updateTimestampOffset() {\n return Promise.resolve();\n }\n\n function getBuffer() {\n return this;\n }\n\n /**\n * Return the all chunks in the buffer the lie between times start and end.\n * Because a chunk cannot be split, this returns the full chunk if any part of its time lies in the requested range.\n * Chunks are removed from the buffer when they are discharged.\n * @function PreBufferSink#discharge\n * @param {?Number} start The start time from which to discharge from the buffer. If NaN, it is regarded as unbounded.\n * @param {?Number} end The end time from which to discharge from the buffer. If NaN, it is regarded as unbounded.\n * @returns {Array} The set of chunks from the buffer within the time ranges.\n */\n function discharge(start, end) {\n const result = getChunksAt(start, end);\n if (outstandingInit) {\n result.push(outstandingInit);\n outstandingInit = null;\n }\n\n remove(start, end);\n\n return result;\n }\n\n function getChunksAt(start, end) {\n return chunks.filter(a => ((isNaN(end) || a.start < end) && (isNaN(start) || a.end > start)));\n }\n\n function waitForUpdateEnd(callback) {\n callback();\n }\n\n instance = {\n getAllBufferRanges,\n append,\n remove,\n abort,\n discharge,\n reset,\n updateTimestampOffset,\n waitForUpdateEnd,\n getBuffer\n };\n\n setup();\n\n return instance;\n}\n\nPreBufferSink.__dashjs_factory_name = 'PreBufferSink';\nconst factory = FactoryMaker.getClassFactory(PreBufferSink);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n * Represents data structure to keep and drive {DataChunk}\n */\n\nimport FactoryMaker from '../../core/FactoryMaker';\n\nfunction InitCache() {\n\n let data = {};\n\n function save (chunk) {\n const id = chunk.streamId;\n const representationId = chunk.representationId;\n\n data[id] = data[id] || {};\n data[id][representationId] = chunk;\n }\n\n function extract (streamId, representationId) {\n if (data && data[streamId] && data[streamId][representationId]) {\n return data[streamId][representationId];\n } else {\n return null;\n }\n }\n\n\n function reset () {\n data = {};\n }\n\n const instance = {\n save: save,\n extract: extract,\n reset: reset\n };\n\n return instance;\n}\n\nInitCache.__dashjs_factory_name = 'InitCache';\nexport default FactoryMaker.getSingletonFactory(InitCache);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport Constants from '../constants/Constants';\nimport MetricsConstants from '../constants/MetricsConstants';\nimport FragmentModel from '../models/FragmentModel';\nimport SourceBufferSink from '../SourceBufferSink';\nimport PreBufferSink from '../PreBufferSink';\nimport EventBus from '../../core/EventBus';\nimport Events from '../../core/events/Events';\nimport FactoryMaker from '../../core/FactoryMaker';\nimport Debug from '../../core/Debug';\nimport InitCache from '../utils/InitCache';\nimport DashJSError from '../vo/DashJSError';\nimport Errors from '../../core/errors/Errors';\nimport {HTTPRequest} from '../vo/metrics/HTTPRequest';\nimport MediaPlayerEvents from '../../streaming/MediaPlayerEvents';\n\nconst BUFFER_END_THRESHOLD = 0.5;\nconst BUFFER_RANGE_CALCULATION_THRESHOLD = 0.01;\nconst QUOTA_EXCEEDED_ERROR_CODE = 22;\n\nconst BUFFER_CONTROLLER_TYPE = 'BufferController';\n\nfunction BufferController(config) {\n\n config = config || {};\n const context = this.context;\n const eventBus = EventBus(context).getInstance();\n const errHandler = config.errHandler;\n const fragmentModel = config.fragmentModel;\n const representationController = config.representationController;\n const adapter = config.adapter;\n const textController = config.textController;\n const abrController = config.abrController;\n const playbackController = config.playbackController;\n const streamInfo = config.streamInfo;\n const type = config.type;\n const settings = config.settings;\n\n let instance,\n logger,\n isBufferingCompleted,\n bufferLevel,\n criticalBufferLevel,\n mediaSource,\n maxAppendedIndex,\n maximumIndex,\n sourceBufferSink,\n dischargeBuffer,\n isPrebuffering,\n dischargeFragments,\n bufferState,\n appendedBytesInfo,\n wallclockTicked,\n isPruningInProgress,\n isQuotaExceeded,\n initCache,\n pendingPruningRanges,\n replacingBuffer,\n seekTarget;\n\n\n function setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n initCache = InitCache(context).getInstance();\n\n resetInitialSettings();\n }\n\n /**\n * Initialize the BufferController. Sets the media source and registers the event handlers.\n * @param {object} mediaSource\n */\n function initialize(mediaSource) {\n setMediaSource(mediaSource);\n\n eventBus.on(Events.INIT_FRAGMENT_LOADED, _onInitFragmentLoaded, instance);\n eventBus.on(Events.MEDIA_FRAGMENT_LOADED, _onMediaFragmentLoaded, instance);\n eventBus.on(Events.WALLCLOCK_TIME_UPDATED, _onWallclockTimeUpdated, instance);\n\n eventBus.on(MediaPlayerEvents.PLAYBACK_PLAYING, _onPlaybackPlaying, instance);\n eventBus.on(MediaPlayerEvents.PLAYBACK_PROGRESS, _onPlaybackProgression, instance);\n eventBus.on(MediaPlayerEvents.PLAYBACK_TIME_UPDATED, _onPlaybackProgression, instance);\n eventBus.on(MediaPlayerEvents.PLAYBACK_RATE_CHANGED, _onPlaybackRateChanged, instance);\n eventBus.on(MediaPlayerEvents.PLAYBACK_STALLED, _onPlaybackStalled, instance);\n }\n\n /**\n * Returns the stream id\n * @return {string}\n */\n function getStreamId() {\n return streamInfo.id;\n }\n\n /**\n * Returns the media type\n * @return {type}\n */\n function getType() {\n return type;\n }\n\n /**\n * Returns the type of the BufferController. We distinguish between standard buffer controllers and buffer controllers related to texttracks.\n * @return {string}\n */\n function getBufferControllerType() {\n return BUFFER_CONTROLLER_TYPE;\n }\n\n /**\n * Sets the mediasource.\n * @param {object} value\n * @param {object} mediaInfo\n */\n function setMediaSource(value, mediaInfo = null) {\n return new Promise((resolve, reject) => {\n mediaSource = value;\n // if we have a prebuffer, we should prepare to discharge it, and make a new sourceBuffer ready\n if (sourceBufferSink && mediaInfo && typeof sourceBufferSink.discharge === 'function') {\n dischargeBuffer = sourceBufferSink;\n createBufferSink(mediaInfo)\n .then(() => {\n resolve();\n })\n .catch((e) => {\n reject(e);\n })\n } else {\n resolve();\n }\n })\n\n }\n\n /**\n * Get the RepresentationInfo for a certain quality.\n * @param {number} quality\n * @return {object}\n * @private\n */\n function _getRepresentationInfo(quality) {\n return adapter.convertRepresentationToRepresentationInfo(representationController.getRepresentationForQuality(quality));\n }\n\n /**\n * Creates a SourceBufferSink object\n * @param {object} mediaInfo\n * @param {array} oldBufferSinks\n * @return {Promise<Object>} SourceBufferSink\n */\n function createBufferSink(mediaInfo, oldBufferSinks = []) {\n return new Promise((resolve, reject) => {\n if (!initCache || !mediaInfo) {\n resolve(null);\n return;\n }\n if (mediaSource) {\n isPrebuffering = false;\n _initializeSinkForMseBuffering(mediaInfo, oldBufferSinks)\n .then((sink) => {\n resolve(sink);\n })\n .catch((e) => {\n reject(e);\n })\n } else {\n isPrebuffering = true;\n _initializeSinkForPrebuffering()\n .then((sink) => {\n resolve(sink);\n })\n .catch((e) => {\n reject(e);\n })\n }\n });\n }\n\n function _initializeSinkForPrebuffering() {\n return new Promise((resolve, reject) => {\n const requiredQuality = abrController.getQualityFor(type, streamInfo.id);\n sourceBufferSink = PreBufferSink(context).create(_onAppended.bind(this));\n updateBufferTimestampOffset(_getRepresentationInfo(requiredQuality))\n .then(() => {\n resolve(sourceBufferSink);\n })\n .catch(() => {\n reject();\n })\n })\n }\n\n function _initializeSinkForMseBuffering(mediaInfo, oldBufferSinks) {\n return new Promise((resolve, reject) => {\n const requiredQuality = abrController.getQualityFor(type, streamInfo.id);\n sourceBufferSink = SourceBufferSink(context).create({\n mediaSource,\n textController,\n eventBus\n });\n _initializeSink(mediaInfo, oldBufferSinks, requiredQuality)\n .then(() => {\n return updateBufferTimestampOffset(_getRepresentationInfo(requiredQuality));\n })\n .then(() => {\n resolve(sourceBufferSink);\n })\n .catch((e) => {\n logger.fatal('Caught error on create SourceBuffer: ' + e);\n errHandler.error(new DashJSError(Errors.MEDIASOURCE_TYPE_UNSUPPORTED_CODE, Errors.MEDIASOURCE_TYPE_UNSUPPORTED_MESSAGE + type));\n reject(e);\n });\n })\n }\n\n function _initializeSink(mediaInfo, oldBufferSinks, requiredQuality) {\n const selectedRepresentation = _getRepresentationInfo(requiredQuality);\n\n if (oldBufferSinks && oldBufferSinks[type] && (type === Constants.VIDEO || type === Constants.AUDIO)) {\n return sourceBufferSink.initializeForStreamSwitch(mediaInfo, selectedRepresentation, oldBufferSinks[type]);\n } else {\n return sourceBufferSink.initializeForFirstUse(streamInfo, mediaInfo, selectedRepresentation);\n }\n }\n\n function dischargePreBuffer() {\n if (sourceBufferSink && dischargeBuffer && typeof dischargeBuffer.discharge === 'function') {\n const ranges = dischargeBuffer.getAllBufferRanges();\n\n if (ranges.length > 0) {\n let rangeStr = 'Beginning ' + type + 'PreBuffer discharge, adding buffer for:';\n for (let i = 0; i < ranges.length; i++) {\n rangeStr += ' start: ' + ranges.start(i) + ', end: ' + ranges.end(i) + ';';\n }\n logger.debug(rangeStr);\n } else {\n logger.debug('PreBuffer discharge requested, but there were no media segments in the PreBuffer.');\n }\n\n //A list of fragments to supress bytesAppended events for. This makes transferring from a prebuffer to a sourcebuffer silent.\n dischargeFragments = [];\n let chunks = dischargeBuffer.discharge();\n let lastInit = null;\n for (let j = 0; j < chunks.length; j++) {\n const chunk = chunks[j];\n if (chunk.segmentType !== HTTPRequest.INIT_SEGMENT_TYPE) {\n const initChunk = initCache.extract(chunk.streamId, chunk.representationId);\n if (initChunk) {\n if (lastInit !== initChunk) {\n dischargeFragments.push(initChunk);\n sourceBufferSink.append(initChunk);\n lastInit = initChunk;\n }\n }\n }\n dischargeFragments.push(chunk);\n sourceBufferSink.append(chunk);\n }\n\n dischargeBuffer.reset();\n dischargeBuffer = null;\n }\n }\n\n\n /**\n * Callback handler when init segment has been loaded. Based on settings, the init segment is saved to the cache, and appended to the buffer.\n * @param {object} e\n * @private\n */\n function _onInitFragmentLoaded(e) {\n if (settings.get().streaming.cacheInitSegments) {\n logger.info('Init fragment finished loading saving to', type + '\\'s init cache');\n initCache.save(e.chunk);\n }\n logger.debug('Append Init fragment', type, ' with representationId:', e.chunk.representationId, ' and quality:', e.chunk.quality, ', data size:', e.chunk.bytes.byteLength);\n _appendToBuffer(e.chunk);\n }\n\n /**\n * Append the init segment for a certain representation to the buffer. If the init segment is cached we take the one from the cache. Otherwise the function returns false and the segment has to be requested again.\n * @param {string} representationId\n * @return {boolean}\n */\n function appendInitSegmentFromCache(representationId) {\n // Get init segment from cache\n const chunk = initCache.extract(streamInfo.id, representationId);\n\n if (!chunk) {\n // Init segment not in cache, shall be requested\n return false;\n }\n\n // Append init segment into buffer\n logger.info('Append Init fragment', type, ' with representationId:', chunk.representationId, ' and quality:', chunk.quality, ', data size:', chunk.bytes.byteLength);\n _appendToBuffer(chunk);\n\n return true;\n }\n\n /**\n * Calls the _appendToBuffer function to append the segment to the buffer. In case of a track switch the buffer might be cleared.\n * @param {object} e\n */\n function _onMediaFragmentLoaded(e) {\n _appendToBuffer(e.chunk, e.request);\n }\n\n /**\n * Append data to the MSE buffer using the SourceBufferSink\n * @param {object} chunk\n * @param {object} request\n * @private\n */\n function _appendToBuffer(chunk, request = null) {\n if (!sourceBufferSink) {\n return;\n }\n sourceBufferSink.append(chunk, request)\n .then((e) => {\n _onAppended(e);\n })\n .catch((e) => {\n _onAppended(e);\n });\n\n if (chunk.mediaInfo.type === Constants.VIDEO) {\n _triggerEvent(Events.VIDEO_CHUNK_RECEIVED, { chunk: chunk });\n }\n }\n\n function _showBufferRanges(ranges) {\n if (ranges && ranges.length > 0) {\n for (let i = 0, len = ranges.length; i < len; i++) {\n logger.debug('Buffered range: ' + ranges.start(i) + ' - ' + ranges.end(i) + ', currentTime = ', playbackController.getTime());\n }\n }\n }\n\n function _onAppended(e) {\n if (e.error) {\n // If we receive a QUOTA_EXCEEDED_ERROR_CODE we should adjust the target buffer times to avoid this error in the future.\n if (e.error.code === QUOTA_EXCEEDED_ERROR_CODE) {\n _handleQuotaExceededError();\n }\n if (e.error.code === QUOTA_EXCEEDED_ERROR_CODE || !hasEnoughSpaceToAppend()) {\n logger.warn('Clearing playback buffer to overcome quota exceed situation');\n // Notify ScheduleController to stop scheduling until buffer has been pruned\n _triggerEvent(Events.QUOTA_EXCEEDED, {\n criticalBufferLevel: criticalBufferLevel,\n quotaExceededTime: e.chunk.start\n });\n clearBuffers(getClearRanges());\n }\n return;\n }\n\n // Check if session has not been stopped in the meantime (while last segment was being appended)\n if (!sourceBufferSink) return;\n\n _updateBufferLevel();\n\n isQuotaExceeded = false;\n appendedBytesInfo = e.chunk;\n\n if (!appendedBytesInfo || !appendedBytesInfo.endFragment) {\n return;\n }\n\n if (appendedBytesInfo && !isNaN(appendedBytesInfo.index)) {\n maxAppendedIndex = Math.max(appendedBytesInfo.index, maxAppendedIndex);\n _checkIfBufferingCompleted();\n }\n\n const ranges = sourceBufferSink.getAllBufferRanges();\n if (appendedBytesInfo.segmentType === HTTPRequest.MEDIA_SEGMENT_TYPE) {\n _showBufferRanges(ranges);\n _onPlaybackProgression();\n _adjustSeekTarget();\n }\n\n let suppressAppendedEvent = false;\n if (dischargeFragments) {\n if (dischargeFragments.indexOf(appendedBytesInfo) > 0) {\n suppressAppendedEvent = true;\n }\n dischargeFragments = null;\n }\n\n if (appendedBytesInfo && !suppressAppendedEvent) {\n _triggerEvent(Events.BYTES_APPENDED_END_FRAGMENT, {\n quality: appendedBytesInfo.quality,\n startTime: appendedBytesInfo.start,\n index: appendedBytesInfo.index,\n bufferedRanges: ranges,\n segmentType: appendedBytesInfo.segmentType,\n mediaType: type\n });\n }\n }\n\n /**\n * In some cases the segment we requested might start at a different time than we initially aimed for. segments timeline/template tolerance.\n * We might need to do an internal seek if there is drift.\n * @private\n */\n function _adjustSeekTarget() {\n if (isNaN(seekTarget) || isPrebuffering) return;\n // Check buffered data only for audio and video\n if (type !== Constants.AUDIO && type !== Constants.VIDEO) {\n seekTarget = NaN;\n return;\n }\n\n // Check if current buffered range already contains seek target (and current video element time)\n const currentTime = playbackController.getTime();\n const rangeAtCurrenTime = getRangeAt(currentTime, 0);\n const rangeAtSeekTarget = getRangeAt(seekTarget, 0);\n if (rangeAtCurrenTime && rangeAtSeekTarget && rangeAtCurrenTime.start === rangeAtSeekTarget.start) {\n seekTarget = NaN;\n return;\n }\n\n // Get buffered range corresponding to the seek target\n const segmentDuration = representationController.getCurrentRepresentation().segmentDuration;\n const range = getRangeAt(seekTarget, segmentDuration);\n if (!range) return;\n\n if (settings.get().streaming.buffer.enableSeekDecorrelationFix && Math.abs(currentTime - seekTarget) > segmentDuration) {\n // If current video model time is decorrelated from seek target (and appended buffer) then seek video element\n // (in case of live streams on some browsers/devices for which we can't set video element time at unavalaible range)\n\n // Check if appended segment is not anterior from seek target (segments timeline/template tolerance)\n if (seekTarget <= range.end) {\n // Seek video element to seek target or range start if appended buffer starts after seek target (segments timeline/template tolerance)\n playbackController.seek(Math.max(seekTarget, range.start), false, true);\n }\n } else if (currentTime < range.start) {\n // If appended buffer starts after seek target (segments timeline/template tolerance) then seek to range start\n playbackController.seek(range.start, false, true);\n }\n }\n\n function _handleQuotaExceededError() {\n isQuotaExceeded = true;\n criticalBufferLevel = getTotalBufferedTime() * 0.8;\n logger.warn('Quota exceeded, Critical Buffer: ' + criticalBufferLevel);\n\n if (criticalBufferLevel > 0) {\n // recalculate buffer lengths according to criticalBufferLevel\n const bufferToKeep = Math.max(0.2 * criticalBufferLevel, 1);\n const bufferAhead = criticalBufferLevel - bufferToKeep;\n const bufferTimeAtTopQuality = Math.min(settings.get().streaming.buffer.bufferTimeAtTopQuality, bufferAhead * 0.9);\n const bufferTimeAtTopQualityLongForm = Math.min(settings.get().streaming.buffer.bufferTimeAtTopQualityLongForm, bufferAhead * 0.9);\n const s = {\n streaming: {\n buffer: {\n bufferToKeep: parseFloat(bufferToKeep.toFixed(5)),\n bufferTimeAtTopQuality: parseFloat(bufferTimeAtTopQuality.toFixed(5)),\n bufferTimeAtTopQualityLongForm: parseFloat(bufferTimeAtTopQualityLongForm.toFixed(5))\n }\n }\n };\n settings.update(s);\n }\n }\n\n //**********************************************************************\n // START Buffer Level, State & Sufficiency Handling.\n //**********************************************************************\n function prepareForPlaybackSeek() {\n if (isBufferingCompleted) {\n setIsBufferingCompleted(false);\n }\n\n // Abort the current request and empty all possible segments to be appended\n return sourceBufferSink.abort();\n }\n\n function prepareForReplacementTrackSwitch(codec) {\n return new Promise((resolve, reject) => {\n sourceBufferSink.abort()\n .then(() => {\n return updateAppendWindow();\n })\n .then(() => {\n if (settings.get().streaming.buffer.useChangeTypeForTrackSwitch) {\n return sourceBufferSink.changeType(codec);\n }\n\n return Promise.resolve();\n })\n .then(() => {\n return pruneAllSafely();\n })\n .then(() => {\n setIsBufferingCompleted(false);\n resolve();\n })\n .catch((e) => {\n reject(e);\n });\n });\n }\n\n function prepareForForceReplacementQualitySwitch(representationInfo) {\n return new Promise((resolve, reject) => {\n sourceBufferSink.abort()\n .then(() => {\n return updateAppendWindow();\n })\n .then(() => {\n return pruneAllSafely();\n })\n .then(() => {\n // In any case we need to update the MSE.timeOffset\n return updateBufferTimestampOffset(representationInfo)\n })\n .then(() => {\n setIsBufferingCompleted(false);\n resolve();\n })\n .catch((e) => {\n reject(e);\n });\n });\n }\n\n function prepareForNonReplacementTrackSwitch(codec) {\n return new Promise((resolve, reject) => {\n updateAppendWindow()\n .then(() => {\n if (settings.get().streaming.buffer.useChangeTypeForTrackSwitch) {\n return sourceBufferSink.changeType(codec);\n }\n\n return Promise.resolve();\n })\n .then(() => {\n resolve();\n })\n .catch((e) => {\n reject(e);\n });\n });\n }\n\n function pruneAllSafely() {\n return new Promise((resolve, reject) => {\n let ranges = getAllRangesWithSafetyFactor();\n\n if (!ranges || ranges.length === 0) {\n _onPlaybackProgression();\n resolve();\n return;\n }\n\n clearBuffers(ranges)\n .then(() => {\n resolve();\n })\n .catch((e) => {\n reject(e);\n });\n });\n }\n\n function getAllRangesWithSafetyFactor(seekTime) {\n const clearRanges = [];\n const ranges = sourceBufferSink.getAllBufferRanges();\n\n // no valid ranges\n if (!ranges || ranges.length === 0) {\n return clearRanges;\n }\n\n // if no target time is provided we clear everyhing\n if ((!seekTime && seekTime !== 0) || isNaN(seekTime)) {\n clearRanges.push({\n start: ranges.start(0),\n end: ranges.end(ranges.length - 1) + BUFFER_END_THRESHOLD\n });\n }\n\n // otherwise we need to calculate the correct pruning range\n else {\n\n const behindPruningRange = _getRangeBehindForPruning(seekTime, ranges);\n const aheadPruningRange = _getRangeAheadForPruning(seekTime, ranges);\n\n if (behindPruningRange) {\n clearRanges.push(behindPruningRange);\n }\n\n if (aheadPruningRange) {\n clearRanges.push(aheadPruningRange);\n }\n }\n\n return clearRanges;\n }\n\n function _getRangeBehindForPruning(targetTime, ranges) {\n const bufferToKeepBehind = settings.get().streaming.buffer.bufferToKeep;\n const startOfBuffer = ranges.start(0);\n\n // if we do a seek ahead of the current play position we do need to prune behind the new play position\n const behindDiff = targetTime - startOfBuffer;\n if (behindDiff > bufferToKeepBehind) {\n\n let rangeEnd = Math.max(0, targetTime - bufferToKeepBehind);\n // Ensure we keep full range of current fragment\n const currentTimeRequest = fragmentModel.getRequests({\n state: FragmentModel.FRAGMENT_MODEL_EXECUTED,\n time: targetTime,\n threshold: BUFFER_RANGE_CALCULATION_THRESHOLD\n })[0];\n\n if (currentTimeRequest) {\n rangeEnd = Math.min(currentTimeRequest.startTime, rangeEnd);\n }\n if (rangeEnd > 0) {\n return {\n start: startOfBuffer,\n end: rangeEnd\n };\n }\n }\n\n return null;\n }\n\n function _getRangeAheadForPruning(targetTime, ranges) {\n // if we do a seek behind the current play position we do need to prune ahead of the new play position\n // we keep everything that is within bufferToKeepAhead but only if the buffer is continuous.\n // Otherwise we have gaps once the seek is done which might trigger an unintentional gap jump\n const endOfBuffer = ranges.end(ranges.length - 1) + BUFFER_END_THRESHOLD;\n const continuousBufferTime = getContinuousBufferTimeForTargetTime(targetTime);\n\n // This is the maximum range we keep ahead\n const isLongFormContent = streamInfo.manifestInfo.duration >= settings.get().streaming.buffer.longFormContentDurationThreshold;\n const bufferToKeepAhead = isLongFormContent ? settings.get().streaming.buffer.bufferTimeAtTopQualityLongForm : settings.get().streaming.buffer.bufferTimeAtTopQuality;\n\n // Define the start time from which we will prune. If there is no continuous range from the targettime we start immediately at the target time\n // Otherwise we set the start point to the end of the continuous range taking the maximum buffer to keep ahead into account\n let rangeStart = !isNaN(continuousBufferTime) ? Math.min(continuousBufferTime, targetTime + bufferToKeepAhead) : targetTime;\n\n // Check if we are done buffering, no need to prune then\n if (rangeStart >= ranges.end(ranges.length - 1)) {\n return null\n }\n\n // Ensure we keep full range of current fragment\n const currentTimeRequest = fragmentModel.getRequests({\n state: FragmentModel.FRAGMENT_MODEL_EXECUTED,\n time: targetTime,\n threshold: BUFFER_RANGE_CALCULATION_THRESHOLD\n })[0];\n\n if (currentTimeRequest) {\n rangeStart = Math.max(currentTimeRequest.startTime + currentTimeRequest.duration, rangeStart);\n }\n\n // Never remove the contiguous range of targetTime in order to avoid flushes & reenqueues when the user doesn't want it\n const avoidCurrentTimeRangePruning = settings.get().streaming.buffer.avoidCurrentTimeRangePruning;\n if (avoidCurrentTimeRangePruning) {\n for (let i = 0; i < ranges.length; i++) {\n if (ranges.start(i) <= targetTime && targetTime <= ranges.end(i)\n && ranges.start(i) <= rangeStart && rangeStart <= ranges.end(i)) {\n let oldRangeStart = rangeStart;\n if (i + 1 < ranges.length) {\n rangeStart = ranges.start(i + 1);\n } else {\n rangeStart = ranges.end(i) + 1;\n }\n logger.debug('Buffered range [' + ranges.start(i) + ', ' + ranges.end(i) + '] overlaps with targetTime ' + targetTime + ' and range to be pruned [' + oldRangeStart + ', ' + endOfBuffer + '], using [' + rangeStart + ', ' + endOfBuffer + '] instead' + ((rangeStart < endOfBuffer) ? '' : ' (no actual pruning)'));\n break;\n }\n }\n }\n\n if (rangeStart < ranges.end(ranges.length - 1)) {\n return {\n start: rangeStart,\n end: endOfBuffer\n };\n }\n return null;\n }\n\n\n function _onPlaybackProgression() {\n if (!replacingBuffer || (type === Constants.TEXT && textController.isTextEnabled())) {\n _updateBufferLevel();\n }\n }\n\n function _onPlaybackStalled() {\n checkIfSufficientBuffer();\n }\n\n function _onPlaybackPlaying() {\n checkIfSufficientBuffer();\n seekTarget = NaN;\n }\n\n function hasBufferAtTime(time) {\n try {\n const ranges = sourceBufferSink.getAllBufferRanges();\n\n if (!ranges || ranges.length === 0) {\n return false;\n }\n\n let i = 0;\n\n while (i < ranges.length) {\n const start = ranges.start(i);\n const end = ranges.end(i);\n\n if (time >= start && time <= end) {\n return true;\n }\n\n i += 1;\n }\n\n return false\n\n } catch (e) {\n logger.error(e);\n return false;\n }\n }\n\n function getRangeAt(time, tolerance) {\n if (!sourceBufferSink) {\n return null;\n }\n const ranges = sourceBufferSink.getAllBufferRanges();\n let start = 0;\n let end = 0;\n let firstStart = null;\n let lastEnd = null;\n let gap = 0;\n let len,\n i;\n\n const toler = !isNaN(tolerance) ? tolerance : 0.15;\n\n if (ranges !== null && ranges !== undefined) {\n for (i = 0, len = ranges.length; i < len; i++) {\n start = ranges.start(i);\n end = ranges.end(i);\n if (firstStart === null) {\n gap = Math.abs(start - time);\n if (time >= start && time < end) {\n // start the range\n firstStart = start;\n lastEnd = end;\n } else if (gap <= toler) {\n // start the range even though the buffer does not contain time 0\n firstStart = start;\n lastEnd = end;\n }\n } else {\n gap = start - lastEnd;\n if (gap <= toler) {\n // the discontinuity is smaller than the tolerance, combine the ranges\n lastEnd = end;\n } else {\n break;\n }\n }\n }\n\n if (firstStart !== null) {\n return {\n start: firstStart,\n end: lastEnd\n };\n }\n }\n\n return null;\n }\n\n function getBufferLength(time, tolerance) {\n let range,\n length;\n\n // Consider gap/discontinuity limit as tolerance\n if (settings.get().streaming.gaps.jumpGaps) {\n tolerance = settings.get().streaming.gaps.smallGapLimit;\n }\n\n range = getRangeAt(time, tolerance);\n\n if (range === null) {\n length = 0;\n } else {\n length = range.end - time;\n }\n\n return length;\n }\n\n function _updateBufferLevel() {\n if (playbackController) {\n let referenceTime = playbackController.getTime() || 0;\n // In case we are prebuffering we dont have a current time yet\n if (isPrebuffering) {\n referenceTime = !isNaN(seekTarget) ? seekTarget : 0;\n }\n const tolerance = settings.get().streaming.gaps.jumpGaps && !isNaN(settings.get().streaming.gaps.smallGapLimit) ? settings.get().streaming.gaps.smallGapLimit : NaN;\n bufferLevel = Math.max(getBufferLength(referenceTime, tolerance), 0);\n _triggerEvent(Events.BUFFER_LEVEL_UPDATED, { mediaType: type, bufferLevel: bufferLevel });\n checkIfSufficientBuffer();\n }\n }\n\n function _checkIfBufferingCompleted() {\n const isLastIdxAppended = maxAppendedIndex >= maximumIndex - 1; // Handles 0 and non 0 based request index\n // To avoid rounding error when comparing, the stream time and buffer level only must be within 5 decimal places\n const periodBuffered = playbackController.getTimeToStreamEnd(streamInfo) - bufferLevel < 0.00001;\n if ((isLastIdxAppended || periodBuffered) && !isBufferingCompleted) {\n setIsBufferingCompleted(true);\n logger.debug(`checkIfBufferingCompleted trigger BUFFERING_COMPLETED for stream id ${streamInfo.id} and type ${type}`);\n }\n }\n\n function checkIfSufficientBuffer() {\n // No need to check buffer if type is not audio or video (for example if several errors occur during text parsing, so that the buffer cannot be filled, no error must occur on video playback)\n if (type !== Constants.AUDIO && type !== Constants.VIDEO) return;\n\n // When the player is working in low latency mode, the buffer is often below STALL_THRESHOLD.\n // So, when in low latency mode, change dash.js behavior so it notifies a stall just when\n // buffer reach 0 seconds\n if (((!playbackController.getLowLatencyModeEnabled() && bufferLevel < settings.get().streaming.buffer.stallThreshold) || bufferLevel === 0) && !isBufferingCompleted) {\n _notifyBufferStateChanged(MetricsConstants.BUFFER_EMPTY);\n } else {\n if (isBufferingCompleted || bufferLevel >= settings.get().streaming.buffer.stallThreshold || (playbackController.getLowLatencyModeEnabled() && bufferLevel > 0)) {\n _notifyBufferStateChanged(MetricsConstants.BUFFER_LOADED);\n }\n }\n }\n\n function _notifyBufferStateChanged(state) {\n if (bufferState === state ||\n (state === MetricsConstants.BUFFER_EMPTY && playbackController.getTime() === 0) || // Don't trigger BUFFER_EMPTY if it's initial loading\n (type === Constants.TEXT && !textController.isTextEnabled())) {\n return;\n }\n\n bufferState = state;\n\n _triggerEvent(Events.BUFFER_LEVEL_STATE_CHANGED, { state: state });\n _triggerEvent(state === MetricsConstants.BUFFER_LOADED ? Events.BUFFER_LOADED : Events.BUFFER_EMPTY);\n logger.debug(state === MetricsConstants.BUFFER_LOADED ? 'Got enough buffer to start' : 'Waiting for more buffer before starting playback');\n }\n\n /* prune buffer on our own in background to avoid browsers pruning buffer silently */\n function pruneBuffer() {\n if (!sourceBufferSink || type === Constants.TEXT) {\n return;\n }\n\n if (!isBufferingCompleted) {\n clearBuffers(getClearRanges());\n }\n }\n\n function getClearRanges() {\n const clearRanges = [];\n const ranges = sourceBufferSink.getAllBufferRanges();\n if (!ranges || ranges.length === 0) {\n return clearRanges;\n }\n\n const currentTime = playbackController.getTime();\n let startRangeToKeep = Math.max(0, currentTime - settings.get().streaming.buffer.bufferToKeep);\n\n const currentTimeRequest = fragmentModel.getRequests({\n state: FragmentModel.FRAGMENT_MODEL_EXECUTED,\n time: currentTime,\n threshold: BUFFER_RANGE_CALCULATION_THRESHOLD\n })[0];\n\n // Ensure we keep full range of current fragment\n if (currentTimeRequest) {\n startRangeToKeep = Math.min(currentTimeRequest.startTime, startRangeToKeep);\n } else if (currentTime === 0 && playbackController.getIsDynamic()) {\n // Don't prune before the live stream starts, it messes with low latency\n return [];\n }\n\n if (ranges.start(0) <= startRangeToKeep) {\n const behindRange = {\n start: 0,\n end: startRangeToKeep\n };\n for (let i = 0; i < ranges.length && ranges.end(i) <= startRangeToKeep; i++) {\n behindRange.end = ranges.end(i);\n }\n if (behindRange.start < behindRange.end) {\n clearRanges.push(behindRange);\n }\n }\n\n return clearRanges;\n }\n\n function clearBuffers(ranges) {\n return new Promise((resolve, reject) => {\n if (!ranges || !sourceBufferSink || ranges.length === 0) {\n resolve();\n return;\n }\n\n const promises = [];\n ranges.forEach((range) => {\n promises.push(_addClearRangeWithPromise(range));\n });\n\n\n if (!isPruningInProgress) {\n clearNextRange();\n }\n\n Promise.all(promises)\n .then(() => {\n resolve();\n })\n .catch((e) => {\n reject(e);\n });\n });\n }\n\n function _addClearRangeWithPromise(range) {\n return new Promise((resolve, reject) => {\n range.resolve = resolve;\n range.reject = reject;\n pendingPruningRanges.push(range);\n });\n }\n\n function clearNextRange() {\n try {\n // If there's nothing to prune reset state\n if (pendingPruningRanges.length === 0 || !sourceBufferSink) {\n logger.debug('Nothing to prune, halt pruning');\n pendingPruningRanges = [];\n isPruningInProgress = false;\n return;\n }\n\n const sourceBuffer = sourceBufferSink.getBuffer();\n // If there's nothing buffered any pruning is invalid, so reset our state\n if (!sourceBuffer || !sourceBuffer.buffered || sourceBuffer.buffered.length === 0) {\n logger.debug('SourceBuffer is empty (or does not exist), halt pruning');\n pendingPruningRanges = [];\n isPruningInProgress = false;\n return;\n }\n\n const range = pendingPruningRanges.shift();\n logger.debug(`${type}: Removing buffer from: ${range.start} to ${range.end}`);\n isPruningInProgress = true;\n\n // If removing buffer ahead current playback position, update maxAppendedIndex\n const currentTime = playbackController.getTime();\n if (currentTime < range.end) {\n setIsBufferingCompleted(false);\n }\n\n sourceBufferSink.remove(range)\n .then((e) => {\n _onRemoved(e);\n })\n .catch((e) => {\n _onRemoved(e);\n });\n } catch (e) {\n isPruningInProgress = false;\n }\n }\n\n function _onRemoved(e) {\n logger.debug('onRemoved buffer from:', e.from, 'to', e.to);\n\n if (!sourceBufferSink) {\n return;\n }\n\n const ranges = sourceBufferSink.getAllBufferRanges();\n _showBufferRanges(ranges);\n\n if (pendingPruningRanges.length === 0) {\n isPruningInProgress = false;\n _updateBufferLevel();\n }\n\n if (e.unintended) {\n logger.warn('Detected unintended removal from:', e.from, 'to', e.to, 'setting streamprocessor time to', e.from);\n _triggerEvent(Events.SEEK_TARGET, { time: e.from });\n }\n\n if (isPruningInProgress) {\n clearNextRange();\n } else {\n if (!replacingBuffer) {\n _updateBufferLevel();\n } else {\n replacingBuffer = false;\n }\n _triggerEvent(Events.BUFFER_CLEARED, {\n from: e.from,\n to: e.to,\n unintended: e.unintended,\n hasEnoughSpaceToAppend: hasEnoughSpaceToAppend(),\n quotaExceeded: isQuotaExceeded\n });\n }\n }\n\n function updateBufferTimestampOffset(representationInfo) {\n return new Promise((resolve) => {\n if (!representationInfo || representationInfo.MSETimeOffset === undefined || !sourceBufferSink || !sourceBufferSink.updateTimestampOffset) {\n resolve();\n return;\n }\n // Each track can have its own @presentationTimeOffset, so we should set the offset\n // if it has changed after switching the quality or updating an mpd\n sourceBufferSink.updateTimestampOffset(representationInfo.MSETimeOffset)\n .then(() => {\n resolve();\n })\n .catch(() => {\n resolve();\n });\n });\n\n }\n\n function updateAppendWindow() {\n if (sourceBufferSink && !isBufferingCompleted) {\n return sourceBufferSink.updateAppendWindow(streamInfo);\n }\n return Promise.resolve();\n }\n\n function segmentRequestingCompleted(segmentIndex) {\n if (!isNaN(segmentIndex)) {\n maximumIndex = segmentIndex;\n _checkIfBufferingCompleted();\n }\n }\n\n function _onWallclockTimeUpdated() {\n wallclockTicked++;\n const secondsElapsed = (wallclockTicked * (settings.get().streaming.wallclockTimeUpdateInterval / 1000));\n if ((secondsElapsed >= settings.get().streaming.buffer.bufferPruningInterval)) {\n wallclockTicked = 0;\n pruneBuffer();\n }\n }\n\n function _onPlaybackRateChanged() {\n checkIfSufficientBuffer();\n }\n\n function getBuffer() {\n return sourceBufferSink;\n }\n\n function getBufferLevel() {\n return bufferLevel;\n }\n\n function getMediaSource() {\n return mediaSource;\n }\n\n function getIsBufferingCompleted() {\n return isBufferingCompleted;\n }\n\n function setIsBufferingCompleted(value) {\n isBufferingCompleted = value;\n\n if (isBufferingCompleted) {\n _triggerEvent(Events.BUFFERING_COMPLETED);\n } else {\n maximumIndex = Number.POSITIVE_INFINITY;\n }\n }\n\n function getIsPruningInProgress() {\n return isPruningInProgress;\n }\n\n function getTotalBufferedTime() {\n try {\n const ranges = sourceBufferSink.getAllBufferRanges();\n let totalBufferedTime = 0;\n let ln,\n i;\n\n if (!ranges) return totalBufferedTime;\n\n for (i = 0, ln = ranges.length; i < ln; i++) {\n totalBufferedTime += ranges.end(i) - ranges.start(i);\n }\n\n return totalBufferedTime;\n } catch (e) {\n return 0;\n }\n }\n\n /**\n * This function returns the maximum time for which the buffer is continuous starting from a target time.\n * As soon as there is a gap we return the time before the gap starts\n * @param {number} targetTime\n */\n function getContinuousBufferTimeForTargetTime(targetTime) {\n try {\n let adjustedTime = targetTime;\n const ranges = sourceBufferSink.getAllBufferRanges();\n\n if (!ranges || ranges.length === 0) {\n return NaN;\n }\n\n let i = 0;\n\n while (adjustedTime === targetTime && i < ranges.length) {\n const start = ranges.start(i);\n const end = ranges.end(i);\n\n if (adjustedTime >= start && adjustedTime <= end) {\n adjustedTime = end;\n }\n\n i += 1;\n }\n\n return adjustedTime === targetTime ? NaN : adjustedTime;\n\n } catch (e) {\n\n }\n }\n\n function hasEnoughSpaceToAppend() {\n const totalBufferedTime = getTotalBufferedTime();\n return (isNaN(totalBufferedTime) || totalBufferedTime < criticalBufferLevel);\n }\n\n function setSeekTarget(value) {\n seekTarget = value;\n }\n\n function _triggerEvent(eventType, data) {\n let payload = data || {};\n eventBus.trigger(eventType, payload, { streamId: streamInfo.id, mediaType: type });\n }\n\n function resetInitialSettings(errored, keepBuffers) {\n criticalBufferLevel = Number.POSITIVE_INFINITY;\n bufferState = undefined;\n maximumIndex = Number.POSITIVE_INFINITY;\n maxAppendedIndex = 0;\n appendedBytesInfo = null;\n isBufferingCompleted = false;\n isPruningInProgress = false;\n isQuotaExceeded = false;\n bufferLevel = 0;\n wallclockTicked = 0;\n pendingPruningRanges = [];\n seekTarget = NaN;\n isPrebuffering = false;\n\n if (sourceBufferSink) {\n let tmpSourceBufferSinkToReset = sourceBufferSink;\n sourceBufferSink = null;\n if (!errored && !keepBuffers) {\n tmpSourceBufferSinkToReset.abort()\n .then(() => {\n tmpSourceBufferSinkToReset.reset(keepBuffers);\n tmpSourceBufferSinkToReset = null;\n });\n }\n }\n\n replacingBuffer = false;\n }\n\n function reset(errored, keepBuffers) {\n eventBus.off(Events.INIT_FRAGMENT_LOADED, _onInitFragmentLoaded, this);\n eventBus.off(Events.MEDIA_FRAGMENT_LOADED, _onMediaFragmentLoaded, this);\n eventBus.off(Events.WALLCLOCK_TIME_UPDATED, _onWallclockTimeUpdated, this);\n\n eventBus.off(MediaPlayerEvents.PLAYBACK_PLAYING, _onPlaybackPlaying, this);\n eventBus.off(MediaPlayerEvents.PLAYBACK_PROGRESS, _onPlaybackProgression, this);\n eventBus.off(MediaPlayerEvents.PLAYBACK_TIME_UPDATED, _onPlaybackProgression, this);\n eventBus.off(MediaPlayerEvents.PLAYBACK_RATE_CHANGED, _onPlaybackRateChanged, this);\n eventBus.off(MediaPlayerEvents.PLAYBACK_STALLED, _onPlaybackStalled, this);\n\n\n resetInitialSettings(errored, keepBuffers);\n }\n\n instance = {\n initialize,\n getStreamId,\n getType,\n getBufferControllerType,\n createBufferSink,\n dischargePreBuffer,\n getBuffer,\n getBufferLevel,\n getRangeAt,\n hasBufferAtTime,\n pruneBuffer,\n setMediaSource,\n getMediaSource,\n appendInitSegmentFromCache,\n getIsBufferingCompleted,\n setIsBufferingCompleted,\n getIsPruningInProgress,\n reset,\n prepareForPlaybackSeek,\n prepareForReplacementTrackSwitch,\n prepareForNonReplacementTrackSwitch,\n prepareForForceReplacementQualitySwitch,\n updateAppendWindow,\n getAllRangesWithSafetyFactor,\n getContinuousBufferTimeForTargetTime,\n clearBuffers,\n pruneAllSafely,\n updateBufferTimestampOffset,\n setSeekTarget,\n segmentRequestingCompleted\n };\n\n setup();\n return instance;\n}\n\nBufferController.__dashjs_factory_name = BUFFER_CONTROLLER_TYPE;\nexport default FactoryMaker.getClassFactory(BufferController);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport EventBus from '../../core/EventBus';\nimport Events from '../../core/events/Events';\nimport FactoryMaker from '../../core/FactoryMaker';\nimport InitCache from '../utils/InitCache';\nimport SourceBufferSink from '../SourceBufferSink';\nimport DashJSError from '../../streaming/vo/DashJSError';\nimport Errors from '../../core/errors/Errors';\n\nconst BUFFER_CONTROLLER_TYPE = 'NotFragmentedTextBufferController';\n\nfunction NotFragmentedTextBufferController(config) {\n\n config = config || {};\n const context = this.context;\n const eventBus = EventBus(context).getInstance();\n\n const textController = config.textController;\n const errHandler = config.errHandler;\n const streamInfo = config.streamInfo;\n const type = config.type;\n\n let instance,\n isBufferingCompleted,\n initialized,\n mediaSource,\n sourceBufferSink,\n initCache;\n\n function setup() {\n initialized = false;\n mediaSource = null;\n isBufferingCompleted = false;\n\n initCache = InitCache(context).getInstance();\n\n eventBus.on(Events.INIT_FRAGMENT_LOADED, _onInitFragmentLoaded, instance);\n }\n\n function getBufferControllerType() {\n return BUFFER_CONTROLLER_TYPE;\n }\n\n function initialize(source) {\n setMediaSource(source);\n }\n\n function createBufferSink(mediaInfo) {\n return new Promise((resolve, reject) => {\n try {\n sourceBufferSink = SourceBufferSink(context).create({ mediaSource, textController, eventBus });\n sourceBufferSink.initializeForFirstUse(streamInfo, mediaInfo);\n if (!initialized) {\n if (sourceBufferSink.getBuffer() && typeof sourceBufferSink.getBuffer().initialize === 'function') {\n sourceBufferSink.getBuffer().initialize();\n }\n initialized = true;\n }\n resolve(sourceBufferSink);\n } catch (e) {\n errHandler.error(new DashJSError(Errors.MEDIASOURCE_TYPE_UNSUPPORTED_CODE, Errors.MEDIASOURCE_TYPE_UNSUPPORTED_MESSAGE + type));\n reject(e);\n }\n });\n\n }\n\n function getStreamId() {\n return streamInfo.id;\n }\n\n function getType() {\n return type;\n }\n\n function getBuffer() {\n return sourceBufferSink;\n }\n\n function setMediaSource(value) {\n mediaSource = value;\n }\n\n function getMediaSource() {\n return mediaSource;\n }\n\n function getIsPruningInProgress() {\n return false;\n }\n\n function dischargePreBuffer() {\n }\n\n function getBufferLevel() {\n return 0;\n }\n\n function getIsBufferingCompleted() {\n return isBufferingCompleted;\n }\n\n function setIsBufferingCompleted(value) {\n if (isBufferingCompleted === value) {\n return;\n }\n\n isBufferingCompleted = value;\n\n if (isBufferingCompleted) {\n triggerEvent(Events.BUFFERING_COMPLETED);\n }\n }\n\n function reset(errored) {\n eventBus.off(Events.INIT_FRAGMENT_LOADED, _onInitFragmentLoaded, instance);\n\n if (!errored && sourceBufferSink) {\n sourceBufferSink.abort();\n sourceBufferSink.reset();\n sourceBufferSink = null;\n }\n }\n\n function appendInitSegmentFromCache(representationId) {\n // If text data file already in cache then no need to append it again\n return initCache.extract(streamInfo.id, representationId) !== null;\n }\n\n function _onInitFragmentLoaded(e) {\n if (!e.chunk.bytes || isBufferingCompleted) return;\n\n initCache.save(e.chunk);\n\n sourceBufferSink.append(e.chunk);\n\n setIsBufferingCompleted(true);\n }\n\n function getRangeAt() {\n return null;\n }\n\n function hasBufferAtTime() {\n return true;\n }\n\n function getAllRangesWithSafetyFactor() {\n return [];\n }\n\n function getContinuousBufferTimeForTargetTime() {\n return Number.POSITIVE_INFINITY;\n }\n\n function clearBuffers() {\n return Promise.resolve();\n }\n\n function pruneBuffer() {\n return;\n }\n\n function updateBufferTimestampOffset() {\n return Promise.resolve();\n }\n\n function prepareForPlaybackSeek() {\n return Promise.resolve();\n }\n\n function prepareForReplacementTrackSwitch() {\n isBufferingCompleted = false;\n return Promise.resolve();\n }\n\n function updateAppendWindow() {\n return Promise.resolve();\n }\n\n function setSeekTarget() {\n\n }\n\n function segmentRequestingCompleted() {\n\n }\n\n function pruneAllSafely() {\n return Promise.resolve();\n }\n\n function triggerEvent(eventType, data) {\n let payload = data || {};\n eventBus.trigger(eventType, payload, { streamId: streamInfo.id, mediaType: type });\n }\n\n instance = {\n initialize,\n getStreamId,\n getType,\n getBufferControllerType,\n createBufferSink,\n dischargePreBuffer,\n getBuffer,\n getBufferLevel,\n getRangeAt,\n pruneBuffer,\n hasBufferAtTime,\n getAllRangesWithSafetyFactor,\n getContinuousBufferTimeForTargetTime,\n setMediaSource,\n getMediaSource,\n appendInitSegmentFromCache,\n getIsBufferingCompleted,\n setIsBufferingCompleted,\n getIsPruningInProgress,\n reset,\n clearBuffers,\n prepareForPlaybackSeek,\n prepareForReplacementTrackSwitch,\n setSeekTarget,\n updateAppendWindow,\n pruneAllSafely,\n updateBufferTimestampOffset,\n segmentRequestingCompleted\n };\n\n setup();\n\n return instance;\n}\n\nNotFragmentedTextBufferController.__dashjs_factory_name = BUFFER_CONTROLLER_TYPE;\nexport default FactoryMaker.getClassFactory(NotFragmentedTextBufferController);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport Constants from '../constants/Constants';\nimport FragmentModel from '../models/FragmentModel';\nimport EventBus from '../../core/EventBus';\nimport Events from '../../core/events/Events';\nimport FactoryMaker from '../../core/FactoryMaker';\nimport Debug from '../../core/Debug';\nimport MetricsConstants from '../constants/MetricsConstants';\nimport MediaPlayerEvents from '../MediaPlayerEvents';\n\nfunction ScheduleController(config) {\n\n config = config || {};\n const context = this.context;\n const eventBus = EventBus(context).getInstance();\n const dashMetrics = config.dashMetrics;\n const mediaPlayerModel = config.mediaPlayerModel;\n const fragmentModel = config.fragmentModel;\n const abrController = config.abrController;\n const playbackController = config.playbackController;\n const textController = config.textController;\n const type = config.type;\n const bufferController = config.bufferController;\n const representationController = config.representationController\n const settings = config.settings;\n\n let instance,\n streamInfo,\n logger,\n timeToLoadDelay,\n scheduleTimeout,\n hasVideoTrack,\n lastFragmentRequest,\n topQualityIndex,\n lastInitializedQuality,\n switchTrack,\n initSegmentRequired,\n managedMediaSourceAllowsRequest,\n checkPlaybackQuality;\n\n function setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n resetInitialSettings();\n streamInfo = config.streamInfo;\n }\n\n function initialize(_hasVideoTrack) {\n hasVideoTrack = _hasVideoTrack;\n\n eventBus.on(Events.URL_RESOLUTION_FAILED, _onURLResolutionFailed, instance);\n eventBus.on(MediaPlayerEvents.PLAYBACK_STARTED, _onPlaybackStarted, instance);\n eventBus.on(MediaPlayerEvents.PLAYBACK_RATE_CHANGED, _onPlaybackRateChanged, instance);\n eventBus.on(MediaPlayerEvents.PLAYBACK_TIME_UPDATED, _onPlaybackTimeUpdated, instance);\n eventBus.on(MediaPlayerEvents.MANAGED_MEDIA_SOURCE_START_STREAMING, _onManagedMediaSourceStartStreaming, instance);\n eventBus.on(MediaPlayerEvents.MANAGED_MEDIA_SOURCE_END_STREAMING, _onManagedMediaSourceEndStreaming, instance);\n }\n\n function _onManagedMediaSourceStartStreaming() {\n managedMediaSourceAllowsRequest = true;\n }\n\n function _onManagedMediaSourceEndStreaming() {\n managedMediaSourceAllowsRequest = false;\n }\n\n function getType() {\n return type;\n }\n\n function getStreamId() {\n return streamInfo.id;\n }\n\n function startScheduleTimer(value) {\n\n //return if both buffering and playback have ended\n if (bufferController.getIsBufferingCompleted()) {\n return;\n }\n\n clearScheduleTimer();\n const timeoutValue = !isNaN(value) ? value : 0;\n scheduleTimeout = setTimeout(schedule, timeoutValue);\n }\n\n function clearScheduleTimer() {\n if (scheduleTimeout) {\n clearTimeout(scheduleTimeout);\n scheduleTimeout = null;\n }\n }\n\n function hasTopQualityChanged() {\n const streamId = streamInfo.id;\n const newTopQualityIndex = abrController.getMaxAllowedIndexFor(type, streamId);\n\n if (isNaN(topQualityIndex) || topQualityIndex != newTopQualityIndex) {\n logger.info('Top quality ' + type + ' index has changed from ' + topQualityIndex + ' to ' + newTopQualityIndex);\n topQualityIndex = newTopQualityIndex;\n return true;\n }\n return false;\n\n }\n\n /**\n * Schedule the request for an init or a media segment\n */\n function schedule() {\n try {\n // Check if we are supposed to stop scheduling\n if (_shouldClearScheduleTimer()) {\n clearScheduleTimer();\n return;\n }\n\n if (_shouldScheduleNextRequest()) {\n let qualityChange = false;\n if (checkPlaybackQuality) {\n // in case the playback quality is supposed to be changed, the corresponding StreamProcessor will update the currentRepresentation.\n // The StreamProcessor will also start the schedule timer again once the quality switch has beeen prepared. Consequently, we only call _getNextFragment if the quality is not changed.\n qualityChange = abrController.checkPlaybackQuality(type, streamInfo.id);\n }\n if (!qualityChange) {\n _getNextFragment();\n }\n\n } else {\n startScheduleTimer(playbackController.getLowLatencyModeEnabled() ? settings.get().streaming.scheduling.lowLatencyTimeout : settings.get().streaming.scheduling.defaultTimeout);\n }\n } catch (e) {\n startScheduleTimer(playbackController.getLowLatencyModeEnabled() ? settings.get().streaming.scheduling.lowLatencyTimeout : settings.get().streaming.scheduling.defaultTimeout);\n }\n }\n\n /**\n * Triggers the events to start requesting an init or a media segment. This will be picked up by the corresponding StreamProcessor.\n * @private\n */\n function _getNextFragment() {\n const currentRepresentationInfo = representationController.getCurrentRepresentationInfo();\n\n // A quality changed occured or we are switching the AdaptationSet. In that case we need to load a new init segment\n if (initSegmentRequired || currentRepresentationInfo.quality !== lastInitializedQuality || switchTrack) {\n if (switchTrack) {\n logger.debug('Switch track for ' + type + ', representation id = ' + currentRepresentationInfo.id);\n switchTrack = false;\n } else {\n logger.debug('Quality has changed, get init request for representationid = ' + currentRepresentationInfo.id);\n }\n eventBus.trigger(Events.INIT_FRAGMENT_NEEDED,\n { representationId: currentRepresentationInfo.id, sender: instance },\n { streamId: streamInfo.id, mediaType: type }\n );\n checkPlaybackQuality = false;\n initSegmentRequired = false;\n }\n\n // Request a media segment instead\n else {\n logger.debug(`Media segment needed for ${type} and stream id ${streamInfo.id}`);\n eventBus.trigger(Events.MEDIA_FRAGMENT_NEEDED,\n {},\n { streamId: streamInfo.id, mediaType: type }\n );\n checkPlaybackQuality = true;\n }\n\n }\n\n /**\n * Check if we need to stop scheduling for now.\n * @return {boolean}\n * @private\n */\n function _shouldClearScheduleTimer() {\n try {\n return (((type === Constants.TEXT) && !textController.isTextEnabled()) ||\n (playbackController.isPaused() && (!playbackController.getStreamController().getInitialPlayback() || !playbackController.getStreamController().getAutoPlay()) && !settings.get().streaming.scheduling.scheduleWhilePaused));\n } catch (e) {\n return false;\n }\n }\n\n /**\n * Check if we can start scheduling the next request\n * @return {boolean}\n * @private\n */\n function _shouldScheduleNextRequest() {\n try {\n if (!managedMediaSourceAllowsRequest) {\n return false;\n }\n const currentRepresentationInfo = representationController.getCurrentRepresentationInfo();\n return currentRepresentationInfo && (isNaN(lastInitializedQuality) || switchTrack || hasTopQualityChanged() || _shouldBuffer());\n } catch (e) {\n return false;\n }\n }\n\n /**\n * Check if the current buffer level is below our buffer target.\n * @return {boolean}\n * @private\n */\n function _shouldBuffer() {\n const currentRepresentationInfo = representationController.getCurrentRepresentationInfo();\n if (!type || !currentRepresentationInfo) {\n return true;\n }\n const bufferLevel = dashMetrics.getCurrentBufferLevel(type);\n return bufferLevel < getBufferTarget();\n }\n\n /**\n * Determine the buffer target depending on the type and whether we have audio and video AdaptationSets available\n * @return {number}\n */\n function getBufferTarget() {\n let bufferTarget = NaN;\n const currentRepresentationInfo = representationController.getCurrentRepresentationInfo();\n\n if (!type || !currentRepresentationInfo) {\n return bufferTarget;\n }\n\n if (type === Constants.TEXT) {\n bufferTarget = _getBufferTargetForFragmentedText();\n } else if (type === Constants.AUDIO && hasVideoTrack) {\n bufferTarget = _getBufferTargetForAudio();\n } else {\n bufferTarget = _getGenericBufferTarget();\n }\n\n return bufferTarget;\n }\n\n /**\n * Returns the buffer target for fragmented text tracks\n * @return {number}\n * @private\n */\n function _getBufferTargetForFragmentedText() {\n try {\n if (textController.isTextEnabled()) {\n const currentRepresentationInfo = representationController.getCurrentRepresentationInfo();\n if (isNaN(currentRepresentationInfo.fragmentDuration)) { //fragmentDuration of currentRepresentationInfo is not defined,\n // call metrics function to have data in the latest scheduling info...\n // if no metric, returns 0. In this case, rule will return false.\n const schedulingInfo = dashMetrics.getCurrentSchedulingInfo(MetricsConstants.SCHEDULING_INFO);\n return schedulingInfo ? schedulingInfo.duration : 0;\n } else {\n return currentRepresentationInfo.fragmentDuration;\n }\n } else { // text is disabled, rule will return false\n return 0;\n }\n } catch (e) {\n return 0;\n }\n }\n\n /**\n * Returns the buffer target for audio tracks in case we have a video track available as well\n * @return {number}\n * @private\n */\n function _getBufferTargetForAudio() {\n try {\n const videoBufferLevel = dashMetrics.getCurrentBufferLevel(Constants.VIDEO);\n const currentRepresentationInfo = representationController.getCurrentRepresentationInfo();\n // For multiperiod we need to consider that audio and video segments might have different durations.\n // This can lead to scenarios in which we completely buffered the video segments and the video buffer level for the current period is not changing anymore. However we might still need a small audio segment to finish buffering audio as well.\n // If we set the buffer time of audio equal to the video buffer time scheduling for the remaining audio segment will only be triggered when audio fragmentDuration > videoBufferLevel. That will delay preloading of the upcoming period.\n // Should find a better solution than just adding 1\n if (isNaN(currentRepresentationInfo.fragmentDuration)) {\n return videoBufferLevel + 1;\n } else {\n return Math.max(videoBufferLevel + 1, currentRepresentationInfo.fragmentDuration);\n }\n } catch (e) {\n return 0;\n }\n }\n\n /**\n * Determines the generic buffer target, for instance for video tracks\n * @return {number}\n * @private\n */\n function _getGenericBufferTarget() {\n try {\n const currentRepresentationInfo = representationController.getCurrentRepresentationInfo();\n const streamInfo = currentRepresentationInfo.mediaInfo.streamInfo;\n if (abrController.isPlayingAtTopQuality(streamInfo)) {\n const isLongFormContent = streamInfo.manifestInfo.duration >= settings.get().streaming.buffer.longFormContentDurationThreshold;\n return isLongFormContent ? settings.get().streaming.buffer.bufferTimeAtTopQualityLongForm : settings.get().streaming.buffer.bufferTimeAtTopQuality;\n } else {\n return mediaPlayerModel.getStableBufferTime();\n }\n } catch (e) {\n return mediaPlayerModel.getStableBufferTime();\n }\n }\n\n function setSwitchTrack(value) {\n switchTrack = value;\n }\n\n function getSwitchTrack() {\n return switchTrack;\n }\n\n function _onPlaybackTimeUpdated() {\n _completeQualityChange(true);\n }\n\n function _completeQualityChange(trigger) {\n if (playbackController && fragmentModel) {\n const item = fragmentModel.getRequests({\n state: FragmentModel.FRAGMENT_MODEL_EXECUTED,\n time: playbackController.getTime(),\n threshold: 0\n })[0];\n\n if (item && playbackController.getTime() >= item.startTime) {\n if ((!lastFragmentRequest.mediaInfo || (item.mediaInfo.type === lastFragmentRequest.mediaInfo.type && item.mediaInfo.index !== lastFragmentRequest.mediaInfo.index)) && trigger) {\n eventBus.trigger(Events.TRACK_CHANGE_RENDERED, {\n mediaType: type,\n oldMediaInfo: lastFragmentRequest.mediaInfo,\n newMediaInfo: item.mediaInfo,\n streamId: streamInfo.id\n });\n }\n if ((item.quality !== lastFragmentRequest.quality || item.adaptationIndex !== lastFragmentRequest.adaptationIndex) && trigger) {\n logger.debug(`Quality change rendered for streamId ${streamInfo.id} and type ${type}`);\n eventBus.trigger(Events.QUALITY_CHANGE_RENDERED, {\n mediaType: type,\n oldQuality: lastFragmentRequest.quality,\n newQuality: item.quality,\n streamId: streamInfo.id\n });\n }\n lastFragmentRequest = {\n mediaInfo: item.mediaInfo,\n quality: item.quality,\n adaptationIndex: item.adaptationIndex\n };\n }\n }\n }\n\n\n function _onURLResolutionFailed() {\n fragmentModel.abortRequests();\n clearScheduleTimer();\n }\n\n function _onPlaybackStarted() {\n if (!settings.get().streaming.scheduling.scheduleWhilePaused) {\n startScheduleTimer();\n }\n }\n\n function _onPlaybackRateChanged(e) {\n dashMetrics.updatePlayListTraceMetrics({ playbackspeed: e.playbackRate.toString() });\n }\n\n function setTimeToLoadDelay(value) {\n timeToLoadDelay = value;\n }\n\n function getTimeToLoadDelay() {\n return timeToLoadDelay;\n }\n\n function setCheckPlaybackQuality(value) {\n checkPlaybackQuality = value;\n }\n\n function setInitSegmentRequired(value) {\n initSegmentRequired = value;\n }\n\n function setLastInitializedQuality(value) {\n lastInitializedQuality = value;\n }\n\n function resetInitialSettings() {\n checkPlaybackQuality = true;\n timeToLoadDelay = 0;\n lastInitializedQuality = NaN;\n lastFragmentRequest = {\n mediaInfo: undefined,\n quality: NaN,\n adaptationIndex: NaN\n };\n topQualityIndex = NaN;\n switchTrack = false;\n initSegmentRequired = false;\n managedMediaSourceAllowsRequest = true;\n }\n\n function reset() {\n eventBus.off(Events.URL_RESOLUTION_FAILED, _onURLResolutionFailed, instance);\n eventBus.off(MediaPlayerEvents.PLAYBACK_STARTED, _onPlaybackStarted, instance);\n eventBus.off(MediaPlayerEvents.PLAYBACK_RATE_CHANGED, _onPlaybackRateChanged, instance);\n eventBus.off(MediaPlayerEvents.PLAYBACK_TIME_UPDATED, _onPlaybackTimeUpdated, instance);\n eventBus.off(MediaPlayerEvents.MANAGED_MEDIA_SOURCE_START_STREAMING, _onManagedMediaSourceStartStreaming, instance);\n eventBus.off(MediaPlayerEvents.MANAGED_MEDIA_SOURCE_END_STREAMING, _onManagedMediaSourceEndStreaming, instance);\n\n clearScheduleTimer();\n _completeQualityChange(false);\n resetInitialSettings();\n streamInfo = null;\n }\n\n function getPlaybackController() {\n return playbackController;\n }\n\n instance = {\n initialize,\n getType,\n getStreamId,\n setTimeToLoadDelay,\n getTimeToLoadDelay,\n setSwitchTrack,\n getSwitchTrack,\n startScheduleTimer,\n clearScheduleTimer,\n reset,\n getBufferTarget,\n getPlaybackController,\n setCheckPlaybackQuality,\n setInitSegmentRequired,\n setLastInitializedQuality,\n };\n\n setup();\n\n return instance;\n}\n\nScheduleController.__dashjs_factory_name = 'ScheduleController';\nexport default FactoryMaker.getClassFactory(ScheduleController);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport Constants from '../../streaming/constants/Constants';\nimport FactoryMaker from '../../core/FactoryMaker';\nimport MediaPlayerEvents from '../../streaming/MediaPlayerEvents';\nimport {getTimeBasedSegment} from '../utils/SegmentsUtils';\n\nfunction RepresentationController(config) {\n\n config = config || {};\n const eventBus = config.eventBus;\n const events = config.events;\n const abrController = config.abrController;\n const dashMetrics = config.dashMetrics;\n const playbackController = config.playbackController;\n const timelineConverter = config.timelineConverter;\n const type = config.type;\n const streamInfo = config.streamInfo;\n const dashConstants = config.dashConstants;\n const segmentsController = config.segmentsController;\n const isDynamic = config.isDynamic;\n const adapter = config.adapter;\n\n let instance,\n realAdaptation,\n updating,\n voAvailableRepresentations,\n currentRepresentationInfo,\n currentVoRepresentation;\n\n function setup() {\n resetInitialSettings();\n\n eventBus.on(MediaPlayerEvents.MANIFEST_VALIDITY_CHANGED, onManifestValidityChanged, instance);\n }\n\n function getStreamId() {\n return streamInfo.id;\n }\n\n function getType() {\n return type;\n }\n\n function checkConfig() {\n if (!abrController || !dashMetrics || !playbackController || !timelineConverter) {\n throw new Error(Constants.MISSING_CONFIG_ERROR);\n }\n }\n\n function getData() {\n return realAdaptation;\n }\n\n function isUpdating() {\n return updating;\n }\n\n function getCurrentRepresentation() {\n return currentVoRepresentation;\n }\n\n function getCurrentRepresentationInfo() {\n return currentRepresentationInfo\n }\n\n function resetInitialSettings() {\n realAdaptation = null;\n updating = true;\n voAvailableRepresentations = [];\n currentRepresentationInfo = null;\n }\n\n function reset() {\n eventBus.off(MediaPlayerEvents.MANIFEST_VALIDITY_CHANGED, onManifestValidityChanged, instance);\n\n resetInitialSettings();\n }\n\n function updateData(newRealAdaptation, availableRepresentations, type, isFragmented, quality) {\n return new Promise((resolve, reject) => {\n updating = true;\n voAvailableRepresentations = availableRepresentations;\n realAdaptation = newRealAdaptation;\n const rep = getRepresentationForQuality(quality)\n _setCurrentVoRepresentation(rep);\n\n if (type !== Constants.VIDEO && type !== Constants.AUDIO && (type !== Constants.TEXT || !isFragmented)) {\n endDataUpdate();\n resolve();\n return;\n }\n\n const promises = [];\n for (let i = 0, ln = voAvailableRepresentations.length; i < ln; i++) {\n const currentRep = voAvailableRepresentations[i];\n promises.push(_updateRepresentation(currentRep));\n }\n\n Promise.all(promises)\n .then(() => {\n // Update the current representation again as we have now the reference to the segments\n const rep = getRepresentationForQuality(quality)\n _setCurrentVoRepresentation(rep);\n resolve();\n })\n .catch((e) => {\n reject(e);\n })\n })\n\n }\n\n function _updateRepresentation(currentRep) {\n return new Promise((resolve, reject) => {\n const hasInitialization = currentRep.hasInitialization();\n const hasSegments = currentRep.hasSegments();\n\n // If representation has initialization and segments information we are done\n // otherwise, it means that a request has to be made to get initialization and/or segments information\n const promises = [];\n\n promises.push(segmentsController.updateInitData(currentRep, hasInitialization));\n promises.push(segmentsController.updateSegmentData(currentRep, hasSegments));\n\n Promise.all(promises)\n .then((data) => {\n if (data[0] && !data[0].error) {\n currentRep = _onInitLoaded(currentRep, data[0]);\n }\n if (data[1] && !data[1].error) {\n currentRep = _onSegmentsLoaded(currentRep, data[1]);\n }\n _setMediaFinishedInformation(currentRep);\n _onRepresentationUpdated(currentRep);\n resolve();\n })\n .catch((e) => {\n reject(e);\n });\n });\n }\n\n function _setMediaFinishedInformation(representation) {\n representation.mediaFinishedInformation = segmentsController.getMediaFinishedInformation(representation);\n }\n\n function _onInitLoaded(representation, e) {\n if (!e || e.error || !e.representation) {\n return representation;\n }\n return e.representation;\n }\n\n function _onSegmentsLoaded(representation, e) {\n if (!e || e.error) return;\n\n const fragments = e.segments;\n const segments = [];\n let count = 0;\n\n let i,\n len,\n s,\n seg;\n\n for (i = 0, len = fragments ? fragments.length : 0; i < len; i++) {\n s = fragments[i];\n\n seg = getTimeBasedSegment(\n timelineConverter,\n isDynamic,\n representation,\n s.startTime,\n s.duration,\n s.timescale,\n s.media,\n s.mediaRange,\n count);\n\n if (seg) {\n segments.push(seg);\n seg = null;\n count++;\n }\n }\n\n if (segments.length > 0) {\n representation.segments = segments;\n }\n\n return representation;\n }\n\n function _addRepresentationSwitch() {\n checkConfig();\n const now = new Date();\n const currentRepresentation = getCurrentRepresentation();\n const currentVideoTimeMs = playbackController.getTime() * 1000;\n if (currentRepresentation) {\n dashMetrics.addRepresentationSwitch(currentRepresentation.adaptation.type, now, currentVideoTimeMs, currentRepresentation.id);\n }\n\n eventBus.trigger(MediaPlayerEvents.REPRESENTATION_SWITCH, {\n mediaType: type,\n streamId: streamInfo.id,\n currentRepresentation,\n numberOfRepresentations: voAvailableRepresentations.length\n }, { streamId: streamInfo.id, mediaType: type })\n }\n\n function getRepresentationForQuality(quality) {\n return quality === null || quality === undefined || quality >= voAvailableRepresentations.length ? null : voAvailableRepresentations[quality];\n }\n\n function getQualityForRepresentation(voRepresentation) {\n return voAvailableRepresentations.indexOf(voRepresentation);\n }\n\n function isAllRepresentationsUpdated() {\n for (let i = 0, ln = voAvailableRepresentations.length; i < ln; i++) {\n let segmentInfoType = voAvailableRepresentations[i].segmentInfoType;\n if (!voAvailableRepresentations[i].hasInitialization() ||\n ((segmentInfoType === dashConstants.SEGMENT_BASE || segmentInfoType === dashConstants.BASE_URL) && !voAvailableRepresentations[i].segments)\n ) {\n return false;\n }\n }\n\n return true;\n }\n\n function endDataUpdate(error) {\n updating = false;\n eventBus.trigger(events.DATA_UPDATE_COMPLETED,\n {\n data: realAdaptation,\n currentRepresentation: currentVoRepresentation,\n error: error\n },\n { streamId: streamInfo.id, mediaType: type }\n );\n }\n\n function _onRepresentationUpdated(r) {\n if (!isUpdating()) return;\n\n let manifestUpdateInfo = dashMetrics.getCurrentManifestUpdate();\n let alreadyAdded = false;\n let repInfo,\n repSwitch;\n\n\n if (manifestUpdateInfo) {\n for (let i = 0; i < manifestUpdateInfo.representationInfo.length; i++) {\n repInfo = manifestUpdateInfo.representationInfo[i];\n if (repInfo.index === r.index && repInfo.mediaType === getType()) {\n alreadyAdded = true;\n break;\n }\n }\n\n if (!alreadyAdded) {\n dashMetrics.addManifestUpdateRepresentationInfo(r, getType());\n }\n }\n\n if (isAllRepresentationsUpdated()) {\n abrController.setPlaybackQuality(type, streamInfo, getQualityForRepresentation(currentVoRepresentation));\n const dvrInfo = dashMetrics.getCurrentDVRInfo(type);\n if (dvrInfo) {\n dashMetrics.updateManifestUpdateInfo({ latency: dvrInfo.range.end - playbackController.getTime() });\n }\n\n repSwitch = dashMetrics.getCurrentRepresentationSwitch(getCurrentRepresentation().adaptation.type);\n\n if (!repSwitch) {\n _addRepresentationSwitch();\n }\n endDataUpdate();\n }\n }\n\n function prepareQualityChange(newQuality) {\n const newRep = getRepresentationForQuality(newQuality)\n _setCurrentVoRepresentation(newRep);\n _addRepresentationSwitch();\n }\n\n function _setCurrentVoRepresentation(value) {\n currentVoRepresentation = value;\n currentRepresentationInfo = adapter.convertRepresentationToRepresentationInfo(currentVoRepresentation);\n }\n\n function onManifestValidityChanged(e) {\n if (e.newDuration) {\n const representation = getCurrentRepresentation();\n if (representation && representation.adaptation.period) {\n const period = representation.adaptation.period;\n period.duration = e.newDuration;\n }\n }\n }\n\n instance = {\n getStreamId,\n getType,\n getData,\n isUpdating,\n updateData,\n getCurrentRepresentation,\n getCurrentRepresentationInfo,\n getRepresentationForQuality,\n prepareQualityChange,\n reset\n };\n\n setup();\n return instance;\n}\n\nRepresentationController.__dashjs_factory_name = 'RepresentationController';\nexport default FactoryMaker.getClassFactory(RepresentationController);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @classdesc a PlayList from ISO23009-1 Annex D, this Object holds reference to the playback session information\n * @ignore\n */\nclass PlayList {\n /**\n * @class\n */\n constructor() {\n\n /**\n * Timestamp of the user action that starts the playback stream...\n * @public\n */\n this.start = null;\n /**\n * Presentation time at which playout was requested by the user...\n * @public\n */\n this.mstart = null;\n /**\n * Type of user action which triggered playout\n * - New playout request (e.g. initial playout or seeking)\n * - Resume from pause\n * - Other user request (e.g. user-requested quality change)\n * - Start of a metrics collection stream (hence earlier entries in the play list not collected)\n * @public\n */\n this.starttype = null;\n\n /**\n * List of streams of continuous rendering of decoded samples.\n * @public\n */\n this.trace = [];\n }\n}\n\n/* Public Static Constants */\nPlayList.INITIAL_PLAYOUT_START_REASON = 'initial_playout';\nPlayList.SEEK_START_REASON = 'seek';\nPlayList.RESUME_FROM_PAUSE_START_REASON = 'resume';\nPlayList.METRICS_COLLECTION_START_REASON = 'metrics_collection_start';\n\n/**\n * @classdesc a PlayList.Trace from ISO23009-1 Annex D\n * @ignore\n */\nclass PlayListTrace {\n /**\n * @class\n */\n constructor() {\n /**\n * The value of the Representation@id of the Representation from which the samples were taken.\n * @type {string}\n * @public\n */\n this.representationid = null;\n /**\n * If not present, this metrics concerns the Representation as a whole.\n * If present, subreplevel indicates the greatest value of any\n * Subrepresentation@level being rendered.\n * @type {number}\n * @public\n */\n this.subreplevel = null;\n /**\n * The time at which the first sample was rendered\n * @type {number}\n * @public\n */\n this.start = null;\n /**\n * The presentation time of the first sample rendered.\n * @type {number}\n * @public\n */\n this.mstart = null;\n /**\n * The duration of the continuously presented samples (which is the same in real time and media time). \"Continuously presented\" means that the media clock continued to advance at the playout speed throughout the interval. NOTE: the spec does not call out the units, but all other durations etc are in ms, and we use ms too.\n * @type {number}\n * @public\n */\n this.duration = null;\n /**\n * The playback speed relative to normal playback speed (i.e.normal forward playback speed is 1.0).\n * @type {number}\n * @public\n */\n this.playbackspeed = null;\n /**\n * The reason why continuous presentation of this Representation was stopped.\n * representation switch\n * rebuffering\n * user request\n * end of Period\n * end of Stream\n * end of content\n * end of a metrics collection period\n *\n * @type {string}\n * @public\n */\n this.stopreason = null;\n }\n}\n\nPlayListTrace.REPRESENTATION_SWITCH_STOP_REASON = 'representation_switch';\nPlayListTrace.REBUFFERING_REASON = 'rebuffering';\nPlayListTrace.USER_REQUEST_STOP_REASON = 'user_request';\nPlayListTrace.END_OF_PERIOD_STOP_REASON = 'end_of_period';\nPlayListTrace.END_OF_CONTENT_STOP_REASON = 'end_of_content';\nPlayListTrace.METRICS_COLLECTION_STOP_REASON = 'metrics_collection_end';\nPlayListTrace.FAILURE_STOP_REASON = 'failure';\n\nexport { PlayList, PlayListTrace };\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport FactoryMaker from '../../core/FactoryMaker';\n\n/**\n * @module TimeUtils\n * @ignore\n * @description Provides utility functions for time manipulation/conversion\n */\nfunction TimeUtils() {\n\n let instance;\n\n /**\n * Convert NTP timestamp into an UTC timestamp\n * @return {number}\n * @param {number} ntpTimestamp\n * @memberof module:TimeUtils\n * @instance\n */\n function ntpToUTC(ntpTimeStamp) {\n const start = new Date(Date.UTC(1900, 0, 1, 0, 0, 0));\n return new Date(start.getTime() + ntpTimeStamp).getTime();\n } \n\n instance = {\n ntpToUTC\n };\n\n return instance;\n}\n\nTimeUtils.__dashjs_factory_name = 'TimeUtils';\nexport default FactoryMaker.getSingletonFactory(TimeUtils);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport Constants from './constants/Constants';\nimport DashConstants from '../dash/constants/DashConstants';\nimport MetricsConstants from './constants/MetricsConstants';\nimport FragmentModel from './models/FragmentModel';\nimport BufferController from './controllers/BufferController';\nimport NotFragmentedTextBufferController from './text/NotFragmentedTextBufferController';\nimport ScheduleController from './controllers/ScheduleController';\nimport RepresentationController from '../dash/controllers/RepresentationController';\nimport FactoryMaker from '../core/FactoryMaker';\nimport {checkInteger} from './utils/SupervisorTools';\nimport EventBus from '../core/EventBus';\nimport Events from '../core/events/Events';\nimport MediaPlayerEvents from './MediaPlayerEvents';\nimport DashHandler from '../dash/DashHandler';\nimport Errors from '../core/errors/Errors';\nimport DashJSError from './vo/DashJSError';\nimport Debug from '../core/Debug';\nimport RequestModifier from './utils/RequestModifier';\nimport URLUtils from '../streaming/utils/URLUtils';\nimport {PlayListTrace} from './vo/metrics/PlayList';\nimport SegmentsController from '../dash/controllers/SegmentsController';\nimport {HTTPRequest} from './vo/metrics/HTTPRequest';\nimport TimeUtils from './utils/TimeUtils';\n\n\nfunction StreamProcessor(config) {\n\n config = config || {};\n let context = this.context;\n let eventBus = EventBus(context).getInstance();\n\n let streamInfo = config.streamInfo;\n let type = config.type;\n let errHandler = config.errHandler;\n let mimeType = config.mimeType;\n let timelineConverter = config.timelineConverter;\n let adapter = config.adapter;\n let manifestModel = config.manifestModel;\n let mediaPlayerModel = config.mediaPlayerModel;\n let fragmentModel = config.fragmentModel;\n let abrController = config.abrController;\n let playbackController = config.playbackController;\n let mediaController = config.mediaController;\n let textController = config.textController;\n let dashMetrics = config.dashMetrics;\n let settings = config.settings;\n let boxParser = config.boxParser;\n let segmentBlacklistController = config.segmentBlacklistController;\n\n let instance,\n logger,\n isDynamic,\n mediaInfo,\n mediaInfoArr,\n bufferController,\n scheduleController,\n representationController,\n shouldUseExplicitTimeForRequest,\n shouldRepeatRequest,\n qualityChangeInProgress,\n dashHandler,\n segmentsController,\n bufferingTime,\n pendingSwitchToRepresentationInfo;\n\n function setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n resetInitialSettings();\n\n eventBus.on(Events.DATA_UPDATE_COMPLETED, _onDataUpdateCompleted, instance, { priority: EventBus.EVENT_PRIORITY_HIGH }); // High priority to be notified before Stream\n eventBus.on(Events.INIT_FRAGMENT_NEEDED, _onInitFragmentNeeded, instance);\n eventBus.on(Events.MEDIA_FRAGMENT_NEEDED, _onMediaFragmentNeeded, instance);\n eventBus.on(Events.INIT_FRAGMENT_LOADED, _onInitFragmentLoaded, instance);\n eventBus.on(Events.MEDIA_FRAGMENT_LOADED, _onMediaFragmentLoaded, instance);\n eventBus.on(Events.BUFFER_LEVEL_STATE_CHANGED, _onBufferLevelStateChanged, instance);\n eventBus.on(Events.BUFFER_CLEARED, _onBufferCleared, instance);\n eventBus.on(Events.SEEK_TARGET, _onSeekTarget, instance);\n eventBus.on(Events.FRAGMENT_LOADING_ABANDONED, _onFragmentLoadingAbandoned, instance);\n eventBus.on(Events.FRAGMENT_LOADING_COMPLETED, _onFragmentLoadingCompleted, instance);\n eventBus.on(Events.QUOTA_EXCEEDED, _onQuotaExceeded, instance);\n eventBus.on(Events.SET_FRAGMENTED_TEXT_AFTER_DISABLED, _onSetFragmentedTextAfterDisabled, instance);\n eventBus.on(Events.SET_NON_FRAGMENTED_TEXT, _onSetNonFragmentedText, instance);\n eventBus.on(Events.SOURCE_BUFFER_ERROR, _onSourceBufferError, instance);\n eventBus.on(Events.BYTES_APPENDED_END_FRAGMENT, _onBytesAppended, instance);\n }\n\n function initialize(mediaSource, hasVideoTrack, isFragmented) {\n\n segmentsController = SegmentsController(context).create({\n events: Events,\n eventBus,\n streamInfo,\n timelineConverter,\n dashConstants: DashConstants,\n segmentBaseController: config.segmentBaseController,\n type\n });\n\n dashHandler = DashHandler(context).create({\n streamInfo,\n type,\n timelineConverter,\n dashMetrics,\n mediaPlayerModel,\n baseURLController: config.baseURLController,\n errHandler,\n segmentsController,\n settings,\n boxParser,\n events: Events,\n eventBus,\n errors: Errors,\n debug: Debug(context).getInstance(),\n requestModifier: RequestModifier(context).getInstance(),\n dashConstants: DashConstants,\n constants: Constants,\n urlUtils: URLUtils(context).getInstance()\n });\n\n isDynamic = streamInfo.manifestInfo.isDynamic;\n\n // Create/initialize controllers\n dashHandler.initialize(isDynamic);\n abrController.registerStreamType(type, instance);\n\n representationController = RepresentationController(context).create({\n streamInfo,\n type,\n abrController,\n dashMetrics,\n playbackController,\n timelineConverter,\n dashConstants: DashConstants,\n events: Events,\n eventBus,\n errors: Errors,\n isDynamic,\n adapter,\n segmentsController\n });\n\n bufferController = _createBufferControllerForType(type, isFragmented);\n if (bufferController) {\n bufferController.initialize(mediaSource);\n }\n\n scheduleController = ScheduleController(context).create({\n streamInfo,\n type,\n mimeType,\n adapter,\n dashMetrics,\n mediaPlayerModel,\n fragmentModel,\n abrController,\n playbackController,\n textController,\n mediaController,\n bufferController,\n representationController,\n settings\n });\n\n scheduleController.initialize(hasVideoTrack);\n\n bufferingTime = 0;\n shouldUseExplicitTimeForRequest = false;\n shouldRepeatRequest = false;\n }\n\n function getStreamId() {\n return streamInfo.id;\n }\n\n function getType() {\n return type;\n }\n\n function getIsTextTrack() {\n return adapter.getIsTextTrack(representationController.getData());\n }\n\n function resetInitialSettings() {\n mediaInfoArr = [];\n mediaInfo = null;\n bufferingTime = 0;\n shouldUseExplicitTimeForRequest = false;\n shouldRepeatRequest = false;\n qualityChangeInProgress = false;\n pendingSwitchToRepresentationInfo = null;\n }\n\n function reset(errored, keepBuffers) {\n if (dashHandler) {\n dashHandler.reset();\n }\n\n if (bufferController) {\n bufferController.reset(errored, keepBuffers);\n bufferController = null;\n }\n\n if (scheduleController) {\n scheduleController.reset();\n scheduleController = null;\n }\n\n if (representationController) {\n representationController.reset();\n representationController = null;\n }\n\n if (segmentsController) {\n segmentsController = null;\n }\n\n if (abrController) {\n abrController.unRegisterStreamType(getStreamId(), type);\n }\n\n eventBus.off(Events.DATA_UPDATE_COMPLETED, _onDataUpdateCompleted, instance);\n eventBus.off(Events.INIT_FRAGMENT_NEEDED, _onInitFragmentNeeded, instance);\n eventBus.off(Events.MEDIA_FRAGMENT_NEEDED, _onMediaFragmentNeeded, instance);\n eventBus.off(Events.INIT_FRAGMENT_LOADED, _onInitFragmentLoaded, instance);\n eventBus.off(Events.MEDIA_FRAGMENT_LOADED, _onMediaFragmentLoaded, instance);\n eventBus.off(Events.BUFFER_LEVEL_STATE_CHANGED, _onBufferLevelStateChanged, instance);\n eventBus.off(Events.BUFFER_CLEARED, _onBufferCleared, instance);\n eventBus.off(Events.SEEK_TARGET, _onSeekTarget, instance);\n eventBus.off(Events.FRAGMENT_LOADING_ABANDONED, _onFragmentLoadingAbandoned, instance);\n eventBus.off(Events.FRAGMENT_LOADING_COMPLETED, _onFragmentLoadingCompleted, instance);\n eventBus.off(Events.SET_FRAGMENTED_TEXT_AFTER_DISABLED, _onSetFragmentedTextAfterDisabled, instance);\n eventBus.off(Events.SET_NON_FRAGMENTED_TEXT, _onSetNonFragmentedText, instance);\n eventBus.off(Events.QUOTA_EXCEEDED, _onQuotaExceeded, instance);\n eventBus.off(Events.SOURCE_BUFFER_ERROR, _onSourceBufferError, instance);\n eventBus.off(Events.BYTES_APPENDED_END_FRAGMENT, _onBytesAppended, instance);\n\n\n resetInitialSettings();\n type = null;\n streamInfo = null;\n }\n\n function isUpdating() {\n return representationController ? representationController.isUpdating() : false;\n }\n\n /**\n * When a seek within the corresponding period occurs this function initiates the clearing of the buffer and sets the correct buffering time.\n * @param {object} e\n * @returns {Promise<any>}\n */\n function prepareInnerPeriodPlaybackSeeking(e) {\n return new Promise((resolve) => {\n\n // If we seek to a buffered area we can keep requesting where we left before the seek\n // If we seek back then forwards buffering will stop until we are below our buffer goal\n // If we seek forwards then pruneBuffer() will make sure that the bufferToKeep setting is respected\n const hasBufferAtTargetTime = bufferController.hasBufferAtTime(e.seekTime);\n if (hasBufferAtTargetTime) {\n bufferController.pruneBuffer();\n const continuousBufferTime = bufferController.getContinuousBufferTimeForTargetTime(e.seekTime);\n if (_shouldSetBufferingComplete(continuousBufferTime)) {\n bufferController.setIsBufferingCompleted(true);\n }\n resolve();\n return;\n }\n\n // Stop segment requests until we have figured out for which time we need to request a segment. We don't want to replace existing segments.\n scheduleController.clearScheduleTimer();\n fragmentModel.abortRequests();\n\n // Abort operations to the SourceBuffer Sink and reset the BufferControllers isBufferingCompleted state.\n bufferController.prepareForPlaybackSeek()\n .then(() => {\n // Clear the buffer. We need to prune everything which is not in the target interval.\n const clearRanges = bufferController.getAllRangesWithSafetyFactor(e.seekTime);\n // When everything has been pruned go on\n return bufferController.clearBuffers(clearRanges);\n })\n .then(() => {\n // Figure out the correct segment request time.\n const continuousBufferTime = bufferController.getContinuousBufferTimeForTargetTime(e.seekTime);\n\n // If the buffer is continuous and exceeds the duration of the period we are still done buffering. We need to trigger the buffering completed event in order to start prebuffering upcoming periods again\n if (_shouldSetBufferingComplete(continuousBufferTime)) {\n bufferController.setIsBufferingCompleted(true);\n resolve();\n } else {\n const targetTime = isNaN(continuousBufferTime) ? e.seekTime : continuousBufferTime;\n setExplicitBufferingTime(targetTime);\n bufferController.setSeekTarget(targetTime);\n\n const promises = [];\n\n // append window has been reset by abort() operation. Set the correct values again\n promises.push(bufferController.updateAppendWindow());\n\n // Timestamp offset couldve been changed by preloading period\n const representationInfo = getRepresentationInfo();\n promises.push(bufferController.updateBufferTimestampOffset(representationInfo));\n\n Promise.all(promises)\n .then(() => {\n // We might have aborted the append operation of an init segment. Append init segment again.\n scheduleController.setInitSegmentRequired(true);\n\n // Right after a seek we should not immediately check the playback quality\n scheduleController.setCheckPlaybackQuality(false);\n scheduleController.startScheduleTimer();\n resolve();\n });\n }\n })\n .catch((e) => {\n logger.error(e);\n });\n\n })\n }\n\n function _shouldSetBufferingComplete(continuousBufferTime) {\n return !isNaN(continuousBufferTime) && !isNaN(streamInfo.duration) && isFinite(streamInfo.duration) && continuousBufferTime >= streamInfo.start + streamInfo.duration\n }\n\n /**\n * Seek outside of the current period.\n * @return {Promise<unknown>}\n */\n function prepareOuterPeriodPlaybackSeeking() {\n return new Promise((resolve, reject) => {\n try {\n // Stop scheduling\n scheduleController.clearScheduleTimer();\n\n // Abort all ongoing requests\n fragmentModel.abortRequests();\n\n // buffering not complete anymore and abort current append operation to SourceBuffer\n bufferController.prepareForPlaybackSeek()\n .then(() => {\n // Clear the buffers completely.\n return bufferController.pruneAllSafely();\n })\n .then(() => {\n resolve();\n });\n\n } catch (e) {\n reject(e);\n }\n });\n }\n\n /**\n * ScheduleController indicates that an init segment needs to be fetched.\n * @param {object} e\n * @param {boolean} rescheduleIfNoRequest - Defines whether we reschedule in case no valid request could be generated\n * @private\n */\n function _onInitFragmentNeeded(e, rescheduleIfNoRequest = true) {\n // Event propagation may have been stopped (see MssHandler)\n if (!e.sender) return;\n\n if (playbackController.getIsManifestUpdateInProgress()) {\n _noValidRequest();\n return;\n }\n\n if (getIsTextTrack() && !textController.isTextEnabled()) return;\n\n if (bufferController && e.representationId) {\n if (!bufferController.appendInitSegmentFromCache(e.representationId)) {\n const rep = representationController.getCurrentRepresentation();\n // Dummy init segment (fragmented tracks without initialization segment)\n if (rep.range === 0) {\n _onMediaFragmentNeeded();\n return;\n }\n // Init segment not in cache, send new request\n const request = dashHandler ? dashHandler.getInitRequest(mediaInfo, rep) : null;\n if (request) {\n fragmentModel.executeRequest(request);\n } else if (rescheduleIfNoRequest) {\n scheduleController.setInitSegmentRequired(true);\n _noValidRequest();\n }\n }\n }\n }\n\n /**\n * ScheduleController indicates that a media segment is needed\n * @param {object} e\n * @param {boolean} rescheduleIfNoRequest - Defines whether we reschedule in case no valid request could be generated\n * @private\n */\n function _onMediaFragmentNeeded(e, rescheduleIfNoRequest = true) {\n // Don't schedule next fragments while updating manifest or pruning to avoid buffer inconsistencies\n if (playbackController.getIsManifestUpdateInProgress() || bufferController.getIsPruningInProgress()) {\n _noValidRequest();\n return;\n }\n\n let request = _getFragmentRequest();\n if (request) {\n shouldUseExplicitTimeForRequest = false;\n shouldRepeatRequest = false;\n _mediaRequestGenerated(request);\n } else {\n _noMediaRequestGenerated(rescheduleIfNoRequest);\n }\n }\n\n /**\n * If we generated a valid media request we can execute the request. In some cases the segment might be blacklisted.\n * @param {object} request\n * @private\n */\n function _mediaRequestGenerated(request) {\n if (!isNaN(request.startTime + request.duration)) {\n bufferingTime = request.startTime + request.duration;\n }\n request.delayLoadingTime = new Date().getTime() + scheduleController.getTimeToLoadDelay();\n scheduleController.setTimeToLoadDelay(0);\n if (!_shouldIgnoreRequest(request)) {\n logger.debug(`Next fragment request url for stream id ${streamInfo.id} and media type ${type} is ${request.url}`);\n fragmentModel.executeRequest(request);\n } else {\n logger.warn(`Fragment request url ${request.url} for stream id ${streamInfo.id} and media type ${type} is on the ignore list and will be skipped`);\n _noValidRequest();\n }\n }\n\n /**\n * We could not generate a valid request. Check if the media is finished, we are stuck in a gap or simply need to wait for the next segment to be available.\n * @param {boolean} rescheduleIfNoRequest\n * @private\n */\n function _noMediaRequestGenerated(rescheduleIfNoRequest) {\n const representation = representationController.getCurrentRepresentation();\n\n // If this statement is true we might be stuck. A static manifest does not change and we did not find a valid request for the target time\n // There is no point in trying again. We need to adjust the time in order to find a valid request. This can happen if the user/app seeked into a gap.\n // For dynamic manifests this can also happen especially if we jump over the gap in the previous period and are using SegmentTimeline and in case there is a positive eptDelta at the beginning of the period we are stuck.\n if (settings.get().streaming.gaps.enableSeekFix && (shouldUseExplicitTimeForRequest || playbackController.getTime() === 0)) {\n let adjustedTime;\n if (!isDynamic) {\n adjustedTime = dashHandler.getValidTimeAheadOfTargetTime(bufferingTime, mediaInfo, representation, settings.get().streaming.gaps.threshold);\n } else if (isDynamic && representation.segmentInfoType === DashConstants.SEGMENT_TIMELINE) {\n // If we find a valid request ahead of the current time then we are in a gap. Segments are only added at the end of the timeline\n adjustedTime = dashHandler.getValidTimeAheadOfTargetTime(bufferingTime, mediaInfo, representation, settings.get().streaming.gaps.threshold,);\n }\n if (!isNaN(adjustedTime) && adjustedTime !== bufferingTime) {\n if (playbackController.isSeeking() || playbackController.getTime() === 0) {\n // If we are seeking then playback is stalled. Do a seek to get out of this situation\n logger.warn(`Adjusting playback time ${adjustedTime} because of gap in the manifest. Seeking by ${adjustedTime - bufferingTime}`);\n playbackController.seek(adjustedTime, false, false);\n } else {\n // If we are not seeking we should still be playing but we cant find anything to buffer. So we adjust the buffering time and leave the gap jump to the GapController\n logger.warn(`Adjusting buffering time ${adjustedTime} because of gap in the manifest. Adjusting time by ${adjustedTime - bufferingTime}`);\n setExplicitBufferingTime(adjustedTime)\n\n if (rescheduleIfNoRequest) {\n _noValidRequest();\n }\n }\n return;\n }\n }\n\n // Check if the media is finished. If so, no need to schedule another request\n const isLastSegmentRequested = dashHandler.isLastSegmentRequested(representation, bufferingTime);\n if (isLastSegmentRequested) {\n const segmentIndex = dashHandler.getCurrentIndex();\n logger.debug(`Segment requesting for stream ${streamInfo.id} has finished`);\n eventBus.trigger(Events.STREAM_REQUESTING_COMPLETED, { segmentIndex }, {\n streamId: streamInfo.id,\n mediaType: type\n });\n bufferController.segmentRequestingCompleted(segmentIndex);\n scheduleController.clearScheduleTimer();\n return;\n }\n\n if (rescheduleIfNoRequest) {\n _noValidRequest();\n }\n }\n\n /**\n * In certain situations we need to ignore a request. For instance, if a segment is blacklisted because it caused an MSE error.\n * @private\n */\n function _shouldIgnoreRequest(request) {\n let blacklistUrl = request.url;\n\n if (request.range) {\n blacklistUrl = blacklistUrl.concat('_', request.range);\n }\n\n return segmentBlacklistController.contains(blacklistUrl)\n }\n\n /**\n * Get the init or media segment request using the DashHandler.\n * @return {null|FragmentRequest|null}\n * @private\n */\n function _getFragmentRequest() {\n const representationInfo = getRepresentationInfo();\n let request;\n\n if (isNaN(bufferingTime) || (getType() === Constants.TEXT && !textController.isTextEnabled())) {\n return null;\n }\n\n if (dashHandler) {\n const representation = representationController && representationInfo ? representationController.getRepresentationForQuality(representationInfo.quality) : null;\n\n if (shouldUseExplicitTimeForRequest) {\n request = dashHandler.getSegmentRequestForTime(mediaInfo, representation, bufferingTime);\n } else if (shouldRepeatRequest) {\n request = dashHandler.repeatSegmentRequest(mediaInfo, representation);\n } else {\n request = dashHandler.getNextSegmentRequest(mediaInfo, representation);\n }\n }\n\n return request;\n }\n\n /**\n * Whenever we can not generate a valid request we restart scheduling according to the timeouts defined in the settings.\n * @private\n */\n function _noValidRequest() {\n scheduleController.startScheduleTimer(playbackController.getLowLatencyModeEnabled() ? settings.get().streaming.scheduling.lowLatencyTimeout : settings.get().streaming.scheduling.defaultTimeout);\n }\n\n function _onDataUpdateCompleted(e) {\n if (!e.error) {\n if (!bufferController.getIsBufferingCompleted()) {\n bufferController.updateBufferTimestampOffset(e.currentRepresentation);\n }\n }\n }\n\n function _onBufferLevelStateChanged(e) {\n dashMetrics.addBufferState(type, e.state, scheduleController.getBufferTarget());\n if (e.state === MetricsConstants.BUFFER_EMPTY && !playbackController.isSeeking()) {\n logger.info('Buffer is empty! Stalling!');\n dashMetrics.pushPlayListTraceMetrics(new Date(), PlayListTrace.REBUFFERING_REASON);\n }\n }\n\n function _onBufferCleared(e) {\n // Remove executed requests not buffered anymore\n fragmentModel.syncExecutedRequestsWithBufferedRange(\n bufferController.getBuffer().getAllBufferRanges(),\n streamInfo.duration);\n\n // If buffer removed ahead current time (QuotaExceededError or automatic buffer pruning) then adjust current index handler time\n if (e.quotaExceeded && e.from > playbackController.getTime()) {\n setExplicitBufferingTime(e.from);\n }\n\n // (Re)start schedule once buffer has been pruned after a QuotaExceededError\n if (e.hasEnoughSpaceToAppend && e.quotaExceeded) {\n scheduleController.startScheduleTimer();\n }\n }\n\n /**\n * This function is called when the corresponding SourceBuffer encountered an error.\n * We blacklist the last segment assuming it caused the error\n * @param {object} e\n * @private\n */\n function _onSourceBufferError(e) {\n if (!e || !e.lastRequestAppended || !e.lastRequestAppended.url) {\n return;\n }\n\n let blacklistUrl = e.lastRequestAppended.url;\n\n if (e.lastRequestAppended.range) {\n blacklistUrl = blacklistUrl.concat('_', e.lastRequestAppended.range);\n }\n logger.warn(`Blacklisting segment with url ${blacklistUrl}`);\n segmentBlacklistController.add(blacklistUrl);\n }\n\n function _onBytesAppended(e) {\n logger.debug(`Appended bytes for ${e.mediaType} and stream id ${e.streamId}`);\n\n // we save the last initialized quality. That way we make sure that the media fragments we are about to append match the init segment\n if (e.segmentType === HTTPRequest.INIT_SEGMENT_TYPE) {\n const lastInitializedQuality = e.quality;\n scheduleController.setLastInitializedQuality(lastInitializedQuality);\n logger.info('[' + type + '] ' + 'lastInitializedRepresentationInfo changed to ' + e.quality);\n }\n\n if (pendingSwitchToRepresentationInfo) {\n _prepareForDefaultQualitySwitch(pendingSwitchToRepresentationInfo)\n } else {\n scheduleController.startScheduleTimer(0);\n }\n }\n\n /**\n * The quality has changed which means we have switched to a different representation.\n * If we want to aggressively replace existing parts in the buffer we need to make sure that the new quality is higher than the already buffered one.\n * @param {object} e\n */\n function prepareQualityChange(e) {\n if (pendingSwitchToRepresentationInfo) {\n logger.warn(`Canceling queued representation switch to ${pendingSwitchToRepresentationInfo.quality} for ${type}`);\n }\n logger.debug(`Preparing quality switch for type ${type}`);\n const newQuality = e.newQuality;\n\n qualityChangeInProgress = true;\n\n // Stop scheduling until we are done with preparing the quality switch\n scheduleController.clearScheduleTimer();\n\n representationController.prepareQualityChange(newQuality);\n\n const representationInfo = getRepresentationInfo(newQuality);\n // If the switch should occur immediately we need to replace existing stuff in the buffer\n if (e.reason && e.reason.forceReplace) {\n _prepareForForceReplacementQualitySwitch(representationInfo);\n }\n\n // We abandoned a current request\n else if (e && e.reason && e.reason.forceAbandon) {\n _prepareForAbandonQualitySwitch(representationInfo)\n }\n\n // If fast switch is enabled we check if we are supposed to replace existing stuff in the buffer\n else if (settings.get().streaming.buffer.fastSwitchEnabled) {\n _prepareForFastQualitySwitch(representationInfo);\n }\n\n // Default quality switch. We append the new quality to the already buffered stuff\n else {\n _prepareForDefaultQualitySwitch(representationInfo);\n }\n\n dashMetrics.pushPlayListTraceMetrics(new Date(), PlayListTrace.REPRESENTATION_SWITCH_STOP_REASON);\n dashMetrics.createPlaylistTraceMetrics(representationInfo.id, playbackController.getTime() * 1000, playbackController.getPlaybackRate());\n\n }\n\n function _prepareForForceReplacementQualitySwitch(representationInfo) {\n\n // Abort the current request to avoid inconsistencies and in case a rule such as AbandonRequestRule has forced a quality switch. A quality switch can also be triggered manually by the application.\n // If we update the buffer values now, or initialize a request to the new init segment, the currently downloading media segment might \"work\" with wrong values.\n // Everything that is already in the buffer queue is ok and will be handled by the corresponding function below depending on the switch mode.\n fragmentModel.abortRequests();\n\n // Inform other classes like the GapController that we are replacing existing stuff\n eventBus.trigger(Events.BUFFER_REPLACEMENT_STARTED, {\n mediaType: type,\n streamId: streamInfo.id\n }, { mediaType: type, streamId: streamInfo.id });\n\n // Abort appending segments to the buffer. Also adjust the appendWindow as we might have been in the progress of prebuffering stuff.\n scheduleController.setCheckPlaybackQuality(false);\n bufferController.prepareForForceReplacementQualitySwitch(representationInfo)\n .then(() => {\n _bufferClearedForReplacement();\n pendingSwitchToRepresentationInfo = null;\n qualityChangeInProgress = false;\n })\n .catch(() => {\n _bufferClearedForReplacement();\n pendingSwitchToRepresentationInfo = null;\n qualityChangeInProgress = false;\n });\n }\n\n function _prepareForAbandonQualitySwitch(representationInfo) {\n bufferController.updateBufferTimestampOffset(representationInfo)\n .then(() => {\n fragmentModel.abortRequests();\n shouldRepeatRequest = true;\n scheduleController.setCheckPlaybackQuality(false);\n scheduleController.startScheduleTimer();\n qualityChangeInProgress = false;\n pendingSwitchToRepresentationInfo = null;\n })\n .catch(() => {\n pendingSwitchToRepresentationInfo = null;\n qualityChangeInProgress = false;\n })\n }\n\n function _prepareForFastQualitySwitch(representationInfo) {\n // if we switch up in quality and need to replace existing parts in the buffer we need to adjust the buffer target\n const time = playbackController.getTime();\n let safeBufferLevel = 1.5 * (!isNaN(representationInfo.fragmentDuration) ? representationInfo.fragmentDuration : 1);\n const request = fragmentModel.getRequests({\n state: FragmentModel.FRAGMENT_MODEL_EXECUTED,\n time: time + safeBufferLevel,\n threshold: 0\n })[0];\n\n if (request && !getIsTextTrack()) {\n const bufferLevel = bufferController.getBufferLevel();\n const abandonmentState = abrController.getAbandonmentStateFor(streamInfo.id, type);\n\n // The quality we originally requested was lower than the new quality\n if (request.quality < representationInfo.quality && bufferLevel >= safeBufferLevel && abandonmentState !== MetricsConstants.ABANDON_LOAD) {\n bufferController.updateBufferTimestampOffset(representationInfo)\n .then(() => {\n // Abort the current request to avoid inconsistencies and in case a rule such as AbandonRequestRule has forced a quality switch. A quality switch can also be triggered manually by the application.\n // If we update the buffer values now, or initialize a request to the new init segment, the currently downloading media segment might \"work\" with wrong values.\n // Everything that is already in the buffer queue is ok\n fragmentModel.abortRequests();\n const targetTime = time + safeBufferLevel;\n setExplicitBufferingTime(targetTime);\n scheduleController.setCheckPlaybackQuality(false);\n scheduleController.startScheduleTimer();\n qualityChangeInProgress = false;\n })\n .catch(() => {\n qualityChangeInProgress = false;\n })\n }\n\n // If we have buffered a higher quality do not replace anything\n else {\n _prepareForDefaultQualitySwitch(representationInfo);\n }\n } else {\n _prepareForDefaultQualitySwitch(representationInfo);\n }\n }\n\n function _prepareForDefaultQualitySwitch(representationInfo) {\n // We are not canceling the current request. Check if there is still an ongoing request.\n // If so we wait for the request to be finished and the media to be appended\n const ongoingRequests = fragmentModel.getRequests({ state: FragmentModel.FRAGMENT_MODEL_LOADING })\n if (ongoingRequests && ongoingRequests.length > 0) {\n logger.debug('Preparing for default quality switch: Waiting for ongoing segment request to be finished before applying switch.')\n pendingSwitchToRepresentationInfo = representationInfo;\n return;\n }\n\n bufferController.updateBufferTimestampOffset(representationInfo)\n .then(() => {\n scheduleController.setCheckPlaybackQuality(false);\n if (mediaInfo.segmentAlignment || mediaInfo.subSegmentAlignment) {\n scheduleController.startScheduleTimer();\n } else {\n _bufferClearedForNonReplacement()\n }\n pendingSwitchToRepresentationInfo = null;\n qualityChangeInProgress = false;\n })\n .catch(() => {\n pendingSwitchToRepresentationInfo = null;\n qualityChangeInProgress = false;\n })\n }\n\n /**\n * We have canceled the download of a fragment and need to adjust the buffer time or reload an init segment\n * @param {object} e\n */\n function _onFragmentLoadingAbandoned(e) {\n logger.info('onFragmentLoadingAbandoned request: ' + e.request.url + ' has been aborted');\n\n // we only need to handle this if we are not seeking, not switching the tracks and not switching the quality\n if (!playbackController.isSeeking() && !scheduleController.getSwitchTrack() && !qualityChangeInProgress) {\n logger.info('onFragmentLoadingAbandoned request: ' + e.request.url + ' has to be downloaded again, origin is not seeking process or switch track call');\n\n // in case of an init segment we force the download of an init segment\n if (e.request && e.request.isInitializationRequest()) {\n scheduleController.setInitSegmentRequired(true);\n }\n\n // in case of a media segment we reset the buffering time\n else {\n setExplicitBufferingTime(e.request.startTime + (e.request.duration / 2));\n }\n\n // In case of a seek the schedule controller was stopped and will be started once the buffer has been pruned.\n scheduleController.startScheduleTimer(0);\n }\n }\n\n /**\n * When a fragment has been loaded we need to start the schedule timer again in case of an error.\n * @param {object} e\n */\n function _onFragmentLoadingCompleted(e) {\n logger.info('OnFragmentLoadingCompleted for stream id ' + streamInfo.id + ' and media type ' + type + ' - Url:', e.request ? e.request.url : 'undefined', e.request.range ? ', Range:' + e.request.range : '');\n\n if (getIsTextTrack()) {\n scheduleController.startScheduleTimer(0);\n }\n\n if (e.error && e.request.serviceLocation) {\n _handleFragmentLoadingError(e);\n }\n }\n\n /**\n * If we encountered an error when loading the fragment we need to handle it according to the segment type\n * @private\n */\n function _handleFragmentLoadingError(e) {\n logger.info(`Fragment loading completed with an error`);\n\n if (!e || !e.request || !e.request.type) {\n return;\n }\n\n // In case there are baseUrls that can still be tried a valid request can be generated. If no valid request can be generated we ran out of baseUrls.\n // Consequently, we need to signal that we dont want to retry in case no valid request could be generated otherwise we keep trying with the same url infinitely.\n\n // Init segment could not be loaded. If we have multiple baseUrls we still have a chance to get a valid segment.\n if (e.request.type === HTTPRequest.INIT_SEGMENT_TYPE) {\n _onInitFragmentNeeded({\n representationId: e.request.representationId,\n sender: {}\n }, false)\n }\n\n // Media segment could not be loaded\n else if (e.request.type === HTTPRequest.MEDIA_SEGMENT_TYPE) {\n setExplicitBufferingTime(e.request.startTime + (e.request.duration / 2));\n _onMediaFragmentNeeded({}, false);\n }\n }\n\n /**\n * Callback function triggered by the TextController whenever a track is changed for fragmented text. Will only be triggered if textracks have previously been disabled.\n * @private\n */\n function _onSetFragmentedTextAfterDisabled() {\n setExplicitBufferingTime(playbackController.getTime());\n getScheduleController().startScheduleTimer();\n }\n\n /**\n * Callback function triggered by the TextController whenever a track is changed for non fragmented text\n * @param {object} e\n * @private\n */\n function _onSetNonFragmentedText(e) {\n const currentTrackInfo = e.currentTrackInfo;\n\n if (!currentTrackInfo) {\n return;\n }\n\n const mInfo = mediaInfoArr.find((info) => {\n return info.index === currentTrackInfo.index && info.lang === currentTrackInfo.lang;\n });\n\n if (mInfo) {\n selectMediaInfo(mInfo)\n .then(() => {\n bufferController.setIsBufferingCompleted(false);\n setExplicitBufferingTime(playbackController.getTime());\n scheduleController.setInitSegmentRequired(true);\n scheduleController.startScheduleTimer();\n });\n }\n }\n\n function _onQuotaExceeded(e) {\n // Stop scheduler (will be restarted once buffer is pruned)\n setExplicitBufferingTime(e.quotaExceededTime);\n scheduleController.clearScheduleTimer();\n }\n\n function getRepresentationController() {\n return representationController;\n }\n\n function getBuffer() {\n return bufferController ? bufferController.getBuffer() : null;\n }\n\n function getBufferController() {\n return bufferController;\n }\n\n function dischargePreBuffer() {\n bufferController.dischargePreBuffer();\n }\n\n function getFragmentModel() {\n return fragmentModel;\n }\n\n function updateStreamInfo(newStreamInfo) {\n streamInfo = newStreamInfo;\n if (!isBufferingCompleted()) {\n return bufferController.updateAppendWindow();\n }\n return Promise.resolve();\n }\n\n function getStreamInfo() {\n return streamInfo;\n }\n\n /**\n * Called once the StreamProcessor is initialized and when the track is switched. We only have one StreamProcessor per media type. So we need to adjust the mediaInfo once we switch/select a track.\n * @param {object} newMediaInfo\n */\n function selectMediaInfo(newMediaInfo) {\n if (newMediaInfo !== mediaInfo && (!newMediaInfo || !mediaInfo || (newMediaInfo.type === mediaInfo.type))) {\n mediaInfo = newMediaInfo;\n }\n\n const newRealAdaptation = adapter.getRealAdaptation(streamInfo, mediaInfo);\n const voRepresentations = adapter.getVoRepresentations(mediaInfo);\n\n if (representationController) {\n const realAdaptation = representationController.getData();\n const maxQuality = abrController.getMaxAllowedIndexFor(type, streamInfo.id);\n const minIdx = abrController.getMinAllowedIndexFor(type, streamInfo.id);\n\n let quality,\n averageThroughput;\n let bitrate = null;\n\n if ((realAdaptation === null || (realAdaptation.id !== newRealAdaptation.id)) && type !== Constants.TEXT) {\n averageThroughput = abrController.getThroughputHistory().getAverageThroughput(type, isDynamic);\n bitrate = averageThroughput || abrController.getInitialBitrateFor(type, streamInfo.id);\n quality = abrController.getQualityForBitrate(mediaInfo, bitrate, streamInfo.id);\n } else {\n quality = abrController.getQualityFor(type, streamInfo.id);\n }\n\n if (minIdx !== undefined && quality < minIdx) {\n quality = minIdx;\n }\n if (quality > maxQuality) {\n quality = maxQuality;\n }\n return representationController.updateData(newRealAdaptation, voRepresentations, type, mediaInfo.isFragmented, quality);\n } else {\n return Promise.resolve();\n }\n }\n\n function addMediaInfo(newMediaInfo) {\n if (mediaInfoArr.indexOf(newMediaInfo) === -1) {\n mediaInfoArr.push(newMediaInfo);\n }\n }\n\n function clearMediaInfoArray() {\n mediaInfoArr = [];\n }\n\n function getMediaInfo() {\n return mediaInfo;\n }\n\n function getMediaSource() {\n return bufferController.getMediaSource();\n }\n\n function setMediaSource(mediaSource) {\n return bufferController.setMediaSource(mediaSource, mediaInfo);\n }\n\n function getScheduleController() {\n return scheduleController;\n }\n\n /**\n * Get a specific voRepresentation. If quality parameter is defined, this function will return the voRepresentation for this quality.\n * Otherwise, this function will return the current voRepresentation used by the representationController.\n * @param {number} quality - quality index of the voRepresentaion expected.\n */\n function getRepresentationInfo(quality) {\n let voRepresentation;\n\n if (quality !== undefined) {\n checkInteger(quality);\n voRepresentation = representationController ? representationController.getRepresentationForQuality(quality) : null;\n } else {\n voRepresentation = representationController ? representationController.getCurrentRepresentation() : null;\n }\n\n return adapter.convertRepresentationToRepresentationInfo(voRepresentation);\n }\n\n function isBufferingCompleted() {\n return bufferController ? bufferController.getIsBufferingCompleted() : false;\n }\n\n function getBufferLevel() {\n return bufferController ? bufferController.getBufferLevel() : 0;\n }\n\n /**\n * Probe the next request. This is used in the CMCD model to get information about the upcoming request. Note: No actual request is performed here.\n * @return {FragmentRequest|null}\n */\n function probeNextRequest() {\n const representationInfo = getRepresentationInfo();\n\n const representation = representationController && representationInfo ?\n representationController.getRepresentationForQuality(representationInfo.quality) : null;\n\n return dashHandler.getNextSegmentRequestIdempotent(\n mediaInfo,\n representation\n );\n }\n\n function _onInitFragmentLoaded(e) {\n if (!settings.get().streaming.enableManifestTimescaleMismatchFix) {\n return;\n }\n const chunk = e.chunk;\n const bytes = chunk.bytes;\n const quality = chunk.quality;\n const currentRepresentation = getRepresentationInfo(quality);\n const voRepresentation = representationController && currentRepresentation ? representationController.getRepresentationForQuality(currentRepresentation.quality) : null;\n if (currentRepresentation && voRepresentation) {\n voRepresentation.timescale = boxParser.getMediaTimescaleFromMoov(bytes);\n }\n }\n\n function _onMediaFragmentLoaded(e) {\n const chunk = e.chunk;\n\n const bytes = chunk.bytes;\n const quality = chunk.quality;\n const currentRepresentation = getRepresentationInfo(quality);\n const voRepresentation = representationController && currentRepresentation ? representationController.getRepresentationForQuality(currentRepresentation.quality) : null;\n\n // If we switch tracks this event might be fired after the representations in the RepresentationController have been updated according to the new MediaInfo.\n // In this case there will be no currentRepresentation and voRepresentation matching the \"old\" quality\n if (currentRepresentation && voRepresentation) {\n\n let isoFile;\n\n // Check for inband prft on media segment (if enabled)\n if (settings.get().streaming.parseInbandPrft && e.request.type === HTTPRequest.MEDIA_SEGMENT_TYPE) {\n isoFile = isoFile ? isoFile : boxParser.parse(bytes);\n const timescale = voRepresentation.timescale;\n const prfts = _handleInbandPrfts(isoFile, timescale);\n if (prfts && prfts.length) {\n eventBus.trigger(MediaPlayerEvents.INBAND_PRFT,\n { data: prfts },\n { streamId: streamInfo.id, mediaType: type }\n );\n }\n }\n\n const eventStreamMedia = adapter.getEventsFor(currentRepresentation.mediaInfo, null, streamInfo);\n const eventStreamTrack = adapter.getEventsFor(currentRepresentation, voRepresentation, streamInfo);\n\n if (eventStreamMedia && eventStreamMedia.length > 0 || eventStreamTrack && eventStreamTrack.length > 0) {\n const request = fragmentModel.getRequests({\n state: FragmentModel.FRAGMENT_MODEL_EXECUTED,\n quality: quality,\n index: chunk.index\n })[0];\n\n isoFile = isoFile ? isoFile : boxParser.parse(bytes);\n const events = _handleInbandEvents(isoFile, request, eventStreamMedia, eventStreamTrack);\n eventBus.trigger(Events.INBAND_EVENTS,\n { events: events },\n { streamId: streamInfo.id }\n );\n }\n }\n }\n\n function _handleInbandPrfts(isoFile, timescale) {\n const prftBoxes = isoFile.getBoxes('prft');\n\n const prfts = [];\n prftBoxes.forEach(prft => {\n prfts.push(_parsePrftBox(prft, timescale));\n });\n\n return prfts;\n }\n\n function _parsePrftBox(prft, timescale) {\n // Get prft type according to box flags\n let type = 'unknown';\n switch (prft.flags) {\n case 0:\n type = DashConstants.PRODUCER_REFERENCE_TIME_TYPE.ENCODER;\n break;\n case 16:\n type = DashConstants.PRODUCER_REFERENCE_TIME_TYPE.APPLICATION;\n break;\n case 24:\n type = DashConstants.PRODUCER_REFERENCE_TIME_TYPE.CAPTURED;\n break;\n default:\n break;\n }\n\n // Get NPT timestamp according to IETF RFC 5905, relative to 1/1/1900\n let ntpTimestamp = (prft.ntp_timestamp_sec * 1000) + (prft.ntp_timestamp_frac / 2 ** 32 * 1000);\n ntpTimestamp = TimeUtils(context).getInstance().ntpToUTC(ntpTimestamp);\n\n const mediaTime = (prft.media_time / timescale);\n\n return {\n type,\n ntpTimestamp,\n mediaTime\n }\n }\n\n function _handleInbandEvents(isoFile, request, mediaInbandEvents, trackInbandEvents) {\n try {\n const eventStreams = {};\n const events = [];\n\n /* Extract the possible schemeIdUri : If a DASH client detects an event message box with a scheme that is not defined in MPD, the client is expected to ignore it */\n const inbandEvents = mediaInbandEvents.concat(trackInbandEvents);\n for (let i = 0, ln = inbandEvents.length; i < ln; i++) {\n eventStreams[inbandEvents[i].schemeIdUri + '/' + inbandEvents[i].value] = inbandEvents[i];\n }\n\n const eventBoxes = isoFile.getBoxes('emsg');\n\n if (!eventBoxes || eventBoxes.length === 0) {\n return events;\n }\n\n const sidx = isoFile.getBox('sidx');\n const mediaAnchorTime = sidx && !isNaN(sidx.earliest_presentation_time) && !isNaN(sidx.timescale) ? sidx.earliest_presentation_time / sidx.timescale : request && !isNaN(request.mediaStartTime) ? request.mediaStartTime : 0;\n const fragmentMediaStartTime = Math.max(mediaAnchorTime, 0);\n const voRepresentation = representationController.getCurrentRepresentation();\n\n for (let i = 0, ln = eventBoxes.length; i < ln; i++) {\n const event = adapter.getEvent(eventBoxes[i], eventStreams, fragmentMediaStartTime, voRepresentation);\n\n if (event) {\n events.push(event);\n }\n }\n\n return events;\n } catch (e) {\n return [];\n }\n }\n\n function createBufferSinks(previousBufferSinks) {\n const buffer = getBuffer();\n\n if (buffer) {\n return Promise.resolve(buffer);\n }\n\n return bufferController ? bufferController.createBufferSink(mediaInfo, previousBufferSinks) : Promise.resolve(null);\n }\n\n function prepareTrackSwitch() {\n return new Promise((resolve) => {\n logger.debug(`Preparing track switch for type ${type}`);\n const shouldReplace = type === Constants.TEXT || (settings.get().streaming.trackSwitchMode[type] === Constants.TRACK_SWITCH_MODE_ALWAYS_REPLACE && playbackController.getTimeToStreamEnd(streamInfo) > settings.get().streaming.buffer.stallThreshold);\n\n // when buffering is completed and we are not supposed to replace anything do nothing.\n // Still we need to trigger preloading again and call change type in case user seeks back before transitioning to next period\n if (bufferController.getIsBufferingCompleted() && !shouldReplace) {\n bufferController.prepareForNonReplacementTrackSwitch(mediaInfo.codec)\n .then(() => {\n eventBus.trigger(Events.BUFFERING_COMPLETED, {}, { streamId: streamInfo.id, mediaType: type })\n })\n .catch(() => {\n eventBus.trigger(Events.BUFFERING_COMPLETED, {}, { streamId: streamInfo.id, mediaType: type })\n })\n resolve();\n return;\n }\n\n // We stop the schedule controller and signal a track switch. That way we request a new init segment next\n scheduleController.clearScheduleTimer();\n scheduleController.setSwitchTrack(true);\n\n // when we are supposed to replace it does not matter if buffering is already completed\n if (shouldReplace) {\n // Inform other classes like the GapController that we are replacing existing stuff\n eventBus.trigger(Events.BUFFER_REPLACEMENT_STARTED, {\n mediaType: type,\n streamId: streamInfo.id\n }, { mediaType: type, streamId: streamInfo.id });\n\n // Abort the current request it will be removed from the buffer anyways\n fragmentModel.abortRequests();\n\n // Abort appending segments to the buffer. Also adjust the appendWindow as we might have been in the progress of prebuffering stuff.\n bufferController.prepareForReplacementTrackSwitch(mediaInfo.codec)\n .then(() => {\n // Timestamp offset couldve been changed by preloading period\n const representationInfo = getRepresentationInfo();\n return bufferController.updateBufferTimestampOffset(representationInfo);\n })\n .then(() => {\n _bufferClearedForReplacement();\n resolve();\n })\n .catch(() => {\n _bufferClearedForReplacement();\n resolve();\n });\n } else {\n // We do not replace anything that is already in the buffer. Still we need to prepare the buffer for the track switch\n bufferController.prepareForNonReplacementTrackSwitch(mediaInfo.codec)\n .then(() => {\n _bufferClearedForNonReplacement();\n resolve();\n })\n .catch(() => {\n _bufferClearedForNonReplacement();\n resolve();\n });\n }\n })\n }\n\n /**\n * For an instant track switch we need to adjust the buffering time after the buffer has been pruned.\n * @private\n */\n function _bufferClearedForReplacement() {\n const targetTime = playbackController.getTime();\n\n if (settings.get().streaming.buffer.flushBufferAtTrackSwitch) {\n // For some devices (like chromecast) it is necessary to seek the video element to reset the internal decoding buffer,\n // otherwise audio track switch will be effective only once after previous buffered track is consumed\n playbackController.seek(targetTime + 0.001, false, true);\n }\n\n setExplicitBufferingTime(targetTime);\n bufferController.setSeekTarget(targetTime);\n scheduleController.startScheduleTimer();\n }\n\n function _bufferClearedForNonReplacement() {\n const time = playbackController.getTime();\n const continuousBufferTime = bufferController.getContinuousBufferTimeForTargetTime(time);\n const targetTime = isNaN(continuousBufferTime) ? time : continuousBufferTime;\n\n setExplicitBufferingTime(targetTime);\n scheduleController.startScheduleTimer();\n }\n\n function _createBufferControllerForType(type, isFragmented) {\n let controller = null;\n\n if (!type) {\n errHandler.error(new DashJSError(Errors.MEDIASOURCE_TYPE_UNSUPPORTED_CODE, Errors.MEDIASOURCE_TYPE_UNSUPPORTED_MESSAGE + 'not properly defined'));\n return null;\n }\n\n if (type === Constants.TEXT && !isFragmented) {\n controller = NotFragmentedTextBufferController(context).create({\n streamInfo,\n type,\n mimeType,\n fragmentModel,\n textController,\n errHandler,\n settings\n });\n } else {\n controller = BufferController(context).create({\n streamInfo,\n type,\n mediaPlayerModel,\n manifestModel,\n fragmentModel,\n errHandler,\n mediaController,\n representationController,\n adapter,\n textController,\n abrController,\n playbackController,\n settings\n });\n }\n\n return controller;\n }\n\n function _onSeekTarget(e) {\n if (e && !isNaN(e.time)) {\n setExplicitBufferingTime(e.time);\n bufferController.setSeekTarget(e.time);\n }\n }\n\n function setExplicitBufferingTime(value) {\n bufferingTime = value;\n shouldUseExplicitTimeForRequest = true;\n }\n\n function finalisePlayList(time, reason) {\n dashMetrics.pushPlayListTraceMetrics(time, reason);\n }\n\n instance = {\n initialize,\n getStreamId,\n getType,\n isUpdating,\n getBufferController,\n dischargePreBuffer,\n getFragmentModel,\n getScheduleController,\n getRepresentationController,\n getRepresentationInfo,\n getBufferLevel,\n isBufferingCompleted,\n createBufferSinks,\n updateStreamInfo,\n getStreamInfo,\n selectMediaInfo,\n clearMediaInfoArray,\n addMediaInfo,\n prepareTrackSwitch,\n prepareQualityChange,\n getMediaInfo,\n getMediaSource,\n setMediaSource,\n getBuffer,\n setExplicitBufferingTime,\n finalisePlayList,\n probeNextRequest,\n prepareInnerPeriodPlaybackSeeking,\n prepareOuterPeriodPlaybackSeeking,\n reset\n };\n\n setup();\n\n return instance;\n}\n\nStreamProcessor.__dashjs_factory_name = 'StreamProcessor';\nexport default FactoryMaker.getClassFactory(StreamProcessor);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n * @class\n * @ignore\n */\nclass DataChunk {\n //Represents a data structure that keep all the necessary info about a single init/media segment\n constructor() {\n this.streamId = null;\n this.mediaInfo = null;\n this.segmentType = null;\n this.quality = NaN;\n this.index = NaN;\n this.bytes = null;\n this.start = NaN;\n this.end = NaN;\n this.duration = NaN;\n this.representationId = null;\n this.endFragment = null;\n }\n}\n\nexport default DataChunk;","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport FactoryMaker from '../../core/FactoryMaker';\nimport Settings from '../../core/Settings';\nimport Constants from '../constants/Constants';\nimport { modifyRequest } from '../utils/RequestModifier';\n\n/**\n * @module FetchLoader\n * @ignore\n * @description Manages download of resources via HTTP using fetch.\n * @param {Object} cfg - dependencies from parent\n */\nfunction FetchLoader(cfg) {\n\n cfg = cfg || {};\n const context = this.context;\n const requestModifier = cfg.requestModifier;\n const lowLatencyThroughputModel = cfg.lowLatencyThroughputModel;\n const boxParser = cfg.boxParser;\n const settings = Settings(context).getInstance();\n let instance, dashMetrics;\n\n function setup(cfg) {\n dashMetrics = cfg.dashMetrics;\n }\n\n function load(httpRequest) {\n if (requestModifier && requestModifier.modifyRequest) {\n modifyRequest(httpRequest, requestModifier)\n .then(() => request(httpRequest));\n }\n else {\n request(httpRequest);\n }\n }\n\n function request(httpRequest) {\n // Variables will be used in the callback functions\n const requestStartTime = new Date();\n const request = httpRequest.request;\n\n const headers = new Headers(); /*jshint ignore:line*/\n if (request.range) {\n headers.append('Range', 'bytes=' + request.range);\n }\n\n if (httpRequest.headers) {\n for (let header in httpRequest.headers) {\n let value = httpRequest.headers[header];\n if (value) {\n headers.append(header, value);\n }\n }\n }\n\n if (!request.requestStartDate) {\n request.requestStartDate = requestStartTime;\n }\n\n if (requestModifier && requestModifier.modifyRequestHeader) {\n // modifyRequestHeader expects a XMLHttpRequest object so,\n // to keep backward compatibility, we should expose a setRequestHeader method\n // TODO: Remove RequestModifier dependency on XMLHttpRequest object and define\n // a more generic way to intercept/modify requests\n requestModifier.modifyRequestHeader({\n setRequestHeader: function (header, value) {\n headers.append(header, value);\n }\n }, {\n url: httpRequest.url\n });\n }\n\n let abortController;\n if (typeof window.AbortController === 'function') {\n abortController = new AbortController(); /*jshint ignore:line*/\n httpRequest.abortController = abortController;\n abortController.signal.onabort = httpRequest.onabort;\n }\n\n const reqOptions = {\n method: httpRequest.method,\n headers: headers,\n credentials: httpRequest.withCredentials ? 'include' : undefined,\n signal: abortController ? abortController.signal : undefined\n };\n\n const calculationMode = settings.get().streaming.abr.fetchThroughputCalculationMode;\n const requestTime = Date.now();\n let throughputCapacityDelayMS = 0;\n\n new Promise((resolve) => {\n if (calculationMode === Constants.ABR_FETCH_THROUGHPUT_CALCULATION_AAST && lowLatencyThroughputModel) {\n throughputCapacityDelayMS = lowLatencyThroughputModel.getThroughputCapacityDelayMS(request, dashMetrics.getCurrentBufferLevel(request.mediaType) * 1000);\n if (throughputCapacityDelayMS) {\n // safely delay the \"fetch\" call a bit to be able to meassure the throughput capacity of the line.\n // this will lead to first few chunks downloaded at max network speed\n return setTimeout(resolve, throughputCapacityDelayMS);\n }\n }\n resolve();\n })\n .then(() => {\n let markBeforeFetch = Date.now();\n\n fetch(httpRequest.url, reqOptions).then(function (response) {\n if (!httpRequest.response) {\n httpRequest.response = {};\n }\n httpRequest.response.status = response.status;\n httpRequest.response.statusText = response.statusText;\n httpRequest.response.responseURL = response.url;\n\n if (!response.ok) {\n httpRequest.onerror();\n }\n\n let responseHeaders = '';\n for (const key of response.headers.keys()) {\n responseHeaders += key + ': ' + response.headers.get(key) + '\\r\\n';\n }\n httpRequest.response.responseHeaders = responseHeaders;\n\n if (!response.body) {\n // Fetch returning a ReadableStream response body is not currently supported by all browsers.\n // Browser compatibility: https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API\n // If it is not supported, returning the whole segment when it's ready (as xhr)\n return response.arrayBuffer().then(function (buffer) {\n httpRequest.response.response = buffer;\n const event = {\n loaded: buffer.byteLength,\n total: buffer.byteLength,\n stream: false\n };\n httpRequest.progress(event);\n httpRequest.onload();\n httpRequest.onend();\n return;\n });\n }\n\n const totalBytes = parseInt(response.headers.get('Content-Length'), 10);\n let bytesReceived = 0;\n let signaledFirstByte = false;\n let remaining = new Uint8Array();\n let offset = 0;\n\n if (calculationMode === Constants.ABR_FETCH_THROUGHPUT_CALCULATION_AAST && lowLatencyThroughputModel) {\n let markA = markBeforeFetch;\n let markB = 0;\n\n function fetchMeassurement(stream) {\n const reader = stream.getReader();\n const measurement = [];\n\n reader.read().then(function processFetch(args) {\n const value = args.value;\n const done = args.done;\n markB = Date.now();\n\n if (value && value.length) {\n const chunkDownloadDurationMS = markB - markA;\n const chunkBytes = value.length;\n measurement.push({\n chunkDownloadTimeRelativeMS: markB - markBeforeFetch,\n chunkDownloadDurationMS,\n chunkBytes,\n kbps: Math.round(8 * chunkBytes / (chunkDownloadDurationMS / 1000)),\n bufferLevel: dashMetrics.getCurrentBufferLevel(request.mediaType)\n });\n }\n\n if (done) {\n\n const fetchDuration = markB - markBeforeFetch;\n const bytesAllChunks = measurement.reduce((prev, curr) => prev + curr.chunkBytes, 0);\n\n lowLatencyThroughputModel.addMeasurement(request, fetchDuration, measurement, requestTime, throughputCapacityDelayMS, responseHeaders);\n\n httpRequest.progress({\n loaded: bytesAllChunks,\n total: bytesAllChunks,\n lengthComputable: true,\n time: lowLatencyThroughputModel.getEstimatedDownloadDurationMS(request),\n stream: true\n });\n return;\n }\n markA = Date.now();\n return reader.read().then(processFetch);\n });\n }\n // tee'ing streams is supported by all current major browsers\n // https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream/tee\n const [forMeasure, forConsumer] = response.body.tee();\n fetchMeassurement(forMeasure);\n httpRequest.reader = forConsumer.getReader();\n } else {\n httpRequest.reader = response.body.getReader();\n }\n\n let downloadedData = [];\n let startTimeData = [];\n let endTimeData = [];\n let lastChunkWasFinished = true;\n\n\n const processResult = function ({ value, done }) { // Bug fix Parse whenever data is coming [value] better than 1ms looking that increase CPU\n if (done) {\n if (remaining) {\n if (calculationMode !== Constants.ABR_FETCH_THROUGHPUT_CALCULATION_AAST) {\n // If there is pending data, call progress so network metrics\n // are correctly generated\n // Same structure as https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequestEventTarget/\n let calculatedThroughput = null;\n let calculatedTime = null;\n if (calculationMode === Constants.ABR_FETCH_THROUGHPUT_CALCULATION_MOOF_PARSING) {\n calculatedThroughput = calculateThroughputByChunkData(startTimeData, endTimeData);\n if (calculatedThroughput) {\n calculatedTime = bytesReceived * 8 / calculatedThroughput;\n }\n }\n else if (calculationMode === Constants.ABR_FETCH_THROUGHPUT_CALCULATION_DOWNLOADED_DATA) {\n calculatedTime = calculateDownloadedTime(downloadedData, bytesReceived);\n }\n\n httpRequest.progress({\n loaded: bytesReceived,\n total: isNaN(totalBytes) ? bytesReceived : totalBytes,\n lengthComputable: true,\n time: calculatedTime,\n stream: true\n });\n }\n\n httpRequest.response.response = remaining.buffer;\n }\n httpRequest.onload();\n httpRequest.onend();\n return;\n }\n\n if (value && value.length > 0) {\n remaining = concatTypedArray(remaining, value);\n bytesReceived += value.length;\n\n downloadedData.push({\n ts: Date.now(),\n bytes: value.length\n });\n\n if (calculationMode === Constants.ABR_FETCH_THROUGHPUT_CALCULATION_MOOF_PARSING && lastChunkWasFinished) {\n // Parse the payload and capture the the 'moof' box\n const boxesInfo = boxParser.findLastTopIsoBoxCompleted(['moof'], remaining, offset);\n if (boxesInfo.found) {\n // Store the beginning time of each chunk download in array StartTimeData\n lastChunkWasFinished = false;\n startTimeData.push({\n ts: performance.now(), /* jshint ignore:line */\n bytes: value.length\n });\n }\n }\n\n const boxesInfo = boxParser.findLastTopIsoBoxCompleted(['moov', 'mdat'], remaining, offset);\n if (boxesInfo.found) {\n const end = boxesInfo.lastCompletedOffset + boxesInfo.size;\n\n // Store the end time of each chunk download with its size in array EndTimeData\n if (calculationMode === Constants.ABR_FETCH_THROUGHPUT_CALCULATION_MOOF_PARSING && !lastChunkWasFinished) {\n lastChunkWasFinished = true;\n endTimeData.push({\n ts: performance.now(), /* jshint ignore:line */\n bytes: remaining.length\n });\n }\n\n // If we are going to pass full buffer, avoid copying it and pass\n // complete buffer. Otherwise clone the part of the buffer that is completed\n // and adjust remaining buffer. A clone is needed because ArrayBuffer of a typed-array\n // keeps a reference to the original data\n let data;\n if (end === remaining.length) {\n data = remaining;\n remaining = new Uint8Array();\n } else {\n data = new Uint8Array(remaining.subarray(0, end));\n remaining = remaining.subarray(end);\n }\n // Announce progress but don't track traces. Throughput measures are quite unstable\n // when they are based in small amount of data\n httpRequest.progress({\n data: data.buffer,\n lengthComputable: false,\n noTrace: true\n });\n\n offset = 0;\n } else {\n offset = boxesInfo.lastCompletedOffset;\n // Call progress so it generates traces that will be later used to know when the first byte\n // were received\n if (!signaledFirstByte) {\n httpRequest.progress({\n lengthComputable: false,\n noTrace: true\n });\n signaledFirstByte = true;\n }\n }\n }\n read(httpRequest, processResult);\n };\n read(httpRequest, processResult);\n })\n .catch(function (e) {\n if (httpRequest.onerror) {\n httpRequest.onerror(e);\n }\n });\n });\n }\n\n function read(httpRequest, processResult) {\n httpRequest.reader.read()\n .then(processResult)\n .catch(function (e) {\n if (httpRequest.onerror && httpRequest.response.status === 200) {\n // Error, but response code is 200, trigger error\n httpRequest.onerror(e);\n }\n });\n }\n\n function concatTypedArray(remaining, data) {\n if (remaining.length === 0) {\n return data;\n }\n const result = new Uint8Array(remaining.length + data.length);\n result.set(remaining);\n result.set(data, remaining.length);\n return result;\n }\n\n function abort(request) {\n if (request.abortController) {\n // For firefox and edge\n request.abortController.abort();\n } else if (request.reader) {\n // For Chrome\n try {\n request.reader.cancel();\n request.onabort();\n } catch (e) {\n // throw exceptions (TypeError) when reader was previously closed,\n // for example, because a network issue\n }\n }\n }\n\n function calculateDownloadedTime(downloadedData, bytesReceived) {\n try {\n downloadedData = downloadedData.filter(data => data.bytes > ((bytesReceived / 4) / downloadedData.length));\n if (downloadedData.length > 1) {\n let time = 0;\n const avgTimeDistance = (downloadedData[downloadedData.length - 1].ts - downloadedData[0].ts) / downloadedData.length;\n downloadedData.forEach((data, index) => {\n // To be counted the data has to be over a threshold\n const next = downloadedData[index + 1];\n if (next) {\n const distance = next.ts - data.ts;\n time += distance < avgTimeDistance ? distance : 0;\n }\n });\n return time;\n }\n return null;\n } catch (e) {\n return null;\n }\n }\n\n function calculateThroughputByChunkData(startTimeData, endTimeData) {\n try {\n let datum, datumE;\n // Filter the last chunks in a segment in both arrays [StartTimeData and EndTimeData]\n datum = startTimeData.filter((data, i) => i < startTimeData.length - 1);\n datumE = endTimeData.filter((dataE, i) => i < endTimeData.length - 1);\n let chunkThroughputs = [];\n // Compute the average throughput of the filtered chunk data\n if (datum.length > 1) {\n let shortDurationBytesReceived = 0;\n let shortDurationStartTime = 0;\n for (let i = 0; i < datum.length; i++) {\n if (datum[i] && datumE[i]) {\n let chunkDownloadTime = datumE[i].ts - datum[i].ts;\n if (chunkDownloadTime > 1) {\n chunkThroughputs.push((8 * datumE[i].bytes) / chunkDownloadTime);\n shortDurationStartTime = 0;\n } else {\n if (shortDurationStartTime === 0) {\n shortDurationStartTime = datum[i].ts;\n shortDurationBytesReceived = 0;\n }\n let cumulatedChunkDownloadTime = datumE[i].ts - shortDurationStartTime;\n if (cumulatedChunkDownloadTime > 1) {\n shortDurationBytesReceived += datumE[i].bytes;\n chunkThroughputs.push((8 * shortDurationBytesReceived) / cumulatedChunkDownloadTime);\n shortDurationStartTime = 0;\n } else {\n // continue cumulating short duration data\n shortDurationBytesReceived += datumE[i].bytes;\n }\n }\n }\n }\n\n if (chunkThroughputs.length > 0) {\n const sumOfChunkThroughputs = chunkThroughputs.reduce((a, b) => a + b, 0);\n return sumOfChunkThroughputs / chunkThroughputs.length;\n }\n }\n\n return null;\n } catch (e) {\n return null;\n }\n }\n\n instance = {\n load: load,\n abort: abort,\n calculateDownloadedTime: calculateDownloadedTime,\n setup\n };\n\n return instance;\n}\n\nFetchLoader.__dashjs_factory_name = 'FetchLoader';\n\nconst factory = FactoryMaker.getClassFactory(FetchLoader);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\n\nimport DashConstants from '../constants/DashConstants';\n\nclass Representation {\n constructor() {\n this.id = null;\n this.index = -1;\n this.adaptation = null;\n this.segmentInfoType = null;\n this.initialization = null;\n this.codecs = null;\n this.mimeType = null;\n this.codecPrivateData = null;\n this.segmentDuration = NaN;\n this.timescale = 1;\n this.startNumber = 1;\n this.indexRange = null;\n this.range = null;\n this.presentationTimeOffset = 0;\n // Set the source buffer timeOffset to this\n this.MSETimeOffset = NaN;\n // The information we need in the DashHandler to determine whether the last segment has been loaded\n this.mediaFinishedInformation = { numberOfSegments: 0, mediaTimeOfLastSignaledSegment: NaN };\n this.bandwidth = NaN;\n this.width = NaN;\n this.height = NaN;\n this.scanType = null;\n this.maxPlayoutRate = NaN;\n this.availabilityTimeOffset = 0;\n this.availabilityTimeComplete = true;\n this.frameRate = null;\n }\n\n hasInitialization() {\n return (this.initialization !== null || this.range !== null);\n }\n\n hasSegments() {\n return this.segmentInfoType !== DashConstants.BASE_URL &&\n this.segmentInfoType !== DashConstants.SEGMENT_BASE &&\n !this.indexRange;\n }\n}\n\nexport default Representation;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass AdaptationSet {\n constructor() {\n this.period = null;\n this.index = -1;\n this.type = null;\n }\n}\n\nexport default AdaptationSet;","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass Period {\n constructor() {\n this.id = null;\n this.index = -1;\n this.duration = NaN;\n this.start = NaN;\n this.mpd = null;\n this.nextPeriodId = null;\n }\n}\n\nPeriod.DEFAULT_ID = 'defaultId';\n\nexport default Period;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass Mpd {\n constructor() {\n this.manifest = null;\n this.suggestedPresentationDelay = 0;\n this.availabilityStartTime = null;\n this.availabilityEndTime = Number.POSITIVE_INFINITY;\n this.timeShiftBufferDepth = Number.POSITIVE_INFINITY;\n this.maxSegmentDuration = Number.POSITIVE_INFINITY;\n this.publishTime = null;\n this.minimumUpdatePeriod = NaN;\n this.mediaPresentationDuration = NaN;\n }\n}\n\nexport default Mpd;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass Event {\n constructor() {\n this.type = '';\n this.duration = NaN;\n this.presentationTime = NaN;\n this.id = NaN;\n this.messageData = '';\n this.eventStream = null;\n this.presentationTimeDelta = NaN; // Specific EMSG Box parameter\n }\n}\n\nexport default Event;","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\n\nconst DEFAULT_DVB_PRIORITY = 1;\nconst DEFAULT_DVB_WEIGHT = 1;\n\nclass BaseURL {\n constructor(url, serviceLocation, priority, weight) {\n this.url = url || '';\n this.serviceLocation = serviceLocation || url || '';\n\n // DVB extensions\n this.dvbPriority = priority || DEFAULT_DVB_PRIORITY;\n this.dvbWeight = weight || DEFAULT_DVB_WEIGHT;\n\n this.availabilityTimeOffset = 0;\n this.availabilityTimeComplete = true;\n this.queryParams = {}; // This is an attribute that might be set when synthesizing BaseURLs with content steering\n\n /* currently unused:\n * byteRange,\n */\n }\n}\n\nBaseURL.DEFAULT_DVB_PRIORITY = DEFAULT_DVB_PRIORITY;\nBaseURL.DEFAULT_DVB_WEIGHT = DEFAULT_DVB_WEIGHT;\n\nexport default BaseURL;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass EventStream {\n constructor() {\n this.adaptionSet = null;\n this.representation = null;\n this.period = null;\n this.timescale = 1;\n this.value = '';\n this.schemeIdUri = '';\n this.presentationTimeOffset = 0;\n }\n}\n\nexport default EventStream;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass ProducerReferenceTime {\n constructor() {\n this.id = null;\n this.inband = false;\n this.type = 'encoder';\n this.applicationScheme = null;\n this.wallClockTime = null;\n this.presentationTime = NaN;\n this.UTCTiming = null;\n }\n}\n\nexport default ProducerReferenceTime;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass ContentSteering {\n constructor() {\n this.defaultServiceLocation = null;\n this.defaultServiceLocationArray = [];\n this.queryBeforeStart = false;\n this.serverUrl = null;\n this.clientRequirement = true;\n }\n}\n\nexport default ContentSteering;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2023, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nimport DashConstants from '../constants/DashConstants'\n\nclass DescriptorType {\n constructor() {\n this.schemeIdUri = null;\n this.value = null;\n this.id = null;\n }\n\n init(data) {\n if (data) {\n this.schemeIdUri = data.schemeIdUri ? data.schemeIdUri : null;\n this.value = data.value ? data.value : null;\n this.id = data.id ? data.id : null;\n // Only add the DVB extensions if they exist\n if (data[DashConstants.DVB_URL]) {\n this.dvbUrl = data[DashConstants.DVB_URL]\n }\n if (data[DashConstants.DVB_MIMETYPE]) {\n this.dvbMimeType = data[DashConstants.DVB_MIMETYPE]\n }\n if (data[DashConstants.DVB_FONTFAMILY]) {\n this.dvbFontFamily = data[DashConstants.DVB_FONTFAMILY]\n }\n }\n return this;\n }\n}\n\nexport default DescriptorType;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport FactoryMaker from '../../core/FactoryMaker';\nimport deepEqual from 'fast-deep-equal';\n\n/**\n * @module ObjectUtils\n * @ignore\n * @description Provides utility functions for objects\n */\nfunction ObjectUtils() {\n\n let instance;\n\n /**\n * Returns true if objects are equal\n * @return {boolean}\n * @param {object} obj1\n * @param {object} obj2\n * @memberof module:ObjectUtils\n * @instance\n */\n function areEqual(obj1, obj2) {\n return deepEqual(obj1, obj2);\n }\n\n instance = {\n areEqual: areEqual\n };\n\n return instance;\n}\n\nObjectUtils.__dashjs_factory_name = 'ObjectUtils';\nexport default FactoryMaker.getSingletonFactory(ObjectUtils);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2023, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass MpdLocation {\n constructor(url, serviceLocation) {\n this.url = url || '';\n this.serviceLocation = serviceLocation || null;\n this.queryParams = {}; // This is an attribute that might be set when synthesizing Locations with content steering\n }\n}\n\nexport default MpdLocation;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2023, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass PatchLocation {\n constructor(url, serviceLocation, ttl) {\n this.url = url || '';\n this.serviceLocation = serviceLocation || null;\n this.ttl = ttl || NaN;\n this.queryParams = {}; // This is an attribute that might be set when synthesizing Locations with content steering\n }\n}\n\nexport default PatchLocation;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport Constants from '../../streaming/constants/Constants';\nimport DashConstants from '../constants/DashConstants';\nimport Representation from '../vo/Representation';\nimport AdaptationSet from '../vo/AdaptationSet';\nimport Period from '../vo/Period';\nimport Mpd from '../vo/Mpd';\nimport UTCTiming from '../vo/UTCTiming';\nimport Event from '../vo/Event';\nimport BaseURL from '../vo/BaseURL';\nimport EventStream from '../vo/EventStream';\nimport ProducerReferenceTime from '../vo/ProducerReferenceTime';\nimport ContentSteering from '../vo/ContentSteering';\nimport DescriptorType from '../vo/DescriptorType';\nimport ObjectUtils from '../../streaming/utils/ObjectUtils';\nimport URLUtils from '../../streaming/utils/URLUtils';\nimport FactoryMaker from '../../core/FactoryMaker';\nimport Debug from '../../core/Debug';\nimport DashJSError from '../../streaming/vo/DashJSError';\nimport Errors from '../../core/errors/Errors';\nimport {THUMBNAILS_SCHEME_ID_URIS} from '../../streaming/thumbnail/ThumbnailTracks';\nimport MpdLocation from '../vo/MpdLocation';\nimport PatchLocation from '../vo/PatchLocation';\n\nfunction DashManifestModel() {\n let instance,\n logger,\n errHandler,\n BASE64;\n\n const context = this.context;\n const urlUtils = URLUtils(context).getInstance();\n\n const isInteger = Number.isInteger || function (value) {\n return typeof value === 'number' &&\n isFinite(value) &&\n Math.floor(value) === value;\n };\n\n function setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n }\n\n function getIsTypeOf(adaptation, type) {\n if (!adaptation) {\n throw new Error('adaptation is not defined');\n }\n\n if (!type) {\n throw new Error('type is not defined');\n }\n\n // Check for thumbnail images\n if (adaptation.Representation_asArray && adaptation.Representation_asArray.length) {\n const essentialProperties = getEssentialPropertiesForRepresentation(adaptation.Representation_asArray[0]);\n if (essentialProperties && essentialProperties.length > 0 && THUMBNAILS_SCHEME_ID_URIS.indexOf(essentialProperties[0].schemeIdUri) >= 0) {\n return (type === Constants.IMAGE);\n }\n }\n\n // Check ContentComponent.contentType\n if (adaptation.ContentComponent_asArray && adaptation.ContentComponent_asArray.length > 0) {\n if (adaptation.ContentComponent_asArray.length > 1) {\n return (type === Constants.MUXED);\n } else if (adaptation.ContentComponent_asArray[0].contentType === type) {\n return true;\n }\n }\n\n const mimeTypeRegEx = (type === Constants.TEXT) ? new RegExp('(ttml|vtt|wvtt|stpp)') : new RegExp(type);\n\n // Check codecs\n if (adaptation.Representation_asArray && adaptation.Representation_asArray.length) {\n const codecs = adaptation.Representation_asArray[0].codecs;\n if (mimeTypeRegEx.test(codecs)) {\n return true;\n }\n }\n\n // Check Adaptation's mimeType\n if (adaptation.hasOwnProperty(DashConstants.MIME_TYPE)) {\n return mimeTypeRegEx.test(adaptation.mimeType);\n }\n\n // Check Representation's mimeType\n if (adaptation.Representation_asArray) {\n let representation;\n for (let i = 0; i < adaptation.Representation_asArray.length; i++) {\n representation = adaptation.Representation_asArray[i];\n if (representation.hasOwnProperty(DashConstants.MIME_TYPE)) {\n return mimeTypeRegEx.test(representation.mimeType);\n }\n }\n }\n\n return false;\n }\n\n function getIsFragmented(adaptation) {\n if (!adaptation) {\n throw new Error('adaptation is not defined');\n }\n if (adaptation.hasOwnProperty(DashConstants.SEGMENT_TEMPLATE) ||\n adaptation.hasOwnProperty(DashConstants.SEGMENT_TIMELINE) ||\n adaptation.hasOwnProperty(DashConstants.SEGMENT_LIST) ||\n adaptation.hasOwnProperty(DashConstants.SEGMENT_BASE)) {\n return true;\n }\n if (adaptation.Representation_asArray && adaptation.Representation_asArray.length > 0) {\n const representation = adaptation.Representation_asArray[0];\n if (representation.hasOwnProperty(DashConstants.SEGMENT_TEMPLATE) ||\n representation.hasOwnProperty(DashConstants.SEGMENT_TIMELINE) ||\n representation.hasOwnProperty(DashConstants.SEGMENT_LIST) ||\n representation.hasOwnProperty(DashConstants.SEGMENT_BASE)) {\n return true;\n }\n }\n return false;\n }\n\n function getIsAudio(adaptation) {\n return getIsTypeOf(adaptation, Constants.AUDIO);\n }\n\n function getIsVideo(adaptation) {\n return getIsTypeOf(adaptation, Constants.VIDEO);\n }\n\n function getIsText(adaptation) {\n return getIsTypeOf(adaptation, Constants.TEXT);\n }\n\n function getIsMuxed(adaptation) {\n return getIsTypeOf(adaptation, Constants.MUXED);\n }\n\n function getIsImage(adaptation) {\n return getIsTypeOf(adaptation, Constants.IMAGE);\n }\n\n function getProducerReferenceTimesForAdaptation(adaptation) {\n const prtArray = adaptation && adaptation.hasOwnProperty(DashConstants.PRODUCERREFERENCETIME_ASARRAY) ? adaptation[DashConstants.PRODUCERREFERENCETIME_ASARRAY] : [];\n\n // ProducerReferenceTime elements can also be contained in Representations\n const representationsArray = adaptation && adaptation.hasOwnProperty(DashConstants.REPRESENTATION_ASARRAY) ? adaptation[DashConstants.REPRESENTATION_ASARRAY] : [];\n\n representationsArray.forEach((rep) => {\n if (rep.hasOwnProperty(DashConstants.PRODUCERREFERENCETIME_ASARRAY)) {\n prtArray.push(...rep[DashConstants.PRODUCERREFERENCETIME_ASARRAY]);\n }\n });\n\n const prtsForAdaptation = [];\n\n // Unlikely to have multiple ProducerReferenceTimes.\n prtArray.forEach((prt) => {\n const entry = new ProducerReferenceTime();\n\n if (prt.hasOwnProperty(DashConstants.ID)) {\n entry[DashConstants.ID] = prt[DashConstants.ID];\n } else {\n // Ignore. Missing mandatory attribute\n return;\n }\n\n if (prt.hasOwnProperty(DashConstants.WALL_CLOCK_TIME)) {\n entry[DashConstants.WALL_CLOCK_TIME] = prt[DashConstants.WALL_CLOCK_TIME];\n } else {\n // Ignore. Missing mandatory attribute\n return;\n }\n\n if (prt.hasOwnProperty(DashConstants.PRESENTATION_TIME)) {\n entry[DashConstants.PRESENTATION_TIME] = prt[DashConstants.PRESENTATION_TIME];\n } else {\n // Ignore. Missing mandatory attribute\n return;\n }\n\n if (prt.hasOwnProperty(DashConstants.INBAND)) {\n entry[DashConstants.INBAND] = prt[DashConstants.INBAND] !== 'false';\n }\n\n if (prt.hasOwnProperty(DashConstants.TYPE)) {\n entry[DashConstants.TYPE] = prt[DashConstants.TYPE];\n }\n\n // Not interested in other attributes for now\n // UTC element contained must be same as that in the MPD\n prtsForAdaptation.push(entry);\n })\n\n return prtsForAdaptation;\n }\n\n function getLanguageForAdaptation(adaptation) {\n let lang = '';\n\n if (adaptation && adaptation.hasOwnProperty(DashConstants.LANG)) {\n lang = adaptation.lang;\n }\n\n return lang;\n }\n\n function getViewpointForAdaptation(adaptation) {\n if (!adaptation || !adaptation.hasOwnProperty(DashConstants.VIEWPOINT_ASARRAY) || !adaptation[DashConstants.VIEWPOINT_ASARRAY].length) return [];\n return adaptation[DashConstants.VIEWPOINT_ASARRAY].map( viewpoint => {\n const vp = new DescriptorType();\n return vp.init(viewpoint);\n });\n }\n\n function getRolesForAdaptation(adaptation) {\n if (!adaptation || !adaptation.hasOwnProperty(DashConstants.ROLE_ASARRAY) || !adaptation[DashConstants.ROLE_ASARRAY].length) return [];\n return adaptation[DashConstants.ROLE_ASARRAY].map( role => {\n const r = new DescriptorType();\n return r.init(role);\n });\n }\n\n function getAccessibilityForAdaptation(adaptation) {\n if (!adaptation || !adaptation.hasOwnProperty(DashConstants.ACCESSIBILITY_ASARRAY) || !adaptation[DashConstants.ACCESSIBILITY_ASARRAY].length) return [];\n return adaptation[DashConstants.ACCESSIBILITY_ASARRAY].map( accessibility => {\n const a = new DescriptorType();\n return a.init(accessibility);\n });\n }\n\n function getAudioChannelConfigurationForAdaptation(adaptation) {\n if (!adaptation || !adaptation.hasOwnProperty(DashConstants.AUDIOCHANNELCONFIGURATION_ASARRAY) || !adaptation[DashConstants.AUDIOCHANNELCONFIGURATION_ASARRAY].length) return [];\n return adaptation[DashConstants.AUDIOCHANNELCONFIGURATION_ASARRAY].map( audioChanCfg => {\n const acc = new DescriptorType();\n return acc.init(audioChanCfg);\n });\n }\n\n function getAudioChannelConfigurationForRepresentation(representation) {\n if (!representation || !representation.hasOwnProperty(DashConstants.AUDIOCHANNELCONFIGURATION_ASARRAY) || !representation[DashConstants.AUDIOCHANNELCONFIGURATION_ASARRAY].length) return [];\n return representation[DashConstants.AUDIOCHANNELCONFIGURATION_ASARRAY].map( audioChanCfg => {\n const acc = new DescriptorType();\n return acc.init(audioChanCfg);\n });\n }\n\n function getRepresentationSortFunction() {\n return (a, b) => a.bandwidth - b.bandwidth;\n }\n\n function processAdaptation(realAdaptation) {\n if (realAdaptation && Array.isArray(realAdaptation.Representation_asArray)) {\n realAdaptation.Representation_asArray.sort(getRepresentationSortFunction());\n }\n\n return realAdaptation;\n }\n\n function getRealAdaptations(manifest, periodIndex) {\n return manifest && manifest.Period_asArray && isInteger(periodIndex) ? manifest.Period_asArray[periodIndex] ? manifest.Period_asArray[periodIndex].AdaptationSet_asArray : [] : [];\n }\n\n function getRealPeriods(manifest) {\n return manifest && manifest.Period_asArray ? manifest.Period_asArray : [];\n }\n\n function getRealPeriodForIndex(index, manifest) {\n const realPeriods = getRealPeriods(manifest);\n if (realPeriods.length > 0 && isInteger(index)) {\n return realPeriods[index];\n } else {\n return null;\n }\n }\n\n function getAdaptationForId(id, manifest, periodIndex) {\n const realAdaptations = getRealAdaptations(manifest, periodIndex);\n let i,\n len;\n\n for (i = 0, len = realAdaptations.length; i < len; i++) {\n if (realAdaptations[i].hasOwnProperty(DashConstants.ID) && realAdaptations[i].id === id) {\n return realAdaptations[i];\n }\n }\n\n return null;\n }\n\n function getAdaptationForIndex(index, manifest, periodIndex) {\n const realAdaptations = getRealAdaptations(manifest, periodIndex);\n if (realAdaptations.length > 0 && isInteger(index)) {\n return realAdaptations[index];\n } else {\n return null;\n }\n }\n\n function getIndexForAdaptation(realAdaptation, manifest, periodIndex) {\n if (!realAdaptation) {\n return -1;\n }\n\n const realAdaptations = getRealAdaptations(manifest, periodIndex);\n\n for (let i = 0; i < realAdaptations.length; i++) {\n let objectUtils = ObjectUtils(context).getInstance();\n if (objectUtils.areEqual(realAdaptations[i], realAdaptation)) {\n return i;\n }\n }\n\n return -1;\n }\n\n function getAdaptationsForType(manifest, periodIndex, type) {\n const realAdaptations = getRealAdaptations(manifest, periodIndex);\n let i,\n len;\n const adaptations = [];\n\n for (i = 0, len = realAdaptations.length; i < len; i++) {\n if (getIsTypeOf(realAdaptations[i], type)) {\n adaptations.push(processAdaptation(realAdaptations[i]));\n }\n }\n\n return adaptations;\n }\n\n function getCodec(adaptation, representationId, addResolutionInfo) {\n let codec = null;\n\n if (adaptation && adaptation.Representation_asArray && adaptation.Representation_asArray.length > 0) {\n const representation = isInteger(representationId) && representationId >= 0 && representationId < adaptation.Representation_asArray.length ?\n adaptation.Representation_asArray[representationId] : adaptation.Representation_asArray[0];\n if (representation) {\n codec = representation.mimeType + ';codecs=\"' + representation.codecs + '\"';\n if (addResolutionInfo && representation.width !== undefined) {\n codec += ';width=\"' + representation.width + '\";height=\"' + representation.height + '\"';\n }\n }\n }\n\n // If the codec contains a profiles parameter we remove it. Otherwise it will cause problems when checking for codec capabilities of the platform\n if (codec) {\n codec = codec.replace(/\\sprofiles=[^;]*/g, '');\n }\n\n return codec;\n }\n\n function getMimeType(adaptation) {\n return adaptation && adaptation.Representation_asArray && adaptation.Representation_asArray.length > 0 ? adaptation.Representation_asArray[0].mimeType : null;\n }\n\n function getSegmentAlignment(adaptation) {\n if (adaptation && adaptation.hasOwnProperty(DashConstants.SEGMENT_ALIGNMENT)) {\n return adaptation[DashConstants.SEGMENT_ALIGNMENT] === 'true'\n }\n\n return false\n }\n\n function getSubSegmentAlignment(adaptation) {\n if (adaptation && adaptation.hasOwnProperty(DashConstants.SUB_SEGMENT_ALIGNMENT)) {\n return adaptation[DashConstants.SUB_SEGMENT_ALIGNMENT] === 'true'\n }\n\n return false\n }\n\n function getKID(adaptation) {\n if (!adaptation || !adaptation.hasOwnProperty(DashConstants.CENC_DEFAULT_KID)) {\n return null;\n }\n return adaptation[DashConstants.CENC_DEFAULT_KID];\n }\n\n function getLabelsForAdaptation(adaptation) {\n if (!adaptation || !Array.isArray(adaptation.Label_asArray)) {\n return [];\n }\n\n const labelArray = [];\n\n for (let i = 0; i < adaptation.Label_asArray.length; i++) {\n labelArray.push({\n lang: adaptation.Label_asArray[i].lang,\n text: adaptation.Label_asArray[i].__text || adaptation.Label_asArray[i]\n });\n }\n\n return labelArray;\n }\n\n function getContentProtectionData(adaptation) {\n if (!adaptation || !adaptation.hasOwnProperty(DashConstants.CONTENTPROTECTION_ASARRAY) || adaptation.ContentProtection_asArray.length === 0) {\n return null;\n }\n return adaptation.ContentProtection_asArray;\n }\n\n function getIsDynamic(manifest) {\n let isDynamic = false;\n if (manifest && manifest.hasOwnProperty('type')) {\n isDynamic = (manifest.type === DashConstants.DYNAMIC);\n }\n return isDynamic;\n }\n\n function getId(manifest) {\n return (manifest && manifest[DashConstants.ID]) || null;\n }\n\n function hasProfile(manifest, profile) {\n let has = false;\n\n if (manifest && manifest.profiles && manifest.profiles.length > 0) {\n has = (manifest.profiles.indexOf(profile) !== -1);\n }\n\n return has;\n }\n\n function getDuration(manifest) {\n let mpdDuration;\n //@mediaPresentationDuration specifies the duration of the entire Media Presentation.\n //If the attribute is not present, the duration of the Media Presentation is unknown.\n if (manifest && manifest.hasOwnProperty(DashConstants.MEDIA_PRESENTATION_DURATION)) {\n mpdDuration = manifest.mediaPresentationDuration;\n } else if (manifest && manifest.type == 'dynamic') {\n mpdDuration = Number.POSITIVE_INFINITY;\n } else {\n mpdDuration = Number.MAX_SAFE_INTEGER || Number.MAX_VALUE;\n }\n\n return mpdDuration;\n }\n\n function getBandwidth(representation) {\n return representation && representation.bandwidth ? representation.bandwidth : NaN;\n }\n\n function getManifestUpdatePeriod(manifest, latencyOfLastUpdate = 0) {\n let delay = NaN;\n if (manifest && manifest.hasOwnProperty(DashConstants.MINIMUM_UPDATE_PERIOD)) {\n delay = manifest.minimumUpdatePeriod;\n }\n return isNaN(delay) ? delay : Math.max(delay - latencyOfLastUpdate, 1);\n }\n\n function getPublishTime(manifest) {\n return manifest && manifest.hasOwnProperty(DashConstants.PUBLISH_TIME) ? new Date(manifest[DashConstants.PUBLISH_TIME]) : null;\n }\n\n function getRepresentationCount(adaptation) {\n return adaptation && Array.isArray(adaptation.Representation_asArray) ? adaptation.Representation_asArray.length : 0;\n }\n\n function getBitrateListForAdaptation(realAdaptation) {\n const processedRealAdaptation = processAdaptation(realAdaptation);\n const realRepresentations = processedRealAdaptation && Array.isArray(processedRealAdaptation.Representation_asArray) ? processedRealAdaptation.Representation_asArray : [];\n\n return realRepresentations.map((realRepresentation) => {\n return {\n bandwidth: realRepresentation.bandwidth,\n width: realRepresentation.width || 0,\n height: realRepresentation.height || 0,\n scanType: realRepresentation.scanType || null,\n id: realRepresentation.id || null\n };\n });\n }\n\n function getSelectionPriority(realAdaption) {\n try {\n const priority = realAdaption && typeof realAdaption.selectionPriority !== 'undefined' ? parseInt(realAdaption.selectionPriority) : 1;\n\n return isNaN(priority) ? 1 : priority;\n } catch (e) {\n return 1;\n }\n }\n\n function getEssentialPropertiesForRepresentation(realRepresentation) {\n if (!realRepresentation || !realRepresentation.EssentialProperty_asArray || !realRepresentation.EssentialProperty_asArray.length) return null;\n\n return realRepresentation.EssentialProperty_asArray.map((prop) => {\n return {\n schemeIdUri: prop.schemeIdUri,\n value: prop.value\n };\n });\n }\n\n function getRepresentationFor(index, adaptation) {\n return adaptation && adaptation.Representation_asArray && adaptation.Representation_asArray.length > 0 &&\n isInteger(index) ? adaptation.Representation_asArray[index] : null;\n }\n\n function getRealAdaptationFor(voAdaptation) {\n if (voAdaptation && voAdaptation.period && isInteger(voAdaptation.period.index)) {\n const periodArray = voAdaptation.period.mpd.manifest.Period_asArray[voAdaptation.period.index];\n if (periodArray && periodArray.AdaptationSet_asArray && isInteger(voAdaptation.index)) {\n return processAdaptation(periodArray.AdaptationSet_asArray[voAdaptation.index]);\n }\n }\n }\n\n function getRepresentationsForAdaptation(voAdaptation) {\n const voRepresentations = [];\n const processedRealAdaptation = getRealAdaptationFor(voAdaptation);\n let segmentInfo,\n baseUrl;\n\n if (processedRealAdaptation && processedRealAdaptation.Representation_asArray) {\n // TODO: TO BE REMOVED. We should get just the baseUrl elements that affects to the representations\n // that we are processing. Making it works properly will require much further changes and given\n // parsing base Urls parameters is needed for our ultra low latency examples, we will\n // keep this \"tricky\" code until the real (and good) solution comes\n if (voAdaptation && voAdaptation.period && isInteger(voAdaptation.period.index)) {\n const baseUrls = getBaseURLsFromElement(voAdaptation.period.mpd.manifest);\n if (baseUrls) {\n baseUrl = baseUrls[0];\n }\n }\n for (let i = 0, len = processedRealAdaptation.Representation_asArray.length; i < len; ++i) {\n const realRepresentation = processedRealAdaptation.Representation_asArray[i];\n const voRepresentation = new Representation();\n voRepresentation.index = i;\n voRepresentation.adaptation = voAdaptation;\n\n if (realRepresentation.hasOwnProperty(DashConstants.ID)) {\n voRepresentation.id = realRepresentation.id;\n }\n if (realRepresentation.hasOwnProperty(DashConstants.CODECS)) {\n voRepresentation.codecs = realRepresentation.codecs;\n }\n if (realRepresentation.hasOwnProperty(DashConstants.MIME_TYPE)) {\n voRepresentation.mimeType = realRepresentation[DashConstants.MIME_TYPE];\n }\n if (realRepresentation.hasOwnProperty(DashConstants.CODEC_PRIVATE_DATA)) {\n voRepresentation.codecPrivateData = realRepresentation.codecPrivateData;\n }\n if (realRepresentation.hasOwnProperty(DashConstants.BANDWITH)) {\n voRepresentation.bandwidth = realRepresentation.bandwidth;\n }\n if (realRepresentation.hasOwnProperty(DashConstants.WIDTH)) {\n voRepresentation.width = realRepresentation.width;\n }\n if (realRepresentation.hasOwnProperty(DashConstants.HEIGHT)) {\n voRepresentation.height = realRepresentation.height;\n }\n if (realRepresentation.hasOwnProperty(DashConstants.SCAN_TYPE)) {\n voRepresentation.scanType = realRepresentation.scanType;\n }\n if (realRepresentation.hasOwnProperty(DashConstants.MAX_PLAYOUT_RATE)) {\n voRepresentation.maxPlayoutRate = realRepresentation.maxPlayoutRate;\n }\n\n if (realRepresentation.hasOwnProperty(DashConstants.SEGMENT_BASE)) {\n segmentInfo = realRepresentation.SegmentBase;\n voRepresentation.segmentInfoType = DashConstants.SEGMENT_BASE;\n } else if (realRepresentation.hasOwnProperty(DashConstants.SEGMENT_LIST)) {\n segmentInfo = realRepresentation.SegmentList;\n\n if (segmentInfo.hasOwnProperty(DashConstants.SEGMENT_TIMELINE)) {\n voRepresentation.segmentInfoType = DashConstants.SEGMENT_TIMELINE;\n } else {\n voRepresentation.segmentInfoType = DashConstants.SEGMENT_LIST;\n }\n } else if (realRepresentation.hasOwnProperty(DashConstants.SEGMENT_TEMPLATE)) {\n segmentInfo = realRepresentation.SegmentTemplate;\n\n if (segmentInfo.hasOwnProperty(DashConstants.SEGMENT_TIMELINE)) {\n voRepresentation.segmentInfoType = DashConstants.SEGMENT_TIMELINE;\n } else {\n voRepresentation.segmentInfoType = DashConstants.SEGMENT_TEMPLATE;\n }\n\n if (segmentInfo.hasOwnProperty(DashConstants.INITIALIZATION_MINUS)) {\n voRepresentation.initialization = segmentInfo.initialization.split('$Bandwidth$')\n .join(realRepresentation.bandwidth).split('$RepresentationID$').join(realRepresentation.id);\n }\n } else {\n voRepresentation.segmentInfoType = DashConstants.BASE_URL;\n }\n\n voRepresentation.essentialProperties = getEssentialPropertiesForRepresentation(realRepresentation);\n\n if (segmentInfo) {\n if (segmentInfo.hasOwnProperty(DashConstants.INITIALIZATION)) {\n const initialization = segmentInfo.Initialization;\n\n if (initialization.hasOwnProperty(DashConstants.SOURCE_URL)) {\n voRepresentation.initialization = initialization.sourceURL;\n }\n\n if (initialization.hasOwnProperty(DashConstants.RANGE)) {\n voRepresentation.range = initialization.range;\n // initialization source url will be determined from\n // BaseURL when resolved at load time.\n }\n } else if (getIsText(processedRealAdaptation) &&\n getIsFragmented(processedRealAdaptation) &&\n processedRealAdaptation.mimeType &&\n processedRealAdaptation.mimeType.indexOf('application/mp4') === -1) {\n voRepresentation.range = 0;\n }\n\n if (segmentInfo.hasOwnProperty(DashConstants.TIMESCALE)) {\n voRepresentation.timescale = segmentInfo.timescale;\n }\n if (segmentInfo.hasOwnProperty(DashConstants.DURATION)) {\n // TODO according to the spec @maxSegmentDuration specifies the maximum duration of any Segment in any Representation in the Media Presentation\n // It is also said that for a SegmentTimeline any @d value shall not exceed the value of MPD@maxSegmentDuration, but nothing is said about\n // SegmentTemplate @duration attribute. We need to find out if @maxSegmentDuration should be used instead of calculated duration if the the duration\n // exceeds @maxSegmentDuration\n voRepresentation.segmentDuration = segmentInfo.duration / voRepresentation.timescale;\n } else if (realRepresentation.hasOwnProperty(DashConstants.SEGMENT_TEMPLATE)) {\n segmentInfo = realRepresentation.SegmentTemplate;\n\n if (segmentInfo.hasOwnProperty(DashConstants.SEGMENT_TIMELINE)) {\n voRepresentation.segmentDuration = calcSegmentDuration(segmentInfo.SegmentTimeline) / voRepresentation.timescale;\n }\n }\n if (segmentInfo.hasOwnProperty(DashConstants.MEDIA)) {\n voRepresentation.media = segmentInfo.media;\n }\n if (segmentInfo.hasOwnProperty(DashConstants.START_NUMBER)) {\n voRepresentation.startNumber = segmentInfo.startNumber;\n }\n if (segmentInfo.hasOwnProperty(DashConstants.INDEX_RANGE)) {\n voRepresentation.indexRange = segmentInfo.indexRange;\n }\n if (segmentInfo.hasOwnProperty(DashConstants.PRESENTATION_TIME_OFFSET)) {\n voRepresentation.presentationTimeOffset = segmentInfo.presentationTimeOffset / voRepresentation.timescale;\n }\n if (segmentInfo.hasOwnProperty(DashConstants.AVAILABILITY_TIME_OFFSET)) {\n voRepresentation.availabilityTimeOffset = segmentInfo.availabilityTimeOffset;\n } else if (baseUrl && baseUrl.availabilityTimeOffset !== undefined) {\n voRepresentation.availabilityTimeOffset = baseUrl.availabilityTimeOffset;\n }\n if (segmentInfo.hasOwnProperty(DashConstants.AVAILABILITY_TIME_COMPLETE)) {\n voRepresentation.availabilityTimeComplete = segmentInfo.availabilityTimeComplete !== 'false';\n } else if (baseUrl && baseUrl.availabilityTimeComplete !== undefined) {\n voRepresentation.availabilityTimeComplete = baseUrl.availabilityTimeComplete;\n }\n }\n\n voRepresentation.MSETimeOffset = calcMSETimeOffset(voRepresentation);\n voRepresentation.path = [voAdaptation.period.index, voAdaptation.index, i];\n voRepresentations.push(voRepresentation);\n }\n }\n\n return voRepresentations;\n }\n\n function calcSegmentDuration(segmentTimeline) {\n if (!segmentTimeline || !segmentTimeline.S_asArray) {\n return NaN;\n }\n let s0 = segmentTimeline.S_asArray[0];\n let s1 = segmentTimeline.S_asArray[1];\n return s0.hasOwnProperty('d') ? s0.d : (s1.t - s0.t);\n }\n\n function calcMSETimeOffset(representation) {\n // The MSEOffset is offset from AST for media. It is Period@start - presentationTimeOffset\n const presentationOffset = representation.presentationTimeOffset;\n const periodStart = representation.adaptation.period.start;\n return (periodStart - presentationOffset);\n }\n\n function getAdaptationsForPeriod(voPeriod) {\n const realPeriod = voPeriod && isInteger(voPeriod.index) ? voPeriod.mpd.manifest.Period_asArray[voPeriod.index] : null;\n const voAdaptations = [];\n let voAdaptationSet,\n realAdaptationSet,\n i;\n\n if (realPeriod && realPeriod.AdaptationSet_asArray) {\n for (i = 0; i < realPeriod.AdaptationSet_asArray.length; i++) {\n realAdaptationSet = realPeriod.AdaptationSet_asArray[i];\n voAdaptationSet = new AdaptationSet();\n if (realAdaptationSet.hasOwnProperty(DashConstants.ID)) {\n voAdaptationSet.id = realAdaptationSet.id;\n }\n voAdaptationSet.index = i;\n voAdaptationSet.period = voPeriod;\n\n if (getIsMuxed(realAdaptationSet)) {\n voAdaptationSet.type = Constants.MUXED;\n } else if (getIsAudio(realAdaptationSet)) {\n voAdaptationSet.type = Constants.AUDIO;\n } else if (getIsVideo(realAdaptationSet)) {\n voAdaptationSet.type = Constants.VIDEO;\n } else if (getIsText(realAdaptationSet)) {\n voAdaptationSet.type = Constants.TEXT;\n } else if (getIsImage(realAdaptationSet)) {\n voAdaptationSet.type = Constants.IMAGE;\n } else {\n logger.warn('Unknown Adaptation stream type');\n }\n voAdaptations.push(voAdaptationSet);\n }\n }\n\n return voAdaptations;\n }\n\n function getRegularPeriods(mpd) {\n const isDynamic = mpd ? getIsDynamic(mpd.manifest) : false;\n const voPeriods = [];\n let realPreviousPeriod = null;\n let realPeriod = null;\n let voPreviousPeriod = null;\n let voPeriod = null;\n let len,\n i;\n\n for (i = 0, len = mpd && mpd.manifest && mpd.manifest.Period_asArray ? mpd.manifest.Period_asArray.length : 0; i < len; i++) {\n realPeriod = mpd.manifest.Period_asArray[i];\n\n // If the attribute @start is present in the Period, then the\n // Period is a regular Period and the PeriodStart is equal\n // to the value of this attribute.\n if (realPeriod.hasOwnProperty(DashConstants.START)) {\n voPeriod = new Period();\n voPeriod.start = realPeriod.start;\n }\n // If the @start attribute is absent, but the previous Period element contains a @duration attribute then this new Period is also a regular Period. The start time of the new Period PeriodStart is the sum of the start time of the previous Period PeriodStart and the value of the attribute @duration of the previous Period.\n else if (realPreviousPeriod !== null && realPreviousPeriod.hasOwnProperty(DashConstants.DURATION) && voPreviousPeriod !== null) {\n voPeriod = new Period();\n voPeriod.start = parseFloat((voPreviousPeriod.start + voPreviousPeriod.duration).toFixed(5));\n }\n // If (i) @start attribute is absent, and (ii) the Period element is the first in the MPD, and (iii) the MPD@type is 'static', then the PeriodStart time shall be set to zero.\n else if (i === 0 && !isDynamic) {\n voPeriod = new Period();\n voPeriod.start = 0;\n }\n\n // The Period extends until the PeriodStart of the next Period.\n // The difference between the PeriodStart time of a Period and\n // the PeriodStart time of the following Period.\n if (voPreviousPeriod !== null && isNaN(voPreviousPeriod.duration)) {\n if (voPeriod !== null) {\n voPreviousPeriod.duration = parseFloat((voPeriod.start - voPreviousPeriod.start).toFixed(5));\n } else {\n logger.warn('First period duration could not be calculated because lack of start and duration period properties. This will cause timing issues during playback');\n }\n }\n\n if (voPeriod !== null) {\n voPeriod.id = getPeriodId(realPeriod, i);\n voPeriod.index = i;\n voPeriod.mpd = mpd;\n\n if (realPeriod.hasOwnProperty(DashConstants.DURATION)) {\n voPeriod.duration = realPeriod.duration;\n }\n\n if (voPreviousPeriod) {\n voPreviousPeriod.nextPeriodId = voPeriod.id;\n }\n\n voPeriods.push(voPeriod);\n realPreviousPeriod = realPeriod;\n voPreviousPeriod = voPeriod;\n }\n\n realPeriod = null;\n voPeriod = null;\n }\n\n if (voPeriods.length === 0) {\n return voPeriods;\n }\n\n // The last Period extends until the end of the Media Presentation.\n // The difference between the PeriodStart time of the last Period\n // and the mpd duration\n if (voPreviousPeriod !== null && isNaN(voPreviousPeriod.duration)) {\n voPreviousPeriod.duration = parseFloat((getEndTimeForLastPeriod(voPreviousPeriod) - voPreviousPeriod.start).toFixed(5));\n }\n\n return voPeriods;\n }\n\n function getPeriodId(realPeriod, i) {\n if (!realPeriod) {\n throw new Error('Period cannot be null or undefined');\n }\n\n let id = Period.DEFAULT_ID + '_' + i;\n\n if (realPeriod.hasOwnProperty(DashConstants.ID) && realPeriod.id.length > 0 && realPeriod.id !== '__proto__') {\n id = realPeriod.id;\n }\n\n return id;\n }\n\n function getMpd(manifest) {\n const mpd = new Mpd();\n\n if (manifest) {\n mpd.manifest = manifest;\n\n if (manifest.hasOwnProperty(DashConstants.AVAILABILITY_START_TIME)) {\n mpd.availabilityStartTime = new Date(manifest.availabilityStartTime.getTime());\n } else {\n if (manifest.loadedTime) {\n mpd.availabilityStartTime = new Date(manifest.loadedTime.getTime());\n }\n }\n\n if (manifest.hasOwnProperty(DashConstants.AVAILABILITY_END_TIME)) {\n mpd.availabilityEndTime = new Date(manifest.availabilityEndTime.getTime());\n }\n\n if (manifest.hasOwnProperty(DashConstants.MINIMUM_UPDATE_PERIOD)) {\n mpd.minimumUpdatePeriod = manifest.minimumUpdatePeriod;\n }\n\n if (manifest.hasOwnProperty(DashConstants.MEDIA_PRESENTATION_DURATION)) {\n mpd.mediaPresentationDuration = manifest.mediaPresentationDuration;\n }\n\n if (manifest.hasOwnProperty(DashConstants.SUGGESTED_PRESENTATION_DELAY)) {\n mpd.suggestedPresentationDelay = manifest.suggestedPresentationDelay;\n }\n\n if (manifest.hasOwnProperty(DashConstants.TIMESHIFT_BUFFER_DEPTH)) {\n mpd.timeShiftBufferDepth = manifest.timeShiftBufferDepth;\n }\n\n if (manifest.hasOwnProperty(DashConstants.MAX_SEGMENT_DURATION)) {\n mpd.maxSegmentDuration = manifest.maxSegmentDuration;\n }\n\n if (manifest.hasOwnProperty(DashConstants.PUBLISH_TIME)) {\n mpd.publishTime = new Date(manifest.publishTime);\n }\n }\n\n return mpd;\n }\n\n function checkConfig() {\n if (!errHandler || !errHandler.hasOwnProperty('error')) {\n throw new Error(Constants.MISSING_CONFIG_ERROR);\n }\n }\n\n function getEndTimeForLastPeriod(voPeriod) {\n checkConfig();\n const isDynamic = getIsDynamic(voPeriod.mpd.manifest);\n\n let periodEnd;\n if (voPeriod.mpd.manifest.mediaPresentationDuration) {\n periodEnd = voPeriod.mpd.manifest.mediaPresentationDuration;\n } else if (voPeriod.duration) {\n periodEnd = voPeriod.duration;\n } else if (isDynamic) {\n periodEnd = Number.POSITIVE_INFINITY;\n } else {\n errHandler.error(new DashJSError(Errors.MANIFEST_ERROR_ID_PARSE_CODE, 'Must have @mediaPresentationDuration on MPD or an explicit @duration on the last period.', voPeriod));\n }\n\n return periodEnd;\n }\n\n function getEventsForPeriod(period) {\n const manifest = period && period.mpd && period.mpd.manifest ? period.mpd.manifest : null;\n const periodArray = manifest ? manifest.Period_asArray : null;\n const eventStreams = periodArray && period && isInteger(period.index) ? periodArray[period.index].EventStream_asArray : null;\n const events = [];\n let i,\n j;\n\n if (eventStreams) {\n for (i = 0; i < eventStreams.length; i++) {\n const eventStream = new EventStream();\n eventStream.period = period;\n eventStream.timescale = 1;\n\n if (eventStreams[i].hasOwnProperty(Constants.SCHEME_ID_URI)) {\n eventStream.schemeIdUri = eventStreams[i][Constants.SCHEME_ID_URI];\n } else {\n throw new Error('Invalid EventStream. SchemeIdUri has to be set');\n }\n if (eventStreams[i].hasOwnProperty(DashConstants.TIMESCALE)) {\n eventStream.timescale = eventStreams[i][DashConstants.TIMESCALE];\n }\n if (eventStreams[i].hasOwnProperty(DashConstants.VALUE)) {\n eventStream.value = eventStreams[i][DashConstants.VALUE];\n }\n if (eventStreams[i].hasOwnProperty(DashConstants.PRESENTATION_TIME_OFFSET)) {\n eventStream.presentationTimeOffset = eventStreams[i][DashConstants.PRESENTATION_TIME_OFFSET];\n }\n for (j = 0; eventStreams[i].Event_asArray && j < eventStreams[i].Event_asArray.length; j++) {\n const currentMpdEvent = eventStreams[i].Event_asArray[j];\n const event = new Event();\n event.presentationTime = 0;\n event.eventStream = eventStream;\n\n if (currentMpdEvent.hasOwnProperty(DashConstants.PRESENTATION_TIME)) {\n event.presentationTime = currentMpdEvent.presentationTime;\n }\n const presentationTimeOffset = eventStream.presentationTimeOffset ? eventStream.presentationTimeOffset / eventStream.timescale : 0;\n event.calculatedPresentationTime = event.presentationTime / eventStream.timescale + period.start - presentationTimeOffset;\n\n if (currentMpdEvent.hasOwnProperty(DashConstants.DURATION)) {\n event.duration = currentMpdEvent.duration / eventStream.timescale;\n }\n if (currentMpdEvent.hasOwnProperty(DashConstants.ID)) {\n event.id = currentMpdEvent.id;\n } else {\n event.id = null;\n }\n\n if (currentMpdEvent.Signal && currentMpdEvent.Signal.Binary) {\n // toString is used to manage both regular and namespaced tags\n event.messageData = BASE64.decodeArray(currentMpdEvent.Signal.Binary.toString());\n } else {\n // From Cor.1: 'NOTE: this attribute is an alternative\n // to specifying a complete XML element(s) in the Event.\n // It is useful when an event leans itself to a compact\n // string representation'.\n event.messageData =\n currentMpdEvent.messageData ||\n currentMpdEvent.__cdata ||\n currentMpdEvent.__text;\n }\n\n events.push(event);\n }\n }\n }\n\n return events;\n }\n\n function getEventStreams(inbandStreams, representation, period) {\n const eventStreams = [];\n let i;\n\n if (!inbandStreams) return eventStreams;\n\n for (i = 0; i < inbandStreams.length; i++) {\n const eventStream = new EventStream();\n eventStream.timescale = 1;\n eventStream.representation = representation;\n\n if (inbandStreams[i].hasOwnProperty(Constants.SCHEME_ID_URI)) {\n eventStream.schemeIdUri = inbandStreams[i].schemeIdUri;\n } else {\n throw new Error('Invalid EventStream. SchemeIdUri has to be set');\n }\n if (inbandStreams[i].hasOwnProperty(DashConstants.TIMESCALE)) {\n eventStream.timescale = inbandStreams[i].timescale;\n }\n if (inbandStreams[i].hasOwnProperty(DashConstants.VALUE)) {\n eventStream.value = inbandStreams[i].value;\n }\n eventStreams.push(eventStream);\n eventStream.period = period;\n }\n\n return eventStreams;\n }\n\n function getEventStreamForAdaptationSet(manifest, adaptation, period) {\n let inbandStreams,\n periodArray,\n adaptationArray;\n\n if (manifest && manifest.Period_asArray && adaptation && adaptation.period && isInteger(adaptation.period.index)) {\n periodArray = manifest.Period_asArray[adaptation.period.index];\n if (periodArray && periodArray.AdaptationSet_asArray && isInteger(adaptation.index)) {\n adaptationArray = periodArray.AdaptationSet_asArray[adaptation.index];\n if (adaptationArray) {\n inbandStreams = adaptationArray.InbandEventStream_asArray;\n }\n }\n }\n\n return getEventStreams(inbandStreams, null, period);\n }\n\n function getEventStreamForRepresentation(manifest, representation, period) {\n let inbandStreams,\n periodArray,\n adaptationArray,\n representationArray;\n\n if (manifest && manifest.Period_asArray && representation && representation.adaptation && representation.adaptation.period && isInteger(representation.adaptation.period.index)) {\n periodArray = manifest.Period_asArray[representation.adaptation.period.index];\n if (periodArray && periodArray.AdaptationSet_asArray && isInteger(representation.adaptation.index)) {\n adaptationArray = periodArray.AdaptationSet_asArray[representation.adaptation.index];\n if (adaptationArray && adaptationArray.Representation_asArray && isInteger(representation.index)) {\n representationArray = adaptationArray.Representation_asArray[representation.index];\n if (representationArray) {\n inbandStreams = representationArray.InbandEventStream_asArray;\n }\n }\n }\n }\n\n return getEventStreams(inbandStreams, representation, period);\n }\n\n function getUTCTimingSources(manifest) {\n const isDynamic = getIsDynamic(manifest);\n const hasAST = manifest ? manifest.hasOwnProperty(DashConstants.AVAILABILITY_START_TIME) : false;\n const utcTimingsArray = manifest ? manifest.UTCTiming_asArray : null;\n const utcTimingEntries = [];\n\n // do not bother synchronizing the clock unless MPD is live,\n // or it is static and has availabilityStartTime attribute\n if ((isDynamic || hasAST)) {\n if (utcTimingsArray) {\n // the order is important here - 23009-1 states that the order\n // in the manifest \"indicates relative preference, first having\n // the highest, and the last the lowest priority\".\n utcTimingsArray.forEach(function (utcTiming) {\n const entry = new UTCTiming();\n\n if (utcTiming.hasOwnProperty(Constants.SCHEME_ID_URI)) {\n entry.schemeIdUri = utcTiming.schemeIdUri;\n } else {\n // entries of type DescriptorType with no schemeIdUri\n // are meaningless. let's just ignore this entry and\n // move on.\n return;\n }\n\n // this is (incorrectly) interpreted as a number - schema\n // defines it as a string\n if (utcTiming.hasOwnProperty(DashConstants.VALUE)) {\n entry.value = utcTiming.value.toString();\n } else {\n // without a value, there's not a lot we can do with\n // this entry. let's just ignore this one and move on\n return;\n }\n\n // we're not interested in the optional id or any other\n // attributes which might be attached to the entry\n\n utcTimingEntries.push(entry);\n });\n }\n }\n\n return utcTimingEntries;\n }\n\n function getBaseURLsFromElement(node) {\n const baseUrls = [];\n // if node.BaseURL_asArray and node.baseUri are undefined entries\n // will be [undefined] which entries.some will just skip\n const entries = node.BaseURL_asArray || [node.baseUri];\n let earlyReturn = false;\n\n entries.some(entry => {\n if (entry) {\n const baseUrl = new BaseURL();\n let text = entry.__text || entry;\n\n if (urlUtils.isRelative(text)) {\n // it doesn't really make sense to have relative and\n // absolute URLs at the same level, or multiple\n // relative URLs at the same level, so assume we are\n // done from this level of the MPD\n earlyReturn = true;\n\n // deal with the specific case where the MPD@BaseURL\n // is specified and is relative. when no MPD@BaseURL\n // entries exist, that case is handled by the\n // [node.baseUri] in the entries definition.\n if (node.baseUri) {\n text = urlUtils.resolve(text, node.baseUri);\n }\n }\n\n baseUrl.url = text;\n\n // serviceLocation is optional, but we need it in order\n // to blacklist correctly. if it's not available, use\n // anything unique since there's no relationship to any\n // other BaseURL and, in theory, the url should be\n // unique so use this instead.\n if (entry.hasOwnProperty(DashConstants.SERVICE_LOCATION) &&\n entry.serviceLocation.length) {\n baseUrl.serviceLocation = entry.serviceLocation;\n } else {\n baseUrl.serviceLocation = text;\n }\n\n if (entry.hasOwnProperty(DashConstants.DVB_PRIORITY)) {\n baseUrl.dvbPriority = entry[DashConstants.DVB_PRIORITY];\n }\n\n if (entry.hasOwnProperty(DashConstants.DVB_WEIGHT)) {\n baseUrl.dvbWeight = entry[DashConstants.DVB_WEIGHT];\n }\n\n if (entry.hasOwnProperty(DashConstants.AVAILABILITY_TIME_OFFSET)) {\n baseUrl.availabilityTimeOffset = entry[DashConstants.AVAILABILITY_TIME_OFFSET];\n }\n\n if (entry.hasOwnProperty(DashConstants.AVAILABILITY_TIME_COMPLETE)) {\n baseUrl.availabilityTimeComplete = entry[DashConstants.AVAILABILITY_TIME_COMPLETE] !== 'false';\n }\n /* NOTE: byteRange currently unused\n */\n\n baseUrls.push(baseUrl);\n\n return earlyReturn;\n }\n });\n\n return baseUrls;\n }\n\n function getContentSteering(manifest) {\n if (manifest && manifest.hasOwnProperty(DashConstants.CONTENT_STEERING_AS_ARRAY)) {\n // Only one ContentSteering element is supported on MPD level\n const element = manifest[DashConstants.CONTENT_STEERING_AS_ARRAY][0];\n return _createContentSteeringInstance(element);\n }\n\n return undefined;\n }\n\n function _createContentSteeringInstance(element) {\n const entry = new ContentSteering();\n\n entry.serverUrl = element.__text;\n\n if (element.hasOwnProperty(DashConstants.DEFAULT_SERVICE_LOCATION)) {\n entry.defaultServiceLocation = element[DashConstants.DEFAULT_SERVICE_LOCATION];\n entry.defaultServiceLocationArray = entry.defaultServiceLocation.split(' ');\n }\n\n if (element.hasOwnProperty(DashConstants.QUERY_BEFORE_START)) {\n entry.queryBeforeStart = element[DashConstants.QUERY_BEFORE_START].toLowerCase() === 'true';\n }\n\n if (element.hasOwnProperty(DashConstants.CLIENT_REQUIREMENT)) {\n entry.clientRequirement = element[DashConstants.CLIENT_REQUIREMENT].toLowerCase() !== 'false';\n }\n\n return entry;\n }\n\n function getLocation(manifest) {\n if (manifest && manifest.hasOwnProperty(DashConstants.LOCATION_AS_ARRAY)) {\n return manifest[DashConstants.LOCATION_AS_ARRAY].map((entry) => {\n const text = entry.__text || entry;\n const serviceLocation = entry.hasOwnProperty(DashConstants.SERVICE_LOCATION) ? entry[DashConstants.SERVICE_LOCATION] : null;\n\n return new MpdLocation(text, serviceLocation)\n })\n }\n\n return [];\n }\n\n function getPatchLocation(manifest) {\n if (manifest && manifest.hasOwnProperty(DashConstants.PATCH_LOCATION_AS_ARRAY)) {\n return manifest[DashConstants.PATCH_LOCATION_AS_ARRAY].map((entry) => {\n const text = entry.__text || entry;\n const serviceLocation = entry.hasOwnProperty(DashConstants.SERVICE_LOCATION) ? entry[DashConstants.SERVICE_LOCATION] : null;\n let ttl = entry.hasOwnProperty(DashConstants.TTL) ? parseFloat(entry[DashConstants.TTL]) * 1000 : NaN;\n\n return new PatchLocation(text, serviceLocation, ttl)\n })\n }\n\n return [];\n }\n\n function getSuggestedPresentationDelay(mpd) {\n return mpd && mpd.hasOwnProperty(DashConstants.SUGGESTED_PRESENTATION_DELAY) ? mpd.suggestedPresentationDelay : null;\n }\n\n function getAvailabilityStartTime(mpd) {\n return mpd && mpd.hasOwnProperty(DashConstants.AVAILABILITY_START_TIME) && mpd.availabilityStartTime !== null ? mpd.availabilityStartTime.getTime() : null;\n }\n\n function getServiceDescriptions(manifest) {\n const serviceDescriptions = [];\n if (manifest && manifest.hasOwnProperty(DashConstants.SERVICE_DESCRIPTION)) {\n for (const sd of manifest.ServiceDescription_asArray) {\n // Convert each of the properties defined in\n let id = null,\n schemeIdUri = null,\n latency = null,\n playbackRate = null,\n operatingQuality = null,\n operatingBandwidth = null,\n contentSteering = null;\n\n for (const prop in sd) {\n if (sd.hasOwnProperty(prop)) {\n if (prop === DashConstants.ID) {\n id = sd[prop];\n } else if (prop === DashConstants.SERVICE_DESCRIPTION_SCOPE) {\n schemeIdUri = sd[prop].schemeIdUri;\n } else if (prop === DashConstants.SERVICE_DESCRIPTION_LATENCY) {\n latency = {\n target: parseInt(sd[prop].target),\n max: parseInt(sd[prop].max),\n min: parseInt(sd[prop].min),\n referenceId: parseInt(sd[prop].referenceId)\n };\n } else if (prop === DashConstants.SERVICE_DESCRIPTION_PLAYBACK_RATE) {\n playbackRate = {\n max: parseFloat(sd[prop].max),\n min: parseFloat(sd[prop].min)\n };\n } else if (prop === DashConstants.SERVICE_DESCRIPTION_OPERATING_QUALITY) {\n operatingQuality = {\n mediaType: sd[prop].mediaType,\n max: parseInt(sd[prop].max),\n min: parseInt(sd[prop].min),\n target: parseInt(sd[prop].target),\n type: sd[prop].type,\n maxQualityDifference: parseInt(sd[prop].maxQualityDifference)\n }\n } else if (prop === DashConstants.SERVICE_DESCRIPTION_OPERATING_BANDWIDTH) {\n operatingBandwidth = {\n mediaType: sd[prop].mediaType,\n max: parseInt(sd[prop].max),\n min: parseInt(sd[prop].min),\n target: parseInt(sd[prop].target)\n }\n } else if (prop === DashConstants.CONTENT_STEERING) {\n contentSteering = _createContentSteeringInstance(sd[prop])\n }\n }\n }\n\n serviceDescriptions.push({\n id,\n schemeIdUri,\n latency,\n playbackRate,\n operatingQuality,\n operatingBandwidth,\n contentSteering\n });\n }\n }\n\n return serviceDescriptions;\n }\n\n function getSupplementalPropertiesForAdaptation(adaptation) {\n const supplementalProperties = {};\n\n if (adaptation && adaptation.hasOwnProperty(DashConstants.SUPPLEMENTAL_PROPERTY_ASARRAY)) {\n for (const sp of adaptation.SupplementalProperty_asArray) {\n if (sp.hasOwnProperty(Constants.SCHEME_ID_URI)) {\n // N.B this will only work where there is a single SupplementalProperty descriptor with this SchemeIdUri\n supplementalProperties[sp[Constants.SCHEME_ID_URI]] = {...sp};\n }\n }\n }\n return supplementalProperties;\n }\n\n function getSupplementalPropertiesAsArrayForAdaptation(adaptation) {\n if (!adaptation || !adaptation.hasOwnProperty(DashConstants.SUPPLEMENTAL_PROPERTY_ASARRAY) || !adaptation.SupplementalProperty_asArray.length) return [];\n return adaptation.SupplementalProperty_asArray.map( supp => {\n const s = new DescriptorType();\n return s.init(supp);\n });\n }\n\n function getSupplementalPropertiesForRepresentation(representation) {\n const supplementalProperties = {};\n\n if (representation && representation.hasOwnProperty(DashConstants.SUPPLEMENTAL_PROPERTY_ASARRAY)) {\n for (const sp of representation.SupplementalProperty_asArray) {\n if (sp.hasOwnProperty(Constants.SCHEME_ID_URI)) {\n // N.B this will only work where there is a single SupplementalProperty descriptor with this SchemeIdUri\n supplementalProperties[sp[Constants.SCHEME_ID_URI]] = {...sp};\n }\n }\n }\n return supplementalProperties;\n }\n\n function getSupplementalPropertiesAsArrayForRepresentation(representation) {\n if (!representation || !representation.hasOwnProperty(DashConstants.SUPPLEMENTAL_PROPERTY_ASARRAY) || !representation.SupplementalProperty_asArray.length) return [];\n return representation.SupplementalProperty_asArray.map( supp => {\n const s = new DescriptorType();\n return s.init(supp);\n });\n }\n\n function getEssentialPropertiesForAdaptation(adaptation) {\n const essentialProperties = {};\n\n if (adaptation && adaptation.hasOwnProperty(DashConstants.ESSENTIAL_PROPERTY_ASARRAY)) {\n for (const ep of adaptation.EssentialProperty_asArray) {\n if (ep.hasOwnProperty(Constants.SCHEME_ID_URI)) {\n // N.B this will only work where there is a single EssentialProperty descriptor with this SchemeIdUri\n essentialProperties[ep[Constants.SCHEME_ID_URI]] = {...ep};\n }\n }\n }\n return essentialProperties;\n }\n\n function getEssentialPropertiesAsArrayForAdaptation(adaptation) {\n if (!adaptation || !adaptation.hasOwnProperty(DashConstants.ESSENTIAL_PROPERTY_ASARRAY) || !adaptation.EssentialProperty_asArray.length) return [];\n return adaptation.EssentialProperty_asArray.map( ep => {\n const s = new DescriptorType();\n return s.init(ep);\n });\n }\n\n function setConfig(config) {\n if (!config) return;\n\n if (config.errHandler) {\n errHandler = config.errHandler;\n }\n\n if (config.BASE64) {\n BASE64 = config.BASE64;\n }\n }\n\n instance = {\n getIsTypeOf,\n getIsText,\n getIsFragmented,\n getProducerReferenceTimesForAdaptation,\n getLanguageForAdaptation,\n getViewpointForAdaptation,\n getRolesForAdaptation,\n getAccessibilityForAdaptation,\n getAudioChannelConfigurationForAdaptation,\n getAudioChannelConfigurationForRepresentation,\n getAdaptationForIndex,\n getIndexForAdaptation,\n getAdaptationForId,\n getAdaptationsForType,\n getRealPeriods,\n getRealPeriodForIndex,\n getCodec,\n getSelectionPriority,\n getMimeType,\n getKID,\n getLabelsForAdaptation,\n getContentProtectionData,\n getIsDynamic,\n getId,\n hasProfile,\n getDuration,\n getBandwidth,\n getManifestUpdatePeriod,\n getPublishTime,\n getRepresentationCount,\n getBitrateListForAdaptation,\n getRepresentationFor,\n getRepresentationsForAdaptation,\n getAdaptationsForPeriod,\n getRegularPeriods,\n getMpd,\n getEventsForPeriod,\n getEssentialPropertiesForAdaptation,\n getEssentialPropertiesAsArrayForAdaptation,\n getEssentialPropertiesForRepresentation,\n getEventStreamForAdaptationSet,\n getEventStreamForRepresentation,\n getUTCTimingSources,\n getBaseURLsFromElement,\n getRepresentationSortFunction,\n getContentSteering,\n getLocation,\n getPatchLocation,\n getSuggestedPresentationDelay,\n getAvailabilityStartTime,\n getServiceDescriptions,\n getSegmentAlignment,\n getSubSegmentAlignment,\n getSupplementalPropertiesForAdaptation,\n getSupplementalPropertiesAsArrayForAdaptation,\n getSupplementalPropertiesForRepresentation,\n getSupplementalPropertiesAsArrayForRepresentation,\n setConfig\n };\n\n setup();\n\n return instance;\n}\n\nDashManifestModel.__dashjs_factory_name = 'DashManifestModel';\nexport default FactoryMaker.getSingletonFactory(DashManifestModel);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport EventBus from '../../core/EventBus';\nimport MediaPlayerEvents from '../MediaPlayerEvents';\nimport MetricsReportingEvents from '../metrics/MetricsReportingEvents';\nimport FactoryMaker from '../../core/FactoryMaker';\nimport Settings from '../../core/Settings';\nimport Constants from '../../streaming/constants/Constants';\nimport {HTTPRequest} from '../vo/metrics/HTTPRequest';\nimport DashManifestModel from '../../dash/models/DashManifestModel';\nimport Utils from '../../core/Utils';\n\nconst CMCD_REQUEST_FIELD_NAME = 'CMCD';\nconst CMCD_VERSION = 1;\nconst OBJECT_TYPES = {\n MANIFEST: 'm',\n AUDIO: 'a',\n VIDEO: 'v',\n INIT: 'i',\n CAPTION: 'c',\n ISOBMFF_TEXT_TRACK: 'tt',\n ENCRYPTION_KEY: 'k',\n OTHER: 'o'\n};\nconst STREAMING_FORMATS = {\n DASH: 'd',\n MSS: 's'\n};\nconst STREAM_TYPES = {\n VOD: 'v',\n LIVE: 'l'\n};\nconst RTP_SAFETY_FACTOR = 5;\n\nfunction CmcdModel() {\n\n let dashManifestModel,\n instance,\n internalData,\n abrController,\n dashMetrics,\n playbackController,\n streamProcessors,\n _isStartup,\n _bufferLevelStarved,\n _initialMediaRequestsDone;\n\n let context = this.context;\n let eventBus = EventBus(context).getInstance();\n let settings = Settings(context).getInstance();\n\n function setup() {\n dashManifestModel = DashManifestModel(context).getInstance();\n\n _resetInitialSettings();\n }\n\n function initialize() {\n eventBus.on(MediaPlayerEvents.PLAYBACK_RATE_CHANGED, _onPlaybackRateChanged, instance);\n eventBus.on(MediaPlayerEvents.MANIFEST_LOADED, _onManifestLoaded, instance);\n eventBus.on(MediaPlayerEvents.BUFFER_LEVEL_STATE_CHANGED, _onBufferLevelStateChanged, instance);\n eventBus.on(MediaPlayerEvents.PLAYBACK_SEEKED, _onPlaybackSeeked, instance);\n eventBus.on(MediaPlayerEvents.PERIOD_SWITCH_COMPLETED, _onPeriodSwitchComplete, instance);\n }\n\n function setConfig(config) {\n if (!config) return;\n\n if (config.abrController) {\n abrController = config.abrController;\n }\n\n if (config.dashMetrics) {\n dashMetrics = config.dashMetrics;\n }\n\n if (config.playbackController) {\n playbackController = config.playbackController;\n }\n }\n\n function _resetInitialSettings() {\n internalData = {\n pr: 1,\n nor: null,\n st: null,\n sf: null,\n sid: `${Utils.generateUuid()}`,\n cid: null\n };\n _bufferLevelStarved = {};\n _isStartup = {};\n _initialMediaRequestsDone = {};\n _updateStreamProcessors();\n }\n\n function _onPeriodSwitchComplete() {\n _updateStreamProcessors();\n }\n\n function _updateStreamProcessors() {\n if (!playbackController) return;\n const streamController = playbackController.getStreamController();\n if (!streamController) return;\n if (typeof streamController.getActiveStream !== 'function') return;\n const activeStream = streamController.getActiveStream();\n if (!activeStream) return;\n streamProcessors = activeStream.getProcessors();\n }\n\n function getQueryParameter(request) {\n try {\n if (settings.get().streaming.cmcd && settings.get().streaming.cmcd.enabled) {\n const cmcdData = _getCmcdData(request);\n const filteredCmcdData = _applyWhitelist(cmcdData);\n const finalPayloadString = _buildFinalString(filteredCmcdData);\n\n eventBus.trigger(MetricsReportingEvents.CMCD_DATA_GENERATED, {\n url: request.url,\n mediaType: request.mediaType,\n cmcdData,\n cmcdString: finalPayloadString\n });\n return {\n key: CMCD_REQUEST_FIELD_NAME,\n value: finalPayloadString\n };\n }\n\n return null;\n } catch (e) {\n return null;\n }\n }\n\n function _applyWhitelist(cmcdData) {\n try {\n const enabledCMCDKeys = settings.get().streaming.cmcd.enabledKeys;\n\n return Object.keys(cmcdData)\n .filter(key => enabledCMCDKeys.includes(key))\n .reduce((obj, key) => {\n obj[key] = cmcdData[key];\n\n return obj;\n }, {});\n } catch (e) {\n return cmcdData;\n }\n }\n\n function _copyParameters(data, parameterNames) {\n const copiedData = {};\n for (let name of parameterNames) {\n if (data[name]) {\n copiedData[name] = data[name];\n }\n }\n return copiedData;\n }\n\n function getHeaderParameters(request) {\n try {\n if (settings.get().streaming.cmcd && settings.get().streaming.cmcd.enabled) {\n const cmcdData = _getCmcdData(request);\n const cmcdObjectHeader = _copyParameters(cmcdData, _applyWhitelistByKeys(['br', 'd', 'ot', 'tb']));\n const cmcdRequestHeader = _copyParameters(cmcdData, _applyWhitelistByKeys(['bl', 'dl', 'mtp', 'nor', 'nrr', 'su']));\n const cmcdStatusHeader = _copyParameters(cmcdData, _applyWhitelistByKeys(['bs', 'rtp']));\n const cmcdSessionHeader = _copyParameters(cmcdData, _applyWhitelistByKeys(['cid', 'pr', 'sf', 'sid', 'st', 'v']));\n const headers = {\n 'CMCD-Object': _buildFinalString(cmcdObjectHeader),\n 'CMCD-Request': _buildFinalString(cmcdRequestHeader),\n 'CMCD-Status': _buildFinalString(cmcdStatusHeader),\n 'CMCD-Session': _buildFinalString(cmcdSessionHeader)\n };\n\n eventBus.trigger(MetricsReportingEvents.CMCD_DATA_GENERATED, {\n url: request.url,\n mediaType: request.mediaType,\n cmcdData,\n headers\n });\n return headers;\n }\n\n return null;\n } catch (e) {\n return null;\n }\n }\n\n function _applyWhitelistByKeys(keys) {\n const enabledCMCDKeys = settings.get().streaming.cmcd.enabledKeys;\n\n return keys.filter(key => enabledCMCDKeys.includes(key));\n }\n\n function _getCmcdData(request) {\n try {\n let cmcdData = null;\n\n if (request.type === HTTPRequest.MPD_TYPE) {\n return _getCmcdDataForMpd(request);\n } else if (request.type === HTTPRequest.MEDIA_SEGMENT_TYPE) {\n _initForMediaType(request.mediaType);\n return _getCmcdDataForMediaSegment(request);\n } else if (request.type === HTTPRequest.INIT_SEGMENT_TYPE) {\n return _getCmcdDataForInitSegment(request);\n } else if (request.type === HTTPRequest.OTHER_TYPE || request.type === HTTPRequest.XLINK_EXPANSION_TYPE) {\n return _getCmcdDataForOther(request);\n } else if (request.type === HTTPRequest.LICENSE) {\n return _getCmcdDataForLicense(request);\n }\n\n return cmcdData;\n } catch (e) {\n return null;\n }\n }\n\n function _getCmcdDataForLicense(request) {\n const data = _getGenericCmcdData(request);\n\n data.ot = OBJECT_TYPES.ENCRYPTION_KEY;\n\n return data;\n }\n\n function _getCmcdDataForMpd() {\n const data = _getGenericCmcdData();\n\n data.ot = OBJECT_TYPES.MANIFEST;\n\n return data;\n }\n\n function _getCmcdDataForMediaSegment(request) {\n const data = _getGenericCmcdData();\n const encodedBitrate = _getBitrateByRequest(request);\n const d = _getObjectDurationByRequest(request);\n const mtp = _getMeasuredThroughputByType(request.mediaType);\n const dl = _getDeadlineByType(request.mediaType);\n const bl = _getBufferLevelByType(request.mediaType);\n const tb = _getTopBitrateByType(request.mediaType);\n const pr = internalData.pr;\n\n const nextRequest = _probeNextRequest(request.mediaType);\n\n let ot;\n if (request.mediaType === Constants.VIDEO) ot = OBJECT_TYPES.VIDEO;\n if (request.mediaType === Constants.AUDIO) ot = OBJECT_TYPES.AUDIO;\n if (request.mediaType === Constants.TEXT) {\n if (request.mediaInfo.mimeType === 'application/mp4') {\n ot = OBJECT_TYPES.ISOBMFF_TEXT_TRACK;\n } else {\n ot = OBJECT_TYPES.CAPTION;\n }\n }\n\n let rtp = settings.get().streaming.cmcd.rtp;\n if (!rtp) {\n rtp = _calculateRtp(request);\n }\n if (!isNaN(rtp)) {\n data.rtp = rtp;\n }\n\n if (nextRequest) {\n if (request.url !== nextRequest.url) {\n data.nor = encodeURIComponent(Utils.getRelativeUrl(request.url, nextRequest.url));\n } else if (nextRequest.range) {\n data.nrr = nextRequest.range;\n }\n }\n\n if (encodedBitrate) {\n data.br = encodedBitrate;\n }\n\n if (ot) {\n data.ot = ot;\n }\n\n if (!isNaN(d)) {\n data.d = d;\n }\n\n if (!isNaN(mtp)) {\n data.mtp = mtp;\n }\n\n if (!isNaN(dl)) {\n data.dl = dl;\n }\n\n if (!isNaN(bl)) {\n data.bl = bl;\n }\n\n if (!isNaN(tb)) {\n data.tb = tb;\n }\n\n if (!isNaN(pr) && pr !== 1) {\n data.pr = pr;\n }\n\n if (_bufferLevelStarved[request.mediaType]) {\n data.bs = true;\n _bufferLevelStarved[request.mediaType] = false;\n }\n\n if (_isStartup[request.mediaType] || !_initialMediaRequestsDone[request.mediaType]) {\n data.su = true;\n _isStartup[request.mediaType] = false;\n _initialMediaRequestsDone[request.mediaType] = true;\n }\n\n return data;\n }\n\n function _initForMediaType(mediaType) {\n\n if (!_initialMediaRequestsDone.hasOwnProperty(mediaType)) {\n _initialMediaRequestsDone[mediaType] = false;\n }\n\n if (!_isStartup.hasOwnProperty(mediaType)) {\n _isStartup[mediaType] = false;\n }\n\n if (!_bufferLevelStarved.hasOwnProperty(mediaType)) {\n _bufferLevelStarved[mediaType] = false;\n }\n }\n\n function _getCmcdDataForInitSegment() {\n const data = _getGenericCmcdData();\n\n data.ot = OBJECT_TYPES.INIT;\n data.su = true;\n\n return data;\n }\n\n function _getCmcdDataForOther() {\n const data = _getGenericCmcdData();\n\n data.ot = OBJECT_TYPES.OTHER;\n\n return data;\n }\n\n\n function _getGenericCmcdData() {\n const data = {};\n\n let cid = settings.get().streaming.cmcd.cid ? settings.get().streaming.cmcd.cid : internalData.cid;\n\n data.v = CMCD_VERSION;\n data.sid = settings.get().streaming.cmcd.sid ? settings.get().streaming.cmcd.sid : internalData.sid;\n\n data.sid = `${data.sid}`;\n\n if (cid) {\n data.cid = `${cid}`;\n }\n\n if (!isNaN(internalData.pr) && internalData.pr !== 1 && internalData.pr !== null) {\n data.pr = internalData.pr;\n }\n\n if (internalData.st) {\n data.st = internalData.st;\n }\n\n if (internalData.sf) {\n data.sf = internalData.sf;\n }\n\n return data;\n }\n\n function _getBitrateByRequest(request) {\n try {\n const quality = request.quality;\n const bitrateList = request.mediaInfo.bitrateList;\n\n return parseInt(bitrateList[quality].bandwidth / 1000);\n } catch (e) {\n return null;\n }\n }\n\n function _getTopBitrateByType(mediaType) {\n try {\n const info = abrController.getTopBitrateInfoFor(mediaType);\n return Math.round(info.bitrate / 1000);\n } catch (e) {\n return null;\n }\n }\n\n function _getObjectDurationByRequest(request) {\n try {\n return !isNaN(request.duration) ? Math.round(request.duration * 1000) : NaN;\n } catch (e) {\n return null;\n }\n }\n\n function _getMeasuredThroughputByType(mediaType) {\n try {\n return parseInt(abrController.getThroughputHistory().getSafeAverageThroughput(mediaType) / 100) * 100;\n } catch (e) {\n return null;\n }\n }\n\n function _getDeadlineByType(mediaType) {\n try {\n const playbackRate = internalData.pr;\n const bufferLevel = dashMetrics.getCurrentBufferLevel(mediaType);\n\n if (!isNaN(playbackRate) && !isNaN(bufferLevel)) {\n return parseInt((bufferLevel / playbackRate) * 10) * 100;\n }\n\n return null;\n } catch (e) {\n return null;\n }\n }\n\n function _getBufferLevelByType(mediaType) {\n try {\n const bufferLevel = dashMetrics.getCurrentBufferLevel(mediaType);\n\n if (!isNaN(bufferLevel)) {\n return parseInt(bufferLevel * 10) * 100;\n }\n\n return null;\n } catch (e) {\n return null;\n }\n }\n\n function _onPlaybackRateChanged(data) {\n try {\n internalData.pr = data.playbackRate;\n } catch (e) {\n\n }\n }\n\n function _onManifestLoaded(data) {\n try {\n const isDynamic = dashManifestModel.getIsDynamic(data.data);\n const st = isDynamic ? STREAM_TYPES.LIVE : STREAM_TYPES.VOD;\n const sf = data.protocol && data.protocol === 'MSS' ? STREAMING_FORMATS.MSS : STREAMING_FORMATS.DASH;\n\n internalData.st = `${st}`;\n internalData.sf = `${sf}`;\n } catch (e) {\n }\n }\n\n function _onBufferLevelStateChanged(data) {\n try {\n if (data.state && data.mediaType) {\n if (data.state === MediaPlayerEvents.BUFFER_EMPTY) {\n\n if (!_bufferLevelStarved[data.mediaType]) {\n _bufferLevelStarved[data.mediaType] = true;\n }\n if (!_isStartup[data.mediaType]) {\n _isStartup[data.mediaType] = true;\n }\n }\n }\n } catch (e) {\n\n }\n }\n\n function _onPlaybackSeeked() {\n for (let key in _bufferLevelStarved) {\n if (_bufferLevelStarved.hasOwnProperty(key)) {\n _bufferLevelStarved[key] = true;\n }\n }\n\n for (let key in _isStartup) {\n if (_isStartup.hasOwnProperty(key)) {\n _isStartup[key] = true;\n }\n }\n }\n\n function _buildFinalString(cmcdData) {\n try {\n if (!cmcdData) {\n return null;\n }\n const keys = Object.keys(cmcdData).sort((a, b) => a.localeCompare(b));\n const length = keys.length;\n\n let cmcdString = keys.reduce((acc, key, index) => {\n if (key === 'v' && cmcdData[key] === 1) return acc; // Version key should only be reported if it is != 1\n if (typeof cmcdData[key] === 'string' && key !== 'ot' && key !== 'sf' && key !== 'st') {\n acc += `${key}=${JSON.stringify(cmcdData[key])}`;\n } else {\n acc += `${key}=${cmcdData[key]}`;\n }\n if (index < length - 1) {\n acc += ',';\n }\n\n return acc;\n }, '');\n\n cmcdString = cmcdString.replace(/=true/g, '');\n\n // Remove last comma at the end\n cmcdString = cmcdString.replace(/,\\s*$/, '');\n\n return cmcdString;\n } catch (e) {\n return null;\n }\n }\n\n function _probeNextRequest(mediaType) {\n if (!streamProcessors || streamProcessors.length === 0) return;\n for (let streamProcessor of streamProcessors) {\n if (streamProcessor.getType() === mediaType) {\n return streamProcessor.probeNextRequest();\n }\n }\n }\n\n function _calculateRtp(request) {\n try {\n // Get the values we need\n let playbackRate = playbackController.getPlaybackRate();\n if (!playbackRate) playbackRate = 1;\n let { quality, mediaType, mediaInfo, duration } = request;\n\n if (!mediaInfo) {\n return NaN;\n }\n let currentBufferLevel = _getBufferLevelByType(mediaType);\n if (currentBufferLevel === 0) currentBufferLevel = 500;\n let bitrate = mediaInfo.bitrateList[quality].bandwidth;\n\n // Calculate RTP\n let segmentSize = (bitrate * duration) / 1000; // Calculate file size in kilobits\n let timeToLoad = (currentBufferLevel / playbackRate) / 1000; // Calculate time available to load file in seconds\n let minBandwidth = segmentSize / timeToLoad; // Calculate the exact bandwidth required\n let rtpSafetyFactor = settings.get().streaming.cmcd.rtpSafetyFactor && !isNaN(settings.get().streaming.cmcd.rtpSafetyFactor) ? settings.get().streaming.cmcd.rtpSafetyFactor : RTP_SAFETY_FACTOR;\n let maxBandwidth = minBandwidth * rtpSafetyFactor; // Include a safety buffer\n\n\n // Round to the next multiple of 100\n return (parseInt(maxBandwidth / 100) + 1) * 100;\n } catch (e) {\n return NaN;\n }\n }\n\n function reset() {\n eventBus.off(MediaPlayerEvents.PLAYBACK_RATE_CHANGED, _onPlaybackRateChanged, this);\n eventBus.off(MediaPlayerEvents.MANIFEST_LOADED, _onManifestLoaded, this);\n eventBus.off(MediaPlayerEvents.BUFFER_LEVEL_STATE_CHANGED, _onBufferLevelStateChanged, instance);\n eventBus.off(MediaPlayerEvents.PLAYBACK_SEEKED, _onPlaybackSeeked, instance);\n\n _resetInitialSettings();\n }\n\n instance = {\n getQueryParameter,\n getHeaderParameters,\n setConfig,\n reset,\n initialize\n };\n\n setup();\n\n return instance;\n}\n\nCmcdModel.__dashjs_factory_name = 'CmcdModel';\nexport default FactoryMaker.getSingletonFactory(CmcdModel);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2022, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport FactoryMaker from '../../core/FactoryMaker';\nimport EventBus from '../../core/EventBus';\nimport Events from '../../core/events/Events';\nimport Debug from '../../core/Debug';\n\n// Note: in modern browsers, the header names are returned in all lower case\nconst CMSD_STATIC = 'static';\nconst CMSD_DYNAMIC = 'dynamic';\nconst CMSD_RESPONSE_FIELD_BASENAME = 'cmsd-';\nconst CMSD_STATIC_RESPONSE_FIELD_NAME = CMSD_RESPONSE_FIELD_BASENAME + CMSD_STATIC;\nconst CMSD_DYNAMIC_RESPONSE_FIELD_NAME = CMSD_RESPONSE_FIELD_BASENAME + CMSD_DYNAMIC;\nconst CMSD_KEYS = {\n AVAILABILITY_TIME: 'at',\n DURESS: 'du',\n ENCODED_BITRATE: 'br',\n ESTIMATED_THROUGHPUT: 'etp',\n HELD_TIME: 'ht',\n INTERMEDIARY_IDENTIFIER: 'n',\n MAX_SUGGESTED_BITRATE: 'mb',\n NEXT_OBJECT_RESPONSE: 'nor',\n NEXT_RANGE_RESPONSE: 'nrr',\n OBJECT_DURATION: 'd',\n OBJECT_TYPE: 'ot',\n RESPONSE_DELAY: 'rd',\n ROUND_TRIP_TIME: 'rtt',\n STARTUP: 'su',\n STREAM_TYPE: 'st',\n STREAMING_FORMAT: 'sf',\n VERSION: 'v'\n}\nconst OBJECT_TYPES = {\n MANIFEST: 'm',\n AUDIO: 'a',\n VIDEO: 'v',\n INIT: 'i',\n CAPTION: 'c',\n ISOBMFF_TEXT_TRACK: 'tt',\n ENCRYPTION_KEY: 'k',\n OTHER: 'o',\n STREAM: 'stream' // Specific value for parameters without object type, which apply for all media/objects\n};\n\nconst PERSISTENT_PARAMS = [\n CMSD_KEYS.MAX_SUGGESTED_BITRATE,\n CMSD_KEYS.STREAM_TYPE,\n CMSD_KEYS.STREAMING_FORMAT,\n CMSD_KEYS.VERSION\n];\n\nconst MEDIATYPE_TO_OBJECTTYPE = {\n 'video': OBJECT_TYPES.VIDEO,\n 'audio': OBJECT_TYPES.AUDIO,\n 'text': OBJECT_TYPES.ISOBMFF_TEXT_TRACK,\n 'stream': OBJECT_TYPES.STREAM\n}\n\nconst integerRegex = /^[-0-9]/\n\nfunction CmsdModel() {\n\n const context = this.context;\n const eventBus = EventBus(context).getInstance();\n\n let instance,\n logger,\n _staticParamsDict,\n _dynamicParamsDict;\n\n function setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n _resetInitialSettings();\n }\n\n function initialize() {}\n\n function setConfig(/*config*/) {}\n\n function _resetInitialSettings() {\n _staticParamsDict = {};\n _dynamicParamsDict = {};\n }\n\n function _clearParams(params) {\n if (!params) {\n return;\n }\n Object.keys(params).forEach(key => {\n if (!PERSISTENT_PARAMS.includes(key)) {\n delete params[key];\n }\n })\n }\n\n function _parseParameterValue(value) {\n // If the value type is BOOLEAN and the value is TRUE, then the equals sign and the value are omitted\n if (!value) {\n return true;\n }\n // Check if boolean 'false'\n if (value.toLowerCase() === 'false') {\n return false;\n }\n // Check if a number\n if (integerRegex.test(value)) {\n return parseInt(value, 10);\n }\n // Value is a string, remove double quotes from string value\n return value.replace(/[\"]+/g, ''); \n }\n\n function _parseCMSDStatic(value) {\n try {\n const params = {};\n const items = value.split(',');\n for (let i = 0; i < items.length; i++) {\n // <key>=<value>\n const substrs = items[i].split('=');\n const key = substrs[0];\n const v = _parseParameterValue(substrs[1]);\n params[key] = v;\n }\n return params;\n } catch (e) {\n logger.error('Failed to parse CMSD-Static response header value:', e);\n }\n }\n\n function _parseCMSDDynamic(value) {\n try {\n const params = {};\n const entries = value.split(',');\n // Consider only last CMSD-Dynamic entry\n const entry = entries[entries.length - 1];\n const items = entry.split(';');\n // Server identifier as 1st item\n for (let i = 1; i < items.length; i++) {\n // <key>=<value>\n const substrs = items[i].split('=');\n const key = substrs[0];\n const v = _parseParameterValue(substrs[1]);\n params[key] = v;\n }\n return params;\n } catch (e) {\n logger.error('Failed to parse CMSD-Dynamic response header value:', e);\n return [];\n }\n }\n\n function _mediaTypetoObjectType(mediaType) {\n return MEDIATYPE_TO_OBJECTTYPE[mediaType] || OBJECT_TYPES.OTHER;\n }\n\n function _getParamValueForObjectType(paramsType, ot, key) {\n const params = paramsType === CMSD_STATIC ? _staticParamsDict : _dynamicParamsDict;\n const otParams = params[ot] || {};\n const streamParams = params[OBJECT_TYPES.STREAM] || {};\n const value = otParams[key] || streamParams[key];\n return value;\n }\n\n function parseResponseHeaders(responseHeaders, mediaType) {\n let staticParams = null;\n let dynamicParams = null;\n const headers = responseHeaders.split('\\r\\n');\n // Ge in reverse order in order to consider only last CMSD-Dynamic header\n for (let i = headers.length - 1; i >= 0; i--) {\n const header = headers[i];\n let m = header.match(/^(?<key>[^:]*):\\s*(?<value>.*)$/);\n if (m && m.groups) {\n // Note: in modern browsers, the header names are returned in all lower case\n let key = m.groups.key.toLowerCase(),\n value = m.groups.value;\n switch (key) {\n case CMSD_STATIC_RESPONSE_FIELD_NAME:\n staticParams = _parseCMSDStatic(value);\n eventBus.trigger(Events.CMSD_STATIC_HEADER, staticParams);\n break;\n case CMSD_DYNAMIC_RESPONSE_FIELD_NAME:\n if (!dynamicParams) {\n dynamicParams = _parseCMSDDynamic(value);\n }\n break;\n default:\n break;\n }\n }\n }\n\n // Get object type\n let ot = OBJECT_TYPES.STREAM;\n if (staticParams && staticParams[CMSD_KEYS.OBJECT_TYPE]) {\n ot = staticParams[CMSD_KEYS.OBJECT_TYPE];\n } else if (mediaType) {\n ot = _mediaTypetoObjectType(mediaType)\n }\n\n // Clear previously received params except persistent ones \n _clearParams(_staticParamsDict[ot]);\n _clearParams(_dynamicParamsDict[ot]);\n\n // Merge params with previously received params \n if (staticParams) {\n _staticParamsDict[ot] = Object.assign(_staticParamsDict[ot] || {}, staticParams);\n }\n if (dynamicParams) {\n _dynamicParamsDict[ot] = Object.assign(_dynamicParamsDict[ot] || {}, dynamicParams);\n }\n\n return {\n static: staticParams,\n dynamic: dynamicParams\n }\n }\n\n function getMaxBitrate(type) {\n let ot = _mediaTypetoObjectType(type);\n let mb = _getParamValueForObjectType(CMSD_DYNAMIC, ot, CMSD_KEYS.MAX_SUGGESTED_BITRATE);\n return mb ? mb : -1\n }\n\n function getEstimatedThroughput(type) {\n let ot = _mediaTypetoObjectType(type);\n let etp = _getParamValueForObjectType(CMSD_DYNAMIC, ot, CMSD_KEYS.ESTIMATED_THROUGHPUT);\n return etp ? etp : null\n }\n\n function getResponseDelay(type) {\n let ot = _mediaTypetoObjectType(type);\n let rd = _getParamValueForObjectType(CMSD_DYNAMIC, ot, CMSD_KEYS.RESPONSE_DELAY);\n return rd ? rd : null\n }\n\n function getRoundTripTime(type) {\n let ot = _mediaTypetoObjectType(type);\n let rd = _getParamValueForObjectType(CMSD_DYNAMIC, ot, CMSD_KEYS.ROUND_TRIP_TIME);\n return rd ? rd : null\n }\n\n function reset() {\n _resetInitialSettings();\n }\n\n instance = {\n setConfig,\n initialize,\n reset,\n parseResponseHeaders,\n getMaxBitrate,\n getEstimatedThroughput,\n getResponseDelay,\n getRoundTripTime,\n };\n\n setup();\n\n return instance;\n}\n\nCmsdModel.__dashjs_factory_name = 'CmsdModel';\nexport default FactoryMaker.getSingletonFactory(CmsdModel);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport Debug from '../../core/Debug';\nimport FactoryMaker from '../../core/FactoryMaker';\n\nfunction LowLatencyThroughputModel() {\n\n const LLTM_MAX_MEASUREMENTS = 10;\n // factor (<1) is used to reduce the real needed download time when at very bleeding live edge\n const LLTM_SEMI_OPTIMISTIC_ESTIMATE_FACTOR = 0.8;\n const LLTM_OPTIMISTIC_ESTIMATE_FACTOR = 0.6;\n\n const LLTM_SLOW_SEGMENT_DOWNLOAD_TOLERANCE = 1.05;\n const LLTM_MAX_DELAY_MS = 250;\n\n const context = this.context;\n let instance;\n let logger;\n let measurements = {};\n\n function setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n }\n\n /**\n * Linear regression with least squares method to get a trend function for buffer lavel at chunk receive timestamps\n * @param {*} chunkMeasurements\n * @returns linear trend function\n */\n function createBufferLevelTrendFunction(chunkMeasurements) {\n const result = {};\n\n let sumX = 0\n let sumY = 0\n let sumXY = 0\n let sumXSq = 0\n const N = chunkMeasurements.length\n\n\n for (var i = 0; i < N; ++i) {\n sumX += chunkMeasurements[i].chunkDownloadTimeRelativeMS;\n sumY += chunkMeasurements[i].bufferLevel;\n sumXY += chunkMeasurements[i].chunkDownloadTimeRelativeMS * chunkMeasurements[i].bufferLevel;\n sumXSq += chunkMeasurements[i].chunkDownloadTimeRelativeMS * chunkMeasurements[i].chunkDownloadTimeRelativeMS\n }\n\n result.m = ((sumXY - sumX * sumY / N)) / (sumXSq - sumX * sumX / N)\n result.b = sumY / N - result.m * sumX / N\n\n return function (x) {\n return result.m * x + result.b\n }\n }\n\n function isBufferSafeAndStable(lastMeasurements) {\n let isBufferSafeAndStable = true;\n let lastBitrate;\n const aveBufferLevelLastSegements = lastMeasurements.reduce((prev, curr) => prev + curr.bufferLevelAtSegmentEnd, 0) / lastMeasurements.length;\n lastMeasurements.forEach(m => {\n // inner segment buffer stability\n if (Math.abs(m.bufferLevelAtSegmentEnd / m.bufferLevelAtSegmentStart) < 0.95) {\n isBufferSafeAndStable = false;\n }\n\n // inter segment buffer stability\n if (m.bufferLevelAtSegmentEnd / aveBufferLevelLastSegements < 0.8) {\n isBufferSafeAndStable = false;\n }\n\n // representation bitrate remained at least constant\n if (!lastBitrate) {\n lastBitrate = m.bitrate;\n } else if (lastBitrate > m.bitrate) {\n isBufferSafeAndStable = false;\n }\n });\n return isBufferSafeAndStable;\n }\n\n /**\n * Based on the MPD, timing and buffer information of the last recent segments and their chunks\n * the most stable download time (in milliseconds) is calculated.\n * @param {*} request HTTPLoader request object\n * @returns download time in milliseconds of last fetched segment\n */\n function getEstimatedDownloadDurationMS(request) {\n const lastMeasurement = measurements[request.mediaType].slice(-1).pop();\n const lastThreeMeasurements = measurements[request.mediaType].slice(-3)\n\n // calculate and remember the buffer level trend during the last fetched segment\n const lastChunkRelativeTimeMS = lastMeasurement.chunkMeasurements.slice(-1).pop().chunkDownloadTimeRelativeMS;\n lastMeasurement.bufferLevelAtSegmentStart = lastMeasurement.getEstimatedBufferLevel(lastChunkRelativeTimeMS / 2);\n lastMeasurement.bufferLevelAtSegmentEnd = lastMeasurement.getEstimatedBufferLevel(lastChunkRelativeTimeMS);\n\n const isBufferStable = isBufferSafeAndStable(lastThreeMeasurements);\n\n const selectedOptimisticFactor = isBufferStable ? LLTM_OPTIMISTIC_ESTIMATE_FACTOR : LLTM_SEMI_OPTIMISTIC_ESTIMATE_FACTOR;\n\n // fetch duration was longer than segment duration, but buffer was stable\n if (lastMeasurement.isBufferStable && lastMeasurement.segDurationMS * LLTM_SLOW_SEGMENT_DOWNLOAD_TOLERANCE < lastMeasurement.fetchDownloadDurationMS) {\n return lastMeasurement.fetchDownloadDurationMS;\n }\n // buffer is drying or fetch took too long\n if (!isBufferStable || lastMeasurement.segDurationMS < lastMeasurement.fetchDownloadDurationMS) {\n return lastMeasurement.fetchDownloadDurationMS * LLTM_SEMI_OPTIMISTIC_ESTIMATE_FACTOR;\n }\n\n // did we requested a fully available segment? -> most accurate throughput calculation\n // we use adjusted availability start time to decide\n // Note: this \"download mode\" usually happens at startup and if requests are delayed artificially\n if (lastMeasurement.adjustedAvailabilityStartTimeMS <= (lastMeasurement.requestTimeMS + lastMeasurement.throughputCapacityDelayMS) - lastMeasurement.segDurationMS) {\n return lastMeasurement.fetchDownloadDurationMS * LLTM_SEMI_OPTIMISTIC_ESTIMATE_FACTOR;\n }\n\n // get all chunks that have been downloaded before fetch reached bleeding live edge\n // the remaining chunks loaded at production rate we will approximated\n const chunkAvailablePeriod = (lastMeasurement.requestTimeMS + lastMeasurement.throughputCapacityDelayMS) - lastMeasurement.adjustedAvailabilityStartTimeMS;\n let chunkBytesBBLE = 0; // BBLE -> Before bleeding live edge\n let chunkDownloadtimeMSBBLE = 0;\n let chunkCount = 0;\n for (let index = 0; index < lastMeasurement.chunkMeasurements.length; index++) {\n const chunk = lastMeasurement.chunkMeasurements[index];\n if (chunkAvailablePeriod < chunkDownloadtimeMSBBLE + chunk.chunkDownloadDurationMS) {\n break;\n }\n chunkDownloadtimeMSBBLE += chunk.chunkDownloadDurationMS;\n chunkBytesBBLE += chunk.chunkBytes;\n chunkCount++;\n }\n\n if (chunkAvailablePeriod < 0) {\n logger.warn('request time was before adjusted availibitly start time');\n }\n\n // there have to be some chunks available (20% of max count)\n // otherwise we are at bleeding live edge and the few chunks are insufficient to estimate correctly\n if (chunkBytesBBLE && chunkDownloadtimeMSBBLE && chunkCount > lastMeasurement.chunkMeasurements.length * 0.2) {\n const downloadThroughput = chunkBytesBBLE / chunkDownloadtimeMSBBLE; // bytes per millesecond\n const estimatedDownloadtimeMS = lastMeasurement.segmentBytes / downloadThroughput;\n // if real download was shorter then report this incl. semi optimistical estimate factor\n if (lastMeasurement.fetchDownloadDurationMS < estimatedDownloadtimeMS) {\n return lastMeasurement.fetchDownloadDurationMS * selectedOptimisticFactor;\n }\n return estimatedDownloadtimeMS * selectedOptimisticFactor;\n }\n\n // when we are to tight at live edge and it's stable then\n // we start to optimistically estimate download time\n // in such a way that a switch to next rep will be possible\n // optimistical estimate: assume download was fast enough for next higher rendition\n let nextHigherBitrate = lastMeasurement.bitrate;\n lastMeasurement.bitrateList.some(b => {\n if (b.bandwidth > lastMeasurement.bitrate) {\n nextHigherBitrate = b.bandwidth;\n return true;\n }\n });\n // already highest bitrate?\n\n if (nextHigherBitrate === lastMeasurement.bitrate) {\n return lastMeasurement.fetchDownloadDurationMS * selectedOptimisticFactor;\n }\n return selectedOptimisticFactor * lastMeasurement.segmentBytes * 8 * 1000 / nextHigherBitrate;\n }\n\n /**\n * Get calculated value for a safe artificial delay of the next request to allow to accumulate some chunks.\n * This allows better line throughput measurement.\n * @param {*} request\n * @param {*} currentBufferLevel current buffer level in milliseconds\n * @returns delay in milliseconds\n */\n function getThroughputCapacityDelayMS(request, currentBufferLevelMS) {\n const lastThreeMeasurements = measurements[request.mediaType] && measurements[request.mediaType].slice(-3);\n\n if (!lastThreeMeasurements || lastThreeMeasurements.length < 3) {\n return 0;\n }\n\n\n\n // in case not stable buffer, no artificially delay for the next request\n if (!isBufferSafeAndStable(lastThreeMeasurements)) {\n return 0;\n }\n\n // allowed artificial delay is the min of quater of buffer level in milliseconds and LLTM_MAX_DELAY_MS\n return currentBufferLevelMS / 4 > LLTM_MAX_DELAY_MS ? LLTM_MAX_DELAY_MS : currentBufferLevelMS / 4;\n }\n\n /**\n * Add some measurement data for bookkeeping and being able to derive decisions on estimated throughput.\n * @param {*} request HTTPLoader object to get MPD and media info from\n * @param {*} fetchDownloadDurationMS Duration how long the fetch actually took\n * @param {*} chunkMeasurements Array containing chunk timings and buffer levels\n * @param {*} requestTimeMS Timestamp at which the fetch was initiated\n * @param {*} throughputCapacityDelayMS An artificial delay that was used for this request\n */\n function addMeasurement(request, fetchDownloadDurationMS, chunkMeasurements, requestTimeMS, throughputCapacityDelayMS) {\n if (request && request.mediaType && !measurements[request.mediaType]) {\n measurements[request.mediaType] = [];\n }\n const bitrateEntry = request.mediaInfo.bitrateList.find(item => item.id === request.representationId);\n measurements[request.mediaType].push({\n index: request.index,\n repId: request.representationId,\n mediaType: request.mediaType,\n requestTimeMS,\n adjustedAvailabilityStartTimeMS: request.availabilityStartTime.getTime(),\n segDurationMS: request.duration * 1000,\n chunksDurationMS: chunkMeasurements.reduce((prev, curr) => prev + curr.chunkDownloadDurationMS, 0),\n segmentBytes: chunkMeasurements.reduce((prev, curr) => prev + curr.chunkBytes, 0),\n bitrate: bitrateEntry && bitrateEntry.bandwidth,\n bitrateList: request.mediaInfo.bitrateList,\n chunkMeasurements,\n fetchDownloadDurationMS,\n throughputCapacityDelayMS,\n getEstimatedBufferLevel: createBufferLevelTrendFunction(chunkMeasurements.slice(1)) // don't use first chunk's buffer level\n });\n // maintain only a maximum amount of most recent measurements\n if (measurements[request.mediaType].length > LLTM_MAX_MEASUREMENTS) {\n measurements[request.mediaType].shift();\n }\n }\n\n instance = {\n setup,\n addMeasurement,\n getThroughputCapacityDelayMS,\n getEstimatedDownloadDurationMS\n };\n\n setup()\n\n return instance;\n}\n\nLowLatencyThroughputModel.__dashjs_factory_name = 'LowLatencyThroughputModel';\nexport default FactoryMaker.getSingletonFactory(LowLatencyThroughputModel);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport XHRLoader from './XHRLoader';\nimport FetchLoader from './FetchLoader';\nimport {HTTPRequest} from '../vo/metrics/HTTPRequest';\nimport FactoryMaker from '../../core/FactoryMaker';\nimport DashJSError from '../vo/DashJSError';\nimport CmcdModel from '../models/CmcdModel';\nimport CmsdModel from '../models/CmsdModel';\nimport Utils from '../../core/Utils';\nimport Debug from '../../core/Debug';\nimport EventBus from '../../core/EventBus';\nimport Events from '../../core/events/Events';\nimport Settings from '../../core/Settings';\nimport Constants from '../constants/Constants';\nimport LowLatencyThroughputModel from '../models/LowLatencyThroughputModel';\nimport CustomParametersModel from '../models/CustomParametersModel';\n\n/**\n * @module HTTPLoader\n * @ignore\n * @description Manages download of resources via HTTP.\n * @param {Object} cfg - dependencies from parent\n */\nfunction HTTPLoader(cfg) {\n\n cfg = cfg || {};\n\n const context = this.context;\n const errHandler = cfg.errHandler;\n const dashMetrics = cfg.dashMetrics;\n const mediaPlayerModel = cfg.mediaPlayerModel;\n const requestModifier = cfg.requestModifier;\n const boxParser = cfg.boxParser;\n const errors = cfg.errors;\n const requestTimeout = cfg.requestTimeout || 0;\n const eventBus = EventBus(context).getInstance();\n const settings = Settings(context).getInstance();\n\n let instance,\n requests,\n delayedRequests,\n retryRequests,\n downloadErrorToRequestTypeMap,\n cmcdModel,\n cmsdModel,\n customParametersModel,\n lowLatencyThroughputModel,\n logger;\n\n function setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n requests = [];\n delayedRequests = [];\n retryRequests = [];\n cmcdModel = CmcdModel(context).getInstance();\n cmsdModel = CmsdModel(context).getInstance();\n lowLatencyThroughputModel = LowLatencyThroughputModel(context).getInstance();\n customParametersModel = CustomParametersModel(context).getInstance();\n\n downloadErrorToRequestTypeMap = {\n [HTTPRequest.MPD_TYPE]: errors.DOWNLOAD_ERROR_ID_MANIFEST_CODE,\n [HTTPRequest.XLINK_EXPANSION_TYPE]: errors.DOWNLOAD_ERROR_ID_XLINK_CODE,\n [HTTPRequest.INIT_SEGMENT_TYPE]: errors.DOWNLOAD_ERROR_ID_INITIALIZATION_CODE,\n [HTTPRequest.MEDIA_SEGMENT_TYPE]: errors.DOWNLOAD_ERROR_ID_CONTENT_CODE,\n [HTTPRequest.INDEX_SEGMENT_TYPE]: errors.DOWNLOAD_ERROR_ID_CONTENT_CODE,\n [HTTPRequest.BITSTREAM_SWITCHING_SEGMENT_TYPE]: errors.DOWNLOAD_ERROR_ID_CONTENT_CODE,\n [HTTPRequest.OTHER_TYPE]: errors.DOWNLOAD_ERROR_ID_CONTENT_CODE\n };\n }\n\n function internalLoad(config, remainingAttempts) {\n const request = config.request;\n const traces = [];\n let firstProgress = true;\n let needFailureReport = true;\n let requestStartTime = new Date();\n let lastTraceTime = requestStartTime;\n let lastTraceReceivedCount = 0;\n let progressTimeout = null;\n let fileLoaderType = null;\n let httpRequest;\n\n if (!requestModifier || !dashMetrics || !errHandler) {\n throw new Error('config object is not correct or missing');\n }\n\n const addHttpRequestMetric = function(success) {\n request.requestStartDate = requestStartTime;\n request.requestEndDate = new Date();\n request.firstByteDate = request.firstByteDate || requestStartTime;\n request.fileLoaderType = fileLoaderType;\n\n const responseUrl = httpRequest.response ? httpRequest.response.responseURL : null;\n const responseStatus = httpRequest.response ? httpRequest.response.status : null;\n const responseHeaders = httpRequest.response && httpRequest.response.getAllResponseHeaders ? httpRequest.response.getAllResponseHeaders() :\n httpRequest.response ? httpRequest.response.responseHeaders : null;\n \n const cmsd = responseHeaders && settings.get().streaming.cmsd && settings.get().streaming.cmsd.enabled ? cmsdModel.parseResponseHeaders(responseHeaders, request.mediaType) : null;\n \n dashMetrics.addHttpRequest(request, responseUrl, responseStatus, responseHeaders, success ? traces : null, cmsd);\n }\n \n const handleLoaded = function (success) {\n needFailureReport = false;\n\n addHttpRequestMetric(success);\n\n if (request.type === HTTPRequest.MPD_TYPE) {\n dashMetrics.addManifestUpdate(request);\n eventBus.trigger(Events.MANIFEST_LOADING_FINISHED, { request });\n }\n };\n\n const onloadend = function () {\n if (progressTimeout) {\n clearTimeout(progressTimeout);\n progressTimeout = null;\n }\n if (requests.indexOf(httpRequest) === -1) {\n return;\n } else {\n requests.splice(requests.indexOf(httpRequest), 1);\n }\n\n if (needFailureReport) {\n handleLoaded(false);\n\n if (remainingAttempts > 0) {\n\n // If we get a 404 to a media segment we should check the client clock again and perform a UTC sync in the background.\n try {\n if (settings.get().streaming.utcSynchronization.enableBackgroundSyncAfterSegmentDownloadError && request.type === HTTPRequest.MEDIA_SEGMENT_TYPE) {\n // Only trigger a sync if the loading failed for the first time\n const initialNumberOfAttempts = mediaPlayerModel.getRetryAttemptsForType(HTTPRequest.MEDIA_SEGMENT_TYPE);\n if (initialNumberOfAttempts === remainingAttempts) {\n eventBus.trigger(Events.ATTEMPT_BACKGROUND_SYNC);\n }\n }\n } catch (e) {\n\n }\n\n remainingAttempts--;\n let retryRequest = { config: config };\n retryRequests.push(retryRequest);\n retryRequest.timeout = setTimeout(function () {\n if (retryRequests.indexOf(retryRequest) === -1) {\n return;\n } else {\n retryRequests.splice(retryRequests.indexOf(retryRequest), 1);\n }\n internalLoad(config, remainingAttempts);\n }, mediaPlayerModel.getRetryIntervalsForType(request.type));\n } else {\n if (request.type === HTTPRequest.MSS_FRAGMENT_INFO_SEGMENT_TYPE) {\n return;\n }\n\n errHandler.error(new DashJSError(downloadErrorToRequestTypeMap[request.type], request.url + ' is not available', {\n request: request,\n response: httpRequest.response\n }));\n\n if (config.error) {\n config.error(request, 'error', httpRequest.response.statusText, httpRequest.response);\n }\n\n if (config.complete) {\n config.complete(request, httpRequest.response.statusText);\n }\n }\n }\n };\n\n const progress = function (event) {\n const currentTime = new Date();\n\n if (firstProgress) {\n firstProgress = false;\n if (!event.lengthComputable ||\n (event.lengthComputable && event.total !== event.loaded)) {\n request.firstByteDate = currentTime;\n }\n }\n\n if (event.lengthComputable) {\n request.bytesLoaded = event.loaded;\n request.bytesTotal = event.total;\n }\n\n if (!event.noTrace) {\n traces.push({\n s: lastTraceTime,\n d: event.time ? event.time : currentTime.getTime() - lastTraceTime.getTime(),\n b: [event.loaded ? event.loaded - lastTraceReceivedCount : 0]\n });\n\n lastTraceTime = currentTime;\n lastTraceReceivedCount = event.loaded;\n }\n\n if (progressTimeout) {\n clearTimeout(progressTimeout);\n progressTimeout = null;\n }\n\n if (settings.get().streaming.fragmentRequestProgressTimeout > 0) {\n progressTimeout = setTimeout(function () {\n // No more progress => abort request and treat as an error\n logger.warn('Abort request ' + httpRequest.url + ' due to progress timeout');\n httpRequest.response.onabort = null;\n httpRequest.loader.abort(httpRequest);\n onloadend();\n }, settings.get().streaming.fragmentRequestProgressTimeout);\n }\n\n if (config.progress && event) {\n config.progress(event);\n }\n };\n\n const onload = function () {\n if (httpRequest.response.status >= 200 && httpRequest.response.status <= 299) {\n handleLoaded(true);\n\n if (config.success) {\n config.success(httpRequest.response.response, httpRequest.response.statusText, httpRequest.response.responseURL);\n }\n\n if (config.complete) {\n config.complete(request, httpRequest.response.statusText);\n }\n }\n };\n\n const onabort = function () {\n addHttpRequestMetric(true);\n\n if (progressTimeout) {\n clearTimeout(progressTimeout);\n progressTimeout = null;\n }\n if (config.abort) {\n config.abort(request);\n }\n };\n\n const ontimeout = function (event) {\n let timeoutMessage;\n if (event.lengthComputable) {\n let percentageComplete = (event.loaded / event.total) * 100;\n timeoutMessage = 'Request timeout: loaded: ' + event.loaded + ', out of: ' + event.total + ' : ' + percentageComplete.toFixed(3) + '% Completed';\n } else {\n timeoutMessage = 'Request timeout: non-computable download size';\n }\n logger.warn(timeoutMessage);\n };\n\n\n let loader;\n if (request.hasOwnProperty('availabilityTimeComplete') && request.availabilityTimeComplete === false && window.fetch && request.responseType === 'arraybuffer' && request.type === HTTPRequest.MEDIA_SEGMENT_TYPE) {\n loader = FetchLoader(context).create({\n requestModifier: requestModifier,\n lowLatencyThroughputModel,\n boxParser: boxParser\n });\n loader.setup({\n dashMetrics\n });\n fileLoaderType = Constants.FILE_LOADER_TYPES.FETCH;\n } else {\n loader = XHRLoader(context).create({\n requestModifier: requestModifier\n });\n fileLoaderType = Constants.FILE_LOADER_TYPES.XHR;\n }\n\n let headers = null;\n let modifiedUrl = requestModifier.modifyRequestURL ? requestModifier.modifyRequestURL(request.url) : request.url;\n if (settings.get().streaming.cmcd && settings.get().streaming.cmcd.enabled) {\n const cmcdMode = settings.get().streaming.cmcd.mode;\n if (cmcdMode === Constants.CMCD_MODE_QUERY) {\n const additionalQueryParameter = _getAdditionalQueryParameter(request);\n modifiedUrl = Utils.addAditionalQueryParameterToUrl(modifiedUrl, additionalQueryParameter);\n } else if (cmcdMode === Constants.CMCD_MODE_HEADER) {\n headers = cmcdModel.getHeaderParameters(request);\n }\n }\n\n const withCredentials = customParametersModel.getXHRWithCredentialsForType(request.type);\n\n // Add queryParams that came from pathway cloning\n if (request.queryParams) {\n const queryParams = Object.keys(request.queryParams).map((key) => {\n return {\n key,\n value: request.queryParams[key]\n }\n })\n modifiedUrl = Utils.addAditionalQueryParameterToUrl(modifiedUrl, queryParams);\n }\n\n request.url = modifiedUrl;\n\n httpRequest = {\n url: modifiedUrl,\n method: HTTPRequest.GET,\n withCredentials: withCredentials,\n request: request,\n onload: onload,\n onend: onloadend,\n onerror: onloadend,\n progress: progress,\n onabort: onabort,\n ontimeout: ontimeout,\n loader: loader,\n timeout: requestTimeout,\n headers: headers\n };\n\n // Adds the ability to delay single fragment loading time to control buffer.\n let now = new Date().getTime();\n if (isNaN(request.delayLoadingTime) || now >= request.delayLoadingTime) {\n // no delay - just send\n requests.push(httpRequest);\n loader.load(httpRequest);\n } else {\n // delay\n let delayedRequest = { httpRequest: httpRequest };\n delayedRequests.push(delayedRequest);\n delayedRequest.delayTimeout = setTimeout(function () {\n if (delayedRequests.indexOf(delayedRequest) === -1) {\n return;\n } else {\n delayedRequests.splice(delayedRequests.indexOf(delayedRequest), 1);\n }\n try {\n requestStartTime = new Date();\n lastTraceTime = requestStartTime;\n requests.push(delayedRequest.httpRequest);\n loader.load(delayedRequest.httpRequest);\n } catch (e) {\n delayedRequest.httpRequest.onerror();\n }\n }, (request.delayLoadingTime - now));\n }\n }\n\n function _getAdditionalQueryParameter(request) {\n try {\n const additionalQueryParameter = [];\n const cmcdQueryParameter = cmcdModel.getQueryParameter(request);\n\n if (cmcdQueryParameter) {\n additionalQueryParameter.push(cmcdQueryParameter);\n }\n\n return additionalQueryParameter;\n } catch (e) {\n return [];\n }\n }\n\n /**\n * Initiates a download of the resource described by config.request\n * @param {Object} config - contains request (FragmentRequest or derived type), and callbacks\n * @memberof module:HTTPLoader\n * @instance\n */\n function load(config) {\n if (config.request) {\n internalLoad(\n config,\n mediaPlayerModel.getRetryAttemptsForType(\n config.request.type\n )\n );\n } else {\n if (config.error) {\n config.error(config.request, 'error');\n }\n }\n }\n\n /**\n * Aborts any inflight downloads\n * @memberof module:HTTPLoader\n * @instance\n */\n function abort() {\n retryRequests.forEach(t => {\n clearTimeout(t.timeout);\n // abort request in order to trigger LOADING_ABANDONED event\n if (t.config.request && t.config.abort) {\n t.config.abort(t.config.request);\n }\n });\n retryRequests = [];\n\n delayedRequests.forEach(x => clearTimeout(x.delayTimeout));\n delayedRequests = [];\n\n requests.forEach(x => {\n // MSS patch: ignore FragmentInfo requests\n if (x.request.type === HTTPRequest.MSS_FRAGMENT_INFO_SEGMENT_TYPE) {\n return;\n }\n\n // abort will trigger onloadend which we don't want\n // when deliberately aborting inflight requests -\n // set them to undefined so they are not called\n x.onloadend = x.onerror = x.onprogress = undefined;\n x.loader.abort(x);\n });\n requests = [];\n }\n\n instance = {\n load: load,\n abort: abort\n };\n\n setup();\n\n return instance;\n}\n\nHTTPLoader.__dashjs_factory_name = 'HTTPLoader';\n\nconst factory = FactoryMaker.getClassFactory(HTTPLoader);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport FactoryMaker from '../../core/FactoryMaker';\nimport HTTPLoader from '../../streaming/net/HTTPLoader';\n\n/**\n * @module\n * @description Choose right url loader for scheme\n * @ignore\n */\nfunction SchemeLoaderFactory() {\n\n let instance;\n\n let schemeLoaderMap;\n\n function registerLoader(scheme, loader) {\n schemeLoaderMap[scheme] = loader;\n }\n\n function unregisterLoader(scheme) {\n if (schemeLoaderMap[scheme]) {\n delete schemeLoaderMap[scheme];\n }\n }\n\n function unregisterAllLoader() {\n schemeLoaderMap = {};\n }\n\n function getLoader(url) {\n\n // iterates through schemeLoaderMap to find a loader for the scheme\n for (var scheme in schemeLoaderMap) {\n if (schemeLoaderMap.hasOwnProperty(scheme) && url.startsWith(scheme)) {\n return schemeLoaderMap[scheme];\n }\n }\n\n return HTTPLoader;\n }\n\n function reset() {\n unregisterAllLoader();\n }\n\n function setup() {\n reset();\n }\n\n setup();\n\n instance = {\n getLoader: getLoader,\n registerLoader: registerLoader,\n unregisterLoader: unregisterLoader,\n unregisterAllLoader: unregisterAllLoader,\n reset: reset\n };\n\n return instance;\n}\n\nSchemeLoaderFactory.__dashjs_factory_name = 'SchemeLoaderFactory';\nconst factory = FactoryMaker.getSingletonFactory(SchemeLoaderFactory);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport FactoryMaker from '../../core/FactoryMaker';\nimport SchemeLoaderFactory from '../../streaming/net/SchemeLoaderFactory';\n\n/**\n * @class URLLoader\n * @description Call Offline Loader or Online Loader depending on URL\n * @param {Object} cfg - dependencies\n * @ignore\n*/\nfunction URLLoader(cfg) {\n\n cfg = cfg || {};\n const context = this.context;\n\n let instance,\n schemeLoaderFactory,\n loader;\n\n schemeLoaderFactory = SchemeLoaderFactory(context).getInstance();\n\n function load(config) {\n if (!loader) {\n let loaderFactory = schemeLoaderFactory.getLoader(config && config.request ? config.request.url : null);\n loader = loaderFactory(context).create({\n errHandler: cfg.errHandler,\n mediaPlayerModel: cfg.mediaPlayerModel,\n requestModifier: cfg.requestModifier,\n dashMetrics: cfg.dashMetrics,\n boxParser: cfg.boxParser ? cfg.boxParser : null,\n constants: cfg.constants ? cfg.constants : null,\n dashConstants: cfg.dashConstants ? cfg.dashConstants : null,\n urlUtils: cfg.urlUtils ? cfg.urlUtils : null,\n requestTimeout: !isNaN(cfg.requestTimeout) ? cfg.requestTimeout : 0,\n errors: cfg.errors\n });\n }\n loader.load(config);\n }\n\n function abort() {\n if (loader) {\n loader.abort();\n }\n }\n instance = {\n load: load,\n abort: abort\n };\n\n return instance;\n\n}\nURLLoader.__dashjs_factory_name = 'URLLoader';\n\nconst factory = FactoryMaker.getClassFactory(URLLoader);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nimport FragmentRequest from './FragmentRequest';\n\nclass HeadRequest extends FragmentRequest {\n constructor(url) {\n super(url);\n this.checkForExistenceOnly = true;\n }\n}\n\nexport default HeadRequest;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport Constants from './constants/Constants';\nimport URLLoader from './net/URLLoader';\nimport HeadRequest from './vo/HeadRequest';\nimport DashJSError from './vo/DashJSError';\nimport FactoryMaker from '../core/FactoryMaker';\n\nfunction FragmentLoader(config) {\n\n config = config || {};\n const context = this.context;\n const eventBus = config.eventBus;\n const events = config.events;\n const urlUtils = config.urlUtils;\n const errors = config.errors;\n const streamId = config.streamId;\n\n let instance,\n urlLoader;\n\n function setup() {\n urlLoader = URLLoader(context).create({\n errHandler: config.errHandler,\n errors: errors,\n dashMetrics: config.dashMetrics,\n mediaPlayerModel: config.mediaPlayerModel,\n requestModifier: config.requestModifier,\n urlUtils: urlUtils,\n constants: Constants,\n boxParser: config.boxParser,\n dashConstants: config.dashConstants,\n requestTimeout: config.settings.get().streaming.fragmentRequestTimeout\n });\n }\n\n function checkForExistence(request) {\n const report = function (success) {\n eventBus.trigger(events.CHECK_FOR_EXISTENCE_COMPLETED, { request: request, exists: success }\n );\n };\n\n if (request) {\n let headRequest = new HeadRequest(request.url);\n urlLoader.load({\n request: headRequest,\n success: function () {\n report(true);\n },\n error: function () {\n report(false);\n }\n });\n } else {\n report(false);\n }\n }\n\n function load(request) {\n const report = function (data, error) {\n eventBus.trigger(events.LOADING_COMPLETED, {\n request: request,\n response: data || null,\n error: error || null,\n sender: instance\n });\n };\n\n if (request) {\n urlLoader.load({\n request: request,\n progress: function (event) {\n eventBus.trigger(events.LOADING_PROGRESS, {\n request: request,\n stream: event.stream,\n streamId\n });\n if (event.data) {\n eventBus.trigger(events.LOADING_DATA_PROGRESS, {\n request: request,\n response: event.data || null,\n error: null,\n sender: instance\n });\n }\n },\n success: function (data) {\n report(data);\n },\n error: function (request, statusText, errorText) {\n report(\n undefined,\n new DashJSError(\n errors.FRAGMENT_LOADER_LOADING_FAILURE_ERROR_CODE,\n errorText,\n statusText\n )\n );\n },\n abort: function (request) {\n if (request) {\n eventBus.trigger(events.LOADING_ABANDONED, {\n mediaType: request.mediaType,\n request: request,\n sender: instance\n });\n }\n }\n });\n } else {\n report(\n undefined,\n new DashJSError(\n errors.FRAGMENT_LOADER_NULL_REQUEST_ERROR_CODE,\n errors.FRAGMENT_LOADER_NULL_REQUEST_ERROR_MESSAGE\n )\n );\n }\n }\n\n function abort() {\n if (urlLoader) {\n urlLoader.abort();\n }\n }\n\n function reset() {\n if (urlLoader) {\n urlLoader.abort();\n urlLoader = null;\n }\n }\n\n instance = {\n checkForExistence: checkForExistence,\n load: load,\n abort: abort,\n reset: reset\n };\n\n setup();\n\n return instance;\n}\n\nFragmentLoader.__dashjs_factory_name = 'FragmentLoader';\nexport default FactoryMaker.getClassFactory(FragmentLoader);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport FactoryMaker from '../../core/FactoryMaker';\n\nfunction SegmentResponseModifier() {\n\n let instance;\n\n function modifyResponseAsync(chunk) {\n return Promise.resolve(chunk);\n }\n\n instance = {\n modifyResponseAsync\n };\n\n return instance;\n}\n\nSegmentResponseModifier.__dashjs_factory_name = 'SegmentResponseModifier';\nexport default FactoryMaker.getSingletonFactory(SegmentResponseModifier);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport Constants from '../constants/Constants';\nimport DataChunk from '../vo/DataChunk';\nimport FragmentModel from '../models/FragmentModel';\nimport FragmentLoader from '../FragmentLoader';\nimport RequestModifier from '../utils/RequestModifier';\nimport EventBus from '../../core/EventBus';\nimport Events from '../../core/events/Events';\nimport MediaPlayerEvents from '../MediaPlayerEvents';\nimport Errors from '../../core/errors/Errors';\nimport FactoryMaker from '../../core/FactoryMaker';\nimport Debug from '../../core/Debug';\nimport SegmentResponseModifier from '../utils/SegmentResponseModifier';\n\nfunction FragmentController(config) {\n\n config = config || {};\n const context = this.context;\n const eventBus = EventBus(context).getInstance();\n\n const errHandler = config.errHandler;\n const mediaPlayerModel = config.mediaPlayerModel;\n const dashMetrics = config.dashMetrics;\n const debug = Debug(context).getInstance();\n const segmentResponseModifier = SegmentResponseModifier(context).getInstance();\n const streamInfo = config.streamInfo;\n\n let instance,\n logger,\n fragmentModels;\n\n function setup() {\n logger = debug.getLogger(instance);\n resetInitialSettings();\n eventBus.on(MediaPlayerEvents.FRAGMENT_LOADING_COMPLETED, onFragmentLoadingCompleted, instance);\n eventBus.on(MediaPlayerEvents.FRAGMENT_LOADING_PROGRESS, onFragmentLoadingCompleted, instance);\n }\n\n function getStreamId() {\n return streamInfo.id;\n }\n\n function getModel(type) {\n let model = fragmentModels[type];\n if (!model) {\n model = FragmentModel(context).create({\n streamInfo: streamInfo,\n type: type,\n dashMetrics: dashMetrics,\n fragmentLoader: FragmentLoader(context).create({\n dashMetrics: dashMetrics,\n mediaPlayerModel: mediaPlayerModel,\n errHandler: errHandler,\n requestModifier: RequestModifier(context).getInstance(),\n settings: config.settings,\n boxParser: config.boxParser,\n eventBus: eventBus,\n events: Events,\n errors: Errors,\n dashConstants: config.dashConstants,\n urlUtils: config.urlUtils,\n streamId: getStreamId()\n }),\n debug: debug,\n eventBus: eventBus,\n events: Events\n });\n\n fragmentModels[type] = model;\n }\n\n return model;\n }\n\n function resetInitialSettings() {\n for (let model in fragmentModels) {\n fragmentModels[model].reset();\n }\n fragmentModels = {};\n }\n\n function reset() {\n eventBus.off(MediaPlayerEvents.FRAGMENT_LOADING_COMPLETED, onFragmentLoadingCompleted, this);\n eventBus.off(MediaPlayerEvents.FRAGMENT_LOADING_PROGRESS, onFragmentLoadingCompleted, this);\n resetInitialSettings();\n }\n\n function createDataChunk(bytes, request, streamId, endFragment) {\n const chunk = new DataChunk();\n\n chunk.streamId = streamId;\n chunk.mediaInfo = request.mediaInfo;\n chunk.segmentType = request.type;\n chunk.start = request.startTime;\n chunk.duration = request.duration;\n chunk.end = chunk.start + chunk.duration;\n chunk.bytes = bytes;\n chunk.index = request.index;\n chunk.quality = request.quality;\n chunk.representationId = request.representationId;\n chunk.endFragment = endFragment;\n\n return chunk;\n }\n\n function onFragmentLoadingCompleted(e) {\n // Event propagation may have been stopped (see MssHandler)\n if (!e.sender) return;\n\n const request = e.request;\n const bytes = e.response;\n const isInit = request.isInitializationRequest();\n const strInfo = request.mediaInfo.streamInfo;\n\n if (e.error) {\n if (request.mediaType === Constants.AUDIO || request.mediaType === Constants.VIDEO || (request.mediaType === Constants.TEXT && request.mediaInfo.isFragmented)) {\n // add service location to blacklist controller - only for audio or video. text should not set errors\n eventBus.trigger(Events.SERVICE_LOCATION_BASE_URL_BLACKLIST_ADD, { entry: e.request.serviceLocation });\n }\n }\n\n if (!bytes || !strInfo) {\n logger.warn('No ' + request.mediaType + ' bytes to push or stream is inactive.');\n return;\n }\n const chunk = createDataChunk(bytes, request, streamInfo.id, e.type !== Events.FRAGMENT_LOADING_PROGRESS);\n segmentResponseModifier.modifyResponseAsync(chunk)\n .then((modifiedChunk) => {\n eventBus.trigger(isInit ? Events.INIT_FRAGMENT_LOADED : Events.MEDIA_FRAGMENT_LOADED,\n {\n chunk: modifiedChunk,\n request: request\n },\n { streamId: strInfo.id, mediaType: request.mediaType }\n );\n })\n .catch((e) => {\n logger.error(e);\n eventBus.trigger(isInit ? Events.INIT_FRAGMENT_LOADED : Events.MEDIA_FRAGMENT_LOADED,\n {\n chunk: chunk,\n request: request\n },\n { streamId: strInfo.id, mediaType: request.mediaType }\n );\n })\n }\n\n instance = {\n getStreamId,\n getModel,\n reset\n };\n\n setup();\n\n return instance;\n}\n\nFragmentController.__dashjs_factory_name = 'FragmentController';\nexport default FactoryMaker.getClassFactory(FragmentController);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass Thumbnail {\n constructor() {\n this.url = null;\n this.width = null;\n this.height = null;\n this.x = null;\n this.y = null;\n }\n}\n\nexport default Thumbnail;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass BitrateInfo {\n constructor() {\n this.mediaType = null;\n this.bitrate = null;\n this.width = null;\n this.height = null;\n this.scanType = null;\n this.qualityIndex = NaN;\n }\n}\n\nexport default BitrateInfo;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport FactoryMaker from '../../core/FactoryMaker';\nimport Constants from '../constants/Constants';\nimport Thumbnail from '../vo/Thumbnail';\nimport ThumbnailTracks from './ThumbnailTracks';\nimport BitrateInfo from '../vo/BitrateInfo';\nimport {replaceTokenForTemplate, unescapeDollarsInTemplate} from '../../dash/utils/SegmentsUtils';\n\nfunction ThumbnailController(config) {\n\n const context = this.context;\n const streamInfo = config.streamInfo;\n\n let instance,\n thumbnailTracks;\n\n function setup() {\n reset();\n thumbnailTracks = ThumbnailTracks(context).create({\n streamInfo: streamInfo,\n adapter: config.adapter,\n baseURLController: config.baseURLController,\n timelineConverter: config.timelineConverter,\n debug: config.debug,\n eventBus: config.eventBus,\n events: config.events,\n dashConstants: config.dashConstants,\n dashMetrics: config.dashMetrics,\n segmentBaseController: config.segmentBaseController\n });\n }\n\n function initialize() {\n thumbnailTracks.addTracks();\n const tracks = thumbnailTracks.getTracks();\n\n if (tracks && tracks.length > 0) {\n setTrackByIndex(0);\n }\n }\n\n function getStreamId() {\n return streamInfo.id;\n }\n\n function provide(time, callback) {\n\n if (typeof callback !== 'function') {\n return;\n }\n const track = thumbnailTracks.getCurrentTrack();\n let offset,\n request;\n if (!track || track.segmentDuration <= 0 || time === undefined || time === null) {\n callback(null);\n return;\n }\n\n request = thumbnailTracks.getThumbnailRequestForTime(time);\n if (request) {\n track.segmentDuration = request.duration;\n }\n\n offset = time % track.segmentDuration;\n\n const thumbIndex = Math.floor((offset * track.tilesHor * track.tilesVert) / track.segmentDuration);\n // Create and return the thumbnail\n const thumbnail = new Thumbnail();\n\n thumbnail.width = Math.floor(track.widthPerTile);\n thumbnail.height = Math.floor(track.heightPerTile);\n thumbnail.x = Math.floor(thumbIndex % track.tilesHor) * track.widthPerTile;\n thumbnail.y = Math.floor(thumbIndex / track.tilesHor) * track.heightPerTile;\n\n if ('readThumbnail' in track) {\n return track.readThumbnail(time, (url) => {\n thumbnail.url = url;\n callback(thumbnail);\n });\n } else {\n if (!request) {\n const seq = Math.floor(time / track.segmentDuration);\n thumbnail.url = _buildUrlFromTemplate(track, seq);\n } else {\n thumbnail.url = request.url;\n track.segmentDuration = NaN;\n }\n callback(thumbnail);\n }\n }\n\n function _buildUrlFromTemplate(track, seq) {\n const seqIdx = seq + track.startNumber;\n let url = replaceTokenForTemplate(track.templateUrl, 'Number', seqIdx);\n url = replaceTokenForTemplate(url, 'Time', (seqIdx - 1) * track.segmentDuration * track.timescale);\n url = replaceTokenForTemplate(url, 'Bandwidth', track.bandwidth);\n return unescapeDollarsInTemplate(url);\n }\n\n function setTrackByIndex(index) {\n thumbnailTracks.setTrackByIndex(index);\n }\n\n function getCurrentTrackIndex() {\n return thumbnailTracks.getCurrentTrackIndex();\n }\n\n function getBitrateList() {\n const tracks = thumbnailTracks.getTracks();\n let i = 0;\n\n return tracks.map((t) => {\n const bitrateInfo = new BitrateInfo();\n bitrateInfo.mediaType = Constants.IMAGE;\n bitrateInfo.qualityIndex = i++;\n bitrateInfo.bitrate = t.bitrate;\n bitrateInfo.width = t.width;\n bitrateInfo.height = t.height;\n return bitrateInfo;\n });\n }\n\n function reset() {\n if (thumbnailTracks) {\n thumbnailTracks.reset();\n }\n }\n\n instance = {\n getStreamId,\n initialize,\n provide,\n setTrackByIndex,\n getCurrentTrackIndex,\n getBitrateList,\n reset\n };\n\n setup();\n\n return instance;\n}\n\nThumbnailController.__dashjs_factory_name = 'ThumbnailController';\nexport default FactoryMaker.getClassFactory(ThumbnailController);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport FactoryMaker from '../../core/FactoryMaker';\nimport EventBus from '../../core/EventBus';\n\nfunction BlackListController(config) {\n\n config = config || {};\n let instance;\n let blacklist = [];\n\n const eventBus = EventBus(this.context).getInstance();\n const updateEventName = config.updateEventName;\n const addBlacklistEventName = config.addBlacklistEventName;\n\n function contains(query) {\n if (!blacklist.length || !query || !query.length) {\n return false;\n }\n\n return (blacklist.indexOf(query) !== -1);\n }\n\n function add(entry) {\n if (blacklist.indexOf(entry) !== -1) {\n return;\n }\n\n blacklist.push(entry);\n\n eventBus.trigger(updateEventName, { entry: entry });\n }\n\n function onAddBlackList(e) {\n add(e.entry);\n }\n\n function setup() {\n if (addBlacklistEventName) {\n eventBus.on(addBlacklistEventName, onAddBlackList, instance);\n }\n }\n\n function reset() {\n blacklist = [];\n }\n\n instance = {\n add: add,\n contains: contains,\n reset: reset\n };\n\n setup();\n return instance;\n}\n\nBlackListController.__dashjs_factory_name = 'BlackListController';\nexport default FactoryMaker.getClassFactory(BlackListController);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport Constants from './constants/Constants';\nimport DashConstants from '../dash/constants/DashConstants';\nimport StreamProcessor from './StreamProcessor';\nimport FragmentController from './controllers/FragmentController';\nimport ThumbnailController from './thumbnail/ThumbnailController';\nimport EventBus from '../core/EventBus';\nimport Events from '../core/events/Events';\nimport Debug from '../core/Debug';\nimport Errors from '../core/errors/Errors';\nimport FactoryMaker from '../core/FactoryMaker';\nimport DashJSError from './vo/DashJSError';\nimport BoxParser from './utils/BoxParser';\nimport URLUtils from './utils/URLUtils';\nimport BlacklistController from './controllers/BlacklistController';\n\n\nconst MEDIA_TYPES = [Constants.VIDEO, Constants.AUDIO, Constants.TEXT, Constants.MUXED, Constants.IMAGE];\n\n\nfunction Stream(config) {\n\n config = config || {};\n const context = this.context;\n const eventBus = EventBus(context).getInstance();\n const urlUtils = URLUtils(context).getInstance();\n\n const manifestModel = config.manifestModel;\n const mediaPlayerModel = config.mediaPlayerModel;\n const dashMetrics = config.dashMetrics;\n const manifestUpdater = config.manifestUpdater;\n const adapter = config.adapter;\n const timelineConverter = config.timelineConverter;\n const capabilities = config.capabilities;\n const errHandler = config.errHandler;\n const abrController = config.abrController;\n const playbackController = config.playbackController;\n const eventController = config.eventController;\n const mediaController = config.mediaController;\n const protectionController = config.protectionController;\n const textController = config.textController;\n const videoModel = config.videoModel;\n let streamInfo = config.streamInfo;\n const settings = config.settings;\n\n\n let instance,\n logger,\n streamProcessors,\n isInitialized,\n isActive,\n hasFinishedBuffering,\n hasVideoTrack,\n hasAudioTrack,\n updateError,\n isUpdating,\n fragmentController,\n thumbnailController,\n segmentBlacklistController,\n preloaded,\n boxParser,\n debug,\n isEndedEventSignaled,\n trackChangedEvents;\n\n /**\n * Setup the stream\n */\n function setup() {\n try {\n debug = Debug(context).getInstance();\n logger = debug.getLogger(instance);\n resetInitialSettings();\n\n boxParser = BoxParser(context).getInstance();\n\n segmentBlacklistController = BlacklistController(context).create({\n updateEventName: Events.SEGMENT_LOCATION_BLACKLIST_CHANGED,\n addBlacklistEventName: Events.SEGMENT_LOCATION_BLACKLIST_ADD\n });\n\n fragmentController = FragmentController(context).create({\n streamInfo: streamInfo,\n mediaPlayerModel: mediaPlayerModel,\n dashMetrics: dashMetrics,\n errHandler: errHandler,\n settings: settings,\n boxParser: boxParser,\n dashConstants: DashConstants,\n urlUtils: urlUtils\n });\n\n } catch (e) {\n throw e;\n }\n }\n\n /**\n * Initialize the events\n */\n function initialize() {\n registerEvents();\n registerProtectionEvents();\n textController.initializeForStream(streamInfo);\n eventBus.trigger(Events.STREAM_UPDATED, { streamInfo: streamInfo });\n }\n\n /**\n * Register the streaming events\n */\n function registerEvents() {\n eventBus.on(Events.BUFFERING_COMPLETED, onBufferingCompleted, instance);\n eventBus.on(Events.DATA_UPDATE_COMPLETED, onDataUpdateCompleted, instance);\n eventBus.on(Events.INBAND_EVENTS, onInbandEvents, instance);\n }\n\n /**\n * Unregister the streaming events\n */\n function unRegisterEvents() {\n eventBus.off(Events.DATA_UPDATE_COMPLETED, onDataUpdateCompleted, instance);\n eventBus.off(Events.BUFFERING_COMPLETED, onBufferingCompleted, instance);\n eventBus.off(Events.INBAND_EVENTS, onInbandEvents, instance);\n }\n\n /**\n * Register the protection events\n */\n function registerProtectionEvents() {\n if (protectionController) {\n eventBus.on(Events.KEY_ERROR, onProtectionError, instance);\n eventBus.on(Events.SERVER_CERTIFICATE_UPDATED, onProtectionError, instance);\n eventBus.on(Events.LICENSE_REQUEST_COMPLETE, onProtectionError, instance);\n eventBus.on(Events.KEY_SYSTEM_SELECTED, onProtectionError, instance);\n eventBus.on(Events.KEY_SESSION_CREATED, onProtectionError, instance);\n eventBus.on(Events.KEY_STATUSES_CHANGED, onProtectionError, instance);\n }\n }\n\n /**\n * Unregister the protection events\n */\n function unRegisterProtectionEvents() {\n if (protectionController) {\n eventBus.off(Events.KEY_ERROR, onProtectionError, instance);\n eventBus.off(Events.SERVER_CERTIFICATE_UPDATED, onProtectionError, instance);\n eventBus.off(Events.LICENSE_REQUEST_COMPLETE, onProtectionError, instance);\n eventBus.off(Events.KEY_SYSTEM_SELECTED, onProtectionError, instance);\n eventBus.off(Events.KEY_SESSION_CREATED, onProtectionError, instance);\n eventBus.off(Events.KEY_STATUSES_CHANGED, onProtectionError, instance);\n }\n }\n\n /**\n * Returns the stream id\n * @return {*|null}\n */\n function getStreamId() {\n return streamInfo ? streamInfo.id : null;\n }\n\n /**\n * Activates Stream by re-initializing some of its components\n * @param {MediaSource} mediaSource\n * @param {array} previousBufferSinks\n * @memberof Stream#\n */\n function activate(mediaSource, previousBufferSinks) {\n return new Promise((resolve, reject) => {\n if (isActive) {\n resolve(previousBufferSinks);\n return;\n }\n\n if (getPreloaded()) {\n isActive = true;\n eventBus.trigger(Events.STREAM_ACTIVATED, {\n streamInfo\n });\n resolve(previousBufferSinks);\n return;\n }\n\n\n _initializeMedia(mediaSource, previousBufferSinks)\n .then((bufferSinks) => {\n isActive = true;\n eventBus.trigger(Events.STREAM_ACTIVATED, {\n streamInfo\n });\n resolve(bufferSinks);\n })\n .catch((e) => {\n reject(e);\n });\n });\n }\n\n function startPreloading(mediaSource, previousBuffers) {\n return new Promise((resolve, reject) => {\n\n if (getPreloaded()) {\n reject();\n return;\n }\n\n logger.info(`[startPreloading] Preloading next stream with id ${getId()}`);\n setPreloaded(true);\n\n _commonMediaInitialization(mediaSource, previousBuffers)\n .then(() => {\n for (let i = 0; i < streamProcessors.length && streamProcessors[i]; i++) {\n streamProcessors[i].setExplicitBufferingTime(getStartTime());\n streamProcessors[i].getScheduleController().startScheduleTimer();\n }\n resolve();\n })\n .catch(() => {\n setPreloaded(false);\n reject();\n });\n });\n }\n\n /**\n *\n * @param {object} mediaSource\n * @param {array} previousBufferSinks\n * @return {Promise<Array>}\n * @private\n */\n function _initializeMedia(mediaSource, previousBufferSinks) {\n return _commonMediaInitialization(mediaSource, previousBufferSinks);\n }\n\n /**\n *\n * @param {object} mediaSource\n * @param {array} previousBufferSinks\n * @return {Promise<array>}\n * @private\n */\n function _commonMediaInitialization(mediaSource, previousBufferSinks) {\n return new Promise((resolve, reject) => {\n checkConfig();\n\n isUpdating = true;\n _addInlineEvents();\n\n\n let element = videoModel.getElement();\n const promises = [];\n MEDIA_TYPES.forEach((mediaType) => {\n // If we are preloading without a video element we can not start texttrack handling.\n if (!(mediaType === Constants.TEXT && !mediaSource) && (mediaType !== Constants.VIDEO || (!element || (element && (/^VIDEO$/i).test(element.nodeName))))) {\n promises.push(_initializeMediaForType(mediaType, mediaSource));\n }\n });\n\n Promise.all(promises)\n .then(() => {\n return _createBufferSinks(previousBufferSinks)\n })\n .then((bufferSinks) => {\n isUpdating = false;\n\n if (streamProcessors.length === 0) {\n const msg = 'No streams to play.';\n errHandler.error(new DashJSError(Errors.MANIFEST_ERROR_ID_NOSTREAMS_CODE, msg, manifestModel.getValue()));\n logger.fatal(msg);\n } else {\n _checkIfInitializationCompleted();\n }\n\n if (mediaSource) {\n // All mediaInfos for texttracks are added to the TextSourceBuffer by now. We can start creating the tracks\n textController.createTracks(streamInfo);\n }\n\n resolve(bufferSinks);\n })\n .catch((e) => {\n reject(e);\n });\n });\n }\n\n /**\n * We call this function if segments have been preloaded without a video element. Once the video element is attached MSE is available\n * @param mediaSource\n * @returns {Promise<unknown>}\n */\n function initializeForTextWithMediaSource(mediaSource) {\n return new Promise((resolve, reject) => {\n _initializeMediaForType(Constants.TEXT, mediaSource)\n .then(() => {\n return createBufferSinkForText()\n })\n .then(() => {\n textController.createTracks(streamInfo);\n resolve()\n })\n .catch((e) => {\n reject(e);\n })\n })\n }\n\n /**\n * Initialize for a given media type. Creates a corresponding StreamProcessor\n * @param {string} type\n * @param {object} mediaSource\n * @private\n */\n function _initializeMediaForType(type, mediaSource) {\n let allMediaForType = adapter.getAllMediaInfoForType(streamInfo, type);\n let embeddedMediaInfos = [];\n\n let mediaInfo = null;\n let initialMediaInfo;\n\n if (!allMediaForType || allMediaForType.length === 0) {\n logger.info('No ' + type + ' data.');\n return Promise.resolve();\n }\n\n if (type === Constants.VIDEO) {\n hasVideoTrack = true;\n }\n\n if (type === Constants.AUDIO) {\n hasAudioTrack = true;\n }\n\n for (let i = 0, ln = allMediaForType.length; i < ln; i++) {\n mediaInfo = allMediaForType[i];\n\n if (type === Constants.TEXT && !!mediaInfo.isEmbedded) {\n textController.addEmbeddedTrack(streamInfo, mediaInfo);\n embeddedMediaInfos.push(mediaInfo);\n }\n if (_isMediaSupported(mediaInfo)) {\n mediaController.addTrack(mediaInfo);\n }\n }\n\n if (embeddedMediaInfos.length > 0) {\n mediaController.setInitialMediaSettingsForType(type, streamInfo);\n textController.addMediaInfosToBuffer(streamInfo, type, embeddedMediaInfos);\n }\n\n // Filter out embedded text track before creating StreamProcessor\n allMediaForType = allMediaForType.filter(mediaInfo => {\n return !mediaInfo.isEmbedded;\n });\n if (allMediaForType.length === 0) {\n return Promise.resolve();\n }\n\n if (type === Constants.IMAGE) {\n thumbnailController = ThumbnailController(context).create({\n streamInfo: streamInfo,\n adapter: adapter,\n baseURLController: config.baseURLController,\n timelineConverter: config.timelineConverter,\n debug: debug,\n eventBus: eventBus,\n events: Events,\n dashConstants: DashConstants,\n dashMetrics: config.dashMetrics,\n segmentBaseController: config.segmentBaseController\n });\n thumbnailController.initialize();\n return Promise.resolve();\n }\n\n eventBus.trigger(Events.STREAM_INITIALIZING, {\n streamInfo: streamInfo,\n mediaInfo: mediaInfo\n });\n\n mediaController.setInitialMediaSettingsForType(type, streamInfo);\n\n let streamProcessor = _createStreamProcessor(allMediaForType, mediaSource);\n\n initialMediaInfo = mediaController.getCurrentTrackFor(type, streamInfo.id);\n\n if (initialMediaInfo) {\n abrController.updateTopQualityIndex(initialMediaInfo);\n // In case of mixed fragmented and embedded text tracks, check if initial selected text track is not an embedded track\n return streamProcessor.selectMediaInfo((type !== Constants.TEXT || !initialMediaInfo.isEmbedded) ? initialMediaInfo : allMediaForType[0]);\n }\n\n return Promise.resolve();\n }\n\n function _isMediaSupported(mediaInfo) {\n const type = mediaInfo ? mediaInfo.type : null;\n let msg;\n\n if (type === Constants.MUXED) {\n msg = 'Multiplexed representations are intentionally not supported, as they are not compliant with the DASH-AVC/264 guidelines';\n logger.fatal(msg);\n errHandler.error(new DashJSError(Errors.MANIFEST_ERROR_ID_MULTIPLEXED_CODE, msg, manifestModel.getValue()));\n return false;\n }\n\n if (type === Constants.TEXT || type === Constants.IMAGE) {\n return true;\n }\n\n if (!!mediaInfo.contentProtection && !capabilities.supportsEncryptedMedia()) {\n errHandler.error(new DashJSError(Errors.CAPABILITY_MEDIAKEYS_ERROR_CODE, Errors.CAPABILITY_MEDIAKEYS_ERROR_MESSAGE));\n return false;\n }\n\n return true;\n }\n\n /**\n * Creates the StreamProcessor for a given media type.\n * @param {array} allMediaForType\n * @param {object} mediaSource\n * @private\n */\n function _createStreamProcessor(allMediaForType, mediaSource) {\n\n const mediaInfo = (allMediaForType && allMediaForType.length > 0) ? allMediaForType[0] : null;\n let fragmentModel = fragmentController.getModel(mediaInfo ? mediaInfo.type : null);\n const type = mediaInfo ? mediaInfo.type : null;\n const mimeType = mediaInfo ? mediaInfo.mimeType : null;\n const isFragmented = mediaInfo ? mediaInfo.isFragmented : null;\n\n let streamProcessor = StreamProcessor(context).create({\n streamInfo,\n type,\n mimeType,\n timelineConverter,\n adapter,\n manifestModel,\n mediaPlayerModel,\n fragmentModel,\n dashMetrics: config.dashMetrics,\n baseURLController: config.baseURLController,\n segmentBaseController: config.segmentBaseController,\n abrController,\n playbackController,\n mediaController,\n textController,\n errHandler,\n settings,\n boxParser,\n segmentBlacklistController\n });\n\n streamProcessor.initialize(mediaSource, hasVideoTrack, isFragmented);\n streamProcessors.push(streamProcessor);\n\n for (let i = 0; i < allMediaForType.length; i++) {\n streamProcessor.addMediaInfo(allMediaForType[i]);\n }\n\n if (type === Constants.TEXT) {\n textController.addMediaInfosToBuffer(streamInfo, type, allMediaForType, fragmentModel);\n }\n\n return streamProcessor;\n }\n\n /**\n * Creates the SourceBufferSink objects for all StreamProcessors\n * @param {array} previousBuffersSinks\n * @return {Promise<object>}\n * @private\n */\n function _createBufferSinks(previousBuffersSinks) {\n return new Promise((resolve) => {\n const buffers = {};\n const promises = streamProcessors.map((sp) => {\n return sp.createBufferSinks(previousBuffersSinks);\n });\n\n Promise.all(promises)\n .then((bufferSinks) => {\n bufferSinks.forEach((sink) => {\n if (sink) {\n buffers[sink.getType()] = sink;\n }\n });\n resolve(buffers);\n })\n .catch(() => {\n resolve(buffers);\n });\n });\n }\n\n function createBufferSinkForText() {\n const sp = _getProcessorByType(Constants.TEXT);\n if (sp) {\n return sp.createBufferSinks()\n }\n\n return Promise.resolve();\n }\n\n /**\n * Partially resets some of the Stream elements. This function is called when preloading of streams is canceled or a stream switch occurs.\n * @memberof Stream#\n * @param {boolean} keepBuffers\n */\n function deactivate(keepBuffers) {\n let ln = streamProcessors ? streamProcessors.length : 0;\n const errored = false;\n for (let i = 0; i < ln; i++) {\n let fragmentModel = streamProcessors[i].getFragmentModel();\n fragmentModel.abortRequests();\n fragmentModel.resetInitialSettings();\n streamProcessors[i].reset(errored, keepBuffers);\n }\n if (textController) {\n textController.deactivateStream(streamInfo);\n }\n streamProcessors = [];\n isActive = false;\n hasFinishedBuffering = false;\n setPreloaded(false);\n setIsEndedEventSignaled(false);\n eventBus.trigger(Events.STREAM_DEACTIVATED, { streamInfo });\n }\n\n function getIsActive() {\n return isActive;\n }\n\n function setMediaSource(mediaSource) {\n return new Promise((resolve, reject) => {\n const promises = [];\n for (let i = 0; i < streamProcessors.length;) {\n if (_isMediaSupported(streamProcessors[i].getMediaInfo())) {\n promises.push(streamProcessors[i].setMediaSource(mediaSource));\n i++;\n } else {\n streamProcessors[i].reset();\n streamProcessors.splice(i, 1);\n }\n }\n\n Promise.all(promises)\n .then(() => {\n for (let i = 0; i < streamProcessors.length; i++) {\n //Adding of new tracks to a stream processor isn't guaranteed by the spec after the METADATA_LOADED state\n //so do this after the buffers are created above.\n streamProcessors[i].dischargePreBuffer();\n }\n\n if (streamProcessors.length === 0) {\n const msg = 'No streams to play.';\n errHandler.error(new DashJSError(Errors.MANIFEST_ERROR_ID_NOSTREAMS_CODE, msg + 'nostreams', manifestModel.getValue()));\n logger.fatal(msg);\n }\n resolve();\n })\n .catch((e) => {\n logger.error(e);\n reject(e);\n })\n })\n }\n\n function resetInitialSettings(keepBuffers) {\n deactivate(keepBuffers);\n isInitialized = false;\n hasVideoTrack = false;\n hasAudioTrack = false;\n updateError = {};\n isUpdating = false;\n isEndedEventSignaled = false;\n trackChangedEvents = [];\n }\n\n function reset(keepBuffers) {\n\n if (fragmentController) {\n fragmentController.reset();\n fragmentController = null;\n }\n\n if (abrController && streamInfo) {\n abrController.clearDataForStream(streamInfo.id);\n }\n\n if (segmentBlacklistController) {\n segmentBlacklistController.reset();\n segmentBlacklistController = null;\n }\n\n resetInitialSettings(keepBuffers);\n\n streamInfo = null;\n\n unRegisterEvents();\n\n unRegisterProtectionEvents();\n\n }\n\n function getDuration() {\n return streamInfo ? streamInfo.duration : NaN;\n }\n\n function getIsEndedEventSignaled() {\n return isEndedEventSignaled;\n }\n\n function setIsEndedEventSignaled(value) {\n isEndedEventSignaled = value;\n }\n\n function getStartTime() {\n return streamInfo ? streamInfo.start : NaN;\n }\n\n function getId() {\n return streamInfo ? streamInfo.id : null;\n }\n\n function getStreamInfo() {\n return streamInfo;\n }\n\n function getHasAudioTrack() {\n return hasAudioTrack;\n }\n\n function getHasVideoTrack() {\n return hasVideoTrack;\n }\n\n function getThumbnailController() {\n return thumbnailController;\n }\n\n function checkConfig() {\n if (!videoModel || !abrController) {\n throw new Error(Constants.MISSING_CONFIG_ERROR);\n }\n }\n\n /**\n * @param {string} type\n * @returns {Array}\n * @memberof Stream#\n */\n function getBitrateListFor(type) {\n checkConfig();\n if (type === Constants.IMAGE) {\n if (!thumbnailController) {\n return [];\n }\n return thumbnailController.getBitrateList();\n }\n const mediaInfo = getMediaInfo(type);\n return abrController.getBitrateList(mediaInfo);\n }\n\n function onProtectionError(event) {\n if (event.error) {\n errHandler.error(event.error);\n logger.fatal(event.error.message);\n }\n }\n\n function prepareTrackChange(e) {\n if (!isActive || !streamInfo) {\n return;\n }\n\n hasFinishedBuffering = false;\n\n let mediaInfo = e.newMediaInfo;\n let manifest = manifestModel.getValue();\n\n adapter.setCurrentMediaInfo(streamInfo.id, mediaInfo.type, mediaInfo);\n\n let processor = getProcessorForMediaInfo(mediaInfo);\n if (!processor) return;\n\n let currentTime = playbackController.getTime();\n logger.info('Stream - Process track changed at current time ' + currentTime);\n\n // Applies only for MSS streams\n if (manifest.refreshManifestOnSwitchTrack) {\n trackChangedEvents.push(e);\n if (!manifestUpdater.getIsUpdating()) {\n logger.debug('Stream - Refreshing manifest for switch track');\n manifestUpdater.refreshManifest();\n }\n } else {\n processor.selectMediaInfo(mediaInfo)\n .then(() => {\n if (mediaInfo.type === Constants.VIDEO || mediaInfo.type === Constants.AUDIO) {\n abrController.updateTopQualityIndex(mediaInfo);\n }\n processor.prepareTrackSwitch();\n });\n }\n }\n\n function prepareQualityChange(e) {\n const processor = _getProcessorByType(e.mediaType);\n\n if (processor) {\n processor.prepareQualityChange(e);\n }\n }\n\n function _addInlineEvents() {\n if (eventController) {\n const events = adapter.getEventsFor(streamInfo);\n if (events && events.length > 0) {\n eventController.addInlineEvents(events, streamInfo.id);\n }\n }\n }\n\n function _checkIfInitializationCompleted() {\n const ln = streamProcessors.length;\n const hasError = !!updateError.audio || !!updateError.video;\n let error = hasError ? new DashJSError(Errors.DATA_UPDATE_FAILED_ERROR_CODE, Errors.DATA_UPDATE_FAILED_ERROR_MESSAGE) : null;\n\n for (let i = 0; i < ln; i++) {\n if (streamProcessors[i].isUpdating() || isUpdating) {\n return;\n }\n }\n\n if (protectionController) {\n // Need to check if streamProcessors exists because streamProcessors\n // could be cleared in case an error is detected while initializing DRM keysystem\n protectionController.clearMediaInfoArray();\n for (let i = 0; i < ln && streamProcessors[i]; i++) {\n const type = streamProcessors[i].getType();\n const mediaInfo = streamProcessors[i].getMediaInfo();\n if (type === Constants.AUDIO ||\n type === Constants.VIDEO ||\n (type === Constants.TEXT && mediaInfo.isFragmented)) {\n let mediaInfo = streamProcessors[i].getMediaInfo();\n if (mediaInfo) {\n protectionController.initializeForMedia(mediaInfo);\n }\n }\n }\n protectionController.handleKeySystemFromManifest();\n }\n\n if (error) {\n errHandler.error(error);\n } else if (!isInitialized) {\n isInitialized = true;\n videoModel.waitForReadyState(Constants.VIDEO_ELEMENT_READY_STATES.HAVE_METADATA, () => {\n eventBus.trigger(Events.STREAM_INITIALIZED, {\n streamInfo: streamInfo\n });\n })\n }\n\n }\n\n function getMediaInfo(type) {\n let streamProcessor = null;\n\n for (let i = 0; i < streamProcessors.length; i++) {\n streamProcessor = streamProcessors[i];\n\n if (streamProcessor.getType() === type) {\n return streamProcessor.getMediaInfo();\n }\n }\n\n return null;\n }\n\n function onBufferingCompleted() {\n let processors = getProcessors();\n const ln = processors.length;\n\n if (ln === 0) {\n logger.warn('onBufferingCompleted - can\\'t trigger STREAM_BUFFERING_COMPLETED because no streamProcessor is defined');\n return;\n }\n\n // if there is at least one buffer controller that has not completed buffering yet do nothing\n for (let i = 0; i < ln; i++) {\n //if audio or video buffer is not buffering completed state, do not send STREAM_BUFFERING_COMPLETED\n if (!processors[i].isBufferingCompleted() && (processors[i].getType() === Constants.AUDIO || processors[i].getType() === Constants.VIDEO)) {\n logger.debug('onBufferingCompleted - One streamProcessor has finished but', processors[i].getType(), 'one is not buffering completed');\n return;\n }\n }\n\n logger.debug('onBufferingCompleted - trigger STREAM_BUFFERING_COMPLETED');\n hasFinishedBuffering = true;\n eventBus.trigger(Events.STREAM_BUFFERING_COMPLETED, { streamInfo: streamInfo }, { streamInfo });\n }\n\n function onDataUpdateCompleted(e) {\n updateError[e.mediaType] = e.error;\n _checkIfInitializationCompleted();\n }\n\n function onInbandEvents(e) {\n if (eventController) {\n eventController.addInbandEvents(e.events, streamInfo.id);\n }\n }\n\n function getProcessorForMediaInfo(mediaInfo) {\n if (!mediaInfo || !mediaInfo.type) {\n return null;\n }\n\n return _getProcessorByType(mediaInfo.type);\n }\n\n function _getProcessorByType(type) {\n if (!type) {\n return null;\n }\n\n let processors = getProcessors();\n\n return processors.filter(function (processor) {\n return (processor.getType() === type);\n })[0];\n }\n\n function getProcessors() {\n let arr = [];\n\n let type,\n streamProcessor;\n\n for (let i = 0; i < streamProcessors.length; i++) {\n streamProcessor = streamProcessors[i];\n type = streamProcessor.getType();\n\n if (type === Constants.AUDIO || type === Constants.VIDEO || type === Constants.TEXT) {\n arr.push(streamProcessor);\n }\n }\n\n return arr;\n }\n\n function startScheduleControllers() {\n const ln = streamProcessors.length;\n for (let i = 0; i < ln && streamProcessors[i]; i++) {\n streamProcessors[i].getScheduleController().startScheduleTimer();\n }\n }\n\n function updateData(updatedStreamInfo) {\n return new Promise((resolve) => {\n isUpdating = true;\n streamInfo = updatedStreamInfo;\n\n if (eventController) {\n _addInlineEvents();\n }\n\n let promises = [];\n for (let i = 0, ln = streamProcessors.length; i < ln; i++) {\n let streamProcessor = streamProcessors[i];\n const currentMediaInfo = streamProcessor.getMediaInfo();\n promises.push(streamProcessor.updateStreamInfo(streamInfo));\n let allMediaForType = adapter.getAllMediaInfoForType(streamInfo, streamProcessor.getType());\n\n // Filter out embedded text track before updating media info in StreamProcessor\n allMediaForType = allMediaForType.filter(mediaInfo => {\n return !mediaInfo.isEmbedded;\n });\n\n // Check if AdaptationSet has not been removed in MPD update\n if (allMediaForType) {\n // Remove the current mediaInfo objects before adding the updated ones\n streamProcessor.clearMediaInfoArray();\n for (let j = 0; j < allMediaForType.length; j++) {\n const mInfo = allMediaForType[j];\n streamProcessor.addMediaInfo(allMediaForType[j]);\n if (adapter.areMediaInfosEqual(currentMediaInfo, mInfo)) {\n abrController.updateTopQualityIndex(mInfo);\n promises.push(streamProcessor.selectMediaInfo(mInfo))\n }\n }\n }\n }\n\n Promise.all(promises)\n .then(() => {\n promises = [];\n\n while (trackChangedEvents.length > 0) {\n let trackChangedEvent = trackChangedEvents.pop();\n let mediaInfo = trackChangedEvent.newMediaInfo;\n let processor = getProcessorForMediaInfo(trackChangedEvent.oldMediaInfo);\n if (!processor) return;\n promises.push(processor.prepareTrackSwitch());\n promises.push(processor.selectMediaInfo(mediaInfo));\n }\n\n return Promise.all(promises)\n })\n .then(() => {\n isUpdating = false;\n _checkIfInitializationCompleted();\n eventBus.trigger(Events.STREAM_UPDATED, { streamInfo: streamInfo });\n resolve();\n })\n\n })\n }\n\n function isMediaCodecCompatible(newStream, previousStream = null) {\n return compareCodecs(newStream, Constants.VIDEO, previousStream) && compareCodecs(newStream, Constants.AUDIO, previousStream);\n }\n\n function isProtectionCompatible(newStream) {\n if (!newStream) {\n return true;\n }\n return _compareProtectionConfig(Constants.VIDEO, newStream) && _compareProtectionConfig(Constants.AUDIO, newStream);\n }\n\n function _compareProtectionConfig(type, newStream) {\n const currentStreamInfo = getStreamInfo();\n const newStreamInfo = newStream.getStreamInfo();\n\n if (!newStreamInfo || !currentStreamInfo) {\n return true;\n }\n\n const newAdaptation = adapter.getAdaptationForType(newStreamInfo.index, type, newStreamInfo);\n const currentAdaptation = adapter.getAdaptationForType(currentStreamInfo.index, type, currentStreamInfo);\n\n if (!newAdaptation || !currentAdaptation) {\n // If there is no adaptation for neither the old or the new stream they're compatible\n return !newAdaptation && !currentAdaptation;\n }\n\n // If the current period is unencrypted and the upcoming one is encrypted we need to reset sourcebuffers.\n return !(!_isAdaptationDrmProtected(currentAdaptation) && _isAdaptationDrmProtected(newAdaptation));\n }\n\n function _isAdaptationDrmProtected(adaptation) {\n\n if (!adaptation) {\n // If there is no adaptation for neither the old or the new stream they're compatible\n return false;\n }\n\n // If the current period is unencrypted and the upcoming one is encrypted we need to reset sourcebuffers.\n return !!(adaptation.ContentProtection || (adaptation.Representation_asArray && adaptation.Representation_asArray.length > 0 && adaptation.Representation_asArray[0].ContentProtection));\n }\n\n function compareCodecs(newStream, type, previousStream = null) {\n if (!newStream || !newStream.hasOwnProperty('getStreamInfo')) {\n return false;\n }\n const newStreamInfo = newStream.getStreamInfo();\n const currentStreamInfo = previousStream ? previousStream.getStreamInfo() : getStreamInfo();\n\n if (!newStreamInfo || !currentStreamInfo) {\n return false;\n }\n\n const newAdaptation = adapter.getAdaptationForType(newStreamInfo.index, type, newStreamInfo);\n const currentAdaptation = adapter.getAdaptationForType(currentStreamInfo.index, type, currentStreamInfo);\n\n if (!newAdaptation || !currentAdaptation) {\n // If there is no adaptation for neither the old or the new stream they're compatible\n return !newAdaptation && !currentAdaptation;\n }\n\n const sameMimeType = newAdaptation && currentAdaptation && newAdaptation.mimeType === currentAdaptation.mimeType;\n const oldCodecs = currentAdaptation.Representation_asArray.map((representation) => {\n return representation.codecs;\n });\n\n const newCodecs = newAdaptation.Representation_asArray.map((representation) => {\n return representation.codecs;\n });\n\n const codecMatch = newCodecs.some((newCodec) => {\n return oldCodecs.indexOf(newCodec) > -1;\n });\n\n const partialCodecMatch = newCodecs.some((newCodec) => oldCodecs.some((oldCodec) => capabilities.codecRootCompatibleWithCodec(oldCodec, newCodec)));\n return codecMatch || (partialCodecMatch && sameMimeType);\n }\n\n function setPreloaded(value) {\n preloaded = value;\n }\n\n function getPreloaded() {\n return preloaded;\n }\n\n function getHasFinishedBuffering() {\n return hasFinishedBuffering;\n }\n\n function getAdapter() {\n return adapter;\n }\n\n instance = {\n initialize,\n getStreamId,\n activate,\n deactivate,\n getIsActive,\n getDuration,\n getStartTime,\n getId,\n getStreamInfo,\n getHasAudioTrack,\n getHasVideoTrack,\n startPreloading,\n initializeForTextWithMediaSource,\n getThumbnailController,\n getBitrateListFor,\n updateData,\n reset,\n getProcessors,\n setMediaSource,\n isMediaCodecCompatible,\n isProtectionCompatible,\n getPreloaded,\n getIsEndedEventSignaled,\n setIsEndedEventSignaled,\n getAdapter,\n getHasFinishedBuffering,\n setPreloaded,\n startScheduleControllers,\n prepareTrackChange,\n prepareQualityChange\n };\n\n setup();\n return instance;\n}\n\nStream.__dashjs_factory_name = 'Stream';\nexport default FactoryMaker.getClassFactory(Stream);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\n\nimport {HTTPRequest} from '../../streaming/vo/metrics/HTTPRequest';\n\nclass ContentSteeringRequest {\n constructor(url) {\n this.url = url || null;\n this.type = HTTPRequest.CONTENT_STEERING_TYPE;\n this.responseType = 'json';\n }\n}\n\nexport default ContentSteeringRequest;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass ContentSteeringResponse {\n constructor() {\n this.version = null;\n this.ttl = 300;\n this.reloadUri = null;\n this.pathwayPriority = [];\n this.pathwayClones = [];\n }\n}\n\nexport default ContentSteeringResponse;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport FactoryMaker from '../../core/FactoryMaker';\nimport Debug from '../../core/Debug';\nimport URLLoader from '../../streaming/net/URLLoader';\nimport Errors from '../../core/errors/Errors';\nimport ContentSteeringRequest from '../vo/ContentSteeringRequest';\nimport ContentSteeringResponse from '../vo/ContentSteeringResponse';\nimport DashConstants from '../constants/DashConstants';\nimport MediaPlayerEvents from '../../streaming/MediaPlayerEvents';\nimport URLUtils from '../../streaming/utils/URLUtils';\nimport BaseURL from '../vo/BaseURL';\nimport MpdLocation from '../vo/MpdLocation';\nimport Utils from '../../core/Utils.js';\n\nconst QUERY_PARAMETER_KEYS = {\n THROUGHPUT: '_DASH_throughput',\n PATHWAY: '_DASH_pathway',\n URL: 'url'\n};\n\nconst THROUGHPUT_SAMPLES = 4;\n\nfunction ContentSteeringController() {\n const context = this.context;\n const urlUtils = URLUtils(context).getInstance();\n\n let instance,\n logger,\n currentSteeringResponseData,\n serviceLocationList,\n throughputList,\n nextRequestTimer,\n urlLoader,\n errHandler,\n dashMetrics,\n mediaPlayerModel,\n manifestModel,\n requestModifier,\n serviceDescriptionController,\n eventBus,\n adapter;\n\n function setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n _resetInitialSettings();\n }\n\n function setConfig(config) {\n if (!config) return;\n\n if (config.adapter) {\n adapter = config.adapter;\n }\n if (config.errHandler) {\n errHandler = config.errHandler;\n }\n if (config.dashMetrics) {\n dashMetrics = config.dashMetrics;\n }\n if (config.mediaPlayerModel) {\n mediaPlayerModel = config.mediaPlayerModel;\n }\n if (config.requestModifier) {\n requestModifier = config.requestModifier;\n }\n if (config.manifestModel) {\n manifestModel = config.manifestModel;\n }\n if (config.serviceDescriptionController) {\n serviceDescriptionController = config.serviceDescriptionController;\n }\n if (config.eventBus) {\n eventBus = config.eventBus;\n }\n }\n\n /**\n * Initialize the steering controller by instantiating classes and registering observer callback\n */\n function initialize() {\n urlLoader = URLLoader(context).create({\n errHandler,\n dashMetrics,\n mediaPlayerModel,\n requestModifier,\n errors: Errors\n });\n eventBus.on(MediaPlayerEvents.FRAGMENT_LOADING_STARTED, _onFragmentLoadingStarted, instance);\n eventBus.on(MediaPlayerEvents.MANIFEST_LOADING_STARTED, _onManifestLoadingStarted, instance);\n eventBus.on(MediaPlayerEvents.MANIFEST_LOADING_FINISHED, _onManifestLoadingFinished, instance);\n eventBus.on(MediaPlayerEvents.THROUGHPUT_MEASUREMENT_STORED, _onThroughputMeasurementStored, instance);\n\n }\n\n /**\n * When loading of a fragment starts we store its serviceLocation in our list\n * @param {object} e\n * @private\n */\n function _onFragmentLoadingStarted(e) {\n _addToServiceLocationList(e, 'baseUrl');\n }\n\n /**\n * When loading of a manifest starts we store its serviceLocation in our list\n * @param {object} e\n * @private\n */\n function _onManifestLoadingStarted(e) {\n _addToServiceLocationList(e, 'location')\n }\n\n /**\n * Basic throughput calculation for manifest requests\n * @param {object} e\n * @private\n */\n function _onManifestLoadingFinished(e) {\n if (!e || !e.request || !e.request.serviceLocation || !e.request.requestStartDate || !e.request.requestEndDate || isNaN(e.request.bytesTotal)) {\n return;\n }\n\n const serviceLocation = e.request.serviceLocation;\n const elapsedTime = e.request.requestEndDate.getTime() - e.request.requestStartDate.getTime();\n const throughput = parseInt((((e.request.bytesTotal * 8) / elapsedTime) * 1000)) // bit/s\n\n _storeThroughputForServiceLocation(serviceLocation, throughput);\n }\n\n /**\n * When a throughput measurement for fragments was stored in ThroughputHistory we save it as well\n * @param {object} e\n * @private\n */\n function _onThroughputMeasurementStored(e) {\n if (!e || !e.httpRequest || !e.httpRequest._serviceLocation || isNaN(e.throughput)) {\n return;\n }\n const serviceLocation = e.httpRequest._serviceLocation;\n const throughput = e.throughput * 1000;\n\n _storeThroughputForServiceLocation(serviceLocation, throughput);\n }\n\n /**\n * Helper function to store a throughput value from the corresponding serviceLocation\n * @param {string} serviceLocation\n * @param {number} throughput\n * @private\n */\n function _storeThroughputForServiceLocation(serviceLocation, throughput) {\n if (!throughputList[serviceLocation]) {\n throughputList[serviceLocation] = [];\n }\n throughputList[serviceLocation].push(throughput)\n if (throughputList[serviceLocation].length > THROUGHPUT_SAMPLES) {\n throughputList[serviceLocation].shift();\n }\n }\n\n /**\n * Adds a new service location entry to our list\n * @param {object} e\n * @param {string} type\n * @private\n */\n function _addToServiceLocationList(e, type) {\n if (e && e.request && e.request.serviceLocation) {\n const serviceLocation = e.request.serviceLocation;\n if (serviceLocationList[type].all.indexOf(serviceLocation) === -1) {\n serviceLocationList[type].all.push(serviceLocation)\n }\n serviceLocationList[type].current = serviceLocation;\n }\n }\n\n /**\n * Query DashAdapter and Service Description Controller to get the steering information defined in the manifest\n * @returns {object}\n */\n function getSteeringDataFromManifest() {\n const manifest = manifestModel.getValue()\n let contentSteeringData = adapter.getContentSteering(manifest);\n\n if (!contentSteeringData) {\n contentSteeringData = serviceDescriptionController.getServiceDescriptionSettings().contentSteering;\n }\n\n return contentSteeringData;\n }\n\n /**\n * Should query steering server prior to playback start\n * @returns {boolean}\n */\n function shouldQueryBeforeStart() {\n const steeringDataFromManifest = getSteeringDataFromManifest();\n return !!steeringDataFromManifest && steeringDataFromManifest.queryBeforeStart;\n }\n\n /**\n * Load the steering data from the steering server\n * @returns {Promise}\n */\n function loadSteeringData() {\n return new Promise((resolve) => {\n try {\n const steeringDataFromManifest = getSteeringDataFromManifest();\n if (!steeringDataFromManifest || !steeringDataFromManifest.serverUrl) {\n resolve();\n return;\n }\n\n const url = _getSteeringServerUrl(steeringDataFromManifest);\n const request = new ContentSteeringRequest(url);\n urlLoader.load({\n request: request,\n success: (data) => {\n _handleSteeringResponse(data);\n eventBus.trigger(MediaPlayerEvents.CONTENT_STEERING_REQUEST_COMPLETED, {\n currentSteeringResponseData,\n url\n });\n resolve();\n },\n error: (e, error, statusText, response) => {\n _handleSteeringResponseError(e, response);\n resolve(e);\n },\n complete: () => {\n // Clear everything except for the current entry\n serviceLocationList.baseUrl.all = _getClearedServiceLocationListAfterSteeringRequest(serviceLocationList.baseUrl);\n serviceLocationList.location.all = _getClearedServiceLocationListAfterSteeringRequest(serviceLocationList.location);\n }\n });\n } catch (e) {\n resolve(e);\n }\n })\n }\n\n /**\n * Return the cleared data of our serviceLocationList after the steering request was completed\n * @param {object} data\n * @returns {Object[]}\n * @private\n */\n function _getClearedServiceLocationListAfterSteeringRequest(data) {\n if (!data.all || data.all.length === 0 || !data.current) {\n return [];\n }\n return data.all.filter((entry) => {\n return entry === data.current;\n })\n }\n\n /**\n * Returns the adjusted steering server url enhanced by pathway and throughput parameter\n * @param {object} steeringDataFromManifest\n * @returns {string}\n * @private\n */\n function _getSteeringServerUrl(steeringDataFromManifest) {\n let url = steeringDataFromManifest.serverUrl;\n if (currentSteeringResponseData && currentSteeringResponseData.reloadUri) {\n if (urlUtils.isRelative(currentSteeringResponseData.reloadUri)) {\n url = urlUtils.resolve(currentSteeringResponseData.reloadUri, steeringDataFromManifest.serverUrl);\n } else {\n url = currentSteeringResponseData.reloadUri;\n }\n }\n\n const additionalQueryParameter = [];\n\n\n const serviceLocations = serviceLocationList.baseUrl.all.concat(serviceLocationList.location.all);\n if (serviceLocations.length > 0) {\n\n // Derive throughput for each service Location\n const data = serviceLocations.map((serviceLocation) => {\n const throughput = _calculateThroughputForServiceLocation(serviceLocation);\n return {\n serviceLocation,\n throughput\n }\n })\n\n // Sort in descending order to put all elements without throughput (-1) in the end\n data.sort((a, b) => {\n return b.throughput - a.throughput\n })\n\n let pathwayString = '';\n let throughputString = '';\n\n data.forEach((entry, index) => {\n if (index !== 0) {\n pathwayString = `${pathwayString},`;\n if (entry.throughput > -1) {\n throughputString = `${throughputString},`;\n }\n }\n pathwayString = `${pathwayString}${entry.serviceLocation}`;\n if (entry.throughput > -1) {\n throughputString = `${throughputString}${entry.throughput}`;\n }\n })\n\n additionalQueryParameter.push({\n key: QUERY_PARAMETER_KEYS.PATHWAY,\n value: `\"${pathwayString}\"`\n });\n additionalQueryParameter.push({\n key: QUERY_PARAMETER_KEYS.THROUGHPUT,\n value: throughputString\n });\n }\n\n url = Utils.addAditionalQueryParameterToUrl(url, additionalQueryParameter);\n return url;\n }\n\n /**\n * Calculate the arithmetic mean of the last throughput samples\n * @param {string} serviceLocation\n * @returns {number}\n * @private\n */\n function _calculateThroughputForServiceLocation(serviceLocation) {\n if (!serviceLocation || !throughputList[serviceLocation] || throughputList[serviceLocation].length === 0) {\n return -1;\n }\n\n const throughput = throughputList[serviceLocation].reduce((acc, curr) => {\n return acc + curr;\n }) / throughputList[serviceLocation].length;\n\n return parseInt(throughput);\n }\n\n\n /**\n * Parse the steering response and create instance of model ContentSteeringResponse\n * @param {object} data\n * @private\n */\n function _handleSteeringResponse(data) {\n if (!data || !data[DashConstants.CONTENT_STEERING_RESPONSE.VERSION] || parseInt(data[DashConstants.CONTENT_STEERING_RESPONSE.VERSION]) !== 1) {\n return;\n }\n\n // Update the data for other classes to use\n currentSteeringResponseData = new ContentSteeringResponse();\n currentSteeringResponseData.version = data[DashConstants.CONTENT_STEERING_RESPONSE.VERSION];\n\n if (data[DashConstants.CONTENT_STEERING_RESPONSE.TTL] && !isNaN(data[DashConstants.CONTENT_STEERING_RESPONSE.TTL])) {\n currentSteeringResponseData.ttl = data[DashConstants.CONTENT_STEERING_RESPONSE.TTL];\n }\n if (data[DashConstants.CONTENT_STEERING_RESPONSE.RELOAD_URI]) {\n currentSteeringResponseData.reloadUri = data[DashConstants.CONTENT_STEERING_RESPONSE.RELOAD_URI]\n }\n if (data[DashConstants.CONTENT_STEERING_RESPONSE.PATHWAY_PRIORITY]) {\n currentSteeringResponseData.pathwayPriority = data[DashConstants.CONTENT_STEERING_RESPONSE.PATHWAY_PRIORITY]\n }\n if (data[DashConstants.CONTENT_STEERING_RESPONSE.PATHWAY_CLONES]) {\n currentSteeringResponseData.pathwayClones = data[DashConstants.CONTENT_STEERING_RESPONSE.PATHWAY_CLONES]\n currentSteeringResponseData.pathwayClones = currentSteeringResponseData.pathwayClones.filter((pathwayClone) => {\n return _isValidPathwayClone(pathwayClone);\n })\n }\n\n _startSteeringRequestTimer();\n }\n\n /**\n * Checks if object is a valid PathwayClone\n * @param {object} pathwayClone\n * @returns {boolean}\n * @private\n */\n function _isValidPathwayClone(pathwayClone) {\n return pathwayClone[DashConstants.CONTENT_STEERING_RESPONSE.BASE_ID]\n && pathwayClone[DashConstants.CONTENT_STEERING_RESPONSE.ID]\n && pathwayClone[DashConstants.CONTENT_STEERING_RESPONSE.URI_REPLACEMENT]\n && pathwayClone[DashConstants.CONTENT_STEERING_RESPONSE.URI_REPLACEMENT][DashConstants.CONTENT_STEERING_RESPONSE.HOST]\n }\n\n /**\n * Returns synthesized BaseURL elements based on Pathway Cloning\n * @param {BaseURL[]}referenceElements\n * @returns {BaseURL[]}\n */\n function getSynthesizedBaseUrlElements(referenceElements) {\n try {\n const synthesizedElements = _getSynthesizedElements(referenceElements);\n\n return synthesizedElements.map((element) => {\n const synthesizedBaseUrl = new BaseURL(element.synthesizedUrl, element.serviceLocation)\n synthesizedBaseUrl.queryParams = element.queryParams;\n synthesizedBaseUrl.dvbPriority = element.reference.dvbPriority;\n synthesizedBaseUrl.dvbWeight = element.reference.dvbWeight;\n synthesizedBaseUrl.availabilityTimeOffset = element.reference.availabilityTimeOffset;\n synthesizedBaseUrl.availabilityTimeComplete = element.reference.availabilityTimeComplete;\n\n return synthesizedBaseUrl;\n })\n\n } catch (e) {\n logger.error(e);\n return [];\n }\n }\n\n /**\n * Returns synthesized Location elements based on Pathway Cloning\n * @param {MpdLocation[]} referenceElements\n * @returns {MpdLocation[]}\n */\n function getSynthesizedLocationElements(referenceElements) {\n try {\n const synthesizedElements = _getSynthesizedElements(referenceElements);\n\n return synthesizedElements.map((element) => {\n const synthesizedLocation = new MpdLocation(element.synthesizedUrl, element.serviceLocation)\n synthesizedLocation.queryParams = element.queryParams;\n\n return synthesizedLocation;\n })\n\n } catch (e) {\n logger.error(e);\n return [];\n }\n }\n\n /**\n * Helper function to synthesize elements\n * @param {array} referenceElements\n * @returns {array}\n * @private\n */\n function _getSynthesizedElements(referenceElements) {\n try {\n const synthesizedElements = [];\n\n if (!referenceElements || referenceElements.length === 0 || !currentSteeringResponseData || !currentSteeringResponseData.pathwayClones || currentSteeringResponseData.pathwayClones.length === 0) {\n return synthesizedElements;\n }\n\n currentSteeringResponseData.pathwayClones.forEach((pathwayClone) => {\n let baseElements = referenceElements.filter((source) => {\n return pathwayClone[DashConstants.CONTENT_STEERING_RESPONSE.BASE_ID] === source.serviceLocation;\n })\n let reference = null;\n if (baseElements && baseElements.length > 0) {\n reference = baseElements[0];\n }\n if (reference) {\n const referenceUrl = new URL(reference.url);\n let host = pathwayClone[DashConstants.CONTENT_STEERING_RESPONSE.URI_REPLACEMENT][DashConstants.CONTENT_STEERING_RESPONSE.HOST];\n host = Utils.stringHasProtocol(host) ? host : `${referenceUrl.protocol}//${host}`;\n const synthesizedElement =\n {\n synthesizedUrl: `${host}${referenceUrl.pathname}`,\n serviceLocation: pathwayClone[DashConstants.CONTENT_STEERING_RESPONSE.ID],\n queryParams: pathwayClone[DashConstants.CONTENT_STEERING_RESPONSE.URI_REPLACEMENT][DashConstants.CONTENT_STEERING_RESPONSE.PARAMS],\n reference\n };\n\n synthesizedElements.push(synthesizedElement);\n }\n });\n\n return synthesizedElements;\n } catch (e) {\n logger.error(e);\n return [];\n }\n }\n\n /**\n * Start timeout for next steering request\n * @private\n */\n function _startSteeringRequestTimer() {\n // Start timer for next request\n if (currentSteeringResponseData && currentSteeringResponseData.ttl && !isNaN(currentSteeringResponseData.ttl)) {\n if (nextRequestTimer) {\n clearTimeout(nextRequestTimer);\n }\n nextRequestTimer = setTimeout(() => {\n loadSteeringData();\n }, currentSteeringResponseData.ttl * 1000);\n }\n }\n\n /**\n * Stop timeout for next steering request\n */\n function stopSteeringRequestTimer() {\n if (nextRequestTimer) {\n clearTimeout(nextRequestTimer);\n }\n nextRequestTimer = null;\n }\n\n /**\n * Handle errors that occured when querying the steering server\n * @param {object} e\n * @param {object} response\n * @private\n */\n function _handleSteeringResponseError(e, response) {\n try {\n logger.warn(`Error fetching data from content steering server`, e);\n const statusCode = response.status;\n\n switch (statusCode) {\n // 410 response code. Stop steering\n case 410:\n break;\n // 429 Too Many Requests. Replace existing TTL value with Retry-After header if present\n case 429:\n const retryAfter = response && response.getResponseHeader ? response.getResponseHeader('retry-after') : null;\n if (retryAfter !== null) {\n if (!currentSteeringResponseData) {\n currentSteeringResponseData = {};\n }\n currentSteeringResponseData.ttl = parseInt(retryAfter);\n }\n _startSteeringRequestTimer();\n break;\n default:\n _startSteeringRequestTimer();\n break;\n }\n } catch (e) {\n logger.error(e);\n }\n }\n\n /**\n * Returns the currentSteeringResponseData\n * @returns {ContentSteeringResponse}\n */\n function getCurrentSteeringResponseData() {\n return currentSteeringResponseData;\n }\n\n function reset() {\n _resetInitialSettings();\n eventBus.off(MediaPlayerEvents.FRAGMENT_LOADING_STARTED, _onFragmentLoadingStarted, instance);\n eventBus.off(MediaPlayerEvents.MANIFEST_LOADING_STARTED, _onManifestLoadingStarted, instance);\n eventBus.off(MediaPlayerEvents.MANIFEST_LOADING_FINISHED, _onManifestLoadingFinished, instance);\n eventBus.off(MediaPlayerEvents.THROUGHPUT_MEASUREMENT_STORED, _onThroughputMeasurementStored, instance);\n }\n\n function _resetInitialSettings() {\n currentSteeringResponseData = null;\n throughputList = {};\n serviceLocationList = {\n baseUrl: {\n current: null,\n all: []\n },\n location: {\n current: null,\n all: []\n }\n };\n stopSteeringRequestTimer()\n }\n\n\n instance = {\n reset,\n setConfig,\n loadSteeringData,\n getCurrentSteeringResponseData,\n shouldQueryBeforeStart,\n getSteeringDataFromManifest,\n stopSteeringRequestTimer,\n getSynthesizedBaseUrlElements,\n getSynthesizedLocationElements,\n initialize\n };\n\n setup();\n\n return instance;\n}\n\nContentSteeringController.__dashjs_factory_name = 'ContentSteeringController';\nexport default FactoryMaker.getSingletonFactory(ContentSteeringController);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2023, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n\nimport Events from '../../core/events/Events';\nimport BlacklistController from '../controllers/BlacklistController';\nimport FactoryMaker from '../../core/FactoryMaker';\nimport Settings from '../../core/Settings';\nimport ContentSteeringController from '../../dash/controllers/ContentSteeringController';\n\nfunction LocationSelector() {\n\n const context = this.context;\n const settings = Settings(context).getInstance();\n\n let instance,\n blacklistController,\n contentSteeringController;\n\n function setup() {\n blacklistController = BlacklistController(context).create({\n updateEventName: Events.SERVICE_LOCATION_LOCATION_BLACKLIST_CHANGED,\n addBlacklistEventName: Events.SERVICE_LOCATION_LOCATION_BLACKLIST_ADD\n });\n contentSteeringController = ContentSteeringController(context).getInstance();\n }\n\n function setConfig(config) {\n if (config.blacklistController) {\n blacklistController = config.blacklistController;\n }\n if (config.contentSteeringController) {\n contentSteeringController = config.contentSteeringController;\n }\n }\n\n /**\n *\n * @param {MpdLocation[]} mpdLocations\n * @returns {*}\n */\n function select(mpdLocations) {\n if (!mpdLocations || mpdLocations.length === 0) {\n return null;\n }\n\n let mpdLocation = null;\n if (settings.get().streaming.applyContentSteering) {\n mpdLocation = _selectByContentSteering(mpdLocations)\n }\n\n if (!mpdLocation) {\n mpdLocation = _selectByDefault(mpdLocations);\n }\n\n return mpdLocation;\n }\n\n function _selectByContentSteering(mpdLocations) {\n // Search in the response data of the steering server\n const currentSteeringResponseData = contentSteeringController.getCurrentSteeringResponseData();\n if (currentSteeringResponseData && currentSteeringResponseData.pathwayPriority && currentSteeringResponseData.pathwayPriority.length > 0) {\n return _findMpdLocation(currentSteeringResponseData.pathwayPriority, mpdLocations);\n }\n\n return null;\n }\n\n function _findMpdLocation(pathwayPriority = [], mpdLocations = []) {\n let i = 0;\n let target = null;\n while (i < pathwayPriority.length) {\n const curr = pathwayPriority[i];\n const idx = mpdLocations.findIndex((elem) => {\n return elem.serviceLocation && elem.serviceLocation === curr;\n })\n if (idx !== -1 && !blacklistController.contains(mpdLocations[idx].serviceLocation)) {\n target = mpdLocations[idx]\n break;\n }\n i += 1;\n }\n return target;\n }\n\n function _selectByDefault(mpdLocations) {\n return mpdLocations[0];\n }\n\n function reset() {\n blacklistController.reset();\n }\n\n instance = {\n select,\n setConfig,\n reset\n };\n\n setup();\n\n return instance;\n}\n\nLocationSelector.__dashjs_factory_name = 'LocationSelector';\nexport default FactoryMaker.getClassFactory(LocationSelector);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport EventBus from '../core/EventBus';\nimport Events from '../core/events/Events';\nimport MediaPlayerEvents from '../streaming/MediaPlayerEvents';\nimport FactoryMaker from '../core/FactoryMaker';\nimport Debug from '../core/Debug';\nimport Errors from '../core/errors/Errors';\nimport DashConstants from '../dash/constants/DashConstants';\nimport URLUtils from './utils/URLUtils';\nimport LocationSelector from './utils/LocationSelector';\n\nfunction ManifestUpdater() {\n\n const context = this.context;\n const eventBus = EventBus(context).getInstance();\n const urlUtils = URLUtils(context).getInstance();\n\n let instance,\n logger,\n refreshDelay,\n refreshTimer,\n isPaused,\n isStopped,\n isUpdating,\n manifestLoader,\n manifestModel,\n locationSelector,\n adapter,\n errHandler,\n contentSteeringController,\n settings;\n\n function setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n locationSelector = LocationSelector(context).create();\n }\n\n function setConfig(config) {\n if (!config) return;\n\n if (config.manifestModel) {\n manifestModel = config.manifestModel;\n }\n if (config.adapter) {\n adapter = config.adapter;\n }\n if (config.manifestLoader) {\n manifestLoader = config.manifestLoader;\n }\n if (config.errHandler) {\n errHandler = config.errHandler;\n }\n if (config.locationSelector) {\n locationSelector = config.locationSelector;\n }\n if (config.settings) {\n settings = config.settings;\n }\n if (config.contentSteeringController) {\n contentSteeringController = config.contentSteeringController;\n }\n }\n\n function initialize() {\n resetInitialSettings();\n\n eventBus.on(Events.STREAMS_COMPOSED, onStreamsComposed, this);\n eventBus.on(MediaPlayerEvents.PLAYBACK_STARTED, onPlaybackStarted, this);\n eventBus.on(MediaPlayerEvents.PLAYBACK_PAUSED, onPlaybackPaused, this);\n eventBus.on(Events.INTERNAL_MANIFEST_LOADED, onManifestLoaded, this);\n }\n\n function setManifest(manifest) {\n update(manifest);\n }\n\n function resetInitialSettings() {\n refreshDelay = NaN;\n isUpdating = false;\n isPaused = true;\n isStopped = false;\n stopManifestRefreshTimer();\n }\n\n function reset() {\n\n eventBus.off(MediaPlayerEvents.PLAYBACK_STARTED, onPlaybackStarted, this);\n eventBus.off(MediaPlayerEvents.PLAYBACK_PAUSED, onPlaybackPaused, this);\n eventBus.off(Events.STREAMS_COMPOSED, onStreamsComposed, this);\n eventBus.off(Events.INTERNAL_MANIFEST_LOADED, onManifestLoaded, this);\n\n resetInitialSettings();\n }\n\n function stopManifestRefreshTimer() {\n if (refreshTimer !== null) {\n clearTimeout(refreshTimer);\n refreshTimer = null;\n }\n }\n\n function startManifestRefreshTimer(delay) {\n stopManifestRefreshTimer();\n\n if (isStopped) {\n return;\n }\n\n if (isNaN(delay) && !isNaN(refreshDelay)) {\n delay = refreshDelay * 1000;\n }\n\n if (!isNaN(delay)) {\n logger.debug('Refresh manifest in ' + delay + ' milliseconds.');\n refreshTimer = setTimeout(onRefreshTimer, delay);\n }\n }\n\n function refreshManifest(ignorePatch = false) {\n isUpdating = true;\n const manifest = manifestModel.getValue();\n\n // default to the original url in the manifest\n let url = manifest.url;\n\n // Check for PatchLocation and Location alternatives\n let serviceLocation = null;\n const availablePatchLocations = adapter.getPatchLocation(manifest);\n const patchLocation = locationSelector.select(availablePatchLocations);\n let queryParams = null;\n if (patchLocation && !ignorePatch) {\n url = patchLocation.url;\n serviceLocation = patchLocation.serviceLocation;\n queryParams = patchLocation.queryParams;\n } else {\n const availableMpdLocations = _getAvailableMpdLocations(manifest);\n const mpdLocation = locationSelector.select(availableMpdLocations);\n if (mpdLocation) {\n url = mpdLocation.url;\n serviceLocation = mpdLocation.serviceLocation;\n queryParams = mpdLocation.queryParams;\n }\n }\n\n // if one of the alternatives was relative, convert to absolute\n if (urlUtils.isRelative(url)) {\n url = urlUtils.resolve(url, manifest.url);\n }\n\n manifestLoader.load(url, serviceLocation, queryParams);\n }\n\n function _getAvailableMpdLocations(manifest) {\n const manifestLocations = adapter.getLocation(manifest);\n const synthesizedElements = contentSteeringController.getSynthesizedLocationElements(manifestLocations);\n\n return manifestLocations.concat(synthesizedElements);\n }\n\n function update(manifest) {\n if (!manifest) {\n // successful update with no content implies existing manifest remains valid\n manifest = manifestModel.getValue();\n\n // override load time to avoid invalid latency tracking and ensure update cadence\n manifest.loadedTime = new Date();\n } else if (adapter.getIsPatch(manifest)) {\n // with patches the in-memory manifest is our base\n let patch = manifest;\n manifest = manifestModel.getValue();\n\n // check for patch validity\n let isPatchValid = adapter.isPatchValid(manifest, patch);\n let patchSuccessful = isPatchValid;\n\n if (isPatchValid) {\n // grab publish time before update\n let publishTime = adapter.getPublishTime(manifest);\n\n // apply validated patch to manifest\n patchSuccessful = adapter.applyPatchToManifest(manifest, patch);\n\n // get the updated publish time\n let updatedPublishTime = adapter.getPublishTime(manifest);\n\n // ensure the patch properly updated the in-memory publish time\n patchSuccessful = publishTime.getTime() != updatedPublishTime.getTime();\n }\n\n // if the patch failed to apply, force a full manifest refresh\n if (!patchSuccessful) {\n logger.debug('Patch provided is invalid, performing full manifest refresh');\n refreshManifest(true);\n return;\n }\n\n // override load time to avoid invalid latency tracking and ensure update cadence\n manifest.loadedTime = new Date();\n }\n\n // See DASH-IF IOP v4.3 section 4.6.4 \"Transition Phase between Live and On-Demand\"\n // Stop manifest update, ignore static manifest and signal end of dynamic stream to detect end of stream\n if (manifestModel.getValue() && manifestModel.getValue().type === DashConstants.DYNAMIC && manifest.type === DashConstants.STATIC) {\n eventBus.trigger(Events.DYNAMIC_TO_STATIC);\n isUpdating = false;\n isStopped = true;\n return;\n }\n\n manifestModel.setValue(manifest);\n\n const date = new Date();\n const latencyOfLastUpdate = (date.getTime() - manifest.loadedTime.getTime()) / 1000;\n refreshDelay = adapter.getManifestUpdatePeriod(manifest, latencyOfLastUpdate);\n // setTimeout uses a 32 bit number to store the delay. Any number greater than it\n // will cause event associated with setTimeout to trigger immediately\n if (refreshDelay * 1000 > 0x7FFFFFFF) {\n refreshDelay = 0x7FFFFFFF / 1000;\n }\n eventBus.trigger(Events.MANIFEST_UPDATED, { manifest: manifest });\n logger.info('Manifest has been refreshed at ' + date + '[' + date.getTime() / 1000 + '] ');\n\n if (!isPaused) {\n startManifestRefreshTimer();\n }\n }\n\n function onRefreshTimer() {\n if (isPaused) {\n return;\n }\n if (isUpdating) {\n startManifestRefreshTimer(settings.get().streaming.manifestUpdateRetryInterval);\n return;\n }\n refreshManifest();\n }\n\n function onManifestLoaded(e) {\n if (!e.error) {\n update(e.manifest);\n } else if (e.error.code === Errors.MANIFEST_LOADER_PARSING_FAILURE_ERROR_CODE) {\n errHandler.error(e.error);\n }\n }\n\n function onPlaybackStarted(/*e*/) {\n isPaused = false;\n startManifestRefreshTimer();\n }\n\n function onPlaybackPaused(/*e*/) {\n isPaused = !settings.get().streaming.scheduling.scheduleWhilePaused;\n\n if (isPaused) {\n stopManifestRefreshTimer();\n }\n }\n\n function onStreamsComposed(/*e*/) {\n // When streams are ready we can consider manifest update completed. Resolve the update promise.\n isUpdating = false;\n }\n\n function getIsUpdating() {\n return isUpdating;\n }\n\n instance = {\n initialize: initialize,\n setManifest: setManifest,\n refreshManifest: refreshManifest,\n getIsUpdating: getIsUpdating,\n setConfig: setConfig,\n reset: reset\n };\n\n setup();\n return instance;\n}\n\nManifestUpdater.__dashjs_factory_name = 'ManifestUpdater';\nexport default FactoryMaker.getClassFactory(ManifestUpdater);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport DashJSError from './../vo/DashJSError';\nimport {HTTPRequest} from '../vo/metrics/HTTPRequest';\nimport EventBus from './../../core/EventBus';\nimport Events from './../../core/events/Events';\nimport Errors from './../../core/errors/Errors';\nimport FactoryMaker from '../../core/FactoryMaker';\nimport Debug from '../../core/Debug';\nimport URLUtils from '../utils/URLUtils';\n\nconst HTTP_TIMEOUT_MS = 5000;\nconst DEFAULT_MAXIMUM_ALLOWED_DRIFT = 100;\nconst DEFAULT_TIME_BETWEEN_SYNC_ATTEMPTS_ADJUSTMENT_FACTOR = 2;\nconst DEFAULT_BACKGROUND_ATTEMPTS = 2;\nconst DEFAULT_TIME_BETWEEN_SYNC_ATTEMPTS = 30;\nconst DEFAULT_MINIMUM_TIME_BETWEEN_BACKGROUND_SYNC_ATTEMPTS = 30;\nconst DEFAULT_MAXIMUM_TIME_BETWEEN_SYNC = 600;\nconst DEFAULT_MINIMUM_TIME_BETWEEN_SYNC = 2;\n\nfunction TimeSyncController() {\n\n const context = this.context;\n const eventBus = EventBus(context).getInstance();\n const urlUtils = URLUtils(context).getInstance();\n\n let instance,\n logger,\n isSynchronizing,\n isBackgroundSynchronizing,\n settings,\n handlers,\n dashMetrics,\n backgroundSyncTimeOffsets,\n timingSources,\n timeOfLastSync,\n timeOfLastBackgroundSync,\n lastOffset,\n lastTimingSource,\n internalTimeBetweenSyncAttempts,\n errHandler,\n baseURLController;\n\n function setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n\n eventBus.on(Events.ATTEMPT_BACKGROUND_SYNC, _onAttemptBackgroundSync, instance);\n }\n\n function setConfig(config) {\n if (!config) return;\n\n if (config.dashMetrics) {\n dashMetrics = config.dashMetrics;\n }\n\n if (config.baseURLController) {\n baseURLController = config.baseURLController;\n }\n\n if (config.errHandler) {\n errHandler = config.errHandler;\n }\n\n if (config.settings) {\n settings = config.settings;\n }\n }\n\n function _resetInitialSettings() {\n backgroundSyncTimeOffsets = [];\n timingSources = [];\n timeOfLastSync = null;\n timeOfLastBackgroundSync = null;\n lastTimingSource = null;\n lastOffset = NaN;\n isSynchronizing = false;\n isBackgroundSynchronizing = false;\n internalTimeBetweenSyncAttempts = settings.get().streaming.utcSynchronization.timeBetweenSyncAttempts;\n }\n\n /**\n * Register the timing handler depending on the schemeIdUris. This method is called once when the StreamController is initialized\n */\n function initialize() {\n _resetInitialSettings();\n\n // a list of known schemeIdUris and a method to call with @value\n handlers = {\n 'urn:mpeg:dash:utc:http-head:2014': _httpHeadHandler,\n 'urn:mpeg:dash:utc:http-xsdate:2014': _httpHandler.bind(null, _xsdatetimeDecoder),\n 'urn:mpeg:dash:utc:http-iso:2014': _httpHandler.bind(null, _iso8601Decoder),\n 'urn:mpeg:dash:utc:direct:2014': _directHandler,\n\n // some specs referencing early ISO23009-1 drafts incorrectly use\n // 2012 in the URI, rather than 2014. support these for now.\n 'urn:mpeg:dash:utc:http-head:2012': _httpHeadHandler,\n 'urn:mpeg:dash:utc:http-xsdate:2012': _httpHandler.bind(null, _xsdatetimeDecoder),\n 'urn:mpeg:dash:utc:http-iso:2012': _httpHandler.bind(null, _iso8601Decoder),\n 'urn:mpeg:dash:utc:direct:2012': _directHandler,\n\n // it isn't clear how the data returned would be formatted, and\n // no public examples available so http-ntp not supported for now.\n // presumably you would do an arraybuffer type xhr and decode the\n // binary data returned but I would want to see a sample first.\n 'urn:mpeg:dash:utc:http-ntp:2014': _notSupportedHandler,\n\n // not clear how this would be supported in javascript (in browser)\n 'urn:mpeg:dash:utc:ntp:2014': _notSupportedHandler,\n 'urn:mpeg:dash:utc:sntp:2014': _notSupportedHandler\n };\n\n }\n\n /**\n * Sync against a timing source. T\n * @param {array} tSources\n * @param {boolean} isDynamic\n */\n function attemptSync(tSources, isDynamic) {\n\n timingSources = tSources;\n\n // Stop if we are already synchronizing\n if (isSynchronizing) {\n return;\n }\n\n // No synchronization required we can signal the completion immediately\n if (!_shouldPerformSynchronization(isDynamic)) {\n eventBus.trigger(Events.TIME_SYNCHRONIZATION_COMPLETED);\n return;\n }\n\n isSynchronizing = true;\n _attemptRecursiveSync();\n }\n\n /**\n * Does a synchronization in the background in case the last offset should be verified or a 404 occurs\n */\n function _onAttemptBackgroundSync() {\n if (!settings.get().streaming.utcSynchronization.enabled || isSynchronizing || isBackgroundSynchronizing || !lastTimingSource || !lastTimingSource.value || !lastTimingSource.schemeIdUri || isNaN(lastOffset) || isNaN(settings.get().streaming.utcSynchronization.backgroundAttempts)) {\n return;\n }\n\n if (timeOfLastBackgroundSync && ((Date.now() - timeOfLastBackgroundSync) / 1000) < DEFAULT_MINIMUM_TIME_BETWEEN_BACKGROUND_SYNC_ATTEMPTS) {\n return;\n }\n\n backgroundSyncTimeOffsets = [];\n isBackgroundSynchronizing = true;\n const backgroundAttempts = !isNaN(settings.get().streaming.utcSynchronization.backgroundAttempts) ? settings.get().streaming.utcSynchronization.backgroundAttempts : DEFAULT_BACKGROUND_ATTEMPTS;\n _attemptBackgroundSync(backgroundAttempts);\n }\n\n /**\n * Perform a defined number of background attempts\n * @param {number} attempts\n * @private\n */\n function _attemptBackgroundSync(attempts) {\n try {\n if (attempts <= 0) {\n _completeBackgroundTimeSyncSequence();\n return;\n }\n\n const deviceTimeBeforeSync = Date.now();\n handlers[lastTimingSource.schemeIdUri](\n lastTimingSource.value,\n function (serverTime) {\n // the timing source returned something useful\n const deviceTimeAfterSync = Date.now();\n const offset = _calculateOffset(deviceTimeBeforeSync, deviceTimeAfterSync, serverTime);\n\n backgroundSyncTimeOffsets.push(offset);\n _attemptBackgroundSync(attempts - 1);\n },\n function () {\n _completeBackgroundTimeSyncSequence();\n }\n );\n } catch (e) {\n _completeBackgroundTimeSyncSequence();\n }\n }\n\n /**\n * Sync against a timing source. This method is called recursively if the time sync for the first entry in timingSources fails.\n * @param {number} sourceIndex\n */\n function _attemptRecursiveSync(sourceIndex = null) {\n // if called with no sourceIndex, use zero (highest priority)\n let index = sourceIndex || 0;\n\n // the sources should be ordered in priority from the manifest.\n // try each in turn, from the top, until either something\n // sensible happens, or we run out of sources to try.\n if (!timingSources || timingSources.length === 0 || index >= timingSources.length) {\n _onComplete();\n return;\n }\n let source = timingSources[index];\n\n if (source) {\n // check if there is a handler for this @schemeIdUri\n if (handlers.hasOwnProperty(source.schemeIdUri)) {\n // if so, call it with its @value\n const deviceTimeBeforeSync = new Date().getTime();\n handlers[source.schemeIdUri](\n source.value,\n function (serverTime) {\n // the timing source returned something useful\n const deviceTimeAfterSync = new Date().getTime();\n const offset = _calculateOffset(deviceTimeBeforeSync, deviceTimeAfterSync, serverTime);\n lastTimingSource = source;\n\n _onComplete(offset);\n },\n function () {\n // the timing source was probably uncontactable\n // or returned something we can't use - try again\n // with the remaining sources\n _attemptRecursiveSync(index + 1);\n }\n );\n } else {\n // an unknown schemeIdUri must have been found\n // try again with the remaining sources\n _attemptRecursiveSync(index + 1);\n }\n } else {\n // no valid time source could be found, just use device time\n _onComplete();\n }\n\n }\n\n /**\n * Calculate the offset between client and server. Account for the roundtrip time\n * @param {number} deviceTimeBeforeSync\n * @param {number} deviceTimeAfterSync\n * @param {number} serverTime\n * @return {number}\n * @private\n */\n function _calculateOffset(deviceTimeBeforeSync, deviceTimeAfterSync, serverTime) {\n const deviceReferenceTime = deviceTimeAfterSync - ((deviceTimeAfterSync - deviceTimeBeforeSync) / 2);\n\n return serverTime - deviceReferenceTime;\n }\n\n /**\n * Checks if a synchronization is required\n * @param {boolean} isDynamic\n * @return {boolean}\n * @private\n */\n function _shouldPerformSynchronization(isDynamic) {\n try {\n if (!isDynamic || !settings.get().streaming.utcSynchronization.enabled) {\n return false;\n }\n const timeBetweenSyncAttempts = !isNaN(internalTimeBetweenSyncAttempts) ? internalTimeBetweenSyncAttempts : DEFAULT_TIME_BETWEEN_SYNC_ATTEMPTS;\n\n if (!timeOfLastSync || !timeBetweenSyncAttempts || isNaN(timeBetweenSyncAttempts)) {\n return true;\n }\n\n return ((Date.now() - timeOfLastSync) / 1000) >= timeBetweenSyncAttempts;\n } catch (e) {\n return true;\n }\n }\n\n /**\n * Callback after sync has been completed\n * @param {number} offset\n * @private\n */\n function _onComplete(offset = NaN) {\n let failed = isNaN(offset);\n if (failed && settings.get().streaming.utcSynchronization.useManifestDateHeaderTimeSource) {\n //Before falling back to binary search , check if date header exists on MPD. if so, use for a time source.\n _checkForDateHeader();\n } else {\n _completeTimeSyncSequence(failed, offset);\n }\n }\n\n /**\n * Takes xsdatetime and returns milliseconds since UNIX epoch. May not be necessary as xsdatetime is very similar to ISO 8601 which is natively understood by javascript Date parser\n * @param {string} xsdatetimeStr\n * @return {number}\n * @private\n */\n function _alternateXsdatetimeDecoder(xsdatetimeStr) {\n // taken from DashParser - should probably refactor both uses\n const SECONDS_IN_MIN = 60;\n const MINUTES_IN_HOUR = 60;\n const MILLISECONDS_IN_SECONDS = 1000;\n let datetimeRegex = /^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2})(?::([0-9]*)(\\.[0-9]*)?)?(?:([+\\-])([0-9]{2})([0-9]{2}))?/;\n\n let utcDate,\n timezoneOffset;\n\n let match = datetimeRegex.exec(xsdatetimeStr);\n\n // If the string does not contain a timezone offset different browsers can interpret it either\n // as UTC or as a local time so we have to parse the string manually to normalize the given date value for\n // all browsers\n utcDate = Date.UTC(\n parseInt(match[1], 10),\n parseInt(match[2], 10) - 1, // months start from zero\n parseInt(match[3], 10),\n parseInt(match[4], 10),\n parseInt(match[5], 10),\n (match[6] && (parseInt(match[6], 10) || 0)),\n (match[7] && parseFloat(match[7]) * MILLISECONDS_IN_SECONDS) || 0\n );\n // If the date has timezone offset take it into account as well\n if (match[9] && match[10]) {\n timezoneOffset = parseInt(match[9], 10) * MINUTES_IN_HOUR + parseInt(match[10], 10);\n utcDate += (match[8] === '+' ? -1 : +1) * timezoneOffset * SECONDS_IN_MIN * MILLISECONDS_IN_SECONDS;\n }\n\n return new Date(utcDate).getTime();\n }\n\n\n /**\n * Try to use the built in parser, since xsdate is a constrained ISO8601 which is supported natively by Date.parse. if that fails, try a regex-based version used elsewhere in this application.\n * @param {string} xsdatetimeStr\n * @return {number}\n */\n function _xsdatetimeDecoder(xsdatetimeStr) {\n let parsedDate = Date.parse(xsdatetimeStr);\n\n if (isNaN(parsedDate)) {\n parsedDate = _alternateXsdatetimeDecoder(xsdatetimeStr);\n }\n\n return parsedDate;\n }\n\n /**\n * Takes ISO 8601 timestamp and returns milliseconds since UNIX epoch\n * @param {string} isoStr\n * @return {number}\n */\n function _iso8601Decoder(isoStr) {\n return Date.parse(isoStr);\n }\n\n /**\n * Takes RFC 1123 timestamp (which is same as ISO8601) and returns milliseconds since UNIX epoch\n * @param {string} dateStr\n * @return {number}\n */\n function _rfc1123Decoder(dateStr) {\n return Date.parse(dateStr);\n }\n\n /**\n * Handler for unsupported scheme ids.\n * @param {string} url\n * @param {function} onSuccessCB\n * @param {function} onFailureCB\n * @private\n */\n function _notSupportedHandler(url, onSuccessCB, onFailureCB) {\n onFailureCB();\n }\n\n /**\n * Direct handler\n * @param {string} xsdatetimeStr\n * @param {function} onSuccessCB\n * @param {function} onFailureCB\n */\n function _directHandler(xsdatetimeStr, onSuccessCB, onFailureCB) {\n let time = _xsdatetimeDecoder(xsdatetimeStr);\n\n if (!isNaN(time)) {\n onSuccessCB(time);\n return;\n }\n\n onFailureCB();\n }\n\n /**\n * Generic http handler\n * @param {function} decoder\n * @param {string} url\n * @param {function} onSuccessCB\n * @param {function} onFailureCB\n * @param {boolean} isHeadRequest\n * @private\n */\n function _httpHandler(decoder, url, onSuccessCB, onFailureCB, isHeadRequest) {\n let oncomplete,\n onload;\n let complete = false;\n let req = new XMLHttpRequest();\n\n let verb = isHeadRequest ? HTTPRequest.HEAD : HTTPRequest.GET;\n let urls = url.match(/\\S+/g);\n\n // according to ISO 23009-1, url could be a white-space\n // separated list of URLs. just handle one at a time.\n url = urls.shift();\n\n oncomplete = function () {\n if (complete) {\n return;\n }\n\n // we only want to pass through here once per xhr,\n // regardless of whether the load was successful.\n complete = true;\n\n // if there are more urls to try, call self.\n if (urls.length) {\n _httpHandler(decoder, urls.join(' '), onSuccessCB, onFailureCB, isHeadRequest);\n } else {\n onFailureCB();\n }\n };\n\n onload = function () {\n let time,\n result;\n\n if (req.status === 200) {\n time = isHeadRequest ?\n req.getResponseHeader('Date') :\n req.response;\n\n result = decoder(time);\n\n // decoder returns NaN if non-standard input\n if (!isNaN(result)) {\n onSuccessCB(result);\n complete = true;\n }\n }\n };\n\n if (urlUtils.isRelative(url)) {\n // passing no path to resolve will return just MPD BaseURL/baseUri\n const baseUrl = baseURLController.resolve();\n if (baseUrl) {\n url = urlUtils.resolve(url, baseUrl.url);\n }\n }\n\n req.open(verb, url);\n req.timeout = HTTP_TIMEOUT_MS || 0;\n req.onload = onload;\n req.onloadend = oncomplete;\n req.send();\n }\n\n /**\n * Handler for http-head schemeIdUri\n * @param {string} url\n * @param {function} onSuccessCB\n * @param {function} onFailureCB\n * @private\n */\n function _httpHeadHandler(url, onSuccessCB, onFailureCB) {\n _httpHandler(_rfc1123Decoder, url, onSuccessCB, onFailureCB, true);\n }\n\n /**\n * Checks if a date header is present in the MPD response and calculates the offset based on the header\n * @private\n */\n function _checkForDateHeader() {\n let dateHeaderValue = dashMetrics.getLatestMPDRequestHeaderValueByID('Date');\n let dateHeaderTime = dateHeaderValue !== null ? new Date(dateHeaderValue).getTime() : Number.NaN;\n\n if (!isNaN(dateHeaderTime)) {\n const offsetToDeviceTimeMs = dateHeaderTime - Date.now();\n _completeTimeSyncSequence(false, offsetToDeviceTimeMs);\n } else {\n _completeTimeSyncSequence(true);\n }\n }\n\n /**\n * Triggers the event to signal that the time synchronization was completed\n * @param {boolean} failed\n * @param {number} offset\n * @private\n */\n function _completeTimeSyncSequence(failed, offset) {\n\n // Adjust the time of the next sync based on the drift between current offset and last offset\n if (!isNaN(lastOffset) && !isNaN(offset) && !failed) {\n _adjustTimeBetweenSyncAttempts(offset);\n }\n\n // Update the internal data\n if (!failed && !isNaN(offset)) {\n timeOfLastSync = Date.now();\n isSynchronizing = false;\n\n // if this is the first sync we are doing perform background syncs as well to confirm current offset\n const shouldAttemptBackgroundSync = isNaN(lastOffset);\n lastOffset = offset;\n if (shouldAttemptBackgroundSync) {\n _onAttemptBackgroundSync();\n }\n logger.debug(`Completed UTC sync. Setting client - server offset to ${offset}`);\n }\n\n if (failed) {\n lastTimingSource = null;\n isSynchronizing = false;\n errHandler.error(new DashJSError(Errors.TIME_SYNC_FAILED_ERROR_CODE, Errors.TIME_SYNC_FAILED_ERROR_MESSAGE));\n }\n\n // Notify other classes\n eventBus.trigger(Events.UPDATE_TIME_SYNC_OFFSET, {\n offset: offset,\n });\n eventBus.trigger(Events.TIME_SYNCHRONIZATION_COMPLETED);\n }\n\n function _adjustTimeBetweenSyncAttempts(offset) {\n try {\n const isOffsetDriftWithinThreshold = _isOffsetDriftWithinThreshold(offset);\n const timeBetweenSyncAttempts = !isNaN(internalTimeBetweenSyncAttempts) ? internalTimeBetweenSyncAttempts : DEFAULT_TIME_BETWEEN_SYNC_ATTEMPTS;\n const timeBetweenSyncAttemptsAdjustmentFactor = !isNaN(settings.get().streaming.utcSynchronization.timeBetweenSyncAttemptsAdjustmentFactor) ? settings.get().streaming.utcSynchronization.timeBetweenSyncAttemptsAdjustmentFactor : DEFAULT_TIME_BETWEEN_SYNC_ATTEMPTS_ADJUSTMENT_FACTOR;\n const maximumTimeBetweenSyncAttempts = !isNaN(settings.get().streaming.utcSynchronization.maximumTimeBetweenSyncAttempts) ? settings.get().streaming.utcSynchronization.maximumTimeBetweenSyncAttempts : DEFAULT_MAXIMUM_TIME_BETWEEN_SYNC;\n const minimumTimeBetweenSyncAttempts = !isNaN(settings.get().streaming.utcSynchronization.minimumTimeBetweenSyncAttempts) ? settings.get().streaming.utcSynchronization.minimumTimeBetweenSyncAttempts : DEFAULT_MINIMUM_TIME_BETWEEN_SYNC;\n let adjustedTimeBetweenSyncAttempts;\n\n if (isOffsetDriftWithinThreshold) {\n // The drift between the current offset and the last offset is within the allowed threshold. Increase sync time\n adjustedTimeBetweenSyncAttempts = Math.min(timeBetweenSyncAttempts * timeBetweenSyncAttemptsAdjustmentFactor, maximumTimeBetweenSyncAttempts);\n logger.debug(`Increasing timeBetweenSyncAttempts to ${adjustedTimeBetweenSyncAttempts}`);\n } else {\n // Drift between the current offset and the last offset is not within the allowed threshold. Decrease sync time\n adjustedTimeBetweenSyncAttempts = Math.max(timeBetweenSyncAttempts / timeBetweenSyncAttemptsAdjustmentFactor, minimumTimeBetweenSyncAttempts);\n logger.debug(`Decreasing timeBetweenSyncAttempts to ${adjustedTimeBetweenSyncAttempts}`);\n }\n\n internalTimeBetweenSyncAttempts = adjustedTimeBetweenSyncAttempts;\n } catch (e) {\n\n }\n }\n\n /**\n * Callback after all background syncs have been completed.\n * @private\n */\n function _completeBackgroundTimeSyncSequence() {\n if (!backgroundSyncTimeOffsets || backgroundSyncTimeOffsets.length === 0) {\n return;\n }\n\n const averageOffset = backgroundSyncTimeOffsets.reduce((acc, curr) => {\n return acc + curr;\n }, 0) / backgroundSyncTimeOffsets.length;\n\n if (!_isOffsetDriftWithinThreshold(averageOffset)) {\n logger.debug(`Completed background UTC sync. Setting client - server offset to ${averageOffset}`);\n lastOffset = averageOffset;\n eventBus.trigger(Events.UPDATE_TIME_SYNC_OFFSET, {\n offset: lastOffset\n });\n } else {\n logger.debug(`Completed background UTC sync. Offset is within allowed threshold and is not adjusted.`);\n }\n\n isBackgroundSynchronizing = false;\n timeOfLastBackgroundSync = Date.now();\n }\n\n function _isOffsetDriftWithinThreshold(offset) {\n try {\n if (isNaN(lastOffset)) {\n return true;\n }\n\n const maxAllowedDrift = settings.get().streaming.utcSynchronization.maximumAllowedDrift && !isNaN(settings.get().streaming.utcSynchronization.maximumAllowedDrift) ? settings.get().streaming.utcSynchronization.maximumAllowedDrift : DEFAULT_MAXIMUM_ALLOWED_DRIFT;\n const lowerBound = lastOffset - maxAllowedDrift;\n const upperBound = lastOffset + maxAllowedDrift;\n\n return offset >= lowerBound && offset <= upperBound;\n } catch (e) {\n return true;\n }\n }\n\n function reset() {\n _resetInitialSettings();\n\n eventBus.off(Events.ATTEMPT_BACKGROUND_SYNC, _onAttemptBackgroundSync, instance);\n }\n\n instance = {\n initialize,\n attemptSync,\n setConfig,\n reset\n };\n\n setup();\n\n return instance;\n}\n\nTimeSyncController.__dashjs_factory_name = 'TimeSyncController';\nconst factory = FactoryMaker.getSingletonFactory(TimeSyncController);\nfactory.HTTP_TIMEOUT_MS = HTTP_TIMEOUT_MS;\nFactoryMaker.updateSingletonFactory(TimeSyncController.__dashjs_factory_name, factory);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport FactoryMaker from '../../core/FactoryMaker';\nimport Debug from '../../core/Debug';\nimport EventBus from '../../core/EventBus';\nimport MediaPlayerEvents from '../MediaPlayerEvents';\n\nfunction MediaSourceController() {\n\n let instance,\n mediaSource,\n settings,\n mediaSourceType,\n logger;\n\n const context = this.context;\n const eventBus = EventBus(context).getInstance();\n\n function setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n }\n\n function createMediaSource() {\n\n let hasWebKit = ('WebKitMediaSource' in window);\n let hasMediaSource = ('MediaSource' in window);\n let hasManagedMediaSource = ('ManagedMediaSource' in window);\n\n if (hasManagedMediaSource) {\n // eslint-disable-next-line no-undef\n mediaSource = new ManagedMediaSource();\n mediaSourceType = 'managedMediaSource';\n logger.info(`Created ManagedMediaSource`)\n } else if (hasMediaSource) {\n mediaSource = new MediaSource();\n mediaSourceType = 'mediaSource';\n logger.info(`Created MediaSource`)\n } else if (hasWebKit) {\n mediaSource = new WebKitMediaSource();\n logger.info(`Created WebkitMediaSource`)\n }\n\n return mediaSource;\n }\n\n function attachMediaSource(videoModel) {\n\n let objectURL = window.URL.createObjectURL(mediaSource);\n\n videoModel.setSource(objectURL);\n\n if (mediaSourceType === 'managedMediaSource') {\n videoModel.setDisableRemotePlayback(true);\n mediaSource.addEventListener('startstreaming', () => {\n eventBus.trigger(MediaPlayerEvents.MANAGED_MEDIA_SOURCE_START_STREAMING)\n })\n mediaSource.addEventListener('endstreaming', () => {\n eventBus.trigger(MediaPlayerEvents.MANAGED_MEDIA_SOURCE_END_STREAMING)\n })\n }\n\n return objectURL;\n }\n\n function detachMediaSource(videoModel) {\n videoModel.setSource(null);\n }\n\n function setDuration(value) {\n if (!mediaSource || mediaSource.readyState !== 'open') return;\n if (value === null && isNaN(value)) return;\n if (mediaSource.duration === value) return;\n\n if (value === Infinity && !settings.get().streaming.buffer.mediaSourceDurationInfinity) {\n value = Math.pow(2, 32);\n }\n\n if (!isBufferUpdating(mediaSource)) {\n logger.info('Set MediaSource duration:' + value);\n mediaSource.duration = value;\n } else {\n setTimeout(setDuration.bind(null, value), 50);\n }\n }\n\n function setSeekable(start, end) {\n if (mediaSource && typeof mediaSource.setLiveSeekableRange === 'function' && typeof mediaSource.clearLiveSeekableRange === 'function' &&\n mediaSource.readyState === 'open' && start >= 0 && start < end) {\n mediaSource.clearLiveSeekableRange();\n mediaSource.setLiveSeekableRange(start, end);\n }\n }\n\n function signalEndOfStream(source) {\n if (!source || source.readyState !== 'open') {\n return;\n }\n\n let buffers = source.sourceBuffers;\n\n for (let i = 0; i < buffers.length; i++) {\n if (buffers[i].updating) {\n return;\n }\n if (buffers[i].buffered.length === 0) {\n return;\n }\n }\n logger.info('call to mediaSource endOfStream');\n source.endOfStream();\n }\n\n function isBufferUpdating(source) {\n let buffers = source.sourceBuffers;\n for (let i = 0; i < buffers.length; i++) {\n if (buffers[i].updating) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Set the config of the MediaSourceController\n * @param {object} config\n */\n function setConfig(config) {\n if (!config) {\n return;\n }\n if (config.settings) {\n settings = config.settings;\n }\n }\n\n instance = {\n attachMediaSource,\n createMediaSource,\n detachMediaSource,\n setConfig,\n setDuration,\n setSeekable,\n signalEndOfStream,\n };\n\n setup();\n\n return instance;\n}\n\nMediaSourceController.__dashjs_factory_name = 'MediaSourceController';\nexport default FactoryMaker.getSingletonFactory(MediaSourceController);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport FactoryMaker from '../../core/FactoryMaker';\nimport Debug from '../../core/Debug';\nimport EventBus from '../../core/EventBus';\nimport MediaPlayerEvents from '../../streaming/MediaPlayerEvents';\nimport XHRLoader from '../net/XHRLoader';\n\nfunction EventController() {\n\n const MPD_RELOAD_SCHEME = 'urn:mpeg:dash:event:2012';\n const MPD_RELOAD_VALUE = 1;\n\n const MPD_CALLBACK_SCHEME = 'urn:mpeg:dash:event:callback:2015';\n const MPD_CALLBACK_VALUE = 1;\n\n const REMAINING_EVENTS_THRESHOLD = 300;\n\n const EVENT_HANDLED_STATES = {\n DISCARDED: 'discarded',\n UPDATED: 'updated',\n ADDED: 'added'\n };\n\n const context = this.context;\n const eventBus = EventBus(context).getInstance();\n\n let instance,\n logger,\n inlineEvents, // Holds all Inline Events not triggered yet\n inbandEvents, // Holds all Inband Events not triggered yet\n eventInterval, // variable holding the setInterval\n lastEventTimerCall,\n manifestUpdater,\n playbackController,\n settings,\n eventHandlingInProgress,\n isStarted;\n\n /**\n * Internal setup when class is instanced\n */\n function _setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n _resetInitialSettings();\n }\n\n /**\n * Checks if the provded configuration is valid\n */\n function checkConfig() {\n if (!manifestUpdater || !playbackController) {\n throw new Error('setConfig function has to be called previously');\n }\n }\n\n /**\n * Reset to initial settings\n */\n function _resetInitialSettings() {\n isStarted = false;\n inlineEvents = {}; // Format inlineEvents[periodID][schemeIdUri]\n inbandEvents = {}; // Format inbandEvents[periodID][schemeIdUri]\n eventInterval = null;\n eventHandlingInProgress = false;\n lastEventTimerCall = Date.now() / 1000;\n }\n\n /**\n * Stops the EventController by clearing the event interval\n */\n function _stop() {\n try {\n if (eventInterval !== null && isStarted) {\n clearInterval(eventInterval);\n eventInterval = null;\n isStarted = false;\n _onStopEventController();\n }\n } catch (e) {\n throw e;\n }\n }\n\n /**\n * Starts the interval function of the EventController\n */\n function start() {\n try {\n checkConfig();\n logger.debug('Start Event Controller');\n const refreshDelay = settings.get().streaming.eventControllerRefreshDelay;\n if (!isStarted && !isNaN(refreshDelay)) {\n isStarted = true;\n eventInterval = setInterval(_onEventTimer, refreshDelay);\n }\n } catch (e) {\n throw e;\n }\n }\n\n /**\n * Iterate through the eventList and trigger the events\n */\n function _onEventTimer() {\n try {\n if (!eventHandlingInProgress) {\n eventHandlingInProgress = true;\n const currentVideoTime = playbackController.getTime();\n let presentationTimeThreshold = (currentVideoTime - lastEventTimerCall);\n\n // For dynamic streams lastEventTimeCall will be large in the first iteration. Avoid firing all events at once.\n presentationTimeThreshold = lastEventTimerCall > 0 ? Math.max(0, presentationTimeThreshold) : 0;\n\n _triggerEvents(inbandEvents, presentationTimeThreshold, currentVideoTime);\n _triggerEvents(inlineEvents, presentationTimeThreshold, currentVideoTime);\n _removeOutdatedEventObjects(inbandEvents);\n _removeOutdatedEventObjects(inlineEvents);\n\n lastEventTimerCall = currentVideoTime;\n eventHandlingInProgress = false;\n }\n } catch (e) {\n eventHandlingInProgress = false;\n logger.error(e);\n }\n }\n\n /**\n * Iterate over a list of events and trigger the ones for which the presentation time is within the current timing interval\n * @param {object} events\n * @param {number} presentationTimeThreshold\n * @param {number} currentVideoTime\n * @private\n */\n function _triggerEvents(events, presentationTimeThreshold, currentVideoTime) {\n try {\n const callback = function (event) {\n if (event !== undefined) {\n const duration = !isNaN(event.duration) ? event.duration : 0;\n // The event is either about to start or has already been started and we are within its duration\n if ((event.calculatedPresentationTime <= currentVideoTime && event.calculatedPresentationTime + presentationTimeThreshold + duration >= currentVideoTime)) {\n _startEvent(event, MediaPlayerEvents.EVENT_MODE_ON_START);\n } else if (_eventHasExpired(currentVideoTime, duration + presentationTimeThreshold, event.calculatedPresentationTime) || _eventIsInvalid(event)) {\n logger.debug(`Removing event ${event.id} from period ${event.eventStream.period.id} as it is expired or invalid`);\n _removeEvent(events, event);\n }\n }\n };\n\n _iterateAndTriggerCallback(events, callback);\n } catch (e) {\n logger.error(e);\n }\n }\n\n /**\n * Iterates over the entries of the events object and deletes the entries for which no events are present\n * @param {object} events\n * @private\n */\n function _removeOutdatedEventObjects(events) {\n try {\n for (const key in events) {\n if (events.hasOwnProperty(key)) {\n if (Object.keys(events[key]).length === 0)\n delete events[key];\n }\n }\n } catch (e) {\n logger.error(e);\n }\n }\n\n /**\n * Add MPD events to the list of events.\n * Events that are not in the MPD anymore but not triggered yet will still be deleted.\n * Existing events might get updated.\n * @param {Array.<Object>} values\n * @param {string} periodId\n */\n function addInlineEvents(values, periodId) {\n try {\n checkConfig();\n\n if (!inlineEvents[periodId]) {\n inlineEvents[periodId] = {};\n }\n\n if (values) {\n for (let i = 0; i < values.length; i++) {\n let event = values[i];\n const currentTime = playbackController.getTime();\n const duration = !isNaN(event.duration) ? event.duration : 0;\n if (!_eventHasExpired(currentTime, duration, event.calculatedPresentationTime)) {\n let result = _addOrUpdateEvent(event, inlineEvents[periodId], true);\n\n if (result === EVENT_HANDLED_STATES.ADDED) {\n logger.debug(`Added inline event with id ${event.id} from period ${periodId}`);\n // If we see the event for the first time we trigger it in onReceive mode\n _startEvent(event, MediaPlayerEvents.EVENT_MODE_ON_RECEIVE);\n } else if (result === EVENT_HANDLED_STATES.UPDATED) {\n logger.debug(`Updated inline event with id ${event.id} from period ${periodId}`);\n }\n }\n }\n }\n } catch (e) {\n throw e;\n }\n }\n\n /**\n * Add EMSG events to the list of events\n * Messages with the same id within the scope of the same scheme_id_uri and value pair are equivalent , i.e. processing of any one event message box with the same id is sufficient.\n * @param {Array.<Object>} values\n * @param {string} periodId\n */\n function addInbandEvents(values, periodId) {\n try {\n checkConfig();\n\n if (!inbandEvents[periodId]) {\n inbandEvents[periodId] = {};\n }\n\n for (let i = 0; i < values.length; i++) {\n let event = values[i];\n const currentTime = playbackController.getTime();\n const duration = !isNaN(event.duration) ? event.duration : 0;\n if (!_eventHasExpired(currentTime, duration, event.calculatedPresentationTime)) {\n let result = _addOrUpdateEvent(event, inbandEvents[periodId], false);\n\n if (result === EVENT_HANDLED_STATES.ADDED) {\n if (event.eventStream.schemeIdUri === MPD_RELOAD_SCHEME) {\n _handleManifestReloadEvent(event);\n }\n logger.debug(`Added inband event with id ${event.id} from period ${periodId}`);\n _startEvent(event, MediaPlayerEvents.EVENT_MODE_ON_RECEIVE);\n } else {\n logger.debug(`Inband event with scheme_id_uri ${event.eventStream.schemeIdUri}, value ${event.eventStream.value}, period id ${periodId} and event id ${event.id} was ignored because it has been added before.`);\n }\n }\n }\n _onEventTimer();\n } catch (e) {\n throw e;\n }\n }\n\n /**\n * Adds or updates an event to/in the list of events\n * @param {object} event\n * @param {object} events\n * @param {boolean} shouldOverwriteExistingEvents\n * @return {string}\n * @private\n */\n function _addOrUpdateEvent(event, events, shouldOverwriteExistingEvents = false) {\n const schemeIdUri = event.eventStream.schemeIdUri;\n const value = event.eventStream.value;\n const id = event.id;\n let eventState = EVENT_HANDLED_STATES.DISCARDED;\n\n if (!events[schemeIdUri]) {\n events[schemeIdUri] = [];\n }\n\n const indexOfExistingEvent = events[schemeIdUri].findIndex((e) => {\n return ((!value || (e.eventStream.value && e.eventStream.value === value)) && (e.id === id));\n });\n\n // New event, we add it to our list of events\n if (indexOfExistingEvent === -1) {\n events[schemeIdUri].push(event);\n event.triggeredReceivedEvent = false;\n event.triggeredStartEvent = false;\n eventState = EVENT_HANDLED_STATES.ADDED;\n }\n\n // We have a similar event for this period with the same schemeIdUri, value and id. Overwrite it or ignore it\n else if (shouldOverwriteExistingEvents) {\n const oldEvent = events[schemeIdUri][indexOfExistingEvent];\n event.triggeredReceivedEvent = oldEvent.triggeredReceivedEvent;\n event.triggeredStartEvent = oldEvent.triggeredStartEvent;\n events[schemeIdUri][indexOfExistingEvent] = event;\n eventState = EVENT_HANDLED_STATES.UPDATED;\n }\n\n return eventState;\n }\n\n /**\n * Triggers an MPD reload\n * @param {object} event\n * @private\n */\n function _handleManifestReloadEvent(event) {\n try {\n if (event.eventStream.value == MPD_RELOAD_VALUE) {\n const validUntil = event.calculatedPresentationTime;\n let newDuration;\n if (event.calculatedPresentationTime == 0xFFFFFFFF) {//0xFF... means remaining duration unknown\n newDuration = NaN;\n } else {\n newDuration = event.calculatedPresentationTime + event.duration;\n }\n //logger.info('Manifest validity changed: Valid until: ' + validUntil + '; remaining duration: ' + newDuration);\n eventBus.trigger(MediaPlayerEvents.MANIFEST_VALIDITY_CHANGED, {\n id: event.id,\n validUntil: validUntil,\n newDuration: newDuration,\n newManifestValidAfter: NaN //event.message_data - this is an arraybuffer with a timestring in it, but not used yet\n }, {\n mode: MediaPlayerEvents.EVENT_MODE_ON_START\n });\n }\n } catch (e) {\n logger.error(e);\n }\n }\n\n /**\n * When the EventController is stopped this callback is triggered. Starts the remaining events.\n * @private\n */\n function _onStopEventController() {\n try {\n // EventController might be stopped before the period is over. Before we stop the event controller we check for events that needs to be triggered at the period boundary.\n _triggerRemainingEvents(inbandEvents);\n _triggerRemainingEvents(inlineEvents);\n } catch (e) {\n logger.error(e);\n }\n }\n\n /**\n * Triggers the remaining events after the EventController has been stopped\n * @param {object} events\n * @private\n */\n function _triggerRemainingEvents(events) {\n try {\n const currentTime = playbackController.getTime();\n const callback = function (event) {\n const periodDuration = event.eventStream && event.eventStream.period && !isNaN(event.eventStream.period.duration) ? event.eventStream.period.duration : NaN;\n const periodStart = event.eventStream && event.eventStream.period && !isNaN(event.eventStream.period.start) ? event.eventStream.period.start : NaN;\n\n if (isNaN(periodDuration) || isNaN(periodStart)) {\n return;\n }\n\n const calculatedPresentationTimeInSeconds = event.calculatedPresentationTime;\n\n if (Math.abs(calculatedPresentationTimeInSeconds - currentTime) < REMAINING_EVENTS_THRESHOLD) {\n _startEvent(event, MediaPlayerEvents.EVENT_MODE_ON_START);\n }\n\n };\n\n _iterateAndTriggerCallback(events, callback);\n\n } catch (e) {\n logger.error(e);\n }\n }\n\n /**\n * Iterates over the inline/inband event object and triggers a callback for each event\n * @param {object} events\n * @param {function} callback\n * @private\n */\n function _iterateAndTriggerCallback(events, callback) {\n try {\n if (events) {\n const periodIds = Object.keys(events);\n for (let i = 0; i < periodIds.length; i++) {\n const currentPeriod = events[periodIds[i]];\n const schemeIdUris = Object.keys(currentPeriod);\n for (let j = 0; j < schemeIdUris.length; j++) {\n const schemeIdEvents = currentPeriod[schemeIdUris[j]];\n schemeIdEvents.forEach((event) => {\n if (event !== undefined) {\n callback(event);\n }\n });\n }\n }\n }\n } catch (e) {\n logger.error(e);\n }\n }\n\n /**\n * Checks if an event is expired. For instance if the presentationTime + the duration of an event are smaller than the current video time.\n * @param {number} currentVideoTime\n * @param {number} threshold\n * @param {number} calculatedPresentationTimeInSeconds\n * @return {boolean}\n * @private\n */\n function _eventHasExpired(currentVideoTime, threshold, calculatedPresentationTimeInSeconds) {\n try {\n return currentVideoTime - threshold > calculatedPresentationTimeInSeconds;\n } catch (e) {\n logger.error(e);\n return false;\n }\n }\n\n /**\n * Checks if an event is invalid. This is the case if the end time of the parent period is smaller than the presentation time of the event.\n * @param {object} event\n * @return {boolean}\n * @private\n */\n function _eventIsInvalid(event) {\n try {\n const periodEndTime = event.eventStream.period.start + event.eventStream.period.duration;\n\n return event.calculatedPresentationTime > periodEndTime;\n } catch (e) {\n logger.error(e);\n return false;\n }\n }\n\n /**\n * Starts an event. Depending on the schemeIdUri we distinguish between\n * - MPD Reload events\n * - MPD Callback events\n * - Events to be dispatched to the application\n * @param {object} event\n * @param {String} mode\n * @private\n */\n function _startEvent(event, mode) {\n try {\n const currentVideoTime = playbackController.getTime();\n const eventId = event.id;\n\n if (mode === MediaPlayerEvents.EVENT_MODE_ON_RECEIVE && !event.triggeredReceivedEvent) {\n logger.debug(`Received event ${eventId}`);\n event.triggeredReceivedEvent = true;\n eventBus.trigger(event.eventStream.schemeIdUri, { event: event }, { mode });\n return;\n }\n\n if (!event.triggeredStartEvent) {\n if (event.eventStream.schemeIdUri === MPD_RELOAD_SCHEME && event.eventStream.value == MPD_RELOAD_VALUE) {\n //If both are set to zero, it indicates the media is over at this point. Don't reload the manifest.\n if (event.duration !== 0 || event.presentationTimeDelta !== 0) {\n logger.debug(`Starting manifest refresh event ${eventId} at ${currentVideoTime}`);\n _refreshManifest();\n }\n } else if (event.eventStream.schemeIdUri === MPD_CALLBACK_SCHEME && event.eventStream.value == MPD_CALLBACK_VALUE) {\n logger.debug(`Starting callback event ${eventId} at ${currentVideoTime}`);\n _sendCallbackRequest(event.messageData);\n } else {\n logger.debug(`Starting event ${eventId} from period ${event.eventStream.period.id} at ${currentVideoTime}`);\n eventBus.trigger(event.eventStream.schemeIdUri, { event: event }, { mode });\n }\n event.triggeredStartEvent = true;\n }\n } catch (e) {\n logger.error(e);\n }\n }\n\n /**\n * Removes an event from the list. If this is the last event of type \"schemeIdUri\" the corresponding schemeIdUri Object in the list of events is deleted.\n * @param {object} events\n * @param {object} event\n * @private\n */\n function _removeEvent(events, event) {\n try {\n const schemeIdUri = event.eventStream.schemeIdUri;\n const periodId = event.eventStream.period.id;\n const value = event.eventStream.value;\n const id = event.id;\n\n events[periodId][schemeIdUri] = events[periodId][schemeIdUri].filter((e) => {\n return (value && e.eventStream.value && e.eventStream.value !== value) || e.id !== id;\n });\n\n if (events[periodId][schemeIdUri].length === 0) {\n delete events[periodId][schemeIdUri];\n }\n } catch (e) {\n logger.error(e);\n }\n }\n\n /**\n * Refresh the manifest\n * @private\n */\n function _refreshManifest() {\n try {\n checkConfig();\n manifestUpdater.refreshManifest();\n } catch (e) {\n logger.error(e);\n }\n }\n\n /**\n * Send a callback request\n * @param {String} url\n * @private\n */\n function _sendCallbackRequest(url) {\n try {\n let loader = XHRLoader(context).create({});\n loader.load({\n method: 'get',\n url: url,\n request: {\n responseType: 'arraybuffer'\n }\n });\n } catch (e) {\n logger.error(e);\n }\n }\n\n /**\n * Set the config of the EventController\n * @param {object} config\n */\n function setConfig(config) {\n try {\n if (!config) {\n return;\n }\n if (config.manifestUpdater) {\n manifestUpdater = config.manifestUpdater;\n }\n if (config.playbackController) {\n playbackController = config.playbackController;\n }\n if (config.settings) {\n settings = config.settings;\n }\n\n } catch (e) {\n throw e;\n }\n }\n\n /**\n * Returns all inline events that have not been triggered yet\n * @return {object}\n */\n function getInlineEvents() {\n return inlineEvents;\n }\n\n /**\n * Returns all inband events that have not been triggered yet\n * @return {object}\n */\n function getInbandEvents() {\n return inbandEvents;\n }\n\n /**\n * Stop the EventController and reset all initial settings\n */\n function reset() {\n _stop();\n _resetInitialSettings();\n }\n\n instance = {\n addInlineEvents,\n addInbandEvents,\n getInbandEvents,\n getInlineEvents,\n start,\n setConfig,\n reset\n };\n\n _setup();\n\n return instance;\n}\n\nEventController.__dashjs_factory_name = 'EventController';\nexport default FactoryMaker.getSingletonFactory(EventController);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nexport default {\n LEVELS: {\n SUGGESTION: 'Suggestion',\n WARNING: 'Warning',\n ERROR: 'Error'\n },\n EVENTS: {\n NO_UTC_TIMING_ELEMENT: {\n key: 'NO_UTC_TIMING_ELEMENT',\n message: 'No UTCTiming element is present in the manifest. You may experience playback failures. For a detailed validation use https://conformance.dashif.org/'\n },\n NON_COMPLIANT_SMPTE_IMAGE_ATTRIBUTE: {\n key: 'NON_COMPLIANT_SMPTE_IMAGE_ATTRIBUTE',\n message: 'SMPTE 2052-1:2013 defines the attribute name as \"imageType\" and does not define \"imagetype\"'\n },\n INVALID_DVR_WINDOW: {\n key: 'INVALID_DVR_WINDOW',\n message: 'No valid segment found when applying a specification compliant DVR window calculation. Using SegmentTimeline entries as a fallback.'\n }\n }\n};\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport Constants from '../constants/Constants';\nimport MetricsConstants from '../constants/MetricsConstants';\nimport Stream from '../Stream';\nimport ManifestUpdater from '../ManifestUpdater';\nimport EventBus from '../../core/EventBus';\nimport Events from '../../core/events/Events';\nimport FactoryMaker from '../../core/FactoryMaker';\nimport {\n PlayList, PlayListTrace\n} from '../vo/metrics/PlayList';\nimport Debug from '../../core/Debug';\nimport InitCache from '../utils/InitCache';\nimport MediaPlayerEvents from '../MediaPlayerEvents';\nimport TimeSyncController from './TimeSyncController';\nimport MediaSourceController from './MediaSourceController';\nimport DashJSError from '../vo/DashJSError';\nimport Errors from '../../core/errors/Errors';\nimport EventController from './EventController';\nimport ConformanceViolationConstants from '../constants/ConformanceViolationConstants';\n\nconst PLAYBACK_ENDED_TIMER_INTERVAL = 200;\nconst DVR_WAITING_OFFSET = 2;\n\nfunction StreamController() {\n\n const context = this.context;\n const eventBus = EventBus(context).getInstance();\n\n let instance, logger, capabilities, capabilitiesFilter, manifestUpdater, manifestLoader, manifestModel, adapter,\n dashMetrics, mediaSourceController, timeSyncController, contentSteeringController, baseURLController,\n segmentBaseController, uriFragmentModel, abrController, mediaController, eventController, initCache,\n errHandler, timelineConverter, streams, activeStream, protectionController, textController, protectionData,\n autoPlay, isStreamSwitchingInProgress, hasMediaError, hasInitialisationError, mediaSource, videoModel,\n playbackController, serviceDescriptionController, mediaPlayerModel, customParametersModel, isPaused,\n initialPlayback, initialSteeringRequest, playbackEndedTimerInterval, bufferSinks, preloadingStreams,\n supportsChangeType, settings,\n firstLicenseIsFetched, waitForPlaybackStartTimeout, providedStartTime, errorInformation;\n\n function setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n timeSyncController = TimeSyncController(context).getInstance();\n mediaSourceController = MediaSourceController(context).getInstance();\n initCache = InitCache(context).getInstance();\n\n resetInitialSettings();\n }\n\n function initialize(autoPl, protData) {\n _checkConfig();\n\n autoPlay = autoPl;\n protectionData = protData;\n timelineConverter.initialize();\n\n manifestUpdater = ManifestUpdater(context).create();\n manifestUpdater.setConfig({\n manifestModel,\n adapter,\n manifestLoader,\n errHandler,\n settings,\n contentSteeringController\n });\n manifestUpdater.initialize();\n\n eventController = EventController(context).getInstance();\n eventController.setConfig({\n manifestUpdater: manifestUpdater, playbackController: playbackController, settings\n });\n eventController.start();\n\n\n timeSyncController.setConfig({\n dashMetrics, baseURLController, errHandler, settings\n });\n timeSyncController.initialize();\n\n mediaSourceController.setConfig({ settings });\n\n if (protectionController) {\n eventBus.trigger(Events.PROTECTION_CREATED, {\n controller: protectionController\n });\n protectionController.setMediaElement(videoModel.getElement());\n if (protectionData) {\n protectionController.setProtectionData(protectionData);\n }\n }\n\n registerEvents();\n }\n\n function registerEvents() {\n eventBus.on(MediaPlayerEvents.PLAYBACK_TIME_UPDATED, _onPlaybackTimeUpdated, instance);\n eventBus.on(MediaPlayerEvents.PLAYBACK_SEEKING, _onPlaybackSeeking, instance);\n eventBus.on(MediaPlayerEvents.PLAYBACK_ERROR, _onPlaybackError, instance);\n eventBus.on(MediaPlayerEvents.PLAYBACK_STARTED, _onPlaybackStarted, instance);\n eventBus.on(MediaPlayerEvents.PLAYBACK_PAUSED, _onPlaybackPaused, instance);\n eventBus.on(MediaPlayerEvents.PLAYBACK_ENDED, _onPlaybackEnded, instance);\n eventBus.on(MediaPlayerEvents.METRIC_ADDED, _onMetricAdded, instance);\n eventBus.on(MediaPlayerEvents.MANIFEST_VALIDITY_CHANGED, _onManifestValidityChanged, instance);\n eventBus.on(MediaPlayerEvents.BUFFER_LEVEL_UPDATED, _onBufferLevelUpdated, instance);\n eventBus.on(MediaPlayerEvents.QUALITY_CHANGE_REQUESTED, _onQualityChanged, instance);\n\n if (Events.KEY_SESSION_UPDATED) {\n eventBus.on(Events.KEY_SESSION_UPDATED, _onKeySessionUpdated, instance);\n }\n\n eventBus.on(Events.MANIFEST_UPDATED, _onManifestUpdated, instance);\n eventBus.on(Events.STREAM_BUFFERING_COMPLETED, _onStreamBufferingCompleted, instance);\n eventBus.on(Events.TIME_SYNCHRONIZATION_COMPLETED, _onTimeSyncCompleted, instance);\n eventBus.on(Events.CURRENT_TRACK_CHANGED, _onCurrentTrackChanged, instance);\n eventBus.on(Events.SETTING_UPDATED_LIVE_DELAY, _onLiveDelaySettingUpdated, instance);\n eventBus.on(Events.SETTING_UPDATED_LIVE_DELAY_FRAGMENT_COUNT, _onLiveDelaySettingUpdated, instance);\n }\n\n function unRegisterEvents() {\n eventBus.off(MediaPlayerEvents.PLAYBACK_TIME_UPDATED, _onPlaybackTimeUpdated, instance);\n eventBus.off(MediaPlayerEvents.PLAYBACK_SEEKING, _onPlaybackSeeking, instance);\n eventBus.off(MediaPlayerEvents.PLAYBACK_ERROR, _onPlaybackError, instance);\n eventBus.off(MediaPlayerEvents.PLAYBACK_STARTED, _onPlaybackStarted, instance);\n eventBus.off(MediaPlayerEvents.PLAYBACK_PAUSED, _onPlaybackPaused, instance);\n eventBus.off(MediaPlayerEvents.PLAYBACK_ENDED, _onPlaybackEnded, instance);\n eventBus.off(MediaPlayerEvents.METRIC_ADDED, _onMetricAdded, instance);\n eventBus.off(MediaPlayerEvents.MANIFEST_VALIDITY_CHANGED, _onManifestValidityChanged, instance);\n eventBus.off(MediaPlayerEvents.BUFFER_LEVEL_UPDATED, _onBufferLevelUpdated, instance);\n eventBus.off(MediaPlayerEvents.QUALITY_CHANGE_REQUESTED, _onQualityChanged, instance);\n\n if (Events.KEY_SESSION_UPDATED) {\n eventBus.off(Events.KEY_SESSION_UPDATED, _onKeySessionUpdated, instance);\n }\n\n eventBus.off(Events.MANIFEST_UPDATED, _onManifestUpdated, instance);\n eventBus.off(Events.STREAM_BUFFERING_COMPLETED, _onStreamBufferingCompleted, instance);\n eventBus.off(Events.TIME_SYNCHRONIZATION_COMPLETED, _onTimeSyncCompleted, instance);\n eventBus.off(Events.CURRENT_TRACK_CHANGED, _onCurrentTrackChanged, instance);\n eventBus.off(Events.SETTING_UPDATED_LIVE_DELAY, _onLiveDelaySettingUpdated, instance);\n eventBus.off(Events.SETTING_UPDATED_LIVE_DELAY_FRAGMENT_COUNT, _onLiveDelaySettingUpdated, instance);\n }\n\n function _checkConfig() {\n if (!manifestLoader || !manifestLoader.hasOwnProperty('load') || !timelineConverter || !timelineConverter.hasOwnProperty('initialize') || !timelineConverter.hasOwnProperty('reset') || !timelineConverter.hasOwnProperty('getClientTimeOffset') || !manifestModel || !errHandler || !dashMetrics || !playbackController) {\n throw new Error(Constants.MISSING_CONFIG_ERROR);\n }\n }\n\n function _checkInitialize() {\n if (!manifestUpdater || !manifestUpdater.hasOwnProperty('setManifest')) {\n throw new Error('initialize function has to be called previously');\n }\n }\n\n /**\n * Start the streaming session by loading the target manifest\n * @param {string} url\n * @param {number} startTime\n */\n function load(url, startTime = NaN) {\n _checkConfig();\n providedStartTime = startTime;\n manifestLoader.load(url);\n }\n\n /**\n * Start the streaming session by using the provided manifest object\n * @param {object} manifest\n * @param {number} startTime\n */\n function loadWithManifest(manifest, startTime = NaN) {\n _checkInitialize();\n providedStartTime = startTime;\n manifestUpdater.setManifest(manifest);\n }\n\n /**\n * When the UTC snychronization is completed we can compose the streams\n * @private\n */\n function _onTimeSyncCompleted( /*e*/) {\n _composeStreams();\n }\n\n /**\n *\n * @private\n */\n function _onKeySessionUpdated() {\n firstLicenseIsFetched = true;\n }\n\n /**\n * Setup the stream objects after the stream start and each MPD reload. This function is called after the UTC sync has been done (TIME_SYNCHRONIZATION_COMPLETED)\n * @private\n */\n function _composeStreams() {\n try {\n const streamsInfo = adapter.getStreamsInfo();\n\n if (!activeStream && streamsInfo.length === 0) {\n throw new Error('There are no periods in the MPD');\n }\n\n if (activeStream && streamsInfo.length > 0) {\n dashMetrics.updateManifestUpdateInfo({\n currentTime: playbackController.getTime(),\n buffered: videoModel.getBufferRange(),\n presentationStartTime: streamsInfo[0].start,\n clientTimeOffset: timelineConverter.getClientTimeOffset()\n });\n }\n\n // Filter streams that are outdated and not included in the MPD anymore\n if (streams.length > 0) {\n _filterOutdatedStreams(streamsInfo);\n }\n\n const promises = [];\n for (let i = 0, ln = streamsInfo.length; i < ln; i++) {\n const streamInfo = streamsInfo[i];\n promises.push(_initializeOrUpdateStream(streamInfo));\n dashMetrics.addManifestUpdateStreamInfo(streamInfo);\n }\n\n Promise.all(promises)\n .then(() => {\n return new Promise((resolve, reject) => {\n if (!activeStream) {\n _initializeForFirstStream(streamsInfo, resolve, reject);\n } else {\n resolve();\n }\n });\n })\n .then(() => {\n eventBus.trigger(Events.STREAMS_COMPOSED);\n // Additional periods might have been added after an MPD update. Check again if we can start prebuffering.\n _checkIfPrebufferingCanStart();\n })\n .catch((e) => {\n throw e;\n })\n\n } catch (e) {\n errHandler.error(new DashJSError(Errors.MANIFEST_ERROR_ID_NOSTREAMS_CODE, e.message + ' nostreamscomposed', manifestModel.getValue()));\n hasInitialisationError = true;\n reset();\n }\n }\n\n /**\n * Called for each stream when composition is performed. Either a new instance of Stream is created or the existing one is updated.\n * @param {object} streamInfo\n * @private\n */\n function _initializeOrUpdateStream(streamInfo) {\n let stream = getStreamById(streamInfo.id);\n\n // If the Stream object does not exist we probably loaded the manifest the first time or it was\n // introduced in the updated manifest, so we need to create a new Stream and perform all the initialization operations\n if (!stream) {\n stream = Stream(context).create({\n manifestModel,\n mediaPlayerModel,\n dashMetrics,\n manifestUpdater,\n adapter,\n timelineConverter,\n capabilities,\n capabilitiesFilter,\n errHandler,\n baseURLController,\n segmentBaseController,\n textController,\n abrController,\n playbackController,\n eventController,\n mediaController,\n protectionController,\n videoModel,\n streamInfo,\n settings\n });\n streams.push(stream);\n stream.initialize();\n return Promise.resolve();\n } else {\n return stream.updateData(streamInfo);\n }\n }\n\n /**\n * Initialize playback for the first period.\n * @param {array} streamsInfo\n * @private\n */\n function _initializeForFirstStream(streamsInfo, resolve, reject) {\n try {\n\n // Add the DVR window so we can calculate the right starting point\n addDVRMetric();\n\n // If the start is in the future we need to wait\n const dvrRange = dashMetrics.getCurrentDVRInfo().range;\n if (dvrRange.end < dvrRange.start) {\n if (waitForPlaybackStartTimeout) {\n clearTimeout(waitForPlaybackStartTimeout);\n }\n const waitingTime = Math.min((((dvrRange.end - dvrRange.start) * -1) + DVR_WAITING_OFFSET) * 1000, 2147483647);\n logger.debug(`Waiting for ${waitingTime} ms before playback can start`);\n eventBus.trigger(Events.AST_IN_FUTURE, { delay: waitingTime });\n waitForPlaybackStartTimeout = setTimeout(() => {\n _initializeForFirstStream(streamsInfo, resolve, reject);\n }, waitingTime);\n return;\n }\n\n\n // Calculate the producer reference time offsets if given\n if (settings.get().streaming.applyProducerReferenceTime) {\n serviceDescriptionController.calculateProducerReferenceTimeOffsets(streamsInfo);\n }\n\n // Apply Service description parameters.\n const manifestInfo = streamsInfo[0].manifestInfo;\n if (settings.get().streaming.applyServiceDescription) {\n serviceDescriptionController.applyServiceDescription(manifestInfo);\n }\n\n // Compute and set the live delay\n if (adapter.getIsDynamic()) {\n const fragmentDuration = _getFragmentDurationForLiveDelayCalculation(streamsInfo, manifestInfo);\n playbackController.computeAndSetLiveDelay(fragmentDuration, manifestInfo);\n }\n\n // Apply content steering\n _applyContentSteeringBeforeStart()\n .then(() => {\n const manifest = manifestModel.getValue();\n if (manifest) {\n baseURLController.update(manifest)\n }\n _calculateStartTimeAndSwitchStream()\n resolve();\n })\n .catch((e) => {\n logger.error(e);\n _calculateStartTimeAndSwitchStream();\n resolve();\n })\n } catch (e) {\n reject(e);\n }\n }\n\n function _applyContentSteeringBeforeStart() {\n if (settings.get().streaming.applyContentSteering && contentSteeringController.shouldQueryBeforeStart()) {\n return contentSteeringController.loadSteeringData();\n }\n return Promise.resolve();\n }\n\n function _calculateStartTimeAndSwitchStream() {\n // Figure out the correct start time and the correct start period\n const startTime = _getInitialStartTime();\n let initialStream = getStreamForTime(startTime);\n const startStream = initialStream !== null ? initialStream : streams[0];\n eventBus.trigger(Events.INITIAL_STREAM_SWITCH, { startTime });\n _switchStream(startStream, null, startTime);\n _startPlaybackEndedTimerInterval();\n }\n\n /**\n * Switch from the current stream (period) to the next stream (period).\n * @param {object} stream\n * @param {object} previousStream\n * @param {number} seekTime\n * @private\n */\n function _switchStream(stream, previousStream, seekTime) {\n try {\n if (isStreamSwitchingInProgress || !stream || (previousStream === stream && stream.getIsActive())) {\n return;\n }\n\n isStreamSwitchingInProgress = true;\n eventBus.trigger(Events.PERIOD_SWITCH_STARTED, {\n fromStreamInfo: previousStream ? previousStream.getStreamInfo() : null,\n toStreamInfo: stream.getStreamInfo()\n });\n\n let keepBuffers = false;\n activeStream = stream;\n\n if (previousStream) {\n keepBuffers = _canSourceBuffersBeReused(stream, previousStream);\n previousStream.deactivate(keepBuffers);\n }\n\n // Determine seek time when switching to new period\n // - seek at given seek time\n // - or seek at period start if upcoming period is not prebuffered\n seekTime = !isNaN(seekTime) ? seekTime : (!keepBuffers && previousStream ? stream.getStreamInfo().start : NaN);\n logger.info(`Switch to stream ${stream.getId()}. Seektime is ${seekTime}, current playback time is ${playbackController.getTime()}. Seamless period switch is set to ${keepBuffers}`);\n\n preloadingStreams = preloadingStreams.filter((s) => {\n return s.getId() !== activeStream.getId();\n });\n playbackController.initialize(getActiveStreamInfo(), !!previousStream);\n\n // If we have a video element we are not preloading into a virtual buffer\n if (videoModel.getElement()) {\n _openMediaSource(seekTime, keepBuffers, false);\n } else {\n _activateStream(seekTime, keepBuffers);\n }\n } catch (e) {\n isStreamSwitchingInProgress = false;\n }\n }\n\n /**\n * Setup the Media Source. Open MSE and attach event listeners\n * @param {number} seekTime\n * @param {boolean} keepBuffers\n * @param {boolean} streamActivated\n * @private\n */\n function _openMediaSource(seekTime, keepBuffers, streamActivated = false) {\n let sourceUrl;\n\n function _onMediaSourceOpen() {\n // Manage situations in which a call to reset happens while MediaSource is being opened\n if (!mediaSource || mediaSource.readyState !== 'open') return;\n\n logger.debug('MediaSource is open!');\n window.URL.revokeObjectURL(sourceUrl);\n mediaSource.removeEventListener('sourceopen', _onMediaSourceOpen);\n mediaSource.removeEventListener('webkitsourceopen', _onMediaSourceOpen);\n\n _setMediaDuration();\n const dvrInfo = dashMetrics.getCurrentDVRInfo();\n mediaSourceController.setSeekable(dvrInfo.range.start, dvrInfo.range.end);\n if (streamActivated) {\n if (!isNaN(seekTime)) {\n playbackController.seek(seekTime, true, true);\n }\n // Set the media source for all StreamProcessors\n activeStream.setMediaSource(mediaSource)\n .then(() => {\n // Start text processing now that we have a video element\n activeStream.initializeForTextWithMediaSource(mediaSource);\n })\n } else {\n _activateStream(seekTime, keepBuffers);\n }\n }\n\n function _open() {\n mediaSource.addEventListener('sourceopen', _onMediaSourceOpen, false);\n mediaSource.addEventListener('webkitsourceopen', _onMediaSourceOpen, false);\n sourceUrl = mediaSourceController.attachMediaSource(videoModel);\n logger.debug('MediaSource attached to element. Waiting on open...');\n }\n\n if (!mediaSource) {\n mediaSource = mediaSourceController.createMediaSource();\n _open();\n } else {\n if (keepBuffers) {\n _activateStream(seekTime, keepBuffers);\n } else {\n mediaSourceController.detachMediaSource(videoModel);\n _open();\n }\n }\n }\n\n /**\n * Activates a new stream.\n * @param {number} seekTime\n * @param {boolean} keepBuffers\n */\n function _activateStream(seekTime, keepBuffers) {\n activeStream.activate(mediaSource, keepBuffers ? bufferSinks : undefined, seekTime)\n .then((sinks) => {\n // check if change type is supported by the browser\n if (sinks) {\n const keys = Object.keys(sinks);\n if (keys.length > 0 && sinks[keys[0]].getBuffer().changeType) {\n supportsChangeType = true;\n }\n bufferSinks = sinks;\n }\n\n // Set the initial time for this stream in the StreamProcessor\n if (!isNaN(seekTime)) {\n eventBus.trigger(Events.SEEK_TARGET, { time: seekTime }, { streamId: activeStream.getId() });\n playbackController.seek(seekTime, false, true);\n activeStream.startScheduleControllers();\n }\n\n isStreamSwitchingInProgress = false;\n eventBus.trigger(Events.PERIOD_SWITCH_COMPLETED, { toStreamInfo: getActiveStreamInfo() });\n });\n }\n\n /**\n * A playback seeking event was triggered. We need to disable the preloading streams and call the respective seeking handler.\n * We distinguish between inner period seeks and outer period seeks\n * @param {object} e\n * @private\n */\n function _onPlaybackSeeking(e) {\n const newTime = e.seekTime;\n const seekToStream = getStreamForTime(newTime);\n\n if (!seekToStream || seekToStream === activeStream) {\n _cancelPreloading();\n _handleInnerPeriodSeek(e);\n } else if (seekToStream && seekToStream !== activeStream) {\n _cancelPreloading(seekToStream);\n _handleOuterPeriodSeek(e, seekToStream);\n }\n\n _createPlaylistMetrics(PlayList.SEEK_START_REASON);\n }\n\n /**\n * Cancels the preloading of certain streams based on the position we are seeking to.\n * @param {object} seekToStream\n * @private\n */\n function _cancelPreloading(seekToStream = null) {\n // Inner period seek\n if (!seekToStream) {\n _deactivateAllPreloadingStreams();\n }\n\n // Outer period seek: Deactivate everything for now\n else {\n _deactivateAllPreloadingStreams();\n }\n\n }\n\n /**\n * Deactivates all preloading streams\n * @private\n */\n function _deactivateAllPreloadingStreams() {\n if (preloadingStreams && preloadingStreams.length > 0) {\n preloadingStreams.forEach((s) => {\n s.deactivate(true);\n });\n preloadingStreams = [];\n }\n }\n\n /**\n * Handle an inner period seek. Prepare all StreamProcessors for the seek.\n * @param {object} e\n * @param {number} oldTime\n * @private\n */\n function _handleInnerPeriodSeek(e) {\n const streamProcessors = activeStream.getProcessors();\n\n streamProcessors.forEach((sp) => {\n return sp.prepareInnerPeriodPlaybackSeeking(e);\n });\n\n _flushPlaylistMetrics(PlayListTrace.USER_REQUEST_STOP_REASON);\n }\n\n /**\n * Handle an outer period seek. Dispatch the corresponding event to be handled in the BufferControllers and the ScheduleControllers\n * @param {object} e\n * @param {object} seekToStream\n * @private\n */\n function _handleOuterPeriodSeek(e, seekToStream) {\n // Stop segment requests\n const seekTime = e && !isNaN(e.seekTime) ? e.seekTime : NaN;\n const streamProcessors = activeStream.getProcessors();\n\n const promises = streamProcessors.map((sp) => {\n // Cancel everything in case the active stream is still buffering\n return sp.prepareOuterPeriodPlaybackSeeking(e);\n });\n\n Promise.all(promises)\n .then(() => {\n _switchStream(seekToStream, activeStream, seekTime);\n })\n .catch((e) => {\n errHandler.error(e);\n });\n }\n\n /**\n * A track change occured. We deactivate the preloading streams\n * @param {object} e\n * @private\n */\n function _onCurrentTrackChanged(e) {\n // Track was changed in non active stream. No need to do anything, this only happens when a stream starts preloading\n if (e.newMediaInfo.streamInfo.id !== activeStream.getId()) {\n return;\n }\n\n // If the track was changed in the active stream we need to stop preloading and remove the already prebuffered stuff. Since we do not support preloading specific handling of specific AdaptationSets yet.\n _deactivateAllPreloadingStreams();\n\n if (settings.get().streaming.buffer.resetSourceBuffersForTrackSwitch && e.oldMediaInfo && e.oldMediaInfo.codec !== e.newMediaInfo.codec) {\n const time = playbackController.getTime();\n activeStream.deactivate(false);\n _openMediaSource(time, false, false);\n return;\n }\n\n activeStream.prepareTrackChange(e);\n }\n\n /**\n * If the source buffer can be reused we can potentially start buffering the next period\n * @param {object} nextStream\n * @param {object} previousStream\n * @return {boolean}\n * @private\n */\n function _canSourceBuffersBeReused(nextStream, previousStream) {\n try {\n // Seamless period switch allowed only if:\n // - none of the periods uses contentProtection.\n // - AND changeType method implemented by browser or periods use the same codec.\n return (settings.get().streaming.buffer.reuseExistingSourceBuffers && (previousStream.isProtectionCompatible(nextStream) || firstLicenseIsFetched) && (supportsChangeType && settings.get().streaming.buffer.useChangeTypeForTrackSwitch || previousStream.isMediaCodecCompatible(nextStream, previousStream)));\n } catch (e) {\n return false;\n }\n }\n\n /**\n * Initiate the preloading of the next stream\n * @param {object} nextStream\n * @param {object} previousStream\n * @private\n */\n function _onStreamCanLoadNext(nextStream, previousStream = null) {\n\n if (mediaSource && !nextStream.getPreloaded()) {\n let seamlessPeriodSwitch = _canSourceBuffersBeReused(nextStream, previousStream);\n\n if (seamlessPeriodSwitch) {\n nextStream.startPreloading(mediaSource, bufferSinks)\n .then(() => {\n preloadingStreams.push(nextStream);\n });\n }\n }\n }\n\n /**\n * Returns the corresponding stream object for a specific presentation time.\n * @param {number} time\n * @return {null|object}\n */\n function getStreamForTime(time) {\n\n if (isNaN(time)) {\n return null;\n }\n\n const ln = streams.length;\n\n for (let i = 0; i < ln; i++) {\n const stream = streams[i];\n const streamEnd = parseFloat((stream.getStartTime() + stream.getDuration()).toFixed(5));\n\n if (time < streamEnd) {\n return stream;\n }\n }\n\n return null;\n }\n\n /**\n * Add the DVR window to the metric list. We need the DVR window to restrict the seeking and calculate the right start time.\n */\n function addDVRMetric() {\n try {\n const isDynamic = adapter.getIsDynamic();\n const streamsInfo = adapter.getStreamsInfo();\n const manifestInfo = streamsInfo[0].manifestInfo;\n const time = playbackController.getTime();\n const range = timelineConverter.calcTimeShiftBufferWindow(streams, isDynamic);\n const activeStreamProcessors = getActiveStreamProcessors();\n\n if (typeof range.start === 'undefined' || typeof range.end === 'undefined') {\n return;\n }\n\n if (!activeStreamProcessors || activeStreamProcessors.length === 0) {\n dashMetrics.addDVRInfo(Constants.VIDEO, time, manifestInfo, range);\n } else {\n activeStreamProcessors.forEach((sp) => {\n dashMetrics.addDVRInfo(sp.getType(), time, manifestInfo, range);\n });\n }\n } catch (e) {\n }\n }\n\n /**\n * The buffer level for a certain media type has been updated. If this is the initial playback and we want to autoplay the content we check if we can start playback now.\n * For livestreams we might have a drift of the target live delay compared to the current live delay because reaching the initial buffer level took time.\n * @param {object} e\n * @private\n */\n function _onBufferLevelUpdated(e) {\n\n // check if this is the initial playback and we reached the buffer target. If autoplay is true we start playback\n if (initialPlayback && autoPlay) {\n const initialBufferLevel = mediaPlayerModel.getInitialBufferLevel();\n const excludedStreamProcessors = [Constants.TEXT];\n if (isNaN(initialBufferLevel) || initialBufferLevel <= playbackController.getBufferLevel(excludedStreamProcessors) || (adapter.getIsDynamic() && initialBufferLevel > playbackController.getLiveDelay())) {\n initialPlayback = false;\n _createPlaylistMetrics(PlayList.INITIAL_PLAYOUT_START_REASON);\n playbackController.play();\n }\n }\n\n if (e && e.mediaType) {\n dashMetrics.addBufferLevel(e.mediaType, new Date(), e.bufferLevel * 1000);\n }\n }\n\n /**\n * When the quality is changed in the currently active stream and we do an aggressive replacement we must stop prebuffering. This is similar to a replacing track switch\n * Otherwise preloading can go on.\n * @param e\n * @private\n */\n function _onQualityChanged(e) {\n if (e.streamInfo.id === activeStream.getId() && e.reason && e.reason.forceReplace) {\n _deactivateAllPreloadingStreams();\n }\n\n const stream = getStreamById(e.streamInfo.id);\n\n stream.prepareQualityChange(e);\n }\n\n /**\n * A setting related to the live delay was updated. Check if one of the latency values changed. If so, recalculate the live delay.\n * @private\n */\n function _onLiveDelaySettingUpdated() {\n if (adapter.getIsDynamic() && playbackController.getOriginalLiveDelay() !== 0 && activeStream) {\n const streamsInfo = adapter.getStreamsInfo()\n if (streamsInfo.length > 0) {\n const manifestInfo = streamsInfo[0].manifestInfo;\n const fragmentDuration = _getFragmentDurationForLiveDelayCalculation(streamsInfo, manifestInfo);\n\n playbackController.computeAndSetLiveDelay(fragmentDuration, manifestInfo);\n }\n }\n }\n\n /**\n * When the playback time is updated we add the droppedFrames metric to the dash metric object\n * @private\n */\n function _onPlaybackTimeUpdated(/*e*/) {\n if (hasVideoTrack()) {\n const playbackQuality = videoModel.getPlaybackQuality();\n if (playbackQuality) {\n dashMetrics.addDroppedFrames(playbackQuality);\n }\n }\n }\n\n /**\n * Once playback starts add playlist metrics depending on whether this was the first playback or playback resumed after pause\n * @private\n */\n function _onPlaybackStarted( /*e*/) {\n logger.debug('[onPlaybackStarted]');\n if (!initialPlayback && isPaused) {\n _createPlaylistMetrics(PlayList.RESUME_FROM_PAUSE_START_REASON);\n }\n if (initialPlayback) {\n initialPlayback = false;\n }\n if (initialSteeringRequest) {\n initialSteeringRequest = false;\n // If this is the initial playback attempt and we have not yet triggered content steering now is the time\n if (settings.get().streaming.applyContentSteering && !contentSteeringController.shouldQueryBeforeStart()) {\n contentSteeringController.loadSteeringData();\n }\n\n }\n isPaused = false;\n }\n\n /**\n * Once playback is paused flush metrics\n * @param {object} e\n * @private\n */\n function _onPlaybackPaused(e) {\n logger.debug('[onPlaybackPaused]');\n if (!e.ended) {\n isPaused = true;\n _flushPlaylistMetrics(PlayListTrace.USER_REQUEST_STOP_REASON);\n }\n }\n\n /**\n * Callback once a stream/period is completely buffered. We can either signal the end of the stream or start prebuffering the next period.\n * @param {object} e\n * @private\n */\n function _onStreamBufferingCompleted(e) {\n logger.debug(`Stream with id ${e.streamInfo.id} finished buffering`);\n const isLast = e.streamInfo.isLast;\n if (mediaSource && isLast) {\n logger.info('[onStreamBufferingCompleted] calls signalEndOfStream of mediaSourceController.');\n mediaSourceController.signalEndOfStream(mediaSource);\n } else {\n _checkIfPrebufferingCanStart();\n }\n }\n\n /**\n * Check if we can start prebuffering the next period.\n * @private\n */\n function _checkIfPrebufferingCanStart() {\n // In multiperiod situations, we can start buffering the next stream\n if (!activeStream || !activeStream.getHasFinishedBuffering()) {\n return;\n }\n const upcomingStreams = _getNextStreams(activeStream);\n let i = 0;\n\n while (i < upcomingStreams.length) {\n const stream = upcomingStreams[i];\n const previousStream = i === 0 ? activeStream : upcomingStreams[i - 1];\n\n // If the preloading for the current stream is not scheduled, but its predecessor has finished buffering we can start prebuffering this stream\n if (!stream.getPreloaded() && previousStream.getHasFinishedBuffering()) {\n if (mediaSource) {\n _onStreamCanLoadNext(stream, previousStream);\n }\n }\n i += 1;\n }\n }\n\n /**\n * In some cases we need to fire the playback ended event manually\n * @private\n */\n function _startPlaybackEndedTimerInterval() {\n if (!playbackEndedTimerInterval) {\n playbackEndedTimerInterval = setInterval(function () {\n if (!isStreamSwitchingInProgress && playbackController.getTimeToStreamEnd() <= 0 && !playbackController.isSeeking()) {\n eventBus.trigger(Events.PLAYBACK_ENDED, { 'isLast': getActiveStreamInfo().isLast });\n }\n }, PLAYBACK_ENDED_TIMER_INTERVAL);\n }\n }\n\n /**\n * Stop the check if the playback has ended\n * @private\n */\n function _stopPlaybackEndedTimerInterval() {\n if (playbackEndedTimerInterval) {\n clearInterval(playbackEndedTimerInterval);\n playbackEndedTimerInterval = null;\n }\n }\n\n /**\n * Returns a playhead time, in seconds, converted to be relative\n * to the start of an identified stream/period or null if no such stream\n * @param {number} time\n * @param {string} id\n * @returns {number|null}\n */\n function getTimeRelativeToStreamId(time, id) {\n let stream = null;\n let baseStart = 0;\n let streamStart = 0;\n let streamDur = null;\n\n for (let i = 0; i < streams.length; i++) {\n stream = streams[i];\n streamStart = stream.getStartTime();\n streamDur = stream.getDuration();\n\n // use start time, if not undefined or NaN or similar\n if (Number.isFinite(streamStart)) {\n baseStart = streamStart;\n }\n\n if (stream.getId() === id) {\n return time - baseStart;\n } else {\n // use duration if not undefined or NaN or similar\n if (Number.isFinite(streamDur)) {\n baseStart += streamDur;\n }\n }\n }\n\n return null;\n }\n\n /**\n * Returns the streamProcessors of the active stream.\n * @return {array}\n */\n function getActiveStreamProcessors() {\n return activeStream ? activeStream.getProcessors() : [];\n }\n\n /**\n * Once playback has ended we switch to the next stream\n * @param {object} e\n */\n function _onPlaybackEnded(e) {\n if (activeStream && !activeStream.getIsEndedEventSignaled()) {\n activeStream.setIsEndedEventSignaled(true);\n const nextStream = _getNextStream();\n if (nextStream) {\n logger.debug(`StreamController onEnded, found next stream with id ${nextStream.getStreamInfo().id}. Switching from ${activeStream.getStreamInfo().id} to ${nextStream.getStreamInfo().id}`);\n _switchStream(nextStream, activeStream, NaN);\n } else {\n logger.debug('StreamController no next stream found');\n activeStream.setIsEndedEventSignaled(false);\n }\n _flushPlaylistMetrics(nextStream ? PlayListTrace.END_OF_PERIOD_STOP_REASON : PlayListTrace.END_OF_CONTENT_STOP_REASON);\n }\n if (e && e.isLast) {\n _stopPlaybackEndedTimerInterval();\n contentSteeringController.stopSteeringRequestTimer();\n }\n }\n\n /**\n * Returns the next stream to be played relative to the stream provided. If no stream is provided we use the active stream.\n * In order to avoid rounding issues we should not use the duration of the periods. Instead find the stream with starttime closest to startTime of the previous stream.\n * @param {object} stream\n * @return {null|object}\n */\n function _getNextStream(stream = null) {\n const refStream = stream ? stream : activeStream ? activeStream : null;\n\n if (!refStream) {\n return null;\n }\n\n const refStreamInfo = refStream.getStreamInfo();\n const start = refStreamInfo.start;\n let i = 0;\n let targetIndex = -1;\n let lastDiff = NaN;\n\n while (i < streams.length) {\n const s = streams[i];\n const sInfo = s.getStreamInfo();\n const diff = sInfo.start - start;\n\n if (diff > 0 && (isNaN(lastDiff) || diff < lastDiff) && refStreamInfo.id !== sInfo.id) {\n lastDiff = diff;\n targetIndex = i;\n }\n\n i += 1;\n }\n\n if (targetIndex >= 0) {\n return streams[targetIndex];\n }\n\n return null;\n }\n\n /**\n * Returns all upcoming streams relative to the provided stream. If no stream is provided we use the active stream.\n * @param {object} stream\n * @return {array}\n */\n function _getNextStreams(stream = null) {\n try {\n const refStream = stream ? stream : activeStream ? activeStream : null;\n\n if (refStream) {\n const refStreamInfo = refStream.getStreamInfo();\n\n return streams.filter(function (stream) {\n const sInfo = stream.getStreamInfo();\n return sInfo.start > refStreamInfo.start && refStreamInfo.id !== sInfo.id;\n });\n }\n } catch (e) {\n return [];\n }\n }\n\n /**\n * Sets the duration attribute of the MediaSource using the MediaSourceController.\n * @param {number} duration\n * @private\n */\n function _setMediaDuration(duration) {\n const manifestDuration = duration ? duration : getActiveStreamInfo().manifestInfo.duration;\n mediaSourceController.setDuration(manifestDuration);\n }\n\n /**\n * Returns the active stream\n * @return {object}\n */\n function getActiveStream() {\n return activeStream;\n }\n\n /**\n * Initial playback indicates if we have called play() for the first time yet.\n * @return {*}\n */\n function getInitialPlayback() {\n return initialPlayback;\n }\n\n /**\n * Auto Play indicates if the stream starts automatically as soon as it is initialized.\n * @return {boolean}\n */\n function getAutoPlay() {\n return autoPlay;\n }\n\n /**\n * Called once the first stream has been initialized. We only use this function to seek to the right start time.\n * @return {number}\n * @private\n */\n function _getInitialStartTime() {\n // Seek new stream in priority order:\n // - at start time provided via the application\n // - at start time provided in URI parameters\n // - at stream/period start time (for static streams) or live start time (for dynamic streams)\n let startTime;\n const isDynamic = adapter.getIsDynamic();\n if (isDynamic) {\n // For dynamic stream, start by default at (live edge - live delay)\n const dvrInfo = dashMetrics.getCurrentDVRInfo();\n const liveEdge = dvrInfo && dvrInfo.range ? dvrInfo.range.end : 0;\n // we are already in the right start period. so time should not be smaller than period@start and should not be larger than period@end\n startTime = liveEdge - playbackController.getOriginalLiveDelay();\n // If start time in URI, take min value between live edge time and time from URI (capped by DVR window range)\n const dvrWindow = dvrInfo ? dvrInfo.range : null;\n if (dvrWindow) {\n // If start time was provided by the application as part of the call to initialize() or attachSource() use this value\n if (!isNaN(providedStartTime) || providedStartTime.toString().indexOf('posix:') !== -1) {\n logger.info(`Start time provided by the app: ${providedStartTime}`);\n const providedStartTimeAsPresentationTime = _getStartTimeFromProvidedData(true, providedStartTime)\n if (!isNaN(providedStartTimeAsPresentationTime)) {\n // Do not move closer to the live edge as defined by live delay\n startTime = Math.min(startTime, providedStartTimeAsPresentationTime);\n }\n } else {\n // #t shall be relative to period start\n const startTimeFromUri = _getStartTimeFromUriParameters(true);\n if (!isNaN(startTimeFromUri)) {\n logger.info(`Start time from URI parameters: ${startTimeFromUri}`);\n // Do not move closer to the live edge as defined by live delay\n startTime = Math.min(startTime, startTimeFromUri);\n }\n }\n // If calcFromSegmentTimeline is enabled we saw problems caused by the MSE.seekableRange when starting at dvrWindow.start. Apply a small offset to avoid this problem.\n const offset = settings.get().streaming.timeShiftBuffer.calcFromSegmentTimeline ? 0.1 : 0;\n startTime = Math.max(startTime, dvrWindow.start + offset);\n }\n } else {\n // For static stream, start by default at period start\n const streams = getStreams();\n const streamInfo = streams[0].getStreamInfo();\n startTime = streamInfo.start;\n\n // If start time was provided by the application as part of the call to initialize() or attachSource() use this value\n if (!isNaN(providedStartTime)) {\n logger.info(`Start time provided by the app: ${providedStartTime}`);\n const providedStartTimeAsPresentationTime = _getStartTimeFromProvidedData(false, providedStartTime)\n if (!isNaN(providedStartTimeAsPresentationTime)) {\n // Do not play earlier than the start of the first period\n startTime = Math.max(startTime, providedStartTimeAsPresentationTime);\n }\n } else {\n // If start time in URI, take max value between period start and time from URI (if in period range)\n const startTimeFromUri = _getStartTimeFromUriParameters(false);\n if (!isNaN(startTimeFromUri)) {\n logger.info(`Start time from URI parameters: ${startTimeFromUri}`);\n // Do not play earlier than the start of the first period\n startTime = Math.max(startTime, startTimeFromUri);\n }\n }\n }\n\n return startTime;\n }\n\n /**\n * 23009-1 Annex C.4 defines MPD anchors to use URI fragment syntax to start a presentation at a given time and a given state\n * @param {boolean} isDynamic\n * @return {number}\n * @private\n */\n function _getStartTimeFromUriParameters(isDynamic) {\n const fragData = uriFragmentModel.getURIFragmentData();\n if (!fragData || !fragData.t) {\n return NaN;\n }\n const refStream = getStreams()[0];\n const referenceTime = refStream.getStreamInfo().start;\n fragData.t = fragData.t.split(',')[0];\n\n return _getStartTimeFromString(isDynamic, fragData.t, referenceTime);\n }\n\n /**\n * Calculate start time using the value that was provided via the application as part of attachSource() or initialize()\n * @param {boolean} isDynamic\n * @param {number | string} providedStartTime\n * @return {number}\n * @private\n */\n function _getStartTimeFromProvidedData(isDynamic, providedStartTime) {\n let referenceTime = 0;\n\n if (!isDynamic) {\n const refStream = getStreams()[0];\n referenceTime = refStream.getStreamInfo().start;\n }\n\n return _getStartTimeFromString(isDynamic, providedStartTime, referenceTime);\n }\n\n\n function _getStartTimeFromString(isDynamic, targetValue, referenceTime) {\n // Consider only start time of MediaRange\n // TODO: consider end time of MediaRange to stop playback at provided end time\n // \"t=<time>\" : time is relative to 1st period start\n // \"t=posix:<time>\" : time is absolute start time as number of seconds since 01-01-1970\n const period = adapter.getRegularPeriods()[0];\n const targetString = targetValue.toString();\n const posix = targetString.indexOf('posix:') !== -1 ? targetString.substring(6) === 'now' ? Date.now() / 1000 : parseFloat(targetString.substring(6)) : NaN;\n let startTime = (isDynamic && !isNaN(posix)) ? timelineConverter.calcPresentationTimeFromWallTime(new Date(posix * 1000), period) : parseFloat(targetString) + referenceTime;\n\n return startTime;\n }\n\n /**\n * Streams that are no longer in the manifest can be filtered\n * @param {object} streamsInfo\n * @private\n */\n function _filterOutdatedStreams(streamsInfo) {\n if (streamsInfo.length === 0) {\n logger.warn(`No periods included in the current manifest. Skipping the filtering of outdated stream objects.`);\n return;\n }\n\n streams = streams.filter((stream) => {\n const isStillIncluded = streamsInfo.filter((sInfo) => {\n return sInfo.id === stream.getId();\n }).length > 0;\n\n const shouldKeepStream = isStillIncluded || stream.getId() === activeStream.getId();\n\n if (!shouldKeepStream) {\n logger.debug(`Removing stream ${stream.getId()}`);\n stream.reset(true);\n }\n\n return shouldKeepStream;\n });\n }\n\n /**\n * In order to calculate the initial live delay we might required the duration of the segments.\n * @param {array} streamInfos\n * @param {object} manifestInfo\n * @return {number}\n * @private\n */\n function _getFragmentDurationForLiveDelayCalculation(streamInfos, manifestInfo) {\n try {\n let fragmentDuration = NaN;\n\n // We use the maxFragmentDuration attribute if present\n if (manifestInfo && !isNaN(manifestInfo.maxFragmentDuration) && isFinite(manifestInfo.maxFragmentDuration)) {\n return manifestInfo.maxFragmentDuration;\n }\n\n // For single period manifests we can iterate over all AS and use the maximum segment length\n if (streamInfos && streamInfos.length === 1) {\n const streamInfo = streamInfos[0];\n const mediaTypes = [Constants.VIDEO, Constants.AUDIO, Constants.TEXT];\n\n\n const fragmentDurations = mediaTypes\n .reduce((acc, mediaType) => {\n const mediaInfo = adapter.getMediaInfoForType(streamInfo, mediaType);\n\n if (mediaInfo && mediaInfo.isFragmented !== false) {\n acc.push(mediaInfo);\n }\n\n return acc;\n }, [])\n .reduce((acc, mediaInfo) => {\n const voRepresentations = adapter.getVoRepresentations(mediaInfo);\n\n if (voRepresentations && voRepresentations.length > 0) {\n voRepresentations.forEach((voRepresentation) => {\n if (voRepresentation) {\n acc.push(voRepresentation);\n }\n });\n }\n\n return acc;\n }, [])\n .reduce((acc, voRepresentation) => {\n const representation = adapter.convertRepresentationToRepresentationInfo(voRepresentation);\n\n if (representation && representation.fragmentDuration && !isNaN(representation.fragmentDuration)) {\n acc.push(representation.fragmentDuration);\n }\n\n return acc;\n }, []);\n\n fragmentDuration = Math.max(...fragmentDurations);\n }\n\n return isFinite(fragmentDuration) ? fragmentDuration : NaN;\n } catch (e) {\n return NaN;\n }\n }\n\n /**\n * Callback handler after the manifest has been updated. Trigger an update in the adapter and filter unsupported stuff.\n * Finally attempt UTC sync\n * @param {object} e\n * @private\n */\n function _onManifestUpdated(e) {\n if (!e.error) {\n logger.info('Manifest updated... updating data system wide.');\n //Since streams are not composed yet , need to manually look up useCalculatedLiveEdgeTime to detect if stream\n //is SegmentTimeline to avoid using time source\n const manifest = e.manifest;\n adapter.updatePeriods(manifest);\n\n let manifestUTCTimingSources = adapter.getUTCTimingSources();\n\n if (adapter.getIsDynamic() && (!manifestUTCTimingSources || manifestUTCTimingSources.length === 0)) {\n eventBus.trigger(MediaPlayerEvents.CONFORMANCE_VIOLATION, {\n level: ConformanceViolationConstants.LEVELS.WARNING,\n event: ConformanceViolationConstants.EVENTS.NO_UTC_TIMING_ELEMENT\n });\n }\n\n let allUTCTimingSources = (!adapter.getIsDynamic()) ? manifestUTCTimingSources : manifestUTCTimingSources.concat(customParametersModel.getUTCTimingSources());\n\n // It is important to filter before initializing the baseUrlController. Otherwise we might end up with wrong references in case we remove AdaptationSets.\n capabilitiesFilter.filterUnsupportedFeatures(manifest)\n .then(() => {\n baseURLController.initialize(manifest);\n timeSyncController.attemptSync(allUTCTimingSources, adapter.getIsDynamic());\n });\n } else {\n hasInitialisationError = true;\n reset();\n }\n }\n\n /**\n * Check if the stream has a video track\n * @return {boolean}\n */\n function hasVideoTrack() {\n return activeStream ? activeStream.getHasVideoTrack() : false;\n }\n\n /**\n * Check if the stream has an audio track\n * @return {boolean}\n */\n function hasAudioTrack() {\n return activeStream ? activeStream.getHasAudioTrack() : false;\n }\n\n\n function switchToVideoElement(seekTime) {\n if (activeStream) {\n playbackController.initialize(getActiveStreamInfo());\n _openMediaSource(seekTime, false, true);\n }\n }\n\n function _flushPlaylistMetrics(reason, time) {\n time = time || new Date();\n\n getActiveStreamProcessors().forEach(p => {\n p.finalisePlayList(time, reason);\n });\n dashMetrics.addPlayList();\n }\n\n function _createPlaylistMetrics(startReason) {\n dashMetrics.createPlaylistMetrics(playbackController.getTime() * 1000, startReason);\n }\n\n function _onPlaybackError(e) {\n if (!e.error) return;\n\n let msg = '';\n\n switch (e.error.code) {\n case 1:\n msg = 'MEDIA_ERR_ABORTED';\n break;\n case 2:\n msg = 'MEDIA_ERR_NETWORK';\n break;\n case 3:\n msg = 'MEDIA_ERR_DECODE';\n errorInformation.counts.mediaErrorDecode += 1;\n break;\n case 4:\n msg = 'MEDIA_ERR_SRC_NOT_SUPPORTED';\n break;\n case 5:\n msg = 'MEDIA_ERR_ENCRYPTED';\n break;\n default:\n msg = 'UNKNOWN';\n break;\n }\n\n\n if (msg === 'MEDIA_ERR_DECODE' && settings.get().errors.recoverAttempts.mediaErrorDecode >= errorInformation.counts.mediaErrorDecode) {\n _handleMediaErrorDecode();\n return;\n }\n\n hasMediaError = true;\n\n if (e.error.message) {\n msg += ' (' + e.error.message + ')';\n }\n\n if (e.error.msExtendedCode) {\n msg += ' (0x' + (e.error.msExtendedCode >>> 0).toString(16).toUpperCase() + ')';\n }\n\n logger.fatal('Video Element Error: ' + msg);\n if (e.error) {\n logger.fatal(e.error);\n }\n errHandler.error(new DashJSError(e.error.code, msg));\n reset();\n }\n\n /**\n * Handles mediaError\n * @private\n */\n function _handleMediaErrorDecode() {\n logger.warn('A MEDIA_ERR_DECODE occured: Resetting the MediaSource');\n const time = playbackController.getTime();\n // Deactivate the current stream.\n activeStream.deactivate(false);\n\n // Reset MSE\n logger.warn(`MediaSource has been resetted. Resuming playback from time ${time}`);\n _openMediaSource(time, false, false);\n }\n\n function getActiveStreamInfo() {\n return activeStream ? activeStream.getStreamInfo() : null;\n }\n\n function getIsStreamSwitchInProgress() {\n return isStreamSwitchingInProgress;\n }\n\n function getHasMediaOrInitialisationError() {\n return hasMediaError || hasInitialisationError;\n }\n\n function getStreamById(id) {\n for (let i = 0, ln = streams.length; i < ln; i++) {\n if (streams[i].getId() === id) {\n return streams[i];\n }\n }\n return null;\n }\n\n function _onManifestValidityChanged(e) {\n if (!isNaN(e.newDuration)) {\n _setMediaDuration(e.newDuration);\n }\n }\n\n function setConfig(config) {\n if (!config) return;\n\n if (config.capabilities) {\n capabilities = config.capabilities;\n }\n if (config.capabilitiesFilter) {\n capabilitiesFilter = config.capabilitiesFilter;\n }\n if (config.manifestLoader) {\n manifestLoader = config.manifestLoader;\n }\n if (config.manifestModel) {\n manifestModel = config.manifestModel;\n }\n if (config.mediaPlayerModel) {\n mediaPlayerModel = config.mediaPlayerModel;\n }\n if (config.customParametersModel) {\n customParametersModel = config.customParametersModel;\n }\n if (config.protectionController) {\n protectionController = config.protectionController;\n }\n if (config.adapter) {\n adapter = config.adapter;\n }\n if (config.dashMetrics) {\n dashMetrics = config.dashMetrics;\n }\n if (config.errHandler) {\n errHandler = config.errHandler;\n }\n if (config.timelineConverter) {\n timelineConverter = config.timelineConverter;\n }\n if (config.videoModel) {\n videoModel = config.videoModel;\n }\n if (config.playbackController) {\n playbackController = config.playbackController;\n }\n if (config.serviceDescriptionController) {\n serviceDescriptionController = config.serviceDescriptionController;\n }\n if (config.contentSteeringController) {\n contentSteeringController = config.contentSteeringController;\n }\n if (config.textController) {\n textController = config.textController;\n }\n if (config.abrController) {\n abrController = config.abrController;\n }\n if (config.mediaController) {\n mediaController = config.mediaController;\n }\n if (config.settings) {\n settings = config.settings;\n }\n if (config.baseURLController) {\n baseURLController = config.baseURLController;\n }\n if (config.uriFragmentModel) {\n uriFragmentModel = config.uriFragmentModel;\n }\n if (config.segmentBaseController) {\n segmentBaseController = config.segmentBaseController;\n }\n if (config.manifestUpdater) {\n manifestUpdater = config.manifestUpdater;\n }\n }\n\n function setProtectionData(protData) {\n protectionData = protData;\n if (protectionController) {\n protectionController.setProtectionData(protectionData);\n }\n }\n\n function resetInitialSettings() {\n streams = [];\n providedStartTime = NaN;\n protectionController = null;\n isStreamSwitchingInProgress = false;\n activeStream = null;\n hasMediaError = false;\n hasInitialisationError = false;\n initialPlayback = true;\n initialSteeringRequest = true;\n isPaused = false;\n autoPlay = true;\n playbackEndedTimerInterval = null;\n firstLicenseIsFetched = false;\n supportsChangeType = false;\n preloadingStreams = [];\n waitForPlaybackStartTimeout = null;\n errorInformation = {\n counts: {\n mediaErrorDecode: 0\n }\n }\n }\n\n function reset() {\n _checkConfig();\n\n timeSyncController.reset();\n\n _flushPlaylistMetrics(hasMediaError || hasInitialisationError ? PlayListTrace.FAILURE_STOP_REASON : PlayListTrace.USER_REQUEST_STOP_REASON);\n\n for (let i = 0, ln = streams ? streams.length : 0; i < ln; i++) {\n const stream = streams[i];\n stream.reset(hasMediaError);\n }\n\n unRegisterEvents();\n\n baseURLController.reset();\n manifestUpdater.reset();\n eventController.reset();\n dashMetrics.clearAllCurrentMetrics();\n manifestModel.setValue(null);\n manifestLoader.reset();\n timelineConverter.reset();\n initCache.reset();\n\n if (mediaSource) {\n mediaSourceController.detachMediaSource(videoModel);\n mediaSource = null;\n }\n videoModel = null;\n if (protectionController) {\n protectionController = null;\n protectionData = null;\n if (manifestModel.getValue()) {\n eventBus.trigger(Events.PROTECTION_DESTROYED, { data: manifestModel.getValue().url });\n }\n }\n\n _stopPlaybackEndedTimerInterval();\n eventBus.trigger(Events.STREAM_TEARDOWN_COMPLETE);\n resetInitialSettings();\n }\n\n function _onMetricAdded(e) {\n if (e.metric === MetricsConstants.DVR_INFO) {\n //Match media type? How can DVR window be different for media types?\n //Should we normalize and union the two?\n const targetMediaType = hasAudioTrack() ? Constants.AUDIO : Constants.VIDEO;\n if (e.mediaType === targetMediaType) {\n mediaSourceController.setSeekable(e.value.range.start, e.value.range.end);\n }\n }\n }\n\n function refreshManifest() {\n if (!manifestUpdater.getIsUpdating()) {\n manifestUpdater.refreshManifest();\n }\n }\n\n function getStreams() {\n return streams;\n }\n\n instance = {\n initialize,\n getActiveStreamInfo,\n addDVRMetric,\n hasVideoTrack,\n hasAudioTrack,\n getStreamById,\n getStreamForTime,\n getTimeRelativeToStreamId,\n load,\n loadWithManifest,\n getActiveStreamProcessors,\n setConfig,\n setProtectionData,\n getIsStreamSwitchInProgress,\n switchToVideoElement,\n getHasMediaOrInitialisationError,\n getStreams,\n getActiveStream,\n getInitialPlayback,\n getAutoPlay,\n refreshManifest,\n reset\n };\n\n setup();\n\n return instance;\n}\n\nStreamController.__dashjs_factory_name = 'StreamController';\nexport default FactoryMaker.getSingletonFactory(StreamController);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport FactoryMaker from '../../core/FactoryMaker';\nimport Debug from '../../core/Debug';\nimport Events from '../../core/events/Events';\nimport EventBus from '../../core/EventBus';\nimport Constants from '../constants/Constants';\n\nconst GAP_HANDLER_INTERVAL = 100;\nconst THRESHOLD_TO_STALLS = 10;\nconst GAP_JUMP_WAITING_TIME_OFFSET = 0.1;\n\nfunction GapController() {\n const context = this.context;\n const eventBus = EventBus(context).getInstance();\n\n let instance,\n lastPlaybackTime,\n settings,\n wallclockTicked,\n gapHandlerInterval,\n lastGapJumpPosition,\n playbackController,\n streamController,\n videoModel,\n jumpTimeoutHandler,\n trackSwitchByMediaType,\n logger;\n\n function initialize() {\n _registerEvents();\n }\n\n function setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n\n reset();\n }\n\n function reset() {\n _stopGapHandler();\n _unregisterEvents();\n resetInitialSettings();\n }\n\n function resetInitialSettings() {\n gapHandlerInterval = null;\n lastGapJumpPosition = NaN;\n wallclockTicked = 0;\n jumpTimeoutHandler = null;\n trackSwitchByMediaType = {};\n }\n\n function setConfig(config) {\n if (!config) {\n return;\n }\n if (config.settings) {\n settings = config.settings;\n }\n if (config.playbackController) {\n playbackController = config.playbackController;\n }\n if (config.streamController) {\n streamController = config.streamController;\n }\n if (config.videoModel) {\n videoModel = config.videoModel;\n }\n }\n\n function _registerEvents() {\n eventBus.on(Events.WALLCLOCK_TIME_UPDATED, _onWallclockTimeUpdated, this);\n eventBus.on(Events.INITIAL_STREAM_SWITCH, _onInitialStreamSwitch, this);\n eventBus.on(Events.PLAYBACK_SEEKING, _onPlaybackSeeking, this);\n eventBus.on(Events.BUFFER_REPLACEMENT_STARTED, _onBufferReplacementStarted, instance);\n eventBus.on(Events.TRACK_CHANGE_RENDERED, _onBufferReplacementEnded, instance);\n }\n\n function _unregisterEvents() {\n eventBus.off(Events.WALLCLOCK_TIME_UPDATED, _onWallclockTimeUpdated, this);\n eventBus.off(Events.INITIAL_STREAM_SWITCH, _onInitialStreamSwitch, this);\n eventBus.off(Events.PLAYBACK_SEEKING, _onPlaybackSeeking, this);\n eventBus.off(Events.BUFFER_REPLACEMENT_STARTED, _onBufferReplacementStarted, instance);\n eventBus.off(Events.TRACK_CHANGE_RENDERED, _onBufferReplacementEnded, instance);\n }\n\n /**\n * Clear scheduled gap jump when seeking\n * @private\n */\n function _onPlaybackSeeking() {\n if (jumpTimeoutHandler) {\n clearTimeout(jumpTimeoutHandler);\n jumpTimeoutHandler = null;\n }\n }\n\n /**\n * If the track was changed in the current active period and the player might aggressively replace segments the buffer will be empty for a short period of time. Avoid gap jumping at that time.\n * We wait until the next media fragment of the target type has been appended before activating again\n * @param {object} e\n * @private\n */\n function _onBufferReplacementStarted(e) {\n try {\n if (e.streamId !== streamController.getActiveStreamInfo().id || (e.mediaType !== Constants.VIDEO && e.mediaType !== Constants.AUDIO)) {\n return;\n }\n\n if (e.streamId === streamController.getActiveStreamInfo().id) {\n trackSwitchByMediaType[e.mediaType] = true;\n }\n } catch (e) {\n logger.error(e);\n }\n }\n\n /**\n * Activate gap jumping again once segment of target type has been appended\n * @param {object} e\n * @private\n */\n function _onBufferReplacementEnded(e) {\n if (!e || !e.mediaType) {\n return;\n }\n\n trackSwitchByMediaType[e.mediaType] = false;\n }\n\n /**\n * Activate the gap handler after the first stream switch\n * @private\n */\n function _onInitialStreamSwitch() {\n if (!gapHandlerInterval) {\n _startGapHandler();\n }\n }\n\n /**\n * Callback handler for when the wallclock time has been updated\n * @private\n */\n function _onWallclockTimeUpdated(/*e*/) {\n if (!_shouldCheckForGaps(settings.get().streaming.gaps.enableSeekFix)) {\n return;\n }\n\n wallclockTicked++;\n if (wallclockTicked >= THRESHOLD_TO_STALLS) {\n const currentTime = playbackController.getTime();\n if (lastPlaybackTime === currentTime) {\n _jumpGap(currentTime, true);\n } else {\n lastPlaybackTime = currentTime;\n lastGapJumpPosition = NaN;\n }\n wallclockTicked = 0;\n }\n }\n\n /**\n * Returns if we are supposed to check for gaps\n * @param {boolean} checkSeekingState - Usually we are not checking for gaps in the videolement is in seeking state. If this flag is set to true we check for a potential exceptions of this rule.\n * @return {boolean}\n * @private\n */\n function _shouldCheckForGaps(checkSeekingState = false) {\n if (!streamController.getActiveStream()) {\n return false;\n }\n const trackSwitchInProgress = Object.keys(trackSwitchByMediaType).some((key) => {\n return trackSwitchByMediaType[key];\n });\n const shouldIgnoreSeekingState = checkSeekingState ? _shouldIgnoreSeekingState() : false;\n\n return !trackSwitchInProgress && settings.get().streaming.gaps.jumpGaps && streamController.getActiveStreamProcessors().length > 0 && (!playbackController.isSeeking() || shouldIgnoreSeekingState) && !playbackController.isPaused() && !streamController.getIsStreamSwitchInProgress() &&\n !streamController.getHasMediaOrInitialisationError();\n }\n\n /**\n * There are cases in which we never transition out of the seeking state and still need to jump a gap. For instance if the user seeks right before a gap and video element will not transition out of the seeking state.\n * For now limit this to period boundaries. In this case the current period is completely buffered and we are right before the end of the period.\n * @private\n */\n function _shouldIgnoreSeekingState() {\n const activeStream = streamController.getActiveStream();\n const streamEnd = parseFloat((activeStream.getStartTime() + activeStream.getDuration()).toFixed(5))\n\n return playbackController.getTime() + settings.get().streaming.gaps.threshold >= streamEnd;\n }\n\n /**\n * Returns the index of the range object that comes after the current time\n * @param {object} ranges\n * @param {number} currentTime\n * @private\n * @return {null|number}\n */\n function _getNextRangeIndex(ranges, currentTime) {\n try {\n\n if (!ranges || (ranges.length <= 1 && currentTime > 0)) {\n return NaN;\n }\n let nextRangeIndex = NaN;\n let j = 0;\n\n while (isNaN(nextRangeIndex) && j < ranges.length) {\n const rangeEnd = j > 0 ? ranges.end(j - 1) : 0;\n if (currentTime < ranges.start(j) && rangeEnd - currentTime < settings.get().streaming.gaps.threshold) {\n nextRangeIndex = j;\n }\n j += 1;\n }\n return nextRangeIndex;\n\n } catch (e) {\n return null;\n }\n }\n\n /**\n * Check if the currentTime exist within the buffered range\n * @param {object} ranges\n * @param {number} currentTime\n * @private\n * @return {boolean}\n */\n function _isTimeBuffered(ranges, currentTime) {\n for (let i = 0, len = ranges.length; i < len; i++) {\n if (currentTime >= ranges.start(i) && currentTime <= ranges.end(i)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Starts the interval that checks for gaps\n * @private\n */\n function _startGapHandler() {\n try {\n if (!gapHandlerInterval) {\n logger.debug('Starting the gap controller');\n gapHandlerInterval = setInterval(() => {\n if (!_shouldCheckForGaps()) {\n return;\n }\n const currentTime = playbackController.getTime();\n _jumpGap(currentTime);\n\n }, GAP_HANDLER_INTERVAL);\n }\n } catch (e) {\n }\n }\n\n /**\n * Clears the gap interval handler\n * @private\n */\n function _stopGapHandler() {\n logger.debug('Stopping the gap controller');\n if (gapHandlerInterval) {\n clearInterval(gapHandlerInterval);\n gapHandlerInterval = null;\n }\n }\n\n /**\n * Jump a gap\n * @param {number} currentTime\n * @param {boolean} playbackStalled\n * @private\n */\n function _jumpGap(currentTime, playbackStalled = false) {\n const enableStallFix = settings.get().streaming.gaps.enableStallFix;\n const stallSeek = settings.get().streaming.gaps.stallSeek;\n const smallGapLimit = settings.get().streaming.gaps.smallGapLimit;\n const jumpLargeGaps = settings.get().streaming.gaps.jumpLargeGaps;\n const ranges = videoModel.getBufferRange();\n let nextRangeIndex;\n let seekToPosition = NaN;\n let jumpToStreamEnd = false;\n\n\n // Get the range just after current time position\n nextRangeIndex = _getNextRangeIndex(ranges, currentTime);\n\n if (!isNaN(nextRangeIndex)) {\n const start = ranges.start(nextRangeIndex);\n const gap = start - currentTime;\n if (gap > 0 && (gap <= smallGapLimit || jumpLargeGaps)) {\n seekToPosition = start;\n }\n }\n\n // Playback has stalled before period end. We seek to the end of the period\n const timeToStreamEnd = playbackController.getTimeToStreamEnd();\n if (isNaN(seekToPosition) && playbackStalled && isFinite(timeToStreamEnd) && !isNaN(timeToStreamEnd) && timeToStreamEnd < smallGapLimit) {\n seekToPosition = parseFloat(playbackController.getStreamEndTime().toFixed(5));\n jumpToStreamEnd = true;\n }\n\n if (enableStallFix && isNaN(seekToPosition) && playbackStalled && isNaN(nextRangeIndex) && _isTimeBuffered(ranges, currentTime)) {\n if (stallSeek === 0) {\n logger.warn(`Toggle play pause to break stall`);\n videoModel.pause();\n videoModel.play();\n } else {\n logger.warn(`Jumping ${stallSeek}s to break stall`);\n seekToPosition = currentTime + stallSeek;\n }\n }\n\n if (seekToPosition > 0 && lastGapJumpPosition !== seekToPosition && seekToPosition > currentTime && !jumpTimeoutHandler) {\n const timeUntilGapEnd = seekToPosition - currentTime;\n\n if (jumpToStreamEnd) {\n const nextStream = streamController.getStreamForTime(seekToPosition);\n const internalSeek = nextStream && !!nextStream.getPreloaded();\n\n logger.warn(`Jumping to end of stream because of gap from ${currentTime} to ${seekToPosition}. Gap duration: ${timeUntilGapEnd}`);\n playbackController.seek(seekToPosition, true, internalSeek);\n } else {\n const isDynamic = playbackController.getIsDynamic();\n const start = nextRangeIndex > 0 ? ranges.end(nextRangeIndex - 1) : currentTime;\n const timeToWait = !isDynamic ? 0 : Math.max(0, timeUntilGapEnd - GAP_JUMP_WAITING_TIME_OFFSET) * 1000;\n\n jumpTimeoutHandler = window.setTimeout(() => {\n playbackController.seek(seekToPosition, true, true);\n logger.warn(`Jumping gap occuring in period ${streamController.getActiveStream().getStreamId()} starting at ${start} and ending at ${seekToPosition}. Jumping by: ${seekToPosition - start}`);\n jumpTimeoutHandler = null;\n }, timeToWait);\n }\n lastGapJumpPosition = seekToPosition;\n }\n }\n\n instance = {\n reset,\n setConfig,\n initialize\n };\n\n setup();\n\n return instance;\n}\n\nGapController.__dashjs_factory_name = 'GapController';\nexport default FactoryMaker.getSingletonFactory(GapController);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport FactoryMaker from '../../core/FactoryMaker';\nimport Debug from '../../core/Debug';\nimport EventBus from '../../core/EventBus';\nimport Constants from '../constants/Constants';\nimport MediaPlayerEvents from '../MediaPlayerEvents';\nimport Events from '../../core/events/Events';\nimport MetricsConstants from '../constants/MetricsConstants';\nimport Utils from '../../core/Utils';\n\nfunction CatchupController() {\n const context = this.context;\n const eventBus = EventBus(context).getInstance();\n\n let instance,\n isCatchupSeekInProgress,\n isSafari,\n videoModel,\n settings,\n streamController,\n playbackController,\n mediaPlayerModel,\n playbackStalled,\n logger;\n\n function initialize() {\n _registerEvents();\n _checkPlaybackRates();\n }\n\n function setConfig(config) {\n if (!config) {\n return;\n }\n\n if (config.settings) {\n settings = config.settings;\n }\n\n if (config.videoModel) {\n videoModel = config.videoModel;\n }\n\n if (config.streamController) {\n streamController = config.streamController;\n }\n\n if (config.playbackController) {\n playbackController = config.playbackController;\n }\n\n if (config.mediaPlayerModel) {\n mediaPlayerModel = config.mediaPlayerModel;\n }\n }\n\n function _registerEvents() {\n eventBus.on(MediaPlayerEvents.BUFFER_LEVEL_UPDATED, _onBufferLevelUpdated, instance);\n eventBus.on(MediaPlayerEvents.BUFFER_LEVEL_STATE_CHANGED, _onBufferLevelStateChanged, instance);\n eventBus.on(MediaPlayerEvents.PLAYBACK_PROGRESS, _onPlaybackProgression, instance);\n eventBus.on(MediaPlayerEvents.PLAYBACK_TIME_UPDATED, _onPlaybackProgression, instance);\n eventBus.on(MediaPlayerEvents.PLAYBACK_SEEKED, _onPlaybackSeeked, instance);\n eventBus.on(Events.SETTING_UPDATED_CATCHUP_ENABLED, _onCatchupSettingUpdated, instance);\n eventBus.on(Events.SETTING_UPDATED_PLAYBACK_RATE_MIN, _checkPlaybackRates, instance);\n eventBus.on(Events.SETTING_UPDATED_PLAYBACK_RATE_MAX, _checkPlaybackRates, instance);\n eventBus.on(MediaPlayerEvents.STREAM_INITIALIZED, _checkPlaybackRates, instance);\n }\n\n function _unregisterEvents() {\n eventBus.off(MediaPlayerEvents.BUFFER_LEVEL_UPDATED, _onBufferLevelUpdated, instance);\n eventBus.off(MediaPlayerEvents.BUFFER_LEVEL_STATE_CHANGED, _onBufferLevelStateChanged, instance);\n eventBus.off(MediaPlayerEvents.PLAYBACK_PROGRESS, _onPlaybackProgression, instance);\n eventBus.off(MediaPlayerEvents.PLAYBACK_TIME_UPDATED, _onPlaybackProgression, instance);\n eventBus.off(MediaPlayerEvents.PLAYBACK_SEEKED, _onPlaybackSeeked, instance);\n eventBus.off(Events.SETTING_UPDATED_CATCHUP_ENABLED, _onCatchupSettingUpdated, instance);\n eventBus.off(Events.SETTING_UPDATED_PLAYBACK_RATE_MIN, _checkPlaybackRates, instance);\n eventBus.off(Events.SETTING_UPDATED_PLAYBACK_RATE_MAX, _checkPlaybackRates, instance);\n eventBus.off(MediaPlayerEvents.STREAM_INITIALIZED, _checkPlaybackRates, instance);\n }\n\n function setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n\n _resetInitialSettings();\n }\n\n function reset() {\n _unregisterEvents();\n _resetInitialSettings();\n videoModel.setPlaybackRate(1.0, true);\n }\n\n function _resetInitialSettings() {\n isCatchupSeekInProgress = false;\n const ua = Utils.parseUserAgent();\n isSafari = ua && ua.browser && ua.browser.name && ua.browser.name.toLowerCase() === 'safari';\n }\n\n\n function _onPlaybackSeeked() {\n isCatchupSeekInProgress = false;\n }\n\n /**\n * When the buffer level updated we check if we can remove the stalled state\n * @param {object} e\n * @private\n */\n function _onBufferLevelUpdated(e) {\n // do not stop when getting an event from Stream that is not active\n if (e.streamId !== streamController.getActiveStreamInfo().id || !playbackStalled) {\n return;\n }\n\n // we remove the stalled state once we reach a certain buffer level\n const liveDelay = playbackController.getLiveDelay();\n const bufferLevel = playbackController.getBufferLevel();\n if (bufferLevel > liveDelay / 2) {\n playbackStalled = false;\n }\n }\n\n /**\n * When the buffer state changed to BUFFER_EMPTY we update the stalled state\n * @param {object} e\n * @private\n */\n function _onBufferLevelStateChanged(e) {\n // do not stop when getting an event from Stream that is not active\n if (e.streamId !== streamController.getActiveStreamInfo().id) {\n return;\n }\n\n playbackStalled = e.state === MetricsConstants.BUFFER_EMPTY;\n }\n\n /**\n * If the catchup mode is disabled in the settings we reset playback rate to 1.0\n * @private\n */\n function _onCatchupSettingUpdated() {\n if (!mediaPlayerModel.getCatchupModeEnabled()) {\n videoModel.setPlaybackRate(1.0);\n }\n }\n\n /**\n * While playback is progressing we check if we need to start or stop the catchup mechanism to reach the target latency\n * @private\n */\n function _onPlaybackProgression() {\n if (\n playbackController.getIsDynamic() &&\n mediaPlayerModel.getCatchupModeEnabled() &&\n ((mediaPlayerModel.getCatchupPlaybackRates().max > 0) || (mediaPlayerModel.getCatchupPlaybackRates().min < 0)) &&\n !playbackController.isPaused() &&\n !playbackController.isSeeking() && _shouldStartCatchUp()\n ) {\n _startPlaybackCatchUp();\n }\n }\n\n /**\n * Apply catchup mode. We either seek back to the target live edge or increase the playback rate.\n */\n function _startPlaybackCatchUp() {\n\n // we are seeking dont do anything for now\n if (isCatchupSeekInProgress) {\n return;\n }\n\n if (videoModel) {\n let newRate;\n const currentPlaybackRate = videoModel.getPlaybackRate();\n const liveCatchupPlaybackRates = mediaPlayerModel.getCatchupPlaybackRates();\n const bufferLevel = playbackController.getBufferLevel();\n const deltaLatency = _getLatencyDrift();\n\n // we reached the maxDrift. Do a seek\n const maxDrift = mediaPlayerModel.getCatchupMaxDrift();\n if (!isNaN(maxDrift) && maxDrift > 0 &&\n deltaLatency > maxDrift) {\n logger.info('[CatchupController]: Low Latency catchup mechanism. Latency too high, doing a seek to live point');\n isCatchupSeekInProgress = true;\n playbackController.seekToCurrentLive(true, false);\n }\n\n // try to reach the target latency by adjusting the playback rate\n else {\n const currentLiveLatency = playbackController.getCurrentLiveLatency();\n const targetLiveDelay = playbackController.getLiveDelay();\n\n if (_getCatchupMode() === Constants.LIVE_CATCHUP_MODE_LOLP) {\n // Custom playback control: Based on buffer level\n const playbackBufferMin = settings.get().streaming.liveCatchup.playbackBufferMin;\n newRate = _calculateNewPlaybackRateLolP(liveCatchupPlaybackRates, currentLiveLatency, targetLiveDelay, playbackBufferMin, bufferLevel);\n } else {\n // Default playback control: Based on target and current latency\n newRate = _calculateNewPlaybackRateDefault(liveCatchupPlaybackRates, currentLiveLatency, targetLiveDelay, bufferLevel);\n }\n\n // We adjust the min change linear, depending on the maximum catchup rate. Default is 0.02 for rate 0.5.\n // For Safari we stick to a fixed value because of https://bugs.webkit.org/show_bug.cgi?id=208142\n const minPlaybackRateChange = isSafari ? 0.25 : 0.02 / (0.5 / liveCatchupPlaybackRates.max);\n\n // Obtain newRate and apply to video model. Don't change playbackrate for small variations (don't overload element with playbackrate changes)\n if (newRate && Math.abs(currentPlaybackRate - newRate) >= minPlaybackRateChange) { // non-null\n logger.debug(`[CatchupController]: Setting playback rate to ${newRate}`);\n videoModel.setPlaybackRate(newRate);\n }\n }\n }\n }\n\n /**\n * Calculates the drift between the current latency and the target latency\n * @return {number}\n * @private\n */\n function _getLatencyDrift() {\n const currentLiveLatency = playbackController.getCurrentLiveLatency();\n const targetLiveDelay = playbackController.getLiveDelay();\n\n return currentLiveLatency - targetLiveDelay;\n }\n\n /**\n * Checks whether the catchup mechanism should be enabled. We use different subfunctions here depending on the catchup mode.\n * @return {boolean}\n */\n function _shouldStartCatchUp() {\n try {\n if (!playbackController.getTime() > 0 || isCatchupSeekInProgress) {\n return false;\n }\n\n const catchupMode = _getCatchupMode();\n\n if (catchupMode === Constants.LIVE_CATCHUP_MODE_LOLP) {\n const currentBuffer = playbackController.getBufferLevel();\n const playbackBufferMin = settings.get().streaming.liveCatchup.playbackBufferMin;\n\n return _lolpNeedToCatchUpCustom(currentBuffer, playbackBufferMin);\n } else {\n return _defaultNeedToCatchUp();\n }\n\n } catch (e) {\n return false;\n }\n }\n\n\n /**\n * Returns the mode for live playback catchup.\n * @return {String}\n * @private\n */\n function _getCatchupMode() {\n const playbackBufferMin = settings.get().streaming.liveCatchup.playbackBufferMin;\n\n return settings.get().streaming.liveCatchup.mode === Constants.LIVE_CATCHUP_MODE_LOLP && playbackBufferMin !== null && !isNaN(playbackBufferMin) ? Constants.LIVE_CATCHUP_MODE_LOLP : Constants.LIVE_CATCHUP_MODE_DEFAULT;\n }\n\n /**\n * Default algorithm to determine if catchup mode should be enabled\n * @return {boolean}\n * @private\n */\n function _defaultNeedToCatchUp() {\n try {\n const latencyDrift = Math.abs(_getLatencyDrift());\n\n return latencyDrift > 0;\n } catch (e) {\n return false;\n }\n }\n\n /**\n * LoL+ logic to determine if catchup mode should be enabled\n * @param {number} currentBuffer\n * @param {number} playbackBufferMin\n * @return {boolean}\n * @private\n */\n function _lolpNeedToCatchUpCustom(currentBuffer, playbackBufferMin) {\n try {\n const latencyDrift = Math.abs(_getLatencyDrift());\n\n return latencyDrift > 0 || currentBuffer < playbackBufferMin;\n } catch (e) {\n return false;\n }\n }\n\n /**\n * Default algorithm to calculate the new playback rate\n * @param {object} liveCatchUpPlaybackRates\n * @param {number} liveCatchUpPlaybackRates.min - minimum playback rate decrease limit\n * @param {number} liveCatchUpPlaybackRates.max - maximum playback rate increase limit\n * @param {number} currentLiveLatency\n * @param {number} liveDelay\n * @param {number} bufferLevel\n * @param {number} currentPlaybackRate\n * @return {number}\n * @private\n */\n function _calculateNewPlaybackRateDefault(liveCatchUpPlaybackRates, currentLiveLatency, liveDelay, bufferLevel) {\n // if we recently ran into an empty buffer we wait for the buffer to recover before applying a new rate\n if (playbackStalled) {\n return 1.0;\n }\n\n const deltaLatency = currentLiveLatency - liveDelay;\n const cpr = (deltaLatency < 0) ? Math.abs(liveCatchUpPlaybackRates.min) : liveCatchUpPlaybackRates.max;\n const d = deltaLatency * 5;\n\n // Playback rate must be between (1 - cpr) - (1 + cpr)\n // ex: if cpr is 0.5, it can have values between 0.5 - 1.5\n const s = (cpr * 2) / (1 + Math.pow(Math.E, -d));\n let newRate = (1 - cpr) + s;\n // take into account situations in which there are buffer stalls,\n // in which increasing playbackRate to reach target latency will\n // just cause more and more stall situations\n if (playbackController.getPlaybackStalled()) {\n if (bufferLevel <= liveDelay / 2 && deltaLatency > 0) {\n newRate = 1.0;\n }\n }\n\n return newRate;\n }\n\n /**\n * Lol+ algorithm to calculate the new playback rate\n * @param {object} liveCatchUpPlaybackRates\n * @param {number} liveCatchUpPlaybackRates.min - minimum playback rate decrease limit\n * @param {number} liveCatchUpPlaybackRates.max - maximum playback rate increase limit\n * @param {number} currentLiveLatency\n * @param {number} liveDelay\n * @param {number} playbackBufferMin\n * @param {number} bufferLevel\n * @param {number} currentPlaybackRate\n * @return {number}\n * @private\n */\n function _calculateNewPlaybackRateLolP(liveCatchUpPlaybackRates, currentLiveLatency, liveDelay, playbackBufferMin, bufferLevel) {\n let newRate;\n\n // Hybrid: Buffer-based\n if (bufferLevel < playbackBufferMin) {\n // Buffer in danger, slow down\n const cpr = Math.abs(liveCatchUpPlaybackRates.min); // Absolute value as negative delta value will be used.\n const deltaBuffer = bufferLevel - playbackBufferMin; // -ve value\n const d = deltaBuffer * 5;\n\n // Playback rate must be between (1 - cpr) - (1 + cpr)\n // ex: if cpr is 0.5, it can have values between 0.5 - 1.5\n const s = (cpr * 2) / (1 + Math.pow(Math.E, -d));\n newRate = (1 - cpr) + s;\n\n logger.debug('[LoL+ playback control_buffer-based] bufferLevel: ' + bufferLevel + ', newRate: ' + newRate);\n } else {\n // Hybrid: Latency-based\n // Check if latency is within range of target latency\n const minDifference = 0.02;\n if (Math.abs(currentLiveLatency - liveDelay) <= (minDifference * liveDelay)) {\n newRate = 1;\n } else {\n const deltaLatency = currentLiveLatency - liveDelay;\n // Buffer is safe, vary playback rate based on latency\n const cpr = (deltaLatency < 0) ? Math.abs(liveCatchUpPlaybackRates.min) : liveCatchUpPlaybackRates.max;\n const d = deltaLatency * 5;\n\n // Playback rate must be between (1 - cpr) - (1 + cpr)\n // ex: if cpr is 0.5, it can have values between 0.5 - 1.5\n const s = (cpr * 2) / (1 + Math.pow(Math.E, -d));\n newRate = (1 - cpr) + s;\n }\n\n logger.debug('[LoL+ playback control_latency-based] latency: ' + currentLiveLatency + ', newRate: ' + newRate);\n }\n\n return newRate\n }\n\n function _checkPlaybackRates() {\n mediaPlayerModel.getCatchupPlaybackRates(true);\n }\n\n instance = {\n reset,\n setConfig,\n initialize\n };\n\n setup();\n\n return instance;\n}\n\nCatchupController.__dashjs_factory_name = 'CatchupController';\nexport default FactoryMaker.getSingletonFactory(CatchupController);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport FactoryMaker from '../../core/FactoryMaker';\nimport Debug from '../../core/Debug';\nimport Constants from '../../streaming/constants/Constants';\nimport DashConstants from '../constants/DashConstants';\n\nconst SUPPORTED_SCHEMES = [Constants.SERVICE_DESCRIPTION_DVB_LL_SCHEME];\nconst MEDIA_TYPES = {\n VIDEO: 'video',\n AUDIO: 'audio',\n ANY: 'any',\n ALL: 'all'\n}\n\nfunction ServiceDescriptionController() {\n const context = this.context;\n\n let instance,\n serviceDescriptionSettings,\n prftOffsets,\n logger,\n adapter;\n\n function setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n _resetInitialSettings();\n }\n\n function setConfig(config) {\n if (!config) return;\n\n if (config.adapter) {\n adapter = config.adapter;\n }\n }\n\n function reset() {\n _resetInitialSettings();\n }\n\n function _resetInitialSettings() {\n serviceDescriptionSettings = {\n liveDelay: NaN,\n liveCatchup: {\n maxDrift: NaN,\n playbackRate: {\n min: NaN,\n max: NaN\n },\n },\n minBitrate: {},\n maxBitrate: {},\n initialBitrate: {},\n contentSteering: null\n };\n prftOffsets = [];\n }\n\n /**\n * Returns the service description settings for latency, catchup and bandwidth\n */\n function getServiceDescriptionSettings() {\n return serviceDescriptionSettings\n }\n\n /**\n * Check for potential ServiceDescriptor elements in the MPD and update the settings accordingly\n * @param {object} manifestInfo\n * @private\n */\n function applyServiceDescription(manifestInfo) {\n if (!manifestInfo || !manifestInfo.serviceDescriptions) {\n return;\n }\n\n const supportedServiceDescriptions = manifestInfo.serviceDescriptions.filter(sd => SUPPORTED_SCHEMES.includes(sd.schemeIdUri));\n const allClientsServiceDescriptions = manifestInfo.serviceDescriptions.filter(sd => sd.schemeIdUri == null);\n let sd = (supportedServiceDescriptions.length > 0)\n ? supportedServiceDescriptions[supportedServiceDescriptions.length - 1]\n : allClientsServiceDescriptions[allClientsServiceDescriptions.length - 1];\n if (!sd) return;\n\n if (sd.latency && sd.latency.target > 0) {\n _applyServiceDescriptionLatency(sd);\n }\n\n if (sd.playbackRate) {\n _applyServiceDescriptionPlaybackRate(sd);\n }\n\n if (sd.operatingQuality) {\n _applyServiceDescriptionOperatingQuality(sd);\n }\n\n if (sd.operatingBandwidth) {\n _applyServiceDescriptionOperatingBandwidth(sd);\n }\n\n if (sd.contentSteering) {\n _applyServiceDescriptionContentSteering(sd);\n }\n }\n\n /**\n * Adjust the latency targets for the service.\n * @param {object} sd - service description element\n * @private\n */\n function _applyServiceDescriptionLatency(sd) {\n let params;\n\n if (sd.schemeIdUri === Constants.SERVICE_DESCRIPTION_DVB_LL_SCHEME) {\n params = _getDvbServiceDescriptionLatencyParameters(sd);\n } else {\n params = _getStandardServiceDescriptionLatencyParameters(sd);\n }\n\n if (prftOffsets.length > 0) {\n let { to, id } = _calculateTimeOffset(params);\n\n // TS 103 285 Clause 10.20.4. 3) Subtract calculated offset from Latency@target converted from milliseconds\n // liveLatency does not consider ST@availabilityTimeOffset so leave out that step\n // Since maxDrift is a difference rather than absolute it does not need offset applied\n serviceDescriptionSettings.liveDelay = params.liveDelay - to;\n serviceDescriptionSettings.liveCatchup.maxDrift = params.maxDrift;\n\n logger.debug(`\n Found latency properties coming from service description. Applied time offset of ${to} from ProducerReferenceTime element with id ${id}.\n Live Delay: ${params.liveDelay - to}, Live catchup max drift: ${params.maxDrift}\n `);\n } else {\n serviceDescriptionSettings.liveDelay = params.liveDelay;\n serviceDescriptionSettings.liveCatchup.maxDrift = params.maxDrift;\n\n logger.debug(`Found latency properties coming from service description: Live Delay: ${params.liveDelay}, Live catchup max drift: ${params.maxDrift}`);\n }\n }\n\n /**\n * Get default parameters for liveDelay,maxDrift\n * @param {object} sd\n * @return {{maxDrift: (number|undefined), liveDelay: number, referenceId: (number|undefined)}}\n * @private\n */\n function _getStandardServiceDescriptionLatencyParameters(sd) {\n const liveDelay = sd.latency.target / 1000;\n let maxDrift = !isNaN(sd.latency.max) && sd.latency.max > sd.latency.target ? (sd.latency.max - sd.latency.target + 500) / 1000 : NaN;\n const referenceId = sd.latency.referenceId || NaN;\n\n return {\n liveDelay,\n maxDrift,\n referenceId\n }\n }\n\n /**\n * Get DVB DASH parameters for liveDelay,maxDrift\n * @param sd\n * @return {{maxDrift: (number|undefined), liveDelay: number, referenceId: (number|undefined)}}\n * @private\n */\n function _getDvbServiceDescriptionLatencyParameters(sd) {\n const liveDelay = sd.latency.target / 1000;\n let maxDrift = !isNaN(sd.latency.max) && sd.latency.max > sd.latency.target ? (sd.latency.max - sd.latency.target + 500) / 1000 : NaN;\n const referenceId = sd.latency.referenceId || NaN;\n\n return {\n liveDelay,\n maxDrift,\n referenceId\n }\n }\n\n /**\n * Adjust the playback rate targets for the service\n * @param {object} sd\n * @private\n */\n function _applyServiceDescriptionPlaybackRate(sd) {\n // Convert each playback rate into a difference from 1. i.e 0.8 becomes -0.2.\n const min = sd.playbackRate.min ? (Math.round((sd.playbackRate.min - 1.0) * 1000) / 1000) : NaN;\n const max = sd.playbackRate.max ? (Math.round((sd.playbackRate.max - 1.0) * 1000) / 1000) : NaN;\n serviceDescriptionSettings.liveCatchup.playbackRate.min = min;\n serviceDescriptionSettings.liveCatchup.playbackRate.max = max;\n\n logger.debug(`Found latency properties coming from service description: Live catchup min playback rate: ${min}`);\n logger.debug(`Found latency properties coming from service description: Live catchup max playback rate: ${max}`);\n }\n\n /**\n * Used to specify a quality ranking. We do not support this yet.\n * @private\n */\n function _applyServiceDescriptionOperatingQuality() {\n return;\n }\n\n /**\n * Adjust the operating quality targets for the service\n * @param {object} sd\n * @private\n */\n function _applyServiceDescriptionOperatingBandwidth(sd) {\n\n // Aggregation of media types is not supported yet\n if (!sd || !sd.operatingBandwidth || !sd.operatingBandwidth.mediaType || sd.operatingBandwidth.mediaType === MEDIA_TYPES.ALL) {\n return;\n }\n\n const params = {};\n\n params.minBandwidth = sd.operatingBandwidth.min;\n params.maxBandwidth = sd.operatingBandwidth.max;\n params.targetBandwidth = sd.operatingBandwidth.target;\n\n const mediaTypesToApply = [];\n\n if (sd.operatingBandwidth.mediaType === MEDIA_TYPES.VIDEO || sd.operatingBandwidth.mediaType === MEDIA_TYPES.AUDIO) {\n mediaTypesToApply.push(sd.operatingBandwidth.mediaType);\n } else if (sd.operatingBandwidth.mediaType === MEDIA_TYPES.ANY) {\n mediaTypesToApply.push(MEDIA_TYPES.AUDIO);\n mediaTypesToApply.push(MEDIA_TYPES.VIDEO);\n }\n\n mediaTypesToApply.forEach((mediaType) => {\n\n if (!isNaN(params.minBandwidth)) {\n _updateBandwidthSetting('minBitrate', mediaType, params.minBandwidth);\n }\n\n if (!isNaN(params.maxBandwidth)) {\n _updateBandwidthSetting('maxBitrate', mediaType, params.maxBandwidth);\n }\n\n if (!isNaN(params.targetBandwidth)) {\n _updateBandwidthSetting('initialBitrate', mediaType, params.targetBandwidth);\n }\n })\n }\n\n /**\n * Update the bandwidth settings vor a specific field and media type\n * @param {string} field\n * @param {string} mediaType\n * @param {number} value\n * @private\n */\n function _updateBandwidthSetting(field, mediaType, value) {\n try {\n // Service description values are specified in bps. Settings expect the value in kbps\n serviceDescriptionSettings[field][mediaType] = value / 1000;\n } catch (e) {\n logger.error(e);\n }\n }\n\n /**\n * Add information about content steering element. Handling is up to the ContentSteeringController\n * @param {object} sd\n * @private\n */\n function _applyServiceDescriptionContentSteering(sd) {\n serviceDescriptionSettings.contentSteering = sd.contentSteering;\n }\n\n /**\n * Returns the current calculated time offsets based on ProducerReferenceTime elements\n * @returns {array}\n */\n function getProducerReferenceTimeOffsets() {\n return prftOffsets;\n }\n\n /**\n * Calculates an array of time offsets each with matching ProducerReferenceTime id.\n * Call before applyServiceDescription if producer reference time elements should be considered.\n * @param {array} streamInfos\n * @returns {array}\n * @private\n */\n function calculateProducerReferenceTimeOffsets(streamInfos) {\n try {\n let timeOffsets = [];\n if (streamInfos && streamInfos.length > 0) {\n const mediaTypes = [Constants.VIDEO, Constants.AUDIO, Constants.TEXT];\n const astInSeconds = adapter.getAvailabilityStartTime() / 1000;\n\n streamInfos.forEach((streamInfo) => {\n const offsets = mediaTypes\n .reduce((acc, mediaType) => {\n acc = acc.concat(adapter.getAllMediaInfoForType(streamInfo, mediaType));\n return acc;\n }, [])\n .reduce((acc, mediaInfo) => {\n const prts = adapter.getProducerReferenceTimes(streamInfo, mediaInfo);\n prts.forEach((prt) => {\n const voRepresentations = adapter.getVoRepresentations(mediaInfo);\n if (voRepresentations && voRepresentations.length > 0 && voRepresentations[0].adaptation && voRepresentations[0].segmentInfoType === DashConstants.SEGMENT_TEMPLATE) {\n const voRep = voRepresentations[0];\n const d = new Date(prt[DashConstants.WALL_CLOCK_TIME]);\n const wallClockTime = d.getTime() / 1000;\n // TS 103 285 Clause 10.20.4\n // 1) Calculate PRT0\n // i) take the PRT@presentationTime and subtract any ST@presentationTimeOffset\n // ii) convert this time to seconds by dividing by ST@timescale\n // iii) Add this to start time of period that contains PRT.\n // N.B presentationTimeOffset is already divided by timescale at this point\n const prt0 = wallClockTime - (((prt[DashConstants.PRESENTATION_TIME] / voRep[DashConstants.TIMESCALE]) - voRep[DashConstants.PRESENTATION_TIME_OFFSET]) + streamInfo.start);\n // 2) Calculate TO between PRT at the start of MPD timeline and the AST\n const to = astInSeconds - prt0;\n // 3) Not applicable as liveLatency does not consider ST@availabilityTimeOffset\n acc.push({ id: prt[DashConstants.ID], to });\n }\n });\n return acc;\n }, [])\n\n timeOffsets = timeOffsets.concat(offsets);\n })\n }\n prftOffsets = timeOffsets;\n } catch (e) {\n logger.error(e);\n prftOffsets = [];\n }\n };\n\n /**\n * Calculates offset to apply to live delay as described in TS 103 285 Clause 10.20.4\n * @param {object} sdLatency - service description latency element\n * @returns {number}\n * @private\n */\n function _calculateTimeOffset(sdLatency) {\n let to = 0, id;\n let offset = prftOffsets.filter(prt => {\n return prt.id === sdLatency.referenceId;\n });\n\n // If only one ProducerReferenceTime to generate one TO, then use that regardless of matching ids\n if (offset.length === 0) {\n to = (prftOffsets.length > 0) ? prftOffsets[0].to : 0;\n id = prftOffsets[0].id || NaN;\n } else {\n // If multiple id matches, use the first but this should be invalid\n to = offset[0].to || 0;\n id = offset[0].id || NaN;\n }\n\n return { to, id }\n }\n\n instance = {\n getServiceDescriptionSettings,\n getProducerReferenceTimeOffsets,\n calculateProducerReferenceTimeOffsets,\n applyServiceDescription,\n reset,\n setConfig\n };\n\n setup();\n\n return instance;\n}\n\nServiceDescriptionController.__dashjs_factory_name = 'ServiceDescriptionController';\nexport default FactoryMaker.getSingletonFactory(ServiceDescriptionController);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport Constants from '../constants/Constants';\nimport Events from '../../core/events/Events';\nimport EventBus from '../../core/EventBus';\nimport FactoryMaker from '../../core/FactoryMaker';\nimport Debug from '../../core/Debug';\nimport bcp47Normalize from 'bcp-47-normalize';\nimport {extendedFilter} from 'bcp-47-match';\n\nfunction MediaController() {\n\n const context = this.context;\n const eventBus = EventBus(context).getInstance();\n\n let instance,\n logger,\n tracks,\n settings,\n initialSettings,\n lastSelectedTracks,\n customParametersModel,\n domStorage;\n\n function setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n reset();\n }\n\n /**\n * @param {string} type\n * @param {StreamInfo} streamInfo\n * @memberof MediaController#\n */\n function setInitialMediaSettingsForType(type, streamInfo) {\n let settings = lastSelectedTracks[type] || getInitialSettings(type);\n const tracksForType = getTracksFor(type, streamInfo.id);\n let tracks = [];\n\n if (!settings) {\n settings = domStorage.getSavedMediaSettings(type);\n if (settings) {\n // If the settings are defined locally, do not take codec into account or it'll be too strict.\n // eg: An audio track should not be selected by codec but merely by lang.\n delete settings.codec;\n }\n setInitialSettings(type, settings);\n }\n\n if (!tracksForType || (tracksForType.length === 0)) return;\n\n if (settings) {\n tracks = Array.from(tracksForType);\n\n tracks = filterTracksBySettings(tracks, matchSettingsLang, settings);\n tracks = filterTracksBySettings(tracks, matchSettingsIndex, settings);\n tracks = filterTracksBySettings(tracks, matchSettingsViewPoint, settings);\n if (!(type === Constants.AUDIO && !!lastSelectedTracks[type])) {\n tracks = filterTracksBySettings(tracks, matchSettingsRole, settings);\n }\n tracks = filterTracksBySettings(tracks, matchSettingsAccessibility, settings);\n tracks = filterTracksBySettings(tracks, matchSettingsAudioChannelConfig, settings);\n tracks = filterTracksBySettings(tracks, matchSettingsCodec, settings);\n }\n\n if (tracks.length === 0) {\n setTrack(selectInitialTrack(type, tracksForType), true);\n } else {\n if (tracks.length > 1) {\n setTrack(selectInitialTrack(type, tracks));\n } else {\n setTrack(tracks[0]);\n }\n }\n }\n\n /**\n * @param {MediaInfo} track\n * @memberof MediaController#\n */\n function addTrack(track) {\n if (!track) return;\n\n const mediaType = track.type;\n if (!_isMultiTrackSupportedByType(mediaType)) return;\n\n let streamId = track.streamInfo.id;\n if (!tracks[streamId]) {\n tracks[streamId] = createTrackInfo();\n }\n\n const mediaTracks = tracks[streamId][mediaType].list;\n for (let i = 0, len = mediaTracks.length; i < len; ++i) {\n //track is already set.\n if (isTracksEqual(mediaTracks[i], track)) {\n return;\n }\n }\n\n mediaTracks.push(track);\n }\n\n /**\n * @param {string} type\n * @param {string} streamId\n * @returns {Array}\n * @memberof MediaController#\n */\n function getTracksFor(type, streamId) {\n if (!type) return [];\n\n if (!tracks[streamId] || !tracks[streamId][type]) return [];\n\n return tracks[streamId][type].list;\n }\n\n /**\n * @param {string} type\n * @param {string} streamId\n * @returns {Object|null}\n * @memberof MediaController#\n */\n function getCurrentTrackFor(type, streamId) {\n if (!type || !tracks[streamId] || !tracks[streamId][type]) return null;\n return tracks[streamId][type].current;\n }\n\n /**\n * @param {MediaInfo} track\n * @returns {boolean}\n * @memberof MediaController#\n */\n function isCurrentTrack(track) {\n if (!track) {\n return false;\n }\n const type = track.type;\n const id = track.streamInfo.id;\n\n return (tracks[id] && tracks[id][type] && isTracksEqual(tracks[id][type].current, track));\n }\n\n /**\n * @param {MediaInfo} track\n * @param {boolean} noSettingsSave specify if settings must be not be saved\n * @memberof MediaController#\n */\n function setTrack(track, noSettingsSave = false) {\n if (!track || !track.streamInfo) return;\n\n const type = track.type;\n const streamInfo = track.streamInfo;\n const id = streamInfo.id;\n const current = getCurrentTrackFor(type, id);\n\n if (!tracks[id] || !tracks[id][type]) return;\n\n tracks[id][type].current = track;\n\n if (tracks[id][type].current && ((type !== Constants.TEXT && !isTracksEqual(track, current)) || (type === Constants.TEXT && track.isFragmented))) {\n eventBus.trigger(Events.CURRENT_TRACK_CHANGED, {\n oldMediaInfo: current,\n newMediaInfo: track,\n switchMode: settings.get().streaming.trackSwitchMode[type]\n }, { streamId: id });\n }\n\n if (!noSettingsSave) {\n\n let settings = extractSettings(track);\n\n if (!settings || !tracks[id][type].storeLastSettings) return;\n\n if (settings.roles) {\n settings.role = settings.roles[0];\n delete settings.roles;\n }\n\n if (settings.accessibility) {\n settings.accessibility = settings.accessibility[0];\n }\n\n if (settings.audioChannelConfiguration) {\n settings.audioChannelConfiguration = settings.audioChannelConfiguration[0];\n }\n\n lastSelectedTracks[type] = settings;\n domStorage.setSavedMediaSettings(type, settings);\n }\n }\n\n /**\n * @param {string} type\n * @param {Object} value\n * @memberof MediaController#\n */\n function setInitialSettings(type, value) {\n if (!type || !value) return;\n\n initialSettings[type] = value;\n }\n\n /**\n * @param {string} type\n * @returns {Object|null}\n * @memberof MediaController#\n */\n function getInitialSettings(type) {\n if (!type) return null;\n\n return initialSettings[type];\n }\n\n /**\n * @memberof MediaController#\n */\n function saveTextSettingsDisabled() {\n domStorage.setSavedMediaSettings(Constants.TEXT, null);\n }\n\n /**\n * @param {string} type\n * @returns {boolean}\n * @memberof MediaController#\n */\n function _isMultiTrackSupportedByType(type) {\n return (type === Constants.AUDIO || type === Constants.VIDEO || type === Constants.TEXT || type === Constants.IMAGE);\n }\n\n /**\n * @param {MediaInfo} t1 - first track to compare\n * @param {MediaInfo} t2 - second track to compare\n * @returns {boolean}\n * @memberof MediaController#\n */\n function isTracksEqual(t1, t2) {\n if (!t1 && !t2) {\n return true;\n }\n\n if (!t1 || !t2) {\n return false;\n }\n\n const sameId = t1.id === t2.id;\n const sameViewpoint = t1.viewpoint === t2.viewpoint;\n const sameViewpointDescriptors = JSON.stringify(t1.viewpointsWithSchemeIdUri) === JSON.stringify(t2.viewpointsWithSchemeIdUri);\n const sameLang = t1.lang === t2.lang;\n const sameCodec = t1.codec === t2.codec;\n const sameRoles = t1.roles.toString() === t2.roles.toString();\n const sameRoleDescriptors = JSON.stringify(t1.rolesWithSchemeIdUri) === JSON.stringify(t2.rolesWithSchemeIdUri);\n const sameAccessibility = t1.accessibility.toString() === t2.accessibility.toString();\n const sameAccessibilityDescriptors = JSON.stringify(t1.accessibilitiesWithSchemeIdUri) === JSON.stringify(t2.accessibilitiesWithSchemeIdUri);\n const sameAudioChannelConfiguration = t1.audioChannelConfiguration.toString() === t2.audioChannelConfiguration.toString();\n const sameAudioChannelConfigurationDescriptors = JSON.stringify(t1.audioChannelConfigurationsWithSchemeIdUri) === JSON.stringify(t2.audioChannelConfigurationsWithSchemeIdUri);\n\n return (sameId && sameCodec && sameViewpoint && sameViewpointDescriptors && sameLang && sameRoles && sameRoleDescriptors && sameAccessibility && sameAccessibilityDescriptors && sameAudioChannelConfiguration && sameAudioChannelConfigurationDescriptors);\n }\n\n function setConfig(config) {\n if (!config) return;\n\n if (config.domStorage) {\n domStorage = config.domStorage;\n }\n\n if (config.settings) {\n settings = config.settings;\n }\n\n if (config.customParametersModel) {\n customParametersModel = config.customParametersModel;\n }\n }\n\n\n /**\n * @memberof MediaController#\n */\n function reset() {\n tracks = {};\n lastSelectedTracks = {};\n resetInitialSettings();\n }\n\n function extractSettings(mediaInfo) {\n const settings = {\n lang: mediaInfo.lang,\n viewpoint: mediaInfo.viewpoint,\n roles: mediaInfo.roles,\n accessibility: mediaInfo.accessibility,\n audioChannelConfiguration: mediaInfo.audioChannelConfiguration,\n codec: mediaInfo.codec\n };\n let notEmpty = settings.lang || settings.viewpoint || (settings.role && settings.role.length > 0) ||\n (settings.accessibility && settings.accessibility.length > 0) || (settings.audioChannelConfiguration && settings.audioChannelConfiguration.length > 0);\n\n return notEmpty ? settings : null;\n }\n\n function filterTracksBySettings(tracks, filterFn, settings) {\n let tracksAfterMatcher = [];\n tracks.forEach(function (track) {\n if (filterFn(settings, track)) {\n tracksAfterMatcher.push(track);\n }\n });\n if (tracksAfterMatcher.length !== 0) {\n return tracksAfterMatcher;\n }\n return tracks;\n }\n\n function matchSettingsLang(settings, track) {\n try {\n return !settings.lang ||\n (settings.lang instanceof RegExp) ?\n (track.lang.match(settings.lang)) : track.lang !== '' ?\n (extendedFilter(track.lang, bcp47Normalize(settings.lang)).length > 0) : false;\n } catch (e) {\n return false\n }\n }\n\n function matchSettingsIndex(settings, track) {\n return (settings.index === undefined) || (settings.index === null) || (track.index === settings.index);\n }\n\n function matchSettingsViewPoint(settings, track) {\n return !settings.viewpoint || (settings.viewpoint === track.viewpoint);\n }\n\n function matchSettingsRole(settings, track, isTrackActive = false) {\n const matchRole = !settings.role || !!track.roles.filter(function (item) {\n return item === settings.role;\n })[0];\n return (matchRole || (track.type === Constants.AUDIO && isTrackActive));\n }\n\n function matchSettingsAccessibility(settings, track) {\n let matchAccessibility;\n\n if (!settings.accessibility) {\n // if no accessibility is requested (or request is empty string),\n // match only those tracks having no accessibility element present\n matchAccessibility = !track.accessibility.length;\n } else {\n matchAccessibility = !!track.accessibility.filter(function (item) {\n return item === settings.accessibility;\n })[0];\n }\n\n return matchAccessibility;\n }\n\n function matchSettingsAudioChannelConfig(settings, track) {\n let matchAudioChannelConfiguration = !settings.audioChannelConfiguration || !!track.audioChannelConfiguration.filter(function (item) {\n return item === settings.audioChannelConfiguration;\n })[0];\n\n return matchAudioChannelConfiguration;\n }\n\n function matchSettingsCodec(settings, track) {\n return !settings.codec || (settings.codec === track.codec);\n }\n\n function matchSettings(settings, track, isTrackActive = false) {\n try {\n let matchLang = false;\n\n // If there is no language defined in the target settings we got a match\n if (!settings.lang) {\n matchLang = true;\n }\n\n // If the target language is provided as a RegExp apply match function\n else if (settings.lang instanceof RegExp) {\n matchLang = track.lang.match(settings.lang);\n }\n\n // If the track has a language and we can normalize the target language check if we got a match\n else if (track.lang !== '') {\n const normalizedSettingsLang = bcp47Normalize(settings.lang);\n if (normalizedSettingsLang) {\n matchLang = extendedFilter(track.lang, normalizedSettingsLang).length > 0\n }\n }\n\n const matchIndex = (settings.index === undefined) || (settings.index === null) || (track.index === settings.index);\n const matchViewPoint = !settings.viewpoint || (settings.viewpoint === track.viewpoint);\n const matchRole = !settings.role || !!track.roles.filter(function (item) {\n return item === settings.role;\n })[0];\n let matchAccessibility = !settings.accessibility || !!track.accessibility.filter(function (item) {\n return item === settings.accessibility;\n })[0];\n let matchAudioChannelConfiguration = !settings.audioChannelConfiguration || !!track.audioChannelConfiguration.filter(function (item) {\n return item === settings.audioChannelConfiguration;\n })[0];\n\n\n return (matchLang && matchIndex && matchViewPoint && (matchRole || (track.type === Constants.AUDIO && isTrackActive)) && matchAccessibility && matchAudioChannelConfiguration);\n } catch (e) {\n return false;\n logger.error(e);\n }\n }\n\n function resetInitialSettings() {\n initialSettings = {\n audio: null,\n video: null,\n text: null\n };\n }\n\n function getTracksWithHighestSelectionPriority(trackArr) {\n let max = 0;\n let result = [];\n\n trackArr.forEach((track) => {\n if (!isNaN(track.selectionPriority)) {\n // Higher max value. Reset list and add new entry\n if (track.selectionPriority > max) {\n max = track.selectionPriority;\n result = [track];\n }\n // Same max value add to list\n else if (track.selectionPriority === max) {\n result.push(track);\n }\n\n }\n })\n\n return result;\n }\n\n function getTracksWithHighestBitrate(trackArr) {\n let max = 0;\n let result = [];\n let tmp;\n\n trackArr.forEach(function (track) {\n tmp = Math.max.apply(Math, track.bitrateList.map(function (obj) {\n return obj.bandwidth;\n }));\n\n if (tmp > max) {\n max = tmp;\n result = [track];\n } else if (tmp === max) {\n result.push(track);\n }\n });\n\n return result;\n }\n\n function getTracksWithHighestEfficiency(trackArr) {\n let min = Infinity;\n let result = [];\n let tmp;\n\n trackArr.forEach(function (track) {\n const sum = track.bitrateList.reduce(function (acc, obj) {\n const resolution = Math.max(1, obj.width * obj.height);\n const efficiency = obj.bandwidth / resolution;\n return acc + efficiency;\n }, 0);\n tmp = sum / track.bitrateList.length;\n\n if (tmp < min) {\n min = tmp;\n result = [track];\n } else if (tmp === min) {\n result.push(track);\n }\n });\n\n return result;\n }\n\n function getTracksWithWidestRange(trackArr) {\n let max = 0;\n let result = [];\n let tmp;\n\n trackArr.forEach(function (track) {\n tmp = track.representationCount;\n\n if (tmp > max) {\n max = tmp;\n result = [track];\n } else if (tmp === max) {\n result.push(track);\n }\n });\n\n return result;\n }\n\n function selectInitialTrack(type, tracks) {\n if (type === Constants.TEXT) return tracks[0];\n\n let mode = settings.get().streaming.selectionModeForInitialTrack;\n let tmpArr;\n const customInitialTrackSelectionFunction = customParametersModel.getCustomInitialTrackSelectionFunction();\n\n if (customInitialTrackSelectionFunction && typeof customInitialTrackSelectionFunction === 'function') {\n tmpArr = customInitialTrackSelectionFunction(tracks);\n } else {\n switch (mode) {\n case Constants.TRACK_SELECTION_MODE_HIGHEST_SELECTION_PRIORITY:\n tmpArr = _trackSelectionModeHighestSelectionPriority(tracks);\n break;\n case Constants.TRACK_SELECTION_MODE_HIGHEST_BITRATE:\n tmpArr = _trackSelectionModeHighestBitrate(tracks);\n break;\n case Constants.TRACK_SELECTION_MODE_FIRST_TRACK:\n tmpArr = _trackSelectionModeFirstTrack(tracks);\n break;\n case Constants.TRACK_SELECTION_MODE_HIGHEST_EFFICIENCY:\n tmpArr = _trackSelectionModeHighestEfficiency(tracks);\n break;\n case Constants.TRACK_SELECTION_MODE_WIDEST_RANGE:\n tmpArr = _trackSelectionModeWidestRange(tracks);\n break;\n default:\n logger.warn(`Track selection mode ${mode} is not supported. Falling back to TRACK_SELECTION_MODE_FIRST_TRACK`);\n tmpArr = _trackSelectionModeFirstTrack(tracks);\n break;\n }\n }\n\n return tmpArr.length > 0 ? tmpArr[0] : tracks[0];\n }\n\n\n function _trackSelectionModeHighestSelectionPriority(tracks) {\n let tmpArr = getTracksWithHighestSelectionPriority(tracks);\n\n if (tmpArr.length > 1) {\n tmpArr = getTracksWithHighestBitrate(tmpArr);\n }\n\n if (tmpArr.length > 1) {\n tmpArr = getTracksWithWidestRange(tmpArr);\n }\n\n return tmpArr;\n }\n\n function _trackSelectionModeHighestBitrate(tracks) {\n let tmpArr = getTracksWithHighestBitrate(tracks);\n\n if (tmpArr.length > 1) {\n tmpArr = getTracksWithWidestRange(tmpArr);\n }\n\n return tmpArr;\n }\n\n function _trackSelectionModeFirstTrack(tracks) {\n return tracks[0];\n }\n\n function _trackSelectionModeHighestEfficiency(tracks) {\n let tmpArr = getTracksWithHighestEfficiency(tracks);\n\n if (tmpArr.length > 1) {\n tmpArr = getTracksWithHighestBitrate(tmpArr);\n }\n\n return tmpArr;\n }\n\n function _trackSelectionModeWidestRange(tracks) {\n let tmpArr = getTracksWithWidestRange(tracks);\n\n if (tmpArr.length > 1) {\n tmpArr = getTracksWithHighestBitrate(tracks);\n }\n\n return tmpArr;\n }\n\n\n function createTrackInfo() {\n const storeLastSettings = settings.get().streaming.saveLastMediaSettingsForCurrentStreamingSession;\n\n return {\n audio: {\n list: [],\n storeLastSettings,\n current: null\n },\n video: {\n list: [],\n storeLastSettings,\n current: null\n },\n text: {\n list: [],\n storeLastSettings,\n current: null\n },\n image: {\n list: [],\n storeLastSettings,\n current: null\n }\n };\n }\n\n instance = {\n setInitialMediaSettingsForType,\n addTrack,\n getTracksFor,\n getCurrentTrackFor,\n isCurrentTrack,\n setTrack,\n selectInitialTrack,\n setInitialSettings,\n getInitialSettings,\n getTracksWithHighestBitrate,\n getTracksWithHighestEfficiency,\n getTracksWithWidestRange,\n isTracksEqual,\n matchSettings,\n matchSettingsLang,\n matchSettingsIndex,\n matchSettingsViewPoint,\n matchSettingsRole,\n matchSettingsAccessibility,\n matchSettingsAudioChannelConfig,\n saveTextSettingsDisabled,\n setConfig,\n reset\n };\n\n setup();\n\n return instance;\n}\n\nMediaController.__dashjs_factory_name = 'MediaController';\nconst factory = FactoryMaker.getSingletonFactory(MediaController);\nFactoryMaker.updateSingletonFactory(MediaController.__dashjs_factory_name, factory);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport ObjectUtils from '../utils/ObjectUtils';\nimport FactoryMaker from '../../core/FactoryMaker';\n\nconst DEFAULT_INDEX = NaN;\n\nclass Node {\n constructor(_baseUrls, _selectedIdx) {\n this.data = {\n baseUrls: _baseUrls || null,\n selectedIdx: _selectedIdx || DEFAULT_INDEX\n };\n this.children = [];\n }\n}\n\nfunction BaseURLTreeModel() {\n let instance,\n root,\n adapter,\n contentSteeringController;\n\n const context = this.context;\n const objectUtils = ObjectUtils(context).getInstance();\n\n function setup() {\n reset();\n }\n\n function setConfig(config) {\n if (config.adapter) {\n adapter = config.adapter;\n }\n if (config.contentSteeringController) {\n contentSteeringController = config.contentSteeringController\n }\n }\n\n function checkConfig() {\n if (!adapter || !adapter.hasOwnProperty('getBaseURLsFromElement') || !adapter.hasOwnProperty('getRepresentationSortFunction')) {\n throw new Error('setConfig function has to be called previously');\n }\n }\n\n function updateChildData(node, index, element) {\n const baseUrls = _getAvailableBaseUrls(element);\n\n if (!node[index]) {\n node[index] = new Node(baseUrls);\n } else {\n if (!objectUtils.areEqual(baseUrls, node[index].data.baseUrls)) {\n node[index].data.baseUrls = baseUrls;\n node[index].data.selectedIdx = DEFAULT_INDEX;\n }\n }\n }\n\n function getBaseURLCollectionsFromManifest(manifest) {\n checkConfig();\n\n const baseUrls = _getAvailableBaseUrls(manifest)\n\n if (!objectUtils.areEqual(baseUrls, root.data.baseUrls)) {\n root.data.baseUrls = baseUrls;\n root.data.selectedIdx = DEFAULT_INDEX;\n }\n\n if (manifest && manifest.Period_asArray) {\n manifest.Period_asArray.forEach((p, pi) => {\n updateChildData(root.children, pi, p);\n\n if (p.AdaptationSet_asArray) {\n p.AdaptationSet_asArray.forEach((a, ai) => {\n updateChildData(root.children[pi].children, ai, a);\n\n if (a.Representation_asArray) {\n a.Representation_asArray.sort(\n adapter.getRepresentationSortFunction()\n ).forEach((r, ri) => {\n updateChildData(\n root.children[pi].children[ai].children,\n ri,\n r\n );\n });\n }\n });\n }\n });\n }\n }\n\n function _getAvailableBaseUrls(root) {\n let targetBaseUrls = adapter.getBaseURLsFromElement(root);\n const synthesizedBaseUrls = contentSteeringController.getSynthesizedBaseUrlElements(targetBaseUrls);\n\n if (synthesizedBaseUrls && synthesizedBaseUrls.length > 0) {\n targetBaseUrls = targetBaseUrls.concat(synthesizedBaseUrls)\n }\n\n return targetBaseUrls;\n }\n\n function getBaseUrls(manifest) {\n return _getAvailableBaseUrls(manifest);\n }\n\n function walk(callback, node) {\n const target = node || root;\n\n callback(target.data);\n\n if (target.children) {\n target.children.forEach(child => walk(callback, child));\n }\n }\n\n function invalidateSelectedIndexes(serviceLocation) {\n walk((data) => {\n if (!isNaN(data.selectedIdx)) {\n if (serviceLocation === data.baseUrls[data.selectedIdx].serviceLocation) {\n data.selectedIdx = DEFAULT_INDEX;\n }\n }\n });\n }\n\n function update(manifest) {\n getBaseURLCollectionsFromManifest(manifest);\n }\n\n function reset() {\n root = new Node();\n }\n\n function getForPath(path) {\n let target = root;\n const nodes = [target.data];\n\n if (path) {\n path.forEach(p => {\n target = target.children[p];\n\n if (target) {\n nodes.push(target.data);\n }\n });\n }\n\n return nodes.filter(n => n.baseUrls.length);\n }\n\n instance = {\n reset,\n update,\n getForPath,\n invalidateSelectedIndexes,\n setConfig,\n getBaseUrls\n };\n\n setup();\n\n return instance;\n}\n\nBaseURLTreeModel.__dashjs_factory_name = 'BaseURLTreeModel';\nexport default FactoryMaker.getClassFactory(BaseURLTreeModel);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport FactoryMaker from '../../../core/FactoryMaker';\n\nfunction DVBSelector(config) {\n\n config = config || {};\n let instance;\n\n const blacklistController = config.blacklistController;\n\n function getNonBlacklistedBaseUrls(urls) {\n let removedPriorities = [];\n\n const samePrioritiesFilter = function (el) {\n if (removedPriorities.length) {\n if ((el.dvbPriority) &&\n (removedPriorities.indexOf(el.dvbPriority) !== -1)) {\n return false;\n }\n }\n\n return true;\n };\n\n const serviceLocationFilter = function (baseUrl) {\n if (blacklistController.contains(baseUrl.serviceLocation)) {\n // whenever a BaseURL is removed from the available list of\n // BaseURLs, any other BaseURL with the same @priority\n // value as the BaseURL being removed shall also be removed\n if (baseUrl.dvbPriority) {\n removedPriorities.push(baseUrl.dvbPriority);\n }\n\n // all URLs in the list which have a @serviceLocation\n // attribute matching an entry in the blacklist shall be\n // removed from the available list of BaseURLs\n return false;\n }\n\n return true;\n };\n\n return urls.filter(serviceLocationFilter).filter(samePrioritiesFilter);\n }\n\n function selectByWeight(availableUrls) {\n const prioritySorter = function (a, b) {\n let diff = a.dvbPriority - b.dvbPriority;\n return isNaN(diff) ? 0 : diff;\n };\n\n const topPriorityFilter = function (baseUrl, idx, arr) {\n return !idx || (\n (arr[0].dvbPriority && baseUrl.dvbPriority) &&\n (arr[0].dvbPriority === baseUrl.dvbPriority)\n );\n };\n\n let totalWeight = 0;\n let cumulWeights = [];\n let idx = 0;\n let rn,\n urls;\n\n // It shall begin by taking the set of resolved BaseURLs present or inherited at the current\n // position in the MPD, resolved and filtered as described in 10.8.2.1, that have the lowest\n // @priority attribute value.\n urls = availableUrls.sort(prioritySorter).filter(topPriorityFilter);\n\n if (urls.length) {\n if (urls.length > 1) {\n // If there is more than one BaseURL with this lowest @priority attribute value then the Player\n // shall select one of them at random such that the probability of each BaseURL being chosen\n // is proportional to the value of its @weight attribute. The method described in RFC 2782\n // [26] or picking from a number of weighted entries is suitable for this, but there may be other\n // algorithms which achieve the same effect.\n\n // add all the weights together, storing the accumulated weight per entry\n urls.forEach(baseUrl => {\n totalWeight += baseUrl.dvbWeight;\n cumulWeights.push(totalWeight);\n });\n\n // pick a random number between zero and totalWeight\n rn = Math.floor(Math.random() * (totalWeight - 1));\n\n // select the index for the range rn falls within\n cumulWeights.every((limit, index) => {\n idx = index;\n\n if (rn < limit) {\n return false;\n }\n\n return true;\n });\n }\n\n return urls[idx];\n }\n }\n\n function select(baseUrls) {\n return baseUrls && selectByWeight(\n getNonBlacklistedBaseUrls(\n baseUrls\n )\n );\n }\n\n instance = {\n select: select\n };\n\n return instance;\n}\n\nDVBSelector.__dashjs_factory_name = 'DVBSelector';\nexport default FactoryMaker.getClassFactory(DVBSelector);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport FactoryMaker from '../../../core/FactoryMaker';\n\nfunction BasicSelector(config) {\n\n config = config || {};\n let instance;\n\n const blacklistController = config.blacklistController;\n\n function select(baseUrls) {\n let index = 0;\n let selectedBaseUrl;\n\n if (baseUrls && baseUrls.some((baseUrl, idx) => {\n index = idx;\n\n return (!blacklistController.contains(baseUrl.serviceLocation));\n })) {\n selectedBaseUrl = baseUrls[index];\n }\n\n return selectedBaseUrl;\n }\n\n instance = {\n select: select\n };\n\n return instance;\n}\n\nBasicSelector.__dashjs_factory_name = 'BasicSelector';\nexport default FactoryMaker.getClassFactory(BasicSelector);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport FactoryMaker from '../../../core/FactoryMaker';\nimport ContentSteeringController from '../../../dash/controllers/ContentSteeringController';\n\nfunction ContentSteeringSelector() {\n\n const context = this.context;\n let instance,\n contentSteeringController,\n blacklistController;\n\n function setup() {\n contentSteeringController = ContentSteeringController(context).getInstance();\n }\n\n function setConfig(config) {\n if (config.blacklistController) {\n blacklistController = config.blacklistController;\n }\n if (config.contentSteeringController) {\n contentSteeringController = config.contentSteeringController;\n }\n }\n\n function selectBaseUrlIndex(data) {\n let steeringIndex = NaN;\n\n // In case we dont have a selected idx yet we consider the defaultServiceLocation\n if (isNaN(data.selectedIdx)) {\n const steeringDataFromMpd = contentSteeringController.getSteeringDataFromManifest();\n if (steeringDataFromMpd && steeringDataFromMpd.defaultServiceLocationArray.length > 0) {\n steeringIndex = _findexIndexOfServiceLocation(steeringDataFromMpd.defaultServiceLocationArray, data.baseUrls);\n }\n }\n\n // Search in the response data of the steering server\n const currentSteeringResponseData = contentSteeringController.getCurrentSteeringResponseData();\n if (data.baseUrls && data.baseUrls.length && currentSteeringResponseData &&\n currentSteeringResponseData.pathwayPriority && currentSteeringResponseData.pathwayPriority.length) {\n steeringIndex = _findexIndexOfServiceLocation(currentSteeringResponseData.pathwayPriority, data.baseUrls);\n }\n\n return steeringIndex;\n }\n\n function _findexIndexOfServiceLocation(pathwayPriority = [], baseUrls = []) {\n let i = 0;\n let steeringIndex = NaN;\n while (i < pathwayPriority.length) {\n const curr = pathwayPriority[i];\n const idx = baseUrls.findIndex((elem) => {\n return elem.serviceLocation && elem.serviceLocation === curr;\n })\n if (idx !== -1 && !blacklistController.contains(baseUrls[idx].serviceLocation)) {\n steeringIndex = idx;\n break;\n }\n i += 1;\n }\n return steeringIndex;\n }\n\n instance = {\n selectBaseUrlIndex,\n setConfig\n };\n\n setup();\n\n return instance;\n}\n\nContentSteeringSelector.__dashjs_factory_name = 'ContentSteeringSelector';\nexport default FactoryMaker.getClassFactory(ContentSteeringSelector);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport Errors from '../../core/errors/Errors';\nimport EventBus from '../../core/EventBus';\nimport Events from '../../core/events/Events';\nimport BlacklistController from '../controllers/BlacklistController';\nimport DVBSelector from './baseUrlResolution/DVBSelector';\nimport BasicSelector from './baseUrlResolution/BasicSelector';\nimport FactoryMaker from '../../core/FactoryMaker';\nimport DashJSError from '../vo/DashJSError';\nimport {checkParameterType} from '../utils/SupervisorTools';\nimport ContentSteeringSelector from './baseUrlResolution/ContentSteeringSelector';\nimport Settings from '../../core/Settings';\n\nfunction BaseURLSelector() {\n\n const context = this.context;\n const eventBus = EventBus(context).getInstance();\n const settings = Settings(context).getInstance();\n\n let instance,\n serviceLocationBlacklistController,\n basicSelector,\n dvbSelector,\n contentSteeringSelector,\n selector;\n\n function setup() {\n serviceLocationBlacklistController = BlacklistController(context).create({\n updateEventName: Events.SERVICE_LOCATION_BASE_URL_BLACKLIST_CHANGED,\n addBlacklistEventName: Events.SERVICE_LOCATION_BASE_URL_BLACKLIST_ADD\n });\n\n basicSelector = BasicSelector(context).create({\n blacklistController: serviceLocationBlacklistController\n });\n\n dvbSelector = DVBSelector(context).create({\n blacklistController: serviceLocationBlacklistController\n });\n\n contentSteeringSelector = ContentSteeringSelector(context).create();\n contentSteeringSelector.setConfig({\n blacklistController: serviceLocationBlacklistController\n })\n\n selector = basicSelector;\n }\n\n function setConfig(config) {\n if (config.selector) {\n selector = config.selector;\n }\n if (config.contentSteeringSelector) {\n contentSteeringSelector = config.contentSteeringSelector;\n }\n }\n\n function chooseSelector(isDVB) {\n checkParameterType(isDVB, 'boolean');\n selector = isDVB ? dvbSelector : basicSelector;\n }\n\n function select(data) {\n if (!data) {\n return;\n }\n\n // Check if we got any instructions from the content steering element in the MPD or from the content steering server\n if(settings.get().streaming.applyContentSteering) {\n const steeringIndex = contentSteeringSelector.selectBaseUrlIndex(data);\n if (!isNaN(steeringIndex) && steeringIndex !== -1) {\n data.selectedIdx = steeringIndex;\n }\n }\n\n // Once a random selection has been carried out amongst a group of BaseURLs with the same\n // @priority attribute value, then that choice should be re-used if the selection needs to be made again\n // unless the blacklist has been modified or the available BaseURLs have changed.\n if (!isNaN(data.selectedIdx)) {\n return data.baseUrls[data.selectedIdx];\n }\n\n let selectedBaseUrl = selector.select(data.baseUrls);\n\n if (!selectedBaseUrl) {\n eventBus.trigger(Events.URL_RESOLUTION_FAILED, {\n error: new DashJSError(\n Errors.URL_RESOLUTION_FAILED_GENERIC_ERROR_CODE,\n Errors.URL_RESOLUTION_FAILED_GENERIC_ERROR_MESSAGE\n )\n });\n if (selector === basicSelector) {\n reset();\n }\n return;\n }\n\n data.selectedIdx = data.baseUrls.indexOf(selectedBaseUrl);\n\n return selectedBaseUrl;\n }\n\n function reset() {\n serviceLocationBlacklistController.reset();\n }\n\n instance = {\n chooseSelector: chooseSelector,\n select: select,\n reset: reset,\n setConfig: setConfig\n };\n\n setup();\n\n return instance;\n}\n\nBaseURLSelector.__dashjs_factory_name = 'BaseURLSelector';\nexport default FactoryMaker.getClassFactory(BaseURLSelector);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport BaseURLTreeModel from '../models/BaseURLTreeModel';\nimport BaseURLSelector from '../utils/BaseURLSelector';\nimport URLUtils from '../utils/URLUtils';\nimport BaseURL from '../../dash/vo/BaseURL';\nimport FactoryMaker from '../../core/FactoryMaker';\nimport EventBus from '../../core/EventBus';\nimport Events from '../../core/events/Events';\nimport MediaPlayerEvents from '../MediaPlayerEvents';\n\nfunction BaseURLController() {\n\n let instance,\n adapter;\n\n const context = this.context;\n const eventBus = EventBus(context).getInstance();\n const urlUtils = URLUtils(context).getInstance();\n\n let baseURLTreeModel,\n baseURLSelector,\n contentSteeringController;\n\n function onBlackListChanged(e) {\n baseURLTreeModel.invalidateSelectedIndexes(e.entry);\n }\n\n function setup() {\n baseURLTreeModel = BaseURLTreeModel(context).create();\n baseURLSelector = BaseURLSelector(context).create();\n\n eventBus.on(Events.SERVICE_LOCATION_BASE_URL_BLACKLIST_CHANGED, onBlackListChanged, instance);\n }\n\n function setConfig(config) {\n if (config.baseURLTreeModel) {\n baseURLTreeModel = config.baseURLTreeModel;\n }\n\n if (config.baseURLSelector) {\n baseURLSelector = config.baseURLSelector;\n }\n\n if (config.adapter) {\n adapter = config.adapter;\n }\n\n if (config.contentSteeringController) {\n contentSteeringController = config.contentSteeringController\n }\n }\n\n function update(manifest) {\n baseURLTreeModel.update(manifest);\n baseURLSelector.chooseSelector(adapter.getIsDVB(manifest));\n eventBus.trigger(MediaPlayerEvents.BASE_URLS_UPDATED, {\n baseUrls: getBaseUrls(manifest)\n });\n }\n\n function resolve(path) {\n const baseUrls = baseURLTreeModel.getForPath(path);\n\n const baseUrl = baseUrls.reduce((p, c) => {\n const b = baseURLSelector.select(c);\n\n if (b) {\n if (!urlUtils.isRelative(b.url)) {\n p.url = b.url;\n p.serviceLocation = b.serviceLocation;\n } else {\n p.url = urlUtils.resolve(b.url, p.url);\n }\n p.availabilityTimeOffset = b.availabilityTimeOffset;\n p.availabilityTimeComplete = b.availabilityTimeComplete;\n p.queryParams = b.queryParams;\n } else {\n return new BaseURL();\n }\n\n return p;\n }, new BaseURL());\n\n if (!urlUtils.isRelative(baseUrl.url)) {\n return baseUrl;\n }\n }\n\n function reset() {\n baseURLTreeModel.reset();\n baseURLSelector.reset();\n }\n\n function getBaseUrls(manifest) {\n return baseURLTreeModel.getBaseUrls(manifest);\n }\n\n function initialize(data) {\n\n // report config to baseURLTreeModel and baseURLSelector\n baseURLTreeModel.setConfig({\n adapter,\n contentSteeringController\n });\n\n update(data);\n }\n\n instance = {\n reset,\n initialize,\n resolve,\n setConfig,\n getBaseUrls,\n update\n };\n\n setup();\n\n return instance;\n}\n\nBaseURLController.__dashjs_factory_name = 'BaseURLController';\nexport default FactoryMaker.getClassFactory(BaseURLController);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nimport Constants from '../constants/Constants';\nimport FragmentRequest from './FragmentRequest';\n\nclass TextRequest extends FragmentRequest {\n constructor(url, type) {\n super();\n this.url = url || null;\n this.type = type || null;\n this.mediaType = Constants.STREAM;\n this.responseType = ''; //'text' value returns a bad encoding response in Firefox\n }\n}\n\nexport default TextRequest;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport DashJSError from './vo/DashJSError';\nimport URLLoader from './net/URLLoader';\nimport {HTTPRequest} from './vo/metrics/HTTPRequest';\nimport TextRequest from './vo/TextRequest';\nimport EventBus from '../core/EventBus';\nimport Events from '../core/events/Events';\nimport FactoryMaker from '../core/FactoryMaker';\nimport Errors from '../core/errors/Errors';\n\nfunction XlinkLoader(config) {\n\n config = config || {};\n const RESOLVE_TO_ZERO = 'urn:mpeg:dash:resolve-to-zero:2013';\n\n const context = this.context;\n const eventBus = EventBus(context).getInstance();\n\n let urlLoader = URLLoader(context).create({\n errHandler: config.errHandler,\n dashMetrics: config.dashMetrics,\n mediaPlayerModel: config.mediaPlayerModel,\n requestModifier: config.requestModifier,\n errors: Errors\n });\n\n let instance;\n\n function load(url, element, resolveObject) {\n const report = function (content, resolveToZero) {\n element.resolved = true;\n element.resolvedContent = content ? content : null;\n\n eventBus.trigger(Events.XLINK_ELEMENT_LOADED, {\n element: element,\n resolveObject: resolveObject,\n error: content || resolveToZero ?\n null :\n new DashJSError(\n Errors.XLINK_LOADER_LOADING_FAILURE_ERROR_CODE,\n Errors.XLINK_LOADER_LOADING_FAILURE_ERROR_MESSAGE + url\n )\n });\n };\n\n if (url === RESOLVE_TO_ZERO) {\n report(null, true);\n } else {\n const request = new TextRequest(url, HTTPRequest.XLINK_EXPANSION_TYPE);\n\n urlLoader.load({\n request: request,\n success: function (data) {\n report(data);\n },\n error: function () {\n report(null);\n }\n });\n }\n }\n\n function reset() {\n if (urlLoader) {\n urlLoader.abort();\n urlLoader = null;\n }\n }\n\n instance = {\n load: load,\n reset: reset\n };\n\n return instance;\n}\n\nXlinkLoader.__dashjs_factory_name = 'XlinkLoader';\nexport default FactoryMaker.getClassFactory(XlinkLoader);\n","/*\n Copyright 2011-2013 Abdulla Abdurakhmanov\n Original sources are available at https://code.google.com/p/x2js/\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n */\n\n/*\n Further modified for dashjs to:\n - keep track of children nodes in order in attribute __children.\n - add type conversion matchers\n - re-add ignoreRoot\n - allow zero-length attributePrefix\n - don't add white-space text nodes\n - remove explicit RequireJS support\n*/\n\nfunction X2JS(config) {\n 'use strict';\n\n var VERSION = \"1.2.0\";\n\n config = config || {};\n initConfigDefaults();\n initRequiredPolyfills();\n\n function initConfigDefaults() {\n if(config.escapeMode === undefined) {\n config.escapeMode = true;\n }\n\n if (config.attributePrefix === undefined) {\n config.attributePrefix = \"_\";\n }\n\n config.arrayAccessForm = config.arrayAccessForm || \"none\";\n config.emptyNodeForm = config.emptyNodeForm || \"text\";\n\n if(config.enableToStringFunc === undefined) {\n config.enableToStringFunc = true;\n }\n config.arrayAccessFormPaths = config.arrayAccessFormPaths || [];\n if(config.skipEmptyTextNodesForObj === undefined) {\n config.skipEmptyTextNodesForObj = true;\n }\n if(config.stripWhitespaces === undefined) {\n config.stripWhitespaces = true;\n }\n config.datetimeAccessFormPaths = config.datetimeAccessFormPaths || [];\n\n if(config.useDoubleQuotes === undefined) {\n config.useDoubleQuotes = false;\n }\n\n config.xmlElementsFilter = config.xmlElementsFilter || [];\n config.jsonPropertiesFilter = config.jsonPropertiesFilter || [];\n\n if(config.keepCData === undefined) {\n config.keepCData = false;\n }\n\n if (config.ignoreRoot === undefined) {\n config.ignoreRoot = false;\n }\n }\n\n var DOMNodeTypes = {\n ELEMENT_NODE \t : 1,\n TEXT_NODE \t : 3,\n CDATA_SECTION_NODE : 4,\n COMMENT_NODE\t : 8,\n DOCUMENT_NODE \t : 9\n };\n\n function initRequiredPolyfills() {\n }\n\n function getNodeLocalName( node ) {\n var nodeLocalName = node.localName;\n if(nodeLocalName == null) // Yeah, this is IE!!\n nodeLocalName = node.baseName;\n if(nodeLocalName == null || nodeLocalName==\"\") // ==\"\" is IE too\n nodeLocalName = node.nodeName;\n return nodeLocalName;\n }\n\n function getNodePrefix(node) {\n return node.prefix;\n }\n\n function escapeXmlChars(str) {\n if(typeof(str) == \"string\")\n return str.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"').replace(/'/g, ''');\n else\n return str;\n }\n\n function unescapeXmlChars(str) {\n return str.replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '\"').replace(/'/g, \"'\").replace(/&/g, '&');\n }\n\n function checkInStdFiltersArrayForm(stdFiltersArrayForm, obj, name, path) {\n var idx = 0;\n for(; idx < stdFiltersArrayForm.length; idx++) {\n var filterPath = stdFiltersArrayForm[idx];\n if( typeof filterPath === \"string\" ) {\n if(filterPath == path)\n break;\n }\n else\n if( filterPath instanceof RegExp) {\n if(filterPath.test(path))\n break;\n }\n else\n if( typeof filterPath === \"function\") {\n if(filterPath(obj, name, path))\n break;\n }\n }\n return idx!=stdFiltersArrayForm.length;\n }\n\n function toArrayAccessForm(obj, childName, path) {\n switch(config.arrayAccessForm) {\n case \"property\":\n if(!(obj[childName] instanceof Array))\n obj[childName+\"_asArray\"] = [obj[childName]];\n else\n obj[childName+\"_asArray\"] = obj[childName];\n break;\n /*case \"none\":\n break;*/\n }\n\n if(!(obj[childName] instanceof Array) && config.arrayAccessFormPaths.length > 0) {\n if(checkInStdFiltersArrayForm(config.arrayAccessFormPaths, obj, childName, path)) {\n obj[childName] = [obj[childName]];\n }\n }\n }\n\n function fromXmlDateTime(prop) {\n // Implementation based up on http://stackoverflow.com/questions/8178598/xml-datetime-to-javascript-date-object\n // Improved to support full spec and optional parts\n var bits = prop.split(/[-T:+Z]/g);\n\n var d = new Date(bits[0], bits[1]-1, bits[2]);\n var secondBits = bits[5].split(\"\\.\");\n d.setHours(bits[3], bits[4], secondBits[0]);\n if(secondBits.length>1)\n d.setMilliseconds(secondBits[1]);\n\n // Get supplied time zone offset in minutes\n if(bits[6] && bits[7]) {\n var offsetMinutes = bits[6] * 60 + Number(bits[7]);\n var sign = /\\d\\d-\\d\\d:\\d\\d$/.test(prop)? '-' : '+';\n\n // Apply the sign\n offsetMinutes = 0 + (sign == '-'? -1 * offsetMinutes : offsetMinutes);\n\n // Apply offset and local timezone\n d.setMinutes(d.getMinutes() - offsetMinutes - d.getTimezoneOffset())\n }\n else\n if(prop.indexOf(\"Z\", prop.length - 1) !== -1) {\n d = new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(), d.getMinutes(), d.getSeconds(), d.getMilliseconds()));\n }\n\n // d is now a local time equivalent to the supplied time\n return d;\n }\n\n function checkFromXmlDateTimePaths(value, childName, fullPath) {\n if(config.datetimeAccessFormPaths.length > 0) {\n var path = fullPath.split(\"\\.#\")[0];\n if(checkInStdFiltersArrayForm(config.datetimeAccessFormPaths, value, childName, path)) {\n return fromXmlDateTime(value);\n }\n else\n return value;\n }\n else\n return value;\n }\n\n function checkXmlElementsFilter(obj, childType, childName, childPath) {\n if( childType == DOMNodeTypes.ELEMENT_NODE && config.xmlElementsFilter.length > 0) {\n return checkInStdFiltersArrayForm(config.xmlElementsFilter, obj, childName, childPath);\n }\n else\n return true;\n }\n\n function parseDOMChildren( node, path ) {\n if(node.nodeType == DOMNodeTypes.DOCUMENT_NODE) {\n var result = new Object;\n var nodeChildren = node.childNodes;\n // Alternative for firstElementChild which is not supported in some environments\n for(var cidx=0; cidx <nodeChildren.length; cidx++) {\n var child = nodeChildren[cidx];\n if(child.nodeType == DOMNodeTypes.ELEMENT_NODE) {\n if (config.ignoreRoot) {\n result = parseDOMChildren(child);\n } else {\n result = {};\n var childName = getNodeLocalName(child);\n result[childName] = parseDOMChildren(child);\n }\n }\n }\n return result;\n }\n else\n if(node.nodeType == DOMNodeTypes.ELEMENT_NODE) {\n var result = new Object;\n result.__cnt=0;\n\n var children = [];\n var nodeChildren = node.childNodes;\n\n // Children nodes\n for(var cidx=0; cidx <nodeChildren.length; cidx++) {\n var child = nodeChildren[cidx];\n var childName = getNodeLocalName(child);\n\n if(child.nodeType!= DOMNodeTypes.COMMENT_NODE) {\n var childPath = path+\".\"+childName;\n if (checkXmlElementsFilter(result,child.nodeType,childName,childPath)) {\n result.__cnt++;\n if(result[childName] == null) {\n var c = parseDOMChildren(child, childPath);\n if (childName != \"#text\" || /[^\\s]/.test(c)) {\n var o = {};\n o[childName] = c;\n children.push(o);\n }\n result[childName] = c;\n toArrayAccessForm(result, childName, childPath);\n }\n else {\n if(result[childName] != null) {\n if( !(result[childName] instanceof Array)) {\n result[childName] = [result[childName]];\n toArrayAccessForm(result, childName, childPath);\n }\n }\n\n var c = parseDOMChildren(child, childPath);\n if (childName != \"#text\" || /[^\\s]/.test(c)) { // Don't add white-space text nodes\n var o = {};\n o[childName] = c;\n children.push( o );\n }\n (result[childName])[result[childName].length] = c;\n }\n }\n }\n }\n\n result.__children = children;\n\n // Attributes\n var nodeLocalName = getNodeLocalName(node)\n for(var aidx=0; aidx <node.attributes.length; aidx++) {\n var attr = node.attributes[aidx];\n result.__cnt++;\n\n var value2 = attr.value;\n for(var m=0, ml=config.matchers.length; m < ml; m++) {\n var matchobj = config.matchers[m];\n if (matchobj.test(attr, nodeLocalName))\n value2 = matchobj.converter(attr.value);\n }\n\n result[config.attributePrefix+attr.name]=value2;\n }\n\n // Node namespace prefix\n var nodePrefix = getNodePrefix(node);\n if(nodePrefix!=null && nodePrefix!=\"\") {\n result.__cnt++;\n result.__prefix=nodePrefix;\n }\n\n if(result[\"#text\"]!=null) {\n result.__text = result[\"#text\"];\n if(result.__text instanceof Array) {\n result.__text = result.__text.join(\"\\n\");\n }\n //if(config.escapeMode)\n //\tresult.__text = unescapeXmlChars(result.__text);\n if(config.stripWhitespaces)\n result.__text = result.__text.trim();\n delete result[\"#text\"];\n if(config.arrayAccessForm==\"property\")\n delete result[\"#text_asArray\"];\n result.__text = checkFromXmlDateTimePaths(result.__text, childName, path+\".\"+childName);\n }\n if(result[\"#cdata-section\"]!=null) {\n result.__cdata = result[\"#cdata-section\"];\n delete result[\"#cdata-section\"];\n if(config.arrayAccessForm==\"property\")\n delete result[\"#cdata-section_asArray\"];\n }\n\n if( result.__cnt == 0 && config.emptyNodeForm==\"text\" ) {\n result = '';\n }\n else\n if( result.__cnt == 1 && result.__text!=null ) {\n result = result.__text;\n }\n else\n if( result.__cnt == 1 && result.__cdata!=null && !config.keepCData ) {\n result = result.__cdata;\n }\n else\n if ( result.__cnt > 1 && result.__text!=null && config.skipEmptyTextNodesForObj) {\n if( (config.stripWhitespaces && result.__text==\"\") || (result.__text.trim()==\"\")) {\n delete result.__text;\n }\n }\n delete result.__cnt;\n\n if( config.enableToStringFunc && (result.__text!=null || result.__cdata!=null )) {\n result.toString = function() {\n return (this.__text!=null? this.__text:'')+( this.__cdata!=null ? this.__cdata:'');\n };\n }\n\n return result;\n }\n else\n if(node.nodeType == DOMNodeTypes.TEXT_NODE || node.nodeType == DOMNodeTypes.CDATA_SECTION_NODE) {\n return node.nodeValue;\n }\n }\n\n function startTag(jsonObj, element, attrList, closed) {\n var resultStr = \"<\"+ ( (jsonObj!=null && jsonObj.__prefix!=null)? (jsonObj.__prefix+\":\"):\"\") + element;\n if(attrList!=null) {\n for(var aidx = 0; aidx < attrList.length; aidx++) {\n var attrName = attrList[aidx];\n var attrVal = jsonObj[attrName];\n if(config.escapeMode)\n attrVal=escapeXmlChars(attrVal);\n resultStr+=\" \"+attrName.substr(config.attributePrefix.length)+\"=\";\n if(config.useDoubleQuotes)\n resultStr+='\"'+attrVal+'\"';\n else\n resultStr+=\"'\"+attrVal+\"'\";\n }\n }\n if(!closed)\n resultStr+=\">\";\n else\n resultStr+=\"/>\";\n return resultStr;\n }\n\n function endTag(jsonObj,elementName) {\n return \"</\"+ (jsonObj.__prefix!=null? (jsonObj.__prefix+\":\"):\"\")+elementName+\">\";\n }\n\n function endsWith(str, suffix) {\n return str.indexOf(suffix, str.length - suffix.length) !== -1;\n }\n\n function jsonXmlSpecialElem ( jsonObj, jsonObjField ) {\n if((config.arrayAccessForm==\"property\" && endsWith(jsonObjField.toString(),(\"_asArray\")))\n || jsonObjField.toString().indexOf(config.attributePrefix)==0\n || jsonObjField.toString().indexOf(\"__\")==0\n || (jsonObj[jsonObjField] instanceof Function) )\n return true;\n else\n return false;\n }\n\n function jsonXmlElemCount ( jsonObj ) {\n var elementsCnt = 0;\n if(jsonObj instanceof Object ) {\n for( var it in jsonObj ) {\n if(jsonXmlSpecialElem ( jsonObj, it) )\n continue;\n elementsCnt++;\n }\n }\n return elementsCnt;\n }\n\n function checkJsonObjPropertiesFilter(jsonObj, propertyName, jsonObjPath) {\n return config.jsonPropertiesFilter.length == 0\n || jsonObjPath==\"\"\n || checkInStdFiltersArrayForm(config.jsonPropertiesFilter, jsonObj, propertyName, jsonObjPath);\n }\n\n function parseJSONAttributes ( jsonObj ) {\n var attrList = [];\n if(jsonObj instanceof Object ) {\n for( var ait in jsonObj ) {\n if(ait.toString().indexOf(\"__\")== -1 && ait.toString().indexOf(config.attributePrefix)==0) {\n attrList.push(ait);\n }\n }\n }\n return attrList;\n }\n\n function parseJSONTextAttrs ( jsonTxtObj ) {\n var result =\"\";\n\n if(jsonTxtObj.__cdata!=null) {\n result+=\"<![CDATA[\"+jsonTxtObj.__cdata+\"]]>\";\n }\n\n if(jsonTxtObj.__text!=null) {\n if(config.escapeMode)\n result+=escapeXmlChars(jsonTxtObj.__text);\n else\n result+=jsonTxtObj.__text;\n }\n return result;\n }\n\n function parseJSONTextObject ( jsonTxtObj ) {\n var result =\"\";\n\n if( jsonTxtObj instanceof Object ) {\n result+=parseJSONTextAttrs ( jsonTxtObj );\n }\n else\n if(jsonTxtObj!=null) {\n if(config.escapeMode)\n result+=escapeXmlChars(jsonTxtObj);\n else\n result+=jsonTxtObj;\n }\n\n return result;\n }\n\n function getJsonPropertyPath(jsonObjPath, jsonPropName) {\n if (jsonObjPath===\"\") {\n return jsonPropName;\n }\n else\n return jsonObjPath+\".\"+jsonPropName;\n }\n\n function parseJSONArray ( jsonArrRoot, jsonArrObj, attrList, jsonObjPath ) {\n var result = \"\";\n if(jsonArrRoot.length == 0) {\n result+=startTag(jsonArrRoot, jsonArrObj, attrList, true);\n }\n else {\n for(var arIdx = 0; arIdx < jsonArrRoot.length; arIdx++) {\n result+=startTag(jsonArrRoot[arIdx], jsonArrObj, parseJSONAttributes(jsonArrRoot[arIdx]), false);\n result+=parseJSONObject(jsonArrRoot[arIdx], getJsonPropertyPath(jsonObjPath,jsonArrObj));\n result+=endTag(jsonArrRoot[arIdx],jsonArrObj);\n }\n }\n return result;\n }\n\n function parseJSONObject ( jsonObj, jsonObjPath ) {\n var result = \"\";\n\n var elementsCnt = jsonXmlElemCount ( jsonObj );\n\n if(elementsCnt > 0) {\n for( var it in jsonObj ) {\n\n if(jsonXmlSpecialElem ( jsonObj, it) || (jsonObjPath!=\"\" && !checkJsonObjPropertiesFilter(jsonObj, it, getJsonPropertyPath(jsonObjPath,it))) )\n continue;\n\n var subObj = jsonObj[it];\n\n var attrList = parseJSONAttributes( subObj )\n\n if(subObj == null || subObj == undefined) {\n result+=startTag(subObj, it, attrList, true);\n }\n else\n if(subObj instanceof Object) {\n\n if(subObj instanceof Array) {\n result+=parseJSONArray( subObj, it, attrList, jsonObjPath );\n }\n else if(subObj instanceof Date) {\n result+=startTag(subObj, it, attrList, false);\n result+=subObj.toISOString();\n result+=endTag(subObj,it);\n }\n else {\n var subObjElementsCnt = jsonXmlElemCount ( subObj );\n if(subObjElementsCnt > 0 || subObj.__text!=null || subObj.__cdata!=null) {\n result+=startTag(subObj, it, attrList, false);\n result+=parseJSONObject(subObj, getJsonPropertyPath(jsonObjPath,it));\n result+=endTag(subObj,it);\n }\n else {\n result+=startTag(subObj, it, attrList, true);\n }\n }\n }\n else {\n result+=startTag(subObj, it, attrList, false);\n result+=parseJSONTextObject(subObj);\n result+=endTag(subObj,it);\n }\n }\n }\n result+=parseJSONTextObject(jsonObj);\n\n return result;\n }\n\n this.parseXmlString = function(xmlDocStr) {\n var isIEParser = window.ActiveXObject || \"ActiveXObject\" in window;\n if (xmlDocStr === undefined) {\n return null;\n }\n var xmlDoc;\n if (window.DOMParser) {\n var parser=new window.DOMParser();\n var parsererrorNS = null;\n try {\n xmlDoc = parser.parseFromString( xmlDocStr, \"text/xml\" );\n if(xmlDoc.getElementsByTagNameNS(\"*\", \"parsererror\").length > 0) {\n xmlDoc = null;\n }\n }\n catch(err) {\n xmlDoc = null;\n }\n }\n else {\n // IE :(\n if(xmlDocStr.indexOf(\"<?\")==0) {\n xmlDocStr = xmlDocStr.substr( xmlDocStr.indexOf(\"?>\") + 2 );\n }\n xmlDoc=new ActiveXObject(\"Microsoft.XMLDOM\");\n xmlDoc.async=\"false\";\n xmlDoc.loadXML(xmlDocStr);\n }\n return xmlDoc;\n };\n\n this.asArray = function(prop) {\n if (prop === undefined || prop == null)\n return [];\n else\n if(prop instanceof Array)\n return prop;\n else\n return [prop];\n };\n\n this.toXmlDateTime = function(dt) {\n if(dt instanceof Date)\n return dt.toISOString();\n else\n if(typeof(dt) === 'number' )\n return new Date(dt).toISOString();\n else\n return null;\n };\n\n this.asDateTime = function(prop) {\n if(typeof(prop) == \"string\") {\n return fromXmlDateTime(prop);\n }\n else\n return prop;\n };\n\n this.xml2json = function (xmlDoc) {\n return parseDOMChildren ( xmlDoc );\n };\n\n this.xml_str2json = function (xmlDocStr) {\n var xmlDoc = this.parseXmlString(xmlDocStr);\n if(xmlDoc!=null)\n return this.xml2json(xmlDoc);\n else\n return null;\n };\n\n this.json2xml_str = function (jsonObj) {\n return parseJSONObject ( jsonObj, \"\" );\n };\n\n this.json2xml = function (jsonObj) {\n var xmlDocStr = this.json2xml_str (jsonObj);\n return this.parseXmlString(xmlDocStr);\n };\n\n this.getVersion = function () {\n return VERSION;\n };\n}\n\nexport default X2JS;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport XlinkLoader from '../XlinkLoader';\nimport EventBus from '../../core/EventBus';\nimport Events from '../../core/events/Events';\nimport FactoryMaker from '../../core/FactoryMaker';\nimport X2JS from '../../../externals/xml2json';\nimport URLUtils from '../utils/URLUtils';\nimport DashConstants from '../../dash/constants/DashConstants';\n\nconst RESOLVE_TYPE_ONLOAD = 'onLoad';\nconst RESOLVE_TYPE_ONACTUATE = 'onActuate';\nconst RESOLVE_TO_ZERO = 'urn:mpeg:dash:resolve-to-zero:2013';\n\nfunction XlinkController(config) {\n\n config = config || {};\n let context = this.context;\n let eventBus = EventBus(context).getInstance();\n const urlUtils = URLUtils(context).getInstance();\n\n let instance,\n matchers,\n iron,\n manifest,\n converter,\n xlinkLoader;\n\n function setup() {\n eventBus.on(Events.XLINK_ELEMENT_LOADED, onXlinkElementLoaded, instance);\n\n xlinkLoader = XlinkLoader(context).create({\n errHandler: config.errHandler,\n dashMetrics: config.dashMetrics,\n mediaPlayerModel: config.mediaPlayerModel,\n requestModifier: config.requestModifier,\n settings: config.settings\n });\n }\n\n function setMatchers(value) {\n if (value) {\n matchers = value;\n }\n }\n\n function setIron(value) {\n if (value) {\n iron = value;\n }\n }\n\n /**\n * <p>Triggers the resolution of the xlink.onLoad attributes in the manifest file </p>\n * @param {Object} mpd - the manifest\n */\n function resolveManifestOnLoad(mpd) {\n let elements;\n // First resolve all periods, so unnecessary requests inside onLoad Periods with Default content are avoided\n converter = new X2JS({\n escapeMode: false,\n attributePrefix: '',\n arrayAccessForm: 'property',\n emptyNodeForm: 'object',\n stripWhitespaces: false,\n enableToStringFunc: false,\n ignoreRoot: true,\n matchers: matchers\n });\n\n manifest = mpd;\n\n if (manifest.Period_asArray) {\n elements = getElementsToResolve(manifest.Period_asArray, manifest, DashConstants.PERIOD, RESOLVE_TYPE_ONLOAD);\n resolve(elements, DashConstants.PERIOD, RESOLVE_TYPE_ONLOAD);\n } else {\n eventBus.trigger(Events.XLINK_READY, {manifest: manifest});\n }\n }\n\n function reset() {\n eventBus.off(Events.XLINK_ELEMENT_LOADED, onXlinkElementLoaded, instance);\n\n if (xlinkLoader) {\n xlinkLoader.reset();\n xlinkLoader = null;\n }\n }\n\n function resolve(elements, type, resolveType) {\n let resolveObject = {};\n let element,\n url;\n\n resolveObject.elements = elements;\n resolveObject.type = type;\n resolveObject.resolveType = resolveType;\n // If nothing to resolve, directly call allElementsLoaded\n if (resolveObject.elements.length === 0) {\n onXlinkAllElementsLoaded(resolveObject);\n }\n for (let i = 0; i < resolveObject.elements.length; i++) {\n element = resolveObject.elements[i];\n if (urlUtils.isHTTPURL(element.url)) {\n url = element.url;\n } else {\n url = element.originalContent.BaseURL + element.url;\n }\n xlinkLoader.load(url, element, resolveObject);\n }\n }\n\n function onXlinkElementLoaded(event) {\n let element,\n resolveObject;\n\n const openingTag = '<response>';\n const closingTag = '</response>';\n let mergedContent = '';\n\n element = event.element;\n resolveObject = event.resolveObject;\n // if the element resolved into content parse the content\n if (element.resolvedContent) {\n let index = 0;\n // we add a parent elements so the converter is able to parse multiple elements of the same type which are not wrapped inside a container\n if (element.resolvedContent.indexOf('<?xml') === 0) {\n index = element.resolvedContent.indexOf('?>') + 2; //find the closing position of the xml declaration, if it exists.\n }\n mergedContent = element.resolvedContent.substr(0,index) + openingTag + element.resolvedContent.substr(index) + closingTag;\n element.resolvedContent = converter.xml_str2json(mergedContent);\n }\n if (isResolvingFinished(resolveObject)) {\n onXlinkAllElementsLoaded(resolveObject);\n }\n }\n\n // We got to wait till all elements of the current queue are resolved before merging back\n function onXlinkAllElementsLoaded (resolveObject) {\n let elements = [];\n let i,\n obj;\n\n mergeElementsBack(resolveObject);\n if (resolveObject.resolveType === RESOLVE_TYPE_ONACTUATE) {\n eventBus.trigger(Events.XLINK_READY, { manifest: manifest });\n }\n if (resolveObject.resolveType === RESOLVE_TYPE_ONLOAD) {\n switch (resolveObject.type) {\n // Start resolving the other elements. We can do Adaptation Set and EventStream in parallel\n case DashConstants.PERIOD:\n for (i = 0; i < manifest[DashConstants.PERIOD + '_asArray'].length; i++) {\n obj = manifest[DashConstants.PERIOD + '_asArray'][i];\n if (obj.hasOwnProperty(DashConstants.ADAPTATION_SET + '_asArray')) {\n elements = elements.concat(getElementsToResolve(obj[DashConstants.ADAPTATION_SET + '_asArray'], obj, DashConstants.ADAPTATION_SET, RESOLVE_TYPE_ONLOAD));\n }\n if (obj.hasOwnProperty(DashConstants.EVENT_STREAM + '_asArray')) {\n elements = elements.concat(getElementsToResolve(obj[DashConstants.EVENT_STREAM + '_asArray'], obj, DashConstants.EVENT_STREAM, RESOLVE_TYPE_ONLOAD));\n }\n }\n resolve(elements, DashConstants.ADAPTATION_SET, RESOLVE_TYPE_ONLOAD);\n break;\n case DashConstants.ADAPTATION_SET:\n // TODO: Resolve SegmentList here\n eventBus.trigger(Events.XLINK_READY, { manifest: manifest });\n break;\n }\n }\n }\n\n // Returns the elements with the specific resolve Type\n function getElementsToResolve(elements, parentElement, type, resolveType) {\n let toResolve = [];\n let element,\n i,\n xlinkObject;\n // first remove all the resolve-to-zero elements\n for (i = elements.length - 1; i >= 0; i--) {\n element = elements[i];\n if (element.hasOwnProperty('xlink:href') && element['xlink:href'] === RESOLVE_TO_ZERO) {\n elements.splice(i, 1);\n }\n }\n // now get the elements with the right resolve type\n for (i = 0; i < elements.length; i++) {\n element = elements[i];\n if (element.hasOwnProperty('xlink:href') && element.hasOwnProperty('xlink:actuate') && element['xlink:actuate'] === resolveType) {\n xlinkObject = createXlinkObject(element['xlink:href'], parentElement, type, i, resolveType, element);\n toResolve.push(xlinkObject);\n }\n }\n return toResolve;\n }\n\n function mergeElementsBack(resolveObject) {\n let resolvedElements = [];\n let element,\n type,\n obj,\n i,\n j,\n k;\n // Start merging back from the end because of index shifting. Note that the elements with the same parent have to be ordered by index ascending\n for (i = resolveObject.elements.length - 1; i >= 0; i --) {\n element = resolveObject.elements[i];\n type = element.type + '_asArray';\n\n // Element couldn't be resolved or is TODO Inappropriate target: Remove all Xlink attributes\n if (!element.resolvedContent || isInappropriateTarget()) {\n delete element.originalContent['xlink:actuate'];\n delete element.originalContent['xlink:href'];\n resolvedElements.push(element.originalContent);\n }\n // Element was successfully resolved\n else if (element.resolvedContent) {\n for (j = 0; j < element.resolvedContent[type].length; j++) {\n //TODO Contains another Xlink attribute with xlink:actuate set to onload. Remove all xLink attributes\n obj = element.resolvedContent[type][j];\n resolvedElements.push(obj);\n }\n }\n // Replace the old elements in the parent with the resolved ones\n element.parentElement[type].splice(element.index, 1);\n for (k = 0; k < resolvedElements.length; k++) {\n element.parentElement[type].splice(element.index + k, 0, resolvedElements[k]);\n }\n resolvedElements = [];\n }\n if (resolveObject.elements.length > 0) {\n iron.run(manifest);\n }\n }\n\n function createXlinkObject(url, parentElement, type, index, resolveType, originalContent) {\n return {\n url: url,\n parentElement: parentElement,\n type: type,\n index: index,\n resolveType: resolveType,\n originalContent: originalContent,\n resolvedContent: null,\n resolved: false\n };\n }\n\n // Check if all pending requests are finished\n function isResolvingFinished(elementsToResolve) {\n let i,\n obj;\n for (i = 0; i < elementsToResolve.elements.length; i++) {\n obj = elementsToResolve.elements[i];\n if (obj.resolved === false) {\n return false;\n }\n }\n return true;\n }\n\n // TODO : Do some syntax check here if the target is valid or not\n function isInappropriateTarget() {\n return false;\n }\n\n instance = {\n resolveManifestOnLoad: resolveManifestOnLoad,\n setMatchers: setMatchers,\n setIron: setIron,\n reset: reset\n };\n\n setup();\n return instance;\n}\n\nXlinkController.__dashjs_factory_name = 'XlinkController';\nexport default FactoryMaker.getClassFactory(XlinkController);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport FactoryMaker from '../../core/FactoryMaker';\n\nfunction ObjectIron(mappers) {\n\n function mergeValues(parentItem, childItem) {\n for (let name in parentItem) {\n if (!childItem.hasOwnProperty(name)) {\n childItem[name] = parentItem[name];\n }\n }\n }\n\n function mapProperties(properties, parent, child) {\n for (let i = 0, len = properties.length; i < len; ++i) {\n const property = properties[i];\n\n if (parent[property.name]) {\n if (child[property.name]) {\n // check to see if we should merge\n if (property.merge) {\n const parentValue = parent[property.name];\n const childValue = child[property.name];\n\n // complex objects; merge properties\n if (typeof parentValue === 'object' && typeof childValue === 'object') {\n mergeValues(parentValue, childValue);\n }\n // simple objects; merge them together\n else {\n child[property.name] = parentValue + childValue;\n }\n }\n } else {\n // just add the property\n child[property.name] = parent[property.name];\n }\n }\n }\n }\n\n function mapItem(item, node) {\n for (let i = 0, len = item.children.length; i < len; ++i) {\n const childItem = item.children[i];\n\n const array = node[childItem.name + '_asArray'];\n if (array) {\n for (let v = 0, len2 = array.length; v < len2; ++v) {\n const childNode = array[v];\n mapProperties(item.properties, node, childNode);\n mapItem(childItem, childNode);\n }\n }\n }\n }\n\n function run(source) {\n\n if (source === null || typeof source !== 'object') {\n return source;\n }\n\n if (source.Period_asArray && 'period' in mappers) {\n const periodMapper = mappers.period;\n const periods = source.Period_asArray;\n for (let i = 0, len = periods.length; i < len; ++i) {\n const period = periods[i];\n mapItem(periodMapper, period);\n\n if ('adaptationset' in mappers) {\n const adaptationSets = period.AdaptationSet_asArray;\n if (adaptationSets) {\n const adaptationSetMapper = mappers.adaptationset;\n for (let i = 0, len = adaptationSets.length; i < len; ++i) {\n mapItem(adaptationSetMapper, adaptationSets[i]);\n }\n }\n }\n }\n }\n\n return source;\n }\n\n return {\n run: run\n };\n}\n\n\nObjectIron.__dashjs_factory_name = 'ObjectIron';\nconst factory = FactoryMaker.getClassFactory(ObjectIron);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n\n/**\n * @classdesc a base type for matching and converting types in manifest to\n * something more useful\n * @ignore\n */\nclass BaseMatcher {\n constructor(test, converter) {\n this._test = test;\n this._converter = converter;\n }\n\n get test() {\n return this._test;\n }\n\n get converter() {\n return this._converter;\n }\n}\n\nexport default BaseMatcher;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @classdesc Matches and converts xs:string to string, but only for specific attributes on specific nodes\n */\nimport BaseMatcher from './BaseMatcher';\nimport DashConstants from '../../constants/DashConstants';\n\nclass StringMatcher extends BaseMatcher {\n constructor() {\n super(\n (attr, nodeName) => {\n const stringAttrsInElements = {\n [DashConstants.MPD]: [ DashConstants.ID, DashConstants.PROFILES ],\n [DashConstants.PERIOD]: [ DashConstants.ID ],\n [DashConstants.BASE_URL]: [ DashConstants.SERVICE_LOCATION, DashConstants.BYTE_RANGE ],\n [DashConstants.SEGMENT_BASE]: [ DashConstants.INDEX_RANGE ],\n [DashConstants.INITIALIZATION]: [ DashConstants.RANGE ],\n [DashConstants.REPRESENTATION_INDEX]: [ DashConstants.RANGE ],\n [DashConstants.SEGMENT_LIST]: [ DashConstants.INDEX_RANGE ],\n [DashConstants.BITSTREAM_SWITCHING]: [ DashConstants.RANGE ],\n [DashConstants.SEGMENT_URL]: [ DashConstants.MEDIA_RANGE, DashConstants.INDEX_RANGE ],\n [DashConstants.SEGMENT_TEMPLATE]: [ DashConstants.INDEX_RANGE, DashConstants.MEDIA, DashConstants.INDEX, DashConstants.INITIALIZATION_MINUS, DashConstants.BITSTREAM_SWITCHING_MINUS ],\n [DashConstants.ASSET_IDENTIFIER]: [ DashConstants.VALUE, DashConstants.ID ],\n [DashConstants.EVENT_STREAM]: [ DashConstants.VALUE ],\n [DashConstants.ADAPTATION_SET]: [ DashConstants.PROFILES, DashConstants.MIME_TYPE, DashConstants.SEGMENT_PROFILES, DashConstants.CODECS, DashConstants.CONTENT_TYPE ],\n [DashConstants.FRAME_PACKING]: [ DashConstants.VALUE, DashConstants.ID ],\n [DashConstants.AUDIO_CHANNEL_CONFIGURATION]: [ DashConstants.VALUE, DashConstants.ID ],\n [DashConstants.CONTENT_PROTECTION]: [ DashConstants.VALUE, DashConstants.ID ],\n [DashConstants.ESSENTIAL_PROPERTY]: [ DashConstants.VALUE, DashConstants.ID ],\n [DashConstants.SUPPLEMENTAL_PROPERTY]: [ DashConstants.VALUE, DashConstants.ID ],\n [DashConstants.INBAND_EVENT_STREAM]: [ DashConstants.VALUE, DashConstants.ID ],\n [DashConstants.ACCESSIBILITY]: [ DashConstants.VALUE, DashConstants.ID ],\n [DashConstants.ROLE]: [ DashConstants.VALUE, DashConstants.ID ],\n [DashConstants.RATING]: [ DashConstants.VALUE, DashConstants.ID ],\n [DashConstants.VIEWPOINT]: [ DashConstants.VALUE, DashConstants.ID ],\n [DashConstants.CONTENT_COMPONENT]: [ DashConstants.CONTENT_TYPE ],\n [DashConstants.REPRESENTATION]: [ DashConstants.ID, DashConstants.DEPENDENCY_ID, DashConstants.MEDIA_STREAM_STRUCTURE_ID ],\n [DashConstants.SUBSET]: [ DashConstants.ID ],\n [DashConstants.METRICS]: [ DashConstants.METRICS_MINUS ],\n [DashConstants.REPORTING]: [ DashConstants.VALUE, DashConstants.ID ]\n };\n if (stringAttrsInElements.hasOwnProperty(nodeName)) {\n let attrNames = stringAttrsInElements[nodeName];\n if (attrNames !== undefined) {\n return attrNames.indexOf(attr.name) >= 0;\n } else {\n return false;\n }\n }\n return false;\n },\n str => String(str)\n );\n }\n}\n\nexport default StringMatcher;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @classdesc matches and converts xs:duration to seconds\n */\nimport BaseMatcher from './BaseMatcher';\nimport Constants from '../../../streaming/constants/Constants';\nimport DashConstants from '../../constants/DashConstants';\n\nconst durationRegex = /^([-])?P(([\\d.]*)Y)?(([\\d.]*)M)?(([\\d.]*)D)?T?(([\\d.]*)H)?(([\\d.]*)M)?(([\\d.]*)S)?/;\n\nconst SECONDS_IN_YEAR = 365 * 24 * 60 * 60;\nconst SECONDS_IN_MONTH = 30 * 24 * 60 * 60;\nconst SECONDS_IN_DAY = 24 * 60 * 60;\nconst SECONDS_IN_HOUR = 60 * 60;\nconst SECONDS_IN_MIN = 60;\n\nclass DurationMatcher extends BaseMatcher {\n constructor() {\n super(\n attr => {\n const attributeList = [\n DashConstants.MIN_BUFFER_TIME, DashConstants.MEDIA_PRESENTATION_DURATION,\n DashConstants.MINIMUM_UPDATE_PERIOD, DashConstants.TIMESHIFT_BUFFER_DEPTH, DashConstants.MAX_SEGMENT_DURATION,\n DashConstants.MAX_SUBSEGMENT_DURATION, DashConstants.SUGGESTED_PRESENTATION_DELAY, DashConstants.START,\n Constants.START_TIME, DashConstants.DURATION\n ];\n const len = attributeList.length;\n\n for (let i = 0; i < len; i++) {\n if (attr.nodeName === attributeList[i]) {\n return durationRegex.test(attr.value);\n }\n }\n\n return false;\n },\n str => {\n //str = \"P10Y10M10DT10H10M10.1S\";\n const match = durationRegex.exec(str);\n let result = (parseFloat(match[3] || 0) * SECONDS_IN_YEAR +\n parseFloat(match[5] || 0) * SECONDS_IN_MONTH +\n parseFloat(match[7] || 0) * SECONDS_IN_DAY +\n parseFloat(match[9] || 0) * SECONDS_IN_HOUR +\n parseFloat(match[11] || 0) * SECONDS_IN_MIN +\n parseFloat(match[13] || 0));\n\n if (match[1] !== undefined) {\n result = -result;\n }\n\n return result;\n }\n );\n }\n}\n\nexport default DurationMatcher;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @classdesc matches and converts xs:datetime to Date\n */\nimport BaseMatcher from './BaseMatcher';\n\nconst SECONDS_IN_MIN = 60;\nconst MINUTES_IN_HOUR = 60;\nconst MILLISECONDS_IN_SECONDS = 1000;\n\nconst datetimeRegex = /^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2})(?::([0-9]*)(\\.[0-9]*)?)?(?:([+-])([0-9]{2})(?::?)([0-9]{2}))?/;\n\nclass DateTimeMatcher extends BaseMatcher {\n constructor() {\n super(\n attr => datetimeRegex.test(attr.value),\n str => {\n const match = datetimeRegex.exec(str);\n let utcDate;\n\n // If the string does not contain a timezone offset different browsers can interpret it either\n // as UTC or as a local time so we have to parse the string manually to normalize the given date value for\n // all browsers\n utcDate = Date.UTC(\n parseInt(match[1], 10),\n parseInt(match[2], 10) - 1, // months start from zero\n parseInt(match[3], 10),\n parseInt(match[4], 10),\n parseInt(match[5], 10),\n (match[6] && parseInt(match[6], 10) || 0),\n (match[7] && parseFloat(match[7]) * MILLISECONDS_IN_SECONDS) || 0);\n\n // If the date has timezone offset take it into account as well\n if (match[9] && match[10]) {\n const timezoneOffset = parseInt(match[9], 10) * MINUTES_IN_HOUR + parseInt(match[10], 10);\n utcDate += (match[8] === '+' ? -1 : +1) * timezoneOffset * SECONDS_IN_MIN * MILLISECONDS_IN_SECONDS;\n }\n\n return new Date(utcDate);\n }\n );\n }\n}\n\nexport default DateTimeMatcher;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @classdesc Matches and converts xs:numeric to float\n */\nimport BaseMatcher from './BaseMatcher';\n\nconst numericRegex = /^[-+]?[0-9]+[.]?[0-9]*([eE][-+]?[0-9]+)?$/;\n\nclass NumericMatcher extends BaseMatcher {\n constructor() {\n super(\n attr => numericRegex.test(attr.value),\n str => parseFloat(str)\n );\n }\n}\n\nexport default NumericMatcher;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @classdesc Matches and converts any ISO 639 language tag to BCP-47 language tags\n */\nimport BaseMatcher from './BaseMatcher';\nimport DashConstants from '../../constants/DashConstants';\nimport bcp47Normalize from 'bcp-47-normalize';\n\nclass LangMatcher extends BaseMatcher {\n constructor() {\n super(\n (attr, nodeName) => {\n const stringAttrsInElements = {\n [DashConstants.ADAPTATION_SET]: [ DashConstants.LANG ],\n [DashConstants.REPRESENTATION]: [ DashConstants.LANG ],\n [DashConstants.CONTENT_COMPONENT]: [ DashConstants.LANG ],\n [DashConstants.LABEL]: [ DashConstants.LANG ],\n [DashConstants.GROUP_LABEL]: [ DashConstants.LANG ]\n // still missing from 23009-1: Preselection@lang, ProgramInformation@lang\n };\n if (stringAttrsInElements.hasOwnProperty(nodeName)) {\n let attrNames = stringAttrsInElements[nodeName];\n if (attrNames !== undefined) {\n return attrNames.indexOf(attr.name) >= 0;\n } else {\n return false;\n }\n }\n return false;\n },\n str => {\n let lang = bcp47Normalize(str);\n if (lang) {\n return lang;\n }\n return String(str);\n }\n );\n }\n}\n\nexport default LangMatcher;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @classdesc a property belonging to a MapNode\n * @ignore\n */\n\nclass CommonProperty {\n constructor(name) {\n const getDefaultMergeForName =\n (n) => n && n.length && n.charAt(0) === n.charAt(0).toUpperCase();\n\n this._name = name;\n this._merge = getDefaultMergeForName(name);\n }\n\n get name() {\n return this._name;\n }\n\n get merge() {\n return this._merge;\n }\n}\n\nexport default CommonProperty;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @classdesc a node at some level in a ValueMap\n */\nimport CommonProperty from './CommonProperty';\n\nclass MapNode {\n constructor(name, properties, children) {\n this._name = name || '';\n this._properties = [];\n this._children = children || [];\n\n if (Array.isArray(properties)) {\n properties.forEach(p => {\n this._properties.push(new CommonProperty(p));\n });\n }\n }\n\n get name() {\n return this._name;\n }\n\n get children() {\n return this._children;\n }\n\n get properties() {\n return this._properties;\n }\n}\n\nexport default MapNode;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @classdesc a RepresentationBaseValuesMap type for input to objectiron\n */\nimport MapNode from './MapNode';\nimport DashConstants from '../../constants/DashConstants';\n\nclass RepresentationBaseValuesMap extends MapNode {\n constructor() {\n const commonProperties = [\n DashConstants.PROFILES, DashConstants.WIDTH, DashConstants.HEIGHT, DashConstants.SAR, DashConstants.FRAMERATE, DashConstants.AUDIO_SAMPLING_RATE, DashConstants.MIME_TYPE, DashConstants.SEGMENT_PROFILES, DashConstants.CODECS, DashConstants.MAXIMUM_SAP_PERIOD, DashConstants.START_WITH_SAP, DashConstants.MAX_PLAYOUT_RATE, DashConstants.CODING_DEPENDENCY, DashConstants.SCAN_TYPE, DashConstants.FRAME_PACKING, DashConstants.AUDIO_CHANNEL_CONFIGURATION, DashConstants.CONTENT_PROTECTION, DashConstants.ESSENTIAL_PROPERTY, DashConstants.ESSENTIAL_PROPERTY+'_asArray', DashConstants.SUPPLEMENTAL_PROPERTY, DashConstants.INBAND_EVENT_STREAM\n ];\n\n super(DashConstants.ADAPTATION_SET, commonProperties, [\n new MapNode(DashConstants.REPRESENTATION, commonProperties, [\n new MapNode(DashConstants.SUB_REPRESENTATION, commonProperties)\n ])\n ]);\n }\n}\n\nexport default RepresentationBaseValuesMap;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @classdesc a SegmentValuesMap type for input to objectiron\n */\nimport MapNode from './MapNode';\nimport DashConstants from '../../constants/DashConstants';\n\nclass SegmentValuesMap extends MapNode {\n constructor() {\n const commonProperties = [\n DashConstants.SEGMENT_BASE, DashConstants.SEGMENT_TEMPLATE, DashConstants.SEGMENT_LIST\n ];\n\n super(DashConstants.PERIOD, commonProperties, [\n new MapNode(DashConstants.ADAPTATION_SET, commonProperties, [\n new MapNode(DashConstants.REPRESENTATION, commonProperties)\n ])\n ]);\n }\n}\n\nexport default SegmentValuesMap;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport FactoryMaker from '../../core/FactoryMaker';\nimport ObjectIron from './objectiron';\nimport X2JS from '../../../externals/xml2json';\nimport StringMatcher from './matchers/StringMatcher';\nimport DurationMatcher from './matchers/DurationMatcher';\nimport DateTimeMatcher from './matchers/DateTimeMatcher';\nimport NumericMatcher from './matchers/NumericMatcher';\nimport LangMatcher from './matchers/LangMatcher';\nimport RepresentationBaseValuesMap from './maps/RepresentationBaseValuesMap';\nimport SegmentValuesMap from './maps/SegmentValuesMap';\n\nfunction DashParser(config) {\n\n config = config || {};\n const context = this.context;\n const debug = config.debug;\n\n let instance,\n logger,\n matchers,\n converter,\n objectIron;\n\n function setup() {\n logger = debug.getLogger(instance);\n matchers = [\n new DurationMatcher(),\n new DateTimeMatcher(),\n new NumericMatcher(),\n new LangMatcher(),\n new StringMatcher()// last in list to take precedence over NumericMatcher\n ];\n\n converter = new X2JS({\n escapeMode: false,\n attributePrefix: '',\n arrayAccessForm: 'property',\n emptyNodeForm: 'object',\n stripWhitespaces: false,\n enableToStringFunc: true,\n ignoreRoot: false,\n matchers: matchers\n });\n\n objectIron = ObjectIron(context).create({\n adaptationset: new RepresentationBaseValuesMap(),\n period: new SegmentValuesMap()\n });\n }\n\n function getMatchers() {\n return matchers;\n }\n\n function getIron() {\n return objectIron;\n }\n\n function parse(data) {\n let manifest;\n const startTime = window.performance.now();\n\n manifest = converter.xml_str2json(data);\n\n if (!manifest) {\n throw new Error('parsing the manifest failed');\n }\n\n const jsonTime = window.performance.now();\n\n // handle full MPD and Patch ironing separately\n if (manifest.Patch) {\n manifest = manifest.Patch; // drop root reference\n // apply iron to patch operations individually\n if (manifest.add_asArray) {\n manifest.add_asArray.forEach((operand) => objectIron.run(operand));\n }\n if (manifest.replace_asArray) {\n manifest.replace_asArray.forEach((operand) => objectIron.run(operand));\n }\n // note that we don't need to iron remove as they contain no children\n } else {\n manifest = manifest.MPD; // drop root reference\n objectIron.run(manifest);\n }\n\n const ironedTime = window.performance.now();\n logger.info('Parsing complete: ( xml2json: ' + (jsonTime - startTime).toPrecision(3) + 'ms, objectiron: ' + (ironedTime - jsonTime).toPrecision(3) + 'ms, total: ' + ((ironedTime - startTime) / 1000).toPrecision(3) + 's)');\n\n manifest.protocol = 'DASH';\n\n return manifest;\n }\n\n instance = {\n parse: parse,\n getMatchers: getMatchers,\n getIron: getIron\n };\n\n setup();\n\n return instance;\n}\n\nDashParser.__dashjs_factory_name = 'DashParser';\nexport default FactoryMaker.getClassFactory(DashParser);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport Constants from './constants/Constants';\nimport DashConstants from '../dash/constants/DashConstants';\nimport XlinkController from './controllers/XlinkController';\nimport URLLoader from './net/URLLoader';\nimport URLUtils from './utils/URLUtils';\nimport TextRequest from './vo/TextRequest';\nimport DashJSError from './vo/DashJSError';\nimport {HTTPRequest} from './vo/metrics/HTTPRequest';\nimport EventBus from '../core/EventBus';\nimport Events from '../core/events/Events';\nimport Errors from '../core/errors/Errors';\nimport FactoryMaker from '../core/FactoryMaker';\nimport DashParser from '../dash/parser/DashParser';\n\nfunction ManifestLoader(config) {\n\n config = config || {};\n const context = this.context;\n const debug = config.debug;\n const settings = config.settings;\n const eventBus = EventBus(context).getInstance();\n const urlUtils = URLUtils(context).getInstance();\n\n let instance,\n logger,\n urlLoader,\n xlinkController,\n parser;\n\n let mssHandler = config.mssHandler;\n let errHandler = config.errHandler;\n\n function setup() {\n logger = debug.getLogger(instance);\n eventBus.on(Events.XLINK_READY, onXlinkReady, instance);\n\n urlLoader = URLLoader(context).create({\n errHandler: config.errHandler,\n dashMetrics: config.dashMetrics,\n mediaPlayerModel: config.mediaPlayerModel,\n requestModifier: config.requestModifier,\n urlUtils: urlUtils,\n constants: Constants,\n dashConstants: DashConstants,\n errors: Errors,\n requestTimeout: config.settings.get().streaming.manifestRequestTimeout\n });\n\n xlinkController = XlinkController(context).create({\n errHandler: errHandler,\n dashMetrics: config.dashMetrics,\n mediaPlayerModel: config.mediaPlayerModel,\n requestModifier: config.requestModifier,\n settings: config.settings\n });\n\n parser = null;\n }\n\n function onXlinkReady(event) {\n eventBus.trigger(Events.INTERNAL_MANIFEST_LOADED, { manifest: event.manifest });\n }\n\n function createParser(data) {\n let parser = null;\n // Analyze manifest content to detect protocol and select appropriate parser\n if (data.indexOf('SmoothStreamingMedia') > -1) {\n //do some business to transform it into a Dash Manifest\n if (mssHandler) {\n parser = mssHandler.createMssParser();\n mssHandler.createMssFragmentProcessor();\n mssHandler.registerEvents();\n }\n return parser;\n } else if (data.indexOf('MPD') > -1 || data.indexOf('Patch') > -1) {\n return DashParser(context).create({ debug: debug });\n } else {\n return parser;\n }\n }\n\n function load(url, serviceLocation = null, queryParams = null) {\n\n const requestStartDate = new Date();\n const request = new TextRequest(url, HTTPRequest.MPD_TYPE);\n\n if (serviceLocation) {\n request.serviceLocation = serviceLocation;\n }\n\n if (queryParams) {\n request.queryParams = queryParams;\n }\n\n if (!request.requestStartDate) {\n request.requestStartDate = requestStartDate;\n }\n\n eventBus.trigger(\n Events.MANIFEST_LOADING_STARTED, {\n request\n }\n );\n\n urlLoader.load({\n request: request,\n success: function (data, textStatus, responseURL) {\n // Manage situations in which success is called after calling reset\n if (!xlinkController) return;\n\n let actualUrl,\n baseUri,\n manifest;\n\n // Handle redirects for the MPD - as per RFC3986 Section 5.1.3\n // also handily resolves relative MPD URLs to absolute\n if (responseURL && responseURL !== url) {\n baseUri = urlUtils.parseBaseUrl(responseURL);\n actualUrl = responseURL;\n } else {\n // usually this case will be caught and resolved by\n // responseURL above but it is not available for IE11 and Edge/12 and Edge/13\n // baseUri must be absolute for BaseURL resolution later\n if (urlUtils.isRelative(url)) {\n url = urlUtils.resolve(url, window.location.href);\n }\n\n baseUri = urlUtils.parseBaseUrl(url);\n }\n\n // A response of no content implies in-memory is properly up to date\n if (textStatus == 'No Content') {\n eventBus.trigger(\n Events.INTERNAL_MANIFEST_LOADED, {\n manifest: null\n }\n );\n return;\n }\n\n // Create parser according to manifest type\n if (parser === null) {\n parser = createParser(data);\n }\n\n if (parser === null) {\n eventBus.trigger(Events.INTERNAL_MANIFEST_LOADED, {\n manifest: null,\n error: new DashJSError(\n Errors.MANIFEST_LOADER_PARSING_FAILURE_ERROR_CODE,\n Errors.MANIFEST_LOADER_PARSING_FAILURE_ERROR_MESSAGE + `${url}`\n )\n });\n return;\n }\n\n // init xlinkcontroller with matchers and iron object from created parser\n xlinkController.setMatchers(parser.getMatchers());\n xlinkController.setIron(parser.getIron());\n\n try {\n manifest = parser.parse(data);\n } catch (e) {\n eventBus.trigger(Events.INTERNAL_MANIFEST_LOADED, {\n manifest: null,\n error: new DashJSError(\n Errors.MANIFEST_LOADER_PARSING_FAILURE_ERROR_CODE,\n Errors.MANIFEST_LOADER_PARSING_FAILURE_ERROR_MESSAGE + `${url}`\n )\n });\n return;\n }\n\n if (manifest) {\n manifest.url = actualUrl || url;\n\n // URL from which the MPD was originally retrieved (MPD updates will not change this value)\n if (!manifest.originalUrl) {\n manifest.originalUrl = manifest.url;\n }\n\n // If there is a mismatch between the manifest's specified duration and the total duration of all periods,\n // and the specified duration is greater than the total duration of all periods,\n // overwrite the manifest's duration attribute. This is a patch for if a manifest is generated incorrectly.\n if (settings &&\n settings.get().streaming.enableManifestDurationMismatchFix &&\n manifest.mediaPresentationDuration &&\n manifest.Period_asArray.length > 1) {\n const sumPeriodDurations = manifest.Period_asArray.reduce((totalDuration, period) => totalDuration + period.duration, 0);\n if (!isNaN(sumPeriodDurations) && manifest.mediaPresentationDuration > sumPeriodDurations) {\n logger.warn('Media presentation duration greater than duration of all periods. Setting duration to total period duration');\n manifest.mediaPresentationDuration = sumPeriodDurations;\n }\n }\n\n manifest.baseUri = baseUri;\n manifest.loadedTime = new Date();\n xlinkController.resolveManifestOnLoad(manifest);\n\n eventBus.trigger(Events.ORIGINAL_MANIFEST_LOADED, { originalManifest: data });\n } else {\n eventBus.trigger(Events.INTERNAL_MANIFEST_LOADED, {\n manifest: null,\n error: new DashJSError(\n Errors.MANIFEST_LOADER_PARSING_FAILURE_ERROR_CODE,\n Errors.MANIFEST_LOADER_PARSING_FAILURE_ERROR_MESSAGE + `${url}`\n )\n });\n }\n },\n error: function (request, statusText, errorText) {\n eventBus.trigger(Events.INTERNAL_MANIFEST_LOADED, {\n manifest: null,\n error: new DashJSError(\n Errors.MANIFEST_LOADER_LOADING_FAILURE_ERROR_CODE,\n Errors.MANIFEST_LOADER_LOADING_FAILURE_ERROR_MESSAGE + `${url}, ${errorText}`\n )\n });\n }\n });\n }\n\n function reset() {\n eventBus.off(Events.XLINK_READY, onXlinkReady, instance);\n\n if (mssHandler) {\n mssHandler.reset();\n }\n\n if (xlinkController) {\n xlinkController.reset();\n xlinkController = null;\n }\n\n if (urlLoader) {\n urlLoader.abort();\n urlLoader = null;\n }\n }\n\n instance = {\n load: load,\n reset: reset\n };\n\n setup();\n\n return instance;\n}\n\nManifestLoader.__dashjs_factory_name = 'ManifestLoader';\n\nconst factory = FactoryMaker.getClassFactory(ManifestLoader);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport EventBus from '../../core/EventBus';\nimport Events from '../../core/events/Events';\nimport FactoryMaker from '../../core/FactoryMaker';\n\n/**\n * @module ErrorHandler\n * @ignore\n */\nfunction ErrorHandler() {\n\n let instance;\n const context = this.context;\n const eventBus = EventBus(context).getInstance();\n\n /**\n * @param {object} err DashJSError with code, message and data attributes\n * @memberof module:ErrorHandler\n */\n function error(err) {\n eventBus.trigger(Events.ERROR, { error: err });\n }\n instance = {\n error: error\n };\n\n return instance;\n}\n\nErrorHandler.__dashjs_factory_name = 'ErrorHandler';\nexport default FactoryMaker.getSingletonFactory(ErrorHandler);\n","import FactoryMaker from '../../core/FactoryMaker';\nimport Debug from '../../core/Debug';\nimport Constants from '../constants/Constants';\nimport EventBus from '../../core/EventBus';\nimport Events from '../../core/events/Events';\n\nfunction CapabilitiesFilter() {\n\n const context = this.context;\n const eventBus = EventBus(context).getInstance();\n\n let instance,\n adapter,\n capabilities,\n settings,\n customParametersModel,\n logger;\n\n\n function setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n }\n\n function setConfig(config) {\n if (!config) {\n return;\n }\n\n if (config.adapter) {\n adapter = config.adapter;\n }\n\n if (config.capabilities) {\n capabilities = config.capabilities;\n }\n\n if (config.settings) {\n settings = config.settings;\n }\n\n if (config.customParametersModel) {\n customParametersModel = config.customParametersModel;\n }\n\n }\n\n function filterUnsupportedFeatures(manifest) {\n return new Promise((resolve) => {\n const promises = [];\n\n promises.push(_filterUnsupportedCodecs(Constants.VIDEO, manifest));\n promises.push(_filterUnsupportedCodecs(Constants.AUDIO, manifest));\n\n Promise.all(promises)\n .then(() => {\n if (settings.get().streaming.capabilities.filterUnsupportedEssentialProperties) {\n _filterUnsupportedEssentialProperties(manifest);\n }\n _applyCustomFilters(manifest);\n resolve();\n })\n .catch(() => {\n resolve();\n });\n });\n }\n\n\n function _filterUnsupportedCodecs(type, manifest) {\n if (!manifest || !manifest.Period_asArray || manifest.Period_asArray.length === 0) {\n return Promise.resolve();\n }\n\n const promises = [];\n manifest.Period_asArray.forEach((period) => {\n promises.push(_filterUnsupportedAdaptationSetsOfPeriod(period, type));\n });\n\n return Promise.all(promises);\n }\n\n function _filterUnsupportedAdaptationSetsOfPeriod(period, type) {\n return new Promise((resolve) => {\n\n if (!period || !period.AdaptationSet_asArray || period.AdaptationSet_asArray.length === 0) {\n resolve();\n return;\n }\n\n const promises = [];\n period.AdaptationSet_asArray.forEach((as) => {\n if (adapter.getIsTypeOf(as, type)) {\n promises.push(_filterUnsupportedRepresentationsOfAdaptation(as, type));\n }\n });\n\n Promise.all(promises)\n .then(() => {\n period.AdaptationSet_asArray = period.AdaptationSet_asArray.filter((as) => {\n const supported = as.Representation_asArray && as.Representation_asArray.length > 0;\n\n if (!supported) {\n eventBus.trigger(Events.ADAPTATION_SET_REMOVED_NO_CAPABILITIES, {\n adaptationSet: as\n });\n logger.warn(`AdaptationSet has been removed because of no supported Representation`);\n }\n\n return supported;\n });\n\n resolve();\n })\n .catch(() => {\n resolve();\n });\n });\n\n }\n\n function _filterUnsupportedRepresentationsOfAdaptation(as, type) {\n return new Promise((resolve) => {\n\n if (!as.Representation_asArray || as.Representation_asArray.length === 0) {\n resolve();\n return;\n }\n\n const promises = [];\n const configurations = [];\n\n as.Representation_asArray.forEach((rep, i) => {\n const codec = adapter.getCodec(as, i, false);\n const config = _createConfiguration(type, rep, codec);\n\n configurations.push(config);\n promises.push(capabilities.supportsCodec(config, type));\n });\n\n Promise.all(promises)\n .then((supported) => {\n as.Representation_asArray = as.Representation_asArray.filter((_, i) => {\n if (!supported[i]) {\n logger.debug(`[Stream] Codec ${configurations[i].codec} not supported `);\n }\n return supported[i];\n });\n resolve();\n })\n .catch(() => {\n resolve();\n });\n });\n }\n\n function _createConfiguration(type, rep, codec) {\n switch (type) {\n case Constants.VIDEO:\n return _createVideoConfiguration(rep, codec);\n case Constants.AUDIO:\n return _createAudioConfiguration(rep, codec);\n default:\n return null;\n\n }\n }\n\n function _createVideoConfiguration(rep, codec) {\n const width = rep.width || null;\n const height = rep.height || null;\n const framerate = rep.frameRate || null;\n const bitrate = rep.bandwidth || null;\n\n return {\n codec,\n width,\n height,\n framerate,\n bitrate\n };\n }\n\n function _createAudioConfiguration(rep, codec) {\n const samplerate = rep.audioSamplingRate || null;\n const bitrate = rep.bandwidth || null;\n\n return {\n codec,\n bitrate,\n samplerate\n };\n }\n\n function _filterUnsupportedEssentialProperties(manifest) {\n\n if (!manifest || !manifest.Period_asArray || manifest.Period_asArray.length === 0) {\n return;\n }\n\n manifest.Period_asArray.forEach((period) => {\n period.AdaptationSet_asArray = period.AdaptationSet_asArray.filter((as) => {\n\n if (!as.Representation_asArray || as.Representation_asArray.length === 0) {\n return true;\n }\n\n as.Representation_asArray = as.Representation_asArray.filter((rep) => {\n const essentialProperties = adapter.getEssentialPropertiesForRepresentation(rep);\n\n if (essentialProperties && essentialProperties.length > 0) {\n let i = 0;\n while (i < essentialProperties.length) {\n if (!capabilities.supportsEssentialProperty(essentialProperties[i])) {\n logger.debug('[Stream] EssentialProperty not supported: ' + essentialProperties[i].schemeIdUri);\n return false;\n }\n i += 1;\n }\n }\n\n return true;\n });\n\n return as.Representation_asArray && as.Representation_asArray.length > 0;\n });\n });\n\n }\n\n function _applyCustomFilters(manifest) {\n const customCapabilitiesFilters = customParametersModel.getCustomCapabilitiesFilters();\n if (!customCapabilitiesFilters || customCapabilitiesFilters.length === 0 || !manifest || !manifest.Period_asArray || manifest.Period_asArray.length === 0) {\n return;\n }\n\n manifest.Period_asArray.forEach((period) => {\n period.AdaptationSet_asArray = period.AdaptationSet_asArray.filter((as) => {\n\n if (!as.Representation_asArray || as.Representation_asArray.length === 0) {\n return true;\n }\n\n as.Representation_asArray = as.Representation_asArray.filter((representation) => {\n return !customCapabilitiesFilters.some(customFilter => !customFilter(representation));\n });\n\n return as.Representation_asArray && as.Representation_asArray.length > 0;\n });\n });\n }\n\n instance = {\n setConfig,\n filterUnsupportedFeatures\n };\n\n setup();\n\n return instance;\n}\n\nCapabilitiesFilter.__dashjs_factory_name = 'CapabilitiesFilter';\nexport default FactoryMaker.getSingletonFactory(CapabilitiesFilter);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass URIFragmentData {\n constructor() {\n this.t = null;\n this.xywh = null;\n this.track = null;\n this.id = null;\n this.s = null;\n this.r = null;\n }\n}\n\nexport default URIFragmentData;\n\n/*\n From Spec http://www.w3.org/TR/media-frags/\n\n temporal (t) - This dimension denotes a specific time range in the original media, such as \"starting at second 10, continuing until second 20\";\n spatial (xywh) - this dimension denotes a specific range of pixels in the original media, such as \"a rectangle with size (100,100) with its top-left at coordinate (10,10)\";\n Media fragments support also addressing the media along two additional dimensions (in the advanced version defined in Media Fragments 1.0 URI (advanced)):\n track (track) - this dimension denotes one or more tracks in the original media, such as \"the english audio and the video track\";\n id (id) - this dimension denotes a named temporal fragment within the original media, such as \"chapter 2\", and can be seen as a convenient way of specifying a temporal fragment.\n\n\n ## Note\n Akamai is purposing to add #s=X to the ISO standard.\n - (X) Value would be a start time to seek to at startup instead of starting at 0 or live edge\n - Allows for seeking back before the start time unlike a temporal clipping.\n*/","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport URIFragmentData from '../vo/URIFragmentData';\nimport FactoryMaker from '../../core/FactoryMaker';\n\n/**\n * Model class managing URI fragments.\n * @ignore\n */\nfunction URIFragmentModel() {\n\n let instance,\n URIFragmentDataVO;\n\n /**\n * @param {string} uri The URI to parse for fragment extraction\n * @memberof module:URIFragmentModel\n * @instance\n */\n function initialize(uri) {\n URIFragmentDataVO = new URIFragmentData();\n\n if (!uri) return null;\n\n const hashIndex = uri.indexOf('#');\n if (hashIndex !== -1) {\n const fragments = uri.substr(hashIndex + 1).split('&');\n for (let i = 0, len = fragments.length; i < len; ++i) {\n const fragment = fragments[i];\n const equalIndex = fragment.indexOf('=');\n if (equalIndex !== -1) {\n const key = fragment.substring(0,equalIndex);\n if (URIFragmentDataVO.hasOwnProperty(key)) {\n URIFragmentDataVO[key] = fragment.substr(equalIndex + 1);\n }\n }\n }\n }\n }\n\n /**\n * @returns {URIFragmentData} Object containing supported URI fragments\n * @memberof module:URIFragmentModel\n * @instance\n */\n function getURIFragmentData() {\n return URIFragmentDataVO;\n }\n\n instance = {\n initialize: initialize,\n getURIFragmentData: getURIFragmentData\n };\n\n return instance;\n}\n\nURIFragmentModel.__dashjs_factory_name = 'URIFragmentModel';\nexport default FactoryMaker.getSingletonFactory(URIFragmentModel);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport EventBus from '../../core/EventBus';\nimport Events from '../../core/events/Events';\nimport FactoryMaker from '../../core/FactoryMaker';\n\nfunction ManifestModel() {\n\n let context = this.context;\n let eventBus = EventBus(context).getInstance();\n\n let instance,\n manifest;\n\n function getValue() {\n return manifest;\n }\n\n function setValue(value) {\n manifest = value;\n if (value) {\n eventBus.trigger(Events.MANIFEST_LOADED, { data: value });\n }\n }\n\n instance = {\n getValue: getValue,\n setValue: setValue\n };\n\n return instance;\n}\n\nManifestModel.__dashjs_factory_name = 'ManifestModel';\nexport default FactoryMaker.getSingletonFactory(ManifestModel);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport Debug from '../../core/Debug';\nimport FactoryMaker from '../../core/FactoryMaker';\nimport Settings from '../../core/Settings';\n\nconst DEFAULT_MIN_BUFFER_TIME = 12;\nconst DEFAULT_MIN_BUFFER_TIME_FAST_SWITCH = 20;\nconst LOW_LATENCY_REDUCTION_FACTOR = 10;\nconst LOW_LATENCY_MULTIPLY_FACTOR = 5;\nconst DEFAULT_CATCHUP_MAX_DRIFT = 12;\nconst DEFAULT_CATCHUP_PLAYBACK_RATE_MIN = -0.5;\nconst DEFAULT_CATCHUP_PLAYBACK_RATE_MAX = 0.5;\nconst CATCHUP_PLAYBACK_RATE_MIN_LIMIT = -0.5;\nconst CATCHUP_PLAYBACK_RATE_MAX_LIMIT = 1;\n\n/**\n * We use this model as a wrapper/proxy between Settings.js and classes that are using parameters from Settings.js.\n * In some cases we require additional logic to be applied and the settings might need to be adjusted before being used.\n * @class\n * @constructor\n */\nfunction MediaPlayerModel() {\n\n let instance,\n logger,\n playbackController,\n serviceDescriptionController;\n\n const context = this.context;\n const settings = Settings(context).getInstance();\n\n function setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n }\n\n function setConfig(config) {\n if (config.playbackController) {\n playbackController = config.playbackController;\n }\n if (config.serviceDescriptionController) {\n serviceDescriptionController = config.serviceDescriptionController;\n }\n }\n\n /**\n * Checks the supplied min playback rate is a valid vlaue and within supported limits\n * @param {number} rate - Supplied min playback rate \n * @param {boolean} log - wether to shown warning or not \n * @returns {number} corrected min playback rate\n */\n function _checkMinPlaybackRate (rate, log) {\n if (isNaN(rate)) return 0;\n if (rate > 0) {\n if (log) {\n logger.warn(`Supplied minimum playback rate is a positive value when it should be negative or 0. The supplied rate will not be applied and set to 0: 100% playback speed.`)\n }\n return 0;\n } \n if (rate < CATCHUP_PLAYBACK_RATE_MIN_LIMIT) {\n if (log) {\n logger.warn(`Supplied minimum playback rate is out of range and will be limited to ${CATCHUP_PLAYBACK_RATE_MIN_LIMIT}: ${CATCHUP_PLAYBACK_RATE_MIN_LIMIT * 100}% playback speed.`);\n }\n return CATCHUP_PLAYBACK_RATE_MIN_LIMIT;\n }\n return rate;\n };\n\n /**\n * Checks the supplied max playback rate is a valid vlaue and within supported limits\n * @param {number} rate - Supplied max playback rate \n * @param {boolean} log - wether to shown warning or not \n * @returns {number} corrected max playback rate\n */\n function _checkMaxPlaybackRate (rate, log) {\n if (isNaN(rate)) return 0;\n if (rate < 0) {\n if (log) {\n logger.warn(`Supplied maximum playback rate is a negative value when it should be negative or 0. The supplied rate will not be applied and set to 0: 100% playback speed.`)\n }\n return 0;\n } \n if (rate > CATCHUP_PLAYBACK_RATE_MAX_LIMIT) {\n if (log) {\n logger.warn(`Supplied maximum playback rate is out of range and will be limited to ${CATCHUP_PLAYBACK_RATE_MAX_LIMIT}: ${(1 + CATCHUP_PLAYBACK_RATE_MAX_LIMIT) * 100}% playback speed.`);\n }\n return CATCHUP_PLAYBACK_RATE_MAX_LIMIT;\n }\n return rate;\n };\n\n /**\n * Returns the maximum drift allowed before applying a seek back to the live edge when the catchup mode is enabled\n * @return {number}\n */\n function getCatchupMaxDrift() {\n if (!isNaN(settings.get().streaming.liveCatchup.maxDrift) && settings.get().streaming.liveCatchup.maxDrift > 0) {\n return settings.get().streaming.liveCatchup.maxDrift;\n }\n\n const serviceDescriptionSettings = serviceDescriptionController.getServiceDescriptionSettings();\n if (serviceDescriptionSettings && serviceDescriptionSettings.liveCatchup && !isNaN(serviceDescriptionSettings.liveCatchup.maxDrift) && serviceDescriptionSettings.liveCatchup.maxDrift > 0) {\n return serviceDescriptionSettings.liveCatchup.maxDrift;\n }\n\n return DEFAULT_CATCHUP_MAX_DRIFT;\n }\n\n /**\n * Returns the minimum and maximum playback rates to be used when applying the catchup mechanism\n * If only one of the min/max values has been set then the other will default to 0 (no playback rate change).\n * @return {number}\n */\n function getCatchupPlaybackRates(log) {\n const settingsPlaybackRate = settings.get().streaming.liveCatchup.playbackRate;\n \n if(!isNaN(settingsPlaybackRate.min) || !isNaN(settingsPlaybackRate.max)) {\n return {\n min: _checkMinPlaybackRate(settingsPlaybackRate.min, log),\n max: _checkMaxPlaybackRate(settingsPlaybackRate.max, log),\n }\n }\n\n const serviceDescriptionSettings = serviceDescriptionController.getServiceDescriptionSettings();\n if (serviceDescriptionSettings && serviceDescriptionSettings.liveCatchup && (!isNaN(serviceDescriptionSettings.liveCatchup.playbackRate.min) || !isNaN(serviceDescriptionSettings.liveCatchup.playbackRate.max))) {\n const sdPlaybackRate = serviceDescriptionSettings.liveCatchup.playbackRate;\n return {\n min: _checkMinPlaybackRate(sdPlaybackRate.min, log),\n max: _checkMaxPlaybackRate(sdPlaybackRate.max, log),\n }\n }\n\n return {\n min: DEFAULT_CATCHUP_PLAYBACK_RATE_MIN,\n max: DEFAULT_CATCHUP_PLAYBACK_RATE_MAX\n }\n }\n\n /**\n * Returns whether the catchup mode is activated via the settings or internally in the PlaybackController\n * @return {boolean}\n */\n function getCatchupModeEnabled() {\n if (settings.get().streaming.liveCatchup.enabled !== null) {\n return settings.get().streaming.liveCatchup.enabled;\n }\n\n return playbackController.getInitialCatchupModeActivated();\n }\n\n /**\n * Returns the min,max or initial bitrate for a specific media type.\n * @param {string} field\n * @param {string} mediaType\n */\n function getAbrBitrateParameter(field, mediaType) {\n try {\n const setting = settings.get().streaming.abr[field][mediaType];\n if(!isNaN(setting) && setting !== -1) {\n return setting;\n }\n\n const serviceDescriptionSettings = serviceDescriptionController.getServiceDescriptionSettings();\n if(serviceDescriptionSettings && serviceDescriptionSettings[field] && !isNaN(serviceDescriptionSettings[field][mediaType])) {\n return serviceDescriptionSettings[field][mediaType];\n }\n\n return -1;\n }\n catch(e) {\n return -1;\n }\n }\n\n /**\n * Returns the initial buffer level taking the stable buffer time into account\n * @return {number}\n */\n function getInitialBufferLevel() {\n const initialBufferLevel = settings.get().streaming.buffer.initialBufferLevel;\n\n if (isNaN(initialBufferLevel) || initialBufferLevel < 0) {\n return 0;\n }\n\n return Math.min(getStableBufferTime(), initialBufferLevel);\n }\n\n /**\n * Returns the stable buffer time taking the live delay into account\n * @return {number}\n */\n function getStableBufferTime() {\n let stableBufferTime = settings.get().streaming.buffer.stableBufferTime > 0 ? settings.get().streaming.buffer.stableBufferTime : settings.get().streaming.buffer.fastSwitchEnabled ? DEFAULT_MIN_BUFFER_TIME_FAST_SWITCH : DEFAULT_MIN_BUFFER_TIME;\n const liveDelay = playbackController.getLiveDelay();\n\n return !isNaN(liveDelay) && liveDelay > 0 ? Math.min(stableBufferTime, liveDelay) : stableBufferTime;\n }\n\n /**\n * Returns the number of retry attempts for a specific media type\n * @param type\n * @return {number}\n */\n function getRetryAttemptsForType(type) {\n const lowLatencyMultiplyFactor = !isNaN(settings.get().streaming.retryAttempts.lowLatencyMultiplyFactor) ? settings.get().streaming.retryAttempts.lowLatencyMultiplyFactor : LOW_LATENCY_MULTIPLY_FACTOR;\n\n return playbackController.getLowLatencyModeEnabled() ? settings.get().streaming.retryAttempts[type] * lowLatencyMultiplyFactor : settings.get().streaming.retryAttempts[type];\n }\n\n /**\n * Returns the retry interval for a specific media type\n * @param type\n * @return {number}\n */\n function getRetryIntervalsForType(type) {\n const lowLatencyReductionFactor = !isNaN(settings.get().streaming.retryIntervals.lowLatencyReductionFactor) ? settings.get().streaming.retryIntervals.lowLatencyReductionFactor : LOW_LATENCY_REDUCTION_FACTOR;\n\n return playbackController.getLowLatencyModeEnabled() ? settings.get().streaming.retryIntervals[type] / lowLatencyReductionFactor : settings.get().streaming.retryIntervals[type];\n }\n\n function reset() {\n }\n\n instance = {\n getCatchupMaxDrift,\n getCatchupModeEnabled,\n getStableBufferTime,\n getInitialBufferLevel,\n getRetryAttemptsForType,\n getRetryIntervalsForType,\n getCatchupPlaybackRates,\n getAbrBitrateParameter,\n setConfig,\n reset\n };\n\n setup();\n\n return instance;\n}\n\nMediaPlayerModel.__dashjs_factory_name = 'MediaPlayerModel';\nexport default FactoryMaker.getSingletonFactory(MediaPlayerModel);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport FactoryMaker from '../../core/FactoryMaker';\n\nfunction RulesContext(config) {\n\n config = config || {};\n let instance;\n const abrController = config.abrController;\n const switchHistory = config.switchHistory;\n const droppedFramesHistory = config.droppedFramesHistory;\n const currentRequest = config.currentRequest;\n const bufferOccupancyABR = config.useBufferOccupancyABR;\n const l2AABR = config.useL2AABR;\n const loLP = config.useLoLPABR;\n const scheduleController = config.streamProcessor ? config.streamProcessor.getScheduleController() : null;\n const representationInfo = config.streamProcessor ? config.streamProcessor.getRepresentationInfo() : null;\n const videoModel = config.videoModel ? config.videoModel : null;\n\n function getMediaType() {\n const mediaInfo = getMediaInfo();\n return mediaInfo ? mediaInfo.type : null;\n }\n\n function getStreamInfo() {\n const mediaInfo = getMediaInfo();\n return mediaInfo ? mediaInfo.streamInfo : null;\n }\n\n function getMediaInfo() {\n return representationInfo ? representationInfo.mediaInfo : null;\n }\n\n function getRepresentationInfo() {\n return representationInfo;\n }\n\n function getScheduleController() {\n return scheduleController;\n }\n\n function getAbrController() {\n return abrController;\n }\n\n function getSwitchHistory() {\n return switchHistory;\n }\n\n function getVideoModel() {\n return videoModel;\n }\n\n function getDroppedFramesHistory() {\n return droppedFramesHistory;\n }\n\n function getCurrentRequest() {\n return currentRequest;\n }\n\n function useBufferOccupancyABR() {\n return bufferOccupancyABR;\n }\n function useL2AABR() {\n return l2AABR;\n }\n\n function useLoLPABR() {\n return loLP;\n }\n\n instance = {\n getMediaType,\n getMediaInfo,\n getDroppedFramesHistory,\n getCurrentRequest,\n getSwitchHistory,\n getStreamInfo,\n getScheduleController,\n getAbrController,\n getRepresentationInfo,\n useBufferOccupancyABR,\n useL2AABR,\n useLoLPABR,\n getVideoModel\n };\n\n return instance;\n}\n\nRulesContext.__dashjs_factory_name = 'RulesContext';\nexport default FactoryMaker.getClassFactory(RulesContext);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport FactoryMaker from '../../core/FactoryMaker';\nimport SwitchRequest from './SwitchRequest';\n\nconst SWITCH_REQUEST_HISTORY_DEPTH = 8; // must be > SwitchHistoryRule SAMPLE_SIZE to enable rule\n\nfunction SwitchRequestHistory() {\n let switchRequests = []; // running total\n let srHistory = []; // history of each switch\n\n function push(switchRequest) {\n if (switchRequest.newValue === SwitchRequest.NO_CHANGE) {\n switchRequest.newValue = switchRequest.oldValue;\n }\n if (!switchRequests[switchRequest.oldValue]) {\n switchRequests[switchRequest.oldValue] = {noDrops: 0, drops: 0, dropSize: 0};\n }\n\n // Set switch details\n let indexDiff = switchRequest.newValue - switchRequest.oldValue;\n let drop = (indexDiff < 0) ? 1 : 0;\n let dropSize = drop ? -indexDiff : 0;\n let noDrop = drop ? 0 : 1;\n\n // Update running totals\n switchRequests[switchRequest.oldValue].drops += drop;\n switchRequests[switchRequest.oldValue].dropSize += dropSize;\n switchRequests[switchRequest.oldValue].noDrops += noDrop;\n\n // Save to history\n srHistory.push({idx: switchRequest.oldValue, noDrop: noDrop, drop: drop, dropSize: dropSize});\n\n // Shift earliest switch off srHistory and readjust to keep depth of running totals constant\n if ( srHistory.length > SWITCH_REQUEST_HISTORY_DEPTH ) {\n let srHistoryFirst = srHistory.shift();\n switchRequests[srHistoryFirst.idx].drops -= srHistoryFirst.drop;\n switchRequests[srHistoryFirst.idx].dropSize -= srHistoryFirst.dropSize;\n switchRequests[srHistoryFirst.idx].noDrops -= srHistoryFirst.noDrop;\n }\n }\n\n function getSwitchRequests() {\n return switchRequests;\n }\n\n function reset() {\n switchRequests = [];\n srHistory = [];\n }\n\n return {\n push: push,\n getSwitchRequests: getSwitchRequests,\n reset: reset\n };\n}\n\nSwitchRequestHistory.__dashjs_factory_name = 'SwitchRequestHistory';\nconst factory = FactoryMaker.getClassFactory(SwitchRequestHistory);\nexport default factory;\n","import FactoryMaker from '../../core/FactoryMaker';\n\nfunction DroppedFramesHistory() {\n\n let values = {};\n let lastDroppedFrames = {};\n let lastTotalFrames = {};\n\n function push(streamId, index, playbackQuality) {\n\n if (!index) {\n return;\n }\n\n if (!values[streamId]) {\n values[streamId] = [];\n lastDroppedFrames[streamId] = 0;\n lastTotalFrames[streamId] = 0;\n }\n\n let droppedVideoFrames = playbackQuality && playbackQuality.droppedVideoFrames ? playbackQuality.droppedVideoFrames : 0;\n let totalVideoFrames = playbackQuality && playbackQuality.totalVideoFrames ? playbackQuality.totalVideoFrames : 0;\n\n let intervalDroppedFrames = droppedVideoFrames - lastDroppedFrames[streamId];\n lastDroppedFrames[streamId] = droppedVideoFrames;\n\n let intervalTotalFrames = totalVideoFrames - lastTotalFrames[streamId];\n lastTotalFrames[streamId] = totalVideoFrames;\n\n const current = values[streamId];\n if (!isNaN(index)) {\n if (!current[index]) {\n current[index] = { droppedVideoFrames: intervalDroppedFrames, totalVideoFrames: intervalTotalFrames };\n } else {\n current[index].droppedVideoFrames += intervalDroppedFrames;\n current[index].totalVideoFrames += intervalTotalFrames;\n }\n }\n }\n\n function getFrameHistory(streamId) {\n return values[streamId];\n }\n\n function clearForStream(streamId) {\n try {\n delete values[streamId];\n delete lastDroppedFrames[streamId];\n delete lastTotalFrames[streamId];\n } catch (e) {\n\n }\n }\n\n function reset() {\n values = {};\n lastDroppedFrames = {};\n lastTotalFrames = {};\n }\n\n return {\n push,\n getFrameHistory,\n clearForStream,\n reset\n };\n}\n\nDroppedFramesHistory.__dashjs_factory_name = 'DroppedFramesHistory';\nconst factory = FactoryMaker.getClassFactory(DroppedFramesHistory);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2017, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport Constants from '../constants/Constants';\nimport FactoryMaker from '../../core/FactoryMaker';\nimport EventBus from '../../core/EventBus';\nimport MediaPlayerEvents from '../MediaPlayerEvents';\n\n// throughput generally stored in kbit/s\n// latency generally stored in ms\n\nfunction ThroughputHistory(config) {\n const context = this.context;\n config = config || {};\n // sliding window constants\n const MAX_MEASUREMENTS_TO_KEEP = 20;\n const AVERAGE_THROUGHPUT_SAMPLE_AMOUNT_LIVE = 3;\n const AVERAGE_THROUGHPUT_SAMPLE_AMOUNT_VOD = 4;\n const AVERAGE_LATENCY_SAMPLE_AMOUNT = 4;\n const THROUGHPUT_DECREASE_SCALE = 1.3;\n const THROUGHPUT_INCREASE_SCALE = 1.3;\n\n // EWMA constants\n const EWMA_THROUGHPUT_SLOW_HALF_LIFE_SECONDS = 8;\n const EWMA_THROUGHPUT_FAST_HALF_LIFE_SECONDS = 3;\n const EWMA_LATENCY_SLOW_HALF_LIFE_COUNT = 2;\n const EWMA_LATENCY_FAST_HALF_LIFE_COUNT = 1;\n\n const settings = config.settings;\n const eventBus = EventBus(context).getInstance();\n\n let throughputDict,\n latencyDict,\n ewmaThroughputDict,\n ewmaLatencyDict,\n ewmaHalfLife;\n\n function setup() {\n ewmaHalfLife = {\n throughputHalfLife: {\n fast: EWMA_THROUGHPUT_FAST_HALF_LIFE_SECONDS,\n slow: EWMA_THROUGHPUT_SLOW_HALF_LIFE_SECONDS\n },\n latencyHalfLife: { fast: EWMA_LATENCY_FAST_HALF_LIFE_COUNT, slow: EWMA_LATENCY_SLOW_HALF_LIFE_COUNT }\n };\n\n reset();\n }\n\n function isCachedResponse(mediaType, latencyMs, downloadTimeMs) {\n if (mediaType === Constants.VIDEO) {\n return downloadTimeMs < settings.get().streaming.cacheLoadThresholds[Constants.VIDEO];\n } else if (mediaType === Constants.AUDIO) {\n return downloadTimeMs < settings.get().streaming.cacheLoadThresholds[Constants.AUDIO];\n }\n }\n\n function push(mediaType, httpRequest, useDeadTimeLatency) {\n if (!httpRequest.trace || !httpRequest.trace.length) {\n return;\n }\n\n const latencyTimeInMilliseconds = (httpRequest.tresponse.getTime() - httpRequest.trequest.getTime()) || 1;\n const downloadTimeInMilliseconds = (httpRequest._tfinish.getTime() - httpRequest.tresponse.getTime()) || 1; //Make sure never 0 we divide by this value. Avoid infinity!\n const downloadBytes = httpRequest.trace.reduce((a, b) => a + b.b[0], 0);\n let throughputMeasureTime = 0, throughput = 0;\n\n if (httpRequest._fileLoaderType && httpRequest._fileLoaderType === Constants.FILE_LOADER_TYPES.FETCH) {\n throughputMeasureTime = httpRequest.trace.reduce((a, b) => a + b.d, 0);\n } else {\n throughputMeasureTime = useDeadTimeLatency ? downloadTimeInMilliseconds : latencyTimeInMilliseconds + downloadTimeInMilliseconds;\n }\n\n if (throughputMeasureTime !== 0) {\n throughput = Math.round((8 * downloadBytes) / throughputMeasureTime); // bits/ms = kbits/s\n }\n\n // Get estimated throughput (etp, in kbits/s) from CMSD response headers\n if (httpRequest.cmsd) {\n const etp = httpRequest.cmsd.dynamic && httpRequest.cmsd.dynamic.etp ? httpRequest.cmsd.dynamic.etp : null;\n if (etp) {\n // Apply weight ratio on etp\n const etpWeightRatio = settings.get().streaming.cmsd.abr.etpWeightRatio;\n if (etpWeightRatio > 0 && etpWeightRatio <= 1) {\n throughput = (throughput * (1 - etpWeightRatio)) + (etp * etpWeightRatio);\n }\n }\n }\n\n checkSettingsForMediaType(mediaType);\n\n if (isCachedResponse(mediaType, latencyTimeInMilliseconds, downloadTimeInMilliseconds)) {\n if (throughputDict[mediaType].length > 0 && !throughputDict[mediaType].hasCachedEntries) {\n // already have some entries which are not cached entries\n // prevent cached fragment loads from skewing the average values\n return;\n } else { // have no entries || have cached entries\n // no uncached entries yet, rely on cached entries because ABR rules need something to go by\n throughputDict[mediaType].hasCachedEntries = true;\n }\n } else if (throughputDict[mediaType] && throughputDict[mediaType].hasCachedEntries) {\n // if we are here then we have some entries already, but they are cached, and now we have a new uncached entry\n clearSettingsForMediaType(mediaType);\n }\n\n throughputDict[mediaType].push(throughput);\n eventBus.trigger(MediaPlayerEvents.THROUGHPUT_MEASUREMENT_STORED, {\n throughput,\n mediaType,\n httpRequest\n })\n if (throughputDict[mediaType].length > MAX_MEASUREMENTS_TO_KEEP) {\n throughputDict[mediaType].shift();\n }\n\n latencyDict[mediaType].push(latencyTimeInMilliseconds);\n if (latencyDict[mediaType].length > MAX_MEASUREMENTS_TO_KEEP) {\n latencyDict[mediaType].shift();\n }\n\n updateEwmaEstimate(ewmaThroughputDict[mediaType], throughput, 0.001 * downloadTimeInMilliseconds, ewmaHalfLife.throughputHalfLife);\n updateEwmaEstimate(ewmaLatencyDict[mediaType], latencyTimeInMilliseconds, 1, ewmaHalfLife.latencyHalfLife);\n }\n\n function updateEwmaEstimate(ewmaObj, value, weight, halfLife) {\n // Note about startup:\n // Estimates start at 0, so early values are underestimated.\n // This effect is countered in getAverageEwma() by dividing the estimates by:\n // 1 - Math.pow(0.5, ewmaObj.totalWeight / halfLife)\n\n const fastAlpha = Math.pow(0.5, weight / halfLife.fast);\n ewmaObj.fastEstimate = (1 - fastAlpha) * value + fastAlpha * ewmaObj.fastEstimate;\n\n const slowAlpha = Math.pow(0.5, weight / halfLife.slow);\n ewmaObj.slowEstimate = (1 - slowAlpha) * value + slowAlpha * ewmaObj.slowEstimate;\n\n ewmaObj.totalWeight += weight;\n }\n\n function getSampleSize(isThroughput, mediaType, isDynamic) {\n let arr,\n sampleSize;\n\n if (isThroughput) {\n arr = throughputDict[mediaType];\n sampleSize = isDynamic ? AVERAGE_THROUGHPUT_SAMPLE_AMOUNT_LIVE : AVERAGE_THROUGHPUT_SAMPLE_AMOUNT_VOD;\n } else {\n arr = latencyDict[mediaType];\n sampleSize = AVERAGE_LATENCY_SAMPLE_AMOUNT;\n }\n\n if (!arr) {\n sampleSize = 0;\n } else if (sampleSize >= arr.length) {\n sampleSize = arr.length;\n } else if (isThroughput) {\n // if throughput samples vary a lot, average over a wider sample\n for (let i = 1; i < sampleSize; ++i) {\n const ratio = arr[arr.length - i] / arr[arr.length - i - 1];\n if (ratio >= THROUGHPUT_INCREASE_SCALE || ratio <= 1 / THROUGHPUT_DECREASE_SCALE) {\n sampleSize += 1;\n if (sampleSize === arr.length) { // cannot increase sampleSize beyond arr.length\n break;\n }\n }\n }\n }\n\n return sampleSize;\n }\n\n function getAverage(isThroughput, mediaType, isDynamic) {\n // only two moving average methods defined at the moment\n return settings.get().streaming.abr.movingAverageMethod !== Constants.MOVING_AVERAGE_SLIDING_WINDOW ?\n getAverageEwma(isThroughput, mediaType) : getAverageSlidingWindow(isThroughput, mediaType, isDynamic);\n }\n\n function getAverageSlidingWindow(isThroughput, mediaType, isDynamic) {\n const sampleSize = getSampleSize(isThroughput, mediaType, isDynamic);\n const dict = isThroughput ? throughputDict : latencyDict;\n let arr = dict[mediaType];\n\n if (sampleSize === 0 || !arr || arr.length === 0) {\n return NaN;\n }\n\n arr = arr.slice(-sampleSize); // still works if sampleSize too large\n // arr.length >= 1\n return arr.reduce((total, elem) => total + elem) / arr.length;\n }\n\n function getAverageEwma(isThroughput, mediaType) {\n const halfLife = isThroughput ? ewmaHalfLife.throughputHalfLife : ewmaHalfLife.latencyHalfLife;\n const ewmaObj = isThroughput ? ewmaThroughputDict[mediaType] : ewmaLatencyDict[mediaType];\n\n if (!ewmaObj || ewmaObj.totalWeight <= 0) {\n return NaN;\n }\n\n // to correct for startup, divide by zero factor = 1 - Math.pow(0.5, ewmaObj.totalWeight / halfLife)\n const fastEstimate = ewmaObj.fastEstimate / (1 - Math.pow(0.5, ewmaObj.totalWeight / halfLife.fast));\n const slowEstimate = ewmaObj.slowEstimate / (1 - Math.pow(0.5, ewmaObj.totalWeight / halfLife.slow));\n return isThroughput ? Math.min(fastEstimate, slowEstimate) : Math.max(fastEstimate, slowEstimate);\n }\n\n function getAverageThroughput(mediaType, isDynamic) {\n return getAverage(true, mediaType, isDynamic);\n }\n\n function getSafeAverageThroughput(mediaType, isDynamic) {\n let average = getAverageThroughput(mediaType, isDynamic);\n if (!isNaN(average)) {\n average *= settings.get().streaming.abr.bandwidthSafetyFactor;\n }\n return average;\n }\n\n function getAverageLatency(mediaType) {\n return getAverage(false, mediaType);\n }\n\n function checkSettingsForMediaType(mediaType) {\n throughputDict[mediaType] = throughputDict[mediaType] || [];\n latencyDict[mediaType] = latencyDict[mediaType] || [];\n ewmaThroughputDict[mediaType] = ewmaThroughputDict[mediaType] || {\n fastEstimate: 0,\n slowEstimate: 0,\n totalWeight: 0\n };\n ewmaLatencyDict[mediaType] = ewmaLatencyDict[mediaType] || { fastEstimate: 0, slowEstimate: 0, totalWeight: 0 };\n }\n\n function clearSettingsForMediaType(mediaType) {\n delete throughputDict[mediaType];\n delete latencyDict[mediaType];\n delete ewmaThroughputDict[mediaType];\n delete ewmaLatencyDict[mediaType];\n checkSettingsForMediaType(mediaType);\n }\n\n function reset() {\n throughputDict = {};\n latencyDict = {};\n ewmaThroughputDict = {};\n ewmaLatencyDict = {};\n }\n\n const instance = {\n push,\n getAverageThroughput,\n getSafeAverageThroughput,\n getAverageLatency,\n reset\n };\n\n setup();\n return instance;\n}\n\nThroughputHistory.__dashjs_factory_name = 'ThroughputHistory';\nexport default FactoryMaker.getClassFactory(ThroughputHistory);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport ABRRulesCollection from '../rules/abr/ABRRulesCollection';\nimport Constants from '../constants/Constants';\nimport MetricsConstants from '../constants/MetricsConstants';\nimport BitrateInfo from '../vo/BitrateInfo';\nimport FragmentModel from '../models/FragmentModel';\nimport EventBus from '../../core/EventBus';\nimport Events from '../../core/events/Events';\nimport FactoryMaker from '../../core/FactoryMaker';\nimport RulesContext from '../rules/RulesContext';\nimport SwitchRequest from '../rules/SwitchRequest';\nimport SwitchRequestHistory from '../rules/SwitchRequestHistory';\nimport DroppedFramesHistory from '../rules/DroppedFramesHistory';\nimport ThroughputHistory from '../rules/ThroughputHistory';\nimport Debug from '../../core/Debug';\nimport {HTTPRequest} from '../vo/metrics/HTTPRequest';\nimport {checkInteger} from '../utils/SupervisorTools';\nimport MediaPlayerEvents from '../MediaPlayerEvents';\n\nconst DEFAULT_VIDEO_BITRATE = 1000;\nconst DEFAULT_AUDIO_BITRATE = 100;\nconst QUALITY_DEFAULT = 0;\n\nfunction AbrController() {\n\n const context = this.context;\n const debug = Debug(context).getInstance();\n const eventBus = EventBus(context).getInstance();\n\n let instance,\n logger,\n abrRulesCollection,\n streamController,\n topQualities,\n qualityDict,\n streamProcessorDict,\n abandonmentStateDict,\n abandonmentTimeout,\n windowResizeEventCalled,\n elementWidth,\n elementHeight,\n adapter,\n videoModel,\n mediaPlayerModel,\n customParametersModel,\n cmsdModel,\n domStorage,\n playbackIndex,\n switchHistoryDict,\n droppedFramesHistory,\n throughputHistory,\n isUsingBufferOccupancyAbrDict,\n isUsingL2AAbrDict,\n isUsingLoLPAbrDict,\n dashMetrics,\n settings;\n\n function setup() {\n logger = debug.getLogger(instance);\n resetInitialSettings();\n }\n\n /**\n * Initialize everything that is not Stream specific. We only have one instance of the ABR Controller for all periods.\n */\n function initialize() {\n droppedFramesHistory = DroppedFramesHistory(context).create();\n throughputHistory = ThroughputHistory(context).create({\n settings\n });\n\n abrRulesCollection = ABRRulesCollection(context).create({\n dashMetrics,\n customParametersModel,\n mediaPlayerModel,\n settings\n });\n\n abrRulesCollection.initialize();\n\n eventBus.on(MediaPlayerEvents.QUALITY_CHANGE_RENDERED, _onQualityChangeRendered, instance);\n eventBus.on(MediaPlayerEvents.METRIC_ADDED, _onMetricAdded, instance);\n eventBus.on(Events.LOADING_PROGRESS, _onFragmentLoadProgress, instance);\n }\n\n /**\n * Whenever a StreamProcessor is created it is added to the list of streamProcessorDict\n * In addition, the corresponding objects for this object and its stream id are created\n * @param {object} type\n * @param {object} streamProcessor\n */\n function registerStreamType(type, streamProcessor) {\n const streamId = streamProcessor.getStreamInfo().id;\n\n if (!streamProcessorDict[streamId]) {\n streamProcessorDict[streamId] = {};\n }\n\n if (!switchHistoryDict[streamId]) {\n switchHistoryDict[streamId] = {};\n }\n\n if (!abandonmentStateDict[streamId]) {\n abandonmentStateDict[streamId] = {};\n }\n\n switchHistoryDict[streamId][type] = SwitchRequestHistory(context).create();\n streamProcessorDict[streamId][type] = streamProcessor;\n\n abandonmentStateDict[streamId][type] = {};\n abandonmentStateDict[streamId][type].state = MetricsConstants.ALLOW_LOAD;\n\n _initializeAbrStrategy(type);\n\n if (type === Constants.VIDEO) {\n setElementSize();\n }\n }\n\n function _initializeAbrStrategy(type) {\n const strategy = settings.get().streaming.abr.ABRStrategy;\n\n if (strategy === Constants.ABR_STRATEGY_L2A) {\n isUsingBufferOccupancyAbrDict[type] = false;\n isUsingLoLPAbrDict[type] = false;\n isUsingL2AAbrDict[type] = true;\n } else if (strategy === Constants.ABR_STRATEGY_LoLP) {\n isUsingBufferOccupancyAbrDict[type] = false;\n isUsingLoLPAbrDict[type] = true;\n isUsingL2AAbrDict[type] = false;\n } else if (strategy === Constants.ABR_STRATEGY_BOLA) {\n isUsingBufferOccupancyAbrDict[type] = true;\n isUsingLoLPAbrDict[type] = false;\n isUsingL2AAbrDict[type] = false;\n } else if (strategy === Constants.ABR_STRATEGY_THROUGHPUT) {\n isUsingBufferOccupancyAbrDict[type] = false;\n isUsingLoLPAbrDict[type] = false;\n isUsingL2AAbrDict[type] = false;\n } else if (strategy === Constants.ABR_STRATEGY_DYNAMIC) {\n isUsingBufferOccupancyAbrDict[type] = isUsingBufferOccupancyAbrDict && isUsingBufferOccupancyAbrDict[type] ? isUsingBufferOccupancyAbrDict[type] : false;\n isUsingLoLPAbrDict[type] = false;\n isUsingL2AAbrDict[type] = false;\n }\n }\n\n function unRegisterStreamType(streamId, type) {\n try {\n if (streamProcessorDict[streamId] && streamProcessorDict[streamId][type]) {\n delete streamProcessorDict[streamId][type];\n }\n\n if (switchHistoryDict[streamId] && switchHistoryDict[streamId][type]) {\n delete switchHistoryDict[streamId][type];\n }\n\n if (abandonmentStateDict[streamId] && abandonmentStateDict[streamId][type]) {\n delete abandonmentStateDict[streamId][type];\n }\n\n } catch (e) {\n\n }\n }\n\n function resetInitialSettings() {\n topQualities = {};\n qualityDict = {};\n abandonmentStateDict = {};\n streamProcessorDict = {};\n switchHistoryDict = {};\n isUsingBufferOccupancyAbrDict = {};\n isUsingL2AAbrDict = {};\n isUsingLoLPAbrDict = {};\n\n if (windowResizeEventCalled === undefined) {\n windowResizeEventCalled = false;\n }\n if (droppedFramesHistory) {\n droppedFramesHistory.reset();\n }\n\n playbackIndex = undefined;\n droppedFramesHistory = undefined;\n throughputHistory = undefined;\n clearTimeout(abandonmentTimeout);\n abandonmentTimeout = null;\n }\n\n function reset() {\n\n resetInitialSettings();\n\n eventBus.off(Events.LOADING_PROGRESS, _onFragmentLoadProgress, instance);\n eventBus.off(MediaPlayerEvents.QUALITY_CHANGE_RENDERED, _onQualityChangeRendered, instance);\n eventBus.off(MediaPlayerEvents.METRIC_ADDED, _onMetricAdded, instance);\n\n if (abrRulesCollection) {\n abrRulesCollection.reset();\n }\n }\n\n function setConfig(config) {\n if (!config) return;\n\n if (config.streamController) {\n streamController = config.streamController;\n }\n if (config.domStorage) {\n domStorage = config.domStorage;\n }\n if (config.mediaPlayerModel) {\n mediaPlayerModel = config.mediaPlayerModel;\n }\n if (config.customParametersModel) {\n customParametersModel = config.customParametersModel;\n }\n if (config.cmsdModel) {\n cmsdModel = config.cmsdModel\n }\n if (config.dashMetrics) {\n dashMetrics = config.dashMetrics;\n }\n if (config.adapter) {\n adapter = config.adapter;\n }\n if (config.videoModel) {\n videoModel = config.videoModel;\n }\n if (config.settings) {\n settings = config.settings;\n }\n }\n\n function checkConfig() {\n if (!domStorage || !domStorage.hasOwnProperty('getSavedBitrateSettings')) {\n throw new Error(Constants.MISSING_CONFIG_ERROR);\n }\n }\n\n /**\n * While fragment loading is in progress we check if we might need to abort the request\n * @param {object} e\n * @private\n */\n function _onFragmentLoadProgress(e) {\n const type = e.request.mediaType;\n const streamId = e.streamId;\n\n if (!type || !streamId || !streamProcessorDict[streamId] || !settings.get().streaming.abr.autoSwitchBitrate[type]) {\n return;\n }\n\n const streamProcessor = streamProcessorDict[streamId][type];\n if (!streamProcessor) {\n return;\n }\n\n const rulesContext = RulesContext(context).create({\n abrController: instance,\n streamProcessor: streamProcessor,\n currentRequest: e.request,\n useBufferOccupancyABR: isUsingBufferOccupancyAbrDict[type],\n useL2AABR: isUsingL2AAbrDict[type],\n useLoLPABR: isUsingLoLPAbrDict[type],\n videoModel\n });\n const switchRequest = abrRulesCollection.shouldAbandonFragment(rulesContext, streamId);\n\n if (switchRequest.quality > SwitchRequest.NO_CHANGE) {\n const fragmentModel = streamProcessor.getFragmentModel();\n const request = fragmentModel.getRequests({\n state: FragmentModel.FRAGMENT_MODEL_LOADING,\n index: e.request.index\n })[0];\n if (request) {\n abandonmentStateDict[streamId][type].state = MetricsConstants.ABANDON_LOAD;\n switchHistoryDict[streamId][type].reset();\n switchHistoryDict[streamId][type].push({\n oldValue: getQualityFor(type, streamId),\n newValue: switchRequest.quality,\n confidence: 1,\n reason: switchRequest.reason\n });\n setPlaybackQuality(type, streamController.getActiveStreamInfo(), switchRequest.quality, switchRequest.reason);\n\n clearTimeout(abandonmentTimeout);\n abandonmentTimeout = setTimeout(\n () => {\n abandonmentStateDict[streamId][type].state = MetricsConstants.ALLOW_LOAD;\n abandonmentTimeout = null;\n },\n settings.get().streaming.abandonLoadTimeout\n );\n }\n }\n }\n\n /**\n * Update dropped frames history when the quality was changed\n * @param {object} e\n * @private\n */\n function _onQualityChangeRendered(e) {\n if (e.mediaType === Constants.VIDEO) {\n if (playbackIndex !== undefined) {\n droppedFramesHistory.push(e.streamId, playbackIndex, videoModel.getPlaybackQuality());\n }\n playbackIndex = e.newQuality;\n }\n }\n\n /**\n * When the buffer level is updated we check if we need to change the ABR strategy\n * @param e\n * @private\n */\n function _onMetricAdded(e) {\n if (e.metric === MetricsConstants.HTTP_REQUEST && e.value && e.value.type === HTTPRequest.MEDIA_SEGMENT_TYPE && (e.mediaType === Constants.AUDIO || e.mediaType === Constants.VIDEO)) {\n throughputHistory.push(e.mediaType, e.value, settings.get().streaming.abr.useDeadTimeLatency);\n }\n\n if (e.metric === MetricsConstants.BUFFER_LEVEL && (e.mediaType === Constants.AUDIO || e.mediaType === Constants.VIDEO)) {\n _updateAbrStrategy(e.mediaType, 0.001 * e.value.level);\n }\n }\n\n /**\n * Returns the highest possible index taking limitations like maxBitrate, representationRatio and portal size into account.\n * @param {string} type\n * @param {string} streamId\n * @return {undefined|number}\n */\n function getMaxAllowedIndexFor(type, streamId) {\n try {\n let idx;\n topQualities[streamId] = topQualities[streamId] || {};\n\n if (!topQualities[streamId].hasOwnProperty(type)) {\n topQualities[streamId][type] = 0;\n }\n\n idx = _checkMaxBitrate(type, streamId);\n idx = _checkMaxRepresentationRatio(idx, type, streamId);\n idx = _checkPortalSize(idx, type, streamId);\n // Apply maximum suggested bitrate from CMSD headers if enabled \n if (settings.get().streaming.cmsd.enabled && settings.get().streaming.cmsd.abr.applyMb) {\n idx = _checkCmsdMaxBitrate(idx, type, streamId);\n }\n return idx;\n } catch (e) {\n return undefined\n }\n }\n\n /**\n * Returns the minimum allowed index. We consider thresholds defined in the settings, i.e. minBitrate for the corresponding media type.\n * @param {string} type\n * @param {string} streamId\n * @return {undefined|number}\n */\n function getMinAllowedIndexFor(type, streamId) {\n try {\n return _getMinIndexBasedOnBitrateFor(type, streamId);\n } catch (e) {\n return undefined\n }\n }\n\n /**\n * Returns the maximum allowed index.\n * @param {string} type\n * @param {string} streamId\n * @return {undefined|number}\n */\n function _getMaxIndexBasedOnBitrateFor(type, streamId) {\n try {\n const maxBitrate = mediaPlayerModel.getAbrBitrateParameter('maxBitrate', type);\n if (maxBitrate > -1) {\n return getQualityForBitrate(streamProcessorDict[streamId][type].getMediaInfo(), maxBitrate, streamId);\n } else {\n return undefined;\n }\n } catch (e) {\n return undefined\n }\n }\n\n /**\n * Returns the minimum allowed index.\n * @param {string} type\n * @param {string} streamId\n * @return {undefined|number}\n */\n function _getMinIndexBasedOnBitrateFor(type, streamId) {\n try {\n const minBitrate = mediaPlayerModel.getAbrBitrateParameter('minBitrate', type);\n\n if (minBitrate > -1) {\n const mediaInfo = streamProcessorDict[streamId][type].getMediaInfo();\n const bitrateList = getBitrateList(mediaInfo);\n // This returns the quality index <= for the given bitrate\n let minIdx = getQualityForBitrate(mediaInfo, minBitrate, streamId);\n if (bitrateList[minIdx] && minIdx < bitrateList.length - 1 && bitrateList[minIdx].bitrate < minBitrate * 1000) {\n minIdx++; // Go to the next bitrate\n }\n return minIdx;\n } else {\n return undefined;\n }\n } catch (e) {\n return undefined;\n }\n }\n\n /**\n * Returns the maximum possible index\n * @param type\n * @param streamId\n * @return {number|*}\n */\n function _checkMaxBitrate(type, streamId) {\n let idx = topQualities[streamId][type];\n let newIdx = idx;\n\n if (!streamProcessorDict[streamId] || !streamProcessorDict[streamId][type]) {\n return newIdx;\n }\n\n const minIdx = getMinAllowedIndexFor(type, streamId);\n if (minIdx !== undefined) {\n newIdx = Math.max(idx, minIdx);\n }\n\n const maxIdx = _getMaxIndexBasedOnBitrateFor(type, streamId);\n if (maxIdx !== undefined) {\n newIdx = Math.min(newIdx, maxIdx);\n }\n\n return newIdx;\n }\n\n /**\n * Returns the maximum possible index from CMSD model\n * @param type\n * @param streamId\n * @return {number|*}\n */\n function _checkCmsdMaxBitrate(idx, type, streamId) {\n // Check CMSD max suggested bitrate only for video segments\n if (type !== 'video') {\n return idx;\n }\n // Get max suggested bitrate\n let maxCmsdBitrate = cmsdModel.getMaxBitrate(type);\n if (maxCmsdBitrate < 0) {\n return idx;\n }\n // Substract audio bitrate\n const audioBitrate = _getBitrateInfoForQuality(streamId, 'audio', getQualityFor('audio', streamId));\n maxCmsdBitrate -= audioBitrate ? (audioBitrate.bitrate / 1000) : 0;\n const maxIdx = getQualityForBitrate(streamProcessorDict[streamId][type].getMediaInfo(), maxCmsdBitrate, streamId);\n logger.debug('Stream ID: ' + streamId + ' [' + type + '] Apply max bit rate from CMSD: ' + maxCmsdBitrate);\n return Math.min(idx, maxIdx);\n }\n\n /**\n * Returns the maximum index according to maximum representation ratio\n * @param idx\n * @param type\n * @param streamId\n * @return {number|*}\n * @private\n */\n function _checkMaxRepresentationRatio(idx, type, streamId) {\n let maxIdx = topQualities[streamId][type]\n const maxRepresentationRatio = settings.get().streaming.abr.maxRepresentationRatio[type];\n\n if (isNaN(maxRepresentationRatio) || maxRepresentationRatio >= 1 || maxRepresentationRatio < 0) {\n return idx;\n }\n return Math.min(idx, Math.round(maxIdx * maxRepresentationRatio));\n }\n\n /**\n * Returns the maximum index according to the portal size\n * @param idx\n * @param type\n * @param streamId\n * @return {number|*}\n * @private\n */\n function _checkPortalSize(idx, type, streamId) {\n if (type !== Constants.VIDEO || !settings.get().streaming.abr.limitBitrateByPortal || !streamProcessorDict[streamId] || !streamProcessorDict[streamId][type]) {\n return idx;\n }\n\n if (!windowResizeEventCalled) {\n setElementSize();\n }\n const streamInfo = streamProcessorDict[streamId][type].getStreamInfo();\n const representation = adapter.getAdaptationForType(streamInfo.index, type, streamInfo).Representation_asArray;\n let newIdx = idx;\n\n if (elementWidth > 0 && elementHeight > 0) {\n while (\n newIdx > 0 &&\n representation[newIdx] &&\n elementWidth < representation[newIdx].width &&\n elementWidth - representation[newIdx - 1].width < representation[newIdx].width - elementWidth) {\n newIdx = newIdx - 1;\n }\n\n // Make sure that in case of multiple representation elements have same\n // resolution, every such element is included\n while (newIdx < representation.length - 1 && representation[newIdx].width === representation[newIdx + 1].width) {\n newIdx = newIdx + 1;\n }\n }\n\n return newIdx;\n }\n\n /**\n * Gets top BitrateInfo for the player\n * @param {string} type - 'video' or 'audio' are the type options.\n * @param {string} streamId - Id of the stream\n * @returns {BitrateInfo | null}\n */\n function getTopBitrateInfoFor(type, streamId = null) {\n if (!streamId) {\n streamId = streamController.getActiveStreamInfo().id;\n }\n if (type && streamProcessorDict && streamProcessorDict[streamId] && streamProcessorDict[streamId][type]) {\n const idx = getMaxAllowedIndexFor(type, streamId);\n const bitrates = getBitrateList(streamProcessorDict[streamId][type].getMediaInfo());\n return bitrates[idx] ? bitrates[idx] : null;\n }\n return null;\n }\n\n /**\n * Returns the initial bitrate for a specific media type and stream id\n * @param {string} type\n * @param {string} streamId\n * @returns {number} A value of the initial bitrate, kbps\n * @memberof AbrController#\n */\n function getInitialBitrateFor(type, streamId) {\n checkConfig();\n\n if (type === Constants.TEXT) {\n return NaN;\n }\n\n const savedBitrate = domStorage.getSavedBitrateSettings(type);\n let configBitrate = mediaPlayerModel.getAbrBitrateParameter('initialBitrate', type);\n let configRatio = settings.get().streaming.abr.initialRepresentationRatio[type];\n\n if (configBitrate === -1) {\n if (configRatio > -1) {\n const streamInfo = streamProcessorDict[streamId][type].getStreamInfo();\n const representation = adapter.getAdaptationForType(streamInfo.index, type, streamInfo).Representation_asArray;\n if (Array.isArray(representation)) {\n const repIdx = Math.max(Math.round(representation.length * configRatio) - 1, 0);\n configBitrate = representation[repIdx].bandwidth / 1000;\n } else {\n configBitrate = 0;\n }\n } else if (!isNaN(savedBitrate)) {\n configBitrate = savedBitrate;\n } else {\n configBitrate = (type === Constants.VIDEO) ? DEFAULT_VIDEO_BITRATE : DEFAULT_AUDIO_BITRATE;\n }\n }\n\n return configBitrate;\n }\n\n /**\n * This function is called by the scheduleControllers to check if the quality should be changed.\n * Consider this the main entry point for the ABR decision logic\n * @param {string} type\n * @param {string} streamId\n */\n function checkPlaybackQuality(type, streamId) {\n try {\n if (!type || !streamProcessorDict || !streamProcessorDict[streamId] || !streamProcessorDict[streamId][type]) {\n return false;\n }\n\n if (droppedFramesHistory) {\n const playbackQuality = videoModel.getPlaybackQuality();\n if (playbackQuality) {\n droppedFramesHistory.push(streamId, playbackIndex, playbackQuality);\n }\n }\n\n // ABR is turned off, do nothing\n if (!settings.get().streaming.abr.autoSwitchBitrate[type]) {\n return false;\n }\n\n const oldQuality = getQualityFor(type, streamId);\n const rulesContext = RulesContext(context).create({\n abrController: instance,\n switchHistory: switchHistoryDict[streamId][type],\n droppedFramesHistory: droppedFramesHistory,\n streamProcessor: streamProcessorDict[streamId][type],\n currentValue: oldQuality,\n useBufferOccupancyABR: isUsingBufferOccupancyAbrDict[type],\n useL2AABR: isUsingL2AAbrDict[type],\n useLoLPABR: isUsingLoLPAbrDict[type],\n videoModel\n });\n const minIdx = getMinAllowedIndexFor(type, streamId);\n const maxIdx = getMaxAllowedIndexFor(type, streamId);\n const switchRequest = abrRulesCollection.getMaxQuality(rulesContext);\n let newQuality = switchRequest.quality;\n\n if (minIdx !== undefined && ((newQuality > SwitchRequest.NO_CHANGE) ? newQuality : oldQuality) < minIdx) {\n newQuality = minIdx;\n }\n if (newQuality > maxIdx) {\n newQuality = maxIdx;\n }\n\n switchHistoryDict[streamId][type].push({ oldValue: oldQuality, newValue: newQuality });\n\n if (newQuality > SwitchRequest.NO_CHANGE && newQuality !== oldQuality && (abandonmentStateDict[streamId][type].state === MetricsConstants.ALLOW_LOAD || newQuality < oldQuality)) {\n _changeQuality(type, oldQuality, newQuality, maxIdx, switchRequest.reason, streamId);\n return true;\n }\n\n return false;\n } catch (e) {\n return false;\n }\n\n }\n\n /**\n * Returns the current quality for a specific media type and a specific streamId\n * @param {string} type\n * @param {string} streamId\n * @return {number|*}\n */\n function getQualityFor(type, streamId = null) {\n try {\n if (!streamId) {\n streamId = streamController.getActiveStreamInfo().id;\n }\n if (type && streamProcessorDict[streamId] && streamProcessorDict[streamId][type]) {\n let quality;\n\n if (streamId) {\n qualityDict[streamId] = qualityDict[streamId] || {};\n\n if (!qualityDict[streamId].hasOwnProperty(type)) {\n qualityDict[streamId][type] = QUALITY_DEFAULT;\n }\n\n quality = qualityDict[streamId][type];\n return quality;\n }\n }\n return QUALITY_DEFAULT;\n } catch (e) {\n return QUALITY_DEFAULT;\n }\n }\n\n /**\n * Sets the new playback quality. Starts from index 0.\n * If the index of the new quality is the same as the old one changeQuality will not be called.\n * @param {string} type\n * @param {object} streamInfo\n * @param {number} newQuality\n * @param {string} reason\n */\n function setPlaybackQuality(type, streamInfo, newQuality, reason = null) {\n if (!streamInfo || !streamInfo.id || !type) {\n return;\n }\n const streamId = streamInfo.id;\n const oldQuality = getQualityFor(type, streamId);\n\n checkInteger(newQuality);\n\n const topQualityIdx = getMaxAllowedIndexFor(type, streamId);\n\n if (newQuality !== oldQuality && newQuality >= 0 && newQuality <= topQualityIdx) {\n _changeQuality(type, oldQuality, newQuality, topQualityIdx, reason, streamId);\n }\n }\n\n /**\n *\n * @param {string} streamId\n * @param {type} type\n * @return {*|null}\n */\n function getAbandonmentStateFor(streamId, type) {\n return abandonmentStateDict[streamId] && abandonmentStateDict[streamId][type] ? abandonmentStateDict[streamId][type].state : null;\n }\n\n\n /**\n * Changes the internal qualityDict values according to the new quality\n * @param {string} type\n * @param {number} oldQuality\n * @param {number} newQuality\n * @param {number} maxIdx\n * @param {string} reason\n * @param {object} streamId\n * @private\n */\n function _changeQuality(type, oldQuality, newQuality, maxIdx, reason, streamId) {\n if (type && streamProcessorDict[streamId] && streamProcessorDict[streamId][type]) {\n const streamInfo = streamProcessorDict[streamId][type].getStreamInfo();\n const isDynamic = streamInfo && streamInfo.manifestInfo && streamInfo.manifestInfo.isDynamic;\n const bufferLevel = dashMetrics.getCurrentBufferLevel(type);\n logger.info('Stream ID: ' + streamId + ' [' + type + '] switch from ' + oldQuality + ' to ' + newQuality + '/' + maxIdx + ' (buffer: ' + bufferLevel + ') ' + (reason ? JSON.stringify(reason) : '.'));\n\n qualityDict[streamId] = qualityDict[streamId] || {};\n qualityDict[streamId][type] = newQuality;\n const bitrateInfo = _getBitrateInfoForQuality(streamId, type, newQuality);\n eventBus.trigger(Events.QUALITY_CHANGE_REQUESTED,\n {\n oldQuality,\n newQuality,\n reason,\n streamInfo,\n bitrateInfo,\n maxIdx,\n mediaType: type\n },\n { streamId: streamInfo.id, mediaType: type }\n );\n const bitrate = throughputHistory.getAverageThroughput(type, isDynamic);\n if (!isNaN(bitrate)) {\n domStorage.setSavedBitrateSettings(type, bitrate);\n }\n }\n }\n\n function _getBitrateInfoForQuality(streamId, type, idx) {\n if (type && streamProcessorDict && streamProcessorDict[streamId] && streamProcessorDict[streamId][type]) {\n const bitrates = getBitrateList(streamProcessorDict[streamId][type].getMediaInfo());\n return bitrates[idx] ? bitrates[idx] : null;\n }\n return null;\n }\n\n /**\n * @param {MediaInfo} mediaInfo\n * @param {number} bitrate A bitrate value, kbps\n * @param {String} streamId Period ID\n * @param {number|null} latency Expected latency of connection, ms\n * @returns {number} A quality index <= for the given bitrate\n * @memberof AbrController#\n */\n function getQualityForBitrate(mediaInfo, bitrate, streamId, latency = null) {\n const voRepresentation = mediaInfo && mediaInfo.type ? streamProcessorDict[streamId][mediaInfo.type].getRepresentationInfo() : null;\n\n if (settings.get().streaming.abr.useDeadTimeLatency && latency && voRepresentation && voRepresentation.fragmentDuration) {\n latency = latency / 1000;\n const fragmentDuration = voRepresentation.fragmentDuration;\n if (latency > fragmentDuration) {\n return 0;\n } else {\n const deadTimeRatio = latency / fragmentDuration;\n bitrate = bitrate * (1 - deadTimeRatio);\n }\n }\n\n const bitrateList = getBitrateList(mediaInfo);\n\n for (let i = bitrateList.length - 1; i >= 0; i--) {\n const bitrateInfo = bitrateList[i];\n if (bitrate * 1000 >= bitrateInfo.bitrate) {\n return i;\n }\n }\n return QUALITY_DEFAULT;\n }\n\n /**\n * @param {MediaInfo} mediaInfo\n * @returns {Array|null} A list of {@link BitrateInfo} objects\n * @memberof AbrController#\n */\n function getBitrateList(mediaInfo) {\n const infoList = [];\n if (!mediaInfo || !mediaInfo.bitrateList) return infoList;\n\n const bitrateList = mediaInfo.bitrateList;\n const type = mediaInfo.type;\n\n let bitrateInfo;\n\n for (let i = 0, ln = bitrateList.length; i < ln; i++) {\n bitrateInfo = new BitrateInfo();\n bitrateInfo.mediaType = type;\n bitrateInfo.qualityIndex = i;\n bitrateInfo.bitrate = bitrateList[i].bandwidth;\n bitrateInfo.width = bitrateList[i].width;\n bitrateInfo.height = bitrateList[i].height;\n bitrateInfo.scanType = bitrateList[i].scanType;\n infoList.push(bitrateInfo);\n }\n\n return infoList;\n }\n\n function _updateAbrStrategy(mediaType, bufferLevel) {\n // else ABR_STRATEGY_DYNAMIC\n const strategy = settings.get().streaming.abr.ABRStrategy;\n\n if (strategy === Constants.ABR_STRATEGY_DYNAMIC) {\n _updateDynamicAbrStrategy(mediaType, bufferLevel);\n }\n }\n\n function _updateDynamicAbrStrategy(mediaType, bufferLevel) {\n try {\n const stableBufferTime = mediaPlayerModel.getStableBufferTime();\n const switchOnThreshold = stableBufferTime;\n const switchOffThreshold = 0.5 * stableBufferTime;\n\n const useBufferABR = isUsingBufferOccupancyAbrDict[mediaType];\n const newUseBufferABR = bufferLevel > (useBufferABR ? switchOffThreshold : switchOnThreshold); // use hysteresis to avoid oscillating rules\n isUsingBufferOccupancyAbrDict[mediaType] = newUseBufferABR;\n\n if (newUseBufferABR !== useBufferABR) {\n if (newUseBufferABR) {\n logger.info('[' + mediaType + '] switching from throughput to buffer occupancy ABR rule (buffer: ' + bufferLevel.toFixed(3) + ').');\n } else {\n logger.info('[' + mediaType + '] switching from buffer occupancy to throughput ABR rule (buffer: ' + bufferLevel.toFixed(3) + ').');\n }\n }\n } catch (e) {\n logger.error(e);\n }\n }\n\n function getThroughputHistory() {\n return throughputHistory;\n }\n\n function updateTopQualityIndex(mediaInfo) {\n const type = mediaInfo.type;\n const streamId = mediaInfo.streamInfo.id;\n const max = mediaInfo.representationCount - 1;\n\n topQualities[streamId] = topQualities[streamId] || {};\n topQualities[streamId][type] = max;\n\n return max;\n }\n\n function isPlayingAtTopQuality(streamInfo) {\n const streamId = streamInfo ? streamInfo.id : null;\n const audioQuality = getQualityFor(Constants.AUDIO, streamId);\n const videoQuality = getQualityFor(Constants.VIDEO, streamId);\n\n const isAtTop = (audioQuality === getMaxAllowedIndexFor(Constants.AUDIO, streamId)) &&\n (videoQuality === getMaxAllowedIndexFor(Constants.VIDEO, streamId));\n\n return isAtTop;\n }\n\n function setWindowResizeEventCalled(value) {\n windowResizeEventCalled = value;\n }\n\n function setElementSize() {\n if (videoModel) {\n const hasPixelRatio = settings.get().streaming.abr.usePixelRatioInLimitBitrateByPortal && window.hasOwnProperty('devicePixelRatio');\n const pixelRatio = hasPixelRatio ? window.devicePixelRatio : 1;\n elementWidth = videoModel.getClientWidth() * pixelRatio;\n elementHeight = videoModel.getClientHeight() * pixelRatio;\n }\n }\n\n function clearDataForStream(streamId) {\n if (droppedFramesHistory) {\n droppedFramesHistory.clearForStream(streamId);\n }\n if (streamProcessorDict[streamId]) {\n delete streamProcessorDict[streamId];\n }\n if (switchHistoryDict[streamId]) {\n delete switchHistoryDict[streamId];\n }\n\n if (abandonmentStateDict[streamId]) {\n delete abandonmentStateDict[streamId];\n }\n }\n\n instance = {\n initialize,\n isPlayingAtTopQuality,\n updateTopQualityIndex,\n clearDataForStream,\n getThroughputHistory,\n getBitrateList,\n getQualityForBitrate,\n getTopBitrateInfoFor,\n getMinAllowedIndexFor,\n getMaxAllowedIndexFor,\n getInitialBitrateFor,\n getQualityFor,\n getAbandonmentStateFor,\n setPlaybackQuality,\n checkPlaybackQuality,\n setElementSize,\n setWindowResizeEventCalled,\n registerStreamType,\n unRegisterStreamType,\n setConfig,\n reset\n };\n\n setup();\n\n return instance;\n}\n\nAbrController.__dashjs_factory_name = 'AbrController';\nconst factory = FactoryMaker.getSingletonFactory(AbrController);\nfactory.QUALITY_DEFAULT = QUALITY_DEFAULT;\nFactoryMaker.updateSingletonFactory(AbrController.__dashjs_factory_name, factory);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport FactoryMaker from '../../core/FactoryMaker';\nimport EventBus from '../../core/EventBus';\nimport Events from '../../core/events/Events';\nimport Debug from '../../core/Debug';\nimport Constants from '../constants/Constants';\n\n\nconst READY_STATES_TO_EVENT_NAMES = new Map([\n [Constants.VIDEO_ELEMENT_READY_STATES.HAVE_METADATA, 'loadedmetadata'],\n [Constants.VIDEO_ELEMENT_READY_STATES.HAVE_CURRENT_DATA, 'loadeddata'],\n [Constants.VIDEO_ELEMENT_READY_STATES.HAVE_FUTURE_DATA, 'canplay'],\n [Constants.VIDEO_ELEMENT_READY_STATES.HAVE_ENOUGH_DATA, 'canplaythrough']\n]);\n\nfunction VideoModel() {\n\n let instance,\n logger,\n element,\n _currentTime,\n setCurrentTimeReadyStateFunction,\n TTMLRenderingDiv,\n vttRenderingDiv,\n previousPlaybackRate,\n timeout;\n\n const VIDEO_MODEL_WRONG_ELEMENT_TYPE = 'element is not video or audio DOM type!';\n\n const context = this.context;\n const eventBus = EventBus(context).getInstance();\n const stalledStreams = [];\n\n function setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n _currentTime = NaN;\n }\n\n function initialize() {\n eventBus.on(Events.PLAYBACK_PLAYING, onPlaying, this);\n }\n\n function reset() {\n clearTimeout(timeout);\n eventBus.off(Events.PLAYBACK_PLAYING, onPlaying, this);\n }\n\n function onPlaybackCanPlay() {\n if (element) {\n element.playbackRate = previousPlaybackRate || 1;\n element.removeEventListener('canplay', onPlaybackCanPlay);\n }\n }\n\n function setPlaybackRate(value, ignoreReadyState = false) {\n if (!element) return;\n if (!ignoreReadyState && element.readyState <= 2 && value > 0) {\n // If media element hasn't loaded enough data to play yet, wait until it has\n element.addEventListener('canplay', onPlaybackCanPlay);\n } else {\n element.playbackRate = value;\n }\n }\n\n //TODO Move the DVR window calculations from MediaPlayer to Here.\n function setCurrentTime(currentTime, stickToBuffered) {\n if (element) {\n if (setCurrentTimeReadyStateFunction && setCurrentTimeReadyStateFunction.func && setCurrentTimeReadyStateFunction.event) {\n removeEventListener(setCurrentTimeReadyStateFunction.event, setCurrentTimeReadyStateFunction.func);\n }\n _currentTime = currentTime;\n setCurrentTimeReadyStateFunction = waitForReadyState(Constants.VIDEO_ELEMENT_READY_STATES.HAVE_METADATA, () => {\n if (!element) {\n return;\n }\n\n // We don't set the same currentTime because it can cause firing unexpected Pause event in IE11\n // providing playbackRate property equals to zero.\n if (element.currentTime === _currentTime) {\n _currentTime = NaN;\n return;\n }\n\n // TODO Despite the fact that MediaSource 'open' event has been fired IE11 cannot set videoElement.currentTime\n // immediately (it throws InvalidStateError). It seems that this is related to videoElement.readyState property\n // Initially it is 0, but soon after 'open' event it goes to 1 and setting currentTime is allowed. Chrome allows to\n // set currentTime even if readyState = 0.\n // setTimeout is used to workaround InvalidStateError in IE11\n try {\n _currentTime = stickToBuffered ? stickTimeToBuffered(_currentTime) : _currentTime;\n if (!isNaN(_currentTime)) {\n element.currentTime = _currentTime;\n }\n _currentTime = NaN;\n } catch (e) {\n if (element.readyState === 0 && e.code === e.INVALID_STATE_ERR) {\n timeout = setTimeout(function () {\n element.currentTime = _currentTime;\n _currentTime = NaN;\n }, 400);\n }\n }\n });\n }\n }\n\n function stickTimeToBuffered(time) {\n const buffered = getBufferRange();\n let closestTime = time;\n let closestDistance = 9999999999;\n if (buffered) {\n for (let i = 0; i < buffered.length; i++) {\n const start = buffered.start(i);\n const end = buffered.end(i);\n const distanceToStart = Math.abs(start - time);\n const distanceToEnd = Math.abs(end - time);\n\n if (time >= start && time <= end) {\n return time;\n }\n\n if (distanceToStart < closestDistance) {\n closestDistance = distanceToStart;\n closestTime = start;\n }\n\n if (distanceToEnd < closestDistance) {\n closestDistance = distanceToEnd;\n closestTime = end;\n }\n }\n }\n return closestTime;\n }\n\n function getElement() {\n return element;\n }\n\n function setElement(value) {\n //add check of value type\n if (value === null || value === undefined || (value && (/^(VIDEO|AUDIO)$/i).test(value.nodeName))) {\n element = value;\n // Workaround to force Firefox to fire the canplay event.\n if (element) {\n element.preload = 'auto';\n }\n } else {\n throw VIDEO_MODEL_WRONG_ELEMENT_TYPE;\n }\n }\n\n function setSource(source) {\n if (element) {\n if (source) {\n element.src = source;\n } else {\n element.removeAttribute('src');\n element.load();\n }\n }\n }\n\n function setDisableRemotePlayback(value) {\n if (element) {\n element.disableRemotePlayback = value;\n }\n }\n\n function getSource() {\n return element ? element.src : null;\n }\n\n function getTTMLRenderingDiv() {\n return TTMLRenderingDiv;\n }\n\n function getVttRenderingDiv() {\n return vttRenderingDiv;\n }\n\n function setTTMLRenderingDiv(div) {\n TTMLRenderingDiv = div;\n // The styling will allow the captions to match the video window size and position.\n TTMLRenderingDiv.style.position = 'absolute';\n TTMLRenderingDiv.style.display = 'flex';\n TTMLRenderingDiv.style.overflow = 'hidden';\n TTMLRenderingDiv.style.pointerEvents = 'none';\n TTMLRenderingDiv.style.top = 0;\n TTMLRenderingDiv.style.left = 0;\n }\n\n function setVttRenderingDiv(div) {\n vttRenderingDiv = div;\n }\n\n function setStallState(type, state) {\n stallStream(type, state);\n }\n\n function isStalled() {\n return (stalledStreams.length > 0);\n }\n\n function addStalledStream(type) {\n\n if (type === null || !element || element.seeking || stalledStreams.indexOf(type) !== -1) {\n return;\n }\n\n stalledStreams.push(type);\n }\n\n function removeStalledStream(type) {\n let index = stalledStreams.indexOf(type);\n\n if (type === null) {\n return;\n }\n if (index !== -1) {\n stalledStreams.splice(index, 1);\n }\n\n }\n\n function stallStream(type, isStalled) {\n if (isStalled) {\n addStalledStream(type);\n } else {\n removeStalledStream(type);\n }\n }\n\n //Calling play on the element will emit playing - even if the stream is stalled. If the stream is stalled, emit a waiting event.\n function onPlaying() {\n if (element && isStalled() && element.playbackRate === 0) {\n const event = document.createEvent('Event');\n event.initEvent('waiting', true, false);\n element.dispatchEvent(event);\n }\n }\n\n function getPlaybackQuality() {\n if (!element) {\n return null;\n }\n let hasWebKit = ('webkitDroppedFrameCount' in element) && ('webkitDecodedFrameCount' in element);\n let hasQuality = ('getVideoPlaybackQuality' in element);\n let result = null;\n\n if (hasQuality) {\n result = element.getVideoPlaybackQuality();\n } else if (hasWebKit) {\n result = {\n droppedVideoFrames: element.webkitDroppedFrameCount,\n totalVideoFrames: element.webkitDroppedFrameCount + element.webkitDecodedFrameCount,\n creationTime: new Date()\n };\n }\n\n return result;\n }\n\n function play() {\n if (element) {\n element.autoplay = true;\n const p = element.play();\n if (p && p.catch && typeof Promise !== 'undefined') {\n p.catch((e) => {\n if (e.name === 'NotAllowedError') {\n eventBus.trigger(Events.PLAYBACK_NOT_ALLOWED);\n }\n logger.warn(`Caught pending play exception - continuing (${e})`);\n });\n }\n }\n }\n\n function isPaused() {\n return element ? element.paused : null;\n }\n\n function pause() {\n if (element) {\n element.pause();\n element.autoplay = false;\n }\n }\n\n function isSeeking() {\n return element ? (element.seeking || !isNaN(_currentTime)) : null;\n }\n\n function getTime() {\n return element ? (!isNaN(_currentTime) ? _currentTime : element.currentTime) : null;\n }\n\n function getPlaybackRate() {\n return element ? element.playbackRate : null;\n }\n\n function getPlayedRanges() {\n return element ? element.played : null;\n }\n\n function getEnded() {\n return element ? element.ended : null;\n }\n\n function addEventListener(eventName, eventCallBack) {\n if (element) {\n element.addEventListener(eventName, eventCallBack);\n }\n }\n\n function removeEventListener(eventName, eventCallBack) {\n if (element) {\n element.removeEventListener(eventName, eventCallBack);\n }\n }\n\n function getReadyState() {\n return element ? element.readyState : NaN;\n }\n\n function getBufferRange() {\n return element ? element.buffered : null;\n }\n\n function getClientWidth() {\n return element ? element.clientWidth : NaN;\n }\n\n function getClientHeight() {\n return element ? element.clientHeight : NaN;\n }\n\n function getVideoWidth() {\n return element ? element.videoWidth : NaN;\n }\n\n function getVideoHeight() {\n return element ? element.videoHeight : NaN;\n }\n\n function getVideoRelativeOffsetTop() {\n if (element) {\n const parentElement = element.parentNode.host || element.parentNode;\n return parentElement ? element.getBoundingClientRect().top - parentElement.getBoundingClientRect().top : NaN;\n }\n return NaN;\n }\n\n function getVideoRelativeOffsetLeft() {\n if (element) {\n const parentElement = element.parentNode.host || element.parentNode;\n return parentElement ? element.getBoundingClientRect().left - parentElement.getBoundingClientRect().left : NaN;\n }\n return NaN;\n }\n\n function getTextTracks() {\n return element ? element.textTracks : [];\n }\n\n function getTextTrack(kind, label, lang, isTTML, isEmbedded) {\n if (element) {\n for (let i = 0; i < element.textTracks.length; i++) {\n //label parameter could be a number (due to adaptationSet), but label, the attribute of textTrack, is a string => to modify...\n //label could also be undefined (due to adaptationSet)\n if (element.textTracks[i].kind === kind && (label ? element.textTracks[i].label == label : true) &&\n element.textTracks[i].language === lang && element.textTracks[i].isTTML === isTTML && element.textTracks[i].isEmbedded === isEmbedded) {\n return element.textTracks[i];\n }\n }\n }\n\n return null;\n }\n\n function addTextTrack(kind, label, lang, isTTML, isEmbedded) {\n if (!element) {\n return null;\n }\n // check if track of same type has not been already created for previous stream\n // then use it (no way to remove existing text track from video element)\n let track = getTextTrack(kind, label, lang, isTTML, isEmbedded);\n if (!track) {\n track = element.addTextTrack(kind, label, lang);\n track.isEmbedded = isEmbedded;\n track.isTTML = isTTML;\n }\n return track;\n }\n\n function appendChild(childElement) {\n if (element) {\n element.appendChild(childElement);\n //in Chrome, we need to differenciate textTrack with same lang, kind and label but different format (vtt, ttml, etc...)\n if (childElement.isTTML !== undefined) {\n element.textTracks[element.textTracks.length - 1].isTTML = childElement.isTTML;\n element.textTracks[element.textTracks.length - 1].isEmbedded = childElement.isEmbedded;\n }\n }\n }\n\n function removeChild(childElement) {\n if (element) {\n element.removeChild(childElement);\n }\n }\n\n function waitForReadyState(targetReadyState, callback) {\n if (targetReadyState === Constants.VIDEO_ELEMENT_READY_STATES.HAVE_NOTHING ||\n getReadyState() >= targetReadyState) {\n callback();\n return null;\n } else {\n // wait for the appropriate callback before checking again\n const event = READY_STATES_TO_EVENT_NAMES.get(targetReadyState);\n return _listenOnce(event, callback);\n }\n }\n\n function _listenOnce(event, callback) {\n const func = () => {\n // Stop listening to this event.\n removeEventListener(event, func);\n // Call the original listener.\n callback(event);\n };\n addEventListener(event, func);\n\n return { func, event }\n }\n\n instance = {\n addEventListener,\n addTextTrack,\n appendChild,\n getBufferRange,\n getClientHeight,\n getClientWidth,\n getElement,\n getEnded,\n getPlaybackQuality,\n getPlaybackRate,\n getPlayedRanges,\n getReadyState,\n getSource,\n getTTMLRenderingDiv,\n getTextTrack,\n getTextTracks,\n getTime,\n getVideoHeight,\n getVideoRelativeOffsetLeft,\n getVideoRelativeOffsetTop,\n getVideoWidth,\n getVttRenderingDiv,\n initialize,\n isPaused,\n isSeeking,\n isStalled,\n pause,\n play,\n removeChild,\n removeEventListener,\n reset,\n setCurrentTime,\n setElement,\n setPlaybackRate,\n setSource,\n setStallState,\n setTTMLRenderingDiv,\n setVttRenderingDiv,\n waitForReadyState,\n setDisableRemotePlayback,\n };\n\n setup();\n\n return instance;\n}\n\nVideoModel.__dashjs_factory_name = 'VideoModel';\nexport default FactoryMaker.getSingletonFactory(VideoModel);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport FactoryMaker from '../../core/FactoryMaker';\nimport Debug from '../../core/Debug';\nimport Constants from '../constants/Constants';\n\nconst legacyKeysAndReplacements = [\n { oldKey: 'dashjs_vbitrate', newKey: 'dashjs_video_bitrate' },\n { oldKey: 'dashjs_abitrate', newKey: 'dashjs_audio_bitrate' },\n { oldKey: 'dashjs_vsettings', newKey: 'dashjs_video_settings' },\n { oldKey: 'dashjs_asettings', newKey: 'dashjs_audio_settings' }\n];\n\nconst LOCAL_STORAGE_BITRATE_KEY_TEMPLATE = 'dashjs_?_bitrate';\nconst LOCAL_STORAGE_SETTINGS_KEY_TEMPLATE = 'dashjs_?_settings';\n\nconst STORAGE_TYPE_LOCAL = 'localStorage';\nconst STORAGE_TYPE_SESSION = 'sessionStorage';\nconst LAST_BITRATE = 'lastBitrate';\nconst LAST_MEDIA_SETTINGS = 'lastMediaSettings';\n\nfunction DOMStorage(config) {\n\n config = config || {};\n const context = this.context;\n const settings = config.settings;\n\n let instance,\n logger,\n supported;\n\n function setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n translateLegacyKeys();\n }\n\n //type can be local, session\n function isSupported(type) {\n if (supported !== undefined) return supported;\n\n supported = false;\n\n const testKey = '1';\n const testValue = '1';\n let storage;\n\n try {\n if (typeof window !== 'undefined') {\n storage = window[type];\n }\n } catch (error) {\n logger.warn('DOMStorage access denied: ' + error.message);\n return supported;\n }\n\n if (!storage || (type !== STORAGE_TYPE_LOCAL && type !== STORAGE_TYPE_SESSION)) {\n return supported;\n }\n\n /* When Safari (OS X or iOS) is in private browsing mode, it appears as though localStorage is available, but trying to call setItem throws an exception.\n http://stackoverflow.com/questions/14555347/html5-localstorage-error-with-safari-quota-exceeded-err-dom-exception-22-an\n\n Check if the storage can be used\n */\n try {\n storage.setItem(testKey, testValue);\n storage.removeItem(testKey);\n supported = true;\n } catch (error) {\n logger.warn('DOMStorage is supported, but cannot be used: ' + error.message);\n }\n\n return supported;\n }\n\n function translateLegacyKeys() {\n if (isSupported(STORAGE_TYPE_LOCAL)) {\n legacyKeysAndReplacements.forEach(entry => {\n const value = localStorage.getItem(entry.oldKey);\n\n if (value) {\n localStorage.removeItem(entry.oldKey);\n\n try {\n localStorage.setItem(entry.newKey, value);\n } catch (e) {\n logger.error(e.message);\n }\n }\n });\n }\n }\n\n // Return current epoch time, ms, rounded to the nearest 10m to avoid fingerprinting user\n function getTimestamp() {\n const ten_minutes_ms = 60 * 1000 * 10;\n return Math.round(new Date().getTime() / ten_minutes_ms) * ten_minutes_ms;\n }\n\n function canStore(storageType, key) {\n return isSupported(storageType) && settings.get().streaming[key + 'CachingInfo'].enabled;\n }\n\n function checkConfig() {\n if (!settings) {\n throw new Error(Constants.MISSING_CONFIG_ERROR);\n }\n }\n\n function getSavedMediaSettings(type) {\n checkConfig();\n\n if (!settings.get().streaming.lastMediaSettingsCachingInfo.enabled) {\n return null;\n }\n\n let mediaSettings = null;\n\n //Checks local storage to see if there is valid, non-expired media settings\n if (canStore(STORAGE_TYPE_LOCAL, LAST_MEDIA_SETTINGS)) {\n const key = LOCAL_STORAGE_SETTINGS_KEY_TEMPLATE.replace(/\\?/, type);\n try {\n const obj = JSON.parse(localStorage.getItem(key)) || {};\n const isExpired = (new Date().getTime() - parseInt(obj.timestamp, 10)) >= settings.get().streaming.lastMediaSettingsCachingInfo.ttl || false;\n mediaSettings = obj.settings;\n\n if (isExpired) {\n localStorage.removeItem(key);\n mediaSettings = null;\n }\n } catch (e) {\n return null;\n }\n }\n return mediaSettings;\n }\n\n function getSavedBitrateSettings(type) {\n checkConfig();\n\n if (!settings.get().streaming.lastBitrateCachingInfo.enabled) {\n return NaN;\n }\n\n let savedBitrate = NaN;\n\n //Checks local storage to see if there is valid, non-expired bit rate\n //hinting from the last play session to use as a starting bit rate.\n if (canStore(STORAGE_TYPE_LOCAL, LAST_BITRATE)) {\n const key = LOCAL_STORAGE_BITRATE_KEY_TEMPLATE.replace(/\\?/, type);\n try {\n const obj = JSON.parse(localStorage.getItem(key)) || {};\n const isExpired = (new Date().getTime() - parseInt(obj.timestamp, 10)) >= settings.get().streaming.lastBitrateCachingInfo.ttl || false;\n const bitrate = parseFloat(obj.bitrate);\n\n if (!isNaN(bitrate) && !isExpired) {\n savedBitrate = bitrate;\n logger.debug('Last saved bitrate for ' + type + ' was ' + bitrate);\n } else if (isExpired) {\n localStorage.removeItem(key);\n }\n } catch (e) {\n return null;\n }\n }\n return savedBitrate;\n }\n\n function setSavedMediaSettings(type, value) {\n if (canStore(STORAGE_TYPE_LOCAL, LAST_MEDIA_SETTINGS)) {\n const key = LOCAL_STORAGE_SETTINGS_KEY_TEMPLATE.replace(/\\?/, type);\n try {\n localStorage.setItem(key, JSON.stringify({ settings: value, timestamp: getTimestamp() }));\n } catch (e) {\n logger.error(e.message);\n }\n }\n }\n\n function setSavedBitrateSettings(type, bitrate) {\n if (canStore(STORAGE_TYPE_LOCAL, LAST_BITRATE) && bitrate) {\n const key = LOCAL_STORAGE_BITRATE_KEY_TEMPLATE.replace(/\\?/, type);\n try {\n localStorage.setItem(key, JSON.stringify({ bitrate: bitrate.toFixed(3), timestamp: getTimestamp() }));\n } catch (e) {\n logger.error(e.message);\n }\n }\n }\n\n instance = {\n getSavedBitrateSettings,\n setSavedBitrateSettings,\n getSavedMediaSettings,\n setSavedMediaSettings\n };\n\n setup();\n return instance;\n}\n\nDOMStorage.__dashjs_factory_name = 'DOMStorage';\nconst factory = FactoryMaker.getSingletonFactory(DOMStorage);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport Segment from './vo/Segment';\nimport DashJSError from '../streaming/vo/DashJSError';\nimport FactoryMaker from '../core/FactoryMaker';\nimport FragmentRequest from '../streaming/vo/FragmentRequest';\nimport URLLoader from '../streaming/net/URLLoader';\n\nfunction SegmentBaseLoader() {\n\n const context = this.context;\n\n let instance,\n logger,\n errHandler,\n boxParser,\n requestModifier,\n dashMetrics,\n mediaPlayerModel,\n urlLoader,\n errors,\n constants,\n dashConstants,\n urlUtils,\n baseURLController;\n\n function setup() {\n }\n\n function initialize() {\n urlLoader = URLLoader(context).create({\n errHandler: errHandler,\n dashMetrics: dashMetrics,\n mediaPlayerModel: mediaPlayerModel,\n requestModifier: requestModifier,\n boxParser: boxParser,\n errors: errors,\n urlUtils: urlUtils,\n constants: constants,\n dashConstants: dashConstants\n });\n }\n\n function setConfig(config) {\n if (config.baseURLController) {\n baseURLController = config.baseURLController;\n }\n\n if (config.dashMetrics) {\n dashMetrics = config.dashMetrics;\n }\n\n if (config.mediaPlayerModel) {\n mediaPlayerModel = config.mediaPlayerModel;\n }\n\n if (config.errHandler) {\n errHandler = config.errHandler;\n }\n\n if (config.boxParser) {\n boxParser = config.boxParser;\n }\n\n if (config.debug) {\n logger = config.debug.getLogger(instance);\n }\n\n if (config.requestModifier) {\n requestModifier = config.requestModifier;\n }\n\n if (config.errors) {\n errors = config.errors;\n }\n\n if (config.urlUtils) {\n urlUtils = config.urlUtils;\n }\n\n if (config.constants) {\n constants = config.constants;\n }\n\n if (config.dashConstants) {\n dashConstants = config.dashConstants;\n }\n }\n\n function loadInitialization(representation, mediaType) {\n return new Promise((resolve) => {\n _loadInitializationRecursively(representation, mediaType, resolve);\n });\n }\n\n function _loadInitializationRecursively(representation, mediaType, resolve, loadingInfo) {\n let initRange = null;\n const baseUrl = representation ? baseURLController.resolve(representation.path) : null;\n const info = loadingInfo || {\n init: true,\n url: baseUrl ? baseUrl.url : undefined,\n range: {\n start: 0,\n end: 1500\n },\n searching: false,\n bytesLoaded: 0,\n bytesToLoad: 1500,\n mediaType: mediaType\n };\n\n logger.debug('Start searching for initialization.');\n\n const request = getFragmentRequest(info);\n\n const onload = function (response) {\n info.bytesLoaded = info.range.end;\n initRange = boxParser.findInitRange(response);\n\n if (initRange) {\n representation.range = initRange;\n // note that we don't explicitly set rep.initialization as this\n // will be computed when all BaseURLs are resolved later\n resolve(representation);\n } else {\n info.range.end = info.bytesLoaded + info.bytesToLoad;\n return _loadInitializationRecursively(representation, mediaType, resolve, info);\n }\n };\n\n const onerror = function () {\n resolve(representation);\n };\n\n urlLoader.load({ request: request, success: onload, error: onerror });\n\n logger.debug('Perform init search: ' + info.url);\n }\n\n function loadSegments(representation, mediaType, range) {\n return new Promise((resolve) => {\n _loadSegmentsRecursively(representation, mediaType, range, resolve);\n });\n }\n\n function _loadSegmentsRecursively(representation, mediaType, range, resolve, callback, loadingInfo) {\n if (range && (range.start === undefined || range.end === undefined)) {\n const parts = range ? range.toString().split('-') : null;\n range = parts ? { start: parseFloat(parts[0]), end: parseFloat(parts[1]) } : null;\n }\n\n callback = !callback ? onLoaded : callback;\n let isoFile = null;\n let sidx = null;\n const hasRange = !!range;\n const baseUrl = representation ? baseURLController.resolve(representation.path) : null;\n const info = {\n init: false,\n url: baseUrl ? baseUrl.url : undefined,\n range: hasRange ? range : { start: 0, end: 1500 },\n searching: !hasRange,\n bytesLoaded: loadingInfo ? loadingInfo.bytesLoaded : 0,\n bytesToLoad: 1500,\n mediaType: mediaType\n };\n\n const request = getFragmentRequest(info);\n\n const onload = function (response) {\n const extraBytes = info.bytesToLoad;\n const loadedLength = response.byteLength;\n\n info.bytesLoaded = info.range.end - info.range.start;\n isoFile = boxParser.parse(response);\n sidx = isoFile.getBox('sidx');\n\n if (!sidx || !sidx.isComplete) {\n if (sidx) {\n info.range.start = sidx.offset || info.range.start;\n info.range.end = info.range.start + (sidx.size || extraBytes);\n } else if (loadedLength < info.bytesLoaded) {\n // if we have reached a search limit or if we have reached the end of the file we have to stop trying to find sidx\n callback(null, representation, resolve);\n return;\n } else {\n const lastBox = isoFile.getLastBox();\n\n if (lastBox && lastBox.size) {\n info.range.start = lastBox.offset + lastBox.size;\n info.range.end = info.range.start + extraBytes;\n } else {\n info.range.end += extraBytes;\n }\n }\n _loadSegmentsRecursively(representation, mediaType, info.range, resolve, null, info);\n } else {\n const ref = sidx.references;\n let loadMultiSidx,\n segments;\n\n if (ref !== null && ref !== undefined && ref.length > 0) {\n loadMultiSidx = (ref[0].reference_type === 1);\n }\n\n if (loadMultiSidx) {\n logger.debug('Initiate multiple SIDX load.');\n info.range.end = info.range.start + sidx.size;\n\n let j, len, ss, se, r;\n let segs = [];\n let count = 0;\n let offset = (sidx.offset || info.range.start) + sidx.size;\n const tmpCallback = function (result) {\n if (result) {\n segs = segs.concat(result);\n count++;\n\n if (count >= len) {\n // http requests can be processed in a wrong order, so, we have to reorder segments with an ascending start Time order\n segs.sort(function (a, b) {\n return a.startTime - b.startTime < 0 ? -1 : 0;\n });\n callback(segs, representation, resolve);\n }\n } else {\n callback(null, representation, resolve);\n }\n };\n\n for (j = 0, len = ref.length; j < len; j++) {\n ss = offset;\n se = offset + ref[j].referenced_size - 1;\n offset = offset + ref[j].referenced_size;\n r = { start: ss, end: se };\n _loadSegmentsRecursively(representation, mediaType, r, resolve, tmpCallback, info);\n }\n\n } else {\n logger.debug('Parsing segments from SIDX. representation ' + mediaType + ' - id: ' + representation.id + ' for range : ' + info.range.start + ' - ' + info.range.end);\n segments = getSegmentsForSidx(sidx, info);\n callback(segments, representation, resolve);\n }\n }\n };\n\n const onerror = function () {\n callback(null, representation, resolve);\n };\n\n urlLoader.load({ request: request, success: onload, error: onerror });\n logger.debug(`Perform SIDX load for type ${mediaType} : ${info.url} with range ${info.range.start} - ${info.range.end}`);\n }\n\n function onLoaded(segments, representation, resolve) {\n resolve({\n segments: segments,\n representation: representation,\n error: segments ? undefined : new DashJSError(errors.SEGMENT_BASE_LOADER_ERROR_CODE, errors.SEGMENT_BASE_LOADER_ERROR_MESSAGE)\n });\n }\n\n function reset() {\n if (urlLoader) {\n urlLoader.abort();\n urlLoader = null;\n }\n }\n\n function getSegmentsForSidx(sidx, info) {\n const refs = sidx.references;\n const len = refs.length;\n const timescale = sidx.timescale;\n let time = sidx.earliest_presentation_time;\n let start = info.range.start + sidx.offset + sidx.first_offset + sidx.size;\n const segments = [];\n let segment,\n end,\n duration,\n size;\n\n for (let i = 0; i < len; i++) {\n duration = refs[i].subsegment_duration;\n size = refs[i].referenced_size;\n\n segment = new Segment();\n // note that we don't explicitly set segment.media as this will be\n // computed when all BaseURLs are resolved later\n segment.duration = duration;\n segment.startTime = time;\n segment.timescale = timescale;\n end = start + size - 1;\n segment.mediaRange = start + '-' + end;\n segments.push(segment);\n time += duration;\n start += size;\n }\n\n return segments;\n }\n\n function getFragmentRequest(info) {\n if (!info.url) {\n return;\n }\n const request = new FragmentRequest();\n request.setInfo(info);\n return request;\n }\n\n instance = {\n setConfig,\n initialize,\n loadInitialization,\n loadSegments,\n reset\n };\n\n setup();\n\n return instance;\n}\n\nSegmentBaseLoader.__dashjs_factory_name = 'SegmentBaseLoader';\nexport default FactoryMaker.getSingletonFactory(SegmentBaseLoader);\n","import FactoryMaker from '../../core/FactoryMaker';\n\n/**\n * Creates an instance of an EBMLParser class which implements a large subset\n * of the functionality required to parse Matroska EBML\n *\n * @param {Object} config object with data member which is the buffer to parse\n * @ignore\n */\nfunction EBMLParser(config) {\n\n config = config || {};\n let instance;\n\n let data = new DataView(config.data);\n let pos = 0;\n\n function getPos() {\n return pos;\n }\n\n function setPos(value) {\n pos = value;\n }\n\n /**\n * Consumes an EBML tag from the data stream.\n *\n * @param {Object} tag to parse, A tag is an object with at least a {number} tag and\n * {boolean} required flag.\n * @param {boolean} test whether or not the function should throw if a required\n * tag is not found\n * @return {boolean} whether or not the tag was found\n * @throws will throw an exception if a required tag is not found and test\n * param is false or undefined, or if the stream is malformed.\n * @memberof EBMLParser\n */\n function consumeTag(tag, test) {\n let found = true;\n let bytesConsumed = 0;\n let p1,\n p2;\n\n if (test === undefined) {\n test = false;\n }\n\n if (tag.tag > 0xFFFFFF) {\n if (data.getUint32(pos) !== tag.tag) {\n found = false;\n }\n bytesConsumed = 4;\n } else if (tag.tag > 0xFFFF) {\n // 3 bytes\n p1 = data.getUint16(pos);\n p2 = data.getUint8(pos + 2);\n\n // shift p1 over a byte and add p2\n if (p1 * 256 + p2 !== tag.tag) {\n found = false;\n }\n bytesConsumed = 3;\n } else if (tag.tag > 0xFF) {\n if (data.getUint16(pos) !== tag.tag) {\n found = false;\n }\n bytesConsumed = 2;\n } else {\n if (data.getUint8(pos) !== tag.tag) {\n found = false;\n }\n bytesConsumed = 1;\n }\n\n if (!found && tag.required && !test) {\n throw new Error('required tag not found');\n }\n\n if (found) {\n pos += bytesConsumed;\n }\n\n return found;\n }\n\n /**\n * Consumes an EBML tag from the data stream. If the tag is found then this\n * function will also remove the size field which follows the tag from the\n * data stream.\n *\n * @param {Object} tag to parse, A tag is an object with at least a {number} tag and\n * {boolean} required flag.\n * @param {boolean} test whether or not the function should throw if a required\n * tag is not found\n * @return {boolean} whether or not the tag was found\n * @throws will throw an exception if a required tag is not found and test\n * param is false or undefined, or if the stream is malformedata.\n * @memberof EBMLParser\n */\n function consumeTagAndSize(tag, test) {\n let found = consumeTag(tag, test);\n\n if (found) {\n getMatroskaCodedNum();\n }\n\n return found;\n }\n\n /**\n * Consumes an EBML tag from the data stream. If the tag is found then this\n * function will also remove the size field which follows the tag from the\n * data stream. It will use the value of the size field to parse a binary\n * field, using a parser defined in the tag itself\n *\n * @param {Object} tag to parse, A tag is an object with at least a {number} tag,\n * {boolean} required flag, and a parse function which takes a size parameter\n * @return {boolean} whether or not the tag was found\n * @throws will throw an exception if a required tag is not found,\n * or if the stream is malformed\n * @memberof EBMLParser\n */\n function parseTag(tag) {\n let size;\n\n consumeTag(tag);\n size = getMatroskaCodedNum();\n return instance[tag.parse](size);\n }\n\n /**\n * Consumes an EBML tag from the data stream. If the tag is found then this\n * function will also remove the size field which follows the tag from the\n * data stream. It will use the value of the size field to skip over the\n * entire section of EBML encapsulated by the tag.\n *\n * @param {Object} tag to parse, A tag is an object with at least a {number} tag, and\n * {boolean} required flag\n * @param {boolean} test a flag to indicate if an exception should be thrown\n * if a required tag is not found\n * @return {boolean} whether or not the tag was found\n * @throws will throw an exception if a required tag is not found and test is\n * false or undefined or if the stream is malformed\n * @memberof EBMLParser\n */\n function skipOverElement(tag, test) {\n let found = consumeTag(tag, test);\n let headerSize;\n\n if (found) {\n headerSize = getMatroskaCodedNum();\n pos += headerSize;\n }\n\n return found;\n }\n\n /**\n * Returns and consumes a number encoded according to the Matroska EBML\n * specification from the bitstream.\n *\n * @param {boolean} retainMSB whether or not to retain the Most Significant Bit (the\n * first 1). this is usually true when reading Tag IDs.\n * @return {number} the decoded number\n * @throws will throw an exception if the bit stream is malformed or there is\n * not enough data\n * @memberof EBMLParser\n */\n function getMatroskaCodedNum(retainMSB) {\n let bytesUsed = 1;\n let mask = 0x80;\n let maxBytes = 8;\n let extraBytes = -1;\n let num = 0;\n let ch = data.getUint8(pos);\n let i = 0;\n\n for (i = 0; i < maxBytes; i += 1) {\n if ((ch & mask) === mask) {\n num = (retainMSB === undefined) ? ch & ~mask : ch;\n extraBytes = i;\n break;\n }\n mask >>= 1;\n }\n\n for (i = 0; i < extraBytes; i += 1, bytesUsed += 1) {\n num = (num << 8) | (0xff & data.getUint8(pos + bytesUsed));\n }\n\n pos += bytesUsed;\n\n return num;\n }\n\n /**\n * Returns and consumes a float from the bitstream.\n *\n * @param {number} size 4 or 8 byte floats are supported\n * @return {number} the decoded number\n * @throws will throw an exception if the bit stream is malformed or there is\n * not enough data\n * @memberof EBMLParser\n */\n function getMatroskaFloat(size) {\n let outFloat;\n\n switch (size) {\n case 4:\n outFloat = data.getFloat32(pos);\n pos += 4;\n break;\n case 8:\n outFloat = data.getFloat64(pos);\n pos += 8;\n break;\n }\n return outFloat;\n }\n\n /**\n * Consumes and returns an unsigned int from the bitstream.\n *\n * @param {number} size 1 to 8 bytes\n * @return {number} the decoded number\n * @throws will throw an exception if the bit stream is malformed, there is\n * not enough data, or if the value exceeds the maximum safe integer value\n * @memberof EBMLParser\n */\n function getMatroskaUint(size) {\n if (size > 4) {\n return getMatroskaUintLarge(size);\n }\n\n let val = 0;\n\n for (let i = 0; i < size; i += 1) {\n val <<= 8;\n val |= data.getUint8(pos + i) & 0xff;\n }\n\n pos += size;\n return val >>> 0;\n }\n\n /**\n * Consumes and returns an unsigned int from the bitstream.\n *\n * @param {number} size 1 to 8 bytes\n * @return {number} the decoded number\n * @throws will throw an exception if the bit stream is malformed, there is\n * not enough data, or if the value exceeds the maximum safe integer value\n */\n function getMatroskaUintLarge(size) {\n const limit = Math.floor(Number.MAX_SAFE_INTEGER / 256);\n let val = 0;\n\n for (let i = 0; i < size; i += 1) {\n if (val > limit) {\n throw new Error('Value exceeds safe integer limit');\n }\n val *= 256;\n const n = data.getUint8(pos + i);\n if (val > Number.MAX_SAFE_INTEGER - n) {\n throw new Error('Value exceeds safe integer limit');\n }\n val += n;\n }\n\n pos += size;\n return val;\n }\n\n /**\n * Tests whether there is more data in the bitstream for parsing\n *\n * @return {boolean} whether there is more data to parse\n * @memberof EBMLParser\n */\n function moreData() {\n return pos < data.byteLength;\n }\n\n instance = {\n getPos: getPos,\n setPos: setPos,\n consumeTag: consumeTag,\n consumeTagAndSize: consumeTagAndSize,\n parseTag: parseTag,\n skipOverElement: skipOverElement,\n getMatroskaCodedNum: getMatroskaCodedNum,\n getMatroskaFloat: getMatroskaFloat,\n getMatroskaUint: getMatroskaUint,\n moreData: moreData\n };\n\n return instance;\n}\n\nEBMLParser.__dashjs_factory_name = 'EBMLParser';\nexport default FactoryMaker.getClassFactory(EBMLParser);\n","import EBMLParser from '../streaming/utils/EBMLParser';\nimport Constants from '../streaming/constants/Constants';\nimport FactoryMaker from '../core/FactoryMaker';\nimport Segment from './vo/Segment';\nimport FragmentRequest from '../streaming/vo/FragmentRequest';\nimport URLLoader from '../streaming/net/URLLoader';\nimport DashJSError from '../streaming/vo/DashJSError';\n\nfunction WebmSegmentBaseLoader() {\n\n const context = this.context;\n\n let instance,\n logger,\n WebM,\n errHandler,\n requestModifier,\n dashMetrics,\n mediaPlayerModel,\n urlLoader,\n errors,\n baseURLController;\n\n function setup() {\n WebM = {\n EBML: {\n tag: 0x1A45DFA3,\n required: true\n },\n Segment: {\n tag: 0x18538067,\n required: true,\n SeekHead: {\n tag: 0x114D9B74,\n required: true\n },\n Info: {\n tag: 0x1549A966,\n required: true,\n TimecodeScale: {\n tag: 0x2AD7B1,\n required: true,\n parse: 'getMatroskaUint'\n },\n Duration: {\n tag: 0x4489,\n required: true,\n parse: 'getMatroskaFloat'\n }\n },\n Tracks: {\n tag: 0x1654AE6B,\n required: true\n },\n Cues: {\n tag: 0x1C53BB6B,\n required: true,\n CuePoint: {\n tag: 0xBB,\n required: true,\n CueTime: {\n tag: 0xB3,\n required: true,\n parse: 'getMatroskaUint'\n },\n CueTrackPositions: {\n tag: 0xB7,\n required: true,\n CueTrack: {\n tag: 0xF7,\n required: true,\n parse: 'getMatroskaUint'\n },\n CueClusterPosition: {\n tag: 0xF1,\n required: true,\n parse: 'getMatroskaUint'\n }\n }\n }\n }\n },\n Void: {\n tag: 0xEC,\n required: true\n }\n };\n }\n\n function initialize() {\n urlLoader = URLLoader(context).create({\n errHandler: errHandler,\n dashMetrics: dashMetrics,\n mediaPlayerModel: mediaPlayerModel,\n requestModifier: requestModifier,\n errors: errors\n });\n }\n\n function setConfig(config) {\n if (!config.baseURLController || !config.dashMetrics || !config.mediaPlayerModel || !config.errHandler) {\n throw new Error(Constants.MISSING_CONFIG_ERROR);\n }\n baseURLController = config.baseURLController;\n dashMetrics = config.dashMetrics;\n mediaPlayerModel = config.mediaPlayerModel;\n errHandler = config.errHandler;\n errors = config.errors;\n logger = config.debug.getLogger(instance);\n requestModifier = config.requestModifier;\n }\n\n function parseCues(ab) {\n let cues = [];\n let ebmlParser = EBMLParser(context).create({\n data: ab\n });\n let cue,\n cueTrack;\n\n ebmlParser.consumeTagAndSize(WebM.Segment.Cues);\n\n while (ebmlParser.moreData() &&\n ebmlParser.consumeTagAndSize(WebM.Segment.Cues.CuePoint, true)) {\n cue = {};\n\n cue.CueTime = ebmlParser.parseTag(WebM.Segment.Cues.CuePoint.CueTime);\n\n cue.CueTracks = [];\n while (ebmlParser.moreData() &&\n ebmlParser.consumeTag(WebM.Segment.Cues.CuePoint.CueTrackPositions, true)) {\n const cueTrackPositionSize = ebmlParser.getMatroskaCodedNum();\n const startPos = ebmlParser.getPos();\n cueTrack = {};\n\n cueTrack.Track = ebmlParser.parseTag(WebM.Segment.Cues.CuePoint.CueTrackPositions.CueTrack);\n if (cueTrack.Track === 0) {\n throw new Error('Cue track cannot be 0');\n }\n\n cueTrack.ClusterPosition =\n ebmlParser.parseTag(WebM.Segment.Cues.CuePoint.CueTrackPositions.CueClusterPosition);\n\n cue.CueTracks.push(cueTrack);\n\n // we're not interested any other elements - skip remaining bytes\n ebmlParser.setPos(startPos + cueTrackPositionSize);\n }\n\n if (cue.CueTracks.length === 0) {\n throw new Error('Mandatory cuetrack not found');\n }\n cues.push(cue);\n }\n\n if (cues.length === 0) {\n throw new Error('mandatory cuepoint not found');\n }\n return cues;\n }\n\n function parseSegments(data, segmentStart, segmentEnd, segmentDuration) {\n let duration,\n parsed,\n segments,\n segment,\n i,\n len,\n start,\n end;\n\n parsed = parseCues(data);\n segments = [];\n\n // we are assuming one cue track per cue point\n // both duration and media range require the i + 1 segment\n // the final segment has to use global segment parameters\n for (i = 0, len = parsed.length; i < len; i += 1) {\n segment = new Segment();\n duration = 0;\n\n if (i < parsed.length - 1) {\n duration = parsed[i + 1].CueTime - parsed[i].CueTime;\n } else {\n duration = segmentDuration - parsed[i].CueTime;\n }\n\n // note that we don't explicitly set segment.media as this will be\n // computed when all BaseURLs are resolved later\n segment.duration = duration;\n segment.startTime = parsed[i].CueTime;\n segment.timescale = 1000; // hardcoded for ms\n start = parsed[i].CueTracks[0].ClusterPosition + segmentStart;\n\n if (i < parsed.length - 1) {\n end = parsed[i + 1].CueTracks[0].ClusterPosition + segmentStart - 1;\n } else {\n end = segmentEnd - 1;\n }\n\n segment.mediaRange = start + '-' + end;\n segments.push(segment);\n }\n\n logger.debug('Parsed cues: ' + segments.length + ' cues.');\n\n return segments;\n }\n\n function parseEbmlHeader(data, media, theRange, callback) {\n if (!data || data.byteLength === 0) {\n callback(null);\n return;\n }\n let ebmlParser = EBMLParser(context).create({\n data: data\n });\n let duration,\n segments,\n segmentEnd,\n segmentStart;\n let parts = theRange ? theRange.split('-') : null;\n let request = null;\n let info = {\n url: media,\n range: {\n start: parts ? parseFloat(parts[0]) : null,\n end: parts ? parseFloat(parts[1]) : null\n },\n request: request\n };\n\n logger.debug('Parse EBML header: ' + info.url);\n\n // skip over the header itself\n ebmlParser.skipOverElement(WebM.EBML);\n ebmlParser.consumeTag(WebM.Segment);\n\n // segments start here\n segmentEnd = ebmlParser.getMatroskaCodedNum();\n segmentEnd += ebmlParser.getPos();\n segmentStart = ebmlParser.getPos();\n\n // skip over any top level elements to get to the segment info\n while (ebmlParser.moreData() &&\n !ebmlParser.consumeTagAndSize(WebM.Segment.Info, true)) {\n if (!(ebmlParser.skipOverElement(WebM.Segment.SeekHead, true) ||\n ebmlParser.skipOverElement(WebM.Segment.Tracks, true) ||\n ebmlParser.skipOverElement(WebM.Segment.Cues, true) ||\n ebmlParser.skipOverElement(WebM.Void, true))) {\n throw new Error('no valid top level element found');\n }\n }\n\n // we only need one thing in segment info, duration\n while (duration === undefined) {\n let infoTag = ebmlParser.getMatroskaCodedNum(true);\n let infoElementSize = ebmlParser.getMatroskaCodedNum();\n\n switch (infoTag) {\n case WebM.Segment.Info.Duration.tag:\n duration = ebmlParser[WebM.Segment.Info.Duration.parse](infoElementSize);\n break;\n default:\n ebmlParser.setPos(ebmlParser.getPos() + infoElementSize);\n break;\n }\n }\n\n // once we have what we need from segment info, we jump right to the\n // cues\n\n request = _getFragmentRequest(info);\n\n const onload = function (response) {\n segments = parseSegments(response, segmentStart, segmentEnd, duration);\n callback(segments);\n };\n\n const onloadend = function () {\n logger.error('Download Error: Cues ' + info.url);\n callback(null);\n };\n\n urlLoader.load({\n request: request,\n success: onload,\n error: onloadend\n });\n\n logger.debug('Perform cues load: ' + info.url + ' bytes=' + info.range.start + '-' + info.range.end);\n }\n\n function loadInitialization(representation, mediaType) {\n return new Promise((resolve) => {\n let request = null;\n let baseUrl = representation ? baseURLController.resolve(representation.path) : null;\n let initRange = representation ? representation.range.split('-') : null;\n let info = {\n range: {\n start: initRange ? parseFloat(initRange[0]) : null,\n end: initRange ? parseFloat(initRange[1]) : null\n },\n request: request,\n url: baseUrl ? baseUrl.url : undefined,\n init: true,\n mediaType: mediaType\n };\n\n logger.info('Start loading initialization.');\n\n request = _getFragmentRequest(info);\n\n const onload = function () {\n // note that we don't explicitly set rep.initialization as this\n // will be computed when all BaseURLs are resolved later\n resolve(representation);\n };\n\n const onloadend = function () {\n resolve(representation);\n };\n\n urlLoader.load({\n request: request,\n success: onload,\n error: onloadend\n });\n\n logger.debug('Perform init load: ' + info.url);\n });\n }\n\n function loadSegments(representation, mediaType, theRange) {\n return new Promise((resolve) => {\n let request = null;\n let baseUrl = representation ? baseURLController.resolve(representation.path) : null;\n let media = baseUrl ? baseUrl.url : undefined;\n let bytesToLoad = 8192;\n let info = {\n bytesLoaded: 0,\n bytesToLoad: bytesToLoad,\n range: {\n start: 0,\n end: bytesToLoad\n },\n request: request,\n url: media,\n init: false,\n mediaType: mediaType\n };\n\n request = _getFragmentRequest(info);\n\n // first load the header, but preserve the manifest range so we can\n // load the cues after parsing the header\n // NOTE: we expect segment info to appear in the first 8192 bytes\n logger.debug('Parsing ebml header');\n\n const onload = function (response) {\n parseEbmlHeader(response, media, theRange, function (segments) {\n resolve({\n segments: segments,\n representation: representation,\n error: segments ? undefined : new DashJSError(errors.SEGMENT_BASE_LOADER_ERROR_CODE, errors.SEGMENT_BASE_LOADER_ERROR_MESSAGE)\n });\n });\n };\n\n const onloadend = function () {\n resolve({\n representation: representation,\n error: new DashJSError(errors.SEGMENT_BASE_LOADER_ERROR_CODE, errors.SEGMENT_BASE_LOADER_ERROR_MESSAGE)\n });\n };\n\n urlLoader.load({\n request: request,\n success: onload,\n error: onloadend\n });\n });\n\n }\n\n\n function _getFragmentRequest(info) {\n const request = new FragmentRequest();\n request.setInfo(info);\n return request;\n }\n\n function reset() {\n if (urlLoader) {\n urlLoader.abort();\n urlLoader = null;\n }\n }\n\n instance = {\n setConfig,\n initialize,\n loadInitialization,\n loadSegments,\n reset\n };\n\n setup();\n\n return instance;\n}\n\nWebmSegmentBaseLoader.__dashjs_factory_name = 'WebmSegmentBaseLoader';\nexport default FactoryMaker.getSingletonFactory(WebmSegmentBaseLoader);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport FactoryMaker from '../../core/FactoryMaker';\n\nimport SegmentBaseLoader from '../SegmentBaseLoader';\nimport WebmSegmentBaseLoader from '../WebmSegmentBaseLoader';\n\nfunction SegmentBaseController(config) {\n config = config || {};\n\n const context = this.context;\n const eventBus = config.eventBus;\n const events = config.events;\n const dashMetrics = config.dashMetrics;\n const mediaPlayerModel = config.mediaPlayerModel;\n const errHandler = config.errHandler;\n const baseURLController = config.baseURLController;\n const debug = config.debug;\n const boxParser = config.boxParser;\n const requestModifier = config.requestModifier;\n const errors = config.errors;\n\n let instance,\n segmentBaseLoader,\n webmSegmentBaseLoader;\n\n function setup() {\n segmentBaseLoader = SegmentBaseLoader(context).getInstance();\n webmSegmentBaseLoader = WebmSegmentBaseLoader(context).getInstance();\n\n segmentBaseLoader.setConfig({\n baseURLController: baseURLController,\n dashMetrics: dashMetrics,\n mediaPlayerModel: mediaPlayerModel,\n errHandler: errHandler,\n eventBus: eventBus,\n events: events,\n errors: errors,\n debug: debug,\n boxParser: boxParser,\n requestModifier: requestModifier\n });\n\n webmSegmentBaseLoader.setConfig({\n baseURLController: baseURLController,\n dashMetrics: dashMetrics,\n mediaPlayerModel: mediaPlayerModel,\n errHandler: errHandler,\n eventBus: eventBus,\n events: events,\n errors: errors,\n debug: debug,\n requestModifier: requestModifier\n });\n }\n\n function isWebM(mimeType) {\n const type = mimeType ? mimeType.split('/')[1] : '';\n return 'webm' === type.toLowerCase();\n }\n\n function initialize() {\n segmentBaseLoader.initialize();\n webmSegmentBaseLoader.initialize();\n }\n\n function getSegmentBaseInitSegment(data) {\n if (isWebM(data.representation.mimeType)) {\n return webmSegmentBaseLoader.loadInitialization(data.representation, data.mediaType);\n } else {\n return segmentBaseLoader.loadInitialization(data.representation, data.mediaType);\n }\n }\n\n function getSegmentList(e) {\n if (isWebM(e.mimeType)) {\n return webmSegmentBaseLoader.loadSegments(e.representation, e.mediaType, e.representation ? e.representation.indexRange : null);\n } else {\n return segmentBaseLoader.loadSegments(e.representation, e.mediaType, e.representation ? e.representation.indexRange : null);\n }\n }\n\n function reset() {\n segmentBaseLoader.reset();\n webmSegmentBaseLoader.reset();\n }\n\n\n instance = {\n initialize,\n getSegmentBaseInitSegment,\n getSegmentList,\n reset\n };\n\n setup();\n\n return instance;\n}\n\nSegmentBaseController.__dashjs_factory_name = 'SegmentBaseController';\nconst factory = FactoryMaker.getSingletonFactory(SegmentBaseController);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass RepresentationInfo {\n constructor() {\n this.id = null;\n this.quality = null;\n this.fragmentDuration = null;\n this.mediaInfo = null;\n this.MSETimeOffset = null;\n }\n}\n\nexport default RepresentationInfo;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass MediaInfo {\n constructor() {\n this.id = null;\n this.index = null;\n this.type = null;\n this.streamInfo = null;\n this.representationCount = 0;\n this.labels = null;\n this.lang = null;\n this.viewpoint = null;\n this.viewpointsWithSchemeIdUri = null;\n this.accessibility = null;\n this.accessibilitiesWithSchemeIdUri = null;\n this.audioChannelConfiguration = null;\n this.audioChannelConfigurationsWithSchemeIdUri = null;\n this.roles = null;\n this.rolesWithSchemeIdUri = null;\n this.codec = null;\n this.mimeType = null;\n this.contentProtection = null;\n this.isText = false;\n this.KID = null;\n this.bitrateList = null;\n this.isFragmented = null;\n this.isEmbedded = null;\n this.selectionPriority = 1;\n this.supplementalProperties = {};\n this.supplementalPropertiesAsArray = [];\n this.essentialProperties = {};\n this.essentialPropertiesAsArray = [];\n this.segmentAlignment = false;\n this.subSegmentAlignment = false;\n }\n\n}\n\nexport default MediaInfo;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass StreamInfo {\n constructor() {\n this.id = null;\n this.index = null;\n this.start = NaN;\n this.duration = NaN;\n this.manifestInfo = null;\n this.isLast = true;\n }\n}\n\nexport default StreamInfo;","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass ManifestInfo {\n constructor() {\n this.dvrWindowSize = NaN;\n this.loadedTime = null;\n this.availableFrom = null;\n this.minBufferTime = NaN;\n this.duration = NaN;\n this.isDynamic = false;\n this.maxFragmentDuration = null;\n this.serviceDescriptions = [];\n this.protocol = null;\n }\n}\n\nexport default ManifestInfo;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass SimpleXPath {\n constructor(selector) {\n // establish validation of the path, to catch unsupported cases\n this.valid = selector[0] == '/'; // first check, we only support absolute addressing\n\n // establish parsed path, example:\n // /MPD/Period[@id=\"foobar\"]/AdaptationSet[@id=\"2\"]/SegmentTemplate/SegmentTimeline\n this.path = selector.split('/')\n .filter((component) => component.length !== 0) // remove excess empty components\n .map((component) => {\n let parsed = {\n name: component\n };\n\n let qualifierPoint = component.indexOf('[');\n if (qualifierPoint != -1) {\n parsed.name = component.substring(0, qualifierPoint);\n\n let qualifier = component.substring(qualifierPoint + 1, component.length - 1);\n\n // quick sanity check are there additional qualifiers making this invalid\n this.valid = this.valid && qualifier.indexOf('[') == -1;\n\n let equalityPoint = qualifier.indexOf('=');\n if (equalityPoint != -1) {\n parsed.attribute = {\n name: qualifier.substring(1, equalityPoint), // skip the @\n value: qualifier.substring(equalityPoint + 1)\n };\n\n // check for single and double quoted attribute values\n if (['\\'', '\"'].indexOf(parsed.attribute.value[0]) != -1) {\n parsed.attribute.value = parsed.attribute.value.substring(1, parsed.attribute.value.length - 1);\n }\n } else {\n // positional access in xpath is 1-based index\n // internal processes will assume 0-based so we normalize that here\n parsed.position = parseInt(qualifier, 10) - 1;\n }\n }\n\n return parsed;\n });\n }\n\n isValid() {\n return this.valid;\n }\n\n findsElement() {\n return !this.findsAttribute();\n }\n\n findsAttribute() {\n return this.path[this.path.length - 1].name.startsWith('@');\n }\n\n findsTextReplace() {\n return this.path[this.path.length - 1].name === 'text()';\n }\n\n getMpdTarget(root, isSiblingOperation) {\n let parent = null;\n let leaf = root;\n // assume root is MPD and we start at next level match\n let level = 1;\n let name = 'MPD';\n\n while ( level < this.path.length && leaf !== null) {\n // set parent to current\n parent = leaf;\n\n // select next leaf based on component\n let component = this.path[level];\n name = component.name;\n\n // stop one early if this is the last element and an attribute or a text selector\n if (level !== this.path.length - 1 || (!name.startsWith('@') && name !== 'text()')) {\n let children = parent[name + '_asArray'] || [];\n if (children.length === 0 && parent[name]) {\n children.push(parent[name]);\n }\n\n if (component.position) {\n leaf = children[component.position] || null;\n } else if (component.attribute) {\n let attr = component.attribute;\n leaf = children.filter((elm) => elm[attr.name] == attr.value)[0] || null;\n } else {\n // default case, select first\n leaf = children[0] || null;\n }\n }\n\n level++;\n }\n\n if (leaf === null) {\n // given path not found in root\n return null;\n }\n\n // attributes the target is the leaf node, the name is the attribute\n if (name.startsWith('@')) {\n return {\n name: name.substring(1),\n leaf: leaf,\n target: leaf\n };\n }\n\n // for replacing a text node the target is the leaf node, the name is __text\n else if (name === 'text()') {\n return {\n name: '__text',\n leaf: leaf,\n target: leaf\n };\n }\n\n // otherwise we target the parent for sibling operations and leaf for child operations\n return {\n name: name,\n leaf: leaf,\n target: isSiblingOperation ? parent : leaf\n };\n }\n}\n\nexport default SimpleXPath;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass PatchOperation {\n constructor(action, xpath, value) {\n this.action = action;\n this.xpath = xpath;\n this.value = value;\n this.position = null;\n }\n\n getMpdTarget(root) {\n let isSiblingOperation = this.action === 'remove' || this.action === 'replace' || this.position === 'before' || this.position === 'after';\n return this.xpath.getMpdTarget(root, isSiblingOperation);\n }\n}\n\nexport default PatchOperation;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport DashConstants from '../constants/DashConstants';\nimport FactoryMaker from '../../core/FactoryMaker';\nimport Debug from '../../core/Debug';\nimport SimpleXPath from '../vo/SimpleXPath';\nimport PatchOperation from '../vo/PatchOperation';\n\nfunction PatchManifestModel() {\n let instance,\n logger;\n\n const context = this.context;\n\n function setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n }\n\n function getIsPatch(patch) {\n return patch && patch.hasOwnProperty(DashConstants.ORIGINAL_MPD_ID) || false;\n }\n\n function getPublishTime(patch) {\n return patch && patch.hasOwnProperty(DashConstants.PUBLISH_TIME) ? new Date(patch[DashConstants.PUBLISH_TIME]) : null;\n }\n\n function getOriginalPublishTime(patch) {\n return patch && patch.hasOwnProperty(DashConstants.ORIGINAL_PUBLISH_TIME) ? new Date(patch[DashConstants.ORIGINAL_PUBLISH_TIME]) : null;\n }\n\n function getMpdId(patch) {\n return (patch && patch[DashConstants.ORIGINAL_MPD_ID]) || null;\n }\n\n function getPatchOperations(patch) {\n if (!patch) {\n return [];\n }\n\n // Go through the patch operations in order and parse their actions out for usage\n return (patch.__children || []).map((nodeContainer) => {\n let action = Object.keys(nodeContainer)[0];\n\n // we only look add add/remove/replace actions\n if (action !== 'add' && action !== 'remove' && action !== 'replace') {\n logger.warn(`Ignoring node of invalid action: ${action}`);\n return null;\n }\n\n let node = nodeContainer[action];\n let selector = node.sel;\n\n // add action can have special targeting via the 'type' attribute\n if (action === 'add' && node.type) {\n if (!node.type.startsWith('@')) {\n logger.warn(`Ignoring add action for prefixed namespace declaration: ${node.type}=${node.__text}`);\n return null;\n }\n\n // for our purposes adding/replacing attribute are equivalent and we can normalize\n // our processing logic by appending the attribute to the selector path\n selector = `${selector}/${node.type}`;\n }\n\n let xpath = new SimpleXPath(selector);\n if (!xpath.isValid()) {\n logger.warn(`Ignoring action with invalid selector: ${action} - ${selector}`);\n return null;\n }\n\n let value = null;\n if (xpath.findsAttribute() || xpath.findsTextReplace()) {\n value = node.__text || '';\n } else if (action !== 'remove') {\n value = node.__children.reduce((groups, child) => {\n // note that this is informed by xml2js parse structure for the __children array\n // which will be something like this for each child:\n // {\n // \"<node-name>\": { <xml2js-node-object> }\n // }\n let key = Object.keys(child)[0];\n // we also ignore\n if (key !== '#text') {\n groups[key] = groups[key] || [];\n groups[key].push(child[key]);\n }\n return groups;\n }, {});\n }\n\n let operation = new PatchOperation(action, xpath, value);\n\n if (action === 'add') {\n operation.position = node.pos;\n }\n\n return operation;\n }).filter((operation) => !!operation);\n }\n\n instance = {\n getIsPatch: getIsPatch,\n getPublishTime: getPublishTime,\n getOriginalPublishTime: getOriginalPublishTime,\n getMpdId: getMpdId,\n getPatchOperations: getPatchOperations\n };\n\n setup();\n\n return instance;\n}\n\nPatchManifestModel.__dashjs_factory_name = 'PatchManifestModel';\nexport default FactoryMaker.getSingletonFactory(PatchManifestModel);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport DashConstants from './constants/DashConstants';\nimport RepresentationInfo from './vo/RepresentationInfo';\nimport MediaInfo from './vo/MediaInfo';\nimport StreamInfo from './vo/StreamInfo';\nimport ManifestInfo from './vo/ManifestInfo';\nimport Event from './vo/Event';\nimport FactoryMaker from '../core/FactoryMaker';\nimport DashManifestModel from './models/DashManifestModel';\nimport PatchManifestModel from './models/PatchManifestModel';\nimport bcp47Normalize from 'bcp-47-normalize';\n\n/**\n * @module DashAdapter\n * @description The DashAdapter module can be accessed using the MediaPlayer API getDashAdapter()\n */\n\nfunction DashAdapter() {\n let instance,\n dashManifestModel,\n patchManifestModel,\n voPeriods,\n currentMediaInfo,\n constants,\n cea608parser;\n\n const context = this.context;\n\n const PROFILE_DVB = 'urn:dvb:dash:profile:dvb-dash:2014';\n\n function setup() {\n dashManifestModel = DashManifestModel(context).getInstance();\n patchManifestModel = PatchManifestModel(context).getInstance();\n reset();\n }\n\n // #region PUBLIC FUNCTIONS\n // --------------------------------------------------\n function setConfig(config) {\n if (!config) return;\n\n if (config.constants) {\n constants = config.constants;\n }\n\n if (config.cea608parser) {\n cea608parser = config.cea608parser;\n }\n\n if (config.errHandler) {\n dashManifestModel.setConfig({ errHandler: config.errHandler });\n }\n\n if (config.BASE64) {\n dashManifestModel.setConfig({ BASE64: config.BASE64 });\n }\n }\n\n /**\n * Creates an instance of RepresentationInfo based on a representation value object\n * @param {object} voRepresentation\n * @returns {RepresentationInfo|null} representationInfo\n * @memberOf module:DashAdapter\n * @instance\n * @ignore\n */\n function convertRepresentationToRepresentationInfo(voRepresentation) {\n if (voRepresentation) {\n let representationInfo = new RepresentationInfo();\n const realAdaptation = voRepresentation.adaptation.period.mpd.manifest.Period_asArray[voRepresentation.adaptation.period.index].AdaptationSet_asArray[voRepresentation.adaptation.index];\n const realRepresentation = dashManifestModel.getRepresentationFor(voRepresentation.index, realAdaptation);\n\n representationInfo.id = voRepresentation.id;\n representationInfo.quality = voRepresentation.index;\n representationInfo.bandwidth = dashManifestModel.getBandwidth(realRepresentation);\n representationInfo.fragmentDuration = voRepresentation.segmentDuration || (voRepresentation.segments && voRepresentation.segments.length > 0 ? voRepresentation.segments[0].duration : NaN);\n representationInfo.MSETimeOffset = voRepresentation.MSETimeOffset;\n representationInfo.mediaInfo = convertAdaptationToMediaInfo(voRepresentation.adaptation);\n\n return representationInfo;\n } else {\n return null;\n }\n }\n\n /**\n * Returns a MediaInfo object for a given media type and the corresponding streamInfo.\n * @param {object} streamInfo\n * @param {MediaType }type\n * @returns {null|MediaInfo} mediaInfo\n * @memberOf module:DashAdapter\n * @instance\n */\n function getMediaInfoForType(streamInfo, type) {\n if (voPeriods.length === 0 || !streamInfo) {\n return null;\n }\n\n let selectedVoPeriod = getPeriodForStreamInfo(streamInfo, voPeriods);\n if (!selectedVoPeriod) return null;\n\n const voAdaptations = dashManifestModel.getAdaptationsForPeriod(selectedVoPeriod);\n\n let realAdaptation = getAdaptationForType(streamInfo.index, type, streamInfo);\n if (!realAdaptation) return null;\n let idx = dashManifestModel.getIndexForAdaptation(realAdaptation, voPeriods[0].mpd.manifest, streamInfo.index);\n\n return convertAdaptationToMediaInfo(voAdaptations[idx]);\n }\n\n /**\n * Checks if the role of the specified AdaptationSet is set to main\n * @param {object} adaptation\n * @returns {boolean}\n * @memberOf module:DashAdapter\n * @instance\n */\n function getIsMain(adaptation) {\n return dashManifestModel.getRolesForAdaptation(adaptation).filter(function (role) {\n return role.value === DashConstants.MAIN;\n })[0];\n }\n\n /**\n * Returns the AdaptationSet for a given period index and a given mediaType.\n * @param {number} periodIndex\n * @param {MediaType} type\n * @param {object} streamInfo\n * @returns {null|object} adaptation\n * @memberOf module:DashAdapter\n * @instance\n */\n function getAdaptationForType(periodIndex, type, streamInfo) {\n const adaptations = dashManifestModel.getAdaptationsForType(voPeriods[0].mpd.manifest, periodIndex, type);\n\n if (!adaptations || adaptations.length === 0) return null;\n\n if (adaptations.length > 1 && streamInfo) {\n const allMediaInfoForType = getAllMediaInfoForType(streamInfo, type);\n\n if (currentMediaInfo[streamInfo.id] && currentMediaInfo[streamInfo.id][type]) {\n for (let i = 0, ln = adaptations.length; i < ln; i++) {\n if (areMediaInfosEqual(currentMediaInfo[streamInfo.id][type], allMediaInfoForType[i])) {\n return adaptations[i];\n }\n }\n }\n\n for (let i = 0, ln = adaptations.length; i < ln; i++) {\n if (getIsMain(adaptations[i])) {\n return adaptations[i];\n }\n }\n }\n\n return adaptations[0];\n }\n\n /**\n * Compares two mediaInfo objects\n * @param {MediaInfo} mInfoOne\n * @param {MediaInfo} mInfoTwo\n * @returns {boolean}\n * @memberof module:DashAdapter\n * @instance\n */\n function areMediaInfosEqual(mInfoOne, mInfoTwo) {\n if (!mInfoOne || !mInfoTwo) {\n return false;\n }\n\n const sameId = mInfoOne.id === mInfoTwo.id;\n const sameCodec = mInfoOne.codec === mInfoTwo.codec;\n const sameViewpoint = mInfoOne.viewpoint === mInfoTwo.viewpoint;\n const sameViewpointWithSchemeIdUri = JSON.stringify(mInfoOne.viewpointsWithSchemeIdUri) === JSON.stringify(mInfoTwo.viewpointsWithSchemeIdUri);\n const sameLang = mInfoOne.lang === mInfoTwo.lang;\n const sameRoles = mInfoOne.roles.toString() === mInfoTwo.roles.toString();\n const sameRolesWithSchemeIdUri = JSON.stringify(mInfoOne.rolesWithSchemeIdUri) === JSON.stringify(mInfoTwo.rolesWithSchemeIdUri);\n const sameAccessibility = mInfoOne.accessibility.toString() === mInfoTwo.accessibility.toString();\n const sameAccessibilityWithSchemeIdUri = JSON.stringify(mInfoOne.accessibilitiesWithSchemeIdUri) === JSON.stringify(mInfoTwo.accessibilitiesWithSchemeIdUri);\n const sameAudioChannelConfiguration = mInfoOne.audioChannelConfiguration.toString() === mInfoTwo.audioChannelConfiguration.toString();\n const sameAudioChannelConfigurationWithSchemeIdUri = JSON.stringify(mInfoOne.audioChannelConfigurationsWithSchemeIdUri) === JSON.stringify(mInfoTwo.audioChannelConfigurationsWithSchemeIdUri);\n\n return (sameId && sameCodec && sameViewpoint && sameViewpointWithSchemeIdUri && sameLang && sameRoles && sameRolesWithSchemeIdUri && sameAccessibility && sameAccessibilityWithSchemeIdUri && sameAudioChannelConfiguration && sameAudioChannelConfigurationWithSchemeIdUri);\n }\n\n function _getAllMediaInfo(manifest, period, streamInfo, adaptations, type, embeddedText) {\n let mediaArr = [];\n let data,\n media,\n idx,\n i,\n j,\n ln;\n\n if (!adaptations || adaptations.length === 0) {\n return [];\n }\n\n const voAdaptations = dashManifestModel.getAdaptationsForPeriod(period);\n\n for (i = 0, ln = adaptations.length; i < ln; i++) {\n data = adaptations[i];\n idx = dashManifestModel.getIndexForAdaptation(data, manifest, streamInfo.index);\n media = convertAdaptationToMediaInfo(voAdaptations[idx]);\n\n if (embeddedText) {\n let accessibilityLength = media.accessibility.length;\n for (j = 0; j < accessibilityLength; j++) {\n if (!media) {\n continue;\n }\n let accessibility = media.accessibility[j];\n if (accessibility.indexOf('cea-608:') === 0) {\n let value = accessibility.substring(8);\n let parts = value.split(';');\n if (parts[0].substring(0, 2) === 'CC') {\n for (j = 0; j < parts.length; j++) {\n if (!media) {\n media = convertAdaptationToMediaInfo.call(this, voAdaptations[idx]);\n }\n convertVideoInfoToEmbeddedTextInfo(media, parts[j].substring(0, 3), parts[j].substring(4));\n mediaArr.push(media);\n media = null;\n }\n } else {\n for (j = 0; j < parts.length; j++) { // Only languages for CC1, CC2, ...\n if (!media) {\n media = convertAdaptationToMediaInfo.call(this, voAdaptations[idx]);\n }\n convertVideoInfoToEmbeddedTextInfo(media, 'CC' + (j + 1), parts[j]);\n mediaArr.push(media);\n media = null;\n }\n }\n } else if (accessibility.indexOf('cea-608') === 0) { // Nothing known. We interpret it as CC1=eng\n convertVideoInfoToEmbeddedTextInfo(media, constants.CC1, 'eng');\n mediaArr.push(media);\n media = null;\n }\n }\n } else if (type === constants.IMAGE) {\n convertVideoInfoToThumbnailInfo(media);\n mediaArr.push(media);\n media = null;\n } else if (media) {\n mediaArr.push(media);\n }\n }\n\n return mediaArr;\n }\n\n /**\n * Returns all the mediaInfos for a given mediaType and the corresponding streamInfo.\n * @param {object} streamInfo\n * @param {MediaType} type\n * @param {object} externalManifest Set to null or undefined if no external manifest is to be used\n * @returns {Array} mediaArr\n * @memberOf module:DashAdapter\n * @instance\n */\n function getAllMediaInfoForType(streamInfo, type, externalManifest) {\n let voLocalPeriods = voPeriods;\n let manifest = externalManifest;\n let mediaArr = [];\n\n if (manifest) {\n checkConfig();\n\n voLocalPeriods = getRegularPeriods(manifest);\n } else {\n if (voPeriods.length > 0) {\n manifest = voPeriods[0].mpd.manifest;\n } else {\n return mediaArr;\n }\n }\n\n const selectedVoPeriod = getPeriodForStreamInfo(streamInfo, voLocalPeriods);\n let adaptationsForType = dashManifestModel.getAdaptationsForType(manifest, streamInfo ? streamInfo.index : null, type);\n\n mediaArr = _getAllMediaInfo(manifest, selectedVoPeriod, streamInfo, adaptationsForType, type);\n\n // Search for embedded text in video track\n if (type === constants.TEXT) {\n adaptationsForType = dashManifestModel.getAdaptationsForType(manifest, streamInfo ? streamInfo.index : null, constants.VIDEO);\n mediaArr = mediaArr.concat(_getAllMediaInfo(manifest, selectedVoPeriod, streamInfo, adaptationsForType, type, true));\n }\n\n return mediaArr;\n }\n\n /**\n * Update the internal voPeriods array with the information from the new manifest\n * @param {object} newManifest\n * @returns {*}\n * @memberOf module:DashAdapter\n * @instance\n * @ignore\n */\n function updatePeriods(newManifest) {\n if (!newManifest) return null;\n\n checkConfig();\n\n voPeriods = getRegularPeriods(newManifest);\n }\n\n /**\n * Returns an array of streamInfo objects\n * @param {object} externalManifest\n * @param {number} maxStreamsInfo\n * @returns {Array} streams\n * @memberOf module:DashAdapter\n * @instance\n * @ignore\n */\n function getStreamsInfo(externalManifest, maxStreamsInfo) {\n const streams = [];\n let voLocalPeriods = voPeriods;\n\n //if manifest is defined, getStreamsInfo is for an outside manifest, not the current one\n if (externalManifest) {\n checkConfig();\n voLocalPeriods = getRegularPeriods(externalManifest);\n }\n\n if (voLocalPeriods.length > 0) {\n if (!maxStreamsInfo || maxStreamsInfo > voLocalPeriods.length) {\n maxStreamsInfo = voLocalPeriods.length;\n }\n for (let i = 0; i < maxStreamsInfo; i++) {\n streams.push(convertPeriodToStreamInfo(voLocalPeriods[i]));\n }\n }\n\n return streams;\n }\n\n /**\n * Returns the AdaptationSet as saved in the DashManifestModel\n * @param {object} streamInfo\n * @param {object} mediaInfo\n * @returns {object} realAdaptation\n * @memberOf module:DashAdapter\n * @instance\n */\n function getRealAdaptation(streamInfo, mediaInfo) {\n let id,\n realAdaptation;\n\n const selectedVoPeriod = getPeriodForStreamInfo(streamInfo, voPeriods);\n\n id = mediaInfo ? mediaInfo.id : null;\n\n if (voPeriods.length > 0 && selectedVoPeriod) {\n realAdaptation = id ? dashManifestModel.getAdaptationForId(id, voPeriods[0].mpd.manifest, selectedVoPeriod.index) : dashManifestModel.getAdaptationForIndex(mediaInfo ? mediaInfo.index : null, voPeriods[0].mpd.manifest, selectedVoPeriod.index);\n }\n\n return realAdaptation;\n }\n\n /**\n * Returns the ProducerReferenceTimes as saved in the DashManifestModel if present\n * @param {object} streamInfo\n * @param {object} mediaInfo\n * @returns {object} producerReferenceTimes\n * @memberOf module:DashAdapter\n * @instance\n */\n function getProducerReferenceTimes(streamInfo, mediaInfo) {\n let id, realAdaptation;\n\n const selectedVoPeriod = getPeriodForStreamInfo(streamInfo, voPeriods);\n id = mediaInfo ? mediaInfo.id : null;\n\n if (voPeriods.length > 0 && selectedVoPeriod) {\n realAdaptation = id ? dashManifestModel.getAdaptationForId(id, voPeriods[0].mpd.manifest, selectedVoPeriod.index) : dashManifestModel.getAdaptationForIndex(mediaInfo ? mediaInfo.index : null, voPeriods[0].mpd.manifest, selectedVoPeriod.index);\n }\n\n if (!realAdaptation) return [];\n return dashManifestModel.getProducerReferenceTimesForAdaptation(realAdaptation);\n }\n\n /**\n * Return all EssentialProperties of a Representation\n * @param {object} representation\n * @return {array}\n */\n function getEssentialPropertiesForRepresentation(representation) {\n try {\n return dashManifestModel.getEssentialPropertiesForRepresentation(representation);\n } catch (e) {\n return [];\n }\n }\n\n /**\n * Returns the period as defined in the DashManifestModel for a given index\n * @param {number} index\n * @return {object}\n * @memberOf module:DashAdapter\n * @instance\n */\n function getRealPeriodByIndex(index) {\n return dashManifestModel.getRealPeriodForIndex(index, voPeriods[0].mpd.manifest);\n }\n\n /**\n * Returns all voRepresentations for a given mediaInfo\n * @param {object} mediaInfo\n * @returns {Array} voReps\n * @memberOf module:DashAdapter\n * @instance\n */\n function getVoRepresentations(mediaInfo) {\n let voReps;\n\n const voAdaptation = getAdaptationForMediaInfo(mediaInfo);\n voReps = dashManifestModel.getRepresentationsForAdaptation(voAdaptation);\n\n return voReps;\n }\n\n /**\n * Returns the event for the given parameters.\n * @param {object} eventBox\n * @param {object} eventStreams\n * @param {number} mediaStartTime - Specified in seconds\n * @param {object} voRepresentation\n * @returns {null|Event}\n * @memberOf module:DashAdapter\n * @instance\n * @ignore\n */\n function getEvent(eventBox, eventStreams, mediaStartTime, voRepresentation) {\n try {\n if (!eventBox || !eventStreams || isNaN(mediaStartTime) || !voRepresentation) {\n return null;\n }\n\n const schemeIdUri = eventBox.scheme_id_uri;\n const value = eventBox.value;\n\n if (!eventStreams[schemeIdUri + '/' + value]) {\n return null;\n }\n\n const event = new Event();\n const timescale = eventBox.timescale || 1;\n const periodStart = voRepresentation.adaptation.period.start;\n const eventStream = eventStreams[schemeIdUri + '/' + value];\n // The PTO in voRepresentation is already specified in seconds\n const presentationTimeOffset = !isNaN(voRepresentation.presentationTimeOffset) ? voRepresentation.presentationTimeOffset : !isNaN(eventStream.presentationTimeOffset) ? eventStream.presentationTimeOffset : 0;\n // In case of version 1 events the presentation_time is parsed as presentation_time_delta\n let presentationTimeDelta = eventBox.presentation_time_delta / timescale;\n let calculatedPresentationTime;\n\n if (eventBox.version === 0) {\n calculatedPresentationTime = periodStart + mediaStartTime - presentationTimeOffset + presentationTimeDelta;\n } else {\n calculatedPresentationTime = periodStart - presentationTimeOffset + presentationTimeDelta;\n }\n\n const duration = eventBox.event_duration / timescale;\n const id = eventBox.id;\n const messageData = eventBox.message_data;\n\n event.eventStream = eventStream;\n event.eventStream.value = value;\n event.eventStream.timescale = timescale;\n event.duration = duration;\n event.id = id;\n event.calculatedPresentationTime = calculatedPresentationTime;\n event.messageData = messageData;\n event.presentationTimeDelta = presentationTimeDelta;\n\n return event;\n } catch (e) {\n return null;\n }\n }\n\n /**\n * Returns the events for the given info object. info can either be an instance of StreamInfo, MediaInfo or RepresentationInfo\n * @param {object} info\n * @param {object} voRepresentation\n * @returns {Array}\n * @memberOf module:DashAdapter\n * @instance\n * @ignore\n */\n function getEventsFor(info, voRepresentation, streamInfo) {\n let events = [];\n\n if (voPeriods.length > 0) {\n const manifest = voPeriods[0].mpd.manifest;\n\n if (info instanceof StreamInfo) {\n const period = getPeriodForStreamInfo(info, voPeriods)\n events = dashManifestModel.getEventsForPeriod(period);\n } else if (info instanceof MediaInfo) {\n const period = getPeriodForStreamInfo(streamInfo, voPeriods)\n events = dashManifestModel.getEventStreamForAdaptationSet(manifest, getAdaptationForMediaInfo(info), period);\n } else if (info instanceof RepresentationInfo) {\n const period = getPeriodForStreamInfo(streamInfo, voPeriods)\n events = dashManifestModel.getEventStreamForRepresentation(manifest, voRepresentation, period);\n }\n }\n\n return events;\n }\n\n /**\n * Sets the current active mediaInfo for a given streamId and a given mediaType\n * @param {number} streamId\n * @param {MediaType} type\n * @param {object} mediaInfo\n * @memberOf module:DashAdapter\n * @instance\n * @ignore\n */\n function setCurrentMediaInfo(streamId, type, mediaInfo) {\n currentMediaInfo[streamId] = currentMediaInfo[streamId] || {};\n currentMediaInfo[streamId][type] = currentMediaInfo[streamId][type] || {};\n currentMediaInfo[streamId][type] = mediaInfo;\n }\n\n /**\n * Check if the given type is a text track\n * @param {object} adaptation\n * @returns {boolean}\n * @memberOf module:DashAdapter\n * @instance\n * @ignore\n */\n function getIsTextTrack(adaptation) {\n return dashManifestModel.getIsText(adaptation);\n }\n\n /**\n * Returns the UTC Timing Sources specified in the manifest\n * @returns {Array} utcTimingSources\n * @memberOf module:DashAdapter\n * @instance\n */\n function getUTCTimingSources() {\n const manifest = getManifest();\n return dashManifestModel.getUTCTimingSources(manifest);\n }\n\n /**\n * Returns the suggestedPresentationDelay as specified in the manifest\n * @returns {String} suggestedPresentationDelay\n * @memberOf module:DashAdapter\n * @instance\n */\n function getSuggestedPresentationDelay() {\n const mpd = voPeriods.length > 0 ? voPeriods[0].mpd : null;\n return dashManifestModel.getSuggestedPresentationDelay(mpd);\n }\n\n /**\n * Returns the availabilityStartTime as specified in the manifest\n * @param {object} externalManifest Omit this value if no external manifest should be used\n * @returns {number} availabilityStartTime\n * @memberOf module:DashAdapter\n * @instance\n */\n function getAvailabilityStartTime(externalManifest) {\n const mpd = getMpd(externalManifest);\n return dashManifestModel.getAvailabilityStartTime(mpd);\n }\n\n /**\n * Returns a boolean indicating if the manifest is dynamic or not\n * @param {object} externalManifest Omit this value if no external manifest should be used\n * @returns {boolean}\n * @memberOf module:DashAdapter\n * @instance\n */\n function getIsDynamic(externalManifest) {\n const manifest = getManifest(externalManifest);\n return dashManifestModel.getIsDynamic(manifest);\n }\n\n /**\n * Returns the duration of the MPD\n * @param {object} externalManifest Omit this value if no external manifest should be used\n * @returns {number} duration\n * @memberOf module:DashAdapter\n * @instance\n */\n function getDuration(externalManifest) {\n const manifest = getManifest(externalManifest);\n return dashManifestModel.getDuration(manifest);\n }\n\n /**\n * Returns all periods of the MPD\n * @param {object} externalManifest Omit this value if no external manifest should be used\n * @returns {Array} periods\n * @memberOf module:DashAdapter\n * @instance\n */\n function getRegularPeriods(externalManifest) {\n const mpd = getMpd(externalManifest);\n return dashManifestModel.getRegularPeriods(mpd);\n }\n\n /**\n * Returns an MPD object\n * @param {object} externalManifest Omit this value if no external manifest should be used\n * @returns {object} MPD\n * @memberOf module:DashAdapter\n * @instance\n */\n function getMpd(externalManifest) {\n const manifest = getManifest(externalManifest);\n return dashManifestModel.getMpd(manifest);\n }\n\n /**\n * Returns the ContentSteering element of the MPD\n * @param {object} manifest\n * @returns {object} contentSteering\n * @memberOf module:DashAdapter\n * @instance\n */\n function getContentSteering(manifest) {\n return dashManifestModel.getContentSteering(manifest);\n }\n\n /**\n * Returns the location element of the MPD\n * @param {object} manifest\n * @returns {String} location\n * @memberOf module:DashAdapter\n * @instance\n */\n function getLocation(manifest) {\n return dashManifestModel.getLocation(manifest);\n }\n\n /**\n * Returns the manifest update period used for dynamic manifests\n * @param {object} manifest\n * @param {number} latencyOfLastUpdate\n * @returns {NaN|number} manifestUpdatePeriod\n * @memberOf module:DashAdapter\n * @instance\n */\n function getManifestUpdatePeriod(manifest, latencyOfLastUpdate = 0) {\n return dashManifestModel.getManifestUpdatePeriod(manifest, latencyOfLastUpdate);\n }\n\n /**\n * Returns the publish time from the manifest\n * @param {object} manifest\n * @returns {Date|null} publishTime\n * @memberOf module:DashAdapter\n * @instance\n */\n function getPublishTime(manifest) {\n return dashManifestModel.getPublishTime(manifest);\n }\n\n /**\n * Returns the patch locations of the MPD if existing and if they are still valid\n * @param {object} manifest\n * @returns {PatchLocation[]} patch location\n * @memberOf module:DashAdapter\n * @instance\n */\n function getPatchLocation(manifest) {\n const patchLocations = dashManifestModel.getPatchLocation(manifest);\n const publishTime = dashManifestModel.getPublishTime(manifest);\n\n // short-circuit when no patch location or publish time exists\n if (!patchLocations || patchLocations.length === 0 || !publishTime) {\n return [];\n }\n\n return patchLocations.filter((patchLocation) => {\n // check if the patch location has expired, if so do not consider it\n return isNaN(patchLocation.ttl) || (publishTime.getTime() + patchLocation.ttl > new Date().getTime())\n })\n }\n\n /**\n * Checks if the manifest has a DVB profile\n * @param {object} manifest\n * @returns {boolean}\n * @memberOf module:DashAdapter\n * @instance\n * @ignore\n */\n function getIsDVB(manifest) {\n return dashManifestModel.hasProfile(manifest, PROFILE_DVB);\n }\n\n /**\n * Checks if the manifest is actually just a patch manifest\n * @param {object} manifest\n * @return {boolean}\n * @memberOf module:DashAdapter\n * @instance\n */\n function getIsPatch(manifest) {\n return patchManifestModel.getIsPatch(manifest);\n }\n\n /**\n * Returns the base urls for a given element\n * @param {object} node\n * @returns {BaseURL[]}\n * @memberOf module:DashAdapter\n * @instance\n * @ignore\n */\n function getBaseURLsFromElement(node) {\n return dashManifestModel.getBaseURLsFromElement(node);\n }\n\n /**\n * Returns the function to sort the Representations\n * @returns {function}\n * @memberOf module:DashAdapter\n * @instance\n * @ignore\n */\n function getRepresentationSortFunction() {\n return dashManifestModel.getRepresentationSortFunction();\n }\n\n /**\n * Returns the codec for a given adaptation set and a given representation id.\n * @param {object} adaptation\n * @param {number} representationId\n * @param {boolean} addResolutionInfo Defines whether to include resolution information in the output\n * @returns {String} codec\n * @memberOf module:DashAdapter\n * @instance\n */\n function getCodec(adaptation, representationId, addResolutionInfo) {\n return dashManifestModel.getCodec(adaptation, representationId, addResolutionInfo);\n }\n\n /**\n * Returns the bandwidth for a given representation id and the corresponding period index\n * @param {number} representationId\n * @param {number} periodIdx\n * @returns {number} bandwidth\n * @memberOf module:DashAdapter\n * @instance\n */\n function getBandwidthForRepresentation(representationId, periodIdx) {\n let representation;\n let period = getPeriod(periodIdx);\n\n representation = findRepresentation(period, representationId);\n\n return representation ? representation.bandwidth : null;\n }\n\n /**\n * Returns the index for a given representation id\n * @param {string} representationId\n * @param {number} periodIdx\n * @returns {number} index\n * @memberOf module:DashAdapter\n * @instance\n */\n function getIndexForRepresentation(representationId, periodIdx) {\n let period = getPeriod(periodIdx);\n\n return findRepresentationIndex(period, representationId);\n }\n\n /**\n * This method returns the current max index based on what is defined in the MPD.\n * @param {string} bufferType - String 'audio' or 'video',\n * @param {number} periodIdx - Make sure this is the period index not id\n * @return {number}\n * @memberOf module:DashAdapter\n * @instance\n */\n function getMaxIndexForBufferType(bufferType, periodIdx) {\n let period = getPeriod(periodIdx);\n\n return findMaxBufferIndex(period, bufferType);\n }\n\n /**\n * Returns the voPeriod object for a given id\n * @param {String} id\n * @returns {object|null}\n * @memberOf module:DashAdapter\n * @instance\n */\n function getPeriodById(id) {\n if (!id || voPeriods.length === 0) {\n return null;\n }\n const periods = voPeriods.filter((p) => {\n return p.id === id;\n });\n\n if (periods && periods.length > 0) {\n return periods[0];\n }\n\n return null;\n }\n\n /**\n * Checks if the given AdaptationSet is from the given media type\n * @param {object} adaptation\n * @param {string} type\n * @return {boolean}\n * @memberOf module:DashAdapter\n * @instance\n */\n function getIsTypeOf(adaptation, type) {\n return dashManifestModel.getIsTypeOf(adaptation, type);\n }\n\n function reset() {\n voPeriods = [];\n currentMediaInfo = {};\n }\n\n /**\n * Checks if the supplied manifest is compatible for application of the supplied patch\n * @param {object} manifest\n * @param {object} patch\n * @return {boolean}\n * @memberOf module:DashAdapter\n * @instance\n */\n function isPatchValid(manifest, patch) {\n let manifestId = dashManifestModel.getId(manifest);\n let patchManifestId = patchManifestModel.getMpdId(patch);\n let manifestPublishTime = dashManifestModel.getPublishTime(manifest);\n let patchPublishTime = patchManifestModel.getPublishTime(patch);\n let originalManifestPublishTime = patchManifestModel.getOriginalPublishTime(patch);\n\n // Patches are considered compatible if the following are true\n // - MPD@id == Patch@mpdId\n // - MPD@publishTime == Patch@originalPublishTime\n // - MPD@publishTime < Patch@publishTime\n // - All values in comparison exist\n return !!(manifestId && patchManifestId && (manifestId == patchManifestId) &&\n manifestPublishTime && originalManifestPublishTime && (manifestPublishTime.getTime() == originalManifestPublishTime.getTime()) &&\n patchPublishTime && (manifestPublishTime.getTime() < patchPublishTime.getTime()));\n }\n\n /**\n * Takes a given patch and applies it to the provided manifest, assumes patch is valid for manifest\n * @param {object} manifest\n * @param {object} patch\n * @memberOf module:DashAdapter\n * @instance\n */\n function applyPatchToManifest(manifest, patch) {\n // get all operations from the patch and apply them in document order\n patchManifestModel.getPatchOperations(patch)\n .forEach((operation) => {\n let result = operation.getMpdTarget(manifest);\n\n // operation supplies a path that doesn't match mpd, skip\n if (result === null) {\n return;\n }\n\n let { name, target, leaf } = result;\n\n // short circuit for attribute selectors and text replacement\n if (operation.xpath.findsAttribute() || name === '__text') {\n switch (operation.action) {\n case 'add':\n case 'replace':\n // add and replace are just setting the value\n target[name] = operation.value;\n break;\n case 'remove':\n // remove is deleting the value\n delete target[name];\n break;\n }\n return;\n }\n\n // determine the relative insert position prior to possible removal\n let relativePosition = (target[name + '_asArray'] || []).indexOf(leaf);\n let insertBefore = (operation.position === 'prepend' || operation.position === 'before');\n\n // perform removal operation first, we have already capture the appropriate relative position\n if (operation.action === 'remove' || operation.action === 'replace') {\n // note that we ignore the 'ws' attribute of patch operations as it does not effect parsed mpd operations\n\n // purge the directly named entity\n delete target[name];\n\n // if we did have a positional reference we need to purge from array set and restore X2JS proper semantics\n if (relativePosition != -1) {\n let targetArray = target[name + '_asArray'];\n targetArray.splice(relativePosition, 1);\n if (targetArray.length > 1) {\n target[name] = targetArray;\n } else if (targetArray.length == 1) {\n // xml parsing semantics, singular asArray must be non-array in the unsuffixed key\n target[name] = targetArray[0];\n } else {\n // all nodes of this type deleted, remove entry\n delete target[name + '_asArray'];\n }\n }\n }\n\n // Perform any add/replace operations now, technically RFC5261 only allows a single element to take the\n // place of a replaced element while the add case allows an arbitrary number of children.\n // Due to the both operations requiring the same insertion logic they have been combined here and we will\n // not enforce single child operations for replace, assertions should be made at patch parse time if necessary\n if (operation.action === 'add' || operation.action === 'replace') {\n // value will be an object with element name keys pointing to arrays of objects\n Object.keys(operation.value).forEach((insert) => {\n let insertNodes = operation.value[insert];\n\n let updatedNodes = target[insert + '_asArray'] || [];\n if (updatedNodes.length === 0 && target[insert]) {\n updatedNodes.push(target[insert]);\n }\n\n if (updatedNodes.length === 0) {\n // no original nodes for this element type\n updatedNodes = insertNodes;\n } else {\n // compute the position we need to insert at, default to end of set\n let position = updatedNodes.length;\n if (insert == name && relativePosition != -1) {\n // if the inserted element matches the operation target (not leaf) and there is a relative position we\n // want the inserted position to be set such that our insertion is relative to original position\n // since replace has modified the array length we reduce the insert point by 1\n position = relativePosition + (insertBefore ? 0 : 1) + (operation.action == 'replace' ? -1 : 0);\n } else {\n // otherwise we are in an add append/prepend case or replace case that removed the target name completely\n position = insertBefore ? 0 : updatedNodes.length;\n }\n\n // we dont have to perform element removal for the replace case as that was done above\n updatedNodes.splice.apply(updatedNodes, [position, 0].concat(insertNodes));\n }\n\n // now we properly reset the element keys on the target to match parsing semantics\n target[insert + '_asArray'] = updatedNodes;\n target[insert] = updatedNodes.length == 1 ? updatedNodes[0] : updatedNodes;\n });\n }\n });\n }\n\n // #endregion PUBLIC FUNCTIONS\n\n // #region PRIVATE FUNCTIONS\n // --------------------------------------------------\n function getManifest(externalManifest) {\n return externalManifest ? externalManifest : voPeriods.length > 0 ? voPeriods[0].mpd.manifest : null;\n }\n\n function getAdaptationForMediaInfo(mediaInfo) {\n try {\n const selectedVoPeriod = getPeriodForStreamInfo(mediaInfo.streamInfo, voPeriods);\n const voAdaptations = dashManifestModel.getAdaptationsForPeriod(selectedVoPeriod);\n\n if (!mediaInfo || !mediaInfo.streamInfo || mediaInfo.streamInfo.id === undefined || !voAdaptations) return null;\n return voAdaptations[mediaInfo.index];\n } catch (e) {\n return null;\n }\n }\n\n function getPeriodForStreamInfo(streamInfo, voPeriodsArray) {\n const ln = voPeriodsArray.length;\n\n for (let i = 0; i < ln; i++) {\n let voPeriod = voPeriodsArray[i];\n\n if (streamInfo && streamInfo.id === voPeriod.id) return voPeriod;\n }\n\n return null;\n }\n\n function convertAdaptationToMediaInfo(adaptation) {\n if (!adaptation) {\n return null;\n }\n\n let mediaInfo = new MediaInfo();\n const realAdaptation = adaptation.period.mpd.manifest.Period_asArray[adaptation.period.index].AdaptationSet_asArray[adaptation.index];\n let viewpoint, acc, acc_rep, roles, accessibility;\n\n mediaInfo.id = adaptation.id;\n mediaInfo.index = adaptation.index;\n mediaInfo.type = adaptation.type;\n mediaInfo.streamInfo = convertPeriodToStreamInfo(adaptation.period);\n mediaInfo.representationCount = dashManifestModel.getRepresentationCount(realAdaptation);\n mediaInfo.labels = dashManifestModel.getLabelsForAdaptation(realAdaptation);\n mediaInfo.lang = dashManifestModel.getLanguageForAdaptation(realAdaptation);\n mediaInfo.segmentAlignment = dashManifestModel.getSegmentAlignment(realAdaptation);\n mediaInfo.subSegmentAlignment = dashManifestModel.getSubSegmentAlignment(realAdaptation);\n\n viewpoint = dashManifestModel.getViewpointForAdaptation(realAdaptation);\n mediaInfo.viewpoint = viewpoint.length ? viewpoint[0].value : undefined;\n mediaInfo.viewpointsWithSchemeIdUri = viewpoint;\n\n accessibility = dashManifestModel.getAccessibilityForAdaptation(realAdaptation);\n mediaInfo.accessibility = accessibility.map(function (accessibility) {\n let accessibilityValue = accessibility.value;\n let accessibilityData = accessibilityValue;\n if (accessibility.schemeIdUri && (accessibility.schemeIdUri.search('cea-608') >= 0) && typeof (cea608parser) !== 'undefined') {\n if (accessibilityValue) {\n accessibilityData = 'cea-608:' + accessibilityValue;\n } else {\n accessibilityData = 'cea-608';\n }\n mediaInfo.embeddedCaptions = true;\n }\n return accessibilityData;\n });\n mediaInfo.accessibilitiesWithSchemeIdUri = accessibility;\n\n acc = dashManifestModel.getAudioChannelConfigurationForAdaptation(realAdaptation);\n mediaInfo.audioChannelConfiguration = acc.map(function (audioChannelConfiguration) {\n return audioChannelConfiguration.value;\n });\n mediaInfo.audioChannelConfigurationsWithSchemeIdUri = acc;\n\n if (mediaInfo.audioChannelConfiguration.length === 0 && Array.isArray(realAdaptation.Representation_asArray) && realAdaptation.Representation_asArray.length > 0) {\n acc_rep = dashManifestModel.getAudioChannelConfigurationForRepresentation(realAdaptation.Representation_asArray[0]);\n mediaInfo.audioChannelConfiguration = acc_rep.map(function (audioChannelConfiguration) {\n return audioChannelConfiguration.value;\n });\n mediaInfo.audioChannelConfigurationsWithSchemeIdUri = acc_rep;\n }\n\n roles = dashManifestModel.getRolesForAdaptation(realAdaptation);\n mediaInfo.roles = roles.map(function (role) {\n return role.value;\n });\n mediaInfo.rolesWithSchemeIdUri = roles;\n\n mediaInfo.codec = dashManifestModel.getCodec(realAdaptation);\n mediaInfo.mimeType = dashManifestModel.getMimeType(realAdaptation);\n mediaInfo.contentProtection = dashManifestModel.getContentProtectionData(realAdaptation);\n mediaInfo.bitrateList = dashManifestModel.getBitrateListForAdaptation(realAdaptation);\n mediaInfo.selectionPriority = dashManifestModel.getSelectionPriority(realAdaptation);\n\n if (mediaInfo.contentProtection) {\n // Get the default key ID and apply it to all key systems\n const keyIds = mediaInfo.contentProtection.map(cp => dashManifestModel.getKID(cp)).filter(kid => kid !== null);\n if (keyIds.length) {\n const keyId = keyIds[0];\n mediaInfo.contentProtection.forEach(cp => {\n cp.keyId = keyId;\n });\n }\n }\n\n mediaInfo.isText = dashManifestModel.getIsText(realAdaptation);\n mediaInfo.supplementalProperties = dashManifestModel.getSupplementalPropertiesForAdaptation(realAdaptation);\n if ( (!mediaInfo.supplementalProperties || Object.keys(mediaInfo.supplementalProperties).length === 0) && Array.isArray(realAdaptation.Representation_asArray) && realAdaptation.Representation_asArray.length > 0) {\n let arr = realAdaptation.Representation_asArray.map( repr => {\n return dashManifestModel.getSupplementalPropertiesForRepresentation(repr);\n });\n if ( arr.every( v => JSON.stringify(v) === JSON.stringify(arr[0]) ) ) {\n // only output Representation.supplementalProperties to mediaInfo, if they are present on all Representations\n mediaInfo.supplementalProperties = arr[0];\n }\n }\n mediaInfo.supplementalPropertiesAsArray = dashManifestModel.getSupplementalPropertiesAsArrayForAdaptation(realAdaptation);\n if ( (!mediaInfo.supplementalPropertiesAsArray || mediaInfo.supplementalPropertiesAsArray.length === 0) && Array.isArray(realAdaptation.Representation_asArray) && realAdaptation.Representation_asArray.length > 0) {\n let arr = realAdaptation.Representation_asArray.map( repr => {\n return dashManifestModel.getSupplementalPropertiesAsArrayForRepresentation(repr);\n });\n if ( arr.every( v => JSON.stringify(v) === JSON.stringify(arr[0]) ) ) {\n // only output Representation.supplementalProperties to mediaInfo, if they are present on all Representations\n mediaInfo.supplementalPropertiesAsArray = arr[0];\n }\n }\n\n mediaInfo.essentialProperties = dashManifestModel.getEssentialPropertiesForAdaptation(realAdaptation); \n mediaInfo.essentialPropertiesAsArray = dashManifestModel.getEssentialPropertiesAsArrayForAdaptation(realAdaptation);\n \n mediaInfo.isFragmented = dashManifestModel.getIsFragmented(realAdaptation);\n mediaInfo.isEmbedded = false;\n\n return mediaInfo;\n }\n\n function convertVideoInfoToEmbeddedTextInfo(mediaInfo, channel, lang) {\n mediaInfo.id = channel; // CC1, CC2, CC3, or CC4\n mediaInfo.index = 100 + parseInt(channel.substring(2, 3));\n mediaInfo.type = constants.TEXT;\n mediaInfo.codec = 'cea-608-in-SEI';\n mediaInfo.isEmbedded = true;\n mediaInfo.isFragmented = false;\n let normLang = bcp47Normalize(lang);\n mediaInfo.lang = (normLang) ? normLang : lang;\n mediaInfo.roles = ['caption'];\n mediaInfo.rolesWithSchemeIdUri = [{schemeIdUri:'urn:mpeg:dash:role:2011', value:'caption'}];\n }\n\n function convertVideoInfoToThumbnailInfo(mediaInfo) {\n mediaInfo.type = constants.IMAGE;\n }\n\n function convertPeriodToStreamInfo(period) {\n let streamInfo = new StreamInfo();\n const THRESHOLD = 1;\n\n streamInfo.id = period.id;\n streamInfo.index = period.index;\n streamInfo.start = period.start;\n streamInfo.duration = period.duration;\n streamInfo.manifestInfo = convertMpdToManifestInfo(period.mpd);\n streamInfo.isLast = period.mpd.manifest.Period_asArray.length === 1 || Math.abs((streamInfo.start + streamInfo.duration) - streamInfo.manifestInfo.duration) < THRESHOLD;\n\n return streamInfo;\n }\n\n function convertMpdToManifestInfo(mpd) {\n let manifestInfo = new ManifestInfo();\n\n manifestInfo.dvrWindowSize = mpd.timeShiftBufferDepth;\n manifestInfo.loadedTime = mpd.manifest.loadedTime;\n manifestInfo.availableFrom = mpd.availabilityStartTime;\n manifestInfo.minBufferTime = mpd.manifest.minBufferTime;\n manifestInfo.maxFragmentDuration = mpd.maxSegmentDuration;\n manifestInfo.duration = dashManifestModel.getDuration(mpd.manifest);\n manifestInfo.isDynamic = dashManifestModel.getIsDynamic(mpd.manifest);\n manifestInfo.serviceDescriptions = dashManifestModel.getServiceDescriptions(mpd.manifest);\n manifestInfo.protocol = mpd.manifest.protocol;\n\n return manifestInfo;\n }\n\n function checkConfig() {\n if (!constants) {\n throw new Error('setConfig function has to be called previously');\n }\n }\n\n function getPeriod(periodIdx) {\n return voPeriods.length > 0 ? voPeriods[0].mpd.manifest.Period_asArray[periodIdx] : null;\n }\n\n function findRepresentationIndex(period, representationId) {\n const index = findRepresentation(period, representationId, true);\n\n return index !== null ? index : -1;\n }\n\n function findRepresentation(period, representationId, returnIndex) {\n let adaptationSet,\n adaptationSetArray,\n representation,\n representationArray,\n adaptationSetArrayIndex,\n representationArrayIndex;\n\n if (period) {\n adaptationSetArray = period.AdaptationSet_asArray;\n for (adaptationSetArrayIndex = 0; adaptationSetArrayIndex < adaptationSetArray.length; adaptationSetArrayIndex = adaptationSetArrayIndex + 1) {\n adaptationSet = adaptationSetArray[adaptationSetArrayIndex];\n representationArray = adaptationSet.Representation_asArray;\n for (representationArrayIndex = 0; representationArrayIndex < representationArray.length; representationArrayIndex = representationArrayIndex + 1) {\n representation = representationArray[representationArrayIndex];\n if (representationId === representation.id) {\n if (returnIndex) {\n return representationArrayIndex;\n } else {\n return representation;\n }\n }\n }\n }\n }\n\n return null;\n }\n\n function findMaxBufferIndex(period, bufferType) {\n let adaptationSet,\n adaptationSetArray,\n representationArray,\n adaptationSetArrayIndex;\n\n if (!period || !bufferType) return -1;\n\n adaptationSetArray = period.AdaptationSet_asArray;\n for (adaptationSetArrayIndex = 0; adaptationSetArrayIndex < adaptationSetArray.length; adaptationSetArrayIndex = adaptationSetArrayIndex + 1) {\n adaptationSet = adaptationSetArray[adaptationSetArrayIndex];\n representationArray = adaptationSet.Representation_asArray;\n if (dashManifestModel.getIsTypeOf(adaptationSet, bufferType)) {\n return representationArray.length;\n }\n }\n\n return -1;\n }\n\n // #endregion PRIVATE FUNCTIONS\n\n instance = {\n getBandwidthForRepresentation,\n getIndexForRepresentation,\n getMaxIndexForBufferType,\n convertRepresentationToRepresentationInfo,\n getStreamsInfo,\n getMediaInfoForType,\n getAllMediaInfoForType,\n getAdaptationForType,\n getRealAdaptation,\n getProducerReferenceTimes,\n getRealPeriodByIndex,\n getEssentialPropertiesForRepresentation,\n getVoRepresentations,\n getEventsFor,\n getEvent,\n getMpd,\n setConfig,\n updatePeriods,\n getIsTextTrack,\n getUTCTimingSources,\n getSuggestedPresentationDelay,\n getAvailabilityStartTime,\n getIsTypeOf,\n getIsDynamic,\n getDuration,\n getRegularPeriods,\n getContentSteering,\n getLocation,\n getPatchLocation,\n getManifestUpdatePeriod,\n getPublishTime,\n getIsDVB,\n getIsPatch,\n getBaseURLsFromElement,\n getRepresentationSortFunction,\n getCodec,\n getPeriodById,\n setCurrentMediaInfo,\n isPatchValid,\n applyPatchToManifest,\n areMediaInfosEqual,\n reset\n };\n\n setup();\n return instance;\n}\n\nDashAdapter.__dashjs_factory_name = 'DashAdapter';\nexport default FactoryMaker.getSingletonFactory(DashAdapter);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n * Static methods for rounding decimals\n *\n * Modified version of the CC0-licenced example at:\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round\n *\n * @export\n * @class Round10\n * @ignore\n */\nexport default class Round10 {\n /**\n * Decimal round.\n *\n * @param {Number} value The number.\n * @param {Integer} exp The exponent (the 10 logarithm of the adjustment base).\n * @returns {Number} The adjusted value.\n * @ignore\n */\n static round10(value, exp) {\n return _decimalAdjust('round', value, exp);\n }\n}\n\n/**\n * Decimal adjustment of a number.\n *\n * @param {String} type The type of adjustment.\n * @param {Number} value The number.\n * @param {Integer} exp The exponent (the 10 logarithm of the adjustment base).\n * @returns {Number} The adjusted value.\n * @ignore\n */\nfunction _decimalAdjust(type, value, exp) {\n // If the exp is undefined or zero...\n if (typeof exp === 'undefined' || +exp === 0) {\n return Math[type](value);\n }\n\n value = +value;\n exp = +exp;\n\n // If the value is not a number or the exp is not an integer...\n if (value === null || isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0)) {\n return NaN;\n }\n\n // Shift\n value = value.toString().split('e');\n value = Math[type](+(value[0] + 'e' + (value[1] ? (+value[1] - exp) : -exp)));\n\n // Shift back\n value = value.toString().split('e');\n return +(value[0] + 'e' + (value[1] ? (+value[1] + exp) : exp));\n}","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass MetricsList {\n constructor() {\n this.TcpList = [];\n this.HttpList = [];\n this.RepSwitchList = [];\n this.BufferLevel = [];\n this.BufferState = [];\n this.PlayList = [];\n this.DroppedFrames = [];\n this.SchedulingInfo = [];\n this.DVRInfo = [];\n this.ManifestUpdate = [];\n this.RequestsQueue = null;\n this.DVBErrors = [];\n }\n}\n\nexport default MetricsList;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass RepresentationSwitch {\n /**\n * @description This Object holds reference to the info at quality switch between two representations.\n */\n constructor() {\n\n /**\n * Time of the switch event.\n * @public\n */\n this.t = null;\n /**\n * The media presentation time of the earliest access unit\n * (out of all media content components) played out from\n * the Representation.\n *\n * @public\n */\n this.mt = null;\n /**\n * Value of Representation@id identifying the switch-to Representation.\n * @public\n */\n this.to = null;\n /**\n * If not present, this metrics concerns the Representation as a whole.\n * If present, lto indicates the value of SubRepresentation@level within\n * Representation identifying the switch-to level of the Representation.\n *\n * @public\n */\n this.lto = null;\n\n }\n}\n\nexport default RepresentationSwitch;","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n * @class\n * @ignore\n */\nclass BufferLevel {\n /**\n * @description This Object holds reference to the current buffer level and the time it was recorded.\n */\n constructor() {\n /**\n * Real-Time | Time of the measurement of the buffer level.\n * @public\n */\n this.t = null;\n /**\n * Level of the buffer in milliseconds. Indicates the playout duration for which\n * media data of all active media components is available starting from the\n * current playout time.\n * @public\n */\n this.level = null;\n }\n}\n\nexport default BufferLevel;","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport MetricsConstants from '../../constants/MetricsConstants';\n\n/**\n * @class\n * @ignore\n */\nclass BufferState {\n /**\n * @description This Object holds reference to the current buffer state of the video element.\n */\n constructor() {\n /**\n * The Buffer Level Target determined by the BufferLevelRule.\n * @public\n */\n this.target = null;\n /**\n * Current buffer state. Will be MetricsConstants.BUFFER_EMPTY or MetricsConstants.BUFFER_LOADED.\n * @public\n */\n this.state = MetricsConstants.BUFFER_EMPTY;\n }\n}\n\nexport default BufferState;","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n * @class\n * @ignore\n */\nclass DVRInfo {\n /**\n * @description This Object holds reference to DVR availability window information.\n */\n constructor() {\n\n /**\n * The current time of the video element when this was created.\n * @public\n */\n this.time = null;\n /**\n * The current Segment Availability Range as an object with start and end properties.\n * It's delta defined by the timeShiftBufferDepth MPD attribute.\n * @public\n */\n this.range = null;\n /**\n * Reference to the internal ManifestInfo.js VO.\n * @public\n */\n this.manifestInfo = null;\n }\n}\n\nexport default DVRInfo;","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass DroppedFrames {\n /**\n * @description This Object holds reference to DroppedFrames count and the time it was recorded.\n */\n constructor()\n {\n /**\n * Real-Time | Time of the measurement of the dropped frames.\n * @public\n */\n this.time = null;\n /**\n * Number of dropped frames\n * @public\n */\n this.droppedFrames = null;\n }\n}\n\nexport default DroppedFrames;","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @classdesc This Object holds reference to the manifest update information.\n * @ignore\n */\nclass ManifestUpdate {\n /**\n * @class\n */\n constructor() {\n\n /**\n * Media Type Video | Audio | FragmentedText\n * @public\n */\n this.mediaType = null;\n /**\n * MPD Type static | dynamic\n * @public\n */\n this.type = null;\n /**\n * When this manifest update was requested\n * @public\n */\n this.requestTime = null;\n /**\n * When this manifest update was received\n * @public\n */\n this.fetchTime = null;\n /**\n * Calculated Availability Start time of the stream.\n * @public\n */\n this.availabilityStartTime = null;\n /**\n * the seek point (liveEdge for dynamic, Stream[0].startTime for static)\n * @public\n */\n this.presentationStartTime = 0;\n /**\n * The calculated difference between the server and client wall clock time\n * @public\n */\n this.clientTimeOffset = 0;\n /**\n * Actual element.currentTime\n * @public\n */\n this.currentTime = null;\n /**\n * Actual element.ranges\n * @public\n */\n this.buffered = null;\n /**\n * Static is fixed value of zero. dynamic should be ((Now-@availabilityStartTime) - elementCurrentTime)\n * @public\n */\n this.latency = 0;\n /**\n * Array holding list of StreamInfo VO Objects\n * @public\n */\n this.streamInfo = [];\n /**\n * Array holding list of RepresentationInfo VO Objects\n * @public\n */\n this.representationInfo = [];\n\n }\n}\n\n/**\n * @classdesc This Object holds reference to the current period's stream information when the manifest was updated.\n * @ignore\n */\nclass ManifestUpdateStreamInfo {\n /**\n * @class\n */\n constructor() {\n /**\n * Stream@id\n * @public\n */\n this.id = null;\n /**\n * Period Index\n * @public\n */\n this.index = null;\n /**\n * Stream@start\n * @public\n */\n this.start = null;\n /**\n * Stream@duration\n * @public\n */\n this.duration = null;\n }\n}\n\n/**\n * @classdesc This Object holds reference to the current representation's info when the manifest was updated.\n * @ignore\n */\nclass ManifestUpdateRepresentationInfo {\n /**\n * @class\n */\n constructor() {\n /**\n * Track@id\n * @public\n */\n this.id = null;\n /**\n * Representation Index\n * @public\n */\n this.index = null;\n /**\n * Media Type Video | Audio | FragmentedText\n * @public\n */\n this.mediaType = null;\n /**\n * Which representation\n * @public\n */\n this.streamIndex = null;\n /**\n * Holds reference to @presentationTimeOffset\n * @public\n */\n this.presentationTimeOffset = null;\n /**\n * Holds reference to @startNumber\n * @public\n */\n this.startNumber = null;\n /**\n * list|template|timeline\n * @public\n */\n this.fragmentInfoType = null;\n }\n}\n\nexport { ManifestUpdate, ManifestUpdateStreamInfo, ManifestUpdateRepresentationInfo };\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass SchedulingInfo {\n /**\n * @description This Object holds reference to the index handling of the current fragment being loaded or executed.\n */\n constructor() {\n\n /**\n * Type of stream Audio | Video | FragmentedText\n * @public\n */\n this.mediaType = null;\n /**\n * Time of the scheduling event.\n * @public\n */\n this.t = null;\n\n /**\n * Type of fragment (initialization | media)\n * @public\n */\n this.type = null;\n /**\n * Presentation start time of fragment\n * @public\n */\n this.startTime = null;\n /**\n * Availability start time of fragment\n * @public\n */\n this.availabilityStartTime = null;\n /**\n * Duration of fragment\n * @public\n */\n this.duration = null;\n /**\n * Bit Rate Quality of fragment\n * @public\n */\n this.quality = null;\n /**\n * Range of fragment\n * @public\n */\n this.range = null;\n\n /**\n * Current state of fragment\n * @public\n */\n this.state = null;\n }\n}\n\nexport default SchedulingInfo;","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass RequestsQueue {\n /**\n * @description This Object holds reference to Fragment Model's request queues\n */\n constructor() {\n\n /**\n * Array of all of the requests that have begun to load\n * This request may not make it into the executed queue if it is abandon due to ABR rules for example.\n * @public\n */\n this.loadingRequests = [];\n /**\n * Array of the The requests that have completed\n * @public\n */\n this.executedRequests = [];\n }\n}\n\nexport default RequestsQueue;","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport Constants from '../constants/Constants';\nimport MetricsConstants from '../constants/MetricsConstants';\nimport MetricsList from '../vo/MetricsList';\nimport {HTTPRequest, HTTPRequestTrace} from '../vo/metrics/HTTPRequest';\nimport TrackSwitch from '../vo/metrics/RepresentationSwitch';\nimport BufferLevel from '../vo/metrics/BufferLevel';\nimport BufferState from '../vo/metrics/BufferState';\nimport DVRInfo from '../vo/metrics/DVRInfo';\nimport DroppedFrames from '../vo/metrics/DroppedFrames';\nimport {ManifestUpdate, ManifestUpdateStreamInfo, ManifestUpdateRepresentationInfo} from '../vo/metrics/ManifestUpdate';\nimport SchedulingInfo from '../vo/metrics/SchedulingInfo';\nimport EventBus from '../../core/EventBus';\nimport RequestsQueue from '../vo/metrics/RequestsQueue';\nimport Events from '../../core/events/Events';\nimport FactoryMaker from '../../core/FactoryMaker';\n\nfunction MetricsModel(config) {\n\n config = config || {};\n\n const settings = config.settings;\n\n let context = this.context;\n let eventBus = EventBus(context).getInstance();\n\n let instance,\n streamMetrics;\n\n function setup() {\n streamMetrics = {};\n }\n\n function metricsChanged() {\n eventBus.trigger(Events.METRICS_CHANGED);\n }\n\n function metricChanged(mediaType) {\n eventBus.trigger(Events.METRIC_CHANGED, { mediaType: mediaType });\n metricsChanged();\n }\n\n function metricUpdated(mediaType, metricType, vo) {\n eventBus.trigger(Events.METRIC_UPDATED, { mediaType: mediaType, metric: metricType, value: vo });\n metricChanged(mediaType);\n }\n\n function metricAdded(mediaType, metricType, vo) {\n eventBus.trigger(Events.METRIC_ADDED, { mediaType: mediaType, metric: metricType, value: vo });\n metricChanged(mediaType);\n }\n\n function clearCurrentMetricsForType(type) {\n delete streamMetrics[type];\n metricChanged(type);\n }\n\n function clearAllCurrentMetrics() {\n streamMetrics = {};\n metricsChanged();\n }\n\n function getMetricsFor(type, readOnly) {\n let metrics = null;\n\n if (!type) {\n return metrics;\n }\n\n if (streamMetrics.hasOwnProperty(type)) {\n metrics = streamMetrics[type];\n } else if (!readOnly) {\n metrics = new MetricsList();\n streamMetrics[type] = metrics;\n }\n\n return metrics;\n }\n\n function pushMetrics(type, list, value) {\n let metrics = getMetricsFor(type);\n if (metrics !== null) {\n metrics[list].push(value);\n if (metrics[list].length > settings.get().streaming.metrics.maxListDepth) {\n metrics[list].shift();\n }\n }\n }\n\n function appendHttpTrace(httpRequest, s, d, b) {\n let vo = new HTTPRequestTrace();\n\n vo.s = s;\n vo.d = d;\n vo.b = b;\n\n httpRequest.trace.push(vo);\n\n if (!httpRequest.interval) {\n httpRequest.interval = 0;\n }\n\n httpRequest.interval += d;\n\n return vo;\n }\n\n function addHttpRequest(mediaType, tcpid, type, url, quality, actualurl, serviceLocation, range, trequest, tresponse, tfinish, responsecode, mediaduration, responseHeaders, traces, fileLoaderType, cmsd) {\n let vo = new HTTPRequest();\n\n // ISO 23009-1 D.4.3 NOTE 2:\n // All entries for a given object will have the same URL and range\n // and so can easily be correlated. If there were redirects or\n // failures there will be one entry for each redirect/failure.\n // The redirect-to URL or alternative url (where multiple have been\n // provided in the MPD) will appear as the actualurl of the next\n // entry with the same url value.\n if (actualurl !== null && actualurl !== undefined && (actualurl !== url)) {\n\n // given the above, add an entry for the original request\n addHttpRequest(\n mediaType,\n null,\n type,\n url,\n quality,\n null,\n null,\n range,\n trequest,\n null, // unknown\n null, // unknown\n null, // unknown, probably a 302\n mediaduration,\n null,\n null,\n fileLoaderType,\n cmsd\n );\n\n vo.actualurl = actualurl;\n }\n\n vo.tcpid = tcpid;\n vo.type = type;\n vo.url = url;\n vo.range = range;\n vo.trequest = trequest;\n vo.tresponse = tresponse;\n vo.responsecode = responsecode;\n vo.cmsd = cmsd;\n\n vo._tfinish = tfinish;\n vo._stream = mediaType;\n vo._mediaduration = mediaduration;\n vo._quality = quality;\n vo._responseHeaders = responseHeaders;\n vo._serviceLocation = serviceLocation;\n vo._fileLoaderType = fileLoaderType;\n\n if (traces) {\n traces.forEach(trace => {\n appendHttpTrace(vo, trace.s, trace.d, trace.b);\n });\n } else {\n // The interval and trace shall be absent for redirect and failure records.\n delete vo.interval;\n delete vo.trace;\n }\n\n pushAndNotify(mediaType, MetricsConstants.HTTP_REQUEST, vo);\n }\n\n function addRepresentationSwitch(mediaType, t, mt, to, lto) {\n let vo = new TrackSwitch();\n\n vo.t = t;\n vo.mt = mt;\n vo.to = to;\n\n if (lto) {\n vo.lto = lto;\n } else {\n delete vo.lto;\n }\n\n pushAndNotify(mediaType, MetricsConstants.TRACK_SWITCH, vo);\n }\n\n function pushAndNotify(mediaType, metricType, metricObject) {\n pushMetrics(mediaType, metricType, metricObject);\n metricAdded(mediaType, metricType, metricObject);\n }\n\n function addBufferLevel(mediaType, t, level) {\n let vo = new BufferLevel();\n vo.t = t;\n vo.level = level;\n\n pushAndNotify(mediaType, MetricsConstants.BUFFER_LEVEL, vo);\n }\n\n function addBufferState(mediaType, state, target) {\n let vo = new BufferState();\n vo.target = target;\n vo.state = state;\n\n pushAndNotify(mediaType, MetricsConstants.BUFFER_STATE, vo);\n }\n\n function addDVRInfo(mediaType, currentTime, mpd, range) {\n let vo = new DVRInfo();\n vo.time = currentTime;\n vo.range = range;\n vo.manifestInfo = mpd;\n\n pushAndNotify(mediaType, MetricsConstants.DVR_INFO, vo);\n }\n\n function addDroppedFrames(mediaType, quality) {\n let vo = new DroppedFrames();\n let list = getMetricsFor(mediaType).DroppedFrames;\n\n if (!quality) {\n return;\n }\n\n vo.time = quality.creationTime;\n vo.droppedFrames = quality.droppedVideoFrames;\n\n if (list.length > 0 && list[list.length - 1] == vo) {\n return;\n }\n\n pushAndNotify(mediaType, MetricsConstants.DROPPED_FRAMES, vo);\n }\n\n function addSchedulingInfo(mediaType, t, type, startTime, availabilityStartTime, duration, quality, range, state) {\n let vo = new SchedulingInfo();\n\n vo.mediaType = mediaType;\n vo.t = t;\n\n vo.type = type;\n vo.startTime = startTime;\n vo.availabilityStartTime = availabilityStartTime;\n vo.duration = duration;\n vo.quality = quality;\n vo.range = range;\n\n vo.state = state;\n\n pushAndNotify(mediaType, MetricsConstants.SCHEDULING_INFO, vo);\n }\n\n function addRequestsQueue(mediaType, loadingRequests, executedRequests) {\n let vo = new RequestsQueue();\n\n vo.loadingRequests = loadingRequests;\n vo.executedRequests = executedRequests;\n\n getMetricsFor(mediaType).RequestsQueue = vo;\n metricAdded(mediaType, MetricsConstants.REQUESTS_QUEUE, vo);\n }\n\n function addManifestUpdate(mediaType, type, requestTime, fetchTime, availabilityStartTime, presentationStartTime, clientTimeOffset, currentTime, buffered, latency) {\n let vo = new ManifestUpdate();\n\n vo.mediaType = mediaType;\n vo.type = type;\n vo.requestTime = requestTime; // when this manifest update was requested\n vo.fetchTime = fetchTime; // when this manifest update was received\n vo.availabilityStartTime = availabilityStartTime;\n vo.presentationStartTime = presentationStartTime; // the seek point (liveEdge for dynamic, Stream[0].startTime for static)\n vo.clientTimeOffset = clientTimeOffset; // the calculated difference between the server and client wall clock time\n vo.currentTime = currentTime; // actual element.currentTime\n vo.buffered = buffered; // actual element.ranges\n vo.latency = latency; // (static is fixed value of zero. dynamic should be ((Now-@availabilityStartTime) - currentTime)\n\n pushMetrics(Constants.STREAM, MetricsConstants.MANIFEST_UPDATE, vo);\n metricAdded(mediaType, MetricsConstants.MANIFEST_UPDATE, vo);\n }\n\n function updateManifestUpdateInfo(manifestUpdate, updatedFields) {\n if (manifestUpdate) {\n for (let field in updatedFields) {\n manifestUpdate[field] = updatedFields[field];\n }\n\n metricUpdated(manifestUpdate.mediaType, MetricsConstants.MANIFEST_UPDATE, manifestUpdate);\n }\n }\n\n function addManifestUpdateStreamInfo(manifestUpdate, id, index, start, duration) {\n if (manifestUpdate) {\n let vo = new ManifestUpdateStreamInfo();\n\n vo.id = id;\n vo.index = index;\n vo.start = start;\n vo.duration = duration;\n\n manifestUpdate.streamInfo.push(vo);\n metricUpdated(manifestUpdate.mediaType, MetricsConstants.MANIFEST_UPDATE_STREAM_INFO, manifestUpdate);\n }\n }\n\n function addManifestUpdateRepresentationInfo(manifestUpdate, id, index, streamIndex, mediaType, presentationTimeOffset, startNumber, fragmentInfoType) {\n if (manifestUpdate && manifestUpdate.representationInfo) {\n\n const vo = new ManifestUpdateRepresentationInfo();\n vo.id = id;\n vo.index = index;\n vo.streamIndex = streamIndex;\n vo.mediaType = mediaType;\n vo.startNumber = startNumber;\n vo.fragmentInfoType = fragmentInfoType;\n vo.presentationTimeOffset = presentationTimeOffset;\n\n manifestUpdate.representationInfo.push(vo);\n metricUpdated(manifestUpdate.mediaType, MetricsConstants.MANIFEST_UPDATE_TRACK_INFO, manifestUpdate);\n }\n }\n\n function addPlayList(vo) {\n if (vo.trace && Array.isArray(vo.trace)) {\n vo.trace.forEach(trace => {\n if (trace.hasOwnProperty('subreplevel') && !trace.subreplevel) {\n delete trace.subreplevel;\n }\n });\n } else {\n delete vo.trace;\n }\n\n pushAndNotify(Constants.STREAM, MetricsConstants.PLAY_LIST, vo);\n }\n\n function addDVBErrors(vo) {\n pushAndNotify(Constants.STREAM, MetricsConstants.DVB_ERRORS, vo);\n }\n\n instance = {\n clearCurrentMetricsForType: clearCurrentMetricsForType,\n clearAllCurrentMetrics: clearAllCurrentMetrics,\n getMetricsFor: getMetricsFor,\n addHttpRequest: addHttpRequest,\n addRepresentationSwitch: addRepresentationSwitch,\n addBufferLevel: addBufferLevel,\n addBufferState: addBufferState,\n addDVRInfo: addDVRInfo,\n addDroppedFrames: addDroppedFrames,\n addSchedulingInfo: addSchedulingInfo,\n addRequestsQueue: addRequestsQueue,\n addManifestUpdate: addManifestUpdate,\n updateManifestUpdateInfo: updateManifestUpdateInfo,\n addManifestUpdateStreamInfo: addManifestUpdateStreamInfo,\n addManifestUpdateRepresentationInfo: addManifestUpdateRepresentationInfo,\n addPlayList: addPlayList,\n addDVBErrors: addDVBErrors\n };\n\n setup();\n return instance;\n}\n\nMetricsModel.__dashjs_factory_name = 'MetricsModel';\nexport default FactoryMaker.getSingletonFactory(MetricsModel);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport Constants from '../streaming/constants/Constants';\nimport { HTTPRequest } from '../streaming/vo/metrics/HTTPRequest';\nimport FactoryMaker from '../core/FactoryMaker';\nimport MetricsConstants from '../streaming/constants/MetricsConstants';\nimport Round10 from './utils/Round10';\nimport MetricsModel from '../streaming/models/MetricsModel';\nimport Utils from '../core/Utils';\nimport {\n PlayList,\n PlayListTrace\n} from '../streaming/vo/metrics/PlayList';\n\n/**\n * @module DashMetrics\n * @description The DashMetrics module can be accessed using the MediaPlayer API getDashMetrics()\n * @param {object} config\n */\n\nfunction DashMetrics(config) {\n\n config = config || {};\n\n const context = this.context;\n let instance,\n playListTraceMetricsClosed,\n playListTraceMetrics,\n playListMetrics;\n\n let metricsModel = config.metricsModel;\n\n function setup() {\n metricsModel = metricsModel || MetricsModel(context).getInstance({settings: config.settings});\n resetInitialSettings();\n }\n\n function resetInitialSettings() {\n playListTraceMetricsClosed = true;\n playListTraceMetrics = null;\n playListMetrics = null;\n }\n\n /**\n * Returns the latest Representation switch for a given media type\n * @param {MediaType} mediaType\n * @returns {*}\n * @memberof module:DashMetrics\n * @instance\n */\n function getCurrentRepresentationSwitch(mediaType) {\n const metrics = metricsModel.getMetricsFor(mediaType, true);\n return getCurrent(metrics, MetricsConstants.TRACK_SWITCH);\n }\n\n /**\n * @param {MediaType} mediaType\n * @param {Date} t time of the switch event\n * @param {Date} mt media presentation time\n * @param {string} to id of representation\n * @param {string} lto if present, subrepresentation reference\n * @memberof module:DashMetrics\n * @instance\n * @ignore\n */\n function addRepresentationSwitch(mediaType, t, mt, to, lto) {\n metricsModel.addRepresentationSwitch(mediaType, t, mt, to, lto);\n }\n\n /**\n * Returns the current buffer state for a given media type\n * @param {MediaType} mediaType\n * @returns {number}\n * @memberof module:DashMetrics\n * @instance\n */\n function getCurrentBufferState(mediaType) {\n const metrics = metricsModel.getMetricsFor(mediaType, true);\n return getCurrent(metrics, MetricsConstants.BUFFER_STATE);\n }\n\n /**\n * Returns the current buffer level for a given media type\n * @param {MediaType} mediaType\n * @returns {number}\n * @memberof module:DashMetrics\n * @instance\n */\n function getCurrentBufferLevel(mediaType) {\n const metrics = metricsModel.getMetricsFor(mediaType, true);\n const metric = getCurrent(metrics, MetricsConstants.BUFFER_LEVEL);\n\n if (metric) {\n return Round10.round10(metric.level / 1000, -3);\n }\n\n return 0;\n }\n\n /**\n * @param {MediaType} mediaType\n * @param {number} t\n * @param {number} level\n * @memberof module:DashMetrics\n * @instance\n * @ignore\n */\n function addBufferLevel(mediaType, t, level) {\n metricsModel.addBufferLevel(mediaType, t, level);\n }\n\n /**\n * @param {MediaType} mediaType\n * @param {string} state\n * @param {number} target\n * @memberof module:DashMetrics\n * @instance\n * @ignore\n */\n function addBufferState(mediaType, state, target) {\n metricsModel.addBufferState(mediaType, state, target);\n }\n\n /**\n * @memberof module:DashMetrics\n * @instance\n * @ignore\n */\n function clearAllCurrentMetrics () {\n metricsModel.clearAllCurrentMetrics();\n }\n\n /**\n * Returns the latest HTTP request for a given media type\n * @param {MediaType} mediaType\n * @returns {*}\n * @memberof module:DashMetrics\n * @instance\n */\n function getCurrentHttpRequest(mediaType) {\n const metrics = metricsModel.getMetricsFor(mediaType, true);\n\n if (!metrics) {\n return null;\n }\n\n const httpList = metrics.HttpList;\n let currentHttpList = null;\n\n let httpListLastIndex;\n\n if (!httpList || httpList.length <= 0) {\n return null;\n }\n\n httpListLastIndex = httpList.length - 1;\n\n while (httpListLastIndex >= 0) {\n if (httpList[httpListLastIndex].responsecode) {\n currentHttpList = httpList[httpListLastIndex];\n break;\n }\n httpListLastIndex--;\n }\n return currentHttpList;\n }\n\n /**\n * Returns all HTTP requests for a given media type\n * @param {MediaType} mediaType\n * @returns {*}\n * @memberof module:DashMetrics\n * @instance\n */\n function getHttpRequests(mediaType) {\n const metrics = metricsModel.getMetricsFor(mediaType, true);\n if (!metrics) {\n return [];\n }\n\n return !!metrics.HttpList ? metrics.HttpList : [];\n }\n\n /**\n * @param {MediaType} mediaType\n * @param {Array} loadingRequests\n * @param {Array} executedRequests\n * @memberof module:DashMetrics\n * @instance\n * @ignore\n */\n function addRequestsQueue(mediaType, loadingRequests, executedRequests) {\n metricsModel.addRequestsQueue(mediaType, loadingRequests, executedRequests);\n }\n\n /**\n * Returns the latest metrics for a given metric list and specific metric name\n * @param {MetricsList} metrics\n * @param {string} metricName\n * @returns {*}\n * @memberof module:DashMetrics\n * @instance\n */\n function getCurrent(metrics, metricName) {\n if (!metrics) {\n return null;\n }\n const list = metrics[metricName];\n return (!list || list.length === 0) ? null : list[list.length - 1];\n }\n\n /**\n * Returns the number of dropped frames\n * @returns {*}\n * @memberof module:DashMetrics\n * @instance\n */\n function getCurrentDroppedFrames() {\n const metrics = metricsModel.getMetricsFor(Constants.VIDEO, true);\n return getCurrent(metrics, MetricsConstants.DROPPED_FRAMES);\n }\n\n /**\n * @param {number} quality\n * @memberof module:DashMetrics\n * @instance\n * @ignore\n */\n function addDroppedFrames(quality) {\n metricsModel.addDroppedFrames(Constants.VIDEO, quality);\n }\n\n /**\n * Returns the current scheduling info for a given media type\n * @param {MediaType} mediaType\n * @returns {*}\n * @memberof module:DashMetrics\n * @instance\n */\n function getCurrentSchedulingInfo(mediaType) {\n const metrics = metricsModel.getMetricsFor(mediaType, true);\n return getCurrent(metrics, MetricsConstants.SCHEDULING_INFO);\n }\n\n /**\n * @param {object} request\n * @param {string} state\n * @memberof module:DashMetrics\n * @instance\n * @ignore\n */\n function addSchedulingInfo(request, state) {\n metricsModel.addSchedulingInfo(\n request.mediaType,\n new Date(),\n request.type,\n request.startTime,\n request.availabilityStartTime,\n request.duration,\n request.quality,\n request.range,\n state);\n }\n\n /**\n * Returns the current manifest update information\n * @returns {*}\n * @memberof module:DashMetrics\n * @instance\n */\n function getCurrentManifestUpdate() {\n const streamMetrics = metricsModel.getMetricsFor(Constants.STREAM);\n return getCurrent(streamMetrics, MetricsConstants.MANIFEST_UPDATE);\n }\n\n /**\n * @param {object} updatedFields fields to be updated\n * @memberof module:DashMetrics\n * @instance\n * @ignore\n */\n function updateManifestUpdateInfo(updatedFields) {\n const manifestUpdate = this.getCurrentManifestUpdate();\n metricsModel.updateManifestUpdateInfo(manifestUpdate, updatedFields);\n }\n\n /**\n * @param {object} streamInfo\n * @memberof module:DashMetrics\n * @instance\n * @ignore\n */\n function addManifestUpdateStreamInfo(streamInfo) {\n if (streamInfo) {\n const manifestUpdate = this.getCurrentManifestUpdate();\n metricsModel.addManifestUpdateStreamInfo(manifestUpdate, streamInfo.id, streamInfo.index, streamInfo.start, streamInfo.duration);\n }\n }\n\n /**\n * @param {object} request\n * @memberof module:DashMetrics\n * @instance\n * @ignore\n */\n function addManifestUpdate(request) {\n metricsModel.addManifestUpdate(Constants.STREAM, request.type, request.requestStartDate, request.requestEndDate);\n }\n\n /**\n * @param {object} request\n * @param {string} responseURL\n * @param {number} responseStatus\n * @param {object} responseHeaders\n * @param {object} traces\n * @memberof module:DashMetrics\n * @instance\n * @ignore\n */\n function addHttpRequest(request, responseURL, responseStatus, responseHeaders, traces, cmsd) {\n metricsModel.addHttpRequest(request.mediaType,\n null,\n request.type,\n request.url,\n request.quality,\n responseURL,\n request.serviceLocation || null,\n request.range || null,\n request.requestStartDate,\n request.firstByteDate,\n request.requestEndDate,\n responseStatus,\n request.duration,\n responseHeaders,\n traces,\n request.fileLoaderType,\n cmsd);\n }\n\n /**\n * @param {object} representation\n * @param {MediaType} mediaType\n * @memberof module:DashMetrics\n * @instance\n * @ignore\n */\n function addManifestUpdateRepresentationInfo(representation, mediaType) {\n if (representation) {\n const manifestUpdateInfo = this.getCurrentManifestUpdate();\n metricsModel.addManifestUpdateRepresentationInfo(manifestUpdateInfo, representation.id, representation.index, representation.streamIndex, mediaType, representation.presentationTimeOffset, representation.startNumber, representation.fragmentInfoType);\n }\n }\n\n /**\n * Returns the current DVR window\n * @param {MediaType} mediaType\n * @returns {*}\n * @memberof module:DashMetrics\n * @instance\n */\n function getCurrentDVRInfo(mediaType) {\n const metrics = mediaType ? metricsModel.getMetricsFor(mediaType, true) :\n metricsModel.getMetricsFor(Constants.VIDEO, true) || metricsModel.getMetricsFor(Constants.AUDIO, true);\n return getCurrent(metrics, MetricsConstants.DVR_INFO);\n }\n\n /**\n * @param {MediaType} mediaType\n * @param {Date} currentTime time of the switch event\n * @param {object} mpd mpd reference\n * @param {object} range range of the dvr info\n * @memberof module:DashMetrics\n * @instance\n * @ignore\n */\n function addDVRInfo(mediaType, currentTime, mpd, range) {\n metricsModel.addDVRInfo(mediaType, currentTime, mpd, range);\n }\n\n /**\n * Returns the value for a specific request headers used in the latest MPD request\n * @param {string} id\n * @returns {*}\n * @memberof module:DashMetrics\n * @instance\n */\n function getLatestMPDRequestHeaderValueByID(id) {\n if (!id) {\n return null;\n }\n\n let headers = {};\n let httpRequestList,\n httpRequest,\n i;\n\n httpRequestList = getHttpRequests(Constants.STREAM);\n\n for (i = httpRequestList.length - 1; i >= 0; i--) {\n httpRequest = httpRequestList[i];\n\n if (httpRequest.type === HTTPRequest.MPD_TYPE) {\n headers = Utils.parseHttpHeaders(httpRequest._responseHeaders);\n break;\n }\n }\n\n const value = headers[id.toLowerCase()];\n return value === undefined ? null : value;\n }\n\n /**\n * Returns the value for a specific request headers used in the latest fragment request\n * @param {MediaType} mediaType\n * @param {string} id\n * @returns {*}\n * @memberof module:DashMetrics\n * @instance\n */\n function getLatestFragmentRequestHeaderValueByID(mediaType, id) {\n if (!id) {\n return null;\n }\n\n let headers = {};\n let httpRequest = getCurrentHttpRequest(mediaType);\n if (httpRequest) {\n headers = Utils.parseHttpHeaders(httpRequest._responseHeaders);\n }\n\n const value = headers[id.toLowerCase()];\n return value === undefined ? null : value;\n }\n\n /**\n * @memberof module:DashMetrics\n * @instance\n * @ignore\n */\n function addPlayList() {\n if (playListMetrics) {\n metricsModel.addPlayList(playListMetrics);\n playListMetrics = null;\n }\n }\n\n /**\n * Create a new playlist metric\n * @param {number} mediaStartTime\n * @param {string} startReason\n * @ignore\n */\n function createPlaylistMetrics(mediaStartTime, startReason) {\n playListMetrics = new PlayList();\n\n playListMetrics.start = new Date();\n playListMetrics.mstart = mediaStartTime;\n playListMetrics.starttype = startReason;\n }\n\n /**\n * Create a playlist trace metric\n * @param {number} representationId\n * @param {number} mediaStartTime\n * @param {number} speed\n * @ignore\n */\n function createPlaylistTraceMetrics(representationId, mediaStartTime, speed) {\n if (playListTraceMetricsClosed === true ) {\n playListTraceMetricsClosed = false;\n playListTraceMetrics = new PlayListTrace();\n\n playListTraceMetrics.representationid = representationId;\n playListTraceMetrics.start = new Date();\n playListTraceMetrics.mstart = mediaStartTime;\n playListTraceMetrics.playbackspeed = speed !== null ? speed.toString() : null;\n }\n }\n\n /**\n * Update existing playlist trace metric\n * @param {object} traceToUpdate\n * @ignore\n */\n function updatePlayListTraceMetrics(traceToUpdate) {\n if (playListTraceMetrics) {\n for (let field in playListTraceMetrics) {\n playListTraceMetrics[field] = traceToUpdate[field];\n }\n }\n }\n\n /**\n * Push a new playlist trace metric\n * @param endTime\n * @param reason\n * @ignore\n */\n function pushPlayListTraceMetrics(endTime, reason) {\n if (playListTraceMetricsClosed === false && playListMetrics && playListTraceMetrics && playListTraceMetrics.start) {\n const startTime = playListTraceMetrics.start;\n const duration = endTime.getTime() - startTime.getTime();\n playListTraceMetrics.duration = duration;\n playListTraceMetrics.stopreason = reason;\n playListMetrics.trace.push(playListTraceMetrics);\n playListTraceMetricsClosed = true;\n }\n }\n\n /**\n * @param {object} errors\n * @memberof module:DashMetrics\n * @instance\n * @ignore\n */\n function addDVBErrors(errors) {\n metricsModel.addDVBErrors(errors);\n }\n\n instance = {\n getCurrentRepresentationSwitch,\n getCurrentBufferState,\n getCurrentBufferLevel,\n getCurrentHttpRequest,\n getHttpRequests,\n getCurrentDroppedFrames,\n getCurrentSchedulingInfo,\n getCurrentDVRInfo,\n getCurrentManifestUpdate,\n getLatestFragmentRequestHeaderValueByID,\n getLatestMPDRequestHeaderValueByID,\n addRepresentationSwitch,\n addDVRInfo,\n updateManifestUpdateInfo,\n addManifestUpdateStreamInfo,\n addManifestUpdateRepresentationInfo,\n addManifestUpdate,\n addHttpRequest,\n addSchedulingInfo,\n addRequestsQueue,\n addBufferLevel,\n addBufferState,\n addDroppedFrames,\n addPlayList,\n addDVBErrors,\n createPlaylistMetrics,\n createPlaylistTraceMetrics,\n updatePlayListTraceMetrics,\n pushPlayListTraceMetrics,\n clearAllCurrentMetrics\n };\n\n setup();\n\n return instance;\n}\n\nDashMetrics.__dashjs_factory_name = 'DashMetrics';\nexport default FactoryMaker.getSingletonFactory(DashMetrics);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport EventBus from '../../core/EventBus';\nimport Events from '../../core/events/Events';\nimport FactoryMaker from '../../core/FactoryMaker';\nimport DashConstants from '../constants/DashConstants';\nimport DashManifestModel from '../models/DashManifestModel';\nimport Settings from '../../core/Settings';\nimport Constants from '../../streaming/constants/Constants';\nimport MediaPlayerEvents from '../../streaming/MediaPlayerEvents';\nimport ConformanceViolationConstants from '../../streaming/constants/ConformanceViolationConstants';\n\nfunction TimelineConverter() {\n\n const context = this.context;\n const eventBus = EventBus(context).getInstance();\n const settings = Settings(context).getInstance();\n\n let instance,\n dashManifestModel,\n timelineAnchorAvailabilityOffset, // In case we calculate the TSBD using _calcTimeShiftBufferWindowForDynamicTimelineManifest we use the segments as anchor times. We apply this offset when calculating if a segment is available or not.\n clientServerTimeShift;\n\n function setup() {\n dashManifestModel = DashManifestModel(context).getInstance();\n reset();\n }\n\n function initialize() {\n resetInitialSettings();\n eventBus.on(Events.UPDATE_TIME_SYNC_OFFSET, _onUpdateTimeSyncOffset, this);\n }\n\n function getClientTimeOffset() {\n return clientServerTimeShift;\n }\n\n function setClientTimeOffset(value) {\n clientServerTimeShift = value;\n }\n\n /**\n * Returns a \"now\" reference time for the client to compare the availability time of a segment against.\n * Takes the client/server drift into account\n */\n function getClientReferenceTime() {\n return Date.now() - (timelineAnchorAvailabilityOffset * 1000) + (clientServerTimeShift * 1000);\n }\n\n function _calcAvailabilityTimeFromPresentationTime(presentationEndTime, representation, isDynamic, calculateAvailabilityEndTime) {\n let availabilityTime;\n let mpd = representation.adaptation.period.mpd;\n const availabilityStartTime = mpd.availabilityStartTime;\n\n if (calculateAvailabilityEndTime) {\n //@timeShiftBufferDepth specifies the duration of the time shifting buffer that is guaranteed\n // to be available for a Media Presentation with type 'dynamic'.\n // When not present, the value is infinite.\n if (isDynamic && mpd.timeShiftBufferDepth !== Number.POSITIVE_INFINITY) {\n // SAET = SAST + TSBD + seg@duration\n availabilityTime = new Date(availabilityStartTime.getTime() + ((presentationEndTime + mpd.timeShiftBufferDepth) * 1000));\n } else {\n availabilityTime = mpd.availabilityEndTime;\n }\n } else {\n if (isDynamic) {\n // SAST = Period@start + seg@presentationStartTime + seg@duration\n // ASAST = SAST - ATO\n const availabilityTimeOffset = representation.availabilityTimeOffset;\n // presentationEndTime = Period@start + seg@presentationStartTime + Segment@duration\n availabilityTime = new Date(availabilityStartTime.getTime() + (presentationEndTime - availabilityTimeOffset) * 1000);\n } else {\n // in static mpd, all segments are available at the same time\n availabilityTime = availabilityStartTime;\n }\n }\n\n return availabilityTime;\n }\n\n function calcAvailabilityStartTimeFromPresentationTime(presentationEndTime, representation, isDynamic) {\n return _calcAvailabilityTimeFromPresentationTime(presentationEndTime, representation, isDynamic);\n }\n\n function calcAvailabilityEndTimeFromPresentationTime(presentationEndTime, representation, isDynamic) {\n return _calcAvailabilityTimeFromPresentationTime(presentationEndTime, representation, isDynamic, true);\n }\n\n function calcPresentationTimeFromWallTime(wallTime, period) {\n return ((wallTime.getTime() - period.mpd.availabilityStartTime.getTime() + clientServerTimeShift * 1000) / 1000);\n }\n\n function calcPresentationTimeFromMediaTime(mediaTime, representation) {\n const periodStart = representation.adaptation.period.start;\n const presentationOffset = representation.presentationTimeOffset;\n\n return mediaTime + (periodStart - presentationOffset);\n }\n\n function calcMediaTimeFromPresentationTime(presentationTime, representation) {\n const periodStart = representation.adaptation.period.start;\n const presentationOffset = representation.presentationTimeOffset;\n\n return presentationTime - periodStart + presentationOffset;\n }\n\n function calcWallTimeForSegment(segment, isDynamic) {\n let suggestedPresentationDelay,\n displayStartTime,\n wallTime;\n\n if (isDynamic) {\n suggestedPresentationDelay = segment.representation.adaptation.period.mpd.suggestedPresentationDelay;\n displayStartTime = segment.presentationStartTime + suggestedPresentationDelay;\n wallTime = new Date(segment.availabilityStartTime.getTime() + (displayStartTime * 1000));\n }\n\n return wallTime;\n }\n\n /**\n * Calculates the timeshiftbuffer range. This range might overlap multiple periods and is not limited to period boundaries. However, we make sure that the range is potentially covered by period.\n * @param {Array} streams\n * @param {boolean} isDynamic\n * @return {}\n */\n function calcTimeShiftBufferWindow(streams, isDynamic) {\n // Static manifests. The availability window is equal to the DVR window\n if (!isDynamic) {\n return _calcTimeshiftBufferForStaticManifest(streams);\n }\n\n // Specific use case of SegmentTimeline\n if (settings.get().streaming.timeShiftBuffer.calcFromSegmentTimeline) {\n const data = _calcTimeShiftBufferWindowForDynamicTimelineManifest(streams);\n _adjustTimelineAnchorAvailabilityOffset(data.now, data.range);\n\n return data.range;\n }\n\n return _calcTimeShiftBufferWindowForDynamicManifest(streams);\n }\n\n function _calcTimeshiftBufferForStaticManifest(streams) {\n // Static Range Finder. We iterate over all periods and return the total duration\n const range = { start: NaN, end: NaN };\n let duration = 0;\n let start = NaN;\n streams.forEach((stream) => {\n const streamInfo = stream.getStreamInfo();\n duration += streamInfo.duration;\n\n if (isNaN(start) || streamInfo.start < start) {\n start = streamInfo.start;\n }\n });\n\n range.start = start;\n range.end = start + duration;\n\n return range;\n }\n\n function _calcTimeShiftBufferWindowForDynamicManifest(streams) {\n const range = { start: NaN, end: NaN };\n\n if (!streams || streams.length === 0) {\n return range;\n }\n\n const voPeriod = streams[0].getAdapter().getRegularPeriods()[0];\n const now = calcPresentationTimeFromWallTime(new Date(), voPeriod);\n const timeShiftBufferDepth = voPeriod.mpd.timeShiftBufferDepth;\n const start = !isNaN(timeShiftBufferDepth) ? now - timeShiftBufferDepth : 0;\n // check if we find a suitable period for that starttime. Otherwise we use the time closest to that\n range.start = _adjustTimeBasedOnPeriodRanges(streams, start);\n range.end = !isNaN(range.start) && now < range.start ? now : _adjustTimeBasedOnPeriodRanges(streams, now, true);\n\n if (!isNaN(timeShiftBufferDepth) && range.end < now - timeShiftBufferDepth) {\n range.end = NaN;\n }\n\n // If we have SegmentTimeline as a reference we can verify that the calculated DVR window is at least partially included in the DVR window exposed by the timeline.\n // If that is not the case we stick to the DVR window defined by SegmentTimeline\n if (settings.get().streaming.timeShiftBuffer.fallbackToSegmentTimeline) {\n const timelineRefData = _calcTimeShiftBufferWindowForDynamicTimelineManifest(streams);\n if (timelineRefData.range.end < range.start) {\n eventBus.trigger(MediaPlayerEvents.CONFORMANCE_VIOLATION, {\n level: ConformanceViolationConstants.LEVELS.WARNING,\n event: ConformanceViolationConstants.EVENTS.INVALID_DVR_WINDOW\n });\n _adjustTimelineAnchorAvailabilityOffset(timelineRefData.now, timelineRefData.range);\n return timelineRefData.range;\n }\n }\n\n return range;\n }\n\n function _calcTimeShiftBufferWindowForDynamicTimelineManifest(streams) {\n const range = { start: NaN, end: NaN };\n const voPeriod = streams[0].getAdapter().getRegularPeriods()[0];\n const now = calcPresentationTimeFromWallTime(new Date(), voPeriod);\n \n if (!streams || streams.length === 0) {\n return { range, now };\n }\n\n streams.forEach((stream) => {\n const adapter = stream.getAdapter();\n const mediaInfo = adapter.getMediaInfoForType(stream.getStreamInfo(), Constants.VIDEO) || adapter.getMediaInfoForType(stream.getStreamInfo(), Constants.AUDIO);\n const voRepresentations = adapter.getVoRepresentations(mediaInfo);\n const voRepresentation = voRepresentations[0];\n let periodRange = { start: NaN, end: NaN };\n\n if (voRepresentation) {\n if (voRepresentation.segmentInfoType === DashConstants.SEGMENT_TIMELINE) {\n periodRange = _calcRangeForTimeline(voRepresentation);\n } else {\n const currentVoPeriod = voRepresentation.adaptation.period;\n periodRange.start = currentVoPeriod.start;\n periodRange.end = Math.max(now, currentVoPeriod.start + currentVoPeriod.duration);\n }\n }\n\n if (!isNaN(periodRange.start) && (isNaN(range.start) || range.start > periodRange.start)) {\n range.start = periodRange.start;\n }\n if (!isNaN(periodRange.end) && (isNaN(range.end) || range.end < periodRange.end)) {\n range.end = periodRange.end;\n }\n });\n\n\n range.end = Math.min(now, range.end);\n const adjustedEndTime = _adjustTimeBasedOnPeriodRanges(streams, range.end, true);\n\n // if range is NaN all periods are in the future. we should return range.start > range.end in this case\n range.end = isNaN(adjustedEndTime) ? range.end : adjustedEndTime;\n\n range.start = voPeriod && voPeriod.mpd && voPeriod.mpd.timeShiftBufferDepth && !isNaN(voPeriod.mpd.timeShiftBufferDepth) && !isNaN(range.end) ? Math.max(range.end - voPeriod.mpd.timeShiftBufferDepth, range.start) : range.start;\n range.start = _adjustTimeBasedOnPeriodRanges(streams, range.start);\n\n return { range, now };\n }\n\n function _adjustTimelineAnchorAvailabilityOffset(now, range) {\n timelineAnchorAvailabilityOffset = now - range.end;\n }\n\n function _adjustTimeBasedOnPeriodRanges(streams, time, isEndOfDvrWindow = false) {\n try {\n let i = 0;\n let found = false;\n let adjustedTime = NaN;\n\n while (!found && i < streams.length) {\n const streamInfo = streams[i].getStreamInfo();\n\n // We found a period which contains the target time.\n if (streamInfo.start <= time && (!isFinite(streamInfo.duration) || (streamInfo.start + streamInfo.duration >= time))) {\n adjustedTime = time;\n found = true;\n }\n\n // Adjust the time for the start of the DVR window. The current period starts after the target time. We use the starttime of this period as adjusted time\n else if (!isEndOfDvrWindow && (streamInfo.start > time && (isNaN(adjustedTime) || streamInfo.start < adjustedTime))) {\n adjustedTime = streamInfo.start;\n }\n\n // Adjust the time for the end of the DVR window. The current period ends before the targettime. We use the end time of this period as the adjusted time\n else if (isEndOfDvrWindow && ((streamInfo.start + streamInfo.duration) < time && (isNaN(adjustedTime) || (streamInfo.start + streamInfo.duration > adjustedTime)))) {\n adjustedTime = streamInfo.start + streamInfo.duration;\n }\n\n i += 1;\n }\n\n return adjustedTime;\n } catch (e) {\n return time;\n }\n }\n\n function _calcRangeForTimeline(voRepresentation) {\n const adaptation = voRepresentation.adaptation.period.mpd.manifest.Period_asArray[voRepresentation.adaptation.period.index].AdaptationSet_asArray[voRepresentation.adaptation.index];\n const representation = dashManifestModel.getRepresentationFor(voRepresentation.index, adaptation);\n const base = representation.SegmentTemplate || representation.SegmentList;\n const timeline = base.SegmentTimeline;\n const timescale = base.timescale;\n const segments = timeline.S_asArray;\n const range = { start: 0, end: 0 };\n const segmentTime = segments[0].t;\n const hasValidSegmentTime = !isNaN(segmentTime);\n const enhancedSegmentTime = hasValidSegmentTime ? segmentTime : 0;\n let d = 0;\n let segment,\n repeat,\n i,\n len;\n \n if(hasValidSegmentTime) {\n range.start = calcPresentationTimeFromMediaTime(enhancedSegmentTime / timescale, voRepresentation);\n }\n \n for (i = 0, len = segments.length; i < len; i++) {\n segment = segments[i];\n repeat = 0;\n if (segment.hasOwnProperty('r')) {\n repeat = segment.r;\n }\n d += segment.d * (1 + repeat);\n }\n\n range.end = calcPresentationTimeFromMediaTime((enhancedSegmentTime + d) / timescale, voRepresentation);\n\n return range;\n }\n\n function calcPeriodRelativeTimeFromMpdRelativeTime(representation, mpdRelativeTime) {\n const periodStartTime = representation.adaptation.period.start;\n return mpdRelativeTime - periodStartTime;\n }\n\n function _onUpdateTimeSyncOffset(e) {\n if (e.offset !== undefined && !isNaN(e.offset)) {\n setClientTimeOffset(e.offset / 1000);\n }\n }\n\n function resetInitialSettings() {\n clientServerTimeShift = 0;\n timelineAnchorAvailabilityOffset = 0;\n }\n\n function reset() {\n eventBus.off(Events.UPDATE_TIME_SYNC_OFFSET, _onUpdateTimeSyncOffset, this);\n resetInitialSettings();\n }\n\n instance = {\n initialize,\n getClientTimeOffset,\n setClientTimeOffset,\n getClientReferenceTime,\n calcAvailabilityStartTimeFromPresentationTime,\n calcAvailabilityEndTimeFromPresentationTime,\n calcPresentationTimeFromWallTime,\n calcPresentationTimeFromMediaTime,\n calcPeriodRelativeTimeFromMpdRelativeTime,\n calcMediaTimeFromPresentationTime,\n calcWallTimeForSegment,\n calcTimeShiftBufferWindow,\n reset\n };\n\n setup();\n return instance;\n}\n\nTimelineConverter.__dashjs_factory_name = 'TimelineConverter';\nexport default FactoryMaker.getSingletonFactory(TimelineConverter);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport MediaInfo from './../../dash/vo/MediaInfo';\n\n/**\n * @class\n * @ignore\n */\nclass TextTrackInfo extends MediaInfo {\n constructor () {\n super();\n this.captionData = null;\n this.label = null;\n this.defaultTrack = false;\n this.kind = null;\n this.isFragmented = false;\n this.isEmbedded = false;\n this.isTTML = null;\n }\n}\n\nexport default TextTrackInfo;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport FactoryMaker from '../../core/FactoryMaker';\n\nfunction EmbeddedTextHtmlRender() {\n\n let captionId = 0;\n let instance;\n\n /* HTML Rendering functions */\n function checkIndent(chars) {\n let line = '';\n\n for (let c = 0; c < chars.length; ++c) {\n const uc = chars[c];\n line += uc.uchar;\n }\n\n const l = line.length;\n const ll = line.replace(/^\\s+/, '').length;\n return l - ll;\n }\n\n function getRegionProperties(region) {\n return 'left: ' + (region.x * 3.125) + '%; top: ' + (region.y1 * 6.66) + '%; width: ' + (100 - (region.x * 3.125)) + '%; height: ' + (Math.max((region.y2 - 1) - region.y1, 1) * 6.66) + '%; align-items: flex-start; overflow: visible; -webkit-writing-mode: horizontal-tb;';\n }\n\n function createRGB(color) {\n if (color === 'red') {\n return 'rgb(255, 0, 0)';\n } else if (color === 'green') {\n return 'rgb(0, 255, 0)';\n } else if (color === 'blue') {\n return 'rgb(0, 0, 255)';\n } else if (color === 'cyan') {\n return 'rgb(0, 255, 255)';\n } else if (color === 'magenta') {\n return 'rgb(255, 0, 255)';\n } else if (color === 'yellow') {\n return 'rgb(255, 255, 0)';\n } else if (color === 'white') {\n return 'rgb(255, 255, 255)';\n } else if (color === 'black') {\n return 'rgb(0, 0, 0)';\n }\n return color;\n }\n\n function getStyle(videoElement, style) {\n const fontSize = videoElement.videoHeight / 15.0;\n if (style) {\n return 'font-size: ' + fontSize + 'px; font-family: Menlo, Consolas, \\'Cutive Mono\\', monospace; color: ' + ((style.foreground) ? createRGB(style.foreground) : 'rgb(255, 255, 255)') + '; font-style: ' + (style.italics ? 'italic' : 'normal') + '; text-decoration: ' + (style.underline ? 'underline' : 'none') + '; white-space: pre; background-color: ' + ((style.background) ? createRGB(style.background) : 'transparent') + ';';\n } else {\n return 'font-size: ' + fontSize + 'px; font-family: Menlo, Consolas, \\'Cutive Mono\\', monospace; justify-content: flex-start; text-align: left; color: rgb(255, 255, 255); font-style: normal; white-space: pre; line-height: normal; font-weight: normal; text-decoration: none; width: 100%; display: flex;';\n }\n }\n\n function ltrim(s) {\n return s.replace(/^\\s+/g, '');\n }\n\n function rtrim(s) {\n return s.replace(/\\s+$/g, '');\n }\n\n function createHTMLCaptionsFromScreen(videoElement, startTime, endTime, captionScreen) {\n let currRegion = null;\n let existingRegion = null;\n let lastRowHasText = false;\n let lastRowIndentL = -1;\n let currP = { start: startTime, end: endTime, spans: [] };\n let currentStyle = 'style_cea608_white_black';\n const seenRegions = {};\n const styleStates = {};\n const regions = [];\n let r, s;\n\n for (r = 0; r < 15; ++r) {\n const row = captionScreen.rows[r];\n let line = '';\n let prevPenState = null;\n\n if (false === row.isEmpty()) {\n /* Row is not empty */\n\n /* Get indentation of this row */\n const rowIndent = checkIndent(row.chars);\n\n /* Create a new region is there is none */\n if (currRegion === null) {\n currRegion = { x: rowIndent, y1: r, y2: (r + 1), p: [] };\n }\n\n /* Check if indentation has changed and we had text of last row */\n if ((rowIndent !== lastRowIndentL) && lastRowHasText) {\n currRegion.p.push(currP);\n currP = { start: startTime, end: endTime, spans: [] };\n currRegion.y2 = r;\n currRegion.name = 'region_' + currRegion.x + '_' + currRegion.y1 + '_' + currRegion.y2;\n if (false === seenRegions.hasOwnProperty(currRegion.name)) {\n regions.push(currRegion);\n seenRegions[currRegion.name] = currRegion;\n } else {\n existingRegion = seenRegions[currRegion.name];\n existingRegion.p.contat(currRegion.p);\n }\n\n currRegion = { x: rowIndent, y1: r, y2: (r + 1), p: [] };\n }\n\n for (let c = 0; c < row.chars.length; ++c) {\n const uc = row.chars[c];\n const currPenState = uc.penState;\n if ((prevPenState === null) || (!currPenState.equals(prevPenState))) {\n if (line.trim().length > 0) {\n currP.spans.push({ name: currentStyle, line: line, row: r });\n line = '';\n }\n\n let currPenStateString = 'style_cea608_' + currPenState.foreground + '_' + currPenState.background;\n if (currPenState.underline) {\n currPenStateString += '_underline';\n }\n if (currPenState.italics) {\n currPenStateString += '_italics';\n }\n\n if (!styleStates.hasOwnProperty(currPenStateString)) {\n styleStates[currPenStateString] = JSON.parse(JSON.stringify(currPenState));\n }\n\n prevPenState = currPenState;\n\n currentStyle = currPenStateString;\n }\n\n line += uc.uchar;\n }\n\n if (line.trim().length > 0) {\n currP.spans.push({ name: currentStyle, line: line, row: r });\n }\n\n lastRowHasText = true;\n lastRowIndentL = rowIndent;\n } else {\n /* Row is empty */\n lastRowHasText = false;\n lastRowIndentL = -1;\n\n if (currRegion) {\n currRegion.p.push(currP);\n currP = { start: startTime, end: endTime, spans: [] };\n currRegion.y2 = r;\n currRegion.name = 'region_' + currRegion.x + '_' + currRegion.y1 + '_' + currRegion.y2;\n if (false === seenRegions.hasOwnProperty(currRegion.name)) {\n regions.push(currRegion);\n seenRegions[currRegion.name] = currRegion;\n } else {\n existingRegion = seenRegions[currRegion.name];\n existingRegion.p.contat(currRegion.p);\n }\n\n currRegion = null;\n }\n\n }\n }\n\n if (currRegion) {\n currRegion.p.push(currP);\n currRegion.y2 = r + 1;\n currRegion.name = 'region_' + currRegion.x + '_' + currRegion.y1 + '_' + currRegion.y2;\n if (false === seenRegions.hasOwnProperty(currRegion.name)) {\n regions.push(currRegion);\n seenRegions[currRegion.name] = currRegion;\n } else {\n existingRegion = seenRegions[currRegion.name];\n existingRegion.p.contat(currRegion.p);\n }\n\n currRegion = null;\n }\n\n const captionsArray = [];\n\n /* Loop thru regions */\n for (r = 0; r < regions.length; ++r) {\n const region = regions[r];\n\n const cueID = 'sub_cea608_' + (captionId++);\n const finalDiv = document.createElement('div');\n finalDiv.id = cueID;\n const cueRegionProperties = getRegionProperties(region);\n finalDiv.style.cssText = 'position: absolute; margin: 0; display: flex; box-sizing: border-box; pointer-events: none;' + cueRegionProperties;\n\n const bodyDiv = document.createElement('div');\n bodyDiv.className = 'paragraph bodyStyle';\n bodyDiv.style.cssText = getStyle(videoElement);\n\n const cueUniWrapper = document.createElement('div');\n cueUniWrapper.className = 'cueUniWrapper';\n cueUniWrapper.style.cssText = 'unicode-bidi: normal; direction: ltr;';\n\n for (let p = 0; p < region.p.length; ++p) {\n const ptag = region.p[p];\n let lastSpanRow = 0;\n for (s = 0; s < ptag.spans.length; ++s) {\n let span = ptag.spans[s];\n if (span.line.length > 0) {\n if ((s !== 0) && lastSpanRow != span.row) {\n const brElement = document.createElement('br');\n brElement.className = 'lineBreak';\n cueUniWrapper.appendChild(brElement);\n }\n let sameRow = false;\n if (lastSpanRow === span.row) {\n sameRow = true;\n }\n lastSpanRow = span.row;\n const spanStyle = styleStates[span.name];\n const spanElement = document.createElement('span');\n spanElement.className = 'spanPadding ' + span.name + ' customSpanColor';\n spanElement.style.cssText = getStyle(videoElement, spanStyle);\n /* If this is not the first span, and it's on the same\n * row as the last one */\n if ((s !== 0) && sameRow) {\n /* and it's the last span on this row */\n if (s === ptag.spans.length - 1) {\n /* trim only the right side */\n spanElement.textContent = rtrim(span.line);\n } else {\n /* don't trim at all */\n spanElement.textContent = span.line;\n }\n } else {\n /* if there is more than 1 span and this isn't the last span */\n if (ptag.spans.length > 1 && s < (ptag.spans.length - 1)) {\n /* Check if next text is on same row */\n if (span.row === ptag.spans[s + 1].row) {\n /* Next element on same row, trim start */\n spanElement.textContent = ltrim(span.line);\n } else {\n /* Different rows, trim both */\n spanElement.textContent = span.line.trim();\n }\n } else {\n spanElement.textContent = span.line.trim();\n }\n }\n cueUniWrapper.appendChild(spanElement);\n }\n }\n }\n\n bodyDiv.appendChild(cueUniWrapper);\n finalDiv.appendChild(bodyDiv);\n\n const fontSize = { 'bodyStyle': ['%', 90] };\n for (const s in styleStates) {\n if (styleStates.hasOwnProperty(s)) {\n fontSize[s] = ['%', 90];\n }\n }\n\n captionsArray.push({\n type: 'html',\n start: startTime,\n end: endTime,\n cueHTMLElement: finalDiv,\n cueID: cueID,\n cellResolution: [32, 15],\n isFromCEA608: true,\n fontSize: fontSize,\n lineHeight: {},\n linePadding: {}\n });\n }\n return captionsArray;\n }\n\n instance = {\n createHTMLCaptionsFromScreen: createHTMLCaptionsFromScreen\n };\n return instance;\n}\n\nEmbeddedTextHtmlRender.__dashjs_factory_name = 'EmbeddedTextHtmlRender';\nexport default FactoryMaker.getSingletonFactory(EmbeddedTextHtmlRender);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport Constants from '../constants/Constants';\nimport {HTTPRequest} from '../vo/metrics/HTTPRequest';\nimport TextTrackInfo from '../vo/TextTrackInfo';\nimport BoxParser from '../utils/BoxParser';\nimport CustomTimeRanges from '../utils/CustomTimeRanges';\nimport FactoryMaker from '../../core/FactoryMaker';\nimport Debug from '../../core/Debug';\nimport EmbeddedTextHtmlRender from './EmbeddedTextHtmlRender';\nimport ISOBoxer from 'codem-isoboxer';\nimport cea608parser from '../../../externals/cea608-parser';\nimport EventBus from '../../core/EventBus';\nimport Events from '../../core/events/Events';\nimport DashJSError from '../vo/DashJSError';\nimport Errors from '../../core/errors/Errors';\n\nfunction TextSourceBuffer(config) {\n const errHandler = config.errHandler;\n const manifestModel = config.manifestModel;\n const mediaController = config.mediaController;\n const videoModel = config.videoModel;\n const textTracks = config.textTracks;\n const vttParser = config.vttParser;\n const vttCustomRenderingParser = config.vttCustomRenderingParser;\n const ttmlParser = config.ttmlParser;\n const streamInfo = config.streamInfo;\n const settings = config.settings;\n\n const context = this.context;\n const eventBus = EventBus(context).getInstance();\n let embeddedInitialized = false;\n\n let instance,\n logger,\n boxParser,\n parser,\n mediaInfos,\n fragmentModel,\n initializationSegmentReceived,\n timescale,\n fragmentedTracks,\n firstFragmentedSubtitleStart,\n currFragmentedTrackIdx,\n embeddedTracks,\n embeddedTimescale,\n embeddedLastSequenceNumber,\n lastChunkEnd,\n embeddedCea608FieldParsers,\n embeddedTextHtmlRender;\n\n function setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n boxParser = BoxParser(context).getInstance();\n\n resetInitialSettings();\n }\n\n function getStreamId() {\n return streamInfo.id;\n }\n\n function _resetFragmented() {\n fragmentModel = null;\n timescale = NaN;\n fragmentedTracks = [];\n firstFragmentedSubtitleStart = null;\n initializationSegmentReceived = false;\n }\n\n function resetInitialSettings() {\n _resetFragmented();\n\n mediaInfos = [];\n parser = null;\n }\n\n function initialize() {\n\n if (!embeddedInitialized) {\n _initEmbedded();\n }\n\n }\n\n /**\n * There might be media infos of different types. For instance text and fragmentedText.\n * @param {string} type\n * @param {array} mInfos\n * @param {object} fModel\n */\n function addMediaInfos(type, mInfos, fModel) {\n\n mediaInfos = mediaInfos.concat(mInfos);\n\n if (type === Constants.TEXT && mInfos[0].isFragmented && !mInfos[0].isEmbedded) {\n fragmentModel = fModel;\n instance.buffered = CustomTimeRanges(context).create();\n fragmentedTracks = mediaController.getTracksFor(Constants.TEXT, streamInfo.id).filter(track => track.isFragmented);\n const currFragTrack = mediaController.getCurrentTrackFor(Constants.TEXT, streamInfo.id);\n for (let i = 0; i < fragmentedTracks.length; i++) {\n if (fragmentedTracks[i] === currFragTrack) {\n setCurrentFragmentedTrackIdx(i);\n break;\n }\n }\n }\n\n for (let i = 0; i < mInfos.length; i++) {\n _createTextTrackFromMediaInfo(mInfos[i]);\n }\n\n }\n\n /**\n * Create a new track based on the mediaInfo information\n * @param {object} mediaInfo\n * @private\n */\n function _createTextTrackFromMediaInfo(mediaInfo) {\n const textTrackInfo = new TextTrackInfo();\n const trackKindMap = { subtitle: 'subtitles', caption: 'captions' }; //Dash Spec has no \"s\" on end of KIND but HTML needs plural.\n\n for (let key in mediaInfo) {\n textTrackInfo[key] = mediaInfo[key];\n }\n\n textTrackInfo.labels = mediaInfo.labels;\n textTrackInfo.defaultTrack = getIsDefault(mediaInfo);\n textTrackInfo.isFragmented = mediaInfo.isFragmented;\n textTrackInfo.isEmbedded = !!mediaInfo.isEmbedded;\n textTrackInfo.isTTML = _checkTtml(mediaInfo);\n textTrackInfo.kind = _getKind(mediaInfo, trackKindMap);\n\n textTracks.addTextTrack(textTrackInfo);\n }\n\n function abort() {\n }\n\n function reset() {\n resetInitialSettings();\n\n mediaInfos = [];\n boxParser = null;\n }\n\n function _onVideoChunkReceived(e) {\n const chunk = e.chunk;\n\n if (chunk.mediaInfo.embeddedCaptions) {\n append(chunk.bytes, chunk);\n }\n }\n\n function _initEmbedded() {\n embeddedTracks = [];\n currFragmentedTrackIdx = null;\n embeddedTimescale = 0;\n embeddedCea608FieldParsers = [];\n embeddedLastSequenceNumber = null;\n lastChunkEnd = null;\n embeddedInitialized = true;\n embeddedTextHtmlRender = EmbeddedTextHtmlRender(context).getInstance();\n\n eventBus.on(Events.VIDEO_CHUNK_RECEIVED, _onVideoChunkReceived, instance);\n eventBus.on(Events.BUFFER_CLEARED, onVideoBufferCleared, instance);\n }\n\n function resetEmbedded() {\n eventBus.off(Events.VIDEO_CHUNK_RECEIVED, _onVideoChunkReceived, instance);\n eventBus.off(Events.BUFFER_CLEARED, onVideoBufferCleared, instance);\n if (textTracks) {\n textTracks.deleteAllTextTracks();\n }\n embeddedInitialized = false;\n embeddedTracks = [];\n embeddedCea608FieldParsers = [null, null];\n embeddedLastSequenceNumber = null;\n lastChunkEnd = null;\n }\n\n function addEmbeddedTrack(mediaInfo) {\n\n if (!embeddedInitialized) {\n return;\n }\n\n if (mediaInfo) {\n if (mediaInfo.id === Constants.CC1 || mediaInfo.id === Constants.CC3) {\n for (let i = 0; i < embeddedTracks.length; i++) {\n if (embeddedTracks[i].id === mediaInfo.id) {\n return;\n }\n }\n embeddedTracks.push(mediaInfo);\n } else {\n logger.warn('Embedded track ' + mediaInfo.id + ' not supported!');\n }\n }\n }\n\n function getConfig() {\n const config = {\n fragmentModel: fragmentModel,\n fragmentedTracks: fragmentedTracks,\n videoModel: videoModel\n };\n\n return config;\n }\n\n function setCurrentFragmentedTrackIdx(idx) {\n currFragmentedTrackIdx = idx;\n }\n\n function _checkTtml(mediaInfo) {\n return (mediaInfo.codec && mediaInfo.codec.search(Constants.STPP) >= 0) || (mediaInfo.mimeType && mediaInfo.mimeType.search(Constants.TTML) >= 0);\n }\n\n function _getKind(mediaInfo, trackKindMap) {\n let kind = (mediaInfo.roles && mediaInfo.roles.length > 0) ? trackKindMap[mediaInfo.roles[0]] : trackKindMap.caption;\n\n kind = (kind === trackKindMap.caption || kind === trackKindMap.subtitle) ? kind : trackKindMap.caption;\n\n return kind;\n }\n\n function append(bytes, chunk) {\n const mediaInfo = chunk.mediaInfo;\n const mediaType = mediaInfo.type;\n const mimeType = mediaInfo.mimeType;\n const codecType = mediaInfo.codec || mimeType;\n\n if (!codecType) {\n logger.error('No text type defined');\n return;\n }\n\n if (mediaInfo.codec.indexOf('application/mp4') !== -1) {\n _appendFragmentedText(bytes, chunk, codecType);\n } else if (mediaType === Constants.VIDEO) {\n _appendEmbeddedText(bytes, chunk);\n } else {\n _appendText(bytes, chunk, codecType);\n }\n }\n\n function _appendFragmentedText(bytes, chunk, codecType) {\n let sampleList,\n samplesInfo;\n\n if (chunk.segmentType === 'InitializationSegment') {\n initializationSegmentReceived = true;\n timescale = boxParser.getMediaTimescaleFromMoov(bytes);\n } else {\n if (!initializationSegmentReceived) {\n return;\n }\n samplesInfo = boxParser.getSamplesInfo(bytes);\n sampleList = samplesInfo.sampleList;\n if (sampleList.length > 0) {\n firstFragmentedSubtitleStart = sampleList[0].cts - chunk.start * timescale;\n }\n\n if (codecType.search(Constants.STPP) >= 0) {\n _appendFragmentedSttp(bytes, sampleList, codecType);\n } else {\n _appendFragmentedWebVtt(bytes, sampleList);\n }\n }\n }\n\n function _appendFragmentedSttp(bytes, sampleList, codecType) {\n let i, j;\n\n parser = parser !== null ? parser : _getParser(codecType);\n\n for (i = 0; i < sampleList.length; i++) {\n const sample = sampleList[i];\n const sampleStart = sample.cts;\n const timestampOffset = _getTimestampOffset();\n const start = timestampOffset + sampleStart / timescale;\n const end = start + sample.duration / timescale;\n instance.buffered.add(start, end);\n const dataView = new DataView(bytes, sample.offset, sample.subSizes[0]);\n let ccContent = ISOBoxer.Utils.dataViewToString(dataView, Constants.UTF8);\n const images = [];\n let subOffset = sample.offset + sample.subSizes[0];\n\n for (j = 1; j < sample.subSizes.length; j++) {\n const inData = new Uint8Array(bytes, subOffset, sample.subSizes[j]);\n const raw = String.fromCharCode.apply(null, inData);\n images.push(raw);\n subOffset += sample.subSizes[j];\n }\n\n try {\n const manifest = manifestModel.getValue();\n\n // Only used for Microsoft Smooth Streaming support - caption time is relative to sample time. In this case, we apply an offset.\n const offsetTime = manifest.ttmlTimeIsRelative ? sampleStart / timescale : 0;\n const result = parser.parse(ccContent, offsetTime, (sampleStart / timescale), ((sampleStart + sample.duration) / timescale), images);\n textTracks.addCaptions(currFragmentedTrackIdx, timestampOffset, result);\n \n } catch (e) {\n fragmentModel.removeExecutedRequestsBeforeTime();\n this.remove();\n logger.error('TTML parser error: ' + e.message);\n }\n }\n }\n\n function _appendFragmentedWebVtt(bytes, sampleList) {\n let i, j, k;\n\n const captionArray = [];\n for (i = 0; i < sampleList.length; i++) {\n const sample = sampleList[i];\n sample.cts -= firstFragmentedSubtitleStart;\n const timestampOffset = _getTimestampOffset();\n const start = timestampOffset + sample.cts / timescale;\n const end = start + sample.duration / timescale;\n instance.buffered.add(start, end);\n const sampleData = bytes.slice(sample.offset, sample.offset + sample.size);\n // There are boxes inside the sampleData, so we need a ISOBoxer to get at it.\n const sampleBoxes = ISOBoxer.parseBuffer(sampleData);\n\n for (j = 0; j < sampleBoxes.boxes.length; j++) {\n const box1 = sampleBoxes.boxes[j];\n logger.debug('VTT box1: ' + box1.type);\n if (box1.type === 'vtte') {\n continue; //Empty box\n }\n if (box1.type === 'vttc') {\n logger.debug('VTT vttc boxes.length = ' + box1.boxes.length);\n let entry = {\n styles: {}\n };\n for (k = 0; k < box1.boxes.length; k++) {\n const box2 = box1.boxes[k];\n logger.debug('VTT box2: ' + box2.type);\n\n // Mandatory cue payload lines\n if (box2.type === 'payl') {\n entry.start = sample.cts / timescale;\n entry.end = (sample.cts + sample.duration) / timescale;\n entry.data = box2.cue_text;\n }\n\n // The styling information\n else if (box2.type === 'sttg' && box2.settings && box2.settings !== '') {\n try {\n const stylings = box2.settings.split(' ');\n entry.styles = vttParser.getCaptionStyles(stylings);\n } catch (e) {\n\n }\n }\n }\n if (entry && entry.data) {\n captionArray.push(entry);\n logger.debug(`VTT ${entry.start} - ${entry.end} : ${entry.data}`);\n }\n }\n }\n }\n if (captionArray.length > 0) {\n textTracks.addCaptions(currFragmentedTrackIdx, 0, captionArray);\n }\n }\n\n function _appendText(bytes, chunk, codecType) {\n let result,\n ccContent;\n\n const dataView = new DataView(bytes, 0, bytes.byteLength);\n ccContent = ISOBoxer.Utils.dataViewToString(dataView, Constants.UTF8);\n\n try {\n result = _getParser(codecType).parse(ccContent, 0);\n textTracks.addCaptions(textTracks.getCurrentTrackIdx(), 0, result);\n if (instance.buffered) {\n instance.buffered.add(chunk.start, chunk.end);\n }\n } catch (e) {\n errHandler.error(new DashJSError(Errors.TIMED_TEXT_ERROR_ID_PARSE_CODE, Errors.TIMED_TEXT_ERROR_MESSAGE_PARSE + e.message, ccContent));\n }\n }\n\n function _isDiscontinuityOfChunks(embeddedLastSequenceNumber, sequenceNumber, numSequences, lastChunkEnd, chunkStart) {\n if (embeddedLastSequenceNumber === null || sequenceNumber === null || lastChunkEnd === null || chunkStart === null) {\n return false\n }\n // Sequence number is always 1 for low latency streams\n if (sequenceNumber === embeddedLastSequenceNumber) {\n // time-based continuity check\n return lastChunkEnd !== chunkStart\n }\n return sequenceNumber !== embeddedLastSequenceNumber + numSequences;\n }\n\n function _appendEmbeddedText(bytes, chunk) {\n let i, samplesInfo;\n\n // Init segment\n if (chunk.segmentType === HTTPRequest.INIT_SEGMENT_TYPE) {\n if (embeddedTimescale === 0) {\n embeddedTimescale = boxParser.getMediaTimescaleFromMoov(bytes);\n }\n }\n\n // MediaSegment\n else if (chunk.segmentType === HTTPRequest.MEDIA_SEGMENT_TYPE) {\n\n if (embeddedTimescale === 0) {\n logger.warn('CEA-608: No timescale for embeddedTextTrack yet');\n return;\n }\n\n samplesInfo = boxParser.getSamplesInfo(bytes);\n\n const sequenceNumber = samplesInfo.lastSequenceNumber;\n const chunkStart = Math.trunc(chunk.start);\n const chunkEnd = Math.trunc(chunk.end);\n\n if (!embeddedCea608FieldParsers[0] && !embeddedCea608FieldParsers[1]) {\n _setupCeaParser();\n }\n\n if (embeddedTimescale) {\n if (_isDiscontinuityOfChunks(embeddedLastSequenceNumber, sequenceNumber, samplesInfo.numSequences, lastChunkEnd, chunkStart)) {\n for (i = 0; i < embeddedCea608FieldParsers.length; i++) {\n if (embeddedCea608FieldParsers[i]) {\n embeddedCea608FieldParsers[i].reset();\n }\n }\n }\n\n const allCcData = _extractCea608Data(bytes, samplesInfo.sampleList);\n\n for (let fieldNr = 0; fieldNr < embeddedCea608FieldParsers.length; fieldNr++) {\n const ccData = allCcData.fields[fieldNr];\n const fieldParser = embeddedCea608FieldParsers[fieldNr];\n if (fieldParser) {\n for (i = 0; i < ccData.length; i++) {\n fieldParser.addData(ccData[i][0] / embeddedTimescale, ccData[i][1]);\n }\n }\n }\n embeddedLastSequenceNumber = sequenceNumber;\n lastChunkEnd = chunkEnd;\n }\n }\n }\n\n function _setupCeaParser() {\n // Time to setup the CEA-608 parsing\n let trackIdx;\n for (let i = 0; i < embeddedTracks.length; i++) {\n trackIdx = textTracks.getTrackIdxForId(embeddedTracks[i].id);\n\n if (trackIdx === -1) {\n logger.warn('CEA-608: data before track is ready.');\n return;\n }\n\n const handler = _makeCueAdderForIndex(trackIdx);\n embeddedCea608FieldParsers[i] = new cea608parser.Cea608Parser(i + 1, {\n newCue: handler\n }, null);\n }\n }\n\n function _makeCueAdderForIndex(trackIndex) {\n function newCue(startTime, endTime, captionScreen) {\n let captionsArray;\n if (videoModel.getTTMLRenderingDiv()) {\n captionsArray = embeddedTextHtmlRender.createHTMLCaptionsFromScreen(videoModel.getElement(), startTime, endTime, captionScreen);\n } else {\n const text = captionScreen.getDisplayText();\n captionsArray = [{\n start: startTime,\n end: endTime,\n data: text,\n styles: {}\n }];\n }\n if (captionsArray) {\n textTracks.addCaptions(trackIndex, 0, captionsArray);\n }\n }\n\n return newCue;\n }\n\n /**\n * Extract CEA-608 data from a buffer of data.\n * @param {ArrayBuffer} data\n * @param {Array} samples cue information\n * @returns {Object|null} ccData corresponding to one segment.\n */\n function _extractCea608Data(data, samples) {\n if (samples.length === 0) {\n return null;\n }\n\n const allCcData = {\n splits: [],\n fields: [[], []]\n };\n const raw = new DataView(data);\n for (let i = 0; i < samples.length; i++) {\n const sample = samples[i];\n const cea608Ranges = cea608parser.findCea608Nalus(raw, sample.offset, sample.size);\n let lastSampleTime = null;\n let idx = 0;\n for (let j = 0; j < cea608Ranges.length; j++) {\n const ccData = cea608parser.extractCea608DataFromRange(raw, cea608Ranges[j]);\n for (let k = 0; k < 2; k++) {\n if (ccData[k].length > 0) {\n if (sample.cts !== lastSampleTime) {\n idx = 0;\n } else {\n idx += 1;\n }\n const timestampOffset = _getTimestampOffset();\n allCcData.fields[k].push([sample.cts + (timestampOffset * embeddedTimescale), ccData[k], idx]);\n lastSampleTime = sample.cts;\n }\n }\n }\n }\n\n // Sort by sampleTime ascending order\n // If two packets have the same sampleTime, use them in the order\n // they were received\n allCcData.fields.forEach(function sortField(field) {\n field.sort(function (a, b) {\n if (a[0] === b[0]) {\n return a[2] - b[2];\n }\n return a[0] - b[0];\n });\n });\n\n return allCcData;\n }\n\n function _getTimestampOffset() {\n return !isNaN(instance.timestampOffset) ? instance.timestampOffset : 0;\n }\n\n function getIsDefault(mediaInfo) {\n //TODO How to tag default. currently same order as listed in manifest.\n // Is there a way to mark a text adaptation set as the default one? DASHIF meeting talk about using role which is being used for track KIND\n // Eg subtitles etc. You can have multiple role tags per adaptation Not defined in the spec yet.\n let isDefault = false;\n if (embeddedTracks.length > 1 && mediaInfo.isEmbedded) {\n isDefault = (mediaInfo.id && mediaInfo.id === Constants.CC1); // CC1 if both CC1 and CC3 exist\n } else if (embeddedTracks.length === 1) {\n if (mediaInfo.id && typeof mediaInfo.id === 'string' && mediaInfo.id.substring(0, 2) === 'CC') { // Either CC1 or CC3\n isDefault = true;\n }\n } else if (embeddedTracks.length === 0) {\n isDefault = (mediaInfo.index === mediaInfos[0].index);\n }\n return isDefault;\n }\n\n function _getParser(codecType) {\n let parser;\n if (codecType.search(Constants.VTT) >= 0) {\n parser = settings.get().streaming.text.webvtt.customRenderingEnabled && vttCustomRenderingParser ? vttCustomRenderingParser : vttParser;\n } else if (codecType.search(Constants.TTML) >= 0 || codecType.search(Constants.STPP) >= 0) {\n parser = ttmlParser;\n }\n return parser;\n }\n\n function remove(start, end) {\n //if start and end are not defined, remove all\n if ((start === undefined) && (start === end)) {\n start = instance.buffered.start(0);\n end = instance.buffered.end(instance.buffered.length - 1);\n }\n instance.buffered.remove(start, end);\n textTracks.deleteCuesFromTrackIdx(currFragmentedTrackIdx, start, end);\n }\n\n function onVideoBufferCleared(e) {\n embeddedTracks.forEach(function (track) {\n const trackIdx = textTracks.getTrackIdxForId(track.id);\n if (trackIdx >= 0) {\n textTracks.deleteCuesFromTrackIdx(trackIdx, e.from, e.to);\n }\n });\n }\n\n function resetMediaInfos() {\n mediaInfos = [];\n }\n\n instance = {\n initialize,\n addMediaInfos,\n resetMediaInfos,\n getStreamId,\n append,\n abort,\n addEmbeddedTrack,\n resetEmbedded,\n getConfig,\n setCurrentFragmentedTrackIdx,\n remove,\n reset\n };\n\n setup();\n\n return instance;\n}\n\nTextSourceBuffer.__dashjs_factory_name = 'TextSourceBuffer';\nexport default FactoryMaker.getClassFactory(TextSourceBuffer);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport Constants from '../constants/Constants';\nimport EventBus from '../../core/EventBus';\nimport Events from '../../core/events/Events';\nimport MediaPlayerEvents from '../../streaming/MediaPlayerEvents';\nimport FactoryMaker from '../../core/FactoryMaker';\nimport Debug from '../../core/Debug';\nimport {renderHTML} from 'imsc';\n\nconst CUE_PROPS_TO_COMPARE = [\n 'text',\n 'align',\n 'fontSize',\n 'id',\n 'isd',\n 'line',\n 'lineAlign',\n 'lineHeight',\n 'linePadding',\n 'position',\n 'positionAlign',\n 'region',\n 'size',\n 'snapToLines',\n 'vertical',\n];\n\nfunction TextTracks(config) {\n\n const context = this.context;\n const eventBus = EventBus(context).getInstance();\n const videoModel = config.videoModel;\n const streamInfo = config.streamInfo;\n const settings = config.settings;\n\n let instance,\n logger,\n Cue,\n textTrackQueue,\n nativeTrackElementArr,\n currentTrackIdx,\n actualVideoLeft,\n actualVideoTop,\n actualVideoWidth,\n actualVideoHeight,\n captionContainer,\n vttCaptionContainer,\n videoSizeCheckInterval,\n fullscreenAttribute,\n displayCCOnTop,\n previousISDState,\n topZIndex,\n resizeObserver,\n hasRequestAnimationFrame,\n currentCaptionEventCue;\n\n function setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n }\n\n function initialize() {\n if (typeof window === 'undefined' || typeof navigator === 'undefined') {\n return;\n }\n\n Cue = window.VTTCue || window.TextTrackCue;\n textTrackQueue = [];\n nativeTrackElementArr = [];\n currentTrackIdx = -1;\n actualVideoLeft = 0;\n actualVideoTop = 0;\n actualVideoWidth = 0;\n actualVideoHeight = 0;\n captionContainer = null;\n vttCaptionContainer = null;\n videoSizeCheckInterval = null;\n displayCCOnTop = false;\n topZIndex = 2147483647;\n previousISDState = null;\n hasRequestAnimationFrame = ('requestAnimationFrame' in window);\n\n if (document.fullscreenElement !== undefined) {\n fullscreenAttribute = 'fullscreenElement'; // Standard and Edge\n } else if (document.webkitIsFullScreen !== undefined) {\n fullscreenAttribute = 'webkitIsFullScreen'; // Chrome and Safari (and Edge)\n } else if (document.msFullscreenElement) { // IE11\n fullscreenAttribute = 'msFullscreenElement';\n } else if (document.mozFullScreen) { // Firefox\n fullscreenAttribute = 'mozFullScreen';\n }\n }\n\n function getStreamId() {\n return streamInfo.id;\n }\n\n function _createTrackForUserAgent(element) {\n const kind = element.kind;\n const label = element.id !== undefined ? element.id : element.lang;\n const lang = element.lang;\n const isTTML = element.isTTML;\n const isEmbedded = element.isEmbedded;\n const track = videoModel.addTextTrack(kind, label, lang, isTTML, isEmbedded);\n\n return track;\n }\n\n function addTextTrack(textTrackInfoVO) {\n textTrackQueue.push(textTrackInfoVO);\n }\n\n function createTracks() {\n const dispatchForManualRendering = settings.get().streaming.text.dispatchForManualRendering;\n\n //Sort in same order as in manifest\n textTrackQueue.sort(function (a, b) {\n return a.index - b.index;\n });\n\n captionContainer = videoModel.getTTMLRenderingDiv();\n vttCaptionContainer = videoModel.getVttRenderingDiv();\n let defaultIndex = -1;\n for (let i = 0; i < textTrackQueue.length; i++) {\n const track = _createTrackForUserAgent(textTrackQueue[i]);\n\n //used to remove tracks from video element when added manually\n nativeTrackElementArr.push(track);\n\n if (textTrackQueue[i].defaultTrack) {\n // track.default is an object property identifier that is a reserved word\n // The following jshint directive is used to suppressed the warning \"Expected an identifier and instead saw 'default' (a reserved word)\"\n /*jshint -W024 */\n track.default = true;\n defaultIndex = i;\n }\n\n const textTrack = getTrackByIdx(i);\n if (textTrack) {\n //each time a track is created, its mode should be showing by default\n //sometime, it's not on Chrome\n textTrack.mode = Constants.TEXT_SHOWING;\n if (captionContainer && (textTrackQueue[i].isTTML || textTrackQueue[i].isEmbedded)) {\n textTrack.renderingType = 'html';\n } else {\n textTrack.renderingType = 'default';\n }\n }\n\n addCaptions(i, 0, textTrackQueue[i].captionData);\n eventBus.trigger(MediaPlayerEvents.TEXT_TRACK_ADDED);\n }\n\n //set current track index in textTrackQueue array\n setCurrentTrackIdx.call(this, defaultIndex);\n\n if (defaultIndex >= 0) {\n\n let onMetadataLoaded = function () {\n const track = getTrackByIdx(defaultIndex);\n if (track && track.renderingType === 'html') {\n checkVideoSize.call(this, track, true);\n }\n eventBus.off(MediaPlayerEvents.PLAYBACK_METADATA_LOADED, onMetadataLoaded, this);\n };\n\n eventBus.on(MediaPlayerEvents.PLAYBACK_METADATA_LOADED, onMetadataLoaded, this);\n\n for (let idx = 0; idx < textTrackQueue.length; idx++) {\n const videoTextTrack = getTrackByIdx(idx);\n if (videoTextTrack) {\n videoTextTrack.mode = (idx === defaultIndex && !dispatchForManualRendering) ? Constants.TEXT_SHOWING : Constants.TEXT_HIDDEN;\n videoTextTrack.manualMode = (idx === defaultIndex) ? Constants.TEXT_SHOWING : Constants.TEXT_HIDDEN;\n }\n }\n }\n\n eventBus.trigger(Events.TEXT_TRACKS_QUEUE_INITIALIZED, {\n index: currentTrackIdx,\n tracks: textTrackQueue,\n streamId: streamInfo.id\n });\n }\n\n function getVideoVisibleVideoSize(viewWidth, viewHeight, videoWidth, videoHeight, aspectRatio, use80Percent) {\n const viewAspectRatio = viewWidth / viewHeight;\n const videoAspectRatio = videoWidth / videoHeight;\n\n let videoPictureWidth = 0;\n let videoPictureHeight = 0;\n\n if (viewAspectRatio > videoAspectRatio) {\n videoPictureHeight = viewHeight;\n videoPictureWidth = (videoPictureHeight / videoHeight) * videoWidth;\n } else {\n videoPictureWidth = viewWidth;\n videoPictureHeight = (videoPictureWidth / videoWidth) * videoHeight;\n }\n\n let videoPictureXAspect = 0;\n let videoPictureYAspect = 0;\n let videoPictureWidthAspect = 0;\n let videoPictureHeightAspect = 0;\n const videoPictureAspect = videoPictureWidth / videoPictureHeight;\n\n if (videoPictureAspect > aspectRatio) {\n videoPictureHeightAspect = videoPictureHeight;\n videoPictureWidthAspect = videoPictureHeight * aspectRatio;\n } else {\n videoPictureWidthAspect = videoPictureWidth;\n videoPictureHeightAspect = videoPictureWidth / aspectRatio;\n }\n videoPictureXAspect = (viewWidth - videoPictureWidthAspect) / 2;\n videoPictureYAspect = (viewHeight - videoPictureHeightAspect) / 2;\n\n if (use80Percent) {\n return {\n x: videoPictureXAspect + (videoPictureWidthAspect * 0.1),\n y: videoPictureYAspect + (videoPictureHeightAspect * 0.1),\n w: videoPictureWidthAspect * 0.8,\n h: videoPictureHeightAspect * 0.8\n }; /* Maximal picture size in videos aspect ratio */\n } else {\n return {\n x: videoPictureXAspect,\n y: videoPictureYAspect,\n w: videoPictureWidthAspect,\n h: videoPictureHeightAspect\n }; /* Maximal picture size in videos aspect ratio */\n }\n }\n\n function checkVideoSize(track, forceDrawing) {\n const clientWidth = videoModel.getClientWidth();\n const clientHeight = videoModel.getClientHeight();\n const videoWidth = videoModel.getVideoWidth();\n const videoHeight = videoModel.getVideoHeight();\n const videoOffsetTop = videoModel.getVideoRelativeOffsetTop();\n const videoOffsetLeft = videoModel.getVideoRelativeOffsetLeft();\n\n if (videoWidth !== 0 && videoHeight !== 0) {\n\n let aspectRatio = videoWidth / videoHeight;\n let use80Percent = false;\n if (track.isFromCEA608) {\n // If this is CEA608 then use predefined aspect ratio\n aspectRatio = 3.5 / 3.0;\n use80Percent = true;\n }\n\n const realVideoSize = getVideoVisibleVideoSize.call(this, clientWidth, clientHeight, videoWidth, videoHeight, aspectRatio, use80Percent);\n\n const newVideoWidth = realVideoSize.w;\n const newVideoHeight = realVideoSize.h;\n const newVideoLeft = realVideoSize.x;\n const newVideoTop = realVideoSize.y;\n\n if (newVideoWidth != actualVideoWidth || newVideoHeight != actualVideoHeight || newVideoLeft != actualVideoLeft || newVideoTop != actualVideoTop || forceDrawing) {\n actualVideoLeft = newVideoLeft + videoOffsetLeft;\n actualVideoTop = newVideoTop + videoOffsetTop;\n actualVideoWidth = newVideoWidth;\n actualVideoHeight = newVideoHeight;\n\n if (captionContainer) {\n const containerStyle = captionContainer.style;\n if (containerStyle) {\n containerStyle.left = actualVideoLeft + 'px';\n containerStyle.top = actualVideoTop + 'px';\n containerStyle.width = actualVideoWidth + 'px';\n containerStyle.height = actualVideoHeight + 'px';\n containerStyle.zIndex = (fullscreenAttribute && document[fullscreenAttribute]) || displayCCOnTop ? topZIndex : null;\n eventBus.trigger(MediaPlayerEvents.CAPTION_CONTAINER_RESIZE);\n }\n }\n\n // Video view has changed size, so resize any active cues\n const activeCues = track.activeCues;\n if (activeCues) {\n const len = activeCues.length;\n for (let i = 0; i < len; ++i) {\n const cue = activeCues[i];\n cue.scaleCue(cue);\n }\n }\n }\n }\n }\n\n function _scaleCue(activeCue) {\n const videoWidth = actualVideoWidth;\n const videoHeight = actualVideoHeight;\n let key,\n replaceValue,\n valueFontSize,\n valueLineHeight,\n elements;\n\n if (activeCue.cellResolution) {\n const cellUnit = [videoWidth / activeCue.cellResolution[0], videoHeight / activeCue.cellResolution[1]];\n if (activeCue.linePadding) {\n for (key in activeCue.linePadding) {\n if (activeCue.linePadding.hasOwnProperty(key)) {\n const valueLinePadding = activeCue.linePadding[key];\n replaceValue = (valueLinePadding * cellUnit[0]).toString();\n // Compute the CellResolution unit in order to process properties using sizing (fontSize, linePadding, etc).\n const elementsSpan = document.getElementsByClassName('spanPadding');\n for (let i = 0; i < elementsSpan.length; i++) {\n elementsSpan[i].style.cssText = elementsSpan[i].style.cssText.replace(/(padding-left\\s*:\\s*)[\\d.,]+(?=\\s*px)/gi, '$1' + replaceValue);\n elementsSpan[i].style.cssText = elementsSpan[i].style.cssText.replace(/(padding-right\\s*:\\s*)[\\d.,]+(?=\\s*px)/gi, '$1' + replaceValue);\n }\n }\n }\n }\n\n if (activeCue.fontSize) {\n for (key in activeCue.fontSize) {\n if (activeCue.fontSize.hasOwnProperty(key)) {\n if (activeCue.fontSize[key][0] === '%') {\n valueFontSize = activeCue.fontSize[key][1] / 100;\n } else if (activeCue.fontSize[key][0] === 'c') {\n valueFontSize = activeCue.fontSize[key][1];\n }\n\n replaceValue = (valueFontSize * cellUnit[1]).toString();\n\n if (key !== 'defaultFontSize') {\n elements = document.getElementsByClassName(key);\n } else {\n elements = document.getElementsByClassName('paragraph');\n }\n\n for (let j = 0; j < elements.length; j++) {\n elements[j].style.cssText = elements[j].style.cssText.replace(/(font-size\\s*:\\s*)[\\d.,]+(?=\\s*px)/gi, '$1' + replaceValue);\n }\n }\n }\n\n if (activeCue.lineHeight) {\n for (key in activeCue.lineHeight) {\n if (activeCue.lineHeight.hasOwnProperty(key)) {\n if (activeCue.lineHeight[key][0] === '%') {\n valueLineHeight = activeCue.lineHeight[key][1] / 100;\n } else if (activeCue.fontSize[key][0] === 'c') {\n valueLineHeight = activeCue.lineHeight[key][1];\n }\n\n replaceValue = (valueLineHeight * cellUnit[1]).toString();\n elements = document.getElementsByClassName(key);\n for (let k = 0; k < elements.length; k++) {\n elements[k].style.cssText = elements[k].style.cssText.replace(/(line-height\\s*:\\s*)[\\d.,]+(?=\\s*px)/gi, '$1' + replaceValue);\n }\n }\n }\n }\n }\n }\n\n if (activeCue.isd) {\n let htmlCaptionDiv = document.getElementById(activeCue.cueID);\n if (htmlCaptionDiv) {\n captionContainer.removeChild(htmlCaptionDiv);\n }\n _renderCaption(activeCue);\n }\n }\n\n function _resolveImageSrc(cue, src) {\n const imsc1ImgUrnTester = /^(urn:)(mpeg:[a-z0-9][a-z0-9-]{0,31}:)(subs:)([0-9]+)$/;\n const smpteImgUrnTester = /^#(.*)$/;\n if (imsc1ImgUrnTester.test(src)) {\n const match = imsc1ImgUrnTester.exec(src);\n const imageId = parseInt(match[4], 10) - 1;\n const imageData = btoa(cue.images[imageId]);\n const imageSrc = 'data:image/png;base64,' + imageData;\n return imageSrc;\n } else if (smpteImgUrnTester.test(src)) {\n const match = smpteImgUrnTester.exec(src);\n const imageId = match[1];\n const imageSrc = 'data:image/png;base64,' + cue.embeddedImages[imageId];\n return imageSrc;\n } else {\n return src;\n }\n }\n\n function _renderCaption(cue) {\n if (captionContainer) {\n clearCaptionContainer.call(this);\n\n const finalCue = document.createElement('div');\n captionContainer.appendChild(finalCue);\n\n previousISDState = renderHTML(\n cue.isd,\n finalCue,\n function (src) { return _resolveImageSrc(cue, src) },\n captionContainer.clientHeight,\n captionContainer.clientWidth,\n settings.get().streaming.text.imsc.displayForcedOnlyMode,\n function (err) { logger.info('renderCaption :', err) /*TODO: add ErrorHandler management*/ },\n previousISDState,\n settings.get().streaming.text.imsc.enableRollUp\n );\n finalCue.id = cue.cueID;\n eventBus.trigger(MediaPlayerEvents.CAPTION_RENDERED, { captionDiv: finalCue, currentTrackIdx });\n }\n }\n\n // Check that a new cue immediately follows the previous cue\n function _areCuesAdjacent(cue, prevCue) {\n if (!prevCue) {\n return false;\n }\n // Check previous cue endTime with current cue startTime\n // (should we consider an epsilon margin? for example to get around rounding issues)\n return prevCue.endTime >= cue.startTime;\n }\n\n // Check if cue content is identical. If it is, extend the previous cue.\n function _extendLastCue(cue, prevCue) {\n if (!settings.get().streaming.text.extendSegmentedCues) {\n return false;\n }\n\n if (!_cuesContentAreEqual(prevCue, cue, CUE_PROPS_TO_COMPARE)) {\n return false;\n }\n\n prevCue.endTime = Math.max(prevCue.endTime, cue.endTime);\n return true;\n }\n\n function _cuesContentAreEqual(cue1, cue2, props) {\n for (let i = 0; i < props.length; i++) {\n const key = props[i];\n if (JSON.stringify(cue1[key]) !== JSON.stringify(cue2[key])) {\n return false;\n }\n }\n return true;\n }\n\n function _resolveImagesInContents(cue, contents) {\n if (!contents) {\n return;\n }\n contents.forEach(c => {\n if (c.kind && c.kind === 'image') {\n c.src = _resolveImageSrc(cue, c.src);\n }\n _resolveImagesInContents(cue, c.contents);\n });\n }\n\n /*\n * Add captions to track, store for later adding, or add captions added before\n */\n function addCaptions(trackIdx, timeOffset, captionData) {\n const track = getTrackByIdx(trackIdx);\n const dispatchForManualRendering = settings.get().streaming.text.dispatchForManualRendering;\n\n if (!track) {\n return;\n }\n\n if (!Array.isArray(captionData) || captionData.length === 0) {\n return;\n }\n\n for (let item = 0; item < captionData.length; item++) {\n let cue = null;\n const currentItem = captionData[item];\n\n track.cellResolution = currentItem.cellResolution;\n track.isFromCEA608 = currentItem.isFromCEA608;\n\n if (!isNaN(currentItem.start) && !isNaN(currentItem.end)) {\n if (dispatchForManualRendering) {\n cue = _handleCaptionEvents(currentItem, timeOffset);\n } else if (_isHTMLCue(currentItem) && captionContainer) {\n cue = _handleHtmlCaption(currentItem, timeOffset, track)\n } else if (currentItem.data) {\n cue = _handleNonHtmlCaption(currentItem, timeOffset, track)\n }\n }\n\n try {\n if (cue) {\n if (!cueInTrack(track, cue)) {\n if (settings.get().streaming.text.webvtt.customRenderingEnabled) {\n if (!track.manualCueList) {\n track.manualCueList = [];\n }\n track.manualCueList.push(cue);\n } else {\n // Handle adjacent cues\n let prevCue;\n if (track.cues && track.cues.length !== 0) {\n prevCue = track.cues[track.cues.length - 1];\n }\n\n if (_areCuesAdjacent(cue, prevCue)) {\n if (!_extendLastCue(cue, prevCue)) {\n /* If cues are adjacent but not identical (extended), let the render function of the next cue\n * clear up the captionsContainer so removal and appending are instantaneous.\n * Only do this for imsc subs (where isd is present).\n */\n if (prevCue.isd) {\n prevCue.onexit = function () { };\n }\n // If cues are added when the track is disabled they can still persist in memory\n if (track.mode !== Constants.TEXT_DISABLED) {\n track.addCue(cue);\n }\n }\n } else {\n if (track.mode !== Constants.TEXT_DISABLED) {\n track.addCue(cue);\n }\n }\n }\n }\n\n // Remove old cues\n const bufferToKeep = settings.get().streaming.buffer.bufferToKeep;\n const currentTime = videoModel.getTime();\n _deleteOutdatedTrackCues(track, 0, currentTime - bufferToKeep);\n } else {\n logger.error('Impossible to display subtitles. You might have missed setting a TTML rendering div via player.attachTTMLRenderingDiv(TTMLRenderingDiv)');\n }\n } catch (e) {\n // Edge crash, delete everything and start adding again\n // @see https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/11979877/\n _deleteTrackCues(track);\n track.addCue(cue);\n throw e;\n }\n }\n }\n\n function _handleCaptionEvents(currentItem, timeOffset) {\n let cue = _getCueInformation(currentItem, timeOffset)\n\n cue.onenter = function () {\n // HTML Tracks don't trigger the onexit event when a new cue is entered,\n // we need to manually trigger it\n if (_isHTMLCue(currentItem) && currentCaptionEventCue && currentCaptionEventCue.cueID !== cue.cueID) {\n _triggerCueExit(currentCaptionEventCue);\n }\n // We need to delete the type attribute to be able to dispatch via th event bus\n delete cue.type;\n\n currentCaptionEventCue = cue;\n _triggerCueEnter(cue);\n }\n\n cue.onexit = function () {\n _triggerCueExit(cue);\n currentCaptionEventCue = null;\n }\n\n return cue;\n }\n\n function _triggerCueEnter(cue) {\n eventBus.trigger(MediaPlayerEvents.CUE_ENTER, cue);\n }\n\n function _triggerCueExit(cue) {\n eventBus.trigger(MediaPlayerEvents.CUE_EXIT, {\n cueID: cue.cueID\n });\n }\n\n function _handleHtmlCaption(currentItem, timeOffset, track) {\n const self = this;\n let cue = _getCueInformation(currentItem, timeOffset)\n\n captionContainer.style.left = actualVideoLeft + 'px';\n captionContainer.style.top = actualVideoTop + 'px';\n captionContainer.style.width = actualVideoWidth + 'px';\n captionContainer.style.height = actualVideoHeight + 'px';\n\n cue.onenter = function () {\n if (track.mode === Constants.TEXT_SHOWING) {\n if (this.isd) {\n if (hasRequestAnimationFrame) {\n // Ensure everything in _renderCaption happens in the same frame\n requestAnimationFrame(() => _renderCaption(this));\n } else {\n _renderCaption(this)\n }\n logger.debug('Cue enter id:' + this.cueID);\n } else {\n captionContainer.appendChild(this.cueHTMLElement);\n _scaleCue.call(self, this);\n eventBus.trigger(MediaPlayerEvents.CAPTION_RENDERED, {\n captionDiv: this.cueHTMLElement,\n currentTrackIdx\n });\n }\n }\n };\n\n // For imsc subs, this could be reassigned to not do anything if there is a cue that immediately follows this one\n cue.onexit = function () {\n if (captionContainer) {\n const divs = captionContainer.childNodes;\n for (let i = 0; i < divs.length; ++i) {\n if (divs[i].id === this.cueID) {\n logger.debug('Cue exit id:' + divs[i].id);\n captionContainer.removeChild(divs[i]);\n --i;\n }\n }\n }\n };\n\n return cue;\n }\n\n function _handleNonHtmlCaption(currentItem, timeOffset, track) {\n let cue = _getCueInformation(currentItem, timeOffset)\n cue.isActive = false;\n\n if (currentItem.styles) {\n try {\n if (currentItem.styles.align !== undefined && 'align' in cue) {\n cue.align = currentItem.styles.align;\n }\n if (currentItem.styles.line !== undefined && 'line' in cue) {\n cue.line = currentItem.styles.line;\n }\n if (currentItem.styles.snapToLines !== undefined && 'snapToLines' in cue) {\n cue.snapToLines = currentItem.styles.snapToLines;\n }\n if (currentItem.styles.position !== undefined && 'position' in cue) {\n cue.position = currentItem.styles.position;\n }\n if (currentItem.styles.size !== undefined && 'size' in cue) {\n cue.size = currentItem.styles.size;\n }\n } catch (e) {\n logger.error(e);\n }\n }\n\n cue.onenter = function () {\n if (track.mode === Constants.TEXT_SHOWING) {\n eventBus.trigger(MediaPlayerEvents.CAPTION_RENDERED, { currentTrackIdx });\n }\n };\n\n return cue;\n }\n\n function _isHTMLCue(cue) {\n return (cue.type === 'html')\n }\n\n function _getCueInformation(currentItem, timeOffset) {\n if (_isHTMLCue(currentItem)) {\n return _getCueInformationForHtml(currentItem, timeOffset);\n }\n\n return _getCueInformationForNonHtml(currentItem, timeOffset);\n }\n\n function _getCueInformationForHtml(currentItem, timeOffset) {\n let cue = new Cue(currentItem.start + timeOffset, currentItem.end + timeOffset, '');\n cue.cueHTMLElement = currentItem.cueHTMLElement;\n cue.isd = currentItem.isd;\n cue.images = currentItem.images;\n cue.embeddedImages = currentItem.embeddedImages;\n cue.cueID = currentItem.cueID;\n cue.scaleCue = _scaleCue.bind(self);\n //useful parameters for cea608 subtitles, not for TTML one.\n cue.cellResolution = currentItem.cellResolution;\n cue.lineHeight = currentItem.lineHeight;\n cue.linePadding = currentItem.linePadding;\n cue.fontSize = currentItem.fontSize;\n\n // Resolve images sources\n if (cue.isd) {\n _resolveImagesInContents(cue, cue.isd.contents);\n }\n\n return cue;\n }\n\n function _getCueInformationForNonHtml(currentItem, timeOffset) {\n let cue = new Cue(currentItem.start - timeOffset, currentItem.end - timeOffset, currentItem.data);\n cue.cueID = `${cue.startTime}_${cue.endTime}`;\n return cue;\n }\n\n function manualCueProcessing(time) {\n const activeTracks = _getManualActiveTracks();\n\n if (activeTracks && activeTracks.length > 0) {\n const targetTrack = activeTracks[0];\n const cues = targetTrack.manualCueList;\n\n if (cues && cues.length > 0) {\n cues.forEach((cue) => {\n // Render cue if target time is reached and not in active state\n if (cue.startTime <= time && cue.endTime >= time && !cue.isActive) {\n cue.isActive = true;\n if (settings.get().streaming.text.dispatchForManualRendering) {\n _triggerCueEnter(cue);\n } else {\n // eslint-disable-next-line no-undef\n WebVTT.processCues(window, [cue], vttCaptionContainer, cue.cueID);\n }\n } else if (cue.isActive && (cue.startTime > time || cue.endTime < time)) {\n cue.isActive = false;\n if (settings.get().streaming.text.dispatchForManualRendering) {\n _triggerCueExit(cue);\n } else {\n _removeManualCue(cue);\n }\n }\n })\n }\n }\n }\n\n function _removeManualCue(cue) {\n if (vttCaptionContainer) {\n const divs = vttCaptionContainer.childNodes;\n for (let i = 0; i < divs.length; ++i) {\n if (divs[i].id === cue.cueID) {\n vttCaptionContainer.removeChild(divs[i]);\n --i;\n }\n }\n }\n }\n\n function disableManualTracks() {\n const activeTracks = _getManualActiveTracks();\n\n if (activeTracks && activeTracks.length > 0) {\n const targetTrack = activeTracks[0];\n const cues = targetTrack.manualCueList;\n\n\n if (cues && cues.length > 0) {\n cues.forEach((cue) => {\n if (cue.isActive) {\n cue.isActive = false;\n if (settings.get().streaming.text.dispatchForManualRendering) {\n _triggerCueExit(cue);\n } else if (vttCaptionContainer) {\n const divs = vttCaptionContainer.childNodes;\n for (let i = 0; i < divs.length; ++i) {\n if (divs[i].id === cue.cueID) {\n vttCaptionContainer.removeChild(divs[i]);\n --i;\n }\n }\n }\n }\n })\n }\n }\n }\n\n function _getManualActiveTracks() {\n const tracks = videoModel.getTextTracks();\n const activeTracks = []\n\n for (const track of tracks) {\n if (track.manualMode === Constants.TEXT_SHOWING) {\n activeTracks.push(track);\n }\n }\n return activeTracks;\n }\n\n function getTrackByIdx(idx) {\n return idx >= 0 && textTrackQueue[idx] ?\n videoModel.getTextTrack(textTrackQueue[idx].kind, textTrackQueue[idx].id, textTrackQueue[idx].lang, textTrackQueue[idx].isTTML, textTrackQueue[idx].isEmbedded) : null;\n }\n\n function getCurrentTrackIdx() {\n return currentTrackIdx;\n }\n\n function getTrackIdxForId(trackId) {\n let idx = -1;\n for (let i = 0; i < textTrackQueue.length; i++) {\n if (textTrackQueue[i].id === trackId) {\n idx = i;\n break;\n }\n }\n\n return idx;\n }\n\n function setCurrentTrackIdx(idx) {\n if (idx === currentTrackIdx) {\n return;\n }\n currentTrackIdx = idx;\n const track = getTrackByIdx(currentTrackIdx);\n setCueStyleOnTrack.call(this, track);\n\n if (videoSizeCheckInterval) {\n clearInterval(videoSizeCheckInterval);\n videoSizeCheckInterval = null;\n }\n\n if (track && track.renderingType === 'html') {\n checkVideoSize.call(this, track, true);\n if (window.ResizeObserver) {\n resizeObserver = new window.ResizeObserver(() => {\n checkVideoSize.call(this, track, true);\n });\n resizeObserver.observe(videoModel.getElement());\n } else {\n videoSizeCheckInterval = setInterval(checkVideoSize.bind(this, track), 500);\n }\n }\n }\n\n function setCueStyleOnTrack(track) {\n clearCaptionContainer.call(this);\n if (track) {\n if (track.renderingType === 'html') {\n setNativeCueStyle.call(this);\n } else {\n removeNativeCueStyle.call(this);\n }\n } else {\n removeNativeCueStyle.call(this);\n }\n }\n\n function cueInTrack(track, cue) {\n if (!track.cues) return false;\n for (let i = 0; i < track.cues.length; i++) {\n if ((track.cues[i].startTime === cue.startTime) &&\n (track.cues[i].endTime === cue.endTime)) {\n return true;\n }\n }\n return false;\n }\n\n function cueInRange(cue, start, end, strict = true) {\n if (!cue) {\n return false\n }\n return (isNaN(start) || (strict ? cue.startTime : cue.endTime) >= start) && (isNaN(end) || (strict ? cue.endTime : cue.startTime) <= end);\n }\n\n function _deleteOutdatedTrackCues(track, start, end) {\n\n if (end < start) {\n return;\n }\n\n if (track && (track.cues || track.manualCueList)) {\n const mode = track.cues && track.cues.length > 0 ? 'native' : 'custom';\n const cues = mode === 'native' ? track.cues : track.manualCueList;\n\n if (!cues || cues.length === 0) {\n return;\n }\n const lastIdx = cues.length - 1;\n\n for (let r = lastIdx; r >= 0; r--) {\n if (cueInRange(cues[r], start, end, true) && !_isCueActive(cues[r])) {\n if (mode === 'native') {\n track.removeCue(cues[r]);\n } else {\n _removeManualCue(cues[r]);\n delete track.manualCueList[r]\n }\n }\n }\n }\n }\n\n function _deleteTrackCues(track, start, end, strict = true) {\n if (track && (track.cues || track.manualCueList)) {\n const mode = track.cues && track.cues.length > 0 ? 'native' : 'custom';\n const cues = mode === 'native' ? track.cues : track.manualCueList;\n\n if (!cues || cues.length === 0) {\n return;\n }\n const lastIdx = cues.length - 1;\n\n for (let r = lastIdx; r >= 0; r--) {\n if (cueInRange(cues[r], start, end, strict)) {\n if (mode === 'native') {\n if (cues[r].onexit) {\n cues[r].onexit();\n }\n track.removeCue(cues[r]);\n } else {\n _removeManualCue(cues[r]);\n delete track.manualCueList[r]\n }\n }\n }\n }\n }\n\n function _isCueActive(cue) {\n const currentTime = videoModel.getTime();\n\n return cue.startTime >= currentTime && cue.endTime <= currentTime\n }\n\n function deleteCuesFromTrackIdx(trackIdx, start, end) {\n const track = getTrackByIdx(trackIdx);\n if (track) {\n _deleteTrackCues(track, start, end);\n }\n }\n\n function deleteAllTextTracks() {\n const ln = nativeTrackElementArr ? nativeTrackElementArr.length : 0;\n for (let i = 0; i < ln; i++) {\n const track = getTrackByIdx(i);\n if (track) {\n _deleteTrackCues.call(this, track, streamInfo.start, streamInfo.start + streamInfo.duration, false);\n }\n }\n nativeTrackElementArr = [];\n textTrackQueue = [];\n if (videoSizeCheckInterval) {\n clearInterval(videoSizeCheckInterval);\n videoSizeCheckInterval = null;\n }\n if (resizeObserver && videoModel) {\n resizeObserver.unobserve(videoModel.getElement());\n resizeObserver = null;\n }\n currentTrackIdx = -1;\n clearCaptionContainer.call(this);\n }\n\n /* Set native cue style to transparent background to avoid it being displayed. */\n function setNativeCueStyle() {\n let styleElement = document.getElementById('native-cue-style');\n if (styleElement) {\n return; //Already set\n }\n\n styleElement = document.createElement('style');\n styleElement.id = 'native-cue-style';\n document.head.appendChild(styleElement);\n const stylesheet = styleElement.sheet;\n const video = videoModel.getElement();\n try {\n if (video) {\n if (video.id) {\n stylesheet.insertRule('#' + video.id + '::cue {background: transparent}', 0);\n } else if (video.classList.length !== 0) {\n stylesheet.insertRule('.' + video.className + '::cue {background: transparent}', 0);\n } else {\n stylesheet.insertRule('video::cue {background: transparent}', 0);\n }\n }\n } catch (e) {\n logger.info('' + e.message);\n }\n }\n\n /* Remove the extra cue style with transparent background for native cues. */\n function removeNativeCueStyle() {\n const styleElement = document.getElementById('native-cue-style');\n if (styleElement) {\n document.head.removeChild(styleElement);\n }\n }\n\n function clearCaptionContainer() {\n if (captionContainer) {\n while (captionContainer.firstChild) {\n captionContainer.removeChild(captionContainer.firstChild);\n }\n }\n }\n\n function setModeForTrackIdx(idx, mode) {\n const track = getTrackByIdx(idx);\n if (track && track.mode !== mode) {\n track.mode = mode;\n }\n if (track && track.manualMode !== mode) {\n track.manualMode = mode;\n }\n }\n\n function getCurrentTrackInfo() {\n return textTrackQueue[currentTrackIdx];\n }\n\n instance = {\n initialize,\n getStreamId,\n addTextTrack,\n addCaptions,\n createTracks,\n getCurrentTrackIdx,\n setCurrentTrackIdx,\n getTrackIdxForId,\n getCurrentTrackInfo,\n setModeForTrackIdx,\n deleteCuesFromTrackIdx,\n deleteAllTextTracks,\n manualCueProcessing,\n disableManualTracks\n };\n\n setup();\n\n return instance;\n}\n\nTextTracks.__dashjs_factory_name = 'TextTracks';\nexport default FactoryMaker.getClassFactory(TextTracks);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport FactoryMaker from '../../core/FactoryMaker';\nimport Debug from '../../core/Debug';\n\nconst WEBVTT = 'WEBVTT';\n\nfunction VTTParser() {\n const context = this.context;\n\n let instance,\n logger,\n regExNewLine,\n regExToken,\n regExWhiteSpace,\n regExWhiteSpaceWordBoundary;\n\n function setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n regExNewLine = /(?:\\r\\n|\\r|\\n)/gm;\n regExToken = /-->/;\n regExWhiteSpace = /(^[\\s]+|[\\s]+$)/g;\n regExWhiteSpaceWordBoundary = /\\s\\b/g;\n }\n\n function parse(data) {\n const captionArray = [];\n let len,\n lastStartTime;\n\n if (!data) {\n return captionArray;\n }\n\n data = data.split( regExNewLine );\n len = data.length;\n lastStartTime = -1;\n\n for (let i = 0 ; i < len; i++) {\n let item = data[i];\n\n if (item.length > 0 && item !== WEBVTT) {\n if (item.match(regExToken)) {\n const attributes = parseItemAttributes(item);\n const cuePoints = attributes.cuePoints;\n const styles = attributes.styles;\n const text = getSublines(data, i + 1);\n const startTime = convertCuePointTimes(cuePoints[0].replace(regExWhiteSpace, ''));\n const endTime = convertCuePointTimes(cuePoints[1].replace(regExWhiteSpace, ''));\n\n if ((!isNaN(startTime) && !isNaN(endTime)) && startTime >= lastStartTime && endTime > startTime) {\n if (text !== '') {\n lastStartTime = startTime;\n //TODO Make VO external so other parsers can use.\n captionArray.push({\n start: startTime,\n end: endTime,\n data: text,\n styles: styles\n });\n }\n else {\n logger.error('Skipping cue due to empty/malformed cue text');\n }\n }\n else {\n logger.error('Skipping cue due to incorrect cue timing');\n }\n }\n }\n }\n\n return captionArray;\n }\n\n function convertCuePointTimes(time) {\n const timeArray = time.split(':');\n const len = timeArray.length - 1;\n\n time = parseInt( timeArray[len - 1], 10 ) * 60 + parseFloat( timeArray[len]);\n\n if ( len === 2 ) {\n time += parseInt( timeArray[0], 10 ) * 3600;\n }\n\n return time;\n }\n\n function parseItemAttributes(data) {\n const vttCuePoints = data.split(regExToken);\n const arr = vttCuePoints[1].split(regExWhiteSpaceWordBoundary);\n arr.shift(); //remove first array index it is empty...\n vttCuePoints[1] = arr[0];\n arr.shift();\n return {cuePoints: vttCuePoints, styles: getCaptionStyles(arr)};\n }\n\n function getCaptionStyles(arr) {\n const styleObject = {};\n arr.forEach(function (element) {\n if (element.split(/:/).length > 1) {\n let val = element.split(/:/)[1];\n let isPercentage = false;\n if (val && val.search(/%/) != -1) {\n isPercentage = true;\n val = parseInt(val.replace(/%/, ''), 10);\n }\n if (element.match(/align/) || element.match(/A/)) {\n styleObject.align = val;\n }\n if (element.match(/line/) || element.match(/L/) ) {\n styleObject.line = val === 'auto' ? val : parseInt(val, 10);\n if (isPercentage) {\n styleObject.snapToLines = false;\n }\n }\n if (element.match(/position/) || element.match(/P/) ) {\n styleObject.position = val;\n }\n if (element.match(/size/) || element.match(/S/)) {\n styleObject.size = val;\n }\n }\n });\n\n return styleObject;\n }\n\n /*\n * VTT can have multiple lines to display per cuepoint.\n */\n function getSublines(data, idx) {\n let i = idx;\n\n let subline = '';\n let lineData = '';\n let lineCount;\n\n while (data[i] !== '' && i < data.length) {\n i++;\n }\n\n lineCount = i - idx;\n if (lineCount > 1) {\n for (let j = 0; j < lineCount; j++) {\n lineData = data[(idx + j)];\n if (!lineData.match(regExToken)) {\n subline += lineData;\n if (j !== lineCount - 1) {\n subline += '\\n';\n }\n }\n else {\n // caption text should not have '-->' in it\n subline = '';\n break;\n }\n }\n } else {\n lineData = data[idx];\n if (!lineData.match(regExToken))\n subline = lineData;\n }\n return subline;\n }\n\n instance = {\n parse: parse,\n getCaptionStyles\n };\n\n setup();\n return instance;\n}\nVTTParser.__dashjs_factory_name = 'VTTParser';\nexport default FactoryMaker.getSingletonFactory(VTTParser);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport FactoryMaker from '../../core/FactoryMaker';\n\nfunction VttCustomRenderingParser() {\n\n let instance,\n vttjs;\n\n function setup() {\n try {\n if (window && window.WebVTT && window.WebVTT.Parser) {\n vttjs = new window.WebVTT.Parser(\n window,\n window.vttjs,\n window.WebVTT.StringDecoder()\n );\n }\n }\n catch(e) {\n\n }\n }\n\n function parse(data) {\n let cues = [];\n vttjs.oncue = function (cue) {\n cue.start = cue.startTime;\n cue.end = cue.endTime;\n cue.data = cue.text;\n cue.styles = {\n align: cue.align,\n line: cue.line,\n position: cue.position,\n size: cue.size\n }\n cues.push(cue);\n };\n vttjs.parse(data);\n\n return cues;\n }\n\n instance = {\n parse\n };\n\n setup();\n return instance;\n}\n\nVttCustomRenderingParser.__dashjs_factory_name = 'VttCustomRenderingParser';\nexport default FactoryMaker.getSingletonFactory(VttCustomRenderingParser);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport FactoryMaker from '../../core/FactoryMaker';\nimport Debug from '../../core/Debug';\nimport EventBus from '../../core/EventBus';\nimport Events from '../../core/events/Events';\nimport {fromXML, generateISD} from 'imsc';\nimport MediaPlayerEvents from '../MediaPlayerEvents';\nimport ConformanceViolationConstants from '../constants/ConformanceViolationConstants';\n\nfunction TTMLParser() {\n\n const context = this.context;\n const eventBus = EventBus(context).getInstance();\n\n /*\n * This TTML parser follows \"EBU-TT-D SUBTITLING DISTRIBUTION FORMAT - tech3380\" spec - https://tech.ebu.ch/docs/tech/tech3380.pdf.\n * */\n let instance,\n logger;\n\n let cueCounter = 0; // Used to give every cue a unique ID.\n\n function setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n }\n\n function getCueID() {\n const id = 'cue_TTML_' + cueCounter;\n cueCounter++;\n return id;\n }\n\n /**\n * Parse the raw data and process it to return the HTML element representing the cue.\n * Return the region to be processed and controlled (hide/show) by the caption controller.\n * @param {string} data - raw data received from the TextSourceBuffer\n * @param {number} offsetTime - offset time to apply to cue time\n * @param {integer} startTimeSegment - startTime for the current segment\n * @param {integer} endTimeSegment - endTime for the current segment\n * @param {array} images - images array referenced by subs MP4 box\n * @returns {array} captionArray\n */\n function parse(data, offsetTime, startTimeSegment, endTimeSegment, images) {\n let errorMsg = '';\n const captionArray = [];\n let startTime,\n endTime,\n i;\n\n const content = {};\n\n const embeddedImages = {};\n let currentImageId = '';\n let accumulated_image_data = '';\n let metadataHandler = {\n\n onOpenTag: function (ns, name, attrs) {\n // cope with existing non-compliant content\n if (attrs[' imagetype'] && !attrs[' imageType']) {\n eventBus.trigger(MediaPlayerEvents.CONFORMANCE_VIOLATION, {\n level: ConformanceViolationConstants.LEVELS.ERROR,\n event: ConformanceViolationConstants.EVENTS.NON_COMPLIANT_SMPTE_IMAGE_ATTRIBUTE\n });\n attrs[' imageType'] = attrs[' imagetype'];\n }\n\n if (name === 'image' &&\n (ns === 'http://www.smpte-ra.org/schemas/2052-1/2010/smpte-tt' ||\n ns === 'http://www.smpte-ra.org/schemas/2052-1/2013/smpte-tt')) {\n if (!attrs[' imageType'] || attrs[' imageType'].value !== 'PNG') {\n logger.warn('smpte-tt imageType != PNG. Discarded');\n return;\n }\n currentImageId = attrs['http://www.w3.org/XML/1998/namespace id'].value;\n }\n },\n\n onCloseTag: function () {\n if (currentImageId) {\n embeddedImages[currentImageId] = accumulated_image_data.trim();\n }\n accumulated_image_data = '';\n currentImageId = '';\n },\n\n onText: function (contents) {\n if (currentImageId) {\n accumulated_image_data = accumulated_image_data + contents;\n }\n }\n };\n\n if (!data) {\n errorMsg = 'no ttml data to parse';\n throw new Error(errorMsg);\n }\n\n content.data = data;\n\n eventBus.trigger(Events.TTML_TO_PARSE, content);\n\n let imsc1doc = fromXML(content.data, function (msg) {\n errorMsg = msg;\n }, metadataHandler);\n\n eventBus.trigger(Events.TTML_PARSED, { ttmlString: content.data, ttmlDoc: imsc1doc });\n\n const mediaTimeEvents = imsc1doc.getMediaTimeEvents();\n\n for (i = 0; i < mediaTimeEvents.length; i++) {\n let isd = generateISD(imsc1doc, mediaTimeEvents[i], function (error) {\n errorMsg = error;\n });\n\n if (isd.contents.some(topLevelContents => topLevelContents.contents.length)) {\n //be sure that mediaTimeEvents values are in the mp4 segment time ranges.\n startTime = mediaTimeEvents[i] + offsetTime;\n endTime = mediaTimeEvents[i + 1] + offsetTime;\n\n if (startTime < endTime) {\n captionArray.push({\n start: startTime,\n end: endTime,\n type: 'html',\n cueID: getCueID(),\n isd: isd,\n images: images,\n embeddedImages: embeddedImages\n });\n }\n }\n }\n\n if (errorMsg !== '') {\n logger.error(errorMsg);\n throw new Error(errorMsg);\n }\n\n return captionArray;\n }\n\n instance = {\n parse: parse\n };\n\n setup();\n return instance;\n}\n\nTTMLParser.__dashjs_factory_name = 'TTMLParser';\nexport default FactoryMaker.getSingletonFactory(TTMLParser);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2024, BBC.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of BBC nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport Constants from '../constants/Constants';\nimport FactoryMaker from '../../core/FactoryMaker';\nimport URLUtils from '../utils/URLUtils';\nimport EventBus from '../../core/EventBus';\nimport MediaPlayerEvents from '../MediaPlayerEvents';\nimport Debug from '../../core/Debug';\n\nfunction DVBFonts(config) {\n\n let context = this.context;\n const eventBus = EventBus(context).getInstance();\n const urlUtils = URLUtils(context).getInstance();\n const adapter = config.adapter;\n const baseURLController = config.baseURLController;\n\n const FONT_DOWNLOAD_STATUS = {\n ERROR: 'error',\n LOADED: 'loaded',\n UNLOADED: 'unloaded'\n };\n\n let instance,\n logger,\n dvbFontList;\n\n function setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n resetInitialSettings();\n }\n\n /**\n * Add any dvb fonts from a single track to the dvbFontList\n * @param {object} track - A text track\n * @param {string} streamId - Id of current stream\n * @private\n */\n function _addFontFromTrack(track, streamId) {\n let asBaseUrl;\n let isEssential = false;\n let dvbFontProps;\n\n // If there is a baseurl in the manifest resolve against a representation inside the current adaptation set\n if (baseURLController.resolve()) {\n const reps = adapter.getVoRepresentations(track);\n if (reps && reps.length > 0) {\n asBaseUrl = baseURLController.resolve(reps[0].path).url\n }\n }\n\n const essentialTags = track.essentialPropertiesAsArray.filter(tag =>\n (tag.schemeIdUri && tag.schemeIdUri === Constants.FONT_DOWNLOAD_DVB_SCHEME)\n );\n const supplementalTags = track.supplementalPropertiesAsArray.filter(tag =>\n (tag.schemeIdUri && tag.schemeIdUri === Constants.FONT_DOWNLOAD_DVB_SCHEME)\n );\n\n // When it comes to the property descriptors it's Essential OR Supplementary, with Essential taking preference\n if (essentialTags.length > 0) {\n isEssential = true;\n dvbFontProps = essentialTags;\n } else {\n dvbFontProps = supplementalTags;\n }\n\n dvbFontProps.forEach(attrs => {\n if (_hasMandatoryDvbFontAttributes(attrs)) {\n let resolvedUrl = _resolveFontUrl(attrs.dvbUrl, asBaseUrl);\n dvbFontList.push({\n fontFamily: attrs.dvbFontFamily,\n url: resolvedUrl,\n mimeType: attrs.dvbMimeType,\n trackId: track.id,\n streamId,\n isEssential,\n status: FONT_DOWNLOAD_STATUS.UNLOADED,\n fontFace: new FontFace(\n attrs.dvbFontFamily,\n `url(${resolvedUrl})`,\n { display: 'swap' }\n )\n });\n }\n });\n }\n\n /**\n * Clean up dvb font downloads\n * @private\n */\n function _cleanUpDvbCustomFonts() {\n for (const font of dvbFontList) {\n let deleted = document.fonts.delete(font.fontFace);\n logger.debug(`Removal of fontFamily: ${font.fontFamily} was ${deleted ? 'successful' : 'unsuccessful'}`);\n }\n }\n\n /**\n * Check the attributes of a supplemental or essential property descriptor to establish if\n * it has the mandatory values for a dvb font download\n * @param {object} attrs - property descriptor attributes\n * @returns {boolean} true if mandatory attributes present\n * @private\n */\n function _hasMandatoryDvbFontAttributes(attrs) {\n return !!((attrs.value && attrs.value === '1') &&\n (attrs.dvbUrl && attrs.dvbUrl.length > 0) &&\n (attrs.dvbFontFamily && attrs.dvbFontFamily.length > 0) &&\n (attrs.dvbMimeType && (attrs.dvbMimeType === Constants.OFF_MIMETYPE || attrs.dvbMimeType === Constants.WOFF_MIMETYPE)));\n }\n\n /**\n * Resolves a given font download URL.\n * @param {string} fontUrl - URL as in the 'dvb:url' property\n * @param {string} baseUrl - BaseURL for Adaptation Set\n * @returns {string} resolved URL\n * @private\n */\n function _resolveFontUrl(fontUrl, baseUrl) {\n if (urlUtils.isPathAbsolute(fontUrl)) {\n return fontUrl;\n } else if (urlUtils.isRelative(fontUrl)) {\n if (baseUrl) {\n return urlUtils.resolve(fontUrl, baseUrl);\n } else {\n return urlUtils.resolve(fontUrl);\n }\n } else {\n return fontUrl;\n }\n }\n\n /**\n * Updates the status of a given dvb font relative to whether it is loaded in the browser\n * or if the download has failed\n * @param {number} index - Index of font in dvbFontList\n * @param {string} newStatus - Status value to update. Property of FONT_DOWNLOAD_STATUS\n * @private\n */\n function _updateFontStatus(index, newStatus) {\n const font = dvbFontList[index];\n dvbFontList[index] = { ...font, status: newStatus };\n }\n\n /**\n * Adds all fonts to the dvb font list from all tracks\n * @param {array} tracks - All text tracks\n * @param {string} streamId - Id of the stream\n */\n function addFontsFromTracks(tracks, streamId) {\n if (tracks && Array.isArray(tracks) && streamId) {\n for (let i = 0; i < tracks.length; i++) {\n let track = tracks[i];\n _addFontFromTrack(track, streamId);\n }\n }\n }\n\n /**\n * Initiate the download of a dvb custom font.\n * The browser will neatly handle duplicate fonts\n */\n function downloadFonts() {\n for (let i = 0; i < dvbFontList.length; i++) {\n let font = dvbFontList[i];\n\n document.fonts.add(font.fontFace);\n eventBus.trigger(MediaPlayerEvents.DVB_FONT_DOWNLOAD_ADDED, font);\n\n font.fontFace.load().then(\n () => {\n _updateFontStatus(i, FONT_DOWNLOAD_STATUS.LOADED);\n eventBus.trigger(MediaPlayerEvents.DVB_FONT_DOWNLOAD_COMPLETE, font);\n },\n (err) => {\n _updateFontStatus(i, FONT_DOWNLOAD_STATUS.ERROR);\n logger.debug('Font download error: ', err);\n eventBus.trigger(MediaPlayerEvents.DVB_FONT_DOWNLOAD_FAILED, font);\n }\n );\n }\n }\n\n /**\n * Returns current list of all known DVB Fonts\n * @returns {array} dvbFontList\n */\n function getFonts() {\n return dvbFontList;\n }\n\n /**\n * Returns dvbFonts relative to a track given a trackId\n * @param {number} - TrackId\n * @returns {array} filtered DVBFontList\n */\n function getFontsForTrackId(trackId) {\n return dvbFontList.filter(font =>\n (font.trackId && font.trackId === trackId)\n );\n }\n\n function resetInitialSettings() {\n dvbFontList = [];\n }\n\n /** Reset DVBFonts instance */\n function reset() {\n _cleanUpDvbCustomFonts();\n resetInitialSettings();\n }\n\n instance = {\n addFontsFromTracks,\n downloadFonts,\n getFonts,\n getFontsForTrackId,\n reset\n };\n setup();\n return instance;\n}\n\nDVBFonts.__dashjs_factory_name = 'DVBFonts';\nexport default FactoryMaker.getClassFactory(DVBFonts);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport Constants from '../constants/Constants';\nimport FactoryMaker from '../../core/FactoryMaker';\nimport TextSourceBuffer from './TextSourceBuffer';\nimport TextTracks from './TextTracks';\nimport VTTParser from '../utils/VTTParser';\nimport VttCustomRenderingParser from '../utils/VttCustomRenderingParser';\nimport TTMLParser from '../utils/TTMLParser';\nimport Debug from '../../core/Debug';\nimport EventBus from '../../core/EventBus';\nimport Events from '../../core/events/Events';\nimport MediaPlayerEvents from '../../streaming/MediaPlayerEvents';\nimport {checkParameterType} from '../utils/SupervisorTools';\nimport DVBFonts from './DVBFonts';\n\nfunction TextController(config) {\n\n let context = this.context;\n\n const adapter = config.adapter;\n const errHandler = config.errHandler;\n const manifestModel = config.manifestModel;\n const mediaController = config.mediaController;\n const baseURLController = config.baseURLController;\n const videoModel = config.videoModel;\n const settings = config.settings;\n\n let instance,\n streamData,\n textSourceBuffers,\n textTracks,\n vttParser,\n vttCustomRenderingParser,\n ttmlParser,\n eventBus,\n allTracksAreDisabled,\n forceTextStreaming,\n textTracksAdded,\n disableTextBeforeTextTracksAdded,\n dvbFonts,\n logger;\n\n function setup() {\n forceTextStreaming = false;\n textTracksAdded = false;\n disableTextBeforeTextTracksAdded = false;\n\n vttParser = VTTParser(context).getInstance();\n vttCustomRenderingParser = VttCustomRenderingParser(context).getInstance();\n ttmlParser = TTMLParser(context).getInstance();\n eventBus = EventBus(context).getInstance();\n logger = Debug(context).getInstance().getLogger(instance);\n\n resetInitialSettings();\n }\n\n function initialize() {\n dvbFonts = DVBFonts(context).create({\n adapter,\n baseURLController,\n });\n eventBus.on(Events.TEXT_TRACKS_QUEUE_INITIALIZED, _onTextTracksAdded, instance);\n eventBus.on(Events.DVB_FONT_DOWNLOAD_FAILED, _onFontDownloadFailure, instance);\n eventBus.on(Events.DVB_FONT_DOWNLOAD_COMPLETE, _onFontDownloadSuccess, instance);\n if (settings.get().streaming.text.webvtt.customRenderingEnabled) {\n eventBus.on(Events.PLAYBACK_TIME_UPDATED, _onPlaybackTimeUpdated, instance);\n eventBus.on(Events.PLAYBACK_SEEKING, _onPlaybackSeeking, instance);\n }\n }\n\n function initializeForStream(streamInfo) {\n const streamId = streamInfo.id;\n const tracks = TextTracks(context).create({\n videoModel,\n settings,\n streamInfo\n });\n tracks.initialize();\n textTracks[streamId] = tracks;\n\n const textSourceBuffer = TextSourceBuffer(context).create({\n errHandler,\n adapter,\n dvbFonts,\n manifestModel,\n mediaController,\n videoModel,\n textTracks: tracks,\n vttParser,\n vttCustomRenderingParser,\n ttmlParser,\n streamInfo,\n settings\n });\n textSourceBuffer.initialize();\n textSourceBuffers[streamId] = textSourceBuffer;\n\n streamData[streamId] = {};\n streamData[streamId].lastEnabledIndex = -1;\n }\n\n /**\n * All media infos have been added. Start creating the track objects\n * @param {object} streamInfo\n */\n function createTracks(streamInfo) {\n const streamId = streamInfo.id;\n\n if (!textTracks[streamId]) {\n return;\n }\n textTracks[streamId].createTracks();\n }\n\n /**\n * Adds the new mediaInfo objects to the textSourceBuffer.\n * @param {object} streamInfo\n * @param {array} mInfos\n * @param {string|null} mimeType\n * @param {object} fragmentModel\n */\n function addMediaInfosToBuffer(streamInfo, type, mInfos, fragmentModel = null) {\n const streamId = streamInfo.id;\n\n if (!textSourceBuffers[streamId]) {\n return;\n }\n textSourceBuffers[streamId].addMediaInfos(type, mInfos, fragmentModel);\n }\n\n function getTextSourceBuffer(streamInfo) {\n const streamId = streamInfo.id;\n\n if (textSourceBuffers && textSourceBuffers[streamId]) {\n return textSourceBuffers[streamId];\n }\n }\n\n function getAllTracksAreDisabled() {\n return allTracksAreDisabled;\n }\n\n function addEmbeddedTrack(streamInfo, mediaInfo) {\n const streamId = streamInfo.id;\n\n if (!textSourceBuffers[streamId]) {\n return;\n }\n\n textSourceBuffers[streamId].addEmbeddedTrack(mediaInfo);\n }\n\n /**\n * Event that is triggered if a font download of a font described in an essential property descriptor\n * tag fails.\n * @param {FontInfo} font - font information\n * @private\n */\n function _onFontDownloadFailure(font) {\n logger.error(`Could not download ${font.isEssential ? 'an essential' : 'a'} font - fontFamily: ${font.fontFamily}, url: ${font.url}`);\n if (font.isEssential) {\n let idx = textTracks[font.streamId].getTrackIdxForId(font.trackId);\n textTracks[font.streamId].setModeForTrackIdx(idx, Constants.TEXT_DISABLED);\n }\n };\n\n /**\n * Set a font with an essential property\n * @private\n */\n function _onFontDownloadSuccess(font) {\n logger.debug(`Successfully downloaded ${font.isEssential ? 'an essential' : 'a'} font - fontFamily: ${font.fontFamily}, url: ${font.url}`);\n if (font.isEssential) {\n let idx = textTracks[font.streamId].getTrackIdxForId(font.trackId);\n if (idx === textTracks[font.streamId].getCurrentTrackIdx()) {\n textTracks[font.streamId].setModeForTrackIdx(idx, Constants.TEXT_SHOWING);\n } else {\n textTracks[font.streamId].setModeForTrackIdx(idx, Constants.TEXT_HIDDEN);\n }\n }\n }\n\n function _onTextTracksAdded(e) {\n let tracks = e.tracks;\n let index = e.index;\n const streamId = e.streamId;\n\n const textDefaultEnabled = settings.get().streaming.text.defaultEnabled;\n\n if ((textDefaultEnabled === false && !isTextEnabled()) || disableTextBeforeTextTracksAdded) {\n // disable text at startup if explicitly configured with setTextDefaultEnabled(false) or if there is no defaultSettings (configuration or from domStorage)\n setTextTrack(streamId, -1);\n } else {\n const currentTrack = mediaController.getCurrentTrackFor(Constants.TEXT, streamId);\n if (currentTrack) {\n const defaultSettings = {\n lang: currentTrack.lang,\n role: currentTrack.roles[0],\n index: currentTrack.index,\n codec: currentTrack.codec,\n accessibility: currentTrack.accessibility[0]\n };\n tracks.some((item, idx) => {\n // matchSettings is compatible with setTextDefaultLanguage and setInitialSettings\n if (mediaController.matchSettings(defaultSettings, item)) {\n setTextTrack(streamId, idx);\n index = idx;\n return true;\n }\n });\n }\n allTracksAreDisabled = false;\n }\n\n streamData[streamId].lastEnabledIndex = index;\n\n eventBus.trigger(MediaPlayerEvents.TEXT_TRACKS_ADDED, {\n enabled: isTextEnabled(),\n index: index,\n tracks: tracks,\n streamId\n });\n\n textTracksAdded = true;\n\n dvbFonts.addFontsFromTracks(tracks, streamId);\n\n // Initially disable any tracks with essential property font downloads\n dvbFonts.getFonts().forEach(font => {\n if (font.isEssential) {\n let idx = textTracks[font.streamId].getTrackIdxForId(font.trackId);\n textTracks[font.streamId].setModeForTrackIdx(idx, Constants.TEXT_DISABLED);\n }\n });\n\n dvbFonts.downloadFonts();\n }\n\n function _onPlaybackTimeUpdated(e) {\n try {\n const streamId = e.streamId;\n\n if (!textTracks[streamId] || isNaN(e.time)) {\n return;\n }\n textTracks[streamId].manualCueProcessing(e.time);\n } catch (err) {\n }\n }\n\n function _onPlaybackSeeking(e) {\n try {\n const streamId = e.streamId;\n\n if (!textTracks[streamId]) {\n return;\n }\n textTracks[streamId].disableManualTracks();\n } catch (e) {\n\n }\n }\n\n function enableText(streamId, enable) {\n checkParameterType(enable, 'boolean');\n if (isTextEnabled() !== enable) {\n // change track selection\n if (enable) {\n // apply last enabled track\n setTextTrack(streamId, streamData[streamId].lastEnabledIndex);\n }\n\n if (!enable) {\n // keep last index and disable text track\n streamData[streamId].lastEnabledIndex = getCurrentTrackIdx(streamId);\n if (!textTracksAdded) {\n disableTextBeforeTextTracksAdded = true;\n } else {\n setTextTrack(streamId, -1);\n }\n }\n }\n\n return true\n }\n\n function isTextEnabled() {\n let enabled = true;\n if (allTracksAreDisabled && !forceTextStreaming) {\n enabled = false;\n }\n return enabled;\n }\n\n // when set to true ScheduleController will allow schedule of chunks even if tracks are all disabled. Allowing streaming to hidden track for external players to work with.\n function enableForcedTextStreaming(enable) {\n checkParameterType(enable, 'boolean');\n forceTextStreaming = enable;\n return true\n }\n\n function setTextTrack(streamId, idx) {\n // For external time text file, the only action needed to change a track is marking the track mode to showing.\n // Fragmented text tracks need the additional step of calling TextController.setTextTrack();\n allTracksAreDisabled = idx === -1;\n\n if (allTracksAreDisabled && mediaController) {\n mediaController.saveTextSettingsDisabled();\n }\n\n let oldTrackIdx = getCurrentTrackIdx(streamId);\n\n // No change, no action required\n if (oldTrackIdx === idx || !textTracks[streamId]) {\n return;\n }\n\n textTracks[streamId].disableManualTracks();\n\n let currentTrackInfo = textTracks[streamId].getCurrentTrackInfo();\n let currentNativeTrackInfo = (currentTrackInfo) ? videoModel.getTextTrack(currentTrackInfo.kind, currentTrackInfo.id, currentTrackInfo.lang, currentTrackInfo.isTTML, currentTrackInfo.isEmbedded) : null;\n\n // Don't change disabled tracks - dvb font download for essential property failed or not complete\n if (currentNativeTrackInfo && (currentNativeTrackInfo.mode !== Constants.TEXT_DISABLED)) {\n textTracks[streamId].setModeForTrackIdx(oldTrackIdx, Constants.TEXT_HIDDEN);\n }\n\n textTracks[streamId].setCurrentTrackIdx(idx);\n\n currentTrackInfo = textTracks[streamId].getCurrentTrackInfo();\n\n const dispatchForManualRendering = settings.get().streaming.text.dispatchForManualRendering;\n\n if (currentTrackInfo && !dispatchForManualRendering && (currentTrackInfo.mode !== Constants.TEXT_DISABLED)) {\n textTracks[streamId].setModeForTrackIdx(idx, Constants.TEXT_SHOWING);\n }\n\n if (currentTrackInfo && currentTrackInfo.isFragmented && !currentTrackInfo.isEmbedded) {\n _setFragmentedTextTrack(streamId, currentTrackInfo, oldTrackIdx);\n } else if (currentTrackInfo && !currentTrackInfo.isFragmented) {\n _setNonFragmentedTextTrack(streamId, currentTrackInfo);\n }\n\n mediaController.setTrack(currentTrackInfo);\n }\n\n function _setFragmentedTextTrack(streamId, currentTrackInfo, oldTrackIdx) {\n\n if (!textSourceBuffers[streamId]) {\n return;\n }\n\n let config = textSourceBuffers[streamId].getConfig();\n let fragmentedTracks = config.fragmentedTracks;\n\n for (let i = 0; i < fragmentedTracks.length; i++) {\n let mediaInfo = fragmentedTracks[i];\n if (currentTrackInfo.lang === mediaInfo.lang &&\n (mediaInfo.id ? currentTrackInfo.id === mediaInfo.id : currentTrackInfo.index === mediaInfo.index)) {\n let currentFragTrack = mediaController.getCurrentTrackFor(Constants.TEXT, streamId);\n if (mediaInfo.id ? currentFragTrack.id !== mediaInfo.id : currentFragTrack.index !== mediaInfo.index) {\n textTracks[streamId].deleteCuesFromTrackIdx(oldTrackIdx);\n textSourceBuffers[streamId].setCurrentFragmentedTrackIdx(i);\n } else if (oldTrackIdx === -1) {\n // in fragmented use case, if the user selects the older track (the one selected before disabled text track)\n // no CURRENT_TRACK_CHANGED event will be triggered because the mediaInfo in the StreamProcessor is equal to the one we are selecting\n // For that reason we reactivate the StreamProcessor and the ScheduleController\n eventBus.trigger(Events.SET_FRAGMENTED_TEXT_AFTER_DISABLED, {}, {\n streamId,\n mediaType: Constants.TEXT\n });\n }\n }\n }\n }\n\n function _setNonFragmentedTextTrack(streamId, currentTrackInfo) {\n eventBus.trigger(Events.SET_NON_FRAGMENTED_TEXT, {\n currentTrackInfo\n }, {\n streamId,\n mediaType: Constants.TEXT\n });\n }\n\n function getCurrentTrackIdx(streamId) {\n return textTracks[streamId].getCurrentTrackIdx();\n }\n\n function deactivateStream(streamInfo) {\n if (!streamInfo) {\n return;\n }\n const streamId = streamInfo.id;\n\n if (textSourceBuffers[streamId]) {\n textSourceBuffers[streamId].resetMediaInfos();\n }\n\n if (textTracks[streamId]) {\n textTracks[streamId].deleteAllTextTracks();\n }\n }\n\n function resetInitialSettings() {\n textSourceBuffers = {};\n textTracks = {};\n streamData = {};\n allTracksAreDisabled = true;\n textTracksAdded = false;\n disableTextBeforeTextTracksAdded = false;\n }\n\n function reset() {\n dvbFonts.reset();\n resetInitialSettings();\n eventBus.off(Events.TEXT_TRACKS_QUEUE_INITIALIZED, _onTextTracksAdded, instance);\n eventBus.off(Events.DVB_FONT_DOWNLOAD_FAILED, _onFontDownloadFailure, instance);\n eventBus.off(Events.DVB_FONT_DOWNLOAD_COMPLETE, _onFontDownloadSuccess, instance);\n if (settings.get().streaming.text.webvtt.customRenderingEnabled) {\n eventBus.off(Events.PLAYBACK_TIME_UPDATED, _onPlaybackTimeUpdated, instance);\n eventBus.off(Events.PLAYBACK_SEEKING, _onPlaybackSeeking, instance)\n }\n\n Object.keys(textSourceBuffers).forEach((key) => {\n textSourceBuffers[key].resetEmbedded();\n textSourceBuffers[key].reset();\n });\n }\n\n instance = {\n deactivateStream,\n initialize,\n initializeForStream,\n createTracks,\n getTextSourceBuffer,\n getAllTracksAreDisabled,\n addEmbeddedTrack,\n enableText,\n isTextEnabled,\n setTextTrack,\n getCurrentTrackIdx,\n enableForcedTextStreaming,\n addMediaInfosToBuffer,\n reset\n };\n setup();\n return instance;\n}\n\nTextController.__dashjs_factory_name = 'TextController';\nexport default FactoryMaker.getClassFactory(TextController);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport cea608parser from '../../externals/cea608-parser';\nimport Constants from './constants/Constants';\nimport DashConstants from '../dash/constants/DashConstants';\nimport MetricsConstants from './constants/MetricsConstants';\nimport PlaybackController from './controllers/PlaybackController';\nimport StreamController from './controllers/StreamController';\nimport GapController from './controllers/GapController';\nimport CatchupController from './controllers/CatchupController';\nimport ServiceDescriptionController from '../dash/controllers/ServiceDescriptionController';\nimport ContentSteeringController from '../dash/controllers/ContentSteeringController';\nimport MediaController from './controllers/MediaController';\nimport BaseURLController from './controllers/BaseURLController';\nimport ManifestLoader from './ManifestLoader';\nimport ErrorHandler from './utils/ErrorHandler';\nimport Capabilities from './utils/Capabilities';\nimport CapabilitiesFilter from './utils/CapabilitiesFilter';\nimport RequestModifier from './utils/RequestModifier';\nimport URIFragmentModel from './models/URIFragmentModel';\nimport ManifestModel from './models/ManifestModel';\nimport MediaPlayerModel from './models/MediaPlayerModel';\nimport AbrController from './controllers/AbrController';\nimport SchemeLoaderFactory from './net/SchemeLoaderFactory';\nimport VideoModel from './models/VideoModel';\nimport CmcdModel from './models/CmcdModel';\nimport CmsdModel from './models/CmsdModel';\nimport DOMStorage from './utils/DOMStorage';\nimport Debug from './../core/Debug';\nimport Errors from './../core/errors/Errors';\nimport EventBus from './../core/EventBus';\nimport Events from './../core/events/Events';\nimport MediaPlayerEvents from './MediaPlayerEvents';\nimport FactoryMaker from '../core/FactoryMaker';\nimport Settings from '../core/Settings';\nimport {getVersionString} from '../core/Version';\n\n//Dash\nimport SegmentBaseController from '../dash/controllers/SegmentBaseController';\nimport DashAdapter from '../dash/DashAdapter';\nimport DashMetrics from '../dash/DashMetrics';\nimport TimelineConverter from '../dash/utils/TimelineConverter';\nimport {\n HTTPRequest\n} from './vo/metrics/HTTPRequest';\nimport BASE64 from '../../externals/base64';\nimport ISOBoxer from 'codem-isoboxer';\nimport DashJSError from './vo/DashJSError';\nimport {checkParameterType} from './utils/SupervisorTools';\nimport ManifestUpdater from './ManifestUpdater';\nimport URLUtils from '../streaming/utils/URLUtils';\nimport BoxParser from './utils/BoxParser';\nimport TextController from './text/TextController';\nimport CustomParametersModel from './models/CustomParametersModel';\n\n/**\n * The media types\n * @typedef {(\"video\" | \"audio\" | \"text\" | \"image\")} MediaType\n */\n\n/**\n * @module MediaPlayer\n * @description The MediaPlayer is the primary dash.js Module and a Facade to build your player around.\n * It will allow you access to all the important dash.js properties/methods via the public API and all the\n * events to build a robust DASH media player.\n */\nfunction MediaPlayer() {\n /**\n * @constant {string} STREAMING_NOT_INITIALIZED_ERROR error string thrown when a function is called before the dash.js has been fully initialized\n * @inner\n */\n const STREAMING_NOT_INITIALIZED_ERROR = 'You must first call initialize() and set a source before calling this method';\n /**\n * @constant {string} PLAYBACK_NOT_INITIALIZED_ERROR error string thrown when a function is called before the dash.js has been fully initialized\n * @inner\n */\n const PLAYBACK_NOT_INITIALIZED_ERROR = 'You must first call initialize() and set a valid source and view before calling this method';\n /**\n * @constant {string} ELEMENT_NOT_ATTACHED_ERROR error string thrown when a function is called before the dash.js has received a reference of an HTML5 video element\n * @inner\n */\n const ELEMENT_NOT_ATTACHED_ERROR = 'You must first call attachView() to set the video element before calling this method';\n /**\n * @constant {string} SOURCE_NOT_ATTACHED_ERROR error string thrown when a function is called before the dash.js has received a valid source stream.\n * @inner\n */\n const SOURCE_NOT_ATTACHED_ERROR = 'You must first call attachSource() with a valid source before calling this method';\n /**\n * @constant {string} MEDIA_PLAYER_NOT_INITIALIZED_ERROR error string thrown when a function is called before the dash.js has been fully initialized.\n * @inner\n */\n const MEDIA_PLAYER_NOT_INITIALIZED_ERROR = 'MediaPlayer not initialized!';\n\n const context = this.context;\n const eventBus = EventBus(context).getInstance();\n let settings = Settings(context).getInstance();\n const debug = Debug(context).getInstance({ settings: settings });\n\n let instance,\n logger,\n source,\n protectionData,\n mediaPlayerInitialized,\n streamingInitialized,\n playbackInitialized,\n autoPlay,\n providedStartTime,\n abrController,\n schemeLoaderFactory,\n timelineConverter,\n mediaController,\n protectionController,\n metricsReportingController,\n mssHandler,\n offlineController,\n adapter,\n mediaPlayerModel,\n customParametersModel,\n errHandler,\n baseURLController,\n capabilities,\n capabilitiesFilter,\n streamController,\n textController,\n gapController,\n playbackController,\n serviceDescriptionController,\n contentSteeringController,\n catchupController,\n dashMetrics,\n manifestModel,\n cmcdModel,\n cmsdModel,\n videoModel,\n uriFragmentModel,\n domStorage,\n segmentBaseController;\n\n /*\n ---------------------------------------------------------------------------\n\n INIT FUNCTIONS\n\n ---------------------------------------------------------------------------\n */\n function setup() {\n logger = debug.getLogger(instance);\n mediaPlayerInitialized = false;\n playbackInitialized = false;\n streamingInitialized = false;\n autoPlay = true;\n providedStartTime = NaN;\n protectionController = null;\n offlineController = null;\n protectionData = null;\n adapter = null;\n segmentBaseController = null;\n Events.extend(MediaPlayerEvents);\n mediaPlayerModel = MediaPlayerModel(context).getInstance();\n customParametersModel = CustomParametersModel(context).getInstance();\n videoModel = VideoModel(context).getInstance();\n uriFragmentModel = URIFragmentModel(context).getInstance();\n }\n\n /**\n * Configure media player with customs controllers. Helpful for tests\n *\n * @param {object=} config controllers configuration\n * @memberof module:MediaPlayer\n * @instance\n */\n function setConfig(config) {\n if (!config) {\n return;\n }\n if (config.capabilities) {\n capabilities = config.capabilities;\n }\n if (config.capabilitiesFilter) {\n capabilitiesFilter = config.capabilitiesFilter;\n }\n if (config.streamController) {\n streamController = config.streamController;\n }\n if (config.textController) {\n textController = config.textController;\n }\n if (config.gapController) {\n gapController = config.gapController;\n }\n if (config.playbackController) {\n playbackController = config.playbackController;\n }\n if (config.serviceDescriptionController) {\n serviceDescriptionController = config.serviceDescriptionController\n }\n if (config.contentSteeringController) {\n contentSteeringController = config.contentSteeringController;\n }\n if (config.catchupController) {\n catchupController = config.catchupController;\n }\n if (config.mediaPlayerModel) {\n mediaPlayerModel = config.mediaPlayerModel;\n }\n if (config.customParametersModel) {\n customParametersModel = config.customParametersModel;\n }\n if (config.abrController) {\n abrController = config.abrController;\n }\n if (config.schemeLoaderFactory) {\n schemeLoaderFactory = config.schemeLoaderFactory;\n }\n if (config.mediaController) {\n mediaController = config.mediaController;\n }\n if (config.settings) {\n settings = config.settings;\n }\n }\n\n /**\n * Upon creating the MediaPlayer you must call initialize before you call anything else.\n * There is one exception to this rule. It is crucial to call {@link module:MediaPlayer#extend extend()}\n * with all your extensions prior to calling initialize.\n *\n * ALL arguments are optional and there are individual methods to set each argument later on.\n * The args in this method are just for convenience and should only be used for a simple player setup.\n *\n * @param {HTML5MediaElement=} view - Optional arg to set the video element. {@link module:MediaPlayer#attachView attachView()}\n * @param {string=} source - Optional arg to set the media source. {@link module:MediaPlayer#attachSource attachSource()}\n * @param {boolean=} autoPlay - Optional arg to set auto play. {@link module:MediaPlayer#setAutoPlay setAutoPlay()}\n * @param {number|string} startTime - For VoD content the start time is relative to the start time of the first period.\n * For live content\n * If the parameter starts from prefix posix: it signifies the absolute time range defined in seconds of Coordinated Universal Time (ITU-R TF.460-6). This is the number of seconds since 01-01-1970 00:00:00 UTC. Fractions of seconds may be optionally specified down to the millisecond level.\n * If no posix prefix is used the starttime is relative to MPD@availabilityStartTime\n * @see {@link module:MediaPlayer#attachSource attachSource()}\n * @see {@link module:MediaPlayer#setAutoPlay setAutoPlay()}\n * @memberof module:MediaPlayer\n * @instance\n */\n function initialize(view, source, autoPlay, startTime = NaN) {\n if (!capabilities) {\n capabilities = Capabilities(context).getInstance();\n capabilities.setConfig({\n settings\n })\n }\n\n if (!errHandler) {\n errHandler = ErrorHandler(context).getInstance();\n }\n\n if (!capabilities.supportsMediaSource()) {\n errHandler.error(new DashJSError(Errors.CAPABILITY_MEDIASOURCE_ERROR_CODE, Errors.CAPABILITY_MEDIASOURCE_ERROR_MESSAGE));\n return;\n }\n\n if (!mediaPlayerInitialized) {\n mediaPlayerInitialized = true;\n\n // init some controllers and models\n timelineConverter = TimelineConverter(context).getInstance();\n if (!abrController) {\n abrController = AbrController(context).getInstance();\n abrController.setConfig({\n settings: settings\n });\n }\n\n if (!schemeLoaderFactory) {\n schemeLoaderFactory = SchemeLoaderFactory(context).getInstance();\n }\n\n if (!playbackController) {\n playbackController = PlaybackController(context).getInstance();\n }\n\n if (!mediaController) {\n mediaController = MediaController(context).getInstance();\n }\n\n if (!streamController) {\n streamController = StreamController(context).getInstance();\n }\n\n if (!gapController) {\n gapController = GapController(context).getInstance();\n }\n\n if (!catchupController) {\n catchupController = CatchupController(context).getInstance();\n }\n\n if (!serviceDescriptionController) {\n serviceDescriptionController = ServiceDescriptionController(context).getInstance();\n }\n\n if (!contentSteeringController) {\n contentSteeringController = ContentSteeringController(context).getInstance();\n }\n\n if (!capabilitiesFilter) {\n capabilitiesFilter = CapabilitiesFilter(context).getInstance();\n }\n\n adapter = DashAdapter(context).getInstance();\n\n manifestModel = ManifestModel(context).getInstance();\n\n cmcdModel = CmcdModel(context).getInstance();\n\n cmsdModel = CmsdModel(context).getInstance();\n\n dashMetrics = DashMetrics(context).getInstance({\n settings: settings\n });\n\n domStorage = DOMStorage(context).getInstance({\n settings: settings\n });\n\n adapter.setConfig({\n constants: Constants,\n cea608parser: cea608parser,\n errHandler: errHandler,\n BASE64: BASE64\n });\n\n if (!baseURLController) {\n baseURLController = BaseURLController(context).create();\n }\n\n baseURLController.setConfig({\n adapter,\n contentSteeringController\n });\n\n serviceDescriptionController.setConfig({\n adapter\n });\n\n if (!segmentBaseController) {\n segmentBaseController = SegmentBaseController(context).getInstance({\n dashMetrics: dashMetrics,\n mediaPlayerModel: mediaPlayerModel,\n errHandler: errHandler,\n baseURLController: baseURLController,\n events: Events,\n eventBus: eventBus,\n debug: debug,\n boxParser: BoxParser(context).getInstance(),\n requestModifier: RequestModifier(context).getInstance(),\n errors: Errors\n });\n }\n\n // configure controllers\n mediaController.setConfig({\n domStorage,\n settings,\n customParametersModel\n });\n\n mediaPlayerModel.setConfig({\n playbackController,\n serviceDescriptionController\n });\n\n contentSteeringController.setConfig({\n adapter,\n errHandler,\n dashMetrics,\n mediaPlayerModel,\n manifestModel,\n serviceDescriptionController,\n eventBus,\n requestModifier: RequestModifier(context).getInstance()\n })\n\n restoreDefaultUTCTimingSources();\n setAutoPlay(autoPlay !== undefined ? autoPlay : true);\n\n // Detect and initialize offline module to support offline contents playback\n _detectOffline();\n }\n\n if (view) {\n attachView(view);\n }\n\n if (source) {\n attachSource(source, startTime);\n }\n\n logger.info('[dash.js ' + getVersion() + '] ' + 'MediaPlayer has been initialized');\n }\n\n /**\n * Sets the MPD source and the video element to null. You can also reset the MediaPlayer by\n * calling attachSource with a new source file.\n *\n * This call does not destroy the MediaPlayer. To destroy the MediaPlayer and free all of its\n * memory, call destroy().\n *\n * @memberof module:MediaPlayer\n * @instance\n */\n function reset() {\n attachSource(null);\n attachView(null);\n protectionData = null;\n if (protectionController) {\n protectionController.reset();\n protectionController = null;\n }\n if (metricsReportingController) {\n metricsReportingController.reset();\n metricsReportingController = null;\n }\n if (customParametersModel) {\n customParametersModel.reset();\n }\n\n settings.reset();\n\n if (offlineController) {\n offlineController.reset();\n offlineController = null;\n }\n }\n\n /**\n * Completely destroys the media player and frees all memory.\n *\n * @memberof module:MediaPlayer\n * @instance\n */\n function destroy() {\n reset();\n FactoryMaker.deleteSingletonInstances(context);\n }\n\n /**\n * The ready state of the MediaPlayer based on both the video element and MPD source being defined.\n *\n * @returns {boolean} The current ready state of the MediaPlayer\n * @see {@link module:MediaPlayer#attachView attachView()}\n * @see {@link module:MediaPlayer#attachSource attachSource()}\n * @memberof module:MediaPlayer\n * @instance\n */\n function isReady() {\n return (!!source && !!videoModel.getElement());\n }\n\n /**\n * Use the on method to listen for public events found in MediaPlayer.events. {@link MediaPlayerEvents}\n *\n * @param {string} type - {@link MediaPlayerEvents}\n * @param {Function} listener - callback method when the event fires.\n * @param {Object} scope - context of the listener so it can be removed properly.\n * @param {Object} options - object to define various options such as priority and mode\n * @memberof module:MediaPlayer\n * @instance\n */\n function on(type, listener, scope, options) {\n eventBus.on(type, listener, scope, options);\n }\n\n /**\n * Use the off method to remove listeners for public events found in MediaPlayer.events. {@link MediaPlayerEvents}\n *\n * @param {string} type - {@link MediaPlayerEvents}\n * @param {Function} listener - callback method when the event fires.\n * @param {Object} scope - context of the listener so it can be removed properly.\n * @memberof module:MediaPlayer\n * @instance\n */\n function off(type, listener, scope) {\n eventBus.off(type, listener, scope);\n }\n\n /**\n * Current version of Dash.js\n * @returns {string} the current dash.js version string.\n * @memberof module:MediaPlayer\n * @instance\n */\n function getVersion() {\n return getVersionString();\n }\n\n /**\n * Use this method to access the dash.js logging class.\n *\n * @returns {Debug}\n * @memberof module:MediaPlayer\n * @instance\n */\n function getDebug() {\n return debug;\n }\n\n /*\n ---------------------------------------------------------------------------\n\n PLAYBACK FUNCTIONS\n\n ---------------------------------------------------------------------------\n */\n\n /**\n * Causes the player to begin streaming the media as set by the {@link module:MediaPlayer#attachSource attachSource()}\n * method in preparation for playing. It specifically does not require a view to be attached with {@link module:MediaPlayer#attachSource attachView()} to begin preloading.\n * When a view is attached after preloading, the buffered data is transferred to the attached mediaSource buffers.\n *\n * @see {@link module:MediaPlayer#attachSource attachSource()}\n * @see {@link module:MediaPlayer#attachView attachView()}\n * @memberof module:MediaPlayer\n * @throws {@link module:MediaPlayer~SOURCE_NOT_ATTACHED_ERROR SOURCE_NOT_ATTACHED_ERROR} if called before attachSource function\n * @instance\n */\n function preload() {\n if (videoModel.getElement() || streamingInitialized) {\n return;\n }\n if (source) {\n _initializePlayback(providedStartTime);\n } else {\n throw SOURCE_NOT_ATTACHED_ERROR;\n }\n }\n\n /**\n * The play method initiates playback of the media defined by the {@link module:MediaPlayer#attachSource attachSource()} method.\n * This method will call play on the native Video Element.\n *\n * @see {@link module:MediaPlayer#attachSource attachSource()}\n * @throws {@link module:MediaPlayer~PLAYBACK_NOT_INITIALIZED_ERROR PLAYBACK_NOT_INITIALIZED_ERROR} if called before initializePlayback function\n * @memberof module:MediaPlayer\n * @instance\n */\n function play() {\n if (!playbackInitialized) {\n throw PLAYBACK_NOT_INITIALIZED_ERROR;\n }\n if (!autoPlay || (isPaused() && playbackInitialized)) {\n playbackController.play(true);\n }\n }\n\n /**\n * This method will call pause on the native Video Element.\n *\n * @throws {@link module:MediaPlayer~PLAYBACK_NOT_INITIALIZED_ERROR PLAYBACK_NOT_INITIALIZED_ERROR} if called before initializePlayback function\n * @memberof module:MediaPlayer\n * @instance\n */\n function pause() {\n if (!playbackInitialized) {\n throw PLAYBACK_NOT_INITIALIZED_ERROR;\n }\n playbackController.pause();\n }\n\n /**\n * Returns a Boolean that indicates whether the Video Element is paused.\n * @return {boolean}\n * @throws {@link module:MediaPlayer~PLAYBACK_NOT_INITIALIZED_ERROR PLAYBACK_NOT_INITIALIZED_ERROR} if called before initializePlayback function\n * @memberof module:MediaPlayer\n * @instance\n */\n function isPaused() {\n if (!playbackInitialized) {\n throw PLAYBACK_NOT_INITIALIZED_ERROR;\n }\n return playbackController.isPaused();\n }\n\n /**\n * Sets the currentTime property of the attached video element. If it is a live stream with a\n * timeShiftBufferLength, then the DVR window offset will be automatically calculated.\n *\n * @param {number} value - A relative time, in seconds, based on the return value of the {@link module:MediaPlayer#duration duration()} method is expected.\n * For dynamic streams duration() returns DVRWindow.end - DVRWindow.start. Consequently, the value provided to this function should be relative to DVRWindow.start.\n * @see {@link module:MediaPlayer#getDVRSeekOffset getDVRSeekOffset()}\n * @throws {@link module:MediaPlayer~PLAYBACK_NOT_INITIALIZED_ERROR PLAYBACK_NOT_INITIALIZED_ERROR} if called before initializePlayback function\n * @throws {@link Constants#BAD_ARGUMENT_ERROR BAD_ARGUMENT_ERROR} if called with an invalid argument, not number type or is NaN.\n * @memberof module:MediaPlayer\n * @instance\n */\n function seek(value) {\n if (!playbackInitialized) {\n throw PLAYBACK_NOT_INITIALIZED_ERROR;\n }\n\n checkParameterType(value, 'number');\n\n if (isNaN(value)) {\n throw Constants.BAD_ARGUMENT_ERROR;\n }\n\n if (value < 0) {\n value = 0;\n }\n\n let s = playbackController.getIsDynamic() ? getDVRSeekOffset(value) : value;\n\n // For VoD limit the seek to the duration of the content\n const videoElement = getVideoElement();\n if (!playbackController.getIsDynamic() && videoElement.duration) {\n s = Math.min(videoElement.duration, s);\n }\n\n playbackController.seek(s, false, false, true);\n }\n\n /**\n * Seeks back to the original live edge (live edge as calculated at playback start). Only applies to live streams, for VoD streams this call will be ignored.\n */\n function seekToOriginalLive() {\n if (!playbackInitialized || !isDynamic()) {\n return;\n }\n\n playbackController.seekToOriginalLive();\n }\n\n /**\n * Returns a Boolean that indicates whether the media is in the process of seeking to a new position.\n * @return {boolean}\n * @throws {@link module:MediaPlayer~PLAYBACK_NOT_INITIALIZED_ERROR PLAYBACK_NOT_INITIALIZED_ERROR} if called before initializePlayback function\n * @memberof module:MediaPlayer\n * @instance\n */\n function isSeeking() {\n if (!playbackInitialized) {\n throw PLAYBACK_NOT_INITIALIZED_ERROR;\n }\n return playbackController.isSeeking();\n }\n\n /**\n * Returns a Boolean that indicates whether the media is in the process of dynamic.\n * @return {boolean}\n * @throws {@link module:MediaPlayer~PLAYBACK_NOT_INITIALIZED_ERROR PLAYBACK_NOT_INITIALIZED_ERROR} if called before initializePlayback function\n * @memberof module:MediaPlayer\n * @instance\n */\n function isDynamic() {\n if (!playbackInitialized) {\n throw PLAYBACK_NOT_INITIALIZED_ERROR;\n }\n return playbackController.getIsDynamic();\n }\n\n /**\n * Returns a boolean that indicates whether the player is operating in low latency mode.\n * @return {boolean}\n * @memberof module:MediaPlayer\n * @instance\n */\n function getLowLatencyModeEnabled() {\n if (!playbackInitialized) {\n throw PLAYBACK_NOT_INITIALIZED_ERROR;\n }\n return playbackController.getLowLatencyModeEnabled();\n }\n\n /**\n * Use this method to set the native Video Element's playback rate.\n * @param {number} value\n * @memberof module:MediaPlayer\n * @instance\n */\n function setPlaybackRate(value) {\n getVideoElement().playbackRate = value;\n }\n\n /**\n * Returns the current playback rate.\n * @returns {number}\n * @memberof module:MediaPlayer\n * @instance\n */\n function getPlaybackRate() {\n return getVideoElement().playbackRate;\n }\n\n /**\n * Use this method to set the native Video Element's muted state. Takes a Boolean that determines whether audio is muted. true if the audio is muted and false otherwise.\n * @param {boolean} value\n * @memberof module:MediaPlayer\n * @throws {@link Constants#BAD_ARGUMENT_ERROR BAD_ARGUMENT_ERROR} if called with an invalid argument, not boolean type.\n * @instance\n */\n function setMute(value) {\n checkParameterType(value, 'boolean');\n getVideoElement().muted = value;\n }\n\n /**\n * A Boolean that determines whether audio is muted.\n * @returns {boolean}\n * @memberof module:MediaPlayer\n * @instance\n */\n function isMuted() {\n return getVideoElement().muted;\n }\n\n /**\n * A double indicating the audio volume, from 0.0 (silent) to 1.0 (loudest).\n * @param {number} value\n * @memberof module:MediaPlayer\n * @throws {@link Constants#BAD_ARGUMENT_ERROR BAD_ARGUMENT_ERROR} if called with an invalid argument, not number type, or is NaN or not between 0 and 1.\n * @instance\n */\n function setVolume(value) {\n if (typeof value !== 'number' || isNaN(value) || value < 0.0 || value > 1.0) {\n throw Constants.BAD_ARGUMENT_ERROR;\n }\n getVideoElement().volume = value;\n }\n\n /**\n * Returns the current audio volume, from 0.0 (silent) to 1.0 (loudest).\n * @returns {number}\n * @memberof module:MediaPlayer\n * @instance\n */\n function getVolume() {\n return getVideoElement().volume;\n }\n\n /**\n * The length of the buffer for a given media type, in seconds. Valid media\n * types are \"video\", \"audio\" and \"text\". If no type is passed\n * in, then the minimum of video, audio and text buffer length is\n * returned. NaN is returned if an invalid type is requested, the\n * presentation does not contain that type, or if no arguments are passed\n * and the presentation does not include any adaption sets of valid media\n * type.\n *\n * @param {MediaType} type - 'video', 'audio' or 'text'\n * @returns {number} The length of the buffer for the given media type, in\n * seconds, or NaN\n * @memberof module:MediaPlayer\n * @instance\n */\n function getBufferLength(type) {\n const types = [Constants.VIDEO, Constants.AUDIO, Constants.TEXT];\n if (!type) {\n const buffer = types.map(\n t => getTracksFor(t).length > 0 ? getDashMetrics().getCurrentBufferLevel(t) : Number.MAX_VALUE\n ).reduce(\n (p, c) => Math.min(p, c)\n );\n return buffer === Number.MAX_VALUE ? NaN : buffer;\n } else {\n if (types.indexOf(type) !== -1) {\n const buffer = getDashMetrics().getCurrentBufferLevel(type);\n return buffer ? buffer : NaN;\n } else {\n logger.warn('getBufferLength requested for invalid type');\n return NaN;\n }\n }\n }\n\n /**\n * The timeShiftBufferLength (DVR Window), in seconds.\n *\n * @returns {number} The window of allowable play time behind the live point of a live stream as defined in the manifest.\n * @memberof module:MediaPlayer\n * @instance\n */\n function getDVRWindowSize() {\n const type = streamController && streamController.hasVideoTrack() ? Constants.VIDEO : Constants.AUDIO;\n let metric = dashMetrics.getCurrentDVRInfo(type);\n if (!metric) {\n return 0;\n }\n return metric.manifestInfo.dvrWindowSize;\n }\n\n /**\n * This method should only be used with a live stream that has a valid timeShiftBufferLength (DVR Window).\n * NOTE - If you do not need the raw offset value (i.e. media analytics, tracking, etc) consider using the {@link module:MediaPlayer#seek seek()} method\n * which will calculate this value for you and set the video element's currentTime property all in one simple call.\n *\n * @param {number} value - A relative time, in seconds, based on the return value of the {@link module:MediaPlayer#duration duration()} method is expected.\n * @returns {number} A value that is relative the available range within the timeShiftBufferLength (DVR Window).\n * @see {@link module:MediaPlayer#seek seek()}\n * @memberof module:MediaPlayer\n * @instance\n */\n function getDVRSeekOffset(value) {\n const type = streamController && streamController.hasVideoTrack() ? Constants.VIDEO : Constants.AUDIO;\n let metric = dashMetrics.getCurrentDVRInfo(type);\n if (!metric) {\n return 0;\n }\n\n let liveDelay = playbackController.getOriginalLiveDelay();\n\n let val = metric.range.start + value;\n\n if (val > (metric.range.end - liveDelay)) {\n val = metric.range.end - liveDelay;\n }\n\n return val;\n }\n\n /**\n * Returns the target live delay\n * @returns {number} The target live delay\n * @memberof module:MediaPlayer\n * @instance\n */\n function getTargetLiveDelay() {\n if (!playbackInitialized) {\n throw PLAYBACK_NOT_INITIALIZED_ERROR;\n }\n\n return playbackController.getOriginalLiveDelay();\n }\n\n /**\n * Current time of the playhead, in seconds.\n *\n * If called with no arguments then the returned time value is time elapsed since the start point of the first stream, or if it is a live stream, then the time will be based on the return value of the {@link module:MediaPlayer#duration duration()} method.\n * However if a stream ID is supplied then time is relative to the start of that stream, or is null if there is no such stream id in the manifest.\n *\n * @param {string} streamId - The ID of a stream that the returned playhead time must be relative to the start of. If undefined, then playhead time is relative to the first stream.\n * @returns {number} The current playhead time of the media, or null.\n * @throws {@link module:MediaPlayer~PLAYBACK_NOT_INITIALIZED_ERROR PLAYBACK_NOT_INITIALIZED_ERROR} if called before initializePlayback function\n * @memberof module:MediaPlayer\n * @instance\n */\n function time(streamId) {\n if (!playbackInitialized) {\n throw PLAYBACK_NOT_INITIALIZED_ERROR;\n }\n let t = getVideoElement().currentTime;\n\n if (streamId !== undefined) {\n t = streamController.getTimeRelativeToStreamId(t, streamId);\n } else if (playbackController.getIsDynamic()) {\n const type = streamController && streamController.hasVideoTrack() ? Constants.VIDEO : Constants.AUDIO;\n let metric = dashMetrics.getCurrentDVRInfo(type);\n t = (metric === null || t === 0) ? 0 : Math.max(0, (t - metric.range.start));\n }\n\n return t;\n }\n\n /**\n * Duration of the media's playback, in seconds.\n *\n * @returns {number} The current duration of the media. For a dynamic stream this will return DVRWindow.end - DVRWindow.start\n * @memberof module:MediaPlayer\n * @throws {@link module:MediaPlayer~PLAYBACK_NOT_INITIALIZED_ERROR PLAYBACK_NOT_INITIALIZED_ERROR} if called before initializePlayback function\n * @instance\n */\n function duration() {\n if (!playbackInitialized) {\n throw PLAYBACK_NOT_INITIALIZED_ERROR;\n }\n let d = getVideoElement().duration;\n\n if (playbackController.getIsDynamic()) {\n const type = streamController && streamController.hasVideoTrack() ? Constants.VIDEO : Constants.AUDIO;\n let metric = dashMetrics.getCurrentDVRInfo(type);\n d = metric ? (metric.range.end - metric.range.start) : 0;\n }\n return d;\n }\n\n /**\n * Use this method to get the current playhead time as an absolute value, the time in seconds since midnight UTC, Jan 1 1970.\n * Note - this property only has meaning for live streams. If called before play() has begun, it will return a value of NaN.\n *\n * @returns {number} The current playhead time as UTC timestamp.\n * @throws {@link module:MediaPlayer~PLAYBACK_NOT_INITIALIZED_ERROR PLAYBACK_NOT_INITIALIZED_ERROR} if called before initializePlayback function\n * @memberof module:MediaPlayer\n * @instance\n */\n function timeAsUTC() {\n if (!playbackInitialized) {\n throw PLAYBACK_NOT_INITIALIZED_ERROR;\n }\n if (time() < 0) {\n return NaN;\n }\n return _getAsUTC(time());\n }\n\n /**\n * Use this method to get the current duration as an absolute value, the time in seconds since midnight UTC, Jan 1 1970.\n * Note - this property only has meaning for live streams.\n *\n * @returns {number} The current duration as UTC timestamp.\n * @throws {@link module:MediaPlayer~PLAYBACK_NOT_INITIALIZED_ERROR PLAYBACK_NOT_INITIALIZED_ERROR} if called before initializePlayback function\n * @memberof module:MediaPlayer\n * @instance\n */\n function durationAsUTC() {\n if (!playbackInitialized) {\n throw PLAYBACK_NOT_INITIALIZED_ERROR;\n }\n return _getAsUTC(duration());\n }\n\n /*\n ---------------------------------------------------------------------------\n\n AUTO BITRATE\n\n ---------------------------------------------------------------------------\n */\n /**\n * Gets the top quality BitrateInfo checking portal limit and max allowed.\n * It calls getMaxAllowedIndexFor internally\n *\n * @param {MediaType} type - 'video' or 'audio'\n * @memberof module:MediaPlayer\n * @returns {BitrateInfo | null}\n * @throws {@link module:MediaPlayer~STREAMING_NOT_INITIALIZED_ERROR STREAMING_NOT_INITIALIZED_ERROR} if called before initializePlayback function\n * @instance\n */\n function getTopBitrateInfoFor(type) {\n if (!streamingInitialized) {\n throw STREAMING_NOT_INITIALIZED_ERROR;\n }\n return abrController.getTopBitrateInfoFor(type);\n }\n\n /**\n * Gets the current download quality for media type video, audio or images. For video and audio types the ABR\n * rules update this value before every new download unless autoSwitchBitrate is set to false. For 'image'\n * type, thumbnails, there is no ABR algorithm and quality is set manually.\n *\n * @param {MediaType} type - 'video', 'audio' or 'image' (thumbnails)\n * @returns {number} the quality index, 0 corresponding to the lowest bitrate\n * @memberof module:MediaPlayer\n * @see {@link module:MediaPlayer#setQualityFor setQualityFor()}\n * @throws {@link module:MediaPlayer~STREAMING_NOT_INITIALIZED_ERROR STREAMING_NOT_INITIALIZED_ERROR} if called before initializePlayback function\n * @instance\n */\n function getQualityFor(type) {\n if (!streamingInitialized) {\n throw STREAMING_NOT_INITIALIZED_ERROR;\n }\n if (type === Constants.IMAGE) {\n const activeStream = getActiveStream();\n if (!activeStream) {\n return -1;\n }\n const thumbnailController = activeStream.getThumbnailController();\n\n return !thumbnailController ? -1 : thumbnailController.getCurrentTrackIndex();\n }\n return abrController.getQualityFor(type);\n }\n\n /**\n * Sets the current quality for media type instead of letting the ABR Heuristics automatically selecting it.\n * This value will be overwritten by the ABR rules unless autoSwitchBitrate is set to false.\n *\n * @param {MediaType} type - 'video', 'audio' or 'image'\n * @param {number} value - the quality index, 0 corresponding to the lowest bitrate\n * @param {boolean} forceReplace - true if segments have to be replaced by segments of the new quality\n * @memberof module:MediaPlayer\n * @see {@link module:MediaPlayer#getQualityFor getQualityFor()}\n * @throws {@link module:MediaPlayer~STREAMING_NOT_INITIALIZED_ERROR STREAMING_NOT_INITIALIZED_ERROR} if called before initializePlayback function\n * @instance\n */\n function setQualityFor(type, value, forceReplace = false) {\n if (!streamingInitialized) {\n throw STREAMING_NOT_INITIALIZED_ERROR;\n }\n if (type === Constants.IMAGE) {\n const activeStream = getActiveStream();\n if (!activeStream) {\n return;\n }\n const thumbnailController = activeStream.getThumbnailController();\n if (thumbnailController) {\n thumbnailController.setTrackByIndex(value);\n }\n }\n abrController.setPlaybackQuality(type, streamController.getActiveStreamInfo(), value, { forceReplace });\n }\n\n /**\n * Update the video element size variables\n * Should be called on window resize (or any other time player is resized). Fullscreen does trigger a window resize event.\n *\n * Once windowResizeEventCalled = true, abrController.checkPortalSize() will use element size variables rather than querying clientWidth every time.\n *\n * @memberof module:MediaPlayer\n * @instance\n */\n function updatePortalSize() {\n abrController.setElementSize();\n abrController.setWindowResizeEventCalled(true);\n }\n\n /*\n ---------------------------------------------------------------------------\n\n MEDIA PLAYER CONFIGURATION\n\n ---------------------------------------------------------------------------\n */\n /**\n * <p>Set to false to prevent stream from auto-playing when the view is attached.</p>\n *\n * @param {boolean} value\n * @default true\n * @memberof module:MediaPlayer\n * @see {@link module:MediaPlayer#attachView attachView()}\n * @throws {@link Constants#BAD_ARGUMENT_ERROR BAD_ARGUMENT_ERROR} if called with an invalid argument, not boolean type.\n * @instance\n *\n */\n function setAutoPlay(value) {\n checkParameterType(value, 'boolean');\n autoPlay = value;\n }\n\n /**\n * @returns {boolean} The current autoPlay state.\n * @memberof module:MediaPlayer\n * @instance\n */\n function getAutoPlay() {\n return autoPlay;\n }\n\n /**\n * @memberof module:MediaPlayer\n * @instance\n * @returns {number|NaN} Current live stream latency in seconds. It is the difference between now time and time position at the playback head.\n * @throws {@link module:MediaPlayer~MEDIA_PLAYER_NOT_INITIALIZED_ERROR MEDIA_PLAYER_NOT_INITIALIZED_ERROR} if called before initialize function\n */\n function getCurrentLiveLatency() {\n if (!mediaPlayerInitialized) {\n throw MEDIA_PLAYER_NOT_INITIALIZED_ERROR;\n }\n\n if (!playbackInitialized) {\n return NaN;\n }\n\n return playbackController.getCurrentLiveLatency();\n }\n\n /**\n * Add a custom ABR Rule\n * Rule will be apply on next stream if a stream is being played\n *\n * @param {string} type - rule type (one of ['qualitySwitchRules','abandonFragmentRules'])\n * @param {string} rulename - name of rule (used to identify custom rule). If one rule of same name has been added, then existing rule will be updated\n * @param {object} rule - the rule object instance\n * @memberof module:MediaPlayer\n * @throws {@link Constants#BAD_ARGUMENT_ERROR BAD_ARGUMENT_ERROR} if called with invalid arguments.\n * @instance\n */\n function addABRCustomRule(type, rulename, rule) {\n customParametersModel.addAbrCustomRule(type, rulename, rule);\n }\n\n /**\n * Remove a custom ABR Rule\n *\n * @param {string} rulename - name of the rule to be removed\n * @memberof module:MediaPlayer\n * @instance\n */\n function removeABRCustomRule(rulename) {\n customParametersModel.removeAbrCustomRule(rulename);\n }\n\n /**\n * Remove all ABR custom rules\n * @memberof module:MediaPlayer\n * @instance\n */\n function removeAllABRCustomRule() {\n customParametersModel.removeAllAbrCustomRule();\n }\n\n /**\n * Returns all ABR custom rules\n * @return {Array}\n */\n function getABRCustomRules() {\n return customParametersModel.getAbrCustomRules();\n }\n\n /**\n * <p>Allows you to set a scheme and server source for UTC live edge detection for dynamic streams.\n * If UTCTiming is defined in the manifest, it will take precedence over any time source manually added.</p>\n * <p>If you have exposed the Date header, use the method {@link module:MediaPlayer#clearDefaultUTCTimingSources clearDefaultUTCTimingSources()}.\n * This will allow the date header on the manifest to be used instead of a time server</p>\n * @param {string} schemeIdUri - <ul>\n * <li>urn:mpeg:dash:utc:http-head:2014</li>\n * <li>urn:mpeg:dash:utc:http-xsdate:2014</li>\n * <li>urn:mpeg:dash:utc:http-iso:2014</li>\n * <li>urn:mpeg:dash:utc:direct:2014</li>\n * </ul>\n * <p>Some specs referencing early ISO23009-1 drafts incorrectly use\n * 2012 in the URI, rather than 2014. support these for now.</p>\n * <ul>\n * <li>urn:mpeg:dash:utc:http-head:2012</li>\n * <li>urn:mpeg:dash:utc:http-xsdate:2012</li>\n * <li>urn:mpeg:dash:utc:http-iso:2012</li>\n * <li>urn:mpeg:dash:utc:direct:2012</li>\n * </ul>\n * @param {string} value - Path to a time source.\n * @default\n * <ul>\n * <li>schemeIdUri:urn:mpeg:dash:utc:http-xsdate:2014</li>\n * <li>value:http://time.akamai.com/?iso&ms/li>\n * </ul>\n * @memberof module:MediaPlayer\n * @see {@link module:MediaPlayer#removeUTCTimingSource removeUTCTimingSource()}\n * @instance\n */\n function addUTCTimingSource(schemeIdUri, value) {\n customParametersModel.addUTCTimingSource(schemeIdUri, value);\n }\n\n /**\n * <p>Allows you to remove a UTC time source. Both schemeIdUri and value need to match the Dash.vo.UTCTiming properties in order for the\n * entry to be removed from the array</p>\n * @param {string} schemeIdUri - see {@link module:MediaPlayer#addUTCTimingSource addUTCTimingSource()}\n * @param {string} value - see {@link module:MediaPlayer#addUTCTimingSource addUTCTimingSource()}\n * @memberof module:MediaPlayer\n * @see {@link module:MediaPlayer#clearDefaultUTCTimingSources clearDefaultUTCTimingSources()}\n * @throws {@link Constants#BAD_ARGUMENT_ERROR BAD_ARGUMENT_ERROR} if called with invalid arguments, schemeIdUri and value are not string type.\n * @instance\n */\n function removeUTCTimingSource(schemeIdUri, value) {\n customParametersModel.removeUTCTimingSource(schemeIdUri, value);\n }\n\n /**\n * <p>Allows you to clear the stored array of time sources.</p>\n * <p>Example use: If you have exposed the Date header, calling this method\n * will allow the date header on the manifest to be used instead of the time server.</p>\n * <p>Example use: Calling this method, assuming there is not an exposed date header on the manifest, will default back\n * to using a binary search to discover the live edge</p>\n *\n * @memberof module:MediaPlayer\n * @see {@link module:MediaPlayer#restoreDefaultUTCTimingSources restoreDefaultUTCTimingSources()}\n * @instance\n */\n function clearDefaultUTCTimingSources() {\n customParametersModel.clearDefaultUTCTimingSources();\n }\n\n /**\n * <p>Allows you to restore the default time sources after calling {@link module:MediaPlayer#clearDefaultUTCTimingSources clearDefaultUTCTimingSources()}</p>\n *\n * @default\n * <ul>\n * <li>schemeIdUri:urn:mpeg:dash:utc:http-xsdate:2014</li>\n * <li>value:http://time.akamai.com/?iso&ms</li>\n * </ul>\n *\n * @memberof module:MediaPlayer\n * @see {@link module:MediaPlayer#addUTCTimingSource addUTCTimingSource()}\n * @instance\n */\n function restoreDefaultUTCTimingSources() {\n customParametersModel.restoreDefaultUTCTimingSources();\n }\n\n /**\n * Returns the average throughput computed in the ABR logic\n *\n * @param {MediaType} type\n * @return {number} value\n * @memberof module:MediaPlayer\n * @instance\n */\n function getAverageThroughput(type) {\n const throughputHistory = abrController.getThroughputHistory();\n const isDynamic = playbackController.getIsDynamic();\n\n return throughputHistory ? throughputHistory.getAverageThroughput(type, isDynamic) : 0;\n }\n\n /**\n * Sets whether withCredentials on XHR requests for a particular request\n * type is true or false\n *\n * @default false\n * @param {string} type - one of HTTPRequest.*_TYPE\n * @param {boolean} value\n * @memberof module:MediaPlayer\n * @instance\n */\n function setXHRWithCredentialsForType(type, value) {\n customParametersModel.setXHRWithCredentialsForType(type, value);\n }\n\n /**\n * Gets whether withCredentials on XHR requests for a particular request\n * type is true or false\n *\n * @param {string} type - one of HTTPRequest.*_TYPE\n * @return {boolean}\n * @memberof module:MediaPlayer\n * @instance\n */\n function getXHRWithCredentialsForType(type) {\n return customParametersModel.getXHRWithCredentialsForType(type);\n }\n\n /*\n ---------------------------------------------------------------------------\n\n OFFLINE\n\n ---------------------------------------------------------------------------\n */\n\n /**\n * Detects if Offline is included and returns an instance of OfflineController.js\n * @memberof module:MediaPlayer\n * @instance\n */\n function getOfflineController() {\n return _detectOffline();\n }\n\n /*\n ---------------------------------------------------------------------------\n\n METRICS\n\n ---------------------------------------------------------------------------\n */\n /**\n * Returns the DashMetrics.js Module. You use this Module to get access to all the public metrics\n * stored in dash.js\n *\n * @see {@link module:DashMetrics}\n * @returns {Object}\n * @memberof module:MediaPlayer\n * @instance\n */\n function getDashMetrics() {\n return dashMetrics;\n }\n\n /*\n ---------------------------------------------------------------------------\n\n TEXT MANAGEMENT\n\n ---------------------------------------------------------------------------\n */\n\n /**\n * Enable/disable text\n * When enabling text, dash will choose the previous selected text track\n *\n * @param {boolean} enable - true to enable text, false otherwise (same as setTextTrack(-1))\n * @memberof module:MediaPlayer\n * @instance\n */\n function enableText(enable) {\n const activeStreamInfo = streamController.getActiveStreamInfo();\n\n if (!activeStreamInfo || !textController) {\n return false;\n }\n\n return textController.enableText(activeStreamInfo.id, enable);\n }\n\n /**\n * Enable/disable text\n * When enabling dash will keep downloading and process fragmented text tracks even if all tracks are in mode \"hidden\"\n *\n * @param {boolean} enable - true to enable text streaming even if all text tracks are hidden.\n * @memberof module:MediaPlayer\n * @instance\n */\n function enableForcedTextStreaming(enable) {\n const activeStreamInfo = streamController.getActiveStreamInfo();\n\n if (!activeStreamInfo || !textController) {\n return false;\n }\n\n return textController.enableForcedTextStreaming(enable);\n }\n\n /**\n * Return if text is enabled\n *\n * @return {boolean} return true if text is enabled, false otherwise\n * @memberof module:MediaPlayer\n * @instance\n */\n function isTextEnabled() {\n const activeStreamInfo = streamController.getActiveStreamInfo();\n\n if (!activeStreamInfo || !textController) {\n return false;\n }\n\n return textController.isTextEnabled(activeStreamInfo);\n }\n\n /**\n * Use this method to change the current text track for both external time text files and fragmented text tracks. There is no need to\n * set the track mode on the video object to switch a track when using this method.\n * @param {number} idx - Index of track based on the order of the order the tracks are added Use -1 to disable all tracks. (turn captions off). Use module:MediaPlayer#dashjs.MediaPlayer.events.TEXT_TRACK_ADDED.\n * @see {@link MediaPlayerEvents#event:TEXT_TRACK_ADDED dashjs.MediaPlayer.events.TEXT_TRACK_ADDED}\n * @throws {@link module:MediaPlayer~PLAYBACK_NOT_INITIALIZED_ERROR PLAYBACK_NOT_INITIALIZED_ERROR} if called before initializePlayback function\n * @memberof module:MediaPlayer\n * @instance\n */\n function setTextTrack(idx) {\n if (!playbackInitialized) {\n throw PLAYBACK_NOT_INITIALIZED_ERROR;\n }\n\n const activeStreamInfo = streamController.getActiveStreamInfo();\n\n if (!activeStreamInfo || !textController) {\n return;\n }\n\n textController.setTextTrack(activeStreamInfo.id, idx);\n }\n\n function getCurrentTextTrackIndex() {\n let idx = NaN;\n\n const activeStreamInfo = streamController.getActiveStreamInfo();\n\n if (!activeStreamInfo || !textController) {\n return;\n }\n\n idx = textController.getCurrentTrackIdx(activeStreamInfo.id);\n\n return idx;\n }\n\n /*\n ---------------------------------------------------------------------------\n\n VIDEO ELEMENT MANAGEMENT\n\n ---------------------------------------------------------------------------\n */\n\n /**\n * Returns instance of Video Element that was attached by calling attachView()\n * @returns {Object}\n * @memberof module:MediaPlayer\n * @throws {@link module:MediaPlayer~ELEMENT_NOT_ATTACHED_ERROR ELEMENT_NOT_ATTACHED_ERROR} if called before attachView function\n * @instance\n */\n function getVideoElement() {\n if (!videoModel.getElement()) {\n throw ELEMENT_NOT_ATTACHED_ERROR;\n }\n return videoModel.getElement();\n }\n\n /**\n * Use this method to attach an HTML5 VideoElement for dash.js to operate upon.\n *\n * @param {Object} element - An HTMLMediaElement that has already been defined in the DOM (or equivalent stub).\n * @memberof module:MediaPlayer\n * @throws {@link module:MediaPlayer~MEDIA_PLAYER_NOT_INITIALIZED_ERROR MEDIA_PLAYER_NOT_INITIALIZED_ERROR} if called before initialize function\n * @instance\n */\n function attachView(element) {\n if (!mediaPlayerInitialized) {\n throw MEDIA_PLAYER_NOT_INITIALIZED_ERROR;\n }\n\n videoModel.setElement(element);\n\n if (element) {\n _detectProtection();\n _detectMetricsReporting();\n _detectMss();\n\n if (streamController) {\n streamController.switchToVideoElement(providedStartTime);\n }\n }\n\n if (playbackInitialized) { //Reset if we have been playing before, so this is a new element.\n _resetPlaybackControllers();\n }\n\n _initializePlayback(providedStartTime);\n }\n\n /**\n * Returns instance of Div that was attached by calling attachTTMLRenderingDiv()\n * @returns {Object}\n * @memberof module:MediaPlayer\n * @instance\n */\n function getTTMLRenderingDiv() {\n return videoModel ? videoModel.getTTMLRenderingDiv() : null;\n }\n\n /**\n * Use this method to attach an HTML5 div for dash.js to render rich TTML subtitles.\n *\n * @param {HTMLDivElement} div - An unstyled div placed after the video element. It will be styled to match the video size and overlay z-order.\n * @memberof module:MediaPlayer\n * @throws {@link module:MediaPlayer~ELEMENT_NOT_ATTACHED_ERROR ELEMENT_NOT_ATTACHED_ERROR} if called before attachView function\n * @instance\n */\n function attachTTMLRenderingDiv(div) {\n if (!videoModel.getElement()) {\n throw ELEMENT_NOT_ATTACHED_ERROR;\n }\n videoModel.setTTMLRenderingDiv(div);\n }\n\n function attachVttRenderingDiv(div) {\n if (!videoModel.getElement()) {\n throw ELEMENT_NOT_ATTACHED_ERROR;\n }\n videoModel.setVttRenderingDiv(div);\n }\n\n /*\n ---------------------------------------------------------------------------\n\n STREAM AND TRACK MANAGEMENT\n\n ---------------------------------------------------------------------------\n */\n /**\n * @param {MediaType} type\n * @returns {Array}\n * @memberof module:MediaPlayer\n * @throws {@link module:MediaPlayer~STREAMING_NOT_INITIALIZED_ERROR STREAMING_NOT_INITIALIZED_ERROR} if called before initializePlayback function\n * @instance\n */\n function getBitrateInfoListFor(type) {\n if (!streamingInitialized) {\n throw STREAMING_NOT_INITIALIZED_ERROR;\n }\n let stream = getActiveStream();\n return stream ? stream.getBitrateListFor(type) : [];\n }\n\n /**\n * This method returns the list of all available streams from a given manifest\n * @param {Object} manifest\n * @returns {Array} list of {@link StreamInfo}\n * @memberof module:MediaPlayer\n * @throws {@link module:MediaPlayer~STREAMING_NOT_INITIALIZED_ERROR STREAMING_NOT_INITIALIZED_ERROR} if called before initializePlayback function\n * @instance\n */\n function getStreamsFromManifest(manifest) {\n if (!streamingInitialized) {\n throw STREAMING_NOT_INITIALIZED_ERROR;\n }\n return adapter.getStreamsInfo(manifest);\n }\n\n /**\n * This method returns the list of all available tracks for a given media type\n * @param {MediaType} type\n * @returns {Array} list of {@link MediaInfo}\n * @memberof module:MediaPlayer\n * @throws {@link module:MediaPlayer~STREAMING_NOT_INITIALIZED_ERROR STREAMING_NOT_INITIALIZED_ERROR} if called before initializePlayback function\n * @instance\n */\n function getTracksFor(type) {\n if (!streamingInitialized) {\n throw STREAMING_NOT_INITIALIZED_ERROR;\n }\n let streamInfo = streamController.getActiveStreamInfo();\n\n if (!streamInfo) {\n return [];\n }\n\n return mediaController.getTracksFor(type, streamInfo.id);\n }\n\n /**\n * This method returns the list of all available tracks for a given media type and streamInfo from a given manifest\n * @param {MediaType} type\n * @param {Object} manifest\n * @param {Object} streamInfo\n * @returns {Array} list of {@link MediaInfo}\n * @memberof module:MediaPlayer\n * @throws {@link module:MediaPlayer~STREAMING_NOT_INITIALIZED_ERROR STREAMING_NOT_INITIALIZED_ERROR} if called before initializePlayback function\n * @instance\n */\n function getTracksForTypeFromManifest(type, manifest, streamInfo) {\n if (!streamingInitialized) {\n throw STREAMING_NOT_INITIALIZED_ERROR;\n }\n\n streamInfo = streamInfo || adapter.getStreamsInfo(manifest, 1)[0];\n\n return streamInfo ? adapter.getAllMediaInfoForType(streamInfo, type, manifest) : [];\n }\n\n /**\n * @param {MediaType} type\n * @returns {Object|null} {@link MediaInfo}\n *\n * @memberof module:MediaPlayer\n * @throws {@link module:MediaPlayer~STREAMING_NOT_INITIALIZED_ERROR STREAMING_NOT_INITIALIZED_ERROR} if called before initializePlayback function\n * @instance\n */\n function getCurrentTrackFor(type) {\n if (!streamingInitialized) {\n throw STREAMING_NOT_INITIALIZED_ERROR;\n }\n let streamInfo = streamController.getActiveStreamInfo();\n return mediaController.getCurrentTrackFor(type, streamInfo.id);\n }\n\n /**\n * This method allows to set media settings that will be used to pick the initial track. Format of the settings\n * is following: <br />\n * {lang: langValue (can be either a string primitive, a string object, or a RegExp object to match),\n * index: indexValue,\n * viewpoint: viewpointValue,\n * audioChannelConfiguration: audioChannelConfigurationValue,\n * accessibility: accessibilityValue,\n * role: roleValue}\n *\n * @param {MediaType} type\n * @param {Object} value\n * @memberof module:MediaPlayer\n * @throws {@link module:MediaPlayer~MEDIA_PLAYER_NOT_INITIALIZED_ERROR MEDIA_PLAYER_NOT_INITIALIZED_ERROR} if called before initialize function\n * @instance\n */\n function setInitialMediaSettingsFor(type, value) {\n if (!mediaPlayerInitialized) {\n throw MEDIA_PLAYER_NOT_INITIALIZED_ERROR;\n }\n mediaController.setInitialSettings(type, value);\n }\n\n /**\n * This method returns media settings that is used to pick the initial track. Format of the settings\n * is following:\n * {lang: langValue,\n * index: indexValue,\n * viewpoint: viewpointValue,\n * audioChannelConfiguration: audioChannelConfigurationValue,\n * accessibility: accessibilityValue,\n * role: roleValue}\n * @param {MediaType} type\n * @returns {Object}\n * @memberof module:MediaPlayer\n * @throws {@link module:MediaPlayer~MEDIA_PLAYER_NOT_INITIALIZED_ERROR MEDIA_PLAYER_NOT_INITIALIZED_ERROR} if called before initialize function\n * @instance\n */\n function getInitialMediaSettingsFor(type) {\n if (!mediaPlayerInitialized) {\n throw MEDIA_PLAYER_NOT_INITIALIZED_ERROR;\n }\n return mediaController.getInitialSettings(type);\n }\n\n /**\n * @param {MediaInfo} track - instance of {@link MediaInfo}\n * @param {boolean} [noSettingsSave] - specify if settings from the track must not be saved for incoming track selection\n * @memberof module:MediaPlayer\n * @throws {@link module:MediaPlayer~STREAMING_NOT_INITIALIZED_ERROR STREAMING_NOT_INITIALIZED_ERROR} if called before initializePlayback function\n * @instance\n */\n function setCurrentTrack(track, noSettingsSave = false) {\n if (!streamingInitialized) {\n throw STREAMING_NOT_INITIALIZED_ERROR;\n }\n mediaController.setTrack(track, noSettingsSave);\n }\n\n /*\n ---------------------------------------------------------------------------\n\n Custom filter and callback functions\n\n ---------------------------------------------------------------------------\n */\n /**\n * Registers a custom capabilities filter. This enables application to filter representations to use.\n * The provided callback function shall return a boolean based on whether or not to use the representation.\n * The filters are applied in the order they are registered.\n * @param {function} filter - the custom capabilities filter callback\n * @memberof module:MediaPlayer\n * @instance\n */\n function registerCustomCapabilitiesFilter(filter) {\n customParametersModel.registerCustomCapabilitiesFilter(filter);\n }\n\n /**\n * Unregisters a custom capabilities filter.\n * @param {function} filter - the custom capabilities filter callback\n * @memberof module:MediaPlayer\n * @instance\n */\n function unregisterCustomCapabilitiesFilter(filter) {\n customParametersModel.unregisterCustomCapabilitiesFilter(filter);\n }\n\n /**\n * Registers a custom initial track selection function. Only one function is allowed. Calling this method will overwrite a potentially existing function.\n * @param {function} customFunc - the custom function that returns the initial track\n */\n function setCustomInitialTrackSelectionFunction(customFunc) {\n customParametersModel.setCustomInitialTrackSelectionFunction(customFunc);\n }\n\n /**\n * Resets the custom initial track selection\n */\n function resetCustomInitialTrackSelectionFunction() {\n customParametersModel.resetCustomInitialTrackSelectionFunction(null);\n\n }\n\n /**\n * Registers a license request filter. This enables application to manipulate/overwrite any request parameter and/or request data.\n * The provided callback function shall return a promise that shall be resolved once the filter process is completed.\n * The filters are applied in the order they are registered.\n * @param {function} filter - the license request filter callback\n * @memberof module:MediaPlayer\n * @instance\n */\n function registerLicenseRequestFilter(filter) {\n customParametersModel.registerLicenseRequestFilter(filter);\n }\n\n /**\n * Registers a license response filter. This enables application to manipulate/overwrite the response data\n * The provided callback function shall return a promise that shall be resolved once the filter process is completed.\n * The filters are applied in the order they are registered.\n * @param {function} filter - the license response filter callback\n * @memberof module:MediaPlayer\n * @instance\n */\n function registerLicenseResponseFilter(filter) {\n customParametersModel.registerLicenseResponseFilter(filter);\n }\n\n /**\n * Unregisters a license request filter.\n * @param {function} filter - the license request filter callback\n * @memberof module:MediaPlayer\n * @instance\n */\n function unregisterLicenseRequestFilter(filter) {\n customParametersModel.unregisterLicenseRequestFilter(filter);\n }\n\n /**\n * Unregisters a license response filter.\n * @param {function} filter - the license response filter callback\n * @memberof module:MediaPlayer\n * @instance\n */\n function unregisterLicenseResponseFilter(filter) {\n customParametersModel.unregisterLicenseResponseFilter(filter);\n }\n\n /*\n ---------------------------------------------------------------------------\n\n PROTECTION MANAGEMENT\n\n ---------------------------------------------------------------------------\n */\n\n /**\n * Detects if Protection is included and returns an instance of ProtectionController.js\n * @memberof module:MediaPlayer\n * @instance\n */\n function getProtectionController() {\n return _detectProtection();\n }\n\n /**\n * Will override dash.js protection controller.\n * @param {ProtectionController} value - valid protection controller instance.\n * @memberof module:MediaPlayer\n * @instance\n */\n function attachProtectionController(value) {\n protectionController = value;\n }\n\n /**\n * Sets Protection Data required to setup the Protection Module (DRM). Protection Data must\n * be set before initializing MediaPlayer or, once initialized, before PROTECTION_CREATED event is fired.\n * @see {@link module:MediaPlayer#initialize initialize()}\n * @see {@link ProtectionEvents#event:PROTECTION_CREATED dashjs.Protection.events.PROTECTION_CREATED}\n * @param {ProtectionDataSet} value - object containing\n * property names corresponding to key system name strings and associated\n * values being instances of.\n * @memberof module:MediaPlayer\n * @instance\n */\n function setProtectionData(value) {\n protectionData = value;\n\n // Propagate changes in case StreamController is already created\n if (streamController) {\n streamController.setProtectionData(protectionData);\n }\n }\n\n /*\n ---------------------------------------------------------------------------\n\n THUMBNAILS MANAGEMENT\n\n ---------------------------------------------------------------------------\n */\n\n /**\n * Provide the thumbnail at time position. This can be asynchronous, so you must provide a callback ro retrieve thumbnails informations\n * @param {number} time - A relative time, in seconds, based on the return value of the {@link module:MediaPlayer#duration duration()} method is expected\n * @param {function} callback - A Callback function provided when retrieving thumbnail the given time position. Thumbnail object is null in case there are is not a thumbnails representation or\n * if it doesn't contain a thumbnail for the given time position.\n * @memberof module:MediaPlayer\n * @instance\n */\n function provideThumbnail(time, callback) {\n if (typeof callback !== 'function') {\n return;\n }\n if (time < 0) {\n callback(null);\n return;\n }\n const s = playbackController.getIsDynamic() ? getDVRSeekOffset(time) : time;\n const stream = streamController.getStreamForTime(s);\n if (stream === null) {\n callback(null);\n return;\n }\n\n const thumbnailController = stream.getThumbnailController();\n if (!thumbnailController) {\n callback(null);\n return;\n }\n\n return thumbnailController.provide(s, callback);\n }\n\n /*\n ---------------------------------------------------------------------------\n\n TOOLS AND OTHERS FUNCTIONS\n\n ---------------------------------------------------------------------------\n */\n /**\n * Allows application to retrieve a manifest. Manifest loading is asynchronous and requires the app-provided callback function\n *\n * @param {string} url - url the manifest url\n * @param {function} callback - A Callback function provided when retrieving manifests\n * @memberof module:MediaPlayer\n * @instance\n */\n function retrieveManifest(url, callback) {\n let manifestLoader = _createManifestLoader();\n let self = this;\n\n const handler = function (e) {\n if (!e.error) {\n callback(e.manifest);\n } else {\n callback(null, e.error);\n }\n eventBus.off(Events.INTERNAL_MANIFEST_LOADED, handler, self);\n manifestLoader.reset();\n };\n\n eventBus.on(Events.INTERNAL_MANIFEST_LOADED, handler, self);\n\n uriFragmentModel.initialize(url);\n manifestLoader.load(url);\n }\n\n /**\n * Returns the source string or manifest that was attached by calling attachSource()\n * @returns {string | manifest}\n * @memberof module:MediaPlayer\n * @throws {@link module:MediaPlayer~SOURCE_NOT_ATTACHED_ERROR SOURCE_NOT_ATTACHED_ERROR} if called before attachSource function\n * @instance\n */\n function getSource() {\n if (!source) {\n throw SOURCE_NOT_ATTACHED_ERROR;\n }\n return source;\n }\n\n /**\n * Sets the source to a new manifest URL or object without reloading\n * Useful for updating CDN tokens\n * @param urlOrManifest\n */\n function updateSource(urlOrManifest) {\n source = urlOrManifest\n streamController.load(source);\n }\n\n /**\n * Use this method to set a source URL to a valid MPD manifest file OR\n * a previously downloaded and parsed manifest object. Optionally, can\n * also provide protection information\n *\n * @param {string|Object} urlOrManifest - A URL to a valid MPD manifest file, or a\n * parsed manifest object.\n * @param {number|string} startTime - For VoD content the start time is relative to the start time of the first period.\n * For live content\n * If the parameter starts from prefix posix: it signifies the absolute time range defined in seconds of Coordinated Universal Time (ITU-R TF.460-6). This is the number of seconds since 01-01-1970 00:00:00 UTC. Fractions of seconds may be optionally specified down to the millisecond level.\n * If no posix prefix is used the starttime is relative to MPD@availabilityStartTime\n *\n * @throws {@link module:MediaPlayer~MEDIA_PLAYER_NOT_INITIALIZED_ERROR MEDIA_PLAYER_NOT_INITIALIZED_ERROR} if called before initialize function\n *\n * @memberof module:MediaPlayer\n * @instance\n */\n function attachSource(urlOrManifest, startTime = NaN) {\n if (!mediaPlayerInitialized) {\n throw MEDIA_PLAYER_NOT_INITIALIZED_ERROR;\n }\n\n if (typeof urlOrManifest === 'string') {\n uriFragmentModel.initialize(urlOrManifest);\n }\n\n if (startTime == null) {\n startTime = NaN;\n }\n\n if (!isNaN(startTime)) {\n startTime = Math.max(0, startTime);\n }\n\n providedStartTime = startTime;\n source = urlOrManifest;\n\n if (streamingInitialized || playbackInitialized) {\n _resetPlaybackControllers();\n }\n\n if (isReady()) {\n _initializePlayback(providedStartTime);\n }\n }\n\n /**\n * Reload the manifest that the player is currently using.\n *\n * @memberof module:MediaPlayer\n * @param {function} callback - A Callback function provided when retrieving manifests\n * @instance\n */\n function refreshManifest(callback) {\n if (!mediaPlayerInitialized) {\n throw MEDIA_PLAYER_NOT_INITIALIZED_ERROR;\n }\n\n if (!isReady()) {\n return callback(null, SOURCE_NOT_ATTACHED_ERROR);\n }\n\n let self = this;\n\n if (typeof callback === 'function') {\n const handler = function (e) {\n eventBus.off(Events.INTERNAL_MANIFEST_LOADED, handler, self);\n\n if (e.error) {\n callback(null, e.error);\n return;\n }\n\n callback(e.manifest);\n };\n\n eventBus.on(Events.INTERNAL_MANIFEST_LOADED, handler, self);\n }\n\n streamController.refreshManifest();\n }\n\n /**\n * Get the current settings object being used on the player.\n * @returns {PlayerSettings} The settings object being used.\n *\n * @memberof module:MediaPlayer\n * @instance\n */\n function getSettings() {\n return settings.get();\n }\n\n /**\n * @summary Update the current settings object being used on the player. Anything left unspecified is not modified.\n * @param {PlayerSettings} settingsObj - An object corresponding to the settings definition.\n * @description This function does not update the entire object, only properties in the passed in object are updated.\n *\n * This means that updateSettings({a: x}) and updateSettings({b: y}) are functionally equivalent to\n * updateSettings({a: x, b: y}). If the default values are required again, @see{@link resetSettings}.\n * @example\n * player.updateSettings({\n * streaming: {\n * lowLatencyEnabled: false,\n * abr: {\n * maxBitrate: { audio: 100, video: 1000 }\n * }\n * }\n * });\n * @memberof module:MediaPlayer\n * @instance\n */\n function updateSettings(settingsObj) {\n settings.update(settingsObj);\n }\n\n /**\n * Resets the settings object back to the default.\n *\n * @memberof module:MediaPlayer\n * @instance\n */\n function resetSettings() {\n settings.reset();\n }\n\n /**\n * A utility methods which converts UTC timestamp value into a valid time and date string.\n *\n * @param {number} time - UTC timestamp to be converted into date and time.\n * @param {string} locales - a region identifier (i.e. en_US).\n * @param {boolean} hour12 - 12 vs 24 hour. Set to true for 12 hour time formatting.\n * @param {boolean} withDate - default is false. Set to true to append current date to UTC time format.\n * @returns {string} A formatted time and date string.\n * @memberof module:MediaPlayer\n * @instance\n */\n function formatUTC(time, locales, hour12, withDate = false) {\n const dt = new Date(time * 1000);\n const d = dt.toLocaleDateString(locales);\n const t = dt.toLocaleTimeString(locales, {\n hour12: hour12\n });\n return withDate ? t + ' ' + d : t;\n }\n\n /**\n * A utility method which converts seconds into TimeCode (i.e. 300 --> 05:00).\n *\n * @param {number} value - A number in seconds to be converted into a formatted time code.\n * @returns {string} A formatted time code string.\n * @memberof module:MediaPlayer\n * @instance\n */\n function convertToTimeCode(value) {\n value = Math.max(value, 0);\n\n let h = Math.floor(value / 3600);\n let m = Math.floor((value % 3600) / 60);\n let s = Math.floor((value % 3600) % 60);\n return (h === 0 ? '' : (h < 10 ? '0' + h.toString() + ':' : h.toString() + ':')) + (m < 10 ? '0' + m.toString() : m.toString()) + ':' + (s < 10 ? '0' + s.toString() : s.toString());\n }\n\n /**\n * This method should be used to extend or replace internal dash.js objects.\n * There are two ways to extend dash.js (determined by the override argument):\n * <ol>\n * <li>If you set override to true any public method or property in your custom object will\n * override the dash.js parent object's property(ies) and will be used instead but the\n * dash.js parent module will still be created.</li>\n *\n * <li>If you set override to false your object will completely replace the dash.js object.\n * (Note: This is how it was in 1.x of Dash.js with Dijon).</li>\n * </ol>\n * <b>When you extend you get access to this.context, this.factory and this.parent to operate with in your custom object.</b>\n * <ul>\n * <li><b>this.context</b> - can be used to pass context for singleton access.</li>\n * <li><b>this.factory</b> - can be used to call factory.getSingletonInstance().</li>\n * <li><b>this.parent</b> - is the reference of the parent object to call other public methods. (this.parent is excluded if you extend with override set to false or option 2)</li>\n * </ul>\n * <b>You must call extend before you call initialize</b>\n * @see {@link module:MediaPlayer#initialize initialize()}\n * @param {string} parentNameString - name of parent module\n * @param {Object} childInstance - overriding object\n * @param {boolean} override - replace only some methods (true) or the whole object (false)\n * @memberof module:MediaPlayer\n * @instance\n */\n function extend(parentNameString, childInstance, override) {\n FactoryMaker.extend(parentNameString, childInstance, override, context);\n }\n\n /**\n * This method returns the active stream\n *\n * @throws {@link module:MediaPlayer~STREAMING_NOT_INITIALIZED_ERROR STREAMING_NOT_INITIALIZED_ERROR} if called before initializePlayback function\n * @memberof module:MediaPlayer\n * @instance\n */\n function getActiveStream() {\n if (!streamingInitialized) {\n throw STREAMING_NOT_INITIALIZED_ERROR;\n }\n let streamInfo = streamController.getActiveStreamInfo();\n return streamInfo ? streamController.getStreamById(streamInfo.id) : null;\n }\n\n /**\n * Returns the DashAdapter.js Module.\n *\n * @see {@link module:DashAdapter}\n * @returns {Object}\n * @memberof module:MediaPlayer\n * @instance\n */\n function getDashAdapter() {\n return adapter;\n }\n\n /**\n * Triggers a request to the content steering server to update the steering information.\n * @return {Promise<any>}\n */\n function triggerSteeringRequest() {\n if (contentSteeringController) {\n return contentSteeringController.loadSteeringData();\n }\n }\n\n /**\n * Returns the current response data of the content steering server\n * @return {object}\n */\n function getCurrentSteeringResponseData() {\n if (contentSteeringController) {\n return contentSteeringController.getCurrentSteeringResponseData();\n }\n }\n\n\n /**\n * Returns all BaseURLs that are available including synthesized elements (e.g by content steering)\n * @returns {BaseURL[]}\n */\n function getAvailableBaseUrls() {\n const manifest = manifestModel.getValue();\n\n if (!manifest) {\n return [];\n }\n\n return baseURLController.getBaseUrls(manifest);\n }\n\n\n /**\n * Returns the available location elements including synthesized elements (e.g by content steering)\n * @returns {MpdLocation[]}\n */\n function getAvailableLocations() {\n const manifest = manifestModel.getValue();\n\n if (!manifest) {\n return [];\n }\n\n const manifestLocations = adapter.getLocation(manifest);\n const synthesizedElements = contentSteeringController.getSynthesizedLocationElements(manifestLocations);\n\n return manifestLocations.concat(synthesizedElements);\n }\n\n //***********************************\n // PRIVATE METHODS\n //***********************************\n\n function _resetPlaybackControllers() {\n playbackInitialized = false;\n streamingInitialized = false;\n adapter.reset();\n streamController.reset();\n gapController.reset();\n catchupController.reset();\n playbackController.reset();\n serviceDescriptionController.reset();\n contentSteeringController.reset();\n abrController.reset();\n mediaController.reset();\n segmentBaseController.reset();\n if (protectionController) {\n if (settings.get().streaming.protection.keepProtectionMediaKeys) {\n protectionController.stop();\n } else {\n protectionController.reset();\n protectionController = null;\n _detectProtection();\n }\n }\n textController.reset();\n cmcdModel.reset();\n cmsdModel.reset();\n }\n\n function _createPlaybackControllers() {\n // creates or get objects instances\n const manifestLoader = _createManifestLoader();\n\n if (!streamController) {\n streamController = StreamController(context).getInstance();\n }\n\n if (!textController) {\n textController = TextController(context).create({\n errHandler,\n manifestModel,\n adapter,\n mediaController,\n baseURLController,\n videoModel,\n settings\n });\n }\n\n capabilitiesFilter.setConfig({\n capabilities,\n customParametersModel,\n adapter,\n settings,\n manifestModel,\n errHandler\n });\n\n streamController.setConfig({\n capabilities,\n capabilitiesFilter,\n manifestLoader,\n manifestModel,\n mediaPlayerModel,\n customParametersModel,\n protectionController,\n textController,\n adapter,\n dashMetrics,\n errHandler,\n timelineConverter,\n videoModel,\n playbackController,\n serviceDescriptionController,\n contentSteeringController,\n abrController,\n mediaController,\n settings,\n baseURLController,\n uriFragmentModel,\n segmentBaseController\n });\n\n gapController.setConfig({\n settings,\n playbackController,\n streamController,\n videoModel,\n timelineConverter,\n adapter\n });\n\n playbackController.setConfig({\n streamController,\n serviceDescriptionController,\n dashMetrics,\n adapter,\n videoModel,\n timelineConverter,\n settings\n });\n\n catchupController.setConfig({\n streamController,\n playbackController,\n mediaPlayerModel,\n videoModel,\n settings\n })\n\n abrController.setConfig({\n streamController,\n domStorage,\n mediaPlayerModel,\n customParametersModel,\n cmsdModel,\n dashMetrics,\n adapter,\n videoModel,\n settings\n });\n\n cmcdModel.setConfig({\n abrController,\n dashMetrics,\n playbackController\n });\n\n cmsdModel.setConfig({});\n\n // initializes controller\n abrController.initialize();\n streamController.initialize(autoPlay, protectionData);\n textController.initialize();\n gapController.initialize();\n catchupController.initialize();\n cmcdModel.initialize();\n cmsdModel.initialize();\n contentSteeringController.initialize();\n segmentBaseController.initialize();\n }\n\n function _createManifestLoader() {\n return ManifestLoader(context).create({\n debug: debug,\n errHandler: errHandler,\n dashMetrics: dashMetrics,\n mediaPlayerModel: mediaPlayerModel,\n requestModifier: RequestModifier(context).getInstance(),\n mssHandler: mssHandler,\n settings: settings\n });\n }\n\n function _detectProtection() {\n if (protectionController) {\n return protectionController;\n }\n // do not require Protection as dependencies as this is optional and intended to be loaded separately\n let Protection = dashjs.Protection; /* jshint ignore:line */\n if (typeof Protection === 'function') { //TODO need a better way to register/detect plugin components\n let protection = Protection(context).create();\n Events.extend(Protection.events);\n MediaPlayerEvents.extend(Protection.events, {\n publicOnly: true\n });\n Errors.extend(Protection.errors);\n if (!capabilities) {\n capabilities = Capabilities(context).getInstance();\n }\n protectionController = protection.createProtectionSystem({\n debug,\n errHandler,\n videoModel,\n customParametersModel,\n capabilities,\n eventBus,\n events: Events,\n BASE64,\n constants: Constants,\n cmcdModel,\n settings\n });\n\n return protectionController;\n }\n\n return null;\n }\n\n function _detectMetricsReporting() {\n if (metricsReportingController) {\n return;\n }\n // do not require MetricsReporting as dependencies as this is optional and intended to be loaded separately\n let MetricsReporting = dashjs.MetricsReporting; /* jshint ignore:line */\n if (typeof MetricsReporting === 'function') { //TODO need a better way to register/detect plugin components\n let metricsReporting = MetricsReporting(context).create();\n\n metricsReportingController = metricsReporting.createMetricsReporting({\n debug: debug,\n eventBus: eventBus,\n mediaElement: getVideoElement(),\n adapter: adapter,\n dashMetrics: dashMetrics,\n mediaPlayerModel: mediaPlayerModel,\n events: Events,\n constants: Constants,\n metricsConstants: MetricsConstants\n });\n }\n }\n\n function _detectMss() {\n if (mssHandler) {\n return;\n }\n // do not require MssHandler as dependencies as this is optional and intended to be loaded separately\n let MssHandler = dashjs.MssHandler; /* jshint ignore:line */\n if (typeof MssHandler === 'function') { //TODO need a better way to register/detect plugin components\n Errors.extend(MssHandler.errors);\n mssHandler = MssHandler(context).create({\n eventBus: eventBus,\n mediaPlayerModel: mediaPlayerModel,\n dashMetrics: dashMetrics,\n manifestModel: manifestModel,\n playbackController: playbackController,\n streamController: streamController,\n protectionController: protectionController,\n baseURLController: baseURLController,\n errHandler: errHandler,\n events: Events,\n constants: Constants,\n debug: debug,\n initSegmentType: HTTPRequest.INIT_SEGMENT_TYPE,\n BASE64: BASE64,\n ISOBoxer: ISOBoxer,\n settings: settings\n });\n }\n }\n\n function _detectOffline() {\n if (!mediaPlayerInitialized) {\n throw MEDIA_PLAYER_NOT_INITIALIZED_ERROR;\n }\n\n if (offlineController) {\n return offlineController;\n }\n\n // do not require Offline as dependencies as this is optional and intended to be loaded separately\n let OfflineController = dashjs.OfflineController; /* jshint ignore:line */\n\n if (typeof OfflineController === 'function') { //TODO need a better way to register/detect plugin components\n Events.extend(OfflineController.events);\n MediaPlayerEvents.extend(OfflineController.events, {\n publicOnly: true\n });\n Errors.extend(OfflineController.errors);\n\n const manifestLoader = _createManifestLoader();\n const manifestUpdater = ManifestUpdater(context).create();\n\n manifestUpdater.setConfig({\n manifestModel,\n adapter,\n manifestLoader,\n errHandler,\n contentSteeringController\n });\n\n offlineController = OfflineController(context).create({\n debug: debug,\n manifestUpdater: manifestUpdater,\n baseURLController: baseURLController,\n manifestLoader: manifestLoader,\n manifestModel: manifestModel,\n mediaPlayerModel: mediaPlayerModel,\n abrController: abrController,\n playbackController: playbackController,\n adapter: adapter,\n errHandler: errHandler,\n dashMetrics: dashMetrics,\n timelineConverter: timelineConverter,\n segmentBaseController: segmentBaseController,\n schemeLoaderFactory: schemeLoaderFactory,\n eventBus: eventBus,\n events: Events,\n errors: Errors,\n constants: Constants,\n settings: settings,\n dashConstants: DashConstants,\n urlUtils: URLUtils(context).getInstance()\n });\n return offlineController;\n }\n\n return null;\n }\n\n function _getAsUTC(valToConvert) {\n const type = streamController && streamController.hasVideoTrack() ? Constants.VIDEO : Constants.AUDIO;\n let metric = dashMetrics.getCurrentDVRInfo(type);\n let availableFrom,\n utcValue;\n\n if (!metric) {\n return 0;\n }\n availableFrom = metric.manifestInfo.availableFrom.getTime() / 1000;\n utcValue = valToConvert + (availableFrom + metric.range.start);\n return utcValue;\n }\n\n /**\n *\n * @private\n */\n function _initializePlayback(startTime = NaN) {\n\n if (offlineController) {\n offlineController.resetRecords();\n }\n\n if (!streamingInitialized && source) {\n streamingInitialized = true;\n logger.info('Streaming Initialized');\n _createPlaybackControllers();\n\n if (typeof source === 'string') {\n streamController.load(source, startTime);\n } else {\n streamController.loadWithManifest(source, startTime);\n }\n }\n\n if (!playbackInitialized && isReady()) {\n playbackInitialized = true;\n logger.info('Playback Initialized');\n }\n }\n\n instance = {\n initialize,\n setConfig,\n on,\n off,\n extend,\n attachView,\n attachSource,\n refreshManifest,\n isReady,\n preload,\n play,\n isPaused,\n pause,\n isSeeking,\n isDynamic,\n getLowLatencyModeEnabled,\n seek,\n seekToOriginalLive,\n setPlaybackRate,\n getPlaybackRate,\n setMute,\n isMuted,\n setVolume,\n getVolume,\n time,\n duration,\n timeAsUTC,\n durationAsUTC,\n getActiveStream,\n getDVRWindowSize,\n getDVRSeekOffset,\n getAvailableBaseUrls,\n getAvailableLocations,\n getTargetLiveDelay,\n convertToTimeCode,\n formatUTC,\n getVersion,\n getDebug,\n getBufferLength,\n getTTMLRenderingDiv,\n getVideoElement,\n getSource,\n updateSource,\n getCurrentLiveLatency,\n getTopBitrateInfoFor,\n setAutoPlay,\n getAutoPlay,\n getDashMetrics,\n getQualityFor,\n setQualityFor,\n updatePortalSize,\n enableText,\n enableForcedTextStreaming,\n isTextEnabled,\n setTextTrack,\n getBitrateInfoListFor,\n getStreamsFromManifest,\n getTracksFor,\n getTracksForTypeFromManifest,\n getCurrentTrackFor,\n setInitialMediaSettingsFor,\n getInitialMediaSettingsFor,\n setCurrentTrack,\n addABRCustomRule,\n removeABRCustomRule,\n removeAllABRCustomRule,\n getABRCustomRules,\n getAverageThroughput,\n retrieveManifest,\n addUTCTimingSource,\n removeUTCTimingSource,\n clearDefaultUTCTimingSources,\n restoreDefaultUTCTimingSources,\n setXHRWithCredentialsForType,\n getXHRWithCredentialsForType,\n getProtectionController,\n attachProtectionController,\n setProtectionData,\n registerLicenseRequestFilter,\n registerLicenseResponseFilter,\n unregisterLicenseRequestFilter,\n unregisterLicenseResponseFilter,\n registerCustomCapabilitiesFilter,\n unregisterCustomCapabilitiesFilter,\n setCustomInitialTrackSelectionFunction,\n resetCustomInitialTrackSelectionFunction,\n attachTTMLRenderingDiv,\n attachVttRenderingDiv,\n getCurrentTextTrackIndex,\n provideThumbnail,\n getDashAdapter,\n getOfflineController,\n triggerSteeringRequest,\n getCurrentSteeringResponseData,\n getSettings,\n updateSettings,\n resetSettings,\n reset,\n destroy\n };\n\n setup();\n\n return instance;\n}\n\nMediaPlayer.__dashjs_factory_name = 'MediaPlayer';\nconst factory = FactoryMaker.getClassFactory(MediaPlayer);\nfactory.events = MediaPlayerEvents;\nfactory.errors = Errors;\nFactoryMaker.updateClassFactory(MediaPlayer.__dashjs_factory_name, factory);\n\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport EventsBase from '../core/events/EventsBase';\n\n/**\n * @class\n * @implements EventsBase\n */\nclass MediaPlayerEvents extends EventsBase {\n\n /**\n * @description Public facing external events to be used when developing a player that implements dash.js.\n */\n constructor() {\n super();\n /**\n * Triggered when playback will not start yet\n * as the MPD's availabilityStartTime is in the future.\n * Check delay property in payload to determine time before playback will start.\n * @event MediaPlayerEvents#AST_IN_FUTURE\n */\n this.AST_IN_FUTURE = 'astInFuture';\n\n /**\n * Triggered when the BaseURLs have been updated.\n * @event MediaPlayerEvents#BASE_URLS_UPDATED\n */\n this.BASE_URLS_UPDATED = 'baseUrlsUpdated';\n\n /**\n * Triggered when the video element's buffer state changes to stalled.\n * Check mediaType in payload to determine type (Video, Audio, FragmentedText).\n * @event MediaPlayerEvents#BUFFER_EMPTY\n */\n this.BUFFER_EMPTY = 'bufferStalled';\n\n /**\n * Triggered when the video element's buffer state changes to loaded.\n * Check mediaType in payload to determine type (Video, Audio, FragmentedText).\n * @event MediaPlayerEvents#BUFFER_LOADED\n */\n this.BUFFER_LOADED = 'bufferLoaded';\n\n /**\n * Triggered when the video element's buffer state changes, either stalled or loaded. Check payload for state.\n * @event MediaPlayerEvents#BUFFER_LEVEL_STATE_CHANGED\n */\n this.BUFFER_LEVEL_STATE_CHANGED = 'bufferStateChanged';\n\n /**\n * Triggered when the buffer level of a media type has been updated\n * @event MediaPlayerEvents#BUFFER_LEVEL_UPDATED\n */\n this.BUFFER_LEVEL_UPDATED = 'bufferLevelUpdated';\n\n /**\n * Triggered when a font signalled by a DVB Font Download has been added to the document FontFaceSet interface.\n * @event MediaPlayerEvents#DVB_FONT_DOWNLOAD_ADDED\n */\n this.DVB_FONT_DOWNLOAD_ADDED = 'dvbFontDownloadAdded';\n\n /**\n * Triggered when a font signalled by a DVB Font Download has successfully downloaded and the FontFace can be used.\n * @event MediaPlayerEvents#DVB_FONT_DOWNLOAD_COMPLETE\n */\n this.DVB_FONT_DOWNLOAD_COMPLETE = 'dvbFontDownloadComplete';\n\n /**\n * Triggered when a font signalled by a DVB Font Download could not be successfully downloaded, so the FontFace will not be used.\n * @event MediaPlayerEvents#DVB_FONT_DOWNLOAD_FAILED\n */\n this.DVB_FONT_DOWNLOAD_FAILED = 'dvbFontDownloadFailed';\n\n /**\n * Triggered when a dynamic stream changed to static (transition phase between Live and On-Demand).\n * @event MediaPlayerEvents#DYNAMIC_TO_STATIC\n */\n this.DYNAMIC_TO_STATIC = 'dynamicToStatic';\n\n /**\n * Triggered when there is an error from the element or MSE source buffer.\n * @event MediaPlayerEvents#ERROR\n */\n this.ERROR = 'error';\n /**\n * Triggered when a fragment download has completed.\n * @event MediaPlayerEvents#FRAGMENT_LOADING_COMPLETED\n */\n this.FRAGMENT_LOADING_COMPLETED = 'fragmentLoadingCompleted';\n\n /**\n * Triggered when a partial fragment download has completed.\n * @event MediaPlayerEvents#FRAGMENT_LOADING_PROGRESS\n */\n this.FRAGMENT_LOADING_PROGRESS = 'fragmentLoadingProgress';\n /**\n * Triggered when a fragment download has started.\n * @event MediaPlayerEvents#FRAGMENT_LOADING_STARTED\n */\n this.FRAGMENT_LOADING_STARTED = 'fragmentLoadingStarted';\n\n /**\n * Triggered when a fragment download is abandoned due to detection of slow download base on the ABR abandon rule..\n * @event MediaPlayerEvents#FRAGMENT_LOADING_ABANDONED\n */\n this.FRAGMENT_LOADING_ABANDONED = 'fragmentLoadingAbandoned';\n\n /**\n * Triggered when {@link module:Debug} logger methods are called.\n * @event MediaPlayerEvents#LOG\n */\n this.LOG = 'log';\n\n /**\n * Triggered when the manifest load is started\n * @event MediaPlayerEvents#MANIFEST_LOADING_STARTED\n */\n this.MANIFEST_LOADING_STARTED = 'manifestLoadingStarted';\n\n /**\n * Triggered when the manifest loading is finished, providing the request object information\n * @event MediaPlayerEvents#MANIFEST_LOADING_FINISHED\n */\n this.MANIFEST_LOADING_FINISHED = 'manifestLoadingFinished';\n\n /**\n * Triggered when the manifest load is complete, providing the payload\n * @event MediaPlayerEvents#MANIFEST_LOADED\n */\n this.MANIFEST_LOADED = 'manifestLoaded';\n\n /**\n * Triggered anytime there is a change to the overall metrics.\n * @event MediaPlayerEvents#METRICS_CHANGED\n */\n this.METRICS_CHANGED = 'metricsChanged';\n\n /**\n * Triggered when an individual metric is added, updated or cleared.\n * @event MediaPlayerEvents#METRIC_CHANGED\n */\n this.METRIC_CHANGED = 'metricChanged';\n\n /**\n * Triggered every time a new metric is added.\n * @event MediaPlayerEvents#METRIC_ADDED\n */\n this.METRIC_ADDED = 'metricAdded';\n\n /**\n * Triggered every time a metric is updated.\n * @event MediaPlayerEvents#METRIC_UPDATED\n */\n this.METRIC_UPDATED = 'metricUpdated';\n\n /**\n * Triggered when a new stream (period) starts.\n * @event MediaPlayerEvents#PERIOD_SWITCH_STARTED\n */\n this.PERIOD_SWITCH_STARTED = 'periodSwitchStarted';\n\n /**\n * Triggered at the stream end of a period.\n * @event MediaPlayerEvents#PERIOD_SWITCH_COMPLETED\n */\n this.PERIOD_SWITCH_COMPLETED = 'periodSwitchCompleted';\n\n /**\n * Triggered when an ABR up /down switch is initiated; either by user in manual mode or auto mode via ABR rules.\n * @event MediaPlayerEvents#QUALITY_CHANGE_REQUESTED\n */\n this.QUALITY_CHANGE_REQUESTED = 'qualityChangeRequested';\n\n /**\n * Triggered when the new ABR quality is being rendered on-screen.\n * @event MediaPlayerEvents#QUALITY_CHANGE_RENDERED\n */\n this.QUALITY_CHANGE_RENDERED = 'qualityChangeRendered';\n\n /**\n * Triggered when the new track is being rendered.\n * @event MediaPlayerEvents#TRACK_CHANGE_RENDERED\n */\n this.TRACK_CHANGE_RENDERED = 'trackChangeRendered';\n\n /**\n * Triggered when a stream (period) is being loaded\n * @event MediaPlayerEvents#STREAM_INITIALIZING\n */\n this.STREAM_INITIALIZING = 'streamInitializing';\n\n /**\n * Triggered when a stream (period) is loaded\n * @event MediaPlayerEvents#STREAM_UPDATED\n */\n this.STREAM_UPDATED = 'streamUpdated';\n\n /**\n * Triggered when a stream (period) is activated\n * @event MediaPlayerEvents#STREAM_ACTIVATED\n */\n this.STREAM_ACTIVATED = 'streamActivated';\n\n /**\n * Triggered when a stream (period) is deactivated\n * @event MediaPlayerEvents#STREAM_DEACTIVATED\n */\n this.STREAM_DEACTIVATED = 'streamDeactivated';\n\n /**\n * Triggered when a stream (period) is activated\n * @event MediaPlayerEvents#STREAM_INITIALIZED\n */\n this.STREAM_INITIALIZED = 'streamInitialized';\n\n /**\n * Triggered when the player has been reset.\n * @event MediaPlayerEvents#STREAM_TEARDOWN_COMPLETE\n */\n this.STREAM_TEARDOWN_COMPLETE = 'streamTeardownComplete';\n\n /**\n * Triggered once all text tracks detected in the MPD are added to the video element.\n * @event MediaPlayerEvents#TEXT_TRACKS_ADDED\n */\n this.TEXT_TRACKS_ADDED = 'allTextTracksAdded';\n\n /**\n * Triggered when a text track is added to the video element's TextTrackList\n * @event MediaPlayerEvents#TEXT_TRACK_ADDED\n */\n this.TEXT_TRACK_ADDED = 'textTrackAdded';\n\n /**\n * Triggered when a text track should be shown\n * @event MediaPlayerEvents#CUE_ENTER\n */\n this.CUE_ENTER = 'cueEnter'\n\n /**\n * Triggered when a text track should be hidden\n * @event MediaPlayerEvents#CUE_ENTER\n */\n this.CUE_EXIT = 'cueExit'\n\n /**\n * Triggered when a throughput measurement based on the last segment request has been stored\n * @event MediaPlayerEvents#THROUGHPUT_MEASUREMENT_STORED\n */\n this.THROUGHPUT_MEASUREMENT_STORED = 'throughputMeasurementStored';\n\n /**\n * Triggered when a ttml chunk is parsed.\n * @event MediaPlayerEvents#TTML_PARSED\n */\n this.TTML_PARSED = 'ttmlParsed';\n\n /**\n * Triggered when a ttml chunk has to be parsed.\n * @event MediaPlayerEvents#TTML_TO_PARSE\n */\n this.TTML_TO_PARSE = 'ttmlToParse';\n\n /**\n * Triggered when a caption is rendered.\n * @event MediaPlayerEvents#CAPTION_RENDERED\n */\n this.CAPTION_RENDERED = 'captionRendered';\n\n /**\n * Triggered when the caption container is resized.\n * @event MediaPlayerEvents#CAPTION_CONTAINER_RESIZE\n */\n this.CAPTION_CONTAINER_RESIZE = 'captionContainerResize';\n\n /**\n * Sent when enough data is available that the media can be played,\n * at least for a couple of frames. This corresponds to the\n * HAVE_ENOUGH_DATA readyState.\n * @event MediaPlayerEvents#CAN_PLAY\n */\n this.CAN_PLAY = 'canPlay';\n\n /**\n * This corresponds to the CAN_PLAY_THROUGH readyState.\n * @event MediaPlayerEvents#CAN_PLAY_THROUGH\n */\n this.CAN_PLAY_THROUGH = 'canPlayThrough';\n\n /**\n * Sent when playback completes.\n * @event MediaPlayerEvents#PLAYBACK_ENDED\n */\n this.PLAYBACK_ENDED = 'playbackEnded';\n\n /**\n * Sent when an error occurs. The element's error\n * attribute contains more information.\n * @event MediaPlayerEvents#PLAYBACK_ERROR\n */\n this.PLAYBACK_ERROR = 'playbackError';\n\n /**\n * Sent when playback is not allowed (for example if user gesture is needed).\n * @event MediaPlayerEvents#PLAYBACK_NOT_ALLOWED\n */\n this.PLAYBACK_NOT_ALLOWED = 'playbackNotAllowed';\n\n /**\n * The media's metadata has finished loading; all attributes now\n * contain as much useful information as they're going to.\n * @event MediaPlayerEvents#PLAYBACK_METADATA_LOADED\n */\n this.PLAYBACK_METADATA_LOADED = 'playbackMetaDataLoaded';\n\n /**\n * The event is fired when the frame at the current playback position of the media has finished loading;\n * often the first frame\n * @event MediaPlayerEvents#PLAYBACK_LOADED_DATA\n */\n this.PLAYBACK_LOADED_DATA = 'playbackLoadedData';\n\n /**\n * Sent when playback is paused.\n * @event MediaPlayerEvents#PLAYBACK_PAUSED\n */\n this.PLAYBACK_PAUSED = 'playbackPaused';\n\n /**\n * Sent when the media begins to play (either for the first time, after having been paused,\n * or after ending and then restarting).\n *\n * @event MediaPlayerEvents#PLAYBACK_PLAYING\n */\n this.PLAYBACK_PLAYING = 'playbackPlaying';\n\n /**\n * Sent periodically to inform interested parties of progress downloading\n * the media. Information about the current amount of the media that has\n * been downloaded is available in the media element's buffered attribute.\n * @event MediaPlayerEvents#PLAYBACK_PROGRESS\n */\n this.PLAYBACK_PROGRESS = 'playbackProgress';\n\n /**\n * Sent when the playback speed changes.\n * @event MediaPlayerEvents#PLAYBACK_RATE_CHANGED\n */\n this.PLAYBACK_RATE_CHANGED = 'playbackRateChanged';\n\n /**\n * Sent when a seek operation completes.\n * @event MediaPlayerEvents#PLAYBACK_SEEKED\n */\n this.PLAYBACK_SEEKED = 'playbackSeeked';\n\n /**\n * Sent when a seek operation begins.\n * @event MediaPlayerEvents#PLAYBACK_SEEKING\n */\n this.PLAYBACK_SEEKING = 'playbackSeeking';\n\n /**\n * Sent when the video element reports stalled\n * @event MediaPlayerEvents#PLAYBACK_STALLED\n */\n this.PLAYBACK_STALLED = 'playbackStalled';\n\n /**\n * Sent when playback of the media starts after having been paused;\n * that is, when playback is resumed after a prior pause event.\n *\n * @event MediaPlayerEvents#PLAYBACK_STARTED\n */\n this.PLAYBACK_STARTED = 'playbackStarted';\n\n /**\n * The time indicated by the element's currentTime attribute has changed.\n * @event MediaPlayerEvents#PLAYBACK_TIME_UPDATED\n */\n this.PLAYBACK_TIME_UPDATED = 'playbackTimeUpdated';\n\n /**\n * Sent when the video element reports that the volume has changed\n * @event MediaPlayerEvents#PLAYBACK_VOLUME_CHANGED\n */\n this.PLAYBACK_VOLUME_CHANGED = 'playbackVolumeChanged';\n\n /**\n * Sent when the media playback has stopped because of a temporary lack of data.\n *\n * @event MediaPlayerEvents#PLAYBACK_WAITING\n */\n this.PLAYBACK_WAITING = 'playbackWaiting';\n\n /**\n * Manifest validity changed - As a result of an MPD validity expiration event.\n * @event MediaPlayerEvents#MANIFEST_VALIDITY_CHANGED\n */\n this.MANIFEST_VALIDITY_CHANGED = 'manifestValidityChanged';\n\n /**\n * Dash events are triggered at their respective start points on the timeline.\n * @event MediaPlayerEvents#EVENT_MODE_ON_START\n */\n this.EVENT_MODE_ON_START = 'eventModeOnStart';\n\n /**\n * Dash events are triggered as soon as they were parsed.\n * @event MediaPlayerEvents#EVENT_MODE_ON_RECEIVE\n */\n this.EVENT_MODE_ON_RECEIVE = 'eventModeOnReceive';\n\n /**\n * Event that is dispatched whenever the player encounters a potential conformance validation that might lead to unexpected/not optimal behavior\n * @event MediaPlayerEvents#CONFORMANCE_VIOLATION\n */\n this.CONFORMANCE_VIOLATION = 'conformanceViolation';\n\n /**\n * Event that is dispatched whenever the player switches to a different representation\n * @event MediaPlayerEvents#REPRESENTATION_SWITCH\n */\n this.REPRESENTATION_SWITCH = 'representationSwitch';\n\n /**\n * Event that is dispatched whenever an adaptation set is removed due to all representations not being supported.\n * @event MediaPlayerEvents#ADAPTATION_SET_REMOVED_NO_CAPABILITIES\n */\n this.ADAPTATION_SET_REMOVED_NO_CAPABILITIES = 'adaptationSetRemovedNoCapabilities';\n\n /**\n * Triggered when a content steering request has completed.\n * @event MediaPlayerEvents#CONTENT_STEERING_REQUEST_COMPLETED\n */\n this.CONTENT_STEERING_REQUEST_COMPLETED = 'contentSteeringRequestCompleted';\n\n /**\n * Triggered when an inband prft (ProducerReferenceTime) boxes has been received.\n * @event MediaPlayerEvents#INBAND_PRFT\n */\n this.INBAND_PRFT = 'inbandPrft';\n\n /**\n * The streaming attribute of the Managed Media Source is true\n * @type {string}\n */\n this.MANAGED_MEDIA_SOURCE_START_STREAMING = 'managedMediaSourceStartStreaming';\n\n /**\n * The streaming attribute of the Managed Media Source is false\n * @type {string}\n */\n this.MANAGED_MEDIA_SOURCE_END_STREAMING = 'managedMediaSourceEndStreaming';\n }\n}\n\nlet mediaPlayerEvents = new MediaPlayerEvents();\nexport default mediaPlayerEvents;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n * Constants declaration\n * @class\n * @ignore\n * @hideconstructor\n */\nclass Constants {\n\n init() {\n /**\n * @constant {string} STREAM Stream media type. Mainly used to report metrics relative to the full stream\n * @memberof Constants#\n * @static\n */\n this.STREAM = 'stream';\n\n /**\n * @constant {string} VIDEO Video media type\n * @memberof Constants#\n * @static\n */\n this.VIDEO = 'video';\n\n /**\n * @constant {string} AUDIO Audio media type\n * @memberof Constants#\n * @static\n */\n this.AUDIO = 'audio';\n\n /**\n * @constant {string} TEXT Text media type\n * @memberof Constants#\n * @static\n */\n this.TEXT = 'text';\n\n /**\n * @constant {string} MUXED Muxed (video/audio in the same chunk) media type\n * @memberof Constants#\n * @static\n */\n this.MUXED = 'muxed';\n\n /**\n * @constant {string} IMAGE Image media type\n * @memberof Constants#\n * @static\n */\n this.IMAGE = 'image';\n\n /**\n * @constant {string} STPP STTP Subtitles format\n * @memberof Constants#\n * @static\n */\n this.STPP = 'stpp';\n\n /**\n * @constant {string} TTML STTP Subtitles format\n * @memberof Constants#\n * @static\n */\n this.TTML = 'ttml';\n\n /**\n * @constant {string} VTT STTP Subtitles format\n * @memberof Constants#\n * @static\n */\n this.VTT = 'vtt';\n\n /**\n * @constant {string} WVTT STTP Subtitles format\n * @memberof Constants#\n * @static\n */\n this.WVTT = 'wvtt';\n\n /**\n * @constant {string} Content Steering\n * @memberof Constants#\n * @static\n */\n this.CONTENT_STEERING = 'contentSteering';\n\n /**\n * @constant {string} ABR_STRATEGY_DYNAMIC Dynamic Adaptive bitrate algorithm\n * @memberof Constants#\n * @static\n */\n this.ABR_STRATEGY_DYNAMIC = 'abrDynamic';\n\n /**\n * @constant {string} ABR_STRATEGY_BOLA Adaptive bitrate algorithm based on Bola (buffer level)\n * @memberof Constants#\n * @static\n */\n this.ABR_STRATEGY_BOLA = 'abrBola';\n\n /**\n * @constant {string} ABR_STRATEGY_L2A Adaptive bitrate algorithm based on L2A (online learning)\n * @memberof Constants#\n * @static\n */\n this.ABR_STRATEGY_L2A = 'abrL2A';\n\n /**\n * @constant {string} ABR_STRATEGY_LoLP Adaptive bitrate algorithm based on LoL+\n * @memberof Constants#\n * @static\n */\n this.ABR_STRATEGY_LoLP = 'abrLoLP';\n\n /**\n * @constant {string} ABR_STRATEGY_THROUGHPUT Adaptive bitrate algorithm based on throughput\n * @memberof Constants#\n * @static\n */\n this.ABR_STRATEGY_THROUGHPUT = 'abrThroughput';\n\n /**\n * @constant {string} ABR_FETCH_THROUGHPUT_CALUCUALTION_DOWNLOADED_DATA Throughput calculation based on downloaded data array\n * @memberof Constants#\n * @static\n */\n this.ABR_FETCH_THROUGHPUT_CALCULATION_DOWNLOADED_DATA = 'abrFetchThroughputCalculationDownloadedData';\n\n /**\n * @constant {string} ABR_FETCH_THROUGHPUT_CALCULATION_MOOF_PARSING Throughput calculation based on moof parsing\n * @memberof Constants#\n * @static\n */\n this.ABR_FETCH_THROUGHPUT_CALCULATION_MOOF_PARSING = 'abrFetchThroughputCalculationMoofParsing';\n\n /**\n * @constant {string} ABR_FETCH_THROUGHPUT_CALCULATION_AAST Throughput calculation based on adjusted availability start time in low latency mode\n * @memberof Constants#\n * @static\n */\n this.ABR_FETCH_THROUGHPUT_CALCULATION_AAST = 'abrFetchThroughputCalculationAAST';\n\n /**\n * @constant {string} LIVE_CATCHUP_MODE_DEFAULT Throughput calculation based on moof parsing\n * @memberof Constants#\n * @static\n */\n this.LIVE_CATCHUP_MODE_DEFAULT = 'liveCatchupModeDefault';\n\n /**\n * @constant {string} LIVE_CATCHUP_MODE_LOLP Throughput calculation based on moof parsing\n * @memberof Constants#\n * @static\n */\n this.LIVE_CATCHUP_MODE_LOLP = 'liveCatchupModeLoLP';\n\n /**\n * @constant {string} MOVING_AVERAGE_SLIDING_WINDOW Moving average sliding window\n * @memberof Constants#\n * @static\n */\n this.MOVING_AVERAGE_SLIDING_WINDOW = 'slidingWindow';\n\n /**\n * @constant {string} EWMA Exponential moving average\n * @memberof Constants#\n * @static\n */\n this.MOVING_AVERAGE_EWMA = 'ewma';\n\n /**\n * @constant {string} BAD_ARGUMENT_ERROR Invalid Arguments type of error\n * @memberof Constants#\n * @static\n */\n this.BAD_ARGUMENT_ERROR = 'Invalid Arguments';\n\n /**\n * @constant {string} MISSING_CONFIG_ERROR Missing configuration parameters type of error\n * @memberof Constants#\n * @static\n */\n this.MISSING_CONFIG_ERROR = 'Missing config parameter(s)';\n\n /**\n * @constant {string} TRACK_SWITCH_MODE_ALWAYS_REPLACE used to clear the buffered data (prior to current playback position) after track switch. Default for audio\n * @memberof Constants#\n * @static\n */\n this.TRACK_SWITCH_MODE_ALWAYS_REPLACE = 'alwaysReplace';\n\n /**\n * @constant {string} TRACK_SWITCH_MODE_NEVER_REPLACE used to forbid clearing the buffered data (prior to current playback position) after track switch. Defers to fastSwitchEnabled for placement of new data. Default for video\n * @memberof Constants#\n * @static\n */\n this.TRACK_SWITCH_MODE_NEVER_REPLACE = 'neverReplace';\n\n /**\n * @constant {string} TRACK_SELECTION_MODE_FIRST_TRACK makes the player select the first track found in the manifest.\n * @memberof Constants#\n * @static\n */\n this.TRACK_SELECTION_MODE_FIRST_TRACK = 'firstTrack';\n\n /**\n * @constant {string} TRACK_SELECTION_MODE_HIGHEST_BITRATE makes the player select the track with a highest bitrate. This mode is a default mode.\n * @memberof Constants#\n * @static\n */\n this.TRACK_SELECTION_MODE_HIGHEST_BITRATE = 'highestBitrate';\n\n /**\n * @constant {string} TRACK_SELECTION_MODE_HIGHEST_EFFICIENCY makes the player select the track with the lowest bitrate per pixel average.\n * @memberof Constants#\n * @static\n */\n this.TRACK_SELECTION_MODE_HIGHEST_EFFICIENCY = 'highestEfficiency';\n\n /**\n * @constant {string} TRACK_SELECTION_MODE_WIDEST_RANGE makes the player select the track with a widest range of bitrates.\n * @memberof Constants#\n * @static\n */\n this.TRACK_SELECTION_MODE_WIDEST_RANGE = 'widestRange';\n\n /**\n * @constant {string} TRACK_SELECTION_MODE_WIDEST_RANGE makes the player select the track with the highest selectionPriority as defined in the manifest\n * @memberof Constants#\n * @static\n */\n this.TRACK_SELECTION_MODE_HIGHEST_SELECTION_PRIORITY = 'highestSelectionPriority';\n\n /**\n * @constant {string} CMCD_MODE_QUERY specifies to attach CMCD metrics as query parameters.\n * @memberof Constants#\n * @static\n */\n this.CMCD_MODE_QUERY = 'query';\n\n /**\n * @constant {string} CMCD_MODE_HEADER specifies to attach CMCD metrics as HTTP headers.\n * @memberof Constants#\n * @static\n */\n this.CMCD_MODE_HEADER = 'header';\n this.INITIALIZE = 'initialize';\n this.TEXT_SHOWING = 'showing';\n this.TEXT_HIDDEN = 'hidden';\n this.TEXT_DISABLED = 'disabled';\n this.CC1 = 'CC1';\n this.CC3 = 'CC3';\n this.UTF8 = 'utf-8';\n this.SCHEME_ID_URI = 'schemeIdUri';\n this.START_TIME = 'starttime';\n this.SERVICE_DESCRIPTION_DVB_LL_SCHEME = 'urn:dvb:dash:lowlatency:scope:2019';\n this.SUPPLEMENTAL_PROPERTY_DVB_LL_SCHEME = 'urn:dvb:dash:lowlatency:critical:2019';\n this.FONT_DOWNLOAD_DVB_SCHEME = 'urn:dvb:dash:fontdownload:2014';\n this.XML = 'XML';\n this.ARRAY_BUFFER = 'ArrayBuffer';\n this.DVB_REPORTING_URL = 'dvb:reportingUrl';\n this.DVB_PROBABILITY = 'dvb:probability';\n this.OFF_MIMETYPE = 'application/font-sfnt';\n this.WOFF_MIMETYPE = 'application/font-woff';\n this.VIDEO_ELEMENT_READY_STATES = {\n HAVE_NOTHING: 0,\n HAVE_METADATA: 1,\n HAVE_CURRENT_DATA: 2,\n HAVE_FUTURE_DATA: 3,\n HAVE_ENOUGH_DATA: 4\n };\n this.FILE_LOADER_TYPES = {\n FETCH: 'fetch_loader',\n XHR: 'xhr_loader'\n }\n }\n\n constructor() {\n this.init();\n }\n}\n\nconst constants = new Constants();\nexport default constants;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n * Metrics Constants declaration\n * @class\n * @ignore\n */\nclass MetricsConstants {\n\n init () {\n this.TCP_CONNECTION = 'TcpList';\n this.HTTP_REQUEST = 'HttpList';\n this.TRACK_SWITCH = 'RepSwitchList';\n this.BUFFER_LEVEL = 'BufferLevel';\n this.BUFFER_LOADED = 'bufferLoaded';\n this.ABANDON_LOAD = 'abandonload';\n this.ALLOW_LOAD = 'allowload';\n this.BUFFER_EMPTY = 'bufferStalled';\n this.BUFFER_STATE = 'BufferState';\n this.DVR_INFO = 'DVRInfo';\n this.DROPPED_FRAMES = 'DroppedFrames';\n this.SCHEDULING_INFO = 'SchedulingInfo';\n this.REQUESTS_QUEUE = 'RequestsQueue';\n this.MANIFEST_UPDATE = 'ManifestUpdate';\n this.MANIFEST_UPDATE_STREAM_INFO = 'ManifestUpdatePeriodInfo';\n this.MANIFEST_UPDATE_TRACK_INFO = 'ManifestUpdateRepresentationInfo';\n this.PLAY_LIST = 'PlayList';\n this.DVB_ERRORS = 'DVBErrors';\n this.HTTP_REQUEST_DVB_REPORTING_TYPE = 'DVBReporting';\n }\n\n constructor() {\n this.init();\n }\n}\n\nlet constants = new MetricsConstants();\nexport default constants;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass DVBErrors {\n constructor() {\n this.mpdurl = null;\n // String - Absolute URL from which the MPD was originally\n // retrieved (MPD updates will not change this value).\n\n this.errorcode = null;\n // String - The value of errorcode depends upon the type\n // of error being reported. For an error listed in the\n // ErrorType column below the value is as described in the\n // Value column.\n //\n // ErrorType Value\n // --------- -----\n // HTTP error status code HTTP status code\n // Unknown HTTP status code HTTP status code\n // SSL connection failed \"SSL\" followed by SSL alert value\n // DNS resolution failed \"C00\"\n // Host unreachable \"C01\"\n // Connection refused \"C02\"\n // Connection error – Not otherwise specified \"C03\"\n // Corrupt media – ISO BMFF container cannot be parsed \"M00\"\n // Corrupt media – Not otherwise specified \"M01\"\n // Changing Base URL in use due to errors \"F00\"\n // Becoming an error reporting Player \"S00\"\n\n this.terror = null;\n // Real-Time - Date and time at which error occurred in UTC,\n // formatted as a combined date and time according to ISO 8601.\n\n this.url = null;\n // String - Absolute URL from which data was being requested\n // when this error occurred. If the error report is in relation\n // to corrupt media or changing BaseURL, this may be a null\n // string if the URL from which the media was obtained or\n // which led to the change of BaseURL is no longer known.\n\n this.ipaddress = null;\n // String - IP Address which the host name in \"url\" resolved to.\n // If the error report is in relation to corrupt media or\n // changing BaseURL, this may be a null string if the URL\n // from which the media was obtained or which led to the\n // change of BaseURL is no longer known.\n\n this.servicelocation = null;\n // String - The value of the serviceLocation field in the\n // BaseURL being used. In the event of this report indicating\n // a change of BaseURL this is the value from the BaseURL\n // being moved from.\n }\n}\n\nDVBErrors.SSL_CONNECTION_FAILED_PREFIX = 'SSL';\nDVBErrors.DNS_RESOLUTION_FAILED = 'C00';\nDVBErrors.HOST_UNREACHABLE = 'C01';\nDVBErrors.CONNECTION_REFUSED = 'C02';\nDVBErrors.CONNECTION_ERROR = 'C03';\nDVBErrors.CORRUPT_MEDIA_ISOBMFF = 'M00';\nDVBErrors.CORRUPT_MEDIA_OTHER = 'M01';\nDVBErrors.BASE_URL_CHANGED = 'F00';\nDVBErrors.BECAME_REPORTER = 'S00';\n\nexport default DVBErrors;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport DVBErrors from '../vo/DVBErrors';\nimport MetricsReportingEvents from '../MetricsReportingEvents';\n\nfunction DVBErrorsTranslator(config) {\n\n config = config || {};\n let instance,\n mpd;\n const eventBus = config.eventBus;\n const dashMetrics = config.dashMetrics;\n const metricsConstants = config.metricsConstants;\n //MediaPlayerEvents have been added to Events in MediaPlayer class\n const Events = config.events;\n\n function report(vo) {\n let o = new DVBErrors();\n\n if (!mpd) {\n return;\n }\n\n for (const key in vo) {\n if (vo.hasOwnProperty(key)) {\n o[key] = vo[key];\n }\n }\n\n if (!o.mpdurl) {\n o.mpdurl = mpd.originalUrl || mpd.url;\n }\n\n if (!o.terror) {\n o.terror = new Date();\n }\n\n dashMetrics.addDVBErrors(o);\n }\n\n function onManifestUpdate(e) {\n if (e.error) {\n return;\n }\n\n mpd = e.manifest;\n }\n\n function onServiceLocationChanged(e) {\n report({\n errorcode: DVBErrors.BASE_URL_CHANGED,\n servicelocation: e.entry\n });\n }\n\n function onBecameReporter() {\n report({\n errorcode: DVBErrors.BECAME_REPORTER\n });\n }\n\n function handleHttpMetric(vo) {\n if ((vo.responsecode === 0) || // connection failure - unknown\n (vo.responsecode == null) || // Generated on .catch() and when uninitialized\n (vo.responsecode >= 400) || // HTTP error status code\n (vo.responsecode < 100) || // unknown status codes\n (vo.responsecode >= 600)) { // unknown status codes\n report({\n errorcode: vo.responsecode || DVBErrors.CONNECTION_ERROR,\n url: vo.url,\n terror: vo.tresponse,\n servicelocation: vo._serviceLocation\n });\n }\n }\n\n function onMetricEvent(e) {\n switch (e.metric) {\n case metricsConstants.HTTP_REQUEST:\n handleHttpMetric(e.value);\n break;\n default:\n break;\n }\n }\n\n function onPlaybackError(e) {\n let reason = e.error ? e.error.code : 0;\n let errorcode;\n\n switch (reason) {\n case MediaError.MEDIA_ERR_NETWORK:\n errorcode = DVBErrors.CONNECTION_ERROR;\n break;\n case MediaError.MEDIA_ERR_DECODE:\n errorcode = DVBErrors.CORRUPT_MEDIA_OTHER;\n break;\n default:\n return;\n }\n\n report({\n errorcode: errorcode\n });\n }\n\n function initialize() {\n eventBus.on(Events.MANIFEST_UPDATED, onManifestUpdate, instance);\n eventBus.on(\n Events.SERVICE_LOCATION_BASE_URL_BLACKLIST_CHANGED,\n onServiceLocationChanged,\n instance\n );\n eventBus.on(Events.METRIC_ADDED, onMetricEvent, instance);\n eventBus.on(Events.METRIC_UPDATED, onMetricEvent, instance);\n eventBus.on(Events.PLAYBACK_ERROR, onPlaybackError, instance);\n eventBus.on(\n MetricsReportingEvents.BECAME_REPORTING_PLAYER,\n onBecameReporter,\n instance\n );\n }\n\n function reset() {\n eventBus.off(Events.MANIFEST_UPDATED, onManifestUpdate, instance);\n eventBus.off(\n Events.SERVICE_LOCATION_BASE_URL_BLACKLIST_CHANGED,\n onServiceLocationChanged,\n instance\n );\n eventBus.off(Events.METRIC_ADDED, onMetricEvent, instance);\n eventBus.off(Events.METRIC_UPDATED, onMetricEvent, instance);\n eventBus.off(Events.PLAYBACK_ERROR, onPlaybackError, instance);\n eventBus.off(\n MetricsReportingEvents.BECAME_REPORTING_PLAYER,\n onBecameReporter,\n instance\n );\n }\n\n instance = {\n initialize,\n reset\n };\n\n return instance;\n}\n\nDVBErrorsTranslator.__dashjs_factory_name = 'DVBErrorsTranslator';\nexport default dashjs.FactoryMaker.getSingletonFactory(DVBErrorsTranslator); /* jshint ignore:line */\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport CustomTimeRanges from '../../utils/CustomTimeRanges';\n\nfunction RangeController(config) {\n\n config = config || {};\n let useWallClockTime = false;\n let context = this.context;\n let instance,\n ranges;\n\n let mediaElement = config.mediaElement;\n\n function initialize(rs) {\n if (rs && rs.length) {\n rs.forEach(r => {\n let start = r.starttime;\n let end = start + r.duration;\n\n ranges.add(start, end);\n });\n\n useWallClockTime = !!rs[0]._useWallClockTime;\n }\n }\n\n function reset() {\n ranges.clear();\n }\n\n function setup() {\n ranges = CustomTimeRanges(context).create();\n }\n\n function isEnabled() {\n let numRanges = ranges.length;\n let time;\n\n if (!numRanges) {\n return true;\n }\n\n // When not present, DASH Metrics reporting is requested\n // for the whole duration of the content.\n time = useWallClockTime ?\n (new Date().getTime() / 1000) :\n mediaElement.currentTime;\n\n for (let i = 0; i < numRanges; i += 1) {\n let start = ranges.start(i);\n let end = ranges.end(i);\n\n if ((start <= time) && (time < end)) {\n return true;\n }\n }\n\n return false;\n }\n\n instance = {\n initialize: initialize,\n reset: reset,\n isEnabled: isEnabled\n };\n\n setup();\n\n return instance;\n}\n\nRangeController.__dashjs_factory_name = 'RangeController';\nexport default dashjs.FactoryMaker.getClassFactory(RangeController); /* jshint ignore:line */\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n * @ignore\n */\nfunction MetricSerialiser() {\n\n // For each entry in the top level list within the metric (in the case\n // of the DVBErrors metric each entry corresponds to an \"error event\"\n // described in clause 10.8.4) the Player shall:\n function serialise(metric) {\n let pairs = [];\n let obj = [];\n let key,\n value;\n\n // Take each (key, value) pair from the metric entry and create a\n // string consisting of the name of the key, followed by an equals\n // ('=') character, followed by the string representation of the\n // value. The string representation of the value is created based\n // on the type of the value following the instructions in Table 22.\n for (key in metric) {\n if (metric.hasOwnProperty(key) && (key.indexOf('_') !== 0)) {\n value = metric[key];\n\n // we want to ensure that keys still end up in the report\n // even if there is no value\n if ((value === undefined) || (value === null)) {\n value = '';\n }\n\n // DVB A168 10.12.4 Table 22\n if (Array.isArray(value)) {\n // if trace or similar is null, do not include in output\n if (!value.length) {\n continue;\n }\n\n obj = [];\n\n value.forEach(function (v) {\n let isBuiltIn = Object.prototype.toString.call(v).slice(8, -1) !== 'Object';\n\n obj.push(isBuiltIn ? v : serialise(v));\n });\n\n value = obj.map(encodeURIComponent).join(',');\n } else if (typeof value === 'string') {\n value = encodeURIComponent(value);\n } else if (value instanceof Date) {\n value = value.toISOString();\n } else if (typeof value === 'number') {\n value = Math.round(value);\n }\n\n pairs.push(key + '=' + value);\n }\n }\n\n // Concatenate the strings created in the previous step with an\n // ampersand ('&') character between each one.\n return pairs.join('&');\n }\n\n return {\n serialise: serialise\n };\n}\n\nMetricSerialiser.__dashjs_factory_name = 'MetricSerialiser';\nexport default dashjs.FactoryMaker.getSingletonFactory(MetricSerialiser); /* jshint ignore:line */\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n * @ignore\n */\nfunction RNG() {\n\n // check whether secure random numbers are available. if not, revert to\n // using Math.random\n let crypto = window.crypto || window.msCrypto;\n\n // could just as easily use any other array type by changing line below\n let ArrayType = Uint32Array;\n let MAX_VALUE = Math.pow(2, ArrayType.BYTES_PER_ELEMENT * 8) - 1;\n\n // currently there is only one client for this code, and that only uses\n // a single random number per initialisation. may want to increase this\n // number if more consumers in the future\n let NUM_RANDOM_NUMBERS = 10;\n\n let randomNumbers,\n index,\n instance;\n\n function initialize() {\n if (crypto) {\n if (!randomNumbers) {\n randomNumbers = new ArrayType(NUM_RANDOM_NUMBERS);\n }\n crypto.getRandomValues(randomNumbers);\n index = 0;\n }\n }\n\n function rand(min, max) {\n let r;\n\n if (!min) {\n min = 0;\n }\n\n if (!max) {\n max = 1;\n }\n\n if (crypto) {\n if (index === randomNumbers.length) {\n initialize();\n }\n\n r = randomNumbers[index] / MAX_VALUE;\n index += 1;\n } else {\n r = Math.random();\n }\n\n return (r * (max - min)) + min;\n }\n\n instance = {\n random: rand\n };\n\n initialize();\n\n return instance;\n}\n\nRNG.__dashjs_factory_name = 'RNG';\nexport default dashjs.FactoryMaker.getSingletonFactory(RNG); /* jshint ignore:line */\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport MetricSerialiser from '../../utils/MetricSerialiser';\nimport RNG from '../../utils/RNG';\nimport CustomParametersModel from '../../../models/CustomParametersModel';\n\nfunction DVBReporting(config) {\n config = config || {};\n let instance;\n\n let context = this.context;\n let metricSerialiser,\n customParametersModel,\n randomNumberGenerator,\n reportingPlayerStatusDecided,\n isReportingPlayer,\n reportingUrl,\n rangeController;\n\n let USE_DRAFT_DVB_SPEC = true;\n let allowPendingRequestsToCompleteOnReset = true;\n let pendingRequests = [];\n\n const metricsConstants = config.metricsConstants;\n\n function setup() {\n metricSerialiser = MetricSerialiser(context).getInstance();\n randomNumberGenerator = RNG(context).getInstance();\n customParametersModel = CustomParametersModel(context).getInstance();\n\n resetInitialSettings();\n }\n\n function doGetRequest(url, successCB, failureCB) {\n let req = new XMLHttpRequest();\n req.withCredentials = customParametersModel.getXHRWithCredentialsForType(metricsConstants.HTTP_REQUEST_DVB_REPORTING_TYPE);\n const oncomplete = function () {\n let reqIndex = pendingRequests.indexOf(req);\n\n if (reqIndex === -1) {\n return;\n } else {\n pendingRequests.splice(reqIndex, 1);\n }\n\n if ((req.status >= 200) && (req.status < 300)) {\n if (successCB) {\n successCB();\n }\n } else {\n if (failureCB) {\n failureCB();\n }\n }\n };\n\n pendingRequests.push(req);\n\n try {\n req.open('GET', url);\n req.onloadend = oncomplete;\n req.onerror = oncomplete;\n req.send();\n } catch (e) {\n req.onerror();\n }\n }\n\n function report(type, vos) {\n if (!Array.isArray(vos)) {\n vos = [vos];\n }\n\n // If the Player is not a reporting Player, then the Player shall\n // not report any errors.\n // ... In addition to any time restrictions specified by a Range\n // element within the Metrics element.\n if (isReportingPlayer && rangeController.isEnabled()) {\n\n // This reporting mechanism operates by creating one HTTP GET\n // request for every entry in the top level list of the metric.\n vos.forEach(function (vo) {\n let url = metricSerialiser.serialise(vo);\n\n // this has been proposed for errata\n if (USE_DRAFT_DVB_SPEC && (type !== metricsConstants.DVB_ERRORS)) {\n url = `metricname=${type}&${url}`;\n }\n\n // Take the value of the @reportingUrl attribute, append a\n // question mark ('?') character and then append the string\n // created in the previous step.\n url = `${reportingUrl}?${url}`;\n\n // Make an HTTP GET request to the URL contained within the\n // string created in the previous step.\n doGetRequest(url, null, function () {\n // If the Player is unable to make the report, for\n // example because the @reportingUrl is invalid, the\n // host cannot be reached, or an HTTP status code other\n // than one in the 200 series is received, the Player\n // shall cease being a reporting Player for the\n // duration of the MPD.\n isReportingPlayer = false;\n });\n });\n }\n }\n\n function initialize(entry, rc) {\n let probability;\n\n rangeController = rc;\n\n reportingUrl = entry.dvbReportingUrl;\n\n // If a required attribute is missing, the Reporting descriptor may\n // be ignored by the Player\n if (!reportingUrl) {\n throw new Error(\n 'required parameter missing (dvb:reportingUrl)'\n );\n }\n\n // A Player's status, as a reporting Player or not, shall remain\n // static for the duration of the MPD, regardless of MPD updates.\n // (i.e. only calling reset (or failure) changes this state)\n if (!reportingPlayerStatusDecided) {\n probability = entry.dvbProbability;\n // TS 103 285 Clause 10.12.3.4\n // If the @probability attribute is set to 1000, it shall be a reporting Player.\n // If the @probability attribute is absent it will take the default value of 1000.\n // For any other value of the @probability attribute, it shall decide at random whether to be a\n // reporting Player, such that the probability of being one is @probability/1000.\n if (probability && (probability === 1000 || ((probability / 1000) >= randomNumberGenerator.random()))) {\n isReportingPlayer = true;\n }\n\n reportingPlayerStatusDecided = true;\n }\n }\n\n function resetInitialSettings() {\n reportingPlayerStatusDecided = false;\n isReportingPlayer = false;\n reportingUrl = null;\n rangeController = null;\n }\n\n function reset() {\n if (!allowPendingRequestsToCompleteOnReset) {\n pendingRequests.forEach(req => req.abort());\n pendingRequests = [];\n }\n\n resetInitialSettings();\n }\n\n instance = {\n report: report,\n initialize: initialize,\n reset: reset\n };\n\n setup();\n\n return instance;\n}\n\nDVBReporting.__dashjs_factory_name = 'DVBReporting';\nexport default dashjs.FactoryMaker.getClassFactory(DVBReporting); /* jshint ignore:line */\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport DVBReporting from './reporters/DVBReporting';\n\nfunction ReportingFactory(config) {\n config = config || {};\n\n const knownReportingSchemeIdUris = {\n 'urn:dvb:dash:reporting:2014': DVBReporting\n };\n\n const context = this.context;\n let instance;\n const logger = config.debug ? config.debug.getLogger(instance) : {};\n const metricsConstants = config.metricsConstants;\n const mediaPlayerModel = config.mediaPlayerModel || {};\n\n function create(entry, rangeController) {\n let reporting;\n\n try {\n reporting = knownReportingSchemeIdUris[entry.schemeIdUri](context).create({\n metricsConstants: metricsConstants,\n mediaPlayerModel: mediaPlayerModel\n });\n\n reporting.initialize(entry, rangeController);\n } catch (e) {\n reporting = null;\n logger.error(`ReportingFactory: could not create Reporting with schemeIdUri ${entry.schemeIdUri} (${e.message})`);\n }\n\n return reporting;\n }\n\n function register(schemeIdUri, moduleName) {\n knownReportingSchemeIdUris[schemeIdUri] = moduleName;\n }\n\n function unregister(schemeIdUri) {\n delete knownReportingSchemeIdUris[schemeIdUri];\n }\n\n instance = {\n create: create,\n register: register,\n unregister: unregister\n };\n\n return instance;\n}\n\nReportingFactory.__dashjs_factory_name = 'ReportingFactory';\nexport default dashjs.FactoryMaker.getSingletonFactory(ReportingFactory); /* jshint ignore:line */\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport ReportingFactory from '../reporting/ReportingFactory';\n\nfunction ReportingController(config) {\n\n let reporters = [];\n let instance;\n\n const reportingFactory = ReportingFactory(this.context).getInstance(config);\n\n function initialize(reporting, rangeController) {\n // \"if multiple Reporting elements are present, it is expected that\n // the client processes one of the recognized reporting schemes.\"\n // to ignore this, and support multiple Reporting per Metric,\n // simply change the 'some' below to 'forEach'\n reporting.some(r => {\n let reporter = reportingFactory.create(r, rangeController);\n\n if (reporter) {\n reporters.push(reporter);\n return true;\n }\n });\n }\n\n function reset() {\n reporters.forEach(r => r.reset());\n reporters = [];\n }\n\n function report(type, vos) {\n reporters.forEach(r => r.report(type, vos));\n }\n\n instance = {\n initialize: initialize,\n reset: reset,\n report: report\n };\n\n return instance;\n}\n\nReportingController.__dashjs_factory_name = 'ReportingController';\nexport default dashjs.FactoryMaker.getClassFactory(ReportingController); /* jshint ignore:line */\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n * @ignore\n */\nfunction HandlerHelpers() {\n return {\n reconstructFullMetricName: function (key, n, type) {\n let mn = key;\n\n if (n) {\n mn += '(' + n;\n\n if (type && type.length) {\n mn += ',' + type;\n }\n\n mn += ')';\n }\n\n return mn;\n },\n\n validateN: function (n_ms) {\n if (!n_ms) {\n throw new Error('missing n');\n }\n\n if (isNaN(n_ms)) {\n throw new Error('n is NaN');\n }\n\n // n is a positive integer is defined to refer to the metric\n // in which the buffer level is recorded every n ms.\n if (n_ms < 0) {\n throw new Error('n must be positive');\n }\n\n return n_ms;\n }\n };\n}\n\nHandlerHelpers.__dashjs_factory_name = 'HandlerHelpers';\nexport default dashjs.FactoryMaker.getSingletonFactory(HandlerHelpers); /* jshint ignore:line */\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport HandlerHelpers from '../../utils/HandlerHelpers';\n\nfunction BufferLevelHandler(config) {\n\n config = config || {};\n let instance,\n reportingController,\n n,\n name,\n interval,\n lastReportedTime;\n\n let context = this.context;\n let handlerHelpers = HandlerHelpers(context).getInstance();\n\n let storedVOs = [];\n\n const metricsConstants = config.metricsConstants;\n\n function getLowestBufferLevelVO() {\n try {\n return Object.keys(storedVOs).map(\n key => storedVOs[key]\n ).reduce(\n (a, b) => {\n return (a.level < b.level) ? a : b;\n }\n );\n } catch (e) {\n return;\n }\n }\n\n function intervalCallback() {\n let vo = getLowestBufferLevelVO();\n\n if (vo) {\n if (lastReportedTime !== vo.t) {\n lastReportedTime = vo.t;\n reportingController.report(name, vo);\n }\n }\n }\n\n function initialize(basename, rc, n_ms) {\n if (rc) {\n // this will throw if n is invalid, to be\n // caught by the initialize caller.\n n = handlerHelpers.validateN(n_ms);\n reportingController = rc;\n name = handlerHelpers.reconstructFullMetricName(basename, n_ms);\n interval = setInterval(intervalCallback, n);\n }\n }\n\n function reset() {\n clearInterval(interval);\n interval = null;\n n = 0;\n reportingController = null;\n lastReportedTime = null;\n }\n\n function handleNewMetric(metric, vo, type) {\n if (metric === metricsConstants.BUFFER_LEVEL) {\n storedVOs[type] = vo;\n }\n }\n\n instance = {\n initialize: initialize,\n reset: reset,\n handleNewMetric: handleNewMetric\n };\n\n return instance;\n}\n\nBufferLevelHandler.__dashjs_factory_name = 'BufferLevelHandler';\nexport default dashjs.FactoryMaker.getClassFactory(BufferLevelHandler); /* jshint ignore:line */\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport MetricsReportingEvents from '../../MetricsReportingEvents';\n\nfunction DVBErrorsHandler(config) {\n\n config = config || {};\n let instance,\n reportingController;\n\n let eventBus = config.eventBus;\n const metricsConstants = config.metricsConstants;\n\n function onInitialisationComplete() {\n // we only want to report this once per call to initialize\n eventBus.off(\n MetricsReportingEvents.METRICS_INITIALISATION_COMPLETE,\n onInitialisationComplete,\n this\n );\n\n // Note: A Player becoming a reporting Player is itself\n // something which is recorded by the DVBErrors metric.\n eventBus.trigger(MetricsReportingEvents.BECAME_REPORTING_PLAYER);\n }\n\n function initialize(unused, rc) {\n if (rc) {\n reportingController = rc;\n\n eventBus.on(\n MetricsReportingEvents.METRICS_INITIALISATION_COMPLETE,\n onInitialisationComplete,\n this\n );\n }\n }\n\n function reset() {\n reportingController = null;\n }\n\n function handleNewMetric(metric, vo) {\n // simply pass metric straight through\n if (metric === metricsConstants.DVB_ERRORS) {\n if (reportingController) {\n reportingController.report(metric, vo);\n }\n }\n }\n\n instance = {\n initialize: initialize,\n reset: reset,\n handleNewMetric: handleNewMetric\n };\n\n return instance;\n}\n\nexport default dashjs.FactoryMaker.getClassFactory(DVBErrorsHandler); /* jshint ignore:line */\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport HandlerHelpers from '../../utils/HandlerHelpers';\n\nfunction HttpListHandler(config) {\n\n config = config || {};\n let instance,\n reportingController,\n n,\n type,\n name,\n interval;\n\n let storedVos = [];\n\n let handlerHelpers = HandlerHelpers(this.context).getInstance();\n\n const metricsConstants = config.metricsConstants;\n\n function intervalCallback() {\n var vos = storedVos;\n\n if (vos.length) {\n if (reportingController) {\n reportingController.report(name, vos);\n }\n }\n\n storedVos = [];\n }\n\n function initialize(basename, rc, n_ms, requestType) {\n if (rc) {\n\n // this will throw if n is invalid, to be\n // caught by the initialize caller.\n n = handlerHelpers.validateN(n_ms);\n\n reportingController = rc;\n\n if (requestType && requestType.length) {\n type = requestType;\n }\n\n name = handlerHelpers.reconstructFullMetricName(\n basename,\n n_ms,\n requestType\n );\n\n interval = setInterval(intervalCallback, n);\n }\n }\n\n function reset() {\n clearInterval(interval);\n interval = null;\n n = null;\n type = null;\n storedVos = [];\n reportingController = null;\n }\n\n function handleNewMetric(metric, vo) {\n if (metric === metricsConstants.HTTP_REQUEST) {\n if (!type || (type === vo.type)) {\n storedVos.push(vo);\n }\n }\n }\n\n instance = {\n initialize: initialize,\n reset: reset,\n handleNewMetric: handleNewMetric\n };\n\n return instance;\n}\n\nHttpListHandler.__dashjs_factory_name = 'HttpListHandler';\nexport default dashjs.FactoryMaker.getClassFactory(HttpListHandler); /* jshint ignore:line */\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n * @ignore\n */\nfunction GenericMetricHandler() {\n\n let instance,\n metricName,\n reportingController;\n\n function initialize(name, rc) {\n metricName = name;\n reportingController = rc;\n }\n\n function reset() {\n reportingController = null;\n metricName = undefined;\n }\n\n function handleNewMetric(metric, vo) {\n // simply pass metric straight through\n if (metric === metricName) {\n if (reportingController) {\n reportingController.report(metricName, vo);\n }\n }\n }\n\n instance = {\n initialize: initialize,\n reset: reset,\n handleNewMetric: handleNewMetric\n };\n\n return instance;\n}\n\nGenericMetricHandler.__dashjs_factory_name = 'GenericMetricHandler';\nexport default dashjs.FactoryMaker.getClassFactory(GenericMetricHandler); /* jshint ignore:line */\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport BufferLevel from './handlers/BufferLevelHandler';\nimport DVBErrors from './handlers/DVBErrorsHandler';\nimport HttpList from './handlers/HttpListHandler';\nimport GenericMetricHandler from './handlers/GenericMetricHandler';\n\nfunction MetricsHandlerFactory(config) {\n\n config = config || {};\n let instance;\n const logger = config.debug ? config.debug.getLogger(instance) : {};\n\n // group 1: key, [group 3: n [, group 5: type]]\n let keyRegex = /([a-zA-Z]*)(\\(([0-9]*)(\\,\\s*([a-zA-Z]*))?\\))?/;\n\n const context = this.context;\n let knownFactoryProducts = {\n BufferLevel: BufferLevel,\n DVBErrors: DVBErrors,\n HttpList: HttpList,\n PlayList: GenericMetricHandler,\n RepSwitchList: GenericMetricHandler,\n TcpList: GenericMetricHandler\n };\n\n function create(listType, reportingController) {\n var matches = listType.match(keyRegex);\n var handler;\n\n if (!matches) {\n return;\n }\n\n try {\n handler = knownFactoryProducts[matches[1]](context).create({\n eventBus: config.eventBus,\n metricsConstants: config.metricsConstants\n });\n\n handler.initialize(\n matches[1],\n reportingController,\n matches[3],\n matches[5]\n );\n } catch (e) {\n handler = null;\n logger.error(`MetricsHandlerFactory: Could not create handler for type ${matches[1]} with args ${matches[3]}, ${matches[5]} (${e.message})`);\n }\n\n return handler;\n }\n\n function register(key, handler) {\n knownFactoryProducts[key] = handler;\n }\n\n function unregister(key) {\n delete knownFactoryProducts[key];\n }\n\n instance = {\n create: create,\n register: register,\n unregister: unregister\n };\n\n return instance;\n}\n\nMetricsHandlerFactory.__dashjs_factory_name = 'MetricsHandlerFactory';\nexport default dashjs.FactoryMaker.getSingletonFactory(MetricsHandlerFactory); /* jshint ignore:line */\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport MetricsHandlerFactory from '../metrics/MetricsHandlerFactory';\n\nfunction MetricsHandlersController(config) {\n\n config = config || {};\n let handlers = [];\n\n let instance;\n const context = this.context;\n const eventBus = config.eventBus;\n const Events = config.events;\n\n let metricsHandlerFactory = MetricsHandlerFactory(context).getInstance({\n debug: config.debug,\n eventBus: config.eventBus,\n metricsConstants: config.metricsConstants\n });\n\n function handle(e) {\n handlers.forEach(handler => {\n handler.handleNewMetric(e.metric, e.value, e.mediaType);\n });\n }\n\n function initialize(metrics, reportingController) {\n metrics.split(',').forEach(\n (m, midx, ms) => {\n let handler;\n\n // there is a bug in ISO23009-1 where the metrics attribute\n // is a comma-separated list but HttpList key can contain a\n // comma enclosed by ().\n if ((m.indexOf('(') !== -1) && m.indexOf(')') === -1) {\n let nextm = ms[midx + 1];\n\n if (nextm &&\n (nextm.indexOf('(') === -1) &&\n (nextm.indexOf(')') !== -1)) {\n m += ',' + nextm;\n\n // delete the next metric so forEach does not visit.\n delete ms[midx + 1];\n }\n }\n\n handler = metricsHandlerFactory.create(\n m,\n reportingController\n );\n\n if (handler) {\n handlers.push(handler);\n }\n }\n );\n\n eventBus.on(\n Events.METRIC_ADDED,\n handle,\n instance\n );\n\n eventBus.on(\n Events.METRIC_UPDATED,\n handle,\n instance\n );\n }\n\n function reset() {\n eventBus.off(\n Events.METRIC_ADDED,\n handle,\n instance\n );\n\n eventBus.off(\n Events.METRIC_UPDATED,\n handle,\n instance\n );\n\n handlers.forEach(handler => handler.reset());\n\n handlers = [];\n }\n\n instance = {\n initialize: initialize,\n reset: reset\n };\n\n return instance;\n}\n\nMetricsHandlersController.__dashjs_factory_name = 'MetricsHandlersController';\nexport default dashjs.FactoryMaker.getClassFactory(MetricsHandlersController); /* jshint ignore:line */\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport RangeController from './RangeController';\nimport ReportingController from './ReportingController';\nimport MetricsHandlersController from './MetricsHandlersController';\n\nfunction MetricsController(config) {\n\n config = config || {};\n let metricsHandlersController,\n reportingController,\n rangeController,\n instance;\n\n let context = this.context;\n\n function initialize(metricsEntry) {\n try {\n rangeController = RangeController(context).create({\n mediaElement: config.mediaElement\n });\n\n rangeController.initialize(metricsEntry.Range);\n\n reportingController = ReportingController(context).create({\n debug: config.debug,\n metricsConstants: config.metricsConstants,\n mediaPlayerModel: config.mediaPlayerModel\n });\n\n reportingController.initialize(metricsEntry.Reporting, rangeController);\n\n metricsHandlersController = MetricsHandlersController(context).create({\n debug: config.debug,\n eventBus: config.eventBus,\n metricsConstants: config.metricsConstants,\n events: config.events\n });\n\n metricsHandlersController.initialize(metricsEntry.metrics, reportingController);\n } catch (e) {\n reset();\n throw e;\n }\n }\n\n function reset() {\n if (metricsHandlersController) {\n metricsHandlersController.reset();\n }\n\n if (reportingController) {\n reportingController.reset();\n }\n\n if (rangeController) {\n rangeController.reset();\n }\n }\n\n instance = {\n initialize: initialize,\n reset: reset\n };\n\n return instance;\n}\n\nMetricsController.__dashjs_factory_name = 'MetricsController';\nexport default dashjs.FactoryMaker.getClassFactory(MetricsController); /* jshint ignore:line */\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass Metrics {\n constructor() {\n\n this.metrics = '';\n this.Range = [];\n this.Reporting = [];\n }\n}\n\nexport default Metrics;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass Range {\n constructor() {\n\n // as defined in ISO23009-1\n this.starttime = 0;\n this.duration = Infinity;\n\n // for internal use\n this._useWallClockTime = false;\n }\n}\n\nexport default Range;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\n\n// TS 103 285 Clause 10.12.3.3\nconst DEFAULT_DVB_PROBABILITY = 1000;\n\nclass Reporting {\n constructor() {\n\n this.schemeIdUri = '';\n this.value = '';\n\n // DVB Extensions\n this.dvbReportingUrl = '';\n this.dvbProbability = DEFAULT_DVB_PROBABILITY;\n }\n}\n\nexport default Reporting;\n","import Metrics from '../vo/Metrics';\nimport Range from '../vo/Range';\nimport Reporting from '../vo/Reporting';\n\nfunction ManifestParsing (config) {\n config = config || {};\n let instance;\n let adapter = config.adapter;\n const constants = config.constants;\n\n function getMetricsRangeStartTime(manifest, dynamic, range) {\n let voPeriods,\n reportingStartTime;\n let presentationStartTime = 0;\n\n if (dynamic) {\n // For services with MPD@type='dynamic', the start time is\n // indicated in wall clock time by adding the value of this\n // attribute to the value of the MPD@availabilityStartTime\n // attribute.\n presentationStartTime = adapter.getAvailabilityStartTime(manifest) / 1000;\n } else {\n // For services with MPD@type='static', the start time is indicated\n // in Media Presentation time and is relative to the PeriodStart\n // time of the first Period in this MPD.\n voPeriods = adapter.getRegularPeriods(manifest);\n\n if (voPeriods.length) {\n presentationStartTime = voPeriods[0].start;\n }\n }\n\n // When not present, DASH Metrics collection is\n // requested from the beginning of content\n // consumption.\n reportingStartTime = presentationStartTime;\n\n if (range && range.hasOwnProperty(constants.START_TIME)) {\n reportingStartTime += range.starttime;\n }\n\n return reportingStartTime;\n }\n\n function getMetrics(manifest) {\n let metrics = [];\n\n if (manifest && manifest.Metrics_asArray) {\n manifest.Metrics_asArray.forEach(metric => {\n var metricEntry = new Metrics();\n var isDynamic = adapter.getIsDynamic(manifest);\n\n if (metric.hasOwnProperty('metrics')) {\n metricEntry.metrics = metric.metrics;\n } else {\n return;\n }\n\n if (metric.Range_asArray) {\n metric.Range_asArray.forEach(range => {\n var rangeEntry = new Range();\n\n rangeEntry.starttime =\n getMetricsRangeStartTime(manifest, isDynamic, range);\n\n if (range.hasOwnProperty('duration')) {\n rangeEntry.duration = range.duration;\n } else {\n // if not present, the value is identical to the\n // Media Presentation duration.\n rangeEntry.duration = adapter.getDuration(manifest);\n }\n\n rangeEntry._useWallClockTime = isDynamic;\n\n metricEntry.Range.push(rangeEntry);\n });\n }\n\n if (metric.Reporting_asArray) {\n metric.Reporting_asArray.forEach(reporting => {\n var reportingEntry = new Reporting();\n\n if (reporting.hasOwnProperty(constants.SCHEME_ID_URI)) {\n reportingEntry.schemeIdUri = reporting.schemeIdUri;\n } else {\n // Invalid Reporting. schemeIdUri must be set. Ignore.\n return;\n }\n\n if (reporting.hasOwnProperty('value')) {\n reportingEntry.value = reporting.value;\n }\n\n if (reporting.hasOwnProperty(constants.DVB_REPORTING_URL)) {\n reportingEntry.dvbReportingUrl = reporting[constants.DVB_REPORTING_URL];\n }\n\n if (reporting.hasOwnProperty(constants.DVB_PROBABILITY)) {\n reportingEntry.dvbProbability = reporting[constants.DVB_PROBABILITY];\n }\n\n metricEntry.Reporting.push(reportingEntry);\n });\n } else {\n // Invalid Metrics. At least one reporting must be present. Ignore\n return;\n }\n\n metrics.push(metricEntry);\n });\n }\n\n return metrics;\n }\n\n instance = {\n getMetrics: getMetrics\n };\n\n return instance;\n}\n\nManifestParsing.__dashjs_factory_name = 'ManifestParsing';\nexport default dashjs.FactoryMaker.getSingletonFactory(ManifestParsing); /* jshint ignore:line */","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport MetricsController from './MetricsController';\nimport ManifestParsing from '../utils/ManifestParsing';\nimport MetricsReportingEvents from '../MetricsReportingEvents';\n\nfunction MetricsCollectionController(config) {\n\n config = config || {};\n let instance;\n let metricsControllers = {};\n let context = this.context;\n let eventBus = config.eventBus;\n const events = config.events;\n\n function update(e) {\n if (e.error) {\n return;\n }\n\n // start by assuming all existing controllers need removing\n let controllersToRemove = Object.keys(metricsControllers);\n\n const metrics = ManifestParsing(context).getInstance({\n adapter: config.adapter,\n constants: config.constants\n }).getMetrics(e.manifest);\n\n metrics.forEach(m => {\n const key = JSON.stringify(m);\n\n if (!metricsControllers.hasOwnProperty(key)) {\n try {\n let controller = MetricsController(context).create(config);\n controller.initialize(m);\n metricsControllers[key] = controller;\n } catch (e) {\n // fail quietly\n }\n } else {\n // we still need this controller - delete from removal list\n controllersToRemove.splice(key, 1);\n }\n });\n\n // now remove the unwanted controllers\n controllersToRemove.forEach(c => {\n metricsControllers[c].reset();\n delete metricsControllers[c];\n });\n\n eventBus.trigger(MetricsReportingEvents.METRICS_INITIALISATION_COMPLETE);\n }\n\n function resetMetricsControllers() {\n Object.keys(metricsControllers).forEach(key => {\n metricsControllers[key].reset();\n });\n\n metricsControllers = {};\n }\n\n function setup() {\n eventBus.on(events.MANIFEST_UPDATED, update, instance);\n eventBus.on(events.STREAM_TEARDOWN_COMPLETE, resetMetricsControllers, instance);\n }\n\n function reset() {\n eventBus.off(events.MANIFEST_UPDATED, update, instance);\n eventBus.off(events.STREAM_TEARDOWN_COMPLETE, resetMetricsControllers, instance);\n }\n\n instance = {\n reset: reset\n };\n\n setup();\n return instance;\n}\n\nMetricsCollectionController.__dashjs_factory_name = 'MetricsCollectionController';\nexport default dashjs.FactoryMaker.getClassFactory(MetricsCollectionController); /* jshint ignore:line */\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport DVBErrorsTranslator from './utils/DVBErrorsTranslator';\nimport MetricsReportingEvents from './MetricsReportingEvents';\nimport MetricsCollectionController from './controllers/MetricsCollectionController';\nimport MetricsHandlerFactory from './metrics/MetricsHandlerFactory';\nimport ReportingFactory from './reporting/ReportingFactory';\n\nfunction MetricsReporting() {\n\n let context = this.context;\n let instance,\n dvbErrorsTranslator;\n\n /**\n * Create a MetricsCollectionController, and a DVBErrorsTranslator\n * @param {Object} config - dependancies from owner\n * @return {MetricsCollectionController} Metrics Collection Controller\n */\n function createMetricsReporting(config) {\n dvbErrorsTranslator = DVBErrorsTranslator(context).getInstance({\n eventBus: config.eventBus,\n dashMetrics: config.dashMetrics,\n metricsConstants: config.metricsConstants,\n events: config.events\n });\n dvbErrorsTranslator.initialize();\n return MetricsCollectionController(context).create(config);\n }\n\n /**\n * Get the ReportingFactory to allow new reporters to be registered\n * @return {ReportingFactory} Reporting Factory\n */\n function getReportingFactory() {\n return ReportingFactory(context).getInstance();\n }\n\n /**\n * Get the MetricsHandlerFactory to allow new handlers to be registered\n * @return {MetricsHandlerFactory} Metrics Handler Factory\n */\n function getMetricsHandlerFactory() {\n return MetricsHandlerFactory(context).getInstance();\n }\n\n instance = {\n createMetricsReporting: createMetricsReporting,\n getReportingFactory: getReportingFactory,\n getMetricsHandlerFactory: getMetricsHandlerFactory\n };\n\n return instance;\n}\n\nMetricsReporting.__dashjs_factory_name = 'MetricsReporting';\nconst factory = dashjs.FactoryMaker.getClassFactory(MetricsReporting); /* jshint ignore:line */\nfactory.events = MetricsReportingEvents;\ndashjs.FactoryMaker.updateClassFactory(MetricsReporting.__dashjs_factory_name, factory); /* jshint ignore:line */\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport EventsBase from '../../core/events/EventsBase';\n\n/**\n * @class\n * @implements EventsBase\n */\nclass MetricsReportingEvents extends EventsBase {\n constructor () {\n super();\n\n this.METRICS_INITIALISATION_COMPLETE = 'internal_metricsReportingInitialized';\n this.BECAME_REPORTING_PLAYER = 'internal_becameReportingPlayer';\n\n /**\n * Triggered when CMCD data was generated for a HTTP request\n * @event MetricsReportingEvents#CMCD_DATA_GENERATED\n */\n this.CMCD_DATA_GENERATED = 'cmcdDataGenerated';\n }\n}\n\nlet metricsReportingEvents = new MetricsReportingEvents();\nexport default metricsReportingEvents;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport UTCTiming from '../../dash/vo/UTCTiming';\nimport FactoryMaker from '../../core/FactoryMaker';\nimport Settings from '../../core/Settings';\nimport {checkParameterType} from '../utils/SupervisorTools';\nimport ABRRulesCollection from '../rules/abr/ABRRulesCollection';\nimport Constants from '../constants/Constants';\n\nconst DEFAULT_XHR_WITH_CREDENTIALS = false;\n\nfunction CustomParametersModel() {\n\n let instance,\n utcTimingSources,\n xhrWithCredentials,\n licenseRequestFilters,\n licenseResponseFilters,\n customCapabilitiesFilters,\n customInitialTrackSelectionFunction,\n customAbrRules;\n\n const context = this.context;\n const settings = Settings(context).getInstance();\n\n function setup() {\n xhrWithCredentials = {\n default: DEFAULT_XHR_WITH_CREDENTIALS\n };\n _resetInitialSettings();\n }\n\n function _resetInitialSettings() {\n licenseRequestFilters = [];\n licenseResponseFilters = [];\n customCapabilitiesFilters = [];\n customAbrRules = [];\n customInitialTrackSelectionFunction = null;\n utcTimingSources = [];\n }\n\n\n function reset() {\n _resetInitialSettings();\n }\n\n function setConfig() {\n\n }\n\n /**\n * Registers a custom initial track selection function. Only one function is allowed. Calling this method will overwrite a potentially existing function.\n * @param {function} customFunc - the custom function that returns the initial track\n */\n function setCustomInitialTrackSelectionFunction(customFunc) {\n customInitialTrackSelectionFunction = customFunc;\n }\n\n /**\n * Resets the custom initial track selection\n */\n function resetCustomInitialTrackSelectionFunction() {\n customInitialTrackSelectionFunction = null;\n }\n\n /**\n * Returns the initial track selection function\n * @return {function}\n */\n function getCustomInitialTrackSelectionFunction() {\n return customInitialTrackSelectionFunction;\n }\n\n /**\n * Returns all license request filters\n * @return {array}\n */\n function getLicenseRequestFilters() {\n return licenseRequestFilters;\n }\n\n /**\n * Returns all license response filters\n * @return {array}\n */\n function getLicenseResponseFilters() {\n return licenseResponseFilters;\n }\n\n /**\n * Registers a license request filter. This enables application to manipulate/overwrite any request parameter and/or request data.\n * The provided callback function shall return a promise that shall be resolved once the filter process is completed.\n * The filters are applied in the order they are registered.\n * @param {function} filter - the license request filter callback\n */\n function registerLicenseRequestFilter(filter) {\n licenseRequestFilters.push(filter);\n }\n\n /**\n * Registers a license response filter. This enables application to manipulate/overwrite the response data\n * The provided callback function shall return a promise that shall be resolved once the filter process is completed.\n * The filters are applied in the order they are registered.\n * @param {function} filter - the license response filter callback\n */\n function registerLicenseResponseFilter(filter) {\n licenseResponseFilters.push(filter);\n }\n\n /**\n * Unregisters a license request filter.\n * @param {function} filter - the license request filter callback\n */\n function unregisterLicenseRequestFilter(filter) {\n _unregisterFilter(licenseRequestFilters, filter);\n }\n\n /**\n * Unregisters a license response filter.\n * @param {function} filter - the license response filter callback\n */\n function unregisterLicenseResponseFilter(filter) {\n _unregisterFilter(licenseResponseFilters, filter);\n }\n\n /**\n * Returns all custom capabilities filter\n * @return {array}\n */\n function getCustomCapabilitiesFilters() {\n return customCapabilitiesFilters;\n }\n\n /**\n * Registers a custom capabilities filter. This enables application to filter representations to use.\n * The provided callback function shall return a boolean based on whether or not to use the representation.\n * The filters are applied in the order they are registered.\n * @param {function} filter - the custom capabilities filter callback\n */\n function registerCustomCapabilitiesFilter(filter) {\n customCapabilitiesFilters.push(filter);\n }\n\n /**\n * Unregisters a custom capabilities filter.\n * @param {function} filter - the custom capabilities filter callback\n */\n function unregisterCustomCapabilitiesFilter(filter) {\n _unregisterFilter(customCapabilitiesFilters, filter);\n }\n\n /**\n * Unregister a filter from the list of existing filers.\n * @param {array} filters\n * @param {function} filter\n * @private\n */\n function _unregisterFilter(filters, filter) {\n let index = -1;\n filters.some((item, i) => {\n if (item === filter) {\n index = i;\n return true;\n }\n });\n if (index < 0) return;\n filters.splice(index, 1);\n }\n\n /**\n * Iterate through the list of custom ABR rules and find the right rule by name\n * @param {string} rulename\n * @return {number} rule number\n */\n function _findAbrCustomRuleIndex(rulename) {\n let i;\n for (i = 0; i < customAbrRules.length; i++) {\n if (customAbrRules[i].rulename === rulename) {\n return i;\n }\n }\n return -1;\n }\n\n /**\n * Add a custom ABR Rule\n * Rule will be apply on next stream if a stream is being played\n *\n * @param {string} type - rule type (one of ['qualitySwitchRules','abandonFragmentRules'])\n * @param {string} rulename - name of rule (used to identify custom rule). If one rule of same name has been added, then existing rule will be updated\n * @param {object} rule - the rule object instance\n * @throws {@link Constants#BAD_ARGUMENT_ERROR BAD_ARGUMENT_ERROR} if called with invalid arguments.\n */\n function addAbrCustomRule(type, rulename, rule) {\n if (typeof type !== 'string' || (type !== ABRRulesCollection.ABANDON_FRAGMENT_RULES && type !== ABRRulesCollection.QUALITY_SWITCH_RULES) ||\n typeof rulename !== 'string') {\n throw Constants.BAD_ARGUMENT_ERROR;\n }\n let index = _findAbrCustomRuleIndex(rulename);\n if (index === -1) {\n // add rule\n customAbrRules.push({\n type: type,\n rulename: rulename,\n rule: rule\n });\n } else {\n // update rule\n customAbrRules[index].type = type;\n customAbrRules[index].rule = rule;\n }\n }\n\n /**\n * Remove a custom ABR Rule\n *\n * @param {string} rulename - name of the rule to be removed\n */\n function removeAbrCustomRule(rulename) {\n if (rulename) {\n let index = _findAbrCustomRuleIndex(rulename);\n //if no rulename custom rule has been found, do nothing\n if (index !== -1) {\n // remove rule\n customAbrRules.splice(index, 1);\n }\n } else {\n //if no rulename is defined, remove all ABR custome rules\n customAbrRules = [];\n }\n }\n\n /**\n * Remove all custom rules\n */\n function removeAllAbrCustomRule() {\n customAbrRules = [];\n }\n\n /**\n * Return all ABR custom rules\n * @return {array}\n */\n function getAbrCustomRules() {\n return customAbrRules;\n }\n\n\n /**\n * Add a UTC timing source at the top of the list\n * @param {string} schemeIdUri\n * @param {string} value\n */\n function addUTCTimingSource(schemeIdUri, value) {\n removeUTCTimingSource(schemeIdUri, value); //check if it already exists and remove if so.\n let vo = new UTCTiming();\n vo.schemeIdUri = schemeIdUri;\n vo.value = value;\n utcTimingSources.push(vo);\n }\n\n /**\n * Return all UTC timing sources\n * @return {array}\n */\n function getUTCTimingSources() {\n return utcTimingSources;\n }\n\n /**\n * Remove a specific timing source from the array\n * @param {string} schemeIdUri\n * @param {string} value\n */\n function removeUTCTimingSource(schemeIdUri, value) {\n checkParameterType(schemeIdUri, 'string');\n checkParameterType(value, 'string');\n utcTimingSources.forEach(function (obj, idx) {\n if (obj.schemeIdUri === schemeIdUri && obj.value === value) {\n utcTimingSources.splice(idx, 1);\n }\n });\n }\n\n /**\n * Remove all timing sources\n */\n function clearDefaultUTCTimingSources() {\n utcTimingSources = [];\n }\n\n /**\n * Add the default timing source to the list\n */\n function restoreDefaultUTCTimingSources() {\n let defaultUtcTimingSource = settings.get().streaming.utcSynchronization.defaultTimingSource;\n addUTCTimingSource(defaultUtcTimingSource.scheme, defaultUtcTimingSource.value);\n }\n\n function setXHRWithCredentialsForType(type, value) {\n if (!type) {\n Object.keys(xhrWithCredentials).forEach(key => {\n setXHRWithCredentialsForType(key, value);\n });\n } else {\n xhrWithCredentials[type] = !!value;\n }\n }\n\n function getXHRWithCredentialsForType(type) {\n const useCreds = xhrWithCredentials[type];\n\n return useCreds === undefined ? xhrWithCredentials.default : useCreds;\n }\n\n instance = {\n getCustomInitialTrackSelectionFunction,\n setCustomInitialTrackSelectionFunction,\n resetCustomInitialTrackSelectionFunction,\n getLicenseResponseFilters,\n getLicenseRequestFilters,\n getCustomCapabilitiesFilters,\n registerCustomCapabilitiesFilter,\n registerLicenseResponseFilter,\n registerLicenseRequestFilter,\n unregisterCustomCapabilitiesFilter,\n unregisterLicenseResponseFilter,\n unregisterLicenseRequestFilter,\n addAbrCustomRule,\n removeAllAbrCustomRule,\n removeAbrCustomRule,\n getAbrCustomRules,\n addUTCTimingSource,\n removeUTCTimingSource,\n getUTCTimingSources,\n clearDefaultUTCTimingSources,\n restoreDefaultUTCTimingSources,\n setXHRWithCredentialsForType,\n getXHRWithCredentialsForType,\n setConfig,\n reset\n };\n\n setup();\n\n return instance;\n}\n\nCustomParametersModel.__dashjs_factory_name = 'CustomParametersModel';\nexport default FactoryMaker.getSingletonFactory(CustomParametersModel);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport FactoryMaker from '../../core/FactoryMaker';\nimport { modifyRequest } from '../utils/RequestModifier';\n\n/**\n * @module XHRLoader\n * @ignore\n * @description Manages download of resources via HTTP.\n * @param {Object} cfg - dependencies from parent\n */\nfunction XHRLoader(cfg) {\n\n cfg = cfg || {};\n const requestModifier = cfg.requestModifier;\n\n let instance;\n\n function load(httpRequest) {\n if (requestModifier && requestModifier.modifyRequest) {\n modifyRequest(httpRequest, requestModifier)\n .then(() => request(httpRequest));\n }\n else {\n request(httpRequest);\n }\n }\n\n function request(httpRequest) {\n // Variables will be used in the callback functions\n const requestStartTime = new Date();\n const request = httpRequest.request;\n\n let xhr = new XMLHttpRequest();\n xhr.open(httpRequest.method, httpRequest.url, true);\n\n if (request.responseType) {\n xhr.responseType = request.responseType;\n }\n\n if (request.range) {\n xhr.setRequestHeader('Range', 'bytes=' + request.range);\n }\n\n if (!request.requestStartDate) {\n request.requestStartDate = requestStartTime;\n }\n\n if (requestModifier && requestModifier.modifyRequestHeader) {\n xhr = requestModifier.modifyRequestHeader(xhr, {\n url: httpRequest.url\n });\n }\n\n if (httpRequest.headers) {\n for (let header in httpRequest.headers) {\n let value = httpRequest.headers[header];\n if (value) {\n xhr.setRequestHeader(header, value);\n }\n }\n }\n\n xhr.withCredentials = httpRequest.withCredentials;\n\n xhr.onload = httpRequest.onload;\n xhr.onloadend = httpRequest.onend;\n xhr.onerror = httpRequest.onerror;\n xhr.onprogress = httpRequest.progress;\n xhr.onabort = httpRequest.onabort;\n xhr.ontimeout = httpRequest.ontimeout;\n xhr.timeout = httpRequest.timeout;\n\n xhr.send();\n\n httpRequest.response = xhr;\n }\n\n function abort(request) {\n const x = request.response;\n x.onloadend = x.onerror = x.onprogress = undefined; //Ignore events from aborted requests.\n x.abort();\n }\n\n instance = {\n load: load,\n abort: abort\n };\n\n return instance;\n}\n\nXHRLoader.__dashjs_factory_name = 'XHRLoader';\n\nconst factory = FactoryMaker.getClassFactory(XHRLoader);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nconst LICENSE_SERVER_MANIFEST_CONFIGURATIONS = {\n attributes: ['Laurl', 'laurl'],\n prefixes: ['clearkey', 'dashif']\n};\n\n/**\n * @class\n * @ignore\n */\nclass CommonEncryption {\n /**\n * Find and return the ContentProtection element in the given array\n * that indicates support for MPEG Common Encryption\n *\n * @param {Array} cpArray array of content protection elements\n * @returns {Object|null} the Common Encryption content protection element or\n * null if one was not found\n */\n static findCencContentProtection(cpArray) {\n let retVal = null;\n for (let i = 0; i < cpArray.length; ++i) {\n let cp = cpArray[i];\n if (cp.schemeIdUri.toLowerCase() === 'urn:mpeg:dash:mp4protection:2011' &&\n (cp.value.toLowerCase() === 'cenc' || cp.value.toLowerCase() === 'cbcs'))\n retVal = cp;\n }\n return retVal;\n }\n\n /**\n * Returns just the data portion of a single PSSH\n *\n * @param {ArrayBuffer} pssh - the PSSH\n * @return {ArrayBuffer} data portion of the PSSH\n */\n static getPSSHData(pssh) {\n let offset = 8; // Box size and type fields\n let view = new DataView(pssh);\n\n // Read version\n let version = view.getUint8(offset);\n\n offset += 20; // Version (1), flags (3), system ID (16)\n\n if (version > 0) {\n offset += 4 + (16 * view.getUint32(offset)); // Key ID count (4) and All key IDs (16*count)\n }\n\n offset += 4; // Data size\n return pssh.slice(offset);\n }\n\n /**\n * Returns the PSSH associated with the given key system from the concatenated\n * list of PSSH boxes in the given initData\n *\n * @param {KeySystem} keySystem the desired\n * key system\n * @param {ArrayBuffer} initData 'cenc' initialization data. Concatenated list of PSSH.\n * @returns {ArrayBuffer|null} The PSSH box data corresponding to the given key system, null if not found\n * or null if a valid association could not be found.\n */\n static getPSSHForKeySystem(keySystem, initData) {\n let psshList = CommonEncryption.parsePSSHList(initData);\n if (keySystem && psshList.hasOwnProperty(keySystem.uuid.toLowerCase())) {\n return psshList[keySystem.uuid.toLowerCase()];\n }\n return null;\n }\n\n /**\n * Parse a standard common encryption PSSH which contains a simple\n * base64-encoding of the init data\n *\n * @param {Object} cpData the ContentProtection element\n * @param {BASE64} BASE64 reference\n * @returns {ArrayBuffer|null} the init data or null if not found\n */\n static parseInitDataFromContentProtection(cpData, BASE64) {\n if ('pssh' in cpData) {\n\n // Remove whitespaces and newlines from pssh text\n cpData.pssh.__text = cpData.pssh.__text.replace(/\\r?\\n|\\r/g, '').replace(/\\s+/g, '');\n\n return BASE64.decodeArray(cpData.pssh.__text).buffer;\n }\n return null;\n }\n\n /**\n * Parses list of PSSH boxes into keysystem-specific PSSH data\n *\n * @param {ArrayBuffer} data - the concatenated list of PSSH boxes as provided by\n * CDM as initialization data when CommonEncryption content is detected\n * @returns {Object|Array} an object that has a property named according to each of\n * the detected key system UUIDs (e.g. 00000000-0000-0000-0000-0000000000)\n * and a ArrayBuffer (the entire PSSH box) as the property value\n */\n static parsePSSHList(data) {\n\n if (data === null || data === undefined)\n return [];\n\n let dv = new DataView(data.buffer || data); // data.buffer first for Uint8Array support\n let done = false;\n let pssh = {};\n\n // TODO: Need to check every data read for end of buffer\n let byteCursor = 0;\n while (!done) {\n\n let size,\n nextBox,\n version,\n systemID;\n let boxStart = byteCursor;\n\n if (byteCursor >= dv.buffer.byteLength)\n break;\n\n /* Box size */\n size = dv.getUint32(byteCursor);\n nextBox = byteCursor + size;\n byteCursor += 4;\n\n /* Verify PSSH */\n if (dv.getUint32(byteCursor) !== 0x70737368) {\n byteCursor = nextBox;\n continue;\n }\n byteCursor += 4;\n\n /* Version must be 0 or 1 */\n version = dv.getUint8(byteCursor);\n if (version !== 0 && version !== 1) {\n byteCursor = nextBox;\n continue;\n }\n byteCursor++;\n\n byteCursor += 3; /* skip flags */\n\n // 16-byte UUID/SystemID\n systemID = '';\n let i, val;\n for (i = 0; i < 4; i++) {\n val = dv.getUint8(byteCursor + i).toString(16);\n systemID += (val.length === 1) ? '0' + val : val;\n }\n byteCursor += 4;\n systemID += '-';\n for (i = 0; i < 2; i++) {\n val = dv.getUint8(byteCursor + i).toString(16);\n systemID += (val.length === 1) ? '0' + val : val;\n }\n byteCursor += 2;\n systemID += '-';\n for (i = 0; i < 2; i++) {\n val = dv.getUint8(byteCursor + i).toString(16);\n systemID += (val.length === 1) ? '0' + val : val;\n }\n byteCursor += 2;\n systemID += '-';\n for (i = 0; i < 2; i++) {\n val = dv.getUint8(byteCursor + i).toString(16);\n systemID += (val.length === 1) ? '0' + val : val;\n }\n byteCursor += 2;\n systemID += '-';\n for (i = 0; i < 6; i++) {\n val = dv.getUint8(byteCursor + i).toString(16);\n systemID += (val.length === 1) ? '0' + val : val;\n }\n byteCursor += 6;\n\n systemID = systemID.toLowerCase();\n\n /* PSSH Data Size */\n byteCursor += 4;\n\n /* PSSH Data */\n pssh[systemID] = dv.buffer.slice(boxStart, nextBox);\n byteCursor = nextBox;\n }\n\n return pssh;\n }\n\n static getLicenseServerUrlFromMediaInfo(mediaInfo, schemeIdUri) {\n try {\n\n if (!mediaInfo || mediaInfo.length === 0) {\n return null;\n }\n\n let i = 0;\n let licenseServer = null;\n\n while (i < mediaInfo.length && !licenseServer) {\n const info = mediaInfo[i];\n\n if (info && info.contentProtection && info.contentProtection.length > 0) {\n const targetProtectionData = info.contentProtection.filter((cp) => {\n return cp.schemeIdUri && cp.schemeIdUri === schemeIdUri;\n });\n\n if (targetProtectionData && targetProtectionData.length > 0) {\n let j = 0;\n while (j < targetProtectionData.length && !licenseServer) {\n const ckData = targetProtectionData[j];\n let k = 0;\n while (k < LICENSE_SERVER_MANIFEST_CONFIGURATIONS.attributes.length && !licenseServer) {\n let l = 0;\n const attribute = LICENSE_SERVER_MANIFEST_CONFIGURATIONS.attributes[k];\n while (l < LICENSE_SERVER_MANIFEST_CONFIGURATIONS.prefixes.length && !licenseServer) {\n const prefix = LICENSE_SERVER_MANIFEST_CONFIGURATIONS.prefixes[l];\n if (ckData[attribute] && ckData[attribute].__prefix && ckData[attribute].__prefix === prefix && ckData[attribute].__text) {\n licenseServer = ckData[attribute].__text;\n }\n l += 1;\n }\n k += 1;\n }\n j += 1;\n }\n }\n }\n i += 1;\n }\n return licenseServer;\n } catch (e) {\n return null;\n }\n }\n}\n\nexport default CommonEncryption;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @classdesc A media capability\n * @ignore\n */\nclass MediaCapability {\n /**\n * @param {string} contentType MIME type and codecs (RFC6386)\n * @param {string} robustness\n * @class\n * @ignore\n */\n constructor(contentType, robustness) {\n this.contentType = contentType;\n this.robustness = robustness;\n }\n}\n\nexport default MediaCapability;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n * @classdesc Represents a set of configurations that describe the capabilities desired for\n * support by a given CDM\n * @ignore\n */\nclass KeySystemConfiguration {\n /**\n * @param {Array.<MediaCapability>} audioCapabilities array of\n * desired audio capabilities. Higher preference capabilities should be placed earlier\n * in the array.\n * @param {Array.<MediaCapability>} videoCapabilities array of\n * desired video capabilities. Higher preference capabilities should be placed earlier\n * in the array.\n * @param {string} distinctiveIdentifier desired use of distinctive identifiers.\n * One of \"required\", \"optional\", or \"not-allowed\"\n * @param {string} persistentState desired support for persistent storage of\n * key systems. One of \"required\", \"optional\", or \"not-allowed\"\n * @param {Array.<string>} sessionTypes List of session types that must\n * be supported by the key system\n * @class\n */\n constructor(audioCapabilities, videoCapabilities, distinctiveIdentifier, persistentState, sessionTypes) {\n this.initDataTypes = [ 'cenc' ];\n if (audioCapabilities && audioCapabilities.length) {\n this.audioCapabilities = audioCapabilities;\n }\n if (videoCapabilities && videoCapabilities.length) {\n this.videoCapabilities = videoCapabilities;\n }\n this.distinctiveIdentifier = distinctiveIdentifier;\n this.persistentState = persistentState;\n this.sessionTypes = sessionTypes;\n }\n}\n\nexport default KeySystemConfiguration;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport ErrorsBase from '../../../core/errors/ErrorsBase';\n\n/**\n * @class\n */\nclass ProtectionErrors extends ErrorsBase {\n constructor() {\n super();\n\n /**\n * Generid key Error code\n */\n this.MEDIA_KEYERR_CODE = 100;\n /**\n * Error code returned by keyerror api for ProtectionModel_01b\n */\n this.MEDIA_KEYERR_UNKNOWN_CODE = 101;\n /**\n * Error code returned by keyerror api for ProtectionModel_01b\n */\n this.MEDIA_KEYERR_CLIENT_CODE = 102;\n /**\n * Error code returned by keyerror api for ProtectionModel_01b\n */\n this.MEDIA_KEYERR_SERVICE_CODE = 103;\n /**\n * Error code returned by keyerror api for ProtectionModel_01b\n */\n this.MEDIA_KEYERR_OUTPUT_CODE = 104;\n /**\n * Error code returned by keyerror api for ProtectionModel_01b\n */\n this.MEDIA_KEYERR_HARDWARECHANGE_CODE = 105;\n /**\n * Error code returned by keyerror api for ProtectionModel_01b\n */\n this.MEDIA_KEYERR_DOMAIN_CODE = 106;\n\n /**\n * Error code returned when an error occured in keymessage event for ProtectionModel_01b\n */\n this.MEDIA_KEY_MESSAGE_ERROR_CODE = 107;\n /**\n * Error code returned when challenge is invalid in keymessage event (event triggered by CDM)\n */\n this.MEDIA_KEY_MESSAGE_NO_CHALLENGE_ERROR_CODE = 108;\n /**\n * Error code returned when License server certificate has not been successfully updated\n */\n this.SERVER_CERTIFICATE_UPDATED_ERROR_CODE = 109;\n /**\n * Error code returned when license validity has expired\n */\n this.KEY_STATUS_CHANGED_EXPIRED_ERROR_CODE = 110;\n /**\n * Error code returned when no licenser url is defined\n */\n this.MEDIA_KEY_MESSAGE_NO_LICENSE_SERVER_URL_ERROR_CODE = 111;\n /**\n * Error code returned when key system access is denied\n */\n this.KEY_SYSTEM_ACCESS_DENIED_ERROR_CODE = 112;\n /**\n * Error code returned when key session has not been successfully created\n */\n this.KEY_SESSION_CREATED_ERROR_CODE = 113;\n /**\n * Error code returned when license request failed after a keymessage event has been triggered\n */\n this.MEDIA_KEY_MESSAGE_LICENSER_ERROR_CODE = 114;\n\n this.MEDIA_KEYERR_UNKNOWN_MESSAGE = 'An unspecified error occurred. This value is used for errors that don\\'t match any of the other codes.';\n this.MEDIA_KEYERR_CLIENT_MESSAGE = 'The Key System could not be installed or updated.';\n this.MEDIA_KEYERR_SERVICE_MESSAGE = 'The message passed into update indicated an error from the license service.';\n this.MEDIA_KEYERR_OUTPUT_MESSAGE = 'There is no available output device with the required characteristics for the content protection system.';\n this.MEDIA_KEYERR_HARDWARECHANGE_MESSAGE = 'A hardware configuration change caused a content protection error.';\n this.MEDIA_KEYERR_DOMAIN_MESSAGE = 'An error occurred in a multi-device domain licensing configuration. The most common error is a failure to join the domain.';\n this.MEDIA_KEY_MESSAGE_ERROR_MESSAGE = 'Multiple key sessions were creates with a user-agent that does not support sessionIDs!! Unpredictable behavior ahead!';\n this.MEDIA_KEY_MESSAGE_NO_CHALLENGE_ERROR_MESSAGE = 'DRM: Empty key message from CDM';\n this.SERVER_CERTIFICATE_UPDATED_ERROR_MESSAGE = 'Error updating server certificate -- ';\n this.KEY_STATUS_CHANGED_EXPIRED_ERROR_MESSAGE = 'DRM: KeyStatusChange error! -- License has expired';\n this.MEDIA_KEY_MESSAGE_NO_LICENSE_SERVER_URL_ERROR_MESSAGE = 'DRM: No license server URL specified!';\n this.KEY_SYSTEM_ACCESS_DENIED_ERROR_MESSAGE = 'DRM: KeySystem Access Denied! -- ';\n this.KEY_SESSION_CREATED_ERROR_MESSAGE = 'DRM: unable to create session! --';\n this.MEDIA_KEY_MESSAGE_LICENSER_ERROR_MESSAGE = 'DRM: licenser error! --';\n }\n}\n\nlet protectionErrors = new ProtectionErrors();\nexport default protectionErrors;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @classdesc Defines a license request\n * @ignore\n */\nclass LicenseRequest {\n /**\n * Defines a license request\n *\n * @class\n */\n constructor(url, method, responseType, headers, withCredentials, messageType, sessionId, data) {\n\n /**\n * The license request url\n */\n this.url = url;\n\n /**\n * The HTTP method\n */\n this.method = method;\n\n /**\n * The HTTP response type\n */\n this.responseType = responseType;\n\n /**\n * The HTP request headers\n */\n this.headers = headers;\n\n /**\n * Wether request is done using credentials (cross-site cookies)\n */\n this.withCredentials = withCredentials;\n\n /**\n * The license request message type (see https://www.w3.org/TR/encrypted-media/#dom-mediakeymessagetype)\n */\n this.messageType = messageType;\n\n /**\n * The corresponding EME session ID\n */\n this.sessionId = sessionId;\n\n /**\n * The license request data\n */\n this.data = data;\n }\n}\n\nexport default LicenseRequest;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @classdesc Defines a license response\n */\nclass LicenseResponse {\n /**\n * Defines a license response\n *\n * @class\n * @ignore\n */\n constructor(url, headers, data) {\n\n /**\n * The url that was loaded, that can be redirected from original request url\n */\n this.url = url;\n\n /**\n * The HTP response headers\n */\n this.headers = headers;\n\n /**\n * The license response data\n */\n this.data = data;\n }\n}\n\nexport default LicenseResponse;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport CommonEncryption from '../CommonEncryption';\nimport MediaCapability from '../vo/MediaCapability';\nimport KeySystemConfiguration from '../vo/KeySystemConfiguration';\nimport ProtectionErrors from '../errors/ProtectionErrors';\nimport DashJSError from '../../vo/DashJSError';\nimport LicenseRequest from '../vo/LicenseRequest';\nimport LicenseResponse from '../vo/LicenseResponse';\nimport {HTTPRequest} from '../../vo/metrics/HTTPRequest';\nimport Utils from '../../../core/Utils';\nimport Constants from '../../constants/Constants';\nimport FactoryMaker from '../../../core/FactoryMaker';\n\nconst NEEDKEY_BEFORE_INITIALIZE_RETRIES = 5;\nconst NEEDKEY_BEFORE_INITIALIZE_TIMEOUT = 500;\n\nconst LICENSE_SERVER_REQUEST_RETRIES = 3;\nconst LICENSE_SERVER_REQUEST_RETRY_INTERVAL = 1000;\nconst LICENSE_SERVER_REQUEST_DEFAULT_TIMEOUT = 8000;\n\n/**\n * @module ProtectionController\n * @description Provides access to media protection information and functionality. Each\n * ProtectionController manages a single {@link MediaPlayer.models.ProtectionModel}\n * which encapsulates a set of protection information (EME APIs, selected key system,\n * key sessions). The APIs of ProtectionController mostly align with the latest EME\n * APIs. Key system selection is mostly automated when combined with app-overrideable\n * functionality provided in {@link ProtectionKeyController}.\n * @todo ProtectionController does almost all of its tasks automatically after init() is\n * called. Applications might want more control over this process and want to go through\n * each step manually (key system selection, session creation, session maintenance).\n * This module can be accessed using the MediaPlayer API getProtectionController()\n * @param {Object} config\n */\n\nfunction ProtectionController(config) {\n\n config = config || {};\n const protectionKeyController = config.protectionKeyController;\n let protectionModel = config.protectionModel;\n const eventBus = config.eventBus;\n const events = config.events;\n const debug = config.debug;\n const BASE64 = config.BASE64;\n const constants = config.constants;\n let needkeyRetries = [];\n const cmcdModel = config.cmcdModel;\n const settings = config.settings;\n const customParametersModel = config.customParametersModel;\n\n let instance,\n logger,\n pendingKeySessionsToHandle,\n mediaInfoArr,\n protDataSet,\n sessionType,\n robustnessLevel,\n selectedKeySystem,\n keySystemSelectionInProgress,\n licenseXhrRequest,\n licenseRequestRetryTimeout;\n\n function setup() {\n logger = debug.getLogger(instance);\n pendingKeySessionsToHandle = [];\n mediaInfoArr = [];\n sessionType = 'temporary';\n robustnessLevel = '';\n licenseXhrRequest = null;\n licenseRequestRetryTimeout = null;\n eventBus.on(events.INTERNAL_KEY_MESSAGE, _onKeyMessage, instance);\n eventBus.on(events.INTERNAL_KEY_STATUS_CHANGED, _onKeyStatusChanged, instance);\n }\n\n function checkConfig() {\n if (!eventBus || !eventBus.hasOwnProperty('on') || !protectionKeyController || !protectionKeyController.hasOwnProperty('getSupportedKeySystemsFromContentProtection')) {\n throw new Error('Missing config parameter(s)');\n }\n }\n\n /**\n * Initialize this protection system for a given media type.\n *\n * @param {StreamInfo} [mediaInfo] Media information\n * @memberof module:ProtectionController\n * @instance\n */\n function initializeForMedia(mediaInfo) {\n // Not checking here if a session for similar KS/KID combination is already created\n // because still don't know which keysystem will be selected.\n // Once Keysystem is selected and before creating the session, we will do that check\n // so we create the strictly necessary DRM sessions\n if (!mediaInfo) {\n throw new Error('mediaInfo can not be null or undefined');\n }\n\n checkConfig();\n\n mediaInfoArr.push(mediaInfo);\n }\n\n /**\n * Once all mediaInfo objects have been added to our mediaInfoArray we can select a key system or check if the kid has changed and we need to trigger a new license request\n * @memberof module:ProtectionController\n * @instance\n */\n function handleKeySystemFromManifest() {\n if (!mediaInfoArr || mediaInfoArr.length === 0) {\n return;\n }\n\n let supportedKeySystems = [];\n mediaInfoArr.forEach((mInfo) => {\n const currentKs = protectionKeyController.getSupportedKeySystemsFromContentProtection(mInfo.contentProtection, protDataSet, sessionType);\n // We assume that the same key systems are signaled for each AS. We can use the first entry we found\n if (currentKs.length > 0) {\n if (supportedKeySystems.length === 0) {\n supportedKeySystems = currentKs;\n }\n // Save config for creating key session once we selected a key system\n pendingKeySessionsToHandle.push(currentKs);\n }\n })\n\n if (supportedKeySystems && supportedKeySystems.length > 0) {\n _selectKeySystemOrUpdateKeySessions(supportedKeySystems, true);\n }\n }\n\n /**\n * Selects a key system if we dont have any one yet. Otherwise we use the existing key system and trigger a new license request if the initdata has changed\n * @param {array} supportedKs\n * @private\n */\n function _handleKeySystemFromPssh(supportedKs) {\n pendingKeySessionsToHandle.push(supportedKs);\n _selectKeySystemOrUpdateKeySessions(supportedKs, false);\n }\n\n /**\n * Select the key system or update one of our existing key sessions\n * @param {array} supportedKs\n * @param {boolean} fromManifest\n * @private\n */\n function _selectKeySystemOrUpdateKeySessions(supportedKs, fromManifest) {\n // First time, so we need to select a key system\n if (!selectedKeySystem && !keySystemSelectionInProgress) {\n _selectInitialKeySystem(supportedKs, fromManifest);\n }\n\n // We already selected a key system. We only need to trigger a new license exchange if the init data has changed\n else if (selectedKeySystem) {\n _handleKeySessions();\n }\n }\n\n /**\n * We do not have a key system yet. Select one\n * @param {array} supportedKs\n * @param {boolean} fromManifest\n * @private\n */\n function _selectInitialKeySystem(supportedKs, fromManifest) {\n if (!keySystemSelectionInProgress) {\n keySystemSelectionInProgress = true;\n const requestedKeySystems = [];\n\n // Reorder key systems according to priority order provided in protectionData\n supportedKs = supportedKs.sort((ksA, ksB) => {\n let indexA = (protDataSet && protDataSet[ksA.ks.systemString] && protDataSet[ksA.ks.systemString].priority >= 0) ? protDataSet[ksA.ks.systemString].priority : supportedKs.length;\n let indexB = (protDataSet && protDataSet[ksB.ks.systemString] && protDataSet[ksB.ks.systemString].priority >= 0) ? protDataSet[ksB.ks.systemString].priority : supportedKs.length;\n return indexA - indexB;\n });\n\n // Add all key systems to our request list since we have yet to select a key system\n for (let i = 0; i < supportedKs.length; i++) {\n const keySystemConfiguration = _getKeySystemConfiguration(supportedKs[i]);\n requestedKeySystems.push({\n ks: supportedKs[i].ks,\n configs: [keySystemConfiguration],\n protData: supportedKs[i].protData\n });\n }\n\n let keySystemAccess;\n\n protectionModel.requestKeySystemAccess(requestedKeySystems)\n .then((event) => {\n keySystemAccess = event.data;\n let selectedSystemString = keySystemAccess.mksa && keySystemAccess.mksa.selectedSystemString ? keySystemAccess.mksa.selectedSystemString : keySystemAccess.keySystem.systemString;\n logger.info('DRM: KeySystem Access Granted for system string (' + selectedSystemString + ')! Selecting key system...');\n return protectionModel.selectKeySystem(keySystemAccess);\n })\n .then((keySystem) => {\n selectedKeySystem = keySystem;\n keySystemSelectionInProgress = false;\n\n if (!protectionModel) {\n return;\n }\n\n eventBus.trigger(events.KEY_SYSTEM_SELECTED, { data: keySystemAccess });\n\n // Set server certificate from protData\n const protData = _getProtDataForKeySystem(selectedKeySystem);\n if (protData && protData.serverCertificate && protData.serverCertificate.length > 0) {\n protectionModel.setServerCertificate(BASE64.decodeArray(protData.serverCertificate).buffer);\n }\n\n _handleKeySessions();\n })\n .catch((event) => {\n selectedKeySystem = null;\n keySystemSelectionInProgress = false;\n if (!fromManifest) {\n eventBus.trigger(events.KEY_SYSTEM_SELECTED, {\n data: null,\n error: new DashJSError(ProtectionErrors.KEY_SYSTEM_ACCESS_DENIED_ERROR_CODE, ProtectionErrors.KEY_SYSTEM_ACCESS_DENIED_ERROR_MESSAGE + 'Error selecting key system! -- ' + event.error)\n });\n }\n })\n }\n }\n\n /**\n * If we have already selected a key system we only need to create a new key session and issue a new license request if the init data has changed.\n * @private\n */\n function _handleKeySessions() {\n // Create key sessions for the different AdaptationSets\n let ksIdx;\n for (let i = 0; i < pendingKeySessionsToHandle.length; i++) {\n for (ksIdx = 0; ksIdx < pendingKeySessionsToHandle[i].length; ksIdx++) {\n if (selectedKeySystem === pendingKeySessionsToHandle[i][ksIdx].ks) {\n const current = pendingKeySessionsToHandle[i][ksIdx]\n _loadOrCreateKeySession(current)\n break;\n }\n }\n }\n pendingKeySessionsToHandle = [];\n }\n\n /**\n * Loads an existing key session if we already have a session id. Otherwise we create a new key session\n * @param {object} keySystemInfo\n * @private\n */\n function _loadOrCreateKeySession(keySystemInfo) {\n // Clearkey\n if (protectionKeyController.isClearKey(selectedKeySystem)) {\n // For Clearkey: if parameters for generating init data was provided by the user, use them for generating\n // initData and overwrite possible initData indicated in encrypted event (EME)\n if (keySystemInfo.protData && keySystemInfo.protData.hasOwnProperty('clearkeys') && Object.keys(keySystemInfo.protData.clearkeys).length !== 0) {\n const initData = { kids: Object.keys(keySystemInfo.protData.clearkeys) };\n keySystemInfo.initData = new TextEncoder().encode(JSON.stringify(initData));\n }\n }\n\n // Reuse existing KeySession\n if (keySystemInfo.sessionId) {\n // Load MediaKeySession with sessionId\n loadKeySession(keySystemInfo);\n }\n\n // Create a new KeySession\n else if (keySystemInfo.initData !== null) {\n // Create new MediaKeySession with initData\n createKeySession(keySystemInfo);\n }\n }\n\n /**\n * Loads a key session with the given session ID from persistent storage. This essentially creates a new key session\n *\n * @param {object} ksInfo\n * @memberof module:ProtectionController\n * @instance\n * @fires ProtectionController#KeySessionCreated\n * @ignore\n */\n function loadKeySession(keySystemInfo) {\n checkConfig();\n protectionModel.loadKeySession(keySystemInfo);\n }\n\n /**\n * Create a new key session associated with the given initialization data from the MPD or from the PSSH box in the media\n * For the latest version of the EME a request is generated. Once this request is ready we get notified via the INTERNAL_KEY_MESSAGE event\n * @param {ArrayBuffer} initData the initialization data\n * @param {Uint8Array} cdmData the custom data to provide to licenser\n * @memberof module:ProtectionController\n * @instance\n * @fires ProtectionController#KeySessionCreated\n * @ignore\n */\n function createKeySession(keySystemInfo) {\n const initDataForKS = CommonEncryption.getPSSHForKeySystem(selectedKeySystem, keySystemInfo ? keySystemInfo.initData : null);\n\n if (initDataForKS) {\n\n // Check for duplicate key id\n if (_isKeyIdDuplicate(keySystemInfo.keyId)) {\n return;\n }\n\n // Check for duplicate initData\n if (_isInitDataDuplicate(initDataForKS)) {\n return;\n }\n\n try {\n keySystemInfo.initData = initDataForKS;\n protectionModel.createKeySession(keySystemInfo);\n } catch (error) {\n eventBus.trigger(events.KEY_SESSION_CREATED, {\n data: null,\n error: new DashJSError(ProtectionErrors.KEY_SESSION_CREATED_ERROR_CODE, ProtectionErrors.KEY_SESSION_CREATED_ERROR_MESSAGE + error.message)\n });\n }\n } else if (keySystemInfo && keySystemInfo.initData) {\n protectionModel.createKeySession(keySystemInfo);\n } else {\n eventBus.trigger(events.KEY_SESSION_CREATED, {\n data: null,\n error: new DashJSError(ProtectionErrors.KEY_SESSION_CREATED_ERROR_CODE, ProtectionErrors.KEY_SESSION_CREATED_ERROR_MESSAGE + 'Selected key system is ' + (selectedKeySystem ? selectedKeySystem.systemString : null) + '. needkey/encrypted event contains no initData corresponding to that key system!')\n });\n }\n }\n\n /**\n * Returns the protectionData for a specific keysystem as specified by the application.\n * @param {object} keySystem\n * @return {object | null}\n * @private\n */\n function _getProtDataForKeySystem(keySystem) {\n if (keySystem) {\n const keySystemString = keySystem.systemString;\n\n if (protDataSet) {\n return (keySystemString in protDataSet) ? protDataSet[keySystemString] : null;\n }\n }\n return null;\n }\n\n /**\n * Removes all entries from the mediaInfoArr\n */\n function clearMediaInfoArray() {\n mediaInfoArr = [];\n }\n\n /**\n * Returns a set of supported key systems and CENC initialization data\n * from the given array of ContentProtection elements. Only\n * key systems that are supported by this player will be returned.\n * Key systems are returned in priority order (highest first).\n *\n * @param {Array.<Object>} cps - array of content protection elements parsed\n * from the manifest\n * @returns {Array.<Object>} array of objects indicating which supported key\n * systems were found. Empty array is returned if no\n * supported key systems were found\n * @memberof module:ProtectionKeyController\n * @instance\n * @ignore\n */\n function getSupportedKeySystemsFromContentProtection(cps) {\n checkConfig();\n return protectionKeyController.getSupportedKeySystemsFromContentProtection(cps, protDataSet, sessionType);\n }\n\n /**\n * Checks if a session has already created for the provided key id\n * @param {string} keyId\n * @return {boolean}\n * @private\n */\n function _isKeyIdDuplicate(keyId) {\n\n if (!keyId) {\n return false;\n }\n\n try {\n const sessions = protectionModel.getSessions();\n for (let i = 0; i < sessions.length; i++) {\n if (sessions[i].getKeyId() === keyId) {\n return true;\n }\n }\n return false;\n } catch (e) {\n return false;\n }\n }\n\n /**\n * Checks if the provided init data is equal to one of the existing init data values\n * @param {any} initDataForKS\n * @return {boolean}\n * @private\n */\n function _isInitDataDuplicate(initDataForKS) {\n\n if (!initDataForKS) {\n return false;\n }\n\n try {\n const currentInitData = protectionModel.getAllInitData();\n for (let i = 0; i < currentInitData.length; i++) {\n if (protectionKeyController.initDataEquals(initDataForKS, currentInitData[i])) {\n logger.debug('DRM: Ignoring initData because we have already seen it!');\n return true;\n }\n }\n\n return false;\n } catch (e) {\n return false;\n }\n }\n\n /**\n * Removes the given key session from persistent storage and closes the session\n * as if {@link ProtectionController#closeKeySession}\n * was called\n *\n * @param {SessionToken} sessionToken the session\n * token\n * @memberof module:ProtectionController\n * @instance\n * @fires ProtectionController#KeySessionRemoved\n * @fires ProtectionController#KeySessionClosed\n * @ignore\n */\n function removeKeySession(sessionToken) {\n checkConfig();\n protectionModel.removeKeySession(sessionToken);\n }\n\n /**\n * Closes the key session and releases all associated decryption keys. These\n * keys will no longer be available for decrypting media\n *\n * @param {SessionToken} sessionToken the session\n * token\n * @memberof module:ProtectionController\n * @instance\n * @fires ProtectionController#KeySessionClosed\n * @ignore\n */\n function closeKeySession(sessionToken) {\n checkConfig();\n protectionModel.closeKeySession(sessionToken);\n }\n\n /**\n * Sets a server certificate for use by the CDM when signing key messages\n * intended for a particular license server. This will fire\n * an error event if a key system has not yet been selected.\n *\n * @param {ArrayBuffer} serverCertificate a CDM-specific license server\n * certificate\n * @memberof module:ProtectionController\n * @instance\n * @fires ProtectionController#ServerCertificateUpdated\n */\n function setServerCertificate(serverCertificate) {\n checkConfig();\n protectionModel.setServerCertificate(serverCertificate);\n }\n\n /**\n * Associate this protection system with the given HTMLMediaElement. This\n * causes the system to register for needkey/encrypted events from the given\n * element and provides a destination for setting of MediaKeys\n *\n * @param {HTMLMediaElement} element the media element to which the protection\n * system should be associated\n * @memberof module:ProtectionController\n * @instance\n */\n function setMediaElement(element) {\n checkConfig();\n if (element) {\n protectionModel.setMediaElement(element);\n eventBus.on(events.NEED_KEY, _onNeedKey, instance);\n } else if (element === null) {\n protectionModel.setMediaElement(element);\n eventBus.off(events.NEED_KEY, _onNeedKey, instance);\n }\n }\n\n /**\n * Sets the session type to use when creating key sessions. Either \"temporary\" or\n * \"persistent-license\". Default is \"temporary\".\n *\n * @param {string} value the session type\n * @memberof module:ProtectionController\n * @instance\n */\n function setSessionType(value) {\n sessionType = value;\n }\n\n /**\n * Sets the robustness level for video and audio capabilities. Optional to remove Chrome warnings.\n * Possible values are SW_SECURE_CRYPTO, SW_SECURE_DECODE, HW_SECURE_CRYPTO, HW_SECURE_CRYPTO, HW_SECURE_DECODE, HW_SECURE_ALL.\n *\n * @param {string} level the robustness level\n * @memberof module:ProtectionController\n * @instance\n */\n function setRobustnessLevel(level) {\n robustnessLevel = level;\n }\n\n /**\n * Attach KeySystem-specific data to use for license acquisition with EME\n *\n * @param {Object} data an object containing property names corresponding to\n * key system name strings (e.g. \"org.w3.clearkey\") and associated values\n * being instances of {@link ProtectionData}\n * @memberof module:ProtectionController\n * @instance\n * @ignore\n */\n function setProtectionData(data) {\n protDataSet = data;\n protectionKeyController.setProtectionData(data);\n }\n\n /**\n * Stop method is called when current playback is stopped/resetted.\n *\n * @memberof module:ProtectionController\n * @instance\n */\n function stop() {\n _abortLicenseRequest();\n if (protectionModel) {\n protectionModel.stop();\n }\n }\n\n /**\n * Destroys all protection data associated with this protection set. This includes\n * deleting all key sessions. In the case of persistent key sessions, the sessions\n * will simply be unloaded and not deleted. Additionally, if this protection set is\n * associated with a HTMLMediaElement, it will be detached from that element.\n *\n * @memberof module:ProtectionController\n * @instance\n * @ignore\n */\n function reset() {\n eventBus.off(events.INTERNAL_KEY_MESSAGE, _onKeyMessage, instance);\n eventBus.off(events.INTERNAL_KEY_STATUS_CHANGED, _onKeyStatusChanged, instance);\n\n checkConfig();\n\n _abortLicenseRequest();\n\n setMediaElement(null);\n\n selectedKeySystem = null;\n keySystemSelectionInProgress = false;\n\n if (protectionModel) {\n protectionModel.reset();\n protectionModel = null;\n }\n\n needkeyRetries.forEach(retryTimeout => clearTimeout(retryTimeout));\n needkeyRetries = [];\n\n mediaInfoArr = [];\n pendingKeySessionsToHandle = [];\n }\n\n /**\n * Returns an object corresponding to the EME MediaKeySystemConfiguration dictionary\n * @param {object} keySystem\n * @return {KeySystemConfiguration}\n * @private\n */\n function _getKeySystemConfiguration(keySystemData) {\n const protData = keySystemData.protData;\n const audioCapabilities = [];\n const videoCapabilities = [];\n const audioRobustness = (protData && protData.audioRobustness && protData.audioRobustness.length > 0) ? protData.audioRobustness : robustnessLevel;\n const videoRobustness = (protData && protData.videoRobustness && protData.videoRobustness.length > 0) ? protData.videoRobustness : robustnessLevel;\n const ksSessionType = keySystemData.sessionType;\n const distinctiveIdentifier = (protData && protData.distinctiveIdentifier) ? protData.distinctiveIdentifier : 'optional';\n const persistentState = (protData && protData.persistentState) ? protData.persistentState : (ksSessionType === 'temporary') ? 'optional' : 'required';\n\n mediaInfoArr.forEach((media) => {\n if (media.type === constants.AUDIO) {\n audioCapabilities.push(new MediaCapability(media.codec, audioRobustness));\n } else if (media.type === constants.VIDEO) {\n videoCapabilities.push(new MediaCapability(media.codec, videoRobustness));\n }\n });\n\n return new KeySystemConfiguration(\n audioCapabilities, videoCapabilities, distinctiveIdentifier,\n persistentState,\n [ksSessionType]);\n }\n\n /**\n * Event handler for when the status of the key has changed\n * @param {object} e\n * @private\n */\n function _onKeyStatusChanged(e) {\n if (e.error) {\n eventBus.trigger(events.KEY_STATUSES_CHANGED, { data: null, error: e.error });\n } else {\n logger.debug('DRM: key status = ' + e.status);\n }\n }\n\n /**\n * Event handler for the key message event. Once we have a key message we can issue a license request\n * @param {object} e\n * @private\n */\n function _onKeyMessage(e) {\n logger.debug('DRM: onKeyMessage');\n\n // Dispatch event to applications indicating we received a key message\n const keyMessage = e.data;\n eventBus.trigger(events.KEY_MESSAGE, { data: keyMessage });\n const messageType = (keyMessage.messageType) ? keyMessage.messageType : 'license-request';\n const message = keyMessage.message;\n const sessionToken = keyMessage.sessionToken;\n const protData = _getProtDataForKeySystem(selectedKeySystem);\n const licenseServerModelInstance = protectionKeyController.getLicenseServerModelInstance(selectedKeySystem, protData, messageType);\n const eventData = { sessionToken: sessionToken, messageType: messageType };\n\n // Ensure message from CDM is not empty\n if (!message || message.byteLength === 0) {\n _sendLicenseRequestCompleteEvent(eventData, new DashJSError(ProtectionErrors.MEDIA_KEY_MESSAGE_NO_CHALLENGE_ERROR_CODE, ProtectionErrors.MEDIA_KEY_MESSAGE_NO_CHALLENGE_ERROR_MESSAGE));\n return;\n }\n\n // Message not destined for license server\n if (!licenseServerModelInstance) {\n logger.debug('DRM: License server request not required for this message (type = ' + e.data.messageType + '). Session ID = ' + sessionToken.getSessionId());\n _sendLicenseRequestCompleteEvent(eventData);\n return;\n }\n\n // Perform any special handling for ClearKey\n if (protectionKeyController.isClearKey(selectedKeySystem)) {\n const clearkeys = protectionKeyController.processClearKeyLicenseRequest(selectedKeySystem, protData, message);\n if (clearkeys && clearkeys.keyPairs && clearkeys.keyPairs.length > 0) {\n logger.debug('DRM: ClearKey license request handled by application!');\n _sendLicenseRequestCompleteEvent(eventData);\n protectionModel.updateKeySession(sessionToken, clearkeys);\n return;\n }\n }\n\n // In all other cases we have to make a license request\n _issueLicenseRequest(keyMessage, licenseServerModelInstance, protData);\n }\n\n /**\n * Notify other classes that the license request was completed\n * @param {object} data\n * @param {object} error\n * @private\n */\n function _sendLicenseRequestCompleteEvent(data, error) {\n eventBus.trigger(events.LICENSE_REQUEST_COMPLETE, { data: data, error: error });\n }\n\n /**\n * Start issuing a license request\n * @param {object} keyMessage\n * @param {object} licenseServerData\n * @param {object} protData\n * @private\n */\n function _issueLicenseRequest(keyMessage, licenseServerData, protData) {\n const sessionToken = keyMessage.sessionToken;\n const messageType = (keyMessage.messageType) ? keyMessage.messageType : 'license-request';\n const eventData = { sessionToken: sessionToken, messageType: messageType };\n const keySystemString = selectedKeySystem ? selectedKeySystem.systemString : null;\n\n // Determine license server URL\n let url = _getLicenseServerUrl(protData, messageType, sessionToken, keyMessage, licenseServerData);\n\n // Ensure valid license server URL\n if (!url) {\n _sendLicenseRequestCompleteEvent(eventData, new DashJSError(ProtectionErrors.MEDIA_KEY_MESSAGE_NO_LICENSE_SERVER_URL_ERROR_CODE, ProtectionErrors.MEDIA_KEY_MESSAGE_NO_LICENSE_SERVER_URL_ERROR_MESSAGE));\n return;\n }\n\n // Set optional XMLHttpRequest headers from protection data and message\n const reqHeaders = {};\n let withCredentials = false;\n if (protData) {\n _updateHeaders(reqHeaders, protData.httpRequestHeaders);\n }\n const message = keyMessage.message;\n const headersFromMessage = selectedKeySystem.getRequestHeadersFromMessage(message);\n _updateHeaders(reqHeaders, headersFromMessage);\n\n Object.keys(reqHeaders).forEach((key) => {\n if ('authorization' === key.toLowerCase()) {\n withCredentials = true;\n }\n });\n\n // Overwrite withCredentials property from protData if present\n if (protData && typeof protData.withCredentials == 'boolean') {\n withCredentials = protData.withCredentials;\n }\n\n const onLoad = function (xhr) {\n if (!protectionModel) {\n return;\n }\n\n if (xhr.status >= 200 && xhr.status <= 299) {\n const responseHeaders = Utils.parseHttpHeaders(xhr.getAllResponseHeaders ? xhr.getAllResponseHeaders() : null);\n let licenseResponse = new LicenseResponse(xhr.responseURL, responseHeaders, xhr.response);\n const licenseResponseFilters = customParametersModel.getLicenseResponseFilters();\n _applyFilters(licenseResponseFilters, licenseResponse)\n .then(() => {\n const licenseMessage = licenseServerData.getLicenseMessage(licenseResponse.data, keySystemString, messageType);\n if (licenseMessage !== null) {\n _sendLicenseRequestCompleteEvent(eventData);\n protectionModel.updateKeySession(sessionToken, licenseMessage);\n } else {\n _reportError(xhr, eventData, keySystemString, messageType, licenseServerData);\n }\n });\n } else {\n _reportError(xhr, eventData, keySystemString, messageType, licenseServerData);\n }\n };\n\n const onAbort = function (xhr) {\n _sendLicenseRequestCompleteEvent(eventData, new DashJSError(ProtectionErrors.MEDIA_KEY_MESSAGE_LICENSER_ERROR_CODE,\n ProtectionErrors.MEDIA_KEY_MESSAGE_LICENSER_ERROR_MESSAGE + keySystemString + ' update, XHR aborted. status is \"' +\n xhr.statusText + '\" (' + xhr.status + '), readyState is ' + xhr.readyState));\n };\n\n const onError = function (xhr) {\n _sendLicenseRequestCompleteEvent(eventData, new DashJSError(ProtectionErrors.MEDIA_KEY_MESSAGE_LICENSER_ERROR_CODE,\n ProtectionErrors.MEDIA_KEY_MESSAGE_LICENSER_ERROR_MESSAGE + keySystemString + ' update, XHR error. status is \"' +\n xhr.statusText + '\" (' + xhr.status + '), readyState is ' + xhr.readyState));\n };\n\n const reqPayload = selectedKeySystem.getLicenseRequestFromMessage(message);\n const reqMethod = licenseServerData.getHTTPMethod(messageType);\n const responseType = licenseServerData.getResponseType(keySystemString, messageType);\n const timeout = protData && !isNaN(protData.httpTimeout) ? protData.httpTimeout : LICENSE_SERVER_REQUEST_DEFAULT_TIMEOUT;\n const sessionId = sessionToken.getSessionId() || null;\n\n let licenseRequest = new LicenseRequest(url, reqMethod, responseType, reqHeaders, withCredentials, messageType, sessionId, reqPayload);\n const retryAttempts = !isNaN(settings.get().streaming.retryAttempts[HTTPRequest.LICENSE]) ? settings.get().streaming.retryAttempts[HTTPRequest.LICENSE] : LICENSE_SERVER_REQUEST_RETRIES;\n const licenseRequestFilters = customParametersModel.getLicenseRequestFilters();\n _applyFilters(licenseRequestFilters, licenseRequest)\n .then(() => {\n _doLicenseRequest(licenseRequest, retryAttempts, timeout, onLoad, onAbort, onError);\n });\n }\n\n /**\n * Implement license requests with a retry mechanism to avoid temporary network issues to affect playback experience\n * @param {object} request\n * @param {number} retriesCount\n * @param {number} timeout\n * @param {function} onLoad\n * @param {function} onAbort\n * @param {function} onError\n * @private\n */\n function _doLicenseRequest(request, retriesCount, timeout, onLoad, onAbort, onError) {\n const xhr = new XMLHttpRequest();\n\n if (settings.get().streaming.cmcd && settings.get().streaming.cmcd.enabled) {\n const cmcdMode = settings.get().streaming.cmcd.mode;\n if (cmcdMode === Constants.CMCD_MODE_QUERY) {\n const cmcdParams = cmcdModel.getQueryParameter({\n url: request.url,\n type: HTTPRequest.LICENSE\n });\n\n if (cmcdParams) {\n request.url = Utils.addAditionalQueryParameterToUrl(request.url, [cmcdParams]);\n }\n }\n }\n\n xhr.open(request.method, request.url, true);\n xhr.responseType = request.responseType;\n xhr.withCredentials = request.withCredentials;\n if (timeout > 0) {\n xhr.timeout = timeout;\n }\n for (const key in request.headers) {\n xhr.setRequestHeader(key, request.headers[key]);\n }\n\n if (settings.get().streaming.cmcd && settings.get().streaming.cmcd.enabled) {\n const cmcdMode = settings.get().streaming.cmcd.mode;\n if (cmcdMode === Constants.CMCD_MODE_HEADER) {\n const cmcdHeaders = cmcdModel.getHeaderParameters({\n url: request.url,\n type: HTTPRequest.LICENSE\n });\n\n if (cmcdHeaders) {\n for (const header in cmcdHeaders) {\n let value = cmcdHeaders[header];\n if (value) {\n xhr.setRequestHeader(header, value);\n }\n }\n }\n }\n }\n\n const _retryRequest = function () {\n // fail silently and retry\n retriesCount--;\n const retryInterval = !isNaN(settings.get().streaming.retryIntervals[HTTPRequest.LICENSE]) ? settings.get().streaming.retryIntervals[HTTPRequest.LICENSE] : LICENSE_SERVER_REQUEST_RETRY_INTERVAL;\n licenseRequestRetryTimeout = setTimeout(function () {\n _doLicenseRequest(request, retriesCount, timeout, onLoad, onAbort, onError);\n }, retryInterval);\n };\n\n xhr.onload = function () {\n licenseXhrRequest = null;\n if (this.status >= 200 && this.status <= 299 || retriesCount <= 0) {\n onLoad(this);\n } else {\n logger.warn('License request failed (' + this.status + '). Retrying it... Pending retries: ' + retriesCount);\n _retryRequest();\n }\n };\n\n xhr.ontimeout = xhr.onerror = function () {\n licenseXhrRequest = null;\n if (retriesCount <= 0) {\n onError(this);\n } else {\n logger.warn('License request network request failed . Retrying it... Pending retries: ' + retriesCount);\n _retryRequest();\n }\n };\n\n xhr.onabort = function () {\n onAbort(this);\n };\n\n // deprecated, to be removed\n eventBus.trigger(events.LICENSE_REQUEST_SENDING, {\n url: request.url,\n headers: request.headers,\n payload: request.data,\n sessionId: request.sessionId\n });\n\n licenseXhrRequest = xhr;\n xhr.send(request.data);\n }\n\n /**\n * Aborts license request\n * @private\n */\n function _abortLicenseRequest() {\n if (licenseXhrRequest) {\n licenseXhrRequest.onloadend = licenseXhrRequest.onerror = licenseXhrRequest.onprogress = undefined; //Ignore events from aborted requests.\n licenseXhrRequest.abort();\n licenseXhrRequest = null;\n }\n\n if (licenseRequestRetryTimeout) {\n clearTimeout(licenseRequestRetryTimeout);\n licenseRequestRetryTimeout = null;\n }\n }\n\n /**\n * Returns the url of the license server\n * @param {object} protData\n * @param {string} messageType\n * @param {object} sessionToken\n * @param {object} keyMessage\n * @param {object} licenseServerData\n * @return {*}\n * @private\n */\n function _getLicenseServerUrl(protData, messageType, sessionToken, keyMessage, licenseServerData) {\n let url = null;\n const message = keyMessage.message;\n\n // Check if the url is defined by the application\n if (protData && protData.serverURL) {\n const serverURL = protData.serverURL;\n if (typeof serverURL === 'string' && serverURL !== '') {\n url = serverURL;\n } else if (typeof serverURL === 'object' && serverURL.hasOwnProperty(messageType)) {\n url = serverURL[messageType];\n }\n }\n\n // This is the old way of providing the url\n else if (protData && protData.laURL && protData.laURL !== '') {\n url = protData.laURL;\n }\n\n // No url provided by the app. Check the manifest and the pssh\n else {\n // Check for url defined in the manifest\n url = CommonEncryption.getLicenseServerUrlFromMediaInfo(mediaInfoArr, selectedKeySystem.schemeIdURI);\n\n // In case we are not using Clearky we can still get a url from the pssh.\n if (!url && !protectionKeyController.isClearKey(selectedKeySystem)) {\n const psshData = CommonEncryption.getPSSHData(sessionToken.initData);\n url = selectedKeySystem.getLicenseServerURLFromInitData(psshData);\n\n // Still no url, check the keymessage\n if (!url) {\n url = keyMessage.laURL;\n }\n }\n }\n // Possibly update or override the URL based on the message\n url = licenseServerData.getServerURLFromMessage(url, message, messageType);\n\n return url;\n }\n\n /**\n * Add new headers to the existing ones\n * @param {array} reqHeaders\n * @param {object} headers\n * @private\n */\n function _updateHeaders(reqHeaders, headers) {\n if (headers) {\n for (const key in headers) {\n reqHeaders[key] = headers[key];\n }\n }\n }\n\n /**\n * Reports an error that might have occured during the license request\n * @param {object} xhr\n * @param {object} eventData\n * @param {string} keySystemString\n * @param {string} messageType\n * @param {object} licenseServerData\n * @private\n */\n function _reportError(xhr, eventData, keySystemString, messageType, licenseServerData) {\n let errorMsg = 'NONE';\n let data = null;\n\n if (xhr.response) {\n errorMsg = licenseServerData.getErrorResponse(xhr.response, keySystemString, messageType);\n data = {\n serverResponse: xhr.response || null,\n responseCode: xhr.status || null,\n responseText: xhr.statusText || null\n }\n }\n\n _sendLicenseRequestCompleteEvent(eventData, new DashJSError(ProtectionErrors.MEDIA_KEY_MESSAGE_LICENSER_ERROR_CODE,\n ProtectionErrors.MEDIA_KEY_MESSAGE_LICENSER_ERROR_MESSAGE + keySystemString + ' update, XHR complete. status is \"' +\n xhr.statusText + '\" (' + xhr.status + '), readyState is ' + xhr.readyState + '. Response is ' + errorMsg,\n data\n ));\n }\n\n /**\n * Applies custom filters defined by the application\n * @param {array} filters\n * @param {object} param\n * @return {Promise<void>|*}\n * @private\n */\n function _applyFilters(filters, param) {\n if (!filters) return Promise.resolve();\n return filters.reduce((prev, next) => {\n return prev.then(() => {\n return next(param);\n });\n }, Promise.resolve());\n }\n\n /**\n * Event handler for \"needkey\" and \"encrypted\" events\n * @param {object} event\n * @param {number} retry\n * @private\n */\n function _onNeedKey(event, retry) {\n if (!settings.get().streaming.protection.ignoreEmeEncryptedEvent) {\n logger.debug('DRM: onNeedKey');\n\n // Ignore non-cenc initData\n if (event.key.initDataType !== 'cenc') {\n logger.warn('DRM: Only \\'cenc\\' initData is supported! Ignoring initData of type: ' + event.key.initDataType);\n return;\n }\n\n if (mediaInfoArr.length === 0) {\n logger.warn('DRM: onNeedKey called before initializeForMedia, wait until initialized');\n retry = typeof retry === 'undefined' ? 1 : retry + 1;\n if (retry < NEEDKEY_BEFORE_INITIALIZE_RETRIES) {\n needkeyRetries.push(setTimeout(() => {\n _onNeedKey(event, retry);\n }, NEEDKEY_BEFORE_INITIALIZE_TIMEOUT));\n return;\n }\n }\n\n // Some browsers return initData as Uint8Array (IE), some as ArrayBuffer (Chrome).\n // Convert to ArrayBuffer\n let abInitData = event.key.initData;\n if (ArrayBuffer.isView(abInitData)) {\n abInitData = abInitData.buffer;\n }\n\n // If key system has already been selected and initData already seen, then do nothing\n if (selectedKeySystem) {\n const initDataForKS = CommonEncryption.getPSSHForKeySystem(selectedKeySystem, abInitData);\n if (initDataForKS) {\n // Check for duplicate initData\n if (_isInitDataDuplicate(initDataForKS)) {\n return;\n }\n }\n }\n\n logger.debug('DRM: initData:', String.fromCharCode.apply(null, new Uint8Array(abInitData)));\n\n const supportedKs = protectionKeyController.getSupportedKeySystemsFromSegmentPssh(abInitData, protDataSet, sessionType);\n if (supportedKs.length === 0) {\n logger.debug('DRM: Received needkey event with initData, but we don\\'t support any of the key systems!');\n return;\n }\n\n _handleKeySystemFromPssh(supportedKs);\n }\n }\n\n /**\n * Returns all available key systems\n * @return {array}\n */\n function getKeySystems() {\n return protectionKeyController ? protectionKeyController.getKeySystems() : [];\n }\n\n /**\n * Sets all available key systems\n * @param {array} keySystems\n */\n function setKeySystems(keySystems) {\n if (protectionKeyController) {\n protectionKeyController.setKeySystems(keySystems);\n }\n }\n\n instance = {\n initializeForMedia,\n clearMediaInfoArray,\n handleKeySystemFromManifest,\n createKeySession,\n loadKeySession,\n removeKeySession,\n closeKeySession,\n setServerCertificate,\n setMediaElement,\n setSessionType,\n setRobustnessLevel,\n setProtectionData,\n getSupportedKeySystemsFromContentProtection,\n getKeySystems,\n setKeySystems,\n stop,\n reset\n };\n\n setup();\n return instance;\n}\n\nProtectionController.__dashjs_factory_name = 'ProtectionController';\nexport default FactoryMaker.getClassFactory(ProtectionController); /* jshint ignore:line */\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @classdesc Represents a 128-bit keyID and 128-bit encryption key\n * @ignore\n */\nclass KeyPair {\n /**\n * @param {string} keyID 128-bit key ID, base64 encoded, with no padding\n * @param {string} key 128-bit encryption key, base64 encoded, with no padding\n * @class\n * @ignore\n */\n constructor(keyID, key) {\n this.keyID = keyID;\n this.key = key;\n }\n}\n\nexport default KeyPair;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n * @classdesc A collection of ClearKey encryption keys with an (optional) associated\n * type\n * @ignore\n */\nclass ClearKeyKeySet {\n /**\n * @param {Array.<KeyPair>} keyPairs\n * @param {string} type the type of keys in this set. One of either 'persistent'\n * or 'temporary'. Can also be null or undefined.\n * @class\n * @ignore\n */\n constructor(keyPairs, type) {\n if (type && type !== 'persistent' && type !== 'temporary')\n throw new Error('Invalid ClearKey key set type! Must be one of \\'persistent\\' or \\'temporary\\'');\n this.keyPairs = keyPairs;\n this.type = type;\n }\n\n /**\n * Convert this key set to its JSON Web Key (JWK) representation\n *\n * @return {ArrayBuffer} JWK object UTF-8 encoded as ArrayBuffer\n */\n toJWK() {\n let i;\n let numKeys = this.keyPairs.length;\n let jwk = {keys: []};\n\n for (i = 0; i < numKeys; i++) {\n let key = {\n kty: 'oct',\n alg: 'A128KW',\n kid: this.keyPairs[i].keyID,\n k: this.keyPairs[i].key\n };\n jwk.keys.push(key);\n }\n if (this.type) {\n jwk.type = this.type;\n }\n let jwkString = JSON.stringify(jwk);\n const len = jwkString.length;\n\n // Convert JSON string to ArrayBuffer\n let buf = new ArrayBuffer(len);\n let bView = new Uint8Array(buf);\n for (i = 0; i < len; i++)\n bView[i] = jwkString.charCodeAt(i);\n return buf;\n }\n}\n\nexport default ClearKeyKeySet;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n * Protection Constants declaration\n * @class\n * @ignore\n */\nclass ProtectionConstants {\n\n init () {\n this.CLEARKEY_KEYSTEM_STRING = 'org.w3.clearkey';\n this.WIDEVINE_KEYSTEM_STRING = 'com.widevine.alpha';\n this.PLAYREADY_KEYSTEM_STRING = 'com.microsoft.playready';\n this.PLAYREADY_RECOMMENDATION_KEYSTEM_STRING = 'com.microsoft.playready.recommendation';\n this.INITIALIZATION_DATA_TYPE_CENC = 'cenc';\n this.INITIALIZATION_DATA_TYPE_KEYIDS = 'keyids'\n this.INITIALIZATION_DATA_TYPE_WEBM = 'webm'\n }\n\n constructor () {\n this.init();\n }\n}\n\nlet constants = new ProtectionConstants();\nexport default constants;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport KeyPair from '../vo/KeyPair';\nimport ClearKeyKeySet from '../vo/ClearKeyKeySet';\nimport CommonEncryption from '../CommonEncryption';\nimport ProtectionConstants from '../../constants/ProtectionConstants';\n\nconst uuid = 'e2719d58-a985-b3c9-781a-b030af78d30e';\nconst systemString = ProtectionConstants.CLEARKEY_KEYSTEM_STRING;\nconst schemeIdURI = 'urn:uuid:' + uuid;\n\nfunction KeySystemClearKey(config) {\n\n config = config || {};\n let instance;\n const BASE64 = config.BASE64;\n\n /**\n * Returns desired clearkeys (as specified in the CDM message) from protection data\n *\n * @param {ProtectionData} protectionData the protection data\n * @param {ArrayBuffer} message the ClearKey CDM message\n * @returns {ClearKeyKeySet} the key set or null if none found\n * @throws {Error} if a keyID specified in the CDM message was not found in the\n * protection data\n * @memberof KeySystemClearKey\n */\n function getClearKeysFromProtectionData(protectionData, message) {\n let clearkeySet = null;\n if (protectionData) {\n // ClearKey is the only system that does not require a license server URL, so we\n // handle it here when keys are specified in protection data\n const jsonMsg = JSON.parse(String.fromCharCode.apply(null, new Uint8Array(message)));\n const keyPairs = [];\n for (let i = 0; i < jsonMsg.kids.length; i++) {\n const clearkeyID = jsonMsg.kids[i];\n const clearkey = (protectionData.clearkeys && protectionData.clearkeys.hasOwnProperty(clearkeyID)) ? protectionData.clearkeys[clearkeyID] : null;\n if (!clearkey) {\n throw new Error('DRM: ClearKey keyID (' + clearkeyID + ') is not known!');\n }\n // KeyIDs from CDM are not base64 padded. Keys may or may not be padded\n keyPairs.push(new KeyPair(clearkeyID, clearkey));\n }\n clearkeySet = new ClearKeyKeySet(keyPairs);\n }\n return clearkeySet;\n }\n\n function getInitData(cp, cencContentProtection) {\n try {\n let initData = CommonEncryption.parseInitDataFromContentProtection(cp, BASE64);\n\n if (!initData && cencContentProtection) {\n const cencDefaultKid = cencDefaultKidToBase64Representation(cencContentProtection['cenc:default_KID']);\n const data = { kids: [cencDefaultKid] };\n initData = new TextEncoder().encode(JSON.stringify(data));\n }\n\n return initData;\n } catch (e) {\n return null;\n }\n }\n\n function cencDefaultKidToBase64Representation(cencDefaultKid) {\n try {\n let kid = cencDefaultKid.replace(/-/g, '');\n kid = btoa(kid.match(/\\w{2}/g).map((a) => {\n return String.fromCharCode(parseInt(a, 16));\n }).join(''));\n return kid.replace(/=/g, '')\n .replace(/\\//g, '_')\n .replace(/\\+/g, '-');\n } catch (e) {\n return null;\n }\n }\n\n function getRequestHeadersFromMessage(/*message*/) {\n // Set content type to application/json by default\n return {\n 'Content-Type': 'application/json'\n };\n }\n\n function getLicenseRequestFromMessage(message) {\n return JSON.stringify(JSON.parse(String.fromCharCode.apply(null, new Uint8Array(message))));\n }\n\n function getLicenseServerURLFromInitData(/*initData*/) {\n return null;\n }\n\n function getCDMData(/*cdmData*/) {\n return null;\n }\n\n instance = {\n uuid,\n schemeIdURI,\n systemString,\n getInitData,\n getRequestHeadersFromMessage,\n getLicenseRequestFromMessage,\n getLicenseServerURLFromInitData,\n getCDMData,\n getClearKeysFromProtectionData\n };\n\n return instance;\n}\n\nKeySystemClearKey.__dashjs_factory_name = 'KeySystemClearKey';\nexport default dashjs.FactoryMaker.getSingletonFactory(KeySystemClearKey); /* jshint ignore:line */\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport KeyPair from '../vo/KeyPair';\nimport ClearKeyKeySet from '../vo/ClearKeyKeySet';\nimport CommonEncryption from '../CommonEncryption';\nimport ProtectionConstants from '../../constants/ProtectionConstants';\n\nconst uuid = '1077efec-c0b2-4d02-ace3-3c1e52e2fb4b';\nconst systemString = ProtectionConstants.CLEARKEY_KEYSTEM_STRING;\nconst schemeIdURI = 'urn:uuid:' + uuid;\n\nfunction KeySystemW3CClearKey(config) {\n let instance;\n const BASE64 = config.BASE64;\n const logger = config.debug.getLogger(instance);\n /**\n * Returns desired clearkeys (as specified in the CDM message) from protection data\n *\n * @param {ProtectionDataSet} protectionData the protection data\n * @param {ArrayBuffer} message the ClearKey CDM message\n * @returns {ClearKeyKeySet} the key set or null if none found\n * @throws {Error} if a keyID specified in the CDM message was not found in the\n * protection data\n * @memberof KeySystemClearKey\n */\n function getClearKeysFromProtectionData(protectionData, message) {\n let clearkeySet = null;\n if (protectionData) {\n // ClearKey is the only system that does not require a license server URL, so we\n // handle it here when keys are specified in protection data\n const jsonMsg = JSON.parse(String.fromCharCode.apply(null, new Uint8Array(message)));\n const keyPairs = [];\n for (let i = 0; i < jsonMsg.kids.length; i++) {\n const clearkeyID = jsonMsg.kids[i];\n const clearkey = (protectionData.clearkeys && protectionData.clearkeys.hasOwnProperty(clearkeyID)) ? protectionData.clearkeys[clearkeyID] : null;\n if (!clearkey) {\n throw new Error('DRM: ClearKey keyID (' + clearkeyID + ') is not known!');\n }\n // KeyIDs from CDM are not base64 padded. Keys may or may not be padded\n keyPairs.push(new KeyPair(clearkeyID, clearkey));\n }\n clearkeySet = new ClearKeyKeySet(keyPairs);\n\n logger.warn('ClearKey schemeIdURI is using W3C Common PSSH systemID (1077efec-c0b2-4d02-ace3-3c1e52e2fb4b) in Content Protection. See DASH-IF IOP v4.1 section 7.6.2.4');\n }\n return clearkeySet;\n }\n\n function getInitData(cp) {\n return CommonEncryption.parseInitDataFromContentProtection(cp, BASE64);\n }\n\n function getRequestHeadersFromMessage(/*message*/) {\n return null;\n }\n\n function getLicenseRequestFromMessage(message) {\n return new Uint8Array(message);\n }\n\n function getLicenseServerURLFromInitData(/*initData*/) {\n return null;\n }\n\n function getCDMData(/*cdmData*/) {\n return null;\n }\n\n instance = {\n uuid: uuid,\n schemeIdURI: schemeIdURI,\n systemString: systemString,\n getInitData: getInitData,\n getRequestHeadersFromMessage: getRequestHeadersFromMessage,\n getLicenseRequestFromMessage: getLicenseRequestFromMessage,\n getLicenseServerURLFromInitData: getLicenseServerURLFromInitData,\n getCDMData: getCDMData,\n getClearKeysFromProtectionData: getClearKeysFromProtectionData\n };\n\n return instance;\n}\n\nKeySystemW3CClearKey.__dashjs_factory_name = 'KeySystemW3CClearKey';\nexport default dashjs.FactoryMaker.getSingletonFactory(KeySystemW3CClearKey); /* jshint ignore:line */\n\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n * Google Widevine DRM\n *\n * @class\n * @implements MediaPlayer.dependencies.protection.KeySystem\n */\n\nimport CommonEncryption from '../CommonEncryption';\nimport ProtectionConstants from '../../constants/ProtectionConstants';\n\nconst uuid = 'edef8ba9-79d6-4ace-a3c8-27dcd51d21ed';\nconst systemString = ProtectionConstants.WIDEVINE_KEYSTEM_STRING;\nconst schemeIdURI = 'urn:uuid:' + uuid;\n\nfunction KeySystemWidevine(config) {\n\n config = config || {};\n let instance;\n const BASE64 = config.BASE64;\n\n function getInitData(cp) {\n return CommonEncryption.parseInitDataFromContentProtection(cp, BASE64);\n }\n\n function getRequestHeadersFromMessage( /*message*/ ) {\n return null;\n }\n\n function getLicenseRequestFromMessage(message) {\n return new Uint8Array(message);\n }\n\n function getLicenseServerURLFromInitData( /*initData*/ ) {\n return null;\n }\n\n function getCDMData(/*cdmData*/) {\n return null;\n }\n\n instance = {\n uuid,\n schemeIdURI,\n systemString,\n getInitData,\n getRequestHeadersFromMessage,\n getLicenseRequestFromMessage,\n getLicenseServerURLFromInitData,\n getCDMData\n };\n\n return instance;\n}\n\nKeySystemWidevine.__dashjs_factory_name = 'KeySystemWidevine';\nexport default dashjs.FactoryMaker.getSingletonFactory(KeySystemWidevine); /* jshint ignore:line */\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n * Microsoft PlayReady DRM\n *\n * @class\n * @implements KeySystem\n */\nimport CommonEncryption from '../CommonEncryption';\nimport ProtectionConstants from '../../constants/ProtectionConstants';\n\nconst uuid = '9a04f079-9840-4286-ab92-e65be0885f95';\nconst systemString = ProtectionConstants.PLAYREADY_KEYSTEM_STRING;\nconst schemeIdURI = 'urn:uuid:' + uuid;\nconst PRCDMData = '<PlayReadyCDMData type=\"LicenseAcquisition\"><LicenseAcquisition version=\"1.0\" Proactive=\"false\"><CustomData encoding=\"base64encoded\">%CUSTOMDATA%</CustomData></LicenseAcquisition></PlayReadyCDMData>';\n\nfunction KeySystemPlayReady(config) {\n\n config = config || {};\n let instance;\n let messageFormat = 'utf-16';\n const BASE64 = config.BASE64;\n const settings = config.settings;\n\n function checkConfig() {\n if (!BASE64 || !BASE64.hasOwnProperty('decodeArray') || !BASE64.hasOwnProperty('decodeArray') ) {\n throw new Error('Missing config parameter(s)');\n }\n }\n\n function getRequestHeadersFromMessage(message) {\n let msg,\n xmlDoc;\n const headers = {};\n const parser = new DOMParser();\n\n if (settings && settings.get().streaming.protection.detectPlayreadyMessageFormat) {\n // If message format configured/defaulted to utf-16 AND number of bytes is odd, assume 'unwrapped' raw CDM message.\n if (messageFormat === 'utf-16' && message && message.byteLength % 2 === 1) {\n headers['Content-Type'] = 'text/xml; charset=utf-8';\n return headers;\n }\n }\n\n const dataview = (messageFormat === 'utf-16') ? new Uint16Array(message) : new Uint8Array(message);\n\n msg = String.fromCharCode.apply(null, dataview);\n xmlDoc = parser.parseFromString(msg, 'application/xml');\n\n const headerNameList = xmlDoc.getElementsByTagName('name');\n const headerValueList = xmlDoc.getElementsByTagName('value');\n for (let i = 0; i < headerNameList.length; i++) {\n headers[headerNameList[i].childNodes[0].nodeValue] = headerValueList[i].childNodes[0].nodeValue;\n }\n // Some versions of the PlayReady CDM return 'Content' instead of 'Content-Type'.\n // this is NOT w3c conform and license servers may reject the request!\n // -> rename it to proper w3c definition!\n if (headers.hasOwnProperty('Content')) {\n headers['Content-Type'] = headers.Content;\n delete headers.Content;\n }\n // Set Content-Type header by default if not provided in the the CDM message (<PlayReadyKeyMessage/>)\n // or if the message contains directly the challenge itself (Ex: LG SmartTVs)\n if (!headers.hasOwnProperty('Content-Type')) {\n headers['Content-Type'] = 'text/xml; charset=utf-8';\n }\n return headers;\n }\n\n function getLicenseRequestFromMessage(message) {\n let licenseRequest = null;\n const parser = new DOMParser();\n\n if (settings && settings.get().streaming.protection.detectPlayreadyMessageFormat) {\n // If message format configured/defaulted to utf-16 AND number of bytes is odd, assume 'unwrapped' raw CDM message.\n if (messageFormat === 'utf-16' && message && message.byteLength % 2 === 1) {\n return message;\n }\n }\n\n const dataview = (messageFormat === 'utf-16') ? new Uint16Array(message) : new Uint8Array(message);\n\n checkConfig();\n const msg = String.fromCharCode.apply(null, dataview);\n const xmlDoc = parser.parseFromString(msg, 'application/xml');\n\n if (xmlDoc.getElementsByTagName('PlayReadyKeyMessage')[0]) {\n const Challenge = xmlDoc.getElementsByTagName('Challenge')[0].childNodes[0].nodeValue;\n if (Challenge) {\n licenseRequest = BASE64.decode(Challenge);\n }\n } else {\n // The message from CDM is not a wrapped message as on IE11 and Edge,\n // thus it contains direclty the challenge itself\n // (note that the xmlDoc at this point may be unreadable since it may have been interpreted as UTF-16)\n return message;\n }\n\n return licenseRequest;\n }\n\n function getLicenseServerURLFromInitData(initData) {\n if (initData) {\n const data = new DataView(initData);\n const numRecords = data.getUint16(4, true);\n let offset = 6;\n const parser = new DOMParser();\n\n for (let i = 0; i < numRecords; i++) {\n // Parse the PlayReady Record header\n const recordType = data.getUint16(offset, true);\n offset += 2;\n const recordLength = data.getUint16(offset, true);\n offset += 2;\n if (recordType !== 0x0001) {\n offset += recordLength;\n continue;\n }\n\n const recordData = initData.slice(offset, offset + recordLength);\n const record = String.fromCharCode.apply(null, new Uint16Array(recordData));\n const xmlDoc = parser.parseFromString(record, 'application/xml');\n\n // First try <LA_URL>\n if (xmlDoc.getElementsByTagName('LA_URL')[0]) {\n const laurl = xmlDoc.getElementsByTagName('LA_URL')[0].childNodes[0].nodeValue;\n if (laurl) {\n return laurl;\n }\n }\n\n // Optionally, try <LUI_URL>\n if (xmlDoc.getElementsByTagName('LUI_URL')[0]) {\n const luiurl = xmlDoc.getElementsByTagName('LUI_URL')[0].childNodes[0].nodeValue;\n if (luiurl) {\n return luiurl;\n }\n }\n }\n }\n\n return null;\n }\n\n function getInitData(cpData) {\n // * desc@ getInitData\n // * generate PSSH data from PROHeader defined in MPD file\n // * PSSH format:\n // * size (4)\n // * box type(PSSH) (8)\n // * Protection SystemID (16)\n // * protection system data size (4) - length of decoded PROHeader\n // * decoded PROHeader data from MPD file\n const PSSHBoxType = new Uint8Array([0x70, 0x73, 0x73, 0x68, 0x00, 0x00, 0x00, 0x00]); //'PSSH' 8 bytes\n const playreadySystemID = new Uint8Array([0x9a, 0x04, 0xf0, 0x79, 0x98, 0x40, 0x42, 0x86, 0xab, 0x92, 0xe6, 0x5b, 0xe0, 0x88, 0x5f, 0x95]);\n\n let byteCursor = 0;\n let uint8arraydecodedPROHeader = null;\n\n let PROSize,\n PSSHSize,\n PSSHBoxBuffer,\n PSSHBox,\n PSSHData;\n\n checkConfig();\n if (!cpData) {\n return null;\n }\n // Handle common encryption PSSH\n if ('pssh' in cpData) {\n return CommonEncryption.parseInitDataFromContentProtection(cpData, BASE64);\n }\n // Handle native MS PlayReady ContentProtection elements\n if ('pro' in cpData) {\n uint8arraydecodedPROHeader = BASE64.decodeArray(cpData.pro.__text);\n }\n else if ('prheader' in cpData) {\n uint8arraydecodedPROHeader = BASE64.decodeArray(cpData.prheader.__text);\n }\n else {\n return null;\n }\n\n PROSize = uint8arraydecodedPROHeader.length;\n PSSHSize = 0x4 + PSSHBoxType.length + playreadySystemID.length + 0x4 + PROSize;\n\n PSSHBoxBuffer = new ArrayBuffer(PSSHSize);\n\n PSSHBox = new Uint8Array(PSSHBoxBuffer);\n PSSHData = new DataView(PSSHBoxBuffer);\n\n PSSHData.setUint32(byteCursor, PSSHSize);\n byteCursor += 0x4;\n\n PSSHBox.set(PSSHBoxType, byteCursor);\n byteCursor += PSSHBoxType.length;\n\n PSSHBox.set(playreadySystemID, byteCursor);\n byteCursor += playreadySystemID.length;\n\n PSSHData.setUint32(byteCursor, PROSize);\n byteCursor += 0x4;\n\n PSSHBox.set(uint8arraydecodedPROHeader, byteCursor);\n byteCursor += PROSize;\n\n return PSSHBox.buffer;\n }\n\n /**\n * It seems that some PlayReady implementations return their XML-based CDM\n * messages using UTF16, while others return them as UTF8. Use this function\n * to modify the message format to expect when parsing CDM messages.\n *\n * @param {string} format the expected message format. Either \"utf-8\" or \"utf-16\".\n * @throws {Error} Specified message format is not one of \"utf8\" or \"utf16\"\n */\n function setPlayReadyMessageFormat(format) {\n if (format !== 'utf-8' && format !== 'utf-16') {\n throw new Error('Specified message format is not one of \"utf-8\" or \"utf-16\"');\n }\n messageFormat = format;\n }\n\n /**\n * Get Playready Custom data\n */\n function getCDMData(_cdmData) {\n let customData,\n cdmData,\n cdmDataBytes,\n i;\n\n checkConfig();\n if (!_cdmData) return null;\n\n // Convert custom data into multibyte string\n customData = [];\n for (i = 0; i < _cdmData.length; ++i) {\n customData.push(_cdmData.charCodeAt(i));\n customData.push(0);\n }\n customData = String.fromCharCode.apply(null, customData);\n\n // Encode in Base 64 the custom data string\n customData = BASE64.encode(customData);\n\n // Initialize CDM data with Base 64 encoded custom data\n // (see https://msdn.microsoft.com/en-us/library/dn457361.aspx)\n cdmData = PRCDMData.replace('%CUSTOMDATA%', customData);\n\n // Convert CDM data into multibyte characters\n cdmDataBytes = [];\n for (i = 0; i < cdmData.length; ++i) {\n cdmDataBytes.push(cdmData.charCodeAt(i));\n cdmDataBytes.push(0);\n }\n\n return new Uint8Array(cdmDataBytes).buffer;\n }\n\n instance = {\n uuid,\n schemeIdURI,\n systemString,\n getInitData,\n getRequestHeadersFromMessage,\n getLicenseRequestFromMessage,\n getLicenseServerURLFromInitData,\n getCDMData,\n setPlayReadyMessageFormat\n };\n\n return instance;\n}\n\nKeySystemPlayReady.__dashjs_factory_name = 'KeySystemPlayReady';\nexport default dashjs.FactoryMaker.getSingletonFactory(KeySystemPlayReady); /* jshint ignore:line */\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n * CastLabs DRMToday License Server implementation\n *\n * @implements LicenseServer\n * @class\n */\n\nimport ProtectionConstants from '../../constants/ProtectionConstants';\n\nfunction DRMToday(config) {\n\n config = config || {};\n const BASE64 = config.BASE64;\n\n const keySystems = {};\n keySystems[ProtectionConstants.WIDEVINE_KEYSTEM_STRING] = {\n responseType: 'json',\n getLicenseMessage: function (response) {\n return BASE64.decodeArray(response.license);\n },\n getErrorResponse: function (response) {\n return response;\n }\n };\n keySystems[ProtectionConstants.PLAYREADY_KEYSTEM_STRING] = {\n responseType: 'arraybuffer',\n getLicenseMessage: function (response) {\n return response;\n },\n getErrorResponse: function (response) {\n return String.fromCharCode.apply(null, new Uint8Array(response));\n }\n };\n\n let instance;\n\n function checkConfig() {\n if (!BASE64 || !BASE64.hasOwnProperty('decodeArray')) {\n throw new Error('Missing config parameter(s)');\n }\n }\n\n function getServerURLFromMessage(url /*, message, messageType*/) {\n return url;\n }\n\n function getHTTPMethod(/*messageType*/) {\n return 'POST';\n }\n\n function getResponseType(keySystemStr/*, messageType*/) {\n return keySystems[keySystemStr].responseType;\n }\n\n function getLicenseMessage(serverResponse, keySystemStr/*, messageType*/) {\n checkConfig();\n return keySystems[keySystemStr].getLicenseMessage(serverResponse);\n }\n\n function getErrorResponse(serverResponse, keySystemStr/*, messageType*/) {\n return keySystems[keySystemStr].getErrorResponse(serverResponse);\n }\n\n instance = {\n getServerURLFromMessage,\n getHTTPMethod,\n getResponseType,\n getLicenseMessage,\n getErrorResponse\n };\n\n return instance;\n}\n\nDRMToday.__dashjs_factory_name = 'DRMToday';\nexport default dashjs.FactoryMaker.getSingletonFactory(DRMToday); /* jshint ignore:line */\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n/* global escape: true */\n\nimport FactoryMaker from '../../../core/FactoryMaker';\n\n/**\n * Microsoft PlayReady Test License Server\n *\n * For testing content that uses the PlayReady test server at\n *\n * @implements LicenseServer\n * @class\n * @ignore\n */\n\nfunction PlayReady() {\n\n let instance;\n\n const soap = 'http://schemas.xmlsoap.org/soap/envelope/';\n\n function uintToString(arrayBuffer) {\n const encodedString = String.fromCharCode.apply(null, new Uint8Array(arrayBuffer));\n const decodedString = decodeURIComponent(escape(encodedString));\n return decodedString;\n }\n\n function parseServerResponse(serverResponse) {\n if (window.DOMParser) {\n const stringResponse = uintToString(serverResponse);\n const parser = new window.DOMParser();\n const xmlDoc = parser.parseFromString(stringResponse, 'text/xml');\n const envelope = xmlDoc ? xmlDoc.getElementsByTagNameNS(soap, 'Envelope')[0] : null;\n const body = envelope ? envelope.getElementsByTagNameNS(soap, 'Body')[0] : null;\n const fault = body ? body.getElementsByTagNameNS(soap, 'Fault')[0] : null;\n\n if (fault) {\n return null;\n }\n }\n return serverResponse;\n }\n\n function parseErrorResponse(serverResponse) {\n let faultstring = '';\n let statusCode = '';\n let message = '';\n let idStart = -1;\n let idEnd = -1;\n\n if (window.DOMParser) {\n const stringResponse = uintToString(serverResponse);\n const parser = new window.DOMParser();\n const xmlDoc = parser.parseFromString(stringResponse, 'text/xml');\n const envelope = xmlDoc ? xmlDoc.getElementsByTagNameNS(soap, 'Envelope')[0] : null;\n const body = envelope ? envelope.getElementsByTagNameNS(soap, 'Body')[0] : null;\n const fault = body ? body.getElementsByTagNameNS(soap, 'Fault')[0] : null;\n const detail = fault ? fault.getElementsByTagName('detail')[0] : null;\n const exception = detail ? detail.getElementsByTagName('Exception')[0] : null;\n let node = null;\n\n if (fault === null) {\n return stringResponse;\n }\n\n node = fault.getElementsByTagName('faultstring')[0].firstChild;\n faultstring = node ? node.nodeValue : null;\n\n if (exception !== null) {\n node = exception.getElementsByTagName('StatusCode')[0];\n statusCode = node ? node.firstChild.nodeValue : null;\n node = exception.getElementsByTagName('Message')[0];\n message = node ? node.firstChild.nodeValue : null;\n idStart = message ? message.lastIndexOf('[') + 1 : -1;\n idEnd = message ? message.indexOf(']') : -1;\n message = message ? message.substring(idStart, idEnd) : '';\n }\n }\n\n let errorString = `code: ${statusCode}, name: ${faultstring}`;\n if (message) {\n errorString += `, message: ${message}`;\n }\n\n return errorString;\n }\n\n function getServerURLFromMessage(url /*, message, messageType*/) {\n return url;\n }\n\n function getHTTPMethod(/*messageType*/) {\n return 'POST';\n }\n\n function getResponseType(/*keySystemStr, messageType*/) {\n return 'arraybuffer';\n }\n\n function getLicenseMessage(serverResponse/*, keySystemStr, messageType*/) {\n return parseServerResponse.call(this, serverResponse);\n }\n\n function getErrorResponse(serverResponse/*, keySystemStr, messageType*/) {\n return parseErrorResponse.call(this, serverResponse);\n }\n\n instance = {\n getServerURLFromMessage,\n getHTTPMethod,\n getResponseType,\n getLicenseMessage,\n getErrorResponse\n };\n\n return instance;\n}\n\nPlayReady.__dashjs_factory_name = 'PlayReady';\nexport default FactoryMaker.getSingletonFactory(PlayReady); /* jshint ignore:line */\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n * @ignore\n */\nfunction Widevine() {\n\n let instance;\n\n function getServerURLFromMessage(url /*, message, messageType*/) {\n return url;\n }\n\n function getHTTPMethod(/*messageType*/) {\n return 'POST';\n }\n\n function getResponseType(/*keySystemStr, messageType*/) {\n return 'arraybuffer';\n }\n\n function getLicenseMessage(serverResponse/*, keySystemStr, messageType*/) {\n return serverResponse;\n }\n\n function getErrorResponse(serverResponse/*, keySystemStr, messageType*/) {\n return String.fromCharCode.apply(null, new Uint8Array(serverResponse));\n }\n\n instance = {\n getServerURLFromMessage,\n getHTTPMethod,\n getResponseType,\n getLicenseMessage,\n getErrorResponse\n };\n\n return instance;\n}\n\nWidevine.__dashjs_factory_name = 'Widevine';\nexport default dashjs.FactoryMaker.getSingletonFactory(Widevine); /* jshint ignore:line */\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n * CableLabs ClearKey license server implementation\n *\n * For testing purposes and evaluating potential uses for ClearKey, we have developed\n * a dirt-simple API for requesting ClearKey licenses from a remote server.\n *\n * @implements LicenseServer\n * @class\n */\nimport KeyPair from '../vo/KeyPair';\nimport ClearKeyKeySet from '../vo/ClearKeyKeySet';\n\nfunction ClearKey() {\n\n let instance;\n\n function getServerURLFromMessage(url /* message, messageType*/) {\n return url;\n }\n\n function getHTTPMethod(/*messageType*/) {\n return 'POST';\n }\n\n function getResponseType(/*keySystemStr*/) {\n return 'json';\n }\n\n function getLicenseMessage(serverResponse/*, keySystemStr, messageType*/) {\n if (!serverResponse.hasOwnProperty('keys')) {\n return null;\n }\n let keyPairs = [];\n for (let i = 0; i < serverResponse.keys.length; i++) {\n let keypair = serverResponse.keys[i];\n let keyid = keypair.kid.replace(/=/g, '');\n let key = keypair.k.replace(/=/g, '');\n\n keyPairs.push(new KeyPair(keyid, key));\n }\n return new ClearKeyKeySet(keyPairs);\n }\n\n function getErrorResponse(serverResponse/*, keySystemStr, messageType*/) {\n return String.fromCharCode.apply(null, new Uint8Array(serverResponse));\n }\n\n instance = {\n getServerURLFromMessage,\n getHTTPMethod,\n getResponseType,\n getLicenseMessage,\n getErrorResponse\n };\n\n return instance;\n}\n\nClearKey.__dashjs_factory_name = 'ClearKey';\nexport default dashjs.FactoryMaker.getSingletonFactory(ClearKey); /* jshint ignore:line */\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport CommonEncryption from './../CommonEncryption';\nimport KeySystemClearKey from './../drm/KeySystemClearKey';\nimport KeySystemW3CClearKey from './../drm/KeySystemW3CClearKey';\nimport KeySystemWidevine from './../drm/KeySystemWidevine';\nimport KeySystemPlayReady from './../drm/KeySystemPlayReady';\nimport DRMToday from './../servers/DRMToday';\nimport PlayReady from './../servers/PlayReady';\nimport Widevine from './../servers/Widevine';\nimport ClearKey from './../servers/ClearKey';\nimport ProtectionConstants from '../../constants/ProtectionConstants';\n\n/**\n * @module ProtectionKeyController\n * @ignore\n * @description Media protection key system functionality that can be modified/overridden by applications\n */\nfunction ProtectionKeyController() {\n\n let context = this.context;\n\n let instance,\n debug,\n logger,\n keySystems,\n BASE64,\n settings,\n clearkeyKeySystem,\n clearkeyW3CKeySystem;\n\n function setConfig(config) {\n if (!config) return;\n\n if (config.debug) {\n debug = config.debug;\n logger = debug.getLogger(instance);\n }\n\n if (config.BASE64) {\n BASE64 = config.BASE64;\n }\n\n if(config.settings) {\n settings = config.settings\n }\n }\n\n function initialize() {\n keySystems = [];\n\n let keySystem;\n\n // PlayReady\n keySystem = KeySystemPlayReady(context).getInstance({BASE64: BASE64, settings: settings});\n keySystems.push(keySystem);\n\n // Widevine\n keySystem = KeySystemWidevine(context).getInstance({BASE64: BASE64});\n keySystems.push(keySystem);\n\n // ClearKey\n keySystem = KeySystemClearKey(context).getInstance({BASE64: BASE64});\n keySystems.push(keySystem);\n clearkeyKeySystem = keySystem;\n\n // W3C ClearKey\n keySystem = KeySystemW3CClearKey(context).getInstance({BASE64: BASE64, debug: debug});\n keySystems.push(keySystem);\n clearkeyW3CKeySystem = keySystem;\n }\n\n /**\n * Returns a prioritized list of key systems supported\n * by this player (not necessarily those supported by the\n * user agent)\n *\n * @returns {Array.<KeySystem>} a prioritized\n * list of key systems\n * @memberof module:ProtectionKeyController\n * @instance\n */\n function getKeySystems() {\n return keySystems;\n }\n\n /**\n * Sets the prioritized list of key systems to be supported\n * by this player.\n *\n * @param {Array.<KeySystem>} newKeySystems the new prioritized\n * list of key systems\n * @memberof module:ProtectionKeyController\n * @instance\n */\n function setKeySystems(newKeySystems) {\n keySystems = newKeySystems;\n }\n\n /**\n * Returns the key system associated with the given key system string\n * name (i.e. 'org.w3.clearkey')\n *\n * @param {string} systemString the system string\n * @returns {KeySystem|null} the key system\n * or null if no supported key system is associated with the given key\n * system string\n * @memberof module:ProtectionKeyController\n * @instance\n */\n function getKeySystemBySystemString(systemString) {\n for (let i = 0; i < keySystems.length; i++) {\n if (keySystems[i].systemString === systemString) {\n return keySystems[i];\n }\n }\n return null;\n }\n\n /**\n * Determines whether the given key system is ClearKey. This is\n * necessary because the EME spec defines ClearKey and its method\n * for providing keys to the key session; and this method has changed\n * between the various API versions. Our EME-specific ProtectionModels\n * must know if the system is ClearKey so that it can format the keys\n * according to the particular spec version.\n *\n * @param {Object} keySystem the key\n * @returns {boolean} true if this is the ClearKey key system, false\n * otherwise\n * @memberof module:ProtectionKeyController\n * @instance\n */\n function isClearKey(keySystem) {\n return (keySystem === clearkeyKeySystem || keySystem === clearkeyW3CKeySystem);\n }\n\n /**\n * Check equality of initData array buffers.\n *\n * @param {ArrayBuffer} initData1 - first initData\n * @param {ArrayBuffer} initData2 - second initData\n * @returns {boolean} true if the initData arrays are equal in size and\n * contents, false otherwise\n * @memberof module:ProtectionKeyController\n * @instance\n */\n function initDataEquals(initData1, initData2) {\n if (initData1.byteLength === initData2.byteLength) {\n let data1 = new Uint8Array(initData1);\n let data2 = new Uint8Array(initData2);\n\n for (let j = 0; j < data1.length; j++) {\n if (data1[j] !== data2[j]) {\n return false;\n }\n }\n return true;\n }\n return false;\n }\n\n /**\n * Returns a set of supported key systems and CENC initialization data\n * from the given array of ContentProtection elements. Only\n * key systems that are supported by this player will be returned.\n * Key systems are returned in priority order (highest first).\n *\n * @param {Array.<Object>} cps - array of content protection elements parsed\n * from the manifest\n * @param {ProtectionData} protDataSet user specified protection data - license server url etc\n * supported by the content\n * @param {string} default session type\n * @returns {Array.<Object>} array of objects indicating which supported key\n * systems were found. Empty array is returned if no\n * supported key systems were found\n * @memberof module:ProtectionKeyController\n * @instance\n */\n function getSupportedKeySystemsFromContentProtection(cps, protDataSet, sessionType) {\n let cp, ks, ksIdx, cpIdx;\n let supportedKS = [];\n\n if (cps) {\n const cencContentProtection = CommonEncryption.findCencContentProtection(cps);\n for (ksIdx = 0; ksIdx < keySystems.length; ++ksIdx) {\n ks = keySystems[ksIdx];\n\n // Get protection data that applies for current key system\n const protData = _getProtDataForKeySystem(ks.systemString, protDataSet);\n\n for (cpIdx = 0; cpIdx < cps.length; ++cpIdx) {\n cp = cps[cpIdx];\n if (cp.schemeIdUri.toLowerCase() === ks.schemeIdURI) {\n // Look for DRM-specific ContentProtection\n let initData = ks.getInitData(cp, cencContentProtection);\n\n supportedKS.push({\n ks: keySystems[ksIdx],\n keyId: cp.keyId,\n initData: initData,\n protData: protData,\n cdmData: ks.getCDMData(protData ? protData.cdmData : null),\n sessionId: _getSessionId(protData, cp),\n sessionType: _getSessionType(protData, sessionType)\n });\n }\n }\n }\n }\n return supportedKS;\n }\n\n /**\n * Returns key systems supported by this player for the given PSSH\n * initializationData. Key systems are returned in priority order\n * (highest priority first)\n *\n * @param {ArrayBuffer} initData Concatenated PSSH data for all DRMs\n * supported by the content\n * @param {ProtectionData} protDataSet user specified protection data - license server url etc\n * supported by the content\n * @param {string} default session type\n * @returns {Array.<Object>} array of objects indicating which supported key\n * systems were found. Empty array is returned if no\n * supported key systems were found\n * @memberof module:ProtectionKeyController\n * @instance\n */\n function getSupportedKeySystemsFromSegmentPssh(initData, protDataSet, sessionType) {\n let supportedKS = [];\n let pssh = CommonEncryption.parsePSSHList(initData);\n let ks, keySystemString;\n\n for (let ksIdx = 0; ksIdx < keySystems.length; ++ksIdx) {\n ks = keySystems[ksIdx];\n keySystemString = ks.systemString;\n\n // Get protection data that applies for current key system\n const protData = _getProtDataForKeySystem(keySystemString, protDataSet);\n\n if (ks.uuid in pssh) {\n supportedKS.push({\n ks: ks,\n initData: pssh[ks.uuid],\n protData: protData,\n cdmData: ks.getCDMData(protData ? protData.cdmData : null),\n sessionId: _getSessionId(protData),\n sessionType: _getSessionType(protData, sessionType)\n });\n }\n }\n return supportedKS;\n }\n\n /**\n * Returns the license server implementation data that should be used for this request.\n *\n * @param {KeySystem} keySystem the key system\n * associated with this license request\n * @param {ProtectionData} protData protection data to use for the\n * request\n * @param {string} [messageType=\"license-request\"] the message type associated with this\n * request. Supported message types can be found\n * {@link https://w3c.github.io/encrypted-media/#idl-def-MediaKeyMessageType|here}.\n * @returns {LicenseServer|null} the license server\n * implementation that should be used for this request or null if the player should not\n * pass messages of the given type to a license server\n * @memberof module:ProtectionKeyController\n * @instance\n *\n */\n function getLicenseServerModelInstance(keySystem, protData, messageType) {\n\n // Our default server implementations do not do anything with \"license-release\" or\n // \"individualization-request\" messages, so we just send a success event\n if (messageType === 'license-release' || messageType === 'individualization-request') {\n return null;\n }\n\n let licenseServerData = null;\n if (protData && protData.hasOwnProperty('drmtoday')) {\n licenseServerData = DRMToday(context).getInstance({BASE64: BASE64});\n } else if (keySystem.systemString === ProtectionConstants.WIDEVINE_KEYSTEM_STRING) {\n licenseServerData = Widevine(context).getInstance();\n } else if (keySystem.systemString === ProtectionConstants.PLAYREADY_KEYSTEM_STRING) {\n licenseServerData = PlayReady(context).getInstance();\n } else if (keySystem.systemString === ProtectionConstants.CLEARKEY_KEYSTEM_STRING) {\n licenseServerData = ClearKey(context).getInstance();\n }\n\n return licenseServerData;\n }\n\n /**\n * Allows application-specific retrieval of ClearKey keys.\n *\n * @param {KeySystem} clearkeyKeySystem They exact ClearKey System to be used\n * @param {ProtectionData} protData protection data to use for the\n * request\n * @param {ArrayBuffer} message the key message from the CDM\n * @return {ClearKeyKeySet|null} the clear keys associated with\n * the request or null if no keys can be returned by this function\n * @memberof module:ProtectionKeyController\n * @instance\n */\n function processClearKeyLicenseRequest(clearkeyKeySystem, protData, message) {\n try {\n return clearkeyKeySystem.getClearKeysFromProtectionData(protData, message);\n } catch (error) {\n logger.error('Failed to retrieve clearkeys from ProtectionData');\n return null;\n }\n }\n\n function setProtectionData(protectionDataSet) {\n var getProtectionData = function (keySystemString) {\n var protData = null;\n if (protectionDataSet) {\n protData = (keySystemString in protectionDataSet) ? protectionDataSet[keySystemString] : null;\n }\n return protData;\n };\n\n for (var i = 0; i < keySystems.length; i++) {\n var keySystem = keySystems[i];\n if (keySystem.hasOwnProperty('init')) {\n keySystem.init(getProtectionData(keySystem.systemString));\n }\n }\n }\n\n function _getProtDataForKeySystem(systemString, protDataSet) {\n if (!protDataSet) return null;\n return (systemString in protDataSet) ? protDataSet[systemString] : null;\n }\n\n function _getSessionId(protData, cp) {\n // Get sessionId from protectionData or from manifest (ContentProtection)\n if (protData && protData.sessionId) {\n return protData.sessionId;\n } else if (cp && cp.sessionId) {\n return cp.sessionId;\n }\n return null;\n }\n\n function _getSessionType(protData, sessionType) {\n return (protData && protData.sessionType) ? protData.sessionType : sessionType;\n }\n\n instance = {\n initialize,\n setProtectionData,\n isClearKey,\n initDataEquals,\n getKeySystems,\n setKeySystems,\n getKeySystemBySystemString,\n getSupportedKeySystemsFromContentProtection,\n getSupportedKeySystemsFromSegmentPssh,\n getLicenseServerModelInstance,\n processClearKeyLicenseRequest,\n setConfig\n };\n\n return instance;\n}\n\nProtectionKeyController.__dashjs_factory_name = 'ProtectionKeyController';\nexport default dashjs.FactoryMaker.getSingletonFactory(ProtectionKeyController); /* jshint ignore:line */\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport EventsBase from '../../core/events/EventsBase';\n\n/**\n * @class\n */\nclass ProtectionEvents extends EventsBase {\n /**\n * @description Public facing external events to be used when including protection package.\n * All public events will be aggregated into the MediaPlayerEvents Class and can be accessed\n * via MediaPlayer.events. public_ is the prefix that we use to move event names to MediaPlayerEvents.\n */\n constructor() {\n super();\n\n /**\n * Event ID for events delivered when the protection set receives\n * a key message from the CDM\n *\n * @ignore\n */\n this.INTERNAL_KEY_MESSAGE = 'internalKeyMessage';\n\n /**\n * Event ID for events delivered when the status of one decryption keys has changed\n * @ignore\n */\n this.INTERNAL_KEY_STATUS_CHANGED = 'internalkeyStatusChanged';\n\n /**\n * Event ID for events delivered when a new key has been added\n *\n * @constant\n * @deprecated The latest versions of the EME specification no longer\n * use this event. {@MediaPlayer.models.protectionModel.eventList.KEY_STATUSES_CHANGED}\n * is preferred.\n * @event ProtectionEvents#KEY_ADDED\n */\n this.KEY_ADDED = 'public_keyAdded';\n /**\n * Event ID for events delivered when an error is encountered by the CDM\n * while processing a license server response message\n * @event ProtectionEvents#KEY_ERROR\n */\n this.KEY_ERROR = 'public_keyError';\n\n /**\n * Event ID for events delivered when the protection set receives\n * a key message from the CDM\n * @event ProtectionEvents#KEY_MESSAGE\n */\n this.KEY_MESSAGE = 'public_keyMessage';\n\n /**\n * Event ID for events delivered when a key session close\n * process has completed\n * @event ProtectionEvents#KEY_SESSION_CLOSED\n */\n this.KEY_SESSION_CLOSED = 'public_keySessionClosed';\n\n /**\n * Event ID for events delivered when a new key sessions creation\n * process has completed\n * @event ProtectionEvents#KEY_SESSION_CREATED\n */\n this.KEY_SESSION_CREATED = 'public_keySessionCreated';\n\n /**\n * Event ID for events delivered when a key session removal\n * process has completed\n * @event ProtectionEvents#KEY_SESSION_REMOVED\n */\n this.KEY_SESSION_REMOVED = 'public_keySessionRemoved';\n\n /**\n * Event ID for events delivered when the status of one or more\n * decryption keys has changed\n * @event ProtectionEvents#KEY_STATUSES_CHANGED\n */\n this.KEY_STATUSES_CHANGED = 'public_keyStatusesChanged';\n\n /**\n * Event ID for events delivered when a key system access procedure\n * has completed\n * @event ProtectionEvents#KEY_SYSTEM_ACCESS_COMPLETE\n */\n this.KEY_SYSTEM_ACCESS_COMPLETE = 'public_keySystemAccessComplete';\n\n /**\n * Event ID for events delivered when a key system selection procedure\n * completes\n * @event ProtectionEvents#KEY_SYSTEM_SELECTED\n */\n this.KEY_SYSTEM_SELECTED = 'public_keySystemSelected';\n\n /**\n * Event ID for events delivered when a license request procedure\n * has completed\n * @event ProtectionEvents#LICENSE_REQUEST_COMPLETE\n */\n this.LICENSE_REQUEST_COMPLETE = 'public_licenseRequestComplete';\n\n /**\n * Sending a license rquest\n * @event ProtectionEvents#LICENSE_REQUEST_SENDING\n */\n this.LICENSE_REQUEST_SENDING = 'public_licenseRequestSending';\n\n /**\n * Event ID for needkey/encrypted events\n * @ignore\n */\n this.NEED_KEY = 'needkey';\n\n /**\n * Event ID for events delivered when the Protection system is detected and created.\n * @event ProtectionEvents#PROTECTION_CREATED\n */\n this.PROTECTION_CREATED = 'public_protectioncreated';\n\n /**\n * Event ID for events delivered when the Protection system is destroyed.\n * @event ProtectionEvents#PROTECTION_DESTROYED\n */\n this.PROTECTION_DESTROYED = 'public_protectiondestroyed';\n\n /**\n * Event ID for events delivered when a new server certificate has\n * been delivered to the CDM\n * @ignore\n */\n this.SERVER_CERTIFICATE_UPDATED = 'serverCertificateUpdated';\n\n /**\n * Event ID for events delivered when the process of shutting down\n * a protection set has completed\n * @ignore\n */\n this.TEARDOWN_COMPLETE = 'protectionTeardownComplete';\n\n /**\n * Event ID for events delivered when a HTMLMediaElement has been\n * associated with the protection set\n * @ignore\n */\n this.VIDEO_ELEMENT_SELECTED = 'videoElementSelected';\n\n /**\n * Triggered when the key session has been updated successfully\n * @ignore\n */\n this.KEY_SESSION_UPDATED = 'public_keySessionUpdated';\n }\n}\n\nlet protectionEvents = new ProtectionEvents();\nexport default protectionEvents;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @classdesc NeedKey\n * @ignore\n */\nclass NeedKey {\n /**\n * @param {ArrayBuffer} initData the initialization data\n * @param {string} initDataType initialization data type\n * @class\n */\n constructor(initData, initDataType) {\n this.initData = initData;\n this.initDataType = initDataType;\n }\n}\n\nexport default NeedKey;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @classdesc EME-independent KeyMessage\n * @ignore\n */\nclass KeyMessage {\n /**\n * @param {SessionToken} sessionToken the session\n * to which the key message is associated\n * @param {ArrayBuffer} message the key message\n * @param {string} defaultURL license acquisition URL provided by the CDM\n * @param {string} messageType Supported message types can be found\n * {@link https://w3c.github.io/encrypted-media/#idl-def-MediaKeyMessageType|here}.\n * @class\n */\n constructor(sessionToken, message, defaultURL, messageType) {\n this.sessionToken = sessionToken;\n this.message = message;\n this.defaultURL = defaultURL;\n this.messageType = messageType ? messageType : 'license-request';\n }\n}\n\nexport default KeyMessage;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @classdesc Creates a new key system access token. Represents a valid key system for\n * given piece of content and key system requirements. Used to initialize license\n * acquisition operations.\n * @ignore\n */\nclass KeySystemAccess {\n /**\n * @param {MediaPlayer.dependencies.protection.KeySystem} keySystem the key system\n * @param {KeySystemConfiguration} ksConfiguration the\n * subset of configurations passed to the key system access request that are supported\n * by this user agent\n * @class\n * @ignore\n */\n constructor(keySystem, ksConfiguration) {\n this.keySystem = keySystem;\n this.ksConfiguration = ksConfiguration;\n }\n}\n\nexport default KeySystemAccess;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n * Most recent EME implementation\n *\n * Implemented by Google Chrome v36+ (Windows, OSX, Linux)\n *\n * @implements ProtectionModel\n * @class\n */\nimport ProtectionKeyController from '../controllers/ProtectionKeyController';\nimport NeedKey from '../vo/NeedKey';\nimport ProtectionErrors from '../errors/ProtectionErrors';\nimport DashJSError from '../../vo/DashJSError';\nimport KeyMessage from '../vo/KeyMessage';\nimport KeySystemAccess from '../vo/KeySystemAccess';\nimport ProtectionConstants from '../../constants/ProtectionConstants';\n\nconst SYSTEM_STRING_PRIORITY = {};\nSYSTEM_STRING_PRIORITY[ProtectionConstants.PLAYREADY_KEYSTEM_STRING] = [ProtectionConstants.PLAYREADY_KEYSTEM_STRING, ProtectionConstants.PLAYREADY_RECOMMENDATION_KEYSTEM_STRING];\nSYSTEM_STRING_PRIORITY[ProtectionConstants.WIDEVINE_KEYSTEM_STRING] = [ProtectionConstants.WIDEVINE_KEYSTEM_STRING];\nSYSTEM_STRING_PRIORITY[ProtectionConstants.CLEARKEY_KEYSTEM_STRING] = [ProtectionConstants.CLEARKEY_KEYSTEM_STRING];\n\nfunction ProtectionModel_21Jan2015(config) {\n\n config = config || {};\n const context = this.context;\n const eventBus = config.eventBus;//Need to pass in here so we can use same instance since this is optional module\n const events = config.events;\n const debug = config.debug;\n\n let instance,\n logger,\n keySystem,\n videoElement,\n mediaKeys,\n sessions,\n eventHandler,\n protectionKeyController;\n\n function setup() {\n logger = debug.getLogger(instance);\n keySystem = null;\n videoElement = null;\n mediaKeys = null;\n sessions = [];\n protectionKeyController = ProtectionKeyController(context).getInstance();\n eventHandler = createEventHandler();\n }\n\n function reset() {\n const numSessions = sessions.length;\n let session;\n\n if (numSessions !== 0) {\n // Called when we are done closing a session. Success or fail\n const done = function (session) {\n removeSession(session);\n if (sessions.length === 0) {\n if (videoElement) {\n videoElement.removeEventListener('encrypted', eventHandler);\n videoElement.setMediaKeys(null).then(function () {\n eventBus.trigger(events.TEARDOWN_COMPLETE);\n });\n } else {\n eventBus.trigger(events.TEARDOWN_COMPLETE);\n }\n }\n };\n for (let i = 0; i < numSessions; i++) {\n session = sessions[i];\n (function (s) {\n _closeKeySessionInternal(session)\n done(s);\n })(session);\n }\n } else {\n eventBus.trigger(events.TEARDOWN_COMPLETE);\n }\n }\n\n function stop() {\n // Close and remove not usable sessions\n let session;\n for (let i = 0; i < sessions.length; i++) {\n session = sessions[i];\n if (!session.getUsable()) {\n _closeKeySessionInternal(session)\n removeSession(session);\n }\n }\n }\n\n function getAllInitData() {\n const retVal = [];\n for (let i = 0; i < sessions.length; i++) {\n if (sessions[i].initData) {\n retVal.push(sessions[i].initData);\n }\n }\n return retVal;\n }\n\n function getSessions() {\n return sessions;\n }\n\n function requestKeySystemAccess(ksConfigurations) {\n return new Promise((resolve, reject) => {\n _requestKeySystemAccessInternal(ksConfigurations, 0, resolve, reject);\n })\n }\n\n /**\n * Initializes access to a key system. Once we found a valid configuration we get a mediaKeySystemAccess object\n * @param ksConfigurations\n * @param idx\n * @param resolve\n * @param reject\n * @private\n */\n function _requestKeySystemAccessInternal(ksConfigurations, idx, resolve, reject) {\n\n // In case requestMediaKeySystemAccess is not available we can not proceed and dispatch an error\n if (navigator.requestMediaKeySystemAccess === undefined ||\n typeof navigator.requestMediaKeySystemAccess !== 'function') {\n const msg = 'Insecure origins are not allowed';\n eventBus.trigger(events.KEY_SYSTEM_ACCESS_COMPLETE, { error: msg });\n reject({ error: msg });\n return;\n }\n\n // If a systemStringPriority is defined by the application we use these values. Otherwise we use the default system string\n // This is useful for DRM systems such as Playready for which multiple system strings are possible for instance com.microsoft.playready and com.microsoft.playready.recommendation\n const protDataSystemStringPriority = ksConfigurations[idx].protData && ksConfigurations[idx].protData.systemStringPriority ? ksConfigurations[idx].protData.systemStringPriority : null;\n const configs = ksConfigurations[idx].configs;\n const currentKeySystem = ksConfigurations[idx].ks;\n let systemString = currentKeySystem.systemString;\n\n // Use the default values in case no values are provided by the application\n const systemStringsToApply = protDataSystemStringPriority ? protDataSystemStringPriority : SYSTEM_STRING_PRIORITY[systemString] ? SYSTEM_STRING_PRIORITY[systemString] : [systemString];\n\n // Check all the available system strings and the available configurations for support\n _checkAccessForKeySystem(systemStringsToApply, configs)\n .then((mediaKeySystemAccess) => {\n const configuration = (typeof mediaKeySystemAccess.getConfiguration === 'function') ?\n mediaKeySystemAccess.getConfiguration() : null;\n const keySystemAccess = new KeySystemAccess(currentKeySystem, configuration);\n\n keySystemAccess.mksa = mediaKeySystemAccess;\n eventBus.trigger(events.KEY_SYSTEM_ACCESS_COMPLETE, { data: keySystemAccess });\n resolve({ data: keySystemAccess });\n })\n .catch((e) => {\n if (idx + 1 < ksConfigurations.length) {\n _requestKeySystemAccessInternal(ksConfigurations, idx + 1, resolve, reject);\n } else {\n const errorMessage = 'Key system access denied! ';\n eventBus.trigger(events.KEY_SYSTEM_ACCESS_COMPLETE, { error: errorMessage + e.message });\n reject({ error: errorMessage + e.message });\n }\n })\n }\n\n /**\n * For a specific key system: Iterate over the possible system strings and resolve once a valid configuration was found\n * @param {array} systemStringsToApply\n * @param {object} configs\n * @return {Promise}\n * @private\n */\n function _checkAccessForKeySystem(systemStringsToApply, configs) {\n return new Promise((resolve, reject) => {\n _checkAccessForSystemStrings(systemStringsToApply, configs, 0, resolve, reject);\n })\n }\n\n /**\n * Recursively iterate over the possible system strings until a supported configuration is found or we ran out of options\n * @param {array} systemStringsToApply\n * @param {object} configs\n * @param {number} idx\n * @param {function} resolve\n * @param {function} reject\n * @private\n */\n function _checkAccessForSystemStrings(systemStringsToApply, configs, idx, resolve, reject) {\n const systemString = systemStringsToApply[idx];\n\n logger.debug(`Requesting key system access for system string ${systemString}`);\n\n navigator.requestMediaKeySystemAccess(systemString, configs)\n .then((mediaKeySystemAccess) => {\n mediaKeySystemAccess.selectedSystemString = systemString;\n resolve(mediaKeySystemAccess);\n })\n .catch((e) => {\n if (idx + 1 < systemStringsToApply.length) {\n _checkAccessForSystemStrings(systemStringsToApply, configs, idx + 1, resolve, reject);\n } else {\n reject(e);\n }\n });\n }\n\n /**\n * Selects a key system by creating the mediaKeys and adding them to the video element\n * @param keySystemAccess\n * @return {Promise<unknown>}\n */\n function selectKeySystem(keySystemAccess) {\n return new Promise((resolve, reject) => {\n keySystemAccess.mksa.createMediaKeys()\n .then((mkeys) => {\n keySystem = keySystemAccess.keySystem;\n mediaKeys = mkeys;\n if (videoElement) {\n return videoElement.setMediaKeys(mediaKeys)\n } else {\n return Promise.resolve();\n }\n })\n .then(() => {\n resolve(keySystem);\n })\n .catch(function () {\n reject({ error: 'Error selecting keys system (' + keySystemAccess.keySystem.systemString + ')! Could not create MediaKeys -- TODO' });\n });\n })\n }\n\n function setMediaElement(mediaElement) {\n if (videoElement === mediaElement)\n return;\n\n // Replacing the previous element\n if (videoElement) {\n videoElement.removeEventListener('encrypted', eventHandler);\n if (videoElement.setMediaKeys) {\n videoElement.setMediaKeys(null);\n }\n }\n\n videoElement = mediaElement;\n\n // Only if we are not detaching from the existing element\n if (videoElement) {\n videoElement.addEventListener('encrypted', eventHandler);\n if (videoElement.setMediaKeys && mediaKeys) {\n videoElement.setMediaKeys(mediaKeys);\n }\n }\n }\n\n function setServerCertificate(serverCertificate) {\n if (!keySystem || !mediaKeys) {\n throw new Error('Can not set server certificate until you have selected a key system');\n }\n mediaKeys.setServerCertificate(serverCertificate).then(function () {\n logger.info('DRM: License server certificate successfully updated.');\n eventBus.trigger(events.SERVER_CERTIFICATE_UPDATED);\n }).catch(function (error) {\n eventBus.trigger(events.SERVER_CERTIFICATE_UPDATED, { error: new DashJSError(ProtectionErrors.SERVER_CERTIFICATE_UPDATED_ERROR_CODE, ProtectionErrors.SERVER_CERTIFICATE_UPDATED_ERROR_MESSAGE + error.name) });\n });\n }\n\n /**\n * Create a key session, a session token and initialize a request by calling generateRequest\n * @param ksInfo\n */\n function createKeySession(ksInfo) {\n if (!keySystem || !mediaKeys) {\n throw new Error('Can not create sessions until you have selected a key system');\n }\n\n const session = mediaKeys.createSession(ksInfo.sessionType);\n const sessionToken = createSessionToken(session, ksInfo);\n\n\n // The \"keyids\" type is used for Clearkey when keys are provided directly in the protection data and a request to a license server is not needed\n const dataType = keySystem.systemString === ProtectionConstants.CLEARKEY_KEYSTEM_STRING && (ksInfo.initData || (ksInfo.protData && ksInfo.protData.clearkeys)) ? ProtectionConstants.INITIALIZATION_DATA_TYPE_KEYIDS : ProtectionConstants.INITIALIZATION_DATA_TYPE_CENC;\n\n session.generateRequest(dataType, ksInfo.initData).then(function () {\n logger.debug('DRM: Session created. SessionID = ' + sessionToken.getSessionId());\n eventBus.trigger(events.KEY_SESSION_CREATED, { data: sessionToken });\n }).catch(function (error) {\n removeSession(sessionToken);\n eventBus.trigger(events.KEY_SESSION_CREATED, {\n data: null,\n error: new DashJSError(ProtectionErrors.KEY_SESSION_CREATED_ERROR_CODE, ProtectionErrors.KEY_SESSION_CREATED_ERROR_MESSAGE + 'Error generating key request -- ' + error.name)\n });\n });\n }\n\n function updateKeySession(sessionToken, message) {\n const session = sessionToken.session;\n\n // Send our request to the key session\n if (protectionKeyController.isClearKey(keySystem)) {\n message = message.toJWK();\n }\n session.update(message)\n .then(() => {\n eventBus.trigger(events.KEY_SESSION_UPDATED);\n })\n .catch(function (error) {\n eventBus.trigger(events.KEY_ERROR, { error: new DashJSError(ProtectionErrors.MEDIA_KEYERR_CODE, 'Error sending update() message! ' + error.name, sessionToken) });\n });\n }\n\n function loadKeySession(ksInfo) {\n if (!keySystem || !mediaKeys) {\n throw new Error('Can not load sessions until you have selected a key system');\n }\n\n const sessionId = ksInfo.sessionId;\n\n // Check if session Id is not already loaded or loading\n for (let i = 0; i < sessions.length; i++) {\n if (sessionId === sessions[i].sessionId) {\n logger.warn('DRM: Ignoring session ID because we have already seen it!');\n return;\n }\n }\n\n const session = mediaKeys.createSession(ksInfo.sessionType);\n const sessionToken = createSessionToken(session, ksInfo);\n\n // Load persisted session data into our newly created session object\n session.load(sessionId).then(function (success) {\n if (success) {\n logger.debug('DRM: Session loaded. SessionID = ' + sessionToken.getSessionId());\n eventBus.trigger(events.KEY_SESSION_CREATED, { data: sessionToken });\n } else {\n removeSession(sessionToken);\n eventBus.trigger(events.KEY_SESSION_CREATED, {\n data: null,\n error: new DashJSError(ProtectionErrors.KEY_SESSION_CREATED_ERROR_CODE, ProtectionErrors.KEY_SESSION_CREATED_ERROR_MESSAGE + 'Could not load session! Invalid Session ID (' + sessionId + ')')\n });\n }\n }).catch(function (error) {\n removeSession(sessionToken);\n eventBus.trigger(events.KEY_SESSION_CREATED, {\n data: null,\n error: new DashJSError(ProtectionErrors.KEY_SESSION_CREATED_ERROR_CODE, ProtectionErrors.KEY_SESSION_CREATED_ERROR_MESSAGE + 'Could not load session (' + sessionId + ')! ' + error.name)\n });\n });\n }\n\n function removeKeySession(sessionToken) {\n const session = sessionToken.session;\n\n session.remove().then(function () {\n logger.debug('DRM: Session removed. SessionID = ' + sessionToken.getSessionId());\n eventBus.trigger(events.KEY_SESSION_REMOVED, { data: sessionToken.getSessionId() });\n }, function (error) {\n eventBus.trigger(events.KEY_SESSION_REMOVED, {\n data: null,\n error: 'Error removing session (' + sessionToken.getSessionId() + '). ' + error.name\n });\n\n });\n }\n\n function closeKeySession(sessionToken) {\n // Send our request to the key session\n _closeKeySessionInternal(sessionToken).catch(function (error) {\n removeSession(sessionToken);\n eventBus.trigger(events.KEY_SESSION_CLOSED, {\n data: null,\n error: 'Error closing session (' + sessionToken.getSessionId() + ') ' + error.name\n });\n });\n }\n\n function _closeKeySessionInternal(sessionToken) {\n if (!sessionToken || !sessionToken.session) {\n return Promise.resolve;\n }\n const session = sessionToken.session;\n\n // Remove event listeners\n session.removeEventListener('keystatuseschange', sessionToken);\n session.removeEventListener('message', sessionToken);\n\n // Send our request to the key session\n return session.close();\n }\n\n // This is our main event handler for all desired HTMLMediaElement events\n // related to EME. These events are translated into our API-independent\n // versions of the same events\n function createEventHandler() {\n return {\n handleEvent: function (event) {\n switch (event.type) {\n case 'encrypted':\n if (event.initData) {\n let initData = ArrayBuffer.isView(event.initData) ? event.initData.buffer : event.initData;\n eventBus.trigger(events.NEED_KEY, { key: new NeedKey(initData, event.initDataType) });\n }\n break;\n }\n }\n };\n }\n\n function removeSession(token) {\n // Remove from our session list\n for (let i = 0; i < sessions.length; i++) {\n if (sessions[i] === token) {\n sessions.splice(i, 1);\n break;\n }\n }\n }\n\n function parseKeyStatus(args) {\n // Edge and Chrome implement different version of keystatues, param are not on same order\n let status, keyId;\n if (args && args.length > 0) {\n if (args[0]) {\n if (typeof args[0] === 'string') {\n status = args[0];\n } else {\n keyId = args[0];\n }\n }\n\n if (args[1]) {\n if (typeof args[1] === 'string') {\n status = args[1];\n } else {\n keyId = args[1];\n }\n }\n }\n return {\n status: status,\n keyId: keyId\n };\n }\n\n // Function to create our session token objects which manage the EME\n // MediaKeySession and session-specific event handler\n function createSessionToken(session, ksInfo) {\n const token = { // Implements SessionToken\n session: session,\n keyId: ksInfo.keyId,\n initData: ksInfo.initData,\n sessionId: ksInfo.sessionId,\n sessionType: ksInfo.sessionType,\n\n // This is our main event handler for all desired MediaKeySession events\n // These events are translated into our API-independent versions of the\n // same events\n handleEvent: function (event) {\n switch (event.type) {\n case 'keystatuseschange':\n eventBus.trigger(events.KEY_STATUSES_CHANGED, { data: this });\n event.target.keyStatuses.forEach(function () {\n let keyStatus = parseKeyStatus(arguments);\n switch (keyStatus.status) {\n case 'expired':\n eventBus.trigger(events.INTERNAL_KEY_STATUS_CHANGED, { error: new DashJSError(ProtectionErrors.KEY_STATUS_CHANGED_EXPIRED_ERROR_CODE, ProtectionErrors.KEY_STATUS_CHANGED_EXPIRED_ERROR_MESSAGE) });\n break;\n default:\n eventBus.trigger(events.INTERNAL_KEY_STATUS_CHANGED, keyStatus);\n break;\n }\n });\n break;\n\n case 'message':\n let message = ArrayBuffer.isView(event.message) ? event.message.buffer : event.message;\n eventBus.trigger(events.INTERNAL_KEY_MESSAGE, { data: new KeyMessage(this, message, undefined, event.messageType) });\n break;\n }\n },\n\n getKeyId: function () {\n return this.keyId;\n },\n\n getSessionId: function () {\n return session.sessionId;\n },\n\n getSessionType: function () {\n return this.sessionType;\n },\n\n getExpirationTime: function () {\n return session.expiration;\n },\n\n getKeyStatuses: function () {\n return session.keyStatuses;\n },\n\n getUsable: function () {\n let usable = false;\n session.keyStatuses.forEach(function () {\n let keyStatus = parseKeyStatus(arguments);\n if (keyStatus.status === 'usable') {\n usable = true;\n }\n });\n return usable;\n }\n };\n\n // Add all event listeners\n session.addEventListener('keystatuseschange', token);\n session.addEventListener('message', token);\n\n // Register callback for session closed Promise\n session.closed.then(() => {\n removeSession(token);\n logger.debug('DRM: Session closed. SessionID = ' + token.getSessionId());\n eventBus.trigger(events.KEY_SESSION_CLOSED, { data: token.getSessionId() });\n });\n\n // Add to our session list\n sessions.push(token);\n\n return token;\n }\n\n instance = {\n getAllInitData,\n getSessions,\n requestKeySystemAccess,\n selectKeySystem,\n setMediaElement,\n setServerCertificate,\n createKeySession,\n updateKeySession,\n loadKeySession,\n removeKeySession,\n closeKeySession,\n stop,\n reset\n };\n\n setup();\n\n return instance;\n}\n\nProtectionModel_21Jan2015.__dashjs_factory_name = 'ProtectionModel_21Jan2015';\nexport default dashjs.FactoryMaker.getClassFactory(ProtectionModel_21Jan2015); /* jshint ignore:line */\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n * Implementation of the EME APIs as of the 3 Feb 2014 state of the specification.\n *\n * Implemented by Internet Explorer 11 (Windows 8.1)\n *\n * @implements ProtectionModel\n * @class\n */\n\nimport ProtectionKeyController from '../controllers/ProtectionKeyController';\nimport NeedKey from '../vo/NeedKey';\nimport DashJSError from '../../vo/DashJSError';\nimport ProtectionErrors from '../errors/ProtectionErrors';\nimport KeyMessage from '../vo/KeyMessage';\nimport KeySystemConfiguration from '../vo/KeySystemConfiguration';\nimport KeySystemAccess from '../vo/KeySystemAccess';\n\nfunction ProtectionModel_3Feb2014(config) {\n\n config = config || {};\n const context = this.context;\n const eventBus = config.eventBus;//Need to pass in here so we can use same instance since this is optional module\n const events = config.events;\n const debug = config.debug;\n const api = config.api;\n\n let instance,\n logger,\n videoElement,\n keySystem,\n mediaKeys,\n keySystemAccess,\n sessions,\n eventHandler,\n protectionKeyController;\n\n function setup() {\n logger = debug.getLogger(instance);\n videoElement = null;\n keySystem = null;\n mediaKeys = null;\n keySystemAccess = null;\n sessions = [];\n protectionKeyController = ProtectionKeyController(context).getInstance();\n eventHandler = createEventHandler();\n }\n\n function reset() {\n try {\n for (let i = 0; i < sessions.length; i++) {\n closeKeySession(sessions[i]);\n }\n if (videoElement) {\n videoElement.removeEventListener(api.needkey, eventHandler);\n }\n eventBus.trigger(events.TEARDOWN_COMPLETE);\n } catch (error) {\n eventBus.trigger(events.TEARDOWN_COMPLETE, { error: 'Error tearing down key sessions and MediaKeys! -- ' + error.message });\n }\n }\n\n function getAllInitData() {\n const retVal = [];\n for (let i = 0; i < sessions.length; i++) {\n retVal.push(sessions[i].initData);\n }\n return retVal;\n }\n\n function getSessions() {\n return sessions;\n }\n\n function requestKeySystemAccess(ksConfigurations) {\n return new Promise((resolve, reject) => {\n // Try key systems in order, first one with supported key system configuration\n // is used\n let found = false;\n for (let ksIdx = 0; ksIdx < ksConfigurations.length; ksIdx++) {\n const systemString = ksConfigurations[ksIdx].ks.systemString;\n const configs = ksConfigurations[ksIdx].configs;\n let supportedAudio = null;\n let supportedVideo = null;\n\n // Try key system configs in order, first one with supported audio/video\n // is used\n for (let configIdx = 0; configIdx < configs.length; configIdx++) {\n const audios = configs[configIdx].audioCapabilities;\n const videos = configs[configIdx].videoCapabilities;\n\n // Look for supported audio container/codecs\n if (audios && audios.length !== 0) {\n supportedAudio = []; // Indicates that we have a requested audio config\n for (let audioIdx = 0; audioIdx < audios.length; audioIdx++) {\n if (window[api.MediaKeys].isTypeSupported(systemString, audios[audioIdx].contentType)) {\n supportedAudio.push(audios[audioIdx]);\n }\n }\n }\n\n // Look for supported video container/codecs\n if (videos && videos.length !== 0) {\n supportedVideo = []; // Indicates that we have a requested video config\n for (let videoIdx = 0; videoIdx < videos.length; videoIdx++) {\n if (window[api.MediaKeys].isTypeSupported(systemString, videos[videoIdx].contentType)) {\n supportedVideo.push(videos[videoIdx]);\n }\n }\n }\n\n // No supported audio or video in this configuration OR we have\n // requested audio or video configuration that is not supported\n if ((!supportedAudio && !supportedVideo) ||\n (supportedAudio && supportedAudio.length === 0) ||\n (supportedVideo && supportedVideo.length === 0)) {\n continue;\n }\n\n // This configuration is supported\n found = true;\n const ksConfig = new KeySystemConfiguration(supportedAudio, supportedVideo);\n const ks = protectionKeyController.getKeySystemBySystemString(systemString);\n const keySystemAccess = new KeySystemAccess(ks, ksConfig);\n eventBus.trigger(events.KEY_SYSTEM_ACCESS_COMPLETE, { data: keySystemAccess });\n resolve({ data: keySystemAccess });\n break;\n }\n }\n if (!found) {\n const errorMessage = 'Key system access denied! -- No valid audio/video content configurations detected!';\n eventBus.trigger(events.KEY_SYSTEM_ACCESS_COMPLETE, { error: errorMessage });\n reject({ error: errorMessage });\n }\n })\n }\n\n function selectKeySystem(ksAccess) {\n return new Promise((resolve, reject) => {\n try {\n mediaKeys = ksAccess.mediaKeys = new window[api.MediaKeys](ksAccess.keySystem.systemString);\n keySystem = ksAccess.keySystem;\n keySystemAccess = ksAccess;\n if (videoElement) {\n setMediaKeys();\n }\n resolve(keySystem);\n } catch (error) {\n reject({ error: 'Error selecting keys system (' + keySystem.systemString + ')! Could not create MediaKeys -- TODO' });\n }\n })\n }\n\n function setMediaElement(mediaElement) {\n if (videoElement === mediaElement)\n return;\n\n // Replacing the previous element\n if (videoElement) {\n videoElement.removeEventListener(api.needkey, eventHandler);\n }\n\n videoElement = mediaElement;\n\n // Only if we are not detaching from the existing element\n if (videoElement) {\n videoElement.addEventListener(api.needkey, eventHandler);\n if (mediaKeys) {\n setMediaKeys();\n }\n }\n }\n\n function createKeySession(ksInfo) {\n if (!keySystem || !mediaKeys || !keySystemAccess) {\n throw new Error('Can not create sessions until you have selected a key system');\n }\n\n // Use the first video capability for the contentType.\n // TODO: Not sure if there is a way to concatenate all capability data into a RFC6386-compatible format\n\n // If player is trying to playback Audio only stream - don't error out.\n let capabilities = null;\n\n if (keySystemAccess.ksConfiguration.videoCapabilities && keySystemAccess.ksConfiguration.videoCapabilities.length > 0) {\n capabilities = keySystemAccess.ksConfiguration.videoCapabilities[0];\n }\n\n if (capabilities === null && keySystemAccess.ksConfiguration.audioCapabilities && keySystemAccess.ksConfiguration.audioCapabilities.length > 0) {\n capabilities = keySystemAccess.ksConfiguration.audioCapabilities[0];\n }\n\n if (capabilities === null) {\n throw new Error('Can not create sessions for unknown content types.');\n }\n\n const contentType = capabilities.contentType;\n const session = mediaKeys.createSession(contentType, new Uint8Array(ksInfo.initData), ksInfo.cdmData ? new Uint8Array(ksInfo.cdmData) : null);\n const sessionToken = createSessionToken(session, ksInfo);\n\n // Add all event listeners\n session.addEventListener(api.error, sessionToken);\n session.addEventListener(api.message, sessionToken);\n session.addEventListener(api.ready, sessionToken);\n session.addEventListener(api.close, sessionToken);\n\n // Add to our session list\n sessions.push(sessionToken);\n logger.debug('DRM: Session created. SessionID = ' + sessionToken.getSessionId());\n eventBus.trigger(events.KEY_SESSION_CREATED, { data: sessionToken });\n }\n\n function updateKeySession(sessionToken, message) {\n const session = sessionToken.session;\n\n if (!protectionKeyController.isClearKey(keySystem)) {\n // Send our request to the key session\n session.update(new Uint8Array(message));\n } else {\n // For clearkey, message is a ClearKeyKeySet\n session.update(new Uint8Array(message.toJWK()));\n }\n eventBus.trigger(events.KEY_SESSION_UPDATED);\n }\n\n /**\n * Close the given session and release all associated keys. Following\n * this call, the sessionToken becomes invalid\n *\n * @param {Object} sessionToken - the session token\n */\n function closeKeySession(sessionToken) {\n const session = sessionToken.session;\n\n // Remove event listeners\n session.removeEventListener(api.error, sessionToken);\n session.removeEventListener(api.message, sessionToken);\n session.removeEventListener(api.ready, sessionToken);\n session.removeEventListener(api.close, sessionToken);\n\n // Remove from our session list\n for (let i = 0; i < sessions.length; i++) {\n if (sessions[i] === sessionToken) {\n sessions.splice(i, 1);\n break;\n }\n }\n\n // Send our request to the key session\n session[api.release]();\n }\n\n function setServerCertificate(/*serverCertificate*/) { /* Not supported */\n }\n\n function loadKeySession(/*ksInfo*/) { /* Not supported */\n }\n\n function removeKeySession(/*sessionToken*/) { /* Not supported */\n }\n\n\n function createEventHandler() {\n return {\n handleEvent: function (event) {\n switch (event.type) {\n\n case api.needkey:\n if (event.initData) {\n const initData = ArrayBuffer.isView(event.initData) ? event.initData.buffer : event.initData;\n eventBus.trigger(events.NEED_KEY, { key: new NeedKey(initData, 'cenc') });\n }\n break;\n }\n }\n };\n }\n\n\n // IE11 does not let you set MediaKeys until it has entered a certain\n // readyState, so we need this logic to ensure we don't set the keys\n // too early\n function setMediaKeys() {\n let boundDoSetKeys = null;\n const doSetKeys = function () {\n videoElement.removeEventListener('loadedmetadata', boundDoSetKeys);\n videoElement[api.setMediaKeys](mediaKeys);\n eventBus.trigger(events.VIDEO_ELEMENT_SELECTED);\n };\n if (videoElement.readyState >= 1) {\n doSetKeys();\n } else {\n boundDoSetKeys = doSetKeys.bind(this);\n videoElement.addEventListener('loadedmetadata', boundDoSetKeys);\n }\n\n }\n\n // Function to create our session token objects which manage the EME\n // MediaKeySession and session-specific event handler\n function createSessionToken(keySession, ksInfo) {\n return {\n // Implements SessionToken\n session: keySession,\n keyId: ksInfo.keyId,\n initData: ksInfo.initData,\n\n getKeyId: function () {\n return this.keyId;\n },\n\n getSessionId: function () {\n return this.session.sessionId;\n },\n\n getExpirationTime: function () {\n return NaN;\n },\n\n getSessionType: function () {\n return 'temporary';\n },\n\n // This is our main event handler for all desired MediaKeySession events\n // These events are translated into our API-independent versions of the\n // same events\n handleEvent: function (event) {\n switch (event.type) {\n case api.error:\n let errorStr = 'KeyError'; // TODO: Make better string from event\n eventBus.trigger(events.KEY_ERROR, { error: new DashJSError(ProtectionErrors.MEDIA_KEYERR_CODE, errorStr, this) });\n break;\n case api.message:\n let message = ArrayBuffer.isView(event.message) ? event.message.buffer : event.message;\n eventBus.trigger(events.INTERNAL_KEY_MESSAGE, { data: new KeyMessage(this, message, event.destinationURL) });\n break;\n case api.ready:\n logger.debug('DRM: Key added.');\n eventBus.trigger(events.KEY_ADDED);\n break;\n\n case api.close:\n logger.debug('DRM: Session closed. SessionID = ' + this.getSessionId());\n eventBus.trigger(events.KEY_SESSION_CLOSED, { data: this.getSessionId() });\n break;\n }\n }\n };\n }\n\n instance = {\n getAllInitData,\n getSessions,\n requestKeySystemAccess,\n selectKeySystem,\n setMediaElement,\n createKeySession,\n updateKeySession,\n closeKeySession,\n setServerCertificate,\n loadKeySession,\n removeKeySession,\n stop: reset,\n reset\n };\n\n setup();\n\n return instance;\n}\n\nProtectionModel_3Feb2014.__dashjs_factory_name = 'ProtectionModel_3Feb2014';\nexport default dashjs.FactoryMaker.getClassFactory(ProtectionModel_3Feb2014); /* jshint ignore:line */\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n * Initial implementation of EME\n *\n * Implemented by Google Chrome prior to v36\n *\n * @implements ProtectionModel\n * @class\n */\nimport ProtectionKeyController from '../controllers/ProtectionKeyController';\nimport NeedKey from '../vo/NeedKey';\nimport DashJSError from '../../vo/DashJSError';\nimport KeyMessage from '../vo/KeyMessage';\nimport KeySystemConfiguration from '../vo/KeySystemConfiguration';\nimport KeySystemAccess from '../vo/KeySystemAccess';\nimport ProtectionErrors from '../errors/ProtectionErrors';\n\nfunction ProtectionModel_01b(config) {\n\n config = config || {};\n const context = this.context;\n const eventBus = config.eventBus;//Need to pass in here so we can use same instance since this is optional module\n const events = config.events;\n const debug = config.debug;\n const api = config.api;\n const errHandler = config.errHandler;\n\n let instance,\n logger,\n videoElement,\n keySystem,\n protectionKeyController,\n\n // With this version of the EME APIs, sessionIds are not assigned to\n // sessions until the first key message is received. We are assuming\n // that in the case of multiple sessions, key messages will be received\n // in the order that generateKeyRequest() is called.\n // Holding spot for newly-created sessions until we determine whether or\n // not the CDM supports sessionIds\n pendingSessions,\n\n // List of sessions that have been initialized. Only the first position will\n // be used in the case that the CDM does not support sessionIds\n sessions,\n\n // Not all CDMs support the notion of sessionIds. Without sessionIds\n // there is no way for us to differentiate between sessions, therefore\n // we must only allow a single session. Once we receive the first key\n // message we can set this flag to determine if more sessions are allowed\n moreSessionsAllowed,\n\n // This is our main event handler for all desired HTMLMediaElement events\n // related to EME. These events are translated into our API-independent\n // versions of the same events\n eventHandler;\n\n function setup() {\n logger = debug.getLogger(instance);\n videoElement = null;\n keySystem = null;\n pendingSessions = [];\n sessions = [];\n protectionKeyController = ProtectionKeyController(context).getInstance();\n eventHandler = createEventHandler();\n }\n\n function reset() {\n if (videoElement) {\n removeEventListeners();\n }\n for (let i = 0; i < sessions.length; i++) {\n closeKeySession(sessions[i]);\n }\n eventBus.trigger(events.TEARDOWN_COMPLETE);\n }\n\n function getAllInitData() {\n const retVal = [];\n for (let i = 0; i < pendingSessions.length; i++) {\n retVal.push(pendingSessions[i].initData);\n }\n for (let i = 0; i < sessions.length; i++) {\n retVal.push(sessions[i].initData);\n }\n return retVal;\n }\n\n function getSessions() {\n return sessions.concat(pendingSessions);\n }\n\n function requestKeySystemAccess(ksConfigurations) {\n return new Promise((resolve, reject) => {\n let ve = videoElement;\n if (!ve) { // Must have a video element to do this capability tests\n ve = document.createElement('video');\n }\n\n // Try key systems in order, first one with supported key system configuration\n // is used\n let found = false;\n for (let ksIdx = 0; ksIdx < ksConfigurations.length; ksIdx++) {\n const systemString = ksConfigurations[ksIdx].ks.systemString;\n const configs = ksConfigurations[ksIdx].configs;\n let supportedAudio = null;\n let supportedVideo = null;\n\n // Try key system configs in order, first one with supported audio/video\n // is used\n for (let configIdx = 0; configIdx < configs.length; configIdx++) {\n //let audios = configs[configIdx].audioCapabilities;\n const videos = configs[configIdx].videoCapabilities;\n // Look for supported video container/codecs\n if (videos && videos.length !== 0) {\n supportedVideo = []; // Indicates that we have a requested video config\n for (let videoIdx = 0; videoIdx < videos.length; videoIdx++) {\n if (ve.canPlayType(videos[videoIdx].contentType, systemString) !== '') {\n supportedVideo.push(videos[videoIdx]);\n }\n }\n }\n\n // No supported audio or video in this configuration OR we have\n // requested audio or video configuration that is not supported\n if ((!supportedAudio && !supportedVideo) ||\n (supportedAudio && supportedAudio.length === 0) ||\n (supportedVideo && supportedVideo.length === 0)) {\n continue;\n }\n\n // This configuration is supported\n found = true;\n const ksConfig = new KeySystemConfiguration(supportedAudio, supportedVideo);\n const ks = protectionKeyController.getKeySystemBySystemString(systemString);\n const keySystemAccess = new KeySystemAccess(ks, ksConfig)\n eventBus.trigger(events.KEY_SYSTEM_ACCESS_COMPLETE, { data: keySystemAccess });\n resolve({ data: keySystemAccess });\n break;\n }\n }\n if (!found) {\n const errorMessage = 'Key system access denied! -- No valid audio/video content configurations detected!';\n eventBus.trigger(events.KEY_SYSTEM_ACCESS_COMPLETE, { error: errorMessage });\n reject({ error: errorMessage });\n }\n })\n\n }\n\n function selectKeySystem(keySystemAccess) {\n keySystem = keySystemAccess.keySystem;\n return Promise.resolve(keySystem);\n }\n\n function setMediaElement(mediaElement) {\n if (videoElement === mediaElement) {\n return;\n }\n\n // Replacing the previous element\n if (videoElement) {\n removeEventListeners();\n\n // Close any open sessions - avoids memory leak on LG webOS 2016/2017 TVs\n for (var i = 0; i < sessions.length; i++) {\n closeKeySession(sessions[i]);\n }\n sessions = [];\n }\n\n videoElement = mediaElement;\n\n // Only if we are not detaching from the existing element\n if (videoElement) {\n videoElement.addEventListener(api.keyerror, eventHandler);\n videoElement.addEventListener(api.needkey, eventHandler);\n videoElement.addEventListener(api.keymessage, eventHandler);\n videoElement.addEventListener(api.keyadded, eventHandler);\n eventBus.trigger(events.VIDEO_ELEMENT_SELECTED);\n }\n }\n\n function createKeySession(ksInfo) {\n if (!keySystem) {\n throw new Error('Can not create sessions until you have selected a key system');\n }\n\n // Determine if creating a new session is allowed\n if (moreSessionsAllowed || sessions.length === 0) {\n const newSession = { // Implements SessionToken\n sessionId: null,\n keyId: ksInfo.keyId,\n initData: ksInfo.initData,\n\n getKeyId: function () {\n return this.keyId;\n },\n\n getSessionId: function () {\n return this.sessionId;\n },\n\n getExpirationTime: function () {\n return NaN;\n },\n\n getSessionType: function () {\n return 'temporary';\n }\n };\n pendingSessions.push(newSession);\n\n // Send our request to the CDM\n videoElement[api.generateKeyRequest](keySystem.systemString, new Uint8Array(ksInfo.initData));\n\n return newSession;\n\n } else {\n throw new Error('Multiple sessions not allowed!');\n }\n\n }\n\n function updateKeySession(sessionToken, message) {\n const sessionId = sessionToken.sessionId;\n if (!protectionKeyController.isClearKey(keySystem)) {\n // Send our request to the CDM\n videoElement[api.addKey](keySystem.systemString,\n new Uint8Array(message), new Uint8Array(sessionToken.initData), sessionId);\n } else {\n // For clearkey, message is a ClearKeyKeySet\n for (let i = 0; i < message.keyPairs.length; i++) {\n videoElement[api.addKey](keySystem.systemString,\n message.keyPairs[i].key, message.keyPairs[i].keyID, sessionId);\n }\n }\n eventBus.trigger(events.KEY_SESSION_UPDATED);\n }\n\n function closeKeySession(sessionToken) {\n // Send our request to the CDM\n try {\n videoElement[api.cancelKeyRequest](keySystem.systemString, sessionToken.sessionId);\n } catch (error) {\n eventBus.trigger(events.KEY_SESSION_CLOSED, {\n data: null,\n error: 'Error closing session (' + sessionToken.sessionId + ') ' + error.message\n });\n }\n }\n\n function setServerCertificate(/*serverCertificate*/) { /* Not supported */\n }\n\n function loadKeySession(/*ksInfo*/) { /* Not supported */\n }\n\n function removeKeySession(/*sessionToken*/) { /* Not supported */\n }\n\n function createEventHandler() {\n return {\n handleEvent: function (event) {\n let sessionToken = null;\n switch (event.type) {\n case api.needkey:\n let initData = ArrayBuffer.isView(event.initData) ? event.initData.buffer : event.initData;\n eventBus.trigger(events.NEED_KEY, { key: new NeedKey(initData, 'cenc') });\n break;\n\n case api.keyerror:\n sessionToken = findSessionByID(sessions, event.sessionId);\n if (!sessionToken) {\n sessionToken = findSessionByID(pendingSessions, event.sessionId);\n }\n\n if (sessionToken) {\n let code = ProtectionErrors.MEDIA_KEYERR_CODE;\n let msg = '';\n switch (event.errorCode.code) {\n case 1:\n code = ProtectionErrors.MEDIA_KEYERR_UNKNOWN_CODE;\n msg += 'MEDIA_KEYERR_UNKNOWN - ' + ProtectionErrors.MEDIA_KEYERR_UNKNOWN_MESSAGE;\n break;\n case 2:\n code = ProtectionErrors.MEDIA_KEYERR_CLIENT_CODE;\n msg += 'MEDIA_KEYERR_CLIENT - ' + ProtectionErrors.MEDIA_KEYERR_CLIENT_MESSAGE;\n break;\n case 3:\n code = ProtectionErrors.MEDIA_KEYERR_SERVICE_CODE;\n msg += 'MEDIA_KEYERR_SERVICE - ' + ProtectionErrors.MEDIA_KEYERR_SERVICE_MESSAGE;\n break;\n case 4:\n code = ProtectionErrors.MEDIA_KEYERR_OUTPUT_CODE;\n msg += 'MEDIA_KEYERR_OUTPUT - ' + ProtectionErrors.MEDIA_KEYERR_OUTPUT_MESSAGE;\n break;\n case 5:\n code = ProtectionErrors.MEDIA_KEYERR_HARDWARECHANGE_CODE;\n msg += 'MEDIA_KEYERR_HARDWARECHANGE - ' + ProtectionErrors.MEDIA_KEYERR_HARDWARECHANGE_MESSAGE;\n break;\n case 6:\n code = ProtectionErrors.MEDIA_KEYERR_DOMAIN_CODE;\n msg += 'MEDIA_KEYERR_DOMAIN - ' + ProtectionErrors.MEDIA_KEYERR_DOMAIN_MESSAGE;\n break;\n }\n msg += ' System Code = ' + event.systemCode;\n // TODO: Build error string based on key error\n eventBus.trigger(events.KEY_ERROR, { error: new DashJSError(code, msg, sessionToken) });\n } else {\n logger.error('No session token found for key error');\n }\n break;\n\n case api.keyadded:\n sessionToken = findSessionByID(sessions, event.sessionId);\n if (!sessionToken) {\n sessionToken = findSessionByID(pendingSessions, event.sessionId);\n }\n\n if (sessionToken) {\n logger.debug('DRM: Key added.');\n eventBus.trigger(events.KEY_ADDED, { data: sessionToken });//TODO not sure anything is using sessionToken? why there?\n } else {\n logger.debug('No session token found for key added');\n }\n break;\n\n case api.keymessage:\n // If this CDM does not support session IDs, we will be limited\n // to a single session\n moreSessionsAllowed = (event.sessionId !== null) && (event.sessionId !== undefined);\n\n // SessionIDs supported\n if (moreSessionsAllowed) {\n // Attempt to find an uninitialized token with this sessionId\n sessionToken = findSessionByID(sessions, event.sessionId);\n if (!sessionToken && pendingSessions.length > 0) {\n\n // This is the first message for our latest session, so set the\n // sessionId and add it to our list\n sessionToken = pendingSessions.shift();\n sessions.push(sessionToken);\n sessionToken.sessionId = event.sessionId;\n\n eventBus.trigger(events.KEY_SESSION_CREATED, { data: sessionToken });\n }\n } else if (pendingSessions.length > 0) { // SessionIDs not supported\n sessionToken = pendingSessions.shift();\n sessions.push(sessionToken);\n\n if (pendingSessions.length !== 0) {\n errHandler.error(new DashJSError(ProtectionErrors.MEDIA_KEY_MESSAGE_ERROR_CODE, ProtectionErrors.MEDIA_KEY_MESSAGE_ERROR_MESSAGE));\n }\n }\n\n if (sessionToken) {\n let message = ArrayBuffer.isView(event.message) ? event.message.buffer : event.message;\n\n // For ClearKey, the spec mandates that you pass this message to the\n // addKey method, so we always save it to the token since there is no\n // way to tell which key system is in use\n sessionToken.keyMessage = message;\n eventBus.trigger(events.INTERNAL_KEY_MESSAGE, { data: new KeyMessage(sessionToken, message, event.defaultURL) });\n\n } else {\n logger.warn('No session token found for key message');\n }\n break;\n }\n }\n };\n }\n\n\n /**\n * Helper function to retrieve the stored session token based on a given\n * sessionId value\n *\n * @param {Array} sessionArray - the array of sessions to search\n * @param {*} sessionId - the sessionId to search for\n * @returns {*} the session token with the given sessionId\n */\n function findSessionByID(sessionArray, sessionId) {\n if (!sessionId || !sessionArray) {\n return null;\n } else {\n const len = sessionArray.length;\n for (let i = 0; i < len; i++) {\n if (sessionArray[i].sessionId == sessionId) {\n return sessionArray[i];\n }\n }\n return null;\n }\n }\n\n function removeEventListeners() {\n videoElement.removeEventListener(api.keyerror, eventHandler);\n videoElement.removeEventListener(api.needkey, eventHandler);\n videoElement.removeEventListener(api.keymessage, eventHandler);\n videoElement.removeEventListener(api.keyadded, eventHandler);\n }\n\n instance = {\n getAllInitData,\n getSessions,\n requestKeySystemAccess,\n selectKeySystem,\n setMediaElement,\n createKeySession,\n updateKeySession,\n closeKeySession,\n setServerCertificate,\n loadKeySession,\n removeKeySession,\n stop: reset,\n reset\n };\n\n setup();\n\n return instance;\n}\n\nProtectionModel_01b.__dashjs_factory_name = 'ProtectionModel_01b';\nexport default dashjs.FactoryMaker.getClassFactory(ProtectionModel_01b); /* jshint ignore:line */\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport ProtectionController from './controllers/ProtectionController';\nimport ProtectionKeyController from './controllers/ProtectionKeyController';\nimport ProtectionEvents from './ProtectionEvents';\nimport ProtectionErrors from './errors/ProtectionErrors';\nimport ProtectionModel_21Jan2015 from './models/ProtectionModel_21Jan2015';\nimport ProtectionModel_3Feb2014 from './models/ProtectionModel_3Feb2014';\nimport ProtectionModel_01b from './models/ProtectionModel_01b';\n\nconst APIS_ProtectionModel_01b = [\n // Un-prefixed as per spec\n {\n // Video Element\n generateKeyRequest: 'generateKeyRequest',\n addKey: 'addKey',\n cancelKeyRequest: 'cancelKeyRequest',\n\n // Events\n needkey: 'needkey',\n keyerror: 'keyerror',\n keyadded: 'keyadded',\n keymessage: 'keymessage'\n },\n // Webkit-prefixed (early Chrome versions and Chrome with EME disabled in chrome://flags)\n {\n // Video Element\n generateKeyRequest: 'webkitGenerateKeyRequest',\n addKey: 'webkitAddKey',\n cancelKeyRequest: 'webkitCancelKeyRequest',\n\n // Events\n needkey: 'webkitneedkey',\n keyerror: 'webkitkeyerror',\n keyadded: 'webkitkeyadded',\n keymessage: 'webkitkeymessage'\n }\n];\n\nconst APIS_ProtectionModel_3Feb2014 = [\n // Un-prefixed as per spec\n // Chrome 38-39 (and some earlier versions) with chrome://flags -- Enable Encrypted Media Extensions\n {\n // Video Element\n setMediaKeys: 'setMediaKeys',\n // MediaKeys\n MediaKeys: 'MediaKeys',\n // MediaKeySession\n release: 'close',\n\n // Events\n needkey: 'needkey',\n error: 'keyerror',\n message: 'keymessage',\n ready: 'keyadded',\n close: 'keyclose'\n },\n // MS-prefixed (IE11, Windows 8.1)\n {\n // Video Element\n setMediaKeys: 'msSetMediaKeys',\n // MediaKeys\n MediaKeys: 'MSMediaKeys',\n // MediaKeySession\n release: 'close',\n // Events\n needkey: 'msneedkey',\n error: 'mskeyerror',\n message: 'mskeymessage',\n ready: 'mskeyadded',\n close: 'mskeyclose'\n }\n];\n\nfunction Protection() {\n let instance;\n const context = this.context;\n\n /**\n * Create a ProtectionController and associated ProtectionModel for use with\n * a single piece of content.\n *\n * @param {Object} config\n * @return {ProtectionController} protection controller\n *\n */\n function createProtectionSystem(config) {\n let controller = null;\n\n const protectionKeyController = ProtectionKeyController(context).getInstance();\n protectionKeyController.setConfig({ debug: config.debug, BASE64: config.BASE64, settings: config.settings });\n protectionKeyController.initialize();\n\n let protectionModel = _getProtectionModel(config);\n\n if (!controller && protectionModel) {//TODO add ability to set external controller if still needed at all?\n controller = ProtectionController(context).create({\n protectionModel: protectionModel,\n protectionKeyController: protectionKeyController,\n eventBus: config.eventBus,\n debug: config.debug,\n events: config.events,\n BASE64: config.BASE64,\n constants: config.constants,\n cmcdModel: config.cmcdModel,\n customParametersModel: config.customParametersModel,\n settings: config.settings\n });\n config.capabilities.setEncryptedMediaSupported(true);\n }\n return controller;\n }\n\n function _getProtectionModel(config) {\n const debug = config.debug;\n const logger = debug.getLogger(instance);\n const eventBus = config.eventBus;\n const errHandler = config.errHandler;\n const videoElement = config.videoModel ? config.videoModel.getElement() : null;\n\n if ((!videoElement || videoElement.onencrypted !== undefined) &&\n (!videoElement || videoElement.mediaKeys !== undefined)) {\n logger.info('EME detected on this user agent! (ProtectionModel_21Jan2015)');\n return ProtectionModel_21Jan2015(context).create({\n debug: debug,\n eventBus: eventBus,\n events: config.events\n });\n } else if (_getAPI(videoElement, APIS_ProtectionModel_3Feb2014)) {\n logger.info('EME detected on this user agent! (ProtectionModel_3Feb2014)');\n return ProtectionModel_3Feb2014(context).create({\n debug: debug,\n eventBus: eventBus,\n events: config.events,\n api: _getAPI(videoElement, APIS_ProtectionModel_3Feb2014)\n });\n } else if (_getAPI(videoElement, APIS_ProtectionModel_01b)) {\n logger.info('EME detected on this user agent! (ProtectionModel_01b)');\n return ProtectionModel_01b(context).create({\n debug: debug,\n eventBus: eventBus,\n errHandler: errHandler,\n events: config.events,\n api: _getAPI(videoElement, APIS_ProtectionModel_01b)\n });\n } else {\n logger.warn('No supported version of EME detected on this user agent! - Attempts to play encrypted content will fail!');\n return null;\n }\n }\n\n function _getAPI(videoElement, apis) {\n for (let i = 0; i < apis.length; i++) {\n const api = apis[i];\n // detect if api is supported by browser\n // check only first function in api -> should be fine\n if (typeof videoElement[api[Object.keys(api)[0]]] !== 'function') {\n continue;\n }\n\n return api;\n }\n\n return null;\n }\n\n instance = {\n createProtectionSystem\n };\n\n return instance;\n}\n\nProtection.__dashjs_factory_name = 'Protection';\nconst factory = dashjs.FactoryMaker.getClassFactory(Protection); /* jshint ignore:line */\nfactory.events = ProtectionEvents;\nfactory.errors = ProtectionErrors;\ndashjs.FactoryMaker.updateClassFactory(Protection.__dashjs_factory_name, factory); /* jshint ignore:line */\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport FactoryMaker from '../../core/FactoryMaker';\n\nconst NO_CHANGE = -1;\nconst PRIORITY = {\n DEFAULT: 0.5,\n STRONG: 1,\n WEAK: 0\n};\n\nfunction SwitchRequest(q, r, p) {\n //TODO refactor all the calls to this to use config to be like everything else.\n let instance,\n quality,\n priority,\n reason;\n\n // check priority value\n function getPriority(p) {\n let ret = PRIORITY.DEFAULT;\n\n // check that p is one of declared priority value\n if (p === PRIORITY.DEFAULT || p === PRIORITY.STRONG || p === PRIORITY.WEAK) {\n ret = p;\n }\n return ret;\n }\n\n // init attributes\n quality = (q === undefined) ? NO_CHANGE : q;\n priority = getPriority(p);\n reason = (r === undefined) ? null : r;\n\n instance = {\n quality: quality,\n reason: reason,\n priority: priority\n };\n\n return instance;\n}\n\nSwitchRequest.__dashjs_factory_name = 'SwitchRequest';\nconst factory = FactoryMaker.getClassFactory(SwitchRequest);\nfactory.NO_CHANGE = NO_CHANGE;\nfactory.PRIORITY = PRIORITY;\nFactoryMaker.updateClassFactory(SwitchRequest.__dashjs_factory_name, factory);\n\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport ThroughputRule from './ThroughputRule';\nimport InsufficientBufferRule from './InsufficientBufferRule';\nimport AbandonRequestsRule from './AbandonRequestsRule';\nimport DroppedFramesRule from './DroppedFramesRule';\nimport SwitchHistoryRule from './SwitchHistoryRule';\nimport BolaRule from './BolaRule';\nimport L2ARule from './L2ARule.js';\nimport LoLPRule from './lolp/LoLpRule.js';\nimport FactoryMaker from '../../../core/FactoryMaker';\nimport SwitchRequest from '../SwitchRequest';\nimport Constants from '../../constants/Constants';\n\nconst QUALITY_SWITCH_RULES = 'qualitySwitchRules';\nconst ABANDON_FRAGMENT_RULES = 'abandonFragmentRules';\n\n\nfunction ABRRulesCollection(config) {\n\n config = config || {};\n const context = this.context;\n\n const mediaPlayerModel = config.mediaPlayerModel;\n const customParametersModel = config.customParametersModel;\n const dashMetrics = config.dashMetrics;\n const settings = config.settings;\n\n let instance,\n qualitySwitchRules,\n abandonFragmentRules;\n\n function initialize() {\n qualitySwitchRules = [];\n abandonFragmentRules = [];\n\n if (settings.get().streaming.abr.useDefaultABRRules) {\n\n // If L2A is used we only need this one rule\n if (settings.get().streaming.abr.ABRStrategy === Constants.ABR_STRATEGY_L2A) {\n qualitySwitchRules.push(\n L2ARule(context).create({\n dashMetrics: dashMetrics,\n settings: settings\n })\n );\n }\n // If LoLP is used we only need this one rule\n else if (settings.get().streaming.abr.ABRStrategy === Constants.ABR_STRATEGY_LoLP) {\n qualitySwitchRules.push(\n LoLPRule(context).create({\n dashMetrics: dashMetrics\n })\n );\n } else {\n // Only one of BolaRule and ThroughputRule will give a switchRequest.quality !== SwitchRequest.NO_CHANGE.\n // This is controlled by useBufferOccupancyABR mechanism in AbrController.\n qualitySwitchRules.push(\n BolaRule(context).create({\n dashMetrics: dashMetrics,\n mediaPlayerModel: mediaPlayerModel,\n settings: settings\n })\n );\n\n qualitySwitchRules.push(\n ThroughputRule(context).create({\n dashMetrics: dashMetrics\n })\n );\n\n if (settings.get().streaming.abr.additionalAbrRules.insufficientBufferRule) {\n qualitySwitchRules.push(\n InsufficientBufferRule(context).create({\n dashMetrics: dashMetrics,\n settings\n })\n );\n }\n\n if (settings.get().streaming.abr.additionalAbrRules.switchHistoryRule) {\n qualitySwitchRules.push(\n SwitchHistoryRule(context).create()\n );\n }\n\n if (settings.get().streaming.abr.additionalAbrRules.droppedFramesRule) {\n qualitySwitchRules.push(\n DroppedFramesRule(context).create()\n );\n }\n\n if (settings.get().streaming.abr.additionalAbrRules.abandonRequestsRule) {\n abandonFragmentRules.push(\n AbandonRequestsRule(context).create({\n dashMetrics: dashMetrics,\n mediaPlayerModel: mediaPlayerModel,\n settings: settings\n })\n );\n }\n }\n }\n\n // add custom ABR rules if any\n const customRules = customParametersModel.getAbrCustomRules();\n customRules.forEach(function (rule) {\n if (rule.type === QUALITY_SWITCH_RULES) {\n qualitySwitchRules.push(rule.rule(context).create());\n }\n\n if (rule.type === ABANDON_FRAGMENT_RULES) {\n abandonFragmentRules.push(rule.rule(context).create());\n }\n });\n }\n\n function _getRulesWithChange(srArray) {\n return srArray.filter(sr => sr.quality > SwitchRequest.NO_CHANGE);\n }\n\n /**\n *\n * @param {array} srArray\n * @return {object} SwitchRequest\n */\n function getMinSwitchRequest(srArray) {\n const values = {};\n let newSwitchReq = null;\n let i,\n len,\n req,\n quality,\n reason;\n\n if (srArray.length === 0) {\n return;\n }\n\n values[SwitchRequest.PRIORITY.STRONG] = { quality: SwitchRequest.NO_CHANGE, reason: null };\n values[SwitchRequest.PRIORITY.WEAK] = { quality: SwitchRequest.NO_CHANGE, reason: null };\n values[SwitchRequest.PRIORITY.DEFAULT] = { quality: SwitchRequest.NO_CHANGE, reason: null };\n\n for (i = 0, len = srArray.length; i < len; i += 1) {\n req = srArray[i];\n if (req.quality !== SwitchRequest.NO_CHANGE) {\n // We only use the new quality in case it is lower than the already saved one or if no new quality has been selected for the respective priority\n if (values[req.priority].quality === SwitchRequest.NO_CHANGE || values[req.priority].quality > req.quality) {\n values[req.priority].quality = req.quality;\n values[req.priority].reason = req.reason || null;\n }\n }\n }\n\n if (values[SwitchRequest.PRIORITY.WEAK].quality !== SwitchRequest.NO_CHANGE) {\n newSwitchReq = values[SwitchRequest.PRIORITY.WEAK];\n }\n\n if (values[SwitchRequest.PRIORITY.DEFAULT].quality !== SwitchRequest.NO_CHANGE) {\n newSwitchReq = values[SwitchRequest.PRIORITY.DEFAULT];\n }\n\n if (values[SwitchRequest.PRIORITY.STRONG].quality !== SwitchRequest.NO_CHANGE) {\n newSwitchReq = values[SwitchRequest.PRIORITY.STRONG];\n }\n\n if (newSwitchReq) {\n quality = newSwitchReq.quality;\n reason = newSwitchReq.reason;\n }\n\n return SwitchRequest(context).create(quality, reason);\n }\n\n function getMaxQuality(rulesContext) {\n const switchRequestArray = qualitySwitchRules.map(rule => rule.getMaxIndex(rulesContext));\n const activeRules = _getRulesWithChange(switchRequestArray);\n const maxQuality = getMinSwitchRequest(activeRules);\n\n return maxQuality || SwitchRequest(context).create();\n }\n\n function shouldAbandonFragment(rulesContext, streamId) {\n const abandonRequestArray = abandonFragmentRules.map(rule => rule.shouldAbandon(rulesContext, streamId));\n const activeRules = _getRulesWithChange(abandonRequestArray);\n const shouldAbandon = getMinSwitchRequest(activeRules);\n\n if (shouldAbandon) {\n shouldAbandon.reason.forceAbandon = true\n }\n\n return shouldAbandon || SwitchRequest(context).create();\n }\n\n function reset() {\n [qualitySwitchRules, abandonFragmentRules].forEach(rules => {\n if (rules && rules.length) {\n rules.forEach(rule => rule.reset && rule.reset());\n }\n });\n qualitySwitchRules = [];\n abandonFragmentRules = [];\n }\n\n function getQualitySwitchRules() {\n return qualitySwitchRules;\n }\n\n instance = {\n initialize,\n reset,\n getMaxQuality,\n getMinSwitchRequest,\n shouldAbandonFragment,\n getQualitySwitchRules\n };\n\n return instance;\n}\n\nABRRulesCollection.__dashjs_factory_name = 'ABRRulesCollection';\nconst factory = FactoryMaker.getClassFactory(ABRRulesCollection);\nfactory.QUALITY_SWITCH_RULES = QUALITY_SWITCH_RULES;\nfactory.ABANDON_FRAGMENT_RULES = ABANDON_FRAGMENT_RULES;\nFactoryMaker.updateSingletonFactory(ABRRulesCollection.__dashjs_factory_name, factory);\n\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport SwitchRequest from '../SwitchRequest';\nimport FactoryMaker from '../../../core/FactoryMaker';\nimport Debug from '../../../core/Debug';\n\nfunction AbandonRequestsRule(config) {\n\n config = config || {};\n\n const context = this.context;\n const mediaPlayerModel = config.mediaPlayerModel;\n const dashMetrics = config.dashMetrics;\n const settings = config.settings;\n\n let instance,\n logger,\n fragmentDict,\n abandonDict,\n throughputArray;\n\n function setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n reset();\n }\n\n function setFragmentRequestDict(type, id) {\n fragmentDict[type] = fragmentDict[type] || {};\n fragmentDict[type][id] = fragmentDict[type][id] || {};\n }\n\n function storeLastRequestThroughputByType(type, throughput) {\n throughputArray[type] = throughputArray[type] || [];\n throughputArray[type].push(throughput);\n }\n\n function shouldAbandon(rulesContext) {\n const switchRequest = SwitchRequest(context).create(SwitchRequest.NO_CHANGE, {name: AbandonRequestsRule.__dashjs_factory_name});\n\n if (!rulesContext || !rulesContext.hasOwnProperty('getMediaInfo') || !rulesContext.hasOwnProperty('getMediaType') || !rulesContext.hasOwnProperty('getCurrentRequest') ||\n !rulesContext.hasOwnProperty('getRepresentationInfo') || !rulesContext.hasOwnProperty('getAbrController')) {\n return switchRequest;\n }\n\n const mediaInfo = rulesContext.getMediaInfo();\n const mediaType = rulesContext.getMediaType();\n const streamInfo = rulesContext.getStreamInfo();\n const streamId = streamInfo ? streamInfo.id : null;\n const req = rulesContext.getCurrentRequest();\n\n if (!isNaN(req.index)) {\n setFragmentRequestDict(mediaType, req.index);\n\n const stableBufferTime = mediaPlayerModel.getStableBufferTime();\n const bufferLevel = dashMetrics.getCurrentBufferLevel(mediaType);\n if ( bufferLevel > stableBufferTime ) {\n return switchRequest;\n }\n\n const fragmentInfo = fragmentDict[mediaType][req.index];\n if (fragmentInfo === null || req.firstByteDate === null || abandonDict.hasOwnProperty(fragmentInfo.id)) {\n return switchRequest;\n }\n\n //setup some init info based on first progress event\n if (fragmentInfo.firstByteTime === undefined) {\n throughputArray[mediaType] = [];\n fragmentInfo.firstByteTime = req.firstByteDate.getTime();\n fragmentInfo.segmentDuration = req.duration;\n fragmentInfo.bytesTotal = req.bytesTotal;\n fragmentInfo.id = req.index;\n }\n fragmentInfo.bytesLoaded = req.bytesLoaded;\n fragmentInfo.elapsedTime = new Date().getTime() - fragmentInfo.firstByteTime;\n\n if (fragmentInfo.bytesLoaded > 0 && fragmentInfo.elapsedTime > 0) {\n storeLastRequestThroughputByType(mediaType, Math.round(fragmentInfo.bytesLoaded * 8 / fragmentInfo.elapsedTime));\n }\n\n if (throughputArray[mediaType].length >= settings.get().streaming.abr.abrRulesParameters.abandonRequestsRule.minLengthToAverage &&\n fragmentInfo.elapsedTime > settings.get().streaming.abr.abrRulesParameters.abandonRequestsRule.graceTimeThreshold &&\n fragmentInfo.bytesLoaded < fragmentInfo.bytesTotal) {\n\n const totalSampledValue = throughputArray[mediaType].reduce((a, b) => a + b, 0);\n fragmentInfo.measuredBandwidthInKbps = Math.round(totalSampledValue / throughputArray[mediaType].length);\n fragmentInfo.estimatedTimeOfDownload = +((fragmentInfo.bytesTotal * 8 / fragmentInfo.measuredBandwidthInKbps) / 1000).toFixed(2);\n\n if (fragmentInfo.estimatedTimeOfDownload < fragmentInfo.segmentDuration * settings.get().streaming.abr.abrRulesParameters.abandonRequestsRule.abandonMultiplier || rulesContext.getRepresentationInfo().quality === 0 ) {\n return switchRequest;\n } else if (!abandonDict.hasOwnProperty(fragmentInfo.id)) {\n\n const abrController = rulesContext.getAbrController();\n const bytesRemaining = fragmentInfo.bytesTotal - fragmentInfo.bytesLoaded;\n const bitrateList = abrController.getBitrateList(mediaInfo);\n const quality = abrController.getQualityForBitrate(mediaInfo, fragmentInfo.measuredBandwidthInKbps * settings.get().streaming.abr.bandwidthSafetyFactor, streamId);\n const minQuality = abrController.getMinAllowedIndexFor(mediaType, streamId);\n const newQuality = (minQuality !== undefined) ? Math.max(minQuality, quality) : quality;\n const estimateOtherBytesTotal = fragmentInfo.bytesTotal * bitrateList[newQuality].bitrate / bitrateList[abrController.getQualityFor(mediaType, streamId)].bitrate;\n\n if (bytesRemaining > estimateOtherBytesTotal) {\n switchRequest.quality = newQuality;\n switchRequest.reason.throughput = fragmentInfo.measuredBandwidthInKbps;\n switchRequest.reason.fragmentID = fragmentInfo.id;\n switchRequest.reason.rule = this.getClassName();\n abandonDict[fragmentInfo.id] = fragmentInfo;\n logger.debug('[' + mediaType + '] frag id',fragmentInfo.id,' is asking to abandon and switch to quality to ', newQuality, ' measured bandwidth was', fragmentInfo.measuredBandwidthInKbps);\n delete fragmentDict[mediaType][fragmentInfo.id];\n }\n }\n } else if (fragmentInfo.bytesLoaded === fragmentInfo.bytesTotal) {\n delete fragmentDict[mediaType][fragmentInfo.id];\n }\n }\n\n return switchRequest;\n }\n\n function reset() {\n fragmentDict = {};\n abandonDict = {};\n throughputArray = [];\n }\n\n instance = {\n shouldAbandon: shouldAbandon,\n reset: reset\n };\n\n setup();\n\n return instance;\n}\n\nAbandonRequestsRule.__dashjs_factory_name = 'AbandonRequestsRule';\nexport default FactoryMaker.getClassFactory(AbandonRequestsRule);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2016, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n// For a description of the BOLA adaptive bitrate (ABR) algorithm, see http://arxiv.org/abs/1601.06748\n\nimport MetricsConstants from '../../constants/MetricsConstants';\nimport SwitchRequest from '../SwitchRequest';\nimport FactoryMaker from '../../../core/FactoryMaker';\nimport {HTTPRequest} from '../../vo/metrics/HTTPRequest';\nimport EventBus from '../../../core/EventBus';\nimport Events from '../../../core/events/Events';\nimport Debug from '../../../core/Debug';\nimport MediaPlayerEvents from '../../MediaPlayerEvents';\nimport Constants from '../../constants/Constants';\n\n// BOLA_STATE_ONE_BITRATE : If there is only one bitrate (or initialization failed), always return NO_CHANGE.\n// BOLA_STATE_STARTUP : Set placeholder buffer such that we download fragments at most recently measured throughput.\n// BOLA_STATE_STEADY : Buffer primed, we switch to steady operation.\n// TODO: add BOLA_STATE_SEEK and tune BOLA behavior on seeking\nconst BOLA_STATE_ONE_BITRATE = 0;\nconst BOLA_STATE_STARTUP = 1;\nconst BOLA_STATE_STEADY = 2;\n\nconst MINIMUM_BUFFER_S = 10; // BOLA should never add artificial delays if buffer is less than MINIMUM_BUFFER_S.\nconst MINIMUM_BUFFER_PER_BITRATE_LEVEL_S = 2;\n// E.g. if there are 5 bitrates, BOLA switches to top bitrate at buffer = 10 + 5 * 2 = 20s.\n// If Schedule Controller does not allow buffer to reach that level, it can be achieved through the placeholder buffer level.\n\nconst PLACEHOLDER_BUFFER_DECAY = 0.99; // Make sure placeholder buffer does not stick around too long.\n\nfunction BolaRule(config) {\n\n config = config || {};\n const context = this.context;\n\n const dashMetrics = config.dashMetrics;\n const mediaPlayerModel = config.mediaPlayerModel;\n const eventBus = EventBus(context).getInstance();\n\n let instance,\n logger,\n bolaStateDict;\n\n function setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n resetInitialSettings();\n\n eventBus.on(MediaPlayerEvents.BUFFER_EMPTY, onBufferEmpty, instance);\n eventBus.on(MediaPlayerEvents.PLAYBACK_SEEKING, onPlaybackSeeking, instance);\n eventBus.on(MediaPlayerEvents.METRIC_ADDED, onMetricAdded, instance);\n eventBus.on(MediaPlayerEvents.QUALITY_CHANGE_REQUESTED, onQualityChangeRequested, instance);\n eventBus.on(MediaPlayerEvents.FRAGMENT_LOADING_ABANDONED, onFragmentLoadingAbandoned, instance);\n\n eventBus.on(Events.MEDIA_FRAGMENT_LOADED, onMediaFragmentLoaded, instance);\n }\n\n function utilitiesFromBitrates(bitrates) {\n return bitrates.map(b => Math.log(b));\n // no need to worry about offset, utilities will be offset (uniformly) anyway later\n }\n\n // NOTE: in live streaming, the real buffer level can drop below minimumBufferS, but bola should not stick to lowest bitrate by using a placeholder buffer level\n function calculateBolaParameters(stableBufferTime, bitrates, utilities) {\n const highestUtilityIndex = utilities.reduce((highestIndex, u, uIndex) => (u > utilities[highestIndex] ? uIndex : highestIndex), 0);\n\n if (highestUtilityIndex === 0) {\n // if highestUtilityIndex === 0, then always use lowest bitrate\n return null;\n }\n\n const bufferTime = Math.max(stableBufferTime, MINIMUM_BUFFER_S + MINIMUM_BUFFER_PER_BITRATE_LEVEL_S * bitrates.length);\n\n // TODO: Investigate if following can be better if utilities are not the default Math.log utilities.\n // If using Math.log utilities, we can choose Vp and gp to always prefer bitrates[0] at minimumBufferS and bitrates[max] at bufferTarget.\n // (Vp * (utility + gp) - bufferLevel) / bitrate has the maxima described when:\n // Vp * (utilities[0] + gp - 1) === minimumBufferS and Vp * (utilities[max] + gp - 1) === bufferTarget\n // giving:\n const gp = (utilities[highestUtilityIndex] - 1) / (bufferTime / MINIMUM_BUFFER_S - 1);\n const Vp = MINIMUM_BUFFER_S / gp;\n // note that expressions for gp and Vp assume utilities[0] === 1, which is true because of normalization\n\n return { gp: gp, Vp: Vp };\n }\n\n function getInitialBolaState(rulesContext) {\n const initialState = {};\n const mediaInfo = rulesContext.getMediaInfo();\n const bitrates = mediaInfo.bitrateList.map(b => b.bandwidth);\n let utilities = utilitiesFromBitrates(bitrates);\n utilities = utilities.map(u => u - utilities[0] + 1); // normalize\n const stableBufferTime = mediaPlayerModel.getStableBufferTime();\n const params = calculateBolaParameters(stableBufferTime, bitrates, utilities);\n\n if (!params) {\n // only happens when there is only one bitrate level\n initialState.state = BOLA_STATE_ONE_BITRATE;\n } else {\n initialState.state = BOLA_STATE_STARTUP;\n\n initialState.bitrates = bitrates;\n initialState.utilities = utilities;\n initialState.stableBufferTime = stableBufferTime;\n initialState.Vp = params.Vp;\n initialState.gp = params.gp;\n\n initialState.lastQuality = 0;\n clearBolaStateOnSeek(initialState);\n }\n\n return initialState;\n }\n\n function clearBolaStateOnSeek(bolaState) {\n bolaState.placeholderBuffer = 0;\n bolaState.mostAdvancedSegmentStart = NaN;\n bolaState.lastSegmentWasReplacement = false;\n bolaState.lastSegmentStart = NaN;\n bolaState.lastSegmentDurationS = NaN;\n bolaState.lastSegmentRequestTimeMs = NaN;\n bolaState.lastSegmentFinishTimeMs = NaN;\n }\n\n // If the buffer target is changed (can this happen mid-stream?), then adjust BOLA parameters accordingly.\n function checkBolaStateStableBufferTime(bolaState, mediaType) {\n const stableBufferTime = mediaPlayerModel.getStableBufferTime();\n if (bolaState.stableBufferTime !== stableBufferTime) {\n const params = calculateBolaParameters(stableBufferTime, bolaState.bitrates, bolaState.utilities);\n if (params.Vp !== bolaState.Vp || params.gp !== bolaState.gp) {\n // correct placeholder buffer using two criteria:\n // 1. do not change effective buffer level at effectiveBufferLevel === MINIMUM_BUFFER_S ( === Vp * gp )\n // 2. scale placeholder buffer by Vp subject to offset indicated in 1.\n\n const bufferLevel = dashMetrics.getCurrentBufferLevel(mediaType);\n let effectiveBufferLevel = bufferLevel + bolaState.placeholderBuffer;\n\n effectiveBufferLevel -= MINIMUM_BUFFER_S;\n effectiveBufferLevel *= params.Vp / bolaState.Vp;\n effectiveBufferLevel += MINIMUM_BUFFER_S;\n\n bolaState.stableBufferTime = stableBufferTime;\n bolaState.Vp = params.Vp;\n bolaState.gp = params.gp;\n bolaState.placeholderBuffer = Math.max(0, effectiveBufferLevel - bufferLevel);\n }\n }\n }\n\n function getBolaState(rulesContext) {\n const mediaType = rulesContext.getMediaType();\n let bolaState = bolaStateDict[mediaType];\n if (!bolaState) {\n bolaState = getInitialBolaState(rulesContext);\n bolaStateDict[mediaType] = bolaState;\n } else if (bolaState.state !== BOLA_STATE_ONE_BITRATE) {\n checkBolaStateStableBufferTime(bolaState, mediaType);\n }\n return bolaState;\n }\n\n // The core idea of BOLA.\n function getQualityFromBufferLevel(bolaState, bufferLevel) {\n const bitrateCount = bolaState.bitrates.length;\n let quality = NaN;\n let score = NaN;\n for (let i = 0; i < bitrateCount; ++i) {\n let s = (bolaState.Vp * (bolaState.utilities[i] + bolaState.gp) - bufferLevel) / bolaState.bitrates[i];\n if (isNaN(score) || s >= score) {\n score = s;\n quality = i;\n }\n }\n return quality;\n }\n\n // maximum buffer level which prefers to download at quality rather than wait\n function maxBufferLevelForQuality(bolaState, quality) {\n return bolaState.Vp * (bolaState.utilities[quality] + bolaState.gp);\n }\n\n // the minimum buffer level that would cause BOLA to choose quality rather than a lower bitrate\n function minBufferLevelForQuality(bolaState, quality) {\n const qBitrate = bolaState.bitrates[quality];\n const qUtility = bolaState.utilities[quality];\n\n let min = 0;\n for (let i = quality - 1; i >= 0; --i) {\n // for each bitrate less than bitrates[quality], BOLA should prefer quality (unless other bitrate has higher utility)\n if (bolaState.utilities[i] < bolaState.utilities[quality]) {\n const iBitrate = bolaState.bitrates[i];\n const iUtility = bolaState.utilities[i];\n\n const level = bolaState.Vp * (bolaState.gp + (qBitrate * iUtility - iBitrate * qUtility) / (qBitrate - iBitrate));\n min = Math.max(min, level); // we want min to be small but at least level(i) for all i\n }\n }\n return min;\n }\n\n /*\n * The placeholder buffer increases the effective buffer that is used to calculate the bitrate.\n * There are two main reasons we might want to increase the placeholder buffer:\n *\n * 1. When a segment finishes downloading, we would expect to get a call on getMaxIndex() regarding the quality for\n * the next segment. However, there might be a delay before the next call. E.g. when streaming live content, the\n * next segment might not be available yet. If the call to getMaxIndex() does happens after a delay, we don't\n * want the delay to change the BOLA decision - we only want to factor download time to decide on bitrate level.\n *\n * 2. It is possible to get a call to getMaxIndex() without having a segment download. The buffer target in dash.js\n * is different for top-quality segments and lower-quality segments. If getMaxIndex() returns a lower-than-top\n * quality, then the buffer controller might decide not to download a segment. When dash.js is ready for the next\n * segment, getMaxIndex() will be called again. We don't want this extra delay to factor in the bitrate decision.\n */\n function updatePlaceholderBuffer(bolaState, mediaType) {\n const nowMs = Date.now();\n\n if (!isNaN(bolaState.lastSegmentFinishTimeMs)) {\n // compensate for non-bandwidth-derived delays, e.g., live streaming availability, buffer controller\n const delay = 0.001 * (nowMs - bolaState.lastSegmentFinishTimeMs);\n bolaState.placeholderBuffer += Math.max(0, delay);\n } else if (!isNaN(bolaState.lastCallTimeMs)) {\n // no download after last call, compensate for delay between calls\n const delay = 0.001 * (nowMs - bolaState.lastCallTimeMs);\n bolaState.placeholderBuffer += Math.max(0, delay);\n }\n\n bolaState.lastCallTimeMs = nowMs;\n bolaState.lastSegmentStart = NaN;\n bolaState.lastSegmentRequestTimeMs = NaN;\n bolaState.lastSegmentFinishTimeMs = NaN;\n\n checkBolaStateStableBufferTime(bolaState, mediaType);\n }\n\n function onBufferEmpty(e) {\n // if we rebuffer, we don't want the placeholder buffer to artificially raise BOLA quality\n const mediaType = e.mediaType;\n // if audio buffer runs empty (due to track switch for example) then reset placeholder buffer only for audio (to avoid decrease video BOLA quality)\n const stateDict = mediaType === Constants.AUDIO ? [Constants.AUDIO] : bolaStateDict;\n for (const mediaType in stateDict) {\n if (bolaStateDict.hasOwnProperty(mediaType) && bolaStateDict[mediaType].state === BOLA_STATE_STEADY) {\n bolaStateDict[mediaType].placeholderBuffer = 0;\n }\n }\n }\n\n function onPlaybackSeeking() {\n // TODO: 1. Verify what happens if we seek mid-fragment.\n // TODO: 2. If e.g. we have 10s fragments and seek, we might want to download the first fragment at a lower quality to restart playback quickly.\n for (const mediaType in bolaStateDict) {\n if (bolaStateDict.hasOwnProperty(mediaType)) {\n const bolaState = bolaStateDict[mediaType];\n if (bolaState.state !== BOLA_STATE_ONE_BITRATE) {\n bolaState.state = BOLA_STATE_STARTUP; // TODO: BOLA_STATE_SEEK?\n clearBolaStateOnSeek(bolaState);\n }\n }\n }\n }\n\n function onMediaFragmentLoaded(e) {\n if (e && e.chunk && e.chunk.mediaInfo) {\n const bolaState = bolaStateDict[e.chunk.mediaInfo.type];\n if (bolaState && bolaState.state !== BOLA_STATE_ONE_BITRATE) {\n const start = e.chunk.start;\n if (isNaN(bolaState.mostAdvancedSegmentStart) || start > bolaState.mostAdvancedSegmentStart) {\n bolaState.mostAdvancedSegmentStart = start;\n bolaState.lastSegmentWasReplacement = false;\n } else {\n bolaState.lastSegmentWasReplacement = true;\n }\n\n bolaState.lastSegmentStart = start;\n bolaState.lastSegmentDurationS = e.chunk.duration;\n bolaState.lastQuality = e.chunk.quality;\n\n checkNewSegment(bolaState, e.chunk.mediaInfo.type);\n }\n }\n }\n\n function onMetricAdded(e) {\n if (e && e.metric === MetricsConstants.HTTP_REQUEST && e.value && e.value.type === HTTPRequest.MEDIA_SEGMENT_TYPE && e.value.trace && e.value.trace.length) {\n const bolaState = bolaStateDict[e.mediaType];\n if (bolaState && bolaState.state !== BOLA_STATE_ONE_BITRATE) {\n bolaState.lastSegmentRequestTimeMs = e.value.trequest.getTime();\n bolaState.lastSegmentFinishTimeMs = e.value._tfinish.getTime();\n\n checkNewSegment(bolaState, e.mediaType);\n }\n }\n }\n\n /*\n * When a new segment is downloaded, we get two notifications: onMediaFragmentLoaded() and onMetricAdded(). It is\n * possible that the quality for the downloaded segment was lower (not higher) than the quality indicated by BOLA.\n * This might happen because of other rules such as the DroppedFramesRule. When this happens, we trim the\n * placeholder buffer to make BOLA more stable. This mechanism also avoids inflating the buffer when BOLA itself\n * decides not to increase the quality to avoid oscillations.\n *\n * We should also check for replacement segments (fast switching). In this case, a segment is downloaded but does\n * not grow the actual buffer. Fast switching might cause the buffer to deplete, causing BOLA to drop the bitrate.\n * We avoid this by growing the placeholder buffer.\n */\n function checkNewSegment(bolaState, mediaType) {\n if (!isNaN(bolaState.lastSegmentStart) && !isNaN(bolaState.lastSegmentRequestTimeMs) && !isNaN(bolaState.placeholderBuffer)) {\n bolaState.placeholderBuffer *= PLACEHOLDER_BUFFER_DECAY;\n\n // Find what maximum buffer corresponding to last segment was, and ensure placeholder is not relatively larger.\n if (!isNaN(bolaState.lastSegmentFinishTimeMs)) {\n const bufferLevel = dashMetrics.getCurrentBufferLevel(mediaType);\n const bufferAtLastSegmentRequest = bufferLevel + 0.001 * (bolaState.lastSegmentFinishTimeMs - bolaState.lastSegmentRequestTimeMs); // estimate\n const maxEffectiveBufferForLastSegment = maxBufferLevelForQuality(bolaState, bolaState.lastQuality);\n const maxPlaceholderBuffer = Math.max(0, maxEffectiveBufferForLastSegment - bufferAtLastSegmentRequest);\n bolaState.placeholderBuffer = Math.min(maxPlaceholderBuffer, bolaState.placeholderBuffer);\n }\n\n // then see if we should grow placeholder buffer\n\n if (bolaState.lastSegmentWasReplacement && !isNaN(bolaState.lastSegmentDurationS)) {\n // compensate for segments that were downloaded but did not grow the buffer\n bolaState.placeholderBuffer += bolaState.lastSegmentDurationS;\n }\n\n bolaState.lastSegmentStart = NaN;\n bolaState.lastSegmentRequestTimeMs = NaN;\n }\n }\n\n function onQualityChangeRequested(e) {\n // Useful to store change requests when abandoning a download.\n if (e) {\n const bolaState = bolaStateDict[e.mediaType];\n if (bolaState && bolaState.state !== BOLA_STATE_ONE_BITRATE) {\n bolaState.abrQuality = e.newQuality;\n }\n }\n }\n\n function onFragmentLoadingAbandoned(e) {\n if (e) {\n const bolaState = bolaStateDict[e.mediaType];\n if (bolaState && bolaState.state !== BOLA_STATE_ONE_BITRATE) {\n // deflate placeholderBuffer - note that we want to be conservative when abandoning\n const bufferLevel = dashMetrics.getCurrentBufferLevel(e.mediaType);\n let wantEffectiveBufferLevel;\n if (bolaState.abrQuality > 0) {\n // deflate to point where BOLA just chooses newQuality over newQuality-1\n wantEffectiveBufferLevel = minBufferLevelForQuality(bolaState, bolaState.abrQuality);\n } else {\n wantEffectiveBufferLevel = MINIMUM_BUFFER_S;\n }\n const maxPlaceholderBuffer = Math.max(0, wantEffectiveBufferLevel - bufferLevel);\n bolaState.placeholderBuffer = Math.min(bolaState.placeholderBuffer, maxPlaceholderBuffer);\n }\n }\n }\n\n function getMaxIndex(rulesContext) {\n const switchRequest = SwitchRequest(context).create();\n\n if (!rulesContext || !rulesContext.hasOwnProperty('getMediaInfo') || !rulesContext.hasOwnProperty('getMediaType') ||\n !rulesContext.hasOwnProperty('getScheduleController') || !rulesContext.hasOwnProperty('getStreamInfo') ||\n !rulesContext.hasOwnProperty('getAbrController') || !rulesContext.hasOwnProperty('useBufferOccupancyABR')) {\n return switchRequest;\n }\n const mediaInfo = rulesContext.getMediaInfo();\n const mediaType = rulesContext.getMediaType();\n const scheduleController = rulesContext.getScheduleController();\n const streamInfo = rulesContext.getStreamInfo();\n const abrController = rulesContext.getAbrController();\n const throughputHistory = abrController.getThroughputHistory();\n const streamId = streamInfo ? streamInfo.id : null;\n const isDynamic = streamInfo && streamInfo.manifestInfo && streamInfo.manifestInfo.isDynamic;\n const useBufferOccupancyABR = rulesContext.useBufferOccupancyABR();\n switchRequest.reason = switchRequest.reason || {};\n\n if (!useBufferOccupancyABR) {\n return switchRequest;\n }\n\n scheduleController.setTimeToLoadDelay(0);\n\n const bolaState = getBolaState(rulesContext);\n\n if (bolaState.state === BOLA_STATE_ONE_BITRATE) {\n // shouldn't even have been called\n return switchRequest;\n }\n\n const bufferLevel = dashMetrics.getCurrentBufferLevel(mediaType);\n const throughput = throughputHistory.getAverageThroughput(mediaType, isDynamic);\n const safeThroughput = throughputHistory.getSafeAverageThroughput(mediaType, isDynamic);\n const latency = throughputHistory.getAverageLatency(mediaType);\n let quality;\n\n switchRequest.reason.state = bolaState.state;\n switchRequest.reason.throughput = throughput;\n switchRequest.reason.latency = latency;\n\n if (isNaN(throughput)) { // isNaN(throughput) === isNaN(safeThroughput) === isNaN(latency)\n // still starting up - not enough information\n return switchRequest;\n }\n\n switch (bolaState.state) {\n case BOLA_STATE_STARTUP:\n quality = abrController.getQualityForBitrate(mediaInfo, safeThroughput, streamId, latency);\n\n switchRequest.quality = quality;\n switchRequest.reason.throughput = safeThroughput;\n\n bolaState.placeholderBuffer = Math.max(0, minBufferLevelForQuality(bolaState, quality) - bufferLevel);\n bolaState.lastQuality = quality;\n\n if (!isNaN(bolaState.lastSegmentDurationS) && bufferLevel >= bolaState.lastSegmentDurationS) {\n bolaState.state = BOLA_STATE_STEADY;\n }\n\n break; // BOLA_STATE_STARTUP\n\n case BOLA_STATE_STEADY:\n\n // NB: The placeholder buffer is added to bufferLevel to come up with a bitrate.\n // This might lead BOLA to be too optimistic and to choose a bitrate that would lead to rebuffering -\n // if the real buffer bufferLevel runs out, the placeholder buffer cannot prevent rebuffering.\n // However, the InsufficientBufferRule takes care of this scenario.\n\n updatePlaceholderBuffer(bolaState, mediaType);\n\n quality = getQualityFromBufferLevel(bolaState, bufferLevel + bolaState.placeholderBuffer);\n\n // we want to avoid oscillations\n // We implement the \"BOLA-O\" variant: when network bandwidth lies between two encoded bitrate levels, stick to the lowest level.\n const qualityForThroughput = abrController.getQualityForBitrate(mediaInfo, safeThroughput, streamId, latency);\n if (quality > bolaState.lastQuality && quality > qualityForThroughput) {\n // only intervene if we are trying to *increase* quality to an *unsustainable* level\n // we are only avoid oscillations - do not drop below last quality\n\n quality = Math.max(qualityForThroughput, bolaState.lastQuality);\n }\n\n // We do not want to overfill buffer with low quality chunks.\n // Note that there will be no delay if buffer level is below MINIMUM_BUFFER_S, probably even with some margin higher than MINIMUM_BUFFER_S.\n let delayS = Math.max(0, bufferLevel + bolaState.placeholderBuffer - maxBufferLevelForQuality(bolaState, quality));\n\n // First reduce placeholder buffer, then tell schedule controller to pause.\n if (delayS <= bolaState.placeholderBuffer) {\n bolaState.placeholderBuffer -= delayS;\n delayS = 0;\n } else {\n delayS -= bolaState.placeholderBuffer;\n bolaState.placeholderBuffer = 0;\n\n if (quality < abrController.getMaxAllowedIndexFor(mediaType, streamId)) {\n // At top quality, allow schedule controller to decide how far to fill buffer.\n scheduleController.setTimeToLoadDelay(1000 * delayS);\n } else {\n delayS = 0;\n }\n }\n\n switchRequest.quality = quality;\n switchRequest.reason.throughput = throughput;\n switchRequest.reason.latency = latency;\n switchRequest.reason.bufferLevel = bufferLevel;\n switchRequest.reason.placeholderBuffer = bolaState.placeholderBuffer;\n switchRequest.reason.delay = delayS;\n\n bolaState.lastQuality = quality;\n // keep bolaState.state === BOLA_STATE_STEADY\n\n break; // BOLA_STATE_STEADY\n\n default:\n logger.debug('BOLA ABR rule invoked in bad state.');\n // should not arrive here, try to recover\n switchRequest.quality = abrController.getQualityForBitrate(mediaInfo, safeThroughput, streamId, latency);\n switchRequest.reason.state = bolaState.state;\n switchRequest.reason.throughput = safeThroughput;\n switchRequest.reason.latency = latency;\n bolaState.state = BOLA_STATE_STARTUP;\n clearBolaStateOnSeek(bolaState);\n }\n\n return switchRequest;\n }\n\n function resetInitialSettings() {\n bolaStateDict = {};\n }\n\n function reset() {\n resetInitialSettings();\n\n eventBus.off(MediaPlayerEvents.BUFFER_EMPTY, onBufferEmpty, instance);\n eventBus.off(MediaPlayerEvents.PLAYBACK_SEEKING, onPlaybackSeeking, instance);\n eventBus.off(MediaPlayerEvents.METRIC_ADDED, onMetricAdded, instance);\n eventBus.off(MediaPlayerEvents.QUALITY_CHANGE_REQUESTED, onQualityChangeRequested, instance);\n eventBus.off(MediaPlayerEvents.FRAGMENT_LOADING_ABANDONED, onFragmentLoadingAbandoned, instance);\n\n eventBus.off(Events.MEDIA_FRAGMENT_LOADED, onMediaFragmentLoaded, instance);\n }\n\n instance = {\n getMaxIndex: getMaxIndex,\n reset: reset\n };\n\n setup();\n return instance;\n}\n\nBolaRule.__dashjs_factory_name = 'BolaRule';\nexport default FactoryMaker.getClassFactory(BolaRule);\n","import FactoryMaker from '../../../core/FactoryMaker';\nimport SwitchRequest from '../SwitchRequest';\nimport Debug from '../../../core/Debug';\n\nfunction DroppedFramesRule() {\n\n const context = this.context;\n let instance,\n logger;\n\n const DROPPED_PERCENTAGE_FORBID = 0.15;\n const GOOD_SAMPLE_SIZE = 375; //Don't apply the rule until this many frames have been rendered(and counted under those indices).\n\n function setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n }\n\n function getMaxIndex(rulesContext) {\n const switchRequest = SwitchRequest(context).create();\n\n if (!rulesContext || !rulesContext.hasOwnProperty('getDroppedFramesHistory')) {\n return switchRequest;\n }\n\n const droppedFramesHistory = rulesContext.getDroppedFramesHistory();\n const streamId = rulesContext.getStreamInfo().id;\n\n if (droppedFramesHistory) {\n const dfh = droppedFramesHistory.getFrameHistory(streamId);\n\n if (!dfh || dfh.length === 0) {\n return switchRequest;\n }\n\n let droppedFrames = 0;\n let totalFrames = 0;\n let maxIndex = SwitchRequest.NO_CHANGE;\n\n //No point in measuring dropped frames for the zeroeth index.\n for (let i = 1; i < dfh.length; i++) {\n if (dfh[i]) {\n droppedFrames = dfh[i].droppedVideoFrames;\n totalFrames = dfh[i].totalVideoFrames;\n\n if (totalFrames > GOOD_SAMPLE_SIZE && droppedFrames / totalFrames > DROPPED_PERCENTAGE_FORBID) {\n maxIndex = i - 1;\n logger.debug('index: ' + maxIndex + ' Dropped Frames: ' + droppedFrames + ' Total Frames: ' + totalFrames);\n break;\n }\n }\n }\n return SwitchRequest(context).create(maxIndex, { droppedFrames: droppedFrames });\n }\n\n return switchRequest;\n }\n\n instance = {\n getMaxIndex\n };\n\n setup();\n\n return instance;\n}\n\nDroppedFramesRule.__dashjs_factory_name = 'DroppedFramesRule';\nexport default FactoryMaker.getClassFactory(DroppedFramesRule);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport EventBus from '../../../core/EventBus';\nimport Events from '../../../core/events/Events';\nimport FactoryMaker from '../../../core/FactoryMaker';\nimport Debug from '../../../core/Debug';\nimport SwitchRequest from '../SwitchRequest';\nimport Constants from '../../constants/Constants';\nimport MetricsConstants from '../../constants/MetricsConstants';\nimport MediaPlayerEvents from '../../MediaPlayerEvents';\n\nfunction InsufficientBufferRule(config) {\n\n config = config || {};\n const INSUFFICIENT_BUFFER_SAFETY_FACTOR = 0.5;\n const SEGMENT_IGNORE_COUNT = 2;\n\n const context = this.context;\n const eventBus = EventBus(context).getInstance();\n const dashMetrics = config.dashMetrics;\n\n let instance,\n logger,\n bufferStateDict;\n\n function setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n resetInitialSettings();\n eventBus.on(MediaPlayerEvents.PLAYBACK_SEEKING, _onPlaybackSeeking, instance);\n eventBus.on(Events.BYTES_APPENDED_END_FRAGMENT, _onBytesAppended, instance);\n }\n\n function checkConfig() {\n if (!dashMetrics || !dashMetrics.hasOwnProperty('getCurrentBufferLevel') || !dashMetrics.hasOwnProperty('getCurrentBufferState')) {\n throw new Error(Constants.MISSING_CONFIG_ERROR);\n }\n }\n\n\n /**\n * If a BUFFER_EMPTY event happens, then InsufficientBufferRule returns switchRequest.quality=0 until BUFFER_LOADED happens.\n * Otherwise InsufficientBufferRule gives a maximum bitrate depending on throughput and bufferLevel such that\n * a whole fragment can be downloaded before the buffer runs out, subject to a conservative safety factor of 0.5.\n * If the bufferLevel is low, then InsufficientBufferRule avoids rebuffering risk.\n * If the bufferLevel is high, then InsufficientBufferRule give a high MaxIndex allowing other rules to take over.\n * @param rulesContext\n * @return {object}\n */\n function getMaxIndex(rulesContext) {\n const switchRequest = SwitchRequest(context).create();\n\n if (!rulesContext || !rulesContext.hasOwnProperty('getMediaType')) {\n return switchRequest;\n }\n\n checkConfig();\n\n const mediaType = rulesContext.getMediaType();\n const currentBufferState = dashMetrics.getCurrentBufferState(mediaType);\n const representationInfo = rulesContext.getRepresentationInfo();\n const fragmentDuration = representationInfo.fragmentDuration;\n const streamInfo = rulesContext.getStreamInfo();\n const streamId = streamInfo ? streamInfo.id : null;\n const scheduleController = rulesContext.getScheduleController();\n const isDynamic = streamInfo && streamInfo.manifestInfo && streamInfo.manifestInfo.isDynamic;\n const playbackController = scheduleController.getPlaybackController();\n\n\n // Don't ask for a bitrate change if there is not info about buffer state or if fragmentDuration is not defined\n const lowLatencyEnabled = playbackController.getLowLatencyModeEnabled();\n if (shouldIgnore(lowLatencyEnabled, mediaType) || !fragmentDuration) {\n return switchRequest;\n }\n\n if (currentBufferState && currentBufferState.state === MetricsConstants.BUFFER_EMPTY) {\n logger.debug('[' + mediaType + '] Switch to index 0; buffer is empty.');\n switchRequest.quality = 0;\n switchRequest.reason = 'InsufficientBufferRule: Buffer is empty';\n } else {\n const mediaInfo = rulesContext.getMediaInfo();\n const abrController = rulesContext.getAbrController();\n const throughputHistory = abrController.getThroughputHistory();\n\n const bufferLevel = dashMetrics.getCurrentBufferLevel(mediaType);\n const throughput = throughputHistory.getAverageThroughput(mediaType, isDynamic);\n const latency = throughputHistory.getAverageLatency(mediaType);\n const bitrate = throughput * (bufferLevel / fragmentDuration) * INSUFFICIENT_BUFFER_SAFETY_FACTOR;\n\n switchRequest.quality = abrController.getQualityForBitrate(mediaInfo, bitrate, streamId, latency);\n switchRequest.reason = 'InsufficientBufferRule: being conservative to avoid immediate rebuffering';\n }\n\n return switchRequest;\n\n }\n\n function shouldIgnore(lowLatencyEnabled, mediaType) {\n return !lowLatencyEnabled && bufferStateDict[mediaType].ignoreCount > 0;\n }\n\n function resetInitialSettings() {\n bufferStateDict = {};\n bufferStateDict[Constants.VIDEO] = { ignoreCount: SEGMENT_IGNORE_COUNT };\n bufferStateDict[Constants.AUDIO] = { ignoreCount: SEGMENT_IGNORE_COUNT };\n }\n\n function _onPlaybackSeeking() {\n resetInitialSettings();\n }\n\n function _onBytesAppended(e) {\n if (!isNaN(e.startTime) && (e.mediaType === Constants.AUDIO || e.mediaType === Constants.VIDEO)) {\n if (bufferStateDict[e.mediaType].ignoreCount > 0) {\n bufferStateDict[e.mediaType].ignoreCount--;\n }\n }\n }\n\n function reset() {\n resetInitialSettings();\n eventBus.off(MediaPlayerEvents.PLAYBACK_SEEKING, _onPlaybackSeeking, instance);\n eventBus.off(Events.BYTES_APPENDED_END_FRAGMENT, _onBytesAppended, instance);\n }\n\n instance = {\n getMaxIndex,\n reset\n };\n\n setup();\n\n return instance;\n}\n\nInsufficientBufferRule.__dashjs_factory_name = 'InsufficientBufferRule';\nexport default FactoryMaker.getClassFactory(InsufficientBufferRule);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2020, Unified Streaming.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n// For a description of the Learn2Adapt-LowLatency (L2A-LL) bitrate adaptation algorithm, see https://github.com/unifiedstreaming/Learn2Adapt-LowLatency/blob/master/Online_learning_for_bitrate_adaptation_in_low_latency_live_streaming_CR.pdf\n\nimport MetricsConstants from '../../constants/MetricsConstants';\nimport SwitchRequest from '../SwitchRequest';\nimport FactoryMaker from '../../../core/FactoryMaker';\nimport {HTTPRequest} from '../../vo/metrics/HTTPRequest';\nimport EventBus from '../../../core/EventBus';\nimport Events from '../../../core/events/Events';\nimport Debug from '../../../core/Debug';\nimport Constants from '../../constants/Constants';\n\nconst L2A_STATE_ONE_BITRATE = 0; // If there is only one bitrate (or initialization failed), always return NO_CHANGE.\nconst L2A_STATE_STARTUP = 1; // Set placeholder buffer such that we download fragments at most recently measured throughput.\nconst L2A_STATE_STEADY = 2; // Buffer primed, we switch to steady operation.\n\n\nfunction L2ARule(config) {\n config = config || {};\n const context = this.context;\n\n const dashMetrics = config.dashMetrics;\n const eventBus = EventBus(context).getInstance();\n\n let instance,\n l2AStateDict,\n l2AParameterDict,\n logger;\n\n /**\n * Setup function to initialize L2ARule\n */\n function setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n _resetInitialSettings();\n\n eventBus.on(Events.PLAYBACK_SEEKING, _onPlaybackSeeking, instance);\n eventBus.on(Events.MEDIA_FRAGMENT_LOADED, _onMediaFragmentLoaded, instance);\n eventBus.on(Events.METRIC_ADDED, _onMetricAdded, instance);\n eventBus.on(Events.QUALITY_CHANGE_REQUESTED, _onQualityChangeRequested, instance);\n }\n\n /**\n * Sets the initial state of the algorithm. Calls the initialize function for the paramteters.\n * @param {object} rulesContext\n * @return {object} initialState\n * @private\n */\n function _getInitialL2AState(rulesContext) {\n const initialState = {};\n const mediaInfo = rulesContext.getMediaInfo();\n const bitrates = mediaInfo.bitrateList.map((b) => {\n return b.bandwidth / 1000;\n });\n\n initialState.state = L2A_STATE_STARTUP;\n initialState.bitrates = bitrates;\n initialState.lastQuality = 0;\n\n _initializeL2AParameters(mediaInfo);\n _clearL2AStateOnSeek(initialState);\n\n return initialState;\n }\n\n /**\n * Initializes the parameters of the algorithm. This will be done once for each media type.\n * @param {object} mediaInfo\n * @private\n */\n function _initializeL2AParameters(mediaInfo) {\n\n if (!mediaInfo || !mediaInfo.type) {\n return;\n }\n l2AParameterDict[mediaInfo.type] = {};\n l2AParameterDict[mediaInfo.type].w = []; //Vector of probabilities associated with bitrate decisions\n l2AParameterDict[mediaInfo.type].prev_w = []; //Vector of probabilities associated with bitrate decisions calculated in the previous step\n l2AParameterDict[mediaInfo.type].Q = 0; //Initialization of Lagrangian multiplier (This keeps track of the buffer displacement)\n l2AParameterDict[mediaInfo.type].segment_request_start_s = 0;\n l2AParameterDict[mediaInfo.type].segment_download_finish_s = 0;\n l2AParameterDict[mediaInfo.type].B_target = 1.5; //Target buffer level\n }\n\n\n /**\n * Clears the state object\n * @param {object} l2AState\n * @private\n */\n function _clearL2AStateOnSeek(l2AState) {\n l2AState.placeholderBuffer = 0;\n l2AState.mostAdvancedSegmentStart = NaN;\n l2AState.lastSegmentWasReplacement = false;\n l2AState.lastSegmentStart = NaN;\n l2AState.lastSegmentDurationS = NaN;\n l2AState.lastSegmentRequestTimeMs = NaN;\n l2AState.lastSegmentFinishTimeMs = NaN;\n l2AState.lastSegmentUrl = '';\n }\n\n\n /**\n * Returns the state object for a fiven media type. If the state object is not yet defined _getInitialL2AState is called\n * @param {object} rulesContext\n * @return {object} l2AState\n * @private\n */\n function _getL2AState(rulesContext) {\n const mediaType = rulesContext.getMediaType();\n let l2AState = l2AStateDict[mediaType];\n\n if (!l2AState) {\n l2AState = _getInitialL2AState(rulesContext);\n l2AStateDict[mediaType] = l2AState;\n }\n\n return l2AState;\n }\n\n /**\n * Event handler for the seeking event.\n * @private\n */\n function _onPlaybackSeeking() {\n for (const mediaType in l2AStateDict) {\n if (l2AStateDict.hasOwnProperty(mediaType)) {\n const l2aState = l2AStateDict[mediaType];\n if (l2aState.state !== L2A_STATE_ONE_BITRATE) {\n l2aState.state = L2A_STATE_STARTUP;\n _clearL2AStateOnSeek(l2aState);\n }\n }\n }\n }\n\n /**\n * Event handler for the mediaFragmentLoaded event\n * @param {object} e\n * @private\n */\n function _onMediaFragmentLoaded(e) {\n if (e && e.chunk && e.chunk.mediaInfo) {\n const l2AState = l2AStateDict[e.chunk.mediaInfo.type];\n const l2AParameters = l2AParameterDict[e.chunk.mediaInfo.type];\n\n if (l2AState && l2AState.state !== L2A_STATE_ONE_BITRATE) {\n const start = e.chunk.start;\n if (isNaN(l2AState.mostAdvancedSegmentStart) || start > l2AState.mostAdvancedSegmentStart) {\n l2AState.mostAdvancedSegmentStart = start;\n l2AState.lastSegmentWasReplacement = false;\n } else {\n l2AState.lastSegmentWasReplacement = true;\n }\n\n l2AState.lastSegmentStart = start;\n l2AState.lastSegmentDurationS = e.chunk.duration;\n l2AState.lastQuality = e.chunk.quality;\n\n _checkNewSegment(l2AState, l2AParameters);\n }\n }\n }\n\n /**\n * Event handler for the metricAdded event\n * @param {object} e\n * @private\n */\n function _onMetricAdded(e) {\n if (e && e.metric === MetricsConstants.HTTP_REQUEST && e.value && e.value.type === HTTPRequest.MEDIA_SEGMENT_TYPE && e.value.trace && e.value.trace.length) {\n const l2AState = l2AStateDict[e.mediaType];\n const l2AParameters = l2AParameterDict[e.mediaType];\n\n if (l2AState && l2AState.state !== L2A_STATE_ONE_BITRATE) {\n l2AState.lastSegmentRequestTimeMs = e.value.trequest.getTime();\n l2AState.lastSegmentFinishTimeMs = e.value._tfinish.getTime();\n _checkNewSegment(l2AState, l2AParameters);\n }\n }\n }\n\n /**\n * When a new metric has been added or a media fragment has been loaded the state is adjusted accordingly\n * @param {object} L2AState\n * @param {object} l2AParameters\n * @private\n */\n function _checkNewSegment(L2AState, l2AParameters) {\n if (!isNaN(L2AState.lastSegmentStart) && !isNaN(L2AState.lastSegmentRequestTimeMs)) {\n l2AParameters.segment_request_start_s = 0.001 * L2AState.lastSegmentRequestTimeMs;\n l2AParameters.segment_download_finish_s = 0.001 * L2AState.lastSegmentFinishTimeMs;\n L2AState.lastSegmentStart = NaN;\n L2AState.lastSegmentRequestTimeMs = NaN;\n }\n }\n\n /**\n * Event handler for the qualityChangeRequested event\n * @param {object} e\n * @private\n */\n function _onQualityChangeRequested(e) {\n // Useful to store change requests when abandoning a download.\n if (e && e.mediaType) {\n const L2AState = l2AStateDict[e.mediaType];\n if (L2AState && L2AState.state !== L2A_STATE_ONE_BITRATE) {\n L2AState.abrQuality = e.newQuality;\n }\n }\n }\n\n /**\n * Dot multiplication of two arrays\n * @param {array} arr1\n * @param {array} arr2\n * @return {number} sumdot\n * @private\n */\n\n function _dotmultiplication(arr1, arr2) {\n if (arr1.length !== arr2.length) {\n return -1;\n }\n let sumdot = 0;\n for (let i = 0; i < arr1.length; i++) {\n sumdot = sumdot + arr1[i] * arr2[i];\n }\n return sumdot;\n }\n\n /**\n * Project an n-dim vector y to the simplex Dn\n * Dn = { x : x n-dim, 1 >= x >= 0, sum(x) = 1}\n * Algorithm is explained at http://arxiv.org/abs/1101.6081\n * @param {array} arr\n * @return {array}\n */\n function euclideanProjection(arr) {\n const m = arr.length;\n let bget = false;\n let arr2 = [];\n for (let ii = 0; ii < m; ++ii) {\n arr2[ii] = arr[ii];\n }\n let s = arr.sort(function (a, b) {\n return b - a;\n });\n let tmpsum = 0;\n let tmax = 0;\n let x = [];\n for (let ii = 0; ii < m - 1; ++ii) {\n tmpsum = tmpsum + s[ii];\n tmax = (tmpsum - 1) / (ii + 1);\n if (tmax >= s[ii + 1]) {\n bget = true;\n break;\n }\n }\n if (!bget) {\n tmax = (tmpsum + s[m - 1] - 1) / m;\n }\n for (let ii = 0; ii < m; ++ii) {\n x[ii] = Math.max(arr2[ii] - tmax, 0);\n }\n return x;\n }\n\n /**\n * Returns a switch request object indicating which quality is to be played\n * @param {object} rulesContext\n * @return {object}\n */\n function getMaxIndex(rulesContext) {\n const switchRequest = SwitchRequest(context).create();\n const horizon = 4; // Optimization horizon (The amount of steps required to achieve convergence)\n const vl = Math.pow(horizon, 0.99);// Cautiousness parameter, used to control aggressiveness of the bitrate decision process.\n const alpha = Math.max(Math.pow(horizon, 1), vl * Math.sqrt(horizon));// Step size, used for gradient descent exploration granularity\n const mediaInfo = rulesContext.getMediaInfo();\n const mediaType = rulesContext.getMediaType();\n const bitrates = mediaInfo.bitrateList.map(b => b.bandwidth);\n const bitrateCount = bitrates.length;\n const scheduleController = rulesContext.getScheduleController();\n const streamInfo = rulesContext.getStreamInfo();\n const abrController = rulesContext.getAbrController();\n const throughputHistory = abrController.getThroughputHistory();\n const isDynamic = streamInfo && streamInfo.manifestInfo && streamInfo.manifestInfo.isDynamic;\n const useL2AABR = rulesContext.useL2AABR();\n const bufferLevel = dashMetrics.getCurrentBufferLevel(mediaType, true);\n const safeThroughput = throughputHistory.getSafeAverageThroughput(mediaType, isDynamic);\n const throughput = throughputHistory.getAverageThroughput(mediaType, isDynamic); // In kbits/s\n const react = 2; // Reactiveness to volatility (abrupt throughput drops), used to re-calibrate Lagrangian multiplier Q\n const latency = throughputHistory.getAverageLatency(mediaType);\n const videoModel = rulesContext.getVideoModel();\n let quality;\n let currentPlaybackRate = videoModel.getPlaybackRate();\n\n if (!rulesContext || !rulesContext.hasOwnProperty('getMediaInfo') || !rulesContext.hasOwnProperty('getMediaType') ||\n !rulesContext.hasOwnProperty('getScheduleController') || !rulesContext.hasOwnProperty('getStreamInfo') ||\n !rulesContext.hasOwnProperty('getAbrController') || !rulesContext.hasOwnProperty('useL2AABR')) {\n return switchRequest;\n }\n\n switchRequest.reason = switchRequest.reason || {};\n\n if ((!useL2AABR) || (mediaType === Constants.AUDIO)) {// L2A decides bitrate only for video. Audio to be included in decision process in a later stage\n return switchRequest;\n }\n\n scheduleController.setTimeToLoadDelay(0);\n\n const l2AState = _getL2AState(rulesContext);\n\n if (l2AState.state === L2A_STATE_ONE_BITRATE) {\n // shouldn't even have been called\n return switchRequest;\n }\n\n const l2AParameter = l2AParameterDict[mediaType];\n\n if (!l2AParameter) {\n return switchRequest;\n }\n\n switchRequest.reason.state = l2AState.state;\n switchRequest.reason.throughput = throughput;\n switchRequest.reason.latency = latency;\n\n if (isNaN(throughput)) {\n // still starting up - not enough information\n return switchRequest;\n }\n\n switch (l2AState.state) {\n case L2A_STATE_STARTUP:\n quality = abrController.getQualityForBitrate(mediaInfo, safeThroughput, streamInfo.id, latency);//During strat-up phase abr.controller is responsible for bitrate decisions.\n switchRequest.quality = quality;\n switchRequest.reason.throughput = safeThroughput;\n l2AState.lastQuality = quality;\n\n if (!isNaN(l2AState.lastSegmentDurationS) && bufferLevel >= l2AParameter.B_target) {\n l2AState.state = L2A_STATE_STEADY;\n l2AParameter.Q = vl;// Initialization of Q langrangian multiplier\n // Update of probability vector w, to be used in main adaptation logic of L2A below (steady state)\n for (let i = 0; i < bitrateCount; ++i) {\n if (i === l2AState.lastQuality) {\n l2AParameter.prev_w[i] = 1;\n } else {\n l2AParameter.prev_w[i] = 0;\n }\n }\n }\n\n break; // L2A_STATE_STARTUP\n case L2A_STATE_STEADY:\n let diff1 = [];//Used to calculate the difference between consecutive decisions (w-w_prev)\n\n // Manual calculation of latency and throughput during previous request\n let throughputMeasureTime = dashMetrics.getCurrentHttpRequest(mediaType).trace.reduce((a, b) => a + b.d, 0);\n const downloadBytes = dashMetrics.getCurrentHttpRequest(mediaType).trace.reduce((a, b) => a + b.b[0], 0);\n let lastthroughput = Math.round((8 * downloadBytes) / throughputMeasureTime); // bits/ms = kbits/s\n let currentHttpRequest = dashMetrics.getCurrentHttpRequest(mediaType);\n\n if (lastthroughput < 1) {\n lastthroughput = 1;\n }//To avoid division with 0 (avoid infinity) in case of an absolute network outage\n\n // Note that for SegmentBase addressing the request url does not change.\n // As this is not relevant for low latency streaming at this point the check below is sufficient\n if (currentHttpRequest.url === l2AState.lastSegmentUrl ||\n currentHttpRequest.type === HTTPRequest.INIT_SEGMENT_TYPE) {\n // No change to inputs or init segment so use previously calculated quality\n quality = l2AState.lastQuality;\n\n } else { // Recalculate Q\n\n let V = l2AState.lastSegmentDurationS;\n let sign = 1;\n\n //Main adaptation logic of L2A-LL\n for (let i = 0; i < bitrateCount; ++i) {\n bitrates[i] = bitrates[i] / 1000; // Originally in bps, now in Kbps\n if (currentPlaybackRate * bitrates[i] > lastthroughput) {// In this case buffer would deplete, leading to a stall, which increases latency and thus the particular probability of selsection of bitrate[i] should be decreased.\n sign = -1;\n }\n // The objective of L2A is to minimize the overall latency=request-response time + buffer length after download+ potential stalling (if buffer less than chunk downlad time)\n l2AParameter.w[i] = l2AParameter.prev_w[i] + sign * (V / (2 * alpha)) * ((l2AParameter.Q + vl) * (currentPlaybackRate * bitrates[i] / lastthroughput));//Lagrangian descent\n }\n\n // Apply euclidean projection on w to ensure w expresses a probability distribution\n l2AParameter.w = euclideanProjection(l2AParameter.w);\n\n for (let i = 0; i < bitrateCount; ++i) {\n diff1[i] = l2AParameter.w[i] - l2AParameter.prev_w[i];\n l2AParameter.prev_w[i] = l2AParameter.w[i];\n }\n\n // Lagrangian multiplier Q calculation:\n l2AParameter.Q = Math.max(0, l2AParameter.Q - V + V * currentPlaybackRate * ((_dotmultiplication(bitrates, l2AParameter.prev_w) + _dotmultiplication(bitrates, diff1)) / lastthroughput));\n\n // Quality is calculated as argmin of the absolute difference between available bitrates (bitrates[i]) and bitrate estimation (dotmultiplication(w,bitrates)).\n let temp = [];\n for (let i = 0; i < bitrateCount; ++i) {\n temp[i] = Math.abs(bitrates[i] - _dotmultiplication(l2AParameter.w, bitrates));\n }\n\n // Quality is calculated based on the probability distribution w (the output of L2A)\n quality = temp.indexOf(Math.min(...temp));\n\n // We employ a cautious -stepwise- ascent\n if (quality > l2AState.lastQuality) {\n if (bitrates[l2AState.lastQuality + 1] <= lastthroughput) {\n quality = l2AState.lastQuality + 1;\n }\n }\n\n // Provision against bitrate over-estimation, by re-calibrating the Lagrangian multiplier Q, to be taken into account for the next chunk\n if (bitrates[quality] >= lastthroughput) {\n l2AParameter.Q = react * Math.max(vl, l2AParameter.Q);\n }\n l2AState.lastSegmentUrl = currentHttpRequest.url;\n }\n switchRequest.quality = quality;\n switchRequest.reason.throughput = throughput;\n switchRequest.reason.latency = latency;\n switchRequest.reason.bufferLevel = bufferLevel;\n l2AState.lastQuality = switchRequest.quality;\n break;\n default:\n // should not arrive here, try to recover\n logger.debug('L2A ABR rule invoked in bad state.');\n switchRequest.quality = abrController.getQualityForBitrate(mediaInfo, safeThroughput, streamInfo.id, latency);\n switchRequest.reason.state = l2AState.state;\n switchRequest.reason.throughput = safeThroughput;\n switchRequest.reason.latency = latency;\n l2AState.state = L2A_STATE_STARTUP;\n _clearL2AStateOnSeek(l2AState);\n }\n return switchRequest;\n }\n\n /**\n * Reset objects to their initial state\n * @private\n */\n function _resetInitialSettings() {\n l2AStateDict = {};\n l2AParameterDict = {};\n }\n\n /**\n * Reset the rule\n */\n function reset() {\n _resetInitialSettings();\n eventBus.off(Events.PLAYBACK_SEEKING, _onPlaybackSeeking, instance);\n eventBus.off(Events.MEDIA_FRAGMENT_LOADED, _onMediaFragmentLoaded, instance);\n eventBus.off(Events.METRIC_ADDED, _onMetricAdded, instance);\n eventBus.off(Events.QUALITY_CHANGE_REQUESTED, _onQualityChangeRequested, instance);\n }\n\n instance = {\n getMaxIndex: getMaxIndex,\n reset: reset\n };\n\n setup();\n return instance;\n}\n\nL2ARule.__dashjs_factory_name = 'L2ARule';\nexport default FactoryMaker.getClassFactory(L2ARule);\n","\nimport FactoryMaker from '../../../core/FactoryMaker';\nimport Debug from '../../../core/Debug';\nimport SwitchRequest from '../SwitchRequest';\n\nfunction SwitchHistoryRule() {\n\n const context = this.context;\n\n let instance,\n logger;\n\n //MAX_SWITCH is the number of drops made. It doesn't consider the size of the drop.\n const MAX_SWITCH = 0.075;\n\n //Before this number of switch requests(no switch or actual), don't apply the rule.\n //must be < SwitchRequestHistory SWITCH_REQUEST_HISTORY_DEPTH to enable rule\n const SAMPLE_SIZE = 6;\n\n function setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n }\n\n function getMaxIndex(rulesContext) {\n const switchRequestHistory = rulesContext ? rulesContext.getSwitchHistory() : null;\n const switchRequests = switchRequestHistory ? switchRequestHistory.getSwitchRequests() : [];\n let drops = 0;\n let noDrops = 0;\n let dropSize = 0;\n const switchRequest = SwitchRequest(context).create();\n\n for (let i = 0; i < switchRequests.length; i++) {\n if (switchRequests[i] !== undefined) {\n drops += switchRequests[i].drops;\n noDrops += switchRequests[i].noDrops;\n dropSize += switchRequests[i].dropSize;\n\n if (drops + noDrops >= SAMPLE_SIZE && (drops / noDrops > MAX_SWITCH)) {\n switchRequest.quality = (i > 0 && switchRequests[i].drops > 0) ? i - 1 : i;\n switchRequest.reason = {index: switchRequest.quality, drops: drops, noDrops: noDrops, dropSize: dropSize};\n logger.debug('Switch history rule index: ' + switchRequest.quality + ' samples: ' + (drops + noDrops) + ' drops: ' + drops);\n break;\n }\n }\n }\n\n return switchRequest;\n }\n\n instance = {\n getMaxIndex: getMaxIndex\n };\n\n setup();\n\n return instance;\n}\n\n\nSwitchHistoryRule.__dashjs_factory_name = 'SwitchHistoryRule';\nexport default FactoryMaker.getClassFactory(SwitchHistoryRule);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport FactoryMaker from '../../../core/FactoryMaker';\nimport SwitchRequest from '../SwitchRequest';\nimport Constants from '../../constants/Constants';\nimport MetricsConstants from '../../constants/MetricsConstants';\n\nfunction ThroughputRule(config) {\n\n config = config || {};\n const context = this.context;\n const dashMetrics = config.dashMetrics;\n\n let instance;\n\n function setup() {\n }\n\n function checkConfig() {\n if (!dashMetrics || !dashMetrics.hasOwnProperty('getCurrentBufferState')) {\n throw new Error(Constants.MISSING_CONFIG_ERROR);\n }\n }\n\n function getMaxIndex(rulesContext) {\n const switchRequest = SwitchRequest(context).create();\n\n if (!rulesContext || !rulesContext.hasOwnProperty('getMediaInfo') || !rulesContext.hasOwnProperty('getMediaType') || !rulesContext.hasOwnProperty('useBufferOccupancyABR') ||\n !rulesContext.hasOwnProperty('getAbrController') || !rulesContext.hasOwnProperty('getScheduleController')) {\n return switchRequest;\n }\n\n checkConfig();\n\n const mediaInfo = rulesContext.getMediaInfo();\n const mediaType = rulesContext.getMediaType();\n const currentBufferState = dashMetrics.getCurrentBufferState(mediaType);\n const scheduleController = rulesContext.getScheduleController();\n const abrController = rulesContext.getAbrController();\n const streamInfo = rulesContext.getStreamInfo();\n const streamId = streamInfo ? streamInfo.id : null;\n const isDynamic = streamInfo && streamInfo.manifestInfo ? streamInfo.manifestInfo.isDynamic : null;\n const throughputHistory = abrController.getThroughputHistory();\n const throughput = throughputHistory.getSafeAverageThroughput(mediaType, isDynamic);\n const latency = throughputHistory.getAverageLatency(mediaType);\n const useBufferOccupancyABR = rulesContext.useBufferOccupancyABR();\n\n if (isNaN(throughput) || !currentBufferState || useBufferOccupancyABR) {\n return switchRequest;\n }\n\n if (abrController.getAbandonmentStateFor(streamId, mediaType) !== MetricsConstants.ABANDON_LOAD) {\n if (currentBufferState.state === MetricsConstants.BUFFER_LOADED || isDynamic) {\n switchRequest.quality = abrController.getQualityForBitrate(mediaInfo, throughput, streamId, latency);\n scheduleController.setTimeToLoadDelay(0);\n switchRequest.reason = {throughput: throughput, latency: latency};\n }\n }\n\n return switchRequest;\n }\n\n function reset() {\n // no persistent information to reset\n }\n\n instance = {\n getMaxIndex,\n reset\n };\n\n setup();\n\n return instance;\n}\n\nThroughputRule.__dashjs_factory_name = 'ThroughputRule';\nexport default FactoryMaker.getClassFactory(ThroughputRule);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n * Authors:\n * Abdelhak Bentaleb | National University of Singapore | bentaleb@comp.nus.edu.sg\n * Mehmet N. Akcay | Ozyegin University | necmettin.akcay@ozu.edu.tr\n * May Lim | National University of Singapore | maylim@comp.nus.edu.sg\n */\n\nimport FactoryMaker from '../../../../core/FactoryMaker';\nimport Debug from '../../../../core/Debug';\n\nconst WEIGHT_SELECTION_MODES = {\n MANUAL: 'manual_weight_selection',\n RANDOM: 'random_weight_selection',\n DYNAMIC: 'dynamic_weight_selection'\n};\n\nfunction LearningAbrController() {\n const context = this.context;\n\n let instance,\n logger,\n somBitrateNeurons,\n bitrateNormalizationFactor,\n latencyNormalizationFactor,\n minBitrate,\n weights,\n sortedCenters,\n weightSelectionMode;\n\n /**\n * Setup the class\n */\n function _setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n _resetInitialSettings();\n }\n\n /**\n * Reset all values\n */\n function reset() {\n _resetInitialSettings();\n }\n\n /**\n * Reset to initial settings\n * @private\n */\n function _resetInitialSettings() {\n somBitrateNeurons = null;\n bitrateNormalizationFactor = 1;\n latencyNormalizationFactor = 100;\n minBitrate = 0;\n weights = null;\n sortedCenters = null;\n weightSelectionMode = WEIGHT_SELECTION_MODES.DYNAMIC;\n }\n\n /**\n * Returns the maximum throughput\n * @return {number}\n * @private\n */\n function _getMaxThroughput() {\n let maxThroughput = 0;\n\n if (somBitrateNeurons) {\n for (let i = 0; i < somBitrateNeurons.length; i++) {\n let neuron = somBitrateNeurons[i];\n if (neuron.state.throughput > maxThroughput) {\n maxThroughput = neuron.state.throughput;\n }\n }\n }\n\n return maxThroughput;\n }\n\n /**\n *\n * @param {array} w\n * @return {number}\n * @private\n */\n function _getMagnitude(w) {\n const magnitude = w.map((x) => (Math.pow(x, 2))).reduce((sum, now) => sum + now);\n\n return Math.sqrt(magnitude);\n }\n\n /**\n *\n * @param {array} a\n * @param {array} b\n * @param {array} w\n * @return {number}\n * @private\n */\n function _getDistance(a, b, w) {\n let sum = a\n .map((x, i) => (w[i] * (Math.pow(x - b[i], 2)))) // square the difference*w\n .reduce((sum, now) => sum + now); // sum\n let sign = (sum < 0) ? -1 : 1;\n\n return sign * Math.sqrt(Math.abs(sum));\n }\n\n /**\n *\n * @param {object} a\n * @param {object} b\n * @return {number}\n * @private\n */\n function _getNeuronDistance(a, b) {\n let aState = [a.state.throughput, a.state.latency, a.state.rebuffer, a.state.switch];\n let bState = [b.state.throughput, b.state.latency, b.state.rebuffer, b.state.switch];\n\n return _getDistance(aState, bState, [1, 1, 1, 1]);\n }\n\n /**\n *\n * @param {object} winnerNeuron\n * @param {array} somElements\n * @param {array} x\n * @private\n */\n function _updateNeurons(winnerNeuron, somElements, x) {\n for (let i = 0; i < somElements.length; i++) {\n let somNeuron = somElements[i];\n let sigma = 0.1;\n const neuronDistance = _getNeuronDistance(somNeuron, winnerNeuron);\n let neighbourHood = Math.exp(-1 * Math.pow(neuronDistance, 2) / (2 * Math.pow(sigma, 2)));\n _updateNeuronState(somNeuron, x, neighbourHood);\n }\n }\n\n /**\n *\n * @param {object} neuron\n * @param {array} x\n * @param {object} neighbourHood\n * @private\n */\n function _updateNeuronState(neuron, x, neighbourHood) {\n let state = neuron.state;\n let w = [0.01, 0.01, 0.01, 0.01]; // learning rate\n\n state.throughput = state.throughput + (x[0] - state.throughput) * w[0] * neighbourHood;\n state.latency = state.latency + (x[1] - state.latency) * w[1] * neighbourHood;\n state.rebuffer = state.rebuffer + (x[2] - state.rebuffer) * w[2] * neighbourHood;\n state.switch = state.switch + (x[3] - state.switch) * w[3] * neighbourHood;\n }\n\n /**\n *\n * @param {object} currentNeuron\n * @param {number} currentThroughput\n * @return {object}\n * @private\n */\n function _getDownShiftNeuron(currentNeuron, currentThroughput) {\n let maxSuitableBitrate = 0;\n let result = currentNeuron;\n\n if (somBitrateNeurons) {\n for (let i = 0; i < somBitrateNeurons.length; i++) {\n let n = somBitrateNeurons[i];\n if (n.bitrate < currentNeuron.bitrate && n.bitrate > maxSuitableBitrate && currentThroughput > n.bitrate) {\n // possible downshiftable neuron\n maxSuitableBitrate = n.bitrate;\n result = n;\n }\n }\n }\n\n return result;\n }\n\n /**\n *\n * @param {object} mediaInfo\n * @param {number} throughput\n * @param {number} latency\n * @param {number} bufferSize\n * @param {number} playbackRate\n * @param {number} currentQualityIndex\n * @param {object} dynamicWeightsSelector\n * @return {null|*}\n */\n function getNextQuality(mediaInfo, throughput, latency, bufferSize, playbackRate, currentQualityIndex, dynamicWeightsSelector) {\n // For Dynamic Weights Selector\n let currentLatency = latency;\n let currentBuffer = bufferSize;\n let currentThroughput = throughput;\n\n let somElements = _getSomBitrateNeurons(mediaInfo);\n // normalize throughput\n let throughputNormalized = throughput / bitrateNormalizationFactor;\n // saturate values higher than 1\n if (throughputNormalized > 1) {\n throughputNormalized = _getMaxThroughput();\n }\n // normalize latency\n latency = latency / latencyNormalizationFactor;\n\n const targetLatency = 0;\n const targetRebufferLevel = 0;\n const targetSwitch = 0;\n // 10K + video encoding is the recommended throughput\n const throughputDelta = 10000;\n\n logger.debug(`getNextQuality called throughput:${throughputNormalized} latency:${latency} bufferSize:${bufferSize} currentQualityIndex:${currentQualityIndex} playbackRate:${playbackRate}`);\n\n let currentNeuron = somElements[currentQualityIndex];\n let downloadTime = (currentNeuron.bitrate * dynamicWeightsSelector.getSegmentDuration()) / currentThroughput;\n let rebuffer = Math.max(0, (downloadTime - currentBuffer));\n\n // check buffer for possible stall\n if (currentBuffer - downloadTime < dynamicWeightsSelector.getMinBuffer()) {\n logger.debug(`Buffer is low for bitrate= ${currentNeuron.bitrate} downloadTime=${downloadTime} currentBuffer=${currentBuffer} rebuffer=${rebuffer}`);\n return _getDownShiftNeuron(currentNeuron, currentThroughput).qualityIndex;\n }\n\n switch (weightSelectionMode) {\n case WEIGHT_SELECTION_MODES.MANUAL:\n _manualWeightSelection();\n break;\n case WEIGHT_SELECTION_MODES.RANDOM:\n _randomWeightSelection(somElements);\n break;\n case WEIGHT_SELECTION_MODES.DYNAMIC:\n _dynamicWeightSelection(dynamicWeightsSelector, somElements, currentLatency, currentBuffer, rebuffer, currentThroughput, playbackRate);\n break;\n default:\n _dynamicWeightSelection(dynamicWeightsSelector, somElements, currentLatency, currentBuffer, rebuffer, currentThroughput, playbackRate);\n\n }\n\n let minDistance = null;\n let minIndex = null;\n let winnerNeuron = null;\n\n for (let i = 0; i < somElements.length; i++) {\n let somNeuron = somElements[i];\n let somNeuronState = somNeuron.state;\n let somData = [somNeuronState.throughput,\n somNeuronState.latency,\n somNeuronState.rebuffer,\n somNeuronState.switch];\n\n let distanceWeights = weights.slice();\n let nextBuffer = dynamicWeightsSelector.getNextBufferWithBitrate(somNeuron.bitrate, currentBuffer, currentThroughput);\n let isBufferLow = nextBuffer < dynamicWeightsSelector.getMinBuffer();\n if (isBufferLow) {\n logger.debug(`Buffer is low for bitrate=${somNeuron.bitrate} downloadTime=${downloadTime} currentBuffer=${currentBuffer} nextBuffer=${nextBuffer}`);\n }\n // special condition downshift immediately\n if (somNeuron.bitrate > throughput - throughputDelta || isBufferLow) {\n if (somNeuron.bitrate !== minBitrate) {\n // encourage to pick smaller bitrates throughputWeight=100\n distanceWeights[0] = 100;\n }\n }\n\n // calculate the distance with the target\n let distance = _getDistance(somData, [throughputNormalized, targetLatency, targetRebufferLevel, targetSwitch], distanceWeights);\n if (minDistance === null || distance < minDistance) {\n minDistance = distance;\n minIndex = somNeuron.qualityIndex;\n winnerNeuron = somNeuron;\n }\n }\n\n // update current neuron and the neighbourhood with the calculated QoE\n // will punish current if it is not picked\n let bitrateSwitch = Math.abs(currentNeuron.bitrate - winnerNeuron.bitrate) / bitrateNormalizationFactor;\n _updateNeurons(currentNeuron, somElements, [throughputNormalized, latency, rebuffer, bitrateSwitch]);\n\n // update bmu and neighbours with targetQoE=1, targetLatency=0\n _updateNeurons(winnerNeuron, somElements, [throughputNormalized, targetLatency, targetRebufferLevel, bitrateSwitch]);\n\n return minIndex;\n }\n\n /**\n * Option 1: Manual weights\n * @private\n */\n function _manualWeightSelection() {\n let throughputWeight = 0.4;\n let latencyWeight = 0.4;\n let bufferWeight = 0.4;\n let switchWeight = 0.4;\n\n weights = [throughputWeight, latencyWeight, bufferWeight, switchWeight]; // throughput, latency, buffer, switch\n }\n\n /**\n * Option 2: Random (Xavier) weights\n * @param {array} somElements\n * @private\n */\n function _randomWeightSelection(somElements) {\n weights = _getXavierWeights(somElements.length, 4);\n }\n\n /**\n * Dynamic Weight Selector weights\n * @param {object} dynamicWeightsSelector\n * @param {array} somElements\n * @param {number} currentLatency\n * @param {number} currentBuffer\n * @param {number} rebuffer\n * @param {number} currentThroughput\n * @param {number} playbackRate\n * @private\n */\n function _dynamicWeightSelection(dynamicWeightsSelector, somElements, currentLatency, currentBuffer, rebuffer, currentThroughput, playbackRate) {\n if (!weights) {\n weights = sortedCenters[sortedCenters.length - 1];\n }\n // Dynamic Weights Selector (step 2/2: find weights)\n let weightVector = dynamicWeightsSelector.findWeightVector(somElements, currentLatency, currentBuffer, rebuffer, currentThroughput, playbackRate);\n if (weightVector !== null && weightVector !== -1) { // null: something went wrong, -1: constraints not met\n weights = weightVector;\n }\n }\n\n /**\n *\n * @param {number }neuronCount\n * @param {number }weightCount\n * @return {array}\n * @private\n */\n function _getXavierWeights(neuronCount, weightCount) {\n let W = [];\n let upperBound = Math.sqrt((2 / neuronCount));\n\n for (let i = 0; i < weightCount; i++) {\n W.push(Math.random() * upperBound);\n }\n\n weights = W;\n\n return weights;\n }\n\n /**\n *\n * @param {object} mediaInfo\n * @return {array}\n * @private\n */\n function _getSomBitrateNeurons(mediaInfo) {\n if (!somBitrateNeurons) {\n somBitrateNeurons = [];\n const bitrateList = mediaInfo.bitrateList;\n let bitrateVector = [];\n minBitrate = bitrateList[0].bandwidth;\n\n bitrateList.forEach(element => {\n bitrateVector.push(element.bandwidth);\n if (element.bandwidth < minBitrate) {\n minBitrate = element.bandwidth;\n }\n });\n bitrateNormalizationFactor = _getMagnitude(bitrateVector);\n\n for (let i = 0; i < bitrateList.length; i++) {\n let neuron = {\n qualityIndex: i,\n bitrate: bitrateList[i].bandwidth,\n state: {\n // normalize throughputs\n throughput: bitrateList[i].bandwidth / bitrateNormalizationFactor,\n latency: 0,\n rebuffer: 0,\n switch: 0\n }\n };\n somBitrateNeurons.push(neuron);\n }\n\n sortedCenters = _getInitialKmeansPlusPlusCenters(somBitrateNeurons);\n }\n\n return somBitrateNeurons;\n }\n\n /**\n *\n * @param {number} size\n * @return {array}\n * @private\n */\n function _getRandomData(size) {\n let dataArray = [];\n\n for (let i = 0; i < size; i++) {\n let data = [\n Math.random() * _getMaxThroughput(), //throughput\n Math.random(), //latency\n Math.random(), //buffersize\n Math.random() //switch\n ];\n dataArray.push(data);\n }\n\n return dataArray;\n }\n\n /**\n *\n * @param {array} somElements\n * @return {array}\n * @private\n */\n function _getInitialKmeansPlusPlusCenters(somElements) {\n let centers = [];\n let randomDataSet = _getRandomData(Math.pow(somElements.length, 2));\n centers.push(randomDataSet[0]);\n let distanceWeights = [1, 1, 1, 1];\n\n for (let k = 1; k < somElements.length; k++) {\n let nextPoint = null;\n let maxDistance = null;\n for (let i = 0; i < randomDataSet.length; i++) {\n let currentPoint = randomDataSet[i];\n let minDistance = null;\n for (let j = 0; j < centers.length; j++) {\n let distance = _getDistance(currentPoint, centers[j], distanceWeights);\n if (minDistance === null || distance < minDistance) {\n minDistance = distance;\n }\n }\n if (maxDistance === null || minDistance > maxDistance) {\n nextPoint = currentPoint;\n maxDistance = minDistance;\n }\n }\n centers.push(nextPoint);\n }\n\n // find the least similar center\n let maxDistance = null;\n let leastSimilarIndex = null;\n for (let i = 0; i < centers.length; i++) {\n let distance = 0;\n for (let j = 0; j < centers.length; j++) {\n if (i === j) continue;\n distance += _getDistance(centers[i], centers[j], distanceWeights);\n }\n if (maxDistance === null || distance > maxDistance) {\n maxDistance = distance;\n leastSimilarIndex = i;\n }\n }\n\n // move centers to sortedCenters\n let sortedCenters = [];\n sortedCenters.push(centers[leastSimilarIndex]);\n centers.splice(leastSimilarIndex, 1);\n while (centers.length > 0) {\n let minDistance = null;\n let minIndex = null;\n for (let i = 0; i < centers.length; i++) {\n let distance = _getDistance(sortedCenters[0], centers[i], distanceWeights);\n if (minDistance === null || distance < minDistance) {\n minDistance = distance;\n minIndex = i;\n }\n }\n sortedCenters.push(centers[minIndex]);\n centers.splice(minIndex, 1);\n }\n\n return sortedCenters;\n }\n\n instance = {\n getNextQuality,\n reset\n };\n\n _setup();\n return instance;\n}\n\nLearningAbrController.__dashjs_factory_name = 'LearningAbrController';\nexport default FactoryMaker.getClassFactory(LearningAbrController);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n * Authors:\n * Abdelhak Bentaleb | National University of Singapore | bentaleb@comp.nus.edu.sg\n * Mehmet N. Akcay | Ozyegin University | necmettin.akcay@ozu.edu.tr\n * May Lim | National University of Singapore | maylim@comp.nus.edu.sg\n */\nimport FactoryMaker from '../../../../core/FactoryMaker';\nimport QoeInfo from './QoeInfo';\n\nfunction LoLpQoeEvaluator() {\n\n let instance,\n voPerSegmentQoeInfo,\n segmentDuration,\n maxBitrateKbps,\n minBitrateKbps;\n\n function _setup() {\n _resetInitialSettings();\n }\n\n function _resetInitialSettings() {\n voPerSegmentQoeInfo = null;\n segmentDuration = null;\n maxBitrateKbps = null;\n minBitrateKbps = null;\n }\n\n function setupPerSegmentQoe(sDuration, maxBrKbps, minBrKbps) {\n // Set up Per Segment QoeInfo\n voPerSegmentQoeInfo = _createQoeInfo('segment', sDuration, maxBrKbps, minBrKbps);\n segmentDuration = sDuration;\n maxBitrateKbps = maxBrKbps;\n minBitrateKbps = minBrKbps;\n }\n\n function _createQoeInfo(fragmentType, fragmentDuration, maxBitrateKbps, minBitrateKbps) {\n /*\n * [Weights][Source: Abdelhak Bentaleb, 2020 (last updated: 30 Mar 2020)]\n * bitrateReward: segment duration, e.g. 0.5s\n * bitrateSwitchPenalty: 0.02s or 1s if the bitrate switch is too important\n * rebufferPenalty: max encoding bitrate, e.g. 1000kbps\n * latencyPenalty: if L ≤ 1.1 seconds then = min encoding bitrate * 0.05, otherwise = max encoding bitrate * 0.1\n * playbackSpeedPenalty: min encoding bitrate, e.g. 200kbps\n */\n\n // Create new QoeInfo object\n let qoeInfo = new QoeInfo();\n qoeInfo.type = fragmentType;\n\n // Set weight: bitrateReward\n // set some safe value, else consider throwing error\n if (!fragmentDuration) {\n qoeInfo.weights.bitrateReward = 1;\n } else {\n qoeInfo.weights.bitrateReward = fragmentDuration;\n }\n\n // Set weight: bitrateSwitchPenalty\n // qoeInfo.weights.bitrateSwitchPenalty = 0.02;\n qoeInfo.weights.bitrateSwitchPenalty = 1;\n\n // Set weight: rebufferPenalty\n // set some safe value, else consider throwing error\n if (!maxBitrateKbps) {\n qoeInfo.weights.rebufferPenalty = 1000;\n } else {\n qoeInfo.weights.rebufferPenalty = maxBitrateKbps;\n }\n\n // Set weight: latencyPenalty\n qoeInfo.weights.latencyPenalty = [];\n qoeInfo.weights.latencyPenalty.push({ threshold: 1.1, penalty: (minBitrateKbps * 0.05) });\n qoeInfo.weights.latencyPenalty.push({ threshold: 100000000, penalty: (maxBitrateKbps * 0.1) });\n\n // Set weight: playbackSpeedPenalty\n if (!minBitrateKbps) qoeInfo.weights.playbackSpeedPenalty = 200; // set some safe value, else consider throwing error\n else qoeInfo.weights.playbackSpeedPenalty = minBitrateKbps;\n\n return qoeInfo;\n }\n\n function logSegmentMetrics(segmentBitrate, segmentRebufferTime, currentLatency, currentPlaybackSpeed) {\n if (voPerSegmentQoeInfo) {\n _logMetricsInQoeInfo(segmentBitrate, segmentRebufferTime, currentLatency, currentPlaybackSpeed, voPerSegmentQoeInfo);\n }\n }\n\n function _logMetricsInQoeInfo(bitrate, rebufferTime, latency, playbackSpeed, qoeInfo) {\n // Update: bitrate Weighted Sum value\n qoeInfo.bitrateWSum += (qoeInfo.weights.bitrateReward * bitrate);\n\n // Update: bitrateSwitch Weighted Sum value\n if (qoeInfo.lastBitrate) {\n qoeInfo.bitrateSwitchWSum += (qoeInfo.weights.bitrateSwitchPenalty * Math.abs(bitrate - qoeInfo.lastBitrate));\n }\n qoeInfo.lastBitrate = bitrate;\n\n // Update: rebuffer Weighted Sum value\n qoeInfo.rebufferWSum += (qoeInfo.weights.rebufferPenalty * rebufferTime);\n\n // Update: latency Weighted Sum value\n for (let i = 0; i < qoeInfo.weights.latencyPenalty.length; i++) {\n let latencyRange = qoeInfo.weights.latencyPenalty[i];\n if (latency <= latencyRange.threshold) {\n qoeInfo.latencyWSum += (latencyRange.penalty * latency);\n break;\n }\n }\n\n // Update: playbackSpeed Weighted Sum value\n qoeInfo.playbackSpeedWSum += (qoeInfo.weights.playbackSpeedPenalty * Math.abs(1 - playbackSpeed));\n\n // Update: Total Qoe value\n qoeInfo.totalQoe = qoeInfo.bitrateWSum - qoeInfo.bitrateSwitchWSum - qoeInfo.rebufferWSum - qoeInfo.latencyWSum - qoeInfo.playbackSpeedWSum;\n }\n\n // Returns current Per Segment QoeInfo\n function getPerSegmentQoe() {\n return voPerSegmentQoeInfo;\n }\n\n // For one-time use only\n // Returns totalQoe based on a single set of metrics.\n function calculateSingleUseQoe(segmentBitrate, segmentRebufferTime, currentLatency, currentPlaybackSpeed) {\n let singleUseQoeInfo = null;\n\n if (segmentDuration && maxBitrateKbps && minBitrateKbps) {\n singleUseQoeInfo = _createQoeInfo('segment', segmentDuration, maxBitrateKbps, minBitrateKbps);\n }\n\n if (singleUseQoeInfo) {\n _logMetricsInQoeInfo(segmentBitrate, segmentRebufferTime, currentLatency, currentPlaybackSpeed, singleUseQoeInfo);\n return singleUseQoeInfo.totalQoe;\n } else {\n // Something went wrong..\n return 0;\n }\n }\n\n function reset() {\n _resetInitialSettings();\n }\n\n instance = {\n setupPerSegmentQoe,\n logSegmentMetrics,\n getPerSegmentQoe,\n calculateSingleUseQoe,\n reset\n };\n\n _setup();\n\n return instance;\n}\n\nLoLpQoeEvaluator.__dashjs_factory_name = 'LoLpQoeEvaluator';\nexport default FactoryMaker.getClassFactory(LoLpQoeEvaluator);\n\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n * Authors:\n * Abdelhak Bentaleb | National University of Singapore | bentaleb@comp.nus.edu.sg\n * Mehmet N. Akcay | Ozyegin University | necmettin.akcay@ozu.edu.tr\n * May Lim | National University of Singapore | maylim@comp.nus.edu.sg\n */\n\nimport Debug from '../../../../core/Debug';\nimport FactoryMaker from '../../../../core/FactoryMaker';\nimport LearningAbrController from './LearningAbrController';\nimport LoLpQoeEvaluator from './LoLpQoEEvaluator';\nimport SwitchRequest from '../../SwitchRequest';\nimport MetricsConstants from '../../../constants/MetricsConstants';\nimport LoLpWeightSelector from './LoLpWeightSelector';\nimport Constants from '../../../constants/Constants';\n\nconst DWS_TARGET_LATENCY = 1.5;\nconst DWS_BUFFER_MIN = 0.3;\n\nfunction LoLPRule(config) {\n\n config = config || {};\n\n let dashMetrics = config.dashMetrics;\n let context = this.context;\n\n let logger,\n instance,\n learningController,\n qoeEvaluator;\n\n function _setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n learningController = LearningAbrController(context).create();\n qoeEvaluator = LoLpQoeEvaluator(context).create();\n }\n\n function getMaxIndex(rulesContext) {\n try {\n let switchRequest = SwitchRequest(context).create();\n let mediaType = rulesContext.getMediaInfo().type;\n let abrController = rulesContext.getAbrController();\n const streamInfo = rulesContext.getStreamInfo();\n let currentQuality = abrController.getQualityFor(mediaType, streamInfo.id);\n const mediaInfo = rulesContext.getMediaInfo();\n const bufferStateVO = dashMetrics.getCurrentBufferState(mediaType);\n const scheduleController = rulesContext.getScheduleController();\n const currentBufferLevel = dashMetrics.getCurrentBufferLevel(mediaType, true);\n const isDynamic = streamInfo && streamInfo.manifestInfo ? streamInfo.manifestInfo.isDynamic : null;\n const playbackController = scheduleController.getPlaybackController();\n let latency = playbackController.getCurrentLiveLatency();\n\n if (!rulesContext.useLoLPABR() || (mediaType === Constants.AUDIO)) {\n return switchRequest;\n }\n\n if (!latency) {\n latency = 0;\n }\n\n const playbackRate = playbackController.getPlaybackRate();\n const throughputHistory = abrController.getThroughputHistory();\n const throughput = throughputHistory.getSafeAverageThroughput(mediaType, isDynamic);\n logger.debug(`Throughput ${Math.round(throughput)} kbps`);\n\n if (isNaN(throughput) || !bufferStateVO) {\n return switchRequest;\n }\n\n if (abrController.getAbandonmentStateFor(streamInfo.id, mediaType) === MetricsConstants.ABANDON_LOAD) {\n return switchRequest;\n }\n\n // QoE parameters\n let bitrateList = mediaInfo.bitrateList; // [{bandwidth: 200000, width: 640, height: 360}, ...]\n let segmentDuration = rulesContext.getRepresentationInfo().fragmentDuration;\n let minBitrateKbps = bitrateList[0].bandwidth / 1000.0; // min bitrate level\n let maxBitrateKbps = bitrateList[bitrateList.length - 1].bandwidth / 1000.0; // max bitrate level\n for (let i = 0; i < bitrateList.length; i++) { // in case bitrateList is not sorted as expected\n let b = bitrateList[i].bandwidth / 1000.0;\n if (b > maxBitrateKbps)\n maxBitrateKbps = b;\n else if (b < minBitrateKbps) {\n minBitrateKbps = b;\n }\n }\n\n // Learning rule pre-calculations\n let currentBitrate = bitrateList[currentQuality].bandwidth;\n let currentBitrateKbps = currentBitrate / 1000.0;\n let httpRequest = dashMetrics.getCurrentHttpRequest(mediaType, true);\n let lastFragmentDownloadTime = (httpRequest.tresponse.getTime() - httpRequest.trequest.getTime()) / 1000;\n let segmentRebufferTime = lastFragmentDownloadTime > segmentDuration ? lastFragmentDownloadTime - segmentDuration : 0;\n qoeEvaluator.setupPerSegmentQoe(segmentDuration, maxBitrateKbps, minBitrateKbps);\n qoeEvaluator.logSegmentMetrics(currentBitrateKbps, segmentRebufferTime, latency, playbackRate);\n\n /*\n * Dynamic Weights Selector (step 1/2: initialization)\n */\n let dynamicWeightsSelector = LoLpWeightSelector(context).create({\n targetLatency: DWS_TARGET_LATENCY,\n bufferMin: DWS_BUFFER_MIN,\n segmentDuration,\n qoeEvaluator\n });\n\n /*\n * Select next quality\n */\n switchRequest.quality = learningController.getNextQuality(mediaInfo, throughput * 1000, latency, currentBufferLevel, playbackRate, currentQuality, dynamicWeightsSelector);\n switchRequest.reason = { throughput: throughput, latency: latency };\n switchRequest.priority = SwitchRequest.PRIORITY.STRONG;\n\n scheduleController.setTimeToLoadDelay(0);\n\n if (switchRequest.quality !== currentQuality) {\n logger.debug('[TgcLearningRule][' + mediaType + '] requesting switch to index: ', switchRequest.quality, 'Average throughput', Math.round(throughput), 'kbps');\n }\n\n return switchRequest;\n } catch (e) {\n throw e;\n }\n }\n\n /**\n * Reset objects to their initial state\n * @private\n */\n function _resetInitialSettings() {\n learningController.reset();\n qoeEvaluator.reset();\n }\n\n /**\n * Reset the rule\n */\n function reset() {\n _resetInitialSettings();\n }\n\n instance = {\n getMaxIndex,\n reset\n };\n\n _setup();\n\n return instance;\n}\n\nLoLPRule.__dashjs_factory_name = 'LoLPRule';\nexport default FactoryMaker.getClassFactory(LoLPRule);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n * Authors:\n * Abdelhak Bentaleb | National University of Singapore | bentaleb@comp.nus.edu.sg\n * Mehmet N. Akcay | Ozyegin University | necmettin.akcay@ozu.edu.tr\n * May Lim | National University of Singapore | maylim@comp.nus.edu.sg\n */\n\nimport FactoryMaker from '../../../../core/FactoryMaker';\n\nfunction LoLpWeightSelector(config) {\n let targetLatency = config.targetLatency;\n let bufferMin = config.bufferMin;\n let segmentDuration = config.segmentDuration;\n let qoeEvaluator = config.qoeEvaluator;\n let instance,\n valueList,\n weightTypeCount,\n weightOptions,\n previousLatency;\n\n /**\n *\n * @private\n */\n function _setup() {\n _resetInitialSettings();\n }\n\n /**\n *\n * @private\n */\n function _resetInitialSettings() {\n valueList = [0.2, 0.4, 0.6, 0.8, 1];\n weightTypeCount = 4;\n weightOptions = _getPermutations(valueList, weightTypeCount);\n previousLatency = 0;\n }\n\n /**\n * Next, at each segment boundary, ABR to input current neurons and target state (only used in Method II) to find the desired weight vector\n * @param {array} neurons\n * @param {number} currentLatency\n * @param {number} currentBuffer\n * @param {number} currentRebuffer\n * @param {number} currentThroughput\n * @param {number} playbackRate\n * @return {number|null}\n * @private\n */\n function findWeightVector(neurons, currentLatency, currentBuffer, currentRebuffer, currentThroughput, playbackRate) {\n let maxQoE = null;\n let winnerWeights = null;\n let winnerBitrate = null;\n let deltaLatency = Math.abs(currentLatency - previousLatency);\n\n // For each neuron, m\n neurons.forEach((neuron) => {\n\n // For each possible weight vector, z\n // E.g. For [ throughput, latency, buffer, playbackRate, QoE ]\n // Possible weightVector = [ 0.2, 0.4, 0.2, 0, 0.2 ]\n weightOptions.forEach((weightVector) => {\n\n // Apply weightVector to neuron, compute utility and determine winnerWeights\n // Method I: Utility based on QoE given current state\n\n let weightsObj = {\n throughput: weightVector[0],\n latency: weightVector[1],\n buffer: weightVector[2],\n switch: weightVector[3]\n };\n\n let downloadTime = (neuron.bitrate * segmentDuration) / currentThroughput;\n let nextBuffer = getNextBuffer(currentBuffer, downloadTime);\n let rebuffer = Math.max(0.00001, (downloadTime - nextBuffer));\n let wt;\n if (weightsObj.buffer === 0) {\n wt = 10;\n } else {\n wt = (1 / weightsObj.buffer);\n }\n let weightedRebuffer = wt * rebuffer;\n\n if (weightsObj.latency === 0) {\n wt = 10;\n } else {\n wt = (1 / weightsObj.latency); // inverse the weight because wt and latency should have positive relationship, i.e., higher latency = higher wt\n }\n let weightedLatency = wt * neuron.state.latency;\n\n let totalQoE = qoeEvaluator.calculateSingleUseQoe(neuron.bitrate, weightedRebuffer, weightedLatency, playbackRate);\n if ((maxQoE === null || totalQoE > maxQoE) && _checkConstraints(currentLatency, nextBuffer, deltaLatency)) {\n maxQoE = totalQoE;\n winnerWeights = weightVector;\n winnerBitrate = neuron.bitrate;\n }\n });\n });\n\n // winnerWeights was found, check if constraints are satisfied\n if (winnerWeights === null && winnerBitrate === null) {\n winnerWeights = -1;\n }\n\n previousLatency = currentLatency;\n return winnerWeights;\n }\n\n /**\n *\n * @param {number} nextLatency\n * @param {number} nextBuffer\n * @param {number} deltaLatency\n * @return {boolean}\n * @private\n */\n function _checkConstraints(nextLatency, nextBuffer, deltaLatency) {\n // A1\n // disabled till we find a better way of estimating latency\n // fails for all with current value\n if (nextLatency > targetLatency + deltaLatency) {\n return false;\n }\n\n return nextBuffer >= bufferMin;\n }\n\n /**\n *\n * @param {array} list\n * @param {number} length\n * @return {*}\n * @private\n */\n function _getPermutations(list, length) {\n // Copy initial values as arrays\n let perm = list.map(function (val) {\n return [val];\n });\n // Our permutation generator\n let generate = function (perm, length, currLen) {\n // Reached desired length\n if (currLen === length) {\n return perm;\n }\n // For each existing permutation\n let len = perm.length;\n for (let i = 0; i < len; i++) {\n let currPerm = perm.shift();\n // Create new permutation\n for (let k = 0; k < list.length; k++) {\n perm.push(currPerm.concat(list[k]));\n }\n }\n // Recurse\n return generate(perm, length, currLen + 1);\n };\n // Start with size 1 because of initial values\n return generate(perm, length, 1);\n }\n\n /**\n *\n * @return {number}\n */\n function getMinBuffer() {\n return bufferMin;\n }\n\n /**\n *\n * @return {number}\n */\n function getSegmentDuration() {\n return segmentDuration;\n }\n\n /**\n *\n * @param {number} bitrateToDownload\n * @param {number} currentBuffer\n * @param {number} currentThroughput\n * @return {number}\n */\n function getNextBufferWithBitrate(bitrateToDownload, currentBuffer, currentThroughput) {\n let downloadTime = (bitrateToDownload * segmentDuration) / currentThroughput;\n return getNextBuffer(currentBuffer, downloadTime);\n }\n\n /**\n *\n * @param {number} currentBuffer\n * @param {number} downloadTime\n * @return {number}\n */\n function getNextBuffer(currentBuffer, downloadTime) {\n const segmentDuration = getSegmentDuration();\n let nextBuffer;\n if (downloadTime > segmentDuration) {\n nextBuffer = currentBuffer - segmentDuration;\n } else {\n nextBuffer = currentBuffer + segmentDuration - downloadTime;\n }\n return nextBuffer;\n }\n\n instance = {\n getMinBuffer,\n getSegmentDuration,\n getNextBufferWithBitrate,\n getNextBuffer,\n findWeightVector\n };\n\n _setup();\n\n return instance;\n}\n\nLoLpWeightSelector.__dashjs_factory_name = 'LoLpWeightSelector';\nexport default FactoryMaker.getClassFactory(LoLpWeightSelector);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n * @class\n * @ignore\n */\nclass QoeInfo {\n\n constructor() {\n // Type e.g. 'segment'\n this.type = null;\n\n // Store lastBitrate for calculation of bitrateSwitchWSum\n this.lastBitrate = null;\n\n // Weights for each Qoe factor\n this.weights = {};\n this.weights.bitrateReward = null;\n this.weights.bitrateSwitchPenalty = null;\n this.weights.rebufferPenalty = null;\n this.weights.latencyPenalty = null;\n this.weights.playbackSpeedPenalty = null;\n\n // Weighted Sum for each Qoe factor\n this.bitrateWSum = 0;// kbps\n this.bitrateSwitchWSum = 0;// kbps\n this.rebufferWSum = 0;// seconds\n this.latencyWSum = 0;// seconds\n this.playbackSpeedWSum = 0;// e.g. 0.95, 1.0, 1.05\n\n // Store total Qoe value based on current Weighted Sum values\n this.totalQoe = 0;\n }\n}\n\nexport default QoeInfo;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport Constants from '../constants/Constants';\nimport DashConstants from '../../dash/constants/DashConstants';\nimport FactoryMaker from '../../core/FactoryMaker';\nimport ThumbnailTrackInfo from '../vo/ThumbnailTrackInfo';\nimport URLUtils from '../../streaming/utils/URLUtils';\nimport {replaceIDForTemplate, getTimeBasedSegment} from '../../dash/utils/SegmentsUtils';\nimport BoxParser from '../../streaming/utils/BoxParser';\nimport XHRLoader from '../../streaming/net/XHRLoader';\nimport DashHandler from '../../dash/DashHandler';\nimport SegmentsController from '../../dash/controllers/SegmentsController';\n\nexport const THUMBNAILS_SCHEME_ID_URIS = ['http://dashif.org/thumbnail_tile',\n 'http://dashif.org/guidelines/thumbnail_tile'];\n\nfunction ThumbnailTracks(config) {\n const context = this.context;\n const adapter = config.adapter;\n const baseURLController = config.baseURLController;\n const streamInfo = config.streamInfo;\n const timelineConverter = config.timelineConverter;\n const debug = config.debug;\n const eventBus = config.eventBus;\n const events = config.events;\n const dashConstants = config.dashConstants;\n\n const urlUtils = URLUtils(context).getInstance();\n\n let instance,\n tracks,\n dashHandler,\n currentTrackIndex,\n mediaInfo,\n segmentsController,\n loader,\n boxParser;\n\n function setup() {\n reset();\n loader = XHRLoader(context).create({});\n boxParser = BoxParser(context).getInstance();\n\n segmentsController = SegmentsController(context).create({\n events,\n eventBus,\n streamInfo,\n timelineConverter,\n dashConstants,\n dashMetrics: config.dashMetrics,\n segmentBaseController: config.segmentBaseController,\n type: Constants.IMAGE\n });\n\n dashHandler = DashHandler(context).create({\n streamInfo,\n type: Constants.IMAGE,\n timelineConverter,\n segmentsController,\n baseURLController,\n debug,\n eventBus,\n events,\n dashConstants,\n urlUtils\n });\n\n // initialize controllers\n dashHandler.initialize(adapter ? adapter.getIsDynamic() : false);\n }\n\n function addTracks() {\n if (!streamInfo || !adapter) {\n return;\n }\n\n // Extract thumbnail tracks\n mediaInfo = adapter.getMediaInfoForType(streamInfo, Constants.IMAGE);\n if (!mediaInfo) {\n return;\n }\n\n const voReps = adapter.getVoRepresentations(mediaInfo);\n\n if (voReps && voReps.length > 0) {\n voReps.forEach((rep) => {\n if ((rep.segmentInfoType === DashConstants.SEGMENT_TEMPLATE && rep.segmentDuration > 0 && rep.media) ||\n rep.segmentInfoType === DashConstants.SEGMENT_TIMELINE) {\n _createTrack(rep);\n }\n if (rep.segmentInfoType === DashConstants.SEGMENT_BASE) {\n _createTrack(rep, true);\n }\n });\n }\n\n if (tracks.length > 0) {\n // Sort bitrates and select the lowest bitrate rendition\n tracks.sort((a, b) => a.bitrate - b.bitrate);\n }\n }\n\n function _createTrack(representation, useSegmentBase) {\n const track = new ThumbnailTrackInfo();\n track.id = representation.id;\n track.bitrate = representation.bandwidth;\n track.width = representation.width;\n track.height = representation.height;\n track.tilesHor = 1;\n track.tilesVert = 1;\n\n if (representation.essentialProperties) {\n representation.essentialProperties.forEach((p) => {\n if (THUMBNAILS_SCHEME_ID_URIS.indexOf(p.schemeIdUri) >= 0 && p.value) {\n const vars = p.value.split('x');\n if (vars.length === 2 && !isNaN(vars[0]) && !isNaN(vars[1])) {\n track.tilesHor = parseInt(vars[0], 10);\n track.tilesVert = parseInt(vars[1], 10);\n }\n }\n });\n }\n\n if (useSegmentBase) {\n segmentsController.updateSegmentData(representation)\n .then((data) => {\n _handleUpdatedSegmentData(track, representation, data);\n });\n\n } else {\n track.startNumber = representation.startNumber;\n track.segmentDuration = representation.segmentDuration;\n track.timescale = representation.timescale;\n track.templateUrl = buildTemplateUrl(representation);\n }\n\n if (track.tilesHor > 0 && track.tilesVert > 0) {\n // Precalculate width and heigth per tile for perf reasons\n track.widthPerTile = track.width / track.tilesHor;\n track.heightPerTile = track.height / track.tilesVert;\n tracks.push(track);\n }\n }\n\n function _handleUpdatedSegmentData(track, representation, data) {\n let cache = [];\n const segments = _normalizeSegments(data, representation);\n representation.segments = segments;\n track.segmentDuration = representation.segments[0].duration; //assume all segments have the same duration\n\n track.readThumbnail = function (time, callback) {\n\n let cached = null;\n cache.some(el => {\n if (el.start <= time && el.end > time) {\n cached = el.url;\n return true;\n }\n });\n if (cached) {\n callback(cached);\n } else {\n representation.segments.some((ss) => {\n if (ss.mediaStartTime <= time && ss.mediaStartTime + ss.duration > time) {\n const baseURL = baseURLController.resolve(representation.path);\n loader.load({\n method: 'get',\n url: baseURL.url,\n request: {\n range: ss.mediaRange,\n responseType: 'arraybuffer'\n },\n onload: function (e) {\n let info = boxParser.getSamplesInfo(e.target.response);\n let blob = new Blob([e.target.response.slice(info.sampleList[0].offset, info.sampleList[0].offset + info.sampleList[0].size)], { type: 'image/jpeg' });\n let imageUrl = window.URL.createObjectURL(blob);\n cache.push({\n start: ss.mediaStartTime,\n end: ss.mediaStartTime + ss.duration,\n url: imageUrl\n });\n if (callback)\n callback(imageUrl);\n }\n });\n return true;\n }\n });\n }\n };\n }\n\n function _normalizeSegments(data, representation) {\n const segments = [];\n let count = 0;\n\n let i,\n len,\n s,\n seg;\n\n for (i = 0, len = data.segments.length; i < len; i++) {\n s = data.segments[i];\n\n seg = getTimeBasedSegment(\n timelineConverter,\n adapter.getIsDynamic(),\n representation,\n s.startTime,\n s.duration,\n s.timescale,\n s.media,\n s.mediaRange,\n count);\n\n if (seg) {\n segments.push(seg);\n seg = null;\n count++;\n }\n }\n return segments;\n }\n\n function buildTemplateUrl(representation) {\n const templateUrl = urlUtils.isRelative(representation.media) ?\n urlUtils.resolve(representation.media, baseURLController.resolve(representation.path).url) : representation.media;\n\n if (!templateUrl) {\n return '';\n }\n\n return replaceIDForTemplate(templateUrl, representation.id);\n }\n\n function getTracks() {\n return tracks;\n }\n\n function getCurrentTrackIndex() {\n return currentTrackIndex;\n }\n\n function getCurrentTrack() {\n if (currentTrackIndex < 0) {\n return null;\n }\n return tracks[currentTrackIndex];\n }\n\n function setTrackByIndex(index) {\n if (!tracks || tracks.length === 0) {\n return;\n }\n // select highest bitrate in case selected index is higher than bitrate list length\n if (index >= tracks.length) {\n index = tracks.length - 1;\n }\n currentTrackIndex = index;\n }\n\n function getThumbnailRequestForTime(time) {\n let currentVoRep;\n const voReps = adapter.getVoRepresentations(mediaInfo);\n for (let i = 0; i < voReps.length; i++) {\n if (tracks[currentTrackIndex].id === voReps[i].id) {\n currentVoRep = voReps[i];\n break;\n }\n }\n\n return dashHandler.getSegmentRequestForTime(mediaInfo, currentVoRep, time);\n }\n\n function reset() {\n tracks = [];\n currentTrackIndex = -1;\n mediaInfo = null;\n }\n\n instance = {\n getTracks,\n addTracks,\n reset,\n setTrackByIndex,\n getCurrentTrack,\n getCurrentTrackIndex,\n getThumbnailRequestForTime\n };\n\n setup();\n\n return instance;\n}\n\nThumbnailTracks.__dashjs_factory_name = 'ThumbnailTracks';\nexport default FactoryMaker.getClassFactory(ThumbnailTracks);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport Debug from '../../core/Debug';\nimport IsoFile from './IsoFile';\nimport FactoryMaker from '../../core/FactoryMaker';\nimport ISOBoxer from 'codem-isoboxer';\n\nimport IsoBoxSearchInfo from '../vo/IsoBoxSearchInfo';\n\nfunction BoxParser(/*config*/) {\n\n let logger,\n instance;\n let context = this.context;\n\n function setup() {\n logger = Debug(context).getInstance().getLogger(instance);\n }\n\n /**\n * @param {ArrayBuffer} data\n * @returns {IsoFile|null}\n * @memberof BoxParser#\n */\n function parse(data) {\n if (!data) return null;\n\n if (data.fileStart === undefined) {\n data.fileStart = 0;\n }\n\n let parsedFile = ISOBoxer.parseBuffer(data);\n let dashIsoFile = IsoFile(context).create();\n\n dashIsoFile.setData(parsedFile);\n\n return dashIsoFile;\n }\n\n /**\n * From the list of type boxes to look for, returns the latest one that is fully completed (header + payload). This\n * method only looks into the list of top boxes and doesn't analyze nested boxes.\n * @param {string[]} types\n * @param {ArrayBuffer|uint8Array} buffer\n * @param {number} offset\n * @returns {IsoBoxSearchInfo}\n * @memberof BoxParser#\n */\n function findLastTopIsoBoxCompleted(types, buffer, offset) {\n if (offset === undefined) {\n offset = 0;\n }\n\n // 8 = size (uint32) + type (4 characters)\n if (!buffer || offset + 8 >= buffer.byteLength) {\n return new IsoBoxSearchInfo(0, false);\n }\n\n const data = (buffer instanceof ArrayBuffer) ? new Uint8Array(buffer) : buffer;\n let boxInfo;\n let lastCompletedOffset = 0;\n while (offset < data.byteLength) {\n const boxSize = parseUint32(data, offset);\n const boxType = parseIsoBoxType(data, offset + 4);\n\n if (boxSize === 0) {\n break;\n }\n\n if (offset + boxSize <= data.byteLength) {\n if (types.indexOf(boxType) >= 0) {\n boxInfo = new IsoBoxSearchInfo(offset, true, boxSize);\n } else {\n lastCompletedOffset = offset + boxSize;\n }\n }\n\n offset += boxSize;\n }\n\n if (!boxInfo) {\n return new IsoBoxSearchInfo(lastCompletedOffset, false);\n }\n\n return boxInfo;\n }\n\n function getSamplesInfo(ab) {\n if (!ab || ab.byteLength === 0) {\n return {sampleList: [], lastSequenceNumber: NaN, totalDuration: NaN, numSequences: NaN};\n }\n let isoFile = parse(ab);\n // zero or more moofs\n let moofBoxes = isoFile.getBoxes('moof');\n // exactly one mfhd per moof\n let mfhdBoxes = isoFile.getBoxes('mfhd');\n\n let sampleDuration,\n sampleCompositionTimeOffset,\n sampleCount,\n sampleSize,\n sampleDts,\n sampleList,\n sample,\n i, j, k, l, m, n,\n dataOffset,\n lastSequenceNumber,\n numSequences,\n totalDuration;\n\n numSequences = isoFile.getBoxes('moof').length;\n lastSequenceNumber = mfhdBoxes[mfhdBoxes.length - 1].sequence_number;\n sampleCount = 0;\n\n sampleList = [];\n let subsIndex = -1;\n let nextSubsSample = -1;\n for (l = 0; l < moofBoxes.length; l++) {\n let moofBox = moofBoxes[l];\n // zero or more trafs per moof\n let trafBoxes = moofBox.getChildBoxes('traf');\n for (j = 0; j < trafBoxes.length; j++) {\n let trafBox = trafBoxes[j];\n // exactly one tfhd per traf\n let tfhdBox = trafBox.getChildBox('tfhd');\n // zero or one tfdt per traf\n let tfdtBox = trafBox.getChildBox('tfdt');\n sampleDts = tfdtBox.baseMediaDecodeTime;\n // zero or more truns per traf\n let trunBoxes = trafBox.getChildBoxes('trun');\n // zero or more subs per traf\n let subsBoxes = trafBox.getChildBoxes('subs');\n for (k = 0; k < trunBoxes.length; k++) {\n let trunBox = trunBoxes[k];\n sampleCount = trunBox.sample_count;\n dataOffset = (tfhdBox.base_data_offset || 0) + (trunBox.data_offset || 0);\n\n for (i = 0; i < sampleCount; i++) {\n sample = trunBox.samples[i];\n sampleDuration = (sample.sample_duration !== undefined) ? sample.sample_duration : tfhdBox.default_sample_duration;\n sampleSize = (sample.sample_size !== undefined) ? sample.sample_size : tfhdBox.default_sample_size;\n sampleCompositionTimeOffset = (sample.sample_composition_time_offset !== undefined) ? sample.sample_composition_time_offset : 0;\n let sampleData = {\n 'dts': sampleDts,\n 'cts': (sampleDts + sampleCompositionTimeOffset),\n 'duration': sampleDuration,\n 'offset': moofBox.offset + dataOffset,\n 'size': sampleSize,\n 'subSizes': [sampleSize]\n };\n if (subsBoxes) {\n for (m = 0; m < subsBoxes.length; m++) {\n let subsBox = subsBoxes[m];\n if (subsIndex < (subsBox.entry_count - 1) && i > nextSubsSample) {\n subsIndex++;\n nextSubsSample += subsBox.entries[subsIndex].sample_delta;\n }\n if (i == nextSubsSample) {\n sampleData.subSizes = [];\n let entry = subsBox.entries[subsIndex];\n for (n = 0; n < entry.subsample_count; n++) {\n sampleData.subSizes.push(entry.subsamples[n].subsample_size);\n }\n }\n }\n }\n sampleList.push(sampleData);\n dataOffset += sampleSize;\n sampleDts += sampleDuration;\n }\n }\n totalDuration = sampleDts - tfdtBox.baseMediaDecodeTime;\n }\n }\n return {sampleList: sampleList, lastSequenceNumber: lastSequenceNumber, totalDuration: totalDuration, numSequences: numSequences};\n }\n\n function getMediaTimescaleFromMoov(ab) {\n let isoFile = parse(ab);\n let mdhdBox = isoFile ? isoFile.getBox('mdhd') : undefined;\n\n return mdhdBox ? mdhdBox.timescale : NaN;\n }\n\n function parseUint32(data, offset) {\n return data[offset + 3] >>> 0 |\n (data[offset + 2] << 8) >>> 0 |\n (data[offset + 1] << 16) >>> 0 |\n (data[offset] << 24) >>> 0;\n }\n\n function parseIsoBoxType(data, offset) {\n return String.fromCharCode(data[offset++]) +\n String.fromCharCode(data[offset++]) +\n String.fromCharCode(data[offset++]) +\n String.fromCharCode(data[offset]);\n }\n\n function findInitRange(data) {\n let initRange = null;\n let start,\n end;\n\n const isoFile = parse(data);\n\n if (!isoFile) {\n return initRange;\n }\n\n const ftyp = isoFile.getBox('ftyp');\n const moov = isoFile.getBox('moov');\n\n logger.debug('Searching for initialization.');\n\n if (moov && moov.isComplete) {\n start = ftyp ? ftyp.offset : moov.offset;\n end = moov.offset + moov.size - 1;\n initRange = start + '-' + end;\n\n logger.debug('Found the initialization. Range: ' + initRange);\n }\n\n return initRange;\n }\n\n /**\n * Real-time parsing (whenever data is loaded in the buffer payload) of the payload to capture the moof of a chunk\n * @param {array} types\n * @param {ArrayBuffer} buffer\n * @param {number} offset\n * @return {IsoBoxSearchInfo}\n */\n function parsePayload(types, buffer, offset) {\n if (offset === undefined) {\n offset = 0;\n }\n\n if (!buffer || offset + 8 >= buffer.byteLength) {\n return new IsoBoxSearchInfo(0, false);\n }\n\n const data = (buffer instanceof ArrayBuffer) ? new Uint8Array(buffer) : buffer;\n let boxInfo;\n let lastCompletedOffset = 0;\n while (offset < data.byteLength) {\n const boxSize = parseUint32(data, offset);\n const boxType = parseIsoBoxType(data, offset + 4);\n\n if (boxSize === 0) {\n break;\n }\n\n if (offset + boxSize <= data.byteLength) {\n if (types.indexOf(boxType) >= 0) {\n boxInfo = new IsoBoxSearchInfo(offset, true, boxSize, boxType);\n } else {\n lastCompletedOffset = offset + boxSize;\n }\n }\n\n offset += boxSize;\n }\n\n if (!boxInfo) {\n return new IsoBoxSearchInfo(lastCompletedOffset, false);\n }\n\n return boxInfo;\n }\n\n instance = {\n parse,\n findLastTopIsoBoxCompleted,\n getMediaTimescaleFromMoov,\n getSamplesInfo,\n findInitRange,\n parsePayload\n };\n\n setup();\n\n return instance;\n}\nBoxParser.__dashjs_factory_name = 'BoxParser';\nexport default FactoryMaker.getSingletonFactory(BoxParser);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport FactoryMaker from '../../core/FactoryMaker';\nimport {THUMBNAILS_SCHEME_ID_URIS} from '../thumbnail/ThumbnailTracks';\nimport Constants from '../constants/Constants';\n\nconst codecCompatibilityTable = [\n {\n 'codec': 'avc1',\n 'compatibleCodecs': ['avc3']\n },\n {\n 'codec': 'avc3',\n 'compatibleCodecs': ['avc1']\n }\n];\n\nexport function supportsMediaSource() {\n let hasManagedMediaSource = ('ManagedMediaSource' in window)\n let hasWebKit = ('WebKitMediaSource' in window);\n let hasMediaSource = ('MediaSource' in window);\n\n return (hasManagedMediaSource || hasWebKit || hasMediaSource);\n}\n\nfunction Capabilities() {\n\n let instance,\n settings,\n encryptedMediaSupported;\n\n function setup() {\n encryptedMediaSupported = false;\n }\n\n function setConfig(config) {\n if (!config) {\n return;\n }\n\n if (config.settings) {\n settings = config.settings;\n }\n }\n\n /**\n * Returns whether Encrypted Media Extensions are supported on this\n * user agent\n *\n * @return {boolean} true if EME is supported, false otherwise\n */\n function supportsEncryptedMedia() {\n return encryptedMediaSupported;\n }\n\n /**\n *\n * @param {boolean} value\n */\n function setEncryptedMediaSupported(value) {\n encryptedMediaSupported = value;\n }\n\n /**\n * Check if a codec is supported by the MediaSource. We use the MediaCapabilities API or the MSE to check.\n * @param {object} config\n * @param {string} type\n * @return {Promise<boolean>}\n */\n function supportsCodec(config, type) {\n\n if (type !== Constants.AUDIO && type !== Constants.VIDEO) {\n return Promise.resolve(true);\n }\n\n if (_canUseMediaCapabilitiesApi(config, type)) {\n return _checkCodecWithMediaCapabilities(config, type);\n }\n\n return _checkCodecWithMse(config);\n }\n\n /**\n * MediaCapabilitiesAPI throws an error if one of the attribute is missing. We only use it if we have all required information.\n * @param {object} config\n * @param {string} type\n * @return {*|boolean|boolean}\n * @private\n */\n function _canUseMediaCapabilitiesApi(config, type) {\n\n return settings.get().streaming.capabilities.useMediaCapabilitiesApi && navigator.mediaCapabilities && navigator.mediaCapabilities.decodingInfo && ((config.codec && type === Constants.AUDIO) || (type === Constants.VIDEO && config.codec && config.width && config.height && config.bitrate && config.framerate));\n }\n\n /**\n * Check codec support using the MSE\n * @param {object} config\n * @return {Promise<void> | Promise<boolean>}\n * @private\n */\n function _checkCodecWithMse(config) {\n return new Promise((resolve) => {\n if (!config || !config.codec) {\n resolve(false);\n return;\n }\n\n let codec = config.codec;\n if (config.width && config.height) {\n codec += ';width=\"' + config.width + '\";height=\"' + config.height + '\"';\n }\n\n // eslint-disable-next-line no-undef\n if ('ManagedMediaSource' in window && ManagedMediaSource.isTypeSupported(codec)) {\n resolve(true);\n return;\n } else if ('MediaSource' in window && MediaSource.isTypeSupported(codec)) {\n resolve(true);\n return;\n } else if ('WebKitMediaSource' in window && WebKitMediaSource.isTypeSupported(codec)) {\n resolve(true);\n return;\n }\n\n resolve(false);\n });\n\n }\n\n /**\n * Check codec support using the MediaCapabilities API\n * @param {object} config\n * @param {string} type\n * @return {Promise<boolean>}\n * @private\n */\n function _checkCodecWithMediaCapabilities(config, type) {\n return new Promise((resolve) => {\n\n if (!config || !config.codec) {\n resolve(false);\n return;\n }\n\n const configuration = {\n type: 'media-source'\n };\n\n configuration[type] = {};\n configuration[type].contentType = config.codec;\n configuration[type].width = config.width;\n configuration[type].height = config.height;\n configuration[type].bitrate = parseInt(config.bitrate);\n configuration[type].framerate = parseFloat(config.framerate);\n\n navigator.mediaCapabilities.decodingInfo(configuration)\n .then((result) => {\n resolve(result.supported);\n })\n .catch(() => {\n resolve(false);\n });\n });\n }\n\n /**\n * Check if a specific EssentialProperty is supported\n * @param {object} ep\n * @return {boolean}\n */\n function supportsEssentialProperty(ep) {\n try {\n return (THUMBNAILS_SCHEME_ID_URIS.indexOf(ep.schemeIdUri) !== -1) || (Constants.FONT_DOWNLOAD_DVB_SCHEME === ep.schemeIdUri);\n } catch (e) {\n return true;\n }\n }\n\n /**\n * Check if the root of the old codec is the same as the new one, or if it's declared as compatible in the compat table\n * @param {string} codec1\n * @param {string} codec2\n * @return {boolean}\n */\n function codecRootCompatibleWithCodec(codec1, codec2) {\n const codecRoot = codec1.split('.')[0];\n const rootCompatible = codec2.indexOf(codecRoot) === 0;\n let compatTableCodec;\n for (let i = 0; i < codecCompatibilityTable.length; i++) {\n if (codecCompatibilityTable[i].codec === codecRoot) {\n compatTableCodec = codecCompatibilityTable[i];\n break;\n }\n }\n if (compatTableCodec) {\n return rootCompatible || compatTableCodec.compatibleCodecs.some((compatibleCodec) => codec2.indexOf(compatibleCodec) === 0);\n }\n return rootCompatible;\n }\n\n instance = {\n setConfig,\n supportsMediaSource,\n supportsEncryptedMedia,\n supportsCodec,\n setEncryptedMediaSupported,\n supportsEssentialProperty,\n codecRootCompatibleWithCodec\n };\n\n setup();\n\n return instance;\n}\n\nCapabilities.__dashjs_factory_name = 'Capabilities';\nexport default FactoryMaker.getSingletonFactory(Capabilities);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport FactoryMaker from '../../core/FactoryMaker';\nimport {checkInteger} from '../utils/SupervisorTools';\n\nfunction CustomTimeRanges(/*config*/) {\n let customTimeRangeArray = [];\n let length = 0;\n\n function add(start, end) {\n let i;\n\n for (i = 0; (i < this.customTimeRangeArray.length) && (start > this.customTimeRangeArray[i].start); i++) ;\n\n this.customTimeRangeArray.splice(i, 0, { start: start, end: end });\n\n for (i = 0; i < this.customTimeRangeArray.length - 1; i++) {\n if (this.mergeRanges(i, i + 1)) {\n i--;\n }\n }\n this.length = this.customTimeRangeArray.length;\n }\n\n function clear() {\n this.customTimeRangeArray = [];\n this.length = 0;\n }\n\n function remove(start, end) {\n for (let i = 0; i < this.customTimeRangeArray.length; i++) {\n if (start <= this.customTimeRangeArray[i].start && end >= this.customTimeRangeArray[i].end) {\n // |--------------Range i-------|\n //|---------------Range to remove ---------------|\n // or\n //|--------------Range i-------|\n //|--------------Range to remove ---------------|\n // or\n // |--------------Range i-------|\n //|--------------Range to remove ---------------|\n this.customTimeRangeArray.splice(i, 1);\n i--;\n\n } else if (start > this.customTimeRangeArray[i].start && end < this.customTimeRangeArray[i].end) {\n //|-----------------Range i----------------|\n // |-------Range to remove -----|\n this.customTimeRangeArray.splice(i + 1, 0, { start: end, end: this.customTimeRangeArray[i].end });\n this.customTimeRangeArray[i].end = start;\n break;\n } else if (start > this.customTimeRangeArray[i].start && start < this.customTimeRangeArray[i].end) {\n //|-----------Range i----------|\n // |---------Range to remove --------|\n // or\n //|-----------------Range i----------------|\n // |-------Range to remove -----|\n this.customTimeRangeArray[i].end = start;\n } else if (end > this.customTimeRangeArray[i].start && end < this.customTimeRangeArray[i].end) {\n // |-----------Range i----------|\n //|---------Range to remove --------|\n // or\n //|-----------------Range i----------------|\n //|-------Range to remove -----|\n this.customTimeRangeArray[i].start = end;\n }\n }\n\n this.length = this.customTimeRangeArray.length;\n }\n\n function mergeRanges(rangeIndex1, rangeIndex2) {\n let range1 = this.customTimeRangeArray[rangeIndex1];\n let range2 = this.customTimeRangeArray[rangeIndex2];\n\n if (range1.start <= range2.start && range2.start <= range1.end && range1.end <= range2.end) {\n //|-----------Range1----------|\n // |-----------Range2----------|\n range1.end = range2.end;\n this.customTimeRangeArray.splice(rangeIndex2, 1);\n return true;\n\n } else if (range2.start <= range1.start && range1.start <= range2.end && range2.end <= range1.end) {\n // |-----------Range1----------|\n //|-----------Range2----------|\n range1.start = range2.start;\n this.customTimeRangeArray.splice(rangeIndex2, 1);\n return true;\n } else if (range2.start <= range1.start && range1.start <= range2.end && range1.end <= range2.end) {\n // |--------Range1-------|\n //|---------------Range2--------------|\n this.customTimeRangeArray.splice(rangeIndex1, 1);\n return true;\n } else if (range1.start <= range2.start && range2.start <= range1.end && range2.end <= range1.end) {\n //|-----------------Range1--------------|\n // |-----------Range2----------|\n this.customTimeRangeArray.splice(rangeIndex2, 1);\n return true;\n }\n return false;\n }\n\n function start(index) {\n checkInteger(index);\n\n if (index >= this.customTimeRangeArray.length || index < 0) {\n return NaN;\n }\n\n return this.customTimeRangeArray[index].start;\n }\n\n function end(index) {\n checkInteger(index);\n\n if (index >= this.customTimeRangeArray.length || index < 0) {\n return NaN;\n }\n\n return this.customTimeRangeArray[index].end;\n }\n\n return {\n customTimeRangeArray: customTimeRangeArray,\n length: length,\n add: add,\n clear: clear,\n remove: remove,\n mergeRanges: mergeRanges,\n start: start,\n end: end\n };\n}\n\nCustomTimeRanges.__dashjs_factory_name = 'CustomTimeRanges';\nexport default FactoryMaker.getClassFactory(CustomTimeRanges);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport FactoryMaker from '../../core/FactoryMaker';\n\n/**\n * @module DefaultURLUtils\n * @description Provides utility functions for operating on URLs.\n * Initially this is simply a method to determine the Base URL of a URL, but\n * should probably include other things provided all over the place such as\n * determining whether a URL is relative/absolute, resolving two paths etc.\n * @ignore\n */\nfunction DefaultURLUtils() {\n\n let resolveFunction;\n\n const schemeRegex = /^[a-z][a-z0-9+\\-_.]*:/i;\n const httpUrlRegex = /^https?:\\/\\//i;\n const httpsUrlRegex = /^https:\\/\\//i;\n const originRegex = /^([a-z][a-z0-9+\\-_.]*:\\/\\/[^\\/]+)\\/?/i;\n\n /**\n * Resolves a url given an optional base url\n * Uses window.URL to do the resolution.\n *\n * @param {string} url\n * @param {string} [baseUrl]\n * @return {string}\n * @memberof module:DefaultURLUtils\n * @instance\n * @private\n */\n const nativeURLResolver = (url, baseUrl) => {\n try {\n return new window.URL(url, baseUrl).toString();\n } catch (e) {\n return url;\n }\n };\n\n /**\n * Resolves a url given an optional base url\n * Does not resolve ./, ../ etc but will do enough to construct something\n * which will satisfy XHR etc when window.URL is not available ie\n * IE11/node etc.\n *\n * @param {string} url\n * @param {string} [baseUrl]\n * @return {string}\n * @memberof module:DefaultURLUtils\n * @instance\n * @private\n */\n const dumbURLResolver = (url, baseUrl) => {\n let baseUrlParseFunc = parseBaseUrl;\n\n if (!baseUrl) {\n return url;\n }\n\n if (!isRelative(url)) {\n return url;\n }\n\n if (isPathAbsolute(url)) {\n baseUrlParseFunc = parseOrigin;\n }\n\n if (isSchemeRelative(url)) {\n baseUrlParseFunc = parseScheme;\n }\n\n const base = baseUrlParseFunc(baseUrl);\n const joinChar =\n base.charAt(base.length - 1) !== '/' &&\n url.charAt(0) !== '/' ?\n '/' : '';\n\n return [base, url].join(joinChar);\n };\n\n function setup() {\n try {\n const u = new window.URL('x', 'http://y'); // eslint-disable-line\n resolveFunction = nativeURLResolver;\n } catch (e) {\n // must be IE11/Node etc\n } finally {\n resolveFunction = resolveFunction || dumbURLResolver;\n }\n }\n\n /**\n * Returns a string that contains the Base URL of a URL, if determinable.\n * @param {string} url - full url\n * @return {string}\n * @memberof module:DefaultURLUtils\n * @instance\n */\n function parseBaseUrl(url) {\n const slashIndex = url.indexOf('/');\n const lastSlashIndex = url.lastIndexOf('/');\n\n if (slashIndex !== -1) {\n // if there is only '//'\n if (lastSlashIndex === slashIndex + 1) {\n return url;\n }\n\n if (url.indexOf('?') !== -1) {\n url = url.substring(0, url.indexOf('?'));\n }\n\n return url.substring(0, lastSlashIndex + 1);\n }\n\n return '';\n }\n\n /**\n * Returns a string that contains the scheme and origin of a URL,\n * if determinable.\n * @param {string} url - full url\n * @return {string}\n * @memberof module:DefaultURLUtils\n * @instance\n */\n function parseOrigin(url) {\n const matches = url.match(originRegex);\n\n if (matches) {\n return matches[1];\n }\n\n return '';\n }\n\n /**\n * Returns a string that contains the fragment of a URL without scheme,\n * if determinable.\n * @param {string} url - full url\n * @return {string}\n * @memberof module:DefaultURLUtils\n * @instance\n */\n function removeHostname(url) {\n let urlParts = /^(?:\\w+\\:\\/\\/)?([^\\/]+)(.*)$/.exec(url); //[1] = host / [2] = path\n return urlParts[2].substring(1);\n }\n\n /**\n * Returns a string that contains the scheme of a URL, if determinable.\n * @param {string} url - full url\n * @return {string}\n * @memberof module:DefaultURLUtils\n * @instance\n */\n function parseScheme(url) {\n const matches = url.match(schemeRegex);\n\n if (matches) {\n return matches[0];\n }\n\n return '';\n }\n\n /**\n * Determines whether the url is relative.\n * @return {boolean}\n * @param {string} url\n * @memberof module:DefaultURLUtils\n * @instance\n */\n function isRelative(url) {\n return !schemeRegex.test(url);\n }\n\n /**\n * Determines whether the url is path-absolute.\n * @return {bool}\n * @param {string} url\n * @memberof module:DefaultURLUtils\n * @instance\n */\n function isPathAbsolute(url) {\n return isRelative(url) && url.charAt(0) === '/';\n }\n\n /**\n * Determines whether the url is scheme-relative.\n * @return {bool}\n * @param {string} url\n * @memberof module:DefaultURLUtils\n * @instance\n */\n function isSchemeRelative(url) {\n return url.indexOf('//') === 0;\n }\n\n /**\n * Determines whether the url is an HTTP-URL as defined in ISO/IEC\n * 23009-1:2014 3.1.15. ie URL with a fixed scheme of http or https\n * @return {bool}\n * @param {string} url\n * @memberof module:DefaultURLUtils\n * @instance\n */\n function isHTTPURL(url) {\n return httpUrlRegex.test(url);\n }\n\n /**\n * Determines whether the supplied url has https scheme\n * @return {bool}\n * @param {string} url\n * @memberof module:DefaultURLUtils\n * @instance\n */\n function isHTTPS(url) {\n return httpsUrlRegex.test(url);\n }\n\n /**\n * Resolves a url given an optional base url\n * @return {string}\n * @param {string} url\n * @param {string} [baseUrl]\n * @memberof module:DefaultURLUtils\n * @instance\n */\n function resolve(url, baseUrl) {\n return resolveFunction(url, baseUrl);\n }\n\n setup();\n\n const instance = {\n parseBaseUrl: parseBaseUrl,\n parseOrigin: parseOrigin,\n parseScheme: parseScheme,\n isRelative: isRelative,\n isPathAbsolute: isPathAbsolute,\n isSchemeRelative: isSchemeRelative,\n isHTTPURL: isHTTPURL,\n isHTTPS: isHTTPS,\n removeHostname: removeHostname,\n resolve: resolve\n };\n\n return instance;\n}\n\nDefaultURLUtils.__dashjs_factory_name = 'DefaultURLUtils';\nexport default FactoryMaker.getSingletonFactory(DefaultURLUtils);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport IsoBox from '../vo/IsoBox';\nimport FactoryMaker from '../../core/FactoryMaker';\n\nfunction IsoFile() {\n\n let instance,\n parsedIsoFile;\n\n /**\n * @param {string} type\n * @returns {IsoBox|null}\n * @memberof IsoFile#\n */\n function getBox(type) {\n if (!type || !parsedIsoFile || !parsedIsoFile.boxes || (parsedIsoFile.boxes.length === 0) || typeof parsedIsoFile.fetch !== 'function') return null;\n\n return convertToDashIsoBox(parsedIsoFile.fetch(type));\n }\n\n /**\n * @param {string} type\n * @returns {Array|null} array of {@link IsoBox}\n * @memberof IsoFile#\n */\n function getBoxes(type) {\n let boxes = [];\n\n if (!type || !parsedIsoFile || typeof parsedIsoFile.fetchAll !== 'function') {\n return boxes;\n }\n\n let boxData = parsedIsoFile.fetchAll(type);\n let box;\n\n for (let i = 0, ln = boxData.length; i < ln; i++) {\n box = convertToDashIsoBox(boxData[i]);\n\n if (box) {\n boxes.push(box);\n }\n }\n\n return boxes;\n }\n\n /**\n * @param {string} value\n * @memberof IsoFile#\n */\n function setData(value) {\n parsedIsoFile = value;\n }\n\n /**\n * @returns {IsoBox|null}\n * @memberof IsoFile#\n */\n function getLastBox() {\n if (!parsedIsoFile || !parsedIsoFile.boxes || !parsedIsoFile.boxes.length) return null;\n\n let type = parsedIsoFile.boxes[parsedIsoFile.boxes.length - 1].type;\n let boxes = getBoxes(type);\n\n return boxes.length > 0 ? boxes[boxes.length - 1] : null;\n }\n\n function convertToDashIsoBox(boxData) {\n if (!boxData) return null;\n\n let box = new IsoBox(boxData);\n\n if (boxData.hasOwnProperty('_incomplete')) {\n box.isComplete = !boxData._incomplete;\n }\n\n return box;\n }\n\n instance = {\n getBox: getBox,\n getBoxes: getBoxes,\n setData: setData,\n getLastBox: getLastBox\n };\n\n return instance;\n}\nIsoFile.__dashjs_factory_name = 'IsoFile';\nexport default FactoryMaker.getClassFactory(IsoFile);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport FactoryMaker from '../../core/FactoryMaker';\n\nexport function modifyRequest(httpRequest, requestModifier) {\n const request = {\n url: httpRequest.url,\n method: httpRequest.method,\n headers: Object.assign({}, httpRequest.headers),\n credentials: httpRequest.withCredentials ? 'include' : undefined,\n range: httpRequest.request.range,\n };\n\n return Promise.resolve(requestModifier.modifyRequest(request))\n .then(() =>\n Object.assign(httpRequest, request, { withCredentials: request.credentials === 'include' })\n );\n}\n\nfunction RequestModifier() {\n\n let instance;\n\n function modifyRequestURL(url) {\n return url;\n }\n\n // eslint-disable-next-line no-unused-vars\n function modifyRequestHeader(request, { url }) {\n return request;\n }\n\n instance = {\n modifyRequest: null,\n modifyRequestURL: modifyRequestURL,\n modifyRequestHeader: modifyRequestHeader\n };\n\n return instance;\n}\n\nRequestModifier.__dashjs_factory_name = 'RequestModifier';\nexport default FactoryMaker.getSingletonFactory(RequestModifier);\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\nimport Constants from '../constants/Constants';\n\nexport function checkParameterType(parameter, type) {\n if (typeof parameter !== type) {\n throw Constants.BAD_ARGUMENT_ERROR;\n }\n}\n\nexport function checkInteger(parameter) {\n const isInt = parameter !== null && !isNaN(parameter) && (parameter % 1 === 0);\n\n if (!isInt) {\n throw Constants.BAD_ARGUMENT_ERROR + ' : argument is not an integer';\n }\n}\n\nexport function checkRange(parameter, min, max) {\n if (parameter < min || parameter > max) {\n throw Constants.BAD_ARGUMENT_ERROR + ' : argument out of range';\n }\n}\n\nexport function checkIsVideoOrAudioType(type) {\n if (typeof type !== 'string' || (type !== Constants.AUDIO && type !== Constants.VIDEO)) {\n throw Constants.BAD_ARGUMENT_ERROR;\n }\n}","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport FactoryMaker from '../../core/FactoryMaker';\nimport DefaultURLUtils from './DefaultURLUtils';\n\n/**\n * @module URLUtils\n * @ignore\n * @description Provides utility functions for operating on URLs.\n * Initially this is simply a method to determine the Base URL of a URL, but\n * should probably include other things provided all over the place such as\n * determining whether a URL is relative/absolute, resolving two paths etc.\n */\nfunction URLUtils() {\n\n let instance;\n let defaultURLUtils;\n let regexUtils = [];\n const context = this.context;\n\n function getUtils(url) {\n let i;\n for (i = 0; i < regexUtils.length; i++) {\n let regex = regexUtils[i].regex;\n if (regex.test(url)) {\n return regexUtils[i].utils;\n }\n }\n return defaultURLUtils;\n }\n\n function setup() {\n defaultURLUtils = DefaultURLUtils(context).getInstance();\n }\n\n /**\n * Register a module to handle specific url.\n * @param {regex} regex - url regex\n * @param {object} utils - object that handles the regex\n * @memberof module:URLUtils\n * @instance\n */\n function registerUrlRegex(regex, utils) {\n regexUtils.push({regex: regex, utils: utils});\n }\n\n function internalCall(functionName, url, baseUrl) {\n let utils = getUtils(baseUrl || url);\n return utils && typeof (utils[functionName]) === 'function' ? utils[functionName](url, baseUrl) : defaultURLUtils[functionName](url, baseUrl);\n }\n\n /**\n * Returns a string that contains the Base URL of a URL, if determinable.\n * @param {string} url - full url\n * @return {string}\n * @memberof module:URLUtils\n * @instance\n */\n function parseBaseUrl(url) {\n return internalCall('parseBaseUrl', url);\n }\n\n /**\n * Returns a string that contains the scheme and origin of a URL,\n * if determinable.\n * @param {string} url - full url\n * @return {string}\n * @memberof module:URLUtils\n * @instance\n */\n function parseOrigin(url) {\n return internalCall('parseOrigin', url);\n }\n\n /**\n * Returns a string that contains the fragment of a URL without scheme,\n * if determinable.\n * @param {string} url - full url\n * @return {string}\n * @memberof module:URLUtils\n * @instance\n */\n function removeHostname(url) {\n return internalCall('removeHostname', url);\n }\n\n /**\n * Returns a string that contains the scheme of a URL, if determinable.\n * @param {string} url - full url\n * @return {string}\n * @memberof module:URLUtils\n * @instance\n */\n function parseScheme(url) {\n return internalCall('parseScheme', url);\n }\n\n /**\n * Determines whether the url is relative.\n * @return {boolean}\n * @param {string} url\n * @memberof module:URLUtils\n * @instance\n */\n function isRelative(url) {\n return internalCall('isRelative', url);\n }\n\n /**\n * Determines whether the url is path-absolute.\n * @return {bool}\n * @param {string} url\n * @memberof module:URLUtils\n * @instance\n */\n function isPathAbsolute(url) {\n return internalCall('isPathAbsolute', url);\n }\n\n /**\n * Determines whether the url is scheme-relative.\n * @return {bool}\n * @param {string} url\n * @memberof module:URLUtils\n * @instance\n */\n function isSchemeRelative(url) {\n return internalCall('isSchemeRelative', url);\n }\n\n /**\n * Determines whether the url is an HTTP-URL as defined in ISO/IEC\n * 23009-1:2014 3.1.15. ie URL with a fixed scheme of http or https\n * @return {bool}\n * @param {string} url\n * @memberof module:URLUtils\n * @instance\n */\n function isHTTPURL(url) {\n return internalCall('isHTTPURL', url);\n }\n\n /**\n * Determines whether the supplied url has https scheme\n * @return {bool}\n * @param {string} url\n * @memberof module:URLUtils\n * @instance\n */\n function isHTTPS(url) {\n return internalCall('isHTTPS', url);\n }\n\n /**\n * Resolves a url given an optional base url\n * @return {string}\n * @param {string} url\n * @param {string} [baseUrl]\n * @memberof module:URLUtils\n * @instance\n */\n function resolve(url, baseUrl) {\n return internalCall('resolve', url, baseUrl);\n }\n\n setup();\n instance = {\n registerUrlRegex: registerUrlRegex,\n parseBaseUrl: parseBaseUrl,\n parseOrigin: parseOrigin,\n parseScheme: parseScheme,\n isRelative: isRelative,\n isPathAbsolute: isPathAbsolute,\n isSchemeRelative: isSchemeRelative,\n isHTTPURL: isHTTPURL,\n isHTTPS: isHTTPS,\n removeHostname: removeHostname,\n resolve: resolve\n };\n\n return instance;\n}\n\nURLUtils.__dashjs_factory_name = 'URLUtils';\nconst factory = FactoryMaker.getSingletonFactory(URLUtils);\nexport default factory;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass DashJSError {\n constructor(code, message, data) {\n this.code = code || null;\n this.message = message || null;\n this.data = data || null;\n }\n}\n\nexport default DashJSError;","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport { HTTPRequest } from '../vo/metrics/HTTPRequest';\n\n/**\n * @class\n * @ignore\n */\nclass FragmentRequest {\n constructor(url) {\n this.action = FragmentRequest.ACTION_DOWNLOAD;\n this.startTime = NaN;\n this.mediaStartTime = NaN;\n this.mediaType = null;\n this.mediaInfo = null;\n this.type = null;\n this.duration = NaN;\n this.timescale = NaN;\n this.range = null;\n this.url = url || null;\n this.serviceLocation = null;\n this.requestStartDate = null;\n this.firstByteDate = null;\n this.requestEndDate = null;\n this.quality = NaN;\n this.index = NaN;\n this.availabilityStartTime = null;\n this.availabilityEndTime = null;\n this.wallStartTime = null;\n this.bytesLoaded = NaN;\n this.bytesTotal = NaN;\n this.delayLoadingTime = NaN;\n this.responseType = 'arraybuffer';\n this.representationId = null;\n }\n\n isInitializationRequest() {\n return (this.type && this.type === HTTPRequest.INIT_SEGMENT_TYPE);\n }\n\n setInfo(info) {\n this.type = info && info.init ? HTTPRequest.INIT_SEGMENT_TYPE : HTTPRequest.MEDIA_SEGMENT_TYPE;\n this.url = info && info.url ? info.url : null;\n this.range = info && info.range ? info.range.start + '-' + info.range.end : null;\n this.mediaType = info && info.mediaType ? info.mediaType : null;\n }\n}\n\nFragmentRequest.ACTION_DOWNLOAD = 'download';\nFragmentRequest.ACTION_COMPLETE = 'complete';\n\nexport default FragmentRequest;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass IsoBox {\n constructor(boxData) {\n this.offset = boxData._offset;\n this.type = boxData.type;\n this.size = boxData.size;\n this.boxes = [];\n if (boxData.boxes) {\n for (let i = 0; i < boxData.boxes.length; i++) {\n this.boxes.push(new IsoBox(boxData.boxes[i]));\n }\n }\n this.isComplete = true;\n\n switch (boxData.type) {\n case 'sidx':\n this.timescale = boxData.timescale;\n this.earliest_presentation_time = boxData.earliest_presentation_time;\n this.first_offset = boxData.first_offset;\n this.references = boxData.references;\n if (boxData.references) {\n this.references = [];\n for (let i = 0; i < boxData.references.length; i++) {\n let reference = {\n reference_type: boxData.references[i].reference_type,\n referenced_size: boxData.references[i].referenced_size,\n subsegment_duration: boxData.references[i].subsegment_duration\n };\n this.references.push(reference);\n }\n }\n break;\n case 'emsg':\n this.id = boxData.id;\n this.version = boxData.version === 1 ? 1 : 0;\n this.value = boxData.value;\n this.timescale = boxData.timescale;\n this.scheme_id_uri = boxData.scheme_id_uri;\n this.presentation_time_delta = boxData.version === 1 ? boxData.presentation_time : boxData.presentation_time_delta;\n this.event_duration = boxData.event_duration;\n this.message_data = boxData.message_data;\n break;\n case 'mdhd':\n this.timescale = boxData.timescale;\n break;\n case 'mfhd':\n this.sequence_number = boxData.sequence_number;\n break;\n case 'subs':\n this.entry_count = boxData.entry_count;\n this.entries = boxData.entries;\n break;\n case 'tfhd':\n this.base_data_offset = boxData.base_data_offset;\n this.sample_description_index = boxData.sample_description_index;\n this.default_sample_duration = boxData.default_sample_duration;\n this.default_sample_size = boxData.default_sample_size;\n this.default_sample_flags = boxData.default_sample_flags;\n this.flags = boxData.flags;\n break;\n case 'tfdt':\n this.version = boxData.version;\n this.baseMediaDecodeTime = boxData.baseMediaDecodeTime;\n this.flags = boxData.flags;\n break;\n case 'trun':\n this.sample_count = boxData.sample_count;\n this.first_sample_flags = boxData.first_sample_flags;\n this.data_offset = boxData.data_offset;\n this.flags = boxData.flags;\n this.samples = boxData.samples;\n if (boxData.samples) {\n this.samples = [];\n for (let i = 0, ln = boxData.samples.length; i < ln; i++) {\n let sample = {\n sample_size: boxData.samples[i].sample_size,\n sample_duration: boxData.samples[i].sample_duration,\n sample_composition_time_offset: boxData.samples[i].sample_composition_time_offset\n };\n this.samples.push(sample);\n }\n }\n break;\n case 'prft':\n this.version = boxData.version;\n this.reference_track_ID = boxData.reference_track_ID;\n this.ntp_timestamp_sec = boxData.ntp_timestamp_sec;\n this.ntp_timestamp_frac = boxData.ntp_timestamp_frac;\n this.media_time = boxData.media_time;\n this.flags = boxData.flags;\n break;\n }\n }\n\n getChildBox(type) {\n for (let i = 0; i < this.boxes.length; i++) {\n if (this.boxes[i].type === type) {\n return this.boxes[i];\n }\n }\n }\n\n getChildBoxes(type) {\n let boxes = [];\n for (let i = 0; i < this.boxes.length; i++) {\n if (this.boxes[i].type === type) {\n boxes.push(this.boxes[i]);\n }\n }\n return boxes;\n }\n\n}\n\nexport default IsoBox;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass IsoBoxSearchInfo {\n constructor(lastCompletedOffset, found, size) {\n this.lastCompletedOffset = lastCompletedOffset;\n this.found = found;\n this.size = size;\n }\n}\n\nexport default IsoBoxSearchInfo;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @class\n * @ignore\n */\nclass ThumbnailTrackInfo {\n constructor() {\n this.bitrate = 0;\n this.width = 0;\n this.height = 0;\n this.tilesHor = 0;\n this.tilesVert = 0;\n this.widthPerTile = 0;\n this.heightPerTile = 0;\n this.startNumber = 0;\n this.segmentDuration = 0;\n this.timescale = 0;\n this.templateUrl = '';\n this.id = '';\n }\n}\n\nexport default ThumbnailTrackInfo;","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/**\n * @classdesc This Object holds reference to the HTTPRequest for manifest, fragment and xlink loading.\n * Members which are not defined in ISO23009-1 Annex D should be prefixed by a _ so that they are ignored\n * by Metrics Reporting code.\n * @ignore\n */\nclass HTTPRequest {\n /**\n * @class\n */\n constructor() {\n /**\n * Identifier of the TCP connection on which the HTTP request was sent.\n * @public\n */\n this.tcpid = null;\n /**\n * This is an optional parameter and should not be included in HTTP request/response transactions for progressive download.\n * The type of the request:\n * - MPD\n * - XLink expansion\n * - Initialization Fragment\n * - Index Fragment\n * - Media Fragment\n * - Bitstream Switching Fragment\n * - other\n * @public\n */\n this.type = null;\n /**\n * The original URL (before any redirects or failures)\n * @public\n */\n this.url = null;\n /**\n * The actual URL requested, if different from above\n * @public\n */\n this.actualurl = null;\n /**\n * The contents of the byte-range-spec part of the HTTP Range header.\n * @public\n */\n this.range = null;\n /**\n * Real-Time | The real time at which the request was sent.\n * @public\n */\n this.trequest = null;\n /**\n * Real-Time | The real time at which the first byte of the response was received.\n * @public\n */\n this.tresponse = null;\n /**\n * The HTTP response code.\n * @public\n */\n this.responsecode = null;\n /**\n * The duration of the throughput trace intervals (ms), for successful requests only.\n * @public\n */\n this.interval = null;\n /**\n * Throughput traces, for successful requests only.\n * @public\n */\n this.trace = [];\n /**\n * The CMSD static and dynamic values retrieved from CMSD response headers.\n * @public\n */\n this.cmsd = null;\n\n /**\n * Type of stream (\"audio\" | \"video\" etc..)\n * @public\n */\n this._stream = null;\n /**\n * Real-Time | The real time at which the request finished.\n * @public\n */\n this._tfinish = null;\n /**\n * The duration of the media requests, if available, in seconds.\n * @public\n */\n this._mediaduration = null;\n /**\n * The media segment quality\n * @public\n */\n this._quality = null;\n /**\n * all the response headers from request.\n * @public\n */\n this._responseHeaders = null;\n /**\n * The selected service location for the request. string.\n * @public\n */\n this._serviceLocation = null;\n /**\n * The type of the loader that was used. Distinguish between fetch loader and xhr loader\n */\n this._fileLoaderType = null;\n }\n}\n\n/**\n * @classdesc This Object holds reference to the progress of the HTTPRequest.\n * @ignore\n */\nclass HTTPRequestTrace {\n /**\n * @class\n */\n constructor() {\n /**\n * Real-Time | Measurement stream start.\n * @public\n */\n this.s = null;\n /**\n * Measurement stream duration (ms).\n * @public\n */\n this.d = null;\n /**\n * List of integers counting the bytes received in each trace interval within the measurement stream.\n * @public\n */\n this.b = [];\n }\n}\n\nHTTPRequest.GET = 'GET';\nHTTPRequest.HEAD = 'HEAD';\nHTTPRequest.MPD_TYPE = 'MPD';\nHTTPRequest.XLINK_EXPANSION_TYPE = 'XLinkExpansion';\nHTTPRequest.INIT_SEGMENT_TYPE = 'InitializationSegment';\nHTTPRequest.INDEX_SEGMENT_TYPE = 'IndexSegment';\nHTTPRequest.MEDIA_SEGMENT_TYPE = 'MediaSegment';\nHTTPRequest.BITSTREAM_SWITCHING_SEGMENT_TYPE = 'BitstreamSwitchingSegment';\nHTTPRequest.MSS_FRAGMENT_INFO_SEGMENT_TYPE = 'FragmentInfoSegment';\nHTTPRequest.DVB_REPORTING_TYPE = 'DVBReporting';\nHTTPRequest.LICENSE = 'license';\nHTTPRequest.CONTENT_STEERING_TYPE = 'ContentSteering';\nHTTPRequest.OTHER_TYPE = 'other';\n\nexport {HTTPRequest, HTTPRequestTrace};\n","'use strict'\n\n// See https://tools.ietf.org/html/rfc4647#section-3.1\n// for more information on the algorithms.\n\nexports.basicFilter = factory(basic, true)\nexports.extendedFilter = factory(extended, true)\nexports.lookup = factory(lookup)\n\n// Basic Filtering (Section 3.3.1) matches a language priority list consisting\n// of basic language ranges (Section 2.1) to sets of language tags.\nfunction basic(tag, range) {\n return range === '*' || tag === range || tag.indexOf(range + '-') > -1\n}\n\n// Extended Filtering (Section 3.3.2) matches a language priority list\n// consisting of extended language ranges (Section 2.2) to sets of language\n// tags.\nfunction extended(tag, range) {\n // 3.3.2.1\n var left = tag.split('-')\n var right = range.split('-')\n var leftIndex = 0\n var rightIndex = 0\n\n // 3.3.2.2\n if (right[rightIndex] !== '*' && left[leftIndex] !== right[rightIndex]) {\n return false\n }\n\n leftIndex++\n rightIndex++\n\n // 3.3.2.3\n while (rightIndex < right.length) {\n // 3.3.2.3.A\n if (right[rightIndex] === '*') {\n rightIndex++\n continue\n }\n\n // 3.3.2.3.B\n if (!left[leftIndex]) return false\n\n // 3.3.2.3.C\n if (left[leftIndex] === right[rightIndex]) {\n leftIndex++\n rightIndex++\n continue\n }\n\n // 3.3.2.3.D\n if (left[leftIndex].length === 1) return false\n\n // 3.3.2.3.E\n leftIndex++\n }\n\n // 3.3.2.4\n return true\n}\n\n// Lookup (Section 3.4) matches a language priority list consisting of basic\n// language ranges to sets of language tags to find the one exact language tag\n// that best matches the range.\nfunction lookup(tag, range) {\n var right = range\n var index\n\n /* eslint-disable-next-line no-constant-condition */\n while (true) {\n if (right === '*' || tag === right) return true\n\n index = right.lastIndexOf('-')\n\n if (index < 0) return false\n\n if (right.charAt(index - 2) === '-') index -= 2\n\n right = right.slice(0, index)\n }\n}\n\n// Factory to perform a filter or a lookup.\n// This factory creates a function that accepts a list of tags and a list of\n// ranges, and contains logic to exit early for lookups.\n// `check` just has to deal with one tag and one range.\n// This match function iterates over ranges, and for each range,\n// iterates over tags. That way, earlier ranges matching any tag have\n// precedence over later ranges.\nfunction factory(check, filter) {\n return match\n\n function match(tags, ranges) {\n var left = cast(tags, 'tag')\n var right = cast(ranges == null ? '*' : ranges, 'range')\n var matches = []\n var rightIndex = -1\n var range\n var leftIndex\n var next\n\n while (++rightIndex < right.length) {\n range = right[rightIndex].toLowerCase()\n\n // Ignore wildcards in lookup mode.\n if (!filter && range === '*') continue\n\n leftIndex = -1\n next = []\n\n while (++leftIndex < left.length) {\n if (check(left[leftIndex].toLowerCase(), range)) {\n // Exit if this is a lookup and we have a match.\n if (!filter) return left[leftIndex]\n matches.push(left[leftIndex])\n } else {\n next.push(left[leftIndex])\n }\n }\n\n left = next\n }\n\n // If this is a filter, return the list. If it’s a lookup, we didn’t find\n // a match, so return `undefined`.\n return filter ? matches : undefined\n }\n}\n\n// Validate tags or ranges, and cast them to arrays.\nfunction cast(values, name) {\n var value = values && typeof values === 'string' ? [values] : values\n\n if (!value || typeof value !== 'object' || !('length' in value)) {\n throw new Error(\n 'Invalid ' + name + ' `' + value + '`, expected non-empty string'\n )\n }\n\n return value\n}\n","'use strict'\n\nmodule.exports = require('./lib')\n","'use strict'\n\nvar bcp47 = require('bcp-47')\nvar match = require('bcp-47-match')\nvar matches = require('./matches.json')\nvar fields = require('./fields.json')\nvar defaults = require('./defaults.json')\nvar many = require('./many.json')\n\nmodule.exports = normalize\n\nvar own = {}.hasOwnProperty\n\nvar collator = new Intl.Collator()\n\nvar emptyExtraFields = {\n variants: [],\n extensions: [],\n privateuse: [],\n irregular: null,\n regular: null\n}\n\nfunction normalize(value, options) {\n var settings = options || {}\n // 1. normalize and lowercase the tag (`sgn-be-fr` -> `sfb`).\n var schema = bcp47.parse(String(value || '').toLowerCase(), settings)\n var tag = bcp47.stringify(schema)\n var index = -1\n var key\n\n if (!tag) {\n return tag\n }\n\n // 2. Do fancy, expensive replaces (`ha-latn-gh` -> `ha-gh`).\n while (++index < matches.length) {\n if (match.extendedFilter(tag, matches[index].from).length) {\n replace(schema, matches[index].from, matches[index].to)\n tag = bcp47.stringify(schema)\n }\n }\n\n // 3. Do basic field replaces (`en-840` -> `en-us`).\n index = -1\n\n while (++index < fields.length) {\n if (remove(schema, fields[index].from.field, fields[index].from.value)) {\n add(schema, fields[index].to.field, fields[index].to.value)\n }\n }\n\n // 4. Remove defaults (`nl-nl` -> `nl`).\n tag = bcp47.stringify(Object.assign({}, schema, emptyExtraFields))\n index = -1\n\n while (++index < defaults.length) {\n if (tag === defaults[index]) {\n replace(\n schema,\n defaults[index],\n defaults[index].split('-').slice(0, -1).join('-')\n )\n tag = bcp47.stringify(Object.assign({}, schema, emptyExtraFields))\n }\n }\n\n // 5. Sort extensions on singleton.\n schema.extensions.sort(compareSingleton)\n\n // 6. Warn if fields (currently only regions) should be updated but have\n // multiple choices.\n if (settings.warning) {\n for (key in many) {\n if (own.call(many[key], schema[key])) {\n settings.warning(\n 'Deprecated ' +\n key +\n ' `' +\n schema[key] +\n '`, expected one of `' +\n many[key][schema[key]].join('`, `') +\n '`',\n null,\n 7\n )\n }\n }\n }\n\n // 7. Add proper casing back.\n // Format script (ISO 15924) as titlecase (example: `Latn`):\n if (schema.script) {\n schema.script =\n schema.script.charAt(0).toUpperCase() + schema.script.slice(1)\n }\n\n // Format region (ISO 3166) as uppercase (note: this doesn’t affect numeric\n // codes, which is fine):\n if (schema.region) {\n schema.region = schema.region.toUpperCase()\n }\n\n return bcp47.stringify(schema)\n}\n\nfunction replace(schema, from, to) {\n var left = bcp47.parse(from)\n var right = bcp47.parse(to)\n var removed = []\n var key\n\n // Remove values from `from`:\n for (key in left) {\n if (left[key] && left[key].length && remove(schema, key, left[key])) {\n removed.push(key)\n }\n }\n\n // Add values from `to`:\n for (key in right) {\n // Only add values that are defined on `to`, and that were either removed by\n // `from` or are currently empty.\n if (\n right[key] &&\n right[key].length &&\n (removed.indexOf(key) > -1 || !schema[key] || !schema[key].length)\n ) {\n add(schema, key, right[key])\n }\n }\n}\n\nfunction remove(object, key, value) {\n var removed = false\n var current\n var result\n var index\n var item\n\n /* istanbul ignore else - this is currently done by wrapping code, so else is\n * never reached.\n * However, that could change in the future, so leave this guard here. */\n if (value) {\n current = object[key]\n result = current\n\n if (current && typeof current === 'object') {\n result = []\n index = -1\n\n while (++index < current.length) {\n item = current[index]\n\n if (value.indexOf(item) < 0) {\n result.push(item)\n } else {\n removed = true\n }\n }\n } else if (current === value) {\n result = null\n removed = true\n }\n\n object[key] = result\n }\n\n return removed\n}\n\nfunction add(object, key, value) {\n var current = object[key]\n var list\n var index\n var item\n\n if (current && typeof current === 'object') {\n list = [].concat(value)\n index = -1\n\n while (++index < list.length) {\n item = list[index]\n\n /* istanbul ignore else - this currently can’t happen, but guard for the\n * future. */\n if (current.indexOf(item) < 0) {\n current.push(item)\n }\n }\n } else {\n object[key] = value\n }\n}\n\nfunction compareSingleton(left, right) {\n return collator.compare(left.singleton, right.singleton)\n}\n","'use strict'\n\nexports.parse = require('./lib/parse')\nexports.stringify = require('./lib/stringify')\n","'use strict'\n\nvar alphanumeric = require('is-alphanumerical')\nvar alphabetical = require('is-alphabetical')\nvar decimal = require('is-decimal')\nvar regular = require('./regular.json')\nvar normal = require('./normalize.json')\n\nmodule.exports = parse\n\nvar own = {}.hasOwnProperty\n\n// Parse a BCP 47 language tag.\n/* eslint-disable-next-line complexity */\nfunction parse(tag, options) {\n var settings = options || {}\n var result = empty()\n var source = String(tag)\n var value = source.toLowerCase()\n var index = 0\n var start\n var groups\n var offset\n\n // Check input.\n if (tag == null) {\n throw new Error('Expected string, got `' + tag + '`')\n }\n\n // Let’s start.\n // First: the edge cases.\n if (own.call(normal, value)) {\n if ((settings.normalize == null || settings.normalize) && normal[value]) {\n return parse(normal[value])\n }\n\n result[regular.indexOf(value) === -1 ? 'irregular' : 'regular'] = source\n\n return result\n }\n\n // Now, to actually parse, eat what could be a language.\n while (alphabetical(value.charCodeAt(index)) && index < 9) index++\n\n // A language.\n if (index > 1 /* Min 639. */ && index < 9 /* Max subtag. */) {\n // 5 and up is a subtag.\n // 4 is the size of reserved languages.\n // 3 an ISO 639-2 or ISO 639-3.\n // 2 is an ISO 639-1.\n // <https://github.com/wooorm/iso-639-2>\n // <https://github.com/wooorm/iso-639-3>\n result.language = source.slice(0, index)\n\n if (index < 4 /* Max 639. */) {\n groups = 0\n\n while (\n value.charCodeAt(index) === 45 /* `-` */ &&\n alphabetical(value.charCodeAt(index + 1)) &&\n alphabetical(value.charCodeAt(index + 2)) &&\n alphabetical(value.charCodeAt(index + 3)) &&\n !alphabetical(value.charCodeAt(index + 4))\n ) {\n if (groups > 2 /* Max extended language subtag count. */) {\n return fail(\n index,\n 3,\n 'Too many extended language subtags, expected at most 3 subtags'\n )\n }\n\n // Extended language subtag.\n result.extendedLanguageSubtags.push(source.slice(index + 1, index + 4))\n index += 4\n groups++\n }\n }\n\n // ISO 15924 script.\n // <https://github.com/wooorm/iso-15924>\n if (\n value.charCodeAt(index) === 45 /* `-` */ &&\n alphabetical(value.charCodeAt(index + 1)) &&\n alphabetical(value.charCodeAt(index + 2)) &&\n alphabetical(value.charCodeAt(index + 3)) &&\n alphabetical(value.charCodeAt(index + 4)) &&\n !alphabetical(value.charCodeAt(index + 5))\n ) {\n result.script = source.slice(index + 1, index + 5)\n index += 5\n }\n\n if (value.charCodeAt(index) === 45 /* `-` */) {\n // ISO 3166-1 region.\n // <https://github.com/wooorm/iso-3166>\n if (\n alphabetical(value.charCodeAt(index + 1)) &&\n alphabetical(value.charCodeAt(index + 2)) &&\n !alphabetical(value.charCodeAt(index + 3))\n ) {\n result.region = source.slice(index + 1, index + 3)\n index += 3\n }\n // UN M49 region.\n // <https://github.com/wooorm/un-m49>\n else if (\n decimal(value.charCodeAt(index + 1)) &&\n decimal(value.charCodeAt(index + 2)) &&\n decimal(value.charCodeAt(index + 3)) &&\n !decimal(value.charCodeAt(index + 4))\n ) {\n result.region = source.slice(index + 1, index + 4)\n index += 4\n }\n }\n\n while (value.charCodeAt(index) === 45 /* `-` */) {\n offset = start = index + 1\n\n while (alphanumeric(value.charCodeAt(offset))) {\n if (offset - start > 7 /* Max variant. */) {\n return fail(\n offset,\n 1,\n 'Too long variant, expected at most 8 characters'\n )\n }\n\n offset++\n }\n\n if (\n // Long variant.\n offset - start > 4 /* Min alpha numeric variant. */ ||\n // Short variant.\n (offset - start > 3 /* Min variant. */ &&\n decimal(value.charCodeAt(start)))\n ) {\n result.variants.push(source.slice(start, offset))\n index = offset\n }\n // Something else.\n else {\n break\n }\n }\n\n // Extensions.\n while (value.charCodeAt(index) === 45 /* `-` */) {\n // Exit if this isn’t an extension.\n if (\n value.charCodeAt(index + 1) === 120 /* `x` */ ||\n !alphanumeric(value.charCodeAt(index + 1)) ||\n value.charCodeAt(index + 2) !== 45 /* `-` */ ||\n !alphanumeric(value.charCodeAt(index + 3))\n ) {\n break\n }\n\n offset = index + 2\n groups = 0\n\n while (\n value.charCodeAt(offset) === 45 /* `-` */ &&\n alphanumeric(value.charCodeAt(offset + 1)) &&\n alphanumeric(value.charCodeAt(offset + 2))\n ) {\n start = offset + 1\n offset = start + 2\n groups++\n\n while (alphanumeric(value.charCodeAt(offset))) {\n if (offset - start > 7 /* Max extension. */) {\n return fail(\n offset,\n 2,\n 'Too long extension, expected at most 8 characters'\n )\n }\n\n offset++\n }\n }\n\n if (!groups) {\n return fail(\n offset,\n 4,\n 'Empty extension, extensions must have at least 2 characters of content'\n )\n }\n\n result.extensions.push({\n singleton: source.charAt(index + 1),\n extensions: source.slice(index + 3, offset).split('-')\n })\n\n index = offset\n }\n }\n // Not a language.\n else {\n index = 0\n }\n\n // Private use.\n if (\n (index === 0 && value.charCodeAt(index) === 120) /* `x` */ ||\n (value.charCodeAt(index) === 45 /* `-` */ &&\n value.charCodeAt(index + 1) === 120) /* `x` */\n ) {\n offset = index = index ? index + 2 : 1\n\n while (\n value.charCodeAt(offset) === 45 /* `-` */ &&\n alphanumeric(value.charCodeAt(offset + 1))\n ) {\n offset = start = index + 1\n\n while (alphanumeric(value.charCodeAt(offset))) {\n if (offset - start > 7 /* Max private use. */) {\n return fail(\n offset,\n 5,\n 'Too long private-use area, expected at most 8 characters'\n )\n }\n\n offset++\n }\n\n result.privateuse.push(source.slice(index + 1, offset))\n index = offset\n }\n }\n\n if (index !== source.length) {\n return fail(index, 6, 'Found superfluous content after tag')\n }\n\n return result\n\n function fail(offset, code, reason) {\n if (settings.warning) settings.warning(reason, code, offset)\n return settings.forgiving ? result : empty()\n }\n}\n\n// Create an empty results object.\nfunction empty() {\n return {\n language: null,\n extendedLanguageSubtags: [],\n script: null,\n region: null,\n variants: [],\n extensions: [],\n privateuse: [],\n irregular: null,\n regular: null\n }\n}\n","'use strict'\n\nmodule.exports = stringify\n\n// Compile a language schema to a BCP 47 language tag.\nfunction stringify(schema) {\n var fields = schema || {}\n var result = []\n var values\n var index\n var value\n\n if (fields.irregular || fields.regular) {\n return fields.irregular || fields.regular\n }\n\n if (fields.language) {\n result = result.concat(\n fields.language,\n fields.extendedLanguageSubtags || [],\n fields.script || [],\n fields.region || [],\n fields.variants || []\n )\n\n values = fields.extensions || []\n index = -1\n\n while (++index < values.length) {\n value = values[index]\n\n if (value.singleton && value.extensions && value.extensions.length) {\n result = result.concat(value.singleton, value.extensions)\n }\n }\n }\n\n if (fields.privateuse && fields.privateuse.length) {\n result = result.concat('x', fields.privateuse)\n }\n\n return result.join('-')\n}\n","/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh <https://feross.org>\n * @license MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nvar base64 = require('base64-js')\nvar ieee754 = require('ieee754')\nvar customInspectSymbol =\n (typeof Symbol === 'function' && typeof Symbol['for'] === 'function') // eslint-disable-line dot-notation\n ? Symbol['for']('nodejs.util.inspect.custom') // eslint-disable-line dot-notation\n : null\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\nvar K_MAX_LENGTH = 0x7fffffff\nexports.kMaxLength = K_MAX_LENGTH\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Print warning and recommend using `buffer` v4.x which has an Object\n * implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * We report that the browser does not support typed arrays if the are not subclassable\n * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`\n * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support\n * for __proto__ and has a buggy typed array implementation.\n */\nBuffer.TYPED_ARRAY_SUPPORT = typedArraySupport()\n\nif (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&\n typeof console.error === 'function') {\n console.error(\n 'This browser lacks typed array (Uint8Array) support which is required by ' +\n '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'\n )\n}\n\nfunction typedArraySupport () {\n // Can typed array instances can be augmented?\n try {\n var arr = new Uint8Array(1)\n var proto = { foo: function () { return 42 } }\n Object.setPrototypeOf(proto, Uint8Array.prototype)\n Object.setPrototypeOf(arr, proto)\n return arr.foo() === 42\n } catch (e) {\n return false\n }\n}\n\nObject.defineProperty(Buffer.prototype, 'parent', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.buffer\n }\n})\n\nObject.defineProperty(Buffer.prototype, 'offset', {\n enumerable: true,\n get: function () {\n if (!Buffer.isBuffer(this)) return undefined\n return this.byteOffset\n }\n})\n\nfunction createBuffer (length) {\n if (length > K_MAX_LENGTH) {\n throw new RangeError('The value \"' + length + '\" is invalid for option \"size\"')\n }\n // Return an augmented `Uint8Array` instance\n var buf = new Uint8Array(length)\n Object.setPrototypeOf(buf, Buffer.prototype)\n return buf\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new TypeError(\n 'The \"string\" argument must be of type string. Received type number'\n )\n }\n return allocUnsafe(arg)\n }\n return from(arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\nfunction from (value, encodingOrOffset, length) {\n if (typeof value === 'string') {\n return fromString(value, encodingOrOffset)\n }\n\n if (ArrayBuffer.isView(value)) {\n return fromArrayView(value)\n }\n\n if (value == null) {\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n }\n\n if (isInstance(value, ArrayBuffer) ||\n (value && isInstance(value.buffer, ArrayBuffer))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof SharedArrayBuffer !== 'undefined' &&\n (isInstance(value, SharedArrayBuffer) ||\n (value && isInstance(value.buffer, SharedArrayBuffer)))) {\n return fromArrayBuffer(value, encodingOrOffset, length)\n }\n\n if (typeof value === 'number') {\n throw new TypeError(\n 'The \"value\" argument must not be of type number. Received type number'\n )\n }\n\n var valueOf = value.valueOf && value.valueOf()\n if (valueOf != null && valueOf !== value) {\n return Buffer.from(valueOf, encodingOrOffset, length)\n }\n\n var b = fromObject(value)\n if (b) return b\n\n if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&\n typeof value[Symbol.toPrimitive] === 'function') {\n return Buffer.from(\n value[Symbol.toPrimitive]('string'), encodingOrOffset, length\n )\n }\n\n throw new TypeError(\n 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n 'or Array-like Object. Received type ' + (typeof value)\n )\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(value, encodingOrOffset, length)\n}\n\n// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:\n// https://github.com/feross/buffer/pull/148\nObject.setPrototypeOf(Buffer.prototype, Uint8Array.prototype)\nObject.setPrototypeOf(Buffer, Uint8Array)\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be of type number')\n } else if (size < 0) {\n throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"')\n }\n}\n\nfunction alloc (size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpreted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(size).fill(fill, encoding)\n : createBuffer(size).fill(fill)\n }\n return createBuffer(size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(size, fill, encoding)\n}\n\nfunction allocUnsafe (size) {\n assertSize(size)\n return createBuffer(size < 0 ? 0 : checked(size) | 0)\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(size)\n}\n\nfunction fromString (string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n\n var length = byteLength(string, encoding) | 0\n var buf = createBuffer(length)\n\n var actual = buf.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n buf = buf.slice(0, actual)\n }\n\n return buf\n}\n\nfunction fromArrayLike (array) {\n var length = array.length < 0 ? 0 : checked(array.length) | 0\n var buf = createBuffer(length)\n for (var i = 0; i < length; i += 1) {\n buf[i] = array[i] & 255\n }\n return buf\n}\n\nfunction fromArrayView (arrayView) {\n if (isInstance(arrayView, Uint8Array)) {\n var copy = new Uint8Array(arrayView)\n return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength)\n }\n return fromArrayLike(arrayView)\n}\n\nfunction fromArrayBuffer (array, byteOffset, length) {\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\"offset\" is outside of buffer bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\"length\" is outside of buffer bounds')\n }\n\n var buf\n if (byteOffset === undefined && length === undefined) {\n buf = new Uint8Array(array)\n } else if (length === undefined) {\n buf = new Uint8Array(array, byteOffset)\n } else {\n buf = new Uint8Array(array, byteOffset, length)\n }\n\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(buf, Buffer.prototype)\n\n return buf\n}\n\nfunction fromObject (obj) {\n if (Buffer.isBuffer(obj)) {\n var len = checked(obj.length) | 0\n var buf = createBuffer(len)\n\n if (buf.length === 0) {\n return buf\n }\n\n obj.copy(buf, 0, 0, len)\n return buf\n }\n\n if (obj.length !== undefined) {\n if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {\n return createBuffer(0)\n }\n return fromArrayLike(obj)\n }\n\n if (obj.type === 'Buffer' && Array.isArray(obj.data)) {\n return fromArrayLike(obj.data)\n }\n}\n\nfunction checked (length) {\n // Note: cannot use `length < K_MAX_LENGTH` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= K_MAX_LENGTH) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return b != null && b._isBuffer === true &&\n b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false\n}\n\nBuffer.compare = function compare (a, b) {\n if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)\n if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError(\n 'The \"buf1\", \"buf2\" arguments must be one of type Buffer or Uint8Array'\n )\n }\n\n if (a === b) return 0\n\n var x = a.length\n var y = b.length\n\n for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!Array.isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n var i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n var buffer = Buffer.allocUnsafe(length)\n var pos = 0\n for (i = 0; i < list.length; ++i) {\n var buf = list[i]\n if (isInstance(buf, Uint8Array)) {\n if (pos + buf.length > buffer.length) {\n Buffer.from(buf).copy(buffer, pos)\n } else {\n Uint8Array.prototype.set.call(\n buffer,\n buf,\n pos\n )\n }\n } else if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n } else {\n buf.copy(buffer, pos)\n }\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n throw new TypeError(\n 'The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. ' +\n 'Received type ' + typeof string\n )\n }\n\n var len = string.length\n var mustMatch = (arguments.length > 2 && arguments[2] === true)\n if (!mustMatch && len === 0) return 0\n\n // Use a for loop to avoid recursion\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) {\n return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8\n }\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n var loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coercion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)\n// to detect a Buffer instance. It's not possible to use `instanceof Buffer`\n// reliably in a browserify context because there could be multiple different\n// copies of the 'buffer' package in use. This method works even for Buffer\n// instances that were created from another copy of the `buffer` package.\n// See: https://github.com/feross/buffer/issues/154\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n var i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n var len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (var i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n var len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (var i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n var len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (var i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n var length = this.length\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.toLocaleString = Buffer.prototype.toString\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n var str = ''\n var max = exports.INSPECT_MAX_BYTES\n str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()\n if (this.length > max) str += ' ... '\n return '<Buffer ' + str + '>'\n}\nif (customInspectSymbol) {\n Buffer.prototype[customInspectSymbol] = Buffer.prototype.inspect\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (isInstance(target, Uint8Array)) {\n target = Buffer.from(target, target.offset, target.byteLength)\n }\n if (!Buffer.isBuffer(target)) {\n throw new TypeError(\n 'The \"target\" argument must be one of type Buffer or Uint8Array. ' +\n 'Received type ' + (typeof target)\n )\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n var x = thisEnd - thisStart\n var y = end - start\n var len = Math.min(x, y)\n\n var thisCopy = this.slice(thisStart, thisEnd)\n var targetCopy = target.slice(start, end)\n\n for (var i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (numberIsNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [val], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n var indexSize = 1\n var arrLength = arr.length\n var valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n var i\n if (dir) {\n var foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n var found = true\n for (var j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n var remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n var strLen = string.length\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n for (var i = 0; i < length; ++i) {\n var parsed = parseInt(string.substr(i * 2, 2), 16)\n if (numberIsNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset >>> 0\n if (isFinite(length)) {\n length = length >>> 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n var remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n case 'latin1':\n case 'binary':\n return asciiWrite(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n var res = []\n\n var i = start\n while (i < end) {\n var firstByte = buf[i]\n var codePoint = null\n var bytesPerSequence = (firstByte > 0xEF)\n ? 4\n : (firstByte > 0xDF)\n ? 3\n : (firstByte > 0xBF)\n ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n var secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n var len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n var res = ''\n var i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n var len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n var out = ''\n for (var i = start; i < end; ++i) {\n out += hexSliceLookupTable[buf[i]]\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n var bytes = buf.slice(start, end)\n var res = ''\n // If bytes.length is odd, the last 8 bits must be ignored (same as node.js)\n for (var i = 0; i < bytes.length - 1; i += 2) {\n res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n var len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n var newBuf = this.subarray(start, end)\n // Return an augmented `Uint8Array` instance\n Object.setPrototypeOf(newBuf, Buffer.prototype)\n\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUintLE =\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUintBE =\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n var val = this[offset + --byteLength]\n var mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUint8 =\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUint16LE =\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUint16BE =\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUint32LE =\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUint32BE =\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var i = byteLength\n var mul = 1\n var val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n offset = offset >>> 0\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUintLE =\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var mul = 1\n var i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUintBE =\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n byteLength = byteLength >>> 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var i = byteLength - 1\n var mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUint8 =\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeUint16LE =\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeUint16BE =\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeUint32LE =\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeUint32BE =\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n var limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = 0\n var mul = 1\n var sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n var limit = Math.pow(2, (8 * byteLength) - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = byteLength - 1\n var mul = 1\n var sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n value = +value\n offset = offset >>> 0\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('Index out of range')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n var len = end - start\n\n if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {\n // Use built-in when available, missing from IE11\n this.copyWithin(targetStart, start, end)\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, end),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n if (val.length === 1) {\n var code = val.charCodeAt(0)\n if ((encoding === 'utf8' && code < 128) ||\n encoding === 'latin1') {\n // Fast path: If `val` fits into a single byte, use that numeric value.\n val = code\n }\n }\n } else if (typeof val === 'number') {\n val = val & 255\n } else if (typeof val === 'boolean') {\n val = Number(val)\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n var i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n var bytes = Buffer.isBuffer(val)\n ? val\n : Buffer.from(val, encoding)\n var len = bytes.length\n if (len === 0) {\n throw new TypeError('The value \"' + val +\n '\" is invalid for argument \"value\"')\n }\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node takes equal signs as end of the Base64 encoding\n str = str.split('=')[0]\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = str.trim().replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n var codePoint\n var length = string.length\n var leadSurrogate = null\n var bytes = []\n\n for (var i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n var c, hi, lo\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n for (var i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\n// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass\n// the `instanceof` check but they should be treated as of that type.\n// See: https://github.com/feross/buffer/issues/166\nfunction isInstance (obj, type) {\n return obj instanceof type ||\n (obj != null && obj.constructor != null && obj.constructor.name != null &&\n obj.constructor.name === type.name)\n}\nfunction numberIsNaN (obj) {\n // For IE11 support\n return obj !== obj // eslint-disable-line no-self-compare\n}\n\n// Create lookup table for `toString('hex')`\n// See: https://github.com/feross/buffer/issues/219\nvar hexSliceLookupTable = (function () {\n var alphabet = '0123456789abcdef'\n var table = new Array(256)\n for (var i = 0; i < 16; ++i) {\n var i16 = i * 16\n for (var j = 0; j < 16; ++j) {\n table[i16 + j] = alphabet[i] + alphabet[j]\n }\n }\n return table\n})()\n","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n","/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n var e, m\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var nBits = -7\n var i = isLE ? (nBytes - 1) : 0\n var d = isLE ? -1 : 1\n var s = buffer[offset + i]\n\n i += d\n\n e = s & ((1 << (-nBits)) - 1)\n s >>= (-nBits)\n nBits += eLen\n for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n m = e & ((1 << (-nBits)) - 1)\n e >>= (-nBits)\n nBits += mLen\n for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n if (e === 0) {\n e = 1 - eBias\n } else if (e === eMax) {\n return m ? NaN : ((s ? -1 : 1) * Infinity)\n } else {\n m = m + Math.pow(2, mLen)\n e = e - eBias\n }\n return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n var e, m, c\n var eLen = (nBytes * 8) - mLen - 1\n var eMax = (1 << eLen) - 1\n var eBias = eMax >> 1\n var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n var i = isLE ? 0 : (nBytes - 1)\n var d = isLE ? 1 : -1\n var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n value = Math.abs(value)\n\n if (isNaN(value) || value === Infinity) {\n m = isNaN(value) ? 1 : 0\n e = eMax\n } else {\n e = Math.floor(Math.log(value) / Math.LN2)\n if (value * (c = Math.pow(2, -e)) < 1) {\n e--\n c *= 2\n }\n if (e + eBias >= 1) {\n value += rt / c\n } else {\n value += rt * Math.pow(2, 1 - eBias)\n }\n if (value * c >= 2) {\n e++\n c /= 2\n }\n\n if (e + eBias >= eMax) {\n m = 0\n e = eMax\n } else if (e + eBias >= 1) {\n m = ((value * c) - 1) * Math.pow(2, mLen)\n e = e + eBias\n } else {\n m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n e = 0\n }\n }\n\n for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n e = (e << mLen) | m\n eLen += mLen\n for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n buffer[offset + i - d] |= s * 128\n}\n","/*! codem-isoboxer v0.3.9 https://github.com/madebyhiro/codem-isoboxer/blob/master/LICENSE.txt */\nvar ISOBoxer = {};\n\nISOBoxer.parseBuffer = function(arrayBuffer) {\n return new ISOFile(arrayBuffer).parse();\n};\n\nISOBoxer.addBoxProcessor = function(type, parser) {\n if (typeof type !== 'string' || typeof parser !== 'function') {\n return;\n }\n ISOBox.prototype._boxProcessors[type] = parser;\n};\n\nISOBoxer.createFile = function() {\n return new ISOFile();\n};\n\n// See ISOBoxer.append() for 'pos' parameter syntax\nISOBoxer.createBox = function(type, parent, pos) {\n var newBox = ISOBox.create(type);\n if (parent) {\n parent.append(newBox, pos);\n }\n return newBox;\n};\n\n// See ISOBoxer.append() for 'pos' parameter syntax\nISOBoxer.createFullBox = function(type, parent, pos) {\n var newBox = ISOBoxer.createBox(type, parent, pos);\n newBox.version = 0;\n newBox.flags = 0;\n return newBox;\n};\n\nISOBoxer.Utils = {};\nISOBoxer.Utils.dataViewToString = function(dataView, encoding) {\n var impliedEncoding = encoding || 'utf-8';\n if (typeof TextDecoder !== 'undefined') {\n return new TextDecoder(impliedEncoding).decode(dataView);\n }\n var a = [];\n var i = 0;\n\n if (impliedEncoding === 'utf-8') {\n /* The following algorithm is essentially a rewrite of the UTF8.decode at\n http://bannister.us/weblog/2007/simple-base64-encodedecode-javascript/\n */\n\n while (i < dataView.byteLength) {\n var c = dataView.getUint8(i++);\n if (c < 0x80) {\n // 1-byte character (7 bits)\n } else if (c < 0xe0) {\n // 2-byte character (11 bits)\n c = (c & 0x1f) << 6;\n c |= (dataView.getUint8(i++) & 0x3f);\n } else if (c < 0xf0) {\n // 3-byte character (16 bits)\n c = (c & 0xf) << 12;\n c |= (dataView.getUint8(i++) & 0x3f) << 6;\n c |= (dataView.getUint8(i++) & 0x3f);\n } else {\n // 4-byte character (21 bits)\n c = (c & 0x7) << 18;\n c |= (dataView.getUint8(i++) & 0x3f) << 12;\n c |= (dataView.getUint8(i++) & 0x3f) << 6;\n c |= (dataView.getUint8(i++) & 0x3f);\n }\n a.push(String.fromCharCode(c));\n }\n } else { // Just map byte-by-byte (probably wrong)\n while (i < dataView.byteLength) {\n a.push(String.fromCharCode(dataView.getUint8(i++)));\n }\n }\n return a.join('');\n};\n\nISOBoxer.Utils.utf8ToByteArray = function(string) {\n // Only UTF-8 encoding is supported by TextEncoder\n var u, i;\n if (typeof TextEncoder !== 'undefined') {\n u = new TextEncoder().encode(string);\n } else {\n u = [];\n for (i = 0; i < string.length; ++i) {\n var c = string.charCodeAt(i);\n if (c < 0x80) {\n u.push(c);\n } else if (c < 0x800) {\n u.push(0xC0 | (c >> 6));\n u.push(0x80 | (63 & c));\n } else if (c < 0x10000) {\n u.push(0xE0 | (c >> 12));\n u.push(0x80 | (63 & (c >> 6)));\n u.push(0x80 | (63 & c));\n } else {\n u.push(0xF0 | (c >> 18));\n u.push(0x80 | (63 & (c >> 12)));\n u.push(0x80 | (63 & (c >> 6)));\n u.push(0x80 | (63 & c));\n }\n }\n }\n return u;\n};\n\n// Method to append a box in the list of child boxes\n// The 'pos' parameter can be either:\n// - (number) a position index at which to insert the new box\n// - (string) the type of the box after which to insert the new box\n// - (object) the box after which to insert the new box\nISOBoxer.Utils.appendBox = function(parent, box, pos) {\n box._offset = parent._cursor.offset;\n box._root = (parent._root ? parent._root : parent);\n box._raw = parent._raw;\n box._parent = parent;\n\n if (pos === -1) {\n // The new box is a sub-box of the parent but not added in boxes array,\n // for example when the new box is set as an entry (see dref and stsd for example)\n return;\n }\n\n if (pos === undefined || pos === null) {\n parent.boxes.push(box);\n return;\n }\n\n var index = -1,\n type;\n\n if (typeof pos === \"number\") {\n index = pos;\n } else {\n if (typeof pos === \"string\") {\n type = pos;\n } else if (typeof pos === \"object\" && pos.type) {\n type = pos.type;\n } else {\n parent.boxes.push(box);\n return;\n }\n\n for (var i = 0; i < parent.boxes.length; i++) {\n if (type === parent.boxes[i].type) {\n index = i + 1;\n break;\n }\n }\n }\n parent.boxes.splice(index, 0, box);\n};\n\nif (typeof exports !== 'undefined') {\n exports.parseBuffer = ISOBoxer.parseBuffer;\n exports.addBoxProcessor = ISOBoxer.addBoxProcessor;\n exports.createFile = ISOBoxer.createFile;\n exports.createBox = ISOBoxer.createBox;\n exports.createFullBox = ISOBoxer.createFullBox;\n exports.Utils = ISOBoxer.Utils;\n}\n\nISOBoxer.Cursor = function(initialOffset) {\n this.offset = (typeof initialOffset == 'undefined' ? 0 : initialOffset);\n};\n\nvar ISOFile = function(arrayBuffer) {\n this._cursor = new ISOBoxer.Cursor();\n this.boxes = [];\n if (arrayBuffer) {\n this._raw = new DataView(arrayBuffer);\n }\n};\n\nISOFile.prototype.fetch = function(type) {\n var result = this.fetchAll(type, true);\n return (result.length ? result[0] : null);\n};\n\nISOFile.prototype.fetchAll = function(type, returnEarly) {\n var result = [];\n ISOFile._sweep.call(this, type, result, returnEarly);\n return result;\n};\n\nISOFile.prototype.parse = function() {\n this._cursor.offset = 0;\n this.boxes = [];\n while (this._cursor.offset < this._raw.byteLength) {\n var box = ISOBox.parse(this);\n\n // Box could not be parsed\n if (typeof box.type === 'undefined') break;\n\n this.boxes.push(box);\n }\n return this;\n};\n\nISOFile._sweep = function(type, result, returnEarly) {\n if (this.type && this.type == type) result.push(this);\n for (var box in this.boxes) {\n if (result.length && returnEarly) return;\n ISOFile._sweep.call(this.boxes[box], type, result, returnEarly);\n }\n};\n\nISOFile.prototype.write = function() {\n\n var length = 0,\n i;\n\n for (i = 0; i < this.boxes.length; i++) {\n length += this.boxes[i].getLength(false);\n }\n\n var bytes = new Uint8Array(length);\n this._rawo = new DataView(bytes.buffer);\n this.bytes = bytes;\n this._cursor.offset = 0;\n\n for (i = 0; i < this.boxes.length; i++) {\n this.boxes[i].write();\n }\n\n return bytes.buffer;\n};\n\nISOFile.prototype.append = function(box, pos) {\n ISOBoxer.Utils.appendBox(this, box, pos);\n};\nvar ISOBox = function() {\n this._cursor = new ISOBoxer.Cursor();\n};\n\nISOBox.parse = function(parent) {\n var newBox = new ISOBox();\n newBox._offset = parent._cursor.offset;\n newBox._root = (parent._root ? parent._root : parent);\n newBox._raw = parent._raw;\n newBox._parent = parent;\n newBox._parseBox();\n parent._cursor.offset = newBox._raw.byteOffset + newBox._raw.byteLength;\n return newBox;\n};\n\nISOBox.create = function(type) {\n var newBox = new ISOBox();\n newBox.type = type;\n newBox.boxes = [];\n return newBox;\n};\n\nISOBox.prototype._boxContainers = ['dinf', 'edts', 'mdia', 'meco', 'mfra', 'minf', 'moof', 'moov', 'mvex', 'stbl', 'strk', 'traf', 'trak', 'tref', 'udta', 'vttc', 'sinf', 'schi', 'encv', 'enca'];\n\nISOBox.prototype._boxProcessors = {};\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Generic read/write functions\n\nISOBox.prototype._procField = function (name, type, size) {\n if (this._parsing) {\n this[name] = this._readField(type, size);\n }\n else {\n this._writeField(type, size, this[name]);\n }\n};\n\nISOBox.prototype._procFieldArray = function (name, length, type, size) {\n var i;\n if (this._parsing) {\n this[name] = [];\n for (i = 0; i < length; i++) {\n this[name][i] = this._readField(type, size);\n }\n }\n else {\n for (i = 0; i < this[name].length; i++) {\n this._writeField(type, size, this[name][i]);\n }\n }\n};\n\nISOBox.prototype._procFullBox = function() {\n this._procField('version', 'uint', 8);\n this._procField('flags', 'uint', 24);\n};\n\nISOBox.prototype._procEntries = function(name, length, fn) {\n var i;\n if (this._parsing) {\n this[name] = [];\n for (i = 0; i < length; i++) {\n this[name].push({});\n fn.call(this, this[name][i]);\n }\n }\n else {\n for (i = 0; i < length; i++) {\n fn.call(this, this[name][i]);\n }\n }\n};\n\nISOBox.prototype._procSubEntries = function(entry, name, length, fn) {\n var i;\n if (this._parsing) {\n entry[name] = [];\n for (i = 0; i < length; i++) {\n entry[name].push({});\n fn.call(this, entry[name][i]);\n }\n }\n else {\n for (i = 0; i < length; i++) {\n fn.call(this, entry[name][i]);\n }\n }\n};\n\nISOBox.prototype._procEntryField = function (entry, name, type, size) {\n if (this._parsing) {\n entry[name] = this._readField(type, size);\n }\n else {\n this._writeField(type, size, entry[name]);\n }\n};\n\nISOBox.prototype._procSubBoxes = function(name, length) {\n var i;\n if (this._parsing) {\n this[name] = [];\n for (i = 0; i < length; i++) {\n this[name].push(ISOBox.parse(this));\n }\n }\n else {\n for (i = 0; i < length; i++) {\n if (this._rawo) {\n this[name][i].write();\n } else {\n this.size += this[name][i].getLength();\n }\n }\n }\n};\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Read/parse functions\n\nISOBox.prototype._readField = function(type, size) {\n switch (type) {\n case 'uint':\n return this._readUint(size);\n case 'int':\n return this._readInt(size);\n case 'template':\n return this._readTemplate(size);\n case 'string':\n return (size === -1) ? this._readTerminatedString() : this._readString(size);\n case 'data':\n return this._readData(size);\n case 'utf8':\n return this._readUTF8String();\n default:\n return -1;\n }\n};\n\nISOBox.prototype._readInt = function(size) {\n var result = null,\n offset = this._cursor.offset - this._raw.byteOffset;\n switch(size) {\n case 8:\n result = this._raw.getInt8(offset);\n break;\n case 16:\n result = this._raw.getInt16(offset);\n break;\n case 32:\n result = this._raw.getInt32(offset);\n break;\n case 64:\n // Warning: JavaScript cannot handle 64-bit integers natively.\n // This will give unexpected results for integers >= 2^53\n var s1 = this._raw.getInt32(offset);\n var s2 = this._raw.getInt32(offset + 4);\n result = (s1 * Math.pow(2,32)) + s2;\n break;\n }\n this._cursor.offset += (size >> 3);\n return result;\n};\n\nISOBox.prototype._readUint = function(size) {\n var result = null,\n offset = this._cursor.offset - this._raw.byteOffset,\n s1, s2;\n switch(size) {\n case 8:\n result = this._raw.getUint8(offset);\n break;\n case 16:\n result = this._raw.getUint16(offset);\n break;\n case 24:\n s1 = this._raw.getUint16(offset);\n s2 = this._raw.getUint8(offset + 2);\n result = (s1 << 8) + s2;\n break;\n case 32:\n result = this._raw.getUint32(offset);\n break;\n case 64:\n // Warning: JavaScript cannot handle 64-bit integers natively.\n // This will give unexpected results for integers >= 2^53\n s1 = this._raw.getUint32(offset);\n s2 = this._raw.getUint32(offset + 4);\n result = (s1 * Math.pow(2,32)) + s2;\n break;\n }\n this._cursor.offset += (size >> 3);\n return result;\n};\n\nISOBox.prototype._readString = function(length) {\n var str = '';\n for (var c = 0; c < length; c++) {\n var char = this._readUint(8);\n str += String.fromCharCode(char);\n }\n return str;\n};\n\nISOBox.prototype._readTemplate = function(size) {\n var pre = this._readUint(size / 2);\n var post = this._readUint(size / 2);\n return pre + (post / Math.pow(2, size / 2));\n};\n\nISOBox.prototype._readTerminatedString = function() {\n var str = '';\n while (this._cursor.offset - this._offset < this._raw.byteLength) {\n var char = this._readUint(8);\n if (char === 0) break;\n str += String.fromCharCode(char);\n }\n return str;\n};\n\nISOBox.prototype._readData = function(size) {\n var length = (size > 0) ? size : (this._raw.byteLength - (this._cursor.offset - this._offset));\n if (length > 0) {\n var data = new Uint8Array(this._raw.buffer, this._cursor.offset, length);\n\n this._cursor.offset += length;\n return data;\n }\n else {\n return null;\n }\n};\n\nISOBox.prototype._readUTF8String = function() {\n var length = this._raw.byteLength - (this._cursor.offset - this._offset);\n var data = null;\n if (length > 0) {\n data = new DataView(this._raw.buffer, this._cursor.offset, length);\n this._cursor.offset += length;\n }\n \n return data ? ISOBoxer.Utils.dataViewToString(data) : data;\n};\n\nISOBox.prototype._parseBox = function() {\n this._parsing = true;\n this._cursor.offset = this._offset;\n\n // return immediately if there are not enough bytes to read the header\n if (this._offset + 8 > this._raw.buffer.byteLength) {\n this._root._incomplete = true;\n return;\n }\n\n this._procField('size', 'uint', 32);\n this._procField('type', 'string', 4);\n\n if (this.size === 1) { this._procField('largesize', 'uint', 64); }\n if (this.type === 'uuid') { this._procFieldArray('usertype', 16, 'uint', 8); }\n\n switch(this.size) {\n case 0:\n // Size zero indicates last box in the file. Consume remaining buffer.\n this._raw = new DataView(this._raw.buffer, this._offset);\n break;\n case 1:\n if (this._offset + this.size > this._raw.buffer.byteLength) {\n this._incomplete = true;\n this._root._incomplete = true;\n } else {\n this._raw = new DataView(this._raw.buffer, this._offset, this.largesize);\n }\n break;\n default:\n if (this._offset + this.size > this._raw.buffer.byteLength) {\n this._incomplete = true;\n this._root._incomplete = true;\n } else {\n this._raw = new DataView(this._raw.buffer, this._offset, this.size);\n }\n }\n\n // additional parsing\n if (!this._incomplete) {\n if (this._boxProcessors[this.type]) {\n this._boxProcessors[this.type].call(this);\n }\n if (this._boxContainers.indexOf(this.type) !== -1) {\n this._parseContainerBox();\n } else{\n // Unknown box => read and store box content\n this._data = this._readData();\n }\n }\n};\n\nISOBox.prototype._parseFullBox = function() {\n this.version = this._readUint(8);\n this.flags = this._readUint(24);\n};\n\nISOBox.prototype._parseContainerBox = function() {\n this.boxes = [];\n while (this._cursor.offset - this._raw.byteOffset < this._raw.byteLength) {\n this.boxes.push(ISOBox.parse(this));\n }\n};\n\n///////////////////////////////////////////////////////////////////////////////////////////////////\n// Write functions\n\nISOBox.prototype.append = function(box, pos) {\n ISOBoxer.Utils.appendBox(this, box, pos);\n};\n\nISOBox.prototype.getLength = function() {\n this._parsing = false;\n this._rawo = null;\n\n this.size = 0;\n this._procField('size', 'uint', 32);\n this._procField('type', 'string', 4);\n\n if (this.size === 1) { this._procField('largesize', 'uint', 64); }\n if (this.type === 'uuid') { this._procFieldArray('usertype', 16, 'uint', 8); }\n\n if (this._boxProcessors[this.type]) {\n this._boxProcessors[this.type].call(this);\n }\n\n if (this._boxContainers.indexOf(this.type) !== -1) {\n for (var i = 0; i < this.boxes.length; i++) {\n this.size += this.boxes[i].getLength();\n }\n } \n\n if (this._data) {\n this._writeData(this._data);\n }\n\n return this.size;\n};\n\nISOBox.prototype.write = function() {\n this._parsing = false;\n this._cursor.offset = this._parent._cursor.offset;\n\n switch(this.size) {\n case 0:\n this._rawo = new DataView(this._parent._rawo.buffer, this._cursor.offset, (this.parent._rawo.byteLength - this._cursor.offset));\n break;\n case 1:\n this._rawo = new DataView(this._parent._rawo.buffer, this._cursor.offset, this.largesize);\n break;\n default:\n this._rawo = new DataView(this._parent._rawo.buffer, this._cursor.offset, this.size);\n }\n\n this._procField('size', 'uint', 32);\n this._procField('type', 'string', 4);\n\n if (this.size === 1) { this._procField('largesize', 'uint', 64); }\n if (this.type === 'uuid') { this._procFieldArray('usertype', 16, 'uint', 8); }\n\n if (this._boxProcessors[this.type]) {\n this._boxProcessors[this.type].call(this);\n }\n\n if (this._boxContainers.indexOf(this.type) !== -1) {\n for (var i = 0; i < this.boxes.length; i++) {\n this.boxes[i].write();\n }\n } \n\n if (this._data) {\n this._writeData(this._data);\n }\n\n this._parent._cursor.offset += this.size;\n\n return this.size;\n};\n\nISOBox.prototype._writeInt = function(size, value) {\n if (this._rawo) {\n var offset = this._cursor.offset - this._rawo.byteOffset;\n switch(size) {\n case 8:\n this._rawo.setInt8(offset, value);\n break;\n case 16:\n this._rawo.setInt16(offset, value);\n break;\n case 32:\n this._rawo.setInt32(offset, value);\n break;\n case 64:\n // Warning: JavaScript cannot handle 64-bit integers natively.\n // This will give unexpected results for integers >= 2^53\n var s1 = Math.floor(value / Math.pow(2,32));\n var s2 = value - (s1 * Math.pow(2,32));\n this._rawo.setUint32(offset, s1);\n this._rawo.setUint32(offset + 4, s2);\n break;\n }\n this._cursor.offset += (size >> 3);\n } else {\n this.size += (size >> 3);\n }\n};\n\nISOBox.prototype._writeUint = function(size, value) {\n\n if (this._rawo) {\n var offset = this._cursor.offset - this._rawo.byteOffset,\n s1, s2;\n switch(size) {\n case 8:\n this._rawo.setUint8(offset, value);\n break;\n case 16:\n this._rawo.setUint16(offset, value);\n break;\n case 24:\n s1 = (value & 0xFFFF00) >> 8;\n s2 = (value & 0x0000FF);\n this._rawo.setUint16(offset, s1);\n this._rawo.setUint8(offset + 2, s2);\n break;\n case 32:\n this._rawo.setUint32(offset, value);\n break;\n case 64:\n // Warning: JavaScript cannot handle 64-bit integers natively.\n // This will give unexpected results for integers >= 2^53\n s1 = Math.floor(value / Math.pow(2,32));\n s2 = value - (s1 * Math.pow(2,32));\n this._rawo.setUint32(offset, s1);\n this._rawo.setUint32(offset + 4, s2);\n break;\n }\n this._cursor.offset += (size >> 3);\n } else {\n this.size += (size >> 3);\n }\n};\n\nISOBox.prototype._writeString = function(size, str) {\n for (var c = 0; c < size; c++) {\n this._writeUint(8, str.charCodeAt(c));\n }\n};\n\nISOBox.prototype._writeTerminatedString = function(str) {\n if (str.length === 0) {\n return;\n }\n for (var c = 0; c < str.length; c++) {\n this._writeUint(8, str.charCodeAt(c));\n }\n this._writeUint(8, 0);\n};\n\nISOBox.prototype._writeTemplate = function(size, value) {\n var pre = Math.floor(value);\n var post = (value - pre) * Math.pow(2, size / 2);\n this._writeUint(size / 2, pre);\n this._writeUint(size / 2, post);\n};\n\nISOBox.prototype._writeData = function(data) {\n var i;\n //data to copy\n if (data) {\n if (this._rawo) {\n //Array and Uint8Array has also to be managed\n if (data instanceof Array) {\n var offset = this._cursor.offset - this._rawo.byteOffset;\n for (var i = 0; i < data.length; i++) {\n this._rawo.setInt8(offset + i, data[i]);\n }\n this._cursor.offset += data.length;\n } \n\n if (data instanceof Uint8Array) {\n this._root.bytes.set(data, this._cursor.offset);\n this._cursor.offset += data.length;\n }\n\n } else {\n //nothing to copy only size to compute\n this.size += data.length;\n }\n }\n};\n\nISOBox.prototype._writeUTF8String = function(string) {\n var u = ISOBoxer.Utils.utf8ToByteArray(string);\n if (this._rawo) {\n var dataView = new DataView(this._rawo.buffer, this._cursor.offset, u.length);\n for (var i = 0; i < u.length; i++) {\n dataView.setUint8(i, u[i]);\n }\n } else {\n this.size += u.length;\n }\n};\n\nISOBox.prototype._writeField = function(type, size, value) {\n switch (type) {\n case 'uint':\n this._writeUint(size, value);\n break;\n case 'int':\n this._writeInt(size, value);\n break;\n case 'template':\n this._writeTemplate(size, value);\n break;\n case 'string':\n if (size == -1) {\n this._writeTerminatedString(value);\n } else {\n this._writeString(size, value);\n }\n break;\n case 'data':\n this._writeData(value);\n break;\n case 'utf8':\n this._writeUTF8String(value);\n break;\n default:\n break;\n }\n};\n\n// ISO/IEC 14496-15:2014 - avc1/2/3/4, hev1, hvc1, encv\nISOBox.prototype._boxProcessors['avc1'] =\nISOBox.prototype._boxProcessors['avc2'] =\nISOBox.prototype._boxProcessors['avc3'] =\nISOBox.prototype._boxProcessors['avc4'] =\nISOBox.prototype._boxProcessors['hvc1'] =\nISOBox.prototype._boxProcessors['hev1'] =\nISOBox.prototype._boxProcessors['encv'] = function() {\n // SampleEntry fields\n this._procFieldArray('reserved1', 6, 'uint', 8);\n this._procField('data_reference_index', 'uint', 16);\n // VisualSampleEntry fields\n this._procField('pre_defined1', 'uint', 16);\n this._procField('reserved2', 'uint', 16);\n this._procFieldArray('pre_defined2', 3, 'uint', 32);\n this._procField('width', 'uint', 16);\n this._procField('height', 'uint', 16);\n this._procField('horizresolution', 'template', 32);\n this._procField('vertresolution', 'template', 32);\n this._procField('reserved3', 'uint', 32);\n this._procField('frame_count', 'uint', 16);\n this._procFieldArray('compressorname', 32,'uint', 8);\n this._procField('depth', 'uint', 16);\n this._procField('pre_defined3', 'int', 16);\n // Codec-specific fields\n this._procField('config', 'data', -1);\n};\n\n// ISO/IEC 14496-12:2012 - 8.6.1.3 Composition Time To Sample Box\nISOBox.prototype._boxProcessors['ctts'] = function() {\n this._procFullBox();\n this._procField('entry_count', 'uint', 32);\n this._procEntries('entries', this.entry_count, function(entry) {\n this._procEntryField(entry, 'sample_count', 'uint', 32);\n this._procEntryField(entry, 'sample_offset', (this.version === 1) ? 'int' : 'uint', 32);\n });\n};\n\n// ISO/IEC 14496-12:2012 - 8.7.2 Data Reference Box\nISOBox.prototype._boxProcessors['dref'] = function() {\n this._procFullBox();\n this._procField('entry_count', 'uint', 32);\n this._procSubBoxes('entries', this.entry_count);\n};\n\n// ISO/IEC 14496-12:2012 - 8.6.6 Edit List Box\nISOBox.prototype._boxProcessors['elst'] = function() {\n this._procFullBox();\n this._procField('entry_count', 'uint', 32);\n this._procEntries('entries', this.entry_count, function(entry) {\n this._procEntryField(entry, 'segment_duration', 'uint', (this.version === 1) ? 64 : 32);\n this._procEntryField(entry, 'media_time', 'int', (this.version === 1) ? 64 : 32);\n this._procEntryField(entry, 'media_rate_integer', 'int', 16);\n this._procEntryField(entry, 'media_rate_fraction', 'int', 16);\n });\n};\n\n// ISO/IEC 23009-1:2014 - 5.10.3.3 Event Message Box\nISOBox.prototype._boxProcessors['emsg'] = function() {\n this._procFullBox();\n if (this.version == 1) {\n this._procField('timescale', 'uint', 32);\n this._procField('presentation_time', 'uint', 64);\n this._procField('event_duration', 'uint', 32);\n this._procField('id', 'uint', 32);\n this._procField('scheme_id_uri', 'string', -1);\n this._procField('value', 'string', -1);\n } else {\n this._procField('scheme_id_uri', 'string', -1);\n this._procField('value', 'string', -1);\n this._procField('timescale', 'uint', 32);\n this._procField('presentation_time_delta', 'uint', 32);\n this._procField('event_duration', 'uint', 32);\n this._procField('id', 'uint', 32);\n }\n this._procField('message_data', 'data', -1);\n};\n// ISO/IEC 14496-12:2012 - 8.1.2 Free Space Box\nISOBox.prototype._boxProcessors['free'] = ISOBox.prototype._boxProcessors['skip'] = function() {\n this._procField('data', 'data', -1);\n};\n\n// ISO/IEC 14496-12:2012 - 8.12.2 Original Format Box\nISOBox.prototype._boxProcessors['frma'] = function() {\n this._procField('data_format', 'uint', 32);\n};\n// ISO/IEC 14496-12:2012 - 4.3 File Type Box / 8.16.2 Segment Type Box\nISOBox.prototype._boxProcessors['ftyp'] =\nISOBox.prototype._boxProcessors['styp'] = function() {\n this._procField('major_brand', 'string', 4);\n this._procField('minor_version', 'uint', 32);\n var nbCompatibleBrands = -1;\n if (this._parsing) {\n nbCompatibleBrands = (this._raw.byteLength - (this._cursor.offset - this._raw.byteOffset)) / 4;\n }\n this._procFieldArray('compatible_brands', nbCompatibleBrands, 'string', 4);\n};\n\n// ISO/IEC 14496-12:2012 - 8.4.3 Handler Reference Box\nISOBox.prototype._boxProcessors['hdlr'] = function() {\n this._procFullBox();\n this._procField('pre_defined', 'uint', 32);\n this._procField('handler_type', 'string', 4);\n this._procFieldArray('reserved', 3, 'uint', 32);\n this._procField('name', 'string', -1);\n};\n\n// ISO/IEC 14496-12:2012 - 8.1.1 Media Data Box\nISOBox.prototype._boxProcessors['mdat'] = function() {\n this._procField('data', 'data', -1);\n};\n\n// ISO/IEC 14496-12:2012 - 8.4.2 Media Header Box\nISOBox.prototype._boxProcessors['mdhd'] = function() {\n this._procFullBox();\n this._procField('creation_time', 'uint', (this.version == 1) ? 64 : 32);\n this._procField('modification_time', 'uint', (this.version == 1) ? 64 : 32);\n this._procField('timescale', 'uint', 32);\n this._procField('duration', 'uint', (this.version == 1) ? 64 : 32);\n if (!this._parsing && typeof this.language === 'string') {\n // In case of writing and language has been set as a string, then convert it into char codes array\n this.language = ((this.language.charCodeAt(0) - 0x60) << 10) |\n ((this.language.charCodeAt(1) - 0x60) << 5) |\n ((this.language.charCodeAt(2) - 0x60));\n }\n this._procField('language', 'uint', 16);\n if (this._parsing) {\n this.language = String.fromCharCode(((this.language >> 10) & 0x1F) + 0x60,\n ((this.language >> 5) & 0x1F) + 0x60,\n (this.language & 0x1F) + 0x60);\n }\n this._procField('pre_defined', 'uint', 16);\n};\n\n// ISO/IEC 14496-12:2012 - 8.8.2 Movie Extends Header Box\nISOBox.prototype._boxProcessors['mehd'] = function() {\n this._procFullBox();\n this._procField('fragment_duration', 'uint', (this.version == 1) ? 64 : 32);\n};\n\n// ISO/IEC 14496-12:2012 - 8.8.5 Movie Fragment Header Box\nISOBox.prototype._boxProcessors['mfhd'] = function() {\n this._procFullBox();\n this._procField('sequence_number', 'uint', 32);\n};\n\n// ISO/IEC 14496-12:2012 - 8.8.11 Movie Fragment Random Access Box\nISOBox.prototype._boxProcessors['mfro'] = function() {\n this._procFullBox();\n this._procField('mfra_size', 'uint', 32); // Called mfra_size to distinguish from the normal \"size\" attribute of a box\n};\n\n\n// ISO/IEC 14496-12:2012 - 8.5.2.2 mp4a box (use AudioSampleEntry definition and naming)\nISOBox.prototype._boxProcessors['mp4a'] = ISOBox.prototype._boxProcessors['enca'] = function() {\n // SampleEntry fields\n this._procFieldArray('reserved1', 6, 'uint', 8);\n this._procField('data_reference_index', 'uint', 16);\n // AudioSampleEntry fields\n this._procFieldArray('reserved2', 2, 'uint', 32);\n this._procField('channelcount', 'uint', 16);\n this._procField('samplesize', 'uint', 16);\n this._procField('pre_defined', 'uint', 16);\n this._procField('reserved3', 'uint', 16);\n this._procField('samplerate', 'template', 32);\n // ESDescriptor fields\n this._procField('esds', 'data', -1);\n};\n\n// ISO/IEC 14496-12:2012 - 8.2.2 Movie Header Box\nISOBox.prototype._boxProcessors['mvhd'] = function() {\n this._procFullBox();\n this._procField('creation_time', 'uint', (this.version == 1) ? 64 : 32);\n this._procField('modification_time', 'uint', (this.version == 1) ? 64 : 32);\n this._procField('timescale', 'uint', 32);\n this._procField('duration', 'uint', (this.version == 1) ? 64 : 32);\n this._procField('rate', 'template', 32);\n this._procField('volume', 'template', 16);\n this._procField('reserved1', 'uint', 16);\n this._procFieldArray('reserved2', 2, 'uint', 32);\n this._procFieldArray('matrix', 9, 'template', 32);\n this._procFieldArray('pre_defined', 6,'uint', 32);\n this._procField('next_track_ID', 'uint', 32);\n};\n\n// ISO/IEC 14496-30:2014 - WebVTT Cue Payload Box.\nISOBox.prototype._boxProcessors['payl'] = function() {\n this._procField('cue_text', 'utf8');\n};\n\n// ISO/IEC 14496-12:2012 - 8.16.5 Producer Reference Time\nISOBox.prototype._boxProcessors['prft'] = function() {\n this._procFullBox();\n this._procField('reference_track_ID', 'uint', 32);\n this._procField('ntp_timestamp_sec', 'uint', 32);\n this._procField('ntp_timestamp_frac', 'uint', 32);\n this._procField('media_time', 'uint', (this.version == 1) ? 64 : 32);\n};\n\n//ISO/IEC 23001-7:2011 - 8.1 Protection System Specific Header Box\nISOBox.prototype._boxProcessors['pssh'] = function() {\n this._procFullBox();\n \n this._procFieldArray('SystemID', 16, 'uint', 8);\n this._procField('DataSize', 'uint', 32);\n this._procFieldArray('Data', this.DataSize, 'uint', 8);\n};\n// ISO/IEC 14496-12:2012 - 8.12.5 Scheme Type Box\nISOBox.prototype._boxProcessors['schm'] = function() {\n this._procFullBox();\n \n this._procField('scheme_type', 'uint', 32);\n this._procField('scheme_version', 'uint', 32);\n\n if (this.flags & 0x000001) {\n this._procField('scheme_uri', 'string', -1);\n }\n};\n// ISO/IEC 14496-12:2012 - 8.6.4.1 sdtp box \nISOBox.prototype._boxProcessors['sdtp'] = function() {\n this._procFullBox();\n\n var sample_count = -1;\n if (this._parsing) {\n sample_count = (this._raw.byteLength - (this._cursor.offset - this._raw.byteOffset));\n }\n\n this._procFieldArray('sample_dependency_table', sample_count, 'uint', 8);\n};\n\n// ISO/IEC 14496-12:2012 - 8.16.3 Segment Index Box\nISOBox.prototype._boxProcessors['sidx'] = function() {\n this._procFullBox();\n this._procField('reference_ID', 'uint', 32);\n this._procField('timescale', 'uint', 32);\n this._procField('earliest_presentation_time', 'uint', (this.version == 1) ? 64 : 32);\n this._procField('first_offset', 'uint', (this.version == 1) ? 64 : 32);\n this._procField('reserved', 'uint', 16);\n this._procField('reference_count', 'uint', 16);\n this._procEntries('references', this.reference_count, function(entry) {\n if (!this._parsing) {\n entry.reference = (entry.reference_type & 0x00000001) << 31;\n entry.reference |= (entry.referenced_size & 0x7FFFFFFF);\n entry.sap = (entry.starts_with_SAP & 0x00000001) << 31;\n entry.sap |= (entry.SAP_type & 0x00000003) << 28;\n entry.sap |= (entry.SAP_delta_time & 0x0FFFFFFF);\n }\n this._procEntryField(entry, 'reference', 'uint', 32);\n this._procEntryField(entry, 'subsegment_duration', 'uint', 32);\n this._procEntryField(entry, 'sap', 'uint', 32);\n if (this._parsing) {\n entry.reference_type = (entry.reference >> 31) & 0x00000001;\n entry.referenced_size = entry.reference & 0x7FFFFFFF;\n entry.starts_with_SAP = (entry.sap >> 31) & 0x00000001;\n entry.SAP_type = (entry.sap >> 28) & 0x00000007;\n entry.SAP_delta_time = (entry.sap & 0x0FFFFFFF);\n }\n });\n};\n\n// ISO/IEC 14496-12:2012 - 8.4.5.3 Sound Media Header Box\nISOBox.prototype._boxProcessors['smhd'] = function() {\n this._procFullBox();\n this._procField('balance', 'uint', 16);\n this._procField('reserved', 'uint', 16);\n};\n\n// ISO/IEC 14496-12:2012 - 8.16.4 Subsegment Index Box\nISOBox.prototype._boxProcessors['ssix'] = function() {\n this._procFullBox();\n this._procField('subsegment_count', 'uint', 32);\n this._procEntries('subsegments', this.subsegment_count, function(subsegment) {\n this._procEntryField(subsegment, 'ranges_count', 'uint', 32);\n this._procSubEntries(subsegment, 'ranges', subsegment.ranges_count, function(range) {\n this._procEntryField(range, 'level', 'uint', 8);\n this._procEntryField(range, 'range_size', 'uint', 24);\n });\n });\n};\n\n// ISO/IEC 14496-12:2012 - 8.5.2 Sample Description Box\nISOBox.prototype._boxProcessors['stsd'] = function() {\n this._procFullBox();\n this._procField('entry_count', 'uint', 32);\n this._procSubBoxes('entries', this.entry_count);\n};\n\n// ISO/IEC 14496-30:2014 - WebVTT Cue Settings Box.\nISOBox.prototype._boxProcessors['sttg'] = function() {\n this._procField('settings', 'utf8');\n};\n\n// ISO/IEC 14496-12:2012 - 8.6.1.2 Decoding Time To Sample Box\nISOBox.prototype._boxProcessors['stts'] = function() {\n this._procFullBox();\n this._procField('entry_count', 'uint', 32);\n this._procEntries('entries', this.entry_count, function(entry) {\n this._procEntryField(entry, 'sample_count', 'uint', 32);\n this._procEntryField(entry, 'sample_delta', 'uint', 32);\n });\n};\n\n// ISO/IEC 14496-12:2015 - 8.7.7 Sub-Sample Information Box\nISOBox.prototype._boxProcessors['subs'] = function () {\n this._procFullBox();\n this._procField('entry_count', 'uint', 32);\n this._procEntries('entries', this.entry_count, function(entry) {\n this._procEntryField(entry, 'sample_delta', 'uint', 32);\n this._procEntryField(entry, 'subsample_count', 'uint', 16);\n this._procSubEntries(entry, 'subsamples', entry.subsample_count, function(subsample) {\n this._procEntryField(subsample, 'subsample_size', 'uint', (this.version === 1) ? 32 : 16);\n this._procEntryField(subsample, 'subsample_priority', 'uint', 8);\n this._procEntryField(subsample, 'discardable', 'uint', 8);\n this._procEntryField(subsample, 'codec_specific_parameters', 'uint', 32);\n });\n });\n};\n\n//ISO/IEC 23001-7:2011 - 8.2 Track Encryption Box\nISOBox.prototype._boxProcessors['tenc'] = function() {\n this._procFullBox();\n\n this._procField('default_IsEncrypted', 'uint', 24);\n this._procField('default_IV_size', 'uint', 8);\n this._procFieldArray('default_KID', 16, 'uint', 8);\n };\n\n// ISO/IEC 14496-12:2012 - 8.8.12 Track Fragmnent Decode Time\nISOBox.prototype._boxProcessors['tfdt'] = function() {\n this._procFullBox();\n this._procField('baseMediaDecodeTime', 'uint', (this.version == 1) ? 64 : 32);\n};\n\n// ISO/IEC 14496-12:2012 - 8.8.7 Track Fragment Header Box\nISOBox.prototype._boxProcessors['tfhd'] = function() {\n this._procFullBox();\n this._procField('track_ID', 'uint', 32);\n if (this.flags & 0x01) this._procField('base_data_offset', 'uint', 64);\n if (this.flags & 0x02) this._procField('sample_description_offset', 'uint', 32);\n if (this.flags & 0x08) this._procField('default_sample_duration', 'uint', 32);\n if (this.flags & 0x10) this._procField('default_sample_size', 'uint', 32);\n if (this.flags & 0x20) this._procField('default_sample_flags', 'uint', 32);\n};\n\n// ISO/IEC 14496-12:2012 - 8.8.10 Track Fragment Random Access Box\nISOBox.prototype._boxProcessors['tfra'] = function() {\n this._procFullBox();\n this._procField('track_ID', 'uint', 32);\n if (!this._parsing) {\n this.reserved = 0;\n this.reserved |= (this.length_size_of_traf_num & 0x00000030) << 4;\n this.reserved |= (this.length_size_of_trun_num & 0x0000000C) << 2;\n this.reserved |= (this.length_size_of_sample_num & 0x00000003);\n }\n this._procField('reserved', 'uint', 32);\n if (this._parsing) {\n this.length_size_of_traf_num = (this.reserved & 0x00000030) >> 4;\n this.length_size_of_trun_num = (this.reserved & 0x0000000C) >> 2;\n this.length_size_of_sample_num = (this.reserved & 0x00000003);\n }\n this._procField('number_of_entry', 'uint', 32);\n this._procEntries('entries', this.number_of_entry, function(entry) {\n this._procEntryField(entry, 'time', 'uint', (this.version === 1) ? 64 : 32);\n this._procEntryField(entry, 'moof_offset', 'uint', (this.version === 1) ? 64 : 32);\n this._procEntryField(entry, 'traf_number', 'uint', (this.length_size_of_traf_num + 1) * 8);\n this._procEntryField(entry, 'trun_number', 'uint', (this.length_size_of_trun_num + 1) * 8);\n this._procEntryField(entry, 'sample_number', 'uint', (this.length_size_of_sample_num + 1) * 8);\n });\n};\n\n// ISO/IEC 14496-12:2012 - 8.3.2 Track Header Box\nISOBox.prototype._boxProcessors['tkhd'] = function() {\n this._procFullBox();\n this._procField('creation_time', 'uint', (this.version == 1) ? 64 : 32);\n this._procField('modification_time', 'uint', (this.version == 1) ? 64 : 32);\n this._procField('track_ID', 'uint', 32);\n this._procField('reserved1', 'uint', 32);\n this._procField('duration', 'uint', (this.version == 1) ? 64 : 32);\n this._procFieldArray('reserved2', 2, 'uint', 32);\n this._procField('layer', 'uint', 16);\n this._procField('alternate_group', 'uint', 16);\n this._procField('volume', 'template', 16);\n this._procField('reserved3', 'uint', 16);\n this._procFieldArray('matrix', 9, 'template', 32);\n this._procField('width', 'template', 32);\n this._procField('height', 'template', 32);\n};\n\n// ISO/IEC 14496-12:2012 - 8.8.3 Track Extends Box\nISOBox.prototype._boxProcessors['trex'] = function() {\n this._procFullBox();\n this._procField('track_ID', 'uint', 32);\n this._procField('default_sample_description_index', 'uint', 32);\n this._procField('default_sample_duration', 'uint', 32);\n this._procField('default_sample_size', 'uint', 32);\n this._procField('default_sample_flags', 'uint', 32);\n};\n\n// ISO/IEC 14496-12:2012 - 8.8.8 Track Run Box\n// Note: the 'trun' box has a direct relation to the 'tfhd' box for defaults.\n// These defaults are not set explicitly here, but are left to resolve for the user.\nISOBox.prototype._boxProcessors['trun'] = function() {\n this._procFullBox();\n this._procField('sample_count', 'uint', 32);\n if (this.flags & 0x1) this._procField('data_offset', 'int', 32);\n if (this.flags & 0x4) this._procField('first_sample_flags', 'uint', 32);\n this._procEntries('samples', this.sample_count, function(sample) {\n if (this.flags & 0x100) this._procEntryField(sample, 'sample_duration', 'uint', 32);\n if (this.flags & 0x200) this._procEntryField(sample, 'sample_size', 'uint', 32);\n if (this.flags & 0x400) this._procEntryField(sample, 'sample_flags', 'uint', 32);\n if (this.flags & 0x800) this._procEntryField(sample, 'sample_composition_time_offset', (this.version === 1) ? 'int' : 'uint', 32);\n });\n};\n\n// ISO/IEC 14496-12:2012 - 8.7.2 Data Reference Box\nISOBox.prototype._boxProcessors['url '] = ISOBox.prototype._boxProcessors['urn '] = function() {\n this._procFullBox();\n if (this.type === 'urn ') {\n this._procField('name', 'string', -1);\n }\n this._procField('location', 'string', -1);\n};\n\n// ISO/IEC 14496-30:2014 - WebVTT Source Label Box\nISOBox.prototype._boxProcessors['vlab'] = function() {\n this._procField('source_label', 'utf8');\n};\n\n// ISO/IEC 14496-12:2012 - 8.4.5.2 Video Media Header Box\nISOBox.prototype._boxProcessors['vmhd'] = function() {\n this._procFullBox();\n this._procField('graphicsmode', 'uint', 16);\n this._procFieldArray('opcolor', 3, 'uint', 16);\n};\n\n// ISO/IEC 14496-30:2014 - WebVTT Configuration Box\nISOBox.prototype._boxProcessors['vttC'] = function() {\n this._procField('config', 'utf8');\n};\n\n// ISO/IEC 14496-30:2014 - WebVTT Empty Sample Box\nISOBox.prototype._boxProcessors['vtte'] = function() {\n // Nothing should happen here.\n};\n","// This file can be required in Browserify and Node.js for automatic polyfill\n// To use it: require('es6-promise/auto');\n'use strict';\nmodule.exports = require('./').polyfill();\n","/*!\n * @overview es6-promise - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)\n * @license Licensed under MIT license\n * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE\n * @version v4.2.8+1e68dce6\n */\n\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.ES6Promise = factory());\n}(this, (function () { 'use strict';\n\nfunction objectOrFunction(x) {\n var type = typeof x;\n return x !== null && (type === 'object' || type === 'function');\n}\n\nfunction isFunction(x) {\n return typeof x === 'function';\n}\n\n\n\nvar _isArray = void 0;\nif (Array.isArray) {\n _isArray = Array.isArray;\n} else {\n _isArray = function (x) {\n return Object.prototype.toString.call(x) === '[object Array]';\n };\n}\n\nvar isArray = _isArray;\n\nvar len = 0;\nvar vertxNext = void 0;\nvar customSchedulerFn = void 0;\n\nvar asap = function asap(callback, arg) {\n queue[len] = callback;\n queue[len + 1] = arg;\n len += 2;\n if (len === 2) {\n // If len is 2, that means that we need to schedule an async flush.\n // If additional callbacks are queued before the queue is flushed, they\n // will be processed by this flush that we are scheduling.\n if (customSchedulerFn) {\n customSchedulerFn(flush);\n } else {\n scheduleFlush();\n }\n }\n};\n\nfunction setScheduler(scheduleFn) {\n customSchedulerFn = scheduleFn;\n}\n\nfunction setAsap(asapFn) {\n asap = asapFn;\n}\n\nvar browserWindow = typeof window !== 'undefined' ? window : undefined;\nvar browserGlobal = browserWindow || {};\nvar BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\nvar isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n// test for web worker but not in IE10\nvar isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';\n\n// node\nfunction useNextTick() {\n // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n // see https://github.com/cujojs/when/issues/410 for details\n return function () {\n return process.nextTick(flush);\n };\n}\n\n// vertx\nfunction useVertxTimer() {\n if (typeof vertxNext !== 'undefined') {\n return function () {\n vertxNext(flush);\n };\n }\n\n return useSetTimeout();\n}\n\nfunction useMutationObserver() {\n var iterations = 0;\n var observer = new BrowserMutationObserver(flush);\n var node = document.createTextNode('');\n observer.observe(node, { characterData: true });\n\n return function () {\n node.data = iterations = ++iterations % 2;\n };\n}\n\n// web worker\nfunction useMessageChannel() {\n var channel = new MessageChannel();\n channel.port1.onmessage = flush;\n return function () {\n return channel.port2.postMessage(0);\n };\n}\n\nfunction useSetTimeout() {\n // Store setTimeout reference so es6-promise will be unaffected by\n // other code modifying setTimeout (like sinon.useFakeTimers())\n var globalSetTimeout = setTimeout;\n return function () {\n return globalSetTimeout(flush, 1);\n };\n}\n\nvar queue = new Array(1000);\nfunction flush() {\n for (var i = 0; i < len; i += 2) {\n var callback = queue[i];\n var arg = queue[i + 1];\n\n callback(arg);\n\n queue[i] = undefined;\n queue[i + 1] = undefined;\n }\n\n len = 0;\n}\n\nfunction attemptVertx() {\n try {\n var vertx = Function('return this')().require('vertx');\n vertxNext = vertx.runOnLoop || vertx.runOnContext;\n return useVertxTimer();\n } catch (e) {\n return useSetTimeout();\n }\n}\n\nvar scheduleFlush = void 0;\n// Decide what async method to use to triggering processing of queued callbacks:\nif (isNode) {\n scheduleFlush = useNextTick();\n} else if (BrowserMutationObserver) {\n scheduleFlush = useMutationObserver();\n} else if (isWorker) {\n scheduleFlush = useMessageChannel();\n} else if (browserWindow === undefined && typeof require === 'function') {\n scheduleFlush = attemptVertx();\n} else {\n scheduleFlush = useSetTimeout();\n}\n\nfunction then(onFulfillment, onRejection) {\n var parent = this;\n\n var child = new this.constructor(noop);\n\n if (child[PROMISE_ID] === undefined) {\n makePromise(child);\n }\n\n var _state = parent._state;\n\n\n if (_state) {\n var callback = arguments[_state - 1];\n asap(function () {\n return invokeCallback(_state, child, callback, parent._result);\n });\n } else {\n subscribe(parent, child, onFulfillment, onRejection);\n }\n\n return child;\n}\n\n/**\n `Promise.resolve` returns a promise that will become resolved with the\n passed `value`. It is shorthand for the following:\n\n ```javascript\n let promise = new Promise(function(resolve, reject){\n resolve(1);\n });\n\n promise.then(function(value){\n // value === 1\n });\n ```\n\n Instead of writing the above, your code now simply becomes the following:\n\n ```javascript\n let promise = Promise.resolve(1);\n\n promise.then(function(value){\n // value === 1\n });\n ```\n\n @method resolve\n @static\n @param {Any} value value that the returned promise will be resolved with\n Useful for tooling.\n @return {Promise} a promise that will become fulfilled with the given\n `value`\n*/\nfunction resolve$1(object) {\n /*jshint validthis:true */\n var Constructor = this;\n\n if (object && typeof object === 'object' && object.constructor === Constructor) {\n return object;\n }\n\n var promise = new Constructor(noop);\n resolve(promise, object);\n return promise;\n}\n\nvar PROMISE_ID = Math.random().toString(36).substring(2);\n\nfunction noop() {}\n\nvar PENDING = void 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\n\nfunction selfFulfillment() {\n return new TypeError(\"You cannot resolve a promise with itself\");\n}\n\nfunction cannotReturnOwn() {\n return new TypeError('A promises callback cannot return that same promise.');\n}\n\nfunction tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) {\n try {\n then$$1.call(value, fulfillmentHandler, rejectionHandler);\n } catch (e) {\n return e;\n }\n}\n\nfunction handleForeignThenable(promise, thenable, then$$1) {\n asap(function (promise) {\n var sealed = false;\n var error = tryThen(then$$1, thenable, function (value) {\n if (sealed) {\n return;\n }\n sealed = true;\n if (thenable !== value) {\n resolve(promise, value);\n } else {\n fulfill(promise, value);\n }\n }, function (reason) {\n if (sealed) {\n return;\n }\n sealed = true;\n\n reject(promise, reason);\n }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n if (!sealed && error) {\n sealed = true;\n reject(promise, error);\n }\n }, promise);\n}\n\nfunction handleOwnThenable(promise, thenable) {\n if (thenable._state === FULFILLED) {\n fulfill(promise, thenable._result);\n } else if (thenable._state === REJECTED) {\n reject(promise, thenable._result);\n } else {\n subscribe(thenable, undefined, function (value) {\n return resolve(promise, value);\n }, function (reason) {\n return reject(promise, reason);\n });\n }\n}\n\nfunction handleMaybeThenable(promise, maybeThenable, then$$1) {\n if (maybeThenable.constructor === promise.constructor && then$$1 === then && maybeThenable.constructor.resolve === resolve$1) {\n handleOwnThenable(promise, maybeThenable);\n } else {\n if (then$$1 === undefined) {\n fulfill(promise, maybeThenable);\n } else if (isFunction(then$$1)) {\n handleForeignThenable(promise, maybeThenable, then$$1);\n } else {\n fulfill(promise, maybeThenable);\n }\n }\n}\n\nfunction resolve(promise, value) {\n if (promise === value) {\n reject(promise, selfFulfillment());\n } else if (objectOrFunction(value)) {\n var then$$1 = void 0;\n try {\n then$$1 = value.then;\n } catch (error) {\n reject(promise, error);\n return;\n }\n handleMaybeThenable(promise, value, then$$1);\n } else {\n fulfill(promise, value);\n }\n}\n\nfunction publishRejection(promise) {\n if (promise._onerror) {\n promise._onerror(promise._result);\n }\n\n publish(promise);\n}\n\nfunction fulfill(promise, value) {\n if (promise._state !== PENDING) {\n return;\n }\n\n promise._result = value;\n promise._state = FULFILLED;\n\n if (promise._subscribers.length !== 0) {\n asap(publish, promise);\n }\n}\n\nfunction reject(promise, reason) {\n if (promise._state !== PENDING) {\n return;\n }\n promise._state = REJECTED;\n promise._result = reason;\n\n asap(publishRejection, promise);\n}\n\nfunction subscribe(parent, child, onFulfillment, onRejection) {\n var _subscribers = parent._subscribers;\n var length = _subscribers.length;\n\n\n parent._onerror = null;\n\n _subscribers[length] = child;\n _subscribers[length + FULFILLED] = onFulfillment;\n _subscribers[length + REJECTED] = onRejection;\n\n if (length === 0 && parent._state) {\n asap(publish, parent);\n }\n}\n\nfunction publish(promise) {\n var subscribers = promise._subscribers;\n var settled = promise._state;\n\n if (subscribers.length === 0) {\n return;\n }\n\n var child = void 0,\n callback = void 0,\n detail = promise._result;\n\n for (var i = 0; i < subscribers.length; i += 3) {\n child = subscribers[i];\n callback = subscribers[i + settled];\n\n if (child) {\n invokeCallback(settled, child, callback, detail);\n } else {\n callback(detail);\n }\n }\n\n promise._subscribers.length = 0;\n}\n\nfunction invokeCallback(settled, promise, callback, detail) {\n var hasCallback = isFunction(callback),\n value = void 0,\n error = void 0,\n succeeded = true;\n\n if (hasCallback) {\n try {\n value = callback(detail);\n } catch (e) {\n succeeded = false;\n error = e;\n }\n\n if (promise === value) {\n reject(promise, cannotReturnOwn());\n return;\n }\n } else {\n value = detail;\n }\n\n if (promise._state !== PENDING) {\n // noop\n } else if (hasCallback && succeeded) {\n resolve(promise, value);\n } else if (succeeded === false) {\n reject(promise, error);\n } else if (settled === FULFILLED) {\n fulfill(promise, value);\n } else if (settled === REJECTED) {\n reject(promise, value);\n }\n}\n\nfunction initializePromise(promise, resolver) {\n try {\n resolver(function resolvePromise(value) {\n resolve(promise, value);\n }, function rejectPromise(reason) {\n reject(promise, reason);\n });\n } catch (e) {\n reject(promise, e);\n }\n}\n\nvar id = 0;\nfunction nextId() {\n return id++;\n}\n\nfunction makePromise(promise) {\n promise[PROMISE_ID] = id++;\n promise._state = undefined;\n promise._result = undefined;\n promise._subscribers = [];\n}\n\nfunction validationError() {\n return new Error('Array Methods must be provided an Array');\n}\n\nvar Enumerator = function () {\n function Enumerator(Constructor, input) {\n this._instanceConstructor = Constructor;\n this.promise = new Constructor(noop);\n\n if (!this.promise[PROMISE_ID]) {\n makePromise(this.promise);\n }\n\n if (isArray(input)) {\n this.length = input.length;\n this._remaining = input.length;\n\n this._result = new Array(this.length);\n\n if (this.length === 0) {\n fulfill(this.promise, this._result);\n } else {\n this.length = this.length || 0;\n this._enumerate(input);\n if (this._remaining === 0) {\n fulfill(this.promise, this._result);\n }\n }\n } else {\n reject(this.promise, validationError());\n }\n }\n\n Enumerator.prototype._enumerate = function _enumerate(input) {\n for (var i = 0; this._state === PENDING && i < input.length; i++) {\n this._eachEntry(input[i], i);\n }\n };\n\n Enumerator.prototype._eachEntry = function _eachEntry(entry, i) {\n var c = this._instanceConstructor;\n var resolve$$1 = c.resolve;\n\n\n if (resolve$$1 === resolve$1) {\n var _then = void 0;\n var error = void 0;\n var didError = false;\n try {\n _then = entry.then;\n } catch (e) {\n didError = true;\n error = e;\n }\n\n if (_then === then && entry._state !== PENDING) {\n this._settledAt(entry._state, i, entry._result);\n } else if (typeof _then !== 'function') {\n this._remaining--;\n this._result[i] = entry;\n } else if (c === Promise$1) {\n var promise = new c(noop);\n if (didError) {\n reject(promise, error);\n } else {\n handleMaybeThenable(promise, entry, _then);\n }\n this._willSettleAt(promise, i);\n } else {\n this._willSettleAt(new c(function (resolve$$1) {\n return resolve$$1(entry);\n }), i);\n }\n } else {\n this._willSettleAt(resolve$$1(entry), i);\n }\n };\n\n Enumerator.prototype._settledAt = function _settledAt(state, i, value) {\n var promise = this.promise;\n\n\n if (promise._state === PENDING) {\n this._remaining--;\n\n if (state === REJECTED) {\n reject(promise, value);\n } else {\n this._result[i] = value;\n }\n }\n\n if (this._remaining === 0) {\n fulfill(promise, this._result);\n }\n };\n\n Enumerator.prototype._willSettleAt = function _willSettleAt(promise, i) {\n var enumerator = this;\n\n subscribe(promise, undefined, function (value) {\n return enumerator._settledAt(FULFILLED, i, value);\n }, function (reason) {\n return enumerator._settledAt(REJECTED, i, reason);\n });\n };\n\n return Enumerator;\n}();\n\n/**\n `Promise.all` accepts an array of promises, and returns a new promise which\n is fulfilled with an array of fulfillment values for the passed promises, or\n rejected with the reason of the first passed promise to be rejected. It casts all\n elements of the passed iterable to promises as it runs this algorithm.\n\n Example:\n\n ```javascript\n let promise1 = resolve(1);\n let promise2 = resolve(2);\n let promise3 = resolve(3);\n let promises = [ promise1, promise2, promise3 ];\n\n Promise.all(promises).then(function(array){\n // The array here would be [ 1, 2, 3 ];\n });\n ```\n\n If any of the `promises` given to `all` are rejected, the first promise\n that is rejected will be given as an argument to the returned promises's\n rejection handler. For example:\n\n Example:\n\n ```javascript\n let promise1 = resolve(1);\n let promise2 = reject(new Error(\"2\"));\n let promise3 = reject(new Error(\"3\"));\n let promises = [ promise1, promise2, promise3 ];\n\n Promise.all(promises).then(function(array){\n // Code here never runs because there are rejected promises!\n }, function(error) {\n // error.message === \"2\"\n });\n ```\n\n @method all\n @static\n @param {Array} entries array of promises\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled when all `promises` have been\n fulfilled, or rejected if any of them become rejected.\n @static\n*/\nfunction all(entries) {\n return new Enumerator(this, entries).promise;\n}\n\n/**\n `Promise.race` returns a new promise which is settled in the same way as the\n first passed promise to settle.\n\n Example:\n\n ```javascript\n let promise1 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n\n let promise2 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 2');\n }, 100);\n });\n\n Promise.race([promise1, promise2]).then(function(result){\n // result === 'promise 2' because it was resolved before promise1\n // was resolved.\n });\n ```\n\n `Promise.race` is deterministic in that only the state of the first\n settled promise matters. For example, even if other promises given to the\n `promises` array argument are resolved, but the first settled promise has\n become rejected before the other promises became fulfilled, the returned\n promise will become rejected:\n\n ```javascript\n let promise1 = new Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n\n let promise2 = new Promise(function(resolve, reject){\n setTimeout(function(){\n reject(new Error('promise 2'));\n }, 100);\n });\n\n Promise.race([promise1, promise2]).then(function(result){\n // Code here never runs\n }, function(reason){\n // reason.message === 'promise 2' because promise 2 became rejected before\n // promise 1 became fulfilled\n });\n ```\n\n An example real-world use case is implementing timeouts:\n\n ```javascript\n Promise.race([ajax('foo.json'), timeout(5000)])\n ```\n\n @method race\n @static\n @param {Array} promises array of promises to observe\n Useful for tooling.\n @return {Promise} a promise which settles in the same way as the first passed\n promise to settle.\n*/\nfunction race(entries) {\n /*jshint validthis:true */\n var Constructor = this;\n\n if (!isArray(entries)) {\n return new Constructor(function (_, reject) {\n return reject(new TypeError('You must pass an array to race.'));\n });\n } else {\n return new Constructor(function (resolve, reject) {\n var length = entries.length;\n for (var i = 0; i < length; i++) {\n Constructor.resolve(entries[i]).then(resolve, reject);\n }\n });\n }\n}\n\n/**\n `Promise.reject` returns a promise rejected with the passed `reason`.\n It is shorthand for the following:\n\n ```javascript\n let promise = new Promise(function(resolve, reject){\n reject(new Error('WHOOPS'));\n });\n\n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n\n Instead of writing the above, your code now simply becomes the following:\n\n ```javascript\n let promise = Promise.reject(new Error('WHOOPS'));\n\n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n\n @method reject\n @static\n @param {Any} reason value that the returned promise will be rejected with.\n Useful for tooling.\n @return {Promise} a promise rejected with the given `reason`.\n*/\nfunction reject$1(reason) {\n /*jshint validthis:true */\n var Constructor = this;\n var promise = new Constructor(noop);\n reject(promise, reason);\n return promise;\n}\n\nfunction needsResolver() {\n throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n}\n\nfunction needsNew() {\n throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n}\n\n/**\n Promise objects represent the eventual result of an asynchronous operation. The\n primary way of interacting with a promise is through its `then` method, which\n registers callbacks to receive either a promise's eventual value or the reason\n why the promise cannot be fulfilled.\n\n Terminology\n -----------\n\n - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n - `thenable` is an object or function that defines a `then` method.\n - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n - `exception` is a value that is thrown using the throw statement.\n - `reason` is a value that indicates why a promise was rejected.\n - `settled` the final resting state of a promise, fulfilled or rejected.\n\n A promise can be in one of three states: pending, fulfilled, or rejected.\n\n Promises that are fulfilled have a fulfillment value and are in the fulfilled\n state. Promises that are rejected have a rejection reason and are in the\n rejected state. A fulfillment value is never a thenable.\n\n Promises can also be said to *resolve* a value. If this value is also a\n promise, then the original promise's settled state will match the value's\n settled state. So a promise that *resolves* a promise that rejects will\n itself reject, and a promise that *resolves* a promise that fulfills will\n itself fulfill.\n\n\n Basic Usage:\n ------------\n\n ```js\n let promise = new Promise(function(resolve, reject) {\n // on success\n resolve(value);\n\n // on failure\n reject(reason);\n });\n\n promise.then(function(value) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Advanced Usage:\n ---------------\n\n Promises shine when abstracting away asynchronous interactions such as\n `XMLHttpRequest`s.\n\n ```js\n function getJSON(url) {\n return new Promise(function(resolve, reject){\n let xhr = new XMLHttpRequest();\n\n xhr.open('GET', url);\n xhr.onreadystatechange = handler;\n xhr.responseType = 'json';\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.send();\n\n function handler() {\n if (this.readyState === this.DONE) {\n if (this.status === 200) {\n resolve(this.response);\n } else {\n reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n }\n }\n };\n });\n }\n\n getJSON('/posts.json').then(function(json) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n\n Unlike callbacks, promises are great composable primitives.\n\n ```js\n Promise.all([\n getJSON('/posts'),\n getJSON('/comments')\n ]).then(function(values){\n values[0] // => postsJSON\n values[1] // => commentsJSON\n\n return values;\n });\n ```\n\n @class Promise\n @param {Function} resolver\n Useful for tooling.\n @constructor\n*/\n\nvar Promise$1 = function () {\n function Promise(resolver) {\n this[PROMISE_ID] = nextId();\n this._result = this._state = undefined;\n this._subscribers = [];\n\n if (noop !== resolver) {\n typeof resolver !== 'function' && needsResolver();\n this instanceof Promise ? initializePromise(this, resolver) : needsNew();\n }\n }\n\n /**\n The primary way of interacting with a promise is through its `then` method,\n which registers callbacks to receive either a promise's eventual value or the\n reason why the promise cannot be fulfilled.\n ```js\n findUser().then(function(user){\n // user is available\n }, function(reason){\n // user is unavailable, and you are given the reason why\n });\n ```\n Chaining\n --------\n The return value of `then` is itself a promise. This second, 'downstream'\n promise is resolved with the return value of the first promise's fulfillment\n or rejection handler, or rejected if the handler throws an exception.\n ```js\n findUser().then(function (user) {\n return user.name;\n }, function (reason) {\n return 'default name';\n }).then(function (userName) {\n // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n // will be `'default name'`\n });\n findUser().then(function (user) {\n throw new Error('Found user, but still unhappy');\n }, function (reason) {\n throw new Error('`findUser` rejected and we're unhappy');\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.\n });\n ```\n If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n ```js\n findUser().then(function (user) {\n throw new PedagogicalException('Upstream error');\n }).then(function (value) {\n // never reached\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // The `PedgagocialException` is propagated all the way down to here\n });\n ```\n Assimilation\n ------------\n Sometimes the value you want to propagate to a downstream promise can only be\n retrieved asynchronously. This can be achieved by returning a promise in the\n fulfillment or rejection handler. The downstream promise will then be pending\n until the returned promise is settled. This is called *assimilation*.\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // The user's comments are now available\n });\n ```\n If the assimliated promise rejects, then the downstream promise will also reject.\n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // If `findCommentsByAuthor` fulfills, we'll have the value here\n }, function (reason) {\n // If `findCommentsByAuthor` rejects, we'll have the reason here\n });\n ```\n Simple Example\n --------------\n Synchronous Example\n ```javascript\n let result;\n try {\n result = findResult();\n // success\n } catch(reason) {\n // failure\n }\n ```\n Errback Example\n ```js\n findResult(function(result, err){\n if (err) {\n // failure\n } else {\n // success\n }\n });\n ```\n Promise Example;\n ```javascript\n findResult().then(function(result){\n // success\n }, function(reason){\n // failure\n });\n ```\n Advanced Example\n --------------\n Synchronous Example\n ```javascript\n let author, books;\n try {\n author = findAuthor();\n books = findBooksByAuthor(author);\n // success\n } catch(reason) {\n // failure\n }\n ```\n Errback Example\n ```js\n function foundBooks(books) {\n }\n function failure(reason) {\n }\n findAuthor(function(author, err){\n if (err) {\n failure(err);\n // failure\n } else {\n try {\n findBoooksByAuthor(author, function(books, err) {\n if (err) {\n failure(err);\n } else {\n try {\n foundBooks(books);\n } catch(reason) {\n failure(reason);\n }\n }\n });\n } catch(error) {\n failure(err);\n }\n // success\n }\n });\n ```\n Promise Example;\n ```javascript\n findAuthor().\n then(findBooksByAuthor).\n then(function(books){\n // found books\n }).catch(function(reason){\n // something went wrong\n });\n ```\n @method then\n @param {Function} onFulfilled\n @param {Function} onRejected\n Useful for tooling.\n @return {Promise}\n */\n\n /**\n `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n as the catch block of a try/catch statement.\n ```js\n function findAuthor(){\n throw new Error('couldn't find that author');\n }\n // synchronous\n try {\n findAuthor();\n } catch(reason) {\n // something went wrong\n }\n // async with promises\n findAuthor().catch(function(reason){\n // something went wrong\n });\n ```\n @method catch\n @param {Function} onRejection\n Useful for tooling.\n @return {Promise}\n */\n\n\n Promise.prototype.catch = function _catch(onRejection) {\n return this.then(null, onRejection);\n };\n\n /**\n `finally` will be invoked regardless of the promise's fate just as native\n try/catch/finally behaves\n \n Synchronous example:\n \n ```js\n findAuthor() {\n if (Math.random() > 0.5) {\n throw new Error();\n }\n return new Author();\n }\n \n try {\n return findAuthor(); // succeed or fail\n } catch(error) {\n return findOtherAuther();\n } finally {\n // always runs\n // doesn't affect the return value\n }\n ```\n \n Asynchronous example:\n \n ```js\n findAuthor().catch(function(reason){\n return findOtherAuther();\n }).finally(function(){\n // author was either found, or not\n });\n ```\n \n @method finally\n @param {Function} callback\n @return {Promise}\n */\n\n\n Promise.prototype.finally = function _finally(callback) {\n var promise = this;\n var constructor = promise.constructor;\n\n if (isFunction(callback)) {\n return promise.then(function (value) {\n return constructor.resolve(callback()).then(function () {\n return value;\n });\n }, function (reason) {\n return constructor.resolve(callback()).then(function () {\n throw reason;\n });\n });\n }\n\n return promise.then(callback, callback);\n };\n\n return Promise;\n}();\n\nPromise$1.prototype.then = then;\nPromise$1.all = all;\nPromise$1.race = race;\nPromise$1.resolve = resolve$1;\nPromise$1.reject = reject$1;\nPromise$1._setScheduler = setScheduler;\nPromise$1._setAsap = setAsap;\nPromise$1._asap = asap;\n\n/*global self*/\nfunction polyfill() {\n var local = void 0;\n\n if (typeof global !== 'undefined') {\n local = global;\n } else if (typeof self !== 'undefined') {\n local = self;\n } else {\n try {\n local = Function('return this')();\n } catch (e) {\n throw new Error('polyfill failed because global object is unavailable in this environment');\n }\n }\n\n var P = local.Promise;\n\n if (P) {\n var promiseToString = null;\n try {\n promiseToString = Object.prototype.toString.call(P.resolve());\n } catch (e) {\n // silently ignored\n }\n\n if (promiseToString === '[object Promise]' && !P.cast) {\n return;\n }\n }\n\n local.Promise = Promise$1;\n}\n\n// Strange compat..\nPromise$1.polyfill = polyfill;\nPromise$1.Promise = Promise$1;\n\nreturn Promise$1;\n\n})));\n\n\n\n//# sourceMappingURL=es6-promise.map\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n ? R.apply\n : function ReflectApply(target, receiver, args) {\n return Function.prototype.apply.call(target, receiver, args);\n }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target)\n .concat(Object.getOwnPropertySymbols(target));\n };\n} else {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target);\n };\n}\n\nfunction ProcessEmitWarning(warning) {\n if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n return value !== value;\n}\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n enumerable: true,\n get: function() {\n return defaultMaxListeners;\n },\n set: function(arg) {\n if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n }\n defaultMaxListeners = arg;\n }\n});\n\nEventEmitter.init = function() {\n\n if (this._events === undefined ||\n this._events === Object.getPrototypeOf(this)._events) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n }\n this._maxListeners = n;\n return this;\n};\n\nfunction _getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n var args = [];\n for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n var doError = (type === 'error');\n\n var events = this._events;\n if (events !== undefined)\n doError = (doError && events.error === undefined);\n else if (!doError)\n return false;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n var er;\n if (args.length > 0)\n er = args[0];\n if (er instanceof Error) {\n // Note: The comments on the `throw` lines are intentional, they show\n // up in Node's output if this results in an unhandled exception.\n throw er; // Unhandled 'error' event\n }\n // At least give some kind of context to the user\n var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n err.context = er;\n throw err; // Unhandled 'error' event\n }\n\n var handler = events[type];\n\n if (handler === undefined)\n return false;\n\n if (typeof handler === 'function') {\n ReflectApply(handler, this, args);\n } else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n ReflectApply(listeners[i], this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n checkListener(listener);\n\n events = target._events;\n if (events === undefined) {\n events = target._events = Object.create(null);\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener !== undefined) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (existing === undefined) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] =\n prepend ? [listener, existing] : [existing, listener];\n // If we've already got an array, just append.\n } else if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n\n // Check for listener leak\n m = _getMaxListeners(target);\n if (m > 0 && existing.length > m && !existing.warned) {\n existing.warned = true;\n // No error code for this since it is a Warning\n // eslint-disable-next-line no-restricted-syntax\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + String(type) + ' listeners ' +\n 'added. Use emitter.setMaxListeners() to ' +\n 'increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n ProcessEmitWarning(w);\n }\n }\n\n return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction onceWrapper() {\n if (!this.fired) {\n this.target.removeListener(this.type, this.wrapFn);\n this.fired = true;\n if (arguments.length === 0)\n return this.listener.call(this.target);\n return this.listener.apply(this.target, arguments);\n }\n}\n\nfunction _onceWrap(target, type, listener) {\n var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n var wrapped = onceWrapper.bind(state);\n wrapped.listener = listener;\n state.wrapFn = wrapped;\n return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n checkListener(listener);\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n checkListener(listener);\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n checkListener(listener);\n\n events = this._events;\n if (events === undefined)\n return this;\n\n list = events[type];\n if (list === undefined)\n return this;\n\n if (list === listener || list.listener === listener) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length - 1; i >= 0; i--) {\n if (list[i] === listener || list[i].listener === listener) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (position === 0)\n list.shift();\n else {\n spliceOne(list, position);\n }\n\n if (list.length === 1)\n events[type] = list[0];\n\n if (events.removeListener !== undefined)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events, i;\n\n events = this._events;\n if (events === undefined)\n return this;\n\n // not listening for removeListener, no need to emit\n if (events.removeListener === undefined) {\n if (arguments.length === 0) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n } else if (events[type] !== undefined) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n var key;\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = Object.create(null);\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners !== undefined) {\n // LIFO order\n for (i = listeners.length - 1; i >= 0; i--) {\n this.removeListener(type, listeners[i]);\n }\n }\n\n return this;\n };\n\nfunction _listeners(target, type, unwrap) {\n var events = target._events;\n\n if (events === undefined)\n return [];\n\n var evlistener = events[type];\n if (evlistener === undefined)\n return [];\n\n if (typeof evlistener === 'function')\n return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n return unwrap ?\n unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events !== undefined) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener !== undefined) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n var copy = new Array(n);\n for (var i = 0; i < n; ++i)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction spliceOne(list, index) {\n for (; index + 1 < list.length; index++)\n list[index] = list[index + 1];\n list.pop();\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n\nfunction once(emitter, name) {\n return new Promise(function (resolve, reject) {\n function errorListener(err) {\n emitter.removeListener(name, resolver);\n reject(err);\n }\n\n function resolver() {\n if (typeof emitter.removeListener === 'function') {\n emitter.removeListener('error', errorListener);\n }\n resolve([].slice.call(arguments));\n };\n\n eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });\n if (name !== 'error') {\n addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });\n }\n });\n}\n\nfunction addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n if (typeof emitter.on === 'function') {\n eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n }\n}\n\nfunction eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n if (typeof emitter.on === 'function') {\n if (flags.once) {\n emitter.once(name, listener);\n } else {\n emitter.on(name, listener);\n }\n } else if (typeof emitter.addEventListener === 'function') {\n // EventTarget does not have `error` event semantics like Node\n // EventEmitters, we do not listen for `error` events here.\n emitter.addEventListener(name, function wrapListener(arg) {\n // IE does not have builtin `{ once: true }` support so we\n // have to do it manually.\n if (flags.once) {\n emitter.removeEventListener(name, wrapListener);\n }\n listener(arg);\n });\n } else {\n throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\n }\n}\n","'use strict';\n\nvar isArray = Array.isArray;\nvar keyList = Object.keys;\nvar hasProp = Object.prototype.hasOwnProperty;\n\nmodule.exports = function equal(a, b) {\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n var arrA = isArray(a)\n , arrB = isArray(b)\n , i\n , length\n , key;\n\n if (arrA && arrB) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (!equal(a[i], b[i])) return false;\n return true;\n }\n\n if (arrA != arrB) return false;\n\n var dateA = a instanceof Date\n , dateB = b instanceof Date;\n if (dateA != dateB) return false;\n if (dateA && dateB) return a.getTime() == b.getTime();\n\n var regexpA = a instanceof RegExp\n , regexpB = b instanceof RegExp;\n if (regexpA != regexpB) return false;\n if (regexpA && regexpB) return a.toString() == b.toString();\n\n var keys = keyList(a);\n length = keys.length;\n\n if (length !== keyList(b).length)\n return false;\n\n for (i = length; i-- !== 0;)\n if (!hasProp.call(b, keys[i])) return false;\n\n for (i = length; i-- !== 0;) {\n key = keys[i];\n if (!equal(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n return a!==a && b!==b;\n};\n","/* \r\n * Copyright (c) 2016, Pierre-Anthony Lemieux <pal@sandflow.com>\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions are met:\r\n *\r\n * * Redistributions of source code must retain the above copyright notice, this\r\n * list of conditions and the following disclaimer.\r\n * * Redistributions in binary form must reproduce the above copyright notice,\r\n * this list of conditions and the following disclaimer in the documentation\r\n * and/or other materials provided with the distribution.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\r\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\r\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r\n * POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n\r\n/**\r\n * @module imscDoc\r\n */\r\n\r\n;\r\n(function (imscDoc, sax, imscNames, imscStyles, imscUtils) {\r\n\r\n\r\n /**\r\n * Allows a client to provide callbacks to handle children of the <metadata> element\r\n * @typedef {Object} MetadataHandler\r\n * @property {?OpenTagCallBack} onOpenTag\r\n * @property {?CloseTagCallBack} onCloseTag\r\n * @property {?TextCallBack} onText\r\n */\r\n\r\n /**\r\n * Called when the opening tag of an element node is encountered.\r\n * @callback OpenTagCallBack\r\n * @param {string} ns Namespace URI of the element\r\n * @param {string} name Local name of the element\r\n * @param {Object[]} attributes List of attributes, each consisting of a\r\n * `uri`, `name` and `value`\r\n */\r\n\r\n /**\r\n * Called when the closing tag of an element node is encountered.\r\n * @callback CloseTagCallBack\r\n */\r\n\r\n /**\r\n * Called when a text node is encountered.\r\n * @callback TextCallBack\r\n * @param {string} contents Contents of the text node\r\n */\r\n\r\n /**\r\n * Parses an IMSC1 document into an opaque in-memory representation that exposes\r\n * a single method <pre>getMediaTimeEvents()</pre> that returns a list of time\r\n * offsets (in seconds) of the ISD, i.e. the points in time where the visual\r\n * representation of the document change. `metadataHandler` allows the caller to\r\n * be called back when nodes are present in <metadata> elements. \r\n * \r\n * @param {string} xmlstring XML document\r\n * @param {?module:imscUtils.ErrorHandler} errorHandler Error callback\r\n * @param {?MetadataHandler} metadataHandler Callback for <Metadata> elements\r\n * @returns {Object} Opaque in-memory representation of an IMSC1 document\r\n */\r\n\r\n imscDoc.fromXML = function (xmlstring, errorHandler, metadataHandler) {\r\n var p = sax.parser(true, {xmlns: true});\r\n var estack = [];\r\n var xmllangstack = [];\r\n var xmlspacestack = [];\r\n var metadata_depth = 0;\r\n var doc = null;\r\n\r\n p.onclosetag = function (node) {\r\n\r\n \r\n if (estack[0] instanceof Region) {\r\n\r\n /* merge referenced styles */\r\n\r\n if (doc.head !== null && doc.head.styling !== null) {\r\n mergeReferencedStyles(doc.head.styling, estack[0].styleRefs, estack[0].styleAttrs, errorHandler);\r\n }\r\n\r\n delete estack[0].styleRefs;\r\n\r\n } else if (estack[0] instanceof Styling) {\r\n\r\n /* flatten chained referential styling */\r\n\r\n for (var sid in estack[0].styles) {\r\n\r\n if (! estack[0].styles.hasOwnProperty(sid)) continue;\r\n\r\n mergeChainedStyles(estack[0], estack[0].styles[sid], errorHandler);\r\n\r\n }\r\n\r\n } else if (estack[0] instanceof P || estack[0] instanceof Span) {\r\n\r\n /* merge anonymous spans */\r\n\r\n if (estack[0].contents.length > 1) {\r\n\r\n var cs = [estack[0].contents[0]];\r\n\r\n var c;\r\n\r\n for (c = 1; c < estack[0].contents.length; c++) {\r\n\r\n if (estack[0].contents[c] instanceof AnonymousSpan &&\r\n cs[cs.length - 1] instanceof AnonymousSpan) {\r\n\r\n cs[cs.length - 1].text += estack[0].contents[c].text;\r\n\r\n } else {\r\n\r\n cs.push(estack[0].contents[c]);\r\n\r\n }\r\n\r\n }\r\n\r\n estack[0].contents = cs;\r\n\r\n }\r\n\r\n // remove redundant nested anonymous spans (9.3.3(1)(c))\r\n\r\n if (estack[0] instanceof Span &&\r\n estack[0].contents.length === 1 &&\r\n estack[0].contents[0] instanceof AnonymousSpan) {\r\n\r\n estack[0].text = estack[0].contents[0].text;\r\n delete estack[0].contents;\r\n\r\n }\r\n\r\n } else if (estack[0] instanceof ForeignElement) {\r\n\r\n if (estack[0].node.uri === imscNames.ns_tt &&\r\n estack[0].node.local === 'metadata') {\r\n\r\n /* leave the metadata element */\r\n\r\n metadata_depth--;\r\n\r\n } else if (metadata_depth > 0 &&\r\n metadataHandler &&\r\n 'onCloseTag' in metadataHandler) {\r\n\r\n /* end of child of metadata element */\r\n\r\n metadataHandler.onCloseTag();\r\n\r\n }\r\n\r\n }\r\n\r\n // TODO: delete stylerefs?\r\n\r\n // maintain the xml:space stack\r\n\r\n xmlspacestack.shift();\r\n\r\n // maintain the xml:lang stack\r\n\r\n xmllangstack.shift();\r\n\r\n // prepare for the next element\r\n\r\n estack.shift();\r\n };\r\n\r\n p.ontext = function (str) {\r\n\r\n if (estack[0] === undefined) {\r\n\r\n /* ignoring text outside of elements */\r\n\r\n } else if (estack[0] instanceof Span || estack[0] instanceof P) {\r\n\r\n /* ignore children text nodes in ruby container spans */\r\n\r\n if (estack[0] instanceof Span) {\r\n\r\n var ruby = estack[0].styleAttrs[imscStyles.byName.ruby.qname];\r\n\r\n if (ruby === 'container' || ruby === 'textContainer' || ruby === 'baseContainer') {\r\n\r\n return;\r\n\r\n }\r\n\r\n }\r\n\r\n /* create an anonymous span */\r\n\r\n var s = new AnonymousSpan();\r\n\r\n s.initFromText(doc, estack[0], str, xmllangstack[0], xmlspacestack[0], errorHandler);\r\n\r\n estack[0].contents.push(s);\r\n\r\n } else if (estack[0] instanceof ForeignElement &&\r\n metadata_depth > 0 &&\r\n metadataHandler &&\r\n 'onText' in metadataHandler) {\r\n\r\n /* text node within a child of metadata element */\r\n\r\n metadataHandler.onText(str);\r\n\r\n }\r\n\r\n };\r\n\r\n\r\n p.onopentag = function (node) {\r\n\r\n // maintain the xml:space stack\r\n\r\n var xmlspace = node.attributes[\"xml:space\"];\r\n\r\n if (xmlspace) {\r\n\r\n xmlspacestack.unshift(xmlspace.value);\r\n\r\n } else {\r\n\r\n if (xmlspacestack.length === 0) {\r\n\r\n xmlspacestack.unshift(\"default\");\r\n\r\n } else {\r\n\r\n xmlspacestack.unshift(xmlspacestack[0]);\r\n\r\n }\r\n\r\n }\r\n\r\n /* maintain the xml:lang stack */\r\n\r\n\r\n var xmllang = node.attributes[\"xml:lang\"];\r\n\r\n if (xmllang) {\r\n\r\n xmllangstack.unshift(xmllang.value);\r\n\r\n } else {\r\n\r\n if (xmllangstack.length === 0) {\r\n\r\n xmllangstack.unshift(\"\");\r\n\r\n } else {\r\n\r\n xmllangstack.unshift(xmllangstack[0]);\r\n\r\n }\r\n\r\n }\r\n\r\n\r\n /* process the element */\r\n\r\n if (node.uri === imscNames.ns_tt) {\r\n\r\n if (node.local === 'tt') {\r\n\r\n if (doc !== null) {\r\n\r\n reportFatal(errorHandler, \"Two <tt> elements at (\" + this.line + \",\" + this.column + \")\");\r\n\r\n }\r\n\r\n doc = new TT();\r\n\r\n doc.initFromNode(node, xmllangstack[0], errorHandler);\r\n\r\n estack.unshift(doc);\r\n\r\n } else if (node.local === 'head') {\r\n\r\n if (!(estack[0] instanceof TT)) {\r\n reportFatal(errorHandler, \"Parent of <head> element is not <tt> at (\" + this.line + \",\" + this.column + \")\");\r\n }\r\n\r\n estack.unshift(doc.head);\r\n\r\n } else if (node.local === 'styling') {\r\n\r\n if (!(estack[0] instanceof Head)) {\r\n reportFatal(errorHandler, \"Parent of <styling> element is not <head> at (\" + this.line + \",\" + this.column + \")\");\r\n }\r\n\r\n estack.unshift(doc.head.styling);\r\n\r\n } else if (node.local === 'style') {\r\n\r\n var s;\r\n\r\n if (estack[0] instanceof Styling) {\r\n\r\n s = new Style();\r\n\r\n s.initFromNode(node, errorHandler);\r\n\r\n /* ignore <style> element missing @id */\r\n\r\n if (!s.id) {\r\n\r\n reportError(errorHandler, \"<style> element missing @id attribute\");\r\n\r\n } else {\r\n\r\n doc.head.styling.styles[s.id] = s;\r\n\r\n }\r\n\r\n estack.unshift(s);\r\n\r\n } else if (estack[0] instanceof Region) {\r\n\r\n /* nested styles can be merged with specified styles\r\n * immediately, with lower priority\r\n * (see 8.4.4.2(3) at TTML1 )\r\n */\r\n\r\n s = new Style();\r\n\r\n s.initFromNode(node, errorHandler);\r\n\r\n mergeStylesIfNotPresent(s.styleAttrs, estack[0].styleAttrs);\r\n\r\n estack.unshift(s);\r\n\r\n } else {\r\n\r\n reportFatal(errorHandler, \"Parent of <style> element is not <styling> or <region> at (\" + this.line + \",\" + this.column + \")\");\r\n\r\n }\r\n\r\n } else if (node.local === 'initial') {\r\n\r\n var ini;\r\n\r\n if (estack[0] instanceof Styling) {\r\n\r\n ini = new Initial();\r\n\r\n ini.initFromNode(node, errorHandler);\r\n \r\n for (var qn in ini.styleAttrs) {\r\n\r\n if (! ini.styleAttrs.hasOwnProperty(qn)) continue;\r\n \r\n doc.head.styling.initials[qn] = ini.styleAttrs[qn];\r\n \r\n }\r\n \r\n estack.unshift(ini);\r\n\r\n } else {\r\n\r\n reportFatal(errorHandler, \"Parent of <initial> element is not <styling> at (\" + this.line + \",\" + this.column + \")\");\r\n\r\n }\r\n\r\n } else if (node.local === 'layout') {\r\n\r\n if (!(estack[0] instanceof Head)) {\r\n\r\n reportFatal(errorHandler, \"Parent of <layout> element is not <head> at \" + this.line + \",\" + this.column + \")\");\r\n\r\n }\r\n\r\n estack.unshift(doc.head.layout);\r\n\r\n } else if (node.local === 'region') {\r\n\r\n if (!(estack[0] instanceof Layout)) {\r\n reportFatal(errorHandler, \"Parent of <region> element is not <layout> at \" + this.line + \",\" + this.column + \")\");\r\n }\r\n\r\n var r = new Region();\r\n\r\n r.initFromNode(doc, node, xmllangstack[0], errorHandler);\r\n\r\n if (!r.id || r.id in doc.head.layout.regions) {\r\n\r\n reportError(errorHandler, \"Ignoring <region> with duplicate or missing @id at \" + this.line + \",\" + this.column + \")\");\r\n\r\n } else {\r\n\r\n doc.head.layout.regions[r.id] = r;\r\n\r\n }\r\n\r\n estack.unshift(r);\r\n\r\n } else if (node.local === 'body') {\r\n\r\n if (!(estack[0] instanceof TT)) {\r\n\r\n reportFatal(errorHandler, \"Parent of <body> element is not <tt> at \" + this.line + \",\" + this.column + \")\");\r\n\r\n }\r\n\r\n if (doc.body !== null) {\r\n\r\n reportFatal(errorHandler, \"Second <body> element at \" + this.line + \",\" + this.column + \")\");\r\n\r\n }\r\n\r\n var b = new Body();\r\n\r\n b.initFromNode(doc, node, xmllangstack[0], errorHandler);\r\n\r\n doc.body = b;\r\n\r\n estack.unshift(b);\r\n\r\n } else if (node.local === 'div') {\r\n\r\n if (!(estack[0] instanceof Div || estack[0] instanceof Body)) {\r\n\r\n reportFatal(errorHandler, \"Parent of <div> element is not <body> or <div> at \" + this.line + \",\" + this.column + \")\");\r\n\r\n }\r\n\r\n var d = new Div();\r\n\r\n d.initFromNode(doc, estack[0], node, xmllangstack[0], errorHandler);\r\n \r\n /* transform smpte:backgroundImage to TTML2 image element */\r\n \r\n var bi = d.styleAttrs[imscStyles.byName.backgroundImage.qname];\r\n \r\n if (bi) {\r\n d.contents.push(new Image(bi));\r\n delete d.styleAttrs[imscStyles.byName.backgroundImage.qname]; \r\n }\r\n\r\n estack[0].contents.push(d);\r\n\r\n estack.unshift(d);\r\n\r\n } else if (node.local === 'image') {\r\n\r\n if (!(estack[0] instanceof Div)) {\r\n\r\n reportFatal(errorHandler, \"Parent of <image> element is not <div> at \" + this.line + \",\" + this.column + \")\");\r\n\r\n }\r\n\r\n var img = new Image();\r\n \r\n img.initFromNode(doc, estack[0], node, xmllangstack[0], errorHandler);\r\n \r\n estack[0].contents.push(img);\r\n\r\n estack.unshift(img);\r\n\r\n } else if (node.local === 'p') {\r\n\r\n if (!(estack[0] instanceof Div)) {\r\n\r\n reportFatal(errorHandler, \"Parent of <p> element is not <div> at \" + this.line + \",\" + this.column + \")\");\r\n\r\n }\r\n\r\n var p = new P();\r\n\r\n p.initFromNode(doc, estack[0], node, xmllangstack[0], errorHandler);\r\n\r\n estack[0].contents.push(p);\r\n\r\n estack.unshift(p);\r\n\r\n } else if (node.local === 'span') {\r\n\r\n if (!(estack[0] instanceof Span || estack[0] instanceof P)) {\r\n\r\n reportFatal(errorHandler, \"Parent of <span> element is not <span> or <p> at \" + this.line + \",\" + this.column + \")\");\r\n\r\n }\r\n\r\n var ns = new Span();\r\n\r\n ns.initFromNode(doc, estack[0], node, xmllangstack[0], xmlspacestack[0], errorHandler);\r\n\r\n estack[0].contents.push(ns);\r\n\r\n estack.unshift(ns);\r\n\r\n } else if (node.local === 'br') {\r\n\r\n if (!(estack[0] instanceof Span || estack[0] instanceof P)) {\r\n\r\n reportFatal(errorHandler, \"Parent of <br> element is not <span> or <p> at \" + this.line + \",\" + this.column + \")\");\r\n\r\n }\r\n\r\n var nb = new Br();\r\n\r\n nb.initFromNode(doc, estack[0], node, xmllangstack[0], errorHandler);\r\n\r\n estack[0].contents.push(nb);\r\n\r\n estack.unshift(nb);\r\n\r\n } else if (node.local === 'set') {\r\n\r\n if (!(estack[0] instanceof Span ||\r\n estack[0] instanceof P ||\r\n estack[0] instanceof Div ||\r\n estack[0] instanceof Body ||\r\n estack[0] instanceof Region ||\r\n estack[0] instanceof Br)) {\r\n\r\n reportFatal(errorHandler, \"Parent of <set> element is not a content element or a region at \" + this.line + \",\" + this.column + \")\");\r\n\r\n }\r\n\r\n var st = new Set();\r\n\r\n st.initFromNode(doc, estack[0], node, errorHandler);\r\n\r\n estack[0].sets.push(st);\r\n\r\n estack.unshift(st);\r\n\r\n } else {\r\n\r\n /* element in the TT namespace, but not a content element */\r\n\r\n estack.unshift(new ForeignElement(node));\r\n }\r\n\r\n } else {\r\n\r\n /* ignore elements not in the TTML namespace unless in metadata element */\r\n\r\n estack.unshift(new ForeignElement(node));\r\n\r\n }\r\n\r\n /* handle metadata callbacks */\r\n\r\n if (estack[0] instanceof ForeignElement) {\r\n\r\n if (node.uri === imscNames.ns_tt &&\r\n node.local === 'metadata') {\r\n\r\n /* enter the metadata element */\r\n\r\n metadata_depth++;\r\n\r\n } else if (\r\n metadata_depth > 0 &&\r\n metadataHandler &&\r\n 'onOpenTag' in metadataHandler\r\n ) {\r\n\r\n /* start of child of metadata element */\r\n\r\n var attrs = [];\r\n\r\n for (var a in node.attributes) {\r\n attrs[node.attributes[a].uri + \" \" + node.attributes[a].local] =\r\n {\r\n uri: node.attributes[a].uri,\r\n local: node.attributes[a].local,\r\n value: node.attributes[a].value\r\n };\r\n }\r\n\r\n metadataHandler.onOpenTag(node.uri, node.local, attrs);\r\n\r\n }\r\n\r\n }\r\n\r\n };\r\n\r\n // parse the document\r\n\r\n p.write(xmlstring).close();\r\n\r\n // all referential styling has been flatten, so delete styles\r\n\r\n delete doc.head.styling.styles;\r\n \r\n // create default region if no regions specified\r\n\r\n var hasRegions = false;\r\n\r\n /* AFAIK the only way to determine whether an object has members */\r\n\r\n for (var i in doc.head.layout.regions) {\r\n\r\n if (doc.head.layout.regions.hasOwnProperty(i)) {\r\n hasRegions = true;\r\n break;\r\n }\r\n\r\n }\r\n\r\n if (!hasRegions) {\r\n\r\n /* create default region */\r\n\r\n var dr = Region.prototype.createDefaultRegion(doc.lang);\r\n\r\n doc.head.layout.regions[dr.id] = dr;\r\n\r\n }\r\n\r\n /* resolve desired timing for regions */\r\n\r\n for (var region_i in doc.head.layout.regions) {\r\n\r\n if (! doc.head.layout.regions.hasOwnProperty(region_i)) continue;\r\n\r\n resolveTiming(doc, doc.head.layout.regions[region_i], null, null);\r\n\r\n }\r\n\r\n /* resolve desired timing for content elements */\r\n\r\n if (doc.body) {\r\n resolveTiming(doc, doc.body, null, null);\r\n }\r\n\r\n /* remove undefined spans in ruby containers */\r\n\r\n if (doc.body) {\r\n cleanRubyContainers(doc.body);\r\n }\r\n\r\n return doc;\r\n };\r\n\r\n function cleanRubyContainers(element) {\r\n \r\n if (! ('contents' in element)) return;\r\n\r\n var rubyval = 'styleAttrs' in element ? element.styleAttrs[imscStyles.byName.ruby.qname] : null;\r\n\r\n var isrubycontainer = (element.kind === 'span' && (rubyval === \"container\" || rubyval === \"textContainer\" || rubyval === \"baseContainer\"));\r\n\r\n for (var i = element.contents.length - 1; i >= 0; i--) {\r\n\r\n if (isrubycontainer && !('styleAttrs' in element.contents[i] && imscStyles.byName.ruby.qname in element.contents[i].styleAttrs)) {\r\n\r\n /* prune undefined <span> in ruby containers */\r\n\r\n delete element.contents[i];\r\n\r\n } else {\r\n\r\n cleanRubyContainers(element.contents[i]);\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n function resolveTiming(doc, element, prev_sibling, parent) {\r\n\r\n /* are we in a seq container? */\r\n\r\n var isinseq = parent && parent.timeContainer === \"seq\";\r\n\r\n /* determine implicit begin */\r\n\r\n var implicit_begin = 0; /* default */\r\n\r\n if (parent) {\r\n\r\n if (isinseq && prev_sibling) {\r\n\r\n /*\r\n * if seq time container, offset from the previous sibling end\r\n */\r\n\r\n implicit_begin = prev_sibling.end;\r\n\r\n\r\n } else {\r\n\r\n implicit_begin = parent.begin;\r\n\r\n }\r\n\r\n }\r\n\r\n /* compute desired begin */\r\n\r\n element.begin = element.explicit_begin ? element.explicit_begin + implicit_begin : implicit_begin;\r\n\r\n\r\n /* determine implicit end */\r\n\r\n var implicit_end = element.begin;\r\n\r\n var s = null;\r\n\r\n if (\"sets\" in element) {\r\n\r\n for (var set_i = 0; set_i < element.sets.length; set_i++) {\r\n\r\n resolveTiming(doc, element.sets[set_i], s, element);\r\n\r\n if (element.timeContainer === \"seq\") {\r\n\r\n implicit_end = element.sets[set_i].end;\r\n\r\n } else {\r\n\r\n implicit_end = Math.max(implicit_end, element.sets[set_i].end);\r\n\r\n }\r\n\r\n s = element.sets[set_i];\r\n\r\n }\r\n\r\n }\r\n\r\n if (!('contents' in element)) {\r\n\r\n /* anonymous spans and regions and <set> and <br>s and spans with only children text nodes */\r\n\r\n if (isinseq) {\r\n\r\n /* in seq container, implicit duration is zero */\r\n\r\n implicit_end = element.begin;\r\n\r\n } else {\r\n\r\n /* in par container, implicit duration is indefinite */\r\n\r\n implicit_end = Number.POSITIVE_INFINITY;\r\n\r\n }\r\n\r\n } else if (\"contents\" in element) {\r\n \r\n for (var content_i = 0; content_i < element.contents.length; content_i++) {\r\n\r\n resolveTiming(doc, element.contents[content_i], s, element);\r\n\r\n if (element.timeContainer === \"seq\") {\r\n\r\n implicit_end = element.contents[content_i].end;\r\n\r\n } else {\r\n\r\n implicit_end = Math.max(implicit_end, element.contents[content_i].end);\r\n\r\n }\r\n\r\n s = element.contents[content_i];\r\n\r\n }\r\n\r\n }\r\n\r\n /* determine desired end */\r\n /* it is never made really clear in SMIL that the explicit end is offset by the implicit begin */\r\n\r\n if (element.explicit_end !== null && element.explicit_dur !== null) {\r\n\r\n element.end = Math.min(element.begin + element.explicit_dur, implicit_begin + element.explicit_end);\r\n\r\n } else if (element.explicit_end === null && element.explicit_dur !== null) {\r\n\r\n element.end = element.begin + element.explicit_dur;\r\n\r\n } else if (element.explicit_end !== null && element.explicit_dur === null) {\r\n\r\n element.end = implicit_begin + element.explicit_end;\r\n\r\n } else {\r\n\r\n element.end = implicit_end;\r\n }\r\n\r\n delete element.explicit_begin;\r\n delete element.explicit_dur;\r\n delete element.explicit_end;\r\n\r\n doc._registerEvent(element);\r\n\r\n }\r\n\r\n function ForeignElement(node) {\r\n this.node = node;\r\n }\r\n\r\n function TT() {\r\n this.events = [];\r\n this.head = new Head();\r\n this.body = null;\r\n }\r\n\r\n TT.prototype.initFromNode = function (node, xmllang, errorHandler) {\r\n\r\n /* compute cell resolution */\r\n\r\n var cr = extractCellResolution(node, errorHandler);\r\n \r\n this.cellLength = {\r\n 'h': new imscUtils.ComputedLength(0, 1/cr.h),\r\n 'w': new imscUtils.ComputedLength(1/cr.w, 0)\r\n };\r\n\r\n /* extract frame rate and tick rate */\r\n\r\n var frtr = extractFrameAndTickRate(node, errorHandler);\r\n\r\n this.effectiveFrameRate = frtr.effectiveFrameRate;\r\n\r\n this.tickRate = frtr.tickRate;\r\n\r\n /* extract aspect ratio */\r\n\r\n this.aspectRatio = extractAspectRatio(node, errorHandler);\r\n\r\n /* check timebase */\r\n\r\n var attr = findAttribute(node, imscNames.ns_ttp, \"timeBase\");\r\n\r\n if (attr !== null && attr !== \"media\") {\r\n\r\n reportFatal(errorHandler, \"Unsupported time base\");\r\n\r\n }\r\n\r\n /* retrieve extent */\r\n\r\n var e = extractExtent(node, errorHandler);\r\n\r\n if (e === null) {\r\n\r\n this.pxLength = {\r\n 'h': null,\r\n 'w': null\r\n };\r\n\r\n } else {\r\n\r\n if (e.h.unit !== \"px\" || e.w.unit !== \"px\") {\r\n reportFatal(errorHandler, \"Extent on TT must be in px or absent\");\r\n }\r\n\r\n this.pxLength = {\r\n 'h': new imscUtils.ComputedLength(0, 1 / e.h.value),\r\n 'w': new imscUtils.ComputedLength(1 / e.w.value, 0)\r\n };\r\n }\r\n \r\n /** set root container dimensions to (1, 1) arbitrarily\r\n * the root container is mapped to actual dimensions at rendering\r\n **/\r\n \r\n this.dimensions = {\r\n 'h': new imscUtils.ComputedLength(0, 1),\r\n 'w': new imscUtils.ComputedLength(1, 0)\r\n\r\n };\r\n\r\n /* xml:lang */\r\n\r\n this.lang = xmllang;\r\n\r\n };\r\n\r\n /* register a temporal events */\r\n TT.prototype._registerEvent = function (elem) {\r\n\r\n /* skip if begin is not < then end */\r\n\r\n if (elem.end <= elem.begin)\r\n return;\r\n\r\n /* index the begin time of the event */\r\n\r\n var b_i = indexOf(this.events, elem.begin);\r\n\r\n if (!b_i.found) {\r\n this.events.splice(b_i.index, 0, elem.begin);\r\n }\r\n\r\n /* index the end time of the event */\r\n\r\n if (elem.end !== Number.POSITIVE_INFINITY) {\r\n\r\n var e_i = indexOf(this.events, elem.end);\r\n\r\n if (!e_i.found) {\r\n this.events.splice(e_i.index, 0, elem.end);\r\n }\r\n\r\n }\r\n\r\n };\r\n\r\n\r\n /*\r\n * Retrieves the range of ISD times covered by the document\r\n * \r\n * @returns {Array} Array of two elements: min_begin_time and max_begin_time\r\n * \r\n */\r\n TT.prototype.getMediaTimeRange = function () {\r\n\r\n return [this.events[0], this.events[this.events.length - 1]];\r\n };\r\n\r\n /*\r\n * Returns list of ISD begin times \r\n * \r\n * @returns {Array}\r\n */\r\n TT.prototype.getMediaTimeEvents = function () {\r\n\r\n return this.events;\r\n };\r\n\r\n /*\r\n * Represents a TTML Head element\r\n */\r\n\r\n function Head() {\r\n this.styling = new Styling();\r\n this.layout = new Layout();\r\n }\r\n\r\n /*\r\n * Represents a TTML Styling element\r\n */\r\n\r\n function Styling() {\r\n this.styles = {};\r\n this.initials = {};\r\n }\r\n\r\n /*\r\n * Represents a TTML Style element\r\n */\r\n\r\n function Style() {\r\n this.id = null;\r\n this.styleAttrs = null;\r\n this.styleRefs = null;\r\n }\r\n\r\n Style.prototype.initFromNode = function (node, errorHandler) {\r\n this.id = elementGetXMLID(node);\r\n this.styleAttrs = elementGetStyles(node, errorHandler);\r\n this.styleRefs = elementGetStyleRefs(node);\r\n };\r\n \r\n /*\r\n * Represents a TTML initial element\r\n */\r\n\r\n function Initial() {\r\n this.styleAttrs = null;\r\n }\r\n\r\n Initial.prototype.initFromNode = function (node, errorHandler) {\r\n \r\n this.styleAttrs = {};\r\n \r\n for (var i in node.attributes) {\r\n\r\n if (node.attributes[i].uri === imscNames.ns_itts ||\r\n node.attributes[i].uri === imscNames.ns_ebutts ||\r\n node.attributes[i].uri === imscNames.ns_tts) {\r\n \r\n var qname = node.attributes[i].uri + \" \" + node.attributes[i].local;\r\n \r\n this.styleAttrs[qname] = node.attributes[i].value;\r\n\r\n }\r\n }\r\n \r\n };\r\n\r\n /*\r\n * Represents a TTML Layout element\r\n * \r\n */\r\n\r\n function Layout() {\r\n this.regions = {};\r\n }\r\n \r\n /*\r\n * Represents a TTML image element\r\n */\r\n\r\n function Image(src, type) {\r\n ContentElement.call(this, 'image');\r\n this.src = src;\r\n this.type = type;\r\n }\r\n\r\n Image.prototype.initFromNode = function (doc, parent, node, xmllang, errorHandler) {\r\n this.src = 'src' in node.attributes ? node.attributes.src.value : null;\r\n \r\n if (! this.src) {\r\n reportError(errorHandler, \"Invalid image@src attribute\");\r\n }\r\n \r\n this.type = 'type' in node.attributes ? node.attributes.type.value : null;\r\n \r\n if (! this.type) {\r\n reportError(errorHandler, \"Invalid image@type attribute\");\r\n }\r\n \r\n StyledElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);\r\n TimedElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);\r\n AnimatedElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);\r\n LayoutElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);\r\n\r\n this.lang = xmllang;\r\n };\r\n\r\n /*\r\n * TTML element utility functions\r\n * \r\n */\r\n\r\n function ContentElement(kind) {\r\n this.kind = kind;\r\n }\r\n\r\n function IdentifiedElement(id) {\r\n this.id = id;\r\n }\r\n\r\n IdentifiedElement.prototype.initFromNode = function (doc, parent, node, errorHandler) {\r\n this.id = elementGetXMLID(node);\r\n };\r\n\r\n function LayoutElement(id) {\r\n this.regionID = id;\r\n }\r\n\r\n LayoutElement.prototype.initFromNode = function (doc, parent, node, errorHandler) {\r\n this.regionID = elementGetRegionID(node);\r\n };\r\n\r\n function StyledElement(styleAttrs) {\r\n this.styleAttrs = styleAttrs;\r\n }\r\n\r\n StyledElement.prototype.initFromNode = function (doc, parent, node, errorHandler) {\r\n\r\n this.styleAttrs = elementGetStyles(node, errorHandler);\r\n\r\n if (doc.head !== null && doc.head.styling !== null) {\r\n mergeReferencedStyles(doc.head.styling, elementGetStyleRefs(node), this.styleAttrs, errorHandler);\r\n }\r\n\r\n };\r\n\r\n function AnimatedElement(sets) {\r\n this.sets = sets;\r\n }\r\n\r\n AnimatedElement.prototype.initFromNode = function (doc, parent, node, errorHandler) {\r\n this.sets = [];\r\n };\r\n\r\n function ContainerElement(contents) {\r\n this.contents = contents;\r\n }\r\n\r\n ContainerElement.prototype.initFromNode = function (doc, parent, node, errorHandler) {\r\n this.contents = [];\r\n };\r\n\r\n function TimedElement(explicit_begin, explicit_end, explicit_dur) {\r\n this.explicit_begin = explicit_begin;\r\n this.explicit_end = explicit_end;\r\n this.explicit_dur = explicit_dur;\r\n }\r\n\r\n TimedElement.prototype.initFromNode = function (doc, parent, node, errorHandler) {\r\n var t = processTiming(doc, parent, node, errorHandler);\r\n this.explicit_begin = t.explicit_begin;\r\n this.explicit_end = t.explicit_end;\r\n this.explicit_dur = t.explicit_dur;\r\n\r\n this.timeContainer = elementGetTimeContainer(node, errorHandler);\r\n };\r\n\r\n\r\n /*\r\n * Represents a TTML body element\r\n */\r\n\r\n\r\n\r\n function Body() {\r\n ContentElement.call(this, 'body');\r\n }\r\n\r\n\r\n Body.prototype.initFromNode = function (doc, node, xmllang, errorHandler) {\r\n StyledElement.prototype.initFromNode.call(this, doc, null, node, errorHandler);\r\n TimedElement.prototype.initFromNode.call(this, doc, null, node, errorHandler);\r\n AnimatedElement.prototype.initFromNode.call(this, doc, null, node, errorHandler);\r\n LayoutElement.prototype.initFromNode.call(this, doc, null, node, errorHandler);\r\n ContainerElement.prototype.initFromNode.call(this, doc, null, node, errorHandler);\r\n\r\n this.lang = xmllang;\r\n };\r\n\r\n /*\r\n * Represents a TTML div element\r\n */\r\n\r\n function Div() {\r\n ContentElement.call(this, 'div');\r\n }\r\n\r\n Div.prototype.initFromNode = function (doc, parent, node, xmllang, errorHandler) {\r\n StyledElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);\r\n TimedElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);\r\n AnimatedElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);\r\n LayoutElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);\r\n ContainerElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);\r\n\r\n this.lang = xmllang;\r\n };\r\n\r\n /*\r\n * Represents a TTML p element\r\n */\r\n\r\n function P() {\r\n ContentElement.call(this, 'p');\r\n }\r\n\r\n P.prototype.initFromNode = function (doc, parent, node, xmllang, errorHandler) {\r\n StyledElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);\r\n TimedElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);\r\n AnimatedElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);\r\n LayoutElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);\r\n ContainerElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);\r\n\r\n this.lang = xmllang;\r\n };\r\n\r\n /*\r\n * Represents a TTML span element\r\n */\r\n\r\n function Span() {\r\n ContentElement.call(this, 'span');\r\n }\r\n\r\n Span.prototype.initFromNode = function (doc, parent, node, xmllang, xmlspace, errorHandler) {\r\n StyledElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);\r\n TimedElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);\r\n AnimatedElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);\r\n LayoutElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);\r\n ContainerElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);\r\n\r\n this.space = xmlspace;\r\n this.lang = xmllang;\r\n };\r\n\r\n /*\r\n * Represents a TTML anonymous span element\r\n */\r\n\r\n function AnonymousSpan() {\r\n ContentElement.call(this, 'span');\r\n }\r\n\r\n AnonymousSpan.prototype.initFromText = function (doc, parent, text, xmllang, xmlspace, errorHandler) {\r\n TimedElement.prototype.initFromNode.call(this, doc, parent, null, errorHandler);\r\n\r\n this.text = text;\r\n this.space = xmlspace;\r\n this.lang = xmllang;\r\n };\r\n\r\n /*\r\n * Represents a TTML br element\r\n */\r\n\r\n function Br() {\r\n ContentElement.call(this, 'br');\r\n }\r\n\r\n Br.prototype.initFromNode = function (doc, parent, node, xmllang, errorHandler) {\r\n LayoutElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);\r\n TimedElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);\r\n\r\n this.lang = xmllang;\r\n };\r\n\r\n /*\r\n * Represents a TTML Region element\r\n * \r\n */\r\n\r\n function Region() {\r\n }\r\n\r\n Region.prototype.createDefaultRegion = function (xmllang) {\r\n var r = new Region();\r\n\r\n IdentifiedElement.call(r, '');\r\n StyledElement.call(r, {});\r\n AnimatedElement.call(r, []);\r\n TimedElement.call(r, 0, Number.POSITIVE_INFINITY, null);\r\n\r\n this.lang = xmllang;\r\n\r\n return r;\r\n };\r\n\r\n Region.prototype.initFromNode = function (doc, node, xmllang, errorHandler) {\r\n IdentifiedElement.prototype.initFromNode.call(this, doc, null, node, errorHandler);\r\n TimedElement.prototype.initFromNode.call(this, doc, null, node, errorHandler);\r\n AnimatedElement.prototype.initFromNode.call(this, doc, null, node, errorHandler);\r\n\r\n /* add specified styles */\r\n\r\n this.styleAttrs = elementGetStyles(node, errorHandler);\r\n\r\n /* remember referential styles for merging after nested styling is processed*/\r\n\r\n this.styleRefs = elementGetStyleRefs(node);\r\n\r\n /* xml:lang */\r\n\r\n this.lang = xmllang;\r\n };\r\n\r\n /*\r\n * Represents a TTML Set element\r\n * \r\n */\r\n\r\n function Set() {\r\n }\r\n\r\n Set.prototype.initFromNode = function (doc, parent, node, errorHandler) {\r\n\r\n TimedElement.prototype.initFromNode.call(this, doc, parent, node, errorHandler);\r\n\r\n var styles = elementGetStyles(node, errorHandler);\r\n\r\n this.qname = null;\r\n this.value = null;\r\n\r\n for (var qname in styles) {\r\n\r\n if (! styles.hasOwnProperty(qname)) continue;\r\n\r\n if (this.qname) {\r\n\r\n reportError(errorHandler, \"More than one style specified on set\");\r\n break;\r\n\r\n }\r\n\r\n this.qname = qname;\r\n this.value = styles[qname];\r\n\r\n }\r\n\r\n };\r\n\r\n /*\r\n * Utility functions\r\n * \r\n */\r\n\r\n\r\n function elementGetXMLID(node) {\r\n return node && 'xml:id' in node.attributes ? node.attributes['xml:id'].value || null : null;\r\n }\r\n\r\n function elementGetRegionID(node) {\r\n return node && 'region' in node.attributes ? node.attributes.region.value : '';\r\n }\r\n\r\n function elementGetTimeContainer(node, errorHandler) {\r\n\r\n var tc = node && 'timeContainer' in node.attributes ? node.attributes.timeContainer.value : null;\r\n\r\n if ((!tc) || tc === \"par\") {\r\n\r\n return \"par\";\r\n\r\n } else if (tc === \"seq\") {\r\n\r\n return \"seq\";\r\n\r\n } else {\r\n\r\n reportError(errorHandler, \"Illegal value of timeContainer (assuming 'par')\");\r\n\r\n return \"par\";\r\n\r\n }\r\n\r\n }\r\n\r\n function elementGetStyleRefs(node) {\r\n\r\n return node && 'style' in node.attributes ? node.attributes.style.value.split(\" \") : [];\r\n\r\n }\r\n\r\n function elementGetStyles(node, errorHandler) {\r\n\r\n var s = {};\r\n\r\n if (node !== null) {\r\n\r\n for (var i in node.attributes) {\r\n\r\n var qname = node.attributes[i].uri + \" \" + node.attributes[i].local;\r\n\r\n var sa = imscStyles.byQName[qname];\r\n\r\n if (sa !== undefined) {\r\n\r\n var val = sa.parse(node.attributes[i].value);\r\n\r\n if (val !== null) {\r\n\r\n s[qname] = val;\r\n\r\n /* TODO: consider refactoring errorHandler into parse and compute routines */\r\n\r\n if (sa === imscStyles.byName.zIndex) {\r\n reportWarning(errorHandler, \"zIndex attribute present but not used by IMSC1 since regions do not overlap\");\r\n }\r\n\r\n } else {\r\n\r\n reportError(errorHandler, \"Cannot parse styling attribute \" + qname + \" --> \" + node.attributes[i].value);\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n return s;\r\n }\r\n\r\n function findAttribute(node, ns, name) {\r\n for (var i in node.attributes) {\r\n\r\n if (node.attributes[i].uri === ns &&\r\n node.attributes[i].local === name) {\r\n\r\n return node.attributes[i].value;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n function extractAspectRatio(node, errorHandler) {\r\n\r\n var ar = findAttribute(node, imscNames.ns_ittp, \"aspectRatio\");\r\n\r\n if (ar === null) {\r\n \r\n ar = findAttribute(node, imscNames.ns_ttp, \"displayAspectRatio\");\r\n \r\n }\r\n\r\n var rslt = null;\r\n\r\n if (ar !== null) {\r\n\r\n var ASPECT_RATIO_RE = /(\\d+)\\s+(\\d+)/;\r\n\r\n var m = ASPECT_RATIO_RE.exec(ar);\r\n\r\n if (m !== null) {\r\n\r\n var w = parseInt(m[1]);\r\n\r\n var h = parseInt(m[2]);\r\n\r\n if (w !== 0 && h !== 0) {\r\n\r\n rslt = w / h;\r\n\r\n } else {\r\n\r\n reportError(errorHandler, \"Illegal aspectRatio values (ignoring)\");\r\n }\r\n\r\n } else {\r\n\r\n reportError(errorHandler, \"Malformed aspectRatio attribute (ignoring)\");\r\n }\r\n\r\n }\r\n\r\n return rslt;\r\n\r\n }\r\n\r\n /*\r\n * Returns the cellResolution attribute from a node\r\n * \r\n */\r\n function extractCellResolution(node, errorHandler) {\r\n\r\n var cr = findAttribute(node, imscNames.ns_ttp, \"cellResolution\");\r\n\r\n // initial value\r\n\r\n var h = 15;\r\n var w = 32;\r\n\r\n if (cr !== null) {\r\n\r\n var CELL_RESOLUTION_RE = /(\\d+) (\\d+)/;\r\n\r\n var m = CELL_RESOLUTION_RE.exec(cr);\r\n\r\n if (m !== null) {\r\n\r\n w = parseInt(m[1]);\r\n\r\n h = parseInt(m[2]);\r\n\r\n } else {\r\n\r\n reportWarning(errorHandler, \"Malformed cellResolution value (using initial value instead)\");\r\n\r\n }\r\n\r\n }\r\n\r\n return {'w': w, 'h': h};\r\n\r\n }\r\n\r\n\r\n function extractFrameAndTickRate(node, errorHandler) {\r\n\r\n // subFrameRate is ignored per IMSC1 specification\r\n\r\n // extract frame rate\r\n\r\n var fps_attr = findAttribute(node, imscNames.ns_ttp, \"frameRate\");\r\n\r\n // initial value\r\n\r\n var fps = 30;\r\n\r\n // match variable\r\n\r\n var m;\r\n\r\n if (fps_attr !== null) {\r\n\r\n var FRAME_RATE_RE = /(\\d+)/;\r\n\r\n m = FRAME_RATE_RE.exec(fps_attr);\r\n\r\n if (m !== null) {\r\n\r\n fps = parseInt(m[1]);\r\n\r\n } else {\r\n\r\n reportWarning(errorHandler, \"Malformed frame rate attribute (using initial value instead)\");\r\n }\r\n\r\n }\r\n\r\n // extract frame rate multiplier\r\n\r\n var frm_attr = findAttribute(node, imscNames.ns_ttp, \"frameRateMultiplier\");\r\n\r\n // initial value\r\n\r\n var frm = 1;\r\n\r\n if (frm_attr !== null) {\r\n\r\n var FRAME_RATE_MULT_RE = /(\\d+) (\\d+)/;\r\n\r\n m = FRAME_RATE_MULT_RE.exec(frm_attr);\r\n\r\n if (m !== null) {\r\n\r\n frm = parseInt(m[1]) / parseInt(m[2]);\r\n\r\n } else {\r\n\r\n reportWarning(errorHandler, \"Malformed frame rate multiplier attribute (using initial value instead)\");\r\n }\r\n\r\n }\r\n\r\n var efps = frm * fps;\r\n\r\n // extract tick rate\r\n\r\n var tr = 1;\r\n\r\n var trattr = findAttribute(node, imscNames.ns_ttp, \"tickRate\");\r\n\r\n if (trattr === null) {\r\n\r\n if (fps_attr !== null)\r\n tr = efps;\r\n\r\n } else {\r\n\r\n var TICK_RATE_RE = /(\\d+)/;\r\n\r\n m = TICK_RATE_RE.exec(trattr);\r\n\r\n if (m !== null) {\r\n\r\n tr = parseInt(m[1]);\r\n\r\n } else {\r\n\r\n reportWarning(errorHandler, \"Malformed tick rate attribute (using initial value instead)\");\r\n }\r\n\r\n }\r\n\r\n return {effectiveFrameRate: efps, tickRate: tr};\r\n\r\n }\r\n\r\n function extractExtent(node, errorHandler) {\r\n\r\n var attr = findAttribute(node, imscNames.ns_tts, \"extent\");\r\n\r\n if (attr === null)\r\n return null;\r\n\r\n var s = attr.split(\" \");\r\n\r\n if (s.length !== 2) {\r\n\r\n reportWarning(errorHandler, \"Malformed extent (ignoring)\");\r\n\r\n return null;\r\n }\r\n\r\n var w = imscUtils.parseLength(s[0]);\r\n\r\n var h = imscUtils.parseLength(s[1]);\r\n\r\n if (!h || !w) {\r\n\r\n reportWarning(errorHandler, \"Malformed extent values (ignoring)\");\r\n\r\n return null;\r\n }\r\n\r\n return {'h': h, 'w': w};\r\n\r\n }\r\n\r\n function parseTimeExpression(tickRate, effectiveFrameRate, str) {\r\n\r\n var CLOCK_TIME_FRACTION_RE = /^(\\d{2,}):(\\d\\d):(\\d\\d(?:\\.\\d+)?)$/;\r\n var CLOCK_TIME_FRAMES_RE = /^(\\d{2,}):(\\d\\d):(\\d\\d)\\:(\\d{2,})$/;\r\n var OFFSET_FRAME_RE = /^(\\d+(?:\\.\\d+)?)f$/;\r\n var OFFSET_TICK_RE = /^(\\d+(?:\\.\\d+)?)t$/;\r\n var OFFSET_MS_RE = /^(\\d+(?:\\.\\d+)?)ms$/;\r\n var OFFSET_S_RE = /^(\\d+(?:\\.\\d+)?)s$/;\r\n var OFFSET_H_RE = /^(\\d+(?:\\.\\d+)?)h$/;\r\n var OFFSET_M_RE = /^(\\d+(?:\\.\\d+)?)m$/;\r\n var m;\r\n var r = null;\r\n if ((m = OFFSET_FRAME_RE.exec(str)) !== null) {\r\n\r\n if (effectiveFrameRate !== null) {\r\n\r\n r = parseFloat(m[1]) / effectiveFrameRate;\r\n }\r\n\r\n } else if ((m = OFFSET_TICK_RE.exec(str)) !== null) {\r\n\r\n if (tickRate !== null) {\r\n\r\n r = parseFloat(m[1]) / tickRate;\r\n }\r\n\r\n } else if ((m = OFFSET_MS_RE.exec(str)) !== null) {\r\n\r\n r = parseFloat(m[1]) / 1000.0;\r\n\r\n } else if ((m = OFFSET_S_RE.exec(str)) !== null) {\r\n\r\n r = parseFloat(m[1]);\r\n\r\n } else if ((m = OFFSET_H_RE.exec(str)) !== null) {\r\n\r\n r = parseFloat(m[1]) * 3600.0;\r\n\r\n } else if ((m = OFFSET_M_RE.exec(str)) !== null) {\r\n\r\n r = parseFloat(m[1]) * 60.0;\r\n\r\n } else if ((m = CLOCK_TIME_FRACTION_RE.exec(str)) !== null) {\r\n\r\n r = parseInt(m[1]) * 3600 +\r\n parseInt(m[2]) * 60 +\r\n parseFloat(m[3]);\r\n\r\n } else if ((m = CLOCK_TIME_FRAMES_RE.exec(str)) !== null) {\r\n\r\n /* this assumes that HH:MM:SS is a clock-time-with-fraction */\r\n\r\n if (effectiveFrameRate !== null) {\r\n\r\n r = parseInt(m[1]) * 3600 +\r\n parseInt(m[2]) * 60 +\r\n parseInt(m[3]) +\r\n (m[4] === null ? 0 : parseInt(m[4]) / effectiveFrameRate);\r\n }\r\n\r\n }\r\n\r\n return r;\r\n }\r\n\r\n function processTiming(doc, parent, node, errorHandler) {\r\n\r\n /* determine explicit begin */\r\n\r\n var explicit_begin = null;\r\n\r\n if (node && 'begin' in node.attributes) {\r\n\r\n explicit_begin = parseTimeExpression(doc.tickRate, doc.effectiveFrameRate, node.attributes.begin.value);\r\n\r\n if (explicit_begin === null) {\r\n\r\n reportWarning(errorHandler, \"Malformed begin value \" + node.attributes.begin.value + \" (using 0)\");\r\n\r\n }\r\n\r\n }\r\n\r\n /* determine explicit duration */\r\n\r\n var explicit_dur = null;\r\n\r\n if (node && 'dur' in node.attributes) {\r\n\r\n explicit_dur = parseTimeExpression(doc.tickRate, doc.effectiveFrameRate, node.attributes.dur.value);\r\n\r\n if (explicit_dur === null) {\r\n\r\n reportWarning(errorHandler, \"Malformed dur value \" + node.attributes.dur.value + \" (ignoring)\");\r\n\r\n }\r\n\r\n }\r\n\r\n /* determine explicit end */\r\n\r\n var explicit_end = null;\r\n\r\n if (node && 'end' in node.attributes) {\r\n\r\n explicit_end = parseTimeExpression(doc.tickRate, doc.effectiveFrameRate, node.attributes.end.value);\r\n\r\n if (explicit_end === null) {\r\n\r\n reportWarning(errorHandler, \"Malformed end value (ignoring)\");\r\n\r\n }\r\n\r\n }\r\n\r\n return {explicit_begin: explicit_begin,\r\n explicit_end: explicit_end,\r\n explicit_dur: explicit_dur};\r\n\r\n }\r\n\r\n\r\n\r\n function mergeChainedStyles(styling, style, errorHandler) {\r\n\r\n while (style.styleRefs.length > 0) {\r\n\r\n var sref = style.styleRefs.pop();\r\n\r\n if (!(sref in styling.styles)) {\r\n reportError(errorHandler, \"Non-existant style id referenced\");\r\n continue;\r\n }\r\n\r\n mergeChainedStyles(styling, styling.styles[sref], errorHandler);\r\n\r\n mergeStylesIfNotPresent(styling.styles[sref].styleAttrs, style.styleAttrs);\r\n\r\n }\r\n\r\n }\r\n\r\n function mergeReferencedStyles(styling, stylerefs, styleattrs, errorHandler) {\r\n\r\n for (var i = stylerefs.length - 1; i >= 0; i--) {\r\n\r\n var sref = stylerefs[i];\r\n\r\n if (!(sref in styling.styles)) {\r\n reportError(errorHandler, \"Non-existant style id referenced\");\r\n continue;\r\n }\r\n\r\n mergeStylesIfNotPresent(styling.styles[sref].styleAttrs, styleattrs);\r\n\r\n }\r\n\r\n }\r\n\r\n function mergeStylesIfNotPresent(from_styles, into_styles) {\r\n\r\n for (var sname in from_styles) {\r\n\r\n if (! from_styles.hasOwnProperty(sname)) continue;\r\n\r\n if (sname in into_styles)\r\n continue;\r\n\r\n into_styles[sname] = from_styles[sname];\r\n\r\n }\r\n\r\n }\r\n\r\n /* TODO: validate style format at parsing */\r\n\r\n\r\n /*\r\n * ERROR HANDLING UTILITY FUNCTIONS\r\n * \r\n */\r\n\r\n function reportInfo(errorHandler, msg) {\r\n\r\n if (errorHandler && errorHandler.info && errorHandler.info(msg))\r\n throw msg;\r\n\r\n }\r\n\r\n function reportWarning(errorHandler, msg) {\r\n\r\n if (errorHandler && errorHandler.warn && errorHandler.warn(msg))\r\n throw msg;\r\n\r\n }\r\n\r\n function reportError(errorHandler, msg) {\r\n\r\n if (errorHandler && errorHandler.error && errorHandler.error(msg))\r\n throw msg;\r\n\r\n }\r\n\r\n function reportFatal(errorHandler, msg) {\r\n\r\n if (errorHandler && errorHandler.fatal)\r\n errorHandler.fatal(msg);\r\n\r\n throw msg;\r\n\r\n }\r\n\r\n /*\r\n * Binary search utility function\r\n * \r\n * @typedef {Object} BinarySearchResult\r\n * @property {boolean} found Was an exact match found?\r\n * @property {number} index Position of the exact match or insert position\r\n * \r\n * @returns {BinarySearchResult}\r\n */\r\n\r\n function indexOf(arr, searchval) {\r\n\r\n var min = 0;\r\n var max = arr.length - 1;\r\n var cur;\r\n\r\n while (min <= max) {\r\n\r\n cur = Math.floor((min + max) / 2);\r\n\r\n var curval = arr[cur];\r\n\r\n if (curval < searchval) {\r\n\r\n min = cur + 1;\r\n\r\n } else if (curval > searchval) {\r\n\r\n max = cur - 1;\r\n\r\n } else {\r\n\r\n return {found: true, index: cur};\r\n\r\n }\r\n\r\n }\r\n\r\n return {found: false, index: min};\r\n }\r\n\r\n\r\n})(typeof exports === 'undefined' ? this.imscDoc = {} : exports,\r\n typeof sax === 'undefined' ? require(\"sax\") : sax,\r\n typeof imscNames === 'undefined' ? require(\"./names\") : imscNames,\r\n typeof imscStyles === 'undefined' ? require(\"./styles\") : imscStyles,\r\n typeof imscUtils === 'undefined' ? require(\"./utils\") : imscUtils);\r\n","/* \r\n * Copyright (c) 2016, Pierre-Anthony Lemieux <pal@sandflow.com>\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions are met:\r\n *\r\n * * Redistributions of source code must retain the above copyright notice, this\r\n * list of conditions and the following disclaimer.\r\n * * Redistributions in binary form must reproduce the above copyright notice,\r\n * this list of conditions and the following disclaimer in the documentation\r\n * and/or other materials provided with the distribution.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\r\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\r\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r\n * POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n\r\n/**\r\n * @module imscHTML\r\n */\r\n\r\nvar browserIsFirefox = /firefox/i.test(navigator.userAgent);\r\n\r\n;\r\n(function (imscHTML, imscNames, imscStyles) {\r\n\r\n /**\r\n * Function that maps <pre>smpte:background</pre> URIs to URLs resolving to image resource\r\n * @callback IMGResolver\r\n * @param {string} <pre>smpte:background</pre> URI\r\n * @return {string} PNG resource URL\r\n */\r\n\r\n\r\n /**\r\n * Renders an ISD object (returned by <pre>generateISD()</pre>) into a \r\n * parent element, that must be attached to the DOM. The ISD will be rendered\r\n * into a child <pre>div</pre>\r\n * with heigh and width equal to the clientHeight and clientWidth of the element,\r\n * unless explicitly specified otherwise by the caller. Images URIs specified \r\n * by <pre>smpte:background</pre> attributes are mapped to image resource URLs\r\n * by an <pre>imgResolver</pre> function. The latter takes the value of <code>smpte:background</code>\r\n * attribute and an <code>img</code> DOM element as input, and is expected to\r\n * set the <code>src</code> attribute of the <code>img</code> to the absolute URI of the image.\r\n * <pre>displayForcedOnlyMode</pre> sets the (boolean)\r\n * value of the IMSC1 displayForcedOnlyMode parameter. The function returns\r\n * an opaque object that should passed in <code>previousISDState</code> when this function\r\n * is called for the next ISD, otherwise <code>previousISDState</code> should be set to \r\n * <code>null</code>.\r\n * \r\n * @param {Object} isd ISD to be rendered\r\n * @param {Object} element Element into which the ISD is rendered\r\n * @param {?IMGResolver} imgResolver Resolve <pre>smpte:background</pre> URIs into URLs.\r\n * @param {?number} eheight Height (in pixel) of the child <div>div</div> or null \r\n * to use clientHeight of the parent element\r\n * @param {?number} ewidth Width (in pixel) of the child <div>div</div> or null\r\n * to use clientWidth of the parent element\r\n * @param {?boolean} displayForcedOnlyMode Value of the IMSC1 displayForcedOnlyMode parameter,\r\n * or false if null \r\n * @param {?module:imscUtils.ErrorHandler} errorHandler Error callback\r\n * @param {Object} previousISDState State saved during processing of the previous ISD, or null if initial call\r\n * @param {?boolean} enableRollUp Enables roll-up animations (see CEA 708)\r\n * @return {Object} ISD state to be provided when this funtion is called for the next ISD\r\n */\r\n\r\n imscHTML.render = function (isd,\r\n element,\r\n imgResolver,\r\n eheight,\r\n ewidth,\r\n displayForcedOnlyMode,\r\n errorHandler,\r\n previousISDState,\r\n enableRollUp\r\n ) {\r\n\r\n /* maintain aspect ratio if specified */\r\n\r\n var height = eheight || element.clientHeight;\r\n var width = ewidth || element.clientWidth;\r\n\r\n if (isd.aspectRatio !== null) {\r\n\r\n var twidth = height * isd.aspectRatio;\r\n\r\n if (twidth > width) {\r\n\r\n height = Math.round(width / isd.aspectRatio);\r\n\r\n } else {\r\n\r\n width = twidth;\r\n\r\n }\r\n\r\n }\r\n\r\n var rootcontainer = document.createElement(\"div\");\r\n\r\n rootcontainer.style.position = \"relative\";\r\n rootcontainer.style.width = width + \"px\";\r\n rootcontainer.style.height = height + \"px\";\r\n rootcontainer.style.margin = \"auto\";\r\n rootcontainer.style.top = 0;\r\n rootcontainer.style.bottom = 0;\r\n rootcontainer.style.left = 0;\r\n rootcontainer.style.right = 0;\r\n rootcontainer.style.zIndex = 0;\r\n\r\n var context = {\r\n h: height,\r\n w: width,\r\n regionH: null,\r\n regionW: null,\r\n imgResolver: imgResolver,\r\n displayForcedOnlyMode: displayForcedOnlyMode || false,\r\n isd: isd,\r\n errorHandler: errorHandler,\r\n previousISDState: previousISDState,\r\n enableRollUp: enableRollUp || false,\r\n currentISDState: {},\r\n flg: null, /* current fillLineGap value if active, null otherwise */\r\n lp: null, /* current linePadding value if active, null otherwise */\r\n mra: null, /* current multiRowAlign value if active, null otherwise */\r\n ipd: null, /* inline progression direction (lr, rl, tb) */\r\n bpd: null, /* block progression direction (lr, rl, tb) */\r\n ruby: null, /* is ruby present in a <p> */\r\n textEmphasis: null, /* is textEmphasis present in a <p> */\r\n rubyReserve: null /* is rubyReserve applicable to a <p> */\r\n };\r\n\r\n element.appendChild(rootcontainer);\r\n\r\n if (\"contents\" in isd) {\r\n\r\n for (var i = 0; i < isd.contents.length; i++) {\r\n\r\n processElement(context, rootcontainer, isd.contents[i], isd);\r\n\r\n }\r\n\r\n }\r\n\r\n return context.currentISDState;\r\n\r\n };\r\n\r\n function processElement(context, dom_parent, isd_element, isd_parent) {\r\n\r\n var e;\r\n\r\n if (isd_element.kind === 'region') {\r\n\r\n e = document.createElement(\"div\");\r\n e.style.position = \"absolute\";\r\n\r\n } else if (isd_element.kind === 'body') {\r\n\r\n e = document.createElement(\"div\");\r\n\r\n } else if (isd_element.kind === 'div') {\r\n\r\n e = document.createElement(\"div\");\r\n\r\n } else if (isd_element.kind === 'image') {\r\n\r\n e = document.createElement(\"img\");\r\n\r\n if (context.imgResolver !== null && isd_element.src !== null) {\r\n\r\n var uri = context.imgResolver(isd_element.src, e);\r\n\r\n if (uri)\r\n e.src = uri;\r\n\r\n e.height = context.regionH;\r\n e.width = context.regionW;\r\n\r\n }\r\n\r\n } else if (isd_element.kind === 'p') {\r\n\r\n e = document.createElement(\"p\");\r\n\r\n } else if (isd_element.kind === 'span') {\r\n\r\n if (isd_element.styleAttrs[imscStyles.byName.ruby.qname] === \"container\") {\r\n\r\n e = document.createElement(\"ruby\");\r\n\r\n context.ruby = true;\r\n\r\n } else if (isd_element.styleAttrs[imscStyles.byName.ruby.qname] === \"base\") {\r\n\r\n e = document.createElement(\"span\"); // rb element is deprecated in HTML\r\n\r\n } else if (isd_element.styleAttrs[imscStyles.byName.ruby.qname] === \"text\") {\r\n\r\n e = document.createElement(\"rt\");\r\n\r\n\r\n } else if (isd_element.styleAttrs[imscStyles.byName.ruby.qname] === \"baseContainer\") {\r\n\r\n e = document.createElement(\"rbc\");\r\n\r\n\r\n } else if (isd_element.styleAttrs[imscStyles.byName.ruby.qname] === \"textContainer\") {\r\n\r\n e = document.createElement(\"rtc\");\r\n\r\n\r\n } else if (isd_element.styleAttrs[imscStyles.byName.ruby.qname] === \"delimiter\") {\r\n\r\n /* ignore rp */\r\n\r\n return;\r\n\r\n } else {\r\n\r\n e = document.createElement(\"span\");\r\n\r\n }\r\n\r\n //e.textContent = isd_element.text;\r\n\r\n } else if (isd_element.kind === 'br') {\r\n\r\n e = document.createElement(\"br\");\r\n\r\n }\r\n\r\n if (!e) {\r\n\r\n reportError(context.errorHandler, \"Error processing ISD element kind: \" + isd_element.kind);\r\n\r\n return;\r\n\r\n }\r\n\r\n /* set language */\r\n\r\n if (isd_element.lang) {\r\n\r\n if (isd_element.kind === 'region' || isd_element.lang !== isd_parent.lang) {\r\n e.lang = isd_element.lang;\r\n }\r\n\r\n }\r\n\r\n /* add to parent */\r\n\r\n dom_parent.appendChild(e);\r\n\r\n /* override UA default margin */\r\n /* TODO: should apply to <p> only */\r\n\r\n e.style.margin = \"0\";\r\n\r\n /* determine ipd and bpd */\r\n\r\n if (isd_element.kind === \"region\") {\r\n\r\n var wdir = isd_element.styleAttrs[imscStyles.byName.writingMode.qname];\r\n\r\n if (wdir === \"lrtb\" || wdir === \"lr\") {\r\n\r\n context.ipd = \"lr\";\r\n context.bpd = \"tb\";\r\n\r\n } else if (wdir === \"rltb\" || wdir === \"rl\") {\r\n\r\n context.ipd = \"rl\";\r\n context.bpd = \"tb\";\r\n\r\n } else if (wdir === \"tblr\") {\r\n\r\n context.ipd = \"tb\";\r\n context.bpd = \"lr\";\r\n\r\n } else if (wdir === \"tbrl\" || wdir === \"tb\") {\r\n\r\n context.ipd = \"tb\";\r\n context.bpd = \"rl\";\r\n\r\n }\r\n \r\n } else if (isd_element.kind === \"p\" && context.bpd === \"tb\") {\r\n\r\n var pdir = isd_element.styleAttrs[imscStyles.byName.direction.qname];\r\n\r\n context.ipd = pdir === \"ltr\" ? \"lr\" : \"rl\"; \r\n \r\n }\r\n\r\n /* tranform TTML styles to CSS styles */\r\n\r\n for (var i = 0; i < STYLING_MAP_DEFS.length; i++) {\r\n\r\n var sm = STYLING_MAP_DEFS[i];\r\n\r\n var attr = isd_element.styleAttrs[sm.qname];\r\n\r\n if (attr !== undefined && sm.map !== null) {\r\n\r\n sm.map(context, e, isd_element, attr);\r\n\r\n }\r\n\r\n }\r\n\r\n var proc_e = e;\r\n\r\n /* do we have linePadding ? */\r\n\r\n var lp = isd_element.styleAttrs[imscStyles.byName.linePadding.qname];\r\n\r\n if (lp && (! lp.isZero())) {\r\n\r\n var plength = lp.toUsedLength(context.w, context.h);\r\n\r\n\r\n if (plength > 0) {\r\n \r\n /* apply padding to the <p> so that line padding does not cause line wraps */\r\n\r\n var padmeasure = Math.ceil(plength) + \"px\";\r\n\r\n if (context.bpd === \"tb\") {\r\n\r\n proc_e.style.paddingLeft = padmeasure;\r\n proc_e.style.paddingRight = padmeasure;\r\n\r\n } else {\r\n\r\n proc_e.style.paddingTop = padmeasure;\r\n proc_e.style.paddingBottom = padmeasure;\r\n\r\n }\r\n\r\n context.lp = lp;\r\n }\r\n }\r\n\r\n // do we have multiRowAlign?\r\n\r\n var mra = isd_element.styleAttrs[imscStyles.byName.multiRowAlign.qname];\r\n\r\n if (mra && mra !== \"auto\") {\r\n\r\n /* create inline block to handle multirowAlign */\r\n\r\n var s = document.createElement(\"span\");\r\n\r\n s.style.display = \"inline-block\";\r\n\r\n s.style.textAlign = mra;\r\n\r\n e.appendChild(s);\r\n\r\n proc_e = s;\r\n\r\n context.mra = mra;\r\n\r\n }\r\n\r\n /* do we have rubyReserve? */\r\n\r\n var rr = isd_element.styleAttrs[imscStyles.byName.rubyReserve.qname];\r\n\r\n if (rr && rr[0] !== \"none\") {\r\n context.rubyReserve = rr;\r\n }\r\n\r\n\r\n /* remember we are filling line gaps */\r\n\r\n if (isd_element.styleAttrs[imscStyles.byName.fillLineGap.qname]) {\r\n context.flg = true;\r\n }\r\n\r\n\r\n if (isd_element.kind === \"span\" && isd_element.text) {\r\n\r\n var te = isd_element.styleAttrs[imscStyles.byName.textEmphasis.qname];\r\n\r\n if (te && te.style !== \"none\") {\r\n\r\n context.textEmphasis = true;\r\n\r\n }\r\n\r\n if (imscStyles.byName.textCombine.qname in isd_element.styleAttrs &&\r\n isd_element.styleAttrs[imscStyles.byName.textCombine.qname] === \"all\") {\r\n\r\n /* ignore tate-chu-yoku since line break cannot happen within */\r\n e.textContent = isd_element.text;\r\n e._isd_element = isd_element;\r\n\r\n if (te) {\r\n\r\n applyTextEmphasis(context, e, isd_element, te);\r\n\r\n };\r\n\r\n } else {\r\n\r\n // wrap characters in spans to find the line wrap locations\r\n\r\n var cbuf = '';\r\n\r\n for (var j = 0; j < isd_element.text.length; j++) {\r\n\r\n cbuf += isd_element.text.charAt(j);\r\n\r\n var cc = isd_element.text.charCodeAt(j);\r\n\r\n if (cc < 0xD800 || cc > 0xDBFF || j === isd_element.text.length - 1) {\r\n\r\n /* wrap the character(s) in a span unless it is a high surrogate */\r\n\r\n var span = document.createElement(\"span\");\r\n\r\n span.textContent = cbuf;\r\n\r\n /* apply textEmphasis */\r\n \r\n if (te) {\r\n\r\n applyTextEmphasis(context, span, isd_element, te);\r\n\r\n };\r\n \r\n e.appendChild(span);\r\n\r\n cbuf = '';\r\n\r\n //For the sake of merging these back together, record what isd element generated it.\r\n span._isd_element = isd_element;\r\n }\r\n\r\n }\r\n\r\n }\r\n }\r\n\r\n /* process the children of the ISD element */\r\n\r\n if (\"contents\" in isd_element) {\r\n\r\n for (var k = 0; k < isd_element.contents.length; k++) {\r\n\r\n processElement(context, proc_e, isd_element.contents[k], isd_element);\r\n\r\n }\r\n\r\n }\r\n\r\n /* list of lines */\r\n\r\n var linelist = [];\r\n\r\n\r\n /* paragraph processing */\r\n /* TODO: linePadding only supported for horizontal scripts */\r\n\r\n if (isd_element.kind === \"p\") {\r\n\r\n constructLineList(context, proc_e, linelist, null);\r\n\r\n /* apply rubyReserve */\r\n\r\n if (context.rubyReserve) {\r\n\r\n applyRubyReserve(linelist, context);\r\n\r\n context.rubyReserve = null;\r\n\r\n }\r\n\r\n /* apply tts:rubyPosition=\"outside\" */\r\n\r\n if (context.ruby || context.rubyReserve) {\r\n\r\n applyRubyPosition(linelist, context);\r\n\r\n context.ruby = null;\r\n\r\n }\r\n\r\n /* apply text emphasis \"outside\" position */\r\n\r\n if (context.textEmphasis) {\r\n\r\n applyTextEmphasisOutside(linelist, context);\r\n\r\n context.textEmphasis = null;\r\n\r\n }\r\n\r\n /* insert line breaks for multirowalign */\r\n\r\n if (context.mra) {\r\n\r\n applyMultiRowAlign(linelist);\r\n\r\n context.mra = null;\r\n\r\n }\r\n\r\n /* add linepadding */\r\n\r\n if (context.lp) {\r\n\r\n applyLinePadding(linelist, context.lp.toUsedLength(context.w, context.h), context);\r\n\r\n context.lp = null;\r\n\r\n }\r\n\r\n mergeSpans(linelist, context); // The earlier we can do this the less processing there will be.\r\n\r\n /* fill line gaps linepadding */\r\n\r\n if (context.flg) {\r\n\r\n var par_edges = rect2edges(proc_e.getBoundingClientRect(), context);\r\n\r\n applyFillLineGap(linelist, par_edges.before, par_edges.after, context, proc_e);\r\n\r\n context.flg = null;\r\n\r\n }\r\n\r\n }\r\n\r\n\r\n /* region processing */\r\n\r\n if (isd_element.kind === \"region\") {\r\n\r\n /* perform roll up if needed */\r\n if ((context.bpd === \"tb\") &&\r\n context.enableRollUp &&\r\n isd_element.contents.length > 0 &&\r\n isd_element.styleAttrs[imscStyles.byName.displayAlign.qname] === 'after') {\r\n\r\n /* build line list */\r\n constructLineList(context, proc_e, linelist, null);\r\n\r\n /* horrible hack, perhaps default region id should be underscore everywhere? */\r\n\r\n var rid = isd_element.id === '' ? '_' : isd_element.id;\r\n\r\n var rb = new RegionPBuffer(rid, linelist);\r\n\r\n context.currentISDState[rb.id] = rb;\r\n\r\n if (context.previousISDState &&\r\n rb.id in context.previousISDState &&\r\n context.previousISDState[rb.id].plist.length > 0 &&\r\n rb.plist.length > 1 &&\r\n rb.plist[rb.plist.length - 2].text ===\r\n context.previousISDState[rb.id].plist[context.previousISDState[rb.id].plist.length - 1].text) {\r\n\r\n var body_elem = e.firstElementChild;\r\n\r\n var h = rb.plist[rb.plist.length - 1].after - rb.plist[rb.plist.length - 1].before;\r\n\r\n body_elem.style.bottom = \"-\" + h + \"px\";\r\n body_elem.style.transition = \"transform 0.4s\";\r\n body_elem.style.position = \"relative\";\r\n body_elem.style.transform = \"translateY(-\" + h + \"px)\";\r\n\r\n }\r\n\r\n }\r\n }\r\n }\r\n\r\n function mergeSpans(lineList, context) {\r\n\r\n for (var i = 0; i < lineList.length; i++) {\r\n\r\n var line = lineList[i];\r\n\r\n for (var j = 1; j < line.elements.length;) {\r\n\r\n var previous = line.elements[j - 1];\r\n var span = line.elements[j];\r\n\r\n if (spanMerge(previous.node, span.node, context)) {\r\n\r\n //removed from DOM by spanMerge(), remove from the list too.\r\n line.elements.splice(j, 1);\r\n continue;\r\n\r\n } else {\r\n\r\n j++;\r\n\r\n }\r\n\r\n }\r\n }\r\n\r\n // Copy backgroundColor to each span so that fillLineGap will apply padding to elements with the right background\r\n var thisNode, ancestorBackgroundColor;\r\n var clearTheseBackgrounds = [];\r\n\r\n for (var l = 0; l < lineList.length; l++) {\r\n\r\n for (var el = 0; el < lineList[l].elements.length; el++) {\r\n\r\n thisNode = lineList[l].elements[el].node;\r\n ancestorBackgroundColor = getSpanAncestorColor(thisNode, clearTheseBackgrounds, false);\r\n\r\n if (ancestorBackgroundColor) {\r\n\r\n thisNode.style.backgroundColor = ancestorBackgroundColor;\r\n\r\n }\r\n }\r\n }\r\n\r\n for (var bi = 0; bi < clearTheseBackgrounds.length; bi++) {\r\n\r\n clearTheseBackgrounds[bi].style.backgroundColor = \"\";\r\n\r\n }\r\n }\r\n\r\n function getSpanAncestorColor(element, ancestorList, isAncestor) {\r\n\r\n if (element.style.backgroundColor) {\r\n\r\n if (isAncestor && !ancestorList.includes(element)) {\r\n\r\n ancestorList.push(element);\r\n\r\n }\r\n return element.style.backgroundColor;\r\n\r\n } else {\r\n\r\n if (element.parentElement.nodeName === \"SPAN\" ||\r\n element.parentElement.nodeName === \"RUBY\" ||\r\n element.parentElement.nodeName === \"RBC\" ||\r\n element.parentElement.nodeName === \"RTC\" ||\r\n element.parentElement.nodeName === \"RT\") {\r\n\r\n return getSpanAncestorColor(element.parentElement, ancestorList, true);\r\n\r\n }\r\n\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n function spanMerge(first, second, context) {\r\n\r\n if (first.tagName === \"SPAN\" &&\r\n second.tagName === \"SPAN\" &&\r\n first._isd_element === second._isd_element) {\r\n if (! first._isd_element) {\r\n /* we should never get here since every span should have a source ISD element */\r\n reportError(context.errorHandler, \"Internal error: HTML span is not linked to a source element; cannot merge spans.\");\r\n return false;\r\n }\r\n\r\n first.textContent += second.textContent;\r\n\r\n for (var i = 0; i < second.style.length; i++) {\r\n\r\n var styleName = second.style[i];\r\n if (styleName.indexOf(\"border\") >= 0 || \r\n styleName.indexOf(\"padding\") >= 0 ||\r\n styleName.indexOf(\"margin\") >= 0) {\r\n\r\n first.style[styleName] = second.style[styleName];\r\n\r\n }\r\n }\r\n\r\n second.parentElement.removeChild(second);\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n function applyLinePadding(lineList, lp, context) {\r\n\r\n if (lineList === null) return;\r\n\r\n for (var i = 0; i < lineList.length; i++) {\r\n\r\n var l = lineList[i].elements.length;\r\n\r\n var pospadpxlen = Math.ceil(lp) + \"px\";\r\n\r\n var negpadpxlen = \"-\" + Math.ceil(lp) + \"px\";\r\n\r\n if (l !== 0) {\r\n\r\n var se = lineList[i].elements[lineList[i].start_elem];\r\n\r\n var ee = lineList[i].elements[lineList[i].end_elem];\r\n\r\n if (se === ee) {\r\n\r\n // Check to see if there's any background at all\r\n var elementBoundingRect = se.node.getBoundingClientRect();\r\n \r\n if (elementBoundingRect.width == 0 || elementBoundingRect.height == 0) {\r\n\r\n // There's no background on this line, move on.\r\n continue;\r\n\r\n }\r\n\r\n }\r\n\r\n // Start element\r\n if (context.ipd === \"lr\") {\r\n\r\n se.node.style.marginLeft = negpadpxlen;\r\n se.node.style.paddingLeft = pospadpxlen;\r\n\r\n } else if (context.ipd === \"rl\") {\r\n\r\n se.node.style.paddingRight = pospadpxlen;\r\n se.node.style.marginRight = negpadpxlen;\r\n\r\n } else if (context.ipd === \"tb\") {\r\n\r\n se.node.style.paddingTop = pospadpxlen;\r\n se.node.style.marginTop = negpadpxlen;\r\n\r\n }\r\n\r\n // End element\r\n if (context.ipd === \"lr\") {\r\n\r\n // Firefox has a problem with line-breaking when a negative margin is applied.\r\n // The positioning will be wrong but don't apply when on firefox.\r\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1502610\r\n if (!browserIsFirefox) {\r\n ee.node.style.marginRight = negpadpxlen;\r\n }\r\n ee.node.style.paddingRight = pospadpxlen;\r\n\r\n } else if (context.ipd === \"rl\") {\r\n\r\n ee.node.style.paddingLeft = pospadpxlen;\r\n if (!browserIsFirefox) {\r\n ee.node.style.marginLeft = negpadpxlen;\r\n }\r\n\r\n } else if (context.ipd === \"tb\") {\r\n\r\n ee.node.style.paddingBottom = pospadpxlen;\r\n ee.node.style.marginBottom = negpadpxlen;\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n function applyMultiRowAlign(lineList) {\r\n\r\n /* apply an explicit br to all but the last line */\r\n\r\n for (var i = 0; i < lineList.length - 1; i++) {\r\n\r\n var l = lineList[i].elements.length;\r\n\r\n if (l !== 0 && lineList[i].br === false) {\r\n var br = document.createElement(\"br\");\r\n\r\n var lastnode = lineList[i].elements[l - 1].node;\r\n\r\n lastnode.parentElement.insertBefore(br, lastnode.nextSibling);\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n function applyTextEmphasisOutside(lineList, context) {\r\n\r\n /* supports \"outside\" only */\r\n\r\n for (var i = 0; i < lineList.length; i++) {\r\n\r\n for (var j = 0; j < lineList[i].te.length; j++) {\r\n\r\n /* skip if position already set */\r\n\r\n if (lineList[i].te[j].style[TEXTEMPHASISPOSITION_PROP] &&\r\n lineList[i].te[j].style[TEXTEMPHASISPOSITION_PROP] !== \"none\")\r\n continue;\r\n\r\n var pos;\r\n\r\n if (context.bpd === \"tb\") {\r\n\r\n pos = (i === 0) ? \"left over\" : \"left under\";\r\n\r\n\r\n } else {\r\n\r\n if (context.bpd === \"rl\") {\r\n\r\n pos = (i === 0) ? \"right under\" : \"left under\";\r\n\r\n } else {\r\n\r\n pos = (i === 0) ? \"left under\" : \"right under\";\r\n\r\n }\r\n\r\n }\r\n\r\n lineList[i].te[j].style[TEXTEMPHASISPOSITION_PROP] = pos;\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n function applyRubyPosition(lineList, context) {\r\n\r\n for (var i = 0; i < lineList.length; i++) {\r\n\r\n for (var j = 0; j < lineList[i].rbc.length; j++) {\r\n\r\n /* skip if ruby-position already set */\r\n\r\n if (lineList[i].rbc[j].style[RUBYPOSITION_PROP])\r\n continue;\r\n\r\n var pos;\r\n\r\n if (RUBYPOSITION_ISWK) {\r\n\r\n /* WebKit exception */\r\n\r\n pos = (i === 0) ? \"before\" : \"after\";\r\n\r\n } else if (context.bpd === \"tb\") {\r\n\r\n pos = (i === 0) ? \"over\" : \"under\";\r\n\r\n\r\n } else {\r\n\r\n if (context.bpd === \"rl\") {\r\n\r\n pos = (i === 0) ? \"over\" : \"under\";\r\n\r\n } else {\r\n\r\n pos = (i === 0) ? \"under\" : \"over\";\r\n\r\n }\r\n\r\n }\r\n\r\n lineList[i].rbc[j].style[RUBYPOSITION_PROP] = pos;\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n function applyRubyReserve(lineList, context) {\r\n\r\n for (var i = 0; i < lineList.length; i++) {\r\n\r\n var ruby = document.createElement(\"ruby\");\r\n\r\n var rb = document.createElement(\"span\"); // rb element is deprecated in HTML\r\n rb.textContent = \"\\u200B\";\r\n\r\n ruby.appendChild(rb);\r\n\r\n var rt1;\r\n var rt2;\r\n\r\n var fs = context.rubyReserve[1].toUsedLength(context.w, context.h) + \"px\";\r\n\r\n if (context.rubyReserve[0] === \"both\" || (context.rubyReserve[0] === \"outside\" && lineList.length == 1)) {\r\n\r\n rt1 = document.createElement(\"rtc\");\r\n rt1.style[RUBYPOSITION_PROP] = RUBYPOSITION_ISWK ? \"after\" : \"under\";\r\n rt1.textContent = \"\\u200B\";\r\n rt1.style.fontSize = fs;\r\n\r\n rt2 = document.createElement(\"rtc\");\r\n rt2.style[RUBYPOSITION_PROP] = RUBYPOSITION_ISWK ? \"before\" : \"over\";\r\n rt2.textContent = \"\\u200B\";\r\n rt2.style.fontSize = fs;\r\n\r\n ruby.appendChild(rt1);\r\n ruby.appendChild(rt2);\r\n\r\n } else {\r\n\r\n rt1 = document.createElement(\"rtc\");\r\n rt1.textContent = \"\\u200B\";\r\n rt1.style.fontSize = fs;\r\n\r\n var pos;\r\n\r\n if (context.rubyReserve[0] === \"after\" || (context.rubyReserve[0] === \"outside\" && i > 0)) {\r\n\r\n pos = RUBYPOSITION_ISWK ? \"after\" : ((context.bpd === \"tb\" || context.bpd === \"rl\") ? \"under\" : \"over\");\r\n\r\n } else {\r\n\r\n pos = RUBYPOSITION_ISWK ? \"before\" : ((context.bpd === \"tb\" || context.bpd === \"rl\") ? \"over\" : \"under\");\r\n\r\n }\r\n\r\n rt1.style[RUBYPOSITION_PROP] = pos;\r\n\r\n ruby.appendChild(rt1);\r\n\r\n }\r\n\r\n /* add in front of the first ruby element of the line, if it exists */\r\n\r\n var sib = null;\r\n\r\n for (var j = 0; j < lineList[i].rbc.length; j++) {\r\n\r\n if (lineList[i].rbc[j].localName === 'ruby') {\r\n\r\n sib = lineList[i].rbc[j];\r\n\r\n /* copy specified style properties from the sibling ruby container */\r\n \r\n for (var k = 0; k < sib.style.length; k++) {\r\n\r\n ruby.style.setProperty(sib.style.item(k), sib.style.getPropertyValue(sib.style.item(k)));\r\n\r\n }\r\n\r\n break;\r\n }\r\n\r\n }\r\n\r\n /* otherwise add before first span */\r\n\r\n sib = sib || lineList[i].elements[0].node;\r\n\r\n sib.parentElement.insertBefore(ruby, sib);\r\n\r\n }\r\n\r\n }\r\n\r\n function applyFillLineGap(lineList, par_before, par_after, context, element) {\r\n\r\n /* positive for BPD = lr and tb, negative for BPD = rl */\r\n var s = Math.sign(par_after - par_before);\r\n\r\n for (var i = 0; i <= lineList.length; i++) {\r\n\r\n /* compute frontier between lines */\r\n\r\n var frontier;\r\n\r\n if (i === 0) {\r\n\r\n frontier = Math.round(par_before);\r\n\r\n } else if (i === lineList.length) {\r\n\r\n frontier = Math.round(par_after);\r\n\r\n } else {\r\n\r\n frontier = Math.round((lineList[i - 1].after + lineList[i].before) / 2);\r\n\r\n }\r\n\r\n var padding;\r\n var l,thisNode;\r\n\r\n /* before line */\r\n if (i > 0) {\r\n\r\n if (lineList[i-1]) {\r\n\r\n for (l = 0; l < lineList[i - 1].elements.length; l++) {\r\n\r\n thisNode=lineList[i - 1].elements[l];\r\n padding = s*(frontier-thisNode.after) + \"px\";\r\n\r\n if (context.bpd === \"lr\") {\r\n\r\n thisNode.node.style.paddingRight = padding;\r\n\r\n } else if (context.bpd === \"rl\") {\r\n\r\n thisNode.node.style.paddingLeft = padding;\r\n\r\n } else if (context.bpd === \"tb\") {\r\n\r\n thisNode.node.style.paddingBottom = padding;\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n /* after line */\r\n if (i < lineList.length) {\r\n\r\n for (l = 0; l < lineList[i].elements.length; l++) {\r\n\r\n thisNode = lineList[i].elements[l];\r\n padding = s * (thisNode.before - frontier) + \"px\";\r\n\r\n if (context.bpd === \"lr\") {\r\n\r\n thisNode.node.style.paddingLeft = padding;\r\n\r\n } else if (context.bpd === \"rl\") {\r\n\r\n thisNode.node.style.paddingRight = padding;\r\n\r\n } else if (context.bpd === \"tb\") {\r\n\r\n thisNode.node.style.paddingTop = padding;\r\n\r\n }\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n function RegionPBuffer(id, lineList) {\r\n\r\n this.id = id;\r\n\r\n this.plist = lineList;\r\n\r\n }\r\n\r\n function rect2edges(rect, context) {\r\n\r\n var edges = {before: null, after: null, start: null, end: null};\r\n\r\n if (context.bpd === \"tb\") {\r\n\r\n edges.before = rect.top;\r\n edges.after = rect.bottom;\r\n\r\n if (context.ipd === \"lr\") {\r\n\r\n edges.start = rect.left;\r\n edges.end = rect.right;\r\n\r\n } else {\r\n\r\n edges.start = rect.right;\r\n edges.end = rect.left;\r\n }\r\n\r\n } else if (context.bpd === \"lr\") {\r\n\r\n edges.before = rect.left;\r\n edges.after = rect.right;\r\n edges.start = rect.top;\r\n edges.end = rect.bottom;\r\n\r\n } else if (context.bpd === \"rl\") {\r\n\r\n edges.before = rect.right;\r\n edges.after = rect.left;\r\n edges.start = rect.top;\r\n edges.end = rect.bottom;\r\n\r\n }\r\n\r\n return edges;\r\n\r\n }\r\n\r\n function constructLineList(context, element, llist, bgcolor) {\r\n\r\n if (element.localName === \"rt\" || element.localName === \"rtc\") {\r\n\r\n /* skip ruby annotations */\r\n\r\n return;\r\n\r\n }\r\n\r\n var curbgcolor = element.style.backgroundColor || bgcolor;\r\n\r\n if (element.childElementCount === 0) {\r\n\r\n if (element.localName === 'span' || element.localName === 'rb') {\r\n\r\n var r = element.getBoundingClientRect();\r\n\r\n var edges = rect2edges(r, context);\r\n\r\n if (llist.length === 0 ||\r\n (!isSameLine(edges.before, edges.after, llist[llist.length - 1].before, llist[llist.length - 1].after))\r\n ) {\r\n llist.push({\r\n before: edges.before,\r\n after: edges.after,\r\n start: edges.start,\r\n end: edges.end,\r\n start_elem: 0,\r\n end_elem: 0,\r\n elements: [],\r\n rbc: [],\r\n te: [],\r\n text: \"\",\r\n br: false\r\n });\r\n\r\n } else {\r\n\r\n /* positive for BPD = lr and tb, negative for BPD = rl */\r\n var bpd_dir = Math.sign(edges.after - edges.before);\r\n\r\n /* positive for IPD = lr and tb, negative for IPD = rl */\r\n var ipd_dir = Math.sign(edges.end - edges.start);\r\n\r\n /* check if the line height has increased */\r\n\r\n if (bpd_dir * (edges.before - llist[llist.length - 1].before) < 0) {\r\n llist[llist.length - 1].before = edges.before;\r\n }\r\n\r\n if (bpd_dir * (edges.after - llist[llist.length - 1].after) > 0) {\r\n llist[llist.length - 1].after = edges.after;\r\n }\r\n\r\n if (ipd_dir * (edges.start - llist[llist.length - 1].start) < 0) {\r\n llist[llist.length - 1].start = edges.start;\r\n llist[llist.length - 1].start_elem = llist[llist.length - 1].elements.length;\r\n }\r\n\r\n if (ipd_dir * (edges.end - llist[llist.length - 1].end) > 0) {\r\n llist[llist.length - 1].end = edges.end;\r\n llist[llist.length - 1].end_elem = llist[llist.length - 1].elements.length;\r\n }\r\n\r\n }\r\n\r\n llist[llist.length - 1].text += element.textContent;\r\n\r\n llist[llist.length - 1].elements.push(\r\n {\r\n node: element,\r\n bgcolor: curbgcolor,\r\n before: edges.before,\r\n after: edges.after\r\n }\r\n );\r\n\r\n } else if (element.localName === 'br' && llist.length !== 0) {\r\n\r\n llist[llist.length - 1].br = true;\r\n\r\n }\r\n\r\n } else {\r\n\r\n var child = element.firstChild;\r\n\r\n while (child) {\r\n\r\n if (child.nodeType === Node.ELEMENT_NODE) {\r\n\r\n constructLineList(context, child, llist, curbgcolor);\r\n\r\n if (child.localName === 'ruby' || child.localName === 'rtc') {\r\n\r\n /* remember non-empty ruby and rtc elements so that tts:rubyPosition can be applied */\r\n\r\n if (llist.length > 0) {\r\n\r\n llist[llist.length - 1].rbc.push(child);\r\n\r\n }\r\n\r\n } else if (child.localName === 'span' &&\r\n child.style[TEXTEMPHASISSTYLE_PROP] &&\r\n child.style[TEXTEMPHASISSTYLE_PROP] !== \"none\") {\r\n\r\n /* remember non-empty span elements with textEmphasis */\r\n\r\n if (llist.length > 0) {\r\n\r\n llist[llist.length - 1].te.push(child);\r\n\r\n }\r\n\r\n }\r\n \r\n\r\n }\r\n\r\n child = child.nextSibling;\r\n }\r\n }\r\n\r\n }\r\n\r\n function isSameLine(before1, after1, before2, after2) {\r\n\r\n return ((after1 < after2) && (before1 > before2)) || ((after2 <= after1) && (before2 >= before1));\r\n\r\n }\r\n\r\n function applyTextEmphasis(context, dom_element, isd_element, attr) {\r\n\r\n /* ignore color (not used in IMSC 1.1) */\r\n\r\n if (attr.style === \"none\") {\r\n\r\n /* text-emphasis is not inherited and the default is none, so nothing to do */\r\n \r\n return;\r\n \r\n } else if (attr.style === \"auto\") {\r\n\r\n dom_element.style[TEXTEMPHASISSTYLE_PROP] = \"filled\";\r\n \r\n } else {\r\n\r\n dom_element.style[TEXTEMPHASISSTYLE_PROP] = attr.style + \" \" + attr.symbol;\r\n }\r\n\r\n /* ignore \"outside\" position (set in postprocessing) */\r\n\r\n if (attr.position === \"before\" || attr.position === \"after\") {\r\n\r\n var pos;\r\n\r\n if (context.bpd === \"tb\") {\r\n\r\n pos = (attr.position === \"before\") ? \"left over\" : \"left under\";\r\n\r\n\r\n } else {\r\n\r\n if (context.bpd === \"rl\") {\r\n\r\n pos = (attr.position === \"before\") ? \"right under\" : \"left under\";\r\n\r\n } else {\r\n\r\n pos = (attr.position === \"before\") ? \"left under\" : \"right under\";\r\n\r\n }\r\n\r\n }\r\n\r\n dom_element.style[TEXTEMPHASISPOSITION_PROP] = pos;\r\n }\r\n }\r\n\r\n function HTMLStylingMapDefinition(qName, mapFunc) {\r\n this.qname = qName;\r\n this.map = mapFunc;\r\n }\r\n\r\n var STYLING_MAP_DEFS = [\r\n\r\n new HTMLStylingMapDefinition(\r\n \"http://www.w3.org/ns/ttml#styling backgroundColor\",\r\n function (context, dom_element, isd_element, attr) {\r\n\r\n /* skip if transparent */\r\n if (attr[3] === 0)\r\n return;\r\n\r\n dom_element.style.backgroundColor = \"rgba(\" +\r\n attr[0].toString() + \",\" +\r\n attr[1].toString() + \",\" +\r\n attr[2].toString() + \",\" +\r\n (attr[3] / 255).toString() +\r\n \")\";\r\n }\r\n ),\r\n new HTMLStylingMapDefinition(\r\n \"http://www.w3.org/ns/ttml#styling color\",\r\n function (context, dom_element, isd_element, attr) {\r\n dom_element.style.color = \"rgba(\" +\r\n attr[0].toString() + \",\" +\r\n attr[1].toString() + \",\" +\r\n attr[2].toString() + \",\" +\r\n (attr[3] / 255).toString() +\r\n \")\";\r\n }\r\n ),\r\n new HTMLStylingMapDefinition(\r\n \"http://www.w3.org/ns/ttml#styling direction\",\r\n function (context, dom_element, isd_element, attr) {\r\n\r\n dom_element.style.direction = attr;\r\n\r\n }\r\n ),\r\n new HTMLStylingMapDefinition(\r\n \"http://www.w3.org/ns/ttml#styling display\",\r\n function (context, dom_element, isd_element, attr) {}\r\n ),\r\n new HTMLStylingMapDefinition(\r\n \"http://www.w3.org/ns/ttml#styling displayAlign\",\r\n function (context, dom_element, isd_element, attr) {\r\n\r\n /* see https://css-tricks.com/snippets/css/a-guide-to-flexbox/ */\r\n\r\n /* TODO: is this affected by writing direction? */\r\n\r\n dom_element.style.display = \"flex\";\r\n dom_element.style.flexDirection = \"column\";\r\n\r\n\r\n if (attr === \"before\") {\r\n\r\n dom_element.style.justifyContent = \"flex-start\";\r\n\r\n } else if (attr === \"center\") {\r\n\r\n dom_element.style.justifyContent = \"center\";\r\n\r\n } else if (attr === \"after\") {\r\n\r\n dom_element.style.justifyContent = \"flex-end\";\r\n }\r\n\r\n }\r\n ),\r\n new HTMLStylingMapDefinition(\r\n \"http://www.w3.org/ns/ttml#styling extent\",\r\n function (context, dom_element, isd_element, attr) {\r\n /* TODO: this is super ugly */\r\n\r\n context.regionH = attr.h.toUsedLength(context.w, context.h);\r\n context.regionW = attr.w.toUsedLength(context.w, context.h);\r\n\r\n /* \r\n * CSS height/width are measured against the content rectangle,\r\n * whereas TTML height/width include padding\r\n */\r\n\r\n var hdelta = 0;\r\n var wdelta = 0;\r\n\r\n var p = isd_element.styleAttrs[\"http://www.w3.org/ns/ttml#styling padding\"];\r\n\r\n if (!p) {\r\n\r\n /* error */\r\n\r\n } else {\r\n\r\n hdelta = p[0].toUsedLength(context.w, context.h) + p[2].toUsedLength(context.w, context.h);\r\n wdelta = p[1].toUsedLength(context.w, context.h) + p[3].toUsedLength(context.w, context.h);\r\n\r\n }\r\n\r\n dom_element.style.height = (context.regionH - hdelta) + \"px\";\r\n dom_element.style.width = (context.regionW - wdelta) + \"px\";\r\n\r\n }\r\n ),\r\n new HTMLStylingMapDefinition(\r\n \"http://www.w3.org/ns/ttml#styling fontFamily\",\r\n function (context, dom_element, isd_element, attr) {\r\n\r\n var rslt = [];\r\n\r\n /* per IMSC1 */\r\n\r\n for (var i = 0; i < attr.length; i++) {\r\n attr[i] = attr[i].trim();\r\n\r\n if (attr[i] === \"monospaceSerif\") {\r\n\r\n rslt.push(\"Courier New\");\r\n rslt.push('\"Liberation Mono\"');\r\n rslt.push(\"Courier\");\r\n rslt.push(\"monospace\");\r\n\r\n } else if (attr[i] === \"proportionalSansSerif\") {\r\n\r\n rslt.push(\"Arial\");\r\n rslt.push(\"Helvetica\");\r\n rslt.push('\"Liberation Sans\"');\r\n rslt.push(\"sans-serif\");\r\n\r\n } else if (attr[i] === \"monospace\") {\r\n\r\n rslt.push(\"monospace\");\r\n\r\n } else if (attr[i] === \"sansSerif\") {\r\n\r\n rslt.push(\"sans-serif\");\r\n\r\n } else if (attr[i] === \"serif\") {\r\n\r\n rslt.push(\"serif\");\r\n\r\n } else if (attr[i] === \"monospaceSansSerif\") {\r\n\r\n rslt.push(\"Consolas\");\r\n rslt.push(\"monospace\");\r\n\r\n } else if (attr[i] === \"proportionalSerif\") {\r\n\r\n rslt.push(\"serif\");\r\n\r\n } else {\r\n\r\n rslt.push(attr[i]);\r\n\r\n }\r\n\r\n }\r\n\r\n // prune later duplicates we may have inserted \r\n if (rslt.length > 0) {\r\n\r\n var unique=[rslt[0]];\r\n\r\n for (var fi = 1; fi < rslt.length; fi++) {\r\n\r\n if (unique.indexOf(rslt[fi]) == -1) {\r\n\r\n unique.push(rslt[fi]);\r\n\r\n }\r\n }\r\n\r\n rslt = unique;\r\n }\r\n\r\n dom_element.style.fontFamily = rslt.join(\",\");\r\n }\r\n ),\r\n\r\n new HTMLStylingMapDefinition(\r\n \"http://www.w3.org/ns/ttml#styling shear\",\r\n function (context, dom_element, isd_element, attr) {\r\n\r\n /* return immediately if tts:shear is 0% since CSS transforms are not inherited*/\r\n\r\n if (attr === 0)\r\n return;\r\n\r\n var angle = attr * -0.9;\r\n\r\n /* context.bpd is needed since writing mode is not inherited and sets the inline progression */\r\n\r\n if (context.bpd === \"tb\") {\r\n\r\n dom_element.style.transform = \"skewX(\" + angle + \"deg)\";\r\n\r\n } else {\r\n\r\n dom_element.style.transform = \"skewY(\" + angle + \"deg)\";\r\n\r\n }\r\n\r\n }\r\n ),\r\n\r\n new HTMLStylingMapDefinition(\r\n \"http://www.w3.org/ns/ttml#styling fontSize\",\r\n function (context, dom_element, isd_element, attr) {\r\n dom_element.style.fontSize = attr.toUsedLength(context.w, context.h) + \"px\";\r\n }\r\n ),\r\n\r\n new HTMLStylingMapDefinition(\r\n \"http://www.w3.org/ns/ttml#styling fontStyle\",\r\n function (context, dom_element, isd_element, attr) {\r\n dom_element.style.fontStyle = attr;\r\n }\r\n ),\r\n new HTMLStylingMapDefinition(\r\n \"http://www.w3.org/ns/ttml#styling fontWeight\",\r\n function (context, dom_element, isd_element, attr) {\r\n dom_element.style.fontWeight = attr;\r\n }\r\n ),\r\n new HTMLStylingMapDefinition(\r\n \"http://www.w3.org/ns/ttml#styling lineHeight\",\r\n function (context, dom_element, isd_element, attr) {\r\n if (attr === \"normal\") {\r\n\r\n dom_element.style.lineHeight = \"normal\";\r\n\r\n } else {\r\n\r\n dom_element.style.lineHeight = attr.toUsedLength(context.w, context.h) + \"px\";\r\n }\r\n }\r\n ),\r\n new HTMLStylingMapDefinition(\r\n \"http://www.w3.org/ns/ttml#styling opacity\",\r\n function (context, dom_element, isd_element, attr) {\r\n dom_element.style.opacity = attr;\r\n }\r\n ),\r\n new HTMLStylingMapDefinition(\r\n \"http://www.w3.org/ns/ttml#styling origin\",\r\n function (context, dom_element, isd_element, attr) {\r\n dom_element.style.top = attr.h.toUsedLength(context.w, context.h) + \"px\";\r\n dom_element.style.left = attr.w.toUsedLength(context.w, context.h) + \"px\";\r\n }\r\n ),\r\n new HTMLStylingMapDefinition(\r\n \"http://www.w3.org/ns/ttml#styling overflow\",\r\n function (context, dom_element, isd_element, attr) {\r\n dom_element.style.overflow = attr;\r\n }\r\n ),\r\n new HTMLStylingMapDefinition(\r\n \"http://www.w3.org/ns/ttml#styling padding\",\r\n function (context, dom_element, isd_element, attr) {\r\n\r\n /* attr: top,left,bottom,right*/\r\n\r\n /* style: top right bottom left*/\r\n\r\n var rslt = [];\r\n\r\n rslt[0] = attr[0].toUsedLength(context.w, context.h) + \"px\";\r\n rslt[1] = attr[3].toUsedLength(context.w, context.h) + \"px\";\r\n rslt[2] = attr[2].toUsedLength(context.w, context.h) + \"px\";\r\n rslt[3] = attr[1].toUsedLength(context.w, context.h) + \"px\";\r\n\r\n dom_element.style.padding = rslt.join(\" \");\r\n }\r\n ),\r\n new HTMLStylingMapDefinition(\r\n \"http://www.w3.org/ns/ttml#styling position\",\r\n function (context, dom_element, isd_element, attr) {\r\n dom_element.style.top = attr.h.toUsedLength(context.w, context.h) + \"px\";\r\n dom_element.style.left = attr.w.toUsedLength(context.w, context.h) + \"px\";\r\n }\r\n ),\r\n new HTMLStylingMapDefinition(\r\n \"http://www.w3.org/ns/ttml#styling rubyAlign\",\r\n function (context, dom_element, isd_element, attr) {\r\n dom_element.style.rubyAlign = attr === \"spaceAround\" ? \"space-around\" : \"center\";\r\n }\r\n ),\r\n new HTMLStylingMapDefinition(\r\n \"http://www.w3.org/ns/ttml#styling rubyPosition\",\r\n function (context, dom_element, isd_element, attr) {\r\n\r\n /* skip if \"outside\", which is handled by applyRubyPosition() */\r\n\r\n if (attr === \"before\" || attr === \"after\") {\r\n\r\n var pos;\r\n\r\n if (RUBYPOSITION_ISWK) {\r\n\r\n /* WebKit exception */\r\n \r\n pos = attr;\r\n \r\n } else if (context.bpd === \"tb\") {\r\n\r\n pos = (attr === \"before\") ? \"over\" : \"under\";\r\n\r\n\r\n } else {\r\n\r\n if (context.bpd === \"rl\") {\r\n\r\n pos = (attr === \"before\") ? \"over\" : \"under\";\r\n\r\n } else {\r\n\r\n pos = (attr === \"before\") ? \"under\" : \"over\";\r\n\r\n }\r\n\r\n }\r\n\r\n /* apply position to the parent dom_element, i.e. ruby or rtc */\r\n\r\n dom_element.parentElement.style[RUBYPOSITION_PROP] = pos;\r\n }\r\n }\r\n ),\r\n new HTMLStylingMapDefinition(\r\n \"http://www.w3.org/ns/ttml#styling showBackground\",\r\n null\r\n ),\r\n new HTMLStylingMapDefinition(\r\n \"http://www.w3.org/ns/ttml#styling textAlign\",\r\n function (context, dom_element, isd_element, attr) {\r\n\r\n var ta;\r\n\r\n /* handle UAs that do not understand start or end */\r\n\r\n if (attr === \"start\") {\r\n\r\n ta = (context.ipd === \"rl\") ? \"right\" : \"left\";\r\n\r\n } else if (attr === \"end\") {\r\n\r\n ta = (context.ipd === \"rl\") ? \"left\" : \"right\";\r\n\r\n } else {\r\n\r\n ta = attr;\r\n\r\n }\r\n\r\n dom_element.style.textAlign = ta;\r\n\r\n }\r\n ),\r\n new HTMLStylingMapDefinition(\r\n \"http://www.w3.org/ns/ttml#styling textDecoration\",\r\n function (context, dom_element, isd_element, attr) {\r\n dom_element.style.textDecoration = attr.join(\" \").replace(\"lineThrough\", \"line-through\");\r\n }\r\n ),\r\n new HTMLStylingMapDefinition(\r\n \"http://www.w3.org/ns/ttml#styling textOutline\",\r\n function (context, dom_element, isd_element, attr) {\r\n\r\n /* defer to tts:textShadow */\r\n }\r\n ),\r\n new HTMLStylingMapDefinition(\r\n \"http://www.w3.org/ns/ttml#styling textShadow\",\r\n function (context, dom_element, isd_element, attr) {\r\n\r\n var txto = isd_element.styleAttrs[imscStyles.byName.textOutline.qname];\r\n\r\n if (attr === \"none\" && txto === \"none\") {\r\n\r\n dom_element.style.textShadow = \"\";\r\n\r\n } else {\r\n\r\n var s = [];\r\n\r\n if (txto !== \"none\") {\r\n\r\n /* emulate text outline */\r\n\r\n var to_color = \"rgba(\" +\r\n txto.color[0].toString() + \",\" +\r\n txto.color[1].toString() + \",\" +\r\n txto.color[2].toString() + \",\" +\r\n (txto.color[3] / 255).toString() +\r\n \")\";\r\n\r\n s.push( \"1px 1px 1px \" + to_color);\r\n s.push( \"-1px 1px 1px \" + to_color);\r\n s.push( \"1px -1px 1px \" + to_color);\r\n s.push( \"-1px -1px 1px \" + to_color);\r\n\r\n }\r\n\r\n /* add text shadow */\r\n\r\n if (attr !== \"none\") {\r\n\r\n for (var i = 0; i < attr.length; i++) {\r\n\r\n\r\n s.push(attr[i].x_off.toUsedLength(context.w, context.h) + \"px \" +\r\n attr[i].y_off.toUsedLength(context.w, context.h) + \"px \" +\r\n attr[i].b_radius.toUsedLength(context.w, context.h) + \"px \" +\r\n \"rgba(\" +\r\n attr[i].color[0].toString() + \",\" +\r\n attr[i].color[1].toString() + \",\" +\r\n attr[i].color[2].toString() + \",\" +\r\n (attr[i].color[3] / 255).toString() +\r\n \")\"\r\n );\r\n\r\n }\r\n\r\n }\r\n\r\n dom_element.style.textShadow = s.join(\",\");\r\n\r\n }\r\n }\r\n ),\r\n new HTMLStylingMapDefinition(\r\n \"http://www.w3.org/ns/ttml#styling textCombine\",\r\n function (context, dom_element, isd_element, attr) {\r\n\r\n dom_element.style.textCombineUpright = attr;\r\n\r\n }\r\n ),\r\n new HTMLStylingMapDefinition(\r\n \"http://www.w3.org/ns/ttml#styling textEmphasis\",\r\n function (context, dom_element, isd_element, attr) {\r\n\r\n /* applied as part of HTML document construction */\r\n\r\n }\r\n ),\r\n new HTMLStylingMapDefinition(\r\n \"http://www.w3.org/ns/ttml#styling unicodeBidi\",\r\n function (context, dom_element, isd_element, attr) {\r\n\r\n var ub;\r\n\r\n if (attr === 'bidiOverride') {\r\n ub = \"bidi-override\";\r\n } else {\r\n ub = attr;\r\n }\r\n\r\n dom_element.style.unicodeBidi = ub;\r\n }\r\n ),\r\n new HTMLStylingMapDefinition(\r\n \"http://www.w3.org/ns/ttml#styling visibility\",\r\n function (context, dom_element, isd_element, attr) {\r\n dom_element.style.visibility = attr;\r\n }\r\n ),\r\n new HTMLStylingMapDefinition(\r\n \"http://www.w3.org/ns/ttml#styling wrapOption\",\r\n function (context, dom_element, isd_element, attr) {\r\n\r\n if (attr === \"wrap\") {\r\n\r\n if (isd_element.space === \"preserve\") {\r\n dom_element.style.whiteSpace = \"pre-wrap\";\r\n } else {\r\n dom_element.style.whiteSpace = \"normal\";\r\n }\r\n\r\n } else {\r\n\r\n if (isd_element.space === \"preserve\") {\r\n\r\n dom_element.style.whiteSpace = \"pre\";\r\n\r\n } else {\r\n dom_element.style.whiteSpace = \"noWrap\";\r\n }\r\n\r\n }\r\n\r\n }\r\n ),\r\n new HTMLStylingMapDefinition(\r\n \"http://www.w3.org/ns/ttml#styling writingMode\",\r\n function (context, dom_element, isd_element, attr) {\r\n\r\n var wm;\r\n\r\n if (attr === \"lrtb\" || attr === \"lr\") {\r\n\r\n dom_element.style.writingMode = \"horizontal-tb\";\r\n\r\n } else if (attr === \"rltb\" || attr === \"rl\") {\r\n\r\n dom_element.style.writingMode = \"horizontal-tb\";\r\n\r\n } else if (attr === \"tblr\") {\r\n\r\n dom_element.style.writingMode = \"vertical-lr\";\r\n\r\n } else if (attr === \"tbrl\" || attr === \"tb\") {\r\n\r\n dom_element.style.writingMode = \"vertical-rl\";\r\n\r\n }\r\n\r\n }\r\n ),\r\n new HTMLStylingMapDefinition(\r\n \"http://www.w3.org/ns/ttml#styling zIndex\",\r\n function (context, dom_element, isd_element, attr) {\r\n dom_element.style.zIndex = attr;\r\n }\r\n ),\r\n new HTMLStylingMapDefinition(\r\n \"http://www.w3.org/ns/ttml/profile/imsc1#styling forcedDisplay\",\r\n function (context, dom_element, isd_element, attr) {\r\n\r\n if (context.displayForcedOnlyMode && attr === false) {\r\n dom_element.style.visibility = \"hidden\";\r\n }\r\n\r\n }\r\n )\r\n ];\r\n\r\n var STYLMAP_BY_QNAME = {};\r\n\r\n for (var i = 0; i < STYLING_MAP_DEFS.length; i++) {\r\n\r\n STYLMAP_BY_QNAME[STYLING_MAP_DEFS[i].qname] = STYLING_MAP_DEFS[i];\r\n }\r\n\r\n /* CSS property names */\r\n\r\n var RUBYPOSITION_ISWK = \"webkitRubyPosition\" in window.getComputedStyle(document.documentElement);\r\n\r\n var RUBYPOSITION_PROP = RUBYPOSITION_ISWK ? \"webkitRubyPosition\" : \"rubyPosition\";\r\n\r\n var TEXTEMPHASISSTYLE_PROP = \"webkitTextEmphasisStyle\" in window.getComputedStyle(document.documentElement) ? \"webkitTextEmphasisStyle\" : \"textEmphasisStyle\";\r\n\r\n var TEXTEMPHASISPOSITION_PROP = \"webkitTextEmphasisPosition\" in window.getComputedStyle(document.documentElement) ? \"webkitTextEmphasisPosition\" : \"textEmphasisPosition\";\r\n\r\n /* error utilities */\r\n\r\n function reportError(errorHandler, msg) {\r\n\r\n if (errorHandler && errorHandler.error && errorHandler.error(msg))\r\n throw msg;\r\n\r\n }\r\n\r\n})(typeof exports === 'undefined' ? this.imscHTML = {} : exports,\r\n typeof imscNames === 'undefined' ? require(\"./names\") : imscNames,\r\n typeof imscStyles === 'undefined' ? require(\"./styles\") : imscStyles,\r\n typeof imscUtils === 'undefined' ? require(\"./utils\") : imscUtils);\r\n","/* \r\n * Copyright (c) 2016, Pierre-Anthony Lemieux <pal@sandflow.com>\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions are met:\r\n *\r\n * * Redistributions of source code must retain the above copyright notice, this\r\n * list of conditions and the following disclaimer.\r\n * * Redistributions in binary form must reproduce the above copyright notice,\r\n * this list of conditions and the following disclaimer in the documentation\r\n * and/or other materials provided with the distribution.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\r\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\r\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r\n * POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n\r\n/**\r\n * @module imscISD\r\n */\r\n\r\n\r\n;\r\n(function (imscISD, imscNames, imscStyles, imscUtils) { // wrapper for non-node envs\r\n\r\n /** \r\n * Creates a canonical representation of an IMSC1 document returned by <pre>imscDoc.fromXML()</pre>\r\n * at a given absolute offset in seconds. This offset does not have to be one of the values returned\r\n * by <pre>getMediaTimeEvents()</pre>.\r\n * \r\n * @param {Object} tt IMSC1 document\r\n * @param {number} offset Absolute offset (in seconds)\r\n * @param {?module:imscUtils.ErrorHandler} errorHandler Error callback\r\n * @returns {Object} Opaque in-memory representation of an ISD\r\n */\r\n\r\n imscISD.generateISD = function (tt, offset, errorHandler) {\r\n\r\n /* TODO check for tt and offset validity */\r\n\r\n /* create the ISD object from the IMSC1 doc */\r\n\r\n var isd = new ISD(tt);\r\n\r\n /* context */\r\n\r\n var context = {\r\n\r\n /*rubyfs: []*/ /* font size of the nearest textContainer or container */\r\n\r\n };\r\n\r\n /* Filter body contents - Only process what we need within the offset and discard regions not applicable to the content */\r\n var body = {};\r\n var activeRegions = {};\r\n\r\n /* gather any regions that might have showBackground=\"always\" and show a background */\r\n var initialShowBackground = tt.head.styling.initials[imscStyles.byName.showBackground.qname];\r\n var initialbackgroundColor = tt.head.styling.initials[imscStyles.byName.backgroundColor.qname];\r\n for (var layout_child in tt.head.layout.regions)\r\n {\r\n if (tt.head.layout.regions.hasOwnProperty(layout_child)) {\r\n var region = tt.head.layout.regions[layout_child];\r\n var showBackground = region.styleAttrs[imscStyles.byName.showBackground.qname] || initialShowBackground;\r\n var backgroundColor = region.styleAttrs[imscStyles.byName.backgroundColor.qname] || initialbackgroundColor;\r\n activeRegions[region.id] = (\r\n (showBackground === 'always' || showBackground === undefined) &&\r\n backgroundColor !== undefined &&\r\n !(offset < region.begin || offset >= region.end)\r\n );\r\n }\r\n }\r\n\r\n /* If the body specifies a region, catch it, since no filtered content will */\r\n /* likely specify the region. */\r\n if (tt.body && tt.body.regionID) {\r\n activeRegions[tt.body.regionID] = true;\r\n }\r\n\r\n function filter(offset, element) {\r\n function offsetFilter(element) {\r\n return !(offset < element.begin || offset >= element.end); \r\n } \r\n \r\n if (element.contents) {\r\n var clone = {};\r\n for (var prop in element) {\r\n if (element.hasOwnProperty(prop)) {\r\n clone[prop] = element[prop];\r\n }\r\n }\r\n clone.contents = [];\r\n\r\n element.contents.filter(offsetFilter).forEach(function (el) {\r\n var filteredElement = filter(offset, el);\r\n if (filteredElement.regionID) {\r\n activeRegions[filteredElement.regionID] = true;\r\n }\r\n \r\n if (filteredElement !== null) {\r\n clone.contents.push(filteredElement);\r\n }\r\n });\r\n return clone;\r\n } else {\r\n return element;\r\n }\r\n }\r\n\r\n if (tt.body !== null) {\r\n body = filter(offset, tt.body);\r\n } else {\r\n body = null;\r\n }\r\n\r\n /* rewritten TTML will always have a default - this covers it. because the region is defaulted to \"\" */\r\n if (activeRegions[\"\"] !== undefined) {\r\n activeRegions[\"\"] = true;\r\n }\r\n\r\n /* process regions */ \r\n for (var regionID in activeRegions) {\r\n if (activeRegions[regionID]) {\r\n /* post-order traversal of the body tree per [construct intermediate document] */\r\n\r\n var c = isdProcessContentElement(tt, offset, tt.head.layout.regions[regionID], body, null, '', tt.head.layout.regions[regionID], errorHandler, context);\r\n\r\n if (c !== null) {\r\n\r\n /* add the region to the ISD */\r\n\r\n isd.contents.push(c.element);\r\n }\r\n }\r\n }\r\n\r\n return isd;\r\n };\r\n\r\n /* set of styles not applicable to ruby container spans */\r\n\r\n var _rcs_na_styles = [\r\n imscStyles.byName.color.qname,\r\n imscStyles.byName.textCombine.qname,\r\n imscStyles.byName.textDecoration.qname,\r\n imscStyles.byName.textEmphasis.qname,\r\n imscStyles.byName.textOutline.qname,\r\n imscStyles.byName.textShadow.qname\r\n ];\r\n\r\n function isdProcessContentElement(doc, offset, region, body, parent, inherited_region_id, elem, errorHandler, context) {\r\n\r\n /* prune if temporally inactive */\r\n\r\n if (offset < elem.begin || offset >= elem.end) {\r\n return null;\r\n }\r\n\r\n /* \r\n * set the associated region as specified by the regionID attribute, or the \r\n * inherited associated region otherwise\r\n */\r\n\r\n var associated_region_id = 'regionID' in elem && elem.regionID !== '' ? elem.regionID : inherited_region_id;\r\n\r\n /* prune the element if either:\r\n * - the element is not terminal and the associated region is neither the default\r\n * region nor the parent region (this allows children to be associated with a \r\n * region later on)\r\n * - the element is terminal and the associated region is not the parent region\r\n */\r\n\r\n /* TODO: improve detection of terminal elements since <region> has no contents */\r\n\r\n if (parent !== null /* are we in the region element */ &&\r\n associated_region_id !== region.id &&\r\n (\r\n (!('contents' in elem)) ||\r\n ('contents' in elem && elem.contents.length === 0) ||\r\n associated_region_id !== ''\r\n )\r\n )\r\n return null;\r\n\r\n /* create an ISD element, including applying specified styles */\r\n\r\n var isd_element = new ISDContentElement(elem);\r\n\r\n /* apply set (animation) styling */\r\n\r\n if (\"sets\" in elem) {\r\n for (var i = 0; i < elem.sets.length; i++) {\r\n\r\n if (offset < elem.sets[i].begin || offset >= elem.sets[i].end)\r\n continue;\r\n\r\n isd_element.styleAttrs[elem.sets[i].qname] = elem.sets[i].value;\r\n\r\n }\r\n }\r\n\r\n /* \r\n * keep track of specified styling attributes so that we\r\n * can compute them later\r\n */\r\n\r\n var spec_attr = {};\r\n\r\n for (var qname in isd_element.styleAttrs) {\r\n\r\n if (! isd_element.styleAttrs.hasOwnProperty(qname)) continue;\r\n\r\n spec_attr[qname] = true;\r\n\r\n /* special rule for tts:writingMode (section 7.29.1 of XSL)\r\n * direction is set consistently with writingMode only\r\n * if writingMode sets inline-direction to LTR or RTL \r\n */\r\n\r\n if (isd_element.kind === 'region' &&\r\n qname === imscStyles.byName.writingMode.qname &&\r\n !(imscStyles.byName.direction.qname in isd_element.styleAttrs)) {\r\n\r\n var wm = isd_element.styleAttrs[qname];\r\n\r\n if (wm === \"lrtb\" || wm === \"lr\") {\r\n\r\n isd_element.styleAttrs[imscStyles.byName.direction.qname] = \"ltr\";\r\n\r\n } else if (wm === \"rltb\" || wm === \"rl\") {\r\n\r\n isd_element.styleAttrs[imscStyles.byName.direction.qname] = \"rtl\";\r\n\r\n }\r\n\r\n }\r\n }\r\n\r\n /* inherited styling */\r\n\r\n if (parent !== null) {\r\n\r\n for (var j = 0; j < imscStyles.all.length; j++) {\r\n\r\n var sa = imscStyles.all[j];\r\n\r\n /* textDecoration has special inheritance rules */\r\n\r\n if (sa.qname === imscStyles.byName.textDecoration.qname) {\r\n\r\n /* handle both textDecoration inheritance and specification */\r\n\r\n var ps = parent.styleAttrs[sa.qname];\r\n var es = isd_element.styleAttrs[sa.qname];\r\n var outs = [];\r\n\r\n if (es === undefined) {\r\n\r\n outs = ps;\r\n\r\n } else if (es.indexOf(\"none\") === -1) {\r\n\r\n if ((es.indexOf(\"noUnderline\") === -1 &&\r\n ps.indexOf(\"underline\") !== -1) ||\r\n es.indexOf(\"underline\") !== -1) {\r\n\r\n outs.push(\"underline\");\r\n\r\n }\r\n\r\n if ((es.indexOf(\"noLineThrough\") === -1 &&\r\n ps.indexOf(\"lineThrough\") !== -1) ||\r\n es.indexOf(\"lineThrough\") !== -1) {\r\n\r\n outs.push(\"lineThrough\");\r\n\r\n }\r\n\r\n if ((es.indexOf(\"noOverline\") === -1 &&\r\n ps.indexOf(\"overline\") !== -1) ||\r\n es.indexOf(\"overline\") !== -1) {\r\n\r\n outs.push(\"overline\");\r\n\r\n }\r\n\r\n } else {\r\n\r\n outs.push(\"none\");\r\n\r\n }\r\n\r\n isd_element.styleAttrs[sa.qname] = outs;\r\n\r\n } else if (sa.qname === imscStyles.byName.fontSize.qname &&\r\n !(sa.qname in isd_element.styleAttrs) &&\r\n isd_element.kind === 'span' &&\r\n isd_element.styleAttrs[imscStyles.byName.ruby.qname] === \"textContainer\") {\r\n \r\n /* special inheritance rule for ruby text container font size */\r\n \r\n var ruby_fs = parent.styleAttrs[imscStyles.byName.fontSize.qname];\r\n\r\n isd_element.styleAttrs[sa.qname] = new imscUtils.ComputedLength(\r\n 0.5 * ruby_fs.rw,\r\n 0.5 * ruby_fs.rh);\r\n\r\n } else if (sa.qname === imscStyles.byName.fontSize.qname &&\r\n !(sa.qname in isd_element.styleAttrs) &&\r\n isd_element.kind === 'span' &&\r\n isd_element.styleAttrs[imscStyles.byName.ruby.qname] === \"text\") {\r\n \r\n /* special inheritance rule for ruby text font size */\r\n \r\n var parent_fs = parent.styleAttrs[imscStyles.byName.fontSize.qname];\r\n \r\n if (parent.styleAttrs[imscStyles.byName.ruby.qname] === \"textContainer\") {\r\n \r\n isd_element.styleAttrs[sa.qname] = parent_fs;\r\n \r\n } else {\r\n \r\n isd_element.styleAttrs[sa.qname] = new imscUtils.ComputedLength(\r\n 0.5 * parent_fs.rw,\r\n 0.5 * parent_fs.rh);\r\n }\r\n \r\n } else if (sa.inherit &&\r\n (sa.qname in parent.styleAttrs) &&\r\n !(sa.qname in isd_element.styleAttrs)) {\r\n\r\n isd_element.styleAttrs[sa.qname] = parent.styleAttrs[sa.qname];\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n /* initial value styling */\r\n\r\n for (var k = 0; k < imscStyles.all.length; k++) {\r\n \r\n var ivs = imscStyles.all[k];\r\n\r\n /* skip if value is already specified */\r\n\r\n if (ivs.qname in isd_element.styleAttrs) continue;\r\n\r\n /* skip tts:position if tts:origin is specified */\r\n\r\n if (ivs.qname === imscStyles.byName.position.qname &&\r\n imscStyles.byName.origin.qname in isd_element.styleAttrs)\r\n continue;\r\n\r\n /* skip tts:origin if tts:position is specified */\r\n\r\n if (ivs.qname === imscStyles.byName.origin.qname &&\r\n imscStyles.byName.position.qname in isd_element.styleAttrs)\r\n continue;\r\n \r\n /* determine initial value */\r\n \r\n var iv = doc.head.styling.initials[ivs.qname] || ivs.initial;\r\n\r\n if (iv === null) {\r\n /* skip processing if no initial value defined */\r\n\r\n continue;\r\n }\r\n\r\n /* apply initial value to elements other than region only if non-inherited */\r\n\r\n if (isd_element.kind === 'region' || (ivs.inherit === false && iv !== null)) {\r\n\r\n var piv = ivs.parse(iv);\r\n\r\n if (piv !== null) {\r\n\r\n isd_element.styleAttrs[ivs.qname] = piv;\r\n\r\n /* keep track of the style as specified */\r\n\r\n spec_attr[ivs.qname] = true;\r\n\r\n } else {\r\n\r\n reportError(errorHandler, \"Invalid initial value for '\" + ivs.qname + \"' on element '\" + isd_element.kind);\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n /* compute styles (only for non-inherited styles) */\r\n /* TODO: get rid of spec_attr */\r\n\r\n for (var z = 0; z < imscStyles.all.length; z++) {\r\n \r\n var cs = imscStyles.all[z];\r\n\r\n if (!(cs.qname in spec_attr)) continue;\r\n\r\n if (cs.compute !== null) {\r\n\r\n var cstyle = cs.compute(\r\n /*doc, parent, element, attr, context*/\r\n doc,\r\n parent,\r\n isd_element,\r\n isd_element.styleAttrs[cs.qname],\r\n context\r\n );\r\n\r\n if (cstyle !== null) {\r\n\r\n isd_element.styleAttrs[cs.qname] = cstyle;\r\n \r\n } else {\r\n /* if the style cannot be computed, replace it by its initial value */\r\n\r\n isd_element.styleAttrs[cs.qname] = cs.compute(\r\n /*doc, parent, element, attr, context*/\r\n doc,\r\n parent,\r\n isd_element,\r\n cs.parse(cs.initial),\r\n context\r\n );\r\n\r\n reportError(errorHandler, \"Style '\" + cs.qname + \"' on element '\" + isd_element.kind + \"' cannot be computed\");\r\n }\r\n }\r\n\r\n }\r\n\r\n /* prune if tts:display is none */\r\n\r\n if (isd_element.styleAttrs[imscStyles.byName.display.qname] === \"none\")\r\n return null;\r\n\r\n /* process contents of the element */\r\n\r\n var contents = null;\r\n\r\n if (parent === null) {\r\n\r\n /* we are processing the region */\r\n\r\n if (body === null) {\r\n\r\n /* if there is no body, still process the region but with empty content */\r\n\r\n contents = [];\r\n\r\n } else {\r\n\r\n /*use the body element as contents */\r\n\r\n contents = [body];\r\n\r\n }\r\n\r\n } else if ('contents' in elem) {\r\n\r\n contents = elem.contents;\r\n\r\n }\r\n\r\n for (var x = 0; contents !== null && x < contents.length; x++) {\r\n\r\n var c = isdProcessContentElement(doc, offset, region, body, isd_element, associated_region_id, contents[x], errorHandler, context);\r\n\r\n /* \r\n * keep child element only if they are non-null and their region match \r\n * the region of this element\r\n */\r\n\r\n if (c !== null) {\r\n\r\n isd_element.contents.push(c.element);\r\n\r\n }\r\n\r\n }\r\n\r\n /* remove styles that are not applicable */\r\n\r\n for (var qnameb in isd_element.styleAttrs) {\r\n if (!isd_element.styleAttrs.hasOwnProperty(qnameb)) continue;\r\n\r\n /* true if not applicable */\r\n\r\n var na = false;\r\n\r\n /* special applicability of certain style properties to ruby container spans */\r\n /* TODO: in the future ruby elements should be translated to elements instead of kept as spans */\r\n\r\n if (isd_element.kind === 'span') {\r\n\r\n var rsp = isd_element.styleAttrs[imscStyles.byName.ruby.qname];\r\n\r\n na = ( rsp === 'container' || rsp === 'textContainer' || rsp === 'baseContainer' ) && \r\n _rcs_na_styles.indexOf(qnameb) !== -1;\r\n\r\n if (! na) {\r\n\r\n na = rsp !== 'container' &&\r\n qnameb === imscStyles.byName.rubyAlign.qname;\r\n\r\n }\r\n\r\n if (! na) {\r\n\r\n na = (! (rsp === 'textContainer' || rsp === 'text')) &&\r\n qnameb === imscStyles.byName.rubyPosition.qname;\r\n\r\n }\r\n\r\n }\r\n\r\n /* normal applicability */\r\n \r\n if (! na) {\r\n\r\n var da = imscStyles.byQName[qnameb];\r\n\r\n if (\"applies\" in da){\r\n\r\n na = da.applies.indexOf(isd_element.kind) === -1;\r\n\r\n }\r\n\r\n }\r\n\r\n\r\n if (na) {\r\n delete isd_element.styleAttrs[qnameb];\r\n }\r\n\r\n }\r\n\r\n /* trim whitespace around explicit line breaks */\r\n\r\n var ruby = isd_element.styleAttrs[imscStyles.byName.ruby.qname];\r\n\r\n if (isd_element.kind === 'p' ||\r\n (isd_element.kind === 'span' && (ruby === \"textContainer\" || ruby === \"text\"))\r\n ) {\r\n\r\n var elist = [];\r\n\r\n constructSpanList(isd_element, elist);\r\n\r\n collapseLWSP(elist);\r\n\r\n pruneEmptySpans(isd_element);\r\n\r\n }\r\n\r\n /* keep element if:\r\n * * contains a background image\r\n * * <br/>\r\n * * if there are children\r\n * * if it is an image\r\n * * if <span> and has text\r\n * * if region and showBackground = always\r\n */\r\n\r\n if ((isd_element.kind === 'div' && imscStyles.byName.backgroundImage.qname in isd_element.styleAttrs) ||\r\n isd_element.kind === 'br' ||\r\n isd_element.kind === 'image' ||\r\n ('contents' in isd_element && isd_element.contents.length > 0) ||\r\n (isd_element.kind === 'span' && isd_element.text !== null) ||\r\n (isd_element.kind === 'region' &&\r\n isd_element.styleAttrs[imscStyles.byName.showBackground.qname] === 'always')) {\r\n\r\n return {\r\n region_id: associated_region_id,\r\n element: isd_element\r\n };\r\n }\r\n\r\n return null;\r\n }\r\n\r\n function collapseLWSP(elist) {\r\n\r\n function isPrevCharLWSP(prev_element) {\r\n return prev_element.kind === 'br' || /[\\r\\n\\t ]$/.test(prev_element.text);\r\n }\r\n\r\n function isNextCharLWSP(next_element) {\r\n return next_element.kind === 'br' || (next_element.space === \"preserve\" && /^[\\r\\n]/.test(next_element.text));\r\n }\r\n\r\n /* collapse spaces and remove leading LWSPs */\r\n\r\n var element;\r\n\r\n for (var i = 0; i < elist.length;) {\r\n\r\n element = elist[i];\r\n\r\n if (element.kind === \"br\" || element.space === \"preserve\") {\r\n i++;\r\n continue;\r\n }\r\n\r\n var trimmed_text = element.text.replace(/[\\t\\r\\n ]+/g, ' ');\r\n\r\n if (/^[ ]/.test(trimmed_text)) {\r\n\r\n if (i === 0 || isPrevCharLWSP(elist[i - 1])) {\r\n trimmed_text = trimmed_text.substring(1);\r\n }\r\n\r\n }\r\n\r\n element.text = trimmed_text;\r\n\r\n if (trimmed_text.length === 0) {\r\n elist.splice(i, 1);\r\n } else {\r\n i++;\r\n }\r\n\r\n }\r\n\r\n /* remove trailing LWSPs */\r\n\r\n for (i = 0; i < elist.length; i++) {\r\n\r\n element = elist[i];\r\n\r\n if (element.kind === \"br\" || element.space === \"preserve\") {\r\n i++;\r\n continue;\r\n }\r\n\r\n if (/[ ]$/.test(element.text)) {\r\n\r\n if (i === (elist.length - 1) || isNextCharLWSP(elist[i + 1])) {\r\n element.text = element.text.slice(0, -1);\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n function constructSpanList(element, elist) {\r\n\r\n if (! (\"contents\" in element)) {\r\n return;\r\n }\r\n\r\n for (var i = 0; i < element.contents.length; i++) {\r\n\r\n var child = element.contents[i];\r\n var ruby = child.styleAttrs[imscStyles.byName.ruby.qname];\r\n\r\n if (child.kind === 'span' && (ruby === \"textContainer\" || ruby === \"text\")) {\r\n\r\n /* skip ruby text and text containers, which are handled on their own */\r\n \r\n continue;\r\n\r\n } else if ('contents' in child) {\r\n \r\n constructSpanList(child, elist);\r\n \r\n } else if ((child.kind === 'span' && child.text.length !== 0) || child.kind === 'br') {\r\n\r\n /* skip empty spans */\r\n\r\n elist.push(child);\r\n\r\n }\r\n\r\n }\r\n\r\n }\r\n\r\n function pruneEmptySpans(element) {\r\n\r\n if (element.kind === 'br') {\r\n\r\n return false;\r\n\r\n } else if ('text' in element) {\r\n\r\n return element.text.length === 0;\r\n\r\n } else if ('contents' in element) {\r\n\r\n var i = element.contents.length;\r\n\r\n while (i--) {\r\n\r\n if (pruneEmptySpans(element.contents[i])) {\r\n element.contents.splice(i, 1);\r\n }\r\n\r\n }\r\n\r\n return element.contents.length === 0;\r\n\r\n }\r\n }\r\n\r\n function ISD(tt) {\r\n this.contents = [];\r\n this.aspectRatio = tt.aspectRatio;\r\n this.lang = tt.lang;\r\n }\r\n\r\n function ISDContentElement(ttelem) {\r\n\r\n /* assume the element is a region if it does not have a kind */\r\n\r\n this.kind = ttelem.kind || 'region';\r\n\r\n /* copy lang */\r\n\r\n this.lang = ttelem.lang;\r\n\r\n /* copy id */\r\n\r\n if (ttelem.id) {\r\n this.id = ttelem.id;\r\n }\r\n\r\n /* deep copy of style attributes */\r\n this.styleAttrs = {};\r\n\r\n for (var sname in ttelem.styleAttrs) {\r\n\r\n if (! ttelem.styleAttrs.hasOwnProperty(sname)) continue;\r\n\r\n this.styleAttrs[sname] =\r\n ttelem.styleAttrs[sname];\r\n }\r\n \r\n /* copy src and type if image */\r\n \r\n if ('src' in ttelem) {\r\n \r\n this.src = ttelem.src;\r\n \r\n }\r\n \r\n if ('type' in ttelem) {\r\n \r\n this.type = ttelem.type;\r\n \r\n }\r\n\r\n /* TODO: clean this! \r\n * TODO: ISDElement and document element should be better tied together */\r\n\r\n if ('text' in ttelem) {\r\n\r\n this.text = ttelem.text;\r\n\r\n } else if (this.kind === 'region' || 'contents' in ttelem) {\r\n\r\n this.contents = [];\r\n }\r\n\r\n if ('space' in ttelem) {\r\n\r\n this.space = ttelem.space;\r\n }\r\n }\r\n\r\n\r\n /*\r\n * ERROR HANDLING UTILITY FUNCTIONS\r\n * \r\n */\r\n\r\n function reportInfo(errorHandler, msg) {\r\n\r\n if (errorHandler && errorHandler.info && errorHandler.info(msg))\r\n throw msg;\r\n\r\n }\r\n\r\n function reportWarning(errorHandler, msg) {\r\n\r\n if (errorHandler && errorHandler.warn && errorHandler.warn(msg))\r\n throw msg;\r\n\r\n }\r\n\r\n function reportError(errorHandler, msg) {\r\n\r\n if (errorHandler && errorHandler.error && errorHandler.error(msg))\r\n throw msg;\r\n\r\n }\r\n\r\n function reportFatal(errorHandler, msg) {\r\n\r\n if (errorHandler && errorHandler.fatal)\r\n errorHandler.fatal(msg);\r\n\r\n throw msg;\r\n\r\n }\r\n\r\n\r\n})(typeof exports === 'undefined' ? this.imscISD = {} : exports,\r\n typeof imscNames === 'undefined' ? require(\"./names\") : imscNames,\r\n typeof imscStyles === 'undefined' ? require(\"./styles\") : imscStyles,\r\n typeof imscUtils === 'undefined' ? require(\"./utils\") : imscUtils\r\n );\r\n","/* \r\n * Copyright (c) 2016, Pierre-Anthony Lemieux <pal@sandflow.com>\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions are met:\r\n *\r\n * * Redistributions of source code must retain the above copyright notice, this\r\n * list of conditions and the following disclaimer.\r\n * * Redistributions in binary form must reproduce the above copyright notice,\r\n * this list of conditions and the following disclaimer in the documentation\r\n * and/or other materials provided with the distribution.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\r\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\r\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r\n * POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n\r\nexports.generateISD = require('./isd').generateISD;\r\nexports.fromXML = require('./doc').fromXML;\r\nexports.renderHTML = require('./html').render;","/* \r\n * Copyright (c) 2016, Pierre-Anthony Lemieux <pal@sandflow.com>\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions are met:\r\n *\r\n * * Redistributions of source code must retain the above copyright notice, this\r\n * list of conditions and the following disclaimer.\r\n * * Redistributions in binary form must reproduce the above copyright notice,\r\n * this list of conditions and the following disclaimer in the documentation\r\n * and/or other materials provided with the distribution.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\r\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\r\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r\n * POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n\r\n/**\r\n * @module imscNames\r\n */\r\n\r\n;\r\n(function (imscNames) { // wrapper for non-node envs\r\n\r\n imscNames.ns_tt = \"http://www.w3.org/ns/ttml\";\r\n imscNames.ns_tts = \"http://www.w3.org/ns/ttml#styling\";\r\n imscNames.ns_ttp = \"http://www.w3.org/ns/ttml#parameter\";\r\n imscNames.ns_xml = \"http://www.w3.org/XML/1998/namespace\";\r\n imscNames.ns_itts = \"http://www.w3.org/ns/ttml/profile/imsc1#styling\";\r\n imscNames.ns_ittp = \"http://www.w3.org/ns/ttml/profile/imsc1#parameter\";\r\n imscNames.ns_smpte = \"http://www.smpte-ra.org/schemas/2052-1/2010/smpte-tt\";\r\n imscNames.ns_ebutts = \"urn:ebu:tt:style\";\r\n \r\n})(typeof exports === 'undefined' ? this.imscNames = {} : exports);\r\n\r\n\r\n\r\n\r\n","/* \r\n * Copyright (c) 2016, Pierre-Anthony Lemieux <pal@sandflow.com>\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions are met:\r\n *\r\n * * Redistributions of source code must retain the above copyright notice, this\r\n * list of conditions and the following disclaimer.\r\n * * Redistributions in binary form must reproduce the above copyright notice,\r\n * this list of conditions and the following disclaimer in the documentation\r\n * and/or other materials provided with the distribution.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\r\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\r\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r\n * POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n\r\n/**\r\n * @module imscStyles\r\n */\r\n\r\n;\r\n(function (imscStyles, imscNames, imscUtils) { // wrapper for non-node envs\r\n\r\n function StylingAttributeDefinition(ns, name, initialValue, appliesTo, isInherit, isAnimatable, parseFunc, computeFunc) {\r\n this.name = name;\r\n this.ns = ns;\r\n this.qname = ns + \" \" + name;\r\n this.inherit = isInherit;\r\n this.animatable = isAnimatable;\r\n this.initial = initialValue;\r\n this.applies = appliesTo;\r\n this.parse = parseFunc;\r\n this.compute = computeFunc;\r\n }\r\n\r\n imscStyles.all = [\r\n\r\n new StylingAttributeDefinition(\r\n imscNames.ns_tts,\r\n \"backgroundColor\",\r\n \"transparent\",\r\n ['body', 'div', 'p', 'region', 'span'],\r\n false,\r\n true,\r\n imscUtils.parseColor,\r\n null\r\n ),\r\n new StylingAttributeDefinition(\r\n imscNames.ns_tts,\r\n \"color\",\r\n \"white\",\r\n ['span'],\r\n true,\r\n true,\r\n imscUtils.parseColor,\r\n null\r\n ),\r\n new StylingAttributeDefinition(\r\n imscNames.ns_tts,\r\n \"direction\",\r\n \"ltr\",\r\n ['p', 'span'],\r\n true,\r\n true,\r\n function (str) {\r\n return str;\r\n },\r\n null\r\n ),\r\n new StylingAttributeDefinition(\r\n imscNames.ns_tts,\r\n \"display\",\r\n \"auto\",\r\n ['body', 'div', 'p', 'region', 'span'],\r\n false,\r\n true,\r\n function (str) {\r\n return str;\r\n },\r\n null\r\n ),\r\n new StylingAttributeDefinition(\r\n imscNames.ns_tts,\r\n \"displayAlign\",\r\n \"before\",\r\n ['region'],\r\n false,\r\n true,\r\n function (str) {\r\n return str;\r\n },\r\n null\r\n ),\r\n new StylingAttributeDefinition(\r\n imscNames.ns_tts,\r\n \"extent\",\r\n \"auto\",\r\n ['tt', 'region'],\r\n false,\r\n true,\r\n function (str) {\r\n\r\n if (str === \"auto\") {\r\n\r\n return str;\r\n\r\n } else {\r\n\r\n var s = str.split(\" \");\r\n if (s.length !== 2)\r\n return null;\r\n var w = imscUtils.parseLength(s[0]);\r\n var h = imscUtils.parseLength(s[1]);\r\n if (!h || !w)\r\n return null;\r\n return {'h': h, 'w': w};\r\n }\r\n\r\n },\r\n function (doc, parent, element, attr, context) {\r\n\r\n var h;\r\n var w;\r\n\r\n if (attr === \"auto\") {\r\n\r\n h = new imscUtils.ComputedLength(0, 1);\r\n\r\n } else {\r\n\r\n h = imscUtils.toComputedLength(\r\n attr.h.value,\r\n attr.h.unit,\r\n null,\r\n doc.dimensions.h,\r\n null,\r\n doc.pxLength.h\r\n );\r\n\r\n\r\n if (h === null) {\r\n\r\n return null;\r\n\r\n }\r\n }\r\n\r\n if (attr === \"auto\") {\r\n\r\n w = new imscUtils.ComputedLength(1, 0);\r\n\r\n } else {\r\n\r\n w = imscUtils.toComputedLength(\r\n attr.w.value,\r\n attr.w.unit,\r\n null,\r\n doc.dimensions.w,\r\n null,\r\n doc.pxLength.w\r\n );\r\n\r\n if (w === null) {\r\n\r\n return null;\r\n\r\n }\r\n\r\n }\r\n\r\n return {'h': h, 'w': w};\r\n }\r\n ),\r\n new StylingAttributeDefinition(\r\n imscNames.ns_tts,\r\n \"fontFamily\",\r\n \"default\",\r\n ['span', 'p'],\r\n true,\r\n true,\r\n function (str) {\r\n var ffs = str.split(\",\");\r\n var rslt = [];\r\n\r\n for (var i = 0; i < ffs.length; i++) {\r\n ffs[i] = ffs[i].trim();\r\n\r\n if (ffs[i].charAt(0) !== \"'\" && ffs[i].charAt(0) !== '\"') {\r\n\r\n if (ffs[i] === \"default\") {\r\n\r\n /* per IMSC1 */\r\n\r\n rslt.push(\"monospaceSerif\");\r\n\r\n } else {\r\n\r\n rslt.push(ffs[i]);\r\n\r\n }\r\n\r\n } else {\r\n\r\n rslt.push(ffs[i]);\r\n\r\n }\r\n\r\n }\r\n\r\n return rslt;\r\n },\r\n null\r\n ),\r\n new StylingAttributeDefinition(\r\n imscNames.ns_tts,\r\n \"shear\",\r\n \"0%\",\r\n ['p'],\r\n true,\r\n true,\r\n imscUtils.parseLength,\r\n function (doc, parent, element, attr) {\r\n\r\n var fs;\r\n\r\n if (attr.unit === \"%\") {\r\n\r\n fs = Math.abs(attr.value) > 100 ? Math.sign(attr.value) * 100 : attr.value;\r\n\r\n } else {\r\n\r\n return null;\r\n\r\n }\r\n\r\n return fs;\r\n }\r\n ),\r\n new StylingAttributeDefinition(\r\n imscNames.ns_tts,\r\n \"fontSize\",\r\n \"1c\",\r\n ['span', 'p'],\r\n true,\r\n true,\r\n imscUtils.parseLength,\r\n function (doc, parent, element, attr, context) {\r\n\r\n var fs;\r\n\r\n fs = imscUtils.toComputedLength(\r\n attr.value,\r\n attr.unit,\r\n parent !== null ? parent.styleAttrs[imscStyles.byName.fontSize.qname] : doc.cellLength.h,\r\n parent !== null ? parent.styleAttrs[imscStyles.byName.fontSize.qname] : doc.cellLength.h,\r\n doc.cellLength.h,\r\n doc.pxLength.h\r\n );\r\n\r\n return fs;\r\n }\r\n ),\r\n new StylingAttributeDefinition(\r\n imscNames.ns_tts,\r\n \"fontStyle\",\r\n \"normal\",\r\n ['span', 'p'],\r\n true,\r\n true,\r\n function (str) {\r\n /* TODO: handle font style */\r\n\r\n return str;\r\n },\r\n null\r\n ),\r\n new StylingAttributeDefinition(\r\n imscNames.ns_tts,\r\n \"fontWeight\",\r\n \"normal\",\r\n ['span', 'p'],\r\n true,\r\n true,\r\n function (str) {\r\n /* TODO: handle font weight */\r\n\r\n return str;\r\n },\r\n null\r\n ),\r\n new StylingAttributeDefinition(\r\n imscNames.ns_tts,\r\n \"lineHeight\",\r\n \"normal\",\r\n ['p'],\r\n true,\r\n true,\r\n function (str) {\r\n if (str === \"normal\") {\r\n return str;\r\n } else {\r\n return imscUtils.parseLength(str);\r\n }\r\n },\r\n function (doc, parent, element, attr, context) {\r\n\r\n var lh;\r\n\r\n if (attr === \"normal\") {\r\n\r\n /* inherit normal per https://github.com/w3c/ttml1/issues/220 */\r\n\r\n lh = attr;\r\n\r\n } else {\r\n\r\n lh = imscUtils.toComputedLength(\r\n attr.value,\r\n attr.unit,\r\n element.styleAttrs[imscStyles.byName.fontSize.qname],\r\n element.styleAttrs[imscStyles.byName.fontSize.qname],\r\n doc.cellLength.h,\r\n doc.pxLength.h\r\n );\r\n\r\n if (lh === null) {\r\n\r\n return null;\r\n\r\n }\r\n\r\n }\r\n\r\n /* TODO: create a Length constructor */\r\n\r\n return lh;\r\n }\r\n ),\r\n new StylingAttributeDefinition(\r\n imscNames.ns_tts,\r\n \"opacity\",\r\n 1.0,\r\n ['region'],\r\n false,\r\n true,\r\n parseFloat,\r\n null\r\n ),\r\n new StylingAttributeDefinition(\r\n imscNames.ns_tts,\r\n \"origin\",\r\n \"auto\",\r\n ['region'],\r\n false,\r\n true,\r\n function (str) {\r\n\r\n if (str === \"auto\") {\r\n\r\n return str;\r\n\r\n } else {\r\n\r\n var s = str.split(\" \");\r\n if (s.length !== 2)\r\n return null;\r\n var w = imscUtils.parseLength(s[0]);\r\n var h = imscUtils.parseLength(s[1]);\r\n if (!h || !w)\r\n return null;\r\n return {'h': h, 'w': w};\r\n }\r\n\r\n },\r\n function (doc, parent, element, attr, context) {\r\n\r\n var h;\r\n var w;\r\n\r\n if (attr === \"auto\") {\r\n\r\n h = new imscUtils.ComputedLength(0,0);\r\n\r\n } else {\r\n\r\n h = imscUtils.toComputedLength(\r\n attr.h.value,\r\n attr.h.unit,\r\n null,\r\n doc.dimensions.h,\r\n null,\r\n doc.pxLength.h\r\n );\r\n\r\n if (h === null) {\r\n\r\n return null;\r\n\r\n }\r\n\r\n }\r\n\r\n if (attr === \"auto\") {\r\n\r\n w = new imscUtils.ComputedLength(0,0);\r\n\r\n } else {\r\n\r\n w = imscUtils.toComputedLength(\r\n attr.w.value,\r\n attr.w.unit,\r\n null,\r\n doc.dimensions.w,\r\n null,\r\n doc.pxLength.w\r\n );\r\n\r\n if (w === null) {\r\n\r\n return null;\r\n\r\n }\r\n\r\n }\r\n\r\n return {'h': h, 'w': w};\r\n }\r\n ),\r\n new StylingAttributeDefinition(\r\n imscNames.ns_tts,\r\n \"overflow\",\r\n \"hidden\",\r\n ['region'],\r\n false,\r\n true,\r\n function (str) {\r\n return str;\r\n },\r\n null\r\n ),\r\n new StylingAttributeDefinition(\r\n imscNames.ns_tts,\r\n \"padding\",\r\n \"0px\",\r\n ['region'],\r\n false,\r\n true,\r\n function (str) {\r\n\r\n var s = str.split(\" \");\r\n if (s.length > 4)\r\n return null;\r\n var r = [];\r\n for (var i = 0; i < s.length; i++) {\r\n\r\n var l = imscUtils.parseLength(s[i]);\r\n if (!l)\r\n return null;\r\n r.push(l);\r\n }\r\n\r\n return r;\r\n },\r\n function (doc, parent, element, attr, context) {\r\n\r\n var padding;\r\n\r\n /* TODO: make sure we are in region */\r\n\r\n /*\r\n * expand padding shortcuts to \r\n * [before, end, after, start]\r\n * \r\n */\r\n\r\n if (attr.length === 1) {\r\n\r\n padding = [attr[0], attr[0], attr[0], attr[0]];\r\n\r\n } else if (attr.length === 2) {\r\n\r\n padding = [attr[0], attr[1], attr[0], attr[1]];\r\n\r\n } else if (attr.length === 3) {\r\n\r\n padding = [attr[0], attr[1], attr[2], attr[1]];\r\n\r\n } else if (attr.length === 4) {\r\n\r\n padding = [attr[0], attr[1], attr[2], attr[3]];\r\n\r\n } else {\r\n\r\n return null;\r\n\r\n }\r\n\r\n /* TODO: take into account tts:direction */\r\n\r\n /* \r\n * transform [before, end, after, start] according to writingMode to \r\n * [top,left,bottom,right]\r\n * \r\n */\r\n\r\n var dir = element.styleAttrs[imscStyles.byName.writingMode.qname];\r\n\r\n if (dir === \"lrtb\" || dir === \"lr\") {\r\n\r\n padding = [padding[0], padding[3], padding[2], padding[1]];\r\n\r\n } else if (dir === \"rltb\" || dir === \"rl\") {\r\n\r\n padding = [padding[0], padding[1], padding[2], padding[3]];\r\n\r\n } else if (dir === \"tblr\") {\r\n\r\n padding = [padding[3], padding[0], padding[1], padding[2]];\r\n\r\n } else if (dir === \"tbrl\" || dir === \"tb\") {\r\n\r\n padding = [padding[3], padding[2], padding[1], padding[0]];\r\n\r\n } else {\r\n\r\n return null;\r\n\r\n }\r\n\r\n var out = [];\r\n\r\n for (var i = 0 ; i < padding.length; i++) {\r\n\r\n if (padding[i].value === 0) {\r\n\r\n out[i] = new imscUtils.ComputedLength(0,0);\r\n\r\n } else {\r\n\r\n out[i] = imscUtils.toComputedLength(\r\n padding[i].value,\r\n padding[i].unit,\r\n element.styleAttrs[imscStyles.byName.fontSize.qname],\r\n i === 0 || i === 2 ? element.styleAttrs[imscStyles.byName.extent.qname].h : element.styleAttrs[imscStyles.byName.extent.qname].w,\r\n i === 0 || i === 2 ? doc.cellLength.h : doc.cellLength.w,\r\n i === 0 || i === 2 ? doc.pxLength.h: doc.pxLength.w\r\n );\r\n\r\n if (out[i] === null) return null;\r\n\r\n }\r\n }\r\n\r\n\r\n return out;\r\n }\r\n ),\r\n new StylingAttributeDefinition(\r\n imscNames.ns_tts,\r\n \"position\",\r\n \"top left\",\r\n ['region'],\r\n false,\r\n true,\r\n function (str) {\r\n\r\n return imscUtils.parsePosition(str);\r\n\r\n },\r\n function (doc, parent, element, attr) {\r\n var h;\r\n var w;\r\n \r\n h = imscUtils.toComputedLength(\r\n attr.v.offset.value,\r\n attr.v.offset.unit,\r\n null,\r\n new imscUtils.ComputedLength(\r\n - element.styleAttrs[imscStyles.byName.extent.qname].h.rw,\r\n doc.dimensions.h.rh - element.styleAttrs[imscStyles.byName.extent.qname].h.rh \r\n ),\r\n null,\r\n doc.pxLength.h\r\n );\r\n\r\n if (h === null) return null;\r\n\r\n\r\n if (attr.v.edge === \"bottom\") {\r\n\r\n h = new imscUtils.ComputedLength(\r\n - h.rw - element.styleAttrs[imscStyles.byName.extent.qname].h.rw,\r\n doc.dimensions.h.rh - h.rh - element.styleAttrs[imscStyles.byName.extent.qname].h.rh\r\n );\r\n \r\n }\r\n\r\n w = imscUtils.toComputedLength(\r\n attr.h.offset.value,\r\n attr.h.offset.unit,\r\n null,\r\n new imscUtils.ComputedLength(\r\n doc.dimensions.w.rw - element.styleAttrs[imscStyles.byName.extent.qname].w.rw,\r\n - element.styleAttrs[imscStyles.byName.extent.qname].w.rh\r\n ),\r\n null,\r\n doc.pxLength.w\r\n );\r\n\r\n if (h === null) return null;\r\n\r\n if (attr.h.edge === \"right\") {\r\n \r\n w = new imscUtils.ComputedLength(\r\n doc.dimensions.w.rw - w.rw - element.styleAttrs[imscStyles.byName.extent.qname].w.rw,\r\n - w.rh - element.styleAttrs[imscStyles.byName.extent.qname].w.rh\r\n );\r\n\r\n }\r\n\r\n return {'h': h, 'w': w};\r\n }\r\n ),\r\n new StylingAttributeDefinition(\r\n imscNames.ns_tts,\r\n \"ruby\",\r\n \"none\",\r\n ['span'],\r\n false,\r\n true,\r\n function (str) {\r\n return str;\r\n },\r\n null\r\n ),\r\n new StylingAttributeDefinition(\r\n imscNames.ns_tts,\r\n \"rubyAlign\",\r\n \"center\",\r\n ['span'],\r\n true,\r\n true,\r\n function (str) {\r\n \r\n if (! (str === \"center\" || str === \"spaceAround\")) {\r\n return null;\r\n }\r\n \r\n return str;\r\n },\r\n null\r\n ),\r\n new StylingAttributeDefinition(\r\n imscNames.ns_tts,\r\n \"rubyPosition\",\r\n \"outside\",\r\n ['span'],\r\n true,\r\n true,\r\n function (str) {\r\n return str;\r\n },\r\n null\r\n ),\r\n new StylingAttributeDefinition(\r\n imscNames.ns_tts,\r\n \"rubyReserve\",\r\n \"none\",\r\n ['p'],\r\n true,\r\n true,\r\n function (str) {\r\n var s = str.split(\" \");\r\n\r\n var r = [null, null];\r\n\r\n if (s.length === 0 || s.length > 2)\r\n return null;\r\n\r\n if (s[0] === \"none\" ||\r\n s[0] === \"both\" ||\r\n s[0] === \"after\" ||\r\n s[0] === \"before\" ||\r\n s[0] === \"outside\") {\r\n\r\n r[0] = s[0];\r\n\r\n } else {\r\n\r\n return null;\r\n\r\n }\r\n\r\n if (s.length === 2 && s[0] !== \"none\") {\r\n\r\n var l = imscUtils.parseLength(s[1]);\r\n\r\n if (l) {\r\n\r\n r[1] = l;\r\n\r\n } else {\r\n\r\n return null;\r\n\r\n }\r\n\r\n }\r\n\r\n\r\n return r;\r\n },\r\n function (doc, parent, element, attr, context) {\r\n\r\n if (attr[0] === \"none\") {\r\n\r\n return attr;\r\n\r\n }\r\n\r\n var fs = null;\r\n\r\n if (attr[1] === null) {\r\n\r\n fs = new imscUtils.ComputedLength(\r\n element.styleAttrs[imscStyles.byName.fontSize.qname].rw * 0.5,\r\n element.styleAttrs[imscStyles.byName.fontSize.qname].rh * 0.5\r\n );\r\n\r\n } else {\r\n\r\n fs = imscUtils.toComputedLength(attr[1].value,\r\n attr[1].unit,\r\n element.styleAttrs[imscStyles.byName.fontSize.qname],\r\n element.styleAttrs[imscStyles.byName.fontSize.qname],\r\n doc.cellLength.h,\r\n doc.pxLength.h\r\n );\r\n \r\n }\r\n\r\n if (fs === null) return null;\r\n\r\n return [attr[0], fs];\r\n }\r\n ),\r\n new StylingAttributeDefinition(\r\n imscNames.ns_tts,\r\n \"showBackground\",\r\n \"always\",\r\n ['region'],\r\n false,\r\n true,\r\n function (str) {\r\n return str;\r\n },\r\n null\r\n ),\r\n new StylingAttributeDefinition(\r\n imscNames.ns_tts,\r\n \"textAlign\",\r\n \"start\",\r\n ['p'],\r\n true,\r\n true,\r\n function (str) {\r\n return str;\r\n },\r\n function (doc, parent, element, attr, context) {\r\n /* Section 7.16.9 of XSL */\r\n\r\n if (attr === \"left\") {\r\n\r\n return \"start\";\r\n\r\n } else if (attr === \"right\") {\r\n\r\n return \"end\";\r\n\r\n } else {\r\n\r\n return attr;\r\n\r\n }\r\n }\r\n ),\r\n new StylingAttributeDefinition(\r\n imscNames.ns_tts,\r\n \"textCombine\",\r\n \"none\",\r\n ['span'],\r\n true,\r\n true,\r\n function (str) {\r\n if (str === \"none\" || str === \"all\") {\r\n\r\n return str;\r\n }\r\n\r\n return null;\r\n },\r\n null\r\n ),\r\n new StylingAttributeDefinition(\r\n imscNames.ns_tts,\r\n \"textDecoration\",\r\n \"none\",\r\n ['span'],\r\n true,\r\n true,\r\n function (str) {\r\n return str.split(\" \");\r\n },\r\n null\r\n ),\r\n new StylingAttributeDefinition(\r\n imscNames.ns_tts,\r\n \"textEmphasis\",\r\n \"none\",\r\n ['span'],\r\n true,\r\n true,\r\n function (str) {\r\n var e = str.split(\" \");\r\n\r\n var rslt = {style: null, symbol: null, color: null, position: null};\r\n\r\n for (var i = 0; i < e.length; i++) {\r\n\r\n if (e[i] === \"none\" || e[i] === \"auto\") {\r\n\r\n rslt.style = e[i];\r\n\r\n } else if (e[i] === \"filled\" ||\r\n e[i] === \"open\") {\r\n\r\n rslt.style = e[i];\r\n\r\n } else if (e[i] === \"circle\" ||\r\n e[i] === \"dot\" ||\r\n e[i] === \"sesame\") {\r\n\r\n rslt.symbol = e[i];\r\n\r\n } else if (e[i] === \"current\") {\r\n\r\n rslt.color = e[i];\r\n\r\n } else if (e[i] === \"outside\" || e[i] === \"before\" || e[i] === \"after\") {\r\n\r\n rslt.position = e[i];\r\n\r\n } else {\r\n\r\n rslt.color = imscUtils.parseColor(e[i]);\r\n\r\n if (rslt.color === null)\r\n return null;\r\n\r\n }\r\n }\r\n\r\n if (rslt.style == null && rslt.symbol == null) {\r\n\r\n rslt.style = \"auto\";\r\n\r\n } else {\r\n\r\n rslt.symbol = rslt.symbol || \"circle\";\r\n rslt.style = rslt.style || \"filled\";\r\n\r\n }\r\n\r\n rslt.position = rslt.position || \"outside\";\r\n rslt.color = rslt.color || \"current\";\r\n\r\n return rslt;\r\n },\r\n null\r\n ),\r\n new StylingAttributeDefinition(\r\n imscNames.ns_tts,\r\n \"textOutline\",\r\n \"none\",\r\n ['span'],\r\n true,\r\n true,\r\n function (str) {\r\n\r\n /*\r\n * returns {c: <color>?, thichness: <length>} | \"none\"\r\n * \r\n */\r\n\r\n if (str === \"none\") {\r\n\r\n return str;\r\n\r\n } else {\r\n\r\n var r = {};\r\n var s = str.split(\" \");\r\n if (s.length === 0 || s.length > 2)\r\n return null;\r\n var c = imscUtils.parseColor(s[0]);\r\n\r\n r.color = c;\r\n\r\n if (c !== null)\r\n s.shift();\r\n\r\n if (s.length !== 1)\r\n return null;\r\n\r\n var l = imscUtils.parseLength(s[0]);\r\n\r\n if (!l)\r\n return null;\r\n\r\n r.thickness = l;\r\n\r\n return r;\r\n }\r\n\r\n },\r\n function (doc, parent, element, attr, context) {\r\n\r\n /*\r\n * returns {color: <color>, thickness: <norm length>}\r\n * \r\n */\r\n\r\n if (attr === \"none\")\r\n return attr;\r\n\r\n var rslt = {};\r\n\r\n if (attr.color === null) {\r\n\r\n rslt.color = element.styleAttrs[imscStyles.byName.color.qname];\r\n\r\n } else {\r\n\r\n rslt.color = attr.color;\r\n\r\n }\r\n\r\n rslt.thickness = imscUtils.toComputedLength(\r\n attr.thickness.value,\r\n attr.thickness.unit,\r\n element.styleAttrs[imscStyles.byName.fontSize.qname],\r\n element.styleAttrs[imscStyles.byName.fontSize.qname],\r\n doc.cellLength.h,\r\n doc.pxLength.h\r\n );\r\n\r\n if (rslt.thickness === null)\r\n return null;\r\n\r\n return rslt;\r\n }\r\n ),\r\n new StylingAttributeDefinition(\r\n imscNames.ns_tts,\r\n \"textShadow\",\r\n \"none\",\r\n ['span'],\r\n true,\r\n true,\r\n imscUtils.parseTextShadow,\r\n function (doc, parent, element, attr) {\r\n\r\n /*\r\n * returns [{x_off: <length>, y_off: <length>, b_radius: <length>, color: <color>}*] or \"none\"\r\n * \r\n */\r\n\r\n if (attr === \"none\")\r\n return attr;\r\n\r\n var r = [];\r\n\r\n for (var i = 0; i < attr.length; i++) {\r\n\r\n var shadow = {};\r\n\r\n shadow.x_off = imscUtils.toComputedLength(\r\n attr[i][0].value,\r\n attr[i][0].unit,\r\n null,\r\n element.styleAttrs[imscStyles.byName.fontSize.qname],\r\n null,\r\n doc.pxLength.w\r\n );\r\n\r\n if (shadow.x_off === null)\r\n return null;\r\n\r\n shadow.y_off = imscUtils.toComputedLength(\r\n attr[i][1].value,\r\n attr[i][1].unit,\r\n null,\r\n element.styleAttrs[imscStyles.byName.fontSize.qname],\r\n null,\r\n doc.pxLength.h\r\n );\r\n\r\n if (shadow.y_off === null)\r\n return null;\r\n\r\n if (attr[i][2] === null) {\r\n\r\n shadow.b_radius = 0;\r\n\r\n } else {\r\n\r\n shadow.b_radius = imscUtils.toComputedLength(\r\n attr[i][2].value,\r\n attr[i][2].unit,\r\n null,\r\n element.styleAttrs[imscStyles.byName.fontSize.qname],\r\n null,\r\n doc.pxLength.h\r\n );\r\n\r\n if (shadow.b_radius === null)\r\n return null;\r\n\r\n }\r\n\r\n if (attr[i][3] === null) {\r\n\r\n shadow.color = element.styleAttrs[imscStyles.byName.color.qname];\r\n\r\n } else {\r\n\r\n shadow.color = attr[i][3];\r\n\r\n }\r\n\r\n r.push(shadow);\r\n\r\n }\r\n\r\n return r;\r\n }\r\n ),\r\n new StylingAttributeDefinition(\r\n imscNames.ns_tts,\r\n \"unicodeBidi\",\r\n \"normal\",\r\n ['span', 'p'],\r\n false,\r\n true,\r\n function (str) {\r\n return str;\r\n },\r\n null\r\n ),\r\n new StylingAttributeDefinition(\r\n imscNames.ns_tts,\r\n \"visibility\",\r\n \"visible\",\r\n ['body', 'div', 'p', 'region', 'span'],\r\n true,\r\n true,\r\n function (str) {\r\n return str;\r\n },\r\n null\r\n ),\r\n new StylingAttributeDefinition(\r\n imscNames.ns_tts,\r\n \"wrapOption\",\r\n \"wrap\",\r\n ['span'],\r\n true,\r\n true,\r\n function (str) {\r\n return str;\r\n },\r\n null\r\n ),\r\n new StylingAttributeDefinition(\r\n imscNames.ns_tts,\r\n \"writingMode\",\r\n \"lrtb\",\r\n ['region'],\r\n false,\r\n true,\r\n function (str) {\r\n return str;\r\n },\r\n null\r\n ),\r\n new StylingAttributeDefinition(\r\n imscNames.ns_tts,\r\n \"zIndex\",\r\n \"auto\",\r\n ['region'],\r\n false,\r\n true,\r\n function (str) {\r\n\r\n var rslt;\r\n\r\n if (str === 'auto') {\r\n\r\n rslt = str;\r\n\r\n } else {\r\n\r\n rslt = parseInt(str);\r\n\r\n if (isNaN(rslt)) {\r\n rslt = null;\r\n }\r\n\r\n }\r\n\r\n return rslt;\r\n },\r\n null\r\n ),\r\n new StylingAttributeDefinition(\r\n imscNames.ns_ebutts,\r\n \"linePadding\",\r\n \"0c\",\r\n ['p'],\r\n true,\r\n false,\r\n imscUtils.parseLength,\r\n function (doc, parent, element, attr, context) {\r\n\r\n return imscUtils.toComputedLength(attr.value, attr.unit, null, null, doc.cellLength.w, null);\r\n\r\n }\r\n ),\r\n new StylingAttributeDefinition(\r\n imscNames.ns_ebutts,\r\n \"multiRowAlign\",\r\n \"auto\",\r\n ['p'],\r\n true,\r\n false,\r\n function (str) {\r\n return str;\r\n },\r\n null\r\n ),\r\n new StylingAttributeDefinition(\r\n imscNames.ns_smpte,\r\n \"backgroundImage\",\r\n null,\r\n ['div'],\r\n false,\r\n false,\r\n function (str) {\r\n return str;\r\n },\r\n null\r\n ),\r\n new StylingAttributeDefinition(\r\n imscNames.ns_itts,\r\n \"forcedDisplay\",\r\n \"false\",\r\n ['body', 'div', 'p', 'region', 'span'],\r\n true,\r\n true,\r\n function (str) {\r\n return str === 'true' ? true : false;\r\n },\r\n null\r\n ),\r\n new StylingAttributeDefinition(\r\n imscNames.ns_itts,\r\n \"fillLineGap\",\r\n \"false\",\r\n ['p'],\r\n true,\r\n true,\r\n function (str) {\r\n return str === 'true' ? true : false;\r\n },\r\n null\r\n )\r\n ];\r\n\r\n /* TODO: allow null parse function */\r\n\r\n imscStyles.byQName = {};\r\n for (var i in imscStyles.all) {\r\n\r\n imscStyles.byQName[imscStyles.all[i].qname] = imscStyles.all[i];\r\n }\r\n\r\n imscStyles.byName = {};\r\n for (var j in imscStyles.all) {\r\n\r\n imscStyles.byName[imscStyles.all[j].name] = imscStyles.all[j];\r\n }\r\n\r\n\r\n})(typeof exports === 'undefined' ? this.imscStyles = {} : exports,\r\n typeof imscNames === 'undefined' ? require(\"./names\") : imscNames,\r\n typeof imscUtils === 'undefined' ? require(\"./utils\") : imscUtils);\r\n","/* \r\n * Copyright (c) 2016, Pierre-Anthony Lemieux <pal@sandflow.com>\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions are met:\r\n *\r\n * * Redistributions of source code must retain the above copyright notice, this\r\n * list of conditions and the following disclaimer.\r\n * * Redistributions in binary form must reproduce the above copyright notice,\r\n * this list of conditions and the following disclaimer in the documentation\r\n * and/or other materials provided with the distribution.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\r\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\r\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r\n * POSSIBILITY OF SUCH DAMAGE.\r\n */\r\n\r\n/**\r\n * @module imscUtils\r\n */\r\n\r\n;\r\n(function (imscUtils) { // wrapper for non-node envs\r\n\r\n /* Documents the error handler interface */\r\n\r\n /**\r\n * @classdesc Generic interface for handling events. The interface exposes four\r\n * methods:\r\n * * <pre>info</pre>: unusual event that does not result in an inconsistent state\r\n * * <pre>warn</pre>: unexpected event that should not result in an inconsistent state\r\n * * <pre>error</pre>: unexpected event that may result in an inconsistent state\r\n * * <pre>fatal</pre>: unexpected event that results in an inconsistent state\r\n * and termination of processing\r\n * Each method takes a single <pre>string</pre> describing the event as argument,\r\n * and returns a single <pre>boolean</pre>, which terminates processing if <pre>true</pre>.\r\n *\r\n * @name ErrorHandler\r\n * @class\r\n */\r\n\r\n\r\n /*\r\n * Parses a TTML color expression\r\n * \r\n */\r\n\r\n var HEX_COLOR_RE = /#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})?/;\r\n var DEC_COLOR_RE = /rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)/;\r\n var DEC_COLORA_RE = /rgba\\(\\s*(\\d+),\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)/;\r\n var NAMED_COLOR = {\r\n transparent: [0, 0, 0, 0],\r\n black: [0, 0, 0, 255],\r\n silver: [192, 192, 192, 255],\r\n gray: [128, 128, 128, 255],\r\n white: [255, 255, 255, 255],\r\n maroon: [128, 0, 0, 255],\r\n red: [255, 0, 0, 255],\r\n purple: [128, 0, 128, 255],\r\n fuchsia: [255, 0, 255, 255],\r\n magenta: [255, 0, 255, 255],\r\n green: [0, 128, 0, 255],\r\n lime: [0, 255, 0, 255],\r\n olive: [128, 128, 0, 255],\r\n yellow: [255, 255, 0, 255],\r\n navy: [0, 0, 128, 255],\r\n blue: [0, 0, 255, 255],\r\n teal: [0, 128, 128, 255],\r\n aqua: [0, 255, 255, 255],\r\n cyan: [0, 255, 255, 255]\r\n };\r\n\r\n imscUtils.parseColor = function (str) {\r\n\r\n var m;\r\n \r\n var r = null;\r\n \r\n var nc = NAMED_COLOR[str.toLowerCase()];\r\n \r\n if (nc !== undefined) {\r\n\r\n r = nc;\r\n\r\n } else if ((m = HEX_COLOR_RE.exec(str)) !== null) {\r\n\r\n r = [parseInt(m[1], 16),\r\n parseInt(m[2], 16),\r\n parseInt(m[3], 16),\r\n (m[4] !== undefined ? parseInt(m[4], 16) : 255)];\r\n \r\n } else if ((m = DEC_COLOR_RE.exec(str)) !== null) {\r\n\r\n r = [parseInt(m[1]),\r\n parseInt(m[2]),\r\n parseInt(m[3]),\r\n 255];\r\n \r\n } else if ((m = DEC_COLORA_RE.exec(str)) !== null) {\r\n\r\n r = [parseInt(m[1]),\r\n parseInt(m[2]),\r\n parseInt(m[3]),\r\n parseInt(m[4])];\r\n \r\n }\r\n\r\n return r;\r\n };\r\n\r\n var LENGTH_RE = /^((?:\\+|\\-)?\\d*(?:\\.\\d+)?)(px|em|c|%|rh|rw)$/;\r\n\r\n imscUtils.parseLength = function (str) {\r\n\r\n var m;\r\n\r\n var r = null;\r\n\r\n if ((m = LENGTH_RE.exec(str)) !== null) {\r\n\r\n r = {value: parseFloat(m[1]), unit: m[2]};\r\n }\r\n\r\n return r;\r\n };\r\n\r\n imscUtils.parseTextShadow = function (str) {\r\n\r\n var shadows = str.match(/([^\\(,\\)]|\\([^\\)]+\\))+/g);\r\n \r\n var r = [];\r\n\r\n for (var i = 0; i < shadows.length; i++) {\r\n\r\n var shadow = shadows[i].split(\" \");\r\n\r\n if (shadow.length === 1 && shadow[0] === \"none\") {\r\n\r\n return \"none\";\r\n\r\n } else if (shadow.length > 1 && shadow.length < 5) {\r\n\r\n var out_shadow = [null, null, null, null];\r\n\r\n /* x offset */\r\n\r\n var l = imscUtils.parseLength(shadow.shift());\r\n\r\n if (l === null)\r\n return null;\r\n\r\n out_shadow[0] = l;\r\n\r\n /* y offset */\r\n\r\n l = imscUtils.parseLength(shadow.shift());\r\n\r\n if (l === null)\r\n return null;\r\n\r\n out_shadow[1] = l;\r\n\r\n /* is there a third component */\r\n\r\n if (shadow.length === 0) {\r\n r.push(out_shadow);\r\n continue;\r\n }\r\n\r\n l = imscUtils.parseLength(shadow[0]);\r\n\r\n if (l !== null) {\r\n\r\n out_shadow[2] = l;\r\n\r\n shadow.shift();\r\n\r\n }\r\n\r\n if (shadow.length === 0) {\r\n r.push(out_shadow);\r\n continue;\r\n }\r\n\r\n var c = imscUtils.parseColor(shadow[0]);\r\n\r\n if (c === null)\r\n return null;\r\n\r\n out_shadow[3] = c;\r\n\r\n r.push(out_shadow);\r\n }\r\n\r\n }\r\n\r\n return r;\r\n };\r\n\r\n\r\n imscUtils.parsePosition = function (str) {\r\n\r\n /* see https://www.w3.org/TR/ttml2/#style-value-position */\r\n\r\n var s = str.split(\" \");\r\n\r\n var isKeyword = function (str) {\r\n\r\n return str === \"center\" ||\r\n str === \"left\" ||\r\n str === \"top\" ||\r\n str === \"bottom\" ||\r\n str === \"right\";\r\n\r\n };\r\n\r\n if (s.length > 4) {\r\n\r\n return null;\r\n\r\n }\r\n\r\n /* initial clean-up pass */\r\n\r\n for (var j = 0 ; j < s.length; j++) {\r\n\r\n if (!isKeyword(s[j])) {\r\n\r\n var l = imscUtils.parseLength(s[j]);\r\n\r\n if (l === null)\r\n return null;\r\n\r\n s[j] = l;\r\n }\r\n\r\n }\r\n\r\n /* position default */\r\n\r\n var pos = {\r\n h: {edge: \"left\", offset: {value: 50, unit: \"%\"}},\r\n v: {edge: \"top\", offset: {value: 50, unit: \"%\"}}\r\n };\r\n\r\n /* update position */\r\n\r\n for (var i = 0; i < s.length; ) {\r\n\r\n /* extract the current component */\r\n\r\n var comp = s[i++];\r\n\r\n if (isKeyword(comp)) {\r\n\r\n /* we have a keyword */\r\n\r\n var offset = {value: 0, unit: \"%\"};\r\n\r\n /* peek at the next component */\r\n\r\n if (s.length !== 2 && i < s.length && (!isKeyword(s[i]))) {\r\n\r\n /* followed by an offset */\r\n\r\n offset = s[i++];\r\n\r\n }\r\n\r\n /* skip if center */\r\n\r\n if (comp === \"right\") {\r\n\r\n pos.h.edge = comp;\r\n\r\n pos.h.offset = offset;\r\n\r\n } else if (comp === \"bottom\") {\r\n\r\n pos.v.edge = comp;\r\n\r\n\r\n pos.v.offset = offset;\r\n\r\n\r\n } else if (comp === \"left\") {\r\n\r\n pos.h.offset = offset;\r\n\r\n\r\n } else if (comp === \"top\") {\r\n\r\n pos.v.offset = offset;\r\n\r\n\r\n }\r\n\r\n } else if (s.length === 1 || s.length === 2) {\r\n\r\n /* we have a bare value */\r\n\r\n if (i === 1) {\r\n\r\n /* assign it to left edge if first bare value */\r\n\r\n pos.h.offset = comp;\r\n\r\n } else {\r\n\r\n /* assign it to top edge if second bare value */\r\n\r\n pos.v.offset = comp;\r\n\r\n }\r\n\r\n } else {\r\n\r\n /* error condition */\r\n\r\n return null;\r\n\r\n }\r\n\r\n }\r\n\r\n return pos;\r\n };\r\n\r\n\r\n imscUtils.ComputedLength = function (rw, rh) {\r\n this.rw = rw;\r\n this.rh = rh;\r\n };\r\n\r\n imscUtils.ComputedLength.prototype.toUsedLength = function (width, height) {\r\n return width * this.rw + height * this.rh;\r\n };\r\n\r\n imscUtils.ComputedLength.prototype.isZero = function () {\r\n return this.rw === 0 && this.rh === 0;\r\n };\r\n\r\n /**\r\n * Computes a specified length to a root container relative length\r\n * \r\n * @param {number} lengthVal Length value to be computed\r\n * @param {string} lengthUnit Units of the length value\r\n * @param {number} emScale length of 1em, or null if em is not allowed\r\n * @param {number} percentScale length to which , or null if perecentage is not allowed\r\n * @param {number} cellScale length of 1c, or null if c is not allowed\r\n * @param {number} pxScale length of 1px, or null if px is not allowed\r\n * @param {number} direction 0 if the length is computed in the horizontal direction, 1 if the length is computed in the vertical direction\r\n * @return {number} Computed length\r\n */\r\n imscUtils.toComputedLength = function(lengthVal, lengthUnit, emLength, percentLength, cellLength, pxLength) {\r\n\r\n if (lengthUnit === \"%\" && percentLength) {\r\n\r\n return new imscUtils.ComputedLength(\r\n percentLength.rw * lengthVal / 100,\r\n percentLength.rh * lengthVal / 100\r\n );\r\n\r\n } else if (lengthUnit === \"em\" && emLength) {\r\n\r\n return new imscUtils.ComputedLength(\r\n emLength.rw * lengthVal,\r\n emLength.rh * lengthVal\r\n );\r\n\r\n } else if (lengthUnit === \"c\" && cellLength) {\r\n\r\n return new imscUtils.ComputedLength(\r\n lengthVal * cellLength.rw,\r\n lengthVal * cellLength.rh\r\n );\r\n\r\n } else if (lengthUnit === \"px\" && pxLength) {\r\n\r\n return new imscUtils.ComputedLength(\r\n lengthVal * pxLength.rw,\r\n lengthVal * pxLength.rh\r\n );\r\n\r\n } else if (lengthUnit === \"rh\") {\r\n\r\n return new imscUtils.ComputedLength(\r\n 0,\r\n lengthVal / 100\r\n );\r\n\r\n } else if (lengthUnit === \"rw\") {\r\n\r\n return new imscUtils.ComputedLength(\r\n lengthVal / 100,\r\n 0 \r\n );\r\n\r\n } else {\r\n\r\n return null;\r\n\r\n }\r\n\r\n };\r\n\r\n\r\n\r\n})(typeof exports === 'undefined' ? this.imscUtils = {} : exports);\r\n","'use strict'\n\nmodule.exports = alphabetical\n\n// Check if the given character code, or the character code at the first\n// character, is alphabetical.\nfunction alphabetical(character) {\n var code = typeof character === 'string' ? character.charCodeAt(0) : character\n\n return (\n (code >= 97 && code <= 122) /* a-z */ ||\n (code >= 65 && code <= 90) /* A-Z */\n )\n}\n","'use strict'\n\nvar alphabetical = require('is-alphabetical')\nvar decimal = require('is-decimal')\n\nmodule.exports = alphanumerical\n\n// Check if the given character code, or the character code at the first\n// character, is alphanumerical.\nfunction alphanumerical(character) {\n return alphabetical(character) || decimal(character)\n}\n","'use strict'\n\nmodule.exports = decimal\n\n// Check if the given character code, or the character code at the first\n// character, is decimal.\nfunction decimal(character) {\n var code = typeof character === 'string' ? character.charCodeAt(0) : character\n\n return code >= 48 && code <= 57 /* 0-9 */\n}\n","// 'path' module extracted from Node.js v8.11.1 (only the posix part)\n// transplited with Babel\n\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nfunction assertPath(path) {\n if (typeof path !== 'string') {\n throw new TypeError('Path must be a string. Received ' + JSON.stringify(path));\n }\n}\n\n// Resolves . and .. elements in a path with directory names\nfunction normalizeStringPosix(path, allowAboveRoot) {\n var res = '';\n var lastSegmentLength = 0;\n var lastSlash = -1;\n var dots = 0;\n var code;\n for (var i = 0; i <= path.length; ++i) {\n if (i < path.length)\n code = path.charCodeAt(i);\n else if (code === 47 /*/*/)\n break;\n else\n code = 47 /*/*/;\n if (code === 47 /*/*/) {\n if (lastSlash === i - 1 || dots === 1) {\n // NOOP\n } else if (lastSlash !== i - 1 && dots === 2) {\n if (res.length < 2 || lastSegmentLength !== 2 || res.charCodeAt(res.length - 1) !== 46 /*.*/ || res.charCodeAt(res.length - 2) !== 46 /*.*/) {\n if (res.length > 2) {\n var lastSlashIndex = res.lastIndexOf('/');\n if (lastSlashIndex !== res.length - 1) {\n if (lastSlashIndex === -1) {\n res = '';\n lastSegmentLength = 0;\n } else {\n res = res.slice(0, lastSlashIndex);\n lastSegmentLength = res.length - 1 - res.lastIndexOf('/');\n }\n lastSlash = i;\n dots = 0;\n continue;\n }\n } else if (res.length === 2 || res.length === 1) {\n res = '';\n lastSegmentLength = 0;\n lastSlash = i;\n dots = 0;\n continue;\n }\n }\n if (allowAboveRoot) {\n if (res.length > 0)\n res += '/..';\n else\n res = '..';\n lastSegmentLength = 2;\n }\n } else {\n if (res.length > 0)\n res += '/' + path.slice(lastSlash + 1, i);\n else\n res = path.slice(lastSlash + 1, i);\n lastSegmentLength = i - lastSlash - 1;\n }\n lastSlash = i;\n dots = 0;\n } else if (code === 46 /*.*/ && dots !== -1) {\n ++dots;\n } else {\n dots = -1;\n }\n }\n return res;\n}\n\nfunction _format(sep, pathObject) {\n var dir = pathObject.dir || pathObject.root;\n var base = pathObject.base || (pathObject.name || '') + (pathObject.ext || '');\n if (!dir) {\n return base;\n }\n if (dir === pathObject.root) {\n return dir + base;\n }\n return dir + sep + base;\n}\n\nvar posix = {\n // path.resolve([from ...], to)\n resolve: function resolve() {\n var resolvedPath = '';\n var resolvedAbsolute = false;\n var cwd;\n\n for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n var path;\n if (i >= 0)\n path = arguments[i];\n else {\n if (cwd === undefined)\n cwd = process.cwd();\n path = cwd;\n }\n\n assertPath(path);\n\n // Skip empty entries\n if (path.length === 0) {\n continue;\n }\n\n resolvedPath = path + '/' + resolvedPath;\n resolvedAbsolute = path.charCodeAt(0) === 47 /*/*/;\n }\n\n // At this point the path should be resolved to a full absolute path, but\n // handle relative paths to be safe (might happen when process.cwd() fails)\n\n // Normalize the path\n resolvedPath = normalizeStringPosix(resolvedPath, !resolvedAbsolute);\n\n if (resolvedAbsolute) {\n if (resolvedPath.length > 0)\n return '/' + resolvedPath;\n else\n return '/';\n } else if (resolvedPath.length > 0) {\n return resolvedPath;\n } else {\n return '.';\n }\n },\n\n normalize: function normalize(path) {\n assertPath(path);\n\n if (path.length === 0) return '.';\n\n var isAbsolute = path.charCodeAt(0) === 47 /*/*/;\n var trailingSeparator = path.charCodeAt(path.length - 1) === 47 /*/*/;\n\n // Normalize the path\n path = normalizeStringPosix(path, !isAbsolute);\n\n if (path.length === 0 && !isAbsolute) path = '.';\n if (path.length > 0 && trailingSeparator) path += '/';\n\n if (isAbsolute) return '/' + path;\n return path;\n },\n\n isAbsolute: function isAbsolute(path) {\n assertPath(path);\n return path.length > 0 && path.charCodeAt(0) === 47 /*/*/;\n },\n\n join: function join() {\n if (arguments.length === 0)\n return '.';\n var joined;\n for (var i = 0; i < arguments.length; ++i) {\n var arg = arguments[i];\n assertPath(arg);\n if (arg.length > 0) {\n if (joined === undefined)\n joined = arg;\n else\n joined += '/' + arg;\n }\n }\n if (joined === undefined)\n return '.';\n return posix.normalize(joined);\n },\n\n relative: function relative(from, to) {\n assertPath(from);\n assertPath(to);\n\n if (from === to) return '';\n\n from = posix.resolve(from);\n to = posix.resolve(to);\n\n if (from === to) return '';\n\n // Trim any leading backslashes\n var fromStart = 1;\n for (; fromStart < from.length; ++fromStart) {\n if (from.charCodeAt(fromStart) !== 47 /*/*/)\n break;\n }\n var fromEnd = from.length;\n var fromLen = fromEnd - fromStart;\n\n // Trim any leading backslashes\n var toStart = 1;\n for (; toStart < to.length; ++toStart) {\n if (to.charCodeAt(toStart) !== 47 /*/*/)\n break;\n }\n var toEnd = to.length;\n var toLen = toEnd - toStart;\n\n // Compare paths to find the longest common path from root\n var length = fromLen < toLen ? fromLen : toLen;\n var lastCommonSep = -1;\n var i = 0;\n for (; i <= length; ++i) {\n if (i === length) {\n if (toLen > length) {\n if (to.charCodeAt(toStart + i) === 47 /*/*/) {\n // We get here if `from` is the exact base path for `to`.\n // For example: from='/foo/bar'; to='/foo/bar/baz'\n return to.slice(toStart + i + 1);\n } else if (i === 0) {\n // We get here if `from` is the root\n // For example: from='/'; to='/foo'\n return to.slice(toStart + i);\n }\n } else if (fromLen > length) {\n if (from.charCodeAt(fromStart + i) === 47 /*/*/) {\n // We get here if `to` is the exact base path for `from`.\n // For example: from='/foo/bar/baz'; to='/foo/bar'\n lastCommonSep = i;\n } else if (i === 0) {\n // We get here if `to` is the root.\n // For example: from='/foo'; to='/'\n lastCommonSep = 0;\n }\n }\n break;\n }\n var fromCode = from.charCodeAt(fromStart + i);\n var toCode = to.charCodeAt(toStart + i);\n if (fromCode !== toCode)\n break;\n else if (fromCode === 47 /*/*/)\n lastCommonSep = i;\n }\n\n var out = '';\n // Generate the relative path based on the path difference between `to`\n // and `from`\n for (i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i) {\n if (i === fromEnd || from.charCodeAt(i) === 47 /*/*/) {\n if (out.length === 0)\n out += '..';\n else\n out += '/..';\n }\n }\n\n // Lastly, append the rest of the destination (`to`) path that comes after\n // the common path parts\n if (out.length > 0)\n return out + to.slice(toStart + lastCommonSep);\n else {\n toStart += lastCommonSep;\n if (to.charCodeAt(toStart) === 47 /*/*/)\n ++toStart;\n return to.slice(toStart);\n }\n },\n\n _makeLong: function _makeLong(path) {\n return path;\n },\n\n dirname: function dirname(path) {\n assertPath(path);\n if (path.length === 0) return '.';\n var code = path.charCodeAt(0);\n var hasRoot = code === 47 /*/*/;\n var end = -1;\n var matchedSlash = true;\n for (var i = path.length - 1; i >= 1; --i) {\n code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n if (!matchedSlash) {\n end = i;\n break;\n }\n } else {\n // We saw the first non-path separator\n matchedSlash = false;\n }\n }\n\n if (end === -1) return hasRoot ? '/' : '.';\n if (hasRoot && end === 1) return '//';\n return path.slice(0, end);\n },\n\n basename: function basename(path, ext) {\n if (ext !== undefined && typeof ext !== 'string') throw new TypeError('\"ext\" argument must be a string');\n assertPath(path);\n\n var start = 0;\n var end = -1;\n var matchedSlash = true;\n var i;\n\n if (ext !== undefined && ext.length > 0 && ext.length <= path.length) {\n if (ext.length === path.length && ext === path) return '';\n var extIdx = ext.length - 1;\n var firstNonSlashEnd = -1;\n for (i = path.length - 1; i >= 0; --i) {\n var code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n start = i + 1;\n break;\n }\n } else {\n if (firstNonSlashEnd === -1) {\n // We saw the first non-path separator, remember this index in case\n // we need it if the extension ends up not matching\n matchedSlash = false;\n firstNonSlashEnd = i + 1;\n }\n if (extIdx >= 0) {\n // Try to match the explicit extension\n if (code === ext.charCodeAt(extIdx)) {\n if (--extIdx === -1) {\n // We matched the extension, so mark this as the end of our path\n // component\n end = i;\n }\n } else {\n // Extension does not match, so our result is the entire path\n // component\n extIdx = -1;\n end = firstNonSlashEnd;\n }\n }\n }\n }\n\n if (start === end) end = firstNonSlashEnd;else if (end === -1) end = path.length;\n return path.slice(start, end);\n } else {\n for (i = path.length - 1; i >= 0; --i) {\n if (path.charCodeAt(i) === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n start = i + 1;\n break;\n }\n } else if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // path component\n matchedSlash = false;\n end = i + 1;\n }\n }\n\n if (end === -1) return '';\n return path.slice(start, end);\n }\n },\n\n extname: function extname(path) {\n assertPath(path);\n var startDot = -1;\n var startPart = 0;\n var end = -1;\n var matchedSlash = true;\n // Track the state of characters (if any) we see before our first dot and\n // after any path separator we find\n var preDotState = 0;\n for (var i = path.length - 1; i >= 0; --i) {\n var code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // extension\n matchedSlash = false;\n end = i + 1;\n }\n if (code === 46 /*.*/) {\n // If this is our first dot, mark it as the start of our extension\n if (startDot === -1)\n startDot = i;\n else if (preDotState !== 1)\n preDotState = 1;\n } else if (startDot !== -1) {\n // We saw a non-dot and non-path separator before our dot, so we should\n // have a good chance at having a non-empty extension\n preDotState = -1;\n }\n }\n\n if (startDot === -1 || end === -1 ||\n // We saw a non-dot character immediately before the dot\n preDotState === 0 ||\n // The (right-most) trimmed path component is exactly '..'\n preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {\n return '';\n }\n return path.slice(startDot, end);\n },\n\n format: function format(pathObject) {\n if (pathObject === null || typeof pathObject !== 'object') {\n throw new TypeError('The \"pathObject\" argument must be of type Object. Received type ' + typeof pathObject);\n }\n return _format('/', pathObject);\n },\n\n parse: function parse(path) {\n assertPath(path);\n\n var ret = { root: '', dir: '', base: '', ext: '', name: '' };\n if (path.length === 0) return ret;\n var code = path.charCodeAt(0);\n var isAbsolute = code === 47 /*/*/;\n var start;\n if (isAbsolute) {\n ret.root = '/';\n start = 1;\n } else {\n start = 0;\n }\n var startDot = -1;\n var startPart = 0;\n var end = -1;\n var matchedSlash = true;\n var i = path.length - 1;\n\n // Track the state of characters (if any) we see before our first dot and\n // after any path separator we find\n var preDotState = 0;\n\n // Get non-dir info\n for (; i >= start; --i) {\n code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // extension\n matchedSlash = false;\n end = i + 1;\n }\n if (code === 46 /*.*/) {\n // If this is our first dot, mark it as the start of our extension\n if (startDot === -1) startDot = i;else if (preDotState !== 1) preDotState = 1;\n } else if (startDot !== -1) {\n // We saw a non-dot and non-path separator before our dot, so we should\n // have a good chance at having a non-empty extension\n preDotState = -1;\n }\n }\n\n if (startDot === -1 || end === -1 ||\n // We saw a non-dot character immediately before the dot\n preDotState === 0 ||\n // The (right-most) trimmed path component is exactly '..'\n preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {\n if (end !== -1) {\n if (startPart === 0 && isAbsolute) ret.base = ret.name = path.slice(1, end);else ret.base = ret.name = path.slice(startPart, end);\n }\n } else {\n if (startPart === 0 && isAbsolute) {\n ret.name = path.slice(1, startDot);\n ret.base = path.slice(1, end);\n } else {\n ret.name = path.slice(startPart, startDot);\n ret.base = path.slice(startPart, end);\n }\n ret.ext = path.slice(startDot, end);\n }\n\n if (startPart > 0) ret.dir = path.slice(0, startPart - 1);else if (isAbsolute) ret.dir = '/';\n\n return ret;\n },\n\n sep: '/',\n delimiter: ':',\n win32: null,\n posix: null\n};\n\nposix.posix = posix;\n\nmodule.exports = posix;\n","/* eslint-disable node/no-deprecated-api */\nvar buffer = require('buffer')\nvar Buffer = buffer.Buffer\n\n// alternative to using Object.keys for old browsers\nfunction copyProps (src, dst) {\n for (var key in src) {\n dst[key] = src[key]\n }\n}\nif (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {\n module.exports = buffer\n} else {\n // Copy properties from require('buffer')\n copyProps(buffer, exports)\n exports.Buffer = SafeBuffer\n}\n\nfunction SafeBuffer (arg, encodingOrOffset, length) {\n return Buffer(arg, encodingOrOffset, length)\n}\n\n// Copy static methods from Buffer\ncopyProps(Buffer, SafeBuffer)\n\nSafeBuffer.from = function (arg, encodingOrOffset, length) {\n if (typeof arg === 'number') {\n throw new TypeError('Argument must not be a number')\n }\n return Buffer(arg, encodingOrOffset, length)\n}\n\nSafeBuffer.alloc = function (size, fill, encoding) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n var buf = Buffer(size)\n if (fill !== undefined) {\n if (typeof encoding === 'string') {\n buf.fill(fill, encoding)\n } else {\n buf.fill(fill)\n }\n } else {\n buf.fill(0)\n }\n return buf\n}\n\nSafeBuffer.allocUnsafe = function (size) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n return Buffer(size)\n}\n\nSafeBuffer.allocUnsafeSlow = function (size) {\n if (typeof size !== 'number') {\n throw new TypeError('Argument must be a number')\n }\n return buffer.SlowBuffer(size)\n}\n",";(function (sax) { // wrapper for non-node envs\n sax.parser = function (strict, opt) { return new SAXParser(strict, opt) }\n sax.SAXParser = SAXParser\n sax.SAXStream = SAXStream\n sax.createStream = createStream\n\n // When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns.\n // When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)),\n // since that's the earliest that a buffer overrun could occur. This way, checks are\n // as rare as required, but as often as necessary to ensure never crossing this bound.\n // Furthermore, buffers are only tested at most once per write(), so passing a very\n // large string into write() might have undesirable effects, but this is manageable by\n // the caller, so it is assumed to be safe. Thus, a call to write() may, in the extreme\n // edge case, result in creating at most one complete copy of the string passed in.\n // Set to Infinity to have unlimited buffers.\n sax.MAX_BUFFER_LENGTH = 64 * 1024\n\n var buffers = [\n 'comment', 'sgmlDecl', 'textNode', 'tagName', 'doctype',\n 'procInstName', 'procInstBody', 'entity', 'attribName',\n 'attribValue', 'cdata', 'script'\n ]\n\n sax.EVENTS = [\n 'text',\n 'processinginstruction',\n 'sgmldeclaration',\n 'doctype',\n 'comment',\n 'opentagstart',\n 'attribute',\n 'opentag',\n 'closetag',\n 'opencdata',\n 'cdata',\n 'closecdata',\n 'error',\n 'end',\n 'ready',\n 'script',\n 'opennamespace',\n 'closenamespace'\n ]\n\n function SAXParser (strict, opt) {\n if (!(this instanceof SAXParser)) {\n return new SAXParser(strict, opt)\n }\n\n var parser = this\n clearBuffers(parser)\n parser.q = parser.c = ''\n parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH\n parser.opt = opt || {}\n parser.opt.lowercase = parser.opt.lowercase || parser.opt.lowercasetags\n parser.looseCase = parser.opt.lowercase ? 'toLowerCase' : 'toUpperCase'\n parser.tags = []\n parser.closed = parser.closedRoot = parser.sawRoot = false\n parser.tag = parser.error = null\n parser.strict = !!strict\n parser.noscript = !!(strict || parser.opt.noscript)\n parser.state = S.BEGIN\n parser.strictEntities = parser.opt.strictEntities\n parser.ENTITIES = parser.strictEntities ? Object.create(sax.XML_ENTITIES) : Object.create(sax.ENTITIES)\n parser.attribList = []\n\n // namespaces form a prototype chain.\n // it always points at the current tag,\n // which protos to its parent tag.\n if (parser.opt.xmlns) {\n parser.ns = Object.create(rootNS)\n }\n\n // mostly just for error reporting\n parser.trackPosition = parser.opt.position !== false\n if (parser.trackPosition) {\n parser.position = parser.line = parser.column = 0\n }\n emit(parser, 'onready')\n }\n\n if (!Object.create) {\n Object.create = function (o) {\n function F () {}\n F.prototype = o\n var newf = new F()\n return newf\n }\n }\n\n if (!Object.keys) {\n Object.keys = function (o) {\n var a = []\n for (var i in o) if (o.hasOwnProperty(i)) a.push(i)\n return a\n }\n }\n\n function checkBufferLength (parser) {\n var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10)\n var maxActual = 0\n for (var i = 0, l = buffers.length; i < l; i++) {\n var len = parser[buffers[i]].length\n if (len > maxAllowed) {\n // Text/cdata nodes can get big, and since they're buffered,\n // we can get here under normal conditions.\n // Avoid issues by emitting the text node now,\n // so at least it won't get any bigger.\n switch (buffers[i]) {\n case 'textNode':\n closeText(parser)\n break\n\n case 'cdata':\n emitNode(parser, 'oncdata', parser.cdata)\n parser.cdata = ''\n break\n\n case 'script':\n emitNode(parser, 'onscript', parser.script)\n parser.script = ''\n break\n\n default:\n error(parser, 'Max buffer length exceeded: ' + buffers[i])\n }\n }\n maxActual = Math.max(maxActual, len)\n }\n // schedule the next check for the earliest possible buffer overrun.\n var m = sax.MAX_BUFFER_LENGTH - maxActual\n parser.bufferCheckPosition = m + parser.position\n }\n\n function clearBuffers (parser) {\n for (var i = 0, l = buffers.length; i < l; i++) {\n parser[buffers[i]] = ''\n }\n }\n\n function flushBuffers (parser) {\n closeText(parser)\n if (parser.cdata !== '') {\n emitNode(parser, 'oncdata', parser.cdata)\n parser.cdata = ''\n }\n if (parser.script !== '') {\n emitNode(parser, 'onscript', parser.script)\n parser.script = ''\n }\n }\n\n SAXParser.prototype = {\n end: function () { end(this) },\n write: write,\n resume: function () { this.error = null; return this },\n close: function () { return this.write(null) },\n flush: function () { flushBuffers(this) }\n }\n\n var Stream\n try {\n Stream = require('stream').Stream\n } catch (ex) {\n Stream = function () {}\n }\n\n var streamWraps = sax.EVENTS.filter(function (ev) {\n return ev !== 'error' && ev !== 'end'\n })\n\n function createStream (strict, opt) {\n return new SAXStream(strict, opt)\n }\n\n function SAXStream (strict, opt) {\n if (!(this instanceof SAXStream)) {\n return new SAXStream(strict, opt)\n }\n\n Stream.apply(this)\n\n this._parser = new SAXParser(strict, opt)\n this.writable = true\n this.readable = true\n\n var me = this\n\n this._parser.onend = function () {\n me.emit('end')\n }\n\n this._parser.onerror = function (er) {\n me.emit('error', er)\n\n // if didn't throw, then means error was handled.\n // go ahead and clear error, so we can write again.\n me._parser.error = null\n }\n\n this._decoder = null\n\n streamWraps.forEach(function (ev) {\n Object.defineProperty(me, 'on' + ev, {\n get: function () {\n return me._parser['on' + ev]\n },\n set: function (h) {\n if (!h) {\n me.removeAllListeners(ev)\n me._parser['on' + ev] = h\n return h\n }\n me.on(ev, h)\n },\n enumerable: true,\n configurable: false\n })\n })\n }\n\n SAXStream.prototype = Object.create(Stream.prototype, {\n constructor: {\n value: SAXStream\n }\n })\n\n SAXStream.prototype.write = function (data) {\n if (typeof Buffer === 'function' &&\n typeof Buffer.isBuffer === 'function' &&\n Buffer.isBuffer(data)) {\n if (!this._decoder) {\n var SD = require('string_decoder').StringDecoder\n this._decoder = new SD('utf8')\n }\n data = this._decoder.write(data)\n }\n\n this._parser.write(data.toString())\n this.emit('data', data)\n return true\n }\n\n SAXStream.prototype.end = function (chunk) {\n if (chunk && chunk.length) {\n this.write(chunk)\n }\n this._parser.end()\n return true\n }\n\n SAXStream.prototype.on = function (ev, handler) {\n var me = this\n if (!me._parser['on' + ev] && streamWraps.indexOf(ev) !== -1) {\n me._parser['on' + ev] = function () {\n var args = arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments)\n args.splice(0, 0, ev)\n me.emit.apply(me, args)\n }\n }\n\n return Stream.prototype.on.call(me, ev, handler)\n }\n\n // character classes and tokens\n var whitespace = '\\r\\n\\t '\n\n // this really needs to be replaced with character classes.\n // XML allows all manner of ridiculous numbers and digits.\n var number = '0124356789'\n var letter = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'\n\n // (Letter | \"_\" | \":\")\n var quote = '\\'\"'\n var attribEnd = whitespace + '>'\n var CDATA = '[CDATA['\n var DOCTYPE = 'DOCTYPE'\n var XML_NAMESPACE = 'http://www.w3.org/XML/1998/namespace'\n var XMLNS_NAMESPACE = 'http://www.w3.org/2000/xmlns/'\n var rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE }\n\n // turn all the string character sets into character class objects.\n whitespace = charClass(whitespace)\n number = charClass(number)\n letter = charClass(letter)\n\n // http://www.w3.org/TR/REC-xml/#NT-NameStartChar\n // This implementation works on strings, a single character at a time\n // as such, it cannot ever support astral-plane characters (10000-EFFFF)\n // without a significant breaking change to either this parser, or the\n // JavaScript language. Implementation of an emoji-capable xml parser\n // is left as an exercise for the reader.\n var nameStart = /[:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]/\n\n var nameBody = /[:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\u00B7\\u0300-\\u036F\\u203F-\\u2040\\.\\d-]/\n\n var entityStart = /[#:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]/\n var entityBody = /[#:_A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\u00B7\\u0300-\\u036F\\u203F-\\u2040\\.\\d-]/\n\n quote = charClass(quote)\n attribEnd = charClass(attribEnd)\n\n function charClass (str) {\n return str.split('').reduce(function (s, c) {\n s[c] = true\n return s\n }, {})\n }\n\n function isRegExp (c) {\n return Object.prototype.toString.call(c) === '[object RegExp]'\n }\n\n function is (charclass, c) {\n return isRegExp(charclass) ? !!c.match(charclass) : charclass[c]\n }\n\n function not (charclass, c) {\n return !is(charclass, c)\n }\n\n var S = 0\n sax.STATE = {\n BEGIN: S++, // leading byte order mark or whitespace\n BEGIN_WHITESPACE: S++, // leading whitespace\n TEXT: S++, // general stuff\n TEXT_ENTITY: S++, // & and such.\n OPEN_WAKA: S++, // <\n SGML_DECL: S++, // <!BLARG\n SGML_DECL_QUOTED: S++, // <!BLARG foo \"bar\n DOCTYPE: S++, // <!DOCTYPE\n DOCTYPE_QUOTED: S++, // <!DOCTYPE \"//blah\n DOCTYPE_DTD: S++, // <!DOCTYPE \"//blah\" [ ...\n DOCTYPE_DTD_QUOTED: S++, // <!DOCTYPE \"//blah\" [ \"foo\n COMMENT_STARTING: S++, // <!-\n COMMENT: S++, // <!--\n COMMENT_ENDING: S++, // <!-- blah -\n COMMENT_ENDED: S++, // <!-- blah --\n CDATA: S++, // <![CDATA[ something\n CDATA_ENDING: S++, // ]\n CDATA_ENDING_2: S++, // ]]\n PROC_INST: S++, // <?hi\n PROC_INST_BODY: S++, // <?hi there\n PROC_INST_ENDING: S++, // <?hi \"there\" ?\n OPEN_TAG: S++, // <strong\n OPEN_TAG_SLASH: S++, // <strong /\n ATTRIB: S++, // <a\n ATTRIB_NAME: S++, // <a foo\n ATTRIB_NAME_SAW_WHITE: S++, // <a foo _\n ATTRIB_VALUE: S++, // <a foo=\n ATTRIB_VALUE_QUOTED: S++, // <a foo=\"bar\n ATTRIB_VALUE_CLOSED: S++, // <a foo=\"bar\"\n ATTRIB_VALUE_UNQUOTED: S++, // <a foo=bar\n ATTRIB_VALUE_ENTITY_Q: S++, // <foo bar=\""\"\n ATTRIB_VALUE_ENTITY_U: S++, // <foo bar="\n CLOSE_TAG: S++, // </a\n CLOSE_TAG_SAW_WHITE: S++, // </a >\n SCRIPT: S++, // <script> ...\n SCRIPT_ENDING: S++ // <script> ... <\n }\n\n sax.XML_ENTITIES = {\n 'amp': '&',\n 'gt': '>',\n 'lt': '<',\n 'quot': '\"',\n 'apos': \"'\"\n }\n\n sax.ENTITIES = {\n 'amp': '&',\n 'gt': '>',\n 'lt': '<',\n 'quot': '\"',\n 'apos': \"'\",\n 'AElig': 198,\n 'Aacute': 193,\n 'Acirc': 194,\n 'Agrave': 192,\n 'Aring': 197,\n 'Atilde': 195,\n 'Auml': 196,\n 'Ccedil': 199,\n 'ETH': 208,\n 'Eacute': 201,\n 'Ecirc': 202,\n 'Egrave': 200,\n 'Euml': 203,\n 'Iacute': 205,\n 'Icirc': 206,\n 'Igrave': 204,\n 'Iuml': 207,\n 'Ntilde': 209,\n 'Oacute': 211,\n 'Ocirc': 212,\n 'Ograve': 210,\n 'Oslash': 216,\n 'Otilde': 213,\n 'Ouml': 214,\n 'THORN': 222,\n 'Uacute': 218,\n 'Ucirc': 219,\n 'Ugrave': 217,\n 'Uuml': 220,\n 'Yacute': 221,\n 'aacute': 225,\n 'acirc': 226,\n 'aelig': 230,\n 'agrave': 224,\n 'aring': 229,\n 'atilde': 227,\n 'auml': 228,\n 'ccedil': 231,\n 'eacute': 233,\n 'ecirc': 234,\n 'egrave': 232,\n 'eth': 240,\n 'euml': 235,\n 'iacute': 237,\n 'icirc': 238,\n 'igrave': 236,\n 'iuml': 239,\n 'ntilde': 241,\n 'oacute': 243,\n 'ocirc': 244,\n 'ograve': 242,\n 'oslash': 248,\n 'otilde': 245,\n 'ouml': 246,\n 'szlig': 223,\n 'thorn': 254,\n 'uacute': 250,\n 'ucirc': 251,\n 'ugrave': 249,\n 'uuml': 252,\n 'yacute': 253,\n 'yuml': 255,\n 'copy': 169,\n 'reg': 174,\n 'nbsp': 160,\n 'iexcl': 161,\n 'cent': 162,\n 'pound': 163,\n 'curren': 164,\n 'yen': 165,\n 'brvbar': 166,\n 'sect': 167,\n 'uml': 168,\n 'ordf': 170,\n 'laquo': 171,\n 'not': 172,\n 'shy': 173,\n 'macr': 175,\n 'deg': 176,\n 'plusmn': 177,\n 'sup1': 185,\n 'sup2': 178,\n 'sup3': 179,\n 'acute': 180,\n 'micro': 181,\n 'para': 182,\n 'middot': 183,\n 'cedil': 184,\n 'ordm': 186,\n 'raquo': 187,\n 'frac14': 188,\n 'frac12': 189,\n 'frac34': 190,\n 'iquest': 191,\n 'times': 215,\n 'divide': 247,\n 'OElig': 338,\n 'oelig': 339,\n 'Scaron': 352,\n 'scaron': 353,\n 'Yuml': 376,\n 'fnof': 402,\n 'circ': 710,\n 'tilde': 732,\n 'Alpha': 913,\n 'Beta': 914,\n 'Gamma': 915,\n 'Delta': 916,\n 'Epsilon': 917,\n 'Zeta': 918,\n 'Eta': 919,\n 'Theta': 920,\n 'Iota': 921,\n 'Kappa': 922,\n 'Lambda': 923,\n 'Mu': 924,\n 'Nu': 925,\n 'Xi': 926,\n 'Omicron': 927,\n 'Pi': 928,\n 'Rho': 929,\n 'Sigma': 931,\n 'Tau': 932,\n 'Upsilon': 933,\n 'Phi': 934,\n 'Chi': 935,\n 'Psi': 936,\n 'Omega': 937,\n 'alpha': 945,\n 'beta': 946,\n 'gamma': 947,\n 'delta': 948,\n 'epsilon': 949,\n 'zeta': 950,\n 'eta': 951,\n 'theta': 952,\n 'iota': 953,\n 'kappa': 954,\n 'lambda': 955,\n 'mu': 956,\n 'nu': 957,\n 'xi': 958,\n 'omicron': 959,\n 'pi': 960,\n 'rho': 961,\n 'sigmaf': 962,\n 'sigma': 963,\n 'tau': 964,\n 'upsilon': 965,\n 'phi': 966,\n 'chi': 967,\n 'psi': 968,\n 'omega': 969,\n 'thetasym': 977,\n 'upsih': 978,\n 'piv': 982,\n 'ensp': 8194,\n 'emsp': 8195,\n 'thinsp': 8201,\n 'zwnj': 8204,\n 'zwj': 8205,\n 'lrm': 8206,\n 'rlm': 8207,\n 'ndash': 8211,\n 'mdash': 8212,\n 'lsquo': 8216,\n 'rsquo': 8217,\n 'sbquo': 8218,\n 'ldquo': 8220,\n 'rdquo': 8221,\n 'bdquo': 8222,\n 'dagger': 8224,\n 'Dagger': 8225,\n 'bull': 8226,\n 'hellip': 8230,\n 'permil': 8240,\n 'prime': 8242,\n 'Prime': 8243,\n 'lsaquo': 8249,\n 'rsaquo': 8250,\n 'oline': 8254,\n 'frasl': 8260,\n 'euro': 8364,\n 'image': 8465,\n 'weierp': 8472,\n 'real': 8476,\n 'trade': 8482,\n 'alefsym': 8501,\n 'larr': 8592,\n 'uarr': 8593,\n 'rarr': 8594,\n 'darr': 8595,\n 'harr': 8596,\n 'crarr': 8629,\n 'lArr': 8656,\n 'uArr': 8657,\n 'rArr': 8658,\n 'dArr': 8659,\n 'hArr': 8660,\n 'forall': 8704,\n 'part': 8706,\n 'exist': 8707,\n 'empty': 8709,\n 'nabla': 8711,\n 'isin': 8712,\n 'notin': 8713,\n 'ni': 8715,\n 'prod': 8719,\n 'sum': 8721,\n 'minus': 8722,\n 'lowast': 8727,\n 'radic': 8730,\n 'prop': 8733,\n 'infin': 8734,\n 'ang': 8736,\n 'and': 8743,\n 'or': 8744,\n 'cap': 8745,\n 'cup': 8746,\n 'int': 8747,\n 'there4': 8756,\n 'sim': 8764,\n 'cong': 8773,\n 'asymp': 8776,\n 'ne': 8800,\n 'equiv': 8801,\n 'le': 8804,\n 'ge': 8805,\n 'sub': 8834,\n 'sup': 8835,\n 'nsub': 8836,\n 'sube': 8838,\n 'supe': 8839,\n 'oplus': 8853,\n 'otimes': 8855,\n 'perp': 8869,\n 'sdot': 8901,\n 'lceil': 8968,\n 'rceil': 8969,\n 'lfloor': 8970,\n 'rfloor': 8971,\n 'lang': 9001,\n 'rang': 9002,\n 'loz': 9674,\n 'spades': 9824,\n 'clubs': 9827,\n 'hearts': 9829,\n 'diams': 9830\n }\n\n Object.keys(sax.ENTITIES).forEach(function (key) {\n var e = sax.ENTITIES[key]\n var s = typeof e === 'number' ? String.fromCharCode(e) : e\n sax.ENTITIES[key] = s\n })\n\n for (var s in sax.STATE) {\n sax.STATE[sax.STATE[s]] = s\n }\n\n // shorthand\n S = sax.STATE\n\n function emit (parser, event, data) {\n parser[event] && parser[event](data)\n }\n\n function emitNode (parser, nodeType, data) {\n if (parser.textNode) closeText(parser)\n emit(parser, nodeType, data)\n }\n\n function closeText (parser) {\n parser.textNode = textopts(parser.opt, parser.textNode)\n if (parser.textNode) emit(parser, 'ontext', parser.textNode)\n parser.textNode = ''\n }\n\n function textopts (opt, text) {\n if (opt.trim) text = text.trim()\n if (opt.normalize) text = text.replace(/\\s+/g, ' ')\n return text\n }\n\n function error (parser, er) {\n closeText(parser)\n if (parser.trackPosition) {\n er += '\\nLine: ' + parser.line +\n '\\nColumn: ' + parser.column +\n '\\nChar: ' + parser.c\n }\n er = new Error(er)\n parser.error = er\n emit(parser, 'onerror', er)\n return parser\n }\n\n function end (parser) {\n if (parser.sawRoot && !parser.closedRoot) strictFail(parser, 'Unclosed root tag')\n if ((parser.state !== S.BEGIN) &&\n (parser.state !== S.BEGIN_WHITESPACE) &&\n (parser.state !== S.TEXT)) {\n error(parser, 'Unexpected end')\n }\n closeText(parser)\n parser.c = ''\n parser.closed = true\n emit(parser, 'onend')\n SAXParser.call(parser, parser.strict, parser.opt)\n return parser\n }\n\n function strictFail (parser, message) {\n if (typeof parser !== 'object' || !(parser instanceof SAXParser)) {\n throw new Error('bad call to strictFail')\n }\n if (parser.strict) {\n error(parser, message)\n }\n }\n\n function newTag (parser) {\n if (!parser.strict) parser.tagName = parser.tagName[parser.looseCase]()\n var parent = parser.tags[parser.tags.length - 1] || parser\n var tag = parser.tag = { name: parser.tagName, attributes: {} }\n\n // will be overridden if tag contails an xmlns=\"foo\" or xmlns:foo=\"bar\"\n if (parser.opt.xmlns) {\n tag.ns = parent.ns\n }\n parser.attribList.length = 0\n emitNode(parser, 'onopentagstart', tag)\n }\n\n function qname (name, attribute) {\n var i = name.indexOf(':')\n var qualName = i < 0 ? [ '', name ] : name.split(':')\n var prefix = qualName[0]\n var local = qualName[1]\n\n // <x \"xmlns\"=\"http://foo\">\n if (attribute && name === 'xmlns') {\n prefix = 'xmlns'\n local = ''\n }\n\n return { prefix: prefix, local: local }\n }\n\n function attrib (parser) {\n if (!parser.strict) {\n parser.attribName = parser.attribName[parser.looseCase]()\n }\n\n if (parser.attribList.indexOf(parser.attribName) !== -1 ||\n parser.tag.attributes.hasOwnProperty(parser.attribName)) {\n parser.attribName = parser.attribValue = ''\n return\n }\n\n if (parser.opt.xmlns) {\n var qn = qname(parser.attribName, true)\n var prefix = qn.prefix\n var local = qn.local\n\n if (prefix === 'xmlns') {\n // namespace binding attribute. push the binding into scope\n if (local === 'xml' && parser.attribValue !== XML_NAMESPACE) {\n strictFail(parser,\n 'xml: prefix must be bound to ' + XML_NAMESPACE + '\\n' +\n 'Actual: ' + parser.attribValue)\n } else if (local === 'xmlns' && parser.attribValue !== XMLNS_NAMESPACE) {\n strictFail(parser,\n 'xmlns: prefix must be bound to ' + XMLNS_NAMESPACE + '\\n' +\n 'Actual: ' + parser.attribValue)\n } else {\n var tag = parser.tag\n var parent = parser.tags[parser.tags.length - 1] || parser\n if (tag.ns === parent.ns) {\n tag.ns = Object.create(parent.ns)\n }\n tag.ns[local] = parser.attribValue\n }\n }\n\n // defer onattribute events until all attributes have been seen\n // so any new bindings can take effect. preserve attribute order\n // so deferred events can be emitted in document order\n parser.attribList.push([parser.attribName, parser.attribValue])\n } else {\n // in non-xmlns mode, we can emit the event right away\n parser.tag.attributes[parser.attribName] = parser.attribValue\n emitNode(parser, 'onattribute', {\n name: parser.attribName,\n value: parser.attribValue\n })\n }\n\n parser.attribName = parser.attribValue = ''\n }\n\n function openTag (parser, selfClosing) {\n if (parser.opt.xmlns) {\n // emit namespace binding events\n var tag = parser.tag\n\n // add namespace info to tag\n var qn = qname(parser.tagName)\n tag.prefix = qn.prefix\n tag.local = qn.local\n tag.uri = tag.ns[qn.prefix] || ''\n\n if (tag.prefix && !tag.uri) {\n strictFail(parser, 'Unbound namespace prefix: ' +\n JSON.stringify(parser.tagName))\n tag.uri = qn.prefix\n }\n\n var parent = parser.tags[parser.tags.length - 1] || parser\n if (tag.ns && parent.ns !== tag.ns) {\n Object.keys(tag.ns).forEach(function (p) {\n emitNode(parser, 'onopennamespace', {\n prefix: p,\n uri: tag.ns[p]\n })\n })\n }\n\n // handle deferred onattribute events\n // Note: do not apply default ns to attributes:\n // http://www.w3.org/TR/REC-xml-names/#defaulting\n for (var i = 0, l = parser.attribList.length; i < l; i++) {\n var nv = parser.attribList[i]\n var name = nv[0]\n var value = nv[1]\n var qualName = qname(name, true)\n var prefix = qualName.prefix\n var local = qualName.local\n var uri = prefix === '' ? '' : (tag.ns[prefix] || '')\n var a = {\n name: name,\n value: value,\n prefix: prefix,\n local: local,\n uri: uri\n }\n\n // if there's any attributes with an undefined namespace,\n // then fail on them now.\n if (prefix && prefix !== 'xmlns' && !uri) {\n strictFail(parser, 'Unbound namespace prefix: ' +\n JSON.stringify(prefix))\n a.uri = prefix\n }\n parser.tag.attributes[name] = a\n emitNode(parser, 'onattribute', a)\n }\n parser.attribList.length = 0\n }\n\n parser.tag.isSelfClosing = !!selfClosing\n\n // process the tag\n parser.sawRoot = true\n parser.tags.push(parser.tag)\n emitNode(parser, 'onopentag', parser.tag)\n if (!selfClosing) {\n // special case for <script> in non-strict mode.\n if (!parser.noscript && parser.tagName.toLowerCase() === 'script') {\n parser.state = S.SCRIPT\n } else {\n parser.state = S.TEXT\n }\n parser.tag = null\n parser.tagName = ''\n }\n parser.attribName = parser.attribValue = ''\n parser.attribList.length = 0\n }\n\n function closeTag (parser) {\n if (!parser.tagName) {\n strictFail(parser, 'Weird empty close tag.')\n parser.textNode += '</>'\n parser.state = S.TEXT\n return\n }\n\n if (parser.script) {\n if (parser.tagName !== 'script') {\n parser.script += '</' + parser.tagName + '>'\n parser.tagName = ''\n parser.state = S.SCRIPT\n return\n }\n emitNode(parser, 'onscript', parser.script)\n parser.script = ''\n }\n\n // first make sure that the closing tag actually exists.\n // <a><b></c></b></a> will close everything, otherwise.\n var t = parser.tags.length\n var tagName = parser.tagName\n if (!parser.strict) {\n tagName = tagName[parser.looseCase]()\n }\n var closeTo = tagName\n while (t--) {\n var close = parser.tags[t]\n if (close.name !== closeTo) {\n // fail the first time in strict mode\n strictFail(parser, 'Unexpected close tag')\n } else {\n break\n }\n }\n\n // didn't find it. we already failed for strict, so just abort.\n if (t < 0) {\n strictFail(parser, 'Unmatched closing tag: ' + parser.tagName)\n parser.textNode += '</' + parser.tagName + '>'\n parser.state = S.TEXT\n return\n }\n parser.tagName = tagName\n var s = parser.tags.length\n while (s-- > t) {\n var tag = parser.tag = parser.tags.pop()\n parser.tagName = parser.tag.name\n emitNode(parser, 'onclosetag', parser.tagName)\n\n var x = {}\n for (var i in tag.ns) {\n x[i] = tag.ns[i]\n }\n\n var parent = parser.tags[parser.tags.length - 1] || parser\n if (parser.opt.xmlns && tag.ns !== parent.ns) {\n // remove namespace bindings introduced by tag\n Object.keys(tag.ns).forEach(function (p) {\n var n = tag.ns[p]\n emitNode(parser, 'onclosenamespace', { prefix: p, uri: n })\n })\n }\n }\n if (t === 0) parser.closedRoot = true\n parser.tagName = parser.attribValue = parser.attribName = ''\n parser.attribList.length = 0\n parser.state = S.TEXT\n }\n\n function parseEntity (parser) {\n var entity = parser.entity\n var entityLC = entity.toLowerCase()\n var num\n var numStr = ''\n\n if (parser.ENTITIES[entity]) {\n return parser.ENTITIES[entity]\n }\n if (parser.ENTITIES[entityLC]) {\n return parser.ENTITIES[entityLC]\n }\n entity = entityLC\n if (entity.charAt(0) === '#') {\n if (entity.charAt(1) === 'x') {\n entity = entity.slice(2)\n num = parseInt(entity, 16)\n numStr = num.toString(16)\n } else {\n entity = entity.slice(1)\n num = parseInt(entity, 10)\n numStr = num.toString(10)\n }\n }\n entity = entity.replace(/^0+/, '')\n if (numStr.toLowerCase() !== entity) {\n strictFail(parser, 'Invalid character entity')\n return '&' + parser.entity + ';'\n }\n\n return String.fromCodePoint(num)\n }\n\n function beginWhiteSpace (parser, c) {\n if (c === '<') {\n parser.state = S.OPEN_WAKA\n parser.startTagPosition = parser.position\n } else if (not(whitespace, c)) {\n // have to process this as a text node.\n // weird, but happens.\n strictFail(parser, 'Non-whitespace before first tag.')\n parser.textNode = c\n parser.state = S.TEXT\n }\n }\n\n function charAt (chunk, i) {\n var result = ''\n if (i < chunk.length) {\n result = chunk.charAt(i)\n }\n return result\n }\n\n function write (chunk) {\n var parser = this\n if (this.error) {\n throw this.error\n }\n if (parser.closed) {\n return error(parser,\n 'Cannot write after close. Assign an onready handler.')\n }\n if (chunk === null) {\n return end(parser)\n }\n if (typeof chunk === 'object') {\n chunk = chunk.toString()\n }\n var i = 0\n var c = ''\n while (true) {\n c = charAt(chunk, i++)\n parser.c = c\n if (!c) {\n break\n }\n if (parser.trackPosition) {\n parser.position++\n if (c === '\\n') {\n parser.line++\n parser.column = 0\n } else {\n parser.column++\n }\n }\n switch (parser.state) {\n case S.BEGIN:\n parser.state = S.BEGIN_WHITESPACE\n if (c === '\\uFEFF') {\n continue\n }\n beginWhiteSpace(parser, c)\n continue\n\n case S.BEGIN_WHITESPACE:\n beginWhiteSpace(parser, c)\n continue\n\n case S.TEXT:\n if (parser.sawRoot && !parser.closedRoot) {\n var starti = i - 1\n while (c && c !== '<' && c !== '&') {\n c = charAt(chunk, i++)\n if (c && parser.trackPosition) {\n parser.position++\n if (c === '\\n') {\n parser.line++\n parser.column = 0\n } else {\n parser.column++\n }\n }\n }\n parser.textNode += chunk.substring(starti, i - 1)\n }\n if (c === '<' && !(parser.sawRoot && parser.closedRoot && !parser.strict)) {\n parser.state = S.OPEN_WAKA\n parser.startTagPosition = parser.position\n } else {\n if (not(whitespace, c) && (!parser.sawRoot || parser.closedRoot)) {\n strictFail(parser, 'Text data outside of root node.')\n }\n if (c === '&') {\n parser.state = S.TEXT_ENTITY\n } else {\n parser.textNode += c\n }\n }\n continue\n\n case S.SCRIPT:\n // only non-strict\n if (c === '<') {\n parser.state = S.SCRIPT_ENDING\n } else {\n parser.script += c\n }\n continue\n\n case S.SCRIPT_ENDING:\n if (c === '/') {\n parser.state = S.CLOSE_TAG\n } else {\n parser.script += '<' + c\n parser.state = S.SCRIPT\n }\n continue\n\n case S.OPEN_WAKA:\n // either a /, ?, !, or text is coming next.\n if (c === '!') {\n parser.state = S.SGML_DECL\n parser.sgmlDecl = ''\n } else if (is(whitespace, c)) {\n // wait for it...\n } else if (is(nameStart, c)) {\n parser.state = S.OPEN_TAG\n parser.tagName = c\n } else if (c === '/') {\n parser.state = S.CLOSE_TAG\n parser.tagName = ''\n } else if (c === '?') {\n parser.state = S.PROC_INST\n parser.procInstName = parser.procInstBody = ''\n } else {\n strictFail(parser, 'Unencoded <')\n // if there was some whitespace, then add that in.\n if (parser.startTagPosition + 1 < parser.position) {\n var pad = parser.position - parser.startTagPosition\n c = new Array(pad).join(' ') + c\n }\n parser.textNode += '<' + c\n parser.state = S.TEXT\n }\n continue\n\n case S.SGML_DECL:\n if ((parser.sgmlDecl + c).toUpperCase() === CDATA) {\n emitNode(parser, 'onopencdata')\n parser.state = S.CDATA\n parser.sgmlDecl = ''\n parser.cdata = ''\n } else if (parser.sgmlDecl + c === '--') {\n parser.state = S.COMMENT\n parser.comment = ''\n parser.sgmlDecl = ''\n } else if ((parser.sgmlDecl + c).toUpperCase() === DOCTYPE) {\n parser.state = S.DOCTYPE\n if (parser.doctype || parser.sawRoot) {\n strictFail(parser,\n 'Inappropriately located doctype declaration')\n }\n parser.doctype = ''\n parser.sgmlDecl = ''\n } else if (c === '>') {\n emitNode(parser, 'onsgmldeclaration', parser.sgmlDecl)\n parser.sgmlDecl = ''\n parser.state = S.TEXT\n } else if (is(quote, c)) {\n parser.state = S.SGML_DECL_QUOTED\n parser.sgmlDecl += c\n } else {\n parser.sgmlDecl += c\n }\n continue\n\n case S.SGML_DECL_QUOTED:\n if (c === parser.q) {\n parser.state = S.SGML_DECL\n parser.q = ''\n }\n parser.sgmlDecl += c\n continue\n\n case S.DOCTYPE:\n if (c === '>') {\n parser.state = S.TEXT\n emitNode(parser, 'ondoctype', parser.doctype)\n parser.doctype = true // just remember that we saw it.\n } else {\n parser.doctype += c\n if (c === '[') {\n parser.state = S.DOCTYPE_DTD\n } else if (is(quote, c)) {\n parser.state = S.DOCTYPE_QUOTED\n parser.q = c\n }\n }\n continue\n\n case S.DOCTYPE_QUOTED:\n parser.doctype += c\n if (c === parser.q) {\n parser.q = ''\n parser.state = S.DOCTYPE\n }\n continue\n\n case S.DOCTYPE_DTD:\n parser.doctype += c\n if (c === ']') {\n parser.state = S.DOCTYPE\n } else if (is(quote, c)) {\n parser.state = S.DOCTYPE_DTD_QUOTED\n parser.q = c\n }\n continue\n\n case S.DOCTYPE_DTD_QUOTED:\n parser.doctype += c\n if (c === parser.q) {\n parser.state = S.DOCTYPE_DTD\n parser.q = ''\n }\n continue\n\n case S.COMMENT:\n if (c === '-') {\n parser.state = S.COMMENT_ENDING\n } else {\n parser.comment += c\n }\n continue\n\n case S.COMMENT_ENDING:\n if (c === '-') {\n parser.state = S.COMMENT_ENDED\n parser.comment = textopts(parser.opt, parser.comment)\n if (parser.comment) {\n emitNode(parser, 'oncomment', parser.comment)\n }\n parser.comment = ''\n } else {\n parser.comment += '-' + c\n parser.state = S.COMMENT\n }\n continue\n\n case S.COMMENT_ENDED:\n if (c !== '>') {\n strictFail(parser, 'Malformed comment')\n // allow <!-- blah -- bloo --> in non-strict mode,\n // which is a comment of \" blah -- bloo \"\n parser.comment += '--' + c\n parser.state = S.COMMENT\n } else {\n parser.state = S.TEXT\n }\n continue\n\n case S.CDATA:\n if (c === ']') {\n parser.state = S.CDATA_ENDING\n } else {\n parser.cdata += c\n }\n continue\n\n case S.CDATA_ENDING:\n if (c === ']') {\n parser.state = S.CDATA_ENDING_2\n } else {\n parser.cdata += ']' + c\n parser.state = S.CDATA\n }\n continue\n\n case S.CDATA_ENDING_2:\n if (c === '>') {\n if (parser.cdata) {\n emitNode(parser, 'oncdata', parser.cdata)\n }\n emitNode(parser, 'onclosecdata')\n parser.cdata = ''\n parser.state = S.TEXT\n } else if (c === ']') {\n parser.cdata += ']'\n } else {\n parser.cdata += ']]' + c\n parser.state = S.CDATA\n }\n continue\n\n case S.PROC_INST:\n if (c === '?') {\n parser.state = S.PROC_INST_ENDING\n } else if (is(whitespace, c)) {\n parser.state = S.PROC_INST_BODY\n } else {\n parser.procInstName += c\n }\n continue\n\n case S.PROC_INST_BODY:\n if (!parser.procInstBody && is(whitespace, c)) {\n continue\n } else if (c === '?') {\n parser.state = S.PROC_INST_ENDING\n } else {\n parser.procInstBody += c\n }\n continue\n\n case S.PROC_INST_ENDING:\n if (c === '>') {\n emitNode(parser, 'onprocessinginstruction', {\n name: parser.procInstName,\n body: parser.procInstBody\n })\n parser.procInstName = parser.procInstBody = ''\n parser.state = S.TEXT\n } else {\n parser.procInstBody += '?' + c\n parser.state = S.PROC_INST_BODY\n }\n continue\n\n case S.OPEN_TAG:\n if (is(nameBody, c)) {\n parser.tagName += c\n } else {\n newTag(parser)\n if (c === '>') {\n openTag(parser)\n } else if (c === '/') {\n parser.state = S.OPEN_TAG_SLASH\n } else {\n if (not(whitespace, c)) {\n strictFail(parser, 'Invalid character in tag name')\n }\n parser.state = S.ATTRIB\n }\n }\n continue\n\n case S.OPEN_TAG_SLASH:\n if (c === '>') {\n openTag(parser, true)\n closeTag(parser)\n } else {\n strictFail(parser, 'Forward-slash in opening tag not followed by >')\n parser.state = S.ATTRIB\n }\n continue\n\n case S.ATTRIB:\n // haven't read the attribute name yet.\n if (is(whitespace, c)) {\n continue\n } else if (c === '>') {\n openTag(parser)\n } else if (c === '/') {\n parser.state = S.OPEN_TAG_SLASH\n } else if (is(nameStart, c)) {\n parser.attribName = c\n parser.attribValue = ''\n parser.state = S.ATTRIB_NAME\n } else {\n strictFail(parser, 'Invalid attribute name')\n }\n continue\n\n case S.ATTRIB_NAME:\n if (c === '=') {\n parser.state = S.ATTRIB_VALUE\n } else if (c === '>') {\n strictFail(parser, 'Attribute without value')\n parser.attribValue = parser.attribName\n attrib(parser)\n openTag(parser)\n } else if (is(whitespace, c)) {\n parser.state = S.ATTRIB_NAME_SAW_WHITE\n } else if (is(nameBody, c)) {\n parser.attribName += c\n } else {\n strictFail(parser, 'Invalid attribute name')\n }\n continue\n\n case S.ATTRIB_NAME_SAW_WHITE:\n if (c === '=') {\n parser.state = S.ATTRIB_VALUE\n } else if (is(whitespace, c)) {\n continue\n } else {\n strictFail(parser, 'Attribute without value')\n parser.tag.attributes[parser.attribName] = ''\n parser.attribValue = ''\n emitNode(parser, 'onattribute', {\n name: parser.attribName,\n value: ''\n })\n parser.attribName = ''\n if (c === '>') {\n openTag(parser)\n } else if (is(nameStart, c)) {\n parser.attribName = c\n parser.state = S.ATTRIB_NAME\n } else {\n strictFail(parser, 'Invalid attribute name')\n parser.state = S.ATTRIB\n }\n }\n continue\n\n case S.ATTRIB_VALUE:\n if (is(whitespace, c)) {\n continue\n } else if (is(quote, c)) {\n parser.q = c\n parser.state = S.ATTRIB_VALUE_QUOTED\n } else {\n strictFail(parser, 'Unquoted attribute value')\n parser.state = S.ATTRIB_VALUE_UNQUOTED\n parser.attribValue = c\n }\n continue\n\n case S.ATTRIB_VALUE_QUOTED:\n if (c !== parser.q) {\n if (c === '&') {\n parser.state = S.ATTRIB_VALUE_ENTITY_Q\n } else {\n parser.attribValue += c\n }\n continue\n }\n attrib(parser)\n parser.q = ''\n parser.state = S.ATTRIB_VALUE_CLOSED\n continue\n\n case S.ATTRIB_VALUE_CLOSED:\n if (is(whitespace, c)) {\n parser.state = S.ATTRIB\n } else if (c === '>') {\n openTag(parser)\n } else if (c === '/') {\n parser.state = S.OPEN_TAG_SLASH\n } else if (is(nameStart, c)) {\n strictFail(parser, 'No whitespace between attributes')\n parser.attribName = c\n parser.attribValue = ''\n parser.state = S.ATTRIB_NAME\n } else {\n strictFail(parser, 'Invalid attribute name')\n }\n continue\n\n case S.ATTRIB_VALUE_UNQUOTED:\n if (not(attribEnd, c)) {\n if (c === '&') {\n parser.state = S.ATTRIB_VALUE_ENTITY_U\n } else {\n parser.attribValue += c\n }\n continue\n }\n attrib(parser)\n if (c === '>') {\n openTag(parser)\n } else {\n parser.state = S.ATTRIB\n }\n continue\n\n case S.CLOSE_TAG:\n if (!parser.tagName) {\n if (is(whitespace, c)) {\n continue\n } else if (not(nameStart, c)) {\n if (parser.script) {\n parser.script += '</' + c\n parser.state = S.SCRIPT\n } else {\n strictFail(parser, 'Invalid tagname in closing tag.')\n }\n } else {\n parser.tagName = c\n }\n } else if (c === '>') {\n closeTag(parser)\n } else if (is(nameBody, c)) {\n parser.tagName += c\n } else if (parser.script) {\n parser.script += '</' + parser.tagName\n parser.tagName = ''\n parser.state = S.SCRIPT\n } else {\n if (not(whitespace, c)) {\n strictFail(parser, 'Invalid tagname in closing tag')\n }\n parser.state = S.CLOSE_TAG_SAW_WHITE\n }\n continue\n\n case S.CLOSE_TAG_SAW_WHITE:\n if (is(whitespace, c)) {\n continue\n }\n if (c === '>') {\n closeTag(parser)\n } else {\n strictFail(parser, 'Invalid characters in closing tag')\n }\n continue\n\n case S.TEXT_ENTITY:\n case S.ATTRIB_VALUE_ENTITY_Q:\n case S.ATTRIB_VALUE_ENTITY_U:\n var returnState\n var buffer\n switch (parser.state) {\n case S.TEXT_ENTITY:\n returnState = S.TEXT\n buffer = 'textNode'\n break\n\n case S.ATTRIB_VALUE_ENTITY_Q:\n returnState = S.ATTRIB_VALUE_QUOTED\n buffer = 'attribValue'\n break\n\n case S.ATTRIB_VALUE_ENTITY_U:\n returnState = S.ATTRIB_VALUE_UNQUOTED\n buffer = 'attribValue'\n break\n }\n\n if (c === ';') {\n parser[buffer] += parseEntity(parser)\n parser.entity = ''\n parser.state = returnState\n } else if (is(parser.entity.length ? entityBody : entityStart, c)) {\n parser.entity += c\n } else {\n strictFail(parser, 'Invalid character in entity name')\n parser[buffer] += '&' + parser.entity + c\n parser.entity = ''\n parser.state = returnState\n }\n\n continue\n\n default:\n throw new Error(parser, 'Unknown state: ' + parser.state)\n }\n } // while\n\n if (parser.position >= parser.bufferCheckPosition) {\n checkBufferLength(parser)\n }\n return parser\n }\n\n /*! http://mths.be/fromcodepoint v0.1.0 by @mathias */\n if (!String.fromCodePoint) {\n (function () {\n var stringFromCharCode = String.fromCharCode\n var floor = Math.floor\n var fromCodePoint = function () {\n var MAX_SIZE = 0x4000\n var codeUnits = []\n var highSurrogate\n var lowSurrogate\n var index = -1\n var length = arguments.length\n if (!length) {\n return ''\n }\n var result = ''\n while (++index < length) {\n var codePoint = Number(arguments[index])\n if (\n !isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity`\n codePoint < 0 || // not a valid Unicode code point\n codePoint > 0x10FFFF || // not a valid Unicode code point\n floor(codePoint) !== codePoint // not an integer\n ) {\n throw RangeError('Invalid code point: ' + codePoint)\n }\n if (codePoint <= 0xFFFF) { // BMP code point\n codeUnits.push(codePoint)\n } else { // Astral code point; split in surrogate halves\n // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n codePoint -= 0x10000\n highSurrogate = (codePoint >> 10) + 0xD800\n lowSurrogate = (codePoint % 0x400) + 0xDC00\n codeUnits.push(highSurrogate, lowSurrogate)\n }\n if (index + 1 === length || codeUnits.length > MAX_SIZE) {\n result += stringFromCharCode.apply(null, codeUnits)\n codeUnits.length = 0\n }\n }\n return result\n }\n if (Object.defineProperty) {\n Object.defineProperty(String, 'fromCodePoint', {\n value: fromCodePoint,\n configurable: true,\n writable: true\n })\n } else {\n String.fromCodePoint = fromCodePoint\n }\n }())\n }\n})(typeof exports === 'undefined' ? this.sax = {} : exports)\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nmodule.exports = Stream;\n\nvar EE = require('events').EventEmitter;\nvar inherits = require('inherits');\n\ninherits(Stream, EE);\nStream.Readable = require('readable-stream/lib/_stream_readable.js');\nStream.Writable = require('readable-stream/lib/_stream_writable.js');\nStream.Duplex = require('readable-stream/lib/_stream_duplex.js');\nStream.Transform = require('readable-stream/lib/_stream_transform.js');\nStream.PassThrough = require('readable-stream/lib/_stream_passthrough.js');\nStream.finished = require('readable-stream/lib/internal/streams/end-of-stream.js')\nStream.pipeline = require('readable-stream/lib/internal/streams/pipeline.js')\n\n// Backwards-compat with node 0.4.x\nStream.Stream = Stream;\n\n\n\n// old-style streams. Note that the pipe method (the only relevant\n// part of this class) is overridden in the Readable class.\n\nfunction Stream() {\n EE.call(this);\n}\n\nStream.prototype.pipe = function(dest, options) {\n var source = this;\n\n function ondata(chunk) {\n if (dest.writable) {\n if (false === dest.write(chunk) && source.pause) {\n source.pause();\n }\n }\n }\n\n source.on('data', ondata);\n\n function ondrain() {\n if (source.readable && source.resume) {\n source.resume();\n }\n }\n\n dest.on('drain', ondrain);\n\n // If the 'end' option is not supplied, dest.end() will be called when\n // source gets the 'end' or 'close' events. Only dest.end() once.\n if (!dest._isStdio && (!options || options.end !== false)) {\n source.on('end', onend);\n source.on('close', onclose);\n }\n\n var didOnEnd = false;\n function onend() {\n if (didOnEnd) return;\n didOnEnd = true;\n\n dest.end();\n }\n\n\n function onclose() {\n if (didOnEnd) return;\n didOnEnd = true;\n\n if (typeof dest.destroy === 'function') dest.destroy();\n }\n\n // don't leave dangling pipes when there are errors.\n function onerror(er) {\n cleanup();\n if (EE.listenerCount(this, 'error') === 0) {\n throw er; // Unhandled stream error in pipe.\n }\n }\n\n source.on('error', onerror);\n dest.on('error', onerror);\n\n // remove all the event listeners that were added.\n function cleanup() {\n source.removeListener('data', ondata);\n dest.removeListener('drain', ondrain);\n\n source.removeListener('end', onend);\n source.removeListener('close', onclose);\n\n source.removeListener('error', onerror);\n dest.removeListener('error', onerror);\n\n source.removeListener('end', cleanup);\n source.removeListener('close', cleanup);\n\n dest.removeListener('close', cleanup);\n }\n\n source.on('end', cleanup);\n source.on('close', cleanup);\n\n dest.on('close', cleanup);\n\n dest.emit('pipe', source);\n\n // Allow for unix-like usage: A.pipe(B).pipe(C)\n return dest;\n};\n","if (typeof Object.create === 'function') {\n // implementation from standard node.js 'util' module\n module.exports = function inherits(ctor, superCtor) {\n if (superCtor) {\n ctor.super_ = superCtor\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n })\n }\n };\n} else {\n // old school shim for old browsers\n module.exports = function inherits(ctor, superCtor) {\n if (superCtor) {\n ctor.super_ = superCtor\n var TempCtor = function () {}\n TempCtor.prototype = superCtor.prototype\n ctor.prototype = new TempCtor()\n ctor.prototype.constructor = ctor\n }\n }\n}\n","'use strict';\n\nfunction _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }\n\nvar codes = {};\n\nfunction createErrorType(code, message, Base) {\n if (!Base) {\n Base = Error;\n }\n\n function getMessage(arg1, arg2, arg3) {\n if (typeof message === 'string') {\n return message;\n } else {\n return message(arg1, arg2, arg3);\n }\n }\n\n var NodeError =\n /*#__PURE__*/\n function (_Base) {\n _inheritsLoose(NodeError, _Base);\n\n function NodeError(arg1, arg2, arg3) {\n return _Base.call(this, getMessage(arg1, arg2, arg3)) || this;\n }\n\n return NodeError;\n }(Base);\n\n NodeError.prototype.name = Base.name;\n NodeError.prototype.code = code;\n codes[code] = NodeError;\n} // https://github.com/nodejs/node/blob/v10.8.0/lib/internal/errors.js\n\n\nfunction oneOf(expected, thing) {\n if (Array.isArray(expected)) {\n var len = expected.length;\n expected = expected.map(function (i) {\n return String(i);\n });\n\n if (len > 2) {\n return \"one of \".concat(thing, \" \").concat(expected.slice(0, len - 1).join(', '), \", or \") + expected[len - 1];\n } else if (len === 2) {\n return \"one of \".concat(thing, \" \").concat(expected[0], \" or \").concat(expected[1]);\n } else {\n return \"of \".concat(thing, \" \").concat(expected[0]);\n }\n } else {\n return \"of \".concat(thing, \" \").concat(String(expected));\n }\n} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith\n\n\nfunction startsWith(str, search, pos) {\n return str.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search;\n} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith\n\n\nfunction endsWith(str, search, this_len) {\n if (this_len === undefined || this_len > str.length) {\n this_len = str.length;\n }\n\n return str.substring(this_len - search.length, this_len) === search;\n} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes\n\n\nfunction includes(str, search, start) {\n if (typeof start !== 'number') {\n start = 0;\n }\n\n if (start + search.length > str.length) {\n return false;\n } else {\n return str.indexOf(search, start) !== -1;\n }\n}\n\ncreateErrorType('ERR_INVALID_OPT_VALUE', function (name, value) {\n return 'The value \"' + value + '\" is invalid for option \"' + name + '\"';\n}, TypeError);\ncreateErrorType('ERR_INVALID_ARG_TYPE', function (name, expected, actual) {\n // determiner: 'must be' or 'must not be'\n var determiner;\n\n if (typeof expected === 'string' && startsWith(expected, 'not ')) {\n determiner = 'must not be';\n expected = expected.replace(/^not /, '');\n } else {\n determiner = 'must be';\n }\n\n var msg;\n\n if (endsWith(name, ' argument')) {\n // For cases like 'first argument'\n msg = \"The \".concat(name, \" \").concat(determiner, \" \").concat(oneOf(expected, 'type'));\n } else {\n var type = includes(name, '.') ? 'property' : 'argument';\n msg = \"The \\\"\".concat(name, \"\\\" \").concat(type, \" \").concat(determiner, \" \").concat(oneOf(expected, 'type'));\n }\n\n msg += \". Received type \".concat(typeof actual);\n return msg;\n}, TypeError);\ncreateErrorType('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF');\ncreateErrorType('ERR_METHOD_NOT_IMPLEMENTED', function (name) {\n return 'The ' + name + ' method is not implemented';\n});\ncreateErrorType('ERR_STREAM_PREMATURE_CLOSE', 'Premature close');\ncreateErrorType('ERR_STREAM_DESTROYED', function (name) {\n return 'Cannot call ' + name + ' after a stream was destroyed';\n});\ncreateErrorType('ERR_MULTIPLE_CALLBACK', 'Callback called multiple times');\ncreateErrorType('ERR_STREAM_CANNOT_PIPE', 'Cannot pipe, not readable');\ncreateErrorType('ERR_STREAM_WRITE_AFTER_END', 'write after end');\ncreateErrorType('ERR_STREAM_NULL_VALUES', 'May not write null values to stream', TypeError);\ncreateErrorType('ERR_UNKNOWN_ENCODING', function (arg) {\n return 'Unknown encoding: ' + arg;\n}, TypeError);\ncreateErrorType('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', 'stream.unshift() after end event');\nmodule.exports.codes = codes;\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n// a duplex stream is just a stream that is both readable and writable.\n// Since JS doesn't have multiple prototypal inheritance, this class\n// prototypally inherits from Readable, and then parasitically from\n// Writable.\n'use strict';\n/*<replacement>*/\n\nvar objectKeys = Object.keys || function (obj) {\n var keys = [];\n\n for (var key in obj) {\n keys.push(key);\n }\n\n return keys;\n};\n/*</replacement>*/\n\n\nmodule.exports = Duplex;\n\nvar Readable = require('./_stream_readable');\n\nvar Writable = require('./_stream_writable');\n\nrequire('inherits')(Duplex, Readable);\n\n{\n // Allow the keys array to be GC'ed.\n var keys = objectKeys(Writable.prototype);\n\n for (var v = 0; v < keys.length; v++) {\n var method = keys[v];\n if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];\n }\n}\n\nfunction Duplex(options) {\n if (!(this instanceof Duplex)) return new Duplex(options);\n Readable.call(this, options);\n Writable.call(this, options);\n this.allowHalfOpen = true;\n\n if (options) {\n if (options.readable === false) this.readable = false;\n if (options.writable === false) this.writable = false;\n\n if (options.allowHalfOpen === false) {\n this.allowHalfOpen = false;\n this.once('end', onend);\n }\n }\n}\n\nObject.defineProperty(Duplex.prototype, 'writableHighWaterMark', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n return this._writableState.highWaterMark;\n }\n});\nObject.defineProperty(Duplex.prototype, 'writableBuffer', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n return this._writableState && this._writableState.getBuffer();\n }\n});\nObject.defineProperty(Duplex.prototype, 'writableLength', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n return this._writableState.length;\n }\n}); // the no-half-open enforcer\n\nfunction onend() {\n // If the writable side ended, then we're ok.\n if (this._writableState.ended) return; // no more data can be written.\n // But allow more writes to happen in this tick.\n\n process.nextTick(onEndNT, this);\n}\n\nfunction onEndNT(self) {\n self.end();\n}\n\nObject.defineProperty(Duplex.prototype, 'destroyed', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n if (this._readableState === undefined || this._writableState === undefined) {\n return false;\n }\n\n return this._readableState.destroyed && this._writableState.destroyed;\n },\n set: function set(value) {\n // we ignore the value if the stream\n // has not been initialized yet\n if (this._readableState === undefined || this._writableState === undefined) {\n return;\n } // backward compatibility, the user is explicitly\n // managing destroyed\n\n\n this._readableState.destroyed = value;\n this._writableState.destroyed = value;\n }\n});","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n// a passthrough stream.\n// basically just the most minimal sort of Transform stream.\n// Every written chunk gets output as-is.\n'use strict';\n\nmodule.exports = PassThrough;\n\nvar Transform = require('./_stream_transform');\n\nrequire('inherits')(PassThrough, Transform);\n\nfunction PassThrough(options) {\n if (!(this instanceof PassThrough)) return new PassThrough(options);\n Transform.call(this, options);\n}\n\nPassThrough.prototype._transform = function (chunk, encoding, cb) {\n cb(null, chunk);\n};","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n'use strict';\n\nmodule.exports = Readable;\n/*<replacement>*/\n\nvar Duplex;\n/*</replacement>*/\n\nReadable.ReadableState = ReadableState;\n/*<replacement>*/\n\nvar EE = require('events').EventEmitter;\n\nvar EElistenerCount = function EElistenerCount(emitter, type) {\n return emitter.listeners(type).length;\n};\n/*</replacement>*/\n\n/*<replacement>*/\n\n\nvar Stream = require('./internal/streams/stream');\n/*</replacement>*/\n\n\nvar Buffer = require('buffer').Buffer;\n\nvar OurUint8Array = global.Uint8Array || function () {};\n\nfunction _uint8ArrayToBuffer(chunk) {\n return Buffer.from(chunk);\n}\n\nfunction _isUint8Array(obj) {\n return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;\n}\n/*<replacement>*/\n\n\nvar debugUtil = require('util');\n\nvar debug;\n\nif (debugUtil && debugUtil.debuglog) {\n debug = debugUtil.debuglog('stream');\n} else {\n debug = function debug() {};\n}\n/*</replacement>*/\n\n\nvar BufferList = require('./internal/streams/buffer_list');\n\nvar destroyImpl = require('./internal/streams/destroy');\n\nvar _require = require('./internal/streams/state'),\n getHighWaterMark = _require.getHighWaterMark;\n\nvar _require$codes = require('../errors').codes,\n ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE,\n ERR_STREAM_PUSH_AFTER_EOF = _require$codes.ERR_STREAM_PUSH_AFTER_EOF,\n ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,\n ERR_STREAM_UNSHIFT_AFTER_END_EVENT = _require$codes.ERR_STREAM_UNSHIFT_AFTER_END_EVENT; // Lazy loaded to improve the startup performance.\n\n\nvar StringDecoder;\nvar createReadableStreamAsyncIterator;\nvar from;\n\nrequire('inherits')(Readable, Stream);\n\nvar errorOrDestroy = destroyImpl.errorOrDestroy;\nvar kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];\n\nfunction prependListener(emitter, event, fn) {\n // Sadly this is not cacheable as some libraries bundle their own\n // event emitter implementation with them.\n if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); // This is a hack to make sure that our error handler is attached before any\n // userland ones. NEVER DO THIS. This is here only because this code needs\n // to continue to work with older versions of Node.js that do not include\n // the prependListener() method. The goal is to eventually remove this hack.\n\n if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (Array.isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];\n}\n\nfunction ReadableState(options, stream, isDuplex) {\n Duplex = Duplex || require('./_stream_duplex');\n options = options || {}; // Duplex streams are both readable and writable, but share\n // the same options object.\n // However, some cases require setting options to different\n // values for the readable and the writable sides of the duplex stream.\n // These options can be provided separately as readableXXX and writableXXX.\n\n if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex; // object stream flag. Used to make read(n) ignore n and to\n // make all the buffer merging and length checks go away\n\n this.objectMode = !!options.objectMode;\n if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; // the point at which it stops calling _read() to fill the buffer\n // Note: 0 is a valid value, means \"don't call _read preemptively ever\"\n\n this.highWaterMark = getHighWaterMark(this, options, 'readableHighWaterMark', isDuplex); // A linked list is used to store data chunks instead of an array because the\n // linked list can remove elements from the beginning faster than\n // array.shift()\n\n this.buffer = new BufferList();\n this.length = 0;\n this.pipes = null;\n this.pipesCount = 0;\n this.flowing = null;\n this.ended = false;\n this.endEmitted = false;\n this.reading = false; // a flag to be able to tell if the event 'readable'/'data' is emitted\n // immediately, or on a later tick. We set this to true at first, because\n // any actions that shouldn't happen until \"later\" should generally also\n // not happen before the first read call.\n\n this.sync = true; // whenever we return null, then we set a flag to say\n // that we're awaiting a 'readable' event emission.\n\n this.needReadable = false;\n this.emittedReadable = false;\n this.readableListening = false;\n this.resumeScheduled = false;\n this.paused = true; // Should close be emitted on destroy. Defaults to true.\n\n this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'end' (and potentially 'finish')\n\n this.autoDestroy = !!options.autoDestroy; // has it been destroyed\n\n this.destroyed = false; // Crypto is kind of old and crusty. Historically, its default string\n // encoding is 'binary' so we have to make this configurable.\n // Everything else in the universe uses 'utf8', though.\n\n this.defaultEncoding = options.defaultEncoding || 'utf8'; // the number of writers that are awaiting a drain event in .pipe()s\n\n this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled\n\n this.readingMore = false;\n this.decoder = null;\n this.encoding = null;\n\n if (options.encoding) {\n if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;\n this.decoder = new StringDecoder(options.encoding);\n this.encoding = options.encoding;\n }\n}\n\nfunction Readable(options) {\n Duplex = Duplex || require('./_stream_duplex');\n if (!(this instanceof Readable)) return new Readable(options); // Checking for a Stream.Duplex instance is faster here instead of inside\n // the ReadableState constructor, at least with V8 6.5\n\n var isDuplex = this instanceof Duplex;\n this._readableState = new ReadableState(options, this, isDuplex); // legacy\n\n this.readable = true;\n\n if (options) {\n if (typeof options.read === 'function') this._read = options.read;\n if (typeof options.destroy === 'function') this._destroy = options.destroy;\n }\n\n Stream.call(this);\n}\n\nObject.defineProperty(Readable.prototype, 'destroyed', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n if (this._readableState === undefined) {\n return false;\n }\n\n return this._readableState.destroyed;\n },\n set: function set(value) {\n // we ignore the value if the stream\n // has not been initialized yet\n if (!this._readableState) {\n return;\n } // backward compatibility, the user is explicitly\n // managing destroyed\n\n\n this._readableState.destroyed = value;\n }\n});\nReadable.prototype.destroy = destroyImpl.destroy;\nReadable.prototype._undestroy = destroyImpl.undestroy;\n\nReadable.prototype._destroy = function (err, cb) {\n cb(err);\n}; // Manually shove something into the read() buffer.\n// This returns true if the highWaterMark has not been hit yet,\n// similar to how Writable.write() returns true if you should\n// write() some more.\n\n\nReadable.prototype.push = function (chunk, encoding) {\n var state = this._readableState;\n var skipChunkCheck;\n\n if (!state.objectMode) {\n if (typeof chunk === 'string') {\n encoding = encoding || state.defaultEncoding;\n\n if (encoding !== state.encoding) {\n chunk = Buffer.from(chunk, encoding);\n encoding = '';\n }\n\n skipChunkCheck = true;\n }\n } else {\n skipChunkCheck = true;\n }\n\n return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);\n}; // Unshift should *always* be something directly out of read()\n\n\nReadable.prototype.unshift = function (chunk) {\n return readableAddChunk(this, chunk, null, true, false);\n};\n\nfunction readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {\n debug('readableAddChunk', chunk);\n var state = stream._readableState;\n\n if (chunk === null) {\n state.reading = false;\n onEofChunk(stream, state);\n } else {\n var er;\n if (!skipChunkCheck) er = chunkInvalid(state, chunk);\n\n if (er) {\n errorOrDestroy(stream, er);\n } else if (state.objectMode || chunk && chunk.length > 0) {\n if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {\n chunk = _uint8ArrayToBuffer(chunk);\n }\n\n if (addToFront) {\n if (state.endEmitted) errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT());else addChunk(stream, state, chunk, true);\n } else if (state.ended) {\n errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF());\n } else if (state.destroyed) {\n return false;\n } else {\n state.reading = false;\n\n if (state.decoder && !encoding) {\n chunk = state.decoder.write(chunk);\n if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);\n } else {\n addChunk(stream, state, chunk, false);\n }\n }\n } else if (!addToFront) {\n state.reading = false;\n maybeReadMore(stream, state);\n }\n } // We can push more data if we are below the highWaterMark.\n // Also, if we have no data yet, we can stand some more bytes.\n // This is to work around cases where hwm=0, such as the repl.\n\n\n return !state.ended && (state.length < state.highWaterMark || state.length === 0);\n}\n\nfunction addChunk(stream, state, chunk, addToFront) {\n if (state.flowing && state.length === 0 && !state.sync) {\n state.awaitDrain = 0;\n stream.emit('data', chunk);\n } else {\n // update the buffer info.\n state.length += state.objectMode ? 1 : chunk.length;\n if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);\n if (state.needReadable) emitReadable(stream);\n }\n\n maybeReadMore(stream, state);\n}\n\nfunction chunkInvalid(state, chunk) {\n var er;\n\n if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {\n er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk);\n }\n\n return er;\n}\n\nReadable.prototype.isPaused = function () {\n return this._readableState.flowing === false;\n}; // backwards compatibility.\n\n\nReadable.prototype.setEncoding = function (enc) {\n if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;\n var decoder = new StringDecoder(enc);\n this._readableState.decoder = decoder; // If setEncoding(null), decoder.encoding equals utf8\n\n this._readableState.encoding = this._readableState.decoder.encoding; // Iterate over current buffer to convert already stored Buffers:\n\n var p = this._readableState.buffer.head;\n var content = '';\n\n while (p !== null) {\n content += decoder.write(p.data);\n p = p.next;\n }\n\n this._readableState.buffer.clear();\n\n if (content !== '') this._readableState.buffer.push(content);\n this._readableState.length = content.length;\n return this;\n}; // Don't raise the hwm > 1GB\n\n\nvar MAX_HWM = 0x40000000;\n\nfunction computeNewHighWaterMark(n) {\n if (n >= MAX_HWM) {\n // TODO(ronag): Throw ERR_VALUE_OUT_OF_RANGE.\n n = MAX_HWM;\n } else {\n // Get the next highest power of 2 to prevent increasing hwm excessively in\n // tiny amounts\n n--;\n n |= n >>> 1;\n n |= n >>> 2;\n n |= n >>> 4;\n n |= n >>> 8;\n n |= n >>> 16;\n n++;\n }\n\n return n;\n} // This function is designed to be inlinable, so please take care when making\n// changes to the function body.\n\n\nfunction howMuchToRead(n, state) {\n if (n <= 0 || state.length === 0 && state.ended) return 0;\n if (state.objectMode) return 1;\n\n if (n !== n) {\n // Only flow one buffer at a time\n if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;\n } // If we're asking for more than the current hwm, then raise the hwm.\n\n\n if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);\n if (n <= state.length) return n; // Don't have enough\n\n if (!state.ended) {\n state.needReadable = true;\n return 0;\n }\n\n return state.length;\n} // you can override either this method, or the async _read(n) below.\n\n\nReadable.prototype.read = function (n) {\n debug('read', n);\n n = parseInt(n, 10);\n var state = this._readableState;\n var nOrig = n;\n if (n !== 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we\n // already have a bunch of data in the buffer, then just trigger\n // the 'readable' event and move on.\n\n if (n === 0 && state.needReadable && ((state.highWaterMark !== 0 ? state.length >= state.highWaterMark : state.length > 0) || state.ended)) {\n debug('read: emitReadable', state.length, state.ended);\n if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);\n return null;\n }\n\n n = howMuchToRead(n, state); // if we've ended, and we're now clear, then finish it up.\n\n if (n === 0 && state.ended) {\n if (state.length === 0) endReadable(this);\n return null;\n } // All the actual chunk generation logic needs to be\n // *below* the call to _read. The reason is that in certain\n // synthetic stream cases, such as passthrough streams, _read\n // may be a completely synchronous operation which may change\n // the state of the read buffer, providing enough data when\n // before there was *not* enough.\n //\n // So, the steps are:\n // 1. Figure out what the state of things will be after we do\n // a read from the buffer.\n //\n // 2. If that resulting state will trigger a _read, then call _read.\n // Note that this may be asynchronous, or synchronous. Yes, it is\n // deeply ugly to write APIs this way, but that still doesn't mean\n // that the Readable class should behave improperly, as streams are\n // designed to be sync/async agnostic.\n // Take note if the _read call is sync or async (ie, if the read call\n // has returned yet), so that we know whether or not it's safe to emit\n // 'readable' etc.\n //\n // 3. Actually pull the requested chunks out of the buffer and return.\n // if we need a readable event, then we need to do some reading.\n\n\n var doRead = state.needReadable;\n debug('need readable', doRead); // if we currently have less than the highWaterMark, then also read some\n\n if (state.length === 0 || state.length - n < state.highWaterMark) {\n doRead = true;\n debug('length less than watermark', doRead);\n } // however, if we've ended, then there's no point, and if we're already\n // reading, then it's unnecessary.\n\n\n if (state.ended || state.reading) {\n doRead = false;\n debug('reading or ended', doRead);\n } else if (doRead) {\n debug('do read');\n state.reading = true;\n state.sync = true; // if the length is currently zero, then we *need* a readable event.\n\n if (state.length === 0) state.needReadable = true; // call internal read method\n\n this._read(state.highWaterMark);\n\n state.sync = false; // If _read pushed data synchronously, then `reading` will be false,\n // and we need to re-evaluate how much data we can return to the user.\n\n if (!state.reading) n = howMuchToRead(nOrig, state);\n }\n\n var ret;\n if (n > 0) ret = fromList(n, state);else ret = null;\n\n if (ret === null) {\n state.needReadable = state.length <= state.highWaterMark;\n n = 0;\n } else {\n state.length -= n;\n state.awaitDrain = 0;\n }\n\n if (state.length === 0) {\n // If we have nothing in the buffer, then we want to know\n // as soon as we *do* get something into the buffer.\n if (!state.ended) state.needReadable = true; // If we tried to read() past the EOF, then emit end on the next tick.\n\n if (nOrig !== n && state.ended) endReadable(this);\n }\n\n if (ret !== null) this.emit('data', ret);\n return ret;\n};\n\nfunction onEofChunk(stream, state) {\n debug('onEofChunk');\n if (state.ended) return;\n\n if (state.decoder) {\n var chunk = state.decoder.end();\n\n if (chunk && chunk.length) {\n state.buffer.push(chunk);\n state.length += state.objectMode ? 1 : chunk.length;\n }\n }\n\n state.ended = true;\n\n if (state.sync) {\n // if we are sync, wait until next tick to emit the data.\n // Otherwise we risk emitting data in the flow()\n // the readable code triggers during a read() call\n emitReadable(stream);\n } else {\n // emit 'readable' now to make sure it gets picked up.\n state.needReadable = false;\n\n if (!state.emittedReadable) {\n state.emittedReadable = true;\n emitReadable_(stream);\n }\n }\n} // Don't emit readable right away in sync mode, because this can trigger\n// another read() call => stack overflow. This way, it might trigger\n// a nextTick recursion warning, but that's not so bad.\n\n\nfunction emitReadable(stream) {\n var state = stream._readableState;\n debug('emitReadable', state.needReadable, state.emittedReadable);\n state.needReadable = false;\n\n if (!state.emittedReadable) {\n debug('emitReadable', state.flowing);\n state.emittedReadable = true;\n process.nextTick(emitReadable_, stream);\n }\n}\n\nfunction emitReadable_(stream) {\n var state = stream._readableState;\n debug('emitReadable_', state.destroyed, state.length, state.ended);\n\n if (!state.destroyed && (state.length || state.ended)) {\n stream.emit('readable');\n state.emittedReadable = false;\n } // The stream needs another readable event if\n // 1. It is not flowing, as the flow mechanism will take\n // care of it.\n // 2. It is not ended.\n // 3. It is below the highWaterMark, so we can schedule\n // another readable later.\n\n\n state.needReadable = !state.flowing && !state.ended && state.length <= state.highWaterMark;\n flow(stream);\n} // at this point, the user has presumably seen the 'readable' event,\n// and called read() to consume some data. that may have triggered\n// in turn another _read(n) call, in which case reading = true if\n// it's in progress.\n// However, if we're not ended, or reading, and the length < hwm,\n// then go ahead and try to read some more preemptively.\n\n\nfunction maybeReadMore(stream, state) {\n if (!state.readingMore) {\n state.readingMore = true;\n process.nextTick(maybeReadMore_, stream, state);\n }\n}\n\nfunction maybeReadMore_(stream, state) {\n // Attempt to read more data if we should.\n //\n // The conditions for reading more data are (one of):\n // - Not enough data buffered (state.length < state.highWaterMark). The loop\n // is responsible for filling the buffer with enough data if such data\n // is available. If highWaterMark is 0 and we are not in the flowing mode\n // we should _not_ attempt to buffer any extra data. We'll get more data\n // when the stream consumer calls read() instead.\n // - No data in the buffer, and the stream is in flowing mode. In this mode\n // the loop below is responsible for ensuring read() is called. Failing to\n // call read here would abort the flow and there's no other mechanism for\n // continuing the flow if the stream consumer has just subscribed to the\n // 'data' event.\n //\n // In addition to the above conditions to keep reading data, the following\n // conditions prevent the data from being read:\n // - The stream has ended (state.ended).\n // - There is already a pending 'read' operation (state.reading). This is a\n // case where the the stream has called the implementation defined _read()\n // method, but they are processing the call asynchronously and have _not_\n // called push() with new data. In this case we skip performing more\n // read()s. The execution ends in this method again after the _read() ends\n // up calling push() with more data.\n while (!state.reading && !state.ended && (state.length < state.highWaterMark || state.flowing && state.length === 0)) {\n var len = state.length;\n debug('maybeReadMore read 0');\n stream.read(0);\n if (len === state.length) // didn't get any data, stop spinning.\n break;\n }\n\n state.readingMore = false;\n} // abstract method. to be overridden in specific implementation classes.\n// call cb(er, data) where data is <= n in length.\n// for virtual (non-string, non-buffer) streams, \"length\" is somewhat\n// arbitrary, and perhaps not very meaningful.\n\n\nReadable.prototype._read = function (n) {\n errorOrDestroy(this, new ERR_METHOD_NOT_IMPLEMENTED('_read()'));\n};\n\nReadable.prototype.pipe = function (dest, pipeOpts) {\n var src = this;\n var state = this._readableState;\n\n switch (state.pipesCount) {\n case 0:\n state.pipes = dest;\n break;\n\n case 1:\n state.pipes = [state.pipes, dest];\n break;\n\n default:\n state.pipes.push(dest);\n break;\n }\n\n state.pipesCount += 1;\n debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);\n var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;\n var endFn = doEnd ? onend : unpipe;\n if (state.endEmitted) process.nextTick(endFn);else src.once('end', endFn);\n dest.on('unpipe', onunpipe);\n\n function onunpipe(readable, unpipeInfo) {\n debug('onunpipe');\n\n if (readable === src) {\n if (unpipeInfo && unpipeInfo.hasUnpiped === false) {\n unpipeInfo.hasUnpiped = true;\n cleanup();\n }\n }\n }\n\n function onend() {\n debug('onend');\n dest.end();\n } // when the dest drains, it reduces the awaitDrain counter\n // on the source. This would be more elegant with a .once()\n // handler in flow(), but adding and removing repeatedly is\n // too slow.\n\n\n var ondrain = pipeOnDrain(src);\n dest.on('drain', ondrain);\n var cleanedUp = false;\n\n function cleanup() {\n debug('cleanup'); // cleanup event handlers once the pipe is broken\n\n dest.removeListener('close', onclose);\n dest.removeListener('finish', onfinish);\n dest.removeListener('drain', ondrain);\n dest.removeListener('error', onerror);\n dest.removeListener('unpipe', onunpipe);\n src.removeListener('end', onend);\n src.removeListener('end', unpipe);\n src.removeListener('data', ondata);\n cleanedUp = true; // if the reader is waiting for a drain event from this\n // specific writer, then it would cause it to never start\n // flowing again.\n // So, if this is awaiting a drain, then we just call it now.\n // If we don't know, then assume that we are waiting for one.\n\n if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();\n }\n\n src.on('data', ondata);\n\n function ondata(chunk) {\n debug('ondata');\n var ret = dest.write(chunk);\n debug('dest.write', ret);\n\n if (ret === false) {\n // If the user unpiped during `dest.write()`, it is possible\n // to get stuck in a permanently paused state if that write\n // also returned false.\n // => Check whether `dest` is still a piping destination.\n if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {\n debug('false write response, pause', state.awaitDrain);\n state.awaitDrain++;\n }\n\n src.pause();\n }\n } // if the dest has an error, then stop piping into it.\n // however, don't suppress the throwing behavior for this.\n\n\n function onerror(er) {\n debug('onerror', er);\n unpipe();\n dest.removeListener('error', onerror);\n if (EElistenerCount(dest, 'error') === 0) errorOrDestroy(dest, er);\n } // Make sure our error handler is attached before userland ones.\n\n\n prependListener(dest, 'error', onerror); // Both close and finish should trigger unpipe, but only once.\n\n function onclose() {\n dest.removeListener('finish', onfinish);\n unpipe();\n }\n\n dest.once('close', onclose);\n\n function onfinish() {\n debug('onfinish');\n dest.removeListener('close', onclose);\n unpipe();\n }\n\n dest.once('finish', onfinish);\n\n function unpipe() {\n debug('unpipe');\n src.unpipe(dest);\n } // tell the dest that it's being piped to\n\n\n dest.emit('pipe', src); // start the flow if it hasn't been started already.\n\n if (!state.flowing) {\n debug('pipe resume');\n src.resume();\n }\n\n return dest;\n};\n\nfunction pipeOnDrain(src) {\n return function pipeOnDrainFunctionResult() {\n var state = src._readableState;\n debug('pipeOnDrain', state.awaitDrain);\n if (state.awaitDrain) state.awaitDrain--;\n\n if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {\n state.flowing = true;\n flow(src);\n }\n };\n}\n\nReadable.prototype.unpipe = function (dest) {\n var state = this._readableState;\n var unpipeInfo = {\n hasUnpiped: false\n }; // if we're not piping anywhere, then do nothing.\n\n if (state.pipesCount === 0) return this; // just one destination. most common case.\n\n if (state.pipesCount === 1) {\n // passed in one, but it's not the right one.\n if (dest && dest !== state.pipes) return this;\n if (!dest) dest = state.pipes; // got a match.\n\n state.pipes = null;\n state.pipesCount = 0;\n state.flowing = false;\n if (dest) dest.emit('unpipe', this, unpipeInfo);\n return this;\n } // slow case. multiple pipe destinations.\n\n\n if (!dest) {\n // remove all.\n var dests = state.pipes;\n var len = state.pipesCount;\n state.pipes = null;\n state.pipesCount = 0;\n state.flowing = false;\n\n for (var i = 0; i < len; i++) {\n dests[i].emit('unpipe', this, {\n hasUnpiped: false\n });\n }\n\n return this;\n } // try to find the right one.\n\n\n var index = indexOf(state.pipes, dest);\n if (index === -1) return this;\n state.pipes.splice(index, 1);\n state.pipesCount -= 1;\n if (state.pipesCount === 1) state.pipes = state.pipes[0];\n dest.emit('unpipe', this, unpipeInfo);\n return this;\n}; // set up data events if they are asked for\n// Ensure readable listeners eventually get something\n\n\nReadable.prototype.on = function (ev, fn) {\n var res = Stream.prototype.on.call(this, ev, fn);\n var state = this._readableState;\n\n if (ev === 'data') {\n // update readableListening so that resume() may be a no-op\n // a few lines down. This is needed to support once('readable').\n state.readableListening = this.listenerCount('readable') > 0; // Try start flowing on next tick if stream isn't explicitly paused\n\n if (state.flowing !== false) this.resume();\n } else if (ev === 'readable') {\n if (!state.endEmitted && !state.readableListening) {\n state.readableListening = state.needReadable = true;\n state.flowing = false;\n state.emittedReadable = false;\n debug('on readable', state.length, state.reading);\n\n if (state.length) {\n emitReadable(this);\n } else if (!state.reading) {\n process.nextTick(nReadingNextTick, this);\n }\n }\n }\n\n return res;\n};\n\nReadable.prototype.addListener = Readable.prototype.on;\n\nReadable.prototype.removeListener = function (ev, fn) {\n var res = Stream.prototype.removeListener.call(this, ev, fn);\n\n if (ev === 'readable') {\n // We need to check if there is someone still listening to\n // readable and reset the state. However this needs to happen\n // after readable has been emitted but before I/O (nextTick) to\n // support once('readable', fn) cycles. This means that calling\n // resume within the same tick will have no\n // effect.\n process.nextTick(updateReadableListening, this);\n }\n\n return res;\n};\n\nReadable.prototype.removeAllListeners = function (ev) {\n var res = Stream.prototype.removeAllListeners.apply(this, arguments);\n\n if (ev === 'readable' || ev === undefined) {\n // We need to check if there is someone still listening to\n // readable and reset the state. However this needs to happen\n // after readable has been emitted but before I/O (nextTick) to\n // support once('readable', fn) cycles. This means that calling\n // resume within the same tick will have no\n // effect.\n process.nextTick(updateReadableListening, this);\n }\n\n return res;\n};\n\nfunction updateReadableListening(self) {\n var state = self._readableState;\n state.readableListening = self.listenerCount('readable') > 0;\n\n if (state.resumeScheduled && !state.paused) {\n // flowing needs to be set to true now, otherwise\n // the upcoming resume will not flow.\n state.flowing = true; // crude way to check if we should resume\n } else if (self.listenerCount('data') > 0) {\n self.resume();\n }\n}\n\nfunction nReadingNextTick(self) {\n debug('readable nexttick read 0');\n self.read(0);\n} // pause() and resume() are remnants of the legacy readable stream API\n// If the user uses them, then switch into old mode.\n\n\nReadable.prototype.resume = function () {\n var state = this._readableState;\n\n if (!state.flowing) {\n debug('resume'); // we flow only if there is no one listening\n // for readable, but we still have to call\n // resume()\n\n state.flowing = !state.readableListening;\n resume(this, state);\n }\n\n state.paused = false;\n return this;\n};\n\nfunction resume(stream, state) {\n if (!state.resumeScheduled) {\n state.resumeScheduled = true;\n process.nextTick(resume_, stream, state);\n }\n}\n\nfunction resume_(stream, state) {\n debug('resume', state.reading);\n\n if (!state.reading) {\n stream.read(0);\n }\n\n state.resumeScheduled = false;\n stream.emit('resume');\n flow(stream);\n if (state.flowing && !state.reading) stream.read(0);\n}\n\nReadable.prototype.pause = function () {\n debug('call pause flowing=%j', this._readableState.flowing);\n\n if (this._readableState.flowing !== false) {\n debug('pause');\n this._readableState.flowing = false;\n this.emit('pause');\n }\n\n this._readableState.paused = true;\n return this;\n};\n\nfunction flow(stream) {\n var state = stream._readableState;\n debug('flow', state.flowing);\n\n while (state.flowing && stream.read() !== null) {\n ;\n }\n} // wrap an old-style stream as the async data source.\n// This is *not* part of the readable stream interface.\n// It is an ugly unfortunate mess of history.\n\n\nReadable.prototype.wrap = function (stream) {\n var _this = this;\n\n var state = this._readableState;\n var paused = false;\n stream.on('end', function () {\n debug('wrapped end');\n\n if (state.decoder && !state.ended) {\n var chunk = state.decoder.end();\n if (chunk && chunk.length) _this.push(chunk);\n }\n\n _this.push(null);\n });\n stream.on('data', function (chunk) {\n debug('wrapped data');\n if (state.decoder) chunk = state.decoder.write(chunk); // don't skip over falsy values in objectMode\n\n if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;\n\n var ret = _this.push(chunk);\n\n if (!ret) {\n paused = true;\n stream.pause();\n }\n }); // proxy all the other methods.\n // important when wrapping filters and duplexes.\n\n for (var i in stream) {\n if (this[i] === undefined && typeof stream[i] === 'function') {\n this[i] = function methodWrap(method) {\n return function methodWrapReturnFunction() {\n return stream[method].apply(stream, arguments);\n };\n }(i);\n }\n } // proxy certain important events.\n\n\n for (var n = 0; n < kProxyEvents.length; n++) {\n stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n]));\n } // when we try to consume some more bytes, simply unpause the\n // underlying stream.\n\n\n this._read = function (n) {\n debug('wrapped _read', n);\n\n if (paused) {\n paused = false;\n stream.resume();\n }\n };\n\n return this;\n};\n\nif (typeof Symbol === 'function') {\n Readable.prototype[Symbol.asyncIterator] = function () {\n if (createReadableStreamAsyncIterator === undefined) {\n createReadableStreamAsyncIterator = require('./internal/streams/async_iterator');\n }\n\n return createReadableStreamAsyncIterator(this);\n };\n}\n\nObject.defineProperty(Readable.prototype, 'readableHighWaterMark', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n return this._readableState.highWaterMark;\n }\n});\nObject.defineProperty(Readable.prototype, 'readableBuffer', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n return this._readableState && this._readableState.buffer;\n }\n});\nObject.defineProperty(Readable.prototype, 'readableFlowing', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n return this._readableState.flowing;\n },\n set: function set(state) {\n if (this._readableState) {\n this._readableState.flowing = state;\n }\n }\n}); // exposed for testing purposes only.\n\nReadable._fromList = fromList;\nObject.defineProperty(Readable.prototype, 'readableLength', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n return this._readableState.length;\n }\n}); // Pluck off n bytes from an array of buffers.\n// Length is the combined lengths of all the buffers in the list.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\n\nfunction fromList(n, state) {\n // nothing buffered\n if (state.length === 0) return null;\n var ret;\n if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {\n // read it all, truncate the list\n if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.first();else ret = state.buffer.concat(state.length);\n state.buffer.clear();\n } else {\n // read part of list\n ret = state.buffer.consume(n, state.decoder);\n }\n return ret;\n}\n\nfunction endReadable(stream) {\n var state = stream._readableState;\n debug('endReadable', state.endEmitted);\n\n if (!state.endEmitted) {\n state.ended = true;\n process.nextTick(endReadableNT, state, stream);\n }\n}\n\nfunction endReadableNT(state, stream) {\n debug('endReadableNT', state.endEmitted, state.length); // Check that we didn't get one last unshift.\n\n if (!state.endEmitted && state.length === 0) {\n state.endEmitted = true;\n stream.readable = false;\n stream.emit('end');\n\n if (state.autoDestroy) {\n // In case of duplex streams we need a way to detect\n // if the writable side is ready for autoDestroy as well\n var wState = stream._writableState;\n\n if (!wState || wState.autoDestroy && wState.finished) {\n stream.destroy();\n }\n }\n }\n}\n\nif (typeof Symbol === 'function') {\n Readable.from = function (iterable, opts) {\n if (from === undefined) {\n from = require('./internal/streams/from');\n }\n\n return from(Readable, iterable, opts);\n };\n}\n\nfunction indexOf(xs, x) {\n for (var i = 0, l = xs.length; i < l; i++) {\n if (xs[i] === x) return i;\n }\n\n return -1;\n}","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n// a transform stream is a readable/writable stream where you do\n// something with the data. Sometimes it's called a \"filter\",\n// but that's not a great name for it, since that implies a thing where\n// some bits pass through, and others are simply ignored. (That would\n// be a valid example of a transform, of course.)\n//\n// While the output is causally related to the input, it's not a\n// necessarily symmetric or synchronous transformation. For example,\n// a zlib stream might take multiple plain-text writes(), and then\n// emit a single compressed chunk some time in the future.\n//\n// Here's how this works:\n//\n// The Transform stream has all the aspects of the readable and writable\n// stream classes. When you write(chunk), that calls _write(chunk,cb)\n// internally, and returns false if there's a lot of pending writes\n// buffered up. When you call read(), that calls _read(n) until\n// there's enough pending readable data buffered up.\n//\n// In a transform stream, the written data is placed in a buffer. When\n// _read(n) is called, it transforms the queued up data, calling the\n// buffered _write cb's as it consumes chunks. If consuming a single\n// written chunk would result in multiple output chunks, then the first\n// outputted bit calls the readcb, and subsequent chunks just go into\n// the read buffer, and will cause it to emit 'readable' if necessary.\n//\n// This way, back-pressure is actually determined by the reading side,\n// since _read has to be called to start processing a new chunk. However,\n// a pathological inflate type of transform can cause excessive buffering\n// here. For example, imagine a stream where every byte of input is\n// interpreted as an integer from 0-255, and then results in that many\n// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in\n// 1kb of data being output. In this case, you could write a very small\n// amount of input, and end up with a very large amount of output. In\n// such a pathological inflating mechanism, there'd be no way to tell\n// the system to stop doing the transform. A single 4MB write could\n// cause the system to run out of memory.\n//\n// However, even in such a pathological case, only a single written chunk\n// would be consumed, and then the rest would wait (un-transformed) until\n// the results of the previous transformed chunk were consumed.\n'use strict';\n\nmodule.exports = Transform;\n\nvar _require$codes = require('../errors').codes,\n ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,\n ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK,\n ERR_TRANSFORM_ALREADY_TRANSFORMING = _require$codes.ERR_TRANSFORM_ALREADY_TRANSFORMING,\n ERR_TRANSFORM_WITH_LENGTH_0 = _require$codes.ERR_TRANSFORM_WITH_LENGTH_0;\n\nvar Duplex = require('./_stream_duplex');\n\nrequire('inherits')(Transform, Duplex);\n\nfunction afterTransform(er, data) {\n var ts = this._transformState;\n ts.transforming = false;\n var cb = ts.writecb;\n\n if (cb === null) {\n return this.emit('error', new ERR_MULTIPLE_CALLBACK());\n }\n\n ts.writechunk = null;\n ts.writecb = null;\n if (data != null) // single equals check for both `null` and `undefined`\n this.push(data);\n cb(er);\n var rs = this._readableState;\n rs.reading = false;\n\n if (rs.needReadable || rs.length < rs.highWaterMark) {\n this._read(rs.highWaterMark);\n }\n}\n\nfunction Transform(options) {\n if (!(this instanceof Transform)) return new Transform(options);\n Duplex.call(this, options);\n this._transformState = {\n afterTransform: afterTransform.bind(this),\n needTransform: false,\n transforming: false,\n writecb: null,\n writechunk: null,\n writeencoding: null\n }; // start out asking for a readable event once data is transformed.\n\n this._readableState.needReadable = true; // we have implemented the _read method, and done the other things\n // that Readable wants before the first _read call, so unset the\n // sync guard flag.\n\n this._readableState.sync = false;\n\n if (options) {\n if (typeof options.transform === 'function') this._transform = options.transform;\n if (typeof options.flush === 'function') this._flush = options.flush;\n } // When the writable side finishes, then flush out anything remaining.\n\n\n this.on('prefinish', prefinish);\n}\n\nfunction prefinish() {\n var _this = this;\n\n if (typeof this._flush === 'function' && !this._readableState.destroyed) {\n this._flush(function (er, data) {\n done(_this, er, data);\n });\n } else {\n done(this, null, null);\n }\n}\n\nTransform.prototype.push = function (chunk, encoding) {\n this._transformState.needTransform = false;\n return Duplex.prototype.push.call(this, chunk, encoding);\n}; // This is the part where you do stuff!\n// override this function in implementation classes.\n// 'chunk' is an input chunk.\n//\n// Call `push(newChunk)` to pass along transformed output\n// to the readable side. You may call 'push' zero or more times.\n//\n// Call `cb(err)` when you are done with this chunk. If you pass\n// an error, then that'll put the hurt on the whole operation. If you\n// never call cb(), then you'll never get another chunk.\n\n\nTransform.prototype._transform = function (chunk, encoding, cb) {\n cb(new ERR_METHOD_NOT_IMPLEMENTED('_transform()'));\n};\n\nTransform.prototype._write = function (chunk, encoding, cb) {\n var ts = this._transformState;\n ts.writecb = cb;\n ts.writechunk = chunk;\n ts.writeencoding = encoding;\n\n if (!ts.transforming) {\n var rs = this._readableState;\n if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);\n }\n}; // Doesn't matter what the args are here.\n// _transform does all the work.\n// That we got here means that the readable side wants more data.\n\n\nTransform.prototype._read = function (n) {\n var ts = this._transformState;\n\n if (ts.writechunk !== null && !ts.transforming) {\n ts.transforming = true;\n\n this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);\n } else {\n // mark that we need a transform, so that any data that comes in\n // will get processed, now that we've asked for it.\n ts.needTransform = true;\n }\n};\n\nTransform.prototype._destroy = function (err, cb) {\n Duplex.prototype._destroy.call(this, err, function (err2) {\n cb(err2);\n });\n};\n\nfunction done(stream, er, data) {\n if (er) return stream.emit('error', er);\n if (data != null) // single equals check for both `null` and `undefined`\n stream.push(data); // TODO(BridgeAR): Write a test for these two error cases\n // if there's nothing in the write buffer, then that means\n // that nothing more will ever be provided\n\n if (stream._writableState.length) throw new ERR_TRANSFORM_WITH_LENGTH_0();\n if (stream._transformState.transforming) throw new ERR_TRANSFORM_ALREADY_TRANSFORMING();\n return stream.push(null);\n}","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n// A bit simpler than readable streams.\n// Implement an async ._write(chunk, encoding, cb), and it'll handle all\n// the drain event emission and buffering.\n'use strict';\n\nmodule.exports = Writable;\n/* <replacement> */\n\nfunction WriteReq(chunk, encoding, cb) {\n this.chunk = chunk;\n this.encoding = encoding;\n this.callback = cb;\n this.next = null;\n} // It seems a linked list but it is not\n// there will be only 2 of these for each stream\n\n\nfunction CorkedRequest(state) {\n var _this = this;\n\n this.next = null;\n this.entry = null;\n\n this.finish = function () {\n onCorkedFinish(_this, state);\n };\n}\n/* </replacement> */\n\n/*<replacement>*/\n\n\nvar Duplex;\n/*</replacement>*/\n\nWritable.WritableState = WritableState;\n/*<replacement>*/\n\nvar internalUtil = {\n deprecate: require('util-deprecate')\n};\n/*</replacement>*/\n\n/*<replacement>*/\n\nvar Stream = require('./internal/streams/stream');\n/*</replacement>*/\n\n\nvar Buffer = require('buffer').Buffer;\n\nvar OurUint8Array = global.Uint8Array || function () {};\n\nfunction _uint8ArrayToBuffer(chunk) {\n return Buffer.from(chunk);\n}\n\nfunction _isUint8Array(obj) {\n return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;\n}\n\nvar destroyImpl = require('./internal/streams/destroy');\n\nvar _require = require('./internal/streams/state'),\n getHighWaterMark = _require.getHighWaterMark;\n\nvar _require$codes = require('../errors').codes,\n ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE,\n ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED,\n ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK,\n ERR_STREAM_CANNOT_PIPE = _require$codes.ERR_STREAM_CANNOT_PIPE,\n ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED,\n ERR_STREAM_NULL_VALUES = _require$codes.ERR_STREAM_NULL_VALUES,\n ERR_STREAM_WRITE_AFTER_END = _require$codes.ERR_STREAM_WRITE_AFTER_END,\n ERR_UNKNOWN_ENCODING = _require$codes.ERR_UNKNOWN_ENCODING;\n\nvar errorOrDestroy = destroyImpl.errorOrDestroy;\n\nrequire('inherits')(Writable, Stream);\n\nfunction nop() {}\n\nfunction WritableState(options, stream, isDuplex) {\n Duplex = Duplex || require('./_stream_duplex');\n options = options || {}; // Duplex streams are both readable and writable, but share\n // the same options object.\n // However, some cases require setting options to different\n // values for the readable and the writable sides of the duplex stream,\n // e.g. options.readableObjectMode vs. options.writableObjectMode, etc.\n\n if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex; // object stream flag to indicate whether or not this stream\n // contains buffers or objects.\n\n this.objectMode = !!options.objectMode;\n if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; // the point at which write() starts returning false\n // Note: 0 is a valid value, means that we always return false if\n // the entire buffer is not flushed immediately on write()\n\n this.highWaterMark = getHighWaterMark(this, options, 'writableHighWaterMark', isDuplex); // if _final has been called\n\n this.finalCalled = false; // drain event flag.\n\n this.needDrain = false; // at the start of calling end()\n\n this.ending = false; // when end() has been called, and returned\n\n this.ended = false; // when 'finish' is emitted\n\n this.finished = false; // has it been destroyed\n\n this.destroyed = false; // should we decode strings into buffers before passing to _write?\n // this is here so that some node-core streams can optimize string\n // handling at a lower level.\n\n var noDecode = options.decodeStrings === false;\n this.decodeStrings = !noDecode; // Crypto is kind of old and crusty. Historically, its default string\n // encoding is 'binary' so we have to make this configurable.\n // Everything else in the universe uses 'utf8', though.\n\n this.defaultEncoding = options.defaultEncoding || 'utf8'; // not an actual buffer we keep track of, but a measurement\n // of how much we're waiting to get pushed to some underlying\n // socket or file.\n\n this.length = 0; // a flag to see when we're in the middle of a write.\n\n this.writing = false; // when true all writes will be buffered until .uncork() call\n\n this.corked = 0; // a flag to be able to tell if the onwrite cb is called immediately,\n // or on a later tick. We set this to true at first, because any\n // actions that shouldn't happen until \"later\" should generally also\n // not happen before the first write call.\n\n this.sync = true; // a flag to know if we're processing previously buffered items, which\n // may call the _write() callback in the same tick, so that we don't\n // end up in an overlapped onwrite situation.\n\n this.bufferProcessing = false; // the callback that's passed to _write(chunk,cb)\n\n this.onwrite = function (er) {\n onwrite(stream, er);\n }; // the callback that the user supplies to write(chunk,encoding,cb)\n\n\n this.writecb = null; // the amount that is being written when _write is called.\n\n this.writelen = 0;\n this.bufferedRequest = null;\n this.lastBufferedRequest = null; // number of pending user-supplied write callbacks\n // this must be 0 before 'finish' can be emitted\n\n this.pendingcb = 0; // emit prefinish if the only thing we're waiting for is _write cbs\n // This is relevant for synchronous Transform streams\n\n this.prefinished = false; // True if the error was already emitted and should not be thrown again\n\n this.errorEmitted = false; // Should close be emitted on destroy. Defaults to true.\n\n this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'finish' (and potentially 'end')\n\n this.autoDestroy = !!options.autoDestroy; // count buffered requests\n\n this.bufferedRequestCount = 0; // allocate the first CorkedRequest, there is always\n // one allocated and free to use, and we maintain at most two\n\n this.corkedRequestsFree = new CorkedRequest(this);\n}\n\nWritableState.prototype.getBuffer = function getBuffer() {\n var current = this.bufferedRequest;\n var out = [];\n\n while (current) {\n out.push(current);\n current = current.next;\n }\n\n return out;\n};\n\n(function () {\n try {\n Object.defineProperty(WritableState.prototype, 'buffer', {\n get: internalUtil.deprecate(function writableStateBufferGetter() {\n return this.getBuffer();\n }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003')\n });\n } catch (_) {}\n})(); // Test _writableState for inheritance to account for Duplex streams,\n// whose prototype chain only points to Readable.\n\n\nvar realHasInstance;\n\nif (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {\n realHasInstance = Function.prototype[Symbol.hasInstance];\n Object.defineProperty(Writable, Symbol.hasInstance, {\n value: function value(object) {\n if (realHasInstance.call(this, object)) return true;\n if (this !== Writable) return false;\n return object && object._writableState instanceof WritableState;\n }\n });\n} else {\n realHasInstance = function realHasInstance(object) {\n return object instanceof this;\n };\n}\n\nfunction Writable(options) {\n Duplex = Duplex || require('./_stream_duplex'); // Writable ctor is applied to Duplexes, too.\n // `realHasInstance` is necessary because using plain `instanceof`\n // would return false, as no `_writableState` property is attached.\n // Trying to use the custom `instanceof` for Writable here will also break the\n // Node.js LazyTransform implementation, which has a non-trivial getter for\n // `_writableState` that would lead to infinite recursion.\n // Checking for a Stream.Duplex instance is faster here instead of inside\n // the WritableState constructor, at least with V8 6.5\n\n var isDuplex = this instanceof Duplex;\n if (!isDuplex && !realHasInstance.call(Writable, this)) return new Writable(options);\n this._writableState = new WritableState(options, this, isDuplex); // legacy.\n\n this.writable = true;\n\n if (options) {\n if (typeof options.write === 'function') this._write = options.write;\n if (typeof options.writev === 'function') this._writev = options.writev;\n if (typeof options.destroy === 'function') this._destroy = options.destroy;\n if (typeof options.final === 'function') this._final = options.final;\n }\n\n Stream.call(this);\n} // Otherwise people can pipe Writable streams, which is just wrong.\n\n\nWritable.prototype.pipe = function () {\n errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE());\n};\n\nfunction writeAfterEnd(stream, cb) {\n var er = new ERR_STREAM_WRITE_AFTER_END(); // TODO: defer error events consistently everywhere, not just the cb\n\n errorOrDestroy(stream, er);\n process.nextTick(cb, er);\n} // Checks that a user-supplied chunk is valid, especially for the particular\n// mode the stream is in. Currently this means that `null` is never accepted\n// and undefined/non-string values are only allowed in object mode.\n\n\nfunction validChunk(stream, state, chunk, cb) {\n var er;\n\n if (chunk === null) {\n er = new ERR_STREAM_NULL_VALUES();\n } else if (typeof chunk !== 'string' && !state.objectMode) {\n er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer'], chunk);\n }\n\n if (er) {\n errorOrDestroy(stream, er);\n process.nextTick(cb, er);\n return false;\n }\n\n return true;\n}\n\nWritable.prototype.write = function (chunk, encoding, cb) {\n var state = this._writableState;\n var ret = false;\n\n var isBuf = !state.objectMode && _isUint8Array(chunk);\n\n if (isBuf && !Buffer.isBuffer(chunk)) {\n chunk = _uint8ArrayToBuffer(chunk);\n }\n\n if (typeof encoding === 'function') {\n cb = encoding;\n encoding = null;\n }\n\n if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;\n if (typeof cb !== 'function') cb = nop;\n if (state.ending) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {\n state.pendingcb++;\n ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);\n }\n return ret;\n};\n\nWritable.prototype.cork = function () {\n this._writableState.corked++;\n};\n\nWritable.prototype.uncork = function () {\n var state = this._writableState;\n\n if (state.corked) {\n state.corked--;\n if (!state.writing && !state.corked && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);\n }\n};\n\nWritable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {\n // node::ParseEncoding() requires lower case.\n if (typeof encoding === 'string') encoding = encoding.toLowerCase();\n if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new ERR_UNKNOWN_ENCODING(encoding);\n this._writableState.defaultEncoding = encoding;\n return this;\n};\n\nObject.defineProperty(Writable.prototype, 'writableBuffer', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n return this._writableState && this._writableState.getBuffer();\n }\n});\n\nfunction decodeChunk(state, chunk, encoding) {\n if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {\n chunk = Buffer.from(chunk, encoding);\n }\n\n return chunk;\n}\n\nObject.defineProperty(Writable.prototype, 'writableHighWaterMark', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n return this._writableState.highWaterMark;\n }\n}); // if we're already writing something, then just put this\n// in the queue, and wait our turn. Otherwise, call _write\n// If we return false, then we need a drain event, so set that flag.\n\nfunction writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {\n if (!isBuf) {\n var newChunk = decodeChunk(state, chunk, encoding);\n\n if (chunk !== newChunk) {\n isBuf = true;\n encoding = 'buffer';\n chunk = newChunk;\n }\n }\n\n var len = state.objectMode ? 1 : chunk.length;\n state.length += len;\n var ret = state.length < state.highWaterMark; // we must ensure that previous needDrain will not be reset to false.\n\n if (!ret) state.needDrain = true;\n\n if (state.writing || state.corked) {\n var last = state.lastBufferedRequest;\n state.lastBufferedRequest = {\n chunk: chunk,\n encoding: encoding,\n isBuf: isBuf,\n callback: cb,\n next: null\n };\n\n if (last) {\n last.next = state.lastBufferedRequest;\n } else {\n state.bufferedRequest = state.lastBufferedRequest;\n }\n\n state.bufferedRequestCount += 1;\n } else {\n doWrite(stream, state, false, len, chunk, encoding, cb);\n }\n\n return ret;\n}\n\nfunction doWrite(stream, state, writev, len, chunk, encoding, cb) {\n state.writelen = len;\n state.writecb = cb;\n state.writing = true;\n state.sync = true;\n if (state.destroyed) state.onwrite(new ERR_STREAM_DESTROYED('write'));else if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);\n state.sync = false;\n}\n\nfunction onwriteError(stream, state, sync, er, cb) {\n --state.pendingcb;\n\n if (sync) {\n // defer the callback if we are being called synchronously\n // to avoid piling up things on the stack\n process.nextTick(cb, er); // this can emit finish, and it will always happen\n // after error\n\n process.nextTick(finishMaybe, stream, state);\n stream._writableState.errorEmitted = true;\n errorOrDestroy(stream, er);\n } else {\n // the caller expect this to happen before if\n // it is async\n cb(er);\n stream._writableState.errorEmitted = true;\n errorOrDestroy(stream, er); // this can emit finish, but finish must\n // always follow error\n\n finishMaybe(stream, state);\n }\n}\n\nfunction onwriteStateUpdate(state) {\n state.writing = false;\n state.writecb = null;\n state.length -= state.writelen;\n state.writelen = 0;\n}\n\nfunction onwrite(stream, er) {\n var state = stream._writableState;\n var sync = state.sync;\n var cb = state.writecb;\n if (typeof cb !== 'function') throw new ERR_MULTIPLE_CALLBACK();\n onwriteStateUpdate(state);\n if (er) onwriteError(stream, state, sync, er, cb);else {\n // Check if we're actually ready to finish, but don't emit yet\n var finished = needFinish(state) || stream.destroyed;\n\n if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {\n clearBuffer(stream, state);\n }\n\n if (sync) {\n process.nextTick(afterWrite, stream, state, finished, cb);\n } else {\n afterWrite(stream, state, finished, cb);\n }\n }\n}\n\nfunction afterWrite(stream, state, finished, cb) {\n if (!finished) onwriteDrain(stream, state);\n state.pendingcb--;\n cb();\n finishMaybe(stream, state);\n} // Must force callback to be called on nextTick, so that we don't\n// emit 'drain' before the write() consumer gets the 'false' return\n// value, and has a chance to attach a 'drain' listener.\n\n\nfunction onwriteDrain(stream, state) {\n if (state.length === 0 && state.needDrain) {\n state.needDrain = false;\n stream.emit('drain');\n }\n} // if there's something in the buffer waiting, then process it\n\n\nfunction clearBuffer(stream, state) {\n state.bufferProcessing = true;\n var entry = state.bufferedRequest;\n\n if (stream._writev && entry && entry.next) {\n // Fast case, write everything using _writev()\n var l = state.bufferedRequestCount;\n var buffer = new Array(l);\n var holder = state.corkedRequestsFree;\n holder.entry = entry;\n var count = 0;\n var allBuffers = true;\n\n while (entry) {\n buffer[count] = entry;\n if (!entry.isBuf) allBuffers = false;\n entry = entry.next;\n count += 1;\n }\n\n buffer.allBuffers = allBuffers;\n doWrite(stream, state, true, state.length, buffer, '', holder.finish); // doWrite is almost always async, defer these to save a bit of time\n // as the hot path ends with doWrite\n\n state.pendingcb++;\n state.lastBufferedRequest = null;\n\n if (holder.next) {\n state.corkedRequestsFree = holder.next;\n holder.next = null;\n } else {\n state.corkedRequestsFree = new CorkedRequest(state);\n }\n\n state.bufferedRequestCount = 0;\n } else {\n // Slow case, write chunks one-by-one\n while (entry) {\n var chunk = entry.chunk;\n var encoding = entry.encoding;\n var cb = entry.callback;\n var len = state.objectMode ? 1 : chunk.length;\n doWrite(stream, state, false, len, chunk, encoding, cb);\n entry = entry.next;\n state.bufferedRequestCount--; // if we didn't call the onwrite immediately, then\n // it means that we need to wait until it does.\n // also, that means that the chunk and cb are currently\n // being processed, so move the buffer counter past them.\n\n if (state.writing) {\n break;\n }\n }\n\n if (entry === null) state.lastBufferedRequest = null;\n }\n\n state.bufferedRequest = entry;\n state.bufferProcessing = false;\n}\n\nWritable.prototype._write = function (chunk, encoding, cb) {\n cb(new ERR_METHOD_NOT_IMPLEMENTED('_write()'));\n};\n\nWritable.prototype._writev = null;\n\nWritable.prototype.end = function (chunk, encoding, cb) {\n var state = this._writableState;\n\n if (typeof chunk === 'function') {\n cb = chunk;\n chunk = null;\n encoding = null;\n } else if (typeof encoding === 'function') {\n cb = encoding;\n encoding = null;\n }\n\n if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); // .end() fully uncorks\n\n if (state.corked) {\n state.corked = 1;\n this.uncork();\n } // ignore unnecessary end() calls.\n\n\n if (!state.ending) endWritable(this, state, cb);\n return this;\n};\n\nObject.defineProperty(Writable.prototype, 'writableLength', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n return this._writableState.length;\n }\n});\n\nfunction needFinish(state) {\n return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;\n}\n\nfunction callFinal(stream, state) {\n stream._final(function (err) {\n state.pendingcb--;\n\n if (err) {\n errorOrDestroy(stream, err);\n }\n\n state.prefinished = true;\n stream.emit('prefinish');\n finishMaybe(stream, state);\n });\n}\n\nfunction prefinish(stream, state) {\n if (!state.prefinished && !state.finalCalled) {\n if (typeof stream._final === 'function' && !state.destroyed) {\n state.pendingcb++;\n state.finalCalled = true;\n process.nextTick(callFinal, stream, state);\n } else {\n state.prefinished = true;\n stream.emit('prefinish');\n }\n }\n}\n\nfunction finishMaybe(stream, state) {\n var need = needFinish(state);\n\n if (need) {\n prefinish(stream, state);\n\n if (state.pendingcb === 0) {\n state.finished = true;\n stream.emit('finish');\n\n if (state.autoDestroy) {\n // In case of duplex streams we need a way to detect\n // if the readable side is ready for autoDestroy as well\n var rState = stream._readableState;\n\n if (!rState || rState.autoDestroy && rState.endEmitted) {\n stream.destroy();\n }\n }\n }\n }\n\n return need;\n}\n\nfunction endWritable(stream, state, cb) {\n state.ending = true;\n finishMaybe(stream, state);\n\n if (cb) {\n if (state.finished) process.nextTick(cb);else stream.once('finish', cb);\n }\n\n state.ended = true;\n stream.writable = false;\n}\n\nfunction onCorkedFinish(corkReq, state, err) {\n var entry = corkReq.entry;\n corkReq.entry = null;\n\n while (entry) {\n var cb = entry.callback;\n state.pendingcb--;\n cb(err);\n entry = entry.next;\n } // reuse the free corkReq.\n\n\n state.corkedRequestsFree.next = corkReq;\n}\n\nObject.defineProperty(Writable.prototype, 'destroyed', {\n // making it explicit this property is not enumerable\n // because otherwise some prototype manipulation in\n // userland will fail\n enumerable: false,\n get: function get() {\n if (this._writableState === undefined) {\n return false;\n }\n\n return this._writableState.destroyed;\n },\n set: function set(value) {\n // we ignore the value if the stream\n // has not been initialized yet\n if (!this._writableState) {\n return;\n } // backward compatibility, the user is explicitly\n // managing destroyed\n\n\n this._writableState.destroyed = value;\n }\n});\nWritable.prototype.destroy = destroyImpl.destroy;\nWritable.prototype._undestroy = destroyImpl.undestroy;\n\nWritable.prototype._destroy = function (err, cb) {\n cb(err);\n};","'use strict';\n\nvar _Object$setPrototypeO;\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar finished = require('./end-of-stream');\n\nvar kLastResolve = Symbol('lastResolve');\nvar kLastReject = Symbol('lastReject');\nvar kError = Symbol('error');\nvar kEnded = Symbol('ended');\nvar kLastPromise = Symbol('lastPromise');\nvar kHandlePromise = Symbol('handlePromise');\nvar kStream = Symbol('stream');\n\nfunction createIterResult(value, done) {\n return {\n value: value,\n done: done\n };\n}\n\nfunction readAndResolve(iter) {\n var resolve = iter[kLastResolve];\n\n if (resolve !== null) {\n var data = iter[kStream].read(); // we defer if data is null\n // we can be expecting either 'end' or\n // 'error'\n\n if (data !== null) {\n iter[kLastPromise] = null;\n iter[kLastResolve] = null;\n iter[kLastReject] = null;\n resolve(createIterResult(data, false));\n }\n }\n}\n\nfunction onReadable(iter) {\n // we wait for the next tick, because it might\n // emit an error with process.nextTick\n process.nextTick(readAndResolve, iter);\n}\n\nfunction wrapForNext(lastPromise, iter) {\n return function (resolve, reject) {\n lastPromise.then(function () {\n if (iter[kEnded]) {\n resolve(createIterResult(undefined, true));\n return;\n }\n\n iter[kHandlePromise](resolve, reject);\n }, reject);\n };\n}\n\nvar AsyncIteratorPrototype = Object.getPrototypeOf(function () {});\nvar ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf((_Object$setPrototypeO = {\n get stream() {\n return this[kStream];\n },\n\n next: function next() {\n var _this = this;\n\n // if we have detected an error in the meanwhile\n // reject straight away\n var error = this[kError];\n\n if (error !== null) {\n return Promise.reject(error);\n }\n\n if (this[kEnded]) {\n return Promise.resolve(createIterResult(undefined, true));\n }\n\n if (this[kStream].destroyed) {\n // We need to defer via nextTick because if .destroy(err) is\n // called, the error will be emitted via nextTick, and\n // we cannot guarantee that there is no error lingering around\n // waiting to be emitted.\n return new Promise(function (resolve, reject) {\n process.nextTick(function () {\n if (_this[kError]) {\n reject(_this[kError]);\n } else {\n resolve(createIterResult(undefined, true));\n }\n });\n });\n } // if we have multiple next() calls\n // we will wait for the previous Promise to finish\n // this logic is optimized to support for await loops,\n // where next() is only called once at a time\n\n\n var lastPromise = this[kLastPromise];\n var promise;\n\n if (lastPromise) {\n promise = new Promise(wrapForNext(lastPromise, this));\n } else {\n // fast path needed to support multiple this.push()\n // without triggering the next() queue\n var data = this[kStream].read();\n\n if (data !== null) {\n return Promise.resolve(createIterResult(data, false));\n }\n\n promise = new Promise(this[kHandlePromise]);\n }\n\n this[kLastPromise] = promise;\n return promise;\n }\n}, _defineProperty(_Object$setPrototypeO, Symbol.asyncIterator, function () {\n return this;\n}), _defineProperty(_Object$setPrototypeO, \"return\", function _return() {\n var _this2 = this;\n\n // destroy(err, cb) is a private API\n // we can guarantee we have that here, because we control the\n // Readable class this is attached to\n return new Promise(function (resolve, reject) {\n _this2[kStream].destroy(null, function (err) {\n if (err) {\n reject(err);\n return;\n }\n\n resolve(createIterResult(undefined, true));\n });\n });\n}), _Object$setPrototypeO), AsyncIteratorPrototype);\n\nvar createReadableStreamAsyncIterator = function createReadableStreamAsyncIterator(stream) {\n var _Object$create;\n\n var iterator = Object.create(ReadableStreamAsyncIteratorPrototype, (_Object$create = {}, _defineProperty(_Object$create, kStream, {\n value: stream,\n writable: true\n }), _defineProperty(_Object$create, kLastResolve, {\n value: null,\n writable: true\n }), _defineProperty(_Object$create, kLastReject, {\n value: null,\n writable: true\n }), _defineProperty(_Object$create, kError, {\n value: null,\n writable: true\n }), _defineProperty(_Object$create, kEnded, {\n value: stream._readableState.endEmitted,\n writable: true\n }), _defineProperty(_Object$create, kHandlePromise, {\n value: function value(resolve, reject) {\n var data = iterator[kStream].read();\n\n if (data) {\n iterator[kLastPromise] = null;\n iterator[kLastResolve] = null;\n iterator[kLastReject] = null;\n resolve(createIterResult(data, false));\n } else {\n iterator[kLastResolve] = resolve;\n iterator[kLastReject] = reject;\n }\n },\n writable: true\n }), _Object$create));\n iterator[kLastPromise] = null;\n finished(stream, function (err) {\n if (err && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') {\n var reject = iterator[kLastReject]; // reject if we are waiting for data in the Promise\n // returned by next() and store the error\n\n if (reject !== null) {\n iterator[kLastPromise] = null;\n iterator[kLastResolve] = null;\n iterator[kLastReject] = null;\n reject(err);\n }\n\n iterator[kError] = err;\n return;\n }\n\n var resolve = iterator[kLastResolve];\n\n if (resolve !== null) {\n iterator[kLastPromise] = null;\n iterator[kLastResolve] = null;\n iterator[kLastReject] = null;\n resolve(createIterResult(undefined, true));\n }\n\n iterator[kEnded] = true;\n });\n stream.on('readable', onReadable.bind(null, iterator));\n return iterator;\n};\n\nmodule.exports = createReadableStreamAsyncIterator;","'use strict';\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nvar _require = require('buffer'),\n Buffer = _require.Buffer;\n\nvar _require2 = require('util'),\n inspect = _require2.inspect;\n\nvar custom = inspect && inspect.custom || 'inspect';\n\nfunction copyBuffer(src, target, offset) {\n Buffer.prototype.copy.call(src, target, offset);\n}\n\nmodule.exports =\n/*#__PURE__*/\nfunction () {\n function BufferList() {\n _classCallCheck(this, BufferList);\n\n this.head = null;\n this.tail = null;\n this.length = 0;\n }\n\n _createClass(BufferList, [{\n key: \"push\",\n value: function push(v) {\n var entry = {\n data: v,\n next: null\n };\n if (this.length > 0) this.tail.next = entry;else this.head = entry;\n this.tail = entry;\n ++this.length;\n }\n }, {\n key: \"unshift\",\n value: function unshift(v) {\n var entry = {\n data: v,\n next: this.head\n };\n if (this.length === 0) this.tail = entry;\n this.head = entry;\n ++this.length;\n }\n }, {\n key: \"shift\",\n value: function shift() {\n if (this.length === 0) return;\n var ret = this.head.data;\n if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;\n --this.length;\n return ret;\n }\n }, {\n key: \"clear\",\n value: function clear() {\n this.head = this.tail = null;\n this.length = 0;\n }\n }, {\n key: \"join\",\n value: function join(s) {\n if (this.length === 0) return '';\n var p = this.head;\n var ret = '' + p.data;\n\n while (p = p.next) {\n ret += s + p.data;\n }\n\n return ret;\n }\n }, {\n key: \"concat\",\n value: function concat(n) {\n if (this.length === 0) return Buffer.alloc(0);\n var ret = Buffer.allocUnsafe(n >>> 0);\n var p = this.head;\n var i = 0;\n\n while (p) {\n copyBuffer(p.data, ret, i);\n i += p.data.length;\n p = p.next;\n }\n\n return ret;\n } // Consumes a specified amount of bytes or characters from the buffered data.\n\n }, {\n key: \"consume\",\n value: function consume(n, hasStrings) {\n var ret;\n\n if (n < this.head.data.length) {\n // `slice` is the same for buffers and strings.\n ret = this.head.data.slice(0, n);\n this.head.data = this.head.data.slice(n);\n } else if (n === this.head.data.length) {\n // First chunk is a perfect match.\n ret = this.shift();\n } else {\n // Result spans more than one buffer.\n ret = hasStrings ? this._getString(n) : this._getBuffer(n);\n }\n\n return ret;\n }\n }, {\n key: \"first\",\n value: function first() {\n return this.head.data;\n } // Consumes a specified amount of characters from the buffered data.\n\n }, {\n key: \"_getString\",\n value: function _getString(n) {\n var p = this.head;\n var c = 1;\n var ret = p.data;\n n -= ret.length;\n\n while (p = p.next) {\n var str = p.data;\n var nb = n > str.length ? str.length : n;\n if (nb === str.length) ret += str;else ret += str.slice(0, n);\n n -= nb;\n\n if (n === 0) {\n if (nb === str.length) {\n ++c;\n if (p.next) this.head = p.next;else this.head = this.tail = null;\n } else {\n this.head = p;\n p.data = str.slice(nb);\n }\n\n break;\n }\n\n ++c;\n }\n\n this.length -= c;\n return ret;\n } // Consumes a specified amount of bytes from the buffered data.\n\n }, {\n key: \"_getBuffer\",\n value: function _getBuffer(n) {\n var ret = Buffer.allocUnsafe(n);\n var p = this.head;\n var c = 1;\n p.data.copy(ret);\n n -= p.data.length;\n\n while (p = p.next) {\n var buf = p.data;\n var nb = n > buf.length ? buf.length : n;\n buf.copy(ret, ret.length - n, 0, nb);\n n -= nb;\n\n if (n === 0) {\n if (nb === buf.length) {\n ++c;\n if (p.next) this.head = p.next;else this.head = this.tail = null;\n } else {\n this.head = p;\n p.data = buf.slice(nb);\n }\n\n break;\n }\n\n ++c;\n }\n\n this.length -= c;\n return ret;\n } // Make sure the linked list only shows the minimal necessary information.\n\n }, {\n key: custom,\n value: function value(_, options) {\n return inspect(this, _objectSpread({}, options, {\n // Only inspect one level.\n depth: 0,\n // It should not recurse.\n customInspect: false\n }));\n }\n }]);\n\n return BufferList;\n}();","'use strict'; // undocumented cb() API, needed for core, not for public API\n\nfunction destroy(err, cb) {\n var _this = this;\n\n var readableDestroyed = this._readableState && this._readableState.destroyed;\n var writableDestroyed = this._writableState && this._writableState.destroyed;\n\n if (readableDestroyed || writableDestroyed) {\n if (cb) {\n cb(err);\n } else if (err) {\n if (!this._writableState) {\n process.nextTick(emitErrorNT, this, err);\n } else if (!this._writableState.errorEmitted) {\n this._writableState.errorEmitted = true;\n process.nextTick(emitErrorNT, this, err);\n }\n }\n\n return this;\n } // we set destroyed to true before firing error callbacks in order\n // to make it re-entrance safe in case destroy() is called within callbacks\n\n\n if (this._readableState) {\n this._readableState.destroyed = true;\n } // if this is a duplex stream mark the writable part as destroyed as well\n\n\n if (this._writableState) {\n this._writableState.destroyed = true;\n }\n\n this._destroy(err || null, function (err) {\n if (!cb && err) {\n if (!_this._writableState) {\n process.nextTick(emitErrorAndCloseNT, _this, err);\n } else if (!_this._writableState.errorEmitted) {\n _this._writableState.errorEmitted = true;\n process.nextTick(emitErrorAndCloseNT, _this, err);\n } else {\n process.nextTick(emitCloseNT, _this);\n }\n } else if (cb) {\n process.nextTick(emitCloseNT, _this);\n cb(err);\n } else {\n process.nextTick(emitCloseNT, _this);\n }\n });\n\n return this;\n}\n\nfunction emitErrorAndCloseNT(self, err) {\n emitErrorNT(self, err);\n emitCloseNT(self);\n}\n\nfunction emitCloseNT(self) {\n if (self._writableState && !self._writableState.emitClose) return;\n if (self._readableState && !self._readableState.emitClose) return;\n self.emit('close');\n}\n\nfunction undestroy() {\n if (this._readableState) {\n this._readableState.destroyed = false;\n this._readableState.reading = false;\n this._readableState.ended = false;\n this._readableState.endEmitted = false;\n }\n\n if (this._writableState) {\n this._writableState.destroyed = false;\n this._writableState.ended = false;\n this._writableState.ending = false;\n this._writableState.finalCalled = false;\n this._writableState.prefinished = false;\n this._writableState.finished = false;\n this._writableState.errorEmitted = false;\n }\n}\n\nfunction emitErrorNT(self, err) {\n self.emit('error', err);\n}\n\nfunction errorOrDestroy(stream, err) {\n // We have tests that rely on errors being emitted\n // in the same tick, so changing this is semver major.\n // For now when you opt-in to autoDestroy we allow\n // the error to be emitted nextTick. In a future\n // semver major update we should change the default to this.\n var rState = stream._readableState;\n var wState = stream._writableState;\n if (rState && rState.autoDestroy || wState && wState.autoDestroy) stream.destroy(err);else stream.emit('error', err);\n}\n\nmodule.exports = {\n destroy: destroy,\n undestroy: undestroy,\n errorOrDestroy: errorOrDestroy\n};","// Ported from https://github.com/mafintosh/end-of-stream with\n// permission from the author, Mathias Buus (@mafintosh).\n'use strict';\n\nvar ERR_STREAM_PREMATURE_CLOSE = require('../../../errors').codes.ERR_STREAM_PREMATURE_CLOSE;\n\nfunction once(callback) {\n var called = false;\n return function () {\n if (called) return;\n called = true;\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n callback.apply(this, args);\n };\n}\n\nfunction noop() {}\n\nfunction isRequest(stream) {\n return stream.setHeader && typeof stream.abort === 'function';\n}\n\nfunction eos(stream, opts, callback) {\n if (typeof opts === 'function') return eos(stream, null, opts);\n if (!opts) opts = {};\n callback = once(callback || noop);\n var readable = opts.readable || opts.readable !== false && stream.readable;\n var writable = opts.writable || opts.writable !== false && stream.writable;\n\n var onlegacyfinish = function onlegacyfinish() {\n if (!stream.writable) onfinish();\n };\n\n var writableEnded = stream._writableState && stream._writableState.finished;\n\n var onfinish = function onfinish() {\n writable = false;\n writableEnded = true;\n if (!readable) callback.call(stream);\n };\n\n var readableEnded = stream._readableState && stream._readableState.endEmitted;\n\n var onend = function onend() {\n readable = false;\n readableEnded = true;\n if (!writable) callback.call(stream);\n };\n\n var onerror = function onerror(err) {\n callback.call(stream, err);\n };\n\n var onclose = function onclose() {\n var err;\n\n if (readable && !readableEnded) {\n if (!stream._readableState || !stream._readableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE();\n return callback.call(stream, err);\n }\n\n if (writable && !writableEnded) {\n if (!stream._writableState || !stream._writableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE();\n return callback.call(stream, err);\n }\n };\n\n var onrequest = function onrequest() {\n stream.req.on('finish', onfinish);\n };\n\n if (isRequest(stream)) {\n stream.on('complete', onfinish);\n stream.on('abort', onclose);\n if (stream.req) onrequest();else stream.on('request', onrequest);\n } else if (writable && !stream._writableState) {\n // legacy streams\n stream.on('end', onlegacyfinish);\n stream.on('close', onlegacyfinish);\n }\n\n stream.on('end', onend);\n stream.on('finish', onfinish);\n if (opts.error !== false) stream.on('error', onerror);\n stream.on('close', onclose);\n return function () {\n stream.removeListener('complete', onfinish);\n stream.removeListener('abort', onclose);\n stream.removeListener('request', onrequest);\n if (stream.req) stream.req.removeListener('finish', onfinish);\n stream.removeListener('end', onlegacyfinish);\n stream.removeListener('close', onlegacyfinish);\n stream.removeListener('finish', onfinish);\n stream.removeListener('end', onend);\n stream.removeListener('error', onerror);\n stream.removeListener('close', onclose);\n };\n}\n\nmodule.exports = eos;","module.exports = function () {\n throw new Error('Readable.from is not available in the browser')\n};\n","// Ported from https://github.com/mafintosh/pump with\n// permission from the author, Mathias Buus (@mafintosh).\n'use strict';\n\nvar eos;\n\nfunction once(callback) {\n var called = false;\n return function () {\n if (called) return;\n called = true;\n callback.apply(void 0, arguments);\n };\n}\n\nvar _require$codes = require('../../../errors').codes,\n ERR_MISSING_ARGS = _require$codes.ERR_MISSING_ARGS,\n ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED;\n\nfunction noop(err) {\n // Rethrow the error if it exists to avoid swallowing it\n if (err) throw err;\n}\n\nfunction isRequest(stream) {\n return stream.setHeader && typeof stream.abort === 'function';\n}\n\nfunction destroyer(stream, reading, writing, callback) {\n callback = once(callback);\n var closed = false;\n stream.on('close', function () {\n closed = true;\n });\n if (eos === undefined) eos = require('./end-of-stream');\n eos(stream, {\n readable: reading,\n writable: writing\n }, function (err) {\n if (err) return callback(err);\n closed = true;\n callback();\n });\n var destroyed = false;\n return function (err) {\n if (closed) return;\n if (destroyed) return;\n destroyed = true; // request.destroy just do .end - .abort is what we want\n\n if (isRequest(stream)) return stream.abort();\n if (typeof stream.destroy === 'function') return stream.destroy();\n callback(err || new ERR_STREAM_DESTROYED('pipe'));\n };\n}\n\nfunction call(fn) {\n fn();\n}\n\nfunction pipe(from, to) {\n return from.pipe(to);\n}\n\nfunction popCallback(streams) {\n if (!streams.length) return noop;\n if (typeof streams[streams.length - 1] !== 'function') return noop;\n return streams.pop();\n}\n\nfunction pipeline() {\n for (var _len = arguments.length, streams = new Array(_len), _key = 0; _key < _len; _key++) {\n streams[_key] = arguments[_key];\n }\n\n var callback = popCallback(streams);\n if (Array.isArray(streams[0])) streams = streams[0];\n\n if (streams.length < 2) {\n throw new ERR_MISSING_ARGS('streams');\n }\n\n var error;\n var destroys = streams.map(function (stream, i) {\n var reading = i < streams.length - 1;\n var writing = i > 0;\n return destroyer(stream, reading, writing, function (err) {\n if (!error) error = err;\n if (err) destroys.forEach(call);\n if (reading) return;\n destroys.forEach(call);\n callback(error);\n });\n });\n return streams.reduce(pipe);\n}\n\nmodule.exports = pipeline;","'use strict';\n\nvar ERR_INVALID_OPT_VALUE = require('../../../errors').codes.ERR_INVALID_OPT_VALUE;\n\nfunction highWaterMarkFrom(options, isDuplex, duplexKey) {\n return options.highWaterMark != null ? options.highWaterMark : isDuplex ? options[duplexKey] : null;\n}\n\nfunction getHighWaterMark(state, options, duplexKey, isDuplex) {\n var hwm = highWaterMarkFrom(options, isDuplex, duplexKey);\n\n if (hwm != null) {\n if (!(isFinite(hwm) && Math.floor(hwm) === hwm) || hwm < 0) {\n var name = isDuplex ? duplexKey : 'highWaterMark';\n throw new ERR_INVALID_OPT_VALUE(name, hwm);\n }\n\n return Math.floor(hwm);\n } // Default value\n\n\n return state.objectMode ? 16 : 16 * 1024;\n}\n\nmodule.exports = {\n getHighWaterMark: getHighWaterMark\n};","module.exports = require('events').EventEmitter;\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\n/*<replacement>*/\n\nvar Buffer = require('safe-buffer').Buffer;\n/*</replacement>*/\n\nvar isEncoding = Buffer.isEncoding || function (encoding) {\n encoding = '' + encoding;\n switch (encoding && encoding.toLowerCase()) {\n case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw':\n return true;\n default:\n return false;\n }\n};\n\nfunction _normalizeEncoding(enc) {\n if (!enc) return 'utf8';\n var retried;\n while (true) {\n switch (enc) {\n case 'utf8':\n case 'utf-8':\n return 'utf8';\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return 'utf16le';\n case 'latin1':\n case 'binary':\n return 'latin1';\n case 'base64':\n case 'ascii':\n case 'hex':\n return enc;\n default:\n if (retried) return; // undefined\n enc = ('' + enc).toLowerCase();\n retried = true;\n }\n }\n};\n\n// Do not cache `Buffer.isEncoding` when checking encoding names as some\n// modules monkey-patch it to support additional encodings\nfunction normalizeEncoding(enc) {\n var nenc = _normalizeEncoding(enc);\n if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc);\n return nenc || enc;\n}\n\n// StringDecoder provides an interface for efficiently splitting a series of\n// buffers into a series of JS strings without breaking apart multi-byte\n// characters.\nexports.StringDecoder = StringDecoder;\nfunction StringDecoder(encoding) {\n this.encoding = normalizeEncoding(encoding);\n var nb;\n switch (this.encoding) {\n case 'utf16le':\n this.text = utf16Text;\n this.end = utf16End;\n nb = 4;\n break;\n case 'utf8':\n this.fillLast = utf8FillLast;\n nb = 4;\n break;\n case 'base64':\n this.text = base64Text;\n this.end = base64End;\n nb = 3;\n break;\n default:\n this.write = simpleWrite;\n this.end = simpleEnd;\n return;\n }\n this.lastNeed = 0;\n this.lastTotal = 0;\n this.lastChar = Buffer.allocUnsafe(nb);\n}\n\nStringDecoder.prototype.write = function (buf) {\n if (buf.length === 0) return '';\n var r;\n var i;\n if (this.lastNeed) {\n r = this.fillLast(buf);\n if (r === undefined) return '';\n i = this.lastNeed;\n this.lastNeed = 0;\n } else {\n i = 0;\n }\n if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i);\n return r || '';\n};\n\nStringDecoder.prototype.end = utf8End;\n\n// Returns only complete characters in a Buffer\nStringDecoder.prototype.text = utf8Text;\n\n// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer\nStringDecoder.prototype.fillLast = function (buf) {\n if (this.lastNeed <= buf.length) {\n buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed);\n return this.lastChar.toString(this.encoding, 0, this.lastTotal);\n }\n buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length);\n this.lastNeed -= buf.length;\n};\n\n// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a\n// continuation byte. If an invalid byte is detected, -2 is returned.\nfunction utf8CheckByte(byte) {\n if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4;\n return byte >> 6 === 0x02 ? -1 : -2;\n}\n\n// Checks at most 3 bytes at the end of a Buffer in order to detect an\n// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4)\n// needed to complete the UTF-8 character (if applicable) are returned.\nfunction utf8CheckIncomplete(self, buf, i) {\n var j = buf.length - 1;\n if (j < i) return 0;\n var nb = utf8CheckByte(buf[j]);\n if (nb >= 0) {\n if (nb > 0) self.lastNeed = nb - 1;\n return nb;\n }\n if (--j < i || nb === -2) return 0;\n nb = utf8CheckByte(buf[j]);\n if (nb >= 0) {\n if (nb > 0) self.lastNeed = nb - 2;\n return nb;\n }\n if (--j < i || nb === -2) return 0;\n nb = utf8CheckByte(buf[j]);\n if (nb >= 0) {\n if (nb > 0) {\n if (nb === 2) nb = 0;else self.lastNeed = nb - 3;\n }\n return nb;\n }\n return 0;\n}\n\n// Validates as many continuation bytes for a multi-byte UTF-8 character as\n// needed or are available. If we see a non-continuation byte where we expect\n// one, we \"replace\" the validated continuation bytes we've seen so far with\n// a single UTF-8 replacement character ('\\ufffd'), to match v8's UTF-8 decoding\n// behavior. The continuation byte check is included three times in the case\n// where all of the continuation bytes for a character exist in the same buffer.\n// It is also done this way as a slight performance increase instead of using a\n// loop.\nfunction utf8CheckExtraBytes(self, buf, p) {\n if ((buf[0] & 0xC0) !== 0x80) {\n self.lastNeed = 0;\n return '\\ufffd';\n }\n if (self.lastNeed > 1 && buf.length > 1) {\n if ((buf[1] & 0xC0) !== 0x80) {\n self.lastNeed = 1;\n return '\\ufffd';\n }\n if (self.lastNeed > 2 && buf.length > 2) {\n if ((buf[2] & 0xC0) !== 0x80) {\n self.lastNeed = 2;\n return '\\ufffd';\n }\n }\n }\n}\n\n// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer.\nfunction utf8FillLast(buf) {\n var p = this.lastTotal - this.lastNeed;\n var r = utf8CheckExtraBytes(this, buf, p);\n if (r !== undefined) return r;\n if (this.lastNeed <= buf.length) {\n buf.copy(this.lastChar, p, 0, this.lastNeed);\n return this.lastChar.toString(this.encoding, 0, this.lastTotal);\n }\n buf.copy(this.lastChar, p, 0, buf.length);\n this.lastNeed -= buf.length;\n}\n\n// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a\n// partial character, the character's bytes are buffered until the required\n// number of bytes are available.\nfunction utf8Text(buf, i) {\n var total = utf8CheckIncomplete(this, buf, i);\n if (!this.lastNeed) return buf.toString('utf8', i);\n this.lastTotal = total;\n var end = buf.length - (total - this.lastNeed);\n buf.copy(this.lastChar, 0, end);\n return buf.toString('utf8', i, end);\n}\n\n// For UTF-8, a replacement character is added when ending on a partial\n// character.\nfunction utf8End(buf) {\n var r = buf && buf.length ? this.write(buf) : '';\n if (this.lastNeed) return r + '\\ufffd';\n return r;\n}\n\n// UTF-16LE typically needs two bytes per character, but even if we have an even\n// number of bytes available, we need to check if we end on a leading/high\n// surrogate. In that case, we need to wait for the next two bytes in order to\n// decode the last character properly.\nfunction utf16Text(buf, i) {\n if ((buf.length - i) % 2 === 0) {\n var r = buf.toString('utf16le', i);\n if (r) {\n var c = r.charCodeAt(r.length - 1);\n if (c >= 0xD800 && c <= 0xDBFF) {\n this.lastNeed = 2;\n this.lastTotal = 4;\n this.lastChar[0] = buf[buf.length - 2];\n this.lastChar[1] = buf[buf.length - 1];\n return r.slice(0, -1);\n }\n }\n return r;\n }\n this.lastNeed = 1;\n this.lastTotal = 2;\n this.lastChar[0] = buf[buf.length - 1];\n return buf.toString('utf16le', i, buf.length - 1);\n}\n\n// For UTF-16LE we do not explicitly append special replacement characters if we\n// end on a partial character, we simply let v8 handle that.\nfunction utf16End(buf) {\n var r = buf && buf.length ? this.write(buf) : '';\n if (this.lastNeed) {\n var end = this.lastTotal - this.lastNeed;\n return r + this.lastChar.toString('utf16le', 0, end);\n }\n return r;\n}\n\nfunction base64Text(buf, i) {\n var n = (buf.length - i) % 3;\n if (n === 0) return buf.toString('base64', i);\n this.lastNeed = 3 - n;\n this.lastTotal = 3;\n if (n === 1) {\n this.lastChar[0] = buf[buf.length - 1];\n } else {\n this.lastChar[0] = buf[buf.length - 2];\n this.lastChar[1] = buf[buf.length - 1];\n }\n return buf.toString('base64', i, buf.length - n);\n}\n\nfunction base64End(buf) {\n var r = buf && buf.length ? this.write(buf) : '';\n if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed);\n return r;\n}\n\n// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex)\nfunction simpleWrite(buf) {\n return buf.toString(this.encoding);\n}\n\nfunction simpleEnd(buf) {\n return buf && buf.length ? this.write(buf) : '';\n}","/////////////////////////////////////////////////////////////////////////////////\n/* UAParser.js v1.0.37\n Copyright © 2012-2021 Faisal Salman <f@faisalman.com>\n MIT License *//*\n Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.\n Supports browser & node.js environment. \n Demo : https://faisalman.github.io/ua-parser-js\n Source : https://github.com/faisalman/ua-parser-js */\n/////////////////////////////////////////////////////////////////////////////////\n\n(function (window, undefined) {\n\n 'use strict';\n\n //////////////\n // Constants\n /////////////\n\n\n var LIBVERSION = '1.0.37',\n EMPTY = '',\n UNKNOWN = '?',\n FUNC_TYPE = 'function',\n UNDEF_TYPE = 'undefined',\n OBJ_TYPE = 'object',\n STR_TYPE = 'string',\n MAJOR = 'major',\n MODEL = 'model',\n NAME = 'name',\n TYPE = 'type',\n VENDOR = 'vendor',\n VERSION = 'version',\n ARCHITECTURE= 'architecture',\n CONSOLE = 'console',\n MOBILE = 'mobile',\n TABLET = 'tablet',\n SMARTTV = 'smarttv',\n WEARABLE = 'wearable',\n EMBEDDED = 'embedded',\n UA_MAX_LENGTH = 500;\n\n var AMAZON = 'Amazon',\n APPLE = 'Apple',\n ASUS = 'ASUS',\n BLACKBERRY = 'BlackBerry',\n BROWSER = 'Browser',\n CHROME = 'Chrome',\n EDGE = 'Edge',\n FIREFOX = 'Firefox',\n GOOGLE = 'Google',\n HUAWEI = 'Huawei',\n LG = 'LG',\n MICROSOFT = 'Microsoft',\n MOTOROLA = 'Motorola',\n OPERA = 'Opera',\n SAMSUNG = 'Samsung',\n SHARP = 'Sharp',\n SONY = 'Sony',\n XIAOMI = 'Xiaomi',\n ZEBRA = 'Zebra',\n FACEBOOK = 'Facebook',\n CHROMIUM_OS = 'Chromium OS',\n MAC_OS = 'Mac OS';\n\n ///////////\n // Helper\n //////////\n\n var extend = function (regexes, extensions) {\n var mergedRegexes = {};\n for (var i in regexes) {\n if (extensions[i] && extensions[i].length % 2 === 0) {\n mergedRegexes[i] = extensions[i].concat(regexes[i]);\n } else {\n mergedRegexes[i] = regexes[i];\n }\n }\n return mergedRegexes;\n },\n enumerize = function (arr) {\n var enums = {};\n for (var i=0; i<arr.length; i++) {\n enums[arr[i].toUpperCase()] = arr[i];\n }\n return enums;\n },\n has = function (str1, str2) {\n return typeof str1 === STR_TYPE ? lowerize(str2).indexOf(lowerize(str1)) !== -1 : false;\n },\n lowerize = function (str) {\n return str.toLowerCase();\n },\n majorize = function (version) {\n return typeof(version) === STR_TYPE ? version.replace(/[^\\d\\.]/g, EMPTY).split('.')[0] : undefined;\n },\n trim = function (str, len) {\n if (typeof(str) === STR_TYPE) {\n str = str.replace(/^\\s\\s*/, EMPTY);\n return typeof(len) === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH);\n }\n };\n\n ///////////////\n // Map helper\n //////////////\n\n var rgxMapper = function (ua, arrays) {\n\n var i = 0, j, k, p, q, matches, match;\n\n // loop through all regexes maps\n while (i < arrays.length && !matches) {\n\n var regex = arrays[i], // even sequence (0,2,4,..)\n props = arrays[i + 1]; // odd sequence (1,3,5,..)\n j = k = 0;\n\n // try matching uastring with regexes\n while (j < regex.length && !matches) {\n\n if (!regex[j]) { break; }\n matches = regex[j++].exec(ua);\n\n if (!!matches) {\n for (p = 0; p < props.length; p++) {\n match = matches[++k];\n q = props[p];\n // check if given property is actually array\n if (typeof q === OBJ_TYPE && q.length > 0) {\n if (q.length === 2) {\n if (typeof q[1] == FUNC_TYPE) {\n // assign modified match\n this[q[0]] = q[1].call(this, match);\n } else {\n // assign given value, ignore regex match\n this[q[0]] = q[1];\n }\n } else if (q.length === 3) {\n // check whether function or regex\n if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) {\n // call function (usually string mapper)\n this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;\n } else {\n // sanitize match using given regex\n this[q[0]] = match ? match.replace(q[1], q[2]) : undefined;\n }\n } else if (q.length === 4) {\n this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;\n }\n } else {\n this[q] = match ? match : undefined;\n }\n }\n }\n }\n i += 2;\n }\n },\n\n strMapper = function (str, map) {\n\n for (var i in map) {\n // check if current value is array\n if (typeof map[i] === OBJ_TYPE && map[i].length > 0) {\n for (var j = 0; j < map[i].length; j++) {\n if (has(map[i][j], str)) {\n return (i === UNKNOWN) ? undefined : i;\n }\n }\n } else if (has(map[i], str)) {\n return (i === UNKNOWN) ? undefined : i;\n }\n }\n return str;\n };\n\n ///////////////\n // String map\n //////////////\n\n // Safari < 3.0\n var oldSafariMap = {\n '1.0' : '/8',\n '1.2' : '/1',\n '1.3' : '/3',\n '2.0' : '/412',\n '2.0.2' : '/416',\n '2.0.3' : '/417',\n '2.0.4' : '/419',\n '?' : '/'\n },\n windowsVersionMap = {\n 'ME' : '4.90',\n 'NT 3.11' : 'NT3.51',\n 'NT 4.0' : 'NT4.0',\n '2000' : 'NT 5.0',\n 'XP' : ['NT 5.1', 'NT 5.2'],\n 'Vista' : 'NT 6.0',\n '7' : 'NT 6.1',\n '8' : 'NT 6.2',\n '8.1' : 'NT 6.3',\n '10' : ['NT 6.4', 'NT 10.0'],\n 'RT' : 'ARM'\n };\n\n //////////////\n // Regex map\n /////////////\n\n var regexes = {\n\n browser : [[\n\n /\\b(?:crmo|crios)\\/([\\w\\.]+)/i // Chrome for Android/iOS\n ], [VERSION, [NAME, 'Chrome']], [\n /edg(?:e|ios|a)?\\/([\\w\\.]+)/i // Microsoft Edge\n ], [VERSION, [NAME, 'Edge']], [\n\n // Presto based\n /(opera mini)\\/([-\\w\\.]+)/i, // Opera Mini\n /(opera [mobiletab]{3,6})\\b.+version\\/([-\\w\\.]+)/i, // Opera Mobi/Tablet\n /(opera)(?:.+version\\/|[\\/ ]+)([\\w\\.]+)/i // Opera\n ], [NAME, VERSION], [\n /opios[\\/ ]+([\\w\\.]+)/i // Opera mini on iphone >= 8.0\n ], [VERSION, [NAME, OPERA+' Mini']], [\n /\\bopr\\/([\\w\\.]+)/i // Opera Webkit\n ], [VERSION, [NAME, OPERA]], [\n\n // Mixed\n /\\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\\/ ]?([\\w\\.]+)/i // Baidu\n ], [VERSION, [NAME, 'Baidu']], [\n /(kindle)\\/([\\w\\.]+)/i, // Kindle\n /(lunascape|maxthon|netfront|jasmine|blazer)[\\/ ]?([\\w\\.]*)/i, // Lunascape/Maxthon/Netfront/Jasmine/Blazer\n // Trident based\n /(avant|iemobile|slim)\\s?(?:browser)?[\\/ ]?([\\w\\.]*)/i, // Avant/IEMobile/SlimBrowser\n /(?:ms|\\()(ie) ([\\w\\.]+)/i, // Internet Explorer\n\n // Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon\n /(flock|rockmelt|midori|epiphany|silk|skyfire|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|qq|duckduckgo)\\/([-\\w\\.]+)/i,\n // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ, aka ShouQ\n /(heytap|ovi)browser\\/([\\d\\.]+)/i, // Heytap/Ovi\n /(weibo)__([\\d\\.]+)/i // Weibo\n ], [NAME, VERSION], [\n /(?:\\buc? ?browser|(?:juc.+)ucweb)[\\/ ]?([\\w\\.]+)/i // UCBrowser\n ], [VERSION, [NAME, 'UC'+BROWSER]], [\n /microm.+\\bqbcore\\/([\\w\\.]+)/i, // WeChat Desktop for Windows Built-in Browser\n /\\bqbcore\\/([\\w\\.]+).+microm/i,\n /micromessenger\\/([\\w\\.]+)/i // WeChat\n ], [VERSION, [NAME, 'WeChat']], [\n /konqueror\\/([\\w\\.]+)/i // Konqueror\n ], [VERSION, [NAME, 'Konqueror']], [\n /trident.+rv[: ]([\\w\\.]{1,9})\\b.+like gecko/i // IE11\n ], [VERSION, [NAME, 'IE']], [\n /ya(?:search)?browser\\/([\\w\\.]+)/i // Yandex\n ], [VERSION, [NAME, 'Yandex']], [\n /slbrowser\\/([\\w\\.]+)/i // Smart Lenovo Browser\n ], [VERSION, [NAME, 'Smart Lenovo '+BROWSER]], [\n /(avast|avg)\\/([\\w\\.]+)/i // Avast/AVG Secure Browser\n ], [[NAME, /(.+)/, '$1 Secure '+BROWSER], VERSION], [\n /\\bfocus\\/([\\w\\.]+)/i // Firefox Focus\n ], [VERSION, [NAME, FIREFOX+' Focus']], [\n /\\bopt\\/([\\w\\.]+)/i // Opera Touch\n ], [VERSION, [NAME, OPERA+' Touch']], [\n /coc_coc\\w+\\/([\\w\\.]+)/i // Coc Coc Browser\n ], [VERSION, [NAME, 'Coc Coc']], [\n /dolfin\\/([\\w\\.]+)/i // Dolphin\n ], [VERSION, [NAME, 'Dolphin']], [\n /coast\\/([\\w\\.]+)/i // Opera Coast\n ], [VERSION, [NAME, OPERA+' Coast']], [\n /miuibrowser\\/([\\w\\.]+)/i // MIUI Browser\n ], [VERSION, [NAME, 'MIUI '+BROWSER]], [\n /fxios\\/([-\\w\\.]+)/i // Firefox for iOS\n ], [VERSION, [NAME, FIREFOX]], [\n /\\bqihu|(qi?ho?o?|360)browser/i // 360\n ], [[NAME, '360 ' + BROWSER]], [\n /(oculus|sailfish|huawei|vivo)browser\\/([\\w\\.]+)/i\n ], [[NAME, /(.+)/, '$1 ' + BROWSER], VERSION], [ // Oculus/Sailfish/HuaweiBrowser/VivoBrowser\n /samsungbrowser\\/([\\w\\.]+)/i // Samsung Internet\n ], [VERSION, [NAME, SAMSUNG + ' Internet']], [\n /(comodo_dragon)\\/([\\w\\.]+)/i // Comodo Dragon\n ], [[NAME, /_/g, ' '], VERSION], [\n /metasr[\\/ ]?([\\d\\.]+)/i // Sogou Explorer\n ], [VERSION, [NAME, 'Sogou Explorer']], [\n /(sogou)mo\\w+\\/([\\d\\.]+)/i // Sogou Mobile\n ], [[NAME, 'Sogou Mobile'], VERSION], [\n /(electron)\\/([\\w\\.]+) safari/i, // Electron-based App\n /(tesla)(?: qtcarbrowser|\\/(20\\d\\d\\.[-\\w\\.]+))/i, // Tesla\n /m?(qqbrowser|2345Explorer)[\\/ ]?([\\w\\.]+)/i // QQBrowser/2345 Browser\n ], [NAME, VERSION], [\n /(lbbrowser)/i, // LieBao Browser\n /\\[(linkedin)app\\]/i // LinkedIn App for iOS & Android\n ], [NAME], [\n\n // WebView\n /((?:fban\\/fbios|fb_iab\\/fb4a)(?!.+fbav)|;fbav\\/([\\w\\.]+);)/i // Facebook App for iOS & Android\n ], [[NAME, FACEBOOK], VERSION], [\n /(Klarna)\\/([\\w\\.]+)/i, // Klarna Shopping Browser for iOS & Android\n /(kakao(?:talk|story))[\\/ ]([\\w\\.]+)/i, // Kakao App\n /(naver)\\(.*?(\\d+\\.[\\w\\.]+).*\\)/i, // Naver InApp\n /safari (line)\\/([\\w\\.]+)/i, // Line App for iOS\n /\\b(line)\\/([\\w\\.]+)\\/iab/i, // Line App for Android\n /(alipay)client\\/([\\w\\.]+)/i, // Alipay\n /(chromium|instagram|snapchat)[\\/ ]([-\\w\\.]+)/i // Chromium/Instagram/Snapchat\n ], [NAME, VERSION], [\n /\\bgsa\\/([\\w\\.]+) .*safari\\//i // Google Search Appliance on iOS\n ], [VERSION, [NAME, 'GSA']], [\n /musical_ly(?:.+app_?version\\/|_)([\\w\\.]+)/i // TikTok\n ], [VERSION, [NAME, 'TikTok']], [\n\n /headlesschrome(?:\\/([\\w\\.]+)| )/i // Chrome Headless\n ], [VERSION, [NAME, CHROME+' Headless']], [\n\n / wv\\).+(chrome)\\/([\\w\\.]+)/i // Chrome WebView\n ], [[NAME, CHROME+' WebView'], VERSION], [\n\n /droid.+ version\\/([\\w\\.]+)\\b.+(?:mobile safari|safari)/i // Android Browser\n ], [VERSION, [NAME, 'Android '+BROWSER]], [\n\n /(chrome|omniweb|arora|[tizenoka]{5} ?browser)\\/v?([\\w\\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia\n ], [NAME, VERSION], [\n\n /version\\/([\\w\\.\\,]+) .*mobile\\/\\w+ (safari)/i // Mobile Safari\n ], [VERSION, [NAME, 'Mobile Safari']], [\n /version\\/([\\w(\\.|\\,)]+) .*(mobile ?safari|safari)/i // Safari & Safari Mobile\n ], [VERSION, NAME], [\n /webkit.+?(mobile ?safari|safari)(\\/[\\w\\.]+)/i // Safari < 3.0\n ], [NAME, [VERSION, strMapper, oldSafariMap]], [\n\n /(webkit|khtml)\\/([\\w\\.]+)/i\n ], [NAME, VERSION], [\n\n // Gecko based\n /(navigator|netscape\\d?)\\/([-\\w\\.]+)/i // Netscape\n ], [[NAME, 'Netscape'], VERSION], [\n /mobile vr; rv:([\\w\\.]+)\\).+firefox/i // Firefox Reality\n ], [VERSION, [NAME, FIREFOX+' Reality']], [\n /ekiohf.+(flow)\\/([\\w\\.]+)/i, // Flow\n /(swiftfox)/i, // Swiftfox\n /(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror|klar)[\\/ ]?([\\w\\.\\+]+)/i,\n // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror/Klar\n /(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\\/([-\\w\\.]+)$/i,\n // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix\n /(firefox)\\/([\\w\\.]+)/i, // Other Firefox-based\n /(mozilla)\\/([\\w\\.]+) .+rv\\:.+gecko\\/\\d+/i, // Mozilla\n\n // Other\n /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir|obigo|mosaic|(?:go|ice|up)[\\. ]?browser)[-\\/ ]?v?([\\w\\.]+)/i,\n // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Sleipnir/Obigo/Mosaic/Go/ICE/UP.Browser\n /(links) \\(([\\w\\.]+)/i, // Links\n /panasonic;(viera)/i // Panasonic Viera\n ], [NAME, VERSION], [\n \n /(cobalt)\\/([\\w\\.]+)/i // Cobalt\n ], [NAME, [VERSION, /master.|lts./, \"\"]]\n ],\n\n cpu : [[\n\n /(?:(amd|x(?:(?:86|64)[-_])?|wow|win)64)[;\\)]/i // AMD64 (x64)\n ], [[ARCHITECTURE, 'amd64']], [\n\n /(ia32(?=;))/i // IA32 (quicktime)\n ], [[ARCHITECTURE, lowerize]], [\n\n /((?:i[346]|x)86)[;\\)]/i // IA32 (x86)\n ], [[ARCHITECTURE, 'ia32']], [\n\n /\\b(aarch64|arm(v?8e?l?|_?64))\\b/i // ARM64\n ], [[ARCHITECTURE, 'arm64']], [\n\n /\\b(arm(?:v[67])?ht?n?[fl]p?)\\b/i // ARMHF\n ], [[ARCHITECTURE, 'armhf']], [\n\n // PocketPC mistakenly identified as PowerPC\n /windows (ce|mobile); ppc;/i\n ], [[ARCHITECTURE, 'arm']], [\n\n /((?:ppc|powerpc)(?:64)?)(?: mac|;|\\))/i // PowerPC\n ], [[ARCHITECTURE, /ower/, EMPTY, lowerize]], [\n\n /(sun4\\w)[;\\)]/i // SPARC\n ], [[ARCHITECTURE, 'sparc']], [\n\n /((?:avr32|ia64(?=;))|68k(?=\\))|\\barm(?=v(?:[1-7]|[5-7]1)l?|;|eabi)|(?=atmel )avr|(?:irix|mips|sparc)(?:64)?\\b|pa-risc)/i\n // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC\n ], [[ARCHITECTURE, lowerize]]\n ],\n\n device : [[\n\n //////////////////////////\n // MOBILES & TABLETS\n /////////////////////////\n\n // Samsung\n /\\b(sch-i[89]0\\d|shw-m380s|sm-[ptx]\\w{2,4}|gt-[pn]\\d{2,4}|sgh-t8[56]9|nexus 10)/i\n ], [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]], [\n /\\b((?:s[cgp]h|gt|sm)-\\w+|sc[g-]?[\\d]+a?|galaxy nexus)/i,\n /samsung[- ]([-\\w]+)/i,\n /sec-(sgh\\w+)/i\n ], [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]], [\n\n // Apple\n /(?:\\/|\\()(ip(?:hone|od)[\\w, ]*)(?:\\/|;)/i // iPod/iPhone\n ], [MODEL, [VENDOR, APPLE], [TYPE, MOBILE]], [\n /\\((ipad);[-\\w\\),; ]+apple/i, // iPad\n /applecoremedia\\/[\\w\\.]+ \\((ipad)/i,\n /\\b(ipad)\\d\\d?,\\d\\d?[;\\]].+ios/i\n ], [MODEL, [VENDOR, APPLE], [TYPE, TABLET]], [\n /(macintosh);/i\n ], [MODEL, [VENDOR, APPLE]], [\n\n // Sharp\n /\\b(sh-?[altvz]?\\d\\d[a-ekm]?)/i\n ], [MODEL, [VENDOR, SHARP], [TYPE, MOBILE]], [\n\n // Huawei\n /\\b((?:ag[rs][23]?|bah2?|sht?|btv)-a?[lw]\\d{2})\\b(?!.+d\\/s)/i\n ], [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]], [\n /(?:huawei|honor)([-\\w ]+)[;\\)]/i,\n /\\b(nexus 6p|\\w{2,4}e?-[atu]?[ln][\\dx][012359c][adn]?)\\b(?!.+d\\/s)/i\n ], [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]], [\n\n // Xiaomi\n /\\b(poco[\\w ]+|m2\\d{3}j\\d\\d[a-z]{2})(?: bui|\\))/i, // Xiaomi POCO\n /\\b; (\\w+) build\\/hm\\1/i, // Xiaomi Hongmi 'numeric' models\n /\\b(hm[-_ ]?note?[_ ]?(?:\\d\\w)?) bui/i, // Xiaomi Hongmi\n /\\b(redmi[\\-_ ]?(?:note|k)?[\\w_ ]+)(?: bui|\\))/i, // Xiaomi Redmi\n /oid[^\\)]+; (m?[12][0-389][01]\\w{3,6}[c-y])( bui|; wv|\\))/i, // Xiaomi Redmi 'numeric' models\n /\\b(mi[-_ ]?(?:a\\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\\d?\\w?)[_ ]?(?:plus|se|lite)?)(?: bui|\\))/i // Xiaomi Mi\n ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [\n /oid[^\\)]+; (2\\d{4}(283|rpbf)[cgl])( bui|\\))/i, // Redmi Pad\n /\\b(mi[-_ ]?(?:pad)(?:[\\w_ ]+))(?: bui|\\))/i // Mi Pad tablets\n ],[[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [\n\n // OPPO\n /; (\\w+) bui.+ oppo/i,\n /\\b(cph[12]\\d{3}|p(?:af|c[al]|d\\w|e[ar])[mt]\\d0|x9007|a101op)\\b/i\n ], [MODEL, [VENDOR, 'OPPO'], [TYPE, MOBILE]], [\n\n // Vivo\n /vivo (\\w+)(?: bui|\\))/i,\n /\\b(v[12]\\d{3}\\w?[at])(?: bui|;)/i\n ], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [\n\n // Realme\n /\\b(rmx[1-3]\\d{3})(?: bui|;|\\))/i\n ], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [\n\n // Motorola\n /\\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\\b[\\w ]+build\\//i,\n /\\bmot(?:orola)?[- ](\\w*)/i,\n /((?:moto[\\w\\(\\) ]+|xt\\d{3,4}|nexus 6)(?= bui|\\)))/i\n ], [MODEL, [VENDOR, MOTOROLA], [TYPE, MOBILE]], [\n /\\b(mz60\\d|xoom[2 ]{0,2}) build\\//i\n ], [MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]], [\n\n // LG\n /((?=lg)?[vl]k\\-?\\d{3}) bui| 3\\.[-\\w; ]{10}lg?-([06cv9]{3,4})/i\n ], [MODEL, [VENDOR, LG], [TYPE, TABLET]], [\n /(lm(?:-?f100[nv]?|-[\\w\\.]+)(?= bui|\\))|nexus [45])/i,\n /\\blg[-e;\\/ ]+((?!browser|netcast|android tv)\\w+)/i,\n /\\blg-?([\\d\\w]+) bui/i\n ], [MODEL, [VENDOR, LG], [TYPE, MOBILE]], [\n\n // Lenovo\n /(ideatab[-\\w ]+)/i,\n /lenovo ?(s[56]000[-\\w]+|tab(?:[\\w ]+)|yt[-\\d\\w]{6}|tb[-\\d\\w]{6})/i\n ], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [\n\n // Nokia\n /(?:maemo|nokia).*(n900|lumia \\d+)/i,\n /nokia[-_ ]?([-\\w\\.]*)/i\n ], [[MODEL, /_/g, ' '], [VENDOR, 'Nokia'], [TYPE, MOBILE]], [\n\n // Google\n /(pixel c)\\b/i // Google Pixel C\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, TABLET]], [\n /droid.+; (pixel[\\daxl ]{0,6})(?: bui|\\))/i // Google Pixel\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]], [\n\n // Sony\n /droid.+ (a?\\d[0-2]{2}so|[c-g]\\d{4}|so[-gl]\\w+|xq-a\\w[4-7][12])(?= bui|\\).+chrome\\/(?![1-6]{0,1}\\d\\.))/i\n ], [MODEL, [VENDOR, SONY], [TYPE, MOBILE]], [\n /sony tablet [ps]/i,\n /\\b(?:sony)?sgp\\w+(?: bui|\\))/i\n ], [[MODEL, 'Xperia Tablet'], [VENDOR, SONY], [TYPE, TABLET]], [\n\n // OnePlus\n / (kb2005|in20[12]5|be20[12][59])\\b/i,\n /(?:one)?(?:plus)? (a\\d0\\d\\d)(?: b|\\))/i\n ], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [\n\n // Amazon\n /(alexa)webm/i,\n /(kf[a-z]{2}wi|aeo[c-r]{2})( bui|\\))/i, // Kindle Fire without Silk / Echo Show\n /(kf[a-z]+)( bui|\\)).+silk\\//i // Kindle Fire HD\n ], [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]], [\n /((?:sd|kf)[0349hijorstuw]+)( bui|\\)).+silk\\//i // Fire Phone\n ], [[MODEL, /(.+)/g, 'Fire Phone $1'], [VENDOR, AMAZON], [TYPE, MOBILE]], [\n\n // BlackBerry\n /(playbook);[-\\w\\),; ]+(rim)/i // BlackBerry PlayBook\n ], [MODEL, VENDOR, [TYPE, TABLET]], [\n /\\b((?:bb[a-f]|st[hv])100-\\d)/i,\n /\\(bb10; (\\w+)/i // BlackBerry 10\n ], [MODEL, [VENDOR, BLACKBERRY], [TYPE, MOBILE]], [\n\n // Asus\n /(?:\\b|asus_)(transfo[prime ]{4,10} \\w+|eeepc|slider \\w+|nexus 7|padfone|p00[cj])/i\n ], [MODEL, [VENDOR, ASUS], [TYPE, TABLET]], [\n / (z[bes]6[027][012][km][ls]|zenfone \\d\\w?)\\b/i\n ], [MODEL, [VENDOR, ASUS], [TYPE, MOBILE]], [\n\n // HTC\n /(nexus 9)/i // HTC Nexus 9\n ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [\n /(htc)[-;_ ]{1,2}([\\w ]+(?=\\)| bui)|\\w+)/i, // HTC\n\n // ZTE\n /(zte)[- ]([\\w ]+?)(?: bui|\\/|\\))/i,\n /(alcatel|geeksphone|nexian|panasonic(?!(?:;|\\.))|sony(?!-bra))[-_ ]?([-\\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony\n ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [\n\n // Acer\n /droid.+; ([ab][1-7]-?[0178a]\\d\\d?)/i\n ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [\n\n // Meizu\n /droid.+; (m[1-5] note) bui/i,\n /\\bmz-([-\\w]{2,})/i\n ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [\n \n // Ulefone\n /; ((?:power )?armor(?:[\\w ]{0,8}))(?: bui|\\))/i\n ], [MODEL, [VENDOR, 'Ulefone'], [TYPE, MOBILE]], [\n\n // MIXED\n /(blackberry|benq|palm(?=\\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron|infinix|tecno)[-_ ]?([-\\w]*)/i,\n // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron\n /(hp) ([\\w ]+\\w)/i, // HP iPAQ\n /(asus)-?(\\w+)/i, // Asus\n /(microsoft); (lumia[\\w ]+)/i, // Microsoft Lumia\n /(lenovo)[-_ ]?([-\\w]+)/i, // Lenovo\n /(jolla)/i, // Jolla\n /(oppo) ?([\\w ]+) bui/i // OPPO\n ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n\n /(kobo)\\s(ereader|touch)/i, // Kobo\n /(archos) (gamepad2?)/i, // Archos\n /(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad\n /(kindle)\\/([\\w\\.]+)/i, // Kindle\n /(nook)[\\w ]+build\\/(\\w+)/i, // Nook\n /(dell) (strea[kpr\\d ]*[\\dko])/i, // Dell Streak\n /(le[- ]+pan)[- ]+(\\w{1,9}) bui/i, // Le Pan Tablets\n /(trinity)[- ]*(t\\d{3}) bui/i, // Trinity Tablets\n /(gigaset)[- ]+(q\\w{1,9}) bui/i, // Gigaset Tablets\n /(vodafone) ([\\w ]+)(?:\\)| bui)/i // Vodafone\n ], [VENDOR, MODEL, [TYPE, TABLET]], [\n\n /(surface duo)/i // Surface Duo\n ], [MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]], [\n /droid [\\d\\.]+; (fp\\du?)(?: b|\\))/i // Fairphone\n ], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [\n /(u304aa)/i // AT&T\n ], [MODEL, [VENDOR, 'AT&T'], [TYPE, MOBILE]], [\n /\\bsie-(\\w*)/i // Siemens\n ], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [\n /\\b(rct\\w+) b/i // RCA Tablets\n ], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [\n /\\b(venue[\\d ]{2,7}) b/i // Dell Venue Tablets\n ], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [\n /\\b(q(?:mv|ta)\\w+) b/i // Verizon Tablet\n ], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [\n /\\b(?:barnes[& ]+noble |bn[rt])([\\w\\+ ]*) b/i // Barnes & Noble Tablet\n ], [MODEL, [VENDOR, 'Barnes & Noble'], [TYPE, TABLET]], [\n /\\b(tm\\d{3}\\w+) b/i\n ], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [\n /\\b(k88) b/i // ZTE K Series Tablet\n ], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [\n /\\b(nx\\d{3}j) b/i // ZTE Nubia\n ], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [\n /\\b(gen\\d{3}) b.+49h/i // Swiss GEN Mobile\n ], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [\n /\\b(zur\\d{3}) b/i // Swiss ZUR Tablet\n ], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [\n /\\b((zeki)?tb.*\\b) b/i // Zeki Tablets\n ], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [\n /\\b([yr]\\d{2}) b/i,\n /\\b(dragon[- ]+touch |dt)(\\w{5}) b/i // Dragon Touch Tablet\n ], [[VENDOR, 'Dragon Touch'], MODEL, [TYPE, TABLET]], [\n /\\b(ns-?\\w{0,9}) b/i // Insignia Tablets\n ], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [\n /\\b((nxa|next)-?\\w{0,9}) b/i // NextBook Tablets\n ], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [\n /\\b(xtreme\\_)?(v(1[045]|2[015]|[3469]0|7[05])) b/i // Voice Xtreme Phones\n ], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [\n /\\b(lvtel\\-)?(v1[12]) b/i // LvTel Phones\n ], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [\n /\\b(ph-1) /i // Essential PH-1\n ], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [\n /\\b(v(100md|700na|7011|917g).*\\b) b/i // Envizen Tablets\n ], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [\n /\\b(trio[-\\w\\. ]+) b/i // MachSpeed Tablets\n ], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [\n /\\btu_(1491) b/i // Rotor Tablets\n ], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]], [\n /(shield[\\w ]+) b/i // Nvidia Shield Tablets\n ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, TABLET]], [\n /(sprint) (\\w+)/i // Sprint Phones\n ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n /(kin\\.[onetw]{3})/i // Microsoft Kin\n ], [[MODEL, /\\./g, ' '], [VENDOR, MICROSOFT], [TYPE, MOBILE]], [\n /droid.+; (cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\\)/i // Zebra\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, TABLET]], [\n /droid.+; (ec30|ps20|tc[2-8]\\d[kx])\\)/i\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, MOBILE]], [\n\n ///////////////////\n // SMARTTVS\n ///////////////////\n\n /smart-tv.+(samsung)/i // Samsung\n ], [VENDOR, [TYPE, SMARTTV]], [\n /hbbtv.+maple;(\\d+)/i\n ], [[MODEL, /^/, 'SmartTV'], [VENDOR, SAMSUNG], [TYPE, SMARTTV]], [\n /(nux; netcast.+smarttv|lg (netcast\\.tv-201\\d|android tv))/i // LG SmartTV\n ], [[VENDOR, LG], [TYPE, SMARTTV]], [\n /(apple) ?tv/i // Apple TV\n ], [VENDOR, [MODEL, APPLE+' TV'], [TYPE, SMARTTV]], [\n /crkey/i // Google Chromecast\n ], [[MODEL, CHROME+'cast'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [\n /droid.+aft(\\w+)( bui|\\))/i // Fire TV\n ], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [\n /\\(dtv[\\);].+(aquos)/i,\n /(aquos-tv[\\w ]+)\\)/i // Sharp\n ], [MODEL, [VENDOR, SHARP], [TYPE, SMARTTV]],[\n /(bravia[\\w ]+)( bui|\\))/i // Sony\n ], [MODEL, [VENDOR, SONY], [TYPE, SMARTTV]], [\n /(mitv-\\w{5}) bui/i // Xiaomi\n ], [MODEL, [VENDOR, XIAOMI], [TYPE, SMARTTV]], [\n /Hbbtv.*(technisat) (.*);/i // TechniSAT\n ], [VENDOR, MODEL, [TYPE, SMARTTV]], [\n /\\b(roku)[\\dx]*[\\)\\/]((?:dvp-)?[\\d\\.]*)/i, // Roku\n /hbbtv\\/\\d+\\.\\d+\\.\\d+ +\\([\\w\\+ ]*; *([\\w\\d][^;]*);([^;]*)/i // HbbTV devices\n ], [[VENDOR, trim], [MODEL, trim], [TYPE, SMARTTV]], [\n /\\b(android tv|smart[- ]?tv|opera tv|tv; rv:)\\b/i // SmartTV from Unidentified Vendors\n ], [[TYPE, SMARTTV]], [\n\n ///////////////////\n // CONSOLES\n ///////////////////\n\n /(ouya)/i, // Ouya\n /(nintendo) ([wids3utch]+)/i // Nintendo\n ], [VENDOR, MODEL, [TYPE, CONSOLE]], [\n /droid.+; (shield) bui/i // Nvidia\n ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [\n /(playstation [345portablevi]+)/i // Playstation\n ], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [\n /\\b(xbox(?: one)?(?!; xbox))[\\); ]/i // Microsoft Xbox\n ], [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]], [\n\n ///////////////////\n // WEARABLES\n ///////////////////\n\n /((pebble))app/i // Pebble\n ], [VENDOR, MODEL, [TYPE, WEARABLE]], [\n /(watch)(?: ?os[,\\/]|\\d,\\d\\/)[\\d\\.]+/i // Apple Watch\n ], [MODEL, [VENDOR, APPLE], [TYPE, WEARABLE]], [\n /droid.+; (glass) \\d/i // Google Glass\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, WEARABLE]], [\n /droid.+; (wt63?0{2,3})\\)/i\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]], [\n /(quest( 2| pro)?)/i // Oculus Quest\n ], [MODEL, [VENDOR, FACEBOOK], [TYPE, WEARABLE]], [\n\n ///////////////////\n // EMBEDDED\n ///////////////////\n\n /(tesla)(?: qtcarbrowser|\\/[-\\w\\.]+)/i // Tesla\n ], [VENDOR, [TYPE, EMBEDDED]], [\n /(aeobc)\\b/i // Echo Dot\n ], [MODEL, [VENDOR, AMAZON], [TYPE, EMBEDDED]], [\n\n ////////////////////\n // MIXED (GENERIC)\n ///////////////////\n\n /droid .+?; ([^;]+?)(?: bui|; wv\\)|\\) applew).+? mobile safari/i // Android Phones from Unidentified Vendors\n ], [MODEL, [TYPE, MOBILE]], [\n /droid .+?; ([^;]+?)(?: bui|\\) applew).+?(?! mobile) safari/i // Android Tablets from Unidentified Vendors\n ], [MODEL, [TYPE, TABLET]], [\n /\\b((tablet|tab)[;\\/]|focus\\/\\d(?!.+mobile))/i // Unidentifiable Tablet\n ], [[TYPE, TABLET]], [\n /(phone|mobile(?:[;\\/]| [ \\w\\/\\.]*safari)|pda(?=.+windows ce))/i // Unidentifiable Mobile\n ], [[TYPE, MOBILE]], [\n /(android[-\\w\\. ]{0,9});.+buil/i // Generic Android Device\n ], [MODEL, [VENDOR, 'Generic']]\n ],\n\n engine : [[\n\n /windows.+ edge\\/([\\w\\.]+)/i // EdgeHTML\n ], [VERSION, [NAME, EDGE+'HTML']], [\n\n /webkit\\/537\\.36.+chrome\\/(?!27)([\\w\\.]+)/i // Blink\n ], [VERSION, [NAME, 'Blink']], [\n\n /(presto)\\/([\\w\\.]+)/i, // Presto\n /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\\/([\\w\\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna\n /ekioh(flow)\\/([\\w\\.]+)/i, // Flow\n /(khtml|tasman|links)[\\/ ]\\(?([\\w\\.]+)/i, // KHTML/Tasman/Links\n /(icab)[\\/ ]([23]\\.[\\d\\.]+)/i, // iCab\n /\\b(libweb)/i\n ], [NAME, VERSION], [\n\n /rv\\:([\\w\\.]{1,9})\\b.+(gecko)/i // Gecko\n ], [VERSION, NAME]\n ],\n\n os : [[\n\n // Windows\n /microsoft (windows) (vista|xp)/i // Windows (iTunes)\n ], [NAME, VERSION], [\n /(windows (?:phone(?: os)?|mobile))[\\/ ]?([\\d\\.\\w ]*)/i // Windows Phone\n ], [NAME, [VERSION, strMapper, windowsVersionMap]], [\n /windows nt 6\\.2; (arm)/i, // Windows RT\n /windows[\\/ ]?([ntce\\d\\. ]+\\w)(?!.+xbox)/i,\n /(?:win(?=3|9|n)|win 9x )([nt\\d\\.]+)/i\n ], [[VERSION, strMapper, windowsVersionMap], [NAME, 'Windows']], [\n\n // iOS/macOS\n /ip[honead]{2,4}\\b(?:.*os ([\\w]+) like mac|; opera)/i, // iOS\n /(?:ios;fbsv\\/|iphone.+ios[\\/ ])([\\d\\.]+)/i,\n /cfnetwork\\/.+darwin/i\n ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [\n /(mac os x) ?([\\w\\. ]*)/i,\n /(macintosh|mac_powerpc\\b)(?!.+haiku)/i // Mac OS\n ], [[NAME, MAC_OS], [VERSION, /_/g, '.']], [\n\n // Mobile OSes\n /droid ([\\w\\.]+)\\b.+(android[- ]x86|harmonyos)/i // Android-x86/HarmonyOS\n ], [VERSION, NAME], [ // Android/WebOS/QNX/Bada/RIM/Maemo/MeeGo/Sailfish OS\n /(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish)[-\\/ ]?([\\w\\.]*)/i,\n /(blackberry)\\w*\\/([\\w\\.]*)/i, // Blackberry\n /(tizen|kaios)[\\/ ]([\\w\\.]+)/i, // Tizen/KaiOS\n /\\((series40);/i // Series 40\n ], [NAME, VERSION], [\n /\\(bb(10);/i // BlackBerry 10\n ], [VERSION, [NAME, BLACKBERRY]], [\n /(?:symbian ?os|symbos|s60(?=;)|series60)[-\\/ ]?([\\w\\.]*)/i // Symbian\n ], [VERSION, [NAME, 'Symbian']], [\n /mozilla\\/[\\d\\.]+ \\((?:mobile|tablet|tv|mobile; [\\w ]+); rv:.+ gecko\\/([\\w\\.]+)/i // Firefox OS\n ], [VERSION, [NAME, FIREFOX+' OS']], [\n /web0s;.+rt(tv)/i,\n /\\b(?:hp)?wos(?:browser)?\\/([\\w\\.]+)/i // WebOS\n ], [VERSION, [NAME, 'webOS']], [\n /watch(?: ?os[,\\/]|\\d,\\d\\/)([\\d\\.]+)/i // watchOS\n ], [VERSION, [NAME, 'watchOS']], [\n\n // Google Chromecast\n /crkey\\/([\\d\\.]+)/i // Google Chromecast\n ], [VERSION, [NAME, CHROME+'cast']], [\n /(cros) [\\w]+(?:\\)| ([\\w\\.]+)\\b)/i // Chromium OS\n ], [[NAME, CHROMIUM_OS], VERSION],[\n\n // Smart TVs\n /panasonic;(viera)/i, // Panasonic Viera\n /(netrange)mmh/i, // Netrange\n /(nettv)\\/(\\d+\\.[\\w\\.]+)/i, // NetTV\n\n // Console\n /(nintendo|playstation) ([wids345portablevuch]+)/i, // Nintendo/Playstation\n /(xbox); +xbox ([^\\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)\n\n // Other\n /\\b(joli|palm)\\b ?(?:os)?\\/?([\\w\\.]*)/i, // Joli/Palm\n /(mint)[\\/\\(\\) ]?(\\w*)/i, // Mint\n /(mageia|vectorlinux)[; ]/i, // Mageia/VectorLinux\n /([kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?= linux)|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire)(?: gnu\\/linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\\/ ]?(?!chrom|package)([-\\w\\.]*)/i,\n // Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire\n /(hurd|linux) ?([\\w\\.]*)/i, // Hurd/Linux\n /(gnu) ?([\\w\\.]*)/i, // GNU\n /\\b([-frentopcghs]{0,5}bsd|dragonfly)[\\/ ]?(?!amd|[ix346]{1,2}86)([\\w\\.]*)/i, // FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly\n /(haiku) (\\w+)/i // Haiku\n ], [NAME, VERSION], [\n /(sunos) ?([\\w\\.\\d]*)/i // Solaris\n ], [[NAME, 'Solaris'], VERSION], [\n /((?:open)?solaris)[-\\/ ]?([\\w\\.]*)/i, // Solaris\n /(aix) ((\\d)(?=\\.|\\)| )[\\w\\.])*/i, // AIX\n /\\b(beos|os\\/2|amigaos|morphos|openvms|fuchsia|hp-ux|serenityos)/i, // BeOS/OS2/AmigaOS/MorphOS/OpenVMS/Fuchsia/HP-UX/SerenityOS\n /(unix) ?([\\w\\.]*)/i // UNIX\n ], [NAME, VERSION]\n ]\n };\n\n /////////////////\n // Constructor\n ////////////////\n\n var UAParser = function (ua, extensions) {\n\n if (typeof ua === OBJ_TYPE) {\n extensions = ua;\n ua = undefined;\n }\n\n if (!(this instanceof UAParser)) {\n return new UAParser(ua, extensions).getResult();\n }\n\n var _navigator = (typeof window !== UNDEF_TYPE && window.navigator) ? window.navigator : undefined;\n var _ua = ua || ((_navigator && _navigator.userAgent) ? _navigator.userAgent : EMPTY);\n var _uach = (_navigator && _navigator.userAgentData) ? _navigator.userAgentData : undefined;\n var _rgxmap = extensions ? extend(regexes, extensions) : regexes;\n var _isSelfNav = _navigator && _navigator.userAgent == _ua;\n\n this.getBrowser = function () {\n var _browser = {};\n _browser[NAME] = undefined;\n _browser[VERSION] = undefined;\n rgxMapper.call(_browser, _ua, _rgxmap.browser);\n _browser[MAJOR] = majorize(_browser[VERSION]);\n // Brave-specific detection\n if (_isSelfNav && _navigator && _navigator.brave && typeof _navigator.brave.isBrave == FUNC_TYPE) {\n _browser[NAME] = 'Brave';\n }\n return _browser;\n };\n this.getCPU = function () {\n var _cpu = {};\n _cpu[ARCHITECTURE] = undefined;\n rgxMapper.call(_cpu, _ua, _rgxmap.cpu);\n return _cpu;\n };\n this.getDevice = function () {\n var _device = {};\n _device[VENDOR] = undefined;\n _device[MODEL] = undefined;\n _device[TYPE] = undefined;\n rgxMapper.call(_device, _ua, _rgxmap.device);\n if (_isSelfNav && !_device[TYPE] && _uach && _uach.mobile) {\n _device[TYPE] = MOBILE;\n }\n // iPadOS-specific detection: identified as Mac, but has some iOS-only properties\n if (_isSelfNav && _device[MODEL] == 'Macintosh' && _navigator && typeof _navigator.standalone !== UNDEF_TYPE && _navigator.maxTouchPoints && _navigator.maxTouchPoints > 2) {\n _device[MODEL] = 'iPad';\n _device[TYPE] = TABLET;\n }\n return _device;\n };\n this.getEngine = function () {\n var _engine = {};\n _engine[NAME] = undefined;\n _engine[VERSION] = undefined;\n rgxMapper.call(_engine, _ua, _rgxmap.engine);\n return _engine;\n };\n this.getOS = function () {\n var _os = {};\n _os[NAME] = undefined;\n _os[VERSION] = undefined;\n rgxMapper.call(_os, _ua, _rgxmap.os);\n if (_isSelfNav && !_os[NAME] && _uach && _uach.platform != 'Unknown') {\n _os[NAME] = _uach.platform \n .replace(/chrome os/i, CHROMIUM_OS)\n .replace(/macos/i, MAC_OS); // backward compatibility\n }\n return _os;\n };\n this.getResult = function () {\n return {\n ua : this.getUA(),\n browser : this.getBrowser(),\n engine : this.getEngine(),\n os : this.getOS(),\n device : this.getDevice(),\n cpu : this.getCPU()\n };\n };\n this.getUA = function () {\n return _ua;\n };\n this.setUA = function (ua) {\n _ua = (typeof ua === STR_TYPE && ua.length > UA_MAX_LENGTH) ? trim(ua, UA_MAX_LENGTH) : ua;\n return this;\n };\n this.setUA(_ua);\n return this;\n };\n\n UAParser.VERSION = LIBVERSION;\n UAParser.BROWSER = enumerize([NAME, VERSION, MAJOR]);\n UAParser.CPU = enumerize([ARCHITECTURE]);\n UAParser.DEVICE = enumerize([MODEL, VENDOR, TYPE, CONSOLE, MOBILE, SMARTTV, TABLET, WEARABLE, EMBEDDED]);\n UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION]);\n\n ///////////\n // Export\n //////////\n\n // check js environment\n if (typeof(exports) !== UNDEF_TYPE) {\n // nodejs env\n if (typeof module !== UNDEF_TYPE && module.exports) {\n exports = module.exports = UAParser;\n }\n exports.UAParser = UAParser;\n } else {\n // requirejs env (optional)\n if (typeof(define) === FUNC_TYPE && define.amd) {\n define(function () {\n return UAParser;\n });\n } else if (typeof window !== UNDEF_TYPE) {\n // browser env\n window.UAParser = UAParser;\n }\n }\n\n // jQuery/Zepto specific (optional)\n // Note:\n // In AMD env the global scope should be kept clean, but jQuery is an exception.\n // jQuery always exports to global scope, unless jQuery.noConflict(true) is used,\n // and we should catch that.\n var $ = typeof window !== UNDEF_TYPE && (window.jQuery || window.Zepto);\n if ($ && !$.ua) {\n var parser = new UAParser();\n $.ua = parser.getResult();\n $.ua.get = function () {\n return parser.getUA();\n };\n $.ua.set = function (ua) {\n parser.setUA(ua);\n var result = parser.getResult();\n for (var prop in result) {\n $.ua[prop] = result[prop];\n }\n };\n }\n\n})(typeof window === 'object' ? window : this);\n","\n/**\n * Module exports.\n */\n\nmodule.exports = deprecate;\n\n/**\n * Mark that a method should not be used.\n * Returns a modified function which warns once by default.\n *\n * If `localStorage.noDeprecation = true` is set, then it is a no-op.\n *\n * If `localStorage.throwDeprecation = true` is set, then deprecated functions\n * will throw an Error when invoked.\n *\n * If `localStorage.traceDeprecation = true` is set, then deprecated functions\n * will invoke `console.trace()` instead of `console.error()`.\n *\n * @param {Function} fn - the function to deprecate\n * @param {String} msg - the string to print to the console when `fn` is invoked\n * @returns {Function} a new \"deprecated\" version of `fn`\n * @api public\n */\n\nfunction deprecate (fn, msg) {\n if (config('noDeprecation')) {\n return fn;\n }\n\n var warned = false;\n function deprecated() {\n if (!warned) {\n if (config('throwDeprecation')) {\n throw new Error(msg);\n } else if (config('traceDeprecation')) {\n console.trace(msg);\n } else {\n console.warn(msg);\n }\n warned = true;\n }\n return fn.apply(this, arguments);\n }\n\n return deprecated;\n}\n\n/**\n * Checks `localStorage` for boolean values for the given `name`.\n *\n * @param {String} name\n * @returns {Boolean}\n * @api private\n */\n\nfunction config (name) {\n // accessing global.localStorage can trigger a DOMException in sandboxed iframes\n try {\n if (!global.localStorage) return false;\n } catch (_) {\n return false;\n }\n var val = global.localStorage[name];\n if (null == val) return false;\n return String(val).toLowerCase() === 'true';\n}\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].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","__webpack_require__.amdO = {};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(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__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","import MediaPlayer from './MediaPlayer';\n\nfunction MediaPlayerFactory() {\n /**\n * mime-type identifier for any source content to be accepted as a dash manifest by the create() method.\n * @type {string}\n */\n const SUPPORTED_MIME_TYPE = 'application/dash+xml';\n\n let logger;\n\n /**\n * A new MediaPlayer is instantiated for the supplied videoElement and optional source and context. If no context is provided,\n * a default DashContext is used. If no source is provided, the videoElement is interrogated to extract the first source whose\n * type is application/dash+xml.\n * The autoplay property of the videoElement is preserved. Any preload attribute is ignored. This method should be called after the page onLoad event is dispatched.\n * @param {HTMLMediaElement} video\n * @param {HTMLSourceElement} source\n * @param {Object} context\n * @returns {MediaPlayer|null}\n */\n function create(video, source, context) {\n if (!video || !(/^VIDEO$/i).test(video.nodeName)) return null;\n\n if (video._dashjs_player) return video._dashjs_player;\n\n let player;\n let videoID = (video.id || video.name || 'video element');\n\n source = source || [].slice.call(video.querySelectorAll('source')).filter(function (s) {\n return s.type == SUPPORTED_MIME_TYPE;\n })[0];\n if (!source && video.src) {\n source = document.createElement('source');\n source.src = video.src;\n } else if (!source && !video.src) {\n return null;\n }\n\n context = context || {};\n player = MediaPlayer(context).create();\n player.initialize(video, source.src, video.autoplay);\n\n if (!logger) {\n logger = player.getDebug().getLogger();\n }\n logger.debug('Converted ' + videoID + ' to dash.js player and added content: ' + source.src);\n\n // Store a reference to the player on the video element so it can be gotten at for debugging and so we know its\n // already been setup.\n video._dashjs_player = player;\n\n return player;\n }\n\n /**\n * Searches the provided scope for all instances of the indicated selector. If no scope is provided, document is used. If no selector is\n * specified, [data-dashjs-player] is used. The declarative setup also looks for source elements with the type attribute set to 'application/dash+xml'.\n * It then looks for those video elements which have a source element defined with a type matching 'application/dash+xml'.\n * A new MediaPlayer is instantiated for each matching video element and the appropriate source is assigned.\n * The autoplay property of the video element is preserved. Any preload attribute is ignored. This method should be called after the page onLoad event is dispatched.\n * Returns an array holding all the MediaPlayer instances that were added by this method.\n * @param {string} selector - CSS selector\n * @param {Object} scope\n * @returns {Array} an array of MediaPlayer objects\n */\n function createAll(selector, scope) {\n let aPlayers = [];\n selector = selector || '[data-dashjs-player]';\n scope = scope || document;\n let videos = scope.querySelectorAll(selector);\n for (let i = 0; i < videos.length; i++) {\n let player = create(videos[i], null);\n aPlayers.push(player);\n }\n\n let sources = scope.querySelectorAll('source[type=\"' + SUPPORTED_MIME_TYPE + '\"]');\n for (let i = 0; i < sources.length; i++) {\n let video = findVideo(sources[i]);\n let player = create(video, null);\n aPlayers.push(player);\n }\n\n return aPlayers;\n }\n\n function findVideo(el) {\n if ((/^VIDEO$/i).test(el.nodeName)) {\n return el;\n } else {\n return findVideo(el.parentNode);\n }\n }\n\n return {\n create: create,\n createAll: createAll\n };\n}\n\nlet instance = MediaPlayerFactory();\nlet loadInterval;\n\nfunction loadHandler() {\n window.removeEventListener('load', loadHandler);\n instance.createAll();\n}\n\nfunction loadIntervalHandler() {\n if (window.dashjs) {\n window.clearInterval(loadInterval);\n instance.createAll();\n }\n}\n\nlet avoidAutoCreate = typeof window !== 'undefined' && window && window.dashjs && window.dashjs.skipAutoCreate;\n\nif (!avoidAutoCreate && typeof window !== 'undefined' && window && window.addEventListener) {\n if (window.document.readyState === 'complete') {\n if (window.dashjs) {\n instance.createAll();\n } else {\n // If loaded asynchronously, window.readyState may be 'complete' even if dashjs hasn't loaded yet\n loadInterval = window.setInterval(loadIntervalHandler, 500);\n }\n } else {\n window.addEventListener('load', loadHandler);\n }\n}\n\nexport default instance;\n","/**\n * The copyright in this software is being made available under the BSD License,\n * included below. This software may be subject to other third party and contributor\n * rights, including patent rights, and no such rights are granted under this license.\n *\n * Copyright (c) 2013, Dash Industry Forum.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * * Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n * * Neither the name of Dash Industry Forum nor the names of its\n * contributors may be used to endorse or promote products derived from this software\n * without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nimport { MediaPlayer } from './index_mediaplayerOnly';\n\nimport { supportsMediaSource } from './src/streaming/utils/Capabilities';\nimport MetricsReporting from './src/streaming/metrics/MetricsReporting';\nimport Protection from './src/streaming/protection/Protection';\nimport MediaPlayerFactory from './src/streaming/MediaPlayerFactory';\nimport Debug from './src/core/Debug';\n\ndashjs.Protection = Protection;\ndashjs.MetricsReporting = MetricsReporting;\ndashjs.MediaPlayerFactory = MediaPlayerFactory;\ndashjs.Debug = Debug;\ndashjs.supportsMediaSource = supportsMediaSource;\n\nexport default dashjs;\nexport { MediaPlayer, Protection, MetricsReporting, MediaPlayerFactory, Debug, supportsMediaSource };\n","'use strict';\n\nvar m = require('react-dom');\nif (process.env.NODE_ENV === 'production') {\n exports.createRoot = m.createRoot;\n exports.hydrateRoot = m.hydrateRoot;\n} else {\n var i = m.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n exports.createRoot = function(c, o) {\n i.usingClientEntryPoint = true;\n try {\n return m.createRoot(c, o);\n } finally {\n i.usingClientEntryPoint = false;\n }\n };\n exports.hydrateRoot = function(c, h, o) {\n i.usingClientEntryPoint = true;\n try {\n return m.hydrateRoot(c, h, o);\n } finally {\n i.usingClientEntryPoint = false;\n }\n };\n}\n","'use strict';\n\nvar utils = require('./../utils');\nvar transformData = require('./transformData');\nvar isCancel = require('../cancel/isCancel');\nvar defaults = require('../defaults');\nvar CanceledError = require('../cancel/CanceledError');\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new CanceledError();\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n * @returns {Promise} The Promise to be fulfilled\n */\nmodule.exports = function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n // Ensure headers exist\n config.headers = config.headers || {};\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.data,\n config.headers,\n config.transformRequest\n );\n\n // Flatten headers\n config.headers = utils.merge(\n config.headers.common || {},\n config.headers[config.method] || {},\n config.headers\n );\n\n utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n function cleanHeaderConfig(method) {\n delete config.headers[method];\n }\n );\n\n var adapter = config.adapter || defaults.adapter;\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n response.data,\n response.headers,\n config.transformResponse\n );\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n reason.response.data,\n reason.response.headers,\n config.transformResponse\n );\n }\n }\n\n return Promise.reject(reason);\n });\n};\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react.production.min.js');\n} else {\n module.exports = require('./cjs/react.development.js');\n}\n","/** @license React v16.13.1\n * react-is.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\n'use strict';var b=\"function\"===typeof Symbol&&Symbol.for,c=b?Symbol.for(\"react.element\"):60103,d=b?Symbol.for(\"react.portal\"):60106,e=b?Symbol.for(\"react.fragment\"):60107,f=b?Symbol.for(\"react.strict_mode\"):60108,g=b?Symbol.for(\"react.profiler\"):60114,h=b?Symbol.for(\"react.provider\"):60109,k=b?Symbol.for(\"react.context\"):60110,l=b?Symbol.for(\"react.async_mode\"):60111,m=b?Symbol.for(\"react.concurrent_mode\"):60111,n=b?Symbol.for(\"react.forward_ref\"):60112,p=b?Symbol.for(\"react.suspense\"):60113,q=b?\nSymbol.for(\"react.suspense_list\"):60120,r=b?Symbol.for(\"react.memo\"):60115,t=b?Symbol.for(\"react.lazy\"):60116,v=b?Symbol.for(\"react.block\"):60121,w=b?Symbol.for(\"react.fundamental\"):60117,x=b?Symbol.for(\"react.responder\"):60118,y=b?Symbol.for(\"react.scope\"):60119;\nfunction z(a){if(\"object\"===typeof a&&null!==a){var u=a.$$typeof;switch(u){case c:switch(a=a.type,a){case l:case m:case e:case g:case f:case p:return a;default:switch(a=a&&a.$$typeof,a){case k:case n:case t:case r:case h:return a;default:return u}}case d:return u}}}function A(a){return z(a)===m}exports.AsyncMode=l;exports.ConcurrentMode=m;exports.ContextConsumer=k;exports.ContextProvider=h;exports.Element=c;exports.ForwardRef=n;exports.Fragment=e;exports.Lazy=t;exports.Memo=r;exports.Portal=d;\nexports.Profiler=g;exports.StrictMode=f;exports.Suspense=p;exports.isAsyncMode=function(a){return A(a)||z(a)===l};exports.isConcurrentMode=A;exports.isContextConsumer=function(a){return z(a)===k};exports.isContextProvider=function(a){return z(a)===h};exports.isElement=function(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===c};exports.isForwardRef=function(a){return z(a)===n};exports.isFragment=function(a){return z(a)===e};exports.isLazy=function(a){return z(a)===t};\nexports.isMemo=function(a){return z(a)===r};exports.isPortal=function(a){return z(a)===d};exports.isProfiler=function(a){return z(a)===g};exports.isStrictMode=function(a){return z(a)===f};exports.isSuspense=function(a){return z(a)===p};\nexports.isValidElementType=function(a){return\"string\"===typeof a||\"function\"===typeof a||a===e||a===m||a===g||a===f||a===p||a===q||\"object\"===typeof a&&null!==a&&(a.$$typeof===t||a.$$typeof===r||a.$$typeof===h||a.$$typeof===k||a.$$typeof===n||a.$$typeof===w||a.$$typeof===x||a.$$typeof===y||a.$$typeof===v)};exports.typeOf=z;\n","'use strict';\n\nvar bind = require('./helpers/bind');\n\n// utils is a library of generic helper functions non-specific to axios\n\nvar toString = Object.prototype.toString;\n\n// eslint-disable-next-line func-names\nvar kindOf = (function(cache) {\n // eslint-disable-next-line func-names\n return function(thing) {\n var str = toString.call(thing);\n return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n };\n})(Object.create(null));\n\nfunction kindOfTest(type) {\n type = type.toLowerCase();\n return function isKindOf(thing) {\n return kindOf(thing) === type;\n };\n}\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Array, otherwise false\n */\nfunction isArray(val) {\n return Array.isArray(val);\n}\n\n/**\n * Determine if a value is undefined\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nfunction isUndefined(val) {\n return typeof val === 'undefined';\n}\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @function\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nvar isArrayBuffer = kindOfTest('ArrayBuffer');\n\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n var result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a String, otherwise false\n */\nfunction isString(val) {\n return typeof val === 'string';\n}\n\n/**\n * Determine if a value is a Number\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Number, otherwise false\n */\nfunction isNumber(val) {\n return typeof val === 'number';\n}\n\n/**\n * Determine if a value is an Object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Object, otherwise false\n */\nfunction isObject(val) {\n return val !== null && typeof val === 'object';\n}\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {Object} val The value to test\n * @return {boolean} True if value is a plain Object, otherwise false\n */\nfunction isPlainObject(val) {\n if (kindOf(val) !== 'object') {\n return false;\n }\n\n var prototype = Object.getPrototypeOf(val);\n return prototype === null || prototype === Object.prototype;\n}\n\n/**\n * Determine if a value is a Date\n *\n * @function\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Date, otherwise false\n */\nvar isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @function\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a File, otherwise false\n */\nvar isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @function\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nvar isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @function\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a File, otherwise false\n */\nvar isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Function\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nfunction isFunction(val) {\n return toString.call(val) === '[object Function]';\n}\n\n/**\n * Determine if a value is a Stream\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nfunction isStream(val) {\n return isObject(val) && isFunction(val.pipe);\n}\n\n/**\n * Determine if a value is a FormData\n *\n * @param {Object} thing The value to test\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nfunction isFormData(thing) {\n var pattern = '[object FormData]';\n return thing && (\n (typeof FormData === 'function' && thing instanceof FormData) ||\n toString.call(thing) === pattern ||\n (isFunction(thing.toString) && thing.toString() === pattern)\n );\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n * @function\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nvar isURLSearchParams = kindOfTest('URLSearchParams');\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n * @returns {String} The String freed of excess whitespace\n */\nfunction trim(str) {\n return str.trim ? str.trim() : str.replace(/^\\s+|\\s+$/g, '');\n}\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n */\nfunction isStandardBrowserEnv() {\n if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' ||\n navigator.product === 'NativeScript' ||\n navigator.product === 'NS')) {\n return false;\n }\n return (\n typeof window !== 'undefined' &&\n typeof document !== 'undefined'\n );\n}\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n */\nfunction forEach(obj, fn) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (var i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n fn.call(null, obj[key], key, obj);\n }\n }\n }\n}\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n var result = {};\n function assignValue(val, key) {\n if (isPlainObject(result[key]) && isPlainObject(val)) {\n result[key] = merge(result[key], val);\n } else if (isPlainObject(val)) {\n result[key] = merge({}, val);\n } else if (isArray(val)) {\n result[key] = val.slice();\n } else {\n result[key] = val;\n }\n }\n\n for (var i = 0, l = arguments.length; i < l; i++) {\n forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n * @return {Object} The resulting value of object a\n */\nfunction extend(a, b, thisArg) {\n forEach(b, function assignValue(val, key) {\n if (thisArg && typeof val === 'function') {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n });\n return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n * @return {string} content value without BOM\n */\nfunction stripBOM(content) {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n}\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n */\n\nfunction inherits(constructor, superConstructor, props, descriptors) {\n constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n constructor.prototype.constructor = constructor;\n props && Object.assign(constructor.prototype, props);\n}\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function} [filter]\n * @returns {Object}\n */\n\nfunction toFlatObject(sourceObj, destObj, filter) {\n var props;\n var i;\n var prop;\n var merged = {};\n\n destObj = destObj || {};\n\n do {\n props = Object.getOwnPropertyNames(sourceObj);\n i = props.length;\n while (i-- > 0) {\n prop = props[i];\n if (!merged[prop]) {\n destObj[prop] = sourceObj[prop];\n merged[prop] = true;\n }\n }\n sourceObj = Object.getPrototypeOf(sourceObj);\n } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n return destObj;\n}\n\n/*\n * determines whether a string ends with the characters of a specified string\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n * @returns {boolean}\n */\nfunction endsWith(str, searchString, position) {\n str = String(str);\n if (position === undefined || position > str.length) {\n position = str.length;\n }\n position -= searchString.length;\n var lastIndex = str.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n}\n\n\n/**\n * Returns new array from array like object\n * @param {*} [thing]\n * @returns {Array}\n */\nfunction toArray(thing) {\n if (!thing) return null;\n var i = thing.length;\n if (isUndefined(i)) return null;\n var arr = new Array(i);\n while (i-- > 0) {\n arr[i] = thing[i];\n }\n return arr;\n}\n\n// eslint-disable-next-line func-names\nvar isTypedArray = (function(TypedArray) {\n // eslint-disable-next-line func-names\n return function(thing) {\n return TypedArray && thing instanceof TypedArray;\n };\n})(typeof Uint8Array !== 'undefined' && Object.getPrototypeOf(Uint8Array));\n\nmodule.exports = {\n isArray: isArray,\n isArrayBuffer: isArrayBuffer,\n isBuffer: isBuffer,\n isFormData: isFormData,\n isArrayBufferView: isArrayBufferView,\n isString: isString,\n isNumber: isNumber,\n isObject: isObject,\n isPlainObject: isPlainObject,\n isUndefined: isUndefined,\n isDate: isDate,\n isFile: isFile,\n isBlob: isBlob,\n isFunction: isFunction,\n isStream: isStream,\n isURLSearchParams: isURLSearchParams,\n isStandardBrowserEnv: isStandardBrowserEnv,\n forEach: forEach,\n merge: merge,\n extend: extend,\n trim: trim,\n stripBOM: stripBOM,\n inherits: inherits,\n toFlatObject: toFlatObject,\n kindOf: kindOf,\n kindOfTest: kindOfTest,\n endsWith: endsWith,\n toArray: toArray,\n isTypedArray: isTypedArray,\n isFileList: isFileList\n};\n","/* global Map:readonly, Set:readonly, ArrayBuffer:readonly */\n\nvar hasElementType = typeof Element !== 'undefined';\nvar hasMap = typeof Map === 'function';\nvar hasSet = typeof Set === 'function';\nvar hasArrayBuffer = typeof ArrayBuffer === 'function' && !!ArrayBuffer.isView;\n\n// Note: We **don't** need `envHasBigInt64Array` in fde es6/index.js\n\nfunction equal(a, b) {\n // START: fast-deep-equal es6/index.js 3.1.3\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) return false;\n\n var length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (!equal(a[i], b[i])) return false;\n return true;\n }\n\n // START: Modifications:\n // 1. Extra `has<Type> &&` helpers in initial condition allow es6 code\n // to co-exist with es5.\n // 2. Replace `for of` with es5 compliant iteration using `for`.\n // Basically, take:\n //\n // ```js\n // for (i of a.entries())\n // if (!b.has(i[0])) return false;\n // ```\n //\n // ... and convert to:\n //\n // ```js\n // it = a.entries();\n // while (!(i = it.next()).done)\n // if (!b.has(i.value[0])) return false;\n // ```\n //\n // **Note**: `i` access switches to `i.value`.\n var it;\n if (hasMap && (a instanceof Map) && (b instanceof Map)) {\n if (a.size !== b.size) return false;\n it = a.entries();\n while (!(i = it.next()).done)\n if (!b.has(i.value[0])) return false;\n it = a.entries();\n while (!(i = it.next()).done)\n if (!equal(i.value[1], b.get(i.value[0]))) return false;\n return true;\n }\n\n if (hasSet && (a instanceof Set) && (b instanceof Set)) {\n if (a.size !== b.size) return false;\n it = a.entries();\n while (!(i = it.next()).done)\n if (!b.has(i.value[0])) return false;\n return true;\n }\n // END: Modifications\n\n if (hasArrayBuffer && ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (a[i] !== b[i]) return false;\n return true;\n }\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n // START: Modifications:\n // Apply guards for `Object.create(null)` handling. See:\n // - https://github.com/FormidableLabs/react-fast-compare/issues/64\n // - https://github.com/epoberezkin/fast-deep-equal/issues/49\n if (a.valueOf !== Object.prototype.valueOf && typeof a.valueOf === 'function' && typeof b.valueOf === 'function') return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString && typeof a.toString === 'function' && typeof b.toString === 'function') return a.toString() === b.toString();\n // END: Modifications\n\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0;)\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n // END: fast-deep-equal\n\n // START: react-fast-compare\n // custom handling for DOM elements\n if (hasElementType && a instanceof Element) return false;\n\n // custom handling for React/Preact\n for (i = length; i-- !== 0;) {\n if ((keys[i] === '_owner' || keys[i] === '__v' || keys[i] === '__o') && a.$$typeof) {\n // React-specific: avoid traversing React elements' _owner\n // Preact-specific: avoid traversing Preact elements' __v and __o\n // __v = $_original / $_vnode\n // __o = $_owner\n // These properties contain circular references and are not needed when\n // comparing the actual elements (and not their owners)\n // .$$typeof and ._store on just reasonable markers of elements\n\n continue;\n }\n\n // all other properties should be traversed as usual\n if (!equal(a[keys[i]], b[keys[i]])) return false;\n }\n // END: react-fast-compare\n\n // START: fast-deep-equal\n return true;\n }\n\n return a !== a && b !== b;\n}\n// end fast-deep-equal\n\nmodule.exports = function isEqual(a, b) {\n try {\n return equal(a, b);\n } catch (error) {\n if (((error.message || '').match(/stack|recursion/i))) {\n // warn on circular references, don't crash\n // browsers give this different errors name and messages:\n // chrome/safari: \"RangeError\", \"Maximum call stack size exceeded\"\n // firefox: \"InternalError\", too much recursion\"\n // edge: \"Error\", \"Out of stack space\"\n console.warn('react-fast-compare cannot handle circular refs');\n return false;\n }\n // some other error. we should definitely know about these\n throw error;\n }\n};\n","'use strict';\n\nvar utils = require('../utils');\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n * @returns {Object} New object resulting from merging config2 to config1\n */\nmodule.exports = function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n var config = {};\n\n function getMergedValue(target, source) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge(target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(prop) {\n if (!utils.isUndefined(config2[prop])) {\n return getMergedValue(config1[prop], config2[prop]);\n } else if (!utils.isUndefined(config1[prop])) {\n return getMergedValue(undefined, config1[prop]);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(prop) {\n if (!utils.isUndefined(config2[prop])) {\n return getMergedValue(undefined, config2[prop]);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(prop) {\n if (!utils.isUndefined(config2[prop])) {\n return getMergedValue(undefined, config2[prop]);\n } else if (!utils.isUndefined(config1[prop])) {\n return getMergedValue(undefined, config1[prop]);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(prop) {\n if (prop in config2) {\n return getMergedValue(config1[prop], config2[prop]);\n } else if (prop in config1) {\n return getMergedValue(undefined, config1[prop]);\n }\n }\n\n var mergeMap = {\n 'url': valueFromConfig2,\n 'method': valueFromConfig2,\n 'data': valueFromConfig2,\n 'baseURL': defaultToConfig2,\n 'transformRequest': defaultToConfig2,\n 'transformResponse': defaultToConfig2,\n 'paramsSerializer': defaultToConfig2,\n 'timeout': defaultToConfig2,\n 'timeoutMessage': defaultToConfig2,\n 'withCredentials': defaultToConfig2,\n 'adapter': defaultToConfig2,\n 'responseType': defaultToConfig2,\n 'xsrfCookieName': defaultToConfig2,\n 'xsrfHeaderName': defaultToConfig2,\n 'onUploadProgress': defaultToConfig2,\n 'onDownloadProgress': defaultToConfig2,\n 'decompress': defaultToConfig2,\n 'maxContentLength': defaultToConfig2,\n 'maxBodyLength': defaultToConfig2,\n 'beforeRedirect': defaultToConfig2,\n 'transport': defaultToConfig2,\n 'httpAgent': defaultToConfig2,\n 'httpsAgent': defaultToConfig2,\n 'cancelToken': defaultToConfig2,\n 'socketPath': defaultToConfig2,\n 'responseEncoding': defaultToConfig2,\n 'validateStatus': mergeDirectKeys\n };\n\n utils.forEach(Object.keys(config1).concat(Object.keys(config2)), function computeConfigValue(prop) {\n var merge = mergeMap[prop] || mergeDeepProperties;\n var configValue = merge(prop);\n (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nfunction InterceptorManager() {\n this.handlers = [];\n}\n\n/**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\nInterceptorManager.prototype.use = function use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled: fulfilled,\n rejected: rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n};\n\n/**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n */\nInterceptorManager.prototype.eject = function eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n};\n\n/**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n */\nInterceptorManager.prototype.forEach = function forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n};\n\nmodule.exports = InterceptorManager;\n","'use strict';\n\nvar utils = require('./../utils');\n\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+').\n replace(/%5B/gi, '[').\n replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @returns {string} The formatted url\n */\nmodule.exports = function buildURL(url, params, paramsSerializer) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n\n var serializedParams;\n if (paramsSerializer) {\n serializedParams = paramsSerializer(params);\n } else if (utils.isURLSearchParams(params)) {\n serializedParams = params.toString();\n } else {\n var parts = [];\n\n utils.forEach(params, function serialize(val, key) {\n if (val === null || typeof val === 'undefined') {\n return;\n }\n\n if (utils.isArray(val)) {\n key = key + '[]';\n } else {\n val = [val];\n }\n\n utils.forEach(val, function parseValue(v) {\n if (utils.isDate(v)) {\n v = v.toISOString();\n } else if (utils.isObject(v)) {\n v = JSON.stringify(v);\n }\n parts.push(encode(key) + '=' + encode(v));\n });\n });\n\n serializedParams = parts.join('&');\n }\n\n if (serializedParams) {\n var hashmarkIndex = url.indexOf('#');\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n};\n","import isEqual from 'react-fast-compare'\r\nimport { lerp, random, randomElement } from './utils'\r\n\r\nexport interface SnowflakeProps {\r\n /** The color of the snowflake, can be any valid CSS color. */\r\n color: string\r\n /**\r\n * The minimum and maximum radius of the snowflake, will be\r\n * randomly selected within this range.\r\n *\r\n * The default value is `[0.5, 3.0]`.\r\n */\r\n radius: [number, number]\r\n /**\r\n * The minimum and maximum speed of the snowflake.\r\n *\r\n * The speed determines how quickly the snowflake moves\r\n * along the y axis (vertical speed).\r\n *\r\n * The values will be randomly selected within this range.\r\n *\r\n * The default value is `[1.0, 3.0]`.\r\n */\r\n speed: [number, number]\r\n /**\r\n * The minimum and maximum wind of the snowflake.\r\n *\r\n * The wind determines how quickly the snowflake moves\r\n * along the x axis (horizontal speed).\r\n *\r\n * The values will be randomly selected within this range.\r\n *\r\n * The default value is `[-0.5, 2.0]`.\r\n */\r\n wind: [number, number]\r\n /**\r\n * The frequency in frames that the wind and speed values\r\n * will update.\r\n *\r\n * The default value is 200.\r\n */\r\n changeFrequency: number\r\n /**\r\n * An array of images that will be rendered as the snowflakes instead\r\n * of the default circle shapes.\r\n */\r\n images?: CanvasImageSource[]\r\n /**\r\n * The minimum and maximum rotation speed of the snowflake (in degrees of\r\n * rotation per frame).\r\n *\r\n * The rotation speed determines how quickly the snowflake rotates when\r\n * an image is being rendered.\r\n *\r\n * The values will be randomly selected within this range.\r\n *\r\n * The default value is `[-1.0, 1.0]`.\r\n */\r\n rotationSpeed: [number, number]\r\n}\r\n\r\nexport type SnowflakeConfig = Partial<SnowflakeProps>\r\n\r\nexport const defaultConfig: SnowflakeProps = {\r\n color: '#dee4fd',\r\n radius: [0.5, 3.0],\r\n speed: [1.0, 3.0],\r\n wind: [-0.5, 2.0],\r\n changeFrequency: 200,\r\n rotationSpeed: [-1.0, 1.0],\r\n}\r\n\r\ninterface SnowflakeParams {\r\n x: number\r\n y: number\r\n radius: number\r\n rotation: number\r\n rotationSpeed: number\r\n speed: number\r\n wind: number\r\n nextSpeed: number\r\n nextWind: number\r\n nextRotationSpeed: number\r\n}\r\n\r\n/**\r\n * An individual snowflake that will update it's location every call to `update`\r\n * and draw itself to the canvas every call to `draw`.\r\n */\r\nclass Snowflake {\r\n static offscreenCanvases = new WeakMap<CanvasImageSource, Record<number, HTMLCanvasElement>>()\r\n\r\n private config!: SnowflakeProps\r\n private params: SnowflakeParams\r\n private framesSinceLastUpdate: number\r\n private image?: CanvasImageSource\r\n\r\n public constructor(canvas: HTMLCanvasElement, config: SnowflakeConfig = {}) {\r\n // Set custom config\r\n this.updateConfig(config)\r\n\r\n // Setting initial parameters\r\n const { radius, wind, speed, rotationSpeed } = this.config\r\n\r\n this.params = {\r\n x: random(0, canvas.offsetWidth),\r\n y: random(-canvas.offsetHeight, 0),\r\n rotation: random(0, 360),\r\n radius: random(...radius),\r\n speed: random(...speed),\r\n wind: random(...wind),\r\n rotationSpeed: random(...rotationSpeed),\r\n nextSpeed: random(...wind),\r\n nextWind: random(...speed),\r\n nextRotationSpeed: random(...rotationSpeed),\r\n }\r\n\r\n this.framesSinceLastUpdate = 0\r\n }\r\n\r\n private selectImage() {\r\n if (this.config.images && this.config.images.length > 0) {\r\n this.image = randomElement(this.config.images)\r\n } else {\r\n this.image = undefined\r\n }\r\n }\r\n\r\n public updateConfig(config: SnowflakeConfig): void {\r\n const previousConfig = this.config\r\n this.config = { ...defaultConfig, ...config }\r\n this.config.changeFrequency = random(this.config.changeFrequency, this.config.changeFrequency * 1.5)\r\n\r\n // Update the radius if the config has changed, it won't gradually update on it's own\r\n if (this.params && !isEqual(this.config.radius, previousConfig?.radius)) {\r\n this.params.radius = random(...this.config.radius)\r\n }\r\n\r\n if (!isEqual(this.config.images, previousConfig?.images)) {\r\n this.selectImage()\r\n }\r\n }\r\n\r\n private updateTargetParams(): void {\r\n this.params.nextSpeed = random(...this.config.speed)\r\n this.params.nextWind = random(...this.config.wind)\r\n if (this.image) {\r\n this.params.nextRotationSpeed = random(...this.config.rotationSpeed)\r\n }\r\n }\r\n\r\n public update(canvas: HTMLCanvasElement, framesPassed = 1): void {\r\n const { x, y, rotation, rotationSpeed, nextRotationSpeed, wind, speed, nextWind, nextSpeed, radius } = this.params\r\n\r\n // Update current location, wrapping around if going off the canvas\r\n this.params.x = (x + wind * framesPassed) % (canvas.offsetWidth + radius * 2)\r\n if (this.params.x > canvas.offsetWidth + radius) this.params.x = -radius\r\n this.params.y = (y + speed * framesPassed) % (canvas.offsetHeight + radius * 2)\r\n if (this.params.y > canvas.offsetHeight + radius) this.params.y = -radius\r\n\r\n // Apply rotation\r\n if (this.image) {\r\n this.params.rotation = (rotation + rotationSpeed) % 360\r\n }\r\n\r\n // Update the wind, speed and rotation towards the desired values\r\n this.params.speed = lerp(speed, nextSpeed, 0.01)\r\n this.params.wind = lerp(wind, nextWind, 0.01)\r\n this.params.rotationSpeed = lerp(rotationSpeed, nextRotationSpeed, 0.01)\r\n\r\n if (this.framesSinceLastUpdate++ > this.config.changeFrequency) {\r\n this.updateTargetParams()\r\n this.framesSinceLastUpdate = 0\r\n }\r\n }\r\n\r\n private getImageOffscreenCanvas(image: CanvasImageSource, size: number): CanvasImageSource {\r\n if (image instanceof HTMLImageElement && image.loading) return image\r\n let sizes = Snowflake.offscreenCanvases.get(image)\r\n\r\n if (!sizes) {\r\n sizes = {}\r\n Snowflake.offscreenCanvases.set(image, sizes)\r\n }\r\n\r\n if (!(size in sizes)) {\r\n const canvas = document.createElement('canvas')\r\n canvas.width = size\r\n canvas.height = size\r\n canvas.getContext('2d')?.drawImage(image, 0, 0, size, size)\r\n sizes[size] = canvas\r\n }\r\n\r\n return sizes[size] ?? image\r\n }\r\n\r\n public draw(ctx: CanvasRenderingContext2D): void {\r\n if (this.image) {\r\n // ctx.save()\r\n // ctx.translate(this.params.x, this.params.y)\r\n ctx.setTransform(1, 0, 0, 1, this.params.x, this.params.y)\r\n\r\n const radius = Math.ceil(this.params.radius)\r\n ctx.rotate((this.params.rotation * Math.PI) / 180)\r\n ctx.drawImage(\r\n this.getImageOffscreenCanvas(this.image, radius),\r\n -Math.ceil(radius / 2),\r\n -Math.ceil(radius / 2),\r\n radius,\r\n radius,\r\n )\r\n\r\n // ctx.restore()\r\n } else {\r\n ctx.beginPath()\r\n ctx.arc(this.params.x, this.params.y, this.params.radius, 0, 2 * Math.PI)\r\n ctx.fillStyle = this.config.color\r\n ctx.closePath()\r\n ctx.fill()\r\n }\r\n }\r\n}\r\n\r\nexport default Snowflake\r\n","'use strict';\n\nmodule.exports = function bind(fn, thisArg) {\n return function wrap() {\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i];\n }\n return fn.apply(thisArg, args);\n };\n};\n","/**\n * @license React\n * scheduler.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';function f(a,b){var c=a.length;a.push(b);a:for(;0<c;){var d=c-1>>>1,e=a[d];if(0<g(e,b))a[d]=b,a[c]=e,c=d;else break a}}function h(a){return 0===a.length?null:a[0]}function k(a){if(0===a.length)return null;var b=a[0],c=a.pop();if(c!==b){a[0]=c;a:for(var d=0,e=a.length,w=e>>>1;d<w;){var m=2*(d+1)-1,C=a[m],n=m+1,x=a[n];if(0>g(C,c))n<e&&0>g(x,C)?(a[d]=x,a[n]=c,d=n):(a[d]=C,a[m]=c,d=m);else if(n<e&&0>g(x,c))a[d]=x,a[n]=c,d=n;else break a}}return b}\nfunction g(a,b){var c=a.sortIndex-b.sortIndex;return 0!==c?c:a.id-b.id}if(\"object\"===typeof performance&&\"function\"===typeof performance.now){var l=performance;exports.unstable_now=function(){return l.now()}}else{var p=Date,q=p.now();exports.unstable_now=function(){return p.now()-q}}var r=[],t=[],u=1,v=null,y=3,z=!1,A=!1,B=!1,D=\"function\"===typeof setTimeout?setTimeout:null,E=\"function\"===typeof clearTimeout?clearTimeout:null,F=\"undefined\"!==typeof setImmediate?setImmediate:null;\n\"undefined\"!==typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function G(a){for(var b=h(t);null!==b;){if(null===b.callback)k(t);else if(b.startTime<=a)k(t),b.sortIndex=b.expirationTime,f(r,b);else break;b=h(t)}}function H(a){B=!1;G(a);if(!A)if(null!==h(r))A=!0,I(J);else{var b=h(t);null!==b&&K(H,b.startTime-a)}}\nfunction J(a,b){A=!1;B&&(B=!1,E(L),L=-1);z=!0;var c=y;try{G(b);for(v=h(r);null!==v&&(!(v.expirationTime>b)||a&&!M());){var d=v.callback;if(\"function\"===typeof d){v.callback=null;y=v.priorityLevel;var e=d(v.expirationTime<=b);b=exports.unstable_now();\"function\"===typeof e?v.callback=e:v===h(r)&&k(r);G(b)}else k(r);v=h(r)}if(null!==v)var w=!0;else{var m=h(t);null!==m&&K(H,m.startTime-b);w=!1}return w}finally{v=null,y=c,z=!1}}var N=!1,O=null,L=-1,P=5,Q=-1;\nfunction M(){return exports.unstable_now()-Q<P?!1:!0}function R(){if(null!==O){var a=exports.unstable_now();Q=a;var b=!0;try{b=O(!0,a)}finally{b?S():(N=!1,O=null)}}else N=!1}var S;if(\"function\"===typeof F)S=function(){F(R)};else if(\"undefined\"!==typeof MessageChannel){var T=new MessageChannel,U=T.port2;T.port1.onmessage=R;S=function(){U.postMessage(null)}}else S=function(){D(R,0)};function I(a){O=a;N||(N=!0,S())}function K(a,b){L=D(function(){a(exports.unstable_now())},b)}\nexports.unstable_IdlePriority=5;exports.unstable_ImmediatePriority=1;exports.unstable_LowPriority=4;exports.unstable_NormalPriority=3;exports.unstable_Profiling=null;exports.unstable_UserBlockingPriority=2;exports.unstable_cancelCallback=function(a){a.callback=null};exports.unstable_continueExecution=function(){A||z||(A=!0,I(J))};\nexports.unstable_forceFrameRate=function(a){0>a||125<a?console.error(\"forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported\"):P=0<a?Math.floor(1E3/a):5};exports.unstable_getCurrentPriorityLevel=function(){return y};exports.unstable_getFirstCallbackNode=function(){return h(r)};exports.unstable_next=function(a){switch(y){case 1:case 2:case 3:var b=3;break;default:b=y}var c=y;y=b;try{return a()}finally{y=c}};exports.unstable_pauseExecution=function(){};\nexports.unstable_requestPaint=function(){};exports.unstable_runWithPriority=function(a,b){switch(a){case 1:case 2:case 3:case 4:case 5:break;default:a=3}var c=y;y=a;try{return b()}finally{y=c}};\nexports.unstable_scheduleCallback=function(a,b,c){var d=exports.unstable_now();\"object\"===typeof c&&null!==c?(c=c.delay,c=\"number\"===typeof c&&0<c?d+c:d):c=d;switch(a){case 1:var e=-1;break;case 2:e=250;break;case 5:e=1073741823;break;case 4:e=1E4;break;default:e=5E3}e=c+e;a={id:u++,callback:b,priorityLevel:a,startTime:c,expirationTime:e,sortIndex:-1};c>d?(a.sortIndex=c,f(t,a),null===h(r)&&a===h(t)&&(B?(E(L),L=-1):B=!0,K(H,c-d))):(a.sortIndex=e,f(r,a),A||z||(A=!0,I(J)));return a};\nexports.unstable_shouldYield=M;exports.unstable_wrapCallback=function(a){var b=y;return function(){var c=y;y=b;try{return a.apply(this,arguments)}finally{y=c}}};\n","'use strict';\n\nvar utils = require('../utils');\n\n/**\n * Convert a data object to FormData\n * @param {Object} obj\n * @param {?Object} [formData]\n * @returns {Object}\n **/\n\nfunction toFormData(obj, formData) {\n // eslint-disable-next-line no-param-reassign\n formData = formData || new FormData();\n\n var stack = [];\n\n function convertValue(value) {\n if (value === null) return '';\n\n if (utils.isDate(value)) {\n return value.toISOString();\n }\n\n if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\n return typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n }\n\n return value;\n }\n\n function build(data, parentKey) {\n if (utils.isPlainObject(data) || utils.isArray(data)) {\n if (stack.indexOf(data) !== -1) {\n throw Error('Circular reference detected in ' + parentKey);\n }\n\n stack.push(data);\n\n utils.forEach(data, function each(value, key) {\n if (utils.isUndefined(value)) return;\n var fullKey = parentKey ? parentKey + '.' + key : key;\n var arr;\n\n if (value && !parentKey && typeof value === 'object') {\n if (utils.endsWith(key, '{}')) {\n // eslint-disable-next-line no-param-reassign\n value = JSON.stringify(value);\n } else if (utils.endsWith(key, '[]') && (arr = utils.toArray(value))) {\n // eslint-disable-next-line func-names\n arr.forEach(function(el) {\n !utils.isUndefined(el) && formData.append(fullKey, convertValue(el));\n });\n return;\n }\n }\n\n build(value, fullKey);\n });\n\n stack.pop();\n } else {\n formData.append(parentKey, convertValue(data));\n }\n }\n\n build(obj);\n\n return formData;\n}\n\nmodule.exports = toFormData;\n","/** @license React v17.0.2\n * react-is.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 b=60103,c=60106,d=60107,e=60108,f=60114,g=60109,h=60110,k=60112,l=60113,m=60120,n=60115,p=60116,q=60121,r=60122,u=60117,v=60129,w=60131;\nif(\"function\"===typeof Symbol&&Symbol.for){var x=Symbol.for;b=x(\"react.element\");c=x(\"react.portal\");d=x(\"react.fragment\");e=x(\"react.strict_mode\");f=x(\"react.profiler\");g=x(\"react.provider\");h=x(\"react.context\");k=x(\"react.forward_ref\");l=x(\"react.suspense\");m=x(\"react.suspense_list\");n=x(\"react.memo\");p=x(\"react.lazy\");q=x(\"react.block\");r=x(\"react.server.block\");u=x(\"react.fundamental\");v=x(\"react.debug_trace_mode\");w=x(\"react.legacy_hidden\")}\nfunction y(a){if(\"object\"===typeof a&&null!==a){var t=a.$$typeof;switch(t){case b:switch(a=a.type,a){case d:case f:case e:case l:case m:return a;default:switch(a=a&&a.$$typeof,a){case h:case k:case p:case n:case g:return a;default:return t}}case c:return t}}}var z=g,A=b,B=k,C=d,D=p,E=n,F=c,G=f,H=e,I=l;exports.ContextConsumer=h;exports.ContextProvider=z;exports.Element=A;exports.ForwardRef=B;exports.Fragment=C;exports.Lazy=D;exports.Memo=E;exports.Portal=F;exports.Profiler=G;exports.StrictMode=H;\nexports.Suspense=I;exports.isAsyncMode=function(){return!1};exports.isConcurrentMode=function(){return!1};exports.isContextConsumer=function(a){return y(a)===h};exports.isContextProvider=function(a){return y(a)===g};exports.isElement=function(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===b};exports.isForwardRef=function(a){return y(a)===k};exports.isFragment=function(a){return y(a)===d};exports.isLazy=function(a){return y(a)===p};exports.isMemo=function(a){return y(a)===n};\nexports.isPortal=function(a){return y(a)===c};exports.isProfiler=function(a){return y(a)===f};exports.isStrictMode=function(a){return y(a)===e};exports.isSuspense=function(a){return y(a)===l};exports.isValidElementType=function(a){return\"string\"===typeof a||\"function\"===typeof a||a===d||a===f||a===v||a===e||a===l||a===m||a===w||\"object\"===typeof a&&null!==a&&(a.$$typeof===p||a.$$typeof===n||a.$$typeof===g||a.$$typeof===h||a.$$typeof===k||a.$$typeof===u||a.$$typeof===q||a[0]===r)?!0:!1};\nexports.typeOf=y;\n","/**\r\n * Enhanced random function, selects a random value between a minimum and maximum. If the values provided are both\r\n * integers then the number returned will be an integer, otherwise the return number will be a decimal.\r\n * @param min The minimum value\r\n * @param max The maximum value\r\n */\r\nexport function random(min: number, max: number): number {\r\n const randomNumber = Math.random() * (max - min + 1) + min\r\n\r\n if (!Number.isInteger(min) || !Number.isInteger(max)) {\r\n return randomNumber\r\n } else {\r\n return Math.floor(randomNumber)\r\n }\r\n}\r\n\r\n/**\r\n * Linear interpolation function to gradually step towards a target value\r\n * @param start The current value\r\n * @param end The target value\r\n * @param normal The rate of change between 0 and 1 (0 = no change, 1 = instant)\r\n */\r\nexport function lerp(start: number, end: number, normal: number) {\r\n return (1 - normal) * start + normal * end\r\n}\r\n\r\n/**\r\n * Gets the height and width of the provided HTML element\r\n * @param element The html element to measure\r\n */\r\nexport function getSize(element?: HTMLElement | null) {\r\n if (!element) return { height: 0, width: 0 }\r\n\r\n return {\r\n height: element.offsetHeight,\r\n width: element.offsetWidth,\r\n }\r\n}\r\n\r\n/**\r\n * Selects a random item from an array of inputs.\r\n *\r\n * @param items The array of items to choose from\r\n * @returns A random item selected from the array\r\n */\r\nexport function randomElement<T>(items: T[]): T {\r\n const index = Math.floor(Math.random() * items.length)\r\n return items[index]\r\n}\r\n","'use strict';\n\nvar AxiosError = require('../core/AxiosError');\nvar utils = require('../utils');\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @class\n * @param {string=} message The message.\n */\nfunction CanceledError(message) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED);\n this.name = 'CanceledError';\n}\n\nutils.inherits(CanceledError, AxiosError, {\n __CANCEL__: true\n});\n\nmodule.exports = CanceledError;\n","'use strict';\n\nvar isAbsoluteURL = require('../helpers/isAbsoluteURL');\nvar combineURLs = require('../helpers/combineURLs');\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n * @returns {string} The combined full path\n */\nmodule.exports = function buildFullPath(baseURL, requestedURL) {\n if (baseURL && !isAbsoluteURL(requestedURL)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n};\n","'use strict';\n\nvar CanceledError = require('./CanceledError');\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @class\n * @param {Function} executor The executor function.\n */\nfunction CancelToken(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n var resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n var token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(function(cancel) {\n if (!token._listeners) return;\n\n var i;\n var l = token._listeners.length;\n\n for (i = 0; i < l; i++) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = function(onfulfilled) {\n var _resolve;\n // eslint-disable-next-line func-names\n var promise = new Promise(function(resolve) {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new CanceledError(message);\n resolvePromise(token.reason);\n });\n}\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n */\nCancelToken.prototype.throwIfRequested = function throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n};\n\n/**\n * Subscribe to the cancel signal\n */\n\nCancelToken.prototype.subscribe = function subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n};\n\n/**\n * Unsubscribe from the cancel signal\n */\n\nCancelToken.prototype.unsubscribe = function unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n var index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n};\n\n/**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\nCancelToken.source = function source() {\n var cancel;\n var token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token: token,\n cancel: cancel\n };\n};\n\nmodule.exports = CancelToken;\n","'use strict';\n\nmodule.exports = function isCancel(value) {\n return !!(value && value.__CANCEL__);\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs support document.cookie\n (function standardBrowserEnv() {\n return {\n write: function write(name, value, expires, path, domain, secure) {\n var cookie = [];\n cookie.push(name + '=' + encodeURIComponent(value));\n\n if (utils.isNumber(expires)) {\n cookie.push('expires=' + new Date(expires).toGMTString());\n }\n\n if (utils.isString(path)) {\n cookie.push('path=' + path);\n }\n\n if (utils.isString(domain)) {\n cookie.push('domain=' + domain);\n }\n\n if (secure === true) {\n cookie.push('secure');\n }\n\n document.cookie = cookie.join('; ');\n },\n\n read: function read(name) {\n var match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove: function remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n };\n })() :\n\n // Non standard browser env (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return {\n write: function write() {},\n read: function read() { return null; },\n remove: function remove() {}\n };\n })()\n);\n","'use strict';\n\nfunction checkDCE() {\n /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\n if (\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' ||\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function'\n ) {\n return;\n }\n if (process.env.NODE_ENV !== 'production') {\n // This branch is unreachable because this function is only called\n // in production, but the condition is true only in development.\n // Therefore if the branch is still here, dead code elimination wasn't\n // properly applied.\n // Don't change the message. React DevTools relies on it. Also make sure\n // this message doesn't occur elsewhere in this function, or it will cause\n // a false positive.\n throw new Error('^_^');\n }\n try {\n // Verify that the code above has been dead code eliminated (DCE'd).\n __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);\n } catch (err) {\n // DevTools shouldn't crash React, no matter what.\n // We should still report in case we break this code.\n console.error(err);\n }\n}\n\nif (process.env.NODE_ENV === 'production') {\n // DCE check should happen before ReactDOM bundle executes so that\n // DevTools can report bad minification during injection.\n checkDCE();\n module.exports = require('./cjs/react-dom.production.min.js');\n} else {\n module.exports = require('./cjs/react-dom.development.js');\n}\n","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n * @returns {Function}\n */\nmodule.exports = function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n};\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('../cjs/use-sync-external-store-shim/with-selector.production.js');\n} else {\n module.exports = require('../cjs/use-sync-external-store-shim/with-selector.development.js');\n}\n","'use strict';\n\nvar utils = require('./../utils');\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nmodule.exports = function isAxiosError(payload) {\n return utils.isObject(payload) && (payload.isAxiosError === true);\n};\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/scheduler.production.min.js');\n} else {\n module.exports = require('./cjs/scheduler.development.js');\n}\n","'use strict';\n\nvar utils = require('./../utils');\nvar buildURL = require('../helpers/buildURL');\nvar InterceptorManager = require('./InterceptorManager');\nvar dispatchRequest = require('./dispatchRequest');\nvar mergeConfig = require('./mergeConfig');\nvar buildFullPath = require('./buildFullPath');\nvar validator = require('../helpers/validator');\n\nvar validators = validator.validators;\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n */\nfunction Axios(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n}\n\n/**\n * Dispatch a request\n *\n * @param {Object} config The config specific for this request (merged with this.defaults)\n */\nAxios.prototype.request = function request(configOrUrl, config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof configOrUrl === 'string') {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n // Set config.method\n if (config.method) {\n config.method = config.method.toLowerCase();\n } else if (this.defaults.method) {\n config.method = this.defaults.method.toLowerCase();\n } else {\n config.method = 'get';\n }\n\n var transitional = config.transitional;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n // filter out skipped interceptors\n var requestInterceptorChain = [];\n var synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n var responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n var promise;\n\n if (!synchronousRequestInterceptors) {\n var chain = [dispatchRequest, undefined];\n\n Array.prototype.unshift.apply(chain, requestInterceptorChain);\n chain = chain.concat(responseInterceptorChain);\n\n promise = Promise.resolve(config);\n while (chain.length) {\n promise = promise.then(chain.shift(), chain.shift());\n }\n\n return promise;\n }\n\n\n var newConfig = config;\n while (requestInterceptorChain.length) {\n var onFulfilled = requestInterceptorChain.shift();\n var onRejected = requestInterceptorChain.shift();\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected(error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest(newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n while (responseInterceptorChain.length) {\n promise = promise.then(responseInterceptorChain.shift(), responseInterceptorChain.shift());\n }\n\n return promise;\n};\n\nAxios.prototype.getUri = function getUri(config) {\n config = mergeConfig(this.defaults, config);\n var fullPath = buildFullPath(config.baseURL, config.url);\n return buildURL(fullPath, config.params, config.paramsSerializer);\n};\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method: method,\n url: url,\n data: (config || {}).data\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n\n function generateHTTPMethod(isForm) {\n return function httpMethod(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method: method,\n headers: isForm ? {\n 'Content-Type': 'multipart/form-data'\n } : {},\n url: url,\n data: data\n }));\n };\n }\n\n Axios.prototype[method] = generateHTTPMethod();\n\n Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nmodule.exports = Axios;\n","'use strict';\n\nmodule.exports = {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n};\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('../cjs/use-sync-external-store-shim.production.js');\n} else {\n module.exports = require('../cjs/use-sync-external-store-shim.development.js');\n}\n","/**\n * @license React\n * use-sync-external-store-shim/with-selector.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and 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\n\"use strict\";\nvar React = require(\"react\"),\n shim = require(\"use-sync-external-store/shim\");\nfunction is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n}\nvar objectIs = \"function\" === typeof Object.is ? Object.is : is,\n useSyncExternalStore = shim.useSyncExternalStore,\n useRef = React.useRef,\n useEffect = React.useEffect,\n useMemo = React.useMemo,\n useDebugValue = React.useDebugValue;\nexports.useSyncExternalStoreWithSelector = function (\n subscribe,\n getSnapshot,\n getServerSnapshot,\n selector,\n isEqual\n) {\n var instRef = useRef(null);\n if (null === instRef.current) {\n var inst = { hasValue: !1, value: null };\n instRef.current = inst;\n } else inst = instRef.current;\n instRef = useMemo(\n function () {\n function memoizedSelector(nextSnapshot) {\n if (!hasMemo) {\n hasMemo = !0;\n memoizedSnapshot = nextSnapshot;\n nextSnapshot = selector(nextSnapshot);\n if (void 0 !== isEqual && inst.hasValue) {\n var currentSelection = inst.value;\n if (isEqual(currentSelection, nextSnapshot))\n return (memoizedSelection = currentSelection);\n }\n return (memoizedSelection = nextSnapshot);\n }\n currentSelection = memoizedSelection;\n if (objectIs(memoizedSnapshot, nextSnapshot)) return currentSelection;\n var nextSelection = selector(nextSnapshot);\n if (void 0 !== isEqual && isEqual(currentSelection, nextSelection))\n return (memoizedSnapshot = nextSnapshot), currentSelection;\n memoizedSnapshot = nextSnapshot;\n return (memoizedSelection = nextSelection);\n }\n var hasMemo = !1,\n memoizedSnapshot,\n memoizedSelection,\n maybeGetServerSnapshot =\n void 0 === getServerSnapshot ? null : getServerSnapshot;\n return [\n function () {\n return memoizedSelector(getSnapshot());\n },\n null === maybeGetServerSnapshot\n ? void 0\n : function () {\n return memoizedSelector(maybeGetServerSnapshot());\n }\n ];\n },\n [getSnapshot, getServerSnapshot, selector, isEqual]\n );\n var value = useSyncExternalStore(subscribe, instRef[0], instRef[1]);\n useEffect(\n function () {\n inst.hasValue = !0;\n inst.value = value;\n },\n [value]\n );\n useDebugValue(value);\n return value;\n};\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\tid: moduleId,\n\t\tloaded: false,\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// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\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};","var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\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__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"static/js/\" + chunkId + \".\" + \"d855a71b\" + \".chunk.js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var inProgress = {};\nvar dataWebpackPrefix = \"frontend:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// 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__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.p = \"/\";","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t792: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkfrontend\"] = self[\"webpackChunkfrontend\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","////////////////////////////////////////////////////////////////////////////////\n//#region Types and Constants\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Actions represent the type of change to a location value.\n */\nexport enum Action {\n /**\n * A POP indicates a change to an arbitrary index in the history stack, such\n * as a back or forward navigation. It does not describe the direction of the\n * navigation, only that the current index changed.\n *\n * Note: This is the default action for newly created history objects.\n */\n Pop = \"POP\",\n\n /**\n * A PUSH indicates a new entry being added to the history stack, such as when\n * a link is clicked and a new page loads. When this happens, all subsequent\n * entries in the stack are lost.\n */\n Push = \"PUSH\",\n\n /**\n * A REPLACE indicates the entry at the current index in the history stack\n * being replaced by a new one.\n */\n Replace = \"REPLACE\",\n}\n\n/**\n * The pathname, search, and hash values of a URL.\n */\nexport interface Path {\n /**\n * A URL pathname, beginning with a /.\n */\n pathname: string;\n\n /**\n * A URL search string, beginning with a ?.\n */\n search: string;\n\n /**\n * A URL fragment identifier, beginning with a #.\n */\n hash: string;\n}\n\n// TODO: (v7) Change the Location generic default from `any` to `unknown` and\n// remove Remix `useLocation` wrapper.\n\n/**\n * An entry in a history stack. A location contains information about the\n * URL path, as well as possibly some arbitrary state and a key.\n */\nexport interface Location<State = any> extends Path {\n /**\n * A value of arbitrary data associated with this location.\n */\n state: State;\n\n /**\n * A unique string associated with this location. May be used to safely store\n * and retrieve data in some other storage API, like `localStorage`.\n *\n * Note: This value is always \"default\" on the initial location.\n */\n key: string;\n}\n\n/**\n * A change to the current location.\n */\nexport interface Update {\n /**\n * The action that triggered the change.\n */\n action: Action;\n\n /**\n * The new location.\n */\n location: Location;\n\n /**\n * The delta between this location and the former location in the history stack\n */\n delta: number | null;\n}\n\n/**\n * A function that receives notifications about location changes.\n */\nexport interface Listener {\n (update: Update): void;\n}\n\n/**\n * Describes a location that is the destination of some navigation, either via\n * `history.push` or `history.replace`. This may be either a URL or the pieces\n * of a URL path.\n */\nexport type To = string | Partial<Path>;\n\n/**\n * A history is an interface to the navigation stack. The history serves as the\n * source of truth for the current location, as well as provides a set of\n * methods that may be used to change it.\n *\n * It is similar to the DOM's `window.history` object, but with a smaller, more\n * focused API.\n */\nexport interface History {\n /**\n * The last action that modified the current location. This will always be\n * Action.Pop when a history instance is first created. This value is mutable.\n */\n readonly action: Action;\n\n /**\n * The current location. This value is mutable.\n */\n readonly location: Location;\n\n /**\n * Returns a valid href for the given `to` value that may be used as\n * the value of an <a href> attribute.\n *\n * @param to - The destination URL\n */\n createHref(to: To): string;\n\n /**\n * Returns a URL for the given `to` value\n *\n * @param to - The destination URL\n */\n createURL(to: To): URL;\n\n /**\n * Encode a location the same way window.history would do (no-op for memory\n * history) so we ensure our PUSH/REPLACE navigations for data routers\n * behave the same as POP\n *\n * @param to Unencoded path\n */\n encodeLocation(to: To): Path;\n\n /**\n * Pushes a new location onto the history stack, increasing its length by one.\n * If there were any entries in the stack after the current one, they are\n * lost.\n *\n * @param to - The new URL\n * @param state - Data to associate with the new location\n */\n push(to: To, state?: any): void;\n\n /**\n * Replaces the current location in the history stack with a new one. The\n * location that was replaced will no longer be available.\n *\n * @param to - The new URL\n * @param state - Data to associate with the new location\n */\n replace(to: To, state?: any): void;\n\n /**\n * Navigates `n` entries backward/forward in the history stack relative to the\n * current index. For example, a \"back\" navigation would use go(-1).\n *\n * @param delta - The delta in the stack index\n */\n go(delta: number): void;\n\n /**\n * Sets up a listener that will be called whenever the current location\n * changes.\n *\n * @param listener - A function that will be called when the location changes\n * @returns unlisten - A function that may be used to stop listening\n */\n listen(listener: Listener): () => void;\n}\n\ntype HistoryState = {\n usr: any;\n key?: string;\n idx: number;\n};\n\nconst PopStateEventType = \"popstate\";\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Memory History\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * A user-supplied object that describes a location. Used when providing\n * entries to `createMemoryHistory` via its `initialEntries` option.\n */\nexport type InitialEntry = string | Partial<Location>;\n\nexport type MemoryHistoryOptions = {\n initialEntries?: InitialEntry[];\n initialIndex?: number;\n v5Compat?: boolean;\n};\n\n/**\n * A memory history stores locations in memory. This is useful in stateful\n * environments where there is no web browser, such as node tests or React\n * Native.\n */\nexport interface MemoryHistory extends History {\n /**\n * The current index in the history stack.\n */\n readonly index: number;\n}\n\n/**\n * Memory history stores the current location in memory. It is designed for use\n * in stateful non-browser environments like tests and React Native.\n */\nexport function createMemoryHistory(\n options: MemoryHistoryOptions = {}\n): MemoryHistory {\n let { initialEntries = [\"/\"], initialIndex, v5Compat = false } = options;\n let entries: Location[]; // Declare so we can access from createMemoryLocation\n entries = initialEntries.map((entry, index) =>\n createMemoryLocation(\n entry,\n typeof entry === \"string\" ? null : entry.state,\n index === 0 ? \"default\" : undefined\n )\n );\n let index = clampIndex(\n initialIndex == null ? entries.length - 1 : initialIndex\n );\n let action = Action.Pop;\n let listener: Listener | null = null;\n\n function clampIndex(n: number): number {\n return Math.min(Math.max(n, 0), entries.length - 1);\n }\n function getCurrentLocation(): Location {\n return entries[index];\n }\n function createMemoryLocation(\n to: To,\n state: any = null,\n key?: string\n ): Location {\n let location = createLocation(\n entries ? getCurrentLocation().pathname : \"/\",\n to,\n state,\n key\n );\n warning(\n location.pathname.charAt(0) === \"/\",\n `relative pathnames are not supported in memory history: ${JSON.stringify(\n to\n )}`\n );\n return location;\n }\n\n function createHref(to: To) {\n return typeof to === \"string\" ? to : createPath(to);\n }\n\n let history: MemoryHistory = {\n get index() {\n return index;\n },\n get action() {\n return action;\n },\n get location() {\n return getCurrentLocation();\n },\n createHref,\n createURL(to) {\n return new URL(createHref(to), \"http://localhost\");\n },\n encodeLocation(to: To) {\n let path = typeof to === \"string\" ? parsePath(to) : to;\n return {\n pathname: path.pathname || \"\",\n search: path.search || \"\",\n hash: path.hash || \"\",\n };\n },\n push(to, state) {\n action = Action.Push;\n let nextLocation = createMemoryLocation(to, state);\n index += 1;\n entries.splice(index, entries.length, nextLocation);\n if (v5Compat && listener) {\n listener({ action, location: nextLocation, delta: 1 });\n }\n },\n replace(to, state) {\n action = Action.Replace;\n let nextLocation = createMemoryLocation(to, state);\n entries[index] = nextLocation;\n if (v5Compat && listener) {\n listener({ action, location: nextLocation, delta: 0 });\n }\n },\n go(delta) {\n action = Action.Pop;\n let nextIndex = clampIndex(index + delta);\n let nextLocation = entries[nextIndex];\n index = nextIndex;\n if (listener) {\n listener({ action, location: nextLocation, delta });\n }\n },\n listen(fn: Listener) {\n listener = fn;\n return () => {\n listener = null;\n };\n },\n };\n\n return history;\n}\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Browser History\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * A browser history stores the current location in regular URLs in a web\n * browser environment. This is the standard for most web apps and provides the\n * cleanest URLs the browser's address bar.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#browserhistory\n */\nexport interface BrowserHistory extends UrlHistory {}\n\nexport type BrowserHistoryOptions = UrlHistoryOptions;\n\n/**\n * Browser history stores the location in regular URLs. This is the standard for\n * most web apps, but it requires some configuration on the server to ensure you\n * serve the same app at multiple URLs.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#createbrowserhistory\n */\nexport function createBrowserHistory(\n options: BrowserHistoryOptions = {}\n): BrowserHistory {\n function createBrowserLocation(\n window: Window,\n globalHistory: Window[\"history\"]\n ) {\n let { pathname, search, hash } = window.location;\n return createLocation(\n \"\",\n { pathname, search, hash },\n // state defaults to `null` because `window.history.state` does\n (globalHistory.state && globalHistory.state.usr) || null,\n (globalHistory.state && globalHistory.state.key) || \"default\"\n );\n }\n\n function createBrowserHref(window: Window, to: To) {\n return typeof to === \"string\" ? to : createPath(to);\n }\n\n return getUrlBasedHistory(\n createBrowserLocation,\n createBrowserHref,\n null,\n options\n );\n}\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Hash History\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * A hash history stores the current location in the fragment identifier portion\n * of the URL in a web browser environment.\n *\n * This is ideal for apps that do not control the server for some reason\n * (because the fragment identifier is never sent to the server), including some\n * shared hosting environments that do not provide fine-grained controls over\n * which pages are served at which URLs.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#hashhistory\n */\nexport interface HashHistory extends UrlHistory {}\n\nexport type HashHistoryOptions = UrlHistoryOptions;\n\n/**\n * Hash history stores the location in window.location.hash. This makes it ideal\n * for situations where you don't want to send the location to the server for\n * some reason, either because you do cannot configure it or the URL space is\n * reserved for something else.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#createhashhistory\n */\nexport function createHashHistory(\n options: HashHistoryOptions = {}\n): HashHistory {\n function createHashLocation(\n window: Window,\n globalHistory: Window[\"history\"]\n ) {\n let {\n pathname = \"/\",\n search = \"\",\n hash = \"\",\n } = parsePath(window.location.hash.substr(1));\n\n // Hash URL should always have a leading / just like window.location.pathname\n // does, so if an app ends up at a route like /#something then we add a\n // leading slash so all of our path-matching behaves the same as if it would\n // in a browser router. This is particularly important when there exists a\n // root splat route (<Route path=\"*\">) since that matches internally against\n // \"/*\" and we'd expect /#something to 404 in a hash router app.\n if (!pathname.startsWith(\"/\") && !pathname.startsWith(\".\")) {\n pathname = \"/\" + pathname;\n }\n\n return createLocation(\n \"\",\n { pathname, search, hash },\n // state defaults to `null` because `window.history.state` does\n (globalHistory.state && globalHistory.state.usr) || null,\n (globalHistory.state && globalHistory.state.key) || \"default\"\n );\n }\n\n function createHashHref(window: Window, to: To) {\n let base = window.document.querySelector(\"base\");\n let href = \"\";\n\n if (base && base.getAttribute(\"href\")) {\n let url = window.location.href;\n let hashIndex = url.indexOf(\"#\");\n href = hashIndex === -1 ? url : url.slice(0, hashIndex);\n }\n\n return href + \"#\" + (typeof to === \"string\" ? to : createPath(to));\n }\n\n function validateHashLocation(location: Location, to: To) {\n warning(\n location.pathname.charAt(0) === \"/\",\n `relative pathnames are not supported in hash history.push(${JSON.stringify(\n to\n )})`\n );\n }\n\n return getUrlBasedHistory(\n createHashLocation,\n createHashHref,\n validateHashLocation,\n options\n );\n}\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region UTILS\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * @private\n */\nexport function invariant(value: boolean, message?: string): asserts value;\nexport function invariant<T>(\n value: T | null | undefined,\n message?: string\n): asserts value is T;\nexport function invariant(value: any, message?: string) {\n if (value === false || value === null || typeof value === \"undefined\") {\n throw new Error(message);\n }\n}\n\nexport function warning(cond: any, message: string) {\n if (!cond) {\n // eslint-disable-next-line no-console\n if (typeof console !== \"undefined\") console.warn(message);\n\n try {\n // Welcome to debugging history!\n //\n // This error is thrown as a convenience, so you can more easily\n // find the source for a warning that appears in the console by\n // enabling \"pause on exceptions\" in your JavaScript debugger.\n throw new Error(message);\n // eslint-disable-next-line no-empty\n } catch (e) {}\n }\n}\n\nfunction createKey() {\n return Math.random().toString(36).substr(2, 8);\n}\n\n/**\n * For browser-based histories, we combine the state and key into an object\n */\nfunction getHistoryState(location: Location, index: number): HistoryState {\n return {\n usr: location.state,\n key: location.key,\n idx: index,\n };\n}\n\n/**\n * Creates a Location object with a unique key from the given Path\n */\nexport function createLocation(\n current: string | Location,\n to: To,\n state: any = null,\n key?: string\n): Readonly<Location> {\n let location: Readonly<Location> = {\n pathname: typeof current === \"string\" ? current : current.pathname,\n search: \"\",\n hash: \"\",\n ...(typeof to === \"string\" ? parsePath(to) : to),\n state,\n // TODO: This could be cleaned up. push/replace should probably just take\n // full Locations now and avoid the need to run through this flow at all\n // But that's a pretty big refactor to the current test suite so going to\n // keep as is for the time being and just let any incoming keys take precedence\n key: (to && (to as Location).key) || key || createKey(),\n };\n return location;\n}\n\n/**\n * Creates a string URL path from the given pathname, search, and hash components.\n */\nexport function createPath({\n pathname = \"/\",\n search = \"\",\n hash = \"\",\n}: Partial<Path>) {\n if (search && search !== \"?\")\n pathname += search.charAt(0) === \"?\" ? search : \"?\" + search;\n if (hash && hash !== \"#\")\n pathname += hash.charAt(0) === \"#\" ? hash : \"#\" + hash;\n return pathname;\n}\n\n/**\n * Parses a string URL path into its separate pathname, search, and hash components.\n */\nexport function parsePath(path: string): Partial<Path> {\n let parsedPath: Partial<Path> = {};\n\n if (path) {\n let hashIndex = path.indexOf(\"#\");\n if (hashIndex >= 0) {\n parsedPath.hash = path.substr(hashIndex);\n path = path.substr(0, hashIndex);\n }\n\n let searchIndex = path.indexOf(\"?\");\n if (searchIndex >= 0) {\n parsedPath.search = path.substr(searchIndex);\n path = path.substr(0, searchIndex);\n }\n\n if (path) {\n parsedPath.pathname = path;\n }\n }\n\n return parsedPath;\n}\n\nexport interface UrlHistory extends History {}\n\nexport type UrlHistoryOptions = {\n window?: Window;\n v5Compat?: boolean;\n};\n\nfunction getUrlBasedHistory(\n getLocation: (window: Window, globalHistory: Window[\"history\"]) => Location,\n createHref: (window: Window, to: To) => string,\n validateLocation: ((location: Location, to: To) => void) | null,\n options: UrlHistoryOptions = {}\n): UrlHistory {\n let { window = document.defaultView!, v5Compat = false } = options;\n let globalHistory = window.history;\n let action = Action.Pop;\n let listener: Listener | null = null;\n\n let index = getIndex()!;\n // Index should only be null when we initialize. If not, it's because the\n // user called history.pushState or history.replaceState directly, in which\n // case we should log a warning as it will result in bugs.\n if (index == null) {\n index = 0;\n globalHistory.replaceState({ ...globalHistory.state, idx: index }, \"\");\n }\n\n function getIndex(): number {\n let state = globalHistory.state || { idx: null };\n return state.idx;\n }\n\n function handlePop() {\n action = Action.Pop;\n let nextIndex = getIndex();\n let delta = nextIndex == null ? null : nextIndex - index;\n index = nextIndex;\n if (listener) {\n listener({ action, location: history.location, delta });\n }\n }\n\n function push(to: To, state?: any) {\n action = Action.Push;\n let location = createLocation(history.location, to, state);\n if (validateLocation) validateLocation(location, to);\n\n index = getIndex() + 1;\n let historyState = getHistoryState(location, index);\n let url = history.createHref(location);\n\n // try...catch because iOS limits us to 100 pushState calls :/\n try {\n globalHistory.pushState(historyState, \"\", url);\n } catch (error) {\n // If the exception is because `state` can't be serialized, let that throw\n // outwards just like a replace call would so the dev knows the cause\n // https://html.spec.whatwg.org/multipage/nav-history-apis.html#shared-history-push/replace-state-steps\n // https://html.spec.whatwg.org/multipage/structured-data.html#structuredserializeinternal\n if (error instanceof DOMException && error.name === \"DataCloneError\") {\n throw error;\n }\n // They are going to lose state here, but there is no real\n // way to warn them about it since the page will refresh...\n window.location.assign(url);\n }\n\n if (v5Compat && listener) {\n listener({ action, location: history.location, delta: 1 });\n }\n }\n\n function replace(to: To, state?: any) {\n action = Action.Replace;\n let location = createLocation(history.location, to, state);\n if (validateLocation) validateLocation(location, to);\n\n index = getIndex();\n let historyState = getHistoryState(location, index);\n let url = history.createHref(location);\n globalHistory.replaceState(historyState, \"\", url);\n\n if (v5Compat && listener) {\n listener({ action, location: history.location, delta: 0 });\n }\n }\n\n function createURL(to: To): URL {\n // window.location.origin is \"null\" (the literal string value) in Firefox\n // under certain conditions, notably when serving from a local HTML file\n // See https://bugzilla.mozilla.org/show_bug.cgi?id=878297\n let base =\n window.location.origin !== \"null\"\n ? window.location.origin\n : window.location.href;\n\n let href = typeof to === \"string\" ? to : createPath(to);\n // Treating this as a full URL will strip any trailing spaces so we need to\n // pre-encode them since they might be part of a matching splat param from\n // an ancestor route\n href = href.replace(/ $/, \"%20\");\n invariant(\n base,\n `No window.location.(origin|href) available to create URL for href: ${href}`\n );\n return new URL(href, base);\n }\n\n let history: History = {\n get action() {\n return action;\n },\n get location() {\n return getLocation(window, globalHistory);\n },\n listen(fn: Listener) {\n if (listener) {\n throw new Error(\"A history only accepts one active listener\");\n }\n window.addEventListener(PopStateEventType, handlePop);\n listener = fn;\n\n return () => {\n window.removeEventListener(PopStateEventType, handlePop);\n listener = null;\n };\n },\n createHref(to) {\n return createHref(window, to);\n },\n createURL,\n encodeLocation(to) {\n // Encode a Location the same way window.location would\n let url = createURL(to);\n return {\n pathname: url.pathname,\n search: url.search,\n hash: url.hash,\n };\n },\n push,\n replace,\n go(n) {\n return globalHistory.go(n);\n },\n };\n\n return history;\n}\n\n//#endregion\n","import type { Location, Path, To } from \"./history\";\nimport { invariant, parsePath, warning } from \"./history\";\n\n/**\n * Map of routeId -> data returned from a loader/action/error\n */\nexport interface RouteData {\n [routeId: string]: any;\n}\n\nexport enum ResultType {\n data = \"data\",\n deferred = \"deferred\",\n redirect = \"redirect\",\n error = \"error\",\n}\n\n/**\n * Successful result from a loader or action\n */\nexport interface SuccessResult {\n type: ResultType.data;\n data: unknown;\n statusCode?: number;\n headers?: Headers;\n}\n\n/**\n * Successful defer() result from a loader or action\n */\nexport interface DeferredResult {\n type: ResultType.deferred;\n deferredData: DeferredData;\n statusCode?: number;\n headers?: Headers;\n}\n\n/**\n * Redirect result from a loader or action\n */\nexport interface RedirectResult {\n type: ResultType.redirect;\n // We keep the raw Response for redirects so we can return it verbatim\n response: Response;\n}\n\n/**\n * Unsuccessful result from a loader or action\n */\nexport interface ErrorResult {\n type: ResultType.error;\n error: unknown;\n statusCode?: number;\n headers?: Headers;\n}\n\n/**\n * Result from a loader or action - potentially successful or unsuccessful\n */\nexport type DataResult =\n | SuccessResult\n | DeferredResult\n | RedirectResult\n | ErrorResult;\n\ntype LowerCaseFormMethod = \"get\" | \"post\" | \"put\" | \"patch\" | \"delete\";\ntype UpperCaseFormMethod = Uppercase<LowerCaseFormMethod>;\n\n/**\n * Users can specify either lowercase or uppercase form methods on `<Form>`,\n * useSubmit(), `<fetcher.Form>`, etc.\n */\nexport type HTMLFormMethod = LowerCaseFormMethod | UpperCaseFormMethod;\n\n/**\n * Active navigation/fetcher form methods are exposed in lowercase on the\n * RouterState\n */\nexport type FormMethod = LowerCaseFormMethod;\nexport type MutationFormMethod = Exclude<FormMethod, \"get\">;\n\n/**\n * In v7, active navigation/fetcher form methods are exposed in uppercase on the\n * RouterState. This is to align with the normalization done via fetch().\n */\nexport type V7_FormMethod = UpperCaseFormMethod;\nexport type V7_MutationFormMethod = Exclude<V7_FormMethod, \"GET\">;\n\nexport type FormEncType =\n | \"application/x-www-form-urlencoded\"\n | \"multipart/form-data\"\n | \"application/json\"\n | \"text/plain\";\n\n// Thanks https://github.com/sindresorhus/type-fest!\ntype JsonObject = { [Key in string]: JsonValue } & {\n [Key in string]?: JsonValue | undefined;\n};\ntype JsonArray = JsonValue[] | readonly JsonValue[];\ntype JsonPrimitive = string | number | boolean | null;\ntype JsonValue = JsonPrimitive | JsonObject | JsonArray;\n\n/**\n * @private\n * Internal interface to pass around for action submissions, not intended for\n * external consumption\n */\nexport type Submission =\n | {\n formMethod: FormMethod | V7_FormMethod;\n formAction: string;\n formEncType: FormEncType;\n formData: FormData;\n json: undefined;\n text: undefined;\n }\n | {\n formMethod: FormMethod | V7_FormMethod;\n formAction: string;\n formEncType: FormEncType;\n formData: undefined;\n json: JsonValue;\n text: undefined;\n }\n | {\n formMethod: FormMethod | V7_FormMethod;\n formAction: string;\n formEncType: FormEncType;\n formData: undefined;\n json: undefined;\n text: string;\n };\n\n/**\n * @private\n * Arguments passed to route loader/action functions. Same for now but we keep\n * this as a private implementation detail in case they diverge in the future.\n */\ninterface DataFunctionArgs<Context> {\n request: Request;\n params: Params;\n context?: Context;\n}\n\n// TODO: (v7) Change the defaults from any to unknown in and remove Remix wrappers:\n// ActionFunction, ActionFunctionArgs, LoaderFunction, LoaderFunctionArgs\n// Also, make them a type alias instead of an interface\n\n/**\n * Arguments passed to loader functions\n */\nexport interface LoaderFunctionArgs<Context = any>\n extends DataFunctionArgs<Context> {}\n\n/**\n * Arguments passed to action functions\n */\nexport interface ActionFunctionArgs<Context = any>\n extends DataFunctionArgs<Context> {}\n\n/**\n * Loaders and actions can return anything except `undefined` (`null` is a\n * valid return value if there is no data to return). Responses are preferred\n * and will ease any future migration to Remix\n */\ntype DataFunctionValue = Response | NonNullable<unknown> | null;\n\ntype DataFunctionReturnValue = Promise<DataFunctionValue> | DataFunctionValue;\n\n/**\n * Route loader function signature\n */\nexport type LoaderFunction<Context = any> = {\n (\n args: LoaderFunctionArgs<Context>,\n handlerCtx?: unknown\n ): DataFunctionReturnValue;\n} & { hydrate?: boolean };\n\n/**\n * Route action function signature\n */\nexport interface ActionFunction<Context = any> {\n (\n args: ActionFunctionArgs<Context>,\n handlerCtx?: unknown\n ): DataFunctionReturnValue;\n}\n\n/**\n * Arguments passed to shouldRevalidate function\n */\nexport interface ShouldRevalidateFunctionArgs {\n currentUrl: URL;\n currentParams: AgnosticDataRouteMatch[\"params\"];\n nextUrl: URL;\n nextParams: AgnosticDataRouteMatch[\"params\"];\n formMethod?: Submission[\"formMethod\"];\n formAction?: Submission[\"formAction\"];\n formEncType?: Submission[\"formEncType\"];\n text?: Submission[\"text\"];\n formData?: Submission[\"formData\"];\n json?: Submission[\"json\"];\n actionStatus?: number;\n actionResult?: any;\n defaultShouldRevalidate: boolean;\n}\n\n/**\n * Route shouldRevalidate function signature. This runs after any submission\n * (navigation or fetcher), so we flatten the navigation/fetcher submission\n * onto the arguments. It shouldn't matter whether it came from a navigation\n * or a fetcher, what really matters is the URLs and the formData since loaders\n * have to re-run based on the data models that were potentially mutated.\n */\nexport interface ShouldRevalidateFunction {\n (args: ShouldRevalidateFunctionArgs): boolean;\n}\n\n/**\n * Function provided by the framework-aware layers to set `hasErrorBoundary`\n * from the framework-aware `errorElement` prop\n *\n * @deprecated Use `mapRouteProperties` instead\n */\nexport interface DetectErrorBoundaryFunction {\n (route: AgnosticRouteObject): boolean;\n}\n\nexport interface DataStrategyMatch\n extends AgnosticRouteMatch<string, AgnosticDataRouteObject> {\n shouldLoad: boolean;\n resolve: (\n handlerOverride?: (\n handler: (ctx?: unknown) => DataFunctionReturnValue\n ) => DataFunctionReturnValue\n ) => Promise<DataStrategyResult>;\n}\n\nexport interface DataStrategyFunctionArgs<Context = any>\n extends DataFunctionArgs<Context> {\n matches: DataStrategyMatch[];\n fetcherKey: string | null;\n}\n\n/**\n * Result from a loader or action called via dataStrategy\n */\nexport interface DataStrategyResult {\n type: \"data\" | \"error\";\n result: unknown; // data, Error, Response, DeferredData, DataWithResponseInit\n}\n\nexport interface DataStrategyFunction {\n (args: DataStrategyFunctionArgs): Promise<Record<string, DataStrategyResult>>;\n}\n\nexport type AgnosticPatchRoutesOnNavigationFunctionArgs<\n O extends AgnosticRouteObject = AgnosticRouteObject,\n M extends AgnosticRouteMatch = AgnosticRouteMatch\n> = {\n signal: AbortSignal;\n path: string;\n matches: M[];\n fetcherKey: string | undefined;\n patch: (routeId: string | null, children: O[]) => void;\n};\n\nexport type AgnosticPatchRoutesOnNavigationFunction<\n O extends AgnosticRouteObject = AgnosticRouteObject,\n M extends AgnosticRouteMatch = AgnosticRouteMatch\n> = (\n opts: AgnosticPatchRoutesOnNavigationFunctionArgs<O, M>\n) => void | Promise<void>;\n\n/**\n * Function provided by the framework-aware layers to set any framework-specific\n * properties from framework-agnostic properties\n */\nexport interface MapRoutePropertiesFunction {\n (route: AgnosticRouteObject): {\n hasErrorBoundary: boolean;\n } & Record<string, any>;\n}\n\n/**\n * Keys we cannot change from within a lazy() function. We spread all other keys\n * onto the route. Either they're meaningful to the router, or they'll get\n * ignored.\n */\nexport type ImmutableRouteKey =\n | \"lazy\"\n | \"caseSensitive\"\n | \"path\"\n | \"id\"\n | \"index\"\n | \"children\";\n\nexport const immutableRouteKeys = new Set<ImmutableRouteKey>([\n \"lazy\",\n \"caseSensitive\",\n \"path\",\n \"id\",\n \"index\",\n \"children\",\n]);\n\ntype RequireOne<T, Key = keyof T> = Exclude<\n {\n [K in keyof T]: K extends Key ? Omit<T, K> & Required<Pick<T, K>> : never;\n }[keyof T],\n undefined\n>;\n\n/**\n * lazy() function to load a route definition, which can add non-matching\n * related properties to a route\n */\nexport interface LazyRouteFunction<R extends AgnosticRouteObject> {\n (): Promise<RequireOne<Omit<R, ImmutableRouteKey>>>;\n}\n\n/**\n * Base RouteObject with common props shared by all types of routes\n */\ntype AgnosticBaseRouteObject = {\n caseSensitive?: boolean;\n path?: string;\n id?: string;\n loader?: LoaderFunction | boolean;\n action?: ActionFunction | boolean;\n hasErrorBoundary?: boolean;\n shouldRevalidate?: ShouldRevalidateFunction;\n handle?: any;\n lazy?: LazyRouteFunction<AgnosticBaseRouteObject>;\n};\n\n/**\n * Index routes must not have children\n */\nexport type AgnosticIndexRouteObject = AgnosticBaseRouteObject & {\n children?: undefined;\n index: true;\n};\n\n/**\n * Non-index routes may have children, but cannot have index\n */\nexport type AgnosticNonIndexRouteObject = AgnosticBaseRouteObject & {\n children?: AgnosticRouteObject[];\n index?: false;\n};\n\n/**\n * A route object represents a logical route, with (optionally) its child\n * routes organized in a tree-like structure.\n */\nexport type AgnosticRouteObject =\n | AgnosticIndexRouteObject\n | AgnosticNonIndexRouteObject;\n\nexport type AgnosticDataIndexRouteObject = AgnosticIndexRouteObject & {\n id: string;\n};\n\nexport type AgnosticDataNonIndexRouteObject = AgnosticNonIndexRouteObject & {\n children?: AgnosticDataRouteObject[];\n id: string;\n};\n\n/**\n * A data route object, which is just a RouteObject with a required unique ID\n */\nexport type AgnosticDataRouteObject =\n | AgnosticDataIndexRouteObject\n | AgnosticDataNonIndexRouteObject;\n\nexport type RouteManifest = Record<string, AgnosticDataRouteObject | undefined>;\n\n// Recursive helper for finding path parameters in the absence of wildcards\ntype _PathParam<Path extends string> =\n // split path into individual path segments\n Path extends `${infer L}/${infer R}`\n ? _PathParam<L> | _PathParam<R>\n : // find params after `:`\n Path extends `:${infer Param}`\n ? Param extends `${infer Optional}?`\n ? Optional\n : Param\n : // otherwise, there aren't any params present\n never;\n\n/**\n * Examples:\n * \"/a/b/*\" -> \"*\"\n * \":a\" -> \"a\"\n * \"/a/:b\" -> \"b\"\n * \"/a/blahblahblah:b\" -> \"b\"\n * \"/:a/:b\" -> \"a\" | \"b\"\n * \"/:a/b/:c/*\" -> \"a\" | \"c\" | \"*\"\n */\nexport type PathParam<Path extends string> =\n // check if path is just a wildcard\n Path extends \"*\" | \"/*\"\n ? \"*\"\n : // look for wildcard at the end of the path\n Path extends `${infer Rest}/*`\n ? \"*\" | _PathParam<Rest>\n : // look for params in the absence of wildcards\n _PathParam<Path>;\n\n// Attempt to parse the given string segment. If it fails, then just return the\n// plain string type as a default fallback. Otherwise, return the union of the\n// parsed string literals that were referenced as dynamic segments in the route.\nexport type ParamParseKey<Segment extends string> =\n // if you could not find path params, fallback to `string`\n [PathParam<Segment>] extends [never] ? string : PathParam<Segment>;\n\n/**\n * The parameters that were parsed from the URL path.\n */\nexport type Params<Key extends string = string> = {\n readonly [key in Key]: string | undefined;\n};\n\n/**\n * A RouteMatch contains info about how a route matched a URL.\n */\nexport interface AgnosticRouteMatch<\n ParamKey extends string = string,\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n> {\n /**\n * The names and values of dynamic parameters in the URL.\n */\n params: Params<ParamKey>;\n /**\n * The portion of the URL pathname that was matched.\n */\n pathname: string;\n /**\n * The portion of the URL pathname that was matched before child routes.\n */\n pathnameBase: string;\n /**\n * The route object that was used to match.\n */\n route: RouteObjectType;\n}\n\nexport interface AgnosticDataRouteMatch\n extends AgnosticRouteMatch<string, AgnosticDataRouteObject> {}\n\nfunction isIndexRoute(\n route: AgnosticRouteObject\n): route is AgnosticIndexRouteObject {\n return route.index === true;\n}\n\n// Walk the route tree generating unique IDs where necessary, so we are working\n// solely with AgnosticDataRouteObject's within the Router\nexport function convertRoutesToDataRoutes(\n routes: AgnosticRouteObject[],\n mapRouteProperties: MapRoutePropertiesFunction,\n parentPath: string[] = [],\n manifest: RouteManifest = {}\n): AgnosticDataRouteObject[] {\n return routes.map((route, index) => {\n let treePath = [...parentPath, String(index)];\n let id = typeof route.id === \"string\" ? route.id : treePath.join(\"-\");\n invariant(\n route.index !== true || !route.children,\n `Cannot specify children on an index route`\n );\n invariant(\n !manifest[id],\n `Found a route id collision on id \"${id}\". Route ` +\n \"id's must be globally unique within Data Router usages\"\n );\n\n if (isIndexRoute(route)) {\n let indexRoute: AgnosticDataIndexRouteObject = {\n ...route,\n ...mapRouteProperties(route),\n id,\n };\n manifest[id] = indexRoute;\n return indexRoute;\n } else {\n let pathOrLayoutRoute: AgnosticDataNonIndexRouteObject = {\n ...route,\n ...mapRouteProperties(route),\n id,\n children: undefined,\n };\n manifest[id] = pathOrLayoutRoute;\n\n if (route.children) {\n pathOrLayoutRoute.children = convertRoutesToDataRoutes(\n route.children,\n mapRouteProperties,\n treePath,\n manifest\n );\n }\n\n return pathOrLayoutRoute;\n }\n });\n}\n\n/**\n * Matches the given routes to a location and returns the match data.\n *\n * @see https://reactrouter.com/v6/utils/match-routes\n */\nexport function matchRoutes<\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n>(\n routes: RouteObjectType[],\n locationArg: Partial<Location> | string,\n basename = \"/\"\n): AgnosticRouteMatch<string, RouteObjectType>[] | null {\n return matchRoutesImpl(routes, locationArg, basename, false);\n}\n\nexport function matchRoutesImpl<\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n>(\n routes: RouteObjectType[],\n locationArg: Partial<Location> | string,\n basename: string,\n allowPartial: boolean\n): AgnosticRouteMatch<string, RouteObjectType>[] | null {\n let location =\n typeof locationArg === \"string\" ? parsePath(locationArg) : locationArg;\n\n let pathname = stripBasename(location.pathname || \"/\", basename);\n\n if (pathname == null) {\n return null;\n }\n\n let branches = flattenRoutes(routes);\n rankRouteBranches(branches);\n\n let matches = null;\n for (let i = 0; matches == null && i < branches.length; ++i) {\n // Incoming pathnames are generally encoded from either window.location\n // or from router.navigate, but we want to match against the unencoded\n // paths in the route definitions. Memory router locations won't be\n // encoded here but there also shouldn't be anything to decode so this\n // should be a safe operation. This avoids needing matchRoutes to be\n // history-aware.\n let decoded = decodePath(pathname);\n matches = matchRouteBranch<string, RouteObjectType>(\n branches[i],\n decoded,\n allowPartial\n );\n }\n\n return matches;\n}\n\nexport interface UIMatch<Data = unknown, Handle = unknown> {\n id: string;\n pathname: string;\n params: AgnosticRouteMatch[\"params\"];\n data: Data;\n handle: Handle;\n}\n\nexport function convertRouteMatchToUiMatch(\n match: AgnosticDataRouteMatch,\n loaderData: RouteData\n): UIMatch {\n let { route, pathname, params } = match;\n return {\n id: route.id,\n pathname,\n params,\n data: loaderData[route.id],\n handle: route.handle,\n };\n}\n\ninterface RouteMeta<\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n> {\n relativePath: string;\n caseSensitive: boolean;\n childrenIndex: number;\n route: RouteObjectType;\n}\n\ninterface RouteBranch<\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n> {\n path: string;\n score: number;\n routesMeta: RouteMeta<RouteObjectType>[];\n}\n\nfunction flattenRoutes<\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n>(\n routes: RouteObjectType[],\n branches: RouteBranch<RouteObjectType>[] = [],\n parentsMeta: RouteMeta<RouteObjectType>[] = [],\n parentPath = \"\"\n): RouteBranch<RouteObjectType>[] {\n let flattenRoute = (\n route: RouteObjectType,\n index: number,\n relativePath?: string\n ) => {\n let meta: RouteMeta<RouteObjectType> = {\n relativePath:\n relativePath === undefined ? route.path || \"\" : relativePath,\n caseSensitive: route.caseSensitive === true,\n childrenIndex: index,\n route,\n };\n\n if (meta.relativePath.startsWith(\"/\")) {\n invariant(\n meta.relativePath.startsWith(parentPath),\n `Absolute route path \"${meta.relativePath}\" nested under path ` +\n `\"${parentPath}\" is not valid. An absolute child route path ` +\n `must start with the combined path of all its parent routes.`\n );\n\n meta.relativePath = meta.relativePath.slice(parentPath.length);\n }\n\n let path = joinPaths([parentPath, meta.relativePath]);\n let routesMeta = parentsMeta.concat(meta);\n\n // Add the children before adding this route to the array, so we traverse the\n // route tree depth-first and child routes appear before their parents in\n // the \"flattened\" version.\n if (route.children && route.children.length > 0) {\n invariant(\n // Our types know better, but runtime JS may not!\n // @ts-expect-error\n route.index !== true,\n `Index routes must not have child routes. Please remove ` +\n `all child routes from route path \"${path}\".`\n );\n flattenRoutes(route.children, branches, routesMeta, path);\n }\n\n // Routes without a path shouldn't ever match by themselves unless they are\n // index routes, so don't add them to the list of possible branches.\n if (route.path == null && !route.index) {\n return;\n }\n\n branches.push({\n path,\n score: computeScore(path, route.index),\n routesMeta,\n });\n };\n routes.forEach((route, index) => {\n // coarse-grain check for optional params\n if (route.path === \"\" || !route.path?.includes(\"?\")) {\n flattenRoute(route, index);\n } else {\n for (let exploded of explodeOptionalSegments(route.path)) {\n flattenRoute(route, index, exploded);\n }\n }\n });\n\n return branches;\n}\n\n/**\n * Computes all combinations of optional path segments for a given path,\n * excluding combinations that are ambiguous and of lower priority.\n *\n * For example, `/one/:two?/three/:four?/:five?` explodes to:\n * - `/one/three`\n * - `/one/:two/three`\n * - `/one/three/:four`\n * - `/one/three/:five`\n * - `/one/:two/three/:four`\n * - `/one/:two/three/:five`\n * - `/one/three/:four/:five`\n * - `/one/:two/three/:four/:five`\n */\nfunction explodeOptionalSegments(path: string): string[] {\n let segments = path.split(\"/\");\n if (segments.length === 0) return [];\n\n let [first, ...rest] = segments;\n\n // Optional path segments are denoted by a trailing `?`\n let isOptional = first.endsWith(\"?\");\n // Compute the corresponding required segment: `foo?` -> `foo`\n let required = first.replace(/\\?$/, \"\");\n\n if (rest.length === 0) {\n // Intepret empty string as omitting an optional segment\n // `[\"one\", \"\", \"three\"]` corresponds to omitting `:two` from `/one/:two?/three` -> `/one/three`\n return isOptional ? [required, \"\"] : [required];\n }\n\n let restExploded = explodeOptionalSegments(rest.join(\"/\"));\n\n let result: string[] = [];\n\n // All child paths with the prefix. Do this for all children before the\n // optional version for all children, so we get consistent ordering where the\n // parent optional aspect is preferred as required. Otherwise, we can get\n // child sections interspersed where deeper optional segments are higher than\n // parent optional segments, where for example, /:two would explode _earlier_\n // then /:one. By always including the parent as required _for all children_\n // first, we avoid this issue\n result.push(\n ...restExploded.map((subpath) =>\n subpath === \"\" ? required : [required, subpath].join(\"/\")\n )\n );\n\n // Then, if this is an optional value, add all child versions without\n if (isOptional) {\n result.push(...restExploded);\n }\n\n // for absolute paths, ensure `/` instead of empty segment\n return result.map((exploded) =>\n path.startsWith(\"/\") && exploded === \"\" ? \"/\" : exploded\n );\n}\n\nfunction rankRouteBranches(branches: RouteBranch[]): void {\n branches.sort((a, b) =>\n a.score !== b.score\n ? b.score - a.score // Higher score first\n : compareIndexes(\n a.routesMeta.map((meta) => meta.childrenIndex),\n b.routesMeta.map((meta) => meta.childrenIndex)\n )\n );\n}\n\nconst paramRe = /^:[\\w-]+$/;\nconst dynamicSegmentValue = 3;\nconst indexRouteValue = 2;\nconst emptySegmentValue = 1;\nconst staticSegmentValue = 10;\nconst splatPenalty = -2;\nconst isSplat = (s: string) => s === \"*\";\n\nfunction computeScore(path: string, index: boolean | undefined): number {\n let segments = path.split(\"/\");\n let initialScore = segments.length;\n if (segments.some(isSplat)) {\n initialScore += splatPenalty;\n }\n\n if (index) {\n initialScore += indexRouteValue;\n }\n\n return segments\n .filter((s) => !isSplat(s))\n .reduce(\n (score, segment) =>\n score +\n (paramRe.test(segment)\n ? dynamicSegmentValue\n : segment === \"\"\n ? emptySegmentValue\n : staticSegmentValue),\n initialScore\n );\n}\n\nfunction compareIndexes(a: number[], b: number[]): number {\n let siblings =\n a.length === b.length && a.slice(0, -1).every((n, i) => n === b[i]);\n\n return siblings\n ? // If two routes are siblings, we should try to match the earlier sibling\n // first. This allows people to have fine-grained control over the matching\n // behavior by simply putting routes with identical paths in the order they\n // want them tried.\n a[a.length - 1] - b[b.length - 1]\n : // Otherwise, it doesn't really make sense to rank non-siblings by index,\n // so they sort equally.\n 0;\n}\n\nfunction matchRouteBranch<\n ParamKey extends string = string,\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n>(\n branch: RouteBranch<RouteObjectType>,\n pathname: string,\n allowPartial = false\n): AgnosticRouteMatch<ParamKey, RouteObjectType>[] | null {\n let { routesMeta } = branch;\n\n let matchedParams = {};\n let matchedPathname = \"/\";\n let matches: AgnosticRouteMatch<ParamKey, RouteObjectType>[] = [];\n for (let i = 0; i < routesMeta.length; ++i) {\n let meta = routesMeta[i];\n let end = i === routesMeta.length - 1;\n let remainingPathname =\n matchedPathname === \"/\"\n ? pathname\n : pathname.slice(matchedPathname.length) || \"/\";\n let match = matchPath(\n { path: meta.relativePath, caseSensitive: meta.caseSensitive, end },\n remainingPathname\n );\n\n let route = meta.route;\n\n if (\n !match &&\n end &&\n allowPartial &&\n !routesMeta[routesMeta.length - 1].route.index\n ) {\n match = matchPath(\n {\n path: meta.relativePath,\n caseSensitive: meta.caseSensitive,\n end: false,\n },\n remainingPathname\n );\n }\n\n if (!match) {\n return null;\n }\n\n Object.assign(matchedParams, match.params);\n\n matches.push({\n // TODO: Can this as be avoided?\n params: matchedParams as Params<ParamKey>,\n pathname: joinPaths([matchedPathname, match.pathname]),\n pathnameBase: normalizePathname(\n joinPaths([matchedPathname, match.pathnameBase])\n ),\n route,\n });\n\n if (match.pathnameBase !== \"/\") {\n matchedPathname = joinPaths([matchedPathname, match.pathnameBase]);\n }\n }\n\n return matches;\n}\n\n/**\n * Returns a path with params interpolated.\n *\n * @see https://reactrouter.com/v6/utils/generate-path\n */\nexport function generatePath<Path extends string>(\n originalPath: Path,\n params: {\n [key in PathParam<Path>]: string | null;\n } = {} as any\n): string {\n let path: string = originalPath;\n if (path.endsWith(\"*\") && path !== \"*\" && !path.endsWith(\"/*\")) {\n warning(\n false,\n `Route path \"${path}\" will be treated as if it were ` +\n `\"${path.replace(/\\*$/, \"/*\")}\" because the \\`*\\` character must ` +\n `always follow a \\`/\\` in the pattern. To get rid of this warning, ` +\n `please change the route path to \"${path.replace(/\\*$/, \"/*\")}\".`\n );\n path = path.replace(/\\*$/, \"/*\") as Path;\n }\n\n // ensure `/` is added at the beginning if the path is absolute\n const prefix = path.startsWith(\"/\") ? \"/\" : \"\";\n\n const stringify = (p: any) =>\n p == null ? \"\" : typeof p === \"string\" ? p : String(p);\n\n const segments = path\n .split(/\\/+/)\n .map((segment, index, array) => {\n const isLastSegment = index === array.length - 1;\n\n // only apply the splat if it's the last segment\n if (isLastSegment && segment === \"*\") {\n const star = \"*\" as PathParam<Path>;\n // Apply the splat\n return stringify(params[star]);\n }\n\n const keyMatch = segment.match(/^:([\\w-]+)(\\??)$/);\n if (keyMatch) {\n const [, key, optional] = keyMatch;\n let param = params[key as PathParam<Path>];\n invariant(optional === \"?\" || param != null, `Missing \":${key}\" param`);\n return stringify(param);\n }\n\n // Remove any optional markers from optional static segments\n return segment.replace(/\\?$/g, \"\");\n })\n // Remove empty segments\n .filter((segment) => !!segment);\n\n return prefix + segments.join(\"/\");\n}\n\n/**\n * A PathPattern is used to match on some portion of a URL pathname.\n */\nexport interface PathPattern<Path extends string = string> {\n /**\n * A string to match against a URL pathname. May contain `:id`-style segments\n * to indicate placeholders for dynamic parameters. May also end with `/*` to\n * indicate matching the rest of the URL pathname.\n */\n path: Path;\n /**\n * Should be `true` if the static portions of the `path` should be matched in\n * the same case.\n */\n caseSensitive?: boolean;\n /**\n * Should be `true` if this pattern should match the entire URL pathname.\n */\n end?: boolean;\n}\n\n/**\n * A PathMatch contains info about how a PathPattern matched on a URL pathname.\n */\nexport interface PathMatch<ParamKey extends string = string> {\n /**\n * The names and values of dynamic parameters in the URL.\n */\n params: Params<ParamKey>;\n /**\n * The portion of the URL pathname that was matched.\n */\n pathname: string;\n /**\n * The portion of the URL pathname that was matched before child routes.\n */\n pathnameBase: string;\n /**\n * The pattern that was used to match.\n */\n pattern: PathPattern;\n}\n\ntype Mutable<T> = {\n -readonly [P in keyof T]: T[P];\n};\n\n/**\n * Performs pattern matching on a URL pathname and returns information about\n * the match.\n *\n * @see https://reactrouter.com/v6/utils/match-path\n */\nexport function matchPath<\n ParamKey extends ParamParseKey<Path>,\n Path extends string\n>(\n pattern: PathPattern<Path> | Path,\n pathname: string\n): PathMatch<ParamKey> | null {\n if (typeof pattern === \"string\") {\n pattern = { path: pattern, caseSensitive: false, end: true };\n }\n\n let [matcher, compiledParams] = compilePath(\n pattern.path,\n pattern.caseSensitive,\n pattern.end\n );\n\n let match = pathname.match(matcher);\n if (!match) return null;\n\n let matchedPathname = match[0];\n let pathnameBase = matchedPathname.replace(/(.)\\/+$/, \"$1\");\n let captureGroups = match.slice(1);\n let params: Params = compiledParams.reduce<Mutable<Params>>(\n (memo, { paramName, isOptional }, index) => {\n // We need to compute the pathnameBase here using the raw splat value\n // instead of using params[\"*\"] later because it will be decoded then\n if (paramName === \"*\") {\n let splatValue = captureGroups[index] || \"\";\n pathnameBase = matchedPathname\n .slice(0, matchedPathname.length - splatValue.length)\n .replace(/(.)\\/+$/, \"$1\");\n }\n\n const value = captureGroups[index];\n if (isOptional && !value) {\n memo[paramName] = undefined;\n } else {\n memo[paramName] = (value || \"\").replace(/%2F/g, \"/\");\n }\n return memo;\n },\n {}\n );\n\n return {\n params,\n pathname: matchedPathname,\n pathnameBase,\n pattern,\n };\n}\n\ntype CompiledPathParam = { paramName: string; isOptional?: boolean };\n\nfunction compilePath(\n path: string,\n caseSensitive = false,\n end = true\n): [RegExp, CompiledPathParam[]] {\n warning(\n path === \"*\" || !path.endsWith(\"*\") || path.endsWith(\"/*\"),\n `Route path \"${path}\" will be treated as if it were ` +\n `\"${path.replace(/\\*$/, \"/*\")}\" because the \\`*\\` character must ` +\n `always follow a \\`/\\` in the pattern. To get rid of this warning, ` +\n `please change the route path to \"${path.replace(/\\*$/, \"/*\")}\".`\n );\n\n let params: CompiledPathParam[] = [];\n let regexpSource =\n \"^\" +\n path\n .replace(/\\/*\\*?$/, \"\") // Ignore trailing / and /*, we'll handle it below\n .replace(/^\\/*/, \"/\") // Make sure it has a leading /\n .replace(/[\\\\.*+^${}|()[\\]]/g, \"\\\\$&\") // Escape special regex chars\n .replace(\n /\\/:([\\w-]+)(\\?)?/g,\n (_: string, paramName: string, isOptional) => {\n params.push({ paramName, isOptional: isOptional != null });\n return isOptional ? \"/?([^\\\\/]+)?\" : \"/([^\\\\/]+)\";\n }\n );\n\n if (path.endsWith(\"*\")) {\n params.push({ paramName: \"*\" });\n regexpSource +=\n path === \"*\" || path === \"/*\"\n ? \"(.*)$\" // Already matched the initial /, just match the rest\n : \"(?:\\\\/(.+)|\\\\/*)$\"; // Don't include the / in params[\"*\"]\n } else if (end) {\n // When matching to the end, ignore trailing slashes\n regexpSource += \"\\\\/*$\";\n } else if (path !== \"\" && path !== \"/\") {\n // If our path is non-empty and contains anything beyond an initial slash,\n // then we have _some_ form of path in our regex, so we should expect to\n // match only if we find the end of this path segment. Look for an optional\n // non-captured trailing slash (to match a portion of the URL) or the end\n // of the path (if we've matched to the end). We used to do this with a\n // word boundary but that gives false positives on routes like\n // /user-preferences since `-` counts as a word boundary.\n regexpSource += \"(?:(?=\\\\/|$))\";\n } else {\n // Nothing to match for \"\" or \"/\"\n }\n\n let matcher = new RegExp(regexpSource, caseSensitive ? undefined : \"i\");\n\n return [matcher, params];\n}\n\nexport function decodePath(value: string) {\n try {\n return value\n .split(\"/\")\n .map((v) => decodeURIComponent(v).replace(/\\//g, \"%2F\"))\n .join(\"/\");\n } catch (error) {\n warning(\n false,\n `The URL path \"${value}\" could not be decoded because it is is a ` +\n `malformed URL segment. This is probably due to a bad percent ` +\n `encoding (${error}).`\n );\n\n return value;\n }\n}\n\n/**\n * @private\n */\nexport function stripBasename(\n pathname: string,\n basename: string\n): string | null {\n if (basename === \"/\") return pathname;\n\n if (!pathname.toLowerCase().startsWith(basename.toLowerCase())) {\n return null;\n }\n\n // We want to leave trailing slash behavior in the user's control, so if they\n // specify a basename with a trailing slash, we should support it\n let startIndex = basename.endsWith(\"/\")\n ? basename.length - 1\n : basename.length;\n let nextChar = pathname.charAt(startIndex);\n if (nextChar && nextChar !== \"/\") {\n // pathname does not start with basename/\n return null;\n }\n\n return pathname.slice(startIndex) || \"/\";\n}\n\n/**\n * Returns a resolved path object relative to the given pathname.\n *\n * @see https://reactrouter.com/v6/utils/resolve-path\n */\nexport function resolvePath(to: To, fromPathname = \"/\"): Path {\n let {\n pathname: toPathname,\n search = \"\",\n hash = \"\",\n } = typeof to === \"string\" ? parsePath(to) : to;\n\n let pathname = toPathname\n ? toPathname.startsWith(\"/\")\n ? toPathname\n : resolvePathname(toPathname, fromPathname)\n : fromPathname;\n\n return {\n pathname,\n search: normalizeSearch(search),\n hash: normalizeHash(hash),\n };\n}\n\nfunction resolvePathname(relativePath: string, fromPathname: string): string {\n let segments = fromPathname.replace(/\\/+$/, \"\").split(\"/\");\n let relativeSegments = relativePath.split(\"/\");\n\n relativeSegments.forEach((segment) => {\n if (segment === \"..\") {\n // Keep the root \"\" segment so the pathname starts at /\n if (segments.length > 1) segments.pop();\n } else if (segment !== \".\") {\n segments.push(segment);\n }\n });\n\n return segments.length > 1 ? segments.join(\"/\") : \"/\";\n}\n\nfunction getInvalidPathError(\n char: string,\n field: string,\n dest: string,\n path: Partial<Path>\n) {\n return (\n `Cannot include a '${char}' character in a manually specified ` +\n `\\`to.${field}\\` field [${JSON.stringify(\n path\n )}]. Please separate it out to the ` +\n `\\`to.${dest}\\` field. Alternatively you may provide the full path as ` +\n `a string in <Link to=\"...\"> and the router will parse it for you.`\n );\n}\n\n/**\n * @private\n *\n * When processing relative navigation we want to ignore ancestor routes that\n * do not contribute to the path, such that index/pathless layout routes don't\n * interfere.\n *\n * For example, when moving a route element into an index route and/or a\n * pathless layout route, relative link behavior contained within should stay\n * the same. Both of the following examples should link back to the root:\n *\n * <Route path=\"/\">\n * <Route path=\"accounts\" element={<Link to=\"..\"}>\n * </Route>\n *\n * <Route path=\"/\">\n * <Route path=\"accounts\">\n * <Route element={<AccountsLayout />}> // <-- Does not contribute\n * <Route index element={<Link to=\"..\"} /> // <-- Does not contribute\n * </Route\n * </Route>\n * </Route>\n */\nexport function getPathContributingMatches<\n T extends AgnosticRouteMatch = AgnosticRouteMatch\n>(matches: T[]) {\n return matches.filter(\n (match, index) =>\n index === 0 || (match.route.path && match.route.path.length > 0)\n );\n}\n\n// Return the array of pathnames for the current route matches - used to\n// generate the routePathnames input for resolveTo()\nexport function getResolveToMatches<\n T extends AgnosticRouteMatch = AgnosticRouteMatch\n>(matches: T[], v7_relativeSplatPath: boolean) {\n let pathMatches = getPathContributingMatches(matches);\n\n // When v7_relativeSplatPath is enabled, use the full pathname for the leaf\n // match so we include splat values for \".\" links. See:\n // https://github.com/remix-run/react-router/issues/11052#issuecomment-1836589329\n if (v7_relativeSplatPath) {\n return pathMatches.map((match, idx) =>\n idx === pathMatches.length - 1 ? match.pathname : match.pathnameBase\n );\n }\n\n return pathMatches.map((match) => match.pathnameBase);\n}\n\n/**\n * @private\n */\nexport function resolveTo(\n toArg: To,\n routePathnames: string[],\n locationPathname: string,\n isPathRelative = false\n): Path {\n let to: Partial<Path>;\n if (typeof toArg === \"string\") {\n to = parsePath(toArg);\n } else {\n to = { ...toArg };\n\n invariant(\n !to.pathname || !to.pathname.includes(\"?\"),\n getInvalidPathError(\"?\", \"pathname\", \"search\", to)\n );\n invariant(\n !to.pathname || !to.pathname.includes(\"#\"),\n getInvalidPathError(\"#\", \"pathname\", \"hash\", to)\n );\n invariant(\n !to.search || !to.search.includes(\"#\"),\n getInvalidPathError(\"#\", \"search\", \"hash\", to)\n );\n }\n\n let isEmptyPath = toArg === \"\" || to.pathname === \"\";\n let toPathname = isEmptyPath ? \"/\" : to.pathname;\n\n let from: string;\n\n // Routing is relative to the current pathname if explicitly requested.\n //\n // If a pathname is explicitly provided in `to`, it should be relative to the\n // route context. This is explained in `Note on `<Link to>` values` in our\n // migration guide from v5 as a means of disambiguation between `to` values\n // that begin with `/` and those that do not. However, this is problematic for\n // `to` values that do not provide a pathname. `to` can simply be a search or\n // hash string, in which case we should assume that the navigation is relative\n // to the current location's pathname and *not* the route pathname.\n if (toPathname == null) {\n from = locationPathname;\n } else {\n let routePathnameIndex = routePathnames.length - 1;\n\n // With relative=\"route\" (the default), each leading .. segment means\n // \"go up one route\" instead of \"go up one URL segment\". This is a key\n // difference from how <a href> works and a major reason we call this a\n // \"to\" value instead of a \"href\".\n if (!isPathRelative && toPathname.startsWith(\"..\")) {\n let toSegments = toPathname.split(\"/\");\n\n while (toSegments[0] === \"..\") {\n toSegments.shift();\n routePathnameIndex -= 1;\n }\n\n to.pathname = toSegments.join(\"/\");\n }\n\n from = routePathnameIndex >= 0 ? routePathnames[routePathnameIndex] : \"/\";\n }\n\n let path = resolvePath(to, from);\n\n // Ensure the pathname has a trailing slash if the original \"to\" had one\n let hasExplicitTrailingSlash =\n toPathname && toPathname !== \"/\" && toPathname.endsWith(\"/\");\n // Or if this was a link to the current path which has a trailing slash\n let hasCurrentTrailingSlash =\n (isEmptyPath || toPathname === \".\") && locationPathname.endsWith(\"/\");\n if (\n !path.pathname.endsWith(\"/\") &&\n (hasExplicitTrailingSlash || hasCurrentTrailingSlash)\n ) {\n path.pathname += \"/\";\n }\n\n return path;\n}\n\n/**\n * @private\n */\nexport function getToPathname(to: To): string | undefined {\n // Empty strings should be treated the same as / paths\n return to === \"\" || (to as Path).pathname === \"\"\n ? \"/\"\n : typeof to === \"string\"\n ? parsePath(to).pathname\n : to.pathname;\n}\n\n/**\n * @private\n */\nexport const joinPaths = (paths: string[]): string =>\n paths.join(\"/\").replace(/\\/\\/+/g, \"/\");\n\n/**\n * @private\n */\nexport const normalizePathname = (pathname: string): string =>\n pathname.replace(/\\/+$/, \"\").replace(/^\\/*/, \"/\");\n\n/**\n * @private\n */\nexport const normalizeSearch = (search: string): string =>\n !search || search === \"?\"\n ? \"\"\n : search.startsWith(\"?\")\n ? search\n : \"?\" + search;\n\n/**\n * @private\n */\nexport const normalizeHash = (hash: string): string =>\n !hash || hash === \"#\" ? \"\" : hash.startsWith(\"#\") ? hash : \"#\" + hash;\n\nexport type JsonFunction = <Data>(\n data: Data,\n init?: number | ResponseInit\n) => Response;\n\n/**\n * This is a shortcut for creating `application/json` responses. Converts `data`\n * to JSON and sets the `Content-Type` header.\n *\n * @deprecated The `json` method is deprecated in favor of returning raw objects.\n * This method will be removed in v7.\n */\nexport const json: JsonFunction = (data, init = {}) => {\n let responseInit = typeof init === \"number\" ? { status: init } : init;\n\n let headers = new Headers(responseInit.headers);\n if (!headers.has(\"Content-Type\")) {\n headers.set(\"Content-Type\", \"application/json; charset=utf-8\");\n }\n\n return new Response(JSON.stringify(data), {\n ...responseInit,\n headers,\n });\n};\n\nexport class DataWithResponseInit<D> {\n type: string = \"DataWithResponseInit\";\n data: D;\n init: ResponseInit | null;\n\n constructor(data: D, init?: ResponseInit) {\n this.data = data;\n this.init = init || null;\n }\n}\n\n/**\n * Create \"responses\" that contain `status`/`headers` without forcing\n * serialization into an actual `Response` - used by Remix single fetch\n */\nexport function data<D>(data: D, init?: number | ResponseInit) {\n return new DataWithResponseInit(\n data,\n typeof init === \"number\" ? { status: init } : init\n );\n}\n\nexport interface TrackedPromise extends Promise<any> {\n _tracked?: boolean;\n _data?: any;\n _error?: any;\n}\n\nexport class AbortedDeferredError extends Error {}\n\nexport class DeferredData {\n private pendingKeysSet: Set<string> = new Set<string>();\n private controller: AbortController;\n private abortPromise: Promise<void>;\n private unlistenAbortSignal: () => void;\n private subscribers: Set<(aborted: boolean, settledKey?: string) => void> =\n new Set();\n data: Record<string, unknown>;\n init?: ResponseInit;\n deferredKeys: string[] = [];\n\n constructor(data: Record<string, unknown>, responseInit?: ResponseInit) {\n invariant(\n data && typeof data === \"object\" && !Array.isArray(data),\n \"defer() only accepts plain objects\"\n );\n\n // Set up an AbortController + Promise we can race against to exit early\n // cancellation\n let reject: (e: AbortedDeferredError) => void;\n this.abortPromise = new Promise((_, r) => (reject = r));\n this.controller = new AbortController();\n let onAbort = () =>\n reject(new AbortedDeferredError(\"Deferred data aborted\"));\n this.unlistenAbortSignal = () =>\n this.controller.signal.removeEventListener(\"abort\", onAbort);\n this.controller.signal.addEventListener(\"abort\", onAbort);\n\n this.data = Object.entries(data).reduce(\n (acc, [key, value]) =>\n Object.assign(acc, {\n [key]: this.trackPromise(key, value),\n }),\n {}\n );\n\n if (this.done) {\n // All incoming values were resolved\n this.unlistenAbortSignal();\n }\n\n this.init = responseInit;\n }\n\n private trackPromise(\n key: string,\n value: Promise<unknown> | unknown\n ): TrackedPromise | unknown {\n if (!(value instanceof Promise)) {\n return value;\n }\n\n this.deferredKeys.push(key);\n this.pendingKeysSet.add(key);\n\n // We store a little wrapper promise that will be extended with\n // _data/_error props upon resolve/reject\n let promise: TrackedPromise = Promise.race([value, this.abortPromise]).then(\n (data) => this.onSettle(promise, key, undefined, data as unknown),\n (error) => this.onSettle(promise, key, error as unknown)\n );\n\n // Register rejection listeners to avoid uncaught promise rejections on\n // errors or aborted deferred values\n promise.catch(() => {});\n\n Object.defineProperty(promise, \"_tracked\", { get: () => true });\n return promise;\n }\n\n private onSettle(\n promise: TrackedPromise,\n key: string,\n error: unknown,\n data?: unknown\n ): unknown {\n if (\n this.controller.signal.aborted &&\n error instanceof AbortedDeferredError\n ) {\n this.unlistenAbortSignal();\n Object.defineProperty(promise, \"_error\", { get: () => error });\n return Promise.reject(error);\n }\n\n this.pendingKeysSet.delete(key);\n\n if (this.done) {\n // Nothing left to abort!\n this.unlistenAbortSignal();\n }\n\n // If the promise was resolved/rejected with undefined, we'll throw an error as you\n // should always resolve with a value or null\n if (error === undefined && data === undefined) {\n let undefinedError = new Error(\n `Deferred data for key \"${key}\" resolved/rejected with \\`undefined\\`, ` +\n `you must resolve/reject with a value or \\`null\\`.`\n );\n Object.defineProperty(promise, \"_error\", { get: () => undefinedError });\n this.emit(false, key);\n return Promise.reject(undefinedError);\n }\n\n if (data === undefined) {\n Object.defineProperty(promise, \"_error\", { get: () => error });\n this.emit(false, key);\n return Promise.reject(error);\n }\n\n Object.defineProperty(promise, \"_data\", { get: () => data });\n this.emit(false, key);\n return data;\n }\n\n private emit(aborted: boolean, settledKey?: string) {\n this.subscribers.forEach((subscriber) => subscriber(aborted, settledKey));\n }\n\n subscribe(fn: (aborted: boolean, settledKey?: string) => void) {\n this.subscribers.add(fn);\n return () => this.subscribers.delete(fn);\n }\n\n cancel() {\n this.controller.abort();\n this.pendingKeysSet.forEach((v, k) => this.pendingKeysSet.delete(k));\n this.emit(true);\n }\n\n async resolveData(signal: AbortSignal) {\n let aborted = false;\n if (!this.done) {\n let onAbort = () => this.cancel();\n signal.addEventListener(\"abort\", onAbort);\n aborted = await new Promise((resolve) => {\n this.subscribe((aborted) => {\n signal.removeEventListener(\"abort\", onAbort);\n if (aborted || this.done) {\n resolve(aborted);\n }\n });\n });\n }\n return aborted;\n }\n\n get done() {\n return this.pendingKeysSet.size === 0;\n }\n\n get unwrappedData() {\n invariant(\n this.data !== null && this.done,\n \"Can only unwrap data on initialized and settled deferreds\"\n );\n\n return Object.entries(this.data).reduce(\n (acc, [key, value]) =>\n Object.assign(acc, {\n [key]: unwrapTrackedPromise(value),\n }),\n {}\n );\n }\n\n get pendingKeys() {\n return Array.from(this.pendingKeysSet);\n }\n}\n\nfunction isTrackedPromise(value: any): value is TrackedPromise {\n return (\n value instanceof Promise && (value as TrackedPromise)._tracked === true\n );\n}\n\nfunction unwrapTrackedPromise(value: any) {\n if (!isTrackedPromise(value)) {\n return value;\n }\n\n if (value._error) {\n throw value._error;\n }\n return value._data;\n}\n\nexport type DeferFunction = (\n data: Record<string, unknown>,\n init?: number | ResponseInit\n) => DeferredData;\n\n/**\n * @deprecated The `defer` method is deprecated in favor of returning raw\n * objects. This method will be removed in v7.\n */\nexport const defer: DeferFunction = (data, init = {}) => {\n let responseInit = typeof init === \"number\" ? { status: init } : init;\n\n return new DeferredData(data, responseInit);\n};\n\nexport type RedirectFunction = (\n url: string,\n init?: number | ResponseInit\n) => Response;\n\n/**\n * A redirect response. Sets the status code and the `Location` header.\n * Defaults to \"302 Found\".\n */\nexport const redirect: RedirectFunction = (url, init = 302) => {\n let responseInit = init;\n if (typeof responseInit === \"number\") {\n responseInit = { status: responseInit };\n } else if (typeof responseInit.status === \"undefined\") {\n responseInit.status = 302;\n }\n\n let headers = new Headers(responseInit.headers);\n headers.set(\"Location\", url);\n\n return new Response(null, {\n ...responseInit,\n headers,\n });\n};\n\n/**\n * A redirect response that will force a document reload to the new location.\n * Sets the status code and the `Location` header.\n * Defaults to \"302 Found\".\n */\nexport const redirectDocument: RedirectFunction = (url, init) => {\n let response = redirect(url, init);\n response.headers.set(\"X-Remix-Reload-Document\", \"true\");\n return response;\n};\n\n/**\n * A redirect response that will perform a `history.replaceState` instead of a\n * `history.pushState` for client-side navigation redirects.\n * Sets the status code and the `Location` header.\n * Defaults to \"302 Found\".\n */\nexport const replace: RedirectFunction = (url, init) => {\n let response = redirect(url, init);\n response.headers.set(\"X-Remix-Replace\", \"true\");\n return response;\n};\n\nexport type ErrorResponse = {\n status: number;\n statusText: string;\n data: any;\n};\n\n/**\n * @private\n * Utility class we use to hold auto-unwrapped 4xx/5xx Response bodies\n *\n * We don't export the class for public use since it's an implementation\n * detail, but we export the interface above so folks can build their own\n * abstractions around instances via isRouteErrorResponse()\n */\nexport class ErrorResponseImpl implements ErrorResponse {\n status: number;\n statusText: string;\n data: any;\n private error?: Error;\n private internal: boolean;\n\n constructor(\n status: number,\n statusText: string | undefined,\n data: any,\n internal = false\n ) {\n this.status = status;\n this.statusText = statusText || \"\";\n this.internal = internal;\n if (data instanceof Error) {\n this.data = data.toString();\n this.error = data;\n } else {\n this.data = data;\n }\n }\n}\n\n/**\n * Check if the given error is an ErrorResponse generated from a 4xx/5xx\n * Response thrown from an action/loader\n */\nexport function isRouteErrorResponse(error: any): error is ErrorResponse {\n return (\n error != null &&\n typeof error.status === \"number\" &&\n typeof error.statusText === \"string\" &&\n typeof error.internal === \"boolean\" &&\n \"data\" in error\n );\n}\n","import type { History, Location, Path, To } from \"./history\";\nimport {\n Action as HistoryAction,\n createLocation,\n createPath,\n invariant,\n parsePath,\n warning,\n} from \"./history\";\nimport type {\n AgnosticDataRouteMatch,\n AgnosticDataRouteObject,\n DataStrategyMatch,\n AgnosticRouteObject,\n DataResult,\n DataStrategyFunction,\n DataStrategyFunctionArgs,\n DeferredData,\n DeferredResult,\n DetectErrorBoundaryFunction,\n ErrorResult,\n FormEncType,\n FormMethod,\n HTMLFormMethod,\n DataStrategyResult,\n ImmutableRouteKey,\n MapRoutePropertiesFunction,\n MutationFormMethod,\n RedirectResult,\n RouteData,\n RouteManifest,\n ShouldRevalidateFunctionArgs,\n Submission,\n SuccessResult,\n UIMatch,\n V7_FormMethod,\n V7_MutationFormMethod,\n AgnosticPatchRoutesOnNavigationFunction,\n DataWithResponseInit,\n} from \"./utils\";\nimport {\n ErrorResponseImpl,\n ResultType,\n convertRouteMatchToUiMatch,\n convertRoutesToDataRoutes,\n getPathContributingMatches,\n getResolveToMatches,\n immutableRouteKeys,\n isRouteErrorResponse,\n joinPaths,\n matchRoutes,\n matchRoutesImpl,\n resolveTo,\n stripBasename,\n} from \"./utils\";\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Types and Constants\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * A Router instance manages all navigation and data loading/mutations\n */\nexport interface Router {\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Return the basename for the router\n */\n get basename(): RouterInit[\"basename\"];\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Return the future config for the router\n */\n get future(): FutureConfig;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Return the current state of the router\n */\n get state(): RouterState;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Return the routes for this router instance\n */\n get routes(): AgnosticDataRouteObject[];\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Return the window associated with the router\n */\n get window(): RouterInit[\"window\"];\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Initialize the router, including adding history listeners and kicking off\n * initial data fetches. Returns a function to cleanup listeners and abort\n * any in-progress loads\n */\n initialize(): Router;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Subscribe to router.state updates\n *\n * @param fn function to call with the new state\n */\n subscribe(fn: RouterSubscriber): () => void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Enable scroll restoration behavior in the router\n *\n * @param savedScrollPositions Object that will manage positions, in case\n * it's being restored from sessionStorage\n * @param getScrollPosition Function to get the active Y scroll position\n * @param getKey Function to get the key to use for restoration\n */\n enableScrollRestoration(\n savedScrollPositions: Record<string, number>,\n getScrollPosition: GetScrollPositionFunction,\n getKey?: GetScrollRestorationKeyFunction\n ): () => void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Navigate forward/backward in the history stack\n * @param to Delta to move in the history stack\n */\n navigate(to: number): Promise<void>;\n\n /**\n * Navigate to the given path\n * @param to Path to navigate to\n * @param opts Navigation options (method, submission, etc.)\n */\n navigate(to: To | null, opts?: RouterNavigateOptions): Promise<void>;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Trigger a fetcher load/submission\n *\n * @param key Fetcher key\n * @param routeId Route that owns the fetcher\n * @param href href to fetch\n * @param opts Fetcher options, (method, submission, etc.)\n */\n fetch(\n key: string,\n routeId: string,\n href: string | null,\n opts?: RouterFetchOptions\n ): void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Trigger a revalidation of all current route loaders and fetcher loads\n */\n revalidate(): void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Utility function to create an href for the given location\n * @param location\n */\n createHref(location: Location | URL): string;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Utility function to URL encode a destination path according to the internal\n * history implementation\n * @param to\n */\n encodeLocation(to: To): Path;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Get/create a fetcher for the given key\n * @param key\n */\n getFetcher<TData = any>(key: string): Fetcher<TData>;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Delete the fetcher for a given key\n * @param key\n */\n deleteFetcher(key: string): void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Cleanup listeners and abort any in-progress loads\n */\n dispose(): void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Get a navigation blocker\n * @param key The identifier for the blocker\n * @param fn The blocker function implementation\n */\n getBlocker(key: string, fn: BlockerFunction): Blocker;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Delete a navigation blocker\n * @param key The identifier for the blocker\n */\n deleteBlocker(key: string): void;\n\n /**\n * @internal\n * PRIVATE DO NOT USE\n *\n * Patch additional children routes into an existing parent route\n * @param routeId The parent route id or a callback function accepting `patch`\n * to perform batch patching\n * @param children The additional children routes\n */\n patchRoutes(routeId: string | null, children: AgnosticRouteObject[]): void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * HMR needs to pass in-flight route updates to React Router\n * TODO: Replace this with granular route update APIs (addRoute, updateRoute, deleteRoute)\n */\n _internalSetRoutes(routes: AgnosticRouteObject[]): void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Internal fetch AbortControllers accessed by unit tests\n */\n _internalFetchControllers: Map<string, AbortController>;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Internal pending DeferredData instances accessed by unit tests\n */\n _internalActiveDeferreds: Map<string, DeferredData>;\n}\n\n/**\n * State maintained internally by the router. During a navigation, all states\n * reflect the the \"old\" location unless otherwise noted.\n */\nexport interface RouterState {\n /**\n * The action of the most recent navigation\n */\n historyAction: HistoryAction;\n\n /**\n * The current location reflected by the router\n */\n location: Location;\n\n /**\n * The current set of route matches\n */\n matches: AgnosticDataRouteMatch[];\n\n /**\n * Tracks whether we've completed our initial data load\n */\n initialized: boolean;\n\n /**\n * Current scroll position we should start at for a new view\n * - number -> scroll position to restore to\n * - false -> do not restore scroll at all (used during submissions)\n * - null -> don't have a saved position, scroll to hash or top of page\n */\n restoreScrollPosition: number | false | null;\n\n /**\n * Indicate whether this navigation should skip resetting the scroll position\n * if we are unable to restore the scroll position\n */\n preventScrollReset: boolean;\n\n /**\n * Tracks the state of the current navigation\n */\n navigation: Navigation;\n\n /**\n * Tracks any in-progress revalidations\n */\n revalidation: RevalidationState;\n\n /**\n * Data from the loaders for the current matches\n */\n loaderData: RouteData;\n\n /**\n * Data from the action for the current matches\n */\n actionData: RouteData | null;\n\n /**\n * Errors caught from loaders for the current matches\n */\n errors: RouteData | null;\n\n /**\n * Map of current fetchers\n */\n fetchers: Map<string, Fetcher>;\n\n /**\n * Map of current blockers\n */\n blockers: Map<string, Blocker>;\n}\n\n/**\n * Data that can be passed into hydrate a Router from SSR\n */\nexport type HydrationState = Partial<\n Pick<RouterState, \"loaderData\" | \"actionData\" | \"errors\">\n>;\n\n/**\n * Future flags to toggle new feature behavior\n */\nexport interface FutureConfig {\n v7_fetcherPersist: boolean;\n v7_normalizeFormMethod: boolean;\n v7_partialHydration: boolean;\n v7_prependBasename: boolean;\n v7_relativeSplatPath: boolean;\n v7_skipActionErrorRevalidation: boolean;\n}\n\n/**\n * Initialization options for createRouter\n */\nexport interface RouterInit {\n routes: AgnosticRouteObject[];\n history: History;\n basename?: string;\n /**\n * @deprecated Use `mapRouteProperties` instead\n */\n detectErrorBoundary?: DetectErrorBoundaryFunction;\n mapRouteProperties?: MapRoutePropertiesFunction;\n future?: Partial<FutureConfig>;\n hydrationData?: HydrationState;\n window?: Window;\n dataStrategy?: DataStrategyFunction;\n patchRoutesOnNavigation?: AgnosticPatchRoutesOnNavigationFunction;\n}\n\n/**\n * State returned from a server-side query() call\n */\nexport interface StaticHandlerContext {\n basename: Router[\"basename\"];\n location: RouterState[\"location\"];\n matches: RouterState[\"matches\"];\n loaderData: RouterState[\"loaderData\"];\n actionData: RouterState[\"actionData\"];\n errors: RouterState[\"errors\"];\n statusCode: number;\n loaderHeaders: Record<string, Headers>;\n actionHeaders: Record<string, Headers>;\n activeDeferreds: Record<string, DeferredData> | null;\n _deepestRenderedBoundaryId?: string | null;\n}\n\n/**\n * A StaticHandler instance manages a singular SSR navigation/fetch event\n */\nexport interface StaticHandler {\n dataRoutes: AgnosticDataRouteObject[];\n query(\n request: Request,\n opts?: {\n requestContext?: unknown;\n skipLoaderErrorBubbling?: boolean;\n dataStrategy?: DataStrategyFunction;\n }\n ): Promise<StaticHandlerContext | Response>;\n queryRoute(\n request: Request,\n opts?: {\n routeId?: string;\n requestContext?: unknown;\n dataStrategy?: DataStrategyFunction;\n }\n ): Promise<any>;\n}\n\ntype ViewTransitionOpts = {\n currentLocation: Location;\n nextLocation: Location;\n};\n\n/**\n * Subscriber function signature for changes to router state\n */\nexport interface RouterSubscriber {\n (\n state: RouterState,\n opts: {\n deletedFetchers: string[];\n viewTransitionOpts?: ViewTransitionOpts;\n flushSync: boolean;\n }\n ): void;\n}\n\n/**\n * Function signature for determining the key to be used in scroll restoration\n * for a given location\n */\nexport interface GetScrollRestorationKeyFunction {\n (location: Location, matches: UIMatch[]): string | null;\n}\n\n/**\n * Function signature for determining the current scroll position\n */\nexport interface GetScrollPositionFunction {\n (): number;\n}\n\nexport type RelativeRoutingType = \"route\" | \"path\";\n\n// Allowed for any navigation or fetch\ntype BaseNavigateOrFetchOptions = {\n preventScrollReset?: boolean;\n relative?: RelativeRoutingType;\n flushSync?: boolean;\n};\n\n// Only allowed for navigations\ntype BaseNavigateOptions = BaseNavigateOrFetchOptions & {\n replace?: boolean;\n state?: any;\n fromRouteId?: string;\n viewTransition?: boolean;\n};\n\n// Only allowed for submission navigations\ntype BaseSubmissionOptions = {\n formMethod?: HTMLFormMethod;\n formEncType?: FormEncType;\n} & (\n | { formData: FormData; body?: undefined }\n | { formData?: undefined; body: any }\n);\n\n/**\n * Options for a navigate() call for a normal (non-submission) navigation\n */\ntype LinkNavigateOptions = BaseNavigateOptions;\n\n/**\n * Options for a navigate() call for a submission navigation\n */\ntype SubmissionNavigateOptions = BaseNavigateOptions & BaseSubmissionOptions;\n\n/**\n * Options to pass to navigate() for a navigation\n */\nexport type RouterNavigateOptions =\n | LinkNavigateOptions\n | SubmissionNavigateOptions;\n\n/**\n * Options for a fetch() load\n */\ntype LoadFetchOptions = BaseNavigateOrFetchOptions;\n\n/**\n * Options for a fetch() submission\n */\ntype SubmitFetchOptions = BaseNavigateOrFetchOptions & BaseSubmissionOptions;\n\n/**\n * Options to pass to fetch()\n */\nexport type RouterFetchOptions = LoadFetchOptions | SubmitFetchOptions;\n\n/**\n * Potential states for state.navigation\n */\nexport type NavigationStates = {\n Idle: {\n state: \"idle\";\n location: undefined;\n formMethod: undefined;\n formAction: undefined;\n formEncType: undefined;\n formData: undefined;\n json: undefined;\n text: undefined;\n };\n Loading: {\n state: \"loading\";\n location: Location;\n formMethod: Submission[\"formMethod\"] | undefined;\n formAction: Submission[\"formAction\"] | undefined;\n formEncType: Submission[\"formEncType\"] | undefined;\n formData: Submission[\"formData\"] | undefined;\n json: Submission[\"json\"] | undefined;\n text: Submission[\"text\"] | undefined;\n };\n Submitting: {\n state: \"submitting\";\n location: Location;\n formMethod: Submission[\"formMethod\"];\n formAction: Submission[\"formAction\"];\n formEncType: Submission[\"formEncType\"];\n formData: Submission[\"formData\"];\n json: Submission[\"json\"];\n text: Submission[\"text\"];\n };\n};\n\nexport type Navigation = NavigationStates[keyof NavigationStates];\n\nexport type RevalidationState = \"idle\" | \"loading\";\n\n/**\n * Potential states for fetchers\n */\ntype FetcherStates<TData = any> = {\n Idle: {\n state: \"idle\";\n formMethod: undefined;\n formAction: undefined;\n formEncType: undefined;\n text: undefined;\n formData: undefined;\n json: undefined;\n data: TData | undefined;\n };\n Loading: {\n state: \"loading\";\n formMethod: Submission[\"formMethod\"] | undefined;\n formAction: Submission[\"formAction\"] | undefined;\n formEncType: Submission[\"formEncType\"] | undefined;\n text: Submission[\"text\"] | undefined;\n formData: Submission[\"formData\"] | undefined;\n json: Submission[\"json\"] | undefined;\n data: TData | undefined;\n };\n Submitting: {\n state: \"submitting\";\n formMethod: Submission[\"formMethod\"];\n formAction: Submission[\"formAction\"];\n formEncType: Submission[\"formEncType\"];\n text: Submission[\"text\"];\n formData: Submission[\"formData\"];\n json: Submission[\"json\"];\n data: TData | undefined;\n };\n};\n\nexport type Fetcher<TData = any> =\n FetcherStates<TData>[keyof FetcherStates<TData>];\n\ninterface BlockerBlocked {\n state: \"blocked\";\n reset(): void;\n proceed(): void;\n location: Location;\n}\n\ninterface BlockerUnblocked {\n state: \"unblocked\";\n reset: undefined;\n proceed: undefined;\n location: undefined;\n}\n\ninterface BlockerProceeding {\n state: \"proceeding\";\n reset: undefined;\n proceed: undefined;\n location: Location;\n}\n\nexport type Blocker = BlockerUnblocked | BlockerBlocked | BlockerProceeding;\n\nexport type BlockerFunction = (args: {\n currentLocation: Location;\n nextLocation: Location;\n historyAction: HistoryAction;\n}) => boolean;\n\ninterface ShortCircuitable {\n /**\n * startNavigation does not need to complete the navigation because we\n * redirected or got interrupted\n */\n shortCircuited?: boolean;\n}\n\ntype PendingActionResult = [string, SuccessResult | ErrorResult];\n\ninterface HandleActionResult extends ShortCircuitable {\n /**\n * Route matches which may have been updated from fog of war discovery\n */\n matches?: RouterState[\"matches\"];\n /**\n * Tuple for the returned or thrown value from the current action. The routeId\n * is the action route for success and the bubbled boundary route for errors.\n */\n pendingActionResult?: PendingActionResult;\n}\n\ninterface HandleLoadersResult extends ShortCircuitable {\n /**\n * Route matches which may have been updated from fog of war discovery\n */\n matches?: RouterState[\"matches\"];\n /**\n * loaderData returned from the current set of loaders\n */\n loaderData?: RouterState[\"loaderData\"];\n /**\n * errors thrown from the current set of loaders\n */\n errors?: RouterState[\"errors\"];\n}\n\n/**\n * Cached info for active fetcher.load() instances so they can participate\n * in revalidation\n */\ninterface FetchLoadMatch {\n routeId: string;\n path: string;\n}\n\n/**\n * Identified fetcher.load() calls that need to be revalidated\n */\ninterface RevalidatingFetcher extends FetchLoadMatch {\n key: string;\n match: AgnosticDataRouteMatch | null;\n matches: AgnosticDataRouteMatch[] | null;\n controller: AbortController | null;\n}\n\nconst validMutationMethodsArr: MutationFormMethod[] = [\n \"post\",\n \"put\",\n \"patch\",\n \"delete\",\n];\nconst validMutationMethods = new Set<MutationFormMethod>(\n validMutationMethodsArr\n);\n\nconst validRequestMethodsArr: FormMethod[] = [\n \"get\",\n ...validMutationMethodsArr,\n];\nconst validRequestMethods = new Set<FormMethod>(validRequestMethodsArr);\n\nconst redirectStatusCodes = new Set([301, 302, 303, 307, 308]);\nconst redirectPreserveMethodStatusCodes = new Set([307, 308]);\n\nexport const IDLE_NAVIGATION: NavigationStates[\"Idle\"] = {\n state: \"idle\",\n location: undefined,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n json: undefined,\n text: undefined,\n};\n\nexport const IDLE_FETCHER: FetcherStates[\"Idle\"] = {\n state: \"idle\",\n data: undefined,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n json: undefined,\n text: undefined,\n};\n\nexport const IDLE_BLOCKER: BlockerUnblocked = {\n state: \"unblocked\",\n proceed: undefined,\n reset: undefined,\n location: undefined,\n};\n\nconst ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i;\n\nconst defaultMapRouteProperties: MapRoutePropertiesFunction = (route) => ({\n hasErrorBoundary: Boolean(route.hasErrorBoundary),\n});\n\nconst TRANSITIONS_STORAGE_KEY = \"remix-router-transitions\";\n\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region createRouter\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Create a router and listen to history POP navigations\n */\nexport function createRouter(init: RouterInit): Router {\n const routerWindow = init.window\n ? init.window\n : typeof window !== \"undefined\"\n ? window\n : undefined;\n const isBrowser =\n typeof routerWindow !== \"undefined\" &&\n typeof routerWindow.document !== \"undefined\" &&\n typeof routerWindow.document.createElement !== \"undefined\";\n const isServer = !isBrowser;\n\n invariant(\n init.routes.length > 0,\n \"You must provide a non-empty routes array to createRouter\"\n );\n\n let mapRouteProperties: MapRoutePropertiesFunction;\n if (init.mapRouteProperties) {\n mapRouteProperties = init.mapRouteProperties;\n } else if (init.detectErrorBoundary) {\n // If they are still using the deprecated version, wrap it with the new API\n let detectErrorBoundary = init.detectErrorBoundary;\n mapRouteProperties = (route) => ({\n hasErrorBoundary: detectErrorBoundary(route),\n });\n } else {\n mapRouteProperties = defaultMapRouteProperties;\n }\n\n // Routes keyed by ID\n let manifest: RouteManifest = {};\n // Routes in tree format for matching\n let dataRoutes = convertRoutesToDataRoutes(\n init.routes,\n mapRouteProperties,\n undefined,\n manifest\n );\n let inFlightDataRoutes: AgnosticDataRouteObject[] | undefined;\n let basename = init.basename || \"/\";\n let dataStrategyImpl = init.dataStrategy || defaultDataStrategy;\n let patchRoutesOnNavigationImpl = init.patchRoutesOnNavigation;\n\n // Config driven behavior flags\n let future: FutureConfig = {\n v7_fetcherPersist: false,\n v7_normalizeFormMethod: false,\n v7_partialHydration: false,\n v7_prependBasename: false,\n v7_relativeSplatPath: false,\n v7_skipActionErrorRevalidation: false,\n ...init.future,\n };\n // Cleanup function for history\n let unlistenHistory: (() => void) | null = null;\n // Externally-provided functions to call on all state changes\n let subscribers = new Set<RouterSubscriber>();\n // Externally-provided object to hold scroll restoration locations during routing\n let savedScrollPositions: Record<string, number> | null = null;\n // Externally-provided function to get scroll restoration keys\n let getScrollRestorationKey: GetScrollRestorationKeyFunction | null = null;\n // Externally-provided function to get current scroll position\n let getScrollPosition: GetScrollPositionFunction | null = null;\n // One-time flag to control the initial hydration scroll restoration. Because\n // we don't get the saved positions from <ScrollRestoration /> until _after_\n // the initial render, we need to manually trigger a separate updateState to\n // send along the restoreScrollPosition\n // Set to true if we have `hydrationData` since we assume we were SSR'd and that\n // SSR did the initial scroll restoration.\n let initialScrollRestored = init.hydrationData != null;\n\n let initialMatches = matchRoutes(dataRoutes, init.history.location, basename);\n let initialMatchesIsFOW = false;\n let initialErrors: RouteData | null = null;\n\n if (initialMatches == null && !patchRoutesOnNavigationImpl) {\n // If we do not match a user-provided-route, fall back to the root\n // to allow the error boundary to take over\n let error = getInternalRouterError(404, {\n pathname: init.history.location.pathname,\n });\n let { matches, route } = getShortCircuitMatches(dataRoutes);\n initialMatches = matches;\n initialErrors = { [route.id]: error };\n }\n\n // In SPA apps, if the user provided a patchRoutesOnNavigation implementation and\n // our initial match is a splat route, clear them out so we run through lazy\n // discovery on hydration in case there's a more accurate lazy route match.\n // In SSR apps (with `hydrationData`), we expect that the server will send\n // up the proper matched routes so we don't want to run lazy discovery on\n // initial hydration and want to hydrate into the splat route.\n if (initialMatches && !init.hydrationData) {\n let fogOfWar = checkFogOfWar(\n initialMatches,\n dataRoutes,\n init.history.location.pathname\n );\n if (fogOfWar.active) {\n initialMatches = null;\n }\n }\n\n let initialized: boolean;\n if (!initialMatches) {\n initialized = false;\n initialMatches = [];\n\n // If partial hydration and fog of war is enabled, we will be running\n // `patchRoutesOnNavigation` during hydration so include any partial matches as\n // the initial matches so we can properly render `HydrateFallback`'s\n if (future.v7_partialHydration) {\n let fogOfWar = checkFogOfWar(\n null,\n dataRoutes,\n init.history.location.pathname\n );\n if (fogOfWar.active && fogOfWar.matches) {\n initialMatchesIsFOW = true;\n initialMatches = fogOfWar.matches;\n }\n }\n } else if (initialMatches.some((m) => m.route.lazy)) {\n // All initialMatches need to be loaded before we're ready. If we have lazy\n // functions around still then we'll need to run them in initialize()\n initialized = false;\n } else if (!initialMatches.some((m) => m.route.loader)) {\n // If we've got no loaders to run, then we're good to go\n initialized = true;\n } else if (future.v7_partialHydration) {\n // If partial hydration is enabled, we're initialized so long as we were\n // provided with hydrationData for every route with a loader, and no loaders\n // were marked for explicit hydration\n let loaderData = init.hydrationData ? init.hydrationData.loaderData : null;\n let errors = init.hydrationData ? init.hydrationData.errors : null;\n // If errors exist, don't consider routes below the boundary\n if (errors) {\n let idx = initialMatches.findIndex(\n (m) => errors![m.route.id] !== undefined\n );\n initialized = initialMatches\n .slice(0, idx + 1)\n .every((m) => !shouldLoadRouteOnHydration(m.route, loaderData, errors));\n } else {\n initialized = initialMatches.every(\n (m) => !shouldLoadRouteOnHydration(m.route, loaderData, errors)\n );\n }\n } else {\n // Without partial hydration - we're initialized if we were provided any\n // hydrationData - which is expected to be complete\n initialized = init.hydrationData != null;\n }\n\n let router: Router;\n let state: RouterState = {\n historyAction: init.history.action,\n location: init.history.location,\n matches: initialMatches,\n initialized,\n navigation: IDLE_NAVIGATION,\n // Don't restore on initial updateState() if we were SSR'd\n restoreScrollPosition: init.hydrationData != null ? false : null,\n preventScrollReset: false,\n revalidation: \"idle\",\n loaderData: (init.hydrationData && init.hydrationData.loaderData) || {},\n actionData: (init.hydrationData && init.hydrationData.actionData) || null,\n errors: (init.hydrationData && init.hydrationData.errors) || initialErrors,\n fetchers: new Map(),\n blockers: new Map(),\n };\n\n // -- Stateful internal variables to manage navigations --\n // Current navigation in progress (to be committed in completeNavigation)\n let pendingAction: HistoryAction = HistoryAction.Pop;\n\n // Should the current navigation prevent the scroll reset if scroll cannot\n // be restored?\n let pendingPreventScrollReset = false;\n\n // AbortController for the active navigation\n let pendingNavigationController: AbortController | null;\n\n // Should the current navigation enable document.startViewTransition?\n let pendingViewTransitionEnabled = false;\n\n // Store applied view transitions so we can apply them on POP\n let appliedViewTransitions: Map<string, Set<string>> = new Map<\n string,\n Set<string>\n >();\n\n // Cleanup function for persisting applied transitions to sessionStorage\n let removePageHideEventListener: (() => void) | null = null;\n\n // We use this to avoid touching history in completeNavigation if a\n // revalidation is entirely uninterrupted\n let isUninterruptedRevalidation = false;\n\n // Use this internal flag to force revalidation of all loaders:\n // - submissions (completed or interrupted)\n // - useRevalidator()\n // - X-Remix-Revalidate (from redirect)\n let isRevalidationRequired = false;\n\n // Use this internal array to capture routes that require revalidation due\n // to a cancelled deferred on action submission\n let cancelledDeferredRoutes: string[] = [];\n\n // Use this internal array to capture fetcher loads that were cancelled by an\n // action navigation and require revalidation\n let cancelledFetcherLoads: Set<string> = new Set();\n\n // AbortControllers for any in-flight fetchers\n let fetchControllers = new Map<string, AbortController>();\n\n // Track loads based on the order in which they started\n let incrementingLoadId = 0;\n\n // Track the outstanding pending navigation data load to be compared against\n // the globally incrementing load when a fetcher load lands after a completed\n // navigation\n let pendingNavigationLoadId = -1;\n\n // Fetchers that triggered data reloads as a result of their actions\n let fetchReloadIds = new Map<string, number>();\n\n // Fetchers that triggered redirect navigations\n let fetchRedirectIds = new Set<string>();\n\n // Most recent href/match for fetcher.load calls for fetchers\n let fetchLoadMatches = new Map<string, FetchLoadMatch>();\n\n // Ref-count mounted fetchers so we know when it's ok to clean them up\n let activeFetchers = new Map<string, number>();\n\n // Fetchers that have requested a delete when using v7_fetcherPersist,\n // they'll be officially removed after they return to idle\n let deletedFetchers = new Set<string>();\n\n // Store DeferredData instances for active route matches. When a\n // route loader returns defer() we stick one in here. Then, when a nested\n // promise resolves we update loaderData. If a new navigation starts we\n // cancel active deferreds for eliminated routes.\n let activeDeferreds = new Map<string, DeferredData>();\n\n // Store blocker functions in a separate Map outside of router state since\n // we don't need to update UI state if they change\n let blockerFunctions = new Map<string, BlockerFunction>();\n\n // Map of pending patchRoutesOnNavigation() promises (keyed by path/matches) so\n // that we only kick them off once for a given combo\n let pendingPatchRoutes = new Map<\n string,\n ReturnType<AgnosticPatchRoutesOnNavigationFunction>\n >();\n\n // Flag to ignore the next history update, so we can revert the URL change on\n // a POP navigation that was blocked by the user without touching router state\n let unblockBlockerHistoryUpdate: (() => void) | undefined = undefined;\n\n // Initialize the router, all side effects should be kicked off from here.\n // Implemented as a Fluent API for ease of:\n // let router = createRouter(init).initialize();\n function initialize() {\n // If history informs us of a POP navigation, start the navigation but do not update\n // state. We'll update our own state once the navigation completes\n unlistenHistory = init.history.listen(\n ({ action: historyAction, location, delta }) => {\n // Ignore this event if it was just us resetting the URL from a\n // blocked POP navigation\n if (unblockBlockerHistoryUpdate) {\n unblockBlockerHistoryUpdate();\n unblockBlockerHistoryUpdate = undefined;\n return;\n }\n\n warning(\n blockerFunctions.size === 0 || delta != null,\n \"You are trying to use a blocker on a POP navigation to a location \" +\n \"that was not created by @remix-run/router. This will fail silently in \" +\n \"production. This can happen if you are navigating outside the router \" +\n \"via `window.history.pushState`/`window.location.hash` instead of using \" +\n \"router navigation APIs. This can also happen if you are using \" +\n \"createHashRouter and the user manually changes the URL.\"\n );\n\n let blockerKey = shouldBlockNavigation({\n currentLocation: state.location,\n nextLocation: location,\n historyAction,\n });\n\n if (blockerKey && delta != null) {\n // Restore the URL to match the current UI, but don't update router state\n let nextHistoryUpdatePromise = new Promise<void>((resolve) => {\n unblockBlockerHistoryUpdate = resolve;\n });\n init.history.go(delta * -1);\n\n // Put the blocker into a blocked state\n updateBlocker(blockerKey, {\n state: \"blocked\",\n location,\n proceed() {\n updateBlocker(blockerKey!, {\n state: \"proceeding\",\n proceed: undefined,\n reset: undefined,\n location,\n });\n // Re-do the same POP navigation we just blocked, after the url\n // restoration is also complete. See:\n // https://github.com/remix-run/react-router/issues/11613\n nextHistoryUpdatePromise.then(() => init.history.go(delta));\n },\n reset() {\n let blockers = new Map(state.blockers);\n blockers.set(blockerKey!, IDLE_BLOCKER);\n updateState({ blockers });\n },\n });\n return;\n }\n\n return startNavigation(historyAction, location);\n }\n );\n\n if (isBrowser) {\n // FIXME: This feels gross. How can we cleanup the lines between\n // scrollRestoration/appliedTransitions persistance?\n restoreAppliedTransitions(routerWindow, appliedViewTransitions);\n let _saveAppliedTransitions = () =>\n persistAppliedTransitions(routerWindow, appliedViewTransitions);\n routerWindow.addEventListener(\"pagehide\", _saveAppliedTransitions);\n removePageHideEventListener = () =>\n routerWindow.removeEventListener(\"pagehide\", _saveAppliedTransitions);\n }\n\n // Kick off initial data load if needed. Use Pop to avoid modifying history\n // Note we don't do any handling of lazy here. For SPA's it'll get handled\n // in the normal navigation flow. For SSR it's expected that lazy modules are\n // resolved prior to router creation since we can't go into a fallbackElement\n // UI for SSR'd apps\n if (!state.initialized) {\n startNavigation(HistoryAction.Pop, state.location, {\n initialHydration: true,\n });\n }\n\n return router;\n }\n\n // Clean up a router and it's side effects\n function dispose() {\n if (unlistenHistory) {\n unlistenHistory();\n }\n if (removePageHideEventListener) {\n removePageHideEventListener();\n }\n subscribers.clear();\n pendingNavigationController && pendingNavigationController.abort();\n state.fetchers.forEach((_, key) => deleteFetcher(key));\n state.blockers.forEach((_, key) => deleteBlocker(key));\n }\n\n // Subscribe to state updates for the router\n function subscribe(fn: RouterSubscriber) {\n subscribers.add(fn);\n return () => subscribers.delete(fn);\n }\n\n // Update our state and notify the calling context of the change\n function updateState(\n newState: Partial<RouterState>,\n opts: {\n flushSync?: boolean;\n viewTransitionOpts?: ViewTransitionOpts;\n } = {}\n ): void {\n state = {\n ...state,\n ...newState,\n };\n\n // Prep fetcher cleanup so we can tell the UI which fetcher data entries\n // can be removed\n let completedFetchers: string[] = [];\n let deletedFetchersKeys: string[] = [];\n\n if (future.v7_fetcherPersist) {\n state.fetchers.forEach((fetcher, key) => {\n if (fetcher.state === \"idle\") {\n if (deletedFetchers.has(key)) {\n // Unmounted from the UI and can be totally removed\n deletedFetchersKeys.push(key);\n } else {\n // Returned to idle but still mounted in the UI, so semi-remains for\n // revalidations and such\n completedFetchers.push(key);\n }\n }\n });\n }\n\n // Remove any lingering deleted fetchers that have already been removed\n // from state.fetchers\n deletedFetchers.forEach((key) => {\n if (!state.fetchers.has(key) && !fetchControllers.has(key)) {\n deletedFetchersKeys.push(key);\n }\n });\n\n // Iterate over a local copy so that if flushSync is used and we end up\n // removing and adding a new subscriber due to the useCallback dependencies,\n // we don't get ourselves into a loop calling the new subscriber immediately\n [...subscribers].forEach((subscriber) =>\n subscriber(state, {\n deletedFetchers: deletedFetchersKeys,\n viewTransitionOpts: opts.viewTransitionOpts,\n flushSync: opts.flushSync === true,\n })\n );\n\n // Remove idle fetchers from state since we only care about in-flight fetchers.\n if (future.v7_fetcherPersist) {\n completedFetchers.forEach((key) => state.fetchers.delete(key));\n deletedFetchersKeys.forEach((key) => deleteFetcher(key));\n } else {\n // We already called deleteFetcher() on these, can remove them from this\n // Set now that we've handed the keys off to the data layer\n deletedFetchersKeys.forEach((key) => deletedFetchers.delete(key));\n }\n }\n\n // Complete a navigation returning the state.navigation back to the IDLE_NAVIGATION\n // and setting state.[historyAction/location/matches] to the new route.\n // - Location is a required param\n // - Navigation will always be set to IDLE_NAVIGATION\n // - Can pass any other state in newState\n function completeNavigation(\n location: Location,\n newState: Partial<Omit<RouterState, \"action\" | \"location\" | \"navigation\">>,\n { flushSync }: { flushSync?: boolean } = {}\n ): void {\n // Deduce if we're in a loading/actionReload state:\n // - We have committed actionData in the store\n // - The current navigation was a mutation submission\n // - We're past the submitting state and into the loading state\n // - The location being loaded is not the result of a redirect\n let isActionReload =\n state.actionData != null &&\n state.navigation.formMethod != null &&\n isMutationMethod(state.navigation.formMethod) &&\n state.navigation.state === \"loading\" &&\n location.state?._isRedirect !== true;\n\n let actionData: RouteData | null;\n if (newState.actionData) {\n if (Object.keys(newState.actionData).length > 0) {\n actionData = newState.actionData;\n } else {\n // Empty actionData -> clear prior actionData due to an action error\n actionData = null;\n }\n } else if (isActionReload) {\n // Keep the current data if we're wrapping up the action reload\n actionData = state.actionData;\n } else {\n // Clear actionData on any other completed navigations\n actionData = null;\n }\n\n // Always preserve any existing loaderData from re-used routes\n let loaderData = newState.loaderData\n ? mergeLoaderData(\n state.loaderData,\n newState.loaderData,\n newState.matches || [],\n newState.errors\n )\n : state.loaderData;\n\n // On a successful navigation we can assume we got through all blockers\n // so we can start fresh\n let blockers = state.blockers;\n if (blockers.size > 0) {\n blockers = new Map(blockers);\n blockers.forEach((_, k) => blockers.set(k, IDLE_BLOCKER));\n }\n\n // Always respect the user flag. Otherwise don't reset on mutation\n // submission navigations unless they redirect\n let preventScrollReset =\n pendingPreventScrollReset === true ||\n (state.navigation.formMethod != null &&\n isMutationMethod(state.navigation.formMethod) &&\n location.state?._isRedirect !== true);\n\n // Commit any in-flight routes at the end of the HMR revalidation \"navigation\"\n if (inFlightDataRoutes) {\n dataRoutes = inFlightDataRoutes;\n inFlightDataRoutes = undefined;\n }\n\n if (isUninterruptedRevalidation) {\n // If this was an uninterrupted revalidation then do not touch history\n } else if (pendingAction === HistoryAction.Pop) {\n // Do nothing for POP - URL has already been updated\n } else if (pendingAction === HistoryAction.Push) {\n init.history.push(location, location.state);\n } else if (pendingAction === HistoryAction.Replace) {\n init.history.replace(location, location.state);\n }\n\n let viewTransitionOpts: ViewTransitionOpts | undefined;\n\n // On POP, enable transitions if they were enabled on the original navigation\n if (pendingAction === HistoryAction.Pop) {\n // Forward takes precedence so they behave like the original navigation\n let priorPaths = appliedViewTransitions.get(state.location.pathname);\n if (priorPaths && priorPaths.has(location.pathname)) {\n viewTransitionOpts = {\n currentLocation: state.location,\n nextLocation: location,\n };\n } else if (appliedViewTransitions.has(location.pathname)) {\n // If we don't have a previous forward nav, assume we're popping back to\n // the new location and enable if that location previously enabled\n viewTransitionOpts = {\n currentLocation: location,\n nextLocation: state.location,\n };\n }\n } else if (pendingViewTransitionEnabled) {\n // Store the applied transition on PUSH/REPLACE\n let toPaths = appliedViewTransitions.get(state.location.pathname);\n if (toPaths) {\n toPaths.add(location.pathname);\n } else {\n toPaths = new Set<string>([location.pathname]);\n appliedViewTransitions.set(state.location.pathname, toPaths);\n }\n viewTransitionOpts = {\n currentLocation: state.location,\n nextLocation: location,\n };\n }\n\n updateState(\n {\n ...newState, // matches, errors, fetchers go through as-is\n actionData,\n loaderData,\n historyAction: pendingAction,\n location,\n initialized: true,\n navigation: IDLE_NAVIGATION,\n revalidation: \"idle\",\n restoreScrollPosition: getSavedScrollPosition(\n location,\n newState.matches || state.matches\n ),\n preventScrollReset,\n blockers,\n },\n {\n viewTransitionOpts,\n flushSync: flushSync === true,\n }\n );\n\n // Reset stateful navigation vars\n pendingAction = HistoryAction.Pop;\n pendingPreventScrollReset = false;\n pendingViewTransitionEnabled = false;\n isUninterruptedRevalidation = false;\n isRevalidationRequired = false;\n cancelledDeferredRoutes = [];\n }\n\n // Trigger a navigation event, which can either be a numerical POP or a PUSH\n // replace with an optional submission\n async function navigate(\n to: number | To | null,\n opts?: RouterNavigateOptions\n ): Promise<void> {\n if (typeof to === \"number\") {\n init.history.go(to);\n return;\n }\n\n let normalizedPath = normalizeTo(\n state.location,\n state.matches,\n basename,\n future.v7_prependBasename,\n to,\n future.v7_relativeSplatPath,\n opts?.fromRouteId,\n opts?.relative\n );\n let { path, submission, error } = normalizeNavigateOptions(\n future.v7_normalizeFormMethod,\n false,\n normalizedPath,\n opts\n );\n\n let currentLocation = state.location;\n let nextLocation = createLocation(state.location, path, opts && opts.state);\n\n // When using navigate as a PUSH/REPLACE we aren't reading an already-encoded\n // URL from window.location, so we need to encode it here so the behavior\n // remains the same as POP and non-data-router usages. new URL() does all\n // the same encoding we'd get from a history.pushState/window.location read\n // without having to touch history\n nextLocation = {\n ...nextLocation,\n ...init.history.encodeLocation(nextLocation),\n };\n\n let userReplace = opts && opts.replace != null ? opts.replace : undefined;\n\n let historyAction = HistoryAction.Push;\n\n if (userReplace === true) {\n historyAction = HistoryAction.Replace;\n } else if (userReplace === false) {\n // no-op\n } else if (\n submission != null &&\n isMutationMethod(submission.formMethod) &&\n submission.formAction === state.location.pathname + state.location.search\n ) {\n // By default on submissions to the current location we REPLACE so that\n // users don't have to double-click the back button to get to the prior\n // location. If the user redirects to a different location from the\n // action/loader this will be ignored and the redirect will be a PUSH\n historyAction = HistoryAction.Replace;\n }\n\n let preventScrollReset =\n opts && \"preventScrollReset\" in opts\n ? opts.preventScrollReset === true\n : undefined;\n\n let flushSync = (opts && opts.flushSync) === true;\n\n let blockerKey = shouldBlockNavigation({\n currentLocation,\n nextLocation,\n historyAction,\n });\n\n if (blockerKey) {\n // Put the blocker into a blocked state\n updateBlocker(blockerKey, {\n state: \"blocked\",\n location: nextLocation,\n proceed() {\n updateBlocker(blockerKey!, {\n state: \"proceeding\",\n proceed: undefined,\n reset: undefined,\n location: nextLocation,\n });\n // Send the same navigation through\n navigate(to, opts);\n },\n reset() {\n let blockers = new Map(state.blockers);\n blockers.set(blockerKey!, IDLE_BLOCKER);\n updateState({ blockers });\n },\n });\n return;\n }\n\n return await startNavigation(historyAction, nextLocation, {\n submission,\n // Send through the formData serialization error if we have one so we can\n // render at the right error boundary after we match routes\n pendingError: error,\n preventScrollReset,\n replace: opts && opts.replace,\n enableViewTransition: opts && opts.viewTransition,\n flushSync,\n });\n }\n\n // Revalidate all current loaders. If a navigation is in progress or if this\n // is interrupted by a navigation, allow this to \"succeed\" by calling all\n // loaders during the next loader round\n function revalidate() {\n interruptActiveLoads();\n updateState({ revalidation: \"loading\" });\n\n // If we're currently submitting an action, we don't need to start a new\n // navigation, we'll just let the follow up loader execution call all loaders\n if (state.navigation.state === \"submitting\") {\n return;\n }\n\n // If we're currently in an idle state, start a new navigation for the current\n // action/location and mark it as uninterrupted, which will skip the history\n // update in completeNavigation\n if (state.navigation.state === \"idle\") {\n startNavigation(state.historyAction, state.location, {\n startUninterruptedRevalidation: true,\n });\n return;\n }\n\n // Otherwise, if we're currently in a loading state, just start a new\n // navigation to the navigation.location but do not trigger an uninterrupted\n // revalidation so that history correctly updates once the navigation completes\n startNavigation(\n pendingAction || state.historyAction,\n state.navigation.location,\n {\n overrideNavigation: state.navigation,\n // Proxy through any rending view transition\n enableViewTransition: pendingViewTransitionEnabled === true,\n }\n );\n }\n\n // Start a navigation to the given action/location. Can optionally provide a\n // overrideNavigation which will override the normalLoad in the case of a redirect\n // navigation\n async function startNavigation(\n historyAction: HistoryAction,\n location: Location,\n opts?: {\n initialHydration?: boolean;\n submission?: Submission;\n fetcherSubmission?: Submission;\n overrideNavigation?: Navigation;\n pendingError?: ErrorResponseImpl;\n startUninterruptedRevalidation?: boolean;\n preventScrollReset?: boolean;\n replace?: boolean;\n enableViewTransition?: boolean;\n flushSync?: boolean;\n }\n ): Promise<void> {\n // Abort any in-progress navigations and start a new one. Unset any ongoing\n // uninterrupted revalidations unless told otherwise, since we want this\n // new navigation to update history normally\n pendingNavigationController && pendingNavigationController.abort();\n pendingNavigationController = null;\n pendingAction = historyAction;\n isUninterruptedRevalidation =\n (opts && opts.startUninterruptedRevalidation) === true;\n\n // Save the current scroll position every time we start a new navigation,\n // and track whether we should reset scroll on completion\n saveScrollPosition(state.location, state.matches);\n pendingPreventScrollReset = (opts && opts.preventScrollReset) === true;\n\n pendingViewTransitionEnabled = (opts && opts.enableViewTransition) === true;\n\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let loadingNavigation = opts && opts.overrideNavigation;\n let matches =\n opts?.initialHydration &&\n state.matches &&\n state.matches.length > 0 &&\n !initialMatchesIsFOW\n ? // `matchRoutes()` has already been called if we're in here via `router.initialize()`\n state.matches\n : matchRoutes(routesToUse, location, basename);\n let flushSync = (opts && opts.flushSync) === true;\n\n // Short circuit if it's only a hash change and not a revalidation or\n // mutation submission.\n //\n // Ignore on initial page loads because since the initial hydration will always\n // be \"same hash\". For example, on /page#hash and submit a <Form method=\"post\">\n // which will default to a navigation to /page\n if (\n matches &&\n state.initialized &&\n !isRevalidationRequired &&\n isHashChangeOnly(state.location, location) &&\n !(opts && opts.submission && isMutationMethod(opts.submission.formMethod))\n ) {\n completeNavigation(location, { matches }, { flushSync });\n return;\n }\n\n let fogOfWar = checkFogOfWar(matches, routesToUse, location.pathname);\n if (fogOfWar.active && fogOfWar.matches) {\n matches = fogOfWar.matches;\n }\n\n // Short circuit with a 404 on the root error boundary if we match nothing\n if (!matches) {\n let { error, notFoundMatches, route } = handleNavigational404(\n location.pathname\n );\n completeNavigation(\n location,\n {\n matches: notFoundMatches,\n loaderData: {},\n errors: {\n [route.id]: error,\n },\n },\n { flushSync }\n );\n return;\n }\n\n // Create a controller/Request for this navigation\n pendingNavigationController = new AbortController();\n let request = createClientSideRequest(\n init.history,\n location,\n pendingNavigationController.signal,\n opts && opts.submission\n );\n let pendingActionResult: PendingActionResult | undefined;\n\n if (opts && opts.pendingError) {\n // If we have a pendingError, it means the user attempted a GET submission\n // with binary FormData so assign here and skip to handleLoaders. That\n // way we handle calling loaders above the boundary etc. It's not really\n // different from an actionError in that sense.\n pendingActionResult = [\n findNearestBoundary(matches).route.id,\n { type: ResultType.error, error: opts.pendingError },\n ];\n } else if (\n opts &&\n opts.submission &&\n isMutationMethod(opts.submission.formMethod)\n ) {\n // Call action if we received an action submission\n let actionResult = await handleAction(\n request,\n location,\n opts.submission,\n matches,\n fogOfWar.active,\n { replace: opts.replace, flushSync }\n );\n\n if (actionResult.shortCircuited) {\n return;\n }\n\n // If we received a 404 from handleAction, it's because we couldn't lazily\n // discover the destination route so we don't want to call loaders\n if (actionResult.pendingActionResult) {\n let [routeId, result] = actionResult.pendingActionResult;\n if (\n isErrorResult(result) &&\n isRouteErrorResponse(result.error) &&\n result.error.status === 404\n ) {\n pendingNavigationController = null;\n\n completeNavigation(location, {\n matches: actionResult.matches,\n loaderData: {},\n errors: {\n [routeId]: result.error,\n },\n });\n return;\n }\n }\n\n matches = actionResult.matches || matches;\n pendingActionResult = actionResult.pendingActionResult;\n loadingNavigation = getLoadingNavigation(location, opts.submission);\n flushSync = false;\n // No need to do fog of war matching again on loader execution\n fogOfWar.active = false;\n\n // Create a GET request for the loaders\n request = createClientSideRequest(\n init.history,\n request.url,\n request.signal\n );\n }\n\n // Call loaders\n let {\n shortCircuited,\n matches: updatedMatches,\n loaderData,\n errors,\n } = await handleLoaders(\n request,\n location,\n matches,\n fogOfWar.active,\n loadingNavigation,\n opts && opts.submission,\n opts && opts.fetcherSubmission,\n opts && opts.replace,\n opts && opts.initialHydration === true,\n flushSync,\n pendingActionResult\n );\n\n if (shortCircuited) {\n return;\n }\n\n // Clean up now that the action/loaders have completed. Don't clean up if\n // we short circuited because pendingNavigationController will have already\n // been assigned to a new controller for the next navigation\n pendingNavigationController = null;\n\n completeNavigation(location, {\n matches: updatedMatches || matches,\n ...getActionDataForCommit(pendingActionResult),\n loaderData,\n errors,\n });\n }\n\n // Call the action matched by the leaf route for this navigation and handle\n // redirects/errors\n async function handleAction(\n request: Request,\n location: Location,\n submission: Submission,\n matches: AgnosticDataRouteMatch[],\n isFogOfWar: boolean,\n opts: { replace?: boolean; flushSync?: boolean } = {}\n ): Promise<HandleActionResult> {\n interruptActiveLoads();\n\n // Put us in a submitting state\n let navigation = getSubmittingNavigation(location, submission);\n updateState({ navigation }, { flushSync: opts.flushSync === true });\n\n if (isFogOfWar) {\n let discoverResult = await discoverRoutes(\n matches,\n location.pathname,\n request.signal\n );\n if (discoverResult.type === \"aborted\") {\n return { shortCircuited: true };\n } else if (discoverResult.type === \"error\") {\n let boundaryId = findNearestBoundary(discoverResult.partialMatches)\n .route.id;\n return {\n matches: discoverResult.partialMatches,\n pendingActionResult: [\n boundaryId,\n {\n type: ResultType.error,\n error: discoverResult.error,\n },\n ],\n };\n } else if (!discoverResult.matches) {\n let { notFoundMatches, error, route } = handleNavigational404(\n location.pathname\n );\n return {\n matches: notFoundMatches,\n pendingActionResult: [\n route.id,\n {\n type: ResultType.error,\n error,\n },\n ],\n };\n } else {\n matches = discoverResult.matches;\n }\n }\n\n // Call our action and get the result\n let result: DataResult;\n let actionMatch = getTargetMatch(matches, location);\n\n if (!actionMatch.route.action && !actionMatch.route.lazy) {\n result = {\n type: ResultType.error,\n error: getInternalRouterError(405, {\n method: request.method,\n pathname: location.pathname,\n routeId: actionMatch.route.id,\n }),\n };\n } else {\n let results = await callDataStrategy(\n \"action\",\n state,\n request,\n [actionMatch],\n matches,\n null\n );\n result = results[actionMatch.route.id];\n\n if (request.signal.aborted) {\n return { shortCircuited: true };\n }\n }\n\n if (isRedirectResult(result)) {\n let replace: boolean;\n if (opts && opts.replace != null) {\n replace = opts.replace;\n } else {\n // If the user didn't explicity indicate replace behavior, replace if\n // we redirected to the exact same location we're currently at to avoid\n // double back-buttons\n let location = normalizeRedirectLocation(\n result.response.headers.get(\"Location\")!,\n new URL(request.url),\n basename\n );\n replace = location === state.location.pathname + state.location.search;\n }\n await startRedirectNavigation(request, result, true, {\n submission,\n replace,\n });\n return { shortCircuited: true };\n }\n\n if (isDeferredResult(result)) {\n throw getInternalRouterError(400, { type: \"defer-action\" });\n }\n\n if (isErrorResult(result)) {\n // Store off the pending error - we use it to determine which loaders\n // to call and will commit it when we complete the navigation\n let boundaryMatch = findNearestBoundary(matches, actionMatch.route.id);\n\n // By default, all submissions to the current location are REPLACE\n // navigations, but if the action threw an error that'll be rendered in\n // an errorElement, we fall back to PUSH so that the user can use the\n // back button to get back to the pre-submission form location to try\n // again\n if ((opts && opts.replace) !== true) {\n pendingAction = HistoryAction.Push;\n }\n\n return {\n matches,\n pendingActionResult: [boundaryMatch.route.id, result],\n };\n }\n\n return {\n matches,\n pendingActionResult: [actionMatch.route.id, result],\n };\n }\n\n // Call all applicable loaders for the given matches, handling redirects,\n // errors, etc.\n async function handleLoaders(\n request: Request,\n location: Location,\n matches: AgnosticDataRouteMatch[],\n isFogOfWar: boolean,\n overrideNavigation?: Navigation,\n submission?: Submission,\n fetcherSubmission?: Submission,\n replace?: boolean,\n initialHydration?: boolean,\n flushSync?: boolean,\n pendingActionResult?: PendingActionResult\n ): Promise<HandleLoadersResult> {\n // Figure out the right navigation we want to use for data loading\n let loadingNavigation =\n overrideNavigation || getLoadingNavigation(location, submission);\n\n // If this was a redirect from an action we don't have a \"submission\" but\n // we have it on the loading navigation so use that if available\n let activeSubmission =\n submission ||\n fetcherSubmission ||\n getSubmissionFromNavigation(loadingNavigation);\n\n // If this is an uninterrupted revalidation, we remain in our current idle\n // state. If not, we need to switch to our loading state and load data,\n // preserving any new action data or existing action data (in the case of\n // a revalidation interrupting an actionReload)\n // If we have partialHydration enabled, then don't update the state for the\n // initial data load since it's not a \"navigation\"\n let shouldUpdateNavigationState =\n !isUninterruptedRevalidation &&\n (!future.v7_partialHydration || !initialHydration);\n\n // When fog of war is enabled, we enter our `loading` state earlier so we\n // can discover new routes during the `loading` state. We skip this if\n // we've already run actions since we would have done our matching already.\n // If the children() function threw then, we want to proceed with the\n // partial matches it discovered.\n if (isFogOfWar) {\n if (shouldUpdateNavigationState) {\n let actionData = getUpdatedActionData(pendingActionResult);\n updateState(\n {\n navigation: loadingNavigation,\n ...(actionData !== undefined ? { actionData } : {}),\n },\n {\n flushSync,\n }\n );\n }\n\n let discoverResult = await discoverRoutes(\n matches,\n location.pathname,\n request.signal\n );\n\n if (discoverResult.type === \"aborted\") {\n return { shortCircuited: true };\n } else if (discoverResult.type === \"error\") {\n let boundaryId = findNearestBoundary(discoverResult.partialMatches)\n .route.id;\n return {\n matches: discoverResult.partialMatches,\n loaderData: {},\n errors: {\n [boundaryId]: discoverResult.error,\n },\n };\n } else if (!discoverResult.matches) {\n let { error, notFoundMatches, route } = handleNavigational404(\n location.pathname\n );\n return {\n matches: notFoundMatches,\n loaderData: {},\n errors: {\n [route.id]: error,\n },\n };\n } else {\n matches = discoverResult.matches;\n }\n }\n\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let [matchesToLoad, revalidatingFetchers] = getMatchesToLoad(\n init.history,\n state,\n matches,\n activeSubmission,\n location,\n future.v7_partialHydration && initialHydration === true,\n future.v7_skipActionErrorRevalidation,\n isRevalidationRequired,\n cancelledDeferredRoutes,\n cancelledFetcherLoads,\n deletedFetchers,\n fetchLoadMatches,\n fetchRedirectIds,\n routesToUse,\n basename,\n pendingActionResult\n );\n\n // Cancel pending deferreds for no-longer-matched routes or routes we're\n // about to reload. Note that if this is an action reload we would have\n // already cancelled all pending deferreds so this would be a no-op\n cancelActiveDeferreds(\n (routeId) =>\n !(matches && matches.some((m) => m.route.id === routeId)) ||\n (matchesToLoad && matchesToLoad.some((m) => m.route.id === routeId))\n );\n\n pendingNavigationLoadId = ++incrementingLoadId;\n\n // Short circuit if we have no loaders to run\n if (matchesToLoad.length === 0 && revalidatingFetchers.length === 0) {\n let updatedFetchers = markFetchRedirectsDone();\n completeNavigation(\n location,\n {\n matches,\n loaderData: {},\n // Commit pending error if we're short circuiting\n errors:\n pendingActionResult && isErrorResult(pendingActionResult[1])\n ? { [pendingActionResult[0]]: pendingActionResult[1].error }\n : null,\n ...getActionDataForCommit(pendingActionResult),\n ...(updatedFetchers ? { fetchers: new Map(state.fetchers) } : {}),\n },\n { flushSync }\n );\n return { shortCircuited: true };\n }\n\n if (shouldUpdateNavigationState) {\n let updates: Partial<RouterState> = {};\n if (!isFogOfWar) {\n // Only update navigation/actionNData if we didn't already do it above\n updates.navigation = loadingNavigation;\n let actionData = getUpdatedActionData(pendingActionResult);\n if (actionData !== undefined) {\n updates.actionData = actionData;\n }\n }\n if (revalidatingFetchers.length > 0) {\n updates.fetchers = getUpdatedRevalidatingFetchers(revalidatingFetchers);\n }\n updateState(updates, { flushSync });\n }\n\n revalidatingFetchers.forEach((rf) => {\n abortFetcher(rf.key);\n if (rf.controller) {\n // Fetchers use an independent AbortController so that aborting a fetcher\n // (via deleteFetcher) does not abort the triggering navigation that\n // triggered the revalidation\n fetchControllers.set(rf.key, rf.controller);\n }\n });\n\n // Proxy navigation abort through to revalidation fetchers\n let abortPendingFetchRevalidations = () =>\n revalidatingFetchers.forEach((f) => abortFetcher(f.key));\n if (pendingNavigationController) {\n pendingNavigationController.signal.addEventListener(\n \"abort\",\n abortPendingFetchRevalidations\n );\n }\n\n let { loaderResults, fetcherResults } =\n await callLoadersAndMaybeResolveData(\n state,\n matches,\n matchesToLoad,\n revalidatingFetchers,\n request\n );\n\n if (request.signal.aborted) {\n return { shortCircuited: true };\n }\n\n // Clean up _after_ loaders have completed. Don't clean up if we short\n // circuited because fetchControllers would have been aborted and\n // reassigned to new controllers for the next navigation\n if (pendingNavigationController) {\n pendingNavigationController.signal.removeEventListener(\n \"abort\",\n abortPendingFetchRevalidations\n );\n }\n\n revalidatingFetchers.forEach((rf) => fetchControllers.delete(rf.key));\n\n // If any loaders returned a redirect Response, start a new REPLACE navigation\n let redirect = findRedirect(loaderResults);\n if (redirect) {\n await startRedirectNavigation(request, redirect.result, true, {\n replace,\n });\n return { shortCircuited: true };\n }\n\n redirect = findRedirect(fetcherResults);\n if (redirect) {\n // If this redirect came from a fetcher make sure we mark it in\n // fetchRedirectIds so it doesn't get revalidated on the next set of\n // loader executions\n fetchRedirectIds.add(redirect.key);\n await startRedirectNavigation(request, redirect.result, true, {\n replace,\n });\n return { shortCircuited: true };\n }\n\n // Process and commit output from loaders\n let { loaderData, errors } = processLoaderData(\n state,\n matches,\n loaderResults,\n pendingActionResult,\n revalidatingFetchers,\n fetcherResults,\n activeDeferreds\n );\n\n // Wire up subscribers to update loaderData as promises settle\n activeDeferreds.forEach((deferredData, routeId) => {\n deferredData.subscribe((aborted) => {\n // Note: No need to updateState here since the TrackedPromise on\n // loaderData is stable across resolve/reject\n // Remove this instance if we were aborted or if promises have settled\n if (aborted || deferredData.done) {\n activeDeferreds.delete(routeId);\n }\n });\n });\n\n // Preserve SSR errors during partial hydration\n if (future.v7_partialHydration && initialHydration && state.errors) {\n errors = { ...state.errors, ...errors };\n }\n\n let updatedFetchers = markFetchRedirectsDone();\n let didAbortFetchLoads = abortStaleFetchLoads(pendingNavigationLoadId);\n let shouldUpdateFetchers =\n updatedFetchers || didAbortFetchLoads || revalidatingFetchers.length > 0;\n\n return {\n matches,\n loaderData,\n errors,\n ...(shouldUpdateFetchers ? { fetchers: new Map(state.fetchers) } : {}),\n };\n }\n\n function getUpdatedActionData(\n pendingActionResult: PendingActionResult | undefined\n ): Record<string, RouteData> | null | undefined {\n if (pendingActionResult && !isErrorResult(pendingActionResult[1])) {\n // This is cast to `any` currently because `RouteData`uses any and it\n // would be a breaking change to use any.\n // TODO: v7 - change `RouteData` to use `unknown` instead of `any`\n return {\n [pendingActionResult[0]]: pendingActionResult[1].data as any,\n };\n } else if (state.actionData) {\n if (Object.keys(state.actionData).length === 0) {\n return null;\n } else {\n return state.actionData;\n }\n }\n }\n\n function getUpdatedRevalidatingFetchers(\n revalidatingFetchers: RevalidatingFetcher[]\n ) {\n revalidatingFetchers.forEach((rf) => {\n let fetcher = state.fetchers.get(rf.key);\n let revalidatingFetcher = getLoadingFetcher(\n undefined,\n fetcher ? fetcher.data : undefined\n );\n state.fetchers.set(rf.key, revalidatingFetcher);\n });\n return new Map(state.fetchers);\n }\n\n // Trigger a fetcher load/submit for the given fetcher key\n function fetch(\n key: string,\n routeId: string,\n href: string | null,\n opts?: RouterFetchOptions\n ) {\n if (isServer) {\n throw new Error(\n \"router.fetch() was called during the server render, but it shouldn't be. \" +\n \"You are likely calling a useFetcher() method in the body of your component. \" +\n \"Try moving it to a useEffect or a callback.\"\n );\n }\n\n abortFetcher(key);\n\n let flushSync = (opts && opts.flushSync) === true;\n\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let normalizedPath = normalizeTo(\n state.location,\n state.matches,\n basename,\n future.v7_prependBasename,\n href,\n future.v7_relativeSplatPath,\n routeId,\n opts?.relative\n );\n let matches = matchRoutes(routesToUse, normalizedPath, basename);\n\n let fogOfWar = checkFogOfWar(matches, routesToUse, normalizedPath);\n if (fogOfWar.active && fogOfWar.matches) {\n matches = fogOfWar.matches;\n }\n\n if (!matches) {\n setFetcherError(\n key,\n routeId,\n getInternalRouterError(404, { pathname: normalizedPath }),\n { flushSync }\n );\n return;\n }\n\n let { path, submission, error } = normalizeNavigateOptions(\n future.v7_normalizeFormMethod,\n true,\n normalizedPath,\n opts\n );\n\n if (error) {\n setFetcherError(key, routeId, error, { flushSync });\n return;\n }\n\n let match = getTargetMatch(matches, path);\n\n let preventScrollReset = (opts && opts.preventScrollReset) === true;\n\n if (submission && isMutationMethod(submission.formMethod)) {\n handleFetcherAction(\n key,\n routeId,\n path,\n match,\n matches,\n fogOfWar.active,\n flushSync,\n preventScrollReset,\n submission\n );\n return;\n }\n\n // Store off the match so we can call it's shouldRevalidate on subsequent\n // revalidations\n fetchLoadMatches.set(key, { routeId, path });\n handleFetcherLoader(\n key,\n routeId,\n path,\n match,\n matches,\n fogOfWar.active,\n flushSync,\n preventScrollReset,\n submission\n );\n }\n\n // Call the action for the matched fetcher.submit(), and then handle redirects,\n // errors, and revalidation\n async function handleFetcherAction(\n key: string,\n routeId: string,\n path: string,\n match: AgnosticDataRouteMatch,\n requestMatches: AgnosticDataRouteMatch[],\n isFogOfWar: boolean,\n flushSync: boolean,\n preventScrollReset: boolean,\n submission: Submission\n ) {\n interruptActiveLoads();\n fetchLoadMatches.delete(key);\n\n function detectAndHandle405Error(m: AgnosticDataRouteMatch) {\n if (!m.route.action && !m.route.lazy) {\n let error = getInternalRouterError(405, {\n method: submission.formMethod,\n pathname: path,\n routeId: routeId,\n });\n setFetcherError(key, routeId, error, { flushSync });\n return true;\n }\n return false;\n }\n\n if (!isFogOfWar && detectAndHandle405Error(match)) {\n return;\n }\n\n // Put this fetcher into it's submitting state\n let existingFetcher = state.fetchers.get(key);\n updateFetcherState(key, getSubmittingFetcher(submission, existingFetcher), {\n flushSync,\n });\n\n let abortController = new AbortController();\n let fetchRequest = createClientSideRequest(\n init.history,\n path,\n abortController.signal,\n submission\n );\n\n if (isFogOfWar) {\n let discoverResult = await discoverRoutes(\n requestMatches,\n new URL(fetchRequest.url).pathname,\n fetchRequest.signal,\n key\n );\n\n if (discoverResult.type === \"aborted\") {\n return;\n } else if (discoverResult.type === \"error\") {\n setFetcherError(key, routeId, discoverResult.error, { flushSync });\n return;\n } else if (!discoverResult.matches) {\n setFetcherError(\n key,\n routeId,\n getInternalRouterError(404, { pathname: path }),\n { flushSync }\n );\n return;\n } else {\n requestMatches = discoverResult.matches;\n match = getTargetMatch(requestMatches, path);\n\n if (detectAndHandle405Error(match)) {\n return;\n }\n }\n }\n\n // Call the action for the fetcher\n fetchControllers.set(key, abortController);\n\n let originatingLoadId = incrementingLoadId;\n let actionResults = await callDataStrategy(\n \"action\",\n state,\n fetchRequest,\n [match],\n requestMatches,\n key\n );\n let actionResult = actionResults[match.route.id];\n\n if (fetchRequest.signal.aborted) {\n // We can delete this so long as we weren't aborted by our own fetcher\n // re-submit which would have put _new_ controller is in fetchControllers\n if (fetchControllers.get(key) === abortController) {\n fetchControllers.delete(key);\n }\n return;\n }\n\n // When using v7_fetcherPersist, we don't want errors bubbling up to the UI\n // or redirects processed for unmounted fetchers so we just revert them to\n // idle\n if (future.v7_fetcherPersist && deletedFetchers.has(key)) {\n if (isRedirectResult(actionResult) || isErrorResult(actionResult)) {\n updateFetcherState(key, getDoneFetcher(undefined));\n return;\n }\n // Let SuccessResult's fall through for revalidation\n } else {\n if (isRedirectResult(actionResult)) {\n fetchControllers.delete(key);\n if (pendingNavigationLoadId > originatingLoadId) {\n // A new navigation was kicked off after our action started, so that\n // should take precedence over this redirect navigation. We already\n // set isRevalidationRequired so all loaders for the new route should\n // fire unless opted out via shouldRevalidate\n updateFetcherState(key, getDoneFetcher(undefined));\n return;\n } else {\n fetchRedirectIds.add(key);\n updateFetcherState(key, getLoadingFetcher(submission));\n return startRedirectNavigation(fetchRequest, actionResult, false, {\n fetcherSubmission: submission,\n preventScrollReset,\n });\n }\n }\n\n // Process any non-redirect errors thrown\n if (isErrorResult(actionResult)) {\n setFetcherError(key, routeId, actionResult.error);\n return;\n }\n }\n\n if (isDeferredResult(actionResult)) {\n throw getInternalRouterError(400, { type: \"defer-action\" });\n }\n\n // Start the data load for current matches, or the next location if we're\n // in the middle of a navigation\n let nextLocation = state.navigation.location || state.location;\n let revalidationRequest = createClientSideRequest(\n init.history,\n nextLocation,\n abortController.signal\n );\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let matches =\n state.navigation.state !== \"idle\"\n ? matchRoutes(routesToUse, state.navigation.location, basename)\n : state.matches;\n\n invariant(matches, \"Didn't find any matches after fetcher action\");\n\n let loadId = ++incrementingLoadId;\n fetchReloadIds.set(key, loadId);\n\n let loadFetcher = getLoadingFetcher(submission, actionResult.data);\n state.fetchers.set(key, loadFetcher);\n\n let [matchesToLoad, revalidatingFetchers] = getMatchesToLoad(\n init.history,\n state,\n matches,\n submission,\n nextLocation,\n false,\n future.v7_skipActionErrorRevalidation,\n isRevalidationRequired,\n cancelledDeferredRoutes,\n cancelledFetcherLoads,\n deletedFetchers,\n fetchLoadMatches,\n fetchRedirectIds,\n routesToUse,\n basename,\n [match.route.id, actionResult]\n );\n\n // Put all revalidating fetchers into the loading state, except for the\n // current fetcher which we want to keep in it's current loading state which\n // contains it's action submission info + action data\n revalidatingFetchers\n .filter((rf) => rf.key !== key)\n .forEach((rf) => {\n let staleKey = rf.key;\n let existingFetcher = state.fetchers.get(staleKey);\n let revalidatingFetcher = getLoadingFetcher(\n undefined,\n existingFetcher ? existingFetcher.data : undefined\n );\n state.fetchers.set(staleKey, revalidatingFetcher);\n abortFetcher(staleKey);\n if (rf.controller) {\n fetchControllers.set(staleKey, rf.controller);\n }\n });\n\n updateState({ fetchers: new Map(state.fetchers) });\n\n let abortPendingFetchRevalidations = () =>\n revalidatingFetchers.forEach((rf) => abortFetcher(rf.key));\n\n abortController.signal.addEventListener(\n \"abort\",\n abortPendingFetchRevalidations\n );\n\n let { loaderResults, fetcherResults } =\n await callLoadersAndMaybeResolveData(\n state,\n matches,\n matchesToLoad,\n revalidatingFetchers,\n revalidationRequest\n );\n\n if (abortController.signal.aborted) {\n return;\n }\n\n abortController.signal.removeEventListener(\n \"abort\",\n abortPendingFetchRevalidations\n );\n\n fetchReloadIds.delete(key);\n fetchControllers.delete(key);\n revalidatingFetchers.forEach((r) => fetchControllers.delete(r.key));\n\n let redirect = findRedirect(loaderResults);\n if (redirect) {\n return startRedirectNavigation(\n revalidationRequest,\n redirect.result,\n false,\n { preventScrollReset }\n );\n }\n\n redirect = findRedirect(fetcherResults);\n if (redirect) {\n // If this redirect came from a fetcher make sure we mark it in\n // fetchRedirectIds so it doesn't get revalidated on the next set of\n // loader executions\n fetchRedirectIds.add(redirect.key);\n return startRedirectNavigation(\n revalidationRequest,\n redirect.result,\n false,\n { preventScrollReset }\n );\n }\n\n // Process and commit output from loaders\n let { loaderData, errors } = processLoaderData(\n state,\n matches,\n loaderResults,\n undefined,\n revalidatingFetchers,\n fetcherResults,\n activeDeferreds\n );\n\n // Since we let revalidations complete even if the submitting fetcher was\n // deleted, only put it back to idle if it hasn't been deleted\n if (state.fetchers.has(key)) {\n let doneFetcher = getDoneFetcher(actionResult.data);\n state.fetchers.set(key, doneFetcher);\n }\n\n abortStaleFetchLoads(loadId);\n\n // If we are currently in a navigation loading state and this fetcher is\n // more recent than the navigation, we want the newer data so abort the\n // navigation and complete it with the fetcher data\n if (\n state.navigation.state === \"loading\" &&\n loadId > pendingNavigationLoadId\n ) {\n invariant(pendingAction, \"Expected pending action\");\n pendingNavigationController && pendingNavigationController.abort();\n\n completeNavigation(state.navigation.location, {\n matches,\n loaderData,\n errors,\n fetchers: new Map(state.fetchers),\n });\n } else {\n // otherwise just update with the fetcher data, preserving any existing\n // loaderData for loaders that did not need to reload. We have to\n // manually merge here since we aren't going through completeNavigation\n updateState({\n errors,\n loaderData: mergeLoaderData(\n state.loaderData,\n loaderData,\n matches,\n errors\n ),\n fetchers: new Map(state.fetchers),\n });\n isRevalidationRequired = false;\n }\n }\n\n // Call the matched loader for fetcher.load(), handling redirects, errors, etc.\n async function handleFetcherLoader(\n key: string,\n routeId: string,\n path: string,\n match: AgnosticDataRouteMatch,\n matches: AgnosticDataRouteMatch[],\n isFogOfWar: boolean,\n flushSync: boolean,\n preventScrollReset: boolean,\n submission?: Submission\n ) {\n let existingFetcher = state.fetchers.get(key);\n updateFetcherState(\n key,\n getLoadingFetcher(\n submission,\n existingFetcher ? existingFetcher.data : undefined\n ),\n { flushSync }\n );\n\n let abortController = new AbortController();\n let fetchRequest = createClientSideRequest(\n init.history,\n path,\n abortController.signal\n );\n\n if (isFogOfWar) {\n let discoverResult = await discoverRoutes(\n matches,\n new URL(fetchRequest.url).pathname,\n fetchRequest.signal,\n key\n );\n\n if (discoverResult.type === \"aborted\") {\n return;\n } else if (discoverResult.type === \"error\") {\n setFetcherError(key, routeId, discoverResult.error, { flushSync });\n return;\n } else if (!discoverResult.matches) {\n setFetcherError(\n key,\n routeId,\n getInternalRouterError(404, { pathname: path }),\n { flushSync }\n );\n return;\n } else {\n matches = discoverResult.matches;\n match = getTargetMatch(matches, path);\n }\n }\n\n // Call the loader for this fetcher route match\n fetchControllers.set(key, abortController);\n\n let originatingLoadId = incrementingLoadId;\n let results = await callDataStrategy(\n \"loader\",\n state,\n fetchRequest,\n [match],\n matches,\n key\n );\n let result = results[match.route.id];\n\n // Deferred isn't supported for fetcher loads, await everything and treat it\n // as a normal load. resolveDeferredData will return undefined if this\n // fetcher gets aborted, so we just leave result untouched and short circuit\n // below if that happens\n if (isDeferredResult(result)) {\n result =\n (await resolveDeferredData(result, fetchRequest.signal, true)) ||\n result;\n }\n\n // We can delete this so long as we weren't aborted by our our own fetcher\n // re-load which would have put _new_ controller is in fetchControllers\n if (fetchControllers.get(key) === abortController) {\n fetchControllers.delete(key);\n }\n\n if (fetchRequest.signal.aborted) {\n return;\n }\n\n // We don't want errors bubbling up or redirects followed for unmounted\n // fetchers, so short circuit here if it was removed from the UI\n if (deletedFetchers.has(key)) {\n updateFetcherState(key, getDoneFetcher(undefined));\n return;\n }\n\n // If the loader threw a redirect Response, start a new REPLACE navigation\n if (isRedirectResult(result)) {\n if (pendingNavigationLoadId > originatingLoadId) {\n // A new navigation was kicked off after our loader started, so that\n // should take precedence over this redirect navigation\n updateFetcherState(key, getDoneFetcher(undefined));\n return;\n } else {\n fetchRedirectIds.add(key);\n await startRedirectNavigation(fetchRequest, result, false, {\n preventScrollReset,\n });\n return;\n }\n }\n\n // Process any non-redirect errors thrown\n if (isErrorResult(result)) {\n setFetcherError(key, routeId, result.error);\n return;\n }\n\n invariant(!isDeferredResult(result), \"Unhandled fetcher deferred data\");\n\n // Put the fetcher back into an idle state\n updateFetcherState(key, getDoneFetcher(result.data));\n }\n\n /**\n * Utility function to handle redirects returned from an action or loader.\n * Normally, a redirect \"replaces\" the navigation that triggered it. So, for\n * example:\n *\n * - user is on /a\n * - user clicks a link to /b\n * - loader for /b redirects to /c\n *\n * In a non-JS app the browser would track the in-flight navigation to /b and\n * then replace it with /c when it encountered the redirect response. In\n * the end it would only ever update the URL bar with /c.\n *\n * In client-side routing using pushState/replaceState, we aim to emulate\n * this behavior and we also do not update history until the end of the\n * navigation (including processed redirects). This means that we never\n * actually touch history until we've processed redirects, so we just use\n * the history action from the original navigation (PUSH or REPLACE).\n */\n async function startRedirectNavigation(\n request: Request,\n redirect: RedirectResult,\n isNavigation: boolean,\n {\n submission,\n fetcherSubmission,\n preventScrollReset,\n replace,\n }: {\n submission?: Submission;\n fetcherSubmission?: Submission;\n preventScrollReset?: boolean;\n replace?: boolean;\n } = {}\n ) {\n if (redirect.response.headers.has(\"X-Remix-Revalidate\")) {\n isRevalidationRequired = true;\n }\n\n let location = redirect.response.headers.get(\"Location\");\n invariant(location, \"Expected a Location header on the redirect Response\");\n location = normalizeRedirectLocation(\n location,\n new URL(request.url),\n basename\n );\n let redirectLocation = createLocation(state.location, location, {\n _isRedirect: true,\n });\n\n if (isBrowser) {\n let isDocumentReload = false;\n\n if (redirect.response.headers.has(\"X-Remix-Reload-Document\")) {\n // Hard reload if the response contained X-Remix-Reload-Document\n isDocumentReload = true;\n } else if (ABSOLUTE_URL_REGEX.test(location)) {\n const url = init.history.createURL(location);\n isDocumentReload =\n // Hard reload if it's an absolute URL to a new origin\n url.origin !== routerWindow.location.origin ||\n // Hard reload if it's an absolute URL that does not match our basename\n stripBasename(url.pathname, basename) == null;\n }\n\n if (isDocumentReload) {\n if (replace) {\n routerWindow.location.replace(location);\n } else {\n routerWindow.location.assign(location);\n }\n return;\n }\n }\n\n // There's no need to abort on redirects, since we don't detect the\n // redirect until the action/loaders have settled\n pendingNavigationController = null;\n\n let redirectHistoryAction =\n replace === true || redirect.response.headers.has(\"X-Remix-Replace\")\n ? HistoryAction.Replace\n : HistoryAction.Push;\n\n // Use the incoming submission if provided, fallback on the active one in\n // state.navigation\n let { formMethod, formAction, formEncType } = state.navigation;\n if (\n !submission &&\n !fetcherSubmission &&\n formMethod &&\n formAction &&\n formEncType\n ) {\n submission = getSubmissionFromNavigation(state.navigation);\n }\n\n // If this was a 307/308 submission we want to preserve the HTTP method and\n // re-submit the GET/POST/PUT/PATCH/DELETE as a submission navigation to the\n // redirected location\n let activeSubmission = submission || fetcherSubmission;\n if (\n redirectPreserveMethodStatusCodes.has(redirect.response.status) &&\n activeSubmission &&\n isMutationMethod(activeSubmission.formMethod)\n ) {\n await startNavigation(redirectHistoryAction, redirectLocation, {\n submission: {\n ...activeSubmission,\n formAction: location,\n },\n // Preserve these flags across redirects\n preventScrollReset: preventScrollReset || pendingPreventScrollReset,\n enableViewTransition: isNavigation\n ? pendingViewTransitionEnabled\n : undefined,\n });\n } else {\n // If we have a navigation submission, we will preserve it through the\n // redirect navigation\n let overrideNavigation = getLoadingNavigation(\n redirectLocation,\n submission\n );\n await startNavigation(redirectHistoryAction, redirectLocation, {\n overrideNavigation,\n // Send fetcher submissions through for shouldRevalidate\n fetcherSubmission,\n // Preserve these flags across redirects\n preventScrollReset: preventScrollReset || pendingPreventScrollReset,\n enableViewTransition: isNavigation\n ? pendingViewTransitionEnabled\n : undefined,\n });\n }\n }\n\n // Utility wrapper for calling dataStrategy client-side without having to\n // pass around the manifest, mapRouteProperties, etc.\n async function callDataStrategy(\n type: \"loader\" | \"action\",\n state: RouterState,\n request: Request,\n matchesToLoad: AgnosticDataRouteMatch[],\n matches: AgnosticDataRouteMatch[],\n fetcherKey: string | null\n ): Promise<Record<string, DataResult>> {\n let results: Record<string, DataStrategyResult>;\n let dataResults: Record<string, DataResult> = {};\n try {\n results = await callDataStrategyImpl(\n dataStrategyImpl,\n type,\n state,\n request,\n matchesToLoad,\n matches,\n fetcherKey,\n manifest,\n mapRouteProperties\n );\n } catch (e) {\n // If the outer dataStrategy method throws, just return the error for all\n // matches - and it'll naturally bubble to the root\n matchesToLoad.forEach((m) => {\n dataResults[m.route.id] = {\n type: ResultType.error,\n error: e,\n };\n });\n return dataResults;\n }\n\n for (let [routeId, result] of Object.entries(results)) {\n if (isRedirectDataStrategyResultResult(result)) {\n let response = result.result as Response;\n dataResults[routeId] = {\n type: ResultType.redirect,\n response: normalizeRelativeRoutingRedirectResponse(\n response,\n request,\n routeId,\n matches,\n basename,\n future.v7_relativeSplatPath\n ),\n };\n } else {\n dataResults[routeId] = await convertDataStrategyResultToDataResult(\n result\n );\n }\n }\n\n return dataResults;\n }\n\n async function callLoadersAndMaybeResolveData(\n state: RouterState,\n matches: AgnosticDataRouteMatch[],\n matchesToLoad: AgnosticDataRouteMatch[],\n fetchersToLoad: RevalidatingFetcher[],\n request: Request\n ) {\n let currentMatches = state.matches;\n\n // Kick off loaders and fetchers in parallel\n let loaderResultsPromise = callDataStrategy(\n \"loader\",\n state,\n request,\n matchesToLoad,\n matches,\n null\n );\n\n let fetcherResultsPromise = Promise.all(\n fetchersToLoad.map(async (f) => {\n if (f.matches && f.match && f.controller) {\n let results = await callDataStrategy(\n \"loader\",\n state,\n createClientSideRequest(init.history, f.path, f.controller.signal),\n [f.match],\n f.matches,\n f.key\n );\n let result = results[f.match.route.id];\n // Fetcher results are keyed by fetcher key from here on out, not routeId\n return { [f.key]: result };\n } else {\n return Promise.resolve({\n [f.key]: {\n type: ResultType.error,\n error: getInternalRouterError(404, {\n pathname: f.path,\n }),\n } as ErrorResult,\n });\n }\n })\n );\n\n let loaderResults = await loaderResultsPromise;\n let fetcherResults = (await fetcherResultsPromise).reduce(\n (acc, r) => Object.assign(acc, r),\n {}\n );\n\n await Promise.all([\n resolveNavigationDeferredResults(\n matches,\n loaderResults,\n request.signal,\n currentMatches,\n state.loaderData\n ),\n resolveFetcherDeferredResults(matches, fetcherResults, fetchersToLoad),\n ]);\n\n return {\n loaderResults,\n fetcherResults,\n };\n }\n\n function interruptActiveLoads() {\n // Every interruption triggers a revalidation\n isRevalidationRequired = true;\n\n // Cancel pending route-level deferreds and mark cancelled routes for\n // revalidation\n cancelledDeferredRoutes.push(...cancelActiveDeferreds());\n\n // Abort in-flight fetcher loads\n fetchLoadMatches.forEach((_, key) => {\n if (fetchControllers.has(key)) {\n cancelledFetcherLoads.add(key);\n }\n abortFetcher(key);\n });\n }\n\n function updateFetcherState(\n key: string,\n fetcher: Fetcher,\n opts: { flushSync?: boolean } = {}\n ) {\n state.fetchers.set(key, fetcher);\n updateState(\n { fetchers: new Map(state.fetchers) },\n { flushSync: (opts && opts.flushSync) === true }\n );\n }\n\n function setFetcherError(\n key: string,\n routeId: string,\n error: any,\n opts: { flushSync?: boolean } = {}\n ) {\n let boundaryMatch = findNearestBoundary(state.matches, routeId);\n deleteFetcher(key);\n updateState(\n {\n errors: {\n [boundaryMatch.route.id]: error,\n },\n fetchers: new Map(state.fetchers),\n },\n { flushSync: (opts && opts.flushSync) === true }\n );\n }\n\n function getFetcher<TData = any>(key: string): Fetcher<TData> {\n activeFetchers.set(key, (activeFetchers.get(key) || 0) + 1);\n // If this fetcher was previously marked for deletion, unmark it since we\n // have a new instance\n if (deletedFetchers.has(key)) {\n deletedFetchers.delete(key);\n }\n return state.fetchers.get(key) || IDLE_FETCHER;\n }\n\n function deleteFetcher(key: string): void {\n let fetcher = state.fetchers.get(key);\n // Don't abort the controller if this is a deletion of a fetcher.submit()\n // in it's loading phase since - we don't want to abort the corresponding\n // revalidation and want them to complete and land\n if (\n fetchControllers.has(key) &&\n !(fetcher && fetcher.state === \"loading\" && fetchReloadIds.has(key))\n ) {\n abortFetcher(key);\n }\n fetchLoadMatches.delete(key);\n fetchReloadIds.delete(key);\n fetchRedirectIds.delete(key);\n\n // If we opted into the flag we can clear this now since we're calling\n // deleteFetcher() at the end of updateState() and we've already handed the\n // deleted fetcher keys off to the data layer.\n // If not, we're eagerly calling deleteFetcher() and we need to keep this\n // Set populated until the next updateState call, and we'll clear\n // `deletedFetchers` then\n if (future.v7_fetcherPersist) {\n deletedFetchers.delete(key);\n }\n\n cancelledFetcherLoads.delete(key);\n state.fetchers.delete(key);\n }\n\n function deleteFetcherAndUpdateState(key: string): void {\n let count = (activeFetchers.get(key) || 0) - 1;\n if (count <= 0) {\n activeFetchers.delete(key);\n deletedFetchers.add(key);\n if (!future.v7_fetcherPersist) {\n deleteFetcher(key);\n }\n } else {\n activeFetchers.set(key, count);\n }\n\n updateState({ fetchers: new Map(state.fetchers) });\n }\n\n function abortFetcher(key: string) {\n let controller = fetchControllers.get(key);\n if (controller) {\n controller.abort();\n fetchControllers.delete(key);\n }\n }\n\n function markFetchersDone(keys: string[]) {\n for (let key of keys) {\n let fetcher = getFetcher(key);\n let doneFetcher = getDoneFetcher(fetcher.data);\n state.fetchers.set(key, doneFetcher);\n }\n }\n\n function markFetchRedirectsDone(): boolean {\n let doneKeys = [];\n let updatedFetchers = false;\n for (let key of fetchRedirectIds) {\n let fetcher = state.fetchers.get(key);\n invariant(fetcher, `Expected fetcher: ${key}`);\n if (fetcher.state === \"loading\") {\n fetchRedirectIds.delete(key);\n doneKeys.push(key);\n updatedFetchers = true;\n }\n }\n markFetchersDone(doneKeys);\n return updatedFetchers;\n }\n\n function abortStaleFetchLoads(landedId: number): boolean {\n let yeetedKeys = [];\n for (let [key, id] of fetchReloadIds) {\n if (id < landedId) {\n let fetcher = state.fetchers.get(key);\n invariant(fetcher, `Expected fetcher: ${key}`);\n if (fetcher.state === \"loading\") {\n abortFetcher(key);\n fetchReloadIds.delete(key);\n yeetedKeys.push(key);\n }\n }\n }\n markFetchersDone(yeetedKeys);\n return yeetedKeys.length > 0;\n }\n\n function getBlocker(key: string, fn: BlockerFunction) {\n let blocker: Blocker = state.blockers.get(key) || IDLE_BLOCKER;\n\n if (blockerFunctions.get(key) !== fn) {\n blockerFunctions.set(key, fn);\n }\n\n return blocker;\n }\n\n function deleteBlocker(key: string) {\n state.blockers.delete(key);\n blockerFunctions.delete(key);\n }\n\n // Utility function to update blockers, ensuring valid state transitions\n function updateBlocker(key: string, newBlocker: Blocker) {\n let blocker = state.blockers.get(key) || IDLE_BLOCKER;\n\n // Poor mans state machine :)\n // https://mermaid.live/edit#pako:eNqVkc9OwzAMxl8l8nnjAYrEtDIOHEBIgwvKJTReGy3_lDpIqO27k6awMG0XcrLlnz87nwdonESogKXXBuE79rq75XZO3-yHds0RJVuv70YrPlUrCEe2HfrORS3rubqZfuhtpg5C9wk5tZ4VKcRUq88q9Z8RS0-48cE1iHJkL0ugbHuFLus9L6spZy8nX9MP2CNdomVaposqu3fGayT8T8-jJQwhepo_UtpgBQaDEUom04dZhAN1aJBDlUKJBxE1ceB2Smj0Mln-IBW5AFU2dwUiktt_2Qaq2dBfaKdEup85UV7Yd-dKjlnkabl2Pvr0DTkTreM\n invariant(\n (blocker.state === \"unblocked\" && newBlocker.state === \"blocked\") ||\n (blocker.state === \"blocked\" && newBlocker.state === \"blocked\") ||\n (blocker.state === \"blocked\" && newBlocker.state === \"proceeding\") ||\n (blocker.state === \"blocked\" && newBlocker.state === \"unblocked\") ||\n (blocker.state === \"proceeding\" && newBlocker.state === \"unblocked\"),\n `Invalid blocker state transition: ${blocker.state} -> ${newBlocker.state}`\n );\n\n let blockers = new Map(state.blockers);\n blockers.set(key, newBlocker);\n updateState({ blockers });\n }\n\n function shouldBlockNavigation({\n currentLocation,\n nextLocation,\n historyAction,\n }: {\n currentLocation: Location;\n nextLocation: Location;\n historyAction: HistoryAction;\n }): string | undefined {\n if (blockerFunctions.size === 0) {\n return;\n }\n\n // We ony support a single active blocker at the moment since we don't have\n // any compelling use cases for multi-blocker yet\n if (blockerFunctions.size > 1) {\n warning(false, \"A router only supports one blocker at a time\");\n }\n\n let entries = Array.from(blockerFunctions.entries());\n let [blockerKey, blockerFunction] = entries[entries.length - 1];\n let blocker = state.blockers.get(blockerKey);\n\n if (blocker && blocker.state === \"proceeding\") {\n // If the blocker is currently proceeding, we don't need to re-check\n // it and can let this navigation continue\n return;\n }\n\n // At this point, we know we're unblocked/blocked so we need to check the\n // user-provided blocker function\n if (blockerFunction({ currentLocation, nextLocation, historyAction })) {\n return blockerKey;\n }\n }\n\n function handleNavigational404(pathname: string) {\n let error = getInternalRouterError(404, { pathname });\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let { matches, route } = getShortCircuitMatches(routesToUse);\n\n // Cancel all pending deferred on 404s since we don't keep any routes\n cancelActiveDeferreds();\n\n return { notFoundMatches: matches, route, error };\n }\n\n function cancelActiveDeferreds(\n predicate?: (routeId: string) => boolean\n ): string[] {\n let cancelledRouteIds: string[] = [];\n activeDeferreds.forEach((dfd, routeId) => {\n if (!predicate || predicate(routeId)) {\n // Cancel the deferred - but do not remove from activeDeferreds here -\n // we rely on the subscribers to do that so our tests can assert proper\n // cleanup via _internalActiveDeferreds\n dfd.cancel();\n cancelledRouteIds.push(routeId);\n activeDeferreds.delete(routeId);\n }\n });\n return cancelledRouteIds;\n }\n\n // Opt in to capturing and reporting scroll positions during navigations,\n // used by the <ScrollRestoration> component\n function enableScrollRestoration(\n positions: Record<string, number>,\n getPosition: GetScrollPositionFunction,\n getKey?: GetScrollRestorationKeyFunction\n ) {\n savedScrollPositions = positions;\n getScrollPosition = getPosition;\n getScrollRestorationKey = getKey || null;\n\n // Perform initial hydration scroll restoration, since we miss the boat on\n // the initial updateState() because we've not yet rendered <ScrollRestoration/>\n // and therefore have no savedScrollPositions available\n if (!initialScrollRestored && state.navigation === IDLE_NAVIGATION) {\n initialScrollRestored = true;\n let y = getSavedScrollPosition(state.location, state.matches);\n if (y != null) {\n updateState({ restoreScrollPosition: y });\n }\n }\n\n return () => {\n savedScrollPositions = null;\n getScrollPosition = null;\n getScrollRestorationKey = null;\n };\n }\n\n function getScrollKey(location: Location, matches: AgnosticDataRouteMatch[]) {\n if (getScrollRestorationKey) {\n let key = getScrollRestorationKey(\n location,\n matches.map((m) => convertRouteMatchToUiMatch(m, state.loaderData))\n );\n return key || location.key;\n }\n return location.key;\n }\n\n function saveScrollPosition(\n location: Location,\n matches: AgnosticDataRouteMatch[]\n ): void {\n if (savedScrollPositions && getScrollPosition) {\n let key = getScrollKey(location, matches);\n savedScrollPositions[key] = getScrollPosition();\n }\n }\n\n function getSavedScrollPosition(\n location: Location,\n matches: AgnosticDataRouteMatch[]\n ): number | null {\n if (savedScrollPositions) {\n let key = getScrollKey(location, matches);\n let y = savedScrollPositions[key];\n if (typeof y === \"number\") {\n return y;\n }\n }\n return null;\n }\n\n function checkFogOfWar(\n matches: AgnosticDataRouteMatch[] | null,\n routesToUse: AgnosticDataRouteObject[],\n pathname: string\n ): { active: boolean; matches: AgnosticDataRouteMatch[] | null } {\n if (patchRoutesOnNavigationImpl) {\n if (!matches) {\n let fogMatches = matchRoutesImpl<AgnosticDataRouteObject>(\n routesToUse,\n pathname,\n basename,\n true\n );\n\n return { active: true, matches: fogMatches || [] };\n } else {\n if (Object.keys(matches[0].params).length > 0) {\n // If we matched a dynamic param or a splat, it might only be because\n // we haven't yet discovered other routes that would match with a\n // higher score. Call patchRoutesOnNavigation just to be sure\n let partialMatches = matchRoutesImpl<AgnosticDataRouteObject>(\n routesToUse,\n pathname,\n basename,\n true\n );\n return { active: true, matches: partialMatches };\n }\n }\n }\n\n return { active: false, matches: null };\n }\n\n type DiscoverRoutesSuccessResult = {\n type: \"success\";\n matches: AgnosticDataRouteMatch[] | null;\n };\n type DiscoverRoutesErrorResult = {\n type: \"error\";\n error: any;\n partialMatches: AgnosticDataRouteMatch[];\n };\n type DiscoverRoutesAbortedResult = { type: \"aborted\" };\n type DiscoverRoutesResult =\n | DiscoverRoutesSuccessResult\n | DiscoverRoutesErrorResult\n | DiscoverRoutesAbortedResult;\n\n async function discoverRoutes(\n matches: AgnosticDataRouteMatch[],\n pathname: string,\n signal: AbortSignal,\n fetcherKey?: string\n ): Promise<DiscoverRoutesResult> {\n if (!patchRoutesOnNavigationImpl) {\n return { type: \"success\", matches };\n }\n\n let partialMatches: AgnosticDataRouteMatch[] | null = matches;\n while (true) {\n let isNonHMR = inFlightDataRoutes == null;\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let localManifest = manifest;\n try {\n await patchRoutesOnNavigationImpl({\n signal,\n path: pathname,\n matches: partialMatches,\n fetcherKey,\n patch: (routeId, children) => {\n if (signal.aborted) return;\n patchRoutesImpl(\n routeId,\n children,\n routesToUse,\n localManifest,\n mapRouteProperties\n );\n },\n });\n } catch (e) {\n return { type: \"error\", error: e, partialMatches };\n } finally {\n // If we are not in the middle of an HMR revalidation and we changed the\n // routes, provide a new identity so when we `updateState` at the end of\n // this navigation/fetch `router.routes` will be a new identity and\n // trigger a re-run of memoized `router.routes` dependencies.\n // HMR will already update the identity and reflow when it lands\n // `inFlightDataRoutes` in `completeNavigation`\n if (isNonHMR && !signal.aborted) {\n dataRoutes = [...dataRoutes];\n }\n }\n\n if (signal.aborted) {\n return { type: \"aborted\" };\n }\n\n let newMatches = matchRoutes(routesToUse, pathname, basename);\n if (newMatches) {\n return { type: \"success\", matches: newMatches };\n }\n\n let newPartialMatches = matchRoutesImpl<AgnosticDataRouteObject>(\n routesToUse,\n pathname,\n basename,\n true\n );\n\n // Avoid loops if the second pass results in the same partial matches\n if (\n !newPartialMatches ||\n (partialMatches.length === newPartialMatches.length &&\n partialMatches.every(\n (m, i) => m.route.id === newPartialMatches![i].route.id\n ))\n ) {\n return { type: \"success\", matches: null };\n }\n\n partialMatches = newPartialMatches;\n }\n }\n\n function _internalSetRoutes(newRoutes: AgnosticDataRouteObject[]) {\n manifest = {};\n inFlightDataRoutes = convertRoutesToDataRoutes(\n newRoutes,\n mapRouteProperties,\n undefined,\n manifest\n );\n }\n\n function patchRoutes(\n routeId: string | null,\n children: AgnosticRouteObject[]\n ): void {\n let isNonHMR = inFlightDataRoutes == null;\n let routesToUse = inFlightDataRoutes || dataRoutes;\n patchRoutesImpl(\n routeId,\n children,\n routesToUse,\n manifest,\n mapRouteProperties\n );\n\n // If we are not in the middle of an HMR revalidation and we changed the\n // routes, provide a new identity and trigger a reflow via `updateState`\n // to re-run memoized `router.routes` dependencies.\n // HMR will already update the identity and reflow when it lands\n // `inFlightDataRoutes` in `completeNavigation`\n if (isNonHMR) {\n dataRoutes = [...dataRoutes];\n updateState({});\n }\n }\n\n router = {\n get basename() {\n return basename;\n },\n get future() {\n return future;\n },\n get state() {\n return state;\n },\n get routes() {\n return dataRoutes;\n },\n get window() {\n return routerWindow;\n },\n initialize,\n subscribe,\n enableScrollRestoration,\n navigate,\n fetch,\n revalidate,\n // Passthrough to history-aware createHref used by useHref so we get proper\n // hash-aware URLs in DOM paths\n createHref: (to: To) => init.history.createHref(to),\n encodeLocation: (to: To) => init.history.encodeLocation(to),\n getFetcher,\n deleteFetcher: deleteFetcherAndUpdateState,\n dispose,\n getBlocker,\n deleteBlocker,\n patchRoutes,\n _internalFetchControllers: fetchControllers,\n _internalActiveDeferreds: activeDeferreds,\n // TODO: Remove setRoutes, it's temporary to avoid dealing with\n // updating the tree while validating the update algorithm.\n _internalSetRoutes,\n };\n\n return router;\n}\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region createStaticHandler\n////////////////////////////////////////////////////////////////////////////////\n\nexport const UNSAFE_DEFERRED_SYMBOL = Symbol(\"deferred\");\n\n/**\n * Future flags to toggle new feature behavior\n */\nexport interface StaticHandlerFutureConfig {\n v7_relativeSplatPath: boolean;\n v7_throwAbortReason: boolean;\n}\n\nexport interface CreateStaticHandlerOptions {\n basename?: string;\n /**\n * @deprecated Use `mapRouteProperties` instead\n */\n detectErrorBoundary?: DetectErrorBoundaryFunction;\n mapRouteProperties?: MapRoutePropertiesFunction;\n future?: Partial<StaticHandlerFutureConfig>;\n}\n\nexport function createStaticHandler(\n routes: AgnosticRouteObject[],\n opts?: CreateStaticHandlerOptions\n): StaticHandler {\n invariant(\n routes.length > 0,\n \"You must provide a non-empty routes array to createStaticHandler\"\n );\n\n let manifest: RouteManifest = {};\n let basename = (opts ? opts.basename : null) || \"/\";\n let mapRouteProperties: MapRoutePropertiesFunction;\n if (opts?.mapRouteProperties) {\n mapRouteProperties = opts.mapRouteProperties;\n } else if (opts?.detectErrorBoundary) {\n // If they are still using the deprecated version, wrap it with the new API\n let detectErrorBoundary = opts.detectErrorBoundary;\n mapRouteProperties = (route) => ({\n hasErrorBoundary: detectErrorBoundary(route),\n });\n } else {\n mapRouteProperties = defaultMapRouteProperties;\n }\n // Config driven behavior flags\n let future: StaticHandlerFutureConfig = {\n v7_relativeSplatPath: false,\n v7_throwAbortReason: false,\n ...(opts ? opts.future : null),\n };\n\n let dataRoutes = convertRoutesToDataRoutes(\n routes,\n mapRouteProperties,\n undefined,\n manifest\n );\n\n /**\n * The query() method is intended for document requests, in which we want to\n * call an optional action and potentially multiple loaders for all nested\n * routes. It returns a StaticHandlerContext object, which is very similar\n * to the router state (location, loaderData, actionData, errors, etc.) and\n * also adds SSR-specific information such as the statusCode and headers\n * from action/loaders Responses.\n *\n * It _should_ never throw and should report all errors through the\n * returned context.errors object, properly associating errors to their error\n * boundary. Additionally, it tracks _deepestRenderedBoundaryId which can be\n * used to emulate React error boundaries during SSr by performing a second\n * pass only down to the boundaryId.\n *\n * The one exception where we do not return a StaticHandlerContext is when a\n * redirect response is returned or thrown from any action/loader. We\n * propagate that out and return the raw Response so the HTTP server can\n * return it directly.\n *\n * - `opts.requestContext` is an optional server context that will be passed\n * to actions/loaders in the `context` parameter\n * - `opts.skipLoaderErrorBubbling` is an optional parameter that will prevent\n * the bubbling of errors which allows single-fetch-type implementations\n * where the client will handle the bubbling and we may need to return data\n * for the handling route\n */\n async function query(\n request: Request,\n {\n requestContext,\n skipLoaderErrorBubbling,\n dataStrategy,\n }: {\n requestContext?: unknown;\n skipLoaderErrorBubbling?: boolean;\n dataStrategy?: DataStrategyFunction;\n } = {}\n ): Promise<StaticHandlerContext | Response> {\n let url = new URL(request.url);\n let method = request.method;\n let location = createLocation(\"\", createPath(url), null, \"default\");\n let matches = matchRoutes(dataRoutes, location, basename);\n\n // SSR supports HEAD requests while SPA doesn't\n if (!isValidMethod(method) && method !== \"HEAD\") {\n let error = getInternalRouterError(405, { method });\n let { matches: methodNotAllowedMatches, route } =\n getShortCircuitMatches(dataRoutes);\n return {\n basename,\n location,\n matches: methodNotAllowedMatches,\n loaderData: {},\n actionData: null,\n errors: {\n [route.id]: error,\n },\n statusCode: error.status,\n loaderHeaders: {},\n actionHeaders: {},\n activeDeferreds: null,\n };\n } else if (!matches) {\n let error = getInternalRouterError(404, { pathname: location.pathname });\n let { matches: notFoundMatches, route } =\n getShortCircuitMatches(dataRoutes);\n return {\n basename,\n location,\n matches: notFoundMatches,\n loaderData: {},\n actionData: null,\n errors: {\n [route.id]: error,\n },\n statusCode: error.status,\n loaderHeaders: {},\n actionHeaders: {},\n activeDeferreds: null,\n };\n }\n\n let result = await queryImpl(\n request,\n location,\n matches,\n requestContext,\n dataStrategy || null,\n skipLoaderErrorBubbling === true,\n null\n );\n if (isResponse(result)) {\n return result;\n }\n\n // When returning StaticHandlerContext, we patch back in the location here\n // since we need it for React Context. But this helps keep our submit and\n // loadRouteData operating on a Request instead of a Location\n return { location, basename, ...result };\n }\n\n /**\n * The queryRoute() method is intended for targeted route requests, either\n * for fetch ?_data requests or resource route requests. In this case, we\n * are only ever calling a single action or loader, and we are returning the\n * returned value directly. In most cases, this will be a Response returned\n * from the action/loader, but it may be a primitive or other value as well -\n * and in such cases the calling context should handle that accordingly.\n *\n * We do respect the throw/return differentiation, so if an action/loader\n * throws, then this method will throw the value. This is important so we\n * can do proper boundary identification in Remix where a thrown Response\n * must go to the Catch Boundary but a returned Response is happy-path.\n *\n * One thing to note is that any Router-initiated Errors that make sense\n * to associate with a status code will be thrown as an ErrorResponse\n * instance which include the raw Error, such that the calling context can\n * serialize the error as they see fit while including the proper response\n * code. Examples here are 404 and 405 errors that occur prior to reaching\n * any user-defined loaders.\n *\n * - `opts.routeId` allows you to specify the specific route handler to call.\n * If not provided the handler will determine the proper route by matching\n * against `request.url`\n * - `opts.requestContext` is an optional server context that will be passed\n * to actions/loaders in the `context` parameter\n */\n async function queryRoute(\n request: Request,\n {\n routeId,\n requestContext,\n dataStrategy,\n }: {\n requestContext?: unknown;\n routeId?: string;\n dataStrategy?: DataStrategyFunction;\n } = {}\n ): Promise<any> {\n let url = new URL(request.url);\n let method = request.method;\n let location = createLocation(\"\", createPath(url), null, \"default\");\n let matches = matchRoutes(dataRoutes, location, basename);\n\n // SSR supports HEAD requests while SPA doesn't\n if (!isValidMethod(method) && method !== \"HEAD\" && method !== \"OPTIONS\") {\n throw getInternalRouterError(405, { method });\n } else if (!matches) {\n throw getInternalRouterError(404, { pathname: location.pathname });\n }\n\n let match = routeId\n ? matches.find((m) => m.route.id === routeId)\n : getTargetMatch(matches, location);\n\n if (routeId && !match) {\n throw getInternalRouterError(403, {\n pathname: location.pathname,\n routeId,\n });\n } else if (!match) {\n // This should never hit I don't think?\n throw getInternalRouterError(404, { pathname: location.pathname });\n }\n\n let result = await queryImpl(\n request,\n location,\n matches,\n requestContext,\n dataStrategy || null,\n false,\n match\n );\n\n if (isResponse(result)) {\n return result;\n }\n\n let error = result.errors ? Object.values(result.errors)[0] : undefined;\n if (error !== undefined) {\n // If we got back result.errors, that means the loader/action threw\n // _something_ that wasn't a Response, but it's not guaranteed/required\n // to be an `instanceof Error` either, so we have to use throw here to\n // preserve the \"error\" state outside of queryImpl.\n throw error;\n }\n\n // Pick off the right state value to return\n if (result.actionData) {\n return Object.values(result.actionData)[0];\n }\n\n if (result.loaderData) {\n let data = Object.values(result.loaderData)[0];\n if (result.activeDeferreds?.[match.route.id]) {\n data[UNSAFE_DEFERRED_SYMBOL] = result.activeDeferreds[match.route.id];\n }\n return data;\n }\n\n return undefined;\n }\n\n async function queryImpl(\n request: Request,\n location: Location,\n matches: AgnosticDataRouteMatch[],\n requestContext: unknown,\n dataStrategy: DataStrategyFunction | null,\n skipLoaderErrorBubbling: boolean,\n routeMatch: AgnosticDataRouteMatch | null\n ): Promise<Omit<StaticHandlerContext, \"location\" | \"basename\"> | Response> {\n invariant(\n request.signal,\n \"query()/queryRoute() requests must contain an AbortController signal\"\n );\n\n try {\n if (isMutationMethod(request.method.toLowerCase())) {\n let result = await submit(\n request,\n matches,\n routeMatch || getTargetMatch(matches, location),\n requestContext,\n dataStrategy,\n skipLoaderErrorBubbling,\n routeMatch != null\n );\n return result;\n }\n\n let result = await loadRouteData(\n request,\n matches,\n requestContext,\n dataStrategy,\n skipLoaderErrorBubbling,\n routeMatch\n );\n return isResponse(result)\n ? result\n : {\n ...result,\n actionData: null,\n actionHeaders: {},\n };\n } catch (e) {\n // If the user threw/returned a Response in callLoaderOrAction for a\n // `queryRoute` call, we throw the `DataStrategyResult` to bail out early\n // and then return or throw the raw Response here accordingly\n if (isDataStrategyResult(e) && isResponse(e.result)) {\n if (e.type === ResultType.error) {\n throw e.result;\n }\n return e.result;\n }\n // Redirects are always returned since they don't propagate to catch\n // boundaries\n if (isRedirectResponse(e)) {\n return e;\n }\n throw e;\n }\n }\n\n async function submit(\n request: Request,\n matches: AgnosticDataRouteMatch[],\n actionMatch: AgnosticDataRouteMatch,\n requestContext: unknown,\n dataStrategy: DataStrategyFunction | null,\n skipLoaderErrorBubbling: boolean,\n isRouteRequest: boolean\n ): Promise<Omit<StaticHandlerContext, \"location\" | \"basename\"> | Response> {\n let result: DataResult;\n\n if (!actionMatch.route.action && !actionMatch.route.lazy) {\n let error = getInternalRouterError(405, {\n method: request.method,\n pathname: new URL(request.url).pathname,\n routeId: actionMatch.route.id,\n });\n if (isRouteRequest) {\n throw error;\n }\n result = {\n type: ResultType.error,\n error,\n };\n } else {\n let results = await callDataStrategy(\n \"action\",\n request,\n [actionMatch],\n matches,\n isRouteRequest,\n requestContext,\n dataStrategy\n );\n result = results[actionMatch.route.id];\n\n if (request.signal.aborted) {\n throwStaticHandlerAbortedError(request, isRouteRequest, future);\n }\n }\n\n if (isRedirectResult(result)) {\n // Uhhhh - this should never happen, we should always throw these from\n // callLoaderOrAction, but the type narrowing here keeps TS happy and we\n // can get back on the \"throw all redirect responses\" train here should\n // this ever happen :/\n throw new Response(null, {\n status: result.response.status,\n headers: {\n Location: result.response.headers.get(\"Location\")!,\n },\n });\n }\n\n if (isDeferredResult(result)) {\n let error = getInternalRouterError(400, { type: \"defer-action\" });\n if (isRouteRequest) {\n throw error;\n }\n result = {\n type: ResultType.error,\n error,\n };\n }\n\n if (isRouteRequest) {\n // Note: This should only be non-Response values if we get here, since\n // isRouteRequest should throw any Response received in callLoaderOrAction\n if (isErrorResult(result)) {\n throw result.error;\n }\n\n return {\n matches: [actionMatch],\n loaderData: {},\n actionData: { [actionMatch.route.id]: result.data },\n errors: null,\n // Note: statusCode + headers are unused here since queryRoute will\n // return the raw Response or value\n statusCode: 200,\n loaderHeaders: {},\n actionHeaders: {},\n activeDeferreds: null,\n };\n }\n\n // Create a GET request for the loaders\n let loaderRequest = new Request(request.url, {\n headers: request.headers,\n redirect: request.redirect,\n signal: request.signal,\n });\n\n if (isErrorResult(result)) {\n // Store off the pending error - we use it to determine which loaders\n // to call and will commit it when we complete the navigation\n let boundaryMatch = skipLoaderErrorBubbling\n ? actionMatch\n : findNearestBoundary(matches, actionMatch.route.id);\n\n let context = await loadRouteData(\n loaderRequest,\n matches,\n requestContext,\n dataStrategy,\n skipLoaderErrorBubbling,\n null,\n [boundaryMatch.route.id, result]\n );\n\n // action status codes take precedence over loader status codes\n return {\n ...context,\n statusCode: isRouteErrorResponse(result.error)\n ? result.error.status\n : result.statusCode != null\n ? result.statusCode\n : 500,\n actionData: null,\n actionHeaders: {\n ...(result.headers ? { [actionMatch.route.id]: result.headers } : {}),\n },\n };\n }\n\n let context = await loadRouteData(\n loaderRequest,\n matches,\n requestContext,\n dataStrategy,\n skipLoaderErrorBubbling,\n null\n );\n\n return {\n ...context,\n actionData: {\n [actionMatch.route.id]: result.data,\n },\n // action status codes take precedence over loader status codes\n ...(result.statusCode ? { statusCode: result.statusCode } : {}),\n actionHeaders: result.headers\n ? { [actionMatch.route.id]: result.headers }\n : {},\n };\n }\n\n async function loadRouteData(\n request: Request,\n matches: AgnosticDataRouteMatch[],\n requestContext: unknown,\n dataStrategy: DataStrategyFunction | null,\n skipLoaderErrorBubbling: boolean,\n routeMatch: AgnosticDataRouteMatch | null,\n pendingActionResult?: PendingActionResult\n ): Promise<\n | Omit<\n StaticHandlerContext,\n \"location\" | \"basename\" | \"actionData\" | \"actionHeaders\"\n >\n | Response\n > {\n let isRouteRequest = routeMatch != null;\n\n // Short circuit if we have no loaders to run (queryRoute())\n if (\n isRouteRequest &&\n !routeMatch?.route.loader &&\n !routeMatch?.route.lazy\n ) {\n throw getInternalRouterError(400, {\n method: request.method,\n pathname: new URL(request.url).pathname,\n routeId: routeMatch?.route.id,\n });\n }\n\n let requestMatches = routeMatch\n ? [routeMatch]\n : pendingActionResult && isErrorResult(pendingActionResult[1])\n ? getLoaderMatchesUntilBoundary(matches, pendingActionResult[0])\n : matches;\n let matchesToLoad = requestMatches.filter(\n (m) => m.route.loader || m.route.lazy\n );\n\n // Short circuit if we have no loaders to run (query())\n if (matchesToLoad.length === 0) {\n return {\n matches,\n // Add a null for all matched routes for proper revalidation on the client\n loaderData: matches.reduce(\n (acc, m) => Object.assign(acc, { [m.route.id]: null }),\n {}\n ),\n errors:\n pendingActionResult && isErrorResult(pendingActionResult[1])\n ? {\n [pendingActionResult[0]]: pendingActionResult[1].error,\n }\n : null,\n statusCode: 200,\n loaderHeaders: {},\n activeDeferreds: null,\n };\n }\n\n let results = await callDataStrategy(\n \"loader\",\n request,\n matchesToLoad,\n matches,\n isRouteRequest,\n requestContext,\n dataStrategy\n );\n\n if (request.signal.aborted) {\n throwStaticHandlerAbortedError(request, isRouteRequest, future);\n }\n\n // Process and commit output from loaders\n let activeDeferreds = new Map<string, DeferredData>();\n let context = processRouteLoaderData(\n matches,\n results,\n pendingActionResult,\n activeDeferreds,\n skipLoaderErrorBubbling\n );\n\n // Add a null for any non-loader matches for proper revalidation on the client\n let executedLoaders = new Set<string>(\n matchesToLoad.map((match) => match.route.id)\n );\n matches.forEach((match) => {\n if (!executedLoaders.has(match.route.id)) {\n context.loaderData[match.route.id] = null;\n }\n });\n\n return {\n ...context,\n matches,\n activeDeferreds:\n activeDeferreds.size > 0\n ? Object.fromEntries(activeDeferreds.entries())\n : null,\n };\n }\n\n // Utility wrapper for calling dataStrategy server-side without having to\n // pass around the manifest, mapRouteProperties, etc.\n async function callDataStrategy(\n type: \"loader\" | \"action\",\n request: Request,\n matchesToLoad: AgnosticDataRouteMatch[],\n matches: AgnosticDataRouteMatch[],\n isRouteRequest: boolean,\n requestContext: unknown,\n dataStrategy: DataStrategyFunction | null\n ): Promise<Record<string, DataResult>> {\n let results = await callDataStrategyImpl(\n dataStrategy || defaultDataStrategy,\n type,\n null,\n request,\n matchesToLoad,\n matches,\n null,\n manifest,\n mapRouteProperties,\n requestContext\n );\n\n let dataResults: Record<string, DataResult> = {};\n await Promise.all(\n matches.map(async (match) => {\n if (!(match.route.id in results)) {\n return;\n }\n let result = results[match.route.id];\n if (isRedirectDataStrategyResultResult(result)) {\n let response = result.result as Response;\n // Throw redirects and let the server handle them with an HTTP redirect\n throw normalizeRelativeRoutingRedirectResponse(\n response,\n request,\n match.route.id,\n matches,\n basename,\n future.v7_relativeSplatPath\n );\n }\n if (isResponse(result.result) && isRouteRequest) {\n // For SSR single-route requests, we want to hand Responses back\n // directly without unwrapping\n throw result;\n }\n\n dataResults[match.route.id] =\n await convertDataStrategyResultToDataResult(result);\n })\n );\n return dataResults;\n }\n\n return {\n dataRoutes,\n query,\n queryRoute,\n };\n}\n\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Helpers\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Given an existing StaticHandlerContext and an error thrown at render time,\n * provide an updated StaticHandlerContext suitable for a second SSR render\n */\nexport function getStaticContextFromError(\n routes: AgnosticDataRouteObject[],\n context: StaticHandlerContext,\n error: any\n) {\n let newContext: StaticHandlerContext = {\n ...context,\n statusCode: isRouteErrorResponse(error) ? error.status : 500,\n errors: {\n [context._deepestRenderedBoundaryId || routes[0].id]: error,\n },\n };\n return newContext;\n}\n\nfunction throwStaticHandlerAbortedError(\n request: Request,\n isRouteRequest: boolean,\n future: StaticHandlerFutureConfig\n) {\n if (future.v7_throwAbortReason && request.signal.reason !== undefined) {\n throw request.signal.reason;\n }\n\n let method = isRouteRequest ? \"queryRoute\" : \"query\";\n throw new Error(`${method}() call aborted: ${request.method} ${request.url}`);\n}\n\nfunction isSubmissionNavigation(\n opts: BaseNavigateOrFetchOptions\n): opts is SubmissionNavigateOptions {\n return (\n opts != null &&\n ((\"formData\" in opts && opts.formData != null) ||\n (\"body\" in opts && opts.body !== undefined))\n );\n}\n\nfunction normalizeTo(\n location: Path,\n matches: AgnosticDataRouteMatch[],\n basename: string,\n prependBasename: boolean,\n to: To | null,\n v7_relativeSplatPath: boolean,\n fromRouteId?: string,\n relative?: RelativeRoutingType\n) {\n let contextualMatches: AgnosticDataRouteMatch[];\n let activeRouteMatch: AgnosticDataRouteMatch | undefined;\n if (fromRouteId) {\n // Grab matches up to the calling route so our route-relative logic is\n // relative to the correct source route\n contextualMatches = [];\n for (let match of matches) {\n contextualMatches.push(match);\n if (match.route.id === fromRouteId) {\n activeRouteMatch = match;\n break;\n }\n }\n } else {\n contextualMatches = matches;\n activeRouteMatch = matches[matches.length - 1];\n }\n\n // Resolve the relative path\n let path = resolveTo(\n to ? to : \".\",\n getResolveToMatches(contextualMatches, v7_relativeSplatPath),\n stripBasename(location.pathname, basename) || location.pathname,\n relative === \"path\"\n );\n\n // When `to` is not specified we inherit search/hash from the current\n // location, unlike when to=\".\" and we just inherit the path.\n // See https://github.com/remix-run/remix/issues/927\n if (to == null) {\n path.search = location.search;\n path.hash = location.hash;\n }\n\n // Account for `?index` params when routing to the current location\n if ((to == null || to === \"\" || to === \".\") && activeRouteMatch) {\n let nakedIndex = hasNakedIndexQuery(path.search);\n if (activeRouteMatch.route.index && !nakedIndex) {\n // Add one when we're targeting an index route\n path.search = path.search\n ? path.search.replace(/^\\?/, \"?index&\")\n : \"?index\";\n } else if (!activeRouteMatch.route.index && nakedIndex) {\n // Remove existing ones when we're not\n let params = new URLSearchParams(path.search);\n let indexValues = params.getAll(\"index\");\n params.delete(\"index\");\n indexValues.filter((v) => v).forEach((v) => params.append(\"index\", v));\n let qs = params.toString();\n path.search = qs ? `?${qs}` : \"\";\n }\n }\n\n // If we're operating within a basename, prepend it to the pathname. If\n // this is a root navigation, then just use the raw basename which allows\n // the basename to have full control over the presence of a trailing slash\n // on root actions\n if (prependBasename && basename !== \"/\") {\n path.pathname =\n path.pathname === \"/\" ? basename : joinPaths([basename, path.pathname]);\n }\n\n return createPath(path);\n}\n\n// Normalize navigation options by converting formMethod=GET formData objects to\n// URLSearchParams so they behave identically to links with query params\nfunction normalizeNavigateOptions(\n normalizeFormMethod: boolean,\n isFetcher: boolean,\n path: string,\n opts?: BaseNavigateOrFetchOptions\n): {\n path: string;\n submission?: Submission;\n error?: ErrorResponseImpl;\n} {\n // Return location verbatim on non-submission navigations\n if (!opts || !isSubmissionNavigation(opts)) {\n return { path };\n }\n\n if (opts.formMethod && !isValidMethod(opts.formMethod)) {\n return {\n path,\n error: getInternalRouterError(405, { method: opts.formMethod }),\n };\n }\n\n let getInvalidBodyError = () => ({\n path,\n error: getInternalRouterError(400, { type: \"invalid-body\" }),\n });\n\n // Create a Submission on non-GET navigations\n let rawFormMethod = opts.formMethod || \"get\";\n let formMethod = normalizeFormMethod\n ? (rawFormMethod.toUpperCase() as V7_FormMethod)\n : (rawFormMethod.toLowerCase() as FormMethod);\n let formAction = stripHashFromPath(path);\n\n if (opts.body !== undefined) {\n if (opts.formEncType === \"text/plain\") {\n // text only support POST/PUT/PATCH/DELETE submissions\n if (!isMutationMethod(formMethod)) {\n return getInvalidBodyError();\n }\n\n let text =\n typeof opts.body === \"string\"\n ? opts.body\n : opts.body instanceof FormData ||\n opts.body instanceof URLSearchParams\n ? // https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#plain-text-form-data\n Array.from(opts.body.entries()).reduce(\n (acc, [name, value]) => `${acc}${name}=${value}\\n`,\n \"\"\n )\n : String(opts.body);\n\n return {\n path,\n submission: {\n formMethod,\n formAction,\n formEncType: opts.formEncType,\n formData: undefined,\n json: undefined,\n text,\n },\n };\n } else if (opts.formEncType === \"application/json\") {\n // json only supports POST/PUT/PATCH/DELETE submissions\n if (!isMutationMethod(formMethod)) {\n return getInvalidBodyError();\n }\n\n try {\n let json =\n typeof opts.body === \"string\" ? JSON.parse(opts.body) : opts.body;\n\n return {\n path,\n submission: {\n formMethod,\n formAction,\n formEncType: opts.formEncType,\n formData: undefined,\n json,\n text: undefined,\n },\n };\n } catch (e) {\n return getInvalidBodyError();\n }\n }\n }\n\n invariant(\n typeof FormData === \"function\",\n \"FormData is not available in this environment\"\n );\n\n let searchParams: URLSearchParams;\n let formData: FormData;\n\n if (opts.formData) {\n searchParams = convertFormDataToSearchParams(opts.formData);\n formData = opts.formData;\n } else if (opts.body instanceof FormData) {\n searchParams = convertFormDataToSearchParams(opts.body);\n formData = opts.body;\n } else if (opts.body instanceof URLSearchParams) {\n searchParams = opts.body;\n formData = convertSearchParamsToFormData(searchParams);\n } else if (opts.body == null) {\n searchParams = new URLSearchParams();\n formData = new FormData();\n } else {\n try {\n searchParams = new URLSearchParams(opts.body);\n formData = convertSearchParamsToFormData(searchParams);\n } catch (e) {\n return getInvalidBodyError();\n }\n }\n\n let submission: Submission = {\n formMethod,\n formAction,\n formEncType:\n (opts && opts.formEncType) || \"application/x-www-form-urlencoded\",\n formData,\n json: undefined,\n text: undefined,\n };\n\n if (isMutationMethod(submission.formMethod)) {\n return { path, submission };\n }\n\n // Flatten submission onto URLSearchParams for GET submissions\n let parsedPath = parsePath(path);\n // On GET navigation submissions we can drop the ?index param from the\n // resulting location since all loaders will run. But fetcher GET submissions\n // only run a single loader so we need to preserve any incoming ?index params\n if (isFetcher && parsedPath.search && hasNakedIndexQuery(parsedPath.search)) {\n searchParams.append(\"index\", \"\");\n }\n parsedPath.search = `?${searchParams}`;\n\n return { path: createPath(parsedPath), submission };\n}\n\n// Filter out all routes at/below any caught error as they aren't going to\n// render so we don't need to load them\nfunction getLoaderMatchesUntilBoundary(\n matches: AgnosticDataRouteMatch[],\n boundaryId: string,\n includeBoundary = false\n) {\n let index = matches.findIndex((m) => m.route.id === boundaryId);\n if (index >= 0) {\n return matches.slice(0, includeBoundary ? index + 1 : index);\n }\n return matches;\n}\n\nfunction getMatchesToLoad(\n history: History,\n state: RouterState,\n matches: AgnosticDataRouteMatch[],\n submission: Submission | undefined,\n location: Location,\n initialHydration: boolean,\n skipActionErrorRevalidation: boolean,\n isRevalidationRequired: boolean,\n cancelledDeferredRoutes: string[],\n cancelledFetcherLoads: Set<string>,\n deletedFetchers: Set<string>,\n fetchLoadMatches: Map<string, FetchLoadMatch>,\n fetchRedirectIds: Set<string>,\n routesToUse: AgnosticDataRouteObject[],\n basename: string | undefined,\n pendingActionResult?: PendingActionResult\n): [AgnosticDataRouteMatch[], RevalidatingFetcher[]] {\n let actionResult = pendingActionResult\n ? isErrorResult(pendingActionResult[1])\n ? pendingActionResult[1].error\n : pendingActionResult[1].data\n : undefined;\n let currentUrl = history.createURL(state.location);\n let nextUrl = history.createURL(location);\n\n // Pick navigation matches that are net-new or qualify for revalidation\n let boundaryMatches = matches;\n if (initialHydration && state.errors) {\n // On initial hydration, only consider matches up to _and including_ the boundary.\n // This is inclusive to handle cases where a server loader ran successfully,\n // a child server loader bubbled up to this route, but this route has\n // `clientLoader.hydrate` so we want to still run the `clientLoader` so that\n // we have a complete version of `loaderData`\n boundaryMatches = getLoaderMatchesUntilBoundary(\n matches,\n Object.keys(state.errors)[0],\n true\n );\n } else if (pendingActionResult && isErrorResult(pendingActionResult[1])) {\n // If an action threw an error, we call loaders up to, but not including the\n // boundary\n boundaryMatches = getLoaderMatchesUntilBoundary(\n matches,\n pendingActionResult[0]\n );\n }\n\n // Don't revalidate loaders by default after action 4xx/5xx responses\n // when the flag is enabled. They can still opt-into revalidation via\n // `shouldRevalidate` via `actionResult`\n let actionStatus = pendingActionResult\n ? pendingActionResult[1].statusCode\n : undefined;\n let shouldSkipRevalidation =\n skipActionErrorRevalidation && actionStatus && actionStatus >= 400;\n\n let navigationMatches = boundaryMatches.filter((match, index) => {\n let { route } = match;\n if (route.lazy) {\n // We haven't loaded this route yet so we don't know if it's got a loader!\n return true;\n }\n\n if (route.loader == null) {\n return false;\n }\n\n if (initialHydration) {\n return shouldLoadRouteOnHydration(route, state.loaderData, state.errors);\n }\n\n // Always call the loader on new route instances and pending defer cancellations\n if (\n isNewLoader(state.loaderData, state.matches[index], match) ||\n cancelledDeferredRoutes.some((id) => id === match.route.id)\n ) {\n return true;\n }\n\n // This is the default implementation for when we revalidate. If the route\n // provides it's own implementation, then we give them full control but\n // provide this value so they can leverage it if needed after they check\n // their own specific use cases\n let currentRouteMatch = state.matches[index];\n let nextRouteMatch = match;\n\n return shouldRevalidateLoader(match, {\n currentUrl,\n currentParams: currentRouteMatch.params,\n nextUrl,\n nextParams: nextRouteMatch.params,\n ...submission,\n actionResult,\n actionStatus,\n defaultShouldRevalidate: shouldSkipRevalidation\n ? false\n : // Forced revalidation due to submission, useRevalidator, or X-Remix-Revalidate\n isRevalidationRequired ||\n currentUrl.pathname + currentUrl.search ===\n nextUrl.pathname + nextUrl.search ||\n // Search params affect all loaders\n currentUrl.search !== nextUrl.search ||\n isNewRouteInstance(currentRouteMatch, nextRouteMatch),\n });\n });\n\n // Pick fetcher.loads that need to be revalidated\n let revalidatingFetchers: RevalidatingFetcher[] = [];\n fetchLoadMatches.forEach((f, key) => {\n // Don't revalidate:\n // - on initial hydration (shouldn't be any fetchers then anyway)\n // - if fetcher won't be present in the subsequent render\n // - no longer matches the URL (v7_fetcherPersist=false)\n // - was unmounted but persisted due to v7_fetcherPersist=true\n if (\n initialHydration ||\n !matches.some((m) => m.route.id === f.routeId) ||\n deletedFetchers.has(key)\n ) {\n return;\n }\n\n let fetcherMatches = matchRoutes(routesToUse, f.path, basename);\n\n // If the fetcher path no longer matches, push it in with null matches so\n // we can trigger a 404 in callLoadersAndMaybeResolveData. Note this is\n // currently only a use-case for Remix HMR where the route tree can change\n // at runtime and remove a route previously loaded via a fetcher\n if (!fetcherMatches) {\n revalidatingFetchers.push({\n key,\n routeId: f.routeId,\n path: f.path,\n matches: null,\n match: null,\n controller: null,\n });\n return;\n }\n\n // Revalidating fetchers are decoupled from the route matches since they\n // load from a static href. They revalidate based on explicit revalidation\n // (submission, useRevalidator, or X-Remix-Revalidate)\n let fetcher = state.fetchers.get(key);\n let fetcherMatch = getTargetMatch(fetcherMatches, f.path);\n\n let shouldRevalidate = false;\n if (fetchRedirectIds.has(key)) {\n // Never trigger a revalidation of an actively redirecting fetcher\n shouldRevalidate = false;\n } else if (cancelledFetcherLoads.has(key)) {\n // Always mark for revalidation if the fetcher was cancelled\n cancelledFetcherLoads.delete(key);\n shouldRevalidate = true;\n } else if (\n fetcher &&\n fetcher.state !== \"idle\" &&\n fetcher.data === undefined\n ) {\n // If the fetcher hasn't ever completed loading yet, then this isn't a\n // revalidation, it would just be a brand new load if an explicit\n // revalidation is required\n shouldRevalidate = isRevalidationRequired;\n } else {\n // Otherwise fall back on any user-defined shouldRevalidate, defaulting\n // to explicit revalidations only\n shouldRevalidate = shouldRevalidateLoader(fetcherMatch, {\n currentUrl,\n currentParams: state.matches[state.matches.length - 1].params,\n nextUrl,\n nextParams: matches[matches.length - 1].params,\n ...submission,\n actionResult,\n actionStatus,\n defaultShouldRevalidate: shouldSkipRevalidation\n ? false\n : isRevalidationRequired,\n });\n }\n\n if (shouldRevalidate) {\n revalidatingFetchers.push({\n key,\n routeId: f.routeId,\n path: f.path,\n matches: fetcherMatches,\n match: fetcherMatch,\n controller: new AbortController(),\n });\n }\n });\n\n return [navigationMatches, revalidatingFetchers];\n}\n\nfunction shouldLoadRouteOnHydration(\n route: AgnosticDataRouteObject,\n loaderData: RouteData | null | undefined,\n errors: RouteData | null | undefined\n) {\n // We dunno if we have a loader - gotta find out!\n if (route.lazy) {\n return true;\n }\n\n // No loader, nothing to initialize\n if (!route.loader) {\n return false;\n }\n\n let hasData = loaderData != null && loaderData[route.id] !== undefined;\n let hasError = errors != null && errors[route.id] !== undefined;\n\n // Don't run if we error'd during SSR\n if (!hasData && hasError) {\n return false;\n }\n\n // Explicitly opting-in to running on hydration\n if (typeof route.loader === \"function\" && route.loader.hydrate === true) {\n return true;\n }\n\n // Otherwise, run if we're not yet initialized with anything\n return !hasData && !hasError;\n}\n\nfunction isNewLoader(\n currentLoaderData: RouteData,\n currentMatch: AgnosticDataRouteMatch,\n match: AgnosticDataRouteMatch\n) {\n let isNew =\n // [a] -> [a, b]\n !currentMatch ||\n // [a, b] -> [a, c]\n match.route.id !== currentMatch.route.id;\n\n // Handle the case that we don't have data for a re-used route, potentially\n // from a prior error or from a cancelled pending deferred\n let isMissingData = currentLoaderData[match.route.id] === undefined;\n\n // Always load if this is a net-new route or we don't yet have data\n return isNew || isMissingData;\n}\n\nfunction isNewRouteInstance(\n currentMatch: AgnosticDataRouteMatch,\n match: AgnosticDataRouteMatch\n) {\n let currentPath = currentMatch.route.path;\n return (\n // param change for this match, /users/123 -> /users/456\n currentMatch.pathname !== match.pathname ||\n // splat param changed, which is not present in match.path\n // e.g. /files/images/avatar.jpg -> files/finances.xls\n (currentPath != null &&\n currentPath.endsWith(\"*\") &&\n currentMatch.params[\"*\"] !== match.params[\"*\"])\n );\n}\n\nfunction shouldRevalidateLoader(\n loaderMatch: AgnosticDataRouteMatch,\n arg: ShouldRevalidateFunctionArgs\n) {\n if (loaderMatch.route.shouldRevalidate) {\n let routeChoice = loaderMatch.route.shouldRevalidate(arg);\n if (typeof routeChoice === \"boolean\") {\n return routeChoice;\n }\n }\n\n return arg.defaultShouldRevalidate;\n}\n\nfunction patchRoutesImpl(\n routeId: string | null,\n children: AgnosticRouteObject[],\n routesToUse: AgnosticDataRouteObject[],\n manifest: RouteManifest,\n mapRouteProperties: MapRoutePropertiesFunction\n) {\n let childrenToPatch: AgnosticDataRouteObject[];\n if (routeId) {\n let route = manifest[routeId];\n invariant(\n route,\n `No route found to patch children into: routeId = ${routeId}`\n );\n if (!route.children) {\n route.children = [];\n }\n childrenToPatch = route.children;\n } else {\n childrenToPatch = routesToUse;\n }\n\n // Don't patch in routes we already know about so that `patch` is idempotent\n // to simplify user-land code. This is useful because we re-call the\n // `patchRoutesOnNavigation` function for matched routes with params.\n let uniqueChildren = children.filter(\n (newRoute) =>\n !childrenToPatch.some((existingRoute) =>\n isSameRoute(newRoute, existingRoute)\n )\n );\n\n let newRoutes = convertRoutesToDataRoutes(\n uniqueChildren,\n mapRouteProperties,\n [routeId || \"_\", \"patch\", String(childrenToPatch?.length || \"0\")],\n manifest\n );\n\n childrenToPatch.push(...newRoutes);\n}\n\nfunction isSameRoute(\n newRoute: AgnosticRouteObject,\n existingRoute: AgnosticRouteObject\n): boolean {\n // Most optimal check is by id\n if (\n \"id\" in newRoute &&\n \"id\" in existingRoute &&\n newRoute.id === existingRoute.id\n ) {\n return true;\n }\n\n // Second is by pathing differences\n if (\n !(\n newRoute.index === existingRoute.index &&\n newRoute.path === existingRoute.path &&\n newRoute.caseSensitive === existingRoute.caseSensitive\n )\n ) {\n return false;\n }\n\n // Pathless layout routes are trickier since we need to check children.\n // If they have no children then they're the same as far as we can tell\n if (\n (!newRoute.children || newRoute.children.length === 0) &&\n (!existingRoute.children || existingRoute.children.length === 0)\n ) {\n return true;\n }\n\n // Otherwise, we look to see if every child in the new route is already\n // represented in the existing route's children\n return newRoute.children!.every((aChild, i) =>\n existingRoute.children?.some((bChild) => isSameRoute(aChild, bChild))\n );\n}\n\n/**\n * Execute route.lazy() methods to lazily load route modules (loader, action,\n * shouldRevalidate) and update the routeManifest in place which shares objects\n * with dataRoutes so those get updated as well.\n */\nasync function loadLazyRouteModule(\n route: AgnosticDataRouteObject,\n mapRouteProperties: MapRoutePropertiesFunction,\n manifest: RouteManifest\n) {\n if (!route.lazy) {\n return;\n }\n\n let lazyRoute = await route.lazy();\n\n // If the lazy route function was executed and removed by another parallel\n // call then we can return - first lazy() to finish wins because the return\n // value of lazy is expected to be static\n if (!route.lazy) {\n return;\n }\n\n let routeToUpdate = manifest[route.id];\n invariant(routeToUpdate, \"No route found in manifest\");\n\n // Update the route in place. This should be safe because there's no way\n // we could yet be sitting on this route as we can't get there without\n // resolving lazy() first.\n //\n // This is different than the HMR \"update\" use-case where we may actively be\n // on the route being updated. The main concern boils down to \"does this\n // mutation affect any ongoing navigations or any current state.matches\n // values?\". If not, it should be safe to update in place.\n let routeUpdates: Record<string, any> = {};\n for (let lazyRouteProperty in lazyRoute) {\n let staticRouteValue =\n routeToUpdate[lazyRouteProperty as keyof typeof routeToUpdate];\n\n let isPropertyStaticallyDefined =\n staticRouteValue !== undefined &&\n // This property isn't static since it should always be updated based\n // on the route updates\n lazyRouteProperty !== \"hasErrorBoundary\";\n\n warning(\n !isPropertyStaticallyDefined,\n `Route \"${routeToUpdate.id}\" has a static property \"${lazyRouteProperty}\" ` +\n `defined but its lazy function is also returning a value for this property. ` +\n `The lazy route property \"${lazyRouteProperty}\" will be ignored.`\n );\n\n if (\n !isPropertyStaticallyDefined &&\n !immutableRouteKeys.has(lazyRouteProperty as ImmutableRouteKey)\n ) {\n routeUpdates[lazyRouteProperty] =\n lazyRoute[lazyRouteProperty as keyof typeof lazyRoute];\n }\n }\n\n // Mutate the route with the provided updates. Do this first so we pass\n // the updated version to mapRouteProperties\n Object.assign(routeToUpdate, routeUpdates);\n\n // Mutate the `hasErrorBoundary` property on the route based on the route\n // updates and remove the `lazy` function so we don't resolve the lazy\n // route again.\n Object.assign(routeToUpdate, {\n // To keep things framework agnostic, we use the provided\n // `mapRouteProperties` (or wrapped `detectErrorBoundary`) function to\n // set the framework-aware properties (`element`/`hasErrorBoundary`) since\n // the logic will differ between frameworks.\n ...mapRouteProperties(routeToUpdate),\n lazy: undefined,\n });\n}\n\n// Default implementation of `dataStrategy` which fetches all loaders in parallel\nasync function defaultDataStrategy({\n matches,\n}: DataStrategyFunctionArgs): ReturnType<DataStrategyFunction> {\n let matchesToLoad = matches.filter((m) => m.shouldLoad);\n let results = await Promise.all(matchesToLoad.map((m) => m.resolve()));\n return results.reduce(\n (acc, result, i) =>\n Object.assign(acc, { [matchesToLoad[i].route.id]: result }),\n {}\n );\n}\n\nasync function callDataStrategyImpl(\n dataStrategyImpl: DataStrategyFunction,\n type: \"loader\" | \"action\",\n state: RouterState | null,\n request: Request,\n matchesToLoad: AgnosticDataRouteMatch[],\n matches: AgnosticDataRouteMatch[],\n fetcherKey: string | null,\n manifest: RouteManifest,\n mapRouteProperties: MapRoutePropertiesFunction,\n requestContext?: unknown\n): Promise<Record<string, DataStrategyResult>> {\n let loadRouteDefinitionsPromises = matches.map((m) =>\n m.route.lazy\n ? loadLazyRouteModule(m.route, mapRouteProperties, manifest)\n : undefined\n );\n\n let dsMatches = matches.map((match, i) => {\n let loadRoutePromise = loadRouteDefinitionsPromises[i];\n let shouldLoad = matchesToLoad.some((m) => m.route.id === match.route.id);\n // `resolve` encapsulates route.lazy(), executing the loader/action,\n // and mapping return values/thrown errors to a `DataStrategyResult`. Users\n // can pass a callback to take fine-grained control over the execution\n // of the loader/action\n let resolve: DataStrategyMatch[\"resolve\"] = async (handlerOverride) => {\n if (\n handlerOverride &&\n request.method === \"GET\" &&\n (match.route.lazy || match.route.loader)\n ) {\n shouldLoad = true;\n }\n return shouldLoad\n ? callLoaderOrAction(\n type,\n request,\n match,\n loadRoutePromise,\n handlerOverride,\n requestContext\n )\n : Promise.resolve({ type: ResultType.data, result: undefined });\n };\n\n return {\n ...match,\n shouldLoad,\n resolve,\n };\n });\n\n // Send all matches here to allow for a middleware-type implementation.\n // handler will be a no-op for unneeded routes and we filter those results\n // back out below.\n let results = await dataStrategyImpl({\n matches: dsMatches,\n request,\n params: matches[0].params,\n fetcherKey,\n context: requestContext,\n });\n\n // Wait for all routes to load here but 'swallow the error since we want\n // it to bubble up from the `await loadRoutePromise` in `callLoaderOrAction` -\n // called from `match.resolve()`\n try {\n await Promise.all(loadRouteDefinitionsPromises);\n } catch (e) {\n // No-op\n }\n\n return results;\n}\n\n// Default logic for calling a loader/action is the user has no specified a dataStrategy\nasync function callLoaderOrAction(\n type: \"loader\" | \"action\",\n request: Request,\n match: AgnosticDataRouteMatch,\n loadRoutePromise: Promise<void> | undefined,\n handlerOverride: Parameters<DataStrategyMatch[\"resolve\"]>[0],\n staticContext?: unknown\n): Promise<DataStrategyResult> {\n let result: DataStrategyResult;\n let onReject: (() => void) | undefined;\n\n let runHandler = (\n handler: AgnosticRouteObject[\"loader\"] | AgnosticRouteObject[\"action\"]\n ): Promise<DataStrategyResult> => {\n // Setup a promise we can race against so that abort signals short circuit\n let reject: () => void;\n // This will never resolve so safe to type it as Promise<DataStrategyResult> to\n // satisfy the function return value\n let abortPromise = new Promise<DataStrategyResult>((_, r) => (reject = r));\n onReject = () => reject();\n request.signal.addEventListener(\"abort\", onReject);\n\n let actualHandler = (ctx?: unknown) => {\n if (typeof handler !== \"function\") {\n return Promise.reject(\n new Error(\n `You cannot call the handler for a route which defines a boolean ` +\n `\"${type}\" [routeId: ${match.route.id}]`\n )\n );\n }\n return handler(\n {\n request,\n params: match.params,\n context: staticContext,\n },\n ...(ctx !== undefined ? [ctx] : [])\n );\n };\n\n let handlerPromise: Promise<DataStrategyResult> = (async () => {\n try {\n let val = await (handlerOverride\n ? handlerOverride((ctx: unknown) => actualHandler(ctx))\n : actualHandler());\n return { type: \"data\", result: val };\n } catch (e) {\n return { type: \"error\", result: e };\n }\n })();\n\n return Promise.race([handlerPromise, abortPromise]);\n };\n\n try {\n let handler = match.route[type];\n\n // If we have a route.lazy promise, await that first\n if (loadRoutePromise) {\n if (handler) {\n // Run statically defined handler in parallel with lazy()\n let handlerError;\n let [value] = await Promise.all([\n // If the handler throws, don't let it immediately bubble out,\n // since we need to let the lazy() execution finish so we know if this\n // route has a boundary that can handle the error\n runHandler(handler).catch((e) => {\n handlerError = e;\n }),\n loadRoutePromise,\n ]);\n if (handlerError !== undefined) {\n throw handlerError;\n }\n result = value!;\n } else {\n // Load lazy route module, then run any returned handler\n await loadRoutePromise;\n\n handler = match.route[type];\n if (handler) {\n // Handler still runs even if we got interrupted to maintain consistency\n // with un-abortable behavior of handler execution on non-lazy or\n // previously-lazy-loaded routes\n result = await runHandler(handler);\n } else if (type === \"action\") {\n let url = new URL(request.url);\n let pathname = url.pathname + url.search;\n throw getInternalRouterError(405, {\n method: request.method,\n pathname,\n routeId: match.route.id,\n });\n } else {\n // lazy() route has no loader to run. Short circuit here so we don't\n // hit the invariant below that errors on returning undefined.\n return { type: ResultType.data, result: undefined };\n }\n }\n } else if (!handler) {\n let url = new URL(request.url);\n let pathname = url.pathname + url.search;\n throw getInternalRouterError(404, {\n pathname,\n });\n } else {\n result = await runHandler(handler);\n }\n\n invariant(\n result.result !== undefined,\n `You defined ${type === \"action\" ? \"an action\" : \"a loader\"} for route ` +\n `\"${match.route.id}\" but didn't return anything from your \\`${type}\\` ` +\n `function. Please return a value or \\`null\\`.`\n );\n } catch (e) {\n // We should already be catching and converting normal handler executions to\n // DataStrategyResults and returning them, so anything that throws here is an\n // unexpected error we still need to wrap\n return { type: ResultType.error, result: e };\n } finally {\n if (onReject) {\n request.signal.removeEventListener(\"abort\", onReject);\n }\n }\n\n return result;\n}\n\nasync function convertDataStrategyResultToDataResult(\n dataStrategyResult: DataStrategyResult\n): Promise<DataResult> {\n let { result, type } = dataStrategyResult;\n\n if (isResponse(result)) {\n let data: any;\n\n try {\n let contentType = result.headers.get(\"Content-Type\");\n // Check between word boundaries instead of startsWith() due to the last\n // paragraph of https://httpwg.org/specs/rfc9110.html#field.content-type\n if (contentType && /\\bapplication\\/json\\b/.test(contentType)) {\n if (result.body == null) {\n data = null;\n } else {\n data = await result.json();\n }\n } else {\n data = await result.text();\n }\n } catch (e) {\n return { type: ResultType.error, error: e };\n }\n\n if (type === ResultType.error) {\n return {\n type: ResultType.error,\n error: new ErrorResponseImpl(result.status, result.statusText, data),\n statusCode: result.status,\n headers: result.headers,\n };\n }\n\n return {\n type: ResultType.data,\n data,\n statusCode: result.status,\n headers: result.headers,\n };\n }\n\n if (type === ResultType.error) {\n if (isDataWithResponseInit(result)) {\n if (result.data instanceof Error) {\n return {\n type: ResultType.error,\n error: result.data,\n statusCode: result.init?.status,\n headers: result.init?.headers\n ? new Headers(result.init.headers)\n : undefined,\n };\n }\n\n // Convert thrown data() to ErrorResponse instances\n return {\n type: ResultType.error,\n error: new ErrorResponseImpl(\n result.init?.status || 500,\n undefined,\n result.data\n ),\n statusCode: isRouteErrorResponse(result) ? result.status : undefined,\n headers: result.init?.headers\n ? new Headers(result.init.headers)\n : undefined,\n };\n }\n return {\n type: ResultType.error,\n error: result,\n statusCode: isRouteErrorResponse(result) ? result.status : undefined,\n };\n }\n\n if (isDeferredData(result)) {\n return {\n type: ResultType.deferred,\n deferredData: result,\n statusCode: result.init?.status,\n headers: result.init?.headers && new Headers(result.init.headers),\n };\n }\n\n if (isDataWithResponseInit(result)) {\n return {\n type: ResultType.data,\n data: result.data,\n statusCode: result.init?.status,\n headers: result.init?.headers\n ? new Headers(result.init.headers)\n : undefined,\n };\n }\n\n return { type: ResultType.data, data: result };\n}\n\n// Support relative routing in internal redirects\nfunction normalizeRelativeRoutingRedirectResponse(\n response: Response,\n request: Request,\n routeId: string,\n matches: AgnosticDataRouteMatch[],\n basename: string,\n v7_relativeSplatPath: boolean\n) {\n let location = response.headers.get(\"Location\");\n invariant(\n location,\n \"Redirects returned/thrown from loaders/actions must have a Location header\"\n );\n\n if (!ABSOLUTE_URL_REGEX.test(location)) {\n let trimmedMatches = matches.slice(\n 0,\n matches.findIndex((m) => m.route.id === routeId) + 1\n );\n location = normalizeTo(\n new URL(request.url),\n trimmedMatches,\n basename,\n true,\n location,\n v7_relativeSplatPath\n );\n response.headers.set(\"Location\", location);\n }\n\n return response;\n}\n\nfunction normalizeRedirectLocation(\n location: string,\n currentUrl: URL,\n basename: string\n): string {\n if (ABSOLUTE_URL_REGEX.test(location)) {\n // Strip off the protocol+origin for same-origin + same-basename absolute redirects\n let normalizedLocation = location;\n let url = normalizedLocation.startsWith(\"//\")\n ? new URL(currentUrl.protocol + normalizedLocation)\n : new URL(normalizedLocation);\n let isSameBasename = stripBasename(url.pathname, basename) != null;\n if (url.origin === currentUrl.origin && isSameBasename) {\n return url.pathname + url.search + url.hash;\n }\n }\n return location;\n}\n\n// Utility method for creating the Request instances for loaders/actions during\n// client-side navigations and fetches. During SSR we will always have a\n// Request instance from the static handler (query/queryRoute)\nfunction createClientSideRequest(\n history: History,\n location: string | Location,\n signal: AbortSignal,\n submission?: Submission\n): Request {\n let url = history.createURL(stripHashFromPath(location)).toString();\n let init: RequestInit = { signal };\n\n if (submission && isMutationMethod(submission.formMethod)) {\n let { formMethod, formEncType } = submission;\n // Didn't think we needed this but it turns out unlike other methods, patch\n // won't be properly normalized to uppercase and results in a 405 error.\n // See: https://fetch.spec.whatwg.org/#concept-method\n init.method = formMethod.toUpperCase();\n\n if (formEncType === \"application/json\") {\n init.headers = new Headers({ \"Content-Type\": formEncType });\n init.body = JSON.stringify(submission.json);\n } else if (formEncType === \"text/plain\") {\n // Content-Type is inferred (https://fetch.spec.whatwg.org/#dom-request)\n init.body = submission.text;\n } else if (\n formEncType === \"application/x-www-form-urlencoded\" &&\n submission.formData\n ) {\n // Content-Type is inferred (https://fetch.spec.whatwg.org/#dom-request)\n init.body = convertFormDataToSearchParams(submission.formData);\n } else {\n // Content-Type is inferred (https://fetch.spec.whatwg.org/#dom-request)\n init.body = submission.formData;\n }\n }\n\n return new Request(url, init);\n}\n\nfunction convertFormDataToSearchParams(formData: FormData): URLSearchParams {\n let searchParams = new URLSearchParams();\n\n for (let [key, value] of formData.entries()) {\n // https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#converting-an-entry-list-to-a-list-of-name-value-pairs\n searchParams.append(key, typeof value === \"string\" ? value : value.name);\n }\n\n return searchParams;\n}\n\nfunction convertSearchParamsToFormData(\n searchParams: URLSearchParams\n): FormData {\n let formData = new FormData();\n for (let [key, value] of searchParams.entries()) {\n formData.append(key, value);\n }\n return formData;\n}\n\nfunction processRouteLoaderData(\n matches: AgnosticDataRouteMatch[],\n results: Record<string, DataResult>,\n pendingActionResult: PendingActionResult | undefined,\n activeDeferreds: Map<string, DeferredData>,\n skipLoaderErrorBubbling: boolean\n): {\n loaderData: RouterState[\"loaderData\"];\n errors: RouterState[\"errors\"] | null;\n statusCode: number;\n loaderHeaders: Record<string, Headers>;\n} {\n // Fill in loaderData/errors from our loaders\n let loaderData: RouterState[\"loaderData\"] = {};\n let errors: RouterState[\"errors\"] | null = null;\n let statusCode: number | undefined;\n let foundError = false;\n let loaderHeaders: Record<string, Headers> = {};\n let pendingError =\n pendingActionResult && isErrorResult(pendingActionResult[1])\n ? pendingActionResult[1].error\n : undefined;\n\n // Process loader results into state.loaderData/state.errors\n matches.forEach((match) => {\n if (!(match.route.id in results)) {\n return;\n }\n let id = match.route.id;\n let result = results[id];\n invariant(\n !isRedirectResult(result),\n \"Cannot handle redirect results in processLoaderData\"\n );\n if (isErrorResult(result)) {\n let error = result.error;\n // If we have a pending action error, we report it at the highest-route\n // that throws a loader error, and then clear it out to indicate that\n // it was consumed\n if (pendingError !== undefined) {\n error = pendingError;\n pendingError = undefined;\n }\n\n errors = errors || {};\n\n if (skipLoaderErrorBubbling) {\n errors[id] = error;\n } else {\n // Look upwards from the matched route for the closest ancestor error\n // boundary, defaulting to the root match. Prefer higher error values\n // if lower errors bubble to the same boundary\n let boundaryMatch = findNearestBoundary(matches, id);\n if (errors[boundaryMatch.route.id] == null) {\n errors[boundaryMatch.route.id] = error;\n }\n }\n\n // Clear our any prior loaderData for the throwing route\n loaderData[id] = undefined;\n\n // Once we find our first (highest) error, we set the status code and\n // prevent deeper status codes from overriding\n if (!foundError) {\n foundError = true;\n statusCode = isRouteErrorResponse(result.error)\n ? result.error.status\n : 500;\n }\n if (result.headers) {\n loaderHeaders[id] = result.headers;\n }\n } else {\n if (isDeferredResult(result)) {\n activeDeferreds.set(id, result.deferredData);\n loaderData[id] = result.deferredData.data;\n // Error status codes always override success status codes, but if all\n // loaders are successful we take the deepest status code.\n if (\n result.statusCode != null &&\n result.statusCode !== 200 &&\n !foundError\n ) {\n statusCode = result.statusCode;\n }\n if (result.headers) {\n loaderHeaders[id] = result.headers;\n }\n } else {\n loaderData[id] = result.data;\n // Error status codes always override success status codes, but if all\n // loaders are successful we take the deepest status code.\n if (result.statusCode && result.statusCode !== 200 && !foundError) {\n statusCode = result.statusCode;\n }\n if (result.headers) {\n loaderHeaders[id] = result.headers;\n }\n }\n }\n });\n\n // If we didn't consume the pending action error (i.e., all loaders\n // resolved), then consume it here. Also clear out any loaderData for the\n // throwing route\n if (pendingError !== undefined && pendingActionResult) {\n errors = { [pendingActionResult[0]]: pendingError };\n loaderData[pendingActionResult[0]] = undefined;\n }\n\n return {\n loaderData,\n errors,\n statusCode: statusCode || 200,\n loaderHeaders,\n };\n}\n\nfunction processLoaderData(\n state: RouterState,\n matches: AgnosticDataRouteMatch[],\n results: Record<string, DataResult>,\n pendingActionResult: PendingActionResult | undefined,\n revalidatingFetchers: RevalidatingFetcher[],\n fetcherResults: Record<string, DataResult>,\n activeDeferreds: Map<string, DeferredData>\n): {\n loaderData: RouterState[\"loaderData\"];\n errors?: RouterState[\"errors\"];\n} {\n let { loaderData, errors } = processRouteLoaderData(\n matches,\n results,\n pendingActionResult,\n activeDeferreds,\n false // This method is only called client side so we always want to bubble\n );\n\n // Process results from our revalidating fetchers\n revalidatingFetchers.forEach((rf) => {\n let { key, match, controller } = rf;\n let result = fetcherResults[key];\n invariant(result, \"Did not find corresponding fetcher result\");\n\n // Process fetcher non-redirect errors\n if (controller && controller.signal.aborted) {\n // Nothing to do for aborted fetchers\n return;\n } else if (isErrorResult(result)) {\n let boundaryMatch = findNearestBoundary(state.matches, match?.route.id);\n if (!(errors && errors[boundaryMatch.route.id])) {\n errors = {\n ...errors,\n [boundaryMatch.route.id]: result.error,\n };\n }\n state.fetchers.delete(key);\n } else if (isRedirectResult(result)) {\n // Should never get here, redirects should get processed above, but we\n // keep this to type narrow to a success result in the else\n invariant(false, \"Unhandled fetcher revalidation redirect\");\n } else if (isDeferredResult(result)) {\n // Should never get here, deferred data should be awaited for fetchers\n // in resolveDeferredResults\n invariant(false, \"Unhandled fetcher deferred data\");\n } else {\n let doneFetcher = getDoneFetcher(result.data);\n state.fetchers.set(key, doneFetcher);\n }\n });\n\n return { loaderData, errors };\n}\n\nfunction mergeLoaderData(\n loaderData: RouteData,\n newLoaderData: RouteData,\n matches: AgnosticDataRouteMatch[],\n errors: RouteData | null | undefined\n): RouteData {\n let mergedLoaderData = { ...newLoaderData };\n for (let match of matches) {\n let id = match.route.id;\n if (newLoaderData.hasOwnProperty(id)) {\n if (newLoaderData[id] !== undefined) {\n mergedLoaderData[id] = newLoaderData[id];\n } else {\n // No-op - this is so we ignore existing data if we have a key in the\n // incoming object with an undefined value, which is how we unset a prior\n // loaderData if we encounter a loader error\n }\n } else if (loaderData[id] !== undefined && match.route.loader) {\n // Preserve existing keys not included in newLoaderData and where a loader\n // wasn't removed by HMR\n mergedLoaderData[id] = loaderData[id];\n }\n\n if (errors && errors.hasOwnProperty(id)) {\n // Don't keep any loader data below the boundary\n break;\n }\n }\n return mergedLoaderData;\n}\n\nfunction getActionDataForCommit(\n pendingActionResult: PendingActionResult | undefined\n) {\n if (!pendingActionResult) {\n return {};\n }\n return isErrorResult(pendingActionResult[1])\n ? {\n // Clear out prior actionData on errors\n actionData: {},\n }\n : {\n actionData: {\n [pendingActionResult[0]]: pendingActionResult[1].data,\n },\n };\n}\n\n// Find the nearest error boundary, looking upwards from the leaf route (or the\n// route specified by routeId) for the closest ancestor error boundary,\n// defaulting to the root match\nfunction findNearestBoundary(\n matches: AgnosticDataRouteMatch[],\n routeId?: string\n): AgnosticDataRouteMatch {\n let eligibleMatches = routeId\n ? matches.slice(0, matches.findIndex((m) => m.route.id === routeId) + 1)\n : [...matches];\n return (\n eligibleMatches.reverse().find((m) => m.route.hasErrorBoundary === true) ||\n matches[0]\n );\n}\n\nfunction getShortCircuitMatches(routes: AgnosticDataRouteObject[]): {\n matches: AgnosticDataRouteMatch[];\n route: AgnosticDataRouteObject;\n} {\n // Prefer a root layout route if present, otherwise shim in a route object\n let route =\n routes.length === 1\n ? routes[0]\n : routes.find((r) => r.index || !r.path || r.path === \"/\") || {\n id: `__shim-error-route__`,\n };\n\n return {\n matches: [\n {\n params: {},\n pathname: \"\",\n pathnameBase: \"\",\n route,\n },\n ],\n route,\n };\n}\n\nfunction getInternalRouterError(\n status: number,\n {\n pathname,\n routeId,\n method,\n type,\n message,\n }: {\n pathname?: string;\n routeId?: string;\n method?: string;\n type?: \"defer-action\" | \"invalid-body\";\n message?: string;\n } = {}\n) {\n let statusText = \"Unknown Server Error\";\n let errorMessage = \"Unknown @remix-run/router error\";\n\n if (status === 400) {\n statusText = \"Bad Request\";\n if (method && pathname && routeId) {\n errorMessage =\n `You made a ${method} request to \"${pathname}\" but ` +\n `did not provide a \\`loader\\` for route \"${routeId}\", ` +\n `so there is no way to handle the request.`;\n } else if (type === \"defer-action\") {\n errorMessage = \"defer() is not supported in actions\";\n } else if (type === \"invalid-body\") {\n errorMessage = \"Unable to encode submission body\";\n }\n } else if (status === 403) {\n statusText = \"Forbidden\";\n errorMessage = `Route \"${routeId}\" does not match URL \"${pathname}\"`;\n } else if (status === 404) {\n statusText = \"Not Found\";\n errorMessage = `No route matches URL \"${pathname}\"`;\n } else if (status === 405) {\n statusText = \"Method Not Allowed\";\n if (method && pathname && routeId) {\n errorMessage =\n `You made a ${method.toUpperCase()} request to \"${pathname}\" but ` +\n `did not provide an \\`action\\` for route \"${routeId}\", ` +\n `so there is no way to handle the request.`;\n } else if (method) {\n errorMessage = `Invalid request method \"${method.toUpperCase()}\"`;\n }\n }\n\n return new ErrorResponseImpl(\n status || 500,\n statusText,\n new Error(errorMessage),\n true\n );\n}\n\n// Find any returned redirect errors, starting from the lowest match\nfunction findRedirect(\n results: Record<string, DataResult>\n): { key: string; result: RedirectResult } | undefined {\n let entries = Object.entries(results);\n for (let i = entries.length - 1; i >= 0; i--) {\n let [key, result] = entries[i];\n if (isRedirectResult(result)) {\n return { key, result };\n }\n }\n}\n\nfunction stripHashFromPath(path: To) {\n let parsedPath = typeof path === \"string\" ? parsePath(path) : path;\n return createPath({ ...parsedPath, hash: \"\" });\n}\n\nfunction isHashChangeOnly(a: Location, b: Location): boolean {\n if (a.pathname !== b.pathname || a.search !== b.search) {\n return false;\n }\n\n if (a.hash === \"\") {\n // /page -> /page#hash\n return b.hash !== \"\";\n } else if (a.hash === b.hash) {\n // /page#hash -> /page#hash\n return true;\n } else if (b.hash !== \"\") {\n // /page#hash -> /page#other\n return true;\n }\n\n // If the hash is removed the browser will re-perform a request to the server\n // /page#hash -> /page\n return false;\n}\n\nfunction isPromise<T = unknown>(val: unknown): val is Promise<T> {\n return typeof val === \"object\" && val != null && \"then\" in val;\n}\n\nfunction isDataStrategyResult(result: unknown): result is DataStrategyResult {\n return (\n result != null &&\n typeof result === \"object\" &&\n \"type\" in result &&\n \"result\" in result &&\n (result.type === ResultType.data || result.type === ResultType.error)\n );\n}\n\nfunction isRedirectDataStrategyResultResult(result: DataStrategyResult) {\n return (\n isResponse(result.result) && redirectStatusCodes.has(result.result.status)\n );\n}\n\nfunction isDeferredResult(result: DataResult): result is DeferredResult {\n return result.type === ResultType.deferred;\n}\n\nfunction isErrorResult(result: DataResult): result is ErrorResult {\n return result.type === ResultType.error;\n}\n\nfunction isRedirectResult(result?: DataResult): result is RedirectResult {\n return (result && result.type) === ResultType.redirect;\n}\n\nexport function isDataWithResponseInit(\n value: any\n): value is DataWithResponseInit<unknown> {\n return (\n typeof value === \"object\" &&\n value != null &&\n \"type\" in value &&\n \"data\" in value &&\n \"init\" in value &&\n value.type === \"DataWithResponseInit\"\n );\n}\n\nexport function isDeferredData(value: any): value is DeferredData {\n let deferred: DeferredData = value;\n return (\n deferred &&\n typeof deferred === \"object\" &&\n typeof deferred.data === \"object\" &&\n typeof deferred.subscribe === \"function\" &&\n typeof deferred.cancel === \"function\" &&\n typeof deferred.resolveData === \"function\"\n );\n}\n\nfunction isResponse(value: any): value is Response {\n return (\n value != null &&\n typeof value.status === \"number\" &&\n typeof value.statusText === \"string\" &&\n typeof value.headers === \"object\" &&\n typeof value.body !== \"undefined\"\n );\n}\n\nfunction isRedirectResponse(result: any): result is Response {\n if (!isResponse(result)) {\n return false;\n }\n\n let status = result.status;\n let location = result.headers.get(\"Location\");\n return status >= 300 && status <= 399 && location != null;\n}\n\nfunction isValidMethod(method: string): method is FormMethod | V7_FormMethod {\n return validRequestMethods.has(method.toLowerCase() as FormMethod);\n}\n\nfunction isMutationMethod(\n method: string\n): method is MutationFormMethod | V7_MutationFormMethod {\n return validMutationMethods.has(method.toLowerCase() as MutationFormMethod);\n}\n\nasync function resolveNavigationDeferredResults(\n matches: (AgnosticDataRouteMatch | null)[],\n results: Record<string, DataResult>,\n signal: AbortSignal,\n currentMatches: AgnosticDataRouteMatch[],\n currentLoaderData: RouteData\n) {\n let entries = Object.entries(results);\n for (let index = 0; index < entries.length; index++) {\n let [routeId, result] = entries[index];\n let match = matches.find((m) => m?.route.id === routeId);\n // If we don't have a match, then we can have a deferred result to do\n // anything with. This is for revalidating fetchers where the route was\n // removed during HMR\n if (!match) {\n continue;\n }\n\n let currentMatch = currentMatches.find(\n (m) => m.route.id === match!.route.id\n );\n let isRevalidatingLoader =\n currentMatch != null &&\n !isNewRouteInstance(currentMatch, match) &&\n (currentLoaderData && currentLoaderData[match.route.id]) !== undefined;\n\n if (isDeferredResult(result) && isRevalidatingLoader) {\n // Note: we do not have to touch activeDeferreds here since we race them\n // against the signal in resolveDeferredData and they'll get aborted\n // there if needed\n await resolveDeferredData(result, signal, false).then((result) => {\n if (result) {\n results[routeId] = result;\n }\n });\n }\n }\n}\n\nasync function resolveFetcherDeferredResults(\n matches: (AgnosticDataRouteMatch | null)[],\n results: Record<string, DataResult>,\n revalidatingFetchers: RevalidatingFetcher[]\n) {\n for (let index = 0; index < revalidatingFetchers.length; index++) {\n let { key, routeId, controller } = revalidatingFetchers[index];\n let result = results[key];\n let match = matches.find((m) => m?.route.id === routeId);\n // If we don't have a match, then we can have a deferred result to do\n // anything with. This is for revalidating fetchers where the route was\n // removed during HMR\n if (!match) {\n continue;\n }\n\n if (isDeferredResult(result)) {\n // Note: we do not have to touch activeDeferreds here since we race them\n // against the signal in resolveDeferredData and they'll get aborted\n // there if needed\n invariant(\n controller,\n \"Expected an AbortController for revalidating fetcher deferred result\"\n );\n await resolveDeferredData(result, controller.signal, true).then(\n (result) => {\n if (result) {\n results[key] = result;\n }\n }\n );\n }\n }\n}\n\nasync function resolveDeferredData(\n result: DeferredResult,\n signal: AbortSignal,\n unwrap = false\n): Promise<SuccessResult | ErrorResult | undefined> {\n let aborted = await result.deferredData.resolveData(signal);\n if (aborted) {\n return;\n }\n\n if (unwrap) {\n try {\n return {\n type: ResultType.data,\n data: result.deferredData.unwrappedData,\n };\n } catch (e) {\n // Handle any TrackedPromise._error values encountered while unwrapping\n return {\n type: ResultType.error,\n error: e,\n };\n }\n }\n\n return {\n type: ResultType.data,\n data: result.deferredData.data,\n };\n}\n\nfunction hasNakedIndexQuery(search: string): boolean {\n return new URLSearchParams(search).getAll(\"index\").some((v) => v === \"\");\n}\n\nfunction getTargetMatch(\n matches: AgnosticDataRouteMatch[],\n location: Location | string\n) {\n let search =\n typeof location === \"string\" ? parsePath(location).search : location.search;\n if (\n matches[matches.length - 1].route.index &&\n hasNakedIndexQuery(search || \"\")\n ) {\n // Return the leaf index route when index is present\n return matches[matches.length - 1];\n }\n // Otherwise grab the deepest \"path contributing\" match (ignoring index and\n // pathless layout routes)\n let pathMatches = getPathContributingMatches(matches);\n return pathMatches[pathMatches.length - 1];\n}\n\nfunction getSubmissionFromNavigation(\n navigation: Navigation\n): Submission | undefined {\n let { formMethod, formAction, formEncType, text, formData, json } =\n navigation;\n if (!formMethod || !formAction || !formEncType) {\n return;\n }\n\n if (text != null) {\n return {\n formMethod,\n formAction,\n formEncType,\n formData: undefined,\n json: undefined,\n text,\n };\n } else if (formData != null) {\n return {\n formMethod,\n formAction,\n formEncType,\n formData,\n json: undefined,\n text: undefined,\n };\n } else if (json !== undefined) {\n return {\n formMethod,\n formAction,\n formEncType,\n formData: undefined,\n json,\n text: undefined,\n };\n }\n}\n\nfunction getLoadingNavigation(\n location: Location,\n submission?: Submission\n): NavigationStates[\"Loading\"] {\n if (submission) {\n let navigation: NavigationStates[\"Loading\"] = {\n state: \"loading\",\n location,\n formMethod: submission.formMethod,\n formAction: submission.formAction,\n formEncType: submission.formEncType,\n formData: submission.formData,\n json: submission.json,\n text: submission.text,\n };\n return navigation;\n } else {\n let navigation: NavigationStates[\"Loading\"] = {\n state: \"loading\",\n location,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n json: undefined,\n text: undefined,\n };\n return navigation;\n }\n}\n\nfunction getSubmittingNavigation(\n location: Location,\n submission: Submission\n): NavigationStates[\"Submitting\"] {\n let navigation: NavigationStates[\"Submitting\"] = {\n state: \"submitting\",\n location,\n formMethod: submission.formMethod,\n formAction: submission.formAction,\n formEncType: submission.formEncType,\n formData: submission.formData,\n json: submission.json,\n text: submission.text,\n };\n return navigation;\n}\n\nfunction getLoadingFetcher(\n submission?: Submission,\n data?: Fetcher[\"data\"]\n): FetcherStates[\"Loading\"] {\n if (submission) {\n let fetcher: FetcherStates[\"Loading\"] = {\n state: \"loading\",\n formMethod: submission.formMethod,\n formAction: submission.formAction,\n formEncType: submission.formEncType,\n formData: submission.formData,\n json: submission.json,\n text: submission.text,\n data,\n };\n return fetcher;\n } else {\n let fetcher: FetcherStates[\"Loading\"] = {\n state: \"loading\",\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n json: undefined,\n text: undefined,\n data,\n };\n return fetcher;\n }\n}\n\nfunction getSubmittingFetcher(\n submission: Submission,\n existingFetcher?: Fetcher\n): FetcherStates[\"Submitting\"] {\n let fetcher: FetcherStates[\"Submitting\"] = {\n state: \"submitting\",\n formMethod: submission.formMethod,\n formAction: submission.formAction,\n formEncType: submission.formEncType,\n formData: submission.formData,\n json: submission.json,\n text: submission.text,\n data: existingFetcher ? existingFetcher.data : undefined,\n };\n return fetcher;\n}\n\nfunction getDoneFetcher(data: Fetcher[\"data\"]): FetcherStates[\"Idle\"] {\n let fetcher: FetcherStates[\"Idle\"] = {\n state: \"idle\",\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n json: undefined,\n text: undefined,\n data,\n };\n return fetcher;\n}\n\nfunction restoreAppliedTransitions(\n _window: Window,\n transitions: Map<string, Set<string>>\n) {\n try {\n let sessionPositions = _window.sessionStorage.getItem(\n TRANSITIONS_STORAGE_KEY\n );\n if (sessionPositions) {\n let json = JSON.parse(sessionPositions);\n for (let [k, v] of Object.entries(json || {})) {\n if (v && Array.isArray(v)) {\n transitions.set(k, new Set(v || []));\n }\n }\n }\n } catch (e) {\n // no-op, use default empty object\n }\n}\n\nfunction persistAppliedTransitions(\n _window: Window,\n transitions: Map<string, Set<string>>\n) {\n if (transitions.size > 0) {\n let json: Record<string, string[]> = {};\n for (let [k, v] of transitions) {\n json[k] = [...v];\n }\n try {\n _window.sessionStorage.setItem(\n TRANSITIONS_STORAGE_KEY,\n JSON.stringify(json)\n );\n } catch (error) {\n warning(\n false,\n `Failed to save applied view transitions in sessionStorage (${error}).`\n );\n }\n }\n}\n//#endregion\n","import * as React from \"react\";\nimport type {\n AgnosticIndexRouteObject,\n AgnosticNonIndexRouteObject,\n AgnosticRouteMatch,\n History,\n LazyRouteFunction,\n Location,\n Action as NavigationType,\n RelativeRoutingType,\n Router,\n StaticHandlerContext,\n To,\n TrackedPromise,\n} from \"@remix-run/router\";\n\n// Create react-specific types from the agnostic types in @remix-run/router to\n// export from react-router\nexport interface IndexRouteObject {\n caseSensitive?: AgnosticIndexRouteObject[\"caseSensitive\"];\n path?: AgnosticIndexRouteObject[\"path\"];\n id?: AgnosticIndexRouteObject[\"id\"];\n loader?: AgnosticIndexRouteObject[\"loader\"];\n action?: AgnosticIndexRouteObject[\"action\"];\n hasErrorBoundary?: AgnosticIndexRouteObject[\"hasErrorBoundary\"];\n shouldRevalidate?: AgnosticIndexRouteObject[\"shouldRevalidate\"];\n handle?: AgnosticIndexRouteObject[\"handle\"];\n index: true;\n children?: undefined;\n element?: React.ReactNode | null;\n hydrateFallbackElement?: React.ReactNode | null;\n errorElement?: React.ReactNode | null;\n Component?: React.ComponentType | null;\n HydrateFallback?: React.ComponentType | null;\n ErrorBoundary?: React.ComponentType | null;\n lazy?: LazyRouteFunction<RouteObject>;\n}\n\nexport interface NonIndexRouteObject {\n caseSensitive?: AgnosticNonIndexRouteObject[\"caseSensitive\"];\n path?: AgnosticNonIndexRouteObject[\"path\"];\n id?: AgnosticNonIndexRouteObject[\"id\"];\n loader?: AgnosticNonIndexRouteObject[\"loader\"];\n action?: AgnosticNonIndexRouteObject[\"action\"];\n hasErrorBoundary?: AgnosticNonIndexRouteObject[\"hasErrorBoundary\"];\n shouldRevalidate?: AgnosticNonIndexRouteObject[\"shouldRevalidate\"];\n handle?: AgnosticNonIndexRouteObject[\"handle\"];\n index?: false;\n children?: RouteObject[];\n element?: React.ReactNode | null;\n hydrateFallbackElement?: React.ReactNode | null;\n errorElement?: React.ReactNode | null;\n Component?: React.ComponentType | null;\n HydrateFallback?: React.ComponentType | null;\n ErrorBoundary?: React.ComponentType | null;\n lazy?: LazyRouteFunction<RouteObject>;\n}\n\nexport type RouteObject = IndexRouteObject | NonIndexRouteObject;\n\nexport type DataRouteObject = RouteObject & {\n children?: DataRouteObject[];\n id: string;\n};\n\nexport interface RouteMatch<\n ParamKey extends string = string,\n RouteObjectType extends RouteObject = RouteObject\n> extends AgnosticRouteMatch<ParamKey, RouteObjectType> {}\n\nexport interface DataRouteMatch extends RouteMatch<string, DataRouteObject> {}\n\nexport interface DataRouterContextObject\n // Omit `future` since those can be pulled from the `router`\n // `NavigationContext` needs future since it doesn't have a `router` in all cases\n extends Omit<NavigationContextObject, \"future\"> {\n router: Router;\n staticContext?: StaticHandlerContext;\n}\n\nexport const DataRouterContext =\n React.createContext<DataRouterContextObject | null>(null);\nif (__DEV__) {\n DataRouterContext.displayName = \"DataRouter\";\n}\n\nexport const DataRouterStateContext = React.createContext<\n Router[\"state\"] | null\n>(null);\nif (__DEV__) {\n DataRouterStateContext.displayName = \"DataRouterState\";\n}\n\nexport const AwaitContext = React.createContext<TrackedPromise | null>(null);\nif (__DEV__) {\n AwaitContext.displayName = \"Await\";\n}\n\nexport interface NavigateOptions {\n replace?: boolean;\n state?: any;\n preventScrollReset?: boolean;\n relative?: RelativeRoutingType;\n flushSync?: boolean;\n viewTransition?: boolean;\n}\n\n/**\n * A Navigator is a \"location changer\"; it's how you get to different locations.\n *\n * Every history instance conforms to the Navigator interface, but the\n * distinction is useful primarily when it comes to the low-level `<Router>` API\n * where both the location and a navigator must be provided separately in order\n * to avoid \"tearing\" that may occur in a suspense-enabled app if the action\n * and/or location were to be read directly from the history instance.\n */\nexport interface Navigator {\n createHref: History[\"createHref\"];\n // Optional for backwards-compat with Router/HistoryRouter usage (edge case)\n encodeLocation?: History[\"encodeLocation\"];\n go: History[\"go\"];\n push(to: To, state?: any, opts?: NavigateOptions): void;\n replace(to: To, state?: any, opts?: NavigateOptions): void;\n}\n\ninterface NavigationContextObject {\n basename: string;\n navigator: Navigator;\n static: boolean;\n future: {\n v7_relativeSplatPath: boolean;\n };\n}\n\nexport const NavigationContext = React.createContext<NavigationContextObject>(\n null!\n);\n\nif (__DEV__) {\n NavigationContext.displayName = \"Navigation\";\n}\n\ninterface LocationContextObject {\n location: Location;\n navigationType: NavigationType;\n}\n\nexport const LocationContext = React.createContext<LocationContextObject>(\n null!\n);\n\nif (__DEV__) {\n LocationContext.displayName = \"Location\";\n}\n\nexport interface RouteContextObject {\n outlet: React.ReactElement | null;\n matches: RouteMatch[];\n isDataRoute: boolean;\n}\n\nexport const RouteContext = React.createContext<RouteContextObject>({\n outlet: null,\n matches: [],\n isDataRoute: false,\n});\n\nif (__DEV__) {\n RouteContext.displayName = \"Route\";\n}\n\nexport const RouteErrorContext = React.createContext<any>(null);\n\nif (__DEV__) {\n RouteErrorContext.displayName = \"RouteError\";\n}\n","import * as React from \"react\";\nimport type {\n AgnosticRouteMatch,\n Blocker,\n BlockerFunction,\n Location,\n ParamParseKey,\n Params,\n Path,\n PathMatch,\n PathPattern,\n RelativeRoutingType,\n Router as RemixRouter,\n RevalidationState,\n To,\n UIMatch,\n} from \"@remix-run/router\";\nimport {\n IDLE_BLOCKER,\n Action as NavigationType,\n UNSAFE_convertRouteMatchToUiMatch as convertRouteMatchToUiMatch,\n UNSAFE_decodePath as decodePath,\n UNSAFE_getResolveToMatches as getResolveToMatches,\n UNSAFE_invariant as invariant,\n isRouteErrorResponse,\n joinPaths,\n matchPath,\n matchRoutes,\n parsePath,\n resolveTo,\n stripBasename,\n UNSAFE_warning as warning,\n} from \"@remix-run/router\";\n\nimport type {\n DataRouteMatch,\n NavigateOptions,\n RouteContextObject,\n RouteMatch,\n RouteObject,\n} from \"./context\";\nimport {\n AwaitContext,\n DataRouterContext,\n DataRouterStateContext,\n LocationContext,\n NavigationContext,\n RouteContext,\n RouteErrorContext,\n} from \"./context\";\n\n/**\n * Returns the full href for the given \"to\" value. This is useful for building\n * custom links that are also accessible and preserve right-click behavior.\n *\n * @see https://reactrouter.com/v6/hooks/use-href\n */\nexport function useHref(\n to: To,\n { relative }: { relative?: RelativeRoutingType } = {}\n): string {\n invariant(\n useInRouterContext(),\n // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n `useHref() may be used only in the context of a <Router> component.`\n );\n\n let { basename, navigator } = React.useContext(NavigationContext);\n let { hash, pathname, search } = useResolvedPath(to, { relative });\n\n let joinedPathname = pathname;\n\n // If we're operating within a basename, prepend it to the pathname prior\n // to creating the href. If this is a root navigation, then just use the raw\n // basename which allows the basename to have full control over the presence\n // of a trailing slash on root links\n if (basename !== \"/\") {\n joinedPathname =\n pathname === \"/\" ? basename : joinPaths([basename, pathname]);\n }\n\n return navigator.createHref({ pathname: joinedPathname, search, hash });\n}\n\n/**\n * Returns true if this component is a descendant of a `<Router>`.\n *\n * @see https://reactrouter.com/v6/hooks/use-in-router-context\n */\nexport function useInRouterContext(): boolean {\n return React.useContext(LocationContext) != null;\n}\n\n/**\n * Returns the current location object, which represents the current URL in web\n * browsers.\n *\n * Note: If you're using this it may mean you're doing some of your own\n * \"routing\" in your app, and we'd like to know what your use case is. We may\n * be able to provide something higher-level to better suit your needs.\n *\n * @see https://reactrouter.com/v6/hooks/use-location\n */\nexport function useLocation(): Location {\n invariant(\n useInRouterContext(),\n // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n `useLocation() may be used only in the context of a <Router> component.`\n );\n\n return React.useContext(LocationContext).location;\n}\n\n/**\n * Returns the current navigation action which describes how the router came to\n * the current location, either by a pop, push, or replace on the history stack.\n *\n * @see https://reactrouter.com/v6/hooks/use-navigation-type\n */\nexport function useNavigationType(): NavigationType {\n return React.useContext(LocationContext).navigationType;\n}\n\n/**\n * Returns a PathMatch object if the given pattern matches the current URL.\n * This is useful for components that need to know \"active\" state, e.g.\n * `<NavLink>`.\n *\n * @see https://reactrouter.com/v6/hooks/use-match\n */\nexport function useMatch<\n ParamKey extends ParamParseKey<Path>,\n Path extends string\n>(pattern: PathPattern<Path> | Path): PathMatch<ParamKey> | null {\n invariant(\n useInRouterContext(),\n // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n `useMatch() may be used only in the context of a <Router> component.`\n );\n\n let { pathname } = useLocation();\n return React.useMemo(\n () => matchPath<ParamKey, Path>(pattern, decodePath(pathname)),\n [pathname, pattern]\n );\n}\n\n/**\n * The interface for the navigate() function returned from useNavigate().\n */\nexport interface NavigateFunction {\n (to: To, options?: NavigateOptions): void;\n (delta: number): void;\n}\n\nconst navigateEffectWarning =\n `You should call navigate() in a React.useEffect(), not when ` +\n `your component is first rendered.`;\n\n// Mute warnings for calls to useNavigate in SSR environments\nfunction useIsomorphicLayoutEffect(\n cb: Parameters<typeof React.useLayoutEffect>[0]\n) {\n let isStatic = React.useContext(NavigationContext).static;\n if (!isStatic) {\n // We should be able to get rid of this once react 18.3 is released\n // See: https://github.com/facebook/react/pull/26395\n // eslint-disable-next-line react-hooks/rules-of-hooks\n React.useLayoutEffect(cb);\n }\n}\n\n/**\n * Returns an imperative method for changing the location. Used by `<Link>`s, but\n * may also be used by other elements to change the location.\n *\n * @see https://reactrouter.com/v6/hooks/use-navigate\n */\nexport function useNavigate(): NavigateFunction {\n let { isDataRoute } = React.useContext(RouteContext);\n // Conditional usage is OK here because the usage of a data router is static\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return isDataRoute ? useNavigateStable() : useNavigateUnstable();\n}\n\nfunction useNavigateUnstable(): NavigateFunction {\n invariant(\n useInRouterContext(),\n // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n `useNavigate() may be used only in the context of a <Router> component.`\n );\n\n let dataRouterContext = React.useContext(DataRouterContext);\n let { basename, future, navigator } = React.useContext(NavigationContext);\n let { matches } = React.useContext(RouteContext);\n let { pathname: locationPathname } = useLocation();\n\n let routePathnamesJson = JSON.stringify(\n getResolveToMatches(matches, future.v7_relativeSplatPath)\n );\n\n let activeRef = React.useRef(false);\n useIsomorphicLayoutEffect(() => {\n activeRef.current = true;\n });\n\n let navigate: NavigateFunction = React.useCallback(\n (to: To | number, options: NavigateOptions = {}) => {\n warning(activeRef.current, navigateEffectWarning);\n\n // Short circuit here since if this happens on first render the navigate\n // is useless because we haven't wired up our history listener yet\n if (!activeRef.current) return;\n\n if (typeof to === \"number\") {\n navigator.go(to);\n return;\n }\n\n let path = resolveTo(\n to,\n JSON.parse(routePathnamesJson),\n locationPathname,\n options.relative === \"path\"\n );\n\n // If we're operating within a basename, prepend it to the pathname prior\n // to handing off to history (but only if we're not in a data router,\n // otherwise it'll prepend the basename inside of the router).\n // If this is a root navigation, then we navigate to the raw basename\n // which allows the basename to have full control over the presence of a\n // trailing slash on root links\n if (dataRouterContext == null && basename !== \"/\") {\n path.pathname =\n path.pathname === \"/\"\n ? basename\n : joinPaths([basename, path.pathname]);\n }\n\n (!!options.replace ? navigator.replace : navigator.push)(\n path,\n options.state,\n options\n );\n },\n [\n basename,\n navigator,\n routePathnamesJson,\n locationPathname,\n dataRouterContext,\n ]\n );\n\n return navigate;\n}\n\nconst OutletContext = React.createContext<unknown>(null);\n\n/**\n * Returns the context (if provided) for the child route at this level of the route\n * hierarchy.\n * @see https://reactrouter.com/v6/hooks/use-outlet-context\n */\nexport function useOutletContext<Context = unknown>(): Context {\n return React.useContext(OutletContext) as Context;\n}\n\n/**\n * Returns the element for the child route at this level of the route\n * hierarchy. Used internally by `<Outlet>` to render child routes.\n *\n * @see https://reactrouter.com/v6/hooks/use-outlet\n */\nexport function useOutlet(context?: unknown): React.ReactElement | null {\n let outlet = React.useContext(RouteContext).outlet;\n if (outlet) {\n return (\n <OutletContext.Provider value={context}>{outlet}</OutletContext.Provider>\n );\n }\n return outlet;\n}\n\n/**\n * Returns an object of key/value pairs of the dynamic params from the current\n * URL that were matched by the route path.\n *\n * @see https://reactrouter.com/v6/hooks/use-params\n */\nexport function useParams<\n ParamsOrKey extends string | Record<string, string | undefined> = string\n>(): Readonly<\n [ParamsOrKey] extends [string] ? Params<ParamsOrKey> : Partial<ParamsOrKey>\n> {\n let { matches } = React.useContext(RouteContext);\n let routeMatch = matches[matches.length - 1];\n return routeMatch ? (routeMatch.params as any) : {};\n}\n\n/**\n * Resolves the pathname of the given `to` value against the current location.\n *\n * @see https://reactrouter.com/v6/hooks/use-resolved-path\n */\nexport function useResolvedPath(\n to: To,\n { relative }: { relative?: RelativeRoutingType } = {}\n): Path {\n let { future } = React.useContext(NavigationContext);\n let { matches } = React.useContext(RouteContext);\n let { pathname: locationPathname } = useLocation();\n let routePathnamesJson = JSON.stringify(\n getResolveToMatches(matches, future.v7_relativeSplatPath)\n );\n\n return React.useMemo(\n () =>\n resolveTo(\n to,\n JSON.parse(routePathnamesJson),\n locationPathname,\n relative === \"path\"\n ),\n [to, routePathnamesJson, locationPathname, relative]\n );\n}\n\n/**\n * Returns the element of the route that matched the current location, prepared\n * with the correct context to render the remainder of the route tree. Route\n * elements in the tree must render an `<Outlet>` to render their child route's\n * element.\n *\n * @see https://reactrouter.com/v6/hooks/use-routes\n */\nexport function useRoutes(\n routes: RouteObject[],\n locationArg?: Partial<Location> | string\n): React.ReactElement | null {\n return useRoutesImpl(routes, locationArg);\n}\n\n// Internal implementation with accept optional param for RouterProvider usage\nexport function useRoutesImpl(\n routes: RouteObject[],\n locationArg?: Partial<Location> | string,\n dataRouterState?: RemixRouter[\"state\"],\n future?: RemixRouter[\"future\"]\n): React.ReactElement | null {\n invariant(\n useInRouterContext(),\n // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n `useRoutes() may be used only in the context of a <Router> component.`\n );\n\n let { navigator, static: isStatic } = React.useContext(NavigationContext);\n let { matches: parentMatches } = React.useContext(RouteContext);\n let routeMatch = parentMatches[parentMatches.length - 1];\n let parentParams = routeMatch ? routeMatch.params : {};\n let parentPathname = routeMatch ? routeMatch.pathname : \"/\";\n let parentPathnameBase = routeMatch ? routeMatch.pathnameBase : \"/\";\n let parentRoute = routeMatch && routeMatch.route;\n\n if (__DEV__) {\n // You won't get a warning about 2 different <Routes> under a <Route>\n // without a trailing *, but this is a best-effort warning anyway since we\n // cannot even give the warning unless they land at the parent route.\n //\n // Example:\n //\n // <Routes>\n // {/* This route path MUST end with /* because otherwise\n // it will never match /blog/post/123 */}\n // <Route path=\"blog\" element={<Blog />} />\n // <Route path=\"blog/feed\" element={<BlogFeed />} />\n // </Routes>\n //\n // function Blog() {\n // return (\n // <Routes>\n // <Route path=\"post/:id\" element={<Post />} />\n // </Routes>\n // );\n // }\n let parentPath = (parentRoute && parentRoute.path) || \"\";\n warningOnce(\n parentPathname,\n !parentRoute || parentPath.endsWith(\"*\"),\n `You rendered descendant <Routes> (or called \\`useRoutes()\\`) at ` +\n `\"${parentPathname}\" (under <Route path=\"${parentPath}\">) but the ` +\n `parent route path has no trailing \"*\". This means if you navigate ` +\n `deeper, the parent won't match anymore and therefore the child ` +\n `routes will never render.\\n\\n` +\n `Please change the parent <Route path=\"${parentPath}\"> to <Route ` +\n `path=\"${parentPath === \"/\" ? \"*\" : `${parentPath}/*`}\">.`\n );\n }\n\n let locationFromContext = useLocation();\n\n let location;\n if (locationArg) {\n let parsedLocationArg =\n typeof locationArg === \"string\" ? parsePath(locationArg) : locationArg;\n\n invariant(\n parentPathnameBase === \"/\" ||\n parsedLocationArg.pathname?.startsWith(parentPathnameBase),\n `When overriding the location using \\`<Routes location>\\` or \\`useRoutes(routes, location)\\`, ` +\n `the location pathname must begin with the portion of the URL pathname that was ` +\n `matched by all parent routes. The current pathname base is \"${parentPathnameBase}\" ` +\n `but pathname \"${parsedLocationArg.pathname}\" was given in the \\`location\\` prop.`\n );\n\n location = parsedLocationArg;\n } else {\n location = locationFromContext;\n }\n\n let pathname = location.pathname || \"/\";\n\n let remainingPathname = pathname;\n if (parentPathnameBase !== \"/\") {\n // Determine the remaining pathname by removing the # of URL segments the\n // parentPathnameBase has, instead of removing based on character count.\n // This is because we can't guarantee that incoming/outgoing encodings/\n // decodings will match exactly.\n // We decode paths before matching on a per-segment basis with\n // decodeURIComponent(), but we re-encode pathnames via `new URL()` so they\n // match what `window.location.pathname` would reflect. Those don't 100%\n // align when it comes to encoded URI characters such as % and &.\n //\n // So we may end up with:\n // pathname: \"/descendant/a%25b/match\"\n // parentPathnameBase: \"/descendant/a%b\"\n //\n // And the direct substring removal approach won't work :/\n let parentSegments = parentPathnameBase.replace(/^\\//, \"\").split(\"/\");\n let segments = pathname.replace(/^\\//, \"\").split(\"/\");\n remainingPathname = \"/\" + segments.slice(parentSegments.length).join(\"/\");\n }\n\n let matches =\n !isStatic &&\n dataRouterState &&\n dataRouterState.matches &&\n dataRouterState.matches.length > 0\n ? (dataRouterState.matches as AgnosticRouteMatch<string, RouteObject>[])\n : matchRoutes(routes, { pathname: remainingPathname });\n\n if (__DEV__) {\n warning(\n parentRoute || matches != null,\n `No routes matched location \"${location.pathname}${location.search}${location.hash}\" `\n );\n\n warning(\n matches == null ||\n matches[matches.length - 1].route.element !== undefined ||\n matches[matches.length - 1].route.Component !== undefined ||\n matches[matches.length - 1].route.lazy !== undefined,\n `Matched leaf route at location \"${location.pathname}${location.search}${location.hash}\" ` +\n `does not have an element or Component. This means it will render an <Outlet /> with a ` +\n `null value by default resulting in an \"empty\" page.`\n );\n }\n\n let renderedMatches = _renderMatches(\n matches &&\n matches.map((match) =>\n Object.assign({}, match, {\n params: Object.assign({}, parentParams, match.params),\n pathname: joinPaths([\n parentPathnameBase,\n // Re-encode pathnames that were decoded inside matchRoutes\n navigator.encodeLocation\n ? navigator.encodeLocation(match.pathname).pathname\n : match.pathname,\n ]),\n pathnameBase:\n match.pathnameBase === \"/\"\n ? parentPathnameBase\n : joinPaths([\n parentPathnameBase,\n // Re-encode pathnames that were decoded inside matchRoutes\n navigator.encodeLocation\n ? navigator.encodeLocation(match.pathnameBase).pathname\n : match.pathnameBase,\n ]),\n })\n ),\n parentMatches,\n dataRouterState,\n future\n );\n\n // When a user passes in a `locationArg`, the associated routes need to\n // be wrapped in a new `LocationContext.Provider` in order for `useLocation`\n // to use the scoped location instead of the global location.\n if (locationArg && renderedMatches) {\n return (\n <LocationContext.Provider\n value={{\n location: {\n pathname: \"/\",\n search: \"\",\n hash: \"\",\n state: null,\n key: \"default\",\n ...location,\n },\n navigationType: NavigationType.Pop,\n }}\n >\n {renderedMatches}\n </LocationContext.Provider>\n );\n }\n\n return renderedMatches;\n}\n\nfunction DefaultErrorComponent() {\n let error = useRouteError();\n let message = isRouteErrorResponse(error)\n ? `${error.status} ${error.statusText}`\n : error instanceof Error\n ? error.message\n : JSON.stringify(error);\n let stack = error instanceof Error ? error.stack : null;\n let lightgrey = \"rgba(200,200,200, 0.5)\";\n let preStyles = { padding: \"0.5rem\", backgroundColor: lightgrey };\n let codeStyles = { padding: \"2px 4px\", backgroundColor: lightgrey };\n\n let devInfo = null;\n if (__DEV__) {\n console.error(\n \"Error handled by React Router default ErrorBoundary:\",\n error\n );\n\n devInfo = (\n <>\n <p>💿 Hey developer 👋</p>\n <p>\n You can provide a way better UX than this when your app throws errors\n by providing your own <code style={codeStyles}>ErrorBoundary</code> or{\" \"}\n <code style={codeStyles}>errorElement</code> prop on your route.\n </p>\n </>\n );\n }\n\n return (\n <>\n <h2>Unexpected Application Error!</h2>\n <h3 style={{ fontStyle: \"italic\" }}>{message}</h3>\n {stack ? <pre style={preStyles}>{stack}</pre> : null}\n {devInfo}\n </>\n );\n}\n\nconst defaultErrorElement = <DefaultErrorComponent />;\n\ntype RenderErrorBoundaryProps = React.PropsWithChildren<{\n location: Location;\n revalidation: RevalidationState;\n error: any;\n component: React.ReactNode;\n routeContext: RouteContextObject;\n}>;\n\ntype RenderErrorBoundaryState = {\n location: Location;\n revalidation: RevalidationState;\n error: any;\n};\n\nexport class RenderErrorBoundary extends React.Component<\n RenderErrorBoundaryProps,\n RenderErrorBoundaryState\n> {\n constructor(props: RenderErrorBoundaryProps) {\n super(props);\n this.state = {\n location: props.location,\n revalidation: props.revalidation,\n error: props.error,\n };\n }\n\n static getDerivedStateFromError(error: any) {\n return { error: error };\n }\n\n static getDerivedStateFromProps(\n props: RenderErrorBoundaryProps,\n state: RenderErrorBoundaryState\n ) {\n // When we get into an error state, the user will likely click \"back\" to the\n // previous page that didn't have an error. Because this wraps the entire\n // application, that will have no effect--the error page continues to display.\n // This gives us a mechanism to recover from the error when the location changes.\n //\n // Whether we're in an error state or not, we update the location in state\n // so that when we are in an error state, it gets reset when a new location\n // comes in and the user recovers from the error.\n if (\n state.location !== props.location ||\n (state.revalidation !== \"idle\" && props.revalidation === \"idle\")\n ) {\n return {\n error: props.error,\n location: props.location,\n revalidation: props.revalidation,\n };\n }\n\n // If we're not changing locations, preserve the location but still surface\n // any new errors that may come through. We retain the existing error, we do\n // this because the error provided from the app state may be cleared without\n // the location changing.\n return {\n error: props.error !== undefined ? props.error : state.error,\n location: state.location,\n revalidation: props.revalidation || state.revalidation,\n };\n }\n\n componentDidCatch(error: any, errorInfo: any) {\n console.error(\n \"React Router caught the following error during render\",\n error,\n errorInfo\n );\n }\n\n render() {\n return this.state.error !== undefined ? (\n <RouteContext.Provider value={this.props.routeContext}>\n <RouteErrorContext.Provider\n value={this.state.error}\n children={this.props.component}\n />\n </RouteContext.Provider>\n ) : (\n this.props.children\n );\n }\n}\n\ninterface RenderedRouteProps {\n routeContext: RouteContextObject;\n match: RouteMatch<string, RouteObject>;\n children: React.ReactNode | null;\n}\n\nfunction RenderedRoute({ routeContext, match, children }: RenderedRouteProps) {\n let dataRouterContext = React.useContext(DataRouterContext);\n\n // Track how deep we got in our render pass to emulate SSR componentDidCatch\n // in a DataStaticRouter\n if (\n dataRouterContext &&\n dataRouterContext.static &&\n dataRouterContext.staticContext &&\n (match.route.errorElement || match.route.ErrorBoundary)\n ) {\n dataRouterContext.staticContext._deepestRenderedBoundaryId = match.route.id;\n }\n\n return (\n <RouteContext.Provider value={routeContext}>\n {children}\n </RouteContext.Provider>\n );\n}\n\nexport function _renderMatches(\n matches: RouteMatch[] | null,\n parentMatches: RouteMatch[] = [],\n dataRouterState: RemixRouter[\"state\"] | null = null,\n future: RemixRouter[\"future\"] | null = null\n): React.ReactElement | null {\n if (matches == null) {\n if (!dataRouterState) {\n return null;\n }\n\n if (dataRouterState.errors) {\n // Don't bail if we have data router errors so we can render them in the\n // boundary. Use the pre-matched (or shimmed) matches\n matches = dataRouterState.matches as DataRouteMatch[];\n } else if (\n future?.v7_partialHydration &&\n parentMatches.length === 0 &&\n !dataRouterState.initialized &&\n dataRouterState.matches.length > 0\n ) {\n // Don't bail if we're initializing with partial hydration and we have\n // router matches. That means we're actively running `patchRoutesOnNavigation`\n // so we should render down the partial matches to the appropriate\n // `HydrateFallback`. We only do this if `parentMatches` is empty so it\n // only impacts the root matches for `RouterProvider` and no descendant\n // `<Routes>`\n matches = dataRouterState.matches as DataRouteMatch[];\n } else {\n return null;\n }\n }\n\n let renderedMatches = matches;\n\n // If we have data errors, trim matches to the highest error boundary\n let errors = dataRouterState?.errors;\n if (errors != null) {\n let errorIndex = renderedMatches.findIndex(\n (m) => m.route.id && errors?.[m.route.id] !== undefined\n );\n invariant(\n errorIndex >= 0,\n `Could not find a matching route for errors on route IDs: ${Object.keys(\n errors\n ).join(\",\")}`\n );\n renderedMatches = renderedMatches.slice(\n 0,\n Math.min(renderedMatches.length, errorIndex + 1)\n );\n }\n\n // If we're in a partial hydration mode, detect if we need to render down to\n // a given HydrateFallback while we load the rest of the hydration data\n let renderFallback = false;\n let fallbackIndex = -1;\n if (dataRouterState && future && future.v7_partialHydration) {\n for (let i = 0; i < renderedMatches.length; i++) {\n let match = renderedMatches[i];\n // Track the deepest fallback up until the first route without data\n if (match.route.HydrateFallback || match.route.hydrateFallbackElement) {\n fallbackIndex = i;\n }\n\n if (match.route.id) {\n let { loaderData, errors } = dataRouterState;\n let needsToRunLoader =\n match.route.loader &&\n loaderData[match.route.id] === undefined &&\n (!errors || errors[match.route.id] === undefined);\n if (match.route.lazy || needsToRunLoader) {\n // We found the first route that's not ready to render (waiting on\n // lazy, or has a loader that hasn't run yet). Flag that we need to\n // render a fallback and render up until the appropriate fallback\n renderFallback = true;\n if (fallbackIndex >= 0) {\n renderedMatches = renderedMatches.slice(0, fallbackIndex + 1);\n } else {\n renderedMatches = [renderedMatches[0]];\n }\n break;\n }\n }\n }\n }\n\n return renderedMatches.reduceRight((outlet, match, index) => {\n // Only data routers handle errors/fallbacks\n let error: any;\n let shouldRenderHydrateFallback = false;\n let errorElement: React.ReactNode | null = null;\n let hydrateFallbackElement: React.ReactNode | null = null;\n if (dataRouterState) {\n error = errors && match.route.id ? errors[match.route.id] : undefined;\n errorElement = match.route.errorElement || defaultErrorElement;\n\n if (renderFallback) {\n if (fallbackIndex < 0 && index === 0) {\n warningOnce(\n \"route-fallback\",\n false,\n \"No `HydrateFallback` element provided to render during initial hydration\"\n );\n shouldRenderHydrateFallback = true;\n hydrateFallbackElement = null;\n } else if (fallbackIndex === index) {\n shouldRenderHydrateFallback = true;\n hydrateFallbackElement = match.route.hydrateFallbackElement || null;\n }\n }\n }\n\n let matches = parentMatches.concat(renderedMatches.slice(0, index + 1));\n let getChildren = () => {\n let children: React.ReactNode;\n if (error) {\n children = errorElement;\n } else if (shouldRenderHydrateFallback) {\n children = hydrateFallbackElement;\n } else if (match.route.Component) {\n // Note: This is a de-optimized path since React won't re-use the\n // ReactElement since it's identity changes with each new\n // React.createElement call. We keep this so folks can use\n // `<Route Component={...}>` in `<Routes>` but generally `Component`\n // usage is only advised in `RouterProvider` when we can convert it to\n // `element` ahead of time.\n children = <match.route.Component />;\n } else if (match.route.element) {\n children = match.route.element;\n } else {\n children = outlet;\n }\n return (\n <RenderedRoute\n match={match}\n routeContext={{\n outlet,\n matches,\n isDataRoute: dataRouterState != null,\n }}\n children={children}\n />\n );\n };\n // Only wrap in an error boundary within data router usages when we have an\n // ErrorBoundary/errorElement on this route. Otherwise let it bubble up to\n // an ancestor ErrorBoundary/errorElement\n return dataRouterState &&\n (match.route.ErrorBoundary || match.route.errorElement || index === 0) ? (\n <RenderErrorBoundary\n location={dataRouterState.location}\n revalidation={dataRouterState.revalidation}\n component={errorElement}\n error={error}\n children={getChildren()}\n routeContext={{ outlet: null, matches, isDataRoute: true }}\n />\n ) : (\n getChildren()\n );\n }, null as React.ReactElement | null);\n}\n\nenum DataRouterHook {\n UseBlocker = \"useBlocker\",\n UseRevalidator = \"useRevalidator\",\n UseNavigateStable = \"useNavigate\",\n}\n\nenum DataRouterStateHook {\n UseBlocker = \"useBlocker\",\n UseLoaderData = \"useLoaderData\",\n UseActionData = \"useActionData\",\n UseRouteError = \"useRouteError\",\n UseNavigation = \"useNavigation\",\n UseRouteLoaderData = \"useRouteLoaderData\",\n UseMatches = \"useMatches\",\n UseRevalidator = \"useRevalidator\",\n UseNavigateStable = \"useNavigate\",\n UseRouteId = \"useRouteId\",\n}\n\nfunction getDataRouterConsoleError(\n hookName: DataRouterHook | DataRouterStateHook\n) {\n return `${hookName} must be used within a data router. See https://reactrouter.com/v6/routers/picking-a-router.`;\n}\n\nfunction useDataRouterContext(hookName: DataRouterHook) {\n let ctx = React.useContext(DataRouterContext);\n invariant(ctx, getDataRouterConsoleError(hookName));\n return ctx;\n}\n\nfunction useDataRouterState(hookName: DataRouterStateHook) {\n let state = React.useContext(DataRouterStateContext);\n invariant(state, getDataRouterConsoleError(hookName));\n return state;\n}\n\nfunction useRouteContext(hookName: DataRouterStateHook) {\n let route = React.useContext(RouteContext);\n invariant(route, getDataRouterConsoleError(hookName));\n return route;\n}\n\n// Internal version with hookName-aware debugging\nfunction useCurrentRouteId(hookName: DataRouterStateHook) {\n let route = useRouteContext(hookName);\n let thisRoute = route.matches[route.matches.length - 1];\n invariant(\n thisRoute.route.id,\n `${hookName} can only be used on routes that contain a unique \"id\"`\n );\n return thisRoute.route.id;\n}\n\n/**\n * Returns the ID for the nearest contextual route\n */\nexport function useRouteId() {\n return useCurrentRouteId(DataRouterStateHook.UseRouteId);\n}\n\n/**\n * Returns the current navigation, defaulting to an \"idle\" navigation when\n * no navigation is in progress\n */\nexport function useNavigation() {\n let state = useDataRouterState(DataRouterStateHook.UseNavigation);\n return state.navigation;\n}\n\n/**\n * Returns a revalidate function for manually triggering revalidation, as well\n * as the current state of any manual revalidations\n */\nexport function useRevalidator() {\n let dataRouterContext = useDataRouterContext(DataRouterHook.UseRevalidator);\n let state = useDataRouterState(DataRouterStateHook.UseRevalidator);\n return React.useMemo(\n () => ({\n revalidate: dataRouterContext.router.revalidate,\n state: state.revalidation,\n }),\n [dataRouterContext.router.revalidate, state.revalidation]\n );\n}\n\n/**\n * Returns the active route matches, useful for accessing loaderData for\n * parent/child routes or the route \"handle\" property\n */\nexport function useMatches(): UIMatch[] {\n let { matches, loaderData } = useDataRouterState(\n DataRouterStateHook.UseMatches\n );\n return React.useMemo(\n () => matches.map((m) => convertRouteMatchToUiMatch(m, loaderData)),\n [matches, loaderData]\n );\n}\n\n/**\n * Returns the loader data for the nearest ancestor Route loader\n */\nexport function useLoaderData(): unknown {\n let state = useDataRouterState(DataRouterStateHook.UseLoaderData);\n let routeId = useCurrentRouteId(DataRouterStateHook.UseLoaderData);\n\n if (state.errors && state.errors[routeId] != null) {\n console.error(\n `You cannot \\`useLoaderData\\` in an errorElement (routeId: ${routeId})`\n );\n return undefined;\n }\n return state.loaderData[routeId];\n}\n\n/**\n * Returns the loaderData for the given routeId\n */\nexport function useRouteLoaderData(routeId: string): unknown {\n let state = useDataRouterState(DataRouterStateHook.UseRouteLoaderData);\n return state.loaderData[routeId];\n}\n\n/**\n * Returns the action data for the nearest ancestor Route action\n */\nexport function useActionData(): unknown {\n let state = useDataRouterState(DataRouterStateHook.UseActionData);\n let routeId = useCurrentRouteId(DataRouterStateHook.UseLoaderData);\n return state.actionData ? state.actionData[routeId] : undefined;\n}\n\n/**\n * Returns the nearest ancestor Route error, which could be a loader/action\n * error or a render error. This is intended to be called from your\n * ErrorBoundary/errorElement to display a proper error message.\n */\nexport function useRouteError(): unknown {\n let error = React.useContext(RouteErrorContext);\n let state = useDataRouterState(DataRouterStateHook.UseRouteError);\n let routeId = useCurrentRouteId(DataRouterStateHook.UseRouteError);\n\n // If this was a render error, we put it in a RouteError context inside\n // of RenderErrorBoundary\n if (error !== undefined) {\n return error;\n }\n\n // Otherwise look for errors from our data router state\n return state.errors?.[routeId];\n}\n\n/**\n * Returns the happy-path data from the nearest ancestor `<Await />` value\n */\nexport function useAsyncValue(): unknown {\n let value = React.useContext(AwaitContext);\n return value?._data;\n}\n\n/**\n * Returns the error from the nearest ancestor `<Await />` value\n */\nexport function useAsyncError(): unknown {\n let value = React.useContext(AwaitContext);\n return value?._error;\n}\n\nlet blockerId = 0;\n\n/**\n * Allow the application to block navigations within the SPA and present the\n * user a confirmation dialog to confirm the navigation. Mostly used to avoid\n * using half-filled form data. This does not handle hard-reloads or\n * cross-origin navigations.\n */\nexport function useBlocker(shouldBlock: boolean | BlockerFunction): Blocker {\n let { router, basename } = useDataRouterContext(DataRouterHook.UseBlocker);\n let state = useDataRouterState(DataRouterStateHook.UseBlocker);\n\n let [blockerKey, setBlockerKey] = React.useState(\"\");\n let blockerFunction = React.useCallback<BlockerFunction>(\n (arg) => {\n if (typeof shouldBlock !== \"function\") {\n return !!shouldBlock;\n }\n if (basename === \"/\") {\n return shouldBlock(arg);\n }\n\n // If they provided us a function and we've got an active basename, strip\n // it from the locations we expose to the user to match the behavior of\n // useLocation\n let { currentLocation, nextLocation, historyAction } = arg;\n return shouldBlock({\n currentLocation: {\n ...currentLocation,\n pathname:\n stripBasename(currentLocation.pathname, basename) ||\n currentLocation.pathname,\n },\n nextLocation: {\n ...nextLocation,\n pathname:\n stripBasename(nextLocation.pathname, basename) ||\n nextLocation.pathname,\n },\n historyAction,\n });\n },\n [basename, shouldBlock]\n );\n\n // This effect is in charge of blocker key assignment and deletion (which is\n // tightly coupled to the key)\n React.useEffect(() => {\n let key = String(++blockerId);\n setBlockerKey(key);\n return () => router.deleteBlocker(key);\n }, [router]);\n\n // This effect handles assigning the blockerFunction. This is to handle\n // unstable blocker function identities, and happens only after the prior\n // effect so we don't get an orphaned blockerFunction in the router with a\n // key of \"\". Until then we just have the IDLE_BLOCKER.\n React.useEffect(() => {\n if (blockerKey !== \"\") {\n router.getBlocker(blockerKey, blockerFunction);\n }\n }, [router, blockerKey, blockerFunction]);\n\n // Prefer the blocker from `state` not `router.state` since DataRouterContext\n // is memoized so this ensures we update on blocker state updates\n return blockerKey && state.blockers.has(blockerKey)\n ? state.blockers.get(blockerKey)!\n : IDLE_BLOCKER;\n}\n\n/**\n * Stable version of useNavigate that is used when we are in the context of\n * a RouterProvider.\n */\nfunction useNavigateStable(): NavigateFunction {\n let { router } = useDataRouterContext(DataRouterHook.UseNavigateStable);\n let id = useCurrentRouteId(DataRouterStateHook.UseNavigateStable);\n\n let activeRef = React.useRef(false);\n useIsomorphicLayoutEffect(() => {\n activeRef.current = true;\n });\n\n let navigate: NavigateFunction = React.useCallback(\n (to: To | number, options: NavigateOptions = {}) => {\n warning(activeRef.current, navigateEffectWarning);\n\n // Short circuit here since if this happens on first render the navigate\n // is useless because we haven't wired up our router subscriber yet\n if (!activeRef.current) return;\n\n if (typeof to === \"number\") {\n router.navigate(to);\n } else {\n router.navigate(to, { fromRouteId: id, ...options });\n }\n },\n [router, id]\n );\n\n return navigate;\n}\n\nconst alreadyWarned: Record<string, boolean> = {};\n\nfunction warningOnce(key: string, cond: boolean, message: string) {\n if (!cond && !alreadyWarned[key]) {\n alreadyWarned[key] = true;\n warning(false, message);\n }\n}\n","import type { FutureConfig as RouterFutureConfig } from \"@remix-run/router\";\nimport type { FutureConfig as RenderFutureConfig } from \"./components\";\n\nconst alreadyWarned: { [key: string]: boolean } = {};\n\nexport function warnOnce(key: string, message: string): void {\n if (__DEV__ && !alreadyWarned[message]) {\n alreadyWarned[message] = true;\n console.warn(message);\n }\n}\n\nconst logDeprecation = (flag: string, msg: string, link: string) =>\n warnOnce(\n flag,\n `⚠️ React Router Future Flag Warning: ${msg}. ` +\n `You can use the \\`${flag}\\` future flag to opt-in early. ` +\n `For more information, see ${link}.`\n );\n\nexport function logV6DeprecationWarnings(\n renderFuture: Partial<RenderFutureConfig> | undefined,\n routerFuture?: Omit<RouterFutureConfig, \"v7_prependBasename\">\n) {\n if (renderFuture?.v7_startTransition === undefined) {\n logDeprecation(\n \"v7_startTransition\",\n \"React Router will begin wrapping state updates in `React.startTransition` in v7\",\n \"https://reactrouter.com/v6/upgrading/future#v7_starttransition\"\n );\n }\n\n if (\n renderFuture?.v7_relativeSplatPath === undefined &&\n (!routerFuture || !routerFuture.v7_relativeSplatPath)\n ) {\n logDeprecation(\n \"v7_relativeSplatPath\",\n \"Relative route resolution within Splat routes is changing in v7\",\n \"https://reactrouter.com/v6/upgrading/future#v7_relativesplatpath\"\n );\n }\n\n if (routerFuture) {\n if (routerFuture.v7_fetcherPersist === undefined) {\n logDeprecation(\n \"v7_fetcherPersist\",\n \"The persistence behavior of fetchers is changing in v7\",\n \"https://reactrouter.com/v6/upgrading/future#v7_fetcherpersist\"\n );\n }\n\n if (routerFuture.v7_normalizeFormMethod === undefined) {\n logDeprecation(\n \"v7_normalizeFormMethod\",\n \"Casing of `formMethod` fields is being normalized to uppercase in v7\",\n \"https://reactrouter.com/v6/upgrading/future#v7_normalizeformmethod\"\n );\n }\n\n if (routerFuture.v7_partialHydration === undefined) {\n logDeprecation(\n \"v7_partialHydration\",\n \"`RouterProvider` hydration behavior is changing in v7\",\n \"https://reactrouter.com/v6/upgrading/future#v7_partialhydration\"\n );\n }\n\n if (routerFuture.v7_skipActionErrorRevalidation === undefined) {\n logDeprecation(\n \"v7_skipActionErrorRevalidation\",\n \"The revalidation behavior after 4xx/5xx `action` responses is changing in v7\",\n \"https://reactrouter.com/v6/upgrading/future#v7_skipactionerrorrevalidation\"\n );\n }\n }\n}\n","import type {\n InitialEntry,\n LazyRouteFunction,\n Location,\n MemoryHistory,\n RelativeRoutingType,\n Router as RemixRouter,\n RouterState,\n RouterSubscriber,\n To,\n TrackedPromise,\n} from \"@remix-run/router\";\nimport {\n AbortedDeferredError,\n Action as NavigationType,\n createMemoryHistory,\n UNSAFE_getResolveToMatches as getResolveToMatches,\n UNSAFE_invariant as invariant,\n parsePath,\n resolveTo,\n stripBasename,\n UNSAFE_warning as warning,\n} from \"@remix-run/router\";\nimport * as React from \"react\";\n\nimport type {\n DataRouteObject,\n IndexRouteObject,\n Navigator,\n NonIndexRouteObject,\n RouteMatch,\n RouteObject,\n} from \"./context\";\nimport {\n AwaitContext,\n DataRouterContext,\n DataRouterStateContext,\n LocationContext,\n NavigationContext,\n RouteContext,\n} from \"./context\";\nimport {\n _renderMatches,\n useAsyncValue,\n useInRouterContext,\n useLocation,\n useNavigate,\n useOutlet,\n useRoutes,\n useRoutesImpl,\n} from \"./hooks\";\nimport { logV6DeprecationWarnings } from \"./deprecations\";\n\nexport interface FutureConfig {\n v7_relativeSplatPath: boolean;\n v7_startTransition: boolean;\n}\n\nexport interface RouterProviderProps {\n fallbackElement?: React.ReactNode;\n router: RemixRouter;\n // Only accept future flags relevant to rendering behavior\n // routing flags should be accessed via router.future\n future?: Partial<Pick<FutureConfig, \"v7_startTransition\">>;\n}\n\n/**\n Webpack + React 17 fails to compile on any of the following because webpack\n complains that `startTransition` doesn't exist in `React`:\n * import { startTransition } from \"react\"\n * import * as React from from \"react\";\n \"startTransition\" in React ? React.startTransition(() => setState()) : setState()\n * import * as React from from \"react\";\n \"startTransition\" in React ? React[\"startTransition\"](() => setState()) : setState()\n\n Moving it to a constant such as the following solves the Webpack/React 17 issue:\n * import * as React from from \"react\";\n const START_TRANSITION = \"startTransition\";\n START_TRANSITION in React ? React[START_TRANSITION](() => setState()) : setState()\n\n However, that introduces webpack/terser minification issues in production builds\n in React 18 where minification/obfuscation ends up removing the call of\n React.startTransition entirely from the first half of the ternary. Grabbing\n this exported reference once up front resolves that issue.\n\n See https://github.com/remix-run/react-router/issues/10579\n*/\nconst START_TRANSITION = \"startTransition\";\nconst startTransitionImpl = React[START_TRANSITION];\n\n/**\n * Given a Remix Router instance, render the appropriate UI\n */\nexport function RouterProvider({\n fallbackElement,\n router,\n future,\n}: RouterProviderProps): React.ReactElement {\n let [state, setStateImpl] = React.useState(router.state);\n let { v7_startTransition } = future || {};\n\n let setState = React.useCallback<RouterSubscriber>(\n (newState: RouterState) => {\n if (v7_startTransition && startTransitionImpl) {\n startTransitionImpl(() => setStateImpl(newState));\n } else {\n setStateImpl(newState);\n }\n },\n [setStateImpl, v7_startTransition]\n );\n\n // Need to use a layout effect here so we are subscribed early enough to\n // pick up on any render-driven redirects/navigations (useEffect/<Navigate>)\n React.useLayoutEffect(() => router.subscribe(setState), [router, setState]);\n\n React.useEffect(() => {\n warning(\n fallbackElement == null || !router.future.v7_partialHydration,\n \"`<RouterProvider fallbackElement>` is deprecated when using \" +\n \"`v7_partialHydration`, use a `HydrateFallback` component instead\"\n );\n // Only log this once on initial mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n let navigator = React.useMemo((): Navigator => {\n return {\n createHref: router.createHref,\n encodeLocation: router.encodeLocation,\n go: (n) => router.navigate(n),\n push: (to, state, opts) =>\n router.navigate(to, {\n state,\n preventScrollReset: opts?.preventScrollReset,\n }),\n replace: (to, state, opts) =>\n router.navigate(to, {\n replace: true,\n state,\n preventScrollReset: opts?.preventScrollReset,\n }),\n };\n }, [router]);\n\n let basename = router.basename || \"/\";\n\n let dataRouterContext = React.useMemo(\n () => ({\n router,\n navigator,\n static: false,\n basename,\n }),\n [router, navigator, basename]\n );\n\n React.useEffect(\n () => logV6DeprecationWarnings(future, router.future),\n [router, future]\n );\n\n // The fragment and {null} here are important! We need them to keep React 18's\n // useId happy when we are server-rendering since we may have a <script> here\n // containing the hydrated server-side staticContext (from StaticRouterProvider).\n // useId relies on the component tree structure to generate deterministic id's\n // so we need to ensure it remains the same on the client even though\n // we don't need the <script> tag\n return (\n <>\n <DataRouterContext.Provider value={dataRouterContext}>\n <DataRouterStateContext.Provider value={state}>\n <Router\n basename={basename}\n location={state.location}\n navigationType={state.historyAction}\n navigator={navigator}\n future={{\n v7_relativeSplatPath: router.future.v7_relativeSplatPath,\n }}\n >\n {state.initialized || router.future.v7_partialHydration ? (\n <DataRoutes\n routes={router.routes}\n future={router.future}\n state={state}\n />\n ) : (\n fallbackElement\n )}\n </Router>\n </DataRouterStateContext.Provider>\n </DataRouterContext.Provider>\n {null}\n </>\n );\n}\n\nfunction DataRoutes({\n routes,\n future,\n state,\n}: {\n routes: DataRouteObject[];\n future: RemixRouter[\"future\"];\n state: RouterState;\n}): React.ReactElement | null {\n return useRoutesImpl(routes, undefined, state, future);\n}\n\nexport interface MemoryRouterProps {\n basename?: string;\n children?: React.ReactNode;\n initialEntries?: InitialEntry[];\n initialIndex?: number;\n future?: Partial<FutureConfig>;\n}\n\n/**\n * A `<Router>` that stores all entries in memory.\n *\n * @see https://reactrouter.com/v6/router-components/memory-router\n */\nexport function MemoryRouter({\n basename,\n children,\n initialEntries,\n initialIndex,\n future,\n}: MemoryRouterProps): React.ReactElement {\n let historyRef = React.useRef<MemoryHistory>();\n if (historyRef.current == null) {\n historyRef.current = createMemoryHistory({\n initialEntries,\n initialIndex,\n v5Compat: true,\n });\n }\n\n let history = historyRef.current;\n let [state, setStateImpl] = React.useState({\n action: history.action,\n location: history.location,\n });\n let { v7_startTransition } = future || {};\n let setState = React.useCallback(\n (newState: { action: NavigationType; location: Location }) => {\n v7_startTransition && startTransitionImpl\n ? startTransitionImpl(() => setStateImpl(newState))\n : setStateImpl(newState);\n },\n [setStateImpl, v7_startTransition]\n );\n\n React.useLayoutEffect(() => history.listen(setState), [history, setState]);\n\n React.useEffect(() => logV6DeprecationWarnings(future), [future]);\n\n return (\n <Router\n basename={basename}\n children={children}\n location={state.location}\n navigationType={state.action}\n navigator={history}\n future={future}\n />\n );\n}\n\nexport interface NavigateProps {\n to: To;\n replace?: boolean;\n state?: any;\n relative?: RelativeRoutingType;\n}\n\n/**\n * Changes the current location.\n *\n * Note: This API is mostly useful in React.Component subclasses that are not\n * able to use hooks. In functional components, we recommend you use the\n * `useNavigate` hook instead.\n *\n * @see https://reactrouter.com/v6/components/navigate\n */\nexport function Navigate({\n to,\n replace,\n state,\n relative,\n}: NavigateProps): null {\n invariant(\n useInRouterContext(),\n // TODO: This error is probably because they somehow have 2 versions of\n // the router loaded. We can help them understand how to avoid that.\n `<Navigate> may be used only in the context of a <Router> component.`\n );\n\n let { future, static: isStatic } = React.useContext(NavigationContext);\n\n warning(\n !isStatic,\n `<Navigate> must not be used on the initial render in a <StaticRouter>. ` +\n `This is a no-op, but you should modify your code so the <Navigate> is ` +\n `only ever rendered in response to some user interaction or state change.`\n );\n\n let { matches } = React.useContext(RouteContext);\n let { pathname: locationPathname } = useLocation();\n let navigate = useNavigate();\n\n // Resolve the path outside of the effect so that when effects run twice in\n // StrictMode they navigate to the same place\n let path = resolveTo(\n to,\n getResolveToMatches(matches, future.v7_relativeSplatPath),\n locationPathname,\n relative === \"path\"\n );\n let jsonPath = JSON.stringify(path);\n\n React.useEffect(\n () => navigate(JSON.parse(jsonPath), { replace, state, relative }),\n [navigate, jsonPath, relative, replace, state]\n );\n\n return null;\n}\n\nexport interface OutletProps {\n context?: unknown;\n}\n\n/**\n * Renders the child route's element, if there is one.\n *\n * @see https://reactrouter.com/v6/components/outlet\n */\nexport function Outlet(props: OutletProps): React.ReactElement | null {\n return useOutlet(props.context);\n}\n\nexport interface PathRouteProps {\n caseSensitive?: NonIndexRouteObject[\"caseSensitive\"];\n path?: NonIndexRouteObject[\"path\"];\n id?: NonIndexRouteObject[\"id\"];\n lazy?: LazyRouteFunction<NonIndexRouteObject>;\n loader?: NonIndexRouteObject[\"loader\"];\n action?: NonIndexRouteObject[\"action\"];\n hasErrorBoundary?: NonIndexRouteObject[\"hasErrorBoundary\"];\n shouldRevalidate?: NonIndexRouteObject[\"shouldRevalidate\"];\n handle?: NonIndexRouteObject[\"handle\"];\n index?: false;\n children?: React.ReactNode;\n element?: React.ReactNode | null;\n hydrateFallbackElement?: React.ReactNode | null;\n errorElement?: React.ReactNode | null;\n Component?: React.ComponentType | null;\n HydrateFallback?: React.ComponentType | null;\n ErrorBoundary?: React.ComponentType | null;\n}\n\nexport interface LayoutRouteProps extends PathRouteProps {}\n\nexport interface IndexRouteProps {\n caseSensitive?: IndexRouteObject[\"caseSensitive\"];\n path?: IndexRouteObject[\"path\"];\n id?: IndexRouteObject[\"id\"];\n lazy?: LazyRouteFunction<IndexRouteObject>;\n loader?: IndexRouteObject[\"loader\"];\n action?: IndexRouteObject[\"action\"];\n hasErrorBoundary?: IndexRouteObject[\"hasErrorBoundary\"];\n shouldRevalidate?: IndexRouteObject[\"shouldRevalidate\"];\n handle?: IndexRouteObject[\"handle\"];\n index: true;\n children?: undefined;\n element?: React.ReactNode | null;\n hydrateFallbackElement?: React.ReactNode | null;\n errorElement?: React.ReactNode | null;\n Component?: React.ComponentType | null;\n HydrateFallback?: React.ComponentType | null;\n ErrorBoundary?: React.ComponentType | null;\n}\n\nexport type RouteProps = PathRouteProps | LayoutRouteProps | IndexRouteProps;\n\n/**\n * Declares an element that should be rendered at a certain URL path.\n *\n * @see https://reactrouter.com/v6/components/route\n */\nexport function Route(_props: RouteProps): React.ReactElement | null {\n invariant(\n false,\n `A <Route> is only ever to be used as the child of <Routes> element, ` +\n `never rendered directly. Please wrap your <Route> in a <Routes>.`\n );\n}\n\nexport interface RouterProps {\n basename?: string;\n children?: React.ReactNode;\n location: Partial<Location> | string;\n navigationType?: NavigationType;\n navigator: Navigator;\n static?: boolean;\n future?: Partial<Pick<FutureConfig, \"v7_relativeSplatPath\">>;\n}\n\n/**\n * Provides location context for the rest of the app.\n *\n * Note: You usually won't render a `<Router>` directly. Instead, you'll render a\n * router that is more specific to your environment such as a `<BrowserRouter>`\n * in web browsers or a `<StaticRouter>` for server rendering.\n *\n * @see https://reactrouter.com/v6/router-components/router\n */\nexport function Router({\n basename: basenameProp = \"/\",\n children = null,\n location: locationProp,\n navigationType = NavigationType.Pop,\n navigator,\n static: staticProp = false,\n future,\n}: RouterProps): React.ReactElement | null {\n invariant(\n !useInRouterContext(),\n `You cannot render a <Router> inside another <Router>.` +\n ` You should never have more than one in your app.`\n );\n\n // Preserve trailing slashes on basename, so we can let the user control\n // the enforcement of trailing slashes throughout the app\n let basename = basenameProp.replace(/^\\/*/, \"/\");\n let navigationContext = React.useMemo(\n () => ({\n basename,\n navigator,\n static: staticProp,\n future: {\n v7_relativeSplatPath: false,\n ...future,\n },\n }),\n [basename, future, navigator, staticProp]\n );\n\n if (typeof locationProp === \"string\") {\n locationProp = parsePath(locationProp);\n }\n\n let {\n pathname = \"/\",\n search = \"\",\n hash = \"\",\n state = null,\n key = \"default\",\n } = locationProp;\n\n let locationContext = React.useMemo(() => {\n let trailingPathname = stripBasename(pathname, basename);\n\n if (trailingPathname == null) {\n return null;\n }\n\n return {\n location: {\n pathname: trailingPathname,\n search,\n hash,\n state,\n key,\n },\n navigationType,\n };\n }, [basename, pathname, search, hash, state, key, navigationType]);\n\n warning(\n locationContext != null,\n `<Router basename=\"${basename}\"> is not able to match the URL ` +\n `\"${pathname}${search}${hash}\" because it does not start with the ` +\n `basename, so the <Router> won't render anything.`\n );\n\n if (locationContext == null) {\n return null;\n }\n\n return (\n <NavigationContext.Provider value={navigationContext}>\n <LocationContext.Provider children={children} value={locationContext} />\n </NavigationContext.Provider>\n );\n}\n\nexport interface RoutesProps {\n children?: React.ReactNode;\n location?: Partial<Location> | string;\n}\n\n/**\n * A container for a nested tree of `<Route>` elements that renders the branch\n * that best matches the current location.\n *\n * @see https://reactrouter.com/v6/components/routes\n */\nexport function Routes({\n children,\n location,\n}: RoutesProps): React.ReactElement | null {\n return useRoutes(createRoutesFromChildren(children), location);\n}\n\nexport interface AwaitResolveRenderFunction {\n (data: Awaited<any>): React.ReactNode;\n}\n\nexport interface AwaitProps {\n children: React.ReactNode | AwaitResolveRenderFunction;\n errorElement?: React.ReactNode;\n resolve: TrackedPromise | any;\n}\n\n/**\n * Component to use for rendering lazily loaded data from returning defer()\n * in a loader function\n */\nexport function Await({ children, errorElement, resolve }: AwaitProps) {\n return (\n <AwaitErrorBoundary resolve={resolve} errorElement={errorElement}>\n <ResolveAwait>{children}</ResolveAwait>\n </AwaitErrorBoundary>\n );\n}\n\ntype AwaitErrorBoundaryProps = React.PropsWithChildren<{\n errorElement?: React.ReactNode;\n resolve: TrackedPromise | any;\n}>;\n\ntype AwaitErrorBoundaryState = {\n error: any;\n};\n\nenum AwaitRenderStatus {\n pending,\n success,\n error,\n}\n\nconst neverSettledPromise = new Promise(() => {});\n\nclass AwaitErrorBoundary extends React.Component<\n AwaitErrorBoundaryProps,\n AwaitErrorBoundaryState\n> {\n constructor(props: AwaitErrorBoundaryProps) {\n super(props);\n this.state = { error: null };\n }\n\n static getDerivedStateFromError(error: any) {\n return { error };\n }\n\n componentDidCatch(error: any, errorInfo: any) {\n console.error(\n \"<Await> caught the following error during render\",\n error,\n errorInfo\n );\n }\n\n render() {\n let { children, errorElement, resolve } = this.props;\n\n let promise: TrackedPromise | null = null;\n let status: AwaitRenderStatus = AwaitRenderStatus.pending;\n\n if (!(resolve instanceof Promise)) {\n // Didn't get a promise - provide as a resolved promise\n status = AwaitRenderStatus.success;\n promise = Promise.resolve();\n Object.defineProperty(promise, \"_tracked\", { get: () => true });\n Object.defineProperty(promise, \"_data\", { get: () => resolve });\n } else if (this.state.error) {\n // Caught a render error, provide it as a rejected promise\n status = AwaitRenderStatus.error;\n let renderError = this.state.error;\n promise = Promise.reject().catch(() => {}); // Avoid unhandled rejection warnings\n Object.defineProperty(promise, \"_tracked\", { get: () => true });\n Object.defineProperty(promise, \"_error\", { get: () => renderError });\n } else if ((resolve as TrackedPromise)._tracked) {\n // Already tracked promise - check contents\n promise = resolve;\n status =\n \"_error\" in promise\n ? AwaitRenderStatus.error\n : \"_data\" in promise\n ? AwaitRenderStatus.success\n : AwaitRenderStatus.pending;\n } else {\n // Raw (untracked) promise - track it\n status = AwaitRenderStatus.pending;\n Object.defineProperty(resolve, \"_tracked\", { get: () => true });\n promise = resolve.then(\n (data: any) =>\n Object.defineProperty(resolve, \"_data\", { get: () => data }),\n (error: any) =>\n Object.defineProperty(resolve, \"_error\", { get: () => error })\n );\n }\n\n if (\n status === AwaitRenderStatus.error &&\n promise._error instanceof AbortedDeferredError\n ) {\n // Freeze the UI by throwing a never resolved promise\n throw neverSettledPromise;\n }\n\n if (status === AwaitRenderStatus.error && !errorElement) {\n // No errorElement, throw to the nearest route-level error boundary\n throw promise._error;\n }\n\n if (status === AwaitRenderStatus.error) {\n // Render via our errorElement\n return <AwaitContext.Provider value={promise} children={errorElement} />;\n }\n\n if (status === AwaitRenderStatus.success) {\n // Render children with resolved value\n return <AwaitContext.Provider value={promise} children={children} />;\n }\n\n // Throw to the suspense boundary\n throw promise;\n }\n}\n\n/**\n * @private\n * Indirection to leverage useAsyncValue for a render-prop API on `<Await>`\n */\nfunction ResolveAwait({\n children,\n}: {\n children: React.ReactNode | AwaitResolveRenderFunction;\n}) {\n let data = useAsyncValue();\n let toRender = typeof children === \"function\" ? children(data) : children;\n return <>{toRender}</>;\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// UTILS\n///////////////////////////////////////////////////////////////////////////////\n\n/**\n * Creates a route config from a React \"children\" object, which is usually\n * either a `<Route>` element or an array of them. Used internally by\n * `<Routes>` to create a route config from its children.\n *\n * @see https://reactrouter.com/v6/utils/create-routes-from-children\n */\nexport function createRoutesFromChildren(\n children: React.ReactNode,\n parentPath: number[] = []\n): RouteObject[] {\n let routes: RouteObject[] = [];\n\n React.Children.forEach(children, (element, index) => {\n if (!React.isValidElement(element)) {\n // Ignore non-elements. This allows people to more easily inline\n // conditionals in their route config.\n return;\n }\n\n let treePath = [...parentPath, index];\n\n if (element.type === React.Fragment) {\n // Transparently support React.Fragment and its children.\n routes.push.apply(\n routes,\n createRoutesFromChildren(element.props.children, treePath)\n );\n return;\n }\n\n invariant(\n element.type === Route,\n `[${\n typeof element.type === \"string\" ? element.type : element.type.name\n }] is not a <Route> component. All component children of <Routes> must be a <Route> or <React.Fragment>`\n );\n\n invariant(\n !element.props.index || !element.props.children,\n \"An index route cannot have child routes.\"\n );\n\n let route: RouteObject = {\n id: element.props.id || treePath.join(\"-\"),\n caseSensitive: element.props.caseSensitive,\n element: element.props.element,\n Component: element.props.Component,\n index: element.props.index,\n path: element.props.path,\n loader: element.props.loader,\n action: element.props.action,\n errorElement: element.props.errorElement,\n ErrorBoundary: element.props.ErrorBoundary,\n hasErrorBoundary:\n element.props.ErrorBoundary != null ||\n element.props.errorElement != null,\n shouldRevalidate: element.props.shouldRevalidate,\n handle: element.props.handle,\n lazy: element.props.lazy,\n };\n\n if (element.props.children) {\n route.children = createRoutesFromChildren(\n element.props.children,\n treePath\n );\n }\n\n routes.push(route);\n });\n\n return routes;\n}\n\n/**\n * Renders the result of `matchRoutes()` into a React element.\n */\nexport function renderMatches(\n matches: RouteMatch[] | null\n): React.ReactElement | null {\n return _renderMatches(matches);\n}\n","var isDevelopment = false;\n\n/*\n\nBased off glamor's StyleSheet, thanks Sunil ❤️\n\nhigh performance StyleSheet for css-in-js systems\n\n- uses multiple style tags behind the scenes for millions of rules\n- uses `insertRule` for appending in production for *much* faster performance\n\n// usage\n\nimport { StyleSheet } from '@emotion/sheet'\n\nlet styleSheet = new StyleSheet({ key: '', container: document.head })\n\nstyleSheet.insert('#box { border: 1px solid red; }')\n- appends a css rule into the stylesheet\n\nstyleSheet.flush()\n- empties the stylesheet of all its contents\n\n*/\n\nfunction sheetForTag(tag) {\n if (tag.sheet) {\n return tag.sheet;\n } // this weirdness brought to you by firefox\n\n /* istanbul ignore next */\n\n\n for (var i = 0; i < document.styleSheets.length; i++) {\n if (document.styleSheets[i].ownerNode === tag) {\n return document.styleSheets[i];\n }\n } // this function should always return with a value\n // TS can't understand it though so we make it stop complaining here\n\n\n return undefined;\n}\n\nfunction createStyleElement(options) {\n var tag = document.createElement('style');\n tag.setAttribute('data-emotion', options.key);\n\n if (options.nonce !== undefined) {\n tag.setAttribute('nonce', options.nonce);\n }\n\n tag.appendChild(document.createTextNode(''));\n tag.setAttribute('data-s', '');\n return tag;\n}\n\nvar StyleSheet = /*#__PURE__*/function () {\n // Using Node instead of HTMLElement since container may be a ShadowRoot\n function StyleSheet(options) {\n var _this = this;\n\n this._insertTag = function (tag) {\n var before;\n\n if (_this.tags.length === 0) {\n if (_this.insertionPoint) {\n before = _this.insertionPoint.nextSibling;\n } else if (_this.prepend) {\n before = _this.container.firstChild;\n } else {\n before = _this.before;\n }\n } else {\n before = _this.tags[_this.tags.length - 1].nextSibling;\n }\n\n _this.container.insertBefore(tag, before);\n\n _this.tags.push(tag);\n };\n\n this.isSpeedy = options.speedy === undefined ? !isDevelopment : options.speedy;\n this.tags = [];\n this.ctr = 0;\n this.nonce = options.nonce; // key is the value of the data-emotion attribute, it's used to identify different sheets\n\n this.key = options.key;\n this.container = options.container;\n this.prepend = options.prepend;\n this.insertionPoint = options.insertionPoint;\n this.before = null;\n }\n\n var _proto = StyleSheet.prototype;\n\n _proto.hydrate = function hydrate(nodes) {\n nodes.forEach(this._insertTag);\n };\n\n _proto.insert = function insert(rule) {\n // the max length is how many rules we have per style tag, it's 65000 in speedy mode\n // it's 1 in dev because we insert source maps that map a single rule to a location\n // and you can only have one source map per style tag\n if (this.ctr % (this.isSpeedy ? 65000 : 1) === 0) {\n this._insertTag(createStyleElement(this));\n }\n\n var tag = this.tags[this.tags.length - 1];\n\n if (this.isSpeedy) {\n var sheet = sheetForTag(tag);\n\n try {\n // this is the ultrafast version, works across browsers\n // the big drawback is that the css won't be editable in devtools\n sheet.insertRule(rule, sheet.cssRules.length);\n } catch (e) {\n }\n } else {\n tag.appendChild(document.createTextNode(rule));\n }\n\n this.ctr++;\n };\n\n _proto.flush = function flush() {\n this.tags.forEach(function (tag) {\n var _tag$parentNode;\n\n return (_tag$parentNode = tag.parentNode) == null ? void 0 : _tag$parentNode.removeChild(tag);\n });\n this.tags = [];\n this.ctr = 0;\n };\n\n return StyleSheet;\n}();\n\nexport { StyleSheet };\n","/**\n * @param {number}\n * @return {number}\n */\nexport var abs = Math.abs\n\n/**\n * @param {number}\n * @return {string}\n */\nexport var from = String.fromCharCode\n\n/**\n * @param {object}\n * @return {object}\n */\nexport var assign = Object.assign\n\n/**\n * @param {string} value\n * @param {number} length\n * @return {number}\n */\nexport function hash (value, length) {\n\treturn charat(value, 0) ^ 45 ? (((((((length << 2) ^ charat(value, 0)) << 2) ^ charat(value, 1)) << 2) ^ charat(value, 2)) << 2) ^ charat(value, 3) : 0\n}\n\n/**\n * @param {string} value\n * @return {string}\n */\nexport function trim (value) {\n\treturn value.trim()\n}\n\n/**\n * @param {string} value\n * @param {RegExp} pattern\n * @return {string?}\n */\nexport function match (value, pattern) {\n\treturn (value = pattern.exec(value)) ? value[0] : value\n}\n\n/**\n * @param {string} value\n * @param {(string|RegExp)} pattern\n * @param {string} replacement\n * @return {string}\n */\nexport function replace (value, pattern, replacement) {\n\treturn value.replace(pattern, replacement)\n}\n\n/**\n * @param {string} value\n * @param {string} search\n * @return {number}\n */\nexport function indexof (value, search) {\n\treturn value.indexOf(search)\n}\n\n/**\n * @param {string} value\n * @param {number} index\n * @return {number}\n */\nexport function charat (value, index) {\n\treturn value.charCodeAt(index) | 0\n}\n\n/**\n * @param {string} value\n * @param {number} begin\n * @param {number} end\n * @return {string}\n */\nexport function substr (value, begin, end) {\n\treturn value.slice(begin, end)\n}\n\n/**\n * @param {string} value\n * @return {number}\n */\nexport function strlen (value) {\n\treturn value.length\n}\n\n/**\n * @param {any[]} value\n * @return {number}\n */\nexport function sizeof (value) {\n\treturn value.length\n}\n\n/**\n * @param {any} value\n * @param {any[]} array\n * @return {any}\n */\nexport function append (value, array) {\n\treturn array.push(value), value\n}\n\n/**\n * @param {string[]} array\n * @param {function} callback\n * @return {string}\n */\nexport function combine (array, callback) {\n\treturn array.map(callback).join('')\n}\n","import {from, trim, charat, strlen, substr, append, assign} from './Utility.js'\n\nexport var line = 1\nexport var column = 1\nexport var length = 0\nexport var position = 0\nexport var character = 0\nexport var characters = ''\n\n/**\n * @param {string} value\n * @param {object | null} root\n * @param {object | null} parent\n * @param {string} type\n * @param {string[] | string} props\n * @param {object[] | string} children\n * @param {number} length\n */\nexport function node (value, root, parent, type, props, children, length) {\n\treturn {value: value, root: root, parent: parent, type: type, props: props, children: children, line: line, column: column, length: length, return: ''}\n}\n\n/**\n * @param {object} root\n * @param {object} props\n * @return {object}\n */\nexport function copy (root, props) {\n\treturn assign(node('', null, null, '', null, null, 0), root, {length: -root.length}, props)\n}\n\n/**\n * @return {number}\n */\nexport function char () {\n\treturn character\n}\n\n/**\n * @return {number}\n */\nexport function prev () {\n\tcharacter = position > 0 ? charat(characters, --position) : 0\n\n\tif (column--, character === 10)\n\t\tcolumn = 1, line--\n\n\treturn character\n}\n\n/**\n * @return {number}\n */\nexport function next () {\n\tcharacter = position < length ? charat(characters, position++) : 0\n\n\tif (column++, character === 10)\n\t\tcolumn = 1, line++\n\n\treturn character\n}\n\n/**\n * @return {number}\n */\nexport function peek () {\n\treturn charat(characters, position)\n}\n\n/**\n * @return {number}\n */\nexport function caret () {\n\treturn position\n}\n\n/**\n * @param {number} begin\n * @param {number} end\n * @return {string}\n */\nexport function slice (begin, end) {\n\treturn substr(characters, begin, end)\n}\n\n/**\n * @param {number} type\n * @return {number}\n */\nexport function token (type) {\n\tswitch (type) {\n\t\t// \\0 \\t \\n \\r \\s whitespace token\n\t\tcase 0: case 9: case 10: case 13: case 32:\n\t\t\treturn 5\n\t\t// ! + , / > @ ~ isolate token\n\t\tcase 33: case 43: case 44: case 47: case 62: case 64: case 126:\n\t\t// ; { } breakpoint token\n\t\tcase 59: case 123: case 125:\n\t\t\treturn 4\n\t\t// : accompanied token\n\t\tcase 58:\n\t\t\treturn 3\n\t\t// \" ' ( [ opening delimit token\n\t\tcase 34: case 39: case 40: case 91:\n\t\t\treturn 2\n\t\t// ) ] closing delimit token\n\t\tcase 41: case 93:\n\t\t\treturn 1\n\t}\n\n\treturn 0\n}\n\n/**\n * @param {string} value\n * @return {any[]}\n */\nexport function alloc (value) {\n\treturn line = column = 1, length = strlen(characters = value), position = 0, []\n}\n\n/**\n * @param {any} value\n * @return {any}\n */\nexport function dealloc (value) {\n\treturn characters = '', value\n}\n\n/**\n * @param {number} type\n * @return {string}\n */\nexport function delimit (type) {\n\treturn trim(slice(position - 1, delimiter(type === 91 ? type + 2 : type === 40 ? type + 1 : type)))\n}\n\n/**\n * @param {string} value\n * @return {string[]}\n */\nexport function tokenize (value) {\n\treturn dealloc(tokenizer(alloc(value)))\n}\n\n/**\n * @param {number} type\n * @return {string}\n */\nexport function whitespace (type) {\n\twhile (character = peek())\n\t\tif (character < 33)\n\t\t\tnext()\n\t\telse\n\t\t\tbreak\n\n\treturn token(type) > 2 || token(character) > 3 ? '' : ' '\n}\n\n/**\n * @param {string[]} children\n * @return {string[]}\n */\nexport function tokenizer (children) {\n\twhile (next())\n\t\tswitch (token(character)) {\n\t\t\tcase 0: append(identifier(position - 1), children)\n\t\t\t\tbreak\n\t\t\tcase 2: append(delimit(character), children)\n\t\t\t\tbreak\n\t\t\tdefault: append(from(character), children)\n\t\t}\n\n\treturn children\n}\n\n/**\n * @param {number} index\n * @param {number} count\n * @return {string}\n */\nexport function escaping (index, count) {\n\twhile (--count && next())\n\t\t// not 0-9 A-F a-f\n\t\tif (character < 48 || character > 102 || (character > 57 && character < 65) || (character > 70 && character < 97))\n\t\t\tbreak\n\n\treturn slice(index, caret() + (count < 6 && peek() == 32 && next() == 32))\n}\n\n/**\n * @param {number} type\n * @return {number}\n */\nexport function delimiter (type) {\n\twhile (next())\n\t\tswitch (character) {\n\t\t\t// ] ) \" '\n\t\t\tcase type:\n\t\t\t\treturn position\n\t\t\t// \" '\n\t\t\tcase 34: case 39:\n\t\t\t\tif (type !== 34 && type !== 39)\n\t\t\t\t\tdelimiter(character)\n\t\t\t\tbreak\n\t\t\t// (\n\t\t\tcase 40:\n\t\t\t\tif (type === 41)\n\t\t\t\t\tdelimiter(type)\n\t\t\t\tbreak\n\t\t\t// \\\n\t\t\tcase 92:\n\t\t\t\tnext()\n\t\t\t\tbreak\n\t\t}\n\n\treturn position\n}\n\n/**\n * @param {number} type\n * @param {number} index\n * @return {number}\n */\nexport function commenter (type, index) {\n\twhile (next())\n\t\t// //\n\t\tif (type + character === 47 + 10)\n\t\t\tbreak\n\t\t// /*\n\t\telse if (type + character === 42 + 42 && peek() === 47)\n\t\t\tbreak\n\n\treturn '/*' + slice(index, position - 1) + '*' + from(type === 47 ? type : next())\n}\n\n/**\n * @param {number} index\n * @return {string}\n */\nexport function identifier (index) {\n\twhile (!token(peek()))\n\t\tnext()\n\n\treturn slice(index, position)\n}\n","export var MS = '-ms-'\nexport var MOZ = '-moz-'\nexport var WEBKIT = '-webkit-'\n\nexport var COMMENT = 'comm'\nexport var RULESET = 'rule'\nexport var DECLARATION = 'decl'\n\nexport var PAGE = '@page'\nexport var MEDIA = '@media'\nexport var IMPORT = '@import'\nexport var CHARSET = '@charset'\nexport var VIEWPORT = '@viewport'\nexport var SUPPORTS = '@supports'\nexport var DOCUMENT = '@document'\nexport var NAMESPACE = '@namespace'\nexport var KEYFRAMES = '@keyframes'\nexport var FONT_FACE = '@font-face'\nexport var COUNTER_STYLE = '@counter-style'\nexport var FONT_FEATURE_VALUES = '@font-feature-values'\nexport var LAYER = '@layer'\n","import {IMPORT, LAYER, COMMENT, RULESET, DECLARATION, KEYFRAMES} from './Enum.js'\nimport {strlen, sizeof} from './Utility.js'\n\n/**\n * @param {object[]} children\n * @param {function} callback\n * @return {string}\n */\nexport function serialize (children, callback) {\n\tvar output = ''\n\tvar length = sizeof(children)\n\n\tfor (var i = 0; i < length; i++)\n\t\toutput += callback(children[i], i, children, callback) || ''\n\n\treturn output\n}\n\n/**\n * @param {object} element\n * @param {number} index\n * @param {object[]} children\n * @param {function} callback\n * @return {string}\n */\nexport function stringify (element, index, children, callback) {\n\tswitch (element.type) {\n\t\tcase LAYER: if (element.children.length) break\n\t\tcase IMPORT: case DECLARATION: return element.return = element.return || element.value\n\t\tcase COMMENT: return ''\n\t\tcase KEYFRAMES: return element.return = element.value + '{' + serialize(element.children, callback) + '}'\n\t\tcase RULESET: element.value = element.props.join(',')\n\t}\n\n\treturn strlen(children = serialize(element.children, callback)) ? element.return = element.value + '{' + children + '}' : ''\n}\n","import {COMMENT, RULESET, DECLARATION} from './Enum.js'\nimport {abs, charat, trim, from, sizeof, strlen, substr, append, replace, indexof} from './Utility.js'\nimport {node, char, prev, next, peek, caret, alloc, dealloc, delimit, whitespace, escaping, identifier, commenter} from './Tokenizer.js'\n\n/**\n * @param {string} value\n * @return {object[]}\n */\nexport function compile (value) {\n\treturn dealloc(parse('', null, null, null, [''], value = alloc(value), 0, [0], value))\n}\n\n/**\n * @param {string} value\n * @param {object} root\n * @param {object?} parent\n * @param {string[]} rule\n * @param {string[]} rules\n * @param {string[]} rulesets\n * @param {number[]} pseudo\n * @param {number[]} points\n * @param {string[]} declarations\n * @return {object}\n */\nexport function parse (value, root, parent, rule, rules, rulesets, pseudo, points, declarations) {\n\tvar index = 0\n\tvar offset = 0\n\tvar length = pseudo\n\tvar atrule = 0\n\tvar property = 0\n\tvar previous = 0\n\tvar variable = 1\n\tvar scanning = 1\n\tvar ampersand = 1\n\tvar character = 0\n\tvar type = ''\n\tvar props = rules\n\tvar children = rulesets\n\tvar reference = rule\n\tvar characters = type\n\n\twhile (scanning)\n\t\tswitch (previous = character, character = next()) {\n\t\t\t// (\n\t\t\tcase 40:\n\t\t\t\tif (previous != 108 && charat(characters, length - 1) == 58) {\n\t\t\t\t\tif (indexof(characters += replace(delimit(character), '&', '&\\f'), '&\\f') != -1)\n\t\t\t\t\t\tampersand = -1\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t// \" ' [\n\t\t\tcase 34: case 39: case 91:\n\t\t\t\tcharacters += delimit(character)\n\t\t\t\tbreak\n\t\t\t// \\t \\n \\r \\s\n\t\t\tcase 9: case 10: case 13: case 32:\n\t\t\t\tcharacters += whitespace(previous)\n\t\t\t\tbreak\n\t\t\t// \\\n\t\t\tcase 92:\n\t\t\t\tcharacters += escaping(caret() - 1, 7)\n\t\t\t\tcontinue\n\t\t\t// /\n\t\t\tcase 47:\n\t\t\t\tswitch (peek()) {\n\t\t\t\t\tcase 42: case 47:\n\t\t\t\t\t\tappend(comment(commenter(next(), caret()), root, parent), declarations)\n\t\t\t\t\t\tbreak\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tcharacters += '/'\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t// {\n\t\t\tcase 123 * variable:\n\t\t\t\tpoints[index++] = strlen(characters) * ampersand\n\t\t\t// } ; \\0\n\t\t\tcase 125 * variable: case 59: case 0:\n\t\t\t\tswitch (character) {\n\t\t\t\t\t// \\0 }\n\t\t\t\t\tcase 0: case 125: scanning = 0\n\t\t\t\t\t// ;\n\t\t\t\t\tcase 59 + offset: if (ampersand == -1) characters = replace(characters, /\\f/g, '')\n\t\t\t\t\t\tif (property > 0 && (strlen(characters) - length))\n\t\t\t\t\t\t\tappend(property > 32 ? declaration(characters + ';', rule, parent, length - 1) : declaration(replace(characters, ' ', '') + ';', rule, parent, length - 2), declarations)\n\t\t\t\t\t\tbreak\n\t\t\t\t\t// @ ;\n\t\t\t\t\tcase 59: characters += ';'\n\t\t\t\t\t// { rule/at-rule\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tappend(reference = ruleset(characters, root, parent, index, offset, rules, points, type, props = [], children = [], length), rulesets)\n\n\t\t\t\t\t\tif (character === 123)\n\t\t\t\t\t\t\tif (offset === 0)\n\t\t\t\t\t\t\t\tparse(characters, root, reference, reference, props, rulesets, length, points, children)\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tswitch (atrule === 99 && charat(characters, 3) === 110 ? 100 : atrule) {\n\t\t\t\t\t\t\t\t\t// d l m s\n\t\t\t\t\t\t\t\t\tcase 100: case 108: case 109: case 115:\n\t\t\t\t\t\t\t\t\t\tparse(value, reference, reference, rule && append(ruleset(value, reference, reference, 0, 0, rules, points, type, rules, props = [], length), children), rules, children, length, points, rule ? props : children)\n\t\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\tparse(characters, reference, reference, reference, [''], children, 0, points, children)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tindex = offset = property = 0, variable = ampersand = 1, type = characters = '', length = pseudo\n\t\t\t\tbreak\n\t\t\t// :\n\t\t\tcase 58:\n\t\t\t\tlength = 1 + strlen(characters), property = previous\n\t\t\tdefault:\n\t\t\t\tif (variable < 1)\n\t\t\t\t\tif (character == 123)\n\t\t\t\t\t\t--variable\n\t\t\t\t\telse if (character == 125 && variable++ == 0 && prev() == 125)\n\t\t\t\t\t\tcontinue\n\n\t\t\t\tswitch (characters += from(character), character * variable) {\n\t\t\t\t\t// &\n\t\t\t\t\tcase 38:\n\t\t\t\t\t\tampersand = offset > 0 ? 1 : (characters += '\\f', -1)\n\t\t\t\t\t\tbreak\n\t\t\t\t\t// ,\n\t\t\t\t\tcase 44:\n\t\t\t\t\t\tpoints[index++] = (strlen(characters) - 1) * ampersand, ampersand = 1\n\t\t\t\t\t\tbreak\n\t\t\t\t\t// @\n\t\t\t\t\tcase 64:\n\t\t\t\t\t\t// -\n\t\t\t\t\t\tif (peek() === 45)\n\t\t\t\t\t\t\tcharacters += delimit(next())\n\n\t\t\t\t\t\tatrule = peek(), offset = length = strlen(type = characters += identifier(caret())), character++\n\t\t\t\t\t\tbreak\n\t\t\t\t\t// -\n\t\t\t\t\tcase 45:\n\t\t\t\t\t\tif (previous === 45 && strlen(characters) == 2)\n\t\t\t\t\t\t\tvariable = 0\n\t\t\t\t}\n\t\t}\n\n\treturn rulesets\n}\n\n/**\n * @param {string} value\n * @param {object} root\n * @param {object?} parent\n * @param {number} index\n * @param {number} offset\n * @param {string[]} rules\n * @param {number[]} points\n * @param {string} type\n * @param {string[]} props\n * @param {string[]} children\n * @param {number} length\n * @return {object}\n */\nexport function ruleset (value, root, parent, index, offset, rules, points, type, props, children, length) {\n\tvar post = offset - 1\n\tvar rule = offset === 0 ? rules : ['']\n\tvar size = sizeof(rule)\n\n\tfor (var i = 0, j = 0, k = 0; i < index; ++i)\n\t\tfor (var x = 0, y = substr(value, post + 1, post = abs(j = points[i])), z = value; x < size; ++x)\n\t\t\tif (z = trim(j > 0 ? rule[x] + ' ' + y : replace(y, /&\\f/g, rule[x])))\n\t\t\t\tprops[k++] = z\n\n\treturn node(value, root, parent, offset === 0 ? RULESET : type, props, children, length)\n}\n\n/**\n * @param {number} value\n * @param {object} root\n * @param {object?} parent\n * @return {object}\n */\nexport function comment (value, root, parent) {\n\treturn node(value, root, parent, COMMENT, from(char()), substr(value, 2, -2), 0)\n}\n\n/**\n * @param {string} value\n * @param {object} root\n * @param {object?} parent\n * @param {number} length\n * @return {object}\n */\nexport function declaration (value, root, parent, length) {\n\treturn node(value, root, parent, DECLARATION, substr(value, 0, length), substr(value, length + 1, -1), length)\n}\n","import { StyleSheet } from '@emotion/sheet';\nimport { dealloc, alloc, next, token, from, peek, delimit, slice, position, RULESET, combine, match, serialize, copy, replace, WEBKIT, MOZ, MS, KEYFRAMES, DECLARATION, hash, charat, strlen, indexof, stringify, rulesheet, middleware, compile } from 'stylis';\nimport '@emotion/weak-memoize';\nimport '@emotion/memoize';\n\nvar identifierWithPointTracking = function identifierWithPointTracking(begin, points, index) {\n var previous = 0;\n var character = 0;\n\n while (true) {\n previous = character;\n character = peek(); // &\\f\n\n if (previous === 38 && character === 12) {\n points[index] = 1;\n }\n\n if (token(character)) {\n break;\n }\n\n next();\n }\n\n return slice(begin, position);\n};\n\nvar toRules = function toRules(parsed, points) {\n // pretend we've started with a comma\n var index = -1;\n var character = 44;\n\n do {\n switch (token(character)) {\n case 0:\n // &\\f\n if (character === 38 && peek() === 12) {\n // this is not 100% correct, we don't account for literal sequences here - like for example quoted strings\n // stylis inserts \\f after & to know when & where it should replace this sequence with the context selector\n // and when it should just concatenate the outer and inner selectors\n // it's very unlikely for this sequence to actually appear in a different context, so we just leverage this fact here\n points[index] = 1;\n }\n\n parsed[index] += identifierWithPointTracking(position - 1, points, index);\n break;\n\n case 2:\n parsed[index] += delimit(character);\n break;\n\n case 4:\n // comma\n if (character === 44) {\n // colon\n parsed[++index] = peek() === 58 ? '&\\f' : '';\n points[index] = parsed[index].length;\n break;\n }\n\n // fallthrough\n\n default:\n parsed[index] += from(character);\n }\n } while (character = next());\n\n return parsed;\n};\n\nvar getRules = function getRules(value, points) {\n return dealloc(toRules(alloc(value), points));\n}; // WeakSet would be more appropriate, but only WeakMap is supported in IE11\n\n\nvar fixedElements = /* #__PURE__ */new WeakMap();\nvar compat = function compat(element) {\n if (element.type !== 'rule' || !element.parent || // positive .length indicates that this rule contains pseudo\n // negative .length indicates that this rule has been already prefixed\n element.length < 1) {\n return;\n }\n\n var value = element.value;\n var parent = element.parent;\n var isImplicitRule = element.column === parent.column && element.line === parent.line;\n\n while (parent.type !== 'rule') {\n parent = parent.parent;\n if (!parent) return;\n } // short-circuit for the simplest case\n\n\n if (element.props.length === 1 && value.charCodeAt(0) !== 58\n /* colon */\n && !fixedElements.get(parent)) {\n return;\n } // if this is an implicitly inserted rule (the one eagerly inserted at the each new nested level)\n // then the props has already been manipulated beforehand as they that array is shared between it and its \"rule parent\"\n\n\n if (isImplicitRule) {\n return;\n }\n\n fixedElements.set(element, true);\n var points = [];\n var rules = getRules(value, points);\n var parentRules = parent.props;\n\n for (var i = 0, k = 0; i < rules.length; i++) {\n for (var j = 0; j < parentRules.length; j++, k++) {\n element.props[k] = points[i] ? rules[i].replace(/&\\f/g, parentRules[j]) : parentRules[j] + \" \" + rules[i];\n }\n }\n};\nvar removeLabel = function removeLabel(element) {\n if (element.type === 'decl') {\n var value = element.value;\n\n if ( // charcode for l\n value.charCodeAt(0) === 108 && // charcode for b\n value.charCodeAt(2) === 98) {\n // this ignores label\n element[\"return\"] = '';\n element.value = '';\n }\n }\n};\n\n/* eslint-disable no-fallthrough */\n\nfunction prefix(value, length) {\n switch (hash(value, length)) {\n // color-adjust\n case 5103:\n return WEBKIT + 'print-' + value + value;\n // animation, animation-(delay|direction|duration|fill-mode|iteration-count|name|play-state|timing-function)\n\n case 5737:\n case 4201:\n case 3177:\n case 3433:\n case 1641:\n case 4457:\n case 2921: // text-decoration, filter, clip-path, backface-visibility, column, box-decoration-break\n\n case 5572:\n case 6356:\n case 5844:\n case 3191:\n case 6645:\n case 3005: // mask, mask-image, mask-(mode|clip|size), mask-(repeat|origin), mask-position, mask-composite,\n\n case 6391:\n case 5879:\n case 5623:\n case 6135:\n case 4599:\n case 4855: // background-clip, columns, column-(count|fill|gap|rule|rule-color|rule-style|rule-width|span|width)\n\n case 4215:\n case 6389:\n case 5109:\n case 5365:\n case 5621:\n case 3829:\n return WEBKIT + value + value;\n // appearance, user-select, transform, hyphens, text-size-adjust\n\n case 5349:\n case 4246:\n case 4810:\n case 6968:\n case 2756:\n return WEBKIT + value + MOZ + value + MS + value + value;\n // flex, flex-direction\n\n case 6828:\n case 4268:\n return WEBKIT + value + MS + value + value;\n // order\n\n case 6165:\n return WEBKIT + value + MS + 'flex-' + value + value;\n // align-items\n\n case 5187:\n return WEBKIT + value + replace(value, /(\\w+).+(:[^]+)/, WEBKIT + 'box-$1$2' + MS + 'flex-$1$2') + value;\n // align-self\n\n case 5443:\n return WEBKIT + value + MS + 'flex-item-' + replace(value, /flex-|-self/, '') + value;\n // align-content\n\n case 4675:\n return WEBKIT + value + MS + 'flex-line-pack' + replace(value, /align-content|flex-|-self/, '') + value;\n // flex-shrink\n\n case 5548:\n return WEBKIT + value + MS + replace(value, 'shrink', 'negative') + value;\n // flex-basis\n\n case 5292:\n return WEBKIT + value + MS + replace(value, 'basis', 'preferred-size') + value;\n // flex-grow\n\n case 6060:\n return WEBKIT + 'box-' + replace(value, '-grow', '') + WEBKIT + value + MS + replace(value, 'grow', 'positive') + value;\n // transition\n\n case 4554:\n return WEBKIT + replace(value, /([^-])(transform)/g, '$1' + WEBKIT + '$2') + value;\n // cursor\n\n case 6187:\n return replace(replace(replace(value, /(zoom-|grab)/, WEBKIT + '$1'), /(image-set)/, WEBKIT + '$1'), value, '') + value;\n // background, background-image\n\n case 5495:\n case 3959:\n return replace(value, /(image-set\\([^]*)/, WEBKIT + '$1' + '$`$1');\n // justify-content\n\n case 4968:\n return replace(replace(value, /(.+:)(flex-)?(.*)/, WEBKIT + 'box-pack:$3' + MS + 'flex-pack:$3'), /s.+-b[^;]+/, 'justify') + WEBKIT + value + value;\n // (margin|padding)-inline-(start|end)\n\n case 4095:\n case 3583:\n case 4068:\n case 2532:\n return replace(value, /(.+)-inline(.+)/, WEBKIT + '$1$2') + value;\n // (min|max)?(width|height|inline-size|block-size)\n\n case 8116:\n case 7059:\n case 5753:\n case 5535:\n case 5445:\n case 5701:\n case 4933:\n case 4677:\n case 5533:\n case 5789:\n case 5021:\n case 4765:\n // stretch, max-content, min-content, fill-available\n if (strlen(value) - 1 - length > 6) switch (charat(value, length + 1)) {\n // (m)ax-content, (m)in-content\n case 109:\n // -\n if (charat(value, length + 4) !== 45) break;\n // (f)ill-available, (f)it-content\n\n case 102:\n return replace(value, /(.+:)(.+)-([^]+)/, '$1' + WEBKIT + '$2-$3' + '$1' + MOZ + (charat(value, length + 3) == 108 ? '$3' : '$2-$3')) + value;\n // (s)tretch\n\n case 115:\n return ~indexof(value, 'stretch') ? prefix(replace(value, 'stretch', 'fill-available'), length) + value : value;\n }\n break;\n // position: sticky\n\n case 4949:\n // (s)ticky?\n if (charat(value, length + 1) !== 115) break;\n // display: (flex|inline-flex)\n\n case 6444:\n switch (charat(value, strlen(value) - 3 - (~indexof(value, '!important') && 10))) {\n // stic(k)y\n case 107:\n return replace(value, ':', ':' + WEBKIT) + value;\n // (inline-)?fl(e)x\n\n case 101:\n return replace(value, /(.+:)([^;!]+)(;|!.+)?/, '$1' + WEBKIT + (charat(value, 14) === 45 ? 'inline-' : '') + 'box$3' + '$1' + WEBKIT + '$2$3' + '$1' + MS + '$2box$3') + value;\n }\n\n break;\n // writing-mode\n\n case 5936:\n switch (charat(value, length + 11)) {\n // vertical-l(r)\n case 114:\n return WEBKIT + value + MS + replace(value, /[svh]\\w+-[tblr]{2}/, 'tb') + value;\n // vertical-r(l)\n\n case 108:\n return WEBKIT + value + MS + replace(value, /[svh]\\w+-[tblr]{2}/, 'tb-rl') + value;\n // horizontal(-)tb\n\n case 45:\n return WEBKIT + value + MS + replace(value, /[svh]\\w+-[tblr]{2}/, 'lr') + value;\n }\n\n return WEBKIT + value + MS + value + value;\n }\n\n return value;\n}\n\nvar prefixer = function prefixer(element, index, children, callback) {\n if (element.length > -1) if (!element[\"return\"]) switch (element.type) {\n case DECLARATION:\n element[\"return\"] = prefix(element.value, element.length);\n break;\n\n case KEYFRAMES:\n return serialize([copy(element, {\n value: replace(element.value, '@', '@' + WEBKIT)\n })], callback);\n\n case RULESET:\n if (element.length) return combine(element.props, function (value) {\n switch (match(value, /(::plac\\w+|:read-\\w+)/)) {\n // :read-(only|write)\n case ':read-only':\n case ':read-write':\n return serialize([copy(element, {\n props: [replace(value, /:(read-\\w+)/, ':' + MOZ + '$1')]\n })], callback);\n // :placeholder\n\n case '::placeholder':\n return serialize([copy(element, {\n props: [replace(value, /:(plac\\w+)/, ':' + WEBKIT + 'input-$1')]\n }), copy(element, {\n props: [replace(value, /:(plac\\w+)/, ':' + MOZ + '$1')]\n }), copy(element, {\n props: [replace(value, /:(plac\\w+)/, MS + 'input-$1')]\n })], callback);\n }\n\n return '';\n });\n }\n};\n\nvar defaultStylisPlugins = [prefixer];\n\nvar createCache = function createCache(options) {\n var key = options.key;\n\n if (key === 'css') {\n var ssrStyles = document.querySelectorAll(\"style[data-emotion]:not([data-s])\"); // get SSRed styles out of the way of React's hydration\n // document.head is a safe place to move them to(though note document.head is not necessarily the last place they will be)\n // note this very very intentionally targets all style elements regardless of the key to ensure\n // that creating a cache works inside of render of a React component\n\n Array.prototype.forEach.call(ssrStyles, function (node) {\n // we want to only move elements which have a space in the data-emotion attribute value\n // because that indicates that it is an Emotion 11 server-side rendered style elements\n // while we will already ignore Emotion 11 client-side inserted styles because of the :not([data-s]) part in the selector\n // Emotion 10 client-side inserted styles did not have data-s (but importantly did not have a space in their data-emotion attributes)\n // so checking for the space ensures that loading Emotion 11 after Emotion 10 has inserted some styles\n // will not result in the Emotion 10 styles being destroyed\n var dataEmotionAttribute = node.getAttribute('data-emotion');\n\n if (dataEmotionAttribute.indexOf(' ') === -1) {\n return;\n }\n\n document.head.appendChild(node);\n node.setAttribute('data-s', '');\n });\n }\n\n var stylisPlugins = options.stylisPlugins || defaultStylisPlugins;\n\n var inserted = {};\n var container;\n var nodesToHydrate = [];\n\n {\n container = options.container || document.head;\n Array.prototype.forEach.call( // this means we will ignore elements which don't have a space in them which\n // means that the style elements we're looking at are only Emotion 11 server-rendered style elements\n document.querySelectorAll(\"style[data-emotion^=\\\"\" + key + \" \\\"]\"), function (node) {\n var attrib = node.getAttribute(\"data-emotion\").split(' ');\n\n for (var i = 1; i < attrib.length; i++) {\n inserted[attrib[i]] = true;\n }\n\n nodesToHydrate.push(node);\n });\n }\n\n var _insert;\n\n var omnipresentPlugins = [compat, removeLabel];\n\n {\n var currentSheet;\n var finalizingPlugins = [stringify, rulesheet(function (rule) {\n currentSheet.insert(rule);\n })];\n var serializer = middleware(omnipresentPlugins.concat(stylisPlugins, finalizingPlugins));\n\n var stylis = function stylis(styles) {\n return serialize(compile(styles), serializer);\n };\n\n _insert = function insert(selector, serialized, sheet, shouldCache) {\n currentSheet = sheet;\n\n stylis(selector ? selector + \"{\" + serialized.styles + \"}\" : serialized.styles);\n\n if (shouldCache) {\n cache.inserted[serialized.name] = true;\n }\n };\n }\n\n var cache = {\n key: key,\n sheet: new StyleSheet({\n key: key,\n container: container,\n nonce: options.nonce,\n speedy: options.speedy,\n prepend: options.prepend,\n insertionPoint: options.insertionPoint\n }),\n nonce: options.nonce,\n inserted: inserted,\n registered: {},\n insert: _insert\n };\n cache.sheet.hydrate(nodesToHydrate);\n return cache;\n};\n\nexport { createCache as default };\n","import {MS, MOZ, WEBKIT, RULESET, KEYFRAMES, DECLARATION} from './Enum.js'\nimport {match, charat, substr, strlen, sizeof, replace, combine} from './Utility.js'\nimport {copy, tokenize} from './Tokenizer.js'\nimport {serialize} from './Serializer.js'\nimport {prefix} from './Prefixer.js'\n\n/**\n * @param {function[]} collection\n * @return {function}\n */\nexport function middleware (collection) {\n\tvar length = sizeof(collection)\n\n\treturn function (element, index, children, callback) {\n\t\tvar output = ''\n\n\t\tfor (var i = 0; i < length; i++)\n\t\t\toutput += collection[i](element, index, children, callback) || ''\n\n\t\treturn output\n\t}\n}\n\n/**\n * @param {function} callback\n * @return {function}\n */\nexport function rulesheet (callback) {\n\treturn function (element) {\n\t\tif (!element.root)\n\t\t\tif (element = element.return)\n\t\t\t\tcallback(element)\n\t}\n}\n\n/**\n * @param {object} element\n * @param {number} index\n * @param {object[]} children\n * @param {function} callback\n */\nexport function prefixer (element, index, children, callback) {\n\tif (element.length > -1)\n\t\tif (!element.return)\n\t\t\tswitch (element.type) {\n\t\t\t\tcase DECLARATION: element.return = prefix(element.value, element.length, children)\n\t\t\t\t\treturn\n\t\t\t\tcase KEYFRAMES:\n\t\t\t\t\treturn serialize([copy(element, {value: replace(element.value, '@', '@' + WEBKIT)})], callback)\n\t\t\t\tcase RULESET:\n\t\t\t\t\tif (element.length)\n\t\t\t\t\t\treturn combine(element.props, function (value) {\n\t\t\t\t\t\t\tswitch (match(value, /(::plac\\w+|:read-\\w+)/)) {\n\t\t\t\t\t\t\t\t// :read-(only|write)\n\t\t\t\t\t\t\t\tcase ':read-only': case ':read-write':\n\t\t\t\t\t\t\t\t\treturn serialize([copy(element, {props: [replace(value, /:(read-\\w+)/, ':' + MOZ + '$1')]})], callback)\n\t\t\t\t\t\t\t\t// :placeholder\n\t\t\t\t\t\t\t\tcase '::placeholder':\n\t\t\t\t\t\t\t\t\treturn serialize([\n\t\t\t\t\t\t\t\t\t\tcopy(element, {props: [replace(value, /:(plac\\w+)/, ':' + WEBKIT + 'input-$1')]}),\n\t\t\t\t\t\t\t\t\t\tcopy(element, {props: [replace(value, /:(plac\\w+)/, ':' + MOZ + '$1')]}),\n\t\t\t\t\t\t\t\t\t\tcopy(element, {props: [replace(value, /:(plac\\w+)/, MS + 'input-$1')]})\n\t\t\t\t\t\t\t\t\t], callback)\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn ''\n\t\t\t\t\t\t})\n\t\t\t}\n}\n\n/**\n * @param {object} element\n * @param {number} index\n * @param {object[]} children\n */\nexport function namespace (element) {\n\tswitch (element.type) {\n\t\tcase RULESET:\n\t\t\telement.props = element.props.map(function (value) {\n\t\t\t\treturn combine(tokenize(value), function (value, index, children) {\n\t\t\t\t\tswitch (charat(value, 0)) {\n\t\t\t\t\t\t// \\f\n\t\t\t\t\t\tcase 12:\n\t\t\t\t\t\t\treturn substr(value, 1, strlen(value))\n\t\t\t\t\t\t// \\0 ( + > ~\n\t\t\t\t\t\tcase 0: case 40: case 43: case 62: case 126:\n\t\t\t\t\t\t\treturn value\n\t\t\t\t\t\t// :\n\t\t\t\t\t\tcase 58:\n\t\t\t\t\t\t\tif (children[++index] === 'global')\n\t\t\t\t\t\t\t\tchildren[index] = '', children[++index] = '\\f' + substr(children[index], index = 1, -1)\n\t\t\t\t\t\t// \\s\n\t\t\t\t\t\tcase 32:\n\t\t\t\t\t\t\treturn index === 1 ? '' : value\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tswitch (index) {\n\t\t\t\t\t\t\t\tcase 0: element = value\n\t\t\t\t\t\t\t\t\treturn sizeof(children) > 1 ? '' : value\n\t\t\t\t\t\t\t\tcase index = sizeof(children) - 1: case 2:\n\t\t\t\t\t\t\t\t\treturn index === 2 ? value + element + element : value + element\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\treturn value\n\t\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t}\n}\n","function _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function (n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\nexport { _extends as default };","var weakMemoize = function weakMemoize(func) {\n var cache = new WeakMap();\n return function (arg) {\n if (cache.has(arg)) {\n // Use non-null assertion because we just checked that the cache `has` it\n // This allows us to remove `undefined` from the return value\n return cache.get(arg);\n }\n\n var ret = func(arg);\n cache.set(arg, ret);\n return ret;\n };\n};\n\nexport { weakMemoize as default };\n","var isBrowser = true;\n\nfunction getRegisteredStyles(registered, registeredStyles, classNames) {\n var rawClassName = '';\n classNames.split(' ').forEach(function (className) {\n if (registered[className] !== undefined) {\n registeredStyles.push(registered[className] + \";\");\n } else if (className) {\n rawClassName += className + \" \";\n }\n });\n return rawClassName;\n}\nvar registerStyles = function registerStyles(cache, serialized, isStringTag) {\n var className = cache.key + \"-\" + serialized.name;\n\n if ( // we only need to add the styles to the registered cache if the\n // class name could be used further down\n // the tree but if it's a string tag, we know it won't\n // so we don't have to add it to registered cache.\n // this improves memory usage since we can avoid storing the whole style string\n (isStringTag === false || // we need to always store it if we're in compat mode and\n // in node since emotion-server relies on whether a style is in\n // the registered cache to know whether a style is global or not\n // also, note that this check will be dead code eliminated in the browser\n isBrowser === false ) && cache.registered[className] === undefined) {\n cache.registered[className] = serialized.styles;\n }\n};\nvar insertStyles = function insertStyles(cache, serialized, isStringTag) {\n registerStyles(cache, serialized, isStringTag);\n var className = cache.key + \"-\" + serialized.name;\n\n if (cache.inserted[serialized.name] === undefined) {\n var current = serialized;\n\n do {\n cache.insert(serialized === current ? \".\" + className : '', current, cache.sheet, true);\n\n current = current.next;\n } while (current !== undefined);\n }\n};\n\nexport { getRegisteredStyles, insertStyles, registerStyles };\n","var unitlessKeys = {\n animationIterationCount: 1,\n aspectRatio: 1,\n borderImageOutset: 1,\n borderImageSlice: 1,\n borderImageWidth: 1,\n boxFlex: 1,\n boxFlexGroup: 1,\n boxOrdinalGroup: 1,\n columnCount: 1,\n columns: 1,\n flex: 1,\n flexGrow: 1,\n flexPositive: 1,\n flexShrink: 1,\n flexNegative: 1,\n flexOrder: 1,\n gridRow: 1,\n gridRowEnd: 1,\n gridRowSpan: 1,\n gridRowStart: 1,\n gridColumn: 1,\n gridColumnEnd: 1,\n gridColumnSpan: 1,\n gridColumnStart: 1,\n msGridRow: 1,\n msGridRowSpan: 1,\n msGridColumn: 1,\n msGridColumnSpan: 1,\n fontWeight: 1,\n lineHeight: 1,\n opacity: 1,\n order: 1,\n orphans: 1,\n scale: 1,\n tabSize: 1,\n widows: 1,\n zIndex: 1,\n zoom: 1,\n WebkitLineClamp: 1,\n // SVG-related properties\n fillOpacity: 1,\n floodOpacity: 1,\n stopOpacity: 1,\n strokeDasharray: 1,\n strokeDashoffset: 1,\n strokeMiterlimit: 1,\n strokeOpacity: 1,\n strokeWidth: 1\n};\n\nexport { unitlessKeys as default };\n","function memoize(fn) {\n var cache = Object.create(null);\n return function (arg) {\n if (cache[arg] === undefined) cache[arg] = fn(arg);\n return cache[arg];\n };\n}\n\nexport { memoize as default };\n","import hashString from '@emotion/hash';\nimport unitless from '@emotion/unitless';\nimport memoize from '@emotion/memoize';\n\nvar isDevelopment = false;\n\nvar hyphenateRegex = /[A-Z]|^ms/g;\nvar animationRegex = /_EMO_([^_]+?)_([^]*?)_EMO_/g;\n\nvar isCustomProperty = function isCustomProperty(property) {\n return property.charCodeAt(1) === 45;\n};\n\nvar isProcessableValue = function isProcessableValue(value) {\n return value != null && typeof value !== 'boolean';\n};\n\nvar processStyleName = /* #__PURE__ */memoize(function (styleName) {\n return isCustomProperty(styleName) ? styleName : styleName.replace(hyphenateRegex, '-$&').toLowerCase();\n});\n\nvar processStyleValue = function processStyleValue(key, value) {\n switch (key) {\n case 'animation':\n case 'animationName':\n {\n if (typeof value === 'string') {\n return value.replace(animationRegex, function (match, p1, p2) {\n cursor = {\n name: p1,\n styles: p2,\n next: cursor\n };\n return p1;\n });\n }\n }\n }\n\n if (unitless[key] !== 1 && !isCustomProperty(key) && typeof value === 'number' && value !== 0) {\n return value + 'px';\n }\n\n return value;\n};\n\nvar noComponentSelectorMessage = 'Component selectors can only be used in conjunction with ' + '@emotion/babel-plugin, the swc Emotion plugin, or another Emotion-aware ' + 'compiler transform.';\n\nfunction handleInterpolation(mergedProps, registered, interpolation) {\n if (interpolation == null) {\n return '';\n }\n\n var componentSelector = interpolation;\n\n if (componentSelector.__emotion_styles !== undefined) {\n\n return componentSelector;\n }\n\n switch (typeof interpolation) {\n case 'boolean':\n {\n return '';\n }\n\n case 'object':\n {\n var keyframes = interpolation;\n\n if (keyframes.anim === 1) {\n cursor = {\n name: keyframes.name,\n styles: keyframes.styles,\n next: cursor\n };\n return keyframes.name;\n }\n\n var serializedStyles = interpolation;\n\n if (serializedStyles.styles !== undefined) {\n var next = serializedStyles.next;\n\n if (next !== undefined) {\n // not the most efficient thing ever but this is a pretty rare case\n // and there will be very few iterations of this generally\n while (next !== undefined) {\n cursor = {\n name: next.name,\n styles: next.styles,\n next: cursor\n };\n next = next.next;\n }\n }\n\n var styles = serializedStyles.styles + \";\";\n return styles;\n }\n\n return createStringFromObject(mergedProps, registered, interpolation);\n }\n\n case 'function':\n {\n if (mergedProps !== undefined) {\n var previousCursor = cursor;\n var result = interpolation(mergedProps);\n cursor = previousCursor;\n return handleInterpolation(mergedProps, registered, result);\n }\n\n break;\n }\n } // finalize string values (regular strings and functions interpolated into css calls)\n\n\n var asString = interpolation;\n\n if (registered == null) {\n return asString;\n }\n\n var cached = registered[asString];\n return cached !== undefined ? cached : asString;\n}\n\nfunction createStringFromObject(mergedProps, registered, obj) {\n var string = '';\n\n if (Array.isArray(obj)) {\n for (var i = 0; i < obj.length; i++) {\n string += handleInterpolation(mergedProps, registered, obj[i]) + \";\";\n }\n } else {\n for (var key in obj) {\n var value = obj[key];\n\n if (typeof value !== 'object') {\n var asString = value;\n\n if (registered != null && registered[asString] !== undefined) {\n string += key + \"{\" + registered[asString] + \"}\";\n } else if (isProcessableValue(asString)) {\n string += processStyleName(key) + \":\" + processStyleValue(key, asString) + \";\";\n }\n } else {\n if (key === 'NO_COMPONENT_SELECTOR' && isDevelopment) {\n throw new Error(noComponentSelectorMessage);\n }\n\n if (Array.isArray(value) && typeof value[0] === 'string' && (registered == null || registered[value[0]] === undefined)) {\n for (var _i = 0; _i < value.length; _i++) {\n if (isProcessableValue(value[_i])) {\n string += processStyleName(key) + \":\" + processStyleValue(key, value[_i]) + \";\";\n }\n }\n } else {\n var interpolated = handleInterpolation(mergedProps, registered, value);\n\n switch (key) {\n case 'animation':\n case 'animationName':\n {\n string += processStyleName(key) + \":\" + interpolated + \";\";\n break;\n }\n\n default:\n {\n\n string += key + \"{\" + interpolated + \"}\";\n }\n }\n }\n }\n }\n }\n\n return string;\n}\n\nvar labelPattern = /label:\\s*([^\\s;{]+)\\s*(;|$)/g; // this is the cursor for keyframes\n// keyframes are stored on the SerializedStyles object as a linked list\n\nvar cursor;\nfunction serializeStyles(args, registered, mergedProps) {\n if (args.length === 1 && typeof args[0] === 'object' && args[0] !== null && args[0].styles !== undefined) {\n return args[0];\n }\n\n var stringMode = true;\n var styles = '';\n cursor = undefined;\n var strings = args[0];\n\n if (strings == null || strings.raw === undefined) {\n stringMode = false;\n styles += handleInterpolation(mergedProps, registered, strings);\n } else {\n var asTemplateStringsArr = strings;\n\n styles += asTemplateStringsArr[0];\n } // we start at 1 since we've already handled the first arg\n\n\n for (var i = 1; i < args.length; i++) {\n styles += handleInterpolation(mergedProps, registered, args[i]);\n\n if (stringMode) {\n var templateStringsArr = strings;\n\n styles += templateStringsArr[i];\n }\n } // using a global regex with .exec is stateful so lastIndex has to be reset each time\n\n\n labelPattern.lastIndex = 0;\n var identifierName = '';\n var match; // https://esbench.com/bench/5b809c2cf2949800a0f61fb5\n\n while ((match = labelPattern.exec(styles)) !== null) {\n identifierName += '-' + match[1];\n }\n\n var name = hashString(styles) + identifierName;\n\n return {\n name: name,\n styles: styles,\n next: cursor\n };\n}\n\nexport { serializeStyles };\n","/* eslint-disable */\n// Inspired by https://github.com/garycourt/murmurhash-js\n// Ported from https://github.com/aappleby/smhasher/blob/61a0530f28277f2e850bfc39600ce61d02b518de/src/MurmurHash2.cpp#L37-L86\nfunction murmur2(str) {\n // 'm' and 'r' are mixing constants generated offline.\n // They're not really 'magic', they just happen to work well.\n // const m = 0x5bd1e995;\n // const r = 24;\n // Initialize the hash\n var h = 0; // Mix 4 bytes at a time into the hash\n\n var k,\n i = 0,\n len = str.length;\n\n for (; len >= 4; ++i, len -= 4) {\n k = str.charCodeAt(i) & 0xff | (str.charCodeAt(++i) & 0xff) << 8 | (str.charCodeAt(++i) & 0xff) << 16 | (str.charCodeAt(++i) & 0xff) << 24;\n k =\n /* Math.imul(k, m): */\n (k & 0xffff) * 0x5bd1e995 + ((k >>> 16) * 0xe995 << 16);\n k ^=\n /* k >>> r: */\n k >>> 24;\n h =\n /* Math.imul(k, m): */\n (k & 0xffff) * 0x5bd1e995 + ((k >>> 16) * 0xe995 << 16) ^\n /* Math.imul(h, m): */\n (h & 0xffff) * 0x5bd1e995 + ((h >>> 16) * 0xe995 << 16);\n } // Handle the last few bytes of the input array\n\n\n switch (len) {\n case 3:\n h ^= (str.charCodeAt(i + 2) & 0xff) << 16;\n\n case 2:\n h ^= (str.charCodeAt(i + 1) & 0xff) << 8;\n\n case 1:\n h ^= str.charCodeAt(i) & 0xff;\n h =\n /* Math.imul(h, m): */\n (h & 0xffff) * 0x5bd1e995 + ((h >>> 16) * 0xe995 << 16);\n } // Do a few final mixes of the hash to ensure the last few\n // bytes are well-incorporated.\n\n\n h ^= h >>> 13;\n h =\n /* Math.imul(h, m): */\n (h & 0xffff) * 0x5bd1e995 + ((h >>> 16) * 0xe995 << 16);\n return ((h ^ h >>> 15) >>> 0).toString(36);\n}\n\nexport { murmur2 as default };\n","import * as React from 'react';\n\nvar syncFallback = function syncFallback(create) {\n return create();\n};\n\nvar useInsertionEffect = React['useInsertion' + 'Effect'] ? React['useInsertion' + 'Effect'] : false;\nvar useInsertionEffectAlwaysWithSyncFallback = useInsertionEffect || syncFallback;\nvar useInsertionEffectWithLayoutFallback = useInsertionEffect || React.useLayoutEffect;\n\nexport { useInsertionEffectAlwaysWithSyncFallback, useInsertionEffectWithLayoutFallback };\n","import * as React from 'react';\nimport { useContext, forwardRef } from 'react';\nimport createCache from '@emotion/cache';\nimport _extends from '@babel/runtime/helpers/esm/extends';\nimport weakMemoize from '@emotion/weak-memoize';\nimport hoistNonReactStatics from '../_isolated-hnrs/dist/emotion-react-_isolated-hnrs.browser.esm.js';\nimport { getRegisteredStyles, registerStyles, insertStyles } from '@emotion/utils';\nimport { serializeStyles } from '@emotion/serialize';\nimport { useInsertionEffectAlwaysWithSyncFallback } from '@emotion/use-insertion-effect-with-fallbacks';\n\nvar isDevelopment = false;\n\nvar EmotionCacheContext = /* #__PURE__ */React.createContext( // we're doing this to avoid preconstruct's dead code elimination in this one case\n// because this module is primarily intended for the browser and node\n// but it's also required in react native and similar environments sometimes\n// and we could have a special build just for that\n// but this is much easier and the native packages\n// might use a different theme context in the future anyway\ntypeof HTMLElement !== 'undefined' ? /* #__PURE__ */createCache({\n key: 'css'\n}) : null);\n\nvar CacheProvider = EmotionCacheContext.Provider;\nvar __unsafe_useEmotionCache = function useEmotionCache() {\n return useContext(EmotionCacheContext);\n};\n\nvar withEmotionCache = function withEmotionCache(func) {\n return /*#__PURE__*/forwardRef(function (props, ref) {\n // the cache will never be null in the browser\n var cache = useContext(EmotionCacheContext);\n return func(props, cache, ref);\n });\n};\n\nvar ThemeContext = /* #__PURE__ */React.createContext({});\n\nvar useTheme = function useTheme() {\n return React.useContext(ThemeContext);\n};\n\nvar getTheme = function getTheme(outerTheme, theme) {\n if (typeof theme === 'function') {\n var mergedTheme = theme(outerTheme);\n\n return mergedTheme;\n }\n\n return _extends({}, outerTheme, theme);\n};\n\nvar createCacheWithTheme = /* #__PURE__ */weakMemoize(function (outerTheme) {\n return weakMemoize(function (theme) {\n return getTheme(outerTheme, theme);\n });\n});\nvar ThemeProvider = function ThemeProvider(props) {\n var theme = React.useContext(ThemeContext);\n\n if (props.theme !== theme) {\n theme = createCacheWithTheme(theme)(props.theme);\n }\n\n return /*#__PURE__*/React.createElement(ThemeContext.Provider, {\n value: theme\n }, props.children);\n};\nfunction withTheme(Component) {\n var componentName = Component.displayName || Component.name || 'Component';\n var WithTheme = /*#__PURE__*/React.forwardRef(function render(props, ref) {\n var theme = React.useContext(ThemeContext);\n return /*#__PURE__*/React.createElement(Component, _extends({\n theme: theme,\n ref: ref\n }, props));\n });\n WithTheme.displayName = \"WithTheme(\" + componentName + \")\";\n return hoistNonReactStatics(WithTheme, Component);\n}\n\nvar hasOwn = {}.hasOwnProperty;\n\nvar typePropName = '__EMOTION_TYPE_PLEASE_DO_NOT_USE__';\nvar createEmotionProps = function createEmotionProps(type, props) {\n\n var newProps = {};\n\n for (var _key in props) {\n if (hasOwn.call(props, _key)) {\n newProps[_key] = props[_key];\n }\n }\n\n newProps[typePropName] = type; // Runtime labeling is an opt-in feature because:\n\n return newProps;\n};\n\nvar Insertion = function Insertion(_ref) {\n var cache = _ref.cache,\n serialized = _ref.serialized,\n isStringTag = _ref.isStringTag;\n registerStyles(cache, serialized, isStringTag);\n useInsertionEffectAlwaysWithSyncFallback(function () {\n return insertStyles(cache, serialized, isStringTag);\n });\n\n return null;\n};\n\nvar Emotion = /* #__PURE__ */withEmotionCache(function (props, cache, ref) {\n var cssProp = props.css; // so that using `css` from `emotion` and passing the result to the css prop works\n // not passing the registered cache to serializeStyles because it would\n // make certain babel optimisations not possible\n\n if (typeof cssProp === 'string' && cache.registered[cssProp] !== undefined) {\n cssProp = cache.registered[cssProp];\n }\n\n var WrappedComponent = props[typePropName];\n var registeredStyles = [cssProp];\n var className = '';\n\n if (typeof props.className === 'string') {\n className = getRegisteredStyles(cache.registered, registeredStyles, props.className);\n } else if (props.className != null) {\n className = props.className + \" \";\n }\n\n var serialized = serializeStyles(registeredStyles, undefined, React.useContext(ThemeContext));\n\n className += cache.key + \"-\" + serialized.name;\n var newProps = {};\n\n for (var _key2 in props) {\n if (hasOwn.call(props, _key2) && _key2 !== 'css' && _key2 !== typePropName && (!isDevelopment )) {\n newProps[_key2] = props[_key2];\n }\n }\n\n newProps.className = className;\n\n if (ref) {\n newProps.ref = ref;\n }\n\n return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Insertion, {\n cache: cache,\n serialized: serialized,\n isStringTag: typeof WrappedComponent === 'string'\n }), /*#__PURE__*/React.createElement(WrappedComponent, newProps));\n});\n\nvar Emotion$1 = Emotion;\n\nexport { CacheProvider as C, Emotion$1 as E, ThemeContext as T, __unsafe_useEmotionCache as _, ThemeProvider as a, withTheme as b, createEmotionProps as c, hasOwn as h, isDevelopment as i, useTheme as u, withEmotionCache as w };\n","import { h as hasOwn, E as Emotion, c as createEmotionProps, w as withEmotionCache, T as ThemeContext, i as isDevelopment } from './emotion-element-f0de968e.browser.esm.js';\nexport { C as CacheProvider, T as ThemeContext, a as ThemeProvider, _ as __unsafe_useEmotionCache, u as useTheme, w as withEmotionCache, b as withTheme } from './emotion-element-f0de968e.browser.esm.js';\nimport * as React from 'react';\nimport { insertStyles, registerStyles, getRegisteredStyles } from '@emotion/utils';\nimport { useInsertionEffectWithLayoutFallback, useInsertionEffectAlwaysWithSyncFallback } from '@emotion/use-insertion-effect-with-fallbacks';\nimport { serializeStyles } from '@emotion/serialize';\nimport '@emotion/cache';\nimport '@babel/runtime/helpers/extends';\nimport '@emotion/weak-memoize';\nimport '../_isolated-hnrs/dist/emotion-react-_isolated-hnrs.browser.esm.js';\nimport 'hoist-non-react-statics';\n\nvar jsx = function jsx(type, props) {\n // eslint-disable-next-line prefer-rest-params\n var args = arguments;\n\n if (props == null || !hasOwn.call(props, 'css')) {\n return React.createElement.apply(undefined, args);\n }\n\n var argsLength = args.length;\n var createElementArgArray = new Array(argsLength);\n createElementArgArray[0] = Emotion;\n createElementArgArray[1] = createEmotionProps(type, props);\n\n for (var i = 2; i < argsLength; i++) {\n createElementArgArray[i] = args[i];\n }\n\n return React.createElement.apply(null, createElementArgArray);\n};\n\n(function (_jsx) {\n var JSX;\n\n (function (_JSX) {})(JSX || (JSX = _jsx.JSX || (_jsx.JSX = {})));\n})(jsx || (jsx = {}));\n\n// initial render from browser, insertBefore context.sheet.tags[0] or if a style hasn't been inserted there yet, appendChild\n// initial client-side render from SSR, use place of hydrating tag\n\nvar Global = /* #__PURE__ */withEmotionCache(function (props, cache) {\n\n var styles = props.styles;\n var serialized = serializeStyles([styles], undefined, React.useContext(ThemeContext));\n // but it is based on a constant that will never change at runtime\n // it's effectively like having two implementations and switching them out\n // so it's not actually breaking anything\n\n\n var sheetRef = React.useRef();\n useInsertionEffectWithLayoutFallback(function () {\n var key = cache.key + \"-global\"; // use case of https://github.com/emotion-js/emotion/issues/2675\n\n var sheet = new cache.sheet.constructor({\n key: key,\n nonce: cache.sheet.nonce,\n container: cache.sheet.container,\n speedy: cache.sheet.isSpeedy\n });\n var rehydrating = false;\n var node = document.querySelector(\"style[data-emotion=\\\"\" + key + \" \" + serialized.name + \"\\\"]\");\n\n if (cache.sheet.tags.length) {\n sheet.before = cache.sheet.tags[0];\n }\n\n if (node !== null) {\n rehydrating = true; // clear the hash so this node won't be recognizable as rehydratable by other <Global/>s\n\n node.setAttribute('data-emotion', key);\n sheet.hydrate([node]);\n }\n\n sheetRef.current = [sheet, rehydrating];\n return function () {\n sheet.flush();\n };\n }, [cache]);\n useInsertionEffectWithLayoutFallback(function () {\n var sheetRefCurrent = sheetRef.current;\n var sheet = sheetRefCurrent[0],\n rehydrating = sheetRefCurrent[1];\n\n if (rehydrating) {\n sheetRefCurrent[1] = false;\n return;\n }\n\n if (serialized.next !== undefined) {\n // insert keyframes\n insertStyles(cache, serialized.next, true);\n }\n\n if (sheet.tags.length) {\n // if this doesn't exist then it will be null so the style element will be appended\n var element = sheet.tags[sheet.tags.length - 1].nextElementSibling;\n sheet.before = element;\n sheet.flush();\n }\n\n cache.insert(\"\", serialized, sheet, false);\n }, [cache, serialized.name]);\n return null;\n});\n\nfunction css() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return serializeStyles(args);\n}\n\nfunction keyframes() {\n var insertable = css.apply(void 0, arguments);\n var name = \"animation-\" + insertable.name;\n return {\n name: name,\n styles: \"@keyframes \" + name + \"{\" + insertable.styles + \"}\",\n anim: 1,\n toString: function toString() {\n return \"_EMO_\" + this.name + \"_\" + this.styles + \"_EMO_\";\n }\n };\n}\n\nvar classnames = function classnames(args) {\n var len = args.length;\n var i = 0;\n var cls = '';\n\n for (; i < len; i++) {\n var arg = args[i];\n if (arg == null) continue;\n var toAdd = void 0;\n\n switch (typeof arg) {\n case 'boolean':\n break;\n\n case 'object':\n {\n if (Array.isArray(arg)) {\n toAdd = classnames(arg);\n } else {\n\n toAdd = '';\n\n for (var k in arg) {\n if (arg[k] && k) {\n toAdd && (toAdd += ' ');\n toAdd += k;\n }\n }\n }\n\n break;\n }\n\n default:\n {\n toAdd = arg;\n }\n }\n\n if (toAdd) {\n cls && (cls += ' ');\n cls += toAdd;\n }\n }\n\n return cls;\n};\n\nfunction merge(registered, css, className) {\n var registeredStyles = [];\n var rawClassName = getRegisteredStyles(registered, registeredStyles, className);\n\n if (registeredStyles.length < 2) {\n return className;\n }\n\n return rawClassName + css(registeredStyles);\n}\n\nvar Insertion = function Insertion(_ref) {\n var cache = _ref.cache,\n serializedArr = _ref.serializedArr;\n useInsertionEffectAlwaysWithSyncFallback(function () {\n\n for (var i = 0; i < serializedArr.length; i++) {\n insertStyles(cache, serializedArr[i], false);\n }\n });\n\n return null;\n};\n\nvar ClassNames = /* #__PURE__ */withEmotionCache(function (props, cache) {\n var hasRendered = false;\n var serializedArr = [];\n\n var css = function css() {\n if (hasRendered && isDevelopment) {\n throw new Error('css can only be used during render');\n }\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n var serialized = serializeStyles(args, cache.registered);\n serializedArr.push(serialized); // registration has to happen here as the result of this might get consumed by `cx`\n\n registerStyles(cache, serialized, false);\n return cache.key + \"-\" + serialized.name;\n };\n\n var cx = function cx() {\n if (hasRendered && isDevelopment) {\n throw new Error('cx can only be used during render');\n }\n\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n return merge(cache.registered, css, classnames(args));\n };\n\n var content = {\n css: css,\n cx: cx,\n theme: React.useContext(ThemeContext)\n };\n var ele = props.children(content);\n hasRendered = true;\n return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Insertion, {\n cache: cache,\n serializedArr: serializedArr\n }), ele);\n});\n\nexport { ClassNames, Global, jsx as createElement, css, jsx, keyframes };\n","import type { Tuple } from './types';\n\nexport const DEFAULT_COLORS = {\n dark: [\n '#C1C2C5',\n '#A6A7AB',\n '#909296',\n '#5c5f66',\n '#373A40',\n '#2C2E33',\n '#25262b',\n '#1A1B1E',\n '#141517',\n '#101113',\n ],\n\n gray: [\n '#f8f9fa',\n '#f1f3f5',\n '#e9ecef',\n '#dee2e6',\n '#ced4da',\n '#adb5bd',\n '#868e96',\n '#495057',\n '#343a40',\n '#212529',\n ],\n\n red: [\n '#fff5f5',\n '#ffe3e3',\n '#ffc9c9',\n '#ffa8a8',\n '#ff8787',\n '#ff6b6b',\n '#fa5252',\n '#f03e3e',\n '#e03131',\n '#c92a2a',\n ],\n\n pink: [\n '#fff0f6',\n '#ffdeeb',\n '#fcc2d7',\n '#faa2c1',\n '#f783ac',\n '#f06595',\n '#e64980',\n '#d6336c',\n '#c2255c',\n '#a61e4d',\n ],\n\n grape: [\n '#f8f0fc',\n '#f3d9fa',\n '#eebefa',\n '#e599f7',\n '#da77f2',\n '#cc5de8',\n '#be4bdb',\n '#ae3ec9',\n '#9c36b5',\n '#862e9c',\n ],\n\n violet: [\n '#f3f0ff',\n '#e5dbff',\n '#d0bfff',\n '#b197fc',\n '#9775fa',\n '#845ef7',\n '#7950f2',\n '#7048e8',\n '#6741d9',\n '#5f3dc4',\n ],\n\n indigo: [\n '#edf2ff',\n '#dbe4ff',\n '#bac8ff',\n '#91a7ff',\n '#748ffc',\n '#5c7cfa',\n '#4c6ef5',\n '#4263eb',\n '#3b5bdb',\n '#364fc7',\n ],\n\n blue: [\n '#e7f5ff',\n '#d0ebff',\n '#a5d8ff',\n '#74c0fc',\n '#4dabf7',\n '#339af0',\n '#228be6',\n '#1c7ed6',\n '#1971c2',\n '#1864ab',\n ],\n\n cyan: [\n '#e3fafc',\n '#c5f6fa',\n '#99e9f2',\n '#66d9e8',\n '#3bc9db',\n '#22b8cf',\n '#15aabf',\n '#1098ad',\n '#0c8599',\n '#0b7285',\n ],\n\n teal: [\n '#e6fcf5',\n '#c3fae8',\n '#96f2d7',\n '#63e6be',\n '#38d9a9',\n '#20c997',\n '#12b886',\n '#0ca678',\n '#099268',\n '#087f5b',\n ],\n\n green: [\n '#ebfbee',\n '#d3f9d8',\n '#b2f2bb',\n '#8ce99a',\n '#69db7c',\n '#51cf66',\n '#40c057',\n '#37b24d',\n '#2f9e44',\n '#2b8a3e',\n ],\n\n lime: [\n '#f4fce3',\n '#e9fac8',\n '#d8f5a2',\n '#c0eb75',\n '#a9e34b',\n '#94d82d',\n '#82c91e',\n '#74b816',\n '#66a80f',\n '#5c940d',\n ],\n\n yellow: [\n '#fff9db',\n '#fff3bf',\n '#ffec99',\n '#ffe066',\n '#ffd43b',\n '#fcc419',\n '#fab005',\n '#f59f00',\n '#f08c00',\n '#e67700',\n ],\n\n orange: [\n '#fff4e6',\n '#ffe8cc',\n '#ffd8a8',\n '#ffc078',\n '#ffa94d',\n '#ff922b',\n '#fd7e14',\n '#f76707',\n '#e8590c',\n '#d9480f',\n ],\n} as Record<string, Tuple<string, 10>>;\n","import type { MantineThemeBase } from '../../../types';\nimport type { CSSObject } from '../../../../tss';\n\nexport function focusStyles(theme: MantineThemeBase) {\n return (selector?: string): CSSObject => ({\n WebkitTapHighlightColor: 'transparent',\n\n [selector || '&:focus']: {\n ...(theme.focusRing === 'always' || theme.focusRing === 'auto'\n ? theme.focusRingStyles.styles(theme)\n : theme.focusRingStyles.resetStyles(theme)),\n },\n\n [selector\n ? selector.replace(':focus', ':focus:not(:focus-visible)')\n : '&:focus:not(:focus-visible)']: {\n ...(theme.focusRing === 'auto' || theme.focusRing === 'never'\n ? theme.focusRingStyles.resetStyles(theme)\n : null),\n },\n });\n}\n","import type { MantineThemeBase } from '../../../types';\n\nexport function primaryShade(theme: MantineThemeBase) {\n return (colorScheme?: 'light' | 'dark') => {\n if (typeof theme.primaryShade === 'number') {\n return theme.primaryShade;\n }\n\n return theme.primaryShade[colorScheme || theme.colorScheme];\n };\n}\n","import { primaryShade } from '../primary-shade/primary-shade';\nimport type { MantineThemeBase } from '../../../types';\n\nexport function themeColor(theme: MantineThemeBase) {\n const getPrimaryShade = primaryShade(theme);\n\n return (\n color: string,\n shade?: number,\n primaryFallback: boolean = true,\n useSplittedShade: boolean = true\n ) => {\n if (typeof color === 'string' && color.includes('.')) {\n const [splitterColor, _splittedShade] = color.split('.');\n const splittedShade = parseInt(_splittedShade, 10);\n\n if (splitterColor in theme.colors && splittedShade >= 0 && splittedShade < 10) {\n return theme.colors[splitterColor][\n typeof shade === 'number' && !useSplittedShade ? shade : splittedShade\n ];\n }\n }\n\n const _shade = typeof shade === 'number' ? shade : getPrimaryShade();\n\n return color in theme.colors\n ? theme.colors[color][_shade]\n : primaryFallback\n ? theme.colors[theme.primaryColor][_shade]\n : color;\n };\n}\n","export function getGradientColorStops(colors: string[]) {\n let stops = '';\n for (let i = 1; i < colors.length - 1; i += 1) {\n stops += `${colors[i]} ${(i / (colors.length - 1)) * 100}%, `;\n }\n return `${colors[0]} 0%, ${stops}${colors[colors.length - 1]} 100%`;\n}\n","import type { MantineThemeBase, MantineGradient } from '../../../types';\nimport { themeColor } from '../theme-color/theme-color';\nimport { primaryShade } from '../primary-shade/primary-shade';\nimport { getGradientColorStops } from './get-gradient-color-stops/get-gradient-color-stops';\n\nexport function linearGradient(deg: number, ...colors: string[]) {\n return `linear-gradient(${deg}deg, ${getGradientColorStops(colors)})`;\n}\n\nexport function radialGradient(...colors: string[]) {\n return `radial-gradient(circle, ${getGradientColorStops(colors)})`;\n}\n\nexport function gradient(theme: MantineThemeBase) {\n const getThemeColor = themeColor(theme);\n const getPrimaryShade = primaryShade(theme);\n\n return (payload?: MantineGradient) => {\n const merged = {\n from: payload?.from || theme.defaultGradient.from,\n to: payload?.to || theme.defaultGradient.to,\n deg: payload?.deg || theme.defaultGradient.deg,\n };\n\n return `linear-gradient(${merged.deg}deg, ${getThemeColor(\n merged.from,\n getPrimaryShade(),\n false\n )} 0%, ${getThemeColor(merged.to, getPrimaryShade(), false)} 100%)`;\n };\n}\n","interface GetSize {\n size: string | number;\n sizes: Record<string, any>;\n}\n\nexport function size(props: GetSize) {\n if (typeof props.size === 'number') {\n return props.size;\n }\n\n const computedSize = props.sizes[props.size];\n\n return computedSize !== undefined ? computedSize : props.size || props.sizes.md;\n}\n","/* eslint-disable no-bitwise */\n\ninterface RGBA {\n r: number;\n g: number;\n b: number;\n a: number;\n}\n\nfunction isHexColor(hex: string): boolean {\n const HEX_REGEXP = /^#?([0-9A-F]{3}){1,2}$/i;\n\n return HEX_REGEXP.test(hex);\n}\n\nfunction hexToRgba(color: string): RGBA {\n let hexString = color.replace('#', '');\n\n if (hexString.length === 3) {\n const shorthandHex = hexString.split('');\n hexString = [\n shorthandHex[0],\n shorthandHex[0],\n shorthandHex[1],\n shorthandHex[1],\n shorthandHex[2],\n shorthandHex[2],\n ].join('');\n }\n\n const parsed = parseInt(hexString, 16);\n const r = (parsed >> 16) & 255;\n const g = (parsed >> 8) & 255;\n const b = parsed & 255;\n\n return {\n r,\n g,\n b,\n a: 1,\n };\n}\n\nfunction rgbStringToRgba(color: string): RGBA {\n const [r, g, b, a] = color\n .replace(/[^0-9,.]/g, '')\n .split(',')\n .map(Number);\n\n return { r, g, b, a: a || 1 };\n}\n\nexport function toRgba(color: string): RGBA {\n if (isHexColor(color)) {\n return hexToRgba(color);\n }\n\n if (color.startsWith('rgb')) {\n return rgbStringToRgba(color);\n }\n\n return {\n r: 0,\n g: 0,\n b: 0,\n a: 1,\n };\n}\n","/* eslint-disable no-bitwise */\nimport { toRgba } from '../../../utils/to-rgba/to-rgba';\n\nexport function rgba(color: string, alpha: number) {\n if (typeof color !== 'string' || alpha > 1 || alpha < 0) {\n return 'rgba(0, 0, 0, 1)';\n }\n\n const { r, g, b } = toRgba(color);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n","import { fontStyles } from './font-styles/font-styles';\nimport { focusStyles } from './focus-styles/focus-styles';\nimport { themeColor } from './theme-color/theme-color';\nimport { linearGradient, radialGradient, gradient } from './gradient/gradient';\nimport { smallerThan, largerThan } from './breakpoints/breakpoints';\nimport { rgba } from './rgba/rgba';\nimport { size } from './size/size';\nimport { cover } from './cover/cover';\nimport { darken } from './darken/darken';\nimport { lighten } from './lighten/lighten';\nimport { radius } from './radius/radius';\nimport { variant } from './variant/variant';\nimport { primaryShade } from './primary-shade/primary-shade';\nimport { primaryColor } from './primary-color/primary-color';\nimport { hover } from './hover/hover';\nimport { placeholderStyles } from './placeholder-styles/placeholder-styles';\n\nexport const fns = {\n fontStyles,\n themeColor,\n focusStyles,\n linearGradient,\n radialGradient,\n smallerThan,\n largerThan,\n rgba,\n size,\n cover,\n darken,\n lighten,\n radius,\n variant,\n primaryShade,\n hover,\n gradient,\n primaryColor,\n placeholderStyles,\n};\n","import type { MantineThemeBase } from '../../../types';\nimport type { CSSObject } from '../../../../tss';\n\nexport function fontStyles(theme: MantineThemeBase) {\n return (): CSSObject => ({ fontFamily: theme.fontFamily || 'sans-serif' });\n}\n","import type { MantineThemeBase, MantineNumberSize } from '../../../types';\nimport { size } from '../size/size';\n\nexport function largerThan(theme: MantineThemeBase) {\n return (breakpoint: MantineNumberSize) =>\n `@media (min-width: ${size({ size: breakpoint, sizes: theme.breakpoints })}px)`;\n}\n\nexport function smallerThan(theme: MantineThemeBase) {\n return (breakpoint: MantineNumberSize) =>\n `@media (max-width: ${size({ size: breakpoint, sizes: theme.breakpoints }) - 1}px)`;\n}\n","import type { CSSObject } from '../../../../tss';\n\nexport function cover(offset: number | string = 0): CSSObject {\n return {\n position: 'absolute',\n top: offset,\n right: offset,\n left: offset,\n bottom: offset,\n };\n}\n","import { toRgba } from '../../../utils/to-rgba/to-rgba';\n\nexport function darken(color: string, alpha: number) {\n const { r, g, b, a } = toRgba(color);\n const f = 1 - alpha;\n\n const dark = (input: number) => Math.round(input * f);\n\n return `rgba(${dark(r)}, ${dark(g)}, ${dark(b)}, ${a})`;\n}\n","import { toRgba } from '../../../utils/to-rgba/to-rgba';\n\nexport function lighten(color: string, alpha: number) {\n const { r, g, b, a } = toRgba(color);\n\n const light = (input: number) => Math.round(input + (255 - input) * alpha);\n\n return `rgba(${light(r)}, ${light(g)}, ${light(b)}, ${a})`;\n}\n","import type { MantineThemeBase, MantineNumberSize } from '../../../types';\n\nexport function radius(theme: MantineThemeBase) {\n return (size?: MantineNumberSize | (string & {})): string | number => {\n if (typeof size === 'number') {\n return size;\n }\n\n const defaultRadius =\n typeof theme.defaultRadius === 'number'\n ? theme.defaultRadius\n : theme.radius[theme.defaultRadius] || theme.defaultRadius;\n\n return theme.radius[size] || size || defaultRadius;\n };\n}\n","import { CSSProperties } from 'react';\nimport type { MantineColor, MantineGradient, MantineThemeBase } from '../../../types';\nimport { rgba } from '../rgba/rgba';\nimport { themeColor } from '../theme-color/theme-color';\nimport { primaryShade } from '../primary-shade/primary-shade';\nimport { gradient } from '../gradient/gradient';\n\nexport interface VariantInput {\n variant:\n | 'filled'\n | 'light'\n | 'outline'\n | 'default'\n | 'gradient'\n | 'white'\n | 'subtle'\n | 'transparent';\n color?: MantineColor;\n gradient?: MantineGradient;\n primaryFallback?: boolean;\n}\n\nexport interface VariantOutput {\n border: CSSProperties['borderColor'];\n background: CSSProperties['backgroundColor'];\n color: CSSProperties['color'];\n hover: CSSProperties['backgroundColor'];\n}\n\ninterface ColorInfo {\n isSplittedColor: boolean;\n key?: string;\n shade?: number;\n}\n\nfunction getColorIndexInfo(color: string, theme: MantineThemeBase): ColorInfo {\n if (typeof color === 'string' && color.includes('.')) {\n const [splittedColor, _splittedShade] = color.split('.');\n const splittedShade = parseInt(_splittedShade, 10);\n\n if (splittedColor in theme.colors && splittedShade >= 0 && splittedShade < 10) {\n return { isSplittedColor: true, key: splittedColor, shade: splittedShade };\n }\n }\n\n return { isSplittedColor: false };\n}\n\nexport function variant(theme: MantineThemeBase) {\n const getThemeColor = themeColor(theme);\n const getPrimaryShade = primaryShade(theme);\n const getGradient = gradient(theme);\n\n // eslint-disable-next-line @typescript-eslint/no-shadow\n return ({ variant, color, gradient, primaryFallback }: VariantInput): VariantOutput => {\n const colorInfo = getColorIndexInfo(color, theme);\n\n switch (variant) {\n case 'light': {\n return {\n border: 'transparent',\n background: rgba(\n getThemeColor(color, theme.colorScheme === 'dark' ? 8 : 0, primaryFallback, false),\n theme.colorScheme === 'dark' ? 0.2 : 1\n ),\n color:\n color === 'dark'\n ? theme.colorScheme === 'dark'\n ? theme.colors.dark[0]\n : theme.colors.dark[9]\n : getThemeColor(color, theme.colorScheme === 'dark' ? 2 : getPrimaryShade('light')),\n hover: rgba(\n getThemeColor(color, theme.colorScheme === 'dark' ? 7 : 1, primaryFallback, false),\n theme.colorScheme === 'dark' ? 0.25 : 0.65\n ),\n };\n }\n\n case 'subtle': {\n return {\n border: 'transparent',\n background: 'transparent',\n color:\n color === 'dark'\n ? theme.colorScheme === 'dark'\n ? theme.colors.dark[0]\n : theme.colors.dark[9]\n : getThemeColor(color, theme.colorScheme === 'dark' ? 2 : getPrimaryShade('light')),\n hover: rgba(\n getThemeColor(color, theme.colorScheme === 'dark' ? 8 : 0, primaryFallback, false),\n theme.colorScheme === 'dark' ? 0.2 : 1\n ),\n };\n }\n\n case 'outline': {\n return {\n border: getThemeColor(color, theme.colorScheme === 'dark' ? 5 : getPrimaryShade('light')),\n background: 'transparent',\n color: getThemeColor(color, theme.colorScheme === 'dark' ? 5 : getPrimaryShade('light')),\n hover:\n theme.colorScheme === 'dark'\n ? rgba(getThemeColor(color, 5, primaryFallback, false), 0.05)\n : rgba(getThemeColor(color, 0, primaryFallback, false), 0.35),\n };\n }\n\n case 'default': {\n return {\n border: theme.colorScheme === 'dark' ? theme.colors.dark[4] : theme.colors.gray[4],\n background: theme.colorScheme === 'dark' ? theme.colors.dark[6] : theme.white,\n color: theme.colorScheme === 'dark' ? theme.white : theme.black,\n hover: theme.colorScheme === 'dark' ? theme.colors.dark[5] : theme.colors.gray[0],\n };\n }\n\n case 'white': {\n return {\n border: 'transparent',\n background: theme.white,\n color: getThemeColor(color, getPrimaryShade()),\n hover: null,\n };\n }\n\n case 'transparent': {\n return {\n border: 'transparent',\n color:\n color === 'dark'\n ? theme.colorScheme === 'dark'\n ? theme.colors.dark[0]\n : theme.colors.dark[9]\n : getThemeColor(color, theme.colorScheme === 'dark' ? 2 : getPrimaryShade('light')),\n background: 'transparent',\n hover: null,\n };\n }\n\n case 'gradient': {\n return {\n background: getGradient(gradient),\n color: theme.white,\n border: 'transparent',\n hover: null,\n };\n }\n\n default: {\n const _primaryShade = getPrimaryShade();\n const _shade = colorInfo.isSplittedColor ? colorInfo.shade : _primaryShade;\n const _color = colorInfo.isSplittedColor ? colorInfo.key : color;\n\n return {\n border: 'transparent',\n background: getThemeColor(_color, _shade, primaryFallback),\n color: theme.white,\n hover: getThemeColor(_color, _shade === 9 ? 8 : _shade + 1),\n };\n }\n }\n };\n}\n","import type { CSSObject } from '../../../../tss';\n\nexport function hover(hoverStyle: CSSObject) {\n return {\n '@media (hover: hover)': {\n '&:hover': hoverStyle,\n },\n '@media (hover: none)': {\n '&:active': hoverStyle,\n },\n };\n}\n","import { primaryShade } from '../primary-shade/primary-shade';\nimport type { MantineThemeBase } from '../../../types';\n\nexport function primaryColor(theme: MantineThemeBase) {\n return (colorScheme?: 'light' | 'dark') => {\n const shade = primaryShade(theme)(colorScheme);\n return theme.colors[theme.primaryColor][shade];\n };\n}\n","import type { MantineThemeBase } from '../../../types';\nimport type { CSSObject } from '../../../../tss';\n\nexport function placeholderStyles(theme: MantineThemeBase) {\n return (): CSSObject => ({\n userSelect: 'none',\n color: theme.colorScheme === 'dark' ? theme.colors.dark[3] : theme.colors.gray[5],\n });\n}\n","import type { MantineTheme, MantineThemeBase } from '../types';\nimport { fns } from './fns';\n\nexport function attachFunctions(themeBase: MantineThemeBase): MantineTheme {\n return {\n ...themeBase,\n fn: {\n fontStyles: fns.fontStyles(themeBase),\n themeColor: fns.themeColor(themeBase),\n focusStyles: fns.focusStyles(themeBase),\n largerThan: fns.largerThan(themeBase),\n smallerThan: fns.smallerThan(themeBase),\n radialGradient: fns.radialGradient,\n linearGradient: fns.linearGradient,\n gradient: fns.gradient(themeBase),\n rgba: fns.rgba,\n size: fns.size,\n cover: fns.cover,\n lighten: fns.lighten,\n darken: fns.darken,\n primaryShade: fns.primaryShade(themeBase),\n radius: fns.radius(themeBase),\n variant: fns.variant(themeBase),\n hover: fns.hover,\n primaryColor: fns.primaryColor(themeBase),\n placeholderStyles: fns.placeholderStyles(themeBase),\n },\n };\n}\n","import { MantineThemeBase } from './types';\nimport { DEFAULT_COLORS } from './default-colors';\nimport { attachFunctions } from './functions/attach-functions';\n\nexport const MANTINE_COLORS = Object.keys(DEFAULT_COLORS);\nexport const MANTINE_SIZES = ['xs', 'sm', 'md', 'lg', 'xl'] as const;\n\nexport const _DEFAULT_THEME: MantineThemeBase = {\n dir: 'ltr',\n primaryShade: {\n light: 6,\n dark: 8,\n },\n focusRing: 'auto',\n loader: 'oval',\n dateFormat: 'MMMM D, YYYY',\n colorScheme: 'light',\n white: '#fff',\n black: '#000',\n defaultRadius: 'sm',\n transitionTimingFunction: 'ease',\n colors: DEFAULT_COLORS,\n lineHeight: 1.55,\n fontFamily:\n '-apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji',\n fontFamilyMonospace:\n 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, Liberation Mono, Courier New, monospace',\n primaryColor: 'blue',\n respectReducedMotion: true,\n cursorType: 'default',\n defaultGradient: {\n from: 'indigo',\n to: 'cyan',\n deg: 45,\n },\n\n shadows: {\n xs: '0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 2px rgba(0, 0, 0, 0.1)',\n sm: '0 1px 3px rgba(0, 0, 0, 0.05), rgba(0, 0, 0, 0.05) 0px 10px 15px -5px, rgba(0, 0, 0, 0.04) 0px 7px 7px -5px',\n md: '0 1px 3px rgba(0, 0, 0, 0.05), rgba(0, 0, 0, 0.05) 0px 20px 25px -5px, rgba(0, 0, 0, 0.04) 0px 10px 10px -5px',\n lg: '0 1px 3px rgba(0, 0, 0, 0.05), rgba(0, 0, 0, 0.05) 0px 28px 23px -7px, rgba(0, 0, 0, 0.04) 0px 12px 12px -7px',\n xl: '0 1px 3px rgba(0, 0, 0, 0.05), rgba(0, 0, 0, 0.05) 0px 36px 28px -7px, rgba(0, 0, 0, 0.04) 0px 17px 17px -7px',\n },\n\n fontSizes: {\n xs: 12,\n sm: 14,\n md: 16,\n lg: 18,\n xl: 20,\n },\n\n radius: {\n xs: 2,\n sm: 4,\n md: 8,\n lg: 16,\n xl: 32,\n },\n\n spacing: {\n xs: 10,\n sm: 12,\n md: 16,\n lg: 20,\n xl: 24,\n },\n\n breakpoints: {\n xs: 576,\n sm: 768,\n md: 992,\n lg: 1200,\n xl: 1400,\n },\n\n headings: {\n fontFamily:\n '-apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji',\n fontWeight: 700,\n sizes: {\n h1: { fontSize: 34, lineHeight: 1.3, fontWeight: undefined },\n h2: { fontSize: 26, lineHeight: 1.35, fontWeight: undefined },\n h3: { fontSize: 22, lineHeight: 1.4, fontWeight: undefined },\n h4: { fontSize: 18, lineHeight: 1.45, fontWeight: undefined },\n h5: { fontSize: 16, lineHeight: 1.5, fontWeight: undefined },\n h6: { fontSize: 14, lineHeight: 1.5, fontWeight: undefined },\n },\n },\n\n other: {},\n components: {},\n activeStyles: { transform: 'translateY(1px)' },\n datesLocale: 'en',\n globalStyles: undefined,\n focusRingStyles: {\n styles: (theme) => ({\n outlineOffset: 2,\n outline: `2px solid ${\n theme.colors[theme.primaryColor][theme.colorScheme === 'dark' ? 7 : 5]\n }`,\n }),\n resetStyles: () => ({ outline: 'none' }),\n inputStyles: (theme) => ({\n outline: 'none',\n borderColor:\n theme.colors[theme.primaryColor][\n typeof theme.primaryShade === 'object'\n ? theme.primaryShade[theme.colorScheme]\n : theme.primaryShade\n ],\n }),\n },\n};\n\nexport const DEFAULT_THEME = attachFunctions(_DEFAULT_THEME);\n","import React from 'react';\nimport { Global } from '@emotion/react';\nimport type { MantineTheme } from './types';\n\nexport function GlobalStyles({ theme }: { theme: MantineTheme }) {\n return (\n <Global\n styles={{\n '*, *::before, *::after': {\n boxSizing: 'border-box',\n },\n\n html: {\n colorScheme: theme.colorScheme === 'dark' ? 'dark' : 'light',\n },\n\n body: {\n ...theme.fn.fontStyles(),\n backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[7] : theme.white,\n color: theme.colorScheme === 'dark' ? theme.colors.dark[0] : theme.black,\n lineHeight: theme.lineHeight,\n fontSize: theme.fontSizes.md,\n WebkitFontSmoothing: 'antialiased',\n MozOsxFontSmoothing: 'grayscale',\n },\n }}\n />\n );\n}\n","import React from 'react';\nimport { Global } from '@emotion/react';\nimport type { MantineTheme, MantineSize } from './types';\n\nfunction assignSizeVariables(\n variables: Record<string, string>,\n sizes: Record<MantineSize, number | string>,\n name: string\n) {\n Object.keys(sizes).forEach((size) => {\n // eslint-disable-next-line no-param-reassign\n variables[`--mantine-${name}-${size}`] =\n typeof sizes[size] === 'number' ? `${sizes[size]}px` : sizes[size];\n });\n}\n\nexport function MantineCssVariables({ theme }: { theme: MantineTheme }) {\n const variables: Record<string, string> = {\n '--mantine-color-white': theme.white,\n '--mantine-color-black': theme.black,\n '--mantine-transition-timing-function': theme.transitionTimingFunction,\n '--mantine-line-height': `${theme.lineHeight}`,\n '--mantine-font-family': theme.fontFamily,\n '--mantine-font-family-monospace': theme.fontFamilyMonospace,\n '--mantine-font-family-headings': theme.headings.fontFamily,\n '--mantine-heading-font-weight': `${theme.headings.fontWeight}`,\n };\n\n assignSizeVariables(variables, theme.shadows, 'shadow');\n assignSizeVariables(variables, theme.fontSizes, 'font-size');\n assignSizeVariables(variables, theme.radius, 'radius');\n assignSizeVariables(variables, theme.spacing, 'spacing');\n\n Object.keys(theme.colors).forEach((color) => {\n theme.colors[color].forEach((shade, index) => {\n variables[`--mantine-color-${color}-${index}`] = shade;\n });\n });\n\n const headings = theme.headings.sizes;\n\n Object.keys(headings).forEach((heading) => {\n variables[`--mantine-${heading}-font-size`] = `${headings[heading].fontSize}px`;\n variables[`--mantine-${heading}-line-height`] = `${headings[heading].lineHeight}`;\n });\n\n return (\n <Global\n styles={{\n ':root': variables,\n }}\n />\n );\n}\n","import { MantineThemeOverride, MantineThemeBase, MantineTheme } from '../../types';\nimport { attachFunctions } from '../../functions/attach-functions';\n\nexport function mergeTheme(\n currentTheme: MantineThemeBase,\n themeOverride?: MantineThemeOverride\n): MantineThemeBase {\n if (!themeOverride) {\n return currentTheme;\n }\n\n // @ts-ignore\n const result: MantineThemeBase = Object.keys(currentTheme).reduce((acc, key) => {\n if (key === 'headings' && themeOverride.headings) {\n const sizes = themeOverride.headings.sizes\n ? Object.keys(currentTheme.headings.sizes).reduce((headingsAcc, h) => {\n // eslint-disable-next-line no-param-reassign\n headingsAcc[h] = {\n ...currentTheme.headings.sizes[h],\n ...themeOverride.headings.sizes[h],\n };\n return headingsAcc;\n }, {} as MantineThemeBase['headings']['sizes'])\n : currentTheme.headings.sizes;\n return {\n ...acc,\n headings: {\n ...currentTheme.headings,\n ...themeOverride.headings,\n sizes,\n },\n };\n }\n\n acc[key] =\n typeof themeOverride[key] === 'object'\n ? { ...currentTheme[key], ...themeOverride[key] }\n : typeof themeOverride[key] === 'number' ||\n typeof themeOverride[key] === 'boolean' ||\n typeof themeOverride[key] === 'function'\n ? themeOverride[key]\n : themeOverride[key] || currentTheme[key];\n return acc;\n }, {} as MantineThemeBase);\n\n if (!(result.primaryColor in result.colors)) {\n throw new Error(\n 'MantineProvider: Invalid theme.primaryColor, it accepts only key of theme.colors, learn more – https://mantine.dev/theming/colors/#primary-color'\n );\n }\n\n return result;\n}\n\nexport function mergeThemeWithFunctions(\n currentTheme: MantineThemeBase,\n themeOverride?: MantineThemeOverride\n): MantineTheme {\n return attachFunctions(mergeTheme(currentTheme, themeOverride));\n}\n","type FilterPropsRes<T extends Record<string, any>> = {\n [Key in keyof T]-?: T[Key] extends undefined ? never : T[Key];\n};\n\nexport function filterProps<T extends Record<string, any>>(props: T) {\n return Object.keys(props).reduce<FilterPropsRes<T>>((acc, key: keyof T) => {\n if (props[key] !== undefined) {\n acc[key] = props[key];\n }\n return acc;\n }, {} as FilterPropsRes<T>);\n}\n","import React from 'react';\nimport { Global } from '@emotion/react';\n\nconst styles = {\n html: {\n fontFamily: 'sans-serif',\n lineHeight: '1.15',\n textSizeAdjust: '100%',\n },\n\n body: {\n margin: 0,\n },\n\n 'article, aside, footer, header, nav, section, figcaption, figure, main': {\n display: 'block',\n },\n\n h1: {\n fontSize: '2em',\n },\n\n hr: {\n boxSizing: 'content-box',\n height: 0,\n overflow: 'visible',\n },\n\n pre: {\n fontFamily: 'monospace, monospace',\n fontSize: '1em',\n },\n\n a: {\n background: 'transparent',\n textDecorationSkip: 'objects',\n },\n\n 'a:active, a:hover': {\n outlineWidth: 0,\n },\n\n 'abbr[title]': {\n borderBottom: 'none',\n textDecoration: 'underline',\n },\n\n 'b, strong': {\n fontWeight: 'bolder',\n },\n\n 'code, kbp, samp': {\n fontFamily: 'monospace, monospace',\n fontSize: '1em',\n },\n\n dfn: {\n fontStyle: 'italic',\n },\n\n mark: {\n backgroundColor: '#ff0',\n color: '#000',\n },\n\n small: {\n fontSize: '80%',\n },\n\n 'sub, sup': {\n fontSize: '75%',\n lineHeight: 0,\n position: 'relative',\n verticalAlign: 'baseline',\n },\n\n sup: {\n top: '-0.5em',\n },\n\n sub: {\n bottom: '-0.25em',\n },\n\n 'audio, video': {\n display: 'inline-block',\n },\n\n 'audio:not([controls])': {\n display: 'none',\n height: 0,\n },\n\n img: {\n borderStyle: 'none',\n verticalAlign: 'middle',\n },\n\n 'svg:not(:root)': {\n overflow: 'hidden',\n },\n\n 'button, input, optgroup, select, textarea': {\n fontFamily: 'sans-serif',\n fontSize: '100%',\n lineHeight: '1.15',\n margin: 0,\n },\n\n 'button, input': {\n overflow: 'visible',\n },\n\n 'button, select': {\n textTransform: 'none',\n },\n\n 'button, [type=reset], [type=submit]': {\n WebkitAppearance: 'button',\n },\n\n 'button::-moz-focus-inner, [type=button]::-moz-focus-inner, [type=reset]::-moz-focus-inner, [type=submit]::-moz-focus-inner':\n {\n borderStyle: 'none',\n padding: 0,\n },\n\n 'button:-moz-focusring, [type=button]:-moz-focusring, [type=reset]:-moz-focusring, [type=submit]:-moz-focusring':\n {\n outline: '1px dotted ButtonText',\n },\n\n legend: {\n boxSizing: 'border-box',\n color: 'inherit',\n display: 'table',\n maxWidth: '100%',\n padding: 0,\n whiteSpace: 'normal',\n },\n\n progress: {\n display: 'inline-block',\n verticalAlign: 'baseline',\n },\n\n textarea: {\n overflow: 'auto',\n },\n\n '[type=checkbox], [type=radio]': {\n boxSizing: 'border-box',\n padding: 0,\n },\n\n '[type=number]::-webkit-inner-spin-button, [type=number]::-webkit-outer-spin-button': {\n height: 'auto',\n },\n\n '[type=search]': {\n appearance: 'none',\n },\n\n '[type=search]::-webkit-search-cancel-button, [type=search]::-webkit-search-decoration': {\n appearance: 'none',\n },\n\n '::-webkit-file-upload-button': {\n appearance: 'button',\n font: 'inherit',\n },\n\n 'details, menu': {\n display: 'block',\n },\n\n summary: {\n display: 'list-item',\n },\n\n canvas: {\n display: 'inline-block',\n },\n\n template: {\n display: 'none',\n },\n\n '[hidden]': {\n display: 'none',\n },\n} as const;\n\nexport function NormalizeCSS() {\n return <Global styles={styles} />;\n}\n","import React, { createContext, useContext } from 'react';\nimport type { EmotionCache } from '@emotion/cache';\nimport { ThemeProvider, Global } from '@emotion/react';\nimport { DEFAULT_THEME } from './default-theme';\nimport { GlobalStyles } from './GlobalStyles';\nimport { MantineCssVariables } from './MantineCssVariables';\nimport type { MantineThemeOverride, MantineTheme } from './types';\nimport { mergeThemeWithFunctions } from './utils/merge-theme/merge-theme';\nimport { filterProps } from './utils/filter-props/filter-props';\nimport { NormalizeCSS } from './NormalizeCSS';\n\ninterface MantineProviderContextType {\n theme: MantineTheme;\n emotionCache?: EmotionCache;\n}\n\nconst MantineProviderContext = createContext<MantineProviderContextType>({\n theme: DEFAULT_THEME,\n});\n\nexport function useMantineTheme() {\n return useContext(MantineProviderContext)?.theme || DEFAULT_THEME;\n}\n\nexport function useMantineProviderStyles(component: string | string[]) {\n const theme = useMantineTheme();\n\n const getStyles = (name: string) => ({\n styles: theme.components[name]?.styles || {},\n classNames: theme.components[name]?.classNames || {},\n });\n\n if (Array.isArray(component)) {\n return component.map(getStyles);\n }\n\n return [getStyles(component)];\n}\n\nexport function useMantineEmotionCache() {\n return useContext(MantineProviderContext)?.emotionCache;\n}\n\nexport function useComponentDefaultProps<T extends Record<string, any>, U extends Partial<T> = {}>(\n component: string,\n defaultProps: U,\n props: T\n): T & {\n [Key in Extract<keyof T, keyof U>]-?: U[Key] | NonNullable<T[Key]>;\n} {\n const theme = useMantineTheme();\n const contextPropsPayload = theme.components[component]?.defaultProps;\n const contextProps =\n typeof contextPropsPayload === 'function' ? contextPropsPayload(theme) : contextPropsPayload;\n\n return { ...defaultProps, ...contextProps, ...filterProps(props) };\n}\n\nexport interface MantineProviderProps {\n theme?: MantineThemeOverride;\n emotionCache?: EmotionCache;\n withNormalizeCSS?: boolean;\n withGlobalStyles?: boolean;\n withCSSVariables?: boolean;\n children: React.ReactNode;\n inherit?: boolean;\n}\n\nexport function MantineProvider({\n theme,\n emotionCache,\n withNormalizeCSS = false,\n withGlobalStyles = false,\n withCSSVariables = false,\n inherit = false,\n children,\n}: MantineProviderProps) {\n const ctx = useContext(MantineProviderContext);\n const mergedTheme = mergeThemeWithFunctions(\n DEFAULT_THEME,\n inherit ? { ...ctx.theme, ...theme } : theme\n );\n\n return (\n <ThemeProvider theme={mergedTheme}>\n <MantineProviderContext.Provider value={{ theme: mergedTheme, emotionCache }}>\n {withNormalizeCSS && <NormalizeCSS />}\n {withGlobalStyles && <GlobalStyles theme={mergedTheme} />}\n {withCSSVariables && <MantineCssVariables theme={mergedTheme} />}\n {typeof mergedTheme.globalStyles === 'function' && (\n <Global styles={mergedTheme.globalStyles(mergedTheme) as any} />\n )}\n {children}\n </MantineProviderContext.Provider>\n </ThemeProvider>\n );\n}\n\nMantineProvider.displayName = '@mantine/core/MantineProvider';\n","function toVal(mix) {\n\tvar k, y, str='';\n\n\tif (typeof mix === 'string' || typeof mix === 'number') {\n\t\tstr += mix;\n\t} else if (typeof mix === 'object') {\n\t\tif (Array.isArray(mix)) {\n\t\t\tfor (k=0; k < mix.length; k++) {\n\t\t\t\tif (mix[k]) {\n\t\t\t\t\tif (y = toVal(mix[k])) {\n\t\t\t\t\t\tstr && (str += ' ');\n\t\t\t\t\t\tstr += y;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor (k in mix) {\n\t\t\t\tif (mix[k]) {\n\t\t\t\t\tstr && (str += ' ');\n\t\t\t\t\tstr += k;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn str;\n}\n\nexport default function () {\n\tvar i=0, tmp, x, str='';\n\twhile (i < arguments.length) {\n\t\tif (tmp = arguments[i++]) {\n\t\t\tif (x = toVal(tmp)) {\n\t\t\t\tstr && (str += ' ');\n\t\t\t\tstr += x\n\t\t\t}\n\t\t}\n\t}\n\treturn str;\n}\n","import createCache from '@emotion/cache';\n\nexport const defaultMantineEmotionCache = createCache({ key: 'mantine', prepend: true });\n","import clsx from 'clsx';\nimport { serializeStyles, RegisteredCache } from '@emotion/serialize';\nimport { insertStyles, getRegisteredStyles } from '@emotion/utils';\nimport type { EmotionCache } from '@emotion/cache';\nimport { useGuaranteedMemo } from './utils/use-guaranteed-memo/use-guaranteed-memo';\nimport type { CSS } from './types';\nimport { useEmotionCache } from './use-emotion-cache';\n\nconst refPropertyName = 'ref' as const;\n\nfunction getRef(args: any[]) {\n let ref: string;\n\n if (args.length !== 1) {\n return { args, ref };\n }\n\n const [arg] = args;\n\n if (!(arg instanceof Object)) {\n return { args, ref };\n }\n\n if (!(refPropertyName in arg)) {\n return { args, ref };\n }\n\n ref = arg[refPropertyName];\n const argCopy = { ...arg };\n delete argCopy[refPropertyName];\n return { args: [argCopy], ref };\n}\n\nexport const { cssFactory } = (() => {\n function merge(registered: RegisteredCache, css: CSS, className: string) {\n const registeredStyles: string[] = [];\n\n const rawClassName = getRegisteredStyles(registered, registeredStyles, className);\n\n if (registeredStyles.length < 2) {\n return className;\n }\n\n return rawClassName + css(registeredStyles);\n }\n\n function _cssFactory(params: { cache: EmotionCache }) {\n const { cache } = params;\n\n const css: CSS = (...styles: any) => {\n const { ref, args } = getRef(styles);\n const serialized = serializeStyles(args, cache.registered);\n insertStyles(cache as any, serialized, false);\n return `${cache.key}-${serialized.name}${ref === undefined ? '' : ` ${ref}`}`;\n };\n\n const cx = (...args: any) => merge(cache.registered, css, clsx(args));\n\n return { css, cx };\n }\n\n return { cssFactory: _cssFactory };\n})();\n\nexport function useCss() {\n const cache = useEmotionCache();\n return useGuaranteedMemo(() => cssFactory({ cache }), [cache]);\n}\n","import { defaultMantineEmotionCache } from './default-emotion-cache';\nimport { useMantineEmotionCache } from '../theme/MantineProvider';\n\nexport function useEmotionCache() {\n const cache = useMantineEmotionCache();\n return cache || defaultMantineEmotionCache;\n}\n","import { useRef } from 'react';\n\nexport function useGuaranteedMemo<T>(fn: () => T, deps: React.DependencyList): T {\n const ref = useRef<{ v: T; prevDeps: unknown[] }>();\n\n if (\n !ref.current ||\n deps.length !== ref.current.prevDeps.length ||\n ref.current.prevDeps.map((v, i) => v === deps[i]).indexOf(false) >= 0\n ) {\n ref.current = {\n v: fn(),\n prevDeps: [...deps],\n };\n }\n\n return ref.current.v;\n}\n","import type { EmotionCache } from '@emotion/cache';\nimport { useMantineProviderStyles } from '../../../theme/MantineProvider';\n\ninterface Input<T extends Record<string, string>> {\n cx(...classNames: any): string;\n classes: T;\n context: ReturnType<typeof useMantineProviderStyles>;\n classNames: Partial<T>;\n name: string | string[];\n cache: EmotionCache;\n}\n\nexport function mergeClassNames<T extends Record<string, string>>({\n cx,\n classes,\n context,\n classNames,\n name,\n cache,\n}: Input<T>) {\n const contextClassNames = context.reduce<Record<string, string>>((acc, item) => {\n Object.keys(item.classNames).forEach((key) => {\n if (typeof acc[key] !== 'string') {\n acc[key] = `${item.classNames[key]}`;\n } else {\n acc[key] = `${acc[key]} ${item.classNames[key]}`;\n }\n });\n\n return acc;\n }, {});\n\n return Object.keys(classes).reduce((acc, className) => {\n acc[className] = cx(\n classes[className],\n contextClassNames[className],\n classNames != null && classNames[className],\n Array.isArray(name)\n ? name\n .filter(Boolean)\n .map((part) => `${cache?.key || 'mantine'}-${part}-${className}`)\n .join(' ')\n : name\n ? `${cache?.key || 'mantine'}-${name}-${className}`\n : null\n );\n return acc;\n }, {}) as T;\n}\n","import type { MantineTheme } from '../theme';\nimport type { CSSObject } from './types';\nimport { useCss } from './use-css';\nimport {\n useMantineTheme,\n useMantineProviderStyles,\n useMantineEmotionCache,\n} from '../theme/MantineProvider';\nimport { mergeClassNames } from './utils/merge-class-names/merge-class-names';\n\ntype ContextStyles = ReturnType<typeof useMantineProviderStyles>;\n\nexport interface UseStylesOptions<Key extends string> {\n classNames?: Partial<Record<Key, string>>;\n styles?:\n | Partial<Record<Key, CSSObject>>\n | ((theme: MantineTheme, params: any) => Partial<Record<Key, CSSObject>>);\n name: string | string[];\n unstyled?: boolean;\n}\n\nfunction createRef(refName: string) {\n return `__mantine-ref-${refName || ''}`;\n}\n\nfunction getStyles<Key extends string>(\n styles: UseStylesOptions<Key>['styles'] | ContextStyles,\n theme: MantineTheme,\n params: Record<string, any>\n): CSSObject {\n const extractStyles = (stylesPartial: UseStylesOptions<Key>['styles']) =>\n typeof stylesPartial === 'function' ? stylesPartial(theme, params || {}) : stylesPartial || {};\n\n if (Array.isArray(styles)) {\n return styles\n .map((item) => extractStyles(item.styles))\n .reduce<Record<string, CSSObject>>((acc, item) => {\n Object.keys(item).forEach((key) => {\n if (!acc[key]) {\n acc[key] = { ...item[key] };\n } else {\n acc[key] = { ...acc[key], ...item[key] };\n }\n });\n return acc;\n }, {});\n }\n\n return extractStyles(styles);\n}\n\nexport function createStyles<\n Key extends string = string,\n Params = void,\n Input extends Record<Key, CSSObject> = Record<Key, CSSObject>\n>(\n input:\n | ((theme: MantineTheme, params: Params, createRef: (refName: string) => string) => Input)\n | Input\n) {\n const getCssObject = typeof input === 'function' ? input : () => input;\n\n function useStyles(params: Params, options?: UseStylesOptions<Key>) {\n const theme = useMantineTheme();\n const context = useMantineProviderStyles(options?.name);\n const cache = useMantineEmotionCache();\n\n const { css, cx } = useCss();\n const cssObject = getCssObject(theme, params, createRef);\n\n const componentStyles = getStyles(options?.styles, theme, params);\n const providerStyles = getStyles(context, theme, params);\n\n const classes = Object.fromEntries(\n Object.keys(cssObject).map((key) => {\n const mergedStyles = cx(\n { [css(cssObject[key])]: !options?.unstyled },\n css(providerStyles[key]),\n css(componentStyles[key])\n );\n return [key, mergedStyles];\n })\n ) as {\n [key in keyof Input]: string;\n };\n\n return {\n classes: mergeClassNames<{ [key in keyof Input]: string }>({\n cx,\n classes,\n context,\n classNames: options?.classNames as {\n [key in keyof Input]: string;\n },\n name: options?.name,\n cache,\n }),\n cx,\n theme,\n };\n }\n\n return useStyles;\n}\n","import { createStyles, MantineNumberSize, MantineSize } from '@mantine/styles';\n\nexport interface ContainerStylesParams {\n fluid: boolean;\n size: MantineNumberSize;\n sizes: Record<MantineSize, number>;\n}\n\nexport default createStyles((theme, { fluid, size, sizes }: ContainerStylesParams) => ({\n root: {\n paddingLeft: theme.spacing.md,\n paddingRight: theme.spacing.md,\n maxWidth: fluid ? '100%' : theme.fn.size({ size, sizes }),\n marginLeft: 'auto',\n marginRight: 'auto',\n },\n}));\n","import { MantineStyleSystemProps, filterProps } from '@mantine/styles';\n\nexport function extractSystemStyles<T extends Record<string, any>>(\n others: MantineStyleSystemProps & T\n): { systemStyles: MantineStyleSystemProps; rest: T } {\n const {\n m,\n mx,\n my,\n mt,\n mb,\n ml,\n mr,\n p,\n px,\n py,\n pt,\n pb,\n pl,\n pr,\n bg,\n c,\n opacity,\n ff,\n fz,\n fw,\n lts,\n ta,\n lh,\n fs,\n tt,\n td,\n w,\n miw,\n maw,\n h,\n mih,\n mah,\n bgsz,\n bgp,\n bgr,\n bga,\n pos,\n top,\n left,\n bottom,\n right,\n inset,\n display,\n ...rest\n } = others;\n const systemStyles = filterProps({\n m,\n mx,\n my,\n mt,\n mb,\n ml,\n mr,\n p,\n px,\n py,\n pt,\n pb,\n pl,\n pr,\n bg,\n c,\n opacity,\n ff,\n fz,\n fw,\n lts,\n ta,\n lh,\n fs,\n tt,\n td,\n w,\n miw,\n maw,\n h,\n mih,\n mah,\n bgsz,\n bgp,\n bgr,\n bga,\n pos,\n top,\n left,\n bottom,\n right,\n inset,\n display,\n });\n\n return { systemStyles, rest: rest as unknown as T };\n}\n","import { MantineTheme, CSSObject } from '@mantine/styles';\n\nfunction getSortedKeys(value: Record<string, any>, theme: MantineTheme) {\n const sorted = Object.keys(value)\n .filter((breakpoint) => breakpoint !== 'base')\n .sort(\n (a, b) =>\n theme.fn.size({ size: a, sizes: theme.breakpoints }) -\n theme.fn.size({ size: b, sizes: theme.breakpoints })\n );\n return 'base' in value ? ['base', ...sorted] : sorted;\n}\n\nexport type StyleProperty = string | string[];\n\ninterface GetResponsiveStyles {\n value: any;\n theme: MantineTheme;\n getValue: (value: any, theme: MantineTheme) => any;\n property: StyleProperty;\n}\n\nexport function getResponsiveValue({ value, theme, getValue, property }: GetResponsiveStyles) {\n if (value == null) {\n return undefined;\n }\n\n if (typeof value === 'object') {\n const result = getSortedKeys(value, theme).reduce<CSSObject>((acc, breakpointKey) => {\n if (breakpointKey === 'base' && value.base !== undefined) {\n const baseValue = getValue(value.base, theme);\n\n if (Array.isArray(property)) {\n property.forEach((prop) => {\n acc[prop] = baseValue;\n });\n return acc;\n }\n\n acc[property] = baseValue;\n return acc;\n }\n\n const breakpointValue = getValue(value[breakpointKey], theme);\n\n if (Array.isArray(property)) {\n acc[theme.fn.largerThan(breakpointKey as any)] = {};\n property.forEach((prop) => {\n acc[theme.fn.largerThan(breakpointKey as any)][prop] = breakpointValue;\n });\n\n return acc;\n }\n\n acc[theme.fn.largerThan(breakpointKey as any)] = {\n [property]: breakpointValue,\n };\n\n return acc;\n }, {});\n\n return result;\n }\n\n const cssValue = getValue(value, theme);\n\n if (Array.isArray(property)) {\n return property.reduce((acc, prop) => {\n acc[prop] = cssValue;\n return acc;\n }, {});\n }\n\n return { [property]: cssValue };\n}\n","import type { MantineTheme } from '@mantine/styles';\n\nconst NEGATIVE_VALUES = ['-xs', '-sm', '-md', '-lg', '-xl'];\n\nexport function getSpacingValue(size: any, theme: MantineTheme) {\n if (NEGATIVE_VALUES.includes(size)) {\n return theme.fn.size({ size: size.replace('-', ''), sizes: theme.spacing }) * -1;\n }\n\n return theme.fn.size({ size, sizes: theme.spacing });\n}\n","import { getColorValue } from './get-color-value';\nimport { getDefaultValue } from './get-default-value';\nimport { getFontSizeValue } from './get-font-size-value';\nimport { getSpacingValue } from './get-spacing-value';\n\nexport const valueGetters = {\n color: getColorValue,\n default: getDefaultValue,\n fontSize: getFontSizeValue,\n spacing: getSpacingValue,\n};\n\nexport type SystemValueType = keyof typeof valueGetters;\n","import { MantineTheme } from '@mantine/styles';\n\nexport function getColorValue(color: any, theme: MantineTheme): string {\n if (color === 'dimmed') {\n return theme.colorScheme === 'dark' ? theme.colors.dark[2] : theme.colors.gray[6];\n }\n\n return theme.fn.variant({ variant: 'filled', color, primaryFallback: false }).background;\n}\n","export function getDefaultValue<T>(value: T) {\n return value;\n}\n","import type { MantineTheme } from '@mantine/styles';\n\nexport function getFontSizeValue(size: any, theme: MantineTheme) {\n return theme.fn.size({ size, sizes: theme.fontSizes });\n}\n","import type { StyleProperty } from '../get-responsive-value/get-responsive-value';\nimport type { SystemValueType } from '../value-getters/value-getters';\n\nexport interface SystemPropData {\n type: SystemValueType;\n property: StyleProperty;\n}\n\nexport const SYSTEM_PROPS: Record<string, SystemPropData> = {\n m: { type: 'spacing', property: 'margin' },\n mt: { type: 'spacing', property: 'marginTop' },\n mb: { type: 'spacing', property: 'marginBottom' },\n ml: { type: 'spacing', property: 'marginLeft' },\n mr: { type: 'spacing', property: 'marginRight' },\n mx: { type: 'spacing', property: ['marginRight', 'marginLeft'] },\n my: { type: 'spacing', property: ['marginTop', 'marginBottom'] },\n\n p: { type: 'spacing', property: 'padding' },\n pt: { type: 'spacing', property: 'paddingTop' },\n pb: { type: 'spacing', property: 'paddingBottom' },\n pl: { type: 'spacing', property: 'paddingLeft' },\n pr: { type: 'spacing', property: 'paddingRight' },\n px: { type: 'spacing', property: ['paddingRight', 'paddingLeft'] },\n py: { type: 'spacing', property: ['paddingTop', 'paddingBottom'] },\n\n bg: { type: 'color', property: 'background' },\n c: { type: 'color', property: 'color' },\n opacity: { type: 'default', property: 'opacity' },\n\n ff: { type: 'default', property: 'fontFamily' },\n fz: { type: 'fontSize', property: 'fontSize' },\n fw: { type: 'default', property: 'fontWeight' },\n lts: { type: 'default', property: 'letterSpacing' },\n ta: { type: 'default', property: 'textAlign' },\n lh: { type: 'default', property: 'lineHeight' },\n fs: { type: 'default', property: 'fontStyle' },\n tt: { type: 'default', property: 'textTransform' },\n td: { type: 'default', property: 'textDecoration' },\n\n w: { type: 'spacing', property: 'width' },\n miw: { type: 'spacing', property: 'minWidth' },\n maw: { type: 'spacing', property: 'maxWidth' },\n h: { type: 'spacing', property: 'height' },\n mih: { type: 'spacing', property: 'minHeight' },\n mah: { type: 'spacing', property: 'maxHeight' },\n\n bgsz: { type: 'default', property: 'background-size' },\n bgp: { type: 'default', property: 'background-position' },\n bgr: { type: 'default', property: 'background-repeat' },\n bga: { type: 'default', property: 'background-attachment' },\n\n pos: { type: 'default', property: 'position' },\n top: { type: 'default', property: 'top' },\n left: { type: 'default', property: 'left' },\n bottom: { type: 'default', property: 'bottom' },\n right: { type: 'default', property: 'right' },\n inset: { type: 'default', property: 'inset' },\n\n display: { type: 'default', property: 'display' },\n};\n","import { MantineTheme } from '@mantine/styles';\nimport { getResponsiveValue } from '../get-responsive-value/get-responsive-value';\nimport { valueGetters } from '../value-getters/value-getters';\nimport { SYSTEM_PROPS } from '../system-props/system-props';\n\nexport function getSystemStyles(\n systemStyles: Record<string, any>,\n theme: MantineTheme,\n systemProps = SYSTEM_PROPS\n) {\n const styles = Object.keys(systemProps).reduce((acc, systemProp) => {\n if (systemProp in systemStyles && systemStyles[systemProp] !== undefined) {\n acc.push(\n getResponsiveValue({\n value: systemStyles[systemProp],\n getValue: valueGetters[systemProps[systemProp].type],\n property: systemProps[systemProp].property,\n theme,\n })\n );\n }\n\n return acc;\n }, []);\n\n return styles.reduce((acc, stylesPartial) => {\n Object.keys(stylesPartial).forEach((property) => {\n if (typeof stylesPartial[property] === 'object' && stylesPartial[property] !== null) {\n if (!(property in acc)) {\n acc[property] = stylesPartial[property];\n } else {\n acc[property] = { ...acc[property], ...stylesPartial[property] };\n }\n } else {\n acc[property] = stylesPartial[property];\n }\n });\n\n return acc;\n }, {});\n}\n","import {\n MantineStyleSystemProps,\n MantineTheme,\n Sx,\n useCss,\n useMantineTheme,\n} from '@mantine/styles';\nimport { getSystemStyles } from '../style-system-props/get-system-styles/get-system-styles';\n\nfunction extractSx(sx: Sx, theme: MantineTheme) {\n return typeof sx === 'function' ? sx(theme) : sx;\n}\n\nexport function useSx(sx: Sx | Sx[], systemProps: MantineStyleSystemProps, className: string) {\n const theme = useMantineTheme();\n const { css, cx } = useCss();\n\n if (Array.isArray(sx)) {\n return cx(\n className,\n css(getSystemStyles(systemProps, theme)),\n sx.map((partial) => css(extractSx(partial, theme)))\n );\n }\n\n return cx(className, css(extractSx(sx, theme)), css(getSystemStyles(systemProps, theme)));\n}\n","import React, { forwardRef } from 'react';\nimport { DefaultProps } from '@mantine/styles';\nimport { createPolymorphicComponent } from '@mantine/utils';\nimport { extractSystemStyles } from './style-system-props/extract-system-styles/extract-system-styles';\nimport { useSx } from './use-sx/use-sx';\n\nexport interface BoxProps extends DefaultProps {\n children?: React.ReactNode;\n}\n\nexport const _Box = forwardRef<HTMLDivElement, BoxProps & { component: any }>(\n ({ className, component, style, sx, ...others }, ref) => {\n const { systemStyles, rest } = extractSystemStyles(others);\n const Element = component || 'div';\n return (\n <Element ref={ref} className={useSx(sx, systemStyles, className)} style={style} {...rest} />\n );\n }\n);\n\n_Box.displayName = '@mantine/core/Box';\n\nexport const Box = createPolymorphicComponent<'div', BoxProps>(_Box);\n","import React, { forwardRef } from 'react';\nimport {\n DefaultProps,\n MantineNumberSize,\n useComponentDefaultProps,\n MantineSize,\n} from '@mantine/styles';\nimport { Box } from '../Box';\nimport useStyles from './Container.styles';\n\nexport interface ContainerProps extends DefaultProps, React.ComponentPropsWithoutRef<'div'> {\n /** Predefined container max-width or number for max-width in px */\n size?: MantineNumberSize;\n\n /** If fluid is set to true, size prop is ignored and Container can expand to 100% of width */\n fluid?: boolean;\n\n /** Container sizes */\n sizes?: Record<MantineSize, number>;\n}\n\nconst defaultProps: Partial<ContainerProps> = {\n sizes: {\n xs: 540,\n sm: 720,\n md: 960,\n lg: 1140,\n xl: 1320,\n },\n};\n\nexport const Container = forwardRef<HTMLDivElement, ContainerProps>(\n (props: ContainerProps, ref) => {\n const { className, fluid, size, unstyled, sizes, ...others } = useComponentDefaultProps(\n 'Container',\n defaultProps,\n props\n );\n\n const { classes, cx } = useStyles({ fluid, size, sizes }, { unstyled, name: 'Container' });\n return <Box className={cx(classes.root, className)} ref={ref} {...others} />;\n }\n);\n\nContainer.displayName = '@mantine/core/Container';\n","import { createStyles, MantineNumberSize, MantineShadow } from '@mantine/styles';\n\nexport interface PaperStylesParams {\n radius: MantineNumberSize;\n shadow: MantineShadow;\n withBorder: boolean;\n}\n\nexport default createStyles((theme, { radius, shadow, withBorder }: PaperStylesParams) => ({\n root: {\n outline: 0,\n WebkitTapHighlightColor: 'transparent',\n display: 'block',\n textDecoration: 'none',\n color: theme.colorScheme === 'dark' ? theme.colors.dark[0] : theme.black,\n backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[7] : theme.white,\n boxSizing: 'border-box',\n borderRadius: theme.fn.radius(radius),\n boxShadow: theme.shadows[shadow] || shadow || 'none',\n border: withBorder\n ? `1px solid ${theme.colorScheme === 'dark' ? theme.colors.dark[4] : theme.colors.gray[3]}`\n : undefined,\n },\n}));\n","import React, { forwardRef } from 'react';\nimport {\n DefaultProps,\n MantineNumberSize,\n MantineShadow,\n useComponentDefaultProps,\n} from '@mantine/styles';\nimport { createPolymorphicComponent } from '@mantine/utils';\nimport { Box } from '../Box';\nimport useStyles, { PaperStylesParams } from './Paper.styles';\n\nexport interface PaperProps extends DefaultProps<never, PaperStylesParams> {\n /** Predefined box-shadow from theme.shadows (xs, sm, md, lg, xl) or any valid css box-shadow property */\n shadow?: MantineShadow;\n\n /** Predefined border-radius value from theme.radius or number for border-radius in px */\n radius?: MantineNumberSize;\n\n /** Adds 1px border with theme.colors.gray[3] color in light color scheme and theme.colors.dark[4] in dark color scheme */\n withBorder?: boolean;\n\n /** Paper children */\n children?: React.ReactNode;\n}\n\nconst defaultProps: Partial<PaperProps> = {};\n\nexport const _Paper = forwardRef<HTMLDivElement, PaperProps>((props, ref) => {\n const { className, children, radius, withBorder, shadow, unstyled, ...others } =\n useComponentDefaultProps('Paper', defaultProps, props);\n const { classes, cx } = useStyles({ radius, shadow, withBorder }, { name: 'Paper', unstyled });\n\n return (\n <Box className={cx(classes.root, className)} ref={ref} {...others}>\n {children}\n </Box>\n );\n});\n\n_Paper.displayName = '@mantine/core/Paper';\n\nexport const Paper = createPolymorphicComponent<'div', PaperProps>(_Paper);\n","import { useEffect, useLayoutEffect } from 'react';\n\n// useLayoutEffect will show warning if used during ssr, e.g. with Next.js\n// useIsomorphicEffect removes it by replacing useLayoutEffect with useEffect during ssr\nexport const useIsomorphicEffect = typeof document !== 'undefined' ? useLayoutEffect : useEffect;\n","import React, { useState } from 'react';\nimport { useIsomorphicEffect } from '../use-isomorphic-effect/use-isomorphic-effect';\n\nconst randomId = () => `mantine-${Math.random().toString(36).slice(2, 11)}`;\n\nconst useReactId: () => string | undefined =\n (React as any)['useId'.toString()] || (() => undefined);\n\nfunction useClientId() {\n const [uuid, setUuid] = useState('');\n\n useIsomorphicEffect(() => {\n setUuid(randomId());\n }, []);\n\n return uuid;\n}\n\nfunction getReactId() {\n const id = useReactId();\n return id ? `mantine-${id.replace(/:/g, '')}` : '';\n}\n\nexport function useId(staticId?: string) {\n return typeof staticId === 'string' ? staticId : getReactId() || useClientId();\n}\n","const TABBABLE_NODES = /input|select|textarea|button|object/;\nexport const FOCUS_SELECTOR = 'a, input, select, textarea, button, object, [tabindex]';\n\nfunction hidden(element: HTMLElement) {\n if (process.env.NODE_ENV === 'test') {\n return false;\n }\n\n return element.style.display === 'none';\n}\n\nfunction visible(element: HTMLElement) {\n const isHidden =\n element.getAttribute('aria-hidden') ||\n element.getAttribute('hidden') ||\n element.getAttribute('type') === 'hidden';\n\n if (isHidden) {\n return false;\n }\n\n let parentElement: HTMLElement = element;\n while (parentElement) {\n if (parentElement === document.body || parentElement.nodeType === 11) {\n break;\n }\n\n if (hidden(parentElement)) {\n return false;\n }\n\n parentElement = parentElement.parentNode as HTMLElement;\n }\n\n return true;\n}\n\nfunction getElementTabIndex(element: HTMLElement) {\n let tabIndex = element.getAttribute('tabindex');\n if (tabIndex === null) {\n tabIndex = undefined;\n }\n return parseInt(tabIndex, 10);\n}\n\nexport function focusable(element: HTMLElement) {\n const nodeName = element.nodeName.toLowerCase();\n const isTabIndexNotNaN = !Number.isNaN(getElementTabIndex(element));\n const res =\n // @ts-ignore\n (TABBABLE_NODES.test(nodeName) && !element.disabled) ||\n (element instanceof HTMLAnchorElement ? element.href || isTabIndexNotNaN : isTabIndexNotNaN);\n\n return res && visible(element);\n}\n\nexport function tabbable(element: HTMLElement) {\n const tabIndex = getElementTabIndex(element);\n const isTabIndexNaN = Number.isNaN(tabIndex);\n return (isTabIndexNaN || tabIndex >= 0) && focusable(element);\n}\n\nexport function findTabbableDescendants(element: HTMLElement): HTMLElement[] {\n return Array.from(element.querySelectorAll<HTMLElement>(FOCUS_SELECTOR)).filter(tabbable);\n}\n","import { findTabbableDescendants } from './tabbable';\n\nexport function scopeTab(node: HTMLElement, event: KeyboardEvent) {\n const tabbable = findTabbableDescendants(node);\n if (!tabbable.length) {\n event.preventDefault();\n return;\n }\n const finalTabbable = tabbable[event.shiftKey ? 0 : tabbable.length - 1];\n const root = node.getRootNode() as unknown as DocumentOrShadowRoot;\n const leavingFinalTabbable = finalTabbable === root.activeElement || node === root.activeElement;\n\n if (!leavingFinalTabbable) {\n return;\n }\n\n event.preventDefault();\n\n const target = tabbable[event.shiftKey ? tabbable.length - 1 : 0];\n\n if (target) {\n target.focus();\n }\n}\n","import { useCallback, useEffect, useRef } from 'react';\nimport { FOCUS_SELECTOR, focusable, tabbable } from './tabbable';\nimport { scopeTab } from './scope-tab';\nimport { createAriaHider } from './create-aria-hider';\n\nexport function useFocusTrap(active = true): (instance: HTMLElement | null) => void {\n const ref = useRef<HTMLElement | null>();\n const restoreAria = useRef<Function | null>(null);\n\n const setRef = useCallback(\n (node: HTMLElement | null) => {\n if (!active) {\n return;\n }\n\n if (node === null) {\n if (restoreAria.current) {\n restoreAria.current();\n restoreAria.current = null;\n }\n return;\n }\n\n restoreAria.current = createAriaHider(node);\n if (ref.current === node) {\n return;\n }\n\n if (node) {\n const processNode = () => {\n let focusElement: HTMLElement = node.querySelector('[data-autofocus]');\n\n if (!focusElement) {\n const children = Array.from<HTMLElement>(node.querySelectorAll(FOCUS_SELECTOR));\n focusElement = children.find(tabbable) || children.find(focusable) || null;\n if (!focusElement && focusable(node)) focusElement = node;\n }\n\n if (focusElement) {\n focusElement.focus({ preventScroll: true });\n } else if (process.env.NODE_ENV === 'development') {\n // eslint-disable-next-line no-console\n console.warn(\n '[@mantine/hooks/use-focus-trap] Failed to find focusable element within provided node',\n node\n );\n }\n };\n\n // Delay processing the HTML node by a frame. This ensures focus is assigned correctly.\n setTimeout(() => {\n if (node.getRootNode()) {\n processNode();\n } else if (process.env.NODE_ENV === 'development') {\n // eslint-disable-next-line no-console\n console.warn('[@mantine/hooks/use-focus-trap] Ref node is not part of the dom', node);\n }\n });\n\n ref.current = node;\n } else {\n ref.current = null;\n }\n },\n [active]\n );\n\n useEffect(() => {\n if (!active) {\n return undefined;\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Tab' && ref.current) {\n scopeTab(ref.current, event);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n\n if (restoreAria.current) {\n restoreAria.current();\n }\n };\n }, [active]);\n\n return setRef;\n}\n","type Value = {\n node: HTMLElement;\n ariaHidden: string;\n};\n\nexport function createAriaHider(\n containerNode: HTMLElement,\n selector: string = 'body > :not(script)'\n) {\n const rootNodes: Value[] = Array.from<HTMLElement>(document.querySelectorAll(selector)).map(\n (node) => {\n if (node?.shadowRoot?.contains(containerNode) || node.contains(containerNode)) {\n return undefined;\n }\n\n const ariaHidden = node.getAttribute('aria-hidden');\n\n if (ariaHidden === null || ariaHidden === 'false') {\n node.setAttribute('aria-hidden', 'true');\n }\n\n return { node, ariaHidden };\n }\n );\n\n return () => {\n rootNodes.forEach((item) => {\n if (!item) {\n return;\n }\n\n if (item.ariaHidden === null) {\n item.node.removeAttribute('aria-hidden');\n } else {\n item.node.setAttribute('aria-hidden', item.ariaHidden);\n }\n });\n };\n}\n","import { getScrollWidth } from './get-scroll-width';\n\nexport const getLockStyles = ({ disableBodyPadding }) => {\n const scrollWidth = disableBodyPadding ? null : getScrollWidth();\n\n const styles = `body {\n --removed-scroll-width: ${scrollWidth}px;\n touch-action: none;\n overflow: hidden !important;\n position: relative !important;\n ${scrollWidth ? 'padding-right: var(--removed-scroll-width) !important;' : ''}\n `;\n\n return styles;\n};\n","export function getScrollWidth() {\n if (typeof window === 'undefined' || typeof document === 'undefined') return 0;\n\n const paddingRight = parseInt(window.getComputedStyle(document.body).paddingRight, 10);\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\n\n return paddingRight + scrollbarWidth;\n}\n","import { useEffect, useRef, useState } from 'react';\n\nimport { getLockStyles } from './utils/get-lock-styles';\nimport { injectStyles } from './utils/inject-style-tag';\nimport { insertStyleTag } from './utils/insert-style-tag';\nimport { makeStyleTag } from './utils/make-style-tag';\n\nexport function useScrollLock(\n lock?: boolean,\n options = {\n disableBodyPadding: false,\n }\n) {\n const [scrollLocked, setScrollLocked] = useState(lock || false);\n const scrollTop = useRef(0);\n\n const { disableBodyPadding } = options;\n\n const stylesheet = useRef<CSSStyleSheet | any | null>(null);\n\n const lockScroll = () => {\n scrollTop.current = window.scrollY;\n\n const styles = getLockStyles({ disableBodyPadding });\n\n /**\n * by applying styles via style tag\n * we dont care about previous styles due to inheritance\n * when scroll gets unlocked we delete that style tag\n */\n const sheet = makeStyleTag();\n\n injectStyles(sheet, styles);\n insertStyleTag(sheet);\n\n stylesheet.current = sheet;\n };\n\n const unlockScroll = () => {\n if (!stylesheet?.current) return;\n\n stylesheet.current.parentNode.removeChild(stylesheet.current);\n stylesheet.current = null;\n };\n\n useEffect(() => {\n if (scrollLocked) {\n lockScroll();\n } else {\n unlockScroll();\n }\n\n return unlockScroll;\n }, [scrollLocked]);\n\n useEffect(() => {\n if (lock !== undefined) {\n setScrollLocked(lock);\n }\n }, [lock]);\n\n useEffect(() => {\n if (lock === undefined && typeof window !== 'undefined') {\n window.document.body.style.overflow === 'hidden' && setScrollLocked(true);\n }\n }, [setScrollLocked]);\n\n return [scrollLocked, setScrollLocked] as const;\n}\n","export function makeStyleTag() {\n const tag = document.createElement('style');\n tag.type = 'text/css';\n tag.setAttribute('mantine-scroll-lock', '');\n\n return tag;\n}\n","export function injectStyles(tag, css): void {\n if (tag.styleSheet) {\n // eslint-disable-next-line no-param-reassign\n tag.styleSheet.cssText = css;\n } else {\n tag.appendChild(document.createTextNode(css));\n }\n}\n","export function insertStyleTag(tag) {\n const head = document.head || document.getElementsByTagName('head')[0];\n\n head.appendChild(tag);\n}\n","import { useEffect, useRef, EffectCallback, DependencyList } from 'react';\n\nexport function useDidUpdate(fn: EffectCallback, dependencies?: DependencyList) {\n const mounted = useRef(false);\n\n useEffect(\n () => () => {\n mounted.current = false;\n },\n []\n );\n\n useEffect(() => {\n if (mounted.current) {\n return fn();\n }\n\n mounted.current = true;\n return undefined;\n }, dependencies);\n}\n","import { useRef } from 'react';\nimport { useDidUpdate } from '../use-did-update/use-did-update';\n\ninterface UseFocusReturn {\n opened: boolean;\n shouldReturnFocus?: boolean;\n}\n\n/** Returns focus to last active element, used in Modal and Drawer */\nexport function useFocusReturn({ opened, shouldReturnFocus = true }: UseFocusReturn) {\n const lastActiveElement = useRef<HTMLElement>();\n const returnFocus = () => {\n if (\n lastActiveElement.current &&\n 'focus' in lastActiveElement.current &&\n typeof lastActiveElement.current.focus === 'function'\n ) {\n lastActiveElement.current?.focus({ preventScroll: true });\n }\n };\n\n useDidUpdate(() => {\n let timeout = -1;\n\n const clearFocusTimeout = (event: KeyboardEvent) => {\n if (event.key === 'Tab') {\n window.clearTimeout(timeout);\n }\n };\n\n document.addEventListener('keydown', clearFocusTimeout);\n\n if (opened) {\n lastActiveElement.current = document.activeElement as HTMLElement;\n } else if (shouldReturnFocus) {\n timeout = window.setTimeout(returnFocus, 10);\n }\n\n return () => {\n window.clearTimeout(timeout);\n document.removeEventListener('keydown', clearFocusTimeout);\n };\n }, [opened, shouldReturnFocus]);\n\n return returnFocus;\n}\n","const elevations = {\n app: 100,\n modal: 200,\n popover: 300,\n overlay: 400,\n max: 9999,\n} as const;\n\nexport function getDefaultZIndex(level: keyof typeof elevations) {\n return elevations[level];\n}\n","import React from 'react';\nimport { createStyles, MantineTheme } from '@mantine/styles';\n\nconst sizes = {\n xs: 180,\n sm: 240,\n md: 320,\n lg: 360,\n xl: 500,\n full: '100%',\n};\n\nexport type DrawerPosition = 'top' | 'bottom' | 'left' | 'right';\n\nexport interface DrawerStylesParams {\n position: DrawerPosition;\n size: number | string;\n zIndex: React.CSSProperties['zIndex'];\n withOverlay: boolean;\n}\n\ninterface GetPositionStyles {\n position: DrawerPosition;\n size: number | string;\n theme: MantineTheme;\n}\n\nfunction getPositionStyles({\n position,\n size,\n theme,\n}: GetPositionStyles): Partial<Record<keyof React.CSSProperties, any>> {\n switch (position) {\n case 'top':\n return { top: 0, left: 0, right: 0, height: theme.fn.size({ size, sizes }) };\n\n case 'bottom':\n return { bottom: 0, left: 0, right: 0, height: theme.fn.size({ size, sizes }) };\n\n case 'right':\n return { bottom: 0, top: 0, right: 0, width: theme.fn.size({ size, sizes }) };\n\n case 'left':\n return { bottom: 0, top: 0, left: 0, width: theme.fn.size({ size, sizes }) };\n\n default:\n return null;\n }\n}\n\nexport default createStyles(\n (theme, { position, size, zIndex, withOverlay }: DrawerStylesParams) => ({\n closeButton: {},\n overlay: {},\n body: {},\n\n root: {\n position: 'fixed',\n zIndex,\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n pointerEvents: withOverlay === false ? 'none' : undefined,\n },\n\n drawer: {\n ...getPositionStyles({ position, size, theme }),\n maxWidth: '100%',\n maxHeight: '100vh',\n position: 'fixed',\n outline: 0,\n zIndex: 1,\n pointerEvents: withOverlay === false ? 'auto' : undefined,\n },\n\n title: {\n marginRight: theme.spacing.md,\n textOverflow: 'ellipsis',\n display: 'block',\n wordBreak: 'break-word',\n },\n\n header: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: theme.spacing.md,\n },\n })\n);\n","/* eslint-disable react/no-unused-prop-types */\nimport React, { ReactPortal, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useIsomorphicEffect } from '@mantine/hooks';\nimport { useMantineTheme, useComponentDefaultProps } from '@mantine/styles';\n\nexport interface PortalProps {\n /** Portal children, for example, modal or popover */\n children: React.ReactNode;\n\n /** Element where portal should be rendered, by default new div element is created and appended to document.body */\n target?: HTMLElement | string;\n\n /** Root element className */\n className?: string;\n}\n\nexport function Portal(props: PortalProps): ReactPortal {\n const { children, target, className } = useComponentDefaultProps('Portal', {}, props);\n\n const theme = useMantineTheme();\n const [mounted, setMounted] = useState(false);\n const ref = useRef<HTMLElement>();\n\n useIsomorphicEffect(() => {\n setMounted(true);\n ref.current = !target\n ? document.createElement('div')\n : typeof target === 'string'\n ? document.querySelector(target)\n : target;\n\n if (!target) {\n document.body.appendChild(ref.current);\n }\n\n return () => {\n !target && document.body.removeChild(ref.current);\n };\n }, [target]);\n\n if (!mounted) {\n return null;\n }\n\n return createPortal(\n <div className={className} dir={theme.dir}>\n {children}\n </div>,\n ref.current\n );\n}\n\nPortal.displayName = '@mantine/core/Portal';\n","import React from 'react';\nimport { Portal, PortalProps } from './Portal';\n\nexport interface OptionalPortalProps extends PortalProps {\n /** Determines if children should be rendered in Portal */\n withinPortal?: boolean;\n}\n\nexport function OptionalPortal({ withinPortal = true, children, ...others }: OptionalPortalProps) {\n if (withinPortal) {\n return <Portal {...others}>{children}</Portal>;\n }\n\n return <>{children}</>;\n}\n\nOptionalPortal.displayName = '@mantine/core/OptionalPortal';\n","import React from 'react';\n\nexport interface MantineTransitionStyles {\n common?: React.CSSProperties;\n in: React.CSSProperties;\n out: React.CSSProperties;\n transitionProperty: React.CSSProperties['transitionProperty'];\n}\n\nexport type MantineTransitionName =\n | 'fade'\n | 'skew-up'\n | 'skew-down'\n | 'rotate-right'\n | 'rotate-left'\n | 'slide-down'\n | 'slide-up'\n | 'slide-right'\n | 'slide-left'\n | 'scale-y'\n | 'scale-x'\n | 'scale'\n | 'pop'\n | 'pop-top-left'\n | 'pop-top-right'\n | 'pop-bottom-left'\n | 'pop-bottom-right';\n\nexport type MantineTransition = MantineTransitionName | MantineTransitionStyles;\n\nconst popIn = {\n in: { opacity: 1, transform: 'scale(1)' },\n out: { opacity: 0, transform: 'scale(.9) translateY(10px)' },\n transitionProperty: 'transform, opacity',\n};\n\nexport const transitions: Record<MantineTransitionName, MantineTransitionStyles> = {\n fade: {\n in: { opacity: 1 },\n out: { opacity: 0 },\n transitionProperty: 'opacity',\n },\n\n scale: {\n in: { opacity: 1, transform: 'scale(1)' },\n out: { opacity: 0, transform: 'scale(0)' },\n common: { transformOrigin: 'top' },\n transitionProperty: 'transform, opacity',\n },\n\n 'scale-y': {\n in: { opacity: 1, transform: 'scaleY(1)' },\n out: { opacity: 0, transform: 'scaleY(0)' },\n common: { transformOrigin: 'top' },\n transitionProperty: 'transform, opacity',\n },\n\n 'scale-x': {\n in: { opacity: 1, transform: 'scaleX(1)' },\n out: { opacity: 0, transform: 'scaleX(0)' },\n common: { transformOrigin: 'left' },\n transitionProperty: 'transform, opacity',\n },\n\n 'skew-up': {\n in: { opacity: 1, transform: 'translateY(0) skew(0deg, 0deg)' },\n out: { opacity: 0, transform: 'translateY(-20px) skew(-10deg, -5deg)' },\n common: { transformOrigin: 'top' },\n transitionProperty: 'transform, opacity',\n },\n\n 'skew-down': {\n in: { opacity: 1, transform: 'translateY(0) skew(0deg, 0deg)' },\n out: { opacity: 0, transform: 'translateY(20px) skew(-10deg, -5deg)' },\n common: { transformOrigin: 'bottom' },\n transitionProperty: 'transform, opacity',\n },\n\n 'rotate-left': {\n in: { opacity: 1, transform: 'translateY(0) rotate(0deg)' },\n out: { opacity: 0, transform: 'translateY(20px) rotate(-5deg)' },\n common: { transformOrigin: 'bottom' },\n transitionProperty: 'transform, opacity',\n },\n\n 'rotate-right': {\n in: { opacity: 1, transform: 'translateY(0) rotate(0deg)' },\n out: { opacity: 0, transform: 'translateY(20px) rotate(5deg)' },\n common: { transformOrigin: 'top' },\n transitionProperty: 'transform, opacity',\n },\n\n 'slide-down': {\n in: { opacity: 1, transform: 'translateY(0)' },\n out: { opacity: 0, transform: 'translateY(-100%)' },\n common: { transformOrigin: 'top' },\n transitionProperty: 'transform, opacity',\n },\n\n 'slide-up': {\n in: { opacity: 1, transform: 'translateY(0)' },\n out: { opacity: 0, transform: 'translateY(100%)' },\n common: { transformOrigin: 'bottom' },\n transitionProperty: 'transform, opacity',\n },\n\n 'slide-left': {\n in: { opacity: 1, transform: 'translateX(0)' },\n out: { opacity: 0, transform: 'translateX(100%)' },\n common: { transformOrigin: 'left' },\n transitionProperty: 'transform, opacity',\n },\n\n 'slide-right': {\n in: { opacity: 1, transform: 'translateX(0)' },\n out: { opacity: 0, transform: 'translateX(-100%)' },\n common: { transformOrigin: 'right' },\n transitionProperty: 'transform, opacity',\n },\n\n pop: {\n ...popIn,\n common: { transformOrigin: 'center center' },\n },\n\n 'pop-bottom-left': {\n ...popIn,\n common: { transformOrigin: 'bottom left' },\n },\n\n 'pop-bottom-right': {\n ...popIn,\n common: { transformOrigin: 'bottom right' },\n },\n\n 'pop-top-left': {\n ...popIn,\n common: { transformOrigin: 'top left' },\n },\n\n 'pop-top-right': {\n ...popIn,\n common: { transformOrigin: 'top right' },\n },\n};\n","import { MantineTransition, transitions } from '../transitions';\n\nconst transitionStatuses = {\n entering: 'in',\n entered: 'in',\n exiting: 'out',\n exited: 'out',\n 'pre-exiting': 'out',\n 'pre-entering': 'out',\n} as const;\n\nexport function getTransitionStyles({\n transition,\n state,\n duration,\n timingFunction,\n}: {\n transition: MantineTransition;\n state: keyof typeof transitionStatuses;\n duration: number;\n timingFunction: React.CSSProperties['transitionTimingFunction'];\n}): React.CSSProperties {\n const shared = {\n transitionDuration: `${duration}ms`,\n transitionTimingFunction: timingFunction,\n };\n\n if (typeof transition === 'string') {\n if (!(transition in transitions)) {\n return null;\n }\n\n return {\n transitionProperty: transitions[transition].transitionProperty,\n ...shared,\n ...transitions[transition].common,\n ...transitions[transition][transitionStatuses[state]],\n };\n }\n\n return {\n transitionProperty: transition.transitionProperty,\n ...shared,\n ...transition.common,\n ...transition[transitionStatuses[state]],\n };\n}\n","import { useState, useEffect, useRef } from 'react';\n\nexport interface UseMediaQueryOptions {\n getInitialValueInEffect: boolean;\n}\n\ntype MediaQueryCallback = (event: { matches: boolean; media: string }) => void;\n\n/**\n * Older versions of Safari (shipped withCatalina and before) do not support addEventListener on matchMedia\n * https://stackoverflow.com/questions/56466261/matchmedia-addlistener-marked-as-deprecated-addeventlistener-equivalent\n * */\nfunction attachMediaListener(query: MediaQueryList, callback: MediaQueryCallback) {\n try {\n query.addEventListener('change', callback);\n return () => query.removeEventListener('change', callback);\n } catch (e) {\n query.addListener(callback);\n return () => query.removeListener(callback);\n }\n}\n\nfunction getInitialValue(query: string, initialValue?: boolean) {\n if (typeof initialValue === 'boolean') {\n return initialValue;\n }\n\n if (typeof window !== 'undefined' && 'matchMedia' in window) {\n return window.matchMedia(query).matches;\n }\n\n return false;\n}\n\nexport function useMediaQuery(\n query: string,\n initialValue?: boolean,\n { getInitialValueInEffect }: UseMediaQueryOptions = {\n getInitialValueInEffect: true,\n }\n) {\n const [matches, setMatches] = useState(\n getInitialValueInEffect ? initialValue : getInitialValue(query, initialValue)\n );\n const queryRef = useRef<MediaQueryList>();\n\n useEffect(() => {\n if ('matchMedia' in window) {\n queryRef.current = window.matchMedia(query);\n setMatches(queryRef.current.matches);\n return attachMediaListener(queryRef.current, (event) => setMatches(event.matches));\n }\n\n return undefined;\n }, [query]);\n\n return matches;\n}\n","import { useMediaQuery, UseMediaQueryOptions } from '../use-media-query/use-media-query';\n\nexport function useReducedMotion(initialValue?: boolean, options?: UseMediaQueryOptions) {\n return useMediaQuery('(prefers-reduced-motion: reduce)', initialValue, options);\n}\n","import { useState, useEffect, useRef } from 'react';\nimport { useReducedMotion, useDidUpdate } from '@mantine/hooks';\nimport { useMantineTheme } from '@mantine/styles';\n\nexport type TransitionStatus =\n | 'entered'\n | 'exited'\n | 'entering'\n | 'exiting'\n | 'pre-exiting'\n | 'pre-entering';\n\ninterface UseTransition {\n duration: number;\n exitDuration: number;\n timingFunction: string;\n mounted: boolean;\n onEnter?(): void;\n onExit?(): void;\n onEntered?(): void;\n onExited?(): void;\n}\n\nexport function useTransition({\n duration,\n exitDuration,\n timingFunction,\n mounted,\n onEnter,\n onExit,\n onEntered,\n onExited,\n}: UseTransition) {\n const theme = useMantineTheme();\n const shouldReduceMotion = useReducedMotion();\n const reduceMotion = theme.respectReducedMotion ? shouldReduceMotion : false;\n const [transitionStatus, setStatus] = useState<TransitionStatus>(mounted ? 'entered' : 'exited');\n let transitionDuration = reduceMotion ? 0 : duration;\n const timeoutRef = useRef<number>(-1);\n\n const handleStateChange = (shouldMount: boolean) => {\n const preHandler = shouldMount ? onEnter : onExit;\n const handler = shouldMount ? onEntered : onExited;\n\n setStatus(shouldMount ? 'pre-entering' : 'pre-exiting');\n window.clearTimeout(timeoutRef.current);\n transitionDuration = reduceMotion ? 0 : shouldMount ? duration : exitDuration;\n\n if (transitionDuration === 0) {\n typeof preHandler === 'function' && preHandler();\n typeof handler === 'function' && handler();\n setStatus(shouldMount ? 'entered' : 'exited');\n } else {\n const preStateTimeout = window.setTimeout(() => {\n typeof preHandler === 'function' && preHandler();\n setStatus(shouldMount ? 'entering' : 'exiting');\n }, 10);\n\n timeoutRef.current = window.setTimeout(() => {\n window.clearTimeout(preStateTimeout);\n typeof handler === 'function' && handler();\n setStatus(shouldMount ? 'entered' : 'exited');\n }, transitionDuration);\n }\n };\n\n useDidUpdate(() => {\n handleStateChange(mounted);\n }, [mounted]);\n\n useEffect(() => () => window.clearTimeout(timeoutRef.current), []);\n\n return {\n transitionDuration,\n transitionStatus,\n transitionTimingFunction: timingFunction || theme.transitionTimingFunction,\n };\n}\n","import React from 'react';\nimport { getTransitionStyles } from './get-transition-styles/get-transition-styles';\nimport { useTransition } from './use-transition';\nimport { MantineTransition } from './transitions';\n\ninterface GroupedTransitionItem {\n duration: number;\n timingFunction?: React.CSSProperties['transitionTimingFunction'];\n transition: MantineTransition;\n}\n\nexport interface GroupedTransitionProps {\n /** Transitions group */\n transitions: Record<string, GroupedTransitionItem>;\n\n /** Render function with transition group styles argument */\n children(styles: Record<string, React.CSSProperties>): React.ReactElement<any, any>;\n\n /** Enter transition duration in ms */\n duration?: number;\n\n /** Exit transition duration in ms */\n exitDuration?: number;\n\n /** Transition timing function, defaults to theme.transitionTimingFunction */\n timingFunction?: string;\n\n /** When true, component will be mounted */\n mounted: boolean;\n\n /** Calls when exit transition ends */\n onExited?: () => void;\n\n /** Calls when exit transition starts */\n onExit?: () => void;\n\n /** Calls when enter transition starts */\n onEnter?: () => void;\n\n /** Calls when enter transition ends */\n onEntered?: () => void;\n}\n\nexport function GroupedTransition({\n transitions,\n duration = 250,\n exitDuration = duration,\n mounted,\n children,\n timingFunction,\n onExit,\n onEntered,\n onEnter,\n onExited,\n}: GroupedTransitionProps) {\n const { transitionDuration, transitionStatus, transitionTimingFunction } = useTransition({\n mounted,\n duration,\n exitDuration,\n timingFunction,\n onExit,\n onEntered,\n onEnter,\n onExited,\n });\n\n if (transitionDuration === 0) {\n return mounted ? <>{children({})}</> : null;\n }\n\n if (transitionStatus === 'exited') {\n return null;\n }\n\n const transitionsStyles = Object.keys(transitions).reduce((acc, transition) => {\n acc[transition] = getTransitionStyles({\n duration: transitions[transition].duration,\n transition: transitions[transition].transition,\n timingFunction: transitions[transition].timingFunction || transitionTimingFunction,\n state: transitionStatus,\n });\n\n return acc;\n }, {});\n\n return <>{children(transitionsStyles)}</>;\n}\n\nGroupedTransition.displayName = '@mantine/core/GroupedTransition';\n","import {\n createStyles,\n MantineTheme,\n CSSObject,\n MantineColor,\n MantineGradient,\n MantineNumberSize,\n} from '@mantine/styles';\n\nexport interface TextStylesParams {\n color: 'dimmed' | MantineColor;\n variant: 'text' | 'link' | 'gradient';\n size: MantineNumberSize;\n lineClamp: number;\n truncate: 'end' | 'start' | boolean;\n inline: boolean;\n inherit: boolean;\n underline: boolean;\n strikethrough: boolean;\n italic: boolean;\n gradient: MantineGradient;\n transform: React.CSSProperties['textTransform'];\n align: React.CSSProperties['textAlign'];\n weight: React.CSSProperties['fontWeight'];\n}\n\ninterface GetTextColor {\n theme: MantineTheme;\n color: 'dimmed' | MantineColor;\n variant: TextStylesParams['variant'];\n}\ninterface GetTruncate {\n truncate: 'end' | 'start' | boolean;\n theme: MantineTheme;\n}\n\nfunction getTextDecoration({\n underline,\n strikethrough,\n}: {\n underline: boolean;\n strikethrough: boolean;\n}) {\n const styles = [];\n if (underline) {\n styles.push('underline');\n }\n\n if (strikethrough) {\n styles.push('line-through');\n }\n\n return styles.length > 0 ? styles.join(' ') : 'none';\n}\n\nfunction getTextColor({ theme, color, variant }: GetTextColor) {\n if (color === 'dimmed') {\n return theme.colorScheme === 'dark' ? theme.colors.dark[2] : theme.colors.gray[6];\n }\n\n return typeof color === 'string' && (color in theme.colors || color.split('.')[0] in theme.colors)\n ? theme.fn.variant({ variant: 'filled', color }).background\n : variant === 'link'\n ? theme.colors[theme.primaryColor][theme.colorScheme === 'dark' ? 4 : 7]\n : color || 'inherit';\n}\n\nfunction getLineClamp(lineClamp: number): CSSObject {\n if (typeof lineClamp === 'number') {\n return {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n display: '-webkit-box',\n WebkitLineClamp: lineClamp,\n WebkitBoxOrient: 'vertical',\n };\n }\n\n return null;\n}\n\nfunction getTruncate({ theme, truncate }: GetTruncate): CSSObject {\n if (truncate === 'start') {\n return {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n direction: theme.dir === 'ltr' ? 'rtl' : 'ltr',\n textAlign: theme.dir === 'ltr' ? 'right' : 'left',\n };\n }\n if (truncate) {\n return {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n };\n }\n\n return null;\n}\n\nexport default createStyles(\n (\n theme,\n {\n color,\n variant,\n size,\n lineClamp,\n truncate,\n inline,\n inherit,\n underline,\n gradient,\n weight,\n transform,\n align,\n strikethrough,\n italic,\n }: TextStylesParams\n ) => {\n const colors = theme.fn.variant({ variant: 'gradient', gradient });\n\n return {\n root: {\n ...theme.fn.fontStyles(),\n ...theme.fn.focusStyles(),\n ...getLineClamp(lineClamp),\n ...getTruncate({ theme, truncate }),\n color: getTextColor({ color, theme, variant }),\n fontFamily: inherit ? 'inherit' : theme.fontFamily,\n fontSize:\n inherit || size === undefined\n ? 'inherit'\n : theme.fn.size({ size, sizes: theme.fontSizes }),\n lineHeight: inherit ? 'inherit' : inline ? 1 : theme.lineHeight,\n textDecoration: getTextDecoration({ underline, strikethrough }),\n WebkitTapHighlightColor: 'transparent',\n fontWeight: inherit ? 'inherit' : weight,\n textTransform: transform,\n textAlign: align,\n fontStyle: italic ? 'italic' : undefined,\n\n ...theme.fn.hover(\n variant === 'link' && underline === undefined\n ? {\n textDecoration: 'underline',\n }\n : undefined\n ),\n },\n\n gradient: {\n backgroundImage: colors.background,\n WebkitBackgroundClip: 'text',\n WebkitTextFillColor: 'transparent',\n },\n };\n }\n);\n","import React, { forwardRef } from 'react';\nimport {\n DefaultProps,\n MantineGradient,\n useComponentDefaultProps,\n MantineColor,\n MantineNumberSize,\n} from '@mantine/styles';\nimport { createPolymorphicComponent } from '@mantine/utils';\nimport { Box } from '../Box';\nimport useStyles from './Text.styles';\n\nexport interface TextProps extends DefaultProps {\n /** Text content */\n children?: React.ReactNode;\n\n /** Key of theme.fontSizes or number to set font-size in px */\n size?: MantineNumberSize;\n\n /** Key of theme.colors or any valid CSS color */\n color?: 'dimmed' | MantineColor;\n\n /** Sets font-weight css property */\n weight?: React.CSSProperties['fontWeight'];\n\n /** Sets text-transform css property */\n transform?: React.CSSProperties['textTransform'];\n\n /** Sets text-align css property */\n align?: React.CSSProperties['textAlign'];\n\n /** Link or text variant */\n variant?: 'text' | 'link' | 'gradient';\n\n /** CSS -webkit-line-clamp property */\n lineClamp?: number;\n\n /** CSS truncate overflowing text with an ellipsis */\n truncate?: 'end' | 'start' | true;\n\n /** Sets line-height to 1 for centering */\n inline?: boolean;\n\n /** Underline the text */\n underline?: boolean;\n\n /** Add strikethrough styles */\n strikethrough?: boolean;\n\n /** Adds font-style: italic style */\n italic?: boolean;\n\n /** Inherit font properties from parent element */\n inherit?: boolean;\n\n /** Controls gradient settings in gradient variant only */\n gradient?: MantineGradient;\n\n /** Shorthand for component=\"span\" */\n span?: boolean;\n}\n\nconst defaultProps: Partial<TextProps> = {\n variant: 'text',\n};\n\nexport const _Text = forwardRef<HTMLDivElement, TextProps>((props, ref) => {\n const {\n className,\n size,\n weight,\n transform,\n color,\n align,\n variant,\n lineClamp,\n truncate,\n gradient,\n inline,\n inherit,\n underline,\n strikethrough,\n italic,\n classNames,\n styles,\n unstyled,\n span,\n ...others\n } = useComponentDefaultProps('Text', defaultProps, props);\n\n const { classes, cx } = useStyles(\n {\n variant,\n color,\n size,\n lineClamp,\n truncate,\n inline,\n inherit,\n underline,\n strikethrough,\n italic,\n weight,\n transform,\n align,\n gradient,\n },\n { unstyled, name: 'Text' }\n );\n\n return (\n <Box\n ref={ref}\n className={cx(classes.root, { [classes.gradient]: variant === 'gradient' }, className)}\n component={span ? 'span' : 'div'}\n {...others}\n />\n );\n});\n\n_Text.displayName = '@mantine/core/Text';\n\nexport const Text = createPolymorphicComponent<'div', TextProps>(_Text);\n","import {\n createStyles,\n MantineNumberSize,\n MantineColor,\n MantineTheme,\n MantineGradient,\n} from '@mantine/styles';\n\nexport const ACTION_ICON_VARIANTS = [\n 'subtle',\n 'filled',\n 'outline',\n 'light',\n 'default',\n 'transparent',\n 'gradient',\n] as const;\n\nexport type ActionIconVariant = typeof ACTION_ICON_VARIANTS[number];\n\nexport interface ActionIconStylesParams {\n color: MantineColor;\n size: MantineNumberSize;\n radius: MantineNumberSize;\n variant: ActionIconVariant;\n gradient: MantineGradient;\n}\n\nexport const sizes = {\n xs: 18,\n sm: 22,\n md: 28,\n lg: 34,\n xl: 44,\n};\n\ninterface GetVariantStyles {\n variant: ActionIconVariant;\n theme: MantineTheme;\n color: MantineColor;\n gradient: MantineGradient;\n}\n\nfunction getVariantStyles({ variant, theme, color, gradient }: GetVariantStyles) {\n const colors = theme.fn.variant({ color, variant, gradient });\n\n if (variant === 'gradient') {\n return {\n border: 0,\n backgroundImage: colors.background,\n color: colors.color,\n\n '&:hover': theme.fn.hover({\n backgroundSize: '200%',\n }),\n };\n }\n\n return {\n border: `1px solid ${colors.border}`,\n backgroundColor: colors.background,\n color: colors.color,\n ...theme.fn.hover({\n backgroundColor: colors.hover,\n }),\n };\n}\n\nexport default createStyles(\n (theme, { color, size, radius, variant, gradient }: ActionIconStylesParams) => ({\n root: {\n ...getVariantStyles({ variant, theme, color, gradient }),\n position: 'relative',\n height: theme.fn.size({ size, sizes }),\n minHeight: theme.fn.size({ size, sizes }),\n width: theme.fn.size({ size, sizes }),\n minWidth: theme.fn.size({ size, sizes }),\n borderRadius: theme.fn.radius(radius),\n padding: 0,\n lineHeight: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n\n '&:active': theme.activeStyles,\n\n '&:disabled, &[data-disabled]': {\n color: theme.colors.gray[theme.colorScheme === 'dark' ? 6 : 4],\n cursor: 'not-allowed',\n backgroundColor:\n variant === 'transparent'\n ? undefined\n : theme.fn.themeColor('gray', theme.colorScheme === 'dark' ? 8 : 1),\n borderColor:\n variant === 'transparent'\n ? undefined\n : theme.fn.themeColor('gray', theme.colorScheme === 'dark' ? 8 : 1),\n backgroundImage: 'none',\n pointerEvents: 'none',\n\n '&:active': {\n transform: 'none',\n },\n },\n\n '&[data-loading]': {\n pointerEvents: 'none',\n\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n top: -1,\n left: -1,\n right: -1,\n bottom: -1,\n backgroundColor:\n theme.colorScheme === 'dark'\n ? theme.fn.rgba(theme.colors.dark[7], 0.5)\n : 'rgba(255, 255, 255, .5)',\n borderRadius: theme.fn.radius(radius),\n cursor: 'not-allowed',\n },\n },\n },\n })\n);\n","import React from 'react';\nimport { LoaderProps } from './loader-props';\n\nexport function Bars({ size, color, ...others }: LoaderProps) {\n return (\n <svg\n viewBox=\"0 0 135 140\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill={color}\n width={`${size}px`}\n {...others}\n >\n <rect y=\"10\" width=\"15\" height=\"120\" rx=\"6\">\n <animate\n attributeName=\"height\"\n begin=\"0.5s\"\n dur=\"1s\"\n values=\"120;110;100;90;80;70;60;50;40;140;120\"\n calcMode=\"linear\"\n repeatCount=\"indefinite\"\n />\n <animate\n attributeName=\"y\"\n begin=\"0.5s\"\n dur=\"1s\"\n values=\"10;15;20;25;30;35;40;45;50;0;10\"\n calcMode=\"linear\"\n repeatCount=\"indefinite\"\n />\n </rect>\n <rect x=\"30\" y=\"10\" width=\"15\" height=\"120\" rx=\"6\">\n <animate\n attributeName=\"height\"\n begin=\"0.25s\"\n dur=\"1s\"\n values=\"120;110;100;90;80;70;60;50;40;140;120\"\n calcMode=\"linear\"\n repeatCount=\"indefinite\"\n />\n <animate\n attributeName=\"y\"\n begin=\"0.25s\"\n dur=\"1s\"\n values=\"10;15;20;25;30;35;40;45;50;0;10\"\n calcMode=\"linear\"\n repeatCount=\"indefinite\"\n />\n </rect>\n <rect x=\"60\" width=\"15\" height=\"140\" rx=\"6\">\n <animate\n attributeName=\"height\"\n begin=\"0s\"\n dur=\"1s\"\n values=\"120;110;100;90;80;70;60;50;40;140;120\"\n calcMode=\"linear\"\n repeatCount=\"indefinite\"\n />\n <animate\n attributeName=\"y\"\n begin=\"0s\"\n dur=\"1s\"\n values=\"10;15;20;25;30;35;40;45;50;0;10\"\n calcMode=\"linear\"\n repeatCount=\"indefinite\"\n />\n </rect>\n <rect x=\"90\" y=\"10\" width=\"15\" height=\"120\" rx=\"6\">\n <animate\n attributeName=\"height\"\n begin=\"0.25s\"\n dur=\"1s\"\n values=\"120;110;100;90;80;70;60;50;40;140;120\"\n calcMode=\"linear\"\n repeatCount=\"indefinite\"\n />\n <animate\n attributeName=\"y\"\n begin=\"0.25s\"\n dur=\"1s\"\n values=\"10;15;20;25;30;35;40;45;50;0;10\"\n calcMode=\"linear\"\n repeatCount=\"indefinite\"\n />\n </rect>\n <rect x=\"120\" y=\"10\" width=\"15\" height=\"120\" rx=\"6\">\n <animate\n attributeName=\"height\"\n begin=\"0.5s\"\n dur=\"1s\"\n values=\"120;110;100;90;80;70;60;50;40;140;120\"\n calcMode=\"linear\"\n repeatCount=\"indefinite\"\n />\n <animate\n attributeName=\"y\"\n begin=\"0.5s\"\n dur=\"1s\"\n values=\"10;15;20;25;30;35;40;45;50;0;10\"\n calcMode=\"linear\"\n repeatCount=\"indefinite\"\n />\n </rect>\n </svg>\n );\n}\n","import React from 'react';\nimport { LoaderProps } from './loader-props';\n\nexport function Oval({ size, color, ...others }: LoaderProps) {\n return (\n <svg\n width={`${size}px`}\n height={`${size}px`}\n viewBox=\"0 0 38 38\"\n xmlns=\"http://www.w3.org/2000/svg\"\n stroke={color}\n {...others}\n >\n <g fill=\"none\" fillRule=\"evenodd\">\n <g transform=\"translate(2.5 2.5)\" strokeWidth=\"5\">\n <circle strokeOpacity=\".5\" cx=\"16\" cy=\"16\" r=\"16\" />\n <path d=\"M32 16c0-9.94-8.06-16-16-16\">\n <animateTransform\n attributeName=\"transform\"\n type=\"rotate\"\n from=\"0 16 16\"\n to=\"360 16 16\"\n dur=\"1s\"\n repeatCount=\"indefinite\"\n />\n </path>\n </g>\n </g>\n </svg>\n );\n}\n","import React from 'react';\nimport { LoaderProps } from './loader-props';\n\nexport function Dots({ size, color, ...others }: LoaderProps) {\n return (\n <svg\n width={`${size}px`}\n height={`${size / 4}px`}\n viewBox=\"0 0 120 30\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill={color}\n {...others}\n >\n <circle cx=\"15\" cy=\"15\" r=\"15\">\n <animate\n attributeName=\"r\"\n from=\"15\"\n to=\"15\"\n begin=\"0s\"\n dur=\"0.8s\"\n values=\"15;9;15\"\n calcMode=\"linear\"\n repeatCount=\"indefinite\"\n />\n <animate\n attributeName=\"fill-opacity\"\n from=\"1\"\n to=\"1\"\n begin=\"0s\"\n dur=\"0.8s\"\n values=\"1;.5;1\"\n calcMode=\"linear\"\n repeatCount=\"indefinite\"\n />\n </circle>\n <circle cx=\"60\" cy=\"15\" r=\"9\" fillOpacity=\"0.3\">\n <animate\n attributeName=\"r\"\n from=\"9\"\n to=\"9\"\n begin=\"0s\"\n dur=\"0.8s\"\n values=\"9;15;9\"\n calcMode=\"linear\"\n repeatCount=\"indefinite\"\n />\n <animate\n attributeName=\"fill-opacity\"\n from=\"0.5\"\n to=\"0.5\"\n begin=\"0s\"\n dur=\"0.8s\"\n values=\".5;1;.5\"\n calcMode=\"linear\"\n repeatCount=\"indefinite\"\n />\n </circle>\n <circle cx=\"105\" cy=\"15\" r=\"15\">\n <animate\n attributeName=\"r\"\n from=\"15\"\n to=\"15\"\n begin=\"0s\"\n dur=\"0.8s\"\n values=\"15;9;15\"\n calcMode=\"linear\"\n repeatCount=\"indefinite\"\n />\n <animate\n attributeName=\"fill-opacity\"\n from=\"1\"\n to=\"1\"\n begin=\"0s\"\n dur=\"0.8s\"\n values=\"1;.5;1\"\n calcMode=\"linear\"\n repeatCount=\"indefinite\"\n />\n </circle>\n </svg>\n );\n}\n","import React from 'react';\nimport {\n DefaultProps,\n MantineNumberSize,\n MantineColor,\n MantineTheme,\n useMantineTheme,\n useComponentDefaultProps,\n} from '@mantine/styles';\nimport { Box } from '../Box';\nimport { Bars } from './loaders/Bars';\nimport { Oval } from './loaders/Oval';\nimport { Dots } from './loaders/Dots';\n\nconst LOADERS = {\n bars: Bars,\n oval: Oval,\n dots: Dots,\n};\n\nconst sizes = {\n xs: 18,\n sm: 22,\n md: 36,\n lg: 44,\n xl: 58,\n};\n\nexport interface LoaderProps\n extends DefaultProps,\n Omit<React.ComponentPropsWithoutRef<'svg'>, 'display' | 'opacity'> {\n /** Defines width of loader */\n size?: MantineNumberSize;\n\n /** Loader color from theme */\n color?: MantineColor;\n\n /** Loader appearance */\n variant?: MantineTheme['loader'];\n}\n\nconst defaultProps: Partial<LoaderProps> = {\n size: 'md',\n};\n\nexport function Loader(props: LoaderProps) {\n const { size, color, variant, ...others } = useComponentDefaultProps(\n 'Loader',\n defaultProps,\n props\n );\n const theme = useMantineTheme();\n const defaultLoader = variant in LOADERS ? variant : theme.loader;\n\n return (\n <Box\n role=\"presentation\"\n component={LOADERS[defaultLoader] || LOADERS.bars}\n size={theme.fn.size({ size, sizes })}\n color={\n theme.fn.variant({\n variant: 'filled',\n primaryFallback: false,\n color: color || theme.primaryColor,\n }).background\n }\n {...others}\n />\n );\n}\n\nLoader.displayName = '@mantine/core/Loader';\n","import { createStyles } from '@mantine/styles';\n\nexport default createStyles((theme) => ({\n root: {\n ...theme.fn.focusStyles(),\n ...theme.fn.fontStyles(),\n cursor: 'pointer',\n border: 0,\n padding: 0,\n appearance: 'none',\n fontSize: theme.fontSizes.md,\n backgroundColor: 'transparent',\n textAlign: 'left',\n color: theme.colorScheme === 'dark' ? theme.colors.dark[0] : theme.black,\n textDecoration: 'none',\n boxSizing: 'border-box',\n },\n}));\n","import React, { forwardRef } from 'react';\nimport { DefaultProps, useComponentDefaultProps } from '@mantine/styles';\nimport { createPolymorphicComponent } from '@mantine/utils';\nimport { Box } from '../Box';\nimport useStyles from './UnstyledButton.styles';\n\nexport interface UnstyledButtonProps extends DefaultProps {\n children?: React.ReactNode;\n}\n\nexport const _UnstyledButton = forwardRef<\n HTMLDivElement,\n UnstyledButtonProps & { component?: any }\n>((props, ref) => {\n const {\n className,\n component = 'button',\n unstyled,\n ...others\n } = useComponentDefaultProps('UnstyledButton', {}, props);\n const { classes, cx } = useStyles(null, { name: 'UnstyledButton', unstyled });\n return (\n <Box\n component={component}\n ref={ref}\n className={cx(classes.root, className)}\n type={component === 'button' ? 'button' : undefined}\n {...others}\n />\n );\n});\n\n_UnstyledButton.displayName = '@mantine/core/UnstyledButton';\n\nexport const UnstyledButton = createPolymorphicComponent<'button', UnstyledButtonProps>(\n _UnstyledButton\n);\n","import React, { forwardRef } from 'react';\nimport {\n DefaultProps,\n MantineNumberSize,\n MantineColor,\n Selectors,\n useComponentDefaultProps,\n MantineGradient,\n} from '@mantine/styles';\nimport { createPolymorphicComponent } from '@mantine/utils';\nimport { UnstyledButton } from '../UnstyledButton';\nimport useStyles, { sizes, ActionIconVariant, ActionIconStylesParams } from './ActionIcon.styles';\nimport { Loader, LoaderProps } from '../Loader';\n\nexport type ActionIconStylesNames = Selectors<typeof useStyles>;\n\nexport interface ActionIconProps\n extends DefaultProps<ActionIconStylesNames, ActionIconStylesParams> {\n /** Icon */\n children?: React.ReactNode;\n\n /** Controls appearance */\n variant?: ActionIconVariant;\n\n /** Key of theme.colors */\n color?: MantineColor;\n\n /** Controls gradient settings in gradient variant only */\n gradient?: MantineGradient;\n\n /** Button border-radius from theme or number to set border-radius in px */\n radius?: MantineNumberSize;\n\n /** Predefined icon size or number to set width and height in px */\n size?: MantineNumberSize;\n\n /** Props spread to Loader component */\n loaderProps?: LoaderProps;\n\n /** Indicates loading state */\n loading?: boolean;\n\n /** Indicates disabled state */\n disabled?: boolean;\n}\n\nconst defaultProps: Partial<ActionIconProps> = {\n color: 'gray',\n size: 'md',\n variant: 'subtle',\n loading: false,\n};\n\nexport const _ActionIcon = forwardRef<HTMLButtonElement, ActionIconProps>((props, ref) => {\n const {\n className,\n color,\n children,\n radius,\n size,\n variant,\n gradient,\n disabled,\n loaderProps,\n loading,\n unstyled,\n ...others\n } = useComponentDefaultProps('ActionIcon', defaultProps, props);\n\n const { classes, cx, theme } = useStyles(\n { size, radius, color, variant, gradient },\n { name: 'ActionIcon', unstyled }\n );\n\n const colors = theme.fn.variant({ color, variant });\n\n const loader = (\n <Loader color={colors.color} size={theme.fn.size({ size, sizes }) - 12} {...loaderProps} />\n );\n\n return (\n <UnstyledButton\n className={cx(classes.root, className)}\n ref={ref}\n disabled={disabled}\n data-disabled={disabled || undefined}\n data-loading={loading || undefined}\n unstyled={unstyled}\n {...others}\n >\n {loading ? loader : children}\n </UnstyledButton>\n );\n});\n\n_ActionIcon.displayName = '@mantine/core/ActionIcon';\n\nexport const ActionIcon = createPolymorphicComponent<'button', ActionIconProps>(_ActionIcon);\n","import React from 'react';\n\nexport function CloseIcon(props: React.ComponentPropsWithoutRef<'svg'>) {\n return (\n <svg viewBox=\"0 0 15 15\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <path\n d=\"M11.7816 4.03157C12.0062 3.80702 12.0062 3.44295 11.7816 3.2184C11.5571 2.99385 11.193 2.99385 10.9685 3.2184L7.50005 6.68682L4.03164 3.2184C3.80708 2.99385 3.44301 2.99385 3.21846 3.2184C2.99391 3.44295 2.99391 3.80702 3.21846 4.03157L6.68688 7.49999L3.21846 10.9684C2.99391 11.193 2.99391 11.557 3.21846 11.7816C3.44301 12.0061 3.80708 12.0061 4.03164 11.7816L7.50005 8.31316L10.9685 11.7816C11.193 12.0061 11.5571 12.0061 11.7816 11.7816C12.0062 11.557 12.0062 11.193 11.7816 10.9684L8.31322 7.49999L11.7816 4.03157Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\nCloseIcon.displayName = '@mantine/core/CloseIcon';\n","import React, { forwardRef } from 'react';\nimport { useComponentDefaultProps, useMantineTheme } from '@mantine/styles';\nimport { createPolymorphicComponent } from '@mantine/utils';\nimport { ActionIcon, ActionIconProps } from '../ActionIcon/ActionIcon';\nimport { CloseIcon } from './CloseIcon';\n\nexport interface CloseButtonProps\n extends Omit<ActionIconProps, 'children'>,\n Omit<React.ComponentPropsWithoutRef<'button'>, 'color'> {\n /** Width and height of cross icon */\n iconSize?: number;\n}\n\nconst iconSizes = {\n xs: 12,\n sm: 14,\n md: 16,\n lg: 20,\n xl: 24,\n};\n\nconst defaultProps: Partial<CloseButtonProps> = {\n size: 'md',\n};\n\nexport const _CloseButton = forwardRef<HTMLButtonElement, CloseButtonProps>((props, ref) => {\n const {\n iconSize,\n size = 'md',\n ...others\n } = useComponentDefaultProps('CloseButton', defaultProps, props);\n const theme = useMantineTheme();\n const _iconSize = iconSize || theme.fn.size({ size, sizes: iconSizes });\n\n return (\n <ActionIcon size={size} ref={ref} {...others}>\n <CloseIcon width={_iconSize} height={_iconSize} />\n </ActionIcon>\n );\n});\n\n_CloseButton.displayName = '@mantine/core/CloseButton';\n\nexport const CloseButton = createPolymorphicComponent<'button', CloseButtonProps>(_CloseButton);\n","export function packSx<T>(sx: T | T[]) {\n return Array.isArray(sx) ? sx : [sx];\n}\n","import { createStyles } from '@mantine/styles';\n\nexport interface OverlayStylesParams {\n zIndex: React.CSSProperties['zIndex'];\n}\n\nexport default createStyles((theme, { zIndex }: OverlayStylesParams) => ({\n root: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n zIndex,\n },\n}));\n","import React, { forwardRef } from 'react';\nimport {\n MantineNumberSize,\n DefaultProps,\n getDefaultZIndex,\n useComponentDefaultProps,\n} from '@mantine/styles';\nimport { createPolymorphicComponent, packSx } from '@mantine/utils';\nimport { Box } from '../Box';\nimport useStyles, { OverlayStylesParams } from './Overlay.styles';\n\nexport interface OverlayProps extends DefaultProps<never, OverlayStylesParams> {\n /** Overlay opacity */\n opacity?: React.CSSProperties['opacity'];\n\n /** Overlay background-color */\n color?: React.CSSProperties['backgroundColor'];\n\n /** Overlay background blur in px */\n blur?: number;\n\n /** Use gradient instead of background-color */\n gradient?: string;\n\n /** Overlay z-index */\n zIndex?: React.CSSProperties['zIndex'];\n\n /** Value from theme.radius or number to set border-radius in px */\n radius?: MantineNumberSize;\n}\n\nconst defaultProps: Partial<OverlayProps> = {\n opacity: 0.6,\n color: '#fff',\n zIndex: getDefaultZIndex('modal'),\n radius: 0,\n blur: 0,\n};\n\nexport const _Overlay = forwardRef<HTMLDivElement, OverlayProps>((props, ref) => {\n const { opacity, blur, color, gradient, zIndex, radius, sx, unstyled, className, ...others } =\n useComponentDefaultProps('Overlay', defaultProps, props);\n const { classes, cx } = useStyles({ zIndex }, { name: 'Overlay', unstyled });\n const background = gradient ? { backgroundImage: gradient } : { backgroundColor: color };\n\n const innerOverlay = (otherProps?: Record<string, any>) => (\n <Box\n ref={ref}\n className={cx(classes.root, className)}\n sx={[\n (theme) => ({\n ...background,\n opacity,\n borderRadius: theme.fn.size({ size: radius, sizes: theme.radius }),\n }),\n ...packSx(sx),\n ]}\n {...otherProps}\n />\n );\n\n if (blur) {\n return (\n <Box\n className={cx(classes.root, className)}\n sx={[{ backdropFilter: `blur(${blur}px)` }, ...packSx(sx)]}\n {...others}\n >\n {innerOverlay()}\n </Box>\n );\n }\n\n return innerOverlay(others);\n});\n\n_Overlay.displayName = '@mantine/core/Overlay';\n\nexport const Overlay = createPolymorphicComponent<'div', OverlayProps>(_Overlay);\n","import React, { useEffect } from 'react';\nimport { useScrollLock, useFocusTrap, useFocusReturn, useId } from '@mantine/hooks';\nimport {\n DefaultProps,\n MantineNumberSize,\n MantineShadow,\n Selectors,\n getDefaultZIndex,\n useComponentDefaultProps,\n} from '@mantine/styles';\nimport { Paper } from '../Paper';\nimport { Overlay } from '../Overlay';\nimport { OptionalPortal } from '../Portal';\nimport { Text } from '../Text';\nimport { Box } from '../Box';\nimport { CloseButton } from '../CloseButton';\nimport { GroupedTransition, MantineTransition } from '../Transition';\nimport useStyles, { DrawerPosition } from './Drawer.styles';\n\nexport type DrawerStylesNames = Exclude<Selectors<typeof useStyles>, 'withOverlay'>;\n\nexport interface DrawerProps\n extends DefaultProps<DrawerStylesNames>,\n Omit<React.ComponentPropsWithoutRef<'div'>, 'title'> {\n /** If true drawer is mounted to the dom */\n opened: boolean;\n\n /** Called when drawer is closed (Escape key and click outside, depending on options) */\n onClose(): void;\n\n /** Drawer body position */\n position?: DrawerPosition;\n\n /** Drawer body width (right | left position) or height (top | bottom position), cannot exceed 100vh for height and 100% for width */\n size?: string | number;\n\n /** Drawer body shadow from theme or any css shadow value */\n shadow?: MantineShadow;\n\n /** Drawer body padding from theme or number for padding in px */\n padding?: MantineNumberSize;\n\n /** Drawer z-index property */\n zIndex?: React.CSSProperties['zIndex'];\n\n /** Disables focus trap */\n trapFocus?: boolean;\n\n /** Disables scroll lock */\n lockScroll?: boolean;\n\n /** Disable onMouseDown trigger for outside events */\n closeOnClickOutside?: boolean;\n\n /** Disable onKeyDownCapture trigger for escape key press */\n closeOnEscape?: boolean;\n\n /** Drawer appear and disappear transition, see Transition component for full documentation */\n transition?: MantineTransition;\n\n /** Transition duration in ms */\n transitionDuration?: number;\n\n /** Drawer transitionTimingFunction css property */\n transitionTimingFunction?: string;\n\n /** Removes overlay entirely */\n withOverlay?: boolean;\n\n /** Overlay opacity, number from 0 to 1 */\n overlayOpacity?: number;\n\n /** Overlay color, for example, #000 */\n overlayColor?: string;\n\n /** Overlay blur in px */\n overlayBlur?: number;\n\n /** Drawer title, displayed in header before close button */\n title?: React.ReactNode;\n\n /** Hides close button if set to false, drawer still can be closed with escape key and by clicking outside */\n withCloseButton?: boolean;\n\n /** Close button aria-label */\n closeButtonLabel?: string;\n\n /** id base, used to generate ids to connect drawer title and body with aria- attributes, defaults to random id */\n id?: string;\n\n /** Target element or selector where drawer portal should be rendered */\n target?: HTMLElement | string;\n\n /** Determines whether drawer should be rendered within Portal, defaults to true */\n withinPortal?: boolean;\n\n /** Determines whether focus should be returned to the last active element when drawer is closed */\n withFocusReturn?: boolean;\n}\n\nconst transitions: Record<DrawerPosition, MantineTransition> = {\n top: 'slide-down',\n bottom: 'slide-up',\n left: 'slide-right',\n right: 'slide-left',\n};\n\nconst rtlTransitions: Record<DrawerPosition, MantineTransition> = {\n top: 'slide-down',\n bottom: 'slide-up',\n right: 'slide-right',\n left: 'slide-left',\n};\n\nconst defaultProps: Partial<DrawerProps> = {\n position: 'left',\n size: 'md',\n transitionDuration: 250,\n transitionTimingFunction: 'ease',\n zIndex: getDefaultZIndex('modal'),\n shadow: 'md',\n padding: 0,\n lockScroll: true,\n closeOnClickOutside: true,\n closeOnEscape: true,\n trapFocus: true,\n withOverlay: true,\n withCloseButton: true,\n withinPortal: true,\n withFocusReturn: true,\n overlayBlur: 0,\n};\n\nexport function Drawer(props: DrawerProps) {\n const {\n className,\n opened,\n onClose,\n position,\n size,\n trapFocus,\n lockScroll,\n closeOnClickOutside,\n closeOnEscape,\n transition,\n transitionDuration,\n transitionTimingFunction,\n zIndex,\n overlayColor,\n overlayOpacity,\n children,\n withOverlay,\n shadow,\n id,\n padding,\n title,\n withCloseButton,\n closeButtonLabel,\n classNames,\n styles,\n target,\n withinPortal,\n overlayBlur,\n unstyled,\n withFocusReturn,\n ...others\n } = useComponentDefaultProps('Drawer', defaultProps, props);\n const baseId = useId(id);\n const titleId = `${baseId}-title`;\n const bodyId = `${baseId}-body`;\n\n const { classes, cx, theme } = useStyles(\n { size, position, zIndex, withOverlay },\n { classNames, styles, unstyled, name: 'Drawer' }\n );\n\n const focusTrapRef = useFocusTrap(trapFocus && opened);\n\n const [, _lockScroll] = useScrollLock();\n\n const drawerTransition =\n transition || (theme.dir === 'rtl' ? rtlTransitions : transitions)[position];\n const _overlayOpacity =\n typeof overlayOpacity === 'number'\n ? overlayOpacity\n : theme.colorScheme === 'dark'\n ? 0.85\n : 0.75;\n\n const _closeOnEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && closeOnEscape) {\n onClose();\n }\n };\n\n useEffect(() => {\n if (!trapFocus) {\n window.addEventListener('keydown', _closeOnEscape);\n return () => window.removeEventListener('keydown', _closeOnEscape);\n }\n\n return undefined;\n }, [trapFocus]);\n\n useFocusReturn({ opened, shouldReturnFocus: trapFocus && withFocusReturn });\n\n return (\n <OptionalPortal withinPortal={withinPortal} target={target}>\n <GroupedTransition\n onExited={() => _lockScroll(false)}\n onEntered={() => _lockScroll(lockScroll && true)}\n mounted={opened}\n duration={transitionDuration}\n timingFunction={transitionTimingFunction}\n transitions={{\n overlay: { duration: transitionDuration / 2, transition: 'fade', timingFunction: 'ease' },\n drawer: {\n duration: transitionDuration,\n transition: drawerTransition,\n timingFunction: transitionTimingFunction,\n },\n }}\n >\n {(transitionStyles) => (\n <Box\n className={cx(classes.root, className)}\n role=\"dialog\"\n aria-modal\n aria-labelledby={titleId}\n aria-describedby={bodyId}\n {...others}\n >\n <Paper<'div'>\n className={cx(classes.drawer, className)}\n ref={focusTrapRef}\n style={transitionStyles.drawer}\n radius={0}\n tabIndex={-1}\n onKeyDownCapture={(event) => {\n const shouldTrigger =\n (event.target as any)?.getAttribute('data-mantine-stop-propagation') !== 'true';\n\n shouldTrigger && event.key === 'Escape' && closeOnEscape && onClose();\n }}\n shadow={shadow}\n p={padding}\n unstyled={unstyled}\n >\n {(title || withCloseButton) && (\n <div className={classes.header}>\n <Text id={titleId} className={classes.title} unstyled={unstyled}>\n {title}\n </Text>\n\n {withCloseButton && (\n <CloseButton\n iconSize={16}\n onClick={onClose}\n aria-label={closeButtonLabel}\n className={classes.closeButton}\n unstyled={unstyled}\n />\n )}\n </div>\n )}\n\n <div id={bodyId} className={classes.body}>\n {children}\n </div>\n </Paper>\n\n {withOverlay && (\n <div style={transitionStyles.overlay}>\n <Overlay\n unstyled={unstyled}\n blur={overlayBlur}\n onMouseDown={() => closeOnClickOutside && onClose()}\n className={classes.overlay}\n opacity={_overlayOpacity}\n zIndex={0}\n color={\n overlayColor ||\n (theme.colorScheme === 'dark' ? theme.colors.dark[9] : theme.black)\n }\n />\n </div>\n )}\n </Box>\n )}\n </GroupedTransition>\n </OptionalPortal>\n );\n}\n\nDrawer.displayName = '@mantine/core/Drawer';\n","import React from 'react';\nimport { createStyles, MantineNumberSize } from '@mantine/styles';\n\nexport type GroupPosition = 'right' | 'center' | 'left' | 'apart';\n\nexport interface GroupStylesParams {\n position: GroupPosition;\n noWrap: boolean;\n grow: boolean;\n spacing: MantineNumberSize;\n align: React.CSSProperties['alignItems'];\n count: number;\n}\n\nexport const GROUP_POSITIONS = {\n left: 'flex-start',\n center: 'center',\n right: 'flex-end',\n apart: 'space-between',\n};\n\nexport default createStyles(\n (theme, { spacing, position, noWrap, grow, align, count }: GroupStylesParams) => ({\n root: {\n boxSizing: 'border-box',\n display: 'flex',\n flexDirection: 'row',\n alignItems: align || 'center',\n flexWrap: noWrap ? 'nowrap' : 'wrap',\n justifyContent: GROUP_POSITIONS[position],\n gap: theme.fn.size({ size: spacing, sizes: theme.spacing }),\n '& > *': {\n boxSizing: 'border-box',\n maxWidth: grow\n ? `calc(${100 / count}% - ${\n theme.fn.size({ size: spacing, sizes: theme.spacing }) -\n theme.fn.size({ size: spacing, sizes: theme.spacing }) / count\n }px)`\n : undefined,\n flexGrow: grow ? 1 : 0,\n },\n },\n })\n);\n","import React, { forwardRef } from 'react';\nimport { DefaultProps, MantineNumberSize, useComponentDefaultProps } from '@mantine/styles';\nimport { Box } from '../Box';\nimport { filterFalsyChildren } from './filter-falsy-children/filter-falsy-children';\nimport useStyles, { GroupPosition } from './Group.styles';\n\nexport interface GroupProps extends DefaultProps, React.ComponentPropsWithoutRef<'div'> {\n /** Defines justify-content property */\n position?: GroupPosition;\n\n /** Defined flex-wrap property */\n noWrap?: boolean;\n\n /** Defines flex-grow property for each element, true -> 1, false -> 0 */\n grow?: boolean;\n\n /** Space between elements */\n spacing?: MantineNumberSize;\n\n /** Defines align-items css property */\n align?: React.CSSProperties['alignItems'];\n}\n\nconst defaultProps: Partial<GroupProps> = {\n position: 'left',\n spacing: 'md',\n};\n\nexport const Group = forwardRef<HTMLDivElement, GroupProps>((props: GroupProps, ref) => {\n const { className, position, align, children, noWrap, grow, spacing, unstyled, ...others } =\n useComponentDefaultProps('Group', defaultProps, props);\n\n const filteredChildren = filterFalsyChildren(children);\n const { classes, cx } = useStyles(\n {\n align,\n grow,\n noWrap,\n spacing,\n position,\n count: filteredChildren.length,\n },\n { unstyled, name: 'Group' }\n );\n\n return (\n <Box className={cx(classes.root, className)} ref={ref} {...others}>\n {filteredChildren}\n </Box>\n );\n});\n\nGroup.displayName = '@mantine/core/Group';\n","import { Children, ReactElement, ReactNode } from 'react';\n\nexport function filterFalsyChildren(children: ReactNode) {\n return (Children.toArray(children) as ReactElement[]).filter(Boolean);\n}\n","import { createStyles } from '@mantine/styles';\n\nexport default createStyles(() => ({\n root: {\n backgroundColor: 'transparent',\n cursor: 'pointer',\n padding: 0,\n border: 0,\n },\n}));\n","import React, { forwardRef } from 'react';\nimport { useComponentDefaultProps } from '@mantine/styles';\nimport { createPolymorphicComponent } from '@mantine/utils';\nimport { Text, TextProps } from '../Text/Text';\nimport useStyles from './Anchor.styles';\n\nexport interface AnchorProps extends TextProps {\n children?: React.ReactNode;\n}\n\nconst defaultProps: Partial<AnchorProps> = {};\n\nexport const _Anchor = forwardRef<HTMLAnchorElement, AnchorProps & { component: any }>(\n (props, ref) => {\n const { component, className, unstyled, ...others } = useComponentDefaultProps(\n 'Anchor',\n defaultProps as AnchorProps & { component: any },\n props\n );\n const { classes, cx } = useStyles(null, { name: 'Anchor', unstyled });\n const buttonProps = component === 'button' ? { type: 'button' } : null;\n\n return (\n <Text\n component={component || 'a'}\n variant=\"link\"\n ref={ref}\n className={cx(classes.root, className)}\n {...buttonProps}\n {...others}\n />\n );\n }\n);\n\n_Anchor.displayName = '@mantine/core/Anchor';\n\nexport const Anchor = createPolymorphicComponent<'a', AnchorProps>(_Anchor);\n","import type {\n FormEncType,\n HTMLFormMethod,\n RelativeRoutingType,\n} from \"@remix-run/router\";\nimport { stripBasename, UNSAFE_warning as warning } from \"@remix-run/router\";\n\nexport const defaultMethod: HTMLFormMethod = \"get\";\nconst defaultEncType: FormEncType = \"application/x-www-form-urlencoded\";\n\nexport function isHtmlElement(object: any): object is HTMLElement {\n return object != null && typeof object.tagName === \"string\";\n}\n\nexport function isButtonElement(object: any): object is HTMLButtonElement {\n return isHtmlElement(object) && object.tagName.toLowerCase() === \"button\";\n}\n\nexport function isFormElement(object: any): object is HTMLFormElement {\n return isHtmlElement(object) && object.tagName.toLowerCase() === \"form\";\n}\n\nexport function isInputElement(object: any): object is HTMLInputElement {\n return isHtmlElement(object) && object.tagName.toLowerCase() === \"input\";\n}\n\ntype LimitedMouseEvent = Pick<\n MouseEvent,\n \"button\" | \"metaKey\" | \"altKey\" | \"ctrlKey\" | \"shiftKey\"\n>;\n\nfunction isModifiedEvent(event: LimitedMouseEvent) {\n return !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n}\n\nexport function shouldProcessLinkClick(\n event: LimitedMouseEvent,\n target?: string\n) {\n return (\n event.button === 0 && // Ignore everything but left clicks\n (!target || target === \"_self\") && // Let browser handle \"target=_blank\" etc.\n !isModifiedEvent(event) // Ignore clicks with modifier keys\n );\n}\n\nexport type ParamKeyValuePair = [string, string];\n\nexport type URLSearchParamsInit =\n | string\n | ParamKeyValuePair[]\n | Record<string, string | string[]>\n | URLSearchParams;\n\n/**\n * Creates a URLSearchParams object using the given initializer.\n *\n * This is identical to `new URLSearchParams(init)` except it also\n * supports arrays as values in the object form of the initializer\n * instead of just strings. This is convenient when you need multiple\n * values for a given key, but don't want to use an array initializer.\n *\n * For example, instead of:\n *\n * let searchParams = new URLSearchParams([\n * ['sort', 'name'],\n * ['sort', 'price']\n * ]);\n *\n * you can do:\n *\n * let searchParams = createSearchParams({\n * sort: ['name', 'price']\n * });\n */\nexport function createSearchParams(\n init: URLSearchParamsInit = \"\"\n): URLSearchParams {\n return new URLSearchParams(\n typeof init === \"string\" ||\n Array.isArray(init) ||\n init instanceof URLSearchParams\n ? init\n : Object.keys(init).reduce((memo, key) => {\n let value = init[key];\n return memo.concat(\n Array.isArray(value) ? value.map((v) => [key, v]) : [[key, value]]\n );\n }, [] as ParamKeyValuePair[])\n );\n}\n\nexport function getSearchParamsForLocation(\n locationSearch: string,\n defaultSearchParams: URLSearchParams | null\n) {\n let searchParams = createSearchParams(locationSearch);\n\n if (defaultSearchParams) {\n // Use `defaultSearchParams.forEach(...)` here instead of iterating of\n // `defaultSearchParams.keys()` to work-around a bug in Firefox related to\n // web extensions. Relevant Bugzilla tickets:\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1414602\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1023984\n defaultSearchParams.forEach((_, key) => {\n if (!searchParams.has(key)) {\n defaultSearchParams.getAll(key).forEach((value) => {\n searchParams.append(key, value);\n });\n }\n });\n }\n\n return searchParams;\n}\n\n// Thanks https://github.com/sindresorhus/type-fest!\ntype JsonObject = { [Key in string]: JsonValue } & {\n [Key in string]?: JsonValue | undefined;\n};\ntype JsonArray = JsonValue[] | readonly JsonValue[];\ntype JsonPrimitive = string | number | boolean | null;\ntype JsonValue = JsonPrimitive | JsonObject | JsonArray;\n\nexport type SubmitTarget =\n | HTMLFormElement\n | HTMLButtonElement\n | HTMLInputElement\n | FormData\n | URLSearchParams\n | JsonValue\n | null;\n\n// One-time check for submitter support\nlet _formDataSupportsSubmitter: boolean | null = null;\n\nfunction isFormDataSubmitterSupported() {\n if (_formDataSupportsSubmitter === null) {\n try {\n new FormData(\n document.createElement(\"form\"),\n // @ts-expect-error if FormData supports the submitter parameter, this will throw\n 0\n );\n _formDataSupportsSubmitter = false;\n } catch (e) {\n _formDataSupportsSubmitter = true;\n }\n }\n return _formDataSupportsSubmitter;\n}\n\n/**\n * Submit options shared by both navigations and fetchers\n */\ninterface SharedSubmitOptions {\n /**\n * The HTTP method used to submit the form. Overrides `<form method>`.\n * Defaults to \"GET\".\n */\n method?: HTMLFormMethod;\n\n /**\n * The action URL path used to submit the form. Overrides `<form action>`.\n * Defaults to the path of the current route.\n */\n action?: string;\n\n /**\n * The encoding used to submit the form. Overrides `<form encType>`.\n * Defaults to \"application/x-www-form-urlencoded\".\n */\n encType?: FormEncType;\n\n /**\n * Determines whether the form action is relative to the route hierarchy or\n * the pathname. Use this if you want to opt out of navigating the route\n * hierarchy and want to instead route based on /-delimited URL segments\n */\n relative?: RelativeRoutingType;\n\n /**\n * In browser-based environments, prevent resetting scroll after this\n * navigation when using the <ScrollRestoration> component\n */\n preventScrollReset?: boolean;\n\n /**\n * Enable flushSync for this submission's state updates\n */\n flushSync?: boolean;\n}\n\n/**\n * Submit options available to fetchers\n */\nexport interface FetcherSubmitOptions extends SharedSubmitOptions {}\n\n/**\n * Submit options available to navigations\n */\nexport interface SubmitOptions extends FetcherSubmitOptions {\n /**\n * Set `true` to replace the current entry in the browser's history stack\n * instead of creating a new one (i.e. stay on \"the same page\"). Defaults\n * to `false`.\n */\n replace?: boolean;\n\n /**\n * State object to add to the history stack entry for this navigation\n */\n state?: any;\n\n /**\n * Indicate a specific fetcherKey to use when using navigate=false\n */\n fetcherKey?: string;\n\n /**\n * navigate=false will use a fetcher instead of a navigation\n */\n navigate?: boolean;\n\n /**\n * Enable view transitions on this submission navigation\n */\n viewTransition?: boolean;\n}\n\nconst supportedFormEncTypes: Set<FormEncType> = new Set([\n \"application/x-www-form-urlencoded\",\n \"multipart/form-data\",\n \"text/plain\",\n]);\n\nfunction getFormEncType(encType: string | null) {\n if (encType != null && !supportedFormEncTypes.has(encType as FormEncType)) {\n warning(\n false,\n `\"${encType}\" is not a valid \\`encType\\` for \\`<Form>\\`/\\`<fetcher.Form>\\` ` +\n `and will default to \"${defaultEncType}\"`\n );\n\n return null;\n }\n return encType;\n}\n\nexport function getFormSubmissionInfo(\n target: SubmitTarget,\n basename: string\n): {\n action: string | null;\n method: string;\n encType: string;\n formData: FormData | undefined;\n body: any;\n} {\n let method: string;\n let action: string | null;\n let encType: string;\n let formData: FormData | undefined;\n let body: any;\n\n if (isFormElement(target)) {\n // When grabbing the action from the element, it will have had the basename\n // prefixed to ensure non-JS scenarios work, so strip it since we'll\n // re-prefix in the router\n let attr = target.getAttribute(\"action\");\n action = attr ? stripBasename(attr, basename) : null;\n method = target.getAttribute(\"method\") || defaultMethod;\n encType = getFormEncType(target.getAttribute(\"enctype\")) || defaultEncType;\n\n formData = new FormData(target);\n } else if (\n isButtonElement(target) ||\n (isInputElement(target) &&\n (target.type === \"submit\" || target.type === \"image\"))\n ) {\n let form = target.form;\n\n if (form == null) {\n throw new Error(\n `Cannot submit a <button> or <input type=\"submit\"> without a <form>`\n );\n }\n\n // <button>/<input type=\"submit\"> may override attributes of <form>\n\n // When grabbing the action from the element, it will have had the basename\n // prefixed to ensure non-JS scenarios work, so strip it since we'll\n // re-prefix in the router\n let attr = target.getAttribute(\"formaction\") || form.getAttribute(\"action\");\n action = attr ? stripBasename(attr, basename) : null;\n\n method =\n target.getAttribute(\"formmethod\") ||\n form.getAttribute(\"method\") ||\n defaultMethod;\n encType =\n getFormEncType(target.getAttribute(\"formenctype\")) ||\n getFormEncType(form.getAttribute(\"enctype\")) ||\n defaultEncType;\n\n // Build a FormData object populated from a form and submitter\n formData = new FormData(form, target);\n\n // If this browser doesn't support the `FormData(el, submitter)` format,\n // then tack on the submitter value at the end. This is a lightweight\n // solution that is not 100% spec compliant. For complete support in older\n // browsers, consider using the `formdata-submitter-polyfill` package\n if (!isFormDataSubmitterSupported()) {\n let { name, type, value } = target;\n if (type === \"image\") {\n let prefix = name ? `${name}.` : \"\";\n formData.append(`${prefix}x`, \"0\");\n formData.append(`${prefix}y`, \"0\");\n } else if (name) {\n formData.append(name, value);\n }\n }\n } else if (isHtmlElement(target)) {\n throw new Error(\n `Cannot submit element that is not <form>, <button>, or ` +\n `<input type=\"submit|image\">`\n );\n } else {\n method = defaultMethod;\n action = null;\n encType = defaultEncType;\n body = target;\n }\n\n // Send body for <Form encType=\"text/plain\" so we encode it into text\n if (formData && encType === \"text/plain\") {\n body = formData;\n formData = undefined;\n }\n\n return { action, method: method.toLowerCase(), encType, formData, body };\n}\n","/**\n * NOTE: If you refactor this to split up the modules into separate files,\n * you'll need to update the rollup config for react-router-dom-v5-compat.\n */\nimport * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport type {\n DataRouteObject,\n FutureConfig,\n Location,\n NavigateOptions,\n NavigationType,\n Navigator,\n RelativeRoutingType,\n RouteObject,\n RouterProps,\n RouterProviderProps,\n To,\n DataStrategyFunction,\n PatchRoutesOnNavigationFunction,\n} from \"react-router\";\nimport {\n Router,\n createPath,\n useHref,\n useLocation,\n useMatches,\n useNavigate,\n useNavigation,\n useResolvedPath,\n useBlocker,\n UNSAFE_DataRouterContext as DataRouterContext,\n UNSAFE_DataRouterStateContext as DataRouterStateContext,\n UNSAFE_NavigationContext as NavigationContext,\n UNSAFE_RouteContext as RouteContext,\n UNSAFE_logV6DeprecationWarnings as logV6DeprecationWarnings,\n UNSAFE_mapRouteProperties as mapRouteProperties,\n UNSAFE_useRouteId as useRouteId,\n UNSAFE_useRoutesImpl as useRoutesImpl,\n} from \"react-router\";\nimport type {\n BrowserHistory,\n Fetcher,\n FormEncType,\n FormMethod,\n FutureConfig as RouterFutureConfig,\n GetScrollRestorationKeyFunction,\n HashHistory,\n History,\n HTMLFormMethod,\n HydrationState,\n Router as RemixRouter,\n V7_FormMethod,\n RouterState,\n RouterSubscriber,\n BlockerFunction,\n} from \"@remix-run/router\";\nimport {\n createRouter,\n createBrowserHistory,\n createHashHistory,\n joinPaths,\n stripBasename,\n UNSAFE_ErrorResponseImpl as ErrorResponseImpl,\n UNSAFE_invariant as invariant,\n UNSAFE_warning as warning,\n matchPath,\n IDLE_FETCHER,\n} from \"@remix-run/router\";\n\nimport type {\n SubmitOptions,\n ParamKeyValuePair,\n URLSearchParamsInit,\n SubmitTarget,\n FetcherSubmitOptions,\n} from \"./dom\";\nimport {\n createSearchParams,\n defaultMethod,\n getFormSubmissionInfo,\n getSearchParamsForLocation,\n shouldProcessLinkClick,\n} from \"./dom\";\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Re-exports\n////////////////////////////////////////////////////////////////////////////////\n\nexport type {\n FormEncType,\n FormMethod,\n GetScrollRestorationKeyFunction,\n ParamKeyValuePair,\n SubmitOptions,\n URLSearchParamsInit,\n V7_FormMethod,\n};\nexport { createSearchParams, ErrorResponseImpl as UNSAFE_ErrorResponseImpl };\n\n// Note: Keep in sync with react-router exports!\nexport type {\n ActionFunction,\n ActionFunctionArgs,\n AwaitProps,\n Blocker,\n BlockerFunction,\n DataRouteMatch,\n DataRouteObject,\n DataStrategyFunction,\n DataStrategyFunctionArgs,\n DataStrategyMatch,\n DataStrategyResult,\n ErrorResponse,\n Fetcher,\n FutureConfig,\n Hash,\n IndexRouteObject,\n IndexRouteProps,\n JsonFunction,\n LazyRouteFunction,\n LayoutRouteProps,\n LoaderFunction,\n LoaderFunctionArgs,\n Location,\n MemoryRouterProps,\n NavigateFunction,\n NavigateOptions,\n NavigateProps,\n Navigation,\n Navigator,\n NonIndexRouteObject,\n OutletProps,\n Params,\n ParamParseKey,\n PatchRoutesOnNavigationFunction,\n PatchRoutesOnNavigationFunctionArgs,\n Path,\n PathMatch,\n Pathname,\n PathParam,\n PathPattern,\n PathRouteProps,\n RedirectFunction,\n RelativeRoutingType,\n RouteMatch,\n RouteObject,\n RouteProps,\n RouterProps,\n RouterProviderProps,\n RoutesProps,\n Search,\n ShouldRevalidateFunction,\n ShouldRevalidateFunctionArgs,\n To,\n UIMatch,\n} from \"react-router\";\nexport {\n AbortedDeferredError,\n Await,\n MemoryRouter,\n Navigate,\n NavigationType,\n Outlet,\n Route,\n Router,\n Routes,\n createMemoryRouter,\n createPath,\n createRoutesFromChildren,\n createRoutesFromElements,\n defer,\n isRouteErrorResponse,\n generatePath,\n json,\n matchPath,\n matchRoutes,\n parsePath,\n redirect,\n redirectDocument,\n replace,\n renderMatches,\n resolvePath,\n useActionData,\n useAsyncError,\n useAsyncValue,\n useBlocker,\n useHref,\n useInRouterContext,\n useLoaderData,\n useLocation,\n useMatch,\n useMatches,\n useNavigate,\n useNavigation,\n useNavigationType,\n useOutlet,\n useOutletContext,\n useParams,\n useResolvedPath,\n useRevalidator,\n useRouteError,\n useRouteLoaderData,\n useRoutes,\n} from \"react-router\";\n\n///////////////////////////////////////////////////////////////////////////////\n// DANGER! PLEASE READ ME!\n// We provide these exports as an escape hatch in the event that you need any\n// routing data that we don't provide an explicit API for. With that said, we\n// want to cover your use case if we can, so if you feel the need to use these\n// we want to hear from you. Let us know what you're building and we'll do our\n// best to make sure we can support you!\n//\n// We consider these exports an implementation detail and do not guarantee\n// against any breaking changes, regardless of the semver release. Use with\n// extreme caution and only if you understand the consequences. Godspeed.\n///////////////////////////////////////////////////////////////////////////////\n\n/** @internal */\nexport {\n UNSAFE_DataRouterContext,\n UNSAFE_DataRouterStateContext,\n UNSAFE_NavigationContext,\n UNSAFE_LocationContext,\n UNSAFE_RouteContext,\n UNSAFE_useRouteId,\n} from \"react-router\";\n//#endregion\n\ndeclare global {\n var __staticRouterHydrationData: HydrationState | undefined;\n var __reactRouterVersion: string;\n interface Document {\n startViewTransition(cb: () => Promise<void> | void): ViewTransition;\n }\n}\n\n// HEY YOU! DON'T TOUCH THIS VARIABLE!\n//\n// It is replaced with the proper version at build time via a babel plugin in\n// the rollup config.\n//\n// Export a global property onto the window for React Router detection by the\n// Core Web Vitals Technology Report. This way they can configure the `wappalyzer`\n// to detect and properly classify live websites as being built with React Router:\n// https://github.com/HTTPArchive/wappalyzer/blob/main/src/technologies/r.json\nconst REACT_ROUTER_VERSION = \"0\";\ntry {\n window.__reactRouterVersion = REACT_ROUTER_VERSION;\n} catch (e) {\n // no-op\n}\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Routers\n////////////////////////////////////////////////////////////////////////////////\n\ninterface DOMRouterOpts {\n basename?: string;\n future?: Partial<Omit<RouterFutureConfig, \"v7_prependBasename\">>;\n hydrationData?: HydrationState;\n dataStrategy?: DataStrategyFunction;\n patchRoutesOnNavigation?: PatchRoutesOnNavigationFunction;\n window?: Window;\n}\n\nexport function createBrowserRouter(\n routes: RouteObject[],\n opts?: DOMRouterOpts\n): RemixRouter {\n return createRouter({\n basename: opts?.basename,\n future: {\n ...opts?.future,\n v7_prependBasename: true,\n },\n history: createBrowserHistory({ window: opts?.window }),\n hydrationData: opts?.hydrationData || parseHydrationData(),\n routes,\n mapRouteProperties,\n dataStrategy: opts?.dataStrategy,\n patchRoutesOnNavigation: opts?.patchRoutesOnNavigation,\n window: opts?.window,\n }).initialize();\n}\n\nexport function createHashRouter(\n routes: RouteObject[],\n opts?: DOMRouterOpts\n): RemixRouter {\n return createRouter({\n basename: opts?.basename,\n future: {\n ...opts?.future,\n v7_prependBasename: true,\n },\n history: createHashHistory({ window: opts?.window }),\n hydrationData: opts?.hydrationData || parseHydrationData(),\n routes,\n mapRouteProperties,\n dataStrategy: opts?.dataStrategy,\n patchRoutesOnNavigation: opts?.patchRoutesOnNavigation,\n window: opts?.window,\n }).initialize();\n}\n\nfunction parseHydrationData(): HydrationState | undefined {\n let state = window?.__staticRouterHydrationData;\n if (state && state.errors) {\n state = {\n ...state,\n errors: deserializeErrors(state.errors),\n };\n }\n return state;\n}\n\nfunction deserializeErrors(\n errors: RemixRouter[\"state\"][\"errors\"]\n): RemixRouter[\"state\"][\"errors\"] {\n if (!errors) return null;\n let entries = Object.entries(errors);\n let serialized: RemixRouter[\"state\"][\"errors\"] = {};\n for (let [key, val] of entries) {\n // Hey you! If you change this, please change the corresponding logic in\n // serializeErrors in react-router-dom/server.tsx :)\n if (val && val.__type === \"RouteErrorResponse\") {\n serialized[key] = new ErrorResponseImpl(\n val.status,\n val.statusText,\n val.data,\n val.internal === true\n );\n } else if (val && val.__type === \"Error\") {\n // Attempt to reconstruct the right type of Error (i.e., ReferenceError)\n if (val.__subType) {\n let ErrorConstructor = window[val.__subType];\n if (typeof ErrorConstructor === \"function\") {\n try {\n // @ts-expect-error\n let error = new ErrorConstructor(val.message);\n // Wipe away the client-side stack trace. Nothing to fill it in with\n // because we don't serialize SSR stack traces for security reasons\n error.stack = \"\";\n serialized[key] = error;\n } catch (e) {\n // no-op - fall through and create a normal Error\n }\n }\n }\n\n if (serialized[key] == null) {\n let error = new Error(val.message);\n // Wipe away the client-side stack trace. Nothing to fill it in with\n // because we don't serialize SSR stack traces for security reasons\n error.stack = \"\";\n serialized[key] = error;\n }\n } else {\n serialized[key] = val;\n }\n }\n return serialized;\n}\n\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Contexts\n////////////////////////////////////////////////////////////////////////////////\n\ntype ViewTransitionContextObject =\n | {\n isTransitioning: false;\n }\n | {\n isTransitioning: true;\n flushSync: boolean;\n currentLocation: Location;\n nextLocation: Location;\n };\n\nconst ViewTransitionContext = React.createContext<ViewTransitionContextObject>({\n isTransitioning: false,\n});\nif (__DEV__) {\n ViewTransitionContext.displayName = \"ViewTransition\";\n}\n\nexport { ViewTransitionContext as UNSAFE_ViewTransitionContext };\n\n// TODO: (v7) Change the useFetcher data from `any` to `unknown`\ntype FetchersContextObject = Map<string, any>;\n\nconst FetchersContext = React.createContext<FetchersContextObject>(new Map());\nif (__DEV__) {\n FetchersContext.displayName = \"Fetchers\";\n}\n\nexport { FetchersContext as UNSAFE_FetchersContext };\n\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Components\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n Webpack + React 17 fails to compile on any of the following because webpack\n complains that `startTransition` doesn't exist in `React`:\n * import { startTransition } from \"react\"\n * import * as React from from \"react\";\n \"startTransition\" in React ? React.startTransition(() => setState()) : setState()\n * import * as React from from \"react\";\n \"startTransition\" in React ? React[\"startTransition\"](() => setState()) : setState()\n\n Moving it to a constant such as the following solves the Webpack/React 17 issue:\n * import * as React from from \"react\";\n const START_TRANSITION = \"startTransition\";\n START_TRANSITION in React ? React[START_TRANSITION](() => setState()) : setState()\n\n However, that introduces webpack/terser minification issues in production builds\n in React 18 where minification/obfuscation ends up removing the call of\n React.startTransition entirely from the first half of the ternary. Grabbing\n this exported reference once up front resolves that issue.\n\n See https://github.com/remix-run/react-router/issues/10579\n*/\nconst START_TRANSITION = \"startTransition\";\nconst startTransitionImpl = React[START_TRANSITION];\nconst FLUSH_SYNC = \"flushSync\";\nconst flushSyncImpl = ReactDOM[FLUSH_SYNC];\nconst USE_ID = \"useId\";\nconst useIdImpl = React[USE_ID];\n\nfunction startTransitionSafe(cb: () => void) {\n if (startTransitionImpl) {\n startTransitionImpl(cb);\n } else {\n cb();\n }\n}\n\nfunction flushSyncSafe(cb: () => void) {\n if (flushSyncImpl) {\n flushSyncImpl(cb);\n } else {\n cb();\n }\n}\n\ninterface ViewTransition {\n finished: Promise<void>;\n ready: Promise<void>;\n updateCallbackDone: Promise<void>;\n skipTransition(): void;\n}\n\nclass Deferred<T> {\n status: \"pending\" | \"resolved\" | \"rejected\" = \"pending\";\n promise: Promise<T>;\n // @ts-expect-error - no initializer\n resolve: (value: T) => void;\n // @ts-expect-error - no initializer\n reject: (reason?: unknown) => void;\n constructor() {\n this.promise = new Promise((resolve, reject) => {\n this.resolve = (value) => {\n if (this.status === \"pending\") {\n this.status = \"resolved\";\n resolve(value);\n }\n };\n this.reject = (reason) => {\n if (this.status === \"pending\") {\n this.status = \"rejected\";\n reject(reason);\n }\n };\n });\n }\n}\n\n/**\n * Given a Remix Router instance, render the appropriate UI\n */\nexport function RouterProvider({\n fallbackElement,\n router,\n future,\n}: RouterProviderProps): React.ReactElement {\n let [state, setStateImpl] = React.useState(router.state);\n let [pendingState, setPendingState] = React.useState<RouterState>();\n let [vtContext, setVtContext] = React.useState<ViewTransitionContextObject>({\n isTransitioning: false,\n });\n let [renderDfd, setRenderDfd] = React.useState<Deferred<void>>();\n let [transition, setTransition] = React.useState<ViewTransition>();\n let [interruption, setInterruption] = React.useState<{\n state: RouterState;\n currentLocation: Location;\n nextLocation: Location;\n }>();\n let fetcherData = React.useRef<Map<string, any>>(new Map());\n let { v7_startTransition } = future || {};\n\n let optInStartTransition = React.useCallback(\n (cb: () => void) => {\n if (v7_startTransition) {\n startTransitionSafe(cb);\n } else {\n cb();\n }\n },\n [v7_startTransition]\n );\n\n let setState = React.useCallback<RouterSubscriber>(\n (\n newState: RouterState,\n {\n deletedFetchers,\n flushSync: flushSync,\n viewTransitionOpts: viewTransitionOpts,\n }\n ) => {\n newState.fetchers.forEach((fetcher, key) => {\n if (fetcher.data !== undefined) {\n fetcherData.current.set(key, fetcher.data);\n }\n });\n deletedFetchers.forEach((key) => fetcherData.current.delete(key));\n\n let isViewTransitionUnavailable =\n router.window == null ||\n router.window.document == null ||\n typeof router.window.document.startViewTransition !== \"function\";\n\n // If this isn't a view transition or it's not available in this browser,\n // just update and be done with it\n if (!viewTransitionOpts || isViewTransitionUnavailable) {\n if (flushSync) {\n flushSyncSafe(() => setStateImpl(newState));\n } else {\n optInStartTransition(() => setStateImpl(newState));\n }\n return;\n }\n\n // flushSync + startViewTransition\n if (flushSync) {\n // Flush through the context to mark DOM elements as transition=ing\n flushSyncSafe(() => {\n // Cancel any pending transitions\n if (transition) {\n renderDfd && renderDfd.resolve();\n transition.skipTransition();\n }\n setVtContext({\n isTransitioning: true,\n flushSync: true,\n currentLocation: viewTransitionOpts.currentLocation,\n nextLocation: viewTransitionOpts.nextLocation,\n });\n });\n\n // Update the DOM\n let t = router.window!.document.startViewTransition(() => {\n flushSyncSafe(() => setStateImpl(newState));\n });\n\n // Clean up after the animation completes\n t.finished.finally(() => {\n flushSyncSafe(() => {\n setRenderDfd(undefined);\n setTransition(undefined);\n setPendingState(undefined);\n setVtContext({ isTransitioning: false });\n });\n });\n\n flushSyncSafe(() => setTransition(t));\n return;\n }\n\n // startTransition + startViewTransition\n if (transition) {\n // Interrupting an in-progress transition, cancel and let everything flush\n // out, and then kick off a new transition from the interruption state\n renderDfd && renderDfd.resolve();\n transition.skipTransition();\n setInterruption({\n state: newState,\n currentLocation: viewTransitionOpts.currentLocation,\n nextLocation: viewTransitionOpts.nextLocation,\n });\n } else {\n // Completed navigation update with opted-in view transitions, let 'er rip\n setPendingState(newState);\n setVtContext({\n isTransitioning: true,\n flushSync: false,\n currentLocation: viewTransitionOpts.currentLocation,\n nextLocation: viewTransitionOpts.nextLocation,\n });\n }\n },\n [router.window, transition, renderDfd, fetcherData, optInStartTransition]\n );\n\n // Need to use a layout effect here so we are subscribed early enough to\n // pick up on any render-driven redirects/navigations (useEffect/<Navigate>)\n React.useLayoutEffect(() => router.subscribe(setState), [router, setState]);\n\n // When we start a view transition, create a Deferred we can use for the\n // eventual \"completed\" render\n React.useEffect(() => {\n if (vtContext.isTransitioning && !vtContext.flushSync) {\n setRenderDfd(new Deferred<void>());\n }\n }, [vtContext]);\n\n // Once the deferred is created, kick off startViewTransition() to update the\n // DOM and then wait on the Deferred to resolve (indicating the DOM update has\n // happened)\n React.useEffect(() => {\n if (renderDfd && pendingState && router.window) {\n let newState = pendingState;\n let renderPromise = renderDfd.promise;\n let transition = router.window.document.startViewTransition(async () => {\n optInStartTransition(() => setStateImpl(newState));\n await renderPromise;\n });\n transition.finished.finally(() => {\n setRenderDfd(undefined);\n setTransition(undefined);\n setPendingState(undefined);\n setVtContext({ isTransitioning: false });\n });\n setTransition(transition);\n }\n }, [optInStartTransition, pendingState, renderDfd, router.window]);\n\n // When the new location finally renders and is committed to the DOM, this\n // effect will run to resolve the transition\n React.useEffect(() => {\n if (\n renderDfd &&\n pendingState &&\n state.location.key === pendingState.location.key\n ) {\n renderDfd.resolve();\n }\n }, [renderDfd, transition, state.location, pendingState]);\n\n // If we get interrupted with a new navigation during a transition, we skip\n // the active transition, let it cleanup, then kick it off again here\n React.useEffect(() => {\n if (!vtContext.isTransitioning && interruption) {\n setPendingState(interruption.state);\n setVtContext({\n isTransitioning: true,\n flushSync: false,\n currentLocation: interruption.currentLocation,\n nextLocation: interruption.nextLocation,\n });\n setInterruption(undefined);\n }\n }, [vtContext.isTransitioning, interruption]);\n\n React.useEffect(() => {\n warning(\n fallbackElement == null || !router.future.v7_partialHydration,\n \"`<RouterProvider fallbackElement>` is deprecated when using \" +\n \"`v7_partialHydration`, use a `HydrateFallback` component instead\"\n );\n // Only log this once on initial mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n let navigator = React.useMemo((): Navigator => {\n return {\n createHref: router.createHref,\n encodeLocation: router.encodeLocation,\n go: (n) => router.navigate(n),\n push: (to, state, opts) =>\n router.navigate(to, {\n state,\n preventScrollReset: opts?.preventScrollReset,\n }),\n replace: (to, state, opts) =>\n router.navigate(to, {\n replace: true,\n state,\n preventScrollReset: opts?.preventScrollReset,\n }),\n };\n }, [router]);\n\n let basename = router.basename || \"/\";\n\n let dataRouterContext = React.useMemo(\n () => ({\n router,\n navigator,\n static: false,\n basename,\n }),\n [router, navigator, basename]\n );\n\n let routerFuture = React.useMemo<RouterProps[\"future\"]>(\n () => ({\n v7_relativeSplatPath: router.future.v7_relativeSplatPath,\n }),\n [router.future.v7_relativeSplatPath]\n );\n\n React.useEffect(\n () => logV6DeprecationWarnings(future, router.future),\n [future, router.future]\n );\n\n // The fragment and {null} here are important! We need them to keep React 18's\n // useId happy when we are server-rendering since we may have a <script> here\n // containing the hydrated server-side staticContext (from StaticRouterProvider).\n // useId relies on the component tree structure to generate deterministic id's\n // so we need to ensure it remains the same on the client even though\n // we don't need the <script> tag\n return (\n <>\n <DataRouterContext.Provider value={dataRouterContext}>\n <DataRouterStateContext.Provider value={state}>\n <FetchersContext.Provider value={fetcherData.current}>\n <ViewTransitionContext.Provider value={vtContext}>\n <Router\n basename={basename}\n location={state.location}\n navigationType={state.historyAction}\n navigator={navigator}\n future={routerFuture}\n >\n {state.initialized || router.future.v7_partialHydration ? (\n <MemoizedDataRoutes\n routes={router.routes}\n future={router.future}\n state={state}\n />\n ) : (\n fallbackElement\n )}\n </Router>\n </ViewTransitionContext.Provider>\n </FetchersContext.Provider>\n </DataRouterStateContext.Provider>\n </DataRouterContext.Provider>\n {null}\n </>\n );\n}\n\n// Memoize to avoid re-renders when updating `ViewTransitionContext`\nconst MemoizedDataRoutes = React.memo(DataRoutes);\n\nfunction DataRoutes({\n routes,\n future,\n state,\n}: {\n routes: DataRouteObject[];\n future: RemixRouter[\"future\"];\n state: RouterState;\n}): React.ReactElement | null {\n return useRoutesImpl(routes, undefined, state, future);\n}\n\nexport interface BrowserRouterProps {\n basename?: string;\n children?: React.ReactNode;\n future?: Partial<FutureConfig>;\n window?: Window;\n}\n\n/**\n * A `<Router>` for use in web browsers. Provides the cleanest URLs.\n */\nexport function BrowserRouter({\n basename,\n children,\n future,\n window,\n}: BrowserRouterProps) {\n let historyRef = React.useRef<BrowserHistory>();\n if (historyRef.current == null) {\n historyRef.current = createBrowserHistory({ window, v5Compat: true });\n }\n\n let history = historyRef.current;\n let [state, setStateImpl] = React.useState({\n action: history.action,\n location: history.location,\n });\n let { v7_startTransition } = future || {};\n let setState = React.useCallback(\n (newState: { action: NavigationType; location: Location }) => {\n v7_startTransition && startTransitionImpl\n ? startTransitionImpl(() => setStateImpl(newState))\n : setStateImpl(newState);\n },\n [setStateImpl, v7_startTransition]\n );\n\n React.useLayoutEffect(() => history.listen(setState), [history, setState]);\n\n React.useEffect(() => logV6DeprecationWarnings(future), [future]);\n\n return (\n <Router\n basename={basename}\n children={children}\n location={state.location}\n navigationType={state.action}\n navigator={history}\n future={future}\n />\n );\n}\n\nexport interface HashRouterProps {\n basename?: string;\n children?: React.ReactNode;\n future?: Partial<FutureConfig>;\n window?: Window;\n}\n\n/**\n * A `<Router>` for use in web browsers. Stores the location in the hash\n * portion of the URL so it is not sent to the server.\n */\nexport function HashRouter({\n basename,\n children,\n future,\n window,\n}: HashRouterProps) {\n let historyRef = React.useRef<HashHistory>();\n if (historyRef.current == null) {\n historyRef.current = createHashHistory({ window, v5Compat: true });\n }\n\n let history = historyRef.current;\n let [state, setStateImpl] = React.useState({\n action: history.action,\n location: history.location,\n });\n let { v7_startTransition } = future || {};\n let setState = React.useCallback(\n (newState: { action: NavigationType; location: Location }) => {\n v7_startTransition && startTransitionImpl\n ? startTransitionImpl(() => setStateImpl(newState))\n : setStateImpl(newState);\n },\n [setStateImpl, v7_startTransition]\n );\n\n React.useLayoutEffect(() => history.listen(setState), [history, setState]);\n\n React.useEffect(() => logV6DeprecationWarnings(future), [future]);\n\n return (\n <Router\n basename={basename}\n children={children}\n location={state.location}\n navigationType={state.action}\n navigator={history}\n future={future}\n />\n );\n}\n\nexport interface HistoryRouterProps {\n basename?: string;\n children?: React.ReactNode;\n future?: FutureConfig;\n history: History;\n}\n\n/**\n * A `<Router>` that accepts a pre-instantiated history object. It's important\n * to note that using your own history object is highly discouraged and may add\n * two versions of the history library to your bundles unless you use the same\n * version of the history library that React Router uses internally.\n */\nfunction HistoryRouter({\n basename,\n children,\n future,\n history,\n}: HistoryRouterProps) {\n let [state, setStateImpl] = React.useState({\n action: history.action,\n location: history.location,\n });\n let { v7_startTransition } = future || {};\n let setState = React.useCallback(\n (newState: { action: NavigationType; location: Location }) => {\n v7_startTransition && startTransitionImpl\n ? startTransitionImpl(() => setStateImpl(newState))\n : setStateImpl(newState);\n },\n [setStateImpl, v7_startTransition]\n );\n\n React.useLayoutEffect(() => history.listen(setState), [history, setState]);\n\n React.useEffect(() => logV6DeprecationWarnings(future), [future]);\n\n return (\n <Router\n basename={basename}\n children={children}\n location={state.location}\n navigationType={state.action}\n navigator={history}\n future={future}\n />\n );\n}\n\nif (__DEV__) {\n HistoryRouter.displayName = \"unstable_HistoryRouter\";\n}\n\nexport { HistoryRouter as unstable_HistoryRouter };\n\nexport interface LinkProps\n extends Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, \"href\"> {\n reloadDocument?: boolean;\n replace?: boolean;\n state?: any;\n preventScrollReset?: boolean;\n relative?: RelativeRoutingType;\n to: To;\n viewTransition?: boolean;\n}\n\nconst isBrowser =\n typeof window !== \"undefined\" &&\n typeof window.document !== \"undefined\" &&\n typeof window.document.createElement !== \"undefined\";\n\nconst ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i;\n\n/**\n * The public API for rendering a history-aware `<a>`.\n */\nexport const Link = React.forwardRef<HTMLAnchorElement, LinkProps>(\n function LinkWithRef(\n {\n onClick,\n relative,\n reloadDocument,\n replace,\n state,\n target,\n to,\n preventScrollReset,\n viewTransition,\n ...rest\n },\n ref\n ) {\n let { basename } = React.useContext(NavigationContext);\n\n // Rendered into <a href> for absolute URLs\n let absoluteHref;\n let isExternal = false;\n\n if (typeof to === \"string\" && ABSOLUTE_URL_REGEX.test(to)) {\n // Render the absolute href server- and client-side\n absoluteHref = to;\n\n // Only check for external origins client-side\n if (isBrowser) {\n try {\n let currentUrl = new URL(window.location.href);\n let targetUrl = to.startsWith(\"//\")\n ? new URL(currentUrl.protocol + to)\n : new URL(to);\n let path = stripBasename(targetUrl.pathname, basename);\n\n if (targetUrl.origin === currentUrl.origin && path != null) {\n // Strip the protocol/origin/basename for same-origin absolute URLs\n to = path + targetUrl.search + targetUrl.hash;\n } else {\n isExternal = true;\n }\n } catch (e) {\n // We can't do external URL detection without a valid URL\n warning(\n false,\n `<Link to=\"${to}\"> contains an invalid URL which will probably break ` +\n `when clicked - please update to a valid URL path.`\n );\n }\n }\n }\n\n // Rendered into <a href> for relative URLs\n let href = useHref(to, { relative });\n\n let internalOnClick = useLinkClickHandler(to, {\n replace,\n state,\n target,\n preventScrollReset,\n relative,\n viewTransition,\n });\n function handleClick(\n event: React.MouseEvent<HTMLAnchorElement, MouseEvent>\n ) {\n if (onClick) onClick(event);\n if (!event.defaultPrevented) {\n internalOnClick(event);\n }\n }\n\n return (\n // eslint-disable-next-line jsx-a11y/anchor-has-content\n <a\n {...rest}\n href={absoluteHref || href}\n onClick={isExternal || reloadDocument ? onClick : handleClick}\n ref={ref}\n target={target}\n />\n );\n }\n);\n\nif (__DEV__) {\n Link.displayName = \"Link\";\n}\n\nexport type NavLinkRenderProps = {\n isActive: boolean;\n isPending: boolean;\n isTransitioning: boolean;\n};\n\nexport interface NavLinkProps\n extends Omit<LinkProps, \"className\" | \"style\" | \"children\"> {\n children?: React.ReactNode | ((props: NavLinkRenderProps) => React.ReactNode);\n caseSensitive?: boolean;\n className?: string | ((props: NavLinkRenderProps) => string | undefined);\n end?: boolean;\n style?:\n | React.CSSProperties\n | ((props: NavLinkRenderProps) => React.CSSProperties | undefined);\n}\n\n/**\n * A `<Link>` wrapper that knows if it's \"active\" or not.\n */\nexport const NavLink = React.forwardRef<HTMLAnchorElement, NavLinkProps>(\n function NavLinkWithRef(\n {\n \"aria-current\": ariaCurrentProp = \"page\",\n caseSensitive = false,\n className: classNameProp = \"\",\n end = false,\n style: styleProp,\n to,\n viewTransition,\n children,\n ...rest\n },\n ref\n ) {\n let path = useResolvedPath(to, { relative: rest.relative });\n let location = useLocation();\n let routerState = React.useContext(DataRouterStateContext);\n let { navigator, basename } = React.useContext(NavigationContext);\n let isTransitioning =\n routerState != null &&\n // Conditional usage is OK here because the usage of a data router is static\n // eslint-disable-next-line react-hooks/rules-of-hooks\n useViewTransitionState(path) &&\n viewTransition === true;\n\n let toPathname = navigator.encodeLocation\n ? navigator.encodeLocation(path).pathname\n : path.pathname;\n let locationPathname = location.pathname;\n let nextLocationPathname =\n routerState && routerState.navigation && routerState.navigation.location\n ? routerState.navigation.location.pathname\n : null;\n\n if (!caseSensitive) {\n locationPathname = locationPathname.toLowerCase();\n nextLocationPathname = nextLocationPathname\n ? nextLocationPathname.toLowerCase()\n : null;\n toPathname = toPathname.toLowerCase();\n }\n\n if (nextLocationPathname && basename) {\n nextLocationPathname =\n stripBasename(nextLocationPathname, basename) || nextLocationPathname;\n }\n\n // If the `to` has a trailing slash, look at that exact spot. Otherwise,\n // we're looking for a slash _after_ what's in `to`. For example:\n //\n // <NavLink to=\"/users\"> and <NavLink to=\"/users/\">\n // both want to look for a / at index 6 to match URL `/users/matt`\n const endSlashPosition =\n toPathname !== \"/\" && toPathname.endsWith(\"/\")\n ? toPathname.length - 1\n : toPathname.length;\n let isActive =\n locationPathname === toPathname ||\n (!end &&\n locationPathname.startsWith(toPathname) &&\n locationPathname.charAt(endSlashPosition) === \"/\");\n\n let isPending =\n nextLocationPathname != null &&\n (nextLocationPathname === toPathname ||\n (!end &&\n nextLocationPathname.startsWith(toPathname) &&\n nextLocationPathname.charAt(toPathname.length) === \"/\"));\n\n let renderProps = {\n isActive,\n isPending,\n isTransitioning,\n };\n\n let ariaCurrent = isActive ? ariaCurrentProp : undefined;\n\n let className: string | undefined;\n if (typeof classNameProp === \"function\") {\n className = classNameProp(renderProps);\n } else {\n // If the className prop is not a function, we use a default `active`\n // class for <NavLink />s that are active. In v5 `active` was the default\n // value for `activeClassName`, but we are removing that API and can still\n // use the old default behavior for a cleaner upgrade path and keep the\n // simple styling rules working as they currently do.\n className = [\n classNameProp,\n isActive ? \"active\" : null,\n isPending ? \"pending\" : null,\n isTransitioning ? \"transitioning\" : null,\n ]\n .filter(Boolean)\n .join(\" \");\n }\n\n let style =\n typeof styleProp === \"function\" ? styleProp(renderProps) : styleProp;\n\n return (\n <Link\n {...rest}\n aria-current={ariaCurrent}\n className={className}\n ref={ref}\n style={style}\n to={to}\n viewTransition={viewTransition}\n >\n {typeof children === \"function\" ? children(renderProps) : children}\n </Link>\n );\n }\n);\n\nif (__DEV__) {\n NavLink.displayName = \"NavLink\";\n}\n\n/**\n * Form props shared by navigations and fetchers\n */\ninterface SharedFormProps extends React.FormHTMLAttributes<HTMLFormElement> {\n /**\n * The HTTP verb to use when the form is submit. Supports \"get\", \"post\",\n * \"put\", \"delete\", \"patch\".\n */\n method?: HTMLFormMethod;\n\n /**\n * `<form encType>` - enhancing beyond the normal string type and limiting\n * to the built-in browser supported values\n */\n encType?:\n | \"application/x-www-form-urlencoded\"\n | \"multipart/form-data\"\n | \"text/plain\";\n\n /**\n * Normal `<form action>` but supports React Router's relative paths.\n */\n action?: string;\n\n /**\n * Determines whether the form action is relative to the route hierarchy or\n * the pathname. Use this if you want to opt out of navigating the route\n * hierarchy and want to instead route based on /-delimited URL segments\n */\n relative?: RelativeRoutingType;\n\n /**\n * Prevent the scroll position from resetting to the top of the viewport on\n * completion of the navigation when using the <ScrollRestoration> component\n */\n preventScrollReset?: boolean;\n\n /**\n * A function to call when the form is submitted. If you call\n * `event.preventDefault()` then this form will not do anything.\n */\n onSubmit?: React.FormEventHandler<HTMLFormElement>;\n}\n\n/**\n * Form props available to fetchers\n */\nexport interface FetcherFormProps extends SharedFormProps {}\n\n/**\n * Form props available to navigations\n */\nexport interface FormProps extends SharedFormProps {\n /**\n * Indicate a specific fetcherKey to use when using navigate=false\n */\n fetcherKey?: string;\n\n /**\n * navigate=false will use a fetcher instead of a navigation\n */\n navigate?: boolean;\n\n /**\n * Forces a full document navigation instead of a fetch.\n */\n reloadDocument?: boolean;\n\n /**\n * Replaces the current entry in the browser history stack when the form\n * navigates. Use this if you don't want the user to be able to click \"back\"\n * to the page with the form on it.\n */\n replace?: boolean;\n\n /**\n * State object to add to the history stack entry for this navigation\n */\n state?: any;\n\n /**\n * Enable view transitions on this Form navigation\n */\n viewTransition?: boolean;\n}\n\ntype HTMLSubmitEvent = React.BaseSyntheticEvent<\n SubmitEvent,\n Event,\n HTMLFormElement\n>;\n\ntype HTMLFormSubmitter = HTMLButtonElement | HTMLInputElement;\n\n/**\n * A `@remix-run/router`-aware `<form>`. It behaves like a normal form except\n * that the interaction with the server is with `fetch` instead of new document\n * requests, allowing components to add nicer UX to the page as the form is\n * submitted and returns with data.\n */\nexport const Form = React.forwardRef<HTMLFormElement, FormProps>(\n (\n {\n fetcherKey,\n navigate,\n reloadDocument,\n replace,\n state,\n method = defaultMethod,\n action,\n onSubmit,\n relative,\n preventScrollReset,\n viewTransition,\n ...props\n },\n forwardedRef\n ) => {\n let submit = useSubmit();\n let formAction = useFormAction(action, { relative });\n let formMethod: HTMLFormMethod =\n method.toLowerCase() === \"get\" ? \"get\" : \"post\";\n\n let submitHandler: React.FormEventHandler<HTMLFormElement> = (event) => {\n onSubmit && onSubmit(event);\n if (event.defaultPrevented) return;\n event.preventDefault();\n\n let submitter = (event as unknown as HTMLSubmitEvent).nativeEvent\n .submitter as HTMLFormSubmitter | null;\n\n let submitMethod =\n (submitter?.getAttribute(\"formmethod\") as HTMLFormMethod | undefined) ||\n method;\n\n submit(submitter || event.currentTarget, {\n fetcherKey,\n method: submitMethod,\n navigate,\n replace,\n state,\n relative,\n preventScrollReset,\n viewTransition,\n });\n };\n\n return (\n <form\n ref={forwardedRef}\n method={formMethod}\n action={formAction}\n onSubmit={reloadDocument ? onSubmit : submitHandler}\n {...props}\n />\n );\n }\n);\n\nif (__DEV__) {\n Form.displayName = \"Form\";\n}\n\nexport interface ScrollRestorationProps {\n getKey?: GetScrollRestorationKeyFunction;\n storageKey?: string;\n}\n\n/**\n * This component will emulate the browser's scroll restoration on location\n * changes.\n */\nexport function ScrollRestoration({\n getKey,\n storageKey,\n}: ScrollRestorationProps) {\n useScrollRestoration({ getKey, storageKey });\n return null;\n}\n\nif (__DEV__) {\n ScrollRestoration.displayName = \"ScrollRestoration\";\n}\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Hooks\n////////////////////////////////////////////////////////////////////////////////\n\nenum DataRouterHook {\n UseScrollRestoration = \"useScrollRestoration\",\n UseSubmit = \"useSubmit\",\n UseSubmitFetcher = \"useSubmitFetcher\",\n UseFetcher = \"useFetcher\",\n useViewTransitionState = \"useViewTransitionState\",\n}\n\nenum DataRouterStateHook {\n UseFetcher = \"useFetcher\",\n UseFetchers = \"useFetchers\",\n UseScrollRestoration = \"useScrollRestoration\",\n}\n\n// Internal hooks\n\nfunction getDataRouterConsoleError(\n hookName: DataRouterHook | DataRouterStateHook\n) {\n return `${hookName} must be used within a data router. See https://reactrouter.com/v6/routers/picking-a-router.`;\n}\n\nfunction useDataRouterContext(hookName: DataRouterHook) {\n let ctx = React.useContext(DataRouterContext);\n invariant(ctx, getDataRouterConsoleError(hookName));\n return ctx;\n}\n\nfunction useDataRouterState(hookName: DataRouterStateHook) {\n let state = React.useContext(DataRouterStateContext);\n invariant(state, getDataRouterConsoleError(hookName));\n return state;\n}\n\n// External hooks\n\n/**\n * Handles the click behavior for router `<Link>` components. This is useful if\n * you need to create custom `<Link>` components with the same click behavior we\n * use in our exported `<Link>`.\n */\nexport function useLinkClickHandler<E extends Element = HTMLAnchorElement>(\n to: To,\n {\n target,\n replace: replaceProp,\n state,\n preventScrollReset,\n relative,\n viewTransition,\n }: {\n target?: React.HTMLAttributeAnchorTarget;\n replace?: boolean;\n state?: any;\n preventScrollReset?: boolean;\n relative?: RelativeRoutingType;\n viewTransition?: boolean;\n } = {}\n): (event: React.MouseEvent<E, MouseEvent>) => void {\n let navigate = useNavigate();\n let location = useLocation();\n let path = useResolvedPath(to, { relative });\n\n return React.useCallback(\n (event: React.MouseEvent<E, MouseEvent>) => {\n if (shouldProcessLinkClick(event, target)) {\n event.preventDefault();\n\n // If the URL hasn't changed, a regular <a> will do a replace instead of\n // a push, so do the same here unless the replace prop is explicitly set\n let replace =\n replaceProp !== undefined\n ? replaceProp\n : createPath(location) === createPath(path);\n\n navigate(to, {\n replace,\n state,\n preventScrollReset,\n relative,\n viewTransition,\n });\n }\n },\n [\n location,\n navigate,\n path,\n replaceProp,\n state,\n target,\n to,\n preventScrollReset,\n relative,\n viewTransition,\n ]\n );\n}\n\n/**\n * A convenient wrapper for reading and writing search parameters via the\n * URLSearchParams interface.\n */\nexport function useSearchParams(\n defaultInit?: URLSearchParamsInit\n): [URLSearchParams, SetURLSearchParams] {\n warning(\n typeof URLSearchParams !== \"undefined\",\n `You cannot use the \\`useSearchParams\\` hook in a browser that does not ` +\n `support the URLSearchParams API. If you need to support Internet ` +\n `Explorer 11, we recommend you load a polyfill such as ` +\n `https://github.com/ungap/url-search-params.`\n );\n\n let defaultSearchParamsRef = React.useRef(createSearchParams(defaultInit));\n let hasSetSearchParamsRef = React.useRef(false);\n\n let location = useLocation();\n let searchParams = React.useMemo(\n () =>\n // Only merge in the defaults if we haven't yet called setSearchParams.\n // Once we call that we want those to take precedence, otherwise you can't\n // remove a param with setSearchParams({}) if it has an initial value\n getSearchParamsForLocation(\n location.search,\n hasSetSearchParamsRef.current ? null : defaultSearchParamsRef.current\n ),\n [location.search]\n );\n\n let navigate = useNavigate();\n let setSearchParams = React.useCallback<SetURLSearchParams>(\n (nextInit, navigateOptions) => {\n const newSearchParams = createSearchParams(\n typeof nextInit === \"function\" ? nextInit(searchParams) : nextInit\n );\n hasSetSearchParamsRef.current = true;\n navigate(\"?\" + newSearchParams, navigateOptions);\n },\n [navigate, searchParams]\n );\n\n return [searchParams, setSearchParams];\n}\n\nexport type SetURLSearchParams = (\n nextInit?:\n | URLSearchParamsInit\n | ((prev: URLSearchParams) => URLSearchParamsInit),\n navigateOpts?: NavigateOptions\n) => void;\n\n/**\n * Submits a HTML `<form>` to the server without reloading the page.\n */\nexport interface SubmitFunction {\n (\n /**\n * Specifies the `<form>` to be submitted to the server, a specific\n * `<button>` or `<input type=\"submit\">` to use to submit the form, or some\n * arbitrary data to submit.\n *\n * Note: When using a `<button>` its `name` and `value` will also be\n * included in the form data that is submitted.\n */\n target: SubmitTarget,\n\n /**\n * Options that override the `<form>`'s own attributes. Required when\n * submitting arbitrary data without a backing `<form>`.\n */\n options?: SubmitOptions\n ): void;\n}\n\n/**\n * Submits a fetcher `<form>` to the server without reloading the page.\n */\nexport interface FetcherSubmitFunction {\n (\n target: SubmitTarget,\n // Fetchers cannot replace or set state because they are not navigation events\n options?: FetcherSubmitOptions\n ): void;\n}\n\nfunction validateClientSideSubmission() {\n if (typeof document === \"undefined\") {\n throw new Error(\n \"You are calling submit during the server render. \" +\n \"Try calling submit within a `useEffect` or callback instead.\"\n );\n }\n}\n\nlet fetcherId = 0;\nlet getUniqueFetcherId = () => `__${String(++fetcherId)}__`;\n\n/**\n * Returns a function that may be used to programmatically submit a form (or\n * some arbitrary data) to the server.\n */\nexport function useSubmit(): SubmitFunction {\n let { router } = useDataRouterContext(DataRouterHook.UseSubmit);\n let { basename } = React.useContext(NavigationContext);\n let currentRouteId = useRouteId();\n\n return React.useCallback<SubmitFunction>(\n (target, options = {}) => {\n validateClientSideSubmission();\n\n let { action, method, encType, formData, body } = getFormSubmissionInfo(\n target,\n basename\n );\n\n if (options.navigate === false) {\n let key = options.fetcherKey || getUniqueFetcherId();\n router.fetch(key, currentRouteId, options.action || action, {\n preventScrollReset: options.preventScrollReset,\n formData,\n body,\n formMethod: options.method || (method as HTMLFormMethod),\n formEncType: options.encType || (encType as FormEncType),\n flushSync: options.flushSync,\n });\n } else {\n router.navigate(options.action || action, {\n preventScrollReset: options.preventScrollReset,\n formData,\n body,\n formMethod: options.method || (method as HTMLFormMethod),\n formEncType: options.encType || (encType as FormEncType),\n replace: options.replace,\n state: options.state,\n fromRouteId: currentRouteId,\n flushSync: options.flushSync,\n viewTransition: options.viewTransition,\n });\n }\n },\n [router, basename, currentRouteId]\n );\n}\n\n// v7: Eventually we should deprecate this entirely in favor of using the\n// router method directly?\nexport function useFormAction(\n action?: string,\n { relative }: { relative?: RelativeRoutingType } = {}\n): string {\n let { basename } = React.useContext(NavigationContext);\n let routeContext = React.useContext(RouteContext);\n invariant(routeContext, \"useFormAction must be used inside a RouteContext\");\n\n let [match] = routeContext.matches.slice(-1);\n // Shallow clone path so we can modify it below, otherwise we modify the\n // object referenced by useMemo inside useResolvedPath\n let path = { ...useResolvedPath(action ? action : \".\", { relative }) };\n\n // If no action was specified, browsers will persist current search params\n // when determining the path, so match that behavior\n // https://github.com/remix-run/remix/issues/927\n let location = useLocation();\n if (action == null) {\n // Safe to write to this directly here since if action was undefined, we\n // would have called useResolvedPath(\".\") which will never include a search\n path.search = location.search;\n\n // When grabbing search params from the URL, remove any included ?index param\n // since it might not apply to our contextual route. We add it back based\n // on match.route.index below\n let params = new URLSearchParams(path.search);\n let indexValues = params.getAll(\"index\");\n let hasNakedIndexParam = indexValues.some((v) => v === \"\");\n if (hasNakedIndexParam) {\n params.delete(\"index\");\n indexValues.filter((v) => v).forEach((v) => params.append(\"index\", v));\n let qs = params.toString();\n path.search = qs ? `?${qs}` : \"\";\n }\n }\n\n if ((!action || action === \".\") && match.route.index) {\n path.search = path.search\n ? path.search.replace(/^\\?/, \"?index&\")\n : \"?index\";\n }\n\n // If we're operating within a basename, prepend it to the pathname prior\n // to creating the form action. If this is a root navigation, then just use\n // the raw basename which allows the basename to have full control over the\n // presence of a trailing slash on root actions\n if (basename !== \"/\") {\n path.pathname =\n path.pathname === \"/\" ? basename : joinPaths([basename, path.pathname]);\n }\n\n return createPath(path);\n}\n\nexport type FetcherWithComponents<TData> = Fetcher<TData> & {\n Form: React.ForwardRefExoticComponent<\n FetcherFormProps & React.RefAttributes<HTMLFormElement>\n >;\n submit: FetcherSubmitFunction;\n load: (href: string, opts?: { flushSync?: boolean }) => void;\n};\n\n// TODO: (v7) Change the useFetcher generic default from `any` to `unknown`\n\n/**\n * Interacts with route loaders and actions without causing a navigation. Great\n * for any interaction that stays on the same page.\n */\nexport function useFetcher<TData = any>({\n key,\n}: { key?: string } = {}): FetcherWithComponents<TData> {\n let { router } = useDataRouterContext(DataRouterHook.UseFetcher);\n let state = useDataRouterState(DataRouterStateHook.UseFetcher);\n let fetcherData = React.useContext(FetchersContext);\n let route = React.useContext(RouteContext);\n let routeId = route.matches[route.matches.length - 1]?.route.id;\n\n invariant(fetcherData, `useFetcher must be used inside a FetchersContext`);\n invariant(route, `useFetcher must be used inside a RouteContext`);\n invariant(\n routeId != null,\n `useFetcher can only be used on routes that contain a unique \"id\"`\n );\n\n // Fetcher key handling\n // OK to call conditionally to feature detect `useId`\n // eslint-disable-next-line react-hooks/rules-of-hooks\n let defaultKey = useIdImpl ? useIdImpl() : \"\";\n let [fetcherKey, setFetcherKey] = React.useState<string>(key || defaultKey);\n if (key && key !== fetcherKey) {\n setFetcherKey(key);\n } else if (!fetcherKey) {\n // We will only fall through here when `useId` is not available\n setFetcherKey(getUniqueFetcherId());\n }\n\n // Registration/cleanup\n React.useEffect(() => {\n router.getFetcher(fetcherKey);\n return () => {\n // Tell the router we've unmounted - if v7_fetcherPersist is enabled this\n // will not delete immediately but instead queue up a delete after the\n // fetcher returns to an `idle` state\n router.deleteFetcher(fetcherKey);\n };\n }, [router, fetcherKey]);\n\n // Fetcher additions\n let load = React.useCallback(\n (href: string, opts?: { flushSync?: boolean }) => {\n invariant(routeId, \"No routeId available for fetcher.load()\");\n router.fetch(fetcherKey, routeId, href, opts);\n },\n [fetcherKey, routeId, router]\n );\n\n let submitImpl = useSubmit();\n let submit = React.useCallback<FetcherSubmitFunction>(\n (target, opts) => {\n submitImpl(target, {\n ...opts,\n navigate: false,\n fetcherKey,\n });\n },\n [fetcherKey, submitImpl]\n );\n\n let FetcherForm = React.useMemo(() => {\n let FetcherForm = React.forwardRef<HTMLFormElement, FetcherFormProps>(\n (props, ref) => {\n return (\n <Form {...props} navigate={false} fetcherKey={fetcherKey} ref={ref} />\n );\n }\n );\n if (__DEV__) {\n FetcherForm.displayName = \"fetcher.Form\";\n }\n return FetcherForm;\n }, [fetcherKey]);\n\n // Exposed FetcherWithComponents\n let fetcher = state.fetchers.get(fetcherKey) || IDLE_FETCHER;\n let data = fetcherData.get(fetcherKey);\n let fetcherWithComponents = React.useMemo(\n () => ({\n Form: FetcherForm,\n submit,\n load,\n ...fetcher,\n data,\n }),\n [FetcherForm, submit, load, fetcher, data]\n );\n\n return fetcherWithComponents;\n}\n\n/**\n * Provides all fetchers currently on the page. Useful for layouts and parent\n * routes that need to provide pending/optimistic UI regarding the fetch.\n */\nexport function useFetchers(): (Fetcher & { key: string })[] {\n let state = useDataRouterState(DataRouterStateHook.UseFetchers);\n return Array.from(state.fetchers.entries()).map(([key, fetcher]) => ({\n ...fetcher,\n key,\n }));\n}\n\nconst SCROLL_RESTORATION_STORAGE_KEY = \"react-router-scroll-positions\";\nlet savedScrollPositions: Record<string, number> = {};\n\n/**\n * When rendered inside a RouterProvider, will restore scroll positions on navigations\n */\nfunction useScrollRestoration({\n getKey,\n storageKey,\n}: {\n getKey?: GetScrollRestorationKeyFunction;\n storageKey?: string;\n} = {}) {\n let { router } = useDataRouterContext(DataRouterHook.UseScrollRestoration);\n let { restoreScrollPosition, preventScrollReset } = useDataRouterState(\n DataRouterStateHook.UseScrollRestoration\n );\n let { basename } = React.useContext(NavigationContext);\n let location = useLocation();\n let matches = useMatches();\n let navigation = useNavigation();\n\n // Trigger manual scroll restoration while we're active\n React.useEffect(() => {\n window.history.scrollRestoration = \"manual\";\n return () => {\n window.history.scrollRestoration = \"auto\";\n };\n }, []);\n\n // Save positions on pagehide\n usePageHide(\n React.useCallback(() => {\n if (navigation.state === \"idle\") {\n let key = (getKey ? getKey(location, matches) : null) || location.key;\n savedScrollPositions[key] = window.scrollY;\n }\n try {\n sessionStorage.setItem(\n storageKey || SCROLL_RESTORATION_STORAGE_KEY,\n JSON.stringify(savedScrollPositions)\n );\n } catch (error) {\n warning(\n false,\n `Failed to save scroll positions in sessionStorage, <ScrollRestoration /> will not work properly (${error}).`\n );\n }\n window.history.scrollRestoration = \"auto\";\n }, [storageKey, getKey, navigation.state, location, matches])\n );\n\n // Read in any saved scroll locations\n if (typeof document !== \"undefined\") {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n React.useLayoutEffect(() => {\n try {\n let sessionPositions = sessionStorage.getItem(\n storageKey || SCROLL_RESTORATION_STORAGE_KEY\n );\n if (sessionPositions) {\n savedScrollPositions = JSON.parse(sessionPositions);\n }\n } catch (e) {\n // no-op, use default empty object\n }\n }, [storageKey]);\n\n // Enable scroll restoration in the router\n // eslint-disable-next-line react-hooks/rules-of-hooks\n React.useLayoutEffect(() => {\n let getKeyWithoutBasename: GetScrollRestorationKeyFunction | undefined =\n getKey && basename !== \"/\"\n ? (location, matches) =>\n getKey(\n // Strip the basename to match useLocation()\n {\n ...location,\n pathname:\n stripBasename(location.pathname, basename) ||\n location.pathname,\n },\n matches\n )\n : getKey;\n let disableScrollRestoration = router?.enableScrollRestoration(\n savedScrollPositions,\n () => window.scrollY,\n getKeyWithoutBasename\n );\n return () => disableScrollRestoration && disableScrollRestoration();\n }, [router, basename, getKey]);\n\n // Restore scrolling when state.restoreScrollPosition changes\n // eslint-disable-next-line react-hooks/rules-of-hooks\n React.useLayoutEffect(() => {\n // Explicit false means don't do anything (used for submissions)\n if (restoreScrollPosition === false) {\n return;\n }\n\n // been here before, scroll to it\n if (typeof restoreScrollPosition === \"number\") {\n window.scrollTo(0, restoreScrollPosition);\n return;\n }\n\n // try to scroll to the hash\n if (location.hash) {\n let el = document.getElementById(\n decodeURIComponent(location.hash.slice(1))\n );\n if (el) {\n el.scrollIntoView();\n return;\n }\n }\n\n // Don't reset if this navigation opted out\n if (preventScrollReset === true) {\n return;\n }\n\n // otherwise go to the top on new locations\n window.scrollTo(0, 0);\n }, [location, restoreScrollPosition, preventScrollReset]);\n }\n}\n\nexport { useScrollRestoration as UNSAFE_useScrollRestoration };\n\n/**\n * Setup a callback to be fired on the window's `beforeunload` event. This is\n * useful for saving some data to `window.localStorage` just before the page\n * refreshes.\n *\n * Note: The `callback` argument should be a function created with\n * `React.useCallback()`.\n */\nexport function useBeforeUnload(\n callback: (event: BeforeUnloadEvent) => any,\n options?: { capture?: boolean }\n): void {\n let { capture } = options || {};\n React.useEffect(() => {\n let opts = capture != null ? { capture } : undefined;\n window.addEventListener(\"beforeunload\", callback, opts);\n return () => {\n window.removeEventListener(\"beforeunload\", callback, opts);\n };\n }, [callback, capture]);\n}\n\n/**\n * Setup a callback to be fired on the window's `pagehide` event. This is\n * useful for saving some data to `window.localStorage` just before the page\n * refreshes. This event is better supported than beforeunload across browsers.\n *\n * Note: The `callback` argument should be a function created with\n * `React.useCallback()`.\n */\nfunction usePageHide(\n callback: (event: PageTransitionEvent) => any,\n options?: { capture?: boolean }\n): void {\n let { capture } = options || {};\n React.useEffect(() => {\n let opts = capture != null ? { capture } : undefined;\n window.addEventListener(\"pagehide\", callback, opts);\n return () => {\n window.removeEventListener(\"pagehide\", callback, opts);\n };\n }, [callback, capture]);\n}\n\n/**\n * Wrapper around useBlocker to show a window.confirm prompt to users instead\n * of building a custom UI with useBlocker.\n *\n * Warning: This has *a lot of rough edges* and behaves very differently (and\n * very incorrectly in some cases) across browsers if user click addition\n * back/forward navigations while the confirm is open. Use at your own risk.\n */\nfunction usePrompt({\n when,\n message,\n}: {\n when: boolean | BlockerFunction;\n message: string;\n}) {\n let blocker = useBlocker(when);\n\n React.useEffect(() => {\n if (blocker.state === \"blocked\") {\n let proceed = window.confirm(message);\n if (proceed) {\n // This timeout is needed to avoid a weird \"race\" on POP navigations\n // between the `window.history` revert navigation and the result of\n // `window.confirm`\n setTimeout(blocker.proceed, 0);\n } else {\n blocker.reset();\n }\n }\n }, [blocker, message]);\n\n React.useEffect(() => {\n if (blocker.state === \"blocked\" && !when) {\n blocker.reset();\n }\n }, [blocker, when]);\n}\n\nexport { usePrompt as unstable_usePrompt };\n\n/**\n * Return a boolean indicating if there is an active view transition to the\n * given href. You can use this value to render CSS classes or viewTransitionName\n * styles onto your elements\n *\n * @param href The destination href\n * @param [opts.relative] Relative routing type (\"route\" | \"path\")\n */\nfunction useViewTransitionState(\n to: To,\n opts: { relative?: RelativeRoutingType } = {}\n) {\n let vtContext = React.useContext(ViewTransitionContext);\n\n invariant(\n vtContext != null,\n \"`useViewTransitionState` must be used within `react-router-dom`'s `RouterProvider`. \" +\n \"Did you accidentally import `RouterProvider` from `react-router`?\"\n );\n\n let { basename } = useDataRouterContext(\n DataRouterHook.useViewTransitionState\n );\n let path = useResolvedPath(to, { relative: opts.relative });\n if (!vtContext.isTransitioning) {\n return false;\n }\n\n let currentPath =\n stripBasename(vtContext.currentLocation.pathname, basename) ||\n vtContext.currentLocation.pathname;\n let nextPath =\n stripBasename(vtContext.nextLocation.pathname, basename) ||\n vtContext.nextLocation.pathname;\n\n // Transition is active if we're going to or coming from the indicated\n // destination. This ensures that other PUSH navigations that reverse\n // an indicated transition apply. I.e., on the list view you have:\n //\n // <NavLink to=\"/details/1\" viewTransition>\n //\n // If you click the breadcrumb back to the list view:\n //\n // <NavLink to=\"/list\" viewTransition>\n //\n // We should apply the transition because it's indicated as active going\n // from /list -> /details/1 and therefore should be active on the reverse\n // (even though this isn't strictly a POP reverse)\n return (\n matchPath(path.pathname, nextPath) != null ||\n matchPath(path.pathname, currentPath) != null\n );\n}\n\nexport { useViewTransitionState as useViewTransitionState };\n\n//#endregion\n","export const WATCHANIME_RED = \"#FF0000\";\n\nexport const HEADER_VIDEO_CONTAINER_HEIGHT = \"56.25vw\";\nexport const HEADER_VIDEO_CONTAINER_HEIGHT_MIN = 700;\n\nexport const ANIME_SLIDER_WIDTH = \"200px\";\nexport const ANIME_SLIDER_MOBILE_WIDTH = \"150px\";\nexport const ANIME_SLIDER_GAP = \"20px\";\n","export default {\n outline: {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n },\n filled: {\n xmlns: 'http://www.w3.org/2000/svg',\n width: 24,\n height: 24,\n viewBox: '0 0 24 24',\n fill: 'currentColor',\n stroke: 'none',\n },\n};\n","import { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes';\nimport type { IconNode, IconProps, Icon } from './types';\n\nconst createReactComponent = (\n type: 'outline' | 'filled',\n iconName: string,\n iconNamePascal: string,\n iconNode: IconNode,\n) => {\n const Component = forwardRef<Icon, IconProps>(\n (\n { color = 'currentColor', size = 24, stroke = 2, title, className, children, ...rest }: IconProps,\n ref,\n ) =>\n createElement(\n 'svg',\n {\n ref,\n ...defaultAttributes[type],\n width: size,\n height: size,\n className: [`tabler-icon`, `tabler-icon-${iconName}`, className].join(' '),\n ...(type === 'filled'\n ? {\n fill: color,\n }\n : {\n strokeWidth: stroke,\n stroke: color,\n }),\n ...rest,\n },\n [\n title && createElement('title', { key: 'svg-title' }, title),\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...(Array.isArray(children) ? children : [children]),\n ],\n ),\n );\n\n Component.displayName = `${iconNamePascal}`;\n\n return Component;\n};\n\nexport default createReactComponent;\n","import createReactComponent from '../createReactComponent';\nexport default createReactComponent('outline', 'arrows-shuffle', 'IconArrowsShuffle', [[\"path\",{\"d\":\"M18 4l3 3l-3 3\",\"key\":\"svg-0\"}],[\"path\",{\"d\":\"M18 20l3 -3l-3 -3\",\"key\":\"svg-1\"}],[\"path\",{\"d\":\"M3 7h3a5 5 0 0 1 5 5a5 5 0 0 0 5 5h5\",\"key\":\"svg-2\"}],[\"path\",{\"d\":\"M21 7h-5a4.978 4.978 0 0 0 -3 1m-4 8a4.984 4.984 0 0 1 -3 1h-3\",\"key\":\"svg-3\"}]]);","const createStoreImpl = (createState) => {\n let state;\n const listeners = /* @__PURE__ */ new Set();\n const setState = (partial, replace) => {\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n if (!Object.is(nextState, state)) {\n const previousState = state;\n state = (replace != null ? replace : typeof nextState !== \"object\" || nextState === null) ? nextState : Object.assign({}, state, nextState);\n listeners.forEach((listener) => listener(state, previousState));\n }\n };\n const getState = () => state;\n const getInitialState = () => initialState;\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const destroy = () => {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\") {\n console.warn(\n \"[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected.\"\n );\n }\n listeners.clear();\n };\n const api = { setState, getState, getInitialState, subscribe, destroy };\n const initialState = state = createState(setState, getState, api);\n return api;\n};\nconst createStore = (createState) => createState ? createStoreImpl(createState) : createStoreImpl;\nvar vanilla = (createState) => {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\") {\n console.warn(\n \"[DEPRECATED] Default export is deprecated. Instead use import { createStore } from 'zustand/vanilla'.\"\n );\n }\n return createStore(createState);\n};\n\nexport { createStore, vanilla as default };\n","import { createStore } from 'zustand/vanilla';\nexport * from 'zustand/vanilla';\nimport ReactExports from 'react';\nimport useSyncExternalStoreExports from 'use-sync-external-store/shim/with-selector.js';\n\nconst { useDebugValue } = ReactExports;\nconst { useSyncExternalStoreWithSelector } = useSyncExternalStoreExports;\nlet didWarnAboutEqualityFn = false;\nconst identity = (arg) => arg;\nfunction useStore(api, selector = identity, equalityFn) {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\" && equalityFn && !didWarnAboutEqualityFn) {\n console.warn(\n \"[DEPRECATED] Use `createWithEqualityFn` instead of `create` or use `useStoreWithEqualityFn` instead of `useStore`. They can be imported from 'zustand/traditional'. https://github.com/pmndrs/zustand/discussions/1937\"\n );\n didWarnAboutEqualityFn = true;\n }\n const slice = useSyncExternalStoreWithSelector(\n api.subscribe,\n api.getState,\n api.getServerState || api.getInitialState,\n selector,\n equalityFn\n );\n useDebugValue(slice);\n return slice;\n}\nconst createImpl = (createState) => {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\" && typeof createState !== \"function\") {\n console.warn(\n \"[DEPRECATED] Passing a vanilla store will be unsupported in a future version. Instead use `import { useStore } from 'zustand'`.\"\n );\n }\n const api = typeof createState === \"function\" ? createStore(createState) : createState;\n const useBoundStore = (selector, equalityFn) => useStore(api, selector, equalityFn);\n Object.assign(useBoundStore, api);\n return useBoundStore;\n};\nconst create = (createState) => createState ? createImpl(createState) : createImpl;\nvar react = (createState) => {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\") {\n console.warn(\n \"[DEPRECATED] Default export is deprecated. Instead use `import { create } from 'zustand'`.\"\n );\n }\n return create(createState);\n};\n\nexport { create, react as default, useStore };\n","import { create } from \"zustand\";\n\nconst useLanguageStore = create((set) => ({\n language: localStorage.getItem(\"language\") ?? \"English\",\n toggle: (state) => {\n set((state) => {\n let changedLangauge = state.language === \"English\" ? \"Default\" : \"English\";\n localStorage.setItem(\"language\", changedLangauge);\n return { language: changedLangauge };\n });\n },\n}));\n\nexport { useLanguageStore };\n","import ReactExports from 'react';\n\nfunction shallow(objA, objB) {\n if (Object.is(objA, objB)) {\n return true;\n }\n if (typeof objA !== \"object\" || objA === null || typeof objB !== \"object\" || objB === null) {\n return false;\n }\n if (objA instanceof Map && objB instanceof Map) {\n if (objA.size !== objB.size) return false;\n for (const [key, value] of objA) {\n if (!Object.is(value, objB.get(key))) {\n return false;\n }\n }\n return true;\n }\n if (objA instanceof Set && objB instanceof Set) {\n if (objA.size !== objB.size) return false;\n for (const value of objA) {\n if (!objB.has(value)) {\n return false;\n }\n }\n return true;\n }\n const keysA = Object.keys(objA);\n if (keysA.length !== Object.keys(objB).length) {\n return false;\n }\n for (const keyA of keysA) {\n if (!Object.prototype.hasOwnProperty.call(objB, keyA) || !Object.is(objA[keyA], objB[keyA])) {\n return false;\n }\n }\n return true;\n}\n\nconst { useRef } = ReactExports;\nfunction useShallow(selector) {\n const prev = useRef();\n return (state) => {\n const next = selector(state);\n return shallow(prev.current, next) ? prev.current : prev.current = next;\n };\n}\n\nexport { useShallow };\n","export const API_BASE_URL = \"https://api.watchanime.dev/v1\";\nexport const API_BASE_URL_V2 = \"https://api.watchanime.dev/v2/graphql\";\n\nexport const NOTIFICATION_BASE_URL = \"https://notifications.watchanime.dev\";\nexport const NOTIFICATION_BASE_URL_V2 = \"https://notifications.watchanime.dev/v2/graphql\";\n\nexport const GOGO_DOWNLOAD_LINK = \"https://s3taku.com\";\nexport const STATIC_BUCKET_URL = \"https://webstatic.watchanime.dev/watchanime-static\";\nexport const AUTH_BASE_URL = \"https://auth.watchanime.dev\";\n\nexport const IS_CHRISTMAS_ENABLED = new Date().getMonth() === 11;\n","import { Anchor, createStyles, Paper, Text } from \"@mantine/core\";\nimport { Link, useNavigate } from \"react-router-dom\";\n\nimport React from \"react\";\nimport { WATCHANIME_RED } from \"../constants/cssConstants\";\nimport { IconArrowsShuffle } from \"@tabler/icons-react\";\nimport { useLanguageStore } from \"../store/LanguageToggleStore\";\nimport { useShallow } from \"zustand/react/shallow\";\nimport axios from \"axios\";\nimport { API_BASE_URL } from \"../constants/genricConstants\";\n\nconst useStyles = createStyles((theme) => ({\n sideBarMenuLayoutAnchor: {\n width: \"100%\",\n padding: \"15px 0px\",\n textDecoration: \"none\",\n color: \"white\",\n \"&:hover\": {\n textDecoration: \"none\",\n color: WATCHANIME_RED,\n },\n },\n sideBarMenuIcons: {\n color: WATCHANIME_RED,\n },\n specialSectionWrapper: {\n width: \"100%\",\n height: \"75px\",\n backgroundColor: \"rgb(37, 38, 43)\",\n borderRadius: \"0px\",\n display: \"flex\",\n justifyContent: \"space-around\",\n alignItems: \"center\",\n margin: \"5px 0px\",\n },\n randomAnimeParentWrapper: {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n backgroundColor: \"transparent\",\n color: \"white\",\n fontSize: \"14px\",\n cursor: \"pointer\",\n },\n languageToggleParentWrapper: {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n backgroundColor: \"transparent\",\n color: \"white\",\n fontSize: \"14px\",\n cursor: \"pointer\",\n },\n}));\n\nconst randomAnime = async (navigate, setSideBarState) => {\n const animeData = await Promise.all([axios.get(`${API_BASE_URL}/anime/random`)]);\n setSideBarState(false);\n navigate(`/anime/${animeData[0].data.slug}`);\n};\n\nfunction SideBarMenuLayout({ sideBarComponentConfig, setSideBarState }) {\n const { classes } = useStyles();\n const { language, languageToggle } = useLanguageStore(useShallow((state) => ({ language: state.language, languageToggle: state.toggle })));\n const navigate = useNavigate();\n return (\n <Paper w={\"100%\"}>\n <Paper className={classes.specialSectionWrapper}>\n <Paper onClick={() => randomAnime(navigate, setSideBarState)} className={classes.randomAnimeParentWrapper}>\n <IconArrowsShuffle className={classes.sideBarMenuIcons} />\n <Text mt={5}>Random</Text>\n </Paper>\n <Paper onClick={languageToggle} className={classes.languageToggleParentWrapper}>\n <Paper sx={{ display: \"flex\", fontSize: \"12px\", borderRadius: \"5px\" }}>\n <Paper py={3} px={5} c={\"white\"} sx={{ backgroundColor: language === \"English\" ? WATCHANIME_RED : \"transperent\", borderRadius: \"0px\" }}>\n EN\n </Paper>\n <Paper py={3} px={5} c={\"white\"} sx={{ backgroundColor: language === \"Default\" ? WATCHANIME_RED : \"transperent\", borderRadius: \"0px\" }}>\n JP\n </Paper>\n </Paper>\n <Text mt={5}>Anime Name</Text>\n </Paper>\n </Paper>\n <Paper sx={{ width: \"100%\", display: \"flex\", flexDirection: \"column\" }}>\n {sideBarComponentConfig.data.map((menuData, ind) => {\n return (\n <Paper key={ind} py={\"md\"} pl={\"16px\"} sx={{ borderBottom: \"1px solid rgba(255,255,255,.05)\" }}>\n <Anchor\n component={Link}\n to={`${menuData?.href ?? \"/\"}`}\n className={classes.sideBarMenuLayoutAnchor}\n onClick={(e) => {\n if (menuData.refs) {\n e.preventDefault();\n menuData.refs();\n setSideBarState(false);\n }\n if (menuData.href) {\n setSideBarState(false);\n }\n if (menuData.callBack) {\n e.preventDefault();\n menuData.callBack();\n setSideBarState(false);\n }\n }}\n >\n <Text>{menuData.label}</Text>\n </Anchor>\n </Paper>\n );\n })}\n </Paper>\n </Paper>\n );\n}\n\nexport default SideBarMenuLayout;\n","function _setPrototypeOf(t, e) {\n return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) {\n return t.__proto__ = e, t;\n }, _setPrototypeOf(t, e);\n}\nexport { _setPrototypeOf as default };","import setPrototypeOf from \"./setPrototypeOf.js\";\nfunction _inheritsLoose(t, o) {\n t.prototype = Object.create(o.prototype), t.prototype.constructor = t, setPrototypeOf(t, o);\n}\nexport { _inheritsLoose as default };","function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\nexport { _typeof as default };","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nfunction toPropertyKey(t) {\n var i = toPrimitive(t, \"string\");\n return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nexport { toPropertyKey as default };","import _typeof from \"./typeof.js\";\nfunction toPrimitive(t, r) {\n if (\"object\" != _typeof(t) || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != _typeof(i)) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nexport { toPrimitive as default };","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperty(e, r, t) {\n return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\nexport { _defineProperty as default };","import defineProperty from \"./defineProperty.js\";\nfunction ownKeys(e, r) {\n var t = Object.keys(e);\n if (Object.getOwnPropertySymbols) {\n var o = Object.getOwnPropertySymbols(e);\n r && (o = o.filter(function (r) {\n return Object.getOwnPropertyDescriptor(e, r).enumerable;\n })), t.push.apply(t, o);\n }\n return t;\n}\nfunction _objectSpread2(e) {\n for (var r = 1; r < arguments.length; r++) {\n var t = null != arguments[r] ? arguments[r] : {};\n r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {\n defineProperty(e, r, t[r]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {\n Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n });\n }\n return e;\n}\nexport { _objectSpread2 as default };","import _objectSpread from '@babel/runtime/helpers/esm/objectSpread2';\n\n/**\n * Adapted from React: https://github.com/facebook/react/blob/master/packages/shared/formatProdErrorMessage.js\n *\n * Do not require this module directly! Use normal throw error calls. These messages will be replaced with error codes\n * during build.\n * @param {number} code\n */\nfunction formatProdErrorMessage(code) {\n return \"Minified Redux error #\" + code + \"; visit https://redux.js.org/Errors?code=\" + code + \" for the full message or \" + 'use the non-minified dev environment for full errors. ';\n}\n\n// Inlined version of the `symbol-observable` polyfill\nvar $$observable = (function () {\n return typeof Symbol === 'function' && Symbol.observable || '@@observable';\n})();\n\n/**\n * These are private action types reserved by Redux.\n * For any unknown actions, you must return the current state.\n * If the current state is undefined, you must return the initial state.\n * Do not reference these action types directly in your code.\n */\nvar randomString = function randomString() {\n return Math.random().toString(36).substring(7).split('').join('.');\n};\n\nvar ActionTypes = {\n INIT: \"@@redux/INIT\" + randomString(),\n REPLACE: \"@@redux/REPLACE\" + randomString(),\n PROBE_UNKNOWN_ACTION: function PROBE_UNKNOWN_ACTION() {\n return \"@@redux/PROBE_UNKNOWN_ACTION\" + randomString();\n }\n};\n\n/**\n * @param {any} obj The object to inspect.\n * @returns {boolean} True if the argument appears to be a plain object.\n */\nfunction isPlainObject(obj) {\n if (typeof obj !== 'object' || obj === null) return false;\n var proto = obj;\n\n while (Object.getPrototypeOf(proto) !== null) {\n proto = Object.getPrototypeOf(proto);\n }\n\n return Object.getPrototypeOf(obj) === proto;\n}\n\n// Inlined / shortened version of `kindOf` from https://github.com/jonschlinkert/kind-of\nfunction miniKindOf(val) {\n if (val === void 0) return 'undefined';\n if (val === null) return 'null';\n var type = typeof val;\n\n switch (type) {\n case 'boolean':\n case 'string':\n case 'number':\n case 'symbol':\n case 'function':\n {\n return type;\n }\n }\n\n if (Array.isArray(val)) return 'array';\n if (isDate(val)) return 'date';\n if (isError(val)) return 'error';\n var constructorName = ctorName(val);\n\n switch (constructorName) {\n case 'Symbol':\n case 'Promise':\n case 'WeakMap':\n case 'WeakSet':\n case 'Map':\n case 'Set':\n return constructorName;\n } // other\n\n\n return type.slice(8, -1).toLowerCase().replace(/\\s/g, '');\n}\n\nfunction ctorName(val) {\n return typeof val.constructor === 'function' ? val.constructor.name : null;\n}\n\nfunction isError(val) {\n return val instanceof Error || typeof val.message === 'string' && val.constructor && typeof val.constructor.stackTraceLimit === 'number';\n}\n\nfunction isDate(val) {\n if (val instanceof Date) return true;\n return typeof val.toDateString === 'function' && typeof val.getDate === 'function' && typeof val.setDate === 'function';\n}\n\nfunction kindOf(val) {\n var typeOfVal = typeof val;\n\n if (process.env.NODE_ENV !== 'production') {\n typeOfVal = miniKindOf(val);\n }\n\n return typeOfVal;\n}\n\n/**\n * @deprecated\n *\n * **We recommend using the `configureStore` method\n * of the `@reduxjs/toolkit` package**, which replaces `createStore`.\n *\n * Redux Toolkit is our recommended approach for writing Redux logic today,\n * including store setup, reducers, data fetching, and more.\n *\n * **For more details, please read this Redux docs page:**\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * `configureStore` from Redux Toolkit is an improved version of `createStore` that\n * simplifies setup and helps avoid common bugs.\n *\n * You should not be using the `redux` core package by itself today, except for learning purposes.\n * The `createStore` method from the core `redux` package will not be removed, but we encourage\n * all users to migrate to using Redux Toolkit for all Redux code.\n *\n * If you want to use `createStore` without this visual deprecation warning, use\n * the `legacy_createStore` import instead:\n *\n * `import { legacy_createStore as createStore} from 'redux'`\n *\n */\n\nfunction createStore(reducer, preloadedState, enhancer) {\n var _ref2;\n\n if (typeof preloadedState === 'function' && typeof enhancer === 'function' || typeof enhancer === 'function' && typeof arguments[3] === 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(0) : 'It looks like you are passing several store enhancers to ' + 'createStore(). This is not supported. Instead, compose them ' + 'together to a single function. See https://redux.js.org/tutorials/fundamentals/part-4-store#creating-a-store-with-enhancers for an example.');\n }\n\n if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') {\n enhancer = preloadedState;\n preloadedState = undefined;\n }\n\n if (typeof enhancer !== 'undefined') {\n if (typeof enhancer !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(1) : \"Expected the enhancer to be a function. Instead, received: '\" + kindOf(enhancer) + \"'\");\n }\n\n return enhancer(createStore)(reducer, preloadedState);\n }\n\n if (typeof reducer !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(2) : \"Expected the root reducer to be a function. Instead, received: '\" + kindOf(reducer) + \"'\");\n }\n\n var currentReducer = reducer;\n var currentState = preloadedState;\n var currentListeners = [];\n var nextListeners = currentListeners;\n var isDispatching = false;\n /**\n * This makes a shallow copy of currentListeners so we can use\n * nextListeners as a temporary list while dispatching.\n *\n * This prevents any bugs around consumers calling\n * subscribe/unsubscribe in the middle of a dispatch.\n */\n\n function ensureCanMutateNextListeners() {\n if (nextListeners === currentListeners) {\n nextListeners = currentListeners.slice();\n }\n }\n /**\n * Reads the state tree managed by the store.\n *\n * @returns {any} The current state tree of your application.\n */\n\n\n function getState() {\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(3) : 'You may not call store.getState() while the reducer is executing. ' + 'The reducer has already received the state as an argument. ' + 'Pass it down from the top reducer instead of reading it from the store.');\n }\n\n return currentState;\n }\n /**\n * Adds a change listener. It will be called any time an action is dispatched,\n * and some part of the state tree may potentially have changed. You may then\n * call `getState()` to read the current state tree inside the callback.\n *\n * You may call `dispatch()` from a change listener, with the following\n * caveats:\n *\n * 1. The subscriptions are snapshotted just before every `dispatch()` call.\n * If you subscribe or unsubscribe while the listeners are being invoked, this\n * will not have any effect on the `dispatch()` that is currently in progress.\n * However, the next `dispatch()` call, whether nested or not, will use a more\n * recent snapshot of the subscription list.\n *\n * 2. The listener should not expect to see all state changes, as the state\n * might have been updated multiple times during a nested `dispatch()` before\n * the listener is called. It is, however, guaranteed that all subscribers\n * registered before the `dispatch()` started will be called with the latest\n * state by the time it exits.\n *\n * @param {Function} listener A callback to be invoked on every dispatch.\n * @returns {Function} A function to remove this change listener.\n */\n\n\n function subscribe(listener) {\n if (typeof listener !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(4) : \"Expected the listener to be a function. Instead, received: '\" + kindOf(listener) + \"'\");\n }\n\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(5) : 'You may not call store.subscribe() while the reducer is executing. ' + 'If you would like to be notified after the store has been updated, subscribe from a ' + 'component and invoke store.getState() in the callback to access the latest state. ' + 'See https://redux.js.org/api/store#subscribelistener for more details.');\n }\n\n var isSubscribed = true;\n ensureCanMutateNextListeners();\n nextListeners.push(listener);\n return function unsubscribe() {\n if (!isSubscribed) {\n return;\n }\n\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(6) : 'You may not unsubscribe from a store listener while the reducer is executing. ' + 'See https://redux.js.org/api/store#subscribelistener for more details.');\n }\n\n isSubscribed = false;\n ensureCanMutateNextListeners();\n var index = nextListeners.indexOf(listener);\n nextListeners.splice(index, 1);\n currentListeners = null;\n };\n }\n /**\n * Dispatches an action. It is the only way to trigger a state change.\n *\n * The `reducer` function, used to create the store, will be called with the\n * current state tree and the given `action`. Its return value will\n * be considered the **next** state of the tree, and the change listeners\n * will be notified.\n *\n * The base implementation only supports plain object actions. If you want to\n * dispatch a Promise, an Observable, a thunk, or something else, you need to\n * wrap your store creating function into the corresponding middleware. For\n * example, see the documentation for the `redux-thunk` package. Even the\n * middleware will eventually dispatch plain object actions using this method.\n *\n * @param {Object} action A plain object representing “what changed”. It is\n * a good idea to keep actions serializable so you can record and replay user\n * sessions, or use the time travelling `redux-devtools`. An action must have\n * a `type` property which may not be `undefined`. It is a good idea to use\n * string constants for action types.\n *\n * @returns {Object} For convenience, the same action object you dispatched.\n *\n * Note that, if you use a custom middleware, it may wrap `dispatch()` to\n * return something else (for example, a Promise you can await).\n */\n\n\n function dispatch(action) {\n if (!isPlainObject(action)) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(7) : \"Actions must be plain objects. Instead, the actual type was: '\" + kindOf(action) + \"'. You may need to add middleware to your store setup to handle dispatching other values, such as 'redux-thunk' to handle dispatching functions. See https://redux.js.org/tutorials/fundamentals/part-4-store#middleware and https://redux.js.org/tutorials/fundamentals/part-6-async-logic#using-the-redux-thunk-middleware for examples.\");\n }\n\n if (typeof action.type === 'undefined') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(8) : 'Actions may not have an undefined \"type\" property. You may have misspelled an action type string constant.');\n }\n\n if (isDispatching) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(9) : 'Reducers may not dispatch actions.');\n }\n\n try {\n isDispatching = true;\n currentState = currentReducer(currentState, action);\n } finally {\n isDispatching = false;\n }\n\n var listeners = currentListeners = nextListeners;\n\n for (var i = 0; i < listeners.length; i++) {\n var listener = listeners[i];\n listener();\n }\n\n return action;\n }\n /**\n * Replaces the reducer currently used by the store to calculate the state.\n *\n * You might need this if your app implements code splitting and you want to\n * load some of the reducers dynamically. You might also need this if you\n * implement a hot reloading mechanism for Redux.\n *\n * @param {Function} nextReducer The reducer for the store to use instead.\n * @returns {void}\n */\n\n\n function replaceReducer(nextReducer) {\n if (typeof nextReducer !== 'function') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(10) : \"Expected the nextReducer to be a function. Instead, received: '\" + kindOf(nextReducer));\n }\n\n currentReducer = nextReducer; // This action has a similiar effect to ActionTypes.INIT.\n // Any reducers that existed in both the new and old rootReducer\n // will receive the previous state. This effectively populates\n // the new state tree with any relevant data from the old one.\n\n dispatch({\n type: ActionTypes.REPLACE\n });\n }\n /**\n * Interoperability point for observable/reactive libraries.\n * @returns {observable} A minimal observable of state changes.\n * For more information, see the observable proposal:\n * https://github.com/tc39/proposal-observable\n */\n\n\n function observable() {\n var _ref;\n\n var outerSubscribe = subscribe;\n return _ref = {\n /**\n * The minimal observable subscription method.\n * @param {Object} observer Any object that can be used as an observer.\n * The observer object should have a `next` method.\n * @returns {subscription} An object with an `unsubscribe` method that can\n * be used to unsubscribe the observable from the store, and prevent further\n * emission of values from the observable.\n */\n subscribe: function subscribe(observer) {\n if (typeof observer !== 'object' || observer === null) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(11) : \"Expected the observer to be an object. Instead, received: '\" + kindOf(observer) + \"'\");\n }\n\n function observeState() {\n if (observer.next) {\n observer.next(getState());\n }\n }\n\n observeState();\n var unsubscribe = outerSubscribe(observeState);\n return {\n unsubscribe: unsubscribe\n };\n }\n }, _ref[$$observable] = function () {\n return this;\n }, _ref;\n } // When a store is created, an \"INIT\" action is dispatched so that every\n // reducer returns their initial state. This effectively populates\n // the initial state tree.\n\n\n dispatch({\n type: ActionTypes.INIT\n });\n return _ref2 = {\n dispatch: dispatch,\n subscribe: subscribe,\n getState: getState,\n replaceReducer: replaceReducer\n }, _ref2[$$observable] = observable, _ref2;\n}\n/**\n * Creates a Redux store that holds the state tree.\n *\n * **We recommend using `configureStore` from the\n * `@reduxjs/toolkit` package**, which replaces `createStore`:\n * **https://redux.js.org/introduction/why-rtk-is-redux-today**\n *\n * The only way to change the data in the store is to call `dispatch()` on it.\n *\n * There should only be a single store in your app. To specify how different\n * parts of the state tree respond to actions, you may combine several reducers\n * into a single reducer function by using `combineReducers`.\n *\n * @param {Function} reducer A function that returns the next state tree, given\n * the current state tree and the action to handle.\n *\n * @param {any} [preloadedState] The initial state. You may optionally specify it\n * to hydrate the state from the server in universal apps, or to restore a\n * previously serialized user session.\n * If you use `combineReducers` to produce the root reducer function, this must be\n * an object with the same shape as `combineReducers` keys.\n *\n * @param {Function} [enhancer] The store enhancer. You may optionally specify it\n * to enhance the store with third-party capabilities such as middleware,\n * time travel, persistence, etc. The only store enhancer that ships with Redux\n * is `applyMiddleware()`.\n *\n * @returns {Store} A Redux store that lets you read the state, dispatch actions\n * and subscribe to changes.\n */\n\nvar legacy_createStore = createStore;\n\n/**\n * Prints a warning in the console if it exists.\n *\n * @param {String} message The warning message.\n * @returns {void}\n */\nfunction warning(message) {\n /* eslint-disable no-console */\n if (typeof console !== 'undefined' && typeof console.error === 'function') {\n console.error(message);\n }\n /* eslint-enable no-console */\n\n\n try {\n // This error was thrown as a convenience so that if you enable\n // \"break on all exceptions\" in your console,\n // it would pause the execution at this line.\n throw new Error(message);\n } catch (e) {} // eslint-disable-line no-empty\n\n}\n\nfunction getUnexpectedStateShapeWarningMessage(inputState, reducers, action, unexpectedKeyCache) {\n var reducerKeys = Object.keys(reducers);\n var argumentName = action && action.type === ActionTypes.INIT ? 'preloadedState argument passed to createStore' : 'previous state received by the reducer';\n\n if (reducerKeys.length === 0) {\n return 'Store does not have a valid reducer. Make sure the argument passed ' + 'to combineReducers is an object whose values are reducers.';\n }\n\n if (!isPlainObject(inputState)) {\n return \"The \" + argumentName + \" has unexpected type of \\\"\" + kindOf(inputState) + \"\\\". Expected argument to be an object with the following \" + (\"keys: \\\"\" + reducerKeys.join('\", \"') + \"\\\"\");\n }\n\n var unexpectedKeys = Object.keys(inputState).filter(function (key) {\n return !reducers.hasOwnProperty(key) && !unexpectedKeyCache[key];\n });\n unexpectedKeys.forEach(function (key) {\n unexpectedKeyCache[key] = true;\n });\n if (action && action.type === ActionTypes.REPLACE) return;\n\n if (unexpectedKeys.length > 0) {\n return \"Unexpected \" + (unexpectedKeys.length > 1 ? 'keys' : 'key') + \" \" + (\"\\\"\" + unexpectedKeys.join('\", \"') + \"\\\" found in \" + argumentName + \". \") + \"Expected to find one of the known reducer keys instead: \" + (\"\\\"\" + reducerKeys.join('\", \"') + \"\\\". Unexpected keys will be ignored.\");\n }\n}\n\nfunction assertReducerShape(reducers) {\n Object.keys(reducers).forEach(function (key) {\n var reducer = reducers[key];\n var initialState = reducer(undefined, {\n type: ActionTypes.INIT\n });\n\n if (typeof initialState === 'undefined') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(12) : \"The slice reducer for key \\\"\" + key + \"\\\" returned undefined during initialization. \" + \"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\n if (typeof reducer(undefined, {\n type: ActionTypes.PROBE_UNKNOWN_ACTION()\n }) === 'undefined') {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(13) : \"The slice reducer for key \\\"\" + key + \"\\\" returned undefined when probed with a random type. \" + (\"Don't try to handle '\" + ActionTypes.INIT + \"' or other actions in \\\"redux/*\\\" \") + \"namespace. They are considered private. Instead, you must return the \" + \"current state for any unknown actions, unless it is undefined, \" + \"in which case you must return the initial state, regardless of the \" + \"action type. The initial state may not be undefined, but can be null.\");\n }\n });\n}\n/**\n * Turns an object whose values are different reducer functions, into a single\n * reducer function. It will call every child reducer, and gather their results\n * into a single state object, whose keys correspond to the keys of the passed\n * reducer functions.\n *\n * @param {Object} reducers An object whose values correspond to different\n * reducer functions that need to be combined into one. One handy way to obtain\n * it is to use ES6 `import * as reducers` syntax. The reducers may never return\n * undefined for any action. Instead, they should return their initial state\n * if the state passed to them was undefined, and the current state for any\n * unrecognized action.\n *\n * @returns {Function} A reducer function that invokes every reducer inside the\n * passed object, and builds a state object with the same shape.\n */\n\n\nfunction combineReducers(reducers) {\n var reducerKeys = Object.keys(reducers);\n var finalReducers = {};\n\n for (var i = 0; i < reducerKeys.length; i++) {\n var key = reducerKeys[i];\n\n if (process.env.NODE_ENV !== 'production') {\n if (typeof reducers[key] === 'undefined') {\n warning(\"No reducer provided for key \\\"\" + key + \"\\\"\");\n }\n }\n\n if (typeof reducers[key] === 'function') {\n finalReducers[key] = reducers[key];\n }\n }\n\n var finalReducerKeys = Object.keys(finalReducers); // This is used to make sure we don't warn about the same\n // keys multiple times.\n\n var unexpectedKeyCache;\n\n if (process.env.NODE_ENV !== 'production') {\n unexpectedKeyCache = {};\n }\n\n var shapeAssertionError;\n\n try {\n assertReducerShape(finalReducers);\n } catch (e) {\n shapeAssertionError = e;\n }\n\n return function combination(state, action) {\n if (state === void 0) {\n state = {};\n }\n\n if (shapeAssertionError) {\n throw shapeAssertionError;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n var warningMessage = getUnexpectedStateShapeWarningMessage(state, finalReducers, action, unexpectedKeyCache);\n\n if (warningMessage) {\n warning(warningMessage);\n }\n }\n\n var hasChanged = false;\n var nextState = {};\n\n for (var _i = 0; _i < finalReducerKeys.length; _i++) {\n var _key = finalReducerKeys[_i];\n var reducer = finalReducers[_key];\n var previousStateForKey = state[_key];\n var nextStateForKey = reducer(previousStateForKey, action);\n\n if (typeof nextStateForKey === 'undefined') {\n var actionType = action && action.type;\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(14) : \"When called with an action of type \" + (actionType ? \"\\\"\" + String(actionType) + \"\\\"\" : '(unknown type)') + \", the slice reducer for key \\\"\" + _key + \"\\\" returned undefined. \" + \"To ignore an action, you must explicitly return the previous state. \" + \"If you want this reducer to hold no value, you can return null instead of undefined.\");\n }\n\n nextState[_key] = nextStateForKey;\n hasChanged = hasChanged || nextStateForKey !== previousStateForKey;\n }\n\n hasChanged = hasChanged || finalReducerKeys.length !== Object.keys(state).length;\n return hasChanged ? nextState : state;\n };\n}\n\nfunction bindActionCreator(actionCreator, dispatch) {\n return function () {\n return dispatch(actionCreator.apply(this, arguments));\n };\n}\n/**\n * Turns an object whose values are action creators, into an object with the\n * same keys, but with every function wrapped into a `dispatch` call so they\n * may be invoked directly. This is just a convenience method, as you can call\n * `store.dispatch(MyActionCreators.doSomething())` yourself just fine.\n *\n * For convenience, you can also pass an action creator as the first argument,\n * and get a dispatch wrapped function in return.\n *\n * @param {Function|Object} actionCreators An object whose values are action\n * creator functions. One handy way to obtain it is to use ES6 `import * as`\n * syntax. You may also pass a single function.\n *\n * @param {Function} dispatch The `dispatch` function available on your Redux\n * store.\n *\n * @returns {Function|Object} The object mimicking the original object, but with\n * every action creator wrapped into the `dispatch` call. If you passed a\n * function as `actionCreators`, the return value will also be a single\n * function.\n */\n\n\nfunction bindActionCreators(actionCreators, dispatch) {\n if (typeof actionCreators === 'function') {\n return bindActionCreator(actionCreators, dispatch);\n }\n\n if (typeof actionCreators !== 'object' || actionCreators === null) {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(16) : \"bindActionCreators expected an object or a function, but instead received: '\" + kindOf(actionCreators) + \"'. \" + \"Did you write \\\"import ActionCreators from\\\" instead of \\\"import * as ActionCreators from\\\"?\");\n }\n\n var boundActionCreators = {};\n\n for (var key in actionCreators) {\n var actionCreator = actionCreators[key];\n\n if (typeof actionCreator === 'function') {\n boundActionCreators[key] = bindActionCreator(actionCreator, dispatch);\n }\n }\n\n return boundActionCreators;\n}\n\n/**\n * Composes single-argument functions from right to left. The rightmost\n * function can take multiple arguments as it provides the signature for\n * the resulting composite function.\n *\n * @param {...Function} funcs The functions to compose.\n * @returns {Function} A function obtained by composing the argument functions\n * from right to left. For example, compose(f, g, h) is identical to doing\n * (...args) => f(g(h(...args))).\n */\nfunction compose() {\n for (var _len = arguments.length, funcs = new Array(_len), _key = 0; _key < _len; _key++) {\n funcs[_key] = arguments[_key];\n }\n\n if (funcs.length === 0) {\n return function (arg) {\n return arg;\n };\n }\n\n if (funcs.length === 1) {\n return funcs[0];\n }\n\n return funcs.reduce(function (a, b) {\n return function () {\n return a(b.apply(void 0, arguments));\n };\n });\n}\n\n/**\n * Creates a store enhancer that applies middleware to the dispatch method\n * of the Redux store. This is handy for a variety of tasks, such as expressing\n * asynchronous actions in a concise manner, or logging every action payload.\n *\n * See `redux-thunk` package as an example of the Redux middleware.\n *\n * Because middleware is potentially asynchronous, this should be the first\n * store enhancer in the composition chain.\n *\n * Note that each middleware will be given the `dispatch` and `getState` functions\n * as named arguments.\n *\n * @param {...Function} middlewares The middleware chain to be applied.\n * @returns {Function} A store enhancer applying the middleware.\n */\n\nfunction applyMiddleware() {\n for (var _len = arguments.length, middlewares = new Array(_len), _key = 0; _key < _len; _key++) {\n middlewares[_key] = arguments[_key];\n }\n\n return function (createStore) {\n return function () {\n var store = createStore.apply(void 0, arguments);\n\n var _dispatch = function dispatch() {\n throw new Error(process.env.NODE_ENV === \"production\" ? formatProdErrorMessage(15) : 'Dispatching while constructing your middleware is not allowed. ' + 'Other middleware would not be applied to this dispatch.');\n };\n\n var middlewareAPI = {\n getState: store.getState,\n dispatch: function dispatch() {\n return _dispatch.apply(void 0, arguments);\n }\n };\n var chain = middlewares.map(function (middleware) {\n return middleware(middlewareAPI);\n });\n _dispatch = compose.apply(void 0, chain)(store.dispatch);\n return _objectSpread(_objectSpread({}, store), {}, {\n dispatch: _dispatch\n });\n };\n };\n}\n\nexport { ActionTypes as __DO_NOT_USE__ActionTypes, applyMiddleware, bindActionCreators, combineReducers, compose, createStore, legacy_createStore };\n","import React from 'react';\nexport var ReactReduxContext = /*#__PURE__*/React.createContext(null);\n\nif (process.env.NODE_ENV !== 'production') {\n ReactReduxContext.displayName = 'ReactRedux';\n}\n\nexport default ReactReduxContext;","// Default to a dummy \"batch\" implementation that just runs the callback\nfunction defaultNoopBatch(callback) {\n callback();\n}\n\nvar batch = defaultNoopBatch; // Allow injecting another batching function later\n\nexport var setBatch = function setBatch(newBatch) {\n return batch = newBatch;\n}; // Supply a getter just to skip dealing with ESM bindings\n\nexport var getBatch = function getBatch() {\n return batch;\n};","import { getBatch } from './batch'; // encapsulates the subscription logic for connecting a component to the redux store, as\n// well as nesting subscriptions of descendant components, so that we can ensure the\n// ancestor components re-render before descendants\n\nfunction createListenerCollection() {\n var batch = getBatch();\n var first = null;\n var last = null;\n return {\n clear: function clear() {\n first = null;\n last = null;\n },\n notify: function notify() {\n batch(function () {\n var listener = first;\n\n while (listener) {\n listener.callback();\n listener = listener.next;\n }\n });\n },\n get: function get() {\n var listeners = [];\n var listener = first;\n\n while (listener) {\n listeners.push(listener);\n listener = listener.next;\n }\n\n return listeners;\n },\n subscribe: function subscribe(callback) {\n var isSubscribed = true;\n var listener = last = {\n callback: callback,\n next: null,\n prev: last\n };\n\n if (listener.prev) {\n listener.prev.next = listener;\n } else {\n first = listener;\n }\n\n return function unsubscribe() {\n if (!isSubscribed || first === null) return;\n isSubscribed = false;\n\n if (listener.next) {\n listener.next.prev = listener.prev;\n } else {\n last = listener.prev;\n }\n\n if (listener.prev) {\n listener.prev.next = listener.next;\n } else {\n first = listener.next;\n }\n };\n }\n };\n}\n\nvar nullListeners = {\n notify: function notify() {},\n get: function get() {\n return [];\n }\n};\nexport function createSubscription(store, parentSub) {\n var unsubscribe;\n var listeners = nullListeners;\n\n function addNestedSub(listener) {\n trySubscribe();\n return listeners.subscribe(listener);\n }\n\n function notifyNestedSubs() {\n listeners.notify();\n }\n\n function handleChangeWrapper() {\n if (subscription.onStateChange) {\n subscription.onStateChange();\n }\n }\n\n function isSubscribed() {\n return Boolean(unsubscribe);\n }\n\n function trySubscribe() {\n if (!unsubscribe) {\n unsubscribe = parentSub ? parentSub.addNestedSub(handleChangeWrapper) : store.subscribe(handleChangeWrapper);\n listeners = createListenerCollection();\n }\n }\n\n function tryUnsubscribe() {\n if (unsubscribe) {\n unsubscribe();\n unsubscribe = undefined;\n listeners.clear();\n listeners = nullListeners;\n }\n }\n\n var subscription = {\n addNestedSub: addNestedSub,\n notifyNestedSubs: notifyNestedSubs,\n handleChangeWrapper: handleChangeWrapper,\n isSubscribed: isSubscribed,\n trySubscribe: trySubscribe,\n tryUnsubscribe: tryUnsubscribe,\n getListeners: function getListeners() {\n return listeners;\n }\n };\n return subscription;\n}","import { useEffect, useLayoutEffect } from 'react'; // React currently throws a warning when using useLayoutEffect on the server.\n// To get around it, we can conditionally useEffect on the server (no-op) and\n// useLayoutEffect in the browser. We need useLayoutEffect to ensure the store\n// subscription callback always has the selector from the latest render commit\n// available, otherwise a store update may happen between render and the effect,\n// which may cause missed updates; we also must ensure the store subscription\n// is created synchronously, otherwise a store update may occur before the\n// subscription is created and an inconsistent state may be observed\n\nexport var useIsomorphicLayoutEffect = typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined' ? useLayoutEffect : useEffect;","import React, { useMemo } from 'react';\nimport PropTypes from 'prop-types';\nimport { ReactReduxContext } from './Context';\nimport { createSubscription } from '../utils/Subscription';\nimport { useIsomorphicLayoutEffect } from '../utils/useIsomorphicLayoutEffect';\n\nfunction Provider(_ref) {\n var store = _ref.store,\n context = _ref.context,\n children = _ref.children;\n var contextValue = useMemo(function () {\n var subscription = createSubscription(store);\n return {\n store: store,\n subscription: subscription\n };\n }, [store]);\n var previousState = useMemo(function () {\n return store.getState();\n }, [store]);\n useIsomorphicLayoutEffect(function () {\n var subscription = contextValue.subscription;\n subscription.onStateChange = subscription.notifyNestedSubs;\n subscription.trySubscribe();\n\n if (previousState !== store.getState()) {\n subscription.notifyNestedSubs();\n }\n\n return function () {\n subscription.tryUnsubscribe();\n subscription.onStateChange = null;\n };\n }, [contextValue, previousState]);\n var Context = context || ReactReduxContext;\n return /*#__PURE__*/React.createElement(Context.Provider, {\n value: contextValue\n }, children);\n}\n\nif (process.env.NODE_ENV !== 'production') {\n Provider.propTypes = {\n store: PropTypes.shape({\n subscribe: PropTypes.func.isRequired,\n dispatch: PropTypes.func.isRequired,\n getState: PropTypes.func.isRequired\n }),\n context: PropTypes.object,\n children: PropTypes.any\n };\n}\n\nexport default Provider;","function _objectWithoutPropertiesLoose(r, e) {\n if (null == r) return {};\n var t = {};\n for (var n in r) if ({}.hasOwnProperty.call(r, n)) {\n if (-1 !== e.indexOf(n)) continue;\n t[n] = r[n];\n }\n return t;\n}\nexport { _objectWithoutPropertiesLoose as default };","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nvar _excluded = [\"getDisplayName\", \"methodName\", \"renderCountProp\", \"shouldHandleStateChanges\", \"storeKey\", \"withRef\", \"forwardRef\", \"context\"],\n _excluded2 = [\"reactReduxForwardedRef\"];\nimport hoistStatics from 'hoist-non-react-statics';\nimport React, { useContext, useMemo, useRef, useReducer } from 'react';\nimport { isValidElementType, isContextConsumer } from 'react-is';\nimport { createSubscription } from '../utils/Subscription';\nimport { useIsomorphicLayoutEffect } from '../utils/useIsomorphicLayoutEffect';\nimport { ReactReduxContext } from './Context'; // Define some constant arrays just to avoid re-creating these\n\nvar EMPTY_ARRAY = [];\nvar NO_SUBSCRIPTION_ARRAY = [null, null];\n\nvar stringifyComponent = function stringifyComponent(Comp) {\n try {\n return JSON.stringify(Comp);\n } catch (err) {\n return String(Comp);\n }\n};\n\nfunction storeStateUpdatesReducer(state, action) {\n var updateCount = state[1];\n return [action.payload, updateCount + 1];\n}\n\nfunction useIsomorphicLayoutEffectWithArgs(effectFunc, effectArgs, dependencies) {\n useIsomorphicLayoutEffect(function () {\n return effectFunc.apply(void 0, effectArgs);\n }, dependencies);\n}\n\nfunction captureWrapperProps(lastWrapperProps, lastChildProps, renderIsScheduled, wrapperProps, actualChildProps, childPropsFromStoreUpdate, notifyNestedSubs) {\n // We want to capture the wrapper props and child props we used for later comparisons\n lastWrapperProps.current = wrapperProps;\n lastChildProps.current = actualChildProps;\n renderIsScheduled.current = false; // If the render was from a store update, clear out that reference and cascade the subscriber update\n\n if (childPropsFromStoreUpdate.current) {\n childPropsFromStoreUpdate.current = null;\n notifyNestedSubs();\n }\n}\n\nfunction subscribeUpdates(shouldHandleStateChanges, store, subscription, childPropsSelector, lastWrapperProps, lastChildProps, renderIsScheduled, childPropsFromStoreUpdate, notifyNestedSubs, forceComponentUpdateDispatch) {\n // If we're not subscribed to the store, nothing to do here\n if (!shouldHandleStateChanges) return; // Capture values for checking if and when this component unmounts\n\n var didUnsubscribe = false;\n var lastThrownError = null; // We'll run this callback every time a store subscription update propagates to this component\n\n var checkForUpdates = function checkForUpdates() {\n if (didUnsubscribe) {\n // Don't run stale listeners.\n // Redux doesn't guarantee unsubscriptions happen until next dispatch.\n return;\n }\n\n var latestStoreState = store.getState();\n var newChildProps, error;\n\n try {\n // Actually run the selector with the most recent store state and wrapper props\n // to determine what the child props should be\n newChildProps = childPropsSelector(latestStoreState, lastWrapperProps.current);\n } catch (e) {\n error = e;\n lastThrownError = e;\n }\n\n if (!error) {\n lastThrownError = null;\n } // If the child props haven't changed, nothing to do here - cascade the subscription update\n\n\n if (newChildProps === lastChildProps.current) {\n if (!renderIsScheduled.current) {\n notifyNestedSubs();\n }\n } else {\n // Save references to the new child props. Note that we track the \"child props from store update\"\n // as a ref instead of a useState/useReducer because we need a way to determine if that value has\n // been processed. If this went into useState/useReducer, we couldn't clear out the value without\n // forcing another re-render, which we don't want.\n lastChildProps.current = newChildProps;\n childPropsFromStoreUpdate.current = newChildProps;\n renderIsScheduled.current = true; // If the child props _did_ change (or we caught an error), this wrapper component needs to re-render\n\n forceComponentUpdateDispatch({\n type: 'STORE_UPDATED',\n payload: {\n error: error\n }\n });\n }\n }; // Actually subscribe to the nearest connected ancestor (or store)\n\n\n subscription.onStateChange = checkForUpdates;\n subscription.trySubscribe(); // Pull data from the store after first render in case the store has\n // changed since we began.\n\n checkForUpdates();\n\n var unsubscribeWrapper = function unsubscribeWrapper() {\n didUnsubscribe = true;\n subscription.tryUnsubscribe();\n subscription.onStateChange = null;\n\n if (lastThrownError) {\n // It's possible that we caught an error due to a bad mapState function, but the\n // parent re-rendered without this component and we're about to unmount.\n // This shouldn't happen as long as we do top-down subscriptions correctly, but\n // if we ever do those wrong, this throw will surface the error in our tests.\n // In that case, throw the error from here so it doesn't get lost.\n throw lastThrownError;\n }\n };\n\n return unsubscribeWrapper;\n}\n\nvar initStateUpdates = function initStateUpdates() {\n return [null, 0];\n};\n\nexport default function connectAdvanced(\n/*\r\n selectorFactory is a func that is responsible for returning the selector function used to\r\n compute new props from state, props, and dispatch. For example:\r\n export default connectAdvanced((dispatch, options) => (state, props) => ({\r\n thing: state.things[props.thingId],\r\n saveThing: fields => dispatch(actionCreators.saveThing(props.thingId, fields)),\r\n }))(YourComponent)\r\n Access to dispatch is provided to the factory so selectorFactories can bind actionCreators\r\n outside of their selector as an optimization. Options passed to connectAdvanced are passed to\r\n the selectorFactory, along with displayName and WrappedComponent, as the second argument.\r\n Note that selectorFactory is responsible for all caching/memoization of inbound and outbound\r\n props. Do not use connectAdvanced directly without memoizing results between calls to your\r\n selector, otherwise the Connect component will re-render on every state or props change.\r\n*/\nselectorFactory, // options object:\n_ref) {\n if (_ref === void 0) {\n _ref = {};\n }\n\n var _ref2 = _ref,\n _ref2$getDisplayName = _ref2.getDisplayName,\n getDisplayName = _ref2$getDisplayName === void 0 ? function (name) {\n return \"ConnectAdvanced(\" + name + \")\";\n } : _ref2$getDisplayName,\n _ref2$methodName = _ref2.methodName,\n methodName = _ref2$methodName === void 0 ? 'connectAdvanced' : _ref2$methodName,\n _ref2$renderCountProp = _ref2.renderCountProp,\n renderCountProp = _ref2$renderCountProp === void 0 ? undefined : _ref2$renderCountProp,\n _ref2$shouldHandleSta = _ref2.shouldHandleStateChanges,\n shouldHandleStateChanges = _ref2$shouldHandleSta === void 0 ? true : _ref2$shouldHandleSta,\n _ref2$storeKey = _ref2.storeKey,\n storeKey = _ref2$storeKey === void 0 ? 'store' : _ref2$storeKey,\n _ref2$withRef = _ref2.withRef,\n withRef = _ref2$withRef === void 0 ? false : _ref2$withRef,\n _ref2$forwardRef = _ref2.forwardRef,\n forwardRef = _ref2$forwardRef === void 0 ? false : _ref2$forwardRef,\n _ref2$context = _ref2.context,\n context = _ref2$context === void 0 ? ReactReduxContext : _ref2$context,\n connectOptions = _objectWithoutPropertiesLoose(_ref2, _excluded);\n\n if (process.env.NODE_ENV !== 'production') {\n if (renderCountProp !== undefined) {\n throw new Error(\"renderCountProp is removed. render counting is built into the latest React Dev Tools profiling extension\");\n }\n\n if (withRef) {\n throw new Error('withRef is removed. To access the wrapped instance, use a ref on the connected component');\n }\n\n var customStoreWarningMessage = 'To use a custom Redux store for specific components, create a custom React context with ' + \"React.createContext(), and pass the context object to React Redux's Provider and specific components\" + ' like: <Provider context={MyContext}><ConnectedComponent context={MyContext} /></Provider>. ' + 'You may also pass a {context : MyContext} option to connect';\n\n if (storeKey !== 'store') {\n throw new Error('storeKey has been removed and does not do anything. ' + customStoreWarningMessage);\n }\n }\n\n var Context = context;\n return function wrapWithConnect(WrappedComponent) {\n if (process.env.NODE_ENV !== 'production' && !isValidElementType(WrappedComponent)) {\n throw new Error(\"You must pass a component to the function returned by \" + (methodName + \". Instead received \" + stringifyComponent(WrappedComponent)));\n }\n\n var wrappedComponentName = WrappedComponent.displayName || WrappedComponent.name || 'Component';\n var displayName = getDisplayName(wrappedComponentName);\n\n var selectorFactoryOptions = _extends({}, connectOptions, {\n getDisplayName: getDisplayName,\n methodName: methodName,\n renderCountProp: renderCountProp,\n shouldHandleStateChanges: shouldHandleStateChanges,\n storeKey: storeKey,\n displayName: displayName,\n wrappedComponentName: wrappedComponentName,\n WrappedComponent: WrappedComponent\n });\n\n var pure = connectOptions.pure;\n\n function createChildSelector(store) {\n return selectorFactory(store.dispatch, selectorFactoryOptions);\n } // If we aren't running in \"pure\" mode, we don't want to memoize values.\n // To avoid conditionally calling hooks, we fall back to a tiny wrapper\n // that just executes the given callback immediately.\n\n\n var usePureOnlyMemo = pure ? useMemo : function (callback) {\n return callback();\n };\n\n function ConnectFunction(props) {\n var _useMemo = useMemo(function () {\n // Distinguish between actual \"data\" props that were passed to the wrapper component,\n // and values needed to control behavior (forwarded refs, alternate context instances).\n // To maintain the wrapperProps object reference, memoize this destructuring.\n var reactReduxForwardedRef = props.reactReduxForwardedRef,\n wrapperProps = _objectWithoutPropertiesLoose(props, _excluded2);\n\n return [props.context, reactReduxForwardedRef, wrapperProps];\n }, [props]),\n propsContext = _useMemo[0],\n reactReduxForwardedRef = _useMemo[1],\n wrapperProps = _useMemo[2];\n\n var ContextToUse = useMemo(function () {\n // Users may optionally pass in a custom context instance to use instead of our ReactReduxContext.\n // Memoize the check that determines which context instance we should use.\n return propsContext && propsContext.Consumer && isContextConsumer( /*#__PURE__*/React.createElement(propsContext.Consumer, null)) ? propsContext : Context;\n }, [propsContext, Context]); // Retrieve the store and ancestor subscription via context, if available\n\n var contextValue = useContext(ContextToUse); // The store _must_ exist as either a prop or in context.\n // We'll check to see if it _looks_ like a Redux store first.\n // This allows us to pass through a `store` prop that is just a plain value.\n\n var didStoreComeFromProps = Boolean(props.store) && Boolean(props.store.getState) && Boolean(props.store.dispatch);\n var didStoreComeFromContext = Boolean(contextValue) && Boolean(contextValue.store);\n\n if (process.env.NODE_ENV !== 'production' && !didStoreComeFromProps && !didStoreComeFromContext) {\n throw new Error(\"Could not find \\\"store\\\" in the context of \" + (\"\\\"\" + displayName + \"\\\". Either wrap the root component in a <Provider>, \") + \"or pass a custom React context provider to <Provider> and the corresponding \" + (\"React context consumer to \" + displayName + \" in connect options.\"));\n } // Based on the previous check, one of these must be true\n\n\n var store = didStoreComeFromProps ? props.store : contextValue.store;\n var childPropsSelector = useMemo(function () {\n // The child props selector needs the store reference as an input.\n // Re-create this selector whenever the store changes.\n return createChildSelector(store);\n }, [store]);\n\n var _useMemo2 = useMemo(function () {\n if (!shouldHandleStateChanges) return NO_SUBSCRIPTION_ARRAY; // This Subscription's source should match where store came from: props vs. context. A component\n // connected to the store via props shouldn't use subscription from context, or vice versa.\n\n // This Subscription's source should match where store came from: props vs. context. A component\n // connected to the store via props shouldn't use subscription from context, or vice versa.\n var subscription = createSubscription(store, didStoreComeFromProps ? null : contextValue.subscription); // `notifyNestedSubs` is duplicated to handle the case where the component is unmounted in\n // the middle of the notification loop, where `subscription` will then be null. This can\n // probably be avoided if Subscription's listeners logic is changed to not call listeners\n // that have been unsubscribed in the middle of the notification loop.\n\n // `notifyNestedSubs` is duplicated to handle the case where the component is unmounted in\n // the middle of the notification loop, where `subscription` will then be null. This can\n // probably be avoided if Subscription's listeners logic is changed to not call listeners\n // that have been unsubscribed in the middle of the notification loop.\n var notifyNestedSubs = subscription.notifyNestedSubs.bind(subscription);\n return [subscription, notifyNestedSubs];\n }, [store, didStoreComeFromProps, contextValue]),\n subscription = _useMemo2[0],\n notifyNestedSubs = _useMemo2[1]; // Determine what {store, subscription} value should be put into nested context, if necessary,\n // and memoize that value to avoid unnecessary context updates.\n\n\n var overriddenContextValue = useMemo(function () {\n if (didStoreComeFromProps) {\n // This component is directly subscribed to a store from props.\n // We don't want descendants reading from this store - pass down whatever\n // the existing context value is from the nearest connected ancestor.\n return contextValue;\n } // Otherwise, put this component's subscription instance into context, so that\n // connected descendants won't update until after this component is done\n\n\n return _extends({}, contextValue, {\n subscription: subscription\n });\n }, [didStoreComeFromProps, contextValue, subscription]); // We need to force this wrapper component to re-render whenever a Redux store update\n // causes a change to the calculated child component props (or we caught an error in mapState)\n\n var _useReducer = useReducer(storeStateUpdatesReducer, EMPTY_ARRAY, initStateUpdates),\n _useReducer$ = _useReducer[0],\n previousStateUpdateResult = _useReducer$[0],\n forceComponentUpdateDispatch = _useReducer[1]; // Propagate any mapState/mapDispatch errors upwards\n\n\n if (previousStateUpdateResult && previousStateUpdateResult.error) {\n throw previousStateUpdateResult.error;\n } // Set up refs to coordinate values between the subscription effect and the render logic\n\n\n var lastChildProps = useRef();\n var lastWrapperProps = useRef(wrapperProps);\n var childPropsFromStoreUpdate = useRef();\n var renderIsScheduled = useRef(false);\n var actualChildProps = usePureOnlyMemo(function () {\n // Tricky logic here:\n // - This render may have been triggered by a Redux store update that produced new child props\n // - However, we may have gotten new wrapper props after that\n // If we have new child props, and the same wrapper props, we know we should use the new child props as-is.\n // But, if we have new wrapper props, those might change the child props, so we have to recalculate things.\n // So, we'll use the child props from store update only if the wrapper props are the same as last time.\n if (childPropsFromStoreUpdate.current && wrapperProps === lastWrapperProps.current) {\n return childPropsFromStoreUpdate.current;\n } // TODO We're reading the store directly in render() here. Bad idea?\n // This will likely cause Bad Things (TM) to happen in Concurrent Mode.\n // Note that we do this because on renders _not_ caused by store updates, we need the latest store state\n // to determine what the child props should be.\n\n\n return childPropsSelector(store.getState(), wrapperProps);\n }, [store, previousStateUpdateResult, wrapperProps]); // We need this to execute synchronously every time we re-render. However, React warns\n // about useLayoutEffect in SSR, so we try to detect environment and fall back to\n // just useEffect instead to avoid the warning, since neither will run anyway.\n\n useIsomorphicLayoutEffectWithArgs(captureWrapperProps, [lastWrapperProps, lastChildProps, renderIsScheduled, wrapperProps, actualChildProps, childPropsFromStoreUpdate, notifyNestedSubs]); // Our re-subscribe logic only runs when the store/subscription setup changes\n\n useIsomorphicLayoutEffectWithArgs(subscribeUpdates, [shouldHandleStateChanges, store, subscription, childPropsSelector, lastWrapperProps, lastChildProps, renderIsScheduled, childPropsFromStoreUpdate, notifyNestedSubs, forceComponentUpdateDispatch], [store, subscription, childPropsSelector]); // Now that all that's done, we can finally try to actually render the child component.\n // We memoize the elements for the rendered child component as an optimization.\n\n var renderedWrappedComponent = useMemo(function () {\n return /*#__PURE__*/React.createElement(WrappedComponent, _extends({}, actualChildProps, {\n ref: reactReduxForwardedRef\n }));\n }, [reactReduxForwardedRef, WrappedComponent, actualChildProps]); // If React sees the exact same element reference as last time, it bails out of re-rendering\n // that child, same as if it was wrapped in React.memo() or returned false from shouldComponentUpdate.\n\n var renderedChild = useMemo(function () {\n if (shouldHandleStateChanges) {\n // If this component is subscribed to store updates, we need to pass its own\n // subscription instance down to our descendants. That means rendering the same\n // Context instance, and putting a different value into the context.\n return /*#__PURE__*/React.createElement(ContextToUse.Provider, {\n value: overriddenContextValue\n }, renderedWrappedComponent);\n }\n\n return renderedWrappedComponent;\n }, [ContextToUse, renderedWrappedComponent, overriddenContextValue]);\n return renderedChild;\n } // If we're in \"pure\" mode, ensure our wrapper component only re-renders when incoming props have changed.\n\n\n var Connect = pure ? React.memo(ConnectFunction) : ConnectFunction;\n Connect.WrappedComponent = WrappedComponent;\n Connect.displayName = ConnectFunction.displayName = displayName;\n\n if (forwardRef) {\n var forwarded = React.forwardRef(function forwardConnectRef(props, ref) {\n return /*#__PURE__*/React.createElement(Connect, _extends({}, props, {\n reactReduxForwardedRef: ref\n }));\n });\n forwarded.displayName = displayName;\n forwarded.WrappedComponent = WrappedComponent;\n return hoistStatics(forwarded, WrappedComponent);\n }\n\n return hoistStatics(Connect, WrappedComponent);\n };\n}","function is(x, y) {\n if (x === y) {\n return x !== 0 || y !== 0 || 1 / x === 1 / y;\n } else {\n return x !== x && y !== y;\n }\n}\n\nexport default function shallowEqual(objA, objB) {\n if (is(objA, objB)) return true;\n\n if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {\n return false;\n }\n\n var keysA = Object.keys(objA);\n var keysB = Object.keys(objB);\n if (keysA.length !== keysB.length) return false;\n\n for (var i = 0; i < keysA.length; i++) {\n if (!Object.prototype.hasOwnProperty.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) {\n return false;\n }\n }\n\n return true;\n}","import verifyPlainObject from '../utils/verifyPlainObject';\nexport function wrapMapToPropsConstant(getConstant) {\n return function initConstantSelector(dispatch, options) {\n var constant = getConstant(dispatch, options);\n\n function constantSelector() {\n return constant;\n }\n\n constantSelector.dependsOnOwnProps = false;\n return constantSelector;\n };\n} // dependsOnOwnProps is used by createMapToPropsProxy to determine whether to pass props as args\n// to the mapToProps function being wrapped. It is also used by makePurePropsSelector to determine\n// whether mapToProps needs to be invoked when props have changed.\n//\n// A length of one signals that mapToProps does not depend on props from the parent component.\n// A length of zero is assumed to mean mapToProps is getting args via arguments or ...args and\n// therefore not reporting its length accurately..\n\nexport function getDependsOnOwnProps(mapToProps) {\n return mapToProps.dependsOnOwnProps !== null && mapToProps.dependsOnOwnProps !== undefined ? Boolean(mapToProps.dependsOnOwnProps) : mapToProps.length !== 1;\n} // Used by whenMapStateToPropsIsFunction and whenMapDispatchToPropsIsFunction,\n// this function wraps mapToProps in a proxy function which does several things:\n//\n// * Detects whether the mapToProps function being called depends on props, which\n// is used by selectorFactory to decide if it should reinvoke on props changes.\n//\n// * On first call, handles mapToProps if returns another function, and treats that\n// new function as the true mapToProps for subsequent calls.\n//\n// * On first call, verifies the first result is a plain object, in order to warn\n// the developer that their mapToProps function is not returning a valid result.\n//\n\nexport function wrapMapToPropsFunc(mapToProps, methodName) {\n return function initProxySelector(dispatch, _ref) {\n var displayName = _ref.displayName;\n\n var proxy = function mapToPropsProxy(stateOrDispatch, ownProps) {\n return proxy.dependsOnOwnProps ? proxy.mapToProps(stateOrDispatch, ownProps) : proxy.mapToProps(stateOrDispatch);\n }; // allow detectFactoryAndVerify to get ownProps\n\n\n proxy.dependsOnOwnProps = true;\n\n proxy.mapToProps = function detectFactoryAndVerify(stateOrDispatch, ownProps) {\n proxy.mapToProps = mapToProps;\n proxy.dependsOnOwnProps = getDependsOnOwnProps(mapToProps);\n var props = proxy(stateOrDispatch, ownProps);\n\n if (typeof props === 'function') {\n proxy.mapToProps = props;\n proxy.dependsOnOwnProps = getDependsOnOwnProps(props);\n props = proxy(stateOrDispatch, ownProps);\n }\n\n if (process.env.NODE_ENV !== 'production') verifyPlainObject(props, displayName, methodName);\n return props;\n };\n\n return proxy;\n };\n}","import bindActionCreators from '../utils/bindActionCreators';\nimport { wrapMapToPropsConstant, wrapMapToPropsFunc } from './wrapMapToProps';\nexport function whenMapDispatchToPropsIsFunction(mapDispatchToProps) {\n return typeof mapDispatchToProps === 'function' ? wrapMapToPropsFunc(mapDispatchToProps, 'mapDispatchToProps') : undefined;\n}\nexport function whenMapDispatchToPropsIsMissing(mapDispatchToProps) {\n return !mapDispatchToProps ? wrapMapToPropsConstant(function (dispatch) {\n return {\n dispatch: dispatch\n };\n }) : undefined;\n}\nexport function whenMapDispatchToPropsIsObject(mapDispatchToProps) {\n return mapDispatchToProps && typeof mapDispatchToProps === 'object' ? wrapMapToPropsConstant(function (dispatch) {\n return bindActionCreators(mapDispatchToProps, dispatch);\n }) : undefined;\n}\nexport default [whenMapDispatchToPropsIsFunction, whenMapDispatchToPropsIsMissing, whenMapDispatchToPropsIsObject];","export default function bindActionCreators(actionCreators, dispatch) {\n var boundActionCreators = {};\n\n var _loop = function _loop(key) {\n var actionCreator = actionCreators[key];\n\n if (typeof actionCreator === 'function') {\n boundActionCreators[key] = function () {\n return dispatch(actionCreator.apply(void 0, arguments));\n };\n }\n };\n\n for (var key in actionCreators) {\n _loop(key);\n }\n\n return boundActionCreators;\n}","import { wrapMapToPropsConstant, wrapMapToPropsFunc } from './wrapMapToProps';\nexport function whenMapStateToPropsIsFunction(mapStateToProps) {\n return typeof mapStateToProps === 'function' ? wrapMapToPropsFunc(mapStateToProps, 'mapStateToProps') : undefined;\n}\nexport function whenMapStateToPropsIsMissing(mapStateToProps) {\n return !mapStateToProps ? wrapMapToPropsConstant(function () {\n return {};\n }) : undefined;\n}\nexport default [whenMapStateToPropsIsFunction, whenMapStateToPropsIsMissing];","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport verifyPlainObject from '../utils/verifyPlainObject';\nexport function defaultMergeProps(stateProps, dispatchProps, ownProps) {\n return _extends({}, ownProps, stateProps, dispatchProps);\n}\nexport function wrapMergePropsFunc(mergeProps) {\n return function initMergePropsProxy(dispatch, _ref) {\n var displayName = _ref.displayName,\n pure = _ref.pure,\n areMergedPropsEqual = _ref.areMergedPropsEqual;\n var hasRunOnce = false;\n var mergedProps;\n return function mergePropsProxy(stateProps, dispatchProps, ownProps) {\n var nextMergedProps = mergeProps(stateProps, dispatchProps, ownProps);\n\n if (hasRunOnce) {\n if (!pure || !areMergedPropsEqual(nextMergedProps, mergedProps)) mergedProps = nextMergedProps;\n } else {\n hasRunOnce = true;\n mergedProps = nextMergedProps;\n if (process.env.NODE_ENV !== 'production') verifyPlainObject(mergedProps, displayName, 'mergeProps');\n }\n\n return mergedProps;\n };\n };\n}\nexport function whenMergePropsIsFunction(mergeProps) {\n return typeof mergeProps === 'function' ? wrapMergePropsFunc(mergeProps) : undefined;\n}\nexport function whenMergePropsIsOmitted(mergeProps) {\n return !mergeProps ? function () {\n return defaultMergeProps;\n } : undefined;\n}\nexport default [whenMergePropsIsFunction, whenMergePropsIsOmitted];","import _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nvar _excluded = [\"initMapStateToProps\", \"initMapDispatchToProps\", \"initMergeProps\"];\nimport verifySubselectors from './verifySubselectors';\nexport function impureFinalPropsSelectorFactory(mapStateToProps, mapDispatchToProps, mergeProps, dispatch) {\n return function impureFinalPropsSelector(state, ownProps) {\n return mergeProps(mapStateToProps(state, ownProps), mapDispatchToProps(dispatch, ownProps), ownProps);\n };\n}\nexport function pureFinalPropsSelectorFactory(mapStateToProps, mapDispatchToProps, mergeProps, dispatch, _ref) {\n var areStatesEqual = _ref.areStatesEqual,\n areOwnPropsEqual = _ref.areOwnPropsEqual,\n areStatePropsEqual = _ref.areStatePropsEqual;\n var hasRunAtLeastOnce = false;\n var state;\n var ownProps;\n var stateProps;\n var dispatchProps;\n var mergedProps;\n\n function handleFirstCall(firstState, firstOwnProps) {\n state = firstState;\n ownProps = firstOwnProps;\n stateProps = mapStateToProps(state, ownProps);\n dispatchProps = mapDispatchToProps(dispatch, ownProps);\n mergedProps = mergeProps(stateProps, dispatchProps, ownProps);\n hasRunAtLeastOnce = true;\n return mergedProps;\n }\n\n function handleNewPropsAndNewState() {\n stateProps = mapStateToProps(state, ownProps);\n if (mapDispatchToProps.dependsOnOwnProps) dispatchProps = mapDispatchToProps(dispatch, ownProps);\n mergedProps = mergeProps(stateProps, dispatchProps, ownProps);\n return mergedProps;\n }\n\n function handleNewProps() {\n if (mapStateToProps.dependsOnOwnProps) stateProps = mapStateToProps(state, ownProps);\n if (mapDispatchToProps.dependsOnOwnProps) dispatchProps = mapDispatchToProps(dispatch, ownProps);\n mergedProps = mergeProps(stateProps, dispatchProps, ownProps);\n return mergedProps;\n }\n\n function handleNewState() {\n var nextStateProps = mapStateToProps(state, ownProps);\n var statePropsChanged = !areStatePropsEqual(nextStateProps, stateProps);\n stateProps = nextStateProps;\n if (statePropsChanged) mergedProps = mergeProps(stateProps, dispatchProps, ownProps);\n return mergedProps;\n }\n\n function handleSubsequentCalls(nextState, nextOwnProps) {\n var propsChanged = !areOwnPropsEqual(nextOwnProps, ownProps);\n var stateChanged = !areStatesEqual(nextState, state, nextOwnProps, ownProps);\n state = nextState;\n ownProps = nextOwnProps;\n if (propsChanged && stateChanged) return handleNewPropsAndNewState();\n if (propsChanged) return handleNewProps();\n if (stateChanged) return handleNewState();\n return mergedProps;\n }\n\n return function pureFinalPropsSelector(nextState, nextOwnProps) {\n return hasRunAtLeastOnce ? handleSubsequentCalls(nextState, nextOwnProps) : handleFirstCall(nextState, nextOwnProps);\n };\n} // TODO: Add more comments\n// If pure is true, the selector returned by selectorFactory will memoize its results,\n// allowing connectAdvanced's shouldComponentUpdate to return false if final\n// props have not changed. If false, the selector will always return a new\n// object and shouldComponentUpdate will always return true.\n\nexport default function finalPropsSelectorFactory(dispatch, _ref2) {\n var initMapStateToProps = _ref2.initMapStateToProps,\n initMapDispatchToProps = _ref2.initMapDispatchToProps,\n initMergeProps = _ref2.initMergeProps,\n options = _objectWithoutPropertiesLoose(_ref2, _excluded);\n\n var mapStateToProps = initMapStateToProps(dispatch, options);\n var mapDispatchToProps = initMapDispatchToProps(dispatch, options);\n var mergeProps = initMergeProps(dispatch, options);\n\n if (process.env.NODE_ENV !== 'production') {\n verifySubselectors(mapStateToProps, mapDispatchToProps, mergeProps, options.displayName);\n }\n\n var selectorFactory = options.pure ? pureFinalPropsSelectorFactory : impureFinalPropsSelectorFactory;\n return selectorFactory(mapStateToProps, mapDispatchToProps, mergeProps, dispatch, options);\n}","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nvar _excluded = [\"pure\", \"areStatesEqual\", \"areOwnPropsEqual\", \"areStatePropsEqual\", \"areMergedPropsEqual\"];\nimport connectAdvanced from '../components/connectAdvanced';\nimport shallowEqual from '../utils/shallowEqual';\nimport defaultMapDispatchToPropsFactories from './mapDispatchToProps';\nimport defaultMapStateToPropsFactories from './mapStateToProps';\nimport defaultMergePropsFactories from './mergeProps';\nimport defaultSelectorFactory from './selectorFactory';\n/*\r\n connect is a facade over connectAdvanced. It turns its args into a compatible\r\n selectorFactory, which has the signature:\r\n\r\n (dispatch, options) => (nextState, nextOwnProps) => nextFinalProps\r\n \r\n connect passes its args to connectAdvanced as options, which will in turn pass them to\r\n selectorFactory each time a Connect component instance is instantiated or hot reloaded.\r\n\r\n selectorFactory returns a final props selector from its mapStateToProps,\r\n mapStateToPropsFactories, mapDispatchToProps, mapDispatchToPropsFactories, mergeProps,\r\n mergePropsFactories, and pure args.\r\n\r\n The resulting final props selector is called by the Connect component instance whenever\r\n it receives new props or store state.\r\n */\n\nfunction match(arg, factories, name) {\n for (var i = factories.length - 1; i >= 0; i--) {\n var result = factories[i](arg);\n if (result) return result;\n }\n\n return function (dispatch, options) {\n throw new Error(\"Invalid value of type \" + typeof arg + \" for \" + name + \" argument when connecting component \" + options.wrappedComponentName + \".\");\n };\n}\n\nfunction strictEqual(a, b) {\n return a === b;\n} // createConnect with default args builds the 'official' connect behavior. Calling it with\n// different options opens up some testing and extensibility scenarios\n\n\nexport function createConnect(_temp) {\n var _ref = _temp === void 0 ? {} : _temp,\n _ref$connectHOC = _ref.connectHOC,\n connectHOC = _ref$connectHOC === void 0 ? connectAdvanced : _ref$connectHOC,\n _ref$mapStateToPropsF = _ref.mapStateToPropsFactories,\n mapStateToPropsFactories = _ref$mapStateToPropsF === void 0 ? defaultMapStateToPropsFactories : _ref$mapStateToPropsF,\n _ref$mapDispatchToPro = _ref.mapDispatchToPropsFactories,\n mapDispatchToPropsFactories = _ref$mapDispatchToPro === void 0 ? defaultMapDispatchToPropsFactories : _ref$mapDispatchToPro,\n _ref$mergePropsFactor = _ref.mergePropsFactories,\n mergePropsFactories = _ref$mergePropsFactor === void 0 ? defaultMergePropsFactories : _ref$mergePropsFactor,\n _ref$selectorFactory = _ref.selectorFactory,\n selectorFactory = _ref$selectorFactory === void 0 ? defaultSelectorFactory : _ref$selectorFactory;\n\n return function connect(mapStateToProps, mapDispatchToProps, mergeProps, _ref2) {\n if (_ref2 === void 0) {\n _ref2 = {};\n }\n\n var _ref3 = _ref2,\n _ref3$pure = _ref3.pure,\n pure = _ref3$pure === void 0 ? true : _ref3$pure,\n _ref3$areStatesEqual = _ref3.areStatesEqual,\n areStatesEqual = _ref3$areStatesEqual === void 0 ? strictEqual : _ref3$areStatesEqual,\n _ref3$areOwnPropsEqua = _ref3.areOwnPropsEqual,\n areOwnPropsEqual = _ref3$areOwnPropsEqua === void 0 ? shallowEqual : _ref3$areOwnPropsEqua,\n _ref3$areStatePropsEq = _ref3.areStatePropsEqual,\n areStatePropsEqual = _ref3$areStatePropsEq === void 0 ? shallowEqual : _ref3$areStatePropsEq,\n _ref3$areMergedPropsE = _ref3.areMergedPropsEqual,\n areMergedPropsEqual = _ref3$areMergedPropsE === void 0 ? shallowEqual : _ref3$areMergedPropsE,\n extraOptions = _objectWithoutPropertiesLoose(_ref3, _excluded);\n\n var initMapStateToProps = match(mapStateToProps, mapStateToPropsFactories, 'mapStateToProps');\n var initMapDispatchToProps = match(mapDispatchToProps, mapDispatchToPropsFactories, 'mapDispatchToProps');\n var initMergeProps = match(mergeProps, mergePropsFactories, 'mergeProps');\n return connectHOC(selectorFactory, _extends({\n // used in error messages\n methodName: 'connect',\n // used to compute Connect's displayName from the wrapped component's displayName.\n getDisplayName: function getDisplayName(name) {\n return \"Connect(\" + name + \")\";\n },\n // if mapStateToProps is falsy, the Connect component doesn't subscribe to store state changes\n shouldHandleStateChanges: Boolean(mapStateToProps),\n // passed through to selectorFactory\n initMapStateToProps: initMapStateToProps,\n initMapDispatchToProps: initMapDispatchToProps,\n initMergeProps: initMergeProps,\n pure: pure,\n areStatesEqual: areStatesEqual,\n areOwnPropsEqual: areOwnPropsEqual,\n areStatePropsEqual: areStatePropsEqual,\n areMergedPropsEqual: areMergedPropsEqual\n }, extraOptions));\n };\n}\nexport default /*#__PURE__*/createConnect();","import { useReducer, useRef, useMemo, useContext, useDebugValue } from 'react';\nimport { useReduxContext as useDefaultReduxContext } from './useReduxContext';\nimport { createSubscription } from '../utils/Subscription';\nimport { useIsomorphicLayoutEffect } from '../utils/useIsomorphicLayoutEffect';\nimport { ReactReduxContext } from '../components/Context';\n\nvar refEquality = function refEquality(a, b) {\n return a === b;\n};\n\nfunction useSelectorWithStoreAndSubscription(selector, equalityFn, store, contextSub) {\n var _useReducer = useReducer(function (s) {\n return s + 1;\n }, 0),\n forceRender = _useReducer[1];\n\n var subscription = useMemo(function () {\n return createSubscription(store, contextSub);\n }, [store, contextSub]);\n var latestSubscriptionCallbackError = useRef();\n var latestSelector = useRef();\n var latestStoreState = useRef();\n var latestSelectedState = useRef();\n var storeState = store.getState();\n var selectedState;\n\n try {\n if (selector !== latestSelector.current || storeState !== latestStoreState.current || latestSubscriptionCallbackError.current) {\n var newSelectedState = selector(storeState); // ensure latest selected state is reused so that a custom equality function can result in identical references\n\n if (latestSelectedState.current === undefined || !equalityFn(newSelectedState, latestSelectedState.current)) {\n selectedState = newSelectedState;\n } else {\n selectedState = latestSelectedState.current;\n }\n } else {\n selectedState = latestSelectedState.current;\n }\n } catch (err) {\n if (latestSubscriptionCallbackError.current) {\n err.message += \"\\nThe error may be correlated with this previous error:\\n\" + latestSubscriptionCallbackError.current.stack + \"\\n\\n\";\n }\n\n throw err;\n }\n\n useIsomorphicLayoutEffect(function () {\n latestSelector.current = selector;\n latestStoreState.current = storeState;\n latestSelectedState.current = selectedState;\n latestSubscriptionCallbackError.current = undefined;\n });\n useIsomorphicLayoutEffect(function () {\n function checkForUpdates() {\n try {\n var newStoreState = store.getState(); // Avoid calling selector multiple times if the store's state has not changed\n\n if (newStoreState === latestStoreState.current) {\n return;\n }\n\n var _newSelectedState = latestSelector.current(newStoreState);\n\n if (equalityFn(_newSelectedState, latestSelectedState.current)) {\n return;\n }\n\n latestSelectedState.current = _newSelectedState;\n latestStoreState.current = newStoreState;\n } catch (err) {\n // we ignore all errors here, since when the component\n // is re-rendered, the selectors are called again, and\n // will throw again, if neither props nor store state\n // changed\n latestSubscriptionCallbackError.current = err;\n }\n\n forceRender();\n }\n\n subscription.onStateChange = checkForUpdates;\n subscription.trySubscribe();\n checkForUpdates();\n return function () {\n return subscription.tryUnsubscribe();\n };\n }, [store, subscription]);\n return selectedState;\n}\n/**\r\n * Hook factory, which creates a `useSelector` hook bound to a given context.\r\n *\r\n * @param {React.Context} [context=ReactReduxContext] Context passed to your `<Provider>`.\r\n * @returns {Function} A `useSelector` hook bound to the specified context.\r\n */\n\n\nexport function createSelectorHook(context) {\n if (context === void 0) {\n context = ReactReduxContext;\n }\n\n var useReduxContext = context === ReactReduxContext ? useDefaultReduxContext : function () {\n return useContext(context);\n };\n return function useSelector(selector, equalityFn) {\n if (equalityFn === void 0) {\n equalityFn = refEquality;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n if (!selector) {\n throw new Error(\"You must pass a selector to useSelector\");\n }\n\n if (typeof selector !== 'function') {\n throw new Error(\"You must pass a function as a selector to useSelector\");\n }\n\n if (typeof equalityFn !== 'function') {\n throw new Error(\"You must pass a function as an equality function to useSelector\");\n }\n }\n\n var _useReduxContext = useReduxContext(),\n store = _useReduxContext.store,\n contextSub = _useReduxContext.subscription;\n\n var selectedState = useSelectorWithStoreAndSubscription(selector, equalityFn, store, contextSub);\n useDebugValue(selectedState);\n return selectedState;\n };\n}\n/**\r\n * A hook to access the redux store's state. This hook takes a selector function\r\n * as an argument. The selector is called with the store state.\r\n *\r\n * This hook takes an optional equality comparison function as the second parameter\r\n * that allows you to customize the way the selected state is compared to determine\r\n * whether the component needs to be re-rendered.\r\n *\r\n * @param {Function} selector the selector function\r\n * @param {Function=} equalityFn the function that will be used to determine equality\r\n *\r\n * @returns {any} the selected state\r\n *\r\n * @example\r\n *\r\n * import React from 'react'\r\n * import { useSelector } from 'react-redux'\r\n *\r\n * export const CounterComponent = () => {\r\n * const counter = useSelector(state => state.counter)\r\n * return <div>{counter}</div>\r\n * }\r\n */\n\nexport var useSelector = /*#__PURE__*/createSelectorHook();","import { useState, useRef, useEffect } from 'react';\n\nfunction areInputsEqual(newInputs, lastInputs) {\n if (newInputs.length !== lastInputs.length) {\n return false;\n }\n\n for (var i = 0; i < newInputs.length; i++) {\n if (newInputs[i] !== lastInputs[i]) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction useMemoOne(getResult, inputs) {\n var initial = useState(function () {\n return {\n inputs: inputs,\n result: getResult()\n };\n })[0];\n var isFirstRun = useRef(true);\n var committed = useRef(initial);\n var useCache = isFirstRun.current || Boolean(inputs && committed.current.inputs && areInputsEqual(inputs, committed.current.inputs));\n var cache = useCache ? committed.current : {\n inputs: inputs,\n result: getResult()\n };\n useEffect(function () {\n isFirstRun.current = false;\n committed.current = cache;\n }, [cache]);\n return cache.result;\n}\nfunction useCallbackOne(callback, inputs) {\n return useMemoOne(function () {\n return callback;\n }, inputs);\n}\nvar useMemo = useMemoOne;\nvar useCallback = useCallbackOne;\n\nexport { useCallback, useCallbackOne, useMemo, useMemoOne };\n","export * from './exports';\nimport { unstable_batchedUpdates as batch } from './utils/reactBatchedUpdates';\nimport { setBatch } from './utils/batch'; // Enable batched updates in our subscriptions for use\n// with standard React renderers (ReactDOM, React Native)\n\nsetBatch(batch);\nexport { batch };","var isProduction = process.env.NODE_ENV === 'production';\nvar prefix = 'Invariant failed';\nfunction invariant(condition, message) {\n if (condition) {\n return;\n }\n if (isProduction) {\n throw new Error(prefix);\n }\n var provided = typeof message === 'function' ? message() : message;\n var value = provided ? \"\".concat(prefix, \": \").concat(provided) : prefix;\n throw new Error(value);\n}\n\nexport { invariant as default };\n","import invariant from 'tiny-invariant';\n\nvar getRect = function getRect(_ref) {\n var top = _ref.top,\n right = _ref.right,\n bottom = _ref.bottom,\n left = _ref.left;\n var width = right - left;\n var height = bottom - top;\n var rect = {\n top: top,\n right: right,\n bottom: bottom,\n left: left,\n width: width,\n height: height,\n x: left,\n y: top,\n center: {\n x: (right + left) / 2,\n y: (bottom + top) / 2\n }\n };\n return rect;\n};\nvar expand = function expand(target, expandBy) {\n return {\n top: target.top - expandBy.top,\n left: target.left - expandBy.left,\n bottom: target.bottom + expandBy.bottom,\n right: target.right + expandBy.right\n };\n};\nvar shrink = function shrink(target, shrinkBy) {\n return {\n top: target.top + shrinkBy.top,\n left: target.left + shrinkBy.left,\n bottom: target.bottom - shrinkBy.bottom,\n right: target.right - shrinkBy.right\n };\n};\n\nvar shift = function shift(target, shiftBy) {\n return {\n top: target.top + shiftBy.y,\n left: target.left + shiftBy.x,\n bottom: target.bottom + shiftBy.y,\n right: target.right + shiftBy.x\n };\n};\n\nvar noSpacing = {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n};\nvar createBox = function createBox(_ref2) {\n var borderBox = _ref2.borderBox,\n _ref2$margin = _ref2.margin,\n margin = _ref2$margin === void 0 ? noSpacing : _ref2$margin,\n _ref2$border = _ref2.border,\n border = _ref2$border === void 0 ? noSpacing : _ref2$border,\n _ref2$padding = _ref2.padding,\n padding = _ref2$padding === void 0 ? noSpacing : _ref2$padding;\n var marginBox = getRect(expand(borderBox, margin));\n var paddingBox = getRect(shrink(borderBox, border));\n var contentBox = getRect(shrink(paddingBox, padding));\n return {\n marginBox: marginBox,\n borderBox: getRect(borderBox),\n paddingBox: paddingBox,\n contentBox: contentBox,\n margin: margin,\n border: border,\n padding: padding\n };\n};\n\nvar parse = function parse(raw) {\n var value = raw.slice(0, -2);\n var suffix = raw.slice(-2);\n\n if (suffix !== 'px') {\n return 0;\n }\n\n var result = Number(value);\n !!isNaN(result) ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"Could not parse value [raw: \" + raw + \", without suffix: \" + value + \"]\") : invariant(false) : void 0;\n return result;\n};\n\nvar getWindowScroll = function getWindowScroll() {\n return {\n x: window.pageXOffset,\n y: window.pageYOffset\n };\n};\n\nvar offset = function offset(original, change) {\n var borderBox = original.borderBox,\n border = original.border,\n margin = original.margin,\n padding = original.padding;\n var shifted = shift(borderBox, change);\n return createBox({\n borderBox: shifted,\n border: border,\n margin: margin,\n padding: padding\n });\n};\nvar withScroll = function withScroll(original, scroll) {\n if (scroll === void 0) {\n scroll = getWindowScroll();\n }\n\n return offset(original, scroll);\n};\nvar calculateBox = function calculateBox(borderBox, styles) {\n var margin = {\n top: parse(styles.marginTop),\n right: parse(styles.marginRight),\n bottom: parse(styles.marginBottom),\n left: parse(styles.marginLeft)\n };\n var padding = {\n top: parse(styles.paddingTop),\n right: parse(styles.paddingRight),\n bottom: parse(styles.paddingBottom),\n left: parse(styles.paddingLeft)\n };\n var border = {\n top: parse(styles.borderTopWidth),\n right: parse(styles.borderRightWidth),\n bottom: parse(styles.borderBottomWidth),\n left: parse(styles.borderLeftWidth)\n };\n return createBox({\n borderBox: borderBox,\n margin: margin,\n padding: padding,\n border: border\n });\n};\nvar getBox = function getBox(el) {\n var borderBox = el.getBoundingClientRect();\n var styles = window.getComputedStyle(el);\n return calculateBox(borderBox, styles);\n};\n\nexport { calculateBox, createBox, expand, getBox, getRect, offset, shrink, withScroll };\n","var safeIsNaN = Number.isNaN ||\n function ponyfill(value) {\n return typeof value === 'number' && value !== value;\n };\nfunction isEqual(first, second) {\n if (first === second) {\n return true;\n }\n if (safeIsNaN(first) && safeIsNaN(second)) {\n return true;\n }\n return false;\n}\nfunction areInputsEqual(newInputs, lastInputs) {\n if (newInputs.length !== lastInputs.length) {\n return false;\n }\n for (var i = 0; i < newInputs.length; i++) {\n if (!isEqual(newInputs[i], lastInputs[i])) {\n return false;\n }\n }\n return true;\n}\n\nfunction memoizeOne(resultFn, isEqual) {\n if (isEqual === void 0) { isEqual = areInputsEqual; }\n var lastThis;\n var lastArgs = [];\n var lastResult;\n var calledOnce = false;\n function memoized() {\n var newArgs = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n newArgs[_i] = arguments[_i];\n }\n if (calledOnce && lastThis === this && isEqual(newArgs, lastArgs)) {\n return lastResult;\n }\n lastResult = resultFn.apply(this, newArgs);\n calledOnce = true;\n lastThis = this;\n lastArgs = newArgs;\n return lastResult;\n }\n return memoized;\n}\n\nexport default memoizeOne;\n","var rafSchd = function rafSchd(fn) {\n var lastArgs = [];\n var frameId = null;\n\n var wrapperFn = function wrapperFn() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n lastArgs = args;\n\n if (frameId) {\n return;\n }\n\n frameId = requestAnimationFrame(function () {\n frameId = null;\n fn.apply(void 0, lastArgs);\n });\n };\n\n wrapperFn.cancel = function () {\n if (!frameId) {\n return;\n }\n\n cancelAnimationFrame(frameId);\n frameId = null;\n };\n\n return wrapperFn;\n};\n\nexport default rafSchd;\n","import React, { useLayoutEffect, useEffect, useRef, useState, useContext } from 'react';\nimport _inheritsLoose from '@babel/runtime/helpers/esm/inheritsLoose';\nimport _extends from '@babel/runtime/helpers/esm/extends';\nimport { createStore as createStore$1, applyMiddleware, compose, bindActionCreators } from 'redux';\nimport { Provider, connect } from 'react-redux';\nimport { useMemo, useCallback } from 'use-memo-one';\nimport { getRect, expand, offset, withScroll, getBox, createBox, calculateBox } from 'css-box-model';\nimport memoizeOne from 'memoize-one';\nimport rafSchd from 'raf-schd';\nimport ReactDOM from 'react-dom';\n\nvar isProduction = process.env.NODE_ENV === 'production';\nvar spacesAndTabs = /[ \\t]{2,}/g;\nvar lineStartWithSpaces = /^[ \\t]*/gm;\n\nvar clean = function clean(value) {\n return value.replace(spacesAndTabs, ' ').replace(lineStartWithSpaces, '').trim();\n};\n\nvar getDevMessage = function getDevMessage(message) {\n return clean(\"\\n %creact-beautiful-dnd\\n\\n %c\" + clean(message) + \"\\n\\n %c\\uD83D\\uDC77\\u200D This is a development only message. It will be removed in production builds.\\n\");\n};\n\nvar getFormattedMessage = function getFormattedMessage(message) {\n return [getDevMessage(message), 'color: #00C584; font-size: 1.2em; font-weight: bold;', 'line-height: 1.5', 'color: #723874;'];\n};\nvar isDisabledFlag = '__react-beautiful-dnd-disable-dev-warnings';\nfunction log(type, message) {\n var _console;\n\n if (isProduction) {\n return;\n }\n\n if (typeof window !== 'undefined' && window[isDisabledFlag]) {\n return;\n }\n\n (_console = console)[type].apply(_console, getFormattedMessage(message));\n}\nvar warning = log.bind(null, 'warn');\nvar error = log.bind(null, 'error');\n\nfunction noop() {}\n\nfunction getOptions(shared, fromBinding) {\n return _extends({}, shared, {}, fromBinding);\n}\n\nfunction bindEvents(el, bindings, sharedOptions) {\n var unbindings = bindings.map(function (binding) {\n var options = getOptions(sharedOptions, binding.options);\n el.addEventListener(binding.eventName, binding.fn, options);\n return function unbind() {\n el.removeEventListener(binding.eventName, binding.fn, options);\n };\n });\n return function unbindAll() {\n unbindings.forEach(function (unbind) {\n unbind();\n });\n };\n}\n\nvar isProduction$1 = process.env.NODE_ENV === 'production';\nvar prefix = 'Invariant failed';\nfunction RbdInvariant(message) {\n this.message = message;\n}\n\nRbdInvariant.prototype.toString = function toString() {\n return this.message;\n};\n\nfunction invariant(condition, message) {\n if (condition) {\n return;\n }\n\n if (isProduction$1) {\n throw new RbdInvariant(prefix);\n } else {\n throw new RbdInvariant(prefix + \": \" + (message || ''));\n }\n}\n\nvar ErrorBoundary = function (_React$Component) {\n _inheritsLoose(ErrorBoundary, _React$Component);\n\n function ErrorBoundary() {\n var _this;\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n _this.callbacks = null;\n _this.unbind = noop;\n\n _this.onWindowError = function (event) {\n var callbacks = _this.getCallbacks();\n\n if (callbacks.isDragging()) {\n callbacks.tryAbort();\n process.env.NODE_ENV !== \"production\" ? warning(\"\\n An error was caught by our window 'error' event listener while a drag was occurring.\\n The active drag has been aborted.\\n \") : void 0;\n }\n\n var err = event.error;\n\n if (err instanceof RbdInvariant) {\n event.preventDefault();\n\n if (process.env.NODE_ENV !== 'production') {\n error(err.message);\n }\n }\n };\n\n _this.getCallbacks = function () {\n if (!_this.callbacks) {\n throw new Error('Unable to find AppCallbacks in <ErrorBoundary/>');\n }\n\n return _this.callbacks;\n };\n\n _this.setCallbacks = function (callbacks) {\n _this.callbacks = callbacks;\n };\n\n return _this;\n }\n\n var _proto = ErrorBoundary.prototype;\n\n _proto.componentDidMount = function componentDidMount() {\n this.unbind = bindEvents(window, [{\n eventName: 'error',\n fn: this.onWindowError\n }]);\n };\n\n _proto.componentDidCatch = function componentDidCatch(err) {\n if (err instanceof RbdInvariant) {\n if (process.env.NODE_ENV !== 'production') {\n error(err.message);\n }\n\n this.setState({});\n return;\n }\n\n throw err;\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n this.unbind();\n };\n\n _proto.render = function render() {\n return this.props.children(this.setCallbacks);\n };\n\n return ErrorBoundary;\n}(React.Component);\n\nvar dragHandleUsageInstructions = \"\\n Press space bar to start a drag.\\n When dragging you can use the arrow keys to move the item around and escape to cancel.\\n Some screen readers may require you to be in focus mode or to use your pass through key\\n\";\n\nvar position = function position(index) {\n return index + 1;\n};\n\nvar onDragStart = function onDragStart(start) {\n return \"\\n You have lifted an item in position \" + position(start.source.index) + \"\\n\";\n};\n\nvar withLocation = function withLocation(source, destination) {\n var isInHomeList = source.droppableId === destination.droppableId;\n var startPosition = position(source.index);\n var endPosition = position(destination.index);\n\n if (isInHomeList) {\n return \"\\n You have moved the item from position \" + startPosition + \"\\n to position \" + endPosition + \"\\n \";\n }\n\n return \"\\n You have moved the item from position \" + startPosition + \"\\n in list \" + source.droppableId + \"\\n to list \" + destination.droppableId + \"\\n in position \" + endPosition + \"\\n \";\n};\n\nvar withCombine = function withCombine(id, source, combine) {\n var inHomeList = source.droppableId === combine.droppableId;\n\n if (inHomeList) {\n return \"\\n The item \" + id + \"\\n has been combined with \" + combine.draggableId;\n }\n\n return \"\\n The item \" + id + \"\\n in list \" + source.droppableId + \"\\n has been combined with \" + combine.draggableId + \"\\n in list \" + combine.droppableId + \"\\n \";\n};\n\nvar onDragUpdate = function onDragUpdate(update) {\n var location = update.destination;\n\n if (location) {\n return withLocation(update.source, location);\n }\n\n var combine = update.combine;\n\n if (combine) {\n return withCombine(update.draggableId, update.source, combine);\n }\n\n return 'You are over an area that cannot be dropped on';\n};\n\nvar returnedToStart = function returnedToStart(source) {\n return \"\\n The item has returned to its starting position\\n of \" + position(source.index) + \"\\n\";\n};\n\nvar onDragEnd = function onDragEnd(result) {\n if (result.reason === 'CANCEL') {\n return \"\\n Movement cancelled.\\n \" + returnedToStart(result.source) + \"\\n \";\n }\n\n var location = result.destination;\n var combine = result.combine;\n\n if (location) {\n return \"\\n You have dropped the item.\\n \" + withLocation(result.source, location) + \"\\n \";\n }\n\n if (combine) {\n return \"\\n You have dropped the item.\\n \" + withCombine(result.draggableId, result.source, combine) + \"\\n \";\n }\n\n return \"\\n The item has been dropped while not over a drop area.\\n \" + returnedToStart(result.source) + \"\\n \";\n};\n\nvar preset = {\n dragHandleUsageInstructions: dragHandleUsageInstructions,\n onDragStart: onDragStart,\n onDragUpdate: onDragUpdate,\n onDragEnd: onDragEnd\n};\n\nvar origin = {\n x: 0,\n y: 0\n};\nvar add = function add(point1, point2) {\n return {\n x: point1.x + point2.x,\n y: point1.y + point2.y\n };\n};\nvar subtract = function subtract(point1, point2) {\n return {\n x: point1.x - point2.x,\n y: point1.y - point2.y\n };\n};\nvar isEqual = function isEqual(point1, point2) {\n return point1.x === point2.x && point1.y === point2.y;\n};\nvar negate = function negate(point) {\n return {\n x: point.x !== 0 ? -point.x : 0,\n y: point.y !== 0 ? -point.y : 0\n };\n};\nvar patch = function patch(line, value, otherValue) {\n var _ref;\n\n if (otherValue === void 0) {\n otherValue = 0;\n }\n\n return _ref = {}, _ref[line] = value, _ref[line === 'x' ? 'y' : 'x'] = otherValue, _ref;\n};\nvar distance = function distance(point1, point2) {\n return Math.sqrt(Math.pow(point2.x - point1.x, 2) + Math.pow(point2.y - point1.y, 2));\n};\nvar closest = function closest(target, points) {\n return Math.min.apply(Math, points.map(function (point) {\n return distance(target, point);\n }));\n};\nvar apply = function apply(fn) {\n return function (point) {\n return {\n x: fn(point.x),\n y: fn(point.y)\n };\n };\n};\n\nvar executeClip = (function (frame, subject) {\n var result = getRect({\n top: Math.max(subject.top, frame.top),\n right: Math.min(subject.right, frame.right),\n bottom: Math.min(subject.bottom, frame.bottom),\n left: Math.max(subject.left, frame.left)\n });\n\n if (result.width <= 0 || result.height <= 0) {\n return null;\n }\n\n return result;\n});\n\nvar offsetByPosition = function offsetByPosition(spacing, point) {\n return {\n top: spacing.top + point.y,\n left: spacing.left + point.x,\n bottom: spacing.bottom + point.y,\n right: spacing.right + point.x\n };\n};\nvar getCorners = function getCorners(spacing) {\n return [{\n x: spacing.left,\n y: spacing.top\n }, {\n x: spacing.right,\n y: spacing.top\n }, {\n x: spacing.left,\n y: spacing.bottom\n }, {\n x: spacing.right,\n y: spacing.bottom\n }];\n};\nvar noSpacing = {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n};\n\nvar scroll = function scroll(target, frame) {\n if (!frame) {\n return target;\n }\n\n return offsetByPosition(target, frame.scroll.diff.displacement);\n};\n\nvar increase = function increase(target, axis, withPlaceholder) {\n if (withPlaceholder && withPlaceholder.increasedBy) {\n var _extends2;\n\n return _extends({}, target, (_extends2 = {}, _extends2[axis.end] = target[axis.end] + withPlaceholder.increasedBy[axis.line], _extends2));\n }\n\n return target;\n};\n\nvar clip = function clip(target, frame) {\n if (frame && frame.shouldClipSubject) {\n return executeClip(frame.pageMarginBox, target);\n }\n\n return getRect(target);\n};\n\nvar getSubject = (function (_ref) {\n var page = _ref.page,\n withPlaceholder = _ref.withPlaceholder,\n axis = _ref.axis,\n frame = _ref.frame;\n var scrolled = scroll(page.marginBox, frame);\n var increased = increase(scrolled, axis, withPlaceholder);\n var clipped = clip(increased, frame);\n return {\n page: page,\n withPlaceholder: withPlaceholder,\n active: clipped\n };\n});\n\nvar scrollDroppable = (function (droppable, newScroll) {\n !droppable.frame ? process.env.NODE_ENV !== \"production\" ? invariant(false) : invariant(false) : void 0;\n var scrollable = droppable.frame;\n var scrollDiff = subtract(newScroll, scrollable.scroll.initial);\n var scrollDisplacement = negate(scrollDiff);\n\n var frame = _extends({}, scrollable, {\n scroll: {\n initial: scrollable.scroll.initial,\n current: newScroll,\n diff: {\n value: scrollDiff,\n displacement: scrollDisplacement\n },\n max: scrollable.scroll.max\n }\n });\n\n var subject = getSubject({\n page: droppable.subject.page,\n withPlaceholder: droppable.subject.withPlaceholder,\n axis: droppable.axis,\n frame: frame\n });\n\n var result = _extends({}, droppable, {\n frame: frame,\n subject: subject\n });\n\n return result;\n});\n\nfunction isInteger(value) {\n if (Number.isInteger) {\n return Number.isInteger(value);\n }\n\n return typeof value === 'number' && isFinite(value) && Math.floor(value) === value;\n}\nfunction values(map) {\n if (Object.values) {\n return Object.values(map);\n }\n\n return Object.keys(map).map(function (key) {\n return map[key];\n });\n}\nfunction findIndex(list, predicate) {\n if (list.findIndex) {\n return list.findIndex(predicate);\n }\n\n for (var i = 0; i < list.length; i++) {\n if (predicate(list[i])) {\n return i;\n }\n }\n\n return -1;\n}\nfunction find(list, predicate) {\n if (list.find) {\n return list.find(predicate);\n }\n\n var index = findIndex(list, predicate);\n\n if (index !== -1) {\n return list[index];\n }\n\n return undefined;\n}\nfunction toArray(list) {\n return Array.prototype.slice.call(list);\n}\n\nvar toDroppableMap = memoizeOne(function (droppables) {\n return droppables.reduce(function (previous, current) {\n previous[current.descriptor.id] = current;\n return previous;\n }, {});\n});\nvar toDraggableMap = memoizeOne(function (draggables) {\n return draggables.reduce(function (previous, current) {\n previous[current.descriptor.id] = current;\n return previous;\n }, {});\n});\nvar toDroppableList = memoizeOne(function (droppables) {\n return values(droppables);\n});\nvar toDraggableList = memoizeOne(function (draggables) {\n return values(draggables);\n});\n\nvar getDraggablesInsideDroppable = memoizeOne(function (droppableId, draggables) {\n var result = toDraggableList(draggables).filter(function (draggable) {\n return droppableId === draggable.descriptor.droppableId;\n }).sort(function (a, b) {\n return a.descriptor.index - b.descriptor.index;\n });\n return result;\n});\n\nfunction tryGetDestination(impact) {\n if (impact.at && impact.at.type === 'REORDER') {\n return impact.at.destination;\n }\n\n return null;\n}\nfunction tryGetCombine(impact) {\n if (impact.at && impact.at.type === 'COMBINE') {\n return impact.at.combine;\n }\n\n return null;\n}\n\nvar removeDraggableFromList = memoizeOne(function (remove, list) {\n return list.filter(function (item) {\n return item.descriptor.id !== remove.descriptor.id;\n });\n});\n\nvar moveToNextCombine = (function (_ref) {\n var isMovingForward = _ref.isMovingForward,\n draggable = _ref.draggable,\n destination = _ref.destination,\n insideDestination = _ref.insideDestination,\n previousImpact = _ref.previousImpact;\n\n if (!destination.isCombineEnabled) {\n return null;\n }\n\n var location = tryGetDestination(previousImpact);\n\n if (!location) {\n return null;\n }\n\n function getImpact(target) {\n var at = {\n type: 'COMBINE',\n combine: {\n draggableId: target,\n droppableId: destination.descriptor.id\n }\n };\n return _extends({}, previousImpact, {\n at: at\n });\n }\n\n var all = previousImpact.displaced.all;\n var closestId = all.length ? all[0] : null;\n\n if (isMovingForward) {\n return closestId ? getImpact(closestId) : null;\n }\n\n var withoutDraggable = removeDraggableFromList(draggable, insideDestination);\n\n if (!closestId) {\n if (!withoutDraggable.length) {\n return null;\n }\n\n var last = withoutDraggable[withoutDraggable.length - 1];\n return getImpact(last.descriptor.id);\n }\n\n var indexOfClosest = findIndex(withoutDraggable, function (d) {\n return d.descriptor.id === closestId;\n });\n !(indexOfClosest !== -1) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Could not find displaced item in set') : invariant(false) : void 0;\n var proposedIndex = indexOfClosest - 1;\n\n if (proposedIndex < 0) {\n return null;\n }\n\n var before = withoutDraggable[proposedIndex];\n return getImpact(before.descriptor.id);\n});\n\nvar isHomeOf = (function (draggable, destination) {\n return draggable.descriptor.droppableId === destination.descriptor.id;\n});\n\nvar noDisplacedBy = {\n point: origin,\n value: 0\n};\nvar emptyGroups = {\n invisible: {},\n visible: {},\n all: []\n};\nvar noImpact = {\n displaced: emptyGroups,\n displacedBy: noDisplacedBy,\n at: null\n};\n\nvar isWithin = (function (lowerBound, upperBound) {\n return function (value) {\n return lowerBound <= value && value <= upperBound;\n };\n});\n\nvar isPartiallyVisibleThroughFrame = (function (frame) {\n var isWithinVertical = isWithin(frame.top, frame.bottom);\n var isWithinHorizontal = isWithin(frame.left, frame.right);\n return function (subject) {\n var isContained = isWithinVertical(subject.top) && isWithinVertical(subject.bottom) && isWithinHorizontal(subject.left) && isWithinHorizontal(subject.right);\n\n if (isContained) {\n return true;\n }\n\n var isPartiallyVisibleVertically = isWithinVertical(subject.top) || isWithinVertical(subject.bottom);\n var isPartiallyVisibleHorizontally = isWithinHorizontal(subject.left) || isWithinHorizontal(subject.right);\n var isPartiallyContained = isPartiallyVisibleVertically && isPartiallyVisibleHorizontally;\n\n if (isPartiallyContained) {\n return true;\n }\n\n var isBiggerVertically = subject.top < frame.top && subject.bottom > frame.bottom;\n var isBiggerHorizontally = subject.left < frame.left && subject.right > frame.right;\n var isTargetBiggerThanFrame = isBiggerVertically && isBiggerHorizontally;\n\n if (isTargetBiggerThanFrame) {\n return true;\n }\n\n var isTargetBiggerOnOneAxis = isBiggerVertically && isPartiallyVisibleHorizontally || isBiggerHorizontally && isPartiallyVisibleVertically;\n return isTargetBiggerOnOneAxis;\n };\n});\n\nvar isTotallyVisibleThroughFrame = (function (frame) {\n var isWithinVertical = isWithin(frame.top, frame.bottom);\n var isWithinHorizontal = isWithin(frame.left, frame.right);\n return function (subject) {\n var isContained = isWithinVertical(subject.top) && isWithinVertical(subject.bottom) && isWithinHorizontal(subject.left) && isWithinHorizontal(subject.right);\n return isContained;\n };\n});\n\nvar vertical = {\n direction: 'vertical',\n line: 'y',\n crossAxisLine: 'x',\n start: 'top',\n end: 'bottom',\n size: 'height',\n crossAxisStart: 'left',\n crossAxisEnd: 'right',\n crossAxisSize: 'width'\n};\nvar horizontal = {\n direction: 'horizontal',\n line: 'x',\n crossAxisLine: 'y',\n start: 'left',\n end: 'right',\n size: 'width',\n crossAxisStart: 'top',\n crossAxisEnd: 'bottom',\n crossAxisSize: 'height'\n};\n\nvar isTotallyVisibleThroughFrameOnAxis = (function (axis) {\n return function (frame) {\n var isWithinVertical = isWithin(frame.top, frame.bottom);\n var isWithinHorizontal = isWithin(frame.left, frame.right);\n return function (subject) {\n if (axis === vertical) {\n return isWithinVertical(subject.top) && isWithinVertical(subject.bottom);\n }\n\n return isWithinHorizontal(subject.left) && isWithinHorizontal(subject.right);\n };\n };\n});\n\nvar getDroppableDisplaced = function getDroppableDisplaced(target, destination) {\n var displacement = destination.frame ? destination.frame.scroll.diff.displacement : origin;\n return offsetByPosition(target, displacement);\n};\n\nvar isVisibleInDroppable = function isVisibleInDroppable(target, destination, isVisibleThroughFrameFn) {\n if (!destination.subject.active) {\n return false;\n }\n\n return isVisibleThroughFrameFn(destination.subject.active)(target);\n};\n\nvar isVisibleInViewport = function isVisibleInViewport(target, viewport, isVisibleThroughFrameFn) {\n return isVisibleThroughFrameFn(viewport)(target);\n};\n\nvar isVisible = function isVisible(_ref) {\n var toBeDisplaced = _ref.target,\n destination = _ref.destination,\n viewport = _ref.viewport,\n withDroppableDisplacement = _ref.withDroppableDisplacement,\n isVisibleThroughFrameFn = _ref.isVisibleThroughFrameFn;\n var displacedTarget = withDroppableDisplacement ? getDroppableDisplaced(toBeDisplaced, destination) : toBeDisplaced;\n return isVisibleInDroppable(displacedTarget, destination, isVisibleThroughFrameFn) && isVisibleInViewport(displacedTarget, viewport, isVisibleThroughFrameFn);\n};\n\nvar isPartiallyVisible = function isPartiallyVisible(args) {\n return isVisible(_extends({}, args, {\n isVisibleThroughFrameFn: isPartiallyVisibleThroughFrame\n }));\n};\nvar isTotallyVisible = function isTotallyVisible(args) {\n return isVisible(_extends({}, args, {\n isVisibleThroughFrameFn: isTotallyVisibleThroughFrame\n }));\n};\nvar isTotallyVisibleOnAxis = function isTotallyVisibleOnAxis(args) {\n return isVisible(_extends({}, args, {\n isVisibleThroughFrameFn: isTotallyVisibleThroughFrameOnAxis(args.destination.axis)\n }));\n};\n\nvar getShouldAnimate = function getShouldAnimate(id, last, forceShouldAnimate) {\n if (typeof forceShouldAnimate === 'boolean') {\n return forceShouldAnimate;\n }\n\n if (!last) {\n return true;\n }\n\n var invisible = last.invisible,\n visible = last.visible;\n\n if (invisible[id]) {\n return false;\n }\n\n var previous = visible[id];\n return previous ? previous.shouldAnimate : true;\n};\n\nfunction getTarget(draggable, displacedBy) {\n var marginBox = draggable.page.marginBox;\n var expandBy = {\n top: displacedBy.point.y,\n right: 0,\n bottom: 0,\n left: displacedBy.point.x\n };\n return getRect(expand(marginBox, expandBy));\n}\n\nfunction getDisplacementGroups(_ref) {\n var afterDragging = _ref.afterDragging,\n destination = _ref.destination,\n displacedBy = _ref.displacedBy,\n viewport = _ref.viewport,\n forceShouldAnimate = _ref.forceShouldAnimate,\n last = _ref.last;\n return afterDragging.reduce(function process(groups, draggable) {\n var target = getTarget(draggable, displacedBy);\n var id = draggable.descriptor.id;\n groups.all.push(id);\n var isVisible = isPartiallyVisible({\n target: target,\n destination: destination,\n viewport: viewport,\n withDroppableDisplacement: true\n });\n\n if (!isVisible) {\n groups.invisible[draggable.descriptor.id] = true;\n return groups;\n }\n\n var shouldAnimate = getShouldAnimate(id, last, forceShouldAnimate);\n var displacement = {\n draggableId: id,\n shouldAnimate: shouldAnimate\n };\n groups.visible[id] = displacement;\n return groups;\n }, {\n all: [],\n visible: {},\n invisible: {}\n });\n}\n\nfunction getIndexOfLastItem(draggables, options) {\n if (!draggables.length) {\n return 0;\n }\n\n var indexOfLastItem = draggables[draggables.length - 1].descriptor.index;\n return options.inHomeList ? indexOfLastItem : indexOfLastItem + 1;\n}\n\nfunction goAtEnd(_ref) {\n var insideDestination = _ref.insideDestination,\n inHomeList = _ref.inHomeList,\n displacedBy = _ref.displacedBy,\n destination = _ref.destination;\n var newIndex = getIndexOfLastItem(insideDestination, {\n inHomeList: inHomeList\n });\n return {\n displaced: emptyGroups,\n displacedBy: displacedBy,\n at: {\n type: 'REORDER',\n destination: {\n droppableId: destination.descriptor.id,\n index: newIndex\n }\n }\n };\n}\n\nfunction calculateReorderImpact(_ref2) {\n var draggable = _ref2.draggable,\n insideDestination = _ref2.insideDestination,\n destination = _ref2.destination,\n viewport = _ref2.viewport,\n displacedBy = _ref2.displacedBy,\n last = _ref2.last,\n index = _ref2.index,\n forceShouldAnimate = _ref2.forceShouldAnimate;\n var inHomeList = isHomeOf(draggable, destination);\n\n if (index == null) {\n return goAtEnd({\n insideDestination: insideDestination,\n inHomeList: inHomeList,\n displacedBy: displacedBy,\n destination: destination\n });\n }\n\n var match = find(insideDestination, function (item) {\n return item.descriptor.index === index;\n });\n\n if (!match) {\n return goAtEnd({\n insideDestination: insideDestination,\n inHomeList: inHomeList,\n displacedBy: displacedBy,\n destination: destination\n });\n }\n\n var withoutDragging = removeDraggableFromList(draggable, insideDestination);\n var sliceFrom = insideDestination.indexOf(match);\n var impacted = withoutDragging.slice(sliceFrom);\n var displaced = getDisplacementGroups({\n afterDragging: impacted,\n destination: destination,\n displacedBy: displacedBy,\n last: last,\n viewport: viewport.frame,\n forceShouldAnimate: forceShouldAnimate\n });\n return {\n displaced: displaced,\n displacedBy: displacedBy,\n at: {\n type: 'REORDER',\n destination: {\n droppableId: destination.descriptor.id,\n index: index\n }\n }\n };\n}\n\nfunction didStartAfterCritical(draggableId, afterCritical) {\n return Boolean(afterCritical.effected[draggableId]);\n}\n\nvar fromCombine = (function (_ref) {\n var isMovingForward = _ref.isMovingForward,\n destination = _ref.destination,\n draggables = _ref.draggables,\n combine = _ref.combine,\n afterCritical = _ref.afterCritical;\n\n if (!destination.isCombineEnabled) {\n return null;\n }\n\n var combineId = combine.draggableId;\n var combineWith = draggables[combineId];\n var combineWithIndex = combineWith.descriptor.index;\n var didCombineWithStartAfterCritical = didStartAfterCritical(combineId, afterCritical);\n\n if (didCombineWithStartAfterCritical) {\n if (isMovingForward) {\n return combineWithIndex;\n }\n\n return combineWithIndex - 1;\n }\n\n if (isMovingForward) {\n return combineWithIndex + 1;\n }\n\n return combineWithIndex;\n});\n\nvar fromReorder = (function (_ref) {\n var isMovingForward = _ref.isMovingForward,\n isInHomeList = _ref.isInHomeList,\n insideDestination = _ref.insideDestination,\n location = _ref.location;\n\n if (!insideDestination.length) {\n return null;\n }\n\n var currentIndex = location.index;\n var proposedIndex = isMovingForward ? currentIndex + 1 : currentIndex - 1;\n var firstIndex = insideDestination[0].descriptor.index;\n var lastIndex = insideDestination[insideDestination.length - 1].descriptor.index;\n var upperBound = isInHomeList ? lastIndex : lastIndex + 1;\n\n if (proposedIndex < firstIndex) {\n return null;\n }\n\n if (proposedIndex > upperBound) {\n return null;\n }\n\n return proposedIndex;\n});\n\nvar moveToNextIndex = (function (_ref) {\n var isMovingForward = _ref.isMovingForward,\n isInHomeList = _ref.isInHomeList,\n draggable = _ref.draggable,\n draggables = _ref.draggables,\n destination = _ref.destination,\n insideDestination = _ref.insideDestination,\n previousImpact = _ref.previousImpact,\n viewport = _ref.viewport,\n afterCritical = _ref.afterCritical;\n var wasAt = previousImpact.at;\n !wasAt ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot move in direction without previous impact location') : invariant(false) : void 0;\n\n if (wasAt.type === 'REORDER') {\n var _newIndex = fromReorder({\n isMovingForward: isMovingForward,\n isInHomeList: isInHomeList,\n location: wasAt.destination,\n insideDestination: insideDestination\n });\n\n if (_newIndex == null) {\n return null;\n }\n\n return calculateReorderImpact({\n draggable: draggable,\n insideDestination: insideDestination,\n destination: destination,\n viewport: viewport,\n last: previousImpact.displaced,\n displacedBy: previousImpact.displacedBy,\n index: _newIndex\n });\n }\n\n var newIndex = fromCombine({\n isMovingForward: isMovingForward,\n destination: destination,\n displaced: previousImpact.displaced,\n draggables: draggables,\n combine: wasAt.combine,\n afterCritical: afterCritical\n });\n\n if (newIndex == null) {\n return null;\n }\n\n return calculateReorderImpact({\n draggable: draggable,\n insideDestination: insideDestination,\n destination: destination,\n viewport: viewport,\n last: previousImpact.displaced,\n displacedBy: previousImpact.displacedBy,\n index: newIndex\n });\n});\n\nvar getCombinedItemDisplacement = (function (_ref) {\n var displaced = _ref.displaced,\n afterCritical = _ref.afterCritical,\n combineWith = _ref.combineWith,\n displacedBy = _ref.displacedBy;\n var isDisplaced = Boolean(displaced.visible[combineWith] || displaced.invisible[combineWith]);\n\n if (didStartAfterCritical(combineWith, afterCritical)) {\n return isDisplaced ? origin : negate(displacedBy.point);\n }\n\n return isDisplaced ? displacedBy.point : origin;\n});\n\nvar whenCombining = (function (_ref) {\n var afterCritical = _ref.afterCritical,\n impact = _ref.impact,\n draggables = _ref.draggables;\n var combine = tryGetCombine(impact);\n !combine ? process.env.NODE_ENV !== \"production\" ? invariant(false) : invariant(false) : void 0;\n var combineWith = combine.draggableId;\n var center = draggables[combineWith].page.borderBox.center;\n var displaceBy = getCombinedItemDisplacement({\n displaced: impact.displaced,\n afterCritical: afterCritical,\n combineWith: combineWith,\n displacedBy: impact.displacedBy\n });\n return add(center, displaceBy);\n});\n\nvar distanceFromStartToBorderBoxCenter = function distanceFromStartToBorderBoxCenter(axis, box) {\n return box.margin[axis.start] + box.borderBox[axis.size] / 2;\n};\n\nvar distanceFromEndToBorderBoxCenter = function distanceFromEndToBorderBoxCenter(axis, box) {\n return box.margin[axis.end] + box.borderBox[axis.size] / 2;\n};\n\nvar getCrossAxisBorderBoxCenter = function getCrossAxisBorderBoxCenter(axis, target, isMoving) {\n return target[axis.crossAxisStart] + isMoving.margin[axis.crossAxisStart] + isMoving.borderBox[axis.crossAxisSize] / 2;\n};\n\nvar goAfter = function goAfter(_ref) {\n var axis = _ref.axis,\n moveRelativeTo = _ref.moveRelativeTo,\n isMoving = _ref.isMoving;\n return patch(axis.line, moveRelativeTo.marginBox[axis.end] + distanceFromStartToBorderBoxCenter(axis, isMoving), getCrossAxisBorderBoxCenter(axis, moveRelativeTo.marginBox, isMoving));\n};\nvar goBefore = function goBefore(_ref2) {\n var axis = _ref2.axis,\n moveRelativeTo = _ref2.moveRelativeTo,\n isMoving = _ref2.isMoving;\n return patch(axis.line, moveRelativeTo.marginBox[axis.start] - distanceFromEndToBorderBoxCenter(axis, isMoving), getCrossAxisBorderBoxCenter(axis, moveRelativeTo.marginBox, isMoving));\n};\nvar goIntoStart = function goIntoStart(_ref3) {\n var axis = _ref3.axis,\n moveInto = _ref3.moveInto,\n isMoving = _ref3.isMoving;\n return patch(axis.line, moveInto.contentBox[axis.start] + distanceFromStartToBorderBoxCenter(axis, isMoving), getCrossAxisBorderBoxCenter(axis, moveInto.contentBox, isMoving));\n};\n\nvar whenReordering = (function (_ref) {\n var impact = _ref.impact,\n draggable = _ref.draggable,\n draggables = _ref.draggables,\n droppable = _ref.droppable,\n afterCritical = _ref.afterCritical;\n var insideDestination = getDraggablesInsideDroppable(droppable.descriptor.id, draggables);\n var draggablePage = draggable.page;\n var axis = droppable.axis;\n\n if (!insideDestination.length) {\n return goIntoStart({\n axis: axis,\n moveInto: droppable.page,\n isMoving: draggablePage\n });\n }\n\n var displaced = impact.displaced,\n displacedBy = impact.displacedBy;\n var closestAfter = displaced.all[0];\n\n if (closestAfter) {\n var closest = draggables[closestAfter];\n\n if (didStartAfterCritical(closestAfter, afterCritical)) {\n return goBefore({\n axis: axis,\n moveRelativeTo: closest.page,\n isMoving: draggablePage\n });\n }\n\n var withDisplacement = offset(closest.page, displacedBy.point);\n return goBefore({\n axis: axis,\n moveRelativeTo: withDisplacement,\n isMoving: draggablePage\n });\n }\n\n var last = insideDestination[insideDestination.length - 1];\n\n if (last.descriptor.id === draggable.descriptor.id) {\n return draggablePage.borderBox.center;\n }\n\n if (didStartAfterCritical(last.descriptor.id, afterCritical)) {\n var page = offset(last.page, negate(afterCritical.displacedBy.point));\n return goAfter({\n axis: axis,\n moveRelativeTo: page,\n isMoving: draggablePage\n });\n }\n\n return goAfter({\n axis: axis,\n moveRelativeTo: last.page,\n isMoving: draggablePage\n });\n});\n\nvar withDroppableDisplacement = (function (droppable, point) {\n var frame = droppable.frame;\n\n if (!frame) {\n return point;\n }\n\n return add(point, frame.scroll.diff.displacement);\n});\n\nvar getResultWithoutDroppableDisplacement = function getResultWithoutDroppableDisplacement(_ref) {\n var impact = _ref.impact,\n draggable = _ref.draggable,\n droppable = _ref.droppable,\n draggables = _ref.draggables,\n afterCritical = _ref.afterCritical;\n var original = draggable.page.borderBox.center;\n var at = impact.at;\n\n if (!droppable) {\n return original;\n }\n\n if (!at) {\n return original;\n }\n\n if (at.type === 'REORDER') {\n return whenReordering({\n impact: impact,\n draggable: draggable,\n draggables: draggables,\n droppable: droppable,\n afterCritical: afterCritical\n });\n }\n\n return whenCombining({\n impact: impact,\n draggables: draggables,\n afterCritical: afterCritical\n });\n};\n\nvar getPageBorderBoxCenterFromImpact = (function (args) {\n var withoutDisplacement = getResultWithoutDroppableDisplacement(args);\n var droppable = args.droppable;\n var withDisplacement = droppable ? withDroppableDisplacement(droppable, withoutDisplacement) : withoutDisplacement;\n return withDisplacement;\n});\n\nvar scrollViewport = (function (viewport, newScroll) {\n var diff = subtract(newScroll, viewport.scroll.initial);\n var displacement = negate(diff);\n var frame = getRect({\n top: newScroll.y,\n bottom: newScroll.y + viewport.frame.height,\n left: newScroll.x,\n right: newScroll.x + viewport.frame.width\n });\n var updated = {\n frame: frame,\n scroll: {\n initial: viewport.scroll.initial,\n max: viewport.scroll.max,\n current: newScroll,\n diff: {\n value: diff,\n displacement: displacement\n }\n }\n };\n return updated;\n});\n\nfunction getDraggables(ids, draggables) {\n return ids.map(function (id) {\n return draggables[id];\n });\n}\n\nfunction tryGetVisible(id, groups) {\n for (var i = 0; i < groups.length; i++) {\n var displacement = groups[i].visible[id];\n\n if (displacement) {\n return displacement;\n }\n }\n\n return null;\n}\n\nvar speculativelyIncrease = (function (_ref) {\n var impact = _ref.impact,\n viewport = _ref.viewport,\n destination = _ref.destination,\n draggables = _ref.draggables,\n maxScrollChange = _ref.maxScrollChange;\n var scrolledViewport = scrollViewport(viewport, add(viewport.scroll.current, maxScrollChange));\n var scrolledDroppable = destination.frame ? scrollDroppable(destination, add(destination.frame.scroll.current, maxScrollChange)) : destination;\n var last = impact.displaced;\n var withViewportScroll = getDisplacementGroups({\n afterDragging: getDraggables(last.all, draggables),\n destination: destination,\n displacedBy: impact.displacedBy,\n viewport: scrolledViewport.frame,\n last: last,\n forceShouldAnimate: false\n });\n var withDroppableScroll = getDisplacementGroups({\n afterDragging: getDraggables(last.all, draggables),\n destination: scrolledDroppable,\n displacedBy: impact.displacedBy,\n viewport: viewport.frame,\n last: last,\n forceShouldAnimate: false\n });\n var invisible = {};\n var visible = {};\n var groups = [last, withViewportScroll, withDroppableScroll];\n last.all.forEach(function (id) {\n var displacement = tryGetVisible(id, groups);\n\n if (displacement) {\n visible[id] = displacement;\n return;\n }\n\n invisible[id] = true;\n });\n\n var newImpact = _extends({}, impact, {\n displaced: {\n all: last.all,\n invisible: invisible,\n visible: visible\n }\n });\n\n return newImpact;\n});\n\nvar withViewportDisplacement = (function (viewport, point) {\n return add(viewport.scroll.diff.displacement, point);\n});\n\nvar getClientFromPageBorderBoxCenter = (function (_ref) {\n var pageBorderBoxCenter = _ref.pageBorderBoxCenter,\n draggable = _ref.draggable,\n viewport = _ref.viewport;\n var withoutPageScrollChange = withViewportDisplacement(viewport, pageBorderBoxCenter);\n var offset = subtract(withoutPageScrollChange, draggable.page.borderBox.center);\n return add(draggable.client.borderBox.center, offset);\n});\n\nvar isTotallyVisibleInNewLocation = (function (_ref) {\n var draggable = _ref.draggable,\n destination = _ref.destination,\n newPageBorderBoxCenter = _ref.newPageBorderBoxCenter,\n viewport = _ref.viewport,\n withDroppableDisplacement = _ref.withDroppableDisplacement,\n _ref$onlyOnMainAxis = _ref.onlyOnMainAxis,\n onlyOnMainAxis = _ref$onlyOnMainAxis === void 0 ? false : _ref$onlyOnMainAxis;\n var changeNeeded = subtract(newPageBorderBoxCenter, draggable.page.borderBox.center);\n var shifted = offsetByPosition(draggable.page.borderBox, changeNeeded);\n var args = {\n target: shifted,\n destination: destination,\n withDroppableDisplacement: withDroppableDisplacement,\n viewport: viewport\n };\n return onlyOnMainAxis ? isTotallyVisibleOnAxis(args) : isTotallyVisible(args);\n});\n\nvar moveToNextPlace = (function (_ref) {\n var isMovingForward = _ref.isMovingForward,\n draggable = _ref.draggable,\n destination = _ref.destination,\n draggables = _ref.draggables,\n previousImpact = _ref.previousImpact,\n viewport = _ref.viewport,\n previousPageBorderBoxCenter = _ref.previousPageBorderBoxCenter,\n previousClientSelection = _ref.previousClientSelection,\n afterCritical = _ref.afterCritical;\n\n if (!destination.isEnabled) {\n return null;\n }\n\n var insideDestination = getDraggablesInsideDroppable(destination.descriptor.id, draggables);\n var isInHomeList = isHomeOf(draggable, destination);\n var impact = moveToNextCombine({\n isMovingForward: isMovingForward,\n draggable: draggable,\n destination: destination,\n insideDestination: insideDestination,\n previousImpact: previousImpact\n }) || moveToNextIndex({\n isMovingForward: isMovingForward,\n isInHomeList: isInHomeList,\n draggable: draggable,\n draggables: draggables,\n destination: destination,\n insideDestination: insideDestination,\n previousImpact: previousImpact,\n viewport: viewport,\n afterCritical: afterCritical\n });\n\n if (!impact) {\n return null;\n }\n\n var pageBorderBoxCenter = getPageBorderBoxCenterFromImpact({\n impact: impact,\n draggable: draggable,\n droppable: destination,\n draggables: draggables,\n afterCritical: afterCritical\n });\n var isVisibleInNewLocation = isTotallyVisibleInNewLocation({\n draggable: draggable,\n destination: destination,\n newPageBorderBoxCenter: pageBorderBoxCenter,\n viewport: viewport.frame,\n withDroppableDisplacement: false,\n onlyOnMainAxis: true\n });\n\n if (isVisibleInNewLocation) {\n var clientSelection = getClientFromPageBorderBoxCenter({\n pageBorderBoxCenter: pageBorderBoxCenter,\n draggable: draggable,\n viewport: viewport\n });\n return {\n clientSelection: clientSelection,\n impact: impact,\n scrollJumpRequest: null\n };\n }\n\n var distance = subtract(pageBorderBoxCenter, previousPageBorderBoxCenter);\n var cautious = speculativelyIncrease({\n impact: impact,\n viewport: viewport,\n destination: destination,\n draggables: draggables,\n maxScrollChange: distance\n });\n return {\n clientSelection: previousClientSelection,\n impact: cautious,\n scrollJumpRequest: distance\n };\n});\n\nvar getKnownActive = function getKnownActive(droppable) {\n var rect = droppable.subject.active;\n !rect ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot get clipped area from droppable') : invariant(false) : void 0;\n return rect;\n};\n\nvar getBestCrossAxisDroppable = (function (_ref) {\n var isMovingForward = _ref.isMovingForward,\n pageBorderBoxCenter = _ref.pageBorderBoxCenter,\n source = _ref.source,\n droppables = _ref.droppables,\n viewport = _ref.viewport;\n var active = source.subject.active;\n\n if (!active) {\n return null;\n }\n\n var axis = source.axis;\n var isBetweenSourceClipped = isWithin(active[axis.start], active[axis.end]);\n var candidates = toDroppableList(droppables).filter(function (droppable) {\n return droppable !== source;\n }).filter(function (droppable) {\n return droppable.isEnabled;\n }).filter(function (droppable) {\n return Boolean(droppable.subject.active);\n }).filter(function (droppable) {\n return isPartiallyVisibleThroughFrame(viewport.frame)(getKnownActive(droppable));\n }).filter(function (droppable) {\n var activeOfTarget = getKnownActive(droppable);\n\n if (isMovingForward) {\n return active[axis.crossAxisEnd] < activeOfTarget[axis.crossAxisEnd];\n }\n\n return activeOfTarget[axis.crossAxisStart] < active[axis.crossAxisStart];\n }).filter(function (droppable) {\n var activeOfTarget = getKnownActive(droppable);\n var isBetweenDestinationClipped = isWithin(activeOfTarget[axis.start], activeOfTarget[axis.end]);\n return isBetweenSourceClipped(activeOfTarget[axis.start]) || isBetweenSourceClipped(activeOfTarget[axis.end]) || isBetweenDestinationClipped(active[axis.start]) || isBetweenDestinationClipped(active[axis.end]);\n }).sort(function (a, b) {\n var first = getKnownActive(a)[axis.crossAxisStart];\n var second = getKnownActive(b)[axis.crossAxisStart];\n\n if (isMovingForward) {\n return first - second;\n }\n\n return second - first;\n }).filter(function (droppable, index, array) {\n return getKnownActive(droppable)[axis.crossAxisStart] === getKnownActive(array[0])[axis.crossAxisStart];\n });\n\n if (!candidates.length) {\n return null;\n }\n\n if (candidates.length === 1) {\n return candidates[0];\n }\n\n var contains = candidates.filter(function (droppable) {\n var isWithinDroppable = isWithin(getKnownActive(droppable)[axis.start], getKnownActive(droppable)[axis.end]);\n return isWithinDroppable(pageBorderBoxCenter[axis.line]);\n });\n\n if (contains.length === 1) {\n return contains[0];\n }\n\n if (contains.length > 1) {\n return contains.sort(function (a, b) {\n return getKnownActive(a)[axis.start] - getKnownActive(b)[axis.start];\n })[0];\n }\n\n return candidates.sort(function (a, b) {\n var first = closest(pageBorderBoxCenter, getCorners(getKnownActive(a)));\n var second = closest(pageBorderBoxCenter, getCorners(getKnownActive(b)));\n\n if (first !== second) {\n return first - second;\n }\n\n return getKnownActive(a)[axis.start] - getKnownActive(b)[axis.start];\n })[0];\n});\n\nvar getCurrentPageBorderBoxCenter = function getCurrentPageBorderBoxCenter(draggable, afterCritical) {\n var original = draggable.page.borderBox.center;\n return didStartAfterCritical(draggable.descriptor.id, afterCritical) ? subtract(original, afterCritical.displacedBy.point) : original;\n};\nvar getCurrentPageBorderBox = function getCurrentPageBorderBox(draggable, afterCritical) {\n var original = draggable.page.borderBox;\n return didStartAfterCritical(draggable.descriptor.id, afterCritical) ? offsetByPosition(original, negate(afterCritical.displacedBy.point)) : original;\n};\n\nvar getClosestDraggable = (function (_ref) {\n var pageBorderBoxCenter = _ref.pageBorderBoxCenter,\n viewport = _ref.viewport,\n destination = _ref.destination,\n insideDestination = _ref.insideDestination,\n afterCritical = _ref.afterCritical;\n var sorted = insideDestination.filter(function (draggable) {\n return isTotallyVisible({\n target: getCurrentPageBorderBox(draggable, afterCritical),\n destination: destination,\n viewport: viewport.frame,\n withDroppableDisplacement: true\n });\n }).sort(function (a, b) {\n var distanceToA = distance(pageBorderBoxCenter, withDroppableDisplacement(destination, getCurrentPageBorderBoxCenter(a, afterCritical)));\n var distanceToB = distance(pageBorderBoxCenter, withDroppableDisplacement(destination, getCurrentPageBorderBoxCenter(b, afterCritical)));\n\n if (distanceToA < distanceToB) {\n return -1;\n }\n\n if (distanceToB < distanceToA) {\n return 1;\n }\n\n return a.descriptor.index - b.descriptor.index;\n });\n return sorted[0] || null;\n});\n\nvar getDisplacedBy = memoizeOne(function getDisplacedBy(axis, displaceBy) {\n var displacement = displaceBy[axis.line];\n return {\n value: displacement,\n point: patch(axis.line, displacement)\n };\n});\n\nvar getRequiredGrowthForPlaceholder = function getRequiredGrowthForPlaceholder(droppable, placeholderSize, draggables) {\n var axis = droppable.axis;\n\n if (droppable.descriptor.mode === 'virtual') {\n return patch(axis.line, placeholderSize[axis.line]);\n }\n\n var availableSpace = droppable.subject.page.contentBox[axis.size];\n var insideDroppable = getDraggablesInsideDroppable(droppable.descriptor.id, draggables);\n var spaceUsed = insideDroppable.reduce(function (sum, dimension) {\n return sum + dimension.client.marginBox[axis.size];\n }, 0);\n var requiredSpace = spaceUsed + placeholderSize[axis.line];\n var needsToGrowBy = requiredSpace - availableSpace;\n\n if (needsToGrowBy <= 0) {\n return null;\n }\n\n return patch(axis.line, needsToGrowBy);\n};\n\nvar withMaxScroll = function withMaxScroll(frame, max) {\n return _extends({}, frame, {\n scroll: _extends({}, frame.scroll, {\n max: max\n })\n });\n};\n\nvar addPlaceholder = function addPlaceholder(droppable, draggable, draggables) {\n var frame = droppable.frame;\n !!isHomeOf(draggable, droppable) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Should not add placeholder space to home list') : invariant(false) : void 0;\n !!droppable.subject.withPlaceholder ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot add placeholder size to a subject when it already has one') : invariant(false) : void 0;\n var placeholderSize = getDisplacedBy(droppable.axis, draggable.displaceBy).point;\n var requiredGrowth = getRequiredGrowthForPlaceholder(droppable, placeholderSize, draggables);\n var added = {\n placeholderSize: placeholderSize,\n increasedBy: requiredGrowth,\n oldFrameMaxScroll: droppable.frame ? droppable.frame.scroll.max : null\n };\n\n if (!frame) {\n var _subject = getSubject({\n page: droppable.subject.page,\n withPlaceholder: added,\n axis: droppable.axis,\n frame: droppable.frame\n });\n\n return _extends({}, droppable, {\n subject: _subject\n });\n }\n\n var maxScroll = requiredGrowth ? add(frame.scroll.max, requiredGrowth) : frame.scroll.max;\n var newFrame = withMaxScroll(frame, maxScroll);\n var subject = getSubject({\n page: droppable.subject.page,\n withPlaceholder: added,\n axis: droppable.axis,\n frame: newFrame\n });\n return _extends({}, droppable, {\n subject: subject,\n frame: newFrame\n });\n};\nvar removePlaceholder = function removePlaceholder(droppable) {\n var added = droppable.subject.withPlaceholder;\n !added ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot remove placeholder form subject when there was none') : invariant(false) : void 0;\n var frame = droppable.frame;\n\n if (!frame) {\n var _subject2 = getSubject({\n page: droppable.subject.page,\n axis: droppable.axis,\n frame: null,\n withPlaceholder: null\n });\n\n return _extends({}, droppable, {\n subject: _subject2\n });\n }\n\n var oldMaxScroll = added.oldFrameMaxScroll;\n !oldMaxScroll ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Expected droppable with frame to have old max frame scroll when removing placeholder') : invariant(false) : void 0;\n var newFrame = withMaxScroll(frame, oldMaxScroll);\n var subject = getSubject({\n page: droppable.subject.page,\n axis: droppable.axis,\n frame: newFrame,\n withPlaceholder: null\n });\n return _extends({}, droppable, {\n subject: subject,\n frame: newFrame\n });\n};\n\nvar moveToNewDroppable = (function (_ref) {\n var previousPageBorderBoxCenter = _ref.previousPageBorderBoxCenter,\n moveRelativeTo = _ref.moveRelativeTo,\n insideDestination = _ref.insideDestination,\n draggable = _ref.draggable,\n draggables = _ref.draggables,\n destination = _ref.destination,\n viewport = _ref.viewport,\n afterCritical = _ref.afterCritical;\n\n if (!moveRelativeTo) {\n if (insideDestination.length) {\n return null;\n }\n\n var proposed = {\n displaced: emptyGroups,\n displacedBy: noDisplacedBy,\n at: {\n type: 'REORDER',\n destination: {\n droppableId: destination.descriptor.id,\n index: 0\n }\n }\n };\n var proposedPageBorderBoxCenter = getPageBorderBoxCenterFromImpact({\n impact: proposed,\n draggable: draggable,\n droppable: destination,\n draggables: draggables,\n afterCritical: afterCritical\n });\n var withPlaceholder = isHomeOf(draggable, destination) ? destination : addPlaceholder(destination, draggable, draggables);\n var isVisibleInNewLocation = isTotallyVisibleInNewLocation({\n draggable: draggable,\n destination: withPlaceholder,\n newPageBorderBoxCenter: proposedPageBorderBoxCenter,\n viewport: viewport.frame,\n withDroppableDisplacement: false,\n onlyOnMainAxis: true\n });\n return isVisibleInNewLocation ? proposed : null;\n }\n\n var isGoingBeforeTarget = Boolean(previousPageBorderBoxCenter[destination.axis.line] <= moveRelativeTo.page.borderBox.center[destination.axis.line]);\n\n var proposedIndex = function () {\n var relativeTo = moveRelativeTo.descriptor.index;\n\n if (moveRelativeTo.descriptor.id === draggable.descriptor.id) {\n return relativeTo;\n }\n\n if (isGoingBeforeTarget) {\n return relativeTo;\n }\n\n return relativeTo + 1;\n }();\n\n var displacedBy = getDisplacedBy(destination.axis, draggable.displaceBy);\n return calculateReorderImpact({\n draggable: draggable,\n insideDestination: insideDestination,\n destination: destination,\n viewport: viewport,\n displacedBy: displacedBy,\n last: emptyGroups,\n index: proposedIndex\n });\n});\n\nvar moveCrossAxis = (function (_ref) {\n var isMovingForward = _ref.isMovingForward,\n previousPageBorderBoxCenter = _ref.previousPageBorderBoxCenter,\n draggable = _ref.draggable,\n isOver = _ref.isOver,\n draggables = _ref.draggables,\n droppables = _ref.droppables,\n viewport = _ref.viewport,\n afterCritical = _ref.afterCritical;\n var destination = getBestCrossAxisDroppable({\n isMovingForward: isMovingForward,\n pageBorderBoxCenter: previousPageBorderBoxCenter,\n source: isOver,\n droppables: droppables,\n viewport: viewport\n });\n\n if (!destination) {\n return null;\n }\n\n var insideDestination = getDraggablesInsideDroppable(destination.descriptor.id, draggables);\n var moveRelativeTo = getClosestDraggable({\n pageBorderBoxCenter: previousPageBorderBoxCenter,\n viewport: viewport,\n destination: destination,\n insideDestination: insideDestination,\n afterCritical: afterCritical\n });\n var impact = moveToNewDroppable({\n previousPageBorderBoxCenter: previousPageBorderBoxCenter,\n destination: destination,\n draggable: draggable,\n draggables: draggables,\n moveRelativeTo: moveRelativeTo,\n insideDestination: insideDestination,\n viewport: viewport,\n afterCritical: afterCritical\n });\n\n if (!impact) {\n return null;\n }\n\n var pageBorderBoxCenter = getPageBorderBoxCenterFromImpact({\n impact: impact,\n draggable: draggable,\n droppable: destination,\n draggables: draggables,\n afterCritical: afterCritical\n });\n var clientSelection = getClientFromPageBorderBoxCenter({\n pageBorderBoxCenter: pageBorderBoxCenter,\n draggable: draggable,\n viewport: viewport\n });\n return {\n clientSelection: clientSelection,\n impact: impact,\n scrollJumpRequest: null\n };\n});\n\nvar whatIsDraggedOver = (function (impact) {\n var at = impact.at;\n\n if (!at) {\n return null;\n }\n\n if (at.type === 'REORDER') {\n return at.destination.droppableId;\n }\n\n return at.combine.droppableId;\n});\n\nvar getDroppableOver = function getDroppableOver(impact, droppables) {\n var id = whatIsDraggedOver(impact);\n return id ? droppables[id] : null;\n};\n\nvar moveInDirection = (function (_ref) {\n var state = _ref.state,\n type = _ref.type;\n var isActuallyOver = getDroppableOver(state.impact, state.dimensions.droppables);\n var isMainAxisMovementAllowed = Boolean(isActuallyOver);\n var home = state.dimensions.droppables[state.critical.droppable.id];\n var isOver = isActuallyOver || home;\n var direction = isOver.axis.direction;\n var isMovingOnMainAxis = direction === 'vertical' && (type === 'MOVE_UP' || type === 'MOVE_DOWN') || direction === 'horizontal' && (type === 'MOVE_LEFT' || type === 'MOVE_RIGHT');\n\n if (isMovingOnMainAxis && !isMainAxisMovementAllowed) {\n return null;\n }\n\n var isMovingForward = type === 'MOVE_DOWN' || type === 'MOVE_RIGHT';\n var draggable = state.dimensions.draggables[state.critical.draggable.id];\n var previousPageBorderBoxCenter = state.current.page.borderBoxCenter;\n var _state$dimensions = state.dimensions,\n draggables = _state$dimensions.draggables,\n droppables = _state$dimensions.droppables;\n return isMovingOnMainAxis ? moveToNextPlace({\n isMovingForward: isMovingForward,\n previousPageBorderBoxCenter: previousPageBorderBoxCenter,\n draggable: draggable,\n destination: isOver,\n draggables: draggables,\n viewport: state.viewport,\n previousClientSelection: state.current.client.selection,\n previousImpact: state.impact,\n afterCritical: state.afterCritical\n }) : moveCrossAxis({\n isMovingForward: isMovingForward,\n previousPageBorderBoxCenter: previousPageBorderBoxCenter,\n draggable: draggable,\n isOver: isOver,\n draggables: draggables,\n droppables: droppables,\n viewport: state.viewport,\n afterCritical: state.afterCritical\n });\n});\n\nfunction isMovementAllowed(state) {\n return state.phase === 'DRAGGING' || state.phase === 'COLLECTING';\n}\n\nfunction isPositionInFrame(frame) {\n var isWithinVertical = isWithin(frame.top, frame.bottom);\n var isWithinHorizontal = isWithin(frame.left, frame.right);\n return function run(point) {\n return isWithinVertical(point.y) && isWithinHorizontal(point.x);\n };\n}\n\nfunction getHasOverlap(first, second) {\n return first.left < second.right && first.right > second.left && first.top < second.bottom && first.bottom > second.top;\n}\n\nfunction getFurthestAway(_ref) {\n var pageBorderBox = _ref.pageBorderBox,\n draggable = _ref.draggable,\n candidates = _ref.candidates;\n var startCenter = draggable.page.borderBox.center;\n var sorted = candidates.map(function (candidate) {\n var axis = candidate.axis;\n var target = patch(candidate.axis.line, pageBorderBox.center[axis.line], candidate.page.borderBox.center[axis.crossAxisLine]);\n return {\n id: candidate.descriptor.id,\n distance: distance(startCenter, target)\n };\n }).sort(function (a, b) {\n return b.distance - a.distance;\n });\n return sorted[0] ? sorted[0].id : null;\n}\n\nfunction getDroppableOver$1(_ref2) {\n var pageBorderBox = _ref2.pageBorderBox,\n draggable = _ref2.draggable,\n droppables = _ref2.droppables;\n var candidates = toDroppableList(droppables).filter(function (item) {\n if (!item.isEnabled) {\n return false;\n }\n\n var active = item.subject.active;\n\n if (!active) {\n return false;\n }\n\n if (!getHasOverlap(pageBorderBox, active)) {\n return false;\n }\n\n if (isPositionInFrame(active)(pageBorderBox.center)) {\n return true;\n }\n\n var axis = item.axis;\n var childCenter = active.center[axis.crossAxisLine];\n var crossAxisStart = pageBorderBox[axis.crossAxisStart];\n var crossAxisEnd = pageBorderBox[axis.crossAxisEnd];\n var isContained = isWithin(active[axis.crossAxisStart], active[axis.crossAxisEnd]);\n var isStartContained = isContained(crossAxisStart);\n var isEndContained = isContained(crossAxisEnd);\n\n if (!isStartContained && !isEndContained) {\n return true;\n }\n\n if (isStartContained) {\n return crossAxisStart < childCenter;\n }\n\n return crossAxisEnd > childCenter;\n });\n\n if (!candidates.length) {\n return null;\n }\n\n if (candidates.length === 1) {\n return candidates[0].descriptor.id;\n }\n\n return getFurthestAway({\n pageBorderBox: pageBorderBox,\n draggable: draggable,\n candidates: candidates\n });\n}\n\nvar offsetRectByPosition = function offsetRectByPosition(rect, point) {\n return getRect(offsetByPosition(rect, point));\n};\n\nvar withDroppableScroll = (function (droppable, area) {\n var frame = droppable.frame;\n\n if (!frame) {\n return area;\n }\n\n return offsetRectByPosition(area, frame.scroll.diff.value);\n});\n\nfunction getIsDisplaced(_ref) {\n var displaced = _ref.displaced,\n id = _ref.id;\n return Boolean(displaced.visible[id] || displaced.invisible[id]);\n}\n\nfunction atIndex(_ref) {\n var draggable = _ref.draggable,\n closest = _ref.closest,\n inHomeList = _ref.inHomeList;\n\n if (!closest) {\n return null;\n }\n\n if (!inHomeList) {\n return closest.descriptor.index;\n }\n\n if (closest.descriptor.index > draggable.descriptor.index) {\n return closest.descriptor.index - 1;\n }\n\n return closest.descriptor.index;\n}\n\nvar getReorderImpact = (function (_ref2) {\n var targetRect = _ref2.pageBorderBoxWithDroppableScroll,\n draggable = _ref2.draggable,\n destination = _ref2.destination,\n insideDestination = _ref2.insideDestination,\n last = _ref2.last,\n viewport = _ref2.viewport,\n afterCritical = _ref2.afterCritical;\n var axis = destination.axis;\n var displacedBy = getDisplacedBy(destination.axis, draggable.displaceBy);\n var displacement = displacedBy.value;\n var targetStart = targetRect[axis.start];\n var targetEnd = targetRect[axis.end];\n var withoutDragging = removeDraggableFromList(draggable, insideDestination);\n var closest = find(withoutDragging, function (child) {\n var id = child.descriptor.id;\n var childCenter = child.page.borderBox.center[axis.line];\n var didStartAfterCritical$1 = didStartAfterCritical(id, afterCritical);\n var isDisplaced = getIsDisplaced({\n displaced: last,\n id: id\n });\n\n if (didStartAfterCritical$1) {\n if (isDisplaced) {\n return targetEnd <= childCenter;\n }\n\n return targetStart < childCenter - displacement;\n }\n\n if (isDisplaced) {\n return targetEnd <= childCenter + displacement;\n }\n\n return targetStart < childCenter;\n });\n var newIndex = atIndex({\n draggable: draggable,\n closest: closest,\n inHomeList: isHomeOf(draggable, destination)\n });\n return calculateReorderImpact({\n draggable: draggable,\n insideDestination: insideDestination,\n destination: destination,\n viewport: viewport,\n last: last,\n displacedBy: displacedBy,\n index: newIndex\n });\n});\n\nvar combineThresholdDivisor = 4;\nvar getCombineImpact = (function (_ref) {\n var draggable = _ref.draggable,\n targetRect = _ref.pageBorderBoxWithDroppableScroll,\n previousImpact = _ref.previousImpact,\n destination = _ref.destination,\n insideDestination = _ref.insideDestination,\n afterCritical = _ref.afterCritical;\n\n if (!destination.isCombineEnabled) {\n return null;\n }\n\n var axis = destination.axis;\n var displacedBy = getDisplacedBy(destination.axis, draggable.displaceBy);\n var displacement = displacedBy.value;\n var targetStart = targetRect[axis.start];\n var targetEnd = targetRect[axis.end];\n var withoutDragging = removeDraggableFromList(draggable, insideDestination);\n var combineWith = find(withoutDragging, function (child) {\n var id = child.descriptor.id;\n var childRect = child.page.borderBox;\n var childSize = childRect[axis.size];\n var threshold = childSize / combineThresholdDivisor;\n var didStartAfterCritical$1 = didStartAfterCritical(id, afterCritical);\n var isDisplaced = getIsDisplaced({\n displaced: previousImpact.displaced,\n id: id\n });\n\n if (didStartAfterCritical$1) {\n if (isDisplaced) {\n return targetEnd > childRect[axis.start] + threshold && targetEnd < childRect[axis.end] - threshold;\n }\n\n return targetStart > childRect[axis.start] - displacement + threshold && targetStart < childRect[axis.end] - displacement - threshold;\n }\n\n if (isDisplaced) {\n return targetEnd > childRect[axis.start] + displacement + threshold && targetEnd < childRect[axis.end] + displacement - threshold;\n }\n\n return targetStart > childRect[axis.start] + threshold && targetStart < childRect[axis.end] - threshold;\n });\n\n if (!combineWith) {\n return null;\n }\n\n var impact = {\n displacedBy: displacedBy,\n displaced: previousImpact.displaced,\n at: {\n type: 'COMBINE',\n combine: {\n draggableId: combineWith.descriptor.id,\n droppableId: destination.descriptor.id\n }\n }\n };\n return impact;\n});\n\nvar getDragImpact = (function (_ref) {\n var pageOffset = _ref.pageOffset,\n draggable = _ref.draggable,\n draggables = _ref.draggables,\n droppables = _ref.droppables,\n previousImpact = _ref.previousImpact,\n viewport = _ref.viewport,\n afterCritical = _ref.afterCritical;\n var pageBorderBox = offsetRectByPosition(draggable.page.borderBox, pageOffset);\n var destinationId = getDroppableOver$1({\n pageBorderBox: pageBorderBox,\n draggable: draggable,\n droppables: droppables\n });\n\n if (!destinationId) {\n return noImpact;\n }\n\n var destination = droppables[destinationId];\n var insideDestination = getDraggablesInsideDroppable(destination.descriptor.id, draggables);\n var pageBorderBoxWithDroppableScroll = withDroppableScroll(destination, pageBorderBox);\n return getCombineImpact({\n pageBorderBoxWithDroppableScroll: pageBorderBoxWithDroppableScroll,\n draggable: draggable,\n previousImpact: previousImpact,\n destination: destination,\n insideDestination: insideDestination,\n afterCritical: afterCritical\n }) || getReorderImpact({\n pageBorderBoxWithDroppableScroll: pageBorderBoxWithDroppableScroll,\n draggable: draggable,\n destination: destination,\n insideDestination: insideDestination,\n last: previousImpact.displaced,\n viewport: viewport,\n afterCritical: afterCritical\n });\n});\n\nvar patchDroppableMap = (function (droppables, updated) {\n var _extends2;\n\n return _extends({}, droppables, (_extends2 = {}, _extends2[updated.descriptor.id] = updated, _extends2));\n});\n\nvar clearUnusedPlaceholder = function clearUnusedPlaceholder(_ref) {\n var previousImpact = _ref.previousImpact,\n impact = _ref.impact,\n droppables = _ref.droppables;\n var last = whatIsDraggedOver(previousImpact);\n var now = whatIsDraggedOver(impact);\n\n if (!last) {\n return droppables;\n }\n\n if (last === now) {\n return droppables;\n }\n\n var lastDroppable = droppables[last];\n\n if (!lastDroppable.subject.withPlaceholder) {\n return droppables;\n }\n\n var updated = removePlaceholder(lastDroppable);\n return patchDroppableMap(droppables, updated);\n};\n\nvar recomputePlaceholders = (function (_ref2) {\n var draggable = _ref2.draggable,\n draggables = _ref2.draggables,\n droppables = _ref2.droppables,\n previousImpact = _ref2.previousImpact,\n impact = _ref2.impact;\n var cleaned = clearUnusedPlaceholder({\n previousImpact: previousImpact,\n impact: impact,\n droppables: droppables\n });\n var isOver = whatIsDraggedOver(impact);\n\n if (!isOver) {\n return cleaned;\n }\n\n var droppable = droppables[isOver];\n\n if (isHomeOf(draggable, droppable)) {\n return cleaned;\n }\n\n if (droppable.subject.withPlaceholder) {\n return cleaned;\n }\n\n var patched = addPlaceholder(droppable, draggable, draggables);\n return patchDroppableMap(cleaned, patched);\n});\n\nvar update = (function (_ref) {\n var state = _ref.state,\n forcedClientSelection = _ref.clientSelection,\n forcedDimensions = _ref.dimensions,\n forcedViewport = _ref.viewport,\n forcedImpact = _ref.impact,\n scrollJumpRequest = _ref.scrollJumpRequest;\n var viewport = forcedViewport || state.viewport;\n var dimensions = forcedDimensions || state.dimensions;\n var clientSelection = forcedClientSelection || state.current.client.selection;\n var offset = subtract(clientSelection, state.initial.client.selection);\n var client = {\n offset: offset,\n selection: clientSelection,\n borderBoxCenter: add(state.initial.client.borderBoxCenter, offset)\n };\n var page = {\n selection: add(client.selection, viewport.scroll.current),\n borderBoxCenter: add(client.borderBoxCenter, viewport.scroll.current),\n offset: add(client.offset, viewport.scroll.diff.value)\n };\n var current = {\n client: client,\n page: page\n };\n\n if (state.phase === 'COLLECTING') {\n return _extends({\n phase: 'COLLECTING'\n }, state, {\n dimensions: dimensions,\n viewport: viewport,\n current: current\n });\n }\n\n var draggable = dimensions.draggables[state.critical.draggable.id];\n var newImpact = forcedImpact || getDragImpact({\n pageOffset: page.offset,\n draggable: draggable,\n draggables: dimensions.draggables,\n droppables: dimensions.droppables,\n previousImpact: state.impact,\n viewport: viewport,\n afterCritical: state.afterCritical\n });\n var withUpdatedPlaceholders = recomputePlaceholders({\n draggable: draggable,\n impact: newImpact,\n previousImpact: state.impact,\n draggables: dimensions.draggables,\n droppables: dimensions.droppables\n });\n\n var result = _extends({}, state, {\n current: current,\n dimensions: {\n draggables: dimensions.draggables,\n droppables: withUpdatedPlaceholders\n },\n impact: newImpact,\n viewport: viewport,\n scrollJumpRequest: scrollJumpRequest || null,\n forceShouldAnimate: scrollJumpRequest ? false : null\n });\n\n return result;\n});\n\nfunction getDraggables$1(ids, draggables) {\n return ids.map(function (id) {\n return draggables[id];\n });\n}\n\nvar recompute = (function (_ref) {\n var impact = _ref.impact,\n viewport = _ref.viewport,\n draggables = _ref.draggables,\n destination = _ref.destination,\n forceShouldAnimate = _ref.forceShouldAnimate;\n var last = impact.displaced;\n var afterDragging = getDraggables$1(last.all, draggables);\n var displaced = getDisplacementGroups({\n afterDragging: afterDragging,\n destination: destination,\n displacedBy: impact.displacedBy,\n viewport: viewport.frame,\n forceShouldAnimate: forceShouldAnimate,\n last: last\n });\n return _extends({}, impact, {\n displaced: displaced\n });\n});\n\nvar getClientBorderBoxCenter = (function (_ref) {\n var impact = _ref.impact,\n draggable = _ref.draggable,\n droppable = _ref.droppable,\n draggables = _ref.draggables,\n viewport = _ref.viewport,\n afterCritical = _ref.afterCritical;\n var pageBorderBoxCenter = getPageBorderBoxCenterFromImpact({\n impact: impact,\n draggable: draggable,\n draggables: draggables,\n droppable: droppable,\n afterCritical: afterCritical\n });\n return getClientFromPageBorderBoxCenter({\n pageBorderBoxCenter: pageBorderBoxCenter,\n draggable: draggable,\n viewport: viewport\n });\n});\n\nvar refreshSnap = (function (_ref) {\n var state = _ref.state,\n forcedDimensions = _ref.dimensions,\n forcedViewport = _ref.viewport;\n !(state.movementMode === 'SNAP') ? process.env.NODE_ENV !== \"production\" ? invariant(false) : invariant(false) : void 0;\n var needsVisibilityCheck = state.impact;\n var viewport = forcedViewport || state.viewport;\n var dimensions = forcedDimensions || state.dimensions;\n var draggables = dimensions.draggables,\n droppables = dimensions.droppables;\n var draggable = draggables[state.critical.draggable.id];\n var isOver = whatIsDraggedOver(needsVisibilityCheck);\n !isOver ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Must be over a destination in SNAP movement mode') : invariant(false) : void 0;\n var destination = droppables[isOver];\n var impact = recompute({\n impact: needsVisibilityCheck,\n viewport: viewport,\n destination: destination,\n draggables: draggables\n });\n var clientSelection = getClientBorderBoxCenter({\n impact: impact,\n draggable: draggable,\n droppable: destination,\n draggables: draggables,\n viewport: viewport,\n afterCritical: state.afterCritical\n });\n return update({\n impact: impact,\n clientSelection: clientSelection,\n state: state,\n dimensions: dimensions,\n viewport: viewport\n });\n});\n\nvar getHomeLocation = (function (descriptor) {\n return {\n index: descriptor.index,\n droppableId: descriptor.droppableId\n };\n});\n\nvar getLiftEffect = (function (_ref) {\n var draggable = _ref.draggable,\n home = _ref.home,\n draggables = _ref.draggables,\n viewport = _ref.viewport;\n var displacedBy = getDisplacedBy(home.axis, draggable.displaceBy);\n var insideHome = getDraggablesInsideDroppable(home.descriptor.id, draggables);\n var rawIndex = insideHome.indexOf(draggable);\n !(rawIndex !== -1) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Expected draggable to be inside home list') : invariant(false) : void 0;\n var afterDragging = insideHome.slice(rawIndex + 1);\n var effected = afterDragging.reduce(function (previous, item) {\n previous[item.descriptor.id] = true;\n return previous;\n }, {});\n var afterCritical = {\n inVirtualList: home.descriptor.mode === 'virtual',\n displacedBy: displacedBy,\n effected: effected\n };\n var displaced = getDisplacementGroups({\n afterDragging: afterDragging,\n destination: home,\n displacedBy: displacedBy,\n last: null,\n viewport: viewport.frame,\n forceShouldAnimate: false\n });\n var impact = {\n displaced: displaced,\n displacedBy: displacedBy,\n at: {\n type: 'REORDER',\n destination: getHomeLocation(draggable.descriptor)\n }\n };\n return {\n impact: impact,\n afterCritical: afterCritical\n };\n});\n\nvar patchDimensionMap = (function (dimensions, updated) {\n return {\n draggables: dimensions.draggables,\n droppables: patchDroppableMap(dimensions.droppables, updated)\n };\n});\n\nvar start = function start(key) {\n if (process.env.NODE_ENV !== 'production') {\n {\n return;\n }\n }\n};\nvar finish = function finish(key) {\n if (process.env.NODE_ENV !== 'production') {\n {\n return;\n }\n }\n};\n\nvar offsetDraggable = (function (_ref) {\n var draggable = _ref.draggable,\n offset$1 = _ref.offset,\n initialWindowScroll = _ref.initialWindowScroll;\n var client = offset(draggable.client, offset$1);\n var page = withScroll(client, initialWindowScroll);\n\n var moved = _extends({}, draggable, {\n placeholder: _extends({}, draggable.placeholder, {\n client: client\n }),\n client: client,\n page: page\n });\n\n return moved;\n});\n\nvar getFrame = (function (droppable) {\n var frame = droppable.frame;\n !frame ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Expected Droppable to have a frame') : invariant(false) : void 0;\n return frame;\n});\n\nvar adjustAdditionsForScrollChanges = (function (_ref) {\n var additions = _ref.additions,\n updatedDroppables = _ref.updatedDroppables,\n viewport = _ref.viewport;\n var windowScrollChange = viewport.scroll.diff.value;\n return additions.map(function (draggable) {\n var droppableId = draggable.descriptor.droppableId;\n var modified = updatedDroppables[droppableId];\n var frame = getFrame(modified);\n var droppableScrollChange = frame.scroll.diff.value;\n var totalChange = add(windowScrollChange, droppableScrollChange);\n var moved = offsetDraggable({\n draggable: draggable,\n offset: totalChange,\n initialWindowScroll: viewport.scroll.initial\n });\n return moved;\n });\n});\n\nvar publishWhileDraggingInVirtual = (function (_ref) {\n var state = _ref.state,\n published = _ref.published;\n start();\n var withScrollChange = published.modified.map(function (update) {\n var existing = state.dimensions.droppables[update.droppableId];\n var scrolled = scrollDroppable(existing, update.scroll);\n return scrolled;\n });\n\n var droppables = _extends({}, state.dimensions.droppables, {}, toDroppableMap(withScrollChange));\n\n var updatedAdditions = toDraggableMap(adjustAdditionsForScrollChanges({\n additions: published.additions,\n updatedDroppables: droppables,\n viewport: state.viewport\n }));\n\n var draggables = _extends({}, state.dimensions.draggables, {}, updatedAdditions);\n\n published.removals.forEach(function (id) {\n delete draggables[id];\n });\n var dimensions = {\n droppables: droppables,\n draggables: draggables\n };\n var wasOverId = whatIsDraggedOver(state.impact);\n var wasOver = wasOverId ? dimensions.droppables[wasOverId] : null;\n var draggable = dimensions.draggables[state.critical.draggable.id];\n var home = dimensions.droppables[state.critical.droppable.id];\n\n var _getLiftEffect = getLiftEffect({\n draggable: draggable,\n home: home,\n draggables: draggables,\n viewport: state.viewport\n }),\n onLiftImpact = _getLiftEffect.impact,\n afterCritical = _getLiftEffect.afterCritical;\n\n var previousImpact = wasOver && wasOver.isCombineEnabled ? state.impact : onLiftImpact;\n var impact = getDragImpact({\n pageOffset: state.current.page.offset,\n draggable: dimensions.draggables[state.critical.draggable.id],\n draggables: dimensions.draggables,\n droppables: dimensions.droppables,\n previousImpact: previousImpact,\n viewport: state.viewport,\n afterCritical: afterCritical\n });\n finish();\n\n var draggingState = _extends({\n phase: 'DRAGGING'\n }, state, {\n phase: 'DRAGGING',\n impact: impact,\n onLiftImpact: onLiftImpact,\n dimensions: dimensions,\n afterCritical: afterCritical,\n forceShouldAnimate: false\n });\n\n if (state.phase === 'COLLECTING') {\n return draggingState;\n }\n\n var dropPending = _extends({\n phase: 'DROP_PENDING'\n }, draggingState, {\n phase: 'DROP_PENDING',\n reason: state.reason,\n isWaiting: false\n });\n\n return dropPending;\n});\n\nvar isSnapping = function isSnapping(state) {\n return state.movementMode === 'SNAP';\n};\n\nvar postDroppableChange = function postDroppableChange(state, updated, isEnabledChanging) {\n var dimensions = patchDimensionMap(state.dimensions, updated);\n\n if (!isSnapping(state) || isEnabledChanging) {\n return update({\n state: state,\n dimensions: dimensions\n });\n }\n\n return refreshSnap({\n state: state,\n dimensions: dimensions\n });\n};\n\nfunction removeScrollJumpRequest(state) {\n if (state.isDragging && state.movementMode === 'SNAP') {\n return _extends({\n phase: 'DRAGGING'\n }, state, {\n scrollJumpRequest: null\n });\n }\n\n return state;\n}\n\nvar idle = {\n phase: 'IDLE',\n completed: null,\n shouldFlush: false\n};\nvar reducer = (function (state, action) {\n if (state === void 0) {\n state = idle;\n }\n\n if (action.type === 'FLUSH') {\n return _extends({}, idle, {\n shouldFlush: true\n });\n }\n\n if (action.type === 'INITIAL_PUBLISH') {\n !(state.phase === 'IDLE') ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'INITIAL_PUBLISH must come after a IDLE phase') : invariant(false) : void 0;\n var _action$payload = action.payload,\n critical = _action$payload.critical,\n clientSelection = _action$payload.clientSelection,\n viewport = _action$payload.viewport,\n dimensions = _action$payload.dimensions,\n movementMode = _action$payload.movementMode;\n var draggable = dimensions.draggables[critical.draggable.id];\n var home = dimensions.droppables[critical.droppable.id];\n var client = {\n selection: clientSelection,\n borderBoxCenter: draggable.client.borderBox.center,\n offset: origin\n };\n var initial = {\n client: client,\n page: {\n selection: add(client.selection, viewport.scroll.initial),\n borderBoxCenter: add(client.selection, viewport.scroll.initial),\n offset: add(client.selection, viewport.scroll.diff.value)\n }\n };\n var isWindowScrollAllowed = toDroppableList(dimensions.droppables).every(function (item) {\n return !item.isFixedOnPage;\n });\n\n var _getLiftEffect = getLiftEffect({\n draggable: draggable,\n home: home,\n draggables: dimensions.draggables,\n viewport: viewport\n }),\n impact = _getLiftEffect.impact,\n afterCritical = _getLiftEffect.afterCritical;\n\n var result = {\n phase: 'DRAGGING',\n isDragging: true,\n critical: critical,\n movementMode: movementMode,\n dimensions: dimensions,\n initial: initial,\n current: initial,\n isWindowScrollAllowed: isWindowScrollAllowed,\n impact: impact,\n afterCritical: afterCritical,\n onLiftImpact: impact,\n viewport: viewport,\n scrollJumpRequest: null,\n forceShouldAnimate: null\n };\n return result;\n }\n\n if (action.type === 'COLLECTION_STARTING') {\n if (state.phase === 'COLLECTING' || state.phase === 'DROP_PENDING') {\n return state;\n }\n\n !(state.phase === 'DRAGGING') ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"Collection cannot start from phase \" + state.phase) : invariant(false) : void 0;\n\n var _result = _extends({\n phase: 'COLLECTING'\n }, state, {\n phase: 'COLLECTING'\n });\n\n return _result;\n }\n\n if (action.type === 'PUBLISH_WHILE_DRAGGING') {\n !(state.phase === 'COLLECTING' || state.phase === 'DROP_PENDING') ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"Unexpected \" + action.type + \" received in phase \" + state.phase) : invariant(false) : void 0;\n return publishWhileDraggingInVirtual({\n state: state,\n published: action.payload\n });\n }\n\n if (action.type === 'MOVE') {\n if (state.phase === 'DROP_PENDING') {\n return state;\n }\n\n !isMovementAllowed(state) ? process.env.NODE_ENV !== \"production\" ? invariant(false, action.type + \" not permitted in phase \" + state.phase) : invariant(false) : void 0;\n var _clientSelection = action.payload.client;\n\n if (isEqual(_clientSelection, state.current.client.selection)) {\n return state;\n }\n\n return update({\n state: state,\n clientSelection: _clientSelection,\n impact: isSnapping(state) ? state.impact : null\n });\n }\n\n if (action.type === 'UPDATE_DROPPABLE_SCROLL') {\n if (state.phase === 'DROP_PENDING') {\n return removeScrollJumpRequest(state);\n }\n\n if (state.phase === 'COLLECTING') {\n return removeScrollJumpRequest(state);\n }\n\n !isMovementAllowed(state) ? process.env.NODE_ENV !== \"production\" ? invariant(false, action.type + \" not permitted in phase \" + state.phase) : invariant(false) : void 0;\n var _action$payload2 = action.payload,\n id = _action$payload2.id,\n newScroll = _action$payload2.newScroll;\n var target = state.dimensions.droppables[id];\n\n if (!target) {\n return state;\n }\n\n var scrolled = scrollDroppable(target, newScroll);\n return postDroppableChange(state, scrolled, false);\n }\n\n if (action.type === 'UPDATE_DROPPABLE_IS_ENABLED') {\n if (state.phase === 'DROP_PENDING') {\n return state;\n }\n\n !isMovementAllowed(state) ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"Attempting to move in an unsupported phase \" + state.phase) : invariant(false) : void 0;\n var _action$payload3 = action.payload,\n _id = _action$payload3.id,\n isEnabled = _action$payload3.isEnabled;\n var _target = state.dimensions.droppables[_id];\n !_target ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"Cannot find Droppable[id: \" + _id + \"] to toggle its enabled state\") : invariant(false) : void 0;\n !(_target.isEnabled !== isEnabled) ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"Trying to set droppable isEnabled to \" + String(isEnabled) + \"\\n but it is already \" + String(_target.isEnabled)) : invariant(false) : void 0;\n\n var updated = _extends({}, _target, {\n isEnabled: isEnabled\n });\n\n return postDroppableChange(state, updated, true);\n }\n\n if (action.type === 'UPDATE_DROPPABLE_IS_COMBINE_ENABLED') {\n if (state.phase === 'DROP_PENDING') {\n return state;\n }\n\n !isMovementAllowed(state) ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"Attempting to move in an unsupported phase \" + state.phase) : invariant(false) : void 0;\n var _action$payload4 = action.payload,\n _id2 = _action$payload4.id,\n isCombineEnabled = _action$payload4.isCombineEnabled;\n var _target2 = state.dimensions.droppables[_id2];\n !_target2 ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"Cannot find Droppable[id: \" + _id2 + \"] to toggle its isCombineEnabled state\") : invariant(false) : void 0;\n !(_target2.isCombineEnabled !== isCombineEnabled) ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"Trying to set droppable isCombineEnabled to \" + String(isCombineEnabled) + \"\\n but it is already \" + String(_target2.isCombineEnabled)) : invariant(false) : void 0;\n\n var _updated = _extends({}, _target2, {\n isCombineEnabled: isCombineEnabled\n });\n\n return postDroppableChange(state, _updated, true);\n }\n\n if (action.type === 'MOVE_BY_WINDOW_SCROLL') {\n if (state.phase === 'DROP_PENDING' || state.phase === 'DROP_ANIMATING') {\n return state;\n }\n\n !isMovementAllowed(state) ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"Cannot move by window in phase \" + state.phase) : invariant(false) : void 0;\n !state.isWindowScrollAllowed ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Window scrolling is currently not supported for fixed lists') : invariant(false) : void 0;\n var _newScroll = action.payload.newScroll;\n\n if (isEqual(state.viewport.scroll.current, _newScroll)) {\n return removeScrollJumpRequest(state);\n }\n\n var _viewport = scrollViewport(state.viewport, _newScroll);\n\n if (isSnapping(state)) {\n return refreshSnap({\n state: state,\n viewport: _viewport\n });\n }\n\n return update({\n state: state,\n viewport: _viewport\n });\n }\n\n if (action.type === 'UPDATE_VIEWPORT_MAX_SCROLL') {\n if (!isMovementAllowed(state)) {\n return state;\n }\n\n var maxScroll = action.payload.maxScroll;\n\n if (isEqual(maxScroll, state.viewport.scroll.max)) {\n return state;\n }\n\n var withMaxScroll = _extends({}, state.viewport, {\n scroll: _extends({}, state.viewport.scroll, {\n max: maxScroll\n })\n });\n\n return _extends({\n phase: 'DRAGGING'\n }, state, {\n viewport: withMaxScroll\n });\n }\n\n if (action.type === 'MOVE_UP' || action.type === 'MOVE_DOWN' || action.type === 'MOVE_LEFT' || action.type === 'MOVE_RIGHT') {\n if (state.phase === 'COLLECTING' || state.phase === 'DROP_PENDING') {\n return state;\n }\n\n !(state.phase === 'DRAGGING') ? process.env.NODE_ENV !== \"production\" ? invariant(false, action.type + \" received while not in DRAGGING phase\") : invariant(false) : void 0;\n\n var _result2 = moveInDirection({\n state: state,\n type: action.type\n });\n\n if (!_result2) {\n return state;\n }\n\n return update({\n state: state,\n impact: _result2.impact,\n clientSelection: _result2.clientSelection,\n scrollJumpRequest: _result2.scrollJumpRequest\n });\n }\n\n if (action.type === 'DROP_PENDING') {\n var reason = action.payload.reason;\n !(state.phase === 'COLLECTING') ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Can only move into the DROP_PENDING phase from the COLLECTING phase') : invariant(false) : void 0;\n\n var newState = _extends({\n phase: 'DROP_PENDING'\n }, state, {\n phase: 'DROP_PENDING',\n isWaiting: true,\n reason: reason\n });\n\n return newState;\n }\n\n if (action.type === 'DROP_ANIMATE') {\n var _action$payload5 = action.payload,\n completed = _action$payload5.completed,\n dropDuration = _action$payload5.dropDuration,\n newHomeClientOffset = _action$payload5.newHomeClientOffset;\n !(state.phase === 'DRAGGING' || state.phase === 'DROP_PENDING') ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"Cannot animate drop from phase \" + state.phase) : invariant(false) : void 0;\n var _result3 = {\n phase: 'DROP_ANIMATING',\n completed: completed,\n dropDuration: dropDuration,\n newHomeClientOffset: newHomeClientOffset,\n dimensions: state.dimensions\n };\n return _result3;\n }\n\n if (action.type === 'DROP_COMPLETE') {\n var _completed = action.payload.completed;\n return {\n phase: 'IDLE',\n completed: _completed,\n shouldFlush: false\n };\n }\n\n return state;\n});\n\nvar beforeInitialCapture = function beforeInitialCapture(args) {\n return {\n type: 'BEFORE_INITIAL_CAPTURE',\n payload: args\n };\n};\nvar lift = function lift(args) {\n return {\n type: 'LIFT',\n payload: args\n };\n};\nvar initialPublish = function initialPublish(args) {\n return {\n type: 'INITIAL_PUBLISH',\n payload: args\n };\n};\nvar publishWhileDragging = function publishWhileDragging(args) {\n return {\n type: 'PUBLISH_WHILE_DRAGGING',\n payload: args\n };\n};\nvar collectionStarting = function collectionStarting() {\n return {\n type: 'COLLECTION_STARTING',\n payload: null\n };\n};\nvar updateDroppableScroll = function updateDroppableScroll(args) {\n return {\n type: 'UPDATE_DROPPABLE_SCROLL',\n payload: args\n };\n};\nvar updateDroppableIsEnabled = function updateDroppableIsEnabled(args) {\n return {\n type: 'UPDATE_DROPPABLE_IS_ENABLED',\n payload: args\n };\n};\nvar updateDroppableIsCombineEnabled = function updateDroppableIsCombineEnabled(args) {\n return {\n type: 'UPDATE_DROPPABLE_IS_COMBINE_ENABLED',\n payload: args\n };\n};\nvar move = function move(args) {\n return {\n type: 'MOVE',\n payload: args\n };\n};\nvar moveByWindowScroll = function moveByWindowScroll(args) {\n return {\n type: 'MOVE_BY_WINDOW_SCROLL',\n payload: args\n };\n};\nvar updateViewportMaxScroll = function updateViewportMaxScroll(args) {\n return {\n type: 'UPDATE_VIEWPORT_MAX_SCROLL',\n payload: args\n };\n};\nvar moveUp = function moveUp() {\n return {\n type: 'MOVE_UP',\n payload: null\n };\n};\nvar moveDown = function moveDown() {\n return {\n type: 'MOVE_DOWN',\n payload: null\n };\n};\nvar moveRight = function moveRight() {\n return {\n type: 'MOVE_RIGHT',\n payload: null\n };\n};\nvar moveLeft = function moveLeft() {\n return {\n type: 'MOVE_LEFT',\n payload: null\n };\n};\nvar flush = function flush() {\n return {\n type: 'FLUSH',\n payload: null\n };\n};\nvar animateDrop = function animateDrop(args) {\n return {\n type: 'DROP_ANIMATE',\n payload: args\n };\n};\nvar completeDrop = function completeDrop(args) {\n return {\n type: 'DROP_COMPLETE',\n payload: args\n };\n};\nvar drop = function drop(args) {\n return {\n type: 'DROP',\n payload: args\n };\n};\nvar dropPending = function dropPending(args) {\n return {\n type: 'DROP_PENDING',\n payload: args\n };\n};\nvar dropAnimationFinished = function dropAnimationFinished() {\n return {\n type: 'DROP_ANIMATION_FINISHED',\n payload: null\n };\n};\n\nfunction checkIndexes(insideDestination) {\n if (insideDestination.length <= 1) {\n return;\n }\n\n var indexes = insideDestination.map(function (d) {\n return d.descriptor.index;\n });\n var errors = {};\n\n for (var i = 1; i < indexes.length; i++) {\n var current = indexes[i];\n var previous = indexes[i - 1];\n\n if (current !== previous + 1) {\n errors[current] = true;\n }\n }\n\n if (!Object.keys(errors).length) {\n return;\n }\n\n var formatted = indexes.map(function (index) {\n var hasError = Boolean(errors[index]);\n return hasError ? \"[\\uD83D\\uDD25\" + index + \"]\" : \"\" + index;\n }).join(', ');\n process.env.NODE_ENV !== \"production\" ? warning(\"\\n Detected non-consecutive <Draggable /> indexes.\\n\\n (This can cause unexpected bugs)\\n\\n \" + formatted + \"\\n \") : void 0;\n}\n\nfunction validateDimensions(critical, dimensions) {\n if (process.env.NODE_ENV !== 'production') {\n var insideDestination = getDraggablesInsideDroppable(critical.droppable.id, dimensions.draggables);\n checkIndexes(insideDestination);\n }\n}\n\nvar lift$1 = (function (marshal) {\n return function (_ref) {\n var getState = _ref.getState,\n dispatch = _ref.dispatch;\n return function (next) {\n return function (action) {\n if (action.type !== 'LIFT') {\n next(action);\n return;\n }\n\n var _action$payload = action.payload,\n id = _action$payload.id,\n clientSelection = _action$payload.clientSelection,\n movementMode = _action$payload.movementMode;\n var initial = getState();\n\n if (initial.phase === 'DROP_ANIMATING') {\n dispatch(completeDrop({\n completed: initial.completed\n }));\n }\n\n !(getState().phase === 'IDLE') ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Unexpected phase to start a drag') : invariant(false) : void 0;\n dispatch(flush());\n dispatch(beforeInitialCapture({\n draggableId: id,\n movementMode: movementMode\n }));\n var scrollOptions = {\n shouldPublishImmediately: movementMode === 'SNAP'\n };\n var request = {\n draggableId: id,\n scrollOptions: scrollOptions\n };\n\n var _marshal$startPublish = marshal.startPublishing(request),\n critical = _marshal$startPublish.critical,\n dimensions = _marshal$startPublish.dimensions,\n viewport = _marshal$startPublish.viewport;\n\n validateDimensions(critical, dimensions);\n dispatch(initialPublish({\n critical: critical,\n dimensions: dimensions,\n clientSelection: clientSelection,\n movementMode: movementMode,\n viewport: viewport\n }));\n };\n };\n };\n});\n\nvar style = (function (marshal) {\n return function () {\n return function (next) {\n return function (action) {\n if (action.type === 'INITIAL_PUBLISH') {\n marshal.dragging();\n }\n\n if (action.type === 'DROP_ANIMATE') {\n marshal.dropping(action.payload.completed.result.reason);\n }\n\n if (action.type === 'FLUSH' || action.type === 'DROP_COMPLETE') {\n marshal.resting();\n }\n\n next(action);\n };\n };\n };\n});\n\nvar curves = {\n outOfTheWay: 'cubic-bezier(0.2, 0, 0, 1)',\n drop: 'cubic-bezier(.2,1,.1,1)'\n};\nvar combine = {\n opacity: {\n drop: 0,\n combining: 0.7\n },\n scale: {\n drop: 0.75\n }\n};\nvar timings = {\n outOfTheWay: 0.2,\n minDropTime: 0.33,\n maxDropTime: 0.55\n};\nvar outOfTheWayTiming = timings.outOfTheWay + \"s \" + curves.outOfTheWay;\nvar transitions = {\n fluid: \"opacity \" + outOfTheWayTiming,\n snap: \"transform \" + outOfTheWayTiming + \", opacity \" + outOfTheWayTiming,\n drop: function drop(duration) {\n var timing = duration + \"s \" + curves.drop;\n return \"transform \" + timing + \", opacity \" + timing;\n },\n outOfTheWay: \"transform \" + outOfTheWayTiming,\n placeholder: \"height \" + outOfTheWayTiming + \", width \" + outOfTheWayTiming + \", margin \" + outOfTheWayTiming\n};\n\nvar moveTo = function moveTo(offset) {\n return isEqual(offset, origin) ? null : \"translate(\" + offset.x + \"px, \" + offset.y + \"px)\";\n};\n\nvar transforms = {\n moveTo: moveTo,\n drop: function drop(offset, isCombining) {\n var translate = moveTo(offset);\n\n if (!translate) {\n return null;\n }\n\n if (!isCombining) {\n return translate;\n }\n\n return translate + \" scale(\" + combine.scale.drop + \")\";\n }\n};\n\nvar minDropTime = timings.minDropTime,\n maxDropTime = timings.maxDropTime;\nvar dropTimeRange = maxDropTime - minDropTime;\nvar maxDropTimeAtDistance = 1500;\nvar cancelDropModifier = 0.6;\nvar getDropDuration = (function (_ref) {\n var current = _ref.current,\n destination = _ref.destination,\n reason = _ref.reason;\n var distance$1 = distance(current, destination);\n\n if (distance$1 <= 0) {\n return minDropTime;\n }\n\n if (distance$1 >= maxDropTimeAtDistance) {\n return maxDropTime;\n }\n\n var percentage = distance$1 / maxDropTimeAtDistance;\n var duration = minDropTime + dropTimeRange * percentage;\n var withDuration = reason === 'CANCEL' ? duration * cancelDropModifier : duration;\n return Number(withDuration.toFixed(2));\n});\n\nvar getNewHomeClientOffset = (function (_ref) {\n var impact = _ref.impact,\n draggable = _ref.draggable,\n dimensions = _ref.dimensions,\n viewport = _ref.viewport,\n afterCritical = _ref.afterCritical;\n var draggables = dimensions.draggables,\n droppables = dimensions.droppables;\n var droppableId = whatIsDraggedOver(impact);\n var destination = droppableId ? droppables[droppableId] : null;\n var home = droppables[draggable.descriptor.droppableId];\n var newClientCenter = getClientBorderBoxCenter({\n impact: impact,\n draggable: draggable,\n draggables: draggables,\n afterCritical: afterCritical,\n droppable: destination || home,\n viewport: viewport\n });\n var offset = subtract(newClientCenter, draggable.client.borderBox.center);\n return offset;\n});\n\nvar getDropImpact = (function (_ref) {\n var draggables = _ref.draggables,\n reason = _ref.reason,\n lastImpact = _ref.lastImpact,\n home = _ref.home,\n viewport = _ref.viewport,\n onLiftImpact = _ref.onLiftImpact;\n\n if (!lastImpact.at || reason !== 'DROP') {\n var recomputedHomeImpact = recompute({\n draggables: draggables,\n impact: onLiftImpact,\n destination: home,\n viewport: viewport,\n forceShouldAnimate: true\n });\n return {\n impact: recomputedHomeImpact,\n didDropInsideDroppable: false\n };\n }\n\n if (lastImpact.at.type === 'REORDER') {\n return {\n impact: lastImpact,\n didDropInsideDroppable: true\n };\n }\n\n var withoutMovement = _extends({}, lastImpact, {\n displaced: emptyGroups\n });\n\n return {\n impact: withoutMovement,\n didDropInsideDroppable: true\n };\n});\n\nvar drop$1 = (function (_ref) {\n var getState = _ref.getState,\n dispatch = _ref.dispatch;\n return function (next) {\n return function (action) {\n if (action.type !== 'DROP') {\n next(action);\n return;\n }\n\n var state = getState();\n var reason = action.payload.reason;\n\n if (state.phase === 'COLLECTING') {\n dispatch(dropPending({\n reason: reason\n }));\n return;\n }\n\n if (state.phase === 'IDLE') {\n return;\n }\n\n var isWaitingForDrop = state.phase === 'DROP_PENDING' && state.isWaiting;\n !!isWaitingForDrop ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'A DROP action occurred while DROP_PENDING and still waiting') : invariant(false) : void 0;\n !(state.phase === 'DRAGGING' || state.phase === 'DROP_PENDING') ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"Cannot drop in phase: \" + state.phase) : invariant(false) : void 0;\n var critical = state.critical;\n var dimensions = state.dimensions;\n var draggable = dimensions.draggables[state.critical.draggable.id];\n\n var _getDropImpact = getDropImpact({\n reason: reason,\n lastImpact: state.impact,\n afterCritical: state.afterCritical,\n onLiftImpact: state.onLiftImpact,\n home: state.dimensions.droppables[state.critical.droppable.id],\n viewport: state.viewport,\n draggables: state.dimensions.draggables\n }),\n impact = _getDropImpact.impact,\n didDropInsideDroppable = _getDropImpact.didDropInsideDroppable;\n\n var destination = didDropInsideDroppable ? tryGetDestination(impact) : null;\n var combine = didDropInsideDroppable ? tryGetCombine(impact) : null;\n var source = {\n index: critical.draggable.index,\n droppableId: critical.droppable.id\n };\n var result = {\n draggableId: draggable.descriptor.id,\n type: draggable.descriptor.type,\n source: source,\n reason: reason,\n mode: state.movementMode,\n destination: destination,\n combine: combine\n };\n var newHomeClientOffset = getNewHomeClientOffset({\n impact: impact,\n draggable: draggable,\n dimensions: dimensions,\n viewport: state.viewport,\n afterCritical: state.afterCritical\n });\n var completed = {\n critical: state.critical,\n afterCritical: state.afterCritical,\n result: result,\n impact: impact\n };\n var isAnimationRequired = !isEqual(state.current.client.offset, newHomeClientOffset) || Boolean(result.combine);\n\n if (!isAnimationRequired) {\n dispatch(completeDrop({\n completed: completed\n }));\n return;\n }\n\n var dropDuration = getDropDuration({\n current: state.current.client.offset,\n destination: newHomeClientOffset,\n reason: reason\n });\n var args = {\n newHomeClientOffset: newHomeClientOffset,\n dropDuration: dropDuration,\n completed: completed\n };\n dispatch(animateDrop(args));\n };\n };\n});\n\nvar getWindowScroll = (function () {\n return {\n x: window.pageXOffset,\n y: window.pageYOffset\n };\n});\n\nfunction getWindowScrollBinding(update) {\n return {\n eventName: 'scroll',\n options: {\n passive: true,\n capture: false\n },\n fn: function fn(event) {\n if (event.target !== window && event.target !== window.document) {\n return;\n }\n\n update();\n }\n };\n}\n\nfunction getScrollListener(_ref) {\n var onWindowScroll = _ref.onWindowScroll;\n\n function updateScroll() {\n onWindowScroll(getWindowScroll());\n }\n\n var scheduled = rafSchd(updateScroll);\n var binding = getWindowScrollBinding(scheduled);\n var unbind = noop;\n\n function isActive() {\n return unbind !== noop;\n }\n\n function start() {\n !!isActive() ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot start scroll listener when already active') : invariant(false) : void 0;\n unbind = bindEvents(window, [binding]);\n }\n\n function stop() {\n !isActive() ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot stop scroll listener when not active') : invariant(false) : void 0;\n scheduled.cancel();\n unbind();\n unbind = noop;\n }\n\n return {\n start: start,\n stop: stop,\n isActive: isActive\n };\n}\n\nvar shouldEnd = function shouldEnd(action) {\n return action.type === 'DROP_COMPLETE' || action.type === 'DROP_ANIMATE' || action.type === 'FLUSH';\n};\n\nvar scrollListener = (function (store) {\n var listener = getScrollListener({\n onWindowScroll: function onWindowScroll(newScroll) {\n store.dispatch(moveByWindowScroll({\n newScroll: newScroll\n }));\n }\n });\n return function (next) {\n return function (action) {\n if (!listener.isActive() && action.type === 'INITIAL_PUBLISH') {\n listener.start();\n }\n\n if (listener.isActive() && shouldEnd(action)) {\n listener.stop();\n }\n\n next(action);\n };\n };\n});\n\nvar getExpiringAnnounce = (function (announce) {\n var wasCalled = false;\n var isExpired = false;\n var timeoutId = setTimeout(function () {\n isExpired = true;\n });\n\n var result = function result(message) {\n if (wasCalled) {\n process.env.NODE_ENV !== \"production\" ? warning('Announcement already made. Not making a second announcement') : void 0;\n return;\n }\n\n if (isExpired) {\n process.env.NODE_ENV !== \"production\" ? warning(\"\\n Announcements cannot be made asynchronously.\\n Default message has already been announced.\\n \") : void 0;\n return;\n }\n\n wasCalled = true;\n announce(message);\n clearTimeout(timeoutId);\n };\n\n result.wasCalled = function () {\n return wasCalled;\n };\n\n return result;\n});\n\nvar getAsyncMarshal = (function () {\n var entries = [];\n\n var execute = function execute(timerId) {\n var index = findIndex(entries, function (item) {\n return item.timerId === timerId;\n });\n !(index !== -1) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Could not find timer') : invariant(false) : void 0;\n\n var _entries$splice = entries.splice(index, 1),\n entry = _entries$splice[0];\n\n entry.callback();\n };\n\n var add = function add(fn) {\n var timerId = setTimeout(function () {\n return execute(timerId);\n });\n var entry = {\n timerId: timerId,\n callback: fn\n };\n entries.push(entry);\n };\n\n var flush = function flush() {\n if (!entries.length) {\n return;\n }\n\n var shallow = [].concat(entries);\n entries.length = 0;\n shallow.forEach(function (entry) {\n clearTimeout(entry.timerId);\n entry.callback();\n });\n };\n\n return {\n add: add,\n flush: flush\n };\n});\n\nvar areLocationsEqual = function areLocationsEqual(first, second) {\n if (first == null && second == null) {\n return true;\n }\n\n if (first == null || second == null) {\n return false;\n }\n\n return first.droppableId === second.droppableId && first.index === second.index;\n};\nvar isCombineEqual = function isCombineEqual(first, second) {\n if (first == null && second == null) {\n return true;\n }\n\n if (first == null || second == null) {\n return false;\n }\n\n return first.draggableId === second.draggableId && first.droppableId === second.droppableId;\n};\nvar isCriticalEqual = function isCriticalEqual(first, second) {\n if (first === second) {\n return true;\n }\n\n var isDraggableEqual = first.draggable.id === second.draggable.id && first.draggable.droppableId === second.draggable.droppableId && first.draggable.type === second.draggable.type && first.draggable.index === second.draggable.index;\n var isDroppableEqual = first.droppable.id === second.droppable.id && first.droppable.type === second.droppable.type;\n return isDraggableEqual && isDroppableEqual;\n};\n\nvar withTimings = function withTimings(key, fn) {\n start();\n fn();\n finish();\n};\n\nvar getDragStart = function getDragStart(critical, mode) {\n return {\n draggableId: critical.draggable.id,\n type: critical.droppable.type,\n source: {\n droppableId: critical.droppable.id,\n index: critical.draggable.index\n },\n mode: mode\n };\n};\n\nvar execute = function execute(responder, data, announce, getDefaultMessage) {\n if (!responder) {\n announce(getDefaultMessage(data));\n return;\n }\n\n var willExpire = getExpiringAnnounce(announce);\n var provided = {\n announce: willExpire\n };\n responder(data, provided);\n\n if (!willExpire.wasCalled()) {\n announce(getDefaultMessage(data));\n }\n};\n\nvar getPublisher = (function (getResponders, announce) {\n var asyncMarshal = getAsyncMarshal();\n var dragging = null;\n\n var beforeCapture = function beforeCapture(draggableId, mode) {\n !!dragging ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot fire onBeforeCapture as a drag start has already been published') : invariant(false) : void 0;\n withTimings('onBeforeCapture', function () {\n var fn = getResponders().onBeforeCapture;\n\n if (fn) {\n var before = {\n draggableId: draggableId,\n mode: mode\n };\n fn(before);\n }\n });\n };\n\n var beforeStart = function beforeStart(critical, mode) {\n !!dragging ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot fire onBeforeDragStart as a drag start has already been published') : invariant(false) : void 0;\n withTimings('onBeforeDragStart', function () {\n var fn = getResponders().onBeforeDragStart;\n\n if (fn) {\n fn(getDragStart(critical, mode));\n }\n });\n };\n\n var start = function start(critical, mode) {\n !!dragging ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot fire onBeforeDragStart as a drag start has already been published') : invariant(false) : void 0;\n var data = getDragStart(critical, mode);\n dragging = {\n mode: mode,\n lastCritical: critical,\n lastLocation: data.source,\n lastCombine: null\n };\n asyncMarshal.add(function () {\n withTimings('onDragStart', function () {\n return execute(getResponders().onDragStart, data, announce, preset.onDragStart);\n });\n });\n };\n\n var update = function update(critical, impact) {\n var location = tryGetDestination(impact);\n var combine = tryGetCombine(impact);\n !dragging ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot fire onDragMove when onDragStart has not been called') : invariant(false) : void 0;\n var hasCriticalChanged = !isCriticalEqual(critical, dragging.lastCritical);\n\n if (hasCriticalChanged) {\n dragging.lastCritical = critical;\n }\n\n var hasLocationChanged = !areLocationsEqual(dragging.lastLocation, location);\n\n if (hasLocationChanged) {\n dragging.lastLocation = location;\n }\n\n var hasGroupingChanged = !isCombineEqual(dragging.lastCombine, combine);\n\n if (hasGroupingChanged) {\n dragging.lastCombine = combine;\n }\n\n if (!hasCriticalChanged && !hasLocationChanged && !hasGroupingChanged) {\n return;\n }\n\n var data = _extends({}, getDragStart(critical, dragging.mode), {\n combine: combine,\n destination: location\n });\n\n asyncMarshal.add(function () {\n withTimings('onDragUpdate', function () {\n return execute(getResponders().onDragUpdate, data, announce, preset.onDragUpdate);\n });\n });\n };\n\n var flush = function flush() {\n !dragging ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Can only flush responders while dragging') : invariant(false) : void 0;\n asyncMarshal.flush();\n };\n\n var drop = function drop(result) {\n !dragging ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot fire onDragEnd when there is no matching onDragStart') : invariant(false) : void 0;\n dragging = null;\n withTimings('onDragEnd', function () {\n return execute(getResponders().onDragEnd, result, announce, preset.onDragEnd);\n });\n };\n\n var abort = function abort() {\n if (!dragging) {\n return;\n }\n\n var result = _extends({}, getDragStart(dragging.lastCritical, dragging.mode), {\n combine: null,\n destination: null,\n reason: 'CANCEL'\n });\n\n drop(result);\n };\n\n return {\n beforeCapture: beforeCapture,\n beforeStart: beforeStart,\n start: start,\n update: update,\n flush: flush,\n drop: drop,\n abort: abort\n };\n});\n\nvar responders = (function (getResponders, announce) {\n var publisher = getPublisher(getResponders, announce);\n return function (store) {\n return function (next) {\n return function (action) {\n if (action.type === 'BEFORE_INITIAL_CAPTURE') {\n publisher.beforeCapture(action.payload.draggableId, action.payload.movementMode);\n return;\n }\n\n if (action.type === 'INITIAL_PUBLISH') {\n var critical = action.payload.critical;\n publisher.beforeStart(critical, action.payload.movementMode);\n next(action);\n publisher.start(critical, action.payload.movementMode);\n return;\n }\n\n if (action.type === 'DROP_COMPLETE') {\n var result = action.payload.completed.result;\n publisher.flush();\n next(action);\n publisher.drop(result);\n return;\n }\n\n next(action);\n\n if (action.type === 'FLUSH') {\n publisher.abort();\n return;\n }\n\n var state = store.getState();\n\n if (state.phase === 'DRAGGING') {\n publisher.update(state.critical, state.impact);\n }\n };\n };\n };\n});\n\nvar dropAnimationFinish = (function (store) {\n return function (next) {\n return function (action) {\n if (action.type !== 'DROP_ANIMATION_FINISHED') {\n next(action);\n return;\n }\n\n var state = store.getState();\n !(state.phase === 'DROP_ANIMATING') ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot finish a drop animating when no drop is occurring') : invariant(false) : void 0;\n store.dispatch(completeDrop({\n completed: state.completed\n }));\n };\n };\n});\n\nvar dropAnimationFlushOnScroll = (function (store) {\n var unbind = null;\n var frameId = null;\n\n function clear() {\n if (frameId) {\n cancelAnimationFrame(frameId);\n frameId = null;\n }\n\n if (unbind) {\n unbind();\n unbind = null;\n }\n }\n\n return function (next) {\n return function (action) {\n if (action.type === 'FLUSH' || action.type === 'DROP_COMPLETE' || action.type === 'DROP_ANIMATION_FINISHED') {\n clear();\n }\n\n next(action);\n\n if (action.type !== 'DROP_ANIMATE') {\n return;\n }\n\n var binding = {\n eventName: 'scroll',\n options: {\n capture: true,\n passive: false,\n once: true\n },\n fn: function flushDropAnimation() {\n var state = store.getState();\n\n if (state.phase === 'DROP_ANIMATING') {\n store.dispatch(dropAnimationFinished());\n }\n }\n };\n frameId = requestAnimationFrame(function () {\n frameId = null;\n unbind = bindEvents(window, [binding]);\n });\n };\n };\n});\n\nvar dimensionMarshalStopper = (function (marshal) {\n return function () {\n return function (next) {\n return function (action) {\n if (action.type === 'DROP_COMPLETE' || action.type === 'FLUSH' || action.type === 'DROP_ANIMATE') {\n marshal.stopPublishing();\n }\n\n next(action);\n };\n };\n };\n});\n\nvar focus = (function (marshal) {\n var isWatching = false;\n return function () {\n return function (next) {\n return function (action) {\n if (action.type === 'INITIAL_PUBLISH') {\n isWatching = true;\n marshal.tryRecordFocus(action.payload.critical.draggable.id);\n next(action);\n marshal.tryRestoreFocusRecorded();\n return;\n }\n\n next(action);\n\n if (!isWatching) {\n return;\n }\n\n if (action.type === 'FLUSH') {\n isWatching = false;\n marshal.tryRestoreFocusRecorded();\n return;\n }\n\n if (action.type === 'DROP_COMPLETE') {\n isWatching = false;\n var result = action.payload.completed.result;\n\n if (result.combine) {\n marshal.tryShiftRecord(result.draggableId, result.combine.draggableId);\n }\n\n marshal.tryRestoreFocusRecorded();\n }\n };\n };\n };\n});\n\nvar shouldStop = function shouldStop(action) {\n return action.type === 'DROP_COMPLETE' || action.type === 'DROP_ANIMATE' || action.type === 'FLUSH';\n};\n\nvar autoScroll = (function (autoScroller) {\n return function (store) {\n return function (next) {\n return function (action) {\n if (shouldStop(action)) {\n autoScroller.stop();\n next(action);\n return;\n }\n\n if (action.type === 'INITIAL_PUBLISH') {\n next(action);\n var state = store.getState();\n !(state.phase === 'DRAGGING') ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Expected phase to be DRAGGING after INITIAL_PUBLISH') : invariant(false) : void 0;\n autoScroller.start(state);\n return;\n }\n\n next(action);\n autoScroller.scroll(store.getState());\n };\n };\n };\n});\n\nvar pendingDrop = (function (store) {\n return function (next) {\n return function (action) {\n next(action);\n\n if (action.type !== 'PUBLISH_WHILE_DRAGGING') {\n return;\n }\n\n var postActionState = store.getState();\n\n if (postActionState.phase !== 'DROP_PENDING') {\n return;\n }\n\n if (postActionState.isWaiting) {\n return;\n }\n\n store.dispatch(drop({\n reason: postActionState.reason\n }));\n };\n };\n});\n\nvar composeEnhancers = process.env.NODE_ENV !== 'production' && typeof window !== 'undefined' && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({\n name: 'react-beautiful-dnd'\n}) : compose;\nvar createStore = (function (_ref) {\n var dimensionMarshal = _ref.dimensionMarshal,\n focusMarshal = _ref.focusMarshal,\n styleMarshal = _ref.styleMarshal,\n getResponders = _ref.getResponders,\n announce = _ref.announce,\n autoScroller = _ref.autoScroller;\n return createStore$1(reducer, composeEnhancers(applyMiddleware(style(styleMarshal), dimensionMarshalStopper(dimensionMarshal), lift$1(dimensionMarshal), drop$1, dropAnimationFinish, dropAnimationFlushOnScroll, pendingDrop, autoScroll(autoScroller), scrollListener, focus(focusMarshal), responders(getResponders, announce))));\n});\n\nvar clean$1 = function clean() {\n return {\n additions: {},\n removals: {},\n modified: {}\n };\n};\nfunction createPublisher(_ref) {\n var registry = _ref.registry,\n callbacks = _ref.callbacks;\n var staging = clean$1();\n var frameId = null;\n\n var collect = function collect() {\n if (frameId) {\n return;\n }\n\n callbacks.collectionStarting();\n frameId = requestAnimationFrame(function () {\n frameId = null;\n start();\n var _staging = staging,\n additions = _staging.additions,\n removals = _staging.removals,\n modified = _staging.modified;\n var added = Object.keys(additions).map(function (id) {\n return registry.draggable.getById(id).getDimension(origin);\n }).sort(function (a, b) {\n return a.descriptor.index - b.descriptor.index;\n });\n var updated = Object.keys(modified).map(function (id) {\n var entry = registry.droppable.getById(id);\n var scroll = entry.callbacks.getScrollWhileDragging();\n return {\n droppableId: id,\n scroll: scroll\n };\n });\n var result = {\n additions: added,\n removals: Object.keys(removals),\n modified: updated\n };\n staging = clean$1();\n finish();\n callbacks.publish(result);\n });\n };\n\n var add = function add(entry) {\n var id = entry.descriptor.id;\n staging.additions[id] = entry;\n staging.modified[entry.descriptor.droppableId] = true;\n\n if (staging.removals[id]) {\n delete staging.removals[id];\n }\n\n collect();\n };\n\n var remove = function remove(entry) {\n var descriptor = entry.descriptor;\n staging.removals[descriptor.id] = true;\n staging.modified[descriptor.droppableId] = true;\n\n if (staging.additions[descriptor.id]) {\n delete staging.additions[descriptor.id];\n }\n\n collect();\n };\n\n var stop = function stop() {\n if (!frameId) {\n return;\n }\n\n cancelAnimationFrame(frameId);\n frameId = null;\n staging = clean$1();\n };\n\n return {\n add: add,\n remove: remove,\n stop: stop\n };\n}\n\nvar getMaxScroll = (function (_ref) {\n var scrollHeight = _ref.scrollHeight,\n scrollWidth = _ref.scrollWidth,\n height = _ref.height,\n width = _ref.width;\n var maxScroll = subtract({\n x: scrollWidth,\n y: scrollHeight\n }, {\n x: width,\n y: height\n });\n var adjustedMaxScroll = {\n x: Math.max(0, maxScroll.x),\n y: Math.max(0, maxScroll.y)\n };\n return adjustedMaxScroll;\n});\n\nvar getDocumentElement = (function () {\n var doc = document.documentElement;\n !doc ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot find document.documentElement') : invariant(false) : void 0;\n return doc;\n});\n\nvar getMaxWindowScroll = (function () {\n var doc = getDocumentElement();\n var maxScroll = getMaxScroll({\n scrollHeight: doc.scrollHeight,\n scrollWidth: doc.scrollWidth,\n width: doc.clientWidth,\n height: doc.clientHeight\n });\n return maxScroll;\n});\n\nvar getViewport = (function () {\n var scroll = getWindowScroll();\n var maxScroll = getMaxWindowScroll();\n var top = scroll.y;\n var left = scroll.x;\n var doc = getDocumentElement();\n var width = doc.clientWidth;\n var height = doc.clientHeight;\n var right = left + width;\n var bottom = top + height;\n var frame = getRect({\n top: top,\n left: left,\n right: right,\n bottom: bottom\n });\n var viewport = {\n frame: frame,\n scroll: {\n initial: scroll,\n current: scroll,\n max: maxScroll,\n diff: {\n value: origin,\n displacement: origin\n }\n }\n };\n return viewport;\n});\n\nvar getInitialPublish = (function (_ref) {\n var critical = _ref.critical,\n scrollOptions = _ref.scrollOptions,\n registry = _ref.registry;\n start();\n var viewport = getViewport();\n var windowScroll = viewport.scroll.current;\n var home = critical.droppable;\n var droppables = registry.droppable.getAllByType(home.type).map(function (entry) {\n return entry.callbacks.getDimensionAndWatchScroll(windowScroll, scrollOptions);\n });\n var draggables = registry.draggable.getAllByType(critical.draggable.type).map(function (entry) {\n return entry.getDimension(windowScroll);\n });\n var dimensions = {\n draggables: toDraggableMap(draggables),\n droppables: toDroppableMap(droppables)\n };\n finish();\n var result = {\n dimensions: dimensions,\n critical: critical,\n viewport: viewport\n };\n return result;\n});\n\nfunction shouldPublishUpdate(registry, dragging, entry) {\n if (entry.descriptor.id === dragging.id) {\n return false;\n }\n\n if (entry.descriptor.type !== dragging.type) {\n return false;\n }\n\n var home = registry.droppable.getById(entry.descriptor.droppableId);\n\n if (home.descriptor.mode !== 'virtual') {\n process.env.NODE_ENV !== \"production\" ? warning(\"\\n You are attempting to add or remove a Draggable [id: \" + entry.descriptor.id + \"]\\n while a drag is occurring. This is only supported for virtual lists.\\n\\n See https://github.com/atlassian/react-beautiful-dnd/blob/master/docs/patterns/virtual-lists.md\\n \") : void 0;\n return false;\n }\n\n return true;\n}\n\nvar createDimensionMarshal = (function (registry, callbacks) {\n var collection = null;\n var publisher = createPublisher({\n callbacks: {\n publish: callbacks.publishWhileDragging,\n collectionStarting: callbacks.collectionStarting\n },\n registry: registry\n });\n\n var updateDroppableIsEnabled = function updateDroppableIsEnabled(id, isEnabled) {\n !registry.droppable.exists(id) ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"Cannot update is enabled flag of Droppable \" + id + \" as it is not registered\") : invariant(false) : void 0;\n\n if (!collection) {\n return;\n }\n\n callbacks.updateDroppableIsEnabled({\n id: id,\n isEnabled: isEnabled\n });\n };\n\n var updateDroppableIsCombineEnabled = function updateDroppableIsCombineEnabled(id, isCombineEnabled) {\n if (!collection) {\n return;\n }\n\n !registry.droppable.exists(id) ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"Cannot update isCombineEnabled flag of Droppable \" + id + \" as it is not registered\") : invariant(false) : void 0;\n callbacks.updateDroppableIsCombineEnabled({\n id: id,\n isCombineEnabled: isCombineEnabled\n });\n };\n\n var updateDroppableScroll = function updateDroppableScroll(id, newScroll) {\n if (!collection) {\n return;\n }\n\n !registry.droppable.exists(id) ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"Cannot update the scroll on Droppable \" + id + \" as it is not registered\") : invariant(false) : void 0;\n callbacks.updateDroppableScroll({\n id: id,\n newScroll: newScroll\n });\n };\n\n var scrollDroppable = function scrollDroppable(id, change) {\n if (!collection) {\n return;\n }\n\n registry.droppable.getById(id).callbacks.scroll(change);\n };\n\n var stopPublishing = function stopPublishing() {\n if (!collection) {\n return;\n }\n\n publisher.stop();\n var home = collection.critical.droppable;\n registry.droppable.getAllByType(home.type).forEach(function (entry) {\n return entry.callbacks.dragStopped();\n });\n collection.unsubscribe();\n collection = null;\n };\n\n var subscriber = function subscriber(event) {\n !collection ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Should only be subscribed when a collection is occurring') : invariant(false) : void 0;\n var dragging = collection.critical.draggable;\n\n if (event.type === 'ADDITION') {\n if (shouldPublishUpdate(registry, dragging, event.value)) {\n publisher.add(event.value);\n }\n }\n\n if (event.type === 'REMOVAL') {\n if (shouldPublishUpdate(registry, dragging, event.value)) {\n publisher.remove(event.value);\n }\n }\n };\n\n var startPublishing = function startPublishing(request) {\n !!collection ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot start capturing critical dimensions as there is already a collection') : invariant(false) : void 0;\n var entry = registry.draggable.getById(request.draggableId);\n var home = registry.droppable.getById(entry.descriptor.droppableId);\n var critical = {\n draggable: entry.descriptor,\n droppable: home.descriptor\n };\n var unsubscribe = registry.subscribe(subscriber);\n collection = {\n critical: critical,\n unsubscribe: unsubscribe\n };\n return getInitialPublish({\n critical: critical,\n registry: registry,\n scrollOptions: request.scrollOptions\n });\n };\n\n var marshal = {\n updateDroppableIsEnabled: updateDroppableIsEnabled,\n updateDroppableIsCombineEnabled: updateDroppableIsCombineEnabled,\n scrollDroppable: scrollDroppable,\n updateDroppableScroll: updateDroppableScroll,\n startPublishing: startPublishing,\n stopPublishing: stopPublishing\n };\n return marshal;\n});\n\nvar canStartDrag = (function (state, id) {\n if (state.phase === 'IDLE') {\n return true;\n }\n\n if (state.phase !== 'DROP_ANIMATING') {\n return false;\n }\n\n if (state.completed.result.draggableId === id) {\n return false;\n }\n\n return state.completed.result.reason === 'DROP';\n});\n\nvar scrollWindow = (function (change) {\n window.scrollBy(change.x, change.y);\n});\n\nvar getScrollableDroppables = memoizeOne(function (droppables) {\n return toDroppableList(droppables).filter(function (droppable) {\n if (!droppable.isEnabled) {\n return false;\n }\n\n if (!droppable.frame) {\n return false;\n }\n\n return true;\n });\n});\n\nvar getScrollableDroppableOver = function getScrollableDroppableOver(target, droppables) {\n var maybe = find(getScrollableDroppables(droppables), function (droppable) {\n !droppable.frame ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Invalid result') : invariant(false) : void 0;\n return isPositionInFrame(droppable.frame.pageMarginBox)(target);\n });\n return maybe;\n};\n\nvar getBestScrollableDroppable = (function (_ref) {\n var center = _ref.center,\n destination = _ref.destination,\n droppables = _ref.droppables;\n\n if (destination) {\n var _dimension = droppables[destination];\n\n if (!_dimension.frame) {\n return null;\n }\n\n return _dimension;\n }\n\n var dimension = getScrollableDroppableOver(center, droppables);\n return dimension;\n});\n\nvar config = {\n startFromPercentage: 0.25,\n maxScrollAtPercentage: 0.05,\n maxPixelScroll: 28,\n ease: function ease(percentage) {\n return Math.pow(percentage, 2);\n },\n durationDampening: {\n stopDampeningAt: 1200,\n accelerateAt: 360\n }\n};\n\nvar getDistanceThresholds = (function (container, axis) {\n var startScrollingFrom = container[axis.size] * config.startFromPercentage;\n var maxScrollValueAt = container[axis.size] * config.maxScrollAtPercentage;\n var thresholds = {\n startScrollingFrom: startScrollingFrom,\n maxScrollValueAt: maxScrollValueAt\n };\n return thresholds;\n});\n\nvar getPercentage = (function (_ref) {\n var startOfRange = _ref.startOfRange,\n endOfRange = _ref.endOfRange,\n current = _ref.current;\n var range = endOfRange - startOfRange;\n\n if (range === 0) {\n process.env.NODE_ENV !== \"production\" ? warning(\"\\n Detected distance range of 0 in the fluid auto scroller\\n This is unexpected and would cause a divide by 0 issue.\\n Not allowing an auto scroll\\n \") : void 0;\n return 0;\n }\n\n var currentInRange = current - startOfRange;\n var percentage = currentInRange / range;\n return percentage;\n});\n\nvar minScroll = 1;\n\nvar getValueFromDistance = (function (distanceToEdge, thresholds) {\n if (distanceToEdge > thresholds.startScrollingFrom) {\n return 0;\n }\n\n if (distanceToEdge <= thresholds.maxScrollValueAt) {\n return config.maxPixelScroll;\n }\n\n if (distanceToEdge === thresholds.startScrollingFrom) {\n return minScroll;\n }\n\n var percentageFromMaxScrollValueAt = getPercentage({\n startOfRange: thresholds.maxScrollValueAt,\n endOfRange: thresholds.startScrollingFrom,\n current: distanceToEdge\n });\n var percentageFromStartScrollingFrom = 1 - percentageFromMaxScrollValueAt;\n var scroll = config.maxPixelScroll * config.ease(percentageFromStartScrollingFrom);\n return Math.ceil(scroll);\n});\n\nvar accelerateAt = config.durationDampening.accelerateAt;\nvar stopAt = config.durationDampening.stopDampeningAt;\nvar dampenValueByTime = (function (proposedScroll, dragStartTime) {\n var startOfRange = dragStartTime;\n var endOfRange = stopAt;\n var now = Date.now();\n var runTime = now - startOfRange;\n\n if (runTime >= stopAt) {\n return proposedScroll;\n }\n\n if (runTime < accelerateAt) {\n return minScroll;\n }\n\n var betweenAccelerateAtAndStopAtPercentage = getPercentage({\n startOfRange: accelerateAt,\n endOfRange: endOfRange,\n current: runTime\n });\n var scroll = proposedScroll * config.ease(betweenAccelerateAtAndStopAtPercentage);\n return Math.ceil(scroll);\n});\n\nvar getValue = (function (_ref) {\n var distanceToEdge = _ref.distanceToEdge,\n thresholds = _ref.thresholds,\n dragStartTime = _ref.dragStartTime,\n shouldUseTimeDampening = _ref.shouldUseTimeDampening;\n var scroll = getValueFromDistance(distanceToEdge, thresholds);\n\n if (scroll === 0) {\n return 0;\n }\n\n if (!shouldUseTimeDampening) {\n return scroll;\n }\n\n return Math.max(dampenValueByTime(scroll, dragStartTime), minScroll);\n});\n\nvar getScrollOnAxis = (function (_ref) {\n var container = _ref.container,\n distanceToEdges = _ref.distanceToEdges,\n dragStartTime = _ref.dragStartTime,\n axis = _ref.axis,\n shouldUseTimeDampening = _ref.shouldUseTimeDampening;\n var thresholds = getDistanceThresholds(container, axis);\n var isCloserToEnd = distanceToEdges[axis.end] < distanceToEdges[axis.start];\n\n if (isCloserToEnd) {\n return getValue({\n distanceToEdge: distanceToEdges[axis.end],\n thresholds: thresholds,\n dragStartTime: dragStartTime,\n shouldUseTimeDampening: shouldUseTimeDampening\n });\n }\n\n return -1 * getValue({\n distanceToEdge: distanceToEdges[axis.start],\n thresholds: thresholds,\n dragStartTime: dragStartTime,\n shouldUseTimeDampening: shouldUseTimeDampening\n });\n});\n\nvar adjustForSizeLimits = (function (_ref) {\n var container = _ref.container,\n subject = _ref.subject,\n proposedScroll = _ref.proposedScroll;\n var isTooBigVertically = subject.height > container.height;\n var isTooBigHorizontally = subject.width > container.width;\n\n if (!isTooBigHorizontally && !isTooBigVertically) {\n return proposedScroll;\n }\n\n if (isTooBigHorizontally && isTooBigVertically) {\n return null;\n }\n\n return {\n x: isTooBigHorizontally ? 0 : proposedScroll.x,\n y: isTooBigVertically ? 0 : proposedScroll.y\n };\n});\n\nvar clean$2 = apply(function (value) {\n return value === 0 ? 0 : value;\n});\nvar getScroll = (function (_ref) {\n var dragStartTime = _ref.dragStartTime,\n container = _ref.container,\n subject = _ref.subject,\n center = _ref.center,\n shouldUseTimeDampening = _ref.shouldUseTimeDampening;\n var distanceToEdges = {\n top: center.y - container.top,\n right: container.right - center.x,\n bottom: container.bottom - center.y,\n left: center.x - container.left\n };\n var y = getScrollOnAxis({\n container: container,\n distanceToEdges: distanceToEdges,\n dragStartTime: dragStartTime,\n axis: vertical,\n shouldUseTimeDampening: shouldUseTimeDampening\n });\n var x = getScrollOnAxis({\n container: container,\n distanceToEdges: distanceToEdges,\n dragStartTime: dragStartTime,\n axis: horizontal,\n shouldUseTimeDampening: shouldUseTimeDampening\n });\n var required = clean$2({\n x: x,\n y: y\n });\n\n if (isEqual(required, origin)) {\n return null;\n }\n\n var limited = adjustForSizeLimits({\n container: container,\n subject: subject,\n proposedScroll: required\n });\n\n if (!limited) {\n return null;\n }\n\n return isEqual(limited, origin) ? null : limited;\n});\n\nvar smallestSigned = apply(function (value) {\n if (value === 0) {\n return 0;\n }\n\n return value > 0 ? 1 : -1;\n});\nvar getOverlap = function () {\n var getRemainder = function getRemainder(target, max) {\n if (target < 0) {\n return target;\n }\n\n if (target > max) {\n return target - max;\n }\n\n return 0;\n };\n\n return function (_ref) {\n var current = _ref.current,\n max = _ref.max,\n change = _ref.change;\n var targetScroll = add(current, change);\n var overlap = {\n x: getRemainder(targetScroll.x, max.x),\n y: getRemainder(targetScroll.y, max.y)\n };\n\n if (isEqual(overlap, origin)) {\n return null;\n }\n\n return overlap;\n };\n}();\nvar canPartiallyScroll = function canPartiallyScroll(_ref2) {\n var rawMax = _ref2.max,\n current = _ref2.current,\n change = _ref2.change;\n var max = {\n x: Math.max(current.x, rawMax.x),\n y: Math.max(current.y, rawMax.y)\n };\n var smallestChange = smallestSigned(change);\n var overlap = getOverlap({\n max: max,\n current: current,\n change: smallestChange\n });\n\n if (!overlap) {\n return true;\n }\n\n if (smallestChange.x !== 0 && overlap.x === 0) {\n return true;\n }\n\n if (smallestChange.y !== 0 && overlap.y === 0) {\n return true;\n }\n\n return false;\n};\nvar canScrollWindow = function canScrollWindow(viewport, change) {\n return canPartiallyScroll({\n current: viewport.scroll.current,\n max: viewport.scroll.max,\n change: change\n });\n};\nvar getWindowOverlap = function getWindowOverlap(viewport, change) {\n if (!canScrollWindow(viewport, change)) {\n return null;\n }\n\n var max = viewport.scroll.max;\n var current = viewport.scroll.current;\n return getOverlap({\n current: current,\n max: max,\n change: change\n });\n};\nvar canScrollDroppable = function canScrollDroppable(droppable, change) {\n var frame = droppable.frame;\n\n if (!frame) {\n return false;\n }\n\n return canPartiallyScroll({\n current: frame.scroll.current,\n max: frame.scroll.max,\n change: change\n });\n};\nvar getDroppableOverlap = function getDroppableOverlap(droppable, change) {\n var frame = droppable.frame;\n\n if (!frame) {\n return null;\n }\n\n if (!canScrollDroppable(droppable, change)) {\n return null;\n }\n\n return getOverlap({\n current: frame.scroll.current,\n max: frame.scroll.max,\n change: change\n });\n};\n\nvar getWindowScrollChange = (function (_ref) {\n var viewport = _ref.viewport,\n subject = _ref.subject,\n center = _ref.center,\n dragStartTime = _ref.dragStartTime,\n shouldUseTimeDampening = _ref.shouldUseTimeDampening;\n var scroll = getScroll({\n dragStartTime: dragStartTime,\n container: viewport.frame,\n subject: subject,\n center: center,\n shouldUseTimeDampening: shouldUseTimeDampening\n });\n return scroll && canScrollWindow(viewport, scroll) ? scroll : null;\n});\n\nvar getDroppableScrollChange = (function (_ref) {\n var droppable = _ref.droppable,\n subject = _ref.subject,\n center = _ref.center,\n dragStartTime = _ref.dragStartTime,\n shouldUseTimeDampening = _ref.shouldUseTimeDampening;\n var frame = droppable.frame;\n\n if (!frame) {\n return null;\n }\n\n var scroll = getScroll({\n dragStartTime: dragStartTime,\n container: frame.pageMarginBox,\n subject: subject,\n center: center,\n shouldUseTimeDampening: shouldUseTimeDampening\n });\n return scroll && canScrollDroppable(droppable, scroll) ? scroll : null;\n});\n\nvar scroll$1 = (function (_ref) {\n var state = _ref.state,\n dragStartTime = _ref.dragStartTime,\n shouldUseTimeDampening = _ref.shouldUseTimeDampening,\n scrollWindow = _ref.scrollWindow,\n scrollDroppable = _ref.scrollDroppable;\n var center = state.current.page.borderBoxCenter;\n var draggable = state.dimensions.draggables[state.critical.draggable.id];\n var subject = draggable.page.marginBox;\n\n if (state.isWindowScrollAllowed) {\n var viewport = state.viewport;\n\n var _change = getWindowScrollChange({\n dragStartTime: dragStartTime,\n viewport: viewport,\n subject: subject,\n center: center,\n shouldUseTimeDampening: shouldUseTimeDampening\n });\n\n if (_change) {\n scrollWindow(_change);\n return;\n }\n }\n\n var droppable = getBestScrollableDroppable({\n center: center,\n destination: whatIsDraggedOver(state.impact),\n droppables: state.dimensions.droppables\n });\n\n if (!droppable) {\n return;\n }\n\n var change = getDroppableScrollChange({\n dragStartTime: dragStartTime,\n droppable: droppable,\n subject: subject,\n center: center,\n shouldUseTimeDampening: shouldUseTimeDampening\n });\n\n if (change) {\n scrollDroppable(droppable.descriptor.id, change);\n }\n});\n\nvar createFluidScroller = (function (_ref) {\n var scrollWindow = _ref.scrollWindow,\n scrollDroppable = _ref.scrollDroppable;\n var scheduleWindowScroll = rafSchd(scrollWindow);\n var scheduleDroppableScroll = rafSchd(scrollDroppable);\n var dragging = null;\n\n var tryScroll = function tryScroll(state) {\n !dragging ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot fluid scroll if not dragging') : invariant(false) : void 0;\n var _dragging = dragging,\n shouldUseTimeDampening = _dragging.shouldUseTimeDampening,\n dragStartTime = _dragging.dragStartTime;\n scroll$1({\n state: state,\n scrollWindow: scheduleWindowScroll,\n scrollDroppable: scheduleDroppableScroll,\n dragStartTime: dragStartTime,\n shouldUseTimeDampening: shouldUseTimeDampening\n });\n };\n\n var start$1 = function start$1(state) {\n start();\n !!dragging ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot start auto scrolling when already started') : invariant(false) : void 0;\n var dragStartTime = Date.now();\n var wasScrollNeeded = false;\n\n var fakeScrollCallback = function fakeScrollCallback() {\n wasScrollNeeded = true;\n };\n\n scroll$1({\n state: state,\n dragStartTime: 0,\n shouldUseTimeDampening: false,\n scrollWindow: fakeScrollCallback,\n scrollDroppable: fakeScrollCallback\n });\n dragging = {\n dragStartTime: dragStartTime,\n shouldUseTimeDampening: wasScrollNeeded\n };\n finish();\n\n if (wasScrollNeeded) {\n tryScroll(state);\n }\n };\n\n var stop = function stop() {\n if (!dragging) {\n return;\n }\n\n scheduleWindowScroll.cancel();\n scheduleDroppableScroll.cancel();\n dragging = null;\n };\n\n return {\n start: start$1,\n stop: stop,\n scroll: tryScroll\n };\n});\n\nvar createJumpScroller = (function (_ref) {\n var move = _ref.move,\n scrollDroppable = _ref.scrollDroppable,\n scrollWindow = _ref.scrollWindow;\n\n var moveByOffset = function moveByOffset(state, offset) {\n var client = add(state.current.client.selection, offset);\n move({\n client: client\n });\n };\n\n var scrollDroppableAsMuchAsItCan = function scrollDroppableAsMuchAsItCan(droppable, change) {\n if (!canScrollDroppable(droppable, change)) {\n return change;\n }\n\n var overlap = getDroppableOverlap(droppable, change);\n\n if (!overlap) {\n scrollDroppable(droppable.descriptor.id, change);\n return null;\n }\n\n var whatTheDroppableCanScroll = subtract(change, overlap);\n scrollDroppable(droppable.descriptor.id, whatTheDroppableCanScroll);\n var remainder = subtract(change, whatTheDroppableCanScroll);\n return remainder;\n };\n\n var scrollWindowAsMuchAsItCan = function scrollWindowAsMuchAsItCan(isWindowScrollAllowed, viewport, change) {\n if (!isWindowScrollAllowed) {\n return change;\n }\n\n if (!canScrollWindow(viewport, change)) {\n return change;\n }\n\n var overlap = getWindowOverlap(viewport, change);\n\n if (!overlap) {\n scrollWindow(change);\n return null;\n }\n\n var whatTheWindowCanScroll = subtract(change, overlap);\n scrollWindow(whatTheWindowCanScroll);\n var remainder = subtract(change, whatTheWindowCanScroll);\n return remainder;\n };\n\n var jumpScroller = function jumpScroller(state) {\n var request = state.scrollJumpRequest;\n\n if (!request) {\n return;\n }\n\n var destination = whatIsDraggedOver(state.impact);\n !destination ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot perform a jump scroll when there is no destination') : invariant(false) : void 0;\n var droppableRemainder = scrollDroppableAsMuchAsItCan(state.dimensions.droppables[destination], request);\n\n if (!droppableRemainder) {\n return;\n }\n\n var viewport = state.viewport;\n var windowRemainder = scrollWindowAsMuchAsItCan(state.isWindowScrollAllowed, viewport, droppableRemainder);\n\n if (!windowRemainder) {\n return;\n }\n\n moveByOffset(state, windowRemainder);\n };\n\n return jumpScroller;\n});\n\nvar createAutoScroller = (function (_ref) {\n var scrollDroppable = _ref.scrollDroppable,\n scrollWindow = _ref.scrollWindow,\n move = _ref.move;\n var fluidScroller = createFluidScroller({\n scrollWindow: scrollWindow,\n scrollDroppable: scrollDroppable\n });\n var jumpScroll = createJumpScroller({\n move: move,\n scrollWindow: scrollWindow,\n scrollDroppable: scrollDroppable\n });\n\n var scroll = function scroll(state) {\n if (state.phase !== 'DRAGGING') {\n return;\n }\n\n if (state.movementMode === 'FLUID') {\n fluidScroller.scroll(state);\n return;\n }\n\n if (!state.scrollJumpRequest) {\n return;\n }\n\n jumpScroll(state);\n };\n\n var scroller = {\n scroll: scroll,\n start: fluidScroller.start,\n stop: fluidScroller.stop\n };\n return scroller;\n});\n\nvar prefix$1 = 'data-rbd';\nvar dragHandle = function () {\n var base = prefix$1 + \"-drag-handle\";\n return {\n base: base,\n draggableId: base + \"-draggable-id\",\n contextId: base + \"-context-id\"\n };\n}();\nvar draggable = function () {\n var base = prefix$1 + \"-draggable\";\n return {\n base: base,\n contextId: base + \"-context-id\",\n id: base + \"-id\"\n };\n}();\nvar droppable = function () {\n var base = prefix$1 + \"-droppable\";\n return {\n base: base,\n contextId: base + \"-context-id\",\n id: base + \"-id\"\n };\n}();\nvar scrollContainer = {\n contextId: prefix$1 + \"-scroll-container-context-id\"\n};\n\nvar makeGetSelector = function makeGetSelector(context) {\n return function (attribute) {\n return \"[\" + attribute + \"=\\\"\" + context + \"\\\"]\";\n };\n};\n\nvar getStyles = function getStyles(rules, property) {\n return rules.map(function (rule) {\n var value = rule.styles[property];\n\n if (!value) {\n return '';\n }\n\n return rule.selector + \" { \" + value + \" }\";\n }).join(' ');\n};\n\nvar noPointerEvents = 'pointer-events: none;';\nvar getStyles$1 = (function (contextId) {\n var getSelector = makeGetSelector(contextId);\n\n var dragHandle$1 = function () {\n var grabCursor = \"\\n cursor: -webkit-grab;\\n cursor: grab;\\n \";\n return {\n selector: getSelector(dragHandle.contextId),\n styles: {\n always: \"\\n -webkit-touch-callout: none;\\n -webkit-tap-highlight-color: rgba(0,0,0,0);\\n touch-action: manipulation;\\n \",\n resting: grabCursor,\n dragging: noPointerEvents,\n dropAnimating: grabCursor\n }\n };\n }();\n\n var draggable$1 = function () {\n var transition = \"\\n transition: \" + transitions.outOfTheWay + \";\\n \";\n return {\n selector: getSelector(draggable.contextId),\n styles: {\n dragging: transition,\n dropAnimating: transition,\n userCancel: transition\n }\n };\n }();\n\n var droppable$1 = {\n selector: getSelector(droppable.contextId),\n styles: {\n always: \"overflow-anchor: none;\"\n }\n };\n var body = {\n selector: 'body',\n styles: {\n dragging: \"\\n cursor: grabbing;\\n cursor: -webkit-grabbing;\\n user-select: none;\\n -webkit-user-select: none;\\n -moz-user-select: none;\\n -ms-user-select: none;\\n overflow-anchor: none;\\n \"\n }\n };\n var rules = [draggable$1, dragHandle$1, droppable$1, body];\n return {\n always: getStyles(rules, 'always'),\n resting: getStyles(rules, 'resting'),\n dragging: getStyles(rules, 'dragging'),\n dropAnimating: getStyles(rules, 'dropAnimating'),\n userCancel: getStyles(rules, 'userCancel')\n };\n});\n\nvar useIsomorphicLayoutEffect = typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined' ? useLayoutEffect : useEffect;\n\nvar getHead = function getHead() {\n var head = document.querySelector('head');\n !head ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot find the head to append a style to') : invariant(false) : void 0;\n return head;\n};\n\nvar createStyleEl = function createStyleEl(nonce) {\n var el = document.createElement('style');\n\n if (nonce) {\n el.setAttribute('nonce', nonce);\n }\n\n el.type = 'text/css';\n return el;\n};\n\nfunction useStyleMarshal(contextId, nonce) {\n var styles = useMemo(function () {\n return getStyles$1(contextId);\n }, [contextId]);\n var alwaysRef = useRef(null);\n var dynamicRef = useRef(null);\n var setDynamicStyle = useCallback(memoizeOne(function (proposed) {\n var el = dynamicRef.current;\n !el ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot set dynamic style element if it is not set') : invariant(false) : void 0;\n el.textContent = proposed;\n }), []);\n var setAlwaysStyle = useCallback(function (proposed) {\n var el = alwaysRef.current;\n !el ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot set dynamic style element if it is not set') : invariant(false) : void 0;\n el.textContent = proposed;\n }, []);\n useIsomorphicLayoutEffect(function () {\n !(!alwaysRef.current && !dynamicRef.current) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'style elements already mounted') : invariant(false) : void 0;\n var always = createStyleEl(nonce);\n var dynamic = createStyleEl(nonce);\n alwaysRef.current = always;\n dynamicRef.current = dynamic;\n always.setAttribute(prefix$1 + \"-always\", contextId);\n dynamic.setAttribute(prefix$1 + \"-dynamic\", contextId);\n getHead().appendChild(always);\n getHead().appendChild(dynamic);\n setAlwaysStyle(styles.always);\n setDynamicStyle(styles.resting);\n return function () {\n var remove = function remove(ref) {\n var current = ref.current;\n !current ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot unmount ref as it is not set') : invariant(false) : void 0;\n getHead().removeChild(current);\n ref.current = null;\n };\n\n remove(alwaysRef);\n remove(dynamicRef);\n };\n }, [nonce, setAlwaysStyle, setDynamicStyle, styles.always, styles.resting, contextId]);\n var dragging = useCallback(function () {\n return setDynamicStyle(styles.dragging);\n }, [setDynamicStyle, styles.dragging]);\n var dropping = useCallback(function (reason) {\n if (reason === 'DROP') {\n setDynamicStyle(styles.dropAnimating);\n return;\n }\n\n setDynamicStyle(styles.userCancel);\n }, [setDynamicStyle, styles.dropAnimating, styles.userCancel]);\n var resting = useCallback(function () {\n if (!dynamicRef.current) {\n return;\n }\n\n setDynamicStyle(styles.resting);\n }, [setDynamicStyle, styles.resting]);\n var marshal = useMemo(function () {\n return {\n dragging: dragging,\n dropping: dropping,\n resting: resting\n };\n }, [dragging, dropping, resting]);\n return marshal;\n}\n\nvar getWindowFromEl = (function (el) {\n return el && el.ownerDocument ? el.ownerDocument.defaultView : window;\n});\n\nfunction isHtmlElement(el) {\n return el instanceof getWindowFromEl(el).HTMLElement;\n}\n\nfunction findDragHandle(contextId, draggableId) {\n var selector = \"[\" + dragHandle.contextId + \"=\\\"\" + contextId + \"\\\"]\";\n var possible = toArray(document.querySelectorAll(selector));\n\n if (!possible.length) {\n process.env.NODE_ENV !== \"production\" ? warning(\"Unable to find any drag handles in the context \\\"\" + contextId + \"\\\"\") : void 0;\n return null;\n }\n\n var handle = find(possible, function (el) {\n return el.getAttribute(dragHandle.draggableId) === draggableId;\n });\n\n if (!handle) {\n process.env.NODE_ENV !== \"production\" ? warning(\"Unable to find drag handle with id \\\"\" + draggableId + \"\\\" as no handle with a matching id was found\") : void 0;\n return null;\n }\n\n if (!isHtmlElement(handle)) {\n process.env.NODE_ENV !== \"production\" ? warning('drag handle needs to be a HTMLElement') : void 0;\n return null;\n }\n\n return handle;\n}\n\nfunction useFocusMarshal(contextId) {\n var entriesRef = useRef({});\n var recordRef = useRef(null);\n var restoreFocusFrameRef = useRef(null);\n var isMountedRef = useRef(false);\n var register = useCallback(function register(id, focus) {\n var entry = {\n id: id,\n focus: focus\n };\n entriesRef.current[id] = entry;\n return function unregister() {\n var entries = entriesRef.current;\n var current = entries[id];\n\n if (current !== entry) {\n delete entries[id];\n }\n };\n }, []);\n var tryGiveFocus = useCallback(function tryGiveFocus(tryGiveFocusTo) {\n var handle = findDragHandle(contextId, tryGiveFocusTo);\n\n if (handle && handle !== document.activeElement) {\n handle.focus();\n }\n }, [contextId]);\n var tryShiftRecord = useCallback(function tryShiftRecord(previous, redirectTo) {\n if (recordRef.current === previous) {\n recordRef.current = redirectTo;\n }\n }, []);\n var tryRestoreFocusRecorded = useCallback(function tryRestoreFocusRecorded() {\n if (restoreFocusFrameRef.current) {\n return;\n }\n\n if (!isMountedRef.current) {\n return;\n }\n\n restoreFocusFrameRef.current = requestAnimationFrame(function () {\n restoreFocusFrameRef.current = null;\n var record = recordRef.current;\n\n if (record) {\n tryGiveFocus(record);\n }\n });\n }, [tryGiveFocus]);\n var tryRecordFocus = useCallback(function tryRecordFocus(id) {\n recordRef.current = null;\n var focused = document.activeElement;\n\n if (!focused) {\n return;\n }\n\n if (focused.getAttribute(dragHandle.draggableId) !== id) {\n return;\n }\n\n recordRef.current = id;\n }, []);\n useIsomorphicLayoutEffect(function () {\n isMountedRef.current = true;\n return function clearFrameOnUnmount() {\n isMountedRef.current = false;\n var frameId = restoreFocusFrameRef.current;\n\n if (frameId) {\n cancelAnimationFrame(frameId);\n }\n };\n }, []);\n var marshal = useMemo(function () {\n return {\n register: register,\n tryRecordFocus: tryRecordFocus,\n tryRestoreFocusRecorded: tryRestoreFocusRecorded,\n tryShiftRecord: tryShiftRecord\n };\n }, [register, tryRecordFocus, tryRestoreFocusRecorded, tryShiftRecord]);\n return marshal;\n}\n\nfunction createRegistry() {\n var entries = {\n draggables: {},\n droppables: {}\n };\n var subscribers = [];\n\n function subscribe(cb) {\n subscribers.push(cb);\n return function unsubscribe() {\n var index = subscribers.indexOf(cb);\n\n if (index === -1) {\n return;\n }\n\n subscribers.splice(index, 1);\n };\n }\n\n function notify(event) {\n if (subscribers.length) {\n subscribers.forEach(function (cb) {\n return cb(event);\n });\n }\n }\n\n function findDraggableById(id) {\n return entries.draggables[id] || null;\n }\n\n function getDraggableById(id) {\n var entry = findDraggableById(id);\n !entry ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"Cannot find draggable entry with id [\" + id + \"]\") : invariant(false) : void 0;\n return entry;\n }\n\n var draggableAPI = {\n register: function register(entry) {\n entries.draggables[entry.descriptor.id] = entry;\n notify({\n type: 'ADDITION',\n value: entry\n });\n },\n update: function update(entry, last) {\n var current = entries.draggables[last.descriptor.id];\n\n if (!current) {\n return;\n }\n\n if (current.uniqueId !== entry.uniqueId) {\n return;\n }\n\n delete entries.draggables[last.descriptor.id];\n entries.draggables[entry.descriptor.id] = entry;\n },\n unregister: function unregister(entry) {\n var draggableId = entry.descriptor.id;\n var current = findDraggableById(draggableId);\n\n if (!current) {\n return;\n }\n\n if (entry.uniqueId !== current.uniqueId) {\n return;\n }\n\n delete entries.draggables[draggableId];\n notify({\n type: 'REMOVAL',\n value: entry\n });\n },\n getById: getDraggableById,\n findById: findDraggableById,\n exists: function exists(id) {\n return Boolean(findDraggableById(id));\n },\n getAllByType: function getAllByType(type) {\n return values(entries.draggables).filter(function (entry) {\n return entry.descriptor.type === type;\n });\n }\n };\n\n function findDroppableById(id) {\n return entries.droppables[id] || null;\n }\n\n function getDroppableById(id) {\n var entry = findDroppableById(id);\n !entry ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"Cannot find droppable entry with id [\" + id + \"]\") : invariant(false) : void 0;\n return entry;\n }\n\n var droppableAPI = {\n register: function register(entry) {\n entries.droppables[entry.descriptor.id] = entry;\n },\n unregister: function unregister(entry) {\n var current = findDroppableById(entry.descriptor.id);\n\n if (!current) {\n return;\n }\n\n if (entry.uniqueId !== current.uniqueId) {\n return;\n }\n\n delete entries.droppables[entry.descriptor.id];\n },\n getById: getDroppableById,\n findById: findDroppableById,\n exists: function exists(id) {\n return Boolean(findDroppableById(id));\n },\n getAllByType: function getAllByType(type) {\n return values(entries.droppables).filter(function (entry) {\n return entry.descriptor.type === type;\n });\n }\n };\n\n function clean() {\n entries.draggables = {};\n entries.droppables = {};\n subscribers.length = 0;\n }\n\n return {\n draggable: draggableAPI,\n droppable: droppableAPI,\n subscribe: subscribe,\n clean: clean\n };\n}\n\nfunction useRegistry() {\n var registry = useMemo(createRegistry, []);\n useEffect(function () {\n return function unmount() {\n requestAnimationFrame(registry.clean);\n };\n }, [registry]);\n return registry;\n}\n\nvar StoreContext = React.createContext(null);\n\nvar getBodyElement = (function () {\n var body = document.body;\n !body ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot find document.body') : invariant(false) : void 0;\n return body;\n});\n\nvar visuallyHidden = {\n position: 'absolute',\n width: '1px',\n height: '1px',\n margin: '-1px',\n border: '0',\n padding: '0',\n overflow: 'hidden',\n clip: 'rect(0 0 0 0)',\n 'clip-path': 'inset(100%)'\n};\n\nvar getId = function getId(contextId) {\n return \"rbd-announcement-\" + contextId;\n};\nfunction useAnnouncer(contextId) {\n var id = useMemo(function () {\n return getId(contextId);\n }, [contextId]);\n var ref = useRef(null);\n useEffect(function setup() {\n var el = document.createElement('div');\n ref.current = el;\n el.id = id;\n el.setAttribute('aria-live', 'assertive');\n el.setAttribute('aria-atomic', 'true');\n\n _extends(el.style, visuallyHidden);\n\n getBodyElement().appendChild(el);\n return function cleanup() {\n setTimeout(function remove() {\n var body = getBodyElement();\n\n if (body.contains(el)) {\n body.removeChild(el);\n }\n\n if (el === ref.current) {\n ref.current = null;\n }\n });\n };\n }, [id]);\n var announce = useCallback(function (message) {\n var el = ref.current;\n\n if (el) {\n el.textContent = message;\n return;\n }\n\n process.env.NODE_ENV !== \"production\" ? warning(\"\\n A screen reader message was trying to be announced but it was unable to do so.\\n This can occur if you unmount your <DragDropContext /> in your onDragEnd.\\n Consider calling provided.announce() before the unmount so that the instruction will\\n not be lost for users relying on a screen reader.\\n\\n Message not passed to screen reader:\\n\\n \\\"\" + message + \"\\\"\\n \") : void 0;\n }, []);\n return announce;\n}\n\nvar count = 0;\nvar defaults = {\n separator: '::'\n};\nfunction reset() {\n count = 0;\n}\nfunction useUniqueId(prefix, options) {\n if (options === void 0) {\n options = defaults;\n }\n\n return useMemo(function () {\n return \"\" + prefix + options.separator + count++;\n }, [options.separator, prefix]);\n}\n\nfunction getElementId(_ref) {\n var contextId = _ref.contextId,\n uniqueId = _ref.uniqueId;\n return \"rbd-hidden-text-\" + contextId + \"-\" + uniqueId;\n}\nfunction useHiddenTextElement(_ref2) {\n var contextId = _ref2.contextId,\n text = _ref2.text;\n var uniqueId = useUniqueId('hidden-text', {\n separator: '-'\n });\n var id = useMemo(function () {\n return getElementId({\n contextId: contextId,\n uniqueId: uniqueId\n });\n }, [uniqueId, contextId]);\n useEffect(function mount() {\n var el = document.createElement('div');\n el.id = id;\n el.textContent = text;\n el.style.display = 'none';\n getBodyElement().appendChild(el);\n return function unmount() {\n var body = getBodyElement();\n\n if (body.contains(el)) {\n body.removeChild(el);\n }\n };\n }, [id, text]);\n return id;\n}\n\nvar AppContext = React.createContext(null);\n\nvar peerDependencies = {\n\treact: \"^16.8.5 || ^17.0.0 || ^18.0.0\",\n\t\"react-dom\": \"^16.8.5 || ^17.0.0 || ^18.0.0\"\n};\n\nvar semver = /(\\d+)\\.(\\d+)\\.(\\d+)/;\n\nvar getVersion = function getVersion(value) {\n var result = semver.exec(value);\n !(result != null) ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"Unable to parse React version \" + value) : invariant(false) : void 0;\n var major = Number(result[1]);\n var minor = Number(result[2]);\n var patch = Number(result[3]);\n return {\n major: major,\n minor: minor,\n patch: patch,\n raw: value\n };\n};\n\nvar isSatisfied = function isSatisfied(expected, actual) {\n if (actual.major > expected.major) {\n return true;\n }\n\n if (actual.major < expected.major) {\n return false;\n }\n\n if (actual.minor > expected.minor) {\n return true;\n }\n\n if (actual.minor < expected.minor) {\n return false;\n }\n\n return actual.patch >= expected.patch;\n};\n\nvar checkReactVersion = (function (peerDepValue, actualValue) {\n var peerDep = getVersion(peerDepValue);\n var actual = getVersion(actualValue);\n\n if (isSatisfied(peerDep, actual)) {\n return;\n }\n\n process.env.NODE_ENV !== \"production\" ? warning(\"\\n React version: [\" + actual.raw + \"]\\n does not satisfy expected peer dependency version: [\" + peerDep.raw + \"]\\n\\n This can result in run time bugs, and even fatal crashes\\n \") : void 0;\n});\n\nvar suffix = \"\\n We expect a html5 doctype: <!doctype html>\\n This is to ensure consistent browser layout and measurement\\n\\n More information: https://github.com/atlassian/react-beautiful-dnd/blob/master/docs/guides/doctype.md\\n\";\nvar checkDoctype = (function (doc) {\n var doctype = doc.doctype;\n\n if (!doctype) {\n process.env.NODE_ENV !== \"production\" ? warning(\"\\n No <!doctype html> found.\\n\\n \" + suffix + \"\\n \") : void 0;\n return;\n }\n\n if (doctype.name.toLowerCase() !== 'html') {\n process.env.NODE_ENV !== \"production\" ? warning(\"\\n Unexpected <!doctype> found: (\" + doctype.name + \")\\n\\n \" + suffix + \"\\n \") : void 0;\n }\n\n if (doctype.publicId !== '') {\n process.env.NODE_ENV !== \"production\" ? warning(\"\\n Unexpected <!doctype> publicId found: (\" + doctype.publicId + \")\\n A html5 doctype does not have a publicId\\n\\n \" + suffix + \"\\n \") : void 0;\n }\n});\n\nfunction useDev(useHook) {\n if (process.env.NODE_ENV !== 'production') {\n useHook();\n }\n}\n\nfunction useDevSetupWarning(fn, inputs) {\n useDev(function () {\n useEffect(function () {\n try {\n fn();\n } catch (e) {\n error(\"\\n A setup problem was encountered.\\n\\n > \" + e.message + \"\\n \");\n }\n }, inputs);\n });\n}\n\nfunction useStartupValidation() {\n useDevSetupWarning(function () {\n checkReactVersion(peerDependencies.react, React.version);\n checkDoctype(document);\n }, []);\n}\n\nfunction usePrevious(current) {\n var ref = useRef(current);\n useEffect(function () {\n ref.current = current;\n });\n return ref;\n}\n\nfunction create() {\n var lock = null;\n\n function isClaimed() {\n return Boolean(lock);\n }\n\n function isActive(value) {\n return value === lock;\n }\n\n function claim(abandon) {\n !!lock ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot claim lock as it is already claimed') : invariant(false) : void 0;\n var newLock = {\n abandon: abandon\n };\n lock = newLock;\n return newLock;\n }\n\n function release() {\n !lock ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot release lock when there is no lock') : invariant(false) : void 0;\n lock = null;\n }\n\n function tryAbandon() {\n if (lock) {\n lock.abandon();\n release();\n }\n }\n\n return {\n isClaimed: isClaimed,\n isActive: isActive,\n claim: claim,\n release: release,\n tryAbandon: tryAbandon\n };\n}\n\nvar tab = 9;\nvar enter = 13;\nvar escape = 27;\nvar space = 32;\nvar pageUp = 33;\nvar pageDown = 34;\nvar end = 35;\nvar home = 36;\nvar arrowLeft = 37;\nvar arrowUp = 38;\nvar arrowRight = 39;\nvar arrowDown = 40;\n\nvar _preventedKeys;\nvar preventedKeys = (_preventedKeys = {}, _preventedKeys[enter] = true, _preventedKeys[tab] = true, _preventedKeys);\nvar preventStandardKeyEvents = (function (event) {\n if (preventedKeys[event.keyCode]) {\n event.preventDefault();\n }\n});\n\nvar supportedEventName = function () {\n var base = 'visibilitychange';\n\n if (typeof document === 'undefined') {\n return base;\n }\n\n var candidates = [base, \"ms\" + base, \"webkit\" + base, \"moz\" + base, \"o\" + base];\n var supported = find(candidates, function (eventName) {\n return \"on\" + eventName in document;\n });\n return supported || base;\n}();\n\nvar primaryButton = 0;\nvar sloppyClickThreshold = 5;\n\nfunction isSloppyClickThresholdExceeded(original, current) {\n return Math.abs(current.x - original.x) >= sloppyClickThreshold || Math.abs(current.y - original.y) >= sloppyClickThreshold;\n}\n\nvar idle$1 = {\n type: 'IDLE'\n};\n\nfunction getCaptureBindings(_ref) {\n var cancel = _ref.cancel,\n completed = _ref.completed,\n getPhase = _ref.getPhase,\n setPhase = _ref.setPhase;\n return [{\n eventName: 'mousemove',\n fn: function fn(event) {\n var button = event.button,\n clientX = event.clientX,\n clientY = event.clientY;\n\n if (button !== primaryButton) {\n return;\n }\n\n var point = {\n x: clientX,\n y: clientY\n };\n var phase = getPhase();\n\n if (phase.type === 'DRAGGING') {\n event.preventDefault();\n phase.actions.move(point);\n return;\n }\n\n !(phase.type === 'PENDING') ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot be IDLE') : invariant(false) : void 0;\n var pending = phase.point;\n\n if (!isSloppyClickThresholdExceeded(pending, point)) {\n return;\n }\n\n event.preventDefault();\n var actions = phase.actions.fluidLift(point);\n setPhase({\n type: 'DRAGGING',\n actions: actions\n });\n }\n }, {\n eventName: 'mouseup',\n fn: function fn(event) {\n var phase = getPhase();\n\n if (phase.type !== 'DRAGGING') {\n cancel();\n return;\n }\n\n event.preventDefault();\n phase.actions.drop({\n shouldBlockNextClick: true\n });\n completed();\n }\n }, {\n eventName: 'mousedown',\n fn: function fn(event) {\n if (getPhase().type === 'DRAGGING') {\n event.preventDefault();\n }\n\n cancel();\n }\n }, {\n eventName: 'keydown',\n fn: function fn(event) {\n var phase = getPhase();\n\n if (phase.type === 'PENDING') {\n cancel();\n return;\n }\n\n if (event.keyCode === escape) {\n event.preventDefault();\n cancel();\n return;\n }\n\n preventStandardKeyEvents(event);\n }\n }, {\n eventName: 'resize',\n fn: cancel\n }, {\n eventName: 'scroll',\n options: {\n passive: true,\n capture: false\n },\n fn: function fn() {\n if (getPhase().type === 'PENDING') {\n cancel();\n }\n }\n }, {\n eventName: 'webkitmouseforcedown',\n fn: function fn(event) {\n var phase = getPhase();\n !(phase.type !== 'IDLE') ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Unexpected phase') : invariant(false) : void 0;\n\n if (phase.actions.shouldRespectForcePress()) {\n cancel();\n return;\n }\n\n event.preventDefault();\n }\n }, {\n eventName: supportedEventName,\n fn: cancel\n }];\n}\n\nfunction useMouseSensor(api) {\n var phaseRef = useRef(idle$1);\n var unbindEventsRef = useRef(noop);\n var startCaptureBinding = useMemo(function () {\n return {\n eventName: 'mousedown',\n fn: function onMouseDown(event) {\n if (event.defaultPrevented) {\n return;\n }\n\n if (event.button !== primaryButton) {\n return;\n }\n\n if (event.ctrlKey || event.metaKey || event.shiftKey || event.altKey) {\n return;\n }\n\n var draggableId = api.findClosestDraggableId(event);\n\n if (!draggableId) {\n return;\n }\n\n var actions = api.tryGetLock(draggableId, stop, {\n sourceEvent: event\n });\n\n if (!actions) {\n return;\n }\n\n event.preventDefault();\n var point = {\n x: event.clientX,\n y: event.clientY\n };\n unbindEventsRef.current();\n startPendingDrag(actions, point);\n }\n };\n }, [api]);\n var preventForcePressBinding = useMemo(function () {\n return {\n eventName: 'webkitmouseforcewillbegin',\n fn: function fn(event) {\n if (event.defaultPrevented) {\n return;\n }\n\n var id = api.findClosestDraggableId(event);\n\n if (!id) {\n return;\n }\n\n var options = api.findOptionsForDraggable(id);\n\n if (!options) {\n return;\n }\n\n if (options.shouldRespectForcePress) {\n return;\n }\n\n if (!api.canGetLock(id)) {\n return;\n }\n\n event.preventDefault();\n }\n };\n }, [api]);\n var listenForCapture = useCallback(function listenForCapture() {\n var options = {\n passive: false,\n capture: true\n };\n unbindEventsRef.current = bindEvents(window, [preventForcePressBinding, startCaptureBinding], options);\n }, [preventForcePressBinding, startCaptureBinding]);\n var stop = useCallback(function () {\n var current = phaseRef.current;\n\n if (current.type === 'IDLE') {\n return;\n }\n\n phaseRef.current = idle$1;\n unbindEventsRef.current();\n listenForCapture();\n }, [listenForCapture]);\n var cancel = useCallback(function () {\n var phase = phaseRef.current;\n stop();\n\n if (phase.type === 'DRAGGING') {\n phase.actions.cancel({\n shouldBlockNextClick: true\n });\n }\n\n if (phase.type === 'PENDING') {\n phase.actions.abort();\n }\n }, [stop]);\n var bindCapturingEvents = useCallback(function bindCapturingEvents() {\n var options = {\n capture: true,\n passive: false\n };\n var bindings = getCaptureBindings({\n cancel: cancel,\n completed: stop,\n getPhase: function getPhase() {\n return phaseRef.current;\n },\n setPhase: function setPhase(phase) {\n phaseRef.current = phase;\n }\n });\n unbindEventsRef.current = bindEvents(window, bindings, options);\n }, [cancel, stop]);\n var startPendingDrag = useCallback(function startPendingDrag(actions, point) {\n !(phaseRef.current.type === 'IDLE') ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Expected to move from IDLE to PENDING drag') : invariant(false) : void 0;\n phaseRef.current = {\n type: 'PENDING',\n point: point,\n actions: actions\n };\n bindCapturingEvents();\n }, [bindCapturingEvents]);\n useIsomorphicLayoutEffect(function mount() {\n listenForCapture();\n return function unmount() {\n unbindEventsRef.current();\n };\n }, [listenForCapture]);\n}\n\nvar _scrollJumpKeys;\n\nfunction noop$1() {}\n\nvar scrollJumpKeys = (_scrollJumpKeys = {}, _scrollJumpKeys[pageDown] = true, _scrollJumpKeys[pageUp] = true, _scrollJumpKeys[home] = true, _scrollJumpKeys[end] = true, _scrollJumpKeys);\n\nfunction getDraggingBindings(actions, stop) {\n function cancel() {\n stop();\n actions.cancel();\n }\n\n function drop() {\n stop();\n actions.drop();\n }\n\n return [{\n eventName: 'keydown',\n fn: function fn(event) {\n if (event.keyCode === escape) {\n event.preventDefault();\n cancel();\n return;\n }\n\n if (event.keyCode === space) {\n event.preventDefault();\n drop();\n return;\n }\n\n if (event.keyCode === arrowDown) {\n event.preventDefault();\n actions.moveDown();\n return;\n }\n\n if (event.keyCode === arrowUp) {\n event.preventDefault();\n actions.moveUp();\n return;\n }\n\n if (event.keyCode === arrowRight) {\n event.preventDefault();\n actions.moveRight();\n return;\n }\n\n if (event.keyCode === arrowLeft) {\n event.preventDefault();\n actions.moveLeft();\n return;\n }\n\n if (scrollJumpKeys[event.keyCode]) {\n event.preventDefault();\n return;\n }\n\n preventStandardKeyEvents(event);\n }\n }, {\n eventName: 'mousedown',\n fn: cancel\n }, {\n eventName: 'mouseup',\n fn: cancel\n }, {\n eventName: 'click',\n fn: cancel\n }, {\n eventName: 'touchstart',\n fn: cancel\n }, {\n eventName: 'resize',\n fn: cancel\n }, {\n eventName: 'wheel',\n fn: cancel,\n options: {\n passive: true\n }\n }, {\n eventName: supportedEventName,\n fn: cancel\n }];\n}\n\nfunction useKeyboardSensor(api) {\n var unbindEventsRef = useRef(noop$1);\n var startCaptureBinding = useMemo(function () {\n return {\n eventName: 'keydown',\n fn: function onKeyDown(event) {\n if (event.defaultPrevented) {\n return;\n }\n\n if (event.keyCode !== space) {\n return;\n }\n\n var draggableId = api.findClosestDraggableId(event);\n\n if (!draggableId) {\n return;\n }\n\n var preDrag = api.tryGetLock(draggableId, stop, {\n sourceEvent: event\n });\n\n if (!preDrag) {\n return;\n }\n\n event.preventDefault();\n var isCapturing = true;\n var actions = preDrag.snapLift();\n unbindEventsRef.current();\n\n function stop() {\n !isCapturing ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot stop capturing a keyboard drag when not capturing') : invariant(false) : void 0;\n isCapturing = false;\n unbindEventsRef.current();\n listenForCapture();\n }\n\n unbindEventsRef.current = bindEvents(window, getDraggingBindings(actions, stop), {\n capture: true,\n passive: false\n });\n }\n };\n }, [api]);\n var listenForCapture = useCallback(function tryStartCapture() {\n var options = {\n passive: false,\n capture: true\n };\n unbindEventsRef.current = bindEvents(window, [startCaptureBinding], options);\n }, [startCaptureBinding]);\n useIsomorphicLayoutEffect(function mount() {\n listenForCapture();\n return function unmount() {\n unbindEventsRef.current();\n };\n }, [listenForCapture]);\n}\n\nvar idle$2 = {\n type: 'IDLE'\n};\nvar timeForLongPress = 120;\nvar forcePressThreshold = 0.15;\n\nfunction getWindowBindings(_ref) {\n var cancel = _ref.cancel,\n getPhase = _ref.getPhase;\n return [{\n eventName: 'orientationchange',\n fn: cancel\n }, {\n eventName: 'resize',\n fn: cancel\n }, {\n eventName: 'contextmenu',\n fn: function fn(event) {\n event.preventDefault();\n }\n }, {\n eventName: 'keydown',\n fn: function fn(event) {\n if (getPhase().type !== 'DRAGGING') {\n cancel();\n return;\n }\n\n if (event.keyCode === escape) {\n event.preventDefault();\n }\n\n cancel();\n }\n }, {\n eventName: supportedEventName,\n fn: cancel\n }];\n}\n\nfunction getHandleBindings(_ref2) {\n var cancel = _ref2.cancel,\n completed = _ref2.completed,\n getPhase = _ref2.getPhase;\n return [{\n eventName: 'touchmove',\n options: {\n capture: false\n },\n fn: function fn(event) {\n var phase = getPhase();\n\n if (phase.type !== 'DRAGGING') {\n cancel();\n return;\n }\n\n phase.hasMoved = true;\n var _event$touches$ = event.touches[0],\n clientX = _event$touches$.clientX,\n clientY = _event$touches$.clientY;\n var point = {\n x: clientX,\n y: clientY\n };\n event.preventDefault();\n phase.actions.move(point);\n }\n }, {\n eventName: 'touchend',\n fn: function fn(event) {\n var phase = getPhase();\n\n if (phase.type !== 'DRAGGING') {\n cancel();\n return;\n }\n\n event.preventDefault();\n phase.actions.drop({\n shouldBlockNextClick: true\n });\n completed();\n }\n }, {\n eventName: 'touchcancel',\n fn: function fn(event) {\n if (getPhase().type !== 'DRAGGING') {\n cancel();\n return;\n }\n\n event.preventDefault();\n cancel();\n }\n }, {\n eventName: 'touchforcechange',\n fn: function fn(event) {\n var phase = getPhase();\n !(phase.type !== 'IDLE') ? process.env.NODE_ENV !== \"production\" ? invariant(false) : invariant(false) : void 0;\n var touch = event.touches[0];\n\n if (!touch) {\n return;\n }\n\n var isForcePress = touch.force >= forcePressThreshold;\n\n if (!isForcePress) {\n return;\n }\n\n var shouldRespect = phase.actions.shouldRespectForcePress();\n\n if (phase.type === 'PENDING') {\n if (shouldRespect) {\n cancel();\n }\n\n return;\n }\n\n if (shouldRespect) {\n if (phase.hasMoved) {\n event.preventDefault();\n return;\n }\n\n cancel();\n return;\n }\n\n event.preventDefault();\n }\n }, {\n eventName: supportedEventName,\n fn: cancel\n }];\n}\n\nfunction useTouchSensor(api) {\n var phaseRef = useRef(idle$2);\n var unbindEventsRef = useRef(noop);\n var getPhase = useCallback(function getPhase() {\n return phaseRef.current;\n }, []);\n var setPhase = useCallback(function setPhase(phase) {\n phaseRef.current = phase;\n }, []);\n var startCaptureBinding = useMemo(function () {\n return {\n eventName: 'touchstart',\n fn: function onTouchStart(event) {\n if (event.defaultPrevented) {\n return;\n }\n\n var draggableId = api.findClosestDraggableId(event);\n\n if (!draggableId) {\n return;\n }\n\n var actions = api.tryGetLock(draggableId, stop, {\n sourceEvent: event\n });\n\n if (!actions) {\n return;\n }\n\n var touch = event.touches[0];\n var clientX = touch.clientX,\n clientY = touch.clientY;\n var point = {\n x: clientX,\n y: clientY\n };\n unbindEventsRef.current();\n startPendingDrag(actions, point);\n }\n };\n }, [api]);\n var listenForCapture = useCallback(function listenForCapture() {\n var options = {\n capture: true,\n passive: false\n };\n unbindEventsRef.current = bindEvents(window, [startCaptureBinding], options);\n }, [startCaptureBinding]);\n var stop = useCallback(function () {\n var current = phaseRef.current;\n\n if (current.type === 'IDLE') {\n return;\n }\n\n if (current.type === 'PENDING') {\n clearTimeout(current.longPressTimerId);\n }\n\n setPhase(idle$2);\n unbindEventsRef.current();\n listenForCapture();\n }, [listenForCapture, setPhase]);\n var cancel = useCallback(function () {\n var phase = phaseRef.current;\n stop();\n\n if (phase.type === 'DRAGGING') {\n phase.actions.cancel({\n shouldBlockNextClick: true\n });\n }\n\n if (phase.type === 'PENDING') {\n phase.actions.abort();\n }\n }, [stop]);\n var bindCapturingEvents = useCallback(function bindCapturingEvents() {\n var options = {\n capture: true,\n passive: false\n };\n var args = {\n cancel: cancel,\n completed: stop,\n getPhase: getPhase\n };\n var unbindTarget = bindEvents(window, getHandleBindings(args), options);\n var unbindWindow = bindEvents(window, getWindowBindings(args), options);\n\n unbindEventsRef.current = function unbindAll() {\n unbindTarget();\n unbindWindow();\n };\n }, [cancel, getPhase, stop]);\n var startDragging = useCallback(function startDragging() {\n var phase = getPhase();\n !(phase.type === 'PENDING') ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"Cannot start dragging from phase \" + phase.type) : invariant(false) : void 0;\n var actions = phase.actions.fluidLift(phase.point);\n setPhase({\n type: 'DRAGGING',\n actions: actions,\n hasMoved: false\n });\n }, [getPhase, setPhase]);\n var startPendingDrag = useCallback(function startPendingDrag(actions, point) {\n !(getPhase().type === 'IDLE') ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Expected to move from IDLE to PENDING drag') : invariant(false) : void 0;\n var longPressTimerId = setTimeout(startDragging, timeForLongPress);\n setPhase({\n type: 'PENDING',\n point: point,\n actions: actions,\n longPressTimerId: longPressTimerId\n });\n bindCapturingEvents();\n }, [bindCapturingEvents, getPhase, setPhase, startDragging]);\n useIsomorphicLayoutEffect(function mount() {\n listenForCapture();\n return function unmount() {\n unbindEventsRef.current();\n var phase = getPhase();\n\n if (phase.type === 'PENDING') {\n clearTimeout(phase.longPressTimerId);\n setPhase(idle$2);\n }\n };\n }, [getPhase, listenForCapture, setPhase]);\n useIsomorphicLayoutEffect(function webkitHack() {\n var unbind = bindEvents(window, [{\n eventName: 'touchmove',\n fn: function fn() {},\n options: {\n capture: false,\n passive: false\n }\n }]);\n return unbind;\n }, []);\n}\n\nfunction useValidateSensorHooks(sensorHooks) {\n useDev(function () {\n var previousRef = usePrevious(sensorHooks);\n useDevSetupWarning(function () {\n !(previousRef.current.length === sensorHooks.length) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot change the amount of sensor hooks after mounting') : invariant(false) : void 0;\n });\n });\n}\n\nvar interactiveTagNames = {\n input: true,\n button: true,\n textarea: true,\n select: true,\n option: true,\n optgroup: true,\n video: true,\n audio: true\n};\n\nfunction isAnInteractiveElement(parent, current) {\n if (current == null) {\n return false;\n }\n\n var hasAnInteractiveTag = Boolean(interactiveTagNames[current.tagName.toLowerCase()]);\n\n if (hasAnInteractiveTag) {\n return true;\n }\n\n var attribute = current.getAttribute('contenteditable');\n\n if (attribute === 'true' || attribute === '') {\n return true;\n }\n\n if (current === parent) {\n return false;\n }\n\n return isAnInteractiveElement(parent, current.parentElement);\n}\n\nfunction isEventInInteractiveElement(draggable, event) {\n var target = event.target;\n\n if (!isHtmlElement(target)) {\n return false;\n }\n\n return isAnInteractiveElement(draggable, target);\n}\n\nvar getBorderBoxCenterPosition = (function (el) {\n return getRect(el.getBoundingClientRect()).center;\n});\n\nfunction isElement(el) {\n return el instanceof getWindowFromEl(el).Element;\n}\n\nvar supportedMatchesName = function () {\n var base = 'matches';\n\n if (typeof document === 'undefined') {\n return base;\n }\n\n var candidates = [base, 'msMatchesSelector', 'webkitMatchesSelector'];\n var value = find(candidates, function (name) {\n return name in Element.prototype;\n });\n return value || base;\n}();\n\nfunction closestPonyfill(el, selector) {\n if (el == null) {\n return null;\n }\n\n if (el[supportedMatchesName](selector)) {\n return el;\n }\n\n return closestPonyfill(el.parentElement, selector);\n}\n\nfunction closest$1(el, selector) {\n if (el.closest) {\n return el.closest(selector);\n }\n\n return closestPonyfill(el, selector);\n}\n\nfunction getSelector(contextId) {\n return \"[\" + dragHandle.contextId + \"=\\\"\" + contextId + \"\\\"]\";\n}\n\nfunction findClosestDragHandleFromEvent(contextId, event) {\n var target = event.target;\n\n if (!isElement(target)) {\n process.env.NODE_ENV !== \"production\" ? warning('event.target must be a Element') : void 0;\n return null;\n }\n\n var selector = getSelector(contextId);\n var handle = closest$1(target, selector);\n\n if (!handle) {\n return null;\n }\n\n if (!isHtmlElement(handle)) {\n process.env.NODE_ENV !== \"production\" ? warning('drag handle must be a HTMLElement') : void 0;\n return null;\n }\n\n return handle;\n}\n\nfunction tryGetClosestDraggableIdFromEvent(contextId, event) {\n var handle = findClosestDragHandleFromEvent(contextId, event);\n\n if (!handle) {\n return null;\n }\n\n return handle.getAttribute(dragHandle.draggableId);\n}\n\nfunction findDraggable(contextId, draggableId) {\n var selector = \"[\" + draggable.contextId + \"=\\\"\" + contextId + \"\\\"]\";\n var possible = toArray(document.querySelectorAll(selector));\n var draggable$1 = find(possible, function (el) {\n return el.getAttribute(draggable.id) === draggableId;\n });\n\n if (!draggable$1) {\n return null;\n }\n\n if (!isHtmlElement(draggable$1)) {\n process.env.NODE_ENV !== \"production\" ? warning('Draggable element is not a HTMLElement') : void 0;\n return null;\n }\n\n return draggable$1;\n}\n\nfunction preventDefault(event) {\n event.preventDefault();\n}\n\nfunction _isActive(_ref) {\n var expected = _ref.expected,\n phase = _ref.phase,\n isLockActive = _ref.isLockActive,\n shouldWarn = _ref.shouldWarn;\n\n if (!isLockActive()) {\n if (shouldWarn) {\n process.env.NODE_ENV !== \"production\" ? warning(\"\\n Cannot perform action.\\n The sensor no longer has an action lock.\\n\\n Tips:\\n\\n - Throw away your action handlers when forceStop() is called\\n - Check actions.isActive() if you really need to\\n \") : void 0;\n }\n\n return false;\n }\n\n if (expected !== phase) {\n if (shouldWarn) {\n process.env.NODE_ENV !== \"production\" ? warning(\"\\n Cannot perform action.\\n The actions you used belong to an outdated phase\\n\\n Current phase: \" + expected + \"\\n You called an action from outdated phase: \" + phase + \"\\n\\n Tips:\\n\\n - Do not use preDragActions actions after calling preDragActions.lift()\\n \") : void 0;\n }\n\n return false;\n }\n\n return true;\n}\n\nfunction canStart(_ref2) {\n var lockAPI = _ref2.lockAPI,\n store = _ref2.store,\n registry = _ref2.registry,\n draggableId = _ref2.draggableId;\n\n if (lockAPI.isClaimed()) {\n return false;\n }\n\n var entry = registry.draggable.findById(draggableId);\n\n if (!entry) {\n process.env.NODE_ENV !== \"production\" ? warning(\"Unable to find draggable with id: \" + draggableId) : void 0;\n return false;\n }\n\n if (!entry.options.isEnabled) {\n return false;\n }\n\n if (!canStartDrag(store.getState(), draggableId)) {\n return false;\n }\n\n return true;\n}\n\nfunction tryStart(_ref3) {\n var lockAPI = _ref3.lockAPI,\n contextId = _ref3.contextId,\n store = _ref3.store,\n registry = _ref3.registry,\n draggableId = _ref3.draggableId,\n forceSensorStop = _ref3.forceSensorStop,\n sourceEvent = _ref3.sourceEvent;\n var shouldStart = canStart({\n lockAPI: lockAPI,\n store: store,\n registry: registry,\n draggableId: draggableId\n });\n\n if (!shouldStart) {\n return null;\n }\n\n var entry = registry.draggable.getById(draggableId);\n var el = findDraggable(contextId, entry.descriptor.id);\n\n if (!el) {\n process.env.NODE_ENV !== \"production\" ? warning(\"Unable to find draggable element with id: \" + draggableId) : void 0;\n return null;\n }\n\n if (sourceEvent && !entry.options.canDragInteractiveElements && isEventInInteractiveElement(el, sourceEvent)) {\n return null;\n }\n\n var lock = lockAPI.claim(forceSensorStop || noop);\n var phase = 'PRE_DRAG';\n\n function getShouldRespectForcePress() {\n return entry.options.shouldRespectForcePress;\n }\n\n function isLockActive() {\n return lockAPI.isActive(lock);\n }\n\n function tryDispatch(expected, getAction) {\n if (_isActive({\n expected: expected,\n phase: phase,\n isLockActive: isLockActive,\n shouldWarn: true\n })) {\n store.dispatch(getAction());\n }\n }\n\n var tryDispatchWhenDragging = tryDispatch.bind(null, 'DRAGGING');\n\n function lift$1(args) {\n function completed() {\n lockAPI.release();\n phase = 'COMPLETED';\n }\n\n if (phase !== 'PRE_DRAG') {\n completed();\n !(phase === 'PRE_DRAG') ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"Cannot lift in phase \" + phase) : invariant(false) : void 0;\n }\n\n store.dispatch(lift(args.liftActionArgs));\n phase = 'DRAGGING';\n\n function finish(reason, options) {\n if (options === void 0) {\n options = {\n shouldBlockNextClick: false\n };\n }\n\n args.cleanup();\n\n if (options.shouldBlockNextClick) {\n var unbind = bindEvents(window, [{\n eventName: 'click',\n fn: preventDefault,\n options: {\n once: true,\n passive: false,\n capture: true\n }\n }]);\n setTimeout(unbind);\n }\n\n completed();\n store.dispatch(drop({\n reason: reason\n }));\n }\n\n return _extends({\n isActive: function isActive() {\n return _isActive({\n expected: 'DRAGGING',\n phase: phase,\n isLockActive: isLockActive,\n shouldWarn: false\n });\n },\n shouldRespectForcePress: getShouldRespectForcePress,\n drop: function drop(options) {\n return finish('DROP', options);\n },\n cancel: function cancel(options) {\n return finish('CANCEL', options);\n }\n }, args.actions);\n }\n\n function fluidLift(clientSelection) {\n var move$1 = rafSchd(function (client) {\n tryDispatchWhenDragging(function () {\n return move({\n client: client\n });\n });\n });\n var api = lift$1({\n liftActionArgs: {\n id: draggableId,\n clientSelection: clientSelection,\n movementMode: 'FLUID'\n },\n cleanup: function cleanup() {\n return move$1.cancel();\n },\n actions: {\n move: move$1\n }\n });\n return _extends({}, api, {\n move: move$1\n });\n }\n\n function snapLift() {\n var actions = {\n moveUp: function moveUp$1() {\n return tryDispatchWhenDragging(moveUp);\n },\n moveRight: function moveRight$1() {\n return tryDispatchWhenDragging(moveRight);\n },\n moveDown: function moveDown$1() {\n return tryDispatchWhenDragging(moveDown);\n },\n moveLeft: function moveLeft$1() {\n return tryDispatchWhenDragging(moveLeft);\n }\n };\n return lift$1({\n liftActionArgs: {\n id: draggableId,\n clientSelection: getBorderBoxCenterPosition(el),\n movementMode: 'SNAP'\n },\n cleanup: noop,\n actions: actions\n });\n }\n\n function abortPreDrag() {\n var shouldRelease = _isActive({\n expected: 'PRE_DRAG',\n phase: phase,\n isLockActive: isLockActive,\n shouldWarn: true\n });\n\n if (shouldRelease) {\n lockAPI.release();\n }\n }\n\n var preDrag = {\n isActive: function isActive() {\n return _isActive({\n expected: 'PRE_DRAG',\n phase: phase,\n isLockActive: isLockActive,\n shouldWarn: false\n });\n },\n shouldRespectForcePress: getShouldRespectForcePress,\n fluidLift: fluidLift,\n snapLift: snapLift,\n abort: abortPreDrag\n };\n return preDrag;\n}\n\nvar defaultSensors = [useMouseSensor, useKeyboardSensor, useTouchSensor];\nfunction useSensorMarshal(_ref4) {\n var contextId = _ref4.contextId,\n store = _ref4.store,\n registry = _ref4.registry,\n customSensors = _ref4.customSensors,\n enableDefaultSensors = _ref4.enableDefaultSensors;\n var useSensors = [].concat(enableDefaultSensors ? defaultSensors : [], customSensors || []);\n var lockAPI = useState(function () {\n return create();\n })[0];\n var tryAbandonLock = useCallback(function tryAbandonLock(previous, current) {\n if (previous.isDragging && !current.isDragging) {\n lockAPI.tryAbandon();\n }\n }, [lockAPI]);\n useIsomorphicLayoutEffect(function listenToStore() {\n var previous = store.getState();\n var unsubscribe = store.subscribe(function () {\n var current = store.getState();\n tryAbandonLock(previous, current);\n previous = current;\n });\n return unsubscribe;\n }, [lockAPI, store, tryAbandonLock]);\n useIsomorphicLayoutEffect(function () {\n return lockAPI.tryAbandon;\n }, [lockAPI.tryAbandon]);\n var canGetLock = useCallback(function (draggableId) {\n return canStart({\n lockAPI: lockAPI,\n registry: registry,\n store: store,\n draggableId: draggableId\n });\n }, [lockAPI, registry, store]);\n var tryGetLock = useCallback(function (draggableId, forceStop, options) {\n return tryStart({\n lockAPI: lockAPI,\n registry: registry,\n contextId: contextId,\n store: store,\n draggableId: draggableId,\n forceSensorStop: forceStop,\n sourceEvent: options && options.sourceEvent ? options.sourceEvent : null\n });\n }, [contextId, lockAPI, registry, store]);\n var findClosestDraggableId = useCallback(function (event) {\n return tryGetClosestDraggableIdFromEvent(contextId, event);\n }, [contextId]);\n var findOptionsForDraggable = useCallback(function (id) {\n var entry = registry.draggable.findById(id);\n return entry ? entry.options : null;\n }, [registry.draggable]);\n var tryReleaseLock = useCallback(function tryReleaseLock() {\n if (!lockAPI.isClaimed()) {\n return;\n }\n\n lockAPI.tryAbandon();\n\n if (store.getState().phase !== 'IDLE') {\n store.dispatch(flush());\n }\n }, [lockAPI, store]);\n var isLockClaimed = useCallback(lockAPI.isClaimed, [lockAPI]);\n var api = useMemo(function () {\n return {\n canGetLock: canGetLock,\n tryGetLock: tryGetLock,\n findClosestDraggableId: findClosestDraggableId,\n findOptionsForDraggable: findOptionsForDraggable,\n tryReleaseLock: tryReleaseLock,\n isLockClaimed: isLockClaimed\n };\n }, [canGetLock, tryGetLock, findClosestDraggableId, findOptionsForDraggable, tryReleaseLock, isLockClaimed]);\n useValidateSensorHooks(useSensors);\n\n for (var i = 0; i < useSensors.length; i++) {\n useSensors[i](api);\n }\n}\n\nvar createResponders = function createResponders(props) {\n return {\n onBeforeCapture: props.onBeforeCapture,\n onBeforeDragStart: props.onBeforeDragStart,\n onDragStart: props.onDragStart,\n onDragEnd: props.onDragEnd,\n onDragUpdate: props.onDragUpdate\n };\n};\n\nfunction getStore(lazyRef) {\n !lazyRef.current ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Could not find store from lazy ref') : invariant(false) : void 0;\n return lazyRef.current;\n}\n\nfunction App(props) {\n var contextId = props.contextId,\n setCallbacks = props.setCallbacks,\n sensors = props.sensors,\n nonce = props.nonce,\n dragHandleUsageInstructions = props.dragHandleUsageInstructions;\n var lazyStoreRef = useRef(null);\n useStartupValidation();\n var lastPropsRef = usePrevious(props);\n var getResponders = useCallback(function () {\n return createResponders(lastPropsRef.current);\n }, [lastPropsRef]);\n var announce = useAnnouncer(contextId);\n var dragHandleUsageInstructionsId = useHiddenTextElement({\n contextId: contextId,\n text: dragHandleUsageInstructions\n });\n var styleMarshal = useStyleMarshal(contextId, nonce);\n var lazyDispatch = useCallback(function (action) {\n getStore(lazyStoreRef).dispatch(action);\n }, []);\n var marshalCallbacks = useMemo(function () {\n return bindActionCreators({\n publishWhileDragging: publishWhileDragging,\n updateDroppableScroll: updateDroppableScroll,\n updateDroppableIsEnabled: updateDroppableIsEnabled,\n updateDroppableIsCombineEnabled: updateDroppableIsCombineEnabled,\n collectionStarting: collectionStarting\n }, lazyDispatch);\n }, [lazyDispatch]);\n var registry = useRegistry();\n var dimensionMarshal = useMemo(function () {\n return createDimensionMarshal(registry, marshalCallbacks);\n }, [registry, marshalCallbacks]);\n var autoScroller = useMemo(function () {\n return createAutoScroller(_extends({\n scrollWindow: scrollWindow,\n scrollDroppable: dimensionMarshal.scrollDroppable\n }, bindActionCreators({\n move: move\n }, lazyDispatch)));\n }, [dimensionMarshal.scrollDroppable, lazyDispatch]);\n var focusMarshal = useFocusMarshal(contextId);\n var store = useMemo(function () {\n return createStore({\n announce: announce,\n autoScroller: autoScroller,\n dimensionMarshal: dimensionMarshal,\n focusMarshal: focusMarshal,\n getResponders: getResponders,\n styleMarshal: styleMarshal\n });\n }, [announce, autoScroller, dimensionMarshal, focusMarshal, getResponders, styleMarshal]);\n\n if (process.env.NODE_ENV !== 'production') {\n if (lazyStoreRef.current && lazyStoreRef.current !== store) {\n process.env.NODE_ENV !== \"production\" ? warning('unexpected store change') : void 0;\n }\n }\n\n lazyStoreRef.current = store;\n var tryResetStore = useCallback(function () {\n var current = getStore(lazyStoreRef);\n var state = current.getState();\n\n if (state.phase !== 'IDLE') {\n current.dispatch(flush());\n }\n }, []);\n var isDragging = useCallback(function () {\n var state = getStore(lazyStoreRef).getState();\n return state.isDragging || state.phase === 'DROP_ANIMATING';\n }, []);\n var appCallbacks = useMemo(function () {\n return {\n isDragging: isDragging,\n tryAbort: tryResetStore\n };\n }, [isDragging, tryResetStore]);\n setCallbacks(appCallbacks);\n var getCanLift = useCallback(function (id) {\n return canStartDrag(getStore(lazyStoreRef).getState(), id);\n }, []);\n var getIsMovementAllowed = useCallback(function () {\n return isMovementAllowed(getStore(lazyStoreRef).getState());\n }, []);\n var appContext = useMemo(function () {\n return {\n marshal: dimensionMarshal,\n focus: focusMarshal,\n contextId: contextId,\n canLift: getCanLift,\n isMovementAllowed: getIsMovementAllowed,\n dragHandleUsageInstructionsId: dragHandleUsageInstructionsId,\n registry: registry\n };\n }, [contextId, dimensionMarshal, dragHandleUsageInstructionsId, focusMarshal, getCanLift, getIsMovementAllowed, registry]);\n useSensorMarshal({\n contextId: contextId,\n store: store,\n registry: registry,\n customSensors: sensors,\n enableDefaultSensors: props.enableDefaultSensors !== false\n });\n useEffect(function () {\n return tryResetStore;\n }, [tryResetStore]);\n return React.createElement(AppContext.Provider, {\n value: appContext\n }, React.createElement(Provider, {\n context: StoreContext,\n store: store\n }, props.children));\n}\n\nvar count$1 = 0;\nfunction reset$1() {\n count$1 = 0;\n}\nfunction useInstanceCount() {\n return useMemo(function () {\n return \"\" + count$1++;\n }, []);\n}\n\nfunction resetServerContext() {\n reset$1();\n reset();\n}\nfunction DragDropContext(props) {\n var contextId = useInstanceCount();\n var dragHandleUsageInstructions = props.dragHandleUsageInstructions || preset.dragHandleUsageInstructions;\n return React.createElement(ErrorBoundary, null, function (setCallbacks) {\n return React.createElement(App, {\n nonce: props.nonce,\n contextId: contextId,\n setCallbacks: setCallbacks,\n dragHandleUsageInstructions: dragHandleUsageInstructions,\n enableDefaultSensors: props.enableDefaultSensors,\n sensors: props.sensors,\n onBeforeCapture: props.onBeforeCapture,\n onBeforeDragStart: props.onBeforeDragStart,\n onDragStart: props.onDragStart,\n onDragUpdate: props.onDragUpdate,\n onDragEnd: props.onDragEnd\n }, props.children);\n });\n}\n\nvar isEqual$1 = function isEqual(base) {\n return function (value) {\n return base === value;\n };\n};\n\nvar isScroll = isEqual$1('scroll');\nvar isAuto = isEqual$1('auto');\nvar isVisible$1 = isEqual$1('visible');\n\nvar isEither = function isEither(overflow, fn) {\n return fn(overflow.overflowX) || fn(overflow.overflowY);\n};\n\nvar isBoth = function isBoth(overflow, fn) {\n return fn(overflow.overflowX) && fn(overflow.overflowY);\n};\n\nvar isElementScrollable = function isElementScrollable(el) {\n var style = window.getComputedStyle(el);\n var overflow = {\n overflowX: style.overflowX,\n overflowY: style.overflowY\n };\n return isEither(overflow, isScroll) || isEither(overflow, isAuto);\n};\n\nvar isBodyScrollable = function isBodyScrollable() {\n if (process.env.NODE_ENV === 'production') {\n return false;\n }\n\n var body = getBodyElement();\n var html = document.documentElement;\n !html ? process.env.NODE_ENV !== \"production\" ? invariant(false) : invariant(false) : void 0;\n\n if (!isElementScrollable(body)) {\n return false;\n }\n\n var htmlStyle = window.getComputedStyle(html);\n var htmlOverflow = {\n overflowX: htmlStyle.overflowX,\n overflowY: htmlStyle.overflowY\n };\n\n if (isBoth(htmlOverflow, isVisible$1)) {\n return false;\n }\n\n process.env.NODE_ENV !== \"production\" ? warning(\"\\n We have detected that your <body> element might be a scroll container.\\n We have found no reliable way of detecting whether the <body> element is a scroll container.\\n Under most circumstances a <body> scroll bar will be on the <html> element (document.documentElement)\\n\\n Because we cannot determine if the <body> is a scroll container, and generally it is not one,\\n we will be treating the <body> as *not* a scroll container\\n\\n More information: https://github.com/atlassian/react-beautiful-dnd/blob/master/docs/guides/how-we-detect-scroll-containers.md\\n \") : void 0;\n return false;\n};\n\nvar getClosestScrollable = function getClosestScrollable(el) {\n if (el == null) {\n return null;\n }\n\n if (el === document.body) {\n return isBodyScrollable() ? el : null;\n }\n\n if (el === document.documentElement) {\n return null;\n }\n\n if (!isElementScrollable(el)) {\n return getClosestScrollable(el.parentElement);\n }\n\n return el;\n};\n\nvar checkForNestedScrollContainers = (function (scrollable) {\n if (!scrollable) {\n return;\n }\n\n var anotherScrollParent = getClosestScrollable(scrollable.parentElement);\n\n if (!anotherScrollParent) {\n return;\n }\n\n process.env.NODE_ENV !== \"production\" ? warning(\"\\n Droppable: unsupported nested scroll container detected.\\n A Droppable can only have one scroll parent (which can be itself)\\n Nested scroll containers are currently not supported.\\n\\n We hope to support nested scroll containers soon: https://github.com/atlassian/react-beautiful-dnd/issues/131\\n \") : void 0;\n});\n\nvar getScroll$1 = (function (el) {\n return {\n x: el.scrollLeft,\n y: el.scrollTop\n };\n});\n\nvar getIsFixed = function getIsFixed(el) {\n if (!el) {\n return false;\n }\n\n var style = window.getComputedStyle(el);\n\n if (style.position === 'fixed') {\n return true;\n }\n\n return getIsFixed(el.parentElement);\n};\n\nvar getEnv = (function (start) {\n var closestScrollable = getClosestScrollable(start);\n var isFixedOnPage = getIsFixed(start);\n return {\n closestScrollable: closestScrollable,\n isFixedOnPage: isFixedOnPage\n };\n});\n\nvar getDroppableDimension = (function (_ref) {\n var descriptor = _ref.descriptor,\n isEnabled = _ref.isEnabled,\n isCombineEnabled = _ref.isCombineEnabled,\n isFixedOnPage = _ref.isFixedOnPage,\n direction = _ref.direction,\n client = _ref.client,\n page = _ref.page,\n closest = _ref.closest;\n\n var frame = function () {\n if (!closest) {\n return null;\n }\n\n var scrollSize = closest.scrollSize,\n frameClient = closest.client;\n var maxScroll = getMaxScroll({\n scrollHeight: scrollSize.scrollHeight,\n scrollWidth: scrollSize.scrollWidth,\n height: frameClient.paddingBox.height,\n width: frameClient.paddingBox.width\n });\n return {\n pageMarginBox: closest.page.marginBox,\n frameClient: frameClient,\n scrollSize: scrollSize,\n shouldClipSubject: closest.shouldClipSubject,\n scroll: {\n initial: closest.scroll,\n current: closest.scroll,\n max: maxScroll,\n diff: {\n value: origin,\n displacement: origin\n }\n }\n };\n }();\n\n var axis = direction === 'vertical' ? vertical : horizontal;\n var subject = getSubject({\n page: page,\n withPlaceholder: null,\n axis: axis,\n frame: frame\n });\n var dimension = {\n descriptor: descriptor,\n isCombineEnabled: isCombineEnabled,\n isFixedOnPage: isFixedOnPage,\n axis: axis,\n isEnabled: isEnabled,\n client: client,\n page: page,\n frame: frame,\n subject: subject\n };\n return dimension;\n});\n\nvar getClient = function getClient(targetRef, closestScrollable) {\n var base = getBox(targetRef);\n\n if (!closestScrollable) {\n return base;\n }\n\n if (targetRef !== closestScrollable) {\n return base;\n }\n\n var top = base.paddingBox.top - closestScrollable.scrollTop;\n var left = base.paddingBox.left - closestScrollable.scrollLeft;\n var bottom = top + closestScrollable.scrollHeight;\n var right = left + closestScrollable.scrollWidth;\n var paddingBox = {\n top: top,\n right: right,\n bottom: bottom,\n left: left\n };\n var borderBox = expand(paddingBox, base.border);\n var client = createBox({\n borderBox: borderBox,\n margin: base.margin,\n border: base.border,\n padding: base.padding\n });\n return client;\n};\n\nvar getDimension = (function (_ref) {\n var ref = _ref.ref,\n descriptor = _ref.descriptor,\n env = _ref.env,\n windowScroll = _ref.windowScroll,\n direction = _ref.direction,\n isDropDisabled = _ref.isDropDisabled,\n isCombineEnabled = _ref.isCombineEnabled,\n shouldClipSubject = _ref.shouldClipSubject;\n var closestScrollable = env.closestScrollable;\n var client = getClient(ref, closestScrollable);\n var page = withScroll(client, windowScroll);\n\n var closest = function () {\n if (!closestScrollable) {\n return null;\n }\n\n var frameClient = getBox(closestScrollable);\n var scrollSize = {\n scrollHeight: closestScrollable.scrollHeight,\n scrollWidth: closestScrollable.scrollWidth\n };\n return {\n client: frameClient,\n page: withScroll(frameClient, windowScroll),\n scroll: getScroll$1(closestScrollable),\n scrollSize: scrollSize,\n shouldClipSubject: shouldClipSubject\n };\n }();\n\n var dimension = getDroppableDimension({\n descriptor: descriptor,\n isEnabled: !isDropDisabled,\n isCombineEnabled: isCombineEnabled,\n isFixedOnPage: env.isFixedOnPage,\n direction: direction,\n client: client,\n page: page,\n closest: closest\n });\n return dimension;\n});\n\nvar immediate = {\n passive: false\n};\nvar delayed = {\n passive: true\n};\nvar getListenerOptions = (function (options) {\n return options.shouldPublishImmediately ? immediate : delayed;\n});\n\nfunction useRequiredContext(Context) {\n var result = useContext(Context);\n !result ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Could not find required context') : invariant(false) : void 0;\n return result;\n}\n\nvar getClosestScrollableFromDrag = function getClosestScrollableFromDrag(dragging) {\n return dragging && dragging.env.closestScrollable || null;\n};\n\nfunction useDroppablePublisher(args) {\n var whileDraggingRef = useRef(null);\n var appContext = useRequiredContext(AppContext);\n var uniqueId = useUniqueId('droppable');\n var registry = appContext.registry,\n marshal = appContext.marshal;\n var previousRef = usePrevious(args);\n var descriptor = useMemo(function () {\n return {\n id: args.droppableId,\n type: args.type,\n mode: args.mode\n };\n }, [args.droppableId, args.mode, args.type]);\n var publishedDescriptorRef = useRef(descriptor);\n var memoizedUpdateScroll = useMemo(function () {\n return memoizeOne(function (x, y) {\n !whileDraggingRef.current ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Can only update scroll when dragging') : invariant(false) : void 0;\n var scroll = {\n x: x,\n y: y\n };\n marshal.updateDroppableScroll(descriptor.id, scroll);\n });\n }, [descriptor.id, marshal]);\n var getClosestScroll = useCallback(function () {\n var dragging = whileDraggingRef.current;\n\n if (!dragging || !dragging.env.closestScrollable) {\n return origin;\n }\n\n return getScroll$1(dragging.env.closestScrollable);\n }, []);\n var updateScroll = useCallback(function () {\n var scroll = getClosestScroll();\n memoizedUpdateScroll(scroll.x, scroll.y);\n }, [getClosestScroll, memoizedUpdateScroll]);\n var scheduleScrollUpdate = useMemo(function () {\n return rafSchd(updateScroll);\n }, [updateScroll]);\n var onClosestScroll = useCallback(function () {\n var dragging = whileDraggingRef.current;\n var closest = getClosestScrollableFromDrag(dragging);\n !(dragging && closest) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Could not find scroll options while scrolling') : invariant(false) : void 0;\n var options = dragging.scrollOptions;\n\n if (options.shouldPublishImmediately) {\n updateScroll();\n return;\n }\n\n scheduleScrollUpdate();\n }, [scheduleScrollUpdate, updateScroll]);\n var getDimensionAndWatchScroll = useCallback(function (windowScroll, options) {\n !!whileDraggingRef.current ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot collect a droppable while a drag is occurring') : invariant(false) : void 0;\n var previous = previousRef.current;\n var ref = previous.getDroppableRef();\n !ref ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot collect without a droppable ref') : invariant(false) : void 0;\n var env = getEnv(ref);\n var dragging = {\n ref: ref,\n descriptor: descriptor,\n env: env,\n scrollOptions: options\n };\n whileDraggingRef.current = dragging;\n var dimension = getDimension({\n ref: ref,\n descriptor: descriptor,\n env: env,\n windowScroll: windowScroll,\n direction: previous.direction,\n isDropDisabled: previous.isDropDisabled,\n isCombineEnabled: previous.isCombineEnabled,\n shouldClipSubject: !previous.ignoreContainerClipping\n });\n var scrollable = env.closestScrollable;\n\n if (scrollable) {\n scrollable.setAttribute(scrollContainer.contextId, appContext.contextId);\n scrollable.addEventListener('scroll', onClosestScroll, getListenerOptions(dragging.scrollOptions));\n\n if (process.env.NODE_ENV !== 'production') {\n checkForNestedScrollContainers(scrollable);\n }\n }\n\n return dimension;\n }, [appContext.contextId, descriptor, onClosestScroll, previousRef]);\n var getScrollWhileDragging = useCallback(function () {\n var dragging = whileDraggingRef.current;\n var closest = getClosestScrollableFromDrag(dragging);\n !(dragging && closest) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Can only recollect Droppable client for Droppables that have a scroll container') : invariant(false) : void 0;\n return getScroll$1(closest);\n }, []);\n var dragStopped = useCallback(function () {\n var dragging = whileDraggingRef.current;\n !dragging ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot stop drag when no active drag') : invariant(false) : void 0;\n var closest = getClosestScrollableFromDrag(dragging);\n whileDraggingRef.current = null;\n\n if (!closest) {\n return;\n }\n\n scheduleScrollUpdate.cancel();\n closest.removeAttribute(scrollContainer.contextId);\n closest.removeEventListener('scroll', onClosestScroll, getListenerOptions(dragging.scrollOptions));\n }, [onClosestScroll, scheduleScrollUpdate]);\n var scroll = useCallback(function (change) {\n var dragging = whileDraggingRef.current;\n !dragging ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot scroll when there is no drag') : invariant(false) : void 0;\n var closest = getClosestScrollableFromDrag(dragging);\n !closest ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot scroll a droppable with no closest scrollable') : invariant(false) : void 0;\n closest.scrollTop += change.y;\n closest.scrollLeft += change.x;\n }, []);\n var callbacks = useMemo(function () {\n return {\n getDimensionAndWatchScroll: getDimensionAndWatchScroll,\n getScrollWhileDragging: getScrollWhileDragging,\n dragStopped: dragStopped,\n scroll: scroll\n };\n }, [dragStopped, getDimensionAndWatchScroll, getScrollWhileDragging, scroll]);\n var entry = useMemo(function () {\n return {\n uniqueId: uniqueId,\n descriptor: descriptor,\n callbacks: callbacks\n };\n }, [callbacks, descriptor, uniqueId]);\n useIsomorphicLayoutEffect(function () {\n publishedDescriptorRef.current = entry.descriptor;\n registry.droppable.register(entry);\n return function () {\n if (whileDraggingRef.current) {\n process.env.NODE_ENV !== \"production\" ? warning('Unsupported: changing the droppableId or type of a Droppable during a drag') : void 0;\n dragStopped();\n }\n\n registry.droppable.unregister(entry);\n };\n }, [callbacks, descriptor, dragStopped, entry, marshal, registry.droppable]);\n useIsomorphicLayoutEffect(function () {\n if (!whileDraggingRef.current) {\n return;\n }\n\n marshal.updateDroppableIsEnabled(publishedDescriptorRef.current.id, !args.isDropDisabled);\n }, [args.isDropDisabled, marshal]);\n useIsomorphicLayoutEffect(function () {\n if (!whileDraggingRef.current) {\n return;\n }\n\n marshal.updateDroppableIsCombineEnabled(publishedDescriptorRef.current.id, args.isCombineEnabled);\n }, [args.isCombineEnabled, marshal]);\n}\n\nfunction noop$2() {}\n\nvar empty = {\n width: 0,\n height: 0,\n margin: noSpacing\n};\n\nvar getSize = function getSize(_ref) {\n var isAnimatingOpenOnMount = _ref.isAnimatingOpenOnMount,\n placeholder = _ref.placeholder,\n animate = _ref.animate;\n\n if (isAnimatingOpenOnMount) {\n return empty;\n }\n\n if (animate === 'close') {\n return empty;\n }\n\n return {\n height: placeholder.client.borderBox.height,\n width: placeholder.client.borderBox.width,\n margin: placeholder.client.margin\n };\n};\n\nvar getStyle = function getStyle(_ref2) {\n var isAnimatingOpenOnMount = _ref2.isAnimatingOpenOnMount,\n placeholder = _ref2.placeholder,\n animate = _ref2.animate;\n var size = getSize({\n isAnimatingOpenOnMount: isAnimatingOpenOnMount,\n placeholder: placeholder,\n animate: animate\n });\n return {\n display: placeholder.display,\n boxSizing: 'border-box',\n width: size.width,\n height: size.height,\n marginTop: size.margin.top,\n marginRight: size.margin.right,\n marginBottom: size.margin.bottom,\n marginLeft: size.margin.left,\n flexShrink: '0',\n flexGrow: '0',\n pointerEvents: 'none',\n transition: animate !== 'none' ? transitions.placeholder : null\n };\n};\n\nfunction Placeholder(props) {\n var animateOpenTimerRef = useRef(null);\n var tryClearAnimateOpenTimer = useCallback(function () {\n if (!animateOpenTimerRef.current) {\n return;\n }\n\n clearTimeout(animateOpenTimerRef.current);\n animateOpenTimerRef.current = null;\n }, []);\n var animate = props.animate,\n onTransitionEnd = props.onTransitionEnd,\n onClose = props.onClose,\n contextId = props.contextId;\n\n var _useState = useState(props.animate === 'open'),\n isAnimatingOpenOnMount = _useState[0],\n setIsAnimatingOpenOnMount = _useState[1];\n\n useEffect(function () {\n if (!isAnimatingOpenOnMount) {\n return noop$2;\n }\n\n if (animate !== 'open') {\n tryClearAnimateOpenTimer();\n setIsAnimatingOpenOnMount(false);\n return noop$2;\n }\n\n if (animateOpenTimerRef.current) {\n return noop$2;\n }\n\n animateOpenTimerRef.current = setTimeout(function () {\n animateOpenTimerRef.current = null;\n setIsAnimatingOpenOnMount(false);\n });\n return tryClearAnimateOpenTimer;\n }, [animate, isAnimatingOpenOnMount, tryClearAnimateOpenTimer]);\n var onSizeChangeEnd = useCallback(function (event) {\n if (event.propertyName !== 'height') {\n return;\n }\n\n onTransitionEnd();\n\n if (animate === 'close') {\n onClose();\n }\n }, [animate, onClose, onTransitionEnd]);\n var style = getStyle({\n isAnimatingOpenOnMount: isAnimatingOpenOnMount,\n animate: props.animate,\n placeholder: props.placeholder\n });\n return React.createElement(props.placeholder.tagName, {\n style: style,\n 'data-rbd-placeholder-context-id': contextId,\n onTransitionEnd: onSizeChangeEnd,\n ref: props.innerRef\n });\n}\n\nvar Placeholder$1 = React.memo(Placeholder);\n\nvar DroppableContext = React.createContext(null);\n\nfunction checkIsValidInnerRef(el) {\n !(el && isHtmlElement(el)) ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"\\n provided.innerRef has not been provided with a HTMLElement.\\n\\n You can find a guide on using the innerRef callback functions at:\\n https://github.com/atlassian/react-beautiful-dnd/blob/master/docs/guides/using-inner-ref.md\\n \") : invariant(false) : void 0;\n}\n\nfunction isBoolean(value) {\n return typeof value === 'boolean';\n}\n\nfunction runChecks(args, checks) {\n checks.forEach(function (check) {\n return check(args);\n });\n}\n\nvar shared = [function required(_ref) {\n var props = _ref.props;\n !props.droppableId ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'A Droppable requires a droppableId prop') : invariant(false) : void 0;\n !(typeof props.droppableId === 'string') ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"A Droppable requires a [string] droppableId. Provided: [\" + typeof props.droppableId + \"]\") : invariant(false) : void 0;\n}, function _boolean(_ref2) {\n var props = _ref2.props;\n !isBoolean(props.isDropDisabled) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'isDropDisabled must be a boolean') : invariant(false) : void 0;\n !isBoolean(props.isCombineEnabled) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'isCombineEnabled must be a boolean') : invariant(false) : void 0;\n !isBoolean(props.ignoreContainerClipping) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'ignoreContainerClipping must be a boolean') : invariant(false) : void 0;\n}, function ref(_ref3) {\n var getDroppableRef = _ref3.getDroppableRef;\n checkIsValidInnerRef(getDroppableRef());\n}];\nvar standard = [function placeholder(_ref4) {\n var props = _ref4.props,\n getPlaceholderRef = _ref4.getPlaceholderRef;\n\n if (!props.placeholder) {\n return;\n }\n\n var ref = getPlaceholderRef();\n\n if (ref) {\n return;\n }\n\n process.env.NODE_ENV !== \"production\" ? warning(\"\\n Droppable setup issue [droppableId: \\\"\" + props.droppableId + \"\\\"]:\\n DroppableProvided > placeholder could not be found.\\n\\n Please be sure to add the {provided.placeholder} React Node as a child of your Droppable.\\n More information: https://github.com/atlassian/react-beautiful-dnd/blob/master/docs/api/droppable.md\\n \") : void 0;\n}];\nvar virtual = [function hasClone(_ref5) {\n var props = _ref5.props;\n !props.renderClone ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Must provide a clone render function (renderClone) for virtual lists') : invariant(false) : void 0;\n}, function hasNoPlaceholder(_ref6) {\n var getPlaceholderRef = _ref6.getPlaceholderRef;\n !!getPlaceholderRef() ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Expected virtual list to not have a placeholder') : invariant(false) : void 0;\n}];\nfunction useValidation(args) {\n useDevSetupWarning(function () {\n runChecks(args, shared);\n\n if (args.props.mode === 'standard') {\n runChecks(args, standard);\n }\n\n if (args.props.mode === 'virtual') {\n runChecks(args, virtual);\n }\n });\n}\n\nvar AnimateInOut = function (_React$PureComponent) {\n _inheritsLoose(AnimateInOut, _React$PureComponent);\n\n function AnimateInOut() {\n var _this;\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _React$PureComponent.call.apply(_React$PureComponent, [this].concat(args)) || this;\n _this.state = {\n isVisible: Boolean(_this.props.on),\n data: _this.props.on,\n animate: _this.props.shouldAnimate && _this.props.on ? 'open' : 'none'\n };\n\n _this.onClose = function () {\n if (_this.state.animate !== 'close') {\n return;\n }\n\n _this.setState({\n isVisible: false\n });\n };\n\n return _this;\n }\n\n AnimateInOut.getDerivedStateFromProps = function getDerivedStateFromProps(props, state) {\n if (!props.shouldAnimate) {\n return {\n isVisible: Boolean(props.on),\n data: props.on,\n animate: 'none'\n };\n }\n\n if (props.on) {\n return {\n isVisible: true,\n data: props.on,\n animate: 'open'\n };\n }\n\n if (state.isVisible) {\n return {\n isVisible: true,\n data: state.data,\n animate: 'close'\n };\n }\n\n return {\n isVisible: false,\n animate: 'close',\n data: null\n };\n };\n\n var _proto = AnimateInOut.prototype;\n\n _proto.render = function render() {\n if (!this.state.isVisible) {\n return null;\n }\n\n var provided = {\n onClose: this.onClose,\n data: this.state.data,\n animate: this.state.animate\n };\n return this.props.children(provided);\n };\n\n return AnimateInOut;\n}(React.PureComponent);\n\nvar zIndexOptions = {\n dragging: 5000,\n dropAnimating: 4500\n};\n\nvar getDraggingTransition = function getDraggingTransition(shouldAnimateDragMovement, dropping) {\n if (dropping) {\n return transitions.drop(dropping.duration);\n }\n\n if (shouldAnimateDragMovement) {\n return transitions.snap;\n }\n\n return transitions.fluid;\n};\n\nvar getDraggingOpacity = function getDraggingOpacity(isCombining, isDropAnimating) {\n if (!isCombining) {\n return null;\n }\n\n return isDropAnimating ? combine.opacity.drop : combine.opacity.combining;\n};\n\nvar getShouldDraggingAnimate = function getShouldDraggingAnimate(dragging) {\n if (dragging.forceShouldAnimate != null) {\n return dragging.forceShouldAnimate;\n }\n\n return dragging.mode === 'SNAP';\n};\n\nfunction getDraggingStyle(dragging) {\n var dimension = dragging.dimension;\n var box = dimension.client;\n var offset = dragging.offset,\n combineWith = dragging.combineWith,\n dropping = dragging.dropping;\n var isCombining = Boolean(combineWith);\n var shouldAnimate = getShouldDraggingAnimate(dragging);\n var isDropAnimating = Boolean(dropping);\n var transform = isDropAnimating ? transforms.drop(offset, isCombining) : transforms.moveTo(offset);\n var style = {\n position: 'fixed',\n top: box.marginBox.top,\n left: box.marginBox.left,\n boxSizing: 'border-box',\n width: box.borderBox.width,\n height: box.borderBox.height,\n transition: getDraggingTransition(shouldAnimate, dropping),\n transform: transform,\n opacity: getDraggingOpacity(isCombining, isDropAnimating),\n zIndex: isDropAnimating ? zIndexOptions.dropAnimating : zIndexOptions.dragging,\n pointerEvents: 'none'\n };\n return style;\n}\n\nfunction getSecondaryStyle(secondary) {\n return {\n transform: transforms.moveTo(secondary.offset),\n transition: secondary.shouldAnimateDisplacement ? null : 'none'\n };\n}\n\nfunction getStyle$1(mapped) {\n return mapped.type === 'DRAGGING' ? getDraggingStyle(mapped) : getSecondaryStyle(mapped);\n}\n\nfunction getDimension$1(descriptor, el, windowScroll) {\n if (windowScroll === void 0) {\n windowScroll = origin;\n }\n\n var computedStyles = window.getComputedStyle(el);\n var borderBox = el.getBoundingClientRect();\n var client = calculateBox(borderBox, computedStyles);\n var page = withScroll(client, windowScroll);\n var placeholder = {\n client: client,\n tagName: el.tagName.toLowerCase(),\n display: computedStyles.display\n };\n var displaceBy = {\n x: client.marginBox.width,\n y: client.marginBox.height\n };\n var dimension = {\n descriptor: descriptor,\n placeholder: placeholder,\n displaceBy: displaceBy,\n client: client,\n page: page\n };\n return dimension;\n}\n\nfunction useDraggablePublisher(args) {\n var uniqueId = useUniqueId('draggable');\n var descriptor = args.descriptor,\n registry = args.registry,\n getDraggableRef = args.getDraggableRef,\n canDragInteractiveElements = args.canDragInteractiveElements,\n shouldRespectForcePress = args.shouldRespectForcePress,\n isEnabled = args.isEnabled;\n var options = useMemo(function () {\n return {\n canDragInteractiveElements: canDragInteractiveElements,\n shouldRespectForcePress: shouldRespectForcePress,\n isEnabled: isEnabled\n };\n }, [canDragInteractiveElements, isEnabled, shouldRespectForcePress]);\n var getDimension = useCallback(function (windowScroll) {\n var el = getDraggableRef();\n !el ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Cannot get dimension when no ref is set') : invariant(false) : void 0;\n return getDimension$1(descriptor, el, windowScroll);\n }, [descriptor, getDraggableRef]);\n var entry = useMemo(function () {\n return {\n uniqueId: uniqueId,\n descriptor: descriptor,\n options: options,\n getDimension: getDimension\n };\n }, [descriptor, getDimension, options, uniqueId]);\n var publishedRef = useRef(entry);\n var isFirstPublishRef = useRef(true);\n useIsomorphicLayoutEffect(function () {\n registry.draggable.register(publishedRef.current);\n return function () {\n return registry.draggable.unregister(publishedRef.current);\n };\n }, [registry.draggable]);\n useIsomorphicLayoutEffect(function () {\n if (isFirstPublishRef.current) {\n isFirstPublishRef.current = false;\n return;\n }\n\n var last = publishedRef.current;\n publishedRef.current = entry;\n registry.draggable.update(entry, last);\n }, [entry, registry.draggable]);\n}\n\nfunction useValidation$1(props, contextId, getRef) {\n useDevSetupWarning(function () {\n function prefix(id) {\n return \"Draggable[id: \" + id + \"]: \";\n }\n\n var id = props.draggableId;\n !id ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Draggable requires a draggableId') : invariant(false) : void 0;\n !(typeof id === 'string') ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"Draggable requires a [string] draggableId.\\n Provided: [type: \" + typeof id + \"] (value: \" + id + \")\") : invariant(false) : void 0;\n !isInteger(props.index) ? process.env.NODE_ENV !== \"production\" ? invariant(false, prefix(id) + \" requires an integer index prop\") : invariant(false) : void 0;\n\n if (props.mapped.type === 'DRAGGING') {\n return;\n }\n\n checkIsValidInnerRef(getRef());\n\n if (props.isEnabled) {\n !findDragHandle(contextId, id) ? process.env.NODE_ENV !== \"production\" ? invariant(false, prefix(id) + \" Unable to find drag handle\") : invariant(false) : void 0;\n }\n });\n}\nfunction useClonePropValidation(isClone) {\n useDev(function () {\n var initialRef = useRef(isClone);\n useDevSetupWarning(function () {\n !(isClone === initialRef.current) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Draggable isClone prop value changed during component life') : invariant(false) : void 0;\n }, [isClone]);\n });\n}\n\nfunction preventHtml5Dnd(event) {\n event.preventDefault();\n}\n\nfunction Draggable(props) {\n var ref = useRef(null);\n var setRef = useCallback(function (el) {\n ref.current = el;\n }, []);\n var getRef = useCallback(function () {\n return ref.current;\n }, []);\n\n var _useRequiredContext = useRequiredContext(AppContext),\n contextId = _useRequiredContext.contextId,\n dragHandleUsageInstructionsId = _useRequiredContext.dragHandleUsageInstructionsId,\n registry = _useRequiredContext.registry;\n\n var _useRequiredContext2 = useRequiredContext(DroppableContext),\n type = _useRequiredContext2.type,\n droppableId = _useRequiredContext2.droppableId;\n\n var descriptor = useMemo(function () {\n return {\n id: props.draggableId,\n index: props.index,\n type: type,\n droppableId: droppableId\n };\n }, [props.draggableId, props.index, type, droppableId]);\n var children = props.children,\n draggableId = props.draggableId,\n isEnabled = props.isEnabled,\n shouldRespectForcePress = props.shouldRespectForcePress,\n canDragInteractiveElements = props.canDragInteractiveElements,\n isClone = props.isClone,\n mapped = props.mapped,\n dropAnimationFinishedAction = props.dropAnimationFinished;\n useValidation$1(props, contextId, getRef);\n useClonePropValidation(isClone);\n\n if (!isClone) {\n var forPublisher = useMemo(function () {\n return {\n descriptor: descriptor,\n registry: registry,\n getDraggableRef: getRef,\n canDragInteractiveElements: canDragInteractiveElements,\n shouldRespectForcePress: shouldRespectForcePress,\n isEnabled: isEnabled\n };\n }, [descriptor, registry, getRef, canDragInteractiveElements, shouldRespectForcePress, isEnabled]);\n useDraggablePublisher(forPublisher);\n }\n\n var dragHandleProps = useMemo(function () {\n return isEnabled ? {\n tabIndex: 0,\n role: 'button',\n 'aria-describedby': dragHandleUsageInstructionsId,\n 'data-rbd-drag-handle-draggable-id': draggableId,\n 'data-rbd-drag-handle-context-id': contextId,\n draggable: false,\n onDragStart: preventHtml5Dnd\n } : null;\n }, [contextId, dragHandleUsageInstructionsId, draggableId, isEnabled]);\n var onMoveEnd = useCallback(function (event) {\n if (mapped.type !== 'DRAGGING') {\n return;\n }\n\n if (!mapped.dropping) {\n return;\n }\n\n if (event.propertyName !== 'transform') {\n return;\n }\n\n dropAnimationFinishedAction();\n }, [dropAnimationFinishedAction, mapped]);\n var provided = useMemo(function () {\n var style = getStyle$1(mapped);\n var onTransitionEnd = mapped.type === 'DRAGGING' && mapped.dropping ? onMoveEnd : null;\n var result = {\n innerRef: setRef,\n draggableProps: {\n 'data-rbd-draggable-context-id': contextId,\n 'data-rbd-draggable-id': draggableId,\n style: style,\n onTransitionEnd: onTransitionEnd\n },\n dragHandleProps: dragHandleProps\n };\n return result;\n }, [contextId, dragHandleProps, draggableId, mapped, onMoveEnd, setRef]);\n var rubric = useMemo(function () {\n return {\n draggableId: descriptor.id,\n type: descriptor.type,\n source: {\n index: descriptor.index,\n droppableId: descriptor.droppableId\n }\n };\n }, [descriptor.droppableId, descriptor.id, descriptor.index, descriptor.type]);\n return children(provided, mapped.snapshot, rubric);\n}\n\nvar isStrictEqual = (function (a, b) {\n return a === b;\n});\n\nvar whatIsDraggedOverFromResult = (function (result) {\n var combine = result.combine,\n destination = result.destination;\n\n if (destination) {\n return destination.droppableId;\n }\n\n if (combine) {\n return combine.droppableId;\n }\n\n return null;\n});\n\nvar getCombineWithFromResult = function getCombineWithFromResult(result) {\n return result.combine ? result.combine.draggableId : null;\n};\n\nvar getCombineWithFromImpact = function getCombineWithFromImpact(impact) {\n return impact.at && impact.at.type === 'COMBINE' ? impact.at.combine.draggableId : null;\n};\n\nfunction getDraggableSelector() {\n var memoizedOffset = memoizeOne(function (x, y) {\n return {\n x: x,\n y: y\n };\n });\n var getMemoizedSnapshot = memoizeOne(function (mode, isClone, draggingOver, combineWith, dropping) {\n return {\n isDragging: true,\n isClone: isClone,\n isDropAnimating: Boolean(dropping),\n dropAnimation: dropping,\n mode: mode,\n draggingOver: draggingOver,\n combineWith: combineWith,\n combineTargetFor: null\n };\n });\n var getMemoizedProps = memoizeOne(function (offset, mode, dimension, isClone, draggingOver, combineWith, forceShouldAnimate) {\n return {\n mapped: {\n type: 'DRAGGING',\n dropping: null,\n draggingOver: draggingOver,\n combineWith: combineWith,\n mode: mode,\n offset: offset,\n dimension: dimension,\n forceShouldAnimate: forceShouldAnimate,\n snapshot: getMemoizedSnapshot(mode, isClone, draggingOver, combineWith, null)\n }\n };\n });\n\n var selector = function selector(state, ownProps) {\n if (state.isDragging) {\n if (state.critical.draggable.id !== ownProps.draggableId) {\n return null;\n }\n\n var offset = state.current.client.offset;\n var dimension = state.dimensions.draggables[ownProps.draggableId];\n var draggingOver = whatIsDraggedOver(state.impact);\n var combineWith = getCombineWithFromImpact(state.impact);\n var forceShouldAnimate = state.forceShouldAnimate;\n return getMemoizedProps(memoizedOffset(offset.x, offset.y), state.movementMode, dimension, ownProps.isClone, draggingOver, combineWith, forceShouldAnimate);\n }\n\n if (state.phase === 'DROP_ANIMATING') {\n var completed = state.completed;\n\n if (completed.result.draggableId !== ownProps.draggableId) {\n return null;\n }\n\n var isClone = ownProps.isClone;\n var _dimension = state.dimensions.draggables[ownProps.draggableId];\n var result = completed.result;\n var mode = result.mode;\n\n var _draggingOver = whatIsDraggedOverFromResult(result);\n\n var _combineWith = getCombineWithFromResult(result);\n\n var duration = state.dropDuration;\n var dropping = {\n duration: duration,\n curve: curves.drop,\n moveTo: state.newHomeClientOffset,\n opacity: _combineWith ? combine.opacity.drop : null,\n scale: _combineWith ? combine.scale.drop : null\n };\n return {\n mapped: {\n type: 'DRAGGING',\n offset: state.newHomeClientOffset,\n dimension: _dimension,\n dropping: dropping,\n draggingOver: _draggingOver,\n combineWith: _combineWith,\n mode: mode,\n forceShouldAnimate: null,\n snapshot: getMemoizedSnapshot(mode, isClone, _draggingOver, _combineWith, dropping)\n }\n };\n }\n\n return null;\n };\n\n return selector;\n}\n\nfunction getSecondarySnapshot(combineTargetFor) {\n return {\n isDragging: false,\n isDropAnimating: false,\n isClone: false,\n dropAnimation: null,\n mode: null,\n draggingOver: null,\n combineTargetFor: combineTargetFor,\n combineWith: null\n };\n}\n\nvar atRest = {\n mapped: {\n type: 'SECONDARY',\n offset: origin,\n combineTargetFor: null,\n shouldAnimateDisplacement: true,\n snapshot: getSecondarySnapshot(null)\n }\n};\n\nfunction getSecondarySelector() {\n var memoizedOffset = memoizeOne(function (x, y) {\n return {\n x: x,\n y: y\n };\n });\n var getMemoizedSnapshot = memoizeOne(getSecondarySnapshot);\n var getMemoizedProps = memoizeOne(function (offset, combineTargetFor, shouldAnimateDisplacement) {\n if (combineTargetFor === void 0) {\n combineTargetFor = null;\n }\n\n return {\n mapped: {\n type: 'SECONDARY',\n offset: offset,\n combineTargetFor: combineTargetFor,\n shouldAnimateDisplacement: shouldAnimateDisplacement,\n snapshot: getMemoizedSnapshot(combineTargetFor)\n }\n };\n });\n\n var getFallback = function getFallback(combineTargetFor) {\n return combineTargetFor ? getMemoizedProps(origin, combineTargetFor, true) : null;\n };\n\n var getProps = function getProps(ownId, draggingId, impact, afterCritical) {\n var visualDisplacement = impact.displaced.visible[ownId];\n var isAfterCriticalInVirtualList = Boolean(afterCritical.inVirtualList && afterCritical.effected[ownId]);\n var combine = tryGetCombine(impact);\n var combineTargetFor = combine && combine.draggableId === ownId ? draggingId : null;\n\n if (!visualDisplacement) {\n if (!isAfterCriticalInVirtualList) {\n return getFallback(combineTargetFor);\n }\n\n if (impact.displaced.invisible[ownId]) {\n return null;\n }\n\n var change = negate(afterCritical.displacedBy.point);\n\n var _offset = memoizedOffset(change.x, change.y);\n\n return getMemoizedProps(_offset, combineTargetFor, true);\n }\n\n if (isAfterCriticalInVirtualList) {\n return getFallback(combineTargetFor);\n }\n\n var displaceBy = impact.displacedBy.point;\n var offset = memoizedOffset(displaceBy.x, displaceBy.y);\n return getMemoizedProps(offset, combineTargetFor, visualDisplacement.shouldAnimate);\n };\n\n var selector = function selector(state, ownProps) {\n if (state.isDragging) {\n if (state.critical.draggable.id === ownProps.draggableId) {\n return null;\n }\n\n return getProps(ownProps.draggableId, state.critical.draggable.id, state.impact, state.afterCritical);\n }\n\n if (state.phase === 'DROP_ANIMATING') {\n var completed = state.completed;\n\n if (completed.result.draggableId === ownProps.draggableId) {\n return null;\n }\n\n return getProps(ownProps.draggableId, completed.result.draggableId, completed.impact, completed.afterCritical);\n }\n\n return null;\n };\n\n return selector;\n}\n\nvar makeMapStateToProps = function makeMapStateToProps() {\n var draggingSelector = getDraggableSelector();\n var secondarySelector = getSecondarySelector();\n\n var selector = function selector(state, ownProps) {\n return draggingSelector(state, ownProps) || secondarySelector(state, ownProps) || atRest;\n };\n\n return selector;\n};\nvar mapDispatchToProps = {\n dropAnimationFinished: dropAnimationFinished\n};\nvar ConnectedDraggable = connect(makeMapStateToProps, mapDispatchToProps, null, {\n context: StoreContext,\n pure: true,\n areStatePropsEqual: isStrictEqual\n})(Draggable);\n\nfunction PrivateDraggable(props) {\n var droppableContext = useRequiredContext(DroppableContext);\n var isUsingCloneFor = droppableContext.isUsingCloneFor;\n\n if (isUsingCloneFor === props.draggableId && !props.isClone) {\n return null;\n }\n\n return React.createElement(ConnectedDraggable, props);\n}\nfunction PublicDraggable(props) {\n var isEnabled = typeof props.isDragDisabled === 'boolean' ? !props.isDragDisabled : true;\n var canDragInteractiveElements = Boolean(props.disableInteractiveElementBlocking);\n var shouldRespectForcePress = Boolean(props.shouldRespectForcePress);\n return React.createElement(PrivateDraggable, _extends({}, props, {\n isClone: false,\n isEnabled: isEnabled,\n canDragInteractiveElements: canDragInteractiveElements,\n shouldRespectForcePress: shouldRespectForcePress\n }));\n}\n\nfunction Droppable(props) {\n var appContext = useContext(AppContext);\n !appContext ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Could not find app context') : invariant(false) : void 0;\n var contextId = appContext.contextId,\n isMovementAllowed = appContext.isMovementAllowed;\n var droppableRef = useRef(null);\n var placeholderRef = useRef(null);\n var children = props.children,\n droppableId = props.droppableId,\n type = props.type,\n mode = props.mode,\n direction = props.direction,\n ignoreContainerClipping = props.ignoreContainerClipping,\n isDropDisabled = props.isDropDisabled,\n isCombineEnabled = props.isCombineEnabled,\n snapshot = props.snapshot,\n useClone = props.useClone,\n updateViewportMaxScroll = props.updateViewportMaxScroll,\n getContainerForClone = props.getContainerForClone;\n var getDroppableRef = useCallback(function () {\n return droppableRef.current;\n }, []);\n var setDroppableRef = useCallback(function (value) {\n droppableRef.current = value;\n }, []);\n var getPlaceholderRef = useCallback(function () {\n return placeholderRef.current;\n }, []);\n var setPlaceholderRef = useCallback(function (value) {\n placeholderRef.current = value;\n }, []);\n useValidation({\n props: props,\n getDroppableRef: getDroppableRef,\n getPlaceholderRef: getPlaceholderRef\n });\n var onPlaceholderTransitionEnd = useCallback(function () {\n if (isMovementAllowed()) {\n updateViewportMaxScroll({\n maxScroll: getMaxWindowScroll()\n });\n }\n }, [isMovementAllowed, updateViewportMaxScroll]);\n useDroppablePublisher({\n droppableId: droppableId,\n type: type,\n mode: mode,\n direction: direction,\n isDropDisabled: isDropDisabled,\n isCombineEnabled: isCombineEnabled,\n ignoreContainerClipping: ignoreContainerClipping,\n getDroppableRef: getDroppableRef\n });\n var placeholder = React.createElement(AnimateInOut, {\n on: props.placeholder,\n shouldAnimate: props.shouldAnimatePlaceholder\n }, function (_ref) {\n var onClose = _ref.onClose,\n data = _ref.data,\n animate = _ref.animate;\n return React.createElement(Placeholder$1, {\n placeholder: data,\n onClose: onClose,\n innerRef: setPlaceholderRef,\n animate: animate,\n contextId: contextId,\n onTransitionEnd: onPlaceholderTransitionEnd\n });\n });\n var provided = useMemo(function () {\n return {\n innerRef: setDroppableRef,\n placeholder: placeholder,\n droppableProps: {\n 'data-rbd-droppable-id': droppableId,\n 'data-rbd-droppable-context-id': contextId\n }\n };\n }, [contextId, droppableId, placeholder, setDroppableRef]);\n var isUsingCloneFor = useClone ? useClone.dragging.draggableId : null;\n var droppableContext = useMemo(function () {\n return {\n droppableId: droppableId,\n type: type,\n isUsingCloneFor: isUsingCloneFor\n };\n }, [droppableId, isUsingCloneFor, type]);\n\n function getClone() {\n if (!useClone) {\n return null;\n }\n\n var dragging = useClone.dragging,\n render = useClone.render;\n var node = React.createElement(PrivateDraggable, {\n draggableId: dragging.draggableId,\n index: dragging.source.index,\n isClone: true,\n isEnabled: true,\n shouldRespectForcePress: false,\n canDragInteractiveElements: true\n }, function (draggableProvided, draggableSnapshot) {\n return render(draggableProvided, draggableSnapshot, dragging);\n });\n return ReactDOM.createPortal(node, getContainerForClone());\n }\n\n return React.createElement(DroppableContext.Provider, {\n value: droppableContext\n }, children(provided, snapshot), getClone());\n}\n\nvar isMatchingType = function isMatchingType(type, critical) {\n return type === critical.droppable.type;\n};\n\nvar getDraggable = function getDraggable(critical, dimensions) {\n return dimensions.draggables[critical.draggable.id];\n};\n\nvar makeMapStateToProps$1 = function makeMapStateToProps() {\n var idleWithAnimation = {\n placeholder: null,\n shouldAnimatePlaceholder: true,\n snapshot: {\n isDraggingOver: false,\n draggingOverWith: null,\n draggingFromThisWith: null,\n isUsingPlaceholder: false\n },\n useClone: null\n };\n\n var idleWithoutAnimation = _extends({}, idleWithAnimation, {\n shouldAnimatePlaceholder: false\n });\n\n var getDraggableRubric = memoizeOne(function (descriptor) {\n return {\n draggableId: descriptor.id,\n type: descriptor.type,\n source: {\n index: descriptor.index,\n droppableId: descriptor.droppableId\n }\n };\n });\n var getMapProps = memoizeOne(function (id, isEnabled, isDraggingOverForConsumer, isDraggingOverForImpact, dragging, renderClone) {\n var draggableId = dragging.descriptor.id;\n var isHome = dragging.descriptor.droppableId === id;\n\n if (isHome) {\n var useClone = renderClone ? {\n render: renderClone,\n dragging: getDraggableRubric(dragging.descriptor)\n } : null;\n var _snapshot = {\n isDraggingOver: isDraggingOverForConsumer,\n draggingOverWith: isDraggingOverForConsumer ? draggableId : null,\n draggingFromThisWith: draggableId,\n isUsingPlaceholder: true\n };\n return {\n placeholder: dragging.placeholder,\n shouldAnimatePlaceholder: false,\n snapshot: _snapshot,\n useClone: useClone\n };\n }\n\n if (!isEnabled) {\n return idleWithoutAnimation;\n }\n\n if (!isDraggingOverForImpact) {\n return idleWithAnimation;\n }\n\n var snapshot = {\n isDraggingOver: isDraggingOverForConsumer,\n draggingOverWith: draggableId,\n draggingFromThisWith: null,\n isUsingPlaceholder: true\n };\n return {\n placeholder: dragging.placeholder,\n shouldAnimatePlaceholder: true,\n snapshot: snapshot,\n useClone: null\n };\n });\n\n var selector = function selector(state, ownProps) {\n var id = ownProps.droppableId;\n var type = ownProps.type;\n var isEnabled = !ownProps.isDropDisabled;\n var renderClone = ownProps.renderClone;\n\n if (state.isDragging) {\n var critical = state.critical;\n\n if (!isMatchingType(type, critical)) {\n return idleWithoutAnimation;\n }\n\n var dragging = getDraggable(critical, state.dimensions);\n var isDraggingOver = whatIsDraggedOver(state.impact) === id;\n return getMapProps(id, isEnabled, isDraggingOver, isDraggingOver, dragging, renderClone);\n }\n\n if (state.phase === 'DROP_ANIMATING') {\n var completed = state.completed;\n\n if (!isMatchingType(type, completed.critical)) {\n return idleWithoutAnimation;\n }\n\n var _dragging = getDraggable(completed.critical, state.dimensions);\n\n return getMapProps(id, isEnabled, whatIsDraggedOverFromResult(completed.result) === id, whatIsDraggedOver(completed.impact) === id, _dragging, renderClone);\n }\n\n if (state.phase === 'IDLE' && state.completed && !state.shouldFlush) {\n var _completed = state.completed;\n\n if (!isMatchingType(type, _completed.critical)) {\n return idleWithoutAnimation;\n }\n\n var wasOver = whatIsDraggedOver(_completed.impact) === id;\n var wasCombining = Boolean(_completed.impact.at && _completed.impact.at.type === 'COMBINE');\n var isHome = _completed.critical.droppable.id === id;\n\n if (wasOver) {\n return wasCombining ? idleWithAnimation : idleWithoutAnimation;\n }\n\n if (isHome) {\n return idleWithAnimation;\n }\n\n return idleWithoutAnimation;\n }\n\n return idleWithoutAnimation;\n };\n\n return selector;\n};\nvar mapDispatchToProps$1 = {\n updateViewportMaxScroll: updateViewportMaxScroll\n};\n\nfunction getBody() {\n !document.body ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'document.body is not ready') : invariant(false) : void 0;\n return document.body;\n}\n\nvar defaultProps = {\n mode: 'standard',\n type: 'DEFAULT',\n direction: 'vertical',\n isDropDisabled: false,\n isCombineEnabled: false,\n ignoreContainerClipping: false,\n renderClone: null,\n getContainerForClone: getBody\n};\nvar ConnectedDroppable = connect(makeMapStateToProps$1, mapDispatchToProps$1, null, {\n context: StoreContext,\n pure: true,\n areStatePropsEqual: isStrictEqual\n})(Droppable);\nConnectedDroppable.defaultProps = defaultProps;\n\nexport { DragDropContext, PublicDraggable as Draggable, ConnectedDroppable as Droppable, resetServerContext, useKeyboardSensor, useMouseSensor, useTouchSensor };\n","import axios from \"axios\";\nimport { API_BASE_URL } from \"../constants/genricConstants\";\n\nfunction getImageByRelevance(images, size, type = \"\") {\n if (images.webp && (!type || type === \"webp\")) {\n return images.webp[size] ?? images.webp[Object.keys(images.webp)[0]];\n }\n if (images.jpg && (!type || type === \"jpg\")) {\n return images.jpg[size] ?? images.jpg[Object.keys(images.jpg)[0]];\n }\n if (images.png && (!type || type === \"png\")) {\n return images.png[size] ?? images.png[Object.keys(images.png)[0]];\n }\n}\n\nfunction getAnimeTitleByRelevance(titles, isDub = false, type = \"Default\") {\n let defaultTitle = titles.filter((eachTitle) => eachTitle.type === type);\n if (!defaultTitle.length && type !== \"Default\") {\n defaultTitle = titles.filter((eachTitle) => eachTitle.type === \"Default\");\n }\n return `${defaultTitle.length ? defaultTitle[0].title : titles[0].title}${isDub ? \" (DUB)\" : \"\"}`;\n}\n\nconst toTitleCase = (phrase, delimiter = \",\") => {\n return phrase\n .toLowerCase()\n .split(delimiter)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(delimiter);\n};\n\nconst prepareVideoData = (videoData, userDefinedProxyUrl) => {\n var videos_with_video_format = [];\n for (const result of videoData) {\n if (result.url.includes(\"mp4\") || result.url.includes(\"m3u8\") || result.type.includes(\"mp4\") || result.type.includes(\"hls\") || result.type.includes(\"dash\")) {\n videos_with_video_format.push({\n link: getProxyUrl(result.url, userDefinedProxyUrl),\n type: result.url.includes(\"m3u8\") ? \"application/x-mpegURL\" : \"video/mp4\",\n resolution: !result.url.includes(\"m3u8\") && result.url.includes(\".mp4\") ? result?.res?.split(\" \").join(\"\") : \"\",\n priority: result.url.includes(\"m3u8\") && result.url.includes(\"gogoplay\") ? 1 : 0,\n subtitles: result.subtitles || {},\n });\n }\n }\n videos_with_video_format.sort((b, a) => a.priority - b.priority);\n return videos_with_video_format;\n};\n\nconst getProxyUrl = (videoUrl, userDefinedProxyUrl = null) => {\n var whitelist = [\n \"cache\",\n \"wix\",\n \"sharepoint\",\n \"pstatic.net\",\n \"workfields\",\n \"akamai-video-content\",\n \"wetransfer\",\n \"bilucdn\",\n \"cdnstream\",\n \"vipanicdn\",\n \"anifastcdn\",\n \"mirrorakam.akamaized\",\n document.location.hostname,\n \"watchanime.dev\",\n \"cdn-jupiter.com\",\n \"seiryuu\",\n ];\n // const whitelist = [];\n if (whitelist.some((link) => videoUrl.includes(link) || videoUrl.match(/[/]{2}[w]{3}[x][^.]*/gi)) || window.location.href.includes(\"debug\")) {\n return videoUrl;\n }\n return `${API_BASE_URL}/proxy/m3u8/${encodeURIComponent(videoUrl.replace(/\\/$|(\\r\\n|\\n|\\r)/gm, \"\"))}${userDefinedProxyUrl ? `?proxy=${userDefinedProxyUrl.replace(/\\/$/, \"\")}` : \"\"}`;\n};\n\nconst prevEpisodeUrl = (animeSlug, episodeNumber) => {\n return episodeNumber > 1 ? `/anime/${animeSlug}/episode/${episodeNumber - 1}` : false;\n};\n\nconst nextEpisodeUrl = (animeSlug, episodeNumber, totalEpisodes) => {\n return episodeNumber < totalEpisodes ? `/anime/${animeSlug}/episode/${episodeNumber + 1}` : false;\n};\n\nconst getEpisodeCount = (animeData) => {\n return animeData.airing ? (animeData.releasedEpisodes ? animeData.releasedEpisodes : animeData.episodes) : animeData.episodes;\n};\n\nconst malStatusToMediaStatus = (status) => {\n status = (status || \"\").toLowerCase();\n if (status === \"currently airing\") return \"Ongoing\";\n else if (status === \"finished airing\") return \"Finished Airing\";\n else if (status === \"not yet aired\") return \"Not yet aired\";\n return \"Unknown\";\n};\n/**\n * Returns a tmdb image based on type and relevance\n * @param {*} tmdbData Tmdb image result object\n * @param {*} type backdrops | logos | posters\n * @returns\n */\nconst getTmdbImageByRelevanceAndType = (tmdbData, type = \"backdrops\") => {\n return tmdbData && Object.keys(tmdbData).length ? (tmdbData[type].length ? `https://www.themoviedb.org/t/p/original${tmdbData[type][0].file_path}` : \"\") : \"\";\n};\n\n/**\n * Returns if anime object has tmdbData\n * @param {*} tmdbData\n * @returns\n */\nconst hasTmdbData = (animeData) => {\n return animeData.tmdbData && Object.keys(animeData.tmdbData).length;\n};\n\nconst getLatestData = async (slugs, fullData = false) => {\n const data = await axios.post(`${API_BASE_URL}/anime/episode/latest`, {\n slugs: slugs,\n ...(fullData && { fulldata: 1 }),\n });\n return data;\n};\n\nexport { getImageByRelevance, getAnimeTitleByRelevance, toTitleCase, prepareVideoData, prevEpisodeUrl, nextEpisodeUrl, getEpisodeCount, malStatusToMediaStatus, getTmdbImageByRelevanceAndType, hasTmdbData, getLatestData };\n","import createReactComponent from '../createReactComponent';\nexport default createReactComponent('outline', 'menu-2', 'IconMenu2', [[\"path\",{\"d\":\"M4 6l16 0\",\"key\":\"svg-0\"}],[\"path\",{\"d\":\"M4 12l16 0\",\"key\":\"svg-1\"}],[\"path\",{\"d\":\"M4 18l16 0\",\"key\":\"svg-2\"}]]);","import React from \"react\";\nimport { DragDropContext, Droppable, Draggable } from \"react-beautiful-dnd\";\nimport { getAnimeTitleByRelevance, getImageByRelevance } from \"../custom/AnimeData\";\nimport { Paper, createStyles } from \"@mantine/core\";\nimport { IconMenu2 } from \"@tabler/icons-react\";\n// import { replaceAllWatchListData } from \"../custom/WatchListOld\";\nimport { useLanguageStore } from \"../store/LanguageToggleStore\";\nimport { useShallow } from \"zustand/react/shallow\";\n\nconst useStyles = createStyles((theme) => ({\n editWrapperParent: {\n listStyle: \"none\",\n paddingLeft: \"0\",\n height: \"90vh\",\n overflow: \"auto\",\n MsOverflowStyle: \"none\",\n scrollbarWidth: \"none\",\n \"&::-webkit-scrollbar\": {\n display: \"none\",\n },\n },\n editWrapperLi: {\n display: \"flex\",\n alignItems: \"center\",\n borderRadius: \".2em\",\n padding: \".5em .8em .5em .5em\",\n marginBottom: \"1em\",\n },\n editWrapperTitle: {\n maxWidth: \"none\",\n fontWeight: \"bold\",\n margin: \"0\",\n },\n editWrapperImageParent: {\n overflow: \"hidden\",\n flexShrink: \"0\",\n width: \"65px\",\n marginRight: \".5em\",\n marginLeft: \".5em\",\n },\n editWrapperImage: {\n display: \"block\",\n width: \"100%\",\n height: \"auto\",\n },\n}));\n\nfunction WatchListEditLayout({ watchListData, setWatchListData }) {\n const { classes } = useStyles();\n const { language } = useLanguageStore(useShallow((state) => ({ language: state.language })));\n function handleOnDragEnd(result) {\n if (!result.destination) return;\n\n const items = Array.from(watchListData);\n const [reorderedItem] = items.splice(result.source.index, 1);\n items.splice(result.destination.index, 0, reorderedItem);\n\n setWatchListData(items);\n // replaceAllWatchListData(items);\n }\n return (\n <DragDropContext onDragEnd={handleOnDragEnd}>\n <Droppable droppableId=\"characters\">\n {(provided) => (\n <ul className={classes.editWrapperParent} {...provided.droppableProps} ref={provided.innerRef}>\n {watchListData.map(({ slug, titles, images }, index) => {\n return (\n <Draggable key={slug} draggableId={slug} index={index}>\n {(provided) => (\n <li className={classes.editWrapperLi} ref={provided.innerRef} {...provided.draggableProps} {...provided.dragHandleProps}>\n <Paper>\n <IconMenu2 size={16} />\n </Paper>\n <div className={classes.editWrapperImageParent}>\n <img className={classes.editWrapperImage} src={getImageByRelevance(images)} alt={`${slug} Thumb`} />\n </div>\n <p className={classes.editWrapperTitle}>{getAnimeTitleByRelevance(titles, false, language)}</p>\n </li>\n )}\n </Draggable>\n );\n })}\n {provided.placeholder}\n </ul>\n )}\n </Droppable>\n </DragDropContext>\n );\n}\n\nexport default WatchListEditLayout;\n","import { createStyles, Drawer, Group, Paper } from \"@mantine/core\";\n\nimport React from \"react\";\nimport { useNavigate } from \"react-router-dom\";\nimport SideBarMenuLayout from \"../layouts/SideBarMenuLayout\";\nimport WatchListEditLayout from \"../layouts/WatchListEditLayout\";\n\nconst useStyles = createStyles((theme) => ({\n sideBarGroup: {\n display: \"flex\",\n flexWrap: \"wrap\",\n marginTop: \"14px\",\n gap: \"0px\",\n width: \"100%\",\n },\n drawerHeader: {\n margin: \"16px\",\n },\n}));\n\nfunction SideBarComponent({ sideBarState, setSideBarState, sideBarComponentConfig = {}, otherData = {} }) {\n const { classes } = useStyles();\n const navigate = useNavigate();\n\n sideBarComponentConfig = specificActionsOnSideBarComponentType(sideBarComponentConfig.type, sideBarComponentConfig, { ...otherData, ...{ navigate: navigate } });\n var sideBarItems = <Paper></Paper>;\n switch (sideBarComponentConfig.type) {\n case \"SideBarMenuLayout\":\n sideBarItems = <SideBarMenuLayout sideBarComponentConfig={sideBarComponentConfig} setSideBarState={setSideBarState} />;\n break;\n case \"SideBarWatchlistEditor\":\n sideBarItems = <WatchListEditLayout watchListData={sideBarComponentConfig.data[0]} {...otherData} />;\n break;\n default:\n break;\n }\n\n return (\n <Drawer\n opened={sideBarState}\n onClose={() => setSideBarState(false)}\n title={sideBarComponentConfig.title ?? \"\"}\n size={sideBarComponentConfig.size ?? \"300px\"}\n withCloseButton={sideBarComponentConfig.withCloseButton ?? true}\n classNames={{ header: classes.drawerHeader }}\n >\n <Group className={classes.sideBarGroup}>{sideBarItems}</Group>\n </Drawer>\n );\n}\n\nfunction specificActionsOnSideBarComponentType(componentType, sideBarComponentConfig, otherData) {\n switch (componentType) {\n case \"SideBarMenuLayout\":\n sideBarComponentConfig.data = [\n ...sideBarComponentConfig.data,\n ...[\n {\n label: \"Catalog\",\n callBack: () => {\n otherData.navigate(`/catalog`);\n },\n },\n {\n label: \"Report a Problem\",\n callBack: () => {\n otherData.setBugReportState(!otherData.bugReportState);\n },\n },\n ],\n ];\n return sideBarComponentConfig;\n default:\n return sideBarComponentConfig;\n }\n}\n\nexport default SideBarComponent;\n","import createReactComponent from '../createReactComponent';\nexport default createReactComponent('outline', 'chevron-right', 'IconChevronRight', [[\"path\",{\"d\":\"M9 6l6 6l-6 6\",\"key\":\"svg-0\"}]]);","import React from 'react';\n\nexport function ChevronIcon(props: React.ComponentPropsWithoutRef<'svg'>) {\n return (\n <svg\n viewBox=\"0 0 15 15\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width={16}\n height={16}\n {...props}\n >\n <path\n d=\"M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n","export function clamp(value: number, min: number, max: number) {\n return Math.min(Math.max(value, min), max);\n}\n","export function map(\n value: number,\n iStart: number,\n iStop: number,\n oStart: number,\n oStop: number,\n): number {\n return oStart + (oStop - oStart) * ((value - iStart) / (iStop - iStart))\n}\n\nexport function isNumber(subject: unknown): subject is number {\n return typeof subject === 'number'\n}\n\nexport function isString(subject: unknown): subject is string {\n return typeof subject === 'string'\n}\n\nexport function isObject(subject: unknown): subject is Record<string, unknown> {\n return Object.prototype.toString.call(subject) === '[object Object]'\n}\n\nexport function isArray(subject: unknown): subject is Record<number, unknown> {\n return Array.isArray(subject)\n}\n\nexport function isRecord(\n subject: unknown,\n): subject is Record<string | number, unknown> {\n return isObject(subject) || isArray(subject)\n}\n\nexport function mathAbs(n: number): number {\n return Math.abs(n)\n}\n\nexport function mathSign(n: number): number {\n return !n ? 0 : n / mathAbs(n)\n}\n\nexport function deltaAbs(valueB: number, valueA: number): number {\n return mathAbs(valueB - valueA)\n}\n\nexport function factorAbs(valueB: number, valueA: number): number {\n if (valueB === 0 || valueA === 0) return 0\n if (mathAbs(valueB) <= mathAbs(valueA)) return 0\n const diff = deltaAbs(mathAbs(valueB), mathAbs(valueA))\n return mathAbs(diff / valueB)\n}\n\nexport function roundToDecimals(decimalPoints: number): (n: number) => number {\n const pow = Math.pow(10, decimalPoints)\n return (n: number): number => Math.round(n * pow) / pow\n}\n\nexport function arrayKeys<Type>(array: Type[]): number[] {\n return objectKeys(array).map(Number)\n}\n\nexport function arrayLast<Type>(array: Type[]): Type {\n return array[arrayLastIndex(array)]\n}\n\nexport function arrayLastIndex<Type>(array: Type[]): number {\n return Math.max(0, array.length - 1)\n}\n\nexport function objectKeys<Type extends object>(object: Type): string[] {\n return Object.keys(object)\n}\n\nexport function objectsMergeDeep(\n objectA: Record<string, unknown>,\n objectB: Record<string, unknown>,\n): Record<string, unknown> {\n return [objectA, objectB].reduce((mergedObjects, currentObject) => {\n objectKeys(currentObject).forEach((key) => {\n const valueA = mergedObjects[key]\n const valueB = currentObject[key]\n const areObjects = isObject(valueA) && isObject(valueB)\n\n mergedObjects[key] = areObjects\n ? objectsMergeDeep(valueA, valueB)\n : valueB\n })\n return mergedObjects\n }, {})\n}\n\nexport function objectsAreEqual(\n objectA: Record<string, unknown>,\n objectB: Record<string, unknown>,\n): boolean {\n const objectAKeys = objectKeys(objectA)\n const objectBKeys = objectKeys(objectB)\n\n if (objectAKeys.length !== objectBKeys.length) return false\n\n return objectAKeys.every((key) => {\n const valueA = objectA[key]\n const valueB = objectB[key]\n if (typeof valueA === 'function') return `${valueA}` === `${valueB}`\n if (!isRecord(valueA) || !isRecord(valueB)) return valueA === valueB\n return objectsAreEqual(valueA, valueB)\n })\n}\n","import { isNumber } from './utils'\n\nexport type AlignmentOptionType = 'start' | 'center' | 'end' | number\n\nexport type AlignmentType = {\n measure: (n: number) => number\n}\n\nexport function Alignment(\n align: AlignmentOptionType,\n viewSize: number,\n): AlignmentType {\n const predefined = { start, center, end }\n\n function start(): number {\n return 0\n }\n\n function center(n: number): number {\n return end(n) / 2\n }\n\n function end(n: number): number {\n return viewSize - n\n }\n\n function percent(): number {\n return viewSize * Number(align)\n }\n\n function measure(n: number): number {\n if (isNumber(align)) return percent()\n return predefined[align](n)\n }\n\n const self: AlignmentType = {\n measure,\n }\n return self\n}\n","import { mathAbs } from './utils'\n\nexport type LimitType = {\n min: number\n max: number\n length: number\n constrain: (n: number) => number\n reachedAny: (n: number) => boolean\n reachedMax: (n: number) => boolean\n reachedMin: (n: number) => boolean\n removeOffset: (n: number) => number\n}\n\nexport function Limit(min: number, max: number): LimitType {\n const length = mathAbs(min - max)\n\n function reachedMin(n: number): boolean {\n return n < min\n }\n\n function reachedMax(n: number): boolean {\n return n > max\n }\n\n function reachedAny(n: number): boolean {\n return reachedMin(n) || reachedMax(n)\n }\n\n function constrain(n: number): number {\n if (!reachedAny(n)) return n\n return reachedMin(n) ? min : max\n }\n\n function removeOffset(n: number): number {\n if (!length) return n\n return n - length * Math.ceil((n - max) / length)\n }\n\n const self: LimitType = {\n length,\n max,\n min,\n constrain,\n reachedAny,\n reachedMax,\n reachedMin,\n removeOffset,\n }\n return self\n}\n","import { Limit } from './Limit'\nimport { mathAbs } from './utils'\n\nexport type CounterType = {\n get: () => number\n set: (n: number) => CounterType\n add: (n: number) => CounterType\n clone: () => CounterType\n min: number\n max: number\n}\n\nexport function Counter(\n max: number,\n start: number,\n loop: boolean,\n): CounterType {\n const { min, constrain } = Limit(0, max)\n const loopEnd = max + 1\n let counter = withinLimit(start)\n\n function withinLimit(n: number): number {\n return !loop ? constrain(n) : mathAbs((loopEnd + n) % loopEnd)\n }\n\n function get(): number {\n return counter\n }\n\n function set(n: number): CounterType {\n counter = withinLimit(n)\n return self\n }\n\n function add(n: number): CounterType {\n return set(get() + n)\n }\n\n function clone(): CounterType {\n return Counter(max, get(), loop)\n }\n\n const self: CounterType = {\n add,\n clone,\n get,\n set,\n min,\n max,\n }\n return self\n}\n","type EventNameType = keyof DocumentEventMap | keyof WindowEventMap\ntype EventHandlerType = (evt: any) => void\ntype EventOptionsType = boolean | AddEventListenerOptions | undefined\ntype EventRemoverType = () => void\n\nexport type EventStoreType = {\n add: (\n node: EventTarget,\n type: EventNameType,\n handler: EventHandlerType,\n options?: EventOptionsType,\n ) => EventStoreType\n removeAll: () => EventStoreType\n}\n\nexport function EventStore(): EventStoreType {\n let listeners: EventRemoverType[] = []\n\n function add(\n node: EventTarget,\n type: EventNameType,\n handler: EventHandlerType,\n options: EventOptionsType = { passive: true },\n ): EventStoreType {\n node.addEventListener(type, handler, options)\n listeners.push(() => node.removeEventListener(type, handler, options))\n return self\n }\n\n function removeAll(): EventStoreType {\n listeners = listeners.filter((remove) => remove())\n return self\n }\n\n const self: EventStoreType = {\n add,\n removeAll,\n }\n return self\n}\n","import { isNumber } from './utils'\n\nexport type Vector1DType = {\n get: () => number\n set: (v: Vector1DType | number) => Vector1DType\n add: (v: Vector1DType | number) => Vector1DType\n subtract: (v: Vector1DType | number) => Vector1DType\n multiply: (n: number) => Vector1DType\n divide: (n: number) => Vector1DType\n normalize: () => Vector1DType\n}\n\nexport function Vector1D(value: number): Vector1DType {\n let vector = value\n\n function get(): number {\n return vector\n }\n\n function set(n: Vector1DType | number): Vector1DType {\n vector = readNumber(n)\n return self\n }\n\n function add(n: Vector1DType | number): Vector1DType {\n vector += readNumber(n)\n return self\n }\n\n function subtract(n: Vector1DType | number): Vector1DType {\n vector -= readNumber(n)\n return self\n }\n\n function multiply(n: number): Vector1DType {\n vector *= n\n return self\n }\n\n function divide(n: number): Vector1DType {\n vector /= n\n return self\n }\n\n function normalize(): Vector1DType {\n if (vector !== 0) divide(vector)\n return self\n }\n\n function readNumber(n: Vector1DType | number): number {\n return isNumber(n) ? n : n.get()\n }\n\n const self: Vector1DType = {\n add,\n divide,\n get,\n multiply,\n normalize,\n set,\n subtract,\n }\n return self\n}\n","import { AnimationType } from './Animation'\nimport { CounterType } from './Counter'\nimport { DirectionType } from './Direction'\nimport { DragTrackerType, PointerEventType } from './DragTracker'\nimport { EventHandlerType } from './EventHandler'\nimport { AxisType } from './Axis'\nimport { EventStore } from './EventStore'\nimport { ScrollBodyType } from './ScrollBody'\nimport { ScrollTargetType } from './ScrollTarget'\nimport { ScrollToType } from './ScrollTo'\nimport { Vector1D, Vector1DType } from './Vector1d'\nimport { deltaAbs, factorAbs, mathAbs, mathSign } from './utils'\nimport { PercentOfViewType } from './PercentOfView'\n\nexport type DragHandlerType = {\n addActivationEvents: () => void\n clickAllowed: () => boolean\n pointerDown: () => boolean\n removeAllEvents: () => void\n}\n\nexport function DragHandler(\n axis: AxisType,\n direction: DirectionType,\n rootNode: HTMLElement,\n target: Vector1DType,\n dragTracker: DragTrackerType,\n location: Vector1DType,\n animation: AnimationType,\n scrollTo: ScrollToType,\n scrollBody: ScrollBodyType,\n scrollTarget: ScrollTargetType,\n index: CounterType,\n eventHandler: EventHandlerType,\n percentOfView: PercentOfViewType,\n loop: boolean,\n dragFree: boolean,\n skipSnaps: boolean,\n): DragHandlerType {\n const { cross: crossAxis } = axis\n const focusNodes = ['INPUT', 'SELECT', 'TEXTAREA']\n const nonPassiveEvent = { passive: false }\n const dragStartPoint = Vector1D(0)\n const activationEvents = EventStore()\n const interactionEvents = EventStore()\n const dragThreshold = percentOfView.measure(20)\n const snapForceBoost = { mouse: 300, touch: 400 }\n const freeForceBoost = { mouse: 500, touch: 600 }\n const baseSpeed = dragFree ? 5 : 16\n const baseMass = 1\n\n let startScroll = 0\n let startCross = 0\n let pointerIsDown = false\n let preventScroll = false\n let preventClick = false\n let isMouse = false\n\n function addActivationEvents(): void {\n const node = rootNode\n activationEvents\n .add(node, 'dragstart', (evt) => evt.preventDefault(), nonPassiveEvent)\n .add(node, 'touchmove', () => undefined, nonPassiveEvent)\n .add(node, 'touchend', () => undefined)\n .add(node, 'touchstart', down)\n .add(node, 'mousedown', down)\n .add(node, 'touchcancel', up)\n .add(node, 'contextmenu', up)\n .add(node, 'click', click, true)\n }\n\n function addInteractionEvents(): void {\n const node = isMouse ? document : rootNode\n interactionEvents\n .add(node, 'touchmove', move, nonPassiveEvent)\n .add(node, 'touchend', up)\n .add(node, 'mousemove', move, nonPassiveEvent)\n .add(node, 'mouseup', up)\n }\n\n function removeAllEvents(): void {\n activationEvents.removeAll()\n interactionEvents.removeAll()\n }\n\n function isFocusNode(node: Element): boolean {\n const name = node.nodeName || ''\n return focusNodes.indexOf(name) > -1\n }\n\n function forceBoost(): number {\n const boost = dragFree ? freeForceBoost : snapForceBoost\n const type = isMouse ? 'mouse' : 'touch'\n return boost[type]\n }\n\n function allowedForce(force: number, targetChanged: boolean): number {\n const next = index.clone().add(mathSign(force) * -1)\n const isEdge = next.get() === index.min || next.get() === index.max\n const baseForce = scrollTarget.byDistance(force, !dragFree).distance\n\n if (dragFree || mathAbs(force) < dragThreshold) return baseForce\n if (!loop && isEdge) return baseForce * 0.4\n if (skipSnaps && targetChanged) return baseForce * 0.5\n\n return scrollTarget.byIndex(next.get(), 0).distance\n }\n\n function down(evt: PointerEventType): void {\n isMouse = !dragTracker.isTouchEvent(evt)\n if (isMouse && (evt as MouseEvent).button !== 0) return\n if (isFocusNode(evt.target as Element)) return\n\n const isMoving = deltaAbs(target.get(), location.get()) >= 2\n const clearPreventClick = isMouse || !isMoving\n\n pointerIsDown = true\n dragTracker.pointerDown(evt)\n dragStartPoint.set(target)\n target.set(location)\n scrollBody.useBaseMass().useSpeed(80)\n addInteractionEvents()\n startScroll = dragTracker.readPoint(evt)\n startCross = dragTracker.readPoint(evt, crossAxis)\n eventHandler.emit('pointerDown')\n\n if (clearPreventClick) preventClick = false\n }\n\n function move(evt: PointerEventType): void {\n if (!preventScroll && !isMouse) {\n if (!evt.cancelable) return up(evt)\n const lastScroll = dragTracker.readPoint(evt)\n const lastCross = dragTracker.readPoint(evt, crossAxis)\n const diffScroll = deltaAbs(lastScroll, startScroll)\n const diffCross = deltaAbs(lastCross, startCross)\n preventScroll = diffScroll > diffCross\n if (!preventScroll && !preventClick) return up(evt)\n }\n const diff = dragTracker.pointerMove(evt)\n if (!preventClick && diff) preventClick = true\n animation.start()\n target.add(direction.apply(diff))\n evt.preventDefault()\n }\n\n function up(evt: PointerEventType): void {\n const currentLocation = scrollTarget.byDistance(0, false)\n const targetChanged = currentLocation.index !== index.get()\n const rawForce = dragTracker.pointerUp(evt) * forceBoost()\n const force = allowedForce(direction.apply(rawForce), targetChanged)\n const forceFactor = factorAbs(rawForce, force)\n const isMoving = deltaAbs(target.get(), dragStartPoint.get()) >= 0.5\n const isVigorous = targetChanged && forceFactor > 0.75\n const isBelowThreshold = mathAbs(rawForce) < dragThreshold\n const speed = isVigorous ? 10 : baseSpeed\n const mass = isVigorous ? baseMass + 2.5 * forceFactor : baseMass\n\n if (isMoving && !isMouse) preventClick = true\n preventScroll = false\n pointerIsDown = false\n interactionEvents.removeAll()\n scrollBody.useSpeed(isBelowThreshold ? 9 : speed).useMass(mass)\n scrollTo.distance(force, !dragFree)\n isMouse = false\n eventHandler.emit('pointerUp')\n }\n\n function click(evt: MouseEvent): void {\n if (preventClick) {\n evt.stopPropagation()\n evt.preventDefault()\n }\n }\n\n // DEPRECATED - Remove in v8 because handled automatically\n function clickAllowed(): boolean {\n return !preventClick\n }\n\n function pointerDown(): boolean {\n return pointerIsDown\n }\n\n const self: DragHandlerType = {\n addActivationEvents,\n clickAllowed,\n pointerDown,\n removeAllEvents,\n }\n return self\n}\n","import { map, roundToDecimals, mathSign } from './utils'\nimport { Vector1D, Vector1DType } from './Vector1d'\n\nexport type ScrollBodyType = {\n direction: () => number\n seek: (target: Vector1DType) => ScrollBodyType\n settle: (target: Vector1DType) => boolean\n update: () => void\n useBaseMass: () => ScrollBodyType\n useBaseSpeed: () => ScrollBodyType\n useMass: (n: number) => ScrollBodyType\n useSpeed: (n: number) => ScrollBodyType\n}\n\nexport function ScrollBody(\n location: Vector1DType,\n baseSpeed: number,\n baseMass: number,\n): ScrollBodyType {\n const roundToTwoDecimals = roundToDecimals(2)\n const velocity = Vector1D(0)\n const acceleration = Vector1D(0)\n const attraction = Vector1D(0)\n\n let attractionDirection = 0\n let speed = baseSpeed\n let mass = baseMass\n\n function update(): void {\n velocity.add(acceleration)\n location.add(velocity)\n acceleration.multiply(0)\n }\n\n function applyForce(force: Vector1DType): void {\n force.divide(mass)\n acceleration.add(force)\n }\n\n function seek(target: Vector1DType): ScrollBodyType {\n attraction.set(target).subtract(location)\n const magnitude = map(attraction.get(), 0, 100, 0, speed)\n attractionDirection = mathSign(attraction.get())\n attraction.normalize().multiply(magnitude).subtract(velocity)\n applyForce(attraction)\n return self\n }\n\n function settle(target: Vector1DType): boolean {\n const diff = target.get() - location.get()\n const hasSettled = !roundToTwoDecimals(diff)\n if (hasSettled) location.set(target)\n return hasSettled\n }\n\n function direction(): number {\n return attractionDirection\n }\n\n function useBaseSpeed(): ScrollBodyType {\n return useSpeed(baseSpeed)\n }\n\n function useBaseMass(): ScrollBodyType {\n return useMass(baseMass)\n }\n\n function useSpeed(n: number): ScrollBodyType {\n speed = n\n return self\n }\n\n function useMass(n: number): ScrollBodyType {\n mass = n\n return self\n }\n\n const self: ScrollBodyType = {\n direction,\n seek,\n settle,\n update,\n useBaseMass,\n useBaseSpeed,\n useMass,\n useSpeed,\n }\n return self\n}\n","import { LimitType } from './Limit'\nimport { ScrollBodyType } from './ScrollBody'\nimport { Vector1DType } from './Vector1d'\nimport { mathAbs } from './utils'\nimport { PercentOfViewType } from './PercentOfView'\n\nexport type ScrollBoundsType = {\n constrain: (pointerDown: boolean) => void\n toggleActive: (active: boolean) => void\n}\n\nexport function ScrollBounds(\n limit: LimitType,\n location: Vector1DType,\n target: Vector1DType,\n scrollBody: ScrollBodyType,\n percentOfView: PercentOfViewType,\n): ScrollBoundsType {\n const pullBackThreshold = percentOfView.measure(10)\n const edgeOffsetTolerance = percentOfView.measure(50)\n const maxFriction = 0.85\n let disabled = false\n\n function shouldConstrain(): boolean {\n if (disabled) return false\n if (!limit.reachedAny(target.get())) return false\n if (!limit.reachedAny(location.get())) return false\n return true\n }\n\n function constrain(pointerDown: boolean): void {\n if (!shouldConstrain()) return\n const edge = limit.reachedMin(location.get()) ? 'min' : 'max'\n const diffToEdge = mathAbs(limit[edge] - location.get())\n const diffToTarget = target.get() - location.get()\n const friction = Math.min(diffToEdge / edgeOffsetTolerance, maxFriction)\n\n target.subtract(diffToTarget * friction)\n\n if (!pointerDown && mathAbs(diffToTarget) < pullBackThreshold) {\n target.set(limit.constrain(target.get()))\n scrollBody.useSpeed(10).useMass(3)\n }\n }\n\n function toggleActive(active: boolean): void {\n disabled = !active\n }\n\n const self: ScrollBoundsType = {\n constrain,\n toggleActive,\n }\n return self\n}\n","import { Limit, LimitType } from './Limit'\nimport { arrayLast } from './utils'\n\nexport type ScrollContainOptionType = '' | 'trimSnaps' | 'keepSnaps'\n\nexport type ScrollContainType = {\n snapsContained: number[]\n}\n\nexport function ScrollContain(\n viewSize: number,\n contentSize: number,\n snapsAligned: number[],\n containScroll: ScrollContainOptionType,\n): ScrollContainType {\n const scrollBounds = Limit(-contentSize + viewSize, snapsAligned[0])\n const snapsBounded = snapsAligned.map(scrollBounds.constrain)\n const snapsContained = measureContained()\n\n function findDuplicates(): LimitType {\n const startSnap = snapsBounded[0]\n const endSnap = arrayLast(snapsBounded)\n const min = snapsBounded.lastIndexOf(startSnap)\n const max = snapsBounded.indexOf(endSnap) + 1\n return Limit(min, max)\n }\n\n function measureContained(): number[] {\n if (contentSize <= viewSize) return [scrollBounds.max]\n if (containScroll === 'keepSnaps') return snapsBounded\n const { min, max } = findDuplicates()\n return snapsBounded.slice(min, max)\n }\n\n const self: ScrollContainType = {\n snapsContained,\n }\n return self\n}\n","import { Limit, LimitType } from './Limit'\nimport { Vector1DType } from './Vector1d'\n\nexport type ScrollLooperType = {\n loop: (direction: number) => void\n}\n\nexport function ScrollLooper(\n contentSize: number,\n limit: LimitType,\n location: Vector1DType,\n vectors: Vector1DType[],\n): ScrollLooperType {\n const jointSafety = 0.1\n const min = limit.min + jointSafety\n const max = limit.max + jointSafety\n const { reachedMin, reachedMax } = Limit(min, max)\n\n function shouldLoop(direction: number): boolean {\n if (direction === 1) return reachedMax(location.get())\n if (direction === -1) return reachedMin(location.get())\n return false\n }\n\n function loop(direction: number): void {\n if (!shouldLoop(direction)) return\n\n const loopDistance = contentSize * (direction * -1)\n vectors.forEach((v) => v.add(loopDistance))\n }\n\n const self: ScrollLooperType = {\n loop,\n }\n return self\n}\n","import { LimitType } from './Limit'\n\nexport type ScrollProgressType = {\n get: (n: number) => number\n}\n\nexport function ScrollProgress(limit: LimitType): ScrollProgressType {\n const { max, length: scrollLength } = limit\n\n function get(n: number): number {\n const currentLocation = n - max\n return currentLocation / -scrollLength\n }\n\n const self: ScrollProgressType = {\n get,\n }\n return self\n}\n","import { LimitType } from './Limit'\nimport { Vector1DType } from './Vector1d'\nimport { mathAbs, mathSign } from './utils'\n\nexport type TargetType = {\n distance: number\n index: number\n}\n\nexport type ScrollTargetType = {\n byIndex: (target: number, direction: number) => TargetType\n byDistance: (force: number, snap: boolean) => TargetType\n shortcut: (target: number, direction: number) => number\n}\n\nexport function ScrollTarget(\n loop: boolean,\n scrollSnaps: number[],\n contentSize: number,\n limit: LimitType,\n targetVector: Vector1DType,\n): ScrollTargetType {\n const { reachedAny, removeOffset, constrain } = limit\n\n function minDistance(distances: number[]): number {\n return distances.concat().sort((a, b) => mathAbs(a) - mathAbs(b))[0]\n }\n\n function findTargetSnap(target: number): TargetType {\n const distance = loop ? removeOffset(target) : constrain(target)\n const ascDiffsToSnaps = scrollSnaps\n .map((scrollSnap) => scrollSnap - distance)\n .map((diffToSnap) => shortcut(diffToSnap, 0))\n .map((diff, i) => ({ diff, index: i }))\n .sort((d1, d2) => mathAbs(d1.diff) - mathAbs(d2.diff))\n\n const { index } = ascDiffsToSnaps[0]\n return { index, distance }\n }\n\n function shortcut(target: number, direction: number): number {\n const targets = [target, target + contentSize, target - contentSize]\n\n if (!loop) return targets[0]\n if (!direction) return minDistance(targets)\n\n const matchingTargets = targets.filter((t) => mathSign(t) === direction)\n return minDistance(matchingTargets)\n }\n\n function byIndex(index: number, direction: number): TargetType {\n const diffToSnap = scrollSnaps[index] - targetVector.get()\n const distance = shortcut(diffToSnap, direction)\n return { index, distance }\n }\n\n function byDistance(distance: number, snap: boolean): TargetType {\n const target = targetVector.get() + distance\n const { index, distance: targetSnapDistance } = findTargetSnap(target)\n const reachedBound = !loop && reachedAny(target)\n\n if (!snap || reachedBound) return { index, distance }\n\n const diffToSnap = scrollSnaps[index] - targetSnapDistance\n const snapDistance = distance + shortcut(diffToSnap, 0)\n\n return { index, distance: snapDistance }\n }\n\n const self: ScrollTargetType = {\n byDistance,\n byIndex,\n shortcut,\n }\n return self\n}\n","import { AxisType } from './Axis'\nimport { DirectionType } from './Direction'\nimport { Vector1DType } from './Vector1d'\n\nexport type TranslateType = {\n clear: () => void\n to: (vector: Vector1DType) => void\n toggleActive: (active: boolean) => void\n}\n\nexport function Translate(\n axis: AxisType,\n direction: DirectionType,\n container: HTMLElement,\n): TranslateType {\n const translate = axis.scroll === 'x' ? x : y\n const containerStyle = container.style\n let disabled = false\n\n function x(n: number): string {\n return `translate3d(${n}px,0px,0px)`\n }\n\n function y(n: number): string {\n return `translate3d(0px,${n}px,0px)`\n }\n\n function to(target: Vector1DType): void {\n if (disabled) return\n containerStyle.transform = translate(direction.apply(target.get()))\n }\n\n function toggleActive(active: boolean): void {\n disabled = !active\n }\n\n function clear(): void {\n if (disabled) return\n containerStyle.transform = ''\n if (!container.getAttribute('style')) container.removeAttribute('style')\n }\n\n const self: TranslateType = {\n clear,\n to,\n toggleActive,\n }\n return self\n}\n","import { AxisType } from './Axis'\nimport { arrayKeys } from './utils'\nimport { SlidesInViewType } from './SlidesInView'\nimport { Vector1D, Vector1DType } from './Vector1d'\nimport { Translate, TranslateType } from './Translate'\nimport { DirectionType } from './Direction'\n\ntype EdgeType = 'start' | 'end'\n\ntype LoopPointType = {\n index: number\n translate: TranslateType\n location: Vector1DType\n target: () => Vector1DType\n}\n\nexport type SlideLooperType = {\n canLoop: () => boolean\n clear: () => void\n loop: () => void\n loopPoints: LoopPointType[]\n}\n\nexport function SlideLooper(\n axis: AxisType,\n direction: DirectionType,\n viewSize: number,\n contentSize: number,\n slideSizesWithGaps: number[],\n scrollSnaps: number[],\n slidesInView: SlidesInViewType,\n scroll: Vector1DType,\n slides: HTMLElement[],\n): SlideLooperType {\n const ascItems = arrayKeys(slideSizesWithGaps)\n const descItems = arrayKeys(slideSizesWithGaps).reverse()\n const loopPoints = startPoints().concat(endPoints())\n\n function removeSlideSizes(indexes: number[], from: number): number {\n return indexes.reduce((a: number, i) => {\n return a - slideSizesWithGaps[i]\n }, from)\n }\n\n function slidesInGap(indexes: number[], gap: number): number[] {\n return indexes.reduce((a: number[], i) => {\n const remainingGap = removeSlideSizes(a, gap)\n return remainingGap > 0 ? a.concat([i]) : a\n }, [])\n }\n\n function findLoopPoints(indexes: number[], edge: EdgeType): LoopPointType[] {\n const isStartEdge = edge === 'start'\n const offset = isStartEdge ? -contentSize : contentSize\n const slideBounds = slidesInView.findSlideBounds([offset])\n\n return indexes.map((index) => {\n const initial = isStartEdge ? 0 : -contentSize\n const altered = isStartEdge ? contentSize : 0\n const bounds = slideBounds.filter((b) => b.index === index)[0]\n const point = bounds[isStartEdge ? 'end' : 'start']\n const shift = Vector1D(-1)\n const location = Vector1D(-1)\n const translate = Translate(axis, direction, slides[index])\n const target = () => shift.set(scroll.get() > point ? initial : altered)\n return { index, location, translate, target }\n })\n }\n\n function startPoints(): LoopPointType[] {\n const gap = scrollSnaps[0] - 1\n const indexes = slidesInGap(descItems, gap)\n return findLoopPoints(indexes, 'end')\n }\n\n function endPoints(): LoopPointType[] {\n const gap = viewSize - scrollSnaps[0] - 1\n const indexes = slidesInGap(ascItems, gap)\n return findLoopPoints(indexes, 'start')\n }\n\n function canLoop(): boolean {\n return loopPoints.every(({ index }) => {\n const otherIndexes = ascItems.filter((i) => i !== index)\n return removeSlideSizes(otherIndexes, viewSize) <= 0.1\n })\n }\n\n function loop(): void {\n loopPoints.forEach((loopPoint) => {\n const { target, translate, location } = loopPoint\n const shift = target()\n if (shift.get() === location.get()) return\n if (shift.get() === 0) translate.clear()\n else translate.to(shift)\n location.set(shift)\n })\n }\n\n function clear(): void {\n loopPoints.forEach((loopPoint) => loopPoint.translate.clear())\n }\n\n const self: SlideLooperType = {\n canLoop,\n clear,\n loop,\n loopPoints,\n }\n return self\n}\n","import { Limit, LimitType } from './Limit'\n\nexport type SlideBoundType = {\n start: number\n end: number\n index: number\n}\n\nexport type SlidesInViewType = {\n check: (location: number, bounds?: SlideBoundType[]) => number[]\n findSlideBounds: (offsets?: number[], threshold?: number) => SlideBoundType[]\n}\n\nexport function SlidesInView(\n viewSize: number,\n contentSize: number,\n slideSizes: number[],\n snaps: number[],\n limit: LimitType,\n loop: boolean,\n inViewThreshold: number,\n): SlidesInViewType {\n const { removeOffset, constrain } = limit\n const roundingSafety = 0.5\n const cachedOffsets = loop ? [0, contentSize, -contentSize] : [0]\n const cachedBounds = findSlideBounds(cachedOffsets, inViewThreshold)\n\n function findSlideThresholds(threshold?: number): number[] {\n const slideThreshold = threshold || 0\n\n return slideSizes.map((slideSize) => {\n const thresholdLimit = Limit(roundingSafety, slideSize - roundingSafety)\n return thresholdLimit.constrain(slideSize * slideThreshold)\n })\n }\n\n function findSlideBounds(\n offsets?: number[],\n threshold?: number,\n ): SlideBoundType[] {\n const slideOffsets = offsets || cachedOffsets\n const slideThresholds = findSlideThresholds(threshold)\n\n return slideOffsets.reduce((list: SlideBoundType[], offset) => {\n const bounds = snaps.map((snap, index) => ({\n start: snap - slideSizes[index] + slideThresholds[index] + offset,\n end: snap + viewSize - slideThresholds[index] + offset,\n index,\n }))\n return list.concat(bounds)\n }, [])\n }\n\n function check(location: number, bounds?: SlideBoundType[]): number[] {\n const limitedLocation = loop ? removeOffset(location) : constrain(location)\n const slideBounds = bounds || cachedBounds\n\n return slideBounds.reduce((list: number[], slideBound) => {\n const { index, start, end } = slideBound\n const inList = list.indexOf(index) !== -1\n const inView = start < limitedLocation && end > limitedLocation\n return !inList && inView ? list.concat([index]) : list\n }, [])\n }\n\n const self: SlidesInViewType = {\n check,\n findSlideBounds,\n }\n return self\n}\n","import { arrayKeys, arrayLast, isNumber } from './utils'\n\nexport type SlidesToScrollOptionType = 'auto' | number\n\nexport type SlidesToScrollType = {\n groupSlides: <Type>(array: Type[]) => Type[][]\n}\n\nexport function SlidesToScroll(\n viewSize: number,\n slideSizesWithGaps: number[],\n slidesToScroll: SlidesToScrollOptionType,\n): SlidesToScrollType {\n const groupByNumber = isNumber(slidesToScroll)\n\n function byNumber<Type>(array: Type[], groupSize: number): Type[][] {\n return arrayKeys(array)\n .filter((i) => i % groupSize === 0)\n .map((i) => array.slice(i, i + groupSize))\n }\n\n function bySize<Type>(array: Type[]): Type[][] {\n return arrayKeys(array)\n .reduce((groupSizes: number[], i) => {\n const chunk = slideSizesWithGaps.slice(arrayLast(groupSizes), i + 1)\n const chunkSize = chunk.reduce((a, s) => a + s, 0)\n return !i || chunkSize > viewSize ? groupSizes.concat(i) : groupSizes\n }, [])\n .map((start, i, groupSizes) => array.slice(start, groupSizes[i + 1]))\n }\n\n function groupSlides<Type>(array: Type[]): Type[][] {\n return groupByNumber ? byNumber(array, slidesToScroll) : bySize(array)\n }\n\n const self: SlidesToScrollType = {\n groupSlides,\n }\n return self\n}\n","import { Alignment } from './Alignment'\nimport { Animation, AnimationType } from './Animation'\nimport { Axis, AxisType } from './Axis'\nimport { Counter, CounterType } from './Counter'\nimport { Direction, DirectionType } from './Direction'\nimport { DragHandler, DragHandlerType } from './DragHandler'\nimport { DragTracker } from './DragTracker'\nimport { EventHandlerType } from './EventHandler'\nimport { EventStore, EventStoreType } from './EventStore'\nimport { LimitType } from './Limit'\nimport { OptionsType } from './Options'\nimport { PercentOfView, PercentOfViewType } from './PercentOfView'\nimport { ScrollBody, ScrollBodyType } from './ScrollBody'\nimport { ScrollBounds, ScrollBoundsType } from './ScrollBounds'\nimport { ScrollContain } from './ScrollContain'\nimport { ScrollLimit } from './ScrollLimit'\nimport { ScrollLooper, ScrollLooperType } from './ScrollLooper'\nimport { ScrollProgress, ScrollProgressType } from './ScrollProgress'\nimport { ScrollSnaps } from './ScrollSnaps'\nimport { ScrollTarget, ScrollTargetType } from './ScrollTarget'\nimport { ScrollTo, ScrollToType } from './ScrollTo'\nimport { SlideLooper, SlideLooperType } from './SlideLooper'\nimport { SlidesInView, SlidesInViewType } from './SlidesInView'\nimport { SlideSizes } from './SlideSizes'\nimport { SlidesToScroll, SlidesToScrollType } from './SlidesToScroll'\nimport { Translate, TranslateType } from './Translate'\nimport { arrayKeys, arrayLast, arrayLastIndex } from './utils'\nimport { Vector1D, Vector1DType } from './Vector1d'\n\nexport type EngineType = {\n axis: AxisType\n direction: DirectionType\n animation: AnimationType\n scrollBounds: ScrollBoundsType\n scrollLooper: ScrollLooperType\n scrollProgress: ScrollProgressType\n index: CounterType\n indexPrevious: CounterType\n limit: LimitType\n location: Vector1DType\n options: OptionsType\n percentOfView: PercentOfViewType\n scrollBody: ScrollBodyType\n dragHandler: DragHandlerType\n eventStore: EventStoreType\n slideLooper: SlideLooperType\n slidesInView: SlidesInViewType\n slidesToScroll: SlidesToScrollType\n target: Vector1DType\n translate: TranslateType\n scrollTo: ScrollToType\n scrollTarget: ScrollTargetType\n scrollSnaps: number[]\n slideIndexes: number[]\n containerRect: DOMRect\n slideRects: DOMRect[]\n}\n\nexport function Engine(\n root: HTMLElement,\n container: HTMLElement,\n slides: HTMLElement[],\n options: OptionsType,\n eventHandler: EventHandlerType,\n): EngineType {\n // Options\n const {\n align,\n axis: scrollAxis,\n direction: contentDirection,\n startIndex,\n inViewThreshold,\n loop,\n speed,\n dragFree,\n slidesToScroll: groupSlides,\n skipSnaps,\n containScroll,\n } = options\n\n // Measurements\n const containerRect = container.getBoundingClientRect()\n const slideRects = slides.map((slide) => slide.getBoundingClientRect())\n const direction = Direction(contentDirection)\n const axis = Axis(scrollAxis, contentDirection)\n const viewSize = axis.measureSize(containerRect)\n const percentOfView = PercentOfView(viewSize)\n const alignment = Alignment(align, viewSize)\n const containSnaps = !loop && containScroll !== ''\n const readEdgeGap = loop || containScroll !== ''\n const { slideSizes, slideSizesWithGaps } = SlideSizes(\n axis,\n containerRect,\n slideRects,\n slides,\n readEdgeGap,\n )\n const slidesToScroll = SlidesToScroll(\n viewSize,\n slideSizesWithGaps,\n groupSlides,\n )\n const { snaps, snapsAligned } = ScrollSnaps(\n axis,\n alignment,\n containerRect,\n slideRects,\n slideSizesWithGaps,\n slidesToScroll,\n containSnaps,\n )\n const contentSize = -arrayLast(snaps) + arrayLast(slideSizesWithGaps)\n const { snapsContained } = ScrollContain(\n viewSize,\n contentSize,\n snapsAligned,\n containScroll,\n )\n const scrollSnaps = containSnaps ? snapsContained : snapsAligned\n const { limit } = ScrollLimit(contentSize, scrollSnaps, loop)\n\n // Indexes\n const index = Counter(arrayLastIndex(scrollSnaps), startIndex, loop)\n const indexPrevious = index.clone()\n const slideIndexes = arrayKeys(slides)\n\n // Draw\n const update = (): void => {\n if (!loop) engine.scrollBounds.constrain(engine.dragHandler.pointerDown())\n engine.scrollBody.seek(target).update()\n const settled = engine.scrollBody.settle(target)\n\n if (settled && !engine.dragHandler.pointerDown()) {\n engine.animation.stop()\n eventHandler.emit('settle')\n }\n if (!settled) {\n eventHandler.emit('scroll')\n }\n if (loop) {\n engine.scrollLooper.loop(engine.scrollBody.direction())\n engine.slideLooper.loop()\n }\n\n engine.translate.to(location)\n engine.animation.proceed()\n }\n\n // Shared\n const animation = Animation(update)\n const startLocation = scrollSnaps[index.get()]\n const location = Vector1D(startLocation)\n const target = Vector1D(startLocation)\n const scrollBody = ScrollBody(location, speed, 1)\n const scrollTarget = ScrollTarget(\n loop,\n scrollSnaps,\n contentSize,\n limit,\n target,\n )\n const scrollTo = ScrollTo(\n animation,\n index,\n indexPrevious,\n scrollTarget,\n target,\n eventHandler,\n )\n const slidesInView = SlidesInView(\n viewSize,\n contentSize,\n slideSizes,\n snaps,\n limit,\n loop,\n inViewThreshold,\n )\n\n // DragHandler\n const dragHandler = DragHandler(\n axis,\n direction,\n root,\n target,\n DragTracker(axis),\n location,\n animation,\n scrollTo,\n scrollBody,\n scrollTarget,\n index,\n eventHandler,\n percentOfView,\n loop,\n dragFree,\n skipSnaps,\n )\n\n // Engine\n const engine: EngineType = {\n containerRect,\n slideRects,\n animation,\n axis,\n direction,\n dragHandler,\n eventStore: EventStore(),\n percentOfView,\n index,\n indexPrevious,\n limit,\n location,\n options,\n scrollBody,\n scrollBounds: ScrollBounds(\n limit,\n location,\n target,\n scrollBody,\n percentOfView,\n ),\n scrollLooper: ScrollLooper(contentSize, limit, location, [\n location,\n target,\n ]),\n scrollProgress: ScrollProgress(limit),\n scrollSnaps,\n scrollTarget,\n scrollTo,\n slideLooper: SlideLooper(\n axis,\n direction,\n viewSize,\n contentSize,\n slideSizesWithGaps,\n scrollSnaps,\n slidesInView,\n location,\n slides,\n ),\n slidesToScroll,\n slidesInView,\n slideIndexes,\n target,\n translate: Translate(axis, direction, container),\n }\n return engine\n}\n","export type DirectionOptionType = 'ltr' | 'rtl'\n\nexport type DirectionType = {\n apply: (n: number) => number\n}\n\nexport function Direction(direction: DirectionOptionType): DirectionType {\n const sign = direction === 'rtl' ? -1 : 1\n\n function apply(n: number): number {\n return n * sign\n }\n\n const self: DirectionType = {\n apply,\n }\n return self\n}\n","import { DirectionOptionType } from './Direction'\n\nexport type AxisOptionType = 'x' | 'y'\ntype AxisEdgeType = 'top' | 'right' | 'bottom' | 'left'\n\nexport type AxisType = {\n scroll: AxisOptionType\n cross: AxisOptionType\n startEdge: AxisEdgeType\n endEdge: AxisEdgeType\n measureSize: (rect: DOMRect) => number\n}\n\nexport function Axis(\n axis: AxisOptionType,\n direction: DirectionOptionType,\n): AxisType {\n const scroll = axis === 'y' ? 'y' : 'x'\n const cross = axis === 'y' ? 'x' : 'y'\n const startEdge = getStartEdge()\n const endEdge = getEndEdge()\n\n function measureSize(rect: DOMRect): number {\n const { width, height } = rect\n return scroll === 'x' ? width : height\n }\n\n function getStartEdge(): AxisEdgeType {\n if (scroll === 'y') return 'top'\n return direction === 'rtl' ? 'right' : 'left'\n }\n\n function getEndEdge(): AxisEdgeType {\n if (scroll === 'y') return 'bottom'\n return direction === 'rtl' ? 'left' : 'right'\n }\n\n const self: AxisType = {\n scroll,\n cross,\n startEdge,\n endEdge,\n measureSize,\n }\n return self\n}\n","export type PercentOfViewType = {\n measure: (n: number) => number\n}\n\nexport function PercentOfView(viewSize: number): PercentOfViewType {\n function measure(n: number): number {\n return viewSize * (n / 100)\n }\n\n const self: PercentOfViewType = {\n measure,\n }\n return self\n}\n","import { AxisType } from './Axis'\nimport { arrayLast, arrayLastIndex, mathAbs } from './utils'\n\nexport type SlideSizesType = {\n slideSizes: number[]\n slideSizesWithGaps: number[]\n}\n\nexport function SlideSizes(\n axis: AxisType,\n containerRect: DOMRect,\n slideRects: DOMRect[],\n slides: HTMLElement[],\n readEdgeGap: boolean,\n): SlideSizesType {\n const { measureSize, startEdge, endEdge } = axis\n const withEdgeGap = slideRects[0] && readEdgeGap\n const startGap = measureStartGap()\n const endGap = measureEndGap()\n const slideSizes = slideRects.map(measureSize)\n const slideSizesWithGaps = measureWithGaps()\n\n function measureStartGap(): number {\n if (!withEdgeGap) return 0\n const slideRect = slideRects[0]\n return mathAbs(containerRect[startEdge] - slideRect[startEdge])\n }\n\n function measureEndGap(): number {\n if (!withEdgeGap) return 0\n const style = window.getComputedStyle(arrayLast(slides))\n return parseFloat(style.getPropertyValue(`margin-${endEdge}`))\n }\n\n function measureWithGaps(): number[] {\n return slideRects\n .map((rect, index, rects) => {\n const isFirst = !index\n const isLast = index === arrayLastIndex(rects)\n if (isFirst) return slideSizes[index] + startGap\n if (isLast) return slideSizes[index] + endGap\n return rects[index + 1][startEdge] - rect[startEdge]\n })\n .map(mathAbs)\n }\n\n const self: SlideSizesType = {\n slideSizes,\n slideSizesWithGaps,\n }\n return self\n}\n","import { AlignmentType } from './Alignment'\nimport { AxisType } from './Axis'\nimport { SlidesToScrollType } from './SlidesToScroll'\nimport { arrayLast, arrayLastIndex, mathAbs } from './utils'\n\nexport type ScrollSnapsType = {\n snaps: number[]\n snapsAligned: number[]\n}\n\nexport function ScrollSnaps(\n axis: AxisType,\n alignment: AlignmentType,\n containerRect: DOMRect,\n slideRects: DOMRect[],\n slideSizesWithGaps: number[],\n slidesToScroll: SlidesToScrollType,\n containScroll: boolean,\n): ScrollSnapsType {\n const { startEdge, endEdge } = axis\n const { groupSlides } = slidesToScroll\n const alignments = measureSizes().map(alignment.measure)\n const snaps = measureUnaligned()\n const snapsAligned = measureAligned()\n\n function measureSizes(): number[] {\n return groupSlides(slideRects)\n .map((rects) => arrayLast(rects)[endEdge] - rects[0][startEdge])\n .map(mathAbs)\n }\n\n function measureUnaligned(): number[] {\n return slideRects\n .map((rect) => containerRect[startEdge] - rect[startEdge])\n .map((snap) => -mathAbs(snap))\n }\n\n function measureAligned(): number[] {\n const containedStartSnap = 0\n const containedEndSnap = arrayLast(snaps) - arrayLast(slideSizesWithGaps)\n\n return groupSlides(snaps)\n .map((g) => g[0])\n .map((snap, index, groupedSnaps) => {\n const isFirst = !index\n const isLast = index === arrayLastIndex(groupedSnaps)\n if (containScroll && isFirst) return containedStartSnap\n if (containScroll && isLast) return containedEndSnap\n return snap + alignments[index]\n })\n }\n\n const self: ScrollSnapsType = {\n snaps,\n snapsAligned,\n }\n return self\n}\n","import { Limit, LimitType } from './Limit'\nimport { arrayLast } from './utils'\n\nexport type ScrollLimitType = {\n limit: LimitType\n}\n\nexport function ScrollLimit(\n contentSize: number,\n scrollSnaps: number[],\n loop: boolean,\n): ScrollLimitType {\n const limit = measureLimit()\n\n function measureLimit(): LimitType {\n const startSnap = scrollSnaps[0]\n const endSnap = arrayLast(scrollSnaps)\n const min = loop ? startSnap - contentSize : endSnap\n const max = startSnap\n return Limit(min, max)\n }\n\n const self: ScrollLimitType = {\n limit,\n }\n return self\n}\n","type CallbackType = () => void\n\nexport type AnimationType = {\n start: () => void\n stop: () => void\n proceed: () => void\n}\n\nexport function Animation(callback: FrameRequestCallback): AnimationType {\n let animationFrame = 0\n\n function ifAnimating(active: boolean, cb: CallbackType): CallbackType {\n return (): void => {\n if (active === !!animationFrame) cb()\n }\n }\n\n function start(): void {\n animationFrame = window.requestAnimationFrame(callback)\n }\n\n function stop(): void {\n window.cancelAnimationFrame(animationFrame)\n animationFrame = 0\n }\n\n const self: AnimationType = {\n proceed: ifAnimating(true, start),\n start: ifAnimating(false, start),\n stop: ifAnimating(true, stop),\n }\n return self\n}\n","import { AnimationType } from './Animation'\nimport { CounterType } from './Counter'\nimport { EventHandlerType } from './EventHandler'\nimport { ScrollTargetType, TargetType } from './ScrollTarget'\nimport { Vector1DType } from './Vector1d'\n\nexport type ScrollToType = {\n distance: (n: number, snap: boolean) => void\n index: (n: number, direction: number) => void\n}\n\nexport function ScrollTo(\n animation: AnimationType,\n indexCurrent: CounterType,\n indexPrevious: CounterType,\n scrollTarget: ScrollTargetType,\n targetVector: Vector1DType,\n eventHandler: EventHandlerType,\n): ScrollToType {\n function scrollTo(target: TargetType): void {\n const distanceDiff = target.distance\n const indexDiff = target.index !== indexCurrent.get()\n\n if (distanceDiff) {\n animation.start()\n targetVector.add(distanceDiff)\n }\n if (indexDiff) {\n indexPrevious.set(indexCurrent.get())\n indexCurrent.set(target.index)\n eventHandler.emit('select')\n }\n }\n\n function distance(n: number, snap: boolean): void {\n const target = scrollTarget.byDistance(n, snap)\n scrollTo(target)\n }\n\n function index(n: number, direction: number): void {\n const targetIndex = indexCurrent.clone().set(n)\n const target = scrollTarget.byIndex(targetIndex.get(), direction)\n scrollTo(target)\n }\n\n const self: ScrollToType = {\n distance,\n index,\n }\n return self\n}\n","import { AxisOptionType, AxisType } from './Axis'\nimport { mathAbs } from './utils'\n\ntype PointerCoordType = keyof Touch | keyof MouseEvent\nexport type PointerEventType = TouchEvent | MouseEvent\n\nexport type DragTrackerType = {\n isTouchEvent: (evt: PointerEventType) => evt is TouchEvent\n pointerDown: (evt: PointerEventType) => number\n pointerMove: (evt: PointerEventType) => number\n pointerUp: (evt: PointerEventType) => number\n readPoint: (evt: PointerEventType, evtAxis?: AxisOptionType) => number\n}\n\nexport function DragTracker(axis: AxisType): DragTrackerType {\n const logInterval = 170\n\n let startEvent: PointerEventType\n let lastEvent: PointerEventType\n\n function isTouchEvent(evt: PointerEventType): evt is TouchEvent {\n return typeof TouchEvent !== 'undefined' && evt instanceof TouchEvent\n }\n\n function readTime(evt: PointerEventType): number {\n return evt.timeStamp\n }\n\n function readPoint(evt: PointerEventType, evtAxis?: AxisOptionType): number {\n const property = evtAxis || axis.scroll\n const coord: PointerCoordType = `client${property === 'x' ? 'X' : 'Y'}`\n return (isTouchEvent(evt) ? evt.touches[0] : evt)[coord]\n }\n\n function pointerDown(evt: PointerEventType): number {\n startEvent = evt\n lastEvent = evt\n return readPoint(evt)\n }\n\n function pointerMove(evt: PointerEventType): number {\n const diff = readPoint(evt) - readPoint(lastEvent)\n const expired = readTime(evt) - readTime(startEvent) > logInterval\n\n lastEvent = evt\n if (expired) startEvent = evt\n return diff\n }\n\n function pointerUp(evt: PointerEventType): number {\n if (!startEvent || !lastEvent) return 0\n const diffDrag = readPoint(lastEvent) - readPoint(startEvent)\n const diffTime = readTime(evt) - readTime(startEvent)\n const expired = readTime(evt) - readTime(lastEvent) > logInterval\n const force = diffDrag / diffTime\n const isFlick = diffTime && !expired && mathAbs(force) > 0.1\n\n return isFlick ? force : 0\n }\n\n const self: DragTrackerType = {\n isTouchEvent,\n pointerDown,\n pointerMove,\n pointerUp,\n readPoint,\n }\n return self\n}\n","import { AlignmentOptionType } from './Alignment'\nimport { AxisOptionType } from './Axis'\nimport { SlidesToScrollOptionType } from './SlidesToScroll'\nimport { DirectionOptionType } from './Direction'\nimport { ScrollContainOptionType } from './ScrollContain'\n\nexport type LooseOptionsType = {\n [key: string]: unknown\n}\n\nexport type CreateOptionsType<Type extends LooseOptionsType> = Type & {\n active: boolean\n breakpoints: {\n [key: string]: Omit<Partial<CreateOptionsType<Type>>, 'breakpoints'>\n }\n}\n\nexport type OptionsType = CreateOptionsType<{\n align: AlignmentOptionType\n axis: AxisOptionType\n container: string | HTMLElement | null\n slides: string | HTMLElement[] | NodeListOf<HTMLElement> | null\n containScroll: ScrollContainOptionType\n direction: DirectionOptionType\n slidesToScroll: SlidesToScrollOptionType\n dragFree: boolean\n draggable: boolean\n inViewThreshold: number\n loop: boolean\n skipSnaps: boolean\n speed: number\n startIndex: number\n}>\n\nexport const defaultOptions: OptionsType = {\n align: 'center',\n axis: 'x',\n container: null,\n slides: null,\n containScroll: '',\n direction: 'ltr',\n slidesToScroll: 1,\n breakpoints: {},\n dragFree: false,\n draggable: true,\n inViewThreshold: 0,\n loop: false,\n skipSnaps: false,\n speed: 10,\n startIndex: 0,\n active: true,\n}\n\nexport type EmblaOptionsType = Partial<OptionsType>\n","import { LooseOptionsType, CreateOptionsType } from './Options'\nimport { objectKeys, objectsAreEqual, objectsMergeDeep } from './utils'\n\ntype OptionsType = Partial<CreateOptionsType<LooseOptionsType>>\n\nexport type OptionsHandlerType = {\n merge: <TypeA extends OptionsType, TypeB extends OptionsType>(\n optionsA: TypeA,\n optionsB?: TypeB,\n ) => TypeA\n areEqual: <TypeA extends OptionsType, TypeB extends OptionsType>(\n optionsA: TypeA,\n optionsB: TypeB,\n ) => boolean\n atMedia: <Type extends OptionsType>(options: Type) => Type\n}\n\nexport function OptionsHandler(): OptionsHandlerType {\n function merge<TypeA extends OptionsType, TypeB extends OptionsType>(\n optionsA: TypeA,\n optionsB?: TypeB,\n ): TypeA {\n return <TypeA>objectsMergeDeep(optionsA, optionsB || {})\n }\n\n function areEqual<TypeA extends OptionsType, TypeB extends OptionsType>(\n optionsA: TypeA,\n optionsB: TypeB,\n ): boolean {\n const breakpointsA = JSON.stringify(objectKeys(optionsA.breakpoints || {}))\n const breakpointsB = JSON.stringify(objectKeys(optionsB.breakpoints || {}))\n if (breakpointsA !== breakpointsB) return false\n return objectsAreEqual(optionsA, optionsB)\n }\n\n function atMedia<Type extends OptionsType>(options: Type): Type {\n const optionsAtMedia = options.breakpoints || {}\n const matchedMediaOptions = objectKeys(optionsAtMedia)\n .filter((media) => window.matchMedia(media).matches)\n .map((media) => optionsAtMedia[media])\n .reduce((a, mediaOption) => merge(a, mediaOption), {})\n\n return merge(options, matchedMediaOptions)\n }\n\n const self: OptionsHandlerType = {\n merge,\n areEqual,\n atMedia,\n }\n return self\n}\n","import { Engine, EngineType } from './Engine'\nimport { EventStore } from './EventStore'\nimport { EventHandler, EventHandlerType } from './EventHandler'\nimport { defaultOptions, EmblaOptionsType } from './Options'\nimport { OptionsHandler } from './OptionsHandler'\nimport { PluginsHandler } from './PluginsHandler'\nimport { EmblaPluginsType, EmblaPluginType } from './Plugins'\nimport { isString } from './utils'\n\nexport type EmblaCarouselType = {\n canScrollNext: () => boolean\n canScrollPrev: () => boolean\n clickAllowed: () => boolean\n containerNode: () => HTMLElement\n internalEngine: () => EngineType\n destroy: () => void\n off: EventHandlerType['off']\n on: EventHandlerType['on']\n plugins: () => EmblaPluginsType\n previousScrollSnap: () => number\n reInit: (options?: EmblaOptionsType, plugins?: EmblaPluginType[]) => void\n rootNode: () => HTMLElement\n scrollNext: (jump?: boolean) => void\n scrollPrev: (jump?: boolean) => void\n scrollProgress: () => number\n scrollSnapList: () => number[]\n scrollTo: (index: number, jump?: boolean) => void\n selectedScrollSnap: () => number\n slideNodes: () => HTMLElement[]\n slidesInView: (target?: boolean) => number[]\n slidesNotInView: (target?: boolean) => number[]\n}\n\nfunction EmblaCarousel(\n root: HTMLElement,\n userOptions?: EmblaOptionsType,\n userPlugins?: EmblaPluginType[],\n): EmblaCarouselType {\n const resizeHandlers = EventStore()\n const optionsHandler = OptionsHandler()\n const pluginsHandler = PluginsHandler()\n const eventHandler = EventHandler()\n const { on, off } = eventHandler\n const reInit = reActivate\n\n let destroyed = false\n let engine: EngineType\n let optionsBase = optionsHandler.merge(\n defaultOptions,\n EmblaCarousel.globalOptions,\n )\n let options = optionsHandler.merge(optionsBase)\n let pluginList: EmblaPluginType[] = []\n let pluginApis: EmblaPluginsType\n let rootSize = 0\n let container: HTMLElement\n let slides: HTMLElement[]\n\n function storeElements(): void {\n const { container: userContainer, slides: userSlides } = options\n\n const customContainer = isString(userContainer)\n ? root.querySelector(userContainer)\n : userContainer\n container = <HTMLElement>(customContainer || root.children[0])\n\n const customSlides = isString(userSlides)\n ? container.querySelectorAll(userSlides)\n : userSlides\n slides = <HTMLElement[]>[].slice.call(customSlides || container.children)\n }\n\n function activate(\n withOptions?: EmblaOptionsType,\n withPlugins?: EmblaPluginType[],\n ): void {\n if (destroyed) return\n\n optionsBase = optionsHandler.merge(optionsBase, withOptions)\n options = optionsHandler.atMedia(optionsBase)\n\n storeElements()\n\n engine = Engine(root, container, slides, options, eventHandler)\n rootSize = engine.axis.measureSize(root.getBoundingClientRect())\n\n if (!options.active) return deActivate()\n\n engine.translate.to(engine.location)\n pluginList = withPlugins || pluginList\n pluginApis = pluginsHandler.init(pluginList, self)\n\n if (options.loop) {\n if (!engine.slideLooper.canLoop()) {\n deActivate()\n activate({ loop: false }, withPlugins)\n optionsBase = optionsHandler.merge(optionsBase, { loop: true })\n return\n }\n engine.slideLooper.loop()\n }\n if (options.draggable && container.offsetParent && slides.length) {\n engine.dragHandler.addActivationEvents()\n }\n }\n\n function reActivate(\n withOptions?: EmblaOptionsType,\n withPlugins?: EmblaPluginType[],\n ): void {\n const startIndex = selectedScrollSnap()\n deActivate()\n activate(optionsHandler.merge({ startIndex }, withOptions), withPlugins)\n eventHandler.emit('reInit')\n }\n\n function deActivate(): void {\n engine.dragHandler.removeAllEvents()\n engine.animation.stop()\n engine.eventStore.removeAll()\n engine.translate.clear()\n engine.slideLooper.clear()\n pluginsHandler.destroy()\n }\n\n function destroy(): void {\n if (destroyed) return\n destroyed = true\n resizeHandlers.removeAll()\n deActivate()\n eventHandler.emit('destroy')\n }\n\n function resize(): void {\n const newOptions = optionsHandler.atMedia(optionsBase)\n const optionsChanged = !optionsHandler.areEqual(newOptions, options)\n const newRootSize = engine.axis.measureSize(root.getBoundingClientRect())\n const rootSizeChanged = rootSize !== newRootSize\n const pluginsChanged = pluginsHandler.haveChanged()\n\n if (rootSizeChanged || optionsChanged || pluginsChanged) reActivate()\n eventHandler.emit('resize')\n }\n\n function slidesInView(target?: boolean): number[] {\n const location = engine[target ? 'target' : 'location'].get()\n const type = options.loop ? 'removeOffset' : 'constrain'\n return engine.slidesInView.check(engine.limit[type](location))\n }\n\n function slidesNotInView(target?: boolean): number[] {\n const inView = slidesInView(target)\n return engine.slideIndexes.filter((index) => inView.indexOf(index) === -1)\n }\n\n function scrollTo(index: number, jump?: boolean, direction?: number): void {\n if (!options.active || destroyed) return\n engine.scrollBody.useBaseMass().useSpeed(jump ? 100 : options.speed)\n engine.scrollTo.index(index, direction || 0)\n }\n\n function scrollNext(jump?: boolean): void {\n const next = engine.index.clone().add(1)\n scrollTo(next.get(), jump === true, -1)\n }\n\n function scrollPrev(jump?: boolean): void {\n const prev = engine.index.clone().add(-1)\n scrollTo(prev.get(), jump === true, 1)\n }\n\n function canScrollNext(): boolean {\n const next = engine.index.clone().add(1)\n return next.get() !== selectedScrollSnap()\n }\n\n function canScrollPrev(): boolean {\n const prev = engine.index.clone().add(-1)\n return prev.get() !== selectedScrollSnap()\n }\n\n function scrollSnapList(): number[] {\n return engine.scrollSnaps.map(engine.scrollProgress.get)\n }\n\n function scrollProgress(): number {\n return engine.scrollProgress.get(engine.location.get())\n }\n\n function selectedScrollSnap(): number {\n return engine.index.get()\n }\n\n function previousScrollSnap(): number {\n return engine.indexPrevious.get()\n }\n\n function clickAllowed(): boolean {\n return engine.dragHandler.clickAllowed()\n }\n\n function plugins(): EmblaPluginsType {\n return pluginApis\n }\n\n function internalEngine(): EngineType {\n return engine\n }\n\n function rootNode(): HTMLElement {\n return root\n }\n\n function containerNode(): HTMLElement {\n return container\n }\n\n function slideNodes(): HTMLElement[] {\n return slides\n }\n\n const self: EmblaCarouselType = {\n canScrollNext,\n canScrollPrev,\n clickAllowed,\n containerNode,\n internalEngine,\n destroy,\n off,\n on,\n plugins,\n previousScrollSnap,\n reInit,\n rootNode,\n scrollNext,\n scrollPrev,\n scrollProgress,\n scrollSnapList,\n scrollTo,\n selectedScrollSnap,\n slideNodes,\n slidesInView,\n slidesNotInView,\n }\n\n activate(userOptions, userPlugins)\n resizeHandlers.add(window, 'resize', resize)\n setTimeout(() => eventHandler.emit('init'), 0)\n return self\n}\n\nEmblaCarousel.globalOptions = <EmblaOptionsType | undefined>undefined\nEmblaCarousel.optionsHandler = OptionsHandler\n\nexport default EmblaCarousel\n","import { EmblaCarouselType } from '.'\nimport { OptionsHandler } from './OptionsHandler'\nimport { EmblaPluginsType, EmblaPluginType } from './Plugins'\n\ntype PluginChangedHandlerType = () => boolean\n\nexport type PluginsHandlerType = {\n init: (\n plugins: EmblaPluginType[],\n embla: EmblaCarouselType,\n ) => EmblaPluginsType\n destroy: () => void\n haveChanged: PluginChangedHandlerType\n}\n\nexport function PluginsHandler(): PluginsHandlerType {\n const { atMedia, areEqual } = OptionsHandler()\n let activePlugins: EmblaPluginType[] = []\n let pluginsChanged: PluginChangedHandlerType[] = []\n\n function haveChanged(): boolean {\n return pluginsChanged.some((hasChanged) => hasChanged())\n }\n\n function hasChanged(plugin: EmblaPluginType): PluginChangedHandlerType {\n const options = atMedia(plugin.options)\n return (): boolean => !areEqual(options, atMedia(plugin.options))\n }\n\n function init(\n plugins: EmblaPluginType[],\n embla: EmblaCarouselType,\n ): EmblaPluginsType {\n pluginsChanged = plugins.map(hasChanged)\n activePlugins = plugins.filter((plugin) => atMedia(plugin.options).active)\n activePlugins.forEach((plugin) => plugin.init(embla))\n\n return plugins.reduce((map, plugin) => {\n return Object.assign(map, { [plugin.name]: plugin })\n }, {})\n }\n\n function destroy(): void {\n activePlugins = activePlugins.filter((plugin) => plugin.destroy())\n }\n\n const self: PluginsHandlerType = {\n init,\n destroy,\n haveChanged,\n }\n return self\n}\n","type CallbackType = (evt: EmblaEventType) => void\ntype ListenersType = Partial<{ [key in EmblaEventType]: CallbackType[] }>\n\nexport type EmblaEventType =\n | 'init'\n | 'pointerDown'\n | 'pointerUp'\n | 'scroll'\n | 'select'\n | 'settle'\n | 'destroy'\n | 'reInit'\n | 'resize'\n\nexport type EventHandlerType = {\n emit: (evt: EmblaEventType) => EventHandlerType\n on: (evt: EmblaEventType, cb: CallbackType) => EventHandlerType\n off: (evt: EmblaEventType, cb: CallbackType) => EventHandlerType\n}\n\nexport function EventHandler(): EventHandlerType {\n const listeners: ListenersType = {}\n\n function getListeners(evt: EmblaEventType): CallbackType[] {\n return listeners[evt] || []\n }\n\n function emit(evt: EmblaEventType): EventHandlerType {\n getListeners(evt).forEach((e) => e(evt))\n return self\n }\n\n function on(evt: EmblaEventType, cb: CallbackType): EventHandlerType {\n listeners[evt] = getListeners(evt).concat([cb])\n return self\n }\n\n function off(evt: EmblaEventType, cb: CallbackType): EventHandlerType {\n listeners[evt] = getListeners(evt).filter((e) => e !== cb)\n return self\n }\n\n const self: EventHandlerType = {\n emit,\n off,\n on,\n }\n return self\n}\n","import EmblaCarousel, { EmblaPluginType } from 'embla-carousel'\n\nexport function canUseDOM(): boolean {\n return !!(\n typeof window !== 'undefined' &&\n window.document &&\n window.document.createElement\n )\n}\n\nexport function sortAndMapPluginToOptions(\n plugins: EmblaPluginType[],\n): EmblaPluginType['options'][] {\n return plugins\n .concat()\n .sort((a, b) => (a.name > b.name ? 1 : -1))\n .map((plugin) => plugin.options)\n}\n\nexport function arePluginsEqual(\n pluginsA: EmblaPluginType[],\n pluginsB: EmblaPluginType[],\n): boolean {\n if (pluginsA.length !== pluginsB.length) return false\n\n const { areEqual } = EmblaCarousel.optionsHandler()\n const optionsA = sortAndMapPluginToOptions(pluginsA)\n const optionsB = sortAndMapPluginToOptions(pluginsB)\n\n return optionsA.every((optionA, index) => {\n const optionB = optionsB[index]\n return areEqual(optionA, optionB)\n })\n}\n","import { useRef, useEffect, useState, useCallback } from 'react'\nimport { arePluginsEqual, canUseDOM } from './utils'\nimport EmblaCarousel, {\n EmblaCarouselType,\n EmblaOptionsType,\n EmblaPluginType,\n} from 'embla-carousel'\n\ntype EmblaViewportRefType = <ViewportElement extends HTMLElement>(\n instance: ViewportElement | null,\n) => void\n\nexport type UseEmblaCarouselType = [\n EmblaViewportRefType,\n EmblaCarouselType | undefined,\n]\n\nfunction useEmblaCarousel(\n options: EmblaOptionsType = {},\n plugins: EmblaPluginType[] = [],\n): UseEmblaCarouselType {\n const optionsHandler = useRef(EmblaCarousel.optionsHandler())\n const storedOptions = useRef(options)\n const storedPlugins = useRef(plugins)\n const [embla, setEmbla] = useState<EmblaCarouselType>()\n const [viewport, setViewport] = useState<HTMLElement>()\n\n const reInit = useCallback(() => {\n if (embla) embla.reInit(storedOptions.current, storedPlugins.current)\n }, [embla])\n\n useEffect(() => {\n if (canUseDOM() && viewport) {\n EmblaCarousel.globalOptions = useEmblaCarousel.globalOptions\n const newEmbla = EmblaCarousel(\n viewport,\n storedOptions.current,\n storedPlugins.current,\n )\n setEmbla(newEmbla)\n return () => newEmbla.destroy()\n } else {\n setEmbla(undefined)\n }\n }, [viewport, setEmbla])\n\n useEffect(() => {\n if (optionsHandler.current.areEqual(storedOptions.current, options)) return\n\n storedOptions.current = options\n reInit()\n }, [options, reInit])\n\n useEffect(() => {\n if (arePluginsEqual(storedPlugins.current, plugins)) return\n\n storedPlugins.current = plugins\n reInit()\n }, [plugins, reInit])\n\n return [<EmblaViewportRefType>setViewport, embla]\n}\n\nuseEmblaCarousel.globalOptions = <EmblaOptionsType | undefined>undefined\n\nexport default useEmblaCarousel\n","import React, { createContext, useContext } from 'react';\n\nexport function createSafeContext<ContextValue>(errorMessage: string) {\n const Context = createContext<ContextValue | null>(null);\n\n const useSafeContext = () => {\n const ctx = useContext(Context);\n\n if (ctx === null) {\n throw new Error(errorMessage);\n }\n\n return ctx;\n };\n\n const Provider = ({ children, value }: { value: ContextValue; children: React.ReactNode }) => (\n <Context.Provider value={value}>{children}</Context.Provider>\n );\n\n return [Provider, useSafeContext] as const;\n}\n","export const CAROUSEL_ERRORS = {\n context: '[@mantine/carousel] Carousel.Slide was rendered outside of Carousel context',\n};\n","import { MantineNumberSize, Styles, ClassNames } from '@mantine/core';\nimport { createSafeContext } from '@mantine/utils';\nimport { CAROUSEL_ERRORS } from './Carousel.errors';\nimport { CarouselOrientation, Embla, CarouselBreakpoint } from './types';\nimport type { CarouselStylesNames } from './Carousel';\n\ninterface CarouselContext {\n embla: Embla;\n slideSize: string | number;\n slideGap: MantineNumberSize;\n orientation: CarouselOrientation;\n includeGapInSize: boolean;\n breakpoints: CarouselBreakpoint[];\n classNames: ClassNames<CarouselStylesNames>;\n styles: Styles<CarouselStylesNames>;\n unstyled: boolean;\n}\n\nexport const [CarouselProvider, useCarouselContext] = createSafeContext<CarouselContext>(\n CAROUSEL_ERRORS.context\n);\n","import { MantineTheme } from '@mantine/styles';\n\nexport function getSortedBreakpoints<T extends Record<string, any>>(\n theme: MantineTheme,\n breakpoints: T[]\n) {\n if (breakpoints.length === 0) {\n return breakpoints;\n }\n\n const property = 'maxWidth' in breakpoints[0] ? 'maxWidth' : 'minWidth';\n const sorted = [...breakpoints].sort(\n (a, b) =>\n theme.fn.size({ size: b[property], sizes: theme.breakpoints }) -\n theme.fn.size({ size: a[property], sizes: theme.breakpoints })\n );\n\n return property === 'minWidth' ? sorted.reverse() : sorted;\n}\n","import { createStyles, getSortedBreakpoints, MantineNumberSize } from '@mantine/core';\nimport { CarouselBreakpoint } from './types';\n\nexport interface CarouselStylesParams {\n controlSize: number;\n controlsOffset: MantineNumberSize;\n orientation: 'vertical' | 'horizontal';\n height: React.CSSProperties['height'];\n includeGapInSize: boolean;\n breakpoints: CarouselBreakpoint[];\n slideGap: MantineNumberSize;\n}\n\nexport default createStyles(\n (\n theme,\n {\n controlSize,\n controlsOffset,\n orientation,\n height,\n includeGapInSize,\n breakpoints = [],\n slideGap,\n }: CarouselStylesParams\n ) => {\n const horizontal = orientation === 'horizontal';\n\n // Container styles by slideGap (for includeGapInSize case)\n const getContainerStyles = (gap: MantineNumberSize) => {\n if (!includeGapInSize) return {};\n\n const slideGapValue = theme.fn.size({\n size: gap,\n sizes: theme.spacing,\n });\n\n return {\n [orientation === 'horizontal' ? 'marginRight' : 'marginBottom']: slideGapValue * -1,\n };\n };\n\n const hasDiff = breakpoints.some(\n (v) => typeof v.slideGap !== 'undefined' || typeof v.slideSize !== 'undefined'\n );\n\n // Apply styles for breakpoints only if has different gap or size\n const containerBreakpoints = !hasDiff\n ? null\n : getSortedBreakpoints(theme, breakpoints).reduce((acc, breakpoint) => {\n const property = 'maxWidth' in breakpoint ? 'max-width' : 'min-width';\n const breakpointSize = theme.fn.size({\n size: (property === 'max-width' ? breakpoint.maxWidth : breakpoint.minWidth)!,\n sizes: theme.breakpoints,\n });\n\n const breakpointSlideGap =\n (typeof breakpoint.slideGap === 'undefined' ? slideGap : breakpoint.slideGap) ?? 0;\n\n acc[`@media (${property}: ${breakpointSize - (property === 'max-width' ? 1 : 0)}px)`] =\n getContainerStyles(breakpointSlideGap);\n\n return acc;\n }, {} as any);\n\n return {\n root: {\n position: 'relative',\n },\n viewport: {\n height,\n overflow: 'hidden',\n },\n\n container: {\n display: 'flex',\n flexDirection: horizontal ? 'row' : 'column',\n height,\n ...getContainerStyles(slideGap),\n ...containerBreakpoints,\n },\n\n controls: {\n position: 'absolute',\n zIndex: 1,\n left: horizontal ? 0 : `calc(50% - ${controlSize / 2}px)`,\n right: horizontal ? 0 : undefined,\n top: horizontal ? `calc(50% - ${controlSize / 2}px)` : 0,\n bottom: horizontal ? undefined : 0,\n display: 'flex',\n flexDirection: horizontal ? 'row' : 'column',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingLeft: horizontal\n ? theme.fn.size({ size: controlsOffset, sizes: theme.spacing })\n : undefined,\n paddingRight: horizontal\n ? theme.fn.size({ size: controlsOffset, sizes: theme.spacing })\n : undefined,\n paddingTop: !horizontal\n ? theme.fn.size({ size: controlsOffset, sizes: theme.spacing })\n : undefined,\n paddingBottom: !horizontal\n ? theme.fn.size({ size: controlsOffset, sizes: theme.spacing })\n : undefined,\n pointerEvents: 'none',\n },\n\n control: {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n minWidth: controlSize,\n minHeight: controlSize,\n borderRadius: controlSize,\n pointerEvents: 'all',\n backgroundColor: theme.white,\n color: theme.black,\n boxShadow: theme.shadows.md,\n opacity: theme.colorScheme === 'dark' ? 0.65 : 0.85,\n border: `1px solid ${theme.colors.gray[3]}`,\n transition: `opacity 150ms ${theme.transitionTimingFunction}`,\n ...theme.fn.hover({ opacity: 1 }),\n '&:active': theme.activeStyles,\n },\n\n indicators: {\n position: 'absolute',\n bottom: horizontal ? theme.spacing.md : 0,\n top: horizontal ? undefined : 0,\n left: horizontal ? 0 : undefined,\n right: horizontal ? 0 : theme.spacing.md,\n display: 'flex',\n flexDirection: horizontal ? 'row' : 'column',\n justifyContent: 'center',\n gap: 8,\n pointerEvents: 'none',\n },\n\n indicator: {\n pointerEvents: 'all',\n width: horizontal ? 25 : 5,\n height: horizontal ? 5 : 25,\n borderRadius: 10000,\n backgroundColor: theme.white,\n boxShadow: theme.shadows.sm,\n opacity: 0.6,\n transition: `opacity 150ms ${theme.transitionTimingFunction}`,\n\n '&[data-active]': {\n opacity: 1,\n },\n },\n };\n }\n);\n","import { createStyles, MantineNumberSize, getSortedBreakpoints } from '@mantine/core';\nimport { CarouselOrientation, CarouselBreakpoint } from '../types';\n\nexport interface CarouselSlideStylesParams {\n size: string | number;\n gap: MantineNumberSize;\n orientation: CarouselOrientation;\n includeGapInSize: boolean;\n breakpoints: CarouselBreakpoint[];\n}\n\nexport default createStyles(\n (\n theme,\n { size, gap, orientation, includeGapInSize, breakpoints = [] }: CarouselSlideStylesParams\n ) => {\n // Slide styles by slideGap and slideSize\n const getSlideStyles = (slideGap: MantineNumberSize, slideSize: string | number) => {\n const slideGapValue = theme.fn.size({\n size: slideGap,\n sizes: theme.spacing,\n });\n\n const flexBasisValue = typeof slideSize === 'number' ? `${slideSize}px` : slideSize;\n\n const marginStyles = includeGapInSize\n ? {\n [orientation === 'horizontal' ? 'paddingRight' : 'paddinBottom']: slideGapValue,\n }\n : {\n [orientation === 'horizontal' ? 'marginRight' : 'marginBottom']: slideGapValue,\n };\n\n return {\n flex: `0 0 ${flexBasisValue}`,\n ...marginStyles,\n };\n };\n\n const hasDiff = breakpoints.some(\n (v) => typeof v.slideGap !== 'undefined' || typeof v.slideSize !== 'undefined'\n );\n\n // Apply styles for breakpoints only if has different gap or size\n const slideBreakpoints = !hasDiff\n ? null\n : getSortedBreakpoints(theme, breakpoints).reduce((acc, breakpoint) => {\n const property = 'maxWidth' in breakpoint ? 'max-width' : 'min-width';\n const breakpointSize = theme.fn.size({\n size: property === 'max-width' ? breakpoint.maxWidth : breakpoint.minWidth,\n sizes: theme.breakpoints,\n });\n\n const breakpointGap =\n typeof breakpoint.slideGap === 'undefined' ? gap : breakpoint.slideGap;\n\n acc[`@media (${property}: ${breakpointSize - (property === 'max-width' ? 1 : 0)}px)`] =\n getSlideStyles(breakpointGap, breakpoint.slideSize);\n\n return acc;\n }, {});\n\n return {\n slide: {\n position: 'relative',\n ...getSlideStyles(gap, size),\n ...slideBreakpoints,\n },\n };\n }\n);\n","import React, { forwardRef, useCallback } from 'react';\nimport { Box, DefaultProps, Selectors, MantineNumberSize } from '@mantine/core';\nimport { useCarouselContext } from '../Carousel.context';\nimport useStyles from './CarouselSlide.styles';\n\nexport type CarouselSlideStylesNames = Selectors<typeof useStyles>;\n\nexport interface CarouselSlideProps extends DefaultProps, React.ComponentPropsWithoutRef<'div'> {\n /** Slide content */\n children?: React.ReactNode;\n\n /** Slide width, defaults to 100%, examples: 200px, 50% */\n size?: string | number;\n\n /** Key of theme.spacing or number to set gap between slides in px */\n gap?: MantineNumberSize;\n}\n\nexport const CarouselSlide = forwardRef<HTMLDivElement, CarouselSlideProps>(\n ({ children, className, size, gap, onClick, ...others }, ref) => {\n const ctx = useCarouselContext();\n const { classes, cx } = useStyles(\n {\n gap: typeof gap === 'undefined' ? ctx.slideGap : gap,\n size: typeof size === 'undefined' ? ctx.slideSize : size,\n orientation: ctx.orientation,\n includeGapInSize: ctx.includeGapInSize,\n breakpoints: ctx.breakpoints,\n },\n { name: 'Carousel', classNames: ctx.classNames, styles: ctx.styles, unstyled: ctx.unstyled }\n );\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n if (ctx.embla?.clickAllowed()) {\n onClick?.(event);\n }\n },\n [ctx.embla]\n );\n\n return (\n <Box className={cx(classes.slide, className)} ref={ref} onClick={handleClick} {...others}>\n {children}\n </Box>\n );\n }\n);\n\nCarouselSlide.displayName = '@mantine/carousel/CarouselSlide';\n","import { CarouselOrientation } from './types';\n\ninterface Options {\n dir: 'rtl' | 'ltr';\n orientation: CarouselOrientation;\n direction: 'next' | 'previous';\n}\n\nexport function getChevronRotation({ dir, orientation, direction }: Options) {\n if (direction === 'previous') {\n return orientation === 'horizontal' ? 90 * (dir === 'ltr' ? 1 : -1) : -180;\n }\n\n return orientation === 'horizontal' ? 90 * (dir === 'ltr' ? -1 : 1) : 0;\n}\n","/* eslint-disable react/no-unused-prop-types */\nimport {\n Box,\n ChevronIcon,\n DefaultProps,\n MantineNumberSize,\n Selectors,\n UnstyledButton,\n useComponentDefaultProps,\n} from '@mantine/core';\nimport { clamp } from '@mantine/hooks';\nimport { ForwardRefWithStaticComponents } from '@mantine/utils';\nimport useEmblaCarousel, { EmblaPluginType } from 'embla-carousel-react';\nimport React, { Children, forwardRef, useCallback, useEffect, useState } from 'react';\nimport { CarouselProvider } from './Carousel.context';\nimport useStyles, { CarouselStylesParams } from './Carousel.styles';\nimport { CarouselSlide, CarouselSlideStylesNames } from './CarouselSlide/CarouselSlide';\nimport { getChevronRotation } from './get-chevron-rotation';\nimport { CarouselBreakpoint, CarouselOrientation, Embla } from './types';\n\nexport type CarouselStylesNames = CarouselSlideStylesNames | Selectors<typeof useStyles>;\n\nexport interface CarouselProps\n extends DefaultProps<CarouselStylesNames, CarouselStylesParams>,\n React.ComponentPropsWithRef<'div'> {\n /** <Carousel.Slide /> components */\n children?: React.ReactNode;\n\n /** Called when user clicks next button */\n onNextSlide?(): void;\n\n /** Called when user clicks previous button */\n onPreviousSlide?(): void;\n\n /** Called with slide index when slide changes */\n onSlideChange?(index: number): void;\n\n /** Get embla API as ref */\n getEmblaApi?(embla: Embla): void;\n\n /** Next control aria-label */\n nextControlLabel?: string;\n\n /** Previous control aria-label */\n previousControlLabel?: string;\n\n /** Previous/next controls size in px */\n controlSize?: number;\n\n /** Key of theme.spacing or number to set space between next/previous control and carousel boundary */\n controlsOffset?: MantineNumberSize;\n\n /** Slide width, defaults to 100%, examples: 200px, 50% */\n slideSize?: string | number;\n\n /** Key of theme.spacing or number to set gap between slides in px */\n slideGap?: MantineNumberSize;\n\n /** Control slideSize and slideGap at different viewport sizes */\n breakpoints?: CarouselBreakpoint[];\n\n /** Carousel orientation, horizontal by default */\n orientation?: CarouselOrientation;\n\n /** Slides container height, required for vertical orientation */\n height?: React.CSSProperties['height'];\n\n /** Determines how slides will be aligned relative to the container. Use number between 0-1 to align slides based on percentage, where 0.5 equals 50% */\n align?: 'start' | 'center' | 'end' | number;\n\n /** Number of slides that should be scrolled with next/previous buttons */\n slidesToScroll?: number | 'auto';\n\n /** Determines whether gap should be treated as part of the slide size, true by default */\n includeGapInSize?: boolean;\n\n /** Determines whether carousel can be scrolled with mouse and touch interactions, true by default */\n draggable?: boolean;\n\n /** Determines whether momentum scrolling should be enabled, false by default */\n dragFree?: boolean;\n\n /** Enables infinite looping. Automatically falls back to false if slide content isn't enough to loop. */\n loop?: boolean;\n\n /** Adjusts scroll speed when triggered by any of the methods. Higher numbers enables faster scrolling. */\n speed?: number;\n\n /** Index of initial slide */\n initialSlide?: number;\n\n /** Choose a fraction representing the percentage portion of a slide that needs to be visible in order to be considered in view. For example, 0.5 equals 50%. */\n inViewThreshold?: number;\n\n /** Determines whether next/previous controls should be displayed, true by default */\n withControls?: boolean;\n\n /** Determines whether indicators should be displayed, false by default */\n withIndicators?: boolean;\n\n /** An array of embla plugins */\n plugins?: EmblaPluginType[];\n\n /** Icon of next control */\n nextControlIcon?: React.ReactNode;\n\n /** Previous control icon */\n previousControlIcon?: React.ReactNode;\n\n /** Allow the carousel to skip scroll snaps if it's dragged vigorously. Note that this option will be ignored if the dragFree option is set to true, false by default */\n skipSnaps?: boolean;\n\n /** Clear leading and trailing empty space that causes excessive scrolling. Use trimSnaps to only use snap points that trigger scrolling or keepSnaps to keep them. */\n containScroll?: 'trimSnaps' | 'keepSnaps' | '';\n\n /** Determines whether arrow key should switch slides, true by default */\n withKeyboardEvents?: boolean;\n}\n\nconst defaultProps: Partial<CarouselProps> = {\n controlSize: 26,\n controlsOffset: 'sm',\n slideSize: '100%',\n slideGap: 0,\n orientation: 'horizontal',\n align: 'center',\n slidesToScroll: 1,\n includeGapInSize: true,\n draggable: true,\n dragFree: false,\n loop: false,\n speed: 10,\n initialSlide: 0,\n inViewThreshold: 0,\n withControls: true,\n withIndicators: false,\n skipSnaps: false,\n containScroll: '',\n withKeyboardEvents: true,\n};\n\nexport const _Carousel = forwardRef<HTMLDivElement, CarouselProps>((props, ref) => {\n const {\n children,\n className,\n getEmblaApi,\n onNextSlide,\n onPreviousSlide,\n onSlideChange,\n nextControlLabel,\n previousControlLabel,\n controlSize,\n controlsOffset,\n classNames,\n styles,\n unstyled,\n slideSize,\n slideGap,\n orientation,\n height,\n align,\n slidesToScroll,\n includeGapInSize,\n draggable,\n dragFree,\n loop,\n speed,\n initialSlide,\n inViewThreshold,\n withControls,\n withIndicators,\n plugins,\n nextControlIcon,\n previousControlIcon,\n breakpoints,\n skipSnaps,\n containScroll,\n withKeyboardEvents,\n ...others\n } = useComponentDefaultProps('Carousel', defaultProps, props);\n\n const { classes, cx, theme } = useStyles(\n { controlSize, controlsOffset, orientation, height, includeGapInSize, breakpoints, slideGap },\n { name: 'Carousel', classNames, styles, unstyled }\n );\n\n const [emblaRefElement, embla] = useEmblaCarousel(\n {\n axis: orientation === 'horizontal' ? 'x' : 'y',\n // keep direction undefined for vertical orientation if the current theme is RTL\n direction: orientation === 'horizontal' ? theme.dir : undefined,\n startIndex: initialSlide,\n loop,\n align,\n slidesToScroll,\n draggable,\n dragFree,\n speed,\n inViewThreshold,\n skipSnaps,\n containScroll,\n },\n plugins\n );\n\n const [selected, setSelected] = useState(0);\n const [slidesCount, setSlidesCount] = useState(0);\n\n const handleScroll = useCallback((index: number) => embla && embla.scrollTo(index), [embla]);\n\n const handleSelect = useCallback(() => {\n if (!embla) return;\n const slide = embla.selectedScrollSnap();\n setSelected(slide);\n onSlideChange?.(slide);\n }, [embla, setSelected]);\n\n const handlePrevious = useCallback(() => {\n embla?.scrollPrev();\n onPreviousSlide?.();\n }, [embla]);\n\n const handleNext = useCallback(() => {\n embla?.scrollNext();\n onNextSlide?.();\n }, [embla]);\n\n const handleKeydown = useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (withKeyboardEvents) {\n if (event.key === 'ArrowRight') {\n event.preventDefault();\n handleNext();\n }\n\n if (event.key === 'ArrowLeft') {\n event.preventDefault();\n handlePrevious();\n }\n }\n },\n [embla]\n );\n\n useEffect(() => {\n if (embla) {\n getEmblaApi?.(embla);\n handleSelect();\n setSlidesCount(embla.scrollSnapList().length);\n embla.on('select', handleSelect);\n\n return () => {\n embla.off('select', handleSelect);\n };\n }\n\n return undefined;\n }, [embla, slidesToScroll]);\n\n useEffect(() => {\n if (embla) {\n embla.reInit();\n setSlidesCount(embla.scrollSnapList().length);\n setSelected((currentSelected) =>\n clamp(currentSelected, 0, Children.toArray(children).length - 1)\n );\n }\n }, [Children.toArray(children).length, slidesToScroll]);\n\n const canScrollPrev = embla?.canScrollPrev() || false;\n const canScrollNext = embla?.canScrollNext() || false;\n\n const indicators = Array(slidesCount)\n .fill(0)\n .map((_, index) => (\n <UnstyledButton\n key={index}\n data-active={index === selected || undefined}\n className={classes.indicator}\n aria-hidden\n tabIndex={-1}\n onClick={() => handleScroll(index)}\n />\n ));\n\n return (\n <CarouselProvider\n value={{\n slideGap,\n slideSize,\n embla,\n orientation,\n includeGapInSize,\n breakpoints,\n classNames,\n styles,\n unstyled,\n }}\n >\n <Box\n className={cx(classes.root, className)}\n ref={ref}\n onKeyDownCapture={handleKeydown}\n {...others}\n >\n <div className={classes.viewport} ref={emblaRefElement}>\n <div className={classes.container}>{children}</div>\n </div>\n\n {withIndicators && <div className={classes.indicators}>{indicators}</div>}\n\n {withControls && (\n <div className={classes.controls}>\n <UnstyledButton\n onClick={handlePrevious}\n className={classes.control}\n aria-label={previousControlLabel}\n data-inactive={!canScrollPrev || undefined}\n tabIndex={canScrollPrev ? 0 : -1}\n >\n {typeof previousControlIcon !== 'undefined' ? (\n previousControlIcon\n ) : (\n <ChevronIcon\n style={{\n transform: `rotate(${getChevronRotation({\n dir: theme.dir,\n orientation,\n direction: 'previous',\n })}deg)`,\n }}\n />\n )}\n </UnstyledButton>\n\n <UnstyledButton\n onClick={handleNext}\n className={classes.control}\n aria-label={nextControlLabel}\n data-inactive={!canScrollNext || undefined}\n tabIndex={canScrollNext ? 0 : -1}\n >\n {typeof nextControlIcon !== 'undefined' ? (\n nextControlIcon\n ) : (\n <ChevronIcon\n style={{\n transform: `rotate(${getChevronRotation({\n dir: theme.dir,\n orientation,\n direction: 'next',\n })}deg)`,\n }}\n />\n )}\n </UnstyledButton>\n </div>\n )}\n </Box>\n </CarouselProvider>\n );\n}) as any;\n\n_Carousel.Slide = CarouselSlide;\n_Carousel.displayName = '@mantine/carousel/Carousel';\n\nexport const Carousel: ForwardRefWithStaticComponents<\n CarouselProps,\n { Slide: typeof CarouselSlide }\n> = _Carousel;\n","import React from 'react';\n\nexport function ImageIcon(props: React.ComponentPropsWithoutRef<'svg'>) {\n return (\n <svg\n width=\"15\"\n height=\"15\"\n viewBox=\"0 0 15 15\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M2.5 1H12.5C13.3284 1 14 1.67157 14 2.5V12.5C14 13.3284 13.3284 14 12.5 14H2.5C1.67157 14 1 13.3284 1 12.5V2.5C1 1.67157 1.67157 1 2.5 1ZM2.5 2C2.22386 2 2 2.22386 2 2.5V8.3636L3.6818 6.6818C3.76809 6.59551 3.88572 6.54797 4.00774 6.55007C4.12975 6.55216 4.24568 6.60372 4.32895 6.69293L7.87355 10.4901L10.6818 7.6818C10.8575 7.50607 11.1425 7.50607 11.3182 7.6818L13 9.3636V2.5C13 2.22386 12.7761 2 12.5 2H2.5ZM2 12.5V9.6364L3.98887 7.64753L7.5311 11.4421L8.94113 13H2.5C2.22386 13 2 12.7761 2 12.5ZM12.5 13H10.155L8.48336 11.153L11 8.6364L13 10.6364V12.5C13 12.7761 12.7761 13 12.5 13ZM6.64922 5.5C6.64922 5.03013 7.03013 4.64922 7.5 4.64922C7.96987 4.64922 8.35078 5.03013 8.35078 5.5C8.35078 5.96987 7.96987 6.35078 7.5 6.35078C7.03013 6.35078 6.64922 5.96987 6.64922 5.5ZM7.5 3.74922C6.53307 3.74922 5.74922 4.53307 5.74922 5.5C5.74922 6.46693 6.53307 7.25078 7.5 7.25078C8.46693 7.25078 9.25078 6.46693 9.25078 5.5C9.25078 4.53307 8.46693 3.74922 7.5 3.74922Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n","import { createStyles, MantineNumberSize } from '@mantine/styles';\n\nexport interface ImageStylesParams {\n radius: MantineNumberSize;\n}\n\nexport default createStyles((theme, { radius }: ImageStylesParams) => ({\n root: {},\n\n imageWrapper: {\n position: 'relative',\n },\n\n figure: {\n margin: 0,\n },\n\n image: {\n ...theme.fn.fontStyles(),\n display: 'block',\n width: '100%',\n height: '100%',\n border: 0,\n borderRadius: theme.fn.size({ size: radius, sizes: theme.radius }),\n },\n\n caption: {\n color: theme.colorScheme === 'dark' ? theme.colors.dark[2] : theme.colors.gray[7],\n marginTop: theme.spacing.xs,\n },\n\n placeholder: {\n ...theme.fn.cover(),\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: theme.colorScheme === 'dark' ? theme.colors.dark[2] : theme.colors.gray[6],\n backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[8] : theme.colors.gray[0],\n borderRadius: theme.fn.size({ size: radius, sizes: theme.radius }),\n },\n}));\n","import React, { useState, forwardRef } from 'react';\nimport {\n DefaultProps,\n MantineNumberSize,\n Selectors,\n useComponentDefaultProps,\n} from '@mantine/styles';\nimport { useDidUpdate } from '@mantine/hooks';\nimport { Text } from '../Text';\nimport { Box } from '../Box';\nimport { ImageIcon } from './ImageIcon';\nimport useStyles, { ImageStylesParams } from './Image.styles';\n\nexport type ImageStylesNames = Selectors<typeof useStyles>;\n\nexport interface ImageProps\n extends DefaultProps<ImageStylesNames, ImageStylesParams>,\n Omit<React.ComponentPropsWithoutRef<'div'>, 'placeholder'> {\n /** Image src */\n src?: string | null;\n\n /** Image alt text, used as title for placeholder if image was not loaded */\n alt?: string;\n\n /** Image object-fit property */\n fit?: React.CSSProperties['objectFit'];\n\n /** Image width, defaults to 100%, cannot exceed 100% */\n width?: number | string;\n\n /** Image height, defaults to original image height adjusted to given width */\n height?: number | string;\n\n /** Predefined border-radius value from theme.radius or number for border-radius in px */\n radius?: MantineNumberSize;\n\n /** Enable placeholder when image is loading and when image fails to load */\n withPlaceholder?: boolean;\n\n /** Customize placeholder content */\n placeholder?: React.ReactNode;\n\n /** Props spread to img element */\n imageProps?: React.ComponentPropsWithoutRef<'img'>;\n\n /** Get image element ref */\n imageRef?: React.ForwardedRef<HTMLImageElement>;\n\n /** Image figcaption, displayed below image */\n caption?: React.ReactNode;\n}\n\nconst defaultProps: Partial<ImageProps> = {\n fit: 'cover',\n width: '100%',\n height: 'auto',\n radius: 0,\n};\n\nexport const Image = forwardRef<HTMLDivElement, ImageProps>((props: ImageProps, ref) => {\n const {\n className,\n alt,\n src,\n fit,\n width,\n height,\n radius,\n imageProps,\n withPlaceholder,\n placeholder,\n imageRef,\n classNames,\n styles,\n caption,\n unstyled,\n style,\n ...others\n } = useComponentDefaultProps('Image', defaultProps, props);\n const { classes, cx } = useStyles({ radius }, { classNames, styles, unstyled, name: 'Image' });\n const [error, setError] = useState(!src);\n const isPlaceholder = withPlaceholder && error;\n\n useDidUpdate(() => {\n setError(!src);\n }, [src]);\n\n return (\n <Box className={cx(classes.root, className)} ref={ref} style={{ width, ...style }} {...others}>\n <figure className={classes.figure}>\n <div className={classes.imageWrapper}>\n <img\n className={classes.image}\n src={src}\n alt={alt}\n style={{ objectFit: fit, width, height }}\n ref={imageRef}\n onError={(event) => {\n setError(true);\n typeof imageProps?.onError === 'function' && imageProps.onError(event);\n }}\n {...imageProps}\n />\n\n {isPlaceholder && (\n <div className={classes.placeholder} title={alt}>\n {placeholder || (\n <div>\n <ImageIcon style={{ width: 40, height: 40 }} />\n </div>\n )}\n </div>\n )}\n </div>\n\n {!!caption && (\n <Text component=\"figcaption\" size=\"sm\" align=\"center\" className={classes.caption}>\n {caption}\n </Text>\n )}\n </figure>\n </Box>\n );\n});\n\nImage.displayName = '@mantine/core/Image';\n","import { createStyles } from '@mantine/styles';\n\nexport interface ButtonGroupStylesParams {\n orientation: 'vertical' | 'horizontal';\n buttonBorderWidth: number;\n}\n\nexport default createStyles(\n (_theme, { orientation, buttonBorderWidth }: ButtonGroupStylesParams) => ({\n root: {\n display: 'flex',\n flexDirection: orientation === 'vertical' ? 'column' : 'row',\n\n '& [data-button]': {\n '&:first-of-type': {\n borderBottomRightRadius: 0,\n [orientation === 'vertical' ? 'borderBottomLeftRadius' : 'borderTopRightRadius']: 0,\n [orientation === 'vertical' ? 'borderBottomWidth' : 'borderRightWidth']:\n buttonBorderWidth / 2,\n },\n\n '&:last-of-type': {\n borderTopLeftRadius: 0,\n [orientation === 'vertical' ? 'borderTopRightRadius' : 'borderBottomLeftRadius']: 0,\n [orientation === 'vertical' ? 'borderTopWidth' : 'borderLeftWidth']:\n buttonBorderWidth / 2,\n },\n\n '&:not(:first-of-type):not(:last-of-type)': {\n borderRadius: 0,\n [orientation === 'vertical' ? 'borderTopWidth' : 'borderLeftWidth']:\n buttonBorderWidth / 2,\n [orientation === 'vertical' ? 'borderBottomWidth' : 'borderRightWidth']:\n buttonBorderWidth / 2,\n },\n\n '& + [data-button]': {\n [orientation === 'vertical' ? 'marginTop' : 'marginLeft']: -buttonBorderWidth,\n '@media (min-resolution: 192dpi)': {\n [orientation === 'vertical' ? 'marginTop' : 'marginLeft']: 0,\n },\n },\n },\n },\n })\n);\n","/* eslint-disable react/no-unused-prop-types */\nimport React, { forwardRef } from 'react';\nimport { DefaultProps, useComponentDefaultProps } from '@mantine/styles';\nimport { Box } from '../../Box';\nimport useStyles, { ButtonGroupStylesParams } from './ButtonGroup.styles';\n\nexport interface ButtonGroupProps\n extends DefaultProps<never, ButtonGroupStylesParams>,\n React.ComponentPropsWithoutRef<'div'> {\n /** <Button /> components */\n children?: React.ReactNode;\n\n /** Switch between vertical and horizontal orientation */\n orientation?: 'vertical' | 'horizontal';\n\n /** Child <Button /> border width in px */\n buttonBorderWidth?: number;\n}\n\nconst defaultProps: Partial<ButtonGroupProps> = {\n orientation: 'horizontal',\n buttonBorderWidth: 1,\n};\n\nexport const ButtonGroup = forwardRef<HTMLDivElement, ButtonGroupProps>((props, ref) => {\n const { className, orientation, buttonBorderWidth, unstyled, ...others } =\n useComponentDefaultProps('ButtonGroup', defaultProps, props);\n const { classes, cx } = useStyles(\n { orientation, buttonBorderWidth },\n { name: 'ButtonGroup', unstyled }\n );\n return <Box className={cx(classes.root, className)} ref={ref} {...others} />;\n});\n\nButtonGroup.displayName = '@mantine/core/ButtonGroup';\n","import { createStyles, MantineNumberSize, MantineSize, MantineTheme } from '@mantine/styles';\n\nexport type InputVariant = 'default' | 'filled' | 'unstyled';\n\nexport interface InputStylesParams {\n radius: MantineNumberSize;\n size: MantineSize;\n variant: InputVariant;\n multiline: boolean;\n invalid: boolean;\n rightSectionWidth: string | number;\n withRightSection: boolean;\n iconWidth: string | number;\n offsetBottom: boolean;\n offsetTop: boolean;\n pointer: boolean;\n}\n\nexport const sizes = {\n xs: 30,\n sm: 36,\n md: 42,\n lg: 50,\n xl: 60,\n};\n\ninterface GetVariantStylesInput {\n theme: MantineTheme;\n variant: InputVariant;\n}\n\nfunction getVariantStyles({ theme, variant }: GetVariantStylesInput) {\n if (variant === 'default') {\n return {\n border: `1px solid ${\n theme.colorScheme === 'dark' ? theme.colors.dark[4] : theme.colors.gray[4]\n }`,\n backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[6] : theme.white,\n transition: 'border-color 100ms ease',\n '&:focus, &:focus-within': theme.focusRingStyles.inputStyles(theme),\n };\n }\n\n if (variant === 'filled') {\n return {\n border: '1px solid transparent',\n backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[5] : theme.colors.gray[1],\n '&:focus, &:focus-within': theme.focusRingStyles.inputStyles(theme),\n };\n }\n\n return {\n borderWidth: 0,\n color: theme.colorScheme === 'dark' ? theme.colors.dark[0] : theme.black,\n backgroundColor: 'transparent',\n minHeight: 28,\n outline: 0,\n\n '&:focus, &:focus-within': {\n outline: 'none',\n borderColor: 'transparent',\n },\n\n '&:disabled': {\n backgroundColor: 'transparent',\n\n '&:focus, &:focus-within': {\n outline: 'none',\n borderColor: 'transparent',\n },\n },\n };\n}\n\nexport default createStyles(\n (\n theme,\n {\n size,\n multiline,\n radius,\n variant,\n invalid,\n rightSectionWidth,\n withRightSection,\n iconWidth,\n offsetBottom,\n offsetTop,\n pointer,\n }: InputStylesParams\n ) => {\n const invalidColor = theme.fn.variant({ variant: 'filled', color: 'red' }).background;\n const sizeStyles =\n variant === 'default' || variant === 'filled'\n ? {\n minHeight: theme.fn.size({ size, sizes }),\n paddingLeft: theme.fn.size({ size, sizes }) / 3,\n paddingRight: withRightSection ? rightSectionWidth : theme.fn.size({ size, sizes }) / 3,\n borderRadius: theme.fn.radius(radius),\n }\n : null;\n\n return {\n wrapper: {\n position: 'relative',\n marginTop: offsetTop ? `calc(${theme.spacing.xs}px / 2)` : undefined,\n marginBottom: offsetBottom ? `calc(${theme.spacing.xs}px / 2)` : undefined,\n },\n\n input: {\n ...theme.fn.fontStyles(),\n height: multiline\n ? variant === 'unstyled'\n ? undefined\n : 'auto'\n : theme.fn.size({ size, sizes }),\n WebkitTapHighlightColor: 'transparent',\n lineHeight: multiline ? theme.lineHeight : `${theme.fn.size({ size, sizes }) - 2}px`,\n appearance: 'none',\n resize: 'none',\n boxSizing: 'border-box',\n fontSize: theme.fn.size({ size, sizes: theme.fontSizes }),\n width: '100%',\n color: theme.colorScheme === 'dark' ? theme.colors.dark[0] : theme.black,\n display: 'block',\n textAlign: 'left',\n cursor: pointer ? 'pointer' : undefined,\n ...sizeStyles,\n\n '&:disabled': {\n backgroundColor:\n theme.colorScheme === 'dark' ? theme.colors.dark[6] : theme.colors.gray[1],\n color: theme.colors.dark[2],\n opacity: 0.6,\n cursor: 'not-allowed',\n\n '&::placeholder': {\n color: theme.colors.dark[2],\n },\n },\n\n '&::placeholder': {\n ...theme.fn.placeholderStyles(),\n opacity: 1,\n },\n\n '&::-webkit-inner-spin-button, &::-webkit-outer-spin-button, &::-webkit-search-decoration, &::-webkit-search-cancel-button, &::-webkit-search-results-button, &::-webkit-search-results-decoration':\n {\n appearance: 'none',\n },\n\n '&[type=number]': {\n MozAppearance: 'textfield',\n },\n\n ...getVariantStyles({ theme, variant }),\n },\n\n withIcon: {\n paddingLeft: typeof iconWidth === 'number' ? iconWidth : theme.fn.size({ size, sizes }),\n },\n\n invalid: {\n color: invalidColor,\n borderColor: invalidColor,\n\n '&::placeholder': {\n opacity: 1,\n color: invalidColor,\n },\n },\n\n disabled: {\n backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[6] : theme.colors.gray[1],\n color: theme.colors.dark[2],\n opacity: 0.6,\n cursor: 'not-allowed',\n\n '&::placeholder': {\n color: theme.colors.dark[2],\n },\n },\n\n icon: {\n pointerEvents: 'none',\n position: 'absolute',\n zIndex: 1,\n left: 0,\n top: 0,\n bottom: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: typeof iconWidth === 'number' ? iconWidth : theme.fn.size({ size, sizes }),\n color: invalid\n ? theme.colors.red[theme.colorScheme === 'dark' ? 6 : 7]\n : theme.colorScheme === 'dark'\n ? theme.colors.dark[2]\n : theme.colors.gray[5],\n },\n\n rightSection: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n right: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: rightSectionWidth,\n },\n };\n }\n);\n","import {\n createStyles,\n MantineSize,\n MantineNumberSize,\n MantineColor,\n MantineTheme,\n MantineGradient,\n CSSObject,\n} from '@mantine/styles';\nimport { INPUT_SIZES } from '../Input';\n\nexport const BUTTON_VARIANTS = [\n 'filled',\n 'outline',\n 'light',\n 'white',\n 'default',\n 'subtle',\n 'gradient',\n] as const;\n\nexport type ButtonVariant = typeof BUTTON_VARIANTS[number];\n\nexport interface ButtonStylesParams {\n color: MantineColor;\n size: MantineSize;\n radius: MantineNumberSize;\n fullWidth: boolean;\n compact: boolean;\n gradient: MantineGradient;\n variant: ButtonVariant;\n withRightIcon: boolean;\n withLeftIcon: boolean;\n}\n\nexport const sizes = {\n xs: { height: INPUT_SIZES.xs, paddingLeft: 14, paddingRight: 14 },\n sm: { height: INPUT_SIZES.sm, paddingLeft: 18, paddingRight: 18 },\n md: { height: INPUT_SIZES.md, paddingLeft: 22, paddingRight: 22 },\n lg: { height: INPUT_SIZES.lg, paddingLeft: 26, paddingRight: 26 },\n xl: { height: INPUT_SIZES.xl, paddingLeft: 32, paddingRight: 32 },\n 'compact-xs': { height: 22, paddingLeft: 7, paddingRight: 7 },\n 'compact-sm': { height: 26, paddingLeft: 8, paddingRight: 8 },\n 'compact-md': { height: 30, paddingLeft: 10, paddingRight: 10 },\n 'compact-lg': { height: 34, paddingLeft: 12, paddingRight: 12 },\n 'compact-xl': { height: 40, paddingLeft: 14, paddingRight: 14 },\n};\n\ninterface GetSizeStyles {\n compact: boolean;\n size: MantineSize;\n withLeftIcon: boolean;\n withRightIcon: boolean;\n}\n\nfunction getSizeStyles({ compact, size, withLeftIcon, withRightIcon }: GetSizeStyles): CSSObject {\n if (compact) {\n return sizes[`compact-${size}`];\n }\n\n const _sizes = sizes[size];\n\n return {\n ..._sizes,\n paddingLeft: withLeftIcon ? _sizes.paddingLeft / 1.5 : _sizes.paddingLeft,\n paddingRight: withRightIcon ? _sizes.paddingRight / 1.5 : _sizes.paddingRight,\n };\n}\n\nconst getWidthStyles = (fullWidth: boolean) => ({\n display: fullWidth ? 'block' : 'inline-block',\n width: fullWidth ? '100%' : 'auto',\n});\n\ninterface GetVariantStyles {\n theme: MantineTheme;\n color: MantineColor;\n variant: ButtonVariant;\n gradient: MantineGradient;\n}\n\nfunction getVariantStyles({ variant, theme, color, gradient }: GetVariantStyles) {\n const colors = theme.fn.variant({ color, variant, gradient });\n\n if (variant === 'gradient') {\n return {\n border: 0,\n backgroundImage: colors.background,\n color: colors.color,\n\n '&:hover': theme.fn.hover({\n backgroundSize: '200%',\n }),\n };\n }\n\n return {\n border: `1px solid ${colors.border}`,\n backgroundColor: colors.background,\n color: colors.color,\n ...theme.fn.hover({\n backgroundColor: colors.hover,\n }),\n };\n}\n\nexport default createStyles(\n (\n theme,\n {\n color,\n size,\n radius,\n fullWidth,\n compact,\n gradient,\n variant,\n withLeftIcon,\n withRightIcon,\n }: ButtonStylesParams\n ) => ({\n root: {\n ...getSizeStyles({ compact, size, withLeftIcon, withRightIcon }),\n ...theme.fn.fontStyles(),\n ...theme.fn.focusStyles(),\n ...getWidthStyles(fullWidth),\n borderRadius: theme.fn.radius(radius),\n fontWeight: 600,\n position: 'relative',\n lineHeight: 1,\n fontSize: theme.fn.size({ size, sizes: theme.fontSizes }),\n userSelect: 'none',\n cursor: 'pointer',\n ...getVariantStyles({ variant, theme, color, gradient }),\n\n '&:active': theme.activeStyles,\n\n '&:disabled, &[data-disabled]': {\n borderColor: 'transparent',\n backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[4] : theme.colors.gray[2],\n color: theme.colorScheme === 'dark' ? theme.colors.dark[6] : theme.colors.gray[5],\n cursor: 'not-allowed',\n backgroundImage: 'none',\n pointerEvents: 'none',\n\n '&:active': {\n transform: 'none',\n },\n },\n\n '&[data-loading]': {\n pointerEvents: 'none',\n\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n top: -1,\n left: -1,\n right: -1,\n bottom: -1,\n backgroundColor:\n theme.colorScheme === 'dark'\n ? theme.fn.rgba(theme.colors.dark[7], 0.5)\n : 'rgba(255, 255, 255, .5)',\n borderRadius: theme.fn.radius(radius),\n cursor: 'not-allowed',\n },\n },\n },\n\n icon: {\n display: 'flex',\n alignItems: 'center',\n },\n\n leftIcon: {\n marginRight: 10,\n },\n\n rightIcon: {\n marginLeft: 10,\n },\n\n centerLoader: {\n position: 'absolute',\n left: '50%',\n transform: 'translateX(-50%)',\n opacity: 0.5,\n },\n\n inner: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n overflow: 'visible',\n },\n\n label: {\n whiteSpace: 'nowrap',\n height: '100%',\n overflow: 'hidden',\n display: 'flex',\n alignItems: 'center',\n },\n })\n);\n","import React, { forwardRef } from 'react';\nimport {\n DefaultProps,\n MantineSize,\n MantineNumberSize,\n MantineGradient,\n MantineColor,\n Selectors,\n useComponentDefaultProps,\n} from '@mantine/styles';\nimport { createPolymorphicComponent } from '@mantine/utils';\nimport { UnstyledButton } from '../UnstyledButton';\nimport { Loader, LoaderProps } from '../Loader';\nimport { ButtonGroup } from './ButtonGroup/ButtonGroup';\nimport useStyles, { sizes, ButtonVariant, ButtonStylesParams } from './Button.styles';\n\nexport type ButtonStylesNames = Selectors<typeof useStyles>;\n\nexport interface ButtonProps extends DefaultProps<ButtonStylesNames, ButtonStylesParams> {\n /** Predefined button size */\n size?: MantineSize;\n\n /** Button type attribute */\n type?: 'submit' | 'button' | 'reset';\n\n /** Button color from theme */\n color?: MantineColor;\n\n /** Adds icon before button label */\n leftIcon?: React.ReactNode;\n\n /** Adds icon after button label */\n rightIcon?: React.ReactNode;\n\n /** Sets button width to 100% of parent element */\n fullWidth?: boolean;\n\n /** Button border-radius from theme or number to set border-radius in px */\n radius?: MantineNumberSize;\n\n /** Controls button appearance */\n variant?: ButtonVariant;\n\n /** Controls gradient settings in gradient variant only */\n gradient?: MantineGradient;\n\n /** Set text-transform to uppercase */\n uppercase?: boolean;\n\n /** Reduces vertical and horizontal spacing */\n compact?: boolean;\n\n /** Indicate loading state */\n loading?: boolean;\n\n /** Props spread to Loader component */\n loaderProps?: LoaderProps;\n\n /** Loader position relative to button label */\n loaderPosition?: 'left' | 'right' | 'center';\n\n /** Button label */\n children?: React.ReactNode;\n\n /** Disabled state */\n disabled?: boolean;\n}\n\nconst defaultProps: Partial<ButtonProps> = {\n size: 'sm',\n type: 'button',\n variant: 'filled',\n loaderPosition: 'left',\n};\n\nexport const _Button = forwardRef<HTMLButtonElement, ButtonProps>((props, ref) => {\n const {\n className,\n size,\n color,\n type,\n disabled,\n children,\n leftIcon,\n rightIcon,\n fullWidth,\n variant,\n radius,\n uppercase,\n compact,\n loading,\n loaderPosition,\n loaderProps,\n gradient,\n classNames,\n styles,\n unstyled,\n ...others\n } = useComponentDefaultProps('Button', defaultProps, props);\n\n const { classes, cx, theme } = useStyles(\n {\n radius,\n color,\n size,\n fullWidth,\n compact,\n gradient,\n variant,\n withLeftIcon: !!leftIcon,\n withRightIcon: !!rightIcon,\n },\n { name: 'Button', unstyled, classNames, styles }\n );\n\n const colors = theme.fn.variant({ color, variant });\n\n const loader = (\n <Loader\n color={colors.color}\n size={theme.fn.size({ size, sizes }).height / 2}\n {...loaderProps}\n />\n );\n\n return (\n <UnstyledButton\n className={cx(classes.root, className)}\n type={type}\n disabled={disabled}\n data-button\n data-disabled={disabled || undefined}\n data-loading={loading || undefined}\n ref={ref}\n unstyled={unstyled}\n {...others}\n >\n <div className={classes.inner}>\n {(leftIcon || (loading && loaderPosition === 'left')) && (\n <span className={cx(classes.icon, classes.leftIcon)}>\n {loading && loaderPosition === 'left' ? loader : leftIcon}\n </span>\n )}\n\n {loading && loaderPosition === 'center' && (\n <span className={classes.centerLoader}>{loader}</span>\n )}\n\n <span\n className={classes.label}\n style={{ textTransform: uppercase ? 'uppercase' : undefined }}\n >\n {children}\n </span>\n\n {(rightIcon || (loading && loaderPosition === 'right')) && (\n <span className={cx(classes.icon, classes.rightIcon)}>\n {loading && loaderPosition === 'right' ? loader : rightIcon}\n </span>\n )}\n </div>\n </UnstyledButton>\n );\n}) as any;\n\n_Button.displayName = '@mantine/core/Button';\n_Button.Group = ButtonGroup;\n\nexport const Button = createPolymorphicComponent<\n 'button',\n ButtonProps,\n { Group: typeof ButtonGroup }\n>(_Button);\n","import createReactComponent from '../createReactComponent';\nexport default createReactComponent('outline', 'star', 'IconStar', [[\"path\",{\"d\":\"M12 17.75l-6.172 3.245l1.179 -6.873l-5 -4.867l6.9 -1l3.086 -6.253l3.086 6.253l6.9 1l-5 4.867l1.179 6.873z\",\"key\":\"svg-0\"}]]);","import createReactComponent from '../createReactComponent';\nexport default createReactComponent('outline', 'calendar-time', 'IconCalendarTime', [[\"path\",{\"d\":\"M11.795 21h-6.795a2 2 0 0 1 -2 -2v-12a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v4\",\"key\":\"svg-0\"}],[\"path\",{\"d\":\"M18 18m-4 0a4 4 0 1 0 8 0a4 4 0 1 0 -8 0\",\"key\":\"svg-1\"}],[\"path\",{\"d\":\"M15 3v4\",\"key\":\"svg-2\"}],[\"path\",{\"d\":\"M7 3v4\",\"key\":\"svg-3\"}],[\"path\",{\"d\":\"M3 11h16\",\"key\":\"svg-4\"}],[\"path\",{\"d\":\"M18 16.496v1.504l1 1\",\"key\":\"svg-5\"}]]);","import createReactComponent from '../createReactComponent';\nexport default createReactComponent('outline', 'player-play', 'IconPlayerPlay', [[\"path\",{\"d\":\"M7 4v16l13 -8z\",\"key\":\"svg-0\"}]]);","var _desc, _defs, _g;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nfunction SvgTopten(_ref, svgRef) {\n let {\n title,\n titleId,\n ...props\n } = _ref;\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n xmlns: \"http://www.w3.org/2000/svg\",\n xmlnsXlink: \"http://www.w3.org/1999/xlink\",\n width: 1080,\n height: 1080,\n viewBox: \"0 0 1080 1080\",\n xmlSpace: \"preserve\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _desc || (_desc = /*#__PURE__*/React.createElement(\"desc\", null, \"Created with Fabric.js 5.2.4\")), _defs || (_defs = /*#__PURE__*/React.createElement(\"defs\", null)), /*#__PURE__*/React.createElement(\"g\", {\n transform: \"matrix(1 0 0 1 540 540)\",\n id: \"ac932512-146f-4350-9fe5-f3e728b36ea4\"\n }, /*#__PURE__*/React.createElement(\"rect\", {\n style: {\n stroke: \"none\",\n strokeWidth: 1,\n strokeDasharray: \"none\",\n strokeLinecap: \"butt\",\n strokeDashoffset: 0,\n strokeLinejoin: \"miter\",\n strokeMiterlimit: 4,\n fill: \"rgb(255,255,255)\",\n fillRule: \"nonzero\",\n opacity: 1,\n visibility: \"hidden\"\n },\n vectorEffect: \"non-scaling-stroke\",\n x: -540,\n y: -540,\n rx: 0,\n ry: 0,\n width: 1080,\n height: 1080\n })), _g || (_g = /*#__PURE__*/React.createElement(\"g\", {\n transform: \"matrix(1 0 0 1 540 540)\",\n id: \"1357df72-bb7d-4f1e-86d6-c1ab9cda8783\"\n })), /*#__PURE__*/React.createElement(\"g\", {\n transform: \"matrix(38.57 0 0 38.57 540 540)\"\n }, /*#__PURE__*/React.createElement(\"g\", {\n style: {}\n }, /*#__PURE__*/React.createElement(\"g\", {\n transform: \"matrix(1 0 0 1 0 0)\"\n }, /*#__PURE__*/React.createElement(\"rect\", {\n style: {\n stroke: \"none\",\n strokeWidth: 1,\n strokeDasharray: \"none\",\n strokeLinecap: \"butt\",\n strokeDashoffset: 0,\n strokeLinejoin: \"miter\",\n strokeMiterlimit: 4,\n fill: \"rgb(229,9,20)\",\n fillRule: \"nonzero\",\n opacity: 1\n },\n vectorEffect: \"non-scaling-stroke\",\n x: -14,\n y: -15,\n rx: 3,\n ry: 3,\n width: 28,\n height: 30\n })), /*#__PURE__*/React.createElement(\"g\", {\n transform: \"matrix(1 0 0 1 2.82 3.93)\"\n }, /*#__PURE__*/React.createElement(\"path\", {\n style: {\n stroke: \"none\",\n strokeWidth: 1,\n strokeDasharray: \"none\",\n strokeLinecap: \"butt\",\n strokeDashoffset: 0,\n strokeLinejoin: \"miter\",\n strokeMiterlimit: 4,\n fill: \"rgb(255,255,255)\",\n fillRule: \"nonzero\",\n opacity: 1\n },\n vectorEffect: \"non-scaling-stroke\",\n transform: \" translate(-16.82, -18.93)\",\n d: \"M 16.8211527 22.1690594 C 17.4133103 22.1690594 17.8777709 21.8857503 18.2145345 21.3197261 C 18.5512982 20.7531079 18.719977 19.9572291 18.719977 18.9309018 C 18.719977 17.9045745 18.5512982 17.1081018 18.2145345 16.5414836 C 17.8777709 15.9754594 17.4133103 15.6921503 16.8211527 15.6921503 C 16.2289952 15.6921503 15.7645345 15.9754594 15.427177 16.5414836 C 15.0904133 17.1081018 14.9223285 17.9045745 14.9223285 18.9309018 C 14.9223285 19.9572291 15.0904133 20.7531079 15.427177 21.3197261 C 15.7645345 21.8857503 16.2289952 22.1690594 16.8211527 22.1690594 M 16.8211527 24.0708533 C 15.9872618 24.0708533 15.2579042 23.8605988 14.6324861 23.4406836 C 14.0076618 23.0207685 13.5247891 22.4262352 13.1856497 21.6564897 C 12.8465103 20.8867442 12.6766436 19.9786109 12.6766436 18.9309018 C 12.6766436 17.8921018 12.8465103 16.9857503 13.1856497 16.2118473 C 13.5247891 15.4379442 14.0076618 14.8410352 14.6324861 14.4205261 C 15.2579042 14.0006109 15.9872618 13.7903564 16.8211527 13.7903564 C 17.6544497 13.7903564 18.3844012 14.0006109 19.0098194 14.4205261 C 19.6352376 14.8410352 20.1169224 15.4379442 20.4566558 16.2118473 C 20.7952012 16.9857503 20.9656618 17.8921018 20.9656618 18.9309018 C 20.9656618 19.9786109 20.7952012 20.8867442 20.4566558 21.6564897 C 20.1169224 22.4262352 19.6352376 23.0207685 19.0098194 23.4406836 C 18.3844012 23.8605988 17.6544497 24.0708533 16.8211527 24.0708533\",\n strokeLinecap: \"round\"\n })), /*#__PURE__*/React.createElement(\"g\", {\n transform: \"matrix(1 0 0 1 -5.02 3.88)\"\n }, /*#__PURE__*/React.createElement(\"polygon\", {\n style: {\n stroke: \"none\",\n strokeWidth: 1,\n strokeDasharray: \"none\",\n strokeLinecap: \"butt\",\n strokeDashoffset: 0,\n strokeLinejoin: \"miter\",\n strokeMiterlimit: 4,\n fill: \"rgb(255,255,255)\",\n fillRule: \"nonzero\",\n opacity: 1\n },\n vectorEffect: \"non-scaling-stroke\",\n points: \"-0.11,5.03 -0.11,-2.22 -2.1,-1.7 -2.1,-3.96 2.1,-5.03 2.1,5.03 \"\n })), /*#__PURE__*/React.createElement(\"g\", {\n transform: \"matrix(1 0 0 1 6.98 -5.47)\"\n }, /*#__PURE__*/React.createElement(\"path\", {\n style: {\n stroke: \"none\",\n strokeWidth: 1,\n strokeDasharray: \"none\",\n strokeLinecap: \"butt\",\n strokeDashoffset: 0,\n strokeLinejoin: \"miter\",\n strokeMiterlimit: 4,\n fill: \"rgb(255,255,255)\",\n fillRule: \"nonzero\",\n opacity: 1\n },\n vectorEffect: \"non-scaling-stroke\",\n transform: \" translate(-20.98, -9.53)\",\n d: \"M 20.0388194 9.42258545 L 20.8085648 9.42258545 C 21.1886861 9.42258545 21.4642739 9.34834303 21.6353285 9.19926424 C 21.806383 9.05077939 21.8919103 8.83993091 21.8919103 8.56731273 C 21.8919103 8.30122788 21.806383 8.09572485 21.6353285 7.94961576 C 21.4642739 7.80410061 21.1886861 7.73104606 20.8085648 7.73104606 L 20.0388194 7.73104606 L 20.0388194 9.42258545 Z M 18.2332436 12.8341733 L 18.2332436 6.22006424 L 21.0936558 6.22006424 C 21.6323588 6.22006424 22.0974133 6.31806424 22.4906012 6.51465818 C 22.8831952 6.71125212 23.1872921 6.98684 23.4028921 7.34142182 C 23.6178982 7.69659758 23.7259952 8.10522788 23.7259952 8.56731273 C 23.7259952 9.04246424 23.6178982 9.45762788 23.4028921 9.8122097 C 23.1872921 10.1667915 22.8831952 10.4429733 22.4906012 10.6389733 C 22.0974133 10.8355673 21.6323588 10.9335673 21.0936558 10.9335673 L 20.0388194 10.9335673 L 20.0388194 12.8341733 L 18.2332436 12.8341733 Z\",\n strokeLinecap: \"round\"\n })), /*#__PURE__*/React.createElement(\"g\", {\n transform: \"matrix(1 0 0 1 0.07 -5.47)\"\n }, /*#__PURE__*/React.createElement(\"path\", {\n style: {\n stroke: \"none\",\n strokeWidth: 1,\n strokeDasharray: \"none\",\n strokeLinecap: \"butt\",\n strokeDashoffset: 0,\n strokeLinejoin: \"miter\",\n strokeMiterlimit: 4,\n fill: \"rgb(255,255,255)\",\n fillRule: \"nonzero\",\n opacity: 1\n },\n vectorEffect: \"non-scaling-stroke\",\n transform: \" translate(-14.07, -9.53)\",\n d: \"M 14.0706788 11.3992752 C 14.3937818 11.3992752 14.6770909 11.322063 14.9212 11.1664509 C 15.1653091 11.0114327 15.3553697 10.792863 15.4913818 10.5107418 C 15.6279879 10.2286206 15.695697 9.90136 15.695697 9.52717818 C 15.695697 9.1535903 15.6279879 8.82573576 15.4913818 8.54361455 C 15.3553697 8.26149333 15.1653091 8.04351758 14.9212 7.88790545 C 14.6770909 7.73288727 14.3937818 7.65508121 14.0706788 7.65508121 C 13.7475758 7.65508121 13.4642667 7.73288727 13.2201576 7.88790545 C 12.9760485 8.04351758 12.7859879 8.26149333 12.6499758 8.54361455 C 12.5139636 8.82573576 12.4456606 9.1535903 12.4456606 9.52717818 C 12.4456606 9.90136 12.5139636 10.2286206 12.6499758 10.5107418 C 12.7859879 10.792863 12.9760485 11.0114327 13.2201576 11.1664509 C 13.4642667 11.322063 13.7475758 11.3992752 14.0706788 11.3992752 M 14.0706788 12.9957842 C 13.5634545 12.9957842 13.0995879 12.9090691 12.6784848 12.7344509 C 12.2573818 12.5604267 11.8915152 12.3163176 11.5808848 12.0027176 C 11.2708485 11.6891176 11.0314909 11.322063 10.8634061 10.9003661 C 10.6953212 10.479263 10.6115758 10.0213358 10.6115758 9.52717818 C 10.6115758 9.03302061 10.6953212 8.57568727 10.8634061 8.1539903 C 11.0314909 7.73288727 11.2708485 7.36523879 11.5808848 7.05163879 C 11.8915152 6.73803879 12.2573818 6.49452364 12.6784848 6.31990545 C 13.0995879 6.14588121 13.5634545 6.05857212 14.0706788 6.05857212 C 14.577903 6.05857212 15.0417697 6.14588121 15.4628727 6.31990545 C 15.8839758 6.49452364 16.2498424 6.73803879 16.5604727 7.05163879 C 16.871103 7.36523879 17.1098667 7.73288727 17.2779515 8.1539903 C 17.4460364 8.57568727 17.5297818 9.03302061 17.5297818 9.52717818 C 17.5297818 10.0213358 17.4460364 10.479263 17.2779515 10.9003661 C 17.1098667 11.322063 16.871103 11.6891176 16.5604727 12.0027176 C 16.2498424 12.3163176 15.8839758 12.5604267 15.4628727 12.7344509 C 15.0417697 12.9090691 14.577903 12.9957842 14.0706788 12.9957842\",\n strokeLinecap: \"round\"\n })), /*#__PURE__*/React.createElement(\"g\", {\n transform: \"matrix(1 0 0 1 -6.44 -5.26)\"\n }, /*#__PURE__*/React.createElement(\"polygon\", {\n style: {\n stroke: \"none\",\n strokeWidth: 1,\n strokeDasharray: \"none\",\n strokeLinecap: \"butt\",\n strokeDashoffset: 0,\n strokeLinejoin: \"miter\",\n strokeMiterlimit: 4,\n fill: \"rgb(255,255,255)\",\n fillRule: \"nonzero\",\n opacity: 1\n },\n vectorEffect: \"non-scaling-stroke\",\n points: \"0.9,3.09 -0.9,3.52 -0.9,-1.96 -2.91,-1.96 -2.91,-3.52 2.91,-3.52 2.91,-1.96 0.9,-1.96 \"\n })))));\n}\nconst ForwardRef = /*#__PURE__*/React.forwardRef(SvgTopten);\nexport default __webpack_public_path__ + \"static/media/topten.6f7371f9ba2525b92075b4fd4383da4d.svg\";\nexport { ForwardRef as ReactComponent };","import { Button, createStyles, Group, Image, Paper, Text, useMantineTheme } from \"@mantine/core\";\nimport { useMediaQuery } from \"@mantine/hooks\";\nimport { IconCalendarTime, IconPlayerPlay, IconStar } from \"@tabler/icons-react\";\nimport React from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { getAnimeTitleByRelevance, getImageByRelevance, getTmdbImageByRelevanceAndType, hasTmdbData } from \"../custom/AnimeData\";\n\nimport topTenImage from \"../assets/images/topten.svg\";\nimport { useLanguageStore } from \"../store/LanguageToggleStore\";\nimport { useShallow } from \"zustand/react/shallow\";\n\nconst useStyles = createStyles((theme) => ({\n sliderButton: {\n backgroundColor: \"rgba(255, 255, 255, 0.1)\",\n\n \"&:hover\": {\n backgroundColor: \"rgba(255,255,255,0.2)\",\n border: `1px solid rgba(255,255,255,0.4)`,\n },\n },\n sliderText: {\n display: \"flex\",\n position: \"absolute\",\n bottom: \"6em\",\n left: \"2em\",\n width: \"50%\",\n minHeight: \"fit-content\",\n padding: \"1em\",\n zIndex: \"3\",\n flexDirection: \"column\",\n height: \"70%\",\n justifyContent: \"center\",\n color: \"rgba(255,255,255,0.9)\",\n [`@media (max-width: ${theme.breakpoints.sm}px)`]: {\n width: \"90%\",\n },\n },\n sliderImageDiv: {\n backgroundSize: \"cover\",\n height: \"100%\",\n opacity: 0.5,\n },\n sliderFade: {\n position: \"absolute\",\n bottom: \"0\",\n left: \"0\",\n width: \"100%\",\n height: \"70%\",\n zIndex: \"1\",\n background: \"linear-gradient(0deg,#1A1B1E,transparent)\",\n opacity: \".9\",\n },\n logoImageDiv: {\n objectPosition: \"left\",\n color: \"red\",\n objectFit: \"scale-down\",\n marginBottom: \"10px\",\n },\n}));\n//Deprecated\nfunction HeaderSliderLayout({ anime, index }) {\n const { classes } = useStyles();\n const theme = useMantineTheme();\n const mobile = useMediaQuery(`(max-width: ${theme.breakpoints.xs}px)`);\n const { language } = useLanguageStore(useShallow((state) => ({ language: state.language })));\n\n return (\n <Paper sx={{ height: 800 }} className=\"slider-slide\">\n <Paper\n className={classes.sliderImageDiv}\n sx={{\n backgroundImage: `url(\"${\n mobile ? getImageByRelevance(anime.images, \"large_image_url\") : hasTmdbData(anime) ? getTmdbImageByRelevanceAndType(anime.tmdbData) : anime.bannerImage ? anime.bannerImage : getImageByRelevance(anime.images, \"image_url\")\n }\")`,\n }}\n ></Paper>\n <div className={classes.sliderText}>\n <Group display={\"flex\"} mb={\"xs\"} sx={{ gap: 10 }}>\n <Image src={topTenImage} width={32} height={32}></Image>\n <Text size={18}>{`#${index + 1} ${anime.type ? `in ${anime.type} shows today` : \"Trending\"}`}</Text>\n </Group>\n <Group sx={{ fontSize: 16 }} mb={\"xs\"}>\n <Group spacing={2}>\n <IconStar size={16} stroke={1.5} />\n <Text>{anime.score}</Text>\n </Group>\n <Group spacing={2}>\n <IconCalendarTime size={16} stroke={1.5} />\n <Text>{anime.aired.string.toString().split(\"to\")[0]}</Text>\n </Group>\n </Group>\n {!hasTmdbData(anime) || mobile ? (\n <Text lineClamp={1} size={56} lh={1.2} mb={\"xs\"}>\n {getAnimeTitleByRelevance(anime.titles, false, language)}\n </Text>\n ) : (\n <img src={getTmdbImageByRelevanceAndType(anime.tmdbData, \"logos\")} width=\"500\" height=\"150\" className={classes.logoImageDiv} alt=\"\" />\n )}\n\n <Text lineClamp={2} size={16}>{`Plot Summary: ${anime.synopsis}`}</Text>\n <Button fullWidth={false} size={\"md\"} sx={{ width: \"fit-content\", marginTop: \"15px\", padding: \"10px 50px\" }} radius={8} className={classes.sliderButton} component={Link} to={`/anime/${anime.slug}`}>\n <IconPlayerPlay size={16} stroke={1.5} />\n <Text sx={{ marginLeft: \"5px\" }}>Play</Text>\n </Button>\n </div>\n <Paper className={classes.sliderFade}></Paper>\n </Paper>\n );\n}\n\nexport default HeaderSliderLayout;\n","import React from 'react';\nimport { getTransitionStyles } from './get-transition-styles/get-transition-styles';\nimport { useTransition } from './use-transition';\nimport { MantineTransition } from './transitions';\n\nexport interface TransitionProps {\n /** Predefined transition name or transition styles */\n transition: MantineTransition;\n\n /** Transition duration in ms */\n duration?: number;\n\n /** Exit transition duration in ms */\n exitDuration?: number;\n\n /** Transition timing function, defaults to theme.transitionTimingFunction */\n timingFunction?: string;\n\n /** When true, component will be mounted */\n mounted: boolean;\n\n /** Render function with transition styles argument */\n children(styles: React.CSSProperties): React.ReactElement<any, any>;\n\n /** Calls when exit transition ends */\n onExited?: () => void;\n\n /** Calls when exit transition starts */\n onExit?: () => void;\n\n /** Calls when enter transition starts */\n onEnter?: () => void;\n\n /** Calls when enter transition ends */\n onEntered?: () => void;\n}\n\nexport function Transition({\n transition,\n duration = 250,\n exitDuration = duration,\n mounted,\n children,\n timingFunction,\n onExit,\n onEntered,\n onEnter,\n onExited,\n}: TransitionProps) {\n const { transitionDuration, transitionStatus, transitionTimingFunction } = useTransition({\n mounted,\n exitDuration,\n duration,\n timingFunction,\n onExit,\n onEntered,\n onEnter,\n onExited,\n });\n\n if (transitionDuration === 0) {\n return mounted ? <>{children({})}</> : null;\n }\n\n return transitionStatus === 'exited' ? null : (\n <>\n {children(\n getTransitionStyles({\n transition,\n duration: transitionDuration,\n state: transitionStatus,\n timingFunction: transitionTimingFunction,\n })\n )}\n </>\n );\n}\n\nTransition.displayName = '@mantine/core/Transition';\n","import React from 'react';\n\nexport function isElement(value: any): value is React.ReactElement {\n if (Array.isArray(value) || value === null) {\n return false;\n }\n\n if (typeof value === 'object') {\n if (value.type === React.Fragment) {\n return false;\n }\n\n return true;\n }\n\n return false;\n}\n","import React, { useCallback } from 'react';\nimport { assignRef } from '../utils';\n\ntype Ref<T> = React.Dispatch<React.SetStateAction<T>> | React.ForwardedRef<T>;\n\nexport function mergeRefs<T = any>(...refs: Ref<T>[]) {\n return (node: T | null) => {\n refs.forEach((ref) => assignRef(ref, node));\n };\n}\n\nexport function useMergedRef<T = any>(...refs: Ref<T>[]) {\n return useCallback(mergeRefs(...refs), refs);\n}\n","import React from 'react';\n\nexport function assignRef<T = any>(ref: React.ForwardedRef<T>, value: T | null) {\n if (typeof ref === 'function') {\n ref(value);\n } else if (typeof ref === 'object' && ref !== null && 'current' in ref) {\n // eslint-disable-next-line no-param-reassign\n ref.current = value;\n }\n}\n","function hasWindow() {\n return typeof window !== 'undefined';\n}\nfunction getNodeName(node) {\n if (isNode(node)) {\n return (node.nodeName || '').toLowerCase();\n }\n // Mocked nodes in testing environments may not be instances of Node. By\n // returning `#document` an infinite loop won't occur.\n // https://github.com/floating-ui/floating-ui/issues/2317\n return '#document';\n}\nfunction getWindow(node) {\n var _node$ownerDocument;\n return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window;\n}\nfunction getDocumentElement(node) {\n var _ref;\n return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement;\n}\nfunction isNode(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof Node || value instanceof getWindow(value).Node;\n}\nfunction isElement(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof Element || value instanceof getWindow(value).Element;\n}\nfunction isHTMLElement(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement;\n}\nfunction isShadowRoot(value) {\n if (!hasWindow() || typeof ShadowRoot === 'undefined') {\n return false;\n }\n return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot;\n}\nfunction isOverflowElement(element) {\n const {\n overflow,\n overflowX,\n overflowY,\n display\n } = getComputedStyle(element);\n return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && !['inline', 'contents'].includes(display);\n}\nfunction isTableElement(element) {\n return ['table', 'td', 'th'].includes(getNodeName(element));\n}\nfunction isTopLayer(element) {\n return [':popover-open', ':modal'].some(selector => {\n try {\n return element.matches(selector);\n } catch (e) {\n return false;\n }\n });\n}\nfunction isContainingBlock(elementOrCss) {\n const webkit = isWebKit();\n const css = isElement(elementOrCss) ? getComputedStyle(elementOrCss) : elementOrCss;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n // https://drafts.csswg.org/css-transforms-2/#individual-transforms\n return ['transform', 'translate', 'scale', 'rotate', 'perspective'].some(value => css[value] ? css[value] !== 'none' : false) || (css.containerType ? css.containerType !== 'normal' : false) || !webkit && (css.backdropFilter ? css.backdropFilter !== 'none' : false) || !webkit && (css.filter ? css.filter !== 'none' : false) || ['transform', 'translate', 'scale', 'rotate', 'perspective', 'filter'].some(value => (css.willChange || '').includes(value)) || ['paint', 'layout', 'strict', 'content'].some(value => (css.contain || '').includes(value));\n}\nfunction getContainingBlock(element) {\n let currentNode = getParentNode(element);\n while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) {\n if (isContainingBlock(currentNode)) {\n return currentNode;\n } else if (isTopLayer(currentNode)) {\n return null;\n }\n currentNode = getParentNode(currentNode);\n }\n return null;\n}\nfunction isWebKit() {\n if (typeof CSS === 'undefined' || !CSS.supports) return false;\n return CSS.supports('-webkit-backdrop-filter', 'none');\n}\nfunction isLastTraversableNode(node) {\n return ['html', 'body', '#document'].includes(getNodeName(node));\n}\nfunction getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}\nfunction getNodeScroll(element) {\n if (isElement(element)) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n }\n return {\n scrollLeft: element.scrollX,\n scrollTop: element.scrollY\n };\n}\nfunction getParentNode(node) {\n if (getNodeName(node) === 'html') {\n return node;\n }\n const result =\n // Step into the shadow DOM of the parent of a slotted node.\n node.assignedSlot ||\n // DOM Element detected.\n node.parentNode ||\n // ShadowRoot detected.\n isShadowRoot(node) && node.host ||\n // Fallback.\n getDocumentElement(node);\n return isShadowRoot(result) ? result.host : result;\n}\nfunction getNearestOverflowAncestor(node) {\n const parentNode = getParentNode(node);\n if (isLastTraversableNode(parentNode)) {\n return node.ownerDocument ? node.ownerDocument.body : node.body;\n }\n if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n return parentNode;\n }\n return getNearestOverflowAncestor(parentNode);\n}\nfunction getOverflowAncestors(node, list, traverseIframes) {\n var _node$ownerDocument2;\n if (list === void 0) {\n list = [];\n }\n if (traverseIframes === void 0) {\n traverseIframes = true;\n }\n const scrollableAncestor = getNearestOverflowAncestor(node);\n const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body);\n const win = getWindow(scrollableAncestor);\n if (isBody) {\n const frameElement = getFrameElement(win);\n return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []);\n }\n return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes));\n}\nfunction getFrameElement(win) {\n return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null;\n}\n\nexport { getComputedStyle, getContainingBlock, getDocumentElement, getFrameElement, getNearestOverflowAncestor, getNodeName, getNodeScroll, getOverflowAncestors, getParentNode, getWindow, isContainingBlock, isElement, isHTMLElement, isLastTraversableNode, isNode, isOverflowElement, isShadowRoot, isTableElement, isTopLayer, isWebKit };\n","/**\n * Custom positioning reference element.\n * @see https://floating-ui.com/docs/virtual-elements\n */\n\nconst sides = ['top', 'right', 'bottom', 'left'];\nconst alignments = ['start', 'end'];\nconst placements = /*#__PURE__*/sides.reduce((acc, side) => acc.concat(side, side + \"-\" + alignments[0], side + \"-\" + alignments[1]), []);\nconst min = Math.min;\nconst max = Math.max;\nconst round = Math.round;\nconst floor = Math.floor;\nconst createCoords = v => ({\n x: v,\n y: v\n});\nconst oppositeSideMap = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nconst oppositeAlignmentMap = {\n start: 'end',\n end: 'start'\n};\nfunction clamp(start, value, end) {\n return max(start, min(value, end));\n}\nfunction evaluate(value, param) {\n return typeof value === 'function' ? value(param) : value;\n}\nfunction getSide(placement) {\n return placement.split('-')[0];\n}\nfunction getAlignment(placement) {\n return placement.split('-')[1];\n}\nfunction getOppositeAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}\nfunction getAxisLength(axis) {\n return axis === 'y' ? 'height' : 'width';\n}\nfunction getSideAxis(placement) {\n return ['top', 'bottom'].includes(getSide(placement)) ? 'y' : 'x';\n}\nfunction getAlignmentAxis(placement) {\n return getOppositeAxis(getSideAxis(placement));\n}\nfunction getAlignmentSides(placement, rects, rtl) {\n if (rtl === void 0) {\n rtl = false;\n }\n const alignment = getAlignment(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const length = getAxisLength(alignmentAxis);\n let mainAlignmentSide = alignmentAxis === 'x' ? alignment === (rtl ? 'end' : 'start') ? 'right' : 'left' : alignment === 'start' ? 'bottom' : 'top';\n if (rects.reference[length] > rects.floating[length]) {\n mainAlignmentSide = getOppositePlacement(mainAlignmentSide);\n }\n return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)];\n}\nfunction getExpandedPlacements(placement) {\n const oppositePlacement = getOppositePlacement(placement);\n return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)];\n}\nfunction getOppositeAlignmentPlacement(placement) {\n return placement.replace(/start|end/g, alignment => oppositeAlignmentMap[alignment]);\n}\nfunction getSideList(side, isStart, rtl) {\n const lr = ['left', 'right'];\n const rl = ['right', 'left'];\n const tb = ['top', 'bottom'];\n const bt = ['bottom', 'top'];\n switch (side) {\n case 'top':\n case 'bottom':\n if (rtl) return isStart ? rl : lr;\n return isStart ? lr : rl;\n case 'left':\n case 'right':\n return isStart ? tb : bt;\n default:\n return [];\n }\n}\nfunction getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) {\n const alignment = getAlignment(placement);\n let list = getSideList(getSide(placement), direction === 'start', rtl);\n if (alignment) {\n list = list.map(side => side + \"-\" + alignment);\n if (flipAlignment) {\n list = list.concat(list.map(getOppositeAlignmentPlacement));\n }\n }\n return list;\n}\nfunction getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, side => oppositeSideMap[side]);\n}\nfunction expandPaddingObject(padding) {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n ...padding\n };\n}\nfunction getPaddingObject(padding) {\n return typeof padding !== 'number' ? expandPaddingObject(padding) : {\n top: padding,\n right: padding,\n bottom: padding,\n left: padding\n };\n}\nfunction rectToClientRect(rect) {\n const {\n x,\n y,\n width,\n height\n } = rect;\n return {\n width,\n height,\n top: y,\n left: x,\n right: x + width,\n bottom: y + height,\n x,\n y\n };\n}\n\nexport { alignments, clamp, createCoords, evaluate, expandPaddingObject, floor, getAlignment, getAlignmentAxis, getAlignmentSides, getAxisLength, getExpandedPlacements, getOppositeAlignmentPlacement, getOppositeAxis, getOppositeAxisPlacements, getOppositePlacement, getPaddingObject, getSide, getSideAxis, max, min, placements, rectToClientRect, round, sides };\n","import { getSideAxis, getAlignmentAxis, getAxisLength, getSide, getAlignment, evaluate, getPaddingObject, rectToClientRect, min, clamp, placements, getAlignmentSides, getOppositeAlignmentPlacement, getOppositePlacement, getExpandedPlacements, getOppositeAxisPlacements, sides, max, getOppositeAxis } from '@floating-ui/utils';\nexport { rectToClientRect } from '@floating-ui/utils';\n\nfunction computeCoordsFromPlacement(_ref, placement, rtl) {\n let {\n reference,\n floating\n } = _ref;\n const sideAxis = getSideAxis(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const alignLength = getAxisLength(alignmentAxis);\n const side = getSide(placement);\n const isVertical = sideAxis === 'y';\n const commonX = reference.x + reference.width / 2 - floating.width / 2;\n const commonY = reference.y + reference.height / 2 - floating.height / 2;\n const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2;\n let coords;\n switch (side) {\n case 'top':\n coords = {\n x: commonX,\n y: reference.y - floating.height\n };\n break;\n case 'bottom':\n coords = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n case 'right':\n coords = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n case 'left':\n coords = {\n x: reference.x - floating.width,\n y: commonY\n };\n break;\n default:\n coords = {\n x: reference.x,\n y: reference.y\n };\n }\n switch (getAlignment(placement)) {\n case 'start':\n coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n case 'end':\n coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n }\n return coords;\n}\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n *\n * This export does not have any `platform` interface logic. You will need to\n * write one for the platform you are using Floating UI with.\n */\nconst computePosition = async (reference, floating, config) => {\n const {\n placement = 'bottom',\n strategy = 'absolute',\n middleware = [],\n platform\n } = config;\n const validMiddleware = middleware.filter(Boolean);\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating));\n let rects = await platform.getElementRects({\n reference,\n floating,\n strategy\n });\n let {\n x,\n y\n } = computeCoordsFromPlacement(rects, placement, rtl);\n let statefulPlacement = placement;\n let middlewareData = {};\n let resetCount = 0;\n for (let i = 0; i < validMiddleware.length; i++) {\n const {\n name,\n fn\n } = validMiddleware[i];\n const {\n x: nextX,\n y: nextY,\n data,\n reset\n } = await fn({\n x,\n y,\n initialPlacement: placement,\n placement: statefulPlacement,\n strategy,\n middlewareData,\n rects,\n platform,\n elements: {\n reference,\n floating\n }\n });\n x = nextX != null ? nextX : x;\n y = nextY != null ? nextY : y;\n middlewareData = {\n ...middlewareData,\n [name]: {\n ...middlewareData[name],\n ...data\n }\n };\n if (reset && resetCount <= 50) {\n resetCount++;\n if (typeof reset === 'object') {\n if (reset.placement) {\n statefulPlacement = reset.placement;\n }\n if (reset.rects) {\n rects = reset.rects === true ? await platform.getElementRects({\n reference,\n floating,\n strategy\n }) : reset.rects;\n }\n ({\n x,\n y\n } = computeCoordsFromPlacement(rects, statefulPlacement, rtl));\n }\n i = -1;\n }\n }\n return {\n x,\n y,\n placement: statefulPlacement,\n strategy,\n middlewareData\n };\n};\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nasync function detectOverflow(state, options) {\n var _await$platform$isEle;\n if (options === void 0) {\n options = {};\n }\n const {\n x,\n y,\n platform,\n rects,\n elements,\n strategy\n } = state;\n const {\n boundary = 'clippingAncestors',\n rootBoundary = 'viewport',\n elementContext = 'floating',\n altBoundary = false,\n padding = 0\n } = evaluate(options, state);\n const paddingObject = getPaddingObject(padding);\n const altContext = elementContext === 'floating' ? 'reference' : 'floating';\n const element = elements[altBoundary ? altContext : elementContext];\n const clippingClientRect = rectToClientRect(await platform.getClippingRect({\n element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || (await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating))),\n boundary,\n rootBoundary,\n strategy\n }));\n const rect = elementContext === 'floating' ? {\n x,\n y,\n width: rects.floating.width,\n height: rects.floating.height\n } : rects.reference;\n const offsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating));\n const offsetScale = (await (platform.isElement == null ? void 0 : platform.isElement(offsetParent))) ? (await (platform.getScale == null ? void 0 : platform.getScale(offsetParent))) || {\n x: 1,\n y: 1\n } : {\n x: 1,\n y: 1\n };\n const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({\n elements,\n rect,\n offsetParent,\n strategy\n }) : rect);\n return {\n top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y,\n bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y,\n left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x,\n right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x\n };\n}\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = options => ({\n name: 'arrow',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n platform,\n elements,\n middlewareData\n } = state;\n // Since `element` is required, we don't Partial<> the type.\n const {\n element,\n padding = 0\n } = evaluate(options, state) || {};\n if (element == null) {\n return {};\n }\n const paddingObject = getPaddingObject(padding);\n const coords = {\n x,\n y\n };\n const axis = getAlignmentAxis(placement);\n const length = getAxisLength(axis);\n const arrowDimensions = await platform.getDimensions(element);\n const isYAxis = axis === 'y';\n const minProp = isYAxis ? 'top' : 'left';\n const maxProp = isYAxis ? 'bottom' : 'right';\n const clientProp = isYAxis ? 'clientHeight' : 'clientWidth';\n const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length];\n const startDiff = coords[axis] - rects.reference[axis];\n const arrowOffsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(element));\n let clientSize = arrowOffsetParent ? arrowOffsetParent[clientProp] : 0;\n\n // DOM platform can return `window` as the `offsetParent`.\n if (!clientSize || !(await (platform.isElement == null ? void 0 : platform.isElement(arrowOffsetParent)))) {\n clientSize = elements.floating[clientProp] || rects.floating[length];\n }\n const centerToReference = endDiff / 2 - startDiff / 2;\n\n // If the padding is large enough that it causes the arrow to no longer be\n // centered, modify the padding so that it is centered.\n const largestPossiblePadding = clientSize / 2 - arrowDimensions[length] / 2 - 1;\n const minPadding = min(paddingObject[minProp], largestPossiblePadding);\n const maxPadding = min(paddingObject[maxProp], largestPossiblePadding);\n\n // Make sure the arrow doesn't overflow the floating element if the center\n // point is outside the floating element's bounds.\n const min$1 = minPadding;\n const max = clientSize - arrowDimensions[length] - maxPadding;\n const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference;\n const offset = clamp(min$1, center, max);\n\n // If the reference is small enough that the arrow's padding causes it to\n // to point to nothing for an aligned placement, adjust the offset of the\n // floating element itself. To ensure `shift()` continues to take action,\n // a single reset is performed when this is true.\n const shouldAddOffset = !middlewareData.arrow && getAlignment(placement) != null && center !== offset && rects.reference[length] / 2 - (center < min$1 ? minPadding : maxPadding) - arrowDimensions[length] / 2 < 0;\n const alignmentOffset = shouldAddOffset ? center < min$1 ? center - min$1 : center - max : 0;\n return {\n [axis]: coords[axis] + alignmentOffset,\n data: {\n [axis]: offset,\n centerOffset: center - offset - alignmentOffset,\n ...(shouldAddOffset && {\n alignmentOffset\n })\n },\n reset: shouldAddOffset\n };\n }\n});\n\nfunction getPlacementList(alignment, autoAlignment, allowedPlacements) {\n const allowedPlacementsSortedByAlignment = alignment ? [...allowedPlacements.filter(placement => getAlignment(placement) === alignment), ...allowedPlacements.filter(placement => getAlignment(placement) !== alignment)] : allowedPlacements.filter(placement => getSide(placement) === placement);\n return allowedPlacementsSortedByAlignment.filter(placement => {\n if (alignment) {\n return getAlignment(placement) === alignment || (autoAlignment ? getOppositeAlignmentPlacement(placement) !== placement : false);\n }\n return true;\n });\n}\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'autoPlacement',\n options,\n async fn(state) {\n var _middlewareData$autoP, _middlewareData$autoP2, _placementsThatFitOnE;\n const {\n rects,\n middlewareData,\n placement,\n platform,\n elements\n } = state;\n const {\n crossAxis = false,\n alignment,\n allowedPlacements = placements,\n autoAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n const placements$1 = alignment !== undefined || allowedPlacements === placements ? getPlacementList(alignment || null, autoAlignment, allowedPlacements) : allowedPlacements;\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const currentIndex = ((_middlewareData$autoP = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP.index) || 0;\n const currentPlacement = placements$1[currentIndex];\n if (currentPlacement == null) {\n return {};\n }\n const alignmentSides = getAlignmentSides(currentPlacement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)));\n\n // Make `computeCoords` start from the right place.\n if (placement !== currentPlacement) {\n return {\n reset: {\n placement: placements$1[0]\n }\n };\n }\n const currentOverflows = [overflow[getSide(currentPlacement)], overflow[alignmentSides[0]], overflow[alignmentSides[1]]];\n const allOverflows = [...(((_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.overflows) || []), {\n placement: currentPlacement,\n overflows: currentOverflows\n }];\n const nextPlacement = placements$1[currentIndex + 1];\n\n // There are more placements to check.\n if (nextPlacement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n const placementsSortedByMostSpace = allOverflows.map(d => {\n const alignment = getAlignment(d.placement);\n return [d.placement, alignment && crossAxis ?\n // Check along the mainAxis and main crossAxis side.\n d.overflows.slice(0, 2).reduce((acc, v) => acc + v, 0) :\n // Check only the mainAxis.\n d.overflows[0], d.overflows];\n }).sort((a, b) => a[1] - b[1]);\n const placementsThatFitOnEachSide = placementsSortedByMostSpace.filter(d => d[2].slice(0,\n // Aligned placements should not check their opposite crossAxis\n // side.\n getAlignment(d[0]) ? 2 : 3).every(v => v <= 0));\n const resetPlacement = ((_placementsThatFitOnE = placementsThatFitOnEachSide[0]) == null ? void 0 : _placementsThatFitOnE[0]) || placementsSortedByMostSpace[0][0];\n if (resetPlacement !== placement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: resetPlacement\n }\n };\n }\n return {};\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'flip',\n options,\n async fn(state) {\n var _middlewareData$arrow, _middlewareData$flip;\n const {\n placement,\n middlewareData,\n rects,\n initialPlacement,\n platform,\n elements\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true,\n fallbackPlacements: specifiedFallbackPlacements,\n fallbackStrategy = 'bestFit',\n fallbackAxisSideDirection = 'none',\n flipAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n\n // If a reset by the arrow was caused due to an alignment offset being\n // added, we should skip any logic now since `flip()` has already done its\n // work.\n // https://github.com/floating-ui/floating-ui/issues/2549#issuecomment-1719601643\n if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n const side = getSide(placement);\n const initialSideAxis = getSideAxis(initialPlacement);\n const isBasePlacement = getSide(initialPlacement) === initialPlacement;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement));\n const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== 'none';\n if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) {\n fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl));\n }\n const placements = [initialPlacement, ...fallbackPlacements];\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const overflows = [];\n let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || [];\n if (checkMainAxis) {\n overflows.push(overflow[side]);\n }\n if (checkCrossAxis) {\n const sides = getAlignmentSides(placement, rects, rtl);\n overflows.push(overflow[sides[0]], overflow[sides[1]]);\n }\n overflowsData = [...overflowsData, {\n placement,\n overflows\n }];\n\n // One or more sides is overflowing.\n if (!overflows.every(side => side <= 0)) {\n var _middlewareData$flip2, _overflowsData$filter;\n const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1;\n const nextPlacement = placements[nextIndex];\n if (nextPlacement) {\n // Try next placement and re-run the lifecycle.\n return {\n data: {\n index: nextIndex,\n overflows: overflowsData\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n\n // First, find the candidates that fit on the mainAxis side of overflow,\n // then find the placement that fits the best on the main crossAxis side.\n let resetPlacement = (_overflowsData$filter = overflowsData.filter(d => d.overflows[0] <= 0).sort((a, b) => a.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement;\n\n // Otherwise fallback.\n if (!resetPlacement) {\n switch (fallbackStrategy) {\n case 'bestFit':\n {\n var _overflowsData$filter2;\n const placement = (_overflowsData$filter2 = overflowsData.filter(d => {\n if (hasFallbackAxisSideDirection) {\n const currentSideAxis = getSideAxis(d.placement);\n return currentSideAxis === initialSideAxis ||\n // Create a bias to the `y` side axis due to horizontal\n // reading directions favoring greater width.\n currentSideAxis === 'y';\n }\n return true;\n }).map(d => [d.placement, d.overflows.filter(overflow => overflow > 0).reduce((acc, overflow) => acc + overflow, 0)]).sort((a, b) => a[1] - b[1])[0]) == null ? void 0 : _overflowsData$filter2[0];\n if (placement) {\n resetPlacement = placement;\n }\n break;\n }\n case 'initialPlacement':\n resetPlacement = initialPlacement;\n break;\n }\n }\n if (placement !== resetPlacement) {\n return {\n reset: {\n placement: resetPlacement\n }\n };\n }\n }\n return {};\n }\n };\n};\n\nfunction getSideOffsets(overflow, rect) {\n return {\n top: overflow.top - rect.height,\n right: overflow.right - rect.width,\n bottom: overflow.bottom - rect.height,\n left: overflow.left - rect.width\n };\n}\nfunction isAnySideFullyClipped(overflow) {\n return sides.some(side => overflow[side] >= 0);\n}\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'hide',\n options,\n async fn(state) {\n const {\n rects\n } = state;\n const {\n strategy = 'referenceHidden',\n ...detectOverflowOptions\n } = evaluate(options, state);\n switch (strategy) {\n case 'referenceHidden':\n {\n const overflow = await detectOverflow(state, {\n ...detectOverflowOptions,\n elementContext: 'reference'\n });\n const offsets = getSideOffsets(overflow, rects.reference);\n return {\n data: {\n referenceHiddenOffsets: offsets,\n referenceHidden: isAnySideFullyClipped(offsets)\n }\n };\n }\n case 'escaped':\n {\n const overflow = await detectOverflow(state, {\n ...detectOverflowOptions,\n altBoundary: true\n });\n const offsets = getSideOffsets(overflow, rects.floating);\n return {\n data: {\n escapedOffsets: offsets,\n escaped: isAnySideFullyClipped(offsets)\n }\n };\n }\n default:\n {\n return {};\n }\n }\n }\n };\n};\n\nfunction getBoundingRect(rects) {\n const minX = min(...rects.map(rect => rect.left));\n const minY = min(...rects.map(rect => rect.top));\n const maxX = max(...rects.map(rect => rect.right));\n const maxY = max(...rects.map(rect => rect.bottom));\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY\n };\n}\nfunction getRectsByLine(rects) {\n const sortedRects = rects.slice().sort((a, b) => a.y - b.y);\n const groups = [];\n let prevRect = null;\n for (let i = 0; i < sortedRects.length; i++) {\n const rect = sortedRects[i];\n if (!prevRect || rect.y - prevRect.y > prevRect.height / 2) {\n groups.push([rect]);\n } else {\n groups[groups.length - 1].push(rect);\n }\n prevRect = rect;\n }\n return groups.map(rect => rectToClientRect(getBoundingRect(rect)));\n}\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'inline',\n options,\n async fn(state) {\n const {\n placement,\n elements,\n rects,\n platform,\n strategy\n } = state;\n // A MouseEvent's client{X,Y} coords can be up to 2 pixels off a\n // ClientRect's bounds, despite the event listener being triggered. A\n // padding of 2 seems to handle this issue.\n const {\n padding = 2,\n x,\n y\n } = evaluate(options, state);\n const nativeClientRects = Array.from((await (platform.getClientRects == null ? void 0 : platform.getClientRects(elements.reference))) || []);\n const clientRects = getRectsByLine(nativeClientRects);\n const fallback = rectToClientRect(getBoundingRect(nativeClientRects));\n const paddingObject = getPaddingObject(padding);\n function getBoundingClientRect() {\n // There are two rects and they are disjoined.\n if (clientRects.length === 2 && clientRects[0].left > clientRects[1].right && x != null && y != null) {\n // Find the first rect in which the point is fully inside.\n return clientRects.find(rect => x > rect.left - paddingObject.left && x < rect.right + paddingObject.right && y > rect.top - paddingObject.top && y < rect.bottom + paddingObject.bottom) || fallback;\n }\n\n // There are 2 or more connected rects.\n if (clientRects.length >= 2) {\n if (getSideAxis(placement) === 'y') {\n const firstRect = clientRects[0];\n const lastRect = clientRects[clientRects.length - 1];\n const isTop = getSide(placement) === 'top';\n const top = firstRect.top;\n const bottom = lastRect.bottom;\n const left = isTop ? firstRect.left : lastRect.left;\n const right = isTop ? firstRect.right : lastRect.right;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n const isLeftSide = getSide(placement) === 'left';\n const maxRight = max(...clientRects.map(rect => rect.right));\n const minLeft = min(...clientRects.map(rect => rect.left));\n const measureRects = clientRects.filter(rect => isLeftSide ? rect.left === minLeft : rect.right === maxRight);\n const top = measureRects[0].top;\n const bottom = measureRects[measureRects.length - 1].bottom;\n const left = minLeft;\n const right = maxRight;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n return fallback;\n }\n const resetRects = await platform.getElementRects({\n reference: {\n getBoundingClientRect\n },\n floating: elements.floating,\n strategy\n });\n if (rects.reference.x !== resetRects.reference.x || rects.reference.y !== resetRects.reference.y || rects.reference.width !== resetRects.reference.width || rects.reference.height !== resetRects.reference.height) {\n return {\n reset: {\n rects: resetRects\n }\n };\n }\n return {};\n }\n };\n};\n\n// For type backwards-compatibility, the `OffsetOptions` type was also\n// Derivable.\n\nasync function convertValueToCoords(state, options) {\n const {\n placement,\n platform,\n elements\n } = state;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isVertical = getSideAxis(placement) === 'y';\n const mainAxisMulti = ['left', 'top'].includes(side) ? -1 : 1;\n const crossAxisMulti = rtl && isVertical ? -1 : 1;\n const rawValue = evaluate(options, state);\n\n // eslint-disable-next-line prefer-const\n let {\n mainAxis,\n crossAxis,\n alignmentAxis\n } = typeof rawValue === 'number' ? {\n mainAxis: rawValue,\n crossAxis: 0,\n alignmentAxis: null\n } : {\n mainAxis: rawValue.mainAxis || 0,\n crossAxis: rawValue.crossAxis || 0,\n alignmentAxis: rawValue.alignmentAxis\n };\n if (alignment && typeof alignmentAxis === 'number') {\n crossAxis = alignment === 'end' ? alignmentAxis * -1 : alignmentAxis;\n }\n return isVertical ? {\n x: crossAxis * crossAxisMulti,\n y: mainAxis * mainAxisMulti\n } : {\n x: mainAxis * mainAxisMulti,\n y: crossAxis * crossAxisMulti\n };\n}\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = function (options) {\n if (options === void 0) {\n options = 0;\n }\n return {\n name: 'offset',\n options,\n async fn(state) {\n var _middlewareData$offse, _middlewareData$arrow;\n const {\n x,\n y,\n placement,\n middlewareData\n } = state;\n const diffCoords = await convertValueToCoords(state, options);\n\n // If the placement is the same and the arrow caused an alignment offset\n // then we don't need to change the positioning coordinates.\n if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n return {\n x: x + diffCoords.x,\n y: y + diffCoords.y,\n data: {\n ...diffCoords,\n placement\n }\n };\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'shift',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = false,\n limiter = {\n fn: _ref => {\n let {\n x,\n y\n } = _ref;\n return {\n x,\n y\n };\n }\n },\n ...detectOverflowOptions\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const crossAxis = getSideAxis(getSide(placement));\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n if (checkMainAxis) {\n const minSide = mainAxis === 'y' ? 'top' : 'left';\n const maxSide = mainAxis === 'y' ? 'bottom' : 'right';\n const min = mainAxisCoord + overflow[minSide];\n const max = mainAxisCoord - overflow[maxSide];\n mainAxisCoord = clamp(min, mainAxisCoord, max);\n }\n if (checkCrossAxis) {\n const minSide = crossAxis === 'y' ? 'top' : 'left';\n const maxSide = crossAxis === 'y' ? 'bottom' : 'right';\n const min = crossAxisCoord + overflow[minSide];\n const max = crossAxisCoord - overflow[maxSide];\n crossAxisCoord = clamp(min, crossAxisCoord, max);\n }\n const limitedCoords = limiter.fn({\n ...state,\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n });\n return {\n ...limitedCoords,\n data: {\n x: limitedCoords.x - x,\n y: limitedCoords.y - y,\n enabled: {\n [mainAxis]: checkMainAxis,\n [crossAxis]: checkCrossAxis\n }\n }\n };\n }\n };\n};\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n options,\n fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n middlewareData\n } = state;\n const {\n offset = 0,\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const crossAxis = getSideAxis(placement);\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n const rawOffset = evaluate(offset, state);\n const computedOffset = typeof rawOffset === 'number' ? {\n mainAxis: rawOffset,\n crossAxis: 0\n } : {\n mainAxis: 0,\n crossAxis: 0,\n ...rawOffset\n };\n if (checkMainAxis) {\n const len = mainAxis === 'y' ? 'height' : 'width';\n const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis;\n const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis;\n if (mainAxisCoord < limitMin) {\n mainAxisCoord = limitMin;\n } else if (mainAxisCoord > limitMax) {\n mainAxisCoord = limitMax;\n }\n }\n if (checkCrossAxis) {\n var _middlewareData$offse, _middlewareData$offse2;\n const len = mainAxis === 'y' ? 'width' : 'height';\n const isOriginSide = ['top', 'left'].includes(getSide(placement));\n const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse[crossAxis]) || 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis);\n const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : ((_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) || 0) - (isOriginSide ? computedOffset.crossAxis : 0);\n if (crossAxisCoord < limitMin) {\n crossAxisCoord = limitMin;\n } else if (crossAxisCoord > limitMax) {\n crossAxisCoord = limitMax;\n }\n }\n return {\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n };\n }\n };\n};\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'size',\n options,\n async fn(state) {\n var _state$middlewareData, _state$middlewareData2;\n const {\n placement,\n rects,\n platform,\n elements\n } = state;\n const {\n apply = () => {},\n ...detectOverflowOptions\n } = evaluate(options, state);\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isYAxis = getSideAxis(placement) === 'y';\n const {\n width,\n height\n } = rects.floating;\n let heightSide;\n let widthSide;\n if (side === 'top' || side === 'bottom') {\n heightSide = side;\n widthSide = alignment === ((await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))) ? 'start' : 'end') ? 'left' : 'right';\n } else {\n widthSide = side;\n heightSide = alignment === 'end' ? 'top' : 'bottom';\n }\n const maximumClippingHeight = height - overflow.top - overflow.bottom;\n const maximumClippingWidth = width - overflow.left - overflow.right;\n const overflowAvailableHeight = min(height - overflow[heightSide], maximumClippingHeight);\n const overflowAvailableWidth = min(width - overflow[widthSide], maximumClippingWidth);\n const noShift = !state.middlewareData.shift;\n let availableHeight = overflowAvailableHeight;\n let availableWidth = overflowAvailableWidth;\n if ((_state$middlewareData = state.middlewareData.shift) != null && _state$middlewareData.enabled.x) {\n availableWidth = maximumClippingWidth;\n }\n if ((_state$middlewareData2 = state.middlewareData.shift) != null && _state$middlewareData2.enabled.y) {\n availableHeight = maximumClippingHeight;\n }\n if (noShift && !alignment) {\n const xMin = max(overflow.left, 0);\n const xMax = max(overflow.right, 0);\n const yMin = max(overflow.top, 0);\n const yMax = max(overflow.bottom, 0);\n if (isYAxis) {\n availableWidth = width - 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right));\n } else {\n availableHeight = height - 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom));\n }\n }\n await apply({\n ...state,\n availableWidth,\n availableHeight\n });\n const nextDimensions = await platform.getDimensions(elements.floating);\n if (width !== nextDimensions.width || height !== nextDimensions.height) {\n return {\n reset: {\n rects: true\n }\n };\n }\n return {};\n }\n };\n};\n\nexport { arrow, autoPlacement, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, shift, size };\n","import { rectToClientRect, detectOverflow as detectOverflow$1, offset as offset$1, autoPlacement as autoPlacement$1, shift as shift$1, flip as flip$1, size as size$1, hide as hide$1, arrow as arrow$1, inline as inline$1, limitShift as limitShift$1, computePosition as computePosition$1 } from '@floating-ui/core';\nimport { round, createCoords, max, min, floor } from '@floating-ui/utils';\nimport { getComputedStyle, isHTMLElement, isElement, getWindow, isWebKit, getFrameElement, getNodeScroll, getDocumentElement, isTopLayer, getNodeName, isOverflowElement, getOverflowAncestors, getParentNode, isLastTraversableNode, isContainingBlock, isTableElement, getContainingBlock } from '@floating-ui/utils/dom';\nexport { getOverflowAncestors } from '@floating-ui/utils/dom';\n\nfunction getCssDimensions(element) {\n const css = getComputedStyle(element);\n // In testing environments, the `width` and `height` properties are empty\n // strings for SVG elements, returning NaN. Fallback to `0` in this case.\n let width = parseFloat(css.width) || 0;\n let height = parseFloat(css.height) || 0;\n const hasOffset = isHTMLElement(element);\n const offsetWidth = hasOffset ? element.offsetWidth : width;\n const offsetHeight = hasOffset ? element.offsetHeight : height;\n const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight;\n if (shouldFallback) {\n width = offsetWidth;\n height = offsetHeight;\n }\n return {\n width,\n height,\n $: shouldFallback\n };\n}\n\nfunction unwrapElement(element) {\n return !isElement(element) ? element.contextElement : element;\n}\n\nfunction getScale(element) {\n const domElement = unwrapElement(element);\n if (!isHTMLElement(domElement)) {\n return createCoords(1);\n }\n const rect = domElement.getBoundingClientRect();\n const {\n width,\n height,\n $\n } = getCssDimensions(domElement);\n let x = ($ ? round(rect.width) : rect.width) / width;\n let y = ($ ? round(rect.height) : rect.height) / height;\n\n // 0, NaN, or Infinity should always fallback to 1.\n\n if (!x || !Number.isFinite(x)) {\n x = 1;\n }\n if (!y || !Number.isFinite(y)) {\n y = 1;\n }\n return {\n x,\n y\n };\n}\n\nconst noOffsets = /*#__PURE__*/createCoords(0);\nfunction getVisualOffsets(element) {\n const win = getWindow(element);\n if (!isWebKit() || !win.visualViewport) {\n return noOffsets;\n }\n return {\n x: win.visualViewport.offsetLeft,\n y: win.visualViewport.offsetTop\n };\n}\nfunction shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) {\n return false;\n }\n return isFixed;\n}\n\nfunction getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n const clientRect = element.getBoundingClientRect();\n const domElement = unwrapElement(element);\n let scale = createCoords(1);\n if (includeScale) {\n if (offsetParent) {\n if (isElement(offsetParent)) {\n scale = getScale(offsetParent);\n }\n } else {\n scale = getScale(element);\n }\n }\n const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0);\n let x = (clientRect.left + visualOffsets.x) / scale.x;\n let y = (clientRect.top + visualOffsets.y) / scale.y;\n let width = clientRect.width / scale.x;\n let height = clientRect.height / scale.y;\n if (domElement) {\n const win = getWindow(domElement);\n const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent;\n let currentWin = win;\n let currentIFrame = getFrameElement(currentWin);\n while (currentIFrame && offsetParent && offsetWin !== currentWin) {\n const iframeScale = getScale(currentIFrame);\n const iframeRect = currentIFrame.getBoundingClientRect();\n const css = getComputedStyle(currentIFrame);\n const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x;\n const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y;\n x *= iframeScale.x;\n y *= iframeScale.y;\n width *= iframeScale.x;\n height *= iframeScale.y;\n x += left;\n y += top;\n currentWin = getWindow(currentIFrame);\n currentIFrame = getFrameElement(currentWin);\n }\n }\n return rectToClientRect({\n width,\n height,\n x,\n y\n });\n}\n\n// If <html> has a CSS width greater than the viewport, then this will be\n// incorrect for RTL.\nfunction getWindowScrollBarX(element, rect) {\n const leftScroll = getNodeScroll(element).scrollLeft;\n if (!rect) {\n return getBoundingClientRect(getDocumentElement(element)).left + leftScroll;\n }\n return rect.left + leftScroll;\n}\n\nfunction getHTMLOffset(documentElement, scroll, ignoreScrollbarX) {\n if (ignoreScrollbarX === void 0) {\n ignoreScrollbarX = false;\n }\n const htmlRect = documentElement.getBoundingClientRect();\n const x = htmlRect.left + scroll.scrollLeft - (ignoreScrollbarX ? 0 :\n // RTL <body> scrollbar.\n getWindowScrollBarX(documentElement, htmlRect));\n const y = htmlRect.top + scroll.scrollTop;\n return {\n x,\n y\n };\n}\n\nfunction convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {\n let {\n elements,\n rect,\n offsetParent,\n strategy\n } = _ref;\n const isFixed = strategy === 'fixed';\n const documentElement = getDocumentElement(offsetParent);\n const topLayer = elements ? isTopLayer(elements.floating) : false;\n if (offsetParent === documentElement || topLayer && isFixed) {\n return rect;\n }\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n let scale = createCoords(1);\n const offsets = createCoords(0);\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isHTMLElement(offsetParent)) {\n const offsetRect = getBoundingClientRect(offsetParent);\n scale = getScale(offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n }\n }\n const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll, true) : createCoords(0);\n return {\n width: rect.width * scale.x,\n height: rect.height * scale.y,\n x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x + htmlOffset.x,\n y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y + htmlOffset.y\n };\n}\n\nfunction getClientRects(element) {\n return Array.from(element.getClientRects());\n}\n\n// Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable.\nfunction getDocumentRect(element) {\n const html = getDocumentElement(element);\n const scroll = getNodeScroll(element);\n const body = element.ownerDocument.body;\n const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth);\n const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight);\n let x = -scroll.scrollLeft + getWindowScrollBarX(element);\n const y = -scroll.scrollTop;\n if (getComputedStyle(body).direction === 'rtl') {\n x += max(html.clientWidth, body.clientWidth) - width;\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\nfunction getViewportRect(element, strategy) {\n const win = getWindow(element);\n const html = getDocumentElement(element);\n const visualViewport = win.visualViewport;\n let width = html.clientWidth;\n let height = html.clientHeight;\n let x = 0;\n let y = 0;\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n const visualViewportBased = isWebKit();\n if (!visualViewportBased || visualViewportBased && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\n// Returns the inner client rect, subtracting scrollbars if present.\nfunction getInnerBoundingClientRect(element, strategy) {\n const clientRect = getBoundingClientRect(element, true, strategy === 'fixed');\n const top = clientRect.top + element.clientTop;\n const left = clientRect.left + element.clientLeft;\n const scale = isHTMLElement(element) ? getScale(element) : createCoords(1);\n const width = element.clientWidth * scale.x;\n const height = element.clientHeight * scale.y;\n const x = left * scale.x;\n const y = top * scale.y;\n return {\n width,\n height,\n x,\n y\n };\n}\nfunction getClientRectFromClippingAncestor(element, clippingAncestor, strategy) {\n let rect;\n if (clippingAncestor === 'viewport') {\n rect = getViewportRect(element, strategy);\n } else if (clippingAncestor === 'document') {\n rect = getDocumentRect(getDocumentElement(element));\n } else if (isElement(clippingAncestor)) {\n rect = getInnerBoundingClientRect(clippingAncestor, strategy);\n } else {\n const visualOffsets = getVisualOffsets(element);\n rect = {\n x: clippingAncestor.x - visualOffsets.x,\n y: clippingAncestor.y - visualOffsets.y,\n width: clippingAncestor.width,\n height: clippingAncestor.height\n };\n }\n return rectToClientRect(rect);\n}\nfunction hasFixedPositionAncestor(element, stopNode) {\n const parentNode = getParentNode(element);\n if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) {\n return false;\n }\n return getComputedStyle(parentNode).position === 'fixed' || hasFixedPositionAncestor(parentNode, stopNode);\n}\n\n// A \"clipping ancestor\" is an `overflow` element with the characteristic of\n// clipping (or hiding) child elements. This returns all clipping ancestors\n// of the given element up the tree.\nfunction getClippingElementAncestors(element, cache) {\n const cachedResult = cache.get(element);\n if (cachedResult) {\n return cachedResult;\n }\n let result = getOverflowAncestors(element, [], false).filter(el => isElement(el) && getNodeName(el) !== 'body');\n let currentContainingBlockComputedStyle = null;\n const elementIsFixed = getComputedStyle(element).position === 'fixed';\n let currentNode = elementIsFixed ? getParentNode(element) : element;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n while (isElement(currentNode) && !isLastTraversableNode(currentNode)) {\n const computedStyle = getComputedStyle(currentNode);\n const currentNodeIsContaining = isContainingBlock(currentNode);\n if (!currentNodeIsContaining && computedStyle.position === 'fixed') {\n currentContainingBlockComputedStyle = null;\n }\n const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === 'static' && !!currentContainingBlockComputedStyle && ['absolute', 'fixed'].includes(currentContainingBlockComputedStyle.position) || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode);\n if (shouldDropCurrentNode) {\n // Drop non-containing blocks.\n result = result.filter(ancestor => ancestor !== currentNode);\n } else {\n // Record last containing block for next iteration.\n currentContainingBlockComputedStyle = computedStyle;\n }\n currentNode = getParentNode(currentNode);\n }\n cache.set(element, result);\n return result;\n}\n\n// Gets the maximum area that the element is visible in due to any number of\n// clipping ancestors.\nfunction getClippingRect(_ref) {\n let {\n element,\n boundary,\n rootBoundary,\n strategy\n } = _ref;\n const elementClippingAncestors = boundary === 'clippingAncestors' ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary);\n const clippingAncestors = [...elementClippingAncestors, rootBoundary];\n const firstClippingAncestor = clippingAncestors[0];\n const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => {\n const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy));\n return {\n width: clippingRect.right - clippingRect.left,\n height: clippingRect.bottom - clippingRect.top,\n x: clippingRect.left,\n y: clippingRect.top\n };\n}\n\nfunction getDimensions(element) {\n const {\n width,\n height\n } = getCssDimensions(element);\n return {\n width,\n height\n };\n}\n\nfunction getRectRelativeToOffsetParent(element, offsetParent, strategy) {\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n const documentElement = getDocumentElement(offsetParent);\n const isFixed = strategy === 'fixed';\n const rect = getBoundingClientRect(element, true, isFixed, offsetParent);\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n const offsets = createCoords(0);\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isOffsetParentAnElement) {\n const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n } else if (documentElement) {\n // If the <body> scrollbar appears on the left (e.g. RTL systems). Use\n // Firefox with layout.scrollbar.side = 3 in about:config to test this.\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);\n const x = rect.left + scroll.scrollLeft - offsets.x - htmlOffset.x;\n const y = rect.top + scroll.scrollTop - offsets.y - htmlOffset.y;\n return {\n x,\n y,\n width: rect.width,\n height: rect.height\n };\n}\n\nfunction isStaticPositioned(element) {\n return getComputedStyle(element).position === 'static';\n}\n\nfunction getTrueOffsetParent(element, polyfill) {\n if (!isHTMLElement(element) || getComputedStyle(element).position === 'fixed') {\n return null;\n }\n if (polyfill) {\n return polyfill(element);\n }\n let rawOffsetParent = element.offsetParent;\n\n // Firefox returns the <html> element as the offsetParent if it's non-static,\n // while Chrome and Safari return the <body> element. The <body> element must\n // be used to perform the correct calculations even if the <html> element is\n // non-static.\n if (getDocumentElement(element) === rawOffsetParent) {\n rawOffsetParent = rawOffsetParent.ownerDocument.body;\n }\n return rawOffsetParent;\n}\n\n// Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\nfunction getOffsetParent(element, polyfill) {\n const win = getWindow(element);\n if (isTopLayer(element)) {\n return win;\n }\n if (!isHTMLElement(element)) {\n let svgOffsetParent = getParentNode(element);\n while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) {\n if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) {\n return svgOffsetParent;\n }\n svgOffsetParent = getParentNode(svgOffsetParent);\n }\n return win;\n }\n let offsetParent = getTrueOffsetParent(element, polyfill);\n while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) {\n offsetParent = getTrueOffsetParent(offsetParent, polyfill);\n }\n if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) {\n return win;\n }\n return offsetParent || getContainingBlock(element) || win;\n}\n\nconst getElementRects = async function (data) {\n const getOffsetParentFn = this.getOffsetParent || getOffsetParent;\n const getDimensionsFn = this.getDimensions;\n const floatingDimensions = await getDimensionsFn(data.floating);\n return {\n reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy),\n floating: {\n x: 0,\n y: 0,\n width: floatingDimensions.width,\n height: floatingDimensions.height\n }\n };\n};\n\nfunction isRTL(element) {\n return getComputedStyle(element).direction === 'rtl';\n}\n\nconst platform = {\n convertOffsetParentRelativeRectToViewportRelativeRect,\n getDocumentElement,\n getClippingRect,\n getOffsetParent,\n getElementRects,\n getClientRects,\n getDimensions,\n getScale,\n isElement,\n isRTL\n};\n\nfunction rectsAreEqual(a, b) {\n return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;\n}\n\n// https://samthor.au/2021/observing-dom/\nfunction observeMove(element, onMove) {\n let io = null;\n let timeoutId;\n const root = getDocumentElement(element);\n function cleanup() {\n var _io;\n clearTimeout(timeoutId);\n (_io = io) == null || _io.disconnect();\n io = null;\n }\n function refresh(skip, threshold) {\n if (skip === void 0) {\n skip = false;\n }\n if (threshold === void 0) {\n threshold = 1;\n }\n cleanup();\n const elementRectForRootMargin = element.getBoundingClientRect();\n const {\n left,\n top,\n width,\n height\n } = elementRectForRootMargin;\n if (!skip) {\n onMove();\n }\n if (!width || !height) {\n return;\n }\n const insetTop = floor(top);\n const insetRight = floor(root.clientWidth - (left + width));\n const insetBottom = floor(root.clientHeight - (top + height));\n const insetLeft = floor(left);\n const rootMargin = -insetTop + \"px \" + -insetRight + \"px \" + -insetBottom + \"px \" + -insetLeft + \"px\";\n const options = {\n rootMargin,\n threshold: max(0, min(1, threshold)) || 1\n };\n let isFirstUpdate = true;\n function handleObserve(entries) {\n const ratio = entries[0].intersectionRatio;\n if (ratio !== threshold) {\n if (!isFirstUpdate) {\n return refresh();\n }\n if (!ratio) {\n // If the reference is clipped, the ratio is 0. Throttle the refresh\n // to prevent an infinite loop of updates.\n timeoutId = setTimeout(() => {\n refresh(false, 1e-7);\n }, 1000);\n } else {\n refresh(false, ratio);\n }\n }\n if (ratio === 1 && !rectsAreEqual(elementRectForRootMargin, element.getBoundingClientRect())) {\n // It's possible that even though the ratio is reported as 1, the\n // element is not actually fully within the IntersectionObserver's root\n // area anymore. This can happen under performance constraints. This may\n // be a bug in the browser's IntersectionObserver implementation. To\n // work around this, we compare the element's bounding rect now with\n // what it was at the time we created the IntersectionObserver. If they\n // are not equal then the element moved, so we refresh.\n refresh();\n }\n isFirstUpdate = false;\n }\n\n // Older browsers don't support a `document` as the root and will throw an\n // error.\n try {\n io = new IntersectionObserver(handleObserve, {\n ...options,\n // Handle <iframe>s\n root: root.ownerDocument\n });\n } catch (e) {\n io = new IntersectionObserver(handleObserve, options);\n }\n io.observe(element);\n }\n refresh(true);\n return cleanup;\n}\n\n/**\n * Automatically updates the position of the floating element when necessary.\n * Should only be called when the floating element is mounted on the DOM or\n * visible on the screen.\n * @returns cleanup function that should be invoked when the floating element is\n * removed from the DOM or hidden from the screen.\n * @see https://floating-ui.com/docs/autoUpdate\n */\nfunction autoUpdate(reference, floating, update, options) {\n if (options === void 0) {\n options = {};\n }\n const {\n ancestorScroll = true,\n ancestorResize = true,\n elementResize = typeof ResizeObserver === 'function',\n layoutShift = typeof IntersectionObserver === 'function',\n animationFrame = false\n } = options;\n const referenceEl = unwrapElement(reference);\n const ancestors = ancestorScroll || ancestorResize ? [...(referenceEl ? getOverflowAncestors(referenceEl) : []), ...getOverflowAncestors(floating)] : [];\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.addEventListener('scroll', update, {\n passive: true\n });\n ancestorResize && ancestor.addEventListener('resize', update);\n });\n const cleanupIo = referenceEl && layoutShift ? observeMove(referenceEl, update) : null;\n let reobserveFrame = -1;\n let resizeObserver = null;\n if (elementResize) {\n resizeObserver = new ResizeObserver(_ref => {\n let [firstEntry] = _ref;\n if (firstEntry && firstEntry.target === referenceEl && resizeObserver) {\n // Prevent update loops when using the `size` middleware.\n // https://github.com/floating-ui/floating-ui/issues/1740\n resizeObserver.unobserve(floating);\n cancelAnimationFrame(reobserveFrame);\n reobserveFrame = requestAnimationFrame(() => {\n var _resizeObserver;\n (_resizeObserver = resizeObserver) == null || _resizeObserver.observe(floating);\n });\n }\n update();\n });\n if (referenceEl && !animationFrame) {\n resizeObserver.observe(referenceEl);\n }\n resizeObserver.observe(floating);\n }\n let frameId;\n let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null;\n if (animationFrame) {\n frameLoop();\n }\n function frameLoop() {\n const nextRefRect = getBoundingClientRect(reference);\n if (prevRefRect && !rectsAreEqual(prevRefRect, nextRefRect)) {\n update();\n }\n prevRefRect = nextRefRect;\n frameId = requestAnimationFrame(frameLoop);\n }\n update();\n return () => {\n var _resizeObserver2;\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.removeEventListener('scroll', update);\n ancestorResize && ancestor.removeEventListener('resize', update);\n });\n cleanupIo == null || cleanupIo();\n (_resizeObserver2 = resizeObserver) == null || _resizeObserver2.disconnect();\n resizeObserver = null;\n if (animationFrame) {\n cancelAnimationFrame(frameId);\n }\n };\n}\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nconst detectOverflow = detectOverflow$1;\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = offset$1;\n\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = autoPlacement$1;\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = shift$1;\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = flip$1;\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = size$1;\n\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = hide$1;\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = arrow$1;\n\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = inline$1;\n\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = limitShift$1;\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n */\nconst computePosition = (reference, floating, options) => {\n // This caches the expensive `getClippingElementAncestors` function so that\n // multiple lifecycle resets re-use the same result. It only lives for a\n // single call. If other functions become expensive, we can add them as well.\n const cache = new Map();\n const mergedOptions = {\n platform,\n ...options\n };\n const platformWithCache = {\n ...mergedOptions.platform,\n _c: cache\n };\n return computePosition$1(reference, floating, {\n ...mergedOptions,\n platform: platformWithCache\n });\n};\n\nexport { arrow, autoPlacement, autoUpdate, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, platform, shift, size };\n","import { arrow as arrow$1, computePosition } from '@floating-ui/dom';\nexport { autoPlacement, autoUpdate, computePosition, detectOverflow, flip, getOverflowAncestors, hide, inline, limitShift, offset, platform, shift, size } from '@floating-ui/dom';\nimport * as React from 'react';\nimport { useLayoutEffect, useEffect } from 'react';\nimport * as ReactDOM from 'react-dom';\n\n/**\n * A data provider that provides data to position an inner element of the\n * floating element (usually a triangle or caret) so that it is centered to the\n * reference element.\n * This wraps the core `arrow` middleware to allow React refs as the element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = options => {\n const {\n element,\n padding\n } = options;\n function isRef(value) {\n return Object.prototype.hasOwnProperty.call(value, 'current');\n }\n return {\n name: 'arrow',\n options,\n fn(args) {\n if (isRef(element)) {\n if (element.current != null) {\n return arrow$1({\n element: element.current,\n padding\n }).fn(args);\n }\n return {};\n } else if (element) {\n return arrow$1({\n element,\n padding\n }).fn(args);\n }\n return {};\n }\n };\n};\n\nvar index = typeof document !== 'undefined' ? useLayoutEffect : useEffect;\n\n// Fork of `fast-deep-equal` that only does the comparisons we need and compares\n// functions\nfunction deepEqual(a, b) {\n if (a === b) {\n return true;\n }\n if (typeof a !== typeof b) {\n return false;\n }\n if (typeof a === 'function' && a.toString() === b.toString()) {\n return true;\n }\n let length, i, keys;\n if (a && b && typeof a == 'object') {\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;) {\n if (!deepEqual(a[i], b[i])) {\n return false;\n }\n }\n return true;\n }\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) {\n return false;\n }\n for (i = length; i-- !== 0;) {\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) {\n return false;\n }\n }\n for (i = length; i-- !== 0;) {\n const key = keys[i];\n if (key === '_owner' && a.$$typeof) {\n continue;\n }\n if (!deepEqual(a[key], b[key])) {\n return false;\n }\n }\n return true;\n }\n return a !== a && b !== b;\n}\n\nfunction useLatestRef(value) {\n const ref = React.useRef(value);\n index(() => {\n ref.current = value;\n });\n return ref;\n}\n\n/**\n * Provides data to position a floating element.\n * @see https://floating-ui.com/docs/react\n */\nfunction useFloating(options) {\n if (options === void 0) {\n options = {};\n }\n const {\n placement = 'bottom',\n strategy = 'absolute',\n middleware = [],\n platform,\n whileElementsMounted,\n open\n } = options;\n const [data, setData] = React.useState({\n x: null,\n y: null,\n strategy,\n placement,\n middlewareData: {},\n isPositioned: false\n });\n const [latestMiddleware, setLatestMiddleware] = React.useState(middleware);\n if (!deepEqual(latestMiddleware, middleware)) {\n setLatestMiddleware(middleware);\n }\n const referenceRef = React.useRef(null);\n const floatingRef = React.useRef(null);\n const dataRef = React.useRef(data);\n const whileElementsMountedRef = useLatestRef(whileElementsMounted);\n const platformRef = useLatestRef(platform);\n const [reference, _setReference] = React.useState(null);\n const [floating, _setFloating] = React.useState(null);\n const setReference = React.useCallback(node => {\n if (referenceRef.current !== node) {\n referenceRef.current = node;\n _setReference(node);\n }\n }, []);\n const setFloating = React.useCallback(node => {\n if (floatingRef.current !== node) {\n floatingRef.current = node;\n _setFloating(node);\n }\n }, []);\n const update = React.useCallback(() => {\n if (!referenceRef.current || !floatingRef.current) {\n return;\n }\n const config = {\n placement,\n strategy,\n middleware: latestMiddleware\n };\n if (platformRef.current) {\n config.platform = platformRef.current;\n }\n computePosition(referenceRef.current, floatingRef.current, config).then(data => {\n const fullData = {\n ...data,\n isPositioned: true\n };\n if (isMountedRef.current && !deepEqual(dataRef.current, fullData)) {\n dataRef.current = fullData;\n ReactDOM.flushSync(() => {\n setData(fullData);\n });\n }\n });\n }, [latestMiddleware, placement, strategy, platformRef]);\n index(() => {\n if (open === false && dataRef.current.isPositioned) {\n dataRef.current.isPositioned = false;\n setData(data => ({\n ...data,\n isPositioned: false\n }));\n }\n }, [open]);\n const isMountedRef = React.useRef(false);\n index(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n };\n }, []);\n index(() => {\n if (reference && floating) {\n if (whileElementsMountedRef.current) {\n return whileElementsMountedRef.current(reference, floating, update);\n } else {\n update();\n }\n }\n }, [reference, floating, update, whileElementsMountedRef]);\n const refs = React.useMemo(() => ({\n reference: referenceRef,\n floating: floatingRef,\n setReference,\n setFloating\n }), [setReference, setFloating]);\n const elements = React.useMemo(() => ({\n reference,\n floating\n }), [reference, floating]);\n return React.useMemo(() => ({\n ...data,\n update,\n refs,\n elements,\n reference: setReference,\n floating: setFloating\n }), [data, update, refs, elements, setReference, setFloating]);\n}\n\nexport { arrow, useFloating };\n","import * as React from 'react';\nimport { useLayoutEffect, useEffect, useRef } from 'react';\nimport { hideOthers } from 'aria-hidden';\nimport { tabbable } from 'tabbable';\nimport { createPortal, flushSync } from 'react-dom';\nimport { getOverflowAncestors, offset, detectOverflow, useFloating as useFloating$1 } from '@floating-ui/react-dom';\nexport { arrow, autoPlacement, autoUpdate, computePosition, detectOverflow, flip, getOverflowAncestors, hide, inline, limitShift, offset, platform, shift, size } from '@floating-ui/react-dom';\n\nvar index = typeof document !== 'undefined' ? useLayoutEffect : useEffect;\n\nlet serverHandoffComplete = false;\nlet count = 0;\nconst genId = () => \"floating-ui-\" + count++;\nfunction useFloatingId() {\n const [id, setId] = React.useState(() => serverHandoffComplete ? genId() : undefined);\n index(() => {\n if (id == null) {\n setId(genId());\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n React.useEffect(() => {\n if (!serverHandoffComplete) {\n serverHandoffComplete = true;\n }\n }, []);\n return id;\n}\n\n// `toString()` prevents bundlers from trying to `import { useId } from 'react'`\nconst useReactId = React[/*#__PURE__*/'useId'.toString()];\n\n/**\n * Uses React 18's built-in `useId()` when available, or falls back to a\n * slightly less performant (requiring a double render) implementation for\n * earlier React versions.\n * @see https://floating-ui.com/docs/useId\n */\nconst useId = useReactId || useFloatingId;\n\nfunction createPubSub() {\n const map = new Map();\n return {\n emit(event, data) {\n var _map$get;\n (_map$get = map.get(event)) == null ? void 0 : _map$get.forEach(handler => handler(data));\n },\n on(event, listener) {\n map.set(event, [...(map.get(event) || []), listener]);\n },\n off(event, listener) {\n map.set(event, (map.get(event) || []).filter(l => l !== listener));\n }\n };\n}\n\nconst FloatingNodeContext = /*#__PURE__*/React.createContext(null);\nconst FloatingTreeContext = /*#__PURE__*/React.createContext(null);\nconst useFloatingParentNodeId = () => {\n var _React$useContext;\n return ((_React$useContext = React.useContext(FloatingNodeContext)) == null ? void 0 : _React$useContext.id) || null;\n};\nconst useFloatingTree = () => React.useContext(FloatingTreeContext);\n\n/**\n * Registers a node into the floating tree, returning its id.\n */\nconst useFloatingNodeId = customParentId => {\n const id = useId();\n const tree = useFloatingTree();\n const reactParentId = useFloatingParentNodeId();\n const parentId = customParentId || reactParentId;\n index(() => {\n const node = {\n id,\n parentId\n };\n tree == null ? void 0 : tree.addNode(node);\n return () => {\n tree == null ? void 0 : tree.removeNode(node);\n };\n }, [tree, id, parentId]);\n return id;\n};\n\n/**\n * Provides parent node context for nested floating elements.\n * @see https://floating-ui.com/docs/FloatingTree\n */\nconst FloatingNode = _ref => {\n let {\n children,\n id\n } = _ref;\n const parentId = useFloatingParentNodeId();\n return /*#__PURE__*/React.createElement(FloatingNodeContext.Provider, {\n value: React.useMemo(() => ({\n id,\n parentId\n }), [id, parentId])\n }, children);\n};\n\n/**\n * Provides context for nested floating elements when they are not children of\n * each other on the DOM (i.e. portalled to a common node, rather than their\n * respective parent).\n * @see https://floating-ui.com/docs/FloatingTree\n */\nconst FloatingTree = _ref2 => {\n let {\n children\n } = _ref2;\n const nodesRef = React.useRef([]);\n const addNode = React.useCallback(node => {\n nodesRef.current = [...nodesRef.current, node];\n }, []);\n const removeNode = React.useCallback(node => {\n nodesRef.current = nodesRef.current.filter(n => n !== node);\n }, []);\n const events = React.useState(() => createPubSub())[0];\n return /*#__PURE__*/React.createElement(FloatingTreeContext.Provider, {\n value: React.useMemo(() => ({\n nodesRef,\n addNode,\n removeNode,\n events\n }), [nodesRef, addNode, removeNode, events])\n }, children);\n};\n\nfunction getDocument(node) {\n return (node == null ? void 0 : node.ownerDocument) || document;\n}\n\n// Avoid Chrome DevTools blue warning.\nfunction getPlatform() {\n const uaData = navigator.userAgentData;\n if (uaData != null && uaData.platform) {\n return uaData.platform;\n }\n return navigator.platform;\n}\nfunction getUserAgent() {\n const uaData = navigator.userAgentData;\n if (uaData && Array.isArray(uaData.brands)) {\n return uaData.brands.map(_ref => {\n let {\n brand,\n version\n } = _ref;\n return brand + \"/\" + version;\n }).join(' ');\n }\n return navigator.userAgent;\n}\n\nfunction getWindow(value) {\n return getDocument(value).defaultView || window;\n}\nfunction isElement(value) {\n return value ? value instanceof getWindow(value).Element : false;\n}\nfunction isHTMLElement(value) {\n return value ? value instanceof getWindow(value).HTMLElement : false;\n}\nfunction isShadowRoot(node) {\n // Browsers without `ShadowRoot` support\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n const OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\n// License: https://github.com/adobe/react-spectrum/blob/b35d5c02fe900badccd0cf1a8f23bb593419f238/packages/@react-aria/utils/src/isVirtualEvent.ts\nfunction isVirtualClick(event) {\n if (event.mozInputSource === 0 && event.isTrusted) {\n return true;\n }\n const androidRe = /Android/i;\n if ((androidRe.test(getPlatform()) || androidRe.test(getUserAgent())) && event.pointerType) {\n return event.type === 'click' && event.buttons === 1;\n }\n return event.detail === 0 && !event.pointerType;\n}\nfunction isVirtualPointerEvent(event) {\n return event.width === 0 && event.height === 0 || event.width === 1 && event.height === 1 && event.pressure === 0 && event.detail === 0 && event.pointerType !== 'mouse' ||\n // iOS VoiceOver returns 0.333• for width/height.\n event.width < 1 && event.height < 1 && event.pressure === 0 && event.detail === 0;\n}\nfunction isSafari() {\n // Chrome DevTools does not complain about navigator.vendor\n return /apple/i.test(navigator.vendor);\n}\nfunction isMac() {\n return getPlatform().toLowerCase().startsWith('mac') && !navigator.maxTouchPoints;\n}\nfunction isMouseLikePointerType(pointerType, strict) {\n // On some Linux machines with Chromium, mouse inputs return a `pointerType`\n // of \"pen\": https://github.com/floating-ui/floating-ui/issues/2015\n const values = ['mouse', 'pen'];\n if (!strict) {\n values.push('', undefined);\n }\n return values.includes(pointerType);\n}\n\nfunction useLatestRef(value) {\n const ref = useRef(value);\n index(() => {\n ref.current = value;\n });\n return ref;\n}\n\nconst safePolygonIdentifier = 'data-floating-ui-safe-polygon';\nfunction getDelay(value, prop, pointerType) {\n if (pointerType && !isMouseLikePointerType(pointerType)) {\n return 0;\n }\n if (typeof value === 'number') {\n return value;\n }\n return value == null ? void 0 : value[prop];\n}\n/**\n * Opens the floating element while hovering over the reference element, like\n * CSS `:hover`.\n * @see https://floating-ui.com/docs/useHover\n */\nconst useHover = function (context, _temp) {\n let {\n enabled = true,\n delay = 0,\n handleClose = null,\n mouseOnly = false,\n restMs = 0,\n move = true\n } = _temp === void 0 ? {} : _temp;\n const {\n open,\n onOpenChange,\n dataRef,\n events,\n elements: {\n domReference,\n floating\n },\n refs\n } = context;\n const tree = useFloatingTree();\n const parentId = useFloatingParentNodeId();\n const handleCloseRef = useLatestRef(handleClose);\n const delayRef = useLatestRef(delay);\n const pointerTypeRef = React.useRef();\n const timeoutRef = React.useRef();\n const handlerRef = React.useRef();\n const restTimeoutRef = React.useRef();\n const blockMouseMoveRef = React.useRef(true);\n const performedPointerEventsMutationRef = React.useRef(false);\n const unbindMouseMoveRef = React.useRef(() => {});\n const isHoverOpen = React.useCallback(() => {\n var _dataRef$current$open;\n const type = (_dataRef$current$open = dataRef.current.openEvent) == null ? void 0 : _dataRef$current$open.type;\n return (type == null ? void 0 : type.includes('mouse')) && type !== 'mousedown';\n }, [dataRef]);\n\n // When dismissing before opening, clear the delay timeouts to cancel it\n // from showing.\n React.useEffect(() => {\n if (!enabled) {\n return;\n }\n function onDismiss() {\n clearTimeout(timeoutRef.current);\n clearTimeout(restTimeoutRef.current);\n blockMouseMoveRef.current = true;\n }\n events.on('dismiss', onDismiss);\n return () => {\n events.off('dismiss', onDismiss);\n };\n }, [enabled, events]);\n React.useEffect(() => {\n if (!enabled || !handleCloseRef.current || !open) {\n return;\n }\n function onLeave() {\n if (isHoverOpen()) {\n onOpenChange(false);\n }\n }\n const html = getDocument(floating).documentElement;\n html.addEventListener('mouseleave', onLeave);\n return () => {\n html.removeEventListener('mouseleave', onLeave);\n };\n }, [floating, open, onOpenChange, enabled, handleCloseRef, dataRef, isHoverOpen]);\n const closeWithDelay = React.useCallback(function (runElseBranch) {\n if (runElseBranch === void 0) {\n runElseBranch = true;\n }\n const closeDelay = getDelay(delayRef.current, 'close', pointerTypeRef.current);\n if (closeDelay && !handlerRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = setTimeout(() => onOpenChange(false), closeDelay);\n } else if (runElseBranch) {\n clearTimeout(timeoutRef.current);\n onOpenChange(false);\n }\n }, [delayRef, onOpenChange]);\n const cleanupMouseMoveHandler = React.useCallback(() => {\n unbindMouseMoveRef.current();\n handlerRef.current = undefined;\n }, []);\n const clearPointerEvents = React.useCallback(() => {\n if (performedPointerEventsMutationRef.current) {\n const body = getDocument(refs.floating.current).body;\n body.style.pointerEvents = '';\n body.removeAttribute(safePolygonIdentifier);\n performedPointerEventsMutationRef.current = false;\n }\n }, [refs]);\n\n // Registering the mouse events on the reference directly to bypass React's\n // delegation system. If the cursor was on a disabled element and then entered\n // the reference (no gap), `mouseenter` doesn't fire in the delegation system.\n React.useEffect(() => {\n if (!enabled) {\n return;\n }\n function isClickLikeOpenEvent() {\n return dataRef.current.openEvent ? ['click', 'mousedown'].includes(dataRef.current.openEvent.type) : false;\n }\n function onMouseEnter(event) {\n clearTimeout(timeoutRef.current);\n blockMouseMoveRef.current = false;\n if (mouseOnly && !isMouseLikePointerType(pointerTypeRef.current) || restMs > 0 && getDelay(delayRef.current, 'open') === 0) {\n return;\n }\n dataRef.current.openEvent = event;\n const openDelay = getDelay(delayRef.current, 'open', pointerTypeRef.current);\n if (openDelay) {\n timeoutRef.current = setTimeout(() => {\n onOpenChange(true);\n }, openDelay);\n } else {\n onOpenChange(true);\n }\n }\n function onMouseLeave(event) {\n if (isClickLikeOpenEvent()) {\n return;\n }\n unbindMouseMoveRef.current();\n const doc = getDocument(floating);\n clearTimeout(restTimeoutRef.current);\n if (handleCloseRef.current) {\n // Prevent clearing `onScrollMouseLeave` timeout.\n if (!open) {\n clearTimeout(timeoutRef.current);\n }\n handlerRef.current = handleCloseRef.current({\n ...context,\n tree,\n x: event.clientX,\n y: event.clientY,\n onClose() {\n clearPointerEvents();\n cleanupMouseMoveHandler();\n closeWithDelay();\n }\n });\n const handler = handlerRef.current;\n doc.addEventListener('mousemove', handler);\n unbindMouseMoveRef.current = () => {\n doc.removeEventListener('mousemove', handler);\n };\n return;\n }\n closeWithDelay();\n }\n\n // Ensure the floating element closes after scrolling even if the pointer\n // did not move.\n // https://github.com/floating-ui/floating-ui/discussions/1692\n function onScrollMouseLeave(event) {\n if (isClickLikeOpenEvent()) {\n return;\n }\n handleCloseRef.current == null ? void 0 : handleCloseRef.current({\n ...context,\n tree,\n x: event.clientX,\n y: event.clientY,\n onClose() {\n clearPointerEvents();\n cleanupMouseMoveHandler();\n closeWithDelay();\n }\n })(event);\n }\n if (isElement(domReference)) {\n const ref = domReference;\n open && ref.addEventListener('mouseleave', onScrollMouseLeave);\n floating == null ? void 0 : floating.addEventListener('mouseleave', onScrollMouseLeave);\n move && ref.addEventListener('mousemove', onMouseEnter, {\n once: true\n });\n ref.addEventListener('mouseenter', onMouseEnter);\n ref.addEventListener('mouseleave', onMouseLeave);\n return () => {\n open && ref.removeEventListener('mouseleave', onScrollMouseLeave);\n floating == null ? void 0 : floating.removeEventListener('mouseleave', onScrollMouseLeave);\n move && ref.removeEventListener('mousemove', onMouseEnter);\n ref.removeEventListener('mouseenter', onMouseEnter);\n ref.removeEventListener('mouseleave', onMouseLeave);\n };\n }\n }, [domReference, floating, enabled, context, mouseOnly, restMs, move, closeWithDelay, cleanupMouseMoveHandler, clearPointerEvents, onOpenChange, open, tree, delayRef, handleCloseRef, dataRef]);\n\n // Block pointer-events of every element other than the reference and floating\n // while the floating element is open and has a `handleClose` handler. Also\n // handles nested floating elements.\n // https://github.com/floating-ui/floating-ui/issues/1722\n index(() => {\n var _handleCloseRef$curre;\n if (!enabled) {\n return;\n }\n if (open && (_handleCloseRef$curre = handleCloseRef.current) != null && _handleCloseRef$curre.__options.blockPointerEvents && isHoverOpen()) {\n const body = getDocument(floating).body;\n body.setAttribute(safePolygonIdentifier, '');\n body.style.pointerEvents = 'none';\n performedPointerEventsMutationRef.current = true;\n if (isElement(domReference) && floating) {\n var _tree$nodesRef$curren, _tree$nodesRef$curren2;\n const ref = domReference;\n const parentFloating = tree == null ? void 0 : (_tree$nodesRef$curren = tree.nodesRef.current.find(node => node.id === parentId)) == null ? void 0 : (_tree$nodesRef$curren2 = _tree$nodesRef$curren.context) == null ? void 0 : _tree$nodesRef$curren2.elements.floating;\n if (parentFloating) {\n parentFloating.style.pointerEvents = '';\n }\n ref.style.pointerEvents = 'auto';\n floating.style.pointerEvents = 'auto';\n return () => {\n ref.style.pointerEvents = '';\n floating.style.pointerEvents = '';\n };\n }\n }\n }, [enabled, open, parentId, floating, domReference, tree, handleCloseRef, dataRef, isHoverOpen]);\n index(() => {\n if (!open) {\n pointerTypeRef.current = undefined;\n cleanupMouseMoveHandler();\n clearPointerEvents();\n }\n }, [open, cleanupMouseMoveHandler, clearPointerEvents]);\n React.useEffect(() => {\n return () => {\n cleanupMouseMoveHandler();\n clearTimeout(timeoutRef.current);\n clearTimeout(restTimeoutRef.current);\n clearPointerEvents();\n };\n }, [enabled, cleanupMouseMoveHandler, clearPointerEvents]);\n return React.useMemo(() => {\n if (!enabled) {\n return {};\n }\n function setPointerRef(event) {\n pointerTypeRef.current = event.pointerType;\n }\n return {\n reference: {\n onPointerDown: setPointerRef,\n onPointerEnter: setPointerRef,\n onMouseMove() {\n if (open || restMs === 0) {\n return;\n }\n clearTimeout(restTimeoutRef.current);\n restTimeoutRef.current = setTimeout(() => {\n if (!blockMouseMoveRef.current) {\n onOpenChange(true);\n }\n }, restMs);\n }\n },\n floating: {\n onMouseEnter() {\n clearTimeout(timeoutRef.current);\n },\n onMouseLeave() {\n events.emit('dismiss', {\n type: 'mouseLeave',\n data: {\n returnFocus: false\n }\n });\n closeWithDelay(false);\n }\n }\n };\n }, [events, enabled, restMs, open, onOpenChange, closeWithDelay]);\n};\n\nconst FloatingDelayGroupContext = /*#__PURE__*/React.createContext({\n delay: 0,\n initialDelay: 0,\n timeoutMs: 0,\n currentId: null,\n setCurrentId: () => {},\n setState: () => {},\n isInstantPhase: false\n});\nconst useDelayGroupContext = () => React.useContext(FloatingDelayGroupContext);\n\n/**\n * Provides context for a group of floating elements that should share a\n * `delay`.\n * @see https://floating-ui.com/docs/FloatingDelayGroup\n */\nconst FloatingDelayGroup = _ref => {\n let {\n children,\n delay,\n timeoutMs = 0\n } = _ref;\n const [state, setState] = React.useReducer((prev, next) => ({\n ...prev,\n ...next\n }), {\n delay,\n timeoutMs,\n initialDelay: delay,\n currentId: null,\n isInstantPhase: false\n });\n const initialCurrentIdRef = React.useRef(null);\n const setCurrentId = React.useCallback(currentId => {\n setState({\n currentId\n });\n }, []);\n index(() => {\n if (state.currentId) {\n if (initialCurrentIdRef.current === null) {\n initialCurrentIdRef.current = state.currentId;\n } else {\n setState({\n isInstantPhase: true\n });\n }\n } else {\n setState({\n isInstantPhase: false\n });\n initialCurrentIdRef.current = null;\n }\n }, [state.currentId]);\n return /*#__PURE__*/React.createElement(FloatingDelayGroupContext.Provider, {\n value: React.useMemo(() => ({\n ...state,\n setState,\n setCurrentId\n }), [state, setState, setCurrentId])\n }, children);\n};\nconst useDelayGroup = (_ref2, _ref3) => {\n let {\n open,\n onOpenChange\n } = _ref2;\n let {\n id\n } = _ref3;\n const {\n currentId,\n setCurrentId,\n initialDelay,\n setState,\n timeoutMs\n } = useDelayGroupContext();\n React.useEffect(() => {\n if (currentId) {\n setState({\n delay: {\n open: 1,\n close: getDelay(initialDelay, 'close')\n }\n });\n if (currentId !== id) {\n onOpenChange(false);\n }\n }\n }, [id, onOpenChange, setState, currentId, initialDelay]);\n React.useEffect(() => {\n function unset() {\n onOpenChange(false);\n setState({\n delay: initialDelay,\n currentId: null\n });\n }\n if (!open && currentId === id) {\n if (timeoutMs) {\n const timeout = window.setTimeout(unset, timeoutMs);\n return () => {\n clearTimeout(timeout);\n };\n } else {\n unset();\n }\n }\n }, [open, setState, currentId, id, onOpenChange, initialDelay, timeoutMs]);\n React.useEffect(() => {\n if (open) {\n setCurrentId(id);\n }\n }, [open, setCurrentId, id]);\n};\n\nfunction _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\n\n/**\n * Find the real active element. Traverses into shadowRoots.\n */\nfunction activeElement$1(doc) {\n let activeElement = doc.activeElement;\n while (((_activeElement = activeElement) == null ? void 0 : (_activeElement$shadow = _activeElement.shadowRoot) == null ? void 0 : _activeElement$shadow.activeElement) != null) {\n var _activeElement, _activeElement$shadow;\n activeElement = activeElement.shadowRoot.activeElement;\n }\n return activeElement;\n}\n\nfunction contains(parent, child) {\n if (!parent || !child) {\n return false;\n }\n const rootNode = child.getRootNode && child.getRootNode();\n\n // First, attempt with faster native method\n if (parent.contains(child)) {\n return true;\n }\n // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n let next = child;\n do {\n if (next && parent === next) {\n return true;\n }\n // @ts-ignore\n next = next.parentNode || next.host;\n } while (next);\n }\n\n // Give up, the result is false\n return false;\n}\n\nlet rafId = 0;\nfunction enqueueFocus(el, options) {\n if (options === void 0) {\n options = {};\n }\n const {\n preventScroll = false,\n cancelPrevious = true,\n sync = false\n } = options;\n cancelPrevious && cancelAnimationFrame(rafId);\n const exec = () => el == null ? void 0 : el.focus({\n preventScroll\n });\n if (sync) {\n exec();\n } else {\n rafId = requestAnimationFrame(exec);\n }\n}\n\nfunction getAncestors(nodes, id) {\n var _nodes$find;\n let allAncestors = [];\n let currentParentId = (_nodes$find = nodes.find(node => node.id === id)) == null ? void 0 : _nodes$find.parentId;\n while (currentParentId) {\n const currentNode = nodes.find(node => node.id === currentParentId);\n currentParentId = currentNode == null ? void 0 : currentNode.parentId;\n if (currentNode) {\n allAncestors = allAncestors.concat(currentNode);\n }\n }\n return allAncestors;\n}\n\nfunction getChildren(nodes, id) {\n let allChildren = nodes.filter(node => {\n var _node$context;\n return node.parentId === id && ((_node$context = node.context) == null ? void 0 : _node$context.open);\n }) || [];\n let currentChildren = allChildren;\n while (currentChildren.length) {\n currentChildren = nodes.filter(node => {\n var _currentChildren;\n return (_currentChildren = currentChildren) == null ? void 0 : _currentChildren.some(n => {\n var _node$context2;\n return node.parentId === n.id && ((_node$context2 = node.context) == null ? void 0 : _node$context2.open);\n });\n }) || [];\n allChildren = allChildren.concat(currentChildren);\n }\n return allChildren;\n}\n\nfunction getTarget(event) {\n if ('composedPath' in event) {\n return event.composedPath()[0];\n }\n\n // TS thinks `event` is of type never as it assumes all browsers support\n // `composedPath()`, but browsers without shadow DOM don't.\n return event.target;\n}\n\nconst TYPEABLE_SELECTOR = \"input:not([type='hidden']):not([disabled]),\" + \"[contenteditable]:not([contenteditable='false']),textarea:not([disabled])\";\nfunction isTypeableElement(element) {\n return isHTMLElement(element) && element.matches(TYPEABLE_SELECTOR);\n}\n\nfunction stopEvent(event) {\n event.preventDefault();\n event.stopPropagation();\n}\n\nconst getTabbableOptions = () => ({\n getShadowRoot: true,\n displayCheck:\n // JSDOM does not support the `tabbable` library. To solve this we can\n // check if `ResizeObserver` is a real function (not polyfilled), which\n // determines if the current environment is JSDOM-like.\n typeof ResizeObserver === 'function' && ResizeObserver.toString().includes('[native code]') ? 'full' : 'none'\n});\nfunction getTabbableIn(container, direction) {\n const allTabbable = tabbable(container, getTabbableOptions());\n if (direction === 'prev') {\n allTabbable.reverse();\n }\n const activeIndex = allTabbable.indexOf(activeElement$1(getDocument(container)));\n const nextTabbableElements = allTabbable.slice(activeIndex + 1);\n return nextTabbableElements[0];\n}\nfunction getNextTabbable() {\n return getTabbableIn(document.body, 'next');\n}\nfunction getPreviousTabbable() {\n return getTabbableIn(document.body, 'prev');\n}\nfunction isOutsideEvent(event, container) {\n const containerElement = container || event.currentTarget;\n const relatedTarget = event.relatedTarget;\n return !relatedTarget || !contains(containerElement, relatedTarget);\n}\nfunction disableFocusInside(container) {\n const tabbableElements = tabbable(container, getTabbableOptions());\n tabbableElements.forEach(element => {\n element.dataset.tabindex = element.getAttribute('tabindex') || '';\n element.setAttribute('tabindex', '-1');\n });\n}\nfunction enableFocusInside(container) {\n const elements = container.querySelectorAll('[data-tabindex]');\n elements.forEach(element => {\n const tabindex = element.dataset.tabindex;\n delete element.dataset.tabindex;\n if (tabindex) {\n element.setAttribute('tabindex', tabindex);\n } else {\n element.removeAttribute('tabindex');\n }\n });\n}\n\n// `toString()` prevents bundlers from trying to `import { useInsertionEffect } from 'react'`\nconst useInsertionEffect = React[/*#__PURE__*/'useInsertionEffect'.toString()];\nconst useSafeInsertionEffect = useInsertionEffect || (fn => fn());\nfunction useEvent(callback) {\n const ref = React.useRef(() => {\n if (process.env.NODE_ENV !== \"production\") {\n throw new Error('Cannot call an event handler while rendering.');\n }\n });\n useSafeInsertionEffect(() => {\n ref.current = callback;\n });\n return React.useCallback(function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n return ref.current == null ? void 0 : ref.current(...args);\n }, []);\n}\n\n// See Diego Haz's Sandbox for making this logic work well on Safari/iOS:\n// https://codesandbox.io/s/tabbable-portal-f4tng?file=/src/FocusTrap.tsx\n\nconst HIDDEN_STYLES = {\n border: 0,\n clip: 'rect(0 0 0 0)',\n height: '1px',\n margin: '-1px',\n overflow: 'hidden',\n padding: 0,\n position: 'fixed',\n whiteSpace: 'nowrap',\n width: '1px',\n top: 0,\n left: 0\n};\nlet activeElement;\nlet timeoutId;\nfunction setActiveElementOnTab(event) {\n if (event.key === 'Tab') {\n activeElement = event.target;\n clearTimeout(timeoutId);\n }\n}\nfunction isTabFocus(event) {\n const result = activeElement === event.relatedTarget;\n activeElement = event.relatedTarget;\n clearTimeout(timeoutId);\n return result;\n}\nconst FocusGuard = /*#__PURE__*/React.forwardRef(function FocusGuard(props, ref) {\n const onFocus = useEvent(props.onFocus);\n const [role, setRole] = React.useState();\n index(() => {\n if (isSafari()) {\n // Unlike other screen readers such as NVDA and JAWS, the virtual cursor\n // on VoiceOver does trigger the onFocus event, so we can use the focus\n // trap element. On Safari, only buttons trigger the onFocus event.\n // NB: \"group\" role in the Sandbox no longer appears to work, must be a\n // button role.\n setRole('button');\n }\n document.addEventListener('keydown', setActiveElementOnTab);\n return () => {\n document.removeEventListener('keydown', setActiveElementOnTab);\n };\n }, []);\n return /*#__PURE__*/React.createElement(\"span\", _extends({}, props, {\n ref: ref,\n tabIndex: 0\n // Role is only for VoiceOver\n ,\n role: role,\n \"aria-hidden\": role ? undefined : true,\n \"data-floating-ui-focus-guard\": \"\",\n style: HIDDEN_STYLES,\n onFocus: event => {\n if (isSafari() && isMac() && !isTabFocus(event)) {\n // On macOS we need to wait a little bit before moving\n // focus again.\n event.persist();\n timeoutId = window.setTimeout(() => {\n onFocus(event);\n }, 50);\n } else {\n onFocus(event);\n }\n }\n }));\n});\n\nconst PortalContext = /*#__PURE__*/React.createContext(null);\nconst useFloatingPortalNode = function (_temp) {\n let {\n id,\n enabled = true\n } = _temp === void 0 ? {} : _temp;\n const [portalEl, setPortalEl] = React.useState(null);\n const uniqueId = useId();\n const portalContext = usePortalContext();\n index(() => {\n if (!enabled) {\n return;\n }\n const rootNode = id ? document.getElementById(id) : null;\n if (rootNode) {\n rootNode.setAttribute('data-floating-ui-portal', '');\n setPortalEl(rootNode);\n } else {\n const newPortalEl = document.createElement('div');\n if (id !== '') {\n newPortalEl.id = id || uniqueId;\n }\n newPortalEl.setAttribute('data-floating-ui-portal', '');\n setPortalEl(newPortalEl);\n const container = (portalContext == null ? void 0 : portalContext.portalNode) || document.body;\n container.appendChild(newPortalEl);\n return () => {\n container.removeChild(newPortalEl);\n };\n }\n }, [id, portalContext, uniqueId, enabled]);\n return portalEl;\n};\n\n/**\n * Portals the floating element into a given container element — by default,\n * outside of the app root and into the body.\n * @see https://floating-ui.com/docs/FloatingPortal\n */\nconst FloatingPortal = _ref => {\n let {\n children,\n id,\n root = null,\n preserveTabOrder = true\n } = _ref;\n const portalNode = useFloatingPortalNode({\n id,\n enabled: !root\n });\n const [focusManagerState, setFocusManagerState] = React.useState(null);\n const beforeOutsideRef = React.useRef(null);\n const afterOutsideRef = React.useRef(null);\n const beforeInsideRef = React.useRef(null);\n const afterInsideRef = React.useRef(null);\n const shouldRenderGuards =\n // The FocusManager and therefore floating element are currently open/\n // rendered.\n !!focusManagerState &&\n // Guards are only for non-modal focus management.\n !focusManagerState.modal && !!(root || portalNode) && preserveTabOrder;\n\n // https://codesandbox.io/s/tabbable-portal-f4tng?file=/src/TabbablePortal.tsx\n React.useEffect(() => {\n if (!portalNode || !preserveTabOrder || focusManagerState != null && focusManagerState.modal) {\n return;\n }\n\n // Make sure elements inside the portal element are tabbable only when the\n // portal has already been focused, either by tabbing into a focus trap\n // element outside or using the mouse.\n function onFocus(event) {\n if (portalNode && isOutsideEvent(event)) {\n const focusing = event.type === 'focusin';\n const manageFocus = focusing ? enableFocusInside : disableFocusInside;\n manageFocus(portalNode);\n }\n }\n // Listen to the event on the capture phase so they run before the focus\n // trap elements onFocus prop is called.\n portalNode.addEventListener('focusin', onFocus, true);\n portalNode.addEventListener('focusout', onFocus, true);\n return () => {\n portalNode.removeEventListener('focusin', onFocus, true);\n portalNode.removeEventListener('focusout', onFocus, true);\n };\n }, [portalNode, preserveTabOrder, focusManagerState == null ? void 0 : focusManagerState.modal]);\n return /*#__PURE__*/React.createElement(PortalContext.Provider, {\n value: React.useMemo(() => ({\n preserveTabOrder,\n beforeOutsideRef,\n afterOutsideRef,\n beforeInsideRef,\n afterInsideRef,\n portalNode,\n setFocusManagerState\n }), [preserveTabOrder, portalNode])\n }, shouldRenderGuards && portalNode && /*#__PURE__*/React.createElement(FocusGuard, {\n \"data-type\": \"outside\",\n ref: beforeOutsideRef,\n onFocus: event => {\n if (isOutsideEvent(event, portalNode)) {\n var _beforeInsideRef$curr;\n (_beforeInsideRef$curr = beforeInsideRef.current) == null ? void 0 : _beforeInsideRef$curr.focus();\n } else {\n const prevTabbable = getPreviousTabbable() || (focusManagerState == null ? void 0 : focusManagerState.refs.domReference.current);\n prevTabbable == null ? void 0 : prevTabbable.focus();\n }\n }\n }), shouldRenderGuards && portalNode && /*#__PURE__*/React.createElement(\"span\", {\n \"aria-owns\": portalNode.id,\n style: HIDDEN_STYLES\n }), root ? /*#__PURE__*/createPortal(children, root) : portalNode ? /*#__PURE__*/createPortal(children, portalNode) : null, shouldRenderGuards && portalNode && /*#__PURE__*/React.createElement(FocusGuard, {\n \"data-type\": \"outside\",\n ref: afterOutsideRef,\n onFocus: event => {\n if (isOutsideEvent(event, portalNode)) {\n var _afterInsideRef$curre;\n (_afterInsideRef$curre = afterInsideRef.current) == null ? void 0 : _afterInsideRef$curre.focus();\n } else {\n const nextTabbable = getNextTabbable() || (focusManagerState == null ? void 0 : focusManagerState.refs.domReference.current);\n nextTabbable == null ? void 0 : nextTabbable.focus();\n (focusManagerState == null ? void 0 : focusManagerState.closeOnFocusOut) && (focusManagerState == null ? void 0 : focusManagerState.onOpenChange(false));\n }\n }\n }));\n};\nconst usePortalContext = () => React.useContext(PortalContext);\n\nconst VisuallyHiddenDismiss = /*#__PURE__*/React.forwardRef(function VisuallyHiddenDismiss(props, ref) {\n return /*#__PURE__*/React.createElement(\"button\", _extends({}, props, {\n type: \"button\",\n ref: ref,\n tabIndex: -1,\n style: HIDDEN_STYLES\n }));\n});\n/**\n * Provides focus management for the floating element.\n * @see https://floating-ui.com/docs/FloatingFocusManager\n */\nfunction FloatingFocusManager(_ref) {\n let {\n context,\n children,\n order = ['content'],\n guards = true,\n initialFocus = 0,\n returnFocus = true,\n modal = true,\n visuallyHiddenDismiss = false,\n closeOnFocusOut = true\n } = _ref;\n const {\n refs,\n nodeId,\n onOpenChange,\n events,\n dataRef,\n elements: {\n domReference,\n floating\n }\n } = context;\n const orderRef = useLatestRef(order);\n const tree = useFloatingTree();\n const portalContext = usePortalContext();\n const [tabbableContentLength, setTabbableContentLength] = React.useState(null);\n\n // Controlled by `useListNavigation`.\n const ignoreInitialFocus = typeof initialFocus === 'number' && initialFocus < 0;\n const startDismissButtonRef = React.useRef(null);\n const endDismissButtonRef = React.useRef(null);\n const preventReturnFocusRef = React.useRef(false);\n const previouslyFocusedElementRef = React.useRef(null);\n const isPointerDownRef = React.useRef(false);\n const isInsidePortal = portalContext != null;\n\n // If the reference is a combobox and is typeable (e.g. input/textarea),\n // there are different focus semantics. The guards should not be rendered, but\n // aria-hidden should be applied to all nodes still. Further, the visually\n // hidden dismiss button should only appear at the end of the list, not the\n // start.\n const isTypeableCombobox = domReference && domReference.getAttribute('role') === 'combobox' && isTypeableElement(domReference);\n const getTabbableContent = React.useCallback(function (container) {\n if (container === void 0) {\n container = floating;\n }\n return container ? tabbable(container, getTabbableOptions()) : [];\n }, [floating]);\n const getTabbableElements = React.useCallback(container => {\n const content = getTabbableContent(container);\n return orderRef.current.map(type => {\n if (domReference && type === 'reference') {\n return domReference;\n }\n if (floating && type === 'floating') {\n return floating;\n }\n return content;\n }).filter(Boolean).flat();\n }, [domReference, floating, orderRef, getTabbableContent]);\n React.useEffect(() => {\n if (!modal) {\n return;\n }\n function onKeyDown(event) {\n if (event.key === 'Tab') {\n // The focus guards have nothing to focus, so we need to stop the event.\n if (getTabbableContent().length === 0 && !isTypeableCombobox) {\n stopEvent(event);\n }\n const els = getTabbableElements();\n const target = getTarget(event);\n if (orderRef.current[0] === 'reference' && target === domReference) {\n stopEvent(event);\n if (event.shiftKey) {\n enqueueFocus(els[els.length - 1]);\n } else {\n enqueueFocus(els[1]);\n }\n }\n if (orderRef.current[1] === 'floating' && target === floating && event.shiftKey) {\n stopEvent(event);\n enqueueFocus(els[0]);\n }\n }\n }\n const doc = getDocument(floating);\n doc.addEventListener('keydown', onKeyDown);\n return () => {\n doc.removeEventListener('keydown', onKeyDown);\n };\n }, [domReference, floating, modal, orderRef, refs, isTypeableCombobox, getTabbableContent, getTabbableElements]);\n React.useEffect(() => {\n if (!closeOnFocusOut) {\n return;\n }\n\n // In Safari, buttons lose focus when pressing them.\n function handlePointerDown() {\n isPointerDownRef.current = true;\n setTimeout(() => {\n isPointerDownRef.current = false;\n });\n }\n function handleFocusOutside(event) {\n const relatedTarget = event.relatedTarget;\n const movedToUnrelatedNode = !(contains(domReference, relatedTarget) || contains(floating, relatedTarget) || contains(relatedTarget, floating) || contains(portalContext == null ? void 0 : portalContext.portalNode, relatedTarget) || relatedTarget != null && relatedTarget.hasAttribute('data-floating-ui-focus-guard') || tree && (getChildren(tree.nodesRef.current, nodeId).find(node => {\n var _node$context, _node$context2;\n return contains((_node$context = node.context) == null ? void 0 : _node$context.elements.floating, relatedTarget) || contains((_node$context2 = node.context) == null ? void 0 : _node$context2.elements.domReference, relatedTarget);\n }) || getAncestors(tree.nodesRef.current, nodeId).find(node => {\n var _node$context3, _node$context4;\n return ((_node$context3 = node.context) == null ? void 0 : _node$context3.elements.floating) === relatedTarget || ((_node$context4 = node.context) == null ? void 0 : _node$context4.elements.domReference) === relatedTarget;\n })));\n\n // Focus did not move inside the floating tree, and there are no tabbable\n // portal guards to handle closing.\n if (relatedTarget && movedToUnrelatedNode && !isPointerDownRef.current &&\n // Fix React 18 Strict Mode returnFocus due to double rendering.\n relatedTarget !== previouslyFocusedElementRef.current) {\n preventReturnFocusRef.current = true;\n // On iOS VoiceOver, dismissing the nested submenu will cause the\n // first item of the list to receive focus. Delaying it appears to fix\n // the issue.\n setTimeout(() => onOpenChange(false));\n }\n }\n if (floating && isHTMLElement(domReference)) {\n domReference.addEventListener('focusout', handleFocusOutside);\n domReference.addEventListener('pointerdown', handlePointerDown);\n !modal && floating.addEventListener('focusout', handleFocusOutside);\n return () => {\n domReference.removeEventListener('focusout', handleFocusOutside);\n domReference.removeEventListener('pointerdown', handlePointerDown);\n !modal && floating.removeEventListener('focusout', handleFocusOutside);\n };\n }\n }, [domReference, floating, modal, nodeId, tree, portalContext, onOpenChange, closeOnFocusOut]);\n React.useEffect(() => {\n var _portalContext$portal;\n // Don't hide portals nested within the parent portal.\n const portalNodes = Array.from((portalContext == null ? void 0 : (_portalContext$portal = portalContext.portalNode) == null ? void 0 : _portalContext$portal.querySelectorAll('[data-floating-ui-portal]')) || []);\n function getDismissButtons() {\n return [startDismissButtonRef.current, endDismissButtonRef.current].filter(Boolean);\n }\n if (floating && modal) {\n const insideNodes = [floating, ...portalNodes, ...getDismissButtons()];\n const cleanup = hideOthers(orderRef.current.includes('reference') || isTypeableCombobox ? insideNodes.concat(domReference || []) : insideNodes);\n return () => {\n cleanup();\n };\n }\n }, [domReference, floating, modal, orderRef, portalContext, isTypeableCombobox]);\n React.useEffect(() => {\n if (modal && !guards && floating) {\n const tabIndexValues = [];\n const options = getTabbableOptions();\n const allTabbable = tabbable(getDocument(floating).body, options);\n const floatingTabbable = getTabbableElements();\n\n // Exclude all tabbable elements that are part of the order\n const elements = allTabbable.filter(el => !floatingTabbable.includes(el));\n elements.forEach((el, i) => {\n tabIndexValues[i] = el.getAttribute('tabindex');\n el.setAttribute('tabindex', '-1');\n });\n return () => {\n elements.forEach((el, i) => {\n const value = tabIndexValues[i];\n if (value == null) {\n el.removeAttribute('tabindex');\n } else {\n el.setAttribute('tabindex', value);\n }\n });\n };\n }\n }, [floating, modal, guards, getTabbableElements]);\n index(() => {\n if (!floating) return;\n const doc = getDocument(floating);\n let returnFocusValue = returnFocus;\n let preventReturnFocusScroll = false;\n const previouslyFocusedElement = activeElement$1(doc);\n const contextData = dataRef.current;\n previouslyFocusedElementRef.current = previouslyFocusedElement;\n const focusableElements = getTabbableElements(floating);\n const elToFocus = (typeof initialFocus === 'number' ? focusableElements[initialFocus] : initialFocus.current) || floating;\n\n // If the `useListNavigation` hook is active, always ignore `initialFocus`\n // because it has its own handling of the initial focus.\n !ignoreInitialFocus && enqueueFocus(elToFocus, {\n preventScroll: elToFocus === floating\n });\n\n // Dismissing via outside press should always ignore `returnFocus` to\n // prevent unwanted scrolling.\n function onDismiss(payload) {\n if (payload.type === 'escapeKey' && refs.domReference.current) {\n previouslyFocusedElementRef.current = refs.domReference.current;\n }\n if (['referencePress', 'escapeKey'].includes(payload.type)) {\n return;\n }\n const returnFocus = payload.data.returnFocus;\n if (typeof returnFocus === 'object') {\n returnFocusValue = true;\n preventReturnFocusScroll = returnFocus.preventScroll;\n } else {\n returnFocusValue = returnFocus;\n }\n }\n events.on('dismiss', onDismiss);\n return () => {\n events.off('dismiss', onDismiss);\n if (contains(floating, activeElement$1(doc)) && refs.domReference.current) {\n previouslyFocusedElementRef.current = refs.domReference.current;\n }\n if (returnFocusValue && isHTMLElement(previouslyFocusedElementRef.current) && !preventReturnFocusRef.current) {\n // `isPointerDownRef.current` to avoid the focus ring from appearing on\n // the reference element when click-toggling it.\n if (!refs.domReference.current || isPointerDownRef.current) {\n enqueueFocus(previouslyFocusedElementRef.current, {\n // When dismissing nested floating elements, by the time the rAF has\n // executed, the menus will all have been unmounted. When they try\n // to get focused, the calls get ignored — leaving the root\n // reference focused as desired.\n cancelPrevious: false,\n preventScroll: preventReturnFocusScroll\n });\n } else {\n var _previouslyFocusedEle;\n // If the user has specified a `keydown` listener that calls\n // setOpen(false) (e.g. selecting an item and closing the floating\n // element), then sync return focus causes `useClick` to immediately\n // re-open it, unless they call `event.preventDefault()` in the\n // `keydown` listener. This helps keep backwards compatibility with\n // older examples.\n contextData.__syncReturnFocus = true;\n\n // In Safari, `useListNavigation` moves focus sync, so making this\n // sync ensures the initial item remains focused despite this being\n // invoked in Strict Mode due to double-invoked useEffects. This also\n // has the positive side effect of closing a modally focus-managed\n // <Menu> on `Tab` keydown to move naturally to the next focusable\n // element.\n (_previouslyFocusedEle = previouslyFocusedElementRef.current) == null ? void 0 : _previouslyFocusedEle.focus({\n preventScroll: preventReturnFocusScroll\n });\n setTimeout(() => {\n // This isn't an actual property the user should access, make sure\n // it doesn't persist.\n delete contextData.__syncReturnFocus;\n });\n }\n }\n };\n }, [floating, getTabbableElements, initialFocus, returnFocus, dataRef, refs, events, ignoreInitialFocus]);\n\n // Synchronize the `context` & `modal` value to the FloatingPortal context.\n // It will decide whether or not it needs to render its own guards.\n index(() => {\n if (!portalContext) return;\n portalContext.setFocusManagerState({\n ...context,\n modal,\n closeOnFocusOut\n // Not concerned about the <RT> generic type.\n });\n\n return () => {\n portalContext.setFocusManagerState(null);\n };\n }, [portalContext, modal, closeOnFocusOut, context]);\n index(() => {\n if (ignoreInitialFocus || !floating) return;\n function setState() {\n setTabbableContentLength(getTabbableContent().length);\n }\n setState();\n if (typeof MutationObserver === 'function') {\n const observer = new MutationObserver(setState);\n observer.observe(floating, {\n childList: true,\n subtree: true\n });\n return () => {\n observer.disconnect();\n };\n }\n }, [floating, getTabbableContent, ignoreInitialFocus, refs]);\n const shouldRenderGuards = guards && (isInsidePortal || modal) && !isTypeableCombobox;\n function renderDismissButton(location) {\n return visuallyHiddenDismiss && modal ? /*#__PURE__*/React.createElement(VisuallyHiddenDismiss, {\n ref: location === 'start' ? startDismissButtonRef : endDismissButtonRef,\n onClick: () => onOpenChange(false)\n }, typeof visuallyHiddenDismiss === 'string' ? visuallyHiddenDismiss : 'Dismiss') : null;\n }\n return /*#__PURE__*/React.createElement(React.Fragment, null, shouldRenderGuards && /*#__PURE__*/React.createElement(FocusGuard, {\n \"data-type\": \"inside\",\n ref: portalContext == null ? void 0 : portalContext.beforeInsideRef,\n onFocus: event => {\n if (modal) {\n const els = getTabbableElements();\n enqueueFocus(order[0] === 'reference' ? els[0] : els[els.length - 1]);\n } else if (portalContext != null && portalContext.preserveTabOrder && portalContext.portalNode) {\n preventReturnFocusRef.current = false;\n if (isOutsideEvent(event, portalContext.portalNode)) {\n const nextTabbable = getNextTabbable() || domReference;\n nextTabbable == null ? void 0 : nextTabbable.focus();\n } else {\n var _portalContext$before;\n (_portalContext$before = portalContext.beforeOutsideRef.current) == null ? void 0 : _portalContext$before.focus();\n }\n }\n }\n }), isTypeableCombobox ? null : renderDismissButton('start'), /*#__PURE__*/React.cloneElement(children, tabbableContentLength === 0 || order.includes('floating') ? {\n tabIndex: 0\n } : {}), renderDismissButton('end'), shouldRenderGuards && /*#__PURE__*/React.createElement(FocusGuard, {\n \"data-type\": \"inside\",\n ref: portalContext == null ? void 0 : portalContext.afterInsideRef,\n onFocus: event => {\n if (modal) {\n enqueueFocus(getTabbableElements()[0]);\n } else if (portalContext != null && portalContext.preserveTabOrder && portalContext.portalNode) {\n preventReturnFocusRef.current = true;\n if (isOutsideEvent(event, portalContext.portalNode)) {\n const prevTabbable = getPreviousTabbable() || domReference;\n prevTabbable == null ? void 0 : prevTabbable.focus();\n } else {\n var _portalContext$afterO;\n (_portalContext$afterO = portalContext.afterOutsideRef.current) == null ? void 0 : _portalContext$afterO.focus();\n }\n }\n }\n }));\n}\n\nconst identifier = 'data-floating-ui-scroll-lock';\n\n/**\n * Provides base styling for a fixed overlay element to dim content or block\n * pointer events behind a floating element.\n * It's a regular `<div>`, so it can be styled via any CSS solution you prefer.\n * @see https://floating-ui.com/docs/FloatingOverlay\n */\nconst FloatingOverlay = /*#__PURE__*/React.forwardRef(function FloatingOverlay(_ref, ref) {\n let {\n lockScroll = false,\n ...rest\n } = _ref;\n index(() => {\n var _window$visualViewpor, _window$visualViewpor2;\n if (!lockScroll) {\n return;\n }\n const alreadyLocked = document.body.hasAttribute(identifier);\n if (alreadyLocked) {\n return;\n }\n document.body.setAttribute(identifier, '');\n\n // RTL <body> scrollbar\n const scrollbarX = Math.round(document.documentElement.getBoundingClientRect().left) + document.documentElement.scrollLeft;\n const paddingProp = scrollbarX ? 'paddingLeft' : 'paddingRight';\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\n\n // Only iOS doesn't respect `overflow: hidden` on document.body, and this\n // technique has fewer side effects.\n if (!/iP(hone|ad|od)|iOS/.test(getPlatform())) {\n Object.assign(document.body.style, {\n overflow: 'hidden',\n [paddingProp]: scrollbarWidth + \"px\"\n });\n return () => {\n document.body.removeAttribute(identifier);\n Object.assign(document.body.style, {\n overflow: '',\n [paddingProp]: ''\n });\n };\n }\n\n // iOS 12 does not support `visualViewport`.\n const offsetLeft = ((_window$visualViewpor = window.visualViewport) == null ? void 0 : _window$visualViewpor.offsetLeft) || 0;\n const offsetTop = ((_window$visualViewpor2 = window.visualViewport) == null ? void 0 : _window$visualViewpor2.offsetTop) || 0;\n const scrollX = window.pageXOffset;\n const scrollY = window.pageYOffset;\n Object.assign(document.body.style, {\n position: 'fixed',\n overflow: 'hidden',\n top: -(scrollY - Math.floor(offsetTop)) + \"px\",\n left: -(scrollX - Math.floor(offsetLeft)) + \"px\",\n right: '0',\n [paddingProp]: scrollbarWidth + \"px\"\n });\n return () => {\n Object.assign(document.body.style, {\n position: '',\n overflow: '',\n top: '',\n left: '',\n right: '',\n [paddingProp]: ''\n });\n document.body.removeAttribute(identifier);\n window.scrollTo(scrollX, scrollY);\n };\n }, [lockScroll]);\n return /*#__PURE__*/React.createElement(\"div\", _extends({\n ref: ref\n }, rest, {\n style: {\n position: 'fixed',\n overflow: 'auto',\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n ...rest.style\n }\n }));\n});\n\nfunction isButtonTarget(event) {\n return isHTMLElement(event.target) && event.target.tagName === 'BUTTON';\n}\nfunction isSpaceIgnored(element) {\n return isTypeableElement(element);\n}\n/**\n * Opens or closes the floating element when clicking the reference element.\n * @see https://floating-ui.com/docs/useClick\n */\nconst useClick = function (_ref, _temp) {\n let {\n open,\n onOpenChange,\n dataRef,\n elements: {\n domReference\n }\n } = _ref;\n let {\n enabled = true,\n event: eventOption = 'click',\n toggle = true,\n ignoreMouse = false,\n keyboardHandlers = true\n } = _temp === void 0 ? {} : _temp;\n const pointerTypeRef = React.useRef();\n return React.useMemo(() => {\n if (!enabled) {\n return {};\n }\n return {\n reference: {\n onPointerDown(event) {\n pointerTypeRef.current = event.pointerType;\n },\n onMouseDown(event) {\n // Ignore all buttons except for the \"main\" button.\n // https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button\n if (event.button !== 0) {\n return;\n }\n if (isMouseLikePointerType(pointerTypeRef.current, true) && ignoreMouse) {\n return;\n }\n if (eventOption === 'click') {\n return;\n }\n if (open) {\n if (toggle && (dataRef.current.openEvent ? dataRef.current.openEvent.type === 'mousedown' : true)) {\n onOpenChange(false);\n }\n } else {\n // Prevent stealing focus from the floating element\n event.preventDefault();\n onOpenChange(true);\n }\n dataRef.current.openEvent = event.nativeEvent;\n },\n onClick(event) {\n if (dataRef.current.__syncReturnFocus) {\n return;\n }\n if (eventOption === 'mousedown' && pointerTypeRef.current) {\n pointerTypeRef.current = undefined;\n return;\n }\n if (isMouseLikePointerType(pointerTypeRef.current, true) && ignoreMouse) {\n return;\n }\n if (open) {\n if (toggle && (dataRef.current.openEvent ? dataRef.current.openEvent.type === 'click' : true)) {\n onOpenChange(false);\n }\n } else {\n onOpenChange(true);\n }\n dataRef.current.openEvent = event.nativeEvent;\n },\n onKeyDown(event) {\n pointerTypeRef.current = undefined;\n if (!keyboardHandlers) {\n return;\n }\n if (isButtonTarget(event)) {\n return;\n }\n if (event.key === ' ' && !isSpaceIgnored(domReference)) {\n // Prevent scrolling\n event.preventDefault();\n }\n if (event.key === 'Enter') {\n if (open) {\n if (toggle) {\n onOpenChange(false);\n }\n } else {\n onOpenChange(true);\n }\n }\n },\n onKeyUp(event) {\n if (!keyboardHandlers) {\n return;\n }\n if (isButtonTarget(event) || isSpaceIgnored(domReference)) {\n return;\n }\n if (event.key === ' ') {\n if (open) {\n if (toggle) {\n onOpenChange(false);\n }\n } else {\n onOpenChange(true);\n }\n }\n }\n }\n };\n }, [enabled, dataRef, eventOption, ignoreMouse, keyboardHandlers, domReference, toggle, open, onOpenChange]);\n};\n\n/**\n * Check whether the event.target is within the provided node. Uses event.composedPath if available for custom element support.\n *\n * @param event The event whose target/composedPath to check\n * @param node The node to check against\n * @returns Whether the event.target/composedPath is within the node.\n */\nfunction isEventTargetWithin(event, node) {\n if (node == null) {\n return false;\n }\n if ('composedPath' in event) {\n return event.composedPath().includes(node);\n }\n\n // TS thinks `event` is of type never as it assumes all browsers support composedPath, but browsers without shadow dom don't\n const e = event;\n return e.target != null && node.contains(e.target);\n}\n\nconst bubbleHandlerKeys = {\n pointerdown: 'onPointerDown',\n mousedown: 'onMouseDown',\n click: 'onClick'\n};\nconst captureHandlerKeys = {\n pointerdown: 'onPointerDownCapture',\n mousedown: 'onMouseDownCapture',\n click: 'onClickCapture'\n};\nconst normalizeBubblesProp = function (bubbles) {\n var _bubbles$escapeKey, _bubbles$outsidePress;\n if (bubbles === void 0) {\n bubbles = true;\n }\n return {\n escapeKeyBubbles: typeof bubbles === 'boolean' ? bubbles : (_bubbles$escapeKey = bubbles.escapeKey) != null ? _bubbles$escapeKey : true,\n outsidePressBubbles: typeof bubbles === 'boolean' ? bubbles : (_bubbles$outsidePress = bubbles.outsidePress) != null ? _bubbles$outsidePress : true\n };\n};\n/**\n * Closes the floating element when a dismissal is requested — by default, when\n * the user presses the `escape` key or outside of the floating element.\n * @see https://floating-ui.com/docs/useDismiss\n */\nconst useDismiss = function (_ref, _temp) {\n let {\n open,\n onOpenChange,\n events,\n nodeId,\n elements: {\n reference,\n domReference,\n floating\n },\n dataRef\n } = _ref;\n let {\n enabled = true,\n escapeKey = true,\n outsidePress: unstable_outsidePress = true,\n outsidePressEvent = 'pointerdown',\n referencePress = false,\n referencePressEvent = 'pointerdown',\n ancestorScroll = false,\n bubbles = true\n } = _temp === void 0 ? {} : _temp;\n const tree = useFloatingTree();\n const nested = useFloatingParentNodeId() != null;\n const outsidePressFn = useEvent(typeof unstable_outsidePress === 'function' ? unstable_outsidePress : () => false);\n const outsidePress = typeof unstable_outsidePress === 'function' ? outsidePressFn : unstable_outsidePress;\n const insideReactTreeRef = React.useRef(false);\n const {\n escapeKeyBubbles,\n outsidePressBubbles\n } = normalizeBubblesProp(bubbles);\n React.useEffect(() => {\n if (!open || !enabled) {\n return;\n }\n dataRef.current.__escapeKeyBubbles = escapeKeyBubbles;\n dataRef.current.__outsidePressBubbles = outsidePressBubbles;\n function onKeyDown(event) {\n if (event.key === 'Escape') {\n const children = tree ? getChildren(tree.nodesRef.current, nodeId) : [];\n if (children.length > 0) {\n let shouldDismiss = true;\n children.forEach(child => {\n var _child$context;\n if ((_child$context = child.context) != null && _child$context.open && !child.context.dataRef.current.__escapeKeyBubbles) {\n shouldDismiss = false;\n return;\n }\n });\n if (!shouldDismiss) {\n return;\n }\n }\n events.emit('dismiss', {\n type: 'escapeKey',\n data: {\n returnFocus: {\n preventScroll: false\n }\n }\n });\n onOpenChange(false);\n }\n }\n function onOutsidePress(event) {\n // Given developers can stop the propagation of the synthetic event,\n // we can only be confident with a positive value.\n const insideReactTree = insideReactTreeRef.current;\n insideReactTreeRef.current = false;\n if (insideReactTree) {\n return;\n }\n if (typeof outsidePress === 'function' && !outsidePress(event)) {\n return;\n }\n const target = getTarget(event);\n\n // Check if the click occurred on the scrollbar\n if (isHTMLElement(target) && floating) {\n const win = floating.ownerDocument.defaultView || window;\n const canScrollX = target.scrollWidth > target.clientWidth;\n const canScrollY = target.scrollHeight > target.clientHeight;\n let xCond = canScrollY && event.offsetX > target.clientWidth;\n\n // In some browsers it is possible to change the <body> (or window)\n // scrollbar to the left side, but is very rare and is difficult to\n // check for. Plus, for modal dialogs with backdrops, it is more\n // important that the backdrop is checked but not so much the window.\n if (canScrollY) {\n const isRTL = win.getComputedStyle(target).direction === 'rtl';\n if (isRTL) {\n xCond = event.offsetX <= target.offsetWidth - target.clientWidth;\n }\n }\n if (xCond || canScrollX && event.offsetY > target.clientHeight) {\n return;\n }\n }\n const targetIsInsideChildren = tree && getChildren(tree.nodesRef.current, nodeId).some(node => {\n var _node$context;\n return isEventTargetWithin(event, (_node$context = node.context) == null ? void 0 : _node$context.elements.floating);\n });\n if (isEventTargetWithin(event, floating) || isEventTargetWithin(event, domReference) || targetIsInsideChildren) {\n return;\n }\n const children = tree ? getChildren(tree.nodesRef.current, nodeId) : [];\n if (children.length > 0) {\n let shouldDismiss = true;\n children.forEach(child => {\n var _child$context2;\n if ((_child$context2 = child.context) != null && _child$context2.open && !child.context.dataRef.current.__outsidePressBubbles) {\n shouldDismiss = false;\n return;\n }\n });\n if (!shouldDismiss) {\n return;\n }\n }\n events.emit('dismiss', {\n type: 'outsidePress',\n data: {\n returnFocus: nested ? {\n preventScroll: true\n } : isVirtualClick(event) || isVirtualPointerEvent(event)\n }\n });\n onOpenChange(false);\n }\n function onScroll() {\n onOpenChange(false);\n }\n const doc = getDocument(floating);\n escapeKey && doc.addEventListener('keydown', onKeyDown);\n outsidePress && doc.addEventListener(outsidePressEvent, onOutsidePress);\n let ancestors = [];\n if (ancestorScroll) {\n if (isElement(domReference)) {\n ancestors = getOverflowAncestors(domReference);\n }\n if (isElement(floating)) {\n ancestors = ancestors.concat(getOverflowAncestors(floating));\n }\n if (!isElement(reference) && reference && reference.contextElement) {\n ancestors = ancestors.concat(getOverflowAncestors(reference.contextElement));\n }\n }\n\n // Ignore the visual viewport for scrolling dismissal (allow pinch-zoom)\n ancestors = ancestors.filter(ancestor => {\n var _doc$defaultView;\n return ancestor !== ((_doc$defaultView = doc.defaultView) == null ? void 0 : _doc$defaultView.visualViewport);\n });\n ancestors.forEach(ancestor => {\n ancestor.addEventListener('scroll', onScroll, {\n passive: true\n });\n });\n return () => {\n escapeKey && doc.removeEventListener('keydown', onKeyDown);\n outsidePress && doc.removeEventListener(outsidePressEvent, onOutsidePress);\n ancestors.forEach(ancestor => {\n ancestor.removeEventListener('scroll', onScroll);\n });\n };\n }, [dataRef, floating, domReference, reference, escapeKey, outsidePress, outsidePressEvent, events, tree, nodeId, open, onOpenChange, ancestorScroll, enabled, escapeKeyBubbles, outsidePressBubbles, nested]);\n React.useEffect(() => {\n insideReactTreeRef.current = false;\n }, [outsidePress, outsidePressEvent]);\n return React.useMemo(() => {\n if (!enabled) {\n return {};\n }\n return {\n reference: {\n [bubbleHandlerKeys[referencePressEvent]]: () => {\n if (referencePress) {\n events.emit('dismiss', {\n type: 'referencePress',\n data: {\n returnFocus: false\n }\n });\n onOpenChange(false);\n }\n }\n },\n floating: {\n [captureHandlerKeys[outsidePressEvent]]: () => {\n insideReactTreeRef.current = true;\n }\n }\n };\n }, [enabled, events, referencePress, outsidePressEvent, referencePressEvent, onOpenChange]);\n};\n\n/**\n * Opens the floating element while the reference element has focus, like CSS\n * `:focus`.\n * @see https://floating-ui.com/docs/useFocus\n */\nconst useFocus = function (_ref, _temp) {\n let {\n open,\n onOpenChange,\n dataRef,\n events,\n refs,\n elements: {\n floating,\n domReference\n }\n } = _ref;\n let {\n enabled = true,\n keyboardOnly = true\n } = _temp === void 0 ? {} : _temp;\n const pointerTypeRef = React.useRef('');\n const blockFocusRef = React.useRef(false);\n const timeoutRef = React.useRef();\n React.useEffect(() => {\n if (!enabled) {\n return;\n }\n const doc = getDocument(floating);\n const win = doc.defaultView || window;\n\n // If the reference was focused and the user left the tab/window, and the\n // floating element was not open, the focus should be blocked when they\n // return to the tab/window.\n function onBlur() {\n if (!open && isHTMLElement(domReference) && domReference === activeElement$1(getDocument(domReference))) {\n blockFocusRef.current = true;\n }\n }\n win.addEventListener('blur', onBlur);\n return () => {\n win.removeEventListener('blur', onBlur);\n };\n }, [floating, domReference, open, enabled]);\n React.useEffect(() => {\n if (!enabled) {\n return;\n }\n function onDismiss(payload) {\n if (payload.type === 'referencePress' || payload.type === 'escapeKey') {\n blockFocusRef.current = true;\n }\n }\n events.on('dismiss', onDismiss);\n return () => {\n events.off('dismiss', onDismiss);\n };\n }, [events, enabled]);\n React.useEffect(() => {\n return () => {\n clearTimeout(timeoutRef.current);\n };\n }, []);\n return React.useMemo(() => {\n if (!enabled) {\n return {};\n }\n return {\n reference: {\n onPointerDown(_ref2) {\n let {\n pointerType\n } = _ref2;\n pointerTypeRef.current = pointerType;\n blockFocusRef.current = !!(pointerType && keyboardOnly);\n },\n onMouseLeave() {\n blockFocusRef.current = false;\n },\n onFocus(event) {\n var _dataRef$current$open;\n if (blockFocusRef.current) {\n return;\n }\n\n // Dismiss with click should ignore the subsequent `focus` trigger,\n // but only if the click originated inside the reference element.\n if (event.type === 'focus' && ((_dataRef$current$open = dataRef.current.openEvent) == null ? void 0 : _dataRef$current$open.type) === 'mousedown' && dataRef.current.openEvent && isEventTargetWithin(dataRef.current.openEvent, domReference)) {\n return;\n }\n dataRef.current.openEvent = event.nativeEvent;\n onOpenChange(true);\n },\n onBlur(event) {\n blockFocusRef.current = false;\n const relatedTarget = event.relatedTarget;\n\n // Hit the non-modal focus management portal guard. Focus will be\n // moved into the floating element immediately after.\n const movedToFocusGuard = isElement(relatedTarget) && relatedTarget.hasAttribute('data-floating-ui-focus-guard') && relatedTarget.getAttribute('data-type') === 'outside';\n\n // Wait for the window blur listener to fire.\n timeoutRef.current = setTimeout(() => {\n // When focusing the reference element (e.g. regular click), then\n // clicking into the floating element, prevent it from hiding.\n // Note: it must be focusable, e.g. `tabindex=\"-1\"`.\n if (contains(refs.floating.current, relatedTarget) || contains(domReference, relatedTarget) || movedToFocusGuard) {\n return;\n }\n onOpenChange(false);\n });\n }\n }\n };\n }, [enabled, keyboardOnly, domReference, refs, dataRef, onOpenChange]);\n};\n\nlet isPreventScrollSupported = false;\nconst ARROW_UP = 'ArrowUp';\nconst ARROW_DOWN = 'ArrowDown';\nconst ARROW_LEFT = 'ArrowLeft';\nconst ARROW_RIGHT = 'ArrowRight';\nfunction isDifferentRow(index, cols, prevRow) {\n return Math.floor(index / cols) !== prevRow;\n}\nfunction isIndexOutOfBounds(listRef, index) {\n return index < 0 || index >= listRef.current.length;\n}\nfunction findNonDisabledIndex(listRef, _temp) {\n let {\n startingIndex = -1,\n decrement = false,\n disabledIndices,\n amount = 1\n } = _temp === void 0 ? {} : _temp;\n const list = listRef.current;\n let index = startingIndex;\n do {\n var _list$index, _list$index2;\n index = index + (decrement ? -amount : amount);\n } while (index >= 0 && index <= list.length - 1 && (disabledIndices ? disabledIndices.includes(index) : list[index] == null || ((_list$index = list[index]) == null ? void 0 : _list$index.hasAttribute('disabled')) || ((_list$index2 = list[index]) == null ? void 0 : _list$index2.getAttribute('aria-disabled')) === 'true'));\n return index;\n}\nfunction doSwitch(orientation, vertical, horizontal) {\n switch (orientation) {\n case 'vertical':\n return vertical;\n case 'horizontal':\n return horizontal;\n default:\n return vertical || horizontal;\n }\n}\nfunction isMainOrientationKey(key, orientation) {\n const vertical = key === ARROW_UP || key === ARROW_DOWN;\n const horizontal = key === ARROW_LEFT || key === ARROW_RIGHT;\n return doSwitch(orientation, vertical, horizontal);\n}\nfunction isMainOrientationToEndKey(key, orientation, rtl) {\n const vertical = key === ARROW_DOWN;\n const horizontal = rtl ? key === ARROW_LEFT : key === ARROW_RIGHT;\n return doSwitch(orientation, vertical, horizontal) || key === 'Enter' || key == ' ' || key === '';\n}\nfunction isCrossOrientationOpenKey(key, orientation, rtl) {\n const vertical = rtl ? key === ARROW_LEFT : key === ARROW_RIGHT;\n const horizontal = key === ARROW_DOWN;\n return doSwitch(orientation, vertical, horizontal);\n}\nfunction isCrossOrientationCloseKey(key, orientation, rtl) {\n const vertical = rtl ? key === ARROW_RIGHT : key === ARROW_LEFT;\n const horizontal = key === ARROW_UP;\n return doSwitch(orientation, vertical, horizontal);\n}\nfunction getMinIndex(listRef, disabledIndices) {\n return findNonDisabledIndex(listRef, {\n disabledIndices\n });\n}\nfunction getMaxIndex(listRef, disabledIndices) {\n return findNonDisabledIndex(listRef, {\n decrement: true,\n startingIndex: listRef.current.length,\n disabledIndices\n });\n}\n/**\n * Adds arrow key-based navigation of a list of items, either using real DOM\n * focus or virtual focus.\n * @see https://floating-ui.com/docs/useListNavigation\n */\nconst useListNavigation = function (_ref, _temp2) {\n let {\n open,\n onOpenChange,\n refs,\n elements: {\n domReference\n }\n } = _ref;\n let {\n listRef,\n activeIndex,\n onNavigate: unstable_onNavigate = () => {},\n enabled = true,\n selectedIndex = null,\n allowEscape = false,\n loop = false,\n nested = false,\n rtl = false,\n virtual = false,\n focusItemOnOpen = 'auto',\n focusItemOnHover = true,\n openOnArrowKeyDown = true,\n disabledIndices = undefined,\n orientation = 'vertical',\n cols = 1,\n scrollItemIntoView = true\n } = _temp2 === void 0 ? {\n listRef: {\n current: []\n },\n activeIndex: null,\n onNavigate: () => {}\n } : _temp2;\n if (process.env.NODE_ENV !== \"production\") {\n if (allowEscape) {\n if (!loop) {\n console.warn(['Floating UI: `useListNavigation` looping must be enabled to allow', 'escaping.'].join(' '));\n }\n if (!virtual) {\n console.warn(['Floating UI: `useListNavigation` must be virtual to allow', 'escaping.'].join(' '));\n }\n }\n if (orientation === 'vertical' && cols > 1) {\n console.warn(['Floating UI: In grid list navigation mode (`cols` > 1), the', '`orientation` should be either \"horizontal\" or \"both\".'].join(' '));\n }\n }\n const parentId = useFloatingParentNodeId();\n const tree = useFloatingTree();\n const onNavigate = useEvent(unstable_onNavigate);\n const focusItemOnOpenRef = React.useRef(focusItemOnOpen);\n const indexRef = React.useRef(selectedIndex != null ? selectedIndex : -1);\n const keyRef = React.useRef(null);\n const isPointerModalityRef = React.useRef(true);\n const previousOnNavigateRef = React.useRef(onNavigate);\n const previousOpenRef = React.useRef(open);\n const forceSyncFocus = React.useRef(false);\n const forceScrollIntoViewRef = React.useRef(false);\n const disabledIndicesRef = useLatestRef(disabledIndices);\n const latestOpenRef = useLatestRef(open);\n const scrollItemIntoViewRef = useLatestRef(scrollItemIntoView);\n const [activeId, setActiveId] = React.useState();\n const focusItem = React.useCallback(function (listRef, indexRef, forceScrollIntoView) {\n if (forceScrollIntoView === void 0) {\n forceScrollIntoView = false;\n }\n const item = listRef.current[indexRef.current];\n if (virtual) {\n setActiveId(item == null ? void 0 : item.id);\n } else {\n enqueueFocus(item, {\n preventScroll: true,\n // Mac Safari does not move the virtual cursor unless the focus call\n // is sync. However, for the very first focus call, we need to wait\n // for the position to be ready in order to prevent unwanted\n // scrolling. This means the virtual cursor will not move to the first\n // item when first opening the floating element, but will on\n // subsequent calls. `preventScroll` is supported in modern Safari,\n // so we can use that instead.\n // iOS Safari must be async or the first item will not be focused.\n sync: isMac() && isSafari() ? isPreventScrollSupported || forceSyncFocus.current : false\n });\n }\n requestAnimationFrame(() => {\n const scrollIntoViewOptions = scrollItemIntoViewRef.current;\n const shouldScrollIntoView = scrollIntoViewOptions && item && (forceScrollIntoView || !isPointerModalityRef.current);\n if (shouldScrollIntoView) {\n // JSDOM doesn't support `.scrollIntoView()` but it's widely supported\n // by all browsers.\n item.scrollIntoView == null ? void 0 : item.scrollIntoView(typeof scrollIntoViewOptions === 'boolean' ? {\n block: 'nearest',\n inline: 'nearest'\n } : scrollIntoViewOptions);\n }\n });\n }, [virtual, scrollItemIntoViewRef]);\n index(() => {\n document.createElement('div').focus({\n get preventScroll() {\n isPreventScrollSupported = true;\n return false;\n }\n });\n }, []);\n\n // Sync `selectedIndex` to be the `activeIndex` upon opening the floating\n // element. Also, reset `activeIndex` upon closing the floating element.\n index(() => {\n if (!enabled) {\n return;\n }\n if (open) {\n if (focusItemOnOpenRef.current && selectedIndex != null) {\n // Regardless of the pointer modality, we want to ensure the selected\n // item comes into view when the floating element is opened.\n forceScrollIntoViewRef.current = true;\n onNavigate(selectedIndex);\n }\n } else if (previousOpenRef.current) {\n // Since the user can specify `onNavigate` conditionally\n // (onNavigate: open ? setActiveIndex : setSelectedIndex),\n // we store and call the previous function.\n indexRef.current = -1;\n previousOnNavigateRef.current(null);\n }\n }, [enabled, open, selectedIndex, onNavigate]);\n\n // Sync `activeIndex` to be the focused item while the floating element is\n // open.\n index(() => {\n if (!enabled) {\n return;\n }\n if (open) {\n if (activeIndex == null) {\n forceSyncFocus.current = false;\n if (selectedIndex != null) {\n return;\n }\n\n // Reset while the floating element was open (e.g. the list changed).\n if (previousOpenRef.current) {\n indexRef.current = -1;\n focusItem(listRef, indexRef);\n }\n\n // Initial sync.\n if (!previousOpenRef.current && focusItemOnOpenRef.current && (keyRef.current != null || focusItemOnOpenRef.current === true && keyRef.current == null)) {\n indexRef.current = keyRef.current == null || isMainOrientationToEndKey(keyRef.current, orientation, rtl) || nested ? getMinIndex(listRef, disabledIndicesRef.current) : getMaxIndex(listRef, disabledIndicesRef.current);\n onNavigate(indexRef.current);\n }\n } else if (!isIndexOutOfBounds(listRef, activeIndex)) {\n indexRef.current = activeIndex;\n focusItem(listRef, indexRef, forceScrollIntoViewRef.current);\n forceScrollIntoViewRef.current = false;\n }\n }\n }, [enabled, open, activeIndex, selectedIndex, nested, listRef, orientation, rtl, onNavigate, focusItem, disabledIndicesRef]);\n\n // Ensure the parent floating element has focus when a nested child closes\n // to allow arrow key navigation to work after the pointer leaves the child.\n index(() => {\n if (!enabled) {\n return;\n }\n if (previousOpenRef.current && !open) {\n var _tree$nodesRef$curren, _tree$nodesRef$curren2;\n const parentFloating = tree == null ? void 0 : (_tree$nodesRef$curren = tree.nodesRef.current.find(node => node.id === parentId)) == null ? void 0 : (_tree$nodesRef$curren2 = _tree$nodesRef$curren.context) == null ? void 0 : _tree$nodesRef$curren2.elements.floating;\n if (parentFloating && !contains(parentFloating, activeElement$1(getDocument(parentFloating)))) {\n parentFloating.focus({\n preventScroll: true\n });\n }\n }\n }, [enabled, open, tree, parentId]);\n index(() => {\n keyRef.current = null;\n previousOnNavigateRef.current = onNavigate;\n previousOpenRef.current = open;\n });\n const hasActiveIndex = activeIndex != null;\n const item = React.useMemo(() => {\n function syncCurrentTarget(currentTarget) {\n if (!open) return;\n const index = listRef.current.indexOf(currentTarget);\n if (index !== -1) {\n onNavigate(index);\n }\n }\n const props = {\n onFocus(_ref2) {\n let {\n currentTarget\n } = _ref2;\n syncCurrentTarget(currentTarget);\n },\n onClick: _ref3 => {\n let {\n currentTarget\n } = _ref3;\n return currentTarget.focus({\n preventScroll: true\n });\n },\n // Safari\n ...(focusItemOnHover && {\n onMouseMove(_ref4) {\n let {\n currentTarget\n } = _ref4;\n syncCurrentTarget(currentTarget);\n },\n onPointerLeave() {\n if (!isPointerModalityRef.current) {\n return;\n }\n indexRef.current = -1;\n focusItem(listRef, indexRef);\n\n // Virtual cursor with VoiceOver on iOS needs this to be flushed\n // synchronously or there is a glitch that prevents nested\n // submenus from being accessible.\n flushSync(() => onNavigate(null));\n if (!virtual) {\n var _refs$floating$curren;\n // This also needs to be sync to prevent fast mouse movements\n // from leaving behind a stale active item when landing on a\n // disabled button item.\n (_refs$floating$curren = refs.floating.current) == null ? void 0 : _refs$floating$curren.focus({\n preventScroll: true\n });\n }\n }\n })\n };\n return props;\n }, [open, refs, focusItem, focusItemOnHover, listRef, onNavigate, virtual]);\n return React.useMemo(() => {\n if (!enabled) {\n return {};\n }\n const disabledIndices = disabledIndicesRef.current;\n function onKeyDown(event) {\n isPointerModalityRef.current = false;\n forceSyncFocus.current = true;\n\n // If the floating element is animating out, ignore navigation. Otherwise,\n // the `activeIndex` gets set to 0 despite not being open so the next time\n // the user ArrowDowns, the first item won't be focused.\n if (!latestOpenRef.current && event.currentTarget === refs.floating.current) {\n return;\n }\n if (nested && isCrossOrientationCloseKey(event.key, orientation, rtl)) {\n stopEvent(event);\n onOpenChange(false);\n if (isHTMLElement(domReference)) {\n domReference.focus();\n }\n return;\n }\n const currentIndex = indexRef.current;\n const minIndex = getMinIndex(listRef, disabledIndices);\n const maxIndex = getMaxIndex(listRef, disabledIndices);\n if (event.key === 'Home') {\n indexRef.current = minIndex;\n onNavigate(indexRef.current);\n }\n if (event.key === 'End') {\n indexRef.current = maxIndex;\n onNavigate(indexRef.current);\n }\n\n // Grid navigation.\n if (cols > 1) {\n const prevIndex = indexRef.current;\n if (event.key === ARROW_UP) {\n stopEvent(event);\n if (prevIndex === -1) {\n indexRef.current = maxIndex;\n } else {\n indexRef.current = findNonDisabledIndex(listRef, {\n startingIndex: prevIndex,\n amount: cols,\n decrement: true,\n disabledIndices\n });\n if (loop && (prevIndex - cols < minIndex || indexRef.current < 0)) {\n const col = prevIndex % cols;\n const maxCol = maxIndex % cols;\n const offset = maxIndex - (maxCol - col);\n if (maxCol === col) {\n indexRef.current = maxIndex;\n } else {\n indexRef.current = maxCol > col ? offset : offset - cols;\n }\n }\n }\n if (isIndexOutOfBounds(listRef, indexRef.current)) {\n indexRef.current = prevIndex;\n }\n onNavigate(indexRef.current);\n }\n if (event.key === ARROW_DOWN) {\n stopEvent(event);\n if (prevIndex === -1) {\n indexRef.current = minIndex;\n } else {\n indexRef.current = findNonDisabledIndex(listRef, {\n startingIndex: prevIndex,\n amount: cols,\n disabledIndices\n });\n if (loop && prevIndex + cols > maxIndex) {\n indexRef.current = findNonDisabledIndex(listRef, {\n startingIndex: prevIndex % cols - cols,\n amount: cols,\n disabledIndices\n });\n }\n }\n if (isIndexOutOfBounds(listRef, indexRef.current)) {\n indexRef.current = prevIndex;\n }\n onNavigate(indexRef.current);\n }\n\n // Remains on the same row/column.\n if (orientation === 'both') {\n const prevRow = Math.floor(prevIndex / cols);\n if (event.key === ARROW_RIGHT) {\n stopEvent(event);\n if (prevIndex % cols !== cols - 1) {\n indexRef.current = findNonDisabledIndex(listRef, {\n startingIndex: prevIndex,\n disabledIndices\n });\n if (loop && isDifferentRow(indexRef.current, cols, prevRow)) {\n indexRef.current = findNonDisabledIndex(listRef, {\n startingIndex: prevIndex - prevIndex % cols - 1,\n disabledIndices\n });\n }\n } else if (loop) {\n indexRef.current = findNonDisabledIndex(listRef, {\n startingIndex: prevIndex - prevIndex % cols - 1,\n disabledIndices\n });\n }\n if (isDifferentRow(indexRef.current, cols, prevRow)) {\n indexRef.current = prevIndex;\n }\n }\n if (event.key === ARROW_LEFT) {\n stopEvent(event);\n if (prevIndex % cols !== 0) {\n indexRef.current = findNonDisabledIndex(listRef, {\n startingIndex: prevIndex,\n disabledIndices,\n decrement: true\n });\n if (loop && isDifferentRow(indexRef.current, cols, prevRow)) {\n indexRef.current = findNonDisabledIndex(listRef, {\n startingIndex: prevIndex + (cols - prevIndex % cols),\n decrement: true,\n disabledIndices\n });\n }\n } else if (loop) {\n indexRef.current = findNonDisabledIndex(listRef, {\n startingIndex: prevIndex + (cols - prevIndex % cols),\n decrement: true,\n disabledIndices\n });\n }\n if (isDifferentRow(indexRef.current, cols, prevRow)) {\n indexRef.current = prevIndex;\n }\n }\n const lastRow = Math.floor(maxIndex / cols) === prevRow;\n if (isIndexOutOfBounds(listRef, indexRef.current)) {\n if (loop && lastRow) {\n indexRef.current = event.key === ARROW_LEFT ? maxIndex : findNonDisabledIndex(listRef, {\n startingIndex: prevIndex - prevIndex % cols - 1,\n disabledIndices\n });\n } else {\n indexRef.current = prevIndex;\n }\n }\n onNavigate(indexRef.current);\n return;\n }\n }\n if (isMainOrientationKey(event.key, orientation)) {\n stopEvent(event);\n\n // Reset the index if no item is focused.\n if (open && !virtual && activeElement$1(event.currentTarget.ownerDocument) === event.currentTarget) {\n indexRef.current = isMainOrientationToEndKey(event.key, orientation, rtl) ? minIndex : maxIndex;\n onNavigate(indexRef.current);\n return;\n }\n if (isMainOrientationToEndKey(event.key, orientation, rtl)) {\n if (loop) {\n indexRef.current = currentIndex >= maxIndex ? allowEscape && currentIndex !== listRef.current.length ? -1 : minIndex : findNonDisabledIndex(listRef, {\n startingIndex: currentIndex,\n disabledIndices\n });\n } else {\n indexRef.current = Math.min(maxIndex, findNonDisabledIndex(listRef, {\n startingIndex: currentIndex,\n disabledIndices\n }));\n }\n } else {\n if (loop) {\n indexRef.current = currentIndex <= minIndex ? allowEscape && currentIndex !== -1 ? listRef.current.length : maxIndex : findNonDisabledIndex(listRef, {\n startingIndex: currentIndex,\n decrement: true,\n disabledIndices\n });\n } else {\n indexRef.current = Math.max(minIndex, findNonDisabledIndex(listRef, {\n startingIndex: currentIndex,\n decrement: true,\n disabledIndices\n }));\n }\n }\n if (isIndexOutOfBounds(listRef, indexRef.current)) {\n onNavigate(null);\n } else {\n onNavigate(indexRef.current);\n }\n }\n }\n function checkVirtualMouse(event) {\n if (focusItemOnOpen === 'auto' && isVirtualClick(event.nativeEvent)) {\n focusItemOnOpenRef.current = true;\n }\n }\n function checkVirtualPointer(event) {\n // `pointerdown` fires first, reset the state then perform the checks.\n focusItemOnOpenRef.current = focusItemOnOpen;\n if (focusItemOnOpen === 'auto' && isVirtualPointerEvent(event.nativeEvent)) {\n focusItemOnOpenRef.current = true;\n }\n }\n const ariaActiveDescendantProp = virtual && open && hasActiveIndex && {\n 'aria-activedescendant': activeId\n };\n return {\n reference: {\n ...ariaActiveDescendantProp,\n onKeyDown(event) {\n isPointerModalityRef.current = false;\n const isArrowKey = event.key.indexOf('Arrow') === 0;\n if (virtual && open) {\n return onKeyDown(event);\n }\n\n // If a floating element should not open on arrow key down, avoid\n // setting `activeIndex` while it's closed.\n if (!open && !openOnArrowKeyDown && isArrowKey) {\n return;\n }\n const isNavigationKey = isArrowKey || event.key === 'Enter' || event.key === ' ' || event.key === '';\n if (isNavigationKey) {\n keyRef.current = event.key;\n }\n if (nested) {\n if (isCrossOrientationOpenKey(event.key, orientation, rtl)) {\n stopEvent(event);\n if (open) {\n indexRef.current = getMinIndex(listRef, disabledIndices);\n onNavigate(indexRef.current);\n } else {\n onOpenChange(true);\n }\n }\n return;\n }\n if (isMainOrientationKey(event.key, orientation)) {\n if (selectedIndex != null) {\n indexRef.current = selectedIndex;\n }\n stopEvent(event);\n if (!open && openOnArrowKeyDown) {\n onOpenChange(true);\n } else {\n onKeyDown(event);\n }\n if (open) {\n onNavigate(indexRef.current);\n }\n }\n },\n onFocus() {\n if (open) {\n onNavigate(null);\n }\n },\n onPointerDown: checkVirtualPointer,\n onMouseDown: checkVirtualMouse,\n onClick: checkVirtualMouse\n },\n floating: {\n 'aria-orientation': orientation === 'both' ? undefined : orientation,\n ...ariaActiveDescendantProp,\n onKeyDown,\n onPointerMove() {\n isPointerModalityRef.current = true;\n }\n },\n item\n };\n }, [domReference, refs, activeId, disabledIndicesRef, latestOpenRef, listRef, enabled, orientation, rtl, virtual, open, hasActiveIndex, nested, selectedIndex, openOnArrowKeyDown, allowEscape, cols, loop, focusItemOnOpen, onNavigate, onOpenChange, item]);\n};\n\n/**\n * Merges an array of refs into a single memoized callback ref or `null`.\n * @see https://floating-ui.com/docs/useMergeRefs\n */\nfunction useMergeRefs(refs) {\n return React.useMemo(() => {\n if (refs.every(ref => ref == null)) {\n return null;\n }\n return value => {\n refs.forEach(ref => {\n if (typeof ref === 'function') {\n ref(value);\n } else if (ref != null) {\n ref.current = value;\n }\n });\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, refs);\n}\n\n/**\n * Adds base screen reader props to the reference and floating elements for a\n * given floating element `role`.\n * @see https://floating-ui.com/docs/useRole\n */\nconst useRole = function (_ref, _temp) {\n let {\n open\n } = _ref;\n let {\n enabled = true,\n role = 'dialog'\n } = _temp === void 0 ? {} : _temp;\n const rootId = useId();\n const referenceId = useId();\n return React.useMemo(() => {\n const floatingProps = {\n id: rootId,\n role\n };\n if (!enabled) {\n return {};\n }\n if (role === 'tooltip') {\n return {\n reference: {\n 'aria-describedby': open ? rootId : undefined\n },\n floating: floatingProps\n };\n }\n return {\n reference: {\n 'aria-expanded': open ? 'true' : 'false',\n 'aria-haspopup': role === 'alertdialog' ? 'dialog' : role,\n 'aria-controls': open ? rootId : undefined,\n ...(role === 'listbox' && {\n role: 'combobox'\n }),\n ...(role === 'menu' && {\n id: referenceId\n })\n },\n floating: {\n ...floatingProps,\n ...(role === 'menu' && {\n 'aria-labelledby': referenceId\n })\n }\n };\n }, [enabled, role, open, rootId, referenceId]);\n};\n\n// Converts a JS style key like `backgroundColor` to a CSS transition-property\n// like `background-color`.\nconst camelCaseToKebabCase = str => str.replace(/[A-Z]+(?![a-z])|[A-Z]/g, ($, ofs) => (ofs ? '-' : '') + $.toLowerCase());\nfunction useDelayUnmount(open, durationMs) {\n const [isMounted, setIsMounted] = React.useState(open);\n if (open && !isMounted) {\n setIsMounted(true);\n }\n React.useEffect(() => {\n if (!open) {\n const timeout = setTimeout(() => setIsMounted(false), durationMs);\n return () => clearTimeout(timeout);\n }\n }, [open, durationMs]);\n return isMounted;\n}\n/**\n * Provides a status string to apply CSS transitions to a floating element,\n * correctly handling placement-aware transitions.\n * @see https://floating-ui.com/docs/useTransition#usetransitionstatus\n */\nfunction useTransitionStatus(_ref, _temp) {\n let {\n open,\n elements: {\n floating\n }\n } = _ref;\n let {\n duration = 250\n } = _temp === void 0 ? {} : _temp;\n const isNumberDuration = typeof duration === 'number';\n const closeDuration = (isNumberDuration ? duration : duration.close) || 0;\n const [initiated, setInitiated] = React.useState(false);\n const [status, setStatus] = React.useState('unmounted');\n const isMounted = useDelayUnmount(open, closeDuration);\n\n // `initiated` check prevents this `setState` call from breaking\n // <FloatingPortal />. This call is necessary to ensure subsequent opens\n // after the initial one allows the correct side animation to play when the\n // placement has changed.\n index(() => {\n if (initiated && !isMounted) {\n setStatus('unmounted');\n }\n }, [initiated, isMounted]);\n index(() => {\n if (!floating) return;\n if (open) {\n setStatus('initial');\n const frame = requestAnimationFrame(() => {\n setStatus('open');\n });\n return () => {\n cancelAnimationFrame(frame);\n };\n } else {\n setInitiated(true);\n setStatus('close');\n }\n }, [open, floating]);\n return {\n isMounted,\n status\n };\n}\n/**\n * Provides styles to apply CSS transitions to a floating element, correctly\n * handling placement-aware transitions. Wrapper around `useTransitionStatus`.\n * @see https://floating-ui.com/docs/useTransition#usetransitionstyles\n */\nfunction useTransitionStyles(context, _temp2) {\n let {\n initial: unstable_initial = {\n opacity: 0\n },\n open: unstable_open,\n close: unstable_close,\n common: unstable_common,\n duration = 250\n } = _temp2 === void 0 ? {} : _temp2;\n const placement = context.placement;\n const side = placement.split('-')[0];\n const [styles, setStyles] = React.useState({});\n const {\n isMounted,\n status\n } = useTransitionStatus(context, {\n duration\n });\n const initialRef = useLatestRef(unstable_initial);\n const openRef = useLatestRef(unstable_open);\n const closeRef = useLatestRef(unstable_close);\n const commonRef = useLatestRef(unstable_common);\n const isNumberDuration = typeof duration === 'number';\n const openDuration = (isNumberDuration ? duration : duration.open) || 0;\n const closeDuration = (isNumberDuration ? duration : duration.close) || 0;\n index(() => {\n const fnArgs = {\n side,\n placement\n };\n const initial = initialRef.current;\n const close = closeRef.current;\n const open = openRef.current;\n const common = commonRef.current;\n const initialStyles = typeof initial === 'function' ? initial(fnArgs) : initial;\n const closeStyles = typeof close === 'function' ? close(fnArgs) : close;\n const commonStyles = typeof common === 'function' ? common(fnArgs) : common;\n const openStyles = (typeof open === 'function' ? open(fnArgs) : open) || Object.keys(initialStyles).reduce((acc, key) => {\n acc[key] = '';\n return acc;\n }, {});\n if (status === 'initial' || status === 'unmounted') {\n setStyles(styles => ({\n transitionProperty: styles.transitionProperty,\n ...commonStyles,\n ...initialStyles\n }));\n }\n if (status === 'open') {\n setStyles({\n transitionProperty: Object.keys(openStyles).map(camelCaseToKebabCase).join(','),\n transitionDuration: openDuration + \"ms\",\n ...commonStyles,\n ...openStyles\n });\n }\n if (status === 'close') {\n const styles = closeStyles || initialStyles;\n setStyles({\n transitionProperty: Object.keys(styles).map(camelCaseToKebabCase).join(','),\n transitionDuration: closeDuration + \"ms\",\n ...commonStyles,\n ...styles\n });\n }\n }, [side, placement, closeDuration, closeRef, initialRef, openRef, commonRef, openDuration, status]);\n return {\n isMounted,\n styles\n };\n}\n\n/**\n * Provides a matching callback that can be used to focus an item as the user\n * types, often used in tandem with `useListNavigation()`.\n * @see https://floating-ui.com/docs/useTypeahead\n */\nconst useTypeahead = function (_ref, _temp) {\n var _ref2;\n let {\n open,\n dataRef,\n refs\n } = _ref;\n let {\n listRef,\n activeIndex,\n onMatch: unstable_onMatch = () => {},\n enabled = true,\n findMatch = null,\n resetMs = 1000,\n ignoreKeys = [],\n selectedIndex = null\n } = _temp === void 0 ? {\n listRef: {\n current: []\n },\n activeIndex: null\n } : _temp;\n const timeoutIdRef = React.useRef();\n const stringRef = React.useRef('');\n const prevIndexRef = React.useRef((_ref2 = selectedIndex != null ? selectedIndex : activeIndex) != null ? _ref2 : -1);\n const matchIndexRef = React.useRef(null);\n const onMatch = useEvent(unstable_onMatch);\n const findMatchRef = useLatestRef(findMatch);\n const ignoreKeysRef = useLatestRef(ignoreKeys);\n index(() => {\n if (open) {\n clearTimeout(timeoutIdRef.current);\n matchIndexRef.current = null;\n stringRef.current = '';\n }\n }, [open]);\n index(() => {\n // Sync arrow key navigation but not typeahead navigation.\n if (open && stringRef.current === '') {\n var _ref3;\n prevIndexRef.current = (_ref3 = selectedIndex != null ? selectedIndex : activeIndex) != null ? _ref3 : -1;\n }\n }, [open, selectedIndex, activeIndex]);\n return React.useMemo(() => {\n if (!enabled) {\n return {};\n }\n function onKeyDown(event) {\n var _refs$floating$curren;\n // Correctly scope nested non-portalled floating elements. Since the nested\n // floating element is inside of the another, we find the closest role\n // that indicates the floating element scope.\n const target = getTarget(event.nativeEvent);\n if (isElement(target) && (activeElement$1(getDocument(target)) !== event.currentTarget ? (_refs$floating$curren = refs.floating.current) != null && _refs$floating$curren.contains(target) ? target.closest('[role=\"dialog\"],[role=\"menu\"],[role=\"listbox\"],[role=\"tree\"],[role=\"grid\"]') !== event.currentTarget : false : !event.currentTarget.contains(target))) {\n return;\n }\n if (stringRef.current.length > 0 && stringRef.current[0] !== ' ') {\n dataRef.current.typing = true;\n if (event.key === ' ') {\n stopEvent(event);\n }\n }\n const listContent = listRef.current;\n if (listContent == null || ignoreKeysRef.current.includes(event.key) ||\n // Character key.\n event.key.length !== 1 ||\n // Modifier key.\n event.ctrlKey || event.metaKey || event.altKey) {\n return;\n }\n\n // Bail out if the list contains a word like \"llama\" or \"aaron\". TODO:\n // allow it in this case, too.\n const allowRapidSuccessionOfFirstLetter = listContent.every(text => {\n var _text$, _text$2;\n return text ? ((_text$ = text[0]) == null ? void 0 : _text$.toLocaleLowerCase()) !== ((_text$2 = text[1]) == null ? void 0 : _text$2.toLocaleLowerCase()) : true;\n });\n\n // Allows the user to cycle through items that start with the same letter\n // in rapid succession.\n if (allowRapidSuccessionOfFirstLetter && stringRef.current === event.key) {\n stringRef.current = '';\n prevIndexRef.current = matchIndexRef.current;\n }\n stringRef.current += event.key;\n clearTimeout(timeoutIdRef.current);\n timeoutIdRef.current = setTimeout(() => {\n stringRef.current = '';\n prevIndexRef.current = matchIndexRef.current;\n dataRef.current.typing = false;\n }, resetMs);\n const prevIndex = prevIndexRef.current;\n const orderedList = [...listContent.slice((prevIndex || 0) + 1), ...listContent.slice(0, (prevIndex || 0) + 1)];\n const str = findMatchRef.current ? findMatchRef.current(orderedList, stringRef.current) : orderedList.find(text => (text == null ? void 0 : text.toLocaleLowerCase().indexOf(stringRef.current.toLocaleLowerCase())) === 0);\n const index = str ? listContent.indexOf(str) : -1;\n if (index !== -1) {\n onMatch(index);\n matchIndexRef.current = index;\n }\n }\n return {\n reference: {\n onKeyDown\n },\n floating: {\n onKeyDown\n }\n };\n }, [enabled, dataRef, listRef, resetMs, ignoreKeysRef, findMatchRef, onMatch, refs]);\n};\n\nfunction getArgsWithCustomFloatingHeight(state, height) {\n return {\n ...state,\n rects: {\n ...state.rects,\n floating: {\n ...state.rects.floating,\n height\n }\n }\n };\n}\n/**\n * Positions the floating element such that an inner element inside\n * of it is anchored to the reference element.\n * @see https://floating-ui.com/docs/inner\n */\nconst inner = props => ({\n name: 'inner',\n options: props,\n async fn(state) {\n const {\n listRef,\n overflowRef,\n onFallbackChange,\n offset: innerOffset = 0,\n index = 0,\n minItemsVisible = 4,\n referenceOverflowThreshold = 0,\n scrollRef,\n ...detectOverflowOptions\n } = props;\n const {\n rects,\n elements: {\n floating\n }\n } = state;\n const item = listRef.current[index];\n if (process.env.NODE_ENV !== \"production\") {\n if (!state.placement.startsWith('bottom')) {\n console.warn(['Floating UI: `placement` side must be \"bottom\" when using the', '`inner` middleware.'].join(' '));\n }\n }\n if (!item) {\n return {};\n }\n const nextArgs = {\n ...state,\n ...(await offset(-item.offsetTop - rects.reference.height / 2 - item.offsetHeight / 2 - innerOffset).fn(state))\n };\n const el = (scrollRef == null ? void 0 : scrollRef.current) || floating;\n const overflow = await detectOverflow(getArgsWithCustomFloatingHeight(nextArgs, el.scrollHeight), detectOverflowOptions);\n const refOverflow = await detectOverflow(nextArgs, {\n ...detectOverflowOptions,\n elementContext: 'reference'\n });\n const diffY = Math.max(0, overflow.top);\n const nextY = nextArgs.y + diffY;\n const maxHeight = Math.max(0, el.scrollHeight - diffY - Math.max(0, overflow.bottom));\n el.style.maxHeight = maxHeight + \"px\";\n el.scrollTop = diffY;\n\n // There is not enough space, fallback to standard anchored positioning\n if (onFallbackChange) {\n if (el.offsetHeight < item.offsetHeight * Math.min(minItemsVisible, listRef.current.length - 1) - 1 || refOverflow.top >= -referenceOverflowThreshold || refOverflow.bottom >= -referenceOverflowThreshold) {\n flushSync(() => onFallbackChange(true));\n } else {\n flushSync(() => onFallbackChange(false));\n }\n }\n if (overflowRef) {\n overflowRef.current = await detectOverflow(getArgsWithCustomFloatingHeight({\n ...nextArgs,\n y: nextY\n }, el.offsetHeight), detectOverflowOptions);\n }\n return {\n y: nextY\n };\n }\n});\n/**\n * Changes the `inner` middleware's `offset` upon a `wheel` event to\n * expand the floating element's height, revealing more list items.\n * @see https://floating-ui.com/docs/inner\n */\nconst useInnerOffset = (_ref, _ref2) => {\n let {\n open,\n elements\n } = _ref;\n let {\n enabled = true,\n overflowRef,\n scrollRef,\n onChange: unstable_onChange\n } = _ref2;\n const onChange = useEvent(unstable_onChange);\n const controlledScrollingRef = React.useRef(false);\n const prevScrollTopRef = React.useRef(null);\n const initialOverflowRef = React.useRef(null);\n React.useEffect(() => {\n if (!enabled) {\n return;\n }\n function onWheel(e) {\n if (e.ctrlKey || !el || overflowRef.current == null) {\n return;\n }\n const dY = e.deltaY;\n const isAtTop = overflowRef.current.top >= -0.5;\n const isAtBottom = overflowRef.current.bottom >= -0.5;\n const remainingScroll = el.scrollHeight - el.clientHeight;\n const sign = dY < 0 ? -1 : 1;\n const method = dY < 0 ? 'max' : 'min';\n if (el.scrollHeight <= el.clientHeight) {\n return;\n }\n if (!isAtTop && dY > 0 || !isAtBottom && dY < 0) {\n e.preventDefault();\n flushSync(() => {\n onChange(d => d + Math[method](dY, remainingScroll * sign));\n });\n } else if (/firefox/i.test(getUserAgent())) {\n // Needed to propagate scrolling during momentum scrolling phase once\n // it gets limited by the boundary. UX improvement, not critical.\n el.scrollTop += dY;\n }\n }\n const el = (scrollRef == null ? void 0 : scrollRef.current) || elements.floating;\n if (open && el) {\n el.addEventListener('wheel', onWheel);\n\n // Wait for the position to be ready.\n requestAnimationFrame(() => {\n prevScrollTopRef.current = el.scrollTop;\n if (overflowRef.current != null) {\n initialOverflowRef.current = {\n ...overflowRef.current\n };\n }\n });\n return () => {\n prevScrollTopRef.current = null;\n initialOverflowRef.current = null;\n el.removeEventListener('wheel', onWheel);\n };\n }\n }, [enabled, open, elements.floating, overflowRef, scrollRef, onChange]);\n return React.useMemo(() => {\n if (!enabled) {\n return {};\n }\n return {\n floating: {\n onKeyDown() {\n controlledScrollingRef.current = true;\n },\n onWheel() {\n controlledScrollingRef.current = false;\n },\n onPointerMove() {\n controlledScrollingRef.current = false;\n },\n onScroll() {\n const el = (scrollRef == null ? void 0 : scrollRef.current) || elements.floating;\n if (!overflowRef.current || !el || !controlledScrollingRef.current) {\n return;\n }\n if (prevScrollTopRef.current !== null) {\n const scrollDiff = el.scrollTop - prevScrollTopRef.current;\n if (overflowRef.current.bottom < -0.5 && scrollDiff < -1 || overflowRef.current.top < -0.5 && scrollDiff > 1) {\n flushSync(() => onChange(d => d + scrollDiff));\n }\n }\n\n // [Firefox] Wait for the height change to have been applied.\n requestAnimationFrame(() => {\n prevScrollTopRef.current = el.scrollTop;\n });\n }\n }\n };\n }, [enabled, overflowRef, elements.floating, scrollRef, onChange]);\n};\n\nfunction isPointInPolygon(point, polygon) {\n const [x, y] = point;\n let isInside = false;\n const length = polygon.length;\n for (let i = 0, j = length - 1; i < length; j = i++) {\n const [xi, yi] = polygon[i] || [0, 0];\n const [xj, yj] = polygon[j] || [0, 0];\n const intersect = yi >= y !== yj >= y && x <= (xj - xi) * (y - yi) / (yj - yi) + xi;\n if (intersect) {\n isInside = !isInside;\n }\n }\n return isInside;\n}\nfunction isInside(point, rect) {\n return point[0] >= rect.x && point[0] <= rect.x + rect.width && point[1] >= rect.y && point[1] <= rect.y + rect.height;\n}\nfunction safePolygon(_temp) {\n let {\n restMs = 0,\n buffer = 0.5,\n blockPointerEvents = false\n } = _temp === void 0 ? {} : _temp;\n let timeoutId;\n let isInsideRect = false;\n let hasLanded = false;\n const fn = _ref => {\n let {\n x,\n y,\n placement,\n elements,\n onClose,\n nodeId,\n tree\n } = _ref;\n return function onMouseMove(event) {\n function close() {\n clearTimeout(timeoutId);\n onClose();\n }\n clearTimeout(timeoutId);\n if (!elements.domReference || !elements.floating || placement == null || x == null || y == null) {\n return;\n }\n const {\n clientX,\n clientY\n } = event;\n const clientPoint = [clientX, clientY];\n const target = getTarget(event);\n const isLeave = event.type === 'mouseleave';\n const isOverFloatingEl = contains(elements.floating, target);\n const isOverReferenceEl = contains(elements.domReference, target);\n const refRect = elements.domReference.getBoundingClientRect();\n const rect = elements.floating.getBoundingClientRect();\n const side = placement.split('-')[0];\n const cursorLeaveFromRight = x > rect.right - rect.width / 2;\n const cursorLeaveFromBottom = y > rect.bottom - rect.height / 2;\n const isOverReferenceRect = isInside(clientPoint, refRect);\n if (isOverFloatingEl) {\n hasLanded = true;\n if (!isLeave) {\n return;\n }\n }\n if (isOverReferenceEl) {\n hasLanded = false;\n }\n if (isOverReferenceEl && !isLeave) {\n hasLanded = true;\n return;\n }\n\n // Prevent overlapping floating element from being stuck in an open-close\n // loop: https://github.com/floating-ui/floating-ui/issues/1910\n if (isLeave && isElement(event.relatedTarget) && contains(elements.floating, event.relatedTarget)) {\n return;\n }\n\n // If any nested child is open, abort.\n if (tree && getChildren(tree.nodesRef.current, nodeId).some(_ref2 => {\n let {\n context\n } = _ref2;\n return context == null ? void 0 : context.open;\n })) {\n return;\n }\n\n // If the pointer is leaving from the opposite side, the \"buffer\" logic\n // creates a point where the floating element remains open, but should be\n // ignored.\n // A constant of 1 handles floating point rounding errors.\n if (side === 'top' && y >= refRect.bottom - 1 || side === 'bottom' && y <= refRect.top + 1 || side === 'left' && x >= refRect.right - 1 || side === 'right' && x <= refRect.left + 1) {\n return close();\n }\n\n // Ignore when the cursor is within the rectangular trough between the\n // two elements. Since the triangle is created from the cursor point,\n // which can start beyond the ref element's edge, traversing back and\n // forth from the ref to the floating element can cause it to close. This\n // ensures it always remains open in that case.\n let rectPoly = [];\n switch (side) {\n case 'top':\n rectPoly = [[rect.left, refRect.top + 1], [rect.left, rect.bottom - 1], [rect.right, rect.bottom - 1], [rect.right, refRect.top + 1]];\n isInsideRect = clientX >= rect.left && clientX <= rect.right && clientY >= rect.top && clientY <= refRect.top + 1;\n break;\n case 'bottom':\n rectPoly = [[rect.left, rect.top + 1], [rect.left, refRect.bottom - 1], [rect.right, refRect.bottom - 1], [rect.right, rect.top + 1]];\n isInsideRect = clientX >= rect.left && clientX <= rect.right && clientY >= refRect.bottom - 1 && clientY <= rect.bottom;\n break;\n case 'left':\n rectPoly = [[rect.right - 1, rect.bottom], [rect.right - 1, rect.top], [refRect.left + 1, rect.top], [refRect.left + 1, rect.bottom]];\n isInsideRect = clientX >= rect.left && clientX <= refRect.left + 1 && clientY >= rect.top && clientY <= rect.bottom;\n break;\n case 'right':\n rectPoly = [[refRect.right - 1, rect.bottom], [refRect.right - 1, rect.top], [rect.left + 1, rect.top], [rect.left + 1, rect.bottom]];\n isInsideRect = clientX >= refRect.right - 1 && clientX <= rect.right && clientY >= rect.top && clientY <= rect.bottom;\n break;\n }\n function getPolygon(_ref3) {\n let [x, y] = _ref3;\n const isFloatingWider = rect.width > refRect.width;\n const isFloatingTaller = rect.height > refRect.height;\n switch (side) {\n case 'top':\n {\n const cursorPointOne = [isFloatingWider ? x + buffer / 2 : cursorLeaveFromRight ? x + buffer * 4 : x - buffer * 4, y + buffer + 1];\n const cursorPointTwo = [isFloatingWider ? x - buffer / 2 : cursorLeaveFromRight ? x + buffer * 4 : x - buffer * 4, y + buffer + 1];\n const commonPoints = [[rect.left, cursorLeaveFromRight ? rect.bottom - buffer : isFloatingWider ? rect.bottom - buffer : rect.top], [rect.right, cursorLeaveFromRight ? isFloatingWider ? rect.bottom - buffer : rect.top : rect.bottom - buffer]];\n return [cursorPointOne, cursorPointTwo, ...commonPoints];\n }\n case 'bottom':\n {\n const cursorPointOne = [isFloatingWider ? x + buffer / 2 : cursorLeaveFromRight ? x + buffer * 4 : x - buffer * 4, y - buffer];\n const cursorPointTwo = [isFloatingWider ? x - buffer / 2 : cursorLeaveFromRight ? x + buffer * 4 : x - buffer * 4, y - buffer];\n const commonPoints = [[rect.left, cursorLeaveFromRight ? rect.top + buffer : isFloatingWider ? rect.top + buffer : rect.bottom], [rect.right, cursorLeaveFromRight ? isFloatingWider ? rect.top + buffer : rect.bottom : rect.top + buffer]];\n return [cursorPointOne, cursorPointTwo, ...commonPoints];\n }\n case 'left':\n {\n const cursorPointOne = [x + buffer + 1, isFloatingTaller ? y + buffer / 2 : cursorLeaveFromBottom ? y + buffer * 4 : y - buffer * 4];\n const cursorPointTwo = [x + buffer + 1, isFloatingTaller ? y - buffer / 2 : cursorLeaveFromBottom ? y + buffer * 4 : y - buffer * 4];\n const commonPoints = [[cursorLeaveFromBottom ? rect.right - buffer : isFloatingTaller ? rect.right - buffer : rect.left, rect.top], [cursorLeaveFromBottom ? isFloatingTaller ? rect.right - buffer : rect.left : rect.right - buffer, rect.bottom]];\n return [...commonPoints, cursorPointOne, cursorPointTwo];\n }\n case 'right':\n {\n const cursorPointOne = [x - buffer, isFloatingTaller ? y + buffer / 2 : cursorLeaveFromBottom ? y + buffer * 4 : y - buffer * 4];\n const cursorPointTwo = [x - buffer, isFloatingTaller ? y - buffer / 2 : cursorLeaveFromBottom ? y + buffer * 4 : y - buffer * 4];\n const commonPoints = [[cursorLeaveFromBottom ? rect.left + buffer : isFloatingTaller ? rect.left + buffer : rect.right, rect.top], [cursorLeaveFromBottom ? isFloatingTaller ? rect.left + buffer : rect.right : rect.left + buffer, rect.bottom]];\n return [cursorPointOne, cursorPointTwo, ...commonPoints];\n }\n }\n }\n const poly = isInsideRect ? rectPoly : getPolygon([x, y]);\n if (isInsideRect) {\n return;\n } else if (hasLanded && !isOverReferenceRect) {\n return close();\n }\n if (!isPointInPolygon([clientX, clientY], poly)) {\n close();\n } else if (restMs && !hasLanded) {\n timeoutId = setTimeout(close, restMs);\n }\n };\n };\n fn.__options = {\n blockPointerEvents\n };\n return fn;\n}\n\n/**\n * Provides data to position a floating element and context to add interactions.\n * @see https://floating-ui.com/docs/react\n */\nfunction useFloating(options) {\n if (options === void 0) {\n options = {};\n }\n const {\n open = false,\n onOpenChange: unstable_onOpenChange,\n nodeId\n } = options;\n const position = useFloating$1(options);\n const tree = useFloatingTree();\n const domReferenceRef = React.useRef(null);\n const dataRef = React.useRef({});\n const events = React.useState(() => createPubSub())[0];\n const [domReference, setDomReference] = React.useState(null);\n const setPositionReference = React.useCallback(node => {\n const positionReference = isElement(node) ? {\n getBoundingClientRect: () => node.getBoundingClientRect(),\n contextElement: node\n } : node;\n position.refs.setReference(positionReference);\n }, [position.refs]);\n const setReference = React.useCallback(node => {\n if (isElement(node) || node === null) {\n domReferenceRef.current = node;\n setDomReference(node);\n }\n\n // Backwards-compatibility for passing a virtual element to `reference`\n // after it has set the DOM reference.\n if (isElement(position.refs.reference.current) || position.refs.reference.current === null ||\n // Don't allow setting virtual elements using the old technique back to\n // `null` to support `positionReference` + an unstable `reference`\n // callback ref.\n node !== null && !isElement(node)) {\n position.refs.setReference(node);\n }\n }, [position.refs]);\n const refs = React.useMemo(() => ({\n ...position.refs,\n setReference,\n setPositionReference,\n domReference: domReferenceRef\n }), [position.refs, setReference, setPositionReference]);\n const elements = React.useMemo(() => ({\n ...position.elements,\n domReference: domReference\n }), [position.elements, domReference]);\n const onOpenChange = useEvent(unstable_onOpenChange);\n const context = React.useMemo(() => ({\n ...position,\n refs,\n elements,\n dataRef,\n nodeId,\n events,\n open,\n onOpenChange\n }), [position, nodeId, events, open, onOpenChange, refs, elements]);\n index(() => {\n const node = tree == null ? void 0 : tree.nodesRef.current.find(node => node.id === nodeId);\n if (node) {\n node.context = context;\n }\n });\n return React.useMemo(() => ({\n ...position,\n context,\n refs,\n reference: setReference,\n positionReference: setPositionReference\n }), [position, refs, context, setReference, setPositionReference]);\n}\n\nfunction mergeProps(userProps, propsList, elementKey) {\n const map = new Map();\n return {\n ...(elementKey === 'floating' && {\n tabIndex: -1\n }),\n ...userProps,\n ...propsList.map(value => value ? value[elementKey] : null).concat(userProps).reduce((acc, props) => {\n if (!props) {\n return acc;\n }\n Object.entries(props).forEach(_ref => {\n let [key, value] = _ref;\n if (key.indexOf('on') === 0) {\n if (!map.has(key)) {\n map.set(key, []);\n }\n if (typeof value === 'function') {\n var _map$get;\n (_map$get = map.get(key)) == null ? void 0 : _map$get.push(value);\n acc[key] = function () {\n var _map$get2;\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n (_map$get2 = map.get(key)) == null ? void 0 : _map$get2.forEach(fn => fn(...args));\n };\n }\n } else {\n acc[key] = value;\n }\n });\n return acc;\n }, {})\n };\n}\nconst useInteractions = function (propsList) {\n if (propsList === void 0) {\n propsList = [];\n }\n // The dependencies are a dynamic array, so we can't use the linter's\n // suggestion to add it to the deps array.\n const deps = propsList;\n const getReferenceProps = React.useCallback(userProps => mergeProps(userProps, propsList, 'reference'),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n deps);\n const getFloatingProps = React.useCallback(userProps => mergeProps(userProps, propsList, 'floating'),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n deps);\n const getItemProps = React.useCallback(userProps => mergeProps(userProps, propsList, 'item'),\n // Granularly check for `item` changes, because the `getItemProps` getter\n // should be as referentially stable as possible since it may be passed as\n // a prop to many components. All `item` key values must therefore be\n // memoized.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n propsList.map(key => key == null ? void 0 : key.item));\n return React.useMemo(() => ({\n getReferenceProps,\n getFloatingProps,\n getItemProps\n }), [getReferenceProps, getFloatingProps, getItemProps]);\n};\n\nexport { FloatingDelayGroup, FloatingFocusManager, FloatingNode, FloatingOverlay, FloatingPortal, FloatingTree, inner, safePolygon, useClick, useDelayGroup, useDelayGroupContext, useDismiss, useFloating, useFloatingNodeId, useFloatingParentNodeId, useFloatingPortalNode, useFloatingTree, useFocus, useHover, useId, useInnerOffset, useInteractions, useListNavigation, useMergeRefs, useRole, useTransitionStatus, useTransitionStyles, useTypeahead };\n","import { createContext, useContext } from 'react';\n\nconst TooltipGroupContext = createContext(false);\n\nexport const TooltipGroupProvider = TooltipGroupContext.Provider;\nexport const useTooltipGroupContext = () => useContext(TooltipGroupContext);\n","import React from 'react';\nimport { FloatingDelayGroup } from '@floating-ui/react';\nimport { TooltipGroupProvider } from './TooltipGroup.context';\n\nexport interface TooltipGroupProps {\n /** <Tooltip /> components */\n children: React.ReactNode;\n\n /** Open delay in ms */\n openDelay?: number;\n\n /** Close delay in ms */\n closeDelay?: number;\n}\n\nexport function TooltipGroup({ children, openDelay = 0, closeDelay = 0 }: TooltipGroupProps) {\n return (\n <TooltipGroupProvider value>\n <FloatingDelayGroup delay={{ open: openDelay, close: closeDelay }}>\n {children}\n </FloatingDelayGroup>\n </TooltipGroupProvider>\n );\n}\n\nTooltipGroup.displayName = '@mantine/core/TooltipGroup';\n","import {\n createStyles,\n CSSObject,\n MantineColor,\n MantineNumberSize,\n MantineTheme,\n} from '@mantine/styles';\n\nexport interface TooltipStylesParams {\n color: MantineColor;\n radius: MantineNumberSize;\n width: number | 'auto';\n multiline: boolean;\n}\n\nfunction getColors(theme: MantineTheme, color?: MantineColor): CSSObject {\n if (!color) {\n return {\n backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[6] : theme.colors.gray[9],\n color: theme.white,\n };\n }\n\n const colors = theme.fn.variant({ variant: 'filled', color, primaryFallback: false });\n\n return {\n backgroundColor: colors.background,\n color: colors.color,\n };\n}\n\nexport default createStyles((theme, { color, radius, width, multiline }: TooltipStylesParams) => ({\n tooltip: {\n ...theme.fn.fontStyles(),\n ...getColors(theme, color),\n lineHeight: theme.lineHeight,\n fontSize: theme.fontSizes.sm,\n borderRadius: theme.fn.radius(radius),\n padding: `calc(${theme.spacing.xs}px / 2) ${theme.spacing.xs}px`,\n position: 'absolute',\n whiteSpace: multiline ? 'unset' : 'nowrap',\n pointerEvents: 'none',\n width,\n },\n\n arrow: {\n backgroundColor: 'inherit',\n border: 0,\n zIndex: 1,\n },\n}));\n","export const TOOLTIP_ERRORS = {\n children:\n 'Tooltip component children should be an element or a component that accepts ref, fragments, strings, numbers and other primitive values are not supported',\n};\n","import React, { cloneElement } from 'react';\nimport { isElement } from '@mantine/utils';\nimport { useMergedRef } from '@mantine/hooks';\nimport { getDefaultZIndex, useComponentDefaultProps } from '@mantine/styles';\nimport { Box } from '../../Box';\nimport { OptionalPortal } from '../../Portal';\nimport { TooltipBaseProps } from '../Tooltip.types';\nimport useStyles from '../Tooltip.styles';\nimport { TOOLTIP_ERRORS } from '../Tooltip.errors';\nimport { useFloatingTooltip } from './use-floating-tooltip';\n\nexport interface TooltipFloatingProps extends TooltipBaseProps {\n /** Offset from mouse in px */\n offset?: number;\n}\n\nconst defaultProps: Partial<TooltipFloatingProps> = {\n refProp: 'ref',\n withinPortal: true,\n offset: 10,\n position: 'right',\n zIndex: getDefaultZIndex('popover'),\n};\n\nexport function TooltipFloating(props: TooltipFloatingProps) {\n const {\n children,\n refProp,\n withinPortal,\n style,\n className,\n classNames,\n styles,\n unstyled,\n radius,\n color,\n label,\n offset,\n position,\n multiline,\n width,\n zIndex,\n disabled,\n ...others\n } = useComponentDefaultProps('TooltipFloating', defaultProps, props);\n\n const { handleMouseMove, x, y, opened, boundaryRef, floating, setOpened } = useFloatingTooltip({\n offset,\n position,\n });\n\n const { classes, cx } = useStyles(\n { radius, color, multiline, width },\n { name: 'TooltipFloating', classNames, styles, unstyled }\n );\n\n if (!isElement(children)) {\n throw new Error(TOOLTIP_ERRORS.children);\n }\n\n const targetRef = useMergedRef(boundaryRef, (children as any).ref);\n\n const onMouseEnter = (event: React.MouseEvent<unknown, MouseEvent>) => {\n children.props.onMouseEnter?.(event);\n handleMouseMove(event);\n setOpened(true);\n };\n\n const onMouseLeave = (event: React.MouseEvent<unknown, MouseEvent>) => {\n children.props.onMouseLeave?.(event);\n setOpened(false);\n };\n\n return (\n <>\n <OptionalPortal withinPortal={withinPortal}>\n <Box\n {...others}\n ref={floating}\n className={cx(classes.tooltip, className)}\n style={{\n ...style,\n zIndex,\n display: !disabled && opened ? 'block' : 'none',\n top: y ?? '',\n left: Math.round(x) ?? '',\n }}\n >\n {label}\n </Box>\n </OptionalPortal>\n\n {cloneElement(children, {\n ...children.props,\n [refProp]: targetRef,\n onMouseEnter,\n onMouseLeave,\n })}\n </>\n );\n}\n\nTooltipFloating.displayName = '@mantine/core/TooltipFloating';\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { useFloating, shift, getOverflowAncestors } from '@floating-ui/react';\nimport { FloatingPosition } from '../../Floating';\n\ninterface UseFloatingTooltip {\n offset: number;\n position: FloatingPosition;\n}\n\nexport function useFloatingTooltip<T extends HTMLElement = any>({\n offset,\n position,\n}: UseFloatingTooltip) {\n const [opened, setOpened] = useState(false);\n const boundaryRef = useRef<T>();\n const { x, y, reference, floating, refs, update, placement } = useFloating({\n placement: position,\n middleware: [\n shift({\n crossAxis: true,\n padding: 5,\n rootBoundary: 'document',\n }),\n ],\n });\n\n const horizontalOffset = placement.includes('right')\n ? offset\n : position.includes('left')\n ? offset * -1\n : 0;\n\n const verticalOffset = placement.includes('bottom')\n ? offset\n : position.includes('top')\n ? offset * -1\n : 0;\n\n const handleMouseMove = useCallback(\n ({ clientX, clientY }: MouseEvent | React.MouseEvent<T, MouseEvent>) => {\n reference({\n getBoundingClientRect() {\n return {\n width: 0,\n height: 0,\n x: clientX,\n y: clientY,\n left: clientX + horizontalOffset,\n top: clientY + verticalOffset,\n right: clientX,\n bottom: clientY,\n };\n },\n });\n },\n [reference]\n );\n\n useEffect(() => {\n if (refs.floating.current) {\n const boundary = boundaryRef.current;\n boundary.addEventListener('mousemove', handleMouseMove);\n\n const parents = getOverflowAncestors(refs.floating.current);\n parents.forEach((parent) => {\n parent.addEventListener('scroll', update);\n });\n\n return () => {\n boundary.removeEventListener('mousemove', handleMouseMove);\n parents.forEach((parent) => {\n parent.removeEventListener('scroll', update);\n });\n };\n }\n\n return undefined;\n }, [reference, refs.floating.current, update, handleMouseMove, opened]);\n\n return { handleMouseMove, x, y, opened, setOpened, boundaryRef, floating };\n}\n","import { useState, useEffect } from 'react';\nimport { autoUpdate } from '@floating-ui/react';\nimport { useDidUpdate } from '@mantine/hooks';\n\ninterface Payload {\n opened: boolean;\n floating: {\n update(): void;\n refs: {\n floating: React.MutableRefObject<any>;\n reference: React.MutableRefObject<any>;\n };\n };\n positionDependencies: any[];\n}\n\nexport function useFloatingAutoUpdate({ opened, floating, positionDependencies }: Payload) {\n const [delayedUpdate, setDelayedUpdate] = useState(0);\n\n useEffect(() => {\n if (floating.refs.reference.current && floating.refs.floating.current) {\n return autoUpdate(\n floating.refs.reference.current,\n floating.refs.floating.current,\n floating.update\n );\n }\n\n return undefined;\n }, [floating.refs.reference.current, floating.refs.floating.current, opened, delayedUpdate]);\n\n useDidUpdate(() => {\n floating.update();\n }, positionDependencies);\n\n useDidUpdate(() => {\n setDelayedUpdate((c) => c + 1);\n }, [opened]);\n}\n","import { useState, useCallback } from 'react';\nimport {\n useFloating,\n flip,\n arrow,\n offset,\n shift,\n useInteractions,\n useHover,\n useFocus,\n useRole,\n useDismiss,\n useDelayGroupContext,\n useDelayGroup,\n inline,\n} from '@floating-ui/react';\nimport { useId, useDidUpdate } from '@mantine/hooks';\nimport { useTooltipGroupContext } from './TooltipGroup/TooltipGroup.context';\nimport { FloatingPosition, useFloatingAutoUpdate } from '../Floating';\n\ninterface UseTooltip {\n position: FloatingPosition;\n closeDelay: number;\n openDelay: number;\n onPositionChange?(position: FloatingPosition): void;\n opened?: boolean;\n offset: number;\n arrowRef?: React.RefObject<HTMLDivElement>;\n arrowOffset: number;\n events: { hover: boolean; focus: boolean; touch: boolean };\n positionDependencies: any[];\n inline: boolean;\n}\n\nexport function useTooltip(settings: UseTooltip) {\n const [uncontrolledOpened, setUncontrolledOpened] = useState(false);\n const controlled = typeof settings.opened === 'boolean';\n const opened = controlled ? settings.opened : uncontrolledOpened;\n const withinGroup = useTooltipGroupContext();\n const uid = useId();\n\n const { delay: groupDelay, currentId, setCurrentId } = useDelayGroupContext();\n\n const onChange = useCallback(\n (_opened: boolean) => {\n setUncontrolledOpened(_opened);\n\n if (_opened) {\n setCurrentId(uid);\n }\n },\n [setCurrentId, uid]\n );\n\n const {\n x,\n y,\n reference,\n floating,\n context,\n refs,\n update,\n placement,\n middlewareData: { arrow: { x: arrowX, y: arrowY } = {} },\n } = useFloating({\n placement: settings.position,\n open: opened,\n onOpenChange: onChange,\n middleware: [\n offset(settings.offset),\n shift({ padding: 8 }),\n flip(),\n arrow({ element: settings.arrowRef, padding: settings.arrowOffset }),\n ...(settings.inline ? [inline()] : []),\n ],\n });\n\n const { getReferenceProps, getFloatingProps } = useInteractions([\n useHover(context, {\n enabled: settings.events.hover,\n delay: withinGroup ? groupDelay : { open: settings.openDelay, close: settings.closeDelay },\n mouseOnly: !settings.events.touch,\n }),\n useFocus(context, { enabled: settings.events.focus, keyboardOnly: true }),\n useRole(context, { role: 'tooltip' }),\n // cannot be used with controlled tooltip, page jumps\n useDismiss(context, { enabled: typeof settings.opened === undefined }),\n useDelayGroup(context, { id: uid }),\n ]);\n\n useFloatingAutoUpdate({\n opened,\n positionDependencies: settings.positionDependencies,\n floating: { refs, update },\n });\n\n useDidUpdate(() => {\n settings.onPositionChange?.(placement);\n }, [placement]);\n\n const isGroupPhase = opened && currentId && currentId !== uid;\n\n return {\n x,\n y,\n arrowX,\n arrowY,\n reference,\n floating,\n getFloatingProps,\n getReferenceProps,\n isGroupPhase,\n opened,\n placement,\n };\n}\n","import type { FloatingPosition, FloatingSide, FloatingPlacement } from '../types';\n\nexport function getFloatingPosition(\n dir: 'rtl' | 'ltr',\n position: FloatingPosition\n): FloatingPosition {\n if (dir === 'rtl' && (position.includes('right') || position.includes('left'))) {\n const [side, placement] = position.split('-') as [FloatingSide, FloatingPlacement];\n const flippedPosition = side === 'right' ? 'left' : 'right';\n return placement === undefined ? flippedPosition : `${flippedPosition}-${placement}`;\n }\n\n return position;\n}\n","import { CSSObject } from '@mantine/styles';\nimport type { FloatingPosition, FloatingSide, FloatingPlacement, ArrowPosition } from '../types';\n\nfunction horizontalSide(\n placement: FloatingPlacement | 'center',\n arrowY: number,\n arrowOffset: number,\n arrowPosition: ArrowPosition\n) {\n if (placement === 'center' || arrowPosition === 'center') {\n return { top: arrowY };\n }\n\n if (placement === 'end') {\n return { bottom: arrowOffset };\n }\n\n if (placement === 'start') {\n return { top: arrowOffset };\n }\n\n return {};\n}\n\nfunction verticalSide(\n placement: FloatingPlacement | 'center',\n arrowX: number,\n arrowOffset: number,\n arrowPosition: ArrowPosition,\n dir: 'rtl' | 'ltr'\n) {\n if (placement === 'center' || arrowPosition === 'center') {\n return { left: arrowX };\n }\n\n if (placement === 'end') {\n return { [dir === 'ltr' ? 'right' : 'left']: arrowOffset };\n }\n\n if (placement === 'start') {\n return { [dir === 'ltr' ? 'left' : 'right']: arrowOffset };\n }\n\n return {};\n}\n\nconst radiusByFloatingSide: Record<\n FloatingSide,\n keyof Pick<\n CSSObject,\n | 'borderBottomLeftRadius'\n | 'borderBottomRightRadius'\n | 'borderTopLeftRadius'\n | 'borderTopRightRadius'\n >\n> = {\n bottom: 'borderTopLeftRadius',\n left: 'borderTopRightRadius',\n right: 'borderBottomLeftRadius',\n top: 'borderBottomRightRadius',\n};\n\nexport function getArrowPositionStyles({\n position,\n withBorder,\n arrowSize,\n arrowOffset,\n arrowRadius,\n arrowPosition,\n arrowX,\n arrowY,\n dir,\n}: {\n position: FloatingPosition;\n withBorder: boolean;\n arrowSize: number;\n arrowOffset: number;\n arrowRadius: number;\n arrowPosition: ArrowPosition;\n arrowX: number;\n arrowY: number;\n dir: 'rtl' | 'ltr';\n}) {\n const [side, placement = 'center'] = position.split('-') as [FloatingSide, FloatingPlacement];\n const baseStyles = {\n width: arrowSize,\n height: arrowSize,\n transform: 'rotate(45deg)',\n position: 'absolute',\n [radiusByFloatingSide[side]]: arrowRadius,\n };\n\n const arrowPlacement = withBorder ? -arrowSize / 2 - 1 : -arrowSize / 2;\n\n if (side === 'left') {\n return {\n ...baseStyles,\n ...horizontalSide(placement, arrowY, arrowOffset, arrowPosition),\n right: arrowPlacement,\n borderLeft: 0,\n borderBottom: 0,\n };\n }\n\n if (side === 'right') {\n return {\n ...baseStyles,\n ...horizontalSide(placement, arrowY, arrowOffset, arrowPosition),\n left: arrowPlacement,\n borderRight: 0,\n borderTop: 0,\n };\n }\n\n if (side === 'top') {\n return {\n ...baseStyles,\n ...verticalSide(placement, arrowX, arrowOffset, arrowPosition, dir),\n bottom: arrowPlacement,\n borderTop: 0,\n borderLeft: 0,\n };\n }\n\n if (side === 'bottom') {\n return {\n ...baseStyles,\n ...verticalSide(placement, arrowX, arrowOffset, arrowPosition, dir),\n top: arrowPlacement,\n borderBottom: 0,\n borderRight: 0,\n };\n }\n\n return {};\n}\n","import React, { forwardRef } from 'react';\nimport { useMantineTheme } from '@mantine/styles';\nimport { getArrowPositionStyles } from './get-arrow-position-styles';\nimport { ArrowPosition, FloatingPosition } from '../types';\n\ninterface FloatingArrowProps extends React.ComponentPropsWithoutRef<'div'> {\n withBorder: boolean;\n position: FloatingPosition;\n arrowSize: number;\n arrowOffset: number;\n arrowRadius: number;\n arrowPosition: ArrowPosition;\n arrowX: number;\n arrowY: number;\n visible: boolean;\n}\n\nexport const FloatingArrow = forwardRef<HTMLDivElement, FloatingArrowProps>(\n (\n {\n withBorder,\n position,\n arrowSize,\n arrowOffset,\n arrowRadius,\n arrowPosition,\n visible,\n arrowX,\n arrowY,\n ...others\n },\n ref\n ) => {\n const theme = useMantineTheme();\n if (!visible) {\n return null;\n }\n\n return (\n <div\n {...others}\n ref={ref}\n style={getArrowPositionStyles({\n withBorder,\n position,\n arrowSize,\n arrowOffset,\n arrowRadius,\n arrowPosition,\n dir: theme.dir,\n arrowX,\n arrowY,\n })}\n />\n );\n }\n);\n\nFloatingArrow.displayName = '@mantine/core/FloatingArrow';\n","import React, { cloneElement, forwardRef, useRef } from 'react';\nimport { isElement, ForwardRefWithStaticComponents } from '@mantine/utils';\nimport { useMergedRef } from '@mantine/hooks';\nimport { getDefaultZIndex, useComponentDefaultProps } from '@mantine/styles';\nimport { TooltipGroup } from './TooltipGroup/TooltipGroup';\nimport { TooltipFloating } from './TooltipFloating/TooltipFloating';\nimport { useTooltip } from './use-tooltip';\nimport { FloatingArrow, getFloatingPosition, FloatingPosition, ArrowPosition } from '../Floating';\nimport { MantineTransition, Transition } from '../Transition';\nimport { OptionalPortal } from '../Portal';\nimport { Box } from '../Box';\nimport { TOOLTIP_ERRORS } from './Tooltip.errors';\nimport { TooltipBaseProps } from './Tooltip.types';\nimport useStyles from './Tooltip.styles';\n\nexport interface TooltipProps extends TooltipBaseProps {\n /** Called when tooltip position changes */\n onPositionChange?(position: FloatingPosition): void;\n\n /** Open delay in ms */\n openDelay?: number;\n\n /** Close delay in ms */\n closeDelay?: number;\n\n /** Controls opened state */\n opened?: boolean;\n\n /** Space between target element and tooltip in px */\n offset?: number;\n\n /** Determines whether component should have an arrow */\n withArrow?: boolean;\n\n /** Arrow size in px */\n arrowSize?: number;\n\n /** Arrow offset in px */\n arrowOffset?: number;\n\n /** Arrow radius in px */\n arrowRadius?: number;\n\n /** Arrow position **/\n arrowPosition?: ArrowPosition;\n\n /** One of premade transitions ot transition object */\n transition?: MantineTransition;\n\n /** Transition duration in ms */\n transitionDuration?: number;\n\n /** Determines which events will be used to show tooltip */\n events?: { hover: boolean; focus: boolean; touch: boolean };\n\n /** useEffect dependencies to force update tooltip position */\n positionDependencies?: any[];\n\n /** Set if tooltip is attached to an inline element */\n inline?: boolean;\n}\n\nconst defaultProps: Partial<TooltipProps> = {\n position: 'top',\n refProp: 'ref',\n withinPortal: false,\n inline: false,\n arrowSize: 4,\n arrowOffset: 5,\n arrowRadius: 0,\n arrowPosition: 'side',\n offset: 5,\n transition: 'fade',\n transitionDuration: 100,\n width: 'auto',\n events: { hover: true, focus: false, touch: false },\n zIndex: getDefaultZIndex('popover'),\n positionDependencies: [],\n};\n\nconst _Tooltip = forwardRef<HTMLElement, TooltipProps>((props, ref) => {\n const arrowRef = useRef<HTMLDivElement | null>(null);\n const {\n children,\n position,\n refProp,\n label,\n openDelay,\n closeDelay,\n onPositionChange,\n opened,\n withinPortal,\n radius,\n color,\n classNames,\n styles,\n unstyled,\n style,\n className,\n withArrow,\n arrowSize,\n arrowOffset,\n arrowRadius,\n arrowPosition,\n offset,\n transition,\n transitionDuration,\n multiline,\n width,\n events,\n zIndex,\n disabled,\n positionDependencies,\n onClick,\n onMouseEnter,\n onMouseLeave,\n inline,\n ...others\n } = useComponentDefaultProps('Tooltip', defaultProps, props);\n\n const { classes, cx, theme } = useStyles(\n { radius, color, width, multiline },\n { name: 'Tooltip', classNames, styles, unstyled }\n );\n\n const tooltip = useTooltip({\n position: getFloatingPosition(theme.dir, position),\n closeDelay,\n openDelay,\n onPositionChange,\n opened,\n events,\n arrowRef,\n arrowOffset,\n offset: offset + (withArrow ? arrowSize / 2 : 0),\n positionDependencies: [...positionDependencies, children],\n inline,\n });\n\n if (!isElement(children)) {\n throw new Error(TOOLTIP_ERRORS.children);\n }\n\n const targetRef = useMergedRef(tooltip.reference, (children as any).ref, ref);\n\n return (\n <>\n <OptionalPortal withinPortal={withinPortal}>\n <Transition\n mounted={!disabled && tooltip.opened}\n transition={transition}\n duration={tooltip.isGroupPhase ? 10 : transitionDuration}\n >\n {(transitionStyles) => (\n <Box\n {...others}\n {...tooltip.getFloatingProps({\n ref: tooltip.floating,\n className: classes.tooltip,\n style: {\n ...style,\n ...transitionStyles,\n zIndex,\n top: tooltip.y ?? 0,\n left: tooltip.x ?? 0,\n },\n })}\n >\n {label}\n\n <FloatingArrow\n ref={arrowRef}\n arrowX={tooltip.arrowX}\n arrowY={tooltip.arrowY}\n visible={withArrow}\n withBorder={false}\n position={tooltip.placement}\n arrowSize={arrowSize}\n arrowOffset={arrowOffset}\n arrowRadius={arrowRadius}\n arrowPosition={arrowPosition}\n className={classes.arrow}\n />\n </Box>\n )}\n </Transition>\n </OptionalPortal>\n\n {cloneElement(\n children,\n tooltip.getReferenceProps({\n onClick,\n onMouseEnter,\n onMouseLeave,\n onMouseMove: props.onMouseMove,\n onPointerDown: props.onPointerDown,\n onPointerEnter: props.onPointerEnter,\n [refProp]: targetRef,\n className: cx(className, children.props.className),\n ...children.props,\n })\n )}\n </>\n );\n}) as any;\n\n_Tooltip.Group = TooltipGroup;\n_Tooltip.Floating = TooltipFloating;\n\n_Tooltip.displayName = '@mantine/core/Tooltip';\n\nexport const Tooltip: ForwardRefWithStaticComponents<\n TooltipProps,\n { Group: typeof TooltipGroup; Floating: typeof TooltipFloating }\n> = _Tooltip;\n","import createReactComponent from '../createReactComponent';\nexport default createReactComponent('outline', 'trash', 'IconTrash', [[\"path\",{\"d\":\"M4 7l16 0\",\"key\":\"svg-0\"}],[\"path\",{\"d\":\"M10 11l0 6\",\"key\":\"svg-1\"}],[\"path\",{\"d\":\"M14 11l0 6\",\"key\":\"svg-2\"}],[\"path\",{\"d\":\"M5 7l1 12a2 2 0 0 0 2 2h8a2 2 0 0 0 2 -2l1 -12\",\"key\":\"svg-3\"}],[\"path\",{\"d\":\"M9 7v-3a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v3\",\"key\":\"svg-4\"}]]);","import createReactComponent from '../createReactComponent';\nexport default createReactComponent('outline', 'plus', 'IconPlus', [[\"path\",{\"d\":\"M12 5l0 14\",\"key\":\"svg-0\"}],[\"path\",{\"d\":\"M5 12l14 0\",\"key\":\"svg-1\"}]]);","import { useEffect, useLayoutEffect } from 'react';\n\nfunction dispatchEvent<T>(type: string, detail?: T) {\n window.dispatchEvent(new CustomEvent(type, { detail }));\n}\n\nconst useIsomorphicEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;\n\nexport function createUseExternalEvents<Handlers extends Record<string, (detail: any) => void>>(\n prefix: string\n) {\n function _useExternalEvents(events: Handlers) {\n const handlers = Object.keys(events).reduce((acc, eventKey) => {\n acc[`${prefix}:${eventKey}`] = (event: CustomEvent) => events[eventKey](event.detail);\n return acc;\n }, {});\n\n useIsomorphicEffect(() => {\n Object.keys(handlers).forEach((eventKey) => {\n window.removeEventListener(eventKey, handlers[eventKey]);\n window.addEventListener(eventKey, handlers[eventKey]);\n });\n\n return () =>\n Object.keys(handlers).forEach((eventKey) => {\n window.removeEventListener(eventKey, handlers[eventKey]);\n });\n }, [handlers]);\n }\n\n function createEvent<EventKey extends keyof Handlers>(event: EventKey) {\n type Parameter = Parameters<Handlers[EventKey]>[0];\n\n return (...payload: Parameter extends undefined ? [undefined?] : [Parameter]) =>\n dispatchEvent(`${prefix}:${String(event)}`, payload[0]);\n }\n\n return [_useExternalEvents, createEvent] as const;\n}\n","import { createUseExternalEvents } from '@mantine/utils';\nimport { ModalSettings, OpenConfirmModal, OpenContextModal } from './context';\n\ntype ModalsEvents = {\n openModal(payload: ModalSettings): void;\n closeModal(id: string): void;\n closeAllModals(): void;\n openConfirmModal(payload: OpenConfirmModal): void;\n openContextModal(payload: OpenContextModal & { modal: string }): void;\n};\n\nexport const [useModalsEvents, createEvent] =\n createUseExternalEvents<ModalsEvents>('mantine-modals');\n\nexport const openModal = createEvent('openModal');\nexport const closeModal = createEvent('closeModal');\nexport const closeAllModals = createEvent('closeAllModals');\nexport const openConfirmModal = createEvent('openConfirmModal');\nexport const openContextModal = createEvent('openContextModal');\n","import { createUseExternalEvents } from '@mantine/utils';\nimport type { NotificationProps } from './types';\n\nexport type NotificationsEvents = {\n show(notification: NotificationProps): void;\n hide(id: string): void;\n update(notification: NotificationProps & { id: string }): void;\n clean(): void;\n cleanQueue(): void;\n};\n\nexport const [useNotificationsEvents, createEvent] =\n createUseExternalEvents<NotificationsEvents>('mantine-notifications');\n\nexport const showNotification = createEvent('show');\nexport const hideNotification = createEvent('hide');\nexport const cleanNotifications = createEvent('clean');\nexport const cleanNotificationsQueue = createEvent('cleanQueue');\nexport const updateNotification = createEvent('update');\n","import createReactComponent from '../createReactComponent';\nexport default createReactComponent('outline', 'check', 'IconCheck', [[\"path\",{\"d\":\"M5 12l5 5l10 -10\",\"key\":\"svg-0\"}]]);","import { showNotification, updateNotification } from \"@mantine/notifications\";\nimport { IconCheck } from \"@tabler/icons-react\";\n\nconst showGenericCheckBoxNotification = (title, message, config) => {\n showNotification({\n ...{\n title: title,\n message: message,\n autoClose: 5000,\n icon: <IconCheck size={16} />,\n color: \"teal\",\n },\n ...config,\n });\n};\n\nconst showGenericDynamicNotification = (id, title, message, config = {}) => {\n showNotification({\n ...{\n id: id,\n loading: true,\n title: title,\n message: message,\n autoClose: false,\n disallowClose: true,\n },\n ...config,\n });\n};\n\nconst dismissGenericDynamicNotification = (id, title, message, config = {}) => {\n updateNotification({\n ...{\n id: id,\n title: title,\n message: message,\n autoClose: 5000,\n icon: <IconCheck size={16} />,\n color: \"teal\",\n },\n ...config,\n });\n};\n\nexport { showGenericCheckBoxNotification, showGenericDynamicNotification, dismissGenericDynamicNotification };\n","/**\n * ClientResponseError is a custom Error class that is intended to wrap\n * and normalize any error thrown by `Client.send()`.\n */\nexport class ClientResponseError extends Error {\n url: string = \"\";\n status: number = 0;\n response: { [key: string]: any } = {};\n isAbort: boolean = false;\n originalError: any = null;\n\n constructor(errData?: any) {\n super(\"ClientResponseError\");\n\n // Set the prototype explicitly.\n // https://github.com/Microsoft/TypeScript-wiki/blob/main/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work\n Object.setPrototypeOf(this, ClientResponseError.prototype);\n\n if (errData !== null && typeof errData === \"object\") {\n this.url = typeof errData.url === \"string\" ? errData.url : \"\";\n this.status = typeof errData.status === \"number\" ? errData.status : 0;\n this.isAbort = !!errData.isAbort;\n this.originalError = errData.originalError;\n\n if (errData.response !== null && typeof errData.response === \"object\") {\n this.response = errData.response;\n } else if (errData.data !== null && typeof errData.data === \"object\") {\n this.response = errData.data;\n } else {\n this.response = {};\n }\n }\n\n if (!this.originalError && !(errData instanceof ClientResponseError)) {\n this.originalError = errData;\n }\n\n if (typeof DOMException !== \"undefined\" && errData instanceof DOMException) {\n this.isAbort = true;\n }\n\n this.name = \"ClientResponseError \" + this.status;\n this.message = this.response?.message;\n if (!this.message) {\n if (this.isAbort) {\n this.message =\n \"The request was autocancelled. You can find more info in https://github.com/pocketbase/js-sdk#auto-cancellation.\";\n } else if (this.originalError?.cause?.message?.includes(\"ECONNREFUSED ::1\")) {\n this.message =\n \"Failed to connect to the PocketBase server. Try changing the SDK URL from localhost to 127.0.0.1 (https://github.com/pocketbase/js-sdk/issues/21).\";\n } else {\n this.message = \"Something went wrong while processing your request.\";\n }\n }\n }\n\n /**\n * Alias for `this.response` to preserve the backward compatibility.\n */\n get data() {\n return this.response;\n }\n\n /**\n * Make a POJO's copy of the current error class instance.\n * @see https://github.com/vuex-orm/vuex-orm/issues/255\n */\n toJSON() {\n return { ...this };\n }\n}\n","/**\n * -------------------------------------------------------------------\n * Simple cookie parse and serialize utilities mostly based on the\n * node module https://github.com/jshttp/cookie.\n * -------------------------------------------------------------------\n */\n\n/**\n * RegExp to match field-content in RFC 7230 sec 3.2\n *\n * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ]\n * field-vchar = VCHAR / obs-text\n * obs-text = %x80-FF\n */\nconst fieldContentRegExp = /^[\\u0009\\u0020-\\u007e\\u0080-\\u00ff]+$/;\n\nexport interface ParseOptions {\n decode?: (val: string) => string;\n}\n\n/**\n * Parses the given cookie header string into an object\n * The object has the various cookies as keys(names) => values\n */\nexport function cookieParse(str: string, options?: ParseOptions): { [key: string]: any } {\n const result: { [key: string]: any } = {};\n\n if (typeof str !== \"string\") {\n return result;\n }\n\n const opt = Object.assign({}, options || {});\n const decode = opt.decode || defaultDecode;\n\n let index = 0;\n while (index < str.length) {\n const eqIdx = str.indexOf(\"=\", index);\n\n // no more cookie pairs\n if (eqIdx === -1) {\n break;\n }\n\n let endIdx = str.indexOf(\";\", index);\n\n if (endIdx === -1) {\n endIdx = str.length;\n } else if (endIdx < eqIdx) {\n // backtrack on prior semicolon\n index = str.lastIndexOf(\";\", eqIdx - 1) + 1;\n continue;\n }\n\n const key = str.slice(index, eqIdx).trim();\n\n // only assign once\n if (undefined === result[key]) {\n let val = str.slice(eqIdx + 1, endIdx).trim();\n\n // quoted values\n if (val.charCodeAt(0) === 0x22) {\n val = val.slice(1, -1);\n }\n\n try {\n result[key] = decode(val);\n } catch (_) {\n result[key] = val; // no decoding\n }\n }\n\n index = endIdx + 1;\n }\n\n return result;\n}\n\nexport interface SerializeOptions {\n encode?: (val: string | number | boolean) => string;\n maxAge?: number;\n domain?: string;\n path?: string;\n expires?: Date;\n httpOnly?: boolean;\n secure?: boolean;\n priority?: string;\n sameSite?: boolean | string;\n}\n\n/**\n * Serialize data into a cookie header.\n *\n * Serialize the a name value pair into a cookie string suitable for\n * http headers. An optional options object specified cookie parameters.\n *\n * ```js\n * cookieSerialize('foo', 'bar', { httpOnly: true }) // \"foo=bar; httpOnly\"\n * ```\n */\nexport function cookieSerialize(\n name: string,\n val: string,\n options?: SerializeOptions,\n): string {\n const opt = Object.assign({}, options || {});\n const encode = opt.encode || defaultEncode;\n\n if (!fieldContentRegExp.test(name)) {\n throw new TypeError(\"argument name is invalid\");\n }\n\n const value = encode(val);\n\n if (value && !fieldContentRegExp.test(value)) {\n throw new TypeError(\"argument val is invalid\");\n }\n\n let result = name + \"=\" + value;\n\n if (opt.maxAge != null) {\n const maxAge = opt.maxAge - 0;\n\n if (isNaN(maxAge) || !isFinite(maxAge)) {\n throw new TypeError(\"option maxAge is invalid\");\n }\n\n result += \"; Max-Age=\" + Math.floor(maxAge);\n }\n\n if (opt.domain) {\n if (!fieldContentRegExp.test(opt.domain)) {\n throw new TypeError(\"option domain is invalid\");\n }\n\n result += \"; Domain=\" + opt.domain;\n }\n\n if (opt.path) {\n if (!fieldContentRegExp.test(opt.path)) {\n throw new TypeError(\"option path is invalid\");\n }\n\n result += \"; Path=\" + opt.path;\n }\n\n if (opt.expires) {\n if (!isDate(opt.expires) || isNaN(opt.expires.valueOf())) {\n throw new TypeError(\"option expires is invalid\");\n }\n\n result += \"; Expires=\" + opt.expires.toUTCString();\n }\n\n if (opt.httpOnly) {\n result += \"; HttpOnly\";\n }\n\n if (opt.secure) {\n result += \"; Secure\";\n }\n\n if (opt.priority) {\n const priority =\n typeof opt.priority === \"string\" ? opt.priority.toLowerCase() : opt.priority;\n\n switch (priority) {\n case \"low\":\n result += \"; Priority=Low\";\n break;\n case \"medium\":\n result += \"; Priority=Medium\";\n break;\n case \"high\":\n result += \"; Priority=High\";\n break;\n default:\n throw new TypeError(\"option priority is invalid\");\n }\n }\n\n if (opt.sameSite) {\n const sameSite =\n typeof opt.sameSite === \"string\" ? opt.sameSite.toLowerCase() : opt.sameSite;\n\n switch (sameSite) {\n case true:\n result += \"; SameSite=Strict\";\n break;\n case \"lax\":\n result += \"; SameSite=Lax\";\n break;\n case \"strict\":\n result += \"; SameSite=Strict\";\n break;\n case \"none\":\n result += \"; SameSite=None\";\n break;\n default:\n throw new TypeError(\"option sameSite is invalid\");\n }\n }\n\n return result;\n}\n\n/**\n * Default URL-decode string value function.\n * Optimized to skip native call when no `%`.\n */\nfunction defaultDecode(val: string): string {\n return val.indexOf(\"%\") !== -1 ? decodeURIComponent(val) : val;\n}\n\n/**\n * Default URL-encode value function.\n */\nfunction defaultEncode(val: string | number | boolean): string {\n return encodeURIComponent(val);\n}\n\n/**\n * Determines if value is a Date.\n */\nfunction isDate(val: any): boolean {\n return Object.prototype.toString.call(val) === \"[object Date]\" || val instanceof Date;\n}\n","// @todo remove after https://github.com/reactwg/react-native-releases/issues/287\nconst isReactNative = (\n (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') ||\n (typeof global !== 'undefined' && (global as any).HermesInternal)\n);\n\nlet atobPolyfill: Function;\nif (typeof atob === \"function\" && !isReactNative) {\n atobPolyfill = atob;\n} else {\n /**\n * The code was extracted from:\n * https://github.com/davidchambers/Base64.js\n */\n atobPolyfill = (input: any) => {\n const chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n\n let str = String(input).replace(/=+$/, \"\");\n if (str.length % 4 == 1) {\n throw new Error(\n \"'atob' failed: The string to be decoded is not correctly encoded.\",\n );\n }\n\n for (\n // initialize result and counters\n var bc = 0, bs, buffer, idx = 0, output = \"\";\n // get next character\n (buffer = str.charAt(idx++));\n // character found in table? initialize bit storage and add its ascii value;\n ~buffer &&\n ((bs = bc % 4 ? (bs as any) * 64 + buffer : buffer),\n // and if not first of each 4 characters,\n // convert the first 8 bits to one ascii character\n bc++ % 4)\n ? (output += String.fromCharCode(255 & (bs >> ((-2 * bc) & 6))))\n : 0\n ) {\n // try to find character in table (0-63, not found => -1)\n buffer = chars.indexOf(buffer);\n }\n\n return output;\n };\n}\n\n/**\n * Returns JWT token's payload data.\n */\nexport function getTokenPayload(token: string): { [key: string]: any } {\n if (token) {\n try {\n const encodedPayload = decodeURIComponent(\n atobPolyfill(token.split(\".\")[1])\n .split(\"\")\n .map(function (c: string) {\n return \"%\" + (\"00\" + c.charCodeAt(0).toString(16)).slice(-2);\n })\n .join(\"\"),\n );\n\n return JSON.parse(encodedPayload) || {};\n } catch (e) {}\n }\n\n return {};\n}\n\n/**\n * Checks whether a JWT token is expired or not.\n * Tokens without `exp` payload key are considered valid.\n * Tokens with empty payload (eg. invalid token strings) are considered expired.\n *\n * @param token The token to check.\n * @param [expirationThreshold] Time in seconds that will be subtracted from the token `exp` property.\n */\nexport function isTokenExpired(token: string, expirationThreshold = 0): boolean {\n let payload = getTokenPayload(token);\n\n if (\n Object.keys(payload).length > 0 &&\n (!payload.exp || payload.exp - expirationThreshold > Date.now() / 1000)\n ) {\n return false;\n }\n\n return true;\n}\n","import { cookieParse, cookieSerialize, SerializeOptions } from \"@/stores/utils/cookie\";\nimport { isTokenExpired, getTokenPayload } from \"@/stores/utils/jwt\";\n\nexport type AuthModel = { [key: string]: any } | null;\n\nexport type OnStoreChangeFunc = (token: string, model: AuthModel) => void;\n\nconst defaultCookieKey = \"pb_auth\";\n\n/**\n * Base AuthStore class that is intended to be extended by all other\n * PocketBase AuthStore implementations.\n */\nexport abstract class BaseAuthStore {\n protected baseToken: string = \"\";\n protected baseModel: AuthModel = null;\n\n private _onChangeCallbacks: Array<OnStoreChangeFunc> = [];\n\n /**\n * Retrieves the stored token (if any).\n */\n get token(): string {\n return this.baseToken;\n }\n\n /**\n * Retrieves the stored model data (if any).\n */\n get model(): AuthModel {\n return this.baseModel;\n }\n\n /**\n * Loosely checks if the store has valid token (aka. existing and unexpired exp claim).\n */\n get isValid(): boolean {\n return !isTokenExpired(this.token);\n }\n\n /**\n * Checks whether the current store state is for admin authentication.\n */\n get isAdmin(): boolean {\n return getTokenPayload(this.token).type === \"admin\";\n }\n\n /**\n * Checks whether the current store state is for auth record authentication.\n */\n get isAuthRecord(): boolean {\n return getTokenPayload(this.token).type === \"authRecord\";\n }\n\n /**\n * Saves the provided new token and model data in the auth store.\n */\n save(token: string, model?: AuthModel): void {\n this.baseToken = token || \"\";\n this.baseModel = model || null;\n\n this.triggerChange();\n }\n\n /**\n * Removes the stored token and model data form the auth store.\n */\n clear(): void {\n this.baseToken = \"\";\n this.baseModel = null;\n this.triggerChange();\n }\n\n /**\n * Parses the provided cookie string and updates the store state\n * with the cookie's token and model data.\n *\n * NB! This function doesn't validate the token or its data.\n * Usually this isn't a concern if you are interacting only with the\n * PocketBase API because it has the proper server-side security checks in place,\n * but if you are using the store `isValid` state for permission controls\n * in a node server (eg. SSR), then it is recommended to call `authRefresh()`\n * after loading the cookie to ensure an up-to-date token and model state.\n * For example:\n *\n * ```js\n * pb.authStore.loadFromCookie(\"cookie string...\");\n *\n * try {\n * // get an up-to-date auth store state by veryfing and refreshing the loaded auth model (if any)\n * pb.authStore.isValid && await pb.collection('users').authRefresh();\n * } catch (_) {\n * // clear the auth store on failed refresh\n * pb.authStore.clear();\n * }\n * ```\n */\n loadFromCookie(cookie: string, key = defaultCookieKey): void {\n const rawData = cookieParse(cookie || \"\")[key] || \"\";\n\n let data: { [key: string]: any } = {};\n try {\n data = JSON.parse(rawData);\n // normalize\n if (typeof data === null || typeof data !== \"object\" || Array.isArray(data)) {\n data = {};\n }\n } catch (_) {}\n\n this.save(data.token || \"\", data.model || null);\n }\n\n /**\n * Exports the current store state as cookie string.\n *\n * By default the following optional attributes are added:\n * - Secure\n * - HttpOnly\n * - SameSite=Strict\n * - Path=/\n * - Expires={the token expiration date}\n *\n * NB! If the generated cookie exceeds 4096 bytes, this method will\n * strip the model data to the bare minimum to try to fit within the\n * recommended size in https://www.rfc-editor.org/rfc/rfc6265#section-6.1.\n */\n exportToCookie(options?: SerializeOptions, key = defaultCookieKey): string {\n const defaultOptions: SerializeOptions = {\n secure: true,\n sameSite: true,\n httpOnly: true,\n path: \"/\",\n };\n\n // extract the token expiration date\n const payload = getTokenPayload(this.token);\n if (payload?.exp) {\n defaultOptions.expires = new Date(payload.exp * 1000);\n } else {\n defaultOptions.expires = new Date(\"1970-01-01\");\n }\n\n // merge with the user defined options\n options = Object.assign({}, defaultOptions, options);\n\n const rawData = {\n token: this.token,\n model: this.model ? JSON.parse(JSON.stringify(this.model)) : null,\n };\n\n let result = cookieSerialize(key, JSON.stringify(rawData), options);\n\n const resultLength =\n typeof Blob !== \"undefined\" ? new Blob([result]).size : result.length;\n\n // strip down the model data to the bare minimum\n if (rawData.model && resultLength > 4096) {\n rawData.model = { id: rawData?.model?.id, email: rawData?.model?.email };\n const extraProps = [\"collectionId\", \"username\", \"verified\"];\n for (const prop in this.model) {\n if (extraProps.includes(prop)) {\n rawData.model[prop] = this.model[prop];\n }\n }\n result = cookieSerialize(key, JSON.stringify(rawData), options);\n }\n\n return result;\n }\n\n /**\n * Register a callback function that will be called on store change.\n *\n * You can set the `fireImmediately` argument to true in order to invoke\n * the provided callback right after registration.\n *\n * Returns a removal function that you could call to \"unsubscribe\" from the changes.\n */\n onChange(callback: OnStoreChangeFunc, fireImmediately = false): () => void {\n this._onChangeCallbacks.push(callback);\n\n if (fireImmediately) {\n callback(this.token, this.model);\n }\n\n return () => {\n for (let i = this._onChangeCallbacks.length - 1; i >= 0; i--) {\n if (this._onChangeCallbacks[i] == callback) {\n delete this._onChangeCallbacks[i]; // removes the function reference\n this._onChangeCallbacks.splice(i, 1); // reindex the array\n return;\n }\n }\n };\n }\n\n protected triggerChange(): void {\n for (const callback of this._onChangeCallbacks) {\n callback && callback(this.token, this.model);\n }\n }\n}\n","import { BaseAuthStore, AuthModel } from \"@/stores/BaseAuthStore\";\n\n/**\n * The default token store for browsers with auto fallback\n * to runtime/memory if local storage is undefined (eg. in node env).\n */\nexport class LocalAuthStore extends BaseAuthStore {\n private storageFallback: { [key: string]: any } = {};\n private storageKey: string;\n\n constructor(storageKey = \"pocketbase_auth\") {\n super();\n\n this.storageKey = storageKey;\n\n this._bindStorageEvent();\n }\n\n /**\n * @inheritdoc\n */\n get token(): string {\n const data = this._storageGet(this.storageKey) || {};\n\n return data.token || \"\";\n }\n\n /**\n * @inheritdoc\n */\n get model(): AuthModel {\n const data = this._storageGet(this.storageKey) || {};\n\n return data.model || null;\n }\n\n /**\n * @inheritdoc\n */\n save(token: string, model?: AuthModel) {\n this._storageSet(this.storageKey, {\n token: token,\n model: model,\n });\n\n super.save(token, model);\n }\n\n /**\n * @inheritdoc\n */\n clear() {\n this._storageRemove(this.storageKey);\n\n super.clear();\n }\n\n // ---------------------------------------------------------------\n // Internal helpers:\n // ---------------------------------------------------------------\n\n /**\n * Retrieves `key` from the browser's local storage\n * (or runtime/memory if local storage is undefined).\n */\n private _storageGet(key: string): any {\n if (typeof window !== \"undefined\" && window?.localStorage) {\n const rawValue = window.localStorage.getItem(key) || \"\";\n try {\n return JSON.parse(rawValue);\n } catch (e) {\n // not a json\n return rawValue;\n }\n }\n\n // fallback\n return this.storageFallback[key];\n }\n\n /**\n * Stores a new data in the browser's local storage\n * (or runtime/memory if local storage is undefined).\n */\n private _storageSet(key: string, value: any) {\n if (typeof window !== \"undefined\" && window?.localStorage) {\n // store in local storage\n let normalizedVal = value;\n if (typeof value !== \"string\") {\n normalizedVal = JSON.stringify(value);\n }\n window.localStorage.setItem(key, normalizedVal);\n } else {\n // store in fallback\n this.storageFallback[key] = value;\n }\n }\n\n /**\n * Removes `key` from the browser's local storage and the runtime/memory.\n */\n private _storageRemove(key: string) {\n // delete from local storage\n if (typeof window !== \"undefined\" && window?.localStorage) {\n window.localStorage?.removeItem(key);\n }\n\n // delete from fallback\n delete this.storageFallback[key];\n }\n\n /**\n * Updates the current store state on localStorage change.\n */\n private _bindStorageEvent() {\n if (\n typeof window === \"undefined\" ||\n !window?.localStorage ||\n !window.addEventListener\n ) {\n return;\n }\n\n window.addEventListener(\"storage\", (e) => {\n if (e.key != this.storageKey) {\n return;\n }\n\n const data = this._storageGet(this.storageKey) || {};\n\n super.save(data.token || \"\", data.model || null);\n });\n }\n}\n","import Client from \"@/Client\";\n\n/**\n * BaseService class that should be inherited from all API services.\n */\nexport abstract class BaseService {\n readonly client: Client;\n\n constructor(client: Client) {\n this.client = client;\n }\n}\n","import { BaseService } from \"@/services/utils/BaseService\";\nimport { CommonOptions } from \"@/services/utils/options\";\n\ninterface appleClientSecret {\n secret: string;\n}\n\nexport class SettingsService extends BaseService {\n /**\n * Fetch all available app settings.\n *\n * @throws {ClientResponseError}\n */\n async getAll(options?: CommonOptions): Promise<{ [key: string]: any }> {\n options = Object.assign(\n {\n method: \"GET\",\n },\n options,\n );\n\n return this.client.send(\"/api/settings\", options);\n }\n\n /**\n * Bulk updates app settings.\n *\n * @throws {ClientResponseError}\n */\n async update(\n bodyParams?: { [key: string]: any } | FormData,\n options?: CommonOptions,\n ): Promise<{ [key: string]: any }> {\n options = Object.assign(\n {\n method: \"PATCH\",\n body: bodyParams,\n },\n options,\n );\n\n return this.client.send(\"/api/settings\", options);\n }\n\n /**\n * Performs a S3 filesystem connection test.\n *\n * The currently supported `filesystem` are \"storage\" and \"backups\".\n *\n * @throws {ClientResponseError}\n */\n async testS3(\n filesystem: string = \"storage\",\n options?: CommonOptions,\n ): Promise<boolean> {\n options = Object.assign(\n {\n method: \"POST\",\n body: {\n filesystem: filesystem,\n },\n },\n options,\n );\n\n return this.client.send(\"/api/settings/test/s3\", options).then(() => true);\n }\n\n /**\n * Sends a test email.\n *\n * The possible `emailTemplate` values are:\n * - verification\n * - password-reset\n * - email-change\n *\n * @throws {ClientResponseError}\n */\n async testEmail(\n toEmail: string,\n emailTemplate: string,\n options?: CommonOptions,\n ): Promise<boolean> {\n options = Object.assign(\n {\n method: \"POST\",\n body: {\n email: toEmail,\n template: emailTemplate,\n },\n },\n options,\n );\n\n return this.client.send(\"/api/settings/test/email\", options).then(() => true);\n }\n\n /**\n * Generates a new Apple OAuth2 client secret.\n *\n * @throws {ClientResponseError}\n */\n async generateAppleClientSecret(\n clientId: string,\n teamId: string,\n keyId: string,\n privateKey: string,\n duration: number,\n options?: CommonOptions,\n ): Promise<appleClientSecret> {\n options = Object.assign(\n {\n method: \"POST\",\n body: {\n clientId,\n teamId,\n keyId,\n privateKey,\n duration,\n },\n },\n options,\n );\n\n return this.client.send(\"/api/settings/apple/generate-client-secret\", options);\n }\n}\n","import { BaseService } from \"@/services/utils/BaseService\";\nimport { ClientResponseError } from \"@/ClientResponseError\";\nimport { ListResult } from \"@/services/utils/dtos\";\nimport { CommonOptions, ListOptions, FullListOptions } from \"@/services/utils/options\";\n\nexport abstract class CrudService<M> extends BaseService {\n /**\n * Base path for the crud actions (without trailing slash, eg. '/admins').\n */\n abstract get baseCrudPath(): string;\n\n /**\n * Response data decoder.\n */\n decode<T = M>(data: { [key: string]: any }): T {\n return data as T;\n }\n\n /**\n * Returns a promise with all list items batch fetched at once\n * (by default 500 items per request; to change it set the `batch` query param).\n *\n * You can use the generic T to supply a wrapper type of the crud model.\n *\n * @throws {ClientResponseError}\n */\n async getFullList<T = M>(options?: FullListOptions): Promise<Array<T>>;\n\n /**\n * Legacy version of getFullList with explicitly specified batch size.\n */\n async getFullList<T = M>(batch?: number, options?: ListOptions): Promise<Array<T>>;\n\n async getFullList<T = M>(\n batchOrqueryParams?: number | FullListOptions,\n options?: ListOptions,\n ): Promise<Array<T>> {\n if (typeof batchOrqueryParams == \"number\") {\n return this._getFullList<T>(batchOrqueryParams, options);\n }\n\n options = Object.assign({}, batchOrqueryParams, options);\n\n let batch = 500;\n if (options.batch) {\n batch = options.batch;\n delete options.batch;\n }\n\n return this._getFullList<T>(batch, options);\n }\n\n /**\n * Returns paginated items list.\n *\n * You can use the generic T to supply a wrapper type of the crud model.\n *\n * @throws {ClientResponseError}\n */\n async getList<T = M>(\n page = 1,\n perPage = 30,\n options?: ListOptions,\n ): Promise<ListResult<T>> {\n options = Object.assign(\n {\n method: \"GET\",\n },\n options,\n );\n\n options.query = Object.assign(\n {\n page: page,\n perPage: perPage,\n },\n options.query,\n );\n\n return this.client.send(this.baseCrudPath, options).then((responseData: any) => {\n responseData.items =\n responseData.items?.map((item: any) => {\n return this.decode<T>(item);\n }) || [];\n\n return responseData;\n });\n }\n\n /**\n * Returns the first found item by the specified filter.\n *\n * Internally it calls `getList(1, 1, { filter, skipTotal })` and\n * returns the first found item.\n *\n * You can use the generic T to supply a wrapper type of the crud model.\n *\n * For consistency with `getOne`, this method will throw a 404\n * ClientResponseError if no item was found.\n *\n * @throws {ClientResponseError}\n */\n async getFirstListItem<T = M>(filter: string, options?: CommonOptions): Promise<T> {\n options = Object.assign(\n {\n requestKey: \"one_by_filter_\" + this.baseCrudPath + \"_\" + filter,\n },\n options,\n );\n\n options.query = Object.assign(\n {\n filter: filter,\n skipTotal: 1,\n },\n options.query,\n );\n\n return this.getList<T>(1, 1, options).then((result) => {\n if (!result?.items?.length) {\n throw new ClientResponseError({\n status: 404,\n response: {\n code: 404,\n message: \"The requested resource wasn't found.\",\n data: {},\n },\n });\n }\n\n return result.items[0];\n });\n }\n\n /**\n * Returns single item by its id.\n *\n * You can use the generic T to supply a wrapper type of the crud model.\n *\n * If `id` is empty it will throw a 404 error.\n *\n * @throws {ClientResponseError}\n */\n async getOne<T = M>(id: string, options?: CommonOptions): Promise<T> {\n if (!id) {\n throw new ClientResponseError({\n url: this.client.buildUrl(this.baseCrudPath + \"/\"),\n status: 404,\n response: {\n code: 404,\n message: \"Missing required record id.\",\n data: {},\n },\n });\n }\n\n options = Object.assign(\n {\n method: \"GET\",\n },\n options,\n );\n\n return this.client\n .send(this.baseCrudPath + \"/\" + encodeURIComponent(id), options)\n .then((responseData: any) => this.decode<T>(responseData));\n }\n\n /**\n * Creates a new item.\n *\n * You can use the generic T to supply a wrapper type of the crud model.\n *\n * @throws {ClientResponseError}\n */\n async create<T = M>(\n bodyParams?: { [key: string]: any } | FormData,\n options?: CommonOptions,\n ): Promise<T> {\n options = Object.assign(\n {\n method: \"POST\",\n body: bodyParams,\n },\n options,\n );\n\n return this.client\n .send(this.baseCrudPath, options)\n .then((responseData: any) => this.decode<T>(responseData));\n }\n\n /**\n * Updates an existing item by its id.\n *\n * You can use the generic T to supply a wrapper type of the crud model.\n *\n * @throws {ClientResponseError}\n */\n async update<T = M>(\n id: string,\n bodyParams?: { [key: string]: any } | FormData,\n options?: CommonOptions,\n ): Promise<T> {\n options = Object.assign(\n {\n method: \"PATCH\",\n body: bodyParams,\n },\n options,\n );\n\n return this.client\n .send(this.baseCrudPath + \"/\" + encodeURIComponent(id), options)\n .then((responseData: any) => this.decode<T>(responseData));\n }\n\n /**\n * Deletes an existing item by its id.\n *\n * @throws {ClientResponseError}\n */\n async delete(id: string, options?: CommonOptions): Promise<boolean> {\n options = Object.assign(\n {\n method: \"DELETE\",\n },\n options,\n );\n\n return this.client\n .send(this.baseCrudPath + \"/\" + encodeURIComponent(id), options)\n .then(() => true);\n }\n\n /**\n * Returns a promise with all list items batch fetched at once.\n */\n protected _getFullList<T = M>(\n batchSize = 500,\n options?: ListOptions,\n ): Promise<Array<T>> {\n options = options || {};\n options.query = Object.assign(\n {\n skipTotal: 1,\n },\n options.query,\n );\n\n let result: Array<T> = [];\n\n let request = async (page: number): Promise<Array<any>> => {\n return this.getList(page, batchSize || 500, options).then((list) => {\n const castedList = list as any as ListResult<T>;\n const items = castedList.items;\n\n result = result.concat(items);\n\n if (items.length == list.perPage) {\n return request(page + 1);\n }\n\n return result;\n });\n };\n\n return request(1);\n }\n}\n","import { SendOptions } from \"@/services/utils/options\";\n\nexport function normalizeLegacyOptionsArgs(\n legacyWarn: string,\n baseOptions: SendOptions,\n bodyOrOptions?: any,\n query?: any,\n): SendOptions {\n const hasBodyOrOptions = typeof bodyOrOptions !== \"undefined\";\n const hasQuery = typeof query !== \"undefined\";\n\n if (!hasQuery && !hasBodyOrOptions) {\n return baseOptions;\n }\n\n if (hasQuery) {\n console.warn(legacyWarn);\n baseOptions.body = Object.assign({}, baseOptions.body, bodyOrOptions);\n baseOptions.query = Object.assign({}, baseOptions.query, query);\n\n return baseOptions;\n }\n\n return Object.assign(baseOptions, bodyOrOptions);\n}\n","import Client from \"@/Client\";\nimport { isTokenExpired } from \"@/stores/utils/jwt\";\n\n// reset previous auto refresh registrations\nexport function resetAutoRefresh(client: Client) {\n (client as any)._resetAutoRefresh?.();\n}\n\nexport function registerAutoRefresh(\n client: Client,\n threshold: number,\n refreshFunc: () => Promise<any>,\n reauthenticateFunc: () => Promise<any>,\n) {\n resetAutoRefresh(client);\n\n const oldBeforeSend = client.beforeSend;\n const oldModel = client.authStore.model;\n\n // unset the auto refresh in case the auth store was cleared\n // OR a new model was authenticated\n const unsubStoreChange = client.authStore.onChange((newToken, model) => {\n if (\n !newToken ||\n model?.id != oldModel?.id ||\n // check the collection id in case an admin and auth record share the same id\n ((model?.collectionId || oldModel?.collectionId) &&\n model?.collectionId != oldModel?.collectionId)\n ) {\n resetAutoRefresh(client);\n }\n });\n\n // initialize a reset function and attach it dynamically to the client\n (client as any)._resetAutoRefresh = function () {\n unsubStoreChange();\n client.beforeSend = oldBeforeSend;\n delete (client as any)._resetAutoRefresh;\n };\n\n client.beforeSend = async (url, sendOptions) => {\n const oldToken = client.authStore.token;\n\n if (sendOptions.query?.autoRefresh) {\n return oldBeforeSend ? oldBeforeSend(url, sendOptions) : { url, sendOptions };\n }\n\n let isValid = client.authStore.isValid;\n if (\n // is loosely valid\n isValid &&\n // but it is going to expire in the next \"threshold\" seconds\n isTokenExpired(client.authStore.token, threshold)\n ) {\n try {\n await refreshFunc();\n } catch (_) {\n isValid = false;\n }\n }\n\n // still invalid -> reauthenticate\n if (!isValid) {\n await reauthenticateFunc();\n }\n\n // the request wasn't sent with a custom token\n const headers = sendOptions.headers || {};\n for (let key in headers) {\n if (\n key.toLowerCase() == \"authorization\" &&\n // the request wasn't sent with a custom token\n oldToken == headers[key] &&\n client.authStore.token\n ) {\n // set the latest store token\n headers[key] = client.authStore.token;\n break;\n }\n }\n sendOptions.headers = headers;\n\n return oldBeforeSend ? oldBeforeSend(url, sendOptions) : { url, sendOptions };\n };\n}\n","import { CrudService } from \"@/services/utils/CrudService\";\nimport { AdminModel } from \"@/services/utils/dtos\";\nimport { AuthOptions, CommonOptions } from \"@/services/utils/options\";\nimport { normalizeLegacyOptionsArgs } from \"@/services/utils/legacy\";\nimport { registerAutoRefresh, resetAutoRefresh } from \"@/services/utils/refresh\";\n\nexport interface AdminAuthResponse {\n [key: string]: any;\n\n token: string;\n admin: AdminModel;\n}\n\nexport class AdminService extends CrudService<AdminModel> {\n /**\n * @inheritdoc\n */\n get baseCrudPath(): string {\n return \"/api/admins\";\n }\n\n // ---------------------------------------------------------------\n // Post update/delete AuthStore sync\n // ---------------------------------------------------------------\n\n /**\n * @inheritdoc\n *\n * If the current `client.authStore.model` matches with the updated id, then\n * on success the `client.authStore.model` will be updated with the result.\n */\n async update<T = AdminModel>(\n id: string,\n bodyParams?: { [key: string]: any } | FormData,\n options?: CommonOptions,\n ): Promise<T> {\n return super.update(id, bodyParams, options).then((item) => {\n // update the store state if the updated item id matches with the stored model\n if (\n this.client.authStore.model?.id === item.id &&\n typeof this.client.authStore.model?.collectionId === \"undefined\" // is not record auth\n ) {\n this.client.authStore.save(this.client.authStore.token, item);\n }\n\n return item as any as T;\n });\n }\n\n /**\n * @inheritdoc\n *\n * If the current `client.authStore.model` matches with the deleted id,\n * then on success the `client.authStore` will be cleared.\n */\n async delete(id: string, options?: CommonOptions): Promise<boolean> {\n return super.delete(id, options).then((success) => {\n // clear the store state if the deleted item id matches with the stored model\n if (\n success &&\n this.client.authStore.model?.id === id &&\n typeof this.client.authStore.model?.collectionId === \"undefined\" // is not record auth\n ) {\n this.client.authStore.clear();\n }\n\n return success;\n });\n }\n\n // ---------------------------------------------------------------\n // Auth handlers\n // ---------------------------------------------------------------\n\n /**\n * Prepare successful authorize response.\n */\n protected authResponse(responseData: any): AdminAuthResponse {\n const admin = this.decode(responseData?.admin || {});\n\n if (responseData?.token && responseData?.admin) {\n this.client.authStore.save(responseData.token, admin);\n }\n\n return Object.assign({}, responseData, {\n // normalize common fields\n token: responseData?.token || \"\",\n admin: admin,\n });\n }\n\n /**\n * Authenticate an admin account with its email and password\n * and returns a new admin token and data.\n *\n * On success this method automatically updates the client's AuthStore data.\n *\n * @throws {ClientResponseError}\n */\n async authWithPassword(\n email: string,\n password: string,\n options?: AuthOptions,\n ): Promise<AdminAuthResponse>;\n\n /**\n * @deprecated\n * Consider using authWithPassword(email, password, options?).\n */\n async authWithPassword(\n email: string,\n password: string,\n body?: any,\n query?: any,\n ): Promise<AdminAuthResponse>;\n\n async authWithPassword(\n email: string,\n password: string,\n bodyOrOptions?: any,\n query?: any,\n ): Promise<AdminAuthResponse> {\n let options: any = {\n method: \"POST\",\n body: {\n identity: email,\n password: password,\n },\n };\n\n options = normalizeLegacyOptionsArgs(\n \"This form of authWithPassword(email, pass, body?, query?) is deprecated. Consider replacing it with authWithPassword(email, pass, options?).\",\n options,\n bodyOrOptions,\n query,\n );\n\n const autoRefreshThreshold = options.autoRefreshThreshold;\n delete options.autoRefreshThreshold;\n\n // not from auto refresh reauthentication\n if (!options.autoRefresh) {\n resetAutoRefresh(this.client);\n }\n\n let authData = await this.client.send(\n this.baseCrudPath + \"/auth-with-password\",\n options,\n );\n\n authData = this.authResponse(authData);\n\n if (autoRefreshThreshold) {\n registerAutoRefresh(\n this.client,\n autoRefreshThreshold,\n () => this.authRefresh({ autoRefresh: true }),\n () =>\n this.authWithPassword(\n email,\n password,\n Object.assign({ autoRefresh: true }, options),\n ),\n );\n }\n\n return authData;\n }\n\n /**\n * Refreshes the current admin authenticated instance and\n * returns a new token and admin data.\n *\n * On success this method automatically updates the client's AuthStore data.\n *\n * @throws {ClientResponseError}\n */\n async authRefresh(options?: CommonOptions): Promise<AdminAuthResponse>;\n\n /**\n * @deprecated\n * Consider using authRefresh(options?).\n */\n async authRefresh(body?: any, query?: any): Promise<AdminAuthResponse>;\n\n async authRefresh(bodyOrOptions?: any, query?: any): Promise<AdminAuthResponse> {\n let options: any = {\n method: \"POST\",\n };\n\n options = normalizeLegacyOptionsArgs(\n \"This form of authRefresh(body?, query?) is deprecated. Consider replacing it with authRefresh(options?).\",\n options,\n bodyOrOptions,\n query,\n );\n\n return this.client\n .send(this.baseCrudPath + \"/auth-refresh\", options)\n .then(this.authResponse.bind(this));\n }\n\n /**\n * Sends admin password reset request.\n *\n * @throws {ClientResponseError}\n */\n async requestPasswordReset(email: string, options?: CommonOptions): Promise<boolean>;\n\n /**\n * @deprecated\n * Consider using requestPasswordReset(email, options?).\n */\n async requestPasswordReset(email: string, body?: any, query?: any): Promise<boolean>;\n\n async requestPasswordReset(\n email: string,\n bodyOrOptions?: any,\n query?: any,\n ): Promise<boolean> {\n let options: any = {\n method: \"POST\",\n body: {\n email: email,\n },\n };\n\n options = normalizeLegacyOptionsArgs(\n \"This form of requestPasswordReset(email, body?, query?) is deprecated. Consider replacing it with requestPasswordReset(email, options?).\",\n options,\n bodyOrOptions,\n query,\n );\n\n return this.client\n .send(this.baseCrudPath + \"/request-password-reset\", options)\n .then(() => true);\n }\n\n /**\n * Confirms admin password reset request.\n *\n * @throws {ClientResponseError}\n */\n async confirmPasswordReset(\n resetToken: string,\n password: string,\n passwordConfirm: string,\n options?: CommonOptions,\n ): Promise<boolean>;\n\n /**\n * @deprecated\n * Consider using confirmPasswordReset(resetToken, password, passwordConfirm, options?).\n */\n async confirmPasswordReset(\n resetToken: string,\n password: string,\n passwordConfirm: string,\n body?: any,\n query?: any,\n ): Promise<boolean>;\n\n async confirmPasswordReset(\n resetToken: string,\n password: string,\n passwordConfirm: string,\n bodyOrOptions?: any,\n query?: any,\n ): Promise<boolean> {\n let options: any = {\n method: \"POST\",\n body: {\n token: resetToken,\n password: password,\n passwordConfirm: passwordConfirm,\n },\n };\n\n options = normalizeLegacyOptionsArgs(\n \"This form of confirmPasswordReset(resetToken, password, passwordConfirm, body?, query?) is deprecated. Consider replacing it with confirmPasswordReset(resetToken, password, passwordConfirm, options?).\",\n options,\n bodyOrOptions,\n query,\n );\n\n return this.client\n .send(this.baseCrudPath + \"/confirm-password-reset\", options)\n .then(() => true);\n }\n}\n","export interface SendOptions extends RequestInit {\n // for backward compatibility and to minimize the verbosity,\n // any top-level field that doesn't exist in RequestInit or the\n // fields below will be treated as query parameter.\n [key: string]: any;\n\n /**\n * Optional custom fetch function to use for sending the request.\n */\n fetch?: (url: RequestInfo | URL, config?: RequestInit) => Promise<Response>;\n\n /**\n * Custom headers to send with the requests.\n */\n headers?: { [key: string]: string };\n\n /**\n * The body of the request (serialized automatically for json requests).\n */\n body?: any;\n\n /**\n * Query parameters that will be appended to the request url.\n */\n query?: { [key: string]: any };\n\n /**\n * @deprecated use `query` instead\n *\n * for backward-compatibility `params` values are merged with `query`,\n * but this option may get removed in the final v1 release\n */\n params?: { [key: string]: any };\n\n /**\n * The request identifier that can be used to cancel pending requests.\n */\n requestKey?: string | null;\n\n /**\n * @deprecated use `requestKey:string` instead\n */\n $cancelKey?: string;\n\n /**\n * @deprecated use `requestKey:null` instead\n */\n $autoCancel?: boolean;\n}\n\nexport interface CommonOptions extends SendOptions {\n fields?: string;\n}\n\nexport interface ListOptions extends CommonOptions {\n page?: number;\n perPage?: number;\n sort?: string;\n filter?: string;\n skipTotal?: boolean;\n}\n\nexport interface FullListOptions extends ListOptions {\n batch?: number;\n}\n\nexport interface RecordOptions extends CommonOptions {\n expand?: string;\n}\n\nexport interface RecordListOptions extends ListOptions, RecordOptions {}\n\nexport interface RecordFullListOptions extends FullListOptions, RecordOptions {}\n\nexport interface LogStatsOptions extends CommonOptions {\n filter?: string;\n}\n\nexport interface FileOptions extends CommonOptions {\n thumb?: string;\n download?: boolean;\n}\n\nexport interface AuthOptions extends CommonOptions {\n /**\n * If autoRefreshThreshold is set it will take care to auto refresh\n * when necessary the auth data before each request to ensure that\n * the auth state is always valid.\n *\n * The value must be in seconds, aka. the amount of seconds\n * that will be subtracted from the current token `exp` claim in order\n * to determine whether it is going to expire within the specified time threshold.\n *\n * For example, if you want to auto refresh the token if it is\n * going to expire in the next 30mins (or already has expired),\n * it can be set to `1800`\n */\n autoRefreshThreshold?: number;\n}\n\n// -------------------------------------------------------------------\n\n// list of known SendOptions keys (everything else is treated as query param)\nconst knownSendOptionsKeys = [\n \"requestKey\",\n \"$cancelKey\",\n \"$autoCancel\",\n \"fetch\",\n \"headers\",\n \"body\",\n \"query\",\n \"params\",\n // ---,\n \"cache\",\n \"credentials\",\n \"headers\",\n \"integrity\",\n \"keepalive\",\n \"method\",\n \"mode\",\n \"redirect\",\n \"referrer\",\n \"referrerPolicy\",\n \"signal\",\n \"window\",\n];\n\n// modifies in place the provided options by moving unknown send options as query parameters.\nexport function normalizeUnknownQueryParams(options?: SendOptions): void {\n if (!options) {\n return;\n }\n\n options.query = options.query || {};\n for (let key in options) {\n if (knownSendOptionsKeys.includes(key)) {\n continue;\n }\n\n options.query[key] = options[key];\n delete options[key];\n }\n}\n","import { ClientResponseError } from \"@/ClientResponseError\";\nimport { BaseService } from \"@/services/utils/BaseService\";\nimport { SendOptions, normalizeUnknownQueryParams } from \"@/services/utils/options\";\n\ninterface promiseCallbacks {\n resolve: Function;\n reject: Function;\n}\n\ntype Subscriptions = { [key: string]: Array<EventListener> };\n\nexport type UnsubscribeFunc = () => Promise<void>;\n\nexport class RealtimeService extends BaseService {\n clientId: string = \"\";\n\n private eventSource: EventSource | null = null;\n private subscriptions: Subscriptions = {};\n private lastSentSubscriptions: Array<string> = [];\n private connectTimeoutId: any;\n private maxConnectTimeout: number = 15000;\n private reconnectTimeoutId: any;\n private reconnectAttempts: number = 0;\n private maxReconnectAttempts: number = Infinity;\n private predefinedReconnectIntervals: Array<number> = [\n 200, 300, 500, 1000, 1200, 1500, 2000,\n ];\n private pendingConnects: Array<promiseCallbacks> = [];\n\n /**\n * Returns whether the realtime connection has been established.\n */\n get isConnected(): boolean {\n return !!this.eventSource && !!this.clientId && !this.pendingConnects.length;\n }\n\n /**\n * Register the subscription listener.\n *\n * You can subscribe multiple times to the same topic.\n *\n * If the SSE connection is not started yet,\n * this method will also initialize it.\n */\n async subscribe(\n topic: string,\n callback: (data: any) => void,\n options?: SendOptions,\n ): Promise<UnsubscribeFunc> {\n if (!topic) {\n throw new Error(\"topic must be set.\");\n }\n\n let key = topic;\n\n // serialize and append the topic options (if any)\n if (options) {\n options = Object.assign({}, options); // shallow copy\n normalizeUnknownQueryParams(options)\n const serialized =\n \"options=\" +\n encodeURIComponent(\n JSON.stringify({ query: options.query, headers: options.headers }),\n );\n key += (key.includes(\"?\") ? \"&\" : \"?\") + serialized;\n }\n\n const listener = function (e: Event) {\n const msgEvent = e as MessageEvent;\n\n let data;\n try {\n data = JSON.parse(msgEvent?.data);\n } catch {}\n\n callback(data || {});\n };\n\n // store the listener\n if (!this.subscriptions[key]) {\n this.subscriptions[key] = [];\n }\n this.subscriptions[key].push(listener);\n\n if (!this.isConnected) {\n // initialize sse connection\n await this.connect();\n } else if (this.subscriptions[key].length === 1) {\n // send the updated subscriptions (if it is the first for the key)\n await this.submitSubscriptions();\n } else {\n // only register the listener\n this.eventSource?.addEventListener(key, listener);\n }\n\n return async (): Promise<void> => {\n return this.unsubscribeByTopicAndListener(topic, listener);\n };\n }\n\n /**\n * Unsubscribe from all subscription listeners with the specified topic.\n *\n * If `topic` is not provided, then this method will unsubscribe\n * from all active subscriptions.\n *\n * This method is no-op if there are no active subscriptions.\n *\n * The related sse connection will be autoclosed if after the\n * unsubscribe operation there are no active subscriptions left.\n */\n async unsubscribe(topic?: string): Promise<void> {\n let needToSubmit = false;\n\n if (!topic) {\n // remove all subscriptions\n this.subscriptions = {};\n } else {\n // remove all listeners related to the topic\n const subs = this.getSubscriptionsByTopic(topic);\n for (let key in subs) {\n if (!this.hasSubscriptionListeners(key)) {\n continue; // already unsubscribed\n }\n\n for (let listener of this.subscriptions[key]) {\n this.eventSource?.removeEventListener(key, listener);\n }\n delete this.subscriptions[key];\n\n // mark for subscriptions change submit if there are no other listeners\n if (!needToSubmit) {\n needToSubmit = true;\n }\n }\n }\n\n if (!this.hasSubscriptionListeners()) {\n // no other active subscriptions -> close the sse connection\n this.disconnect();\n } else if (needToSubmit) {\n await this.submitSubscriptions();\n }\n }\n\n /**\n * Unsubscribe from all subscription listeners starting with the specified topic prefix.\n *\n * This method is no-op if there are no active subscriptions with the specified topic prefix.\n *\n * The related sse connection will be autoclosed if after the\n * unsubscribe operation there are no active subscriptions left.\n */\n async unsubscribeByPrefix(keyPrefix: string): Promise<void> {\n let hasAtleastOneTopic = false;\n for (let key in this.subscriptions) {\n // \"?\" so that it can be used as end delimiter for the prefix\n if (!(key + \"?\").startsWith(keyPrefix)) {\n continue;\n }\n\n hasAtleastOneTopic = true;\n for (let listener of this.subscriptions[key]) {\n this.eventSource?.removeEventListener(key, listener);\n }\n delete this.subscriptions[key];\n }\n\n if (!hasAtleastOneTopic) {\n return; // nothing to unsubscribe from\n }\n\n if (this.hasSubscriptionListeners()) {\n // submit the deleted subscriptions\n await this.submitSubscriptions();\n } else {\n // no other active subscriptions -> close the sse connection\n this.disconnect();\n }\n }\n\n /**\n * Unsubscribe from all subscriptions matching the specified topic and listener function.\n *\n * This method is no-op if there are no active subscription with\n * the specified topic and listener.\n *\n * The related sse connection will be autoclosed if after the\n * unsubscribe operation there are no active subscriptions left.\n */\n async unsubscribeByTopicAndListener(\n topic: string,\n listener: EventListener,\n ): Promise<void> {\n let needToSubmit = false;\n\n const subs = this.getSubscriptionsByTopic(topic);\n for (let key in subs) {\n if (\n !Array.isArray(this.subscriptions[key]) ||\n !this.subscriptions[key].length\n ) {\n continue; // already unsubscribed\n }\n\n let exist = false;\n for (let i = this.subscriptions[key].length - 1; i >= 0; i--) {\n if (this.subscriptions[key][i] !== listener) {\n continue;\n }\n\n exist = true; // has at least one matching listener\n delete this.subscriptions[key][i]; // removes the function reference\n this.subscriptions[key].splice(i, 1); // reindex the array\n this.eventSource?.removeEventListener(key, listener);\n }\n if (!exist) {\n continue;\n }\n\n // remove the key from the subscriptions list if there are no other listeners\n if (!this.subscriptions[key].length) {\n delete this.subscriptions[key];\n }\n\n // mark for subscriptions change submit if there are no other listeners\n if (!needToSubmit && !this.hasSubscriptionListeners(key)) {\n needToSubmit = true;\n }\n }\n\n if (!this.hasSubscriptionListeners()) {\n // no other active subscriptions -> close the sse connection\n this.disconnect();\n } else if (needToSubmit) {\n await this.submitSubscriptions();\n }\n }\n\n private hasSubscriptionListeners(keyToCheck?: string): boolean {\n this.subscriptions = this.subscriptions || {};\n\n // check the specified key\n if (keyToCheck) {\n return !!this.subscriptions[keyToCheck]?.length;\n }\n\n // check for at least one non-empty subscription\n for (let key in this.subscriptions) {\n if (!!this.subscriptions[key]?.length) {\n return true;\n }\n }\n\n return false;\n }\n\n private async submitSubscriptions(): Promise<void> {\n if (!this.clientId) {\n return; // no client/subscriber\n }\n\n // optimistic update\n this.addAllSubscriptionListeners();\n\n this.lastSentSubscriptions = this.getNonEmptySubscriptionKeys();\n\n return this.client\n .send(\"/api/realtime\", {\n method: \"POST\",\n body: {\n clientId: this.clientId,\n subscriptions: this.lastSentSubscriptions,\n },\n requestKey: this.getSubscriptionsCancelKey(),\n })\n .catch((err) => {\n if (err?.isAbort) {\n return; // silently ignore aborted pending requests\n }\n throw err;\n });\n }\n\n private getSubscriptionsCancelKey(): string {\n return \"realtime_\" + this.clientId;\n }\n\n private getSubscriptionsByTopic(topic: string): Subscriptions {\n const result: Subscriptions = {};\n\n // \"?\" so that it can be used as end delimiter for the topic\n topic = topic.includes(\"?\") ? topic : topic + \"?\";\n\n for (let key in this.subscriptions) {\n if ((key + \"?\").startsWith(topic)) {\n result[key] = this.subscriptions[key];\n }\n }\n\n return result;\n }\n\n private getNonEmptySubscriptionKeys(): Array<string> {\n const result: Array<string> = [];\n\n for (let key in this.subscriptions) {\n if (this.subscriptions[key].length) {\n result.push(key);\n }\n }\n\n return result;\n }\n\n private addAllSubscriptionListeners(): void {\n if (!this.eventSource) {\n return;\n }\n\n this.removeAllSubscriptionListeners();\n\n for (let key in this.subscriptions) {\n for (let listener of this.subscriptions[key]) {\n this.eventSource.addEventListener(key, listener);\n }\n }\n }\n\n private removeAllSubscriptionListeners(): void {\n if (!this.eventSource) {\n return;\n }\n\n for (let key in this.subscriptions) {\n for (let listener of this.subscriptions[key]) {\n this.eventSource.removeEventListener(key, listener);\n }\n }\n }\n\n private async connect(): Promise<void> {\n if (this.reconnectAttempts > 0) {\n // immediately resolve the promise to avoid indefinitely\n // blocking the client during reconnection\n return;\n }\n\n return new Promise((resolve, reject) => {\n this.pendingConnects.push({ resolve, reject });\n\n if (this.pendingConnects.length > 1) {\n // all promises will be resolved once the connection is established\n return;\n }\n\n this.initConnect();\n });\n }\n\n private initConnect() {\n this.disconnect(true);\n\n // wait up to 15s for connect\n clearTimeout(this.connectTimeoutId);\n this.connectTimeoutId = setTimeout(() => {\n this.connectErrorHandler(new Error(\"EventSource connect took too long.\"));\n }, this.maxConnectTimeout);\n\n this.eventSource = new EventSource(this.client.buildUrl(\"/api/realtime\"));\n\n this.eventSource.onerror = (_) => {\n this.connectErrorHandler(\n new Error(\"Failed to establish realtime connection.\"),\n );\n };\n\n this.eventSource.addEventListener(\"PB_CONNECT\", (e) => {\n const msgEvent = e as MessageEvent;\n this.clientId = msgEvent?.lastEventId;\n\n this.submitSubscriptions()\n .then(async () => {\n let retries = 3;\n while (this.hasUnsentSubscriptions() && retries > 0) {\n retries--;\n // resubscribe to ensure that the latest topics are submitted\n //\n // This is needed because missed topics could happen on reconnect\n // if after the pending sent `submitSubscriptions()` call another `subscribe()`\n // was made before the submit was able to complete.\n await this.submitSubscriptions();\n }\n })\n .then(() => {\n for (let p of this.pendingConnects) {\n p.resolve();\n }\n\n // reset connect meta\n this.pendingConnects = [];\n this.reconnectAttempts = 0;\n clearTimeout(this.reconnectTimeoutId);\n clearTimeout(this.connectTimeoutId);\n\n // propagate the PB_CONNECT event\n const connectSubs = this.getSubscriptionsByTopic(\"PB_CONNECT\");\n for (let key in connectSubs) {\n for (let listener of connectSubs[key]) {\n listener(e);\n }\n }\n })\n .catch((err) => {\n this.clientId = \"\";\n this.connectErrorHandler(err);\n });\n });\n }\n\n private hasUnsentSubscriptions(): boolean {\n const latestTopics = this.getNonEmptySubscriptionKeys();\n if (latestTopics.length != this.lastSentSubscriptions.length) {\n return true;\n }\n\n for (const t of latestTopics) {\n if (!this.lastSentSubscriptions.includes(t)) {\n return true;\n }\n }\n\n return false;\n }\n\n private connectErrorHandler(err: any) {\n clearTimeout(this.connectTimeoutId);\n clearTimeout(this.reconnectTimeoutId);\n\n if (\n // wasn't previously connected -> direct reject\n (!this.clientId && !this.reconnectAttempts) ||\n // was previously connected but the max reconnection limit has been reached\n this.reconnectAttempts > this.maxReconnectAttempts\n ) {\n for (let p of this.pendingConnects) {\n p.reject(new ClientResponseError(err));\n }\n this.pendingConnects = [];\n this.disconnect();\n return;\n }\n\n // otherwise -> reconnect in the background\n this.disconnect(true);\n const timeout =\n this.predefinedReconnectIntervals[this.reconnectAttempts] ||\n this.predefinedReconnectIntervals[\n this.predefinedReconnectIntervals.length - 1\n ];\n this.reconnectAttempts++;\n this.reconnectTimeoutId = setTimeout(() => {\n this.initConnect();\n }, timeout);\n }\n\n private disconnect(fromReconnect = false): void {\n clearTimeout(this.connectTimeoutId);\n clearTimeout(this.reconnectTimeoutId);\n this.removeAllSubscriptionListeners();\n this.client.cancelRequest(this.getSubscriptionsCancelKey());\n this.eventSource?.close();\n this.eventSource = null;\n this.clientId = \"\";\n\n if (!fromReconnect) {\n this.reconnectAttempts = 0;\n\n // resolve any remaining connect promises\n //\n // this is done to avoid unnecessary throwing errors in case\n // unsubscribe is called before the pending connect promises complete\n // (see https://github.com/pocketbase/pocketbase/discussions/2897#discussioncomment-6423818)\n for (let p of this.pendingConnects) {\n p.resolve();\n }\n this.pendingConnects = [];\n }\n }\n}\n","import Client from \"@/Client\";\nimport { getTokenPayload } from \"@/stores/utils/jwt\";\nimport { CrudService } from \"@/services/utils/CrudService\";\nimport { RealtimeService, UnsubscribeFunc } from \"@/services/RealtimeService\";\nimport { ClientResponseError } from \"@/ClientResponseError\";\nimport { ListResult, RecordModel, ExternalAuthModel } from \"@/services/utils/dtos\";\nimport {\n SendOptions,\n CommonOptions,\n RecordOptions,\n RecordListOptions,\n RecordFullListOptions,\n} from \"@/services/utils/options\";\nimport { normalizeLegacyOptionsArgs } from \"@/services/utils/legacy\";\n\nexport interface RecordAuthResponse<T = RecordModel> {\n /**\n * The signed PocketBase auth record.\n */\n record: T;\n\n /**\n * The PocketBase record auth token.\n *\n * If you are looking for the OAuth2 access and refresh tokens\n * they are available under the `meta.accessToken` and `meta.refreshToken` props.\n */\n token: string;\n\n /**\n * Auth meta data usually filled when OAuth2 is used.\n */\n meta?: { [key: string]: any };\n}\n\nexport interface AuthProviderInfo {\n name: string;\n displayName: string;\n state: string;\n authUrl: string;\n codeVerifier: string;\n codeChallenge: string;\n codeChallengeMethod: string;\n}\n\nexport interface AuthMethodsList {\n usernamePassword: boolean;\n emailPassword: boolean;\n onlyVerified: boolean;\n authProviders: Array<AuthProviderInfo>;\n}\n\nexport interface RecordSubscription<T = RecordModel> {\n action: string; // eg. create, update, delete\n record: T;\n}\n\nexport type OAuth2UrlCallback = (url: string) => void | Promise<void>;\n\nexport interface OAuth2AuthConfig extends SendOptions {\n // the name of the OAuth2 provider (eg. \"google\")\n provider: string;\n\n // custom scopes to overwrite the default ones\n scopes?: Array<string>;\n\n // optional record create data\n createData?: { [key: string]: any };\n\n // optional callback that is triggered after the OAuth2 sign-in/sign-up url generation\n urlCallback?: OAuth2UrlCallback;\n\n // optional query params to send with the PocketBase auth request (eg. fields, expand, etc.)\n query?: RecordOptions;\n}\n\nexport class RecordService<M = RecordModel> extends CrudService<M> {\n readonly collectionIdOrName: string;\n\n constructor(client: Client, collectionIdOrName: string) {\n super(client);\n\n this.collectionIdOrName = collectionIdOrName;\n }\n\n /**\n * @inheritdoc\n */\n get baseCrudPath(): string {\n return this.baseCollectionPath + \"/records\";\n }\n\n /**\n * Returns the current collection service base path.\n */\n get baseCollectionPath(): string {\n return \"/api/collections/\" + encodeURIComponent(this.collectionIdOrName);\n }\n\n // ---------------------------------------------------------------\n // Realtime handlers\n // ---------------------------------------------------------------\n\n /**\n * Subscribe to realtime changes to the specified topic (\"*\" or record id).\n *\n * If `topic` is the wildcard \"*\", then this method will subscribe to\n * any record changes in the collection.\n *\n * If `topic` is a record id, then this method will subscribe only\n * to changes of the specified record id.\n *\n * It's OK to subscribe multiple times to the same topic.\n * You can use the returned `UnsubscribeFunc` to remove only a single subscription.\n * Or use `unsubscribe(topic)` if you want to remove all subscriptions attached to the topic.\n */\n async subscribe<T = M>(\n topic: string,\n callback: (data: RecordSubscription<T>) => void,\n options?: SendOptions,\n ): Promise<UnsubscribeFunc> {\n if (!topic) {\n throw new Error(\"Missing topic.\");\n }\n\n if (!callback) {\n throw new Error(\"Missing subscription callback.\");\n }\n\n return this.client.realtime.subscribe(\n this.collectionIdOrName + \"/\" + topic,\n callback,\n options,\n );\n }\n\n /**\n * Unsubscribe from all subscriptions of the specified topic\n * (\"*\" or record id).\n *\n * If `topic` is not set, then this method will unsubscribe from\n * all subscriptions associated to the current collection.\n */\n async unsubscribe(topic?: string): Promise<void> {\n // unsubscribe from the specified topic\n if (topic) {\n return this.client.realtime.unsubscribe(\n this.collectionIdOrName + \"/\" + topic,\n );\n }\n\n // unsubscribe from everything related to the collection\n return this.client.realtime.unsubscribeByPrefix(this.collectionIdOrName);\n }\n\n // ---------------------------------------------------------------\n // Crud handers\n // ---------------------------------------------------------------\n /**\n * @inheritdoc\n */\n async getFullList<T = M>(options?: RecordFullListOptions): Promise<Array<T>>;\n\n /**\n * @inheritdoc\n */\n async getFullList<T = M>(\n batch?: number,\n options?: RecordListOptions,\n ): Promise<Array<T>>;\n\n /**\n * @inheritdoc\n */\n async getFullList<T = M>(\n batchOrOptions?: number | RecordFullListOptions,\n options?: RecordListOptions,\n ): Promise<Array<T>> {\n if (typeof batchOrOptions == \"number\") {\n return super.getFullList<T>(batchOrOptions, options);\n }\n\n const params = Object.assign({}, batchOrOptions, options);\n\n return super.getFullList<T>(params);\n }\n\n /**\n * @inheritdoc\n */\n async getList<T = M>(\n page = 1,\n perPage = 30,\n options?: RecordListOptions,\n ): Promise<ListResult<T>> {\n return super.getList<T>(page, perPage, options);\n }\n\n /**\n * @inheritdoc\n */\n async getFirstListItem<T = M>(\n filter: string,\n options?: RecordListOptions,\n ): Promise<T> {\n return super.getFirstListItem<T>(filter, options);\n }\n\n /**\n * @inheritdoc\n */\n async getOne<T = M>(id: string, options?: RecordOptions): Promise<T> {\n return super.getOne<T>(id, options);\n }\n\n /**\n * @inheritdoc\n */\n async create<T = M>(\n bodyParams?: { [key: string]: any } | FormData,\n options?: RecordOptions,\n ): Promise<T> {\n return super.create<T>(bodyParams, options);\n }\n\n /**\n * @inheritdoc\n *\n * If the current `client.authStore.model` matches with the updated id, then\n * on success the `client.authStore.model` will be updated with the result.\n */\n async update<T = M>(\n id: string,\n bodyParams?: { [key: string]: any } | FormData,\n options?: RecordOptions,\n ): Promise<T> {\n return super.update<RecordModel>(id, bodyParams, options).then((item) => {\n if (\n // is record auth\n this.client.authStore.model?.id === item?.id &&\n (this.client.authStore.model?.collectionId === this.collectionIdOrName ||\n this.client.authStore.model?.collectionName ===\n this.collectionIdOrName)\n ) {\n this.client.authStore.save(this.client.authStore.token, item);\n }\n\n return item as any as T;\n });\n }\n\n /**\n * @inheritdoc\n *\n * If the current `client.authStore.model` matches with the deleted id,\n * then on success the `client.authStore` will be cleared.\n */\n async delete(id: string, options?: CommonOptions): Promise<boolean> {\n return super.delete(id, options).then((success) => {\n if (\n success &&\n // is record auth\n this.client.authStore.model?.id === id &&\n (this.client.authStore.model?.collectionId === this.collectionIdOrName ||\n this.client.authStore.model?.collectionName ===\n this.collectionIdOrName)\n ) {\n this.client.authStore.clear();\n }\n\n return success;\n });\n }\n\n // ---------------------------------------------------------------\n // Auth handlers\n // ---------------------------------------------------------------\n\n /**\n * Prepare successful collection authorization response.\n */\n protected authResponse<T = M>(responseData: any): RecordAuthResponse<T> {\n const record = this.decode(responseData?.record || {});\n\n this.client.authStore.save(responseData?.token, record as any);\n\n return Object.assign({}, responseData, {\n // normalize common fields\n token: responseData?.token || \"\",\n record: record as any as T,\n });\n }\n\n /**\n * Returns all available collection auth methods.\n *\n * @throws {ClientResponseError}\n */\n async listAuthMethods(options?: CommonOptions): Promise<AuthMethodsList> {\n options = Object.assign(\n {\n method: \"GET\",\n },\n options,\n );\n\n return this.client\n .send(this.baseCollectionPath + \"/auth-methods\", options)\n .then((responseData: any) => {\n return Object.assign({}, responseData, {\n // normalize common fields\n usernamePassword: !!responseData?.usernamePassword,\n emailPassword: !!responseData?.emailPassword,\n authProviders: Array.isArray(responseData?.authProviders)\n ? responseData?.authProviders\n : [],\n });\n });\n }\n\n /**\n * Authenticate a single auth collection record via its username/email and password.\n *\n * On success, this method also automatically updates\n * the client's AuthStore data and returns:\n * - the authentication token\n * - the authenticated record model\n *\n * @throws {ClientResponseError}\n */\n async authWithPassword<T = M>(\n usernameOrEmail: string,\n password: string,\n options?: RecordOptions,\n ): Promise<RecordAuthResponse<T>>;\n\n /**\n * @deprecated\n * Consider using authWithPassword(usernameOrEmail, password, options?).\n */\n async authWithPassword<T = M>(\n usernameOrEmail: string,\n password: string,\n body?: any,\n query?: any,\n ): Promise<RecordAuthResponse<T>>;\n\n async authWithPassword<T = M>(\n usernameOrEmail: string,\n password: string,\n bodyOrOptions?: any,\n query?: any,\n ): Promise<RecordAuthResponse<T>> {\n let options: any = {\n method: \"POST\",\n body: {\n identity: usernameOrEmail,\n password: password,\n },\n };\n\n options = normalizeLegacyOptionsArgs(\n \"This form of authWithPassword(usernameOrEmail, pass, body?, query?) is deprecated. Consider replacing it with authWithPassword(usernameOrEmail, pass, options?).\",\n options,\n bodyOrOptions,\n query,\n );\n\n return this.client\n .send(this.baseCollectionPath + \"/auth-with-password\", options)\n .then((data) => this.authResponse<T>(data));\n }\n\n /**\n * Authenticate a single auth collection record with OAuth2 code.\n *\n * If you don't have an OAuth2 code you may also want to check `authWithOAuth2` method.\n *\n * On success, this method also automatically updates\n * the client's AuthStore data and returns:\n * - the authentication token\n * - the authenticated record model\n * - the OAuth2 account data (eg. name, email, avatar, etc.)\n *\n * @throws {ClientResponseError}\n */\n async authWithOAuth2Code<T = M>(\n provider: string,\n code: string,\n codeVerifier: string,\n redirectUrl: string,\n createData?: { [key: string]: any },\n options?: RecordOptions,\n ): Promise<RecordAuthResponse<T>>;\n\n /**\n * @deprecated\n * Consider using authWithOAuth2Code(provider, code, codeVerifier, redirectUrl, createdData, options?).\n */\n async authWithOAuth2Code<T = M>(\n provider: string,\n code: string,\n codeVerifier: string,\n redirectUrl: string,\n createData?: { [key: string]: any },\n body?: any,\n query?: any,\n ): Promise<RecordAuthResponse<T>>;\n\n async authWithOAuth2Code<T = M>(\n provider: string,\n code: string,\n codeVerifier: string,\n redirectUrl: string,\n createData?: { [key: string]: any },\n bodyOrOptions?: any,\n query?: any,\n ): Promise<RecordAuthResponse<T>> {\n let options: any = {\n method: \"POST\",\n body: {\n provider: provider,\n code: code,\n codeVerifier: codeVerifier,\n redirectUrl: redirectUrl,\n createData: createData,\n },\n };\n\n options = normalizeLegacyOptionsArgs(\n \"This form of authWithOAuth2Code(provider, code, codeVerifier, redirectUrl, createData?, body?, query?) is deprecated. Consider replacing it with authWithOAuth2Code(provider, code, codeVerifier, redirectUrl, createData?, options?).\",\n options,\n bodyOrOptions,\n query,\n );\n\n return this.client\n .send(this.baseCollectionPath + \"/auth-with-oauth2\", options)\n .then((data) => this.authResponse<T>(data));\n }\n\n /**\n * @deprecated This form of authWithOAuth2 is deprecated.\n *\n * Please use `authWithOAuth2Code()` OR its simplified realtime version\n * as shown in https://pocketbase.io/docs/authentication/#oauth2-integration.\n */\n async authWithOAuth2<T = M>(\n provider: string,\n code: string,\n codeVerifier: string,\n redirectUrl: string,\n createData?: { [key: string]: any },\n bodyParams?: { [key: string]: any },\n queryParams?: RecordOptions,\n ): Promise<RecordAuthResponse<T>>;\n\n /**\n * Authenticate a single auth collection record with OAuth2\n * **without custom redirects, deeplinks or even page reload**.\n *\n * This method initializes a one-off realtime subscription and will\n * open a popup window with the OAuth2 vendor page to authenticate.\n * Once the external OAuth2 sign-in/sign-up flow is completed, the popup\n * window will be automatically closed and the OAuth2 data sent back\n * to the user through the previously established realtime connection.\n *\n * You can specify an optional `urlCallback` prop to customize\n * the default url `window.open` behavior.\n *\n * On success, this method also automatically updates\n * the client's AuthStore data and returns:\n * - the authentication token\n * - the authenticated record model\n * - the OAuth2 account data (eg. name, email, avatar, etc.)\n *\n * Example:\n *\n * ```js\n * const authData = await pb.collection(\"users\").authWithOAuth2({\n * provider: \"google\",\n * })\n * ```\n *\n * Note1: When creating the OAuth2 app in the provider dashboard\n * you have to configure `https://yourdomain.com/api/oauth2-redirect`\n * as redirect URL.\n *\n * Note2: Safari may block the default `urlCallback` popup because\n * it doesn't allow `window.open` calls as part of an `async` click functions.\n * To workaround this you can either change your click handler to not be marked as `async`\n * OR manually call `window.open` before your `async` function and use the\n * window reference in your own custom `urlCallback` (see https://github.com/pocketbase/pocketbase/discussions/2429#discussioncomment-5943061).\n * For example:\n * ```js\n * <button id=\"btn\">Login with Gitlab</button>\n * ...\n * document.getElementById(\"btn\").addEventListener(\"click\", () => {\n * pb.collection(\"users\").authWithOAuth2({\n * provider: \"gitlab\",\n * }).then((authData) => {\n * console.log(authData)\n * }).catch((err) => {\n * console.log(err, err.originalError);\n * });\n * })\n * ```\n *\n * @throws {ClientResponseError}\n */\n async authWithOAuth2<T = M>(\n options: OAuth2AuthConfig,\n ): Promise<RecordAuthResponse<T>>;\n\n authWithOAuth2<T = M>(...args: any): Promise<RecordAuthResponse<T>> {\n // fallback to legacy format\n if (args.length > 1 || typeof args?.[0] === \"string\") {\n console.warn(\n \"PocketBase: This form of authWithOAuth2() is deprecated and may get removed in the future. Please replace with authWithOAuth2Code() OR use the authWithOAuth2() realtime form as shown in https://pocketbase.io/docs/authentication/#oauth2-integration.\",\n );\n return this.authWithOAuth2Code<T>(\n args?.[0] || \"\",\n args?.[1] || \"\",\n args?.[2] || \"\",\n args?.[3] || \"\",\n args?.[4] || {},\n args?.[5] || {},\n args?.[6] || {},\n );\n }\n\n const config = args?.[0] || {};\n\n // open a new popup window in case config.urlCallback is not set\n //\n // note: it is opened before any async calls due to Safari restrictions\n // (see https://github.com/pocketbase/pocketbase/discussions/2429#discussioncomment-5943061)\n let eagerDefaultPopup: Window | null = null;\n if (!config.urlCallback) {\n eagerDefaultPopup = openBrowserPopup(undefined);\n }\n\n // initialize a one-off realtime service\n const realtime = new RealtimeService(this.client);\n\n function cleanup() {\n eagerDefaultPopup?.close();\n realtime.unsubscribe();\n }\n\n const requestKeyOptions: SendOptions = {};\n const requestKey = config.requestKey\n if (requestKey) {\n requestKeyOptions.requestKey = requestKey;\n }\n\n return this.listAuthMethods(requestKeyOptions).then((authMethods) => {\n const provider = authMethods.authProviders.find(\n (p) => p.name === config.provider,\n );\n if (!provider) {\n throw new ClientResponseError(\n new Error(`Missing or invalid provider \"${config.provider}\".`),\n );\n }\n\n const redirectUrl = this.client.buildUrl(\"/api/oauth2-redirect\");\n\n // find the AbortController associated with the current request key (if any)\n const cancelController = requestKey ? this.client['cancelControllers']?.[requestKey] : undefined;\n if (cancelController) {\n cancelController.signal.onabort = () => {\n cleanup();\n }\n }\n\n return new Promise(async (resolve, reject) => {\n try {\n await realtime.subscribe(\"@oauth2\", async (e) => {\n const oldState = realtime.clientId;\n\n try {\n if (!e.state || oldState !== e.state) {\n throw new Error(\"State parameters don't match.\");\n }\n\n if (e.error || !e.code) {\n throw new Error(\n \"OAuth2 redirect error or missing code: \" + e.error,\n );\n }\n\n // clear the non SendOptions props\n const options = Object.assign({}, config);\n delete options.provider;\n delete options.scopes;\n delete options.createData;\n delete options.urlCallback;\n\n // reset the cancelController listener as it will be triggered by the next api call\n if (cancelController?.signal?.onabort) {\n cancelController.signal.onabort = null\n }\n\n const authData = await this.authWithOAuth2Code<T>(\n provider.name,\n e.code,\n provider.codeVerifier,\n redirectUrl,\n config.createData,\n options,\n );\n\n resolve(authData);\n } catch (err) {\n reject(new ClientResponseError(err));\n }\n\n cleanup();\n });\n\n const replacements: { [key: string]: any } = {\n state: realtime.clientId,\n };\n if (config.scopes?.length) {\n replacements[\"scope\"] = config.scopes.join(\" \");\n }\n\n const url = this._replaceQueryParams(\n provider.authUrl + redirectUrl,\n replacements,\n );\n\n let urlCallback =\n config.urlCallback ||\n function (url: string) {\n if (eagerDefaultPopup) {\n eagerDefaultPopup.location.href = url;\n } else {\n // it could have been blocked due to its empty initial url,\n // try again...\n eagerDefaultPopup = openBrowserPopup(url);\n }\n };\n\n await urlCallback(url);\n } catch (err) {\n cleanup();\n reject(new ClientResponseError(err));\n }\n });\n }).catch((err) => {\n cleanup();\n throw err // rethrow\n }) as Promise<RecordAuthResponse<T>>;\n }\n\n /**\n * Refreshes the current authenticated record instance and\n * returns a new token and record data.\n *\n * On success this method also automatically updates the client's AuthStore.\n *\n * @throws {ClientResponseError}\n */\n async authRefresh<T = M>(options?: RecordOptions): Promise<RecordAuthResponse<T>>;\n\n /**\n * @deprecated\n * Consider using authRefresh(options?).\n */\n async authRefresh<T = M>(body?: any, query?: any): Promise<RecordAuthResponse<T>>;\n\n async authRefresh<T = M>(\n bodyOrOptions?: any,\n query?: any,\n ): Promise<RecordAuthResponse<T>> {\n let options: any = {\n method: \"POST\",\n };\n\n options = normalizeLegacyOptionsArgs(\n \"This form of authRefresh(body?, query?) is deprecated. Consider replacing it with authRefresh(options?).\",\n options,\n bodyOrOptions,\n query,\n );\n\n return this.client\n .send(this.baseCollectionPath + \"/auth-refresh\", options)\n .then((data) => this.authResponse<T>(data));\n }\n\n /**\n * Sends auth record password reset request.\n *\n * @throws {ClientResponseError}\n */\n async requestPasswordReset(email: string, options?: CommonOptions): Promise<boolean>;\n\n /**\n * @deprecated\n * Consider using requestPasswordReset(email, options?).\n */\n async requestPasswordReset(email: string, body?: any, query?: any): Promise<boolean>;\n\n async requestPasswordReset(\n email: string,\n bodyOrOptions?: any,\n query?: any,\n ): Promise<boolean> {\n let options: any = {\n method: \"POST\",\n body: {\n email: email,\n },\n };\n\n options = normalizeLegacyOptionsArgs(\n \"This form of requestPasswordReset(email, body?, query?) is deprecated. Consider replacing it with requestPasswordReset(email, options?).\",\n options,\n bodyOrOptions,\n query,\n );\n\n return this.client\n .send(this.baseCollectionPath + \"/request-password-reset\", options)\n .then(() => true);\n }\n\n /**\n * Confirms auth record password reset request.\n *\n * @throws {ClientResponseError}\n */\n async confirmPasswordReset(\n passwordResetToken: string,\n password: string,\n passwordConfirm: string,\n options?: CommonOptions,\n ): Promise<boolean>;\n\n /**\n * @deprecated\n * Consider using confirmPasswordReset(passwordResetToken, password, passwordConfirm, options?).\n */\n async confirmPasswordReset(\n passwordResetToken: string,\n password: string,\n passwordConfirm: string,\n body?: any,\n query?: any,\n ): Promise<boolean>;\n\n async confirmPasswordReset(\n passwordResetToken: string,\n password: string,\n passwordConfirm: string,\n bodyOrOptions?: any,\n query?: any,\n ): Promise<boolean> {\n let options: any = {\n method: \"POST\",\n body: {\n token: passwordResetToken,\n password: password,\n passwordConfirm: passwordConfirm,\n },\n };\n\n options = normalizeLegacyOptionsArgs(\n \"This form of confirmPasswordReset(token, password, passwordConfirm, body?, query?) is deprecated. Consider replacing it with confirmPasswordReset(token, password, passwordConfirm, options?).\",\n options,\n bodyOrOptions,\n query,\n );\n\n return this.client\n .send(this.baseCollectionPath + \"/confirm-password-reset\", options)\n .then(() => true);\n }\n\n /**\n * Sends auth record verification email request.\n *\n * @throws {ClientResponseError}\n */\n async requestVerification(email: string, options?: CommonOptions): Promise<boolean>;\n\n /**\n * @deprecated\n * Consider using requestVerification(email, options?).\n */\n async requestVerification(email: string, body?: any, query?: any): Promise<boolean>;\n\n async requestVerification(\n email: string,\n bodyOrOptions?: any,\n query?: any,\n ): Promise<boolean> {\n let options: any = {\n method: \"POST\",\n body: {\n email: email,\n },\n };\n\n options = normalizeLegacyOptionsArgs(\n \"This form of requestVerification(email, body?, query?) is deprecated. Consider replacing it with requestVerification(email, options?).\",\n options,\n bodyOrOptions,\n query,\n );\n\n return this.client\n .send(this.baseCollectionPath + \"/request-verification\", options)\n .then(() => true);\n }\n\n /**\n * Confirms auth record email verification request.\n *\n * If the current `client.authStore.model` matches with the auth record from the token,\n * then on success the `client.authStore.model.verified` will be updated to `true`.\n *\n * @throws {ClientResponseError}\n */\n async confirmVerification(\n verificationToken: string,\n options?: CommonOptions,\n ): Promise<boolean>;\n\n /**\n * @deprecated\n * Consider using confirmVerification(verificationToken, options?).\n */\n async confirmVerification(\n verificationToken: string,\n body?: any,\n query?: any,\n ): Promise<boolean>;\n\n async confirmVerification(\n verificationToken: string,\n bodyOrOptions?: any,\n query?: any,\n ): Promise<boolean> {\n let options: any = {\n method: \"POST\",\n body: {\n token: verificationToken,\n },\n };\n\n options = normalizeLegacyOptionsArgs(\n \"This form of confirmVerification(token, body?, query?) is deprecated. Consider replacing it with confirmVerification(token, options?).\",\n options,\n bodyOrOptions,\n query,\n );\n\n return this.client\n .send(this.baseCollectionPath + \"/confirm-verification\", options)\n .then(() => {\n // on success manually update the current auth record verified state\n const payload = getTokenPayload(verificationToken);\n const model = this.client.authStore.model;\n if (\n model &&\n !model.verified &&\n model.id === payload.id &&\n model.collectionId === payload.collectionId\n ) {\n model.verified = true;\n this.client.authStore.save(this.client.authStore.token, model);\n }\n\n return true;\n });\n }\n\n /**\n * Sends an email change request to the authenticated record model.\n *\n * @throws {ClientResponseError}\n */\n async requestEmailChange(newEmail: string, options?: CommonOptions): Promise<boolean>;\n\n /**\n * @deprecated\n * Consider using requestEmailChange(newEmail, options?).\n */\n async requestEmailChange(newEmail: string, body?: any, query?: any): Promise<boolean>;\n\n async requestEmailChange(\n newEmail: string,\n bodyOrOptions?: any,\n query?: any,\n ): Promise<boolean> {\n let options: any = {\n method: \"POST\",\n body: {\n newEmail: newEmail,\n },\n };\n\n options = normalizeLegacyOptionsArgs(\n \"This form of requestEmailChange(newEmail, body?, query?) is deprecated. Consider replacing it with requestEmailChange(newEmail, options?).\",\n options,\n bodyOrOptions,\n query,\n );\n\n return this.client\n .send(this.baseCollectionPath + \"/request-email-change\", options)\n .then(() => true);\n }\n\n /**\n * Confirms auth record's new email address.\n *\n * If the current `client.authStore.model` matches with the auth record from the token,\n * then on success the `client.authStore` will be cleared.\n *\n * @throws {ClientResponseError}\n */\n async confirmEmailChange(\n emailChangeToken: string,\n password: string,\n options?: CommonOptions,\n ): Promise<boolean>;\n\n /**\n * @deprecated\n * Consider using confirmEmailChange(emailChangeToken, password, options?).\n */\n async confirmEmailChange(\n emailChangeToken: string,\n password: string,\n body?: any,\n query?: any,\n ): Promise<boolean>;\n\n async confirmEmailChange(\n emailChangeToken: string,\n password: string,\n bodyOrOptions?: any,\n query?: any,\n ): Promise<boolean> {\n let options: any = {\n method: \"POST\",\n body: {\n token: emailChangeToken,\n password: password,\n },\n };\n\n options = normalizeLegacyOptionsArgs(\n \"This form of confirmEmailChange(token, password, body?, query?) is deprecated. Consider replacing it with confirmEmailChange(token, password, options?).\",\n options,\n bodyOrOptions,\n query,\n );\n\n return this.client\n .send(this.baseCollectionPath + \"/confirm-email-change\", options)\n .then(() => {\n const payload = getTokenPayload(emailChangeToken);\n const model = this.client.authStore.model;\n if (\n model &&\n model.id === payload.id &&\n model.collectionId === payload.collectionId\n ) {\n this.client.authStore.clear();\n }\n\n return true;\n });\n }\n\n /**\n * Lists all linked external auth providers for the specified auth record.\n *\n * @throws {ClientResponseError}\n */\n async listExternalAuths(\n recordId: string,\n options?: CommonOptions,\n ): Promise<Array<ExternalAuthModel>> {\n options = Object.assign(\n {\n method: \"GET\",\n },\n options,\n );\n\n return this.client.send(\n this.baseCrudPath + \"/\" + encodeURIComponent(recordId) + \"/external-auths\",\n options,\n );\n }\n\n /**\n * Unlink a single external auth provider from the specified auth record.\n *\n * @throws {ClientResponseError}\n */\n async unlinkExternalAuth(\n recordId: string,\n provider: string,\n options?: CommonOptions,\n ): Promise<boolean> {\n options = Object.assign(\n {\n method: \"DELETE\",\n },\n options,\n );\n\n return this.client\n .send(\n this.baseCrudPath +\n \"/\" +\n encodeURIComponent(recordId) +\n \"/external-auths/\" +\n encodeURIComponent(provider),\n options,\n )\n .then(() => true);\n }\n\n // ---------------------------------------------------------------\n\n // very rudimentary url query params replacement because at the moment\n // URL (and URLSearchParams) doesn't seem to be fully supported in React Native\n //\n // note: for details behind some of the decode/encode parsing check https://unixpapa.com/js/querystring.html\n private _replaceQueryParams(\n url: string,\n replacements: { [key: string]: any } = {},\n ): string {\n let urlPath = url;\n let query = \"\";\n\n const queryIndex = url.indexOf(\"?\");\n if (queryIndex >= 0) {\n urlPath = url.substring(0, url.indexOf(\"?\"));\n query = url.substring(url.indexOf(\"?\") + 1);\n }\n\n const parsedParams: { [key: string]: string } = {};\n\n // parse the query parameters\n const rawParams = query.split(\"&\");\n for (const param of rawParams) {\n if (param == \"\") {\n continue;\n }\n\n const pair = param.split(\"=\");\n parsedParams[decodeURIComponent(pair[0].replace(/\\+/g, \" \"))] =\n decodeURIComponent((pair[1] || \"\").replace(/\\+/g, \" \"));\n }\n\n // apply the replacements\n for (let key in replacements) {\n if (!replacements.hasOwnProperty(key)) {\n continue;\n }\n\n if (replacements[key] == null) {\n delete parsedParams[key];\n } else {\n parsedParams[key] = replacements[key];\n }\n }\n\n // construct back the full query string\n query = \"\";\n for (let key in parsedParams) {\n if (!parsedParams.hasOwnProperty(key)) {\n continue;\n }\n\n if (query != \"\") {\n query += \"&\";\n }\n\n query +=\n encodeURIComponent(key.replace(/%20/g, \"+\")) +\n \"=\" +\n encodeURIComponent(parsedParams[key].replace(/%20/g, \"+\"));\n }\n\n return query != \"\" ? urlPath + \"?\" + query : urlPath;\n }\n}\n\nfunction openBrowserPopup(url?: string): Window | null {\n if (typeof window === \"undefined\" || !window?.open) {\n throw new ClientResponseError(\n new Error(\n `Not in a browser context - please pass a custom urlCallback function.`,\n ),\n );\n }\n\n let width = 1024;\n let height = 768;\n\n let windowWidth = window.innerWidth;\n let windowHeight = window.innerHeight;\n\n // normalize window size\n width = width > windowWidth ? windowWidth : width;\n height = height > windowHeight ? windowHeight : height;\n\n let left = windowWidth / 2 - width / 2;\n let top = windowHeight / 2 - height / 2;\n\n // note: we don't use the noopener and noreferrer attributes since\n // for some reason browser blocks such windows then url is undefined/blank\n return window.open(\n url,\n \"popup_window\",\n \"width=\" +\n width +\n \",height=\" +\n height +\n \",top=\" +\n top +\n \",left=\" +\n left +\n \",resizable,menubar=no\",\n );\n}\n","import { CrudService } from \"@/services/utils/CrudService\";\nimport { CollectionModel } from \"@/services/utils/dtos\";\nimport { CommonOptions } from \"@/services/utils/options\";\n\nexport class CollectionService extends CrudService<CollectionModel> {\n /**\n * @inheritdoc\n */\n get baseCrudPath(): string {\n return \"/api/collections\";\n }\n\n /**\n * Imports the provided collections.\n *\n * If `deleteMissing` is `true`, all local collections and schema fields,\n * that are not present in the imported configuration, WILL BE DELETED\n * (including their related records data)!\n *\n * @throws {ClientResponseError}\n */\n async import(\n collections: Array<CollectionModel>,\n deleteMissing: boolean = false,\n options?: CommonOptions,\n ): Promise<true> {\n options = Object.assign(\n {\n method: \"PUT\",\n body: {\n collections: collections,\n deleteMissing: deleteMissing,\n },\n },\n options,\n );\n\n return this.client.send(this.baseCrudPath + \"/import\", options).then(() => true);\n }\n}\n","import { ClientResponseError } from \"@/ClientResponseError\";\nimport { BaseService } from \"@/services/utils/BaseService\";\nimport { ListResult, LogModel } from \"@/services/utils/dtos\";\nimport { CommonOptions, ListOptions, LogStatsOptions } from \"@/services/utils/options\";\n\nexport interface HourlyStats {\n total: number;\n date: string;\n}\n\nexport class LogService extends BaseService {\n /**\n * Returns paginated logs list.\n *\n * @throws {ClientResponseError}\n */\n async getList(\n page = 1,\n perPage = 30,\n options?: ListOptions,\n ): Promise<ListResult<LogModel>> {\n options = Object.assign({ method: \"GET\" }, options);\n\n options.query = Object.assign(\n {\n page: page,\n perPage: perPage,\n },\n options.query,\n );\n\n return this.client.send(\"/api/logs\", options);\n }\n\n /**\n * Returns a single log by its id.\n *\n * If `id` is empty it will throw a 404 error.\n *\n * @throws {ClientResponseError}\n */\n async getOne(id: string, options?: CommonOptions): Promise<LogModel> {\n if (!id) {\n throw new ClientResponseError({\n url: this.client.buildUrl(\"/api/logs/\"),\n status: 404,\n response: {\n code: 404,\n message: \"Missing required log id.\",\n data: {},\n },\n });\n }\n\n options = Object.assign(\n {\n method: \"GET\",\n },\n options,\n );\n\n return this.client.send(\"/api/logs/\" + encodeURIComponent(id), options);\n }\n\n /**\n * Returns logs statistics.\n *\n * @throws {ClientResponseError}\n */\n async getStats(options?: LogStatsOptions): Promise<Array<HourlyStats>> {\n options = Object.assign(\n {\n method: \"GET\",\n },\n options,\n );\n\n return this.client.send(\"/api/logs/stats\", options);\n }\n}\n","import { BaseService } from \"@/services/utils/BaseService\";\nimport { CommonOptions } from \"@/services/utils/options\";\n\nexport interface HealthCheckResponse {\n code: number;\n message: string;\n data: { [key: string]: any };\n}\n\nexport class HealthService extends BaseService {\n /**\n * Checks the health status of the api.\n *\n * @throws {ClientResponseError}\n */\n async check(options?: CommonOptions): Promise<HealthCheckResponse> {\n options = Object.assign(\n {\n method: \"GET\",\n },\n options,\n );\n\n return this.client.send(\"/api/health\", options);\n }\n}\n","import { BaseService } from \"@/services/utils/BaseService\";\nimport { CommonOptions, FileOptions } from \"@/services/utils/options\";\n\nexport class FileService extends BaseService {\n /**\n * Builds and returns an absolute record file url for the provided filename.\n */\n getUrl(\n record: { [key: string]: any },\n filename: string,\n queryParams: FileOptions = {},\n ): string {\n if (\n !filename ||\n !record?.id ||\n !(record?.collectionId || record?.collectionName)\n ) {\n return \"\";\n }\n\n const parts = [];\n parts.push(\"api\");\n parts.push(\"files\");\n parts.push(encodeURIComponent(record.collectionId || record.collectionName));\n parts.push(encodeURIComponent(record.id));\n parts.push(encodeURIComponent(filename));\n\n let result = this.client.buildUrl(parts.join(\"/\"));\n\n if (Object.keys(queryParams).length) {\n // normalize the download query param for consistency with the Dart sdk\n if (queryParams.download === false) {\n delete queryParams.download;\n }\n\n const params = new URLSearchParams(queryParams);\n\n result += (result.includes(\"?\") ? \"&\" : \"?\") + params;\n }\n\n return result;\n }\n\n /**\n * Requests a new private file access token for the current auth model (admin or record).\n *\n * @throws {ClientResponseError}\n */\n async getToken(options?: CommonOptions): Promise<string> {\n options = Object.assign(\n {\n method: \"POST\",\n },\n options,\n );\n\n return this.client\n .send(\"/api/files/token\", options)\n .then((data) => data?.token || \"\");\n }\n}\n","import { BaseService } from \"@/services/utils/BaseService\";\nimport { CommonOptions } from \"@/services/utils/options\";\n\nexport interface BackupFileInfo {\n key: string;\n size: number;\n modified: string;\n}\n\nexport class BackupService extends BaseService {\n /**\n * Returns list with all available backup files.\n *\n * @throws {ClientResponseError}\n */\n async getFullList(options?: CommonOptions): Promise<Array<BackupFileInfo>> {\n options = Object.assign(\n {\n method: \"GET\",\n },\n options,\n );\n\n return this.client.send(\"/api/backups\", options);\n }\n\n /**\n * Initializes a new backup.\n *\n * @throws {ClientResponseError}\n */\n async create(basename: string, options?: CommonOptions): Promise<boolean> {\n options = Object.assign(\n {\n method: \"POST\",\n body: {\n name: basename,\n },\n },\n options,\n );\n\n return this.client.send(\"/api/backups\", options).then(() => true);\n }\n\n /**\n * Uploads an existing backup file.\n *\n * Example:\n *\n * ```js\n * await pb.backups.upload({\n * file: new Blob([...]),\n * });\n * ```\n *\n * @throws {ClientResponseError}\n */\n async upload(\n bodyParams: { [key: string]: any } | FormData,\n options?: CommonOptions,\n ): Promise<boolean> {\n options = Object.assign(\n {\n method: \"POST\",\n body: bodyParams,\n },\n options,\n );\n\n return this.client.send(\"/api/backups/upload\", options).then(() => true);\n }\n\n /**\n * Deletes a single backup file.\n *\n * @throws {ClientResponseError}\n */\n async delete(key: string, options?: CommonOptions): Promise<boolean> {\n options = Object.assign(\n {\n method: \"DELETE\",\n },\n options,\n );\n\n return this.client\n .send(`/api/backups/${encodeURIComponent(key)}`, options)\n .then(() => true);\n }\n\n /**\n * Initializes an app data restore from an existing backup.\n *\n * @throws {ClientResponseError}\n */\n async restore(key: string, options?: CommonOptions): Promise<boolean> {\n options = Object.assign(\n {\n method: \"POST\",\n },\n options,\n );\n\n return this.client\n .send(`/api/backups/${encodeURIComponent(key)}/restore`, options)\n .then(() => true);\n }\n\n /**\n * Builds a download url for a single existing backup using an\n * admin file token and the backup file key.\n *\n * The file token can be generated via `pb.files.getToken()`.\n */\n getDownloadUrl(token: string, key: string): string {\n return this.client.buildUrl(\n `/api/backups/${encodeURIComponent(key)}?token=${encodeURIComponent(token)}`,\n );\n }\n}\n","import { ClientResponseError } from \"@/ClientResponseError\";\nimport { BaseAuthStore } from \"@/stores/BaseAuthStore\";\nimport { LocalAuthStore } from \"@/stores/LocalAuthStore\";\nimport { SettingsService } from \"@/services/SettingsService\";\nimport { AdminService } from \"@/services/AdminService\";\nimport { RecordService } from \"@/services/RecordService\";\nimport { CollectionService } from \"@/services/CollectionService\";\nimport { LogService } from \"@/services/LogService\";\nimport { RealtimeService } from \"@/services/RealtimeService\";\nimport { HealthService } from \"@/services/HealthService\";\nimport { FileService } from \"@/services/FileService\";\nimport { BackupService } from \"@/services/BackupService\";\nimport { RecordModel } from \"@/services/utils/dtos\";\nimport {\n SendOptions,\n FileOptions,\n normalizeUnknownQueryParams,\n} from \"@/services/utils/options\";\n\nexport interface BeforeSendResult {\n [key: string]: any; // for backward compatibility\n url?: string;\n options?: { [key: string]: any };\n}\n\n/**\n * PocketBase JS Client.\n */\nexport default class Client {\n /**\n * The base PocketBase backend url address (eg. 'http://127.0.0.1.8090').\n */\n baseUrl: string;\n\n /**\n * Hook that get triggered right before sending the fetch request,\n * allowing you to inspect and modify the url and request options.\n *\n * For list of the possible options check https://developer.mozilla.org/en-US/docs/Web/API/fetch#options\n *\n * You can return a non-empty result object `{ url, options }` to replace the url and request options entirely.\n *\n * Example:\n * ```js\n * client.beforeSend = function (url, options) {\n * options.headers = Object.assign({}, options.headers, {\n * 'X-Custom-Header': 'example',\n * });\n *\n * return { url, options }\n * };\n * ```\n */\n beforeSend?: (\n url: string,\n options: SendOptions,\n ) => BeforeSendResult | Promise<BeforeSendResult>;\n\n /**\n * Hook that get triggered after successfully sending the fetch request,\n * allowing you to inspect/modify the response object and its parsed data.\n *\n * Returns the new Promise resolved `data` that will be returned to the client.\n *\n * Example:\n * ```js\n * client.afterSend = function (response, data) {\n * if (response.status != 200) {\n * throw new ClientResponseError({\n * url: response.url,\n * status: response.status,\n * response: { ... },\n * });\n * }\n *\n * return data;\n * };\n * ```\n */\n afterSend?: (response: Response, data: any) => any;\n\n /**\n * Optional language code (default to `en-US`) that will be sent\n * with the requests to the server as `Accept-Language` header.\n */\n lang: string;\n\n /**\n * A replaceable instance of the local auth store service.\n */\n authStore: BaseAuthStore;\n\n /**\n * An instance of the service that handles the **Settings APIs**.\n */\n readonly settings: SettingsService;\n\n /**\n * An instance of the service that handles the **Admin APIs**.\n */\n readonly admins: AdminService;\n\n /**\n * An instance of the service that handles the **Collection APIs**.\n */\n readonly collections: CollectionService;\n\n /**\n * An instance of the service that handles the **File APIs**.\n */\n readonly files: FileService;\n\n /**\n * An instance of the service that handles the **Log APIs**.\n */\n readonly logs: LogService;\n\n /**\n * An instance of the service that handles the **Realtime APIs**.\n */\n readonly realtime: RealtimeService;\n\n /**\n * An instance of the service that handles the **Health APIs**.\n */\n readonly health: HealthService;\n\n /**\n * An instance of the service that handles the **Backup APIs**.\n */\n readonly backups: BackupService;\n\n private cancelControllers: { [key: string]: AbortController } = {};\n private recordServices: { [key: string]: RecordService } = {};\n private enableAutoCancellation: boolean = true;\n\n constructor(baseUrl = \"/\", authStore?: BaseAuthStore | null, lang = \"en-US\") {\n this.baseUrl = baseUrl;\n this.lang = lang;\n this.authStore = authStore || new LocalAuthStore();\n\n // services\n this.admins = new AdminService(this);\n this.collections = new CollectionService(this);\n this.files = new FileService(this);\n this.logs = new LogService(this);\n this.settings = new SettingsService(this);\n this.realtime = new RealtimeService(this);\n this.health = new HealthService(this);\n this.backups = new BackupService(this);\n }\n\n /**\n * Returns the RecordService associated to the specified collection.\n *\n * @param {string} idOrName\n * @return {RecordService}\n */\n collection<M = RecordModel>(idOrName: string): RecordService<M> {\n if (!this.recordServices[idOrName]) {\n this.recordServices[idOrName] = new RecordService(this, idOrName);\n }\n\n return this.recordServices[idOrName];\n }\n\n /**\n * Globally enable or disable auto cancellation for pending duplicated requests.\n */\n autoCancellation(enable: boolean): Client {\n this.enableAutoCancellation = !!enable;\n\n return this;\n }\n\n /**\n * Cancels single request by its cancellation key.\n */\n cancelRequest(requestKey: string): Client {\n if (this.cancelControllers[requestKey]) {\n this.cancelControllers[requestKey].abort();\n delete this.cancelControllers[requestKey];\n }\n\n return this;\n }\n\n /**\n * Cancels all pending requests.\n */\n cancelAllRequests(): Client {\n for (let k in this.cancelControllers) {\n this.cancelControllers[k].abort();\n }\n\n this.cancelControllers = {};\n\n return this;\n }\n\n /**\n * Constructs a filter expression with placeholders populated from a parameters object.\n *\n * Placeholder parameters are defined with the `{:paramName}` notation.\n *\n * The following parameter values are supported:\n *\n * - `string` (_single quotes are autoescaped_)\n * - `number`\n * - `boolean`\n * - `Date` object (_stringified into the PocketBase datetime format_)\n * - `null`\n * - everything else is converted to a string using `JSON.stringify()`\n *\n * Example:\n *\n * ```js\n * pb.collection(\"example\").getFirstListItem(pb.filter(\n * 'title ~ {:title} && created >= {:created}',\n * { title: \"example\", created: new Date()}\n * ))\n * ```\n */\n filter(raw: string, params?: { [key: string]: any }): string {\n if (!params) {\n return raw;\n }\n\n for (let key in params) {\n let val = params[key];\n switch (typeof val) {\n case \"boolean\":\n case \"number\":\n val = \"\" + val;\n break;\n case \"string\":\n val = \"'\" + val.replace(/'/g, \"\\\\'\") + \"'\";\n break;\n default:\n if (val === null) {\n val = \"null\";\n } else if (val instanceof Date) {\n val = \"'\" + val.toISOString().replace(\"T\", \" \") + \"'\";\n } else {\n val = \"'\" + JSON.stringify(val).replace(/'/g, \"\\\\'\") + \"'\";\n }\n }\n raw = raw.replaceAll(\"{:\" + key + \"}\", val);\n }\n\n return raw;\n }\n\n /**\n * Legacy alias of `pb.files.getUrl()`.\n */\n getFileUrl(\n record: { [key: string]: any },\n filename: string,\n queryParams: FileOptions = {},\n ): string {\n return this.files.getUrl(record, filename, queryParams);\n }\n\n /**\n * Builds a full client url by safely concatenating the provided path.\n */\n buildUrl(path: string): string {\n let url = this.baseUrl;\n\n // construct an absolute base url if in a browser environment\n if (\n typeof window !== \"undefined\" &&\n !!window.location &&\n !url.startsWith(\"https://\") &&\n !url.startsWith(\"http://\")\n ) {\n url = window.location.origin?.endsWith(\"/\")\n ? window.location.origin.substring(0, window.location.origin.length - 1)\n : window.location.origin || \"\";\n\n if (!this.baseUrl.startsWith(\"/\")) {\n url += window.location.pathname || \"/\";\n url += url.endsWith(\"/\") ? \"\" : \"/\";\n }\n\n url += this.baseUrl;\n }\n\n // concatenate the path\n if (path) {\n url += url.endsWith(\"/\") ? \"\" : \"/\"; // append trailing slash if missing\n url += path.startsWith(\"/\") ? path.substring(1) : path;\n }\n\n return url;\n }\n\n /**\n * Sends an api http request.\n *\n * @throws {ClientResponseError}\n */\n async send<T = any>(path: string, options: SendOptions): Promise<T> {\n options = this.initSendOptions(path, options);\n\n // build url + path\n let url = this.buildUrl(path);\n\n if (this.beforeSend) {\n const result = Object.assign({}, await this.beforeSend(url, options));\n if (\n typeof result.url !== \"undefined\" ||\n typeof result.options !== \"undefined\"\n ) {\n url = result.url || url;\n options = result.options || options;\n } else if (Object.keys(result).length) {\n // legacy behavior\n options = result as SendOptions;\n console?.warn &&\n console.warn(\n \"Deprecated format of beforeSend return: please use `return { url, options }`, instead of `return options`.\",\n );\n }\n }\n\n // serialize the query parameters\n if (typeof options.query !== \"undefined\") {\n const query = this.serializeQueryParams(options.query);\n if (query) {\n url += (url.includes(\"?\") ? \"&\" : \"?\") + query;\n }\n delete options.query;\n }\n\n // ensures that the json body is serialized\n if (\n this.getHeader(options.headers, \"Content-Type\") == \"application/json\" &&\n options.body &&\n typeof options.body !== \"string\"\n ) {\n options.body = JSON.stringify(options.body);\n }\n\n const fetchFunc = options.fetch || fetch;\n\n // send the request\n return fetchFunc(url, options)\n .then(async (response) => {\n let data: any = {};\n\n try {\n data = await response.json();\n } catch (_) {\n // all api responses are expected to return json\n // with the exception of the realtime event and 204\n }\n\n if (this.afterSend) {\n data = await this.afterSend(response, data);\n }\n\n if (response.status >= 400) {\n throw new ClientResponseError({\n url: response.url,\n status: response.status,\n data: data,\n });\n }\n\n return data as T;\n })\n .catch((err) => {\n // wrap to normalize all errors\n throw new ClientResponseError(err);\n });\n }\n\n /**\n * Shallow copy the provided object and takes care to initialize\n * any options required to preserve the backward compatability.\n *\n * @param {SendOptions} options\n * @return {SendOptions}\n */\n private initSendOptions(path: string, options: SendOptions): SendOptions {\n options = Object.assign({ method: \"GET\" } as SendOptions, options);\n\n // auto convert the body to FormData, if needed\n options.body = this.convertToFormDataIfNeeded(options.body);\n\n // move unknown send options as query parameters\n normalizeUnknownQueryParams(options);\n\n // requestKey normalizations for backward-compatibility\n // ---\n options.query = Object.assign({}, options.params, options.query);\n if (typeof options.requestKey === \"undefined\") {\n if (options.$autoCancel === false || options.query.$autoCancel === false) {\n options.requestKey = null;\n } else if (options.$cancelKey || options.query.$cancelKey) {\n options.requestKey = options.$cancelKey || options.query.$cancelKey;\n }\n }\n // remove the deprecated special cancellation params from the other query params\n delete options.$autoCancel;\n delete options.query.$autoCancel;\n delete options.$cancelKey;\n delete options.query.$cancelKey;\n // ---\n\n // add the json header, if not explicitly set\n // (for FormData body the Content-Type header should be skipped since the boundary is autogenerated)\n if (\n this.getHeader(options.headers, \"Content-Type\") === null &&\n !this.isFormData(options.body)\n ) {\n options.headers = Object.assign({}, options.headers, {\n \"Content-Type\": \"application/json\",\n });\n }\n\n // add Accept-Language header, if not explicitly set\n if (this.getHeader(options.headers, \"Accept-Language\") === null) {\n options.headers = Object.assign({}, options.headers, {\n \"Accept-Language\": this.lang,\n });\n }\n\n // check if Authorization header can be added\n if (\n // has valid token\n this.authStore.token &&\n // auth header is not explicitly set\n this.getHeader(options.headers, \"Authorization\") === null\n ) {\n options.headers = Object.assign({}, options.headers, {\n Authorization: this.authStore.token,\n });\n }\n\n // handle auto cancelation for duplicated pending request\n if (this.enableAutoCancellation && options.requestKey !== null) {\n const requestKey = options.requestKey || (options.method || \"GET\") + path;\n\n delete options.requestKey;\n\n // cancel previous pending requests\n this.cancelRequest(requestKey);\n\n const controller = new AbortController();\n this.cancelControllers[requestKey] = controller;\n options.signal = controller.signal;\n }\n\n return options;\n }\n\n /**\n * Converts analyzes the provided body and converts it to FormData\n * in case a plain object with File/Blob values is used.\n */\n private convertToFormDataIfNeeded(body: any): any {\n if (\n typeof FormData === \"undefined\" ||\n typeof body === \"undefined\" ||\n typeof body !== \"object\" ||\n body === null ||\n this.isFormData(body) ||\n !this.hasBlobField(body)\n ) {\n return body;\n }\n\n const form = new FormData();\n\n for (const key in body) {\n const val = body[key];\n\n if (typeof val === \"object\" && !this.hasBlobField({ data: val })) {\n // send json-like values as jsonPayload to avoid the implicit string value normalization\n let payload: { [key: string]: any } = {};\n payload[key] = val;\n form.append(\"@jsonPayload\", JSON.stringify(payload));\n } else {\n // in case of mixed string and file/blob\n const normalizedVal = Array.isArray(val) ? val : [val];\n for (let v of normalizedVal) {\n form.append(key, v);\n }\n }\n }\n\n return form;\n }\n\n /**\n * Checks if the submitted body object has at least one Blob/File field.\n */\n private hasBlobField(body: { [key: string]: any }): boolean {\n for (const key in body) {\n const values = Array.isArray(body[key]) ? body[key] : [body[key]];\n for (const v of values) {\n if (\n (typeof Blob !== \"undefined\" && v instanceof Blob) ||\n (typeof File !== \"undefined\" && v instanceof File)\n ) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n /**\n * Extracts the header with the provided name in case-insensitive manner.\n * Returns `null` if no header matching the name is found.\n */\n private getHeader(\n headers: { [key: string]: string } | undefined,\n name: string,\n ): string | null {\n headers = headers || {};\n name = name.toLowerCase();\n\n for (let key in headers) {\n if (key.toLowerCase() == name) {\n return headers[key];\n }\n }\n\n return null;\n }\n\n /**\n * Loosely checks if the specified body is a FormData instance.\n */\n private isFormData(body: any): boolean {\n return (\n body &&\n // we are checking the constructor name because FormData\n // is not available natively in some environments and the\n // polyfill(s) may not be globally accessible\n (body.constructor.name === \"FormData\" ||\n // fallback to global FormData instance check\n // note: this is needed because the constructor.name could be different in case of\n // custom global FormData implementation, eg. React Native on Android/iOS\n (typeof FormData !== \"undefined\" && body instanceof FormData))\n );\n }\n\n /**\n * Serializes the provided query parameters into a query string.\n */\n private serializeQueryParams(params: { [key: string]: any }): string {\n const result: Array<string> = [];\n for (const key in params) {\n if (params[key] === null) {\n // skip null query params\n continue;\n }\n\n const value = params[key];\n const encodedKey = encodeURIComponent(key);\n\n if (Array.isArray(value)) {\n // repeat array params\n for (const v of value) {\n result.push(encodedKey + \"=\" + encodeURIComponent(v));\n }\n } else if (value instanceof Date) {\n result.push(encodedKey + \"=\" + encodeURIComponent(value.toISOString()));\n } else if (typeof value !== null && typeof value === \"object\") {\n result.push(encodedKey + \"=\" + encodeURIComponent(JSON.stringify(value)));\n } else {\n result.push(encodedKey + \"=\" + encodeURIComponent(value));\n }\n }\n\n return result.join(\"&\");\n }\n}\n","import axios from \"axios\";\nimport { API_BASE_URL, AUTH_BASE_URL, STATIC_BUCKET_URL } from \"../constants/genricConstants\";\nimport { pocketBaseInstance, userData } from \"./Auth\";\n\nfunction uuidv4() {\n return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, (c) => (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16));\n}\nfunction getUid() {\n return localStorage.getItem(\"uid\");\n}\nasync function setUid() {\n let uid = null;\n try {\n let uidData = await axios.get(`${API_BASE_URL}/auth/uid/set`);\n uid = uidData.data?.anonUid || uuidv4();\n } catch (error) {\n uid = uuidv4();\n }\n localStorage.setItem(\"uid\", uid);\n}\nfunction getOrSetUid() {\n if (getUid()) {\n return getUid();\n }\n setUid();\n return getUid();\n}\n\nfunction getUserAvatar(userDataModel = null) {\n userDataModel = userDataModel || userData().model;\n return userDataModel?.avatar ? `${AUTH_BASE_URL}/api/files/_pb_users_auth_/${userDataModel.id}/${userDataModel.avatar}` : `${STATIC_BUCKET_URL}/killua.jpg`;\n}\n\nasync function findPocketBaseUserByUserName(username) {\n const pb = pocketBaseInstance();\n try {\n const proxyData = await pb.collection(\"users_view\").getFirstListItem(`username?=\"${username}\"`);\n return proxyData || {};\n } catch {\n return {};\n }\n}\n\nexport { getOrSetUid, uuidv4, getUserAvatar, findPocketBaseUserByUserName };\n","import PocketBase from \"pocketbase\";\nimport { AUTH_BASE_URL } from \"../constants/genricConstants\";\nimport { getOrSetUid } from \"./User\";\n\nconst pocketBaseInstance = () => {\n return new PocketBase(AUTH_BASE_URL);\n};\n\nconst signIn = async (username, password) => {\n const pb = pocketBaseInstance();\n try {\n await pb.collection(\"users\").authWithPassword(username, password);\n return true;\n } catch (e) {\n return false;\n }\n};\n\nconst signUp = async (username, email, password, inviteCode) => {\n const pb = pocketBaseInstance();\n try {\n const userData = {\n username: username,\n email: email,\n emailVisibility: false,\n password: password,\n passwordConfirm: password,\n name: username,\n anon_uid: getOrSetUid(),\n roles: \"member\",\n invite_code: inviteCode,\n };\n await pb.collection(\"users\").create(userData);\n await signIn(username, password);\n return { success: true, err: {} };\n } catch (e) {\n return { success: false, err: e.data.data };\n }\n};\n\nconst refreshLogin = async () => {\n const pb = pocketBaseInstance();\n try {\n await pb.collection(\"users\").authRefresh();\n return true;\n } catch (e) {\n return false;\n }\n};\n\nconst resetPassword = async (email) => {\n const pb = pocketBaseInstance();\n try {\n await pb.collection(\"users\").requestPasswordReset(email);\n return true;\n } catch (e) {\n return false;\n }\n};\n\nconst userData = () => {\n const pb = pocketBaseInstance();\n return pb.authStore;\n};\n\nconst signOut = async () => {\n const pb = pocketBaseInstance();\n pb.authStore.clear();\n};\n\nconst preprocessAuthErrors = (err) => {\n for (const errKey in err) {\n if (errKey === \"invite_code\")\n if (err[errKey].code === \"validation_not_unique\") {\n err[errKey].message = \"The invite code has already been used\";\n } else if (err[errKey].code === \"validation_missing_rel_records\") {\n err[errKey].message = \"The invite code is invalid. Join our discord from the link below to get an invite code!\";\n }\n }\n return err;\n};\n\nconst getUidForLoggedInUser = () => {\n return userData()?.model?.anon_uid;\n};\nconst getIdForLoggedInUser = () => {\n return userData()?.model?.id;\n};\n\nexport { signIn, signUp, refreshLogin, userData, signOut, preprocessAuthErrors, resetPassword, getUidForLoggedInUser, pocketBaseInstance, getIdForLoggedInUser };\n","import axios from \"axios\";\nimport { API_BASE_URL_V2 } from \"../constants/genricConstants\";\n\nconst cacheResults = new Map();\n\n/**\n * Executes graphql query and returns data.\n * Caches data once queried and returns from cache for subsquent queries\n * @param {*} grapqlQueryObj {query, operationName}\n * @param {*} variables {}\n * @param {int} ttl time in minutes\n * @returns\n */\nconst execGraphqlQuery = async (grapqlQueryObj, variables = {}, ttl = 60) => {\n const cacheKey = { operationName: grapqlQueryObj.operationName, variables: Object.values(variables).join(\"|\") };\n if (!cacheResults.has(cacheKey) || cacheResults.get(cacheKey).ttl < Date.now() / 1000) {\n const fetchedData = await axios.post(grapqlQueryObj.endpoint || API_BASE_URL_V2, { variables, ...grapqlQueryObj });\n cacheResults.set(cacheKey, { fetchedData, ttl: Date.now() / 1000 + ttl * 60 });\n }\n return cacheResults.get(cacheKey).fetchedData;\n};\nexport { execGraphqlQuery };\n","// import { gql } from \"@apollo/client\";\n\nimport { NOTIFICATION_BASE_URL_V2 } from \"../constants/genricConstants\";\n\nconst CatalogQuery = `\n query CatalogQuery(\n $page: Int\n $pageSize: Int\n $name: String\n $type: String\n $source: String\n $status: String\n $rating: String\n $season: String\n $scoremin: Float\n $scoremax: Float\n $genres: String\n $notdub: Boolean\n $sortby: String\n $sortorder: String\n ) {\n Page(page: $page, pageSize: $pageSize) {\n media(name: $name, type: $type, source: $source, status: $status, rating: $rating, season: $season, scoremin: $scoremin, scoremax: $scoremax, genres: $genres, notdub: $notdub, sortby: $sortby, sortorder: $sortorder) {\n slug\n images {\n jpg {\n image_url\n large_image_url\n small_image_url\n }\n webp {\n image_url\n large_image_url\n small_image_url\n }\n png {\n image_url\n large_image_url\n small_image_url\n }\n }\n titles {\n title\n type\n }\n genres {\n mal_id\n name\n type\n url\n }\n type\n }\n pageInfo {\n currentPage\n hasNextPage\n perPage\n lastPage\n total\n }\n }\n }\n`;\n\nconst CatalogQueryObj = {\n query: CatalogQuery,\n operationName: \"CatalogQuery\",\n};\n\nconst WatchListQuery = `\n query WatchListPageQuery(\n $userId: String\n $watchlistType: Float\n $page: Int\n $pageSize: Int\n ) {\n WatchListPage(page: $page, pageSize: $pageSize) {\n media(userId: $userId, watchlistType: $watchlistType) {\n slug\n images {\n jpg {\n image_url\n large_image_url\n small_image_url\n }\n webp {\n image_url\n large_image_url\n small_image_url\n }\n png {\n image_url\n large_image_url\n small_image_url\n }\n }\n titles {\n title\n type\n }\n genres {\n mal_id\n name\n type\n url\n }\n type\n watchlistType\n releasedEpisodes\n hasNewEpisode\n }\n pageInfo {\n total\n perPage\n currentPage\n lastPage\n hasNextPage\n }\n }\n }\n`;\n\nconst WatchListQueryObj = {\n query: WatchListQuery,\n operationName: \"WatchListPageQuery\",\n};\n\nconst WatchListEditTypeMutation = `\n mutation WatchListEditTypeMutation($userId: String, $watchlistType: Float, $slugId: String) {\n UpdateWatchListMediaType(\n userId: $userId\n watchlistType: $watchlistType\n slugId: $slugId\n )\n }\n`;\n\nconst WatchListEditTypeMutationObj = {\n query: WatchListEditTypeMutation,\n operationName: \"WatchListEditTypeMutation\",\n};\n\nconst PopularQuery = `\n query PopularQuery($page: Int) {\n Popular(page: $page) {\n slug\n images {\n jpg {\n image_url\n large_image_url\n small_image_url\n }\n webp {\n image_url\n large_image_url\n small_image_url\n }\n png {\n image_url\n large_image_url\n small_image_url\n }\n }\n titles {\n title\n type\n }\n genres {\n mal_id\n name\n type\n url\n }\n type\n aired {\n string\n }\n bannerImage\n trailer {\n deliveryUrl\n }\n tmdbData {\n backdrops {\n file_path\n }\n logos {\n file_path\n }\n }\n synopsis\n }\n }\n`;\n\nconst PopularQueryObject = {\n query: PopularQuery,\n operationName: \"PopularQuery\",\n};\n\nconst RecentQuery = `\n query RecentQuery($page: Int) {\n Recent(page: $page) {\n slug\n images {\n jpg {\n image_url\n large_image_url\n small_image_url\n }\n webp {\n image_url\n large_image_url\n small_image_url\n }\n png {\n image_url\n large_image_url\n small_image_url\n }\n }\n titles {\n title\n type\n }\n genres {\n mal_id\n name\n type\n url\n }\n type\n currentReleasedEpisode\n }\n }\n`;\n\nconst RecentQueryObject = {\n query: RecentQuery,\n operationName: \"RecentQuery\",\n};\n\nconst ScheduleQuery = `\n query ScheduleQuery {\n Schedule {\n slug\n time\n titles {\n title\n type\n }\n }\n }\n`;\n\nconst ScheduleQueryObject = {\n query: ScheduleQuery,\n operationName: \"ScheduleQuery\",\n};\n\nconst MergeQuery = `\n query MergeQuery($page: Int) {\n Popular(page: $page) {\n slug,\n images {\n jpg {\n image_url\n large_image_url\n small_image_url\n }\n png {\n image_url\n large_image_url\n small_image_url\n }\n webp {\n image_url\n large_image_url\n small_image_url\n }\n }\n titles {\n title\n type\n }\n genres {\n mal_id\n name\n type\n url\n }\n type\n aired {\n string\n }\n bannerImage\n trailer {\n deliveryUrl\n }\n tmdbData {\n backdrops {\n file_path\n }\n logos {\n file_path\n }\n }\n synopsis\n score\n }\n Recent(page: $page) {\n slug\n images {\n jpg {\n image_url\n large_image_url\n small_image_url\n }\n png {\n image_url\n large_image_url\n small_image_url\n }\n webp {\n image_url\n large_image_url\n small_image_url\n }\n }\n titles {\n title\n type\n }\n genres {\n mal_id\n name\n type\n url\n }\n type\n currentReleasedEpisode\n }\n Schedule {\n slug\n time\n titles {\n title\n type\n }\n }\n }\n`;\n\nconst MergeQueryObject = {\n query: MergeQuery,\n operationName: \"MergeQuery\",\n};\n\nconst SearchQuery = `\n query SearchQuery($page: Int, $pageSize: Int, $name: String) {\n Page(page: $page, pageSize: $pageSize) {\n media(name: $name) {\n slug\n synopsis\n images {\n jpg {\n image_url\n medium_image_url\n large_image_url\n }\n webp {\n image_url\n medium_image_url\n large_image_url\n }\n png {\n image_url\n medium_image_url\n large_image_url\n }\n }\n titles {\n title\n type\n }\n }\n }\n }\n`;\n\nconst SearchQueryObject = {\n query: SearchQuery,\n operationName: \"SearchQuery\",\n};\n\nconst AnimeQuery = `\n query AnimeQuery($page: Int, $pageSize: Int, $slug: String) {\n Page(page: $page, pageSize: $pageSize) {\n media(slug: $slug) {\n slug\n synopsis\n malId\n aniId\n duration\n score\n aired {\n string\n }\n status\n genres {\n name\n }\n studios {\n name\n }\n episodes\n images {\n jpg {\n image_url\n medium_image_url\n large_image_url\n }\n webp {\n image_url\n medium_image_url\n large_image_url\n }\n png {\n image_url\n medium_image_url\n large_image_url\n }\n }\n titles {\n title\n type\n }\n relations {\n entry {\n slug\n images {\n jpg {\n image_url\n large_image_url\n small_image_url\n }\n webp {\n image_url\n large_image_url\n small_image_url\n }\n png {\n image_url\n large_image_url\n small_image_url\n }\n }\n titles {\n title\n type\n }\n genres {\n name\n }\n }\n }\n hasDub\n }\n }\n }\n`;\n\nconst AnimeQueryObject = {\n query: AnimeQuery,\n operationName: \"AnimeQuery\",\n};\n\nconst NotificationQuery = `\n query NotificationQuery(\n $page: Int\n $pageSize: Int\n $userId: String\n $includeDissmissed: Boolean\n $excludeAnnouncements: Boolean\n ) {\n Page(page: $page, pageSize: $pageSize) {\n notifications(\n userId: $userId\n includeDissmissed: $includeDissmissed\n excludeAnnouncements: $excludeAnnouncements\n ) {\n createdAt\n episode_number\n epnotifid\n is_notif_dissmissed\n is_notif_read\n notif_type\n sender\n slug_id\n userid\n usernotifstatusid\n announcenotifid\n title\n expireAt\n message\n media {\n images {\n jpg {\n image_url\n medium_image_url\n large_image_url\n }\n png {\n image_url\n medium_image_url\n large_image_url\n }\n webp {\n image_url\n medium_image_url\n large_image_url\n }\n }\n titles {\n title\n type\n }\n }\n }\n pageInfo {\n total\n perPage\n currentPage\n lastPage\n hasNextPage\n }\n }\n }\n`;\n\nconst NotificationQueryObject = {\n query: NotificationQuery,\n operationName: \"NotificationQuery\",\n endpoint: NOTIFICATION_BASE_URL_V2,\n};\n\nconst WatchListMalImportMutation = `\n mutation WatchListMalImportMutation($userId: String, $malUserName: String, $clearWatchList: Boolean) {\n ImportMalWatchlistData(\n userId: $userId\n malUserName: $malUserName\n clearWatchList: $clearWatchList\n )\n }\n`;\n\nconst WatchListMalImportMutationObj = {\n query: WatchListMalImportMutation,\n operationName: \"WatchListMalImportMutation\",\n};\n\nconst LastWatchedDataUpdateMutation = `\n mutation LastWatchedDataUpdate($userId: String, $slug: String, $episodeNumber: Int, $shouldDelete: Boolean) {\n LastWatchedDataUpdate(userId: $userId, slug: $slug, episodeNumber: $episodeNumber, shouldDelete: $shouldDelete)\n }\n`;\n\nconst LastWatchedDataUpdateMutationObj = {\n query: LastWatchedDataUpdateMutation,\n operationName: \"LastWatchedDataUpdate\",\n};\n\nconst WatchHistoryDataUpdateMutation = `\n mutation WatchHistoryDataUpdate($userId: String, $slug: String, $episodeNumber: Int, $playBackData: JSON) {\n WatchHistoryDataUpdate(userId: $userId, slug: $slug, episodeNumber: $episodeNumber, playBackData: $playBackData)\n }\n`;\n\nconst WatchHistoryDataUpdateMutationObj = {\n query: WatchHistoryDataUpdateMutation,\n operationName: \"WatchHistoryDataUpdate\",\n};\n\nconst LastWatchedPageQuery = `\n query LastWatchedPage($page: Int, $pageSize: Int, $userId: String) {\n LastWatchedPage(page: $page, pageSize: $pageSize) {\n media(userId: $userId) {\n media {\n slug\n images {\n jpg {\n image_url\n large_image_url\n small_image_url\n }\n png {\n image_url\n large_image_url\n small_image_url\n }\n webp {\n image_url\n large_image_url\n small_image_url\n }\n }\n titles {\n title\n type\n }\n genres {\n mal_id\n name\n type\n url\n }\n type\n currentReleasedEpisode\n }\n playBackData {\n duration,\n playBackTime\n }\n }\n pageInfo {\n currentPage,\n hasNextPage\n lastPage\n perPage\n total\n }\n }\n }\n`;\n\nconst LastWatchedPageQueryObject = {\n query: LastWatchedPageQuery,\n operationName: \"LastWatchedPage\",\n};\n\nconst WatchHistoryQuery = `\n query WatchHistory($userId: String, $slug: String, $episodeNumber: Int) {\n WatchHistory(userId: $userId, slug: $slug, episodeNumber: $episodeNumber) {\n duration\n playBackTime\n episodeNumber\n }\n }\n`;\n\nconst WatchHistoryQueryObject = {\n query: WatchHistoryQuery,\n operationName: \"WatchHistory\",\n};\n\nconst UserProfileQuery = `\n query UserProfile($username: String) {\n UserProfile(username: $username) {\n etherCount\n latestActivityList\n userData {\n id\n avatar\n bio\n created\n name\n roles\n username\n verified\n }\n watchStatistics {\n totalEpisodeWatchedCount\n totalDuration\n totalAnimeWatchedCount\n }\n watchList {\n media {\n slug\n images {\n jpg {\n image_url\n large_image_url\n small_image_url\n }\n webp {\n image_url\n large_image_url\n small_image_url\n }\n png {\n image_url\n large_image_url\n small_image_url\n }\n }\n titles {\n title\n type\n }\n genres {\n mal_id\n name\n type\n url\n }\n type\n watchlistType\n releasedEpisodes\n }\n }\n }\n }\n`;\n\nconst UserProfileQueryObject = {\n query: UserProfileQuery,\n operationName: \"UserProfile\",\n};\n\nexport {\n CatalogQueryObj,\n WatchListQueryObj,\n PopularQueryObject,\n RecentQueryObject,\n ScheduleQueryObject,\n MergeQueryObject,\n SearchQueryObject,\n AnimeQueryObject,\n NotificationQueryObject,\n WatchListEditTypeMutationObj,\n WatchListMalImportMutationObj,\n LastWatchedDataUpdateMutationObj,\n WatchHistoryDataUpdateMutationObj,\n LastWatchedPageQueryObject,\n WatchHistoryQueryObject,\n UserProfileQueryObject,\n};\n","import axios from \"axios\";\nimport { NOTIFICATION_BASE_URL, STATIC_BUCKET_URL } from \"../constants/genricConstants\";\nimport { getAnimeTitleByRelevance, getImageByRelevance } from \"./AnimeData\";\nimport { getUidForLoggedInUser } from \"./Auth\";\nimport { execGraphqlQuery } from \"../graphql/graphqlQueryExec\";\nimport { NotificationQueryObject } from \"../graphql/graphqlQueries\";\n\nconst getUserNotifications = async (queryObj = {}, includePageInfo = false) => {\n const fetchedNotificationData = await execGraphqlQuery(NotificationQueryObject, {\n userId: getUidForLoggedInUser(),\n page: queryObj.page || 1,\n pageSize: queryObj.pageSize || 5,\n includeDissmissed: queryObj.includeDissmissed || false,\n excludeAnnouncements: queryObj.excludeAnnouncements || false,\n });\n\n return includePageInfo ? { fetchedNotificationData: fetchedNotificationData.data.data.Page.notifications, fetchedNotificationDataPageInfo: fetchedNotificationData.data.data.Page.pageInfo } : fetchedNotificationData.data.data.Page.notifications;\n};\n\nconst getNotificationPreviewImageFromNotificationData = (notificationData) => {\n switch (notificationData.notif_type) {\n case 1:\n return getImageByRelevance(notificationData.media.images);\n default:\n return `${STATIC_BUCKET_URL}/android_chrome_512x512_VzVtfe3JYt.png`;\n }\n};\nconst subscribeToEpisodeNotification = async (slug) => {\n try {\n await axios.post(`${NOTIFICATION_BASE_URL}/notifications/subscribe`, {\n slug: slug,\n userId: getUidForLoggedInUser(),\n });\n return true;\n } catch (e) {\n return false;\n }\n};\nconst unSubscribeToEpisodeNotification = async (slug) => {\n try {\n await axios.post(`${NOTIFICATION_BASE_URL}/notifications/unsubscribe`, {\n slug: slug,\n userId: getUidForLoggedInUser(),\n });\n return true;\n } catch (e) {\n return false;\n }\n};\nconst handleNotificationClick = (notificationData, navigate) => {\n switch (notificationData.notif_type) {\n case 1:\n navigate(`/anime/${notificationData.slug_id}/episode/${notificationData.episode_number}`);\n break;\n\n default:\n break;\n }\n};\nconst generateNotificationCss = (notificationData) => {\n switch (notificationData.notif_type) {\n case 1:\n return { cursor: \"pointer\" };\n\n default:\n break;\n }\n};\nconst dismissNotification = async (notificatonId) => {\n try {\n await axios.post(`${NOTIFICATION_BASE_URL}/notifications/dismiss`, {\n notificatonId: notificatonId,\n userId: getUidForLoggedInUser(),\n });\n return true;\n } catch (e) {\n return false;\n }\n};\n\nconst getNotificationTitleFromNotificationData = (notificationData, language = \"Default\") => {\n switch (notificationData.notif_type) {\n case 0:\n return notificationData.title;\n case 1:\n return `Episode ${notificationData.episode_number} of ${getAnimeTitleByRelevance(notificationData.media.titles, notificationData.slug_id.includes(\"dub\"), language)} is out now.`;\n default:\n return \"Well this isnt expected\";\n }\n};\n\nexport {\n getUserNotifications,\n getNotificationPreviewImageFromNotificationData,\n subscribeToEpisodeNotification,\n unSubscribeToEpisodeNotification,\n handleNotificationClick,\n generateNotificationCss,\n dismissNotification,\n getNotificationTitleFromNotificationData,\n};\n","import { execGraphqlQuery } from \"../graphql/graphqlQueryExec\";\nimport { WatchListQueryObj } from \"../graphql/graphqlQueries\";\n\nconst fetchWatchListData = async (userId, page = 1, pageSize = 20, watchlistType = 1) => {\n const fetchedWatchListData = await execGraphqlQuery(WatchListQueryObj, { userId, page, pageSize, watchlistType });\n return { fetchedWatchListData: fetchedWatchListData.data.data.WatchListPage.media, fetchedWatchListDataPageInfo: fetchedWatchListData.data.data.WatchListPage.pageInfo };\n};\nexport { fetchWatchListData };\n","import { create } from \"zustand\";\nimport { subscribeToEpisodeNotification, unSubscribeToEpisodeNotification } from \"../custom/Notifications\";\nimport { showGenericCheckBoxNotification } from \"../custom/Notification\";\nimport { getAnimeTitleByRelevance } from \"../custom/AnimeData\";\nimport { getUidForLoggedInUser } from \"../custom/Auth\";\nimport { fetchWatchListData } from \"../custom/WatchList\";\n\nconst useWatchListStore = create((set, get) => ({\n watchListData: [],\n watchListDataPaginated: {\n fetchedWatchListData: [],\n fetchedWatchListDataPageInfo: {},\n },\n\n setWatchListData: (animeData) => {\n set((state) => {\n let watchListData = state.watchListData;\n if (animeData.currentReleasedEpisode) {\n delete animeData.currentReleasedEpisode;\n }\n if (animeData.playbackPercent) {\n delete animeData.playbackPercent;\n }\n watchListData = watchListData.filter((anime) => anime.slug !== animeData.slug);\n watchListData.push(animeData);\n return { watchListData };\n });\n },\n\n deleteFromWatchListBySlug: (slug) => {\n set((state) => {\n let watchListData = state.watchListData;\n watchListData = watchListData.filter((anime) => anime.slug !== slug);\n return { watchListData };\n });\n },\n\n fetchWatchListData: async () => {\n const { fetchedWatchListData } = await fetchWatchListData(getUidForLoggedInUser());\n set({ watchListData: fetchedWatchListData });\n },\n\n fetchWatchListDataPaginated: async (page = 1, pageSize = 20, watchlistType = 0) => {\n const { fetchedWatchListData, fetchedWatchListDataPageInfo } = await fetchWatchListData(getUidForLoggedInUser(), page, pageSize, watchlistType);\n\n set(() => ({\n watchListDataPaginated: { fetchedWatchListData, fetchedWatchListDataPageInfo },\n }));\n return { fetchedWatchListData, fetchedWatchListDataPageInfo };\n },\n\n handleWatchListAdd: async (selectedAnimeData) => {\n await subscribeToEpisodeNotification(selectedAnimeData.slug);\n get().setWatchListData(selectedAnimeData);\n showGenericCheckBoxNotification(\"Added to watchlist!\", `${getAnimeTitleByRelevance(selectedAnimeData.titles)} has been added to watchlist!`);\n },\n\n handleWatchListDelete: async (selectedAnimeData) => {\n await unSubscribeToEpisodeNotification(selectedAnimeData.slug);\n get().deleteFromWatchListBySlug(selectedAnimeData.slug);\n showGenericCheckBoxNotification(\"Removed from watchlist!\", `${getAnimeTitleByRelevance(selectedAnimeData.titles)} has been removed to watchlist!`);\n },\n}));\n\nexport { useWatchListStore };\n","import { createStyles, MantineTheme } from '@mantine/styles';\nimport type { TitleSize } from './Title';\n\ntype HeadingElement = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n\nexport interface TitleStylesParams {\n element: HeadingElement;\n size: TitleSize;\n weight: React.CSSProperties['fontWeight'];\n inline: boolean;\n}\n\nfunction getFontSize(size: TitleSize, element: HeadingElement, theme: MantineTheme) {\n if (typeof size !== 'undefined') {\n return size in theme.headings.sizes ? theme.headings.sizes[size].fontSize : size;\n }\n\n return theme.headings.sizes[element].fontSize;\n}\n\nfunction getLineHeight(size: TitleSize, element: HeadingElement, theme: MantineTheme) {\n if (typeof size !== 'undefined' && size in theme.headings.sizes) {\n return theme.headings.sizes[size].lineHeight;\n }\n\n return theme.headings.sizes[element].lineHeight;\n}\n\nexport default createStyles((theme, { element, weight, size, inline }: TitleStylesParams) => ({\n root: {\n ...theme.fn.fontStyles(),\n fontFamily: theme.headings.fontFamily,\n fontWeight: weight || theme.headings.sizes[element].fontWeight || theme.headings.fontWeight,\n fontSize: getFontSize(size, element, theme),\n lineHeight: inline ? 1 : getLineHeight(size, element, theme),\n margin: 0,\n },\n}));\n","import React, { forwardRef } from 'react';\nimport { DefaultProps, useComponentDefaultProps } from '@mantine/styles';\nimport { Text, TextProps } from '../Text';\nimport useStyles, { TitleStylesParams } from './Title.styles';\n\nexport type TitleOrder = 1 | 2 | 3 | 4 | 5 | 6;\nexport type TitleSize = `h${TitleOrder}` | React.CSSProperties['fontSize'];\n\nexport interface TitleProps\n extends Omit<TextProps, 'size' | 'styles' | 'classNames' | 'span'>,\n DefaultProps<never, TitleStylesParams>,\n Omit<React.ComponentPropsWithoutRef<'h1'>, 'color'> {\n /** Defines component and styles which will be used */\n order?: TitleOrder;\n\n /** Title font-size: h1-h6 or any valid CSS font-size value */\n size?: TitleSize;\n}\n\nconst defaultProps: Partial<TitleProps> = {\n order: 1,\n};\n\nexport const Title = forwardRef<HTMLHeadingElement, TitleProps>((props, ref) => {\n const { className, order, children, unstyled, size, weight, inline, ...others } =\n useComponentDefaultProps('Title', defaultProps, props);\n\n const { classes, cx } = useStyles(\n { element: `h${order}`, weight, size, inline },\n { name: 'Title', unstyled }\n );\n\n if (![1, 2, 3, 4, 5, 6].includes(order)) {\n return null;\n }\n\n return (\n <Text component={`h${order}`} ref={ref} className={cx(classes.root, className)} {...others}>\n {children}\n </Text>\n );\n});\n\nTitle.displayName = '@mantine/core/Title';\n","import createReactComponent from '../createReactComponent';\nexport default createReactComponent('outline', 'alert-triangle', 'IconAlertTriangle', [[\"path\",{\"d\":\"M12 9v4\",\"key\":\"svg-0\"}],[\"path\",{\"d\":\"M10.363 3.591l-8.106 13.534a1.914 1.914 0 0 0 1.636 2.871h16.214a1.914 1.914 0 0 0 1.636 -2.87l-8.106 -13.536a1.914 1.914 0 0 0 -3.274 0z\",\"key\":\"svg-1\"}],[\"path\",{\"d\":\"M12 16h.01\",\"key\":\"svg-2\"}]]);","import { closeAllModals, openConfirmModal } from \"@mantine/modals\";\nimport { LastWatchedDataUpdateMutationObj, LastWatchedPageQueryObject, WatchHistoryDataUpdateMutationObj, WatchHistoryQueryObject } from \"../graphql/graphqlQueries\";\nimport { execGraphqlQuery } from \"../graphql/graphqlQueryExec\";\nimport { getIdForLoggedInUser } from \"./Auth\";\nimport { Group, Paper, Text, Title } from \"@mantine/core\";\nimport { IconAlertTriangle } from \"@tabler/icons-react\";\nimport { showGenericCheckBoxNotification } from \"./Notification\";\n\nfunction syncWatchHistory(slug, episodeNumber, playBackData, userId = null) {\n return new Promise((resolve, reject) => {\n execGraphqlQuery(\n WatchHistoryDataUpdateMutationObj,\n {\n userId: userId || getIdForLoggedInUser(),\n slug: slug,\n episodeNumber: parseInt(episodeNumber),\n playBackData: playBackData,\n },\n 0\n )\n .then((res) => {\n resolve(res);\n })\n .catch((err) => reject(err));\n });\n}\n\nfunction syncWatchHistoryBulk() {\n const watchHistoryData = localStorage.getItem(\"watchHistory\");\n if (watchHistoryData) {\n const watchHistoryJsonData = JSON.parse(watchHistoryData);\n for (const anime of Object.keys(watchHistoryJsonData)) {\n for (const episode of Object.keys(watchHistoryJsonData[anime].watchedEpisodes)) {\n syncWatchHistory(anime, episode, watchHistoryJsonData[anime][\"watchedEpisodes\"][episode]);\n }\n }\n }\n localStorage.setItem(\"watchHistory_bkp\", watchHistoryData);\n localStorage.removeItem(\"watchHistory\");\n}\n\nfunction syncLastWatched(slug, episodeNumber, userId = null) {\n return new Promise((resolve, reject) => {\n execGraphqlQuery(\n LastWatchedDataUpdateMutationObj,\n {\n userId: userId || getIdForLoggedInUser(),\n slug: slug,\n episodeNumber: parseInt(episodeNumber),\n shouldDelete: false,\n },\n 0\n )\n .then((res) => {\n resolve(res);\n })\n .catch((err) => reject(err));\n });\n}\n\nfunction getLastWatched(page = 1, pageSize = 20, userId = null) {\n return new Promise((resolve, reject) =>\n execGraphqlQuery(\n LastWatchedPageQueryObject,\n {\n userId: userId || getIdForLoggedInUser(),\n page: page,\n pageSize: pageSize,\n },\n 0\n )\n .then((res) => {\n resolve(res.data.data.LastWatchedPage.media.map((y) => ({ ...y.media, playbackPercent: (y.playBackData.playBackTime / y.playBackData.duration) * 100 || 0, playBackData: y.playBackData })));\n })\n .catch((err) => reject(err))\n );\n}\n\nfunction removeLastWatched(slug, userId = null) {\n return new Promise((resolve, reject) =>\n execGraphqlQuery(\n LastWatchedDataUpdateMutationObj,\n {\n userId: userId || getIdForLoggedInUser(),\n slug: slug,\n episodeNumber: 0,\n shouldDelete: true,\n },\n 0\n )\n .then((res) => {\n resolve(res);\n })\n .catch((err) => reject(err))\n );\n}\n\nfunction getWatchHistory(slug, userId = null) {\n return new Promise((resolve, reject) =>\n execGraphqlQuery(\n WatchHistoryQueryObject,\n {\n userId: userId || getIdForLoggedInUser(),\n slug: slug,\n },\n 0\n )\n .then((res) => {\n resolve(\n res.data.data.WatchHistory?.reduce((acc, curr) => {\n acc[curr.episodeNumber] = {\n duration: curr.duration,\n playBackTime: curr.playBackTime,\n };\n return acc;\n }, {}) || {}\n );\n })\n .catch((err) => reject(err))\n );\n}\n\nconst openCloudSyncModal = (setCloudSyncModalOpen, setCloudSyncModalText, cloudSyncPersentage, setCloudSyncPersentage, fromBtn = false) => {\n const lastWatchedData = localStorage.getItem(\"lastWatchedQueue\");\n const watchHistoryData = localStorage.getItem(\"watchHistory\");\n if (lastWatchedData || watchHistoryData) {\n openConfirmModal({\n title: \"Cloud Sync\",\n closeOnConfirm: true,\n closeOnCancel: false,\n closeOnClickOutside: false,\n labels: { confirm: \"Start sync\", cancel: \"Dont Sync\" },\n children: (\n <Group>\n <Text size=\"md\">Hi, we have detected that you have not synced your watch history. Please click on the button below to sync your watch history. </Text>\n </Group>\n ),\n cancelProps: { sx: { backgroundColor: \"red !important\" } },\n centered: true,\n onConfirm: async () => {\n setCloudSyncModalOpen(true);\n if (lastWatchedData) {\n setCloudSyncModalText(\"Starting last watched sync...\");\n await new Promise((resolve) => setTimeout(resolve, 1000));\n const lastWatchedQueue = JSON.parse(lastWatchedData);\n lastWatchedQueue.reverse();\n for (const [ind, ele] of lastWatchedQueue.entries()) {\n try {\n await syncLastWatched(ele.slug, ele.episodeNumber);\n } finally {\n const newPercentage = cloudSyncPersentage + parseInt((ind / (lastWatchedQueue.length - 1)) * 100);\n setCloudSyncModalText(`Successfully synced ${ele.slug} from last watched`);\n setCloudSyncPersentage(newPercentage);\n }\n }\n localStorage.setItem(\"lastWatchedQueue_bkp\", lastWatchedData);\n localStorage.removeItem(\"lastWatchedQueue\");\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n\n if (watchHistoryData) {\n setCloudSyncPersentage(0);\n setCloudSyncModalText(\"Starting watched history sync...\");\n await new Promise((resolve) => setTimeout(resolve, 1000));\n const watchHistoryJsonData = JSON.parse(watchHistoryData);\n for (const [ind, anime] of Object.keys(watchHistoryJsonData).entries()) {\n const promiseArray = [];\n for (const episode of Object.keys(watchHistoryJsonData[anime].watchedEpisodes)) {\n promiseArray.push(syncWatchHistory(anime, episode, watchHistoryJsonData[anime][\"watchedEpisodes\"][episode]));\n }\n await Promise.allSettled(promiseArray);\n const newPercentage = cloudSyncPersentage + parseInt((ind / (Object.keys(watchHistoryJsonData).length - 1)) * 100);\n setCloudSyncModalText(`Successfully synced ${watchHistoryJsonData[anime][\"animeData\"].slug} from watch history`);\n setCloudSyncPersentage(newPercentage);\n }\n localStorage.setItem(\"watchHistory_bkp\", watchHistoryData);\n localStorage.removeItem(\"watchHistory\");\n }\n\n setCloudSyncModalText(\"Sync completed. This page will refresh in 2 seconds...\");\n await new Promise((resolve) => setTimeout(resolve, 2000));\n setCloudSyncModalOpen(false);\n window.location.reload();\n },\n onCancel: () => {\n openConfirmModal({\n title: \"Cloud Sync\",\n labels: { confirm: \"Dont Sync\", cancel: \"Go Back\" },\n children: (\n <Group sx={{ gap: \"8px\" }}>\n <Group display={\"flex\"} sx={{ alignItems: \"center\", gap: \"5px\" }}>\n <Paper display={\"flex\"} sx={{ transform: \"translateY(2px)\" }}>\n <IconAlertTriangle size={24} stroke={1.5} color=\"yellow\" />\n </Paper>\n <Title order={3}>Warning\n \n If you dont sync your watch history they wont show up in home page anymore. You will be able to sync them anytime from side bar menu.\n \n ),\n confirmProps: { sx: { backgroundColor: \"red !important\" } },\n centered: true,\n onConfirm: () => {\n localStorage.setItem(\"doNotSync\", \"1\");\n closeAllModals();\n },\n });\n },\n });\n } else {\n if (fromBtn) {\n showGenericCheckBoxNotification(\"Cloud Sync\", \"Your data is already synced.\");\n }\n }\n};\n\nexport { syncWatchHistory, syncLastWatched, syncWatchHistoryBulk, getLastWatched, removeLastWatched, getWatchHistory, openCloudSyncModal };\n","import React from \"react\";\nimport { createStyles, Paper, Text, Group, Anchor, Tooltip, Transition } from \"@mantine/core\";\nimport { Link } from \"react-router-dom\";\nimport { WATCHANIME_RED } from \"../constants/cssConstants\";\nimport { getAnimeTitleByRelevance, getImageByRelevance, toTitleCase } from \"../custom/AnimeData\";\nimport { IconPlus, IconTrash } from \"@tabler/icons-react\";\nimport { openConfirmModal } from \"@mantine/modals\";\nimport { showGenericCheckBoxNotification } from \"../custom/Notification\";\nimport { useLanguageStore } from \"../store/LanguageToggleStore\";\nimport { useShallow } from \"zustand/react/shallow\";\nimport { useWatchListStore } from \"../store/WatchListStore\";\nimport { getLastWatched, removeLastWatched } from \"../custom/CloudSync\";\nimport { useDisclosure } from \"@mantine/hooks\";\n\nconst useStyles = createStyles((theme) => ({\n card: {\n height: 260,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n backgroundSize: \"cover\",\n backgroundPosition: \"center\",\n justifyContent: \"flex-end\",\n padding: \"10px\",\n width: \"200px\",\n marginTop: \"10px\",\n [theme.fn.smallerThan(\"md\")]: {\n width: \"150px\",\n },\n },\n backGroundFilter: {\n width: \"100%\",\n height: \"100%\",\n transform: \"translate(0%, -100%)\",\n borderRadius: \"7px\",\n background: \"linear-gradient(180deg, rgba(255, 255, 255, 0) 0%, rgba(0, 0, 0, 0.42) 51.04%, rgba(0, 0, 0, 0.94) 79.17%, #000000 100%)\",\n opacity: \"0.9\",\n position: \"absolute\",\n },\n animeSourceDiv: {\n backgroundColor: WATCHANIME_RED,\n borderRadius: \"10px\",\n fontSize: \"10px\",\n padding: \"2px 10px\",\n color: \"white\",\n },\n noTextDecoration: {\n textDecoration: \"none\",\n \"&:hover\": {\n textDecoration: \"none\",\n },\n },\n sliderInfoDisplayDiv: {\n flexWrap: \"nowrap\",\n zIndex: \"1\",\n width: \"100%\",\n justifyContent: \"space-between\",\n gap: \"15px\",\n },\n playBackTimeDiv: {\n position: \"absolute\",\n height: \"5px\",\n background: WATCHANIME_RED,\n bottom: 0,\n zIndex: 1,\n },\n animeCardEpisodeDiv: {\n fontSize: \"10px\",\n background: WATCHANIME_RED,\n display: \"inline-block\",\n padding: \"2px 12px\",\n borderRadius: \"4px\",\n position: \"absolute\",\n left: \"10px\",\n top: \"10px\",\n color: \"white\",\n },\n animeCardNewEpisodeDiv: {\n fontSize: \"10px\",\n background: WATCHANIME_RED,\n display: \"inline-block\",\n padding: \"2px 12px\",\n borderRadius: \"4px\",\n position: \"absolute\",\n right: \"10px\",\n top: \"10px\",\n color: \"white\",\n },\n animeCardHoverState: {\n transitionProperty: \"opacity\",\n transitionTimingFunction: \"cubic-bezier(.4,0,.2,1)\",\n transitionDuration: \".5s\",\n backgroundColor: \"rgba(0,0,0,.8)\",\n opacity: 0,\n width: \"100%\",\n height: \"100%\",\n transform: \"translate(0%, -100%)\",\n position: \"absolute\",\n zIndex: 2,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-evenly\",\n \"&:hover\": {\n opacity: \"1\",\n },\n },\n hoverContentBaseDiv: {\n height: \"40px\",\n width: \"40px\",\n border: \"2px solid\",\n borderRadius: \"50%\",\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n },\n}));\n\nfunction Card({ animeData, isDeletable, isAddableToWatchList, featureId, setLastWatchedData, ActionComponent, actionComponentData }) {\n const { classes } = useStyles();\n const { language } = useLanguageStore(useShallow((state) => ({ language: state.language })));\n const { handleWatchListAdd, handleWatchListDelete } = useWatchListStore(useShallow((state) => ({ handleWatchListAdd: state.handleWatchListAdd, handleWatchListDelete: state.handleWatchListDelete })));\n const [isCardOpen, isCardOpenHandler] = useDisclosure(false);\n\n setTimeout(() => {\n isCardOpenHandler.open();\n }, 10);\n\n const handleDeleteFromAnimeCard = (e, featureId, selectedAnimeData) => {\n e.preventDefault();\n if (featureId === \"lastWatched\") {\n return handleDeleteFromLastWatched(selectedAnimeData);\n }\n if (featureId === \"watchList\") {\n return handleDeleteFromWatchList(selectedAnimeData);\n }\n };\n\n const handleDeleteFromWatchList = (selectedAnimeData) => {\n openConfirmModal({\n title: \"Please confirm your action\",\n children: Are you sure you want to delete {getAnimeTitleByRelevance(selectedAnimeData.titles, false, language)} from your watchlist?,\n labels: { confirm: \"Confirm\", cancel: \"Cancel\" },\n confirmProps: { color: \"red\" },\n onCancel: () => {\n //dont do anything\n },\n onConfirm: async () => {\n await handleWatchListDelete(selectedAnimeData);\n },\n centered: true,\n });\n };\n\n const handleDeleteFromLastWatched = (selectedAnimeData) => {\n openConfirmModal({\n title: \"Please confirm your action\",\n children: Are you sure you want to delete {getAnimeTitleByRelevance(selectedAnimeData.titles, false, language)} from your watch history?,\n labels: { confirm: \"Confirm\", cancel: \"Cancel\" },\n confirmProps: { color: \"red\" },\n onCancel: () => {\n //dont do anything\n },\n onConfirm: async () => {\n await removeLastWatched(selectedAnimeData.slug);\n const newLastWatchedData = await getLastWatched();\n setLastWatchedData(newLastWatchedData);\n showGenericCheckBoxNotification(\"Deleted from watch history!\", `${getAnimeTitleByRelevance(selectedAnimeData.titles, false, language)} has been deleted from your watch history!`);\n },\n centered: true,\n });\n };\n\n const hasNewEpisodeReleasedForWatchlistAnime = (animeData, featureId) => {\n if (featureId !== \"watchList\") {\n return false;\n }\n return animeData.hasNewEpisode;\n };\n\n return (\n \n {(styles) => (\n
\n \n \n \n \n \n {getAnimeTitleByRelevance(animeData.titles, false, language)}\n \n \n {animeData.duration ? `${animeData?.duration?.split(\" \")[0]} min` : \"\"}\n \n \n \n \n \n {animeData.genres && toTitleCase(animeData.genres.map((genre) => genre.name).join(\",\"), \",\")}\n \n
{animeData.type ?? \"TV\"}
\n
\n
\n \n {animeData.currentReleasedEpisode ? EP {animeData.currentReleasedEpisode} : <>}\n {ActionComponent && }\n {hasNewEpisodeReleasedForWatchlistAnime(animeData, featureId) ? NEW : <>}\n
\n
\n {isDeletable || isAddableToWatchList ? (\n \n {isDeletable ? (\n \n handleDeleteFromAnimeCard(e, featureId, animeData)}>\n \n \n \n ) : (\n <>\n )}\n {isAddableToWatchList ? (\n \n {\n e.preventDefault();\n await handleWatchListAdd(animeData);\n }}\n >\n \n \n \n ) : (\n <>\n )}\n \n ) : (\n <>\n )}\n
\n )}\n
\n );\n}\n\nfunction AnimeSectionLayout({ anime, isDeletable, isAddableToWatchList, featureId, setLastWatchedData, actionComponent, actionComponentData }) {\n const { classes } = useStyles();\n return (\n \n \n \n );\n}\n\nexport default AnimeSectionLayout;\n","import { useState, useCallback } from 'react';\n\nexport function useDisclosure(\n initialState = false,\n callbacks?: { onOpen?(): void; onClose?(): void }\n) {\n const { onOpen, onClose } = callbacks || {};\n const [opened, setOpened] = useState(initialState);\n\n const open = useCallback(() => {\n setOpened((isOpened) => {\n if (!isOpened) {\n onOpen?.();\n return true;\n }\n return isOpened;\n });\n }, [onOpen]);\n\n const close = useCallback(() => {\n setOpened((isOpened) => {\n if (isOpened) {\n onClose?.();\n return false;\n }\n return isOpened;\n });\n }, [onClose]);\n\n const toggle = useCallback(() => {\n opened ? close() : open();\n }, [close, open, opened]);\n\n return [opened, { open, close, toggle }] as const;\n}\n","import { Group } from \"@mantine/core\";\nimport React, { useRef } from \"react\";\n\nfunction ScheduleDateSliderPartial({ dayAndDate, setSelectedDate }) {\n const schduleSliderDivRef = useRef();\n\n const handleScheduleClick = (dayAndDate, schduleSliderDivRef) => {\n schduleSliderDivRef.current.parentNode.parentNode.childNodes.forEach((x) => x.childNodes[0].classList.remove(\"bg-red\"));\n schduleSliderDivRef.current.classList.add(\"bg-red\");\n setSelectedDate(dayAndDate);\n };\n\n return (\n handleScheduleClick(dayAndDate, schduleSliderDivRef)}\n ref={schduleSliderDivRef}\n className={dayAndDate.dateObj.getDate() === new Date().getDate() && \"bg-red\"}\n >\n {dayAndDate.day.toUpperCase()}\n {dayAndDate.date}\n \n );\n}\n\nexport default ScheduleDateSliderPartial;\n","import { Anchor, createStyles, Paper, Text } from \"@mantine/core\";\nimport React from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { toTitleCase } from \"../custom/AnimeData\";\n\nconst useStyles = createStyles((theme) => ({\n card: {\n height: 200,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n backgroundSize: \"cover\",\n backgroundPosition: \"center\",\n justifyContent: \"flex-end\",\n padding: \"10px\",\n width: 350,\n // [theme.fn.smallerThan(\"md\")]: {\n // width: \"150px\",\n // },\n },\n backGroundFilter: {\n width: \"100%\",\n height: \"100%\",\n transform: \"translate(0%, -100%)\",\n borderRadius: \"7px\",\n background: \"linear-gradient(180deg, rgba(255, 255, 255, 0) 0%, rgba(0, 0, 0, 0.42) 51.04%, rgba(0, 0, 0, 0.94) 79.17%, #000000 100%)\",\n opacity: \"0.9\",\n position: \"absolute\",\n },\n noTextDecoration: {\n textDecoration: \"none\",\n \"&:hover\": {\n textDecoration: \"none\",\n },\n },\n episodeCardEpisodeNumberDiv: {\n fontSize: \"14px\",\n backgroundColor: \"transparent\",\n padding: \"2px 5px\",\n borderRadius: \"4px\",\n position: \"absolute\",\n left: \"10px\",\n top: \"10px\",\n color: \"white\",\n border: \"2px solid white\",\n },\n}));\n\nfunction Card({ episodeData, index }) {\n const { classes } = useStyles();\n return (\n <>\n \n \n {toTitleCase(episodeData.title ?? `Episode ${index + 1}`, \" \")}\n \n \n
\n EP {index + 1}\n \n );\n}\n\nfunction AnimeDetailsEpisodeListLayout({ episodeData, index, animeSlug }) {\n const { classes } = useStyles();\n\n return (\n \n \n \n );\n}\n\nexport default AnimeDetailsEpisodeListLayout;\n","import React from \"react\";\nimport { Carousel } from \"@mantine/carousel\";\nimport HeaderSliderLayout from \"../layouts/HeaderSliderLayout\";\nimport AnimeSectionLayout from \"../layouts/AnimeSectionLayout\";\nimport ScheduleDateSliderPartial from \"../partials/ScheduleDateSliderPartial\";\nimport AnimeDetailsEpisodeListLayout from \"../layouts/AnimeDetailsEpisodeListLayout\";\n\nconst getSliderType = (sliderData, sliderRenderComponent, ind, otherData) => {\n switch (sliderRenderComponent) {\n case \"HeaderSliderLayout\":\n return ;\n case \"AnimeSectionLayout\":\n return (\n \n );\n case \"ScheduleSectionLayout\":\n return ;\n case \"AnimeDetailsEpisodeListLayout\":\n return ;\n default:\n return <>;\n }\n};\n\nfunction SliderComponent({ sliderDatas, sliderRenderComponent, sliderConfig, otherData = {} }) {\n const slides = sliderDatas.map((sliderData, ind) => {getSliderType(sliderData, sliderRenderComponent, ind, otherData)});\n return {slides};\n}\n\nexport default SliderComponent;\n","import { Anchor, createStyles, Group, Paper, Text } from \"@mantine/core\";\nimport { IconChevronRight } from \"@tabler/icons-react\";\nimport React from \"react\";\nimport { WATCHANIME_RED } from \"../constants/cssConstants\";\nimport SliderComponent from \"./SliderComponent\";\n\nconst useStyles = createStyles((theme) => ({\n viewMore: {\n textDecoration: \"none\",\n display: \"flex\",\n alignItems: \"center\",\n color: \"#C1C2C5\",\n \"&:hover\": {\n textDecoration: \"none\",\n color: WATCHANIME_RED,\n },\n },\n}));\n\nfunction AnimeSectionComponent({ sectionTitle, sectionAnimeData, hasViewMore, viewMoreLink, sliderConfig, refProp, otherData, actionComponent }) {\n const { classes } = useStyles();\n return (\n <>\n \n \n \n {sectionTitle}\n {actionComponent ? actionComponent : ``}\n \n {hasViewMore && (\n \n \n View More\n \n \n \n )}\n \n \n \n \n );\n}\n\nexport default AnimeSectionComponent;\n","import createReactComponent from '../createReactComponent';\nexport default createReactComponent('outline', 'chevron-left', 'IconChevronLeft', [[\"path\",{\"d\":\"M15 6l-6 6l6 6\",\"key\":\"svg-0\"}]]);","function getCurrentTime() {\n let currentDate = new Date();\n return `${roundOffTime(getHoursIn12HoursFormat(currentDate.getHours()))}:${roundOffTime(currentDate.getMinutes())}:${roundOffTime(currentDate.getSeconds())} ${currentDate.getHours() >= 12 ? \"PM\" : \"AM\"}`;\n}\nfunction roundOffTime(time) {\n return time < 10 ? \"0\" + time : time;\n}\nfunction getHoursIn12HoursFormat(hours) {\n hours = hours % 12;\n return hours ? hours : 12;\n}\nfunction getTimeZoneOffesetFromGMT() {\n let currentDate = new Date();\n let offsetHour = Math.abs(Math.ceil(currentDate.getTimezoneOffset() / 60));\n let offsetMinute = offsetHour > 0 ? Math.abs(currentDate.getTimezoneOffset() % 60) : 0;\n return `${currentDate.getTimezoneOffset() >= 0 ? \"-\" : \"+\"}${roundOffTime(offsetHour)}:${roundOffTime(offsetMinute)}`;\n}\nfunction getCurrentDate() {\n let currentDate = new Date();\n return `${currentDate.getDate()}/${currentDate.getMonth() + 1}/${currentDate.getFullYear()}`;\n}\nfunction getFormattedDateFromTimestamp(timestamp) {\n let currentDate = new Date(timestamp);\n return `${currentDate.getDate()}/${currentDate.getMonth() + 1}/${currentDate.getFullYear()}`;\n}\nfunction getDayAndDateFromDateString(dateObj) {\n let dateString = dateObj.toDateString();\n let dayMap = { Mon: \"Monday\", Tue: \"Tuesday\", Wed: \"Wednesday\", Thu: \"Thursday\", Fri: \"Friday\", Sat: \"Saturday\", Sun: \"Sunday\" };\n dateString = dateString.split(\" \");\n return { day: dayMap[dateString[0]], date: `${dateString[1]} ${dateString[2]}`, dateObj: dateObj };\n}\nfunction getDateAndDayForMonthFromCurrentDate() {\n let currentDate = new Date();\n let dateArray = [];\n for (let index = currentDate.getDate() - 1; index >= 1; index--) {\n let tempDate = new Date();\n tempDate.setDate(currentDate.getDate() - index);\n dateArray.push(getDayAndDateFromDateString(tempDate));\n }\n dateArray.push(getDayAndDateFromDateString(currentDate));\n for (let index = currentDate.getDate() + 1; index <= 30; index++) {\n let tempDate = new Date();\n tempDate.setDate(currentDate.getDate() + (index - currentDate.getDate()));\n dateArray.push(getDayAndDateFromDateString(tempDate));\n }\n return dateArray;\n}\nfunction getDayHourMinuteSecondFromSecond(totalseconds) {\n const dayInSec = 86400;\n const hourInSec = 3600;\n const minInSec = 60;\n\n let days = Math.floor(totalseconds / dayInSec);\n let hours = Math.floor((totalseconds - days * dayInSec) / hourInSec);\n let mins = Math.floor((totalseconds - days * dayInSec - hours * hourInSec) / minInSec);\n let secs = totalseconds - days * dayInSec - hours * hourInSec - mins * minInSec;\n\n return { days, hours, mins, secs };\n}\nexport { getCurrentTime, getTimeZoneOffesetFromGMT, getCurrentDate, getDateAndDayForMonthFromCurrentDate, roundOffTime, getHoursIn12HoursFormat, getDayHourMinuteSecondFromSecond, getFormattedDateFromTimestamp };\n","import createReactComponent from '../createReactComponent';\nexport default createReactComponent('outline', 'device-tv', 'IconDeviceTv', [[\"path\",{\"d\":\"M3 7m0 2a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v9a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2z\",\"key\":\"svg-0\"}],[\"path\",{\"d\":\"M16 3l-4 4l-4 -4\",\"key\":\"svg-1\"}]]);","import React from \"react\";\nimport { Group, Text, UnstyledButton } from \"@mantine/core\";\nimport { IconDeviceTv } from \"@tabler/icons-react\";\nimport { Link } from \"react-router-dom\";\nimport { getAnimeTitleByRelevance } from \"../custom/AnimeData\";\nimport { useLanguageStore } from \"../store/LanguageToggleStore\";\nimport { useShallow } from \"zustand/react/shallow\";\nfunction ScheduleForSelectedDatePartial({ scheduleData, selectedDate }) {\n const { language } = useLanguageStore(useShallow((state) => ({ language: state.language })));\n return (\n \n {scheduleData\n .filter((schedule) => schedule.daynum === selectedDate.dateObj.getDay())\n .sort((first, second) => {\n return first.timeday.includes(\"PM\") && !second.timeday.includes(\"PM\") ? 1 : !first.timeday.includes(\"PM\") && second.timeday.includes(\"PM\") ? -1 : first.timeday.split(\":\")[0] > second.timeday.split(\":\")[0] ? 1 : -1;\n })\n .map((schedule, ind) => {\n return (\n \n {schedule.timeday}\n \n {getAnimeTitleByRelevance(schedule.titles, false, language)}\n \n \n \n Watch\n \n \n );\n })}\n \n );\n}\n\nexport default ScheduleForSelectedDatePartial;\n","import { Paper } from \"@mantine/core\";\nimport React, { useState } from \"react\";\nimport SliderComponent from \"../components/SliderComponent\";\nimport { getDateAndDayForMonthFromCurrentDate } from \"../custom/DateTime\";\nimport ScheduleForSelectedDatePartial from \"../partials/ScheduleForSelectedDatePartial\";\n\nfunction ScheduleSectionLayout({ scheduleData }) {\n const [selectedDate, setSelectedDate] = useState({ dateObj: new Date() });\n const scheduleSliderConfig = {\n withControls: true,\n slideSize: \"150px\",\n slideGap: \"10px\",\n align: \"start\",\n includeGapInSize: false,\n loop: true,\n initialSlide: new Date().getDate() - 2,\n };\n return (\n \n \n \n \n );\n}\n\nexport default ScheduleSectionLayout;\n","import React, { useEffect, useState } from \"react\";\nimport { getCurrentTime } from \"../custom/DateTime\";\n\nfunction ScheduleTimerPartial() {\n const [currentTime, setCurrentTime] = useState(getCurrentTime());\n\n useEffect(() => {\n const timer = setInterval(() => {\n setCurrentTime(getCurrentTime());\n }, 1000);\n return () => {\n clearInterval(timer);\n };\n }, []);\n return
{currentTime}
;\n}\n\nexport default ScheduleTimerPartial;\n","import { createStyles, Group, Text } from \"@mantine/core\";\nimport React from \"react\";\nimport { getCurrentDate, getTimeZoneOffesetFromGMT } from \"../custom/DateTime\";\nimport ScheduleSectionLayout from \"../layouts/ScheduleSectionLayout\";\nimport ScheduleTimerPartial from \"../partials/ScheduleTimerPartial\";\n\nconst useStyles = createStyles((theme) => ({\n scheduleCurrentTimeParent: {\n lineHeight: \"28px\",\n padding: \"0 10px\",\n backgroundColor: \"rgb(37, 38, 43)\",\n borderRadius: \"40px\",\n margin: \"6px 0\",\n fontSize: \"14px\",\n fontWeight: \"500\",\n display: \"flex\",\n },\n scheduleCurrentTimeDate: {\n padding: \"0px 5px\",\n },\n}));\n\nfunction ScheduleComponent({ scheduleData, targetRefSchedule }) {\n const { classes } = useStyles();\n\n return (\n \n \n Estimated Schedule\n
\n
GMT{getTimeZoneOffesetFromGMT()}
\n
{getCurrentDate()}
\n \n
\n
\n \n \n \n
\n );\n}\n\nexport default ScheduleComponent;\n","import createReactComponent from '../createReactComponent';\nexport default createReactComponent('outline', 'volume-off', 'IconVolumeOff', [[\"path\",{\"d\":\"M15 8a5 5 0 0 1 1.912 4.934m-1.377 2.602a5 5 0 0 1 -.535 .464\",\"key\":\"svg-0\"}],[\"path\",{\"d\":\"M17.7 5a9 9 0 0 1 2.362 11.086m-1.676 2.299a9 9 0 0 1 -.686 .615\",\"key\":\"svg-1\"}],[\"path\",{\"d\":\"M9.069 5.054l.431 -.554a.8 .8 0 0 1 1.5 .5v2m0 4v8a.8 .8 0 0 1 -1.5 .5l-3.5 -4.5h-2a1 1 0 0 1 -1 -1v-4a1 1 0 0 1 1 -1h2l1.294 -1.664\",\"key\":\"svg-2\"}],[\"path\",{\"d\":\"M3 3l18 18\",\"key\":\"svg-3\"}]]);","import createReactComponent from '../createReactComponent';\nexport default createReactComponent('outline', 'volume', 'IconVolume', [[\"path\",{\"d\":\"M15 8a5 5 0 0 1 0 8\",\"key\":\"svg-0\"}],[\"path\",{\"d\":\"M17.7 5a9 9 0 0 1 0 14\",\"key\":\"svg-1\"}],[\"path\",{\"d\":\"M6 15h-2a1 1 0 0 1 -1 -1v-4a1 1 0 0 1 1 -1h2l3.5 -4.5a.8 .8 0 0 1 1.5 .5v14a.8 .8 0 0 1 -1.5 .5l-3.5 -4.5\",\"key\":\"svg-2\"}]]);","const toggleVideoVolume = (isMuted, setVideoMuted, videoPlayerRef) => {\n videoPlayerRef.current.muted = !isMuted;\n setVideoMuted(!isMuted);\n};\n\nconst isVideoHeaderEnabled = (animeData, isMobile) => {\n return Boolean(!isMobile && animeData?.trailer?.deliveryUrl);\n};\n\nexport { toggleVideoVolume, isVideoHeaderEnabled };\n","import { Button, createStyles, Group, Image, Paper, Text, useMantineTheme } from \"@mantine/core\";\nimport { useMediaQuery } from \"@mantine/hooks\";\nimport { IconCalendarTime, IconPlayerPlay, IconStar, IconVolume, IconVolumeOff } from \"@tabler/icons-react\";\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { HEADER_VIDEO_CONTAINER_HEIGHT, HEADER_VIDEO_CONTAINER_HEIGHT_MIN } from \"../constants/cssConstants\";\nimport { getAnimeTitleByRelevance, getImageByRelevance, getTmdbImageByRelevanceAndType, hasTmdbData } from \"../custom/AnimeData\";\n\nimport topTenImage from \"../assets/images/topten.svg\";\nimport { isVideoHeaderEnabled, toggleVideoVolume } from \"../custom/VideoBackground\";\nimport { useLanguageStore } from \"../store/LanguageToggleStore\";\nimport { useShallow } from \"zustand/react/shallow\";\n\nconst useStyles = createStyles((theme) => ({\n sliderButton: {\n backgroundColor: \"rgba(255, 255, 255, 0.1)\",\n\n \"&:hover\": {\n backgroundColor: \"rgba(255,255,255,0.2)\",\n border: `1px solid rgba(255,255,255,0.4)`,\n },\n },\n sliderText: {\n display: \"flex\",\n position: \"absolute\",\n top: \"20%\",\n left: \"2em\",\n width: \"50%\",\n minHeight: \"fit-content\",\n padding: \"1em\",\n zIndex: \"3\",\n flexDirection: \"column\",\n height: \"50%\",\n justifyContent: \"center\",\n color: \"rgba(255,255,255,0.9)\",\n [`@media (max-width: ${theme.breakpoints.sm}px)`]: {\n width: \"90%\",\n },\n },\n sliderImageDiv: {\n backgroundSize: \"cover\",\n height: \"100%\",\n opacity: 0.5,\n },\n sliderFade: {\n position: \"absolute\",\n bottom: \"0\",\n left: \"0\",\n width: \"100%\",\n height: \"70%\",\n zIndex: \"1\",\n background: \"linear-gradient(0deg,#1A1B1E,transparent)\",\n opacity: \".9\",\n borderRadius: \"0\",\n },\n scrollFade: {\n position: \"absolute\",\n bottom: \"0\",\n left: \"0\",\n width: \"100%\",\n height: \"100%\",\n zIndex: \"1\",\n background: \"#1A1B1E\",\n opacity: \"0\",\n borderRadius: \"0\",\n },\n logoImageDiv: {\n objectPosition: \"left\",\n color: \"red\",\n objectFit: \"scale-down\",\n marginBottom: \"10px\",\n },\n logoDivAnimate: {\n objectPosition: \"left\",\n objectFit: \"scale-down\",\n marginBottom: \"10px\",\n transformOrigin: \"left bottom\",\n transform: \"scale(1) translate3d(0px, 25%, 0px)\",\n transitionDuration: \"1300ms\",\n transitionDelay: \"5000ms\",\n },\n synopsisDivAnimate: {\n opacity: \"0\",\n transitionDuration: \"1000ms\",\n transitionDelay: \"5000ms\",\n transform: \"translate3d(0px, 150px, 0px)\",\n },\n ratingAndAiringDivAnimate: {\n opacity: \"0\",\n transitionDuration: \"1000ms\",\n transitionDelay: \"5000ms\",\n transform: \"translate3d(0px, 150px, 0px)\",\n },\n topTenDivAnimate: {\n opacity: \"0\",\n transitionDuration: \"1000ms\",\n transitionDelay: \"5000ms\",\n transform: \"translate3d(0px, 150px, 0px)\",\n },\n divReAnimate: {\n opacity: \"1\",\n transitionDuration: \"1000ms\",\n transitionDelay: \"1000ms\",\n transform: \"translate3d(0px, 0px, 0px)\",\n },\n logoDivReAnimate: {\n objectPosition: \"left\",\n objectFit: \"scale-down\",\n marginBottom: \"10px\",\n transformOrigin: \"left bottom\",\n transform: \"scale(1) translate3d(0px, 0%, 0px)\",\n transitionDuration: \"1000ms\",\n transitionDelay: \"1000ms\",\n },\n synopsisDivHide: {\n display: \"none\",\n },\n ratingAndAiringDivHide: {\n display: \"none !important\",\n },\n topTenDivHide: {\n display: \"none !important\",\n },\n videoBackgroundClass: {\n position: \"absolute\",\n right: \"0\",\n bottom: \"0\",\n width: \"100% !important\",\n objectFit: \"cover\",\n height: HEADER_VIDEO_CONTAINER_HEIGHT,\n transition: \"opacity 1s linear\",\n minHeight: HEADER_VIDEO_CONTAINER_HEIGHT_MIN,\n },\n headerMuteButton: {\n width: \"50px\",\n height: \"50px\",\n position: \"absolute\",\n right: \"5%\",\n bottom: \"35%\",\n borderRadius: \"40px\",\n backgroundColor: \"transparent\",\n border: \"1px solid rgba(255, 255, 255, 0.7)\",\n color: \"white\",\n zIndex: \"3\",\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n \"&:hover\": {\n backgroundColor: \"rgba(255,255,255,0.1)\",\n },\n },\n}));\n\nfunction HeaderVideoLayout({ anime, index }) {\n const { classes } = useStyles();\n const theme = useMantineTheme();\n const mobile = useMediaQuery(`(max-width: ${theme.breakpoints.xs}px)`);\n const videoPlayerRef = useRef(HTMLVideoElement);\n // const isHeaderVideoEnable = isVideoHeaderEnabled(anime, mobile);\n const [logoClassArray, setLogoClassArray] = useState(classes.logoImageDiv);\n const [synopsisClassArray, setSynopsisClassArray] = useState(\"\");\n const [ratingAndAiringClassArray, setRatingAndAiringClassArray] = useState(\"\");\n const [topTenClassArray, setTopTenClassArrayClassArray] = useState(\"\");\n const [scrollFactor, setScrollFactor] = useState(0);\n const [videoMuted, setVideoMuted] = useState(true);\n const [isHeaderVideoVisible, setIsHeaderVideoVisible] = useState(isVideoHeaderEnabled(anime, mobile));\n const { language } = useLanguageStore(useShallow((state) => ({ language: state.language })));\n\n useEffect(() => {\n setIsHeaderVideoVisible(isVideoHeaderEnabled(anime, mobile));\n }, [mobile, anime]);\n\n useEffect(() => {\n setLogoClassArray(classes.logoDivAnimate);\n setSynopsisClassArray(classes.synopsisDivAnimate);\n setRatingAndAiringClassArray(classes.ratingAndAiringDivAnimate);\n setTopTenClassArrayClassArray(classes.topTenDivAnimate);\n videoPlayerRef.current.onended = () => {\n setLogoClassArray(classes.logoDivReAnimate);\n setSynopsisClassArray(classes.divReAnimate);\n setRatingAndAiringClassArray(classes.divReAnimate);\n setTopTenClassArrayClassArray(classes.divReAnimate);\n setIsHeaderVideoVisible(false);\n videoPlayerRef.current.classList.add(\"opacityhide\");\n };\n }, [classes.logoDivAnimate, classes.synopsisDivAnimate, classes.ratingAndAiringDivAnimate, classes.topTenDivAnimate, classes.synopsisDivHide, classes.ratingAndAiringDivHide, classes.topTenDivHide, classes.divReAnimate, classes.logoDivReAnimate]);\n\n useEffect(() => {\n const headerVideoFadeHandler = () => {\n const scrollFactorCalculated = 1 - Math.max(0, window.innerHeight - document.documentElement.scrollTop) / window.innerHeight;\n setScrollFactor(scrollFactorCalculated);\n if (videoPlayerRef.current?.classList && !videoPlayerRef.current.classList.contains(\"opacityhide\")) {\n videoPlayerRef.current.volume = Math.max(0, 1 - scrollFactorCalculated * 1.3);\n scrollFactorCalculated > 0.7 ? videoPlayerRef.current.pause() : videoPlayerRef.current.play();\n }\n };\n\n window.addEventListener(\"scroll\", headerVideoFadeHandler);\n return () => window.removeEventListener(\"scroll\", headerVideoFadeHandler);\n }, []);\n\n return (\n \n \n {isHeaderVideoVisible ? : \"\"}\n
\n \n \n {`#${index + 1} ${anime.type ? `in ${anime.type} shows today` : \"Trending\"}`}\n \n \n \n \n {anime.score}\n \n \n \n {anime.aired.string.toString().split(\"to\")[0]}\n \n \n {!hasTmdbData(anime) || mobile ? (\n \n {getAnimeTitleByRelevance(anime.titles, false, language)}\n \n ) : (\n \"\"\n )}\n\n {`Plot Summary: ${anime.synopsis}`}\n \n
\n \n \n {isHeaderVideoVisible ? (\n toggleVideoVolume(videoMuted, setVideoMuted, videoPlayerRef)}>\n {videoMuted ? : }\n \n ) : (\n ``\n )}\n \n );\n}\n\nexport default HeaderVideoLayout;\n","import { useEffect } from 'react';\n\nexport function useWindowEvent(\n type: K,\n listener: K extends keyof WindowEventMap\n ? (this: Window, ev: WindowEventMap[K]) => void\n : (this: Window, ev: CustomEvent) => void,\n options?: boolean | AddEventListenerOptions\n) {\n useEffect(() => {\n window.addEventListener(type, listener, options);\n return () => window.removeEventListener(type, listener, options);\n }, [type, listener]);\n}\n","import { createStyles, CSSObject } from '@mantine/styles';\n\nconst sizes = {\n xs: 320,\n sm: 380,\n md: 440,\n lg: 620,\n xl: 780,\n};\n\nexport interface ModalStylesParams {\n overflow: 'outside' | 'inside';\n size: string | number;\n centered: boolean;\n zIndex: React.CSSProperties['zIndex'];\n fullScreen: boolean;\n}\n\nfunction getFullScreenStyles(fullScreen: boolean): CSSObject {\n if (!fullScreen) {\n return {};\n }\n\n return {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n maxHeight: '100vh',\n overflowY: 'auto',\n };\n}\n\nexport default createStyles(\n (theme, { overflow, size, centered, zIndex, fullScreen }: ModalStylesParams) => ({\n close: {},\n\n overlay: {\n display: fullScreen ? 'none' : undefined,\n },\n\n root: {\n position: 'fixed',\n zIndex,\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n },\n\n inner: {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n overflowY: 'auto',\n padding: fullScreen ? 0 : `${theme.spacing.xl * 2}px ${theme.spacing.md}px`,\n display: 'flex',\n justifyContent: 'center',\n alignItems: centered ? 'center' : 'flex-start',\n },\n\n title: {\n marginRight: theme.spacing.md,\n textOverflow: 'ellipsis',\n display: 'block',\n wordBreak: 'break-word',\n },\n\n modal: {\n position: 'relative',\n width: fullScreen ? '100vw' : theme.fn.size({ sizes, size }),\n borderRadius: fullScreen ? 0 : undefined,\n outline: 0,\n backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[7] : theme.white,\n marginTop: centered ? 'auto' : undefined,\n marginBottom: centered ? 'auto' : undefined,\n zIndex: 1,\n // marginLeft: fullScreen ? undefined : 'calc(var(--removed-scroll-width, 0px) * -1)',\n ...getFullScreenStyles(fullScreen),\n },\n\n header: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: theme.spacing.md,\n marginRight: -9,\n },\n\n body: {\n maxHeight: overflow === 'inside' ? 'calc(100vh - 185px)' : null,\n overflowY: overflow === 'inside' ? 'auto' : null,\n wordBreak: 'break-word',\n },\n })\n);\n","import React, { useEffect, useRef } from 'react';\nimport {\n useScrollLock,\n useFocusTrap,\n useFocusReturn,\n useId,\n useWindowEvent,\n useMergedRef,\n} from '@mantine/hooks';\nimport {\n DefaultProps,\n MantineNumberSize,\n MantineShadow,\n Selectors,\n getDefaultZIndex,\n useComponentDefaultProps,\n} from '@mantine/styles';\nimport { CloseButton } from '../CloseButton';\nimport { Text } from '../Text';\nimport { Paper } from '../Paper';\nimport { Overlay } from '../Overlay';\nimport { OptionalPortal } from '../Portal';\nimport { Box } from '../Box';\nimport { GroupedTransition, MantineTransition } from '../Transition';\nimport useStyles, { ModalStylesParams } from './Modal.styles';\n\nexport type ModalStylesNames = Selectors;\n\nexport interface ModalProps\n extends DefaultProps,\n Omit, 'title'> {\n /** Mounts modal if true */\n opened: boolean;\n\n /** Called when close button clicked and when escape key is pressed */\n onClose(): void;\n\n /** Modal title, displayed in header before close button */\n title?: React.ReactNode;\n\n /** Modal z-index property */\n zIndex?: React.CSSProperties['zIndex'];\n\n /** Control vertical overflow behavior */\n overflow?: 'outside' | 'inside';\n\n /** Hides close button if set to false, modal still can be closed with escape key and by clicking outside */\n withCloseButton?: boolean;\n\n /** Overlay opacity */\n overlayOpacity?: number;\n\n /** Overlay color */\n overlayColor?: string;\n\n /** Overlay blur in px */\n overlayBlur?: number;\n\n /** Determines whether the modal should take the entire screen */\n fullScreen?: boolean;\n\n /** Modal radius */\n radius?: MantineNumberSize;\n\n /** Modal body width */\n size?: string | number;\n\n /** Modal body transition */\n transition?: MantineTransition;\n\n /** Duration in ms of modal transitions, set to 0 to disable all animations */\n transitionDuration?: number;\n\n /** Exit transition duration in ms, 0 by default */\n exitTransitionDuration?: number;\n\n /** Modal body transitionTimingFunction, defaults to theme.transitionTimingFunction */\n transitionTimingFunction?: string;\n\n /** Close button aria-label */\n closeButtonLabel?: string;\n\n /** id base, used to generate ids to connect modal title and body with aria- attributes, defaults to random id */\n id?: string;\n\n /** Modal shadow from theme or css value */\n shadow?: MantineShadow;\n\n /** Modal padding from theme or number value for padding in px */\n padding?: MantineNumberSize;\n\n /** Should modal be closed when outside click was registered? */\n closeOnClickOutside?: boolean;\n\n /** Should modal be closed when escape is pressed? */\n closeOnEscape?: boolean;\n\n /** Disables focus trap */\n trapFocus?: boolean;\n\n /** Controls if modal should be centered */\n centered?: boolean;\n\n /** Determines whether scroll should be locked when modal is opened, defaults to true */\n lockScroll?: boolean;\n\n /** Target element or selector where modal portal should be rendered */\n target?: HTMLElement | string;\n\n /** Determines whether modal should be rendered within Portal, defaults to true */\n withinPortal?: boolean;\n\n /** Determines whether focus should be returned to the last active element when drawer is closed */\n withFocusReturn?: boolean;\n}\n\nconst defaultProps: Partial = {\n size: 'md',\n transitionDuration: 250,\n overflow: 'outside',\n padding: 'lg',\n shadow: 'lg',\n closeOnClickOutside: true,\n closeOnEscape: true,\n trapFocus: true,\n withCloseButton: true,\n withinPortal: true,\n lockScroll: true,\n withFocusReturn: true,\n overlayBlur: 0,\n zIndex: getDefaultZIndex('modal'),\n exitTransitionDuration: 0,\n};\n\nexport function Modal(props: ModalProps) {\n const {\n className,\n opened,\n title,\n onClose,\n children,\n withCloseButton,\n overlayOpacity,\n size,\n transitionDuration,\n exitTransitionDuration,\n closeButtonLabel,\n overlayColor,\n overflow,\n transition,\n padding,\n shadow,\n radius,\n id,\n classNames,\n styles,\n closeOnClickOutside,\n trapFocus,\n closeOnEscape,\n centered,\n target,\n withinPortal,\n zIndex,\n overlayBlur,\n transitionTimingFunction,\n fullScreen,\n unstyled,\n lockScroll: shouldLockScroll,\n withFocusReturn,\n ...others\n } = useComponentDefaultProps('Modal', defaultProps, props);\n const baseId = useId(id);\n const titleId = `${baseId}-title`;\n const bodyId = `${baseId}-body`;\n const { classes, cx, theme } = useStyles(\n { size, overflow, centered, zIndex, fullScreen },\n { unstyled, classNames, styles, name: 'Modal' }\n );\n const focusTrapRef = useFocusTrap(trapFocus && opened);\n const overlayRef = useRef(null);\n const mergedRef = useMergedRef(focusTrapRef, overlayRef);\n\n const _overlayOpacity =\n typeof overlayOpacity === 'number'\n ? overlayOpacity\n : theme.colorScheme === 'dark'\n ? 0.85\n : 0.75;\n\n useScrollLock(shouldLockScroll && opened);\n\n const closeOnEscapePress = (event: KeyboardEvent) => {\n if (!trapFocus && event.key === 'Escape' && closeOnEscape) {\n onClose();\n }\n };\n\n useEffect(() => {\n if (!trapFocus) {\n window.addEventListener('keydown', closeOnEscapePress);\n return () => window.removeEventListener('keydown', closeOnEscapePress);\n }\n\n return undefined;\n }, [trapFocus]);\n\n useFocusReturn({ opened, shouldReturnFocus: trapFocus && withFocusReturn });\n\n const clickTarget = useRef(null);\n\n useWindowEvent('mousedown', (e) => {\n clickTarget.current = e.target;\n });\n\n const handleOutsideClick = () => {\n if (clickTarget.current === overlayRef.current) {\n closeOnClickOutside && onClose();\n }\n };\n\n return (\n \n \n {(transitionStyles) => (\n <>\n \n
\n \n
\n {\n const shouldTrigger =\n (event.target as any)?.getAttribute('data-mantine-stop-propagation') !== 'true';\n shouldTrigger && event.key === 'Escape' && closeOnEscape && onClose();\n }}\n ref={mergedRef}\n >\n \n className={classes.modal}\n shadow={shadow}\n p={padding}\n radius={radius}\n role=\"dialog\"\n aria-labelledby={titleId}\n aria-describedby={bodyId}\n aria-modal\n tabIndex={-1}\n style={transitionStyles.modal}\n unstyled={unstyled}\n onClick={(event) => event.stopPropagation()}\n >\n {(title || withCloseButton) && (\n
\n \n {title}\n \n\n {withCloseButton && (\n \n )}\n
\n )}\n\n
\n {children}\n
\n \n \n
\n \n )}\n \n
\n );\n}\n\nModal.displayName = '@mantine/core/Modal';\n","import { createStyles, MantineNumberSize, MantineColor, keyframes } from '@mantine/styles';\n\nconst sizes = {\n xs: 3,\n sm: 5,\n md: 8,\n lg: 12,\n xl: 16,\n};\n\nexport interface ProgressStylesParams {\n color: MantineColor;\n radius: MantineNumberSize;\n size: MantineNumberSize;\n striped: boolean;\n animate: boolean;\n}\n\nconst stripesAnimation = keyframes({\n from: { backgroundPosition: '0 0' },\n to: { backgroundPosition: '40px 0' },\n});\n\nexport default createStyles(\n (theme, { color, radius, size, striped, animate }: ProgressStylesParams) => ({\n root: {\n position: 'relative',\n height: theme.fn.size({ size, sizes }),\n backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[4] : theme.colors.gray[2],\n borderRadius: theme.fn.size({ size: radius, sizes: theme.radius }),\n overflow: 'hidden',\n },\n\n bar: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 0,\n height: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n backgroundColor: theme.fn.variant({\n variant: 'filled',\n primaryFallback: false,\n color: color || theme.primaryColor,\n }).background,\n transition: 'width 100ms linear',\n animation: animate ? `${stripesAnimation} 1000ms linear infinite` : 'none',\n backgroundSize: '20px 20px',\n backgroundImage: striped\n ? 'linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent)'\n : 'none',\n\n '&:last-of-type': {\n borderTopRightRadius: theme.fn.size({ size: radius, sizes: theme.radius }),\n borderBottomRightRadius: theme.fn.size({ size: radius, sizes: theme.radius }),\n },\n\n '&:first-of-type': {\n borderTopLeftRadius: theme.fn.size({ size: radius, sizes: theme.radius }),\n borderBottomLeftRadius: theme.fn.size({ size: radius, sizes: theme.radius }),\n },\n\n '@media (prefers-reduced-motion)': {\n transitionDuration: theme.respectReducedMotion ? '0ms' : undefined,\n },\n },\n\n label: {\n color: theme.white,\n fontSize: theme.fn.size({ size, sizes }) * 0.65,\n fontWeight: 700,\n userSelect: 'none',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n },\n })\n);\n","import React, { forwardRef } from 'react';\nimport {\n DefaultProps,\n MantineNumberSize,\n MantineColor,\n Selectors,\n useComponentDefaultProps,\n} from '@mantine/styles';\nimport { Box } from '../Box';\nimport { Text } from '../Text';\nimport { Tooltip } from '../Tooltip';\nimport useStyles, { ProgressStylesParams } from './Progress.styles';\n\nexport type ProgressStylesNames = Selectors;\n\ninterface ProgressSection extends React.ComponentPropsWithRef<'div'> {\n value: number;\n color: MantineColor;\n label?: string;\n tooltip?: React.ReactNode;\n}\n\nexport interface ProgressProps\n extends DefaultProps,\n React.ComponentPropsWithoutRef<'div'> {\n /** Percent of filled bar (0-100) */\n value?: number;\n\n /** Progress color from theme */\n color?: MantineColor;\n\n /** Predefined progress height or number for height in px */\n size?: MantineNumberSize;\n\n /** Predefined progress radius from theme.radius or number for height in px */\n radius?: MantineNumberSize;\n\n /** Adds stripes */\n striped?: boolean;\n\n /** Whether to animate striped progress bars */\n animate?: boolean;\n\n /** Text to be placed inside the progress bar */\n label?: string;\n\n /** Replaces value if present, renders multiple sections instead of single one */\n sections?: ProgressSection[];\n}\n\nfunction getCumulativeSections(\n sections: ProgressSection[]\n): (ProgressSection & { accumulated: number })[] {\n return sections.reduce(\n (acc, section) => {\n acc.sections.push({ ...section, accumulated: acc.accumulated });\n acc.accumulated += section.value;\n return acc;\n },\n { accumulated: 0, sections: [] }\n ).sections;\n}\n\nconst defaultProps: Partial = {\n size: 'md',\n radius: 'sm',\n striped: false,\n animate: false,\n label: '',\n};\n\nexport const Progress = forwardRef((props, ref) => {\n const {\n className,\n value,\n color,\n size,\n radius,\n striped,\n animate,\n label,\n 'aria-label': ariaLabel,\n classNames,\n styles,\n sections,\n unstyled,\n ...others\n } = useComponentDefaultProps('Progress', defaultProps, props);\n\n const { classes, cx, theme } = useStyles(\n { color, size, radius, striped: striped || animate, animate },\n { classNames, styles, unstyled, name: 'Progress' }\n );\n\n const segments = Array.isArray(sections)\n ? getCumulativeSections(sections).map(\n (\n {\n tooltip,\n accumulated,\n value: sectionValue,\n label: sectionLabel,\n color: sectionColor,\n ...sectionProps\n },\n index\n ) => (\n \n \n {sectionLabel && {sectionLabel}}\n \n \n )\n )\n : null;\n\n return (\n \n {segments || (\n \n {label ? {label} : ''}\n \n )}\n \n );\n});\n\nProgress.displayName = '@mantine/core/Progress';\n","import { Box, Modal, Progress, Text } from \"@mantine/core\";\nimport { closeAllModals } from \"@mantine/modals\";\nimport React from \"react\";\n\nfunction AnimeCloudSyncComponent({ cloudSyncModalOpen, cloudSyncPersentage, cloudSyncModalText }) {\n return (\n \n \n \n \n {cloudSyncModalText}\n \n \n \n );\n}\n\nexport default AnimeCloudSyncComponent;\n","import React, { useEffect, useRef, useState } from \"react\";\nimport SideBarComponent from \"../components/SideBarComponent\";\nimport AnimeSectionComponent from \"../components/AnimeSectionComponent\";\nimport { Container, createStyles, Loader, useMantineTheme } from \"@mantine/core\";\nimport { useMediaQuery } from \"@mantine/hooks\";\n\nimport { ANIME_SLIDER_GAP, ANIME_SLIDER_MOBILE_WIDTH, ANIME_SLIDER_WIDTH } from \"../constants/cssConstants\";\nimport { IconChevronLeft, IconChevronRight } from \"@tabler/icons-react\";\nimport ScheduleComponent from \"../components/ScheduleComponent\";\nimport { getHoursIn12HoursFormat, roundOffTime } from \"../custom/DateTime\";\nimport { showGenericCheckBoxNotification } from \"../custom/Notification\";\nimport HeaderVideoLayout from \"../layouts/HeaderVideoLayout\";\n// import WatchListEditComponent from \"../components/WatchListEditComponent\";\nimport { useWatchListStore } from \"../store/WatchListStore\";\nimport { useShallow } from \"zustand/react/shallow\";\nimport { execGraphqlQuery } from \"../graphql/graphqlQueryExec\";\nimport { MergeQueryObject } from \"../graphql/graphqlQueries\";\nimport { getLastWatched, openCloudSyncModal } from \"../custom/CloudSync\";\nimport AnimeCloudSyncComponent from \"../components/AnimeCloudSyncComponent\";\n\nconst useStyles = createStyles((theme) => ({\n bodyContainer: {\n margin: \"20px 30px\",\n paddingTop: \"max(35%, 500px)\",\n position: \"relative\",\n zIndex: 1,\n marginTop: 0,\n [theme.fn.smallerThan(\"md\")]: {\n margin: \"20px 10px\",\n marginTop: 0,\n },\n },\n}));\n\nconst prepareScheduleData = (scheduleData = []) => {\n scheduleData.forEach((schedule, index, scheduleData) => {\n const tempDate = dateSchedule(Number(schedule.time) + 7200);\n scheduleData[index].timeday = tempDate.time;\n scheduleData[index].daynum = tempDate.daynum;\n });\n scheduleData.sort((first, second) => {\n return first.timeday < second.timeday ? -1 : first.timeday > second.timeday ? 1 : 0;\n });\n return scheduleData;\n};\n\nconst dateSchedule = (timeStamp) => {\n const currentDate = new Date(timeStamp * 1000);\n return {\n daynum: currentDate.getDay(),\n time: `${roundOffTime(getHoursIn12HoursFormat(currentDate.getHours()))}:${roundOffTime(currentDate.getMinutes())} ${currentDate.getHours() >= 12 ? \"PM\" : \"AM\"}`,\n };\n};\n\nfunction HomeScreen({ sideBarState, setSideBarState, bugReportState, setBugReportState, otherData }) {\n const targetRefRecent = useRef(null);\n const targetRefPopular = useRef(null);\n\n const executeTargetRefRecent = () => targetRefRecent.current.scrollIntoView({ behavior: \"smooth\", block: \"center\", inline: \"nearest\" });\n const executeTargetRefPopular = () => targetRefPopular.current.scrollIntoView({ behavior: \"smooth\", block: \"center\", inline: \"nearest\" });\n\n const theme = useMantineTheme();\n const mobile = useMediaQuery(`(max-width: ${theme.breakpoints.md}px)`);\n\n const [ajaxComplete, setAjaxComplete] = useState(false);\n const [recentlyReleasedAnimes, setRecentlyReleasedAnimes] = useState([]);\n\n const [scheduleData, setScheduleData] = useState([]);\n const [headerVideoData, setHeaderVideoData] = useState({});\n const [popularSeries, setPopularSeries] = useState([]);\n const { watchListData } = useWatchListStore(useShallow((state) => ({ watchListData: state.watchListData, setWatchListData: state.setWatchListData })));\n\n const [promptInstall, setPromptInstall] = useState(null);\n\n const [lastWatchedData, setLastWatchedData] = useState([]);\n\n //for legacy syncs\n const [cloudSyncModalOpen, setCloudSyncModalOpen] = useState(false);\n const [cloudSyncModalText, setCloudSyncModalText] = useState(\"\");\n const [cloudSyncPersentage, setCloudSyncPersentage] = useState(0);\n\n const { classes } = useStyles();\n\n useEffect(() => {\n async function getRecentlyReleasedAnimes() {\n const [mergeData, lastWatched] = await Promise.all([execGraphqlQuery(MergeQueryObject, { page: 1 }, 10), getLastWatched()]);\n setRecentlyReleasedAnimes(mergeData.data.data.Recent);\n let headerVideoData = mergeData.data.data.Popular.filter((anime) => anime?.trailer?.deliveryUrl);\n headerVideoData = headerVideoData.length ? headerVideoData : mergeData.data.data.Popular;\n const headerVideoIndex = Math.floor(Math.random() * headerVideoData.length);\n const doNotSync = localStorage.getItem(\"doNotSync\");\n if (!doNotSync) {\n openCloudSyncModal(setCloudSyncModalOpen, setCloudSyncModalText, cloudSyncPersentage, setCloudSyncPersentage);\n }\n setHeaderVideoData({ data: headerVideoData[headerVideoIndex], index: headerVideoIndex });\n setPopularSeries(mergeData.data.data.Popular);\n setScheduleData(prepareScheduleData(mergeData.data.data.Schedule));\n setLastWatchedData(lastWatched);\n setAjaxComplete(true);\n return;\n }\n getRecentlyReleasedAnimes();\n // eslint-disable-next-line\n }, []);\n\n useEffect(() => {\n const handler = (e) => {\n e.preventDefault();\n setPromptInstall(e);\n };\n window.addEventListener(\"beforeinstallprompt\", handler);\n\n return () => window.removeEventListener(\"transitionend\", handler);\n }, []);\n\n const installPWA = () => {\n if (!promptInstall) {\n showGenericCheckBoxNotification(\"Install Failed\", \"Failed to install PWA.\", { color: \"red\" });\n return;\n }\n promptInstall.prompt();\n };\n\n const sideBarComponentConfigForSideBarMenu = {\n title: \"Menu\",\n type: \"SideBarMenuLayout\",\n data: [\n { label: \"Recently Added\", refs: executeTargetRefRecent },\n { label: \"Popular\", refs: executeTargetRefPopular },\n { label: \"Install App\", callBack: () => installPWA() },\n { label: \"Cloud Sync\", callBack: () => openCloudSyncModal(setCloudSyncModalOpen, setCloudSyncModalText, cloudSyncPersentage, setCloudSyncPersentage, true) },\n ],\n };\n const animeSliderConfig = {\n slideSize: mobile ? ANIME_SLIDER_MOBILE_WIDTH : ANIME_SLIDER_WIDTH,\n slideGap: ANIME_SLIDER_GAP,\n align: \"start\",\n includeGapInSize: false,\n skipSnaps: true,\n styles: {\n control: {\n backgroundColor: \"rgb(37, 38, 43)\",\n fontSize: \"18px\",\n width: \"40px\",\n height: \"40px\",\n lineHeight: \"40px\",\n textAlign: \"center\",\n borderRadius: \"6px\",\n margin: \"3px 0px\",\n opacity: 1,\n color: \"white\",\n border: \"0px\",\n \"&:hover\": {\n backgroundColor: \"rgba(44, 46, 51, 0.85)\",\n },\n },\n },\n nextControlIcon: ,\n previousControlIcon: ,\n sx: { width: \"100%\" },\n containScroll: \"keepSnaps\",\n };\n return ajaxComplete ? (\n <>\n \n \n \n {lastWatchedData.length ? (\n \n ) : (\n <>\n )}\n {watchListData.length ? (\n }\n />\n ) : (\n <>\n )}\n \n \n \n \n \n \n ) : (\n \n );\n}\n\nexport default HomeScreen;\n","import { createStyles, MantineNumberSize, keyframes } from '@mantine/styles';\n\nexport interface SkeletonStylesParams {\n height: number | string;\n width: number | string;\n circle: boolean;\n radius: MantineNumberSize;\n animate: boolean;\n}\n\nexport const fade = keyframes({\n 'from, to': { opacity: 0.4 },\n '50%': { opacity: 1 },\n});\n\nexport default createStyles(\n (theme, { height, width, radius, circle, animate }: SkeletonStylesParams) => ({\n root: {\n height,\n width: circle ? height : width,\n borderRadius: circle ? height : theme.fn.radius(radius),\n position: 'relative',\n WebkitTransform: 'translateZ(0)',\n },\n\n visible: {\n overflow: 'hidden',\n\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n background: theme.colorScheme === 'dark' ? theme.colors.dark[7] : theme.white,\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n zIndex: 10,\n },\n\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n background: theme.colorScheme === 'dark' ? theme.colors.dark[4] : theme.colors.gray[3],\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n animation: animate ? `${fade} 1500ms linear infinite` : 'none',\n zIndex: 11,\n },\n },\n })\n);\n","import React, { forwardRef } from 'react';\nimport { DefaultProps, MantineNumberSize, useComponentDefaultProps } from '@mantine/styles';\nimport { Box } from '../Box';\nimport useStyles, { SkeletonStylesParams } from './Skeleton.styles';\n\nexport interface SkeletonProps\n extends DefaultProps,\n React.ComponentPropsWithoutRef<'div'> {\n /** Should skeleton overlay be displayed */\n visible?: boolean;\n\n /** Skeleton height */\n height?: number | string;\n\n /** Skeleton width */\n width?: number | string;\n\n /** If Skeleton is a circle, it's width and border-radius will be equal to height */\n circle?: boolean;\n\n /** Radius from theme.radius or number to set border-radius in px */\n radius?: MantineNumberSize;\n\n /** Whether to show the animation effect */\n animate?: boolean;\n}\n\nconst defaultProps: Partial = {\n height: 'auto',\n width: '100%',\n visible: true,\n animate: true,\n};\n\nexport const Skeleton = forwardRef((props, ref) => {\n const { height, width, visible, animate, className, circle, radius, unstyled, ...others } =\n useComponentDefaultProps('Skeleton', defaultProps, props);\n\n const { classes, cx } = useStyles(\n { height, width, circle, radius, animate },\n { unstyled, name: 'Skeleton' }\n );\n\n return (\n \n );\n});\n\nSkeleton.displayName = '@mantine/core/Skeleton';\n","import { useState, useEffect } from \"react\";\n\nfunction getWindowDimensions() {\n const { innerWidth: width, innerHeight: height } = window;\n return {\n width,\n height,\n };\n}\n\nexport default function useWindowDimensions() {\n const [windowDimensions, setWindowDimensions] = useState(getWindowDimensions());\n\n useEffect(() => {\n function handleResize() {\n setWindowDimensions(getWindowDimensions());\n }\n\n window.addEventListener(\"resize\", handleResize);\n return () => window.removeEventListener(\"resize\", handleResize);\n }, []);\n\n return windowDimensions;\n}\n","import { Group, Skeleton, Text } from \"@mantine/core\";\nimport React from \"react\";\nimport useWindowDimensions from \"../hooks/useWindowDimensions\";\n\nfunction AnimeSectionLoaderPartial({ loaderTitle, skeletonHeight, skeletonWidth }) {\n const { width } = useWindowDimensions();\n return (\n \n \n {loaderTitle}\n \n \n {[...Array(Math.floor(width / (skeletonWidth + 30)))].map((eachCard, ind) => (\n \n ))}\n \n \n );\n}\n\nexport default AnimeSectionLoaderPartial;\n","import { Group, Text } from \"@mantine/core\";\nimport { IconChevronLeft, IconChevronRight } from \"@tabler/icons-react\";\nimport axios from \"axios\";\nimport React, { useEffect, useState } from \"react\";\nimport { ANIME_SLIDER_GAP } from \"../constants/cssConstants\";\nimport { API_BASE_URL } from \"../constants/genricConstants\";\nimport AnimeSectionLoaderPartial from \"../partials/AnimeSectionLoaderPartial\";\nimport SliderComponent from \"./SliderComponent\";\n\nfunction AnimeDetailsEpisodeListComponent({ animeData, episodeInfoData, setEpisodeInfoData }) {\n const [ajaxComplete, setAjaxComplete] = useState(false);\n\n useEffect(() => {\n async function getEpisodeInfoData() {\n setAjaxComplete(false);\n const [animeAjaxData] = await Promise.all([axios.get(`${API_BASE_URL}/episode/details/${animeData.slug}/all`)]);\n setEpisodeInfoData(animeAjaxData.data);\n setAjaxComplete(true);\n return;\n }\n getEpisodeInfoData();\n }, [animeData.slug, setEpisodeInfoData]);\n\n const sliderConfig = {\n slideSize: 300, //mobile\n slideGap: ANIME_SLIDER_GAP,\n align: \"start\",\n includeGapInSize: false,\n skipSnaps: true,\n styles: {\n control: {\n backgroundColor: \"rgb(37, 38, 43)\",\n fontSize: \"18px\",\n width: \"40px\",\n height: \"40px\",\n lineHeight: \"40px\",\n textAlign: \"center\",\n borderRadius: \"6px\",\n margin: \"3px 0px\",\n opacity: 1,\n color: \"white\",\n border: \"0px\",\n \"&:hover\": {\n backgroundColor: \"rgba(44, 46, 51, 0.85)\",\n },\n },\n },\n nextControlIcon: ,\n previousControlIcon: ,\n sx: { width: \"100%\" },\n containScroll: \"keepSnaps\",\n };\n\n return (\n <>\n {ajaxComplete ? (\n episodeInfoData.episodes?.length ? (\n \n \n {\"EPISODE LIST\"}\n \n {episodeInfoData.episodes ? : \"\"}\n \n ) : (\n \"\"\n )\n ) : (\n \n )}\n \n );\n}\n\nexport default AnimeDetailsEpisodeListComponent;\n","import React, { forwardRef } from 'react';\nimport { DefaultProps, useComponentDefaultProps } from '@mantine/styles';\nimport { Box } from '../Box';\n\nexport interface SpaceProps extends DefaultProps {}\n\nconst defaultProps: Partial = {\n w: 0,\n h: 0,\n};\n\nexport const Space = forwardRef((props: SpaceProps, ref) => {\n const { w, h, ...others } = useComponentDefaultProps('Space', defaultProps, props);\n return ;\n});\n\nSpace.displayName = '@mantine/core/Space';\n","import createReactComponent from '../createReactComponent';\nexport default createReactComponent('outline', 'x', 'IconX', [[\"path\",{\"d\":\"M18 6l-12 12\",\"key\":\"svg-0\"}],[\"path\",{\"d\":\"M6 6l12 12\",\"key\":\"svg-1\"}]]);","import { createStyles, Group, Text } from \"@mantine/core\";\nimport React from \"react\";\nimport { WATCHANIME_RED } from \"../constants/cssConstants\";\nimport { getDayHourMinuteSecondFromSecond } from \"../custom/DateTime\";\n\nconst useStyles = createStyles((theme) => ({\n nextEpisodeInfoDiv: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: 0,\n alignItems: \"flex-start\",\n borderLeft: `3px solid ${WATCHANIME_RED}`,\n paddingLeft: 10,\n },\n nextEpisodeInfoDivNextEpisodeText: {\n fontSize: 14,\n },\n nextEpisodeInfoDivTimeDisplayDiv: {\n fontSize: 17,\n fontWeight: 700,\n },\n}));\n\nfunction AnimeDetailsNextEpisodePartial({ episodeInfoData }) {\n const { classes } = useStyles();\n\n const formatTime = (timeInSec) => {\n if (timeInSec <= 0) {\n return \"Airing Now\";\n }\n const timeObj = getDayHourMinuteSecondFromSecond(timeInSec);\n return `${timeObj.days}d ${timeObj.hours}hrs ${timeObj.mins}mins`;\n };\n\n return episodeInfoData.nextAiringEpisode ? (\n \n Next Episode in:\n {formatTime(episodeInfoData.nextAiringEpisode.airingAt - parseInt(Date.now() / 1000))}\n \n ) : (\n <>\n );\n}\n\nexport default AnimeDetailsNextEpisodePartial;\n","import { Anchor, Button, createStyles, Group, Paper, Space, Text, Title } from \"@mantine/core\";\nimport { IconPlayerPlay, IconPlus, IconX } from \"@tabler/icons-react\";\nimport React from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { WATCHANIME_RED } from \"../constants/cssConstants\";\nimport { getAnimeTitleByRelevance, getImageByRelevance, malStatusToMediaStatus } from \"../custom/AnimeData\";\nimport AnimeDetailsNextEpisodePartial from \"../partials/AnimeDetailsNextEpisodePartial\";\n\nimport malImage from \"../assets/images/mal.png\";\nimport aniImage from \"../assets/images/ani.png\";\nimport { useLanguageStore } from \"../store/LanguageToggleStore\";\nimport { useShallow } from \"zustand/react/shallow\";\nimport { useWatchListStore } from \"../store/WatchListStore\";\n\nconst useStyles = createStyles((theme) => ({\n backgroundImageDiv: {\n height: \"600px\",\n backgroundSize: \"cover\",\n backgroundPosition: \"center center\",\n filter: \"blur(20px)\",\n opacity: \".35\",\n position: \"absolute\",\n width: \"100%\",\n },\n playButton: {\n backgroundColor: WATCHANIME_RED,\n width: \"fit-content\",\n padding: \"5px 10px\",\n fontSize: \"12px\",\n height: \"25px\",\n \"&:hover\": {\n backgroundColor: WATCHANIME_RED,\n border: `1px solid ${WATCHANIME_RED}`,\n },\n },\n watchListButton: {\n backgroundColor: \"transparent\",\n width: \"fit-content\",\n padding: \"5px 10px\",\n fontSize: \"12px\",\n height: \"25px\",\n border: \"1px solid white\",\n \"&:hover\": {\n backgroundColor: \"transparent\",\n border: `1px solid ${WATCHANIME_RED}`,\n },\n },\n frostedDiv: {\n display: \"flex\",\n flexDirection: \"column\",\n backgroundColor: \"rgba(145, 145, 145, 0.21)\",\n borderRadius: \"10px\",\n maxWidth: \"350px\",\n minWidth: \"300px\",\n [theme.fn.smallerThan(\"lg\")]: {\n maxWidth: \"100%\",\n },\n },\n frostedDivChild: {\n width: \"100%\",\n backgroundColor: \"transparent\",\n display: \"flex\",\n padding: \"5px\",\n },\n frostedDivChildAnimeDetails: {\n color: \"white\",\n fontSize: \"12px\",\n },\n frostedDivChildAnimeDetailsValue: {\n fontSize: \"12px\",\n backgroundColor: \"transparent\",\n },\n animeInfoDiv: {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n maxWidth: \"45%\",\n margin: \"15px\",\n [theme.fn.smallerThan(\"lg\")]: {\n maxWidth: \"100%\",\n },\n },\n titleParentDiv: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: 0,\n justifyContent: \"center\",\n alignItems: \"flex-start\",\n },\n ratingText: {\n color: \"rgb(70, 211, 105)\",\n fontWeight: \"bolder\",\n },\n aniDiv: {\n height: 24,\n width: 24,\n backgroundImage: `url(${aniImage})`,\n backgroundSize: \"cover\",\n },\n malDiv: {\n height: 24,\n width: 24,\n backgroundImage: `url(${malImage})`,\n backgroundSize: \"cover\",\n },\n}));\n\nfunction AnimeDetailsOverviewComponent({ animeData, episodeInfoData }) {\n const { classes } = useStyles();\n const { watchListData, handleWatchListAdd, handleWatchListDelete } = useWatchListStore(useShallow((state) => ({ watchListData: state.watchListData, handleWatchListAdd: state.handleWatchListAdd, handleWatchListDelete: state.handleWatchListDelete })));\n const { language } = useLanguageStore(useShallow((state) => ({ language: state.language })));\n return (\n \n \n \n \n \n \n \n {animeData.score ? {`${parseInt(parseFloat(animeData.score) * 10)}% rating`} : \"\"}\n {getAnimeTitleByRelevance(animeData.titles, false, language)}\n \n \n \n {!watchListData.filter((data) => data.slug === animeData.slug).length ? (\n {\n e.preventDefault();\n await handleWatchListAdd(animeData);\n }}\n className={classes.watchListButton}\n >\n \n Add to Watchlist\n \n ) : (\n {\n e.preventDefault();\n await handleWatchListDelete(animeData);\n }}\n className={classes.watchListButton}\n >\n \n Delete From Watchlist\n \n )}\n \n \n {animeData.synopsis}\n \n \n \n \n \n Other Names:\n \n \n {animeData.titles\n .filter((title) => title.type !== \"Default\")\n .map((title) => title.title)\n .join(\", \")}\n \n \n \n Premired:\n \n {animeData.aired.string ?? \"NA\"}\n \n \n Duration:\n \n {animeData.duration ?? \"NA\"}\n \n \n Status:\n \n {malStatusToMediaStatus(animeData.status)}\n \n \n Genres:\n \n \n {animeData.genres?.length\n ? animeData.genres\n .map((genre, ind) => (\n \n {genre.name}\n \n ))\n .reduce((prev, curr) => [prev, \", \", curr])\n : \"NA\"}\n \n \n \n Studios:\n \n {animeData.studios?.length ? animeData.studios.map((studio) => studio.name).join(\", \") : \"NA\"}\n \n \n Episodes(Released):\n \n {animeData.episodes ?? \"NA\"}\n \n \n External Links:\n \n {animeData.malId || animeData.aniId ? (\n \n {animeData.malId ? : \"\"}\n {animeData.aniId ? : \"\"}\n \n ) : (\n \"\"\n )}\n \n \n \n \n \n );\n}\n\nexport default AnimeDetailsOverviewComponent;\n","import { createStyles, MantineNumberSize } from '@mantine/styles';\n\nexport interface TableStylesParams {\n captionSide: 'top' | 'bottom';\n horizontalSpacing: MantineNumberSize;\n verticalSpacing: MantineNumberSize;\n fontSize: MantineNumberSize;\n withBorder: boolean;\n withColumnBorders: boolean;\n}\n\nexport default createStyles(\n (\n theme,\n {\n captionSide,\n horizontalSpacing,\n verticalSpacing,\n fontSize,\n withBorder,\n withColumnBorders,\n }: TableStylesParams\n ) => {\n const border = `1px solid ${\n theme.colorScheme === 'dark' ? theme.colors.dark[4] : theme.colors.gray[3]\n }`;\n return {\n root: {\n ...theme.fn.fontStyles(),\n width: '100%',\n borderCollapse: 'collapse',\n captionSide,\n color: theme.colorScheme === 'dark' ? theme.colors.dark[0] : theme.black,\n lineHeight: theme.lineHeight,\n border: withBorder ? border : '',\n\n '& caption': {\n marginTop: captionSide === 'top' ? 0 : theme.spacing.xs,\n marginBottom: captionSide === 'bottom' ? 0 : theme.spacing.xs,\n fontSize: theme.fontSizes.sm,\n color: theme.colorScheme === 'dark' ? theme.colors.dark[2] : theme.colors.gray[6],\n },\n\n '& thead tr th, & tfoot tr th, & tbody tr th': {\n textAlign: 'left',\n fontWeight: 'bold',\n color: theme.colorScheme === 'dark' ? theme.colors.dark[0] : theme.colors.gray[7],\n fontSize: theme.fn.size({ size: fontSize, sizes: theme.fontSizes }),\n padding: `${theme.fn.size({\n size: verticalSpacing,\n sizes: theme.spacing,\n })}px ${theme.fn.size({ size: horizontalSpacing, sizes: theme.spacing })}px`,\n },\n\n '& thead tr th': {\n borderBottom: border,\n },\n\n '& tfoot tr th, & tbody tr th': {\n borderTop: border,\n },\n\n '& tbody tr td': {\n padding: `${theme.fn.size({\n size: verticalSpacing,\n sizes: theme.spacing,\n })}px ${theme.fn.size({ size: horizontalSpacing, sizes: theme.spacing })}px`,\n borderTop: border,\n fontSize: theme.fn.size({ size: fontSize, sizes: theme.fontSizes }),\n },\n\n '& tbody tr:first-of-type td, & tbody tr:first-of-type th': {\n borderTop: 'none',\n },\n\n '& thead th, & tbody td': {\n borderRight: withColumnBorders ? border : 'none',\n\n '&:last-of-type': {\n borderRight: 'none',\n borderLeft: withColumnBorders ? border : 'none',\n },\n },\n\n '& tbody tr th': {\n borderRight: withColumnBorders ? border : 'none',\n },\n\n '&[data-striped] tbody tr:nth-of-type(odd)': {\n backgroundColor:\n theme.colorScheme === 'dark' ? theme.colors.dark[6] : theme.colors.gray[0],\n },\n\n '&[data-hover] tbody tr': theme.fn.hover({\n backgroundColor:\n theme.colorScheme === 'dark' ? theme.colors.dark[5] : theme.colors.gray[1],\n }),\n },\n };\n }\n);\n","import React, { forwardRef } from 'react';\nimport { DefaultProps, MantineNumberSize, useComponentDefaultProps } from '@mantine/styles';\nimport { Box } from '../Box';\nimport useStyles, { TableStylesParams } from './Table.styles';\n\nexport interface TableProps\n extends DefaultProps,\n React.ComponentPropsWithoutRef<'table'> {\n /** If true every odd row of table will have gray background color */\n striped?: boolean;\n\n /** If true row will have hover color */\n highlightOnHover?: boolean;\n\n /** Table caption position */\n captionSide?: 'top' | 'bottom';\n\n /** Horizontal cells spacing from theme.spacing or number to set value in px */\n horizontalSpacing?: MantineNumberSize;\n\n /** Vertical cells spacing from theme.spacing or number to set value in px */\n verticalSpacing?: MantineNumberSize;\n\n /** Sets font size of all text inside table */\n fontSize?: MantineNumberSize;\n\n /** Add border to table */\n withBorder?: boolean;\n\n /** Add border to columns */\n withColumnBorders?: boolean;\n}\n\nconst defaultProps: Partial = {\n striped: false,\n highlightOnHover: false,\n captionSide: 'top',\n horizontalSpacing: 'xs',\n fontSize: 'sm',\n verticalSpacing: 7,\n withBorder: false,\n withColumnBorders: false,\n};\n\nexport const Table = forwardRef((props, ref) => {\n const {\n className,\n children,\n striped,\n highlightOnHover,\n captionSide,\n horizontalSpacing,\n verticalSpacing,\n fontSize,\n unstyled,\n withBorder,\n withColumnBorders,\n ...others\n } = useComponentDefaultProps('Table', defaultProps, props);\n\n const { classes, cx } = useStyles(\n { captionSide, verticalSpacing, horizontalSpacing, fontSize, withBorder, withColumnBorders },\n { unstyled, name: 'Table' }\n );\n\n return (\n \n {children}\n \n );\n});\n\nTable.displayName = '@mantine/core/Table';\n","import { Table } from \"@mantine/core\";\nimport React from \"react\";\n\nfunction TableComponent({ data, tableOptions }) {\n return (\n \n \n \n {data.header.data.map((row, ind) => (\n \n ))}\n \n \n \n {data.body.data.map((post, ind) => (\n {data.body.render(post)}\n ))}\n \n
{data.header.render(row)}
\n );\n}\n\nexport default TableComponent;\n","import React, { useEffect, useState } from \"react\";\nimport { API_BASE_URL } from \"../constants/genricConstants\";\nimport axios from \"axios\";\nimport TableComponent from \"./TableComponent\";\nimport { Anchor, Box, Group, Paper, Text } from \"@mantine/core\";\n\nfunction AnimeMalForumComponent({ malId }) {\n const [ajaxComplete, setAjaxComplete] = useState(false);\n const [forumData, setForumData] = useState([]);\n\n useEffect(() => {\n async function getForumData() {\n setAjaxComplete(false);\n const [forumData] = await Promise.all([axios.get(`${API_BASE_URL}/anime/malforum/${malId}`)]);\n setForumData(forumData.data);\n setAjaxComplete(true);\n return;\n }\n getForumData();\n }, [malId]);\n\n return ajaxComplete ? (\n \n \n \n Latest Discussion\n \n \n {\n return title.name;\n },\n },\n body: {\n data: forumData,\n render: (post) => {\n return (\n <>\n \n \n \n {post.title}\n \n \n {post.author_username}\n \n \n \n {post.comments}\n \n by{\" \"}\n \n {post.last_comment.author_username}\n \n \n \n );\n },\n },\n id: \"forum-table\",\n }}\n tableOptions={{ withBorder: true, striped: true }}\n />\n \n ) : (\n <>\n );\n}\n\nexport default AnimeMalForumComponent;\n","import { useMantineTheme } from \"@mantine/core\";\nimport { useMediaQuery } from \"@mantine/hooks\";\nimport { IconChevronLeft, IconChevronRight } from \"@tabler/icons-react\";\nimport React from \"react\";\nimport { ANIME_SLIDER_GAP, ANIME_SLIDER_MOBILE_WIDTH, ANIME_SLIDER_WIDTH } from \"../constants/cssConstants\";\nimport AnimeSectionComponent from \"./AnimeSectionComponent\";\n\nfunction AnimeRelationComponent({ animeData }) {\n const theme = useMantineTheme();\n const mobile = useMediaQuery(`(max-width: ${theme.breakpoints.md}px)`);\n\n const relatedData = [];\n for (const animeGroup of animeData.relations.map((anime) => anime?.entry)) {\n for (const anime of animeGroup) {\n relatedData.push(anime);\n }\n }\n\n const animeSliderConfig = {\n slideSize: mobile ? ANIME_SLIDER_MOBILE_WIDTH : ANIME_SLIDER_WIDTH,\n slideGap: ANIME_SLIDER_GAP,\n align: \"start\",\n includeGapInSize: false,\n skipSnaps: true,\n styles: {\n control: {\n backgroundColor: \"rgb(37, 38, 43)\",\n fontSize: \"18px\",\n width: \"40px\",\n height: \"40px\",\n lineHeight: \"40px\",\n textAlign: \"center\",\n borderRadius: \"6px\",\n margin: \"3px 0px\",\n opacity: 1,\n color: \"white\",\n border: \"0px\",\n \"&:hover\": {\n backgroundColor: \"rgba(44, 46, 51, 0.85)\",\n },\n },\n },\n nextControlIcon: ,\n previousControlIcon: ,\n sx: { width: \"100%\" },\n containScroll: \"keepSnaps\",\n };\n\n return <>{relatedData.length ? : \"\"};\n}\n\nexport default AnimeRelationComponent;\n","import { useMantineTheme } from \"@mantine/core\";\nimport { useMediaQuery } from \"@mantine/hooks\";\nimport { IconChevronLeft, IconChevronRight } from \"@tabler/icons-react\";\nimport axios from \"axios\";\nimport React, { useEffect, useState } from \"react\";\nimport { ANIME_SLIDER_GAP, ANIME_SLIDER_MOBILE_WIDTH, ANIME_SLIDER_WIDTH } from \"../constants/cssConstants\";\nimport { API_BASE_URL } from \"../constants/genricConstants\";\nimport AnimeSectionLoaderPartial from \"../partials/AnimeSectionLoaderPartial\";\nimport AnimeSectionComponent from \"./AnimeSectionComponent\";\n\nfunction AnimeRecommendationComponent({ malId }) {\n const theme = useMantineTheme();\n const mobile = useMediaQuery(`(max-width: ${theme.breakpoints.md}px)`);\n\n const [ajaxComplete, setAjaxComplete] = useState(false);\n const [animeRecommendation, setAnimeRecommendation] = useState([]);\n\n useEffect(() => {\n async function getAnimeDetails() {\n setAjaxComplete(false);\n const [animeRecommendationAjaxData] = await Promise.all([axios.get(`${API_BASE_URL}/anime/recommendation/${malId}`)]);\n setAnimeRecommendation(animeRecommendationAjaxData.data);\n setAjaxComplete(true);\n return;\n }\n getAnimeDetails();\n }, [malId]);\n\n const animeSliderConfig = {\n slideSize: mobile ? ANIME_SLIDER_MOBILE_WIDTH : ANIME_SLIDER_WIDTH,\n slideGap: ANIME_SLIDER_GAP,\n align: \"start\",\n includeGapInSize: false,\n skipSnaps: true,\n styles: {\n control: {\n backgroundColor: \"rgb(37, 38, 43)\",\n fontSize: \"18px\",\n width: \"40px\",\n height: \"40px\",\n lineHeight: \"40px\",\n textAlign: \"center\",\n borderRadius: \"6px\",\n margin: \"3px 0px\",\n opacity: 1,\n color: \"white\",\n border: \"0px\",\n \"&:hover\": {\n backgroundColor: \"rgba(44, 46, 51, 0.85)\",\n },\n },\n },\n nextControlIcon: ,\n previousControlIcon: ,\n sx: { width: \"100%\" },\n containScroll: \"keepSnaps\",\n };\n\n return (\n <>\n {ajaxComplete ? (\n animeRecommendation.length ? (\n \n ) : (\n \"\"\n )\n ) : (\n \n )}\n \n );\n}\n\nexport default AnimeRecommendationComponent;\n","import { Anchor, createStyles, Group, Paper, Text } from \"@mantine/core\";\nimport React from \"react\";\nimport { getAnimeTitleByRelevance, getImageByRelevance } from \"../custom/AnimeData\";\nimport { Link } from \"react-router-dom\";\nimport { WATCHANIME_RED } from \"../constants/cssConstants\";\nimport { STATIC_BUCKET_URL } from \"../constants/genricConstants\";\nimport { useLanguageStore } from \"../store/LanguageToggleStore\";\nimport { useShallow } from \"zustand/react/shallow\";\n\nconst useStyles = createStyles((theme) => ({\n subOrDubBackGroundImageDiv: {\n position: \"absolute\",\n zIndex: \"1\",\n left: \"-10px\",\n right: \"-10px\",\n bottom: \"-10px\",\n top: \"-10px\",\n backgroundPosition: \"center center\",\n backgroundSize: \"cover\",\n filter: \"blur(3px)\",\n opacity: \".3\",\n borderRadius: \"10px\",\n },\n subOrDubTextDiv: {\n fontWeight: \"600\",\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n padding: \"0 5px\",\n zIndex: \"3\",\n display: \"-webkit-box\",\n WebkitLineClamp: \"2\",\n WebkitBoxOrient: \"vertical\",\n overflow: \"hidden\",\n textDecoration: \"none\",\n color: \"white\",\n textAlign: \"center\",\n \"&:hover\": {\n color: WATCHANIME_RED,\n },\n },\n subOrDubParentWrapper: {\n height: \"80px\",\n margin: \"0 10px 10px\",\n width: \"250px\",\n position: \"relative\",\n \"&:before\": {\n content: '\"\"',\n position: \"absolute\",\n zIndex: \"2\",\n top: \"0\",\n left: \"0\",\n right: \"0\",\n bottom: \"0\",\n background: `url(${STATIC_BUCKET_URL}/live-thumb.png) repeat`,\n },\n },\n}));\n\nfunction AnimeDetailsSubDubComponent({ animeData }) {\n const { language } = useLanguageStore(useShallow((state) => ({ language: state.language })));\n const { classes } = useStyles();\n const hasSub = animeData.slug.includes(\"-dub\");\n const hasDub = animeData.hasDub;\n return hasSub || hasDub ? (\n \n \n WATCH {hasSub ? \"SUBBED\" : \"DUBBED\"}\n \n \n \n {getAnimeTitleByRelevance(animeData.titles, !hasSub, language)}\n \n \n \n \n ) : (\n <>\n );\n}\n\nexport default AnimeDetailsSubDubComponent;\n","import { Container, Loader } from \"@mantine/core\";\nimport React, { useEffect, useState } from \"react\";\nimport { useLocation } from \"react-router-dom\";\nimport AnimeDetailsEpisodeListComponent from \"../components/AnimeDetailsEpisodeListComponent\";\nimport AnimeDetailsOverviewComponent from \"../components/AnimeDetailsOverviewComponent\";\nimport SideBarComponent from \"../components/SideBarComponent\";\nimport AnimeMalForumComponent from \"../components/AnimeMalForumComponent\";\nimport AnimeRelationComponent from \"../components/AnimeRelationComponent\";\nimport AnimeRecommendationComponent from \"../components/AnimeRecommendationComponent\";\nimport { execGraphqlQuery } from \"../graphql/graphqlQueryExec\";\nimport { AnimeQueryObject } from \"../graphql/graphqlQueries\";\nimport AnimeDetailsSubDubComponent from \"../components/AnimeDetailsSubDubComponent\";\n\nfunction AnimeDetailsScreen({ sideBarState, setSideBarState, bugReportState, setBugReportState }) {\n const location = useLocation();\n const [ajaxComplete, setAjaxComplete] = useState(false);\n const [episodeInfoData, setEpisodeInfoData] = useState({});\n\n const [animeData, setAnimeData] = useState({});\n\n useEffect(() => {\n async function getAnimeDetails() {\n setAjaxComplete(false);\n const animeSlug = location.pathname.split(\"/anime/\")[1];\n const [animeAjaxData] = await Promise.all([execGraphqlQuery(AnimeQueryObject, { slug: animeSlug })]);\n setAnimeData(animeAjaxData.data.data.Page.media[0]);\n setAjaxComplete(true);\n return;\n }\n getAnimeDetails();\n }, [location.pathname]);\n\n const sideBarComponentConfigForSideBarMenu = {\n title: \"Menu\",\n type: \"SideBarMenuLayout\",\n data: [{ label: \"Home\", href: \"/\" }],\n };\n\n return ajaxComplete ? (\n <>\n \n \n \n \n \n \n {animeData.malId ? : <>}\n {animeData.malId ? : <>}\n \n \n ) : (\n \n );\n}\n\nexport default AnimeDetailsScreen;\n","import { createStyles, MantineNumberSize, MantineColor, MantineTheme } from '@mantine/styles';\n\nexport interface DividerStylesParams {\n size: MantineNumberSize;\n variant: 'solid' | 'dashed' | 'dotted';\n color: MantineColor;\n}\n\nconst sizes = {\n xs: 1,\n sm: 2,\n md: 3,\n lg: 4,\n xl: 5,\n};\n\nfunction getColor(theme: MantineTheme, color: MantineColor) {\n const themeColor = theme.fn.variant({ variant: 'outline', color }).border;\n\n return typeof color === 'string' && (color in theme.colors || color.split('.')[0] in theme.colors)\n ? themeColor\n : color === undefined\n ? theme.colorScheme === 'dark'\n ? theme.colors.dark[4]\n : theme.colors.gray[4]\n : color;\n}\n\nexport default createStyles((theme, { size, variant, color }: DividerStylesParams) => ({\n root: {},\n\n withLabel: {\n borderTop: '0 !important',\n },\n\n left: {\n '&::before': {\n display: 'none',\n },\n },\n\n right: {\n '&::after': {\n display: 'none',\n },\n },\n\n label: {\n display: 'flex',\n alignItems: 'center',\n\n '&::before': {\n content: '\"\"',\n flex: 1,\n height: 1,\n borderTop: `${theme.fn.size({ size, sizes })}px ${variant} ${getColor(theme, color)}`,\n marginRight: theme.spacing.xs,\n },\n\n '&::after': {\n content: '\"\"',\n flex: 1,\n borderTop: `${theme.fn.size({ size, sizes })}px ${variant} ${getColor(theme, color)}`,\n marginLeft: theme.spacing.xs,\n },\n },\n\n labelDefaultStyles: {\n color:\n color === 'dark'\n ? theme.colors.dark[1]\n : theme.fn.themeColor(\n color,\n theme.colorScheme === 'dark' ? 5 : theme.fn.primaryShade(),\n false\n ),\n },\n\n horizontal: {\n border: 0,\n borderTopWidth: theme.fn.size({ size, sizes }),\n borderTopColor: getColor(theme, color),\n borderTopStyle: variant,\n margin: 0,\n },\n\n vertical: {\n border: 0,\n alignSelf: 'stretch',\n height: 'auto',\n borderLeftWidth: theme.fn.size({ size, sizes }),\n borderLeftColor: getColor(theme, color),\n borderLeftStyle: variant,\n },\n}));\n","import React, { forwardRef } from 'react';\nimport {\n DefaultProps,\n MantineNumberSize,\n MantineColor,\n useComponentDefaultProps,\n} from '@mantine/styles';\nimport useStyles from './Divider.styles';\nimport { Text } from '../Text';\nimport { Box } from '../Box';\n\nexport type DividerStylesNames = 'label';\n\nexport interface DividerProps\n extends DefaultProps,\n React.ComponentPropsWithoutRef<'div'> {\n /** Line color from theme, defaults to gray in light color scheme and to dark in dark color scheme */\n color?: MantineColor;\n\n /** Line orientation */\n orientation?: 'horizontal' | 'vertical';\n\n /** Sets height in horizontal orientation and width in vertical */\n size?: MantineNumberSize;\n\n /** Adds text after line in horizontal orientation */\n label?: React.ReactNode;\n\n /** Label position */\n labelPosition?: 'left' | 'center' | 'right';\n\n /** Props spread to Text component in label */\n labelProps?: Record;\n\n /** Divider borderStyle */\n variant?: 'solid' | 'dashed' | 'dotted';\n}\n\nconst defaultProps: Partial = {\n orientation: 'horizontal',\n size: 'xs',\n labelPosition: 'left',\n variant: 'solid',\n};\n\nexport const Divider = forwardRef((props: DividerProps, ref) => {\n const {\n className,\n color,\n orientation,\n size,\n label,\n labelPosition,\n labelProps,\n variant,\n styles,\n classNames,\n unstyled,\n ...others\n } = useComponentDefaultProps('Divider', defaultProps, props);\n\n const { classes, cx } = useStyles(\n { color, size, variant },\n { classNames, styles, unstyled, name: 'Divider' }\n );\n\n const vertical = orientation === 'vertical';\n const horizontal = orientation === 'horizontal';\n const withLabel = !!label && horizontal;\n\n const useLabelDefaultStyles = !labelProps?.color;\n\n return (\n \n {withLabel && (\n \n {label}\n
\n )}\n \n );\n});\n\nDivider.displayName = '@mantine/core/Divider';\n","var _path;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nfunction SvgImage(_ref, svgRef) {\n let {\n title,\n titleId,\n ...props\n } = _ref;\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n t: 1666857514489,\n className: \"icon\",\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\",\n \"p-id\": 2580,\n xmlnsXlink: \"http://www.w3.org/1999/xlink\",\n width: 24,\n height: 24,\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M870.4 176 153.6 176C104.128 176 64 216.128 64 265.6l0 492.736c0 49.472 40.128 89.6 89.6 89.6L870.4 847.936c49.472 0 89.6-40.128 89.6-89.6L960 265.6C960 216.128 919.872 176 870.4 176zM870.4 668.8 825.6 668.8c0 0-29.696-65.792-89.6-89.6s-134.4 89.6-134.4 89.6S535.04 596.992 467.2 444.8C399.36 292.608 153.6 624 153.6 624l0-358.4L870.4 265.6 870.4 668.8zM668.8 489.6c37.056 0 67.2-30.144 67.2-67.264 0-37.056-30.144-67.2-67.2-67.2C631.68 355.2 601.6 385.344 601.6 422.4 601.6 459.52 631.68 489.6 668.8 489.6z\",\n \"p-id\": 2581,\n fill: \"#ffffff\"\n })));\n}\nconst ForwardRef = /*#__PURE__*/React.forwardRef(SvgImage);\nexport default __webpack_public_path__ + \"static/media/image.792190acc6bfa2b3b973b1f1e09d4862.svg\";\nexport { ForwardRef as ReactComponent };","import image from \"./assests/image.svg\";\n\nfunction checkVersion(art) {\n const {\n version,\n utils: { errorHandle },\n } = art.constructor;\n const arr = version.split(\".\").map(Number);\n const major = arr[0];\n const minor = arr[1] / 100;\n errorHandle(major + minor >= 5, `Artplayer.js@${version} is not compatible the artplayerPluginHlsQuality@${artplayerPluginHlsQuality.version}. Please update it to version Artplayer.js@5.x.x`);\n}\n\nexport default function artplayerPluginHlsQuality(option) {\n return (art) => {\n checkVersion(art);\n\n const { $video } = art.template;\n\n function update() {\n const hls = art.hls || window.hls;\n if (!(hls && hls.media === $video)) {\n return;\n }\n const auto = option.auto || \"Auto\";\n const title = option.title || \"Quality\";\n const getResolution = option.getResolution || ((level) => (level.height || \"Unknown \") + \"P\");\n const defaultLevel = hls.levels[hls.currentLevel];\n const defaultHtml = defaultLevel ? getResolution(defaultLevel) : auto;\n\n if (option.control) {\n art.controls.update({\n name: \"hls-quality\",\n position: \"right\",\n html: defaultHtml,\n style: { padding: \"0 10px\" },\n selector: hls.levels.map((item, index) => {\n return {\n html: getResolution(item),\n level: item.level || index,\n default: defaultLevel === item,\n };\n }),\n onSelect(item) {\n hls.currentLevel = item.level;\n art.loading.show = true;\n return item.html;\n },\n });\n }\n\n if (option.setting) {\n art.setting.update({\n name: \"hls-quality\",\n tooltip: defaultHtml,\n html: title,\n icon: image,\n width: 200,\n selector: hls.levels.map((item, index) => {\n return {\n html: getResolution(item),\n level: item.level || index,\n default: defaultLevel === item,\n };\n }),\n onSelect: function (item) {\n hls.currentLevel = item.level;\n art.loading.show = true;\n return item.html;\n },\n });\n }\n }\n\n art.on(\"ready\", update);\n art.on(\"restart\", update);\n\n return {\n name: \"artplayerPluginHlsQuality\",\n };\n };\n}\n\nif (typeof window !== \"undefined\") {\n window[\"artplayerPluginHlsQuality\"] = artplayerPluginHlsQuality;\n}\n","import image from \"./assests/image.svg\";\n\nfunction checkVersion(art) {\n const {\n version,\n utils: { errorHandle },\n } = art.constructor;\n const arr = version.split(\".\").map(Number);\n const major = arr[0];\n const minor = arr[1] / 100;\n errorHandle(major + minor >= 5, `Artplayer.js@${version} is not compatible the artplayerPluginDashQuality@${artplayerPluginDashQuality.version}. Please update it to version Artplayer.js@5.x.x`);\n}\n\nexport default function artplayerPluginDashQuality(option) {\n return (art) => {\n checkVersion(art);\n\n // eslint-disable-next-line\n const { $video } = art.template;\n\n function update() {\n const dash = art.dash || window.dash;\n // if (!(dash && dash.media === $video)) {\n // return;\n // }\n const auto = option.auto || \"Auto\";\n const title = option.title || \"Quality\";\n const levels = dash.getBitrateInfoListFor(\"video\");\n const currentLevel = dash.getQualityFor(\"video\");\n const getResolution = option.getResolution || ((level) => (level.height || \"Unknown \") + \"P\");\n const settings = dash.getSettings();\n const defaultLevel = levels[currentLevel];\n const defaultHtml = settings?.streaming?.abr?.autoSwitchBitrate?.video ? auto : getResolution(defaultLevel);\n\n const cfg = {\n streaming: {\n abr: {\n autoSwitchBitrate: {},\n },\n },\n };\n\n if (option.control) {\n art.controls.update({\n name: \"dash-quality\",\n position: \"right\",\n html: defaultHtml,\n style: { padding: \"0 10px\" },\n selector: levels.map((item, index) => {\n return {\n html: getResolution(item),\n level: index,\n default: defaultLevel === item,\n };\n }),\n onSelect(item) {\n cfg.streaming.abr.autoSwitchBitrate[\"video\"] = false;\n dash.updateSettings(cfg);\n dash.setQualityFor(\"video\", item.level, true);\n return item.html;\n },\n });\n }\n\n if (option.setting) {\n art.setting.update({\n name: \"dash-quality\",\n tooltip: defaultHtml,\n html: title,\n icon: image,\n width: 200,\n selector: levels.map((item, index) => {\n return {\n html: getResolution(item),\n level: index,\n default: defaultLevel === item,\n };\n }),\n onSelect: function (item) {\n cfg.streaming.abr.autoSwitchBitrate[\"video\"] = false;\n dash.updateSettings(cfg);\n dash.setQualityFor(\"video\", item.level, true);\n return item.html;\n },\n });\n }\n }\n\n art.on(\"ready\", update);\n art.on(\"restart\", update);\n\n return {\n name: \"artplayerPluginDashQuality\",\n };\n };\n}\n\nif (typeof window !== \"undefined\") {\n window[\"artplayerPluginDashQuality\"] = artplayerPluginDashQuality;\n}\n","import React from \"react\";\nimport Artplayer from \"artplayer\";\nimport Hls from \"hls.js/dist/hls.min\";\nimport dashjs from \"dashjs\";\nimport artplayerPluginHlsQuality from \"./plugins/HlsQuality\";\nimport { createStyles } from \"@mantine/core\";\nimport artplayerPluginDashQuality from \"./plugins/DashQuality\";\n\nconst useStyles = createStyles((theme) => ({\n parentPlayerDiv: { padding: \"0\", position: \"relative\", verticalAlign: \"top\", wordBreak: \"normal\", maxWidth: \"100%\", width: \"100%\", height: \"0\", paddingTop: \"56.25%\" },\n playerDiv: { left: \"0\", position: \"absolute\", top: \"0\", height: \"100%\", width: \"100%\" },\n}));\n\nexport const VideoPlayer = ({ option, onReady, ...rest }) => {\n const { classes } = useStyles();\n const artRef = React.useRef(null);\n\n React.useEffect(() => {\n window.hls = {};\n const art = new Artplayer({\n container: artRef.current,\n setting: true,\n fullscreen: true,\n playbackRate: true,\n mutex: true,\n aspectRatio: true,\n playsInline: true,\n subtitle: {\n ...(Object.keys(option.subtitles).length\n ? {\n url: option.subtitles.url,\n type: option.subtitles.type,\n encoding: \"utf-8\",\n escape: false,\n onVttLoad: (sub) => {\n return sub;\n },\n }\n : {}),\n style: {\n fontSize: \"2em\",\n },\n },\n plugins: [\n ...[\n option.url.includes(\"m3u8\")\n ? artplayerPluginHlsQuality({\n // Show quality in control\n control: true,\n // Get the resolution text from level\n getResolution: (level) => level.height + \"P\",\n\n // I18n\n title: \"Quality\",\n })\n : [],\n ],\n ...[\n option.url.includes(\"mpd\")\n ? artplayerPluginDashQuality({\n // Show quality in control\n control: true,\n\n // Get the resolution text from level\n getResolution: (level) => level.height + \"P\",\n\n // I18n\n title: \"Quality\",\n })\n : [],\n ],\n ],\n customType: {\n m3u8: function playM3u8(video, url, art) {\n if (Hls.isSupported()) {\n if (art.hls) art.hls.destroy();\n const hls = new Hls();\n hls.loadSource(url);\n hls.attachMedia(video);\n art.hls = hls;\n art.on(\"destroy\", () => hls.destroy());\n } else if (video.canPlayType(\"application/vnd.apple.mpegurl\")) {\n video.src = url;\n } else {\n art.notice.show = \"Unsupported playback format: m3u8\";\n }\n },\n mpd: function playMpd(video, url, art) {\n if (dashjs.supportsMediaSource()) {\n if (art.dash) art.dash.destroy();\n const dash = dashjs.MediaPlayer().create();\n dash.initialize(video, url, art.option.autoplay);\n art.dash = dash;\n art.on(\"destroy\", () => dash.destroy());\n } else {\n art.notice.show = \"Unsupported playback format: mpd\";\n }\n },\n },\n settings: [\n {\n html: \"Subtitle Size\",\n tooltip: \"28px\",\n range: [28, 10, 50, 1], // Min 10px, Max 40px, Step 1px\n onRange: function (item) {\n const fontSize = item.range[0] + \"px\";\n document.querySelector(\".art-subtitle\").style.fontSize = fontSize;\n return fontSize;\n },\n },\n ],\n ...option,\n });\n if (onReady && typeof onReady === \"function\") {\n onReady(art);\n }\n\n return () => {\n if (art && art.destroy) {\n art.destroy(false);\n }\n };\n // eslint-disable-next-line\n }, []);\n\n return (\n
\n
\n
\n );\n};\n\nexport default VideoPlayer;\n","import createReactComponent from '../createReactComponent';\nexport default createReactComponent('outline', 'player-track-prev', 'IconPlayerTrackPrev', [[\"path\",{\"d\":\"M21 5v14l-8 -7z\",\"key\":\"svg-0\"}],[\"path\",{\"d\":\"M10 5v14l-8 -7z\",\"key\":\"svg-1\"}]]);","import createReactComponent from '../createReactComponent';\nexport default createReactComponent('outline', 'player-track-next', 'IconPlayerTrackNext', [[\"path\",{\"d\":\"M3 5v14l8 -7z\",\"key\":\"svg-0\"}],[\"path\",{\"d\":\"M14 5v14l8 -7z\",\"key\":\"svg-1\"}]]);","import createReactComponent from '../createReactComponent';\nexport default createReactComponent('outline', 'download', 'IconDownload', [[\"path\",{\"d\":\"M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2v-2\",\"key\":\"svg-0\"}],[\"path\",{\"d\":\"M7 11l5 5l5 -5\",\"key\":\"svg-1\"}],[\"path\",{\"d\":\"M12 4l0 12\",\"key\":\"svg-2\"}]]);","import createReactComponent from '../createReactComponent';\nexport default createReactComponent('outline', 'settings', 'IconSettings', [[\"path\",{\"d\":\"M10.325 4.317c.426 -1.756 2.924 -1.756 3.35 0a1.724 1.724 0 0 0 2.573 1.066c1.543 -.94 3.31 .826 2.37 2.37a1.724 1.724 0 0 0 1.065 2.572c1.756 .426 1.756 2.924 0 3.35a1.724 1.724 0 0 0 -1.066 2.573c.94 1.543 -.826 3.31 -2.37 2.37a1.724 1.724 0 0 0 -2.572 1.065c-.426 1.756 -2.924 1.756 -3.35 0a1.724 1.724 0 0 0 -2.573 -1.066c-1.543 .94 -3.31 -.826 -2.37 -2.37a1.724 1.724 0 0 0 -1.065 -2.572c-1.756 -.426 -1.756 -2.924 0 -3.35a1.724 1.724 0 0 0 1.066 -2.573c-.94 -1.543 .826 -3.31 2.37 -2.37c1 .608 2.296 .07 2.572 -1.065z\",\"key\":\"svg-0\"}],[\"path\",{\"d\":\"M9 12a3 3 0 1 0 6 0a3 3 0 0 0 -6 0\",\"key\":\"svg-1\"}]]);","import { Anchor, createStyles, Group, Text } from \"@mantine/core\";\nimport React from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { WATCHANIME_RED } from \"../constants/cssConstants\";\n\nconst useStyles = createStyles((theme) => ({\n parentEpisodeDiv: {\n marginTop: \"15px\",\n maxHeight: \"140px\",\n overflowY: \"auto\",\n opacity: \"0.9\",\n gap: \"4px\",\n gridTemplateColumns: \"repeat(auto-fill,minmax(47px,1fr))\",\n display: \"grid\",\n width: \"100%\",\n },\n eachEpisodeDiv: {\n backgroundColor: \"#23272a\",\n color: \"white\",\n padding: \"5px\",\n textAlign: \"center\",\n fontSize: \"15px\",\n display: \"inline-block\",\n fontWeight: \"400\",\n whiteSpace: \"nowrap\",\n \"&:hover\": {\n backgroundColor: \"#1A1B1E\",\n textDecoration: \"none\",\n },\n },\n watchedEpisodeDiv: {\n backgroundColor: \"#363636\",\n opacity: 0.6,\n },\n}));\n\nfunction VideoScreenEpisodeDisplayPartial({ episodeCount, episodeList, animeSlug, currentEpisode, watchHistoryData }) {\n episodeList = Object.keys(episodeList ?? {})\n .map((val) => parseFloat(val))\n .sort((x, y) => x - y);\n const { classes } = useStyles();\n const watchedEpisodes = watchHistoryData;\n return (\n \n {episodeList.length && episodeCount <= episodeList.length\n ? episodeList.map((val, ind) => {\n return (\n \n {`${val}`}\n \n );\n })\n : Array(episodeCount)\n .fill(0)\n .map((val, ind) => {\n return (\n \n {`${ind + 1}`}\n \n );\n })}\n \n );\n}\n\nexport default VideoScreenEpisodeDisplayPartial;\n","import { createStyles } from '@mantine/styles';\n\nexport interface AspectRatioStylesParams {\n ratio: number;\n}\n\nexport default createStyles((_theme, { ratio }: AspectRatioStylesParams) => ({\n root: {\n position: 'relative',\n maxWidth: '100%',\n\n '&::before': {\n content: '\"\"',\n height: 0,\n display: 'block',\n paddingBottom: `${(1 / ratio) * 100}%`,\n },\n\n '&::after': {\n content: '\"\"',\n display: 'table',\n clear: 'both',\n },\n\n '& > *:not(style)': {\n overflow: 'hidden',\n position: 'absolute',\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n width: '100%',\n height: '100%',\n },\n\n '& > img, & > video': {\n objectFit: 'cover',\n },\n },\n}));\n","import React, { forwardRef } from 'react';\nimport { DefaultProps, useComponentDefaultProps } from '@mantine/styles';\nimport { Box } from '../Box/Box';\nimport useStyles from './AspectRatio.styles';\n\nexport interface AspectRatioProps extends DefaultProps, React.ComponentPropsWithoutRef<'div'> {\n /** Aspect ratio, e.g. 16 / 9, 4 / 3, 1920 / 1080 */\n ratio: number;\n}\n\nexport const AspectRatio = forwardRef(\n (props: AspectRatioProps, ref) => {\n const { className, ratio, children, unstyled, ...others } = useComponentDefaultProps(\n 'AspectRatio',\n {},\n props\n );\n\n const { classes, cx } = useStyles({ ratio }, { name: 'AspectRatio', unstyled });\n\n return (\n \n {children}\n \n );\n }\n);\n\nAspectRatio.displayName = '@mantine/core/AspectRatio';\n","import { AspectRatio } from \"@mantine/core\";\nimport React from \"react\";\n\nfunction VideoScreenIframePartial({ iframeCollectionData, selectedServer }) {\n return (\n \n